トップページ⇒tech
1001コメント284KB

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

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

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

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

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

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

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

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

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

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

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

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

必要なのは、プログラムを作るための考え方。それが身についてないと
どんな言語を使ってもろくに動かない糞ソースを生み出すだけ。
0078デフォルトの名無しさん2005/04/14(木) 17:15:59
すいません、realloc関数の第二引数はunsigned int型だと思うんですけど、
それだと最大64KBまでしかメモリを割り当てれない気がするんですが、
それ以上割り当てるにはどうしたら良いのでしょう?
0079デフォルトの名無しさん2005/04/14(木) 17:20:38
>>78
MS-DOS?
0080デフォルトの名無しさん2005/04/14(木) 17:26:16
>>79
はいそうです
諸事情でWinAPIは使えません
コンパイラはBCC5.5です
0081デフォルトの名無しさん2005/04/14(木) 17:28:14
>>80
BCC 5.5ってWin32アプリしか作れないだろ。
DOSアプリとコンソールアプリを勘違いしていないか?
0082デフォルトの名無しさん2005/04/14(木) 17:30:13
すみません勘違いしてるっていうか細かい事は分かりません
OSはWinXPです・・
0083デフォルトの名無しさん2005/04/14(木) 17:37:27
まずその細かいが重要なところを理解してこい
0084デフォルトの名無しさん2005/04/14(木) 17:39:59
そんな事言わずにお願いします・・なるべく早く知りたいのです
0085デフォルトの名無しさん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だが。
0086デフォルトの名無しさん2005/04/14(木) 17:44:13
>>85
ありがとうございます。
4って出ました。
unsigned longなんですね。
0087デフォルトの名無しさん2005/04/14(木) 17:45:31
>>82
unsigned intの最大値を調べてから質問し直してください。
0088デフォルトの名無しさん2005/04/14(木) 17:45:59
printf("%u", sizeof (int));
ってやってみろ。
0089デフォルトの名無しさん2005/04/14(木) 17:47:24
>>86
Win32ではint/unsigned intも32bit化されて4Byteになっている。
0090デフォルトの名無しさん2005/04/14(木) 17:50:09
>>89
そ、そうだったんですか・・・詳しい情報感謝します
0091デフォルトの名無しさん2005/04/14(木) 17:55:26
そしてポインタも32bit化されている。
ただしアプリケーション(1プロセス)が使用できるアドレス空間は2GB。
2GB以上(〜4GBの)メモリを確保するのは難しい。
0092デフォルトの名無しさん2005/04/14(木) 17:55:52
どうもです
0093デフォルトの名無しさん2005/04/14(木) 19:05:07
Windows2000 AdvancedServer / WindowsServer2003 Enterprise以上なら3GBまで使えるよ
0094デフォルトの名無しさん2005/04/14(木) 19:16:50
さらにWin64では32bitアプリも4GBまで使えるようになっているそうだ。
http://www.marbacka.net/asm64/arkiv/64bit_addressing.html
0095デフォルトの名無しさん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;です。
0096952005/04/14(木) 19:32:41
間違いはほかにたくさんあるのですが、
これの意味がわかりません。
ちなみに直前のprintfをはずすとなぜかコンパイルエラーも起こらずに、
実行されてしまいます。
どの部分が影響されてこのようなエラーが出るのでしょうか?
0097デフォルトの名無しさん2005/04/14(木) 19:41:25
とりあえず一番最初のprintf()消せ。
0098962005/04/14(木) 19:43:47
>>97
最初は書いていなかったんです。
しかし、コンパイラがエラーをはかずに実行まで行ってしまい、
その後のwhileループも実行されずに無事に?終わってしまいました。
そのため、printfを追加したら、上記のようなエラーが帰ってきました。
0099デフォルトの名無しさん2005/04/14(木) 19:48:51
Cでは関数の最初でしか変数宣言できなかった希ガス。
途中に書けるようになったのはC++からだっけ?
0100デフォルトの名無しさん2005/04/14(木) 19:48:54
古いCでは変数宣言はブロックの先頭にある必要がある。
変数宣言より前に普通の文を書いてはいけない。

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

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

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

とかされる可能性も考えたら?w
0132デフォルトの名無しさん2005/04/15(金) 02:41:17
>>131
良く考えたらその通りだ。
0133デフォルトの名無しさん2005/04/15(金) 11:20:25
>>130 ttp://www.lysator.liu.se/c/rat/a.html#1-6
0134デフォルトの名無しさん2005/04/15(金) 11:22:51
>>130 C++ ttp://www.kuzbass.ru/docs/isocpp/expr.html#expr.sizeof
0135デフォルトの名無しさん2005/04/15(金) 12:10:55
>>131
その無駄に豊かな想像力を生かして、あなたは
#define sizeof(t) 3
の可能性も考えた方がいいですね。
0136デフォルトの名無しさん2005/04/15(金) 13:20:07
>>133-134
へー。知らなかった。
0137デフォルトの名無しさん2005/04/15(金) 14:18:40
callocと、
malloc+memset
ではどっちが速い?
0138デフォルトの名無しさん2005/04/15(金) 14:36:09
>>137
実装によるべ。calloc()の方が遅いことは余りないと思うけど。
0139デフォルトの名無しさん2005/04/15(金) 16:09:32
>>137
何で自分で計らないのさ?
0140デフォルトの名無しさん2005/04/15(金) 17:00:05
>>135
想定すべきは、そうすればなんらかのメリットがある、という行為であって、
全ての場合を想定するなら、定理証明支援システムでも使えばいい。
メリットがない想定はあまり意味がない。
いい加減消えてくれないか。
C言語自体が矛盾を持っているんだから、君の発言は無意味な事が多いんだよ。
0141デフォルトの名無しさん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だけ見てやったんですが・・
0142デフォルトの名無しさん2005/04/15(金) 19:33:07
環境依存のスレいきなよ。
0143デフォルトの名無しさん2005/04/15(金) 19:45:13
>>141
HeapCreate()が返したハンドルはHeapDestroy()すべき。
そもそもGetProcessHeap()を使えばその手間は省ける。

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

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

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

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

とか質問者に教えた方がまだましだったと思うんだけど。
0151デフォルトの名無しさん2005/04/15(金) 22:42:36
GYAaaaaaaaahhhhhh━━━━━━(゚Д゚;;)━━━━━━!!!!!!
0152デフォルトの名無しさん2005/04/15(金) 22:43:35
すマアんごばっくっった
0153デフォルトの名無しさん2005/04/15(金) 22:59:15
Win32APIでファイルをコピーする奴ください
0154デフォルトの名無しさん2005/04/15(金) 23:47:24
教えることはできるが、あげることはできんな。
0155デフォルトの名無しさん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
0156デフォルトの名無しさん2005/04/16(土) 22:01:52
WriteConsoleとかその辺のAPI使えばたいていの事はできる
0157デフォルトの名無しさん2005/04/16(土) 22:12:17
>>155
某のコンパイラの場合はWindows98上でコンパイルするとWindows2000でもエスケープシーケンスが効いてたと思う。
Windows2000上でコンパイルすると何やってもダメだった。
0158デフォルトの名無しさん2005/04/16(土) 23:19:34
>>156-157
レス、ありがとうございますた。

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

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

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

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

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

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

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

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

#include <iomanip>

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

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

printf("%d", x);

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

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

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

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

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

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

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

ごめんなさい。

0210デフォルトの名無しさん2005/04/19(火) 19:28:02
>>188
スィープラスプラス。一部でシープラプラ。
0211デフォルトの名無しさん2005/04/19(火) 20:00:33
シータスタス
0212デフォルトの名無しさん2005/04/19(火) 20:27:06
>>188
折りよく「C++の設計と進化」を読んでたんだが、「シープラスプラス」って書いてあった。
0213デフォルトの名無しさん2005/04/19(火) 21:38:26
VC6インスコしたときのビデオ見れば何て言うのかわかるやん
0214デフォルトの名無しさん2005/04/19(火) 21:39:25
ってここはVCスレじゃなかったな。
0215デフォルトの名無しさん2005/04/19(火) 22:33:43
ビデオなんかあったか?
0216デフォルトの名無しさん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)と同じ動作をした。
つまり配列の名前はその配列へのポインタとおなじ振る舞いをすると
俺の中で間違った認識が生まれようとしている
おまいらつД`) タスケテクレ !!

0217デフォルトの名無しさん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のが動いて、
これが動かない原因が超絶にわからないのですが…
0218デフォルトの名無しさん2005/04/20(水) 08:10:21
ポインタも理解できないんだったら素直にJavaでもやっとけよ
0219デフォルトの名無しさん2005/04/20(水) 08:50:01
だれか193に答えて…
0220デフォルトの名無しさん2005/04/20(水) 08:53:31
>>216
配列の名前から値を取り出すと先頭要素ポインタになる
あと、>>217は文字列リテラルに上書きできないという別の問題だね
正確なこと忘れちゃったから微妙に間違っている可能性大w
0221デフォルトの名無しさん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等身です」の先頭ポインタ値を入れる。




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

正しくは
「式の中に現れた配列名はその配列の先頭要素へのポインタとして評価される」
ただし例外もあるのでややこしい。
詳しくはCFAQでも読め。
0224デフォルトの名無しさん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()にとられる引数として
文句ないように見えるのですが…

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

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

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

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

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

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

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

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

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

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

ちなみに、

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

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

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

1 = 2;

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

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

0245デフォルトの名無しさん2005/04/20(水) 13:14:55
>>216-238
http://park15.wakwak.com/~o0o0o0o0/bokumetsu/
0246デフォルトの名無しさん2005/04/20(水) 14:33:11
おい!鼻から悪魔出てるぞ!!
0247デフォルトの名無しさん2005/04/20(水) 17:24:52
>>228
お前はそんなに領域破壊がしたいのか
02482342005/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もポインタそのもののはずです
0249デフォルトの名無しさん2005/04/20(水) 18:02:42
この流れで何で分かんねーの?池沼じゃあるまいし。
ちゃんと嫁よマジで
02502342005/04/20(水) 18:03:14
それともchar *a="あああ" の用に宣言したときは
自動的に文字列リテラルとなり、書き換え不能となるのでしょうか?
それなら納得がいくのですが…
02512342005/04/20(水) 18:14:17
どうも人一倍理解が遅いようです
すみません

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

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

0252デフォルトの名無しさん2005/04/20(水) 18:22:58
>>251
書き換え可能だが第一引数としてダウト
0253デフォルトの名無しさん2005/04/20(水) 18:23:52
コンパイラがエラー出さないなら全部安全だと思うなよ
02542342005/04/20(水) 18:24:13
あ、すいませんa[]をさすポインタのaのことです
つまりstrcpy(a[],b)じゃなくてstrcpy(a,b)です。
0255デフォルトの名無しさん2005/04/20(水) 18:24:26
腕たて臥せ10回分ぐらい危険
02562342005/04/20(水) 18:25:45
>253
未定義のもの、意図しない動作ではあるが論理的に正しいモノは
通ることがわかりました。
今後アプリを作っていく上で意識しながらやっていこうと思っています。
0257デフォルトの名無しさん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));
0258デフォルトの名無しさん2005/04/20(水) 19:03:02
>>257
ポインタに変換されるんだから&なしでも%pは平気だと思うが。
0259デフォルトの名無しさん2005/04/20(水) 19:12:45
>>258
printf("%p %p\n", b, &b);
0260デフォルトの名無しさん2005/04/20(水) 19:49:16
>>234
あんたがぐだぐだ言ってるからおれまで混乱してきた

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

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

仕方なくこんな関数書いたんですけど、
標準ライブラリにこんな処理する関数無かったっけ?
0264デフォルトの名無しさん2005/04/20(水) 22:22:07
std::string s(20, '-');
これだけでいいだろ
0265デフォルトの名無しさん2005/04/20(水) 22:25:38
油断すると忘れるよな、そのコンストラクタ。
0266デフォルトの名無しさん2005/04/20(水) 22:26:45
>>263
std::string hoge( 20, '-' );
または
std::string hoge;
hoge.assign( 20, '-' );
02672132005/04/20(水) 22:27:14
>>215
VC6かVC4か忘れた。はっきりと「びじゅある しー ぷらすぷらす」と言ってた。
しかもスゲー早口で
0268デフォルトの名無しさん2005/04/20(水) 22:27:41
>>264 266
うげー…、そんなのあったのか、サンクス…
0269デフォルトの名無しさん2005/04/20(水) 22:32:02
char s[20];
memset(s, 20, '-');
0270デフォルトの名無しさん2005/04/20(水) 22:35:37
>>263
size_t len = 20;
char c = '-';
string s;
s.insert(s.begin(), len, c);
return s;
0271デフォルトの名無しさん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を加えると言うのもどう言う事なのか…
どなたが教えてください。
0272デフォルトの名無しさん2005/04/21(木) 00:12:19
c が '\r' か '\n' の時に真を返す述語ってctypeあたりにないですか?
0273デフォルトの名無しさん2005/04/21(木) 00:22:39
述語・・・
ctype にあるわけなかろ
0274デフォルトの名無しさん2005/04/21(木) 01:12:43
配列全体のアドレスと配列の先頭要素のアドレスってどう違うんですか?
0275デフォルトの名無しさん2005/04/21(木) 01:20:41
>>274
質問の意味がわからんのだが、
例えば
int a[3]
があった場合、aと&a[0]の違いか?
値は一緒。でも型が違うので動作が違う。
0276デフォルトの名無しさん2005/04/21(木) 01:38:33
int a[3];
printf("%p %p\n", a, a + 1);
printf("%p %p\n", &a, &a + 1);
0277デフォルトの名無しさん2005/04/21(木) 01:38:38
>>275
レスどうも。

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

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

>>276見てわかりました。どうもありがとうございました。
0279デフォルトの名無しさん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);
を動かしてみな。

0280デフォルトの名無しさん2005/04/21(木) 06:42:41
csvもしくはタブ区切りファイルを読み込む関数もしくはクラスはありませんか?
出来るだけ移植性の高いものがいいですが、gccだけで使えるものでもかまいません。
0281デフォルトの名無しさん2005/04/21(木) 07:17:45
自分で作るのが基本です
0282デフォルトの名無しさん2005/04/21(木) 08:07:55
>>271の説明をどなたかお願いします
0283デフォルトの名無しさん2005/04/21(木) 10:34:04
>>282
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa17.html
ここの一番最初嫁
0284デフォルトの名無しさん2005/04/21(木) 10:41:20
ifstream で開いたファイルのテキストを
char*とstringに入れるにはどうすればいいのですか?
0285デフォルトの名無しさん2005/04/21(木) 10:48:06
ifstream hoge;
string moge;
copy(hoge.begin(), hoge.end(), inserter(moge, moge.end());
0286デフォルトの名無しさん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');
02872862005/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);
02882842005/04/21(木) 11:54:03
char*はよくわからないことになったのでstringで統一することにしました。
返答ありがとうございます。
0289デフォルトの名無しさん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++の文法自体は一通り覚えました。
0290デフォルトの名無しさん2005/04/21(木) 14:16:38
>C++の文法自体は一通り覚えました。
ならば次は本ではなく実践、足りないと思ったらまた本読む
0291デフォルトの名無しさん2005/04/21(木) 14:30:25
実装丸見えじゃん
0292デフォルトの名無しさん2005/04/21(木) 14:51:09
>>289
設計を見直せ。
クラスの内部だけで必要な情報ならパブリックなセッタゲッタは必要ないはずだ。
0293デフォルトの名無しさん2005/04/21(木) 16:18:16
仮にパブリックなセッタゲッタが必要だとしても、メンバ変数の数だけ作るというのが理解できん・・・
0294デフォルトの名無しさん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;
}
0295デフォルトの名無しさん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;}
}
}
0296デフォルトの名無しさん2005/04/21(木) 16:40:35
>>295
おーい、向こうのスレに書かれていたレスは読んだのか?
0297デフォルトの名無しさん2005/04/21(木) 16:42:42
>>296
すみません、移動します(汗
0298デフォルトの名無しさん2005/04/21(木) 16:42:51
つーか、gets()をtryで囲って何がしたいのだろう。
そんなことするより素直にgets()を捨てればいいのに。
0299デフォルトの名無しさん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]を抜き出したいのですが、
上記のような記述でもうまくいかないので、やり方があれば教えてください。
0300デフォルトの名無しさん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++らしく書くべきだとは思うのだけど。
0301デフォルトの名無しさん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;
}
0302デフォルトの名無しさん2005/04/21(木) 17:04:00
>>300-301
できました!
どうもありがとうございました。
0303デフォルトの名無しさん2005/04/21(木) 21:24:25
インラインアセンブラを行いたいのですが、
C言語でのインラインアセンブラ用の命令を解説しているHP、
またはweb, VCのMSDNライブラリ用の検索語を教えてもらえませんか?
0304デフォルトの名無しさん2005/04/21(木) 21:29:31
アセンブラは環境によって違うが?
0305デフォルトの名無しさん2005/04/21(木) 21:29:34
"inline assembler"
0306デフォルトの名無しさん2005/04/21(木) 21:31:56
>>303
http://developer.intel.com/design/pentium4/manuals/index_new.htm
0307デフォルトの名無しさん2005/04/21(木) 21:49:25
みなさんありがとうございます。
>>303の紹介してくださったページを読んできます。
0308デフォルトの名無しさん2005/04/22(金) 00:28:59
new で領域確保が失敗した場合、
xalloc で例外処理をキャッチするみたいな事が本に載っていたのですが、
new.h をインクルードしてやってみても、xalloc の部分でエラーが出ます。
except.h exception.h 、共にありませんでした。
ちょっと、わかりにくいかもしれませんが、どうすればいいんでしょうか?
ご存知の方 Help !!
0309デフォルトの名無しさん2005/04/22(金) 00:34:55
>>308
それは昔のコムパイラかと

今はstd::bad_alloc(だっけ)
0310デフォルトの名無しさん2005/04/22(金) 00:52:46
ありがとうございます。なんとかコンパイルは通ったので、
これから色々テストしてみたいと思います。
0311デフォルトの名無しさん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;
}
0312デフォルトの名無しさん2005/04/22(金) 01:56:36
1.aaa()を直せ
2.aaa()を呼び出しているところを直せ
以上
0313デフォルトの名無しさん2005/04/22(金) 01:59:24
>>311
Cの関数は値渡し。
aaa()の引数をポインタにすればいい。

以上の話がわからなかったら入門書をよく読め。
0314デフォルトの名無しさん2005/04/22(金) 01:59:34
>312
すみません。どのように直せばいいのでしょうか?
0315デフォルトの名無しさん2005/04/22(金) 02:01:05
>>311
aaa関数の関数定義は引数が値渡しになっているのでmain関数のa,bとaaa関数でのa,bは別のメモリ領域を指していることになるからです。
0316デフォルトの名無しさん2005/04/22(金) 02:03:57
>>311
アセンブリ言語を調べてみなさい。
Cソースをコンパイルすると、どのようなアセンブリソースになるのかということを知りなさい。
関数呼び出しの仕組みだけでなく、Cの理解がより深まることでしょう。
0317デフォルトの名無しさん2005/04/22(金) 02:06:54
311ですけど、全くわからないです。
できれば直していただきたいのですが。
0318デフォルトの名無しさん2005/04/22(金) 02:07:57
アセンブリ言語はともかく、
まともな入門書なら「値渡し」とは何か
しっかり解説してるはずだが。
0319デフォルトの名無しさん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);
0320デフォルトの名無しさん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;
}
0321デフォルトの名無しさん2005/04/22(金) 02:11:25
>319
ありがとうございます。

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

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

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

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

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

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

みたいな書き方ができると便利なんですが・・・。
0332デフォルトの名無しさん2005/04/22(金) 11:31:48
>>331
自前プリプロセッサ作れ
0333デフォルトの名無しさん2005/04/22(金) 11:48:49
>>331
__declspec( property(ほげほげ))
0334デフォルトの名無しさん2005/04/22(金) 12:43:21
>>331
VC にプロパティあるだろ。
0335デフォルトの名無しさん2005/04/22(金) 14:31:27
コンストラクタをprivate に入れることってあるんですか?
また、そのメリットって何なのでしょうか?
0336デフォルトの名無しさん2005/04/22(金) 14:37:26
>>335
勝手に生成されないようにできる。
例えばSingletonではインスタンスが勝手に作られては困るのでコンストラクタをprivateにし
インスタンス取得用のstaticメンバ関数を用意するとか。
0337デフォルトの名無しさん2005/04/22(金) 15:21:29
Effective C++の46項に
ちょっとした例があるな。
0338デフォルトの名無しさん2005/04/22(金) 16:24:56
滅多に無いと思うがな
0339デフォルトの名無しさん2005/04/22(金) 16:36:11
そうですか。レス遅れて申し訳ないです。
ご教授ありがとうございました。
0340デフォルトの名無しさん2005/04/22(金) 16:39:10
どれに対するレスだよ
0341デフォルトの名無しさん2005/04/22(金) 17:38:17
WinSock2のrawモードを細かく日本語で解説した物ってありますか
0342デフォルトの名無しさん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;
}

上の関数だと引数の値が入れ替わるのに、
下の関数だと入れ替わらないのはなぜですか?
0343デフォルトの名無しさん2005/04/23(土) 00:26:38
>>342
上はポインタじゃなくて値そのものを代入しているから。
0344デフォルトの名無しさん2005/04/23(土) 00:28:04
>>342
void swap(int **a, int **b)
にして、ポインタを入れ替えれば変わるぞ。
0345デフォルトの名無しさん2005/04/23(土) 00:30:37
夜釣り禁止
03463422005/04/23(土) 00:37:37
>>344
具体的に関数の中にどうかけば良いか教えてください。
0347デフォルトの名無しさん2005/04/23(土) 00:39:48
最近の奴は考える力がないな。
0348デフォルトの名無しさん2005/04/23(土) 00:43:20
ええ、ついでですから利用できるところまで利用してやろうかと。
03493412005/04/23(土) 00:44:29
忘れないでー
03503422005/04/23(土) 00:45:45
ポインタは入れ替えられないってことですか?
0351デフォルトの名無しさん2005/04/23(土) 00:45:47
急速にスレの質が低下してまいりました
0352デフォルトの名無しさん2005/04/23(土) 00:50:02
>>342
とりあえずメモリの状態を図に書いて一つ一つ追っていくとか
そういうとこから始めてみるのがいいと思うんだ
0353デフォルトの名無しさん2005/04/23(土) 00:53:01
VC++で.NETを使わずに正規表現を利用したいのですが、
何か良い方法はないでしょうか
0354デフォルトの名無しさん2005/04/23(土) 01:14:22
>>353
http://www.fides.dti.ne.jp/~oka-t/libraries.html#regexp はどうだ?
0355デフォルトの名無しさん2005/04/23(土) 01:17:01
boostでいいだろPerl互換の正規表現も使えるし
0356デフォルトの名無しさん2005/04/23(土) 01:20:17
⊂二二二( ^ω^)二⊃ブーンスト
0357デフォルトの名無しさん2005/04/23(土) 01:21:15
>>341
ネットワークプログラミング相談室 Port13
http://pc8.2ch.net/test/read.cgi/tech/1109793931/
0358デフォルトの名無しさん2005/04/23(土) 01:25:42
>>353
COMのVBScript.RegExpとか
0359デフォルトの名無しさん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;
}
0360目の前は壁だらけ・・2005/04/23(土) 06:51:31
ただいまCを勉強中なんですが。
どうしても気持ち悪くて前に進めないので誰か助けてください。
ファイル入出力で
if(NULL == (fp = fopen("ファイル名","r")){
printf("オープンエラー\n");
return EXET_FAILURE;
}
と普通にソースコードが書かれている参考書しか見当たらないのですが
条件式を書く部分にファイルオープンの関数が入っていて
条件式としてだけでなくその関数が動いている??
文法的に理屈を説明できる人がいれば、ずっと気持ちが悪いので助けてください・・
0361デフォルトの名無しさん2005/04/23(土) 08:27:22
>>360
まずfp = fopen("ファイル名","r")の式が実行される。
つまりfopenの戻り値をfpに代入しているわけだな。
= (代入演算子)は代入した値(この場合fopenの戻り値)が演算子の結果となるので、それをNULLと比較している。

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

俺はこうしているが好きにしろ。
FILE *fp = fopen();
if (!fp)
0362デフォルトの名無しさん2005/04/23(土) 08:59:55
>>350
ポインタも入れ替えできるよ
実際それも入れ替わってる
値が入れ替わらないのはあたりまえ
0363デフォルトの名無しさん2005/04/23(土) 10:25:56
名刺を交換しても人が入れ替わらないのと同じだな。
0364デフォルトの名無しさん2005/04/23(土) 10:29:37
違うだろ。仮引数を入れ替えても呼び出し元のポインタには影響しないだけ。
0365デフォルトの名無しさん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;
}
03663652005/04/23(土) 11:19:34
gcc3.3.3
vc7.1
です、よろしくお願いします
0367デフォルトの名無しさん2005/04/23(土) 11:28:15
>>365
漏れの VC6、VC7.1、VC8β、BCC 5.5.1 では動くよ
0368デフォルトの名無しさん2005/04/23(土) 11:32:39
>>367
拡張子は .c でよろしくお願いします。
0369デフォルトの名無しさん2005/04/23(土) 11:43:53
>>368
通った。
追記。VC4 でも OK。
0370デフォルトの名無しさん2005/04/23(土) 11:53:10
すみません実行できました!
vc7.1でコンパイルする時に/O2オプションをつけていたのが原因でした
gccのほうはMinGWを使ってるのが原因なのから不明です・・・
0371デフォルトの名無しさん2005/04/23(土) 12:16:01
一時オブジェクトはひとつの式が終わったところで破棄されるんじゃなかったっけ?
だとしたらオプションしだいで想定どおり動いたとしても間違ったプログラムということになる。
ま、このスレは環境依存OKだからそれでもいいのかもしれんけど。
0372デフォルトの名無しさん2005/04/23(土) 12:24:25
>>371
一時オブジェクトの寿命は完全式(だったかな?名前忘れた)の終わりまで。
つまりこの場合はprintf()の呼び出しが終わった後に破壊される。
0373デフォルトの名無しさん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のインクリメントが両方行なわれたりもする。
0374デフォルトの名無しさん2005/04/23(土) 12:34:06
「期待したとおりの動作をしない」が具体的にどうなったのかくらい書けよ
と言いたい。
0375デフォルトの名無しさん2005/04/23(土) 15:19:47
>>360
そんな本捨てろ。
文脈として、
if ((fp = fopen(...)) == NULL) {
...;
}
の方が読み易いだろ?
まぁ私は
fp = fopen(...);
if (fp == NULL) {
...;
}
とするが。
0376デフォルトの名無しさん2005/04/23(土) 15:48:30
>>375
> if ((fp = fopen(...)) == NULL) {
> ...;
> }
> の方が読み易いだろ?

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

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

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

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

0387デフォルトの名無しさん2005/04/23(土) 18:55:59
>>386
それじゃ意味が変わっちゃってるな。
「"=="と間違えて"="と入力するのを防ぐために定数を比較演算子の右側に
置く意義は、両辺が変数のときに破綻する。」
0388デフォルトの名無しさん2005/04/23(土) 19:01:05
また始まったよ
0389デフォルトの名無しさん2005/04/23(土) 19:08:31
>>386
頭悪いなお前。単にURI貼ればボロも出なかったのに。
0390デフォルトの名無しさん2005/04/23(土) 19:12:41
両辺が変数ならそもそも定数は存在しないじゃないか・・・
03913852005/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 で警告されたのも納得できる。
それぞれのアセンブリ出力も取ってみたが、
この違いを反映したものになった。
03923652005/04/23(土) 19:39:30
>>391
お疲れ様です。
詳しく調べてくださってありがとうございます
0393デフォルトの名無しさん2005/04/23(土) 20:59:57
>>389

URIIIIIIIIIIIIIIIII
0394デフォルトの名無しさん2005/04/23(土) 22:15:45
Uniform Resource Identifier
Uniform Resource Locator
0395デフォルトの名無しさん2005/04/23(土) 22:25:46
>>393
頭悪いな
0396デフォルトの名無しさん2005/04/23(土) 22:35:24
初心者歓迎スレだからね
0397デフォルトの名無しさん2005/04/23(土) 22:45:20
>>393
バカ杉
0398デフォルトの名無しさん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);
です。

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

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

いや、だからさ、おちけつだとか必死だとか言ってる奴は、騙されたと思って、豆類、ちりめんじゃこなどの小魚、レバー、乳製品、卵黄、カシューナッツ、ごま、そば、たけのこ、ブロッコリー、バナナなどにも多く含まれています。
0424423 ◆yBEncckFOU 2005/04/24(日) 18:03:14
ごめんなさい。
0425デフォルトの名無しさん2005/04/24(日) 18:03:30
何一人で暴れてんの?
0426デフォルトの名無しさん2005/04/24(日) 18:07:24
>>403-411
の議論は有益だと思うがなああ
0427デフォルトの名無しさん2005/04/24(日) 18:11:06
どのへんが?
0428デフォルトの名無しさん2005/04/24(日) 18:25:16
   ↓ここいら変
0429デフォルトの名無しさん2005/04/24(日) 18:34:35
m9(^Д^)プギャー
0430デフォルトの名無しさん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--と言う定義されてない?計算のためおかしな動作となる。
と言う解釈であってますか?
0431デフォルトの名無しさん2005/04/24(日) 18:42:28
while文の方は
nが評価された後nを-1してそれから
ans*=nを行っているんじゃないの
0432デフォルトの名無しさん2005/04/24(日) 18:42:32
そういうのは{}の中でn--するもの
0433デフォルトの名無しさん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が計算に使われないからうまく行ってたんですね。
0434デフォルトの名無しさん2005/04/24(日) 19:09:23
>>433
知恵をあげよう

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

いや、便があったんだろ?
0445デフォルトの名無しさん2005/04/25(月) 01:10:15
>>443
スレ間違えてないか?
http://pc8.2ch.net/test/read.cgi/tech/1108989422/
0446デフォルトの名無しさん2005/04/25(月) 06:32:08
出稼ぎに来て無職ですってよ奥さん
0447デフォルトの名無しさん2005/04/25(月) 06:32:40
>>438
そう僻むなよ
0448デフォルトの名無しさん2005/04/25(月) 14:28:18
質問です。
プリプロセッサの話なので微妙にCとは違うかもしれませんが…。

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

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

>>450
JAVAのソースを、プリプロセッサでごにょごにょしてC++のソースに変換したかったのです。
素直にStringクラスつくってソースエミュレーションします。
0452デフォルトの名無しさん2005/04/25(月) 15:05:52
つーか、エディタで置換すればいいだけのような飢餓。
0453デフォルトの名無しさん2005/04/25(月) 15:24:03
もちろんその通りなのですがw
なるべくなら同じソースファイルから、#ifdefの切り替えによってソース互換性を保ちたかったのです。
0454デフォルトの名無しさん2005/04/25(月) 15:33:00
違う言語同士でソース互換はかなり無茶だと思うが。
0455デフォルトの名無しさん2005/04/25(月) 15:38:37
というかバグの温床になりそうだ
0456デフォルトの名無しさん2005/04/25(月) 15:40:48
(((( ;゚Д゚)))ガクガクブルブル
0457デフォルトの名無しさん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]の値が不定のはずなのに
何故か正しい値が求められました。何故なんでしょうか?
配列も初期化しないと不定の値になると本に書いてあるのですが…
0458デフォルトの名無しさん2005/04/25(月) 19:00:45
運良く0が入ってたんだろ
0459デフォルトの名無しさん2005/04/25(月) 19:17:43
やはり運よく0が入っていたんですかね。
ありがとうございます。
0460デフォルトの名無しさん2005/04/25(月) 19:45:05
BCC5.5で最新のWin32SDKを使いたいんですけど、
可能ですか?
0461デフォルトの名無しさん2005/04/25(月) 19:47:28
PlatformSDK
0462デフォルトの名無しさん2005/04/25(月) 19:56:38
つかBCC5.5.1の同梱SDKは最低でもWindows2000まではサポート済みだから困ることあるか?
0463デフォルトの名無しさん2005/04/26(火) 03:59:15
ソースファイルAのグローバルで、
CHoge *hoge;
という感じにクラスhogeのポインタを生成し、ファイルAの関数内で
hoge=new CHoge(hwnd,100,100);
と、インスタンスを生成します。

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

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

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

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

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

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

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

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

Shift JISだと'表'は95 5cになる。2バイト目だけを見てコンパイラがバックスラッシュと解釈してしまう。
Cではバックスラッシュを2つ並べるとバックスラッシュを表すエスケープシーケンスになるから、
'表\'とすると95 5c 5cとなり、コンパイラが\\のエスケープシーケンスとして認識し95 5cを出力させるのがこの対策。
05044762005/04/26(火) 22:13:18
文字コード適当に変えつつやってみます。
だめだったら日本語使わずにやります。
色々とご迷惑かけました。
05054762005/04/26(火) 22:23:54
>>503
ありがとうございます。
確かに「表」と使ってました。
それに今までコンパイル出来なかった日本語の後に
バックスラッシュ付けたらコンパイルできるようになりました。
本当に皆さんご迷惑をおかけしました。
05064922005/04/26(火) 22:23:55
>>503
あ、すまん。
0507デフォルトの名無しさん2005/04/26(火) 23:22:56
つうか
L"だめぽ"
0508デフォルトの名無しさん2005/04/26(火) 23:47:55
http://harpy.org/Tategoto/terapad/TpAddYen.html
0509デフォルトの名無しさん2005/04/27(水) 01:29:03
>>508
「これからの嵐」 ワラタ
0510デフォルトの名無しさん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を純粋仮想関数にすると「純粋仮想関数を呼び出してますよエラー」になってしまいます。
0511デフォルトの名無しさん2005/04/27(水) 10:12:33
>>510
仮想デストラクタでぐぐれ、というかその前に仮想関数でぐぐれ、というかboost::shared_ptrあたりでぐぐったほうがいいかも
0512デフォルトの名無しさん2005/04/27(水) 10:15:31
template
0513デフォルトの名無しさん2005/04/27(水) 10:17:51
>>511
お返事ありがとうございます。
仮想関数については、
「基底クラスポインタから呼び出しても、派生クラスのものが呼ばれるようにする」
と解釈いたしました。

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

templateについては自信がないため、もしかすると超突拍子のない返事となっているかもしれません。
その際はご容赦ください。
0517デフォルトの名無しさん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;
}
0518デフォルトの名無しさん2005/04/27(水) 10:32:12
>>514
デストラクタが仮想かどうかが問題になるのでしょうか?

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

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

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

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

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

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




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

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

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

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

これだけならboost::shared_ptrがそのまんまの機能を持ってるんだけど。
0525デフォルトの名無しさん2005/04/27(水) 12:14:49
>>515
(NUM)*(NUM+1)/2
0526デフォルトの名無しさん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 を補正しても大丈夫でしょうか?
0527デフォルトの名無しさん2005/04/27(水) 12:50:07
>>526
hoge = &newP[5];

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

f(p, &p[5]);

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

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

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

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

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

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

    WTL

      WTL
0540デフォルトの名無しさん2005/04/27(水) 17:56:19
strstrの逆で、検索文字列の後ろを返すのは?
0541デフォルトの名無しさん2005/04/27(水) 18:06:58
>>540
標準ではない
05425402005/04/27(水) 19:33:49
ち
0543デフォルトの名無しさん2005/04/27(水) 19:34:36
>>530
hoge += newP - p;
がダメで
hoge = newP+(hoge-p);
だといいのでしょうか?
05445432005/04/27(水) 19:41:11
分かりました。
よく考えずに聞いてしまって申し訳ないです。。
0545デフォルトの名無しさん2005/04/27(水) 20:26:56
char* p = NULL;
の時に、&p[0] ってアドレスを取得してもやっても大丈夫?
0546デフォルトの名無しさん2005/04/27(水) 20:35:06
>>545
pと同じ意味じゃん。
0547デフォルトの名無しさん2005/04/27(水) 20:40:25
p[0]って*(p + 0)のシンタックスシュガーじゃなかったっけ?
0548デフォルトの名無しさん2005/04/27(水) 21:09:17
キタ━━━━━(゚∀゚)━━━━━!!!!
ぬるぽ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
ぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽ
ぬ・る・ぽーーーーーーーーーーーーーー!!
0549デフォルトの名無しさん2005/04/27(水) 21:32:54
>>548
落ち着け
0550デフォルトの名無しさん2005/04/27(水) 21:34:07
>>547
そう
0551デフォルトの名無しさん2005/04/27(水) 21:47:18
んじゃあ
&*pってなってぬるぽになっちゃうんじゃ?
0552デフォルトの名無しさん2005/04/27(水) 21:53:47
その通り
0553デフォルトの名無しさん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 */
のようにやっているのですが、他に何かいい方法はないでしょうか?
0554デフォルトの名無しさん2005/04/28(木) 00:30:28
>>553 何が気に入らないのか言わなくちゃ。
0555デフォルトの名無しさん2005/04/28(木) 23:09:09
>>553
さらにVC/BCCはいつのバージョンからかは知らないが__inlineがある。
0556デフォルトの名無しさん2005/04/29(金) 19:29:47
__inlineって何ですか?
0557デフォルトの名無しさん2005/04/29(金) 20:09:41
.cファイル内で
const float data[][3] = { ... };

.hファイル内で
extern const float data[][3];

これでコンパイルしたらdata変数がリンクエラー。
.cファイルはコンパイルされているのに。
分からない...
0558デフォルトの名無しさん2005/04/29(金) 20:16:55
>>556
C99/C++のinlineと同じ。
予約識別子になるように下線がついているだけ。
05595572005/04/29(金) 20:20:01
テキストセグメントの領域が足り無かったようで。
constはずしたらエラー消えた。
0560デフォルトの名無しさん2005/04/29(金) 22:15:04
>>559
http://www.tietew.jp/cppll/archive/12001
0561デフォルトの名無しさん2005/04/29(金) 23:03:53
cって書いてるだろボケ
0562デフォルトの名無しさん2005/04/29(金) 23:33:16
coutとprintと全然違う?いや全然違うのは分かってるけどなんでcoutなんてあるのか分からなくて
0563デフォルトの名無しさん2005/04/29(金) 23:44:27
演算子オーバーロードと多重継承の悪い見本用。
0564デフォルトの名無しさん2005/04/29(金) 23:54:07
coutとC++学習者との関係には幾つかの重要な節目があって、
そのたびにcoutへの眼差しは変わっていく。

「Cとの最初の差異」として本に書かれているのを初めて目にする時。
クラスと演算子オーバーロードを学習し、ストリームクラスが何をやっているのかを理解する時。
使い倒すうち、他の標準ライブラリと比べて「何かが浮いてる」ことに気づく時。
その他もろもろ。
0565デフォルトの名無しさん2005/04/30(土) 00:36:40
なるほろ
0566デフォルトの名無しさん2005/04/30(土) 00:50:31
#include <stdio.h>

int main(void)
{
printf("hello, world\n");

return 0;
}

どこにでも載ってるコレをコンパイルしようとしたら

エラー E2209 smp1.c 1:インクルードファイル"stdio.h"をオープンできない

と言ってきました。どうすればいいでつか。
コンパイラはBorland C++ Compiler 5.5です。
0567デフォルトの名無しさん2005/04/30(土) 00:56:22
>>566
マルチすんなボケ
0568デフォルトの名無しさん2005/04/30(土) 00:57:36
>どうすればいいでつか。

たいていはインストールに失敗

今までできていたのに突然できなくなったのは
HDDに入っていた所にアクセスできなくなった(消した、壊れた、等)
0569デフォルトの名無しさん2005/04/30(土) 00:58:09
設定をきちんとしてないんじゃまいか
bcc32.cfgとilink32.cfgはちゃんと作った?
0570デフォルトの名無しさん2005/04/30(土) 01:10:31
インストールは完璧にしたつもりなんだが。
うーん、わからん。消してしまった場合は
どうすれば?
0571デフォルトの名無しさん2005/04/30(土) 01:12:20
ウザいな
0572デフォルトの名無しさん2005/04/30(土) 01:13:00
readmeに書いてあること何か漏れてないか確かめれ
ダメなら再インスコ汁
0573デフォルトの名無しさん2005/04/30(土) 01:27:11
>完璧にしたつもり

たいていは失敗している(w
0574デフォルトの名無しさん2005/04/30(土) 01:33:33
>>571
ウザがれ覚悟で質問してんだ(゚Д゚)ゴルァ!!
>>572
ありがとうございます。試してみます。
0575デフォルトの名無しさん2005/04/30(土) 05:43:39
_hoge とか _foo() みたいに、
変数とか関数の前につけてるアンダーバーって何の目印ですか。
どういった目的で付けますか。
0576デフォルトの名無しさん2005/04/30(土) 07:21:06
>>574
逆ギレしてんじゃねぇよm9(^д^)プギャー
覚悟なんぞどうでもいいわ
0577デフォルトの名無しさん2005/04/30(土) 07:50:30
裏方かな>>575
0578デフォルトの名無しさん2005/04/30(土) 08:02:17
>>575
予約された識別子とまぎらわしいからヤメレ。
0579デフォルトの名無しさん2005/04/30(土) 08:03:38
>>557,559
.c で .h を #include してなくて、さらに C++ でコンパイルされてる疑いが強いな。
0580デフォルトの名無しさん2005/04/30(土) 10:35:51
>>577
すいません、意味が。

>>578
「予約された識別子」って、もう少し平易に言うとしたらどういうことでしょうか。
0581デフォルトの名無しさん2005/04/30(土) 10:41:42
>>580
日本語の勉強もしてください。

>577は裏方みたいな関数という意味合いのマークとしてアンダーバーをつけているのではないかといっている。
>578は例えば__STDC__のようなコンパイラ側で用意した(予約された)識別子と紛らわしいといっている。
0582デフォルトの名無しさん2005/04/30(土) 10:47:46
紛らわしいで済む問題ではなく、コンパイラが予約しているので使ってはいけない。
0583デフォルトの名無しさん2005/04/30(土) 10:51:52
アンダーバー1個ないし2個が最初についたものはコンパイラが予約してるものな
0584某2005/04/30(土) 10:56:02
環境はwin2k、Borland C++ Compiler5.5です
#include<stdio.h>
#define KAZU 10//データの数
int main(void)
{
int i = 0,J = 0,x = 0,y = 0;
int a[KAZU],b[KAZU];//データの入れ箱,順序付け
for( x = 0; x < KAZU; x++){
a[i] = x;
b[i] = 0;
}
i = 0;
do{
i++;
j = 1;
do{
j++;
if(a[i] > a[j]){
y = b[i];
y++;
b[i] = y;
}
if(a[i] < a[j])
b[j] = b[j] + 1;
}while(!(j == KAZU));
}while(!(j == KAZU-1));
for( x = 0; x < KAZU; x++)
printf("a[%d]:%d\n",x,b[x]);
return(0);
}

0585某2005/04/30(土) 10:57:02
これはデータを順序付けしたつもりなんですが
printfで出力できていないようなのです
誰か教えてもらえませんか
0586デフォルトの名無しさん2005/04/30(土) 11:05:45
>>584
J = 0
↑これはなんだ・・・


最初のforで
10回もの間 a[0] と b[0] を書き換えて、残りの要素は未初期化なのはおかしいだろ
最初からいろいろおかしいぞ、それ


いつも思うんだが、全角スペース使うなりしてインデントして書き込めよ
見難いったらありゃしない
0587デフォルトの名無しさん2005/04/30(土) 11:24:47
>>586
目が悪いなら自分でエディタにコピペでもしろよ。
一々インデントするのは面倒だし、それをコピペした馬鹿がコンパイルできないって煩いだろうが。
0588デフォルトの名無しさん2005/04/30(土) 11:26:01
>>585
「順序付け」の意味を定義せよ。
0589デフォルトの名無しさん2005/04/30(土) 11:33:28
>>587
せめて半角スペースが潰れただけならポップアップで読めばいけるんだが、
>>584の場合は元からしてインデント無しだからなぁ。

つーか回答者がなんでそこまで考えにゃならんのよ。
0590某2005/04/30(土) 11:43:22
#include<stdio.h>
#define KAZU 10//データの数
int main(void)
{
int i = 0, int j = 0, int x = 0, int y = 0;
int a[KAZU],b[KAZU];//データの入れ箱,順序付け
for( x = 0; x < KAZU; x++){
a[x] = i;
b[x] = 0;
}
i = 0;
do{
i++;
j = 1;
do{
j++;
if(a[i] > a[j]){
y = b[i];
y++;
b[i] = y;
}
if(a[i] < a[j])
b[j] = b[j] + 1;
}while(!(j == KAZU));
}while(!(j == KAZU-1));
for( x = 0; x < KAZU; x++){
i = 0;
printf("a[%d]:%d\n",i,b[i]);
i++;
}
return(0);
}
0591デフォルトの名無しさん2005/04/30(土) 11:45:55
>>581
裏方みたいな変数とか関数ってなんですか。
全然ぴんとこないのですが。
関数なんて、値を渡してなんか処理をして返してくれる
って意味では全部裏方っぽいです。
0592某2005/04/30(土) 11:46:57
すいません
荒れる原因を作ってしまったみたいで

aの配列に入った数を
bの配列で小さい方から番号を付けて
それを出力するプログラムです

擬似言語からCになおしたつもりだったんです
0593デフォルトの名無しさん2005/04/30(土) 11:58:44
>>592
aの内容は未定義になってしまってるけど、
これは単なる間違いで、なんか値が入ってるものなんだな?

「bの配列で小さい方から番号を付けて」
というのはaの配列要素の一番小さいものが0で、
それより大きい中で一番小さいものが1という風に
すると考えていいな?
aの中に同じ値が複数ある場合は同位にしていいのか?
0594デフォルトの名無しさん2005/04/30(土) 12:00:54
未定義じゃなくて、>>590の状態だと今度はaの中身全部等価じゃん
05955932005/04/30(土) 12:03:46
>>594
おっと失礼。

>>592
aに入ってる値の範囲はintいっぱい使うつもりか?
そうでないなら番兵使えるから楽なんだが。
0596某2005/04/30(土) 12:08:40
そうでした

すんません
<<594さん
そこは
a[i] = i % 5
でした

<<593さん
例をあげさせていただきますと
a[1]=10
a[2]=20
a[3]=15
a[4]=10

b[1]=1
b[2]=4
b[3]=3
b[4]=1

ってな感じになります

ヘタレな文章でごめんなさい
0597デフォルトの名無しさん2005/04/30(土) 12:23:59
>>591
使う側からは見ない/見て欲しくないものとかそんな感じかな。
例えばfoo()という関数を公開していて、fooはその機能を実現するために_hoge(), _hoge2()を使うとか。

VCだと非標準の関数とかに使われているな。(_beginthreadとか)
0598デフォルトの名無しさん2005/04/30(土) 12:25:04
>>596
適当なロダにうpったけど、こんなんじゃ駄目なん?
ttp://www.uplo.net/www/vip14319.txt
0599某2005/04/30(土) 12:38:44
<<598さん
ありがとう

しかし、これは結果じゃなくて、過程が大事なんです
色んなアルゴリズムを習得するという目的なんです

ほんとすいません
0600デフォルトの名無しさん2005/04/30(土) 12:40:49
>>591
ぴんと来る人がそういう識別子を使ってるってわけで
ぴんと来ない人は使う必要ないよ
0601デフォルトの名無しさん2005/04/30(土) 12:44:27
>>600
どういう意味か、と問われて
使う必要はない、と答えるのはいかがなものか。
0602デフォルトの名無しさん2005/04/30(土) 12:59:12
>>597 たのむからそんな名前をつかわせるようなこと書かないでくれ。
0603デフォルトの名無しさん2005/04/30(土) 13:39:53
>>600
荒れるから馬鹿な発言は控えてくれ
0604デフォルトの名無しさん2005/04/30(土) 14:26:44
バカだから仕方ないよ。
0605デフォルトの名無しさん2005/04/30(土) 14:47:15
アンダースコア始まりの識別子はとにかく使わない、でいいじゃん
0606デフォルトの名無しさん2005/04/30(土) 14:47:35
>>583
予約されてるのは一文字目がアンダースコア、二文字目が大文字ないしはアンダースコアの場合、
…じゃないの? _Foo は駄目だが _foo はオーケーなはず。
0607デフォルトの名無しさん2005/04/30(土) 15:27:13
>>606
_foo もグローバルな名前ではアウト。(ローカル変数や構造体メンバならセーフ)
でもメンドクサイから>605
0608デフォルトの名無しさん2005/04/30(土) 15:28:29
さらに C++ では、2つ連続したアンダースコアは名前中のどこで現れてもアウト。
0609デフォルトの名無しさん2005/04/30(土) 15:36:16
m9(^д^)
0610デフォルトの名無しさん2005/04/30(土) 15:51:41
意味や目的を聞いている。使う使わないはどうでもいい。
0611デフォルトの名無しさん2005/04/30(土) 16:24:10
m9(^Д^)プギャー
0612デフォルトの名無しさん2005/04/30(土) 17:12:34
>>611
このAAを見るたびにアームスレイブを連想する俺はライトノベル板にいけばいいのか。
0613デフォルトの名無しさん2005/04/30(土) 21:38:09
自作変数や関数の識別子にアンスコを使いたいときは、おしりにつけよう。

foo_()
int hoge_;

ほら、いいでしょ。
0614デフォルトの名無しさん2005/04/30(土) 23:03:30
>>613
クソ
0615デフォルトの名無しさん2005/04/30(土) 23:13:46
>>614
そんなに先頭につけるのが好きなんですかw
0616デフォルトの名無しさん2005/04/30(土) 23:37:03
アンダースコートを着けたいんですが変態ですか?
0617デフォルトの名無しさん2005/05/01(日) 00:02:15
>>616
うp
0618デフォルトの名無しさん2005/05/01(日) 17:30:46
C++で質問です。
newした場合に確保されるエリアの状態を調べるために
char* buf1 = new char[28]; ::memset(buf1, 0, 28);
char* buf2 = new char[28]; ::memset(buf2, 0, 28);
cout << (int) buf1 << endl;
cout << (int) buf2 << endl;
として、アドレスを表示させるとbuf1+28=buf2にならずに
buf1+40=buf2になっています。
いろんなサイズで試してみると16byteの倍数+8byteになっているようなのですが、
この8byteは何のためのデータなのでしょうか?
0619デフォルトの名無しさん2005/05/01(日) 17:34:19
>>618
OS(などシステム側の)管理領域。
メモリチャンクをリスト管理してたら次のメモリチャンクをポイントする必要があるだろ。
0620デフォルトの名無しさん2005/05/01(日) 17:35:54
>>678
buf1のすぐ後ろにbuf2があるとは限らない。
位置関係に相関性自体存在しない。
0621デフォルトの名無しさん2005/05/01(日) 17:54:55
C++でクラスの静的メンバ(クラス)もコンストラクタ呼ばれますよね?
0622デフォルトの名無しさん2005/05/01(日) 18:35:27
>>621
いちおう呼ばれることになってる。
呼ばれる順番の問題があるんで、あんまりお勧めできるもんじゃないが。
0623デフォルトの名無しさん2005/05/01(日) 22:53:12
一年間javaをやって4月からからCをはじめているところです。

定数Nを定義して
Nに100000を代入したいんですが、
#define N 1000000L
という式だとmainすら動きません。
#define N 100000L
ならmain以降しっかり動くのですが・・・
どうすればいいのですか?
0624デフォルトの名無しさん2005/05/01(日) 22:58:14
>>623
意味ワカンネ
0625デフォルトの名無しさん2005/05/01(日) 23:02:12
馬鹿には聞いてませんのでだまってて下さい。
わかる人、お願いします。
06266232005/05/01(日) 23:03:24
あ、すいません。
Nに1000000を代入したいんです。
#define N 1000000L
と記述すると何もおこらずプログラムが終了してしまうんですが・・・
0627デフォルトの名無しさん2005/05/01(日) 23:04:33
意味ワカンネ2
0628デフォルトの名無しさん2005/05/01(日) 23:06:05
const int N = 1000000;
0629デフォルトの名無しさん2005/05/01(日) 23:06:54
Nは既にコンパイル時に1000000なわけで代入する必要がありません
0630デフォルトの名無しさん2005/05/01(日) 23:09:53
>>623
記述は正確に。
>と記述すると
記述しただけでは何も起こらないのが当然。
「コンパイルした/実行した」と明示するべし。

> mainすら動きません。
関数が「動く」と言うのはどういう意味か。
「実行できる/コンパイルできる/期待どおりに動く」と
明示するべし。
0631デフォルトの名無しさん2005/05/01(日) 23:16:44
>>623はこのスレでも近年まれに見る低脳だな
0632デフォルトの名無しさん2005/05/01(日) 23:25:03
ソース晒そうぜー
06336232005/05/01(日) 23:33:14
代入ではありませんね。
すいません。
上から四行は

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 1000000L

のようになっています。
Nはmain () 内で
int a [N] ;
というように使っています。

#define N 100000L
と記述した場合コンパイルも通り、
実行もでき、自分が欲しい結果も返ってきています。
しかし
#define N 1000000L
と記述した場合
コンパイルは通りますが
実行時には何も起こりません。
main ()
の上の方に
printf ( "main開始") ;
と記述してで動作を確かめてみたところ
そのprintf ( "main開始") ;というのも実行されていません。
この場合もコンパイルは通っています。
0634デフォルトの名無しさん2005/05/01(日) 23:33:22
>>626
とりあえず定数に代入でおかしいと思うようになれ
0635デフォルトの名無しさん2005/05/01(日) 23:37:24
>>633
大きすぎるローカル変数を定義するとそういうことがある。
mallocで動的に確保すれば良い。
0636デフォルトの名無しさん2005/05/01(日) 23:37:34
>>633
環境が何だか知らんが、スタックオーバーフローしてんじゃない?
0637デフォルトの名無しさん2005/05/01(日) 23:38:18
スタックサイズを確認しろ
0638デフォルトの名無しさん2005/05/01(日) 23:42:29
実行時、Stack Overflowとか出ないんだっけ?
0639デフォルトの名無しさん2005/05/01(日) 23:44:38
>>638
コンパイラとオプションによっては出る。
0640デフォルトの名無しさん2005/05/01(日) 23:52:06
static int a [N];
06416232005/05/01(日) 23:53:12
どうもありがとうございました。
スタックサイズを確認して変更するか、
mallocで動的に確保するかどちらかとにかくやってみます。

実行時にStack Overflowとはでてきてません。
コンパイラはBCCです。
06426402005/05/01(日) 23:55:36
スルーされたorz
0643デフォルトの名無しさん2005/05/01(日) 23:58:41
しかし皆質問を待ち構えてたんだね
0644デフォルトの名無しさん2005/05/01(日) 23:59:57
暇なだけだろw
0645デフォルトの名無しさん2005/05/02(月) 00:18:51
>643
ちょっと知ったつもり程度の人間は往々にして人に教えたくなる。
別にプログラムに限らんが。
お題を出された方が頭は使いやすいからいい練習にもなるしな。
練習台にされる方も、相手を自動回答装置としか考えてないのでお互い様。
0646デフォルトの名無しさん2005/05/02(月) 01:31:13
自動回答装置ワロスwww
0647デフォルトの名無しさん2005/05/02(月) 01:33:10
俺は違うぞ!!!!
0648デフォルトの名無しさん2005/05/02(月) 01:44:37
ワロスって書く奴は間違いなく馬鹿
0649デフォルトの名無しさん2005/05/02(月) 02:42:12
精度の低い自動回答装置だけど
0650デフォルトの名無しさん2005/05/02(月) 03:18:03
精度が低い分、大量のエラー検出装置も動いてるから大丈夫。
エラー訂正の精度も低いが、エラー訂正のエラー検出をする人もいっぱい(ry
2chの情報全般に言える性質だけどな。
難しくなると途端に信頼性が低下するあたりも。

要は便所の落書きに精度を求めるなという事だ。
0651デフォルトの名無しさん2005/05/02(月) 03:33:08
しかし、C/C++系のスレはここ1年ぐらいで極端にレベルが下がったような気がする。
0652デフォルトの名無しさん2005/05/02(月) 04:34:49
お前のレベルが上がったから相対的にそう見えるだけだ!!!
0653デフォルトの名無しさん2005/05/02(月) 09:07:55
まぁ1年経っても同じ光景に見えるようじゃヤヴァイわな。
0654デフォルトの名無しさん2005/05/02(月) 13:31:30
クラス内に配列があります。
class foo{
private:
public:
 int x[10];
};

これらの変数にアクセスする際に
boo.x[0]
boo.x[1]
などとしているのですが、これを
boo.a
boo.b
のようにアクセスできるうにすることはできないでしょうか?
参照を使ってみようと試みましたが、宣言の仕方がわかりません。
0655デフォルトの名無しさん2005/05/02(月) 13:45:28
class foo
{
public:
foo() a(x[0]){}
int &a;
int x[10];
};
0656デフォルトの名無しさん2005/05/02(月) 13:46:02
ごめん。
foo() : a(x[0]){}
ね
06576542005/05/02(月) 13:50:35
>>655
ありがとうございます。このテクニックはググるとしたら、何というキーワードで調べればよいのでしょうか?
0658デフォルトの名無しさん2005/05/02(月) 13:52:36
>>657
初期設定子とか参照型とかじゃね?
0659デフォルトの名無しさんNGNG
C++の基本が載ってるサイト下さい
今使ってる本、namespaceとか全く無いんですが、大丈夫なのでしょうか?
後iostream.hとかなってますし
0660デフォルトの名無しさん2005/05/02(月) 18:55:33
C++入門でググって見ろ

クラスつかや名前空間なんぞそこまで気にすることも無い
0661デフォルトの名無しさんNGNG
どうもありがとうございました
0662デフォルトの名無しさん2005/05/02(月) 20:18:14
自分で欲しい情報見つけられない奴はプログラマに向いてないと思うよ。
0663デフォルトの名無しさん2005/05/02(月) 20:22:33
>>662
どの職に向いているか向いていないか、単一の条件で決められるわけでもなく、しかも誰もそんなこと聞いてないんだよ。
0664デフォルトの名無しさん2005/05/02(月) 20:23:34
>>662
何に向いてるんだ?
0665デフォルトの名無しさん2005/05/02(月) 20:27:45
同じくソース公開を求める人も向いてないと思う。
0666デフォルトの名無しさん2005/05/02(月) 20:40:02
>>663
聞いてもいないのにもらえた貴重なアドバイスなのに、
なに切れちゃってんの?

やっぱり向いてないねえ。全然ダメだわ。
0667デフォルトの名無しさん2005/05/02(月) 20:42:35
>>666
荒すなら厨房板池
0668デフォルトの名無しさん2005/05/02(月) 20:45:49
まあ>>663みたいなレス付ける奴は大抵図星なんだろうけどな。
0669デフォルトの名無しさん2005/05/02(月) 20:46:54
>>662=666
来たぜ、馬鹿がw
0670デフォルトの名無しさん2005/05/02(月) 20:47:17
晒しage
0671デフォルトの名無しさん2005/05/02(月) 20:57:30
>>662はプログラマ以前に人間に向いてないからね。
0672デフォルトの名無しさん2005/05/02(月) 20:58:34
やばいマジ厨が来た
0673デフォルトの名無しさん2005/05/02(月) 21:01:35
質問です。
WindowsのWireless Zero Configuration(WZC)の設定をプログラムから
行うには、どのようにすれば良いのでしょうか?
おそらく、どこかに設定情報のファイルがありそうなのですが、見つかりません。
ご存知の方がいらっしゃいましたら教えて下さい。
0674デフォルトの名無しさん2005/05/02(月) 21:19:42
>>641
-lH100000のように16進数でスタックサイズを指定できる。
これはデフォルト値(1MB)
0675デフォルトの名無しさん2005/05/02(月) 21:23:58
>>673
詳しくはしらんけど、普通はレジストリじゃねーの?
レジストリでそれらしいのを検索してみろ。
0676デフォルトの名無しさん2005/05/02(月) 21:51:15
>>654
struct foo{
union{
int x[10];
struct{ int a; int b; };
};
};
の方が良いかもしれんし、悪いかもしれん
0677デフォルトの名無しさん2005/05/02(月) 22:19:01
メンバの構造体の名前が無いじゃん
0678デフォルトの名無しさん2005/05/02(月) 23:57:23
>>677
そりゃワザと書いて無いからね
0679デフォルトの名無しさん2005/05/03(火) 00:02:05
swap(int &a, int &b)
{
   a ^= b;
   b ^= a;
   a ^= b;
}
0680デフォルトの名無しさん2005/05/03(火) 00:23:58
>>679
いまだにそんな馬鹿な事をやってる奴いるのか。
0681デフォルトの名無しさん2005/05/03(火) 00:45:14
a = 0;
よりも
swap(a,a);
のほうがかっこいいと言いたいらしい
0682デフォルトの名無しさん2005/05/03(火) 01:00:27
>>681
アフォ発見!
0683デフォルトの名無しさん2005/05/03(火) 01:02:50
>>682
アフォ発見!
0684デフォルトの名無しさん2005/05/03(火) 01:04:05
世界!
0685デフォルトの名無しさん2005/05/03(火) 01:05:04
アフォ発見!












とでも言うと思ったのか!!
0686デフォルトの名無しさん2005/05/03(火) 01:05:04
>>679は相当のボケだが、>>681もかなりのボケ
0687デフォルトの名無しさん2005/05/03(火) 01:12:04
どちらも普通のボケだと思うのだが
>>679のswap()で同じ変数入れたら0になるのは分かるのだが笑いどころがわからん
0688デフォルトの名無しさん2005/05/03(火) 01:18:11
スワッピングして〜!
0689デフォルトの名無しさん2005/05/03(火) 01:31:32
やっぱりレベル下がってるぞ、このスレ。
0690デフォルトの名無しさん2005/05/03(火) 01:38:22
だからどうした? 何か問題でもあるのか?
0691デフォルトの名無しさん2005/05/03(火) 02:26:22
level++
0692デフォルトの名無しさん2005/05/03(火) 02:30:27
level ^= level;
0693デフォルトの名無しさん2005/05/03(火) 14:49:54
level=0.5;while(1){level ^= level;}
0694デフォルトの名無しさん2005/05/03(火) 14:53:42
クラスをnewして返す関数を作るとして
外からクラスのどんな情報を渡してあげれば可能になるでしょうか?

void* cnew(classname)
{
 return new classname;
}

みたいな事をやりたいんでつが。
0695デフォルトの名無しさん2005/05/03(火) 15:03:25
∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∵。∴∵ 
∴∵∴∵:。∴∵∴∵∴: --─- ∴∵∴∵∴∵∴∵ 
∴∵゜∴∵∴∵∴∵  (___ )(___ ) ∴∵。∴∵∴∵ ゜ 
∴∵∴∵∴:∵∴∵_ i/ = =ヽi ∴∵∴∵。∴∵∴ 
∴∵☆彡∴∵∵ //[||    」  ||] ∴:∵∴∵∴∵:∴∵ 
∴∵∴∵∴∵ / ヘ | |  ____,ヽ | | ∴:∵∴∵∴∵:∴∵ 
∴゚∴∵∴∵ /ヽ ノ    ヽ__./  ∴∵∴∵:∴∵∴∵ 
∴∵∴∵  く  /     三三三∠⌒> ∴:∵∴∵:∴∵ 
∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∵∵∴∵∴∵ 
   ∧∧   ∧∧  ∧∧   ∧∧ 
  (   )ゝ (   )ゝ(   )ゝ(   )ゝ ムチャシヤガッテ・・・ 
   i⌒ /   i⌒ /  i⌒ /   i⌒ / 
   三  |  三  |  三  |  三  | 
   ∪ ∪  ∪ ∪  ∪ ∪  ∪ ∪ 
  三三   三三  三三  三三 
0696デフォルトの名無しさん2005/05/03(火) 15:22:53
テンプレート
template <typename T>
T *cnew()
{
return new T;
}
マクロ
#define CNEW(classname) new classname
0697デフォルトの名無しさん2005/05/03(火) 17:48:50
コンストラクタ内でのエラー処理について質問なのですが、
内包クラスの生成失敗などでクラスの生成を中止させる場合はコンストラクタ内でクリーンアップし、bad_alloc例外を投げればよいのでしょうか?
いまいちどう処理すればいいのか分からないのですが‥‥orz
0698デフォルトの名無しさん2005/05/03(火) 18:31:34
>>697
そんだけの情報じゃなんとも。もっと具体的に。
0699デフォルトの名無しさん2005/05/03(火) 19:16:23
>>698
平たく言うとコンストラクタ内で自身の生成を中断して通知したいという事です。
0700デフォルトの名無しさん2005/05/03(火) 19:36:17
>>697
内包クラスの生成失敗が例外によって通知されるなら、
基本的にクリーンアップは必要ない。
単に例外を素通りさせるか、catchして別のものをなげ直す。

それから、メモリ確保エラーじゃない限りbad_allocを投げるのは良くない。
0701デフォルトの名無しさん2005/05/03(火) 19:37:29
>>697,699
例外を投げればいい。
クリーンアップは基本的にデストラクタで。
部分的なメンバに対するクリーンアップが必要なら、
そいつをクラスにしてデストラクタを定義できないかどうか考えてみるといい。
それでも、ほんとうに駄目な時に、コンストラクタ本体の中に
try,catch を配備する事を考える。
0702デフォルトの名無しさん2005/05/03(火) 19:44:08
家庭教師のtry
0703デフォルトの名無しさん2005/05/03(火) 20:35:18
//データを受け取る。
//このとき改行文字等は除外しないと後で思わぬエラーが生じる

for (i = 0; (c = getchar()) != EOF; i++) {
if (c != '\r' && c != '\n')
pBuf[i] = c;
else
i--;
}

こういうソースがあるんですが、「i--」の部分が分かりません。
i=i-1をした後、for内でi=i+1をしてるってことですよねこれ。
これじゃ元に戻って無限ループしちゃうんじゃないですか?
0704デフォルトの名無しさん2005/05/03(火) 20:41:34
>>703
条件部がiに関する条件じゃないから、iが更新されなくても
直接問題になるわけではない。そのソースは
i = 0;
while((c = getchar()) != EOF)
  if(c != '\r' && c != '\n')
    pBuf[i++] = c;
と等価で、こうすればiがループに関係していないことがわかると思う。
ちなみに、スタイルの問題として、ループに直接関係のないことを
forの初期化・更新式で行うのは避けるべきだという考えもある。
0705デフォルトの名無しさん2005/05/03(火) 20:43:38
>>703
i--するのは、特定の条件を満たしたときのみ。
0706デフォルトの名無しさん2005/05/03(火) 20:51:41
>>704-705
あ、なるほど。c=getcher()は繰り返すだけで進んでいくんでしたね。
ありがとうございました。

あともう一つ聞きたいんですが、

  len = (int)strlen(src) + 1;
  temp = (char *)malloc(len);

  len = (int)strlen(src);
  if (len >= 1024) {
    er();
    free(temp);
    return -1;
  }

というソースがあるのですが、この上2行を
  len = (int)strlen(src);
  temp = (char *)malloc(len+1);
としてlenの宣言を一回にまとめていないのは、何か理由があるんでしょうか?
0707デフォルトの名無しさん2005/05/03(火) 20:53:03
>>706
書いた人の好み
0708デフォルトの名無しさん2005/05/03(火) 20:55:39
>>706
どうせならこうしようぜ
temp = (char*)malloc((len = (int)strlen(src)) + 1);
0709デフォルトの名無しさん2005/05/03(火) 23:03:27
new 演算子ってコンパイル時にmallocとかコンストラクタとかに変換されてしまうから
実行時にnewをする事はできない?
0710デフォルトの名無しさん2005/05/03(火) 23:26:49
>>709
どういうこと?
0711デフォルトの名無しさん2005/05/04(水) 00:34:20
>>709
mallocはまだしもなぜコンストラクタが出て来るんだ。
0712デフォルトの名無しさん2005/05/04(水) 00:40:18
いやコンストラクタは理解できるがnewがmalloc()使って実装されてるとは限らんだろ
0713デフォルトの名無しさん2005/05/04(水) 01:36:07
実行時型情報だけを受け取って、
その型のオブジェクトを作ったりは出来ないですよね?
0714デフォルトの名無しさん2005/05/04(水) 01:46:09
多態
0715デフォルトの名無しさん2005/05/04(水) 10:44:10
factoryパターンとかそんなんかな?
0716デフォルトの名無しさん2005/05/04(水) 11:28:00
char *buf = new char[(rand() & 0xff) + 8];
で確保したエリアのサイズを、後から調べる方法ってありませんかね?
0717デフォルトの名無しさん2005/05/04(水) 11:31:23
>>716
ありません。ラッパクラスでも作ればできなくはないですが。
0718デフォルトの名無しさん2005/05/04(水) 11:33:34
>>716
うんざりするほど既出
0719デフォルトの名無しさん2005/05/04(水) 11:34:13
文字列ならstring使えばいいのに。
07207162005/05/04(水) 11:50:13
既出でしたかすいません
即レス感謝です。
0721デフォルトの名無しさん2005/05/04(水) 13:49:04
C言語なら俺に聞け! Part 106
http://pc8.2ch.net/test/read.cgi/tech/1113102515/

の>>113のn次元配列動的生成関数を
class対応版のn次元配列動的生成関数にはできませんか?
生成部分だけコールバック関数を用意すれば可能ではありますけど
もっとエレガントにできないかと思って。
0722デフォルトの名無しさん2005/05/04(水) 13:56:08
>>721
vector使ったら?
0723デフォルトの名無しさん2005/05/04(水) 14:29:18
>>722
STLとは盲点ですた。
vectorと多次元配列で調べたら
boost::multi_arrayってのが見つかって目的の物そのものですた。
いいヒントありがとん。
0724デフォルトの名無しさん2005/05/04(水) 15:46:20
ファイルのコピーを行うため、下のようなコードを書いたのですが、
どうやらEOFまで書き込んでしまってるようです。

ifstream in;
ofstream out;
in.open("test.txt",ios::in | ios::binary);
out.open("test2.txt",ios::out | ios::binary);
while(!in.eof()){
 out.put(in.get());
}

下のようにすれば、EOFを書きこまずに済みましたが、
なんだか冗長な気がします。

while(!in.eof()){
 int c=in.get();
 if(!in.eof())
  out.put(c);
}

そもそも eof() って、次の get() 等が失敗することを
知るためのものではないのですか? get() 等が失敗した後でしか
eof() は真にならないのでしょうか。
0725デフォルトの名無しさん2005/05/04(水) 15:49:13
>eof() は真にならない
get() 等が失敗した理由を後でチェックするため
0726デフォルトの名無しさん2005/05/04(水) 15:50:32

int c;
while((c=ifs.get())!=EOF){
 out.put(c);
}
こうしてみるとか
0727デフォルトの名無しさん2005/05/04(水) 16:39:56
>>724
std::ifstream in("test.txt", std::ios::in | std::ios::binary);
std::ofstream out("test2.txt", std::ios::out | std::ios::binary);
out << in.rdbuf();
0728デフォルトの名無しさん2005/05/04(水) 17:00:18
>ファイルのコピーを行うため

system("copy test.txt test2.txt")
07297242005/05/04(水) 17:33:12
>>725
なるほど。fail()とかと同レベルの関数ってことですね(と解釈しました)。

>>726
それはアリなんでしょうか。
自分の環境では動きましたけど、get()が失敗したときに
EOFが返るっていう保証はあるのでしょうか。
Cの#define定数と混在させるのはなんだか不安です。
ios::eof とかいう定数が定義されてればいいな、と思ったのですが。

>>727-728
コピーそのものが目的ではなくて、ファイル終端検出についての
質問でした。説明不足ですみません。
0730デフォルトの名無しさん2005/05/04(水) 19:09:22
>>729
大丈夫。basic_istream<T>::get()が失敗するとchar_traits<T>::eof()が
返り、char_traits<char>::eof()はEOFを返すことが保障されている。
27.6.1.3 Unformatted input functions -4
21.1.3.1 struct char_traits<char> -7
0731デフォルトの名無しさん2005/05/05(木) 20:36:32
C++の例外処理で
try
{
...
}
catch(...)
{
...
}
といった感じのプログラム見たんですが、catchのカッコ内の
... は何を意味するんでしょう。可変個引数でしょうか。
例外処理はしたこと無いので。
検索しても、...の意味は出てこない。
0732デフォルトの名無しさん2005/05/05(木) 20:37:43
>>731
投げられた例外を全てcatchすることを意味する。
0733デフォルトの名無しさん2005/05/05(木) 20:51:05
>>732 ありがとうございました
0734デフォルトの名無しさん2005/05/05(木) 23:41:34
超初心者なのですが、MSCのフォームで、
エディットコントロールから入力された文字を
数値に変換したり、内部処理した数値を再び
エディットコントロールに戻して表示するには
どうすればいいですか?
07357242005/05/05(木) 23:45:22
>>730
ありがとうございます。安心してEOF使うことにします。
07367302005/05/05(木) 23:57:56
>>735
でも一応std::istream::traits_type::eof()の方がいいと思うぞ。一応。
0737デフォルトの名無しさん2005/05/06(金) 00:06:33
>>734
MSCのフォームって何。
いろいろあるけど、atoi()とか、sprintf()あたり
0738IMO2005/05/06(金) 03:14:30
cygwinでdll作りたいのですがどうしてもエラーが出てしまいます。
どうすればいいか教えていただけませんか?
簡単なプログラムなんですが、

// mydll.c ///
#include <stdio.h>

int hello()
{
printf("Hello world!\n") ;
}
////////////////////////////
を
gcc -c mydll.c
でmydll.oにして、
gcc -shared -o mydll.dll mydll.o
でdllにしたいのですが、

Cannot export _bss_end__: symbol not defined
Cannot export _bss_start__: symbol not defined
Cannot export _data_end__: symbol not defined
Cannot export _data_start__: symbol not defined
collect2: ld returned 1 exit status

というエラーになってしまいます。
http://www.sixnine.net/cygwin/translation/mingw-doc/mingwfaq.html
に書いてある方法でもできないみたいです。
07397242005/05/06(金) 03:30:53
>>736
たしかにそのほうが安心かも…。
std::istream::traits_type::eof()を#defineして使うことにします。
ありがとうございます。
0740デフォルトの名無しさん2005/05/06(金) 07:36:52
 
0741デフォルトの名無しさん2005/05/06(金) 09:29:08
>>739
ダメだこりゃ。
0742デフォルトの名無しさん2005/05/06(金) 09:35:26
void SampleFunction(void){
char chr[64];
(中略)
}
で、この場合chrは最後にfreeしなくていいんですよね?
この関数は何度も呼ばれるんですけど、
関数が終わるたびにchar chr[64]で使ったメモリは開放されているのか不安で。
0743デフォルトの名無しさん2005/05/06(金) 09:41:14
void foo() {
int i;
}
このiと同じ
0744デフォルトの名無しさん2005/05/06(金) 10:58:50
C++でウインドウズのアプリを作ってみたいんですが、コンパイラーは
MSのVS.NETを買わなきゃいけないのでしょうか?使い勝手は悪くてもかまわない
から、JavaのJDKとかG++みたいに無料のコンパイラーがどっかに無いでしょうか?
無料じゃなくても、もっと安いのがあればそれでもいいんですが。VS.NETは
ちょっと手がでません。
0745デフォルトの名無しさん2005/05/06(金) 11:13:43
>>744
g++
0746デフォルトの名無しさん2005/05/06(金) 11:17:32
>>744
VCTK
0747デフォルトの名無しさん2005/05/06(金) 11:35:27
オクとかで安く買うのも手だけど。
無料のコンパイラとか使うのもいいと思うけど、
環境設定とか開発効率とか、無意味な所で時間を食ったら本末転倒。
時間は金で買えない。
0748デフォルトの名無しさん2005/05/06(金) 11:43:10
>>744
g++って自分で書いてるだろ
0749デフォルトの名無しさん2005/05/06(金) 12:01:03
>>744
好きなの選べ

http://msdn.microsoft.com/visualc/vctoolkit2003/ (別途PlatformSDK必須、nmakeなど場合によっては.net FrameworkSDKも、ライブラリ関連のツールが配布されてないので注意)
http://www.borland.co.jp/cppbuilder/freecompiler/ (Windows2000までのSDKは同梱、make,ライブラリ関連等必要な周辺ツールは同梱)

以下Windows用gcc
http://www.mingw.org/
http://www.cygwin.com
0750デフォルトの名無しさん2005/05/06(金) 12:19:33
ttp://www.digitalmars.com/
も忘れないでやってくれ。最近Dのほうしか見られてない気がするが。
07517242005/05/06(金) 14:58:33
>>741
ダメなのか。#define SEOF std::istream::traits_type::eof()
とかいう意味で書いたのだが。
0752C言語をしようとおもうモナ2005/05/06(金) 15:31:31
C言語を始めようとしていますが、やりやすいソフトをおしえていただけませんか?
もちろんフリーソフトでおねがいします。
0753デフォルトの名無しさん2005/05/06(金) 15:32:47
BCC Developer
0754デフォルトの名無しさん2005/05/06(金) 15:37:38
UNIXの基礎(cdとかrmとかのレベルでいい)が分かるのならCygwin+GCC。
そんなの分からん、知りたくも無いならbcc。
…Windows環境だよな?
0755デフォルトの名無しさん2005/05/06(金) 15:39:36
UNIXナニソレな素人ならbccに比べたらまだDev-C++(gcc)のほうがとっつきやすい気がするが。
0756デフォルトの名無しさん2005/05/06(金) 16:05:55
>>751
安易にマクロを使うのはお勧めできない。
定数は const を使って定義することをまず考えたほうがいい。

ただし、この場合は
 std::istream::traits_type::int_type const SEOF = std::istream::traits_type::eof();
となり、かなり冗長な定義になることや、
eof() が関数であることを考えるとマクロで書いた場合に比べて
インライン展開が効かないことによって非効率なコードになるかもしれない。

iostream ライブラリではファイルの終端は
bool eof() で判定するように設計されている。
その他のエラーも考慮して、
 while((c=ifs.get())&&ifs.good())
とするのが正解だろう。
0757デフォルトの名無しさん2005/05/06(金) 16:37:15
どんな値を入れても0で処理されてしまいます。
どうしてでしょうか。

//任意の数字を入力し、平方根を求める。
//入力された数字が負の場合処理を打ち切る。

#include <stdio.h>
#include <math.h>

int main(void)
{
int a;
printf("数字を入力 : ");
scanf("%d", &a);
if (a < 0) {
printf("自然数を入力してください。");
}

else {
printf("%lfの平方根 = %lf", a, sqrt(a));
}

return 0;

}
0758デフォルトの名無しさん2005/05/06(金) 16:50:08
>>757
突っ込みどころ満載だがね。
main()関数を次のように汁。
int main(void)
{
int a;
printf("...");
if (scanf("%d", & a) < 1 || a < 0) {
printf("自然数を...\n");
} else {
printf("%dの平方根 = %g\n", a, sqrt(a));
}
return 0;
}
0759デフォルトの名無しさん2005/05/06(金) 16:53:19
>>757
結果を表示するprintfの1つ目の引数が%lfでsizeof double幅の
変数を要求してるのに、sizeof int 幅の変数を渡してるから。
0760デフォルトの名無しさん2005/05/06(金) 17:12:50
↑馬から落ちて落馬したみたいな。
07617572005/05/06(金) 17:22:19
>758, >759
ありがとうございます。
解決できました。
0762デフォルトの名無しさん2005/05/06(金) 17:58:56
質問です。
operatorによって

str = "左側" + "右側";

という式を定義したいのですが、
CString operator+(char *pszA, char*pszB){
}
を定義しようとすると(CStringは自作の文字列クラスだと思ってください)
'operator +' の宣言で、クラス型のパラメータが 1 つも指定されていません。
とエラーになってしまいます。

やろうとしていること自体は、技術的に可能でしょうか?
可能なら、正しいやり方を知りたいです。よろしくお願いいたします。
0763デフォルトの名無しさん2005/05/06(金) 18:03:21
組み込み型の振る舞いを変えることは不可能
まあ、この場合ポインタの加算でもともとこんなの存在しないけど
0764デフォルトの名無しさん2005/05/06(金) 18:08:08
>>762
CString operator+(const CString& strA, const char *pszB);
CString operator+(const char *pszA, const CString& strB);
を作って文字列(char *)同士の加算をしたければstatic_cast<CString>("左") + "右"などとキャストするしかない。
0765デフォルトの名無しさん2005/05/06(金) 18:31:51
static_castはせんでいいと思う、この場合。
0766デフォルトの名無しさん2005/05/06(金) 18:53:30
>>765
キャストせんとconst char*同士の演算だと解釈されるぞ。
0767デフォルトの名無しさん2005/05/06(金) 18:57:14
最新号のC−MAGAZINEのゲーム・ノ・シクミについて疑問に思ったのですが、タスクシステムを使ったシューティングで
CTaskを基底クラスにしで自機やら敵やら弾やらを派生してタスクリストをループさせることでゲーム全体を処理しています。
その中で弾と敵との当たり判定で
for (CTask *task=ActiveTask->Next, *next; next=task->Next, task!=ActiveTask; task=next)
{
 if (task->Group==TASK_ENEMY)
 {
  Kill();
  CEnemy* enemy=(CEnemy*)task;  // ←ここ
  enemy->Vit-=ShotStr;
とあるのですが、CEemyはCTaskからの派生クラスなので、CEnemy* enemy=(CEnemy*)task;はダウンキャストになると思います。
このダウンキャストは危険だと思うのですが。タスクシステムの参考にしていたのですが、dynamic_castを使ってNULLチェックを
した方がいいような気がするのですが、その必要はないのでしょうか?
キャストについて詳しい人がいたらよろしくお願いします。
0768デフォルトの名無しさん2005/05/06(金) 19:02:51
さぁね
Cマガ編集部とゲーム・ノ・シクミの著者に言えよ
0769デフォルトの名無しさん2005/05/06(金) 19:08:52
>>767
そのインスタンスがCEnemyであることがわかっているのなら問題はない。
assertチェックくらいは入れておいた方がいいと思うが。
0770デフォルトの名無しさん2005/05/06(金) 19:15:53
>>767
最新のCマガでそんなコード載せてるのか。
継承使って if(task->Group==...) なんて、アフォか。
仮想関数使えよ。キャスト自体が要らなくなるだろ。

と、記事も読まずに突っ込み。
0771デフォルトの名無しさん2005/05/06(金) 19:20:42
>>767
dynamic_cast を使ったほうが安全だが、 dynamic_cast は
一般的にクラス階層の大きさに応じてコストがかかる。
当たり判定は高速な処理が要求されそうだから、
そのコストが受け入れられないのかもしれない。
それにしても、なんだか古臭いコードだな。
0772デフォルトの名無しさん2005/05/06(金) 19:21:31
>>769 あのコードのどこにassert入れるんだ?
0773デフォルトの名無しさん2005/05/06(金) 19:23:07
>>766
stitic_castするぐらいならCString("hoge")+"moge"で充分だろ。

>>767
なんならの手段でダウンキャストの結果を保証できるならdynamic_castする必要はない。
dynamic_castだとパフォーマンスに影響がある場合だとか。
0774デフォルトの名無しさん2005/05/06(金) 19:23:32
>>772
assert( dynamic_cast<CEnemy*>(task) );
07757722005/05/06(金) 19:32:12
>>774
なるほど。
でも実際に使ってるのがCスタイルキャストじゃぁ
dynamic_cast でヌルが返ってこなくてもダメな場合って無い?
多重継承使ったりするとダメな気がする。ちょっと試してみようかな。
0776デフォルトの名無しさん2005/05/06(金) 19:34:42
typedef void haru

haru foo();
0777レイザーラモン2005/05/06(金) 19:36:05
777 フゥー!!!!
0778デフォルトの名無しさん2005/05/06(金) 19:36:11
>>764-766
お返事ありがとうございます。
なるほど。残念ながら "ぬるぽ" + "ガッ!!" はそのまま足し算するわけにはいかないのですね。
07797722005/05/06(金) 20:45:28
試したらうまくいった。

けど怪しいのでさらに調べてみると、
Cスタイルキャストに対して static_cast, reinterpret_cast の
どっちが適用されるかは不定ということになっていた。

これをもとに実験してみると、
クラスの定義が同じソース内に現れていれば static_cast で、
宣言だけ( class A; class B; とか)だと、警告も無しに reinterpret_cast の動作になった。

やっぱりCスタイルキャストはクソだな。
0780デフォルトの名無しさん2005/05/06(金) 21:00:24
MyWidget::MyWidget( QWidget *parent, const char *name )
: QWidget( parent, name )
{
...
}
メソッドの後ろに付くコロンってどういう意味でしたっけ?
0781デフォルトの名無しさん2005/05/06(金) 21:11:11
>>780
メンバ変数と基底クラスの初期化。
コンストラクタにしか付かない。
0782デフォルトの名無しさん2005/05/06(金) 23:29:45
{}のなかで初期化すんのと何が違うのでしょう?
0783デフォルトの名無しさん2005/05/06(金) 23:31:44
基底のことは基底に任せろ
0784デフォルトの名無しさん2005/05/06(金) 23:43:33
>>782
メンバがクラスの場合、そのコンストラクタで初期化できる。
constなメンバを初期化できる。(つーかそこでしかできない)
0785デフォルトの名無しさん2005/05/07(土) 00:03:10
>>782
初期化と代入の区別をしっかりしような。
0786デフォルトの名無しさん2005/05/07(土) 00:26:35
void Cvckeisan01Dlg::OnBnClickedButton1()
{
CString inp_a , inp_b, inp_c, inp_d;
double aa=0, bb=0, cc=0, sum_abc=0;

if (m_check_a.GetCheck() == BST_CHECKED){
m_edit_a.GetWindowText(inp_a);
aa = atof(inp_a);
}
if (m_check_b.GetCheck() == BST_CHECKED){
m_edit_b.GetWindowText(inp_b);
bb = atof(inp_b);
}
if (m_check_c.GetCheck() == BST_CHECKED){
m_edit_c.GetWindowText(inp_c);
cc = atof(inp_c);
}
sum_abc = aa + bb + cc;
m_edit_d.SetWindowText(sum_abc);
}
0787デフォルトの名無しさん2005/05/07(土) 00:27:59
何がちゃうの。
07887862005/05/07(土) 00:29:36
超初心者なのですが
最後の行でコンパイルエラーになってしまい
こっちが困ぱいしています。何がおかしいのでしょうか?
0789デフォルトの名無しさん2005/05/07(土) 00:31:29
>>788
エラーメッセージを貼らない奴は無視しようぜ。
0790デフォルトの名無しさん2005/05/07(土) 00:40:08
ソースを貼らないやつも同列だな
0791デフォルトの名無しさん2005/05/07(土) 00:46:07
俺に超能力があればこんな質問くらい…
0792デフォルトの名無しさん2005/05/07(土) 00:53:33
CString str;
str.Format("%f",sum_abc);
m_edit_d.SetWindowText(str);
0793デフォルトの名無しさん2005/05/07(土) 00:55:35
つまんねぇ超能力だな。
0794デフォルトの名無しさん2005/05/07(土) 01:57:22
readfile()で一文字ずつよみこんで特定の文字列がでたら
変換するというツールを練習で作ってるのですがファイルの終端を
検知することができません。
スマートな検知方法があればご教授ください
0795デフォルトの名無しさん2005/05/07(土) 02:04:34
>>794
C/C++でreadfile()?WindowsのReadFile()か?
0796デフォルトの名無しさん2005/05/07(土) 02:12:18
amigaのreadFile()です。
すみません。
07977672005/05/07(土) 02:56:21
なるほど、なんか解りました。if (task->Group==TASK_ENEMY) ここでCEnemyであることを確認しているので
その次のダウンキャストは大丈夫 という流れなんですね。
>なんだか古臭いコードだな。
そうなんですか?
タスクシステムは便利だなぁと思いつつタスク同士の処理(今回の当たり判定とか)になるとなんか逆に不便だな…と思う今日この頃。
ぼちぼちがんばるとします。
0798デフォルトの名無しさん2005/05/07(土) 03:14:14
>>797
ダウンキャストは良くない設計の現れ。
仮想関数をうまく使えないか考えろ。
0799デフォルトの名無しさん2005/05/07(土) 03:42:47
Microsoft Visual C++ 6.0で、
a[10]={0,1,2,3,4,5,6,7,8,9}
と、しておいて

0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 から一つ選べ

とprintfで表示して、scanfで選んだ数字(たとえば3)を次は

0, 1, 2, 4, 5, 6, 7, 8, 9 から一つ選べ

と言う風に3だけ表示させないようにするにはどうすればいいでしょうか?
08007442005/05/07(土) 03:48:29
>>745-750
どうもありがとうございました。
g++でも、ウインドウズのアプリが出来るんですか?
LinuxとかUnix用だと思っていました。
他に皆さんがあげてくれたものを、自分で少し調べてみます。どうも。
0801デフォルトの名無しさん2005/05/07(土) 03:49:13
>>799
何が分からないの?
丸投げではなく、出来る所まで作って貼り付けてみ
0802デフォルトの名無しさん2005/05/07(土) 06:26:06
C言語でファイルをソートする関数ってあるのでしょうか?
0803デフォルトの名無しさん2005/05/07(土) 07:03:52
ファイルをソート、というのがまず不明
0804デフォルトの名無しさん2005/05/07(土) 08:05:41
ファイルの中のデータをある項目をキーにして
ソートするという意味です。
COBOLだとSORT文っていう、ファイルの中身を
ソートする命令がありました。
Cのqsortみたいにメモリ上の配列などをソートする関数はあるけど、
ファイルの中身そのものをソートする関数はあるのでしょうか?
0805デフォルトの名無しさん2005/05/07(土) 09:16:10
一旦メモリに読み込まないと無理。
0806デフォルトの名無しさん2005/05/07(土) 09:18:48
>>805
やっぱりメモリに読み込まないとダメですか。
ありがとうございました。
08077992005/05/07(土) 09:38:24
>>801do
{
int a[40]={0,tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda()};
int b[40]={0,tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda()};
printf("Player1の手札\n");
for(i=1;i<=10;i++)
{printf("%d=[%d] ",i,a[i]);}
printf("\nplayer2の手札\n");
for(i=1;i<=10;i++)
{printf("%d=[%d] ",i,b[i]);}

for(i=1;i<=10;i++)
{
                     printf("\n『『『『%d回戦』』』』\n\n《player1》\n出す札の番号を入力して下さい\n",i);
              scanf("%d",&x);
printf("場に出したカード[%d]\n",a[x]);
printf("\n《player2》\n出す札の番号を入力して下さい\n");
scanf("%d",&y);
printf("場に出したカード[%d]",b[y]);
08087992005/05/07(土) 09:38:49
if(a[x]==13&&b[y]==1)
{printf("\n\nplayer2の勝ち!!\n");}
else if(a[x]==1&&b[y]==13)
{printf("\n\nplayer1の勝ち!!\n");}
else if(a[x]<b[y])
{printf("\n\nplayer2の勝ち!!\n");}
else if(b[y]<a[x])
{printf("\n\nplayer1の勝ち!!\n");}
else if(a[x]==b[y])
{printf("\n\nドロー!!\n");}
}
}
while(printf("\n続けるなら何か数字を入力して下さい。続けないならCtrl+zを入力して下さい\n"),EOF!=scanf("%d",&play));
return 0;
}
int tehuda()
{
return (int)((double)rand()/(RAND_MAX+1.0)*13)+1;
}

今こんな感じで作っているのですが、最初に表示した手札を次は選んでいないものだけ表示させたい、と言う所がわからなくて詰まっています。
何か助言をお願いします。
0809デフォルトの名無しさん2005/05/07(土) 09:56:03
>>799
3を選んだら、4-9をずらして配列に入れればいいんじゃない?
選んだ数字がn、配列の最大値(カードの枚数)をmaxとすると

for(i=n;i<max;i++)a[i]=a[i+1];
max=max-1;

これで配列の中身は
0,1,2,4,5,6,7,8,9
になるでしょ。
0810デフォルトの名無しさん2005/05/07(土) 10:46:18
>>809
max--;
for(i=n;i<max;i++)a[i]=a[i+1];
の方が良い。
0811デフォルトの名無しさん2005/05/07(土) 11:51:51
>>802
system("sort +1 foo > bar");
08128022005/05/07(土) 13:55:31
>>811
ありがとうございます。それでやってみます。
0813デフォルトの名無しさん2005/05/07(土) 14:26:56
いいのかよそれでw
08147992005/05/07(土) 16:12:01
すみません、>>809-810を参考に色々やってみているんですが

例外処理 (初回) は Card.exe にあります: 0xC0000005: Access Violation。

と言うメッセージが出るのですが、どういう意味ですか?
0815デフォルトの名無しさん2005/05/07(土) 16:29:15
どう色々やったんだ
初期化してないポインタを触ったとか
配列を超えたとかじゃねーの
0816デフォルトの名無しさん2005/05/07(土) 16:31:31
解決せん時はソースを晒そう
08177992005/05/07(土) 16:57:45
do
{
int a[40]={0,tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda()};
int b[40]={0,tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda(),tehuda()};
printf("Player1の手札\n");
for(i=1;i<=10;i++)
{
printf(" %d=[%d]",i,a[i]);
}
printf("\nplayer2の手札\n");
for(i=1;i<=10;i++)
{
printf(" %d=[%d]",i,b[i]);
}
for(j=1;j<=10;j++)
{
printf("\n--------------------------------------------------------------------------------");
printf("\n『『『『%d回戦』』』』\n\n《player1》\n出す札の番号を入力して下さい\n",j);

printf("現在の手札は\n");
for(i=x;i<max;i++)a[i]=a[i+1]; max--;
{
printf(" %d=[%d]",i,a[i]);
}
scanf("%d",&x);
printf("場に出したカード[%d]\n",a[x]);
08187992005/05/07(土) 16:58:57
printf("\n《player2》\n出す札の番号を入力して下さい\n");
printf("現在の手札は\n");
for(i=y;i<max;i++)a[i]=a[i+1]; max--;
{
printf(" %d=[%d]",i,a[i]);
}
scanf("%d",&y);
printf("場に出したカード[%d]",b[y]);
if(a[x]==13&&b[y]==1)
{
printf("\n\nplayer2の勝ち!!\n");
}
else if(a[x]==1&&b[y]==13)
{
printf("\n\nplayer1の勝ち!!\n");
}
else if(a[x]<b[y])
{
printf("\n\nplayer2の勝ち!!\n");
}
else if(b[y]<a[x])
{
printf("\n\nplayer1の勝ち!!\n");
}
else if(a[x]==b[y])
{
printf("\n\nドロー!!\n");
}
}
}
08197992005/05/07(土) 16:59:18
while(printf("\n続けるなら何か数字を入力して下さい。続けないならCtrl+zを入力して下さい\n"),EOF!=scanf("%d",&x));
return 0;
}
int tehuda()
{
return (int)((double)rand()/(RAND_MAX+1.0)*13)+1;
}
今現在はこういう感じです。

for(i=y;i<max;i++)a[i]=a[i+1]; max--;

これの意味は解ったつもりなんですが…
0820デフォルトの名無しさん2005/05/07(土) 17:11:15
printf("現在の手札は\n");
for(i=x;i<max;i++)a[i]=a[i+1]; max--;
{
printf(" %d=[%d]",i,a[i]);
}
0821デフォルトの名無しさん2005/05/07(土) 17:23:52
ウザイ
0822デフォルトの名無しさん2005/05/07(土) 17:33:26
>>799
突っ込みどころ満載だなぁ。

>for(i=y;i<max;i++)a[i]=a[i+1]; max--;
>これの意味は解ったつもりなんですが…

わかってない。

printf("現在の手札は\n");
(*1)for(i=x;i<max;i++)a[i]=a[i+1]; max--;
{
printf(" %d=[%d]",i,a[i]);
}
scanf("%d",&x);
printf("場に出したカード[%d]\n",a[x]);

(*1)はカードの入れ替えなんだから、ここじゃなくて勝敗が決まったあとだろ。
この行は持ちカード全部表示なんだからfor(i=0;i<max;i++)になる。

勝敗が付いたあとで、
for(i=x;i<max;i++)a[i]=a[i+1];
for(i=y;i<max;i++)b[i]=b[i+1];
max--;

あと、maxが0になった場合の処理も必要。
0823デフォルトの名無しさん2005/05/07(土) 17:34:05
>>820の中括弧が意味わからんが
i が max - 1 のとき、 a[max - 1] = a[max] という風になるが問題なし?
0824デフォルトの名無しさん2005/05/07(土) 17:41:29
ポインタ定義するとき、

int* i;
int *i;

ってどっち使ってますか?
0825デフォルトの名無しさん2005/05/07(土) 17:43:03
Cなら後者
0826デフォルトの名無しさん2005/05/07(土) 17:45:20
>>824
C++なら前者のほうがいい。区別する理由が無いから、Cでも前者。
0827デフォルトの名無しさん2005/05/07(土) 17:45:26
C++でも後者。
0828デフォルトの名無しさん2005/05/07(土) 17:47:09
ぷ、いい加減なC言語。選べる仕様がおかしいよw
0829デフォルトの名無しさん2005/05/07(土) 17:49:33
ゆーずーがきかないほうがおかしいよw
0830デフォルトの名無しさん2005/05/07(土) 17:51:06
>>824 http://pc8.2ch.net/test/read.cgi/tech/1096687703/
0831デフォルトの名無しさん2005/05/07(土) 17:51:20
>>829
そうか?、プログラミング言語Cはいい加減すぎるよ。
0832デフォルトの名無しさん2005/05/07(土) 17:53:14
いいあんばい、だろ?
0833デフォルトの名無しさん2005/05/07(土) 18:17:04
いい加減なC、厳格なPascal
0834デフォルトの名無しさん2005/05/07(土) 18:34:44
堅い人と付き合っててもおもすろくない
0835デフォルトの名無しさん2005/05/07(土) 18:42:45
いい加減な人とつき合うと疲れる。
0836デフォルトの名無しさん2005/05/07(土) 18:44:15
>疲れる
まだ青いな
0837デフォルトの名無しさん2005/05/07(土) 18:48:02
>>799
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=32
Res:52
08387992005/05/07(土) 18:52:48
流れ断ち切りそうですが

>>822
ありがとうございます。なんとかできたみたいです。ただ、maxが0になった場合の処理はとくにしなかったのですが、何故か
何事もなく終了したんですが、何か問題があるのでしょうか?
0839デフォルトの名無しさん2005/05/07(土) 18:53:33
>>836
あなたのように黄ばみたくはありませんw
08407992005/05/07(土) 18:56:40
>>837
うわ、何かすごい。
ちょっと試してみます。わざわざすみません
0841デフォルトの名無しさん2005/05/07(土) 19:18:45
質問です。
fwriteでエラーを起こしてエラー処理の試験をしようと
思っていたんですが、fopen後にopenしたファイルを削除しても
特にエラーとはならずにfwriteが実行されているようです。
(openしてからwriteするまでに別のトリガがあるのでそのトリガを
発生させる前にファイルを削除した)
ほかにopen後にファイルのパーミッションを書込み禁止に設定
してみても同様に特にエラーが発生しませんでした。

ほかにエラーを発生させる方法としてディスクをフルに近い状態に
しておく位しか思いつかないのですが、何かほかに方法はあるで
しょうか?

また、どうしてこういう動作をするかという仕組みも教えてもらえると
助かります。
0842デフォルトの名無しさん2005/05/07(土) 19:28:59
>841
それは激しく環境依存だが何か解決作は提供されている
例えばwinAPIでは排他させるものが用意されている
0843デフォルトの名無しさん2005/05/07(土) 19:33:49
>>842
Solaris9環境の場合だとどういう解決策があるでしょうか?
0844デフォルトの名無しさん2005/05/07(土) 19:44:41
flock
とか?
08457992005/05/07(土) 19:45:58
>>837

プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。

と言うエラーが出ました。考えてみますが多分解らないような気がしますorz
でも、本当にわざわざありがとうございます。

>>838の問題は、何とか自分で解決してみます。

801,809,810,815,816,822,837氏、いろいろありがとうございました。
0846デフォルトの名無しさん2005/05/07(土) 20:03:56
>>841
多分バッファリングされててファイルにアクセスしてないんだろう。
setbufでバッファリングを無効にしてみれば?
0847デフォルトの名無しさん2005/05/07(土) 20:04:37
>プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。

マイクソのcompilerだね
たぶん"プリコンパイル"使わないように設定すれば別の道が開けると思われ
0848デフォルトの名無しさん2005/05/07(土) 20:14:20
inode とかリンクで調べてみて
0849デフォルトの名無しさん2005/05/07(土) 20:15:15
先頭に、#include "stdafx.h" が無いのにプリコンパイルありになってると出るのさ
08507242005/05/07(土) 20:57:31
あぅ、、ログがめっさ流れてる…。返事遅れてすみません。

>>756
毎回細かい解説ありがとうございます。
std::istream::traits_type::eof() は知識として覚えておき
iostreamの設計者の意思に沿って
ifstream::eof() や ifstream::good() を使うことにします。

while(c=ifs.get(),ifs.good()){ //'\0'もコピーしたいので「&&」を「,」にしました
 ofs.put(c);
}

初めは eof を2回呼び出すコードになってしまい
気持ち悪かったですけど、こうしてみるとスッキリして満足です。
どうも自分は STL 使い始めたばっかで定石を知らなすぎるので
人のコードを見て勉強することにします。
0851デフォルトの名無しさん2005/05/07(土) 22:05:26
>>841
テスト用に小さいパーティションがフロッピーディスクを用意し、>846で。
尚、リリース用のコードではバッファリング無効にしたら阿呆なので、
fwrite()だけでなくfclose()でもエラーチェックする必要がある点に留意のこと。
0852デフォルトの名無しさん2005/05/07(土) 22:15:48
>>841
とりあえずこんなんじゃだめ?
#ifndef NDEBUG
#define fwrite(p, size, n, fp) 0
#endif
0853デフォルトの名無しさん2005/05/08(日) 01:54:15
>>850
以下で十分。
while(c=ifs.get(), ifs){
    ofs.put(c);
}

なぜならば通常、以下のように操作するから。
while(ifs)
{
    //...
}
0854デフォルトの名無しさん2005/05/08(日) 02:03:07
>>853
明示的に good() をテストしたほうが読みやすいなぁ。
「なぜならば」の後ろも理由になってないし。
0855デフォルトの名無しさん2005/05/08(日) 12:43:27
841です。

>>844
flockでLOCK_EX|LOCK_NBをフラグに設定してやってみましたが
書き込み側では変化なしでした。

>>846
open後にsetbuf(fp,NULL)としてみましたがこちらも変化なし。
setvbuf(fp,NULL,_IONBF, 0)としてバッファリングしないように
した後に書き込みファイルを削除しても同様でした。

フロッピー方法で試してみるしかないかな・・・。
0856デフォルトの名無しさん2005/05/08(日) 16:47:34
>>841
っていうか開いてるファイルを削除できてしまうものなのか?
パスの間違いじゃなくて?OSはなんなの?
0857デフォルトの名無しさん2005/05/08(日) 16:55:33
>>856
もしWinだったら、APIで共有Lvを指定しないと開いてるファイルでも削除できる
他のOSはよく知らんが、
UNIX/LINUXなんかでPerlでopenしても、lockしないと削除したりできるしなぁ・・・
0858デフォルトの名無しさん2005/05/08(日) 17:25:09
知らんかった…。環境によってはファイル削除されることも
考慮しなきゃならんのね。
Win2000で fopen(path,"wb"); で試した限りでは
fclose するまで削除できんかったので、他の環境でもそんなもんだと思ってた。
0859デフォルトの名無しさん2005/05/08(日) 17:38:35
>>858
Unixでは、あるプロセスがfopen("foo", "r+")していると
仮令rm fooしてファイルを削除したつもりになっても
ディスク上にfooの実体が存在しつづける。
従って、自プロセスからしか見えない一時ファイルを簡単に作れる。

>>855
だから>851。
0860デフォルトの名無しさん2005/05/09(月) 22:04:48
c++ってなんて読む?
0861デフォルトの名無しさん2005/05/09(月) 22:07:20
c++
0862デフォルトの名無しさん2005/05/09(月) 22:14:58
c+=
0863デフォルトの名無しさん2005/05/09(月) 23:10:20
>>860
「しーたすたす」と読むのが通
0864デフォルトの名無しさん2005/05/09(月) 23:48:28
チンコプラプラ
0865デフォルトの名無しさん2005/05/09(月) 23:50:50
すぃーぷらすぷらす
0866デフォルトの名無しさん2005/05/09(月) 23:56:43
シャー++
0867デフォルトの名無しさん2005/05/10(火) 00:03:59
ストレージクラスってなんですか
0868デフォルトの名無しさん2005/05/10(火) 00:18:06
>>867
ある変数がどうやって記憶されるか。
auto(スコープから抜けると破棄)、static(実行中常に存在)、
register(レジスタに置かれる(ような気分になる))など。
08698672005/05/10(火) 00:32:48
static UCHAR value=0;
と初期化したら、ストレージクラスが正しくありません(たしか...)
みたいなことをコンパイラが発したんですけど、
それはUCHARの初期化はムリということですか?
もっと別のことかな...。初期化削ったら、エラー取れたけど。
ちょっと気になるので聞いてみました。
0870デフォルトの名無しさん2005/05/10(火) 00:41:52
>>869
エラーメッセージが出たなら、それに従え。
エラーメッセージの意味がわからないならコピペしろ。
UCHARが何者であるかも重要、かもしれない。
0871デフォルトの名無しさん2005/05/10(火) 01:08:17
UCHARって、unsigned charじゃね?
VCに付いてるヘッダしか持って無いが、
typedef unsigned char UCHARって有るぜ
0872デフォルトの名無しさん2005/05/10(火) 03:15:08
class C{
static UCHAR v = 0;
}
こうかね?
08738672005/05/10(火) 09:37:39
エラーが山積みだから、872さん書いたようになってると思われます。
08748672005/05/10(火) 09:38:12
「が」が抜けてる
0875デフォルトの名無しさん2005/05/10(火) 11:46:59
>>860
シープラ
0876デフォルトの名無しさん2005/05/10(火) 12:10:32
static UCHAR C::v = 0; はクラスの外でね
0877デフォルトの名無しさん2005/05/10(火) 21:26:13
質問です。もしかしてC言語ってdoubleにビット演算ってかけられないんでしょうか?
Linux/gccで
double a,b;
b=a>>1;
としたところ
: error: invalid operands to binary >>
とエラーが出てしまいます。
1時間程ネットで調べてもなかなか情報を得られなかったため、
ご教授いただければ幸いです。
0878デフォルトの名無しさん2005/05/10(火) 21:30:21
>>877
できないし、意味が無い。
0879デフォルトの名無しさん2005/05/10(火) 21:34:58
回答ありがとうございます。
できないですか。
ビットの中身を覗くだけでもできないものでしょうか。
0880デフォルトの名無しさん2005/05/10(火) 21:36:26
デバッガ
0881デフォルトの名無しさん2005/05/10(火) 21:37:46
どーもです。
0882デフォルトの名無しさん2005/05/10(火) 22:19:14
私がC習いたての頃は
int i;
return(i);
とかが当たり前でした。
でも最近は、
int i;
return i;
ってやるのが普通みたいです。
皆さんは()つけますか?それともつけませんか?
0883デフォルトの名無しさん2005/05/10(火) 22:21:28
付けないですがsizeofの時だけは()を付けます
0884デフォルトの名無しさん2005/05/10(火) 22:24:59
C言語についてです。
関数の中で宣言した変数は、その関数から抜けた時に自動的にメモリ開放されるんでしょうか?
例えば、

この辺で変数宣言
if (比較){
 成功時処理
}else{
 return 0;
}
変数メモリ開放
return 1;

とやったら、比較失敗時は宣言した変数のメモリが開放されないままなのですか?
0885デフォルトの名無しさん2005/05/10(火) 22:26:32
されないなあ
0886デフォルトの名無しさん2005/05/10(火) 22:27:29
>>877-878

for(int i=0; i<sizeof(double); i++)
 for(int mask=128; mask>0; mask>>=1)
  printf("%d", ((char*)&a)[i]&&mask);

こんなんでどうよ。
エンディアンの都合にあわせて変えてくれ。
0887デフォルトの名無しさん2005/05/10(火) 22:27:32
っていうか宣言した変数ってなんだ
mallocでもしてるのか?
0888デフォルトの名無しさん2005/05/10(火) 22:41:38
>>884
スコープというものを勉強してみるといい

>>887
宣言と動的メモリ確保を一緒にするなよ
08898842005/05/10(火) 22:46:23
レスありがとうございます。
char *str;
というポインタの宣言ではこのポインタのメモリは残らないのですか?
いくつかのWEB上にあるコードを見たところ、解放されていません。
でもポインタはメモリ上の位置を指す為の情報を保持しているのですよね。
0890デフォルトの名無しさん2005/05/10(火) 22:48:06
値が残ってるとかだったら、スコープを抜けて無効になったかて、
それで値が消えるわけではないぞ?
0891デフォルトの名無しさん2005/05/10(火) 23:11:48
>>889
保持しているとは言っても最初は使い物にならないでたらめな値になっている。

だからmalloc/callocや&や配列・文字列リテラルからちゃんとしたメモリへのポインタを取得し、
ポインタ変数へ代入している。
0892デフォルトの名無しさん2005/05/10(火) 23:14:30
なんかスコープとか以前の問題の気がするのだけれど
0893デフォルトの名無しさん2005/05/10(火) 23:58:23
>>889
「ポインタのメモリ」なんて表現は曖昧。
「ポインタ自身のメモリ」と「ポインタの指すメモリ」を区別する必要がある。
08948842005/05/11(水) 00:10:46
>>893
ポインタが指しているメモリ位置のアドレス情報の事でした。
0895デフォルトの名無しさん2005/05/11(水) 00:18:38
http://www.bohyoh.com/CandCPP/C/Library/index.html
Cの標準ライブラリはこれで全てですか?
ぐぐっても他に出てこないんだけど。
0896デフォルトの名無しさん2005/05/11(水) 00:29:15
とりあえずざっと見たところ少なくともC99で追加された関数は入ってないようだな。
0897デフォルトの名無しさん2005/05/11(水) 00:30:31
不安ならstd**.hの中とか見てみたら?
0898デフォルトの名無しさん2005/05/11(水) 00:51:33
>>884,889,894
言葉の意味が曖昧で危なっかしいな。
884に出てくる「変数メモリ開放」ってのは実際のコードで書くとどうなるの?
0899デフォルトの名無しさん2005/05/11(水) 09:27:44
VCであるクラスのlibファイルを作成して、ヘッダーファイルと共に配布したいのですが、
ヘッダー中のクラスのprivateの部分を見せないようにするにはどのようにしたら良いですか?
0900デフォルトの名無しさん2005/05/11(水) 09:35:25
>>899
抽象クラスと生成関数の組み合わせか、 pimpl を使う。
0901デフォルトの名無しさん2005/05/11(水) 10:09:45
>>900
pImplイディオム調べてみました。面白いですね。
どちらにしろ、ある程度の手続きが必要ですね。
ありがとうございます。
0902デフォルトの名無しさん2005/05/11(水) 11:00:47
>>877
つ union{}
0903デフォルトの名無しさん2005/05/11(水) 13:12:12
こんな使い方ってまずいですかね
一応動いちゃいますが。

void hoge()
{
     int* a;
     ArrayInt( a );

     if( a )
     {
         delete[] a;
         a = NULL;
     }
}

void ArrayInt( int* a )
{
     a = new int[5];
     for( int i = 0; i < 5; i++)
          a[i] = i;
}
0904デフォルトの名無しさん2005/05/11(水) 13:14:43
>>903
まずくない。
0905デフォルトの名無しさん2005/05/11(水) 13:15:57
>>903
特に問題は無いが、new 失敗時に NULL を返すのではなくて例外を投げる
コンパイラもあるぞ。
0906デフォルトの名無しさん2005/05/11(水) 13:16:37
>>903
ローカライズはソースなら問題ないでしょ。
複数人で組むプロジェクトとかだと、人にも判る様に書かなくちゃだけど。
0907デフォルトの名無しさん2005/05/11(水) 13:23:06
>>904-906
即レス有難うございます。

失敗時の処理が頭からすっぱ抜けてました
ちょいと改変して、この方法で行ってみます。
0908デフォルトの名無しさん2005/05/11(水) 13:29:04
>>904-906
おいおい・・・
ArrayIntでaを書き換えても、呼び出し元のaは変化しないぞ。
0909デフォルトの名無しさん2005/05/11(水) 13:32:24
○| ̄|_
0910デフォルトの名無しさん2005/05/11(水) 13:33:19
>>905
むしろ例外投げるのが普通。
大抵のコンパイラは例外投げつつnull返すと思うが
0911デフォルトの名無しさん2005/05/11(水) 13:46:27
重大なミスをしていた
確認用にこんなんしてた

void hoge()
{
     int* a;
     ArrayInt( a )

     for( int i = 0; i < 5; i++ )
          printf( str, "%d\n", i )
                                   ↑

そりゃ動くわな・・・
0912デフォルトの名無しさん2005/05/11(水) 13:49:23
>>910
例外投げつつnull返すってなんだよ…
0913デフォルトの名無しさん2005/05/11(水) 13:56:10
いろいろ間違えてら
落ち着け俺
printf( "%d\n", i );
です

sprintf( str, "%d\n", i );
OutputDebugString( str );
と使っていたもので。と、言い訳してみる。
0914デフォルトの名無しさん2005/05/11(水) 13:58:07
例外を返さないnewはstd::nothrowだけだろ
あと例外投げてnullを返すとか意味不明すぎ
0915デフォルトの名無しさん2005/05/11(水) 13:59:19
>>912
set_new_handlerで何もしないハンドラを設定したときはnullを返すってことじゃね?
09169032005/05/11(水) 14:08:45
件に関しては忘れて下さいな
色々失敗しまくった。

他の方法を探ってみます。
0917デフォルトの名無しさん2005/05/11(水) 16:15:25
静的変数のメモリ解放タイミングを教えてください。
0918デフォルトの名無しさん2005/05/11(水) 16:19:08
>>917
性的変数?やらしー
0919デフォルトの名無しさん2005/05/11(水) 16:21:01
>>917
変数が必要無くなった時
0920デフォルトの名無しさん2005/05/11(水) 16:39:11
>>917
実行終了時
0921デフォルトの名無しさん2005/05/11(水) 18:34:20
最近回答者のレベルが落ちてるな('A`)
0922デフォルトの名無しさん2005/05/11(水) 18:56:37
>>921
そういう時はこれを書くんです。


急速にスレの質が低下してまいりました
0923デフォルトの名無しさん2005/05/11(水) 19:35:28
>>921
質問のレベルが低いから、レベルの低い人でも答えられるから、だから
0924デフォルトの名無しさん2005/05/11(水) 19:40:13
........
0925デフォルトの名無しさん2005/05/11(水) 23:12:05
VC++.net でATL サービスアプリから
Shell_NotifyIcon() でタスクトレイにアイコンを
登録する時、Windows2003 のコンソール上では
サービス開始後に正常に表示されるのですが、
ターミナルサービスの管理者モードでリモート
接続した画面で実行するとShell_NotifyIcon()で
失敗してしまいます。
理由が分かる人は教えてください。
ちなみに 失敗(FALSE)直後のGetlastError() は
「2」を返します。タイムアウトでは無いようです。
0926デフォルトの名無しさん2005/05/11(水) 23:36:15
36才のおっちゃんが、何らかのソフトを作りたいためC#を
独学で勉強してるんだけど、分らない所があるので
教えてください。
何回目で100を超えたかを出力したいんですが、
どうすればよいでしょうか?
おねがいします。


{
int i = 0 ;
int sum = 0 ;
while(sum<100) {
sum=sum+i ;
i=i+1 ;
}

}
0927デフォルトの名無しさん2005/05/11(水) 23:39:07
>>926
メンタマひんむいてスレタイを良く見てください。
0928デフォルトの名無しさん2005/05/11(水) 23:45:23
count=0;
while( sum < 100 )
{
count++;
// sumの計算式
}
0929デフォルトの名無しさん2005/05/12(木) 00:41:50
>>915 どこからそんなデマを仕入れてくるんだ?
0930デフォルトの名無しさん2005/05/12(木) 00:53:42
>>926
物事を始めるのに年齢は関係ないよ。
おっさんや年寄りの話を聞いてるといちいち「50の手習いで」とか前振り付けるヤツが多い。
そんなにうまくいかなかったときの免罪符が欲しいのかと・・・。

おっと本題からずれた。
単に1+2+3+4+・・・で合計が百超えたときに何回足したか知りたいんだろうけど
{
int i = 0 ;
int sum = 0 ;
while(sum<100) {
i=i+1 ;
sum=sum+i ;
}
i=0から足しても意味無いからi=i+1を先に持ってきたけど、
これならwhileのループから抜けたときに
最後に足した数=足した回数が入るからiが目的の値そのものになる。

まぁ、プログラムの考え方としては>928のようにカウンタ用意するのが正解なんだが。
09319262005/05/12(木) 00:54:32
>>927
丁寧にありがとう。
言語がまったく分らずC++はシャープの意味と思ってました。
以後気をつけます。

>>928
ありがとう。
書いてくれた式を見ながらでも、書けるまで一時間も掛かって出来ました。
一応書いた式です。
int i = 0 ;
int sum = 0 ;
int count=0;
while(sum<100) {

i=i+1 ;
sum=sum+i;
count++;
}
Console.WriteLine(count);
  }

ホントに、ありがと!
0932デフォルトの名無しさん2005/05/12(木) 01:00:57
今まではPHPを使っていて、PHPでは変数の型は考えずに済んだのですが、
Cでは長いデータは配列として扱うしか無いんですか?
容量の小さいデータ型しか無いみたいなんですが。
PHPではarray[0]="abcde";array[1]="12345";と文字列を1次元配列に出来ましたが、
Cでは2次元配列を使うのでしょうか。
配列にすると関数に要素数を渡さないといけないらしいから非常に面倒な気がします。
0933デフォルトの名無しさん2005/05/12(木) 01:05:21
そこでC++ですよ
0934デフォルトの名無しさん2005/05/12(木) 01:11:03
>>932
文字列を手軽に扱いたいのなら、stringを使ってみたら?

と書こうとしたら、Cなのね。Cの文字列の話から説明するのはめどいです・・・。
0935デフォルトの名無しさん2005/05/12(木) 01:14:09
>Cでは長いデータは配列として扱う

文字列の最大長が255文字とか限られてるなら構造体って手がある
09369322005/05/12(木) 01:15:32
実はQDBMというデータベースライブラリが使いたいのでC++ではなくCを勉強中なのです。
って今調べてみたらC++でも使えるみたいな事が書いてあった・・・_no
という事なのでC++に乗り換えます。

それと>>932の最後一行は”配列”→”多次元配列”でした。
0937デフォルトの名無しさん2005/05/12(木) 01:18:43
>>932
C++ならPHPと同じように文字列(のクラス)の配列が使える。
Cなら、char型ポインタの配列になる。

char* str[10];
str[0]="abcde";
str[1]="12345";
って感じ。
リテラルじゃなくて文字列を代入するにはmallocとかしないとダメだけど。
09389262005/05/12(木) 01:22:43
>>930
そういう気持ちがあったかもしれないです。
やる気があれば年齢は関係ないですね。
以後気をつけます。ありがとう。

int i = 0 ; 
ここですが、iも結果が同じとの事ですので試してみました。
そこで一つ分らないことがあるんですが
int i = 0 ; とint i = 1 ;
iで表示だと i=0 と i=1 両方とも14と出るんですが
上記の書いたcount だと
i=0が14と出て、i=1だと13が出ます。

説明不足だったんですが、
1から何個目で100を超えるかだったので
1から14を足すと105となり、
14を出したいんですが、i=0だと
何か問題等あるんでしょうか?
0939デフォルトの名無しさん2005/05/12(木) 01:33:23
>>938
変数の中身を考えながらプログラムを1つずつ追ってみればいいんだよ。

>931のプログラムでi=0からはじめた場合、
i=1,sum=1,count=1
i=2,sum=1+2=3,count=2
...
i=14,sum=1+2+...+14=105,count=14でループから抜ける。

i=1からはじめた場合
i=2,sum=2,count=1
i=3,sum=2+3,count=2
...
i=14,sum=2+3+...+14=104,count=13でループから抜ける。

つまりwhileループに入る前にi=1だとループに入った瞬間i=i+1でi=2になるから思ったとおりの動作にならないだけ。
0940デフォルトの名無しさん2005/05/12(木) 01:38:05
結果の値を直接見るよりも、回数の数え方(プログラムでの)に
気を配ればよいです。

sum=0;
count=0;
while( sum < 100 )
{
count++;
// sum計算
}
この場合、sumが100以上(100含む)であれば、数えない。
つまり、sumが0〜99のとき、カウントが+1。

countもiも同じ役目なので、どちらか一つで十分です。
09419262005/05/12(木) 02:02:57
>>939>>940
詳しくありがと。
いろいろな考え方があるんですね。
939さんの一つ一つ入れていくのは手間ですが、
動作が一つ一つ分って勉強になり、式の変動がわかりますね。
940さんの方は、回数の考え方に気を配れば一つ一つ追っていかなくても
いいですね。
最初の内は、両方とも考えながらしていってみます。
09429322005/05/12(木) 02:06:40
レスありがとうございました。
0943デフォルトの名無しさん2005/05/12(木) 02:50:25
>>938
int i = 1;

count = ceil( sqrt( i*i - i + 200.25 ) - i + 0.5 )
0944デフォルトの名無しさん2005/05/12(木) 12:04:03
C++で

MyClass::Delete()
{
   delete this;
}

の動作は保障されていますか?
0945デフォルトの名無しさん2005/05/12(木) 12:19:14
>>944
・this は new によって生成されたオブジェクトを指している。
・delete this より後に this を使わない。
このふたつの前提条件が必要。

Delete() およびコンストラクタ、デストラクタを private にして、
これらの前提条件を満たすように実装すれば、保証を与えることは可能だと思われる。
そうでなければ、前提条件を崩すコードが簡単に書けるので、危険なコードだと言える。
0946デフォルトの名無しさん2005/05/12(木) 12:22:44
delete this;が実行されてから
Delete()関数を抜けるまでに、他タスクに移動しない事も必要じゃないか?
09479442005/05/12(木) 12:33:14
素早いご返答ありがとうございます。

>>945さんの前提条件を満たしてのことです。

delete thisしてメモリを解放したのに、その後Delete関数から抜ける(呼出し元に返る)
プログラムはどうなっているのでしょうか?
0948デフォルトの名無しさん2005/05/12(木) 12:36:40
プログラムは静的だからダイジョブじゃないの?
09499442005/05/12(木) 12:39:49
>>948
そうだったのですか。スッキリしました。
ありがとうございます。
0950デフォルトの名無しさん2005/05/12(木) 12:42:51
>>947
スタックとかヒープとか関数呼び出しの仕組みを
もっと勉強してください。
09519442005/05/12(木) 12:48:14
>>950
すみません・・・
0952デフォルトの名無しさん2005/05/12(木) 12:50:13
>>944
狂ったコードだと思ったけど
COMがこれだね。
hresult release(){
if(--ref == 0){delete this;}
}
newで生成された保障がないのにdeleteってのも変だな。
0953デフォルトの名無しさん2005/05/12(木) 12:59:28
>>947
メモリの解放っていうのは、
「もうここは使わないので、他のルーチンで使用しても良いですよ」
と、上位に伝えるだけで、メモリの値を初期化したりしないからそういう関数でも正常に動いて見えるだけです。

>>948
クラスを動的に定義したら、Delete()関数も動的になるっしょ?
0954デフォルトの名無しさん2005/05/12(木) 13:04:42
>>947
C++では、>>944の例は、下のCプログラムと同じ。

struct MyClass
{
};

void MyClassFinalize( MyClass *this )
{// deleteで呼ばれるデストラクタ
}

void MyClassDelete( MyClass *this )
{
  MyClassFinalize( this );
  free( this );
}

このMyClassDeleteが正常に動くのは納得できるよな?
0955デフォルトの名無しさん2005/05/12(木) 13:13:01
>953
>クラスを動的に定義したら、

( ゚д゚)ポカーン
09569442005/05/12(木) 13:19:50
>>953さんのようなものであれば、例えばメモリを解放してから呼び出し元に戻る間に、
他のスレッドが割込み、解放したメモリ領域を確保して書き込みした場合、
呼出し元に戻るプログラム(アセンブラでいうとret?)は保障されなくなる気がするのですが・・・。
09579442005/05/12(木) 13:30:57
クラスを動的に確保しても、プログラムは静的ですね。static関数と混同してしまいました。
>>944は前提条件さえあっていれば問題ないですね。
お騒がせしてすみませんでした。
0958デフォルトの名無しさん2005/05/12(木) 14:29:41
#include <stdio.h>

main()
{
int c/*, sp*/;

/*sp = 0;*/
while ((c = getchar()) != EOF) {
if (c == ' ') c = ' ';
putchar(c);
}

}
上記は二つ以上の空白をひとつの空白に置き換えながら、入力を出力に複写するプログラムのつもりです。
どうにも上手く動かないので、思い通りにいかないわけを教えてください。
宜しく御願いします。
09599582005/05/12(木) 14:30:47
コメントは無視してください。
前に書いたソースを流用したのですが、消し忘れてました。
0960デフォルトの名無しさん2005/05/12(木) 14:32:39
if (c == ' ') c = ' ';
が何やってるか理解してる?
0961デフォルトの名無しさん2005/05/12(木) 14:38:39
if (c == ' ') c = ' ';
は
if (c == '   ') c = '  ';
のつもりでした。こぴぺの際消えた模様です。
復帰改行などと同じように¥nなどのエスケープ文字列がスペースにも用意されてるのかと思ってたのですが、
調べてもみつかりませんでしたので、’’でスペースをくくってみました。
0962デフォルトの名無しさん2005/05/12(木) 14:44:01
' 'と" "の違いを説明してみろ
0963デフォルトの名無しさん2005/05/12(木) 14:45:47
ここでうだうだするより、文字と文字列について勉強しなおしたほうが近道だと思う。
0964デフォルトの名無しさん2005/05/12(木) 14:47:34
JPAG2000は、CImageのLoad()で読み込めますかね?
0965デフォルトの名無しさん2005/05/12(木) 15:06:31
>>964
JPAG2000ってのが何なのか知らんが試せ。
0966デフォルトの名無しさん2005/05/12(木) 15:21:29
>>958
cはint(実質char)だから1バイト文字1つしか入らない。
だから半角スペース2つと比較なんかできない。

出力する前の文字を覚えておいて、
「前(old)もスペース、今回(c)もスペースなら出力しない」って流れがいいかと。
(実際は「oldかcがスペースで無いなら出力する」になるけど)

int c;
int old=0;

while ((c = getchar()) != EOF) {
if (c != ' ' || old != ' ') {putchar(c);old=c;}
}
09679582005/05/12(木) 16:26:23
>966
よく理解できました。
ありがとうございました。
0968デフォルトの名無しさん2005/05/12(木) 23:23:46
自動変数って必ずスタックを使わなければならないのでしょうか。
スタックの無いメモリアーキテクチャのシステムでは、
C/C++は実現不可能なのでしょうか?
0969デフォルトの名無しさん2005/05/12(木) 23:39:57
>>968
んなこたーない
0970デフォルトの名無しさん2005/05/12(木) 23:44:40
>>968
> 自動変数って必ずスタックを使わなければならないのでしょうか。

スタックを使う環境が多いだけで、
必ずスタックを使わなければならない、と言う訳ではない。
0971デフォルトの名無しさん2005/05/13(金) 01:17:46
CGIプログラムをコンパイルしてからサーバに渡すのではなく、
サーバでコンパイルする事について書かれた記事をWEBで見かけたのですが、
もしかしてCやC++のプログラムは実行するプラットフォーム上でコンパイルしなければならないのですか?
別のプラットフォーム上で実行プラットフォームで走らせるプログラムをコンパイルする事は出来ない?
0972デフォルトの名無しさん2005/05/13(金) 01:20:16
>>971
できるけど、めんどい場合が多い
まずは、こっちで動いてあっちのコードをはくコンパイラを用意しないとね
まあクロス開発とかでググってみたら
0973デフォルトの名無しさん2005/05/13(金) 01:20:29
>>971
そういうことがしたい場合は「クロスコンパイラ」と呼ばれるものが必要になる。
09749712005/05/13(金) 01:40:48
レスありがとうございました。
0975デフォルトの名無しさん2005/05/13(金) 02:01:22
Linux環境でのC++のプログラムについてですが、頭の部分にインクルードするライブラリを明記しますよね。
もし複数のプログラムで同じライブラリがインクルードされていた場合、
それぞれのプログラムにそのライブラリのコードが付加されてしまうのでしょうか?
これを共有させるにはどうしたら良いんでしょうか。
0976デフォルトの名無しさん2005/05/13(金) 02:03:38
>>975
ヘッダファイルには実体ができるようなものは置かない(インラインは除く)
構造体とか関数のプロトタイプ宣言は実体ができないからね

つかライブラリってヘッダファイルのことだよね?
0977デフォルトの名無しさん2005/05/13(金) 02:13:36
>>975
ライブラリのリンク形態には、スタティックリンク、ダイナミックリンクがある。
スタティックリンクはライブラリのコードがそれぞれのプログラムに含まれる。
ダイナミックリンクはライブラリのコードを共有する。
0978デフォルトの名無しさん2005/05/13(金) 02:17:10
ライブラリがインクルード??
0979デフォルトの名無しさん2005/05/13(金) 02:48:23
>>975
・1つのソフトを構成する複数の.cが同じヘッダファイルをincludeする場合
・複数のソフトが同じライブラリを使う場合

前者と後者では、そもそも「共有」の概念からして異なる。

前者の場合、「そもそもヘッダファイルではグローバル変数の確保や
関数の実装をしない」という暗黙のルールで重複を回避する。

後者の場合、複数のソフトで共通利用するライブラリを
ダイナミックリンクライブラリにする事で重複を回避する。

お前が言ってるのがどっちなのか分からんと、何とも言えん。
0980デフォルトの名無しさん2005/05/13(金) 02:52:31
#define STR "%s"
sprintf( str, "Data " STR, temp);
文字列の連結って、これで合ってました?
0981デフォルトの名無しさん2005/05/13(金) 08:57:32
定数*定数 とか、定数同士の演算って、
コンパイル時に計算結果の値に置換されます?
0982デフォルトの名無しさん2005/05/13(金) 09:07:48
>>981
勿論。
0983デフォルトの名無しさん2005/05/13(金) 10:31:13
ずっと前こんなのみた
a = 34524.54 // = xxx * yyy * zzz(高速化のため先に計算)
アホかとバカかと
0984デフォルトの名無しさん2005/05/13(金) 10:34:58
コンパイルが高速化するかもよw
0985デフォルトの名無しさん2005/05/13(金) 11:23:47
とあるサイトにて
"constキーワードを付けたメンバは自動的にstatic(つまりクラスのメンバ)になってしまいます。"
と書いてた。
"クラスのメンバ"とあるけど、スコープ内(ソース内)のみ参照できるという意味
の方が正しいのでは?
0986デフォルトの名無しさん2005/05/13(金) 11:29:33
>"constキーワードを付けたメンバは自動的にstatic(つまりクラスのメンバ)になってしまいます。"
(´・∀・`)ヘー
0987デフォルトの名無しさん2005/05/13(金) 12:25:19
C言語で書かれたライブラリをC++で使用しています。
ライブラリの関数にint set_callback( int (*p_callback_func)(char* ) );
という感じのものがありこの関数にクラスのメンバ関数を渡すことはできるのでしょうか?
クラスのメンバ関数を静的(static)にはしたくありません。
ご存知の方がいましたらよろしくお願いします。
開発実況環境VC.net Standard Linux gccです。
0988デフォルトの名無しさん2005/05/13(金) 12:26:21
>>987
staticにするしかない
0989デフォルトの名無しさん2005/05/13(金) 12:27:25
staticにしてthisポインタ渡せ
0990デフォルトの名無しさん2005/05/13(金) 12:28:35
>>987
this をグローバルに保存してグローバル関数から
呼び出すか、C++ FAQ に書かれてるようにするかしかない
0991デフォルトの名無しさん2005/05/13(金) 12:32:13
>>985
世界の平和のため、そのサイトを晒すべき。
0992デフォルトの名無しさん2005/05/13(金) 12:34:16
tp://64.233.179.104/search?q=cache:gNIcf3_3n6EJ:www.atmarkit.co.jp/bbs/phpBB/viewtopic.php%3Fforum%3D7%26topic%3D19426+const+static&hl=ja&lr=lang_ja
0993デフォルトの名無しさん2005/05/13(金) 12:35:55
ネタに決まってんだろ
ここまで知障なこと書く香具師がいるわけないし
0994デフォルトの名無しさん2005/05/13(金) 12:38:56
「constキーワードを付けたメンバは自動的にstatic」
ググると一件ヒットするな
0995デフォルトの名無しさん2005/05/13(金) 12:40:39
しかしそこはC#のページみたいだし、違うのか
0996デフォルトの名無しさん2005/05/13(金) 12:41:24
>>987
> 開発実況環境

開発実況?
09979872005/05/13(金) 12:43:53
やはりstaticにするしかありませんか。
DirectXSDKのコールバックなんかもそうしてましたね。
ガチガチのC言語で作成されたライブラリをC++に埋め込むのはあまり相性よくないのかな。
Cで書けゆわれたらそれでもいいですが、個人的にC++のほうが好きなんですね
そろそろスレも終わりそうなので急ぎにて失礼ですがどうもありがとうございました。
0998デフォルトの名無しさん2005/05/13(金) 13:00:44
次スレは?
0999デフォルトの名無しさん2005/05/13(金) 13:13:41
朝鮮人
1000デフォルトの名無しさん2005/05/13(金) 13:27:26
千昌男
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。