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

このエントリーをはてなブックマークに追加
547デフォルトの名無しさん
Read a string of the form "characters" from the standard input.
Store the string in character array 'charArray'.
Eliminate the quatation marks from the input stream.
Read a maximum of 50 characters.

標準入力から"characters"という文字列を読み込みなさい。
その文字列をcharArrayという文字列配列に入れなさい。
入力ストリームから二重引用符を取り除きなさい。
最大で50文字読みなさい。

…という問題なんだが

int charArray;
const int SIZE = 50;
char buffer[SIZE];

cout << "Type something surrounded by \'\" \"\': ";
cin.getline(buffer, SIZE);

while ((charArray = cin.get()) != '\"')
{
cout.put(charArray);
}

while ((charArray = cin.get()) != '\"')
{
cout.put(charArray);
}
cout << endl;

こういう解でいいのかね?
548デフォルトの名無しさん:2007/03/17(土) 08:24:14
>>547
こんにちは、UTF-32(sizeof(int)が4であるならば)の文字コードを操る世界の人
549547 続き:2007/03/17(土) 08:24:17
一応結果はこう↓なんで間違いではないと思うんだが

##################################################
Type something surrounded by '" "': "characters"
characters
Press any key to continue . . .
##################################################

他にもっとスマートな方法がある気がしてならんのだがどうでしょう?
550デフォルトの名無しさん:2007/03/17(土) 11:12:30
>>549
intの配列にする必要は無いだろうというのが、>548の主張だ。
551デフォルトの名無しさん:2007/03/17(土) 11:14:12
つーか、charArrayがintってなんだよ、問題の趣旨に合ってないじゃん。
552デフォルトの名無しさん:2007/03/17(土) 11:15:11
なんだかなぁ、先ずは日本語と英語の勉強をし直すところから始める必要がありそうだ。
553デフォルトの名無しさん:2007/03/17(土) 11:30:08
>>550-551
それも引っ掛かってたんだよ。
だから、ここで質問してるわけなんだけど。
てか、このテキストに載ってる方法だとそれが唯一の方法に見えるんだ。
で、肝心のchar charArray[SIZE]と宣言した場合はどうやればいいの?
554デフォルトの名無しさん:2007/03/17(土) 11:58:52
>>543
Boost.Serializationは設定ファイルくらいならそう面倒なく使えると思う。
555デフォルトの名無しさん:2007/03/17(土) 12:03:53
>それが唯一の方法に見える
詳しく
556デフォルトの名無しさん:2007/03/17(土) 12:17:27
WindowsベッタリならMSXML使えばいいんでないの。
557デフォルトの名無しさん:2007/03/17(土) 12:39:52
>>555
書いた通りそのまんまだが
今読んでるテキスト"C++ How To Program"には
区切り文字を指定して文字を読み込む方法はこれだけしか載ってない。
だから、intで宣言してるのはおかしいけどあれを使うしかなかった。
結果的には一応正しい出力になってる、でもなんか引っ掛かる。
俺的には「"」が見つかったときは読み込まずにスキップして後は全部読み込む、
みたいなアルゴリズムが浮かんでる。
そ・こ・で、ここの住人の力が必要なんだが…。
558デフォルトの名無しさん:2007/03/17(土) 12:43:59
>>557
> でもなんか引っ掛かる

それを説明しないと質問が成り立たないだろう。
エスパー募集なら他所でやれ。
559デフォルトの名無しさん:2007/03/17(土) 12:55:42
>>558
じゃ、箇条書きで。(というか、こんな説明しなくても回答できるはずだが…)

@文字列をcharArrayという文字列配列に入れろ、という指示があるのにintで宣言している
A例えば、この入力が"character"ではなく""cha"r""ac"ter"みたいに「"」が任意の数で入ってる場合でも
きちんと読めるべきでは、と思っている(←確かに指示には書いてないが気になる)

という二点です。
そろそろ回答の方をよろしくお願いしますよ。
560デフォルトの名無しさん:2007/03/17(土) 13:02:36
1. intで宣言しなきゃいいじゃん
2. 1文字ずつサーチすりゃいいじゃん
561デフォルトの名無しさん:2007/03/17(土) 13:05:10
>>560
それを具体的に教えてください、どの関数を使うかなどでいいですから。
562デフォルトの名無しさん:2007/03/17(土) 13:14:15
>>561
最初からそれを聞けばよかったのに
563デフォルトの名無しさん:2007/03/17(土) 13:16:53
>>562
いやいや、最初からそう聞いてます。
つらつらと説明してきましたけど
>>547の問題読んだだけで「俺ならこうやるな」って
回答がくれば即解決のはずなんですが…。
564デフォルトの名無しさん:2007/03/17(土) 13:19:46
>>561
てーか、何か根本的に間違ってないかい?
標準入力からcharArrayに入れるんだろ?
なら char charArray[SIZE]; と宣言して
cin.getline(charArray, SIZE); とするべきだろ。
(詳しい仕様は忘れたので終端文字については考えてない)
そして「そこ」から引用符を取り除くという話なんじゃないの?
>>547のコードじゃ何がしたいのかイマイチ分からん。
565デフォルトの名無しさん:2007/03/17(土) 13:21:53
>>563
プログラム書いて欲しいなら最初からそういえば言えばいいのに。
宿題スレあたりで頼めばいいんじゃね?
566デフォルトの名無しさん:2007/03/17(土) 13:23:36
あとさ、お前の話が理解してもらえないのは、
決して周りの人間の理解力や洞察力が足りないからじゃない、
お前に説明能力が足りないからだよ。
そこんとこ分かっていないと損するよ。他の誰でもないお前が。
多分お前よりは(無駄に)長く生きてきた俺からの真面目な忠告。
567デフォルトの名無しさん:2007/03/17(土) 13:23:53
568デフォルトの名無しさん:2007/03/17(土) 13:27:05
>>556
iniに比べてXMLは面倒だよ。
世間でXMLが騒がれているとかiniが推奨されていないとかで
わざわざ面倒な方法で実装するようにしなければいけないなんて納得いかない。
一つ一つNodeを辿るのではなく1つのXPathで指定したり
自分でサブルーチン作ったりして何とかするけど
みんなどうしてんのか?

このパラメタがなかったらエラーだが
このパラメタがなかったらデフォルト知を使うとか
ころころ追加や削除も容易であってほしいところだし。

MSXMLはBSTRやvariant型でATLテンプレートがなかったら地獄だぜ
って感じている。
569デフォルトの名無しさん:2007/03/17(土) 13:27:07
>>564
そこまでは思いついたんですよ。
でも、さっきも書いた通り、
このテキストには指定した区切り文字だけ取り除く方法が
while ((charArray = cin.get()) != '\"')
{
cout.put(charArray);
}
しか載ってないんですよ。
だからbuffer[SIZE]と組み合わせたんです。

で、その方法だと肝心の二重引用符はどのようにして取り除くんですか?
570デフォルトの名無しさん:2007/03/17(土) 13:28:11
>>565
ここまで時間かけたんですからここでお願いしますよ。
もう五時間ですよ?
571デフォルトの名無しさん:2007/03/17(土) 13:29:22
以前、宿題スレに質問したら
「え、自分でテキスト読んでやってんの?なら宿題じゃないじゃん」って書かれた経験あり。
572デフォルトの名無しさん:2007/03/17(土) 13:33:27
>>569
なんでテキストに載ってる方法しか使っちゃいけないの?
573デフォルトの名無しさん:2007/03/17(土) 13:34:26
>>572
他の方法を知らないからですよ
574デフォルトの名無しさん:2007/03/17(土) 13:36:31
これって面白いですか?
575デフォルトの名無しさん:2007/03/17(土) 13:36:39
じゃあそのテキストを窓から投げ捨てて、
もっとまともなのを探せばいいだろうに。
576デフォルトの名無しさん:2007/03/17(土) 13:37:16
>>571
そりゃ、普通は勉強のためにテキスト読んでるんなら、
人にコード書いてもらおうなんてのは本末転倒だからな。
577デフォルトの名無しさん:2007/03/17(土) 13:37:55
>>573 自分で調べろよカス。
578デフォルトの名無しさん:2007/03/17(土) 13:38:59
>>574
いや。割と迷惑。
579デフォルトの名無しさん:2007/03/17(土) 13:39:20
>>577
それこのスレの意義を否定してるぞ
580デフォルトの名無しさん:2007/03/17(土) 13:39:20
もういいよ、ストリームとか全部忘れてループ回せ。
int counter=0;
char output[SIZE];
for(int i=0; i<SIZE; i++)
 if(charArray[i]!='\"')
  output[counter++]=charArray[i];
これで解決。
581デフォルトの名無しさん:2007/03/17(土) 13:39:23
五時間かけた結果がこれですか…いいですよ、因果応報って言葉をお忘れなく
582デフォルトの名無しさん:2007/03/17(土) 13:39:55
>>573
がんばれ!
途中参加の俺には何が何だかさっぱりわからないけどさ
583デフォルトの名無しさん:2007/03/17(土) 13:41:18
あらあら、>>581の三秒前に回答が。

>>580さん、どうもありがとうございますです。
それなら確かにできそうです。
584デフォルトの名無しさん:2007/03/17(土) 13:42:25
>>577
死ね、マジで死ね
おまいなんか生きる資格ねぇよカス
585デフォルトの名無しさん:2007/03/17(土) 13:44:09
>>584
だれが書いたか知らないけどそんなこというなよ
586デフォルトの名無しさん:2007/03/17(土) 13:44:34
>>579
「調べる=人に聞く」だとでも思ってるの?
587デフォルトの名無しさん:2007/03/17(土) 13:45:19
だから、>547の問題の文章をちゃんと理解するところから始めなきゃダメだって。
588デフォルトの名無しさん:2007/03/17(土) 13:45:54
>>586
>>547は自分でコード書いてどうですかって聞いてるんだから
それから調べるキーワードくらい教えてやってもよかったんじゃないか?
589デフォルトの名無しさん:2007/03/17(土) 13:46:35
>>587
原文もついてる訳だから読めなかった回答者が悪い
590デフォルトの名無しさん:2007/03/17(土) 13:46:48
こっちは宿題スレじゃないし、それが妥当だったかもねー
591デフォルトの名無しさん:2007/03/17(土) 13:47:26
>>590
それなら早く言ってあげればよかったのによくもまあネチネチと
592デフォルトの名無しさん:2007/03/17(土) 13:48:13
あらあら、今日も釣り大会ですか?釣果はどうでしたか?w
593デフォルトの名無しさん:2007/03/17(土) 13:48:13
いや俺途中参加だし、そんなこと言われても困る
594デフォルトの名無しさん:2007/03/17(土) 13:48:49
五時間もよく粘ったな
595デフォルトの名無しさん:2007/03/17(土) 13:50:50
>>583
よかったね
596デフォルトの名無しさん:2007/03/17(土) 13:51:26
>>588
そうは言っても元のコードが iostream 使ってるんだから
そこから調べたらいくらでも情報が出てくるはずだろ。
模範解答らしい >580 にはキーワードを足す必要があるものは
一個も無いし。その後の流れを見ても質問者がとんでもなく
アホだったとしか考えられない。
597デフォルトの名無しさん:2007/03/17(土) 13:53:25
>>596
じゃ、そのiostream使ってるんだから、のくだりを書いてやれよ
自分が初心者だった頃は泣きついてたくせに
598デフォルトの名無しさん:2007/03/17(土) 13:55:27
>>596
そのいくらでも情報が出てくるから困るんだろが
電話帳渡されて583-1723見つけろって言われて見つけられるかおまえ?
お前が言ってるのはそういうこと
599デフォルトの名無しさん:2007/03/17(土) 13:56:36
iostreamってテンプレート使ってるから初心者には少々取っつきづらい
まぁいきなり全部理解しようとせずに少しずつ順番に使うようにすると
勝手に手が動くようになってるけど
600デフォルトの名無しさん:2007/03/17(土) 13:57:16
>>597
「くだり」って、「〜調べたらいくらでも情報が出てくるはずだろ」って書けばよかったのか?
言ってることは >577 と同じなんだが。
601デフォルトの名無しさん:2007/03/17(土) 13:58:59
>>598
電話帳は番号で検索できないが Web はキーワードで検索できる。全然違うな。
602デフォルトの名無しさん:2007/03/17(土) 13:59:10
途中参加です。
本のコピペでプログラムを作ろうとしているのか。
俺はiostreamに詳しくないのだ。

質問者が何処まで知っていて何を知らないのか判らないから
回答が難しいよね。

まだ5時間しかやってないのか。
これにこりずに続けろよ。
603デフォルトの名無しさん:2007/03/17(土) 14:01:30
こんなところでもいじめやってんだから日本のいじめは根深いね
604デフォルトの名無しさん:2007/03/17(土) 14:02:32
ま、いじめた側はどうせいつか同じ目に遭うよ
ほっとけ
605デフォルトの名無しさん:2007/03/17(土) 14:04:13
これは本当にひどい
606デフォルトの名無しさん:2007/03/17(土) 14:05:37
もっとふざけた奴なら釣ってもいいだろうけどあんなマジメなのはやめとけよ
607デフォルトの名無しさん:2007/03/17(土) 14:06:43
俺からも>>586が氏ぬように呪っとくわ
608デフォルトの名無しさん:2007/03/17(土) 14:07:31
560 から 580 が導き出せないのは異常。
609デフォルトの名無しさん:2007/03/17(土) 14:34:42
読ませてもらった
俺からは>>586は無事なんだが
>>586の子供がいじめられて自殺するように呪っとくわ
それくらい悪質だな
610デフォルトの名無しさん:2007/03/17(土) 14:57:19
586は少なくとも2chの中ではごく普通のことだと思うが
611デフォルトの名無しさん:2007/03/17(土) 15:12:51
俺一応真面目に答えた側なんだけど。
なんつーか、行き詰まっているのに妙に自信過剰というか、
変な意地が見え隠れするのが気になった。
真面目なのは確かなんだろうけど、それは必ずしも
皆から受け容れられるということを保証してはくれないわけでさ。
自分も相手も匿名のこの場でこういう経験しておけたのは
長い目で見ればプラスなんじゃないのかなぁと思ってみたり。
612デフォルトの名無しさん:2007/03/17(土) 15:20:01
根拠のないプライド持った能無しほど困った存在もないからな。
613デフォルトの名無しさん:2007/03/17(土) 15:40:57
たまたま俺みたいなやさしい人がいなかったときに書き込んだのが
運が悪かっただけだよ。
2ちゃんねるが@IT会議室みたいにはなって欲しくない。
614デフォルトの名無しさん:2007/03/17(土) 16:14:05
つーか、そもそも>547の原文の下の訳が滅茶苦茶なわけで。
615デフォルトの名無しさん:2007/03/17(土) 16:30:08
ん?そうか?どこが?
616デフォルトの名無しさん:2007/03/17(土) 16:46:26
つーかお前らよくこんな下らないことでスレ引っ張るな。
そんなに暇なのか?
>>547なら、こんなもんでいいだろ。

#include <iostream>

int main()
{
    int i, c;
    char charArray[51];
    std::streambuf *sb = std::cin.rdbuf();
    if ((c = sb->sbumpc()) != '"')
        return 1;
    for (i = 0; i < 50 && (c = sb->sbumpc()) >= 0 && c != '"'; )
        charArray[i++] = static_cast<char>(c);
    charArray[i++] = '\n';
    std::cout.rdbuf()->sputn(charArray, i);
    return 0;
}
617デフォルトの名無しさん:2007/03/17(土) 16:54:16
>>603からの自作自演が酷すぎてワロタ
C初心者は歓迎だがネット初心者や2ch初心者は帰れ
618デフォルトの名無しさん:2007/03/17(土) 17:01:26
C版
#include <stdio.h>

int main()
{
    char charArray[51];
    if (scanf("\"%50[^\"]\"", charArray) != 1)
        return 1;
    puts(charArray);
    return 0;
}
619デフォルトの名無しさん:2007/03/17(土) 17:17:29
>>616>>618見るまで入力テキスト内の"を全て取れって問題だと思ってた
最初と最後にしか出てこないんだな
620デフォルトの名無しさん:2007/03/17(土) 17:19:39
>>619
Read a string of the form "characters"
621デフォルトの名無しさん:2007/03/17(土) 17:54:39
今Linuxで動くアプリケーション(なんて大げさなものでもないですが)を作っています。

一般的なC++におけるDebugビルド用のマクロって何か決まっていますか?
_DEBUGってのは Visual C++用みたいですが・・・
自分で勝手にマクロ決めていいもんなんですかねえ
622デフォルトの名無しさん:2007/03/17(土) 17:56:24
アンダースコアで始まらない名前なら何でもおk
623デフォルトの名無しさん:2007/03/17(土) 17:57:32
逆に、assert.hではNDEBUGを利用している。
まぁ無難に、DEBUGで委員ジャマイカ。
624デフォルトの名無しさん:2007/03/17(土) 18:21:13
>>621
リリースビルド時に NDEBUG 定義するから NDEBUG 定義されてないときがデバッグビルド。
625デフォルトの名無しさん:2007/03/17(土) 20:07:57
それってただ多くのコンパイラで採用されてるだけ?
それとも規格で決まってるの?
626デフォルトの名無しさん:2007/03/17(土) 21:00:44
623は規格で定まっている事項。
627625:2007/03/17(土) 22:01:11
ありがとう!
どんな環境でも安心して使えるんだね。
628デフォルトの名無しさん:2007/03/18(日) 00:06:17
規格を守っていないシステムが存在しないという証明はできないから
どんな環境でも安心して使えるということにはならん
629デフォルトの名無しさん:2007/03/18(日) 00:18:41
そんなときは assert.h を自作すればよし。簡単だよ。
630デフォルトの名無しさん:2007/03/18(日) 00:25:28
Visual Studio2005 C++で
読み込んだり計算したりして出した
正の整数値分の配列を宣言したいのですが
取り方がわからないので教えていただきたいです

unsigned int a;
char buf[10] = "231";
a = atoi( buf );

こんな感じで a を取っていたとき
a の大きさ分だけもった b 配列をつくることってできないでしょうか?

/*---------------------
const unsigned int c = 231;
int d[c];
-----------------------*/
気分的に(笑)上の様な感じで

int b[a];

と宣言してしまうと
定数式が必要です。 とか
サイズが 0 の配列を割り当てまたは宣言しようとしました。 とか
'b' : サイズが不明です。 とか怒られてしまいます・・・
631デフォルトの名無しさん:2007/03/18(日) 00:38:02
const unsigned int c = 231;
int *d = malloc(c);

こんなかんじ?
632デフォルトの名無しさん:2007/03/18(日) 00:42:17
C++ って言ってるから new じゃね?

int* b = new int[a];

使い終わったら delete b[];

633デフォルトの名無しさん:2007/03/18(日) 00:43:05
delete[] b
でしょうがぁぁぁあああ!!!
634デフォルトの名無しさん:2007/03/18(日) 00:44:07
ごめんなさい><
boost::shared_ptr しか使ってないからもう忘れました><
635630:2007/03/18(日) 00:54:35
こんな早くレスもらえるとは!
ありがとうございます
636デフォルトの名無しさん:2007/03/18(日) 01:18:40
>>634 配列に shared_ptr は使えないんじゃね?
637デフォルトの名無しさん:2007/03/18(日) 01:19:43
vectorでいいじゃん。
638デフォルトの名無しさん:2007/03/18(日) 01:22:09
>>636
shared_array があるじゃん
639デフォルトの名無しさん:2007/03/18(日) 06:54:25
>>634
たぶんこんな感じ
namespace bll = boost::lambda;
boost::shared_ptr<int> hoge(new int[42], bll::bind(bll::delete_array, bll::_1));
640デフォルトの名無しさん:2007/03/18(日) 08:00:39
素直にshared_array使えよw
641デフォルトの名無しさん:2007/03/18(日) 08:30:55
シャーベット・アーリーと読んでしまったorz ネヨ…
642デフォルトの名無しさん:2007/03/18(日) 08:32:24
寝る前に、
早くシャーベットを食べるんだ。
643デフォルトの名無しさん:2007/03/18(日) 13:34:06
虫歯に注意
644デフォルトの名無しさん:2007/03/18(日) 23:56:17
引数がvectorでも組み込みの配列でも動作する、平均値を返す関数を書くべく、
引数を反復子(ポインタ)にして
template<class Ran>
double average(const Ran& begin, const Ran& end){ (略) }
と定義したのですが、関数呼び出し部分で
double av_arr[] = {10, 20, 30, 10};
size_t av_arr_size = sizeof(av_arr) / sizeof(*av_arr);
double x = average(av_arr, av_arr + av_arr_size);
としたところ、
「テンプレート のパラメータ 'Ran' があいまいです。
'double *' の可能性があります。または 'double [4]'」
とコンパイラ(VC2005)にダメ出しされてしまいます。
average(av_arr + 0, av_arr + av_arr_size);
とすれば共にポインタとして認識してくれるようですが、
読んだ本には、「配列の名前を添え字なしで使うと配列の先頭のポインタが渡される」と書いていたので、
元のままだと何が悪いのかよくわかりません。
"double [4]"って何の型?? みたいな話もあるんですが、
解説とスマートな解決策をご教授願えれば幸いです。
645デフォルトの名無しさん:2007/03/19(月) 00:04:28
>>644
double av_arr[4];

確かに av_arr と &av_arr[0] は、
同じ値になるけど
型としては別のものだよ。

ちょっとややこしいね。
646デフォルトの名無しさん:2007/03/19(月) 00:07:06
>>644
template<class Ran>
double average(Ran begin, Ran end);

エラーメッセージによると、
double average<double*>(double* const& begin, double* const& end);
double average<double [4]>(double const (&begin)[4], double const (&end)[4]);
のどちらか決めかねるようだけど、1つめの引数がどっちでも
マッチしてしまうからエラーになるんだと思う。

テンプレート引数の推測時には配列はまだ配列のまま。
読んだ本は C の本か、 C++ でも入門書あたりだろう。
647デフォルトの名無しさん:2007/03/19(月) 00:10:12
>>644
double av_arr[] = {10, 20, 30, 10};
において、av_arrは、'double [4]'という型ですよ。

もしav_arrが'double *'という型だと
size_t av_arr_size = sizeof(av_arr) / sizeof(*av_arr);
は、sizeof(double *) / sizeof(double);
になっちゃうよ。
648デフォルトの名無しさん:2007/03/19(月) 00:31:57
>>645-647さん
ご丁寧な解説、痛み入ります。
おかげさまで、理解に至りました。ありがとうございます。
お察しの通り、読んでいるのはC++の入門書ですね、はい。
精進いたします。
649デフォルトの名無しさん:2007/03/19(月) 01:13:27
vc8で、スタック上に複数のオブジェクトを作ったとき
デストラクタは作った順とは逆の順番で呼び出されるようですが
これに依存するような、オブジェクト間の依存関係を作ったりしてもOKなんでしょうか?
650デフォルトの名無しさん:2007/03/19(月) 12:20:29
構築した逆順で解体されるのは規格で保証されて滝ガス。
651デフォルトの名無しさん:2007/03/19(月) 12:22:51
うん。OK
652デフォルトの名無しさん:2007/03/19(月) 21:19:45
違う順番で解放されたらスタックじゃないしな
653デフォルトの名無しさん:2007/03/19(月) 21:25:42
>>652
そういう意味じゃないだろー。
654デフォルトの名無しさん:2007/03/19(月) 21:57:37
スタックだからこそじゃないんですか?
655デフォルトの名無しさん:2007/03/19(月) 22:01:17
実行順を保証しないと困る事があるからだ。
依存し合ってる場合とか。

そもそも、自動変数がスタックで実装されるかどうかなんて
規格で決まってないっしょ?
656デフォルトの名無しさん:2007/03/19(月) 22:15:12
入門書に載っていたサンプルコードをそのまま写してコンパイルしてみたのですが、
kouza.hの6行目で「宣言の構文エラー」と表示されます。
1ファイルにまとめれば正常にコンパイルされるのですが、どういった問題があるのでしょうか?
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3759.zip
ソースはこれです。
657デフォルトの名無しさん:2007/03/19(月) 22:48:30
>>649でスタック上って言ってるからスタック前提の話かと思いました
658デフォルトの名無しさん:2007/03/19(月) 22:51:13
>>656
kouza.cppとmain.cpp両方で、多重対策してないkouza.hをインクルードしてるせいで多重定義になってるだけじゃないの?
659デフォルトの名無しさん:2007/03/19(月) 22:58:24
>>648
オブジェクトA・B・CとプッシュされたものはC・B・Aと取り出される
プログラムの関数もスタックを使って実装されてる
660デフォルトの名無しさん:2007/03/19(月) 23:42:22
ソースファイル上で関数宣言の後などに
LFが挿入されているのをよく見掛けるんですが
これってどういう意味があるんですか?

void hoge(int piyo)
{

}
^L

みたいな感じ
661デフォルトの名無しさん:2007/03/19(月) 23:44:44
そんなの見た事ない。
文字コードの違う環境でいじったんじゃね?
662デフォルトの名無しさん:2007/03/20(火) 00:22:40
>>660
LF(^J)なら必ず入るだろ、改行コードだから。
FF(^L)なら改ページコードとして入れるという習慣が一部にあるらしい。
プリンタに出力したときに関数単位で出力されることを期待しているのだろう。
663656:2007/03/20(火) 00:33:27
>>658
kouza.cppの中身(「#include"kouza.h」以外")をkouza.hに移して試してみたのですが、
依然エラーは消えないままです。
main.cppの方に移しても同様なので、原因は別のところにありそうです。
664デフォルトの名無しさん:2007/03/20(火) 00:42:40
具体的にはどのようにコンパイルしているんだ?
665656:2007/03/20(火) 02:05:14
>>664
Cpadでコンパイル時パラメータの欄に
main.cpp kouza.cpp kouza.h
と入力した状態でコンパイルしています。
666デフォルトの名無しさん:2007/03/20(火) 03:16:34
>>665
Cpadは使った事無いけど、ヘッダーファイル(kouza.h)も指定しないといけないの?
Visual C++ 2005EEとg++ 4.1.2で普通にコンパイル通ったよ。
667デフォルトの名無しさん:2007/03/20(火) 06:37:45
>>656
CPadってBorlandC++Compilerだけだっけ?

↑なら
bcc32 main.cpp kouza.cpp で正常にコンパイルできたけど
668デフォルトの名無しさん:2007/03/20(火) 06:50:51
パラメータの入力順が違うだけだったりな
kouza.h kouza.cpp main.cpp とか
669デフォルトの名無しさん:2007/03/20(火) 07:16:51
ヘッダをC言語としてコンパイルしているので、classでエラーが出るという落ちでは
670デフォルトの名無しさん:2007/03/20(火) 07:25:43
>>663
そんなことしても多重対策にはならんわいw
671656:2007/03/20(火) 15:43:42
みなさん回答ありがとうございます。無事に解決することができました。
>>666
kouza.hを外したらコンパイルが通りました。
以前にヘッダも指定した時はたまたま上手くいったので、
それが正しいと思い込んでしまっていました。

>>670
kouza.cppの中身を移してkouza.hとmain.cppだけをコンパイルすれば
対策ではなく、そもそも多重定義が起こらないと思ったのですが・・・
何か自分が勘違いしてるかもしれません。申し訳ないです。
672デフォルトの名無しさん:2007/03/20(火) 16:02:45
>>662
^LはFFなんだね.首でも吊ってくるよ
勉強になった dクス
673デフォルトの名無しさん:2007/03/20(火) 23:31:41
>>650-651
久しぶりに職場にお泊りしてしまった
遅くなったけど、ありがとう 
674デフォルトの名無しさん:2007/03/21(水) 15:21:56
windowsでMSTPサーバを使用して、メール送信してますが
outlookで、メール送信することできるでしょうか?

APIかコマンドラインから使うことできれば、便利なんですが。
よろしくお願いします。
675デフォルトの名無しさん:2007/03/21(水) 15:24:56
Outlook Expressのことなら知らない。
OfficeのOutlookなら、VBAでできるかやってみろ。
それでできたらC++でもできる。
676デフォルトの名無しさん:2007/03/21(水) 17:26:27
>>675
レス感謝です。
検索して、しらべてみます。
677デフォルトの名無しさん:2007/03/21(水) 18:05:11
>>674
メーラーを外部から操作するためのMAPIというAPIがあり、Outlookは
対応しているが、ある時点で(XPのSP2だったかな?)、セキュリティ絡みで
非常に強い制限が課せられるようになったはず。
送信が許可されてたかどうか。
678デフォルトの名無しさん:2007/03/22(木) 17:20:23
済みません、int から byteヘとか
そのまた逆にする場合はどうしたらいいでしょうか?
ググッたんですがJavaやC#は見つかったんですけれども
C++が見つからなくて
初心者の質問で済みません

679デフォルトの名無しさん:2007/03/22(木) 17:22:50
CやC++にはbyteなどという型は存在しないのでintからbyteにする方法などはありません
680デフォルトの名無しさん:2007/03/22(木) 17:27:08
あっそうなんですか
そうすると今使ってる
byteはwinやTurbo C++の環境なのかな...orz
もうちょっと調べてみます
681デフォルトの名無しさん:2007/03/22(木) 17:33:12
typedefでしょ?
castすればいい。もちろんcastの動作を理解した上でやってね。
682デフォルトの名無しさん:2007/03/22(木) 17:42:53
byteとcharって、どの程度違うの?
683デフォルトの名無しさん:2007/03/22(木) 17:43:22
有り難う御座います、castの知識曖昧な所が多いので
勉強しながらやってみます
684デフォルトの名無しさん:2007/03/22(木) 18:02:02
>>682
charはコンパイラによって符号ありだったりなしだったりするが
BYTEは大抵は符号なしcharのtypedef
byteはシラネ
685デフォルトの名無しさん:2007/03/22(木) 18:47:47
>>678
static_cast
おそらくbyte→intのように、扱える範囲が広くなるほうへは使わなくても平気。

Cとの互換を保つため実は狭くなる方へもキャスト無しで行けるが、キャスト使っておけ。
エラーにできないもんだから、みんな警告を出す。
686デフォルトの名無しさん:2007/03/22(木) 19:20:44
有り難う御座います
やってみます
687デフォルトの名無しさん:2007/03/23(金) 05:44:57
質問です。
tableと言う配列があったとして
ループ部分で、前の値を計算式に含める場合。スマートな方法は無いのでしょうか?
具体的には

int table[128],res[128];
for(int i=0; i<128; i++){
res[i]=table[i-1]*5;
}
こういった式の事です。
このままでは、1回目のi=0の時に負の値が添え字に与えられてしまいます。
int i=1だと、res[i-1]としなければならず、なんとも気持ちが悪いものです。
一般的にはこのようなループはどのように対処するものなのでしょうか?イディオム的なものはあるのでしょうか?
688デフォルトの名無しさん:2007/03/23(金) 05:51:26
>>687
res[0]には何入れるの?
689デフォルトの名無しさん:2007/03/23(金) 06:19:26
>>687
int * dest = &res[0] ;
int * src = table[-1] ;

for ( ; dest != &res[128] ; ++dest, ++src )
{ *dest = *src * 5 ; }

あるいは、

std::copy( &table[-1], &table[127], &res[0] ) ;


>>688
悪魔が入ります。
690デフォルトの名無しさん:2007/03/23(金) 07:31:31
>>689
> int * src = table[-1];
おまえ正気かいな
691デフォルトの名無しさん:2007/03/23(金) 07:37:29
>>689
それ何の解決にもなってないだろ
692デフォルトの名無しさん:2007/03/23(金) 08:28:34
>>687
>res[i-1]
結局行き着くのはここ
それで気持ちが悪いとか言ってたらC/C++なんてやってらんねぇよ

>>689
そんなにアクセス違反とか領域破壊とかしたいのかおまいはw
693デフォルトの名無しさん:2007/03/23(金) 13:44:09
添え字に飽和減算マクロを使えばおk
694デフォルトの名無しさん:2007/03/23(金) 17:51:14
>>687
res[i-1] はコンパイラによって (res-1)[i] みたいに
なることが多いので気持悪く思う必要はない。最初から
(res-1)[i] とも書けるけどこれは規約違反。
695デフォルトの名無しさん:2007/03/23(金) 19:41:22
>>694 強い電波をキャッチしました。
696デフォルトの名無しさん:2007/03/23(金) 20:06:10
>>694
(res-1)[i] <-> *(res-1+i) <-> res[i-1]

resがポインタ型なら常にこれらは等価。
規格にもなんら違反していない。
697デフォルトの名無しさん:2007/03/23(金) 20:19:32
694自身もしくは694の職場でのコーディング規約なのでは?
698デフォルトの名無しさん:2007/03/23(金) 20:30:38
ついでに言うと(-1+i)[res]でも同じだな。キモ過ぎるなこれ。

>>694はポインタ同士の演算(減算を除く)が不正であることと
混同してるんじゃないか?
699デフォルトの名無しさん:2007/03/23(金) 21:41:50
>>687
for( int i=1; i<128; i++){
res[ i - 1 ]=table[ i ]*5;
}
じゃダメなの?
700デフォルトの名無しさん:2007/03/23(金) 21:57:26
それ意味変わってね?
701デフォルトの名無しさん:2007/03/23(金) 22:03:48
>>698
さすがにそんなコードは書かないけど、
C言語におけるポインタとはどういうものかを知るには
素晴らしい例だと思う
702デフォルトの名無しさん:2007/03/23(金) 22:09:57
>(-1+i)[res]
の解説キボンウ
703デフォルトの名無しさん:2007/03/23(金) 22:13:46
例えば res[i-1] ってのは
(resが指し示すアドレス)と(添え字=この場合ならi-1)
との単なる加算を行い、そのアドレスが保持している値を返す。
数字が前に来ようが後に来ようが両方に来ようが
加算の結果は変わらないので指し示すアドレスも変わらず、
よって問題は起こらないと
704デフォルトの名無しさん:2007/03/23(金) 22:14:01
>>702
解説面倒だからポインタがなんであるかの勉強してこい
705デフォルトの名無しさん:2007/03/23(金) 22:15:49
>>702
a, bの片方がポインタ型で他方が整数型である場合、a[b] は *(a+b) に等しい。
706デフォルトの名無しさん:2007/03/23(金) 22:18:12
>>702
(-1 + i)[res] ⇔ *(-1 + i + res) ⇔ *(res + -1 + i) ⇔ res[-1 + i] ⇔ res[i - 1]

これ書いていて思い出した。CもC++も規格では
配列の先頭要素〜最後の要素を1つ越えたところの範囲外を指すポインタの存在すると
プログラムの挙動が未定義になる。694が規約違反と言っているのはこのことだ。
http://www.kouno.jp/home/c_faq/c6.html#17

707デフォルトの名無しさん:2007/03/23(金) 22:19:56
目からぬるぽでした
解説あんがとさんでした
708デフォルトの名無しさん:2007/03/23(金) 22:55:03
無料でC++使える環境は?.NET使えなくていいから
709デフォルトの名無しさん:2007/03/23(金) 22:56:42
cygwin, mingw gcc
710デフォルトの名無しさん:2007/03/23(金) 23:01:17
>>708
VC++EE
711デフォルトの名無しさん:2007/03/23(金) 23:01:44
>>706
なるほど。C FAQをもう一度読み直すとするか…。
712デフォルトの名無しさん:2007/03/24(土) 01:23:19
>>707
目にガッしていいの?
目にガッって、やっていいの?


BCC
713デフォルトの名無しさん:2007/03/24(土) 01:24:49
>>706
どうでもいいけど日本語がおかしい。
714デフォルトの名無しさん:2007/03/24(土) 01:41:55
デバッグ出力なんかだと、時折り"NULLPO"[ga]なんてのも使うよね。
#流石にga["NULLPO"]とはしないけど。
715デフォルトの名無しさん:2007/03/24(土) 01:48:48
俺はテストデータに"いろはにほへとちりぬるぽ"とか使う。
最初は反応してくれる人が居たけど、最近は誰も反応してくれなくなった。
いいかげん、次のネタを考えんといかん。
716デフォルトの名無しさん:2007/03/24(土) 02:17:01
分割コンパイルをやってて、
コンパイルすると「外部シンボル”○○(自分で定義した関数)”が未解決です」
ってでるんですが、俺はどうしたらいいですか?
717デフォルトの名無しさん:2007/03/24(土) 02:18:23
>>716
コンパイラエンジンの使い方を勉強すればいいと思います。
718デフォルトの名無しさん:2007/03/24(土) 02:27:23
>>716
コンパイルだけじゃなくてリンクまでやっちゃってるから。
それはリンカが出してるエラーメッセージ。
719デフォルトの名無しさん:2007/03/24(土) 03:13:58
変数の命名に関して質問です。
メンバ変数の末尾に"_"をつけているソースをよく見ますが、
これはシステムが利用している変数名とは被らないのでしょうか?

自分で調べたところ、_xや__xや_x_はダメだという記述は
見られましたが、x_に関しての記述はなかったもので。
720716:2007/03/24(土) 03:20:22
>>717-718
こんな質問に答えてくれてありがとうです。

このエラーを解決するにはどうすればいいですか?
一通りググってみたけど、いまいち理解出来ませんでした。
質問ばかりですいません。
721デフォルトの名無しさん :2007/03/24(土) 03:26:47
>>719
末尾なら良いんでないでしょうか。
俺はアンダースコア(アンダーバー)で終わる変数名は
つけないけど。
722デフォルトの名無しさん:2007/03/24(土) 03:29:57
>>719
末尾についてるのは大丈夫。ただし C++ では末尾でも(途中も含めて)二重なのはダメ。
723デフォルトの名無しさん:2007/03/24(土) 03:31:20
>>720
○○が定義されているオブジェクトファイルもリンカに渡せ。
724デフォルトの名無しさん:2007/03/24(土) 03:33:17
>>720
まず、お前自身が自分がなにをやってるのか正確に理解する必要がある。

フツーのコンパイルなら一度に全てのソースをコンパイルしリンクを行う。

分割コンパイルの場合は一部のソースのコンパイルだけ行う。
リンクは全てのソースのコンパイルが完了している任意のタイミングで行う。

で、お前の今の状況だが、大きく二つのケースに分かれると思う。

ひとつはコンパイルだけ行えばいいタイミングでリンクまでやっている。
( 通常、コンパイラは"コンパイルのみを行う"という指示がない場合、勝手にリンクまでやっちゃう。 )

もうひとつはリンク時に必要な( ソースファイルをコンパイルして生成される )オブジェクトファイルが
全部そろってない、あるいはオブジェクトファイル自体はあるが、リンカに渡っていない。
725デフォルトの名無しさん:2007/03/24(土) 03:36:07
>>720
ヘッダで関数宣言だけしてあるけど、
中身の定義が見つからんてことだよ
726716:2007/03/24(土) 03:59:33
どうやら自分は何がしたいのかが理解できてないようです。
取り敢えずもう少し勉強してみます。
こんな時間におさがわせしました
727デフォルトの名無しさん:2007/03/24(土) 04:01:15
まあそう言わずに思いのたけをぶつけてくれたまえ。
728デフォルトの名無しさん:2007/03/24(土) 04:15:14
>>726
具体的にどんな環境でどんなふうにコンパイルしてるのか、詳しく教えてくれれば
多分、ちょっとしたことでうまくいく問題だぞ。
729429:2007/03/24(土) 04:17:10
>>430-444
ありがとうございます。

質問してたの忘れてた(汗
遅レススマムコ
730デフォルトの名無しさん:2007/03/24(土) 04:22:44
#define って そのソースファイル内でしか適用されんの?

また同じ #define をソ−スごとに書かないと駄目なの?
731デフォルトの名無しさん:2007/03/24(土) 04:27:33
>>730
プリプロセッサだもの、そりゃそうでしょ。
いっぱい書きたくなかったらヘッダに書けばおk。
732デフォルトの名無しさん:2007/03/24(土) 04:28:34
同じ #define を複数箇所に書くとかあまりにも意味がないw
733デフォルトの名無しさん:2007/03/24(土) 04:32:25
>>730
コンパイルオプションで指定するならソース上のどこにも書かなくていいよ。
734デフォルトの名無しさん:2007/03/24(土) 04:34:19
>>731
ヘッダに書いてインクルードさせれば使えるの?
735デフォルトの名無しさん:2007/03/24(土) 05:04:18
#includeは単なるファイルのコピペ指令だ
気張る必要はないよ
736デフォルトの名無しさん:2007/03/24(土) 09:37:31
>>732
それそのまんまマイクロソフトに言ってやれ
737デフォルトの名無しさん :2007/03/24(土) 10:03:11
一応VC++でのコマンドラインからのコンパイルとリンクの仕方を
msdnから抜粋しといた。必要ないから、俺は使ったこと無いけど

コマンド ラインで、オブジェクト ファイル FIRST.obj と SECOND.obj が作成される。

CL /c FIRST.C SECOND.C

実行可能ファイルを作成するには、LINK を呼び出す必要があります。

LINK firsti.obj second.obj /OUT:filename.exe

738デフォルトの名無しさん:2007/03/24(土) 11:19:57
WinXP、MinGW-5.1.3を使ってます。
10E13位の実数を扱いたいんですが、float型やdouble型で宣言しても
warning: integer constant is too large for "long" type
というエラーが出てしまいます。どうすれば解決できるでしょうか。
739デフォルトの名無しさん:2007/03/24(土) 11:22:20
コード書け
740738:2007/03/24(土) 11:27:25
これだけなんですが。
float na;
long nb;

na = 100000000000;
nb = 1000000000;
741デフォルトの名無しさん:2007/03/24(土) 11:29:05
double f[] = {100000000000000., 10e+13};
742デフォルトの名無しさん:2007/03/24(土) 11:30:28
>>740
それはlongリテラルだもん
743デフォルトの名無しさん:2007/03/24(土) 11:33:42
>>740
小数点でも書いとけばいいんじゃないの
744デフォルトの名無しさん:2007/03/24(土) 11:34:11
エラーメッセージのまんまだな。
longリテラルではなく浮動小数点リテラルとして認識させればいいだけ。
745738:2007/03/24(土) 11:36:04
宣言はできましたが、数値を代入したら同じエラーが出てしまいました。
代入するには
f[0] = 100000000000;
でいいんですか?
746デフォルトの名無しさん:2007/03/24(土) 11:36:32
>>740
na = 100000000000.0f;

つーか10E13ってそういうことか
てっきり0x10E13かと思ってたわ
747デフォルトの名無しさん:2007/03/24(土) 11:40:24
>>745
だからdoubleリテラルにするために小数点かeつけろよ
748738:2007/03/24(土) 11:48:23
代入する数値に.を付けて
f = 100000000000.;
としたら解決しました。ありがとうございます。
749デフォルトの名無しさん:2007/03/24(土) 11:55:31
>>737
-cオプション与えなければclでexeを直接生成できるよ。

cl -o foo.exe first.c second.c
でよい。

ま、普通は(Makefileを使うような場合は)-cオプションつきでobjを
作った後で結合するけどな。
750デフォルトの名無しさん:2007/03/24(土) 12:18:51
C++版のgetch()ってありますか?
751デフォルトの名無しさん:2007/03/24(土) 12:25:29
ない。そもそもgetchは標準関数ではないのだからC++がどうこう言う話ではないだろ

まあ、conio.hがある環境なら#includeしとけば使えると思うよ
752デフォルトの名無しさん:2007/03/24(土) 12:34:29
標準じゃなかったんですね・・・
回答ありがとうございました
753デフォルトの名無しさん:2007/03/24(土) 17:36:07
#include <windows.h>
#include <iostream>
BYTE A(const BYTE* a)
  { return a[0]; }
BYTE A(const PBYTE a)
  { return a[1]; }

int main() {
  const BYTE a[] = { '0', '1', '2', '\0', };
  /* */ BYTE b[] = { '0', '1', '2', '\0', };
  std::cout << A(a) << A(b) << std::endl;
  return 0;
}

このコードは 01 と表示するんですが、aとbが区別される理屈がわかりません
また、Aの定義からconstを取り除いた場合、同じBYTE*の関数としてあつかわれて
コンパイルエラーになるのに、constがあるとOKなのも理解できません
なぜこうなるんでしょうか?
754デフォルトの名無しさん:2007/03/24(土) 17:48:28
const PBYTEはBYTE* constになる。
const BYTE* aはaの指す先がconstという意味。
BYTE* const aはaそのものがconstという意味。
それぞれ別の型として扱われるので多重定義できる。

仮引数そのものがconstかどうかは多重定義の解決の際に考慮されないので、
実質的にはA(const BYTE* a)とA(BYTE* a)の中からどちらのAを呼ぶかということになる。
main関数の中のAの呼出では、それぞれaとbの型に引数が最も合うAが選ばれたということ。

755デフォルトの名無しさん:2007/03/24(土) 17:54:04
constなポインタとconstなオブジェクトを指すポインタの違いはこんな感じ
int i;
const int c;
int *const pc;
const int* cp;

pc = &i; //エラー:pcはconstだから
cp = &c; //Ok

*pc = 0; //Ok
*cp = 0; //エラー:cpの指す先はconstだから
756デフォルトの名無しさん:2007/03/24(土) 17:57:58
>>754-755
うぉぉ すごく良くわかりました

> const PBYTEはBYTE* constになる。
これに気づけなかった。感激です 
あとドルジっょぃ
757デフォルトの名無しさん:2007/03/24(土) 18:15:44
ポインタが絡んだときに、constがどこにつくかってのは、定期的に出るね。
cont BYTE *
だから分かりにくいのであって
BYTE const * //上の型はこれ
BYTE * const
BYTE const * const

そもそもなんで、型の前にも後ろにも付けられるようにしたんだか。
後ろだけだったら、こんなに混乱しなかったはずなのに。
758デフォルトの名無しさん:2007/03/24(土) 18:22:36
>>757
C++の言語仕様は何でもあり
これがすべての混乱の元と言われている
759デフォルトの名無しさん:2007/03/24(土) 18:30:57
結局C/C++は女子供の使うものじゃなかったんだよ。
スキルのもった、何でも自分で出来る現場のおっさんが、好きなように出来るように作られたもの
それが出来ないなら、制限されたC♯で"安全な"プログラムを組めって事さ


760デフォルトの名無しさん:2007/03/24(土) 18:35:28
761デフォルトの名無しさん:2007/03/24(土) 18:40:16
>>758
これはC++だけではなく、基のCからそうだった。
762デフォルトの名無しさん:2007/03/24(土) 18:50:53
const BYTE *A だったら
(const BYTE)←Aって感じでポインタのAがconst BYTEを指してますよーっ
て感じで直感的かもしれない気がしただけでしたごめんなしあ
763デフォルトの名無しさん:2007/03/24(土) 18:51:13
C++はオブジェクト指向が追加されて更に言語仕様が複雑になった
CはポインタとGOTOを制限すれば構造化プログラミングを
正常に行える。
オブジェクト指向言語でありながらポインタがある。この言語仕様で
自由にプログラマーがコーディングする他人が読めないコードに
なるのはむしろ必然
764デフォルトの名無しさん:2007/03/24(土) 19:14:33
GOTOなんて気持ち悪すぎ
765デフォルトの名無しさん:2007/03/24(土) 22:11:17
>>763
初心者丸出しの発言乙w
766デフォルトの名無しさん:2007/03/24(土) 22:23:51
玄人がするような発言をして下さい↓
767デフォルトの名無しさん:2007/03/24(土) 22:25:49
gotoにも使いどころはあるよ
768デフォルトの名無しさん:2007/03/24(土) 22:28:47
プログラミング規約を行わないでコーディングさせたら
プログラムを複雑にするのは事実
フレームワークを言語に取り入れるのは大規模開発では常識となっている。
世界で活躍するプログラマになると実行速度・コードサイズ・可読性に優れた
コーディングを行っている。
他人が読めないコードは最悪のコーディングスタイルだ
769デフォルトの名無しさん:2007/03/24(土) 22:33:57
実行速度やコードサイズを犠牲にして可読性上げてるんじゃなかったっけ・・・
770デフォルトの名無しさん:2007/03/24(土) 22:38:53
エセ玄人がするような発言をして下さい↓
771デフォルトの名無しさん:2007/03/24(土) 22:40:33
実行速度・コードサイズは最適なアルゴリズムを採用することにより実現
可読性はクラス設計を適切に行い、関数の粒度を均一にすることで実現
更に優秀なプログラマなら再利用可能なプログラム設計も行える。
772デフォルトの名無しさん:2007/03/24(土) 23:05:56
ごめんなさい
どれも出来ません。
773デフォルトの名無しさん:2007/03/24(土) 23:06:22
・最適な
・適切に
・関数の粒度を均一にすること
・優秀なプログラマ
774デフォルトの名無しさん:2007/03/24(土) 23:09:56
goto 使わずにどうやって for の二重ループから脱出するの?
775デフォルトの名無しさん:2007/03/24(土) 23:11:01
フラグ立てんじゃね?
まあ俺はgoto使っちまうがな
776デフォルトの名無しさん:2007/03/24(土) 23:11:45
日本ブレイク工業社歌ばりにブレイクブレイク。
777デフォルトの名無しさん:2007/03/24(土) 23:16:07
最初は素直な実装を心がけてればいいんじゃないかな
778デフォルトの名無しさん:2007/03/24(土) 23:25:07
2重ループを関数に移してreturnするな俺は
779デフォルトの名無しさん:2007/03/24(土) 23:38:25
で、goto 使うななんて発言はどこにも見当たらないんだが…
780デフォルトの名無しさん:2007/03/24(土) 23:44:06
ばっかだなぁ throwがあるじゃないか
781デフォルトの名無しさん:2007/03/24(土) 23:45:14
例外ってgotoよりタチが悪いだろ
782デフォルトの名無しさん:2007/03/25(日) 00:58:07
gotoを全く使ってはいけないのではなく、多用すると可読性が悪くなるから制限が必要
多重ループからの離脱はgoto使うとむしろ可読性が良くなるから使うべきケース
783デフォルトの名無しさん:2007/03/25(日) 01:23:56
try throw catchってやばいのん?
784デフォルトの名無しさん:2007/03/25(日) 01:27:33
>>783
もちろん、ちょーやばい。宇宙並みにヤバイ。お前は絶対使うなよ! やばいから!



・・・俺は使うけど。
785デフォルトの名無しさん:2007/03/25(日) 02:04:48
例外は"見えないgoto"だとはよくいったものだ。
悪用すると、gotoよりも可読性が悪くなる。
使わなくて済むのなら避けるべき。
786デフォルトの名無しさん:2007/03/25(日) 02:44:48
どの言語でも例外を非ローカル脱出に使うのは推奨されていないなあ…
787デフォルトの名無しさん:2007/03/25(日) 10:25:08
例外って、使う使わないというものじゃなくて
「使わざるを得ない」ものではなかろうか
788デフォルトの名無しさん:2007/03/25(日) 12:41:01
うるさいうるさいうるさい!
789デフォルトの名無しさん:2007/03/25(日) 16:35:02
質問失礼します。

とある関数で、time(NULL)を種として乱数を発生させているのですが、
高速で繰り返し関数を呼び出しているため、同じ乱数が何度も発生してしまいます。
速度を落とさずこれを回避するには、どうすればよいでしょうか?
790デフォルトの名無しさん:2007/03/25(日) 16:36:12
種を与えるのは一回だけでいい
791デフォルトの名無しさん:2007/03/25(日) 18:43:58
循環参照とか循環インクルードとか、
このヘッダインクルードしたらこのヘッダもついてくるから
新しくヘッダつくるかそしたらこのヘッダインクルードしないといけないから
そしたらこのヘッダもついてくるからって











もう嫌になった
792デフォルトの名無しさん:2007/03/25(日) 18:46:20
インクルードガードしろ
793デフォルトの名無しさん:2007/03/25(日) 19:53:17
分割コンパイルするならインクルードガード必須だろ、常識的に考えて
794デフォルトの名無しさん:2007/03/25(日) 20:00:55
インクルードガードは本当は良くないんじゃないんですかね。
それはただの対処法ってだけじゃないの?
795デフォルトの名無しさん:2007/03/25(日) 20:04:53
やっぱ#pragma onceで重複処理するだけって駄目なのか・・・
796デフォルトの名無しさん:2007/03/25(日) 20:09:15
>>794
ただの対処法がダメならどうしろとw

>>795
そいつぁコンパイラを選ぶんじゃなかったか
797デフォルトの名無しさん:2007/03/25(日) 20:14:56
>>796
基本的に循環しないように分割の設計していかないと駄目だと思うのよね。
それが基本的に本当だと思うのよね。
ヘッダ1000個とかになって人間として難しいって時の対処法でインクルードガードがあるんだと思うんだよね。
798デフォルトの名無しさん:2007/03/25(日) 20:32:57
それはつまり、NULLが定義されているのがstddef.hのみだった場合

stdio.hやstdlib.h内でstddef.hをincludeするのは禁止で、かつ
ユーザーはstdio.hとstdlib.hの両方を使用するコードを書くべきではない

ということですよね?
799デフォルトの名無しさん:2007/03/25(日) 20:46:45
標準ライブラリは重複してもおkなの?
800デフォルトの名無しさん:2007/03/25(日) 20:48:24
何をもっておkとしたいのか判らん
オブジェクトコードを1バイトでも軽くしたいとかコンパイルを1秒でも早く終わらせたいとか
そんな目標があるのか?
801デフォルトの名無しさん:2007/03/25(日) 20:51:50
つまり発生する問題はその程度ということですか、ならおkです
802デフォルトの名無しさん:2007/03/25(日) 21:00:31
>>797
>基本的に循環しないように分割の設計していかないと駄目だと思うのよね。
>それが基本的に本当だと思うのよね。

んなこたねーよ馬鹿。循環していなくても
同じ宣言・定義を2回読む危険性はあるだろ。

>>799
標準ライブラリもインクルードガードされているから大丈夫。ソース見れ。

>>800
#include <stdio.h>と何回も書くと
その分だけオブジェクトコードが増えるとでも思ってるのか?
時間は数ミリくらいは遅くなるだろうが。
803デフォルトの名無しさん:2007/03/25(日) 21:11:19
>>802
>>799>>797理論について標準ライブラリも重複しないようにせにゃならんのかと言ってんじゃね?
804デフォルトの名無しさん:2007/03/25(日) 23:18:38
>>798->>803
バカかお前ら。依存関係の事言ってんだよ
805デフォルトの名無しさん:2007/03/25(日) 23:24:59
>>804 ごめん、よくわからん
806デフォルトの名無しさん:2007/03/25(日) 23:25:03
807デフォルトの名無しさん:2007/03/25(日) 23:28:37
>>804
無能
808デフォルトの名無しさん:2007/03/25(日) 23:34:21
>>806に関連して(このスレの流れには関係ないが)
borlandのコンパイラ及びmakeは、自動的に依存ファイルの更新をチェックする機能がある
(.objのコメントにincludeされたファイルと日付を含め、makeがそれをチェックする)
まあmakeにかかる時間が若干増えるが。
809デフォルトの名無しさん:2007/03/26(月) 00:24:06
>>806
Indian Hill スタイルガイドを策定したヤツは馬鹿ですか? 信じられん。
一度、#include を入れ子にしてないプログラムのメンテしたことあるけど地獄だったぞ。
810デフォルトの名無しさん:2007/03/26(月) 02:43:27
例えばクラスAを保持しているクラスBとCがあって、それぞれが別々の
.cpp と .h のセットに記述されていた場合とか、
入れ子 #include が禁止だと非常に困る
811デフォルトの名無しさん:2007/03/26(月) 05:27:27
>789
どういう状況かは知らないが、似たような経験がある。

とあるアプリのプラグインを開発していたんだけど、
アプリの仕様上、その機能が使われる度に毎回プラグインがロードされるので
static変数が使いにくいという状況だった。

そのときに色々と調べて見つかった方法が、
・シードをファイル等に書き込んでおく
・プラグインとは別にプロセスを立ち上げ、種を保持しておく
・ミリ秒ではなくマイクロ秒を種に与える
の3つだった。他にもあるかもしれない。
812デフォルトの名無しさん:2007/03/26(月) 16:52:23
Win32APIフックについて教えてください。

ユニットテストでAPI呼出失敗を検証する為、
APIフックを行う必要があります。
いろいろ調べた結果、以下のHPにサンプルがありました。

ttp://ruffnex.oc.to/kenji/text/api_hook/
ttp://ruffnex.oc.to/kenji/text/api_hook/ex2.cpp

動作検証した所、フックは成功しました。
しかし、フック状態から元の状態に戻す方法がわかりませんでした。
(プログラムを終了すれば元の状態にもどりますが、そうではなく、任意のタイミングで戻したい)

どのようなコードを書けばよいのか、識者の方ご教授いただけませんでしょうか。
813デフォルトの名無しさん:2007/03/26(月) 16:57:48
そりゃ、自分のプロセスのテーブルを上書きして書き換えてるだけだから。
そこのページに置いてある API_Hook.zip をちゃんと読めば分かるよ。
814デフォルトの名無しさん:2007/03/26(月) 17:03:34
ややすれ違い WindowsAPIべったりな話題だから
http://pc11.2ch.net/test/read.cgi/tech/1174416295/l50

さらにいうなら親切にBBS用意してるんだからそっちで聞くほうがいいとおもうけどな
さらにいうならもう一個下のサンプルにはちゃんと実装されてるんだから
それぐらい調べてからでも遅くないと思うんだけどな
でもってReplaceIATEntryInAllModsの引数逆転させてみな
815812:2007/03/26(月) 17:40:00
>>813
>>814
レスありがとうございます。

ご指摘の通り、ソースを調べてから質問するべきでした。
また、スレ違いであることも、重ねてお詫びします。
申し訳ありませんでした。
816デフォルトの名無しさん:2007/03/26(月) 18:34:00
Cの質問です。

unsigned int a = 1;
a -= 2;

このとき、aの値がUINT_MAXになることは保障されているのでしょうか?
817デフォルトの名無しさん:2007/03/26(月) 18:42:17
UnsignedIntegerOutOfBoundExceptionがシグナれます
818デフォルトの名無しさん:2007/03/26(月) 18:52:17
>>816
整数オーバーフローが発生した場合の動作は未定義

そもそもUINT_MAX==2^(sizeof unsigned)-1である保証もない
819816:2007/03/26(月) 18:58:34
>>818
分かりました
別の方法を考えてみることにします・・・

レスありがとうございました!
820デフォルトの名無しさん:2007/03/26(月) 19:31:05
>>818
あれ、そうだっけ。
intとかの負数を含む型は、
オーバーフローは未定義だったのは規格で書いてあった覚えあるけど。
unsignedも未定義って書いてたっけ?
確か2^Nで余剰を取った結果になるって書いてたと思うけど。
821デフォルトの名無しさん:2007/03/26(月) 21:09:16
>>816
規格では、符号なし整数の演算結果が範囲外になったときは範囲内に収まるまで
(その型の最大値+1) を足したり引いたりした値になるとされている。 ISO C 6.3.1.3

これにより ((unsigned int)-1) は常に UINT_MAX に等しいと言える。
822デフォルトの名無しさん:2007/03/26(月) 21:19:31
UINT_MAX は-1よりも~0の方が好きだな
単なる好みの問題だけど
823デフォルトの名無しさん:2007/03/26(月) 21:21:05
オーバーフローはバグの原因になるから理解するのはいいけど、
実際にプログラムに組み込むなよw
824デフォルトの名無しさん:2007/03/26(月) 21:44:31
>>822
それって保証されてるん?
825デフォルトの名無しさん:2007/03/26(月) 22:00:58
C90/C99ともにただ 0 とだけ書いた場合は (int)0 と等価なので
それを全ビット反転するわけだから -1 になると思うが
826デフォルトの名無しさん:2007/03/26(月) 22:01:46
書き漏らした

int範囲で -1 になると思う
827デフォルトの名無しさん:2007/03/26(月) 22:02:27
負数の表現方法は C の規格外。
828デフォルトの名無しさん:2007/03/26(月) 22:03:45
~0Uだな
829デフォルトの名無しさん:2007/03/26(月) 22:12:28
つまり、-1 が 0x80000001 な環境でも
(unsigned)-1 は 0xFFFFFFFF (が UINT_MAX とする)になるということか。
830デフォルトの名無しさん:2007/03/26(月) 22:15:01
まぁそういうことだよな?
ただの -1 なら 0x80000001 で解釈されるけど
(unsigned)キャスト時はコンパイルでUINT_MAXに置換されるってことなんだろうか
831デフォルトの名無しさん:2007/03/26(月) 23:28:52
VC++ 2005を始めました。
Byte単位でのファイル入出力はできますか?
ビギナー本には書いてないし、ネットでも色々探したのですが…。
エロい人、方法を教えてくだされ。
832デフォルトの名無しさん:2007/03/26(月) 23:34:42
fread() fwrite()
833デフォルトの名無しさん:2007/03/26(月) 23:36:00
fstream
834デフォルトの名無しさん:2007/03/27(火) 07:39:04
WriteFile
835デフォルトの名無しさん:2007/03/27(火) 08:05:17
ReadFile
836デフォルトの名無しさん:2007/03/27(火) 08:19:02
fgetc()/fputc()
837デフォルトの名無しさん:2007/03/27(火) 19:33:15
linuxのg++でC/C++勉強はじめました。

POSTメソッドのHTMLのタグ処理について、
SSIを実行できないように、perlだと下記のようになります。
$hoge =~ s/<!--(.|\n)*-->//g;
#任意の文字か改行が続く場合削除

これをC/C++でやりたいんですが、どうなるでしょうか。
838デフォルトの名無しさん:2007/03/27(火) 19:37:34
regexライブラリ
839デフォルトの名無しさん:2007/03/27(火) 20:29:35
参考書を見ていて思ったのですが、
クラスのメンバになっているファイルポインタ等ポインタが
がよくそのクラスのデストラクタ内でfree()を使って手動的に
メモリ開放されているのですが、ポインタはデストラクタを
呼び出すだけでは消滅しないのですか?
840デフォルトの名無しさん:2007/03/27(火) 20:34:23
単に参照しているだけで、そのポインタの所有権を持っていないかもしれない。
だいたい、どういう手段で確保したメモリなのかも定かではない。
ので、メンバ変数だからといって、自動的にポインタの指す先を消滅させたりはできない。
841デフォルトの名無しさん:2007/03/27(火) 20:36:41
正直C++でfreeとか使わせる参考書は破り捨てた方がいいとおもう。
842デフォルトの名無しさん:2007/03/27(火) 20:45:53
>>839
自動的に消されるのはポインタそのものであって、
ポインタが指す先にあるものを消すことはない。
843デフォルトの名無しさん:2007/03/27(火) 20:50:20
>>839
消されるようなこともあるし消されないようなこともある
844デフォルトの名無しさん:2007/03/27(火) 20:53:06
そうだぞ
うんこ本と名高い独習C++でもnwe delete使ってるぞ
845デフォルトの名無しさん:2007/03/27(火) 21:16:17
>>839
ファイルポインタって何?
freeで解放するのはmallocなどで確保したメモリでしょ。
846デフォルトの名無しさん:2007/03/27(火) 21:19:05
ぬうぇwwww
847839:2007/03/27(火) 21:33:44
すいません。ちゃんとよみなおしてみたら
mallocによる動的確保なのでfreeで解放しているだけのようです。
*char は別に関係ない模様・・・。

はず貸しながらもう一つ質問します。
クラスオブジェクトをデストラクタではなくfree()で開放することはできますか?
848デフォルトの名無しさん:2007/03/27(火) 21:38:38
>>847
そのオブジェクトはどうやって構築したの?

malloc()ではコンストラクタは呼ばれない。
free()ではデストラクタは呼ばれない。
malloc()で確保したメモリ以外をfree()で解放するのは誤り。

placement newを用いてmalloc()で確保したメモリ上にオブジェクトを構築し
陽にデストラクタを呼び出し
free()で解放することは原理的に可能だが
多分それはあなたのレベルで考えるべきことではない
849デフォルトの名無しさん:2007/03/27(火) 21:40:20
>>837
flex (lex)
という手もある
850デフォルトの名無しさん:2007/03/27(火) 21:41:09
malloc() が確保する全てのメモリブロックは、最終的には free() を厳密に一度だけ呼び出して利用可能メモリのプールに戻さねばなりません。
そこで、適切な時にfree() を呼び出すことが重要になります。
あるメモリブロックに対して、free() を呼ばなかったにもかかわらずそのアドレスを忘却してしまうと、
ブロックが占有しているメモリはプログラムが終了するまで再利用できなくなります。
これはメモリリーク(memory leak) と呼ばれています。
逆に、プログラムがあるメモリブロックに対してfree() を呼んでおきながら、
そのブロックを使い続けようとすると、別の malloc() 呼び出しによって行われるブロックの再利用と衝突を起こします。
これは解放済みメモリの使用 (using freed memory) と呼ばれます。
これは初期化されていないデータに対する参照と同様のよくない結果 -- コアダンプ、誤った参照、不可解なクラッシュ -- を引き起こします。
851デフォルトの名無しさん:2007/03/27(火) 21:54:53
VC++で
char abc[8000][4000];
とかって配列作ったら怒られたんだけど、大きさの制限はどのくらいなの?
852デフォルトの名無しさん:2007/03/27(火) 21:55:40
VC6で使えるregexライブラリってあります?
VBScript.RegExp COM APIは除く。
853839:2007/03/27(火) 22:02:59
class cMyclass{
int iNum;
public:
cMyclass();
void fSample();
}
void cMyclass::cMyclass(){
iNum = 0;
}
void cMyclass::fSample(){
iNum++;
}
main(){
cMyclass oMyclass1;
for(int i=0; i<250; i++){
oMyclass1.fSample();
}
for(int i=0; i<500; i++){
oMyclass1.fSample();
}
//ここでoMyclass1を開放できないかなー。
return 0;
}

・・・こんな感じです。
メンバ関数を一度読んだだけでデストラクタによってオブジェクトを消してしまったら、
メンバ変数の変化を継続できなくなってしまうので、デストラクタのないクラスをつくり、
その1つのオブジェクトを複数回使った後にデストラクタ以外の方法でオブジェクトを
開放しようと思ったのです。
854デフォルトの名無しさん:2007/03/27(火) 22:06:16
>>851
VC++のデフォルトのスタックサイズは1MBだそうだ。
それ以上の配列が作りたいのならリンカオプションで増やすか
staticにするか動的確保かvector

>>852
boost::regex
boost::xpressive
鬼車
Perl等正規表現をサポートするスクリプトエンジンをembedする
855デフォルトの名無しさん:2007/03/27(火) 22:14:02
>>851
それだけ大きいものを記憶する場合、
ファイル入出力か、メモリマップドファイルを利用することがいいと思います。
856851:2007/03/27(火) 23:08:42
25MBのrawデータ(ファイル)を格納しようと思ってます。

>>854
リンカオプション…調べてみます。でなんとかなりますかねえ。

>>855
メモリマップドファイル…う、これも初耳。メモリ上に展開する?こと?
857デフォルトの名無しさん:2007/03/27(火) 23:11:33
>>856
char * a = new char[n]とかvector<char> a(n)でいいと思うんだけど。
858デフォルトの名無しさん:2007/03/27(火) 23:33:49
>>856
ストレージ上のファイルをメモリ領域としてアクセスできるようにする方法。
CreateFileMappingで作成できる。

まあ、今のPCで25MB程度ならnewでオンメモリさせてもいいと思うけどね。
いずれにしても単にスタックを増やすのは正道ではない。
859デフォルトの名無しさん:2007/03/28(水) 00:12:27
教えてくれたポインタにアクセスすると
裏でこっそり小人さんがファイルのRead/Writeをしてくれます。>メモリマップドファイル
860デフォルトの名無しさん:2007/03/28(水) 00:36:17
calloc(0, sizeof(char))でエラーにならないのは保障された仕様?
861デフォルトの名無しさん:2007/03/28(水) 00:45:21
>>838
>>849
レス感謝です。
検索してますが、なんか難しそうです。
862デフォルトの名無しさん:2007/03/28(水) 00:55:26
>>860
あとで、realloc( )できるようにするため。
863デフォルトの名無しさん:2007/03/28(水) 01:04:19
>>862
thx
864デフォルトの名無しさん:2007/03/28(水) 01:07:19
>>860
ISO X 3010 (C99) section 7.20.3
| 要求された領域の大きさが 0 であるとき, その動作は処理系定義とする。
| ただし, 空ポインタを返すか, 又は 0 ではない大きさを要求したときと同じ動作
| (このとき, 返されたポインタをオブジェクトのアクセスにしようしてはならない。),
| のいずれかでなければならない。

ANSI Cでも同じだったはずだが確認はしてない
865デフォルトの名無しさん:2007/03/28(水) 01:11:55
>>864

それ、どこ行けばよめる?
866デフォルトの名無しさん:2007/03/28(水) 01:13:58
867デフォルトの名無しさん:2007/03/28(水) 01:17:50
>>866
jiscのpagerのidはセッション毎に作られるもので、他のPCからそのURLへはアクセスできない。
トップからJIS検索→規格番号でX3010と入力しろと伝えるしか確実な手段は無い。
868デフォルトの名無しさん:2007/03/28(水) 04:04:27
只今メンテナンスのため
サービスを停止しています。
誠に申し訳ございません。

Service is currently unavailable.


869デフォルトの名無しさん:2007/03/28(水) 07:44:02
>>847
デストラクタ無視するなんてただのバカですが
870デフォルトの名無しさん:2007/03/28(水) 19:56:16
placement newを使いたいのかもしれないじゃん

んなわけないか
871デフォルトの名無しさん:2007/03/28(水) 20:44:05
mallocとfree・newとdelete・コンストラクタとデストラクタ
生成するものに対応する破棄があり、確保には解放がある。
この通り覚えておけばいいんでないの?
872デフォルトの名無しさん:2007/03/28(水) 20:56:11
>>871
え、まさか、new&deleteでコンストラクタ&デストラクタが使われないとか思ってるとか・・・
873デフォルトの名無しさん
コンストラクタとデストラクタは確保・解放じゃありませんがね