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

スレを勃てるまでもないC/C++の質問はここで 5

レス数が1000を超えています。これ以上書き込みはできません。
0001 ◆h6A7qfFFu6 2008/12/29(月) 11:05:07
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
スレを勃てるまでもないC/C++の質問はここで 4
http://pc11.2ch.net/test/read.cgi/tech/1221633708/
0910デフォルトの名無しさん2009/01/08(木) 20:38:10
>>909
memmoveとか使うといいみたいですけど、
クラシックにやってみます
0911デフォルトの名無しさん2009/01/08(木) 20:58:01
n番目を削除するとして
for (i = n + 1; i < sizeof word / sizeof word[0]; ++i)
{
strcpy(word[i - 1], word[i]);
}
ソートはこれでいいだろとりあえず
qsort(word, sizeof word / sizeof word[0], sizeof word[0], (int(*)(const void *, const void *))strcmp);
0912デフォルトの名無しさん2009/01/08(木) 21:01:31
最後の要素(n=9)を削除すると、領域外をアクセスしちゃうよ(^o^ )
0913デフォルトの名無しさん2009/01/08(木) 21:34:26
static void print_ascending_list(char word[][WORD_SIZ_MAX + 1], int n)
{
int i,j;
char tmpword[1][WORD_SIZ_MAX + 1];
n--;
for(i=0; i<=n; i++){
strcpy(tmpword[0], word[i]);
for(j=i; j<=n; j++){
if(tmpword[0][0] > word[j][0]){
strcpy(tmpword[0], word[j]);
}
}
printf("%2d:%s\n", i+1, tmpword[0]);
}
}

ソートについて、こんなプログラムを作ったのですが、
これだと同じ単語を何度も出力しちゃうし、よくよく考えたら二文字以降の比較をしていないんですよね、、
どうにかできませんかね?
0914デフォルトの名無しさん2009/01/08(木) 21:37:31
strcmp
0915デフォルトの名無しさん2009/01/08(木) 22:06:45
0x1000 のアドレスが10000になるみたいなのですが、どうしてでしでしょうか?

0x10は10バイトという意味があるのでしょうか?

また、buf[10000]は、どのメモリアドレスまで格納できるという意味になりますか?
0916デフォルトの名無しさん2009/01/08(木) 22:08:29
意味不明
0917デフォルトの名無しさん2009/01/08(木) 22:13:16
0x1000や0x3EFFとかいったものは何を指すのでしょうか?
また、0x33や0x3F といったものも。
0x22FF | 0xFF01 など

これはメモリアドレスなのか、10進数になるのか、それとも両方になるのか

また、buf[10000]と確保したメモリアドレス?には、どれだけのメモリアドレス範囲が入るのでしょうか?
たとえば0x44000000〜0xFF0000000とか
0918デフォルトの名無しさん2009/01/08(木) 22:18:11
>0x って何?
16進数の接頭辞

> |
OR 演算子

>メモリアドレスなのか
ただの数値。
ポインタ型にキャストすればアドレスと解釈できはするが。

>buf[10000] と〜
buf の要素の型のサイズ×10000
0919デフォルトの名無しさん2009/01/08(木) 22:22:38
>>917
0x は16進数であることを明示するプレフィックス。
よって、0x1000 とか 0x3EFF はただの数字。

| は論理和をとる演算子。
0x22FF | 0xFF01 == 0xFFFF

buf[10000] と確保したものが、実際に確保されるアドレスは基本的に実行時に決まる。
範囲としては buf の型のサイズ * 10000
0920デフォルトの名無しさん2009/01/08(木) 22:28:01
>>919
ありがとうございます。よくわからないのですが
アドレスとして0x1000 を指定したら10000らしいのですが、これはなんのことでしょうか?
また、0xはメモリのアドレスにはならないのでしょうか?
0921デフォルトの名無しさん2009/01/08(木) 22:28:43
>>920
>アドレスとして0x1000 を指定したら10000らしいのですが、これはなんのことでしょうか?
どこでそんな話を聞いたんだ?
0922デフォルトの名無しさん2009/01/08(木) 22:31:49
配列の中身ってオチじゃ?
0923デフォルトの名無しさん2009/01/08(木) 22:32:44
16ビット環境のセグメントレジスタの話なら分かるが・・・。
0924デフォルトの名無しさん2009/01/08(木) 23:13:34
>>923
セグメントレジスタならどうやってありえる?
0925デフォルトの名無しさん2009/01/08(木) 23:13:57
でもメモリアドレスって0xからはじまってますよね
あれはなんででしょうか?
0926デフォルトの名無しさん2009/01/08(木) 23:15:29
>>924
10000が0x10000の間違いだというのなら、ね。
0927デフォルトの名無しさん2009/01/08(木) 23:18:06
>920
0x1000のアドレスにあるのがたまたま10000だっただけ。
理由なんて誰にも判らん。

0xのついた16進数だろうが普通の10進数だろうがアドレスになりうる。
だが直値でアドレスを指定する意味は
メモリの解析を行いたい時を除いてほとんど無い。
0928デフォルトの名無しさん2009/01/08(木) 23:51:53
>>927
直値?直値で指定する方法とは?
でもあらかじめ決められた領域にデータを書き込む場合は値をいれますよね?
その時に、0x....といれるような

メモリマップ?とかみると0x00000〜0x100000の領域は○○をとか
0x200000〜020001000 とかには○○のプログラムに使う領域の計算値をとか

こういう場合はメモリ範囲指定しますよね
このような場合は、どうやって指定するのでしょうか?
0929デフォルトの名無しさん2009/01/08(木) 23:53:34
>>928
>>918
0930デフォルトの名無しさん2009/01/08(木) 23:54:38
>>928
なにやらすっとこどっこいな勘違いをしている気がするので具体例を出しなさい。
通常、C/C++でメモリアドレスを指定するようなプログラミングは行なわないからね。
0931デフォルトの名無しさん2009/01/08(木) 23:55:40
>>930
組み込み・ファームではやるだろ・・・常考。
0932デフォルトの名無しさん2009/01/08(木) 23:58:19
それ、通常じゃない。
0933デフォルトの名無しさん2009/01/09(金) 00:02:13
デバッガとかICEとかの使い方を教えてほしいんじゃないの?
0934デフォルトの名無しさん2009/01/09(金) 00:02:29
今の C の業務での組み込み率がどれだけ高いか。
0935デフォルトの名無しさん2009/01/09(金) 00:03:25
組み込みです。
0936デフォルトの名無しさん2009/01/09(金) 00:06:41
組み込みだとその場しのぎのコード書いてたら、そのうち頭ぶっ飛ぶよ。
0937デフォルトの名無しさん2009/01/09(金) 00:12:20
どういう風に書けばよいのでしょうか?
アドレス指定がよくわかりません
0xつけて指定するのですよね
10000の範囲を指定するにはどうすればよいのかな
0938デフォルトの名無しさん2009/01/09(金) 00:14:10
メモリの内容を確認してる時点で何もわかってないって事がバレてるってこと。
0939デフォルトの名無しさん2009/01/09(金) 00:14:18
10000って何だよ・・・。
10進数なのか16進数なのかはっきりしてくれ。
0940デフォルトの名無しさん2009/01/09(金) 00:16:44
そういう機器固有の話を聞ける人間は周りにいないのか?
0941デフォルトの名無しさん2009/01/09(金) 00:17:05
>>937
>930
0942デフォルトの名無しさん2009/01/09(金) 00:17:27
>>941
>>931
0943デフォルトの名無しさん2009/01/09(金) 00:19:38
なんにしてもソースも出せない、用語の使い分けもさっぱりじゃ
エスパーじゃないかぎり無理
0944デフォルトの名無しさん2009/01/09(金) 00:20:32
機器固有の話を聞ける人間がいないっていうより、マニュアルも読まない(理解できない)?
0945デフォルトの名無しさん2009/01/09(金) 00:21:35
マニュアルの前にアセンブラとポインタの本を読んでくれ。
あと16進について勉強汁。
0946デフォルトの名無しさん2009/01/09(金) 00:22:04
>>942
>932
0947デフォルトの名無しさん2009/01/09(金) 00:22:55
file_nameという文字列に入っているファイル名をls の引数にしてOSで実行したい場合どうすればいいですか?
system("ls -l file"); このfileの部分を変数で実行するイメージなんですが。
0948デフォルトの名無しさん2009/01/09(金) 00:24:37
>>946
>>934
0949デフォルトの名無しさん2009/01/09(金) 00:25:25
>>947
sprintf の後 system。
まあ、system よりはもっと安全な
OS 依存の関数を使った方が良いと思うが。
system は危険。
0950デフォルトの名無しさん2009/01/09(金) 00:25:44
>>947
sprintfでsystemの引数にする文字列を作るんだ。
0951デフォルトの名無しさん2009/01/09(金) 00:26:06
>>947
sprintf()その他で文字列を組み立てれば宜しい。
例えばこんな感じ。
void func(const char * fileName)
{
char buf[1000];
sprintf(buf, "ls -l %.990s", fileName);
system(buf);
}
0952デフォルトの名無しさん2009/01/09(金) 00:29:31
>>947
"; rm -rf /"
みたいな入力がこないように十分気をつけて。
0953デフォルトの名無しさん2009/01/09(金) 00:31:11
おー。
それじゃ、"ls -l '%s'"にしとく方が無難か。
0954デフォルトの名無しさん2009/01/09(金) 00:35:32
>>949-951
ありがとうございます。それでやってみます。
>>952
確かにそんなヤバいことも出来てしまいますね・・・注意します。
0955デフォルトの名無しさん2009/01/09(金) 00:42:50
>>953
まだまだ青いぜ
".'; rm -rf /;echo 'bang!"
0956デフォルトの名無しさん2009/01/09(金) 01:04:00
質問なのですがC言語で簡単に作れるゲームにはどんなものがありますか?
例えばドット避けやタイピングゲームなど
0957デフォルトの名無しさん2009/01/09(金) 01:07:00
じゃんけん
0958デフォルトの名無しさん2009/01/09(金) 02:13:00
数当てゲーム

C言語に限らず、ユーザ入力の可能な言語なら簡単かと
0959デフォルトの名無しさん2009/01/09(金) 02:51:37
100マス計算をするプログラムを書いてください。
プログラムがランダムに出題し、人間が100個の
マスに回答を入力し、確認ボタンを押すと
全問正解なら回答にかかった時間を表示して終了。
間違った場合は間違った場所にカーソルが止まり、
別の値が入力されるまで待ちます。
横10個、縦10個の数字は各々11〜99までの乱数、
演算は +,-,x のみでよいです。
よろしくおねがいします。
0960デフォルトの名無しさん2009/01/09(金) 02:53:43
丸投げする気なら宿題スレ行け。
0961デフォルトの名無しさん2009/01/09(金) 03:06:13
描画の実装について質問です。

各クラスごとに描画関数を持たせると仕様変更したときに対応が大変なのですが、
分離するアイディアが出てきません。
おとなしく全部書き換えたほうがいいのでしょうか?


class Object
{
protected:
int x, y;
int width, height;
public:
void Draw()=0;
};

class Character : public Object
{
public:
void Draw()
{
// 描画処理
// これだと仕様変更があった場合に対応するのが大変なのですが、今一いいアイディアが出てきません。
}
};
0962デフォルトの名無しさん2009/01/09(金) 03:51:35
>>958
なるほど、では数当てゲームでも作ろうかな。
じゃあ0から100の間で数を10回以内で当てる条件で作ろうと思うんだが
ヒントってどういうのがある?
〜以上〜以下です、とか偶数奇数の区別、素数など以外で
0963デフォルトの名無しさん2009/01/09(金) 03:54:40
>>869
ほれた。
直接の原因に言及することなく、かつ今後トラブルが起こらないための
手法を伝える、すばらしいテクニックだと思った。
i++を++iに変えたのはただの趣味だろうからそこはいただけないけど、
これも直接の原因から目をそらすためのものだったのかな。
複数行に渡っていればきっとコピペするだろうと予想したのだろうか、とか
妄想がとまらん。
0964デフォルトの名無しさん2009/01/09(金) 03:59:51
>>963
STLのiteratorを使いこなせるようになれば、i++と++iの違いがわかり、
++iを使うようになる。
0965デフォルトの名無しさん2009/01/09(金) 04:01:11
intならどっちでも構わないが。
0966デフォルトの名無しさん2009/01/09(金) 04:02:53
そうでもない
0967デフォルトの名無しさん2009/01/09(金) 04:10:24
>>964
iteratorつかうとインクリメントのみの文においてi++と++iに差が出るんだ?
0968デフォルトの名無しさん2009/01/09(金) 04:43:08
>>967
operator ++関数の戻り値は、前置++なら*thisへの参照を返せば済むが、
後置++だと、インクリメント前の値の複製を返さなければならない。
戻り値を使っていないことが明らかでも、可能ならこのインスタンスの複製を作る処理を
消し去れるほど高度な最適化のできるコンパイラが無いため。
0969デフォルトの名無しさん2009/01/09(金) 05:01:22
>962
とりあえずは
「入力→もっと(大きい/小さい)です」の繰り返しから作ってみては
後でいくらでも拡張していけば良い
0970デフォルトの名無しさん2009/01/09(金) 06:44:19
0x0B00〜1AFF の取る範囲が0x1000になるのは何故なのでしょうか?
0971デフォルトの名無しさん2009/01/09(金) 07:01:16
>>961
さすがにそれだけの情報でうまい分離方法考えろとか言われても無理
0972デフォルトの名無しさん2009/01/09(金) 07:17:49
>>970
0〜9の取る範囲は10通り
0〜99の取る範囲は100通り
100〜199の取る範囲は100通り
m〜nの取る範囲は(n - m) + 1通り
09739612009/01/09(金) 11:21:36
>>971
すみません。構成は以下のようになっています。

enum MapInfo { MapInfo_Map1, ..., MapInfo_MapNum };
enum Map1CharInfo { Map1CharInfo_Character, ..., Map1CharInfo_CharNum };
class Map {
public:
void Draw()=0;
};
class Map1 : public Map {
private:
Object* obj[Map1CharInfo_CharNum];
public:
Map1() {
// マップ上の全オブジェクトの作成
}
void Draw() {
// マップ上の全オブジェクトの描画
obj->Draw();
}
};
class Master {
private:
MapInfo scene;
Map* map;
public:
void Draw() {
map->Draw();
}
};
0974デフォルトの名無しさん2009/01/09(金) 11:26:06
純粋仮想にせず、継承元に共通描画ルーチンを入れておけばいいんじゃないの?
構成があったところで具体性がないから勝手にしろとしか言えない。
0975デフォルトの名無しさん2009/01/09(金) 11:51:19
>>98
アホな方法すすめんな馬鹿
0976デフォルトの名無しさん2009/01/09(金) 14:22:48
グローバル。・・・きたあああああああああああああ
0977デフォルトの名無しさん2009/01/09(金) 14:43:38
アホな方法、すすめんな、馬鹿、・・・きたあああああああああああああ
0978デフォルトの名無しさん2009/01/09(金) 14:50:25
>>968
なるほど理解しました。
0979デフォルトの名無しさん2009/01/09(金) 15:03:44
女性に忌み嫌われる人生を送ってきたモテない浪人生。

ある日、大好きなSM系のDVDを抱えて帰路についていた彼は、美しい女性とぶつかってしまう。

なんとその女は、力が足りなくて天界に帰れなくなっていた天使だった。

主人公は、力を得るための性行為を提案、渋る彼女を口先で丸め込み承諾させる。

こうして、清らかな天使さまを自分だけの性奴隷にするために、犯し続ける日々が始まるのだった。
0980デフォルトの名無しさん2009/01/09(金) 15:11:02
スレチになるけど、C#だと前置でもオブジェクトを作らなければならないという点でコストが高そうっすね。
http://d.hatena.ne.jp/mickey24/20081031/1225398396
いずれにしても後置の方がよりコストが高くならざるを得ないのは処理を考えれば当然のことでした。
もっと精進します。
0981デフォルトの名無しさん2009/01/09(金) 15:34:27
C#は触ったことさえないけど、
> 3. 演算子から返される値を x の評価によって得られる場所に格納します。
これがC++でいうところのリファレンスなら新しいオブジェクトを作っていないんじゃないかな。
0982デフォルトの名無しさん2009/01/09(金) 15:50:52
>>980
C#は呼び出し側で退避するので、戻り値を使っていない場合は最適化できるんじゃないか?
0983デフォルトの名無しさん2009/01/09(金) 15:59:32
ダメな例を見てもらえれば分かるんだけど、
オーバーライド処理内で毎回オブジェクトを作らないとダメっぽくないですか?
C++で後置演算子をオーバーライドする時はそんなのしなくて良いらしいのに。(というのが元々の話です)
0984デフォルトの名無しさん2009/01/09(金) 16:00:20
あああ前置のまちがいです
0985デフォルトの名無しさん2009/01/09(金) 16:43:44
あぁ、なるほど。MS得意の「余計なことして複雑にする」だね。w
0986デフォルトの名無しさん2009/01/09(金) 16:45:07
余計な 物など 無いよねぇ〜♪
09878922009/01/09(金) 17:10:20
ccでコンパイラしたら普通にいけました(理由はよくわかってないんですが)
質問に答えてくれた方ありがとうございました
Cygwinってgccとcc同じようなもんだと思ってた…
0988デフォルトの名無しさん2009/01/09(金) 19:10:19
で、お前らRAIIてなんて読んでる?
0989デフォルトの名無しさん2009/01/09(金) 19:26:19
あーるえーあいあい
0990デフォルトの名無しさん2009/01/09(金) 19:37:03
らいい
0991デフォルトの名無しさん2009/01/09(金) 21:05:14
ラ・ツーだろjk 新手のモビルスーツみたいでイイ
0992デフォルトの名無しさん2009/01/09(金) 22:25:09
らき・すた
0993デフォルトの名無しさん2009/01/10(土) 05:58:48
>>987
--
$ la /usr/bin/{g,}cc
lrwxrwxrwx 1 Yew Users 7 Jun 10 2007 /usr/bin/cc -> gcc.exe
-rwxr-x---+ 1 Yew Users 94741 Dec 18 2006 /usr/bin/gcc
--
どう見ても、中身は同じです。
# 内部でargv[0]見て動作変えてるかどうかはしらね。
0994デフォルトの名無しさん2009/01/10(土) 12:37:52
># 内部でargv[0]見て動作変えてるかどうかはしらね。
一番重要な部分が分からんなら書くなと
0995デフォルトの名無しさん2009/01/10(土) 12:38:42
だからそのキモイ、ナンバーサイン野郎は放置しろってw
0996デフォルトの名無しさん2009/01/10(土) 12:58:33
>>995
ナンバーサインってなんですか?
ところで最近宿題スレに書かなくなったんですね。さびしいです。
0997デフォルトの名無しさん2009/01/10(土) 13:10:37
釣りとかどうでもいいが
# がナンバーサインだ。
0998デフォルトの名無しさん2009/01/10(土) 13:10:52
>>993
0999デフォルトの名無しさん2009/01/10(土) 13:13:21
#がナンバーサインなんだが?宿題スレにも書き込んでいるが、
誰と勘違いしているんだろうね、こいつは?w >>996
1000デフォルトの名無しさん2009/01/10(土) 13:14:48
ググればすぐ分かるものを、検索もしない知ったかってのは迷惑だよな。
質問に答える資格もない。
ttp://ja.wikipedia.org/wiki/%E7%95%AA%E5%8F%B7%E8%A8%98%E5%8F%B7
シャープとも区別されているので、あしからず。ただ、便宜上代用されているケースはあるが。
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。