07/12/27 20:36:19
>>1
乙
3:デフォルトの名無しさん
07/12/27 20:37:35
ソースコードを載せる人はちゃんとインデントをつけましょう。
半角スペース、タブ文字は2chでは使えません。
全角スペースを使ってもいいですが、 と入力すると半角スペースとして表示されます。
全角スペースではそのままコピペして使うことができないので、
ここにソースを貼るときはできる限りエディタでタブ文字等を に置換しましょう。
4:デフォルトの名無しさん
07/12/27 20:45:18
本当か?
5:デフォルトの名無しさん
07/12/27 20:48:16
うん
本当
6:デフォルトの名無しさん
07/12/27 20:52:14
やべえ、うちの2chブラウザだと、
& nbsp;って文字まで半角スペースに変換しやがる
何この無駄な機能w ふざけんなww
7:デフォルトの名無しさん
07/12/27 20:53:43
>>3の が見えないってことか?
ハイ機能だな
8:デフォルトの名無しさん
07/12/28 01:23:02
ポップうpで見れば問題解決なのだが
9:デフォルトの名無しさん
07/12/28 02:18:52
/**/
10:デフォルトの名無しさん
07/12/28 03:48:46
test
11:デフォルトの名無しさん
07/12/28 07:48:44
12:デフォルトの名無しさん
07/12/28 15:00:45
失礼します。
当方VC++2005ExpressEditionを使用しています。
作成したプログラムをビルドをしたら
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__dispose_library が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__close_reader_writer が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__read_block_without_encryption が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__write_block_without_encryption が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__polling_and_get_card_information が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__open_reader_writer_auto が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__initialize_library が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__get_last_error_types が関数 "void __cdecl error_routine(void)" (?error_routine@@YAXXZ) で参照されました。
1>C:\Documents and Settings\mouna\My Documents\Visual Studio 2005\Projects\testtest\Debug\testtest.exe : fatal error LNK1120: 外部参照 8 が未解決です。
1>ビルドログは "file://c:\Documents and Settings\mouna\My Documents\Visual Studio 2005\Projects\testtest\testtest\Debug\BuildLog.htm" に保存されました。
1>testtest - エラー 9、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
というメッセージが出てしまいました。
これらはどのように対処すればいいのでしょうか。
13:デフォルトの名無しさん
07/12/28 15:18:46
>>12です。
Cとしてコンパイルをしないといけないのかと思い
extern "C" {
を加えてみたのですがやっぱりかわりませんでした。
14:デフォルトの名無しさん
07/12/28 15:23:32
必要なライブラリをリンクしてないからでしょ
15:デフォルトの名無しさん
07/12/28 18:27:16
アーケードのをクリアしたなあ。
8面で穴に落とす係りの奴が出てきて一発殴ると終わるよね。
レバーを入れるのと同時にパンチを連打すると当たりやすいんで
やたら忙しくココココココンってレバーをやりながらボタン連打してた。
ジャブが二発入ったらストレート、あとはその繰り返しで
適当に上下に振って動かしながらやれば何とかなるよね。
16:デフォルトの名無しさん
07/12/28 18:27:47
誤爆
17:デフォルトの名無しさん
07/12/28 20:03:19
>>14
おっしゃるとおりでした。
2日間もバカみたく考えてましたw
無事解決しました。
ありがとうございました!
18:デフォルトの名無しさん
07/12/29 13:39:40
ファイル読み込みについて質問です、
ファイルの何バイト目から読み込むというのはできるっぽいんですが、
ファイルのX行目から読み込みたい場合、
getlineをX回実行という方法で行うんでしょうか?
19:デフォルトの名無しさん
07/12/29 13:43:19
>>18
それで不都合がなければそれでいいんじゃね?
20:デフォルトの名無しさん
07/12/29 13:43:24
Yes
ランダムで何行目って読む場合は各行の場所を保存しておくと便利
21:デフォルトの名無しさん
07/12/29 14:05:53
>>19-20
別に不都合はないんですが、直接飛べる方法があるなら
そっちの方が早いかなと思いまして
ありがとうございました
22:デフォルトの名無しさん
07/12/29 14:35:59
専用フォーマットにしていいんなら
struct file_header {
unsigned int line_number;
};
struct line_header {
unsigned int offset_address;
};
file_header header;
line_header lines[header.line_number];
char line0[];
char line1[];
......
にすればすぐ読み出せるぞ。
23:デフォルトの名無しさん
07/12/29 15:51:17
質問です。
引数をリストにしたいのですが、
リストを作るところで、困っています。
int main(int argc, char *argv[]){
typedef struct tagListNode{
struct tagListNode *prev;
struct tagListNode *next;
char *argv;
}Listnode;
Listnode list[argc-1];
for(i=0;i<argc;i++){ <--ココ
list[i].argv = argv[i+1];
list[i].prev = NULL;
list[i].next = &list[i+1];
exit(0);
}
何か良い方法はないでしょうか?
24:デフォルトの名無しさん
07/12/29 15:55:03
リストのことをちゃんと書いた本でも読め。
そうでもなければおとなしく std::list 使っとけ。
25:デフォルトの名無しさん
07/12/29 16:02:12
>>24
すいません。
c++では無いんです。
ああ、そうか!
ちょっと良い案思い浮かんだんで、試してきます。
26:デフォルトの名無しさん
07/12/29 16:12:36
とりあえず、双方向リストはリングリストにすると実装しやすいよ。
27:デフォルトの名無しさん
07/12/29 16:13:35
良く見たら確かに C99 だな。
まあ、exit(0); じゃなくて return 0; でいいと思うが。
どっちも同じと言えば同じだが。
28:デフォルトの名無しさん
07/12/29 16:57:16
int n = 2007;
if ( n == false) {
// nが偽だったら実行
exit(-1);
}
の内側が実行されてしまいます。
どうすれば治りますか?
29:デフォルトの名無しさん
07/12/29 17:01:42
直るも何も、int と bool を比較している時点で何かおかしい。
30:デフォルトの名無しさん
07/12/29 17:11:26
できたー!
んですが、どこかで失敗しているらしく、終了しません。
1000 ガンダムみたいに、数字と文字のペアを管理するリストを作って、
引数に./a.out 1000 ガンダム 2000 ウルトラマン 3000 仮面ライダー
を取るとして、引数が
./a.out 1000 ガンダム なら動くんですが、
./a.out 1000 ガンダム 2000 ウルトラマン
になると、処理が戻ってこなくなります。
うまく2個目のリストが出来ていないみたいなんですが、どこが間違っているでしょうか?
typedef struct tagListNode{
struct tagListNode *prev;
struct tagListNode *next;
char *data;
char *argv;
}ListNode;
31:デフォルトの名無しさん
07/12/29 17:12:11
int i;
ListNode *first, *last, *new;
first = last = NULL;
do{
i = 1;
new = (ListNode*)malloc(sizeof(ListNode));
new->data = argv[i];
new->argv = argv[i+1];
new->next = NULL;
i = i+2;
if(NULL != last){
last->next = new;
new->prev = last;
last = new;
}
else{
first = last = new;
new->prev = NULL;
}
}while (i < argc);
32:デフォルトの名無しさん
07/12/29 17:13:30
>>28
確かに、>>29 は正しいが、C,C++ではよくあること。
その if より前に n に false が代入された。
あるいは、その処理系では、false が、 2007 とされている。
あるいは、どこかその処理より前で、
#undef false
#define false 2007
を書かれている。
33:デフォルトの名無しさん
07/12/29 17:19:09
C/C++ でも if(!n) とすればいい話だな。
もし n が真偽を表現しているのであれば。
34:25
07/12/29 17:31:15
すいません。
解決しました。
do{
i = 1;
new = (ListNode*)malloc(sizeof(ListNode));
new->data = argv[i];
new->argv = argv[i+1];
new->next = NULL;
i = i+2;
を
i=1;
do{
new = (ListNode*)malloc(sizeof(ListNode));
new->data = argv[i];
new->argv = argv[i+1];
new->next = NULL;
にしたら動きました。
感動!
35:デフォルトの名無しさん
07/12/29 17:35:01
new->argv じゃなくて new->prev じゃないの?
36:デフォルトの名無しさん
07/12/29 17:44:55
#include <stdio.h>
void test(void){
puts("test");
}
void hoge(int x){
if(x==0)return test();//←ここ
else puts("hoge");
}
int main(){
hoge(0);
return 0;
}
以上のコードがbccで通る(警告は出る)んですが、
これって規格上問題ないんですか?
37:デフォルトの名無しさん
07/12/29 17:47:45
2行に分ければいいじゃん
38:デフォルトの名無しさん
07/12/29 17:51:25
規格上は戻り値の型が void の場合は
return 文は引数を取ってはならない。
39:デフォルトの名無しさん
07/12/29 17:52:43
hoge()がvoidなのにreturnして怒られない?
つーかこの仕様だとreturn要らないような気がするのだが
40:デフォルトの名無しさん
07/12/29 17:56:42
test の型も void だから通すコンパイラもありはする。
でも、規格上は問題あり。
41:デフォルトの名無しさん
07/12/29 18:31:41
まあ、おとなしく { } つけろってこった。
42:デフォルトの名無しさん
07/12/29 18:40:15
戻り値型voidの関数でvoidをreturnするのは合法だと思ったが
43:デフォルトの名無しさん
07/12/29 18:58:17
普通は合法なら警告はでない。
44:デフォルトの名無しさん
07/12/29 18:59:00
んなこたーない。
45:デフォルトの名無しさん
07/12/29 20:46:11
>>40
C++でコンパイルすれば問題ない
46:デフォルトの名無しさん
07/12/29 22:26:28
すいません、コールバック関数って何ですか?
例えば、
typedef int (CALLBACK *OPEN)(char *);
typedef int (CALLBACK *CLOSE)(int);
ここで記述されているCALLBACKというものがそうらしいのですが、
さっぱりわかりません。
47:デフォルトの名無しさん
07/12/30 00:02:04
>>46
環境が何だか分からんが、そのCALLBACKは何処かで#defineされてるもので
コールバック関数とは直接的には関係ない。
48:デフォルトの名無しさん
07/12/30 00:16:49
>>46
CALLBACKはWindowsなら__stdcallの別名で通常は修飾なしの関数と同じ。
コープバック関数ってのはイベント通知や内部でユーザー定義の関数呼び出す場合に関数に渡すユーザー関数のポインタ。
49:デフォルトの名無しさん
07/12/30 00:19:00
どうみてもコールバック用の関数ポインタ
CALLBACKならWindows環境だと__stdcall
実はWindowsのエントリポイントであるWinMainにつけるWINAPIも、__stdcallだったりする
__stdcallは呼ばれた側がスタックの解放をするって動作を指定する
だからコールバックできるんですね
コールバックはどっかから呼び出してもらう関数のこと
折り返し電話してもらうことをコールバックっていうよね
あれと同じで、自分から明示的に呼び出さない
自分、っていっているのは、右手が恋人のおまいじゃなくて、コールバック関数が定義された側の処理
50:デフォルトの名無しさん
07/12/30 00:26:11
>>49
コールバックできるかどうかに__stdcallは関係ないよ。
51:デフォルトの名無しさん
07/12/30 00:31:57
>>50
そりゃ「できるかどうか」に限定すれば関係ないけどね
52:25
07/12/30 08:28:19
すいません。
どうしても解けない問題なので、お教えください。
1000 ガンダム 2000 ウルトラマン 3000 ウルトラマン 4000 仮面ライダー
のような数字と文字列をメンバに持つ構造体で、
もし、文字列が同じだった場合、リストを繋ぎ変えてこの場合
1000 ガンダム 3000 ウルトラマン 4000 仮面ライダー
と言う風にしたいんです。
どこを直せば良いでしょうか?
typedef struct tagListNode{
struct tagListNode *prev;
struct tagListNode *next;
char *data;
char *argv;
}ListNode;
ListNode *first, *last, *point;
/*first(1000 ガンダム)->(2000 ウルトラマン)-> (3000 ウルトラマン)-> last(4000 仮面ライダー)というリストが出来た。*/
53:25
07/12/30 08:29:07
point = first->next;
for(this = first;this != NULL;){
if(NULL == first->next)
break;
if(NULL == point->next)
break;
if(0 == strcmp(this->argv,point->argv)){
if(NULL != point->prev)
point->prev->next = point->next;
else
first = point->next;
if(NULL != point->next)
point->next->prev = point->prev;
free(point);
continue;/*文字列がかぶっているリストが除外されたので(1000 ガンダム)から調べ直し*/
}else point = point->next;/*文字列がかぶっていないので次のリストの文字列と比較*/
}
54:デフォルトの名無しさん
07/12/30 08:56:17
>どこを直せば良いでしょうか?
データ構造の設計を0から。
55:25
07/12/30 09:07:15
え、リストじゃ駄目ってことですか?
じゃあ、何が良いんですか?
配列?
56:デフォルトの名無しさん
07/12/30 09:13:17
学校の課題とかならともかくリスト構造使う意味がわからない
57:25
07/12/30 09:23:39
えっと、引数の個数がいくつ有るか分からないからです。
58:デフォルトの名無しさん
07/12/30 09:27:23
引数・・・まあいいか
リスト構造わかってるのになんでわからないのかわからない、それ自体写しか?
データ構造って指摘されてるのは"1000 ガンダム"とかいれちまってるせいじゃないの
それにしたってまあ比較は出来るけど1000と"ガンダム"でわけようぜ
というかなんでその問題が解けないか全く理解出来ない
59:25
07/12/30 09:39:58
1000 とガンダムは分ける事は出来ないんです。
引数は1000 ガンダム 2000 ウルトラマンと分かれているんですが、
プログラムの中ではペアで管理しないとまずいんです。
リニアサーチを参考にしたんですが、どうしても、
リストの繋ぎ替えがうまく行かないんです。
malloc: *** Deallocation of a pointer not malloced: 0x300260;
This could be a double free(), or free() called with the middle of an allocated block;
Try setting environment variable MallocHelp to see tools to help debug
ってエラーが出るんです。
do{}while{}を使おうとしてたんですが、whileの条件がどうしても書けなくて...
60:デフォルトの名無しさん
07/12/30 09:43:29
ペア管理って、だから構造体にいれんじゃないの
つなぎかえなら図でも書いてみろ、やることは単純だ
whileの条件はわかりやすくしたきゃ末尾にnullでも明示的にいれとけ
61:デフォルトの名無しさん
07/12/30 09:44:38
要素の除外を効率的に行うには確かにリストは最適ではあるわな。
リストの組み替えをしたいなら、
リストの組み替え前と組み替え後の状態を紙に書いて、
どう変化させればいいかを考えてみるといい。
あと、リストを実装する場合、
リストの端っこは、NULL にするより、
端っこを表すダミーのノードを作った方が実装しやすい。
62:25
07/12/30 09:50:28
わかりました。
もちょっと努力してきます。
63:デフォルトの名無しさん
07/12/30 10:09:21
ていうか、そのためのlastなんじゃないの?>61
64:デフォルトの名無しさん
07/12/30 10:27:58
コマンドラインからだろうとファイルからだろうと、通常事前に件数は把握できるだろうから
その必要がない限りリスト構造を使う意味はないと思うが。
65:デフォルトの名無しさん
07/12/30 10:31:22
>>63
違う。
ダミーのノードは全ての有効なノードとは異なるノード。
有効なノードが0個の時でも存在してないといけないわけで。
66:25
07/12/30 16:14:57
うぇぇん。やればやるほど分け分かんなくなってきた。
まず、今のやり方で進んでいった場合、
1000 ガンダム 2000 ガンダム3000 ウルトラマンのように、
しょっぱなに消したい文字列がある場合はともかく、
1000 ガンダム 2000 仮面ライダー 3000 仮面ライダー
のような場合、非常に大変なんじゃないかという気がしてきた。
typedef struct tagListNode{
struct tagListNode *next;
char *data;
char *argv;
}ListNode;
/*first(1000 ガンダム)->(2000 ガンダム)-> (3000 ウルトラマン)-> last(4000 仮面ライダー)というリストが出来た。*/
/*同じ文字を持つペアを(2000 ガンダム)を消したい*/
this = first;/*最初から調べる*/
do{
if(0 == strcmp(this->argv,this->next->argv)){/*今のノードと次のノードの文字列を比較*/
if(this->next->next == NULL)/*今のノードの次の次のノードが無かったら*/
this->next = NULL;
else
this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
free(this->next); /*(2000 ガンダム)を消す*/
this = first;/*(1000 ガンダム)と(3000 ウルトラマン)比較から始める*/
continue;
}
else
this = this->next; /*文字列のかぶりは無かったので次と比較*/
}while(this == NULL);
67:デフォルトの名無しさん
07/12/30 16:21:52
はじめまして。
現在ステレオのwaveファイルの波形データを左右のチャンネル別々に配列に保存したいと思っているのですが、
C++どころかプログラミング自体今まであまり触れてこなかったので、ファイルの読み込み方が全く分かりません。
waveファイルのフォーマットは16bitでStereoなので、ファイルは「aa aa bb bb cc cc dd dd」のように表現されています。
まずは左のチャンネルのデータから記述が始まって、左右左右…の順にデータが格納されてます。
上の例だとaa aaが最初の左の音データ、bb bbが最初の右のデータでcc ccが2番目の左、dd ddが2番目の右です。
しかもリトルエンディアン? とかいう形式らしく、10進で10000という数字の場合なら16進で2710と表現してくれればいいのに
10 27という風に上位と下位が入れ替わって記述されているんです。
だからそれもC++で数値として扱えるように上位下位を入れ替えながら読み込む必要があります。
しかもwaveファイルの波形データを読み込もうと思った場合、ヘッダの事もあるので
純粋に波形データだけ欲しい場合ヘッダはすっ飛ばして読みこまなきゃいけないんです。
要はバイナリファイルをデータのアドレス指定をして自分の好きな場所から好きな場所まで読み込む操作をしたいのですが…。
ヘッダのバイト数とかwaveの形式とかはなんとか理解は出来たので、読み込み方がわかれば多分大丈夫だと思います。
ファイル全体を一気に読み込むのは流石に調べて分かったんですが、場所指定しての読み込みがどうしても分からなかったので
質問させていただきました。どうかよろしくお願いします。
68:デフォルトの名無しさん
07/12/30 16:31:11
fseekで読みたい場所にシークするだけじゃん。
あとx86系CPUならエンディアン変換はしなくていい。
69:デフォルトの名無しさん
07/12/30 16:32:01
CPUもリトルエンディアンなら、単純に2バイトずつ読めばいい。
任意の位置からの読み込みは、C++のstream類ならseekg、
CのFILE*ならfseekといった具合に、位置を指定する方法があるのでそれを使う。
70:67
07/12/30 16:42:45
ありがとうございます。エンディアンは気にしなくて良いのですね。
あと、ファイルをシークするということは、一度ファイル全体を読み込み、
そこからシークしてデータを取り出すということですよね?
waveファイルって1つが結構大きいので、既に再生用にwaveをメモリに読み込んでいることもあり、
データをチャンネルごとに分けて読み込むうえに更に読み込み用にファイルを読み込むとなると
あとで全体のデータは破棄するにしても結構メモリ食うな~と思うのですが、
やはりそうしないと読み込むのは無理ですかね?
71:デフォルトの名無しさん
07/12/30 16:45:14
>66
}while(this == NULL);
これでいいのか?
strcmpの後のifだけど、これはたぶん、>65氏の言う「ダミーノード」の方法で消すことが可能。
「次」がある限り、「次の次」は、(ダミーかもしれないが)必ず存在する。
「次」がダミーなら、strcmpのifが真になることはないはず。
ところで、この書き方だったら比較は必ず次の要素と行われてるから、
ウルトラマンウルトラマン仮面ライダーだったらいいけど、
ウルトラマン仮面ライダーウルトラマンだったときに後ろのウルトラマンが
消えてくれない気がするんだけど、なんでこんなアルゴリズムにしようと思ったの?
普通に書いたら
・まずリストの先頭と、それ以外の要素を順に比較。かぶってたら片っ端から消去。
・次に、上の操作で出来たリストの二番目と、それ以降すべての要素と比較、かぶってたら以下略
・それをリストの最後から二番目まで繰り返す
にならない?
それともよく知らないけど>66の方が効率いいの?
あと、よけいなお節介だけど、変数名にthisとかnewとか使う癖があるなら、直した方が良い。
72:デフォルトの名無しさん
07/12/30 16:53:21
>>70
シークはこれから読み書きする位置を指定する行為。
この段階ではまだ読み込みは行っていないぞ。
73:67
07/12/30 17:00:59
>>72
そうなんですか! よく調べもせずに申し訳ありませんでした。
折角のC++なので? seekgを使ってみたいと思います。
お答えして頂いてどうもありがとうございました!
74:デフォルトの名無しさん
07/12/30 17:13:14
>>66
>if(this->next->next == NULL)/*今のノードの次の次のノードが無かったら*/
> this->next = NULL;
>else
> this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
>free(this->next); /*(2000 ガンダム)を消す*/
何をfreeしているか考えよ
75:25
07/12/30 17:23:42
>>71,74
すいません。
有り難うございます。
ちょっと色気出してみようと思って、練習もかねてList使ってみたのが間違いだったのか?
今までList自体触った事無いから、難しい。
まぁ、趣味でプログラムやっているから気長にやります。
free(this->next); /*(2000 ガンダム)を消す*/
this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
が正しいですね。
76:デフォルトの名無しさん
07/12/30 17:25:26
今日からC言語の勉強を始めた超初心者なんですが、質問させてください。
MS-DOSでディレクトリの移動をやってたんですが、
cd \での移動と、(指定されたパスが見つかりませんと出る)
dir \での移動が出来ません(ファイルが見つかりませんと出る)
まさか入門書の本編にすら行かないうちに詰まるとは思いませんでした。
どなたか助けてください…。
、
77:デフォルトの名無しさん
07/12/30 17:28:14
それC言語関係ない。
dirは移動するコマンドじゃない。
78:デフォルトの名無しさん
07/12/30 17:29:54
>free(this->next); /*(2000 ガンダム)を消す*/
>this->next = this->next->next;/*次の次のノードにくっつける(2000 ガンダム)を飛ばす*/
freeした物のnextわ参照してどうする
tmp = this->next;
this->next = tmp->next;
free(tmp);
79:25
07/12/30 17:36:45
>>78
そーですね。
なんか皆さんがアドバイスしてくれるから、
みwなwぎwっwてwきwたwww
なんかいい感じになってきたかも!
80:デフォルトの名無しさん
07/12/30 17:49:32
>>76
help コマンド名
81:25
07/12/30 18:19:59
>>71
>まずリストの先頭と、それ以外の要素を順に比較。かぶってたら片っ端から消去。
うう、駄目だ書けない。
配列だったらforで簡単に比較できるけど、
listだと最初と次とのノードと比較は簡単にできるけれど、最初と次の次や最初の次の次の次の比較が全然思いつかない。
do{
this = first; /*最初のノード*/
if(0 == strcmp(this->argv,this->next->argv)){/*最初と次のargvの比較*/
if(NULL != this->next->next){/*次の次がNULLで無かったら*/
tmp = this->next;
this->next = tmp->next;/*次の次のノードと繋ぐ*/
free(tmp);
}else{
free(this->next);/*次の次のが無かったら今比較しているノードをfree*/
}
continue;/*最初に戻る*/
}
}while(/*何が真の間whileし続けるのか書けない....*/
82:デフォルトの名無しさん
07/12/30 18:31:41
>81
ListNode cmp,search;
for(cmp = first;cmp != dummy;cmp = cmp->next){
for(search = first->next;search->next != dummy;search = search->next){
if(strcmp(cmp->argv,search->argv) == 0){
……
}
}
}
これでだめ?
83:デフォルトの名無しさん
07/12/30 18:39:41
ていうか、さ
リストに追加する段階で重複チェックすればいいじゃん
わざわざリスト全部作ってから除去しなくても。
84:デフォルトの名無しさん
07/12/30 18:52:00
create table list (
id integer not null,
name varchar(16) not null unique,
primary key (id)
);
insert into list (id, name) values (2000, "ガンダム");
85:25
07/12/30 19:37:40
>>82
とても良いと思います。自分は思いつきませんでした。
ListNode *cmp, *search;
for(cmp = first;cmp != NULL;cmp = cmp->next){
for(search = first->next;search->next != NULL;search = search->next){
if(strcmp(cmp->argv,search->argv) == 0){
tmp = search;
search->next = tmp->next->next;
free(tmp);
}else{
free(search);
}
continue;
}
}
}
どうしても分からないのは
リストの繋ぎ替えをしたとき、
search->next = tmp->next->next;
for(略;略;search = search->next){
の処理がかぶってしまうってことです。
正直continue;の使い方が分からないです。
もう駄目かもしれません。
なんか正直、何をやってもプログラムを書ける気がしなくなってきました....
こういう絶望感に包まれた場合、どうすればまたプログラムを書けるようになれますかね?
86:デフォルトの名無しさん
07/12/30 19:38:23
>>85
Basicに乗り換える
87:デフォルトの名無しさん
07/12/30 19:39:40
気分転換にプログラミング以外の事をする。
コンピュータから離れても良いかもしれない。
88:デフォルトの名無しさん
07/12/30 19:40:32
>>85
だから、リスト構造はあんたには早過ぎると言ってるでしょう。
89:デフォルトの名無しさん
07/12/30 19:49:45
>}else{
>free(search);
>}
>continue;
どうしてそうなるんだw
なぜにsearchをfreeしてしまう。
if(strcmp()!=0)なら、何もしなくていいんだよ。
あとcontinueいらない。そのcontinue何の意味もない。
continueは、ループの括弧内の、「それ以降」をすっ飛ばす意味。
括弧その次で終わってるから、全く意味がない。
>search->next = tmp->next->next;
>for(略;略;search = search->next){
>の処理がかぶってしまうってことです。
処理がかぶるならどっちか消せばいいじゃない。
それと、>82で間違えたけど、二つ目のforの初期条件は
search = cmp->next
だね。
90:デフォルトの名無しさん
07/12/30 21:19:47
次の次とか処理順で頭悩ませるぐらいなら再帰にしたらどう?
91:デフォルトの名無しさん
07/12/31 00:28:51
リストを試行錯誤で実現するにはまだ早いという感じだなあ。
何か本でも読んだ方がいいんじゃね。
92:デフォルトの名無しさん
07/12/31 03:02:30
C++でグラフィックをいじるにはどうすればいいんでしょうか。
93:デフォルトの名無しさん
07/12/31 03:04:40
唐突過ぎるとマルチうぜーとか書かれるぞ
まずなにがしたいのかを書かないとエスパーしか答えられないぞ
ゲームを作りたいならDirectXとか
94:デフォルトの名無しさん
07/12/31 03:05:29
一人で作るレベルならC++よりCがいいと思うな、ゲームなら
95:デフォルトの名無しさん
07/12/31 03:10:51
ここであえてJavaAppletを勧めてみる!
96:デフォルトの名無しさん
07/12/31 03:29:10
STDのlistやvectorの全要素を表示させる関数を書きたいのですが、
どうかけばよいのか分かりません。どうかお教えください。
97:デフォルトの名無しさん
07/12/31 03:33:53
size()までループさせてひとつひとつ出力
98:デフォルトの名無しさん
07/12/31 03:34:09
96です。
自分はこんなものを書いてしまったのですが、コンパイルが通りません。
template<class T>
void show(T& v)
{
T::iterator p;
for (p = v.begin(); p != v.end(); p++) {
cout << *p << " ";
}
cout << endl;
}
99:デフォルトの名無しさん
07/12/31 03:49:14
>>93
DirectXとかでなく
C++で同人ゲームとかを改造して暇つぶししたいんですけど。
誰かマジレスお願いします。
100:デフォルトの名無しさん
07/12/31 03:52:32
>>97
こんな時間にありがとうございます!
それは書けたのですが、もうちょっと一般的な書き方があればな、、と思って。
void show(deque<char>& x)
{
for (deque<char>::iterator p = x.begin(); p != x.end(); p++) {
cout << *p << " ";
}
cout << endl;
}
こんなのよりも、dequeも<char>も勝手に入力から判断してくれる書き方はないですか?
101:デフォルトの名無しさん
07/12/31 03:58:53
>>99
今程度の知識で暇つぶしできるほどの改造は無理だ。
どのゲームなのか?そのゲームがC++で書かれているのかすらわからないじゃないか。
っつうかマルチでしょ?
宿題スレで標準関数にグラフィックをいじるような関数は提供されていないっていったじゃんか。
102:デフォルトの名無しさん
07/12/31 03:59:33
>>98
typename T::iteratorじゃない?
ってかエラーが出たらエラーメッセージを張るべし。
103:デフォルトの名無しさん
07/12/31 04:10:07
>>102
ありがとうございます。
typenameをつけたら希望どおりの動作になりましたが、その後、
エラーメッセージを張ったら、実はそこに書いてありました。
$ g++ samp20.cpp
samp20.cpp: In function 'void show(T&)':
samp20.cpp:9: error: expected `;' before 'p'
samp20.cpp:10: error: 'p' was not declared in this scope
samp20.cpp: In function 'void show(T&) [with T = std::list<int, std::allocator<int> >]':
samp20.cpp:23: instantiated from here
samp20.cpp:9: error: dependent-name 'T::iterator' is parsed as a non-type, but instantiation yields a type
samp20.cpp:9: note: say 'typename T::iterator' if a type is meant
104:デフォルトの名無しさん
07/12/31 04:16:18
日本語が変だぞwとりあえず解決でOK?
あと、細かいことだけどこういう処理ならconstつけといた方がいい。
template<class T>
void show(const T& v)
{
for (typename T::const_iterator p p = v.begin(); p != v.end(); p++) {
cout << *p << " ";
}
cout << endl;
}
105:デフォルトの名無しさん
07/12/31 04:26:50
>>104
解決です。
すいません、あと1つだけ。
constつけた方がいい理由は、show()関数が表示するだけで
内部要素を変更しないことをハッキリ示すためですか?
106:デフォルトの名無しさん
07/12/31 04:36:05
htmlファイルからリンクのURLだけを抜き出してその文字列を変数に入れたいん
ですがどのようにすればいいでしょうか?
getlineで一行つづ読み込んで"<a href="http:"を探せばいいかな。と思ってたんですが
メモ帳でスレのhtmlファイル開いてみるとURLの途中で改行があったんで悩んでます
107:デフォルトの名無しさん
07/12/31 04:37:38
いちどによみこんで整形する 改行や空白をなくす
108:デフォルトの名無しさん
07/12/31 05:52:34
gccで変数名を表示できる拡張機能ってどう書くんだっけ?
109:デフォルトの名無しさん
07/12/31 08:21:41
>>105
const参照でコンテナを受け取った関数から使えなくなってもいいならつけなくていいよ。
110:デフォルトの名無しさん
07/12/31 09:06:53
後置演算子++のオーバーロードについて質問です。
Type operator ++(int)とありますが、
クラスTypeで宣言した演算対象が、float型とかの場合でも
仮引数は(int)なのでしょうか?
(float)にはならないでしょうか?
どの解説本みても(int)で、詳しい説明がなくてよくわかりません。
111:デフォルトの名無しさん
07/12/31 09:13:20
まあfloatをインクリメントって普通しないからね。
オーバーロードしたいならもちろんfloat型を引数に。
112:デフォルトの名無しさん
07/12/31 09:20:36
わざわざそんなんせず1足してやる方が無難な気がするけどねぇ
113:デフォルトの名無しさん
07/12/31 10:18:50
T& operator++(void)じゃなくて?
114:デフォルトの名無しさん
07/12/31 11:01:19
>>113
それは前置
115:25
07/12/31 11:07:00
(;つД`); うわーん
ふて寝して、それでも気になって、紙にリスト書きながら、いろいろやってたら、
うまく行ったポイ!
変なのところが有ったら指摘してください。
それとdummyリストは便利!
ListNode *cmp, *search, *tmp;
for(cmp = first;dummy != cmp ;cmp = cmp->next){
for(search = cmp->next;dummy != search ;search = search->next){
if(dummy == search)
break;
if(0 == strcmp(cmp->argv,search->argv)){
tmp = search;
tmp->next->prev = tmp->prev;
tmp->prev->next = search->next;
}
}
}
頑張ってよかった!
感動した!
いい気持ちで正月を迎えられます。
116:デフォルトの名無しさん
07/12/31 11:25:11
それにしても混同しそうになる
117:デフォルトの名無しさん
07/12/31 15:45:29
サーバソケットでTCPの10~100バイトの可変長データを受信する際、
そのデータのレングスが先頭2バイトにある識別子で判断できる場合って
・まず先頭2バイトをrecvする。
・識別子を判断して残りのバイト数をrecvする
というのが一般的なのでしょうか?
recvの第3引数に1500バイトくらいの十分余裕な値を指定すると
勝手に1データの終わりを検出してリターンしてくれるものなのでしょうか?
要は連続してデータが飛んでくる場合に
1データの区切りをrecv1回で済むのか、2回に分けないといけないのかが
知りたいです。
118:デフォルトの名無しさん
07/12/31 15:54:11
>>117
こっちのがいいと思う
ネットワークプログラミング相談室 Port20
スレリンク(tech板)
119:デフォルトの名無しさん
07/12/31 15:58:50
>>118
サンクスです。逝って来ます。
120:デフォルトの名無しさん
07/12/31 16:49:41
char bun[] ="すごく長い文章が入っている";
FILE 構造体へのポインタしか受け取ってくれない関数に,
この文字列があたかもファイルに入っているかのように
思わせて処理させることはできないものでしょうか?
C++ ならいつも std::string と std::istringstream で
ストリームとして抽象的に処理しているのですが,
どうしても C のライブラリを使う必要があって,
勝手が違って悩んでいます.
121:120
07/12/31 16:57:40
標準的な方法ではできないようですね.
使いたいライブラリのソースが手に入って,
手を突っ込んでいいとのことなので素直にそうします.
いやぁ,ストリームなんて変な演算子オーバーロードで
やだなぁ,とか思っていたのにいつの間にかストリーム
べったりの人間になってました.慣れって怖い.
122:デフォルトの名無しさん
07/12/31 17:04:49
>>120
テンポラリファイル作るとか?
ファイルマッピング使って、バッファーの不一致が起きないようにファイルをクローズしてフラッシュするまでタイミングを取るとか?
123:デフォルトの名無しさん
07/12/31 17:22:09
質問です、VC2005で、多重継承のクラスを作ってるのですが
ランタイムエラーが出てしまいました。
(0xC0000005: 場所0x00000010を読み込み中にアクセス違反が発生しました)
デバッガの自動変数の欄にはthisポインタのみ載っていて(値は0とかではなく、
ちゃんとしたアドレスっぽい)、thisポインタの「+」をクリックして展開すると
「CXX0030: エラーです: 式を評価できません」
となっています。
hoge0---hoge1---hoge2---hoge3---hoge4
∟---hoge5
∟---hoge6---hoge7
∟---hoge8
↑のような感じで継承して(全てvirtualをつけて継承してます)、
最後に2,4,5,7,8を多重継承してhogerableクラスを定義して、
そのインスタンスを生成して使っています。
2や4578で実装されている仮想関数(f())をhogerableクラスでも実装し、
そのときの条件によって
return hoge5::f();
とかやろうとしたのですが、
hoge5::()f に飛んだときは正常に動くものが、hoge7::f() に飛ぶとランタイムエラーが
起こりました。
hoge7::f()の中は
if (!hoge2::f())
return false;
if (!p) // ここでエラー。pはhoge3にあるメンバ
return false;
となっています。
こういうときは何を疑えばいいのでしょうか?
よろしくお願いします。
124:デフォルトの名無しさん
07/12/31 17:25:53
hoge3のインスタンスがたくさんできてる予感
125:123
07/12/31 17:51:13
すみません、言われてから一番下のクラスを見直したら速攻で解決しました、
最後の多重継承にvirtualをつけてませんでした(汗
けどどういう条件でvirtualをつけるべきなのかよくわからない・・・
ともあれありがとうございました。
126:デフォルトの名無しさん
07/12/31 18:28:52
そもそもそこまでの多重継承になるなら設計がおかしいのでは。
127:デフォルトの名無しさん
07/12/31 18:52:38
>>126そだね。多重継承も使いすぎると良くないね。
俺も、多重継承やテンプレートを使いまくって複雑怪奇なオブジェクトを作っていた頃がありました。しかし、だんだんとこんな複雑な構造は不要だって解ってくるんだな。
C++をはじめて誰もが一度は通る道かな。
128:デフォルトの名無しさん
07/12/31 19:47:15
>>101
もうちょっと具体的に書くと、
if(Char_Trans[0]!=0){
SetDrawBlendMode( DX_BLENDMODE_ALPHA , Char_Trans[0] ) ;
if(LoadCharName_BC[0]!='\x00'){DrawGraph(Draw_X+160,Draw_Y,CHAR_BC_Handle,TRUE);}//キャラを立たせる。奥中央
}
このランダム部分を変える方法はありますかね?
年末に何やってるんだ俺はorz
129:デフォルトの名無しさん
07/12/31 19:54:40
>>128
生きろ
130:デフォルトの名無しさん
07/12/31 20:40:17
>>128
どの辺がランダムなのか教えてくれ。
131:デフォルトの名無しさん
07/12/31 20:44:54
>>128
エスパーするとDraw_XとDraw_Yを直接数字に置き換えるとか
132:デフォルトの名無しさん
07/12/31 20:46:00
#define Draw_X (rand()/800)
#define Draw_Y (rand()/600)
133:デフォルトの名無しさん
07/12/31 22:41:31
>>110
仮引数はどうあっても int 。
134:デフォルトの名無しさん
08/01/01 21:05:24
C++を勉強したいのですが
初心者向けで分かりやすい本があったら 教えて下さい。
Cはある程度は把握してます
何かお勧めの本はありますかね?
135:デフォルトの名無しさん
08/01/01 21:18:23
>>134
ロベールでいいんじゃね。
136:デフォルトの名無しさん
08/01/01 21:55:51
Accelerated C++とか。
137:デフォルトの名無しさん
08/01/01 23:08:21
やさしいC++
とかって 分かりやすいんですかね?
138:デフォルトの名無しさん
08/01/01 23:10:37
>>137
基礎過ぎて C と被る所が多過ぎる。
139:デフォルトの名無しさん
08/01/01 23:13:44
>>134
CとC++はかなり違う言語だから、なめてかからないほうがいいよ。
STLやらBoostやら、C++は変態すぎる。
140:デフォルトの名無しさん
08/01/01 23:16:00
かなり違う言語だけど、慣れれば簡単なもんだ。
いい本を選べよ。
141:デフォルトの名無しさん
08/01/01 23:40:20
分かりやすい本とかお勧めの本は
やっぱりそれぞれ違いますよね?
ロベールかぁ..
本屋でいろいろ立ち読みしてみて 読みやすい本を選ぶのがいいんですかね?
142:デフォルトの名無しさん
08/01/01 23:45:23
>>139
C++がCより使いやすい要素はあるんですかね。
143:デフォルトの名無しさん
08/01/01 23:48:51
「使いやすい」の定義によるんじゃない?
初心者に勉強させるって意味なら混乱する要素満載でとても使いやすいとは思えないけど
144:デフォルトの名無しさん
08/01/01 23:54:42
>>142
クラス。
iostreamなんかは窓から投げ捨てていい。
145:デフォルトの名無しさん
08/01/01 23:58:01
STL
146:デフォルトの名無しさん
08/01/02 00:00:19
>>142
C++は使いやすいというよりも、強力な言語だと思う。強力であるが故に使いこなすのが難しい面が多々ある。
例えば文字列クラスを作ると、最初から言語仕様に組み込まれていたかのように文字列を扱えるなんて、強力というか自由度高すぎ。
147:デフォルトの名無しさん
08/01/02 00:05:47
>>140
MPLとかも簡単と思う?
148:デフォルトの名無しさん
08/01/02 00:07:56
例外処理も地味に便利だよなあ
149:デフォルトの名無しさん
08/01/02 00:19:19
演算子オーバーロードとか例外とか最近の言語なら珍しくないって。
150:デフォルトの名無しさん
08/01/02 00:24:45
STL と参照があるだけで C より随分楽になるわ。
151:デフォルトの名無しさん
08/01/02 00:25:30
>>147
使わんし。
152:デフォルトの名無しさん
08/01/02 01:15:12
>>149
C++で成功したから、最近の言語で実装されるようになったんだろ。
153:デフォルトの名無しさん
08/01/02 01:30:02
例外はJavaが早くね?他にもあるかもしれんが・・・
154:デフォルトの名無しさん
08/01/02 03:30:17
>>151
MPLを使わないのにC++に慣れてるとか大きく出たね
それでC++が簡単と言うのは違うんじゃないかい?
あんたにとっては簡単かもしれんけど、一般論ではないわな
155:デフォルトの名無しさん
08/01/02 03:38:48
>>151
何私は最先端ですみたいになってんの?
あんなもんライブラリでも作る必要がなければ使わない。
使えない。可読性が低くなる。
156:デフォルトの名無しさん
08/01/02 03:50:28
ライブラリ作らないでプログラムしてるのはすごいな
MPLより"やばい"type_traitsがtr1に入ってるぞ
可読性が低い==俺は勉強してないので読めない
157:デフォルトの名無しさん
08/01/02 04:03:21
mplってboost?
158:デフォルトの名無しさん
08/01/02 09:45:53
水掛け論したいなら他でやれ。
159:デフォルトの名無しさん
08/01/02 11:51:00
スレリンク(tech板:659番)
このプログラムが先日まで実行できたのですが、
probably corrupted stack
segmentation fault
と出て実行不可になりました。こちらの環境が原因でしょうか?
160:デフォルトの名無しさん
08/01/02 12:19:23
プログラムがおかしい。
161:デフォルトの名無しさん
08/01/02 12:54:26
>>156
type_traitsのどこがやばいの?traitsの考え方は難しくないし
コンパイル時の型の判定は便利だからboost使っている。
今でもiterator_traitsやchar_traitsはある。
>可読性が低い==俺は勉強してないので読めない
就職したら正論が通用しない場合があることがわかるよ。
162:デフォルトの名無しさん
08/01/02 12:54:58
>>159
とりあえず、 ,とか?とか使うのやめて読みやすく書き直して味噌
163:デフォルトの名無しさん
08/01/02 12:57:50
>>159
負数または INT_MAX を超える値を入力してない?
164:159
08/01/02 13:05:17
実行時のコマンドが誤ってました。お騒がせしてサーセン
165:デフォルトの名無しさん
08/01/02 13:05:56
>>159
宿題丸投げした挙句デバッグも人任せ?お前の肩の上についている物体は飾りか
166:デフォルトの名無しさん
08/01/02 13:22:34
>>165
なんでそんなムキになるん?
167:デフォルトの名無しさん
08/01/02 13:23:46
ムキっていうかうざくなるのは当然
こんなんみりゃ誰だってうざくなるわ
168:デフォルトの名無しさん
08/01/02 13:24:12
>>165
肩の上って…
首を傾げてるってことかあぁぁ!!!!!!111
169:デフォルトの名無しさん
08/01/02 13:24:51
こういうのは真性だからねぇ、わざわざ言わずにスルーだな
170:デフォルトの名無しさん
08/01/02 13:24:52
まあ根っこからこういう奴っているんだよな、治らないよ、小さい時の教育の問題だろう
171:165
08/01/02 13:29:09
ゴメン言い過ぎた。
今度から気をつけるよ。
172:デフォルトの名無しさん
08/01/02 13:31:29
こういうのを見て毎回思うことは、
宿題スレと質問スレの住人、絶対かぶってるよな
173:デフォルトの名無しさん
08/01/02 13:45:12
うん
174:デフォルトの名無しさん
08/01/02 14:26:46
誰も>>159のプログラムが間違ってることは指摘してやらないんだなw
175:デフォルトの名無しさん
08/01/02 14:36:16
strcatのcatって何の略ですか?
176:デフォルトの名無しさん
08/01/02 14:38:05
>>175
URLリンク(ja.wikipedia.org)
177:デフォルトの名無しさん
08/01/02 14:41:47
GoogleでもYahooでもどこでもいいから、検索して最初の10ページくらいは見て欲しいな
そもそも検索したかどうか知らないけど
178:デフォルトの名無しさん
08/01/02 14:45:36
どうでもいいが、>>176のバッファオーバーラン対策コードはsを初期化しているかが曖昧だから不完全だ。strlen(s)がsizeof(s)を超える場合がある。
と思った。
179:デフォルトの名無しさん
08/01/02 17:07:02
初期化されてなかったら、それはバッファオーバーランとは別問題だろ
strcpyとかならまだしも、catは連結なんだから初期化前提
180:デフォルトの名無しさん
08/01/02 17:10:55
中途半端に"~.ex"とかになった場合に誤動作しそうで怖いな
また別の問題だけど
181:デフォルトの名無しさん
08/01/02 20:10:17
C++でなにか簡単に動くプログラムはないだろうか。
182:デフォルトの名無しさん
08/01/02 20:12:22
はろーわーるど
183:デフォルトの名無しさん
08/01/02 20:50:40
マージャン、囲碁、将棋、チェス、好きなのを選べ。
184:デフォルトの名無しさん
08/01/02 20:51:46
はっきり言ってboostより分かりやすいC++はないんだろうか。
185:デフォルトの名無しさん
08/01/02 21:45:24
boost分からなければ無理に使うことは無い
186:デフォルトの名無しさん
08/01/02 21:53:09
boostってそんなにわかり易かったかな?
lambdaとか。
187:デフォルトの名無しさん
08/01/02 21:57:51
lambda はともかく、半分以上は分かりやすいと思うが。
188:デフォルトの名無しさん
08/01/02 21:59:41
boost::spiritは必見
189:デフォルトの名無しさん
08/01/02 22:35:49
とりあえず使い方を覚えて便利さを享受すること
にしてる。中身は天才達が作ってるだろうから。
for_eachでのlambdaは秀逸だと思う。bindも
凄く使いやすい。
190:デフォルトの名無しさん
08/01/02 23:06:23
便利だけど特別分かりやすいとは思わなかったな
191:デフォルトの名無しさん
08/01/03 02:28:18
#include <fstream>
using namespace std;
int main()
{
ofstream fout("mydata.mid", ios::binary);
fout.write("4D 54 68 64 00 00 00 06 00 01 00 01 00 60 4D 54 72 6B 00 00 00 1C 00 90 3C 64 4B 80 3C 64 15 90 3E 64 4B 80 3E 64 15 90 40 64 4B 80 40 64 15 FF 2F 00", 74);
fout.close();
return 0;
}
fout.write の引数のバイナリ(SMF)をそのままファイルに出力したいのですが、
出力されたsample.midを再生しようとすると「プレーヤーがそのファイルの種類をサポートしていないか、そのファイルの圧縮に使用したコーデックをサポートしていない可能性があります。」
というエラーが出てしまいます。そのファイルをバイナリエディタで見てみると、34 44 20 ...
というように、バイナリが変わってしまっていました。何がいけないのでしょうか??
192:デフォルトの名無しさん
08/01/03 02:33:16
16進の文字列から数値に変換→書き込み
でおk
193:デフォルトの名無しさん
08/01/03 02:45:32
>>191
static const char data[] = {0x4D, 0x54, 0x68, /*中略*/, 0x00, };
fout.write( data, sizeof(data) );
194:デフォルトの名無しさん
08/01/03 02:58:56
これからは開発文字コード体系を
UTF-16ベースにしないと
プログラマーから嫌われそうだ
195:デフォルトの名無しさん
08/01/03 03:18:40
>>192
>>193
なるほど。こうすればよかったんですね。ありがとうございますm(_ _)m
・・なんか、いきなりあれですが。
今まで他の質問サイトでよく質問してたんですが、ここの方が返信早いし、
しかもここの人たちはポイントもらうためとかではなく無償で教えてくれるんですよね。。
なんかしんみり嬉しくなりました。また行き詰ったらご教授願いたいのでよろしくお願いしますm(_ _)m
196:デフォルトの名無しさん
08/01/03 07:12:59
URLリンク(www.google.co.jp)
197:デフォルトの名無しさん
08/01/03 14:59:39
>>193
なんで、staticなんですか?
198:デフォルトの名無しさん
08/01/03 15:04:30
>>197
よそから使う必要がなければ、見えなくするためじゃないか。
199:デフォルトの名無しさん
08/01/03 15:09:46
>>197
定数にするためじゃない?
200:デフォルトの名無しさん
08/01/03 15:16:31
>>198
いえ、なんてーか、グローバル変数でstaticなら、それも理解できるんですが……
これ、関数内の話ですよね?
>>199
それって、constじゃないんですか?
201:デフォルトの名無しさん
08/01/03 15:35:24
>>200
constだけだと関数内では「書き換え不能」って意味だけじゃないかな?
staticがついて定数になったと思うけど。
組み込みなんかだと値をROMに収めるためにはstatic constを指定してやらないと駄目だったような・・・
C++が使える組み込みなんて少ないかもしれないけど
202:デフォルトの名無しさん
08/01/03 15:36:40
んーとねstaticはスタック上に領域確保するのを防ぐ狙いがあったよーな
確保した領域に値をコピーする手間が省けるのでメモリと処理時間の節約になるっぽい
スコープが関数内に限られた外部変数って考えるといいっしょ
でもmain関数内の変数ってコンパイラにもよると思うけど実質staticじゃなかったっけ?
203:デフォルトの名無しさん
08/01/03 16:07:50
私の理解が間違っているかもしれませんが……一応確認
int main()
{
ofstream fout("mydata.mid", ios::binary);
const char data[] = {0x4D, 0x54, 0x68, /*中略*/, 0x00, };
fout.write( data, sizeof(data) );
fout.close();
otherFunction();
return 0;
}
みたいな形で書いたとしたら、当然、otherFunctionから、dataにアクセスすることは出来なくなるわけですから、外部から使う必要云々の話ってのは成立しませんよね。
なので、>>201さんの言う事(前半)が理由なら、staticはいらないのではないでしょうか?
>>201(後半)と>>202の理由については初めて知りました。
よろしければ、参考文献などを教えていただけないでしょうか?
お願いいたします。
204:デフォルトの名無しさん
08/01/03 16:23:42
>>203
書き換え不能の「変数」と「定数」の違いがある気がすると思って書いたんだけど。
そこまで詳しくないから間違ってるかも。
Googleで「c++ const 定数」あたりでぐぐれば?
205:193
08/01/03 16:27:08
組み込み屋なので、こういう場合static const にしちゃうんだよな。
>>201と>>202(最後の1行はよく知らないが)の言うとおりだよ。
非static 非const →書き換え可能でスタックに配置。関数に入るたびに、ROMからスタックへのコピーが発生する。
非static const →書き換え不能でスタックに配置。関数に入るたびに、ROMからスタックへのコピーが発生する。(処理系により異なるかも?)
static 非const→書き換え可能な静的領域に配置。プログラム開始時に一度だけ、ROMから静的領域へのコピーが発生する。
static const →書き換え不能でROMに配置。コピーは発生しない。
206:デフォルトの名無しさん
08/01/03 16:27:11
>>203
staticが外部からアクセスできないんは文法上の話
メモリ上に変数の領域が確保されてるんやからアドレス渡せばアクセスできるんよ
207:デフォルトの名無しさん
08/01/03 16:40:08
>>204-206
なるほど……色々と教えてくださってありがとうございます。
どうも、組み込み系の話が必要になってきそうですね。
そこら辺の文献でも読んでみます。ありがとうございました。
208:デフォルトの名無しさん
08/01/03 16:56:44
このスレには滅多に書き込まないけど、ずっと読んでる。
ホントためになる話が多いよな。各人の知識経験に感嘆するぜ。
209:デフォルトの名無しさん
08/01/03 17:24:02
初心者向けのCの本を一冊読み終わり、問題もだいたい解けるようになりました。
次に難し目の問題集を買って、それをクリアーしたらC++に移ろうと思います。
しかし、本を読んで理解して・・・の繰り返しでモチベーションが萎えて来ました。
僕は独学でパズル感覚でプログラミングの勉強をしているので
CあるいはC++を使ったら何が出来るのかということが、ちょっと想像がつきません。
そこで
■ この言語で何(どういうモノ)が作れて、
現実にはどういう場で役に立っているのかというのを教えていただきたいと思います。
よろしくお願いします。
210:デフォルトの名無しさん
08/01/03 17:35:47
C/C++は汎用性高すぎて組み込みからサーバ、GUIアプリケーションまで色々としか‥‥
とりあえず「こんなソフト欲しい」って思ったら自作してみるといいお
211:デフォルトの名無しさん
08/01/03 17:37:29
>>209
何ができるのかというと、何でもできるということになる。
目標がC/C++の勉強だけだと気力も萎えるだろう。そういう時は、何でも良いからアプリを作るのが一番。
212:デフォルトの名無しさん
08/01/03 17:41:50
ここで言ってる組み込みって
URLリンク(www.sophia-it.com)
ここに書かれているような意味でですか?
汎用性高いとのことですが家電製品とかのシステムもC/C++で書かれていたりするんですか?
213:デフォルトの名無しさん
08/01/03 17:43:39
釣りな感じもするけどまぁいいか。
実用的なプログラミング言語だと、言語によってできることできないことにはほとんど差がない。
どちらかというと環境の差だったり環境が用意されているかの違いの方が大きい。
なので、コンピュータ上でできることはほぼ何でもできる、と言ってよい。
でも、これだとあまりうれしくない返答だよな。
どれだけ低レベルな処理が可能かというのについては多少差があるけど、C / C++ はその方面では強い。
具体的には、オペレーティングシステム(Windows とかね)や、組み込み系(電子機器の制御、マイコン等)の
プログラミングに使われたりもする。
逆に言うと C / C++ そのままだと基礎的すぎて、ライブラリとか使わないと凝ったこと、派手なことはさせにくかったりする。
ということで、提案としては、
・OpenGL, DirectX とか使って、ゲームとか 3D CG 系で遊んでみる。
・(英語があまり苦にならなければ) URLリンク(online-judge.uva.es) で問題を解いてみる。
(ACM国際大学対抗プログラミングコンテストの問題集でオンラインで判定もしてくれる)
あたりかなぁ。あるいは宿題スレの回答者になってみてもいいかもしれないよ?
214:デフォルトの名無しさん
08/01/03 17:44:18
>>209
本を読んで理解することは非常に重要だが、実際に組んで動かしてみるのはもっと重要。
理解を深める意味でも、モチベーションの意味でもな。
あと、言語だけでなく、データ構造とアルゴリズムの勉強は欠かさないように。
パズル感覚なら楽しめるはず。実践の題材を見つけることもできると思う。
題材はGUIアプリで見た目にこだわるより、
CUIでいいから、内部動作にこだわると良い。
215:デフォルトの名無しさん
08/01/03 17:47:48
>>212
C++が使える環境ではC++で書きたいな。(あくまで希望)
216:デフォルトの名無しさん
08/01/03 17:48:10
言語を覚えたからどうこうというのがそもそもおかしい
何か目的があって言語を覚えたんじゃないのか
217:デフォルトの名無しさん
08/01/03 17:48:14
Gotwを見るとか
218:デフォルトの名無しさん
08/01/03 18:29:23
CSVファイルから各行を読み込んでベクターに入れ、それをさらに大きなベクターに
いれる処理は以下でよいですか?
なんか、strtok()を使うやり方があるとか、','を'\0'に置換したらいいとか言われましたが、
よく分からなかったので、以下のように書いてみました。
vector<string> vec;
vector< vector<string> > vec2;
ifstream ifs("ファイル名文字列");
string line;
while (ifs >> line) {
int s1 = 0;
int s2 = 0;
while (s2 < line.size()) {
s1 = s2;
while (line[s2] != ',' && s2 < line.size()) s2++;
vec.push_back( line.substr(s1, s2 - s1) );
s2++;
}
vec2.push_back(v);
vec.clear();
}
219:デフォルトの名無しさん
08/01/03 18:45:48
>>210
>>211
ありがとうございます。
アプリを作る方向で考えてみます!
>>213
ありがとうございます。
英語は、雰囲気でわかりますw
実践的な問題を解いてみるのは、楽しいと思います。
頑張ります。
>>214
ありがとうございます。
データ構造やアルゴリズムは、読んでて楽しいのでどんどん勉強したいと思います!
>>216
いや、暇つぶしです。
今、フリーター~無職なんで、何かやってるアピールを親にしないと・・・
哲学とか、医療問題とか、どうでもいいものをいろいろ勉強してました。
昔、ウェブサイト作ってFLASHのACTION SCRIPTやJAVA SCRIPTとかをいじるのが好きだったんで
全く違うけどパソコン関連ってことでCをやってみたら楽しかった・・・って感じです。
220:デフォルトの名無しさん
08/01/03 18:47:01
>>217
何やらヒゲのおじさんが微笑んでますが
参考になりそうなサイトですね。読んでみます。
ありがとうございます。
221:デフォルトの名無しさん
08/01/03 20:03:21
質問させてください。
当方、すでに出来上がっているプログラムに追加・改変して別のプログラムを作るという授業を受けている学生です。
VisualStudio2005、C++で開発しています。
ちなみに、授業を受けている割にはC++についての知識は皆無です。
今作っているのはノベルゲームのような物です。
文章を表示して、キーを入力すると次の文章を出力する、という動作を行いたいのですが、キーの入力を受け取ると、文章が一気に進んでしまいます。
これを防止する為にキーが入力されても一定時間無視するという処理を行いたいのです。
そこで皆様にお聞きしたいのですが、キーの入力(OnKeyDownで取得)を一定時間(例えば10ミリ秒)無視するためにはどのようにプログラミングすれば良いのでしょうか?
わかりにくいかと思いますが、どうかよろしくお願いします。
222:デフォルトの名無しさん
08/01/03 20:15:46
>>221
フラグ立てればいい
223:デフォルトの名無しさん
08/01/03 20:16:25
if( 一定時間 != true )
{
キー入力;
}
224:デフォルトの名無しさん
08/01/03 20:17:33
そもそも一気に進んでしまうのがおかしいのでは
225:デフォルトの名無しさん
08/01/03 20:19:32
何をクラスにしたらいいのかの指針をください
226:デフォルトの名無しさん
08/01/03 20:21:02
何をしたいのか書かないとエスパーじゃなきゃ無理w
227:デフォルトの名無しさん
08/01/03 20:38:21
>>225
類似オブジェクトの共通特性を抽出してクラスにすればいい
228:デフォルトの名無しさん
08/01/03 20:43:50
「押されているかどうか」ではなく、「押された瞬間」を検知すれば、そういうことは無くなる。
>222も参考に、その方向考えてみたらどうかな。
229:デフォルトの名無しさん
08/01/03 20:51:25
>ちなみに、授業を受けている割にはC++についての知識は皆無です。
ここに誰もつっこまないのは何故だ・・・
教えようがないじゃん
論述形式の宿題とか?
230:デフォルトの名無しさん
08/01/03 20:54:33
>>229
そういうもんじゃない?
情報学科卒の生徒にHelloWorldから、とまでは言わなくても、
それに類する所から始めないといけない現実。
231:デフォルトの名無しさん
08/01/03 21:57:16
すでに出来上がっているプログラムって吉里吉里みたいな仕様になっているのか?
なんかよくわからんけどソースうpしてくれなきゃわからん
232:デフォルトの名無しさん
08/01/03 21:59:30
今日はものすごく調子が悪くてとても
C言語について調べる気がしないんですが。
誰かレスお願いします。
233:デフォルトの名無しさん
08/01/03 22:01:06
>>232
お前はなんについて質問したんだよw
234:デフォルトの名無しさん
08/01/03 22:04:47
URLリンク(www.imgup.org)
235:デフォルトの名無しさん
08/01/03 22:12:54
>>233
何かを限られた時間で作るときの目標として
ゲームにこだわる必要はないんですかね。
236:デフォルトの名無しさん
08/01/03 22:19:07
>>235
どこから「ゲーム」が出てきたんだ?
エスパーで答えれば
好きにしろ、人に聞くな、目標を立てるところからが勉強だ。
237:デフォルトの名無しさん
08/01/03 22:20:24
人生相談スレではありません。
238:デフォルトの名無しさん
08/01/03 22:22:57
ゲームといえば、ライフゲームとスタートレックかな。
239:デフォルトの名無しさん
08/01/03 23:21:54
>>212
>家電製品とかのシステムもC/C++で書かれていたりするんですか?
Cがほとんどだと思う。
ある程度メモリとCPUパワーに余裕があれば、C++も選択肢になるだろうな。
240:デフォルトの名無しさん
08/01/03 23:36:44
組み込みはC++が多い
241:デフォルトの名無しさん
08/01/03 23:56:36
組み込みC++ってそんな贅沢させてくれるのか?
Cがほとんどじゃまいか?
242:デフォルトの名無しさん
08/01/04 00:02:54
今は組み込みも(全体的に)だいぶ性能上がってるんじゃないか
243:デフォルトの名無しさん
08/01/04 00:09:06
コンパイラさえ対応していれば使うよ。
コストなんてどちらにせよコード次第。
244:デフォルトの名無しさん
08/01/04 00:28:37
組み込みは一回しか経験したことないけど、一応C++だったな
でもnewを使わなかったし、ベターCって使い方だったけど・・・
245:デフォルトの名無しさん
08/01/04 00:31:15
組み込み全く知らんのだけど、newを使わない事による組み込み的なメリットって何かあるのかね?
246:デフォルトの名無しさん
08/01/04 00:33:44
例外処理省いてバイナリをコンパクトに出来るとかそのあたりかね
newは例外投げるし。
247:デフォルトの名無しさん
08/01/04 00:34:11
性能は大分上がってるけど、16bit環境も珍しくないからな。
8bitは流石に見なくなったが。(やってるところもあるだろうが。)
C++でやるかどうかは、コストよりも政治的な要素が強い希ガス。
MDAツールが使える、といった明確なメリットがなければ、
Cで押し切られそうだな。
248:212
08/01/04 00:43:39
むーそうだったのですか。
ハードウェア言語?とかいうのを使っているのだと思ってました。
ありがとうございますm(_ _)m
249:デフォルトの名無しさん
08/01/04 00:52:48
>>245
メモリが少ないのでヒープが小さくなる。その結果newに失敗する可能性があるとか
リアルタイムが要求される場合に遅いとか?
250:デフォルトの名無しさん
08/01/04 00:59:08
>>245
普通のnew/deleteは、空き領域の断片化によってメモリ不足に陥る可能性がある。
例外はコンパイルオプションいじらないと普通は投げないんじゃないかな。
代替策として、静的確保した領域にplacement newしたり、
断片化しないように制限を付けたメモリ管理を取り入れたりと、工夫してる。
251:デフォルトの名無しさん
08/01/04 01:06:50
携帯電話みたいにOSが入ってる環境ならnew(mallocも)とか使うだろうけど
IOから自分で実装するような組み込みならまず使わないと思うよ。
環境によっちゃRAMやスタックの使用量を監視しながらデバッグすることだってあるし。
252:デフォルトの名無しさん
08/01/04 02:10:51
C++で組み込みっつったらBREWとかしか思いうかばんなぁ
253:デフォルトの名無しさん
08/01/04 02:31:05
>>252
組込みのソフトが何で開発されたか、なんて普通表に出てこないから。
詳しくは言えないが、おまいらの目に触れるところで
C++(全部ではないが)使って作られたもの知ってるよ。
254:デフォルトの名無しさん
08/01/04 05:42:17
日立(ルネサス)のはC++コンパイラだったな
255:デフォルトの名無しさん
08/01/04 10:49:14
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132
スレリンク(tech板)
からの誘導で来ました。
===========
仕様:
1. UNIXのcronみたいに特定の時間になるとある処理を実行させる
2. そのプログラム自体はdaemonとしてずっと走り続けている
こういうことをLinux上でやりたいんですが、
sleepかalertを使って、
希望の時間になったかを調べ続けるしかないですかね。
何か普通はこうやるよってのあります?
1分に1回温度を測定するプログラムです。
256:デフォルトの名無しさん
08/01/04 11:15:11
現在の時刻を取ってきて、Sleepで寝かせる時間を計算すれば良いんじゃないかな。
257:デフォルトの名無しさん
08/01/04 11:18:46
>>255
cron使うわけにはいかないの?
どうしてもプログラム内で完結したいなら、alarm()かsetitimer()だろうね。sleep()でもできなくはないけど。
残念ながら、alert()なんてのは知らん。
258:デフォルトの名無しさん
08/01/04 11:19:15
>>256
Sleepってなんですか?
259:デフォルトの名無しさん
08/01/04 11:35:19
>>256-257
レスありがとうございます。
やっぱりそうなりますか。
alertじゃなくてalarmでした。
260:デフォルトの名無しさん
08/01/04 12:11:27
そもそもcronのソース読めばいいじゃないか
261:デフォルトの名無しさん
08/01/04 12:19:00
それはめんどくせえじゃん
262:デフォルトの名無しさん
08/01/04 13:27:42
そもそもcron使えばいいじゃないか。
263:デフォルトの名無しさん
08/01/04 14:51:41
>>255
引っ越す前から見てるんだけど
時間の分解能を定義してないのはなぜよ?
sleep とか alam でやれば当然誤差累積だし…
精度とか確度とかって数学の時間に習わなかったか?
264:デフォルトの名無しさん
08/01/04 15:09:03
何で偉そうなの?
265:デフォルトの名無しさん
08/01/04 15:19:32
>>263
些末な問題だから。
266:255
08/01/04 17:22:32
>>263
引っ越し前からの長期に渡る応援ありがとうございます!
精度は1秒あればOKです。
sleepにせよ、alarmにせよ、
仕掛ける前にtime_tを取ってきて、
それから逆算してやろうかなと思っててわざわざ書きませんでした。
数学は得意です。
自分で微分を発明しました(`・ω・´)シャキーン
267:デフォルトの名無しさん
08/01/04 17:39:02
ライプニッツもしくはニュートン乙
268:デフォルトの名無しさん
08/01/04 18:13:59
凄い奴が書き込んでたんだな。しかも前スレから。
269:デフォルトの名無しさん
08/01/04 18:45:21
>>263
どこに引っ越したんだ?
270:デフォルトの名無しさん
08/01/04 19:44:39
いや、>255が他のスレから移動してきただけのことだろ。
271:デフォルトの名無しさん
08/01/05 03:46:06
度忘れしてしまったので助けて
引数にポインタをとる関数があるのだが
このポインタのアドレスを自動変数のものに書き換えるのはNG
このポインタに自動変数を代入するのはOK
でいいんだよね
272:デフォルトの名無しさん
08/01/05 03:49:55
>>271
ごめん、読解できない
273:デフォルトの名無しさん
08/01/05 03:53:50
寝ぼけてるから日本語でokになってしまったorz
a(int* p)
{
int local = 10; //適当
p = &local; //NG
*p = local; //これはどうだったっけ?
}
274:デフォルトの名無しさん
08/01/05 03:59:04
>>273
//これはどうだっけ?
OKだよ。 ってか、なんでこの程度の事が分からん。
//NG
これの理由は説明できるか?
275:デフォルトの名無しさん
08/01/05 04:00:36
>>273
*p = local; //これはどうだったっけ?
問題ない
pの指す領域に10の値が代入される
pがもつ10の値と、localが持つ10の値は、それぞれ別の領域に格納されている状態になる
276:デフォルトの名無しさん
08/01/05 04:01:11
よくわからんが混乱してしまった、最近疲れてる予感orz
あれだ、auto変数は関数から脱出した瞬間ナイナイされちゃうからな
するとポインタpは意味の無いところを示してしまうのでエラーになるんだ
277:デフォルトの名無しさん
08/01/05 04:12:09
>>274-275
説明ありがとう
今日はもう休もうorz
278:デフォルトの名無しさん
08/01/05 08:30:54
文字列から指定の文字列を省いて他の変数へコピー
例えば
文字列が入った変数 MOJI[]="aaabbbccc\0" 指定の文字列="bbb"だと
MOJI→他の変数へaaaccc\0をコピー
できれば
aaabbbccc→ポインタ使ってMOJI自身をaaaccc\0に
ってしたいんだけど、どのようにすればいい?
279:デフォルトの名無しさん
08/01/05 08:35:58
ドゥアブルポイントゥアァァァァ
280:デフォルトの名無しさん
08/01/05 08:57:36
strstrでbbb探してbbbのに続くバイトをヌル文字まで一文字ずつ前にコピー
281:デフォルトの名無しさん
08/01/05 09:04:56
void func(char * a, char const * b)
{
if (a == NULL || b == NULL || a[0] == '\0' || b[0] == '\0') return;
char const * p = strstr(a, b);
if (p == NULL) return;
char tmp[strlen(a) + 1];
sprintf(tmp, "%.*s%s", p - a, a, p + strlen(b));
strcpy(a, tmp);
}
char MOJI[] = "aaabbbccc";
char * b = "bbb";
func(MOJI, b);
但し、"aaabbbccc\0"はナンセンスなんで"aaabbbccc"に変更済み
282:デフォルトの名無しさん
08/01/05 09:06:01
>一文字ずつ前にコピー
馬鹿がいる。
>char tmp[strlen(a) + 1];
c99使いがいる。
# つーか、一時領域要らないだろw
283:281
08/01/05 09:10:17
>>282
確かに一時領域要らなかった。
>>278
ってことで、訂正。これでc89でも大丈夫。
void func(char * a, char const * b)
{
if (a == NULL || b == NULL || a[0] == '\0' || b[0] == '\0') return;
char const * p = strstr(a, b);
if (p == NULL) return;
strcpy(p, p + strlen(b));
}
284:デフォルトの名無しさん
08/01/05 09:13:58
>>283
いや、未だc89じゃ通らないし。つーか、char const * pじゃなくてchar * pだろよ。
285:デフォルトの名無しさん
08/01/05 09:28:25
>>283
strcpyでコピー範囲が重なってるから動作が未定義になるぞ。
286:デフォルトの名無しさん
08/01/05 09:35:26
さらに指定の文字列は複数回出現する可能性も有るから・・・
さらに言えば指定文字列を取り除いた後に前後の文字列がくっついて取り除くべき指定文字列になる可能性も。
ex. aabbcからabを取り除くとabcになって再度abが出現。
287:デフォルトの名無しさん
08/01/05 10:05:44
ありがとうstrlen使う発想がなかったから助かりました
実はURLからime.nu/を消したかっただけなんでこんな感じでまとめたみた
if(NULL!=strstr(url,"ime.nu/")){
char *buf;
buf=strstr(url,"ime.nu/");
url[strlen(url)-strlen(buf)]='\0';
buf+=strlen("ime.nu/");
strcat(url,buf);
}
288:デフォルトの名無しさん
08/01/05 10:27:58
strcatも未定義動作になるから止めれ。
289:デフォルトの名無しさん
08/01/05 11:18:35
>>276
ポインタpも関数から脱出した瞬間ナイナイされるので安全。
290:デフォルトの名無しさん
08/01/05 11:21:28
strcpy()で、前方への移動ができない実装ってあるんかいな。
未定義には違いないけど。
291:デフォルトの名無しさん
08/01/05 14:10:38
>>273
>p = &local; //NG
これもOKだよ
よく考えろ、pもローカル変数だ
292:デフォルトの名無しさん
08/01/05 14:32:16
>>291
ほう?
void TestFunc(int* p)
{
int x = 10;
p = &x;
}
int main(int argc, char* argv[])
{
int a;
TestFunc(&a);
printf("%d\n", a);
return 0;
}
293:デフォルトの名無しさん
08/01/05 14:44:20
>>292
そういう話をしてるんじゃないと思うが。
294:デフォルトの名無しさん
08/01/05 14:45:20
何が「ほう?」なんだか。
295:デフォルトの名無しさん
08/01/05 14:52:06
>>292
君が何を言いたいのか分からない
要するに、そのコードがどうした?
何か問題でも?
296:デフォルトの名無しさん
08/01/05 14:59:12
>>292
void TestFunc(int* p)
{
int x = 10;
p = &x;
}
int main(int argc, char* argv[])
{
int a = 5;
TestFunc(&a);
printf("%d\n", a);
return 0;
}
出力結果
5
297:292
08/01/05 15:00:49
ごめん、俺が悪かった。物凄く勘違いしてたらしい。いじめないでくれ。
298:デフォルトの名無しさん
08/01/05 15:10:58
ローカル変数のポインタをリターンするときに注意が必要なんだっけ?
299:デフォルトの名無しさん
08/01/05 15:14:17
あれ?戻った先で使おうと思っても残ってる保証がないんぢゃ? > 298
300:デフォルトの名無しさん
08/01/05 15:15:17
そうだね。
int* f()
{
int a = 10;
return &a; // NG
}
特に構造体とか大きいものを返したいときに、
コストを避けようとしてやってしまう人もいるかも。
素直に値で返すか、引数に格納先のポインタを貰うべし。
301:デフォルトの名無しさん
08/01/05 15:21:00
そんな時のための動的確保ですよ > 300
302:デフォルトの名無しさん
08/01/05 15:24:48
>>300
動的確保するならauto_ptrですな。
std::auto_ptr<int> f()
{
return std::auto_ptr<int>( new int(10) );
}
303:デフォルトの名無しさん
08/01/05 15:25:07
ヒープ領域に確保されるからdeleteで明示的に削除しない限り開放されないってやつか
ただしdelete忘れるとメモリリークが起こるから注意(´・ω・)
304:デフォルトの名無しさん
08/01/05 18:52:20
初歩的な質問ですいません。ポインタに関して質問です。
二次元配列の動的確保なのですが、
TCHAR hoge[5][260];
のような時に5の部分だけ動的に確保して260の方は固定したいのですが、
TCHAR *hoge[260];
hoge = (TCHAR *)malloc(sizeof(TCHAR)*260*num);
のようにすると、"'char *'から'char *[260]'に変換することはできません"とコンパイルエラー吐きます。
TCHAR **hoge;
で最初から動的確保を2度行う方法は分かるのですが、片方を固定した場合どのようにすべきでしょうか。
305:デフォルトの名無しさん
08/01/05 18:54:06
TCHAR (*hoge)[260];
306:デフォルトの名無しさん
08/01/05 18:54:47
hoge = (TCHAR (*)[260])malloc(sizeof(TCHAR)*260*num);
307:デフォルトの名無しさん
08/01/05 18:54:58
sizeof(TCHAR)*260
を
sizeof(hoge)
にするとどうなる?
308:デフォルトの名無しさん
08/01/05 18:55:45
あるいは
hoge = (TCHAR (*)[260])malloc(sizeof(*hoge)*num);
309:デフォルトの名無しさん
08/01/05 19:02:05
typedef すると分かりやすいよ。
typedef TCHAR Path[MAX_PATH];
Path *hoge;
hoge = (Path *)malloc(sizeof (Path) * num);
310:304
08/01/05 19:23:37
即レス感謝です。
>>307
そうすると、後者の場合は戻り値が4になりました。
何故かsizeof(TCHAR)だと1でした。何故2じゃないのだろう・・・。Unicodeじゃないからかな・・・??
>>305-306
のように間接参照演算子を括弧でくくると上手くコンパイルも通り、
for(i = 0 ; i < max ; i++) hoge[i] = "test";
と動作も確認出来ました。
>>309
のようにtypedefのやり方もググって見つけたのですが、
直接的にどうやれば通るか知りたかったもので。。 やはり、typedefの方が分かりやすいですね。
311:デフォルトの名無しさん
08/01/05 19:30:57
型宣言の * は間接参照演算子とは別物。
312:デフォルトの名無しさん
08/01/05 19:35:03
>>310
TCHARはマクロでワイド文字(wchar_t)とマルチバイト文字(char)を切り替える
VCならプロパティからUnicode文字セットを使用するようにすればワイド文字になる
後"test";は_T("test");もしくはTEXT("test");って書くように。そうすれば切替の対象になるから。
313:デフォルトの名無しさん
08/01/05 21:29:06
構造体にすると見慣れた形になる。
typedef struct { TCHAR str[260]; } Path;
Path* hoge = (Path*)malloc(sizeof(Path) * num);
煩雑かな。
314:デフォルトの名無しさん
08/01/06 00:18:19
なんて言うかポインタの配列と多次元配列へのポインタを勘違いしている様な希ガス
int *p[10]だとint型のポインタが10個あるポインタの配列
int a[10][10]とかの多次元配列へのポインタなら int (*p)[10]
315:デフォルトの名無しさん
08/01/06 00:55:57
C言語で何か分かりやすいプログラムはないでしょうか。
316:デフォルトの名無しさん
08/01/06 00:56:34
helloworld
317:デフォルトの名無しさん
08/01/06 00:59:19
int main(){
return 0;
}
多分これが一番分かりやすい
318:デフォルトの名無しさん
08/01/06 01:48:10
C++Builder 6でコンパイルした後
printfでテキスト文を表示したいんですけど
どうすればいいんでしょうか。
319:デフォルトの名無しさん
08/01/06 01:49:48
エスパーが質問に答えるスレ
スレリンク(tech板)
320:デフォルトの名無しさん
08/01/06 02:15:16
実行すれば良いんじゃない。
321:デフォルトの名無しさん
08/01/06 02:28:04
日本語をコマンドプロンプトや「メモ帳」で表示させたいです。
できれば背景が白い所に分かりやすく表示させたい。
マジレスきぼんぬ。
322:デフォルトの名無しさん
08/01/06 02:34:03
コマンドプロンプトの配色を「白地に黒文字」に設定
323:デフォルトの名無しさん
08/01/06 02:48:13
#include <stdlib.h>
system( ); で、適当に
コマンドの命令だが、
color F0
とか
#define color(x) printf("\033[%dm", x + 30);
MS使用だったかも知れないが。
system("notepad.exe puni.cpp");
詳しくは調べて
324:304
08/01/06 02:57:35
>>314
それを観て何となく納得出来ました。
キャストが初めて観るので、もうちょっと弄ってみます。
レスくれた皆さんありがとうございました。
325:デフォルトの名無しさん
08/01/06 05:36:09
動的メモリの解放がいまいちよく判りません。
以下の(A)で生成した snow は、
(B)で問題なく解放されているのでしょうか?
void procMain()
{
Snow ***snow = NULL;
int i, j;
// 生成 ←(A)
snow = new Snow**[10];
for ( i = 0; i < 10; i++ ) {
snow[i] = new Snow*[5];
for ( j = 0; j < 5; j++ ) {
snow[i][j] = new Snow();
}
}
// 解放 ←(B)
for ( i = 0; i < 10; i++ ) {
for ( j = 0; j < 5; j++ ) {
delete snow[i][j];
}
delete snow[i];
}
delete snow;
}
下2つの delete が delete[] の様な気もしますが、
判る方がいましたらよろしくお願いします。
326:デフォルトの名無しさん
08/01/06 05:49:38
>>321
ファイルに出力した後にそのファイルを開けばいい。
fp=fopen("test.txt","r");
fprintf(fp,"hoge");
fclose(fp);
system("test.txt");
327:デフォルトの名無しさん
08/01/06 06:32:15
>>325
new [] 使ってるから delete [] だろうね。
こういうのはややこしくなるから、
フラットな配列にして添え字は掛け算するのがシンプルでいい。
Snow *snow = new Snow[10*5];
for (int i = 0; i < 10; i++ ) for (int j = 0; j < 5; j++ ) snow[i*5+j].xxx();
delete [] snow;
328:デフォルトの名無しさん
08/01/06 06:40:43
>>321
>>318でエディションがPersonal以外ならOutputDebugString。イベントタブに出力される
329:325
08/01/06 08:55:02
>>327
レスありがとうございます。問題が解決しそうです。
どちらの delete でもコンパイルが通っちゃうから自信が持てない・・・
330:デフォルトの名無しさん
08/01/06 11:33:30
>>315
全然関係ないが、自分が一番最初に見たC++のサンプルはこれだ。
#include <iostream>
int main(int argc, char *argv) {
std::cout << "Hello World !" << std::endl;
return 0;
}
ついでに、一番最初に聞いたクラスの説明は
猫も人もみな哺乳類なのです
だ。
331:デフォルトの名無しさん
08/01/06 11:48:57
>>330
mainの引数もまともに書かないとは、悪いサンプルだな。
332:デフォルトの名無しさん
08/01/06 12:42:49
俺はこれだった・・・
static char _main[] = { 0x81, 0x21, ...., 0x21 }
PDPほにゃらら専用とかかいてあった
333:デフォルトの名無しさん
08/01/06 14:01:44
最近Win32APIを使ったソフトを作り始め、色々とサンプルを見て回ってるのですが
多くがひとつの.cppファイルにまとまってるようなコードや、グローバル変数が多いソースで、
それを元にコードを打ち始めたらひとつのファイルに何千行というコードが入り、設定情報
をグローバル変数で共有するような気持ち悪いコードになってしまいました。
Win32を用いたコードでうまくOOPの概念を取り入れて、出来るだけすっきりとしたコードを書きたいのですが、
なにかアドバイスがあればご教授願います。
334:デフォルトの名無しさん
08/01/06 14:08:52
APIを直接呼ぶんじゃなくて、APIを包み込むクラスかしてから使う。たとえばファイル関係のクラスを作って外からAPIを見えなくする。
335:デフォルトの名無しさん
08/01/06 14:19:46
>>333
Win32API 直叩きじゃなくて、MFCや.NET Framework使ったほうが良いよ。
336:デフォルトの名無しさん
08/01/06 14:21:16
MFCや.NET Frameworkみたいなのを作りたいんだろ。
337:デフォルトの名無しさん
08/01/06 14:48:05
SDLとかwx使おう是
338:デフォルトの名無しさん
08/01/06 15:25:17
VCLも愛して
339:デフォルトの名無しさん
08/01/06 16:29:28
暇だしVCLをC++に移植するか
340:333
08/01/06 16:30:59
皆さん ご回答ありがとうございます。
どうやらMFCってのがうまくAPIを纏めているようなのでそれを使いたいと思います・・・
341:デフォルトの名無しさん
08/01/06 16:37:27
>>339
それ欲しい。是非に
342:デフォルトの名無しさん
08/01/06 16:58:12
>>339
文字列クラスには是非sprintfメソッドを
343:デフォルトの名無しさん
08/01/06 19:06:34
C++のSTLであるvector型に関する質問です。
AAA, BBB, CCCという3つのvector型があって、
それらの要素AAA[index], BBB[index], CCC[index] (indexは全て共通の整数)を一括削除したいのですが、
下記のような冗長な構文になってしまいます。
消したい対象DDD, EEE, FFFが増えていくと、プログラムが非常に長くなってしまうのですが、
イテレーターaaa, bbb, cccを極力使用せずにコンパクトに記述する方法は無いでしょうか・
vector<double>::iterator aaa; aaa = AAA.begin();
vector<int>::iterator bbb; bbb = BBB.begin();
vector<string>::iterator ccc; ccc=CCC.begin();
for(int a=0;a<index;a++) { aaa++; bbb++; ccc++; }
AAA.erase(aaa);
BBB.erase(bbb);
CCC.erase(ccc);
344:デフォルトの名無しさん
08/01/06 19:21:25
>>343
いや、少なくともfor文はいらなくね?advance使えば?
というより、こういうのは思いっきりtemplateの出番だと思うんだが。
345:デフォルトの名無しさん
08/01/06 19:24:03
>>343
そもそもデータ構造を
struct Hoge {
double d; int n; string s;
};
vector<Hoge> hoge;
とできないの?
ちなみにvector<>::iteratorはランダムアクセスできるので
AAA.erase(AAA.begin()+index)でOK
346:デフォルトの名無しさん
08/01/06 19:29:51
>>344
>>345
ありがとうございます。
既にクラスの階層構造を何段か組んでいるので、これ以上階層化するのは避けたいと思いまして。
最後の1行の場合、indexがint型だからコンパイルエラーにならないでしょうか?
347:デフォルトの名無しさん
08/01/06 19:35:34
>>346
RamdomAccessIteratorなら加算がオーバーロードされてるからおk
348:343
08/01/06 19:35:53
まずはこの方法でためしてみます。
AAA.erase(AAA.begin()+index)
349:デフォルトの名無しさん
08/01/06 19:36:13
>>347
重ね重ねありがとうございますm(_ _)m
350:デフォルトの名無しさん
08/01/06 19:52:25
#include <stdio.h>
から始まる基本関数で
何か表示する物はあるんでしょうか。
351:デフォルトの名無しさん
08/01/06 20:02:22
Random Access Iteratorだから
AAA.erase( AAA.begin() + index );
BBB.erase( BBB.begin() + index );
CCC.erase( CCC.begin() + index );
でいいんじゃね?
352:デフォルトの名無しさん
08/01/06 20:04:09
printfとか簡単な関数でもいいんですが。
コンパイラの設定でブリーダーができません。
353:デフォルトの名無しさん
08/01/06 20:05:49
質問はコミュニケーション言語日本でお願いします。
354:デフォルトの名無しさん
08/01/06 20:08:28
これからテンプレートの勉強を始めようと思っているんですが
テンプレート:クラスみたいなもん
STL:テンプレートのあつまり
みたいな認識ってまちがっていますか?
355:デフォルトの名無しさん
08/01/06 20:10:15
>>354
間違ってる
356:デフォルトの名無しさん
08/01/06 20:35:34
関数テンプレートの使いどころというか選択についてです
気にしなくて良いレベルなのだと思いますが
引数にaとbを取り、大きな方を返す関数テンプレートがあったとします。
この場合、大きい値を返す関数のint用のものfloat用のもの・・・・といった具合にたくさんの関数を用意するのとでは
どちらが良いのでしょうか?
ここで関数テンプレートを使うとなんというかもったいないというか処理が無駄に大きく膨らんでいる気がしてならないです
今すぐに想像はできないのですが、ここでいう大小を比べる程度のものでなく、もっと大きなものならば関数テンプレートが有効だとは思います
357:デフォルトの名無しさん
08/01/06 20:36:29
大事なところがorz
つまり処理数が多いものならば関数テンプレートを利用した方が良い、などの明確だったりしないまでの決まりのようなものはあるのでしょうか?
358:デフォルトの名無しさん
08/01/06 20:38:53
>>356
何で?
ぜんぜんもったいなくないと思うけど。
呼び出されてる型のものだけが具体化されるから
効率的だと思うし、実際std::maxテンプレートはあるじゃない。
359:デフォルトの名無しさん
08/01/06 20:40:57
>>356
>int用のものfloat用のもの・・・・といった具合にたくさんの関数を用意する
これが面倒じゃないと思うならがんばれば?
360:356
08/01/06 20:41:07
>>358
ありがとうございます
そうですよねorzもったいないと感じている自分がおかしくてならないです
積極的に使っていこうとおもいます
361:デフォルトの名無しさん
08/01/06 21:03:26
だから、std::max()を使えってば。
362:デフォルトの名無しさん
08/01/06 21:06:46
>>361
356は例えばで言ってるだけだろ
363:デフォルトの名無しさん
08/01/06 21:14:07
>>360
おかしくないです。出てくるコードの大きさを見積もることは必要なことです。
364:デフォルトの名無しさん
08/01/06 21:17:24
>>356
>int用のものfloat用のもの・・・・といった具合にたくさんの関数を用意する
保守性を考えるとこの考え方はは良くない。
バグがあったら全部直さなきゃいけないし、直し忘れが出てくる可能性がある。
ステップ数が少ない場合でも、バグが出るときは出る。
こういう場合を想定してテンプレートが出てきたわけだし。
365:デフォルトの名無しさん
08/01/06 22:00:30
templateを使うとexeがバカでかくなるって言うアホがいるんだよな
俺も会社でよく言われるんだわ
366:デフォルトの名無しさん
08/01/06 22:04:31
そういやテンプレートを使う機会が無い
367:デフォルトの名無しさん
08/01/06 22:07:18
仮にばかでかくなったとして、どのぐらいのサイズなら問題だと感じるんだろう……
368:デフォルトの名無しさん
08/01/06 22:13:00
環境によってさまざまだろうね。
組み込み環境なら結構致命的になりかねん気もするけど、それならC++にするメリット少ないし。
一般的なソフトウェアならCDやDVDに入りきらなくなったらとかじゃないのかな?
369:デフォルトの名無しさん
08/01/06 22:13:48
仮にテンプレート使わなかったとしても、
似たような物作るわけだしな。
370:デフォルトの名無しさん
08/01/06 22:34:36
>>365
昔のコンパイラは知らないけど、信じがたい。
具現化されるのは自分で呼び出してるものだけだから。
インライン化とか別の理由で大きいんでない?
それともテンプレート使わなくても、もともとバカでかく
なるプログラムかもしれん。
371:デフォルトの名無しさん
08/01/06 22:43:46
>>370
大きなクラスを丸ごとテンプレートにしたんじゃないか?
372:デフォルトの名無しさん
08/01/06 22:44:17
オブジェクトファイルのサイズだけ比較すればずっと増えるんじゃね?計ったことないけど
373:デフォルトの名無しさん
08/01/06 23:01:42
VC++2008express editionでコンソールアプリケーションを作れるか実験してみた結果
できませんでした。
どうしたもんでしょう。
374:デフォルトの名無しさん
08/01/06 23:04:36
それだけじゃ、何が起こったのかサッパリ
375:デフォルトの名無しさん
08/01/06 23:07:35
C言語の質問なんだが。
持たせたファイルポインタからファイルネームを得たいんでファイルポインタからメンバーを見てみたら
tmpfnameってのがあったけど、このtmpfnameってそのファイルの名前と考えておk?
あと、これって環境依存?
376:デフォルトの名無しさん
08/01/06 23:12:35
環境依存
377:デフォルトの名無しさん
08/01/06 23:12:59
FILE構造体の中身は処理系依存
378:デフォルトの名無しさん
08/01/06 23:15:56
>>376-377
ありがとうございました。
別の方法で管理することにします。
379:デフォルトの名無しさん
08/01/06 23:36:51
C言語の質問です
main関数で用意したdouble *xを別の関数の中でmallocを使ってサイズを決めることと数値の代入を行いたいのですが上手く出来ません
どのようにすればいいでしょうか
以下は自分で作ったものの該当部分だけを抜き出し簡略化したものです
#include<stdio.h>
#include<stdlib.h>
void f(double *);
void main(void)
{
double *x;
f(x);
free(x);
}
void f(double *a)
{
a=(double *)malloc(sizeof(double)*3);
if(a==NULL){
printf("メモリ確保失敗\n");
exit(1);
}
a[1]=2.0;
}
380:デフォルトの名無しさん
08/01/06 23:40:52
ポインタを関数に渡しているといってもポインタという値を渡してるだけ。
そのポインタを関数の中で書き換えてもmainじゃ影響されないから引数消して返り値使うとか、
ポインタのポインタを引数でとるかのどっちか。
381:デフォルトの名無しさん
08/01/06 23:41:45
>>379
そりゃ、上手くいかんわ。
void f(double **);
void main(void)
{
double *x;
f(&x);
free(x);
}
void f(double **a)
{
*a=(double *)malloc(sizeof(double)*3);
if(*a==NULL){
printf("メモリ確保失敗\n");
exit(1);
}
*a[1]=2.0;
}
全く試してないけど、これでどうよ?
382:デフォルトの名無しさん
08/01/07 00:01:18
>>381
俺も全く試してないけど
>*a[1]=2.0;
なんか嫌な臭いがする。
優先順位、これでよかったっけ?
383:デフォルトの名無しさん
08/01/07 00:04:54
>>382
(・A・)イクナイ!!
384:デフォルトの名無しさん
08/01/07 00:07:09
*a[1]は*(a[1])だったはずだな。
やりたいのは(*a)[1]か?
385:デフォルトの名無しさん
08/01/07 00:12:12
>>378-384
どうもありがとうございます。
>>381を>>384に変更したものを使えば上手くいきました
386:デフォルトの名無しさん
08/01/07 00:38:10
for(i=0;i<N;i++){
fscanf(fp,"%lf %lf",&m[i],&n[i]);
}
↑の状態でビルドして実行するとエラーが出る
for(i=0;i<N;i++){
fscanf(fp,"%lf %lf",&m[i],&n[i]);
printf("%f %f\n",m[i],n[i]);
}
次に↑のように書き換えてビルドして実行するとエラーが出ない
for(i=0;i<N;i++){
fscanf(fp,"%lf %lf",&m[i],&n[i]);
}
その後で↑の状態に戻してからビルドして実行すると最初と同じなのにエラーが出なくなっている
こういったことが起こるのはどのような理由でしょうか
387:デフォルトの名無しさん
08/01/07 00:45:18
すべてのソースを貼り付けるとか
エラーの内容を書くとか
そういう努力をしないとエスパー以外答えられないと思うよ
388:デフォルトの名無しさん
08/01/07 01:44:26
エスパーしてみる。
ファイル内に改行があってfscanfが2回目以降読み込みに失敗している。
389:デフォルトの名無しさん
08/01/07 03:26:27
多分初期化忘れ。エラーが出ない方はたまたま
390:デフォルトの名無しさん
08/01/07 05:17:35
>384
優先順位って難しいね.
みんなちゃんと覚えてるの?
391:デフォルトの名無しさん
08/01/07 06:18:31
別スレから誘導されて来ました。
改めて、こちらで質問させて下さい。
まず、フラッシュメモリにデータを書き込みます。
そしてそのデータが書き込まれたセクタ?(アドレス?)を取得する方法ってありますでしょうか?
392:デフォルトの名無しさん
08/01/07 06:35:09
誰だよ、誘導したのwここでもスレ違いだろw
少なくともCレベルじゃメモリアドレスしかわからんだろうから無理じゃね?
OSレベルの話になるね。
393:デフォルトの名無しさん
08/01/07 07:00:26
>>392
そうですか…
かなり難しいようですね…
環境は、Win32(XP Pro) + VC++ なんですけど…
394:デフォルトの名無しさん
08/01/07 07:04:39
DOS 時代なら INT 25H(アブソリュートディスクリード)使えば何とかなると思うけど・・・。