【初心者歓迎】C/C++室 Ver.49【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/02/20(水) 12:33:41ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1202141921/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0005デフォルトの名無しさん
2008/02/20(水) 12:57:150006デフォルトの名無しさん
2008/02/20(水) 13:08:36ローカルスコープなら、まあほぼスタック
0007デフォルトの名無しさん
2008/02/20(水) 13:09:40なるほど・・・スコープを抜けたら破棄されるわけか
ああ、それでnewにはdeleteが必要なのかなるほどー
すごい納得ありがとうございいます
0008デフォルトの名無しさん
2008/02/20(水) 13:12:42cstdioのsystem関数を使い、内部でbccを呼び出して
Cのソースコードをコンパイルするプログラムをつくったのですが、
コマンドラインからだとコンパイルが通るCソースコードが、
このプログラムを使ってコンパイルするとエラーが発生して通りません。
プログラムの一部です
--------------------------------------
string Command = "";
//略
if(system(Command.c_str()) == -1){
cout << "Error" << endl;
}
--------------------------------------
ここで、コンパイルが通るはずの"test.c"のようなファイルを作り、
Command = "bcc32 test.c"として実行すると、
「Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)」
というエラーが発生します。
解決策をお願いします。
ちなみにこのプログラムはVisualC++2005Expressで作成しています。
0009デフォルトの名無しさん
2008/02/20(水) 13:18:52コマンドプロンプト上で
bcc32 test.c
は成功する?
もし、失敗するなら bcc32.cfg または ilink32.cfg の設定ができていない可能性あり
どうすれば設定すればいいかは検索すればすぐ分かるはず
0010デフォルトの名無しさん
2008/02/20(水) 13:20:29main関数が無いって言ってるように見える・・・
00119
2008/02/20(水) 13:20:510012デフォルトの名無しさん
2008/02/20(水) 13:54:43コマンドラインで bcc32 test.c は成功します。
あと、別に、
#include<cstdio>
void main(){
system("bcc32 test.c");
}
だけを書いたプログラムを実行したところ今度はtest.cのコンパイルが通りました。
0013デフォルトの名無しさん
2008/02/20(水) 13:58:11プログラムのカレントディレクトリとtest.cのパスの関係はどうなってますか。
0014デフォルトの名無しさん
2008/02/20(水) 14:22:20debug\bfc.exe(作ったプログラム)
debug\system_test.exe(>>12のプログラム)
debug\test.c
となってます
0015デフォルトの名無しさん
2008/02/20(水) 14:38:25system 関数を呼び出した時点では
test.c への書き込みが完了していないんじゃない?
コマンドの bcc32 の部分を type に置き換えて実行してみて
何も表示されないようなら system 関数の前にストリームをフラッシュするかクローズする
0016デフォルトの名無しさん
2008/02/20(水) 14:46:20ありがとうございました。解決しました。
0017デフォルトの名無しさん
2008/02/20(水) 19:08:43キーボードの「ろ」のところにある記号は「�U」で合ってますか?
半角じゃないので違うような気がするのですが
初歩的な質問ですみません よろしくお願いします
0018デフォルトの名無しさん
2008/02/20(水) 19:10:280019デフォルトの名無しさん
2008/02/20(水) 19:18:120021デフォルトの名無しさん
2008/02/20(水) 19:27:43shift+\ でどう?
0022デフォルトの名無しさん
2008/02/20(水) 19:28:030023デフォルトの名無しさん
2008/02/20(水) 19:28:56CFileDialogから取得したパスをfopenのrbモードで開く、という認識であっているのでしょうか
使用しているエディタはVS2005です。よろしくお願いします。
0025デフォルトの名無しさん
2008/02/20(水) 19:35:34もっと適切な場所で聞けって言ってるんだろ
0026デフォルトの名無しさん
2008/02/20(水) 19:35:55>>22の
”おまえに切れられる筋合いは無い”
という心の叫が聞こえる。
0027デフォルトの名無しさん
2008/02/20(水) 19:36:53聞ける友達いねーのかよwww
0028デフォルトの名無しさん
2008/02/20(水) 19:37:23CFileDialogってMFCか?
だったら同じMFCのCFileを使うのが筋なんじゃないかな
fopenでもいいけどさ
0030デフォルトの名無しさん
2008/02/20(水) 19:48:51すみません、MFCアプリケーションでの作成です。
プログラム初めてなものでただただ関数調べたもので…
基本的な事がなってないのでもう少し自分で調べてみます
アドバイスありがとうございました。
0031デフォルトの名無しさん
2008/02/20(水) 20:09:58C/C++とは関係ない質問等には答えるなよ。
馬鹿が付け上がります。
0032デフォルトの名無しさん
2008/02/20(水) 20:32:52キモス とっとと帰れ
0033デフォルトの名無しさん
2008/02/20(水) 21:03:30俺は今度から、キモイのが来たら嘘を教えることにするよ。
0034デフォルトの名無しさん
2008/02/20(水) 21:33:17まあ、おちつけ。
0035デフォルトの名無しさん
2008/02/20(水) 22:37:06大抵自分が落ち着いてない罠
0036デフォルトの名無しさん
2008/02/20(水) 22:40:12(表現おかしいかもしれないです)
int *ptr, *p1, *p2, *p3, val = 10;
ptr = p1;
*ptr = p2;
**ptr = p3;
***ptr = &val;
printf("%d", ****ptr);
こんな具合のことなんですがこれじゃだめみたいですorz
意味はないんですが、試しにやってみたいというだけです
0037デフォルトの名無しさん
2008/02/20(水) 22:41:53int *p1 = &x;
int **p2 = &p1;
int ***p3 = &p2;
int ****ptr = &p3;
printf("%d\n", ****ptr);
0038デフォルトの名無しさん
2008/02/20(水) 22:43:01int*型やint**型はまた別のものなんですね、再確認させられました
ありがとうございます
0039デフォルトの名無しさん
2008/02/20(水) 23:01:01Vector a( 0,0 );
Vector b = Vector( 0,0 );
今まで大差ないと思ってたんだけど、bの書き方って馬鹿にされるかな?
0040デフォルトの名無しさん
2008/02/20(水) 23:03:58たとえ最適化でコピーコンストラクタの呼び出しが省略されるとしても。
0041デフォルトの名無しさん
2008/02/20(水) 23:13:20不便すぎるな…
ありがとう
0042デフォルトの名無しさん
2008/02/20(水) 23:23:08他では大した差は無いけど。
0043デフォルトの名無しさん
2008/02/21(木) 00:31:330044デフォルトの名無しさん
2008/02/21(木) 00:34:25デストラクタなのかコンストラクタなのかそれが問題だwww
0045デフォルトの名無しさん
2008/02/21(木) 00:35:18大問題
0046デフォルトの名無しさん
2008/02/21(木) 00:35:43placement new/delete 使え
0047デフォルトの名無しさん
2008/02/21(木) 00:36:560048デフォルトの名無しさん
2008/02/21(木) 00:37:08デストラクタです><
0049デフォルトの名無しさん
2008/02/21(木) 00:39:040050デフォルトの名無しさん
2008/02/21(木) 00:43:370051デフォルトの名無しさん
2008/02/21(木) 00:44:450052デフォルトの名無しさん
2008/02/21(木) 00:46:50newをオーバーロードしてmallocで実装ということでしょうか?
0053デフォルトの名無しさん
2008/02/21(木) 00:49:02new/delete
new[]/delete[]
malloc/free
対応関係を間違えるな。
0054デフォルトの名無しさん
2008/02/21(木) 00:51:01T* p = static_cast<T*>(::operator new(sizeof (T))); // 領域のみ確保
new (p) T(); // コンストラクタを呼ぶ(placement new)
p->~T(); // デストラクタを呼ぶ
::operator delete(p, p); // placement delete(省略可)
::operator delete(p); // 領域を解放
0055デフォルトの名無しさん
2008/02/21(木) 00:51:39#include <cstdlib>
class c {};
void* p = std::malloc(sizeof (c));
c* obj = new(p) c;
//...
obj->~c();
//...
std::free(obj);
malloc/freeでなくても、operator new/delete関数とかでもいいだろうけどね。
0056デフォルトの名無しさん
2008/02/21(木) 00:52:20違う。配置構文newだ。
newは大抵mallocをラッピングしてて効率は悪い。
0057sage
2008/02/21(木) 03:23:25質問させて頂きたいのですが、静的リンクされたELFバイナリにおいて、
リンクされているライブラリのバージョンを
そのバイナリから知る方法はあるのでしょうか?
0058デフォルトの名無しさん
2008/02/21(木) 03:24:440059デフォルトの名無しさん
2008/02/21(木) 07:51:13教えて欲しいんだけどスレ違い?
0060デフォルトの名無しさん
2008/02/21(木) 08:01:08最近の小学校は閏年も教えんのか?
0061デフォルトの名無しさん
2008/02/21(木) 08:05:520062デフォルトの名無しさん
2008/02/21(木) 09:44:160063デフォルトの名無しさん
2008/02/21(木) 10:04:470064デフォルトの名無しさん
2008/02/21(木) 10:07:28unix系のOS使えるなら、 cal 9 1752 でカレンダー出るな。
0065デフォルトの名無しさん
2008/02/21(木) 13:05:210066デフォルトの名無しさん
2008/02/21(木) 13:11:47public:
int i;
int j;
double k;
};
int main()
{
ttt t = {1,2,3.001};
structやclassがこういう風に初期化できるのを最近知ったのですが、これって普通に
使う書き方でしょうか?結構C++長いこと使ってきたけど、知らなかったよ。
0067デフォルトの名無しさん
2008/02/21(木) 13:22:04PODな構造体なら hoge h = {0}; とか、
Win32APIで構造体のサイズを入れる必要がある物は WNDCLASSEX wc = {sizeof(WNDCLASSEX)}; とかやるけど・・・
俺も疑問なんだけど、 hoge h = {0}; って感じで初期化って普通にやるの?
俺より何年もCやってる先輩が言うには、「そんなんで0フィルされるのか?memset使えよ」って言われたんだが。
0068デフォルトの名無しさん
2008/02/21(木) 13:22:380069デフォルトの名無しさん
2008/02/21(木) 13:44:25「0フィル」が「全ビットを 0x00 で埋める」って意味なら memset() で正解。
ただし「全メンバを 0 で初期化する」なら memset() は間違いで {0} で初期化するのが正解。
この2つはメンバにポインタや浮動小数点数が混ざってると意味が違うので、動作が
異なる可能性がある。 C++ でメンバに POD 以外が混ざってる場合には、 memset() での
「0フィル」は未定義動作につながる。
0070デフォルトの名無しさん
2008/02/21(木) 13:47:26>>39
の使い方が一般の気がする。
コピコン便利だし
0071デフォルトの名無しさん
2008/02/21(木) 13:49:23ポインタや浮動小数点数などでは、
Cのソース上では0と表現される値でも、内部では0以外のビットパターンを持つことがある。
そんな場合にも対応できるので、変数初期化のほうが移植性が高いとされる。
0072デフォルトの名無しさん
2008/02/21(木) 13:52:19using namespace std;
template <typename T>
void printchar(T c){
cout << c << endl;
}
int main(void){
cout << "print int" << endl;
printchar(10);
cout << "print double" << endl;
printchar(32e-2);
cout << "print char" << endl;
printchar('A');
cout << "print char*" << endl;
printchar("test char");
cout << "print void" << endl;
// printchar();
return 0;
}
コメントアウトした行でコンパイルエラーなのですが、
引数がvoidだと何もしないっていう処理はどう書けばいいのでしょうか。
0073デフォルトの名無しさん
2008/02/21(木) 13:53:37}
0074デフォルトの名無しさん
2008/02/21(木) 13:54:36そういえば、Win32APIとかの解説ページを見ると、memsetで構造体を初期化してる人もいるよね(メンバにポインタがあるにもかかわらず
Windowsでしか動かない移植性がないプログラムだから問題ないんか。
0075デフォルトの名無しさん
2008/02/21(木) 13:55:35やっぱりそうするしかないですか。
ありがとうございます。
0076デフォルトの名無しさん
2008/02/21(木) 14:50:44#include <>
なんかの"#"ってどんな意味があるんですが?
cgiみたいに、特別な物でそうゆう仕様という認識で良いのでしょうか?
初めて触った時はコメントアウトじゃんと思ったりもしましたけど。
0077デフォルトの名無しさん
2008/02/21(木) 14:53:01template<typename T>void printchar(T c = 0) {if (c) cout << c << endl;}
ではどう? 使うときにはprintchar<char>()のように型を指定する必要があるけど。
0078デフォルトの名無しさん
2008/02/21(木) 14:54:35プリプロセッサに対する指令
0079デフォルトの名無しさん
2008/02/21(木) 15:01:13>cgiみたいに、特別な物でそうゆう仕様という
ややあたり、起源はいっしょ
C++のコンパイルの前に通すテキスト加工スクリプトの様なもの。
もはや意識している人いないれどね。
起源はそうでも、すでにC++の一部機能です。
0080デフォルトの名無しさん
2008/02/21(木) 15:07:15がマンドクセにみえた俺は病気
0081デフォルトの名無しさん
2008/02/21(木) 15:11:120082デフォルトの名無しさん
2008/02/21(木) 15:20:40すでに出てるし、そして当人は二つ書くことになにかご不満のご様子
0083デフォルトの名無しさん
2008/02/21(木) 15:29:36代表的なものにWinAPIとMFCがあると調べてわかったのですが、どちらも難解そうな上
ニュアンス的なものですが、主流ではないような印象を受けました
C/C++で作ったDLLをC#で使う?ような方法にも辿りついたのですが
それだと使う側に.NETが必要になるようなので、それなら最初からC#を使った方が…と思います
どういった方法がベターなのでしょうか?
0084デフォルトの名無しさん
2008/02/21(木) 15:38:12↓のページから好みに合ったものを選べ
http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E3%83%BB%E3%83%84%E3%83%BC%E3%83%AB%E3%82%AD%E3%83%83%E3%83%88
0085デフォルトの名無しさん
2008/02/21(木) 15:44:15C++はGUI作るツールに満足なものがないから、GUIに向いていない環境だと俺は思っている。
もっとましな状況になってほしい。
いろんなものが乱立していて決定打がないんだけど、
Windowsでは、Windows APIが最下層で、ほかがそのラッパーになっているので、
自然、Windows APIが共通語彙になっているという面はある。
だから、今何を使うにしても、いつかは素のWindows APIプログラミングに触れていてほしいなと思う。
0086デフォルトの名無しさん
2008/02/21(木) 15:46:41例)
12345→54321
12000→21
int reverseDigit(int input)
{
int a = input;
int tmp[12];
int i = 0;
while (a > 0) {
tmp[i] = a % 10;
a = a / 10;
i++;
}
int res = 0;
int n = 1;
for (int j = i - 1; j >= 0; j--) {
res = res + tmp[j] * n;
n = n * 10;
}
return res;
}
0087デフォルトの名無しさん
2008/02/21(木) 16:27:35なるほど、見た感じWinAPIに一番無難な印象を受けてしまいました
Windowsがこの先消えうせることはなさそうですしとりあえずWinAPI触ってみます、ありがとうございました
0088デフォルトの名無しさん
2008/02/21(木) 17:44:38試して問題ないならいいんじゃない?
負数で破綻するけど。
それと、一旦各桁に分割した結果を配列で保存するなら、
sprintf()で文字列にしてから逆順にして、atoi()で戻してもいいかも知れない。
0089デフォルトの名無しさん
2008/02/21(木) 17:48:39そのままinputを使えばいい
知っててわざとやってるなら別にいいが
0090デフォルトの名無しさん
2008/02/21(木) 17:57:34サーバからクライアントへsendを使ってメッセージを送信した際、
メッセージの送信完了を伝えるには、ソケットをclose(あるいはshutdown)
する以外に方法はないですか?
つまり、ソケットを閉じずに、コネクションを維持したまま、
送信完了を伝えたいのですが、できませんか?
0091デフォルトの名無しさん
2008/02/21(木) 17:57:59意味ある、というか引数いじらないのは鉄則だよ。
一時変数ケチってinputを加工するのは無駄なバグの元。
0092デフォルトの名無しさん
2008/02/21(木) 18:18:34HTTPであれば、レスポンスにContent-Lengthを入れれば、クライアント
がそのサイズの受信でデータ終了だと思ってくれる。
0094デフォルトの名無しさん
2008/02/21(木) 20:25:25C#使った方がいいと思うってもう遅いけど
0095デフォルトの名無しさん
2008/02/21(木) 21:40:29デルファイ言語の環境のまま、言語だけC++
0096デフォルトの名無しさん
2008/02/21(木) 21:41:130097デフォルトの名無しさん
2008/02/21(木) 21:41:440098デフォルトの名無しさん
2008/02/21(木) 21:45:500099デフォルトの名無しさん
2008/02/21(木) 21:48:34環境を書けよ。でないと答えようが無い
0100デフォルトの名無しさん
2008/02/21(木) 21:50:15パソコンから取り外せば全容量使えるよ。
0101デフォルトの名無しさん
2008/02/21(木) 21:50:590102デフォルトの名無しさん
2008/02/21(木) 21:53:400103デフォルトの名無しさん
2008/02/21(木) 21:54:02毒餃子を食わす国の人ですか?
0104デフォルトの名無しさん
2008/02/21(木) 21:54:36GlobalMemoryStatus で調べろ
■ このスレッドは過去ログ倉庫に格納されています