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(アブソリュートディスクリード)使えば何とかなると思うけど・・・。
395:デフォルトの名無しさん
08/01/07 07:22:43
Inside Windows NT Disk Defragmenting
URLリンク(technet.microsoft.com)
デフラグ用のAPIではだめかい?
396:393
08/01/07 07:56:40
>>394-395
助言ありがとうございます。
がんばって調べてみます!
とりあえず、395さんの紹介して頂いたページを見てみたいと思います。
397:デフォルトの名無しさん
08/01/07 08:07:54
>>390
自信ない使い方をするときに括弧使えばいいだけだろ。
398:デフォルトの名無しさん
08/01/07 10:10:50
>>390
考えるのがめんどくさいので、常に括弧付。
可読性も向上。
399:デフォルトの名無しさん
08/01/07 13:25:53
>>398
int a = (b + (c * d)) - e;とか書くの? 却って可読性が落ちる希ガス。
400:デフォルトの名無しさん
08/01/07 13:27:27
lispに慣れてればどうということはない
401:デフォルトの名無しさん
08/01/07 14:24:29
>399
煽りとしてはどうかなあ?
402:デフォルトの名無しさん
08/01/07 14:34:46
素朴な疑問だろ?
403:デフォルトの名無しさん
08/01/07 14:43:02
左結合か右結合か、考えるの面倒だよね。
だからきっと、
a = (b = (c = 0));
って書くんだよ。
404:デフォルトの名無しさん
08/01/07 14:43:30
>>399
ぶっちゃけa = b + c * d - eよりはよっぽどわかりやすい
405:デフォルトの名無しさん
08/01/07 14:45:20
俺は
a = b + (c * d) - e
だな。
順読み以外は括弧付ける派。
406:デフォルトの名無しさん
08/01/07 14:46:15
a = c * d + b - e
407:デフォルトの名無しさん
08/01/07 15:13:45
b,c,d,eの順序に意味がある場合の話だろうjk
408:デフォルトの名無しさん
08/01/07 15:20:45
質問があります。
今C言語を勉強しようか考えている所なのですが
これを学ぶ事によって、ボンバーマンのようなゲームは作成可能でしょうか?
また作れると仮定しまして、C言語よりボンバーマンのようなゲームを作るのが
簡単な言語はありますでしょうか?
もしよろしければ教えてください、お願いします。
409:デフォルトの名無しさん
08/01/07 15:29:34
>>408
英語を学ぶことによってマクベスを書くことは可能かどうか、
英語で書くより簡単な言語はあるかと聞くくらい、無意味だ。
こっちにでも逝け。
初心者のためのプログラミング言語ガイド Part6
スレリンク(tech板)
410:デフォルトの名無しさん
08/01/07 15:52:46
>>408
どんな言語でも何かを作る時apiや構文等の知識は必要となり
簡単ていう概念はとっぱらったほうがいい。
どんなもんでもある程度確立した物を作るのはめんどうなもんだ。
411:デフォルトの名無しさん
08/01/07 16:06:29
誘導ありがとうございます。
簡単と言う発言は軽率でした
言語にも向き不向きがあるかと思ったので、
より作りやすいと言う意味でした
それでは誘導先に行ってきますので、
こちらでの質問は取り下げさせてください
412:デフォルトの名無しさん
08/01/07 22:33:27
藤原紀香相手に中だしSEXするよりは簡単だろう
413:デフォルトの名無しさん
08/01/07 22:52:17
>>412
おっさん乙
414:デフォルトの名無しさん
08/01/08 01:33:25
C++の標準I/Oライブラリについてですが、
basic_istream<>やbasic_ostream<>はbasic_streambuf<>
を利用してバッファ入出力を行ってますが、継承はして
ないですよね?basic_istream<>やbasic_ostream<>は
コンポジションとしてbasic_streambuf<>を保持してるのですか?
415:デフォルトの名無しさん
08/01/08 02:45:31
.jpgとかをいじるのは古いプログラムなんですかね。
416:デフォルトの名無しさん
08/01/08 02:47:09
>>414 そうともいう。
417:デフォルトの名無しさん
08/01/08 03:01:57
入力がEUCで漢字コードを検索したい場合、どうやればいいんでしょうか?コンパイラはシフトジスが基本みたいです
418:デフォルトの名無しさん
08/01/08 03:45:00
>>415
「いじる」ってのをどういう意味で使ってるのかよく分からんが
JPEG<=>ビットマップの変換は古いというか普通ライブラリを使う
419:デフォルトの名無しさん
08/01/08 04:01:05
int iskanji(int c)
{
return (0xA1 <= c && c<=0xfe)
}
420:デフォルトの名無しさん
08/01/08 05:28:11
std::vector<int[10]>みたいなことをやりたいのですが、ベクタのベクタにするか、
メンバ変数に配列を持つ構造体のベクタにするしかないんでしょうか
421:デフォルトの名無しさん
08/01/08 05:53:22
>>420
int[10]は型じゃないっしょ?
422:デフォルトの名無しさん
08/01/08 07:23:33
>>419
EUC の1バイト目はもうちょっと範囲広いし、
3バイト文字も存在する。
423:デフォルトの名無しさん
08/01/08 07:49:19
どこのEUCだか。
424:デフォルトの名無しさん
08/01/08 11:52:47
>>420-421
int[10] は要素数 10 の int の配列型だよ。でもコピーコンストラクタや代入演算子が
使えないんで vector には入れられない。 >420 の言うような回避方法が必要。
425:デフォルトの名無しさん
08/01/08 12:50:52
バイナリのデータを1バイトづつ読み込んでいって、FFといデータの前に
次の値を書き込むというのをやりたいんですが、こういったことをやる場合、
ifstreamで読み込んでいってデータを見つけたら位置を取得→
ofstreamを使って取得した位置に書き込みという風にやらないといけないのでしょうか?
426:デフォルトの名無しさん
08/01/08 12:55:28
>>425
C/C++ 標準のファイル操作ではファイルの一部だけを書き換えることはできない。
データの挿入もこれに当てはまる。(ただし元の内容の後ろに追記はできる。)
ってことで新しいデータを含んだファイルの内容を全部 ofstream に突っ込むことが必要。
427:デフォルトの名無しさん
08/01/08 13:09:13
>>420
std::vector<int(*)[10]>とか
428:デフォルトの名無しさん
08/01/08 13:14:32
>>425
入出力を別のファイルにしておいて、入力データが「FFとい」だったら
それを出力する前に「次の値」を出力すればよろしい。
一つのファイルでそれを実現するのは、(サイズが変わるのであれば)むずかしい。
429:デフォルトの名無しさん
08/01/08 13:15:37
>>426
>C/C++ 標準のファイル操作ではファイルの一部だけを書き換えることはできない。
いいえ。
430:426
08/01/08 13:23:52
ごめんよ。サイズの変わらない書き換え(上書き)はできるね。データの挿入ができないんだ。
431:デフォルトの名無しさん
08/01/08 13:31:44
>>426-430
ありがとうございます。勉強になりました。
バイト配列にデータを全部読み込んで、配列をFFの一つ前のデータまで書き込んで→
新しい値を書き込んで→残りの配列を書き込む という方法でやりたいと思いますm(_ _)m
432:デフォルトの名無しさん
08/01/08 14:51:17
>>431
istreambuf_iteratorとostreambuf_iterator使うと簡単にできそうだな。
速いし。
433:デフォルトの名無しさん
08/01/08 17:39:27
webカメラ(usb接続)のドライバの取得方法と、
プログラム内でそのドライバを作用させる方法をご教授願えないでしょうか
環境は.net 2003 c++です
434:デフォルトの名無しさん
08/01/08 18:36:44
ドライバ直じゃなくて普通はDirectShow経由じゃね?
435:デフォルトの名無しさん
08/01/08 20:05:46
readlineがGPLだったので、自前で書くついでにc++に移植しちゃおうと思いました。
ezstreamというクラスを作って、
string line;
ezstream es;
es.setline("yes");
es.setline("no");
line = es.getline();
と書けば、line=の行でreadline風の動作(ヒストリなどカーソルキー使用可能、ctrl+aなどのemacs風キーバインドも最低限使用可能)
をするところまでは書き上がりました(tab補完はまだですが……)。上の記述では、さらに起動時点でヒストリにyesとnoが入っています。
(つまり、↑を押せばno,yesの順にコマンドラインに出てくる)
で、せっかくなので
ezstream es;
es << "yes";
es << "no";
es >> line;
と記述出来るようにしたいと思っています。
template<class E, class T = char_traits<E> >
class basic_ioestream : public basic_iostream< E, T >{
private:
hogehogehoge;
public:
string getline(void);
string setline(void);
basic_ioestream& operator>>(……
ここで詰まったのですが、どう書けば良いのでしょうか。
それとも>>のオーバーロードだけすれば済むような単純な話ではないのでしょうか?
436:デフォルトの名無しさん
08/01/08 20:23:50
むしろoperator >>を定義すればよいという話ではないよ。
Boost.Iostreamsを使うのが楽。
URLリンク(www.kmonos.net)
それを使いたくなければ、ググれ。
URLリンク(www.google.co.jp)
437:デフォルトの名無しさん
08/01/08 21:00:35
mac ox10.5を使ってるのですが、次のソースコードをgccで
コンパイルしようとするとエラーが出てしまいます。
ソース-----------------
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fp;
char *line = NULL;
size_t len = 0;
while (getline(&line, &len, stdin) != -1) {
printf("%s", line);
}
if (line)
free(line);
exit(EXIT_SUCCESS);
}
----------------------
エラーメッセージ--------
Undefined symbols:
"_getline", referenced from:
_main in ccm08hLk.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
----------------------
getline関数関連のエラーなのですが、ネットを検索していると次のような記述を発見しました。
『MacのGCCはGNUのに手を入れてあるのでstdio.hにgetlineがない』
getlineを使用してコンパイルを成功させるには環境をどのようにすれば良いのでしょうか。
438:デフォルトの名無しさん
08/01/08 21:09:10
無い関数は作る!
勉強になるから作ってしまおう
439:437
08/01/08 21:18:41
すみません。目的としては他の人が作ったソースをコンパイルすることなのです。
使用するソースコードは既に用意されているので、(非常に長いソースコードです)
できればソースコードをいじらないでコンパイルしたいのです。
440:デフォルトの名無しさん
08/01/08 21:25:02
>>439
まずどの環境のどのコンパイラをターゲットに書かれたソースか調べる。
441:デフォルトの名無しさん
08/01/08 21:25:12
>>439
別のファイルに関数を作ればいいから、ソース変更しなくてもいいよ。
442:デフォルトの名無しさん
08/01/08 21:58:11
>>423
eucJP-ms
443:433
08/01/08 22:40:06
>>434
VFWを使っていますので残念ながらDirectShowを使うことができません
カメラをUSBポートから引っこ抜いてから再度差し
カメラを動作させるといったことをしたいのですが…
444:デフォルトの名無しさん
08/01/08 22:50:30
C++で、比較的大きくてかつ静的な連想配列を宣言したいんだけど、
ソースコードにどうやって埋め込むのがスマートでしょうか??
445:デフォルトの名無しさん
08/01/08 23:25:19
class Hoge {
public:
const std::map<A, B>& GetMap() {
static Hoge singleton;
return singleton.m_map;
}
private:
Hoge() {
// ここで初期化
}
std::map<A, B> m_map;
};
こんな感じか?
446:デフォルトの名無しさん
08/01/09 00:26:45
>>330
それを実行するのにはコンパイラには何か必要なんですかね。
447:デフォルトの名無しさん
08/01/09 00:40:52
>>446
日本語でおkだな。
コンパイルしたいのであればC++のコンパイルが可能なものであればなんでもいい。
コンパイラに必要なものが知りたいのであれば、ソースファイルだけあればいい。
448:デフォルトの名無しさん
08/01/09 00:45:13
質問です。
bcc developerを使ってC言語を勉強してるんですが、
#include ""DxLib.h"
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1)return(-1);
DrawBox(0,0,120,65535,TRUE);
WaitKey();
DxLib_End();
return(0);
}
と打ち込むと
Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照)
となります。
いろいろ調べてみた結果Windows アプリケーション→コンソールアプリケーションに
チェックを変えると、
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
となり、やはりだめです。。
もうにっちもさっちもいきません。どなたかアドバイスお願いします
449:デフォルトの名無しさん
08/01/09 00:55:34
#include <windows.h>
コンパイルオプション -W
450:デフォルトの名無しさん
08/01/09 00:59:49
>>448
よく分からんけど先頭行に
#include<windows.h>
でいけるかも
451:デフォルトの名無しさん
08/01/09 01:57:55
>>444
ソート済み const 配列の形で定義して、 lower_bound() とかする関数を
インターフェースとしてかぶせとけばいいんじゃない?
452:448
08/01/09 02:06:46
説明不足ですみませんでした。
とある参考書を使っていて、「DxLib」というファイルをインクルードして
進めていくらしく、それで#include"DxLib"となっているみたいです。
>>449-450
れすありがとうございます。
#include<windows.h> としたんですが、同じエラーがでました。
コンパイルオプションってどうやっていじるんでしょうか。
BCC developerのプロジェクト設定で
●コンソールアプリケーション(-WC)
Windowsアプリケーション(-W)
というようにチェックするところがあるんですが、
このことですか?
453:デフォルトの名無しさん
08/01/09 02:12:28
あたりが付いてるならとりあえずやってみてから質問してはどうか
454:448
08/01/09 02:16:38
やってみたんですが、だめでした。
根本的に間違ってるんでしょうか
455:デフォルトの名無しさん
08/01/09 02:29:52
>>451
それなんてEffective(ry
456:デフォルトの名無しさん
08/01/09 02:38:20
>>448
URLリンク(kansai2channeler.hp.infoseek.co.jp)
素直に、VC++とかにしてくれれば、話は早いんだが、まぁ、ゲーム作りたいやつは応援する主義なんでね。
457:448
08/01/09 02:54:28
>>456
ありがとうございます!
さっそくやってみます
458:デフォルトの名無しさん
08/01/09 03:23:36
>>448
とりあえず、VC++2005ExpressEditionを進めておく
URLリンク(www.microsoft.com)
の 「Visual C++ 2005 Express Edition」 日本語版 611,540 KB 0xB3AD1A2F を選択してダウンロード、
仮想ドライブでインストール、あるいは、一度CDに焼いてから、でもよい。
Win32APIを利用するためには、PlatformSDKが必要
URLリンク(www.microsoft.com)
ここの、最後のほうに、「PSDK-x86.exe 1.3 MB」と (Download) がある。
似たようなのが、3つあるが、一番下の(Download)を選ぶ。ダイアログが出ると保存なりしてくれ。
ダウンロードした exe を実行して指示に従えばよい。
参考ページ : URLリンク(www.microsoft.com)
459:デフォルトの名無しさん
08/01/09 03:50:34
2008じゃだめなん?psdkも一緒にインスコできるぜ
460:デフォルトの名無しさん
08/01/09 03:56:03
ポインタの基本的なことなのかもしれませんが、良く分からず悩んでおります。
2次元、3次元配列をポインタにキャストして操作したいのですが、
以下のような操作は問題ないのでしょうか?
int* hoge = (int *)new int[2][3];
例えば、上のようにcastして、1次元配列のint[5]と同じように
操作しても問題ないでしょうか?
461:デフォルトの名無しさん
08/01/09 04:04:13
>>461
ちょっとずれるかもしれないが、URLリンク(plaza.rakuten.co.jp)
キャストは、一日3回までだっていったでしょう。
できるだけキャストしないですむように組みましょう。
問題ありそうな気がする。試してないので、あれだけど。
462:デフォルトの名無しさん
08/01/09 04:07:53
C++のブースト以外のプログラムってないでしょうか。
463:デフォルトの名無しさん
08/01/09 04:10:49
意味が分からないぞw
ライブラリのことならそりゃいっぱいあるよ
464:デフォルトの名無しさん
08/01/09 04:12:35
>>460
CもC++も配列はあくまでも一次元。(多次元と表現するけど。)
今の場合は、int[3]を要素として二つ持つ一次元配列だから
int (*p)[3] = new int[2][3];
だと思う。
465:デフォルトの名無しさん
08/01/09 04:12:45
>>461
断言できないが、簡単に試したら、問題なかった。
でも、気持ち悪いので、出来るだけキャストはやめて欲しい。
466:460
08/01/09 04:23:49
>>461
>>464
>>465
みなさんありがとうございます。
できれば変なキャストはさけたいのですが、
呼び出さなければいけないDLLのメソッドが
int * で待ってまして、どうやって2次元配列、3次元配列を渡せば
よいのか悩んでおります。
(ちなみにFortranのDLL)
いちおう上のようなやりかた
int* hoge = new int[2][3];
で渡して動作しているよう?なのですが、
なにか動きがおかしいようです・・
メモリ的にはint[5]と同じなので、問題ないのかな?
とも思うのですが・・
467:デフォルトの名無しさん
08/01/09 04:39:05
2 * 3 = ?
468:460
08/01/09 04:41:41
>>467
すみません、int[6]でした。
469:460
08/01/09 04:47:58
URLリンク(www.nurs.or.jp)
ここをみると、
int x[10][10];
int i;
int *p = (int *)x;
for( i = 0; i < 100; i++ ) {
*p++ = i;
}
printf( "x[5][5] = %d\n", x[5][5] );
とあるので、どうやら問題なさそうですね・・。
でもC++でも問題ないのか、なぞですが・・。
470:デフォルトの名無しさん
08/01/09 04:58:32
>>466
int (*p)[3] = new int[2][3]; にして&p[0][0]を渡せばいいんでない?
キャストしないとコンパイルエラーだし、コンパイルを通すための無理やり
キャストは正直気持ち悪い。
471:デフォルトの名無しさん
08/01/09 05:04:30
int* hoge = (int *)new int[2][3];
いや待てよ。上の場合だと
delete [] hoge;
が未定義動作になる可能性がなきにしもあらずな気がしないでもない。
大丈夫かもしれんが移植性と規格を考えたら、>>470のほうが安心だな。
472:460
08/01/09 05:39:13
>>470-471
ありがとうございます。そちらの方がやさそうですね。
ためしてみます。
ちなみに3次元配列の場合は
int (*c)[2][3]= new int[5][2][3];
のような感じですよね?
473:460
08/01/09 05:39:46
「よさそうです」の間違いでした。
474:デフォルトの名無しさん
08/01/09 07:42:52
最初から1次元配列で確保しておいて、オフセットを調整した方がいい希ガス。
オフセット計算用にこんな関数でも用意して。
static int offset(int w, int x, int y) {return w * y + x;}
475:デフォルトの名無しさん
08/01/09 10:47:37
>>472
そう。
>>474
そう思う。
476:デフォルトの名無しさん
08/01/09 12:37:45
>>448
俺は前にbccでWinMainの引数型不一致でコンパイル通らなかったことがある
詳しいことは忘れたが第三引数がTだったような、違うかったような
477:デフォルトの名無しさん
08/01/09 14:17:31
スレ違いかもしれませんが7-zip32.dllで
自分で作ったデータを直接zipで保存する方法分かる人いませんか?
具体的に言うと
自分で作ったデータをファイルとして出力→7-zipでファイルを指定して圧縮 はできるのですが
圧縮範囲をポインタで指定→ファイル名を指定して書庫作成 ができないのです。
478:デフォルトの名無しさん
08/01/09 14:25:20
>>477
ファイルアーカイバで、ファイル以外のものをアーカイブする機能があるとも思えないが。
そもそも、なんでファイルに出力しちゃいけないの?
479:デフォルトの名無しさん
08/01/09 14:30:51
>>478
数が多いので出来ればいちいちアウトプットしたくないんです。
最悪 ファイル出力→書庫作成→ファイル消去
ってしようと思ってます。
やっぱりこういったdllには基本的にないんですかね?
480:デフォルトの名無しさん
08/01/09 14:40:17
圧縮したいだけならアーカイバのDLLを使わないで圧縮ライブラリ使ったら?
481:デフォルトの名無しさん
08/01/09 14:51:38
そのとおり
482:デフォルトの名無しさん
08/01/09 14:52:07
>>479
7-zip32.dllのAPIリストを流し読みしてみたが、メモリソース展開用の関数は無いっぽい。
出力先はメモリで受け取れるみたいだけどなw
480が言ってるようにzlibなりを使うのも手。
(その場合他のアーカイバと互換性を持たせるのは少し面倒だが)
あとは7-zip32.dllのソースをいじってメモリソース対応版を作るのも良いかも。
該当箇所を探すのが少し面倒だろうけど。
483:デフォルトの名無しさん
08/01/09 15:27:16
軽く調べたら7zip(7-zip32.dllではなく、本家のほう)のcommon/StdInStream.h .cpp
を修正すればメモリソースに対応できると思う。
あとは自分で調べるか詳しい人に聞いてね
484:デフォルトの名無しさん
08/01/09 16:58:56
統合アーカイバDLLってのは、基本的はファイル経由ばかりかと。
極端に言えば、昔の(今もあるけど)コマンドラインインターフェースを
そのままDLLに渡して動かすために作られたようなものだから。
各DLLに共通の操作を実現させるために、基本的な処理が中心だし。
だから、その元になるものを参考にすれば、大抵はオンメモリの操作になる。
例えば、TAR32.DLLではなくてzlibを使うとかね。
全てにそういうのがあるわけじゃないだろうけど。
485:デフォルトの名無しさん
08/01/09 17:44:08
>>463
ライブラリ詰め合わせとかがあると便利なんですけど
誰かマジレスお願いします。
486:デフォルトの名無しさん
08/01/09 17:44:36
>>466
//配列へのポインタ--簡単な例
#include <stdio.h>
int main(void)
{
int a[4][10]; // 配列
int i, j;
int (*p)[10]; // 配列へのポインタ
//配列へ代入
for(i=0;i<4;i++) {
for(j=0;j<10;j++) {
a[i][j]=(i+1)+(j+1)*10;
}
}
//ポインタを使って表示する
for(p=a;p<a+4;p++) {
for(i=0;i<10;i++) {
printf("%3d ",(*p)[i]);
}
printf("\n");
}
return 0;
}
487:デフォルトの名無しさん
08/01/09 17:46:51
>ライブラリ詰め合わせ
そりゃいくらでもあるぞ。目的も環境も判らんからなんとも言えんが。
488:デフォルトの名無しさん
08/01/09 17:49:23
>>485
割とまじめに答えたんだがな
存在するなら
欲しい機能名 ライブラリ
で適とーにぐぐれば見つかるだろ
いろんなライブラリが片っ端から詰め合わせてあるのが欲しいとか?w
ねーよwwwww
489:デフォルトの名無しさん
08/01/09 17:49:55
アーカイバの展開なら00AM型Susieプラグインがメモリストリームからの展開サポートしてるのにね。
490:デフォルトの名無しさん
08/01/09 19:09:33
FILE_ATTRIBUTE_TEMPORARYを付けてCreateFileして、
Windowsにバッファフラッシュされないことを期待。
491:デフォルトの名無しさん
08/01/09 19:34:13
>>488
ここ2、3年新しいライブラリとかは作られていないんですかね。
携帯全盛期でほとんどプログラム終わってると困るんですけど。
キャノンの説明受けに行くのでちょとでも関係あることあればいいんですけどね。
492:デフォルトの名無しさん
08/01/09 19:44:08
「キャノン」って書いてる時点で
493:デフォルトの名無しさん
08/01/09 20:17:43
ぶっちけた話C++でformに写るようにするには
VBしかないんでしょうか。
494:デフォルトの名無しさん
08/01/09 20:23:37
画像表示さえできればボンバーマンくらいはすぐできるだろう
今ならjavaとかが手軽でいいんじゃないか
495:デフォルトの名無しさん
08/01/09 20:31:41
VC2005で簡単にゲーム作ってみようと思ったんですが、
getch()でキーコード受け取ったら、カーソルキーが全部224で判別できないんです。
これをどうにかして識別する方法を教えてください。
別にgetchに拘らなくてもいいですが、出来ればC/C++の標準ライブラリに入っているものだと嬉しいです
496:デフォルトの名無しさん
08/01/09 20:38:13
>>491
488が否定しているのは詰め合わせのようなものの存在を否定しているだけだぞ。
497:デフォルトの名無しさん
08/01/09 21:01:59
>>495
そもそも getch は標準関数じゃない
498:デフォルトの名無しさん
08/01/09 21:11:49
>>495
とりあえず「ゆきいるか」でググってLunaでも使っとけばいいと思う。
499:デフォルトの名無しさん
08/01/09 21:24:35
>>491
Qt でも使ってみたら。
500:デフォルトの名無しさん
08/01/09 21:26:00
>>495
カーソルキーは二つのコードが送られてくる気がする
224 が制御コードで続くコードでカーソル方向が判別できるはず
501:495
08/01/09 21:31:18
回答ありがとうございます。getchって標準ライブラリじゃなかったんですか、初めて知りました…
>>498
あんまり外部のライブラリ使いたくなかったんです。ちょっと試しにやってみようかって程度だったので。
>>500
その発想は有りませんでした。試してみたら確かに取得出来ました!
502:デフォルトの名無しさん
08/01/09 21:40:54
URLリンク(msdn2.microsoft.com)
↑のページに書いてあるコードで、一度
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
と定義してから
#define new DEBUG_CLIENTBLOCK
と定義し直す意味って何かあるのでしょうか
503:デフォルトの名無しさん
08/01/09 21:59:54
new( _CLIENT_BLOCK, __FILE__, __LINE__)っていう文字列にトラウマがあって使いたくないんじゃね
504:デフォルトの名無しさん
08/01/09 22:01:23
>>493
・CLI+Windows.Form
・VCL
505:デフォルトの名無しさん
08/01/09 22:38:12
>>502
ヘッダファイル内で new が置換されると困るだろ?
506:デフォルトの名無しさん
08/01/09 22:39:46
困るってのは、具体的に言えば operator new あたりが一番困る。
507:デフォルトの名無しさん
08/01/09 23:05:08
レスありがとうございます。おおよその目的がわかりました。
newを使うファイルでいちいち
#define new DEBUG_CLIENTBLOCK
を定義するのがめんどくさそうですね
508:デフォルトの名無しさん
08/01/09 23:06:40
それ専用のヘッダファイルを用意するとか。
最後にインクルード。
509:448
08/01/09 23:13:00
>>458
なにからなにまでありがとうございます。。いじくってみます。
>>476
そのへん調べてみます
510:デフォルトの名無しさん
08/01/09 23:14:35
STLにたどりつかねぇ、焦っちゃダメだ・・基礎がおろそかになる
511:476
08/01/09 23:54:28
>>509
すまん、今試したらTは何の関係も無かったw
何でエラー出てたんだっけな……
512:476
08/01/10 00:03:07
連投すまん、うちのエラーはLPCSTRでC++としてコンパイルした時だった(LPSTRならコンパイル通る)
つまり少なくとも>>448みたいにCがついていないのじゃ関係無かったすまん
513:448
08/01/10 00:14:32
わかりました。わざわざ教えてくれてすいません
514:デフォルトの名無しさん
08/01/10 00:22:38
>>448
よかった。まだ見てたか。将来、今までにない斬新なゲームを作ってくれ。
こういうことは、ゲ製板 URLリンク(pc11.2ch.net)
のほうが、いいと思う。
DXライブラリ 総合スレッド
スレリンク(gamedev板)
515:デフォルトの名無しさん
08/01/10 00:41:38
>>502見当違いかもだけど
_CLIENT_BLOCK, __FILE__, __LINE__
↑こいつらがどっかで定義されてるマクロだとするとその中身を展開するには
一回newをDEBUG_CLIENTBLOCKにしてからnew( _CLIENT_BLOCK, __FILE__, __LINE__)にしないといけないんじゃないか?
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)だと
以前に
#define _CLIENT_BLOCK 何か
ってのがあっても、一回のマクロ展開ではnew( _CLIENT_BLOCK, __FILE__, __LINE__)が出るだけで
_CLIENT_BLOCKがそのまま展開されずに残るって言う・・・
試してないけどね!!
516:デフォルトの名無しさん
08/01/10 00:44:54
以下の文字列があったとします。
AB AA ABCA BA BB
この中かからABCが含まれているか検査したいのですが
どうやって実現すればいいのでしょうか
strstrだとABCAのABCに部分一致してしまうので使えないと
思うので困ってます
517:デフォルトの名無しさん
08/01/10 00:49:35
文字列の最後に空白をくっつけて
ABC空白 で探せばよくね?
518:デフォルトの名無しさん
08/01/10 01:43:28
>>512
WinMainは<windows.h>のさらにどっか奥でプロトタイプ宣言が為されているので、
それと合わないとそういう風にエラーになってしまう。
519:519
08/01/10 01:44:30
書き忘れた。
多重定義にならず、エラーになるのはextern "C"が付いているため。
520:デフォルトの名無しさん
08/01/10 01:58:56
>>516
その例だと「AB AA ABCA BA BB」のなかに「ABC」という文字列はなかったとしたいのか?
だとするならばstrcmpでよくね?
521:520
08/01/10 02:01:15
書いた後に気づいた。char str[] = "AB AA ABCA BA BB";ってことか。
char * str[] = { "AB", "AA", "ABCA", "BA", "BB" };だと思った。
セパレータが固定されてるなら>>517でよさそうだね。
ただし、後ろだけじゃなくて前後につけなきゃだめだけど。
522:デフォルトの名無しさん
08/01/10 02:04:11
>>516
正規表現ライブラリを使ってみるととか
523:デフォルトの名無しさん
08/01/10 02:26:09
オタだとばれない程度のプログラムってどんな物があるんでしょうか。
524:デフォルトの名無しさん
08/01/10 02:30:31
>>523
中途半端なプログラムではなく、きっちりしたプログラムならヲタだと思われない。
また、言語知識以外にも専門的な知識が必要になるプログラムなら確実に思われないだろうな。
たとえば、半導体のキャリア輸送をシミュレートするプログラムとか。
525:デフォルトの名無しさん
08/01/10 02:38:51
他には何かないのか。
526:デフォルトの名無しさん
08/01/10 03:09:30
以下のソースがコンパイル通りません。
色々とそぎ落としてこうなったのですが、どこが間違ってるのでしょうか?
誰か助けて~
#include <iostream>
#include <queue>
using namespace std;
class event {
int priority;
public:
event() { priority = 0; }
bool operator<(const event &a);
};
bool event::operator<(const event &a) {
return this->priority < a.priority;
}
int main() {
priority_queue<event> q;
return 0;
}
527:デフォルトの名無しさん
08/01/10 03:12:25
>>526
デバッグを他人に丸投げしたいのでなければ、エラーメッセージくらい張れ。
528:デフォルトの名無しさん
08/01/10 03:50:09
>>527
すいません。以下です。コンパイラはlinuxのg++です。
意味があるのは最後の4行だと思うのですが、それでも意味が分からん。。。
$ g++ test.cpp
/usr/include/c++/4.2.1/bits/stl_function.h:
In member function 'bool std::less<_Tp>::operator()
(const _Tp&, const _Tp&) const [with _Tp = event]':
/usr/include/c++/4.2.1/bits/stl_heap.h:279:
instantiated from 'void std::__adjust_heap
(_RandomAccessIterator, _Distance, _Distance, _Tp, _Compare)
[with _RandomAccessIterator = __gnu_cxx::__normal_iterator
<event*, std::vector<event, std::allocator<event> > >,
_Distance = int, _Tp = event, _Compare = std::less<event>]'
/usr/include/c++/4.2.1/bits/stl_heap.h:404:
instantiated from 'void std::make_heap(_RandomAccessIterator,
_RandomAccessIterator, _Compare) [with _RandomAccessIterator
= __gnu_cxx::__normal_iterator<event*, std::vector<event,
std::allocator<event> > >, _Compare = std::less<event>]'
/usr/include/c++/4.2.1/bits/stl_queue.h:353: instantiated from
'std::priority_queue<_Tp, _Sequence, _Compare>::priority_queue
(const _Compare&, const _Sequence&) [with _Tp = event,
_Sequence = std::vector<event, std::allocator<event> >,
_Compare = std::less<event>]'
samp50.cpp:14: instantiated from here
/usr/include/c++/4.2.1/bits/stl_function.h:227:
error: passing 'const event' as 'this' argument of
'bool event::operator<(const event&)' discards qualifiers
529:デフォルトの名無しさん
08/01/10 03:59:44
const忘れてるぜ
530:デフォルトの名無しさん
08/01/10 04:01:44
- bool operator<(const event &a);
+ bool operator<(const event &a) const;
- bool event::operator<(const event &a) {
+ bool event::operator<(const event &a) const {
531:デフォルトの名無しさん
08/01/10 04:02:27
>>529
えっ,どこですか?
priority_queue<const event>
としてみたのですがダメ。(コンパイル通らず)
532:デフォルトの名無しさん
08/01/10 04:06:19
>>530
コンパイル通りました!
でも意味わかんねえス。今まで演算子のオーバーロードでそんなところに
constつけたことなかったよ。どういう意味ですか?
533:デフォルトの名無しさん
08/01/10 04:06:26
笑ってしまっていいのだろうか……
534:デフォルトの名無しさん
08/01/10 04:07:17
笑えよ・・・
535:デフォルトの名無しさん
08/01/10 04:10:32
>>533,534
だんだん自分でも怖くなってきた。もしかして自分は、すごく基本的なことを
知らないとか言ってる?
536:デフォルトの名無しさん
08/01/10 04:11:30
.>>528
そのoperator<()が非constメンバだから、非constなオブジェクトからは呼び出すことができない。
書き換えを伴わないメンバ関数は、全てconstメンバにしておくべき。
537:デフォルトの名無しさん
08/01/10 04:11:58
うぜぇな
URLリンク(www.google.co.jp)
これでも見てろ
538:デフォルトの名無しさん
08/01/10 04:12:13
> 演算子のオーバーロードでそんなところにconstつけたことなかった
「演算子のオーバーロード」を「メンバ関数」に置き換えても、やっぱり同じことが言えるんだとしたら、
かなり基本的なことを学び損ねてると思う。
そうでないなら、まぁちょっとした誤解だから、すぐ知識の修正もできるだろうけど。
539:デフォルトの名無しさん
08/01/10 04:24:38
bool operator<(const &TYPE)const;じゃないとダメなのはpriority_queueの問題でしょ
あと
>そのoperator<()が非constメンバだから、非constなオブジェクトからは呼び出すことができない。
「constなオブジェクトからは呼び出すことができない」じゃね
540:デフォルトの名無しさん
08/01/10 04:38:54
>>537
微妙・・・
541:デフォルトの名無しさん
08/01/10 04:48:34
priority_queueは内部でstd::lessを使うんだが、これが>>526の場合は
bool less(const event &a, const event &b){ return a < b; }
こんな感じなので、eventクラスのoperator<がconstメンバ関数じゃないとエラーになる
542:デフォルトの名無しさん
08/01/10 05:41:08
>>536-541
色々こんな時間にありがとうございます。
自分の中ではとりあえず、
「priority_queue用に独自classに<(less)を定義する時は、引数と関数にconstをつける必要あり」
というルールで記憶することにしました。そして、
かなり基本的なことを学び忘れているようなので、とりあえず関連記事探して独習c++でも逝っときます。
関数にconstをつけるのは本当に知らなかった。メンバ変数にconstをつけるのは
意味なし、くらいに思っていたし。。
関数にconstつけるのは、メンバ変数を変更しない、という意味でいいんですよね?
あと、537が書いてくれたリンクはわかりやすかったんですけど、540の微妙…という
コメントは、どうしてですか?
543:Gori
08/01/10 05:46:34
これら どの様な違いが有るのでしょうか?
Microsoft Visual C++ 6.0 Standard Edition
Microsoft Visual C++ 6 Professional
Microsoft Visual C++ 6.0 Enterpris
544:つらいぜ独学
08/01/10 06:45:35
ちょっと質問です。
#include<stdio.h>
void aaa(int test){
int i = 1;
if(test == 5)
return;
printf("あ");
test += i;
aaa(test);
printf("え");
}
int main(void){
int test = 0;
aaa(test);
return 0;
}
の結果を あああああえ になるかと思ってたんですが、
実際は あああああえええええ でした。
これは何ででしょうか?
545:デフォルトの名無しさん
08/01/10 07:05:59
aaa()に入ったら、引数が5でないかぎり
printf(え)を実行するじゃん。引数が5になるまで、
aaa()は5回呼ばれる。
546:デフォルトの名無しさん
08/01/10 08:23:17
>>544
再帰関数の中で、再帰する前の処理をA、自分自身の呼び出しをB、再帰した後の処理をCとすると
その再帰は(ABC)になってるわけだろ。
で、ここのBをまた(ABC)に置き換えて…ってのを5回(4回か?数えるのメンドクセ。)やって
最後のときはBを消すって形で終わってるから最終的な形としては
(AAAAACCCCC)になる。
547:536
08/01/10 10:25:10
>>539
そうそう、間違えた。訂正感謝。
>>542
微妙。まともじゃない解説をしているサイトも検索されるから。
548:デフォルトの名無しさん
08/01/10 12:11:58
// ABase.h
class ABase {
public:
typedef std::vector<B> VectorB; // Bは完全型でなくてはいけない?
virtual VectorB::iterator F(const VectorB& vec)=0;
...
}
// B.h
template <...> // テンプレートクラスのため.hと.cppにわけることができない
class B {
public:
void F() {
pABase_->...; // ABaseの関数を呼び出す
...
}
private:
ABase* pABase_;
};
ABaseはBの定義が必要、BはAbaseの定義が必要という状態になってしまい、困っています。
こういった循環参照を避ける手法はないでしょうか?
549:デフォルトの名無しさん
08/01/10 12:17:13
質問させてください。
C++言語で
interface A {
virtual void MesA() = 0;
};
interface B {
virtual void MesB() = 0;
};
interface C : public A,public B {};
class D : public C {
public:
void MesA() { printf("A class\n"); }
void MesB() { printf("B class\n"); }
};
int main() {
D d;
void *p = (D *)&d;
B *bbb = (B *)p;
B->MesB();
}
こうするとAのMesAのメソッドが呼ばれてしまいます。
Cの中身は空ですが、他のメソッドが書かれています。(このサンプルでは関係ないと思うので空にしました)
変数pを一度C型にキャストしてからB型にキャストするとうまくいくのですが、
なるべく、そうはしたくないので困っています。
原因、解決策のわかる方教えてください。
環境
Visual Studio 2003 .NET
2005でも同じでした。
改行が多すぎるとエラーが出たのでみずらくてすいません。
550:デフォルトの名無しさん
08/01/10 12:47:53
>>548
これでどうかなぁ
でもかなり無理矢理な感
// ABase.h
#include "B.h"
#ifndef ABase_h
#define ABase_h
class ABase {
...
};
#endif
// B.h
#ifndef B_h
#define B_h
class ABase;
template <...>
class B {
public:
void F();
private:
ABase* pABase_;
};
#include "ABase.h"
template <...>
void B<...>::F() {
pABase_->...;
};
#endif
551:デフォルトの名無しさん
08/01/10 12:54:24
>>549
void*を元と異なるクラスにキャストしてるのが原因かと
>void *p = (D *)&d;
>B *bbb = (B *)p;
ここ(pはD*なのかB*なのか??)を
void *p = (B *)&d;
B *bbb = (B *)p;
とする(pはB*を保持)か、あるいは
void *p = (D *)&d;
B *bbb = (D *)p;
とする(pはD*を保持)
552:548
08/01/10 13:17:57
>>550
レスthx
しかし、できれば書きたくないコードですね。
設計を見直した方がいいのかなぁ。
553:デフォルトの名無しさん
08/01/10 13:47:15
>>552
こういう風にしてみるとか
// ABase.h
#include "Bdecl.h"
class ABase { ... };
// Bdecl.h
class ABase;
template <...>
class B { ... };
// Bimpl.h
template <...>
void B<...>::F() { ... };
// B.h
#include "ABase.h"
#include "Bimpl.h"
554:デフォルトの名無しさん
08/01/10 14:38:23
標準偏差を求める計算式はどのようにしたらいいでしょうか?
555:デフォルトの名無しさん
08/01/10 14:43:15
ググレカス
556:デフォルトの名無しさん
08/01/10 14:57:59
レスありがとう御座います。
説明不足の部分がありましたので、補足させて頂きます。
実際この処理を使う場面では
//interface AはA.hに定義
//interface BはB.hに定義
//callbackA.cpp
#include "A.h"
void callbackA(void *p) {
A *a = (A *)p;
a->MesA();
}
//callbackB.cpp
#include "B.h"
void callbackB(void *p) {
B *b = (B *)p;
b->MesB();
}
引数pにはDクラスのアドレスが入っているとします。
このように
callbackA.cpp中ではAのinterfaceのみが公開され、
callbackB.cpp中ではBのinterfaceのみが公開されるようにしたいのです。
やはり>>551さんのようにcallbackソースの中でDやCの定義を公開して
キャストするしかないのでしょうか?
説明不足で申し訳ありませんでした。
557:デフォルトの名無しさん
08/01/10 15:24:17
>>556
callbackAを呼ぶときはpにはA*をvoid*にしたものを渡せばいいし
callbackBを呼ぶときはpにはB*をvoid*にしたものを渡せばいいが
どうしてもpにはD*を渡したいけどDは公開できないというのはわりと無理め
いくらか妥協するなら例えば
class Z {
virtual void dummy(){}
};
みたいなダミーを用意して
class D: public C, public Z { ... };
としてDにZを継承させ
void callbackA(Z *p) {
A *a = dynamic_cast<A *>(p);
a->MesA();
}
って方法もある
引数の型を変えたくないなら
void callbackA(void *p) {
A *a = dynamic_cast<A *>((Z*)p);
a->MesA();
}
とか
558:デフォルトの名無しさん
08/01/10 15:24:55
cでは変数のアドレスを表示するときに
printf("%p", i);
とかやってましたが、これをcout <<
でやるにはどうすればよいでしょうか?
559:デフォルトの名無しさん
08/01/10 15:34:09
>>558
basic_ostream& operator<<(const void*)
が定義されてるから、
cout << static_cast<void*>(i);
だな。
560:デフォルトの名無しさん
08/01/10 16:04:19
>>559
ありがとうス。実際は
void func(T& a)
{
cout << static_cast<void *>(&x);
...
}
としました。
561:デフォルトの名無しさん
08/01/10 16:13:28
うわ、ありえねぇ。
562:デフォルトの名無しさん
08/01/10 16:59:17
変数xが1~6の間ならって表現したいなら
if(1<=x<=6){
でいいのでしょうか?間違ってるなら正しい方法おしえてください・・