スレを勃てるまでもないC/C++の質問はここで 4
1608年5月11日に3なのに『2get』と書いてしまい、 『500年ROMってろ!!』 と言われた者です。 あれから500年、ひたすらROMに徹してきました。 来る日も、来る日も。 そして今、 やっと念願叶って書き込みをしようとした矢先に、 2をget出来るだなんて……… 感動で……胸が一杯です。 人間、辛抱すれば良いことって有るんですね! こんな僕ですが、 僭越ながらとらせて貰います…! 2get!
500年経ってねーよ
1999年に「2GET」といって3をとってしまった時に、『10年ROMれ』といわれて私はずっとROMってきました!今ここに宣言します。【4GET!】
10年経ってねーよ
圧縮、解凍プログラムを作ってみたいんですけど、 fopenでバイナリ読み込んで それを並び替えればいいだけですか?
全然違います
>>6 並び替えただけじゃ圧縮になってないし、元にも戻せませんがな。
しかもC/C++の問題じゃないし。
ありがとうございました。
rubyとかにあるnil見たいな未定義値を実装するにはどうすればいいの?
ポインタの類(shared_ptrなど含む)なら0(ヌルポインタ) 参照型ならポインタを使うように書き換えて↑ それ以外はboost::optional
firefoxのプラグインの作り方教えてお
C言語の変数型のdoubleは有効数字15だか16桁とのことですが、 0.0000000000000000000000000000123 とかの極小数も1.23×10の-何乗みたいに、ちゃんと入るんでしょうか。 それとも小数点下の十何桁までしか覚えられない?
14 :
デフォルトの名無しさん :2008/09/25(木) 12:31:13
ちゃんと入る
ありがとうございます。
キャストについての質問です
printf("%d",(int)(2.014*1000));
結果
>>2013 上記のように
2.014 * 1000 をint型でキャストすると
2013になってしまいます。
2.013 * 1000 はちゃんと2013なのにー
何か綺麗な解決方法あるでしょうか。おねがいします
環境はGCCです。
ない
>>16 整数になるはずなら、四捨五入でもすれば。
正の領域なら、int(2.014 * 1000 + .5)でOK。
19 :
デフォルトの名無しさん :2008/09/30(火) 15:59:16
勃起するまでもないC/C++かとおもた
ソースファイルの管理なんですが func1、func2、func3という基底クラスがあって それらを継承して SubA_func1、2、3・・・ SubB_func1、2、3・・・ SubC_func1、2、3・・・ というクラス群があるとき base、SubA、SubB、SubCとファイル分けするか func1、func2、func3と分けるのか どちらがよいでしょうか?
なんかそれ設計ミスってないか?
22 :
デフォルトの名無しさん :2008/10/01(水) 20:36:02
すみません ビルドできないんですがどうすればいいのでしょうか? 応答なしになってしまいます・・・
23 :
デフォルトの名無しさん :2008/10/01(水) 21:00:18
パソコンを買い換えるのが、一番確実な解決法じゃないかな
char*をwchar_t*にしたいんだが、mbstowcs()つかても変換後の日本語部分がデバッガで見ても正しくないんだが、これはどういうことなんだろうか。 それか別の変換方法ってある? 元々はVC9でfstreamのパスに日本語があると開けないやつの対策用に変換がしたいわけで・・・
>>24 setlocaleしないとまともに動かないぞ。
26 :
24 :2008/10/01(水) 22:39:41
なるほどそれってmbstowcs()の第4引数を使っても結果はsetlocaleと同等?
例えば、クラスAに要素a、bがあるとして派生クラスBの配列要素c[i][j]の各要素ににそれぞれ違うクラスAの要素a、bを入れるようなことはできますか? 例の補足としては、c[0][0]にはa=1、b=2 c[0][1]にはa=5、b=3が入っているとしたら c[0][3]=c[0][0]+c[0][1]の計算した場合 c[0][3]はa=6、b=5になるようなことです
頭痛くなってきた・・・
行列計算をしたいってことか? 根本的にやり方を変えないと出来ないんじゃないか?
つか行列ならclass Bを配列にするんじゃなくてclass Bの中にclass Aの配列を取り込むべきなんじゃないかね 外部からの入力をメンバ関数で受け取って同じ関数内で再計算までやってしまえばいいんじゃないかね もう解決してそうな気もするけどな・・・
[質問]インスタンスを配列とした場合、コンストラクタへ引数を与える方法がわからない。 class Huga { public: Huga( int i = 0 ){ printf("%d\n", i); } ~Huga(){} }; int _tmain(int argc, _TCHAR* argv[]) { //Huga *huga = new Huga(5); みたいな感じにしたい Huga *huga = new Huga[10]; // ここでコンストラクタへ引数を渡したい。 delete[] huga; return 0; } なにかよい知恵があればお授けください。
>>31 仕様上無理です。
後からsetter()でもループして回しましょう。
33 :
31 :2008/10/04(土) 01:20:42
>>32 さっそくのレスありがとうございます。
了解しました。
おとなしく、他の方法を考えます。
34 :
デフォルトの名無しさん :2008/10/04(土) 20:27:50
答えは5のようですが、なぜそうなるのかわかりません。 どなたか流れを教えてください。よろしくお願いします。 #include int sub(int *x, int *y) { (*x)++; (*y)++; return *x + *y; } main() { int a = 0, b = 0; b = sub(&a, &a); printf(“%d %d\n”, a, b); } (1) 0 2 (2) 0 3 (3) 1 3 (4) 2 3 (5) 2 4
>>34 これでOK?
int sub(int 0, int 0) {
0++; => 1
1++; => 2
return 2+2; => 4
}
36 :
デフォルトの名無しさん :2008/10/04(土) 21:46:29
>>35 ご回答ありがとうございます。
1++; => 2 ←なぜここで1++になるのですか?*y=0ではないのですか?
return 2+2; => 4 ←これも、なぜ*x=2になるのですか?1ではないのですか?
よくわかりません。お手数ですが、お教え願います。
>>35 長くてごめん。
>b = sub(&a, &a);
となってるからとしか言えないんだけど。
重要なのは0という数値じゃなくて0が入ったaのアドレスが渡されてるってこと。
xもyも指してる実体は同じaだから、xへの操作はyへの操作と同じだし同様にyへの操作もxへの操作となる。
だから実際は以下と同じようになってるってわけ。
int sub(int *x) {
(*x)++;
(*x)++;
return *x + *x;
}
>>37 理解できました。ありがとうございました。
Cのプリプロセッサで #if sizeof(time_t) == 8 /* time_t が 64 bit のときの処理 */ #else /* time_t が 32 bit のときの処理 */ #endif みたいな書き方ってできなかったっけ?
実務で、構造体、共用体はどう使われているのですか
>>40 自分の場合、、、。
構造体を使わなかった場合は、
関数への引数が多くなってしまったり、
関数の戻り値を1つの型ですませることができなくなったりして
不便です。
なので、関数の引数や戻り値で大活躍です。
その他、いろいろ使っています。
共用体は自分の場合はあまり使わないです。
BYTE(unsigned char)型みたいに1byte単位での
入出力が必要な場合に、ある程度決まった型に変換が必要な
場合とかには使う場合があります。
と実務経験があまりない自分が言ってみるテスト。
>>42 じゃあ
>>39 みたいなことしたい場合は、autoconfとかを使って、
コンパイル前にあらかじめsizeof(time_t) を調べておく必要があるってことですね。
うーん、今作ってるのは小さいプログラムだからあんまり大げさなことはしたくないなあ。
なんかいい方法があれば教えてください。
>>43 プリプロセッサとsizeofとどっちの処理が先か考えりゃわかるべ。
>>43 time_tが64bitの環境はまだ少ないんだし、その環境向けのifdef (OSと
かCPUとか)で分ければいいでない?
if (sizeof(time_t) == 8) { } else { } じゃだめなのか? #include <limits.h> #if SIZE_MAX == 4294967295 #else #endif とか
そこでtmpですね
48 :
デフォルトの名無しさん :2008/10/12(日) 14:55:45
あるローカル関数A内で グローバルのポインタ変数にmallocし、領域を確保。 その後、他のローカル関数B内で、関数A内で確保した領域を使うことって 出来ましたっけ?
49 :
48 補足説明 :2008/10/12(日) 15:14:03
上でやりたいのは、こういう事なんですが #include <stdio.h> #include <stdlib.h> char *g_pcX; int sub001(char *pcX) { pcX = (char*)malloc(256); for(int i=0; i<256; i++) { pcX[i] = i; } return 0; } void main() { sub001(g_pcX); for(int i=0; i<256; i++) { printf("%d ", g_pcX[i]); } }
>>49 ・そのサンプルではコンパイルできません。
・グローバル変数であるメリットが全くありません。
・そもそも関数内で確保した場所を誰にも伝えていないのに誰かが使えるわけがありません。
・ポインタと関数の引き数について勉強しなおすべきです。
>>48 できます。しかし、そうすべきではありません。
51 :
C言語始めました :2008/10/12(日) 18:51:19
zero( // ???? //) { for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ a[i][j]=0.; } } } main(){ int n=4; vector< vector<double> > a( n , n ); zero(// ????? //); } ???? ↑の部分はどのように宣言したらいいのでしょうか?
53 :
C言語始めました :2008/10/12(日) 19:12:59
void zero(int n, vector< vector<double> > & a) { for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ a[i][j]=0.; } } } void main(){ int n=4; vector< vector<double> > a( n , n ); zero(n, vector< vector<double> > & a); } さっぱりピーマンです…
いかん、間抜けだったのか。
>>53 次のどれかを選択しろ。
・STLの勉強をする。
・C初心者スレ辺りでやりたいことから提示して初歩から教わる。
・PCを窓から投げ捨てる。
55 :
C言語始めました :2008/10/12(日) 19:35:24
すいません。 火曜日になれば教えてもらえるけど早く使い方知りたかったんで。 基礎とかは二の次で使えたらいいのでどうか教えてください。
これで判らなければ、火曜まで待て。 -- #include <vector> void zero(std::vector<std::vector<double> > & a){for (unsigned i = 0; i < a.size(); ++i) for (unsigned j = 0; j < a.at(i).size(); ++j) a.at(i).at(j) = 0;} int main(){const unsigned n = 4;std::vector<std::vector<double> > a(n, n);zero(a);return 0;}
57 :
C言語始めました :2008/10/12(日) 21:30:04
<<56 ありがとうございます。 がんばって噛み砕きます。
58 :
デフォルトの名無しさん :2008/10/12(日) 23:07:57
>>58 あー確かにコンパイルは通るね。ダメダメなことに変わりはないけど。
61 :
デフォルトの名無しさん :2008/10/13(月) 22:44:34
VC++2005 EE使用 fatal error C1083: include ファイルを開けません。'iostream.h': No such file or directory というエラーが出ます。 VC++2005EEをインストールしただけじゃだめなのでしょうか? ソースは↓です。 #include <iostream.h> int main() { cout << "テスト" ; return 0; }
>>61 君は浦島太郎だ。今のC++に<iostream.h>は無くなった。
#include <iostream>
int main()
{
std::cout << "テスト" ;
return 0;
}
>>62 正常に実行できました。
ありがとうございます。
参考にしていたサイトが古かったので、浦島太郎でした。
[質問]ファイルを開けない [環境]VC++2005 TCHARで開くファイル名を指定して TEXT("\\Data\\foo.jpg") と しているが、CreateFileでファイルを開くことができない。 以下、プロジェクトをhogeとしている場合のフォルダ構成。 hoge.sln hoge.ncb hoge.suo +[debug] +[hoge]----+[Data]---foo.jpg +[Source]---main.cpp その他ソースコード ※プロジェクトのプロパティ>C/C++>追加のインクルードディレクトリ で、SourceフォルダとDataフォルダを追加している。 Dataフォルダの追加を行っているが、これはコンパイルするときに 読み込むもののみに有効? ※foo.jpgを[hoge]フォルダ直下においた場合は読み込める。
65 :
64 :2008/10/14(火) 07:58:48
>>64 です。
すんません、フォルダ構成記述ミスりました。
<最上位階層>
hoge.sln
hoge.ncb
hoge.suo
+[debug]
+[hoge]
<hoge階層>
+[Source]
+[Data]
hoge.rc
hoge.vcproj
hoge.ico
<Data階層>
foo.jpg //こいつを読み込みたい
<Source階層>
main.cppなどなどその他ソースコード
ネットワークプログラムって一体どんなことに使うんですか? 本を読んでもUNIXの鯖がどーたら で全然意味がわかりません。 鯖を共有メモリにするってことですか?
>>66 ネットワークプログラムなしにネットワークを使えると思っているのですか?
あなたか書き込んでいるここはいったい何だと思って・・・
ここというか、書き込んでるプログラムは一体何か、というところだな。
成績をつけるプログラムを教えてほしいです。 80点以上100点以内 A 65点以上80点未満 B 50点以上65点未満 C 0点以上50点未満 D それ以外の整数に対しては「ありえない」と出す
72 :
デフォルトの名無しさん :2008/10/21(火) 09:35:45
関数かconstで宣言されていると 内容も変更しないという意味だったっけ? たとえば void Map_Class::second(std::map<std::string, int>& m) const { のようなメンバ関数があったとすると このメンバ関数の中では値を変更しちゃいけないんだっけ?
>>72 いいえ、メンバ関数内でメンバ変数を変更できないだけです。
その例ではmを変更できてしまえます。
74 :
デフォルトの名無しさん :2008/10/21(火) 14:23:21
>>73 では、何のための const なのでしょう?
>>74 Map_Class自体がconstの場合のため。
std::map<std::string, int> m;
const Map_Class map_class;
map_class.second(m);
secondがconstでなければ呼べない。
map_classはconstのため変更不可だが、mはconstではないので変更可。
>>74 だから、メンバー変数を変更しないという意味でconstでしょ。
77 :
デフォルトの名無しさん :2008/10/22(水) 21:04:59
プログラムのデータ構造、つまり構造体をバリバリ使いまくるか オブジェクト指向で汎用性を高くもたせるか迷ってます 構造体バリバリで書くと後のソースいじるときに大量のソースになり 保守するのが難しくなりやすいのと オブジェクト指向で書くと汎用性を維持するためのコードで複雑になりやすく これまた保守が難しくなりやすいかと考えています どちらの手法で組んでいくか、また、別の手法があるかアドバイスいただけませんか?
それは、どっちでも極端過ぎるとだめだよ、ほどほどにバランスをとりなさいという教訓。
>>73 mapを変更したくないなら、
void Map_Class::second(const std::map<std::string, int>& m) const {
のようにmをconst参照にすればよい
すると、second内ではmのconstメンバー関数しか呼び出せなくなる。
簡単なゲームを作っているのですが、今まで使っていたアイコンは32×32だったので、それを16×16のサイズにしようと思い、そのサイズの画像を取り込んだら、32×32のサイズに拡大されて表示されてしまうのですがどうしたらよいのでしょう? アイコンファイルってサイズ指定するとこないですよね? Visual C++です。
今はどうやってるの? LoadImageならサイズも指定できるよ。
83 :
デフォルトの名無しさん :2008/10/23(木) 16:34:30
最近、C++を使うことになったのですが、 下記のクラスの定義で、<RTC::TimedLong>の部分の意味が分かりません。 (山カッコの使い方が分からないです…) よろしくお願いします。 class Multiply : public RTC::OnWriteConvert<RTC::TimedLong> { : : };
クラステンプレート
は、はやいな
>>82 HICON ico;
ico = AfxGetApp()->LoadIcon(IDI_ICON1);
って感じで読み込んでます。
88 :
デフォルトの名無しさん :2008/10/23(木) 18:53:45
とてつもなく漠然とした質問で申し訳ないのですが, 例えば, class Hoge { public: int compute( int x, int y ); } というクラスがあったとしたら, xとyは,メンバ変数とするべきか否か, その判別の基準って何かありますか?
>>87 MFCなのね。つい最近似たような事例を書いた気がするが・・・
HICON ico;
ico = (HICON)::LoadImage(AfxGetInstanceHandle(), _T("test.bmp"), MAKEINTRESOURCE(IDI_ICON1), 16, 16, LR_LOADFROMFILE );
こんなんでどう?
つか、元のアイコンは16x16なの?
VSで編集時にイメージメニューから複数のサイズ、色数のアイコンが追加できるけど、それでやってる?
90 :
89 :2008/10/23(木) 18:57:32
test.bmpは消してくれ、残ってた
91 :
89 :2008/10/23(木) 18:58:21
あと最後のパラメタもLR_DEFAULTCOLORだな、複数試してたからつい・・・
VC++ 6.0 で下記ソースのコンパイルがエラーとなります。 解決方法は見つけたのですが、 なぜ怒られるのか、わかりません。 理由が分かる方教えてください。 メンバ変数としてクラスを宣言して、 そのクラス名と同じ名前の関数を定義すると怒られます・・・。 ---------------------- class Hoge { }; class Niko { public: Niko(); ~Niko(); void Hoge(); Hoge hoge; // NG }; ↓↓↓↓↓ class Niko { public: Niko(); ~Niko(); Hoge hoge; // 何故か入れ替えるとOK void Hoge(); // もしくは ::Hoge hoge; とすることでもOK // または Hoge2()など、別名にすることでもOK }; Hoge()はNikoのメンバ関数のつもりですが、 Hogeクラスのコンストラクタとして解釈されている???
>>92 上では、Niko内でHogeという名前を使うと、
最も内側にあるvoid Hoge();に解決され、それは形名でないのでエラー。
もっとも、そういう風にメンバの順番を替えるだけでエラーになったりならなかったりしては
混乱間違いなしということで、下のコードも本来はエラーになる。
(Hoge hoge;で外側のHogeを使っておきながら、後からメンバ名にHogeを持ち込んだという罪状)
::Hoge hoge;と外側の名前を使うことを明示するか、Hoge2などと別の名前にするのが正しい。
その場合hogeとHoge()のどっちを先に書いてもいい。
94 :
92 :2008/10/23(木) 23:35:14
>>93 なるほど・・・名前解決ができないのですね。
以下のメンバの再定義によるエラーと同じと解釈しました。
---------------
class Fuga {
public:
int ABC;
void ABC(); // エラー
};
---------------
ちなみにおっしゃるとおり、gccでコンパイルしたら、入れ替え技も怒られました。
(グローバルスコープおよび、別名にするのはOKでした。)
コンパイラの警告文が違ったので、嵌ってしまいました・・・。
ありがとうございます。
95 :
デフォルトの名無しさん :2008/10/25(土) 12:42:40
起動するたびにランダムな数字をえたいのですが ちょっと忘れてしまったので聞きたいのです srand( ??? ); の ??? の部分って時間を指定するハズだったのですが 何の関数でしたっけ?
time
97 :
デフォルトの名無しさん :2008/10/25(土) 12:46:03
srand((unsigned)time(NULL));
98 :
95 :2008/10/25(土) 12:47:17
解決しました ありがとうございました
99 :
デフォルトの名無しさん :2008/10/25(土) 19:05:20
100 :
デフォルトの名無しさん :2008/10/25(土) 19:40:10
C/C++ DirectX で小規模なゲームを作ろうかと思っています そこで関数や変数の命名規則を決めたいのですが、 実務経験がないため、まったく分かりません 参考になるようなサイトでもないでしょうか?
01234を 00000 00001 ... 44443 44444 って表示するプログラム書いたんだけど、 そもそもSTLにある? あと、これ何て言う並び方だっけ?
cc でスタティックライブラリをビルドしたいんですが、 cc -c -I../header ../src/hoge1.c cc -c -I../header ../src/hoge2.c cc -c -I../header ../src/hoge3.c ar -r lib.a hoge1.o hoge2.o hoge3.o ranlib lib.a と同等のことを Makefile ではどうやってかけば良いのでしょう?
105 :
デフォルトの名無しさん :2008/10/25(土) 21:41:52
#include <stdio.h> void main() { for( int i=0; i<10; i++ ) printf( "%d\n", i ); for( int i=0; i<10; i++ ) printf( "%d\n", i ); } これって VC++6 だとコンパイルエラーなんだけど 最新のはOKなのですか?
>>105 OKだよ。
そしてVC6のおまじない。
#define for if (0) ; else for
>>101 重複順列だな。
探したことあるけど、STLにはないから自分で作るしかない。
重複しない順列なら next_permutation があるんだけど。
108 :
101 :2008/10/25(土) 22:48:09
>> 107 thx !
>106 それって何してるの?
forをif (0) ; else forに置換
>>109 >>105 のようなコードがVC6でも通るようになる。
原理はifの真側とelse側でそれぞれスコープが作られることの利用。
もちろん規格準拠な処理系では無害。
112 :
デフォルトの名無しさん :2008/10/26(日) 01:17:18
char *s; s = fgets(linebuffer, BUFFERSIZE, inputfile); if (s == NULL) { break; } こんな記述があったのですが、コレって大丈夫なんですか? fgets()って、文字列の先頭ポインタを返すので、sには入ると思うのですが、 fgets()が取り出した文字列自体はどこにあるのですかね??
113 :
デフォルトの名無しさん :2008/10/26(日) 01:27:28
つman fgets > gets() and fgets() return s on success, and NULL on error or when end of file occurs while no characters have been read. 標準ライブラリの関数はとりあえずmanを嫁。 linebufferのアドレスを先頭アドレスとしたBUFFERSIZE分の長さの配列があると仮定して書き込む。 んで、returnで成功したかどうか判別している。
114 :
デフォルトの名無しさん :2008/10/26(日) 11:46:42
#include <stdio.h> int i; void main() { int j; printf( "%d\n", i ); printf( "%d\n", j ); } この結果が 0 -85899346 になるのですが グローバル変数 int i は初期化しなくても 0 になるということは 保証されているのでしょうか?
115 :
デフォルトの名無しさん :2008/10/26(日) 12:20:25
117 :
デフォルトの名無しさん :2008/10/26(日) 14:29:16
>111 なるほど、スコープを作ってやるワケか。 そしてVC6ってforの初期化部でスコープ作らないのか…ガクブル
forのスコープが有効になったのは後になってからだからな 2003でもデフォルトは同じ。オプションでかえられるけど。
>>121 ARMくらいではVC6のforの挙動が正しかった。
C言語の構造体やポインタとか結構解ってきました。 C++言語もなんとなくわかってきました。 WinSDK少し使えます。 そこで何か実用的なプログラムを組みたいと思います。 みなさんは初めて作った実用的なプログラムってなんですか?
{ int i; for( i=0; i<10; i++ ) printf( "%d\n", i ); } for( i=0; i<10; i++ ) printf( "%d\n", i ); これでコンパイルエラーなら分かるんだけどね なんかしっくりこないが、仕様のようであきらめよう
モジュール分割の概念が存在しない 1ファイル1万行のシューティングゲーム
>>124 自分のHDのファイルの一覧を表示するプログラム
再帰処理なんかも考えさせられる
実用的とは言えないが、へー ぐらいの感動はあった
16連射しないと終了しないゲーム
C言語から配列に機械語を直接書きこんで、それを関数ポインタとして実行するっていう ことの解説で、一番まとまってるページを教えてください。 できればXbyak使わない感じで
ここにキチガイが現れたんだが ID:FJ+86jwr
誰かころしてくれ
http://pc11.2ch.net/test/read.cgi/gamedev/1217601153/ 677 名前:名前は開発中のものです。[sage] 投稿日:2008/10/27(月) 07:30:02 ID:FJ+86jwr
>>676 ああ、うぜー
rand()%0xFFFFFFFF
678 名前:名前は開発中のものです。[sage] 投稿日:2008/10/27(月) 07:31:07 ID:H6+Ksq4k
>>677 お前は数字も読めないのか
679 名前:名前は開発中のものです。[sage] 投稿日:2008/10/27(月) 08:45:32 ID:FJ+86jwr
>>678 は?
詩ねよバカ
680 名前:名前は開発中のものです。[sage] 投稿日:2008/10/27(月) 09:04:23 ID:H6+Ksq4k
>>679 悔しいのうwwww悔しいのうwwww
どうみてもID:FJ+86jwr以外のがおかしいw 言動はちょっとあれだが。
ID:FJ+86jwr=ゴミグラマ
133 :
デフォルトの名無しさん :2008/10/27(月) 16:18:43
テンプレートの中に、テンプレートが入ってるプログラム なのですが、これはどういうふうに理解すればよいでしょうか? template <class DataType, template <class DataType> class Buffer = RingBuffer > class InPort : public Buffer<DataType> { :
for文に関しての質問です for ( JX = 1 ; JX <= MDX ; JX++ ) {for (JY=1;JY<=MDY;JY++) {for (JZ=1;JZ<=MDZ;JZ++) EPSX[JX][JY][JZ]=EPS0; EPSY[JX][JY][JZ]=EPS0; EPSZ[JX][JY][JZ]=EPS0; AMUX[JX][JY][JZ]=AMU0; AMUY[JX][JY][JZ]=AMU0; AMUZ[JX][JY][JZ]=AMU0; SIGX[JX][JY][JZ]=SIG0; SIGY[JX][JY][JZ]=SIG0; SIGZ[JX][JY][JZ]=SIG0; } } これでbcc32でコンパイルを行うと E2188 : 式の構文エラー が表示されます。 for文としては何を間違えてしまっていますか?
#include <stdio.h> enum { MDX, MDY, MDZ, EPS0, AMU0, SIG0 }; void main() { int JX, JY, JZ; int EPSY[10][10][10], EPSX[10][10][10], EPSZ[10][10][10]; int AMUX[10][10][10], AMUY[10][10][10], AMUZ[10][10][10]; int SIGX[10][10][10], SIGY[10][10][10], SIGZ[10][10][10]; for ( JX = 1 ; JX <= MDX ; JX++ ) { for (JY=1;JY<=MDY;JY++) { for (JZ=1;JZ<=MDZ;JZ++) EPSX[JX][JY][JZ]=EPS0; EPSY[JX][JY][JZ]=EPS0; EPSZ[JX][JY][JZ]=EPS0; AMUX[JX][JY][JZ]=AMU0; AMUY[JX][JY][JZ]=AMU0; AMUZ[JX][JY][JZ]=AMU0; SIGX[JX][JY][JZ]=SIG0; SIGY[JX][JY][JZ]=SIG0; SIGZ[JX][JY][JZ]=SIG0; } } } VC++6.0 問題ない
136 :
133 :2008/10/27(月) 20:19:02
他所で聞いてきます…
>>134 最内周のforに{}がない。
てか外側はなくてもよいのになぜ内側だけないんだろ。
>>133 かっこ { } の数がおかしいかもしれんが 3D は分からないのでどうしようもないし、
こんなことぐらいでつまづくようであれば今後の先行きは見えているようなもの
かっこつけんな!
140 :
デフォルトの名無しさん :2008/10/28(火) 23:04:01
eclipseでワークスペースがC:\xampp\htdocsの場合 上の階層のC:\xampp内にclassファイルを作成したりしたい場合は eclipseでは作成できないのでしょうか?
誤爆
143 :
デフォルトの名無しさん :2008/10/28(火) 23:47:21
ものすごい初歩的な質問です。 cで scanfで数字を入力してもらって それが数字でない場合(たとえばaとか) 数字を入力してください。 と表示したいと考えています。 入力されたキーが数字か数字でないかを 判断するにはどうすればよいでしょうか? よろしくお願いします。
scanfの戻り値は変換を行った個数。 まあ、すぐにfgets+sscanfに移りたくなるだろうが。
標準にisdigit()ってのがあるけど、これを自分で書けないようじゃプログラミングなんてできんだろう・・・。 素朴にやるなら判定を10個並べるだけだぞ。
>>145 何かあったのか?
そんなもん知らなかったし、使う予定もないだろうし
>>146 >145が>143からの流れだと理解できないなら、無理にレスする必要ありませんよ。
それはそれとして、>143に対して>145のレスも的が外れているが。
つーか判定10個も並べないでくれ・・・ if文一行で終わるだろう
149 :
デフォルトの名無しさん :2008/10/29(水) 16:23:22
img[0] = LoadGraph( "test00.bmp" ); img[1] = LoadGraph( "test01.bmp" ); img[2] = LoadGraph( "test02.bmp" ); img[3] = LoadGraph( "test03.bmp" ); img[4] = LoadGraph( "test04.bmp" ); img[5] = LoadGraph( "test05.bmp" ); img[6] = LoadGraph( "test06.bmp" ); img[7] = LoadGraph( "test07.bmp" ); img[8] = LoadGraph( "test08.bmp" ); img[9] = LoadGraph( "test09.bmp" ); と char str[80]; for( int i=0; i<10; i++ ) { wsprintf( str, "test%02d.bmp", i ); img[i] = LoadGraph( str ); } どっちがいい?
>>149 前者の左辺と右辺の関係が崩れない保障があるなら、後者。
配列に初期化で入れておいてループで読む中間タイプはどうだろう。
char *filename[] = { "test00.bmp", "test01.bmp", ・ ・ "test08.bmp", "test09.bmp", }; for( int i=0; i<sizeof(filename)/sizeof(filename[0]); i++ ) { img[i] = LoadGraph( filename[i] ); }
filenameはstaticにしないと無駄なコピーが発生するぞ。
ああ、まあ関数の外に出すにしてもstaticはあったほうがいいな。
の前に、const 忘れちゃおしおきよ
わきがくさい って言ってたZE☆
板違いで申し訳ないけど ゲーム制作メンバー募集でまともなところない? ゲ製作技術のところはキチガイか揚げ足とりしかいなくてどうしようもない
160 :
デフォルトの名無しさん :2008/11/01(土) 14:33:14
161 :
デフォルトの名無しさん :2008/11/01(土) 20:56:40
Borland C++ Compilerがダウンロードできないんですけど どうすればいいですか?
>>160 すごく・・・
申し訳ありません質問させて頂きたいのですが
外部機器として認識してくれるカメラを【webカメラ】として認識してくれるようにするためのプログラム(ドライバ・・と言うのかもしれません)を
組む事は難解、複雑なのでしょうか?
ちなみにamcapでは認識してもらえているようなのです。「その他の外部機器として・・」
osはvista 32bit ですが、win上で認識してくれる可能性がある場合xpでも64bitでも構いませんので
ございましたら是非、余す事無く情報をお願い致します
機器名も参考までに乗せておきます(PLAYSTATION®Eye)
質問主のプログラミング知識で、課題が難解かどうか分からないなら、 覚えて組むのに相当時間がかかるだろうw でもPSの機器なら、検索すればドライバは出てくるかも PSや箱のコントローラは有志が出来の良いドライバを作ってくれてるし 気長に待つか、急ぎならあきらめて別のを買うしか
やはりそうですよね、難易度の反応を伺って 「もう動作してるんだろ?WEBカメラとして認識させるくらいならここをこうで簡単だぜ!」 という感じならば そこをそうして頂けませんか?と調子よく持って行こうとしていたことは謝ります。 海外の方がドライバを制作されていらっしゃるのですが「動作したから終わりね:b」 というスタンスでいらっしゃるので、これ以上は望めないかな・・と なぜWEBカメラデバイスとして認識して欲しいかというと それだけで(ソフト間の)仕様用途がとても広がり、とても助かるのです(申し訳ありません利己主義な表現で) と、とても正直に書いてみましたがまだ2割方期待を持っていたりします もう少し模索してみます、有り難うございました。
上司に聞けよ
おはようございます、疑問があり舞い戻って参りました申し訳ありません 質問させて頂きたいのですが 【WEBカメラデバイスとして認識するドライバ】には、そのような”命令”がどこかにあると思い、 メーカーで配布されているドライバを解析し、(あくまで道徳的に”改変”まではしないという定で^^;) その”命令”の値を見つけて、海外の方が作られた.ini.datの様なプログラムに組み込めばWEBカメラとして認識するように思ったのですが・・ 私の見解ではやはり甘々でしょうか、回答、宜しくお願い致します。
可能かもしれないが、べらぼうに面倒。 場合によっては不可能。
そうですか・・とりあえず、stirlingで【camera】等のワードで検索して ファイル比較ソフトでも使って、差分を書き出してみます 有力な回答、有り難うございました。
>>166 もしブラックボックスなドライバのリバースエンジニアリングとかそういうのに慣れた人ならもしかしたら
可能かもしれないけど、普通の人にはまず無理だと思うよ。
ドライバというかもっと一般的に実行ファイルの中身がどうなってるか理解してます?
大麻の栽培方法を調べたのですが どこで作ればいいですか? と聞いているようなもの
171 :
デフォルトの名無しさん :2008/11/02(日) 18:05:05
とある掲示板で以下のような文章があったのですが、「通りすがり」という方の主張は本当なのでしょうか?
//--------------------------------------------------------------------------------
日時: 2008/10/28 22:53
名前: 通りすがり
著作権との関係
検索エンジンは、その仕様上インターネット上のコンテンツを複製してキャッシュとして保存するようになっている。
このような仕様は、日本では、著作権法上、問題があるため、検索エンジンの仕様を合法とする
海外(米国など)のサーバに置かれている。
「Wikipedia」より一部抜粋
違法というよりは「合法化していない」という感じですね
2次創作も実際合法化してないという意味では同じですが
検索サイトという大規模なことをしようとするならば
極力危険を避けるべきでは?というところでしょうか?
//-----------------------------------------------------------------------------
URLは以下の通りとなります
http://www.freem.ne.jp/cgi-bin/bbs/party/osiete.cgi/mode_view/no_494/p_2/
なぜこのスレで聞こうと思ったのか なぜ自分で調べようとしないのか
グーグルに聞こうかとしたが日本語のサポート宛でないといけないらしく いろいろと手続きが多かったのでここで聞くことにしました
スレタイを見ろバカモノ
175 :
デフォルトの名無しさん :2008/11/02(日) 19:25:21
ループとputcharを使って、y=x*xの座標を*でプロットするプログラム を作りたいと思ってるんですけど、どうすればいいですか。縦をy軸とします。
何がわかんないの?
177 :
デフォルトの名無しさん :2008/11/02(日) 19:59:06
とりあえず、y=25のときx=-5,5の2点をプロットして、そのあと改行 します。そのあとyが24から17までを改行で、何も表示させないように しようかとしたんですけど、無限ループになってしまうんです。
>>177 >175を見る限りCだと思うけど、C初心者スレにでもソースを貼って教えを乞いたら?
0x100Cと0012FF88の違いって何? 同じものならどういう書き方の違いがあるの?
同じものではないです。 値が違います。
こんにちは CもしくはC++で とある保存機能が削除されたプログラム「.exe」に「保存機能」を追加する場合
同フォルダ内 プログラムの.dll内へ「保存機能を追加するプログラム」を書く事になるのだと思うのですが
その「保存機能を追加するプログラム」を1つだけ置けば完結。みたいな雛形などはあるのでしょうか?
それともプログラム1つ1つの動作に関連付けて いかないといけないのでしょうか?
文だけでは説明が難しいので解説のため画像をうpしておきます
左が前者 右が後者です
http://www.vipper.org/vip978703.jpg.html
知らんがな。 もともと、保存機能が別のDLLで行われることが分かっていて、 なんらかの事情でそのDLLだけ持っていないというのであれば、 オリジナルと同じように作ればできるとは言える。 そうじゃないなら無理やりにでもやるしかない。 もちろんEXEのソースはないという前提だよな。
183 :
デフォルトの名無しさん :2008/11/04(火) 18:03:49
VC++6です。ヘッダの定義のマクロで悩んでいます。 #define __myheader_H__ 前と後ろの"__"は何で2つなんだろうか? #define _INCLUDE_myheader_H_ という風に、最後の"_"が1つの物もあるけれどどう違うのか? INCLUDEとmyheaderの間の"_"は本来スペースだし、myheaderとHの間の "_"は本来.(ドット)ですが、何でもかんでも"_"になってますけど これは何なの? など、本も5,6冊買ったし、ネットも散々検索してるのですが なかなか答えが見つかりません。これは一体何なのでしょうか? どこか書いてあるサイトなり何なりありませんでしょうか? 何卒よろしこ
>>183 先頭のアンダーバーには色色制約があるので二つ並べているのだろう。
末尾のアンダーバーは先頭とのバランスだと思う。__FILE__に倣っているのかも知れない。
途中のアンダーバーはドットの代わり。
>184s/__FILE__に/__FILE__などに/
重要なことは、以下に続くであろうソースとかぶらないこと。
どうせインクルードガードだ。かぶりゃせんだろ。
188 :
183 :2008/11/04(火) 18:30:48
なるへそ、みんなありがd。 調べてるうちにborandのC++とかと共通に出来るようにしてるのかな、 とかなんとなくなじんで来た。おかげで少し抵抗が無くなった。
>>183 >前と後ろの"__"は何で2つなんだろうか?
>最後の"_"が1つの物もあるけれどどう違うのか?
別に1個でも2個でも0個でもいいが、
アンダーバーの多い方が他の識別子 (変数名とか関数名とか) とかぶりにくい
>"_"は本来.(ドット)ですが、何でもかんでも"_"になってますけどこれは何なの?
マクロ名にドットやスペースは使えないから止むを得ない
>>183 昔のコンパイラは、
#pragma once
がサポートされていなかったので、それの代わり。 相互参照され
ているクラスなどで、同じincludeファイルを二度読みして再定義
エラーを出さないための工夫。
途中の意味不明なキャラクタの羅列は、GUIDを使って、定義名が
重複してしまうのを防いでいるだけ。
191 :
181 :2008/11/04(火) 19:59:16
>>182 そうですね、ソースがないのにデコンパイルとはけしからんと言われそうなので
この質問自体が仮説だとして考えて頂ければ幸いです
インポート.dllがある場合、この中身の値をエクスポートに変えて別名で保存したら
エクスポートが出来るのではないかと考え、いま試していますがやはり.exe内の値「プルダウンからのエクスポート機能起動」などの関連付けも必要になってきそうです
はじめまして int m,t; があった時に m>?=t; という式を実行したら何が起こるのでしょうか?? 初めてみたのですが、 if (m<t) { m = t; } と同値ですか? どうやらそんな気がするのですが m>?=t; と m<t が逆でなんかおかしい気も.... よろしくお願いいたしますm(__)m
それはどこのコンパイラ、本当にCもしくはC++か? 標準にはないぞ。
unsigned charとfloatの掛け算の結果はfloatにならないのは何で?
>>193 さん
すみません。
Red Hat 3.4.6-3です。
cygwinとかでやったらエラーになりますが...Red Hat 3.4.6-3だと通ります...
196 :
192 :2008/11/04(火) 21:52:22
>>191 デコンパイルしてどうにかできるんならそうすれば?
>>194 結果を整数型の変数に代入してるからだろ
>>194 その組み合わせだと、結果はdoubleになるね。
それオーバーロードできるの?
203 :
デフォルトの名無しさん :2008/11/06(木) 21:34:16
Linuxでたぶんコンパイラはgccだと思うんですけど、sin,cos,tanを計算させるときに どう定義すればいいんですか。ただ#include<math.h>を書くだけではだめなのですか。 なんかコンパイルしたときに、sin,cos,tanが定義されていないというエラーが出たのですが・・・
gcc なにか.c -lm -lm -lm -lm -lm -lm -lm -lm -lm -lm -lm
コンパイラが出すエラーとリンカが出すエラーを区別できないようでは (C/C++を使うのは)難しい
”fopen”とか”open”はAPIの”CreateFile”が最終的に呼ばれているのですか? 機能や応用などを考えるとCreateFIleをメインで勉強した方がいいですかね?
>>206 わざわざそうする意味はない、fopenですむ状況ならfopen使っとけ
お前の考える機能や応用がなんなのかは知らんが
208 :
183 :2008/11/07(金) 12:35:56
>>189-190 サンクスコ。もっとなじんだよ。
なんか、こう、手のひらになじんできた気がするよ
おそレスゴメソ
double a[4][4]={{2,2,0,-1},{1,1,2,0},{3,0,1,1},{1,2,-1,1}}; と初期化したら a[0][1] = 2 a[0][2] = 2 a[0][3] = 0 のように、1次元目が0の場所に最初の{ }が代入されますか?
そうですよ
って例は間違ってるじゃないか a[0][0] = 2 a[0][1] = 2 a[0][2] = 0
c++でiniから文字列を読み取るのにGetPrivateProfileStringを使ってたんだけど、 読込先がLPSTRだからいちいち適当な領域を確保しなきゃいけないんだけど何とかなりませんかね? 理想を言えばstring型に直接代入したいんだけど…
fstream と string と boost::regex で実装すれば。
boost::regexって何かと思ったら正規表現ライブラリか。 始めて半年の素人に正規表現とか無理だわorz どうせ自分用ツールだし、数字でっち上げて運用回避するよ 回答ありがとう
自分用ツールだから勉強がてら使ってみようとは思わないのか。
逆に、自分用ツールだからお茶を濁して済ますこともできるわけじゃない。
>>212 事前にそのiniファイルのサイズを取得しておけば?
219 :
デフォルトの名無しさん :2008/11/08(土) 06:47:41
質問よろしくお願いします。 forkしたプロセスをブロッキングせずにループで終了を待ちたいのですが、何か方法はありますか? 環境は Linux 2.6 gcc4.0 です
>>219 waitpid を WNOHANG つきで呼びなしゃい
bitsetの内容をiniに保存したいんだけど、桁が多いと当然unsigned longじゃ足りないじゃないですか。 この場合、文字列として読み込んでから1桁ずつ調べて順番に入れていくしか方法はないでしょうか?
WinAPIのgetPrivateProfile〜()を使うと言う前提なら、〜String()を使うしかないっしょ。
223 :
デフォルトの名無しさん :2008/11/09(日) 02:17:07
>>220 どうもありがとうございました。
もっとmanを読むべきでした・・・
C,C++のソース内でexeファイルを実行するのってどうやるんですか?
すいません、あとソース内でIEを開いてyahooを開く処理って どうやるんでしょうか 教えてくださいお願いします
>>224-225 どっちも、::ShellExecute() でいける。
Webを開くには、exeパスの代わりにURL文字列("
http://www.yahoo.co.jp ")
を渡し、コマンドに"open"あとの引数は、NULLでよいかと。
exeやcom、bat以外のデータファイルのパスを与えると、拡張子に関連付け
られたプログラム(例えば.txtならメモ帳)が起動する。
ちなみに、起動されるブラウザは「標準のブラウザ」になる。 通常は
IEだが、「スタートメニュー」−「プログラムのアクセスと既定の設定」
でMozilla等IE以外のブラウザを選択していれば、そのブラウザが使わ
れる。
>>212 CStdioFileクラスを使う。
CStdioFile file;
CString strLineBuf;
CStringArray arrFileBuf;
if(file.Open(...))
{
while(file.ReadString(strLineBuf))
{
arrFileBuf.Add(strLineBuf):
}
file.Close();
}
最早、GetPrivateProfileString()は捨てられているのね。
230 :
デフォルトの名無しさん :2008/11/10(月) 13:08:43
int medianfilter() { int sortr[9],sortg[9],sortb[9]; col.r = median(sortr); ☆ col.g = median(sortg); ☆ col.b = median(sortb); ☆ return TRUE; } int median(int *sort) { 〜〜〜 } これをビルドしようとすると☆の行で error C3861: 'median': 識別子は、引数依存の照合を使用しても見つかりません。 となるんですが、どうすればいいでしょうか?
>>230 int medianfilter()の前にint median(int * sort)を移動。できればstaticもつけておく。
232 :
デフォルトの名無しさん :2008/11/10(月) 13:50:48
>>231 出来ました。
ありがとうございました。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7987.txt 上記のa6b.c a6c.c a6d.c でつくった関数をa6a.cでexternを使って呼び出したいのですが、コンパイル時にエラーが出てしまいます。どなたか対処法をお願いします。externを使わずに1つのソースとしてコンパイルすると成功し実行もできます。
エラー内容
$ gcc -o a6a a6a.c
In file included from a6a.c:5:
a6c.c:9: error: conflicting types for 'matrix'
a6b.c:9: error: previous declaration of 'matrix' was here
In file included from a6a.c:6:
a6d.c:9: error: conflicting types for 'matrix'
a6c.c:9: error: previous declaration of 'matrix' was here
a6d.c:9: error: conflicting types for 'matrix'
a6c.c:9: error: previous declaration of 'matrix' was here
a6a.c:12: error: conflicting types for 'matrix'
a6d.c:9: error: previous declaration of 'matrix' was here
a6a.c:12: error: conflicting types for 'matrix'
a6c.c:9: error: previous declaration of 'matrix' was here
a6a.c:14: error: conflicting types for 'omatrix'
a6d.c:12: error: previous definition of 'omatrix' was here
a6a.c:15: error: conflicting types for 'amatrix'
a6b.c:12: error: previous definition of 'amatrix' was here
a6a.c:16: error: conflicting types for 'mmatrix'
a6c.c:12: error: previous definition of 'mmatrix' was here
cファイルをincludしたら同じ名前の関数があちこちできちゃうだろ。 hファイルにプロトタイプ宣言を書いて、それをincludeすればいい。
つーか今回は同じtypedefか これもhに入れてそれぞれincludeすりゃいい。 あと、その時のコンパイルは、gcc -o a6a a6a.c a6b.c a6c.c a6d.c で
hファイルというものを使う方法以外に何かありませんか?作り直してみましたが、hファイルなんてまったく使ったことがなかったのでエラーがたくさんでてしまいました。
じゃあinclude無しで。
extern入れてるし、それぞれでtypedefしてるからなくてもいいだろ。
コンパイルだけ
>>235 のとおりでやってみ
ゲーム作ってるんだけど とりあえずDXライブラリというのは一通り理解したんだが つぎのステップとしてはやっぱwindowsAPIを本格的にやるのがいいんですかね?
いや、作ってみればいいんでない?一通り理解したなら。
あ、ごめんなさい。作ったんです。 で、ちょっとDXライブラリの機能だけじゃ物足りないかなーとか思い始めたんで・・・。 3Dとかにも挑戦してみたいと。 すみません。
DXライブラリはその辺全部やっちゃうからな。 まあ普通にWindow作ってみるのもいいかもね。
DirectXって結構しょぼいんだね。 自前で3Dライブラリ作るのが当たり前なのか。。。 がんばってね。応援してるぜ
D3DXがあるだろ
246 :
デフォルトの名無しさん :2008/11/10(月) 22:21:28
vc++2008で質問です。 CLIの中でWIN32って使えますか? イメージは CLIで画面を作って WIN32のプログラムを入れてみたいのですが・・・ h8やPICのCからVCは難し過ぎです
できる。 あと、Win32がメインの俺にはマイコンのほうこそ別次元の難しさを感じるぞ。
248 :
デフォルトの名無しさん :2008/11/10(月) 23:17:24
>>247 サンキューです
マイコンはイベントじゃないから書きやすいよ
>>245 いやいや、DXライブラリの機能じゃ物足りないって言ってるんだから。
きっとすげえんだよ、彼は。
こんちわ c++でWindows標準のメモ帳起動させて40文字3行程度書き込んでメモ帳閉じる これできますか? サンプル貰えたら嬉しいです
>>250 「メモ帳」アプリを起動して、そこに文字を流し込むと言うGUIの動きに何か意味があるの?
そうでないなら、適当なファイルを開いて書き出すだけだがね。
入門書を読めば嫌でもサンプルが見つかると思うぞ。
CreateProcessしてFindWindowしてSendMessageすりゃいいだけ
こんちわ どもレスありがと VC++6.0のサンプルってVC++2008で動かないのもあるんですか? 基本的に全部動くはずなんですよね?
一部変わったからコンパイルできないものもあるだろうけど ほとんどは機械的な置き換えで対処できる。
vector<string> buff(3);を func(buff)として void func(vector<string> &buff)という関数に渡す。 この関数でbuffに3つの文字列を入れる。 buff[0] ="hoge"; buff[1] ="huga"; っていう処理を書いたんですが、問題点とかありますか?
>>255 カプセル化されていないとか、気持ち悪いとか、そういった類を除けば特に問題ないかと。
C++とC++/CLIってどちらが高尚なの?
259 :
デフォルトの名無しさん :2008/11/13(木) 07:42:19
vc++2008にて質問なのですが int array[3][4]={ {7,8,-2,3}, {6,-2,9,7}, {1,5,9,-8} }; という部分で error C2078: 初期化子の数が多すぎます。 とエラーが出ます。 中身を減らしても、array[10][10]とかにしてもエラーが出るのですが これはどういうことなんでしょう?
中の、中かっこっているんでしたっけ? int array[3][4]={ 7,8,-2,3, 6,-2,9,7, 1,5,9,-8 };
要ります。 >259は何か勘違いをしていると思われ。
262 :
259 :2008/11/13(木) 09:59:34
gccでやったら問題なく通りました。 C++とCの違いの問題なんでしょうか?
いや括弧はないとだめだよ
やってみた?
どの環境条件で?
C言語で動画像を処理したいのですが、 画像を連続で読み込んでいくにはどうすればよいでしょうか?
どうすればって、画像の読み込み処理を連続で実行すればいいのでは
C言語に何を求めてるのか分からんが ・フォルダ内の全ての画像を連続で読み込む ・それぞれのファイルに赤目補正をする っていうのはそんなに簡単じゃないよ。 ついでに言うと ・動画ファイルを読み込む ・圧縮形式を変換する というのも欲しいかもしれないけれど、これもそんなに簡単じゃないよ。 なのでフォトショップでも買ってバッチ処理でもやってくださいな。
267ですが、あるフォルダに画像データ○○000.cif〜○○100.cifが入っており、 一つ一つ呼び出してある処理をかけたいのです。 画像のファイルネームを渡せばその画像を読み込んでくれる関数はあるのですが、 100個もファイルネームを用意するのは面倒です。 for文とかの繰り返し文の処理でなんとかならないでしょうか?
フォルダ内にあるファイルを全部読み込む処理を書く。 ファイル形式でフィルタして必要なファイルだけ抽出。 あとは好きなだけ処理すればよし。
shellから呼べば
>>270 数字以外の部分が同じならsprintfでファイル名を作成できる
for (i = 0; i <= 100; i++)
{
sprintf(filename, "xxx%03d.cif", i);
// 処理
}
275 :
デフォルトの名無しさん :2008/11/17(月) 03:17:55
カメラとパンチルト台(PCで方向制御できるカメラ台)を使って 動く物体をカメラが自動追跡する 監視カメラのような機械を作っています。 処理の流れとしては 1.カメラ画像を解析して追跡対象の位置、速度を計算 2.上の結果に基づきパンチルト台の方向、角速度を決める の二つを以下のようにwhile文で交互に連続で行い追跡しました。 while(loop){ 画像解析 パンチルト台の操作 } しかしこの方法だと画像解析の間はパンチルトができず、 パンチルト台が動いている間は画像解析が止まり、 ゆっくり動く物体はともかく高速で動く物体は追跡できません。 カメラ、パンチルト台共にc++で制御できる環境になっています。 二つの動作をそれぞれ独立かつ同時に行いながら連絡し合う、 この場合は画像解析と台の操作を 別々に二つのwhile文で同時に処理しながら、 片方からもう片方のwhileの文の中へ値を渡すような、 そんな方法って何かないでしょうか?
どういう環境か知らないけど、とりあえずマルチスレッド。
277 :
デフォルトの名無しさん :2008/11/17(月) 03:33:09
>>276 ありがとうございます。
初めて知ったので早速勉強してみます。
ちなみにVisualStudio2005を使っています。
その機械に興味があるわw Wiiリモコン+センサーバーを使った遊びみたいでイイネ
279 :
デフォルトの名無しさん :2008/11/17(月) 03:57:11
280 :
デフォルトの名無しさん :2008/11/17(月) 12:55:00
質問です。 すでにPCにインストール済みのdll内のAPIを、Webブラウザ(今回はIE限定)からコールしようとしています。 イントラ内あるいは認証後のWebなど、限られたユーザのみに提供予定で、「信頼済みサイト」に登録するのか可能な状態です。 こういった場合、C++でActiveXコントロールを作るといい、と前に別スレで教わったのですが、 ローカル資産にブラウザからアクセスするのがセキュリティ上好ましくないからか、資料が見つかりませんでした。 そういうサイト、あるいは本でもいいので、もしあれば教えてください。
281 :
280 :2008/11/17(月) 13:11:21
環境書き忘れました。 Visual Studio 2008 Professional Editionで、OSはXP HomeとVista Businessです。 IEは6以上と考えています。
282 :
りょ :2008/11/17(月) 15:08:35
onClick="editEmployeeInfo"(<bean:write name="searchList" property="employee_id"/>) これで社員Idを送ってるらしいんだけど、 これを自分のとこのページでこの社員IDをキーにデータを取得するのはどうやるんですか?
それはC/C++の質問なのか?
C言語(C++に非ず)の質問です。 関数ポインタの書き方を教えて下さい。 やりたいのは ・構造体Sに関数ポインタを持たせたい ・Sへのポインタ(S *s)を渡すと Sが保持してる関数(s->func)に引数を与えて呼び出す関数が書きたい ・Sに保持する関数funcは 引数が3つほどあり(いずれも構造体へのポインタ) 戻り値も構造体へのポインタ だいたいで書くとこんな感じです: // s.h typedef struct { R *func(A *, B *, C *); } S; R *caller(S *s) { A a; B b; C c; s->func(&a,&b,&c); } 続く
// main.c #include "s.h" R *func1(A *a, B *b, C *c) { // 処理 return Rのポインタ; } R *func2(A *a, B *b, C *c) { // 処理 return Rのポインタ; } int main() { S s1, s2; s1.func = func1; s2.func = func2; caller(s1); caller(s2); return 0; } …と、こんな感じのことがしたいです (ヘッダの使い方が間違ってたりするのは実際書くとき直します) 関数ポインタは全然書き方が分からなくて文法がおかしいと思いますが その関数ポインタ関連の正しい書き方が分からなくて…
>>285 関数型をtypedefしてしまえば普通に書けるべ。
typedef R * func_t(A * a, B * b, C * c);
typedef struct S {
func_t * func;
} S;
>286 typedef の行で error: syntax error before '*' token warning: data definition has no type or storage class と出ます…
typedef R (* func_t)(A * a, B * b, C * c); こうでしょ。RやA,B,Cは定義済みのやつにかえてるよね?
まさかとは思うが、Rの宣言はその行より前にあるだろうね。
>>288 構造体Rのポインタを返すのだから、>286でいい筈でしょ。
>289
だったらtypedef R* (* func_t)(A * a, B * b, C * c);だろ 関数ポインタ知らないで書いてたのか。 >func_t * func; こういう書き方もしてるしな
>289 それでした… あれ?何でできなかったんだろう… func_t の戻り値型が int だとどうなりますか?
>292 関数ポインタの概念は解るんですが、書き方がどうも覚えられなくて 解説通りの関数ポインタをちょっとアレンジしようとすると 文法エラーが出て「あ、あれ???」となることが多いのです…
>>280 ActiveX自体が下火だから資料探しは難しいな。
ATL COMプログラミングって本が多少はお勧めだけど、
IE上で動くActiveXコントロール限定の話じゃないからその点注意。
Web上のサンプルとかも拾いつつ、とりあえず動き始めればもう一息。
信頼済みに入っていればLoadLibraryなんかも使い放題だと思う。
あー…ちょっと解ったような… >292 さんのが多分私の思ってたR型へのポインタを返すもので >288 さんのがRの実体を返すタイプ、 私が >293 で書いた戻り値型が int の場合は typedef int (* func_t)(A …以下同文で合ってますか? …とすると、>286 さんのは…???
処理系でちょっと書き方変わってくるので、コンパイル通った方が正解。
>>297 処理系の問題じゃなくて、関数へのポインタをtypedefするか、関数そのものをtypedefするかの違い。
typdef R* (*func_ptr)(A*, B*, C*); // 関数へのポインタのtypedef
typdef R* func(A*, B*, C*); // 関数のtypedef
struct X {
func_ptr f1; // 関数へのポインタの場合は、* が要らない。
func* f2; // 関数のtypdefの場合は、*が要る。
};
>286だけど、Rへのポインタを返す関数型としてfunc_tをtypedefしているよ。 つまり、>292には想像もできなかったらしいけど、typedefしているものが>292とは違うということ。 ちゃんと、>286には「関数型をtypedef」って書いてあるんだけどねぇ。
関数型をtypedefしておくと、プロトタイプ宣言を横着できるから面白い。 >298の例なら、func func1, func2;で済んでしまう。 # 却って混乱しそうなのでお勧めはしない。
構造体のメンバを参照するとき ドット . とアロー演算子->の違いはなんでしょうか?
x->b は (*x).b
304 :
280 :2008/11/17(月) 23:09:02
>>295 本当にありがとう。
ActiveXが下火ってことは、別の技術で同じことが実現できるようになったからなんでしょうか。
その本なら見かけたことあるんで、買ってきます。
>>304 オープンなインターネットにおいて、Windows/IE限定の技術だったし、
セキュリティもあまりよくない状況にしやすいというのがダメだった。
後継の決定打はない。
Webブラウザで動かすならAjax、Flash、Silverlightのようにローカルリソースを諦めるか、
ローカルリソースを使いたいならClickOnceなんかのように
アプリケーションをインストールさせるという方向に分かれている感じだと自分は思っている。
Tidy使ってHTML->XHTML変換したいんだがやり方が全然わかんね
utf8な文字列を投げてコンソールに出力したときに日本語部分が全部????になる
tidyOptSetValue(tdoc, TidyOutCharEncoding, "shiftjis");やらやってみたけど全然だめ
誰か助けてくれ
ttp://tidy.sourceforge.net/docs/api/ ドキュメントわからなさすぎ 関数名書いてあるだけとか泣いちゃうから
変数xのlogを返したいのですがどう書けばいいのでしょうか? (log xやln xを得たい)
>>307 Cならlog()またはlog10()。
あまりに的外れなこと聞いてたらすみません Cの入門書って黙って書いておけ的な感じで#include <stdio.h>の一文がありますよね 同様にC++の入門書では#include <iostream>とありました しかしVC++を使ってる限りCにC++の文、C++にCの文を書いても互換性があったり混同しても問題なかったりしているのですが 少しでも混同する場合は↑のお約束文?は2つとも書いておくべきなのでしょうか?それとも片方でよいのでしょうか?
使うものは書く必要がある 使わないものは別に書いても書かなくても構わないが、まぁ無駄なだけだ printf, scanf 等は <stdio.h> cout 等は <iostream> 使いたい関数のリファレンスマニュアルを見れば、必要なヘッダファイルが書いてある
CにC++の文を書いたりCでC++のヘッダファイルを使うことはできないよ VC++のデフォルトのプロジェクト設定では拡張子を .c にしてもC++としてコンパイルされるから 問題ないように見えてしまうかもしれないが
__FUNCTION__ って VC++ だけ? gcc でもつかえる?
313 :
デフォルトの名無しさん :2008/11/20(木) 21:55:03
質問です while (true) { if(a = b) { //何かの処理A continue; } //何かの処理B } この場合、a=bだとすると処理Aが行われますが、その後の処理Bは行われますか?
どっちも試せば一発でわかることなのに。。。
>>312 使える
>>313 実行されない
というか、そのための continue
>313 そのコードだと、まず a に b が代入され b が真なら処理Aが実行される。 もし = が == なら、a と b が等しいとき処理Aが実行される。 どちらにしろ、処理Aが実行されたら continueでループ内のそれ以下の処理は飛ばされ 処理Bは行われない。
>309 #include プログラム内でどんな機能を使うかを示すもの。 (もっと正確に言えばプリプロセサへの指示) 例えばC言語の printf scanf などは stdio に C++の std::cout std::endl などは iostream に所属してる。 もっと色んな機能を使いたければ沢山 #include を書くことになる。 但しコンパイルは重くなるし、変数名も関数名も大量になって 好きな名前を付けにくくなる。 「お約束」と言われるのはよく使われる機能が詰まってるから。 stdio も iostream も無しでウィンドウ制御やグラフィックス機能だけincludeしたり プラグインやライブラリなどはそれすら要らないこともある。 ちなみにC++は少し前のC言語を拡張して作られた言語。 なのでC言語のコードはC++コンパイラでもコンパイルできる事が多いけど 逆にC++のコードはC言語のコンパイラではコンパイル出来ないのが普通
>ちなみにC++は少し前のC言語を拡張して作られた言語。 >なのでC言語のコードはC++コンパイラでもコンパイルできる事が多いけど よく判っていないのなら書かなければいいのに。
拡張の過程で仕様変更もあったけど そんなの気にしてるとハゲるぞ。
それよりiostreamとstdio.hはそのままじゃ併用しちゃだめなこと教えてやれよ
int main()でいいとか//コメントが堂々と使えるとか、 むしろはげない方向にいい影響がもたらされると思う。
>>312 gcc にも __FUNCTION__ あるよ
__PRETTY_FUNCTION__ とか __func__ もあるよ
323 :
デフォルトの名無しさん :2008/11/21(金) 16:50:22
struct Hoge{ double data; char *m_name; } という構造体があります。 int main(){ Hoge hoge[10]; char *name[5]={"A","B","C","D","E"}; for(int i=0;i<5;i++){ hoge[i].m_name = name[i]; } } このプログラムってどういう動作ですか? 特に hoge[i].m_name = name[i];この部分です。 構造体のメンバーであるchar型のポインタに main内で宣言した文字列へのポインタを わたしてるだけでしょうか?
そうです
stringr name[5]={"A","B","C","D","E"}; char test[10]; strcpy( test, name[i].c_str() ); これは実体のコピーですか? そもそもstringr name[5]={"A","B","C","D","E"}; この宣言はどういう意味ですか?
stringrはstringの間違いです
>>325 そうです
string5個の配列で、各stringはconst char*引数を取るコンストラクタに "A" などを渡して初期化する、ということです
>>327 つまり文字数+nullのchar型の配列5個宣言するみたいな感じですか?
いいえ、まったく stringクラスはもっとずっと複雑な動作をします
ある意味糖衣構文の塊みたいな宣言だな。
実装が気になるならソースをみるんだ basic_string<>を
VisualStudio2005proで開発中です。 USBのシリアルキーを読むプログラムを作成したのですが、 ビルド>実行ではデバッグビルド、リリースビルド共に問題ありません。 しかし、ビルドしたあとに生成されたプログラム(○○.exe)を実行すると 共に正しく動作しません(シリアル番号が読み取れない)。 ○○.exeを右クリック>別のユーザーで実行する>管理者権限 でやっても同様の結果になります。 なにかしら解決へ向けてのヒント等いただければと考えています。
>332 カレントディレクトリの違いにより DLL や依存ファイルの読み込みに失敗しているとか。
>>333 レスありがとうございます。
DLLが読みこみに失敗した場合はOSによるエラーが出現すると考えていますが、
どうでしょうか?
依存ファイルは#pragma commentによるlib、設定した追加インクルード系くらいしかありません。
現在、fwprintfでテキストアウトしながら、挙動を調べています。
どうやって読み込んでるのかわからんけど GetLastError()は何か返してないの
336 :
332 :2008/11/24(月) 12:57:22
>>335 レスありがとうございます。
GetLastErrorを使いながら、原因を探り無事問題解決しました。
肝となる変数がとなる関数内部のローカルなアドレス値を参照しており、
それを関数外で参照してしまいこのような原因を引き起こしておりました。
初歩的なミスをしておりました。
スレ汚し申し訳ありませんでした。
100年ROMります。
超初心者な質問で恐縮ですが、 デフォルトコンストラクタに初期化リストを書いて宣言した場合、 引数付きコンストラクタでもその初期化はなされるのでしょうか? それとも同じ初期化リストを書かなければならないのでしょうか?
書かなければいけない。
339 :
デフォルトの名無しさん :2008/11/24(月) 21:14:15
C言語の配列・文字列で質問があります。 入力した文字を逆から出力するプログラムを作っているのですが どうも上手くいきません。 char str[4]; str[0] = `a`; str[1] = `b`; str[2] = `c`; str[3] = `\0`; とあり、逆から表示したい場合、 str[3]から出力していけば良いと思っているのですが、 ループを設定しても何も出力されませんでした。 ググってもポインタ等を使うやり方が多くて見当もつきません。 いったい、どうやれば出力されるのでしょうか?
>>339 __, --──−、_
/::_, -‐─ ‐-、_::::`‐-、
. /::/ `‐i:::::::ヽ
|:./ ',ミ::::::}
}:l lミ::::::l'
_!,'_ ,..-- ..、 __ !::::::::|
lヽ! `i ィェッ、.i'゙"i';;;ィェッ;,`i===,、
',.l ゙、゙゙゙゙゙,ノ ヽ_"゙゙ ゙/ r;;;;;;/
i|  ̄,' ::::ヽ `''" .,{;;;;;;/
',. ゙`-"゛'' ,};;;;;;'
! ,_、,___, /;;;/"
_,` 、 /;;r'
_,, -─ '';;;;;;;;;| 、ヽ,,____,,-‐';;;;;;;;;;;\_
;;;;;;;;;;;;;;;;;;;;;;;;;;| \ _//;;;;;;;;;;;;;;;`ヽ、
;;;;;;;;;;;;;;;;;;;;;;;;;;| r‐ィt- '" /;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;| /,彡彡} ,!;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ツレマスカ [Vladimir Tzlemazka]
(1915-1997 ロシア)
>>339 int i=4;
while(i--){
printf("%c", str[i]);
}
str[0] = 'a'; str[1] = 'b'; str[2] = 'c'; str[3] = '\0'; の逆は str[0] = 'c'; str[1] = 'b'; str[2] = 'a'; str[3] = '\0'; ではないだろうか
343 :
デフォルトの名無しさん :2008/11/25(火) 00:25:46
.Netで開発したアプリケーションからWin32のDllをLoadLibrary関数で呼び出して そのDLLからダイアログを表示させようとしています。 // グローバル変数でCDialogから派生したクラス CCertifier *crtDlg; // 以下2行。どこかの関数内部 crtDlg= new CCertifier; crtDlg->DoModal(); のコードでDoModalを呼び出したところで"Debug Assertation Failed!"のダイアログが出て来ます。 出来ればモーダルウィンドウの方で表示させたいのですが、そちらの方のコードでも同じ症状が出ています。 何方か原因を分かる方などいらっしゃらないでしょうか? 一応環境はWinXP、開発環境はVS2005です。
ダイアログテンプレートを指定してないとか
DLLとして呼び出す関数内のstatic変数は、DLLをアンロードしたときに削除されるのですか? そして再びDLLをロードした後で関数を呼び出すと、再度作られるのですか?
その関数内でDLLを呼び出すかどうかによって、関数内でstatic宣言した 変数の扱いが変わると思うその理由とは? C言語からおさらいしてこい。
347 :
343 :2008/11/25(火) 11:03:45
どうも、ご回答ありがとうございます えっと、CCertifierクラスは 「リソースの追加」でダイアログ追加→「クラスの追加」→以下作成ウィザードで作成 で作成したものなので、ダイアログテンプレート等の基本的な所は全自動のはずです
ありがとうございます。 DLLのロードを行う関数ではなくて、DLLモジュール内の関数という意味でお願いします。
モジュール破棄時にstatic変数も破棄という理解であってる、ということでしょうか。
>>350 破棄されないと使えるメモリがどんどん少なくなるよ
352 :
デフォルトの名無しさん :2008/11/25(火) 17:09:36
基本的なことを質問させてください。 newで確保した変数はdeleteで開放する必要がありますが、普通の変数や配列は自動的に開放されるのですか?
はい、そうです
354 :
デフォルトの名無しさん :2008/11/25(火) 17:26:53
どーもありがとです
C++の初心者向けの本でオススメの本があったら教えて下さい。
はい、そうです
どーもありがとです
初歩的な質問なのですが、 みなさん童貞ですか?
はい、そうです
どどどど
361 :
デフォルトの名無しさん :2008/11/26(水) 18:26:23
初歩的な質問なのですが、クラス内の関数にvirtualがついていた場合、 その関数は実行することは出来ないという理解で良いでしょうか?
全然違う。 継承を勉強してないうちは気にしないでいい。
>>362 仮想関数で、サブクラスに実装を任せた云わば雛形的な役割だと思っていたのですが・・・
実行はできるのでしょうか?
というのも、いま読んでいるコードでは親クラスでvirtual関数で定義し、継承したクラスでもvirtualを付けているにも関わらず内部を実装しているので、virtualが付いていても実行できるのかと思いました。
長文で初歩的な質問失礼しました。
そりゃどっちのクラスでインスタンスを作ったかによるだろう。 >サブクラスに実装を任せた ってのは = 0 をつけた純粋仮想関数のことじゃないかな。
それと、基底クラスの同シグネチャの関数にvirtualが付いていれば、派生クラスの関数も仮想関数になる。 派生クラスで、オーバーライドする関数にvirtualを付けるのは、それを読む人間相手の目印でしかない。
インスタンスは new 子クラス名 となっているので継承した側だと思います。 他にこの仮想関数をオーバーロードしているところもないので、このvirtual付き関数を呼び出しているようにしか見えないのですが…
>>366 真面目に勉強する気が無いなら人間やめとけ。答はちゃんと書かれている。
368 :
デフォルトの名無しさん :2008/11/26(水) 21:43:02
>>361 簡潔に言うと、
ふつうのメンバ関数はコンパイル時に静的にバインドされるが、
仮装関数は実行時に動的にバインドされる
printfで表示させるときに , を表示させようとするとなんか上手く表示されません カンマを表示するにはどうすればいいんですか?
>>369 そうやって質問するってことは、
printf(",");
じゃダメなんだろうな。何がしたいのかわからんから答えようがない
>>369 1000の位のカンマなら、SUSv2独自だから他の環境では大抵巧くいかない。
はじめて質問します。 FreeBSD+GCC 3.xをつかっているのですが、 #define BUF_LEN 1024 char buffer[BUF_LEN]; FILE *tokenlist; のときに、 fgets(buffer, BUF_LEN, tokenlist); を実行すると、セグメンテーションエラーがおこることがあります。 しかしいくら原因を考えてもわかりません。 そもそもfgetsはセグメンテーションエラーがおこらないようつくられた関数ときいていたので困惑しています。 ほかの環境(Linux+GCC4、Cygwin+GCC4)では問題なく動くため、BSD特有の現象なのでしょうか? ご教示お願いします。
tokenlist にはなにを入れてるの?標準入力?w
375 :
373 :2008/11/27(木) 21:45:58
>>374 テキストファイルです。1行ずつ読もうとしてこのように書きました。
:問題 リリースビルドしたExeファイルを開発環境で実行する分には正常動作。 他のPCで実行すると下記エラーが出る。 Microsoft Visual C++ Runtime Library [Runtime Error!] This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. :開発環境 VisualStudio2005Pro+WindowsDriverKit6001.18001 :問題起こしそうなヘッダ、ライブラリ 追加インクルードパス>WINDDK\6001.18001\inc\api winmm.lib shlwapi.lib usbiodef.h usbioctl.h atlcoll.h setupapi.h winioctl.h cfgmgr32.h atlstr.h :試したこと DirectX9.0bインストール Microsoft Visual C++ 2005 再頒布可能パッケージ (x86)インストール
>>375 再現可能な最低限のコードを貼ってくれ。
その断片だけ見ても何とも言えない。
378 :
373 :2008/11/27(木) 22:57:18
>>377 わかりました。
次のようにmain関数でtokenlistにファイルを関連づけます。
tokenlistはグローバル変数です。
int main(int argc, char **argv)
{
(略)
tokenlist = fopen(argv[1], "r");
(略)
getToken();
(略)
}
getToken関数でfgetsを行います。
void getToken() {
char buffer[BUF_LEN]; /* バッファ */
(略)
fgets(buffer, BUF_LEN, tokenlist);
(略)
}
このgetToken関数は、その他の関数でtokenlistの次の行の情報が必要になるたびに呼ばれます。
よろしくお願いします。
>>378 にほんごわかりますか?
恐らくどっかでtokenlistを壊しているのだろうよ。
再現する最低限のソースを作る過程で見つかることもしばしばだから
やれと書いているのにそれすらできないんじゃ望み薄だが。
380 :
初心者 :2008/11/27(木) 23:13:54
C++初心者です。 現在、独習C++で勉強しています。 中級者向けの本、お勧めの本などありましたら 教えていただければ幸いです。
中級者向けの定番は Effective C++
383 :
373 :2008/11/27(木) 23:34:00
>>379 ソースが非常に巨大なためその点はご迷惑をおかけしました。
とりあえずtokenlistをあまり長期間保持しないように変えました。
ご教示ありがとうございました。
中級者向けの本って中級者が読むんだよね。 何で初心者が?
385 :
376 :2008/11/28(金) 12:36:14
>>355 Dr.JamsaのC++超入門
自分はこれが一番しっくり来たっす。
>>380 C++標準ライブラリの使い方完全ガイド。
STLは中級者レベル?(初心者レベルだったらスマソ)
>>376 なんですが、他で質問した方がいいですかね?
>>385 状況を細かく噛み砕いてDirectXスレ辺りへどうぞ。
387 :
376 :2008/11/28(金) 12:48:20
>>386 レスありがとうございます。
確かに質問内容がだめでした。
もう少し、”○○を使うと他でエラーが出る”くらいまでやるべきでした。
エラーをもう少し特定して他スレ行ってきます。
ランタイムだろうしな
389 :
デフォルトの名無しさん :2008/11/28(金) 14:52:04
キー入力を求めてる間にも時刻を表示したりすることってできるでしょうか?
>>389 できる環境もあればできない環境もあります。
391 :
デフォルトの名無しさん :2008/11/28(金) 15:00:38
>>390 できる環境の場合のやり方を教えてください。
>>391 できる環境の場合、そうなるようにやります。
その方法は、大抵の場合複数あります。
393 :
デフォルトの名無しさん :2008/11/28(金) 16:17:46
>>392 getcharの実行中はプログラムは止まったままだと思いますが
どうやってやるのでしょう?
getchar使わなきゃいいだろ。 ゲームとかキー入力うけつけながら残り時間表示とかしてるだろ?
395 :
デフォルトの名無しさん :2008/11/28(金) 16:25:51
>>391 Windowsなら
メッセージ処理する
Directinput使う
conio.h使う
など
397 :
デフォルトの名無しさん :2008/11/28(金) 18:09:55
>>395 ありがとうございます。大体分かりました。ところで、下のプログラムを実行すると
main関数のgetchar以降が実行されないみたいなんですがどうしてなんでしょう?
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void thread(void);
int main(void) {
int handle;
pthread_t id;
int c;
handle = pthread_create(&id, NULL, (void *(*)(void*)) thread, NULL);
while(1) {
printf("Main\n");
c = getchar();
printf("Main %d\n", c);
usleep(500*1000);
}
}
void thread(void)
{
usleep(500*1000);
while(1) {
printf("Thread %d\n", (unsigned) time(NULL));
usleep(1000*1000);
}
}
>>397 なんで自分の環境を書かないの?
>397でUnix系と言うことは判ったけど。
で、getchar()で止まっているスレッドよりもusleep()で止まっているスレッドが優先されているだけじゃないのかね。
少なくとも私の環境(cygwin)では巧くいくようだよ。
399 :
デフォルトの名無しさん :2008/11/28(金) 18:30:48
>>398 ありがとうございました。解決しました。
400 :
デフォルトの名無しさん :2008/11/28(金) 21:06:47
なんていうか、かなり変な質問かと思うんですが……。 if文を利用する価値ってどんなもんですか? リアルタイムで変化しうる1万個のフラグがあって、1/60秒ごとに全てのフラグをチェックする必要があるが、if文ひとつでチェックすべきフラグが9千個ほどにまで削減できるとしたら。 if文を入れても入れなくても処理速度は変化しないとすれば、このif文に価値ってありますか?
処理的に入れなければならないifなのであれば、処理速度を問わず、それは存在しなければならない。 最初コストの話かと思ったんだが、そういう風にも見えないのでもう少し説明が欲しい
if文一つ入れることで1割のフラグチェック処理を枝刈りできるのなら割と有意義に思えるけどな
>>400 そのフラグはif文を使わずに何を使ってチェックするのかね。
404 :
デフォルトの名無しさん :2008/11/28(金) 22:47:21
>>401 究極的に言えば、「わずかな処理を省くためにif文を入れるべきか」って話です。
八千個のフラグチェックを削減できるなら「効率化」、五千個の削減も「効率化」、四千、三千も「効率化」と呼べるでしょう。
それなら、千個の削減は「効率化」か、五百個、百個、五十個は……。と考えていくと、どこまでが「効率化」と呼べるのか、と疑問に思ったので。
『状況や環境による』と言われてしまえばそれまでなのですが……。
「ソースを増やしてでも最大限処理を減らすべき」か「体感できない程度の無駄なら無視すべき」か、どちらを優先すべきなのか悩まされてしまいます。
まともに動いてから考えればいいんじゃないの?
どちらでもなく、「速度が問題になったときに考えるべき」だよ。 んで、速度が問題になったときに何をすべきかというと、そのif文を入れることではなく、 そのif文を入れることで問題が解消されるのかどうかを考えるべき。
407 :
デフォルトの名無しさん :2008/11/29(土) 17:02:36
何で矢印キーのエスケープシーケンスって上下右左の順に大きくなるの?上下左右でなくて。
>>407 何でそれが疑問なの? 右と左のどちらを優先すべきかと聞かれたら、普通は右だと思うでしょ。
右は桁を+する方向だし、プラスとマイナスを逆順にしたいやつはいないと思うんだけど。
409 :
デフォルトの名無しさん :2008/11/29(土) 18:50:33
>>408 それだと上下が下上になってないとおかしいと思うんだけど
410 :
409 :2008/11/29(土) 18:54:09
さらに言うとx軸方向が先の方が良くない?数学でよく使うxy平面で言うと右左上下じゃん
日本人は普通上下左右と言うが、これは国や地域で異なる 順番なんてテキトーにつけるしかない
>>409 いやさ、だから何で疑問に思うのか説明してよ。上下に関しては、左上原点なんてのは視野が狭いとしか。
上下と左右の順序については、どちらを重視するかの問題。
>>411 一応人間工学では、上下のボタンを左右に並べざるを得ない場合には右側に上ボタンを配置することになっている。
これはどうやら、右から左に書く文化圏でもその方がいいらしいよ。
たしかにjが下でkが上だな
414 :
デフォルトの名無しさん :2008/11/30(日) 07:33:56
C言語とは直接関係ない質問なんですが クイックソートをwikipediaで調べると 1. ピボットとして一つ選びそれをPとする。 2. 左から順に値を調べ、P以上のものを見つけたらその位置をiとする。 3. 右から順に値を調べ、P以下のものを見つけたらその位置をjとする。 4. iがjより左にあるのならばその二つの位置を入れ替え、2に戻る。 ただし、次の2での探索はiの一つ右、次の3での探索はjの一つ左から行う。 5. 2に戻らなかった場合、iの左側を境界に分割を行って2つの領域に分け、そのそれぞれに対して再帰的に1からの手順を行う。 要素数が1以下の領域ができた場合、その領域は確定とする。 注:このアルゴリズムでは、領域の左端の値が領域内で最小かつ同じ値が他の位置に無い場合 ピボットとしてその値を選ぶと同じ領域を再帰的に呼び出す無限ループとなってしまう。 とあるのですが、この注の意味がどういうことかわからないのですが ピボットが左端で値が最小だとどうして無限ループになってしまうんでしょうか?
>414 コンピュータのつもりになって気を利かさず愚直に書いてあることにそのまま従ってみればいいんだよ。 1. P は左端の最小値 2. i は左端 3. j は左端 4. i == j なので左じゃないから skip 5. i の左側を境界に分割しても左端なんだから今と変わらない 1 領域のまま。1に戻って同じことの繰り返し。
416 :
デフォルトの名無しさん :2008/11/30(日) 12:36:18
C言語の関数名って変数なんですか? なんか関数名を型変換するようなプログラムがちゃんと動いたんで。
417 :
デフォルトの名無しさん :2008/11/30(日) 13:06:23
変数ではないが、先頭アドレスを利用できる。
>>416 関数名は変数じゃありませんが、関数名を参照すると関数へのポインタと言う値になります。
int main(int argc,char *argv[]){ int day; day=atoi(argv[1]); if(0<argv[1]<32){ int foo,baa; かくかくしかじか } else{ printf("日にちは1から31で入力してください¥n"); } return 0; } と書いておけば もしコマンドライン引数が41の場合これはかくかくしかじかは実行されませんよね? どこのバグだかわからなく困っているので助けてください。
420 :
デフォルトの名無しさん :2008/11/30(日) 19:14:52
>>419 0<argv[1]<32
こんな条件文は無いかと
0 < argv[1] && argv[1] < 32
じゃね?
>>420 ありゃ?有りませんでしたっけ
すこしLispかぶれして帰ってきて
たしかCだと一つの括弧でかけるから便利なんだよなと思い
<で挟んでみたのですが、記憶がちがったのかもしれません。
確認してみた所無事に動きました。
非常に助かりました。
422 :
デフォルトの名無しさん :2008/11/30(日) 19:29:51
すみません。自分自身の限界が来たので質問させてください。 Javaで非常にシンプルなボタンの作成をしてみました。 なぜだか、5番目のボタンだけキャプションが表示されません。 環境はWin+eclipseです。 トラブルシュート、ログはたくさん見たのでその他のなにか考えなければならないヒントなどいただけると た す か り ま す public class Test { public void method(){ int i; Button h[]=new Button [9]; int dx[]={1,2,3,4,5,6,7,8,9}; int dy[]={1,1,1,1,1,1,1,1,1}; String st[]={"aa","ii","uu","ee","oo","か","き","く","け"}; Display display = new Display(); Shell shell=new Shell(display); shell.open(); for(i=0; i<9; i++){ h[i]=new Button(shell,SWT.BORDER); h[i].setBounds(dx[i]*50,dy[i]*30,50,30); if(i!=4){h[i].setText(st[i]);}} while(!shell.isDisposed()){if(!display.readAndDispatch()){display.sleep();}} display.dispose();} public static void main(String[] args){ Test test = new Test(); test.method();}}
0 < day && day < 32 じゃなくて? 意図からすると 1 <= day && day <= 31 か?
424 :
デフォルトの名無しさん :2008/11/30(日) 19:34:54
>>422 んあ、c++のスレだった。
スレ汚しスマソ。
Javaに言ってきまふ。
422は無視してくだせい。
> day=atoi(argv[1]); > if(0<argv[1]<32){ ・折角数値に変換したのに、元の文字列と比較してどーする ・C/C++では a<b<c という条件式は 文法上は書けるが、見た目とは相反する動きになるから a<b && b<c と書くべき (普通の処理系なら a<b は成り立てば1、成り立たなければ0 a<b<cは、(1か0)<c という式として翻訳されてしまう)
すみません。 ユーザーがランダムな順番で入力した四角形の4つの頂点座標のCPoint型(x,y座標を保持)の変数の中から 四角形の左上の頂点がどれかを判定したいのですが うまい方法が思いつきません。 1番左 かつ 1番の上の座標を求めれば良いだけジャン…と思っていたんですが //CPoint cp0, cp1, cp2, cp3には既にx,y座標が代入済みとする //四角形の左上座標がどれか4つの中からを決める CPoint tmp; tmp = cp0; if ( tmp.x >= cp1.x ) if ( tmp.y >= cp1.y ) tmp = cp1; if ( tmp.x >= cp2.x ) if ( tmp.y >= cp2.y ) tmp = cp2; if ( tmp.x >= cp3.x ) if ( tmp.y >= cp3.y ) tmp = cp3; return tmp;//左上座標を返す 長方形だとこれで問題なさそうなんですが、例えば極端に歪んだ平行四辺形とかだと 左から2〜3番目の頂点が左上頂点だったり(例:上底、下底が水平で下底が思い切り左に寄っている) 上から2〜3番目の頂点が左上頂点だったり(例:右辺、左辺が垂直で右辺が思い切り上に寄っている) 等のケースに対応できません。
>>426 左上って定義が曖昧すぎないか?
全てのパターンを分ける以外方法無いと思う
つまり、こういうケースか? _ / \  ̄ ̄ ̄ 「左上」自体の定義によっては一番左の点が左上かも知らん。
429 :
426 :2008/11/30(日) 21:40:33
>>427 うーん。人間にとっては迷うことなく一意に決められそうですけど
いざ言語化して厳密に定義するとなると難しいですね…
>>428 の図をみて思ったのですが
◇(菱形)みたいな形だとどれが左上か厳密に決められないので
「上底下底が水平 or 右辺左辺が垂直な四角形(台形)に限定する」
とすると決まりそうですね。
「その頂点のx座標より右側にx座標があればひとつにつき1点ずつ、
その頂点のy座標より下側にy座標があればひとつにつき1点ずつ
の評価点を加点し、最も高い評価点の頂点を左上の頂点とする 」
>>428 の台形だと
上底の左側の頂点:右2点、下2点、計4点
上底の右側の頂点:右1点、下2点、計3点
下底の左側の頂点:右3点、下0点、計3点
下底の右側の頂点:右0点、下0点、計0点
で「上底の左側の頂点」が左上
あ、なんとか行けそうです。有難うございます。
たぶん漏れるケースはないかと…
そうまでして左上を定義する意義が判らん。
431 :
426 :2008/12/01(月) 00:21:31
左上にこだわるというか 4つの座標の入力順が狂っていても治す必要があったので 実際には右上と右下と左下も決めます。
一番上で一番左じゃダメなんだろうか。
erase() がイテレータを返すコンテナでは list<foo, bar>::iterator it = xmap.begin(); while (it != xmap.end()) { if (it->finished()) { it = xmap.erase(it); } else { ++it; } } とかやりますが、イテレータを返さない、たとえば map とかで for (map<foo, bar>::iterator it = xmap.begin(); it != xmap.end(); ++it) { if (it->second.finished()) { xmap.erase(it); } } みたいなのは大丈夫なんでしょうか?
>>432 今回の場合は、一番上だが一番左じゃないケース、一番左だが一番上じゃないケースに対応する必要があったんじゃないかね。
>>431 それならもう入力段階で弾くか正す方が早いかと
>>434 いやだから、一番上を優先して、一番上なら一番左じゃなくてもいいことにすればいいんじゃないかってこと。
少なくとも私なら、そうする。それなら、上下が等しい場合のみ左右をチェックすればいいから効率もいい。
___ / / \ / \/ 上底の左側の頂点:右2点、下2点、計4点 上底の右側の頂点:右0点、下2点、計2点 左の頂点:右3点、下1点、計4点 下の頂点:右1点、下0点、計1点
左上とか右上とか位置を決めて何がしたいの? 四辺がねじれないように描画したいとか?
>>436 ああ、一番上でも一番左でもないケースがあるわ。
でも見た目的には左上に見える。
/|
/ |
 ̄ ̄
こんなのとか。
こんな図形絶対データに入らねーよ!とかなら構わんけど、
俺はあんたの作りだとすげー気持ち悪い感じがする。
対応漏れが意図的で、かつ仕様として問題ないんなら良いんだけどね。
440 :
436 :2008/12/01(月) 02:46:32
>>439 それ、上から順でなんか問題があるのか?
元質は、左上だけを決定したいのではなく順序を決定したいらしいぞ。
順序なんてどこに書いてあるんだ…? 今回の質問は、四角形の各頂点座標から (菱形みたいな明らかに決定不能な場合を除いて) 左上、右上、左下、右下をそれぞれ決定したいってことだろ。 例えば一番上が右上の場合、それが左上として認識されてはいけないのでは?
442 :
426 :2008/12/01(月) 06:10:59
>>435 え〜と。入力段階で弾くために判定をしています。
>>437 >>439 >>429 で取り敢えず決めた「上底下底が水平 or 右辺左辺が垂直な四角形(台形)に限定する」
に反するのでその形状はご勘弁を…
>>436 それだと極端に歪んだ平行四辺形(例:右辺、左辺が垂直で右辺が思い切り上に寄っている)
/|
| |
|/
に対応できないもので…
ただ、「そもそも左上を厳密に決めない」という手も確かにありますね…
本当の最終的な目的は
「ユーザーが適当な順番で入力した座標4点の四角形の範囲を
1ピクセルずつ拾って画像処理をするための座標を計算したい」
ですので必ずしも左上を厳密に決めなくてもなんとか計算できるかもしれません。
(パッと今は思いつきませんが)
凸図形なら座標平均の左上で行けそうな気がするけど ブーメランみたいな凹図形だと厳しいな。
444 :
デフォルトの名無しさん :2008/12/01(月) 09:50:42
画像処理で使うなら左上って言うのは 上を優先して次に左を優先じゃね?画像処理したことないからよく分からんけど。
外接する長方形の左上の点から最も近い角じゃないかという気がする。
等距離の場合も有るよ
タッズン…???
x+yが最小の点が左上じゃないのか 439にも対応できるぞ
既出の事を別の言葉で言い換えたんですね、わかります。
>>449 >>439 をひたすら縦に引き伸ばしてから同じことを考えるんだ
明らかに右上の座標のx+yのほうが小さくなる
452 :
426 :2008/12/02(火) 07:03:11
>>426 は仕様を明確にしろ。
(0,0)と(0,1)のどちらが左上だ?
凹四角形の扱いはどうするのだ?
455 :
デフォルトの名無しさん :2008/12/02(火) 17:33:01
int a[100]; int b[100]; bの[0~99]までの全内容を a[0~99]にfor文とかmemcpyやmemmoveとか使わないで 代入する方法なんてありますか・・・?
>>455 a[0]=b[0];
a[1]=b[1];
a[2]=b[2];
・
・
・
a[99]=b[99];
移植性なんて知らない。 struct array_of_int_100 { int array[100]; }; int a[100]; int b[100]; *(struct array_of_int_100*)a = *(struct array_of_int_100*)b;
std::copy(b, b + 100, a);
gcc拡張で a = b;
a|oven::copied_to(b);
文字列データから文字列をサーチじゃなく、 バイナリデータからバイナリ列をサーチする関数、STLないですか?
boost::xpressive
C++初心者です。 list<int> list[M][N]; みたいな2次元配列って出来るんですか?
マルチすんな初心者だからってのは免罪符にゃなんねーぞ死ね馬鹿 できるよ
466 :
デフォルトの名無しさん :2008/12/02(火) 20:55:07
C/C++に詳しい方々よ。 質問があるのでどうか答えてほしい。 C++とVB.NETで両方ともオブジェクト指向でわけわからんになってしまった経験があるのだが。オブジェクト指向って本当に必要なんですか? コンピューターの世界で無理やり知らなければならないような方向に誘導されてるような気がするのですが。 オブジェクト指向は効率的なプログラムを組むために必要だとか利便性を説いてるが、かえって複雑になって習得が難しくなってる気がする。 Windows上でツールを作ることを目的としてプログラミング言語を2,3勉強したが。身についたのはC言語だけ。 もうこうなったらオブジェクト指向はさっぱりあきらめてC言語だけで行こうかと思ってるのですけど。 C言語でアプリやツール、ゲームをつくる需要は今後も残るのでしょうか?
>>466 俺は詳しいとはいわんが、C の需要は残ると思う。ただ、アプリ、ゲームを
チームで全てCで作ることはあまり無くなるだろう。一人で作るなら勝手に。
ドライバとか低レベル(悪い意味で無くて)のものはCで残るものがあるはず。
ただ、オブジェクト指向使えた方が楽だと思うんだけどなぁ…
(C→C++,Java と来た人だけど)
他の人の意見も見てみたい
リア厨房の頃HSPから入って「関数?クラス?いらねーよ」とか言ってた私ですが
今ではすっかりC++に馴染んでオブジェクト指向じゃないと面倒だと感じるようになりました^q^
>>467 の言う通り完全に需要がなくなることは当分無いと思う(実際COBOLとか未だに需要あるし)けど、
やっぱり自分一人という範囲に限らないならオブジェクト指向の知識は必要だと思う。
ライブラリの類もオブジェクト指向前提のものは多いしね。
極端なこと言えば、オブジェクト指向なんて当たり前のことに名前を付けただけ。 みんながむやみやたらと唱えるバズワードと化してしまったのがだいぶ前から。 あと、Cで書かれたプログラムだってオブジェクト指向的な部分はいくらでも指摘できる。 もちろん、Cはオブジェクト指向プログラミング言語ではないし、 そこで書かれたプログラムにも、オブジェクト指向プログラミングでよく見かける特徴は あまり見出せないけど。
>>466 気持ちはすごいわかる。
自分もそんなに分かってるわけじゃないけど、世間のオブジェクト指向って
それっぽい文法を採用してるよ、ってぐらいなので、そんな気にすることはないと思う。
言語体系が複雑になっているのは、汎用性とのトレードオフじゃないかね。
C言語のコアはシンプルだけど、何かするなら結局OSのAPIとか使わないとならない。
Javaみたいにそれ全部仕様に含んじゃうと、当然仕様は膨らんじゃう。
仕事でチーム作業の場合 C++で統一するってのは仕方ないだろうね
でも自分は C で作ってる。必要最小限のコードで済ませられるし、
プログラムとかプロセスのレベルでシステムを設計すれば、実際のところ
言語はなんでもいいしね。
>>466 そのうち慣れるって。
慣れたらもう戻れないけどね。いや、戻れるけど
クラス無いのきびしーって思うようになるよ。
関数やローカル変数なかったらきびしーなんてもんじゃないけど。
そういえばCOBOLには無いんだっけw
472 :
デフォルトの名無しさん :2008/12/02(火) 21:26:04
>>467 ご回答ありがとう。
C++とVB.NETと一通り勉強したけど、自分でオブジェクト指向でプログラムつくれなくて挫折したわ。
これを理解できるのはかなり頭のいい人だろうね。
趣味でプログラミングをやってるので、チームワークの必要なことはしないし知ってるのは唯一自分でコードが書けたC言語だけでいいかなとも思った。
ところで質問をもうひとつしますが。
ウェブブラウザのFirefoxってフリーでソースが公開されてるけど、
ビルドするのにGCCを用いる様だけど、これってC言語でできてるのでしょうか?
デザインパターンの本を読むと オブジェクト指向で何がしたいのか分かると思う
>>466 確かに色々と覚えることがあって回りくどくて面倒なんで
うんざりするほどその気持ちはわかる。
自分もそう思っていたんで。
でも、とりあえずクラス化したら楽だと思うんだ。
慣れないうちは全部publicなメンバでも良いと思う。
関数名とか変数名とかdrawとかxみたいに短くても楽に管理できるし。
それだけでも重宝するかと。
475 :
デフォルトの名無しさん :2008/12/02(火) 21:59:58
>>474 なんだか知らないけれど新たにがんばってみようと言う気になったわ。
ありがとうよ。
C++ は気張って OOP とか言わずに、Cに STL があると思った だけで大分便利。ついでに自分で template 書けるようになると もっと便利。そんなことしてるうちに自然と OOP。
OOPってそんな気張ったモノでもないよ ファイル処理関連はどの言語もOOPみたいなもんだ 単に語順と追加機能の有無だけ
入門書みつつ文法を1から学び、日々黒い画面の中で動かしているのですが 左上に「ファイル」、右上に最小化最大化閉じる、といったものがある普通のアプリの段階にはいつ入るものなのでしょうか? あるいはこういった骨格みたいなの?は入門書的にはなんという項目から始まるものなのでしょうか
>478 入門書は普通、CやC++の基礎部分を解説するもの ウィンドウシステムは応用部分にあたるので 入門書ではあまり語られない 一通り入門書を触ったら、Visual C++ Express 辺りを落として インスコした Visual C++ をテキトーに弄ったり Windowsプログラミングの書籍を読んで勉強するヨロシ
C言語はUNIXでもWindowsでもMacでもLinuxでも使うけど ある程度共通項が多い上扱いやすい stdio に対して ウィンドウシステムの扱いは各環境でバラバラ。 そしてその多くはそれだけで本が1〜数冊書ける複雑さ。 直接扱うのは複雑だからと、簡単に扱うためのライブラリもある。 (WindowsならMFCや.net、LinuxならTkやGTKやQtなど) それから、色んな環境で扱えるように作られたライブラリもある。 (wxWidgetとか。.netやTkも一応互換環境がありこっちにも分類可能) 環境も手段も多様で、総てを統括するのは困難。
>>479 -
ありがとう、また文字を表示する作業から勉強しなおしてきます
483 :
デフォルトの名無しさん :2008/12/05(金) 09:10:33
void * (*)(void *) 型の意味を教えてください
なんかよく解らんポインタを引数にとって、なんかよく解らんポインタを戻す関数へのポインタ
それなりに的確な説明なのに何故か笑ってしまったw
486 :
デフォルトの名無しさん :2008/12/05(金) 11:47:41
日本語のcdeclプログラムを作ってみないか?
どこまでを設計と呼ぶのやら
すっまん。誤爆だ。忘れてくれ。
アクセス制御ってぶっちゃけあんまいらなくね?
まぁ個人でやっている分には間違ってメンバ変数を弄って困ってしまうって状況は想像つかない。 アクセスできなくて困ることはあるが。
ところで int v(char *c){int i;sscanf(c,"%4d",&i);return htons(i);} この関数をもっと短くする方法あるかな? Code Golfの感じで。 引数のcharポインタは"YYYYMMDD"といった数字文字列の領域を指してると思いねぇ。
>491 七行スレのログ読めば短くするノウハウが沢山あると思う
charと*の間の空白も不要。
495 :
デフォルトの名無しさん :2008/12/08(月) 08:24:27
POSIXスレッドのmutexロックって標準でデッドロックを回避してくれますか?
496 :
デフォルトの名無しさん :2008/12/08(月) 11:20:15
498 :
デフォルトの名無しさん :2008/12/08(月) 11:51:55
>>497 型キャストすれば特定のサブクラスのみが持つようなメンバ関数にアクセスすることができる。
reinterpret_castだったかな?
異なるクラスを IExample として共通に扱いたいのであるから、 特定のサブクラスのみが持つ特殊なメンバ関数などには興味がないはずである
例えばですが、
>>497 のサイトでCExample3という、IExampleを継承したクラスを追加するとして、
IExampleがもしMethod2()というメンバ関数を持っていたら、
大幅な修正を加えないとMethod2を呼ぶことができないように思います。
理解が足りないのでしょうか…
C++は難しいです
リロードせずに書き込んでしまいました。
>>498 レスをありがとうございます。
スーパークラスからサブクラスへのキャストはあまりよろしくないと聞きました。
実際は使っても良いものなのでしょうか。
それとももっと別の書き方をするのでしょうか。
>>499 レスをありがとうございます。
ということは、特殊なメンバ関数を使いたい場合には、
やはりどういったクラスがあるかを確認して、
そのクラスの型を持つポインタを用意する必要があるということでしょうか。
しかも500はIExapmleがじゃなくてCExample3が、の間違いです。すみません
なんか課題でテンプレートを使ってジェネリック関数のsearch(b,e,b2,e2)とcopy(b,e,d)と partition(b,e,p)を定義しろってのがあったんだけどだれかおしえてくだしあ><
なんとなくですが
>>499 さんの仰ることがぼんやりとわかった気がします。
頭の回転が遅いので、これをヒントにもっと考えてみます。ありがとうございます。
>>504 Javaを学ぶと良い。言語仕様にInterfaceを含んでいる。
>>501 特定のサブクラス固有の特殊なメンバ関数を使いたいというのは、
すべてのクラスを共通のインタフェイスで扱いたいという趣旨に反している
設計がどこかおかしい
>>503 template<class T>void copy(T * b, T * e, T * d) {for (; b != e; ++b, ++d) *d = *b;}
他は仕様が余りに曖昧なのでパス。
例えばこんなのとか? template<typename FI, typename PRED>FI partition(FI b, FI e, PRED p) { if (b == e) return b; while (p(* b)) if (++b == e) return b; FI n = b; while (++n != e) if (p(* n)) swap(* ++b, * n); return b; }
p(* n)<ーどういう意味?
イテレータbの指す値を引数にして関数オブジェクトpを呼ぶ
すまん、イテレータnだった
答えてくれてどうもありがとう。 でもなんか動作がほんの少しちがうようだ。原因は不明
そりゃぁ、仕様を提示しないで動作が一致したら凄いと思うよ。 つーか、>508ってSTLの実装じゃないの?w
virtual void UpdateMatrix( const Matrix &parent ){} ここで「unused parameter 'parent'」のWarningが出てしまいます。 コンパイラを変える コンパイラオプションを変える #pragmaで抑制する 以外の簡単な解決法があれば教えてください。
virtual void UpdateMatrix( const Matrix & ){}
気付くという話じゃない。文法書読め。
518 :
デフォルトの名無しさん :2008/12/08(月) 21:46:41
#include <stdio.h> class CHoge { const int path; // ここでのconstがエラー? public: CHoge(); void Show(); }; CHoge::CHoge(){ path = 1024; } void CHoge::Show(){ printf( "%d\n", path ); } void main() { CHoge hoge; hoge.Show(); } 上記のソースでコンパイルするのですが error C2758: 'path' : オブジェクト コンストラクタの初期化リストで初期化されませんでした。 とコンパイルエラーがでます const int path を int path にするとコンパイルは通るのですが、 pathをconstにして変更不可にしたい場合どのような手段があるのでしょうか?
CHoge::CHoge(){path=1024 ;} ↓ CHoge::CHoge() : path(1024){} constなんだから代入できるわけ無いだろカス
ん? ではどうしろと?
ちゃんとどうしたらいいか書いてくれてるじゃないか
>>521 参考書にはその書式載ってなかったんだ
ありがとう
#include <stdio.h> class CHoge { const int path public: CHoge(); void Show(); }; CHoge::CHoge() : path(1024){} void CHoge::Show(){ char lo[path]; // ここでエラー printf( "%d\n", path ); // ここはOK } void main() { CHoge hoge; hoge.Show(); } う〜ん error C2057: 定数式が必要です。 error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。 error C2133: 'lo' : サイズが不明です。 とエラーがでるんですが、#define の変わりにはならないんでしょうか?
C++ってconstなメンバに何の修飾もなくアクセスできるの? CHoge::pathとかいろんな言語でありがちな書き方だと思うけど
エラーが出た箇所よりも後ろについてここはOKと判断するのって危ないよねえ
satic つけろ static あとそうすると定義方法が変わるけど
Cでは const 修飾した変数は定数として使えないけど C++ではできるよ
static const int path = 1024; これ、クラス・関数外ならstaticは要らない。
c++で例えば while(a!=c) a++;この文ってa++だけ繰り返すんだよね?
>>523 static ではない const は「インスタンス生成後に書き換えないよ」というだけで
コンパイル時に決定できないかも知れない。なので、
>#define の変わりにはならないんでしょうか?
ならない。ここは素直に頭に static 付けて、後ろに = 1024 付けるよろし。
但し、もし VC++ 6.0 だとこれもできないんで enum hack 使うしかない。
>>529 是。
532 :
530 :2008/12/09(火) 12:42:49
あああ「是」じゃわかんねーよ馬鹿>俺 そです。おk。
>>529 a!=c も繰り返すよ、というのが正確だけどまあいいか
>while(a!=c) a++; なんでa=c;にしないの
aとcの型がcopy constructibleとは限らないから他
そこは assignment compatible というべきだな。
オーバーロードしてて副作用があるかもしれない。
>532 大丈夫、中国語では「そう」って感じの意味だ
是非
宗介「肯定だ。」
そーすけってポニョの?
>>539 「是」は「はい」だ
「対」が「そう」に近い
>543 対か。謝謝。
元々、「是非」と言う言葉は「是が非でも」だ。 つまり、「「はい」ではなく「いいえ」だとしても」という意味だね。
546 :
デフォルトの名無しさん :2008/12/10(水) 09:24:26
ここなんて中国語スレ?
ちょっとした疑問が浮かんだんですが、 scanf()は入力したものを受け取る関数だと思うのですが、 受け取れる箇所は1つだけなのでしょうか? 例:scanf("%d",&a)は10進数で受け取り、aに保存?すると思いますが scanf("%d",&a,&b)のように複数に保存できるようにはできないでしょうか? 変な質問でスマソ、意味がわからなかったら軽くスルーしてください orz
549 :
デフォルトの名無しさん :2008/12/10(水) 12:48:08
//空白区切り scanf("%d %d", &a, &b); //コンマ区切り scanf("%d,%d", &a, &b);
scanf("%d",&a); b=a; とするしか。
なるほど、一つの入力を「複数に保存」と捉えたのか。 馬鹿だな。
552 :
デフォルトの名無しさん :2008/12/10(水) 21:41:53
Visual C++を使用していて、ちょっと困ってしまったので助けてください。
下記画像のようにスペース部分に色つき矢印やらドットやらが表示されて消えなくなってしまいました。
どこかでキーボード押し違えたみたいで・・
この設定の解除の仕方を分かる方いたら教えてください><
↓
http://imepita.jp/20081210/770880
553 :
デフォルトの名無しさん :2008/12/10(水) 21:42:55
MAKEFILEでどうしても分からない事がありますので、 お教え願いたいのですが。 #-------------------------------------- リンカ(GUI) linkexe = $(linkopt) -Tpe -aa #-------------------------------------- リンカ(CONSOLE) linkcon = $(linkopt) -Tpe -ap #-------------------------------------- リンカ(DLL) linkdll = $(linkopt) -Tpd -aa linkconとlinkdllのマクロが使用されている箇所が、 この行以下にはありません。 しかし、linkconとlinkdllの記載を削除すると、リンク時にエラーが出ます。 $(name)T.EXE: FOO1.OBJ $(sobj) $(name)T.RES $(linkexe) @&&| $(C0GUI) FOO1 $(sobj) $(linkout)$. !if $(UseBCC) $& $(DebugLib) NOEH32 IMPORT32 CW32 !endif $&.RES | 質問 @リンクエラーでは、 $(linkexe) @&&| という部分に関係がしていると思われるのですが、 @&&| の意味が分かりません。この意味について教えて頂けませんでしょうか。 または参考になるサイトがあれば、そちらを教えて頂きたいです。 A$(linkout)$. $. の意味も分かりません。
>>553 Make専用スレへどうぞ。
>>552 VisualStudio専用スレへどうぞ。
どちらもC/C++の質問ではありませんね。
555 :
552 :2008/12/10(水) 22:31:10
失礼しました。移動します。 またよろしくお願いします。
556 :
553 :2008/12/10(水) 22:32:45
失礼しました。移動します。 またよろしくお願いします。
557 :
なめ :2008/12/10(水) 22:39:29
ID 名前 性別 というフォーマットのファイルがあるとします。 これを、それぞれを文字列として、構造体に格納するとします。 構造体の例: struct{ std::string a; // IDを格納 std::string b; // 名前を格納 std::string c; // 性別を格納 }_dataType; 各行には、上記の3つのレコードだけだとして、 区切り文字は、半角空白か、Tab('\t') 行末には空白文字は許容するけど、それは、構造体の「性別」を格納する変数には 含まない てな条件で、データファイルを読み込む場合、 std::stringで、std::getline() を使う char * で、fstream::getline()をつかう char * で、fgets()を使う その他 どれが一番楽なのか教えてほしいっす。できれば、切り分けするところのサンプルなんかも。。。 環境:gcc + cygwin できれば、Linuxにも流用したいので、Win系のライブライは使いたくないです。
>>557 短絡的な意味で最も簡単なのはfscanfだろうね
FILE * fp = fopen("foo", fp); char tId[1000]; char tName[1000]; char tGener[1000]; fscanf(fp, "%999s%999s%999s", tId, tName, tGender); fclose(fp); _dataType foo = {tId, tName, tGender};
>>551 そういう質問みたいだが。
>>548 >scanf("%d",&a,&b)のように複数に保存できるようにはできないでしょうか?
>>557 楽なのは stream I/O で >> 演算子。
>>560 無根拠に1000とか。
scanf("%d %d",&a, &b) としたいだけだろ。b)を全角で書くような奴の質問だぞ。
scanf()使うなら戻り値もみとけ。
bool型のフラグの状態を判定させるのって簡単になにかないですか? if elseで場合わけしてっていうのならわかりますが
「判定」と「場合わけ」の違いを定義してくれたまえ。
場合分け: (p→r)∧(q→r)→(p∨q→r) 判定: (true→true)∨(false→false)
bool で if/else より簡単な場合分けの方法があるのか・・・? 言いたいことがよくわからん。 複数のフラグをint型の変数に保存していて、その簡単な取り出し方法 ということなら (質問の意味は) わかるが。
フラグの状態を判定じゃなくて"反転"でした・・・ すいません
当然 ! よりも簡単な方法を求めているんだよね。
if(flag == true) flag= false; else flag = true; これを一発でかけないものかと思ったんです
flag=!flag;
flag ^= true; flagがtrue, 0以外の値を取るときはだめ
まさしく flag = !flag; だな
flag = (flag == true)? false: true; なんて書くなよ。
そもそもif(flag==true)とか書いちゃう辺りが初心者だなあ 真偽値が入った変数ならif(flag)で良いのに
>>576 if や while の条件式には比較演算子がないといけない、と
思い込む人が多いね。
>>576 そうしたほうがわかりやすいから、わざわざそうしてるよ
logical equalの単位元がtrueだからp==trueなんていうのはp*1とか書いてるのと同じぐらい冗長
というお話だったのさ…
心配症なもんで、 if ((flag==true) == true) と書かないと気が済まない。
>>579 実行コードに差は出ないからどっちでもいいじゃん
>>582 話題を実行コードに限定して「差は出ない」とか、どんだけ勝手なんだ。
>>582 使ってない変数を放置とか、変数名に適当に連番つけちゃうタイプでしょ。
どうせ実行コードには関係ないしーって。
>577 というより、初心者は条件式について誤解してるんだよな。 ifやwhileが条件式を要求してる=条件式を解釈してると思ってるみたいな。 ・条件式は値を返す ・if、whileなどは値が真か偽かを見てるだけ ということを理解出来たらそんな誤解しないんだけどね。
俺はあえて比較することはあるな。 if((hoge=func()) != 0) 条件式の中で代入すんなって言われそうだがw
587 :
582 :2008/12/11(木) 16:03:11
条件式いれた方が、万人にわかりやすいから、そうするだけ。 変数名はきちんとつけるよ
>>586 hoge=func()がブール型でないなら、!= 0はありだと俺は思うよ。
ブール型なら、次のどっちかにするけど。
1.
hoge = func();
if (hoge)
2.
if (bool hoge = func())
>>587 int i = 0; // iに0を代入
こんなコメント付けるタイプですね?
しない奴は、無い方がわかりやすいからしないんだよ。
そうそう。余計なものは無いほうがよい だからお前修正前のコードを#if 0で残しておくなって
#if 0で残すことに対する常套句は ・戻したくなる時とかあるでしょ ・修正に至る経緯を知るためにも大切なんですよ あたりかな。
まともなVCS使え。
ankhsvnって複数人がファイル追加などのプロジェクト変更を行うとプロジェクトファイルが コンフリクト祭りになるんだけど、どうにかならない?
>>559 ありがとうございます。
fscanf で、delimiterが、'\t'とか扱えるんですか?また、複数の' 'を1つの区切りとして扱えましたっけ?
>>560 ありがとうございます。
[1000]の部分は、可変長(極端な話、65535 とか)にしたいですが、その場合この方法だと難しいですよね
>> 562
>楽なのは stream I/O で >> 演算子。
ありがとうございます。
速度の面でどうなんでしょうか?
あと、delimiterが、TABの場合は可能でしょうか?
なぜ、試してみないんだろう?
まともなVCSつかえというくらいだからナイス返答を期待したんだが、だめか。 スレ違いながらもいい機会だと思ったのになー vcprojファイル内の順番がぐちゃぐちゃにならない方法でもいいんだけど。
任意の実数を底とする対数ってやっぱ底の変換公式を使って double log2(double a,double b){ return log(b)/log(a); } とやるしかないんかのぉ。
>>598 なんでプロジェクトファイルをみんなで弄るんだ?
つーか、Subversionスレに行けって。
>>599 ない。
>>596 1000が65536でも別に構わんと思うが。どっちみち、最大サイズの仮定なんだから。
601 :
デフォルトの名無しさん :2008/12/12(金) 08:12:13
今unsigned型(10進数で最大値2,147,483,647)の変数にパスワードをユーザーから入力してもらうことを考えます。 ユーザーが入力するのは52進数か62進数のパスワードです。このとき変数がオーバーフローしないようにすることを考えると、 いちいち52進数ないし62進数の最大値を求めてそれ以上上がらないように設定するしかないでしょうか? (例えばある桁がAで左の桁がBでさらにその左の桁がCならその桁は上げることができない) それともif文でif(変数 + 上昇量 > 2147483647)のようにif文の中だけでオーバーフローするようなことができるのでしょうか?
> 52進数か62進数 52進数は「A〜Z,a〜z」、62進数は「0〜9,A〜Z,a〜z」ってことか? > if文でif(変数 + 上昇量 > 2147483647)のようにif文の中だけで > オーバーフローするようなことができるのでしょうか? 可能かどうかと言えばできる。 環境や言語は知らんが、WindowsでVC++(MFC)なら、CEdit派生クラスで OnCharをオーバーライドかな。 それよりも問題は、入力途中の段階で52進数か62進数かを、どうやって 判断するのかだ? それと52進数で「A」と入力した時と、62進数で「A」と入力した時では、 数値に変換した際に値が違うのか?
603 :
デフォルトの名無しさん :2008/12/12(金) 08:32:20
>>602 解答ありがとうございます。
52進数か62進数と言ったのは単に自分が仕様をまだ決めてないだけです。
環境はSolaris コンパイラはcc or gccです。
604 :
601 :2008/12/12(金) 09:41:27
if(pass[0] * 62 * 62 * 62 * 62 * 62 * 62 * 62 * 62 * 62 + pass[1] * 62 * 62 * 62 * 62 * 62 * 62 * 62 * 62 + pass[2] * 62 * 62 * 62 * 62 * 62 * 62 * 62 + pass[3] * 62 * 62 * 62 * 62 * 62 * 62 + pass[4] * 62 * 62 * 62 * 62 * 62 + pass[5] * 62 * 62 * 62 * 62 + pass[6] * 62 * 62 * 62 + pass[7] * 62 * 62 + pass[8] * 62 + pass[9] > 2147483647) pass[now_i]--; 実際にプログラミングしてみたらこのコードがうまく動きませんでしたどうしたらいいでしょうか?
>>604 お馬鹿さんや、62の9乗を計算してご覧。
高高6桁で桁溢れするわけだが。
606 :
601 :2008/12/12(金) 09:46:03
>>605 でもオーバーフローするif文も書けるんじゃなかったんですか?
607 :
601 :2008/12/12(金) 09:50:20
あとこのプログラムのif文がうまく機能しないのはなんででしょう? pass[10] = 60 のときでも if文がなぜか false になってしまいます。 if(pass[10] * 62 * 62 * 62 * 62 + pass[11] * 62 * 62 * 62 + pass[12] * 62 * 62 + pass[13] * 62 + pass[14] > 99999) pass[now_i]--;
62^ 2= 3844 62^ 4= 14776336 62^ 9= 13537086546263552 62^ 13= 200028539268669788905472
>>600 プロジェクトにファイルを追加するのが複数人いるってそんなに珍しいことか?
うちはロックするようにして回避してる。
>>607 うちではtrueになるよ。
>>601 if((最大値-進数) < 前の桁までの合計値 ) && (新しい桁の数値 > (最大値-前の桁までの合計値))
{
//オーバーフロー処理
}
あってるかどうかは試してないから分からんが方向性はこんなんのはず
オーバーフローする直前のタイミングを捕まえて、本当にオーバーフローするかどうかを「オーバーフローさせないで」判定する
611 :
デフォルトの名無しさん :2008/12/12(金) 12:01:54
>>610 なるほど!!!式変形すれば良かっただけでしたか。
その方針でプログラミングしてみます。
オーバーフローしうる桁だけやりなよ あと、unsignedなら42億じゃないかと思う。
613 :
デフォルトの名無しさん :2008/12/12(金) 12:20:51
>>612 うちの環境では unsigned u; と定義した変数が21億までしか持てませんでした
あとなぜかオーバーフローしたら負の値になりました。
614 :
613 :2008/12/12(金) 12:28:28
自己解決しました unsignedの最大値は42億かもしれません。
プログラマがこういうときに42億とかって言うか?
うん
>>613 unsignedが負になるわけないだろ
どうみてもsigned longの値
%d とかで確認してる、に一票
int NUM = 100; グローバル変数 int func(){ NUMを使う } とするのと int func(int NUM){ } int main(){ int NUM =100; func(NUM); } では実行速度かわりますかね??funcを1000回ぐらい呼び出すんですが・・・
いちいち宣言するからなんか確保とかするのに時間かかるんじゃ? って思ってるのであれば全く問題ない最適化の対象だからうまいことやってくれる つか高々1000回かよwwwwwww
後者はNUMをスタックに積む、呼出し後にスタックから取り除くという 余分な命令が実行されるので、実行速度は確実に変わる。 でも1000回なら誤差の範囲。
>>623 お前でもステップ数を数えるくらいはできるだろう。ww
前者
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
subl %eax, %esp
call func
leave
ret
>>623 続きだ。
後者
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
subl %eax, %esp
movl $100, -4(%ebp)
pushl -4(%ebp)
call func
addl $4, %esp
leave
ret
>>626 pushってわかる? ww
前者
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
subl $16, %esp
call func
leave
後者
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
subl $28, %esp
pushl $100
call func
leave
ret
628 :
599 :2008/12/12(金) 20:08:37
速度気にしてグローバル変数使うようなの相手にすんな
>>623 おい、こら。自信満々に難癖つけといて、無言で逃亡か?
>>627 今時のコンパイラなら、func()をインライン展開してしまうからイミディエイトプッシュのコストは消えるだろうね。
つーか、速度気にしてグローバル変数使う前に、func()にstaticつけておけよ。
>>631 コンパイラが頑張っても、引数をレジスタに乗っけるコードは余計に必要。見苦しいぞ。
「私が未熟でした。ごめんなさい」くらい言えんのか。
static云々は
>>620 に言え。本当にstaticが不要なのかは
>>620 じゃなきゃわからん。
633 :
631 :2008/12/13(土) 00:37:07
>>632 見苦しいも何も、この話題に乗るのは>631が初めてだけど。
レジスタに乗せるコードは要るかなぁ。少なくとも、グローバル変数を取ってくるよりはコスト掛からないよ。
funcの中では、引数ならすぐにレジスタに置いてなるべくそれを使うようにするけど、 グローバル変数だとマルチスレッドとか考慮して都度メモリにアクセスするコードを出すから、 頻繁にグローバル変数へアクセスするコードは遅いって聞いたことがある。
レジスタに乗っける値をどっかから取ってこなきゃならない。 グローバルから取ってくるのと同じコストはかかる。
>>634 それはあるね。global 変数は volatile が付いているのと
同様に最適化されなくなる
>>620 には関係ない話だけど
できるからするとは限らない。例えばgccのとある68000用の実装ではしていなかった。
それは「行わない」ではなく「出来ない」
1 for(int j = 0; j < nSize; j++) Buffer[j] = i; 2 for(int j = 0; j < nSize; j++) pBuffer[j] = i; 1はグローバル変数、2は自動変数
Cのスレッドを使った並行プログラミングについての質問です。 いわゆる生産者消費者問題(有限バッファ問題)です。 生産者スレッド do { pthread_mutex_lock(&lock); share_buf_num = read(fd, prod_buf, SHARE_BUFSIZE); strncpy(share_buf, prod_buf, share_buf_num); pthread_mutex_unlock(&lock); } while (share_buf_num != 0); 消費者スレッド do { pthread_mutex_lock(&lock); strncpy(cons_buf, share_buf, share_buf_num); write(fd, cons_buf, SHARE_BUFSIZE); pthread_mutex_unlock(&lock); } while (share_buf_num != 0); // do { share_bufが共有バッファ、SHARE_BUFSIZEがそのサイズ 生産者でデータをリードしている間は消費者は待っており、 そのあと消費者がライトしている間は生産者が待つ という動作を期待してるんですが、生産者のみがループし続けて ループを抜けたあとに消費者スレッドが動くという挙動を起こします。 何が原因なのでしょうか。 gcc 4.3.2, Ubuntu8.10(仮想マシン上)です。
share_buf_numはいつふやしてんの
生産者の方でリードしたデータ分を代入しています。
645 :
デフォルトの名無しさん :2008/12/14(日) 18:14:40
#include <windows.h> #include <stdio.h> void main() { ULARGE_INTEGER h1; ULARGE_INTEGER h2; ULARGE_INTEGER h3; GetDiskFreeSpaceEx( NULL, &h1, &h2, &h3 ); printf( "h1.QuadPart: %llu\n", h1.QuadPart ); LONGLONG i = h1.QuadPart; printf( "%llu\n", i ); // h1.QuadPart = 16928739328 // h1.LowPart = 4043837440 // h1.HighPart = 3 } 上記のように空き容量を表示したいのですが printfを使ってますがその値は h1.QuadPart の値ではなく h1.LowPart の値が表示されます これはどういうことでしょうか?
646 :
645 :2008/12/14(日) 18:24:33
コンパイラは VisualC++6.0 OSは WindowsXP Home Edition です
>%llu %lld
648 :
645 :2008/12/14(日) 19:55:58
コンパイラを Visual C++ 2008 Express にしたところ 解決しました
649 :
645 :2008/12/14(日) 20:00:42
VC6はllに対応していない代わりに、%I64uってのが使えたはず。
651 :
デフォルトの名無しさん :2008/12/14(日) 20:36:25
#include<stdio.h> main(){ int c,i; int n[2]; for(i=0; i<2; i++){ printf("%d",i+1); while((c=getchar()) != '\n'){ if(c >= '0' && c <='9'){ c = c - '0'; n[i] = n[i] * 10 + c; }else{ /* 終了 */ } } } printf("%d + %d = %d",n[0],n[1],n[0] + n[1]); return 0; } getchar関数を使った足し算を作成したのですが2つの数字を入れてみたところ、 n[1]の値だけ入力した値と異なった値(正の整数が負の整数に、値もめちゃくちゃ)がでてしましました。 どこを改善したらいいか分かりません。アドバイスお願いします。 また、コメントの終了部分に文字が入った場合その場で終了という感じでreturn0を入れたのですが、 1つめを入力したあと終了せずに2つめまで行ってしまいます。これについても終了できる関数かなにかを教えてください。 コンパイラはgccです。
>>651 getchar()では一桁だけしか入力できないしエラー処理も厄介だから、
fgets()で1行入力してからじっくり解析する方がいいと思う。
が、それ以前に状況をもっと的確に説明できないもんかね。
>>651 俺は初心者だが、最近fgetsを入力として使うのがリーズナブルだなと思った。
ただ、fgetsをキーボード入力として使うとバッファが残っちゃうのでそれを消す機能を付けた自作関数を使うといいと思う。
ttp://ja.wikipedia.org/wiki/fgets char *fgetsStdin(char *s, int n){
char *temp = fgets(s, n, stdin);
if(temp == NULL){
/* エラー処理(初心者なのでわかりません) */
}
if(strchr(s,'\n') != NULL){
s[strlen(s)-1] = '\0';
}else{
while(getchar() != '\r');
}
return temp;
}
654 :
デフォルトの名無しさん :2008/12/15(月) 04:40:37
#include<stdio.h> #include<string.h> typedef struct{ int a; char name[100]; int b; int c; }stringx; int main(void) { int i; stringx str[5]; for(i = 0;i < 5;i++){ printf("a:");scanf("%d", str[i].a); printf("name:");fgets(str[i].name, 100, stdin); printf("b:");scanf("%d", str[i].b); 以下略 これでnameのところに空白も読み込める文字列を入力したいんですが (実行例) a:1 name:b:2 と、何故かnameの入力自体がスルーされてしまいます ちなみにscanfに終了判定を付けたものやgetsでも同じようにスルーされます 何処がいけないのでしょう コンパイラはgccです
入力した文字: '1'、'\n' 初回のscanf()の消費した文字: '1' 入力に残った文字: '\n' fgets()は、この残っている改行文字を拾ってしまう。 結論: scanf()とfgets()を混ぜるのは難しい。 対策: ・初回のscanf()のフォーマットを"%d "にする。 ・初回のscanf()をfgets()とatoi()(或いはstrtol())に置き換える。
>>642 たぶん2つのスレッドが交互に動くことを期待しているのだろうけど、そのような保証はまったくない
lock〜unlockはその範囲内が同時に実行されないことを保証するだけ
unlockから抜けてもすぐにスレッドが切り替わるわけではないし (通常はそのまま走り続ける)、
もう一方のスレッドがずっとlock待ちをしていたのだといても、次に中に入るのがどっちのスレッドになるかは運任せ
(今まで寝てた方のスレッドよりも走り続けてるスレッドの方が先に入る可能性が高いかもしれない)
2つのスレッドが交互に動いて欲しいなら、交互に動くよう確実にプログラムしなければならない
条件変数の使い方を覚えるといいよ
>>654 #include<stdio.h>
#include<string.h>
typedef struct{
int a;
char name[100];
int b;
int c;
}stringx;
int main(void)
{
int i;
stringx str[5];
char buff[100];
char *p;
for(i = 0;i < 5;i++){
printf("a:");fgets(buff,100,stdin);sscanf(buff,"%d", &str[i].a);
printf("name:");fgets(buff, 100, stdin);
if(p = strchr(buff,'\n'))
*p = '\0';
strcpy(str[i].name,buff);
printf("b:");fgets(buff,100,stdin);sscanf(buff,"%d", &str[i].b);
printf("c:");fgets(buff,100,stdin);sscanf(buff,"%d", &str[i].c);
}
char *cm_getMessage(msg_filename, msg_number) char *msg_filename; // メッセージ定義ファイル名 int msg_number; // メッセージ番号 { int i; } 2,3行目は何を表しているの?引数の型の定義?
そそ、所謂オールドスタイル。全く持ってお勧めできないが。
100000もある配列の中から配列の中身が「0」の物だけ抜き出して、さらにその抜き出した0の中からランダムに1つ配列を選ぶっていうのを作りたいんだけど while(x!=0){ y=rand()%100000; if(array[y]==0) x=0; } これだと配列の中身が0の物が1つしかなかったら特定に膨大な時間がかかるよね 何かいい方法ないですか?
0が入ってるインデックスの配列作ってそこから抜き出しては?
10万どころか100万くらいならシーケンシャルに全部舐めても一瞬で終わる
>>660 そのコード、ランダムに1つ要素選んで、それが0でないか調べるとなっていて、
文章に書いてあることとやっていることの順番が違うぞ。
>>661 こんなかんじ?
j=0
for(i=0;i<100000;i++){
if(array[i]==0)array2[j]=array[i];j++;
}
y=rand()% j;
array2[y]=〜〜〜〜;
array2にはarray[i]じゃなくてiを入れておけば充分だろ。
どうでもいいけどif文の使い方を間違えているな。
669 :
デフォルトの名無しさん :2008/12/18(木) 08:15:06
#include "stdafx.h" #include <windows.h> #include <locate.h> int _tmain(int argc, _TCHAR* argv[]) { TCHAR message[256]; setlocale(LC_ALL, "japanese"); lstrcpy( message, _TEXT("Hello world.\n") ); printf_s( "%s\n", message ); return 0; } として実行するのですが、printf_s では H しか表示されないのですが、 どうすれば Hello world. と表示されるのでしょうか? コンパイラはVC++ 2008 Express です
670 :
669 :2008/12/18(木) 08:27:38
解決しました
>>669 _tprintf_s( _TEXT("%s\n"), message );
C言語でstrcpy関数を使って文字のコピーをするプログラムを作ったのですが、 コピー後のバッファーにNULL文字が入りません。 どのようにしたら、NULL文字を入れることができるでしょうか?
>>672 普通に書いたら0もコピーされる
お前がよっぽど変なプログラム書いたとしか思えない
>>672 strcpyのかわりにmemcpy使え。 ちゃんと文字数も渡すんだぞ。
なんか乱数のはずが同じ数字になるんだが… 簡略化した奴をちょっと書いてみるんだが ランダムに配列から数字を引っこ抜く関数を二回呼び出してるんだけど、それが必ず同じ値を引っ張ってくる なんでだ??? int array[50]={1,2,3,…,48,49,50}; int randomNumber(int x){ return array[(int)((rand() / ((double)RAND_MAX+1.0f)) * x)]; } void main(void){ int a,b; srand(time(NULL)); a=randomNumber(50); b=randomNumber(50); if(a==b){ printf("同じだよ"); } }
srand(time(NULL)); は乱数の発生順を、その内容によって初期化する、。 time(NULL)は1秒以内なら同じ数値を返すから1秒以内なら同じで当然。 そもそもsrandを毎回呼ぶ必要はない。
って内容見ないで脊髄レスしてしまった。 数字表示させてみて。全部0じゃないのそれ?
>>676 srand(time(NULL));を消してやってみたけど同じ値がでてくるよ!
ごめん別のところで問題起こしてた、自己解決さーせんwww
とりあえず、問題なかったわ。 +1.0fで50が返る可能性があるのがちとまずいだけだな
(rand() / ((double)RAND_MAX+1.0f) この部分は 0 〜 1に満たない範囲で値になるので、1にならない以上 50にはならないから大丈夫。
いや実際返ってきたけど
ねーよ。配列内部の値と、添え字を勘違いしていないか?
RAND_MAX : 65535 を +1.0の 65536.0 で割った値は、1には満たない、0.9999・・・ それに50を掛けても、50に近い値にはなるが、50には満たない。 その値の整数部分をとっているわけだし。
return array[(int)((rand() / ((double)RAND_MAX+1.0f)) * x)]; ↑ int array[50]={1,2,3,…,48,49,50};
わろす
クラスのある一つの大小関係でclass全体のスワップをしたいんだが如何すればいいですか? クラスをベクタコンテナで宣言してvt.at(i).swap(vt.at(i+1))みたいなアルゴリズムを考えています。
stlにすでにある件
いやあるのはswapするとこだけね
691 :
688 :2008/12/18(木) 19:28:45
>>689-690 どういう意味ですか?
vt1.swap(vt2)
で
temp=vt1,vt1=vt2,vt2=tempになるのは解るんですが
vt.at(i)とvt.at(k)のスワップ方法が解らないんです。
#include <algorithm> std::swap(vt.at(i), vt.at(k));
693 :
688 :2008/12/18(木) 19:39:25
>>692 そんな簡単なのがあるんですね。
本には載っていなかったので助かりました。
ありがとうございます。
すいませんでした。
マジで勉強しようと思っている者ですが 初心者にお勧めのサイトとか教えてください#
>>694 初心者なら素直に本を一冊買った方がいいと思うなぁ…
ふむふむ・・
俺にできるかな?
手法を学ぶのも重要だが、言語の使用や、標準ライブラリを逆引きできる本も欲しいね。
翻訳の手順やプログラムの実行方法などは、処理系や実行環境によって異なりますから、.... つまり、・・・・どうすればいいのか.....
ふむふむ・・・コンパイラが必要って訳ですね。
702 :
デフォルトの名無しさん :2008/12/19(金) 01:05:32
よし、早速自分なりに頑張ってみるよ
main(void) { return 0; } エラーがでます。
705 :
デフォルトの名無しさん :2008/12/19(金) 02:58:22
解の公式を加算減算だけで表すプログラムがわからぬ・・・
そうですか。
>704 プログラミングの質問に限らず、エラーが出て質問する時は 出たエラーメッセージを貼ろうね、しまじろうとのお約束だよ
はい、わかりました。
やっぱり、言語をノートに書いたりして覚えたりした?
目の前の箱で試せる時代に、それはない。
何回も繰り返してたら覚えれえるかな
567という整数の10の位だけ(つまり6)を取り出して出力する #include <stdio.h> int main(void) { int num = 567; num = num / 10; num = num % 10; printf( "%d\n", num ); return 0; } どうしてこれで6になるのかわかりやすく教えて!偉い人
>>712 int num = 567;
num = num / 10; < num=56
num = num % 10; < num=6
そ・・・そういうわけか!!
中学校数学レベル
残念、小学生レベル。あと、自分基準で〜レベルとか、ランクをつけなくて良いから。 時代によって違うから。
( ⌒;::) ||| <#`Д´>=3
>>716 >残念、小学生レベル。
>自分基準で〜レベルとか、ランクをつけなくて良いから。
>残念、小学生レベル。
>自分基準で〜レベルとか、ランクをつけなくて良いから。
>>719 いや、本当にそれは小学生レベルだろ?割り算、余りを求める算数を
あんたは中学で習ったのかい?w
それじゃ聞くが、割り算、余りを求める算数を、中学校で習った時代を教えてくれ。 近代の義務教育でな。
#include <stdio.h> int main(void) { int no; printf("数字を入力してください:"); scanf( "%d", &no); /*数字を読み込む*/ printf("あなたは%dと入力しましたね\n", no); return 0; } ビルドエラーが発生しました。続行して、最後に成功したビルドを表示しますか? 教えて!偉い人
>>722 /*数字を読み込む*/
^^^^^の全角空白かな
ありがとう!!偉い人!!
725 :
デフォルトの名無しさん :2008/12/21(日) 08:35:26
シューティングで当たり判定の高速化を図りたいんだけど vector<obj>::iteraot p, q; p = playerbullet.begin() while ( p != playerbullet.end() ) { q = enemy.begin(); while( q != enemy.end() ) { if( isHit(p,q) ) // 当たってたときの処理 } } のようにやってるんだけど 遅くて使い物にならない 何か高速化の方法ってありますか?
>>725 敵を4分木に入れて、弾の直線と当たり判定を取るってのは?
弾をレイと捉えてレイトレースみたいなイメージ
>>725 画面を数分割して敵弾の位置を大まかに分類しておいて、
明らかに無関係な領域にある敵弾は当たり判定自体をスキップする。
複雑な当たり判定を要する弾の場合は、
まずは判定の楽な円-円の判定で大まかに判定し、
明らかに離れているものは真面目に当たり判定を行わずスキップ。
どう考えてもボトルネックはisHit()関数なのになんでそこを晒さないのか
画面を4分割にするとして、境目にある場合は どう処理すればいい?
どっちかに所属させとけよw
両方に属すると判断しとけばいいんじゃね
>>725 みたいな総当りは、シェーダとかGPGPUでやったら速そうだな
>>731 つうか、例えば横512ドットだとして
左は、0 <= x < 256
右は、256 <= x < 512
とすれば、元から境目に存在はしない
上下左右別々に扱うわけか。
735 :
デフォルトの名無しさん :2008/12/21(日) 13:21:21
>>728 ////////////////////////////////////////////////////////////////////////////////////////////////
// 指定された2つの RECT構造体が、重なっているか判定する
// 重なっていると true
// かさなっていないと false を返す。
bool RectLap( const RECT *a, const RECT *b )
{
// 改良失敗
// if( (a->top < b->bottom) && (a->bottom < b->top) && (a->left<b->right) && (a->right>b->left) )
// {
// return true;
// }
if( a->top < b->bottom )
if( a->bottom > b->top )
if( a->left < b->right )
if( a->right > b->left )
return true;
return false;
}
となります
改良の余地があればご指摘お願いします
単純な□同士の判定なのか。 それで重いってことは、よほど沢山の弾があるのか?
737 :
デフォルトの名無しさん :2008/12/21(日) 13:53:01
100発もないのですが、どうしても重くなるのです 別スレッドで処理しているのですが、 CPUが割り当てられなくて処理落ちしてるとかも 考えられますか?
同期処理に時間がかかってんじゃね? 別スレッドにするメリットってあんの?
Celeron 2.53GHz 重たいわけもないでして 昔作ったやつは100発でもいけたので 不思議なのです 変えたといえばコンパイラだけですが VC++6.0 -> VC++ 2008 Express にしただけです
>>738 スレッドを使った理由は技術的好奇心だけです
元の1スレッドに戻してみます
VC++ 2008 Express リリースモードでコンパイルしたら実用レベルになりました スレ汚しすいません
学校の講義でC言語を学ぶことになったので、 VC++ 2008 ExpressをPCに導入したのですが、 計算をさせて、結果を表示するプログラムを作って実行させたら 結果が出力される前にDOS窓が閉じてしまいます。 どうしてでしょうか?
そういう仕様 デバッグしないでいいならCtrl-F5(デバッグしないで実行)で。 それ以外にもとめる方法はいくつかあるが。
>>743 ご親切にありがとうございました!
出力結果を無事に見ることができましたmm
最近のム板もひどいな
返り値に複数の値を返したいんだけど こういう場合は 1、グローバル変数を使う 2、ポインタで参照渡し 3、1つの関数を関数をいくつかに分ける 4、関数内で返したい値を1つの値に纏めた後、呼び出し先でまとめられた値を復元する どれがスマート?
1 → よほど制限された状況でなければあり得ない解決法 2 → どうしても同時に2つ返す必要があるのであれば、普通はそうする 3 → 同時に2つ値を返す必然性がないのであれば、そうする 4 → よほど制限された状況でなければあり得ない解決法 5、構造体にして返す。コピーのコストに見合えばアリ
質問です。 構造体に値を入れて、その入れた内容をポインタにキャストしたのですが 出来ませんでした(何も渡すことが出来なかった) char *test; test = (char *)&kouzoutai; 上記のようにしても駄目でした。 構造体をポインタにキャストする事は出来るのでしょうか?
なにをもって「できなかった」と判断したのか
まぁむちゃくちゃキャストしたんだろうな 構造体ないに文字列持ってたんだろうな、それを直接(char * )でキャストしようとしたんだろ?
fopen_sなどのセキュアな関数が定義されている場合に定義される マクロって何かありますか? それが定義されていればセキュアな関数を使うようにしたいのです。
>>749 kouzoutai の型が分からない限り答えようがない
>>752 一般的な方法はまだない。Open WatcomとVisual C++を個別にマクロで検出するしかない。
VCのバージョンしかないんじゃないかな?
ソースみたら _MSC_VER >= 1400 で判別してるものがあったのですが、これで大丈夫ですかね
#if defined(_MSC_VER) && _MSC_VER >= 1400 か
どもです
760 :
デフォルトの名無しさん :2008/12/22(月) 15:54:01
べたのメモリ上に二分木などを構築するライブラリやサンプルソースを ご存知の方いないでしょうか? メモリマップトファイル上にツリーを作って、複数のプロセスから参照したいと思っています。
「ヒープじゃなく、指定した領域 (メモリマップトファイル) を使う バイナリツリーが欲しい」 以外の解釈が可能か? いや俺は見た事ないし、書くとしたら大変そうだが。
そのmmapした領域からallocとfreeをする関数を書けば いいだけじゃないの? 各データは固定長だろうから、それこそ配列にして 使用済みかどうかのフラグを持つだけでもいいし
764 :
デフォルトの名無しさん :2008/12/22(月) 16:40:25
スレチならすんません 理解しているのはC言語の基礎だけです DOS窓で動く、ジャンケンゲーム、数当て(BIGorSMALL)、石取りゲーム くらいは作れるようになりました この後一体どういう学習をすれば、Windows上で動く簡単なツールなんかを作れるようになりますか? 「GUI(?)をつくりたい」って言えばいいんですかね? 環境はWinXPhome/VC++2008 Windowsフォームアプリケーション?みたいなのもやってみたんですがさっぱりです とりあえず、ウインドウを表示して、次に画像なんかを表示して〜 みたいなものはどうやってやればいいですか? 分かりにくかったらすいません宜しくお願いします
ウィンドウはOSの環境に依存する C言語でWindowsAPIを使えばいい Win32API,ウィンドウメッセージなんかでぐぐるといいが、 長いし(書くときはコピペするかウィザードで生成すればいいが)、少しとっつきにくいかもしれない VCを使っているのなら、新規プロジェクト作成のウィザードから Windowsアプリケーションを使うのもいい どういうものを作りたいかによって選ぶべきと思う
768 :
デフォルトの名無しさん :2008/12/22(月) 17:06:45
>>765 回答ありがとうございます
Win32API?と、VCの機能を調べてみます
769 :
デフォルトの名無しさん :2008/12/22(月) 20:31:59
VC++2008EEでただのCプログラムを作るにはどうすればいいですか?新規プロジェクトにはC++しかありません。
C++をやっとけばいいよ CとC++は同じものだと考えてとりあえずは問題ない というのも、C++はbetter Cという考えがあるから 「C++ではない純粋なC」でないといけないというのは ちょっと特殊
C++ でプロジェクト作っても、 ファイルの拡張子を .c にすれば C になるはず
今、ポインターを学んでるんですけど・・ なんでアドレスとか表示する意味があるんだ? どうして、ポインターで指す必要があるんだ? 間接的にオブジェクトに代入してなんの意味がある? ビット数の表示に意味なんてあるんだろうか? いまやってることに、意味がない気がして・・ 今、すげー・・やる気を失ってるところです・・ だれか・・元気付けてください・・
>>772 すごく使うことになるのでとりあえず使い方をマスターしておけ
>>772 お前の家の住所に意味はないのか?
例えば、「お前の家が見たい」って言われたとして、家ごとコピーして渡さなくても住所教えればいいだろ。そういうことだ。
>>773 どう使うのか・・こう・・具体的に説明してくれるとありがたいです・・
777 :
デフォルトの名無しさん :2008/12/22(月) 22:58:52
778 :
デフォルトの名無しさん :2008/12/22(月) 23:23:27
int c; c=getc(); これで合ってると思うんですが、printf("c=%d", c);で表示すると入力したものじゃなくて変なのが入るんですがなぜですか?
>>778 %cだ。
それだと。文字コードが表示される。
>>775 100000個の要素を持った配列を渡すとき、「ちょっとこれサイズでかくね?」って思うでしょ
でもポインタ1個渡せば、あとはポインタの位置をずらしていくだけで配列を参照できるの
ねっ簡単でしょ
以上、ヴァンプ将軍のさっと簡単ハッキングでした
なんだか聞きたいことがうまくまとめられてないのですが..... 先日Cの入門書を一通り学習し終えたのでwindowsアプリに手を出し始めました しかしwindowsアプリではCの入門書でいうところの最初に学んだprintfやscanfのようなものが一切出てこず、違うものばかりです ではそういったCの入門書ででてきてwindowsアプリの入門書では全くでてこない↑等のものはどこで使うのでしょうか? また、書店にいくとCの関数辞典のようなものがありますがそういった書籍にのっているものも上記のようにwindowsアプリではでてこないものばかりなのでしょうか?
782 :
デフォルトの名無しさん :2008/12/23(火) 02:59:31
上記のようにwindowsアプリではでてこないものばかり
783 :
デフォルトの名無しさん :2008/12/23(火) 03:01:14
cはどのOSでも共通して使える言語。Windows限定の場合は、下地に使うだけ。
>>781 Windowsでも一応コンソールアプリがあるけど、ふつーはprintf()とか標準入出力系の
関数は使いません。
それ以外の、ファイル入出力とか、文字種のチェックとか数学系とか時間計とかは使います。
ファイルにロックとかけるとか、ミリ秒単位で時間を扱うとか、ちょっとこった使い方をすると
WindowsのAPIとかを使うことになります。
>>782-784 ありがとう、入門書で最初にやったことがいきなり不要扱いだったんで居間まで何やってたんだろう('A`)と少し不安になりました
プログラムを勉強するなら関数辞典は買っておけとよく言われるのですがこの関数辞典とは一般にC/C++のものをさすのでしょうか?
>>786 お気に入りにいれました
しかし結構何のことか全くわからん内容の関数とかあるんだなぁ・・・
googleで「manpage fread」とかmanpageをつけてググると、詳細な説明がでてくる。 本を買うならリファレンスより、何とかクックブックとか何とかの技500とかみたいに、短いサンプルが たくさん乗ってるやつのやつのほうがいいけど、オンラインでそういうやつあるかな?
敵が右往左往して巡回するようにしたいのですが、なぜか右端でブルブル高速で震えているだけになっています どうすればよいのでしょうか 敵の位置を変数「enemyposx」に入れてます if(enemyposx<79.0) { enemyposx+=0.8; } if(enemyposx>113.0) { enemyposx-=0.8; } else { enemyposx+=0.8; }
113.1 -(2つ目のブロック)-> 112.3 -(3つ目のブロック)-> 113.1 -(2つ目のブロック)-> 112.3 -> ...
普通は x座標とは別に、進行方向を示す変数を持つもんだよ if( x < 79 ) diff = +0.8 ; if( x > 113 ) diff = -0.8; x += diff;
>>780 > ねっ簡単でしょ
ボブ! ボブじゃないか!
自分も最初はポインタの概念がよく分からなかったなw でも解析とか始めるようになってデバッガーとか使い出してからやっと理解できたわ
795 :
769 :2008/12/23(火) 15:13:54
>>771 CLRオプションでコンパイルできないと言われましたがどうすればいいでしょうか?
どこで聞くのが適切なのかよく分からなかったのでここで質問致します。 以下をご存じの方がいらっしゃいましたら、ご教授頂けましたらありがたいです。 環境はcygwin + g++です。将来的に linux でも使いたいと思っています。 異なる2台のHDDに各々数10GBのデータが入っています。 両方の HDD から、一度に512MB 程度づつ、データをメモリに読み込み、 逐次比較をしていくようなプログラムを作っているます。 HDD1台ごとに、一つのスレッドを作成し、スレッド内で HDD->メモリの DMA 転送を行いつつ、dual buffer 構成にして別のスレッドで比較をしようと考えています。 HDD からメモリへDMA 転送をさせる方法を知りたいのですが、 普通に fread 文で読み込めば、勝手にDMA転送をしてくれるものなのでしょうか?
>>795 プロジェクト作る時はCLRじゃなくてWin32のほうで
>>796 DMA するかどうかはプログラミングの外の話じゃないかな。
それとメモリに読み込むより mmap した方が良いんじゃね?
Cで int a[n][2]という配列を作りたいのですが、 int **a; a = (int *)malloc(n * sizeof(int *)); for(i = 0; i < n; i++){ a[i] = (int *)malloc(2 * sizeof(int)); } でいいのでしょうか?
二つ目が決まってるなら int (*a)[2]で確保一回で済ますというのもあるな
レスありがとうございます。 int (*a)[3]; a = (int *)malloc(n * sizeof(*a)); これでいいのでしょうか?
>794 Javaのほうが先にやってた俺は「参照が具体的な数値になったようなもんか」と考えたっけな
ポインタはすんなり理解できたから、なんで理解できないのか、理解できない。
なぜか昔からポインタで詰まる人が多いんだよね ある程度コンピュータを知ってれば、アドレスのことでしょ?って思って 正確ではないにしろ、理解に詰まることはないんだけどね Javaの参照とポインタは言葉通り、ちょっとニュアンスが違う。 そのあたりが"ポインタ"で詰まる理由のひとつかもね
>>801 int (*a)[3];
a = (int (*)[3])malloc(sizeof(int [3]) * n);
だな
visual C++2008 ......を使ってるんですが・・ プロジェクトの消去する方法がわかりません ヘルプとかで、いろいろ探したりもしてみたんですが、わかりませんでした どなたか、教えてください
>>806 ソリューションエクスプローラーで右クリックしてメニューで削除を選ぶと削除される。
おぉ、サンクス! でも、消えない・・
811 :
デフォルトの名無しさん :2008/12/24(水) 10:02:22
Visual C++を使っています。
http://www.asahi-net.or.jp/~yf8k-kbys/newcpp2.htmlのサイトにある 、
//hello.cpp
#include <iostream>
using namespace std;
int main()
{
cout << "hello" << endl;
}
をコンパイルしたのですが、
MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\test\Debug\test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
とエラーが表示されコンパイルできません。
こんな初歩的な質問ですみませんが、どうすればコンパイルできますか?
またエラーの意味も出来れば教えてください。
エラーの意味: 「Windows アプリケーションだっていうから WinMain() を呼び出そうとしたら そんな関数なかった」 解決法: コンソールアプリケーションとしてプロジェクト作り直す。
813 :
デフォルトの名無しさん :2008/12/24(水) 10:24:37
>>812 解決法とエラーの意味ありがとうございます!
無事コンパイルできました。
ここで疑問ですが、
win32コンソールアプリケーションとwin32プロジェクトの違いはなんなのでしょうか?
よければ教えていただきたいです。
Windowsアプリケーションにはメッセージループがあるだろ
>>813 win32プロジェクトはイベント割り込みを考慮して作る
たとえば「ウィンドウを再描画してくれ」といってきたりする(以下、イベント)
このようなイベントが起きたときにどう処理するかをプログラムしていく
だが、コンソールにはイベントがない
ここではイベントじゃなくメッセージというべきだったか
>>816 なるほど、大まかに理解することが出来ました。
つまりは、イベントを考慮する場合はwin32プロジェクトで作れということですね
返答ありがとうございました
>>811 の者です。度々失礼します。
現在
http://www.asahi-net.or.jp/~yf8k-kbys/newcpp3.htmlのプログラム //hello2.cpp
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
cout << "こんにちは。私はコンピュータです。" <<endl;
cout << "あなたの名前を入力してください。" <<endl;
cin >> name;
cout<<name<<"さん。よろしく。"<<endl;
}
をコンパイルし、
画面を表示し、入力することにも一応成功しているのですが、
名前「小林」を入力し、エンターを押すと同時に「小林さん。よろしく」の表示を見るまもなく、
表示されると同時にウインドウが消えてしまいます。
これは正常な動作でしょうか?
終端まで実行すると即座に終了する 正常ですよ
>>820 正常でしたか。安心しました。
回答ありがとうございます
はい。あなたの反応速度が遅いだけです。 ところで、int main()と宣言しておきながらintを返さないサンプルを掲示しているような ヘッポコサイトは参考にしない方がいいです。
C99以降は (C++も?) main の終了後は 0 を戻すが
それ以前だと未定義だっけ?
>>819 デバッグなしで実行 (Ctrl+F5) すると
終了時に一時停止する。
>>822 >あなたの反応速度が遅いだけ
イミフ
>>823 >>デバッグなしで実行 (Ctrl+F5) すると 終了時に一時停止する。
確かに一時停止しました!!参考になります
質問です。 VC6.0時代は for(int i = 0; i < 10; ++i) { //いろいろ } printf("%d", i); とすることができましたが、VC9.0ではprintfのところではすでにiが無効になってしまいますよね。 これって、C/C++が昔からこだわっていた「互換性を保つ」に反している気がするのですが、どうなのでしょうか? VC6.0時代の解釈がC++の言語仕様上間違っていたので、直したとかなんでしょうか?
>>825 VC6時代にはまだ正式な規格じゃなかったから。
.NET(2002)から対応したが、デフォルトではVC6互換だった。
2005からデフォルトがISO準拠になったが、プロジェクトのプロパティのC/C++ 言語の
for ループ スコープの強制準拠をいいえにすれば同じ動作になる。
>>825 C++の最初の定義ではVC6.0の仕様だった。
その後変更になった。
829 :
デフォルトの名無しさん :2008/12/24(水) 19:40:45
C言語で以下の用なプログラムを見ました。 このようなプログラムの記述でもよい?というかどういう意味なのでしょうか? よろしくお願い致します。 1. (kata)自作関数() 戻りの型を”()で閉じてる”上に関数との間に”スペース”がありません。 ちなみにkataには、変数でvoidが入ります。後半の()はvoid型なのに。 2. rrom.abc[0].ddd[0] ピリオドが二つあるのですが、これは一体何を意味しているのでしょうか? 構造体かと思いましたが、そのあとにまたピリオドがあって、構造体の構造体? 3. struct destr s_ssss; struct destr aaaa; void aa_a; void aa_b; char dd_d; といった文があったのですが、1行目でstructを宣言しておきながら;してる意味は? そのあとにもまた;で終了して、次の行からは構造体の中身ともおわれしき代入があります。 {}で閉じる必要はないのでしょうか?
>>829 中途半端な知識で中途半端に引用しているから、説明してもいいけど余計に混乱すると思う。
丸ごとアップローダにあげた方がいいと思う。
一応簡単に。
1.
・記号の前後のスペースなんか気にするな。殆どの場合に省略可能だ。
・「変数でvoidが入る」なんてことはない。何か勘違いをしている。
2.
・rromという構造体の実態の、メンバabcと言う構造体配列の0番目の要素のメンバdddという配列なのだろう。
3.
・1行目のそれは、そういう構造体があると言う只の宣言だ。
・3行目以降は構造体の中身ではない。引用が不充分なので、それが何かはわからない。
831 :
デフォルトの名無しさん :2008/12/24(水) 21:34:22
>>830 ありがとうございます。
1.に関してということは
voidJISAKUkANSU() でもvoid JISAKUKANSU でもよいということでしょうか?
ちなみにkataは、別のヘッダファイルで void kata; なっていたのでvoidかとおもっていました。
2.
struct rrom{
abc[10]
}
strcut abc{
ddd[10]
} とかいった感じではなく
struct rrom{
abc[10]
}
abc[0] = nanka
とかいった感じなのでしょうか?この場合でも一番上が構造体だから.をつけると
理解すればよいのかな?
3.
3行目以降は本当に何行か構造体の中身みたいな感じで書かれていました。
なんでこんな書き方してるんだろうとおもってました。他の所でこの構造体
つかってた感じだったので、;をつけて下に何故かいているんだろうって
>struct rrom{ >abc[10] >} >strcut abc{ >ddd[10] >} とかいった感じではなく > >struct rrom{ >abc[10] >} >abc[0] = nanka > >とかいった感じなのでしょうか? 違う。 struct ddd_t { /* 何か */ }; struct abt_t { struct ddd_t ddd[10]; }; struct rrom_t { struct abc_t abc[10]; }; rrom_t rrom; rrom.abc[0].ddd[0] みたいなかんじだと思われ。型と変数を混同しないように。
833 :
デフォルトの名無しさん :2008/12/24(水) 22:12:19
ある構造体fooを一行でunsigned char[40]に型キャストするのは不可能でしょうか。。。 struct Foo{ (sizeofが40になる単純なデータ群) } をboost::serializeで使うのにいちいちserialize書くのかったるいのですorz
834 :
デフォルトの名無しさん :2008/12/24(水) 22:22:34
833の者です。 質問が不誠実過ぎたと思うので加筆します struct Foo; void function{ Foo f; //この下2行の文章のmemcpyする必要がないので(&uchar[0])=&Fooにしたい->型キャスト って発想なのですが。 unsigned char n[40]; memcpy(&n[0],&f,sizeof(f)); }; 何か思い当たる人はご教示お願いいたします。
*(char*)(&foo)
>voidJISAKUkANSU() でもvoid JISAKUKANSU でもよいということでしょうか? にほんごよめますか? >830には、「きごうのぜんご」とかいてありますよ。 >ちなみにkataは、別のヘッダファイルで void kata; なっていたのでvoidかとおもっていました。 だから、1行ずつ切り出さないで全部貼れ。 >3行目以降は本当に何行か構造体の中身みたいな感じで書かれていました。 >なんでこんな書き方してるんだろうとおもってました。他の所でこの構造体 >つかってた感じだったので、;をつけて下に何故かいているんだろうって 自分で読み直して、説明が理解できますか? いいから貼れ。
>>833 unionならキャストの必要さえない。
が、キャストでやるならunsigned char * foo = reinterpret_cast<unsigned char *>(& f)でいい。
シェルでpwdしてカレントディレクトリ表示するのと cでgetcwd()して表示するのって何か違いがありますか?
はい。実装によっては異なります。 シンボリックリンクの解釈の辺りで。
841 :
デフォルトの名無しさん :2008/12/25(木) 00:07:39
>>838 単純ポインタに変換してしまうとucharが1/40しか保存されないんです><
>>841 そんなことは無いと思いながら実験してみたら、やはりそんなことはなかった。
typedef struct {
int i, j;
char s[32];
} Type;
int main(void)
{
Type t;
t.i = 0xabadcafe;
t.j = 0xdeadbeef;
strlcpy(t.s, "foobar", sizeof(t.s));
unsigned char *uc = (unsigned char *)(&t);
printf("0x%x\n", *(int *)uc);
printf("0x%x\n", *(int *)(uc+4));
printf("%s\n", uc+8);
return 0;
}
$ ./a.out
0xabadcafe
0xdeadbeef
foobar
なんか別のところで間違えてるんじゃないの?
>>840 なるほど、ありがとうございます。
シンボリックの扱いを実験してみることにします。
844 :
デフォルトの名無しさん :2008/12/25(木) 00:32:38
>>842 一応こちらでも実験したつもりで居るのですが、
boost::serializeの仕様が関わってるのかもしれませんし、速度重視で実験コード書いたので失敗したのかもしれません。
が、ちょっと今日は時間がないので明日以降に再質問したいと思います。
ご丁寧にありがとうございましたmm
845 :
796 :2008/12/25(木) 00:36:01
>>798 遅くなりましたがレスをどうもありがとうございます。
>DMA するかどうかはプログラミングの外の話じゃないかな。
素人ですみません。DMA するかどうかを調べる方法を
議論するとしたら、例えばどのあたりの板が適当でしょうか?
>それとメモリに読み込むより mmap した方が良いんじゃね?
ランダムアクセスは行わずに、シーケンシャルアクセスのみで、
また、一度読んだ領域は2度と読みません。
また、HDD からの読み込みが終了しているタイミングに、別スレッドから
占有的に,、同じHDDに対して高速書き込みを行いたいと考えてますので、
mmap のように必要になった時に初めてメモリ転送を行うのではなく、
決まったタイミングに全てのデータを一気にメモリに転送してしまいたいと
考えており、fread (or read?)文が適切かなと考えています。
>>845 DMAはデバイスドライバが行う。Windowsではアプリケーションから制御できない。
796がDMAと呼んでいるものは、 DMAではなくlibaioとかFILE_FLAG_OVERLAPPEDとかの 非同期IOのことではないだろうか。
fread使ったことないとか?
849 :
796 :2008/12/25(木) 01:24:03
>>846 レスをどうもありがとうございます。
linux であれば、O_DIRECT フラグをつけて
open する事により、DMA 出来る(?)ようですが、
windows の場合は、DMA を行ってくれるかくれないかは、
プログラマレベルでは全く制御できず、運任せという事でしょうか。
ファイル転送ブロック容量等を色々と変えてさまざま条件で
転送速度を計測し、各々の条件でデバイスドライバが
DMAを行ったか否かを推測して、DMAを行ってくれる条件を
試行錯誤して探してみるしかないでしょうか?
850 :
796 :2008/12/25(木) 01:31:01
>>847 レスをありがとうございます。
cygwin ではなく VC++ で FILE_FLAG_OVERLAPPED
を使った経験はあり、実際に速度向上を体感できていましたが、
libaio というのは全く知りませんでした。これはcygwin で使えるのでしょうか。
ぜひ勉強してみようと思います。
>>849 君が言ってるDMAって、誰に教えてもらったの?
852 :
796 :2008/12/25(木) 01:46:30
別に誰に教えてもらったわけでもないですが。。 1 TB×16 台(16TB) の RAID0 に 2Gbps の速度で 高速アクセスを行うようなハードウェア+アプリケーションを作成しており、 可能な限り高速なアクセスをしたいと考えております。 DMA 転送は、DSP やFPGA のアプリケーションで扱った経験は ありますが、PC 上で確実にDMAを行いたいという経験は 初めてです。
今時のパソコンなら、HDDアクセスはDMA転送してるんじゃないの、ドライバが?
>>849 > O_DIRECT
それはやっぱりDMAとは呼ばない。
間にディスクキャッシュを噛ませないという意味でしかない。
ちなみにWindowsだとFILE_FLAG_NO_BUFFERINGが近い。
O_DIRECTがなくても、ディスクとOSキャッシュのメモリとの間の転送はDMAが使われる。
DMAなんてものは1アプリケーションが介入する領域の話ではない。
DMAがされるかどうか確認・設定したいなら、
WindowsではデバイスマネージャでATAコントローラのところを見ればいい。
もちろん可能ならDMA有効が初期設定、不可能なものなんて今時存在しないだろ。
855 :
796 :2008/12/25(木) 02:30:37
>>853 >>854 レスどうもありがとうございます。大変勉強になります。
理論値よりもだいぶ遅かったので、DMA できていない事が原因なのかなと
思いこんでいたのですが、別の原因で遅くなっているのかもしれませんね。
>O_DIRECTがなくても、ディスクとOSキャッシュのメモリとの間の転送はDMAが使われる。
OSキャッシュという概念がよくわかっておらず恐縮ですが、
O_DIRECTがなくても、DMAは必ず行われ、CPU の2次キャッシュや3次キャッシュは
汚染されないという理解でよろしいでしょうか?
とりあえず、
1.ディスクキャッシュを使用せず
2.非同期 I/O を用いる
という方法が考えうる最速の方法という事でしょうか?
可能であれば、cygwin でwindows/linux のマルチプラットフォームに対応したいと
考えていましたが、各々の OS で固有の API を使うしかないという事のようですね。
if (suuti > 100){ printf("100以上なので修正します\n"); suuti = 100; } printf("数値は%dです\n",suuti); 100以上の数字を入力してもメッセージを表示してくれません 何か間違ってるのでしょうか・・?
>>855 なんかキミ、用語だけは知ってるけど全然理解してないみたいだね。
本読んで勉強してきなよ。
858 :
796 :2008/12/25(木) 02:45:05
>>857 すみません。。元々ハードウェア設計が専門で正直、PCは
あまり詳しくありません。cygwin を使うのも初めてです。
具体的に855のどのあたりが致命的に間違っている点でしょうか?
>>856 きっと間違ってるんでしょうね
どっかが
>>858 CPUのキャッシュがどういう性質のものかも理解できていないじゃん。
>>856 100を超える比較しかしていないから、100を入力してもメッセージは出ないね。
861 :
デフォルトの名無しさん :2008/12/25(木) 06:52:34
(kata)自作関数() 本来ならこのkataにはどういったものがはいるのでしょうか?
>>861 断片を貼られてもなんとも言えません。いい加減大人しく全体を提示するか、さもなければお帰りください。
教科書をじっくり時間をかけて読む事をお勧めする
864 :
デフォルトの名無しさん :2008/12/25(木) 07:33:38
>>862 全体は個人的なものじゃないので無理なのです・・・
考えられるパターンとしてはやっぱり戻り方では?
>>864 にほんごよめますか?
>862には「かえれ」、>863には「きょうかしょをじっくりよめ」とかいてあります。
手を隠したまま手相を見てもらおうとするようなもので それはもう常人ではなくエスパーに頼むしかない
867 :
デフォルトの名無しさん :2008/12/25(木) 08:15:44
携帯から失礼します 自分は最近C++に手を出し、今classで止まってます 本当に基礎の概念 classは設計図みたいなものである と言うことやコンストラクタ、デストラクタ、メンバ変数 くらいは理解したのですが、ここから先(プロパティ、継承)などが理解できません 使い道が分かればもう少し理解が深まると思うのでどなたか、「なるほど、これは確かにclassと言う概念が必要だな」 と思うようなソースなり、コピペなり、ありましたら教えてください 例えば関数なら、何度も使うような処理を複数回書かないため とか マクロなら、あとで値の変更が容易なのと、見通しをよくするため とか 色々「なるほどこれは必要だな」と思える理由があります。 しかしclassに関しては何も見えてこないんです よろしくお願いします
継承は置いておいて、クラスに関して簡単に。 例えば何かのアプリケーションがあり、それには複数の設定があるとする。 そのアプリの実装において、設定ファイルがどういう構造かは決定的ではない場合、 しかも一箇所では一部のデータのみを読み書きしたい場合、 普通は設定の一部のみを読み書きする関数を用意すると思う。 しかし、データの管理を呼び出し側に委ねることになる。 クラスにしておけば、データ構造を隠蔽することができるので、 呼び出し側にデータの管理を任せることなく密かに管理できると言う次第。
>>867 例えばMFCでは
ウィンドーを作るだけのCWndクラスがあって
それを継承して表示用のクラスCViewが作られる
CViewを継承してCScrollViewクラスやCListViewクラスなどが作られる
こうすればCListViewを作るときウィンドー関係や表示関係の処理を複数回書かなくてすむし見通しも良くなる
(ここでいうウィンドーはボタンやテキストボックスやバーなどの表示単位のこと)
>>867 まずオブジェクト指向を学びたまえ
そしてJavaやC#やVBへと旅立つのだ
>>867 カプセル化とか多態性とかいろいろ利点はあるんだけれども、
はじめのうちはデータと関数を一緒に管理できる、ってとこかな
囲碁のプログラムを作っているとして、駒を置く・目の数を数える、等の
盤面のデータ(int board[15][15]みたいな)を引数にとって何か仕事をする関数をたくさん作ると思うが、
それなら盤面のデータもそれに付随する関数もclassの中に取り込んでしまえば、管理が楽になる。
>>858 個々の技術は知っているようだが、PCという括りじゃなくて、(OSを含む)コンピュータ
システムの全体像をを理解していない。
各々の技術が「記憶階層」のどの位置にあたるのか調べて理解してから出直しなさい。
大した事言ってないのに偉そうにしとるな
うん、基本的な事知らないの奴に無料で詳しく教えるほど暇ではないのだ。 「記憶階層」からたどれば必要な項目は手繰れる。
言葉に騙されてる感じ
876 :
デフォルトの名無しさん :2008/12/25(木) 13:10:43
C++でなんか作りたいんだが良いプログラムのアイディア教えてくれ
int *p; p = malloc(sizeof(int)); *p = 1; p = realloc(p, sizeof(int) * 2); こうするとp[0]には1が入っててp[1]で2番目を参照できる、でおk?
>>876 ずばーんとDYNAMICでどかーんとIMPACTがあって
ずきゅーんとHeartをゆさぶるDreamなソフト
とりあえずP2Pで匿名を謳(騙)っておけば脳タリン厨房は釣れそうだぜ
>>879 d
reallocの取っ掛かりが掴めた
>867 そうだなぁ…例えば、こんなのとか? #include <vector> #include <iostream> class MyObject { public: virtual void method() = 0; }; class MyObjectA : public MyObject { public: void method() { std::cout << "A" << std::endl; } }; class MyObjectB : public MyObject { public: void method() { std::cout << "B" << std::endl; } }; void func(std::vector<MyObject *> &objects) { for(int i=0; i<objects.size(); i++) { objects.at(i)->method(); } }
while(1) printf( "どかーん\n" );
#include <stdio.h> int main(void) { int i; for (i = 1;i <= 10;i++) { printf("メッセージ\n"); } return 0; このプログラムの中に1ってあるじゃないっすか この1ってただの綴りみたいなものなんですか? それともほかの数字とか入れたりしちゃうんでうすか? なんか、そこんとこ解っとかないと前に進めません!!
ググらない 調べない やることもしない 試しもしない 感謝の言葉もない
そういう人に私はなりたい
という気がしたという夢を見た
>883 そのコードの場合、やりたいことが単に10回繰り返すだけだから 開始番号の1と終了条件の10自体に特に意味はなく 10回繰り返せるように開始番号と終了条件が設定されていれば良い。 for(i=0; i<10 …としてもちゃんと10回繰り返すことになるから 「そのコードに限っては」1や10という数字自体に特に意味はない。 ただ、そのループの中で i の値を利用する場合には事情が違ってくる。 i の値を利用出来るように適切な開始番号と終了条件を設定することになるだろう。
main(){} ↑このプロ負らむのを時に、言われましたが、何かいい方法?が?
日本語でおk
俺は int main(){return 0;} にして、起動元のOSに正常終了したことを返したい。 まあ、これより先は宗教戦争。
Cの次期規格ではreturn 0を省略できるんだっけ?
現規格でできる。
宗教論争っていうか、return 0を省略できるのを知らないで、人に書けって 指摘してたけど、それ省略できるよって揚げ足取られて、暴れだす人とかは 何度もみてる。
旧規格でも問題ないな。 警告出すコンパイラはあるけど。
>>894 VC6 とか対応してないし、古いコンパイラ対策として書いた方がいい場合もある。
>>895 確かに省略はできるなw
何が帰るかは分からないが。
>>894 省略できるって言うけど、どういう状況でそう言えるのか、言わないあんたもどうかと。
値を返す必要の無い関数なら必要ないが、値を返す場合、何かしら return 値 を書かないと
コンパイラが警告を出すし、関数が返す型を指定しておいて値を返さないのはおかしいし。
あと、mainに関しては、ANSI、ISO準拠ではプログラムの開始が main とし、
int型の値を返すスタイルを推奨しているから、int main(void) return 0; が標準”スタイル”
とされているが。その辺も、それを使うか使わないかは人それぞれだが、
筋を通すなら必要なコードは書くべき。
>>889 は何を言ってるか意味分からんけど、
まあ、それみたいに掲示板とかに貼る書き捨ての数行のとかのコードとかは
return を省略したりするんだけど、それにいちいち
>>891 みたいに
ツッコミ入れてくる奴がいるんだよ。
>>891 はちがうけど、ムダにあおり気味に。
で、それにreturn 書かなくてもいいだろって、揚げ足をとってやると、
「書くべきだ」とか、暴れだすってのがいつもの流れっていうか。
それは宗教論争じゃないだろって。
>>897 ちょっと文章から読めないんで違ったら悪いんだが、
ここで 「省略できる」って言ってるのは、一般の関数とか
たまたま省略しても問題ない、というケースの話じゃなくて、
プログラムが正常終了する場合は main の return は省略
してもよいって規格で正式に定められてるっていう意味だよ?
移植性考えると納得いかなくても書かざるを得ないというのはもう結論出てるだろう。 規格は所詮規格。まともに実装されてないこともあるわけで。
移植性は関係ないだろ。
そういえば、移植性を考えるならreturnよりexit()で返すべきとかって議論もみたことあるな。 詳細はわすれたけど。
性別を選択するだけで好きなものがわかるプログラム作成してみました #include <stdio.h> int main (void) { int mange; printf("男性なら0、女性なら1を入力してね: "); scanf("%d",&mange); switch (mange) { case 0: printf("まんこ大好き!!\n"); for (;;){ printf("%d←マンコ好き度\n",mange); mange++; } break; case 1: printf("ちんこ大好き!\n"); for (;;){ printf("%d←ちんこ大好き度\n",mange); mange++; } break; default: printf("きもい\n"); break; } return 0; }
改行しないバージョン printf("%10d←マンコ好き度\r",mange);
で、質問は何だ
906 :
デフォルトの名無しさん :2008/12/26(金) 15:11:45
TCHAR szPath[MAX_PATH szPathのszはどういう意味?
string zero terminated じゃね?
* bBusy : boolean * cApples : count of items * dwLightYears : double word (systems) * fBusy : boolean (flag) * nSize : integer (systems) or count (application) * iSize : integer (systems) or index (application) * fpPrice: floating-point * dbPi : double (systems) * pFoo : pointer * rgStudents : array, or range * szLastName : zero-terminated string * u32Identifier : unsigned 32-bit integer (systems) * stTime : clock time structure * fnFunction : function name * pszOwner : pointer to zero-terminated string * rgfpBalances : array of floating-point values * hwndFoo : handle to a window * lpszBar : long pointer to a zero-terminated string * g_nWheels : member of a global namespace, integer * m_nWheels : member of a structure/class, integer * m_wheels : member of a structure/class * s_wheels : static member of a class * _wheels : local variable
参考になる
自作関数がうまくいかない・・・・・ プロトタイプガンダムとかも・・うまくいかない・・
>911 「うまくいかない」だけでは何がどう上手くいかないのか判らないよ。 ・上手くいかないコード ・どう上手くいかないのか (本来こうなって欲しいのにこうなってしまう、という内容 エラーメッセージがあるならそれを貼る)
>>912 すいません(´・ω・)
#include <stadio.h>
int main(void)
{
return 0;
}
int sum(void)
{
printf("FOOOO");
return 0;
}
コンパイルしても
c:\documents and settings\yuji\my documents\visual studio 2008\projects\自由だああああ\自由だああああ\自由だあああああああああ.cpp(1) : fatal error C1083: include ファイルを開けません。'stadio.h': No such file or directory
とエラーが表示されます・・
#include <stadio.h> #include <stdio.h>
スタジオのスペルはstudio
>>914-915 ナ ゝ ナ ゝ / 十_" ー;=‐ |! |!
cト cト /^、_ノ | 、.__ つ (.__  ̄ ̄ ̄ ̄ ・ ・
ミミ:::;,! u `゙"~´ ヾ彡::l/VvVw、 ,yvヾNヽ ゞヾ ,. ,. ,. 、、ヾゝヽr=ヾ
ミ::::;/  ゙̄`ー-.、 u ;,,; j ヾk'! ' l / 'レ ^ヽヘ\ ,r゙ゞ゙-"、ノ / l! !ヽ 、、 |
ミ/ J ゙`ー、 " ;, ;;; ,;; ゙ u ヾi ,,./ , ,、ヾヾ | '-- 、..,,ヽ j ! | Nヾ|
'" _,,.. -─ゝ.、 ;, " ;; _,,..._ゞイ__//〃 i.! ilヾゞヽ | 、 .r. ヾ-、;;ノ,.:-一'"i
j / ,.- 、 ヾヽ、 ;; ;; _,-< //_,,\' "' !| :l ゙i !_,,ヽ.l `ー─-- エィ' (. 7 /
: ' ・丿  ̄≠Ξイ´,-、 ヽ /イ´ r. `ー-'メ ,.-´、 i u ヾ``ー' イ
\_ _,,......:: ´゙i、 `¨ / i ヽ.__,,... ' u ゙l´.i・j.冫,イ゙l / ``-、..- ノ :u l
u  ̄ ̄ 彡" 、ヾ ̄``ミ::.l u j i、`ー' .i / /、._ `'y /
u `ヽ ゙:l ,.::- 、,, ,. ノ ゙ u ! /_  ̄ ー/ u /
_,,..,,_ ,.ィ、 / | /__ ``- 、_ l l ``ーt、_ / /
゙ u ,./´ " ``- 、_J r'´ u 丿 .l,... `ー一''/ ノ ト 、,,_____ ゙/ /
./__ ー7 /、 l '゙ ヽ/ ,. '" \`ー--- ",.::く、
/;;;''"  ̄ ̄ ───/ ゙ ,::' \ヾニ==='"/ `- 、 ゙ー┬ '´ / \..,,__
、 .i:⌒`─-、_,.... l / `ー┬一' ヽ :l / , ' `ソヽ
ヾヽ l ` `ヽ、 l ./ ヽ l ) ,; / ,' '^i
自作関数はmain関数に埋め込む部品と考えたらいいのでしょうか(´・ω・)?
>>917 そういう場合もあるだろうね。それだけじゃないけど。
>>ユージ君 君にはプログラミングにとって重要な素養が欠けているようだ。それは、注意深さだ。
920 :
デフォルトの名無しさん :2008/12/26(金) 23:28:08
C言語でソケットについて学びたいとおもっております 初心者が学ぶに最適な本をいくつかありませんか?
シューティングゲームを作ろうと思っています。 自機や弾などの画像はメインウィンドウにそのまま貼り付けるよりサブウィンドウに貼り付けて サブウィンドウをメインウィンドウ上で動かしたほうが当たり判定等が楽になったりしないかな?と思ったんですが、 どう実装するのが一般的なんですか?
最近は 2D のゲームでも DirectX の 3D 機能使って実装するのが一般的。
>>923 あんたも注意力が足りない。
>c:\documents and settings\yuji\my documents\
そ・・そういうことか!! マジで誰かに見張られてるかと思って死ぬかと思った・・(´・ω・)
926 :
796 :2008/12/27(土) 02:24:08
>>860 >CPUのキャッシュがどういう性質のものかも理解できていないじゃん。
DMA(HDD->DRAM直接転送)時は、CPU を経由しないのでCPU上のキャッシュメモリは
更新されないが、DMA が行われない場合は HDD → CPU → DRAMという経路を通るので
CPU から DRAM への書き込み時にCPUのキャッシュメモリが更新されるという理解でいますが、
間違ってますでしょうか?
CPU から DRAM への書き込み時にSSE のキャッシュ制御命令(PREFETCHT0等)で
意図的にキャッシュオフをする事も機能的にはできますが、通常、メモリに
書き込んだデータはすぐにCPUで使われる場合が多いので、通常そのような
実装はせずに、むしろ積極的にプリフェッチを利用しているものと理解していました。
927 :
921 :2008/12/27(土) 04:29:22
>922 2DのゲームはAPI使って実装してるものとばかり思っていました。 DirectXと言うことはサブウィンドウを作らずにメインウィンドウにテクスチャを貼り付けているのでしょうか?
>913 #include <stadio.h> … #include <stdio.h> の間違いだよな?間違いだと言ってくれ!
俺もずっとスタジオの略だと思っていた15の夏
#include <studio.h> と慣れない頃はよくtypoした思い出
俺エスティー・ディオって呼んでた スタンダード・アイオーか 通りすがりだがすごい収穫!
あんたら、標準入出力を英語でなんと言うか考えてもみなかったの?
標準出力とかそういう知識以前にC言語を勉強する場合が多いよな
某オープンソースのライブラリを使ってて、それは基本的に C言語のライブラリなんだがC++のラッパーもある。 で、そのC++のラッパーがファクトリパターンみたいに Foo::create でポインタを返しておいて、利用者側でdeleteしろという仕様なんだが・・・ これはクソ仕様という認識でいいよな。 あるいは、C++の場合はコンパイラが違ったらどっちにしろリンクできないから、 必ずコンパイラは同じだという確信犯でやってるのか? 自分でC++ラッパ書くしかないなーと思ってるけど、このあたり実際どうなん?
935 :
デフォルトの名無しさん :2008/12/27(土) 13:29:01
>>927 おそらくこれ以上はスレ違い
DirectXスレかゲーム製作スレ(板?)へどうぞ
>933 標準ライブラリをいくつか覚えれば、std〜で始まるライブラリが沢山あるから気付くんだけどな stdioはライブラリのことをろくすっぽ覚えない内から使うからスタジオとか間違える奴が結構居るね そして俺も小坊の頃は確かにスタジオだと思っていた
stdで始まるライブラリってどんなのがあったっけ?
stdio, stdlib, stdargの各インクルードファイルのことを言いたいのだと思われ。
stddef「私のことも忘れないで…」
すません opendir,readdir,closedirを使って 引数で指定したディレクトリにある画像ファイルをすべて読み込むプログラムを作っています 読む込む部分はコーディング済みで、load_image_data()とします int main( int argc, char *argv[] ) { DIR *dir; /* ディレクトリ情報を示すためのポインタ */ struct dirent *dp; /* 各エントリの情報を示すための構造体ポインタ */ char path[512]; if( argc <=1 ) { strcpy( path, "." ); } else { strcpy( path, argv[1] ); } if(( dir = opendir(path) ) == NULL ){ perror("opendir"); exit(-1); } for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){ load_image_data(dp->d_name);//読む込む } closedir(dir); } こんな感じでやろうとおもってるのですが、読み込む際、 指定ディレクトリではなくカレントディレクトリの走査になってしまいます。 ググってみたのですが、指定ディレクトリのファイル一覧表示はよくみかけるのですが、 読み込むのは見つかりませんでした、アイデアだけでもご教授ねがえませんか
chdir ?
load_image_data() にディレクトリとファイル名、2つを渡す感じですか?
>>942 path と dp->d_name を '/' で結合しなきゃ。
load_image_data 内でやっても、呼び出し元でやってもいいけど。
考えながら自力で組むのはしんどいですね がんばってみます ありがとー
引数ってあんまり意味内容な気がする・・
エログッズ「おっぱいがいっぱいセット」お届けで〜す (夕刊フジ) 通販を愛用するエログッズ・マニアが戦々恐々だ。 エロいマウスパッドの購入者に対し、恥ずかしすぎる商品名が明記されたままの梱包箱が送られていたことが、購入者からのクレームで25日、明らかになった。 妻や同棲中の彼女に内緒で、単なるマウスパッドとして購入したはずの宅配便。 到着の瞬間が、とんだ悪夢となってしまった。 「おっぱいがいっぱいセット」(1万5000円)の購入者のもとに届いた箱に、商品名がストレートに明記されていたのだ。 この商品は、いわば「立体型エロマウスパッド」。 ゲームソフトメーカー「AKABEi SOFT2(あかべぇそふとつぅ)」(福岡市)が、ファンクラブ限定の代金引換通販で販売。 手首を固定するパッド下部が、弾力のある少女の胸の谷間や尻の割れ目になっており、妄想と実用性を満たす画期的アイテムとして話題となっていた。 24日、購入者のクレームで事態が発覚。このテの商品は通常、中身がわからないような内容表示になっている。 発売元はHPで「一企業として管理意識の低さを大変恥ずかしく思っております」と謝罪したが、たちまちエロゲーム愛好者が集まるサイトで知れ渡り、格好のネタになった。
947 :
デフォルトの名無しさん :2008/12/28(日) 00:51:23
スマートポインターを7種類も8種類も作って、C++の言語設計者って馬鹿なの? これを用途によって間違わずに使い分けるより、new-deleteの対応付けをきっちりやる方が余程簡単だっつーのw ホント馬鹿だな。
で、質問は?」
「馬鹿なの?」が質問でしょ。
でも、スマートポインターの設計者とC++の言語設計者は別なので、
的外れの質問をしてる
>>947 が馬鹿。救いようの無い馬鹿。
安い釣りに釣られるなよ
>>947 あなたのような頭の良い人には smart pointer は必要無いですから使わないでください。
952 :
デフォルトの名無しさん :2008/12/28(日) 05:05:19
最適化されない型ってなんだったっけ? voli... なんとかだった気がするけど・・・
^Hatile
954 :
952 :2008/12/28(日) 05:15:57
く、わぃっけっつ〜
955 :
デフォルトの名無しさん :2008/12/28(日) 10:10:17
なんでVisualC++のコンソールって勝手に終了しちゃう不親切な設計なわけ? getchar();を標準でしてくれればいいのに。
>>955 「デバッグ開始」で実行するならブレークポイントくらい設定してるだろうし
「デバッグなしで開始」なら止まらないだろうからプログラム終了時に pause が入る。
デバッグしてるのに途中でとめないなんて普通ないからな
プログラムから制御することを考える 標準で入っていない: 止める/止めないは標準入出力で簡単に制御できる。 標準で入っている: 止める/止めないは特殊なAPIを呼ぶ必要がある。 前者の方が圧倒的にシンプル
そもそもVisualC++のコンソールなんていう特殊なものはない。
VisualC++のコンドームなら俺のコンソールにあるよ
2日間悩み続けてやっと引数を理解しました
関数から数値を返す意味なんてあるんでしょうか・? 関数に数値を渡すのと同じ計算結果になるし、意味ないような気がします
>963 同じ?何と何が同じなんだ
>>963 何が言いたいのかわからん。関数から数値返さないで関数で計算する
簡単な例出してみて。できることはできるよ。
>>963 C/C++ でいう「関数」は、数学的な意味での関数ではない。
(最初に「関数」と訳した奴がすべて悪い)
なので
>関数に数値を渡すのと同じ計算結果になる
という保証はない。
飛べない翼に意味はあるのでしょうか?
今、苦しんで覚えるC言語というサイトを見ているんですが 関数に数値を渡す #include <stdio.h> int sum(int,int); /* プロトタイプ宣言 */ int main(void) { sum(50,100); return 0; } int sum(int min,int max) { printf("%d\n",(min + max) * (max - min + 1) / 2); return 0; }
関数から数値を返す #include <stdio.h> int sum(int,int); /* プロトタイプ宣言 */ int main(void) { int value; value = sum(50,100); printf("%d\n",value); return 0; } int sum(int min,int max) { int num; num = (min + max) * (max - min + 1) / 2; return num; } 計算結果が同じ3825になるし なんで返さなきゃいけない必要があるのか解らないです
値を返さない方は画面表示にしか使えないが、 返す方はそれをまたさらに加算したりできるだろ。
>>971 そ・・そうか!!!
ありがとうございます!
973 :
デフォルトの名無しさん :2008/12/28(日) 16:26:50
1の2乗 + 2の2乗 + 3の2乗 + ・・・ + nの2乗が2000を超えるときのnの値と、 そのときの合計を求めるプログラムをwhileを使って作りなさい。
2乗のしかたがわからない・・
x * x
>973みたいな問題出す奴って、馬鹿か間抜けかどっちかなんだろうな。 1行目は「1の2乗+……が」というように式をそのまま提示しているのに2行目では「そのときの合計」と書いている。 1行目がそのままなら2行目では「そのときの値」で充分だし、 2行目を「そのときの合計」としたいのなら1行目は「1の2乗+……の合計が」とでもするべきだ。 尤もそれなら、「この数式のn項までの合計」とでもした方が余程間違いのない表現だと思うが。 何も考えずにこんな表現を使ったのならば只の馬鹿だし、考えた上でこの表現になったのなら間抜けだ。
頭が爆発しそうだ・・・ 難しい・・難しすぎる・・!!
979 :
デフォルトの名無しさん :2008/12/28(日) 18:30:31
答えください
>>958 release 時は実行後に pause コマンドを呼んでくれている。
これをデバッグ版でも呼べるようにするオプションくらい
つけてくれてもバチはあたらんと思うんだがね。
え、俺?
宿題はよそで。
デバッグ時は終了したらさっさとコード書き換えたいのに いちいち止まる方が面倒だ なんで結果が見たいのにデバッグで実行するんだ
C++でおすすめの開発環境はなんですか?OSはWinXP SP2です。 CPUが古いCerelonなのであんまり重すぎないものでお願いします。
Visual C++ 2008 Express Edition
C++の入門サイトってどこ見ればいいの?
988 :
985 :2008/12/28(日) 21:15:48
>>986 ありがとうございます
ちょっと導入してくる
>>979 それじゃ、その教科書の著者編者採用担当者が総じて間抜けなんだろうな。
苦しんで覚えてどうすんの。 言語なんてものは楽しんで覚えなきゃ。
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ int n = 1, sum = 0; while(sum >= 2000){ sum += n*n; n++; puts("\a"); } printf("n = %d\a\n", n); system("pause"); return 0; }
>>992 おいおい。ちょっとおかしいぞ。while の中身が逆。ついでになぜに機種依存
させる?こんなもんかな?
#include <stdio.h>
int main(){
int n=0, sum=0;
while(sum <= 2000){
++n;
sum += n*n;
}
printf("n=%d, sum=%d\n",n,sum);
return 0;
}
#include <stdio.h> int main() { int sum = 0; int n; for (n = 1; sum <= 2000; ++n) sum += n * n; printf("n = %d, sum = %d\n", n, sum); return 0; }
995 :
デフォルトの名無しさん :2008/12/29(月) 09:13:31
>>984 printfデバッグというものがあってだな・・・
#include <cstdio> template< bool b, int sum, int n > struct func_t { static void f(){ std::printf("n = %d, sum = %d\n", n-1, sum);} }; template< int sum, int n > struct func_t< false, sum, n > { static void f(){ func_t< (n*n+sum>2000), (n*n+sum), n+1 >::f();} }; int _tmain(int argc, _TCHAR* argv[]) { func_t< 0, 0, 0 >::f(); return 0; }
次スレ立ててくれ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。