【初心者歓迎】C/C++室 Ver.10【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGただしその場合、質問者は必ず、環境を書きましょう。
【歴代スレ】
1:http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
2:http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
3:http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
4:http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
5:http://pc5.2ch.net/test/read.cgi/tech/1077102238/ (dat落ち)
6:http://pc5.2ch.net/test/read.cgi/tech/1082182233/(dat落ち)
7:http://pc5.2ch.net/test/read.cgi/tech/1086373839/(dat落ち)
8:http://pc5.2ch.net/test/read.cgi/tech/1091264964/(dat落ち)
9:http://pc5.2ch.net/test/read.cgi/tech/1094494997/l50
【ラウンジ】質問、回答が長い時はココを使うと見やすい
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html
関連スレは>>2-5ぐらい
0153vim
NGNG0154デフォルトの名無しさん
NGNGずらしたい行を選択してTAB。左にずらすときはShift+TAB。
0155デフォルトの名無しさん
NGNG>>154
お返事ありがとうございます
うまいこといきました
0156デフォルトの名無しさん
NGNG}else{
}
みたいに最初の { を if() の右側に書いてしまうのは
エディタのことを考えると良くない書き方なんでしょうか?
0157デフォルトの名無しさん
NGNGif文はいつもそんな感じで書きますが。
0158デフォルトの名無しさん
NGNG{
};
f()
{
}
if (x) {
}
else {
}
try {
} catch (a) {
} catch (...) {
}
これ以外は認めない。
0159デフォルトの名無しさん
NGNG{
}
else
{
}
try
{
}
catch( a )
{
}
catch(...)
{
}
だな、俺は。
0160デフォルトの名無しさん
NGNGだから修正するまでと書いただろう。読めないのか?
0161デフォルトの名無しさん
NGNGofstreamへコピーしたいのですが簡単に書く方法はありますでしょうか?
// ifsの[offset, pos)をofsへコピーしたい
size_t offset, pos;
ifstream ifs;
ofstream ofs;
.....
ifs.seekg(offset);
// ofs << ifs.rdbuf(); <-ifsを最後まで読むだけならこれで良いんですが・・・
大きなデータなのでバッファをちゃんと扱わないとマズイです。よろしくお願いします。
0162161
NGNG0163デフォルトの名無しさん
NGNGどう解決したのか教えてください。
0164161
NGNGostreambuf_iterator<char> oit(ofs);
for(size_t i = 0; i < pos - offset; ++i, ++iit, ++oit){
*oit = *iit;
}
か,もしくは
int meta;
streambuf *isb = ifs.rdbuf();
streambuf *osb = ofs.rdbuf();
meta = isb->sgetc();
osb->sputc((char)meta);
for(size_t i = 0; i < pos - offset - 1; ++i){
meta = isb->snextc();
osb->sputc((char)meta);
}
としました.問題があるとか,もっと良い方法があるとかあったら指摘お願いします.
0165デフォルトの名無しさん
NGNG俺もいろいろ考えたけど、たぶんその前者が最適解でしょうな
0166デフォルトの名無しさん
NGNGstd::copy使えよ
0167デフォルトの名無しさん
NGNGどうやるの?
0168デフォルトの名無しさん
NGNGadvance(iit, pos - offset);
copy(iit, end, oit);
かな
0169デフォルトの名無しさん
NGNGそれ動く?
0170デフォルトの名無しさん
NGNG動かないならcopy_n関数テンプレート作ればいいし
0171デフォルトの名無しさん
NGNGiit は終了チェックしなくていいの?
0172デフォルトの名無しさん
NGNGISO/IEC 14882:1998
24.5.3 Template class istreambuf_iterator
-3
Note that in the input iterators, ++ operators are not equality preserving,
that is, i == j does not guarantee at all that ++i == ++j. Every time ++ is
evaluated a new value is used.
24.5.3.5 istreambuf_iterator::equal
-1
Returns: true if and only if both iterators are at endofstream, or neither is
at endofstream, regardless of what streambuf object they use.
0173デフォルトの名無しさん
NGNGreadとwriteで繰り返して操作した方が効率がいい。
0174164
NGNG>168
istreambuf_iteratorはInputIteratorで入力を一度しかトラバースできないので
advanceは使えないかと思います.
>170
実は作ってたんですが171さんの言うように終了判定を考えると
copy_nの利用は危なそうだなと思ってやめました.
>171
省略してました.実際やるとしたら
for(size_t i = 0; i < pos - offset && iit != istreambuf_iterator<char>(); ++i, ++iit, ++oit){
...
な感じでしょうか?
>173
試してみます.
0175デフォルトの名無しさん
NGNG完全な独学で勉強したのでかなりトンチンカンなことを言っているかも知れませんが、自分なりに努力をしたのでお願いします。
前にシューティングアルゴリズムマニアックスという本を買ったのですが、
http://www.amazon.co.jp/exec/obidos/ASIN/4797327316/249-0856311-3939535
この本についてくるプログラムソースは弾、自機、背景、などを違う.cppファイルに記述しています。
しかし、コンパイルすると一つのゲームとしてビルドされます。
ヘッダーファイルであればincludeの記述を行うことでインクルードされることは分かるのですが、cppファイル同士、それも種類ごとに分けて記述したcppファイルを一つにするにはどのようにすれば良いのでしょうか?
一つのファイルに記述されたプログラムを順番に分割するのであれば、分かるのですが、このようにプログラムを並べたのでは同時にプログラムが処理されてしまうのではないのでしょうか?
多分かなりとんちんかんのことを言っていると思います。
どうしても一つのプログラムをいくつものファイルに分割して記述する方法が分かりません。
0176デフォルトの名無しさん
NGNGまず、ソースファイルは必ずしも分割して書く必要はない。しかしながら、あまりにも
1つ1つのソースファイルが大きくなると、コンパイルに時間がかかるし、少し変更した
だけでも全体をコンパイルしなおさなければならなくなる。それに、大きなファイルの
内容を管理するにしても、人間の頭にも限界があるし、普通は1人ですべてのコードを
書くわけでもない。だから、ソースを分けるという考え方が出てくる。さて、当然複数の
ソースをコンパイルすると複数のオブジェクトファイルが出来るわけだが、これらは
そのまま実行されるのではなく、リンカという別のプログラムに通され、結合される。
すると、ここでやっと1つのプログラムファイルが出来上がる訳だが、複数のオブジェクト
ファイルに対して複数の同時実行が行われるわけではない。たとえば、a.objという
オブジェクトファイルにfoo()という関数があり、これをb.objの中から呼び出していると
する。複数のオブジェクトファイルがあるから当然直接呼び出せない。これを解決する
役割を担うのがリンカ。こういう複数のオブジェクトファイル間の関数等の呼び出しを
解決するのが仕事。すると、結果的にファイルは1つになる(ダイナミックリンクは除く)
でしょう?
0177デフォルトの名無しさん
NGNGいきなりゲーム開発の本なぞ読まずに
まずC/C++の入門書をきっちり仕上げろよ。
それをやってれば>>175の質問は出てこない。
ルールもろくに覚えてないうちに定石集買って
読んでも、そら分からんだろう。
0178デフォルトの名無しさん
NGNG0179デフォルトの名無しさん
NGNGGUI環境って何のこと?ネタじゃないよ。。
0180デフォルトの名無しさん
NGNG0181Ruby!!!!!!!!
NGNG0182デフォルトの名無しさん
NGNGで、GUI環境はどこが重要なの??
0183デフォルトの名無しさん
NGNG鼠が画面上で動き回ることが出来る。
0184デフォルトの名無しさん
NGNG無かったら、動き回れない…っていうこと?
0185175
NGNG家にある本ではさらりとしか解説されてなくよく分からないです。
MSDNも見ましたが余計にさっぱり分かりません。
0186デフォルトの名無しさん
NGNG>>172の
>Every time ++ is evaluated a new value is used.
この文ってTYPOですか?
おれっちの脳内じゃ
Every time ++ evaluated, a new value is used.
こちらの方が正しいような気がするんだけど。どう?
0187デフォルトの名無しさん
NGNGエロDVDが見れる。ヌケル。そして、彼女要らず。
0188デフォルトの名無しさん
NGNGj2sdk-1_4_1-windowsi586をインストールし、パスの設定を行った後に、サンプルアプリを動かそうとしたのですが、ダメでした……
「%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\ATI Technologies\ATI Control Panel;C:\Program Files\pcdNavi\bin;C:\Program Files\Fujitsu\sa\dll;;C:\Program Files\Sonic\MyDVD」
がパスの変数値の最初の設定でした。
この末尾に「C:\j2sdk1.4.0_01\bin」と付け足したのですが、サンプルは動かないんです……
0189188
NGNG0190デフォルトの名無しさん
NGNGevaluateするのは誰?
0193デフォルトの名無しさん
NGNGリンカについては知らんけど、>>177が言うように、C/C++の入門書で、基本をきっちりしたほうがいいよ。
俺も完全独学で、最初いきなりDirectXから入って、参考書のサンプルいじくって一応は動いてたど、
やっぱ不安なので猫さんのとこで基本勉強したら解るようになった。
いや、俺も昔分割コンパイルに疑問持ってたから、人事に思えなくてw
0194デフォルトの名無しさん
NGNGEvery time ++ is evaluated, a new value is used.
のコンマが省略されたんだと思われ。
0196デフォルトの名無しさん
NGNG//行列の表示
#include <stdio.h>
void show(int s[][3],int row);
void main(){
int a[][3]={10,20,30,40,50,60};
int i,j,row;
show(a,2);
void show(int s[][3],int row);
for(i=0;i<row;i++){
printf("| ");
for(j=0;j<3;j++){
printf("%d ",a[i][j]);}
printf("|\n");}}
色々試したのですができませんでした、原因をお教えいただけませんか。
0197デフォルトの名無しさん
NGNGvoid文って何?
一見めちゃくちゃなコードに見えるけどvoid文が何なのかわからないのでうかつにつっ込めない・・・。
0198デフォルトの名無しさん
NGNG0199196
NGNGとかって聞いたのですが。
・・・滅茶苦茶なのかorz
0200デフォルトの名無しさん
NGNGもうむちゃくちゃすぎ。
想像で補って書いてみたが、
こういうことをしたかったのか?
#include <stdio.h>
void show(int s[][3],int row)
{
for(int i=0; i<row; i++)
{
printf("| ");
for(int j=0; j<3; j++)
printf("%d ", s[i][j]);
printf("|\n");
}
}
int main(void)
{
int a[][3] = {10,20,30,40,50,60};
show(a, 2);
return 0;
}
0201デフォルトの名無しさん
NGNG関数をラベルのように定義するその書き方は何かのコンパイラの拡張?
#include <stdio.h>
void show(int s[][3],int row);
void main()
{
int a[][3]={10,20,30,40,50,60};
show(a,2);
}
void show(int s[][3],int row)
{
int i,j;
for(i=0;i<row;i++)
{
printf("| ");
for(j=0;j<3;j++)
{
printf("%d ",s[i][j]);
}
printf("|\n");
}
}
void文って、
void()
のこと?
0202デフォルトの名無しさん
NGNGヒント:以下はごく自然なCのコード。
$include <stdio.h>
void show_string (const char *str);
int main (int argc, char *argv[]) {
show_string("hello.");
return 0;
}
void show_string (const char *str) {
puts(str);
}
0203デフォルトの名無しさん
NGNGそういうエラーって{}がちゃんとなってなかったりしても出る
ガンガレ!
0204デフォルトの名無しさん
NGNGどうみても>>196はそれ以前の問題だろ
0205デフォルトの名無しさん
NGNG関数内関数を使えてたね。
# あと,よくわかんない反復子の仕組みもあったし。
# 今で言う「イテレータ」とはなんかちょっと違う概念だった気もするけど。
0206デフォルトの名無しさん
NGNG> $include <stdio.h>
(´ι_`)
あげあしでスマソ。
マジでこれで悩む初心者とかいたらいけないので念のため指摘。
0207デフォルトの名無しさん
NGNG関数内関数ってPASCALみたいな感じ?
0208デフォルトの名無しさん
NGNG「文」という言葉の使い方が変。
式と文と関数はそれぞれ別の概念だ。
「戻り値 void の関数を書いたのですが」あたりじゃないかと思われ。
で、関数の定義の仕方が滅茶苦茶。
・関数の中で関数の定義はできない(独自拡張で可能な処理系もあるが)。
・2回目の void show(int s[][3],int row); ←のセミコロンは何よ?
0209デフォルトの名無しさん
NGNG自分でやっといてワラタ
っていうかもう寝ようw
>>207
うん。細かい仕様は忘れたけど,便利だった。
High-C は C コンパイラのくせに,C++ みたいに変数をどこででも
宣言できたりしてた。
0210196
NGNGありがとうございます、もう一度一からやってみます。
0211デフォルトの名無しさん
NGNGほかのところが間違いまくってる。
0212デフォルトの名無しさん
NGNG引数なんかC99風の最新規格を使っときながら
なんでそんなに滅茶苦茶で異常なコードを書いてしまうのかわからん。
0213デフォルトの名無しさん
NGNGEXEの設定を弄くることは出来ますか?
例えばあるEXEが起動するとき「開始します」とかの表示を「開始するぞゴルァ」
みたいなのは出来るんですか?
またEXEを弄くるソフトは何ですか?
0214デフォルトの名無しさん
NGNG0215デフォルトの名無しさん
NGNG0216デフォルトの名無しさん
NGNG板違い。
そういうソフトを作りたいのならこの板でかまわんけど。
0217デフォルトの名無しさん
NGNG文字列がリソースとして定義されているならResource Hackerかな。
でなけりゃ資料を見ながらバイナリエディタで書き換えるかOllyDBGとかのデバッガつかうか。
しかし素人にはオススメできない。
0218デフォルトの名無しさん
NGNGありがとうございました
0219196
NGNG実行してみたら、やりたい通りになってました、ありがとうございます
>201
voidを使って行列を書いてみる、というのが課題でして・・・
voidの使い方とか、webで調べたんですが、何か勘違いしたヨウで・・・
>202
charというのはまだちょっと分らないので、あとで調べてみます
>208
セミコロンは間違えて付けてしまったものです、すいません
0220デフォルトの名無しさん
NGNGnew で確保したメモリ領域は、delete で開放しろと、
いろいろな解説ページで見たのですが、
開放しないままプログラムが終了すると、どうなるのでしょうか?
簡単なプログラムを作って試してみたところ、
プログラムが終了した時点で、メモリは開放されているようなのですが、
プログラム終了時にわざわざ delete でメモリを開放する処理を入れる必要はあるのでしょうか?
0221デフォルトの名無しさん
NGNG開放しないと、メモリリークが起こる。
そうなるとフリーズしたり、いろいろ障害がでる、と聞いてる。
newだけがメモリを確保するのではなく、グローバル変数などもメモリを確保している。
プログラムが終了したときに開放されたのは、そういった変数だと思う。
って、俺もちょっと曖昧なので他の人、修正・補足お願い。
0222デフォルトの名無しさん
NGNG「malloc()して(プログラム終了時に)free()しない」、なら、百歩譲って許せなくもないが、
deleteはメモリの開放だけでなく、デストラクタの実行も担っているから、
絶対に省略はあり得ない。
0223デフォルトの名無しさん
NGNG自動で解放してくれるけどね。
でもいちいち
「このオブジェクトは delete しなきゃいけない。
このオブジェクトはただのメモリの塊だから delete しない。
こっちのは……どうだっけ?」
とか考えるの('A`)マンドクセ
0224233
NGNG要するに、delete が必要か不要かを考えたり
あまつさえ省略しようと企んだりするのは
激しく徒な遠回りだよって事。
0225223=224
NGNGつーか盛れが抱えてる問題が解決しねーし。イラつく。もう寝ようっと。
0226デフォルトの名無しさん
NGNGデストラクタの実行を無視すれば、
小規模なプログラムなら終了時にまとめてメモリ解放
でもなんとかなると思うが、ある程度の規模になると
いらないデータがメモリを占有しつづけるのは非効率的
になってくる。
GCが信頼できる環境でないかぎりは解放するのが無難。
普通のプログラマなら「開けたら閉める」
ってのは普通の感性じゃないかなぁ。
0227デフォルトの名無しさん
NGNG>voidを使って行列を書いてみる、というのが課題
行列(を格納した配列)をvoidポインタで渡すようにして
ルーチンを汎用化するって意味ではないかと思った。
だとすると >>196 はまったく的外れ。
行列の幅を固定しちゃってるし。
おそらく課題はC言語で書くことだと思うけど、
念のため補足しておくとCとC++では作法が結構違う。
C++ならそれの実現のためにvoidポインタを使うべきではない。
0229デフォルトの名無しさん
NGNG終了時のdeleteなんか時間のムダ
もし省略するとシステムにダメージを与えるような
処理をデストラクタ内で行なっているならば、それは設計ミス
そういうたぐいの後始末は専用の関数かなんかにして
シグナルハンドラで呼び出すのが正しい
だから必要なdeleteなどなく、何も考えずに終われって事だ
0230デフォルトの名無しさん
NGNG0231デフォルトの名無しさん
NGNGfloat a = 1.23456f;
int b;
b = *((int*)&a);
みたいなことを、変数aを使わずに b = ... のように行いたいのです。
int は float とデータサイズは同じと考えていただいて結構です。
0232デフォルトの名無しさん
NGNG0234186
NGNG186そのままだった。はずかしいーーー。
0235231
NGNGありがとうございます。
すみませんが、もう一つ質問がありまして、
struct {
int type;
union {
int idata;
float fdata;
} data;
} tdata;
tdata sample_data[] = {
{ 1, 20 },
{ 2, 3.456f },
{ 1, 123 },
:
};
のように初期化したいのです。
メンバ"type"は、メンバ"data" の型を表し( 1ならint、2ならfloat など)、
メンバ"data"には int あるいは float の値が入ります。
union を使用すると、初期化時には最初の型(この場合、idataの型=int)で初期化せねばならないようで、
上のリストのように初期化することができず、また、>>232 のような方法でも書くことができません。
どうしたらよいのでしょうか。
0236デフォルトの名無しさん
NGNG値は int i; *(float*)&i=,3.456f; printf("%d",i) ってやって調べろ
0237デフォルトの名無しさん
NGNG#include <stdio.h>
#include <string.h>
int main(){
char str[]="信長<><>2004/10/18 12:42:45<><>はじめまして<><>カッコイイHPですね。\nこれからちょくちょく遊びに来ますんで。\nよろしく。";
char sp[]="<><>";
char *r=NULL;
r=strtok(str,sp);
while(r != NULL){
printf(">>%s\n",r);
r=strtok(NULL,sp);
}
return 0;
}
char sp[]="<><>"の部分を
char sp[]="<>"にしても、char sp[]="k<>"にしても、同じ結果になります。
どうしてでしょうか?
0238デフォルトの名無しさん
NGNG0239235
NGNGやはりそうするしかないですかねー。そういうマクロでもあれば良いんですけど…。
あるいは、逆に全部 float で書いて、使うときに int にキャストとか。
(辻褄はあうけど、明らかに曲がったやり方だと思う)
printfするにはデータ量が膨大なので、とりあえず、前処理するツールを作って
それを通して吐き出させようかと思います。
(といっても、ホントに *.*f を 0x???????? に書き換えるだけなので、
そのために一段階増えるなんてもったいない気がしてなりませんが)
なにか他に方法があれば教えてください。
0240デフォルトの名無しさん
NGNGchar sp[]="<><>\n";
こーゆーこと?
0241デフォルトの名無しさん
NGNGmanなりhelpなりでstrtokをちゃんと調べれー
第二引数は「デリミタ文字群」だ
0242デフォルトの名無しさん
NGNGリダレクト使えば
0243デフォルトの名無しさん
NGNG0244デフォルトの名無しさん
NGNGバグを単離して同定することすら難しくなってきた
デバッグするときのこつを教えてください
再現性のあるバグなら予想はつくんだけど
なかなか再現性が見いだせないバグはやっかいだね…
0245デフォルトの名無しさん
NGNG作成していますが、その内部で、
printf("%I64d\n", i64);
が表示できず、そのままI64dと表示されます。
i64は「__int64」で定義しています。
これを64bit値で正しく表示するにはどうすればいいですか?
あと、演算結果を__int64の型の変数に入れたにもかかわらず、
2の31乗を越えた値がマイナスになります。これはどうしてですか?
0246デフォルトの名無しさん
NGNGstd::auto_ptr<int> p2(p);
std::auto_ptr<int> p3(new int);
std::auto_ptr<int> p4(p3.release());
VC6付属のSTLではp2, p4に所有権が移動するだけでポインタ値は残るのですが
STLPortではp, p3のポインタ値が空になります。
どちらの振る舞いが正しいのでしょうか…
0247デフォルトの名無しさん
NGNG>あと、演算結果を__int64の型の変数に入れたにもかかわらず、
>2の31乗を越えた値がマイナスになります。これはどうしてですか?
intで計算してるんだろ。__int64に格上げしてやれ。
0248デフォルトの名無しさん
NGNGauto_ptrの仕様でもよみな。
ちなみVC6のC++の挙動を正しいと思わんことだ。
0249246
NGNGttp://www.hey-to.net/ML-archive/vcppML/2000/msg07069.html
0250デフォルトの名無しさん
NGNG0251245
NGNG明確に(__int64)でキャストは行っているのですが・・・。
おそらく__int64で定義されているにもかかわらず、32bit
という扱いにされていると思うのですが・・・。
0252デフォルトの名無しさん
NGNGI64の所も含めて、小細工せずにコピペで
■ このスレッドは過去ログ倉庫に格納されています