【初心者歓迎】C/C++室 Ver.35【環境依存OK】
547 :
デフォルトの名無しさん :
2007/03/17(土) 08:21:56 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; こういう解でいいのかね?
>>547 こんにちは、UTF-32(sizeof(int)が4であるならば)の文字コードを操る世界の人
549 :
547 続き :2007/03/17(土) 08:24:17
一応結果はこう↓なんで間違いではないと思うんだが ################################################## Type something surrounded by '" "': "characters" characters Press any key to continue . . . ################################################## 他にもっとスマートな方法がある気がしてならんのだがどうでしょう?
>>549 intの配列にする必要は無いだろうというのが、>548の主張だ。
つーか、charArrayがintってなんだよ、問題の趣旨に合ってないじゃん。
なんだかなぁ、先ずは日本語と英語の勉強をし直すところから始める必要がありそうだ。
553 :
デフォルトの名無しさん :2007/03/17(土) 11:30:08
>>550-551 それも引っ掛かってたんだよ。
だから、ここで質問してるわけなんだけど。
てか、このテキストに載ってる方法だとそれが唯一の方法に見えるんだ。
で、肝心のchar charArray[SIZE]と宣言した場合はどうやればいいの?
>>543 Boost.Serializationは設定ファイルくらいならそう面倒なく使えると思う。
>それが唯一の方法に見える 詳しく
WindowsベッタリならMSXML使えばいいんでないの。
557 :
デフォルトの名無しさん :2007/03/17(土) 12:39:52
>>555 書いた通りそのまんまだが
今読んでるテキスト"C++ How To Program"には
区切り文字を指定して文字を読み込む方法はこれだけしか載ってない。
だから、intで宣言してるのはおかしいけどあれを使うしかなかった。
結果的には一応正しい出力になってる、でもなんか引っ掛かる。
俺的には「"」が見つかったときは読み込まずにスキップして後は全部読み込む、
みたいなアルゴリズムが浮かんでる。
そ・こ・で、ここの住人の力が必要なんだが…。
>>557 > でもなんか引っ掛かる
それを説明しないと質問が成り立たないだろう。
エスパー募集なら他所でやれ。
559 :
デフォルトの名無しさん :2007/03/17(土) 12:55:42
>>558 じゃ、箇条書きで。(というか、こんな説明しなくても回答できるはずだが…)
@文字列をcharArrayという文字列配列に入れろ、という指示があるのにintで宣言している
A例えば、この入力が"character"ではなく""cha"r""ac"ter"みたいに「"」が任意の数で入ってる場合でも
きちんと読めるべきでは、と思っている(←確かに指示には書いてないが気になる)
という二点です。
そろそろ回答の方をよろしくお願いしますよ。
1. intで宣言しなきゃいいじゃん 2. 1文字ずつサーチすりゃいいじゃん
561 :
デフォルトの名無しさん :2007/03/17(土) 13:05:10
>>560 それを具体的に教えてください、どの関数を使うかなどでいいですから。
563 :
デフォルトの名無しさん :2007/03/17(土) 13:16:53
>>562 いやいや、最初からそう聞いてます。
つらつらと説明してきましたけど
>>547 の問題読んだだけで「俺ならこうやるな」って
回答がくれば即解決のはずなんですが…。
>>561 てーか、何か根本的に間違ってないかい?
標準入力からcharArrayに入れるんだろ?
なら char charArray[SIZE]; と宣言して
cin.getline(charArray, SIZE); とするべきだろ。
(詳しい仕様は忘れたので終端文字については考えてない)
そして「そこ」から引用符を取り除くという話なんじゃないの?
>>547 のコードじゃ何がしたいのかイマイチ分からん。
>>563 プログラム書いて欲しいなら最初からそういえば言えばいいのに。
宿題スレあたりで頼めばいいんじゃね?
あとさ、お前の話が理解してもらえないのは、 決して周りの人間の理解力や洞察力が足りないからじゃない、 お前に説明能力が足りないからだよ。 そこんとこ分かっていないと損するよ。他の誰でもないお前が。 多分お前よりは(無駄に)長く生きてきた俺からの真面目な忠告。
>>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
以前、宿題スレに質問したら 「え、自分でテキスト読んでやってんの?なら宿題じゃないじゃん」って書かれた経験あり。
>>569 なんでテキストに載ってる方法しか使っちゃいけないの?
573 :
デフォルトの名無しさん :2007/03/17(土) 13:34:26
574 :
デフォルトの名無しさん :2007/03/17(土) 13:36:31
これって面白いですか?
じゃあそのテキストを窓から投げ捨てて、 もっとまともなのを探せばいいだろうに。
>>571 そりゃ、普通は勉強のためにテキスト読んでるんなら、
人にコード書いてもらおうなんてのは本末転倒だからな。
もういいよ、ストリームとか全部忘れてループ回せ。 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
五時間かけた結果がこれですか…いいですよ、因果応報って言葉をお忘れなく
>>573 がんばれ!
途中参加の俺には何が何だかさっぱりわからないけどさ
583 :
デフォルトの名無しさん :2007/03/17(土) 13:41:18
あらあら、
>>581 の三秒前に回答が。
>>580 さん、どうもありがとうございますです。
それなら確かにできそうです。
584 :
デフォルトの名無しさん :2007/03/17(土) 13:42:25
>>577 死ね、マジで死ね
おまいなんか生きる資格ねぇよカス
>>584 だれが書いたか知らないけどそんなこというなよ
>>579 「調べる=人に聞く」だとでも思ってるの?
だから、>547の問題の文章をちゃんと理解するところから始めなきゃダメだって。
>>586 >>547 は自分でコード書いてどうですかって聞いてるんだから
それから調べるキーワードくらい教えてやってもよかったんじゃないか?
>>587 原文もついてる訳だから読めなかった回答者が悪い
こっちは宿題スレじゃないし、それが妥当だったかもねー
>>590 それなら早く言ってあげればよかったのによくもまあネチネチと
あらあら、今日も釣り大会ですか?釣果はどうでしたか?w
いや俺途中参加だし、そんなこと言われても困る
五時間もよく粘ったな
>>588 そうは言っても元のコードが iostream 使ってるんだから
そこから調べたらいくらでも情報が出てくるはずだろ。
模範解答らしい >580 にはキーワードを足す必要があるものは
一個も無いし。その後の流れを見ても質問者がとんでもなく
アホだったとしか考えられない。
>>596 じゃ、そのiostream使ってるんだから、のくだりを書いてやれよ
自分が初心者だった頃は泣きついてたくせに
>>596 そのいくらでも情報が出てくるから困るんだろが
電話帳渡されて583-1723見つけろって言われて見つけられるかおまえ?
お前が言ってるのはそういうこと
iostreamってテンプレート使ってるから初心者には少々取っつきづらい まぁいきなり全部理解しようとせずに少しずつ順番に使うようにすると 勝手に手が動くようになってるけど
>>597 「くだり」って、「〜調べたらいくらでも情報が出てくるはずだろ」って書けばよかったのか?
言ってることは >577 と同じなんだが。
>>598 電話帳は番号で検索できないが Web はキーワードで検索できる。全然違うな。
途中参加です。 本のコピペでプログラムを作ろうとしているのか。 俺はiostreamに詳しくないのだ。 質問者が何処まで知っていて何を知らないのか判らないから 回答が難しいよね。 まだ5時間しかやってないのか。 これにこりずに続けろよ。
こんなところでもいじめやってんだから日本のいじめは根深いね
ま、いじめた側はどうせいつか同じ目に遭うよ ほっとけ
これは本当にひどい
もっとふざけた奴なら釣ってもいいだろうけどあんなマジメなのはやめとけよ
560 から 580 が導き出せないのは異常。
読ませてもらった
俺からは
>>586 は無事なんだが
>>586 の子供がいじめられて自殺するように呪っとくわ
それくらい悪質だな
586は少なくとも2chの中ではごく普通のことだと思うが
俺一応真面目に答えた側なんだけど。 なんつーか、行き詰まっているのに妙に自信過剰というか、 変な意地が見え隠れするのが気になった。 真面目なのは確かなんだろうけど、それは必ずしも 皆から受け容れられるということを保証してはくれないわけでさ。 自分も相手も匿名のこの場でこういう経験しておけたのは 長い目で見ればプラスなんじゃないのかなぁと思ってみたり。
根拠のないプライド持った能無しほど困った存在もないからな。
たまたま俺みたいなやさしい人がいなかったときに書き込んだのが 運が悪かっただけだよ。 2ちゃんねるが@IT会議室みたいにはなって欲しくない。
つーか、そもそも>547の原文の下の訳が滅茶苦茶なわけで。
ん?そうか?どこが?
つーかお前らよくこんな下らないことでスレ引っ張るな。
そんなに暇なのか?
>>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初心者は帰れ
C版 #include <stdio.h> int main() { char charArray[51]; if (scanf("\"%50[^\"]\"", charArray) != 1) return 1; puts(charArray); return 0; }
>>616 と
>>618 見るまで入力テキスト内の"を全て取れって問題だと思ってた
最初と最後にしか出てこないんだな
>>619 Read a string of the form "characters"
621 :
デフォルトの名無しさん :2007/03/17(土) 17:54:39
今Linuxで動くアプリケーション(なんて大げさなものでもないですが)を作っています。 一般的なC++におけるDebugビルド用のマクロって何か決まっていますか? _DEBUGってのは Visual C++用みたいですが・・・ 自分で勝手にマクロ決めていいもんなんですかねえ
アンダースコアで始まらない名前なら何でもおk
逆に、assert.hではNDEBUGを利用している。 まぁ無難に、DEBUGで委員ジャマイカ。
>>621 リリースビルド時に NDEBUG 定義するから NDEBUG 定義されてないときがデバッグビルド。
それってただ多くのコンパイラで採用されてるだけ? それとも規格で決まってるの?
623は規格で定まっている事項。
627 :
625 :2007/03/17(土) 22:01:11
ありがとう! どんな環境でも安心して使えるんだね。
規格を守っていないシステムが存在しないという証明はできないから どんな環境でも安心して使えるということにはならん
そんなときは 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' : サイズが不明です。 とか怒られてしまいます・・・
const unsigned int c = 231; int *d = malloc(c); こんなかんじ?
C++ って言ってるから new じゃね? int* b = new int[a]; 使い終わったら delete b[];
delete[] b でしょうがぁぁぁあああ!!!
ごめんなさい>< boost::shared_ptr しか使ってないからもう忘れました><
635 :
630 :2007/03/18(日) 00:54:35
こんな早くレスもらえるとは! ありがとうございます
>>634 配列に shared_ptr は使えないんじゃね?
vectorでいいじゃん。
>>636 shared_array があるじゃん
>>634 たぶんこんな感じ
namespace bll = boost::lambda;
boost::shared_ptr<int> hoge(new int[42], bll::bind(bll::delete_array, bll::_1));
素直にshared_array使えよw
シャーベット・アーリーと読んでしまったorz ネヨ…
寝る前に、 早くシャーベットを食べるんだ。
虫歯に注意
引数が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]"って何の型?? みたいな話もあるんですが、 解説とスマートな解決策をご教授願えれば幸いです。
>>644 double av_arr[4];
確かに av_arr と &av_arr[0] は、
同じ値になるけど
型としては別のものだよ。
ちょっとややこしいね。
>>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++ でも入門書あたりだろう。
>>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);
になっちゃうよ。
>>645-647 さん
ご丁寧な解説、痛み入ります。
おかげさまで、理解に至りました。ありがとうございます。
お察しの通り、読んでいるのはC++の入門書ですね、はい。
精進いたします。
vc8で、スタック上に複数のオブジェクトを作ったとき デストラクタは作った順とは逆の順番で呼び出されるようですが これに依存するような、オブジェクト間の依存関係を作ったりしてもOKなんでしょうか?
構築した逆順で解体されるのは規格で保証されて滝ガス。
うん。OK
違う順番で解放されたらスタックじゃないしな
スタックだからこそじゃないんですか?
実行順を保証しないと困る事があるからだ。 依存し合ってる場合とか。 そもそも、自動変数がスタックで実装されるかどうかなんて 規格で決まってないっしょ?
>>649 でスタック上って言ってるからスタック前提の話かと思いました
>>656 kouza.cppとmain.cpp両方で、多重対策してないkouza.hをインクルードしてるせいで多重定義になってるだけじゃないの?
>>648 オブジェクトA・B・CとプッシュされたものはC・B・Aと取り出される
プログラムの関数もスタックを使って実装されてる
ソースファイル上で関数宣言の後などに LFが挿入されているのをよく見掛けるんですが これってどういう意味があるんですか? void hoge(int piyo) { } ^L みたいな感じ
そんなの見た事ない。 文字コードの違う環境でいじったんじゃね?
>>660 LF(^J)なら必ず入るだろ、改行コードだから。
FF(^L)なら改ページコードとして入れるという習慣が一部にあるらしい。
プリンタに出力したときに関数単位で出力されることを期待しているのだろう。
663 :
656 :2007/03/20(火) 00:33:27
>>658 kouza.cppの中身(「#include"kouza.h」以外")をkouza.hに移して試してみたのですが、
依然エラーは消えないままです。
main.cppの方に移しても同様なので、原因は別のところにありそうです。
具体的にはどのようにコンパイルしているんだ?
665 :
656 :2007/03/20(火) 02:05:14
>>664 Cpadでコンパイル時パラメータの欄に
main.cpp kouza.cpp kouza.h
と入力した状態でコンパイルしています。
>>665 Cpadは使った事無いけど、ヘッダーファイル(kouza.h)も指定しないといけないの?
Visual C++ 2005EEとg++ 4.1.2で普通にコンパイル通ったよ。
>>656 CPadってBorlandC++Compilerだけだっけ?
↑なら
bcc32 main.cpp kouza.cpp で正常にコンパイルできたけど
パラメータの入力順が違うだけだったりな kouza.h kouza.cpp main.cpp とか
ヘッダをC言語としてコンパイルしているので、classでエラーが出るという落ちでは
>>663 そんなことしても多重対策にはならんわいw
671 :
656 :2007/03/20(火) 15:43:42
みなさん回答ありがとうございます。無事に解決することができました。
>>666 kouza.hを外したらコンパイルが通りました。
以前にヘッダも指定した時はたまたま上手くいったので、
それが正しいと思い込んでしまっていました。
>>670 kouza.cppの中身を移してkouza.hとmain.cppだけをコンパイルすれば
対策ではなく、そもそも多重定義が起こらないと思ったのですが・・・
何か自分が勘違いしてるかもしれません。申し訳ないです。
>>662 ^LはFFなんだね.首でも吊ってくるよ
勉強になった dクス
windowsでMSTPサーバを使用して、メール送信してますが outlookで、メール送信することできるでしょうか? APIかコマンドラインから使うことできれば、便利なんですが。 よろしくお願いします。
Outlook Expressのことなら知らない。 OfficeのOutlookなら、VBAでできるかやってみろ。 それでできたらC++でもできる。
>>675 レス感謝です。
検索して、しらべてみます。
>>674 メーラーを外部から操作するためのMAPIというAPIがあり、Outlookは
対応しているが、ある時点で(XPのSP2だったかな?)、セキュリティ絡みで
非常に強い制限が課せられるようになったはず。
送信が許可されてたかどうか。
済みません、int から byteヘとか そのまた逆にする場合はどうしたらいいでしょうか? ググッたんですがJavaやC#は見つかったんですけれども C++が見つからなくて 初心者の質問で済みません
CやC++にはbyteなどという型は存在しないのでintからbyteにする方法などはありません
あっそうなんですか そうすると今使ってる byteはwinやTurbo C++の環境なのかな...orz もうちょっと調べてみます
typedefでしょ? castすればいい。もちろんcastの動作を理解した上でやってね。
byteとcharって、どの程度違うの?
有り難う御座います、castの知識曖昧な所が多いので 勉強しながらやってみます
>>682 charはコンパイラによって符号ありだったりなしだったりするが
BYTEは大抵は符号なしcharのtypedef
byteはシラネ
>>678 static_cast
おそらくbyte→intのように、扱える範囲が広くなるほうへは使わなくても平気。
Cとの互換を保つため実は狭くなる方へもキャスト無しで行けるが、キャスト使っておけ。
エラーにできないもんだから、みんな警告を出す。
有り難う御座います やってみます
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]としなければならず、なんとも気持ちが悪いものです。 一般的にはこのようなループはどのように対処するものなのでしょうか?イディオム的なものはあるのでしょうか?
>>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 悪魔が入ります。
>>689 > int * src = table[-1];
おまえ正気かいな
>>687 >res[i-1]
結局行き着くのはここ
それで気持ちが悪いとか言ってたらC/C++なんてやってらんねぇよ
>>689 そんなにアクセス違反とか領域破壊とかしたいのかおまいはw
添え字に飽和減算マクロを使えばおk
>>687 res[i-1] はコンパイラによって (res-1)[i] みたいに
なることが多いので気持悪く思う必要はない。最初から
(res-1)[i] とも書けるけどこれは規約違反。
>>694 (res-1)[i] <-> *(res-1+i) <-> res[i-1]
resがポインタ型なら常にこれらは等価。
規格にもなんら違反していない。
694自身もしくは694の職場でのコーディング規約なのでは?
ついでに言うと(-1+i)[res]でも同じだな。キモ過ぎるなこれ。
>>694 はポインタ同士の演算(減算を除く)が不正であることと
混同してるんじゃないか?
>>687 for( int i=1; i<128; i++){
res[ i - 1 ]=table[ i ]*5;
}
じゃダメなの?
それ意味変わってね?
>>698 さすがにそんなコードは書かないけど、
C言語におけるポインタとはどういうものかを知るには
素晴らしい例だと思う
>(-1+i)[res] の解説キボンウ
例えば res[i-1] ってのは (resが指し示すアドレス)と(添え字=この場合ならi-1) との単なる加算を行い、そのアドレスが保持している値を返す。 数字が前に来ようが後に来ようが両方に来ようが 加算の結果は変わらないので指し示すアドレスも変わらず、 よって問題は起こらないと
>>702 解説面倒だからポインタがなんであるかの勉強してこい
>>702 a, bの片方がポインタ型で他方が整数型である場合、a[b] は *(a+b) に等しい。
目からぬるぽでした 解説あんがとさんでした
無料でC++使える環境は?.NET使えなくていいから
cygwin, mingw gcc
>>706 なるほど。C FAQをもう一度読み直すとするか…。
>>707 目にガッしていいの?
目にガッって、やっていいの?
BCC
デバッグ出力なんかだと、時折り"NULLPO"[ga]なんてのも使うよね。 #流石にga["NULLPO"]とはしないけど。
俺はテストデータに"いろはにほへとちりぬるぽ"とか使う。 最初は反応してくれる人が居たけど、最近は誰も反応してくれなくなった。 いいかげん、次のネタを考えんといかん。
716 :
デフォルトの名無しさん :2007/03/24(土) 02:17:01
分割コンパイルをやってて、 コンパイルすると「外部シンボル”○○(自分で定義した関数)”が未解決です」 ってでるんですが、俺はどうしたらいいですか?
>>716 コンパイラエンジンの使い方を勉強すればいいと思います。
>>716 コンパイルだけじゃなくてリンクまでやっちゃってるから。
それはリンカが出してるエラーメッセージ。
変数の命名に関して質問です。 メンバ変数の末尾に"_"をつけているソースをよく見ますが、 これはシステムが利用している変数名とは被らないのでしょうか? 自分で調べたところ、_xや__xや_x_はダメだという記述は 見られましたが、x_に関しての記述はなかったもので。
720 :
716 :2007/03/24(土) 03:20:22
>>717-718 こんな質問に答えてくれてありがとうです。
このエラーを解決するにはどうすればいいですか?
一通りググってみたけど、いまいち理解出来ませんでした。
質問ばかりですいません。
>>719 末尾なら良いんでないでしょうか。
俺はアンダースコア(アンダーバー)で終わる変数名は
つけないけど。
>>719 末尾についてるのは大丈夫。ただし C++ では末尾でも(途中も含めて)二重なのはダメ。
>>720 ○○が定義されているオブジェクトファイルもリンカに渡せ。
>>720 まず、お前自身が自分がなにをやってるのか正確に理解する必要がある。
フツーのコンパイルなら一度に全てのソースをコンパイルしリンクを行う。
分割コンパイルの場合は一部のソースのコンパイルだけ行う。
リンクは全てのソースのコンパイルが完了している任意のタイミングで行う。
で、お前の今の状況だが、大きく二つのケースに分かれると思う。
ひとつはコンパイルだけ行えばいいタイミングでリンクまでやっている。
( 通常、コンパイラは"コンパイルのみを行う"という指示がない場合、勝手にリンクまでやっちゃう。 )
もうひとつはリンク時に必要な( ソースファイルをコンパイルして生成される )オブジェクトファイルが
全部そろってない、あるいはオブジェクトファイル自体はあるが、リンカに渡っていない。
>>720 ヘッダで関数宣言だけしてあるけど、
中身の定義が見つからんてことだよ
726 :
716 :2007/03/24(土) 03:59:33
どうやら自分は何がしたいのかが理解できてないようです。 取り敢えずもう少し勉強してみます。 こんな時間におさがわせしました
727 :
デフォルトの名無しさん :2007/03/24(土) 04:01:15
まあそう言わずに思いのたけをぶつけてくれたまえ。
>>726 具体的にどんな環境でどんなふうにコンパイルしてるのか、詳しく教えてくれれば
多分、ちょっとしたことでうまくいく問題だぞ。
729 :
429 :2007/03/24(土) 04:17:10
730 :
デフォルトの名無しさん :2007/03/24(土) 04:22:44
#define って そのソースファイル内でしか適用されんの? また同じ #define をソ−スごとに書かないと駄目なの?
731 :
デフォルトの名無しさん :2007/03/24(土) 04:27:33
>>730 プリプロセッサだもの、そりゃそうでしょ。
いっぱい書きたくなかったらヘッダに書けばおk。
同じ #define を複数箇所に書くとかあまりにも意味がないw
>>730 コンパイルオプションで指定するならソース上のどこにも書かなくていいよ。
734 :
デフォルトの名無しさん :2007/03/24(土) 04:34:19
>>731 ヘッダに書いてインクルードさせれば使えるの?
#includeは単なるファイルのコピペ指令だ 気張る必要はないよ
>>732 それそのまんまマイクロソフトに言ってやれ
一応VC++でのコマンドラインからのコンパイルとリンクの仕方を msdnから抜粋しといた。必要ないから、俺は使ったこと無いけど コマンド ラインで、オブジェクト ファイル FIRST.obj と SECOND.obj が作成される。 CL /c FIRST.C SECOND.C 実行可能ファイルを作成するには、LINK を呼び出す必要があります。 LINK firsti.obj second.obj /OUT:filename.exe
WinXP、MinGW-5.1.3を使ってます。 10E13位の実数を扱いたいんですが、float型やdouble型で宣言しても warning: integer constant is too large for "long" type というエラーが出てしまいます。どうすれば解決できるでしょうか。
コード書け
740 :
738 :2007/03/24(土) 11:27:25
これだけなんですが。 float na; long nb; na = 100000000000; nb = 1000000000;
double f[] = {100000000000000., 10e+13};
エラーメッセージのまんまだな。 longリテラルではなく浮動小数点リテラルとして認識させればいいだけ。
745 :
738 :2007/03/24(土) 11:36:04
宣言はできましたが、数値を代入したら同じエラーが出てしまいました。 代入するには f[0] = 100000000000; でいいんですか?
>>740 na = 100000000000.0f;
つーか10E13ってそういうことか
てっきり0x10E13かと思ってたわ
>>745 だからdoubleリテラルにするために小数点かeつけろよ
748 :
738 :2007/03/24(土) 11:48:23
代入する数値に.を付けて f = 100000000000.; としたら解決しました。ありがとうございます。
>>737 -cオプション与えなければclでexeを直接生成できるよ。
cl -o foo.exe first.c second.c
でよい。
ま、普通は(Makefileを使うような場合は)-cオプションつきでobjを
作った後で結合するけどな。
C++版のgetch()ってありますか?
ない。そもそもgetchは標準関数ではないのだからC++がどうこう言う話ではないだろ まあ、conio.hがある環境なら#includeしとけば使えると思うよ
標準じゃなかったんですね・・・ 回答ありがとうございました
#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なのも理解できません なぜこうなるんでしょうか?
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が選ばれたということ。
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だから
>>754-755 うぉぉ すごく良くわかりました
> const PBYTEはBYTE* constになる。
これに気づけなかった。感激です
あとドルジっょぃ
ポインタが絡んだときに、constがどこにつくかってのは、定期的に出るね。 cont BYTE * だから分かりにくいのであって BYTE const * //上の型はこれ BYTE * const BYTE const * const そもそもなんで、型の前にも後ろにも付けられるようにしたんだか。 後ろだけだったら、こんなに混乱しなかったはずなのに。
>>757 C++の言語仕様は何でもあり
これがすべての混乱の元と言われている
結局C/C++は女子供の使うものじゃなかったんだよ。 スキルのもった、何でも自分で出来る現場のおっさんが、好きなように出来るように作られたもの それが出来ないなら、制限されたC♯で"安全な"プログラムを組めって事さ
>>758 これはC++だけではなく、基のCからそうだった。
const BYTE *A だったら (const BYTE)←Aって感じでポインタのAがconst BYTEを指してますよーっ て感じで直感的かもしれない気がしただけでしたごめんなしあ
C++はオブジェクト指向が追加されて更に言語仕様が複雑になった CはポインタとGOTOを制限すれば構造化プログラミングを 正常に行える。 オブジェクト指向言語でありながらポインタがある。この言語仕様で 自由にプログラマーがコーディングする他人が読めないコードに なるのはむしろ必然
GOTOなんて気持ち悪すぎ
玄人がするような発言をして下さい↓
gotoにも使いどころはあるよ
プログラミング規約を行わないでコーディングさせたら プログラムを複雑にするのは事実 フレームワークを言語に取り入れるのは大規模開発では常識となっている。 世界で活躍するプログラマになると実行速度・コードサイズ・可読性に優れた コーディングを行っている。 他人が読めないコードは最悪のコーディングスタイルだ
実行速度やコードサイズを犠牲にして可読性上げてるんじゃなかったっけ・・・
エセ玄人がするような発言をして下さい↓
実行速度・コードサイズは最適なアルゴリズムを採用することにより実現 可読性はクラス設計を適切に行い、関数の粒度を均一にすることで実現 更に優秀なプログラマなら再利用可能なプログラム設計も行える。
ごめんなさい どれも出来ません。
・最適な ・適切に ・関数の粒度を均一にすること ・優秀なプログラマ
goto 使わずにどうやって for の二重ループから脱出するの?
フラグ立てんじゃね? まあ俺はgoto使っちまうがな
日本ブレイク工業社歌ばりにブレイクブレイク。
最初は素直な実装を心がけてればいいんじゃないかな
2重ループを関数に移してreturnするな俺は
で、goto 使うななんて発言はどこにも見当たらないんだが…
ばっかだなぁ throwがあるじゃないか
例外ってgotoよりタチが悪いだろ
gotoを全く使ってはいけないのではなく、多用すると可読性が悪くなるから制限が必要 多重ループからの離脱はgoto使うとむしろ可読性が良くなるから使うべきケース
try throw catchってやばいのん?
>>783 もちろん、ちょーやばい。宇宙並みにヤバイ。お前は絶対使うなよ! やばいから!
・・・俺は使うけど。
例外は"見えないgoto"だとはよくいったものだ。 悪用すると、gotoよりも可読性が悪くなる。 使わなくて済むのなら避けるべき。
どの言語でも例外を非ローカル脱出に使うのは推奨されていないなあ…
例外って、使う使わないというものじゃなくて 「使わざるを得ない」ものではなかろうか
うるさいうるさいうるさい!
質問失礼します。 とある関数で、time(NULL)を種として乱数を発生させているのですが、 高速で繰り返し関数を呼び出しているため、同じ乱数が何度も発生してしまいます。 速度を落とさずこれを回避するには、どうすればよいでしょうか?
種を与えるのは一回だけでいい
791 :
デフォルトの名無しさん :2007/03/25(日) 18:43:58
循環参照とか循環インクルードとか、 このヘッダインクルードしたらこのヘッダもついてくるから 新しくヘッダつくるかそしたらこのヘッダインクルードしないといけないから そしたらこのヘッダもついてくるからって もう嫌になった
インクルードガードしろ
分割コンパイルするならインクルードガード必須だろ、常識的に考えて
794 :
デフォルトの名無しさん :2007/03/25(日) 20:00:55
インクルードガードは本当は良くないんじゃないんですかね。 それはただの対処法ってだけじゃないの?
やっぱ#pragma onceで重複処理するだけって駄目なのか・・・
>>794 ただの対処法がダメならどうしろとw
>>795 そいつぁコンパイラを選ぶんじゃなかったか
797 :
デフォルトの名無しさん :2007/03/25(日) 20:14:56
>>796 基本的に循環しないように分割の設計していかないと駄目だと思うのよね。
それが基本的に本当だと思うのよね。
ヘッダ1000個とかになって人間として難しいって時の対処法でインクルードガードがあるんだと思うんだよね。
それはつまり、NULLが定義されているのがstddef.hのみだった場合 stdio.hやstdlib.h内でstddef.hをincludeするのは禁止で、かつ ユーザーはstdio.hとstdlib.hの両方を使用するコードを書くべきではない ということですよね?
標準ライブラリは重複してもおkなの?
何をもっておkとしたいのか判らん オブジェクトコードを1バイトでも軽くしたいとかコンパイルを1秒でも早く終わらせたいとか そんな目標があるのか?
つまり発生する問題はその程度ということですか、ならおkです
>>797 >基本的に循環しないように分割の設計していかないと駄目だと思うのよね。
>それが基本的に本当だと思うのよね。
んなこたねーよ馬鹿。循環していなくても
同じ宣言・定義を2回読む危険性はあるだろ。
>>799 標準ライブラリもインクルードガードされているから大丈夫。ソース見れ。
>>800 #include <stdio.h>と何回も書くと
その分だけオブジェクトコードが増えるとでも思ってるのか?
時間は数ミリくらいは遅くなるだろうが。
804 :
デフォルトの名無しさん :2007/03/25(日) 23:18:38
>>798-
>>803 バカかお前ら。依存関係の事言ってんだよ
805 :
デフォルトの名無しさん :2007/03/25(日) 23:24:59
>>806 に関連して(このスレの流れには関係ないが)
borlandのコンパイラ及びmakeは、自動的に依存ファイルの更新をチェックする機能がある
(.objのコメントにincludeされたファイルと日付を含め、makeがそれをチェックする)
まあmakeにかかる時間が若干増えるが。
>>806 Indian Hill スタイルガイドを策定したヤツは馬鹿ですか? 信じられん。
一度、#include を入れ子にしてないプログラムのメンテしたことあるけど地獄だったぞ。
例えばクラスAを保持しているクラスBとCがあって、それぞれが別々の .cpp と .h のセットに記述されていた場合とか、 入れ子 #include が禁止だと非常に困る
>789 どういう状況かは知らないが、似たような経験がある。 とあるアプリのプラグインを開発していたんだけど、 アプリの仕様上、その機能が使われる度に毎回プラグインがロードされるので static変数が使いにくいという状況だった。 そのときに色々と調べて見つかった方法が、 ・シードをファイル等に書き込んでおく ・プラグインとは別にプロセスを立ち上げ、種を保持しておく ・ミリ秒ではなくマイクロ秒を種に与える の3つだった。他にもあるかもしれない。
812 :
デフォルトの名無しさん :2007/03/26(月) 16:52:23
そりゃ、自分のプロセスのテーブルを上書きして書き換えてるだけだから。 そこのページに置いてある API_Hook.zip をちゃんと読めば分かるよ。
815 :
812 :2007/03/26(月) 17:40:00
>>813 >>814 レスありがとうございます。
ご指摘の通り、ソースを調べてから質問するべきでした。
また、スレ違いであることも、重ねてお詫びします。
申し訳ありませんでした。
Cの質問です。 unsigned int a = 1; a -= 2; このとき、aの値がUINT_MAXになることは保障されているのでしょうか?
UnsignedIntegerOutOfBoundExceptionがシグナれます
>>816 整数オーバーフローが発生した場合の動作は未定義
そもそもUINT_MAX==2^(sizeof unsigned)-1である保証もない
819 :
816 :2007/03/26(月) 18:58:34
>>818 分かりました
別の方法を考えてみることにします・・・
レスありがとうございました!
>>818 あれ、そうだっけ。
intとかの負数を含む型は、
オーバーフローは未定義だったのは規格で書いてあった覚えあるけど。
unsignedも未定義って書いてたっけ?
確か2^Nで余剰を取った結果になるって書いてたと思うけど。
>>816 規格では、符号なし整数の演算結果が範囲外になったときは範囲内に収まるまで
(その型の最大値+1) を足したり引いたりした値になるとされている。 ISO C 6.3.1.3
これにより ((unsigned int)-1) は常に UINT_MAX に等しいと言える。
UINT_MAX は-1よりも~0の方が好きだな 単なる好みの問題だけど
オーバーフローはバグの原因になるから理解するのはいいけど、 実際にプログラムに組み込むなよw
C90/C99ともにただ 0 とだけ書いた場合は (int)0 と等価なので それを全ビット反転するわけだから -1 になると思うが
書き漏らした int範囲で -1 になると思う
負数の表現方法は C の規格外。
~0Uだな
つまり、-1 が 0x80000001 な環境でも (unsigned)-1 は 0xFFFFFFFF (が UINT_MAX とする)になるということか。
まぁそういうことだよな? ただの -1 なら 0x80000001 で解釈されるけど (unsigned)キャスト時はコンパイルでUINT_MAXに置換されるってことなんだろうか
831 :
デフォルトの名無しさん :2007/03/26(月) 23:28:52
VC++ 2005を始めました。 Byte単位でのファイル入出力はできますか? ビギナー本には書いてないし、ネットでも色々探したのですが…。 エロい人、方法を教えてくだされ。
fread() fwrite()
fstream
WriteFile
ReadFile
fgetc()/fputc()
linuxのg++でC/C++勉強はじめました。 POSTメソッドのHTMLのタグ処理について、 SSIを実行できないように、perlだと下記のようになります。 $hoge =~ s/<!--(.|\n)*-->//g; #任意の文字か改行が続く場合削除 これをC/C++でやりたいんですが、どうなるでしょうか。
regexライブラリ
参考書を見ていて思ったのですが、 クラスのメンバになっているファイルポインタ等ポインタが がよくそのクラスのデストラクタ内でfree()を使って手動的に メモリ開放されているのですが、ポインタはデストラクタを 呼び出すだけでは消滅しないのですか?
単に参照しているだけで、そのポインタの所有権を持っていないかもしれない。 だいたい、どういう手段で確保したメモリなのかも定かではない。 ので、メンバ変数だからといって、自動的にポインタの指す先を消滅させたりはできない。
正直C++でfreeとか使わせる参考書は破り捨てた方がいいとおもう。
>>839 自動的に消されるのはポインタそのものであって、
ポインタが指す先にあるものを消すことはない。
>>839 消されるようなこともあるし消されないようなこともある
そうだぞ うんこ本と名高い独習C++でもnwe delete使ってるぞ
>>839 ファイルポインタって何?
freeで解放するのはmallocなどで確保したメモリでしょ。
ぬうぇwwww
847 :
839 :2007/03/27(火) 21:33:44
すいません。ちゃんとよみなおしてみたら mallocによる動的確保なのでfreeで解放しているだけのようです。 *char は別に関係ない模様・・・。 はず貸しながらもう一つ質問します。 クラスオブジェクトをデストラクタではなくfree()で開放することはできますか?
>>847 そのオブジェクトはどうやって構築したの?
malloc()ではコンストラクタは呼ばれない。
free()ではデストラクタは呼ばれない。
malloc()で確保したメモリ以外をfree()で解放するのは誤り。
placement newを用いてmalloc()で確保したメモリ上にオブジェクトを構築し
陽にデストラクタを呼び出し
free()で解放することは原理的に可能だが
多分それはあなたのレベルで考えるべきことではない
malloc() が確保する全てのメモリブロックは、最終的には free() を厳密に一度だけ呼び出して利用可能メモリのプールに戻さねばなりません。 そこで、適切な時にfree() を呼び出すことが重要になります。 あるメモリブロックに対して、free() を呼ばなかったにもかかわらずそのアドレスを忘却してしまうと、 ブロックが占有しているメモリはプログラムが終了するまで再利用できなくなります。 これはメモリリーク(memory leak) と呼ばれています。 逆に、プログラムがあるメモリブロックに対してfree() を呼んでおきながら、 そのブロックを使い続けようとすると、別の malloc() 呼び出しによって行われるブロックの再利用と衝突を起こします。 これは解放済みメモリの使用 (using freed memory) と呼ばれます。 これは初期化されていないデータに対する参照と同様のよくない結果 -- コアダンプ、誤った参照、不可解なクラッシュ -- を引き起こします。
851 :
デフォルトの名無しさん :2007/03/27(火) 21:54:53
VC++で char abc[8000][4000]; とかって配列作ったら怒られたんだけど、大きさの制限はどのくらいなの?
VC6で使えるregexライブラリってあります? VBScript.RegExp COM APIは除く。
853 :
839 :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つのオブジェクトを複数回使った後にデストラクタ以外の方法でオブジェクトを 開放しようと思ったのです。
>>851 VC++のデフォルトのスタックサイズは1MBだそうだ。
それ以上の配列が作りたいのならリンカオプションで増やすか
staticにするか動的確保かvector
>>852 boost::regex
boost::xpressive
鬼車
Perl等正規表現をサポートするスクリプトエンジンをembedする
>>851 それだけ大きいものを記憶する場合、
ファイル入出力か、メモリマップドファイルを利用することがいいと思います。
856 :
851 :2007/03/27(火) 23:08:42
25MBのrawデータ(ファイル)を格納しようと思ってます。
>>854 リンカオプション…調べてみます。でなんとかなりますかねえ。
>>855 メモリマップドファイル…う、これも初耳。メモリ上に展開する?こと?
>>856 char * a = new char[n]とかvector<char> a(n)でいいと思うんだけど。
>>856 ストレージ上のファイルをメモリ領域としてアクセスできるようにする方法。
CreateFileMappingで作成できる。
まあ、今のPCで25MB程度ならnewでオンメモリさせてもいいと思うけどね。
いずれにしても単にスタックを増やすのは正道ではない。
教えてくれたポインタにアクセスすると 裏でこっそり小人さんがファイルのRead/Writeをしてくれます。>メモリマップドファイル
calloc(0, sizeof(char))でエラーにならないのは保障された仕様?
>>860 あとで、realloc( )できるようにするため。
>>860 ISO X 3010 (C99) section 7.20.3
| 要求された領域の大きさが 0 であるとき, その動作は処理系定義とする。
| ただし, 空ポインタを返すか, 又は 0 ではない大きさを要求したときと同じ動作
| (このとき, 返されたポインタをオブジェクトのアクセスにしようしてはならない。),
| のいずれかでなければならない。
ANSI Cでも同じだったはずだが確認はしてない
>>866 jiscのpagerのidはセッション毎に作られるもので、他のPCからそのURLへはアクセスできない。
トップからJIS検索→規格番号でX3010と入力しろと伝えるしか確実な手段は無い。
868 :
デフォルトの名無しさん :2007/03/28(水) 04:04:27
只今メンテナンスのため サービスを停止しています。 誠に申し訳ございません。 Service is currently unavailable.
>>847 デストラクタ無視するなんてただのバカですが
placement newを使いたいのかもしれないじゃん んなわけないか
mallocとfree・newとdelete・コンストラクタとデストラクタ 生成するものに対応する破棄があり、確保には解放がある。 この通り覚えておけばいいんでないの?
>>871 え、まさか、new&deleteでコンストラクタ&デストラクタが使われないとか思ってるとか・・・
コンストラクタとデストラクタは確保・解放じゃありませんがね