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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスや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
21だけど:2008/02/20(水) 12:36:25
> 【アップローダー】(質問が長い時はココ使うと便利)
> http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
このリンクを確認してみたけど、ダメリンク?
だれか使っている人いる?
3デフォルトの名無しさん:2008/02/20(水) 12:47:53
>>2
一度だけ使った事があるよ
複数ファイルに分けないと説明できない事があったので

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

int hoge;
hoge = 1;

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

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

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

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

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

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

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

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

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

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

newをオーバーロードしてmallocで実装ということでしょうか?
53デフォルトの名無しさん:2008/02/21(木) 00:49:02
>>52
new/delete
new[]/delete[]
malloc/free
対応関係を間違えるな。
54デフォルトの名無しさん: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); // 領域を解放
55デフォルトの名無しさん: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関数とかでもいいだろうけどね。
56デフォルトの名無しさん:2008/02/21(木) 00:52:20
>>52
違う。配置構文newだ。
newは大抵mallocをラッピングしてて効率は悪い。
57sage:2008/02/21(木) 03:23:25
言語の使い方ではないのですが、一応処理系の一部ということで
質問させて頂きたいのですが、静的リンクされたELFバイナリにおいて、
リンクされているライブラリのバージョンを
そのバイナリから知る方法はあるのでしょうか?
58デフォルトの名無しさん:2008/02/21(木) 03:24:44
すみません・・sageを記入する欄を間違えました。
59デフォルトの名無しさん:2008/02/21(木) 07:51:13
カレンダー作りたいんで、各月何日まであるか年によって違うのでその法則を
教えて欲しいんだけどスレ違い?
60デフォルトの名無しさん:2008/02/21(木) 08:01:08
年によって日数が変わる月は2月だけだろ・・・。
最近の小学校は閏年も教えんのか?
61デフォルトの名無しさん:2008/02/21(木) 08:05:52
ありがとう2月だけなのか。習ったけど忘れてた
62デフォルトの名無しさん:2008/02/21(木) 09:44:16
1752年9月も変わってるな
63デフォルトの名無しさん:2008/02/21(木) 10:04:47
どうやって生きてるのか不思議だな
64デフォルトの名無しさん:2008/02/21(木) 10:07:28
カレンダー作るのに当時生きてるかはあまり関係ないかと。
unix系のOS使えるなら、 cal 9 1752 でカレンダー出るな。
65デフォルトの名無しさん:2008/02/21(木) 13:05:21
1752年9月がイリーガルなのは一部の国だけだけどな。
66デフォルトの名無しさん: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++長いこと使ってきたけど、知らなかったよ。

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

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

この2つはメンバにポインタや浮動小数点数が混ざってると意味が違うので、動作が
異なる可能性がある。 C++ でメンバに POD 以外が混ざってる場合には、 memset() での
「0フィル」は未定義動作につながる。
70デフォルトの名無しさん:2008/02/21(木) 13:47:26
>>66
>>39
の使い方が一般の気がする。
コピコン便利だし
71デフォルトの名無しさん:2008/02/21(木) 13:49:23
>>67
ポインタや浮動小数点数などでは、
Cのソース上では0と表現される値でも、内部では0以外のビットパターンを持つことがある。
そんな場合にも対応できるので、変数初期化のほうが移植性が高いとされる。
72デフォルトの名無しさん: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だと何もしないっていう処理はどう書けばいいのでしょうか。
73デフォルトの名無しさん:2008/02/21(木) 13:53:37
void printchar(){
}
74デフォルトの名無しさん:2008/02/21(木) 13:54:36
なるほど。
そういえば、Win32APIとかの解説ページを見ると、memsetで構造体を初期化してる人もいるよね(メンバにポインタがあるにもかかわらず
Windowsでしか動かない移植性がないプログラムだから問題ないんか。
75デフォルトの名無しさん:2008/02/21(木) 13:55:35
>73
やっぱりそうするしかないですか。
ありがとうございます。
76デフォルトの名無しさん:2008/02/21(木) 14:50:44
素朴な疑問なんだけど、
#include <>
なんかの"#"ってどんな意味があるんですが?
cgiみたいに、特別な物でそうゆう仕様という認識で良いのでしょうか?
初めて触った時はコメントアウトじゃんと思ったりもしましたけど。
77デフォルトの名無しさん:2008/02/21(木) 14:53:01
>>75
template<typename T>void printchar(T c = 0) {if (c) cout << c << endl;}
ではどう? 使うときにはprintchar<char>()のように型を指定する必要があるけど。
78デフォルトの名無しさん:2008/02/21(木) 14:54:35
>>76
プリプロセッサに対する指令
79デフォルトの名無しさん:2008/02/21(木) 15:01:13
>>76
>cgiみたいに、特別な物でそうゆう仕様という
ややあたり、起源はいっしょ
C++のコンパイルの前に通すテキスト加工スクリプトの様なもの。
もはや意識している人いないれどね。
起源はそうでも、すでにC++の一部機能です。
80デフォルトの名無しさん:2008/02/21(木) 15:07:15
printchar('A');
がマンドクセにみえた俺は病気
81デフォルトの名無しさん:2008/02/21(木) 15:11:12
単純にテンプレートのprintcharとは別にinline void printchar() {}を多重定義するだけではだめなの?
82デフォルトの名無しさん:2008/02/21(木) 15:20:40
>>81
すでに出てるし、そして当人は二つ書くことになにかご不満のご様子
83デフォルトの名無しさん:2008/02/21(木) 15:29:36
C/C++でGUIを実装する方法にはどのようなものがあるのでしょうか?
代表的なものにWinAPIとMFCがあると調べてわかったのですが、どちらも難解そうな上
ニュアンス的なものですが、主流ではないような印象を受けました

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

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

いろんなものが乱立していて決定打がないんだけど、
Windowsでは、Windows APIが最下層で、ほかがそのラッパーになっているので、
自然、Windows APIが共通語彙になっているという面はある。
だから、今何を使うにしても、いつかは素のWindows APIプログラミングに触れていてほしいなと思う。
86デフォルトの名無しさん: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;
}
87デフォルトの名無しさん:2008/02/21(木) 16:27:35
>>84-85
なるほど、見た感じWinAPIに一番無難な印象を受けてしまいました
Windowsがこの先消えうせることはなさそうですしとりあえずWinAPI触ってみます、ありがとうございました
88デフォルトの名無しさん:2008/02/21(木) 17:44:38
>>86
試して問題ないならいいんじゃない?
負数で破綻するけど。
それと、一旦各桁に分割した結果を配列で保存するなら、
sprintf()で文字列にしてから逆順にして、atoi()で戻してもいいかも知れない。
89デフォルトの名無しさん:2008/02/21(木) 17:48:39
int a = input;に意味がないね
そのままinputを使えばいい
知っててわざとやってるなら別にいいが
90デフォルトの名無しさん:2008/02/21(木) 17:57:34
c言語でhttpサーバを作っててわからなくなったので質問させてください。

サーバからクライアントへsendを使ってメッセージを送信した際、
メッセージの送信完了を伝えるには、ソケットをclose(あるいはshutdown)
する以外に方法はないですか?
つまり、ソケットを閉じずに、コネクションを維持したまま、
送信完了を伝えたいのですが、できませんか?
91デフォルトの名無しさん:2008/02/21(木) 17:57:59
>>89
意味ある、というか引数いじらないのは鉄則だよ。
一時変数ケチってinputを加工するのは無駄なバグの元。
92デフォルトの名無しさん:2008/02/21(木) 18:18:34
>>90
HTTPであれば、レスポンスにContent-Lengthを入れれば、クライアント
がそのサイズの受信でデータ終了だと思ってくれる。

9390:2008/02/21(木) 18:29:55
>>92

なるほど、そういう方法なんですね。
助かりました。ありがとうございます。
94デフォルトの名無しさん:2008/02/21(木) 20:25:25
>>87
C#使った方がいいと思うってもう遅いけど
95デフォルトの名無しさん:2008/02/21(木) 21:40:29
C++ならボーランドが最強
デルファイ言語の環境のまま、言語だけC++
96デフォルトの名無しさん:2008/02/21(木) 21:41:13
正直決定打といえるほどのものじゃない
97デフォルトの名無しさん:2008/02/21(木) 21:41:44
でもスタックにVCLのオブジェクト置けないんだよね
98デフォルトの名無しさん:2008/02/21(木) 21:45:50
物理メモリの未使用量はどう調べられますか?
99デフォルトの名無しさん:2008/02/21(木) 21:48:34
>>98
環境を書けよ。でないと答えようが無い
100デフォルトの名無しさん:2008/02/21(木) 21:50:15
>>98
パソコンから取り外せば全容量使えるよ。
101デフォルトの名無しさん:2008/02/21(木) 21:50:59
WindowsXPです
102デフォルトの名無しさん:2008/02/21(木) 21:53:40
じゃあタスクマネージャだな
103デフォルトの名無しさん:2008/02/21(木) 21:54:02
>>101
毒餃子を食わす国の人ですか?
104デフォルトの名無しさん:2008/02/21(木) 21:54:36
>>101
GlobalMemoryStatus で調べろ
105デフォルトの名無しさん:2008/02/21(木) 21:57:57
サンクス
106デフォルトの名無しさん:2008/02/21(木) 22:27:36
newやvectorで確保が失敗したかチェックするにはどうすればいいですか?
107デフォルトの名無しさん:2008/02/21(木) 22:31:16
あとメモリが少なくて、確保に時間がかかる場合、途中で止めるか、かかる時間を予測できますか?
108デフォルトの名無しさん:2008/02/21(木) 22:32:24
VC9なのですが、SHA-256の定番なライブラリってないでしょうか?
JpegのIJGライブラリみたいなものがあると嬉しいのですが
109デフォルトの名無しさん:2008/02/21(木) 22:32:32
>>106
長い思考の旅の後には、失敗しないからチェックは不要という結論になるよ。
110デフォルトの名無しさん:2008/02/21(木) 22:43:28
>>106
bad_alloc 例外をつかまえる。
111デフォルトの名無しさん:2008/02/21(木) 22:45:29
bad_alloc例外が必ず捕まえられる保障はないそうだよ。

by Sutter
112デフォルトの名無しさん:2008/02/21(木) 22:48:48
set_new_handler
113デフォルトの名無しさん:2008/02/21(木) 22:52:19
>>106
たくさんのレスが付くと思う。
そして、>>109にたどり着くと思う。
114デフォルトの名無しさん:2008/02/21(木) 22:56:42
メモリ確保できなきゃ
大抵はそのまま異常終了するしかない事が多い。
ダウンするとマズいシステムの場合は
そうも言ってられないが。
115デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/02/21(木) 23:20:20
ライブラリのリンクが必要。
117デフォルトの名無しさん:2008/02/21(木) 23:29:07
>115です。
すいません。記述漏れです。
以下の設定はすでにしていました。
「ツール」-「オプション」-「プロジェクトおよび〜」-
「VC++ディレクトリ」-「ライブラリリンク」にて、
C:\Program Files\Microsoft Platform SDK\Lib

ほかのライブラリのリンクが必要なのですか?
必要な場合、どこのライブラリをリンクすればいいでしょうか?
118デフォルトの名無しさん:2008/02/21(木) 23:30:16
それはライブラリを検索するディレクトリを指定しているだけで
リンクするライブラリを選択するオプションではない。
何をリンクすればいいかはググれ。
119デフォルトの名無しさん:2008/02/21(木) 23:38:58
>115です。
今は、ライブラリのリンクが出来てなかったと言うことなんで、
リンクの方法、リンクするライブラリについては、また調べてみます。
回答ありがとうございました。
120デフォルトの名無しさん:2008/02/21(木) 23:46:57
ifやswitchってこんな風に書くのあり?

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

switch(i){
case (1||2||3||4||5):
   break;
}
121デフォルトの名無しさん:2008/02/21(木) 23:48:33
おかしくね
122デフォルトの名無しさん:2008/02/21(木) 23:49:51
>>120
C++ で operator をオーバーライドすれば可能かもしれませんね
123デフォルトの名無しさん:2008/02/21(木) 23:54:50
>>120
caseの中身は定数でよろしく
124デフォルトの名無しさん:2008/02/22(金) 00:01:36
>>120
switch(i){
case 1: case 2: case 3: case 4: case 5:
break;
}
125デフォルトの名無しさん:2008/02/22(金) 00:02:21
d caseの方は間違ってるのね
ifの方も駄目?
126デフォルトの名無しさん:2008/02/22(金) 00:03:55
>>124
ああ、caseでbreak書かなかったらそのまま下までいくからそういう風に書いたらいいのか
127デフォルトの名無しさん:2008/02/22(金) 00:06:12
C#では見事に禁止だな
128デフォルトの名無しさん:2008/02/22(金) 00:07:40
>>125
文法的に間違いではないが、お前の期待する動作はしないと思う

(1||2||3||4||5)は常に真となり、それとiの値が等しいかどうか
だよ?これ
129デフォルトの名無しさん:2008/02/22(金) 00:08:18
>>125
ifの方も意図しているであろう動作はしない。
ただしコンパイルは通る。警告くらい出してくれるかも知れんが・・・
130デフォルトの名無しさん:2008/02/22(金) 00:11:14
ありがとうございます。自分でもためしてみたけど無理だった
コンパイル通ってたから上手く動いてると思ってそのままつかってたよ…
131デフォルトの名無しさん:2008/02/22(金) 00:19:40
>>127
C#も124みたいにcaseラベルを並べるのはありだと聞いた。
132デフォルトの名無しさん:2008/02/22(金) 00:22:16
並べさせるくらいなら、コンマ区切りで書かせてくれてもいいのにね。
133デフォルトの名無しさん:2008/02/22(金) 00:27:11
クラスの定義と代入を同時にやるにはどうやればいいですか?
int a=10; のようにです
134デフォルトの名無しさん:2008/02/22(金) 00:28:19
「代入」 は既に宣言されている変数に対して行う操作なので
同時に出来る訳が無い。
初期化なら別だが。
135デフォルトの名無しさん:2008/02/22(金) 00:30:45
operator を使おう
136デフォルトの名無しさん:2008/02/22(金) 00:30:52
事故解決しました
137デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/02/22(金) 00:35:31
Test a=10;
a.print();
a=20;
a.print();

もできるんですね C++はすごいですね
139デフォルトの名無しさん:2008/02/22(金) 00:37:27
往々にして望まない機能だけどな。
基本的に引数1つのコンストラクタには explicit つけとけ。
140デフォルトの名無しさん:2008/02/22(金) 00:42:12
それよりも、構造体って感じの型でないクラスなのに
コピーコンストラクタとoperator =をコンパイラ任せにしているのが嫌だね。
141デフォルトの名無しさん:2008/02/22(金) 00:43:15
コンパイラ任せに出来る時は
コンパイラ任せでいいよ。
142デフォルトの名無しさん:2008/02/22(金) 00:48:46
138じゃないですが、

>>139
なんでですか?
(本当に理由を知りたいです。)
143デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/02/22(金) 00:59:53
>>91
どんなバグがでるのですか?
呼び出し側なにか影響でうるのですか?
145デフォルトの名無しさん:2008/02/22(金) 01:01:23
input を変更した後に、
input が変更されていない事を前提とした処理を書いてしまうかもしれない。
あるいは、そういう処理があるにも関わらず、
それより前の地点で input を変更してしまうかもしれない。

そうなっていないか注意して探すよりは、
引数をいじらない方が良い。
146デフォルトの名無しさん:2008/02/22(金) 01:08:46
みんな仮引数にconstって使わないんだよね。
147デフォルトの名無しさん:2008/02/22(金) 01:09:55
一時期付けてみたけど、
あんま意味ないと思ってやめた。
148デフォルトの名無しさん:2008/02/22(金) 01:12:29
>>145
なるほど
別にいじること自体がやばいわけじゃなくて

いじると間違い起こす原因となる可能性があるわけですね
ありがとうございました
149デフォルトの名無しさん:2008/02/22(金) 01:14:13
だって関数の定義では付けてもいいけど、宣言では付けたくないので、
コピペじゃ済まなくなる。
150デフォルトの名無しさん:2008/02/22(金) 01:14:45
>>131
fall throughは禁止じゃなかったっけ
何かキーワードがあったと思う
情報が古いかもしれんが
151デフォルトの名無しさん:2008/02/22(金) 01:19:06
>>150
caseが連続する場合のみOK。その他は禁止。スレ違い。
152デフォルトの名無しさん:2008/02/22(金) 01:19:25
>>143
ありがとうございます。
explicitは、暗黙の変換を抑制する機能なのですね。
しかしなんか上の例のコードは、すごくC++書き慣れた人な感じがしました。
153デフォルトの名無しさん:2008/02/22(金) 01:20:21
>>150
>>124のように空のcaseラベルを並べたときはフォールスルーできる。
http://msdn2.microsoft.com/ja-jp/library/06tc147t.aspx
スレ違いすまん。
154133:2008/02/22(金) 02:00:16
関数の引数にクラスを使いたいのですが、クラスの宣言と代入を同時にするにはどうやればいいですか
intのようにコンストラクタではできませんでした

test y = f( x );
のようにです fはクラスを返します intではないです
155デフォルトの名無しさん:2008/02/22(金) 02:11:42
>>154
testというのがクラスなら、testにconst test&型の引数を1つ取るコピーコンストラクタを作るんだ。
156デフォルトの名無しさん:2008/02/22(金) 02:14:25
サンクス
157デフォルトの名無しさん:2008/02/22(金) 07:02:49
>>154
何度も言うが、それは代入じゃない。
初期化だ。
初期化の場合、= を使っていても
test y = f(x); は test y(f(x)); と同義。
158デフォルトの名無しさん:2008/02/22(金) 07:24:55
まったくのプログラム初心者です。
はじめににインストールする言語?をどれにするかがわかりません。
どういう意味かというと

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

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

よろしくお願いします
159デフォルトの名無しさん:2008/02/22(金) 07:30:50
C++ は言語名。
VC++ は C++ を使って開発を行うためのツールの名前。
160デフォルトの名無しさん:2008/02/22(金) 08:05:40
>>159
ありがとうございます。
161デフォルトの名無しさん:2008/02/22(金) 11:08:37
VC++ はMSがWindows用ソフトを開発するために拡張した言語ともいえる
VC++のコードはほかのものでは動かせないものが多い
162デフォルトの名無しさん:2008/02/22(金) 11:42:07
http://www.xlsoft.com/jp/products/jet/index.html
このソフトを使えばJavaでもネイティブアプリケーションが作れると書いてあるのですが、そんなうまい話があるんですか?
もし本当ならJavaのパフォーマンス面での不利がだいぶ改善されると思うのですが
163デフォルトの名無しさん:2008/02/22(金) 11:45:45
ここはC/C++スレですが
164デフォルトの名無しさん:2008/02/22(金) 11:57:29
システム構築売るならまだしもソフト売るのにJavaはないだろ。
VCにしとけ。
165デフォルトの名無しさん:2008/02/22(金) 11:59:00
perl2exeみたいなやつでは? 実行環境を圧縮してexeに詰め込む
利点としてはランタイムとかの導入がいらないだけで
166デフォルトの名無しさん:2008/02/22(金) 12:21:11
スレ違い。ここでやれ
gcjって使ってる人います?
ttp://pc11.2ch.net/test/read.cgi/tech/1046627795/l50
167デフォルトの名無しさん:2008/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_****> >' のメンバではありません。
168167:2008/02/22(金) 12:35:30
文字コードの変換をしたいのですが・・・
この様に定義してあります

SHDocVw::IWebBrowser2Ptr IEBrowser;
IEBrowser.CreateInstance( __uuidof( SHDocVw::InternetExplorer ) );
169デフォルトの名無しさん:2008/02/22(金) 12:51:05
>>167
こうでは?
IEBrowser->Document->charset= L"shift_jis";
170167:2008/02/22(金) 12:55:40
>>169

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

になりました・・・
171167:2008/02/22(金) 13:05:44
文字コードの変更方法わかったら教えてもらいたいですけど
そこだけVBAスクリプトを呼び出す事にします
172デフォルトの名無しさん:2008/02/22(金) 13:08:27
>>170
じゃあこれはどう?
SHDocVw::IHTMLDocument2Ptr document = IEBrowser->Document;
docment->charset = L"shift_jis";
173167:2008/02/22(金) 13:13:13
だめでした
174デフォルトの名無しさん:2008/02/22(金) 13:23:38
QueryInterface
175デフォルトの名無しさん:2008/02/22(金) 13:33:26
適当に書いたらやっぱダメだったか、すまん。
#import <mshtml.tlb>した上で、MSHTML::IHTMLDocument2Ptrだ。
176デフォルトの名無しさん:2008/02/22(金) 13:34:40
>>174
ナントカPtr(の実態_com_ptr_t<>)のコンストラクタや代入演算子の中でQueryIntefaceが行われている。
177デフォルトの名無しさん:2008/02/22(金) 14:08:38
πの値は、自分で3.1415926535...とかって書くしかないでしょうか。
numeric_limits<int>::max()とか、そういう書き方はないですか?
178デフォルトの名無しさん:2008/02/22(金) 14:13:43
#ifndef M_PI
# define M_PI 3.1415926535
#endif
179デフォルトの名無しさん:2008/02/22(金) 14:30:07
math.hをインクルードしたらM_PIとしてdefineされてる。
計算して出したいなら4*atan(1.0);
180デフォルトの名無しさん:2008/02/22(金) 14:32:27
標準ではないのが玉に瑕。
181デフォルトの名無しさん:2008/02/22(金) 15:02:49
>>178-180
ありがとうございます。
#include <cmath>
としてたのですが、M_PIでコンパイル通りました。
182デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/02/22(金) 16:05:51
>sprintf(buf,"%.0f",dval);
それ四捨五入してるだけだぞ
そんなんでいいなら ival = floor(dval * 100 + 0.5) とでもやればいい

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

本当に誤差が嫌なら、浮動小数点を使わない、という方法しかない
184182:2008/02/22(金) 16:12:26
>>183

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

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

了解です。これで行きたいと思います。
 どうもありがとう御座いました。
185デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/02/22(金) 16:55:19
もしくは、char *型とchar []型を判別して、書き換えられないなら始めにエラーにするのでもいいです
187デフォルトの名無しさん:2008/02/22(金) 16:59:46
>>185
ごめんfで何がしたいのか分からない。

まぁ俺の第六感で回答すると、ポインタのポインタ使えばいいんじゃね
188デフォルトの名無しさん:2008/02/22(金) 17:05:10
char a[10];
をコード内で書き換えてたとえば100個まで使えるようにしたいんです
はじめのaは破棄できなくてもいいので、a[50]とかにアクセスできるようになりませんか
189デフォルトの名無しさん:2008/02/22(金) 17:07:46
Stringクラスの使い方でも覚えるとか
190デフォルトの名無しさん:2008/02/22(金) 17:08:43
>>188
設計が間違ってるよ
>>185 みたいにすると激しく管理が難しい事になる
191デフォルトの名無しさん:2008/02/22(金) 17:12:10
ポインタで文字列のアドレスが渡されたら、それが[]なのか*なのか渡された側にはわかりません
どうしたらいいですか
192デフォルトの名無しさん:2008/02/22(金) 17:14:17
配列サイズも渡す
193デフォルトの名無しさん:2008/02/22(金) 17:17:53
閃いたw

初めから1000個くらい確保しとけばいいじゃん
194デフォルトの名無しさん:2008/02/22(金) 17:21:28
無理か

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

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

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

cout<<ch<<endl;
}
195デフォルトの名無しさん:2008/02/22(金) 17:22:10
あほすぎ
196デフォルトの名無しさん:2008/02/22(金) 17:29:05
>>191
呼び出し側で呼び出す関数を変える

>>194
なにがしたいの?
197デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/02/22(金) 18:36:59
>>185
恐らく、引数でもらった文字列を元に新な文字列を返そうと考えてるんだろうけど、
そうしたいのなら、

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

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

そもそも
char ch[] = "test";
の ch は配列の先頭のアドレスを返す「定数」なんだから、newで確保した領域を割り当てられるわけないよ。
199デフォルトの名無しさん:2008/02/22(金) 19:05:33
レスありがとうございます
同じような質問なんですが、*chが確保されていてもいなくても、deleteするにはどうすればいいですか?
確保していないと実行時にエラーになります
200デフォルトの名無しさん:2008/02/22(金) 19:08:14
言ってる事がよく分からんが、こういうこと?

if( ch )delete ch;
201デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/02/22(金) 19:16:31
>>200  ifを組み込んでも動作しませんでした
203デフォルトの名無しさん:2008/02/22(金) 19:16:40
void f(char*& ch)
204デフォルトの名無しさん:2008/02/22(金) 19:17:29
つーか、大人しく std::string 使え
205デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/02/22(金) 19:19:04
>>203 それを組み込んだらbも動作しました! でもcが実行時にエラー出ます >>200も同時にやってもだめです
207デフォルトの名無しさん:2008/02/22(金) 19:20:20
>>205 char* や配列は参照渡しだとききました
208デフォルトの名無しさん:2008/02/22(金) 19:20:23
初期化してねえのに delete できるわけねえだろ
209デフォルトの名無しさん:2008/02/22(金) 19:20:49
>>207
ポインタは値渡し。
210デフォルトの名無しさん:2008/02/22(金) 19:21:59
>>209 わかりました >>208 初期化していないことを調べる方法ないですか
211デフォルトの名無しさん:2008/02/22(金) 19:23:11
aは配列と見なされて参照渡しになってるんですね
212デフォルトの名無しさん:2008/02/22(金) 19:25:03
用語の部分で思考停止してるな。
何が起こってるのか考えた事無いだろう。
213デフォルトの名無しさん:2008/02/22(金) 19:25:43
>>210
初期化されてるポインタと、
初期化してないけど偶然たまたま同じ値が入ってるポインタを、
見分ける方法が物理的にあると思うか?
214デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/02/22(金) 19:31:57
>>214
いい方法を教えてあげよう
関数 f の前にこれを書くんだ

/* この関数に初期化してないポインタを渡してはいけません */
216デフォルトの名無しさん:2008/02/22(金) 19:43:25
基礎からやり直せよ
217デフォルトの名無しさん:2008/02/22(金) 19:45:15
>>214
だーかーらーnewで確保したメモリを指してるポインタと、未初期化のポインタを見分け
る方法なんて存在しないんだってば。
ポインタ使うときは初期化しろって何で言われてるのか考えたことあるか?
218デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/02/22(金) 20:17:15
質問ですが、stringの参照で値を受け取るとき
memcpy(str, ch,10000);
のようにできますか?
220デフォルトの名無しさん:2008/02/22(金) 20:37:35
お願いだから str.assign(10000, ch); としてください。
頼みますから。
221デフォルトの名無しさん:2008/02/22(金) 20:45:34
>>220
strがchar*の予感
222デフォルトの名無しさん:2008/02/22(金) 21:09:01
凄く無駄なレス消費してんなw
223デフォルトの名無しさん:2008/02/22(金) 21:15:15
昔ならともかく惜しむもんではないが無駄感は否めないなwww
224デフォルトの名無しさん:2008/02/22(金) 21:43:42
プログラムを1から始めようと思うのですが、まずは本でも買って読むべきですか?
それともネットで調べるべきですか?
225デフォルトの名無しさん:2008/02/22(金) 21:45:59
何をやりたいか目標を立てることから始めるべき。
226デフォルトの名無しさん:2008/02/22(金) 22:16:13
文字列sに含まれる先頭のcの添字を表示させる関数を作れ
cが無い場合は、-1を表示

という問題で詰まってます
文字列の中のcを認識させるにはどうすればよいのでしょうか
227デフォルトの名無しさん:2008/02/22(金) 22:22:42
strchr
228デフォルトの名無しさん:2008/02/22(金) 22:24:16
マルチで申し訳ないですが
グローバルな共用体の変数に、関数からメンバーに代入したらセグメントエラーを吐いたのですが、これは許されないのでしょうか?
229デフォルトの名無しさん:2008/02/22(金) 22:29:20
マルチしないでください^^;
230デフォルトの名無しさん:2008/02/22(金) 22:46:54
火星人で申し訳ないのですが
グローバルな共用体の変数に、関数からメンバーに代入してもセグメントエラーを吐かないのですが、
嫁は許してくれるでしょうか?
231デフォルトの名無しさん:2008/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>に
別々の初期化パラメータを与えたいんですが・・・。
232デフォルトの名無しさん:2008/02/22(金) 22:49:58
>>255
何ができるかを伝えてあげるべき。
ようこそプログラムの世界へ。
233デフォルトの名無しさん:2008/02/22(金) 22:50:25
>>225だったorz
234デフォルトの名無しさん:2008/02/22(金) 22:51:22
>>227
それは関数そのものではないでしょうか
わざわざ教えたいただいたのですが、伝達不足でした、すみません
int strch_idx(const char* s, char c);
という関数の雛形が与えられて、この中身を作るのに、cを認識する必要があると判断したのですが、間違っているでしょうか
235デフォルトの名無しさん:2008/02/22(金) 22:54:41
>>231
今のC++では無理だね。だからSTLコンテナではreserveしてpush_backしたり、
組込の配列からコピー初期化したりする。
236デフォルトの名無しさん:2008/02/22(金) 22:56:20
>>234
cを認識の意味がわかりません
s内からcを検索したいってこと?
237デフォルトの名無しさん:2008/02/22(金) 23:17:22
>>235もしやと思ったらやっぱりですか・・・
この場合大人しくループまわして作ることになるんでしょうね。
ありがとうございました。
238デフォルトの名無しさん:2008/02/22(金) 23:34:21
>>236
例えば、sという文字列にcincoと入力すると、1を
sという文字列にiicicoと入力すると3を
sという文字列にnorioと入力すると-1をreturnで返却する

こういう関数を作ろうと思うと、sという文字列の中身について、
s[0]に格納されているのはcかどうか、s[1]に格納されてるのはcかどうか、s[2]に格納されているのは…
と、ひたすら繰り返して行く必要があると考えました
そのためには、s[n]について、cなのかどうか判定する必要があるのではないかと
この判定というのが、認識と同じ意味のつもりで使いました
239デフォルトの名無しさん:2008/02/22(金) 23:40:52
strchrのソース読めよ。
検索すればいくらでも出るだろ
240デフォルトの名無しさん:2008/02/22(金) 23:45:33
>>238
if (s[0] == 'c') return 1;
if (s[1] == 'c') return 2;
if (s[2] == 'c') return 3;
...and so on.
241デフォルトの名無しさん:2008/02/22(金) 23:50:48
>>234
学校の宿題は自分でやれよ。屑
242デフォルトの名無しさん:2008/02/23(土) 00:02:06
>>238
それ以外に方法はstrchrを使用するぐらいしか思いつかない
(strchrもおそらくは、中で同じようなことしてると思うけど)

なにが疑問なのかよくわからないので、とりえあず2通りソースを貼り付けときます
@
int i;
for(i=0; s[i] != '\0' && s[i] != c; i++);
return s[i] != '\0' ? i : -1;

A
char *p;
return (p=strchr(s, c)) != NULL ? (int)(p-s) : -1;

返ってくるのは配列の添え字ですのであしからず
243デフォルトの名無しさん:2008/02/23(土) 00:06:01
>>239  >>240
どうも、理解できました

>>242
ご丁寧にどうもありがとうございました
244デフォルトの名無しさん:2008/02/23(土) 03:34:24
全くコードの書き方が分からないので質問させて下さい。
C++ VS2005

略)
printf("Got: %02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);


buf[0]には01
buf[1]には06
buf[2]には17
buf[3]にはf3
buf[4]には34
が入る。

を文字列"0106171f34"に置き換えたい。

1.このbuf[]の中(16進数)を文字列に変換したい。

2.文字列に変換した後に、buf[0]〜buf[5]を繋げたい。

sprintとかを使えば良いみたいなのですが、どのようにやってよいか分からずに困っています。
どうかよろしくお願いします。
245デフォルトの名無しさん:2008/02/23(土) 03:35:36
>>244
課題を丸投げしたいなら宿題スレにいけ
246デフォルトの名無しさん:2008/02/23(土) 03:37:49
>>244
いや一応答えると
sprintじゃなくてsprintfだな
sprintfで連結もできます
247244:2008/02/23(土) 03:51:48
>>245-246
ありがとう。もうちょい試して無理だったら、宿題ではないんだけど、宿題スレで質問してみたいと思います。
248デフォルトの名無しさん:2008/02/23(土) 03:54:12
sprintf のヘルプ見るだけで解決だろ
249244:2008/02/23(土) 08:58:16
>>248
なんとか解決しました。時間かかった>< やってみれば、なんと簡単なコードって感じですけど。

ヘルプのみかたってイマイチわからないんですけど、ヘルプの見方の解説サイトとかってありませんでしょうか?
250デフォルトの名無しさん:2008/02/23(土) 09:49:02
>>249
manコマンドのことなら、man manでOK。
251デフォルトの名無しさん:2008/02/23(土) 10:05:35
Cをずっとやってたのですが、
VC++6.0でデバッグしてると、関数に入るだけでESPが100バイトくらい進みます
C++だとモジュール毎にスタックをこんなに食うものなのでしょうか?
デバッグ情報か何かで食ってるのですか?
252デフォルトの名無しさん:2008/02/23(土) 10:06:37
ローカル変数たくさん使ってるんじゃないの
253デフォルトの名無しさん:2008/02/23(土) 10:06:52
>>251
ローカル変数が100バイトほどあるんじゃなくて?
254251:2008/02/23(土) 11:07:16
いやひとつもないのだが・・・
家のPCでためしたけど、
関数にステップインするときはESPは4バイトしか進まないが、
そこから1step進めて、{から関数内の1行目に入るときに、
80バイトも食う
char a[100];と宣言を入れると、これが180バイトになるから、やり方は間違ってないはず
この80バイトが何なのかわからん
255デフォルトの名無しさん:2008/02/23(土) 11:21:13
メンバ関数とかじゃなくて?
256デフォルトの名無しさん:2008/02/23(土) 11:22:06
>>254
一時オブジェクトの置き場になってるとか?
関数の戻り値のオブジェクトを別の関数に直接渡してる場合とか・・・
アセンブラコード出させて見ても使われてなさげ?
まさかとは思うが、スタックオーバフローのチェックコードが入っているとか。
さもなければalloca()相当のコードが入っているとか。
あーそうそう、この場合のローカル変数は、Cのコード上現れるものに限らず
コンパイラが必要とした一時変数も含めてってことね。
例えば、構造体を値渡ししていたりreturnで戻していると作られるかもね。
258251:2008/02/23(土) 11:32:53
void test()
{
char a[100];
printf ("test");
}

int main(int argc, char* argv[])
{
test();

return 0;
}

コードはこれだけなんだけど。C++じゃねーな。
混合モードで見ると、これが原因らしいが、何でこんなことしてるのかな。
アセンブラわからん。

sub esp,0A4h
259デフォルトの名無しさん:2008/02/23(土) 12:57:17
>>249
VC++ なら sprintf とか入力して F1 推せば見れるだろ。
260デフォルトの名無しさん:2008/02/23(土) 12:58:29
>>258
デバッグ用じゃなくてもそうなら、
例外用のコードなのかもしれないな。
261デフォルトの名無しさん:2008/02/23(土) 13:01:09
>>258
手元の2005EEで試したが、リリースビルドの規定値では該当のコードは生成されない。
デバッグビルドだと生成されるが、「基本ランタイムチェック」を無効にしたら配列分だけになった。
つまり、>257の1行目だね。
262デフォルトの名無しさん:2008/02/23(土) 13:23:22
C言語でポインタを値渡しするにはどうすればいいですか?
263デフォルトの名無しさん:2008/02/23(土) 13:24:01
訂正
C言語でポインタを参照渡しするにはどうすればいいですか?
264デフォルトの名無しさん:2008/02/23(土) 13:25:31
>>263
ポインタのポインタを使う
int **p;みたいなの
265デフォルトの名無しさん:2008/02/23(土) 13:25:41
C言語には参照渡しの機能はありません。
ポインタを渡すことで参照渡し「っぽいこと」はできるので、
ポインタのポインタを渡せばポインタの参照渡し「っぽいこと」はできます。
266デフォルトの名無しさん:2008/02/23(土) 13:26:02
参照渡しだって結局アドレス渡しの糖衣みたいなもんなんじゃねえの
267デフォルトの名無しさん:2008/02/23(土) 13:32:22
文脈で「参照」の意味の違いを読み取れよ
268デフォルトの名無しさん:2008/02/23(土) 13:32:28
サンクス
269デフォルトの名無しさん:2008/02/23(土) 13:37:01
C++じゃなくてCならアドレス渡しと参照渡しは同義で通じるだろ
270デフォルトの名無しさん:2008/02/23(土) 13:38:30
結局やってることは同じじゃねえの
271243:2008/02/23(土) 13:45:44
やっぱりうまくいきませんでした
何が間違っているのか、理解できません
添削をお願いしたいです
c++、Borland C++5.5.1 for win32でやっています
int strch_idx(const char* s, char c)
{
int i = 0;
while(s[i])
{
if(s[i] == 'c') goto end;
else if(s[i] == 0)
{
i = -1;
goto end;
}
i++;
}
end:
return i;
}
272デフォルトの名無しさん:2008/02/23(土) 13:50:02
最近はソフトウェア工学も学ばないのか
273デフォルトの名無しさん:2008/02/23(土) 13:51:13
>>271
>if(s[i] == 'c') goto end; 

'c' じゃなくて c では?
あと、else if (s[i] == 0) の判定をする前に while の条件で抜けてしまうかと
274デフォルトの名無しさん:2008/02/23(土) 13:55:02
>>266>>269>>270
そういう不正確な事やってると
>>207 みたいな奴が出てくるんだよ。
275デフォルトの名無しさん:2008/02/23(土) 14:11:18
>>274
俺はCでの話を言ってるんだぞ?
アドレス渡ししかないんだからないんだから、不正確もなにもねぇだろうが
276デフォルトの名無しさん:2008/02/23(土) 14:12:17
Cには参照なんてないんだからそんな言葉つかうなよ。
277デフォルトの名無しさん:2008/02/23(土) 14:13:07
え?マクロは参照じゃないの?
278デフォルトの名無しさん:2008/02/23(土) 14:15:15
C言語は基本的にすべてコピーで渡す
ポインタもコピー
279デフォルトの名無しさん:2008/02/23(土) 14:15:51
>>275
C には参照渡しなんてないんだよ。
280デフォルトの名無しさん:2008/02/23(土) 14:18:09
参照渡しがアドレス渡しの糖衣ってのは正しい
どっちかだけ知らずに語ると馬鹿なことになるけど、どっちもしっかり理解してるなら別に問題ないでしょう
281デフォルトの名無しさん:2008/02/23(土) 14:20:52
static_castと(int)みたいなキャストってなにかなにか違うんですか?
282デフォルトの名無しさん:2008/02/23(土) 14:24:24
>>281
static_castの方が用途が限定される
283デフォルトの名無しさん:2008/02/23(土) 14:24:35
>>280
個人がそう理解するのはかまわんけど、初心者への説明としては不親切じゃね?
284デフォルトの名無しさん:2008/02/23(土) 14:25:07
>>281
Cとの互換性を大事にしたいなら後者、意味をはっきりさせたいのなら前者を使うといいでしょう。
285デフォルトの名無しさん:2008/02/23(土) 14:26:18
>>273
実際やってみると
cuで2が、gguで3が、ijcoで4が返ってきます
これは、s[i] == cと、s[i] == 0の判定が成されていないという事ですよね?
しかし、while関数自体は終わってるので、s[i]は判定されている
どういうことなんでしょうか?
また、ご指摘を受けて、whileをdo-whileに変更しました、ありがとうございます
286デフォルトの名無しさん:2008/02/23(土) 14:27:11
なんでそんな単純な構造でgotoを使う必要があるのか解らん。
287デフォルトの名無しさん:2008/02/23(土) 14:30:00
gotoは怖くて使えない・・・
てか絶対使わないようにしてるんだが、違うのか
288デフォルトの名無しさん:2008/02/23(土) 14:31:58
>>280
単なる構文糖衣じゃない。
参照の参照というのは存在しないが、
ポインタのポインタというのは存在する。
これは大きな違いで、適当な教え方してると >>207 みたいなやつが出てくる。
289デフォルトの名無しさん:2008/02/23(土) 14:33:55
>>287
むしろ使った方が綺麗になる状況では使う。
でも、上のは break; 使えば解決できることで、
goto を使って解決すべきじゃない。
290デフォルトの名無しさん:2008/02/23(土) 14:37:52
>>282
>>284
当面はあまり気にしなくてよさそうですね
どうもありがとうございました
291デフォルトの名無しさん:2008/02/23(土) 14:39:03
>>290
いいや、気にしろ。
292デフォルトの名無しさん:2008/02/23(土) 14:42:06
普通は C 風のキャストは使うべきじゃない。
せいぜいクラスのテンポラリオブジェクトを作るのに関数風のキャストを使うくらい。
293デフォルトの名無しさん:2008/02/23(土) 14:47:55
>>292
それはキャストよりもコンストラクタ呼び出しのほうがしっくりくる
294デフォルトの名無しさん:2008/02/23(土) 14:49:30
昨日質問したものですが、char * 型とchar []を判別する方法はありませんか?
295デフォルトの名無しさん:2008/02/23(土) 14:52:19
ソースコードを読みましょう。
296デフォルトの名無しさん:2008/02/23(土) 14:54:36
>>291
すいません
気にしろとだけ言われましてもなにに気を使えばいいのかわかりません

まずい点でもでてくるのか
だとかを教えていただけませんか
297デフォルトの名無しさん:2008/02/23(土) 14:58:13
キャストには色々意味があって、C言語風キャストだとそれらをすべて内包してしまって意図が掴みにくい
298デフォルトの名無しさん:2008/02/23(土) 14:58:20
メインウインドウにBUTTONを作成するときなどで使う、
CreateWindowとCreateControlWindowはどう違いますか?
299デフォルトの名無しさん:2008/02/23(土) 15:00:58
>>296
C風のキャストはなんでもかんでもキャストできてしまうので、
プログラマの意図と違ってても警告が出ない

const void *p = 〜;
char *q = (char*)p; // charにキャスト・・・あれ? constも外しちゃったよ! でも警告は出ない
char *r = static_cast<char*>(p); // コンパイルエラー: static_castでconstは外せない
char *s = const_cast<char*>(static_cast<const char*>(p)); // constも外したい意図の場合はこう書く
300デフォルトの名無しさん:2008/02/23(土) 15:03:54
>>286-287
gotoのほうが行き先が明確になるので、理解しやすかったので、用いていますが
なぜ怖いのでしょうか
それと、「これは、s[i] == cと、s[i] == 0の判定が成されていないという事ですよね?
しかし、while関数自体は終わってるので、s[i]は判定されている
どういうことなんでしょうか? 」
これにも答えていただけると非常にありがたいです
301デフォルトの名無しさん:2008/02/23(土) 15:04:05
>>296
キャストというのは基本的にマズい処理。
アップキャストだけは例外的に安全だが、
それ以外は基本的にはあまりやるべきではない。

でも、実際にはどうしてもやる必要が出てくる事もある。
こればっかりは仕方が無い。
そういう時、C 風のキャストを使ってしまうと色々と問題が発生する。

・ 間違って危険なキャストをしてしまうかもしれない。
 例えば、const を付けるべきところで const を付け忘れたり。
 こういう時、static_cast なら危険な const の付け忘れがあるとコンパイルエラーになる。
 C 風キャストだと問答無用でキャストされてしまう。
 これが一番の問題。

・ キャストが原因っぽいバグが見つかった時、どこにキャストがあるのか探すのが面倒。
 C++ のキャストだと検索でキャストを行っている箇所を簡単に見つけられる。

・ キャストがあまり目立たない。
 危険な処理を行っている箇所が目立たないのは危険。
 C++ のキャストは非常に目立つ。

・ 打鍵数が少ないので気軽にキャストをしてしまう。
 C++ のキャストは打ち込むのが面倒で、キャストを本当に使うべきなのか
 立ち止まって考えるよう思考を誘導してくれるかもしれない。

・ 今行おうとしているキャストはどういうものかをあまり意識しないかもしれない。
 キャストという処理を軽く見ているのはよろしくない。
302デフォルトの名無しさん:2008/02/23(土) 15:06:01
>>300
gotoが必要になるのは言語の構造化能力を超えた構造が必要になる場合であって、
この場合はそういう場合でない。
303デフォルトの名無しさん:2008/02/23(土) 15:06:12
>>300
論理的に記述しようぜ。
「while を終了する」 と 「指定位置に移動する」 では
前者の方がより論理的だ。
論理的なコードは、一般に変更に強く、バグが出にくい。

まあ、break すらみだりに使うべきじゃないという人もいるけどね。
304デフォルトの名無しさん:2008/02/23(土) 15:07:50
関数の引数で、char * 型とchar []型を判別する方法ありますか?
305デフォルトの名無しさん:2008/02/23(土) 15:09:39
>>304
不可能
306デフォルトの名無しさん:2008/02/23(土) 15:10:05
void foo(char* const& hoge);
template <size_t N> void foo(char (&hoge)[N]);

と区別できなくはない。
307デフォルトの名無しさん:2008/02/23(土) 15:12:02
char[N]とchar[]は別物だと思うよ。
308デフォルトの名無しさん:2008/02/23(土) 15:12:33
void foo(char* hoge, size_t size);
template <size_t N> inline void foo(char (&hoge)[N]) { foo(hoge, N); }

もちろん、こう実装するんだぜ。
309デフォルトの名無しさん:2008/02/23(土) 15:13:12
そう言う意味での char [] 型なんてそもそも存在しないが。
310デフォルトの名無しさん:2008/02/23(土) 15:13:14
>>285
>cuで2が、gguで3が、ijcoで4が返ってきます

その書き方はおかしい
strch_idxには引数が2つあるので、cuとかgguだけでは結果は決まらないはずだ
311デフォルトの名無しさん:2008/02/23(土) 15:13:24
>>300
逆。
gotoの方がどこにでも飛ばせるせいで行き先が不明確になる。

自分の書いたコードを他人に読ませることを想像してごらん。
breakならどこに飛ぶのか一目瞭然だけど、gotoだといちいちラベルを検索しないといけない。
しかもbreakなら「ループの終了」という意図が一目瞭然だけど、
gotoだとどういう意図で飛ばしたのかを考えないといけない。
そういう理由でgotoは避けられるため、安易にgotoが入っているとさらに、
「gotoを使わなければいけないどんな理由があったのか?」と考えさせることになる。
312デフォルトの名無しさん:2008/02/23(土) 15:14:13
int⇔floatの変換だけでも、毎回static_cast使う?
あと、コンテナの最後の要素以外を処理する時、
std::vector<T> container;
for (int n = 0; n < static_cast<int>(container.size()) - 1; ++n) container[n] = ...;
ってやる?
313デフォルトの名無しさん:2008/02/23(土) 15:23:01
>>312
俺はstatic_castを使う
コンテナの方は
for (size_t n = 0; 〜
って書けばいいのでは
本当は std::vector<T>::size_type の方が適切なのかもしれんが
314デフォルトの名無しさん:2008/02/23(土) 15:23:54
>>312
>int⇔floatの変換
うん。
>最後の要素以外を処理
unsigned使う。
315デフォルトの名無しさん:2008/02/23(土) 15:31:10
>int⇔floatの変換だけでも、毎回static_cast使う?
使う。

>コンテナの最後の・・・
for (std::vector<T>::size_type n = 0, size = container.size(); n + 1 < size; ++n) container[n] = ...;
ってやると思う。
符号無しの値を符号付きにキャストするのは基本的に危険だと思う。
316デフォルトの名無しさん:2008/02/23(土) 15:32:52
後者の場合、
if( !c.empty() )
for( size_t n=0; n<c.size()-1; ++n)
で何か問題あるのか?
317デフォルトの名無しさん:2008/02/23(土) 15:34:18
>>316
n + 1 < c.size() で判定すれば empty チェックは要らない。
318デフォルトの名無しさん:2008/02/23(土) 15:36:12
typename 忘れてた。
まあ T をそういう意味で使ってるとは限らないが。
319デフォルトの名無しさん:2008/02/23(土) 15:39:01
>>302 >>303
>>311での説明とほぼ同じという理解でよろしいでしょうか

>>311
gotoよりbreakを使うべきというのは、よく理解でき、納得できました
しかし、怖いというのは一体

>>310
すみませんが、もうすこし噛み砕いて説明願えないでしょうか
const char* sには、任意の文字列が入って、char cで、検索する文字を固定という事ではないんですか?
そのconst char* sにcuですとか、gguですとかが入っているので、これで十分だと考えているのですが
320デフォルトの名無しさん:2008/02/23(土) 15:43:08
>>319
goto はまず特定の状況でしか使われない。
それ以外で使われると混乱するし、
何のために使われているかすぐに分からないので不気味で怖い。
321デフォルトの名無しさん:2008/02/23(土) 15:44:11
>>319
goto は意図が不明確。
goto のあるコードを変更することになった場合、
その意図が 100% 分からなければ、
手を加えて変なことになりかねないので怖い。
322デフォルトの名無しさん:2008/02/23(土) 15:44:56
>>319
一番怖いのは、バグの温床になること。
コードの分かりにくさってのはバグに直結する。
323デフォルトの名無しさん:2008/02/23(土) 15:47:14
>>315
イテレータ使うならこうだな。
前進イテレータでさえあれば、これでいけるはず。

if(! container.empty()) {
 Iter it_next = container.begin();
 ++it_next;
 for(Iter it = container.begin(), end = container.end(); it_next != end; ++it, ++it_next) *it = ...;
}
324デフォルトの名無しさん:2008/02/23(土) 15:52:18
>>319
const char* s が cu でも c の方は
strch_idx("cu", 'c') とか
strch_idx("cu", 'u') とか
strch_idx("cu", 'x') とか色々指定できるわけで
325デフォルトの名無しさん:2008/02/23(土) 15:53:30
>>320-322
なるほど、よく理解できました
ご親切にありがとうございます
1、意図が不明で不気味で怖い
2、バグを招きやすいから怖い
この二点ですね

そして、本筋のほうもできたら説明していただきたいのですが
326デフォルトの名無しさん:2008/02/23(土) 15:53:54
STLつかうとコンパイルに時間かかりますけど、クラスも多少鈍くなるんですか?
327デフォルトの名無しさん:2008/02/23(土) 15:58:00
そもそも while じゃなくて for 使おうぜ。
328デフォルトの名無しさん:2008/02/23(土) 15:58:55
>>326
一般に、コンパイルに時間がかかる方が、
コンパイル時にある程度処理を行ってくれているため、速くなる。
ただ、コードがあまりにも肥大してくると、
キャッシュの効きが悪くなって遅くなる事もある。
329デフォルトの名無しさん:2008/02/23(土) 16:02:03
>>325
いくつか修正したみたいだけど今はどうなってるの?
330デフォルトの名無しさん:2008/02/23(土) 16:05:44
>>324 >>329
最初から全文現すべきでしたね、申し訳ありません
#include <iostream>
using namespace std;

int strch_idx(const char* s, char c)
{
int i = 0;
do {
if(s[i] == c) goto end;
else if(s[i] == 0)
{
i = -1;
break;
}
i++;
} while(s[i]);
return i;
}

int main()
{
cout << "文字列を入力:"; char p[] = ""; cin >> p;
char c = c; cout << strch_idx(p, c);

return 0;
}
>>327
forだと、終了させるための条件が思いつかなかったので、whileにしましたが、やはりforのほうが良い理由があるのでしょうか
331デフォルトの名無しさん:2008/02/23(土) 16:07:30
>>330
>char c = c;
これはなによ
332デフォルトの名無しさん:2008/02/23(土) 16:08:43
>>330
continue した時でもインデックスが増えてくれるのと、
インデックスをなめていく操作を行っているという意図が伝わりやすいのと。

終了条件は while の時と同じでいいじゃん?
333デフォルトの名無しさん:2008/02/23(土) 16:16:31
>>330
goto end ってどこに飛んでるの?
334デフォルトの名無しさん:2008/02/23(土) 16:17:17
>>330
goto endが一個消し忘れ。

×char c = c;
○char c = 'c';

-1を返したいのは文がヌル文字だけだった場合?それとも文字が見つからなかった場合?
前者ならループのたび判定するのは無駄だから最初に一回だけ判定させたらいい。
後者ならヌルが見つかった時点でループが終わってるから中のlese-if節は判定してくれない。
最初に文字列の長さを測って最後までループが回った場合に-1を返すようにしないと。
335デフォルトの名無しさん:2008/02/23(土) 16:26:11
f(x)のあとでstrlen(ch)が1になることがあります もとのソースを簡略にしました
構造体を参照渡ししてもだめでした 下は期待通りの動作をします 何がいけないのかわかりません

#include <string.h>
#include <stdio.h>
typedef struct STRDATA{ char *start; char *end;}strdata;

f(strdata x){
delete x.start;
x.start = new char [20];
strcpy(x.start,"++++++++++++++"); }


main(){
char *ch=new char [10]; strcpy(ch,"uuuu");

strdata x;
x.start=ch; x.end=ch+strlen(ch);
f(x);
printf("%s",ch);}
336デフォルトの名無しさん:2008/02/23(土) 16:26:35
なんで do-while になってるんだろう。
もっと単純に考えようぜ。

まず、文字を1つずつ取得していくループを書く。

for(i = 0; /* 文字列が終了するまで */; i++) {
 /* s[i] で文字を先頭から順番に走査していける */
}

んで次に、c が見つかったらインデックスを返すようにする。

for(i = 0; /* 文字列が終了するまで */; i++) {
 /* s[i] が c なら i を返す */
}

そして、検索しても c が見つからなかった場合は -1 を返す。

for(i = 0; /* 文字列が終了するまで */; i++) {
 /* s[i] が c なら i を返す */
}
/* -1 を返す */

これでおk。
337デフォルトの名無しさん:2008/02/23(土) 16:29:05
>>304

Cならシーキビだろ
C++か?

template<typename T>
struct IsArray {
enum { value = 0 };
};

template<typename T, size_t N>
struct IsArray<T[N]> {
enum { value = 1 };
};

template<typename T>
bool test(const T&) {
return IsArray<T>::value;
}

template<typename T>
void f(const T& t) {
if(test(t)) cout << "配列だ" << endl;
else cout << "配列じゃない" << endl;
}
338デフォルトの名無しさん:2008/02/23(土) 16:29:46
てか、C++ならブースト使えよか
339デフォルトの名無しさん:2008/02/23(土) 16:30:19
>>335
f の呼び出し後、ch は既に delete された後のアドレスを保持することになるから
絶対にアクセスしちゃダメ。

そもそも生のポインタで確保されたメモリを扱ってるからそういう事が起きる。
コンテナ使え。
340デフォルトの名無しさん:2008/02/23(土) 16:30:21
これだとエラーで止まります どうすればいいですか

f(strdata *x){
delete x->start;
x->start = new char [20];
strcpy(x->start,"++++++++++++++"); }


main(){
char *ch=NULL;

strdata x;
x.start=ch; x.end=ch+strlen(ch);
f(&x);
printf("%s",ch);}
341デフォルトの名無しさん:2008/02/23(土) 16:31:18
>>335
chに割り当てたnew char[10]はfの中でdeleteされてるから、
printf("%s",ch) は違法。

それからnew[]した配列はdeleteではなくdelete[]しないといけない。
342デフォルトの名無しさん:2008/02/23(土) 16:34:08
>>340
char *ch=NULL;
x.end=ch+strlen(ch);

ヌルポインタに整数を足しても有効な値にはならない。
343デフォルトの名無しさん:2008/02/23(土) 16:35:22
バイナリ文字列の始めと終わりを構造体で渡して、内容、サイズを書き換えるには
>>335をどう変更すればできますか?
344デフォルトの名無しさん:2008/02/23(土) 16:37:35
普通に先頭のポインタとstrlen使って適当に操作したらいいんちゃう?
345デフォルトの名無しさん:2008/02/23(土) 16:38:25
バイナリ・・・文字列??

それはともかく、std::string 使え。

#include <string>

void f(string& str) {
 str = "++++++++++++++";
}

int main() {
 std::string str("++++");
 printf("%s\n", str.c_str());
 f(str);
 printf("%s\n", str.c_str());
}
346デフォルトの名無しさん:2008/02/23(土) 16:38:32
このふたつは動きますが内容が変化しません なぜですか

f(strdata x){
delete x.start; x.start = new char [20];
strcpy(x.start,"++++"); }


main(){
char *ch=NULL;

strdata x;
x.start=ch;
f(x);
printf("%s",ch);}



f(strdata *x){
delete x->start; x->start = new char [20];
strcpy(x->start,"++++"); }


main(){
char *ch=NULL;

strdata x;
x.start=ch;
f(&x);
printf("%s",ch);}
347デフォルトの名無しさん:2008/02/23(土) 16:38:49
1つ目、std:: 忘れた。
348デフォルトの名無しさん:2008/02/23(土) 16:41:16
C言語だけで、0を含む文字列を変化させたいのですが、できないですか?
349デフォルトの名無しさん:2008/02/23(土) 16:42:49
>>346
ポインタが参照渡しでどうのこうの言ってた奴だよな?
頼むからポインタとは何かを一から勉強し直してくれ。
350デフォルトの名無しさん:2008/02/23(土) 16:44:23
>>346
関数に渡された数値は数値がコピーされただけの別物。
だから関数内でx.start = new char [20];とかやっても呼び出し元のxには変化は無い。
351デフォルトの名無しさん:2008/02/23(土) 16:44:32
f(x)で、(バイナリ)文字列を書き換えられるやり方教えてください それみて勉強します
352デフォルトの名無しさん:2008/02/23(土) 16:45:30
>>351
まともな本読め。
そこにいくらでもサンプルは書いてあるし、
詳細な解説も載ってる。
353デフォルトの名無しさん:2008/02/23(土) 16:46:24
>>350 
後者はアドレス渡しですけど・・・
354デフォルトの名無しさん:2008/02/23(土) 16:47:42
>>353
後者では x は書き換えられるが ch は書き換えられない。
355デフォルトの名無しさん:2008/02/23(土) 16:47:47
>>353
アドレスの指す先の内容を書き換えると呼び出し元へ反映されるというだけのこと。
356デフォルトの名無しさん:2008/02/23(土) 16:50:34
x->start = ch
ってやっても、ch と x->start がリンクされるわけじゃない
x->start の内容が変化しても、chには関係ない
357デフォルトの名無しさん:2008/02/23(土) 16:52:12
これで正解でしょうか?


#include <string.h>
#include <stdio.h>
typedef struct STRDATA{ char **start; char **end;}strdata;

f(strdata x){
delete *(x.start); *(x.start) = new char [20];
strcpy(*(x.start),"++++++++++++++"); }


main(){
char *ch=NULL;

strdata x;
x.start=&ch;
f(x);
printf("%s",ch);}
358デフォルトの名無しさん:2008/02/23(土) 16:52:50
図を描こうぜ。図を。
ch, x, そして動的に確保されたメモリが
実際にメモリ上でどう置かれていてどう参照していて
何を実行するとどう変化するか。
359デフォルトの名無しさん:2008/02/23(土) 16:54:53
>>357
それでとりあえずまともに動くね。
推奨されるコードかと言うとまたそれは別だが。
new 使ってるから C++ なんでしょ? コンテナ使えば楽だぜ。
360デフォルトの名無しさん:2008/02/23(土) 16:58:05
横から質問で申し訳ないんだけど、

・>357のfに渡す前に、xはいつnewされてるの?
・関数の一行目がdeleteって、ものすごく気持ち悪いんだけど、よくつかう手法なの?
361デフォルトの名無しさん:2008/02/23(土) 17:00:09
>>360
deleteにNULLを渡しても何も起こらないことになっているから、
最初にnewされていないというのは大丈夫。エラーにはならない。

最初にdeleteというのは必要に応じて使えばいいと思うけど、
俺も書いた覚えない(clear()とかいかにもそれだけを行う関数というのでもない限り)。
362デフォルトの名無しさん:2008/02/23(土) 17:03:44
サンクス たびたびどうもありがとうございます
363デフォルトの名無しさん:2008/02/23(土) 17:04:30
俺も横レスだけど、配列なのに delete [] にしてないのは問題ないのか?
364デフォルトの名無しさん:2008/02/23(土) 17:04:41
>>363
大問題。
365デフォルトの名無しさん:2008/02/23(土) 17:05:56
だからコンテナを使おうぜと言ってるのに。
366デフォルトの名無しさん:2008/02/23(土) 17:06:16
いろいろな意味で気持ち悪い。というか何をしたいのかよくわからない。
367デフォルトの名無しさん:2008/02/23(土) 17:07:46
>361
>deleteにNULLを渡しても何も起こらないことになっているから、
>最初にnewされていないというのは大丈夫。エラーにはならない。
なるほど、どうもです。

>最初にdeleteというのは必要に応じて使えばいいと思うけど、
>俺も書いた覚えない(clear()とかいかにもそれだけを行う関数というのでもない限り)。
なるほど。
よく考えたらC++になってからnewなんてほとんど使ったこと無かった気がします。
動的な配列が必要になったらだいたいvectorにつっこんでた。
368デフォルトの名無しさん:2008/02/23(土) 17:10:42
clear はメモリが解放される訳じゃないんだよな。
std::vector<int>().swap(v); みたいにしないとメモリは解放できない。
解放した方がいいかどうかは状況次第だが。
369デフォルトの名無しさん:2008/02/23(土) 17:32:26
>>364
大問題ってことで軽くググってみたら、
・配列に対して、delete [] としなかった場合、1個目の要素のみデストラクタが走り、残りの要素は走らない
・確保された領域(配列)は一応開放される(デストラクタで開放されるべき領域は除く)が、
 要素数保持のための隠れた確保領域は開放されずに残る

ってな、感じかな
370デフォルトの名無しさん:2008/02/23(土) 17:37:02
勘違いしてないか?タスクマネージャで確認してみ


#include <stdio.h>
main(){
char *ch=new char[200*1024*1024];
getchar();
printf("delete 実行\n");
delete ch;
getchar();}
371デフォルトの名無しさん:2008/02/23(土) 17:40:15
これでも解放するし

#include <stdio.h>

main(){
int n;
char **ch=new char*[200];
for(n=0;n<200;n++)ch[n]=new char [1024*1024];
getchar();
printf("delete 実行\n");
for(n=0;n<200;n++)delete ch[n];
getchar();}
372デフォルトの名無しさん:2008/02/23(土) 17:42:39
>>331
strch_idx関数に渡すためのcを、main関数のほうで作っておかないとだめかなと考えまして

>>332
あまり理解できませんが、なるべくforを使うようにします

>>333
消し忘れです
ご指摘ありがとうございます

>>334
理屈を丁寧に解説していただきありがとうございました
>>336を参考にやってみて、できました

>>336
ご丁寧にありがとうございました
その指針でできました


最後にご丁寧に、教えるのもわずらわしいような初歩的な愚問に答えていただき、ありがとうございました
373デフォルトの名無しさん:2008/02/23(土) 17:44:35
これが初心者歓迎スレの良心。
374デフォルトの名無しさん:2008/02/23(土) 17:47:40
>>370
>>371
特に勘違いしてるところはないと思うが・・・

要素数を保持する領域はないってことを言いたいのか?
組み込み型にはないけど、クラスにはあるみたいなことが書いてあったんだが
375デフォルトの名無しさん:2008/02/23(土) 17:49:37
これだと解放しないけど・・・ *xと定義されているなら、deleteを使うのでは? []は**xを解放する場合でしょ

#include <stdio.h>
main(){
char **ch=new char*[200];
for(int n=0;n<200;n++)ch[n]=new char [1024*1024];
getchar(); printf("delete 実行\n");
delete[] ch; // delete ch;
getchar();}
376デフォルトの名無しさん:2008/02/23(土) 17:50:41
>>369
そもそもnew[]したものをdeleteするとどうなるかは未定義。
そういう挙動になったという話は、たまたまその実装ではそうだったということでしかない。
377231:2008/02/23(土) 17:51:43
今更ですが>>231のようなことをした時に
MyArrayの方はデフォルトコンストラクタか引数を省略できるコンストラクタを
呼んでいるようなのですが、これのタイミングが分かりません。
コンストラクタを通過するそぶりもないし、一応初期化はされてるっぽいし・・・
特にデストラクタのタイミングも分からないのが心配です。
いつ開放されるんでしょうか?
378デフォルトの名無しさん:2008/02/23(土) 17:54:33
>>377
どこかでnew[]やdelete[]しているだろ?そのときだ。
379デフォルトの名無しさん:2008/02/23(土) 18:04:57
>>375
newで割り当てたものはdelete、new[]で割り当てたものはdelete[]で解放します。参照の深さは関係ありません。
380デフォルトの名無しさん:2008/02/23(土) 18:12:04
終端をセットしたいのですがどうやったらいいですか? コンパイルが通りません

main(){
char *ch=new char [50];
char **start, **end;

start=&ch; //これは成功します

end=&&ch[20];
// end=&(ch+20);

}
381デフォルトの名無しさん:2008/02/23(土) 18:24:57
ch と &ch[0]は同じアドレスを表しますよね 20個目のアドレスは、&ch[20]ですよね
それを参照渡ししようとしたら&&ch[20]のはず・・・
382デフォルトの名無しさん:2008/02/23(土) 18:26:38
char * chend = &ch[20];
end = &chend;
383デフォルトの名無しさん:2008/02/23(土) 18:33:33
>>382
コンパイルはできましたが、startと動作が違うようです 

main(){
char *ch=new char [50]; strcpy(ch,"abcdef");

char **start, **end;

start=&ch;

char * chend = &ch[20];
end = &chend;


printf("%c\n", ((*start+1)[2]) );

printf("%c\n", ((*end-5)[2]) );
}
384デフォルトの名無しさん:2008/02/23(土) 18:34:48
間違えました 20個を定義していませんでした
これだとうまくいきました サンクス

char * chend = &ch[6];
end = &chend;


printf("%c\n", ((*start+1)[2]) );
printf("%c\n", ((*end-5)[2]) );
385デフォルトの名無しさん:2008/02/23(土) 18:38:15
なぜ「end = &&ch[20];」というか「end = &(&ch[20]);」ができないかは理解しておいてね。
386デフォルトの名無しさん:2008/02/23(土) 18:41:41
再使用できるように動的確保したら複雑になってきました・・・

main(){
char *ch=new char [50]; strcpy(ch,"abcdef");
char **start, **end;
start=&ch;
char **chend =new char *;
*chend=&ch[6];
end = &(*chend);
printf("%c\n", ((*end-5)[2]) );
}
387デフォルトの名無しさん:2008/02/23(土) 18:43:04
先ずお前はnewを使うのをやめろ。話はそれからだ。
388デフォルトの名無しさん:2008/02/23(土) 19:53:27
これはひどい
389デフォルトの名無しさん:2008/02/23(土) 20:04:00
何がしたのか全然わからない
390デフォルトの名無しさん:2008/02/23(土) 20:04:21
何度基礎をやり直せと言ったことか
391デフォルトの名無しさん:2008/02/23(土) 20:26:55
なぜ、再使用しようとすると動的確保することになるのかもわからない。
文章で理由を説明してほしい。
392デフォルトの名無しさん:2008/02/23(土) 20:36:55
なるほど、stringが出来るわけだ
393デフォルトの名無しさん:2008/02/23(土) 20:53:56
おまえらほんと我慢強いよな。感心するよ
俺は>>386と同レベルのコードを保守する羽目になって殺意を覚えた。
394デフォルトの名無しさん:2008/02/23(土) 21:00:35
我慢強いというか、読んでない
395デフォルトの名無しさん:2008/02/23(土) 21:02:02
C++の授業で先生が、
int main() {
int i;
cin>>i;
double a[i];
...
というコードはC++では出来ない(やりたいならnewでやるべき)と言われたのですが、
g++とiccではできました。これってだめだけど、gccやiccの拡張機能によって
できているのでしょうか?

396デフォルトの名無しさん:2008/02/23(土) 21:04:05
>>395
C++ が変化し続けているだけの話
397デフォルトの名無しさん:2008/02/23(土) 21:09:33
>>395
現状のC++標準規格じゃ無理。C99は可能。
C99サポートしてるコンパイラなら期待してもいい。
398デフォルトの名無しさん:2008/02/23(土) 21:11:02
newも使うべきではないよな。いやnew[]ではなくてstd::vector。
399デフォルトの名無しさん:2008/02/23(土) 21:13:17
C99は正直あんまやらないでほしい
400デフォルトの名無しさん:2008/02/23(土) 21:18:40
可変引数マクロはマジホシス
401デフォルトの名無しさん:2008/02/23(土) 21:24:18
0xでおk
402デフォルトの名無しさん:2008/02/23(土) 21:35:03
おしえてください  下から2行目を動かすとデータが壊れるのですが原因がわかりません

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct STRDATA{ char **st; char **end; }strdata;

f(strdata x){ printf("%s",*(x.st)); }

strconv(strdata *q, char **p){
char **chend =(char **)malloc(sizeof(char **));
q->st=p;
*chend=&(*p)[strlen(*p)];
q->end = &(*chend);}

strconstconv(strdata *q, char *p){
int n=strlen(p);
char *ch=(char *) malloc(n+1);
strcpy(ch,p);
q->st=&ch;
char **chen =(char **)malloc(sizeof(char **));
*chen=&(ch[n]); q->end = &(*chen);}

main(){
strdata str;
#define STR "abcdefgh"
strconstconv(&str, STR); //ここをコメントアウトして一つ下を動かしても平気です
//char *ch=new char [50]; strcpy(ch,STR); strconv(&str,&ch);
//char *x=new char [1];  ここを動かすとおかしくなります
f(str); }
403デフォルトの名無しさん:2008/02/23(土) 21:37:15
もうお前いい加減諦めたら。

ローカル変数のアドレスを関数外に持ち出すな。
404デフォルトの名無しさん:2008/02/23(土) 21:39:05
char *x=new char [1]; が、なぜstrdata strを書き換えられるんでしょうか?
405デフォルトの名無しさん:2008/02/23(土) 21:39:21
なんかまぁ・・・・・・いろいろとおつかれさん
406402:2008/02/23(土) 21:45:20
おなじやつですが短くしました 下から2行目を動かすと壊れるのはなぜでしょうか

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct STRDATA{ char **st; char **end; }strdata;

f(strdata zzz){ printf("%s",*(zzz.st)); }

strconstconv(strdata *q, char *p){
int n=strlen(p);
char *ch=(char *) malloc(n+1);
char **chen =(char **)malloc(sizeof(char **));
strcpy(ch,p);
q->st=&ch;
*chen=&(ch[n]); q->end = &(*chen);}

main(){
strdata str;
strconstconv(&str, "abcdefgh");
// char *test=new char [1];
f(str); }
407デフォルトの名無しさん:2008/02/23(土) 21:46:36
まず変数のスコープを勉強しよう
408402:2008/02/23(土) 21:48:09
なぜコメントアウトを外すとデータがこわれますか?
409デフォルトの名無しさん:2008/02/23(土) 21:53:31
newやmallocの確保は、解放しない限り残るんですよね そのアドレスは参照で受け取っているので問題ないと思うのですが
参照渡しにしてもだめです

f(strdata *zzz){ printf("%s",*(zzz->st)); }

main(){
strdata str;
strconstconv(&str, "abcdefgh");
f(&str); }
410デフォルトの名無しさん:2008/02/23(土) 21:54:33
基礎からやりなおせよ
411デフォルトの名無しさん:2008/02/23(土) 21:56:58
ヒントください
412デフォルトの名無しさん:2008/02/23(土) 21:57:01
いいから基礎からやりなおせって。スタックとヒープの概念すら分かってないだろ。
413デフォルトの名無しさん:2008/02/23(土) 21:57:11
>>409
トリップをつけてくれるとあぼーんしやすいのですがいかがでしょうか
414デフォルトの名無しさん:2008/02/23(土) 22:00:25
スタックとかヒープとか、この際関係ないレベルじゃん
415デフォルトの名無しさん:2008/02/23(土) 22:02:39
より短くしました これでも外すと壊れます なぜですか?

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct { char **st; char **end; }strdata;

f(strdata *q){
char *ch=(char *) malloc(10);
strcpy(ch,"abcdef");
q->st=&ch; }

g(strdata *zzz){ printf("%s",*(zzz->st)); }

main(){
strdata str; f(&str);
//char *test=new char [1];
g(&str); }
416デフォルトの名無しさん:2008/02/23(土) 22:03:36
>>409
多少手を入れて(int mainとするとか)こっちで動かしてみましたが、ちゃんとabcdefghと表示されました。

でも、newだけc++の機能をつかってるけど、あとは全部(結構年季が入った感じの)cだし、
c++のコンパイラなら、関数の戻り値を指定しないのはダメだと思うし、
mallocとnew は併用したらダメだってどこかで聞いたけどな。

いまいちやろうとしていることの意図がつかめません。
(mallocとnewを併用して、どういう状況でまずいのかしらべようとしているのか)

もしc++を勉強しようとしているなら、なにか適当な本とかで勉強するのを勧めます。
Cを上記くらいご存知なら、すぐにC++も使えるようになりますよ。
417デフォルトの名無しさん:2008/02/23(土) 22:03:53
ヒントもなにも>>403がずばり回答してるんだが。
これでもわからないなら、なんでもいいからポインタの無い言語に行ってくれ。
そして帰ってくんな。
418デフォルトの名無しさん:2008/02/23(土) 22:08:06
>>415
なんでお前は答えを貰っても全くレスポンスを返さずに、
そんなヘドロみたいなコードを貼り続けるんだ。

頭沸いてるのか
419デフォルトの名無しさん:2008/02/23(土) 22:08:35
>>415
これなら動く。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
    char *st;
    char *end;
} strdata;

void f(strdata *q) {
    char *ch=(char *)malloc(10);
    strcpy(ch,"abcdef");
    q->st = ch;
}

void g(strdata *zzz) {
    printf("%s", zzz->st));
}

int main() {
    strdata str;
    f(&str);
    g(&str);

    return 0;
}
420デフォルトの名無しさん:2008/02/23(土) 22:11:12
>>419
おまいやさしいな
421デフォルトの名無しさん:2008/02/23(土) 22:14:15
>>419
それだと、ポインタは値渡しのため、strに渡した文字列が書き換えられなくなります 
削ったのですがこれでも原因が不明です コンパイラはBCC5.5です

#include <stdio.h>
#include <stdlib.h>
typedef struct { char **st; }strdata;

f(strdata *q){
char *ch=(char *) malloc(10);
ch[0]='X';ch[1]='Y';ch[2]='Z';ch[3]=0;
q->st=&ch; }

main(){
strdata str; f(&str);
//char *test=(char *) malloc(1);
printf("%s",*(str.st));}
422デフォルトの名無しさん:2008/02/23(土) 22:17:54
>それだと、ポインタは値渡しのため、strに渡した文字列が書き換えられなくなります 

( ゚д゚) ・・・
 
(つд⊂)ゴシゴシ
 
(;゚д゚) ・・・
 
(つд⊂)ゴシゴシゴシ
  _, ._
(;゚ Д゚) …!?
423デフォルトの名無しさん:2008/02/23(土) 22:17:55
419でどこの文字列がどう書き換えられないっていうんだ言ってみろ
424デフォルトの名無しさん:2008/02/23(土) 22:20:55
VCCやGCCやDMCでも実行中にエラーになります

#include <stdio.h>
#include <stdlib.h>
typedef struct { char **st; }strdata;

void f(strdata *q){
char *ch=(char *) malloc(10);
ch[0]='X';ch[1]='Y';ch[2]='Z';ch[3]=0;
q->st=&ch; }

int main(){
strdata str;
char *test;
f(&str);
test=(char *)malloc(1);
printf("%s",*(str.st));
getchar(); return 0;}
425デフォルトの名無しさん:2008/02/23(土) 22:21:34
>>421
>それだと、ポインタは値渡しのため、strに渡した文字列が書き換えられなくなります 
wwwwwwwwwwwwwwwwwwwwwww
>>419よ、これが現実だwwwwwアホは相手にするなwwwwww
426デフォルトの名無しさん:2008/02/23(土) 22:22:15
ぶっちゃけポインタ全く理解してないだろ。
427421:2008/02/23(土) 22:26:27
誤解していましたすみません 
428デフォルトの名無しさん:2008/02/23(土) 22:28:05
さすがに・・・

初心者を抜け出した程度の俺でも酷いと思うw
429デフォルトの名無しさん:2008/02/23(土) 22:28:08
>>424
変数testの用途が不明だったので、削除させてもらった。

#include <stdio.h>
#include <stdlib.h>
typedef struct {
    char *st;
}strdata;

void f(strdata *q) {
    char *ch = (char *)malloc(10);
    ch[0] = 'X';
    ch[1] = 'Y';
    ch[2] = 'Z';
    ch[3] = '\0'; //まあ0のままでもいいんだけど
    q->st = ch;
}

int main() {
    strdata str;
    f(&str);
    printf("%s", str.st);
    getchar();
    free(str.st);
    return 0;
}
430421:2008/02/23(土) 22:28:56
すみません 誤解していませんでした 書き換えられません

#include <string.h>
#include <stdio.h>
typedef struct { char *st; }strdata;

f(strdata *x){
delete x->st;
x->st = new char [9];
strcpy(x->st,"++++++"); }

main(){
char *ch=NULL;
strdata x;
x.st=ch;
f(&x);
printf("%s",ch);}
431デフォルトの名無しさん:2008/02/23(土) 22:34:49
>>430
お前が421や424で書いたコードは
>printf("%s",*(str.st)); 
だったのになぜ
>printf("%s",ch);
になってるんだ?納得のいく説明を聞こうか?
432デフォルトの名無しさん:2008/02/23(土) 22:34:55
>>429
int main() {
strdata str;
f(&str); ←ここで初期化された文字列の内容、長さを変更したいんです あと変数testほ確保しても落ちないようにしたいんです
printf("%s", str.st);

みなさんは、>>424はまともに動きますか?
433デフォルトの名無しさん:2008/02/23(土) 22:37:26
>>432
動かすまでもなく、まともに動かないのは分かる
434430:2008/02/23(土) 22:37:28
>>335>>343>>348>>351がもともとの質問でこれを実現したいんです
435デフォルトの名無しさん:2008/02/23(土) 22:37:36
>>430
printf("%s",ch);をprintf("%s",x.st);とすればいい。
嫌か?
じゃあこれでどうだ。
#include <string.h>
#include <stdio.h>
typedef struct {
    char *st;
} strdata;

void f(strdata *x) {
    delete x->st;
    x->st = new char[9];
    strcpy(x->st,"++++++");
}

int main() {
    char *ch = NULL;
    strdata x;
    x.st = ch;
    f(&x);
    ch = x.st;
    printf("%s",ch);
    delete[] ch;

    return 0;
}
436デフォルトの名無しさん:2008/02/23(土) 22:39:36
>>433
test=(char *)malloc(1);をはずすと上手くいきます なぜですか
437デフォルトの名無しさん:2008/02/23(土) 22:40:58
>>436
それは上手く動いてるんじゃなくて、たまたま動いてるだけ
438デフォルトの名無しさん:2008/02/23(土) 22:41:46
>>335
をチラ見しかしてないけどそれが動くことがとても不思議。
とりあえず期待する動作はなんなのかを日本語で書いてください。
439デフォルトの名無しさん:2008/02/23(土) 22:42:06
>>435
それだと始めにchが巨大に確保されていたらメモリーリークになると思うのですが
440デフォルトの名無しさん:2008/02/23(土) 22:43:20
>>436
偶然。

あのコードでは、すでになくなったローカル変数を読み取ろうとしている。
運良くメモリ上に残っていれば、一見正しく動いているように見える。
そのtestの行は、残っていた変数の値を破壊する決定打になったのだろう。
441デフォルトの名無しさん:2008/02/23(土) 22:43:21
>>439
思うだけだ
442デフォルトの名無しさん:2008/02/23(土) 22:44:24
見る気もしない。
高速スクロールで華麗にスルー。
違うお題ないの?
443デフォルトの名無しさん:2008/02/23(土) 22:46:11
Perlで言うところの

use LWP::Simple;
sub foo{ return get('ttp://hoge.com/fuga.zip'); }

これをVC++で極力シンプルにやるにはどうすればいいでしょうか?
環境は以下のとおりです。

VisualC++.net2003 Standard
managedC++不使用 MFC不使用 ATL/WTL使用 STL/Boost使用
444デフォルトの名無しさん:2008/02/23(土) 22:46:57
>>438
バイナリ文字列 (\0を含む) の初めと終わりを構造体で関数に渡して、バイナリ文字列の内容、長さを書き換えたいんです
445444:2008/02/23(土) 22:48:45
純粋なC言語だけでそれを実現したいんです 
446デフォルトの名無しさん:2008/02/23(土) 22:49:59
>>445

一般的に知られている C言語の定義とは違うものを扱ってらっしゃるのですね
447デフォルトの名無しさん:2008/02/23(土) 22:50:53
最終的には、C言語のみにしますけど今は実験段階なので・・・
448デフォルトの名無しさん:2008/02/23(土) 22:52:02
>>444
なんでchとかtestとか別の変数が出てくるの?
構造体のまま扱い続ければいいでしょ。
449443:2008/02/23(土) 22:54:26
>>443
単純にC++でネット上のものをダウンロードさせるには
どうすればいいですか?って聞くべきだった orz
450デフォルトの名無しさん:2008/02/23(土) 22:55:14
chは現物の文字列です この初めと終わりのアドレスを構造体で渡して変化させるようにしたいんです
451デフォルトの名無しさん:2008/02/23(土) 22:55:32
本でも読んで出直してこいよ
本格的に他人に頼りたいなら金でも払え
452デフォルトの名無しさん:2008/02/23(土) 22:59:15
現物の文字列ってなんだよ
ただのポインタだろ
str.st と等価だ
453デフォルトの名無しさん:2008/02/23(土) 23:01:55
たとえば、
char *ch=new char [100]; strcpy(ch, "---------");
という文字列に対して、その先頭と後方のアドレスを関数に渡して、関数側で書き換えられるようにしたいんです
454デフォルトの名無しさん:2008/02/23(土) 23:04:50
何にそんなもんをつかうんかわからんが
とりあえずそんなことを考える前に
入門書なりきちんと読め。
たのむから
455デフォルトの名無しさん:2008/02/23(土) 23:09:26
初めの文字列が200M程度確保されていたとして作業領域も200M使うとします
このとき初めの文字列を解放するか、上書きすれば最高でも400Mしかメモリを使いません
しかし、それができずに返却すると最大 200M + 200M + 200M必要になります
456デフォルトの名無しさん:2008/02/23(土) 23:11:03
>>449
ソケット使ってカリカリやるしか思いつかん
457デフォルトの名無しさん:2008/02/23(土) 23:11:12
>>443
手軽さならWinInet
真剣にやるならWinsock
458デフォルトの名無しさん:2008/02/23(土) 23:13:38
>>450
435みたいに、構造体で渡した後、元の変数に代入し直せばいい。
459デフォルトの名無しさん:2008/02/23(土) 23:15:30
もはやポインタいらんがなw
460デフォルトの名無しさん:2008/02/23(土) 23:19:19
文字列ではなく、1byte変数の配列を可変長で扱いたいと。
だったら、
typedef struct {
char *baka;
size_t length;
} aho;

とでもして、構造体をやり取りすればいいだろ。
C++だったら、vector<char>、deque<char>でも使えや。
461443:2008/02/23(土) 23:20:13
WinInetででググったらいっぱい出てきたんで調べてみる。
サンクス
462デフォルトの名無しさん:2008/02/23(土) 23:20:26
>>443
URLDownloadToFile
463デフォルトの名無しさん:2008/02/23(土) 23:26:44
>>458
なぜ直接書き換えられないのかわかりません
464デフォルトの名無しさん:2008/02/23(土) 23:29:10
>>463
こっちからしてみたら、なんで構造体を使いたくないのかわからない。
465デフォルトの名無しさん:2008/02/23(土) 23:29:25
>>463
もっと勉強してから出直せ
466デフォルトの名無しさん:2008/02/23(土) 23:40:17
もともと構造体は使っていますよ あとC言語のみで動かせるようにしたいんです
開始のアドレスと長さを渡しても上と同じだと思います
467デフォルトの名無しさん:2008/02/23(土) 23:41:34
あぼーんしたいからトリップつけてくれ
468デフォルトの名無しさん:2008/02/23(土) 23:44:18
たぶんトリのつけ方を知らない。
「名前欄にレス番つけること」すら今日知ったっぽい
469デフォルトの名無しさん:2008/02/23(土) 23:44:39
釣りだろう
470デフォルトの名無しさん:2008/02/23(土) 23:46:32
文字列を入力して、
表示するとき右から3文字ごとにコンマをつける方法ってどうすれば?
(例:入力>>344fru38fh4tgiur
   出力>>3,44f,ru3,8fh,4tg,iur)
この続きお願いします・・
#include <iostream.h>
main()
{
char a[50] ;
cout <<"aに文字を入力してください>>" ;
cin.getline(a, 50) ;

int a_count = 0 ;
while( a[a_count] != '\0'){
a_count++ ;
}

cout <<"aを表示します→" ;
for(int i=0 ; i<a_count ; i++){
cout << a[i] ;
}
}
471デフォルトの名無しさん:2008/02/23(土) 23:48:55
これがたまたまうまく動いたりしますが、実際は間違っているから困っているんです

#include <stdio.h>
#include <string.h>
typedef struct { char *start ; char *end; } bin;

void f(bin *x) {
delete x->start;
x->start = new char [3];
strcpy(x->start,"aa"); }

main() {
char *ch = new char [2];
strcpy(ch,"a");
bin x;
x.start=ch; x.end=ch+strlen(ch);
f(&x);
printf("%s",ch);
}
472デフォルトの名無しさん:2008/02/23(土) 23:50:11
473デフォルトの名無しさん:2008/02/23(土) 23:53:13
x.start=ch; とした時点で、数値がコピーされるだけになり、文字列を書き換えられなくなります
だから x.start=&ch;と参照渡しをするために
構造体を { char **start ; char **end; }に変更します
そうすると上記のような現象が出ます
474デフォルトの名無しさん:2008/02/23(土) 23:53:48
>>471
f(&x);
ch=x.start;
printf("%s",ch);
でいいだろ
って・・・釣られちまったよ〜〜〜〜ん
475デフォルトの名無しさん:2008/02/23(土) 23:56:53
>>473
fを呼んだあとのchが指す先はfの中でdeleteされていることに気づいているか?
476475:2008/02/23(土) 23:57:42
×>>473
>>471
477デフォルトの名無しさん:2008/02/24(日) 00:03:07
>>475
>>471ではdeleteやnewが効かない場合があるんです これはちゃんと表示されますか?

#include <stdio.h>
#include <string.h>
typedef struct { char *start ; char *end; } bin;

void f(bin *x) {
delete x->start;
x->start = new char [3];
strcpy(x->start,"aa"); }

main() {
char *ch = NULL;
bin x;
x.start=ch;
f(&x);
printf("%s",ch);}
478デフォルトの名無しさん:2008/02/24(日) 00:06:58
Cで動くようにしたいとかホザいておきながら、new や deleteを使うバカ
しかも、

baka = new aho[shine];

としたら

delete []baka;

とすることしら知らないバカ。
マニュアルでも読め
479デフォルトの名無しさん:2008/02/24(日) 00:07:28
>>477
じゃあもういいから、こうしとけ
#include <stdio.h> 
#include <string.h> 
typedef struct { char **start ; char **end; } bin; 

void f(bin *x) { 
delete[] *x->start; 
*x->start = new char [3]; 
strcpy(*x->start,"aa"); } 

void g(bin *x) {
delete[] *x->start; 
*x->start = new char [3]; 
strcpy(*x->start,"bb"); } 

main() { 
char *ch = NULL; 
bin x; 
x.start=&ch; 
f(&x); 
printf("%s",ch);
g(&x); 
printf("%s",ch);
}
これで終了、もう来るな
480デフォルトの名無しさん:2008/02/24(日) 00:08:23
>>477
deleteもnewも効いているはずだよ?

・chが指す先をdeleteしようが、x->start=new・・・をしようが、chの中身は変わらない。
・deleteしても絶対に書き込めなくなるとは限らない。

これらは理解している?
481not 477:2008/02/24(日) 00:10:08
>>478
あ・・・そういえばdelete []baka;としないといけなかったんだ・・・・
C厨ですまん。
482デフォルトの名無しさん:2008/02/24(日) 00:15:24
構造体はCでないというつもりか?
483デフォルトの名無しさん:2008/02/24(日) 00:17:32
>>477
main関数内、chだけに注目すれば、
chはNULLで初期化された後、一切変更を受けないだろ。
printfにNULLを渡しているので、未定義。
484デフォルトの名無しさん:2008/02/24(日) 00:18:48
>>479
それだと、 bin x;を初期化する関数と、適当な配列を入れるとバグるんです なんでうごかないんですか

#include <stdio.h>
#include <string.h>
typedef struct { char **start ; char **end; } bin;

void f(bin *x) {
delete[] *x->start;
*x->start = new char [3];
strcpy(*x->start,"aa"); }

void h(bin *x){
char *ch=new char [3];
ch[0]='X';ch[1]=0;
x->start=&ch; }

main() {
bin x;
h(&x);
f(&x);
char *test=new char [1];
printf("%s",*(x.start));
}
485デフォルトの名無しさん:2008/02/24(日) 00:23:27
バグるじゃ分らんだろ。
486デフォルトの名無しさん:2008/02/24(日) 00:24:02
>>484
h内のローカル変数chのアドレスをx->startに格納しているが、
chはhを抜けると無くなるので、x->startは存在しない場所を指している。
487デフォルトの名無しさん:2008/02/24(日) 00:24:26
>>484
じゃあこれでいいだろう
#include <stdio.h> 
#include <string.h> 
typedef struct { char **start ; char **end; } bin; 

void f(bin *x) { 
delete[] *x->start; 
*x->start = new char [3]; 
strcpy(*x->start,"aa"); } 

char *ch;
void h(bin *x){ 
ch=new char [3]; 
ch[0]='X';ch[1]=0; 
x->start=&ch; } 

main() { 
bin x; 
h(&x); 
f(&x); 
char *test=new char [1]; 
printf("%s",*(x.start)); 
}
488デフォルトの名無しさん:2008/02/24(日) 00:25:03
char *test=new char [1];をのぞくと、bcc5.5では動作します
ほかのコンパイラでは、入れなくても実行時に落ちます 原因は何ですか?
489デフォルトの名無しさん:2008/02/24(日) 00:25:46
いいように使われてるぞ、デバッグ隊w
490デフォルトの名無しさん:2008/02/24(日) 00:27:01
>>488
原因はchがローカル変数だからだ
491デフォルトの名無しさん:2008/02/24(日) 00:27:09
>>488
OSが落ちろ!!って指令を下すからじゃないかな?
492デフォルトの名無しさん:2008/02/24(日) 00:27:09
おまいらまだ付き合ってやってんのか
こいつ分かってるけど、分からないフリしてるだけだろ
493デフォルトの名無しさん:2008/02/24(日) 00:28:09
>>492
こっちも暇だからね
494デフォルトの名無しさん:2008/02/24(日) 00:28:54
バカは放置汁。
最初の例から考えると、文字列定数や、文字配列をもdeleteしようとしてるんだから。
495デフォルトの名無しさん:2008/02/24(日) 00:30:19
>>486>>487
しかし、これはどのコンパイラでも正常に動きませんか? C++ですが

#include <stdio.h>
#include <string.h>

void h(char *&x){
char *ch=new char [11];
strcpy(ch,"ABCDEFGHIJ");
x=ch; }

main() {
char *x;
h(x); printf("%s",x); }
496デフォルトの名無しさん:2008/02/24(日) 00:31:31
>>495
それが動くのはchar*&だからだ
497デフォルトの名無しさん:2008/02/24(日) 00:32:23
>>495
うん。それはローカル変数アドレスを取る(ポインタを取る、参照を取る)
ということをやっていないから問題ない。
498デフォルトの名無しさん:2008/02/24(日) 00:33:28
>>495
そのhは、chの「値」をコピーしているので、
chが無くなっても値はxに格納されているから動く。
>>484はchの「アドレス」を格納しているだけ。
499デフォルトの名無しさん:2008/02/24(日) 00:33:34
>>488
プログラミングは諦めたほうがいい
1.簡単な事をややこしくして
2.バグを入れて
3.聞きまくることで他人の邪魔をする

別の仕事探せ

少なくともオレはそれを勉強熱心とはいえない
500デフォルトの名無しさん:2008/02/24(日) 00:41:03
だから、バカは放置だって。
手段に固執して、何の目的でそのイミフな手段をとろうとしているのか自分でわかってない。
501デフォルトの名無しさん:2008/02/24(日) 00:41:58
確認したいのですが、newは、deleteするかプログラムが終了するまで解放されないはずですよね?
タスクマネージャで確認するとf()を抜けてもメモリはそのままです

#include <stdio.h>

f(){
char *x=new char [200*1024*1024]; }


main() {
f();
getchar();
}
502デフォルトの名無しさん:2008/02/24(日) 00:42:13
>>495
ちなみに、それをポインタを使って書き直すとこうなる。
#include <stdio.h>
#include <string.h>

void h(char **x) {
    char *ch = new char[11];
    strcpy(ch, "ABCDEFGHIJ");
    *x = ch;
}

int main() {
    char *x;
    h(&x);
    printf("%s",x);

    return 0;
}
503デフォルトの名無しさん:2008/02/24(日) 00:43:28
だからローカルで定義された変数や配列でも、そのアドレスが判明していれば、main()などで操ったり解放できますよね
504デフォルトの名無しさん:2008/02/24(日) 00:46:04
>>503
マニュアル嫁
ヒープの意味を理解してからnew や delete を使え。
変数の記憶クラスを理解しろ
505デフォルトの名無しさん:2008/02/24(日) 00:47:43
ローカル定義は外に抜けたら、内容が残っている保証はない
allocしたなら残っているけど
506デフォルトの名無しさん:2008/02/24(日) 00:48:18
>>503
だからの前後が繋がってないぞ
newした領域がdeleteされるまで解放されなかったら
なぜローカルで定義された変数や配列をmainから操れることになるんだ
507デフォルトの名無しさん:2008/02/24(日) 00:49:11
なぜですか? 間違っていないと思いますよ これはmain()側で解放してます

#include <stdio.h>
#include <string.h>

void h(char **x) {
char *ch = new char[200*1024*1024];
*x = ch; }

main() {
char *x;
h(&x);
getchar();
delete x;
getchar();}
508デフォルトの名無しさん:2008/02/24(日) 00:52:46
>>507
それはhのローカルで定義された変数chをmainから操ってるわけではないな
単にnewした領域へのポインタchをmainのxにコピーして渡してるだけだ
509デフォルトの名無しさん:2008/02/24(日) 00:54:23
一度目のキー入力で、200M分メモリを解放しますよ タスクマネージャみてください
510デフォルトの名無しさん:2008/02/24(日) 00:54:39
伸びがいいから何かと思ったら未だ相手にしてたのか。
511デフォルトの名無しさん:2008/02/24(日) 00:55:37
>>507
newで確保したメモリへのポインタをmainに連れて行っているだけ。
newやmallocで確保したメモリはソース上のスコープに縛られずに使える。

一方、>>484では、x->start=&ch;というように、
ローカル変数へのポインタをmainへ持って行っている。
しかし、mainに戻ったときには既に変数chそのものが居なくなっているのでうまくいかない。
512デフォルトの名無しさん:2008/02/24(日) 00:56:05
見事な無自覚の自己中心主義だな、早く治せよ

>>507
なにしてるかわかってるならいいけど、ポインタ一回お浚いしたら?
513デフォルトの名無しさん:2008/02/24(日) 00:56:26
>>507
あんたはnewで確保した領域と、それを指すポインタ変数を、同一のものであると勘違いしてないか?
>>507のコードでも、ポインタ変数chはhを抜ける時に消滅するのは分かるか?
514デフォルトの名無しさん:2008/02/24(日) 01:00:53
まずchar *x の xは、int xや float xと同じで、ただのローカル変数であることを覚えとけ
515デフォルトの名無しさん:2008/02/24(日) 01:04:18
しかしこれは動きません

#include <stdio.h>
#include <string.h>
typedef struct { char **start ; char **end; } bin;

void h(bin *x){
char *ch = new char[11];
strcpy(ch, "ABCDEFGHIJ");
*(x->start)=ch; }

main() {
bin x;
h(&x);
printf("%s",*(x.start));
}
516デフォルトの名無しさん:2008/02/24(日) 01:04:59
>
517デフォルトの名無しさん:2008/02/24(日) 01:05:04
free(p)ってやるとpがNULLになるとか思っちゃう人なのかな。
518デフォルトの名無しさん:2008/02/24(日) 01:05:45
お前らバカの相手すんなって。つけあがるから。
519デフォルトの名無しさん:2008/02/24(日) 01:06:51
>>515
x->startをまったく初期化しないまま、*(x->start)なんかに代入しているのが間違い。
>>513に答えろ
520デフォルトの名無しさん:2008/02/24(日) 01:08:18
俺結構ポインタの理解があやふやで、だからなるべくポインタのややこしい部分には触れないプログラム今までしてきたんだけど、
このスレ読んだらなんとなく理解できてきた気がする。
C言語でnewとdeleteを使い続けてる人ありがとう!
あと、もちろん解説してくれてるみんなもありがとう!
明日からもstringばりばり使っていこうと思います。
521デフォルトの名無しさん:2008/02/24(日) 01:09:24
>>515
そうだね、それは動かないね
だから?
何を聞きたいのか明確に
522デフォルトの名無しさん:2008/02/24(日) 01:09:53
ポインタ変数が消滅するのはわかります
関数での、初期化と書き換えをする方法がわかりたいです
523デフォルトの名無しさん:2008/02/24(日) 01:10:25
>>515
#include <stdio.h>
#include <string.h>
typedef struct { char **start ; char **end; } bin;

void h(bin *x) {
char *ch = new char[11];
strcpy(ch, "ABCDEFGHIJ");
*(x->start)=ch; }

int main() {
bin x;
char *p;
x.start = &p;
h(&x);
printf("%s", p);
delete[] p;
}
524デフォルトの名無しさん:2008/02/24(日) 01:10:30
new/deleteを使うということは当然C++だよな?
じゃあ、なんでメモリ操作を隠蔽するクラスを作ろうとしないの?
IQ低いから?
525デフォルトの名無しさん:2008/02/24(日) 01:10:53
>>522
みんなが何回も例を出しているのに・・・(T_T)
526デフォルトの名無しさん:2008/02/24(日) 01:12:15
>>524
上のほうで最終的にCで書くと言っていたはず。
俺にはなんで今はnew[]使ってC++にするのか理解できないけど。
527デフォルトの名無しさん:2008/02/24(日) 01:12:50
>>522
おまいがポインタについて知っている知識をすべて述べよ
528デフォルトの名無しさん:2008/02/24(日) 01:12:53
>>522
何度か出てる正しく動く例が気に入らない理由はなぜかね
529デフォルトの名無しさん:2008/02/24(日) 01:18:03
仮に、彼へC言語ポインタ完全制覇を与えたとしても、
それでわかってくれるかどうか不安になる。
530デフォルトの名無しさん:2008/02/24(日) 01:19:41
>>522
皆が何言ってるかほとんど分からないC++素人だけど
一日ぐらい気分変えて犬の散歩にでも行ったら?
まあ、犬のウンコの処理しながら考えたりさ
その後で、また一から作ってみる
以外とできるかもよ
531デフォルトの名無しさん:2008/02/24(日) 01:21:40
>>523
それだとうごきました サンクス

x.start = &p;
h(&x);
printf("%s", *x.start);

初めにメモリ上にchar*型が確保されないと受け取れないって事か
532デフォルトの名無しさん:2008/02/24(日) 01:23:55
>>530
犬のウンコの処理を考えたり に見えて
delete unko;とか脳内で実行しそうになった
533デフォルトの名無しさん:2008/02/24(日) 01:28:09
>>523
pを確保しなくても、これでもいいはずですよね

int main() {
bin x;
x.start = new char *;
h(&x);
printf("%s", *x.start);
}
534デフォルトの名無しさん:2008/02/24(日) 01:28:52
newしたらdeleteしとけよ
535デフォルトの名無しさん:2008/02/24(日) 01:35:57
>>533
newしたものはdeleteしないといけないのが面倒だから、
使わずに済むなら避けるべき。
536デフォルトの名無しさん:2008/02/24(日) 01:48:50
だから、newを捨てるところからはじめろって。
537デフォルトの名無しさん:2008/02/24(日) 01:53:19
C及びC++を使いゲームを作成された方へ質問です。

再帰関数って便利ですか?
もしよろしければ、メリットとデメリットを教えていただけないでしょうか?

自分の考えでは、 goto と同じ用に無理に使う必要はない機能だと思ってます。
538デフォルトの名無しさん:2008/02/24(日) 01:54:37
再帰関数については色々思うところがあるのだが、ゲームを作っているわけではないからなぁ。
539デフォルトの名無しさん:2008/02/24(日) 01:58:18
無理に使う必要は無いなぁ
メリットデメリットという問題でもない気がする
540デフォルトの名無しさん:2008/02/24(日) 01:58:23
>>537
ポリゴン(ボーン)の操作で便利
でも、無理して使わなくてもおk
541デフォルトの名無しさん:2008/02/24(日) 02:03:16
ボーン操作ってことは、データの読み込み時に便利ってことでしょうか?
542デフォルトの名無しさん:2008/02/24(日) 02:09:18
【環境】 MS WinXP/gcc 3.4.4 on cygwin
【ソース】 http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6079.txt
【用途】 IRCクライアント(bot)
【起動方法】 $ ./a irc.tokyo.wide.ad.jp 6664
【動作の現状】
 1.コマンドラインからサーバ名とポートを受け取り、ソケット作成、コネクション確立
 2.サーバからのコネクションメッセージ受け取り
 3.USER/NICKコマンドの送信
 4.ウェルカムメッセージ、MOTDの受け取り
 5.半角英数のチャンネル名へのJOIN ←ここで停止する
【質問】
 ・Telnetで同じように接続すると問題なく接続→終了することができる(ISO-2022-JPだから文字化けするが正常)
 ・送受信周りがかなりいい加減なのでJOIN出来ないのはそこに問題があるのではないか?

イレギュラーなことをやってますが、IRC板orスレというよりCネットワークプログラミング自体の問題かと考え
こちらに質問させていただきました。よろしくお願いいたします。
543デフォルトの名無しさん:2008/02/24(日) 02:13:01
>>541
typedef struct _D3DXFRAME {
LPSTR Name;
D3DXMATRIX TransformationMatrix;
LPD3DXMESHCONTAINER pMeshContainer;
struct _D3DXFRAME *pFrameSibling;
struct _D3DXFRAME *pFrameFirstChild;
} D3DXFRAME, *LPD3DXFRAME;

座標系の上に座標系があって、
さらにその座標系の上に座標系が…
と繰り返すので、スタックを自前で管理するより
再帰処理にしたほうが楽というだけ
(体-上腕-腕-手-指 のように繋がっていくので)
544デフォルトの名無しさん:2008/02/24(日) 02:17:35
>>542
カンなので外してたら無視してくれ
>for(i=0;i<=strlen(p);i++){
\0も送信してるが、いいのか?
i<strlen(p) なんじゃない?
545デフォルトの名無しさん:2008/02/24(日) 02:37:36
>>543
for分で体のパーツ数回してデータを読み取ってるんですが、
今は無理してそれを崩してまで使う機能ではないってことですね。

よく機能を理解して使えば楽になる物、ということですね。
答えてくれた方ありがとうございました。
546デフォルトの名無しさん:2008/02/24(日) 03:26:15
>>542
メッセージの終わりを\n → \r\n に変えてみたらいけるかも
547デフォルトの名無しさん:2008/02/24(日) 03:33:50
>>530
俺はオナニーして発射した後、ティッシュで拭いてる時にコードが閃くよ。
548546:2008/02/24(日) 03:56:01
あと、>>544と同じく\0の送信は不味いんでは?
\nでメッセージの終わりを判断してるとすると、サーバは次のメッセージの受信で
先頭に\0が入ってしまうんではないかと思う
(2回目のメッセージが、"\0JOIN #ircclidev\n"になるんじゃないかな)
549デフォルトの名無しさん:2008/02/24(日) 04:06:10
>>544,>>548
i<strlen(p)で解決しました。初歩的ミスもいいところだ・・・。

もう一つ質問があるのですが、(どちらかというとこちらが本題ですが)
ISO-2022-JP(いわゆるJISコード)とShiftJISを相互変換するライブラリorサンプルを探しています。
検索してもなかなかしっくり来るものがなく、nkf経由だと上手くISO-2022-JPの制御コード
(KI/KO=0x1B 0x24 0x42/0x1B 0x28 0x42)を取ることが出来ません。

RFCには、特にマルチバイト環境の規定は定められていませんが、日本語IRCサーバは
ISO-2022-JPを使っているところが主流のようです。
550デフォルトの名無しさん:2008/02/24(日) 04:12:53
>>542の修正版ソースです。一応日本語以外はちゃんと動く・・・はず
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6082.txt
551デフォルトの名無しさん:2008/02/24(日) 05:11:02
>>549
iconvじゃだめかい?
552デフォルトの名無しさん:2008/02/24(日) 05:52:14
すんません。
VC++6.0からVisualStudio2008に移ったんですが、外観が変わりすぎててチンプンカンプン・・・
どこかVisualStudio2008 Exp の解説やってるページとかありませんか?

dllすら読み込めぬ・・・。orz
553デフォルトの名無しさん:2008/02/24(日) 06:11:51
Visual Studio2008スレにGO
554デフォルトの名無しさん:2008/02/24(日) 10:24:08
自分でクラスを定義するときに、ポインタに対する演算は、定義しなくてもよいのでしょうか?
つまり、ポインタでも、int*とか、char*とかの型がありますが、例えば
myclass*==int*
とかやるとコンパイルエラーになります。でも、myclass1*==myclass2*は、==演算子も
定義してないのに、コンパイルできるし、ちゃんと動きます。
これは、どういう理由でできるんですか?というか、ポインタの比較をする演算子って
どこで定義してるんでしょうか?

変な質問ですいません。
555デフォルトの名無しさん:2008/02/24(日) 10:27:06
継承関係があるんじゃない?
556デフォルトの名無しさん:2008/02/24(日) 10:54:10
>554
規格上で「できる」と決められている処理ははコンパイラが勝手に処理してくれる、というだけ。
myclass1*==myclass2* は >555 の言うとおり myclass1 と myclass2 に継承関係があるんだろう。
この場合、暗黙の型変換が発生して同じ型になり比較できる、と決まっている。

で、規格で決められている以上のポインタに対する演算を、自前で定義する必要があるケースはまずない。
557デフォルトの名無しさん:2008/02/24(日) 10:55:39
>>554
違う型のポインタの比較はダメ
int* a;
double* b;
a == b
をやってみれば意味がわかるんじゃないかな?
558デフォルトの名無しさん:2008/02/24(日) 12:50:04
C++で配列を関数の引数にできますか?
559デフォルトの名無しさん:2008/02/24(日) 12:52:24
配列の参照か、配列のポインタか、配列要素のポインタならできます
配列自体は無理
560デフォルトの名無しさん:2008/02/24(日) 12:52:27
ポインタじゃダメなのか?
561デフォルトの名無しさん:2008/02/24(日) 12:53:21
>>558
できる

template <size_t n>
void func((&a)[n]) のように
562デフォルトの名無しさん:2008/02/24(日) 12:53:39
型がねえ
563デフォルトの名無しさん:2008/02/24(日) 12:58:42
すまん忘れた
564デフォルトの名無しさん:2008/02/24(日) 13:14:21
>>559-563
ありがとうございます。
たしかにできませんでした。でも、
template <class T, int N>
int func(T a[N])
{
...
}
こういう様に書いても(func()の引数に&を付けても付けなくても)、aは参照扱いになるようです。
aに対して変更を加えると、func()の呼び出し側の元配列にも変更が反映されました。
565デフォルトの名無しさん:2008/02/24(日) 13:20:12
そりゃaはポインタなんだから。
566デフォルトの名無しさん:2008/02/24(日) 13:32:04
>>564
aは参照でなくてdecayされるからポインタだろ
567デフォルトの名無しさん:2008/02/24(日) 13:36:59
>>565-566
そうか。ポインタですよね。
ポインタをコピーして、その先まで複製してくれるのはありえないですよね。
ありがとうございました。
568デフォルトの名無しさん:2008/02/24(日) 13:50:24
構造体かクラスでラップしとけばいい。
boost::array を使うとか。
569デフォルトの名無しさん:2008/02/24(日) 16:28:53
C++で乱数を扱う為のクラスとか関数はありますか?
rand/srand使うしかないですか?

rand/srand使うとしたら、シードによく現在時刻使いますが
現在時刻を取得する方法はtimeしかないですか?

++らしい方法があれば教えてください。
570デフォルトの名無しさん:2008/02/24(日) 16:30:06
MT法のインラインアセンブラ版がどっかにころがってたきがする
571デフォルトの名無しさん:2008/02/24(日) 16:31:57
boost使うか
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
ここから持っていけばいいんじゃね
572デフォルトの名無しさん:2008/02/24(日) 16:32:08
>>569
Boost.Random
573デフォルトの名無しさん:2008/02/24(日) 17:06:58
javascriptではalert("文字列"+123)
という風に文字列と数字を一緒にメッセージ表示出来ましたが、
C++で文字列と数字を一緒にメッセージ表示させるにはどうしたらいいでしょうか?
MessageBox(NULL, "文字列"+123, "test", NULL)
というのは出来ませんでした。
574デフォルトの名無しさん:2008/02/24(日) 17:09:11
>>573
JavaScript同様、文字列を連結してから表示すればいい。
575デフォルトの名無しさん:2008/02/24(日) 17:19:27
>>574
char msg[20] = "文字列";
char tmp[10];
itoa(123, tmp, 10);
strcat(msg, tmp);
MessageBox(NULL, msg, "test", NULL);
こんな感じですか?

メッセージ毎にこのコードを書くのも面倒臭いのと、
いつも "文字列"+数字 の組み合わせと言うわけでもなく
数字+"文字列"+数字+"文字列" という事もあるため
自作関数でmsgbox(char*, int){}という決め撃ちではやく、
文字列や数字を混同で表示できる方法はないかと考えています。
576デフォルトの名無しさん:2008/02/24(日) 17:20:07
お願いします。C言語初心者なんですが、
ソース内に日本語を入れるとエラーになるんですが、
どこをどうすればいいのでしょうか?

超初心者です。よろしくお願いします。
577デフォルトの名無しさん:2008/02/24(日) 17:21:41
× ああああ
○ //ああああ
578デフォルトの名無しさん:2008/02/24(日) 17:22:14
ソースから日本語を消す
579576:2008/02/24(日) 17:27:51
説明へたですいません。

/* hello02.c */

#include <stdio.h>

int main()
{
printf("今日はよい天気です。\n");
printf("明日もよい天気でしょう。 \n");

return 0;
}

これなんですけど…
580デフォルトの名無しさん:2008/02/24(日) 17:30:51
>>576
どんなエラー?
581デフォルトの名無しさん:2008/02/24(日) 17:34:42
>>570-572
ありがとうございます、Boost 試してみます。
手元の mingw にはなさそうなので、まずはgooって
Boost 環境揃えてみますね。

>>576
・ソースの文字コードを変えてみる
・処理系を変えてみる
582576:2008/02/24(日) 17:36:23
本当にすいません。

普通に表示されました。
なんか間違ったやりかたしてたみたいです…


申し訳ないです。
583デフォルトの名無しさん:2008/02/24(日) 17:41:12
>575
そのためのsprintf、とだけいっておくけど。
584デフォルトの名無しさん:2008/02/24(日) 17:48:41
>>583
sprintfだとメッセージウィンドウは生成されないですよね?

外見としてはMessageBoxの中身に数字や文字列を表示している様な方法がいいんです。
585デフォルトの名無しさん:2008/02/24(日) 17:54:21
sprintfのsは何の意味か知っているか、とだけ言っておくけど。
586デフォルトの名無しさん:2008/02/24(日) 17:55:05
>>584
ならsprintfしてMessageboxにいれる処理の関数つくればよくね?
587デフォルトの名無しさん:2008/02/24(日) 17:56:41
要はフォーマット→MessageBox()と
二段構えになるのが嫌、というだけの話とエスパー

vsprintf()使って自作ラッパー関数でも書くんだな
588デフォルトの名無しさん:2008/02/24(日) 17:58:37
>>584
boost::lexical_cast
を使うと幸せになれると思う
589デフォルトの名無しさん:2008/02/24(日) 18:04:51
>>585-588
失礼しました。printfと勘違いしてました。
sprintfだと文字列に格納できるんですね。
boostは自分にはまだ早そうなので(正規表現使えるのは魅力的ですが)、sprintfでやってみます。
ありがとうございました。
590デフォルトの名無しさん:2008/02/24(日) 18:05:19
>>588
効率が悪いのが難点
591デフォルトの名無しさん:2008/02/24(日) 18:07:23
>>588
俺も最初それ思いついたけど、連結する数値がたくさんあると見苦しくなるから
std::stringstreamに流し込んで取り出す方がいいんじゃないかなあ。
592デフォルトの名無しさん:2008/02/24(日) 18:45:34
DLLの読み込みで、コンパイラによって失敗します
序数で指定しても動きません どのような理由でしょうか?
VC++だと動かないですが、BCCとDMCで動きます
593デフォルトの名無しさん:2008/02/24(日) 18:47:43
HINSTANCE hd=LoadLibrary("*****.dll");
FN = (fnc) GetProcAddress(hd, (LPCSTR)4); //序数での指定

このような記述はWindowsXPなら万能ではないんでしょうか?
594デフォルトの名無しさん:2008/02/24(日) 18:50:46
訂正
読み込みはしますが、実行時にエラーになります 序数がずれるのかも・・と思い全ての番号で試したのですがだめです
595デフォルトの名無しさん:2008/02/24(日) 18:52:47
継承について教えてください
CFooから派生したCFooEx0、CFooEx1、CFooEx2、CFooEx3があるとします。
そして、それぞれCJissou0、CJissou1、CJissou2、CJissou3に派生してるとします。
その上、CJissou0、CJissou1はIHoge0を、CJissou2、CJissou3はIHoge1を実装しているとします。
図にするとこんな感じ。
CFoo─CFooEx0┬CJissou0
IHoge0┘
CFoo─CFooEx1┬CJissou1
IHoge0┘
CFoo─CFooEx2┬CJissou2
IHoge1┘
CFoo─CFooEx3┬CJissou3
IHoge1┘

CFooとCFooEx〜は弄らないとして、IHoge〜のインターフェイス関数をCJissou〜に実装します。
で、マネージャー的な物例えば、std::vector<CFoo *> vecにそれぞれの実態を入れて、
CJissou〜の関数を呼びたいのですが呼ぶ際には、
dyanamic_cast<CJissou0 *>(vec[0])->Test();見たいな事をしないといけないと思います。
でもそういう呼び出しだとIHoge〜も意味が無くなってしまうし、数が多くなると厳しくなります。(IHoge〜は数個)
だから、dyanamic_cast<IHoge0 *>(vec[0])->Test();//エラー
見たいな呼び方をしたいのですがどうすればいいのでしょうか?
596デフォルトの名無しさん:2008/02/24(日) 18:59:37
>>595
そもそもそのような継承にしてる理由は?
597デフォルトの名無しさん:2008/02/24(日) 18:59:59
>>595
CFoo のメンバ関数ならキャストは要らないはず。
IHoge〜 に意味が無くなると言うが、こっちからしたら CFoo や vec の使い方も
ひっくるめて最初からその継承関係の意味がわからん。
598595:2008/02/24(日) 19:06:57
えっと、まあ、CFooがMFCのCViewで、CFooEx〜がCTreeViewとかCListViewなのでどうした物かと質問しました・・・。
599デフォルトの名無しさん:2008/02/24(日) 19:10:28
なんでvector<IFoo>とかにしないわけ?
あるいは、virtual Test()をもつ何かインターフェースに。
600デフォルトの名無しさん:2008/02/24(日) 19:18:44
CFooEx の状態で持てないのなら
ダウンキャストすることになるだろうな。
601デフォルトの名無しさん:2008/02/24(日) 20:05:03
>>590
もう自前でパースしてるよ
602592:2008/02/24(日) 20:05:24
最適化オプション関係でした
603デフォルトの名無しさん:2008/02/24(日) 20:10:05
>>601
車輪の再発明
604デフォルトの名無しさん:2008/02/24(日) 20:25:22
boostが?
605デフォルトの名無しさん:2008/02/24(日) 20:29:54
ごめん勘違い
606デフォルトの名無しさん:2008/02/24(日) 20:58:50
文字コード?jisコード?って覚えるべきもの?
607デフォルトの名無しさん:2008/02/24(日) 21:06:12
必要になったときに表を見れば十分
608デフォルトの名無しさん:2008/02/24(日) 21:06:13
>>606
全てのJIS漢字のJISコードなんて、そうそう覚えられるもんじゃないと思うが。
609デフォルトの名無しさん:2008/02/24(日) 21:14:12
class Piyo{

};

class Hoge{
public:
  void hoge(Piyo[][256]);
};

void Hoge::hoge(Piyo[][256] piyo){

}

こんな実装をした時に、Hoge::hogeのpiyoを書いておくと'Piyoは未定義のシンボル'と怒られてしまいます。
仮引数をPiyo[][256]だけにすればコンパイルは通りますが、どう使えというのか・・・といった感じです。
コンパイラはBCC5.5を使っています。クラスの2次元配列をできれば「参照」で渡したいのですが、
どうすればいいんでしょうか?
610デフォルトの名無しさん:2008/02/24(日) 21:15:36
単に書き方がおかしいだけだ。
void Hoge::hoge(Piyo piyo[][256]) {
しかもこれいわゆる参照渡しの挙動をするが、
正確にはポインタ渡しだし。
611609:2008/02/24(日) 21:29:18
うわ・・・。確かにおかしな書き方してた・・・。
自分でもドン引きです・・・。ありがとうございました
612デフォルトの名無しさん:2008/02/24(日) 23:16:37
http://streaming.linux-magazin.de/en/program_fosdem.htm
cmakeについてのリアルタイム講演が聞けるそうな
613デフォルトの名無しさん:2008/02/24(日) 23:20:24

ReadFile(fp , &(buf[N]) , 1500 , &sz , NULL);

でエラーで止まります bufは十分にとってあります なぜでしょうか
614デフォルトの名無しさん:2008/02/24(日) 23:24:57
>>613
bufの宣言がどうなっているかにも拠るが、&(buf[N])をbufにしてみろ。
それで巧くいくなら、お前は馬鹿だ。
615デフォルトの名無しさん:2008/02/24(日) 23:31:32
位置を変えてループして読もうとしてるんです bufにすると上手くいきますが前のデータが消えます
原因不明ですが、変数の位置変えたらエラーでなくなり一応うごくようになりました 
616デフォルトの名無しさん:2008/02/24(日) 23:34:06
たまたま動いてるだけくさいな。
単純にバッファオーバーフローしてるだけじゃないのか?
617デフォルトの名無しさん:2008/02/24(日) 23:36:56
メモリ関係のエラーみたいです また止まりました
別のところから変更しないと直りそうにありません
設計やり直してきます
618デフォルトの名無しさん:2008/02/24(日) 23:48:58
coutやnewの多重定義ってどうやるのかわかりません できますか
619デフォルトの名無しさん:2008/02/24(日) 23:51:19
>>613
char buf[NMAX*1500]
なら、&(buf[N*1500])

char buf[NMAX][1500];
なら、&(buf[N][0])

char *buf[NMAX]
for(...) buf[N] = malloc(sizeof(char) * 1500);
なら、buf[N]
620デフォルトの名無しさん:2008/02/24(日) 23:52:38
cout の多重定義??
621デフォルトの名無しさん:2008/02/24(日) 23:55:54
<<のオーバーロードに違いない
622デフォルトの名無しさん:2008/02/24(日) 23:56:41
ostream& operator<<(ostream& ostr, const Hoge& hoge) {
 ostr << hoge.str();
}

みたいなやつか。
623デフォルトの名無しさん:2008/02/25(月) 00:07:21
stringは連続していますか? memcpyとかはできますか?
624デフォルトの名無しさん:2008/02/25(月) 00:08:24
なんでstringにmemcpyしたがる人が多いんだろう。
625デフォルトの名無しさん:2008/02/25(月) 00:09:43
stringにmemcpyはまずいんじゃね
626デフォルトの名無しさん:2008/02/25(月) 00:10:45
string s="9999999999";
strcpy( &s[5], "000");
は正しいですか
627デフォルトの名無しさん:2008/02/25(月) 00:14:03
詳しいことわすれたけど、s[i]で文字を取得できるならできるんじゃね?
やった後、stringオブジェクトは壊れるとおもうけど
628デフォルトの名無しさん:2008/02/25(月) 00:15:06
この日本語不自由そうなとこが同一人物くさい
629デフォルトの名無しさん:2008/02/25(月) 00:15:58
>>623
規格ではそんな保障はされていません。
630デフォルトの名無しさん:2008/02/25(月) 00:17:13
>>627
あっ嘘、s[i]で取得できてもできないと思う
置き換えたいなら、replaceを使いなさい
631デフォルトの名無しさん:2008/02/25(月) 00:17:23
>626
std::stringのことなら、正しくない。
632デフォルトの名無しさん:2008/02/25(月) 00:21:59
これが動くのですが、stringはchar*の拡張であることは保証されていませんか?だめな例はありますか


int main(){
string str="9999999999";

char *pointer=&str[5];

memcpy( pointer, "000", 3);

str+=(string)"add";

cout<<str;

return 0;}
633デフォルトの名無しさん:2008/02/25(月) 00:25:35
stringの制御情報はどこへ格納されていますか?
ユーザーは合法的でない方法を使ってもアクセスできませんか?
634デフォルトの名無しさん:2008/02/25(月) 00:28:12
>632
必要のないポインタ操作はやめましょう。
動くか動かないかがプログラムの正しさの判定基準ではありません。
635デフォルトの名無しさん:2008/02/25(月) 00:28:47
>>632
あるコンパイラのあるバージョンで動くとしても、規格で保証されていなければ、
他のコンパイラや同じコンパイラの別バージョンでは動かないかもしれない。
それでもいいなら、どうぞ?
今後ずっと同じコンパイラを使い続けて、決して変えないのなら、たぶん問題ないだろう
636デフォルトの名無しさん:2008/02/25(月) 00:30:23
>>633
なんのためのクラスだと思う?
637デフォルトの名無しさん:2008/02/25(月) 01:00:06
例外の使い方について

エラーの通知にはエラーメッセージより例外を使う方がいいと聞いたのですが
オリジナルな例外クラスを投げたり、charを投げまくる仕様にしていいのですか?

例外というと、これ以上の実行に支障が出るときに使うようなイメージがあるのですが実際の現場ではどうなのでしょうか?
638デフォルトの名無しさん:2008/02/25(月) 01:01:51
例外処理を主要処理に書くと遅くなったりしませんか?
639デフォルトの名無しさん:2008/02/25(月) 01:14:59
コンパイラによって例外処理用のコードが追加されるから
パフォーマンスは落ちる。禁止オプションもあるくらいだからな。
特に組み込みでは。。。。。。
640デフォルトの名無しさん:2008/02/25(月) 01:17:11
クラスメンバー変数は、自動で0やNULLで初期化されますか? 
641デフォルトの名無しさん:2008/02/25(月) 01:20:04
>>637
好きなように使え。

ただ、エラーメッセージと例外では通知する相手が違うぞ。
エラーメッセージはエンドユーザ、例外はプログラマに通知するもんだ。
ユーザがいきなり「0x00d2345でlogic_error例外が発生しました」とか見せられても訳わからんだろ。

charも投げられるが、標準との整合を考えて投げるのはオリジナルも含めてstd::exception派生のクラスにしとけ。
642デフォルトの名無しさん:2008/02/25(月) 01:21:41
>>640
static領域に配置したオブジェクトのメンバなら、コンストラクタで何もしていなければ0になります。
それ以外は不定です。
643デフォルトの名無しさん:2008/02/25(月) 01:29:37
static つけたらクラスが消滅しても値が残るんですか?
クラスが消滅したらアクセスできなくなると思いますが
つけなくても自動でstaticになりますか
644デフォルトの名無しさん:2008/02/25(月) 01:50:30
>>641
なるほど・・・

戻り値でエラーを知らせたり、NULLを返したりという方法もあるのでどういう方法が主流なのかなと思ってまして

自分はたいていの場合
何が起こったのか確認して、何事もなかったかのように受け流してさいごにエラーログを確認する
位のデバッグライト的な使いか確かしてないのですが・・・
645デフォルトの名無しさん:2008/02/25(月) 01:59:21
>>644
どれが主流というのは無い。場面によって適切な方法があるだけ。
ライブラリとか、設計思想によりエラーの返し方がある程度統一されてたりすることもあるけどね。

とにかく作ってみなさい。できたものを自分なりに分析して、ここはこうした方がよかったとか、省みることで成長するんだから。
646デフォルトの名無しさん:2008/02/25(月) 02:09:23
>>643
残ります、というかクラスを複数生成しても全部同じstaticメンバ変数をさすんですよ?

三行目がいまいちなに言ってるのかわからんstaticつけないとstaticにはならないよ
647デフォルトの名無しさん:2008/02/25(月) 02:12:48
まずインスタンスという言葉を覚えようや
648デフォルトの名無しさん:2008/02/25(月) 02:13:09
>>643
>static つけたらクラスが消滅しても値が残るんですか?
(クラスではなくインスタンスのことを言いたいのだと思うが…)
staticで宣言した変数は、main関数の開始前から終了後まで存在する。
破棄されるのがmain関数終了後だから通常はそれへのアクセスが問題になることはないが、
staticの変数が異なるファイルで定義されて、一方のデストラクタからもう一方を参照するような
処理があるとまずい。
意味が分からないようなら気にしなくていい。

>つけなくても自動でstaticになりますか
ならない。
649648:2008/02/25(月) 02:14:21
ちょっと訂正
×staticの変数が
○2つのstaticの変数が
650デフォルトの名無しさん:2008/02/25(月) 02:24:32
質問があるのですが、
include " "
include < >
" ", < > の違いを教えて頂けませんか?
651デフォルトの名無しさん:2008/02/25(月) 02:30:32
>>650
コンパイラのマニュアルか入門書を読みなさい。
652デフォルトの名無しさん:2008/02/25(月) 02:47:52
>>650
http://www.google.co.jp/search?q=C%E8%A8%80%E8%AA%9E+include
上から順に読んでいけばそのうち解説してるサイトにたどり着く
653デフォルトの名無しさん:2008/02/25(月) 07:25:36
>>632
std::string の内部バッファの連続性は次の規格で保証されるようになる。
おそらく現状全ての実装でそうなっていることが、その規格変更を実現したんだろう。
だから一応そう言うことをしても問題は無いはずだが、
メンバ関数でできることはメンバ関数でやった方がいい。
replace 使うといい。
654デフォルトの名無しさん:2008/02/25(月) 09:45:12
例外ねぇ、何も考えずにint型のエラーコードを投げちゃうなぁ
返り値でエラーコード返しちゃうと返り値の型が拘束されちゃうしメンドクサ

結局こういう使い方だと例外のありがたみを半分も得ていない気がする
655デフォルトの名無しさん:2008/02/25(月) 10:00:21
例外はstd::exceptionみたいな基本クラスを決めとかないと
ありがたみが半減する。
656デフォルトの名無しさん:2008/02/25(月) 11:44:36
ガベージコレクションは、標準のC++でつくれますか?ライブラリでは動作するのか不安です
自作したいです
あと、整数変数は、初期化なしでアクセスしてもエラーは出ませんか?
657デフォルトの名無しさん:2008/02/25(月) 11:46:47
素人が自作した方が不安だと思うんだが
658デフォルトの名無しさん:2008/02/25(月) 12:00:29
これ動かすとクラス変数は値がほぼ一定ですが理由はなぜですか? 

#include <iostream>
using namespace std;

class cl{public: int i; cl(){cout<<"class "<<i;} };

int main(){
int n, a[100];
for(n=0; n<100; n++){
cl *x=new cl;
cout<<" arrey "<<a[n]<<"\n";
}
getchar();
}
659デフォルトの名無しさん:2008/02/25(月) 12:09:11
動的確保による違いでした たぶんヒープ領域は値があまり変化しないことが原因かも・・・

#include <iostream>
using namespace std;

class cl{public: int i; };

int main(){
int n, a[100] ;
cl x[100];
for(n=0; n<10; n++){
cout<<"class="<<x[n].i<<" arrey="<<a[n]<<endl;
}
getchar();
}
660デフォルトの名無しさん:2008/02/25(月) 12:12:41
>>656
整数変数を初期化しなくてもエラーは出ませんが、ローカルな場合に不定値なので初期化しましょう。
661デフォルトの名無しさん:2008/02/25(月) 12:37:27
定数文字列は値渡しにして、動的な文字列は参照渡しにしたいのですが、これだとメモリリークしますよね
どうやれば直りますか?

#include <iostream>
using namespace std;

class cl{
char *str;
public:

cl(char* const& x){ str=x; }

template <size_t n> cl(char (&x)[n]) {
str=new char[n]; strcpy(str,x);}

};

main(){
cl str="rrrr";
str="oooo";
getchar();
}
662デフォルトの名無しさん:2008/02/25(月) 12:42:21
値渡しされているかフラグを作って、されていれば解放する様にすればいいのですが、
初期化前にコンストラクタで代入されてしまうとフラグが確認できません
663デフォルトの名無しさん:2008/02/25(月) 12:47:11
>>661は間違えました 定数式が期待する方へ行っていませんでした それもどうやれば直りますか
664デフォルトの名無しさん:2008/02/25(月) 12:56:55
>>661
やりたいことがよくわからん。せめて、コンパイルできるソース(の断片)を貼ってくれ。
665デフォルトの名無しさん:2008/02/25(月) 13:00:43
まとめるとテンプレート関数で、
定数文字列"   "と
固定文字列char [n]と
可変文字列char *を
区別して、上の二つならメモリを確保して値渡しにしたいんです
値を書き換えたいため
666デフォルトの名無しさん:2008/02/25(月) 13:01:40
最近ずっとこいつ出没してるな
667デフォルトの名無しさん:2008/02/25(月) 13:02:01
それと、新たにメモリを確保するときに、以前確保したメモリを解放してメモリリークしないようにしたいです
668デフォルトの名無しさん:2008/02/25(月) 13:06:38
>>667
要は、const char *でコンストラクトするときはメモリを確保して、char *でコンストラクトするときは確保しなければ委員でね?
それと、書き換えのときはconst char *でもchar *でも以前の状態に応じて解放しないといけないんでね?
669デフォルトの名無しさん:2008/02/25(月) 13:07:20
簡略化すると関数の引数で、" "型と、char[]型と、char*型を区別したいって事です
670デフォルトの名無しさん:2008/02/25(月) 13:17:48
>>668
constつけるだけでは無理です

#include <iostream>
using namespace std;

class cl{
char *str;
public:
cl(char const *x) { cout<<"文字列は定数です\n"; }
cl(char *x){ cout<<"文字列は可変長です\n"; }
};

main(){
cl str="xxx"; //定数で初期化
char ch[]="yyy"; str=ch; //固定配列の代入
str="zzz"; //定数の代入
getchar();
}
671デフォルトの名無しさん:2008/02/25(月) 13:19:34
すまん、そもそも char ch[] = "yyy"は固定長でも書き換え可能な配列なんだが
それを定数として扱ってはいけない理由を教えてくれ。
672デフォルトの名無しさん:2008/02/25(月) 13:22:36
あ、聞き方が変だ。

char ch[] = "yyy"は書き換え可能なんだから可変長と同一視すればいいし
const char ch[] = "zzz"は書き換え不可能なんだから定数と同一視すればいいのでは?
673デフォルトの名無しさん:2008/02/25(月) 13:22:41
可変長文字列と {定数文字列、固定長文字列} ( ← 一緒でいいです)
を分類する方法教えてください
あと、すでにメモリが確保してあればそれを解放する方法教えてください
674デフォルトの名無しさん:2008/02/25(月) 13:23:36
長さも書き換えられないといけません
675デフォルトの名無しさん:2008/02/25(月) 13:24:19
こいつ日本人なのかなぁ
676デフォルトの名無しさん:2008/02/25(月) 13:26:00
>あと、すでにメモリが確保してあればそれを解放する方法教えてください
これは簡単。コンストラクト時にメモリを確保したらフラグをセットしておいて、代入オペレータでそれをチェックすればいい。
勿論、代入オペレータも2種類用意して必要ならフラグをセットするのは当然として。
そのフラグはいずれにしてもデストラクト時に必要にナル死ね。
677デフォルトの名無しさん:2008/02/25(月) 13:28:05
あー、ローカルな配列だとコンストラクト時にフラグが立ったら問題か。
ここは一つ、char配列は渡さないと言う運用でw
678デフォルトの名無しさん:2008/02/25(月) 13:28:42
で、この馬鹿はなんで目的を説明できないんだろうなぁ。>675ってことなんだろうか。
679デフォルトの名無しさん:2008/02/25(月) 13:43:23
目的は、参照渡しのできるstringを作りたいんです
現存するやつは値渡しです
680デフォルトの名無しさん:2008/02/25(月) 13:45:33
いやだから、それを(態々)作る目的を聞いているのだが。
681デフォルトの名無しさん:2008/02/25(月) 13:46:27
チャットじゃないんだから要旨をまとめてから書き込め。
682デフォルトの名無しさん:2008/02/25(月) 13:46:53
>>676
クラスの確保と同時に代入されてしまうと、フラグが設定されていないので動作不明になりませんか?
683デフォルトの名無しさん:2008/02/25(月) 13:50:39
>>681
可変長文字列は参照渡しにして、それ以外は値渡しにして、新たな文字列が渡されたら以前のを解放したいんです
684デフォルトの名無しさん:2008/02/25(月) 13:52:58
>>683
>680
685デフォルトの名無しさん:2008/02/25(月) 13:53:25
伸びてると思ったら、また例の日本語が不自由なヤツが現れたのか
686デフォルトの名無しさん:2008/02/25(月) 13:56:58
何をしたいかと言うと

(バイナリ) 文字列 str , p , qに対して

replace(str, p, q)  strの全文でpをqに置換する

という関数を作りたいんです
687デフォルトの名無しさん:2008/02/25(月) 14:03:08
>>665

それぞれの型の応じて関数を振り分ければいいのか?

template<size_t N>
void g(const char (&a)[N]) {
cout << typeid(a).name() << endl;
}

template<size_t N>
void g(char (&a)[N]) {
cout << typeid(a).name() << endl;
}

void g(char *&p)
{
cout << typeid(p).name() << endl;
}

template<typename T>
void f(T& t)
{
g(t);
}
688デフォルトの名無しさん:2008/02/25(月) 14:03:31
//テスト
int main()
{
f("abc");
char a[5];
f(a);
char *p;
f(p);
}
689デフォルトの名無しさん:2008/02/25(月) 14:08:07
ぜんぶcです・・・・

#include <iostream>
#include<typeinfo>
using namespace std;

template<size_t N> void g(const char (&a)[N]) { cout << "a" << endl;}

template<size_t N> void g(char (&a)[N]) { cout << "b" << endl; }

void g(char *&p){ cout << "c" << endl; }

template<typename T> void f(T& t) { g(t); }


int main() {
f("abc");
char a[5]; f(a);
char *p; f(p);
}
690デフォルトの名無しさん:2008/02/25(月) 14:12:45
>>689
そりゃコンパイラがだめなんだろうな。
g++ 4.2.3だとa b cになる。
691デフォルトの名無しさん:2008/02/25(月) 14:12:57
>>686
これでいいのか?
#include <string>
#include <iostream>
using namespace std;
void replace(string& str, string p, string q)
{
int i = str.find(p);
while (i >= 0) {
str.replace(i, p.length(), q);
i = str.find(p, i + q.length());
}
}
int main()
{
string str = "abcdabcd";
replace(str, "bc", "BC");
cout << str << endl;
}
692デフォルトの名無しさん:2008/02/25(月) 14:17:34
>>686
俺だったら、次のどっちかにする。だから、673のようなことをしたくなる理由が理解できない。
1. strは全く書き換えず、置換後の文字列は新しく確保したメモリに書き込んで戻り値に返す。
2. strは書き換えできるという前提でstrを書き換える。(書き換えできない
文字列をstrに渡したければ、書き換え可能な場所へコピーを作ってそれを渡す)
693デフォルトの名無しさん:2008/02/25(月) 14:25:43
STR str="hogehogehogehogehoge"
replace(str, "geho", "(^_^)"); や、

int N=300*1024*1024;
char *ch=new char [N];
for(int n=0;n<N;n++)ch[n]=n; //巨大なバイナリ配列
STR str(ch,N);
replace(str, "geho", "(^_^)");
がしたいんです
694デフォルトの名無しさん:2008/02/25(月) 14:29:10
巨大な配列を扱おうとすると、元のデータをコピーしたり、返却時に新規確保すると、
もとのデータと併せて領域が2倍必要になりますしコピー時間がかかります
>>691 バリナリデータも扱いたいです
695デフォルトの名無しさん:2008/02/25(月) 14:32:38
>>693
できるぞ
>>694
バイナリデータも問題ない
#include <string>
#include <iostream>
using namespace std;
void replace(string& str, string p, string q)
{
int i = str.find(p);
while (i >= 0) {
str.replace(i, p.length(), q);
i = str.find(p, i + q.length());
}
}
int main()
{
string str="hogehogehogehogehoge";
replace(str, "geho", "(^_^)");
cout << str << endl;

int N=300*1024*1024;
char *ch=new char [N];
for(int n=0;n<N;n++)ch[n]=n; //巨大なバイナリ配列
string str2(ch,N);
replace(str2, "geho", "(^_^)");
cout << str2 << endl;
}
696デフォルトの名無しさん:2008/02/25(月) 14:32:39
C++
開発環境 CentOS
コンパイラ g++
関数書き出しプログラムが機能せず。
どうしてでしょうか。
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#define buffer_size 1000
using namespace std;
int main(int argc,char *argv[]){
string buffer;
int count=0;
char *p;
ifstream fin(argv[1]);
if(!fin)return 0;
while(fin>>buffer){
while(count!=1){
if((p=strchr(buffer.c_str(),'{'))!=NULL){
count++;
cout<<buffer;
}
}
while(count!=0){
if((p=strchr(buffer.c_str(),'{'))!=NULL)count++;
else if((p=strchr(buffer.c_str(),'}'))!=NULL)count--;
}
}
fin.close();
return 0;
}
697デフォルトの名無しさん:2008/02/25(月) 14:35:18
>>694
置換前より後の文字列のほうが長い場合、
単純にその場で書き換えていくと、1ヶ所置換が行われる度に
置換部分以降をずらしたり、時にメモリの伸張をしたりで時間がかかる。
最近のOSはメモリの扱いも上手になっているし、
そもそもPCのメモリ搭載量も大きくなっているから、
新しいメモリに書き込んでいくも選択肢として捨てたものではない。
698デフォルトの名無しさん:2008/02/25(月) 14:38:10
>>689
VC++ 2008でしか試してない。オーバーロード解決は規格に従って
いるんだが。コンパイラがテンプレート規則に対応していないのかね。
699デフォルトの名無しさん:2008/02/25(月) 14:48:28
>>695 >>697
stringにコピーするのが一番なんですかね?
関数で作業領域を確保しようとするので 初めの3倍必要になります
コピー無しなら2倍ですみます 300メガとかだと動作に支障出ないですかね・・

>>698
うちのコンパイラだと全滅しました MinGWの最新版 、DMC、VC++6.0、bcc5.5.1
700デフォルトの名無しさん:2008/02/25(月) 14:51:46
>>692
2番の方向で行こうとしているところだったんです 
定数なら書き換え可能な領域を確保しようとしたら、その判別がコンパイラでできないのでここで質問していたんです
701デフォルトの名無しさん:2008/02/25(月) 14:51:46
>>699
new char[]せずに最初からstringの中にデータを作ればコピーを減らせる

int N=300*1024*1024;
string str2;
str2.resize(N);
for(int n=0;n<N;n++)str2[n]=n; //巨大なバイナリ配列
replace(str2, "geho", "(^_^)");
702デフォルトの名無しさん:2008/02/25(月) 14:57:26
わかりました 
stringに直接挿入する方向で行こうと思います
巨大な入力があるのはファイルからなので、自作して直接stringに入れるようにします
703デフォルトの名無しさん:2008/02/25(月) 15:00:35
>>699
>コピー無しなら2倍ですみます 300メガとかだと動作に支障出ないですかね・・
stringの操作云々よりも、その情報量をどう扱うかと言うアルゴリズムの方が問題になりそうな希ガス。
少なくとも、GiBオーダ未満のメモリくらい今時普通に扱えるよ。

>>696
どう、機能していないのさ。
704デフォルトの名無しさん:2008/02/25(月) 15:01:19
ちゃんと目的を説明すれば、妥当な回答が手早く得られると言う好例だな。
705692:2008/02/25(月) 15:03:09
>>700
俺の場合、その判別は自分でやる。
必要なら自分でメモリ確保してmemcpyか何かでコピーしてから置換する関数へ渡すと言うこと。
メモリ確保その他をstringに任せているという点が違うけど、695案と同系統のアイデア。
706デフォルトの名無しさん:2008/02/25(月) 15:04:31
>>696
関数突入を探すwhileの条件がcount != 1だから、関数突入後に中括弧を見つけるとcountが2になって脱出できなくなる罠。
707デフォルトの名無しさん:2008/02/25(月) 15:10:50
>>696
>706に加えて、内側のwhileは両方ともifでいいだろよ。
つまり、最初のwhileは if (count == 0)で、次のwhileはif (count > 0)。
んで、fin >> bufferだと単語単位でしか入力できないから工夫が必要。
# 行単位入力すればいいのかな? 仕様がわからんからなんとも言えんが。
708デフォルトの名無しさん:2008/02/25(月) 15:13:01
初めはC言語のみで、作成しようとして最後まで作ったのですが
ポインタのポインタとかやっているうちに動かない場合があることに気づき修復不可能になりました
そしてC++で参照や型判定して作ろうとしたらこれも上手くいきませんでした
簡明なプログラムが大事ですね
709デフォルトの名無しさん:2008/02/25(月) 15:20:04
ここできいたのを参考に変換関数を作ってたのですが、そしたら全体がややこしくなり回復無理になりました

#define strconv(q, p) _memconv(&q, &p, strlen(p))
#define memconv(q, p, n) _memconv(&q, &p, n)
#define strconstconv(q, p) _strconstconv(&q, p)

_memconv(strdata *q, char **p, int n){
char **chend =(char **)malloc(sizeof(char **));
q->start=p; *chend=&(*p)[n]; q->end = &(*chend);}
710デフォルトの名無しさん:2008/02/25(月) 15:52:07
>>708,709
無理して難しく書いても、あとあとメンテナンスやデバッグのことを考えると、シンプルに書いた方がいい場合が多い
メモリを何MBか余計に使ったり、実行時間が何分か伸びたところで、なんだというんだ
ややこしいコードは書くのもデバッグも何日もかかる
それだけの価値があればやってもいいが、たいていは割に合わない
711デフォルトの名無しさん:2008/02/25(月) 17:21:33
やさしいC++買って来た。
一日でマスターするのは無理なのかなぁ・・・
712デフォルトの名無しさん:2008/02/25(月) 17:26:04
一週間くらいは覚悟しないといかんね
713デフォルトの名無しさん:2008/02/25(月) 17:39:36
一年ぐらいは(ry
とか言いたいけど最低10年とかいう意見もあるし
やね某が何年か前に提唱した半年ぐらいで勘弁しておいてやろう
714デフォルトの名無しさん:2008/02/25(月) 18:04:09
質問ですが、stringの+は、\0を特別視しませんよね?

"aa\0aa" + "bbbbb"はどのコンパイラでも、
"aa\0aabbbbb"ですよね?
715デフォルトの名無しさん:2008/02/25(月) 18:38:41
いつからCは+演算子で文字連結できるようになったんだ
716デフォルトの名無しさん:2008/02/25(月) 18:39:19
stringと書いてあるだろうがアホ
717デフォルトの名無しさん:2008/02/25(月) 18:43:10
>>716
>>714はC++でもNGだろ。C文字列同士だぞ。
718デフォルトの名無しさん:2008/02/25(月) 18:45:36
そこは中身がそうなっているstringインスタンスだと解釈してやろうぜ。
719デフォルトの名無しさん:2008/02/25(月) 18:48:48
質問者はそういう中身のstringを造ろうとしてそこでつまりそうだが
720デフォルトの名無しさん:2008/02/25(月) 19:21:16
>>718
アイアイ
721デフォルトの名無しさん:2008/02/25(月) 19:30:23
std::auto_ptrって、ブロックを出ると自動的に開放されるポインタですよね?
これって、AUTO変数と比べてより便利な点ってあるのでしょうか?
722デフォルトの名無しさん:2008/02/25(月) 19:36:53
×ブロックを出ると自動的に開放
○std::auto_ptrが破棄されたときインスタンスも自動的に開放
723デフォルトの名無しさん:2008/02/25(月) 19:37:01
>>721
・スタックに置くには適さない巨大なデータも置ける
・最初はNULLにしておいて必要になってからnewできる
・ブロックを出るまで待たなくても好きなタイミングで削除できる
・releaseで手放せばブロックを出ても削除しないことも出来る
724デフォルトの名無しさん:2008/02/25(月) 19:39:10
関数の戻り値にも使えるはず。
725デフォルトの名無しさん:2008/02/25(月) 19:41:51
using namespace std;
string func1() {
string s = "Hello";
return s;
}
void func2(string s) {
cout << s << endl;
}
int main() {
func2(func1());
}

この渡し方って解放されなかったり破壊されたりしますか?
処理系によりけりですか?
726デフォルトの名無しさん:2008/02/25(月) 19:43:39
>>725
しません。
どの処理系でも平気。
727デフォルトの名無しさん:2008/02/25(月) 19:59:12
>>722-724
ありがとうです。

ところで、testは適当なクラスとして、
int main()
{
std::auto_ptr<test> tp(new test);
tp.release();
return 0;
}
とすると、メモリリークが検出されてしまうのですが、tp.release()をしないようにすると
大丈夫でした。これってrelease()の使い方が間違ってますか?
あと、最初にauto_ptr<test>だけ宣言しておいて、途中でnew testする方法もわかりません。
もうちょっとだけ教えてくださいな。
728デフォルトの名無しさん:2008/02/25(月) 20:05:08
releaseは、以後、自分でメモリ管理するからauto_ptrはdeleteするなというもの。
729デフォルトの名無しさん:2008/02/25(月) 20:14:08
>>728
最初は、
std::auto_ptr<test> tp(new test);
tp.release();
test* tp2 = tp.get();
delete tp2;
としていたのですが、以下のようにしなければならないということですね。
std::auto_ptr<test> tp(new test);
delete tp.release();
ありがとうございました。
730デフォルトの名無しさん:2008/02/25(月) 20:27:13
>>729
tp.reset();
731デフォルトの名無しさん:2008/02/25(月) 20:44:23
resetはVC6のauto_ptrには無いとか言い出すぜきっと。
732デフォルトの名無しさん:2008/02/25(月) 20:52:38
resetもしないでデストラクタに任せればいい場面にまで
729のようなことをしていないか不安。
733デフォルトの名無しさん:2008/02/25(月) 20:58:49
設計について色々調べていると(デザインパターン等々)これ無駄じゃね?みたいな部分に多々遭遇します

例えばコンストラクタとデストラクタで確保&解放を行う為に全体をそれに合わせたり
それの為にメソッドやクラスを用意したり等々

確かに見通しもよくなりますし、わかりやすくなるとは思うのですが、
それらを犠牲にすれば短く出来たりオーバーヘッドを減らせたり出来るんじゃないか?と考えてしまいます

つまりコード全体の見易さ、転じてメンテナンスが容易になるなどのメリットと
速度を犠牲にするというデメリットがあると思います
とはいえ後者は今時気にするほどでもなく、詳しくないのですがここを気にするのは組み込み系と呼ばれる分野くらいなのかなとも思います

実際はやはり見易さ等を気にした手法(なんていうんだろう?)を用いて設計を行うべきなんでしょうか?
うまく表現できなく、長くなってしまってすみません
734デフォルトの名無しさん:2008/02/25(月) 21:01:16
Visual Studioって 何処にヘッダファイル置けば
735デフォルトの名無しさん:2008/02/25(月) 21:04:18
Visual Studioって 何処にヘッダファイル置けば
フルパス指定しなくて読み込めるんですか?
C:\Program Files\Microsoft Visual Studio 8\VC\include
でOK?
736デフォルトの名無しさん:2008/02/25(月) 21:06:29
>>735
ソースファイルと同じ場所なら
#include"hoge.h"
でおk
737デフォルトの名無しさん:2008/02/25(月) 21:09:06
>>733
大丈夫
君よりコンパイラのほうが賢いから
738デフォルトの名無しさん:2008/02/25(月) 21:09:18
速度犠牲とか偉そうに言うやつほど、ダメなプログラマ
739デフォルトの名無しさん:2008/02/25(月) 21:10:01
普通の初心者質問には答えないんだなぁ
740デフォルトの名無しさん:2008/02/25(月) 21:11:48
本当に遅くなることばかりじゃないしな。
std::sort が qsort より概して速くなる、というみたいに、
インライン化されると問題ないことも多い。
741デフォルトの名無しさん:2008/02/25(月) 21:14:36
>>738
色んな分野があるって前提で考えてるんだろう?
お前は組み込み系とビジネスソフト開発が同じだと思っているのか?
それにプログラミングしてればみんなプログラマって思考が気持ち悪い
お前見たいのは答える側に回るな
742デフォルトの名無しさん:2008/02/25(月) 21:14:59
プログラマではないです、ただいろんな分野があってそれに合ったプログラミングがあることくらいはわかっています

でもやっぱり速度は気にしちゃいけないところですか、無駄だと思ってしまうところから直す必要がありそうですね
コンパイラの最適化というのも知らない分野ですし、当分は見通しの良いプログラムを目指してみようと思います
743デフォルトの名無しさん:2008/02/25(月) 21:18:54
まず動くプログラムを書く。
そして遅ければ改善する。
この順だな。
744696:2008/02/25(月) 21:19:34
696です。
先ほどのプログラムを訂正したら、
一行ほどしか出力されませんでした。
どこが間違っているのでしょうか。

ttp://www.borujoa.org/upload/source/upload17009.txt
745デフォルトの名無しさん:2008/02/25(月) 21:26:58
これをちょっと弄って横長から縦長にしたいのですが、
いまいち組み方がわかりません。環境はLinuxでコンパイラはgccです。
#includeは省略
#define max 50
using namespace std;
class hist{
private:
string buffer;
int count;
int mat[max],i,j;
public:
int func(char *argv[]);};
int hist::func(char *argv[]){
ifstream fin(argv[1]);
if(!fin)return 0;
for(i=0;i<max;i++)mat[i]=0;
while(fin>>buffer){
count=strlen(buffer.c_str());
for(i=1;i<max;i++){
if(i==count)mat[i]=mat[i]+1; }
}
for(i=1;i<max;i++){
cout<<i;
for(j=0;j<mat[i];j++)cout<<"*";
cout<<'\n'; }
return 0;}
int main(int argc,char *argv[]){
hist hoge;
hoge.func(argv);
return 0;
}
746696:2008/02/25(月) 21:28:43
すみません、あげるの忘れてました。
どなたか教えてください。
747デフォルトの名無しさん:2008/02/25(月) 21:32:49
GNU global使えていう話じゃなくて?
748744:2008/02/25(月) 21:37:58
>>747
そんなソフトがあったんですかw
ありがとうございます。
しかしそれではコーディングトレーニングにならないので、
ソースコードでよろしくお願いいたします。
どう考えてもイメージがわかないもので質問した次第です。
749デフォルトの名無しさん:2008/02/25(月) 21:44:30
はじめまして

C++でプログラミングをしようと思っているのですが
開発環境等をどうしようか迷っています
将来的には

■ゲームを動かすプログラム(同人やエロゲのアプリ程度)
■補助ソフトやパッチ
■データを暗号化して格納するプログラム

等を作りたいと思っています
何かアドバイスがあればお願いします
750デフォルトの名無しさん:2008/02/25(月) 21:45:47
VC++ でいいっしょ
タダだし
751744:2008/02/25(月) 21:48:04
>>749
「C++の勉強したいんだがどの本買って勉強したらいいんですか?」
って聞いてるのと一緒だべ?
752デフォルトの名無しさん:2008/02/25(月) 21:50:19
デザインパターン信者
私にもそんな時期がありました(マジで)
753デフォルトの名無しさん:2008/02/25(月) 21:51:50
80:20の原則があるしな。経験つめばどこがホットスポットなのかが見当つくから、
プロファイルとってそこだけしぼって最適化すればいい。
最初から保守性犠牲にしてまでパフォーマンスチューニングが必要な分野って
限られてると思うよ。
754デフォルトの名無しさん:2008/02/25(月) 21:55:02
>>749
今からC++勉強するよりもおまいは吉里吉里勉強したほうが幸せになれると思う
755744:2008/02/25(月) 22:06:01
マイヘッドがクラッシュしてしまいそうなんですが、
エニバディー、ティーチ ミーしてくれませんか?
756デフォルトの名無しさん:2008/02/25(月) 22:16:44
>>752
理解できずに挫折したか。
757デフォルトの名無しさん:2008/02/25(月) 22:16:59
トオルさん帰れよ
758デフォルトの名無しさん:2008/02/25(月) 22:18:58
>>744
関係はないが、とりあえずバッファを buffer_size しか確保してないのに
fgets で filesize 読もうとしてるのはヤバい。
759デフォルトの名無しさん:2008/02/25(月) 22:28:27
>>744
else if(count > 0)
760744:2008/02/25(月) 22:29:05
>>758
bufferはstring型でいこうとおもったんですが、
fin>>buffer;でやると、単語読み込みで一行読み込みにはならないし、
fgets(buffer.c_str(),filesize,fin);はコンパイラに怒られるし、
どうしようもないんで駆け込み寺としてここにきました。
たぶんこれも慣れた人なら簡単に直せるんだとは思いますが、
いままでC言語ばっかりやってたもんで、変な癖ついてるんです。
761デフォルトの名無しさん:2008/02/25(月) 22:30:58
getline を知らんのか?
762744:2008/02/25(月) 22:32:36
>>761
K&Rにも載ってたんで知ってます。
763デフォルトの名無しさん:2008/02/25(月) 22:32:53
>744
よくわからんが、
一行よむなら、std::.getline( fin, buffer );だが。むろん、finはifstream辺りの必要はある。

初めて"{"が存在する行をみつけたとき、上のifでcount++になって、
下のifも成立してでcount++で2になるんだが、そういうものなのかね?
764デフォルトの名無しさん:2008/02/25(月) 22:33:42
どこのK&Rだ、どこのw
765デフォルトの名無しさん:2008/02/25(月) 22:35:10
>>750
あと必要な物はやる気と根気ですかね?

>>751
"だべ"ってどういう意味ですか?
マルチリンガーじゃないので日本語以外わからないんです、本当にごめんなさい。
766デフォルトの名無しさん:2008/02/25(月) 22:36:48
>>765
キモス
767744:2008/02/25(月) 22:43:14
>>759
else ifですか。基本的なところ躓きました。
ありがとうございます。勉強になりました。

>>763
そんな関数があったんですか。
ちょっとgetlineの中をのぞいて使わせてもらいます。

>>764
Cアンサーブックのほうです。
バイブル本とか釣られてやってみたけど、
糞面白んないんで解くのやめました。
768デフォルトの名無しさん:2008/02/25(月) 22:44:52
可変のchar *のバッファ用意したいとき

string buf (n, '\0' );
&buf0]; ← これはchar*のところへ入れられる

と使うと便利だ 自動で消滅するし
769744:2008/02/25(月) 23:06:24
>>768
下のほうhtmlのタグみたいですね。
奥の手っぽいんでどうしようもないときに使ってみます。
ありがとうございました。
770デフォルトの名無しさん:2008/02/25(月) 23:48:16
>>744
さっき、恐らくは想定したと思われる仕様を完璧に満たすソースを書いたんだが、
反応がなかったから会社に置いてきちゃった。次に会社に出るのは3日後なんで、
後で寝ちゃわなければ軽く再現してみるよ。
771デフォルトの名無しさん:2008/02/25(月) 23:57:46
>>770
>次に会社に出るのは3日後なんで

何でだ?
772デフォルトの名無しさん:2008/02/26(火) 00:01:47
なんか、「それを記すにはあまりにも2chの投稿制限は厳しい」みたいに
続きそうな文章だなw
773デフォルトの名無しさん:2008/02/26(火) 00:08:58
>>749
本体 > VC++
開発用ユーティリティ > TurboC++ Exploer (BCB)
でいいんでないの?
VC++はGUIアプリの構築はそれなりに手間かかるし、BCBは紙芝居の開発じゃ全然VCLの長所が生かせない。
774デフォルトの名無しさん:2008/02/26(火) 00:16:21
>>771
単に、明日明後日は客先直行直帰だから。
>>744
手直ししながら、「クラスにする必要ないじゃん」とか
「変数は極力局在化しろよな」とか「マクロシンボルは大文字だろ」とか
「入力にfgets()を使うなら出力はfputs()じゃないか」なんて乗りで
修正してたらこうなった。
#include <cstdio> #include <cstring>
#define BUFFER_SIZE 1000
int func(char *argv[]) {
FILE * fin = fopen(argv[1],"r");
if (fin == NULL) return 1;
unsigned count = 0;
char buffer[BUFFER_SIZE];
while(fgets(buffer, sizeof(buffer), fin)!=NULL) {
if (count == 0) {
if (strchr(buffer,'{') != NULL) {
fputs(buffer, stdout);
count++;
}
} else if (count > 0) {
if (strchr(buffer,'{') != NULL) count++;
if (strchr(buffer,'}') != NULL) count--;
fputs(buffer, stdout);
}
}
fclose(fin);
return 0;
}
int main(int argc,char *argv[]) {
return func(argv);
}
775744:2008/02/26(火) 00:36:44
>>774
まぁ人には癖があるからね。
ありがとう。
人と自分のソースを比較するのが、
一番勉強になるよ。
776デフォルトの名無しさん:2008/02/26(火) 00:45:12
>>775
>774は常套句の宝庫だと思うよ。fgets(buffer, sizeof(buffer), fin)とか。
>744のクラスは、変数をばら撒くだけでクラスとしては何もしない無意味な設計だったし。
後はあれだな、関数に渡すのはconst char *にしてmain()で予めargcのチェックと
argv[1]の抽出位しておくのが常套手段か。
777744:2008/02/26(火) 00:57:36
>>776
途中で配列にしたら楽だろうなぁとかは思ったが、
配列だと途中でサイズの変更が利かないから。
ポインタだと動的メモリの割り当てで適当なサイズに
割り当てできるし、と思っただけです。
別に機能さえあってればどのやりかたでもいいんだけど、
個人的には

stdoutの使い方がいまいちわかんなかったから、
そこが勉強になったのと、マクロの名前が大文字ね。
それ完全に忘れてたから勉強になった。
ありがとうってのは主にそこかなぁ・・・。
クラスは再利用に機能を発揮するから今の段階では必要としていないけど、
あとあと拡張していくにあたって必要になってくるから残しておきました。
確かにこの辺は言わんとわからんかったかもしれない。
突っ込まれたんで補足しておきました。
778デフォルトの名無しさん:2008/02/26(火) 05:08:28
>726
ありがとう、ちょっと不安だったんだ。
名前も無いまま渡されるオブジェクトってどうなるんだろ、って。
779デフォルトの名無しさん:2008/02/26(火) 05:56:26
ある関数に引数として構造体のポインタを渡し、そこにアドレスをセットして
返してもらうにはどう書けばよいのでしょう?

BOOL hoge( HOGE *ptr )
{
 …略
 ptr = address;
 return TRUE;
}
としても上手く動かないようです。
780デフォルトの名無しさん:2008/02/26(火) 06:00:17
>>779
整数を受け取るには整数のポインタを渡す必要がある。
構造体を受け取るには構造体のポインタを渡す必要がある。
構造体のポインタを受け取るには構造体のポインタのポインタを渡す必要がある。
781デフォルトの名無しさん:2008/02/26(火) 06:03:19
あ!なるほど。こんな感じでしょうか?
BOOL hoge( HOGE **ptr )

ちなみにC++なのですが、参照渡しを使ってこれは良いのでしょうか?
BOOL hoge( HOGE *&ptr )
一応コンパイルは通るのですが…
782デフォルトの名無しさん:2008/02/26(火) 07:25:27
OK
783デフォルトの名無しさん:2008/02/26(火) 11:34:24
同じクラスなら、別のインスタンスのprivateなデータも参照出来ますよね。継承関係が
ある場合には、親オブジェクトから子オブジェクトを通して親オブジェクトのprivateデータを
参照できたのですが、これってこういうもの?
#include <iostream>
using namespace std;
class test2;
class test {
public:
void func(const test2 &a);
private:
int p;
};
class test2 : public test {
public:
void func2(const test2 &a);
};
void test::func(const test2 &a) {
cout << a.p << endl;
}
test2 T2;
int main()
{
test t;
t.func(T2);
return 0;
}
784デフォルトの名無しさん:2008/02/26(火) 11:37:48
そういうもの。
785デフォルトの名無しさん:2008/02/26(火) 11:40:09
>>783
というか出来ないとまずいだろ。
コピーコンストラクタとか代入演算子の定義が出来なくなってしまうよ。
786デフォルトの名無しさん:2008/02/26(火) 12:06:04
protectedじゃなくてもアクセス出来ちゃうの?
787デフォルトの名無しさん:2008/02/26(火) 12:22:23
protectedにすると、さらにtest2からも参照できるようになる
788デフォルトの名無しさん:2008/02/26(火) 13:01:03
プログラムにZIPを解凍する機能を盛り込みたいのですが、そのような
機能のスタティックリンクできるライブラリをご存じないでしょうか?

環境はVisualC++.net2003です。
789デフォルトの名無しさん:2008/02/26(火) 13:07:03
>>788
zlib
790デフォルトの名無しさん:2008/02/26(火) 13:30:25
>>783じゃないが試してみたけど
同じクラスのインスタンスへの参照やポインタを持つとアクセス権限ブッチぎれちゃうのか

なんかカプセル化とかそういう面で考えると気持ち悪いというかなんというか
仕様上出来ないと仕方ないと言うのも分かるのだが・・・
791デフォルトの名無しさん:2008/02/26(火) 13:33:53
789d
792デフォルトの名無しさん:2008/02/26(火) 13:34:46
C++のprivateはクラスプライベートであってインスタンスプライベートの意味ではない
793デフォルトの名無しさん:2008/02/26(火) 14:02:36
>>782
すみません、寝てました。返答有難うございます。

ちなみに「ポインタ変数を参照で渡す」と言う意味ならむしろ
BOOL hoge( HOGE &*ptr )
のような気がするのですが、なんで*&ptrなのでしょう?
それが仕様と言われればそこまでですが。
794デフォルトの名無しさん:2008/02/26(火) 14:24:18
>>793
http://kmaebashi.com/programmer/pointer.html
これの応用。
ptrのほうからreference to pointer to HOGEと読める。
795デフォルトの名無しさん:2008/02/26(火) 14:26:03
>>793
typedef HOGE * HOGE_PTRしてみれば判る。
796デフォルトの名無しさん:2008/02/26(火) 14:37:54
>>794>>795
なるほど。正直きちんと理解できたかは自信ないですが、ちゃんと法則が
あってそうなっているのは分かりました。
どうも有難うございましたm(__)m
797デフォルトの名無しさん:2008/02/26(火) 14:46:05
vc2008のコマンドラインコンパイラだけ手に入りますか
vc6でコンパイルしたいです
sp1で鈍いパソコンです 
798デフォルトの名無しさん:2008/02/26(火) 14:48:16
EEを入れてみたか?
799デフォルトの名無しさん:2008/02/26(火) 14:49:23
>>797
コンパイラだけ手に入れるのは無理だが
コマンドラインでの利用はできるよ
800デフォルトの名無しさん:2008/02/26(火) 14:56:40
sp1にインストールできますか
801デフォルトの名無しさん:2008/02/26(火) 15:02:40
>>792
kwsk

according to standard
802デフォルトの名無しさん:2008/02/26(火) 15:49:24
すみません
DOSの実行ファイルで、標準出力へは書き出されないメッセージを取得する方法ありませんか?
hoge.exe > log.txt
として取得できないやつです 画面には出ます
標準出力、標準エラーの取り方はわかります
803デフォルトの名無しさん:2008/02/26(火) 16:09:38
>>802
それのどこがC/C++に関係があるの?
804デフォルトの名無しさん:2008/02/26(火) 16:18:38
>>802
つ printscreen
805デフォルトの名無しさん:2008/02/26(火) 16:34:10
>>803
標準出力はこれで受け取れますが、exeが返す実行結果がとれません

#include <windows.h>

main(){
HANDLE hFile = CreateFile("log.txt",GENERIC_WRITE,FILE_SHARE_WRITE, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
SetStdHandle(STD_OUTPUT_HANDLE , hFile);

STARTUPINFO si; PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));ZeroMemory(&pi, sizeof(pi));
si.cb = sizeof(si);
si.hStdOutput =hFile ;
si.hStdError =hFile ;
si.wShowWindow = SW_HIDE;

CreateProcess(NULL, "HtoX32c.exe e:\\0.htm ", NULL, NULL, FALSE,0, NULL, NULL, &si, &pi);

WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hFile);
}
806デフォルトの名無しさん:2008/02/26(火) 16:51:04
HtoX32とやらが標準エラー出力に出している可能性は無い?
そもそも、まさかHtoX32はWindowを持っているアプリケーションなのか?
だとしたら、メッセージフックなどの手段が必要になるよ。
つーか、HtoX32とやらが何ものかにも依るけど同等のプログラムを自分で書いた方が手っ取り早かったりしてね。
807デフォルトの名無しさん:2008/02/26(火) 16:59:39
HTMLをテキストに変換するプログラムです
ソースが公開されていたり定番のライブラリとかありませんか?
808デフォルトの名無しさん:2008/02/26(火) 17:03:03
正規表現での消し方のサンプルみながら自分でやってみます
809デフォルトの名無しさん:2008/02/26(火) 17:11:51
810デフォルトの名無しさん:2008/02/26(火) 17:15:43
popenを使えたら楽だな
あればだけど
811デフォルトの名無しさん:2008/02/26(火) 17:44:11
>>805
そのコードだと、自プロセスの標準出力が hFile になるけど、子プロセ
スの HtoX32c.exe の標準出力はコンソールのままでは?

812デフォルトの名無しさん:2008/02/26(火) 17:44:15
1つの関数に複数の構造体を渡すことって可能でしょうか?

suruct typedef{
int x,y;
}SAMPLE;
SAMPLE sample;

suruct typedef{
int x,y;
}SAMPLE2;
SAMPLE2 sample2;

void AA(??? *s){
int a = s->x;
int a = s->y;
}

void main(){
AA(&sample);
AA(&sample2);
}
こんな処理をしたいのですが、???の所がわかりません。
良い方法を教えていただきたいです。

仮の構造体を1つ作って、その変数に代入→渡すってやり方だとできましたが
激しく面倒くさい。
813デフォルトの名無しさん:2008/02/26(火) 17:52:41
関数オーバーロード、もしくはテンプレート関数でぐぐれ。
814デフォルトの名無しさん:2008/02/26(火) 17:54:43
>>812
typedef SAMPLE SAMPLE2;
815デフォルトの名無しさん:2008/02/26(火) 18:02:57
>>813
>>814
情報ありがとうございます。
テンプレート関数が一番やりたかった事を解決してくれそうでした。
ありがとうございました。
816デフォルトの名無しさん:2008/02/26(火) 18:10:58
構造体のメンバを決め打ちするようなテンプレート関数は感心しないな。
テンプレートを使うということはC++で良いので、それならメンバ関数にしてしまった方が良い。
817デフォルトの名無しさん:2008/02/26(火) 18:22:32
ifstream::readって実際に何バイト読めたか検出できないんですか?
freadみたいにふつうに戻り値が来るのかと思いきや違うみたいですし…。
818デフォルトの名無しさん:2008/02/26(火) 18:28:13
つ gcount
819デフォルトの名無しさん:2008/02/26(火) 18:29:13
>>817
自己レス。failで少なくとも期待通りの
バイト数読めたかどうかは取得できるのね。
820デフォルトの名無しさん:2008/02/26(火) 18:30:30
>>818 と思ったらそんなメソッドがあったか。サンクス
821デフォルトの名無しさん:2008/02/26(火) 18:31:39
fstreamは重要なところでは使うべきではない
APIのほうがよい
822デフォルトの名無しさん:2008/02/26(火) 18:55:55
んなこたーない
823デフォルトの名無しさん:2008/02/26(火) 19:18:08
fstreamは一社の開発ではないがAPIはMS一社
どのコンパイラでも同じ動作になる
あと3000個とか開けない
824デフォルトの名無しさん:2008/02/26(火) 19:18:50
if文って 文字列と文字列を比べることって出来ないですよね?
1 = あいうえお
2 = かきくけこ
3 = さしすせそ
4 = あいうえお
if (a = 1){
}
みたいなことをやりたいのですがどうしたら良いでしょうか?
825デフォルトの名無しさん:2008/02/26(火) 19:19:44
stringはできる
826デフォルトの名無しさん:2008/02/26(火) 19:20:33
> どのコンパイラでも同じ動作になる
コンパイラで差はないかもしれないが・・・
827デフォルトの名無しさん:2008/02/26(火) 19:21:41
>>823
んなばかな
APIがMS一社で規定されてるなんて初めて知った
MSはついに世界を征服したのか
828デフォルトの名無しさん:2008/02/26(火) 19:23:04
Windowsのファイル入出力APIのことを指す
829デフォルトの名無しさん:2008/02/26(火) 19:55:08
>>824 strcmpしとけ
830デフォルトの名無しさん:2008/02/26(火) 21:19:23
CreateProcessしたときに止まらなくなったら停止させたいんですけど
どうやったらいいですか?
831デフォルトの名無しさん:2008/02/26(火) 21:22:25
ググって解決しました
832デフォルトの名無しさん:2008/02/26(火) 21:58:13
マルチスレッドで動かしてる関数って_endthread()書かなくてもreturn;書いてたら
問題ない?
833デフォルトの名無しさん:2008/02/26(火) 22:04:41
問題ない。
ところで_beginthreadは使うなよ。_beginthreadexにしろよ。
http://msdn2.microsoft.com/ja-jp/library/kdzttdcb(VS.80).aspx
834デフォルトの名無しさん:2008/02/26(火) 22:15:49
VC6.0です。

__declspec(dllimport) int __stdcall hoge( LPWORD, LPWORD, LPWORD );

という形の関数のアドレスが入る関数ポインタhageを作りたいのですが、
うまく宣言できません。

__declspec(dllimport) int __stdcall (*hage)(LPWORD, LPWORD, LPWORD );
などとやるとコンパイルエラーになってしまいます。

どうすれば宣言できるのでしょうか?
835デフォルトの名無しさん:2008/02/26(火) 22:17:26
declspecは関係ないだろ
836デフォルトの名無しさん:2008/02/26(火) 22:19:03
関係あるよ
837デフォルトの名無しさん:2008/02/26(火) 22:19:32
関数ポインタで悩んだら、typedef

typedef __declspec(dllimport) int __stdcall hogetype( LPWORD, LPWORD, LPWORD );
hogetype hoge;
838デフォルトの名無しさん:2008/02/26(火) 22:36:15
関数ポインタの便利さになれすぎてしまって
最近 if を見るたびにすぐ関数テーブル化してしまう。

間違い?
839デフォルトの名無しさん:2008/02/26(火) 22:39:07
なるべくシンプルにかくのを推奨されますからね
840デフォルトの名無しさん:2008/02/26(火) 22:43:09
関数テーブル間違いです
鈍いです
841デフォルトの名無しさん:2008/02/26(火) 22:47:58
なんかCreateProcessすると不安定になる スレッドでsystemで実行してみる
CreateProcessを短期間に20回以上使うと動かなくなるエラーってありますか?
実行する側のexeのせいかもしれないですが
842デフォルトの名無しさん:2008/02/26(火) 22:50:02
テーブルだめなのか・・
if の中にさらに if があるともうその地点でうわ・・って思ってしまう。

ちょっとソース見直してみます
843デフォルトの名無しさん:2008/02/26(火) 22:50:41
>>833
ありがとう。今度からそうする
844デフォルトの名無しさん:2008/02/26(火) 22:54:19
そこでBoost::functionとコールバックですよ。
845デフォルトの名無しさん:2008/02/26(火) 22:59:28
>>842
無理して避けることもないよ。何事も程々が1番。
846デフォルトの名無しさん:2008/02/26(火) 23:02:18
グローバル変数って絶対使わない方がいいんですかねえ
例えばゲームプログラムを作っていて、状態を管理するグローバル変数を使っているとする。
その変数には、ゲームの進行に合わせて、例えば
定数(TITLE=0, STAGE1, STAGE2, STAGE3, STAGE_CLEAR, GAME_OVER, ENDING)が入るとする。
処理は上の状態それぞれでモジュール化されているとすると、
どうしても状態管理変数はグローバル変数化してどの状態からでも
参照・設定できるようにせざるを得ないと思うのですが、何かいい手があるのでしょうか。
状態管理変数をファイル内static変数にしてセッターを使って書き換えるようにしたり、
状態管理変数とセッターをクラスにしてそのオブジェクトのスコープをグローバルにするもしくは状態管理変数とセッターを
staticにしてどのクラスからでも書き換えられるようにするくらいなら最初から状態管理変数をグローバルにしといた方が
シンプルだと思うのですがどうでしょうか。
847デフォルトの名無しさん:2008/02/26(火) 23:03:57
数が多くなければOK、重要ならOK
848デフォルトの名無しさん:2008/02/26(火) 23:05:38
>>846
静的なシングルトンもグローバル変数も似たようなもんだ
グローバル変数でいいんじゃね?

ただ、関数経由にしておけばデバッグするときに setter で引っ掛ければいいだけだから
ずいぶんと楽になる*かもしれない*
849デフォルトの名無しさん:2008/02/26(火) 23:30:59
>>846
シングルタスクなら良いけど。
GUIでスレッド使って随時処理しながら入力待ちして、
入力はコールバックで処理、みたいのだと、
ゲッタやセッタ作った方が排他処理し易いかなぁ。

まぁケースバイケース?
850デフォルトの名無しさん:2008/02/26(火) 23:32:07
ゲーム状態のインスタンスが1つだけなら、グローバル変数でいいと思う。

インスタンスが複数なら、
状態ごとの処理に、状態管理変数をクラス化したものを渡すとか、
もしくはstateパターンなんてのもいいかもしれない。
851デフォルトの名無しさん:2008/02/26(火) 23:33:35
どうせグローバル変数的に使うとはいえ、
それゆえにどこから変更されてるかを追跡するためにも
>関数経由にしておけばデバッグするときに setter で引っ掛ければいいだけだから
というのは地味に大事
852デフォルトの名無しさん:2008/02/26(火) 23:38:31
ゲーム状態も例えば、プレイヤキャラの他にAIキャラが裏で進行中なんてことになると、
グローバルだと破綻するよね。そんな場合はゲーム状態はキャラクタに依存する情報になるわけだけど。
853デフォルトの名無しさん:2008/02/26(火) 23:46:14
シングルトンとグローバル変数は違う。
グローバル変数として使ってる間違ってる例が多いのが勘違いの原因かもしれない。

自分だったら>>846の場合、シーンマネージャクラスを作ってそいつに振る舞いを管理させる。
極力グローバル変数は使わない。
854デフォルトの名無しさん:2008/02/27(水) 00:01:10
シングルトンは初期化のタイミングを選べるからグローバルとは大きく違う。
855デフォルトの名無しさん:2008/02/27(水) 00:20:00
結局オブジェクト指向の導入でCにおけるグローバル変数使用の問題は解決できてないんじゃねえの
Cを極めればオブジェクト指向言語を使わなくても良いコードが書けるんじゃねえの結局クラスとか
オブジェクトとかデザインパターンとか複雑で分かりにくくするなだけじゃね
856デフォルトの名無しさん:2008/02/27(水) 00:21:36
system は空白が改行のように扱われてしまいます
パラメータは渡せませんか?
857デフォルトの名無しさん:2008/02/27(水) 00:22:49
>>855
んなこたーない
858デフォルトの名無しさん:2008/02/27(水) 00:26:23
ファイルの読み込みについての質問です。

 ----
 2008/02/20,01:00:00
 2008/02/21,02:00:00
 2008/02/26,03:00:00
 …
 ----

と書かれたファイルを、

 tmp[0] = 2008;
 tmp[1] = 2;
 tmp[2] = 20;
 tmp[3] = 01;

といったように取り込みたいです。
スラッシュとカンマとコロンを区切りにしてうまく取り込む方法を教えてください。
もし、スラッシュしかなければstrtokとatoiでできたのですが、3種類あるので困っています。
よろしくお願いします。
859デフォルトの名無しさん:2008/02/27(水) 00:28:04
>>856
どんな文字列を渡したとき?
860デフォルトの名無しさん:2008/02/27(水) 00:28:08
見た感じフォーマットは固まってるだろうから
単純に先頭からパースするだけじゃね
861デフォルトの名無しさん:2008/02/27(水) 00:29:09
string s;

s.substr(0,4);
s.substr(5,2);
s.substr(7,2);
とかでいいのでは?
862デフォルトの名無しさん:2008/02/27(水) 00:31:49
>>858
fscanf(fp, "%d/%d/%d,%d:*[^\n]", &tmp[0], &tmp[1], &tmp[2], &tmp[3]);
863デフォルトの名無しさん:2008/02/27(水) 00:31:50
>>859
自己解決しました 同名のexeがありそれが動いていたようです
864デフォルトの名無しさん:2008/02/27(水) 00:34:11
862の訂正 *の前に%
fscanf(fp, "%d/%d/%d,%d:%*[^\n]", &tmp[0], &tmp[1], &tmp[2], &tmp[3]);
865デフォルトの名無しさん:2008/02/27(水) 00:34:23
>>855
>Cを極めればオブジェクト指向言語を使わなくても良いコードが書けるんじゃねえの
これは当たり前なんだが、(といってもオブジェクト指向を使わないって意味じゃない、
Cでもオブジェクト指向は昔から存在する)

>結局クラスとかオブジェクトとかデザインパターンとか複雑で分かりにくくするなだけじゃね
何が複雑なんだ?
デザインパターンなんか当たり前の設計パターンに名前付けただけじゃないか。
866デフォルトの名無しさん:2008/02/27(水) 00:36:27
変数へのアクセスを制限することで単純になるんだけどなぁ。
無制限に変数にアクセスできたほうが複雑だって、わかんないかなぁ。
867デフォルトの名無しさん:2008/02/27(水) 00:48:26
Perlの文法が糞なのは間違いない。
868858:2008/02/27(水) 01:12:38
>861
レスありがとうございます。
が、、私ではうまいこと使えませんでした。ごめんなさい。。

>860, 864
fscanfでできました。
どうもありがとうございました。
869デフォルトの名無しさん:2008/02/27(水) 01:23:50
C++で配列のコピーってどうやりますか?
for()文で代入を回す?
870デフォルトの名無しさん:2008/02/27(水) 01:24:40
memcpyが最速では
871デフォルトの名無しさん:2008/02/27(水) 01:26:15
>866
何を以て「単純」とするかに依るんだろうな。
多分 >855 は言語の構造として単純であること、習得の容易さなどを見て言っているんだろうが
大きなコードを、そのまま扱うと中身はかなり複雑化する。
クラスや名前空間などを使って、大きなコードを小さな部品の集合体として考えて
それぞれの部品単位で扱うことで、ひとつひとつの部分は単純になる。
872デフォルトの名無しさん:2008/02/27(水) 01:26:28
>>869 std::copy()
873デフォルトの名無しさん:2008/02/27(水) 01:27:43
>>870 C++ で memcpy() は使わない。禿との約束だよ。
874デフォルトの名無しさん:2008/02/27(水) 01:30:02
推奨されていなくても確保の仕方から
vectorでもstringで有効でしょう memcpy
875デフォルトの名無しさん:2008/02/27(水) 01:31:12
memcpyより自分でアセンブラ書いた方がはやかったんだけど、そんなもん?
876デフォルトの名無しさん:2008/02/27(水) 01:31:59
>>875 それはめずらしい。
877デフォルトの名無しさん:2008/02/27(水) 01:39:54
memcpyより早いコードくれ
878デフォルトの名無しさん:2008/02/27(水) 01:40:26
SSE使ったんだけどね
879デフォルトの名無しさん:2008/02/27(水) 02:17:49
マイクロソフトのCHMファイルはなかなかいいんだけど
SJISしかコンパイルできなくて、サイズが20Mとかになるとコンパイルに失敗する
CHMをパクってWindowsの標準ヘルプ形式を作りたい 
参加者募集中
圧縮接尾辞配列がいいと思う
ブロックーソーティングしたデータはそのまま全文検索できるとおもうがどうか?
880デフォルトの名無しさん:2008/02/27(水) 02:27:20
複数のテキスト文書を圧縮できてかつ高速に全文検索できて
CHMのような普及率を目指したい
デスクトップサーチとは目的が違う 元のファイルが復元できてまとめられる点が大事
881デフォルトの名無しさん:2008/02/27(水) 02:28:28
tarでいいじゃない
882デフォルトの名無しさん:2008/02/27(水) 02:33:30
tarは全文検索できるように設計されてるの?
883デフォルトの名無しさん:2008/02/27(水) 02:38:51
tarは圧縮しないからね。
884デフォルトの名無しさん:2008/02/27(水) 02:40:51
>>875
アラインメントに縛りを入れれば早くはできると思う
885デフォルトの名無しさん:2008/02/27(水) 02:46:44
半分にはならないとだめだな chmは全文検索できて元の半分になるよ
886デフォルトの名無しさん:2008/02/27(水) 02:51:09
>>880
専ブラのログをまとめるのに便利そうだ
あてにせず期待してるよ
887デフォルトの名無しさん:2008/02/27(水) 03:29:32
badc$の巡回データは
adc$b
dc$ba
c$bad
$badc

ソートすると
$badc
adc$b
badc$
c$bad
dc$ba
ブロックソートではcb$daというデータのみが与えられる
復元しようとするとここまでは直ぐわかる
$***c
a***b
b***$
c***d
d***a
c$、ba、、$b、dc、adと繋がっていることがわかる
たとえばdcというデータは何番目に出現するか求めるとすると末尾のcから調べていけば良さそうだが
888デフォルトの名無しさん:2008/02/27(水) 03:41:52
std::string
のような STL クラスを前方宣言するにはどうしたらいいですか?
それともこういうクラスって前方宣言しないでヘッダーに直接 include
させても問題ないですか?
889デフォルトの名無しさん:2008/02/27(水) 04:17:01
Visual C++ Express Edition を入手したので、簡単なプログラムを作ってみようと思ったのですが、
なぜかコンパイルできません。
コマンドラインで、 cl c:\source.cpp としても、
'cout' : 定義されていない識別子です。
'endl' : 定義されていない識別子です。
等とエラーが返ってきます。
ちなみに、ソースは以下のようなものです。

#include <iostream>

int main(void)
{
cout << "Hellow, World!" << endl;
return 0;
}

なぜエラーになるのか分かりません。お暇な方いましたら、どうかお知恵をお貸しください。
890デフォルトの名無しさん:2008/02/27(水) 04:20:39
×cout << "Hellow, World!" << endl;
○std::cout << "Hello World!" << std::endl;
891デフォルトの名無しさん:2008/02/27(水) 04:21:19
あんたが外国にいるんじゃなかったら、本を買って勉強しる。

とりあえず、
std::cout << "Hellow, World!" << std::endl;
としてやってみ。

もしくは、
using namespace std:
をinclude 文の下に書いておくとか。

まあがんばれ。

892デフォルトの名無しさん:2008/02/27(水) 04:24:33
>>890
ありがとうございます。
using namespace std; を追加したらコンパイルできました・・・ ^ ^;
最初、#include <iostream.h> としていて、コンパイル時にそんなファイルは無いと言われ、
#include <iostream> に直したら今度は cout が定義されて無いと言われ・・・
完全に勉強不足ですね・・・・
893デフォルトの名無しさん:2008/02/27(水) 04:48:08
>892
環境によっては

#include <iostream.h>

と書くと、using namespace std; を勝手にやってくれるんだわ。
多分、そういう環境を前提にしたコードだったんだろう。
894デフォルトの名無しさん:2008/02/27(水) 08:20:07
ついでに勉強不足の俺に教えてください
#include <string.h>
#include <stdio.h>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
string a = "0908a89";

printf("%s\n", a);
getchar();
return 0;
}

aに0908a89が代入されて無いみたいなのですが、何処がまずいのでしょうか?
895デフォルトの名無しさん:2008/02/27(水) 08:37:47
いろいろまずい。
というか、それVCならコンパイルとおるの?gcc 2.96だと少なくとも通らない。

・string.hってCの奴じゃないかな。#include <string>と書くべし
・その場合aってのはstring型なので、printfに%sで受けるのはよろしくない。
 書くならprintf("%s\n",a.c_str());
・でも、せっかく#include <iostream>してるんだから
 cout << a << endl;でいいじゃん。
・ところで最後のgetcharは何のために?

以上直すと、こっちでは代入されるよ。
896デフォルトの名無しさん:2008/02/27(水) 09:02:30
>>895
ありがとー 出来ました。
コンパイルは出来てましたがNULLが表示されました。
getchar();しないと画面が速攻閉じてしまうので、画面確認用にです。
897デフォルトの名無しさん:2008/02/27(水) 09:06:36
>>896
修正したソースを張ってみないと有効な回答は得られないと思うよ。
898デフォルトの名無しさん:2008/02/27(水) 09:09:57
int* random_array(int n);
shared_ptr<int> p(random_array(100));
というように書けないのですが、shared_ptrの作成時って、必ずnew[100]とかって
やらないとだめなのですか?
899デフォルトの名無しさん:2008/02/27(水) 09:30:04
>>898
arrayの共有にはshared_arrayな。
それとエラーメッセージ書かないとエスパーしか解答できない。
900デフォルトの名無しさん:2008/02/27(水) 11:36:18
system("path %PATH%; C:\\hofe;");
が有効になりません・・・
なぜでしょう
901デフォルトの名無しさん:2008/02/27(水) 11:59:17
>>900
環境変数はプロセスごとに別々だから
子プロセスを起動してPATHを設定させても自プロセスには影響しない
902デフォルトの名無しさん:2008/02/27(水) 12:07:43
改行しても無理でした パスを直うちするか、そこへ移動するしかないですか?
APIでPath設定できるか調べてみます
system("path C:\\hofe; \n abc.exe");
903デフォルトの名無しさん:2008/02/27(水) 12:20:15
pathを追加する方法教えてください わかりませんでした
904デフォルトの名無しさん:2008/02/27(水) 12:24:10
SetEnvironmentVariable
905デフォルトの名無しさん:2008/02/27(水) 12:30:25
サンクス
長い実行パスと、長いパラメータパスで困ってました
これで解決しそうです
906デフォルトの名無しさん:2008/02/27(水) 13:29:07
#include "stdafx.h"
#include <string>
#include <stdio.h>
#include <iostream>

using namespace std;

略)

string x;

sprintf(x, "%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);

これで、buf[0], buf[1], buf[2], buf[3], buf[4]の値をstring型 でx代入したいんですけど
xが定義されていないと怒られてしまいます。どうしたら良いのでしょうか?
907デフォルトの名無しさん:2008/02/27(水) 13:39:20
string x(11,'\0');

sprintf(&x[0], "%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);

これは無理?
908デフォルトの名無しさん:2008/02/27(水) 13:51:44
>>907
テラThanks
909デフォルトの名無しさん:2008/02/27(水) 13:57:03
まず間違いなく大丈夫ではあるものの一応標準外の仕様だと心にとどめておくといい
910デフォルトの名無しさん:2008/02/27(水) 14:02:11
winsockを使うときエコーバックするのは普通ですか?
それとも負荷を下げるためにしませんか?
少量ずつデータ受け取ればミスしにくくなると思うんですけど
少しずつ受け取って確認無しでいいですか
911デフォルトの名無しさん:2008/02/27(水) 14:02:13
次の改訂で標準になるけど、コンパイラの対応が普及するまで合わせると、
問題ないと言えるのは何年も先かなぁ。
912デフォルトの名無しさん:2008/02/27(水) 14:09:00
http先のファイルのサイズやcrcを取得する方法教えてください
それみてデータが正常が判定したいです
913デフォルトの名無しさん:2008/02/27(水) 14:23:32
>>910
何をどこにエコーバックするんだ
ミスって何のだ

>>912
ファイルサイズは全部受信すればわかるだろう
CRCの計算方法はこれ↓
http://en.wikipedia.org/wiki/Computation_of_CRC
914デフォルトの名無しさん:2008/02/27(水) 14:40:20
>>912
サイズはレスポンスヘッダのContent-Length (ない場合もある)
CRC は無理かと
915907:2008/02/27(水) 14:46:39
もう一つ教えて下さい。

char str[100];

sprintf(str, "%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);

char str0[100];
char str1[] = "01061719d0";
char str2[] = "0106171f34";

if (strcmp(str, str1) == 0){
printf("この番号は登録されています@\n番号%s\n",str);
}
else if (strcmp(str, str2) == 0){
printf("この番号は登録されていますA\n番号%s\n",str);
}
else {
printf("この番号は登録されていません\n番号%s\n",str);
}
このようなif文にしたいのですが、登録したbuf[]を読み込んでも"この番号は登録されていません"
と表示されてしまいます。なぜでしょうか?
916デフォルトの名無しさん:2008/02/27(水) 14:53:34
std::vectorとCStringでは、empty() (とEmpty()) の意味違うのね〜

しばらく騙されてました。
917デフォルトの名無しさん:2008/02/27(水) 14:54:36
stlのset使った方がいいんじゃない
918デフォルトの名無しさん:2008/02/27(水) 15:03:58
>>915
strを表示させてみるんだ
919デフォルトの名無しさん:2008/02/27(水) 15:06:37
>>914
GETでして送られてくるヘッダをみるんですよね?
2chのスレURLいれるとサイズ書いてないです
できる限りなんとか取得する方法無いですか?
920デフォルトの名無しさん:2008/02/27(水) 15:08:28
送受信のデータです

GET http://live27.2ch.net/test/read.cgi/livemarket2/1202634378/ HTTP/1.0

HTTP/1.1 200 OK
Date: Wed, 27 Feb 2008 06:07:25 GMT
Server: Apache/2.0.59 (Unix) PHP/4.4.2 mod_ssl/2.0.59 OpenSSL/0.9.7e-p1
Vary: Accept-Encoding
Connection: close
Content-Type: text/html
921デフォルトの名無しさん:2008/02/27(水) 15:12:53
動的に変化するから無理そうですね
通信切れで見られないHMLの取得を避けたいんですけどいい方法ありませんか
922デフォルトの名無しさん:2008/02/27(水) 15:15:27
最後に </html> が無かったら途中で切れたと判断するとか
923デフォルトの名無しさん:2008/02/27(水) 15:20:51
普通のテキストならどうしたらいいですか?
もともと不完全なHTMLならどうしたらいいですか?
サーバーのファイルと一致していてもエラーになります
924915:2008/02/27(水) 15:23:30
>>918
str は 0106719d0 になっているようです><
なんでうまくいかないんだろう。。
925デフォルトの名無しさん:2008/02/27(水) 15:25:54
>>922
HTML4では </html> は省略可能なので万能じゃない

>>920
Connection: close
って書いてあるから接続断まで読めばそれで全部。

あと、なるべくHTTP/1.1使え
手元で確認した限り、HTTP/1.1でアクセスすると
chunked で送ってくるので末尾がちゃんと確認できる
926920:2008/02/27(水) 15:28:36
サンクス
927デフォルトの名無しさん:2008/02/27(水) 15:34:26
>>924
sprinf で \n を付けているのに str1, str2 には付いていないぞ
928デフォルトの名無しさん:2008/02/27(水) 15:35:55
HTMLパーサは↓程度はきちんと解析してくれないとねぇ‥‥

46 名前:デフォルトの名無しさん[sage] 投稿日:2008/01/27(日) 00:38:23
これだって正しいでっせ

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<title>テスト</>
<p><em/ほげほげ/
<p style=width:50px<strong>ふーばー</strong</p>
929デフォルトの名無しさん:2008/02/27(水) 15:42:57
1.0から1.1にするとバットリクエストのエラーになります
書式が違うんでしょうか_

buf="GET " + path + " HTTP/1.1\r\n\r\n";
n=send(sock, buf.c_str(), buf.size(), 0);
930デフォルトの名無しさん:2008/02/27(水) 15:44:16
1.1はHostヘッダの送信が必須
931デフォルトの名無しさん:2008/02/27(水) 15:44:52
1.1だと、ユーザー情報も送信しないと無理になるんですか
932デフォルトの名無しさん:2008/02/27(水) 15:54:08
なおらないです どうすればいいですか?

GET /test/read.cgi/livemarket2/1202634378/ HTTP/1.1
Accept: */*
Referer: http://live27.2ch.net/
Accept-Language: ja
Host: live27.2ch.net
Connection: Keep-Alive

HTTP/1.1 400 Bad Request

ソース
buf="GET " + ko+ " HTTP/1.1\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Accept: */*\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Referer: http://"+sev+"/"+"\r\n\r\n";;
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Accept-Language: ja\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Host: "+sev+"\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Connection: Keep-Alive\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
933デフォルトの名無しさん:2008/02/27(水) 15:58:54
改行大杉
934デフォルトの名無しさん:2008/02/27(水) 16:01:24
2回改行するのは最後だけ
935915:2008/02/27(水) 16:02:42
>>927
盲点でした。
やっと次の作業に進めそうです。本当にありがとうございます。
936デフォルトの名無しさん:2008/02/27(水) 16:06:31
サンクス 改行削って上手くいきました
あと受け取るバッファを多くすると返却値を間違えるようなんです
どうやれば直りますか?
n = recv(sock, &buf[0], 128000, 0);
としてnまで表示するとデータ入ってないときがあります
937デフォルトの名無しさん:2008/02/27(水) 17:05:30
めっちゃミジンコの質問させて下さい。
図書館で借りてきた本のページが抜けてて%cはどういう時に使うのか
わかりません;
%はぐぐれないみたいで困ってます。
938デフォルトの名無しさん:2008/02/27(水) 17:08:24
939937:2008/02/27(水) 17:16:21
>>938
まだ始めたばかりなのでこのサイトはちょっと厳しいです・・・。

文字ということで本を読みすすめてみます。
有難うございました。
940デフォルトの名無しさん:2008/02/27(水) 19:49:40
>>932,936
send も recv も、指定したサイズ未満しか送受信できないことがあるので、
その場合にも対応すること。
あと、エラー処理もちゃんと毎回やること。
941デフォルトの名無しさん:2008/02/27(水) 20:53:29
HTTPで初めにサイズだけ取得したとして、読む位置をデータの始まりにシークできますか?
初期化からやり直した方がいいですか?
データ位置を自前で判別して方がネットワークの負荷は少なくなりますが
942デフォルトの名無しさん:2008/02/27(水) 20:55:33
自己解決しました
いったん全部読み込んで、ヘッダとデータを分離してサイズが不一致なら再送にします
943デフォルトの名無しさん:2008/02/27(水) 20:56:50
すいません。タイトルにふさわしく初歩的な質問ですが、
ポインタはメモリを格納しているアドレスの位置を指す
と言いますが、ではそのポインタの情報はどこに格納
されるのでしょうか?

944デフォルトの名無しさん:2008/02/27(水) 21:01:14
実行時なら、それを格納しているのがポインタ変数。

コンパイル時、&xという記述からどうやってxのアドレスを知るかと言うことなら、
それはコンパイラの仕事、コンパイラが決めること。
945デフォルトの名無しさん:2008/02/27(水) 21:08:38
つまりint とか char とかと同じような感じでアドレスが入ってる変数があるってだけさ
946デフォルトの名無しさん:2008/02/27(水) 21:09:38
ごめん語弊がありますねすいません
(入ってるのアドレスだけじゃないですね)
947デフォルトの名無しさん:2008/02/27(水) 21:11:45
普通はアドレスだけだと思うが。
メンバポインタとかは別だが。
948デフォルトの名無しさん:2008/02/27(水) 21:12:50
string x, y="*****"; となっていたとして、
xとyのデータを一致するようにできますか コピーではなくて
949デフォルトの名無しさん:2008/02/27(水) 21:14:24
int a,b=10;
&a=&b;のような事はできないですよね?
950デフォルトの名無しさん:2008/02/27(水) 21:14:35
string x = "*****", y = x;

という話ではなくて?
951デフォルトの名無しさん:2008/02/27(水) 21:16:08
string だと共用体が使えないから
参照にするしかないな。

string y = "*****", &x = y;
952デフォルトの名無しさん:2008/02/27(水) 21:16:48
同一アドレスの同一データにしたいのですが 無理ですよね
953デフォルトの名無しさん:2008/02/27(水) 21:18:11
x も xもポインタにして確保した同じとこさせばいいんじゃね?
954デフォルトの名無しさん:2008/02/27(水) 21:19:46
>>949
アドレス演算子の結果は右辺値だと思った。
955デフォルトの名無しさん:2008/02/27(水) 21:21:38
>>949
int *ap = &a;
int *bp = &b;

ap = bp;
956デフォルトの名無しさん:2008/02/27(水) 21:25:39
>>952
何でそう言う事がしたいの?
957デフォルトの名無しさん:2008/02/27(水) 21:36:28
すでに確保された変数のアドレスを書き換えるテクがあるかなと思った
958デフォルトの名無しさん:2008/02/27(水) 21:38:06
アドレスはマシン語にそのまま組み込まれてるんだぜ?
959デフォルトの名無しさん:2008/02/27(水) 21:40:37
変数は極端な話レジスタに載ってるかも知れないわけで。

string x,y="...";
#define x y
960デフォルトの名無しさん:2008/02/27(水) 21:43:17
string y = "*****", &x = y;

とした場合、最適化で x と y が同一視される可能性はあるんじゃないかな。
961デフォルトの名無しさん:2008/02/27(水) 21:47:24
>>957
変数のアドレスは、変数が確保されたときに固定されるものだろ。
「すでに確保された変数のアドレスを書き換えるテク」を期待する目的がわからん。
962デフォルトの名無しさん:2008/02/27(水) 21:50:29
論理アドレスくらいなら書き換えることは可能かもしれない。
963デフォルトの名無しさん:2008/02/27(水) 22:22:39
class CSample2{};

class CSample
{
public:
  void get( CSample2 *obj_s2 ){obj_s2 = &m_obj_s2
private:
  CSample2 m_obj_s2;
};

main{
  CSample1 obj_s1;
  CSample2 *obj_s2 =NULL;
  obj_s1.get( obj_s2 );
}

これでmain内のobj_s2がobj_s1.m_obj_s2と同じ物を指すようにしたかったのですが、NULLを指したままかわりません。
参照戻しではできたのですが、これで出来ない理由がわからず気持ち悪いです。
どなたか原因のご教授お願いします。
964デフォルトの名無しさん:2008/02/27(水) 22:23:37
vectorに関数ポインタを格納するにはどうしたらいいでしょうか?

vector<bool (*func)(int)> EroeroFunction;
 ↑<>の中のカッコが悪戯してうまくコンパイルが通らなくて困ってます。

構造体に関数ポインタを入れればなんとかなるんですが、メンバが1つしかないのでなんとも。
965デフォルトの名無しさん:2008/02/27(水) 22:27:29
かなりのFAQ。引数経由でポインタを戻すなら、ポインタのポインタかポインタ参照か
どっちかつかえ。

<  void get( CSample2 *obj_s2 ){obj_s2 = &m_obj_s2

>  void get( CSample2 *&obj_s2 ){obj_s2 = &m_obj_s2;}

>  void get( CSample2 **obj_s2 ){*obj_s2 = &m_obj_s2;
}
966デフォルトの名無しさん:2008/02/27(水) 22:27:58
>>963
get関数内でobj_s2を書き換えても、呼び出し側のobj_s2は書き換わらない。
関数に引数を渡す際の基本だろ?
ポインタを書き換えたいなら、ポインタをアドレス渡しでもすればいい。
void get( CSample2** ppobj_s2 ) { *ppobj_s2 = &m_obj_s2; }
obj_s1.get( &obj_s2 );
967デフォルトの名無しさん:2008/02/27(水) 22:29:45
>>964
vector<bool (*)(int)> じゃないの?
968デフォルトの名無しさん:2008/02/27(水) 22:33:46
vector<char>って後方に同じ型を連結できますか
そういう関数ありますか
969デフォルトの名無しさん:2008/02/27(水) 22:34:45
>>968
言ってる意味が分からない。
970デフォルトの名無しさん:2008/02/27(水) 22:35:22
push_backでは一つしか増やせません 一度に増やすやつないですか
971デフォルトの名無しさん:2008/02/27(水) 22:36:14
>>968
std::copyとstd::back_inserterを組み合わせるんじゃねーの?
972デフォルトの名無しさん:2008/02/27(水) 22:36:42
>>968
こういうこと?
vector<char> v1, v2;
v1.insert(v1.end(), v2.begin(), v2.end()); // v1の末尾にv2の全要素を追加
973デフォルトの名無しさん:2008/02/27(水) 22:37:22
vector<int> x,y;

x={1,2,3}
y={4,5,6}

x.push_back(y)={1,2,3,4,5,6}

こういうやつです
974デフォルトの名無しさん:2008/02/27(水) 22:39:20
それでできますかサンクス
975デフォルトの名無しさん:2008/02/27(水) 22:41:49
まんまinsertでいいんじゃね?
976デフォルトの名無しさん:2008/02/27(水) 22:42:56
insertやね
operator+=を外部に定義しておくと便利かも
977デフォルトの名無しさん:2008/02/27(水) 22:47:04
要素の連結か、要素ごとの+=か曖昧なので、そんなのいらんかも
978デフォルトの名無しさん:2008/02/27(水) 23:07:18
C言語なんですが
配列でポインタ表現を使ってアクセスしてインクリメントようと思って
*(array+i)++としたら'++'には左辺値が必要です、とエラーが出てきました
これは配列で宣言したからだと思うんですが
ポインタで宣言した場合は値が飛び飛びになるので、*(array+i)みたいな表現できないでしょうし
どうすればいいでしょう?
979デフォルトの名無しさん:2008/02/27(水) 23:09:43
(*(array+i))++;
++*(array+i);

変なことになったらとりあえず優先順位を疑うのは基本。
980デフォルトの名無しさん:2008/02/27(水) 23:10:19
*((array++)+i) // arrayを増やす場合
*(array+i++) // iを増やす場合
981デフォルトの名無しさん:2008/02/27(水) 23:11:35
*(array+i) と array[i] は優先順位以外は等価。
982デフォルトの名無しさん:2008/02/27(水) 23:12:23
>>979
できました。ありがとうございます。
優先順位って今まで全然気にしてませんでしたので
今後注意して行こうと思いますorz
983デフォルトの名無しさん:2008/02/27(水) 23:14:10
>>979>>980 のどちらを意図してるんだろうか。

それはともかく、array[i]++; と書けばいいのに
何でそうしないのか本気で理解できない。
984デフォルトの名無しさん:2008/02/27(水) 23:27:31
i++[array]と書くのが漢
985デフォルトの名無しさん:2008/02/27(水) 23:30:03
漢すぎるwwwwww
986デフォルトの名無しさん:2008/02/27(水) 23:39:05
(*(array + i))++; ←等価→ array[i]++; ←等価→ i[array]++;
array++[i]; ←等価→ *((array++)+i) ←等価→ i[array++];
i++[array]; ←等価→ array[i++]; ←等価→ *(array+i++);
987デフォルトの名無しさん:2008/02/27(水) 23:40:43
はじめて見た。
誰だよこんな書き方見つけた奴……
988デフォルトの名無しさん:2008/02/27(水) 23:43:59
*(E1+E2) と E1[E2] の挙動は等価だと規格に書いとるべ。
*(array+i) と *(i+array) が等価なのと同じく
array[i] と i[array] も等価だべ。
989デフォルトの名無しさん:2008/02/27(水) 23:44:30
array[i]を*(array+i)の糖衣構文とすることを発案した人が真っ先に見つけただろうな。
で、誰?
990デフォルトの名無しさん:2008/02/27(水) 23:45:42
(i % 16)["0123456789ABCDEF"]
991デフォルトの名無しさん:2008/02/27(水) 23:45:54
string x,y; N=0; x.resize(0); に対して

x+=y;

memcpy(&x[N],&y[0], y.size()); N+=y.size;

は同じのはず
yがバイナリデータだと上が失敗することが多いです
992デフォルトの名無しさん:2008/02/27(水) 23:47:15
>>990
すげぇwwww感動したwwwwwww
993デフォルトの名無しさん:2008/02/27(水) 23:49:12
>>991
x のメモリ確保はどこ行った。
994デフォルトの名無しさん:2008/02/27(水) 23:50:05
メモリ確保はあらかじめしておいてください あと最後にNでresizeも
995デフォルトの名無しさん:2008/02/27(水) 23:50:49
>>991
stringに文字列以外入れるなよ。
あと、x.capacity() >= y.size() でないとmemcpyがメモリ壊すぞ。
996デフォルトの名無しさん:2008/02/27(水) 23:51:46
>>994
同じというなら、同じになるコードを書けよ。
997デフォルトの名無しさん:2008/02/27(水) 23:53:00
変な入門書で配列のとこにすぐにその記法が説明してあったからできるのは知ってたけど、
できる理由は全然考えたことがなくて、今はじめて理解したw
998デフォルトの名無しさん:2008/02/27(水) 23:53:19
zipファイルを少しずつyに入れてからxに足し込むんですけど
memcpyの方は書き出して復元できますが、+=はまれに正常でほとんど壊れます
原因はなんでしょう
999デフォルトの名無しさん:2008/02/27(水) 23:55:24
>>998
vectorを使わずstringを使ったから。
1000デフォルトの名無しさん:2008/02/27(水) 23:55:32
なんで文字列じゃないものをstringに入れるんだ。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。