【初心者歓迎】C/C++室 Ver.60【環境依存OK】
前スレが1000行ってたんで立てました。
いちょつ
4 :
デフォルトの名無しさん :2008/10/15(水) 17:12:51
環境:VisualStudio2008 class x { public: methodA(); methodB(); private: int x; int y; } みたいなクラスがあって methodA() { // 初期化 x = ... y = ... } methodB() { // x、yを使って作業をする } といった感じで処理をしているのですが、変数xとyが methodBに入った瞬間に壊れてしまいます。 一瞬、メモリの越境破壊かな? と思ってデバッガの変数ウォッチで追いかけてみたのですが デバッガで見る分には確実にmethodBに入る瞬間に壊れています。 値が16進の 0x303030 固定なので人為的なものを感じるのですが、 何か原因の可能性として思いつくようなものはありますでしょうか?
あ、例示のクラス名と変数名が一緒なのは単なるミスです。
C言語をゲーム感覚で学べるソフトとかありませんか? 例えばlispで言うnsclisperみたいな物があればいいです。
7 :
デフォルトの名無しさん :2008/10/15(水) 17:27:41
独自のアロケータを使ったstring型を作れたのですが、出力方法がわかりません。 キャスト無しでもキャストしてもエラー出ます。 coutの拡張は難しいです。 なんとかなりますか? typedef basic_string<char, char_traits<char>, userallocator <char> > u_string; int main() { u_string a="abcdef"; // cout<<(char*)a; }
8 :
デフォルトの名無しさん :2008/10/15(水) 17:33:12
自己解決しました u_string a="abcdef"; cout<<&a[0]; でもデータが連続していて最後が0になってないと駄目なんですが。 不連続でも可能な方法ありますか
9 :
デフォルトの名無しさん :2008/10/15(水) 17:36:23
a.c_str(); が使用可能でした。STLは便利ですね。 これならデータが不連続でも良さそうなんですけど もしデータが100Mとか貯まっていたらメモリにコピーを用意するのに それだけ悔いますよね。直接ファイルに書き出したい場合に方法無いですか?
10 :
デフォルトの名無しさん :2008/10/15(水) 17:38:00
substrで少しずつ書き出すことにします
11 :
4 :2008/10/15(水) 17:50:07
すいません、自己解決しました。 自分で文字バッファを'0'でクリアしてたのが越境してました
>>11 > 確実にmethodBに入る瞬間に壊れています
これが違ってたこと?
思いこみって怖いねXD
質問です クラスのプライベートで typedef struct { char Question[256]; // 問題 char Select[256]; // 選択肢 int Answer; // 答え } Question, *Quiz; }; を定義して デフォルトコンストラクタで Quiz = new Question[MAX_QUIZ]; とやったのですが : error C2513: 'QuizClass::Question *' : 指定された型は、識別子の名前を指定せずに宣言されています と出てしまいます どうすればメモリを確保できますか? ヒントだけでもいいのでよろしくお願いします。
typedefしてるからQuestionがその構造体の名前、Quizがその構造体のポインタ型
Quiz p = new Question[MAX_QUIZ]; かな?
17 :
デフォルトの名無しさん :2008/10/15(水) 21:30:02
#include <stdio.h> void kansu(unsigned a){ int ans[a]; (中略) } main(){ kansu(10); (中略) } 上記のように、関数の引数を配列の個数として受け取るプログラムを作っているのですが、 配列を宣言する行で「定数でないものがある」「配列のサイズを整数定数に評価できません」といわれます。 はじめは自分のプログラムが間違っていると思っていたのですが、同じ課題(なので上記構成を含みます)を やっていた友人の完成ファイルをもらって自分のPCでコンパイルしてみると、これも通りません。 でも友人は確かに学校のPCでコンパイルに成功していました。 自分のコンパイラに問題があるのかと、LightCとLSI C-86で試してみましたが変化ありません。 何がいけないのでしょうか? 初歩的な問題だったら申し訳ありません。 ご教授よろしくお願いします。
aは定数ではなく、実行時に決まる値。 実行時に決まる値を使ってでのスタック上での配列宣言はできない。 それだけの話。
助けてください。上底、下底、高さの3つの数字を入力してもらい台形の面積を求める関数を作ってみたのですが、コンパイルが通りません。 何処がおかしいのでしょうか? #include<stdio.h> int daikei(int,int,int);//daikei関数のプロトタイプ宣言 int main(void) { printf("台形の面積を求めます。\"上底\" \"下底\" \"高さ\"の順に数値を3つ入力してください。" "なお、数値はカンマ\",\"で区切ってください。:\n"); int ue,shita,takasa; scanf("%d,%d,%d",&ue,&shita,&takasa); printf("上底%dcm、下底%dcm、高さ%dcmの台形の面積は%dcm2です。\n",ue,shita,takasa,daikei(ue,shita,takasa)); return 0; } //ここからdaikei関数の部分 int daikei(int ue,int shita,int takasa) { int kotae; kotae = (ue + shita) * takasa / 2; return kotae; }
>>19 int ue,shita,takasa;
を { の下に移動
Cでは変数の宣言はブロック({ })の最初にしないといけない
>>17 そういうときは
void kansu(unsigned a) {
int *ans = malloc(sizeof(int) * a);
(中略)
free(ans);
}
として、実行時にメモリを確保する
>>20 動きました。本当に有難うございます。
もっと基本的なことから勉強しなおします。
>>17 99年仕様が通るまともなコンパイラを使えばOK。
24 :
デフォルトの名無しさん :2008/10/15(水) 22:46:13
C言語で個人開発単位でDBに接続したいんだけど、オヌヌメのDBおしえてください。 あとは、ググルから。
脳
26 :
デフォルトの名無しさん :2008/10/15(水) 23:21:38
マイクロソフトのでいいだろう 勝手に入ってくる
たぶん言われなくても誰も知らないだろうけどHiRDBは絶対にお勧めできない
28 :
17 :2008/10/15(水) 23:38:57
>>18 、
>>21 、
>>23 ありがとうございました!
<stdlib.h>,malloc,freeを足してうまく動きました。
全く考えつかなかったところに原因があったので助かりました。
配列について一つ賢くなれた気がします。他のコンパイラを
手に入れる余裕はないので、もっと勉強して使いこなそうと思います。
回答ありがとうございました。
29 :
デフォルトの名無しさん :2008/10/16(木) 14:05:45
すみません。WindowsAPIを使って色々ネット上のサンプルを試しているんですが、 新規プロジェクトを作るたびにいちいちWindowクラスを作成して登録する作業がとても面倒なんですが、 JavaやC#みたいにクラスファイルを作成して、それを他のプロジェクトから使う方法はないんですか? または、ソースのインポートから新規プロジェクトへそのWindowクラスの書いたファイルをプロジェクトに 取り込む方法とかないですか? なにぶん、WinAPIは初めてでしてよくわかりません。。ちなみにVC6を使っています。 初心者歓迎で環境依存OKとのことなので、ここで聞きました・・ 個人的には、Windowクラス作成の部分を別ファイルに定義しておいて WinMain関数の有るファイルで、そのWindowクラスを登録すればいいと 思うんですが、ウィンドウプロシージャのCALLBACK関数はどちらのファイルに書いたらいいのか わかりません。 すみませんが、教えてください。よろしくお願いします。
30 :
29 :2008/10/16(木) 14:14:20
>>29 です。ちょっと補足します。
>いちいちWindowクラスを作成して登録する作業がとても面倒なんですが
これは、長々しいコードを書くのも面倒だしこぴぺするのもスマートじゃないと
おもったんです。ですから、この作業をスマートにやるWindowsプログラム本来の方法を知りたいのです。
よろしくお願いします。
むしろ何で今VC6を買ってしまったのかと聞きたいぐらいだわ 無料化されてないよね。しかも取り立てて安くもない。 VC2005EEではダメだったんだろうか。。。
32 :
デフォルトの名無しさん :2008/10/16(木) 14:35:29
なぜVC2005を進めるんだ 2008の方が性能上で軽い
>>29 CALLBACK関数も別ファイルに書けばいいと思うよ
WM_PAINTのBeginPaint〜EndPaintの間だけとか
実際に変えたいところだけ主ファイル側の関数を呼べばいいんじゃない
34 :
デフォルトの名無しさん :2008/10/16(木) 15:08:49
C++で2分法のf(x)=X*X-2 プログラムよろしくお願いします。
>>32 あ、ごめん。
2008まだ入れてないからついうっかりorz
36 :
デフォルトの名無しさん :2008/10/16(木) 15:37:54
お聞きしたい事があります。 C言語の勉強をしてて、他人が作ったソースを眺めていたりするのですが、 その中に char *skipSpace(char *s) と言った箇所がったのですが、関数名の前の「*」ってどうゆう意味があるのでしょうか? これもポインタの一種なのでしょうか?
std::mapのキーにwchar_t*を使うと検索がおかしいのはどうして?
>>36 charのポインタを返す関数だよ
char* skipSpace(char *s)
こうすると分かりやすいかな?
39 :
デフォルトの名無しさん :2008/10/16(木) 15:51:46
>>38 なるほど、「char* 関数名」でも「char *関数名」でもどっちでもいいのですね。
ありがとうざいます。
char* pc1, pc2;
char *pc1, pc2;
>>37 ポインタのアドレスを比較してるだけだからでは?
43 :
デフォルトの名無しさん :2008/10/16(木) 16:01:07
基本は変数、関数のほうへ付けるべきだな char* p, q; が、 char *p, *q; かchar *p, q; かわかりずらいからな
*の修飾対象はcharではなくp。これを分かってない人がコードを書くと可読性が著しく損なわれる。
char *関数名() が正解ってこと?
☆ ☆ ☆ ☆ ☆ ☆ ☆ * ∧_,,∧ <,, > ( ) し○-J ~"''"""゛"゛""''・、 ""゛""''""""゛゛""''' "j' :::::ヘ :::::....ヽ :::;;;ノ ::( :: ゝ :::::......ノ:;;../ ~~^^ ~~~~~^^^~ ~~^^ ~~^^ ~~~~~^^^~ ~~^^~~~^
かどうかしか調べてないのにキーがー致するの? 大きいかった場合は?
SGIのSTLかよ!
_ _分木
>大きいかった場合は? ない
_ 三分木
_ 三分木  ̄
三 三分木 三
話の起点が見えないんだが何この流れ
>>57 もちろん話の上では
>>53 の言うとおり、a<bでもb<aでも無い場合に2つの値は等価と扱われる。
それと、mapをbegin()からend()まで辿るとソートされていることが分かる。
実質ほとんど<ばかり調べ続ければ十分。
環境はVC++2008EPEです windowsアプリケーションの勉強をしていて本に載ってる環境設定が古いバージョンの物なのでわかりません。サンプルプログラムを実行してもエラーがでます プロジェクト作成はwin32コンソールアプリケーション→windows アプリケーション→空のプロジェクトチェック→OKの手順で作っています ソース #include<windows.h> int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { MessageBox(NULL,"Kitty on your lap","メッセージです",MB_OK); return 0; } エラー名 error C2664: 'MessageBoxW' : 2 番目の引数を 'const char [18]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 改善方法を教えてください
MessageBox(NULL,TEXT("Kitty on your lap"),TEXT("メッセージです"),MB_OK);
64 :
デフォルトの名無しさん :2008/10/16(木) 23:43:44
MessageBoxA
なんでサンプル通りに作らなかったんだろう
ナニッ?! 世間では_TじゃなくてTEXTを使う方が一般的なのか?
Unicodeの関係でしたか・・・ すばやい回答ありがとうございました!
>>65 単にサンプルが古くて
>>61 のように書かれてただけだろ。
例えば猫でも分かるのSDK編とか。
69 :
デフォルトの名無しさん :2008/10/16(木) 23:48:38
ねえ。Cの引数って仮引数ジャン。 戻り値も仮戻り値なの?
>>66 TEXTは<windows.h>をインクルードするだけで使える。
_Tは<tchar.h>をインクルードする必要がある。
そのせいで、あまりにも短すぎるサンプルだとTEXTが好まれる傾向にあると感じる。
TEXTと_Tで異なる状態になるってのは有り得ないから混同しても問題なく、どっち使うかは好みの問題。
TCHARと_TCHARだとそうもいかない場合があったかもしれないが。
MessageBoxW()みたいにAPIには全部Wをつける。 文字列には L"・・・" みたいにLをつける。 これで、すっきり。
アンダースコアが付いていないバージョンはWindowsヘッダーファイルがデフォルトで扱う文字セットを制御する アンダースコアが付いているバージョンはCランタイムヘッダーファイルがデフォルトで扱う文字セットを制御する ちゃんと違いはあるよ
T"もじれつ" を T("もじれつ") または "もじれつ" か L"もじれつ" にするマクロはかけないの
T("もじれつ")じゃなくて_T("もじれつ")ではないかと言ってみるてst 普通に置き換えでいいでしょ
環境:WinXp+Cygwin TEST* stTEST = new TEST [i]; ・・・ここまで構造体配列stTESTの内容を設定・・・ do{ if( stTEST == NULL ) cout << "null1" << endl; //バグチェック1 ・・・stTESTを使う100行くらいの処理・・・ //上記の処理でstTESTの新しいメンバが設定される、 //要素の追加の処理を知らないのでいったん削除して1つ大きく宣言しなおす i++; delete [] stTEST; stTEST= NULL; TEST* stTEST = new TEST [i]; ・・・stTESTを再設定・・・ if( stTEST == NULL ) cout << "null2" << endl; //バグチェック2 }while( currentNum < limitNum ); こんな感じで構造体配列stTESTを処理に使っていて、 do whileループで条件を満たさない限り構造体のメンバが1つずつ増える内容なのですが 上記のようにかなり強引にメンバを追加しようとしています。 実際これをコンパイルし実行すると1度最後のwhileまで実行された後バグチェック1に引っかかりエラーとなります。 このような無理やりなやり方ですがバグチェック2のあたりでは正常なのに ループ始端のバグチェック1ではNULLとなってしまうのがわかりません。 バグチェック2とバグチェック1の間は実質何もないのになぜこうなるんでしょうか。 わけのわからない質問かつclassも知らないC言語上がりの恥ずかしい内容だとは思いますがよろしくお願いします。
do-whileの中と外で2回stTESTが定義されているから
無理にnew/delete使うくらいなら、realloc使ったほうがましだろって思った。
>>77 ,79
いったんdeleteなりをしてなくなったことにして、
もう一度いちから宣言するというこのやりかた自体NGなのでしょうか。
にしてもループの終端と始端でNULLだったりしなかったりするのがよくわかりません。
>>78 reallocの存在を知りませんでした。今から試してみます。
ありがとうございます。
データが入ったポインタから任意の位置のデータ抜き出すにはどうすればいいんですか? 2バイトでデータを区切って10バイト目を抜き出す場合、 ___int16 afData[100]; afData = pbefData; a = afData[4]; とかを想像しましたがエラー出まくりです。配列も大きいデータだとどこまで作れるのかわからないし。いい方法があったら教えてください。
> TEST* stTEST = new TEST [i]; これを2回書いちゃってるから、再定義してるよこのスカポンタンて言われてると思う stTEST = new TEST[i]; でいいんじゃないのかな
>>82 エラー出なくなりました!
たしかに再定義ですね。int i = 0;を2回言うのと同じですね
人のプログラムを引き継いでやってるので意味もわからずコピペしてました。
でも別の問題なのか所望の動作しないwwでも頑張ります!
>>78 のreallocもやるつもりです。ありがとうございました。
盆用ライブラリを作れるといいと言われたのですが どのようなものを指すのですか? 拡張子がlibのもの? 教えてください><
87 :
デフォルトの名無しさん :2008/10/17(金) 07:00:29
万能だろ。適用範囲が広いって事。 たとえばスタンダード テンプレート ライブラリは万能ライブラリ
88 :
デフォルトの名無しさん :2008/10/17(金) 07:05:53
質問です。メモリマップドファイルは速いんですか? 1Gのファイルを、読み込んで1バイトずつの総和を求めようとした場合、 メモリマップドファイルと、一気に1Mずつ読み込むのでは速度差は出ますか?
>>88 仕組みを考えると、処理速度を追求したものではないと思うのですが。
91 :
デフォルトの名無しさん :2008/10/17(金) 09:14:26
>>90 実験してみます。 自前キャッシュを使うか、OSとメモリマップドファイルに
任せるかの違いなんですが。
シーケンシャルリードだったらそんなに変わらないと良いんですが。
>>86 デスマーチに倒れていった先人のプログラマ達の霊を供養するライブラリじゃないかな
来年使う時期までまだ時間があるから自分自身が合掌される側に回らない程度にがんばれ
盆用→凡用→汎用(はんよう) こういうことか? それとも、凡庸か?
かつみ専用の図書館だな
95 :
デフォルトの名無しさん :2008/10/17(金) 11:40:24
使おうと思っているライブラリのマニュアルに「ANSI C用にデザインしてある」ってかいてあるんですけど、 C++は使ってはいけないということになるんでしょうか。 提供されているヘッダには、 #ifdef __cplusplus extern "C" { #endif って書いてあります。 また、「Cランタイム関数のみを利用し、OS提供の関数を利用するな」ってあるんだけど、 どういう場合にこういう制限を設けるんでしょうか。
#ifdef __cplusplus が付いてるなら、C++での使用も一応考慮されてるのだろうけど、 マニュアルに記述がないなら、何か問題があっても保証の限りではないってところでは 動くかもしれないけど保証はしない、自己責任でどうぞって感じ 移植性が必要なコードを書くときにはそういう制限を設ける 例えばWindows専用の関数を使ってしまったらMacに移植できない
>>74 関数はTCHAR用、文字列はL""にしておいて
もしMBCSが必要になったらそこだけ置換すりゃいいんでねーの
置換するためのマクロを探してたりしてな
C#のインデクサーみたいに名前の付いた[]関数は出来ないの?
100 :
デフォルトの名無しさん :2008/10/17(金) 18:16:34
多次元配列をコピーする方法を教えてください int a [][2] = { 0, 60, 120, 180, 240, 360, 420, 540, 600, 660, 720, 780 }; int b[6][2]; aの内容をそっくりbにコピーしたい
>>100 移植性があるかどうかわからんけど
#include <stdio.h>
int main(void)
{
int i, j;
int a [][2] = {{0, 60}, {120, 180}, {240, 360}, {420, 540}, {600, 660}, {720, 780}};
int b[6][2];
for (i = 0; i < sizeof(a) / sizeof(int); i++)
((int *)b)[i] = ((int *)a)[i];
for (i = 0; i < 6; i++) {
for (j = 0; j < 2; j++)
printf("%d ", b[i][j]);
putchar('\n');
}
return 0;
}
>>100 memcpy(b, a, sizeof(a));
memcpy
105 :
デフォルトの名無しさん :2008/10/17(金) 19:32:15
>>101 ,102,103,102
ご協力ありがとうございました。memcpyでいけました
>>101 ,102,103,104
ご協力ありがとうございました。memcpyでいけました
>>101 ,102,103,104
ご協力ありがとうございました。memcpyでいけました
>>101 ,102,103,104
ご協力ありがとうございました。memcpyでいけました
>>101 ,102,103,104
ご協力ありがとうございました。memcpyでいけました
>>101 ,102,103,104
ご協力ありがとうございました。memcpyでいけました
配列にはアドレスを代入できないらしいですけど クラスのprivateで typedef struct abc = { int a; char b; } A, *B; B b; void AAA { A a[3] = {
116 :
115 :2008/10/17(金) 20:37:53
間違えました
int *n; n = new int[3]; これってint n[3]ってことですか? となると、これに他のアドレスは代入できないのでしょうか?
いやできる。 int *n; n = new int[3]; delete[] n; n = new int[5]; int *m = n; n = new int[7]; delete[] n; delete[] m;
#define num 3 int a[num] = { 3, 5, 1 }; int b[num]; b = a; これは可能ってことですか? 今実行環境がないので試せないので誰が教えてください><
期待している結果にはならない
124 :
120 :2008/10/17(金) 21:02:41
どうすればaを代入できるのでしょうか・・・。 初歩的な質問すぎて申し訳ないです。
>>120 ネットに繋がるパソコンがあるなら環境を作ったほうがいい
Visual Studio Express Edition あたりを検索ワードにすれば無料で使えるコンパイラが見つかる
ご協力ありがとうございました。memcpyでいけました
128 :
29 :2008/10/17(金) 21:36:08
>>33 どうもありがとうございます。ウィンドウプロシージャも別ファイルにかく方法でいきたいとおもいます。
というか、自分ではどうすればいいのかわからないので、その方法で行きます。主要なメッセージだけ主ファイルの
関数から呼ぶというのは、自分のレベルでは理解できないので、まずは、別ファイルにかく方法でいきたいとおもいます。
どうもありがとうございました。
>>他に回答くださった皆さん。
VC6は兄の押入れにあったやつです。もう眠っているやつみたいなので、やってみました。
みなさん、ありがとうございました。お礼が遅れて済みませんでした。
memcpyって便利ですね。 他にメモリをコピーできるのはないんですか?
memmoveとかC++ならstd::copyとか
>>129 何で他のが欲しいのかよく分からんけど、メモリ上にどういったレイアウトで
配置されてるかを知っておかないとそのうち困るよ
C++です @cinで数値を入力させたaをマイナスにしてやりたい時はそのまま-aみたいに書いちゃってもいいんでしょうか? Awhile文にて、bが-aより大きく、かつbはaより小さいとき、と書きたい時は while(-a<b && b<a) という書き方をしても大丈夫でしょうか? あまり丸投げにすると悪いんでこんな形の質問ですがよろしくお願いします
>>133 返答ありです
基本的にプログラムしたことはうまくいってくれるんだけど
while()内の条件通りに繰り返してくれないのはやっぱり()内の条件付けの考え方を間違えてるんでしょうか?
int c; int* a; int b[5] = {2,3,4,5,0}; a = b; c = sizeof(a); ポインタaの中のバイトサイズを知るにはどうすればいいんですか?sizeofでとりだせません。
>>135 c に sizeof(int) * 5 を期待しているのであれば、無理だと思います。
c = sizeof(a); だと、cに4が入ってしまします。 c = sizeof(*a); こうすると*aにはbのアドレスが入ってるからいいとおもったんですが、cに2が入るんです。 どうしてもbのサイズ20が取り出せません。どうすればいいか教えてください
>>137 残念ながら無理だと思います。
b のアドレスだけをみて、「b が配列のあたまのアドレスでありかつ配列のサイズはsizeof(int)*5 ということが、普通わかるのでしょうか?
べつに自分で管理でもしておかないかぎり、不可能だと思います。
ところで環境はなんですか?sizeof(int *) =2、sizeof(int) = 4、というのは、ちょっとよくわからないのですが?スモールモデル?タイニーモデル(いずれも死語)?
aに入ってるのはb[0]のアドレスです 間接演算子「*」をポインタに付けると、そのポインタが指している変数の中身にアクセスできます つまり*aはb[0]に入っている「2」を指します bのサイズを得るにはsizeof(b)とするしかありません sizeof(a)で得られるのはアドレスのサイズ、sizeof(*a)で得られるのはint型のサイズです
ポインタの話題は微笑ましいな
>>132 while(abs(a) > b)も可
でも
>>133 でダメなら問題文の解釈ミスだろうな
>>139 そこで不用意に「2」とかかくと sizeof(*a)がb[0]の内容を返すように見えるから困る
無理ですか。なにか方法がありそうでないのですね。はまってしまいました。参照もやってみましたが、エラー出まくりで対応しきれず挫折しました。 環境というかすいません、取り出した値は間違えでした。int部分はすべて__int16で実行した数値を書いてしまいました。ごめんなさい。
変数に100kバイトのデータ入れるにはデータ型は何を使えばいいんでしょうか?
char data[100000]; とか
そんなにできるんですか、ポインタを使ってべたデータの先頭アドレスだけ指定する型とかはないんですか? 配列数が固定されてると、data[100001];にしたくなった場合また配列を作らなければいけないんですか?
なにがしたいかというと 100kバイトのデータを編集してサイズを変えて80kバイトにした時に メモリに無駄なくデータ型でキャストして配列にして個々に取り出せるようにしたいんです。 型 data; __int16[sizeof(data)/2] = data; これで解決出来そうなんですが、型の部分が不明です。なにがいいか教えてください。
>>146 もう何が言いたいのかすごく分からないんだけど、メモリの動的確保を知ればいいのだろうか
Cならcalloc、malloc C++ならnewを使いなされ
あとC++でコンテナもあるが、それじゃ不満出そうだなw とりあえずポインタという単語は覚えたようだけど 発言からしてその機能(というか用途や存在意義?)は まだ完全には理解できてないのはわかる
それ以前に学ぶことがたくさんあるだろって感じだなあ
たしかに何を言ってるかわかりませんねw よく考えたらサイズのわからないデータを型で変数確保するなんて無理ですよね。 動的確保で作成、解放の繰り返しで対応しようと思います。ありがとうございました。 あ、でもsizeof(data)でサイズを調べた後ならそのサイズが収まるデータ型を指定して確保するような型はありそうでないんでしょうか? struct newType{ __int16 type[sizeof(data)/2]; }; あ、でもsizeofで調べるdataの型はなんだろう・・・頭がやばい感じになってきました
realloc()使えばいいんじゃね?
使えばいいとかそういう段階じゃないとゆうとろうが
>>151 まず背伸びをやめることから始めようか
背伸びすると自分を把握できない&相手に伝わらない 基礎からやるのを恥ずかしがるなよ
155 :
デフォルトの名無しさん :2008/10/18(土) 04:54:20
borland C++ Compiler 5.5使ってC言語を学んでます。 下記のようにコンパイルした後に動作確認を行っているのですが、 これを一回のコマンドで実行できないでしょうか? bcc32 test.c test
バッチファイル
できました。 どうもありがとう。
158 :
デフォルトの名無しさん :2008/10/18(土) 08:03:23
CreateWindowで作ったcheckboxの文字のサイズの変更はどうやってするのですか?
if(buff[0] == '#') { // リマーク行 continue; } ------------------------------------------- if(buff[0] == '#') // リマーク行 continue; この2つって全く違いますか? {} があるかないかで
見易さが違う
この場合は下の方が見やすいですか?
上のほうだろ
動いたのならいいじゃないか 15とか入れてみた?
166 :
164 :2008/10/18(土) 11:19:16
>>165 ぎゃー。15を入れてみたら、
素数ではありません
素数ではありません
素数です
と、表示されました・・・。
167 :
デフォルトの名無しさん :2008/10/18(土) 11:29:49
URLのどこがおもしろいんだろ?
しつもんです。 char buff[20] while(!=EOF){ buff[a++]=fgetc(f); buff[a] = '\n'; } printf("%s\n",buff); でOSによってゴミが表示されたり、表示されなかったりするんですけれど、 基本的に、ゴミが表示される方が正しいんですか?表示されない方が 正しいんですか?
>>171 最後は '\n' じゃなくて '\0' にしないとまずいだろ
おぞましいソースだな
あら、書き間違えた。 \0です。 ところで、ゴミが入るのは普通ですか?
while((c = fgetc((f))) != EOF){ if(c != ':'){ buff[at++] =c; } if(c == ':'){ ungetc(c,f); buff[at] = '\0'; printf("%s",buff); では、これで。 どうしてもゴミが入るんですが...
>>176 whileや2回目のifの終端が分からんような断片的なソースを張るな。
とりあえずatを初期化しろ
>>176 馬鹿なんだから、自分でここが原因だろうなとか考えるな
全部貼れカス
179 :
デフォルトの名無しさん :2008/10/19(日) 04:09:37
古いサーバにTCPコネクションを張ってリクエストを出すのですが、高負荷にならないように、どの時点を 取ってもそこから過去T時間内にはN個以下のリクエストしか送ってないようにしたいです。そのために 以下のようなアルゴリズムでやろうとおもうのですが、いいでしょうか? (これって有名な問題でしょうか?) まず、リクエストを送信した時間を記録しておくキューを準備します。 そしてリクエストを出す際には、その時点から過去T時間まで遡って何個のリクエストが出ていたかを確認し、 (1)N個より少なかった場合 リクエストを出して、その時間をキューに追加します。そのときT時間よりも過去に送信したリクエストは キューから削除します。 (2)N個だった場合 これ以上送れないので、リクエストを保留リストに繋ぎ、一番古いリクエストからT時間後に送信するように OSのタイマーを使って設定します。 なんかこんがらがって来た。これでいいでしょうか?
今日は基本情報/ソフ開の試験日 ここで答えるマはちょうどこれらを受けるレベルと重なるから 以後、日を改めた方がいいかもね
>>179 やってみたぜ
#include<deque>
#include<cstdio>
#include<cstdlib>
#define N 5
#define T 100
#define TIME_MAX 1000
class connection_t{
public:
time_t send, post;
connection_t():send(0),post(0){}
};
int request_proc(connection_t &connection, time_t send){
connection.send=send;
}
int main(void){
std::deque<connection_t> request;
connection_t temp;
for(time_t t=1;t<TIME_MAX || request.size()>0;t++){
while(request.size() && t-request[0].send>=T){ // 時間T経過したリクエストをキューから削除する
printf("post=%d send=%d\n", request[0].post, request[0].send);
request.pop_front();
if(request.size()>=N) request_proc(request[N-1], t); // 待ち状態のリクエストがあれば処理する
}
if(rand()%10==0 && t<TIME_MAX){ // リクエスト発生!!!
temp.post=t;
request.push_back(temp);
if(request.size()<=N) request_proc(request.back(), t); // N個目までは無条件にリクエストを処理する
}
}
return 0;
}
182 :
デフォルトの名無しさん :2008/10/19(日) 06:12:00
どんなコンテナでも[]でのアクセスをサポートしてるものだったら受け取れて その中身を表示する関数って書けますか? std::vector<T>だけでいいなら template <class T> void show(std::vector<T> &v){ for (unsigned int i = 0; i < v.size(); ++i) { cout << v[i] << " "; } cout << endl; } こんな感じでよく使ってるんですが。
template <class T> void show(T &v){ for (unsigned int i = 0; i < v.size(); ++i) { cout << v[i] << " "; } cout << endl; }
template <typename T> void show(T &v){ for( typename T::iterator it = v.begin(); it != v.end(); ++it ) { std::cout << *it << " "; } std::cout << std::endl; } これで標準コンテナは大体いけるんじゃないか?
引数はconstのほうがよくね?とか、boost::range使ってみよう、とか #include <boost/range.hpp> template<class T> void show(const T &v) { typedef boost::range_iterator<const T> iter_t; for(iter_t iter=boost::begin(v); iter!=boost::end(v); ++iter) { std::cout << *iter << " "; } std::cout << std::endl; } でもこんな関数書くくらいなら std::copy(v.begin(), v,end(), std::ostream_iterator<T>(std::cout, " ")); でいいじゃんと思ったり
std::ifstream使ってファイルの入力してて、一行ずつ処理するのにwhileとgetline使ってたんだが、 空白で区切られて思ったようにいかないんだけど、\nか\0のみで区切れる関数、ルーチンってないですか? ちなみに処理系はVC9です
つ マニピュレータ
以下の本の中に たとえstatic宣言した変数であっても extern宣言することによって外部から参照できてしまう とありました。これは本当ですか? 手元で試してみるとそんなことはないようなのですが… 「C/C++による組み込みソフトウェア開発技法] 下記は_gが見つからないとコンパイルエラーになりました。 a.c--- static int g = 10; b.c--- #include <stdio.h> extern int g; int main(void) { printf("%d\n",n g); return 0; }
>>188 その本の前提がおかしいんじゃないか?
普通、C/C++ではstaticはファイルスコープを持つから外部には公開されないぞ。
190 :
デフォルトの名無しさん :2008/10/19(日) 12:05:50
>>181 誰か解説してくれ〜
181の動きがよくわからん。動作させてみて、ちゃんと動いてそうなんだけど、どうもよくわからん。
(1)1度もsendされないままプログラムが終了してしまうリクエスト(connection_tで表されるやつ)が
ないことは保証できるか?
tがTIME_MAXを過ぎた時に、request_proc()してないリクエストが1個とかのこってる状況ってどうすんのかな?
(2)2回sendされるリクエストは絶対にないか?
request_proc()は2個所から呼ばれてるけど、それぞれのIF文の条件が微妙にかぶってるのが理解しにくい。
すごいよ、こんなソースを短い時間でパッパッと書いちゃうなんて。
191 :
186 :2008/10/19(日) 12:29:56
>>187 ども
STLとかあんま分からんから助かる
192 :
186 :2008/10/19(日) 12:44:03
マニピュレータで少しググってみたが、先頭の空白のことじゃなくて行中に現れる空白のことなんだが つまりgetlineつかうとscanfみたいになるからfgetsみたくifstreamで動作させたいってこと
>>192 こんなん?
getline(ifs, str)
194 :
192 :2008/10/19(日) 12:56:28
あれ・・・getlineで普通に動いてるorzなんでだr 荒らしてスマソ・・・
>>190 別人だけど。
(1) 送信されないまま終わると思う
擬似的に
>>179 のアルゴリズムだけ組んだものっぽいから、
プログラム終了した後のことまで面倒見てないのではない?
その辺のところは実際には、リクエストに対するレスポンスを
同期的に受けるのか非同期で受けるのかでも対応変わって来そう出し。
(2) 無い・・・と思う
条件文が微妙に被っているのは、
while内の条件では、条件判定の直前にpop_frontしてるんで、
requestキューの要素数が1つ減ってるからじゃない?
条件文が被らないようにするなら、
pop_frontする前にrequest.size()>Nをチェックをして
request[N]のポインタを保存しとくことになるのかな。
まぁ、でも条件が被らなくなるだけで、キューの中身は
2つ目の条件式を判定した時の状態と全然違うから、
あまり意味は無いか。
VS2008を使っています デバックでビルドすると普通にコンパイル→リンクできるのですが、 リリースでビルトすると 1>_Lib_DXCamera.obj : error LNK2001: 外部シンボル "_D3DXMatrixLookAtLH@16" は未解決です こんな感じなのが数個でてビルドできません。 解決方法教えてください!
リリースのほうのリンカを追加したらできました ありがとうございます
私の友人のジョンは敬虔なクリスチャンだ。 ミサへの参加はもちろんのこと、教会が主催するボラン ティア活動にも積極的に関わるし、日々の祈りもかかさない。 日本へ移住したのも布教活動のためだ と言うし、日本語は実になめらかである。 このバイタリティが信仰心から生まれるものなら宗教も悪 いものではないとさえ思えてくる。 私自身は典型的な日本人がそうであるように無宗教に近い仏教徒だ。ジョンと友人になった経緯は長 くなるのでその話はまたの機会とさせてもらうが、思いおこせば奇跡的な出会いと思わざるを得ない。 さて、最近のジョンは日本のサブカルチャー、とりわけアニメに感心をもったようで、日本では誰も が知っているアニメというと何だろうと私に質問してきた。 「ポケモン」や「サザエさん」といった定番のものを紹介し、最後に「ドラえもん」を紹介した。す るとジョンは「ドラえもん」に対して異常に怯えはじめた。 ドラエもんの中には悪魔がいるというのだ。 言われてみるとDORAEMONの中にはDEMONがある。 そして、ねこ大好きな純朴な人々に自分は猫型だと 偽るなど実に悪魔的な諸行ではないか。そんなことにも気付かずに我々はドラえもんをほほえましい 人間の味方と騙されきっていたとは自分の馬鹿さ加減に呆れる。 未だ自分が悪魔に騙されていると気付いていない愚かな悪魔崇拝者どもの目を醒させるために我々は 活動を開始することにした。 手始めに猫スレを巡回してこの事実を広めていこうと思う。 皆にはこ の文章をなるべく多くの目に触れるようにコピペしてもらいたい。 Kill DORAEMON, Kill DEMON !!!
混じれすすると、そこに入っているのはDAEMON(守護神)だと 考えることもできるんじゃないかな。 どれだけキリスト教と関係あるか知らないけど。
204 :
デフォルトの名無しさん :2008/10/20(月) 00:43:41
C言語掲示板で質問したところ、環境依存スレに書き込むよう言われました。 ですので、こちらに書かせてもらいます。 ファイルパスについての質問です。 「実行ファイルを元にした相対パスを、 絶対パスにするにはどうしたらいいのでしょうか?」 相対パスを絶対パスに変換する関数は見付かったのですが、 カレントディレクトリを元にしているため、 カレントが変わると結果も変わってしまって困っています。 環境 OS:Windows XP コンパイラ:BCC(一応VCも入れてある)
>>204 その実行ファイルの絶対パスとくっつければいいんでね?
としか思えんのだが、それがダメなら理由を説明しろ。
状況がわからん。
206 :
デフォルトの名無しさん :2008/10/20(月) 02:10:09
>>205 最初はそれでもいいかと思ったのですが、
途中で、「実行フォルダの1つ上のフォルダ」に変更があった場合(あくまで例)、
編集しやすいようにと思った次第です。
出来ないのであれば、絶対パスを返す関数を探しますけど。
普通にあるだろ。名前忘れたけど
あるよ 俺も忘れたけど
APIスレで聞くといいよ
仕方ないからリファレンス本引っ張ってきた カレントディレクトリの変更 #include<stdlib.h> int _chdir(const char *dirname); //vc int chdir(const char *dirname); //gcc カレントディレクトリを取得 char *_getcwd(char *buffer, int maxlen); //vc char *getcwd(char *buffer, int maxlen); //gcc bccでの有無は知らんが、bccなんて載ってるわけがねぇ なんでいまだに初めての環境がbccってのが多いんだろ
>>204 Windows限定でいいのならPathAppend
212 :
デフォルトの名無しさん :2008/10/20(月) 09:40:02
>>195 ありがとうス。でも手元のマシンでログとか色々いれて
>>181 のソース動かしてるんだけど、
送信されないままのリクエストってないんですよ。沢山動かしてみたから
たまたまとかじゃなくて、ロジックとしてそうなってるんだと思うけど、
どうしてもその辺が納得できない。
if(request.size()>=N) request_proc(request[N-1], t); // 待ち状態のリクエストがあれば処理する
}
この行だけなかなか理解できないス。2個目の質問はおかげで理解できました。
ありがとうス。
213 :
デフォルトの名無しさん :2008/10/20(月) 10:50:00
>>181 >>195 ようやく分かりました。リクエストが呼ばれないままプログラムが終わることは
ないと思います。キューの中で先頭からN個のリクエストだけが常にSENDになっていて、
一番古い先頭のリクエストがT時間たった時点でのみN番目のリクエストがN-1番目に下りてくる。
しかしこんなソースよく書けますね
ありがとうございました。
デフォルトコンストラクタと初期化子に関する質問です。 class C { int c, v; C() : c(0) {} C(int val) v(val) {} }; とおいた場合、 C hoge(0); として hoge.c は初期化されているのでしょうか。
いいえ
ありがとうございました
コンテナを基底クラスにしたsetやmapに、派生クラスのインスタンスをつっこむと コピーされて基底クラスの集合になっちゃうんですが、どうすればよいんでしょうか。 shared_ptrでポインタをつっこむのが定番でしょうか。
どうしてVCは short 16 int 32 long おう じゃないの? そのせーでlong long とか見苦しいことしないといけないし
__int64使え
テキストファイルを読み込んでstd::wstringに格納するにはどうすればいいですか?
コードを書けばいいと思います
wcin
と cat だな!
225 :
204 :2008/10/20(月) 17:54:12
>>207-212 ありがとうございます。
ちょっと調べてきます。
実は実行ファイルの絶対パスをくっ付けるのでとりあえずしていたので、
出来そうなら修正します。
>>225 PathAppendではなくPathCombineだった。失礼。
typedef struct{ int data; char mozi[10]; }Hoge; という構造体の配列 Hoge huga[10]を宣言します。 i番目のHogeのメンバーのmoziの1文字目にアクセスしたいんですが、どう書けばいいんですか? huga[i].mozi[1]かな?と思ったんですが・・・
1文字目は [0]
ああそうですね・・・ でもコンパイルできないんです
エラーメッセージとソースがないと分からないよ
char' から 'const char *' に変換できません といわれます
レッツエスパー
%cではなく%sになってるとエスパニョール
huga[i]のmoziの0文字目と別の文字をstrcmpで比較してるんですが・・・
strcmpに何を渡すか調べろ
んなこったろーと思った
後出しジャンケン最強ですね、わかります
後出しも何も、そのまんまじゃないか。
239 :
234 :2008/10/20(月) 20:22:31
もっと真摯的に回答しろよ。
>>239 一文字だけ比較なら、
if (huga[0] == str[0]) ・・・
でいいよ。
std::exceptionにウニコード入れてキャストしてもいいの?
242 :
234 :2008/10/20(月) 21:25:29
>>236 そう思ったなら分かった時点で言ってくれればいいのに。
後出しジャンケン最悪><
ジャンケンのアナロジーを使うってことは、この問答に勝負の匂いを感じてるってことかな。 でももしそうなら、もう最初の質問文の時点でコールド負けしてるぞ、お前w
244 :
デフォルトの名無しさん :2008/10/20(月) 23:09:04
VSで if(fopen_s(&fpout, "data.txt", "w")){ exit(1); } で出力用のファイルを作成するとソースファイルとかがある階層にファイルが作られますが、 フォルダを作って、その階層にファイルを作ることはできますか?
>>245 if(fopen_s(&fpout, "data\data.txt", "w")){
exit(1);
}
ってやったんですがエラーになります・・・
>>247 それでもだめでした。ファイルポインタエラーになります
>>249 フォルダは作ってくれないんですね・・
WinApiじゃないとフォルダ作成はむりですか?
_mkdirかな。使ってないからわかんないけど。 MSDN見てみてね。
_tmkdir こっちがいいか。
253 :
デフォルトの名無しさん :2008/10/20(月) 23:51:47
template<CLS &p> class ABC { public: }; としたとき、テンプレート値を省略できて、それを検知して適切な処理をさせられますか?
自己解決しました
すみません。Windows用のC++ライブラリはボーランドのC++BuilderかVisualStudio付属のしか ありませんか?
自己解決してません。 テンプレート値を省略した場合、デフォルトを設定する方法わかりますか? 特化パラメータを指定しないとテンプレート を使えない とでます。ネットで調べた方法 template <class T = int>のようにした場合です。
>>256 それを使うときにはABC<>のように空の括弧が要るぞ、って問題じゃない?
ごく普通に、throw std::exception();と書いたら、 場所によって(特定のクラスのコンストラクタとか) vswprint.cでBuffer too smallとエラーがでるのね。 どこが悪いの?
259 :
デフォルトの名無しさん :2008/10/21(火) 02:10:03
VC6でブラウザつくったんだけど(本の通りやって) VC6がでてから何年もたってるからFlushとかうまく表示できないんだろうと 思ってたけど、普通に表示できるけど、VC6のインターネット関連のコンポーネントって 今のPC上のIEエンジンがつかわれるのかな?VC6時代のやつじゃなくて。
C++が一番難しいの?
C++が一番気持ちいいの。
>>259 VC6にそんな機能は全くない。間違いなくIEコンポーネント使っているだけ。
HTTPでファイルをダウンロードしたり、HTML/CSSに従ってレイアウトしたり、
JavaScriptのインタプリタ作ったり、Flashを呼び出したりするコードを書いた覚えなんて一切ないだろ。
VC6にIEコンポーネントが付属していて、それをスタティックリンクすると思ってたんじゃないの VC6当時はなかったIE7で動作するのが不思議に思ったって事でしょ
265 :
259 :2008/10/21(火) 19:34:14
あれれ。。回答ついてるや。。
そうなんです、
>>264 さん。VC6にIEコンポーネントが付いてるとおもったんです。
初心者用の本の通りに作ったんです。ですから、あっという間にブラウザができて
コードなんてほとんど書いてなかったから、なにがどうなってどういうブラウザができたとか
さっぱりわからんのです。でもわかりました。
>>263 さんのいうとおりIEコンポーネントを使ってるということですね。
お二方どうもありがとうございました。おかげさまで心よく理解する事ができました。
_sctprintf で出鱈目な長さが返って来るんだけどバグなの?
何を指定して何が返ってきてデタラメだと思ったの。
_vstprintfにしたらいけました
while ( !feof(fp) ){ for (int i = 0; i < N; i++){ fscanf(fp,"%lf",&data[i]); if( data[0] < 0 ) break; } } 読み込むテキストはN列あります。 5.2 12.2 124.7 15.2 52.2 24.7 25.2 92.2 324.7 -1.0 3.2 12.2 124.7 -1.0は区切りのためにいれてるんですが、-1.0が読み込まれたら飛ばして次の行にいくってプログラムを書いたつもりなんですが、 -1が読み込まれると無限ループになってしまいます。解決策をおねがいします・・・
それ以前の問題に見えるが、、、そのソース。
いろいろ直していただいてかまわないので、教えてください
いや間違ってるとはいったが、無限ループとは関係ないけどね data[0]じゃなくてdata[i]じゃないの?
>>273 -1.0が書いてあるのは1列目なんで0でいいかなと
>>272 while ( !feof(fp) ){
for (int i = 0; i < N; i++){
fscanf(fp,"%lf",&data[i]);
if( data[0] < 0 ) break;
function(data);
}
}
1行ごとに読み、それを関数に渡して処理。そして次の行を読むっていうのをEOFまでやってるんです。
使い方どう違いますか?
while ( !feof(fp) ){ flag =0; for (int i = 0; i < N; i++){ fscanf(fp,"%lf",&data[i]); if( data[0] < 0 ) } flag = 1; break; } } if(flag !=1 )function(data); } こうでした。すいません
fscanf(fp,"%lf",&data[i]); これで3つの数値が data[0]、data[1]、data[2]に入ると思ってる? scanfaの仕様をみなおしてみたほうがいいよ
あれwwまたおかしい while ( !feof(fp) ){ flag =0; for (int i = 0; i < N; i++){ fscanf(fp,"%lf",&data[i]); if( data[0] < 0 ) { flag = 1; break; } } if(flag !=1 )function(data); } です
>>277 -1.0の意図的な区切りが出てくるまでは読めてます。for文でまわしてるので大丈夫だと思ってましたが・・・
-1.0を付加してるのはtxtファイルのメンテナンスをしやすくするためです
>>280 -1.0のあとにその上のデータを作成した方法を記載しているのです。
-1.0 pattern a
とかなってます。言ってなくて申し訳ありません。
だからよ、使い方間違ってるって。 順を追って動作一つ一つ追ってみ?
>>282 eofじゃなかったら
for文でその行のN個のデータをN次元配列に格納。関数に渡す。
eofじゃなかったら ・・・・
eofだったらwhileから抜ける
だと認識してるんですが・・・
feofの使い方見直せ feofはfprintfが最期の行読み込んだ後使うと真を返すんじゃなく fprintfが最期の行読み込んだ後もう一回fprintfを使った後feof使うと真を返すんだよ
ちょっと語弊がありましたすいません
fprintfですか?ますますよくわからなくなってきました
fscanfでしたごめんなさい
-1.0が頭に出てきた列を読み飛ばすにはどうしたらいいですか?
for (int i = 0; i < N; i++){ fscanf(fp,"%lf",&data[i]); printf("%lf",data); if( data[0] < 0 ) { みたいに実際に読んだデータを表示してみたら。 1ラインづつ読んで切り分けてatofでも使って変換、頭に-1.0があったら飛ばすでいいのでは。
その飛ばすっていう方法がわかりません
'\n'まで読むかfgets
うまくできないので・・・書いてください
宿題すれ
図々しいと思わんのかな・・
宿題スレに書きました。
templateな関数はvirtualに出来ないの?
数値微分ではなく関数を微分して関数を返すフリー(金の支払いが無い)のライブラリないですか?
自動微分ってやつ?
それって y = ax + bって入力したら y'= aって返ってくること? そんなもんねーよ
あるだろwww
mathematicaなら出来きます。あとUBASIC86に多項式型が装備されていて微分可能です。 だから不可能ではないんです。 C言語でフリーのやつはないものかと。
GNOME の Genius でできた気がする
303 :
デフォルトの名無しさん :2008/10/22(水) 20:39:39
多項式型と微積分するくらいなら楽勝に作れるんだが。 任意の関数の微分も出来るやつはないものか
>>303 ごめん。無料ではしらない。
>>299 が有料だろうと無料だろうとそんなもんはないし、作れないよ
みたいな風に見えたからさ
vectorで作る配列って勝手に動的確保されるんですか? でかかったら仮想メモリとかにおかれたり
勝手に動的確保されるんです
動的でなくても、すべてのメモリは仮想ですよ、いまどき
SetRenderState使うときは前野を退避しないといけないの?
ですよねぇ
前野さん早く逃げて!
構造体のvectorに代入するときってどうするんですか? double型とかならば、 ary.push_back( 5.0 ); とかで末尾に入れれると思うんですが
>>312 intとかdoubleとかの変数と同じだよ。
同じようにすればいいですよ
>>314 初期化するためのものではないのですか?
ちなみに構造体はstring とdoubleの2メンバです
Hoge hoge; vec.push_back(hoge); でいいだろ。
>>318 どういうことですか?動的配列を使いたいのですが・・・
>>319 「構造体をvectorに」のタイポかと勘違いしたよ。
「構造体のvectorに」って、
struct Hohe {
vector<T> vec;
};
ってこと?
>>316 この場合は初期化のためというより一時オブジェクトを
利用したいから付ける
typedef struct{ double data; cahr name[256]; }DATA; int main(){ std::vector<DATA> hoge<100>; } このhogeにデータを入れたいってことです
おかしいっすね typedef struct{ double data; char name[256]; }DATA; int main(){ std::vector<DATA> hoge(100); } こうでした・・・
>>322 だから、
DATA d;
hoge.push_back(d);
でいいだろ。
>>324 すいません。理解できないです。
hogeの末尾に double→1.0 char→"hoge"を入れる場合にはどうするんですか
>>325 お前あちこちのスレにマルチしてるだろ
struct DATA {
double data;
char name[256];
DATA(double d = 0.0, char* str = "") : data(d) {
std::strcpy(name, str);
}
};
int main()
{
std::vector<DATA> hoge(100);
hoge.push_back(DATA(1.0, "hoge"));
}
hoge.resize(hoge.size()+1); hoge.back().data = 1.0; std::strcpy( hoge.back().name, "hoge" ); とか
質問です。 以下のようなプログラムを書きましたが、終了しません。 >cat meso 123456 --------------------------------------------- FILE *f; buff[256]; char *s; f = fopen("meso","r"); while((s = hogehoge(f,buff)) != NULL){ printf("%s¥n",s); } fclose(f); exit(0); } char *hogehoge(FILE *f, char *buff){ int c = 0; int at = 0; while((c = fgetc(f)) != EOF){ buff[at++] =c; } buff[at]='¥0'; return buff; } どのようにすれば、このプログラムを終了させる事が出来るのでしょうか?
>while((s = hogehoge(f,buff)) != NULL){ hogehogeのコードじゃnullが帰ることは決してないぞ。
普通に代入して大丈夫だよ。自分でやってみて駄目だったら質問しろよ。 どのようにダメだったかを書いて ただし、ポインタを持ってる構造体の場合は コピーコンストラクタとoperator=をオーバーロードした方が良い。 これ以降は自分で勉強しな
>>329 #include<stdio.h>
void hogehoge(FILE* f, char* buf);
#define BUF_LEN 256
int main() {
FILE *f;
char buf[BUF_LEN];
f = fopen("a.out.c","r");
hogehoge(f, buf);
printf("%s\n", buf);
fclose(f);
return 0;
}
void hogehoge(FILE *f, char *buf){
int c = 0;
int at = 0;
while((c = fgetc(f)) != EOF && at < BUF_LEN-1){
buf[at++] = c;
}
buf[at] = '\0';
return;
}
stringに別のchar型の文字列を代入したいんですが、どうやるんですか?
string s; char c[4] = "abc"; s = c; でおk
ありがとうございます。stringをprintfで表示するときの%sてきな奴はなんですか?%sだとnullになります
printf("%s", s.c_str());
なるほど。coutつかったほうが楽そうですね。 fprintfのC++版ってあるんですか?
>>337 printf 系は <cstdio> で全部そのまま使えるだろ。
ofstream
>>340 それは実装依存。ちゃんと対応したヘッダ使ってくれ。
cmathのsqrtで何万回も計算するんだけど、遅いです 平方根はもとめないといけないんだけど(ユークリッド距離)なんかいい方法ないですか?
sqrt の引数にとりうる数字が有限通りしかないならあらかじめ計算して覚えておく くらいしか思いつかないなあ
それはあまり現実的ではないですね・・・・あきらめます
速くしなければならないかどうかを考える sqrtをなるべく使わないようにする ループの回数を減らせる方法がないか考える sqrtの結果をキャッシュする
FPUが遅いと文句を言ってるんならもっと速いCPUに買い換えるか インラインアセンブラでSSE2のsqrtsdでも使うとか。 それ位しか思いつかない
ああクアッドCPUなら計算範囲を1/4にして スレッドを4つ起動すれば速いな
_TIME_は、そのソースの書き込み時間ですが、 ビルドした時間を取得する マクロ? ってありますか?
>>348 ビルド時にDオプションでどうにかすればいいんでない?
ifstream はファイル読み込みだけですよね?ファイル書き込み(追記)できる関数ってなんでしたっけ?
ofstream使え
同じファイルから読んで、書き込みもできますか?
できます
C言語のa+みたいなモードがあるのかとおもったんですが・・・ないんですね
なんでそんな変なモードを使いたいのかわからないが fstream fs("filename.txt", fstream::in | fstream::out | fstream::app); とかは?
356 :
デフォルトの名無しさん :2008/10/23(木) 19:14:39
tbl.cpp const char tbl[ 4 ][ 16 ]= { "spring", "summer", "auturmn", "winter", }; tbl.h const char tbl[ 4 ][ 16 ]; test.cpp #include "tbl.h" void func() { printf("%s\n", tbl[ 0 ]); } C++でこれって出来ないの? 実体が無いって言われるんだけど。
ofstream ofs("file.txt",ios::app); if(!ofs.is_open()){ cout << "ファイル開けない " <<endl; exit(1); } ifstream ifs("file.txt"); if(!ifs.is_open()) { exit(1); } こうしたんですが、問題ありますかね
359 :
デフォルトの名無しさん :2008/10/23(木) 19:25:07
>>358 おおーありがとー。
externつけたけど、今度はconstが初期化されていないって言われる。
constを外すと複数定義されているって言われる。
ヘッダファイルいらない
>>360 ヘッダファイルが無いとtbl[]が無いって言われる。
cppをincludeしたら行けたけど、C++はcppをincludeするのが普通なの?
普通にmain実行するようにちょい変えた >> Makefile test: test.o tbl.o g++ test.o tbl.o -o test clean: rm *.o >> tbl.cpp #include "tbl.h" const char tbl[ 4 ][ 16 ]= { "spring", "summer", "auturmn", "winter", }; >> tbl.h extern const char tbl[ 4 ][ 16 ]; >> test.cpp #include <cstdio> #include "tbl.h" int main(void) { printf("%s\n", tbl[ 0 ]); }
>>362 うーん。それだとconstが初期化されてないって言われるんだよねぇ。
error: uninitialized const 'Tbl'
って出る。
364 :
デフォルトの名無しさん :2008/10/23(木) 19:44:17
あー分かった! debug用に切っていたマクロをincludeしていなくて、定義されていないマクロの中に実体を定義してた。 しょうもない質問に、ありがとうございました。
>>355 それにしてみたら、書き込まれないんですが・・・
ifstream やofstreamではなく、fstreamをインクルードして使うときもfstream
使うときもfstream
fstream fs("file.txt", fstream::in | fstream::out | fstream::app); fs >> data; こうやってるんですが書き込まれてないんですよね・・・
fstream::appは知らないけど、入出力とバイナリ属性付けたらいけるのでは
std::string ってZeroMemoryしていいんでしょうか?
>>372 Copy On Writeありそうだからまずいんじゃね?
いい std::string s;の場合、&s[0]はchar*の先頭アドレスと同じように扱える
std::ofstream ofs( "test.txt", std::ios::in |std::ios::out | std::ios::app );
訂正 std::fstream fp( "test.txt", std::ios::in |std::ios::out | std::ios::app );
そしたらwinAPIつかえよ
>>372 ZeroMemoryしなくてもresizeとかコピーされない手段を使えば、初めから0で埋まっているぞ。
このプログラムで12345が2行書き込まれる。 #include <fstream> #include <string> int main() { std::fstream fp( "test.txt", std::ios::in |std::ios::out | std::ios::app); fp << "12345\n"; fp.seekg(0, std::ios::beg); std::string s; fp >> s; fp << s; }
#include <iostream> using namespace std; class Kitty{ int X; public: int & getX(); } obj ; int & Kitty::getX() { return X; } int main() { obj.getX() = 10; cout << obj.getX(); return 0; } のobj.getX() = 10が何をしてるのかわかりません。 10を代入してるのですか? 関数に数値を代入することってあるのでしょうか?
参照型は左辺値になるから、 関数が参照型を返せばそういうこともできるというわけ。 実際使っているとこはあまり見ないけどな。
10を代入しているのです 関数に代入するのではなく、戻り値であるintへの参照に代入しているのです
質問です、include等は省略させていただきます。 struct data{ char word[81]; int zok; int ret; }; data DATA [255]; void main(){ FILE *fp ; fp = fopen( "Library.dat" , "wb") ; /* Library.dat の中身を DATA[255]にコピーする */ DATA[12].zok = 8; DATA[12].ret = 90; strcpy(DATA[0].word,"hogehoge"); /* Library.dat に DATA[255]の中身すべてを書き込む */ fclose(fp); } 以上のような事を行いたいのですがコメント文の中身をどのように すればよいのかをご教授ください。
メモリマップドファイルが簡単
>>386 ぐぐって見ましたが、確かにこれだとうまくできそうです。
ありがとん
string filename;で定義したのをchar型が引数の関数に渡そうと filename.c_str()で渡したんですが、const char *' から 'char *' に変換できませんとコンパイルとおらないんですが、どうやるんでしょう?
>>388 char tmp[256];
strcpy(tmp, filename.c_str());
みたいにテンポラリにコピーしてから渡すとか。
&filename[0] にしとけよ
>>388 引数の型を const char * に変える
>>385 の者です。調べながらコーディングしてみたのですが
『error C2440: '=' : 'LPVOID' から 'data *' に変換できません。』
と言うエラーが出てしまうのですが、何が間違っているのでしょうか?
struct data{
DATA lib[255];
};
data* mydata ;
int main(){
int i =0;
int *p = NULL;
HANDLE h;
HANDLE h2;
int tmp = 0;
h = CreateFile(
"memorymapping.dat" ,
GENERIC_READ | GENERIC_WRITE ,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
NULL ,
OPEN_ALWAYS ,
FILE_ATTRIBUTE_NORMAL ,
NULL
);
printf("HANDLE = %ld, INVALID_HANDLE_VALUE = %ld\n", h, INVALID_HANDLE_VALUE );
h2 = CreateFileMapping(h, NULL, PAGE_READWRITE, 0, sizeof(data), "mmap");
mydata = MapViewOfFile(h2, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(data));/*★*/
/*以下略*/
すいません、書き忘れてましたがエラーが出ているのは/*★*/でコメントしている行です。
キャストしろ
data* mydata = (data*) MapViewOfFile
できました、ありがとうございます。 こんな初歩で失敗していたとはお恥ずかしい限りです・・
普通にfread(), fwrite() でやったほうが簡単じゃね? fread(data, sizeof data[0], sizeof data / sizeof data[0], fp); fwrite(data, sizeof data[0], sizeof data / sizeof data[0], fp);
いずれにしても、メモリマップドファイルは勉強しておくと良い項目 オープンがちょっとめんどいが、読み書きのタイミングを自分で決める必要なしで 使うときは便利
ifstream ifs("aa.txt"); とすればコンパイルとおるんですが string filename; filename = "aa.txt"; ifstream ifs(filename);のコンパイルが通りません。なぜでしょうか
&filename[0]
c_str()
ありがとうございます。ふと思ったんですが、stringを予約語みたいに青くできますか?VSなんですが
>>401 std::stringの連続性は保証されていないからまずいんじゃないの。
俺もそうおもう
実際では、連続していないやつは無いはずでは
連続していても、ナルターミネートされている保証がなかったと思う。
&hoge[0]つかわないんだったら、 stringをchar型の引数へわたすにはどうすりゃいいんだ? c.strじゃだめだし
渡さなければいい。
stringからconstじゃないcharにキャストできませんか?
だから、互換性を無視して実装に依存したコードでいいなら好きにすればいいっしょ。 そうでないなら、直接渡すことは諦めてvector<char>でもchar[]でも使って中継すればいいだけだし。
ここも知ったかが増えたな
A. C++0xを使う。
ファイル名を解析したいんですが char file[256]とかに入っているファイル名の.の前(拡張子の前までの文字列を別のchar型の配列に入れたいんですが、どうしたら いいやりかたありますか?
strrchr()で最後のドットを探して、sscanf()か何かで引っぺがす。
逆に.から後ろを入れたい場合はどうしますか?
あと data\\hoge.txt みたいなファイル名の\の前を消そうとおもって p = strrchr(filename,'\'); とするんですが、\がつかえないみたいでこまってます
'\\'
>>420 何がご不満でも?
>>417 そっちも同じ要領でできるだろ。寧ろ簡単だ。
例えばこんな感じ。
--
char foo[] = "/foo/bar/fooz.foo.bar";
char ext[10];
char * dot = strrchr(foo, '.');
if (dot == NULL) ...; // dotが見つからない
if (dot == foo) ...; // 先頭がdot
if (foo + strlen(foo) >= dot + sizeof(ext)) ...; // 拡張子が想定より長い
strcpy(ext, dot);
>>415 >416と>421を元に書いてみた。
char foo[] = "/foo/bar/fooz.foo.bar";
char * dot = strrchr(foo, '.');
if (dot == NULL) ...; // dotが見つからない
if (dot == foo) ...; // 先頭がdot
char baseName[100];
if (dot - foo >= sizeof(baseName) ...; // ベースネームが(ry
sprintf(baseName, "%.*s", dot - foo, foo);
ifstreamでファイル読み込みすると最後の行が2回よまれるんですが。。。仕様ですか?
そういうコードになってんじゃないの?
while(!ifs.eof()){ ifs >> 変数; } こんな感じですが、最後の行が2回読まれます
eof()の使い方がおかしい。 eof()は自らはstreamを云々する関数ではないので、読み込んだ結果終端かどうかしか返さない。
えっと・・・じゃあどうすればいいですか
>>425 BASICのEOFと間違えてるだろ
do {
ifs >> 変数;
} while (ifs);
C/C++はあくまで読んだ後でないとEOFかどうか検出できない
while (ifs >> 変数) とか。
C++のstringは何文字まではいるんですか?
string::max_size() まで
面倒だからgetlineにしてしまうとか
>>432 for(;;){
ifs >> 変数;
if (ifs.eof()) break;
変数を使って何かする;
}
>>73 輸出依存企業ってのは
国内で労働者を奴隷のように扱って海外に製品輸出してる企業だろ
倒産していいよそんなのは、むしろするべき。
誤爆かい その考え方はおかしいよ 海外で製品が売れることで日本に金が流れてくるんじゃん 輸入ばっかの企業のほうがダメ
>>432 だから2回読むのは正常なんだって
問題は読んだ後にEOFになっているかどうかを調べろと言ってるの
たしかコピペだから誤爆を装った工作だと思うが。 なりすましての嫌がらせも横行してるから どちら側の仕業なのかわからんがね。 いずれにしてもスレ違いの話に反応するなよ。
>>432 ああ言い忘れた
読んでその直後EOFになっていたら読んだ値は捨てる事。
読んだ直後EOFでなければ読んだ値は有効。
ちなみにこいつはゲハ板でもマルチしてるゴミクズ
2回読んだりしないだろ。読んでないから変数が書き換えられてないだけ。
>>441 いやもちろんそうだが、C++はstd::ios::failbitやstd::ios..eofbitが
立ってしまうと読み込み書き出しの動作を止めてしまうので、
変数の値が変わらず、読んだように見える、と言いたかった。
C言語ならばfseek()でEOFマーカーをクリアできるが、C++の場合は
明示的にストリームに対しclear()などを行ってこれらのビットを
降ろしてやらなければ次の読み書きが一切出来ない。
じゃなかった、operator void*()か。 C++はややこしい決まり事が無数にあるのでやっぱり本か規格書を 読みながらでないと間違えがちだな。
サンプルプログラム int main() { std::ifstream ifs("read.txt"); for (int i = 0; i < 2; i++) { int i; while (ifs >> i) { std::cout << i << ' '; } std::cout << std::endl; ifs.clear(); ifs.seekg(0, std::ios::beg); } for (int i = 0; i < 2; i++) { int i; while (true) { ifs >> i; if (ifs.eof()) break; std::cout << i << ' '; } std::cout << std::endl; ifs.clear(); ifs.seekg(0, std::ios::beg); } }
446 :
デフォルトの名無しさん :2008/10/24(金) 22:00:56
char型で"A5"という文字列から、BYTE型の0xA5というデータを格納させたいのですが、 文字毎に格納するデータを各々書いていくしかないでしょうか?
strtol sscanf
Kitty(const Kitty &); の&は参照を表してるんですか?
はい
しかもconstと&をペアにして使う事でコピーコンストラクタを 起動させなくても内容が変更される恐れがないので サイズの大きなクラスなど渡す時に便利
constと*ではだめなの?
>>451 参照だと見た目、値渡しでコールしてるように見える。
ポインタに比べて、無効な値が入ってきにくくなる。
お前はintの初期化にint*を渡すのか。
コンストラクタがあれば定数でもわたせるとかってのもあるか。
explicit
456 :
デフォルトの名無しさん :2008/10/25(土) 07:37:11
cout << _T("暗号前 :") << data.i << endl; このプログラムなんですが unicodeを使用していると_T("")の部分が正常に表示されません。 マルチバイトなら出来るのですが、_T("")は両方に使えると思っていたのですが例外はあるのでしょうか? あとunicodeとマルチバイトの差はコンパイル時に出るだけだと思って良いでしょうか? コンパイル時にunidodeかマルチバイトを設定しておけば、どのような環境下でexeファイルを実行しても 内部ではコンパイル時に設定された文字コードが扱われる〜ような。
ちがう。 Unicodeコンパイルすれば内部コードがUnicodeになって、Unicode対応OSでないと動かない。
>>457 前半だが、
ostream& operator<<(ostream&, LPCTSTR)
みたいなのを自分で定義するか、
単にwcoutに書き込むんだな。
UNICODEや_UNICODEの定義は、TCHARがcharになるかwchar_tになるかの違いなので、
当たり前だが生成されるバイナリが全然違う。
勿論TCHARに一切タッチしないなら関係無い話だが、
あんたがAnsi版、Unicode版を直接指定しないでAPIを使っているなら、
もしくはMFC/ATL/WTLのようなものを使っているなら、無関係では
いられないだろう。
460 :
デフォルトの名無しさん :2008/10/25(土) 11:52:28
#ifdef _UNICODE typedef wstring _tstring; #else typedef string _tstring; #endif
C++なのにオーバーロードでなくマクロで誤魔化している MFC/ATL/WTLは糞
ジェネリックテキストなんて使わないで、ワイド文字にだけ対応すればいいよ。
>>460 typedef std::basic_string<TCHAR> _tstring;でいいじゃない。
っていうか下線で始まるのはダメだろ。
>>461 VC++ 7あたりからMFC/ATLのCStringはテンプレート化された。
>>463 ん?CStringはCString<TCHAR, StrTraitATL<TCHAR> >
とかだから、結局TCHARマクロ依存だし
Window系のクラスとかが扱うのはLPCTSTRだのCStringだのだから
これまたマクロだろ?
APIと違ってTCHARマクロを避ける方法が無いどころか
全面的に依存してるわけじゃん
CStringAとかCStringW使えばいいんじゃないの?
おねがいTCHAR
>>465 MFCだのATLだののクラスのインタフェースがCStringを要求しているのにか?
APIはA版とW版の両方のインタフェースが提供されている
MFCやWTLは、T版のインタフェースしか提供していない
んだよ
そもそもTCHARを避ける理由が無い
CStringAとCStringWの間は互いのコンストラクタで変換できる。
いや、そういう話ではないのは分かるけど、書かずにはいられなかった。
>>467 そういう問題ならそうといってよ、勘違いするじゃない。
とりあえずマクロで解決するのはやめろよと CreateWindowってメンバ関数作ろうとしてハマった俺ガイル
コンストラクタで変換できるっていうか、AやWを明示的に指定しておいて違ったほうでコンパイルしたらエラーになるから、なんら問題ないじゃん。
>>468 パラメーター見ようと、
マウス乗せても、hogeW/HogeAのdefineですぅ、としか表示されない。
T系のマクロやら、_t系の関数使っていても、しっかりマルチとワイドの両方に対応してるところなんてほとんどないだろうし、 AやらWに決めうちしたほうが、かえってトラブルなくて安全になりそう。
マルチとワイドの両方に対応しようとしたら#ifdefの嵐にならざるを得んだろ ロジック自体が共有できんことが多いのだからな それなのにマクロ一発で切り替えるという発想自体が馬鹿
そもそもAを想定したOS自体が既に非サポートなわけで
>>472 Janeみたいに多段ポップアップなら良いのにな
>>470 .NET Frameworkに同名のメンバがあるやつでそういう問題が起こるからって、
最近のSDKではMC++やC++/CLIでコンパイルすると
マクロをやめてインライン関数で定義するようになっている。
質問です。 配列の要素数は 奇数がいいのですか? 偶数がいいのですか? 2の倍数がよいのですか? 素数がよいのですか?
要素数だけに、要・素数、なんて。
.NETのリストは素数で確保してるっぽい
配置new用の演算子オーバーロード、 void* operator new(size_t size, void* buff){ return buff; } を追加したクラスに対して、通常のnewを使用するにはどうすればよいのでしょうか?
::new
_cstr
>483 ありがとうございます。単純なことだったんですね >484 すみません、具体的にどうするのか、想像がつきません
486 :
478 :2008/10/25(土) 23:41:55
>>481 まぁ、簡単に言うとそうなんですけれど
要素数はどれにすれば一番パフォーマンスが出るかなと思って
>>486 要素数はパフォーマンスと関係ないんじゃね?
見積もりが甘いと頻繁に伸びる
>>486 大概のC/C++処理系はパフォーマンスが出るように設計されて
いるので気にするな
C言語で長門がやってたみたいにゲームの改造とかできますか?
何箇所で質問しても、まともに返事が返ってくるとは思えないけど。
492 :
デフォルトの名無しさん :2008/10/26(日) 02:28:10
cを始めようと思ってて家に2000年発行の本があるんだけど これで充分?
>>492 だいたい使えると思う。
統合環境の操作方法とか、言語の説明以外のところはつかえない可能性が高い。
test
495 :
デフォルトの名無しさん :2008/10/26(日) 06:55:56
つい最近、VC++を使いはじめた んで、hello worldを作ってみた 文字の表示と数字の表示、xやyの変数に代入する事を覚えた 次、何したらいい?
入門書読破
498 :
デフォルトの名無しさん :2008/10/26(日) 08:28:20
>>496-497 そういう事は自分で調べろっていう戒めの意味を込めて言ってるんだよな
お前らのその素直でない親心・・・嫌いじゃないぜ
とりあえず、自分で頑張ってみるわ
499 :
デフォルトの名無しさん :2008/10/26(日) 08:42:32
友達からC++のプログラムもらって家でコンパイルしたら strcpy_s()関数が使えません、という警告が出て、コンパイルが成功しませんでした。 調べてみたらstrcpy_sはstrcpyの拡張版らしくて、うちのコンパイラが若干古いので、strcpy_sは使えないみたいなんです。 それでプログラムのstrcpy_sをすべてstrcpyに置き換えたら、またエラーが出ました。 strcpy_sは引数の数が三個で、strcpyは二個なんで、その警告が出ました。 strcpy_sを、strcpyと同様の動作をさせる関数として定義すればうまくいくと思ったのですが、どのような関数を定義すればよいでしょうか。
赤い靴履いてた女の子異人さんに入れられてイッちゃった
BCCだったね。
>>495 こらこら、曲解するでない
入門書読破はプログラム覚えるにあたって健全な意見
外出はさらに健全な意見
人間的な意味で
俺もコンパイラ拡張のはよく分からないというか使えないんだが、
>>500 をやるなら
#define strcpy_s(a,b,c) strcpy(a,c)
でどうかな。戻り値使ってないならいけると思う。
506 :
デフォルトの名無しさん :2008/10/26(日) 16:33:06
Visual C++ 2008 Express Edition をインストールしたんですが、 コンソールからコンパイルする方法がわかりません。 (IDEを使うよりも最初はコンソールからやった方がいいと聞いたので、、、、) どなたかお願いします。
>>504 マジレスすると、入門書を買う金すら捻出できないんだ。
これ以上生活費削ると、来月の家賃を払えない可能性があって云々。
とりあえず派遣に登録して、仕事の紹介受けてるから
そこで働ければ、安定はしそうだけど今はヤバイ。
外出は買い物とか家賃振込みとかで
嫌でもしなきゃいけないから、そこはモーマンタイ。
図書館に行って、それっぽい本を探してみたが
用語辞典ばかりで、今の自分には合わなさそうなのばっかだった。
まぁそれなりに頑張ってみるわ。
508 :
デフォルトの名無しさん :2008/10/26(日) 16:53:22
>>507 金なくてニートなのに、なんでVCなんて勉強してんの?
510 :
デフォルトの名無しさん :2008/10/26(日) 17:55:57
ニートがC言語なんてやるなよ・・・。高収入の奴がやる言語だぜ
441 名前: 9条教徒(愛知県)[sage] 投稿日:2008/10/26(日) 18:05:01.92 ID:QI/VG6PS
___________
|アキバは /ヽ‐-/| |
|いつまでも |_.・ω・_ .i |
|てめーの味方 ((((((< ミ -゙ |
|ぢゃねーぞ!! |i、゚ l>゚ ノ从 |
| ゴルァ ⊂兇⊃. |
(⌒ヨ_______|_l_ヽ〉F⌒)
| | ∧_∧ / /
\\ <´Д`> / /
\二 二二二/
| サヨ |
442 名前: 下痢気味(神奈川県)[] 投稿日:2008/10/26(日) 18:07:33.73 ID:ajuDYaOC
>>441 仕事はやいな
プラカードもってるのがモナーってのもまたwww
>>508 むしろ、金掛かるの?
プログラミングには昔から興味あったし、パソコンに関しては
あまり抵抗が無いから、唯一自分が向いてると思えるものなんだ。
てかCよりjavaとかVBとかの方がいいのかな?
>>509 おぉ、リンクサンクス
頑張ってIT企業に就職するわ
>>510 javaとかのweb関係の方が、需要があると聞いたからなぁ。
そういう経験の無い人間は、そっちを目指した方がいいんだろうか。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
519 :
512 :2008/10/26(日) 18:48:53
お、何だこれ 誰かが意図的に煽ってるのか? それとも俺のせい?
あぼーん
まぁ、C/C++スレで他の言語を持ち出す時点で嵐みたいなもんだし。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
いい加減やめない? うざいよ〜☆
あまりやるとアク禁になるぜよ。
Borland C++ Compiler 無償版って雑誌の付録につかなくなったの?
あぼーん
あぼーん
あぼーん
>>538 一応9MB、インストール後でも53MB程度だからお手軽でしょ
1000まで続けるのか?
>>506 付属のVSコマンドプロンプトを起動
ソースファイルのディレクトリに移動
cl.exe hoge.c
hoge.exe
つまんね
VIPPERでもまざってんのかこれ。 NGめんどいなあバカー
>>512 最初に学ぶものとしてCを選ぶのはやっぱりいい選択だと思うよ。
OOPに行きにくくなるかも、という懸念もなくはないけど、まあ。
なぁ、このこぴぺって同じやつなのかな?
お前ら規制くらうぞおおおおおおおおおおおおおお
そのうち正義に持っていくから
お前「ら」って 荒らしてんの一人だろ? 最近ム板もキチガイが多いよな
551 :
デフォルトの名無しさん :2008/10/26(日) 23:44:53
コンストラクタを明示的に呼び出すにはどうしたらいい? 特にコンストラクタ内で別のコンストラクタを呼びたい。 class obj; obj::obj() { obj( v ); // 別のインスタンスが作られるようでNG } obj::obj() { obj::obj( v ); // 別のインスタンスが作られるようでNG } obj::obj { operator=( obj( v ) ); // これならOKだが。。 }
>>508 金掛かるの?
プログラミングには昔から興味あったし、パソコンに関しては
あまり抵抗が無いから、唯一自分が向いてると思えるものなんだ。
てかCよりjavaとかVBとかの方がいいのかな?
>>509 おぉ、リンクサンクス
頑張ってIT企業に就職するわ
>>510 javaとかPerlとかのweb関係の方が、需要があると聞いたからなぁ。
プログラムの経験の無い人間は、そっちを目指した方がいいんだろうか。
>>508 金掛かるの?
プログラミングには昔から興味あったし、パソコンに関しては
あまり抵抗が無いから、唯一自分が向いてると思えるものなんだ。
てかCよりjavaとかVBとかの方がいいのかな?
>>509 おぉ、リンクサンクス
頑張ってIT企業に就職するわ
>>510 javaとかPerlとかのweb関係の方が、需要があると聞いたからなぁ。
プログラムの経験の無い人間は、そっちを目指した方がいいんだろうか。
>>551 今は無理。
諦めて初期化用のprivateメンバ関数をそれぞれのコンストラクタから呼び出すくらいしかない。
windowsが使いやすすぎてLinuxとかまったく覚えられないのですが、どうすれば改善されますか?
>>551 無理。別のメンバ関数にでもしておくしかない。
いわゆるデータ実行防止というやつでは mmap とか mprotect とかそのへんをいじらないとだめかも
>>557 ただのデータ領域をコードとして実行しようとしたからだな。
実行可能領域に変更できれば解決するけどCentOSでなんてAPI使えばいいかは知らない。
C++の環境がないので検証できず、質問します。 map<>.erase()でイテレータ末尾を指定した場合、 どういう処理が行われるのでしょうか? イテレータ末尾は要素を指さないのですよね? map<int> dic =〜; dic.erase(dic.end());
560ですが、mapではなくvectorでした。すみません。
規格上は定義されていない 処理系独自に何らかのケアをしているかもしれないが、 そうでなければ単純に落ちるか、後々原因不明のバグを引き起こす原因になる
>>562 ありがとうございます。
ただ、作者はgoogleにいらっしゃる優秀な方で間違いとは考えづらいのです。
工藤拓さんのprefixspan実装からの引用です。
private:
vector < pair <T, unsigned int> > pattern;
(以下略)
for (map <T, vector <pair <unsigned int, int> > >::iterator l = counter.begin ();
l != counter.end(); ++l) {
if (pattern.size () < maxpat) {
pattern.push_back (make_pair <T, unsigned int> (l->first, l->second.size()));
project (l->second);
★pattern.erase (pattern.end());
}
}
★の部分の理解に苦しんでいます。
564 :
デフォルトの名無しさん :2008/10/27(月) 15:07:16
Cの授業の宿題ってC++のソフトでできる? めっちゃ初心者なので何もわかりません。 ポインタの講義とかでも「ん?先頭アドレス?それってウマイの?」ってな感じです
たいていC++コンパイラはCのコンパイルもできる コンパイルオプションで言語を指定するか、指定しなければファイルの拡張子で判断
>>563 本人に聞けば? 「end()をerase()って何をしたいの?」って。
C++の演算子のオーバーロードむずい
>>563 優秀な人だからってバグをまったく出さないわけじゃないだろー。
ヒヤリハッとだな
571 :
デフォルトの名無しさん :2008/10/27(月) 21:37:14
are?
独習C++の練習問題1.5の循環キューでいきなり躓いたorz 誰か説明してくれー
先日パソコンを購入したばかりの初心者です。 光回線を引きたいと思うのですが、1家屋につき何回線まで引く事が出来ますか? 自宅サーバーのようなものをやってみたいのですがどのような知識が必要ですか?
>>576 え?ここはC/C++スレですよね。
パソコンのOSはC言語で作られていると聞いたのですが
なるほど自動車保険のことは車工場の人に聞けばいいのか
>>575 何回線でも引けると思うが。 ただし、必要以上に引く場合は特別料金かも
もういいです。初心者いじめてニヤニヤするとは、C言語も堕ちたものですねw 今度はJAVAスレで質問してみます。さよなら二度とこねーよ( `,_・・´)フンッ
なんだJAVA工作員か
あー、キモイわ
ほんとつかえねーやつらだな
糞つまんねーからマジで二度と来んな
vipからきますた
>>580 C言語というものは存在しないということを覚えて帰りな
すいません質問です。 katamuki自体はdoubleで宣言しているのだからそのまま katamuki = y/x; でもいいと思ったんですがそれだと小数点以下が表示されないんです。 もしかして y/xそのものはint型で計算されてその値がdouble型のkatamukiに 入ってしまうということなんでしょうか? #include <stdio.h> main () { int x,y; double katamuki; printf("xとyを , で区切って入力\n"); scanf("%d,%d",&x,&y); katamuki = (double)y/(double)x; printf("傾きは%lf",katamuki); return 0; }
string str="噂詐欺"; cout<< str.find("\\")<<endl; cout<<str.rfind("\\")<<endl; これ実行すると1と5が出ます。-1と-1にするには、wchar_tに変換するしか無いですか
590 :
589 :2008/10/28(火) 03:14:28
日本語を含むパスで\の位置を特定したいのですが UNIXでもMACでWindowsでもちゃんと動くようにするにはどうしたら良いんですか? なるべく汎用のやり方を教えてください。日本語以外のコンパイラや文字種でも使える方が良いです。
UNIXやMACはパス区切りに\を使わないのだけど、\でいいの?
592 :
589 :2008/10/28(火) 03:41:23
>>591 半角の「\」は入力できません。パスの区切りを特定して
ファイル名とパスが分離できればいいです。
他の環境(Winもだが)知らないのに マルチを考えるのは時期尚早
594 :
587 :2008/10/28(火) 05:09:30
596 :
595 :2008/10/28(火) 06:03:32
誤爆したorz スマソ
どこの誤爆か気になる
>>592 もっかい
>>591 を読んでも半角のバックスラッシュが入力できないという斜め上の反応しかできないなら
Windowsだけで動作するようなものを作れるようにしよう。
んで、暇なときに各環境のパス区切りに何が使われているのか、\が何なのかを勉強しよう。
VC++ 2008 Express Edition を落としてきたんでこれから始めようと思います。 プログラム経験はVBとJavaScriptです。 さっそく入門書を買ったのですが、どうやらVC++/CLIを中心に書かれているらしい。 CLIって文法が全然違うんじゃないのですか? 今から始めるのにコンソールアプリの作り方からちまちま覚えていくのと 比べて、いきなりCLIからはじめてツブシがきくでしょうか? それともコンソールアプリ→Win32 API って感じで勉強していく方がいいでしょうか?
C++/CLIは.NETに対応する為C/C++を拡張した別言語。 C/C++を勉強するなら、VCや.NETとか書かれてない純粋なC/C++言語の本買いな。 Win32APIやるつもりなら、まずコンソールアプリでC/C++言語をしっかり習得してから。 もし.NETメインで行くつもりならC#の方がいいぞ。 C++/CLIよりネットで情報見つけやすいし、開発環境もC#の方が作りやすい。
C++/CLIはあまりやる意味ないのかな? 後、C#にもVC++みたいなフォームデザイナはあるのですか?
既存のC/C++コードと.NETの橋渡しくらいしか使い道が見出せない。俺の場合。 C#にもフォームデザイナは当然ある。
603 :
デフォルトの名無しさん :2008/10/28(火) 13:15:41
>>600 ありがとうございます。
とりあえず猫のページでCとC++を勉強してみます。
むずかしそうならC++/CLIよりC#の方に行く方がいいんですね?
604 :
デフォルトの名無しさん :2008/10/28(火) 13:35:24
世間一般では、C++が難しいというのは、機能が少ない(.NETが使えない)せい。 しかし、C++/CLIは、.NETの機能を全て使え、既存のC、C++を動かせるので 難易度はC#と同等かそれより易しい。
C#は今でも、フリーツールの逆コンパイルでソースが丸見えなんですか?
>>604 機能が少ないせいだけではないよー。
エラーメッセージが鬼わかりづらい、インテリセンスが糞弱い、
これらが初心者には致命的ですた。
昨日、vec.erase(vec.end())について聞いた者なんですけど、
VC++環境いれて試したらエラーでした。文脈から考えるに
最後の要素消すつもりなんじゃないかと思うんですが、
unixとかcygwin環境では、vec.erase(vec.end())がvec.erase(vec.end()-1)
に補正されるってことはありうるでしょうか?
×unixとかcygwin ○gccとか?
vectorはランダムアクセスに適しているが、要素の追加、削除を頻繁に行うような場合には適さない らしいのですが、予め vector<double> vec(1000)のようにサイズを決めて、宣言し、 それに要素を0番目から999番目に代入するのも遅いんですか?
定数時間でできますよね。ありがとうございます
それって、要素の「追加」も「削除」もしてないじゃん。
あと、末尾要素の追加と削除は速いよ
string *p[3]; これで文字列へのポインタの配列の宣言 これを関数に渡して、p[0]は文字列"abc"を指すポインタというようにしたいです void func(string *p[])に func(p)とすればいいでしょうか?
614 :
デフォルトの名無しさん :2008/10/28(火) 19:06:58
func(vector<string> &str)でいいじゃん 実体を参照渡し あとfunc(vector<string*> p)とか ポインタを嶺渡し もしかしたらvector使うと自動的に参照渡しかも試練 よくしらない
613の書き方だとわかりにくいかもしれないですね。 func内で生成した文字列をmainで確保した場所にいれる操作をしたいんです
616 :
デフォルトの名無しさん :2008/10/28(火) 19:16:14
これでいいじゃん void f(string &s){ s="abc"; } main(){ string s; f(s); cout<<s; } void f(vector<string> &s){ s.push_back("abc"); s.push_back("def"); } main(){ vector<string> s; f(s); cout<<s[0]<<" "<<s[1]; }
文字列が100個ぐらいあるので配列で渡そうと思ったんですが・・・
618 :
デフォルトの名無しさん :2008/10/28(火) 19:18:25
vector<string>の参照渡しで良いだろ 何が嫌なんだよ?
619 :
デフォルトの名無しさん :2008/10/28(火) 19:24:23
mainで渡した文字列100個を書き換えるプログラム void f(vector<string> &s){ for(int n=0; n<100; n++) s[n]="** "+s[n]+ " **" ; } main(){ vector<string> s(100); for(int n=0; n<100; n++) s[n]=97+n; f(s); for(int n=0; n<100; n++) cout<<s[n]<<endl; }
for(int n=0; n<100; n++) s[n]=97+n; これはなんのためですか?
呼び出し側にvectorなんてものが在るかすら分からんだろ
622 :
デフォルトの名無しさん :2008/10/28(火) 19:39:02
"a" "b" "c" ・・・ というサンプル文字列を生成している。 100個を s[0]="abc"; s[1]="def"; s[2]="ghi"; などと自分で書いても良い
623 :
デフォルトの名無しさん :2008/10/28(火) 19:43:42
>>621000000 文字列がすでに定義されている(char[]やnewなど)なら
stringに先頭アドレスとサイズをセットすれば上のままでよい。
呼び出し側にすでにあるデータを書き換えたいのか 新しく文字列リストを作りたいのかよくわからんな 主に気にしてるのは性能なのか?
>>621 vector使えるので貼っていたいただいたので大丈夫かとおもいます
>>624 新しく文字列リストを作りたいんです。速度とかは別に気にしてないです
627 :
デフォルトの名無しさん :2008/10/28(火) 19:46:38
訂正
>>621 だ。
あと
>>623 で書いたやり方
void f(vector<string> &s){ for(int n=0; n<100; n++) s[n]="** "+s[n]+ " **" ; }
main(){ vector<string> s(100);
for(int n=0; n<100; n++) s[n]=97+n;
char ch[]="abcdefg";
s[0]=ch; s[0].resize(strlen(ch));
f(s);
for(int n=0; n<100; n++) cout<<s[n]<<endl; }
クラスをエクスポートするとかあほすぎ
>>608 vectorの末尾への要素の追加は、もともと定数時間じゃなかった?
バッファが足りなくなって拡張する場も、拡張の幅をうまく
計算してやると(というか2倍ずつ)、全体で償却できて
最終的に定数時間になるっていう話だったような
償却定数時間と定数時間は違うよ
coutでcharやstringの書式設定はできますか? 文字列の最大の長さを5文字としたら、それ未満の長さの文字列には、空白をいれてそろえたいんです。 abc abcd abcde abc みたいにずれずに abc abcd abcde abc の様に表示するか、 abc abcd abcde abc の様にするかのどちらかです
書き込んだらずれました・・・ abc____abcd abcde_abc の様に表示するか、 __abc__abcd abcde___abc こうです
マニピュレータでぐぐるがよい
右にそろえるとかじゃなくて、うまいこと均等に空白入れるほうか、 それはマニピュレータじゃなかったなごめん
widthを使ったらできました・・・ 右詰になりました 本当は左詰めにしたかったんですが・・・
質問です。
WindowsVista、VisualStudio2008で
C言語のコンソールアプリの勉強をしているのですが、
ファイル操作に関する質問です。
ttp://www.geocities.jp/ky_webid/c/037.html こちらのサイトにあるバイナリファイルの読み込みのプログラムを参考にファイルを開いて読み込もうとしたんですが、
読み込むことが出来ません。
開いたファイルをfreadするとサイズが0なので、ウォッチ式でファイル構造体を追っ掛けてみると
ファイル構造体の中身のポインタが「0x00000000」になっていて、開けていない?のかなと思ったんですが・・・。
ファイルパスを変えて試した場合はちゃんとNULLになってエラーを出すので、ファイルのパスには問題無いはずなんですが・・・。
何か考えられる原因があれば教えていただけると助かります。
なにがおこった
>>636 そんな間違いだらけのサイトで勉強してるから分からなくなるんだよ、きっと。
Win32APIを使ったアプリを比較的楽に開発できる環境はありますか? c/c++でお願いします。
642 :
デフォルトの名無しさん :2008/10/29(水) 22:29:28
VC++2008
VS以外になにがある
>>642 流石にフォームデザイナみたいな物はありませんよね
645 :
デフォルトの名無しさん :2008/10/29(水) 22:38:24
VC++2008にある
斜め上の回答としてQtとかどうか
C++/CLIはC++じゃないぞ
>>645 VC++2008 Express Editionを使ってみたのですが、C++/CLIのようなフォームデザイナ
は付いていませんでした。
Express Edition以上の製品には付いているのでしょうか?
649 :
デフォルトの名無しさん :2008/10/29(水) 22:49:59
SetWindowPos(g_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE); 最後の引数が ”SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE” のように複数の情報が合わさった物が渡されています 受け取り側はどのように、分解分析しているのですか?
たぶん、 if (flags & SWP_SHOWWINDOW) { } if (flags & SWP_NOSIZE) { } ...
例えばその引き数がparamだとして、(param & SWP_SHOWWINDOW) != 0で取り出せる。 逆に、それができるようにそれらのマクロ定数は2の冪乗の値になっているはず。
654 :
デフォルトの名無しさん :2008/10/30(木) 01:41:32
Mingw環境でWindowsプログラミングを独習中です。 書籍のコードを見ていたらファイル先頭の一連の定数定義の並びの中に 次の記述がありました。 <CHANGE> #define ・・・ </CHANGE> このCHANGEで囲んでいるのは何を意味してるのでしょうか。 見ているコードはVisualC++向けということなので、 そっち方面のルールなのかなとも思ったんですが、どうもわからず・・・ コードには"(この定数は)アプリケーション定義メッセージ"というコメントがついています。
なんかhtmlのタグみたいですね
>>655 あ、なるほど。ヘルプですか!
必要に応じてここを変えてね、みたいな・・・
<CHAGE>に見えたのは俺だけじゃないはず
君だけ
cin cout と printf scantfを混ぜて使ってはいけない というのは標準入出力の問題だから、 cin cout sscanfを併用しても変なことにはならないと言う理解であってますか?
混ぜても問題ないです <iostream> <stdio.h> を併用するのがまずいんです
661 :
デフォルトの名無しさん :2008/10/30(木) 12:38:03
shard_ptrモドキを短絡的に実装しようと思って template <class Ttype> class vecter_ptr : public std::vector<Ttype *> { public: ~vect_ptr(){ int i; for(i = 0; i < size(); i++;){ delete at(i); } } }; と書いたら、 この書き方がshared_ptrの動作になるかどうかは置いといて、 error C2523: 'vecter_ptr<Ttype>::~vect_ptr' : クラスのデストラクタが、別の名前で宣言されています。 with[Ttype=std::vector<double>] と表示されるのですが、これは何が行けないのでしょうか?
日本語くらい読めよ 別の名前って書いてあるだろ
>>661 × class vecter_ptr
○ class vect_ptr
664 :
661 :2008/10/30(木) 13:10:42
ごめんなさい ちょっと首つってきますorz
>>660 併用してもいいよ
sync_with_stdio()をtrueにしておけばな
>>665 それって
<iostream>
<cstudio>併用のときも?
>>666 そうだよ。sync_with_stdio()でぐぐってみ。
STLのmapで、値自体はfindで検索できるのですが、キーが存在しているかどうかを調べる方法はありますか?
>>668 map.find(key)がmap.end()を返せば、キーは存在していない。
>>668 multimup じゃなければ count() が使いやすいかもしれない。
ありがとうございます。mapのメンバを見落としてましたねorz
VC++2008EEだと<cstring>を入れなくてもstrcpyとか使えるんだけど普通はどうなの?
>>672 それは他のヘッダがcstringをインクルードしているからだろうが
移植性がないのでやめるべき
<cstring>も書いといたほうがいいってことか thx
675 :
デフォルトの名無しさん :2008/10/30(木) 19:19:35
strcpyは、string.hやstringで出来るが
なんか変な指摘だなw
c〜の方をいんく☆る〜どしたら、std::strcpyって書かないとイケないよね?
いけなくない
, -‐ '´  ̄ ̄ ` ヽ、 /:::::/" `ヽ ヽ::::::::: \ /:::::::::/ ヽ ヽ:::::::::: ヽ l:::::::{:::l , ー-j从:ヽ::::::::.ヽ | ::i::ル{レ' ●` li!: ト、::::..', /⌒)i"● ⊂⊃: |ノ::::. l / yi ヘ⊃ ,__, l|:: |:::::::::.l ( /ス、,ゝ、_ `´ ィ<|:: |_:::::::.l '</ |l:::: i "Tーイ'^ァレ'l_::::::.l \,,t|l:::: l'ヾ::|三/:://l/ ヽ、'i |::|l:::: l ヾ∨:::/ ヒ::::彡, | :ji
コピペ君って馬鹿だな、まで読んだ。
明日学割でVisual Studio 2008 Professional Edition買ってくるわ
>>682 学生ならDreamSparkのほうが安いぞ。
国際学生証を作るのに少し時間かかるみたいだけど。
シェアウェアつくるのかもよ!
>>683 ホントだ、無料なんですね。
しかし自分はすぐにでも手に入れたいから今回はアカデミック版いっときます。
後一つ質問なのですが、Visual Studioは英語での使用は可能でしょうか?
開発環境ぐらいは英語で使えるようになりたいので
>>686 ありがとうございます。
体験版といっても90日は試用期間があるみたいなので早速落として見ます。
VC2008で、とある関数をinlineにすると、 「LNK2019: 未解決の外部シンボル」とエラー出るです。 どうすればいいの?
外部からも参照される関数なら、インクルードファイルに実装も書いてしまう。
リンケージの定義が紛れ込んでるとか
692 :
デフォルトの名無しさん :2008/10/31(金) 10:28:47
693 :
デフォルトの名無しさん :2008/10/31(金) 13:26:27
VS2008使用です。 Bクラスで定義されている構造体をCクラスで使用したいのですが、どのようにしたら良いでしょうか。 ポインタをコピーしたいだけなのですが・・。 ////////////////classA.h//////////////////////// class A{ public: typedef struct hoge{ //略 } HOGE; ////////////////classB.h//////////////////////// pragma once; #include "A.h" #include "C.h" class B : A{ public : typedef struct hoge{ //略 } HOGE; C m_c; HOGE m_hoge; } ////////////////classC.h//////////////////////// class C{ HOGE *m_hoge; registerHoge( HOGE *hoge ){ m_hoge = hoge;}; } class Bで m_c.registerHoge( &m_hoge )を呼び出すようにしてコンパイルすると「型指定子がありません」と怒られてしまします。 試しにHOGEの定義をC.hにコピペしたのですが、B:HOGE* から C:HOGE*に変換できませんと怒られてしまいました(T_T) また、class A, class Bは前任者が設計した物で、あまりいじりたくはありません。どうかご教授お願いします。
B::HOGE
typedef struct hoge{ //略 } HOGE; これをclass Bの宣言(スコープ)内から出して、単独のヘッダーファイル (HOGE.h)として分離して、 classA.h,classB.h,classC.hの先頭で、HOGE.hを#includeで読み込む。 クラス内でtypedef定義すれば、そのクラス内でのみしか有効ではない し、定義名が同じでも、実体としての中身が同じかどうかに関わらず、 コンパイラは(A:HOGEとB:HOGEは)別物として扱う。
696 :
デフォルトの名無しさん :2008/10/31(金) 15:05:38
697 :
デフォルトの名無しさん :2008/10/31(金) 15:07:01
#include <stdio.h> #include <stdlib.h> #include "SFMT.h" int main() { int i; init_gen_rand(0); for(i=0 ; i<100 ; i++) { printf("%d",genrand_res53()); } return 0; } というプログラムを作ってテストしましたがコンパイルできません。 外部シンボル'_init_gen_rand'が未解決 外部シンボル'_gen_rand64'が未解決 と表示されます。 環境は、borland c++ builder5がインストールされていますが、 コマンドプロンプトでbcc32 xxx.cという形でコンパイルしています。 初心者で申し訳ありませんが、よろしくお願いします。
698 :
デフォルトの名無しさん :2008/10/31(金) 15:08:24
すいません。補足です。 ソースの場所はSFMT-src-1.3.3.zipを解凍したフォルダ内です。 よろしくお願いします。
そのSFMTのソースも一緒にコンパイルしないといけないのでは
dSFMT.hじゃないの? bcc xxx.c dSFMT.c でどうなる? たぶんdefineとc99で文句言われそうだが。
701 :
デフォルトの名無しさん :2008/10/31(金) 15:32:04
ありがとうございます。
複数同時にコンパイルということもできるんですね。
dSFMTではなくてSFMTで大丈夫だと思います。
イマイチわからなかったんですけど、多分、
dSFMTは少数の乱数を発生させる奴でSFMTは
整数だと思います。
私が欲しいのは整数なので大丈夫だと思います。
また、
>>700 さんのように
bcc32 xxx.c SFMT.c
としてみたところ、無事コンパイルできました。
forを含む関数はインライン展開できないと警告されましたが、
SFMT内のことなので無視して実行した結果、
無事乱数が表示されました。
本当に助かりました。ありがとうございます。
702 :
デフォルトの名無しさん :2008/10/31(金) 16:38:30
>>695 BがAを継承してて、B,とAで定義が微妙に違うんです・・。
結局キャストしたら通ったのでそれで良いことにしました。
class Dog{ public: char* cry(){ return "ワンワン"; } }; class Cat{ public: char* cry(){ return "ニャーニャー"; } }; typedef char* (*TEST)(void); void Test(TEST test) { printf("%s\n", test()); } int main() { Dog dog; Cat cat; Test(dog.cry); Test(cat.cry); return 0; } こういう事はできないのでしょうか? 引数をDog::cryや&Dog::cryに変えてもエラーが出るのですが・・
メンバ関数ポインタでぐぐれ
#include <boost/bind.hpp> #include <boost/ref.hpp> template<typename Func> void Test(Func test) { printf("%s\n", test()); } Test(boost::bind(&Dog::cry, boost::ref(dog)); Test(boost::bind(&Cat::cry, boost::ref(cat)); TR1でも可
>>703 とりあえず、メンバ関数をstaticで宣言すれば可。
class Dog{
public:
static char* cry(){ return "ワンワン"; }
};
class Cat{
public:
static char* cry(){ return "ニャーニャー"; }
};
if (i & c[j]) cout << "1"; の&は論理演算子の&&と同じ意味ですか?
いいえ
&はビット積であって決してショートサーキットなどというものでは無い
演算子の意味なんて、検索すれば一発で、しかも詳細にわかることなわけで、 普通のアタマしてる人間なら、こんなことをBBSで質問するという発想自体ありえないな。
なんか最近変な人が多いNE
演算子は検索しにくい
だったら手元の本を見ればいいじゃない。 巻末とかに演算子一覧ってあるでしょ。名前ももちろん書いてあるはず。
>>713 「C言語 演算子」とかで検索すれば、まとめて説明してるページがたくさん見つかるっしょ。
演算子そのものを検索ワードにする必要は無いよ。
Cで <は文字列リテラル内以外だと << しか使わないってことでおk?
そんなことはない。 x < 1のような比較演算に使う。
なんでそんな質問を・・・
応用はまったく利かないが、的外れな連想だけは雪崩のよう、って奴は割といる。
なんでお前らはもてないのかわかったわ 質問に素直に回答すればいいものをすぐに馬鹿にしたりどうでもいいこというからだな そりゃ人ともうまくつきあえんしもちろん女にも嫌われるわけ
つ鏡
722 :
デフォルトの名無しさん :2008/11/01(土) 08:12:10
かがみ?俺の嫁のことですか?
かがみんは俺の嫁
>>720 馬鹿なプログラミング学習者はもっともてないよw
STLコンテナのイテレータってbegin()で初期化されるとか、end()だとかって決まっているのですか? もし決まっているとしても、明示的に代入すべきですか?
char型配列で文字列を表現する場合末尾に0を置くと書いてあるんですが、 文字列の途中に0があったら末尾と間違えないんですか?
間違えるよ
>>727 間違えるというより、そこを末尾と判定するのが正しい動作
'\0' == 0
'0' != 0
>>726 begin()で初期化されるとして、itr = begin();みたいなのは冗長かなあと思ってですね
>>727 末尾に0を置くというよりは、「0が文字列の末尾」。
もしchar hoge[10]なんて配列があって、hoge[5]が0だったら、
「hogeはサイズ10のchar型の配列」であり、同時に「hogeから始まる文字列は5文字」ということ。
>>730 具体的にどうなっているべきだと思うの?
>>730 std::vector<Hoge> vec_1;
std::vector<Hoge> vec_2;
std::vector<Hoge>::iterator iter;
begin()で初期化されるとしたら、iterはvec_1, vec_2どっちのbegin()で初期化されるんでしょうね?
'\0' == 0 '0' != 0 がよくわからないんですけど、0も\0も同じじゃないんですか?コードがわかりやすいように\を付けるといいと、書いてあるんですが、 char hoge[10] = "7890123456"; は、サイズ10で"789"の3文字の文字列になるんですか? CString hogeS = hoge;
>>734 ざっくばらんに言ってみると
'0' つまりは0という文字は中身としては(大抵は)48という数値だ
putchar(48)とputchar('0')は同じ意味になる
0 という文字に振られた認識番号みたいな感じ
'\0' は中身が0
>>735 やっとわかりました。ありがとうございました。
文字の「0」と文字コードの「0」は違う値。 "7890123456"の「0」は文字の「0」だから、C言語のコードでは'0'と表す。'0'の文字コードは0ではない。 終端文字の「0」は、'\0'で表す。この文字コードは0である。
DLLかlibを作っていった方がいいのか、cppとhのセットかを保管しとけばいいのかよくわからないんですが、 DLLを作る理由ってなんですか?もしかしてオープンソースかどうかの違いしかないですか?自分で使うだけならDLLいらないですよね。であってますか?
メモリやディスクの節約。 まぁ自分で作って自分で使うようなちっちゃい関数群だったら、いちいち作る必要は無いかな
>>738 毎回リンクする破目になって構わないのなら、DLLにしなくていいよ。
Unzip.dllみたいに他のアプリでも使えるルーチンを提供できたり Susieプラグインみたいに別の人が後から機能拡張できる仕組みを作れたりする。
まだDLLは必要なさそうなので、cppで保管して使いまわしていきます。 メモリやディスクの節約というのは、DLLを使うアプリケーションごとにオブジェクトをインスタンスする時、どう節約になるんですか? あ、staticのときか。わかってきました。ありがとうございました。
アプリの実行速度を早くするのにクラスの中で使ってない関数を削除しても意味ない? なんか馬鹿でかい汎用クラスで使う関数1つだけとか無駄なんじゃないかと気になってきたんだけど
>>743 「使わない関数をバイナリから取り除く」程度なら、
処理系の最適化に任せておけば良いと思うよ。
ただ、どのみち実行速度には殆ど関係しないはず。
オブジェクトを自動で作るにはどうすればいいんですか? オブジェクト名が何個必要になるかわからないのでobj1 obj2 ・・・と増やしていきたいんですが CString クラス名; for(i=0;i=count;i++){ クラス クラス名+(char)i } みたいなことをするにはどうすればいいですか?
vector<CString>クラス名; for(i=0;i=count;i++){ クラス名.push_back+(クラス名()); } でクラス名[i]で使用じゃなんかまずいのか?
vector<クラス>クラス名; か
C言語をかじっただけの状態ですが、C++に移るのは可能ですか?
その人次第
別に段階をふんで習う必要ないしな。 遠回りになるか、近道になるかは、たぶんだれも分からないはず。
>>747 すごいです。今までSTLは避けてきましたが、動的変数以外でこんなことができるとは知りませんでした。勉強になりました。ありがとうございます。
753 :
749 :2008/11/01(土) 19:35:33
単に可変数のオブジェクトを作成したいだけならわざわざSTL使わなく てもできると思うが? CMyClass::CMyClass() { m_lpStrBuf=NULL; m_numObjCount=0; } CMyClass::~CMyClass() { delete [] m_lpStrBuf; } void CMyClass::CreateMultipleCstring(int nCount) { if(m_lpStrBuf) { delete[] m_lpStrBuf; m_lpStrBuf=NULL; m_numObjCount=0; } m_lpStrBuf=new CString[nCount]; m_numObjCount=nCount; } CString *CMyClass::GetObject(int nPos) { if(m_lpStrBuf && 0<=nPos && nPos<m_numObjCount) return &m_lpStrBuf[nPos]; // 有効なインデックス else return NULL; // 無効なインデックス }
そりゃあ物事は何でも状況にもよるけど、この場の印象度では 圧倒的にそっちのほうが「わざわざ」だと思う。
>>754 わざわざ自前でコーディングしてコピーコンストラクタを忘れたり例外安全性を壊したりしたくないよ。
>>747 初めて使ったのでめちゃくちゃエラー出て苦労しました。STLと間違えてATLのサポート適用とかいうのを実行したりしましたが、やっとエラー残り1個になりました。
vector<HTREEITEM> vObj;
int i = 0;
void test(void){
vObj.resize(i+1);
vObj.push_back+(vObj()); //この行で 0 引数を取り込む関数には評価されません。 のエラーが出てしまいます。 vObj()の()の意味がわかりません
i++
}
vObj.push_back(vObj);だと意味が違ってくるんでしょうか?
これだと、'std::vector<_Ty>::push_back' : 1 番目の引数を 'std::vector<_Ty>' から 'const HTREEITEM &' に変換できません。
とエラーが出てしまいます。教えてください。
なにをしたいのかわからない。
vector<HTREEITEM> vObj; void test(void){ vObj.push_back(HTREEITEM()); } こうだろ vector は push_backで 必要な領域を自動確保するからresizeなんかいらない。
型とインスタンスの違いがわかってない悪寒
C++でHelloWorldからやり直すべき
push_back+ は誤字です。すいませんでした 改変して作ったもんだったから・・・ そもそもデフォルトコンストラクタでいいなら vector<HTREEITEM> vObj(10); ですむんじゃない?
うわーーーーーコンパイルできちゃいました。 vObj.push_back(HTREEITEM()); でいけました。みんなありがとう! なぜクラスに()が必要なんですか?これは戻り値のない関数に使うものじゃないんですか?
は?
間違えた、引数のない関数だった
一時オブジェクトでググれ
767 :
デフォルトの名無しさん :2008/11/01(土) 23:17:02
void で汎用性の高い関数を作れるが void で値を受け取ると何の型が不明である 型を調べるいい方法ないですか? 今はサイズ受け取ってしのいでる
いみふめいです
「voidポインタで」でしょ。 可能であればtemplate化でもすれば。
voidポインタは怖いじぇ〜
error: converting to execution character set: バイト・シーケンスが正しくありません。 と言うエラーが出て 以下のようなプログラムがコンパイルできません。 #include <stdio.h> #include <stddef.h> #include <sys/types.h> #include <locale.h> #include <wchar.h> int main() { wchar_t *whoge = L"あいう"; setlocale(LC_ALL ,""); wprintf(L"%s\n", whoge); return 0; } 何がいけないのでしょうか?
>>772 VC2008ではコンパイルできて、正常に実行できた。
>>756 コピーコンストラクタは、vectorで扱うオブジェクトクラスが持って
いるかどうかで、vectorクラスを使えば解決する問題じゃないでしょ。
例外うんぬんも同様。
775 :
772 :2008/11/02(日) 08:08:41
>>773 本当ですか?
OSはMac OS Xなんですが、全く動かない。
デバッガで見たら、
wchar_t *whoge = L"あいう";
の時点で、失敗してます。
どうすれば、うまくいきますかね?
>>775 Mac OS X 10.5.5
gcc 4.0.1
では、%s を %ls にすることで正しく動いたよ
>774 保持されるクラス側で対処しなきゃいけない部分があるのは当然だが、コンテナ相当部分でも面倒を 抱え込みたくはないってことだろ。 実際 >754 のコードは「コピーコンストラクタを忘れたり例外安全性を壊し」てるわけだし。
>>775 ワイド文字リテラルの扱いは処理系依存なところがある。
コンパイラのマニュアルをよく読め。
>>777 >>754 のコード自体は必要部分のみ抜粋してあるけど、CString自体は
コピーコンストラクタを持っているし、GetObject()は保持するオブジェ
クトのコピーではなく生ポインタを返す仕様なので、ここでのコピー
コンストラクタ呼び出しは行われない。
CMyClassの複製を作る際のことを言っているのだとしたら、それは勝手な
解釈だろう。 CMyClassで単にメンバ変数のコピーをするのか、実体も
別に複製してコピーするのか、複製を許可したくない場合も、CMyClassの
定義によって実装も変わる。
結局、テンプレートクラス使っても、マルチスレッド操作の場合、テンプ
レートが保持するオブジェクトの参照に対して、排他制御とか自分でやら
なきゃならないし、テンプレート内で例外が発生しても、例外を投げる
だけで、結局は何も変わっていない思うのだが?
個々のクラス内で例外処理をキャッチしなくても、上位のオブジェクト
生成を呼び出している部分で例外をキャッチできるし、どこに例外処理を
書くかは、設計者次第だろう。
>>775 wchar_t whoge[]= L"あいう";
では?
781 :
デフォルトの名無しさん :2008/11/02(日) 12:08:54
std::map<string,myclass>をmyclassの中のある値に基づいてソートしようとしているのですが、 そんなに要素数は多くないのでバブルソートを自分で書こうとしているのですが、こういう場合は どうするのがよいですか?
mapをソート?
std::set<myclass>
785 :
デフォルトの名無しさん :2008/11/02(日) 12:18:41
だめですか? 実際は、map<会社名の文字列、会社のデータ>としておいて、会社のデータの中の株価でソートを しようと思っているのですが、、、
>>781 std::map<double,myclass&> 追加
教えてください。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { progressBar1->Maximum = shikou_kaisu; /* 最大値 */ progressBar1->Visible = true; label8->Text = "処理中"; label8->ForeColor = System::Drawing::Color::Red; for(i=0; i<shikou_kaisu; i++){ rnd(kibou_kosu); //自作関数呼び出し Sleep(1); } }; このようにshikou_kaisuには10000を入れていまして、1万回のループに入る前に プログレスバーを出し、label8の文字色を赤にし、処理中と書き換えているのですが どちらとも(プログレスバーもlabel書き換えも)for文が終了したあとに処理されてしまいます。 なぜでしょうか? もう一つ教えてください。 出力ウィンドウに、テスト的に変数の値などを表示させたいのですが、 Console::WriteLine("aaa"); などとしてもまったく表示されません。何か方法はありますでしょうか? よろしくお願いします。
C#はCでもC++でもねえYO
C++/CLIも知らないのかよ
C++/CLIもC/C++とは言えないかもしれんw
>>789 ソースをよく見ろ。とてもC#には見えない。
それにC#ならConsole::WriteLineでなくSystem.Console.WriteLineじゃないか?
>>788 メッセージループ廻してないからでしょ。
>>788 何の言語か知らないが、メッセージループでぐぐるのだ。
すみません。C++/CLIです。 メッセージループぐぐってみましたが、よくわかりませんでした。 どのように改変すればfor文に入る前に処理できるでしょうか;
Labelを書き換えても直ぐには描画されない。その関数を抜けてメッセージプールを回さないと画面更新はされない。 C++BuilderだったらApplication.ProcessMessagesを使うとメッセージループが回って画面更新されるんだけど、C++/CLIはしらね。 他には、タイマーイベントや、アイドルイベント、マルチスレッドとか方法がある。
>>795 タイマーもWM_TIMERだったり、アイドルイベントもWM_KICKIDLEだったり
すると、メッセージ通知の1つだから、メッセージループを廻さないと
更新されない。
説明不足だったかな、それらのメッセージでforを分割して実行して適度にメッセージが回るようにすればいい。
まぁ、まずはイベントドリブンでぐぐれってこった。
>780 このデストラクタの定義だとコピーコンストラクタ定義するか複製できないようにしとかないとまずくね? が、まぁコピーの方針自体に色々あるというのはその通り。 例外についてはどこで catch するか、ではなくて例外が送出された段階で状態が変わってしまう可能性があるのが あんまりよろしくないという意味。 CreateMultipleCString() 中の new で例外が送出された場合、CMyClass の中身がクリアされてしまう場合がある。 ということで良くある手法としては一時オブジェクトを作成し必要な処理を行った後、nothrow 保証のある swap() で 内容を交換する、というのがある。 まぁこれも強い例外保証なんかいらない、という選択肢はあるかもしれない。
>>780 何も変わらないと思っているのにわざわざ自分でコード書く意味がわからんな。
しかも作者次第の部分で大量に解説が必要なやつを。
801 :
デフォルトの名無しさん :2008/11/02(日) 21:21:04
std::vector<自作のクラス>をソートできるようにするには、operator<()を定義しておけばよいですか?
それでもboost・・・boostなら・・・・・
>>788 ようするに、メッセージループを回すにはその関数button1_Clickから抜ければいい。
すると、button1_Clickを呼んだ誰か(それこそがメッセージループ)が
今度はラベルやプログレスバーを書き換える関数を呼び出す。
チョー手抜きで手っ取り早くやるには、Application::DoEventsを呼ぶこと。
>>795 の言っているApplication.ProcessMessagesに相当する。
>>801 そう。
定義しなくても sort に比較関数オブジェクトを渡せばよろしい
805 :
デフォルトの名無しさん :2008/11/02(日) 22:28:46
>>804 ありがとうございます。
ソートしたあとの検索でlower_bound()を使ったところ、一致する要素がない場合に
一致していない(微妙に似ている)要素が検索されてしまうのですが、find()で検索するべきでしょうか?
それはどういうデータ構造でどんな要素を探したいかに依るだろ
>>805 lower_boundは名前通りの仕事をしているだけだ。
808 :
デフォルトの名無しさん :2008/11/03(月) 00:49:32
>>807 もしかして、というのは完全に一致する要素がない場合、大小関係が一番近い要素を
返すんですか?
STL標準講座 では一致する要素があるかどうかをイテレータがvector.end()と一致するかどうかで
判断いたのですが。
lower_bound()は、指定した値"以上"の要素が最初に現れる位置を返します。
標準の関数の機能なんて、検索すればすぐわかるだろ・・・ そういうことを訊ねるのにスレ使わないで欲しいが。
811 :
デフォルトの名無しさん :2008/11/03(月) 03:02:15
>>810 すいません。
でもソート済みのベクタからある要素を検索するときにはlower_bound()を使うものだと思ってたので、
見つからなかった時にはvector.end()が返るものだと完全に誤解してました。
本もそう書いてあったし。折角ベクタはソート済みなのですが、
find()でやることにしました。
ありがとうございました。
>>811 lower_bound() してからもう一回比較かけるだけでいいのに。
関数、変数の名前の規則ありますか? たとえば *pValu ポインタはpを付ける vector<????> v○○○ vを付ける bool is○○○ isを付ける
>>813 あるところにはある。ない場合は、好きにすればいい。
必要なら、規約スレ、命名スレへどうぞ。
基本情報技術者試験の過去問を読み始めたのですが 断片的なプログラムしか書いてないせいか よくわからないところがあります。 #include <stdio.h> void go(void) int main(void){ int x; if( x%2 == 0 ) go(); } おおざっぱに書くとこのような記述が見られます。 なんとなくxの初期値を0と考えて読むとつじつまが合いません。 だからプログラム全体の調和が取れるような適切な値を予想して 自分で1とか2とか想像しなければならないのかなと思うのですが合ってますか? やはり初期値は0と考えるべきでしょうか?
そのプログラムはコンパイルできない。それはおいておいても、 x の値は不定。 プログラムとしては何が起こるか予想できない。 絶対にどこか勘違いか見落としをしている。
817 :
815 :2008/11/03(月) 11:40:30
すいません。間違えました。 #include <stdio.h> void go(void) int x; int main(void){ if( x%2 == 0 ) go(); } こういう形です。 グローバル引数とでも言うんでしょうかね。
大域変数は0で初期化される。 局所変数は初期化されない。
820 :
815 :2008/11/03(月) 11:43:26
また間違えました。問題文にmain関数がありません。 #include <stdio.h> void go(void) int x; int check(void){ if( x%2 == 0 ) go(); } こういう形です。 main関数が明示されていません。
821 :
815 :2008/11/03(月) 11:46:21
>>818-819 ということは、この文で言うとxの初期値は0ということでいいんですか?
main関数が何してるかわからないから、結局わからないんじゃないかと
今になって気づいたのですが。
822 :
815 :2008/11/03(月) 11:53:35
間違え続けてすみません。こんどはたぶん合ってます。 #include <stdio.h> void check(void) void go(void) int x; void check(void){ if( x%2 == 0 ) go(); } やっぱりmain関数が明示されてないから、 どうなってるのかわからないから想像しなきゃならないということのようですね。 自分で勝手にスッキリしました。失礼しました。
問題文も一緒に書けばいいのに
なんでそこまで間違えるのかよく考えたほうがいい。 普通に考えておかしい。
mainがあるない以前に、なぜテキストのコードを丸写しすらできないのかが不思議だ。 みたところまだ丸写しすらできていない様子。そんなコードがまともなテキストに書かれているはずがない。
てか理解できるレベルでもないのに勝手な解釈でコードを省略してるから まともに話ができない。
よくわかってないままスッキリしてるみたいだけど まぁいいか
理解できないのにすっきりしたってのは、単なるオナニーだよね。 相手があるのにその状況だったら、失礼無礼を通り越してしまうじゃないか。
829 :
デフォルトの名無しさん :2008/11/03(月) 17:23:03
お願いします。入門書で読んだとおりに CodeGearのホームページで登録フォームに記入して、メールでパスワードをもらって、 C++ Compiler 5.5/Turbo Debuggerのダウンロードボタンをクリックしたが、 「Internet Explorer ではこのページは表示できません」と表示されます。 「上記のダウンロードサイトにアクセスできないときは、CodeCentral のダウンロードページをお試しください。 CodeCentralのダウンロードページを利用するには、CDNへのログインが必要です。」とあるから「CDNへのログイン」 をクリックしたら Your LoginとPasswordの二つの記入項目があります。Your Loginとは何でしょうか。 passwordはメールで貰ったものでしょうか。 (OSはウィンドウズ・ビスタです。)
もうBolandに電話して聞いたほうが早くないか?
>>829 C/C++ の相談ですらないな。
ちゃんと貰ったメールの内容は読んだのか?
構造体のメンバと配列を宣言時以外でまとめて更新って出来ませんか? 構造体(もしくは配列) = {値1,値2,,,}; とやると宣言時以外だとエラーが出てしまうんですが、、、
floatの配列をintの配列をとる関数に渡すにわどうすればいいの?
operator int()
オブジェクトとは何ですか?
色即是空
enum の値を | して渡そうとするとintに変換できないの言われるです。
>>842 列挙値をビット OR してどういう意味になるのかコンパイラには想像も付かんから、当然だろ。
糞かなぁ。 そもそもenumの値を論理演算とか。 列挙の意味を分かってないんじゃ(笑)
まあでも気持ちは分かるし、Flagsを導入できたC#はその点少しうらやましい。
仕様の限界を探るより、安定してシンプルな記法を心がけるべきなんだけど、 今の言語教育ってそういう方向を向いてないんだよね。挙げ句つまらないbugブラマが量産されると…
>>842 int three = ONE | TWO;であれば問題なくコンパイル通ると思うが。
実装依存
int型への暗黙キャストだから大丈夫だろ?
enumの意味無いけどね
CString str; if(str == ("ヒマワリ" || "ピーナッツ"){ TRACE(_T("当たり"); } これで当たりがでません。どうすればいいんですか?
>>854 if(str==_T("ヒマワリ")||str==_T("ピーナッツ")){
こういうことか?
なんだ糞仕様か
>>856 できたありがとう。||じゃなくて&&だった
・・・
いろいろと突っ込みどころがあるがスルーしておこう。
861 :
661 :2008/11/04(火) 14:22:43
無限大を代入したい時ってどうやるんですか? double d1 = INF, d2 = -INF; とやると、普通に1が代入されるんですが… だからってd = -log(0)とかやるのもどうかと思って…
#include <math.h> d1 = HUGE_VAL; d2 = -HUGE_VAL;
C++なら #include <limits> d1 = numeric_limits<double>::inifinity(); d2 = -d1;
864 :
861 :2008/11/04(火) 16:48:12
ありがとうございます!!
865 :
デフォルトの名無しさん :2008/11/04(火) 21:21:10
ユーザ関数とクラスって同じですか?
違います。では次の方どうぞ。
#include <stdio.h> main() { int i, j; for (i = 1; i <= 50; i++){ for (j = 2; j <= i - 1; j++) { if (i % j == 0){ break; } } if (i == j){ printf("%d ", i); } } printf("\n"); return(0); } これをforじゃなくてwhile文を使って作りたいんですが、どうすればいいのか教えてくらさい
forは第二項にある条件式の真偽によってループするか否か決めてる。この場合だとi<=50とかj<=i-1とか。 iとかjの初期化 while(条件式){ iとかjのインクリメント } みたいな。
___ ━┓ / ―\ ┏┛ /ノ (●)\ ・ . | (●) ⌒)\ . | (__ノ ̄ | \ / \ _ノ /´ `\ | | | | ___ ━┓ / ― \ ┏┛ / (●) \ヽ ・ / (⌒ (●) / /  ̄ヽ__) / . /´ ___/ | \ | |
870 :
867 :2008/11/04(火) 22:55:26
処理速度を上げるには何を優先すればいいんですか? 関数の繰り返しは使わず、変数に結果を入れて変数で処理したほうがいいのか 出来る限り関数はinlineにする。=完成したら、全コードを一つの関数にまとめたほうがいいのか レジスタは自動にまかせず、手動で使いこなさなければいけないのか これはあってますか?この他に、なにかありますか?
複雑なポインタ操作は使わない。メモリのアクセスを減らす。キャッシュメモリを有効活用する。 分岐をなくす。forは一部展開する。 プログラムはコンパクトにする。アルゴリズムを検討する。 無駄なコピーを無くす デバッガの逆アセンブラでコンパイラの吐くコードを確認する
>関数の繰り返しは使わず、変数に結果を入れて変数で処理したほうがいいのか >出来る限り関数はinlineにする。=完成したら、全コードを一つの関数にまとめたほうがいいのか >レジスタは自動にまかせず、手動で使いこなさなければいけないのか >分岐をなくす。forは一部展開する。 コンパイラに任せる。 >デバッガの逆アセンブラでコンパイラの吐くコードを確認する コンパイラの出力で充分。 要は、コンパイラを使いこなすだけでかなりのことはできる。
>>871 - 良いアルゴリズムを使うこと(=実行時間オーダを減らすこと)
- 実行のボトルネックとなる部分をプロファイルなどの手段で見つけて、そこを高速化すること
(それ以外の部分を変えても全体の高速化には寄与しない)
あと、あなたが言っているような小手先のコード改変ではまず速くならないよ
無闇にinline化したらキャッシュヒット率が落ちて逆に遅くなるし
速度を気にするのは書き始める前(アルゴリズムの選定)と 完成した後(最適化)だけでいい。
超初心者的な質問なんですが、 C++にもマイクロソフトのVCとか、何個かあるみたいですが C++を学びたいと思ったらVCから始めてもいいのでしょうか? VCと他のC++は何が違うのかがわかりません。。
>>876 でもC++/CLIには手を出さないようにな。
>>876 C++は言語の名前、VCは開発ソフトの名前。
自分でよければVCから始めることを禁止してもいいけど 禁止されていればいけないということになるだろ 楽チン
C++を始めて、DQ1風の戦闘プログラムを書こうと思ったのですが、 途中で行き詰ってしまいました。 キャラクタのクラスを作成し、パラメータを設定したインスタンスを2つ作って ダメージのやりとりをするというつもりなのですが、 インスタンス間のダメージのやりとりがどうしても上手く出来ません。 解法は無数にあるのだと思いますが、一例やヒントだけでも 教えて頂けるとありがたいです。
>>882 メッセージキューでも作ればイイジャン。
stdafx.hに関数を書いて使うと↓のエラーが出るです。 error LNK2005: hogefunc は既に project.obj で定義されています。 inlineにすると消えるです。でもインラインにしたくないです。
staticにする
できたです。
class Object{ private: int value; public: Object() : value(5){}; //この行 }; コメントが付いてる部分の書き方を知らなかったので調べたいのですが、どう検索すればいいかが分かりません。 名前があれば教えてください。
コンストラクタ初期化子
コンストラクタ初期化子
コロン
カラン
mapをbeginからendまで進めると 順番がおかしくなるのはどうして deleted 31 deleted 30 deleted 3 deleted 29 deleted 28 deleted 27 deleted 26 deleted 25 deleted 24 deleted 23 deleted 22 deleted 21 deleted 20 deleted 2 deleted 19 deleted 18 deleted 17 deleted 16 deleted 15 deleted 14 deleted 13 deleted 12 deleted 11 deleted 10 deleted 1 deleted 0
deleted 6 deleted 59 deleted 58 deleted 57 deleted 56 deleted 55 deleted 54 deleted 53 deleted 52 deleted 51 deleted 50 deleted 5 deleted 49 deleted 48 deleted 47 deleted 46 deleted 45 deleted 44 deleted 43 deleted 42 deleted 41 deleted 40 deleted 4 deleted 39 deleted 38 deleted 37 deleted 36 deleted 35 deleted 34 deleted 33 deleted 32
deleted 9 deleted 8 deleted 7 deleted 63 deleted 62 deleted 61 deleted 60
deleted 6 deleted 59 deleted 58 deleted 57 deleted 56 deleted 55 deleted 54 deleted 53 deleted 52 deleted 51 deleted 50 deleted 5 deleted 49 deleted 48 deleted 47 deleted 46 deleted 45 deleted 44 deleted 43 deleted 42 deleted 41 deleted 40 deleted 4 deleted 39 deleted 38 deleted 37 deleted 36 deleted 35 deleted 34 deleted 33 deleted 32
deletedって一体何を行っているの? 一応mapのイテレータは順序もきちんとソートされてるはずだけど。
あらしかと思った それを貼って誰かが理解してくれると思ったのか?
deleted 31 deleted 30 deleted 3 deleted 29 deleted 28 deleted 27 deleted 26 deleted 25 deleted 24 deleted 23 deleted 22 deleted 21 deleted 20 deleted 2 deleted 19 deleted 18 deleted 17 deleted 16 deleted 15 deleted 14 deleted 13 deleted 12 deleted 11 deleted 10 deleted 1 deleted 0
deleted 9 deleted 8 deleted 7 deleted 63 deleted 62 deleted 61 deleted 60
「キーが文字列」とエスパー。
うむ。それだとレスの順序を適当に入れ替えれば綺麗に並んでるね。
キーはその番号の文字列だな
>>896 > 順番がおかしくなるのはどうして
「おかしくなる」とか「うまくいかない」ってのは、自分の中に「こうであるはず」という基準・狙いがあって、
それと現実が違ってる、という報告だよね。
そういう書き込みは、自分の基準・狙いと、具体的に何をしたのかを書かなきゃ、情報的に意味が無いよ。
>>904 がエスパーしたように、文字列のソート結果として見ると「順番はおかしくない」わけだし。
ちょっとキツイけど、お子様とか低学歴の話し方なんだよね、これ。
いま持っている自分の基準というものが、たくさんある中から個人的な要因で「選んだもの」であり、
言わなきゃ他人には確信できないものだ、ってことに無自覚な話し方。
言い換えれば、「自分の為に世界が創られたわけではないことを、まだちゃんと理解できてない」
レベルの精神から出てくる物言い。こういうのは早く卒業すべき。プログラミングスキル以前の問題だから。
初心者を装った新手の荒らしだろう 監視が厳しいから善意を装うわけ 最近増えてきたよね
909 :
デフォルトの名無しさん :2008/11/07(金) 01:46:56
なに急に発狂してんの?
取り敢えず、>907>908が読めてそれが耳に痛い程度には大人だったってことだろ。
言語そのものの初心者は歓迎するんだけどな〜・・・
>>912 プログラミング言語の初心者なら歓迎だが
自然言語の初心者はちと困る。
sizeof(構造体 FAR) のFARってなんですか?
WindowsだったらFARポインタ 昔の遺物だからそのソースは捨てとけ
MS Visual C++ 2008 Express Edition で初歩的なCプログラムを作り、 プロジェクトのプロパティでランタイムライブラリを「マルチスレッド (/MT)」としました。 文字セットも「マルチバイト文字」にしてUnicode不使用にしていますが Win98SEで起動できません。Win9x で起動できる設定は無いのでしょうか? VC6を中古で買うしかないのですか? あと、もう一つはC++/CLIのサンプルコードを入力し、こちらはランタイムライブラリを 「マルチスレッド DLL (/MD)」にして、Frameworkは2.0にしました。 ReleaseビルドしたEXEファイルを.NET Framework 2.0インスコ済みのPCに 持って行きましたが、こちらも起動せずです。。。 他にプロジェクトプロパティでいらうとこがあるのでしょうか?
>>916 2005EEをダウンロードしてやってみては
>>915 thx!.検索できないし、20年前の入門書にも載ってなかった。どんだけ昔のだよw
20年前なら普通にあっただろ、どこの入門書だよw
見つからないキーワードを探すのに疲れた。 たぶんgoogleを知らなかったんじゃないかな。
>>896 正しく並んでいるじゃないか。どこもおかしくない。
>>922 C++/CLI プログラムをWinXP SP2 .NET Framework2.0 SP1 環境に
移動して実行した場合は
「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。
このアプリケーションを再度インストールすることにより問題が解決する場合があります」
もちろんビルドはRelease、Frameworkも2.0を選んで行っています。
C言語でつくった小さいコンソールアプリをWin98SEへ移動して実行した場合、
「ファイルには新しいバージョンのWindowsが必要です。Windowsをアップグレードしてください」
「システムに装着されたデバイスは動作していません」
こちらはWinXPであれば別の環境でも動作します。
文字セットは「マルチ バイト文字セットを使用する」を選んでReleaseビルドしました。
スタンダード以上だとディストリビュートウィザードみたいなのが付いてくるんでしょうね・・・
>>925 ありがとうございます。
前者は「Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)」をインスコすることで
動作するようになりました。
しかし、Frameworkだけではダメって。。。これってC++/CLIだけですよね?
VBもC#も.net Frameworkだけで動くのにこれでは互換性が低すぎやしませんか?
C++専用のライブラリがあるのでしょうけど、出来ることに大差はないですよね!?
後者については分かりました。
Win9x系で動かしたければ古いコンパイラでビルドするしかなさそうですね。
>>926 もちろん、MSだって何もしていないわけではなく、
.NET Framework 2.0(SPなし)には、当時最新だった
VC++ 2005(これまたSPなし)のランタイムが付いていた。
.NET 2.0 SP1にVC++ランタイムが入っているかは知らないが、
当時VC++ 2008にSP1は出ていなかったのでやっぱり無理だな。
ちなみに、/clr:safeでビルドすれば、VC++ランタイムを使わない
C#やVB.NETと同等のプログラムにできる。
>>927 なるほど。つまり.NET Frameworkの次バージョンではVC++2008CRTが
同梱される可能性が高いってことなのですかね。
> /clr:safeでビルドすれば、VC++ランタイムを使わない
確かに出来ました。でも当然使えないクラスや関数が出てくるんでしょうね?
例えば、printfとかcoutとか使えない。 ヘッダだけで完結するものは使えるだろうが、 そもそも/clr:safeだとマネージコードしか使えないので、それすらもかなり駄目だろう。 マクロやtypedefくらいだろうな。
C++/CLIで作ったアプリにドットネット以外の別途ランタイムが必要だなんて知らなかった C++で作った物には不要だよね?
C++は静的リンク出来るから不要ですね。 私もC++/CLIはマネージコードのみだと思っていたので .NET Frameworkだけで動くとばかり思ってました。 C++らしさを残してコーディングしたければ、やはりCRTを 入れろということなんですね。
(DLL版ランタイムを使うなら)もちろん必要。 それ自体は昔からだったが、 ・32ビット版はVC6までファイルが共通で、しかも核となるファイルはWin98辺りからOS付属(msvcrt.dll/mfc42.dll) ・そうでなくてもEXEと同じフォルダに置いておくだけで問題ない(VC8からそれがやや面倒になった) ・みんながSystem32に放り込んでいた大らかな時代だった というわけで意識する必要がなかった。
>>931 /clr:safeにすればC#やVBと同等のCRTを使わないアセンブリができる。
pureとmixedの場合はCRTが必要。
ただし.NET Framework自信がCRTを使っているからそのCRTとバージョンがあえばそれが使える。
>>932 > ・そうでなくてもEXEと同じフォルダに置いておくだけで問題ない(VC8からそれがやや面倒になった)
これってVC2005以降は出来なくなったの?
>>926 VB6以前はバージョンごとにせっせとランタイムを入れさせられたんだけどね。
セットアップファイルつくって必須コンポーネントに指定しておくのが楽かもね。
>>934 systemフォルダのDLLが優先されるようになったと思うよ。
たぶん怪しげなアプリとかがwinsockとかuser32とかのラッパーdll配置してるとセキュリティ的によくないからなんだろうけど。
DLLのロード順序 0. .local ファイルによるサイドバイサイド (Win2KとXPのみ) 1. KnownDlls とそれから間接的に使用されるDLL 2. マニフェストによるサイドバイサイド (XP以降) 3. アプリケーションの exe ファイルが存在するディレクトリ 4. システムディレクトリ 5. 16-bit システムディレクトリ 6. Windows ディレクトリ 7. カレントディレクトリ 8. 環境変数 PATH に設定されてたディレクトリ (古いWindowsではカレントディレクトリの優先順位はexeのディレクトリの次だった)
vc2005以降のCRT/MFC/.ATLのDLLに関しては
マニフェストが使用できるXP以降ではマニフェストによるものだけに制限している。
vc2005以降でも普通に作ったDLLやXPより前のOSの場合は
>>937 のとおり。
なお.NETのアセンブリの場合は全く違うルールとなる。
Windows以外のことが全く書かれていないのがナンセンスだな。
語弊があるようなとこが多い気はするかなぁ
943 :
939 :2008/11/08(土) 10:57:04
>>940 Windows以外はDOSしか知らないからな・・・
UNIX系でも依存ファイルとかあるのかな?
>>943 正確な用語としての「依存ファイル」て何を指すのか良く分かんないけど、
実行時に動的にリンクされるライブラリって意味なら
共有ライブラリ(shared library。拡張子「.so」)ってのが有って、
静的ライブラリ(static link library。拡張子「.a」)と区別されてる。
でもUnix系の世界では、依存ファイルって言葉は聞かないかなぁ。
「ランタイムライブラリ」という項目が既にあるからそっちに書けばいいと思うよ。 「依存ファイル」じゃ意味が広すぎて何の事か分からない。
libpngのmakeにはzlibが必要とかそういう依存関係はどうなの
ランタイムライブラリも依存ファイル ビルド時に必要なヘッダ類も依存ファイル HTMLから参照される画像ファイルも依存ファイル こっそり保管しているお宝動画も依存ファイル
依存ファイルと言って先ず思い浮かぶのは Makefile で : の右側に書くファイルのことだな。
本体の実行ファイルが使ってるライブラリの意味での「依存ファイル」って 単に「依存関係にあるファイル」のことで術語でもなんでもないよ。
「依存ファイル」の項は>948-949のような内容に留めて、 それぞれ関連項目を参照すればいいのではないかと。
>プログラミング用語で ではなくもっと狭義である旨を書いておけばいいですかね
953 :
デフォルトの名無しさん :2008/11/08(土) 17:52:48
libc hell
954 :
デフォルトの名無しさん :2008/11/08(土) 18:26:39
*.so hell LD_PRELOAD hell
955 :
デフォルトの名無しさん :2008/11/08(土) 20:57:29
glibc更新したらlinuxが起動しなくなったでござる。 の巻
distro と glibc のバージョンをkwsk
957 :
デフォルトの名無しさん :2008/11/08(土) 23:18:28
C++使ったらオブジェクト指向で分かりやすくなると思ったら間違いなんだよC++で分かりやすいソースが書けるやつはCでも分かりやすいプログラムが書ける表面的なことばかり追求する姿勢を改め機械語からやり直すことが近道だ
機械語とか中途半端なんだよ、アセンブリか、回路そのものにしろ
アセンブラやるのと分かりやすいソースは関係ないんじゃね?
分かりやすいかどうかは、絵や音楽や異性の好みと同じで、 人によって基準が異なる。芸術の域。
961 :
デフォルトの名無しさん :2008/11/09(日) 00:15:14
std::mapに登録した順番を調べる方法は無い?
次世路
963 :
デフォルトの名無しさん :2008/11/09(日) 00:38:13
insertに成功したら戻り値のiteratorをlistか何かに入れていく。 しかしそもそも登録順を知る意味が分からない。
オーバーライドとは、完全に関数の中身を書き換えるんですか?それとも元のクラスに追加する形になるんですか? クラス1の継承クラス2でVirtualでオーバーライドした関数をクラス2継承クラス3でオーバーライドするにはどう書けばいいんですか? クラス3でVirtualを書けばクラス2とクラス1を無視してクラス1の関数をオーバーライドできるんですか?
Q: 本も読まずソースも書かないままC++を理解するにはどうすればいいですか? A: 才能ある人間として生まれ変わることを期待して首を吊りましょう。
オーバーライドは基本クラスでVirtual宣言してあるものしか派生クラスでオーバーライドできないの? 派生クラスでVirtualでオーバーライドできると思ってるところでおかしくなってるのかもしれなんだけどおしえてくれーーーー
コードも出さずにわかるわけないだろ
971 :
デフォルトの名無しさん :2008/11/09(日) 11:01:23
static wchar_t* mtow(const char* buf) { int wlen; wchar_t* wbuf; wlen = MultiByteToWideChar(CP_ACP, 0, buf, -1, NULL, 0); wbuf = (wchar_t *)LocalAlloc(LPTR, (wlen+1)*sizeof(wchar_t) ); if( wbuf==NULL ) { return NULL; } MultiByteToWideChar(CP_ACP, 0, buf, -1, wbuf, wlen+1); *(wbuf + wlen) = L'\0'; return wbuf; } 上はマルチ文字をワイド文字に変化する関数、ネットで見つけた LocalAllocでメモリを確保しているが解放してない staticを付ければメモリ解放しなくていいの? あと、何度もこの関数を呼ぶとLocalAllocでメモリ確保され直すのでは?
関数にstaticがついていても、解放する必要があります。 LocalFreeを呼ぶのは、呼び出し側の責任で行ってください。
>>971 解放したら返り値が使えなくなっちゃうだろ。
mtow の返り値を自分で保持して、使わなくなったら自分で解放しなければならない。
把握した こういう関数は解放忘れそうだな
>>974 生のポインタでやりとりせず、スマートポインタを使用すればいい。
そろそろ次スレの季節
>>975 すみ(い)ません、それどうやってやるんですか?
スマポはポインタの解放をラップするテク。結構面白いし簡単だからググッて作ってみては?
>>971 のLocalAllocはmallocじゃ駄目なんですか?
あと、何でstatic関数なんですか?
>>979 ・LocalAlloc()よりmalloc()の方が、汎用性において勝っている。
・どうしても外に公開したい関数以外は、staticにしておいた方がいい。
>>977 え、すみませんとすいませんのどっちを使ったらいいか分からないって事?
>>980 ありがとうございました。
この場合は、メモリ開放を考慮して外部ファイルよりアクセス禁止かな
pCtrl->data() ? &Btn : &bar この?:ってなに?どこかで見たようなきがするんだけどなんだっけ
いや条件演算子という言葉を忘れないでください。
いや普通に使うけど
スマタかとオモタ
991 :
デフォルトの名無しさん :2008/11/10(月) 22:20:49
環境: OpenBSD4.2 GCC3.3.5
プログラム:
http://www.sbcr.jp/books/download/art.asp?newsid=2267 ディレクトリ: /SampleSource/Bison-Flex/CALC/discreate-parser/
書籍のサンプルプログラムをMakeしようとしたところ、
オブジェクトファイルをリンクして実行ファイルを作るステップで以下のようなエラーが出ます。
/usr/lib/libstdc++.so.44.0: undefined reference to 'log'
(以下、'log' の箇所が sqrt, cosh, finitef, cos, tanh, sin, atan2, pow, sinh, log10, exp, tan になっている行がずらずら)
collect2: ld returned 1 exit status
*** Error code 1
おそらく math.h の関数の実体が見つからないというエラーだと思うのですが
libstdc++にそれが入ってないということが有り得るのか、ちょっと分りません。
また、Makefileを書き換えて他のオブジェクトファイルとリンクすれば急場はしのげるかもしれませんが
Makefileを書き換えるにしても、使えそうなオブジェクトファイルに心当たりがないのでお手上げの状態です。
どなたか解決できる方がいたらお願いします。
すまぽ
>>991 math.hの実体はlibstdc++じゃなくて普通libmにあるよ。
cc -lm my.c
とかが一般的な書き方。
cc my.c -lm じゃないとマズいか。
>>994 Makefileの最後の処理の末尾に -lm を付け加えたら無事コンパイルできました。
ありがとうございました。
星野
& ~ ってどういう意味ですか?
C言語 演算子 でぐぐると、お前ら自重しろ、ってくらいたくさん 説明してるページが見つかるよ。
/ _ , 、-、_ _ \ / , ‐´ " γ'´ `ヽ, \ / / Λ _,、 ゙~ヽ ヽ. / , ' ; ,i! i;;;;_v';_| l `ヽ. i / / / ; / ! :i'| | i | !i ゙j | ヽ_,,ノ; !: l/| |, Li ! i i! l,| .:| :| | ´フ:: |: |: i'"|_i_,! |_! |_i' /、! ::! .:;| ! /;: |::. l;__! __,,,,_ ` | .::/ ::|;レ'" !:: {:_j. ''" ` ‐'''‐、,`"''! .:ノ.;ゝ レ'"l| | , ` ./__/´.::l / l.| | ,,,, __ / !ヾ;ノヽ, / /i´ ̄|、 l ;゙ /|_| i ; また会おうね〜♪ ,!.へi |:. |'゙ヽ、 ゛- ' ._,イ/| i |.へi !.へ.! l:: │_l゙丶、 __ ,, ‐'l " | :| i,へ.! !:: l´l'丿 lヾヽi ::| _,, -‐ '´|:: | l´ ソ | ::|'' ‐- 、_ /ヽ. |::: │ヽ ./ ! .:::! /\
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。