トップページ⇒tech
1001コメント301KB

【初心者歓迎】C/C++室 Ver.49【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/02/20(水) 12:33:41
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※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
00021だけど2008/02/20(水) 12:36:25
> 【アップローダー】(質問が長い時はココ使うと便利)
> http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
このリンクを確認してみたけど、ダメリンク?
だれか使っている人いる?
0003デフォルトの名無しさん2008/02/20(水) 12:47:53
>>2
一度だけ使った事があるよ
複数ファイルに分けないと説明できない事があったので

あと、スレ立て乙
0004デフォルトの名無しさん2008/02/20(水) 12:49:31
newとか使ってきてて今さら思ったんですが

int hoge;
hoge = 1;
や
int hoge = 1;
なんかはどっかにint1個分の領域が確保されているわけですよね?
0005デフォルトの名無しさん2008/02/20(水) 12:57:15
あげとくよ
0006デフォルトの名無しさん2008/02/20(水) 13:08:36
>>4
ローカルスコープなら、まあほぼスタック
0007デフォルトの名無しさん2008/02/20(水) 13:09:40
>>6
なるほど・・・スコープを抜けたら破棄されるわけか
ああ、それでnewにはdeleteが必要なのかなるほどー
すごい納得ありがとうございいます
0008デフォルトの名無しさん2008/02/20(水) 13:12:42
ある言語のソースコードをCのソースコードに変換した後、
cstdioの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
>>8
コマンドプロンプト上で
bcc32 test.c
は成功する?

もし、失敗するなら bcc32.cfg または ilink32.cfg の設定ができていない可能性あり
どうすれば設定すればいいかは検索すればすぐ分かるはず
0010デフォルトの名無しさん2008/02/20(水) 13:20:29
>>「Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)」

main関数が無いって言ってるように見える・・・
001192008/02/20(水) 13:20:51
追記:エントリポイントを WinMain にするならコマンドラインオプション -W を追加しないといけない
0012デフォルトの名無しさん2008/02/20(水) 13:54:43
>>9
コマンドラインで bcc32 test.c は成功します。

あと、別に、
#include<cstdio>
void main(){
system("bcc32 test.c");
}
だけを書いたプログラムを実行したところ今度はtest.cのコンパイルが通りました。
0013デフォルトの名無しさん2008/02/20(水) 13:58:11
>>8
プログラムのカレントディレクトリとtest.cのパスの関係はどうなってますか。
0014デフォルトの名無しさん2008/02/20(水) 14:22:20
〜\debug がカレントディレクトリで
debug\bfc.exe(作ったプログラム)
debug\system_test.exe(>>12のプログラム)
debug\test.c
となってます
0015デフォルトの名無しさん2008/02/20(水) 14:38:25
>>14
system 関数を呼び出した時点では
test.c への書き込みが完了していないんじゃない?

コマンドの bcc32 の部分を type に置き換えて実行してみて
何も表示されないようなら system 関数の前にストリームをフラッシュするかクローズする
0016デフォルトの名無しさん2008/02/20(水) 14:46:20
>>15
ありがとうございました。解決しました。
0017デフォルトの名無しさん2008/02/20(水) 19:08:43
質問させてください

キーボードの「ろ」のところにある記号は「�U」で合ってますか?
半角じゃないので違うような気がするのですが

初歩的な質問ですみません よろしくお願いします
0018デフォルトの名無しさん2008/02/20(水) 19:10:28
キーボードにも色々種類があってだな
0019デフォルトの名無しさん2008/02/20(水) 19:18:12
C/C++と何の関係もない件について
0020デフォルトの名無しさん2008/02/20(水) 19:25:31
>>18 そうなんですか すいません
>>19 今やってるプログラムにそれを入れなきゃなんです
0021デフォルトの名無しさん2008/02/20(水) 19:27:43
>>20
shift+\ でどう?
0022デフォルトの名無しさん2008/02/20(水) 19:28:03
お前の都合は知らないけどさ、こういう分別は義務教育中に分かっておかないと将来困るよ
0023デフォルトの名無しさん2008/02/20(水) 19:28:56
C++でダイアログからファイルを選択し、ファイルをバイナリで開きたいのですが
CFileDialogから取得したパスをfopenのrbモードで開く、という認識であっているのでしょうか
使用しているエディタはVS2005です。よろしくお願いします。
0024デフォルトの名無しさん2008/02/20(水) 19:34:12
>>21 出ました ありがとうございます
>>22 あなたに将来を気にして頂かなくても結構ですよ?
0025デフォルトの名無しさん2008/02/20(水) 19:35:34
>>24
もっと適切な場所で聞けって言ってるんだろ
0026デフォルトの名無しさん2008/02/20(水) 19:35:55
>>24
>>22の
”おまえに切れられる筋合いは無い”
という心の叫が聞こえる。
0027デフォルトの名無しさん2008/02/20(水) 19:36:53
>>24
聞ける友達いねーのかよwww
0028デフォルトの名無しさん2008/02/20(水) 19:37:23
>>23
CFileDialogってMFCか?
だったら同じMFCのCFileを使うのが筋なんじゃないかな
fopenでもいいけどさ
0029デフォルトの名無しさん2008/02/20(水) 19:46:45
>>26 切れたつもりはないんですが
>>27 自分、学生じゃないんで
0030デフォルトの名無しさん2008/02/20(水) 19:48:51
>>28
すみません、MFCアプリケーションでの作成です。
プログラム初めてなものでただただ関数調べたもので…
基本的な事がなってないのでもう少し自分で調べてみます
アドバイスありがとうございました。
0031デフォルトの名無しさん2008/02/20(水) 20:09:58
初心者歓迎・環境依存OKとはあるが、
C/C++とは関係ない質問等には答えるなよ。
馬鹿が付け上がります。
0032デフォルトの名無しさん2008/02/20(水) 20:32:52
>>24
キモス とっとと帰れ
0033デフォルトの名無しさん2008/02/20(水) 21:03:30
>>31
俺は今度から、キモイのが来たら嘘を教えることにするよ。
0034デフォルトの名無しさん2008/02/20(水) 21:33:17
>>33
まあ、おちつけ。
0035デフォルトの名無しさん2008/02/20(水) 22:37:06
変なタイミングで人をなだめる奴は
大抵自分が落ち着いてない罠
0036デフォルトの名無しさん2008/02/20(水) 22:40:12
****ptrとかってものを使ってみたいんだけどどうすればいんでしょうか?
(表現おかしいかもしれないです)

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:53
int val = 10;
int *p1 = &x;
int **p2 = &p1;
int ***p3 = &p2;
int ****ptr = &p3;
printf("%d\n", ****ptr);
0038デフォルトの名無しさん2008/02/20(水) 22:43:01
あ、そっか
int*型やint**型はまた別のものなんですね、再確認させられました
ありがとうございます
0039デフォルトの名無しさん2008/02/20(水) 23:01:01
Vectorクラス{ float x,y }があるとして、

Vector a( 0,0 );
Vector b = Vector( 0,0 );

今まで大差ないと思ってたんだけど、bの書き方って馬鹿にされるかな?
0040デフォルトの名無しさん2008/02/20(水) 23:03:58
大差はないが、Vector のコピーコンストラクタが public でない場合、下はコンパイルエラーになる。
たとえ最適化でコピーコンストラクタの呼び出しが省略されるとしても。
0041デフォルトの名無しさん2008/02/20(水) 23:13:20
試しにやってみたらたしかにエラーに。
不便すぎるな…

ありがとう
0042デフォルトの名無しさん2008/02/20(水) 23:23:08
noncopyable の時に困るね。
他では大した差は無いけど。
0043デフォルトの名無しさん2008/02/21(木) 00:31:33
デコンストラクタを解放とは別のタイミングで実行したいのでnewしたものをfreeで解放してますが問題ないでしょうか
0044デフォルトの名無しさん2008/02/21(木) 00:34:25
>>43
デストラクタなのかコンストラクタなのかそれが問題だwww
0045デフォルトの名無しさん2008/02/21(木) 00:35:18
>>43
大問題
0046デフォルトの名無しさん2008/02/21(木) 00:35:43
>>43
placement new/delete 使え
0047デフォルトの名無しさん2008/02/21(木) 00:36:56
freeするならメモリ確保にはmalloc使えということだな。
0048デフォルトの名無しさん2008/02/21(木) 00:37:08
>>44
デストラクタです><
0049デフォルトの名無しさん2008/02/21(木) 00:39:04
デコンストラクタワロタw
0050デフォルトの名無しさん2008/02/21(木) 00:43:37
デコンストラクタ の検索結果 約 1,390 件
0051デフォルトの名無しさん2008/02/21(木) 00:44:45
"デコンストラクタ" の検索結果 約 788 件
0052デフォルトの名無しさん2008/02/21(木) 00:46:50
>>46

newをオーバーロードしてmallocで実装ということでしょうか?
0053デフォルトの名無しさん2008/02/21(木) 00:49:02
>>52
new/delete
new[]/delete[]
malloc/free
対応関係を間違えるな。
0054デフォルトの名無しさん2008/02/21(木) 00:51:01
>>52

T* 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 <new>
#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
>>52
違う。配置構文newだ。
newは大抵mallocをラッピングしてて効率は悪い。
0057sage2008/02/21(木) 03:23:25
言語の使い方ではないのですが、一応処理系の一部ということで
質問させて頂きたいのですが、静的リンクされたELFバイナリにおいて、
リンクされているライブラリのバージョンを
そのバイナリから知る方法はあるのでしょうか?
0058デフォルトの名無しさん2008/02/21(木) 03:24:44
すみません・・sageを記入する欄を間違えました。
0059デフォルトの名無しさん2008/02/21(木) 07:51:13
カレンダー作りたいんで、各月何日まであるか年によって違うのでその法則を
教えて欲しいんだけどスレ違い?
0060デフォルトの名無しさん2008/02/21(木) 08:01:08
年によって日数が変わる月は2月だけだろ・・・。
最近の小学校は閏年も教えんのか?
0061デフォルトの名無しさん2008/02/21(木) 08:05:52
ありがとう2月だけなのか。習ったけど忘れてた
0062デフォルトの名無しさん2008/02/21(木) 09:44:16
1752年9月も変わってるな
0063デフォルトの名無しさん2008/02/21(木) 10:04:47
どうやって生きてるのか不思議だな
0064デフォルトの名無しさん2008/02/21(木) 10:07:28
カレンダー作るのに当時生きてるかはあまり関係ないかと。
unix系のOS使えるなら、 cal 9 1752 でカレンダー出るな。
0065デフォルトの名無しさん2008/02/21(木) 13:05:21
1752年9月がイリーガルなのは一部の国だけだけどな。
0066デフォルトの名無しさん2008/02/21(木) 13:11:47
class ttt {
public:
int i;
int j;
double k;
};
int main()
{
ttt t = {1,2,3.001};
structやclassがこういう風に初期化できるのを最近知ったのですが、これって普通に
使う書き方でしょうか?結構C++長いこと使ってきたけど、知らなかったよ。

0067デフォルトの名無しさん2008/02/21(木) 13:22:04
C/C++を勉強し始めて1年の俺的には、クラスならメンバ変数公開しないのでやらない。そこはコンストラクタで。
PODな構造体なら hoge h = {0}; とか、
Win32APIで構造体のサイズを入れる必要がある物は WNDCLASSEX wc = {sizeof(WNDCLASSEX)}; とかやるけど・・・

俺も疑問なんだけど、 hoge h = {0}; って感じで初期化って普通にやるの?
俺より何年もCやってる先輩が言うには、「そんなんで0フィルされるのか?memset使えよ」って言われたんだが。
0068デフォルトの名無しさん2008/02/21(木) 13:22:38
Cを昨日から勉強しましたが、今日でやめます。
0069デフォルトの名無しさん2008/02/21(木) 13:44:25
>>67
「0フィル」が「全ビットを 0x00 で埋める」って意味なら memset() で正解。
ただし「全メンバを 0 で初期化する」なら memset() は間違いで {0} で初期化するのが正解。

この2つはメンバにポインタや浮動小数点数が混ざってると意味が違うので、動作が
異なる可能性がある。 C++ でメンバに POD 以外が混ざってる場合には、 memset() での
「0フィル」は未定義動作につながる。
0070デフォルトの名無しさん2008/02/21(木) 13:47:26
>>66
>>39
の使い方が一般の気がする。
コピコン便利だし
0071デフォルトの名無しさん2008/02/21(木) 13:49:23
>>67
ポインタや浮動小数点数などでは、
Cのソース上では0と表現される値でも、内部では0以外のビットパターンを持つことがある。
そんな場合にも対応できるので、変数初期化のほうが移植性が高いとされる。
0072デフォルトの名無しさん2008/02/21(木) 13:52:19
#include <iostream>

using 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
void printchar(){
}
0074デフォルトの名無しさん2008/02/21(木) 13:54:36
なるほど。
そういえば、Win32APIとかの解説ページを見ると、memsetで構造体を初期化してる人もいるよね(メンバにポインタがあるにもかかわらず
Windowsでしか動かない移植性がないプログラムだから問題ないんか。
0075デフォルトの名無しさん2008/02/21(木) 13:55:35
>73
やっぱりそうするしかないですか。
ありがとうございます。
0076デフォルトの名無しさん2008/02/21(木) 14:50:44
素朴な疑問なんだけど、
#include <>
なんかの"#"ってどんな意味があるんですが?
cgiみたいに、特別な物でそうゆう仕様という認識で良いのでしょうか?
初めて触った時はコメントアウトじゃんと思ったりもしましたけど。
■ このスレッドは過去ログ倉庫に格納されています