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

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

■ このスレッドは過去ログ倉庫に格納されています
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
そうだったんですか!
ありがとうございます。
■ このスレッドは過去ログ倉庫に格納されています