【初心者歓迎】C/C++室 Ver.49【環境依存OK】 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
08/02/20 12:33:41
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
スレリンク(tech板)
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

2:1だけど
08/02/20 12:36:25
> 【アップローダー】(質問が長い時はココ使うと便利)
> URLリンク(kansai2channeler.hp.infoseek.co.jp)
このリンクを確認してみたけど、ダメリンク?
だれか使っている人いる?

3:デフォルトの名無しさん
08/02/20 12:47:53
>>2
一度だけ使った事があるよ
複数ファイルに分けないと説明できない事があったので

あと、スレ立て乙

4:デフォルトの名無しさん
08/02/20 12:49:31
newとか使ってきてて今さら思ったんですが

int hoge;
hoge = 1;

int hoge = 1;
なんかはどっかにint1個分の領域が確保されているわけですよね?


5:デフォルトの名無しさん
08/02/20 12:57:15
あげとくよ

6:デフォルトの名無しさん
08/02/20 13:08:36
>>4
ローカルスコープなら、まあほぼスタック


7:デフォルトの名無しさん
08/02/20 13:09:40
>>6
なるほど・・・スコープを抜けたら破棄されるわけか
ああ、それでnewにはdeleteが必要なのかなるほどー
すごい納得ありがとうございいます

8:デフォルトの名無しさん
08/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で作成しています。

9:デフォルトの名無しさん
08/02/20 13:18:52
>>8
コマンドプロンプト上で
bcc32 test.c
は成功する?

もし、失敗するなら bcc32.cfg または ilink32.cfg の設定ができていない可能性あり
どうすれば設定すればいいかは検索すればすぐ分かるはず

10:デフォルトの名無しさん
08/02/20 13:20:29
>>「Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)」

main関数が無いって言ってるように見える・・・

11:9
08/02/20 13:20:51
追記:エントリポイントを WinMain にするならコマンドラインオプション -W を追加しないといけない

12:デフォルトの名無しさん
08/02/20 13:54:43
>>9
コマンドラインで bcc32 test.c は成功します。

あと、別に、
#include<cstdio>
void main(){
system("bcc32 test.c");
}
だけを書いたプログラムを実行したところ今度はtest.cのコンパイルが通りました。

13:デフォルトの名無しさん
08/02/20 13:58:11
>>8
プログラムのカレントディレクトリとtest.cのパスの関係はどうなってますか。


14:デフォルトの名無しさん
08/02/20 14:22:20
〜\debug がカレントディレクトリで
debug\bfc.exe(作ったプログラム)
debug\system_test.exe(>>12のプログラム)
debug\test.c
となってます


15:デフォルトの名無しさん
08/02/20 14:38:25
>>14
system 関数を呼び出した時点では
test.c への書き込みが完了していないんじゃない?

コマンドの bcc32 の部分を type に置き換えて実行してみて
何も表示されないようなら system 関数の前にストリームをフラッシュするかクローズする

16:デフォルトの名無しさん
08/02/20 14:46:20
>>15
ありがとうございました。解決しました。

17:デフォルトの名無しさん
08/02/20 19:08:43
質問させてください

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

初歩的な質問ですみません よろしくお願いします

18:デフォルトの名無しさん
08/02/20 19:10:28
キーボードにも色々種類があってだな

19:デフォルトの名無しさん
08/02/20 19:18:12
C/C++と何の関係もない件について

20:デフォルトの名無しさん
08/02/20 19:25:31
>>18 そうなんですか すいません
>>19 今やってるプログラムにそれを入れなきゃなんです

21:デフォルトの名無しさん
08/02/20 19:27:43
>>20
shift+\ でどう?

22:デフォルトの名無しさん
08/02/20 19:28:03
お前の都合は知らないけどさ、こういう分別は義務教育中に分かっておかないと将来困るよ

23:デフォルトの名無しさん
08/02/20 19:28:56
C++でダイアログからファイルを選択し、ファイルをバイナリで開きたいのですが
CFileDialogから取得したパスをfopenのrbモードで開く、という認識であっているのでしょうか
使用しているエディタはVS2005です。よろしくお願いします。

24:デフォルトの名無しさん
08/02/20 19:34:12
>>21 出ました ありがとうございます
>>22 あなたに将来を気にして頂かなくても結構ですよ?

25:デフォルトの名無しさん
08/02/20 19:35:34
>>24
もっと適切な場所で聞けって言ってるんだろ

26:デフォルトの名無しさん
08/02/20 19:35:55
>>24
>>22
”おまえに切れられる筋合いは無い”
という心の叫が聞こえる。

27:デフォルトの名無しさん
08/02/20 19:36:53
>>24
聞ける友達いねーのかよwww

28:デフォルトの名無しさん
08/02/20 19:37:23
>>23
CFileDialogってMFCか?
だったら同じMFCのCFileを使うのが筋なんじゃないかな
fopenでもいいけどさ

29:デフォルトの名無しさん
08/02/20 19:46:45
>>26 切れたつもりはないんですが
>>27 自分、学生じゃないんで

30:デフォルトの名無しさん
08/02/20 19:48:51
>>28
すみません、MFCアプリケーションでの作成です。
プログラム初めてなものでただただ関数調べたもので…
基本的な事がなってないのでもう少し自分で調べてみます
アドバイスありがとうございました。

31:デフォルトの名無しさん
08/02/20 20:09:58
初心者歓迎・環境依存OKとはあるが、
C/C++とは関係ない質問等には答えるなよ。
馬鹿が付け上がります。

32:デフォルトの名無しさん
08/02/20 20:32:52
>>24
キモス とっとと帰れ

33:デフォルトの名無しさん
08/02/20 21:03:30
>>31
俺は今度から、キモイのが来たら嘘を教えることにするよ。

34:デフォルトの名無しさん
08/02/20 21:33:17
>>33
まあ、おちつけ。


35:デフォルトの名無しさん
08/02/20 22:37:06
変なタイミングで人をなだめる奴は
大抵自分が落ち着いてない罠

36:デフォルトの名無しさん
08/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
意味はないんですが、試しにやってみたいというだけです

37:デフォルトの名無しさん
08/02/20 22:41:53
int val = 10;
int *p1 = &x;
int **p2 = &p1;
int ***p3 = &p2;
int ****ptr = &p3;
printf("%d\n", ****ptr);

38:デフォルトの名無しさん
08/02/20 22:43:01
あ、そっか
int*型やint**型はまた別のものなんですね、再確認させられました
ありがとうございます

39:デフォルトの名無しさん
08/02/20 23:01:01
Vectorクラス{ float x,y }があるとして、

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

今まで大差ないと思ってたんだけど、bの書き方って馬鹿にされるかな?

40:デフォルトの名無しさん
08/02/20 23:03:58
大差はないが、Vector のコピーコンストラクタが public でない場合、下はコンパイルエラーになる。
たとえ最適化でコピーコンストラクタの呼び出しが省略されるとしても。

41:デフォルトの名無しさん
08/02/20 23:13:20
試しにやってみたらたしかにエラーに。
不便すぎるな…

ありがとう

42:デフォルトの名無しさん
08/02/20 23:23:08
noncopyable の時に困るね。
他では大した差は無いけど。

43:デフォルトの名無しさん
08/02/21 00:31:33
デコンストラクタを解放とは別のタイミングで実行したいのでnewしたものをfreeで解放してますが問題ないでしょうか

44:デフォルトの名無しさん
08/02/21 00:34:25
>>43
デストラクタなのかコンストラクタなのかそれが問題だwww

45:デフォルトの名無しさん
08/02/21 00:35:18
>>43
大問題

46:デフォルトの名無しさん
08/02/21 00:35:43
>>43
placement new/delete 使え

47:デフォルトの名無しさん
08/02/21 00:36:56
freeするならメモリ確保にはmalloc使えということだな。

48:デフォルトの名無しさん
08/02/21 00:37:08
>>44
デストラクタです><

49:デフォルトの名無しさん
08/02/21 00:39:04
デコンストラクタワロタw

50:デフォルトの名無しさん
08/02/21 00:43:37
デコンストラクタ の検索結果 約 1,390 件

51:デフォルトの名無しさん
08/02/21 00:44:45
"デコンストラクタ" の検索結果 約 788 件

52:デフォルトの名無しさん
08/02/21 00:46:50
>>46

newをオーバーロードしてmallocで実装ということでしょうか?

53:デフォルトの名無しさん
08/02/21 00:49:02
>>52
new/delete
new[]/delete[]
malloc/free
対応関係を間違えるな。

54:デフォルトの名無しさん
08/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); // 領域を解放

55:デフォルトの名無しさん
08/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関数とかでもいいだろうけどね。

56:デフォルトの名無しさん
08/02/21 00:52:20
>>52
違う。配置構文newだ。
newは大抵mallocをラッピングしてて効率は悪い。

57:sage
08/02/21 03:23:25
言語の使い方ではないのですが、一応処理系の一部ということで
質問させて頂きたいのですが、静的リンクされたELFバイナリにおいて、
リンクされているライブラリのバージョンを
そのバイナリから知る方法はあるのでしょうか?

58:デフォルトの名無しさん
08/02/21 03:24:44
すみません・・sageを記入する欄を間違えました。

59:デフォルトの名無しさん
08/02/21 07:51:13
カレンダー作りたいんで、各月何日まであるか年によって違うのでその法則を
教えて欲しいんだけどスレ違い?

60:デフォルトの名無しさん
08/02/21 08:01:08
年によって日数が変わる月は2月だけだろ・・・。
最近の小学校は閏年も教えんのか?

61:デフォルトの名無しさん
08/02/21 08:05:52
ありがとう2月だけなのか。習ったけど忘れてた

62:デフォルトの名無しさん
08/02/21 09:44:16
1752年9月も変わってるな

63:デフォルトの名無しさん
08/02/21 10:04:47
どうやって生きてるのか不思議だな

64:デフォルトの名無しさん
08/02/21 10:07:28
カレンダー作るのに当時生きてるかはあまり関係ないかと。
unix系のOS使えるなら、 cal 9 1752 でカレンダー出るな。

65:デフォルトの名無しさん
08/02/21 13:05:21
1752年9月がイリーガルなのは一部の国だけだけどな。

66:デフォルトの名無しさん
08/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++長いこと使ってきたけど、知らなかったよ。



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

俺も疑問なんだけど、 hoge h = {0}; って感じで初期化って普通にやるの?
俺より何年もCやってる先輩が言うには、「そんなんで0フィルされるのか?memset使えよ」って言われたんだが。

68:デフォルトの名無しさん
08/02/21 13:22:38
Cを昨日から勉強しましたが、今日でやめます。

69:デフォルトの名無しさん
08/02/21 13:44:25
>>67
「0フィル」が「全ビットを 0x00 で埋める」って意味なら memset() で正解。
ただし「全メンバを 0 で初期化する」なら memset() は間違いで {0} で初期化するのが正解。

この2つはメンバにポインタや浮動小数点数が混ざってると意味が違うので、動作が
異なる可能性がある。 C++ でメンバに POD 以外が混ざってる場合には、 memset() での
「0フィル」は未定義動作につながる。

70:デフォルトの名無しさん
08/02/21 13:47:26
>>66
>>39
の使い方が一般の気がする。
コピコン便利だし

71:デフォルトの名無しさん
08/02/21 13:49:23
>>67
ポインタや浮動小数点数などでは、
Cのソース上では0と表現される値でも、内部では0以外のビットパターンを持つことがある。
そんな場合にも対応できるので、変数初期化のほうが移植性が高いとされる。

72:デフォルトの名無しさん
08/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だと何もしないっていう処理はどう書けばいいのでしょうか。

73:デフォルトの名無しさん
08/02/21 13:53:37
void printchar(){
}

74:デフォルトの名無しさん
08/02/21 13:54:36
なるほど。
そういえば、Win32APIとかの解説ページを見ると、memsetで構造体を初期化してる人もいるよね(メンバにポインタがあるにもかかわらず
Windowsでしか動かない移植性がないプログラムだから問題ないんか。

75:デフォルトの名無しさん
08/02/21 13:55:35
>73
やっぱりそうするしかないですか。
ありがとうございます。

76:デフォルトの名無しさん
08/02/21 14:50:44
素朴な疑問なんだけど、
#include <>
なんかの"#"ってどんな意味があるんですが?
cgiみたいに、特別な物でそうゆう仕様という認識で良いのでしょうか?
初めて触った時はコメントアウトじゃんと思ったりもしましたけど。

77:デフォルトの名無しさん
08/02/21 14:53:01
>>75
template<typename T>void printchar(T c = 0) {if (c) cout << c << endl;}
ではどう? 使うときにはprintchar<char>()のように型を指定する必要があるけど。

78:デフォルトの名無しさん
08/02/21 14:54:35
>>76
プリプロセッサに対する指令

79:デフォルトの名無しさん
08/02/21 15:01:13
>>76
>cgiみたいに、特別な物でそうゆう仕様という
ややあたり、起源はいっしょ
C++のコンパイルの前に通すテキスト加工スクリプトの様なもの。
もはや意識している人いないれどね。
起源はそうでも、すでにC++の一部機能です。

80:デフォルトの名無しさん
08/02/21 15:07:15
printchar('A');
がマンドクセにみえた俺は病気

81:デフォルトの名無しさん
08/02/21 15:11:12
単純にテンプレートのprintcharとは別にinline void printchar() {}を多重定義するだけではだめなの?

82:デフォルトの名無しさん
08/02/21 15:20:40
>>81
すでに出てるし、そして当人は二つ書くことになにかご不満のご様子

83:デフォルトの名無しさん
08/02/21 15:29:36
C/C++でGUIを実装する方法にはどのようなものがあるのでしょうか?
代表的なものにWinAPIとMFCがあると調べてわかったのですが、どちらも難解そうな上
ニュアンス的なものですが、主流ではないような印象を受けました

C/C++で作ったDLLをC#で使う?ような方法にも辿りついたのですが
それだと使う側に.NETが必要になるようなので、それなら最初からC#を使った方が…と思います

どういった方法がベターなのでしょうか?

84:デフォルトの名無しさん
08/02/21 15:38:12
>>83
↓のページから好みに合ったものを選べ
Wikipedia項目リンク

85:デフォルトの名無しさん
08/02/21 15:44:15
普段は小物を作るのにVisual StudioのリソースエディタとATL/WTLをよく使っているけど、
C++はGUI作るツールに満足なものがないから、GUIに向いていない環境だと俺は思っている。
もっとましな状況になってほしい。

いろんなものが乱立していて決定打がないんだけど、
Windowsでは、Windows APIが最下層で、ほかがそのラッパーになっているので、
自然、Windows APIが共通語彙になっているという面はある。
だから、今何を使うにしても、いつかは素のWindows APIプログラミングに触れていてほしいなと思う。

86:デフォルトの名無しさん
08/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;
}


87:デフォルトの名無しさん
08/02/21 16:27:35
>>84-85
なるほど、見た感じWinAPIに一番無難な印象を受けてしまいました
Windowsがこの先消えうせることはなさそうですしとりあえずWinAPI触ってみます、ありがとうございました

88:デフォルトの名無しさん
08/02/21 17:44:38
>>86
試して問題ないならいいんじゃない?
負数で破綻するけど。
それと、一旦各桁に分割した結果を配列で保存するなら、
sprintf()で文字列にしてから逆順にして、atoi()で戻してもいいかも知れない。

89:デフォルトの名無しさん
08/02/21 17:48:39
int a = input;に意味がないね
そのままinputを使えばいい
知っててわざとやってるなら別にいいが

90:デフォルトの名無しさん
08/02/21 17:57:34
c言語でhttpサーバを作っててわからなくなったので質問させてください。

サーバからクライアントへsendを使ってメッセージを送信した際、
メッセージの送信完了を伝えるには、ソケットをclose(あるいはshutdown)
する以外に方法はないですか?
つまり、ソケットを閉じずに、コネクションを維持したまま、
送信完了を伝えたいのですが、できませんか?

91:デフォルトの名無しさん
08/02/21 17:57:59
>>89
意味ある、というか引数いじらないのは鉄則だよ。
一時変数ケチってinputを加工するのは無駄なバグの元。

92:デフォルトの名無しさん
08/02/21 18:18:34
>>90
HTTPであれば、レスポンスにContent-Lengthを入れれば、クライアント
がそのサイズの受信でデータ終了だと思ってくれる。



93:90
08/02/21 18:29:55
>>92

なるほど、そういう方法なんですね。
助かりました。ありがとうございます。


94:デフォルトの名無しさん
08/02/21 20:25:25
>>87
C#使った方がいいと思うってもう遅いけど

95:デフォルトの名無しさん
08/02/21 21:40:29
C++ならボーランドが最強
デルファイ言語の環境のまま、言語だけC++

96:デフォルトの名無しさん
08/02/21 21:41:13
正直決定打といえるほどのものじゃない

97:デフォルトの名無しさん
08/02/21 21:41:44
でもスタックにVCLのオブジェクト置けないんだよね

98:デフォルトの名無しさん
08/02/21 21:45:50
物理メモリの未使用量はどう調べられますか?

99:デフォルトの名無しさん
08/02/21 21:48:34
>>98
環境を書けよ。でないと答えようが無い

100:デフォルトの名無しさん
08/02/21 21:50:15
>>98
パソコンから取り外せば全容量使えるよ。

101:デフォルトの名無しさん
08/02/21 21:50:59
WindowsXPです

102:デフォルトの名無しさん
08/02/21 21:53:40
じゃあタスクマネージャだな

103:デフォルトの名無しさん
08/02/21 21:54:02
>>101
毒餃子を食わす国の人ですか?

104:デフォルトの名無しさん
08/02/21 21:54:36
>>101
GlobalMemoryStatus で調べろ

105:デフォルトの名無しさん
08/02/21 21:57:57
サンクス

106:デフォルトの名無しさん
08/02/21 22:27:36
newやvectorで確保が失敗したかチェックするにはどうすればいいですか?

107:デフォルトの名無しさん
08/02/21 22:31:16
あとメモリが少なくて、確保に時間がかかる場合、途中で止めるか、かかる時間を予測できますか?

108:デフォルトの名無しさん
08/02/21 22:32:24
VC9なのですが、SHA-256の定番なライブラリってないでしょうか?
JpegのIJGライブラリみたいなものがあると嬉しいのですが

109:デフォルトの名無しさん
08/02/21 22:32:32
>>106
長い思考の旅の後には、失敗しないからチェックは不要という結論になるよ。


110:デフォルトの名無しさん
08/02/21 22:43:28
>>106
bad_alloc 例外をつかまえる。


111:デフォルトの名無しさん
08/02/21 22:45:29
bad_alloc例外が必ず捕まえられる保障はないそうだよ。

by Sutter

112:デフォルトの名無しさん
08/02/21 22:48:48
set_new_handler

113:デフォルトの名無しさん
08/02/21 22:52:19
>>106
たくさんのレスが付くと思う。
そして、>>109にたどり着くと思う。

114:デフォルトの名無しさん
08/02/21 22:56:42
メモリ確保できなきゃ
大抵はそのまま異常終了するしかない事が多い。
ダウンするとマズいシステムの場合は
そうも言ってられないが。

115:デフォルトの名無しさん
08/02/21 23:19:36
ビルドのエラーについて質問です。
timeGetTime関数を呼ぶだけの関数を作成したのですが、
ビルドで以下のエラーになりました。
LNK2019: 未解決の外部シンボル __imp__timeGetTime@0 が関数 "int __cdecl MainRoutine(void)" (?MainRoutine@@YAHXZ) で参照されました。

ソースは以下になります。
#include <windows.h>
#include <mmsystem.h>
int MainRoutine()
{
DWORD dwTime;
dwTime = timeGetTime();
return 0;
}

VC2008 Express Editionを使用しています。
他に何か設定が必要なのでしょうか?

116:デフォルトの名無しさん
08/02/21 23:20:20
ライブラリのリンクが必要。

117:デフォルトの名無しさん
08/02/21 23:29:07
>115です。
すいません。記述漏れです。
以下の設定はすでにしていました。
「ツール」-「オプション」-「プロジェクトおよび〜」-
「VC++ディレクトリ」-「ライブラリリンク」にて、
C:\Program Files\Microsoft Platform SDK\Lib

ほかのライブラリのリンクが必要なのですか?
必要な場合、どこのライブラリをリンクすればいいでしょうか?

118:デフォルトの名無しさん
08/02/21 23:30:16
それはライブラリを検索するディレクトリを指定しているだけで
リンクするライブラリを選択するオプションではない。
何をリンクすればいいかはググれ。

119:デフォルトの名無しさん
08/02/21 23:38:58
>115です。
今は、ライブラリのリンクが出来てなかったと言うことなんで、
リンクの方法、リンクするライブラリについては、また調べてみます。
回答ありがとうございました。

120:デフォルトの名無しさん
08/02/21 23:46:57
ifやswitchってこんな風に書くのあり?

if(i==(1||2||3||4||5))

switch(i){
case (1||2||3||4||5):
   break;
}

121:デフォルトの名無しさん
08/02/21 23:48:33
おかしくね

122:デフォルトの名無しさん
08/02/21 23:49:51
>>120
C++ で operator をオーバーライドすれば可能かもしれませんね

123:デフォルトの名無しさん
08/02/21 23:54:50
>>120
caseの中身は定数でよろしく

124:デフォルトの名無しさん
08/02/22 00:01:36
>>120
switch(i){
case 1: case 2: case 3: case 4: case 5:
break;
}

125:デフォルトの名無しさん
08/02/22 00:02:21
d caseの方は間違ってるのね
ifの方も駄目?

126:デフォルトの名無しさん
08/02/22 00:03:55
>>124
ああ、caseでbreak書かなかったらそのまま下までいくからそういう風に書いたらいいのか

127:デフォルトの名無しさん
08/02/22 00:06:12
C#では見事に禁止だな

128:デフォルトの名無しさん
08/02/22 00:07:40
>>125
文法的に間違いではないが、お前の期待する動作はしないと思う

(1||2||3||4||5)は常に真となり、それとiの値が等しいかどうか
だよ?これ

129:デフォルトの名無しさん
08/02/22 00:08:18
>>125
ifの方も意図しているであろう動作はしない。
ただしコンパイルは通る。警告くらい出してくれるかも知れんが・・・

130:デフォルトの名無しさん
08/02/22 00:11:14
ありがとうございます。自分でもためしてみたけど無理だった
コンパイル通ってたから上手く動いてると思ってそのままつかってたよ…

131:デフォルトの名無しさん
08/02/22 00:19:40
>>127
C#も124みたいにcaseラベルを並べるのはありだと聞いた。

132:デフォルトの名無しさん
08/02/22 00:22:16
並べさせるくらいなら、コンマ区切りで書かせてくれてもいいのにね。

133:デフォルトの名無しさん
08/02/22 00:27:11
クラスの定義と代入を同時にやるにはどうやればいいですか?
int a=10; のようにです

134:デフォルトの名無しさん
08/02/22 00:28:19
「代入」 は既に宣言されている変数に対して行う操作なので
同時に出来る訳が無い。
初期化なら別だが。

135:デフォルトの名無しさん
08/02/22 00:30:45
operator を使おう

136:デフォルトの名無しさん
08/02/22 00:30:52
事故解決しました

137:デフォルトの名無しさん
08/02/22 00:32:34
これでできました

int main() {

class Test{
int x;
public:
Test (int y) {x=y;}
print(){ cout<<x<<endl; } };

Test a=10;
a.print();
return 0;
}

138:デフォルトの名無しさん
08/02/22 00:35:31
Test a=10;
a.print();
a=20;
a.print();

もできるんですね C++はすごいですね

139:デフォルトの名無しさん
08/02/22 00:37:27
往々にして望まない機能だけどな。
基本的に引数1つのコンストラクタには explicit つけとけ。

140:デフォルトの名無しさん
08/02/22 00:42:12
それよりも、構造体って感じの型でないクラスなのに
コピーコンストラクタとoperator =をコンパイラ任せにしているのが嫌だね。

141:デフォルトの名無しさん
08/02/22 00:43:15
コンパイラ任せに出来る時は
コンパイラ任せでいいよ。

142:デフォルトの名無しさん
08/02/22 00:48:46
138じゃないですが、

>>139
なんでですか?
(本当に理由を知りたいです。)


143:デフォルトの名無しさん
08/02/22 00:59:34
#include <iostream>
#include <vector>

class Vector {
public:
 Vector(size_t size) : m_array(size) { }
 void output() const {
  for(std::vector<int>::const_iterator it = m_array.begin();
     it != m_array.end(); ++it)
  {
   std::cout << *it << ' ';
  }
  std::cout << std::endl;
 }
private:
 std::vector<int> m_array;
};

void Foo(const Vector& v) {
 v.output();
}

int main() {
 Foo(5);   ←←←←←←←
}

これが直感的な挙動ではないことは分かってもらえると思う。
でも、コンパイル通るし、正常に動く。

explicit つけるとこういう時にコンパイルエラーにできる。
それでも Foo(Vector(5)); なら可だが、これは問題ないと感じてくれると思う。

144:デフォルトの名無しさん
08/02/22 00:59:53
>>91
どんなバグがでるのですか?
呼び出し側なにか影響でうるのですか?

145:デフォルトの名無しさん
08/02/22 01:01:23
input を変更した後に、
input が変更されていない事を前提とした処理を書いてしまうかもしれない。
あるいは、そういう処理があるにも関わらず、
それより前の地点で input を変更してしまうかもしれない。

そうなっていないか注意して探すよりは、
引数をいじらない方が良い。

146:デフォルトの名無しさん
08/02/22 01:08:46
みんな仮引数にconstって使わないんだよね。

147:デフォルトの名無しさん
08/02/22 01:09:55
一時期付けてみたけど、
あんま意味ないと思ってやめた。

148:デフォルトの名無しさん
08/02/22 01:12:29
>>145
なるほど
別にいじること自体がやばいわけじゃなくて

いじると間違い起こす原因となる可能性があるわけですね
ありがとうございました

149:デフォルトの名無しさん
08/02/22 01:14:13
だって関数の定義では付けてもいいけど、宣言では付けたくないので、
コピペじゃ済まなくなる。

150:デフォルトの名無しさん
08/02/22 01:14:45
>>131
fall throughは禁止じゃなかったっけ
何かキーワードがあったと思う
情報が古いかもしれんが

151:デフォルトの名無しさん
08/02/22 01:19:06
>>150
caseが連続する場合のみOK。その他は禁止。スレ違い。

152:デフォルトの名無しさん
08/02/22 01:19:25
>>143
ありがとうございます。
explicitは、暗黙の変換を抑制する機能なのですね。
しかしなんか上の例のコードは、すごくC++書き慣れた人な感じがしました。


153:デフォルトの名無しさん
08/02/22 01:20:21
>>150
>>124のように空のcaseラベルを並べたときはフォールスルーできる。
URLリンク(msdn2.microsoft.com)
スレ違いすまん。

154:133
08/02/22 02:00:16
関数の引数にクラスを使いたいのですが、クラスの宣言と代入を同時にするにはどうやればいいですか
intのようにコンストラクタではできませんでした

test y = f( x );
のようにです fはクラスを返します intではないです

155:デフォルトの名無しさん
08/02/22 02:11:42
>>154
testというのがクラスなら、testにconst test&型の引数を1つ取るコピーコンストラクタを作るんだ。

156:デフォルトの名無しさん
08/02/22 02:14:25
サンクス

157:デフォルトの名無しさん
08/02/22 07:02:49
>>154
何度も言うが、それは代入じゃない。
初期化だ。
初期化の場合、= を使っていても
test y = f(x); は test y(f(x)); と同義。

158:デフォルトの名無しさん
08/02/22 07:24:55
まったくのプログラム初心者です。
はじめににインストールする言語?をどれにするかがわかりません。
どういう意味かというと

ボーランド、とかマイクロソフトのvisual studioとかどれにすればいいのかです。
有料とか無料とかいろいろありますね。
できたら将来有料ソフトを販売可能なものがいいです。

今考えているのはマイクロソフトのVC++を考えているのですが、
C++とVC++は違うとか
どっかで聞いたりもしたので
初心者にはちんぷんかんぷんでわかりません。

よろしくお願いします

159:デフォルトの名無しさん
08/02/22 07:30:50
C++ は言語名。
VC++ は C++ を使って開発を行うためのツールの名前。

160:デフォルトの名無しさん
08/02/22 08:05:40
>>159
ありがとうございます。

161:デフォルトの名無しさん
08/02/22 11:08:37
VC++ はMSがWindows用ソフトを開発するために拡張した言語ともいえる
VC++のコードはほかのものでは動かせないものが多い

162:デフォルトの名無しさん
08/02/22 11:42:07
URLリンク(www.xlsoft.com)
このソフトを使えばJavaでもネイティブアプリケーションが作れると書いてあるのですが、そんなうまい話があるんですか?
もし本当ならJavaのパフォーマンス面での不利がだいぶ改善されると思うのですが

163:デフォルトの名無しさん
08/02/22 11:45:45
ここはC/C++スレですが

164:デフォルトの名無しさん
08/02/22 11:57:29
システム構築売るならまだしもソフト売るのにJavaはないだろ。
VCにしとけ。

165:デフォルトの名無しさん
08/02/22 11:59:00
perl2exeみたいなやつでは? 実行環境を圧縮してexeに詰め込む
利点としてはランタイムとかの導入がいらないだけで

166:デフォルトの名無しさん
08/02/22 12:21:11
スレ違い。ここでやれ
gcjって使ってる人います?
スレリンク(tech板)l50

167:デフォルトの名無しさん
08/02/22 12:31:13
この直し方教えてください!

IEBrowser->Document.charset="shift_jis";

error C2039: 'charset' : '_com_ptr_t<class _com_IIID<struct IDispatch,&struct __s_GUID _GUID_****> >' のメンバではありません。

168:167
08/02/22 12:35:30
文字コードの変換をしたいのですが・・・
この様に定義してあります

SHDocVw::IWebBrowser2Ptr IEBrowser;
IEBrowser.CreateInstance( __uuidof( SHDocVw::InternetExplorer ) );

169:デフォルトの名無しさん
08/02/22 12:51:05
>>167
こうでは?
IEBrowser->Document->charset= L"shift_jis";

170:167
08/02/22 12:55:40
>>169

error C2039: 'charset' : 'IDispatch' のメンバではありません。

になりました・・・

171:167
08/02/22 13:05:44
文字コードの変更方法わかったら教えてもらいたいですけど
そこだけVBAスクリプトを呼び出す事にします

172:デフォルトの名無しさん
08/02/22 13:08:27
>>170
じゃあこれはどう?
SHDocVw::IHTMLDocument2Ptr document = IEBrowser->Document;
docment->charset = L"shift_jis";


173:167
08/02/22 13:13:13
だめでした

174:デフォルトの名無しさん
08/02/22 13:23:38
QueryInterface

175:デフォルトの名無しさん
08/02/22 13:33:26
適当に書いたらやっぱダメだったか、すまん。
#import <mshtml.tlb>した上で、MSHTML::IHTMLDocument2Ptrだ。

176:デフォルトの名無しさん
08/02/22 13:34:40
>>174
ナントカPtr(の実態_com_ptr_t<>)のコンストラクタや代入演算子の中でQueryIntefaceが行われている。

177:デフォルトの名無しさん
08/02/22 14:08:38
πの値は、自分で3.1415926535...とかって書くしかないでしょうか。
numeric_limits<int>::max()とか、そういう書き方はないですか?


178:デフォルトの名無しさん
08/02/22 14:13:43
#ifndef M_PI
# define M_PI 3.1415926535
#endif

179:デフォルトの名無しさん
08/02/22 14:30:07
math.hをインクルードしたらM_PIとしてdefineされてる。
計算して出したいなら4*atan(1.0);

180:デフォルトの名無しさん
08/02/22 14:32:27
標準ではないのが玉に瑕。

181:デフォルトの名無しさん
08/02/22 15:02:49
>>178-180
ありがとうございます。
#include <cmath>
としてたのですが、M_PIでコンパイル通りました。


182:デフォルトの名無しさん
08/02/22 15:58:04
C初心者です。
実数→整数変換ですが、

double dval;
char buf[80];
int ival;

dval = -19.99; /* -19.99〜19.99 */
dval = dval * 100.0;

sprintf(buf,"%.0f",dval);
ival = atoi(buf);

printf( "%f %d %d\n",dval,ival,(int)dval);
/* printf( "%f %d %d\n",dval,ival,(int)ceil(dval)); */


ivalを求める場合、上記の方法が一番精度が良いのですが
これ以外に方法はありますでしょうか?
ceil() や floor() 使っても誤差が出てしまいます。


183:デフォルトの名無しさん
08/02/22 16:05:51
>sprintf(buf,"%.0f",dval);
それ四捨五入してるだけだぞ
そんなんでいいなら ival = floor(dval * 100 + 0.5) とでもやればいい

元々 -19.99 という値自体が誤差を持ってるから、これを無くすことは出来ない
printf("%.20f\n", -19.99); とかやってみればわかる

本当に誤差が嫌なら、浮動小数点を使わない、という方法しかない

184:182
08/02/22 16:12:26
>>183

早速のRESありがとう御座います。

>そんなんでいいなら ival = floor(dval * 100 + 0.5) とでもやればいい

了解です。これで行きたいと思います。
 どうもありがとう御座いました。

185:デフォルトの名無しさん
08/02/22 16:53:31
char []型の要素を破棄して動的確保できませんか? 消せなくてもいいので別のアドレスに確保できませんか?

f(char *ch){
delete ch;
ch=new char[10];
strcpy(ch,"ssssssss");
}

main(){
char *ce=new char[2];
f(ce); cout<<ce<<endl;

char ch[]="test";
f(ch); cout<<ch<<endl;
}

186:デフォルトの名無しさん
08/02/22 16:55:19
もしくは、char *型とchar []型を判別して、書き換えられないなら始めにエラーにするのでもいいです

187:デフォルトの名無しさん
08/02/22 16:59:46
>>185
ごめんfで何がしたいのか分からない。

まぁ俺の第六感で回答すると、ポインタのポインタ使えばいいんじゃね

188:デフォルトの名無しさん
08/02/22 17:05:10
char a[10];
をコード内で書き換えてたとえば100個まで使えるようにしたいんです
はじめのaは破棄できなくてもいいので、a[50]とかにアクセスできるようになりませんか

189:デフォルトの名無しさん
08/02/22 17:07:46
Stringクラスの使い方でも覚えるとか

190:デフォルトの名無しさん
08/02/22 17:08:43
>>188
設計が間違ってるよ
>>185 みたいにすると激しく管理が難しい事になる

191:デフォルトの名無しさん
08/02/22 17:12:10
ポインタで文字列のアドレスが渡されたら、それが[]なのか*なのか渡された側にはわかりません
どうしたらいいですか

192:デフォルトの名無しさん
08/02/22 17:14:17
配列サイズも渡す

193:デフォルトの名無しさん
08/02/22 17:17:53
閃いたw

初めから1000個くらい確保しとけばいいじゃん

194:デフォルトの名無しさん
08/02/22 17:21:28
無理か

main(){
char ch[]="test";

char *ce=new char[20];
strcpy(ce,"ssss");

ch=ce;  //ここでエラー

cout<<ch<<endl;
}

195:デフォルトの名無しさん
08/02/22 17:22:10
あほすぎ

196:デフォルトの名無しさん
08/02/22 17:29:05
>>191
呼び出し側で呼び出す関数を変える

>>194
なにがしたいの?

197:デフォルトの名無しさん
08/02/22 18:10:41
>>194
こうすれば?

main(){
char chx[]="test";
char *ch = chx;

char *ce=new char[20];
strcpy(ce,"ssss");

ch=ce;  //エラーなし

cout<<ch<<endl;
}

198:デフォルトの名無しさん
08/02/22 18:36:59
>>185
恐らく、引数でもらった文字列を元に新な文字列を返そうと考えてるんだろうけど、
そうしたいのなら、

char* func(const char* str)
{
 char* s = new char[ほにゃらら];
 ほげほげ

 return s;
}
とした方が良い。

そもそも
char ch[] = "test";
の ch は配列の先頭のアドレスを返す「定数」なんだから、newで確保した領域を割り当てられるわけないよ。


199:デフォルトの名無しさん
08/02/22 19:05:33
レスありがとうございます
同じような質問なんですが、*chが確保されていてもいなくても、deleteするにはどうすればいいですか?
確保していないと実行時にエラーになります

200:デフォルトの名無しさん
08/02/22 19:08:14
言ってる事がよく分からんが、こういうこと?

if( ch )delete ch;

201:デフォルトの名無しさん
08/02/22 19:15:06
まともに動くのはaだけなんです どれでも動くようになりますか?

f(char *ch){ delete ch; ch=new char[10]; strcpy(ch,"ssssssss"); }

main(){
char *a=new char[1]; f(a); cout<<a<<endl;
char *b=NULL; f(b); cout<<b<<endl;
// char *c; f(c); cout<<c<<endl;
}

202:デフォルトの名無しさん
08/02/22 19:16:31
>>200  ifを組み込んでも動作しませんでした

203:デフォルトの名無しさん
08/02/22 19:16:40
void f(char*& ch)

204:デフォルトの名無しさん
08/02/22 19:17:29
つーか、大人しく std::string 使え

205:デフォルトの名無しさん
08/02/22 19:18:15
>>201
fの中でchに代入してもmainの方はaもbもcも変わらないよ?

f(int x){
x = 2;
}
main() {
int a = 1;
f(a);
cout << a << endl; // 2ではなく1と表示される
}

↑これ解ってる?

206:デフォルトの名無しさん
08/02/22 19:19:04
>>203 それを組み込んだらbも動作しました! でもcが実行時にエラー出ます >>200も同時にやってもだめです

207:デフォルトの名無しさん
08/02/22 19:20:20
>>205 char* や配列は参照渡しだとききました

208:デフォルトの名無しさん
08/02/22 19:20:23
初期化してねえのに delete できるわけねえだろ

209:デフォルトの名無しさん
08/02/22 19:20:49
>>207
ポインタは値渡し。

210:デフォルトの名無しさん
08/02/22 19:21:59
>>209 わかりました >>208 初期化していないことを調べる方法ないですか

211:デフォルトの名無しさん
08/02/22 19:23:11
aは配列と見なされて参照渡しになってるんですね

212:デフォルトの名無しさん
08/02/22 19:25:03
用語の部分で思考停止してるな。
何が起こってるのか考えた事無いだろう。

213:デフォルトの名無しさん
08/02/22 19:25:43
>>210
初期化されてるポインタと、
初期化してないけど偶然たまたま同じ値が入ってるポインタを、
見分ける方法が物理的にあると思うか?

214:デフォルトの名無しさん
08/02/22 19:26:39
deleteした瞬間に落ちます tryも無理です

f(char*& ch){
try{ delete ch; }
catch(...){cerr << "例外を受け取りました。" << endl;}
ch=new char[10]; strcpy(ch,"ssssssss"); }

main(){
char *a=new char[1]; f(a); cout<<a<<endl;
char *b=NULL; f(b); cout<<b<<endl;
char *c; f(c); cout<<c<<endl;
}

215:デフォルトの名無しさん
08/02/22 19:31:57
>>214
いい方法を教えてあげよう
関数 f の前にこれを書くんだ

/* この関数に初期化してないポインタを渡してはいけません */

216:デフォルトの名無しさん
08/02/22 19:43:25
基礎からやり直せよ

217:デフォルトの名無しさん
08/02/22 19:45:15
>>214
だーかーらーnewで確保したメモリを指してるポインタと、未初期化のポインタを見分け
る方法なんて存在しないんだってば。
ポインタ使うときは初期化しろって何で言われてるのか考えたことあるか?


218:デフォルトの名無しさん
08/02/22 19:49:31
#define HOGE int

void f(HOGE x) { cout << '(' << x << ')' << endl; x = 42; }

int main() {
 HOGE a = 10; f(a); cout << '(' << a << ')' << endl;
 HOGE b = 0; f(b); cout << '(' << b << ')' << endl;
 HOGE c; f(c); cout << '(' << c << ')' << endl;
}

これの挙動は分かるか?


#define HOGE char*

void f(HOGE x) { cout << '(' << x << ')' << endl; x = "f"; }

int main() {
 HOGE a = "a"; f(a); cout << '(' << a << ')' << endl;
 HOGE b = NULL; f(b); cout << '(' << b << ')' << endl;
 HOGE c; f(c); cout << '(' << c << ')' << endl;
}

んで、これの挙動は分かるか?

219:デフォルトの名無しさん
08/02/22 20:17:15
質問ですが、stringの参照で値を受け取るとき
memcpy(str, ch,10000);
のようにできますか?

220:デフォルトの名無しさん
08/02/22 20:37:35
お願いだから str.assign(10000, ch); としてください。
頼みますから。

221:デフォルトの名無しさん
08/02/22 20:45:34
>>220
strがchar*の予感

222:デフォルトの名無しさん
08/02/22 21:09:01
凄く無駄なレス消費してんなw

223:デフォルトの名無しさん
08/02/22 21:15:15
昔ならともかく惜しむもんではないが無駄感は否めないなwww

224:デフォルトの名無しさん
08/02/22 21:43:42
プログラムを1から始めようと思うのですが、まずは本でも買って読むべきですか?
それともネットで調べるべきですか?

225:デフォルトの名無しさん
08/02/22 21:45:59
何をやりたいか目標を立てることから始めるべき。

226:デフォルトの名無しさん
08/02/22 22:16:13
文字列sに含まれる先頭のcの添字を表示させる関数を作れ
cが無い場合は、-1を表示

という問題で詰まってます
文字列の中のcを認識させるにはどうすればよいのでしょうか


227:デフォルトの名無しさん
08/02/22 22:22:42
strchr

228:デフォルトの名無しさん
08/02/22 22:24:16
マルチで申し訳ないですが
グローバルな共用体の変数に、関数からメンバーに代入したらセグメントエラーを吐いたのですが、これは許されないのでしょうか?


229:デフォルトの名無しさん
08/02/22 22:29:20
マルチしないでください^^;

230:デフォルトの名無しさん
08/02/22 22:46:54
火星人で申し訳ないのですが
グローバルな共用体の変数に、関数からメンバーに代入してもセグメントエラーを吐かないのですが、
嫁は許してくれるでしょうか?

231:デフォルトの名無しさん
08/02/22 22:48:12
こんがらがっちゃったんで、聞きたいんですが・・・
今こんなテンプレートクラスがあったとして
template<typename T>
class Array{
  T *array;
  size_t length;
public:
  Array(size_t n = 0){...}
  ~Array(){...}
  T& operator [](size_t n){...}
}
これを
typedef Array<myclass> MyArray;  //myclassは適当なクラスということで
Array<MyArray> MyArray2(2);
と使う時、MyArray2は与えた引数で初期化できますが
MyArrayの方にコンストラクタの引数を与える場合はどうすればいいですか?
ちなみにこれは、配列クラスなんでできれば、MyArray2が持つそれぞれのArray<myclass>に
別々の初期化パラメータを与えたいんですが・・・。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4987日前に更新/243 KB
担当:undef