【初心者歓迎】C/C++室 Ver.19【環境依存OK】
1 :
デフォルトの名無しさん :
2005/06/26(日) 22:45:25
STLつかうと一気に実行ファイルサイズが10倍に?!
フーン
夏夏夏夏
C言語で「夏」を表現してください。 腕の見せ所です。 よろしくお願いします。
printf("前橋 : 35.4 ℃");
断る
#include <stdio.h> int main(void) {putchar(0x89), putchar(0xC4); return 0;}
>1乙 , -'"´  ̄`丶、_ ,.∩ `ヽ 〃∪'´ ̄`二二人\ ヽ | ツ´ ̄ ̄ ̄ ̄´ ヾ ヽ. ', |ハ ,ニ、 ,. - 、 | | | l | | ハ ィハ ,二ヽ. | | | | | | | | じ' |トJ〉 /)} l | | ハ 、'_,  ̄,, 厶イ川| l l /\ .. イV\川 | ,' l l ,イ `l ̄´ / /ヽl l l | l ハ `メ、 〃 ヽヽ、__ノ l ∨ └‐イ「ト--ァ'´ ハヽ__ノ ヽ/ } l」」 / / }`ー 〈_n| 八 / / /ノ 〈二二人 c /\/ / , イ / /厂 /\__>< {_
この不敬ものめ! 秋篠宮佳子さまにあらせられるぞ アニメエロゲのキャラではないわ ゆめゆめおかずにしてはならぬぞ
プリキュア?
×※>954 からビット幅合わせる必要があるという意味だと解釈 ○※>956 からビット幅合わせる必要があるという意味だと解釈
>>2 環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
#include <stdafx.h> 後氏ね。
ダイナミックリンクしといてサイズが変わらないとか言ってるよこの人。
言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
息が合ってません
何でここでそのテンプレが…
なんか今日はカオスってないか?
あと氏ね
26 :
デフォルトの名無しさん :2005/06/27(月) 11:31:04
配列の要素数80万個って可能ですか?
28 :
デフォルトの名無しさん :2005/06/27(月) 12:04:06
二元一次連立方程式 t+k=a 6t+4k=b を解くのに以下のようにプログラムを組んだのですが、答えが0になってしまいます。 構文のエラーはないはずです。どこがいけないのでしょうか。 あと、文字の部分は気にしないでください。 #include <stdio.h> main() { float a,b,t,k; printf("合計は?"); scanf("%d",&a); printf("足の数は?"); scanf("%d",&b); t=(b-4*a)/2; k=(6*a-b)/2; printf("タガメの数= %d\n",t); printf("カエルの数= %d\n",k); }
29 :
デフォルトの名無しさん :2005/06/27(月) 12:05:04
二元一次連立方程式 t+k=a 6t+4k=b を解くのに以下のようにプログラムを組んだのですが、答えが0になってしまいます。 構文のエラーはないはずです。どこがいけないのでしょうか。 あと、文字の部分は気にしないでください。 #include <stdio.h> main() { float a,b,t,k; printf("合計は?"); scanf("%d",&a); printf("足の数は?"); scanf("%d",&b); t=(b-4*a)/2; k=(6*a-b)/2; printf("タガメの数= %d\n",t); printf("カエルの数= %d\n",k); }
30 :
28,29 :2005/06/27(月) 12:07:18
二重カキコすまそ
scanf()とprintf()の中のフォーマット文字列の中の%dがまずいんじゃね?%fに変えてみて。
t=(b-4*a)/2; k=a-t; じゃだめなのかorz
33 :
デフォルトの名無しさん :2005/06/27(月) 13:09:24
すみません、他スレに書き込んだのですが反応ないので。 分散を計算してるんですけど、なぜこうなるのか良くわかりません。 解説お願いします variance += (total[i] - (double)sum / N) * (total[i] - (double)sum / N); いちよう書いておくとVisual C++ XPです。
分散の定義が (平均からの差)の2乗 だから。 定義である以上、なぜは(ほとんど)許されない。
二元一次連立方程式 t+k=a 6t+4k=b を解くのに以下のようにプログラムを組んだのですが、答えが0になってしまいます。 構文のエラーはないはずです。どこがいけないのでしょうか。 あと、文字の部分は気にしないでください。 #include <stdio.h> main() { float a,b,t,k; printf("合計は?"); scanf("%d",&a); printf("足の数は?"); scanf("%d",&b); t=(b-4*a)/2; k=(6*a-b)/2; printf("タガメの数= %d\n",t); printf("カエルの数= %d\n",k); }
36 :
デフォルトの名無しさん :2005/06/27(月) 14:09:13
>>35 t=(b-4*a)/2;
k=(6*a-b)/2;
のとこは、
t=(b-4*a)/(float)2;
k=(6*a-b)/(float)2;
にしないとダメだとおもうぞ。
>>36 > (float)2
2.0で十分だろ。
>>35 >printf("タガメの数= %d\n",t);
>printf("カエルの数= %d\n",k);
%dの意味を調べましょう。
>>35 は釣り?
a,bにどういう値を指定したらそうなるのか書いてない。
scanfの使い方も間違ってるし、printfも間違ってる。
釣りか。 %dのことをを 全部 %f にしてやってみろ。
>t=(b-4*a)/(float)2; >k=(6*a-b)/(float)2; 精度の高い型に強制的にキャストされるんじゃ? でないと、コンパイル時に桁落ちの警告が出るはず。
>>35 ある意味、高度な問題だ。
二元一次方程式としては解は実数だが、
問題の解としては整数値に限定される。
ましてやその範囲はゼロもしくは正数。
その辺の吟味がまったくなされていない点で、
テストの点数としては零点に限りなく等しい。
足の数や匹数をfloatとしている時点で(ry
今時のタガメとカエルはそういう足の数なんだよ。
4.5本足の蛙。
ちなみにオレは、よく3本足と間違えられるくらいすごい。 という夢を見ますた。
48 :
28,29,35 :2005/06/27(月) 16:01:15
つい最近習ったばかりでよくわからないんです。 答えて下さった方、ありがとうございました。 あとは、自分で解決するので、以下、スルーして下さい。
これが有名なカエタガ算か・・・
フルーツ型のポインタ A B があったとして、これらが本当は リンゴ型 と みかん型のインスタンスだった場合に CreateMixJuice(Fruit* fruit0, Fruit* fruit1) みたいな関数を読んだときに、本来の型に合わせたミックスジュースを作りたいときはどのように設計したらいいのでしょうか?
>>50 > 関数を読んだときに
関数の何を読みたいのか?によるな。
>>50 ミックスジュースとは何か を考える。
ミックスジュース は、フルーツをつぶしてできた液体の集合である。
ミックスジュース型 は 液体(群) を暗に擁し その生成には フルーツ(群) を必要とする。
フルーツから液体を精製する方法は、フルーツに委ねられるべきだろう。
しかしながら、作業の実態は個々に異なることを想定せねばなるまい。
⇒フルーツ型に virtual method つぶす
各種フルーツによって、具体的な作業を記述する
りんご: method つぶす (実装は おろしがねでガリガリ)
みかん: method つぶす (実装は 手でぐちゃっと)
ミックスジュースは、渡されたフルーツに対し つぶせ と命じるだけだ。
こんな答えで良いわけ? ネタなら↓コレも参考になるのか?
http://pc8.2ch.net/test/read.cgi/tech/1090816011/
>⇒フルーツ型に virtual method つぶす やはりそうなりますか。 つぶす関数を二回呼んで、それぞれの呼び出しの戻り値(液体構造体?)から ミックスジュースを作る、と。 できれば、Fruit::Mix(Fruit* other)みたいな仮想関数をよういして、 本来の型に合わせたMix関数が呼ばれて、引数のFruit*もついでにオーバーライド?してくれるような 方法が知りたかったのですが・・・
>>53 もう少し設計対象を解析したほうが良いかもね。
class フルーツ { virtual Mix() = 0; }
class りんご : public フルーツ { Mix(); }
りんご anApple;
フルーツ* someFruit = &anApple;
someFruit->Mix(); // ←これで 本来の型に合わせたMix関数が呼ばれるわな。
> 引数のFruit*もついでにオーバーライド?してくれるような
> 方法が知りたかったのですが・・・
趣旨不明。
Mix という行為をするために 引数のFruit から情報を必要とするのなら
フルーツ型に情報取得関数が必要なだけ。(仮想関数かもしれないし、実関数かもしれない
ex) virtaul フルーツ::混ぜるための情報くれ
あと、Mix という行いはフルーツがするべきなのかも検討しといたほうが良いと思われ
※ 混ぜ合わせの結果が元のフルーツに属すべきかどうかとかね。
って設計にまつわるスレは、ココでも良いんかね? (C++ 含むけどさ…
このスレいいなぁ。
>>54 >>55 レスありがとうございました、もう少し検討してみます。
ダブルディスパッチというのも調べてみます<(_ _)>
他スレで相手にされなかったみたいなので...orz やっぱりC++使う以上は、継承とかバリバリ使えないといけないのでしょうか。 ウィンドウズでVisualC++とか使っている範囲では、 殆どそんなテクニックは意識したことが無いのです。
使えんより使えたがいい罠
所詮道具なんだから、無理せず自分にあった服を着る考え方で良いんでない? 継承が使える ってのと うまく継承を使って区分けできてる ってのとは微妙に違うからねぇ… 使えたほうが良いといえるのは、使えるようになった時だしな。
61 :
デフォルトの名無しさん :2005/06/27(月) 20:06:02
#include <iostream> #include <string> using namespace std; class storage { public: string* s; int s_num; //public: storage() { s_num = 2; s = new(string)[s_num]; s[0] = "cat"; s[1] = "dog"; } ~storage() { delete [] s; } void show() { for( int i = 0; i < s_num; i++ ) cout<<s[i]<<endl; } }; int main(int agrc, char** agrv) { storage A; A.show(); } をVC++.NETでコンパイルするとエラーが出てしまいます。gccだと普通にコンパイルできるのですが。
62 :
61 :2005/06/27(月) 20:08:28
error C2143: 構文エラー : ';' が '[' の前にありません。 error C2337: 's_num' : アトリビュートが見つかりません。ビルトインまたは、現在の名前空間でアクセスできるカスタム属性ではありません。 ですよろしくお願いします。
>>61 new(string)[s_num] → new string[s_num]
括弧で囲ったら、newの配置構文(placement new)になってしまい、
意味が全然違う。
>>50 変なアナロジーを持ち出すとよけいな混乱を誘うという好例。
それとも本当にミックスジュースをつくりたいのか?
66 :
61 :2005/06/27(月) 20:57:45
67 :
デフォルトの名無しさん :2005/06/27(月) 22:15:21
素朴な疑問なんですが、 拡張子を".h"ではなく、".hpp"にする時はどういう時なんでしょうか? C++のクラスファイルか何かでしょうか? あと、よく関数とか構造体で、_func()や、struct _st { ... }; と、アンダーバーがついてるものがありますが、これらはどういう基準で付けるものなんでしょうか?
>>67 hppにするのは各自のコーディングスタイルの問題。好きにしろ。
アンダーバーで始まる名前は処理系用に予約されたもの。自分がアンダーバーで始まる名前を使ってはいけない。
>>69 中間ファイルをそのままアップロードしている辺りがダメダメ。
72 :
デフォルトの名無しさん :2005/06/27(月) 23:23:55
SDKで ディスクのビットマップを表示したいのですが、 なぜか白黒で表示されます。なんでなんでしょうか? CreateCompatibleDC SelectObject BitBlt を使っています
75 :
デフォルトの名無しさん :2005/06/27(月) 23:31:02
ガッ
76 :
デフォルトの名無しさん :2005/06/28(火) 00:49:42
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i;
char *buf;
buf = (char *)calloc(16, sizeof(char));
for (i = 0; i < 10; i++) {
*buf = 'A';
buf++;
}
printf("%s", buf);
return 0;
}
このコードでAが10個出力されるのを期待してたんですが、
何故か出力されません。なんででしょうか?
ポップアップ用:
>>76
>>76 bufを移動させてるからな。printfに渡したときには文字列のケツを指してる。
callocで確保した領域を保存する別のポインタを用意しておいて
それをprintfに渡せ
78 :
76 :2005/06/28(火) 00:56:29
>>77 あっ・・本当ですね・・
こんな些細な事に気づかなかったなんて・・
本当にありがとうございました
79 :
デフォルトの名無しさん :2005/06/28(火) 01:46:36
あるいは、ループカウンタ使ってるなら for (i = 0; i < 10; i++) { *buf = 'A'; buf++; } じゃなくて for(i = 0;i < 10;i++) *(buf + i) = 'A'; //または素直にbuf[i] = 'A'; じゃ駄目なのか? あるいはchar *ptrを付け加えて for(ptr = buf;ptr - buf + 1< 10;ptr++) *ptr = 'A'; でも良さそうだが。
「デストラクタはオーバーライドしない」という記事を ネットで見ました。 コンストラクタもオーバーライドしたら困ると思います。 継承の時、オーバーライドしない関数は コンストラクタ&デストラクタのみ という 見方でよろしいでしょうか?
>>81 デストラクタはオーバーライドします。
コンストラクタはオーバーライドできません。
継承の時、オーバーライドしない関数は、
オーバーライドする必要が無い関数です。
>>82 レスありがとうございました。
ということは、仮想関数にしないと
基本クラスのデストラクタは全く呼び出されないと...。
>>76 printfに渡す前にbufの末尾を\0終端するのを忘れないように。
86 :
K :2005/06/28(火) 02:39:46
pascalの宿題解いてくれませんか?
>>84 違うよ。派生クラスのデストラクタが呼び出されない。
C言語で、特定のキーを押しながら他のキーを押す、ということはできますか? キー操作を行うオートパイロットソフトなんてものもあるみたいですが、 これを機にプログラムの勉強もできればと思ったのですが、 どこから手をつけてよいかさっぱりです。
>>89 標準ではできないが、環境依存の部分で出来ることがある。
ファイル内のある文字(例えばa)を数えるときに、 while(!cin.eof()) { cin >> c; if(c == 'a') { count++; } } と書くのと、 while(1) { cin >> c; if(c == EOF) { break; } if(c == 'a') { count++; } } と書くのとでは結果が違いますが、これはどうしてでしょうか。 上でも良いような気がするのですが。
92 :
89 :2005/06/28(火) 08:24:10
>>90 お返事ありがとうございます。
環境依存で、ということは例えばウィンドウズ依存になるけど、ということでしょうか?
>>1 のアップローダーの、「スレッドを立てるまでもないソース」の85に
詳細をうpさせていただきました。
>>91 結果は変わらないと思うけど。
ただ上のやつでは
if(c == 'a')
のところで c の値が EOF のときにも比較しちゃってるだけの話でもちろん false だし。
>>92 うpしたならそのファイルへのリンクを張るようにしましょう。
>>89 > C言語で、特定のキーを押しながら他のキーを押す、ということはできますか?
Cで(物理的に)キーは押せないだろう。
ヒント:AIBO
>>94 まあまあ、それくらいの言葉使い許してやってくれw
いや、漏れは>94じゃないが>89の言いたいことが判らん。 プログラムで特定のキーを押したことにしながらオペレータに他のキーを押させたいのか、 プログラムで特定のキーも他のキーも押したことにしたいのか、 それらをプログラムで検出したいのか、 >89を読んだだけで判るのか?
>>98 Ctrl+CみたいにA+Bとかやりたいという意味だととったが。
100 :
デフォルトの名無しさん :2005/06/28(火) 10:41:49
100
101 :
デフォルトの名無しさん :2005/06/28(火) 10:56:18
質問です。 ツールを作っていて、まず起動直後に GetCurrentDirectory しているのですが、環境によって内容が違ってしまいます。 私のマシンだときちんと起動された場所が取得できるのですが、友人のマシンですと C:\Documents and Settings\XXXXXX\ といった、ユーザーフォルダがカレントディレクトリとして取得されてしまうのです。 (ともにWindows2000です) そういえば昔、私はこの問題に腹を立てて、Windowsの設定から「カレントディレクトリをユーザーフォルダにしない」設定をした覚えがあります。 これについて解決方法を探しているのですが、EXEパスを利用することを考えたのですが問題がありました。 別のツールから「カレントディレクトリを指定した上で呼び出される」という性質と「直接EXE起動される」という性質をあわせもつツールなのです。 プログラム側でこれを回避する方法はありませんでしょうか? 最も良いのは「EXEを直接呼び出したとき、ユーザーフォルダにはいかないようにする」なのですが。
exeパスじゃないとすると、どのディレクトリになって欲しいんだ?
>>101 Windows GUI 環境における「起動された場所」とは何かという疑問があるな。
>>102-103 すばやいお返事ありがとうございます。
>exeパスじゃないとすると、どのディレクトリになって欲しいんだ?
EXEをダブルクリックで指定された場合 → EXEパス
外部ツールから呼び出された場合 → 外部ツールに「カレントディレクトリを指定してEXEを起動」があるため、カレントディレクトリ
となって欲しいのです。
>Windows GUI 環境における「起動された場所」とは何かという疑問があるな。
確かにごもっともです。
ですが、なんとなく、やりたいことは察していただけるかなと思いますが、直接的な解決策はないものでしょうか?
>>101 共にそれがカレントディレクトリなんだから、
そのままでいいんジャマイカ?
「C:\Documents and Settings\XXXXXX\」がカレントディレクトリだと何が問題なんだ?
>>105 多数のファイルを作成して(フォルダ内を)散らかすツールなので、
「C:\Documents and Settings\XXXXXX\」を散らかされると使う側から見てムカツクのではないかなと思いまして。
そもそもカレントディレクトリってEXEのあるパスのことではないが。 Windowsの挙動に腹を立てる前に、まずソフトの仕様がおかしいキガス… EXEへのショートカットでも作っとけば? ショートカットの設定で作業フォルダが指定できるから。
C言語からsendmail等を使いたいんですが、 そういうパイプ処理はOS依存なんでしょうか? WinXP BCC5.5.1です
>>106 まず、「カレントディレクトリとは何か?」
から調べた方がいいよ。
とりあえず、その場合は使用者がカレントディレクトリを変えるものだろう。
>>106 そう思うんなら、どこに行くかわからないカレントディレクトリを問答無用で使うのが間違い。
おとなしくコマンドライン引数使え。
なるほど。了解いたしました。 通常はモジュールパスのフォルダを使い、 コマンドライン引数で「/current」と指定されていたらカレントフォルダを参照するようにします。 ありがとうございました。
浮動小数点の仕様は、機種依存しますか? 倍精度(double)は考慮せず、 単精度(float)の場合のみのケースではどうなんでしょうか。 具体的には、Intel系 -> PowerPC系 へのコンバート を想定してます。
おそらくバイナリで保存して、という話だと思いますが、 Intel、PPCなど、メジャーなCPUは同じ規格の浮動小数点を使ってるので大丈夫です。 (ただしエンディアン変換の事も忘れずに)
>>112 もちろん機種依存。
ただしC/C++とは無関係だけど、IEEE754という浮動小数点数表現の規格がある。
そしてIntelもPowerPCもこれを採用している。
115 :
112 :2005/06/28(火) 16:18:28
バイナリファイルにfloat型の同じ値を書き込んで、 実験してみた結果、同じ値を出しました。 丁寧な解説ありがとうございました。
>>108 sendmailはunixでゴザイマス
117 :
デフォルトの名無しさん :2005/06/28(火) 18:24:19
118 :
267 :2005/06/28(火) 18:33:32
double型の二次元配列を戻り値にしたいんですが, gcc -o simplex simplex.c simplex.c: 関数 `turnSimplex' 内: simplex.c:80: error: 互換性のないポインタ型からのreturnです simplex.c:80: 警告: function returns address of local variable というエラーが出ます,どうやったらいいですか?
>>117 CPUの性能向上で、よほどの大量の演算でも人間には時間のかかり具合なんて区別できないから、
どうせなら精度の良いdoubleにした方がお得な感じがする。
Cの数学関数はC99でfloat版も用意されたな。VC/BCCなんかにも独自に存在する。
どうせ中の人はあれだろうけど。
>>118 それだけで何を推測しろと言うのだ?
エラー系の質問者はたいていそうだが、ソースくらい出せよ
>>117 状況にもよるが、大量の配列なんかを扱うときはキャスト云々よりメモリアクセスの速度のほうがはるかに致命的なんで、floatのほうが速いこともある。
>>118 ローカル変数のポインタを返すのは…マズイっしょ。staticな配列ならいざ知らず。
double型配列をreturnで戻すのではなく、関数の引数として与えるように
関数の仕様を変えた方がいいと思う。
124 :
108 :2005/06/28(火) 20:52:40 BE:242417298-##
すみませんお願いします
テストデータを「ちょいとCかなんかで作ってよ」といわれて焦っています 昔ちょっと触っただけなのに 早速詰まってしまいました、ご教授ください ABCDEFG00001 ABCDEFG00002 : ABCDEFG10000 と末尾の数字だけカウントアップさせたファイルをたくさん作りたいのですが char *msg = "ABCDEFG" char *str = "00000"; for (short i = 1; i < 1001; i++) { str = (char *)i; char * strcat(msg, str) <msgの内容をファイルに書き出し> } みたいなのを書いたのですが、これだと i<10000のときに桁数が減ってしまいます。 例えば i = 500のときはstrは "500" じゃなくて "00500" としたいのですが方法ありますでしょうか。
spritnf
129 :
108 :2005/06/28(火) 22:29:15
sendmailは例です sendmane.exeでも何でもいいんです
(char *)iって・・・・何このバカ・・・
std::ifstream ifs("test.dat"); ifs.fill('0'); for (unsigned i = 1; i <= 10000; ++i) { ifs << "ABCDEFG" << ifs.setw(5) << i << '\n'; } ifs.close();
>>126 char *msg = "ABCDEFG";
for (int i = 0; i < 10000; ++i) {
fprintf(stdout, "%s%05d\n", msg, i + 1);
}
>>126 なんでそれで動くのかがわからん。
for (int i = 0; i < 10000; i++)
{
char buf[64];
snprintf(buf, sizeof buf, "ABCDEFG%05d", i);
}
shortでメモリサイズけちろうなんて馬鹿な考えもやめろ。
その程度ならワンライナーでつくれてしまいそうだ
釣りってわかってて、みんな優しいですね。
136 :
126 :2005/06/28(火) 22:44:07
あほ丸出しで本当にお恥ずかしい、ありがとう
このスレ良いね。 ひとつの答えだけじゃなくて何度かの答えがあるから こういう考え方も出来るのかと勉強できる。 Q&A形式で過去ログまとめてみていい?
ガソガレ
>>137 過去ログdatのまとめたのでも要る?zipとかで渡せるけど
このスレのPart1から居る奴とかすげーな なんか尊敬できる
独習Cと独習C++とかいう黄色い本をやり終えたのですが、黒い画面に文字や数字を表示するだけで終わってしまいましたorz Windowsアプリやimodeのアプリ、PS2で動くゲームのようなものって一体どうやったら作れるのでしょうか?
たまに脱線して黒煙あげるけどな。
>>143 C/C++には標準的なグラフィックライブラリが無いので
言語を覚えただけでは絵はかけません
WindowsならGDI,GDI+, 3DもやるならDirectX
i-modeのアプリはJavaで書かれている
ゲームを作りたいならDirectXがおすすめ
>>143 さて、次に何がしたい?
Windows、i-アプリ、コンシューマーゲーム機では要求されるスキルは
かなり違うと思われ。
Windowsプログラムを書きたいならまずはSDKサンプルについてくる?WinMainから始まる
全てのWindowsプログラムのスケルトンコードに自分の欲しい機能を付加していく、のが
一番とっつき易いだろうな。で、ある程度Windowsプログラムの何たるかが判ってきたら
MFCやATLといったWindows用ライブラリ、STL、boost、Lokiといった汎用テンプレートライブラリ、
マネージドコードがいいなら.net Frameworkを活用してプログラム作成を少しでも楽にするとよかろう。
>>145 グラフィックライブラリとは一体何ですか?
DirectXとJavaは聞いたことがありますが・・・。
小学生の時にBASICを使ったときはCIRCLE()を使え
ば円が描けたりしたのですが、C言語には無いんですか?
>>146 iアプリ、ゲーム機は芝居が高そうなのでWindowsアプリからやっていこうと思っていますが
独習C、独習C++をやったあと何をすればいいのか解らない状態です。
>>147 ウインドゥを作るのところ、みてみました。
あれを全部打ってウインドゥが表示されるだけってのはかなりつらい気がorz
>>148 >あれを全部打ってウインドゥが表示されるだけってのはかなりつらい気がorz
あれを全部コピペして(ry
最初はコールバック関数だけでいいよ。
こーゆー用語も自分で調べてみよう(ヒント:googleで[用語 コールバック]。
「用語 コールバック関数」だったわ、スマン。
Windows上でどういったプログラムを開発しようとしているかだよなぁ… ビジネス用アプリケーションなのか、ゲームなのか、小物的アクセサリー(時計、デスクトップ アクセサリー、「アレ」以外の何かなど)やツール類なのか、特殊なユーティリティ (アンチウィルス、ディスクチェッカ、ウィルス、ポートスキャン、クラッキングツール、 攻撃ツールなど)、はてはデバイスドライバなのか、システムサービスなのか… まぁいずれは全部を視野に入れているなら、C/C++は賢明な選択だったと思う。 で、148さんよ、あんた作りたいプログラムがあるのかい?
>>149 どうもありがとうございます。
コピペでいいんですか?w
>>151 今はどうやったらDOSの黒い画面に文字と数字しか表示
できない状態から脱却することだけしか考えられませんorz
CとC++の二冊で1000ページやって文字しか表示できないとは思っていなかったので。
ペイントブラシ程度のものが作れればとりあえずは良いと思っています。
>>148 >グラフィックライブラリとは一体何ですか?
BASICの場合は、言語自体に描画機能が付いてたけど、
C/C++には描画機能がないので、
代わりに、プラットフォームが用意する関数郡(ライブラリ)を呼ぶ。
たとえば Windows で円を描きたかったら、Ellipse、
UNIX等の X Window システム上で円を描きたかったら、XDrawArc、
を呼び出す、という具合に。
>>152 >コピペでいいんですか?w
いいんですw
初めは部品部品のコピペで、必要に応じてパラメータをいじればいいと思う。
というか慣れてきた後も、(信用できる)サンプルコードの
コピーをいじるって手法はかなり活躍するかと。
生のAPIを使ってWindowsプログラムを作る場合は、
誰が書いてもああいうコードが必要になるから覚悟したほうがいい。
でも機能のかたまりは使い回せるように自分用のライブラリでも
作っておけば、アプリ作成はそんなに辛くないと思う。
VisualC++のMFCとかC++Builderとか使うと
生のAPIをあんまり使わずに簡単にWindowsアプリ組めると思うけど、
俺は使ったことないのでわからんぽ。
3DやりたいならOpenGLだろ DXにいくとDQN化する可能性大
Windowsアプリケーションの基本(メッセージポンプ、メッセージ、 ウィンドウクラス、ウィンドウプロシジャ、リソース...)を 一通り理解したらさっさとMFCかATL/WTLへ行くよろし。 なお、「理解」したいんなら猫は適切ではない。
>>108 パイプ処理はもちろん環境依存。
sendmailのようなプログラムとどういうやりとりをしたいのか書きましょう。
ポインタを整数値にキャストすることについての質問です。 サンプルを見て理解できなかったので、色々検索してみました が、上手く掛かりませんでした。 pBufferに、freadでファイル内のバイナリデータ全て を入れてます。(正しくは指している、です) typedef struct { int num; float (*f)[16]; } t_loader; t_loader* LoadFile(char* pFilename) { t_loader* pLoader; // ファイル読み込み&Allocate (略) // mallocの戻り値ポインタを変換 pLoader = (t_loader*)pMallocPtr; // ココです pLoader->f = (float(*)[16])( (long)pLoader->f + (long)pLoader ); ポインタをlongにキャストし、「加算」した値というのは どういう意味を持つのでしょうか? キャストはアドレス値に変換しているのは分かるのですが、 加算というのが理解できないです。
>>158 pLoader->fを+1すると, sizeof(float)*16バイト進んじまうだろ?
任意バイト進めるには(char *)とか(long)とかにキャストする必要がある。
ってことなんじゃねぇかな、何したいのか分からないこの子ー度。
>>158 それ、実際に動作するコードなのか?
少なくともそれだけだと、ちょっと理解しかねる
longにキャストしてる時点で糞コード
161なら何にキャストする?
>>162 161じゃないが、演算のためにポインタを整数値にキャストすること自体が
間違ってると言いたいのだろう。
アドレス+整数は普通だが アドレス+アドレスって、何か意味あんのか 一体何がしたいんだ
165 :
158 :2005/06/29(水) 03:54:00
構造体はサンプルでは、もっとメンバ多いです。 int n; int nA; ... float (*f)[16]; float (*f1)[4]; ... だから、本来(というより自分の知識内でのやり方)は アドレスをサイズ分ずらしメンバのポインタに入れていくのを longキャストの部分のおかげでコード量がかなり抑えられているように 感じます。 ポインタ->整数値の例を取り上げたサイトは御存じありませんでしょうか
なんか、offsetofとか使えば済む話のように聞こえるんだが
気のせいだろうか
それにしても
>>158 のコードは不可解
あぁ、なんかやりたいことわかってきた。 >pLoader->f = (float(*)[16])( (long)pLoader->f + (long)pLoader ); この行より前に、ポインタに整数値読み込む処理があるだろ? 組込系とかで、めちゃめちゃに資源が限られてたりするわけ? そうでなければ、そのサンプルは糞だから参考にしないほうがいい。
1)pLoader->f1, pLoader->f2,....に、実際のデータにおけるオフセットを入れる 2)pLoaderに、データ読み込み 3)pLoader->f1, pLoader->f2,....を再計算 ってとこかな いや実に糞なコードだな 組み込みであっても、不要なコードだろ
つーか(float(*)[16])の意味がわからんが ((float*)( (long)pLoader->f + (long)pLoader ))[16] これならまだわかるが。
テポドンの制御ソフトらへんだと思われ。
>>169 はぁ?
(float(*)[16])は、float[][16]のような二次元配列を指すポインタに
キャストしとるだけだろ
>>171 なるほど、やっとわかった。
なんつーか高度なのか
単にわかりづらいだけのコードなのかわからん。
>>158 やっとわかった。
t_loaderのメンバのポインタは、ロード時にfread()でセットされるんだろ。
ファイルのヘッダレコードの中に、構造体のレイアウトどおりに
オフセットが記録してあって、データの先頭からのバイト位置(オフセット)が
一旦ポインタに格納される。
で、データをロードした後で、メモリ上のレイアウトを再計算してるわけだ。
ちょっとトリッキーだな。
175 :
158 :2005/06/29(水) 04:44:35
なるほど。fread時にポインタにオフセット値を 入れておくのですか。 ポンと手を叩きたくなるほど納得行く説明 ありがとうございました。
ctrl+cでプログラムを強制終了する際に、これをキャッチすることは出来ないでしょうか?
178 :
デフォルトの名無しさん :2005/06/29(水) 13:59:24
自作クラスって外部変数として使えますか? error C2653 : 識別子がクラス名でも名前空間名でもありません。 というエラーが出るのですが
>>178 ヘッダをインクルドする前に型を使っている予感
182 :
180 :2005/06/29(水) 14:21:15
>>181 ヒント:>177は環境を提示していない。
#include <iostream> using namespace std; class CA { public: CA(void){} CA(int){cout << "a";} }; main() { //new CA(1)[2]; //new CA[2](1); } CA(int) のコンストラクタが2回呼ばれると思ったのですが、駄目でした。 配列でとった時、デフォルトコンストラクタ以外を走らせるのは不可能なの ですか?
不可能
187 :
デフォルトの名無しさん :2005/06/29(水) 19:47:56
まとめサイト作るって言って歓迎されたのでまとめ開始してます。 ver17あたりからまとめてる所。 1スレだけで膨大な量なんでメモ帳で項目分割。 17以後のログは勝手にまとめてますが許してください。 17以前は過去ログにあるものだけ掘って見ます。 過去ログ進呈してくださる方歓迎。 日々日々良ソースやアルゴリズムなど有難う。 プログラマの皆さんに感謝をしつつ、まとめ作業開始。 以後、何事も無かったかのように本来の質疑応答をどぞ ↓
>>188 配列各要素に同じ値でいいんだったら、
class CA1 : public CA {CA1() : CA(1) {}};
とでもすればいいじゃん。
#私は嫌だけど。
191 :
デフォルトの名無しさん :2005/06/29(水) 20:07:47
>>185 の
new CA[2]; ってどういう意味ですか?
どういうふうに使うのですか?
>>191 CAがクラスならCAクラスのインスタンスを2つ作る
CAが何かのデータ型なら、2つ分の連続したCA型変数の領域を確保する
ん? こうなったよ? #include <iostream> using namespace std; class CA { public: CA(){cout << "default" << endl;} CA(int x){ cout << "param int x = " << x << endl;} }; main() { new CA[2](10); } [実行結果] param int x = 10 param int x = 10
何かゴミ捨て場漁ってたらVC++6.0が出てきた。 どうすりゃいいんだ?一応インストしてみたら使えるし。 まぁ、いいや。わーいいいもん手に入れたー
とりあえずSTLPortでもいれとけ。
最新のPlatformSDKはVC++6.0では使えないので注意 所詮は過去のコンパイラよ
ヽ(`Д´)ノ ウルサーーーイ
200 :
145 :2005/06/29(水) 21:57:49
Windowsアプリを作る場合、MicrosoftのVisualC++とかいうのは必要なのでしょうか? いきなり数万も投資するのは抵抗があるので、とりあえずフリーでダウンロードできる VisualC++Express2005Beta2とかいうのをダウンロードしたのですが、ボタンが多すぎるし ヘルプは何処を読んで良いのか解らず全然使い方が解りませんorz
WinAPIが扱えるならどれでも VCがそれなりに便利なのは確かだけど
202 :
145 :2005/06/29(水) 22:08:26
ちなみに今使っているのは本のCD-ROMについていたBorlandC++コンパイラとかいう DOS窓から使う味も素っ気もない奴なんですが、これで問題ないでしょうか?
このスレ褒められてから回答が丁寧だな おまいらほめられて伸びるタイプなんですね
>>194 そんな文法は標準では無かったはず・・・。
コンパイラ何?
>>187 組み込み配列の要素ごとのコンストラクタ制御について、何か提案されてたっけ?
>>205 有難うございます。作業量大幅UPキター(汗
作業してたらこんな時間orz
明日からpart1から編集入ろう。
まだローカル作業中。ページ申し込みしてきました。
1日で100レス以上行くので早い事part19まで編集しなければ追いつかない。
ガンガル
スレ汚しレスすまそ。
以後、何事も無かったかのように ↓
Unixとかのコマンドラインアプリで、画面の状態を更新する物はどうやっているんですか? 例えば、エディタとかゲームとか。普通にprintf系で出力してないんでしょうか。
>>208 もし貴方の優れた試みが成功したならば、恐らく多くの2chのプログラマーが
大きな助けとなるでしょう。
英語の直訳風に言ってみた。
>>212 >>213 cursesで行けそうですね。有り難うございます。
エスケープシーケンスでもできるんですか?ちょっと想像つかないのですが...
216 :
145 :2005/06/30(木) 01:14:22
>>203 DelphiってPascalですよね。
CとC++を覚えたばかりで更に他の言語を詰め込むのってどうなんだろう。
普通Winアプリを作る場合、やっぱりC++BuilderとかVC++のようなRADツールを使うんですよね?
メモ帳でWinアプリのソースを書いてBorlandのC++コンパイラを使ってDOS窓からコンパイルしている人っていますか?
VC++Express2005の使い方がどこかにあればいいんですが、全然見つからないorz
やっぱり諭吉さんとお別れして製品版を手に入れるほか無いですかね。
というか製品版にはマニュアルついているんですよね?
パソコンにプリインストされていたOfficeみたいにマニュアルが付属していなかったら最悪orz
>>215 man terminfo
つか、その手のプログラムのソース見れ
書評みたいでいいな。発言者が「208氏」ってなんの。 「本ページは名無しの、名無しによる、名無しの為の過去ログである。 トピックはどれも現場(学校、研修所、会社、学校)で生まれたものであり、 これを読めば貴方もデフォルトと成ることでしょう(意味不明」
>>217 man見ときます。すいません。
この手のプログラムって大抵巨大なんで初心者には厳しい...
>>216 >CとC++を覚えたばかりで更に他の言語を詰め込むのってどうなんだろう。
そう思うでしょ? でもね、人間というのはティミが考えてるよりもっともっと
包容力があるんだよ。
222 :
デフォルトの名無しさん :2005/06/30(木) 07:38:49
accelerated c++(和訳版)に載っていた入力単語の登場回数を数えるサンプルコードなのですが、 コンパイルは成功するのですが実行しても意図した動作をしません。 恐らく無限ループになっています。 何度か見直して、ちゃんと本の通りになっていると思うのですが・・・何処がダメなのでしょうか? int main(){ string s; map <string,int> counters; while (cin >> s) ++counters[s]; for (map<string,int>::const_iterator it = counters.begin();it != counters.end(); ++it){ cout << it->first << "\t" << it->second << endl; } return 0; }
>>222 BCC5.5.1 + WindowsXPSP2 では正しく動く。
環境は?
>>223 cinの入力終了方法を分かってませんでした_no
Ctrl+zを入力たら上手く動きました。
すみません。
以下のプログラムを実行してもkeyは何も表示されず最後のレコードの値しか表示されません。 mapの使用を終える前にkeyをdeleteしてしまうとまずいのでしょうか? しかし、最初のループでdeleteをせずに後のループでdelete &(it->first)と言う様にやってもダメな様だし どうすれば良いのでしょうか?やりたい事は文字列をキーにしてunsigned int二つ分のデータを値にする事です。 #include <iostream> #include <string> #include <map> using namespace std; void itoa(char* str,unsigned int num) //数値から数字への変換関数 {unsigned int radix=10;unsigned int i=0;while(num){str[4-i]=(char)(num%radix+48);num/=radix;i++;}} int main(){ map <string,unsigned int*> range;int i=0;string *index = NULL;char tmp[5] = "";while(i<10){itoa(tmp,i);index = new string(tmp); range[*index] = (unsigned int*)malloc(sizeof(unsigned int)*2);(range[*index])[0] = i;(range[*index])[1] = i+10000; delete index;i++;}i=0;for(map<string,unsigned int*>::const_iterator it = range.begin(); it != range.end(); ++it){ cout << "key:" << it->first << "\tvalue1:" << (it->second)[0] << "\tvalue2:" << (it->second)[1] << endl;free(it->second);}
>>226 突込みどころ満載なんで一言だけ。
itoaが期待通り動作してない。
>>226 itoa()のような非標準の関数使うなや。検証できない環境の香具師もいるんだぞ。
>>226 こう?
#include <iostream>
#include <string>
#include <map>
#include <sstream>
#include <vector>
using namespace std;
int main()
{
typedef string Key;
typedef vector <unsigned int> Value_Container;
typedef map <Key, Value_Container> Map;
Map range;
for (int i (0); i < 10; ++ i)
{
ostringstream index;
index << i;
Value_Container &value_container (range[index.str ()]);
value_container.resize (2);
value_container[0] = i;
value_container[1] = i+10000;
}
for(Map::const_iterator it = range.begin(); it != range.end(); ++ it)
cout << "key:" << it->first << "\tvalue1:" << (it->second)[0] << "\tvalue2:" << (it->second)[1] << endl;
}
64bitポインタの32bitへの縮小ってできます? 間違って宿題スレに書いてた..
>>228 レス良く見れや。itoaをわざわざ定義してるやン
それがおかしいんだけど
あと、このスレは環境依存OKだったはず
>>229 struct Value_Container {
unsigned int first, second;
Value_Container( unsigned int f=0, unsigned int s=0)
: first(f), second(s) {};
};
でいいような。
>>230 キャストできるけど何が起きても責任は取れない
>>231 もちろん
typedef pair <unsigned int, unsigned int> Value_Container;
とかも
226はmallocだからvectorにしときました
>>232 キャスト以外に方法ないんですかね?
32bitの領域にメモリ確保して移すとか
>>235 キャストは方法に入らない
ダウンサンクで検索汁
すんごい初心者な質問ですいません。 コンパイラがstdio.hファイルをオープン出来ないなですが、何故なんでしょうか?
>>237 コンパイラが正しくインストール/セットアップされていない
239 :
デフォルトの名無しさん :2005/06/30(木) 17:22:26
>>238 一応マニュアル通りにセットアップしたのですが
自分に落ち度があったかもしれません。
もう一度やり直してみます。ありがとうございます。
パスが正しく設定されていない。 環境変数のチェック汁
>>240 コンパイラは作動してるんだろうから、環境変数の問題じゃなさそうじゃね?
予想だがBCCの.cfgにパスを書き込んでいないくさい希ガス。
>>237 はまずコンパイラが何なのかを書き込みましょう。
でないと答えようがないです。
242 :
デフォルトの名無しさん :2005/06/30(木) 19:00:04
>>240-241 さん。
コンパイルできました。
別の本みて、cfgファイル作ってみたら、上手く動作しました。
何で上手くいったのかはよく分かりませんが、何にせよ助言ありがとうございました。
64bitポインタ型へのキャストの文がわからない.. 64bitであることを明示するにはどうすればいいんですかね?. (?)hoge
>>243 64bitポインタの環境ならば*で64bitになるんじゃないのか?
mingw日本版のインストール方法がわかりません どなたか教えてください mingwのインストールは出来ました ディレクトリ名はMingw-jpにしておきました そうしろとあったので
246 :
245 :2005/06/30(木) 19:27:23
win98です
>>206 亀レスだが、cygwin gcc 3.3.3 です。
インストーラダブルクリックであとは自動じゃなかったっけ? 環境変数 PATH に Mingwのbin CPLUS_INCLUDE_PATH に includeが必要だっけ。
>>244 設定とは関係なしに明示したいのですが...
ちなみにVS.net2003です
1からCをやるのにオススメのサイトとかある?
251 :
デフォルトの名無しさん :2005/06/30(木) 19:51:58
角度を入力してラジアンに変えるのを関数で定義したいです。 #include <stdio.h> #define pi 3.141592 double rad(double a) main(){ int ans,rad,x; printf("角度を入力してください"); scanf("%lf", &x); ans=double rad(double a) printf("%f\n",ans); } double rad(double a){ int x; a=x*(pi/180); } こう書いたんですがうまくきません。
で、そのradって関数の定義はどこにあるんだ?
>>251 intとdoubleがぐちゃぐちゃだし
関数の呼び出し方を理解していないようだな
ans=double rad(double a)
ってなんだ
ans = rad(a);
でよい
セミコロンもないし。 幼稚園児にギリシャ語を教えるようなもんだな。
255 :
デフォルトの名無しさん :2005/06/30(木) 20:04:55
#include <iostream> int main() {std::cout<<"うんこ"<<std::endl; return 0;} ここまで覚えた
>>253 #include <stdio.h>
#include <math.h>
#define pi 3.141592
double rad(double a)
main(){
double ans,rad,x;
printf("角度を入力してください");
scanf("%lf", &x);
ans=rad(double a);
printf("%f\n",ans);
}
double rad(double a){
double x;
a=x*(pi/180);
}
こうしましたが、結果がすべて0になってしまいます
>>256 だから
ans=rad(double a);
は何なんだよ。
xに読んだんなら
ans = rad(x);
でいいだろが
double rad(double a) { return a*(pi/180); } にしろ。 それと、関数の呼び方や実引数、仮引数についてもっかい勉強しなおせ。
すげー池沼だ
うるせー馬鹿じじいども 質問してやってんだからさっさと答えろ
↑俺じゃないです。
お願いします
/ ̄⌒⌒ ̄ ヽ | 丿ノソ ̄ハ ) ) ( 彳 / \|  ̄ ̄ ̄/ ─┼─ ──┐|| ─┼─ ./ 彡」 ・ ・| |/ .| .| ゝ / (6 ヽ つ / _ノ. / ___| ヽ_ /⌒ヽ_ノ ミ / /⌒⌒ヽ | \  ̄ ノ | / / ̄| ̄ヽ ├─ ヽ ┼─‐ ‐┼‐ . / ̄| ̄ヽ | / | __.|  ̄ヽ / __| ヽ . ‐┼‐ | / | ヽノ ノ (_ノ\ _ノ (__ノヽ ヽ__ノ ヽノ ノ _ _ ___ _ ,! /_| |__ | | ! /____,、 ______|________ |三三| ー十ー十ー / __ __| .| □ | / __ __l´ . | ー―――‐ ヽ、 ノ _________ ..く_/___| |___ ..| □ |く_/\ヽ| | . 人 | ̄| ̄| , ヽ ノ | | |___ ___| | □ | ヽ | ノ ヽ | ̄| ̄| ノ ヽ. | ロ. | / ヽ .|__ .__| / / ノ ヽ、  ̄| ̄ ノ ヽ .. | ヽ| / /\ \ / ヽ / / ヽ\  ̄| ̄ ..く_/ \ `フく_/\`フ く/ \`フ  ̄ ̄ ̄ ̄
>>256 不勉強にも程がある。
#include <stdio.h>
#include <math.h>
double rad(double a);
int main(){
double ans,a;
printf("角度を入力してください");
scanf("%lf", &a);
ans=rad(a);
printf("%f\n",ans);
return 0;
}
double rad(double a){
return a*(M_PI/180);
}
#include <stdio.h> #include <conio.h> int main (void){ char test[1]; printf ("入力してください。"); printf ("\n"); scanf ("%c",&test); if ( test == "key" ){ printf("正です。\n"); }else{ printf("不です\n"); } getch(); } keyと入力しても正にならないのは何故か教えてください。
>>268 基礎からやり直し
#include <stdio.h>
#include <string.h>
int main (void) {
char test[256];
printf("入力してください。\n");
scanf("%s", test);
if (!strcmp(test, "key"))
printf("正です\n");
else
printf("不です\n");
return 0;
}
keyは文字列 scanf ("%c",&test); で取れてるのは文字 つーかデバッグライトしろって printfでtestの中身表示させれば気がつくことじゃないか
>>269-270 マジ、有難うございます。
C始めたばかりでして、ご迷惑をおかけしました。
デバッグライトなど少しずつ覚えていきたいと思います。
少しテンプレでも作ってみた。
-- 以下 テンプレ ------------------------
■ ここの人のお勧め書籍
独学C / 初めてのC / 猫でもシリーズ
■ 過去ログ
19以前は以下のdatを有難くDLしる。(ver19スレ
>>205 氏提供乙)
ttp://www.uploda.org/file/uporg137053.zip.html ■ここの過去質疑応答
過去ログQ&Aまとめ中 ◆tOP1/BWZ7g 氏が製作されているみたい。
(公開されたらURLを書く)
------ 以上、テンプレ ------------------------------------
↑追加 ■入門者向けC++お勧め書籍(C未経験者可) 標準講座C++ 決定版 はじめてのC++
404だよ
全員集合
独習C++が一番良本だと思われ
独習C++はCの知識が前提でしょ。C経験者向け入門書だな。 あと、標準ライブラリ、オブジェクト指向の解説はかなり薄口のような気がする。
>>194 ,247
$ g++ --version
g++ (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ -ansi -pedantic -Wall -W -fsyntax-only 194.cpp
194.cpp:10: error: ISO C++ forbids declaration of `main' with no type
194.cpp: In function `int main()':
194.cpp:11: error: ISO C++ forbids initialization in array new
279 :
デフォルトの名無しさん :2005/07/01(金) 00:46:50
#include <iostream> int main(){std::cout<<"Hello!"<<std::endl;return 0;} をmingwでコンパイルしようとすると大量のエラーを吐いてexeが生成されません。 コマンドプロンプト使ってます サイトにあったサンプルコード #include<stdio.h> int main(void){ printf("Hello GCC World on Windows!!\n"); } はnewlineナントカというエラーがありましたが、exeが作られ、ちゃんと動きました。
コマンドプロンプトに表示されたものをどっかに出力する方法ってありますか? それと、エラーが長くて上の方が見られなくなってしまいます
>>281 Windows のコマンドプロンプトなら、
タイトルバーを右クリックして「プロパティ」を表示。
[オプション] > [編集オプション] > [簡易編集モード] にチェックを入れる。
[レイアウト] > [画面バッファのサイズ] > [高さ] を思い切り(4096ぐらい)大きくする。
これでエラーは消えない(スクロールさせれば残ってる)し、
マウスで(ちょっと怪しいけど)テキスト選択ができる。
選択後のコピーは Enter なので注意。
標準エラーもリダイレクトしたければ NT系のcmd.exeなら t.exe > out.txt 2>&1 のような感じで。 command.comではそういう技はつかえんのでフリーのツールを探せ
>>279 ,285
gcc でコンパイルしてるのか?
g++ にしてみれば?
>>286 出来ました!
ありがとうございます!
何故
>>279 の上のはg++で下のはgccになるんでしょうか?
やっぱC言語って奥が深いな。解りにくいけど、解れば先にポンポン進める。 あ〜コンソールアプリから早く先に進みたいよ〜。 つか技術評論社からでているC言超入門とはじめてのC++を読んでるけど、これでいいのかどうか。 というか俺はC言語で何をやろうとしていたんだっけ?
>>287 gcc は C のプログラムということになるので、
C で必要になるライブラリは勝手にリンクしてくれる。
C++ では言語標準の機能を使うために
C では必要の無いライブラリを追加でリンクさせる必要がある。
g++ を実行すれば、その時点で C++ プログラムだということが
GCC に伝わるので、そこらへんを勝手にリンクしてくれる。
gcc でも、自分で -lstdc++ として C++ のライブラリをリンクさせれば
おそらく同じ結果が得られる。
>>290 なるほど。
分かり易く説明していただきありがとうございました!
>>279 newlineなんちゃらは、最終行の末尾の改行がナインジャマイカ。
最終行の末尾の改行なんてなくてもいいだろ
警告が出るんだよ。 ついでに言えば、コンパイラ(とそのオプション)によってはバグるんだよ。
技術評論社の決定版はじめてのC++は内容が古いからやめとけ STLとかテンプレートの事が一切書かれてない
どこのアホコンパイラだ
超基本的な話だと思うんですけど、コンパイルして実行したら一瞬で消えてしまうのはどうやって対処すればいいのでしょうか?
>>300 どうせWindowsのコンソールと思われ。
>>298 先にコンソール立ち上げてそっちから実行するかプログラムの最後にsystem("pause");でも入れとけ。
system("pause");入れたら解決しました。 ありがとうございましたー。 消えると言うのはDos窓のことでした。
>>296 LSI-C86。
なかなかシュールなバグでね、ニモニックが一個落ちるだけだから運悪く実行できてしまうともうね。
次元配列のポインタをやりとりが解りません。 SubFunc(int **pData) [ int data[][64]=pData; } main(){ int data[32][64]; SubFunc(data); } 出鱈目ですが、こんな感じにSubFunc内で次元配列として扱える様に 渡す&受けるにはどう記述したら宜しいのでしょうか。
×ポインタを ○ポインタの コンパイラはgccを使用しています。
>>305 SubFunc(int (*pData)[64]);
>>307 有り難うございます。 引き数の時点で配列数入れるんですか・・・
ちなみに、 int data[][64]=pData;
の様な、別のポインタにコピーする事も出来るのでしょうか?
>>308 C/C++では、多次元配列は、最初の次元以外の次元はすべて指定しなければならない。
C++なら、vector<vector<int> > >& でも使った方がいいんでわ?
別のポインタにコピーするには、
int (*data)[64] = pData;
ってすればできるでしょ。
>>309 失礼しました・・・ 引数は (int data[][64])で通ったので、代入も同様に
出来るのかと思ったら、代入はint (*data)[64]でないと駄目なんですね・・・
この二つの違いが分からない orz
C++には諸々制限付いてる某なのでおとなしくCで書いてます。
>>310 int data[][64]→int (data[])[64]→int (*data)[64] と内部で変換されているから。
dataは定数なので、これには代入できない。ちゃんとポインタ変数である事を示す
ために、*data と書かなければならない。カッコは優先順位変更のため。
int a[] = {1, 2, 3}, b[] = {4, 5, 6};
a = b;
とやったらエラーが出るっしょ?それと同じと考えてくれたまへ。
ちなみに、関数の仮引数の方の data は、ポインタ変数なので、代入できる と思った。コンパイルして試してみてないけど。
DOS用のコンパイラが欲しいのですがLSI-C86試食版とBorland C++ 1.0ではどちらがいいのでしょうか? また、他におすすめなコンパイラはありますか? 環境はNEC MobileGear (PC/AT用MS-DOS6.2, ハーフVGA, HDDの代わりにコンパクトフラッシュ使用)です。
>>313 スモールモデルでいいのか?そうであればLSI-C86試食版。
でなければBorland-C++の方がいい。
VBのActiveXコントロールをC++で利用するにはどうすればいいんですか? Visual C++のクラスの追加でOCXを読み込むとプロパティが消えてしまいます。
>>313 Digital MarsのDosExtenderもいいぞ。
適切なスレが見当たらないのでここで。 最近C/C++のコンパイルにmakeを使い始め、サフィック スルールを学んでいるところです。 某解説webページに従って .c.o: cc -c $< と記述することでMakefileがかなり楽に書けるようにな りました。 しかし、ひとつのディレクトリにソースもオブジェクト もゴチャ混ぜになるのが好きでないため、下記の様なデ ィレクトリ構成でコンパイルしたいと考えています。 MakeDir\ +-- SrcDir\ +-- ObjDir\ +-- Makefile 上記のようなディレクトリ構成の場合、サフィックスル ールを使って楽をするにはどのように書けばよいのでし ょうか?
{SrcDir}.c{SrcDir}.o: cc -c -o$@ $< とかかな
>>319 タイプミスと思われるところを訂正して
{SrcDir}.c{ObjDir}.o:
cc -c -o$@ $<
これでうまくいきました。どうもありがとう。
質問ですが、C++をやるに当たって最初に必要なものはなんでしょうか?何か買う必要があるのでしょうか? 幾ら調べても本当にわけが分かりません、コンパイラーというのが有れば出来るものなのでしょうか?ご指導をよろしくお願いいたします。。
>>321 そうだなコンパイラがいるな
むろんC++用のやつだ
その前にテキストエディタがいるが、まあ最悪viでもメモ帳でもSimpleTextでも
OS付属のやつでよい
>>321 コンパイラがあれば出来る。
Google で フリー C/C++コンパイラ
で検索すれ。
学生ならVisual Studio .NET the Spokeがある。
Cの基礎が大体分かったからAPIに手出してみたらさっぱり意味わかんねえ…
>>327 それはWindows APIのことだろうか
色々な型とかあってわけわかんねーよ
なんだよLPCSTRって
とかそういうのは、ヘッダよめ
なんでもgrepする癖をつけろ
typedefとか#defineとかそういうのだ
よく使われるtypedefはそんなに多くないし、ある程度は決まりきった
命名規則に従ってるから、そのうち慣れるだろ
あとはMSDNと友達になるこったな
英文ぐらい、泣き言言わずに読め
うわ、チラシの裏ですみませんって言おうと思ったら丁寧な助言が…。 マジ感謝! 取り合えずMSDNナンパしてきます。
>>322-326 なるほど!ありがとうございます!
ということは、何か買う必要はないという事でいいですか?
くどいようですが確認の為ご理解ください、申し訳ない
>>331 ソースファイルを、実行形式にするにはコンパイルが必要。
それにはコンパイラが必要。
コンパイラは、各社各団体からいろんな種類のものが、有償無償で配布されている。
その中からどれを選ぶかは、どういう目的でどういう環境で利用するかによって異なる。
>>332 今調べてみました、すごくいい物のようですね
まだ学生なのでこれを買ってみる事にします!
皆さん本当にありがとう!
デバッガ機能重視、Winのアプリ作りてーなら選択肢はVC++ pro以上、高いけど。 実行ファイルが作れればいいなら、ググればいくらでもあるはず。
初学者はフリーコンパイラで充分だと思うがな。 コマンドラインで、printfデバッグしながらってのが、 やってること理解しやすいし。
ソースブラウザつきのGUIデバッガで動き見るほうが はるかに動きを理解しやすいが。 初心者ならなおさらだな。
>>336 >>337 上記に関してはどちらとも納得できるが、
>>335 のpro以上は特に初心者には必要ないように思う。
スキーでもゴルフでも居るよね、カッコから入る奴。
初心者なのにフル装備ってのもどうかね。
カッコから入っても別にいいと思うが つーかスキーやゴルフと話が違うだろ あれらは最初からイイ物そろえておいた方が結果的にいい
カバンや文房具に例えてみる件。
っ[安物買いの銭失い]
安物を使いこなせるのは上級者だけだよな
>>342 その程度のことで自慢にはなりませんし、
真の上級者は道具は良いものを選びます
別に俺が上級者だと言ったわけじゃないが。
まぁスルーしておけ
初学者がHello Worldとか素数列挙とかのプログラム 組むのに、商用が必要か? って話だろ。 なんで上級者の話してんだよ。
商用買ったらあかんのか?
>>346 学生さんなら、
>>325 を数千円程度の支出で手に入れられるわけだ。
テキストアプリケーションを作るだけなら、むしろUNIX like OS+gccが
いいと思うが、Windowsを使っていてゆくゆくはGUIにも手を出したい、
というのであれば、数千円の価値は十分あると思うぞ。
タダほど高い買い物は無いってな。
統合開発環境の温室育ちと組むと疲れる・・・。 決まってハイスペックなマシン要求するしな。 コンソールの使い方もプログラミングの一環だと思って gcc、bccあたりを使って欲しい、あくまで個人的意見だが。
改めてハイスペックと言うほどハイスペックなんじゃなくても動くし・・・
とりあえずCに触ってみたいという程度ならgcc辺りで良いんじゃね PATHのお勉強できるし、もし途中で投げ出しても損はしないし
まぁCはフリーの良いコンパイラがたくさんあるんだし、「どんなコンパイラ(IDE含 む)が自分に合っているのか?」程度が分かるくらいになってから買えばいいんじ ゃねぇの?
引数つきのマニピュレーターってどうやって作るんですか? cout << manip("hoge") << endl みたいな。
>>353 引数付きコンストラクタを持つクラスを定義して
そのクラスと std::ostream を引数にとる operator << を定義する。
std::istream なら operator >> な。
356 :
353 :2005/07/03(日) 21:25:04
>>354 ありがとう。ちと頑張ってみます。
引数無しのマニピュレーターの作り方の解説はいっぱいあるんだけどね。
356じゃないけど、 hex みたいなマニュピレータは、出力なら自分の右辺で出力された値(または文字列)が必要になるよね? これって引数のostreamから取り出せるの? それとも、単にsetf/unsetfしているだけ? 前者なら色々面白い独自マニピュレータ作れそうだけど、後者だと限界があるね。
Linux Fedora Core4、gcc4.0.0でプログラム自分自身が使用している使用メモリ量の取得方法を教えてください。 getrusageを使ってみたのですが、ru_maxrssがつねに0になってしまいます。
>>358 鼬害かさもなくばUnixプログラミングスレ向きかな。
それを知ってどうしたいのか分からんが。
関数のオーバーロードって、 void Func(int i); void Func(int i,float f); みたいなのは無理なんですか?
361 :
360 :2005/07/05(火) 02:18:06
解決しました
すいません、dequeの二次元配列はどのように実装すればいいでしょうか? vectorの二次元配列の方法で試してみましたがうまくいきません・・・
363 :
362 :2005/07/05(火) 05:33:34
事故解決しました。もっとよく考えてから質問するようにします・・・
364 :
364 :2005/07/05(火) 06:43:43
質問です。 解決しました。
>>365 引数を全部構造体に入れて、構造体へのポインタを渡す。
367 :
デフォルトの名無しさん :2005/07/05(火) 21:28:45
Windows上でファイルの更新日付を取得したいのですが、API使わないとダメなのでしょうか。
>>367 ダメ。
API使いたくない理由はなんなんだ?
>>369-370 ありがとうございます。
できるだけ環境依存じゃないほうがいいかな、と。
移植性を高くしたいとか? boost::filesystemって使えたっけ?
>>371 「Windows」上でファイルの「更新日付」を取得しようとする時点で
環境に依存するのは自明だと思う
「」内はC/C++に亡い概念のハズ
>>372 今ちょっとhpp見たけど、更新日付は扱ってなさそう。
>>371 何故そう思うのかは知らないが、マルチプラットホームが
最終目的なら、自分でラッパを書くという選択肢もあるぞ。
べつにstat()でいいだろ。
YAGNI!YAGNI!
だから条件がすでに環境依存・・・
ファイルの更新日付を取得する実装くらい 出会うプラットフォーム全部分書けばいいじゃん。
だからstat()で十分だろ stat()使えない環境なんか、使ってるのか?
381 :
デフォルトの名無しさん :2005/07/05(火) 22:40:02
ファイルの書き込みについてです。 for (int i=0; i<size; i++) { fputc(buf[i], fp); } より fwrite(buf, 1, size, fp); の方が大概速いですけど、 分割して書き込む場合どのくらいのサイズに分割するのがいいんでしょう? もちろんシステム毎に最適値は違うと思いますけど、 このくらいの範囲が良いみたいなのってありますか?
4096とか8192とか。
>>381 一度に全部書き込む
あとは言語のライブラリとOSがうまいことやってくれる
実測しろよ!!
>>382 ,383
ありがとうございます。
いろいろ試してみます。
MSCはopen(),creat(),close(),read(),write(),lseek(),stat()のようなものに ついてはPOSIX互換エミュレーション層つくってんのに opendir()は無いんだよな昔から それなのに_dos_findfirst()だの_findfirst()だのいう珍妙な Cランタイム関数がある いらねっての
そこでboost::filesy(略
>>385 名は体を表す。MS-DOS時代からの名残だ。
Borland C++ Builder には opendir() があるからてっきり VC++ にもあると思ってた。
>>386 言っちゃなんだが半端な気がするんだよな、boost::filesystemは。
なんかJavaみたい。C++なのに。
>>387 それはしっとる。
>>388 そうそうBCCにはあるけどMSCには無い。
だから、FindFirstFile()を用いてopendir(),...のラッパーを作って
利用しているプログラムはわりと見かける。
でも、FindFirstFile()はファイル名以上のものを返してくれるから、
移植性が不要な場合は便利なんだよな、opendir()系列よりは。
390 :
362 :2005/07/06(水) 12:28:15
皆様方、 class SP{ ・ ・ }; i = rand() % 6; SP sp[i]; こんな感じにクラスの配列を宣言したいのですが、 定数式が必要、サイズが0などのエラーが出てしまいます。 どのようにすればできるでしょうか?
>>390 ・C99対応コンパイラを使う
・newやmallocで動的にメモリを割り当てる
お好きな方をどうぞ。
392 :
391 :2005/07/06(水) 12:35:59
個人的には↓やるのがいい希ガス std::vector<SP> sp; for(int j=0; j<i; j++) sp.push_back(SP());
>>392 返答ありがとうございます。それで試してみます。
すいませんあと、
>>391 のnewで動的に割り当てるというのは
SP sp = new SP[i]; ですか?
>>391 C++を使っている以上、前者はあり得ないと思うのだが。
>>393 基本的なことなんで本買ってじっくり勉強せい
pthreadを使ってクラス内の関数をスレッド化することを考えています。 for (int i=0;i<threadnum;i++) { if(pthread_create(&tid[i],NULL,(THREADFUNC)threadRoutine,(void*)i) != 0) { perror("pthread_create"); } } と書くと、3行目のところで error: invalid use of member (did you forget the '&' ?) というエラーが出てしまいます。 プライベートメンバ関数の threadRoutine を void threadRoutine(void* pParam); と宣言するところを static void threadRoutine(void* pParam); にすると、コンパイル可能なようなのですが、今度は、そのメンバ関数内で、staticではないメンバ変数が使えなくなってしまいます。 メンバ関数をstatic関数にせずに、マルチスレッド化するにはどのようにすればよいのでしょうか? (THREADFUNC)、tidはそれぞれ typedef void *(*THREADFUNC)(void *); pthread_t tid[threadnum]; です。
399 :
397 :2005/07/06(水) 16:49:28
回答レスのすぐ直後に 「君もC/C++の勉強をしたまえ! 」 というレスがあったので、正しいやり方ではないのかと思っていました。 そうすると、マルチスレッド化にはstaticは必須ということなのでしょうか? また、この場合、同じクラス内の別のメンバ関数を呼び出したい場合はどうすればよいのでしょうか? staticメンバ関数からは呼び出せないというコンパイルエラーが出てしまうのですが。
>>399 >また、この場合、同じクラス内の別のメンバ関数を呼び出したい場合はどうすればよいのでしょうか?
>staticメンバ関数からは呼び出せないというコンパイルエラーが出てしまうのですが。
呼び出したいメンバ関数を全て静的にすればいい。静的メンバ関数間の呼び出しは何の問題もない。
>>399 スレッド関数に引数経由でthisポインタを渡せ
あとは、それ使ってメソッドコールすればよい
>>392 std::vector<SP> sp(i);でいいだろ。
そもそも非静的メンバ関数って 暗にスタックへthis プッシュしてるから、そのままでは無理がある。 だから、 static void threadRoutine(void* pParam); とする。 397 がやりたいことは、 1) スレッド起動時の引数の pParm に相当するところへオブジェクトのポインタを渡す 2) threadRoutine 内では void someclass::threadRoutine(void* pParam) { someclass* pThis = (someclass*)pParm; // あとは pThis 経由でアクセスすりゃいいじゃーん } とすれば良いんじゃないかい
HWNDのラッパクラスを作る時によく使われるね
C++で構造体を使いたい時、 struct hoge{ }; でなく class hoge{ public: }; を使っているのですが、何か問題ありますか? お行儀が悪いとか、構造体如きにclass様を使うとはけしからんとか。
>>405 C++では全然問題ない。両者は全く同じ。
本当に構造体を使いたいのならstruct{}でいいんじゃないの? 少なくともタイプ量はそっちのが少ないでしょ
まさかstructはtypedefしないとCみたいに変数宣言とかにもstructを書かないといけないと思っているんじゃないか?
>405 趣味の問題ではあるが、強いて言うなら同じ構造体を C でも使いたい場合に書き換える必要がある、って ことぐらいかな。 漏れなら C と互換性のある構造体(静的メンバなし、メンバ関数なし)だったら常に struct を使うけど。
早速のご回答ありがとうございます。
取り立てて問題なさそうなので安心しました。
>>406 ということはstructでもコンストラクタは呼ばれるんですね
>>407 classの方が打ちやすいもので、
というか、structが打ちにくい…
>>408 いや、そういうわけでは
>>409 Cで使うというのは想定外でした。
単なる構造体にはstructを使う人が多数派ですよねえ
漏れはstructにもコンストラクタを書く派だ。 #いや、流石に必ず書くわけではないが。
321です。度々申し訳ないのですが、PCが出来ない時間にも勉強したいので参考書を買おうと思っています。 そこでC++初心者にお勧めの参考書を教えていただけませんでしょうか。 くだらない質問ばかりですみません・・・
>>412 >>273 どっちでもいいが1冊仕上げるまでは入門サイトなんか見るな。
C++の信頼できる入門サイトなぞ存在しない。
そして、GUIにも手を出すな。
最初は純粋に言語仕様にのみ関心を注げ。
>>413 参考になります!入門サイトを見ながらやろうとしていたので見ないようにします、助かりました。
まずは参考書を仕上げる事に専念したいと思います。
また一つ疑問がでてきたのですが一つ参考書が仕上がったら
次の参考書を仕上げるという形で勉強していけばいいのでしょうか?
>>397 ,399
正確に説明してみよう。
まず「メンバ関数」は「関数」と違い、呼び出すためにクラスのインスタンスが必要。
これは this ポインタと呼ばれる隠れた引数としてメンバ関数に渡される。
この違いにより、「メンバ関数へのポインタ」は「関数ポインタ」とは型が違う。
そして pthread_create() へ渡すのは「関数へのポインタ」だ。
非メンバ関数およびstaticメンバ関数は、Cと同じく関数名を書いただけで
「関数」から「関数へのポインタ」に自動的に変換されるので、
>397のような書き方で通る。
ただしキャストは不要、っていうかキャストすんな。
非staticメンバ関数は関数名を書いただけでは式として不正。
&T::MF と書くことで「メンバ関数へのポインタ」の値とすることができる。
ただしこれは pthread_create() が受け取る「関数へのポインタ」ではないので、渡せない。
また、VC系だと T::MF で同じ値が得られるが、これは標準ではない。
さぁこれで全部情報は揃ったはずだ。
>>414 俺は
>>413 ではないけれども。1つ終わったら、何かを作ってみる。それで
分からない事があれば調べながら続ける、という流れの方がいいと思う。
で、同時に参考書(≠入門書)を読んで知識を吸収する。何冊も入門書を
読み続けるとモチベーションが続かない。どうせ何冊本を読んでも調べ
ながら作業するという形態は変わらないわけだから(よね?)、正しい情報を
うまく探し出す作業に慣れるのが大事だと、俺は思うよ。
417 :
397 :2005/07/07(木) 02:31:01
>>398 、
>>400-401 、
>>403 、
>>415 さん、どうもありがとうございました。
当面の問題にはこれで対処できそうです。
pthread+gccでスレッドプログラムを作ったのは、今回が初めてなのですが、
VisualC++やC++Builderでのスレッドプログラミングに比べてあまりスマートな印象
を受けないのですが、これはpthreadの仕様から来るものなのでしょうか?
それともVCやBCBは独自の拡張を施しているからなのでしょうか?
また、boostのthreadでもやはりpthreadと同様の制限が出てくるのでしょうか?
>>417 逆に聞きたいのだが、VC++と較べてどの辺がスマートじゃないと思うのかね?
#私にゃ>397を見る限り大差ないとしか思えないのだが。
>>417 スマートに出来るようにラッピングすればよろしい。
VC++でも_beginthreadex()やCreateThread()を使う分にはやり方は同じだろ COMが絡む場合は各スレッドでアパートメントの初期化とかせなあかんから より面倒 あ、もしかしてIOCPで実装されてるスレッドプールみたいなヤツのことを 言ってるか?
boost::thread は明らかに機能が少なすぎる。pthreadのほうが自由度高い。 boostもっとガンガレ。
質問です。 int array[i];に対して、int *ptr;を用意し、 ptr = array; cout << ++ptr << endl; と書くと問題ないのに、 cout << ++array <<endl; と書くと、 error C2105: '++' には左辺値が必要です。 と出てしまい、コンパイルが通りません。 arrayとそのまま配列名を書くと、 配列の先頭アドレス(先頭要素のポインタ)になる、 と勉強したのですが、なぜこのようなことがおきるのでしょうか。 どのように解釈すればよいのか、ご教示ください。 お願いいたします。
>>422 (&i)++ がエラーになるのと同じ。
>>422 ++のオペランドは単なる値ではなく、変数でなくてはいけない。たとえば、
int a = 0;
a++; /* ok */
(a + 3)++; /* error */
>>422 ま、初めのうちは int array[]; と int * ptr; (配列とポインタ)に関しては「似て非なるもの」として
同じ点:
・array[offset] とか ptr[offset] という書き方ができる
・array も ptr もアドレスを表す値になる
違う点:
・ ptr++; とか ptr+=1; とか ptr=ptr+1; という風に値を変更できるが array はできない
・ ptr=array; とか ptr=array+1; も↑同様にできるけど array はできない
と考えればいいんでね?
あとは徐々に理解を深めていけばそのうち納得がいくと思う。
int array[] で array は &array[0] の略記法、で終る話じゃ?
>>422 > arrayとそのまま配列名を書くと、
> 配列の先頭アドレス(先頭要素のポインタ)になる、
これがそもそもの間違い。
428 :
デフォルトの名無しさん :2005/07/07(木) 17:21:30
質問というよりはアンケートに近いんですが,関数のパラメータで 入力のパラメータと出力のパラメータ,どちらを先に書きますか? 簡単な理由,例えば主要なAPIでの実例(memcpyとかは出力が先だから先にしてる, いやいやSTLのアルゴリズムは入力が先)とか交えてもらえるとありがたいです. ドキュメント(コード)に明記すれば良いというのは重々承知した上で, 純粋な興味から質問しています.
適材適所。
>>428 入力パラメータであることを明確にするには、順序ではなくconstをつけて
関数内部で変更されない(つまり入力専用)であることを明示する。
俺はいつも出力パラメータが先 なぜって、入力パラメータにはたまにデフォルト値を使うことがあるから
出力がオプションだったりすると入力が先の方が都合がいい罠。
そういうことを考えると、結局「ケースバイケース」なんだよな。
ケースバイケースではあるが、少なくともある範囲では統一されてる ほうが読みやすいし理解しやすいな string.hは引数順序の考え方が統一されており stdio.hはてんでバラバラだ
たしかにな。 fprintf() は、可変引数の関係上、ファイルポインタを前に持ってこなければならない。 じゃ、なんでfputsは、最後でファイルポインタを指定させるんだろう?最初にもってくれば、 fprintfとの整合が取れるだけでなく、memxxx, strxxx系のデータ出力方向(右から左へデータが流れる) とも一緒になってよさそうだけど。
代入演算子も、右から左へデータが流れるな。
438 :
デフォルトの名無しさん :2005/07/07(木) 20:43:08
va_arg マクロの第二パラメータにcharを指定するとコンパイルエラーで、 代わりにintにするとOKなんだけど、これって処理系依存の制限? それとも規格?
439 :
428 :2005/07/07(木) 21:48:21
やはりケースバイケースという結論に落ち着きますよね. でも色々有意義な視点での意見が聞けてとても参考になりました. ありがとうございます.
struct Hoge{ int a; int b; int c; } struct Moge{ int abc[3]; } &Moge.abc[0] の隣は &Moge.abc[1]、 更に&Moge.abc[2] と続くわけですが 同じように &Hoge.a &Hoge.b &Hoge.c と連続して並ばせたいのです。 これはC++では保証されていないと思いますが、保証される方法はありますか?
>438 とりあえず C と仮定する。 default argument promotion によって char 型の引数は int 型になっている。 従って、 va_arg の第 2 引数に char を指定しても、実引数の型とは一致しない。 9899:1999 だと va_arg で実引数の型と一致していない場合は未定義動作だから規格には合致している。 いずれにしろ、va_arg の第 2 引数に char は使えない。
442 :
デフォルトの名無しさん :2005/07/07(木) 22:16:48
クラスのメンバー関数ではなく普通の関数のオーバーロードってどうやれば良いんですか? class A { virtual void func ( ); } ↑OK ↓NG virtual void func ();
>>442 オーバーロードの条件に virtual はない。その例なら。
void func ();
でいい。
>>441 どうもです。実はC++なんですが。
Cより型チェックが厳しいせいで、エラーになってたのかな?
445 :
442 :2005/07/07(木) 22:24:43
void func() // これを void func() // 別の.cppで定義したこれとか void func() // さらに別の.cppで定義したこれとかで置き換えたい …って全然意味わかんないよ。 絶対無理だから。 自己解決しました。 さわがせてすまん。
環境依存いいんですよね? Windows で高速なファイルの結合ってどうやるのがいいんでしょうか? (UNIX だと mmap するのかなーとか思うけどこっちも使ったこと無い)。
>>446 自力であれこれしようとせずに、system("cat foo bar > fooz");とでもする。
> 'cat' は、内部コマンドまたは外部コマンド、 > 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
じゃtype
450 :
446 :2005/07/08(金) 00:11:04
いや、確かに経験上(つってもDOSの頃の話) copy /b foo+bar fooz が一番速そうなんだけど仕事でこれやるのダサい気がして…。
451 :
デフォルトの名無しさん :2005/07/08(金) 00:19:48
「VC++6.0」と「猫でもわかる」を使って独習しているんですが、 int main(void) { char str[256]; cout << "Hello world!!" << endl; cin >> str; ofstream out_file("text.txt"); out_file << str; return 0; } で出来ることになっているテキストファイルは、どのフォルダに出力されるんでしょうか?
>>427 いや、そこは間違いじゃないだろ。
6.2.2.1 #3
"an lvalue that has type ``array of type'' is converted to
an expression that has type ``pointer to type'' that
points to the initial element of the array object"
ttp://www.vmunix.com/~gabor/c/draft.html#73
>>440 C++では保証されていないので、処理系ごとの拡張になる。
VC なら #pragma pack とか /Zp とか。
GCC なら __attribute__((packed(x))) とか -fpack-struct とか。
まぁ拡張なんであまりお勧めはできない。
本当に必要か良く考えてから使えよ。
>>442 ,445
「オーバーライド」と「オーバーロード」の区別はちゃんとつけとこうな。
456 :
440 :2005/07/08(金) 01:27:19
>>454 C++標準で保証させる方法は存在しないのですね。
素直にあきらめます。
457 :
451 :2005/07/08(金) 03:13:51
>>452 検索したんですが、そもそも作成すらされていないようでした。
プログラム自体が間違っているのか、VC++は何か設定が要るのか....
458 :
デフォルトの名無しさん :2005/07/08(金) 03:19:42
ほんとに単純なプログラムなんですけど #include<stdio.h> struct node /* 構造体node(節点)の定義 */ { char nodename ; struct node *left; struct node *right; }*ai; main(){ int a; ai->left=NULL; a=4; if(ai->left==NULL)printf("%d",a); } が動きません 何がいけないのでしょうか??
460 :
デフォルトの名無しさん :2005/07/08(金) 03:23:10
>459 型とは・・?
> が動きません 動くだろボケ。 ちょっと変なメモリ領域をアクセスしようとするだけで。
462 :
デフォルトの名無しさん :2005/07/08(金) 03:27:04
動きませんよ コンパイラはボーランドのフリー使ってますよ それが原因だったのですか
>>460 aiってポインタでしょ
何指してるの?
>>458 ポインタ ai がオブジェクトを指していないのがいけない。
465 :
デフォルトの名無しさん :2005/07/08(金) 03:33:46
#include<stdio.h> struct node /* 構造体node(節点)の定義 */ { char nodename ; struct node *left; struct node *right; }*ai,h; main(){ int a; h=ai; ai->left=NULL; a=4; if(ai->left==NULL)printf("%d",a); } こうやってみたんですが動きません どういったふうにaiを指させればよいのでしょうか??
466 :
デフォルトの名無しさん :2005/07/08(金) 03:35:39
訂正 ai=h
468 :
デフォルトの名無しさん :2005/07/08(金) 03:39:10
>467 ありがとうございます けど動きませんでした・・・
>>468 >けど動きませんでした・・・
あなたの「動かない」をもう少し詳しく
あと
int main(){
--------略-----------
return 0;
}
470 :
デフォルトの名無しさん :2005/07/08(金) 03:47:04
はい 動かないというのは、 ボーランドのフリーのコンパイラでコンパイルはできたんですが、 実行するとエラー(core dumped?)がでてしまい 動作してくれませんでした。
>>470 ちょっと信じれないのだけど...
どこで落ちてるのか(どこまでは正常に動いてるのか)確かめるために
--------略-----------
printf("0\n");
h=ai;
printf("1\n");
--------略-----------
ってかんじにソース中にプローブを散りばめてみてはどうでしょ?
472 :
471 :2005/07/08(金) 03:58:54
こっちがいいかも --------略----------- printf ("0\n"); fflush (stdout); ai=&h; printf ("1\n"); fflush (stdout); --------略----------- あとh=ai;は間違ってた
473 :
デフォルトの名無しさん :2005/07/08(金) 04:01:04
>471さん 何かおかしいですね・・・ さっそく int a; 以降にprintf("0);を作業一つ一つ終わるごとに入れてみたんですが 何も表示されることなくエラーがでてしまいました。 わけわからん・・・
どこで動かしてんじゃろ・・・ ウチの環境(Win2k、VC++6.0)じゃ普通に動いて4が出力されて終わったが・・・
Linux(FedoraCore4)+GCCでも動いた
476 :
デフォルトの名無しさん :2005/07/08(金) 06:37:53
このスレでいいのか?わかりませんが誰か教えてください。 複数のプロセスから日付時間等のログを記録するライブラリを 作成するのですが、複数のプロセスからログファイルに書き込む為に ログが時間軸で並んでいません、 マシンの日付時間を取得してからログファイルに書き込む間に 他のプロセスに処理が移行されてしまう為だと思うのですが 日付時間を取得からファイル書き込みまでの間を割り込み禁止にできないでしょうか? 後からsortコマンドで並べかえるのも考えましたが、できればファイルに書き込む段階で 時間軸に並んでいた方が都合がいいので。 当然、排他処理等は行っています。OSはLinux,言語はCです。 ログファイルは通常のテキストファイルです。
477 :
デフォルトの名無しさん :2005/07/08(金) 07:04:52
クラス A が定義される前に A のポインタや参照を宣言したいときは、 class A; A* a; のようにすればいいことを知ったのですが、 A が名前空間の中で定義されている場合はどうすればいいのでしょうか。 class std::istream; std::istream* in; のようなことがしたいのですが、 この後の行で iostream をインクルードすると 「error C2371: 'std::istream' : 再定義されています。異なる基本型です。」 となってしまいます。
>>477 <iosfwd>にstream系のクラスの前方宣言が入っているからこれをインクルードすれば良い。
オレの知り合いに、自作PCで自作OSで自作言語で、自作プログラムしか使わないで インターネットとか、メールしてる奴いるけど、オレにはどうもプログラムは向いていないようだ・・・ そいつ東大だしやっぱ頭のいい奴がする事なんかな。
481 :
デフォルトの名無しさん :2005/07/08(金) 08:01:53
>>480 セマフォを使って排他処理は行っていますが、
セマフォでは、日付時間を取得からファイル書き込みまでの間を割り込み禁止には
できません、どうしても他のプロセスからの割り込み処理が入ってしまいます。
482 :
476 :2005/07/08(金) 08:16:19
イメージとしては ・ 任意の処理 ・ 割り込み禁止 日付時間取得 テキストファイルにログ書き込み 割り込み禁止解除
483 :
476 :2005/07/08(金) 08:30:05
>>480 わかりました
セマフォを使ってライブラリが実行中と判断しているだけなので
ログファイルがオープン中かどうかもセマフォで行えばいいのですね!
ありがとう、やってみます。
484 :
477 :2005/07/08(金) 08:43:25
485 :
デフォルトの名無しさん :2005/07/08(金) 09:56:25
すみません BSTR型で変数を定義しようとしたら 「定義されていない識別子です」のエラーが発生しました。 VC++6.0 WinXpです。 どのヘッダをインクルードすればよいのでしょうか・・・
>>485 これを期にgrepの使い方くらい覚えなさい。
487 :
485 :2005/07/08(金) 10:20:01
>>486 アホはアホらしく標準ヘッダをgrepして死にかけました…
488 :
デフォルトの名無しさん :2005/07/08(金) 10:27:22
Cの時はログを無効化する際に以下の様にマクロを使用しますが、 例) ログが DebugLog("hoge"); の場合、 以下のようなマクロを定義しコードを無効化 #define DebugLog(x) {} C++だとクラス名が前について DebugTool::DebugLog("hoge"); ってな感じに なるため #define DebugTool::DebugLog(x) {} って書いても::のところで切られてしまうようです。 上手い代替案もしくは書き方で回避など実現方法がありませんでしょうか?
>>488 #if defined(NDEBUG)
void DebugTool::DebugLog(x) {}
#else
void DebugTool::DebugLog(x) {DoDebugLog(x);}
#endif
>>485 ただ「使え」と言ったんではない。
使い方を覚えろ、と言ったんだ。
アホらしく検索すればアホみたいに沢山出てくるに決まってる。
例えば grep "typedef.*BSTR" *.h とかするんだよ。
492 :
485 :2005/07/08(金) 11:21:50
typedef.*BSTR とか \}.*BSTR で検索してみても分からず…。 これって普通に使える型じゃないんでしょうか・・・
1分ほどで分かるんだが。 wtypes.h: typedef WCHAR OLECHAR; typedef /* [wire_marshal] */ OLECHAR __RPC_FAR *BSTR; rpc.h: #define __RPC_FAR
494 :
485 :2005/07/08(金) 11:56:27
ありゃ。見逃してました・・・。 大変申し訳ないです・・・。
過ちを記憶し、次は聞かずにできるようになれ。 それならばなんら問題なし。
駄目だよ、なんかカコよすぎる
bcc32で質問なのですが union CPatch { unsigned long patch_data; struct t_Part { char patch; char LSB; char MSB; __property bool Drum = {read=GetDrum, write=SetDrum}; private: char drum; bool GetDrum() { return static_cast<bool>(drum); } void SetDrum(bool val) { drum = val ? 0x80 : 0x00; } } Part; }; 上のような共用体は問題無いのでしょうか? 期待した動作はしているようなのですが・・
498 :
485 :2005/07/08(金) 14:21:33
>>495 おかげでVBとVCの連携とか普通にできるようになりました。
ありがとうございます。
>>497 「問題ない」とはどういう意味なんだろう。
少なくとも互換性という点に関しては、bcc以外では全く使えないという答になるが。
500 :
497 :2005/07/08(金) 14:58:03
>>499 やってはいけないことをやってないかという意味です。
>>500 bccでしか通らないことを問題としないなら医院で内科医?
#まさか、このスレでbccとして問題ないか聞いているわけじゃないよな?
作っていたプログラムをビルドすると、basetsd.h というのが 外部依存関係で出てきて、その中身を見たのですが、 #if ( 501 < __midl ) typedef [public] __int3264 INT_PTR, *PINT_PTR; typedef [public] unsigned __int3264 UINT_PTR, *PUINT_PTR; typedef [public] __int3264 LONG_PTR, *PLONG_PTR; typedef [public] unsigned __int3264 ULONG_PTR, *PULONG_PTR; #else // midl64 この一文、[public] の部分の意味がわかりません。
なぜ開発環境を書かないのですか?
書いたところで解るのですか?
>>502 上の#if ( 501 < __midl )に注目しろ。
これはMIDLコンパイラが使う部分であって、C/C++コンパイラは読まない。
506 :
デフォルトの名無しさん :2005/07/09(土) 16:35:12
プログラム起動時にLANコネクタが接続されているかどうかを プログラム上で検知する方法が解りません。 Windows API にもそれらしい関数を見つけられませんでした。 機能としては、Windowsでタスクトレイにあるネットワークアイコンが ケーブル未接続状態ですと×印が付きますよね。あの様な 機能を実装したいと思っております。 何か良い方法は御座いませんでしょうか? 参考ページとなるようなことでも構いません
あれは別にケーブルが接続されてないから出るわけではない
508 :
デフォルトの名無しさん :2005/07/09(土) 16:55:57
>>506 接続先が存在するか否かで判断すればいいんじゃ?
ま、無線もあることだし^^
APIどーのよりTCP/IPを勉強すべし
速度向上のためにinlineを指定しようと思ってますが、 いかがなものでしょうか? あまり意味のないことでしょうか?
>>511 意味のないinline化をしてしまうことがないように
プロファイルしてから効果的なところのみをinline化するといいですよ
本当に高速化を狙うなら、inlineより マクロの方がいいよ。 inline 関数がインライン展開されても、普通に引数のプッシュポップや、スタック操作とかの、 関数処理の準備/後始末コードが埋め込まれることもある。 マクロなら、そういうことが全然なくて、レジスタの取り回しにも無駄が発生しない。
そんなに大した差ではない気がする…。 マクロだと式を二重に評価してしまうミスを起こしがち。 #define max(n,m) ((n)>(m)?(n):(m)) inline int max(int n,int m){ return n>m?n:m; } void f(std::istream& in) { int n=max(in.read(),in.read()); } こういうミスのないように、inlineのほうをオススメしたい。
#define max(n,m) ((n)>(m)?(n):(m)) ←意図しない結果 inline int max(int n,int m){ return n>m?n:m; } ←意図する結果
>>514 その例はたまたまOKだけど、関数引数の評価順序って決まってないんじゃなかったっけ?
n,とmの順序が意味を持つ関数なら、問題起こるんじゃないか?
もちろん、マクロの危険性はわかるけど、それは関数と明確に区別 (マクロ名は大文字、関数は小文字みたいに)して、危険なコードに ならないように気を使えば済むこと。
それですまないのが人間というもの
519 :
514 :2005/07/10(日) 09:45:02
>>516 ごめん、引数の評価順序のことは忘れてた。
この例では、in.read の呼出回数が2回であるのに対して
マクロのほうだと3回呼ばれてしまうっていうことを示したかった。
>>513 寡聞にして、
>普通に引数のプッシュポップや、スタック操作とかの、
>関数処理の準備/後始末コードが埋め込まれることもある。
こういう例を知らないのだが。
具体例を挙げてもらえまいか。
最適化で綺麗さっぱり消えそうな気がするが。>inline関数処理の準備/後始末コード
522 :
511 :2005/07/10(日) 10:37:03
最適化に関して、お勧めのサイトはないでしょうか? 高速化に関して勉強をしたいと思ってますが。 今、案件で文字列解析のものをしてまして、 苦戦をしてます。
>>522 文字列解析なら寧ろ、アルゴリズムを見直すのが一番じゃね?
小手先の最適化をいくら施してもデータ件数に対するオーダーが変わるわけじゃないし。
つーことで、
つ[Google]
524 :
511 :2005/07/10(日) 11:18:05
>>523 ありがとうございます。
今、休日返上でアルゴリズムの改良をしてます。
かなり速くなりました。
あと一つお聞きしたいのですが、
クラスのメンバ関数内でstatic int a;と宣言したとしますよね。
この場合は、クラスオブジェクト単位でのstaticですよね。
たとえば、
CMyClass a,b;とあったとして、
void CMyClass::func(void)
{
static int a;
}
とあったら、このローカル変数aは全てのCMyClassオブジェクトをまたがる(共有する)変数となるのでしょうか?
Yes。 メンバ関数はオブジェクト毎ではなくクラス毎に生成されるってことを 頭に入れておくと理解しやすいと思う。
526 :
511 :2005/07/10(日) 11:38:04
>>525 ではCMyClass a,b;両方のオブジェクトで静的なローカル変数を共有すると。
なるほど。
ご返答助かります。
ありがとうございまいた。
527 :
511 :2005/07/10(日) 12:37:24
STLのstringのfind関数と、CString(MFC)のFind関数とではどっちが速いのでしょうか? 今はSTLを使ってますが、 どうやらこのfindが重さのネックのようです。
どういう用途で使ってるのさ
529 :
511 :2005/07/10(日) 12:48:06
std::stringで使ってるクラスを、CStringに変えて、CString::Find検索にしたところ、 劇的に速くなりましたw STLって重いんですね。 ちょっとSTLのスレッドでその辺を質問してこようと思います。
530 :
デフォルトの名無しさん :2005/07/10(日) 13:09:02
Game.hでButton.hをインクルードし、Button.hでGame.hをインクルードみたいに、 お互いにインクルードみたいなことがしたいんですが、 やる方法がありましたら、教えてください。
>>530 それに未来はないのでヘッダファイルの整理を推奨します。
>>531 やっぱ、そこですかね。
方法自体も探してたんですけど、みつからなかったですし。
#ifndef〜#endifは重複対策で相互対策ではないですしね。
ありがとうございました。
>>529 std::string text =
>>529 ;
for(int i=0; i<1000,000; i++)
text.find("質問");
でやってみた。(BCB6#4)
std::printf.find > 4246sec
CString.Find > 2774sec
AnsiString.Pos > 1192sec
>>533 俺もやってみたけどCStringの方が遅かった。
_mbsstrを呼んでいるためのようなのでそこをどうにかしてみたけれど、
やっぱりstd::stringの方が早かった。
ATL::CString 3857ms
std::string 3069ms
(10,000,000回forで回した)
CStringは最終的に_mbsstrを呼んでいた。
std::stringは検索対象の1文字目を取り出して、それをchar_traits::findで検索し、
見つかればそこからchar_traits::compareして一致しているかで探している。
>>535 ワタシはCStringのほうが軽いです。
実行した環境は何でしょうか?
わたしはVC++6です。
537 :
デフォルトの名無しさん :2005/07/10(日) 15:31:15
5000個ぐらいのファイルを10種類の分類したいのですが ファイルのパスを変更するやり方がわかりません。 どなたか教えてください。
超初歩的な質問で申し訳ないんだけど オープンしたテキストファイルの途中にfprintfで書き込むことってできる? 追加ならできるんだけど・・・
540 :
535 :2005/07/10(日) 15:39:47
>>536 VC++7.1だ。念のために言っておくと535のCStringはstrstrを呼ぶようにしての値だ。
539>> できれば教えてください…
>>541 オープンしてテキストファイルの途中に行きfprintfで書き込め
544 :
536 :2005/07/10(日) 16:00:37
自分で独自Find作ったら、それが今のところ一番速いw どうなってるの?
てかstd::stringを日本語でfindって大丈夫なんか あぶなくね?
547 :
538 :2005/07/10(日) 17:27:35
>>544 どうせマルチバイトも考慮しないconst char*引数にとる関数だろ?
CStringはマルチバイト意識してるしstd::stringは参照連結意識してるし
ただの配列検索するだけのクソコードより遅いのは当たり前。
_mbsstr()使ってりゃCStringTは遅いだろ SBCS、またはUNICODEは前提じゃね?
まず最初に、どこから勉強をすればいいんですか? ネットを初めてまだ1ヶ月の漏れですけど 教えてくださいお願いします。
552 :
550 :2005/07/10(日) 18:57:58
>>551 とりあえずC++をマスターすればいいんですか?
情報検索はぐぐれば何とかなりますよね?
>>552 とりあえず何がしたいのかがわからないと何もいえない。
「C++をマスター」というのも、具体的に何のことかわからない。
自分以外の人が読むことを考えて文章をよく読み直すようにしろ。
情報検索は、基本的にGoogleで問題ないと思う。
技術情報は英語を検索対象として使えると、
日本語だけよりも数倍幅が広がるぞ。
あと、C/C++に関する具体的な質問でなければ、ここはスレ違いだ。
別スレいけ。
554 :
デフォルトの名無しさん :2005/07/11(月) 01:49:01
再帰ってなるべく避けた方がいいのでしょうか? それともばんばん使ってもいいの?
人によって意見が分かれると思うが、一般に再起を使うと分かりにくくなるし、 メモリが限られるシステムの場合はスタックオバーフローなどの危険が伴う。 ただ再起を使わないととても複雑になる処理(ディレクトリツリーや魔方陣等) もあるので臨機応変に。
556 :
デフォルトの名無しさん :2005/07/11(月) 01:58:07
>555 ありがとうございます
557 :
デフォルトの名無しさん :2005/07/11(月) 17:04:06
データのダンプをするプログラムで、 ループ処理の中で呼び出されるある関数の中で10Mくらいのサイズの変数を使いたいのですが mallocしても、char data[10000000]="";としても、 数回の実行でセグメンテーション違反が出てしまいます。 mallocの場合は一度ずつフリーしているし、char dataで用意した場合は一度実行したらreturnでブロックの外に行っているので メモリ領域は解放されているはずなのですが・・。 取得するメモリ領域を小さくするとループされる回数が増える(セグメンテーション違反のタイミングが遅れる)から メモリ不足が原因だと思うのですが、マシンの空きメモリは60Mくらいあって、最大10Mのメモリ取得なら問題無いはずだし。 どんな原因が考えられますか?
>>557 症状が再現する最小のプログラム片を晒してみろ。
>>557 malloc()は兎も角、ローカル変数はスタックに取られるので無理。
あと>558。
560 :
557 :2005/07/11(月) 17:38:09
再現するプログラムを作ろうとしたら再現しなくて 元のソースを良く見たら別の関数でメモリリークしてました_no ごめんなさい!!
561 :
デフォルトの名無しさん :2005/07/11(月) 17:43:54
class CBase { int m_nData1; int *m_p; public: int GetData1 () { return m_nData1; } int * GetP () { return m_p; } }; class CSub : public CBase { int m_nData2; public: CSub () { ZeroMemory(this, sizeof(CSub)); } int GetData2 () { return m_nData2; } }; あの、質問です。コンストラクタによる初期化で迷ってます。 コンストラクタで全部0にしたい場合、 ZeroMemoryでthisを指定して、全部0にしちゃっていいんでしょうか? ↑のはいちおう全部0が入ったのですが・・。 どなたかお願いします m(__)m
>>561 仮想化した瞬間アボーンするからやっちゃダメ。
その例ならば、
CSub() : m_nData2(0) {}
というように0でメンバを一つずつ初期化するのが無難。
564 :
561 :2005/07/11(月) 17:48:43
>>562 素早い回答感謝です。
だめってことは、全部0にならない場合があるってこと
でしょうか?
Sub () { memset(this, 0, sizeof(CSub)); }
↑はどうですか?
これもいちおう成功したのですが・・。
565 :
561 :2005/07/11(月) 17:49:51
あ、かぶった。。 仮想関数使ったことないのでwよくわからないのですが、 やぱ一個ずつ0にするのが無難なのかあ。
>>564 そうじゃなくて、0にしたら駄目な部分まで0にしてしまうから良くない。
ちなみに、CSub() : m_nData2() {} みたいに初期化する値を省略することもできる。
567 :
デフォルトの名無しさん :2005/07/11(月) 17:54:35
1の虚数部(i) ってなんですか?
568 :
561 :2005/07/11(月) 17:57:18
>>563 m_nData2 = 0;
ってやらないのは、なにか意味があるんですか?
ときたまその記述方は見かけるのですが・・。
>>566 CSub () : m_nData2() {}
これを今やってみたのですが、0が入りませんよー (T_T)
雑魚な質問ばかりですみません m(__)m
>>568 >563
初期化と代入の違いについて調べよ。
ZeroMemoryしちまったら関数のコードまで0になんだろ
572 :
561 :2005/07/11(月) 18:33:37
>>570 >>571 すみません。私にはわからないので、
もうちょっと勉強してきます。
ヒントいただきました。
ご親切に、ありがとうございました。 m(__)m
関数のコードっつうかvptrな
16進数の文字コードを文字列に変える関数を教えてください。 たとえば、「0x92, 0xca, 0x8f, 0xed, 0x00」とか
それそのまんまchar型配列に入れてけば?
>>574 16進数の文字コードとはどんな状態なんだ?
またオバカさんが現れました!
>>576 文字列として入った状態です。
文字列を16進数に変換するには?
asc$()
>>580 > 文字列に変える関数を教えてください <574
> 16進数に変換するには? <580
何をどう変換したいんだ?
「○進数に変換」って言い方がそもそも変なことに気づいて欲しい。
585 :
580 :2005/07/11(月) 20:27:19
事故解決しました。
あぁ、つまり、文字の実際のコードの数値を16進数文字列で取得したいと言うことか 質問が曖昧すぎだな
>>561 ポインタ(その例では m_p )を ZeroMemory() とか memset() でゼロ埋めしても、
ヌルポインタ(その例では m_p(0) としたときの値)になることは言語の規格として保証されていないから、
移植性が問題になるときは気をつけれ。
>>587 C言語では規定されていないけど、
C++ではNULLがビットパターン0になるよう規定されてなかったっけか?
まぁどちらにしろ、明示的に初期化した方がいいと思うけどさ。
>>588 >C++ではNULLがビットパターン0になるよう規定されてなかったっけか?
ちがう
p=0 とかやると、NULLを表すビットパターンが格納されることが保障されている。んでなかったっけ。
ポインタに0を代入するとNULLになるが、0はNULLじゃないんだよ。 つーか、本件の場合それ以前に問題なわけだが。
URLエンコードのプログラムって文字コードによらず同じなんですか?
NULLを内部で0にできない環境って例えばどんなのがあるんですか?
>>594 アドレス0に有効なデータを配置しないといけない環境。
>>593 エンコード方法自体に違いはない。
エンコードするものが違うだけ。
って言うかスレ違いだろ。
>>596 レスありがとうございました。
確かにスレ違いでした。すみません。
598 :
デフォルトの名無しさん :2005/07/12(火) 15:27:01
rand()だと乱数が固定してしまうし srand(time(NULL))だと連続で早い処理では 同じ乱数ばかりがでてしまいます。 実行毎に違いばらばらな乱数を出すにはどうしたらよいのでしょうか?
>>598 起動時に1回だけsrand呼ぶんじゃダメなのか?
Cの標準ライブラリの範囲では無理なんじゃないかな。 シーケンシャルに実行されるんなら、 ・n = ファイル"rand.txt"から数を一つ読み込む、無ければ0。 ・srand(n) ・ファイル"rand.txt"にrand()で乱数を一つカキコ。 ・処理 でどう?
>>600 馬鹿?
乱数系列の種を、特定の乱数系列かの乱数から得たら規則性ができちゃうじゃん。
時間から
603 :
598 :2005/07/12(火) 16:38:08
srandを呼ぶということは毎回scanfで入力するということですか? だとするとできれば避けたいです。 とりあえず今までwhileの中に入れてたsrand(time(NULL))を whileの外からだすことにしました。するとさっきよりよい結果が。 それでも似た値(特に一回目が)になりますが妥協することにします。 ありがとうございました。
>>603 ループ回るたびに乱数ルーチン初期化してるのがそもそも間違い。
普通は
srand(time(0));
while(true)
{
printf("%d\n", rand());
}
こんな感じで使う。
ちなみに乱数生成のパラメータはグローバルスコープ持ってるのが普通だから、通常はアプリ起動時に1回だけsrand呼べば十分。
605 :
超初心者ゴン :2005/07/12(火) 19:37:42
//登録するレコードをメモリに記憶させる memcpy((pCODE)->name,(BABS.name),sizeof(BABS.name));//古いメモリから確保されたメモリにコピーします len = strlen(BABS.add); pCODE->add = new char[len+1]; strcpy(pCODE->add , BABS.add); memcpy(&(pCODE->add_len),&(BABS.add_len),sizeof(short)); memcpy(&(pCODE->anco),&(BABS.anco),sizeof(short)); memcpy(&(pCODE->teno),&(BABS.teno),sizeof(short)); memcpy(&(pCODE->num) ,&(BABS.num) ,sizeof(short)); memcpy(&(pCODE->age) ,&(BABS.age) ,sizeof(short)); //指定されたメモリを上書きする memcpy((g_pCODE->name)+g_REVI_num,(pCODE->name),sizeof(hangar)); len = strlen(pCODE->add); (g_pCODE->add) = new char[len+1]; strcpy((g_pCODE->add)+g_REVI_num,(pCODE->add)); memcpy(&(g_pCODE->add_len)+g_REVI_num,&(pCODE->add_len),sizeof(hangar)); memcpy(&(g_pCODE->anco)+g_REVI_num,&(pCODE->anco),sizeof(hangar)); memcpy(&(g_pCODE->teno)+g_REVI_num,&(pCODE->teno),sizeof(hangar)); memcpy(&(g_pCODE->num) +g_REVI_num,&(pCODE->num) ,sizeof(hangar)); memcpy(&(g_pCODE->age) +g_REVI_num,&(pCODE->age) ,sizeof(hangar)); delete [] pCODE; //使い終わったメモリを解放する struct hangar{ char name[21];//名前 short anco;//市外局番 short teno;//局番 short num;//番号 short age;//年齢 char *add;//住所 short add_len;//住所用の長さ }; g_REVI_numは修正bナす ・hangar *g_pCODE; ・extern hangar *g_pCODE; なにかうまく行きません。なんか変なところばかりですけど、もっと変なところはありませんか?
>>605 >もっと変なところはありませんか?
なんて答えて欲しいんだ?
で、なんでmemcpy()を使うの? 普通に考えれば只の代入でよさそうな気がするのだけれど。
非常にバカバカしい問題で申し訳ないのですが、 #include <stdio.h> main() { printf("Hello!"); return 0; } でプログラムをコンパイルしようと すると、 エラー E2209 sample1.c 1: インクルードファイル 'stdio.h' をオープンできない 警告 W8065 sample1.c 4: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) *** 1 errors in Compile ***、というエラーがでます。どなたか解決策を教えてください。 コンパイラはborlandを使ってます。
>>607 コンパイラの設定がうまく行ってないと思われる。
>>605 *pCode = BABS;
パット見だけど、でいいんでないの?
>>610 文節中に副詞句を割り込ませるとはなかなかやるな。
それはそうと、pCode->addの指す先をコピーしないとまずい希ガス。
N個の文字列を入力し、その長さに応じたメモリ領域を動的に確保したいんですが、 なぜか正常に動作してくれません。 mallocあたりがおかしいんでしょうか。それとも文字列の代入が・・・? #define N 5 int main(void){ char s[101] , *stbl[N]; int i; for(i = 0 ; i < N ; i++) stbl[i] = NULL; for(i = 0 ; i < N ; i++){ printf("%d : " , i+1);scanf("%100s" , s); if((stbl[i] = (char *)malloc(sizeof(char) * strlen(s) + 1)) == NULL) printf("Memory Error\n");goto FREE; stbl[i] = s; } for(i = 0 ; i < N ; i++) printf("%s\n" , stbl[i]); FREE: for(i = 0 ; i < N ; i++) free(stbl[i]); return 0; }
>>613 > stbl[i] = s;
strcpy(stbl[i], i);
あとここを
> char s[101] , *stbl[N];
こうすれば
char s[101] , *stbl[N] = {0};
直後のfor(i = 0 ; i < N ; i++) stbl[i] = NULL;が不要になる。
エンディアン変換について質問があるんですが、 /* Big endian: */ #if !(defined(__alpha)||defined(__i386__)||defined(__vax__)) #define BIG_ENDIAN #endif こんな感じのコードをみかけます。 ダウンロードしてきたソースコード内を検索してみましたが、 defined(XXX)の中のXXXがマクロ定義されている部分は見つかりませんでした。 コンパイラさんは一体いつ、どこでXXXが定義されている、いないを判断しているんでしょうか コンパイラは gcc version 3.3.3 です。
>616さんどういうことでしょうか・・・ CPUが勝手に処理するんでしょうか?
618 :
初心者 :2005/07/13(水) 00:54:08
>>610 さん
住所だけが可変なんで固定長ならそうでいいかもしんないですけど。・・・
でもあとで住所を更新すればいいかもしんないですけど。。。
>>605 >pCODE->add = new char[len+1];
〜中略〜
>delete [] pCODE; //使い終わったメモリを解放する
↑ありえない。delete [] pCODE->add; delete pCode; だろ
>short add_len;//住所用の長さ
↑わざわざ宣言してるのに何故使わない?
>&(g_pCODE->add_len)+g_REVI_num
↑意味わからん。これでいいだろ→(g_pCode+g_REVI_num)->add_len
>住所だけが可変なんで
↑ならそう書け↓
memcopy(pCode, &BABS, sizeof(hangar));
pCODE->add = new char[BABS.add_len+1];
strncpy(pCODE->add, BABS.add, BABS.add_len);
ポインタに単語を放り込んでその単語の種類の数を数えるのってどうすればいいんでしょうか?
>>615 コンパイラ(プリプロセッサ)が自動的に定義するマクロがある。
gccだったら、
echo | gcc -dM -E -
としてみると、そういうマクロの一覧が見られる。
624 :
デフォルトの名無しさん :2005/07/13(水) 01:54:15
VisualC++2003なんですが、 カスタムビルドで使う環境変数マクロ(ProjectDirなど)を 自作したいんですがどうすれば可能でしょうか?
VCスレで訊けば?
626 :
デフォルトの名無しさん :2005/07/13(水) 08:43:57
ファイルサイズを取得する一般的な方法を教えてください。 言語は C/C++ どっちでもいいです。できれば環境に依存しない方法を。 今のところは↓のようにしているのですが、これって問題ありますか?また、一般的ですか? long filesize(const char* path) { long size; FILE *fp=fopen(path,"rb"); if(fp==NULL)return -1; fseek(fp,0,SEEK_END); size=ftell(fp); fclose(fp); return size; }
>>626 環境に依存しない一般的な方法はない。
そもそも、ファイルの概念が存在しない環境もある。
>>626 そのやり方は、まぁ無難だね。
問題は、2GBを超えるファイルの扱いだけど。
それと、多くの環境でstat()が使えるし、
外部コマンドに頼る方法もあるので検討してみては?
629 :
626 :2005/07/13(水) 10:28:12
ありがとうございます。_stat を検討してみます。
質問です。 int a, b; unsigned int c; a = -1; b = 0; c = 20; if (a < (b + c)) return 0; ということを行なうと、どうやらunsigned比較が行なわれるらしく、比較の結果がfalseになります。 この暗黙のキャストの優先順位はどう決まっているのでしょうか?
コンパイルで警告が出るはずだが… unsigned と signed の演算では unsigned として計算される。 signed として扱いたいなら明示的にキャストする必要あり。
632 :
超初心者ゴン :2005/07/13(水) 10:51:17
633 :
超初心者ゴン :2005/07/13(水) 11:28:02
>>620 san
strcpy(pCODE->add, BABS.add, BABS.add_len);
'strcpy' : 関数が不正な 3 個の実引数をともなって呼び出されました。
ってなってしまいました。
634 :
デフォルトの名無しさん :2005/07/13(水) 11:32:48
プログラムを始めた初心者です。最近、if文とfor文と一次配列と二次配列がなんとか理解できるようになって、なんちゃってエクセルが作れるようになたのですが、こんなプログラムって、ゲーム作るのに役に立つんですか?
めちゃめちゃ役に立ちます。
>>631 ありがとうございました。
コンパイラは警告はいてくれませんでした。VS6.0です。
警告レベルをあげてみますね。
質問です。 将来使うつもりで変数を宣言しておいたところ、「一度も使われていません」警告がでました。 それは当然なのですが、これが邪魔っけなので消したいのですが int a = 0; a = a; とかやると(現段階では)無駄な動作が入ってしまいます。 昔どこかで「これは使われてないけど、使ったことにしておく」命令を見た覚えがあるのですが、どなたかご存知ないでしょうか。 よろしくお願いします。
638 :
デフォルトの名無しさん :2005/07/13(水) 11:48:12
まじっすか! ゲーム作るには、何らかのソフトウェアが必要ですよね?
639 :
東海大学前 :2005/07/13(水) 11:48:36
プログラミング初心者なのですが、キーボードから整数値の駐車時間を分単位で読み込む。 ・駐車時間が1時間未満ならば無料 ・駐車時間1時間から3時間未満までは150円 ・3時間以上は、一律300円 ・0(ゼロ)を入力すると終了する。 というのがどうしても分からないのですが、よかったら教えて頂けないでしょうか? <プログラム実行例> PARKING Input minutes = 430 Parking time => 7:10 =>\300 Input minutes = 127 Parking time => 1:7 =>\150 Input minutes =67 Parking time => 1:7 =>\150 Input minutes =32 Parking time =>0:32 =>\ 0 Input minutes =0
>>637 gccにはそういう指定がある。VC++とか他のコンパイラは知らん。
>>638 何のコンパイラ使ってるか知らんが、WIN32 SDK さえあれば、
C言語だけで作れないことはない。
>>639 > <プログラム実行例>
>
>
> PARKING
> Input minutes = 430
> Parking time => 7:10 =>\300
> Input minutes = 127
> Parking time => 1:7 =>\150
> Input minutes =67
> Parking time => 1:7 =>\150
> Input minutes =32
> Parking time =>0:32 =>\ 0
> Input minutes =0
なんだ、もう出来上がってるじゃん。
644 :
デフォルトの名無しさん :2005/07/13(水) 12:09:36
>>637 コンパイラのオプションで警告が出ないようにする。
できるかどうかはコンパイラによる。
645 :
東海大学前 :2005/07/13(水) 12:10:57
実行例はあるのですが、どうやったらこのプログラムができるか教えてください。
646 :
東海大学前 :2005/07/13(水) 12:16:26
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): キーボードから整数値の駐車時間を分単位で読み込む。 ・駐車時間が1時間未満ならば無料 ・駐車時間1時間から3時間未満までは150円 ・3時間以上は、一律300円 ・0(ゼロ)を入力すると終了する。 というのがどうしても分からないのですが、よかったら教えて頂けないでしょうか? <プログラム実行例> PARKING Input minutes = 430 Parking time => 7:10 =>\300 Input minutes = 127 Parking time => 1:7 =>\150 Input minutes =67 Parking time => 1:7 =>\150 Input minutes =32 Parking time =>0:32 =>\ 0 Input minutes =0 [3] 環境 [3.1] OS:Windows/Linux/等々 windows xp [3.2] コンパイラ(バージョン): [3.3] 言語:C/C++/どちらでも可 のいずれか c/c [4] 期限 できれば今すぐお願いします。
…
int i_main = 100; char *i_mainchar; sprintf(i_mainchar,"%d",i_main); for(int i = 1;strlen(i_mainchar) - 1 >= i; i++){ cout << i_mainchar[i]; } なぜか実行すると落ちるんですが… cout部分のiを直接指定すると平気です。 原因がわかりません。よろしくお願いします。
650 :
デフォルトの名無しさん :2005/07/13(水) 12:55:12
テキストファイルを読み込んで1行づつinputに格納してるんですが こうやると途中にスペースがあるファイルだとスペースで読み込みを中止して 次の行になってしまうんですが回避する方法はありませんか? std::string FileName; std::cin >> FileName; std::ifstream Input_File( FileName.c_str() ); std::string str; std::vector< std::string > input; int i=0; while(!Input_File.eof()){ Input_File >> str; input.resize(i+1); input[i] = str; i++; std::cout << str << std::endl; }
>>649 i_maincharが何も指してない。
652 :
649 :2005/07/13(水) 13:15:15
本当だ…。 ありがとうございました^^ # Cの変数は難しい〜。
>>650 std::stringへの>>は空白区切り。
行単位で読みたいときはstd::getline
>>637 a;
とだけ書けば良かったような希ガス。
>>637 bccなら
プリプロセッサ指令#pragma warn - 8057を入れるか
コマンドラインオプションで-w-8057入れとけ
656 :
超初心者ゴン :2005/07/13(水) 15:48:21
すみませんホントお願いがあるんですけど、メールでソースを送りますから 誰か見ていただけませんでしょうか?
5億行もあるソース見られるか!
658 :
超初心者ゴン :2005/07/13(水) 16:02:08
いやいやそこまでないっす!編集します!
printfとwriteの違いがよく分かるサイトを教えてください
>>654 それやるとBCCでは
W8019 コードは効果を持たない
と言われる。
なぜかcppだと言われない。
663 :
超初心者ゴン :2005/07/13(水) 16:19:38
超初心者ゴンも相手している奴もウザス
665 :
超初心者ゴン :2005/07/13(水) 16:23:37
667 :
超初心者ゴン :2005/07/13(水) 16:31:19
いやいや死なないし!でどうすれば遅れますか?
668 :
超初心者ゴン :2005/07/13(水) 16:31:54
字間違った、、送れますか?
669 :
超初心者ゴン :2005/07/13(水) 16:34:11
670 :
659 :2005/07/13(水) 16:35:17
ヒント お願いします
writeなんて標準にないし
環境依存OKじゃなかったのか?このスレ
>>672 環境をかけって事をいいたいのではないかと。
675 :
659 :2005/07/13(水) 17:43:34
UNIX環境・・・
man使えば?
677 :
613 :2005/07/13(水) 18:12:58
>>614 遅れてスマソ
strcpy(stbl[i], i); は strcpy(stbl[i], s); ですよね。
正常に動作することはできましたが、なんでstbl[i]=s; ではだめなんでしょうか・・・?
>>677 sがA番地、stbl[i]がB番地を指しているとすると
strcpy()では、A番地から始まる文字列をB番地にコピーする
stbl[i] = s; では、stbl[i]もA番地を指すようになる
(ついでに、malloc()で確保したB番地を指す者が存在しなくなるので、メモリリークとなる)
やってることは全然違う。
>>677 stbl[i] = s;ができるのならstrcpyも存在するわけがない。
つまりstbl[i] = s;ができないからstrcpyが在る。
よってこのstrcpyは高速移動をしていないと言える。
C/C++ってむかつくな 関数のプロトタイプみただけじゃ何やってるかわからん。 引数に指定された値を書き換えるのって気持ち悪いと思うのはオレだけか?
> C/C++ってむかつくな 無理にやれとは言わないよ > 関数のプロトタイプみただけじゃ何やってるかわからん。 プロトタイプに期待しすぎ > 引数に指定された値を書き換えるのって気持ち悪いと思うのはオレだけか? 書き換えないときはconstで
>>682 引数に指定された値を書き換えるのはCでは不可能だが?
686 :
マリー :2005/07/13(水) 21:11:31
構造体なりクラスなりを値で返せばいいじゃない
687 :
初心者丸出し :2005/07/13(水) 21:12:52
windowsで簡単なプログラムを書こうと思ったんですが getcharやscanfでキーボード入力ができません。 windowsではキーボード入力できないのですか?
> getcharやscanfでキーボード入力ができません。 なんで「できない」と思ったのか?
>>687 できますよ!
そのプログラムを晒しなさい、怒らないから
690 :
デフォルトの名無しさん :2005/07/13(水) 21:17:14
Cで10進数をn進数にするプログラムを作ったんだけどどうもうまく遺憾。
691 :
初心者丸出し :2005/07/13(水) 21:35:18
>>688 689
聞いといてなんですが何とか解決しました。
もう一つ聞きたいのですが、エディタは皆さんどんなのを使ってるのでしょうか?
今使っているエディタは括弧の対応が分かりづらくて苦労してます
viなら%コマンド一発だ まあ薦めはしないが
すいません、
>>2 に書いてあることが気になったのですが、
STLって使える場面ではどんどん使って大丈夫ですか?
それともあまり使わないほうがいいのでしょうか?
695 :
初心者丸出し :2005/07/13(水) 21:51:15
>>694 実はお恥ずかしい話ですが、シェル(ターミナル?)がないと
コンパイルの仕方分からないんですよ…
だからコンパイル実行機能付きのエディタ使ってるんですが…
>>695 どうせすぐ慣れるから今はそれでいいんじゃない?
>>695 cygwinでも入れとけ。
unix互換シェルにgccも入ってる
viやemacsも入ってたはず
>>696 なるほど、気にしないで使ってみます。返答ありがとうございました。
700 :
初心者丸出し :2005/07/13(水) 22:58:14
>>698 cygwinですか一度入れてみます
ありがとうございました
emacsはデフォルトでは使えないな。viはあるけど。
>>690 ご参考までに。
#include <stdio.h>
char* to_radix_n(unsigned int x, char* s, int n) {
int index = 0, left = 0, digit;
char temp;
do {
digit = x % n;
s[index++] = digit > 9 ? digit - 10 + 'A' : digit + '0';
} while (x /= n);
s[index--] = '\0';
while (left < index) {
temp = s[left];
s[left++] = s[index];
s[index--] = temp;
}
return s;
}
int main(void) {
unsigned int x;
char s[256];
printf("Enter Number:"); scanf("%u", &x);
printf("%u(10) = %s(16)\n", x, to_radix_n(x, s, 16));
}
703 :
620 :2005/07/14(木) 00:10:41
>>633 >strcpy(pCODE->add, BABS.add, BABS.add_len);
~~~~~~~
もういちど
>>620 を良く見直せ。
704 :
デフォルトの名無しさん :2005/07/14(木) 00:32:30
いきなり悪いC言語初めて60分だが早速壁にぶちあたってしまった。 LSI C86 Ver3.30c試食版をXPつかっているんだがコマンドプロンプトで コンパイルしたら aaa.c 1: can't open: stdio.h: No such file or directory て、でてコンパイルできないんだが。 たのむ!誰か教えてくれ!
コンパイラの設定が悪いんだろうな
706 :
デフォルトの名無しさん :2005/07/14(木) 00:36:37
そうか、ありがとう。も一回よくみてみるわ
かんきょうへんすうきちんとせっていしてさいきどうしとるか?
そのコンパイラはやめたほうがいいよ・・・・。
709 :
デフォルトの名無しさん :2005/07/14(木) 00:51:12
708>なぜ
始めて60分ならいいじゃん、タダだし本でてるし
だったらcygwinでgccでいいんじゃん これで問題解決
>>711 GPLとか希望に燃える16歳にはキツスギス
cygwin勧める人多いけど、初心者にはMinGWがいいんじゃないかな。 cygwin入れるぐらいならLinux入れろと。
>>704 LSI-C86試食版は、ロングファイル名に対応してないからだろ。
ソースの置き場所を工夫してみろ。
>>712 うん、実行するのにdllガイルんじゃ友達に自慢できないもんね
720 :
デフォルトの名無しさん :2005/07/14(木) 01:06:41
あれから何回かためしてるけどいっこうに aaa.c 1: can't open: stdio.h: No such file or directory と、でるばっかりだ。 そもそもなんでこれがでるのか教えてくれないか
>>720 まじでmingw入れろ。幸せになれるから。
724 :
デフォルトの名無しさん :2005/07/14(木) 01:11:44
ちなみにこれがコンパイルしようとしたソースコードです #include <stdio.h> main() { printf("ようこそC言語へ!\n"); return 0; }
726 :
デフォルトの名無しさん :2005/07/14(木) 01:19:43
これ、テキストドキュメントに書いてるんだがそのとき字の大きさを 変えるためフォントを開いたんだよな。そのとき書式も変えてMS P明朝 にしてあるんだが何か関係あるか
あきらめてcygwinいれろ、でgcc -mwindows -mno-cygwin でコンパイルしろ
>>726 そう思うなら新規でテキストファイル作ってそこにコピペしろ
後
>>722 の意味がわからないならそう言え
730 :
デフォルトの名無しさん :2005/07/14(木) 01:31:26
すいません。722の意味を教えてください。
731 :
446 :2005/07/14(木) 01:37:14
デフォルト char が符号付かどうか調べようとして char c = -1; とすると (c==-1) と (0<=c) の両方が成立してしまうコンパイラ>LSI C86
733 :
デフォルトの名無しさん :2005/07/14(木) 01:49:52
ありがとうございます。これみてまたやってみます。
734 :
デフォルトの名無しさん :2005/07/14(木) 01:51:48
main() { char c[3000], nwo[3000]; int j, i; scanf("%s", &c); /*for(i=0; i<3000; ++i){ nwo[i]=0; } */ printf("%c\n", c[2]); return 0; } キーボード入力でabcdeと入力したらcが出力されるようにしているつもりなんですが、 /* */をはずすと何も出力されなくなるんです。なぜだか分かりません 配列cとは何も関係ないように思うのですが
735 :
デフォルトの名無しさん :2005/07/14(木) 01:54:37
質問させてください。
画像処理を課題に出されて、その第一段階でつまずいてしまいました。
配列に画像データをバイナリで取り込んで、配列をファイルに書き出しして画像データに戻そうとしたのですが、
元画像サイズが1MBちょっとなのに対して、できた画像は50kB足らずで当然表示も出来ません。
バイナリエディタで開くと途中までは書き込めているようなのですが・・・
また、3kBの画像ではちゃんと動きました。
何が問題なのでしょうか?ご教授お願いします。
コンパイラはLSI C-86 Ver.3.30c 試食版を
ttp://homepage3.nifty.com/aokura/#C言語を始めよう !
を通して使っています。ってこれのせいかな・・・
736 :
735 :2005/07/14(木) 01:55:00
問題のソースです #include <stdio.h> #define H 54/* 54byte */ #define D 1228800 /* 縦*横*4byte = 640*480*4 */ FILE *fp; char data[H+D]; void get_ref(void){ fp = fopen("ref.bmp","rb"); fread(data, 1, H+D, fp); fclose(fp); } void main(){ get_ref(); fp = fopen("ref2.bmp","wb"); fwrite(data, 1, H+D, fp); fclose(fp); }
>>734 んじゃメモリの構造を考える時間だな
charの前にstaticつけてみろ
>>734 int main(void)
{
char c[3000] , nwo[3000] = {0};
int i , j;
scanf("%s" , c);
printf("%c\n" , c[2]);
return 0;
}
740 :
734 :2005/07/14(木) 02:02:38
>737 メモリの構造というと語弊があったな メモリの構造→メモリの確保の仕方
742 :
734 :2005/07/14(木) 02:07:52
>>738 NULL pointer assignment
って出てしまいました。よくわかりません
#include<stdio.h> int main(void){ char c[2]; scanf("%s",c[0]);/*2文字以上入力*/ printf("%s\n" , c[0]); return 0; } C言語のauto変数でこんなことも許されてるのは何故ですか? ほかのメモリ領域を侵食してしまったりして危険だと思うのですが
744 :
734 :2005/07/14(木) 02:15:41
>>737 staticをつけるとグローバル変数になると言うことでよろしいのでしょうか?
746 :
743 :2005/07/14(木) 02:23:18
>>746 もしそれがエラーにならないんだったら、使うのをオススメできないんだが。
748 :
743 :2005/07/14(木) 02:33:13
>>747 エラーも無しで綺麗にリンカーまで通ってしまいました
オプション指定無しでですが
#昔、auto変数の配列のことで聞いた事があったので試してみたのですが…
#lsic86は簡単な実験をするときに使っていたのですが、gccの導入を考えておこうと思います
>>744 それによって生じるメモリの扱われ方とか確保のされ方とかその辺を言いたかった
ちなみに
>>743 もstaticつければ多分エラーがでるのではないかと
実行環境ないから検証できんが
750 :
749 :2005/07/14(木) 02:44:12
auto変数って書いてあったよママンorz スルーしてくれ
scanf()やprintf()のような可変長引数関数については、通常Cコンパイラは 引数の型チェックはしないし、できない。大体、引数の個数も型も 決まっちゃいないんだからな。 コンパイラがprintf()書式指定文字列を「知って」おり、それに照らし合わせて 積極的にチェックするような仕様でない限り、コンパイルが通ってしまうのは、 普通だ。
つ【snprintf】
>>752 >>743 のように、char*を渡すべきところにcharを渡すようなバグ
に対しては、何の役にも立たない。
754 :
743 :2005/07/14(木) 03:00:57
>>751 ということはlsic86が悪いというわけでは無いのですね
でも、静的変数にしておくとscanfで入力したあとに
エラーとして(NULL)が出力されてプログラムが終了するのですが
これは静的変数と動的変数の違いの一つなのでしょうか?
755 :
743 :2005/07/14(木) 03:02:13
間違えました × 動的変数 ○ 自動変数
>>743 じゃなくて、書式指定文字列ではここはnull terminateされたchar*文字列
を渡すんだといっておきながらcharを渡しているわけだから、
その時点でバグなの。
その結果は、メモリの破壊。SEGVで落ちるかも知れないし、
どこかを知らずに書き換えるだけかもしれない。
可変長引数関数に関しては、一般的なCコンパイラはそういった種類の
バグを検出できない、というだけの話。
758 :
743 :2005/07/14(木) 03:10:42
>>756 ,757
なるほど、よく分かりました
ありがとうございました
シリアルポ−ト(COM1)の入力では、WM_の メッセ−ジは発生しないのでしょうか?
760 :
デフォルトの名無しさん :2005/07/14(木) 07:30:17
#include <stdio.h> int main(void) { int dat; int ans; printf("Input 'dat' ... "); scanf("%d", &dat); ans - dat + 2; printf("dat : 2 = %d\n",ans); return 0; } 質問です 上のソースファイルをコンパイルすると 30:1: warning: no newline at end of file というメッセージがでてどうすればいいかわかりません。 メッセージの意味とどうすればいいか教えてください。
>>760 ソースファイルは改行で終わらないといけない。
なのにお前のコードはそうなってはいないよという警告。
762 :
760 :2005/07/14(木) 07:50:53
>>761 お答えありがとうございます
なるほどそういういみですか。
最後の } を入力した後、enterキーを押して改行を行うと本には書いてあるんですが、
そのとうりやって、保存して、メモ帳を閉じる、という手順でやってるんですが。。。
何がいけないんでしょう?
自分がミスをしたという可能性は完全に無視ですか。
764 :
760 :2005/07/14(木) 08:28:55
なんかいじってたらえらーでなくなりました 朝からごくろうさんです。
>何がいけないんでしょう? あんたの日本語能力、態度、その他諸々。
これなんですか?? a.c:16: error: two or more data types in declaration of `main' int main() { の括弧でエラーが出てるんですが…
>>767 その前のクラス、構造体宣言にセミコロンが無い。
構造体を宣言してました、、そんなことまでわかるんですねぇ どうもありがとうございました^^
770 :
768 :2005/07/14(木) 09:44:51
771 :
769 :2005/07/14(木) 10:16:29
googleで検索はしたんですが、""を付けなかったので意味わからないことになってました。。 文字列検索は""をつけるといいんですね。。覚えておきます。。
すいません、質問ですが。 char table_name[10]= { (省略) }; の「char table_name[10]」の部分の正式な名称があるとおもいますが、教えていただけますでしょうか?
いま課題のソースの一部分なんですけど (pCODE)->addとpCODE->addって意味は一緒でしょうか?
pCODEがマクロだったら違う意味になるかもね。
多重継承で教えてください class CSub1 { int *pdata CSub1(int i){ pdata=somoting(i); } } class CSub2 { CSub2(int *pdata){} } class CMain:public CSub1 ,public CSub2 { int *const pdata; CMain(int i):CSub1(i),pdata(CSub1.pdata),CSub2(CSub1.pdata) //or CSub2(pdata) {} } としてもコンパイルが通りません CSub1 CSub2は既存のライブラリーのクラスなので変更できません. 解決策はないのでしょうか?
>>772 その定義を二つの部分に分けるなら、「char」と「table[10]={...}」に分かれる。
したがって、「char table_name[10]」の部分に名前はない。
文法的には、
「char」がdecl-specifier-seq
「table_name[10]」がdeclarator
「={...}」がinitializer
だと思う。
>>778 省略しすぎで訳わからん。
>778だけ見るとCSub1::pdataはprivateに見えるのだが?
>>778 どうして一番重要なエラーメッセージを載せない?
単純なゲームを作ってるんですけど、 その中でランキングを作ろうと思って a[0].name=("%s",name);/*ここにゲームの結果*/ a[0].rscore=("%d",score); for(i=0;i<10;i++)/*ファイルの読み取り*/ fscanf(fp1,"%s%d",a[i+1].name,&a[i+1].rscore); 上のようにやってこのあと構造体に渡そうとしてるんですけど どうやらデータがa.name,a.rscoreに入ってないようで表示させようとしたら エラーででて終了してしまうんですけど、どこが悪いかわかりますか?
>>782 >どこが悪いかわかりますか?
頭。
名前に空白を入れられても詰まらんから、スコアファイルはfscanf()よりfgets()+sscanf()の方が無難だろうなぁ。
スコアを先に置けばsscanf()の代わりにstrtol()でもいいかも知らん。
いずれにしても、やりたいことが判らんからもう少し全体が判るようにソースを晒して味噌。
#まさか、最初はファイルがないから読み込めないって落ちだったら笑うが。
784 :
778 :2005/07/14(木) 14:00:57
これならいい? class CCreateData { public: int *pdata; CCreateData(int i){pdata=create(i);} }; class CWrapperOfDataOperation { public: CWrapperOfpDataOperation(int *pdata){ variouseInitialize(pdata); } operator = ... }; class CDataAndOperation:public CCreateData ,public CWrapperOfpDataOperation { public: int *const pdata; CDataAndOperation(int i):CCreateData(i),pdata(CCreateData.pdata),CWrapperOfpDataOperation(pdata) {} }; ごめん,今したらコンパイルは通った。 けれど int *const pdata; に値が何もわりあてられてないので コンストラクター CWrapperOfpDataOperation(pdata) で失敗して 0xcccccd8を読み込み中にアクセス違反が発生しました というエラーが出る
>>782 > a[0].name=("%s",name);/*ここにゲームの結果*/
> a[0].rscore=("%d",score);
(´・д・`) ポカーン…
786 :
デフォルトの名無しさん :2005/07/14(木) 14:24:53
>>782 > a[0].name=("%s",name);/*ここにゲームの結果*/
> a[0].rscore=("%d",score);
豪快だなあ・・・Lua みたいだな
文字列同士の代入は出来ないぞ
sprintf( a[0].name, "%s", name );/*ここにゲームの結果*/
とかだな
あと、a[] の配列サイズは 11 個あるんだよな?
>>786 そう言う事は、構造体の定義を見てから言え。
,. ‐ '"~´ / ̄ ̄`~`''‐ 、 `` 、 , '´ / / `''‐、 \ , '‐''"~´ ̄ ̄`~`ヽ、 / \ ヽ . /  ̄``''‐.、 ∠>ヽ./\ ヽ . / _____ \ /゚ / ヽヽ 〈 ,. ‐''"~´ l ``''‐、 ヽ. / [ [[[ ヽi . ヽ. /ヽ、_,. -┴─-== __=-'_、_, \、_/ _l . | / 、.__/ ノ!ヽ、._ー-‐''⌒,r=-─ゝノ|| ‖  ̄ ̄ ̄ | ! { / ,イ{ ヽ ( 〈、_,.ィrヮー< _,リ_|| ‖ ! ヽ :ヽ _{. 〈.'`ァrッ‐、- - ,, ヽ-‐='..ゞ.{_.|| ‖ :l . `‐、\\ヽヽ-‐ツ ''´ `{_ |! ‖ ! : |{_ ヽ.i. 〔ー- { !. |!__ ,' . : |{_ _)l `,ィ-─_、 // | 0| ___/ : |{_ ミ. ! ヽ ̄,.-‐) .// /l ̄ __/ : |{ ,.`ヽ. `ー '´.∠‐'´ /'´ ̄ノ,ノ/ ,l ‐''"~´ ̄ ̄ ̄l~´ /-──<´ | 「 --┘ |___/ `! | L.. -─ ''_""~ ̄‐''"~´l | | アドレスを直接参照できるなんて気持ち悪いって言ってんだよーーーーー
フーン
794 :
デフォルトの名無しさん :2005/07/14(木) 22:11:01
こんばんは、よろしくお願いします。 void Main(void){ この上記の引数のvoidは、1番目のvoidを強調していると考えてよいのでしょうか。
>>794 よい。
参考までに
int main(int);
の場合は一番目のintを強調していると考えてよい。
へー
798 :
デフォルトの名無しさん :2005/07/14(木) 22:26:05
バックグラウンドでプログラムを起動するにはどうすればいいのですか? あと、自分へのリンクを作成するにはどうすればいいんですか? ボーランドC++コンパイラ win xp です。
>>796 さらに
参考までに
struct ahya *hoge(struct ahya *);
の場合は一番目のstruct ahya *を強調していると考えてよい。
800 :
デフォルトの名無しさん :2005/07/14(木) 22:35:57
int Main(char); これの場合は若干控えめな表現。
802 :
デフォルトの名無しさん :2005/07/14(木) 22:38:31
>>799 そうなんですか。ありがとうございます。参考になります。
>>801 こんなこともできるのですか。
難しいですね、ありがとうございました。
803 :
デフォルトの名無しさん :2005/07/14(木) 23:19:04
>>803 落ちるかどうかは知らんけど、そのソースはSJIS用だねぇ。
それを修正しているならその辺りを疑ってみては?
しかし、よくもまぁ、こんなゴミみたいなサンプル探してくるなぁ。
URLエンコード ソース とかでぐぐるとそのウンコソースが比較的上位に出るようだな(w 別にURLエンコードって、ソーステキストの文字エンコーディングに 依存する必要は無いはずなんだが.... わざわざSJIS漢字の1byte目の場合は、2byte目も決めうちで%エンコード してるみたいね その必要は無いのに。
>>784 ソース貼る前にコンパイル通るか確認しろよ、ばか。
初期化順は初期化リストに書いた順ではなく、
基底クラス(書いた順)、各メンバ(書いた順)になる。
その例ではメンバ CDataAndOperation::pdata の初期化よりも先に
基底クラス CWrapperOfpDataOperation の初期化が行われるので、
当然の結果となる。
gcc だと -Wall で警告が出る。
即席で作った。 #include <string.h> #include <ctype.h> /* * Encodes src string into dst, returns dst itself. */ char *url_encode(const char *src, char *dst) { int c; const char *rfc2396_mark = "-_.!~*'()"; char *result = dst; while (c = *src++) { c &= 0xff; if (isalnum(c) || strchr(rfc2396_mark, c)) *dst++ = c; else if (c == ' ') *dst++ = '+'; else dst += sprintf(dst, "%%%02X", c); } *dst = 0; return result; }
809 :
803 :2005/07/15(金) 00:15:49
>>810 unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
unreserved character以外はescapeされるべきである
というrfc2396の記述に従ったんだが
何か間違ってたかい?
812 :
803 :2005/07/15(金) 01:01:00
unwise = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`" これらの文字列があったら不正と判断すれば良いんですか? 他に不正と判断すべき文字列ってありますか?
813 :
803 :2005/07/15(金) 01:02:49
814 :
803 :2005/07/15(金) 01:09:14
あれ?
!!!をグーグルで検索するとエスケープされますけど
>>808 の関数はエスケープしませんね。
if (isalnum(c) || !strchr(rfc2396_mark, c))
ではないですか?
ちがうちがう、rfc2396_markはエスケープしなくていい文字列だ
816 :
803 :2005/07/15(金) 01:19:25
>>814 ×エスケープ
○エンコード
間違えすぎ_no
こうしてみましたけど、間違ってますか?
char *url_encode(const char *src, char *dst) {
int c;
const char *rfc2396_mark = "-_.!~*'()";
const char *rfc2396_unwise = "{}|\\^[]`";
char *result = dst;
while (c = *src++) {
c &= 0xff;
if (strchr(rfc2396_unwise, c))
return NULL;
else if (isalnum(c) || !strchr(rfc2396_mark, c))
*dst++ = c;
else if (c == ' ')
*dst++ = '+';
else
dst += sprintf(dst, "%%%02X", c);
}
*dst = 0;
return result;
}
817 :
803 :2005/07/15(金) 01:22:33
>>816 だめ。
てか、途中でreturn NULLしちゃってどうするの。
rfc2396のmarkに含まれる記号文字は、エンコードしなくていいと
言ってるだけで、しても構わない。
もし、何らかのプログラム(たとえばIE)の挙動にあわせたい等の理由で
その中身を替えたいのなら、rfc2396_markの文字を適当に調整しなさい。
>>818 return NULL;は、
呼び出し側で
if(url_encode(str,result)){
成功時処理
}else{
失敗時処理
}
としようと思ったんです。
unreserved = alphanum | markという記述の意味とか
ついさっきやっと気付きました。
>>808 のコードを使う事にします。
ありがとうございました。
820 :
デフォルトの名無しさん :2005/07/15(金) 12:31:54
798ですが、他所できいてきます
Visual Studioで開発してたんだけど マウスの操作がめんどくさくて腱鞘炎になりかけ 今まで開発してたVC++.net 2003のソースコードも そのまま使えて、なおかつ Emacsぽくキーバインドだけでほとんど操作ができる環境ってないの?
emacsだとMFCでボタンとか配置するとき どうするんだろう?
>>823 普通にxxx.rcを手書きすればいいじゃない。
>>821 それ以前に、ショートカットキーのカスタマイズはお試しになったのかしら?
>>823 MFCだからって別にリソースで凄いことやってるわけじゃないからな?
関数の後ろにあるconstの意味って何でしょうか?
その戻り値がconstである、じゃなかったっけ
そのメンバ関数がオブジェクトを変更しない、という意味だ const オブジェクトに対してもconstメンバ関数なら呼べる そうでなければ呼べない
戻り値がconstは普通に戻り値の型の前か・・・
832 :
831 :2005/07/15(金) 20:32:35
すみません。やっとわかりました。 お騒がせしてすみませんでした。
あ
質問させてください。 外部ファイルでテンプレートを定義してもLNK0219エラーが出てしまうんですけど、 何か普通の関数を定義するときとは違う方法が必要なのでしょうか? よろしくお願いします。 (外部ファイルでテンプレート→cppに実態、ヘッダにプロトタイプ宣言。メインCPPでヘッダ読み込み。)
テンプレはヘッダに書くべし
>>836 出来ました。ありがとうございました!
それにしても、どうしてなんでしょうね?
838 :
デフォルトの名無しさん :2005/07/15(金) 23:11:20
すいません質問させてください。 キーボード入力のときにリターンで終了させるときと、 Ctrl+Dで終了させるときがありますが、プログラムの違いは何処なんでしょうか? それとwindowsのコマンドプロンプトではCtrl+Dで終了できないのですが 何か他に方法があるのでしょうか
840 :
838 :2005/07/15(金) 23:29:44
>>839 終了できましたが肝心の結果が表示されませんでした。
これはプログラムの問題ってことですか?
>>838 WindowsでCtrl+Dの代わりなら、Ctrl+Zだな
Ctrl+Dで終わるプログラムは、EOFで終わるように組まれてるプログラムだ
842 :
838 :2005/07/15(金) 23:48:41
>>841 できました。ありがとうございます
ということはCtrl+DはEOFってことなんですね。
>>842 正確にはEOFというわけじゃなく、現在の端末入力をすぐに送る
ってことだ。プログラム側から見ると、入力中はブロックして(待って)
いるread()がその時点でリターンする。
行頭でCtrl-Dを入力した場合や、Ctrl-Dを連続して入力した場合、
read()が読み取るべき入力内容が何もないから、read()は0を返す。
それがEOFと解釈されるわけだ。
844 :
デフォルトの名無しさん :2005/07/16(土) 00:19:52
test.obj : error LNK2001: 外部シンボル "_TypeStart" は未解決です Debug/test1.exe : fatal error LNK1120: 外部参照 1 が未解決です。 このようなエラーはどのように解決するんでしょうか? 初心者なんで、教えてもらえませんか?
外部シンボル "_TypeStart" を解決する
846 :
デフォルトの名無しさん :2005/07/16(土) 00:23:21
847 :
838 :2005/07/16(土) 00:29:23
>>843 なるほどー難しいですが、なんとなく分かりました。
外部〜エラーははリンカーがぶち切れしてる
850 :
デフォルトの名無しさん :2005/07/16(土) 01:35:19
C++独学中の学生です。環境はVisualC++6.0です。
http://www.cplusplus.com/doc/tutorial/tut3-1.html の一番下の黄色い四角にあるプログラムを拡張して、
マトリックスをパラメータとして関数に渡したいのですが、うまくいきません。
ご指導お願いします。
#include <iostream.h>
void printmatrix (int arg[][], int length) {
for (int n=0; n<length; n++)
for (int m=0; m<length; m++)
cout << arg[n][m] << " ";
cout << "\n";
}
int main ()
{
int matrix[][] = {{1,2,3},{4,5,6}};
printmatrix (matrix,3);
return 0;
}
int main ()
{
int firstarray[] = {5, 10, 15};
int secondarray[] = {2, 4, 6, 8, 10};
printarray (firstarray,3);
printarray (secondarray,5);
return 0;
}
エラー表示
cpp(4) : error C2087: '<Unknown>' : missing subscript
cpp(13) : error C2087: '<Unknown>' : missing subscript
cpp(13) : error C2078: too many initializers
>>850 エラーメッセージに書いてある通り、C/C++では配列の要素数は明らかでないといけない。
従って、二重配列をパラメータとしたいのであれば
void printmatrix(int arg[][3], int length) {...;}
として受け取らないといけないし、
int matrix[][3] = {{1, 2, 3, }, {4, 5, 6, }, };
として定義しないといけない。
要素数を固定にしたくないのであれば、1次元の配列(≒ポインタ)を渡すようにするのが無難。
しかしまぁ、<iostream.h>ですか。またアナクロな……
852 :
デフォルトの名無しさん :2005/07/16(土) 02:11:45
>>851 ありがとうございます。
マトリックスのサイズは将来的に固定しないで扱えるようにしたいので、
1次元の配列に並べなおして計算していくことにします。
>しかしまぁ、<iostream.h>ですか。またアナクロな
何かがまずいのでしょうか?
拡張子の無いiostream をインクルードして、std名前空間を利用するのが今時のC++ .hのついたヘッダファイルは、C++の規格がまだ整っていなかったころ使われていた過去の遺物。
854 :
デフォルトの名無しさん :2005/07/16(土) 02:26:31
>>853 たまに見かける.hがないヴァージョンが最新とは知りませんでした。
何じゃこりゃと無視せずに勉強することにします。
ありがとうございます。
855 :
デフォルトの名無しさん :2005/07/16(土) 02:32:22
version toka iunayo C++ ha mukasikara <iostream> datta.
857 :
デフォルトの名無しさん :2005/07/16(土) 06:06:21
あのう、前前スレはhtml化されたのでしょうか・・・?
858 :
ミキミキ :2005/07/16(土) 08:07:04
「素数を求めるプログラム」を作成して下さい。 言語はA〜Cの中から選択をしてください。 A : Visual Basic B : C/C++ C : Java
inlineってマクロみたいに一回展開されるだけ? それとも、inline内部の関数は全部展開してくれる?
マルチすなや。 つーか、削除依頼出しておけ。
>>859 inlineはコンパイラにインライン展開してもいいことを示唆するための指示子。
マクロとは全く違う。
C言語はじめて3ヶ月くらいの初心者です. 質問ですが,実行ファイルの終了時にウィンドウ(コマンドプロンプト)が 消えないようにするにはどうしたらよいのでしょうか.
>>862 #include <stdlib.h>
int main()
{
system("pause");
return 0;
}
865 :
デフォルトの名無しさん :2005/07/16(土) 13:16:39
#include "windows.h" Sleep(ミリ秒); or #include "stdio.h" scanf("%d", c);
scanf("%d", c); アホかい。
何かおかしいか?
>>864 コマンドプロンプトから実行させるようにユーザーに言えばいい
>>867 止めるだけのためにscanf()を使うのは楊枝を鉈で削るようなもの。
無駄なばかりか危険ですらある。
%*dとかならそういった問題はないと思う。
scanfでやるとしたら scanf("%*s"); っていうほうがよく見かける
scanf()をどうしても使いたいなら>871だね。 まぁ、getchar()で充分だと思うのだけど。
勘で、、、"!"ボタンを押してみよ。
>>863 他にもいっぱい解決手段が書いてあるけど。
エンター押すのうざいならgetch()って手もあるな
いや、素直にコマンドラインから実行しろよ…
>>876 GUIからでもコマンド呼べるのはCUIの長所の一つですが。
バッチ的なルーチンでも出力内容を見るために、ちょっと待って欲しい時はある。
漏れもgetchで待たせて、目の前にあるスペースキー等でコマンドプロンプトのウィンドウを抹殺することはよくある。
個人個人の好みの問題だ罠。
C++のstringクラスって動的に伸び縮みするのに、何故newやdeleteを使わなくて済むんですか? なにかテクニックがあるなら他の自作クラスで活かしたいんですが。
内部でnewやdeleteと同等なことをやってる。
881 :
879 :2005/07/16(土) 18:45:29
>>880 ちょっと考えたのはコンストラクタとデストラクタでnewとdeleteを呼ぶってやり方なんですが、
deleteは自身がデストラクタを呼ぶらしいので永久ループになりそうな気がします。
> deleteは自身がデストラクタを呼ぶらしいので永久ループになりそうな 何を意味不明なことをいっとるんだ ~string() { delete this; }; とか言うコードを考えてるのか? そんな阿呆なことは流石にやらない。 メンバ変数をdeleteするだけなら何も問題無い。 その歳に、そのメンバに対するデストラクタは走るが、 自身に対するデストラクタは走らないから、無限ループにはならないよ。
>>881 class string {
private:
char* p;
int length;
public:
string() : length(1024) { p = new char[length]; }
~string() { delete p; }
};
だがコンストラクタとデストラクタでだけnew、deleteするなんざ糞クラス
885 :
879 :2005/07/16(土) 19:53:18
なるほど、わかりました。動的に確保したメンバだけdeleteするんですね。 ありがとうございます。
> string() : length(1024) { p = new char[length]; } > ~string() { delete p; } ~~~~~~~~~ 別の問題が発生していますが(笑)
char* につける引数名は何がふさわしい?
これだと思うのつければいい 決まりなぞない 俺はpstr
>>887 sでいい場合もあるが、意味を優先してつけるべき。
from, toとかsrc, dstとかpatternとか
cp, pc どっちか気分による
ポインタの文字列だから、pstrがいいかな。
文字列はchar*型でいいの? それとも、unsigned char*型?
だから型に従った名前付けるのなんざウンコだっての ハンガリアンと一緒に滅んだ思想だよ 型じゃなくて意味で名前を付けろ。型そのものが意味である場合は 別に構わないが。
>>892 文字として扱うのにsignedもunsignedもねぇよ
ねぇよっていうか、関係ねぇよ
charとchar*は区別して、char*の場合は頭にpをつけるのが礼儀。 ちなみに、チャー型じゃなくて、キャラ型だからね、発音は。
898 :
デフォルトの名無しさん :2005/07/16(土) 21:36:24
iconv()について質問です。 man iconv(3)を読むと、「iconv 関数は 1 度に 1 つのマルチバイト文字を変換する」 と書いてありますが、マルチバイト文字が複数含まれる文字列(『あいうえお』とか)に 対して実行した場合一度で全て変換されました。 ネットで探したサンプルではwhile()で回すものと一度のみの両方がみつかりましたが どちらが正しいのでしょうか?感覚的には前者が正しいような気がしますが、実際の 挙動は後者になるので悩んでいます。一度に変換される文字数は不定だったりする のでしょうか?
礼儀ってなんだ? イライラする香具師の方が多いと思うが
>>897 はいはい日立の腐れ社員は腐れコーディング規約でも量産して
三流派遣社員に鼻で笑われてくださいよ
>>898 > iconv 関数は 1 度に 1 つのマルチバイト文字を変換する
の意味は、一度のiconv()呼び出しで一つのマルチバイト文字しか変換しない
という意味ではなくて、単純に一文字ずつ逐次変換していく、という
内部動作を語ってるの。
関数全体としては、変換できたバイト数は引数経由で取得できるから、
変換が完了したかどうかはそれを見て判断する。で、完了するまで
ループする。という使い方が正しい。
charをチャー型と発音する人は意外と多い事実
charはチャー、のがむしろ伝統的だと思うぞ
だからなに?
905 :
898 :2005/07/16(土) 22:04:17
>>901 ありがとうございます。
「1 つのマルチバイト文字を変換」が内部動作を表しているということは
理解できましたが、そうなるとiconv()をwhileの内部に入れても、それは
必ず一度しか実行されないということにならないでしょうか?
iconv()の実行後に、結果が (size_t)-1 にならず、かつinleftが0より大きい
という状況はありえるということでしょうか。(それがありえる場合、whileは
無限ループに陥りかねない気もします…)
チャー型?キャラ型? 文字型っつーんだよ
#include <stdio.h> #include <math.h> int kc(int n,float x){ double k; k = x*tan(M_PI/n); //printf("k=%1.10f\n",k); return k; } int main(void){ double k; k = kc(12,1); printf("k=%f\n",k); } ------------------------- return k; の返り値が0になってしまいます。 どこか型などがおかしいのでしょうか?
>>905 > iconv()の実行後に、結果が (size_t)-1 にならず、かつinleftが0より大きい
> という状況はありえるということでしょうか
無論あり得る。outbufのサイズが不十分な場合だな。
その場合は、変換を続行するために、ポインタをずらしたりバッファ間で
コピーするなどのバッファ管理は当然必要になる。
質問 int GetLength() { return m_len; } というのがあって、 文字列の長さを取得するのに、GetLength()呼び出しとm_len呼び出しはどっちが速い?
>>908 あ、解決しました。
ありがとうございました。
913 :
898 :2005/07/16(土) 22:26:25
>>909 ありがとうございます!
理解できました。
一度エラーが出たら処理失敗扱いであぼーんしていたのですが
outbufが足りない場合はそうやって対処してから続きを行うことが
できるんですね。勉強になりました。。。
ていうかそもそも、m_lenは「呼び出す」などというものでもない
>>910 それだけの情報ではわからない。
m_len を呼び出すと言うのも意味不明。
スピードは実測が基本。
>>910 m_lenを呼び出すというのは適当に脳内置換してやる。
GetLengthがクラス宣言内にあればどうせインライン展開されるから速さは同じ。
たといインラインでなくても、たったその程度では遅いの早いの言うほどのものでもない
>>913 失礼。outbufが足りない場合は戻り値-1でE2BIGになるかな?
なんにせよ、
> 一度エラーが出たら処理失敗扱いであぼーん
エラーの場合でも、それはしないほうがよい。
ちゃんとerrnoを見よう。
EINVALの場合、inbufのMBC文字がハンパだということだから、
続きがある場合はバッファに追加すれば変換できる可能性がある。
行単位などではなくブロック単位で変換する場合はその手当ては必須だ。
本当にエラー(変換不能)と言えるのは、EILSEQの場合だけだろう。
この場合も、取りあえず?に変換して文字飛ばしして対処という手もある。
char配列の先頭へのポインタにcharポインタを代入しようとすると、怒られてしまいます。例えば、 #include <stdio.h> int main(){ char str[]="abcde"; char* p; *p = 'f'; str = p; } をコンパイルしようとすると error: incompatible types in assignment になります(gcc 3.3)。str = (char*)p とキャストしても駄目でした。 どこでつまずいてるのかわからないんですが、 「char配列の名前=charポインタ」という認識自体が間違ってるんでしょうか?
「ポインタ=変数」という認識が間違ってる。
>>919 配列はポインタではない。
配列は定数みたいなモンで、配列に代入はできない(初期化はできる)
あと、そのコードで
*p = 'f';
はダメだぞ。どこも指してないポインタが指している場所に値を代入しようと
してる。
コンパイルできても、クラッシュする。
ああ、はやく夏休み終わらないかなー。
>>919 二つの間違いがある。
1.配列の名前は配列の先頭アドレスを指す定数である
~~~~
2.pはまだ有効なアドレスを持っていないので*p = 'f';はエラー。p = "f";にすべき
925 :
924 :2005/07/17(日) 01:07:37
926 :
1/2 :2005/07/17(日) 01:08:54
double sum_element(double *arg,int start, int end){ double sum = 0; int i = start; if(end<start) sum = 0; else { while(1) { sum = sum + *(arg+i); ++i; if(i>end) break; } } return (sum); }
927 :
2/2 :2005/07/17(日) 01:09:14
void Cholesky(double *A, double *L, int n){ for(int i=0; i<n; i++) { *(L+i*n+i) = sqrt(*(A+i*n+i) - sum_element(A,0,i-2)); } } void main(){ int n = 4*4; double si[16]; ifstream fin ("PGAmatrix.dat"); for(int i=0; i<n; i++) fin >> si[i]; fin.close(); double *SI = si; double *L = new double[n]; Cholesky(SI, L, n); } 外部から読み込んだマトリックスをコレスキー分解を作ろうとしている最初の段階なんですが、 コンパイルは通るものの、-6.27744e+066という数字が出力されてしまいます。 恐らくポインタの扱いに間違いがあると思うのですが、ご指導お願いします。
>>927 SI, L には n 個しか要素が無いから i*n+i 個目の要素は
i > 0 のときにに存在しない要素になる。
BCC5.5でwindowsプログラムを作りたいのですが、どの様にコンパイル又はコード追加をすれば良いのでしょうか。 *cfgの内容はデフォルトのまんまです。
何行も定義しなければならないようですね。 SDKに関して勉強してきます。
932 :
デフォルトの名無しさん :2005/07/17(日) 01:58:26
>>928 ポインタは問題ないのでしょうか?
家に帰ってきちゃったので、明日学校で試して見ます。
ありがとうございます。
933 :
デフォルトの名無しさん :2005/07/17(日) 02:31:28
double random_range(double lowest_number, double highest_number) { if(lowest_number > highest_number){ swap(lowest_number, highest_number); } srand((unsigned)time(NULL)); double range = highest_number - lowest_number + 1.0; double rn = lowest_number + range * (double) rand()/RAND_MAX; return rn; } double rnorm(double mean, double stdv){ double r1=random_range(0.0,1.0); double r2=random_range(0.0,1.0); double rn = sqrt((-2.0*log(r1)))*sin(2*3.141593)*r2; return rn; } void main(){ int n =10; for(int i=0; i<n; ++i) { double rn=rnorm(0.0,1.0); cout << rn << endl; } } 一様乱数を標準正規乱数に変換して指定された数だけ出力するようにしたいのですが、 同じ乱数が出力されてしまいます。 異なる乱数を指定した数だけ出力する方法を教えてください。
934 :
933 :2005/07/17(日) 02:32:19
ヘッダファイルを付け忘れてました。 #include<iostream> #include <cstdlib> #include <algorithm> #include <ctime> #include <iomanip> #include <vector> #include<math.h> using namespace std;
>>933 見るからに1秒以内で終わる(time(NULL)の値が変化しない)処理の中で
毎回srandしてたらそりゃ同じ結果しか出んだろ
>>929 とりあえずコンパイル時にソースファイルに-Wを指定するとWinMainから始まるプログラムとしてリンクされる。
>>919 です。レスと
>>922 のURLで間違いが理解できました。
配列の名前だって名前空間使ってるんだから、変数みたいに代入できるんだろうと思ってました。
(できれば便利なのにな...)
>>938 > (できれば便利なのにな...)
そうか?
malloc/freeは遅いって聞いたんだけど、静的な配列を自動的に確保/解放するのより遅いんですか? あと、確保/解放するメモリの量は速度に関係しますか?
>>939 でも配列から同じ要素数の配列への代入はできてもいいんじゃないか?
できるようになれば一貫性の向上につながると思う。
>>940 初心者は意識しなくて構いません。
#つーか、ちゃんと理解できていれば遅いかどうか嫌でも判るわけで。
>>941 memcpyかmemmoveで我慢汁。
sizeofで配列全体のサイズがわからなかったら糞言語だったんだろうがな。
もしくは C++ なら vector 使うって話だな。
>>942 mallocはヒープから取ってくる、普通の配列は自動変数と同じようにスタック上に確保する、という理解なのですが。
ただ、ヒープとスタックどちらが速いのか、また、ヒープ上での確保速度は大きさに依存するのかがわからないんです。
スタックとヒープの機能を提供するのがそれぞれ何かを考えれば 自ずと答えがわかるはずなんだがなぁ
947 :
926 :2005/07/17(日) 10:32:07
>>928 すいません。解決できてません。
もう少し、アドバイスをお願いします。
>>938 配列名は配列の先頭を指すポインタ型のリテラルと理解するとわかりやすいと思う。
チェックボックスのような物を作りたくて 以下のように書いていたのですが、文字列に文字列を代入することが出来ないようで困っています。 何か代用方法はありませんでしょうか? char a[]="A"; char b[]="B"; char c[]="C"; char y[]="○"; char x; scanf("%s",x); switch(x){ case 'A': a[]=y; break; }
>>947 配列はその要素数を超えてアクセスできない。
int a[1];
a[0] = 1; // ok
a[1] = 1; // ng
>>949 strcpy
っていうか、糞コードだなぁ。
>>951 どーいうときに使うのか分かんなくて読み飛ばしてたところに思いっきり書かれてました。
早い返答ありがとうございます。
クソなのは昨日から勉強始めたばかりなので目瞑っておいてください…。
>>945 malloc()の速度は基本的には実装依存なので、ライブラリのソースを見
るか計ってみないとわからない。
でも、速度が大きさに依存する実装方法はちょっと思い浮かばない。ヒー
プのフラグメントっぷりに依存することは多いかも。
>>949 scanf("%s",x); //間違い。xはポインターじゃない。
scanf("%c", &x);
もしxを文字型配列にするんならscanfじゃなくてfgetsにしたほうがいい。
955 :
952 :2005/07/17(日) 14:05:20
>>954 ご飯食べてさぁ続き、と思ったら更に質問するようなことが起きたのですが、
おもいっきしその解答が先出しされててびっくりしました。
本当にありがとうございまっす。
956 :
デフォルトの名無しさん :2005/07/17(日) 14:08:42
>>927 なんでdouble *SI = si;なんて冗長な事してるの?
バグとは関係ないけど見辛いから質問するときは止めとけ。
あと、*Lも
957 :
デフォルトの名無しさん :2005/07/17(日) 14:11:47
g++(gcc) 3.3.3 を使っているのですが、標準で使える class の一覧って どこかにあるのでしょうか?ヘッダファイル(?)をあさるしかないのでしょうか? 例えばファイルの ctime が知りたいと思ったときどのような手順で調べるのが 普通なのでしょうか? google で検索しようとしてキーワードに標準と入れると STLの説明ばかり ひっかかってしまいます。タコで申し訳ありません。
公式サイト マニュアル 書籍 ヘッダーファイル
自分でも驚いているのですが・・・ float x; x = 1/4; printf("%f\n",x); わ、割り算が出来ません...orz
>>959 割り算はできてる。int / int で切り捨てられて 0 になっている
>>960 は 80点
x = 1.0f / 4.0f;
963 :
961 :2005/07/17(日) 15:49:39
>>962 俺に聞かないでくれ
x が float型だからそうしたんだよ
(まぁ printf に渡されるのは double になっちまうけどな)
x が float型だったらfで計算しなくちゃならんのか?それが100点?
965 :
961 :2005/07/17(日) 15:59:09
>>964 規格を額面通り受け取って
コンパイラによる最適化を考えなければ
よりよいコードだと思ったのだが。
何か問題でも?具体的に頼む
なんか自信なくなってきた
>>965 まずはあなたが何故そう書いたのか説明してくれよ
>>965 「よりよいコード」とか考えるんだったら x を double にするのが正解だろ。
それは流石に965に言うことじゃないと思うが
969 :
961 :2005/07/17(日) 16:31:21
>>966 ゴメソ。じゃ説明する
>>960 のコードは次のコードと同じようなことをしている
int i = 1L + 4L;
わざわざ大きい型を使っている
最終的に小さい型へ型変換される
>>967 禿同
低レベルな質問、度々申し訳ございません。 x=a+b+c; while(x>3) { printf("%d",&a); a++; } このループがエンドレスなのは何故でしょうか…。
あああ、書いたあとに自己解決。 と思ってx<3にしたら今度は何も表示されないように…。
floatよりもdoubleが数倍速いってマジなのかね。 なんか年寄りの昔話にしか思えないんだけど。最近のCPUでも成り立つ話なのか・・・。
>>973 自分で設定した条件式すらも理解できんのか?
前判定・後判定って知ってるか?
for文知ってるか?do while文知ってるか?
まだまだアドレスやらポインタやらは早いんじゃないかな?
>>976 コンパイラにマシン語吐き出させたら分かるんじゃない?
>>977 えーと、昨日始めたばかりなので、
アドレスやらポイントやらは何言われてるのかよー分かりませんが、
先に式書いておいてもwhileの中では反映されないってことに気付きました。
これが前判定後判定ってことですよね?
前判定、後判定なんて関係ないだろこの場合は
>>978 ループの中でxが更新されない限り、一度成り立った条件は崩れないだろ。
(他のタスクでうんちゃらかんちゃらは分かりにくくなるので省略)
だからループ抜けなかったり、入らなかったりするのは当然。
>>977 マシン語読めないんでorz
>>979 おお、コンパイラの話なのですか。
この記事は恐らくgccだと思うので、VCなら関係ないのかな・・。
なんでやねん
>>978 printf("%d",&a);
&aは変数aのアドレス
985 :
957 :2005/07/17(日) 17:23:12
>>984 あああ、scanf("%d",&a)とかと勘違いしてましたー。
アドレスとやらはちょこっと教科書読み進めてみたら出てきましたけど、
良く分からないので取り合えず放置しときます。
あんまり低レベルでグダグダ質問しても失礼なのでこの辺りで自習に戻ります。
ありがとうございました。
>>971 彼が何が分からないのか今分かった。
一度 x=a+b+c という等式を教えたら、その後は自動的に計算し
てくれると思ってるのか。
"="はその時点での右辺の計算値を左辺の変数に代入するとい
う意味。
下記だとaしか更新されない。ループの中でxに再代入しない限り
ループに入る前の値を保持する。
x=a+b;
while (x<3) {
a = a+1;
}
>>987 何の前提もなく
> C言語の浮動小数点数には、float型とdouble型がありますが、この説明からは、
> float型には何のメリットも無いようでしょう。実際、無いのです。
ならば、この文章は間違いだな。
>>987 この部分だけ切り取って読むと、思い込みの激しい筆者に見えるな。
C言語の総論として書いているのをみると、この作者にとってはWindowsやLinux
上でのアプリ開発のためだけに、C言語は存在するのかなぁと、見えてしまう。
色々なCPUのコンパイラは昔々の話ではなく今でも立派な現役なのに。
992 :
957 :2005/07/17(日) 18:32:55
まあfloat型がいいかdouble型がいいかはコンパイラとCPU両方に依存するだろうな。 FPUの実装にもよるし、コンパイラがどう最適化するかにもよるし。 特にコンパイラの最適化に関しては、最近はSSEのスカラ演算レベルなら 自動でやってくれるから、全部float型の方がいいかもしれないしね。
>>961 の、floatじゃないと80点だ、という話からこんな事になっただけだべ
次スレまだー?
VC++2003で面白い結果になった。 float型の変数に例の結果を代入するのを書いたんだが、 1.0/4.0も1.0f/4.0fも即値でコードに3E800000が埋め込まれて movで代入するだけになってる。
最適化されちまってねえか
むしろdebugビルドでそうなったんだ。 だれかgccとbccでチェック頼む。
定数式がコンパイル時に評価されるのは最適化以前の問題だと思っていたが…
結論、何か理由がない限りfloatよりもdoubleを使おう。 同じように、1.0f / 4.0fとしないで 1/4.0で充分だろう。
千昌夫
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。