【初心者歓迎】C/C++室 Ver.49【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/02/20(水) 12:33:41ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1202141921/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
00021だけど
2008/02/20(水) 12:36:25> http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
このリンクを確認してみたけど、ダメリンク?
だれか使っている人いる?
0003デフォルトの名無しさん
2008/02/20(水) 12:47:53一度だけ使った事があるよ
複数ファイルに分けないと説明できない事があったので
あと、スレ立て乙
0004デフォルトの名無しさん
2008/02/20(水) 12:49:31int hoge;
hoge = 1;
や
int hoge = 1;
なんかはどっかにint1個分の領域が確保されているわけですよね?
0005デフォルトの名無しさん
2008/02/20(水) 12:57:150006デフォルトの名無しさん
2008/02/20(水) 13:08:36ローカルスコープなら、まあほぼスタック
0007デフォルトの名無しさん
2008/02/20(水) 13:09:40なるほど・・・スコープを抜けたら破棄されるわけか
ああ、それでnewにはdeleteが必要なのかなるほどー
すごい納得ありがとうございいます
0008デフォルトの名無しさん
2008/02/20(水) 13:12:42cstdioのsystem関数を使い、内部でbccを呼び出して
Cのソースコードをコンパイルするプログラムをつくったのですが、
コマンドラインからだとコンパイルが通るCソースコードが、
このプログラムを使ってコンパイルするとエラーが発生して通りません。
プログラムの一部です
--------------------------------------
string Command = "";
//略
if(system(Command.c_str()) == -1){
cout << "Error" << endl;
}
--------------------------------------
ここで、コンパイルが通るはずの"test.c"のようなファイルを作り、
Command = "bcc32 test.c"として実行すると、
「Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)」
というエラーが発生します。
解決策をお願いします。
ちなみにこのプログラムはVisualC++2005Expressで作成しています。
0009デフォルトの名無しさん
2008/02/20(水) 13:18:52コマンドプロンプト上で
bcc32 test.c
は成功する?
もし、失敗するなら bcc32.cfg または ilink32.cfg の設定ができていない可能性あり
どうすれば設定すればいいかは検索すればすぐ分かるはず
0010デフォルトの名無しさん
2008/02/20(水) 13:20:29main関数が無いって言ってるように見える・・・
00119
2008/02/20(水) 13:20:510012デフォルトの名無しさん
2008/02/20(水) 13:54:43コマンドラインで bcc32 test.c は成功します。
あと、別に、
#include<cstdio>
void main(){
system("bcc32 test.c");
}
だけを書いたプログラムを実行したところ今度はtest.cのコンパイルが通りました。
0013デフォルトの名無しさん
2008/02/20(水) 13:58:11プログラムのカレントディレクトリとtest.cのパスの関係はどうなってますか。
0014デフォルトの名無しさん
2008/02/20(水) 14:22:20debug\bfc.exe(作ったプログラム)
debug\system_test.exe(>>12のプログラム)
debug\test.c
となってます
0015デフォルトの名無しさん
2008/02/20(水) 14:38:25system 関数を呼び出した時点では
test.c への書き込みが完了していないんじゃない?
コマンドの bcc32 の部分を type に置き換えて実行してみて
何も表示されないようなら system 関数の前にストリームをフラッシュするかクローズする
0016デフォルトの名無しさん
2008/02/20(水) 14:46:20ありがとうございました。解決しました。
0017デフォルトの名無しさん
2008/02/20(水) 19:08:43キーボードの「ろ」のところにある記号は「�U」で合ってますか?
半角じゃないので違うような気がするのですが
初歩的な質問ですみません よろしくお願いします
0018デフォルトの名無しさん
2008/02/20(水) 19:10:280019デフォルトの名無しさん
2008/02/20(水) 19:18:120021デフォルトの名無しさん
2008/02/20(水) 19:27:43shift+\ でどう?
0022デフォルトの名無しさん
2008/02/20(水) 19:28:030023デフォルトの名無しさん
2008/02/20(水) 19:28:56CFileDialogから取得したパスをfopenのrbモードで開く、という認識であっているのでしょうか
使用しているエディタはVS2005です。よろしくお願いします。
0025デフォルトの名無しさん
2008/02/20(水) 19:35:34もっと適切な場所で聞けって言ってるんだろ
0026デフォルトの名無しさん
2008/02/20(水) 19:35:55>>22の
”おまえに切れられる筋合いは無い”
という心の叫が聞こえる。
0027デフォルトの名無しさん
2008/02/20(水) 19:36:53聞ける友達いねーのかよwww
0028デフォルトの名無しさん
2008/02/20(水) 19:37:23CFileDialogってMFCか?
だったら同じMFCのCFileを使うのが筋なんじゃないかな
fopenでもいいけどさ
0030デフォルトの名無しさん
2008/02/20(水) 19:48:51すみません、MFCアプリケーションでの作成です。
プログラム初めてなものでただただ関数調べたもので…
基本的な事がなってないのでもう少し自分で調べてみます
アドバイスありがとうございました。
0031デフォルトの名無しさん
2008/02/20(水) 20:09:58C/C++とは関係ない質問等には答えるなよ。
馬鹿が付け上がります。
0032デフォルトの名無しさん
2008/02/20(水) 20:32:52キモス とっとと帰れ
0033デフォルトの名無しさん
2008/02/20(水) 21:03:30俺は今度から、キモイのが来たら嘘を教えることにするよ。
0034デフォルトの名無しさん
2008/02/20(水) 21:33:17まあ、おちつけ。
0035デフォルトの名無しさん
2008/02/20(水) 22:37:06大抵自分が落ち着いてない罠
0036デフォルトの名無しさん
2008/02/20(水) 22:40:12(表現おかしいかもしれないです)
int *ptr, *p1, *p2, *p3, val = 10;
ptr = p1;
*ptr = p2;
**ptr = p3;
***ptr = &val;
printf("%d", ****ptr);
こんな具合のことなんですがこれじゃだめみたいですorz
意味はないんですが、試しにやってみたいというだけです
0037デフォルトの名無しさん
2008/02/20(水) 22:41:53int *p1 = &x;
int **p2 = &p1;
int ***p3 = &p2;
int ****ptr = &p3;
printf("%d\n", ****ptr);
0038デフォルトの名無しさん
2008/02/20(水) 22:43:01int*型やint**型はまた別のものなんですね、再確認させられました
ありがとうございます
0039デフォルトの名無しさん
2008/02/20(水) 23:01:01Vector a( 0,0 );
Vector b = Vector( 0,0 );
今まで大差ないと思ってたんだけど、bの書き方って馬鹿にされるかな?
0040デフォルトの名無しさん
2008/02/20(水) 23:03:58たとえ最適化でコピーコンストラクタの呼び出しが省略されるとしても。
0041デフォルトの名無しさん
2008/02/20(水) 23:13:20不便すぎるな…
ありがとう
0042デフォルトの名無しさん
2008/02/20(水) 23:23:08他では大した差は無いけど。
0043デフォルトの名無しさん
2008/02/21(木) 00:31:330044デフォルトの名無しさん
2008/02/21(木) 00:34:25デストラクタなのかコンストラクタなのかそれが問題だwww
0045デフォルトの名無しさん
2008/02/21(木) 00:35:18大問題
0046デフォルトの名無しさん
2008/02/21(木) 00:35:43placement new/delete 使え
0047デフォルトの名無しさん
2008/02/21(木) 00:36:560048デフォルトの名無しさん
2008/02/21(木) 00:37:08デストラクタです><
0049デフォルトの名無しさん
2008/02/21(木) 00:39:040050デフォルトの名無しさん
2008/02/21(木) 00:43:370051デフォルトの名無しさん
2008/02/21(木) 00:44:450052デフォルトの名無しさん
2008/02/21(木) 00:46:50newをオーバーロードしてmallocで実装ということでしょうか?
0053デフォルトの名無しさん
2008/02/21(木) 00:49:02new/delete
new[]/delete[]
malloc/free
対応関係を間違えるな。
0054デフォルトの名無しさん
2008/02/21(木) 00:51:01T* p = static_cast<T*>(::operator new(sizeof (T))); // 領域のみ確保
new (p) T(); // コンストラクタを呼ぶ(placement new)
p->~T(); // デストラクタを呼ぶ
::operator delete(p, p); // placement delete(省略可)
::operator delete(p); // 領域を解放
0055デフォルトの名無しさん
2008/02/21(木) 00:51:39#include <cstdlib>
class c {};
void* p = std::malloc(sizeof (c));
c* obj = new(p) c;
//...
obj->~c();
//...
std::free(obj);
malloc/freeでなくても、operator new/delete関数とかでもいいだろうけどね。
0056デフォルトの名無しさん
2008/02/21(木) 00:52:20違う。配置構文newだ。
newは大抵mallocをラッピングしてて効率は悪い。
0057sage
2008/02/21(木) 03:23:25質問させて頂きたいのですが、静的リンクされたELFバイナリにおいて、
リンクされているライブラリのバージョンを
そのバイナリから知る方法はあるのでしょうか?
0058デフォルトの名無しさん
2008/02/21(木) 03:24:440059デフォルトの名無しさん
2008/02/21(木) 07:51:13教えて欲しいんだけどスレ違い?
0060デフォルトの名無しさん
2008/02/21(木) 08:01:08最近の小学校は閏年も教えんのか?
0061デフォルトの名無しさん
2008/02/21(木) 08:05:520062デフォルトの名無しさん
2008/02/21(木) 09:44:160063デフォルトの名無しさん
2008/02/21(木) 10:04:470064デフォルトの名無しさん
2008/02/21(木) 10:07:28unix系のOS使えるなら、 cal 9 1752 でカレンダー出るな。
0065デフォルトの名無しさん
2008/02/21(木) 13:05:210066デフォルトの名無しさん
2008/02/21(木) 13:11:47public:
int i;
int j;
double k;
};
int main()
{
ttt t = {1,2,3.001};
structやclassがこういう風に初期化できるのを最近知ったのですが、これって普通に
使う書き方でしょうか?結構C++長いこと使ってきたけど、知らなかったよ。
0067デフォルトの名無しさん
2008/02/21(木) 13:22:04PODな構造体なら hoge h = {0}; とか、
Win32APIで構造体のサイズを入れる必要がある物は WNDCLASSEX wc = {sizeof(WNDCLASSEX)}; とかやるけど・・・
俺も疑問なんだけど、 hoge h = {0}; って感じで初期化って普通にやるの?
俺より何年もCやってる先輩が言うには、「そんなんで0フィルされるのか?memset使えよ」って言われたんだが。
0068デフォルトの名無しさん
2008/02/21(木) 13:22:380069デフォルトの名無しさん
2008/02/21(木) 13:44:25「0フィル」が「全ビットを 0x00 で埋める」って意味なら memset() で正解。
ただし「全メンバを 0 で初期化する」なら memset() は間違いで {0} で初期化するのが正解。
この2つはメンバにポインタや浮動小数点数が混ざってると意味が違うので、動作が
異なる可能性がある。 C++ でメンバに POD 以外が混ざってる場合には、 memset() での
「0フィル」は未定義動作につながる。
0070デフォルトの名無しさん
2008/02/21(木) 13:47:26>>39
の使い方が一般の気がする。
コピコン便利だし
0071デフォルトの名無しさん
2008/02/21(木) 13:49:23ポインタや浮動小数点数などでは、
Cのソース上では0と表現される値でも、内部では0以外のビットパターンを持つことがある。
そんな場合にも対応できるので、変数初期化のほうが移植性が高いとされる。
0072デフォルトの名無しさん
2008/02/21(木) 13:52:19using namespace std;
template <typename T>
void printchar(T c){
cout << c << endl;
}
int main(void){
cout << "print int" << endl;
printchar(10);
cout << "print double" << endl;
printchar(32e-2);
cout << "print char" << endl;
printchar('A');
cout << "print char*" << endl;
printchar("test char");
cout << "print void" << endl;
// printchar();
return 0;
}
コメントアウトした行でコンパイルエラーなのですが、
引数がvoidだと何もしないっていう処理はどう書けばいいのでしょうか。
0073デフォルトの名無しさん
2008/02/21(木) 13:53:37}
0074デフォルトの名無しさん
2008/02/21(木) 13:54:36そういえば、Win32APIとかの解説ページを見ると、memsetで構造体を初期化してる人もいるよね(メンバにポインタがあるにもかかわらず
Windowsでしか動かない移植性がないプログラムだから問題ないんか。
0075デフォルトの名無しさん
2008/02/21(木) 13:55:35やっぱりそうするしかないですか。
ありがとうございます。
0076デフォルトの名無しさん
2008/02/21(木) 14:50:44#include <>
なんかの"#"ってどんな意味があるんですが?
cgiみたいに、特別な物でそうゆう仕様という認識で良いのでしょうか?
初めて触った時はコメントアウトじゃんと思ったりもしましたけど。
0077デフォルトの名無しさん
2008/02/21(木) 14:53:01template<typename T>void printchar(T c = 0) {if (c) cout << c << endl;}
ではどう? 使うときにはprintchar<char>()のように型を指定する必要があるけど。
0078デフォルトの名無しさん
2008/02/21(木) 14:54:35プリプロセッサに対する指令
0079デフォルトの名無しさん
2008/02/21(木) 15:01:13>cgiみたいに、特別な物でそうゆう仕様という
ややあたり、起源はいっしょ
C++のコンパイルの前に通すテキスト加工スクリプトの様なもの。
もはや意識している人いないれどね。
起源はそうでも、すでにC++の一部機能です。
0080デフォルトの名無しさん
2008/02/21(木) 15:07:15がマンドクセにみえた俺は病気
0081デフォルトの名無しさん
2008/02/21(木) 15:11:120082デフォルトの名無しさん
2008/02/21(木) 15:20:40すでに出てるし、そして当人は二つ書くことになにかご不満のご様子
0083デフォルトの名無しさん
2008/02/21(木) 15:29:36代表的なものにWinAPIとMFCがあると調べてわかったのですが、どちらも難解そうな上
ニュアンス的なものですが、主流ではないような印象を受けました
C/C++で作ったDLLをC#で使う?ような方法にも辿りついたのですが
それだと使う側に.NETが必要になるようなので、それなら最初からC#を使った方が…と思います
どういった方法がベターなのでしょうか?
0084デフォルトの名無しさん
2008/02/21(木) 15:38:12↓のページから好みに合ったものを選べ
http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E3%83%BB%E3%83%84%E3%83%BC%E3%83%AB%E3%82%AD%E3%83%83%E3%83%88
0085デフォルトの名無しさん
2008/02/21(木) 15:44:15C++はGUI作るツールに満足なものがないから、GUIに向いていない環境だと俺は思っている。
もっとましな状況になってほしい。
いろんなものが乱立していて決定打がないんだけど、
Windowsでは、Windows APIが最下層で、ほかがそのラッパーになっているので、
自然、Windows APIが共通語彙になっているという面はある。
だから、今何を使うにしても、いつかは素のWindows APIプログラミングに触れていてほしいなと思う。
0086デフォルトの名無しさん
2008/02/21(木) 15:46:41例)
12345→54321
12000→21
int reverseDigit(int input)
{
int a = input;
int tmp[12];
int i = 0;
while (a > 0) {
tmp[i] = a % 10;
a = a / 10;
i++;
}
int res = 0;
int n = 1;
for (int j = i - 1; j >= 0; j--) {
res = res + tmp[j] * n;
n = n * 10;
}
return res;
}
0087デフォルトの名無しさん
2008/02/21(木) 16:27:35なるほど、見た感じWinAPIに一番無難な印象を受けてしまいました
Windowsがこの先消えうせることはなさそうですしとりあえずWinAPI触ってみます、ありがとうございました
0088デフォルトの名無しさん
2008/02/21(木) 17:44:38試して問題ないならいいんじゃない?
負数で破綻するけど。
それと、一旦各桁に分割した結果を配列で保存するなら、
sprintf()で文字列にしてから逆順にして、atoi()で戻してもいいかも知れない。
0089デフォルトの名無しさん
2008/02/21(木) 17:48:39そのままinputを使えばいい
知っててわざとやってるなら別にいいが
0090デフォルトの名無しさん
2008/02/21(木) 17:57:34サーバからクライアントへsendを使ってメッセージを送信した際、
メッセージの送信完了を伝えるには、ソケットをclose(あるいはshutdown)
する以外に方法はないですか?
つまり、ソケットを閉じずに、コネクションを維持したまま、
送信完了を伝えたいのですが、できませんか?
0091デフォルトの名無しさん
2008/02/21(木) 17:57:59意味ある、というか引数いじらないのは鉄則だよ。
一時変数ケチってinputを加工するのは無駄なバグの元。
0092デフォルトの名無しさん
2008/02/21(木) 18:18:34HTTPであれば、レスポンスにContent-Lengthを入れれば、クライアント
がそのサイズの受信でデータ終了だと思ってくれる。
0094デフォルトの名無しさん
2008/02/21(木) 20:25:25C#使った方がいいと思うってもう遅いけど
0095デフォルトの名無しさん
2008/02/21(木) 21:40:29デルファイ言語の環境のまま、言語だけC++
0096デフォルトの名無しさん
2008/02/21(木) 21:41:130097デフォルトの名無しさん
2008/02/21(木) 21:41:440098デフォルトの名無しさん
2008/02/21(木) 21:45:500099デフォルトの名無しさん
2008/02/21(木) 21:48:34環境を書けよ。でないと答えようが無い
0100デフォルトの名無しさん
2008/02/21(木) 21:50:15パソコンから取り外せば全容量使えるよ。
0101デフォルトの名無しさん
2008/02/21(木) 21:50:590102デフォルトの名無しさん
2008/02/21(木) 21:53:400103デフォルトの名無しさん
2008/02/21(木) 21:54:02毒餃子を食わす国の人ですか?
0104デフォルトの名無しさん
2008/02/21(木) 21:54:36GlobalMemoryStatus で調べろ
0105デフォルトの名無しさん
2008/02/21(木) 21:57:570106デフォルトの名無しさん
2008/02/21(木) 22:27:360107デフォルトの名無しさん
2008/02/21(木) 22:31:160108デフォルトの名無しさん
2008/02/21(木) 22:32:24JpegのIJGライブラリみたいなものがあると嬉しいのですが
0109デフォルトの名無しさん
2008/02/21(木) 22:32:32長い思考の旅の後には、失敗しないからチェックは不要という結論になるよ。
0110デフォルトの名無しさん
2008/02/21(木) 22:43:28bad_alloc 例外をつかまえる。
0111デフォルトの名無しさん
2008/02/21(木) 22:45:29by Sutter
0112デフォルトの名無しさん
2008/02/21(木) 22:48:480113デフォルトの名無しさん
2008/02/21(木) 22:52:19たくさんのレスが付くと思う。
そして、>>109にたどり着くと思う。
0114デフォルトの名無しさん
2008/02/21(木) 22:56:42大抵はそのまま異常終了するしかない事が多い。
ダウンするとマズいシステムの場合は
そうも言ってられないが。
0115デフォルトの名無しさん
2008/02/21(木) 23:19:36timeGetTime関数を呼ぶだけの関数を作成したのですが、
ビルドで以下のエラーになりました。
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を使用しています。
他に何か設定が必要なのでしょうか?
0116デフォルトの名無しさん
2008/02/21(木) 23:20:200117デフォルトの名無しさん
2008/02/21(木) 23:29:07すいません。記述漏れです。
以下の設定はすでにしていました。
「ツール」-「オプション」-「プロジェクトおよび〜」-
「VC++ディレクトリ」-「ライブラリリンク」にて、
C:\Program Files\Microsoft Platform SDK\Lib
ほかのライブラリのリンクが必要なのですか?
必要な場合、どこのライブラリをリンクすればいいでしょうか?
0118デフォルトの名無しさん
2008/02/21(木) 23:30:16リンクするライブラリを選択するオプションではない。
何をリンクすればいいかはググれ。
0119デフォルトの名無しさん
2008/02/21(木) 23:38:58今は、ライブラリのリンクが出来てなかったと言うことなんで、
リンクの方法、リンクするライブラリについては、また調べてみます。
回答ありがとうございました。
0120デフォルトの名無しさん
2008/02/21(木) 23:46:57if(i==(1||2||3||4||5))
switch(i){
case (1||2||3||4||5):
break;
}
0121デフォルトの名無しさん
2008/02/21(木) 23:48:330122デフォルトの名無しさん
2008/02/21(木) 23:49:51C++ で operator をオーバーライドすれば可能かもしれませんね
0123デフォルトの名無しさん
2008/02/21(木) 23:54:50caseの中身は定数でよろしく
0124デフォルトの名無しさん
2008/02/22(金) 00:01:36switch(i){
case 1: case 2: case 3: case 4: case 5:
break;
}
0125デフォルトの名無しさん
2008/02/22(金) 00:02:21ifの方も駄目?
0126デフォルトの名無しさん
2008/02/22(金) 00:03:55ああ、caseでbreak書かなかったらそのまま下までいくからそういう風に書いたらいいのか
0127デフォルトの名無しさん
2008/02/22(金) 00:06:120128デフォルトの名無しさん
2008/02/22(金) 00:07:40文法的に間違いではないが、お前の期待する動作はしないと思う
(1||2||3||4||5)は常に真となり、それとiの値が等しいかどうか
だよ?これ
0129デフォルトの名無しさん
2008/02/22(金) 00:08:18ifの方も意図しているであろう動作はしない。
ただしコンパイルは通る。警告くらい出してくれるかも知れんが・・・
0130デフォルトの名無しさん
2008/02/22(金) 00:11:14コンパイル通ってたから上手く動いてると思ってそのままつかってたよ…
0131デフォルトの名無しさん
2008/02/22(金) 00:19:40C#も124みたいにcaseラベルを並べるのはありだと聞いた。
0132デフォルトの名無しさん
2008/02/22(金) 00:22:160133デフォルトの名無しさん
2008/02/22(金) 00:27:11int a=10; のようにです
0134デフォルトの名無しさん
2008/02/22(金) 00:28:19同時に出来る訳が無い。
初期化なら別だが。
0135デフォルトの名無しさん
2008/02/22(金) 00:30:450136デフォルトの名無しさん
2008/02/22(金) 00:30:520137デフォルトの名無しさん
2008/02/22(金) 00:32:34int main() {
class Test{
int x;
public:
Test (int y) {x=y;}
print(){ cout<<x<<endl; } };
Test a=10;
a.print();
return 0;
}
0138デフォルトの名無しさん
2008/02/22(金) 00:35:31a.print();
a=20;
a.print();
もできるんですね C++はすごいですね
0139デフォルトの名無しさん
2008/02/22(金) 00:37:27基本的に引数1つのコンストラクタには explicit つけとけ。
0140デフォルトの名無しさん
2008/02/22(金) 00:42:12コピーコンストラクタとoperator =をコンパイラ任せにしているのが嫌だね。
0141デフォルトの名無しさん
2008/02/22(金) 00:43:15コンパイラ任せでいいよ。
0142デフォルトの名無しさん
2008/02/22(金) 00:48:46>>139
なんでですか?
(本当に理由を知りたいです。)
0143デフォルトの名無しさん
2008/02/22(金) 00:59:34#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)); なら可だが、これは問題ないと感じてくれると思う。
0144デフォルトの名無しさん
2008/02/22(金) 00:59:53どんなバグがでるのですか?
呼び出し側なにか影響でうるのですか?
0145デフォルトの名無しさん
2008/02/22(金) 01:01:23input が変更されていない事を前提とした処理を書いてしまうかもしれない。
あるいは、そういう処理があるにも関わらず、
それより前の地点で input を変更してしまうかもしれない。
そうなっていないか注意して探すよりは、
引数をいじらない方が良い。
0146デフォルトの名無しさん
2008/02/22(金) 01:08:460147デフォルトの名無しさん
2008/02/22(金) 01:09:55あんま意味ないと思ってやめた。
0148デフォルトの名無しさん
2008/02/22(金) 01:12:29なるほど
別にいじること自体がやばいわけじゃなくて
いじると間違い起こす原因となる可能性があるわけですね
ありがとうございました
0149デフォルトの名無しさん
2008/02/22(金) 01:14:13コピペじゃ済まなくなる。
0150デフォルトの名無しさん
2008/02/22(金) 01:14:45fall throughは禁止じゃなかったっけ
何かキーワードがあったと思う
情報が古いかもしれんが
0151デフォルトの名無しさん
2008/02/22(金) 01:19:06caseが連続する場合のみOK。その他は禁止。スレ違い。
0152デフォルトの名無しさん
2008/02/22(金) 01:19:25ありがとうございます。
explicitは、暗黙の変換を抑制する機能なのですね。
しかしなんか上の例のコードは、すごくC++書き慣れた人な感じがしました。
0153デフォルトの名無しさん
2008/02/22(金) 01:20:21>>124のように空のcaseラベルを並べたときはフォールスルーできる。
http://msdn2.microsoft.com/ja-jp/library/06tc147t.aspx
スレ違いすまん。
0154133
2008/02/22(金) 02:00:16intのようにコンストラクタではできませんでした
test y = f( x );
のようにです fはクラスを返します intではないです
0155デフォルトの名無しさん
2008/02/22(金) 02:11:42testというのがクラスなら、testにconst test&型の引数を1つ取るコピーコンストラクタを作るんだ。
0156デフォルトの名無しさん
2008/02/22(金) 02:14:250157デフォルトの名無しさん
2008/02/22(金) 07:02:49何度も言うが、それは代入じゃない。
初期化だ。
初期化の場合、= を使っていても
test y = f(x); は test y(f(x)); と同義。
0158デフォルトの名無しさん
2008/02/22(金) 07:24:55はじめににインストールする言語?をどれにするかがわかりません。
どういう意味かというと
ボーランド、とかマイクロソフトのvisual studioとかどれにすればいいのかです。
有料とか無料とかいろいろありますね。
できたら将来有料ソフトを販売可能なものがいいです。
今考えているのはマイクロソフトのVC++を考えているのですが、
C++とVC++は違うとか
どっかで聞いたりもしたので
初心者にはちんぷんかんぷんでわかりません。
よろしくお願いします
0159デフォルトの名無しさん
2008/02/22(金) 07:30:50VC++ は C++ を使って開発を行うためのツールの名前。
0160デフォルトの名無しさん
2008/02/22(金) 08:05:40ありがとうございます。
0161デフォルトの名無しさん
2008/02/22(金) 11:08:37VC++のコードはほかのものでは動かせないものが多い
0162デフォルトの名無しさん
2008/02/22(金) 11:42:07このソフトを使えばJavaでもネイティブアプリケーションが作れると書いてあるのですが、そんなうまい話があるんですか?
もし本当ならJavaのパフォーマンス面での不利がだいぶ改善されると思うのですが
0163デフォルトの名無しさん
2008/02/22(金) 11:45:450164デフォルトの名無しさん
2008/02/22(金) 11:57:29VCにしとけ。
0165デフォルトの名無しさん
2008/02/22(金) 11:59:00利点としてはランタイムとかの導入がいらないだけで
0166デフォルトの名無しさん
2008/02/22(金) 12:21:11gcjって使ってる人います?
ttp://pc11.2ch.net/test/read.cgi/tech/1046627795/l50
0167デフォルトの名無しさん
2008/02/22(金) 12:31:13IEBrowser->Document.charset="shift_jis";
error C2039: 'charset' : '_com_ptr_t<class _com_IIID<struct IDispatch,&struct __s_GUID _GUID_****> >' のメンバではありません。
0168167
2008/02/22(金) 12:35:30この様に定義してあります
SHDocVw::IWebBrowser2Ptr IEBrowser;
IEBrowser.CreateInstance( __uuidof( SHDocVw::InternetExplorer ) );
0169デフォルトの名無しさん
2008/02/22(金) 12:51:05こうでは?
IEBrowser->Document->charset= L"shift_jis";
0170167
2008/02/22(金) 12:55:40error C2039: 'charset' : 'IDispatch' のメンバではありません。
になりました・・・
0171167
2008/02/22(金) 13:05:44そこだけVBAスクリプトを呼び出す事にします
0172デフォルトの名無しさん
2008/02/22(金) 13:08:27じゃあこれはどう?
SHDocVw::IHTMLDocument2Ptr document = IEBrowser->Document;
docment->charset = L"shift_jis";
0173167
2008/02/22(金) 13:13:130174デフォルトの名無しさん
2008/02/22(金) 13:23:380175デフォルトの名無しさん
2008/02/22(金) 13:33:26#import <mshtml.tlb>した上で、MSHTML::IHTMLDocument2Ptrだ。
0176デフォルトの名無しさん
2008/02/22(金) 13:34:40ナントカPtr(の実態_com_ptr_t<>)のコンストラクタや代入演算子の中でQueryIntefaceが行われている。
0177デフォルトの名無しさん
2008/02/22(金) 14:08:38numeric_limits<int>::max()とか、そういう書き方はないですか?
0178デフォルトの名無しさん
2008/02/22(金) 14:13:43# define M_PI 3.1415926535
#endif
0179デフォルトの名無しさん
2008/02/22(金) 14:30:07計算して出したいなら4*atan(1.0);
0180デフォルトの名無しさん
2008/02/22(金) 14:32:270181デフォルトの名無しさん
2008/02/22(金) 15:02:49ありがとうございます。
#include <cmath>
としてたのですが、M_PIでコンパイル通りました。
0182デフォルトの名無しさん
2008/02/22(金) 15:58:04実数→整数変換ですが、
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() 使っても誤差が出てしまいます。
0183デフォルトの名無しさん
2008/02/22(金) 16:05:51それ四捨五入してるだけだぞ
そんなんでいいなら ival = floor(dval * 100 + 0.5) とでもやればいい
元々 -19.99 という値自体が誤差を持ってるから、これを無くすことは出来ない
printf("%.20f\n", -19.99); とかやってみればわかる
本当に誤差が嫌なら、浮動小数点を使わない、という方法しかない
0184182
2008/02/22(金) 16:12:26早速のRESありがとう御座います。
>そんなんでいいなら ival = floor(dval * 100 + 0.5) とでもやればいい
了解です。これで行きたいと思います。
どうもありがとう御座いました。
0185デフォルトの名無しさん
2008/02/22(金) 16:53:31f(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;
}
0186デフォルトの名無しさん
2008/02/22(金) 16:55:190187デフォルトの名無しさん
2008/02/22(金) 16:59:46ごめんfで何がしたいのか分からない。
まぁ俺の第六感で回答すると、ポインタのポインタ使えばいいんじゃね
0188デフォルトの名無しさん
2008/02/22(金) 17:05:10をコード内で書き換えてたとえば100個まで使えるようにしたいんです
はじめのaは破棄できなくてもいいので、a[50]とかにアクセスできるようになりませんか
0189デフォルトの名無しさん
2008/02/22(金) 17:07:460190デフォルトの名無しさん
2008/02/22(金) 17:08:43設計が間違ってるよ
>>185 みたいにすると激しく管理が難しい事になる
0191デフォルトの名無しさん
2008/02/22(金) 17:12:10どうしたらいいですか
0192デフォルトの名無しさん
2008/02/22(金) 17:14:170193デフォルトの名無しさん
2008/02/22(金) 17:17:53初めから1000個くらい確保しとけばいいじゃん
0194デフォルトの名無しさん
2008/02/22(金) 17:21:28main(){
char ch[]="test";
char *ce=new char[20];
strcpy(ce,"ssss");
ch=ce; //ここでエラー
cout<<ch<<endl;
}
0195デフォルトの名無しさん
2008/02/22(金) 17:22:100196デフォルトの名無しさん
2008/02/22(金) 17:29:05呼び出し側で呼び出す関数を変える
>>194
なにがしたいの?
0197デフォルトの名無しさん
2008/02/22(金) 18:10:41こうすれば?
main(){
char chx[]="test";
char *ch = chx;
char *ce=new char[20];
strcpy(ce,"ssss");
ch=ce; //エラーなし
cout<<ch<<endl;
}
0198デフォルトの名無しさん
2008/02/22(金) 18:36:59恐らく、引数でもらった文字列を元に新な文字列を返そうと考えてるんだろうけど、
そうしたいのなら、
char* func(const char* str)
{
char* s = new char[ほにゃらら];
ほげほげ
return s;
}
とした方が良い。
そもそも
char ch[] = "test";
の ch は配列の先頭のアドレスを返す「定数」なんだから、newで確保した領域を割り当てられるわけないよ。
0199デフォルトの名無しさん
2008/02/22(金) 19:05:33同じような質問なんですが、*chが確保されていてもいなくても、deleteするにはどうすればいいですか?
確保していないと実行時にエラーになります
0200デフォルトの名無しさん
2008/02/22(金) 19:08:14if( ch )delete ch;
0201デフォルトの名無しさん
2008/02/22(金) 19:15:06f(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;
}
0202デフォルトの名無しさん
2008/02/22(金) 19:16:310203デフォルトの名無しさん
2008/02/22(金) 19:16:400204デフォルトの名無しさん
2008/02/22(金) 19:17:290205デフォルトの名無しさん
2008/02/22(金) 19:18:15fの中でchに代入してもmainの方はaもbもcも変わらないよ?
f(int x){
x = 2;
}
main() {
int a = 1;
f(a);
cout << a << endl; // 2ではなく1と表示される
}
↑これ解ってる?
0207デフォルトの名無しさん
2008/02/22(金) 19:20:200208デフォルトの名無しさん
2008/02/22(金) 19:20:230209デフォルトの名無しさん
2008/02/22(金) 19:20:49ポインタは値渡し。
0211デフォルトの名無しさん
2008/02/22(金) 19:23:110212デフォルトの名無しさん
2008/02/22(金) 19:25:03何が起こってるのか考えた事無いだろう。
0213デフォルトの名無しさん
2008/02/22(金) 19:25:43初期化されてるポインタと、
初期化してないけど偶然たまたま同じ値が入ってるポインタを、
見分ける方法が物理的にあると思うか?
0214デフォルトの名無しさん
2008/02/22(金) 19:26:39f(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;
}
0215デフォルトの名無しさん
2008/02/22(金) 19:31:57いい方法を教えてあげよう
関数 f の前にこれを書くんだ
/* この関数に初期化してないポインタを渡してはいけません */
0216デフォルトの名無しさん
2008/02/22(金) 19:43:250217デフォルトの名無しさん
2008/02/22(金) 19:45:15だーかーらーnewで確保したメモリを指してるポインタと、未初期化のポインタを見分け
る方法なんて存在しないんだってば。
ポインタ使うときは初期化しろって何で言われてるのか考えたことあるか?
0218デフォルトの名無しさん
2008/02/22(金) 19:49:31void 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;
}
んで、これの挙動は分かるか?
0219デフォルトの名無しさん
2008/02/22(金) 20:17:15memcpy(str, ch,10000);
のようにできますか?
0220デフォルトの名無しさん
2008/02/22(金) 20:37:35頼みますから。
0221デフォルトの名無しさん
2008/02/22(金) 20:45:34strがchar*の予感
0222デフォルトの名無しさん
2008/02/22(金) 21:09:010223デフォルトの名無しさん
2008/02/22(金) 21:15:150224デフォルトの名無しさん
2008/02/22(金) 21:43:42それともネットで調べるべきですか?
0225デフォルトの名無しさん
2008/02/22(金) 21:45:590226デフォルトの名無しさん
2008/02/22(金) 22:16:13cが無い場合は、-1を表示
という問題で詰まってます
文字列の中のcを認識させるにはどうすればよいのでしょうか
0227デフォルトの名無しさん
2008/02/22(金) 22:22:420228デフォルトの名無しさん
2008/02/22(金) 22:24:16グローバルな共用体の変数に、関数からメンバーに代入したらセグメントエラーを吐いたのですが、これは許されないのでしょうか?
0229デフォルトの名無しさん
2008/02/22(金) 22:29:200230デフォルトの名無しさん
2008/02/22(金) 22:46:54グローバルな共用体の変数に、関数からメンバーに代入してもセグメントエラーを吐かないのですが、
嫁は許してくれるでしょうか?
0231デフォルトの名無しさん
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>に
別々の初期化パラメータを与えたいんですが・・・。
0232デフォルトの名無しさん
2008/02/22(金) 22:49:58何ができるかを伝えてあげるべき。
ようこそプログラムの世界へ。
0233デフォルトの名無しさん
2008/02/22(金) 22:50:250234デフォルトの名無しさん
2008/02/22(金) 22:51:22それは関数そのものではないでしょうか
わざわざ教えたいただいたのですが、伝達不足でした、すみません
int strch_idx(const char* s, char c);
という関数の雛形が与えられて、この中身を作るのに、cを認識する必要があると判断したのですが、間違っているでしょうか
0235デフォルトの名無しさん
2008/02/22(金) 22:54:41今のC++では無理だね。だからSTLコンテナではreserveしてpush_backしたり、
組込の配列からコピー初期化したりする。
0236デフォルトの名無しさん
2008/02/22(金) 22:56:20cを認識の意味がわかりません
s内からcを検索したいってこと?
0237デフォルトの名無しさん
2008/02/22(金) 23:17:22この場合大人しくループまわして作ることになるんでしょうね。
ありがとうございました。
0238デフォルトの名無しさん
2008/02/22(金) 23:34:21例えば、sという文字列にcincoと入力すると、1を
sという文字列にiicicoと入力すると3を
sという文字列にnorioと入力すると-1をreturnで返却する
こういう関数を作ろうと思うと、sという文字列の中身について、
s[0]に格納されているのはcかどうか、s[1]に格納されてるのはcかどうか、s[2]に格納されているのは…
と、ひたすら繰り返して行く必要があると考えました
そのためには、s[n]について、cなのかどうか判定する必要があるのではないかと
この判定というのが、認識と同じ意味のつもりで使いました
0239デフォルトの名無しさん
2008/02/22(金) 23:40:52検索すればいくらでも出るだろ
0240デフォルトの名無しさん
2008/02/22(金) 23:45:33if (s[0] == 'c') return 1;
if (s[1] == 'c') return 2;
if (s[2] == 'c') return 3;
...and so on.
0241デフォルトの名無しさん
2008/02/22(金) 23:50:48学校の宿題は自分でやれよ。屑
0242デフォルトの名無しさん
2008/02/23(土) 00:02:06それ以外に方法は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;
返ってくるのは配列の添え字ですのであしからず
0243デフォルトの名無しさん
2008/02/23(土) 00:06:01どうも、理解できました
>>242
ご丁寧にどうもありがとうございました
0244デフォルトの名無しさん
2008/02/23(土) 03:34:24C++ 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とかを使えば良いみたいなのですが、どのようにやってよいか分からずに困っています。
どうかよろしくお願いします。
0245デフォルトの名無しさん
2008/02/23(土) 03:35:36課題を丸投げしたいなら宿題スレにいけ
0246デフォルトの名無しさん
2008/02/23(土) 03:37:49いや一応答えると
sprintじゃなくてsprintfだな
sprintfで連結もできます
0248デフォルトの名無しさん
2008/02/23(土) 03:54:120249244
2008/02/23(土) 08:58:16なんとか解決しました。時間かかった>< やってみれば、なんと簡単なコードって感じですけど。
ヘルプのみかたってイマイチわからないんですけど、ヘルプの見方の解説サイトとかってありませんでしょうか?
0250デフォルトの名無しさん
2008/02/23(土) 09:49:02manコマンドのことなら、man manでOK。
0251デフォルトの名無しさん
2008/02/23(土) 10:05:35VC++6.0でデバッグしてると、関数に入るだけでESPが100バイトくらい進みます
C++だとモジュール毎にスタックをこんなに食うものなのでしょうか?
デバッグ情報か何かで食ってるのですか?
0252デフォルトの名無しさん
2008/02/23(土) 10:06:370253デフォルトの名無しさん
2008/02/23(土) 10:06:52ローカル変数が100バイトほどあるんじゃなくて?
0254251
2008/02/23(土) 11:07:16家のPCでためしたけど、
関数にステップインするときはESPは4バイトしか進まないが、
そこから1step進めて、{から関数内の1行目に入るときに、
80バイトも食う
char a[100];と宣言を入れると、これが180バイトになるから、やり方は間違ってないはず
この80バイトが何なのかわからん
0255デフォルトの名無しさん
2008/02/23(土) 11:21:130256デフォルトの名無しさん
2008/02/23(土) 11:22:06一時オブジェクトの置き場になってるとか?
関数の戻り値のオブジェクトを別の関数に直接渡してる場合とか・・・
アセンブラコード出させて見ても使われてなさげ?
0257要は、ソースも出さずにあれこれ言われてもしらねーよっと
2008/02/23(土) 11:24:15さもなければalloca()相当のコードが入っているとか。
あーそうそう、この場合のローカル変数は、Cのコード上現れるものに限らず
コンパイラが必要とした一時変数も含めてってことね。
例えば、構造体を値渡ししていたりreturnで戻していると作られるかもね。
0258251
2008/02/23(土) 11:32:53{
char a[100];
printf ("test");
}
int main(int argc, char* argv[])
{
test();
return 0;
}
コードはこれだけなんだけど。C++じゃねーな。
混合モードで見ると、これが原因らしいが、何でこんなことしてるのかな。
アセンブラわからん。
sub esp,0A4h
0259デフォルトの名無しさん
2008/02/23(土) 12:57:17VC++ なら sprintf とか入力して F1 推せば見れるだろ。
0260デフォルトの名無しさん
2008/02/23(土) 12:58:29デバッグ用じゃなくてもそうなら、
例外用のコードなのかもしれないな。
0261デフォルトの名無しさん
2008/02/23(土) 13:01:09手元の2005EEで試したが、リリースビルドの規定値では該当のコードは生成されない。
デバッグビルドだと生成されるが、「基本ランタイムチェック」を無効にしたら配列分だけになった。
つまり、>257の1行目だね。
0262デフォルトの名無しさん
2008/02/23(土) 13:23:220263デフォルトの名無しさん
2008/02/23(土) 13:24:01C言語でポインタを参照渡しするにはどうすればいいですか?
0264デフォルトの名無しさん
2008/02/23(土) 13:25:31ポインタのポインタを使う
int **p;みたいなの
0265デフォルトの名無しさん
2008/02/23(土) 13:25:41ポインタを渡すことで参照渡し「っぽいこと」はできるので、
ポインタのポインタを渡せばポインタの参照渡し「っぽいこと」はできます。
0266デフォルトの名無しさん
2008/02/23(土) 13:26:020267デフォルトの名無しさん
2008/02/23(土) 13:32:220268デフォルトの名無しさん
2008/02/23(土) 13:32:280269デフォルトの名無しさん
2008/02/23(土) 13:37:010270デフォルトの名無しさん
2008/02/23(土) 13:38:300271243
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;
}
0272デフォルトの名無しさん
2008/02/23(土) 13:50:020273デフォルトの名無しさん
2008/02/23(土) 13:51:13>if(s[i] == 'c') goto end;
'c' じゃなくて c では?
あと、else if (s[i] == 0) の判定をする前に while の条件で抜けてしまうかと
0274デフォルトの名無しさん
2008/02/23(土) 13:55:02そういう不正確な事やってると
>>207 みたいな奴が出てくるんだよ。
0275デフォルトの名無しさん
2008/02/23(土) 14:11:18俺はCでの話を言ってるんだぞ?
アドレス渡ししかないんだからないんだから、不正確もなにもねぇだろうが
0276デフォルトの名無しさん
2008/02/23(土) 14:12:170277デフォルトの名無しさん
2008/02/23(土) 14:13:070278デフォルトの名無しさん
2008/02/23(土) 14:15:15ポインタもコピー
0279デフォルトの名無しさん
2008/02/23(土) 14:15:51C には参照渡しなんてないんだよ。
0280デフォルトの名無しさん
2008/02/23(土) 14:18:09どっちかだけ知らずに語ると馬鹿なことになるけど、どっちもしっかり理解してるなら別に問題ないでしょう
0281デフォルトの名無しさん
2008/02/23(土) 14:20:520282デフォルトの名無しさん
2008/02/23(土) 14:24:24static_castの方が用途が限定される
0283デフォルトの名無しさん
2008/02/23(土) 14:24:35個人がそう理解するのはかまわんけど、初心者への説明としては不親切じゃね?
0284デフォルトの名無しさん
2008/02/23(土) 14:25:07Cとの互換性を大事にしたいなら後者、意味をはっきりさせたいのなら前者を使うといいでしょう。
0285デフォルトの名無しさん
2008/02/23(土) 14:26:18実際やってみると
cuで2が、gguで3が、ijcoで4が返ってきます
これは、s[i] == cと、s[i] == 0の判定が成されていないという事ですよね?
しかし、while関数自体は終わってるので、s[i]は判定されている
どういうことなんでしょうか?
また、ご指摘を受けて、whileをdo-whileに変更しました、ありがとうございます
0286デフォルトの名無しさん
2008/02/23(土) 14:27:110287デフォルトの名無しさん
2008/02/23(土) 14:30:00てか絶対使わないようにしてるんだが、違うのか
0288デフォルトの名無しさん
2008/02/23(土) 14:31:58単なる構文糖衣じゃない。
参照の参照というのは存在しないが、
ポインタのポインタというのは存在する。
これは大きな違いで、適当な教え方してると >>207 みたいなやつが出てくる。
0289デフォルトの名無しさん
2008/02/23(土) 14:33:55むしろ使った方が綺麗になる状況では使う。
でも、上のは break; 使えば解決できることで、
goto を使って解決すべきじゃない。
0290デフォルトの名無しさん
2008/02/23(土) 14:37:52>>284
当面はあまり気にしなくてよさそうですね
どうもありがとうございました
0291デフォルトの名無しさん
2008/02/23(土) 14:39:03いいや、気にしろ。
0292デフォルトの名無しさん
2008/02/23(土) 14:42:06せいぜいクラスのテンポラリオブジェクトを作るのに関数風のキャストを使うくらい。
0293デフォルトの名無しさん
2008/02/23(土) 14:47:55それはキャストよりもコンストラクタ呼び出しのほうがしっくりくる
0294デフォルトの名無しさん
2008/02/23(土) 14:49:300295デフォルトの名無しさん
2008/02/23(土) 14:52:190296デフォルトの名無しさん
2008/02/23(土) 14:54:36すいません
気にしろとだけ言われましてもなにに気を使えばいいのかわかりません
まずい点でもでてくるのか
だとかを教えていただけませんか
0297デフォルトの名無しさん
2008/02/23(土) 14:58:130298デフォルトの名無しさん
2008/02/23(土) 14:58:20CreateWindowとCreateControlWindowはどう違いますか?
0299デフォルトの名無しさん
2008/02/23(土) 15:00:58C風のキャストはなんでもかんでもキャストできてしまうので、
プログラマの意図と違ってても警告が出ない
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も外したい意図の場合はこう書く
0300デフォルトの名無しさん
2008/02/23(土) 15:03:54gotoのほうが行き先が明確になるので、理解しやすかったので、用いていますが
なぜ怖いのでしょうか
それと、「これは、s[i] == cと、s[i] == 0の判定が成されていないという事ですよね?
しかし、while関数自体は終わってるので、s[i]は判定されている
どういうことなんでしょうか? 」
これにも答えていただけると非常にありがたいです
0301デフォルトの名無しさん
2008/02/23(土) 15:04:05キャストというのは基本的にマズい処理。
アップキャストだけは例外的に安全だが、
それ以外は基本的にはあまりやるべきではない。
でも、実際にはどうしてもやる必要が出てくる事もある。
こればっかりは仕方が無い。
そういう時、C 風のキャストを使ってしまうと色々と問題が発生する。
・ 間違って危険なキャストをしてしまうかもしれない。
例えば、const を付けるべきところで const を付け忘れたり。
こういう時、static_cast なら危険な const の付け忘れがあるとコンパイルエラーになる。
C 風キャストだと問答無用でキャストされてしまう。
これが一番の問題。
・ キャストが原因っぽいバグが見つかった時、どこにキャストがあるのか探すのが面倒。
C++ のキャストだと検索でキャストを行っている箇所を簡単に見つけられる。
・ キャストがあまり目立たない。
危険な処理を行っている箇所が目立たないのは危険。
C++ のキャストは非常に目立つ。
・ 打鍵数が少ないので気軽にキャストをしてしまう。
C++ のキャストは打ち込むのが面倒で、キャストを本当に使うべきなのか
立ち止まって考えるよう思考を誘導してくれるかもしれない。
・ 今行おうとしているキャストはどういうものかをあまり意識しないかもしれない。
キャストという処理を軽く見ているのはよろしくない。
0302デフォルトの名無しさん
2008/02/23(土) 15:06:01gotoが必要になるのは言語の構造化能力を超えた構造が必要になる場合であって、
この場合はそういう場合でない。
0303デフォルトの名無しさん
2008/02/23(土) 15:06:12論理的に記述しようぜ。
「while を終了する」 と 「指定位置に移動する」 では
前者の方がより論理的だ。
論理的なコードは、一般に変更に強く、バグが出にくい。
まあ、break すらみだりに使うべきじゃないという人もいるけどね。
0304デフォルトの名無しさん
2008/02/23(土) 15:07:500305デフォルトの名無しさん
2008/02/23(土) 15:09:39不可能
0306デフォルトの名無しさん
2008/02/23(土) 15:10:05template <size_t N> void foo(char (&hoge)[N]);
と区別できなくはない。
0307デフォルトの名無しさん
2008/02/23(土) 15:12:020308デフォルトの名無しさん
2008/02/23(土) 15:12:33template <size_t N> inline void foo(char (&hoge)[N]) { foo(hoge, N); }
もちろん、こう実装するんだぜ。
0309デフォルトの名無しさん
2008/02/23(土) 15:13:120310デフォルトの名無しさん
2008/02/23(土) 15:13:14>cuで2が、gguで3が、ijcoで4が返ってきます
その書き方はおかしい
strch_idxには引数が2つあるので、cuとかgguだけでは結果は決まらないはずだ
0311デフォルトの名無しさん
2008/02/23(土) 15:13:24逆。
gotoの方がどこにでも飛ばせるせいで行き先が不明確になる。
自分の書いたコードを他人に読ませることを想像してごらん。
breakならどこに飛ぶのか一目瞭然だけど、gotoだといちいちラベルを検索しないといけない。
しかもbreakなら「ループの終了」という意図が一目瞭然だけど、
gotoだとどういう意図で飛ばしたのかを考えないといけない。
そういう理由でgotoは避けられるため、安易にgotoが入っているとさらに、
「gotoを使わなければいけないどんな理由があったのか?」と考えさせることになる。
0312デフォルトの名無しさん
2008/02/23(土) 15:14:13あと、コンテナの最後の要素以外を処理する時、
std::vector<T> container;
for (int n = 0; n < static_cast<int>(container.size()) - 1; ++n) container[n] = ...;
ってやる?
0313デフォルトの名無しさん
2008/02/23(土) 15:23:01俺はstatic_castを使う
コンテナの方は
for (size_t n = 0; 〜
って書けばいいのでは
本当は std::vector<T>::size_type の方が適切なのかもしれんが
0314デフォルトの名無しさん
2008/02/23(土) 15:23:54>int⇔floatの変換
うん。
>最後の要素以外を処理
unsigned使う。
0315デフォルトの名無しさん
2008/02/23(土) 15:31:10使う。
>コンテナの最後の・・・
for (std::vector<T>::size_type n = 0, size = container.size(); n + 1 < size; ++n) container[n] = ...;
ってやると思う。
符号無しの値を符号付きにキャストするのは基本的に危険だと思う。
0316デフォルトの名無しさん
2008/02/23(土) 15:32:52if( !c.empty() )
for( size_t n=0; n<c.size()-1; ++n)
で何か問題あるのか?
0317デフォルトの名無しさん
2008/02/23(土) 15:34:18n + 1 < c.size() で判定すれば empty チェックは要らない。
0318デフォルトの名無しさん
2008/02/23(土) 15:36:12まあ T をそういう意味で使ってるとは限らないが。
0319デフォルトの名無しさん
2008/02/23(土) 15:39:01>>311での説明とほぼ同じという理解でよろしいでしょうか
>>311
gotoよりbreakを使うべきというのは、よく理解でき、納得できました
しかし、怖いというのは一体
>>310
すみませんが、もうすこし噛み砕いて説明願えないでしょうか
const char* sには、任意の文字列が入って、char cで、検索する文字を固定という事ではないんですか?
そのconst char* sにcuですとか、gguですとかが入っているので、これで十分だと考えているのですが
0320デフォルトの名無しさん
2008/02/23(土) 15:43:08goto はまず特定の状況でしか使われない。
それ以外で使われると混乱するし、
何のために使われているかすぐに分からないので不気味で怖い。
0321デフォルトの名無しさん
2008/02/23(土) 15:44:11goto は意図が不明確。
goto のあるコードを変更することになった場合、
その意図が 100% 分からなければ、
手を加えて変なことになりかねないので怖い。
0322デフォルトの名無しさん
2008/02/23(土) 15:44:56一番怖いのは、バグの温床になること。
コードの分かりにくさってのはバグに直結する。
0323デフォルトの名無しさん
2008/02/23(土) 15:47:14イテレータ使うならこうだな。
前進イテレータでさえあれば、これでいけるはず。
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 = ...;
}
0324デフォルトの名無しさん
2008/02/23(土) 15:52:18const char* s が cu でも c の方は
strch_idx("cu", 'c') とか
strch_idx("cu", 'u') とか
strch_idx("cu", 'x') とか色々指定できるわけで
0325デフォルトの名無しさん
2008/02/23(土) 15:53:30なるほど、よく理解できました
ご親切にありがとうございます
1、意図が不明で不気味で怖い
2、バグを招きやすいから怖い
この二点ですね
そして、本筋のほうもできたら説明していただきたいのですが
0326デフォルトの名無しさん
2008/02/23(土) 15:53:540327デフォルトの名無しさん
2008/02/23(土) 15:58:000328デフォルトの名無しさん
2008/02/23(土) 15:58:55一般に、コンパイルに時間がかかる方が、
コンパイル時にある程度処理を行ってくれているため、速くなる。
ただ、コードがあまりにも肥大してくると、
キャッシュの効きが悪くなって遅くなる事もある。
0329デフォルトの名無しさん
2008/02/23(土) 16:02:03いくつか修正したみたいだけど今はどうなってるの?
0330デフォルトの名無しさん
2008/02/23(土) 16:05:44最初から全文現すべきでしたね、申し訳ありません
#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のほうが良い理由があるのでしょうか
0331デフォルトの名無しさん
2008/02/23(土) 16:07:30>char c = c;
これはなによ
0332デフォルトの名無しさん
2008/02/23(土) 16:08:43continue した時でもインデックスが増えてくれるのと、
インデックスをなめていく操作を行っているという意図が伝わりやすいのと。
終了条件は while の時と同じでいいじゃん?
0333デフォルトの名無しさん
2008/02/23(土) 16:16:31goto end ってどこに飛んでるの?
0334デフォルトの名無しさん
2008/02/23(土) 16:17:17goto endが一個消し忘れ。
×char c = c;
○char c = 'c';
-1を返したいのは文がヌル文字だけだった場合?それとも文字が見つからなかった場合?
前者ならループのたび判定するのは無駄だから最初に一回だけ判定させたらいい。
後者ならヌルが見つかった時点でループが終わってるから中のlese-if節は判定してくれない。
最初に文字列の長さを測って最後までループが回った場合に-1を返すようにしないと。
0335デフォルトの名無しさん
2008/02/23(土) 16:26:11構造体を参照渡ししてもだめでした 下は期待通りの動作をします 何がいけないのかわかりません
#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);}
0336デフォルトの名無しさん
2008/02/23(土) 16:26:35もっと単純に考えようぜ。
まず、文字を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。
0337デフォルトの名無しさん
2008/02/23(土) 16:29:05Cならシーキビだろ
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;
}
0338デフォルトの名無しさん
2008/02/23(土) 16:29:460339デフォルトの名無しさん
2008/02/23(土) 16:30:19f の呼び出し後、ch は既に delete された後のアドレスを保持することになるから
絶対にアクセスしちゃダメ。
そもそも生のポインタで確保されたメモリを扱ってるからそういう事が起きる。
コンテナ使え。
0340デフォルトの名無しさん
2008/02/23(土) 16:30:21f(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);}
0341デフォルトの名無しさん
2008/02/23(土) 16:31:18chに割り当てたnew char[10]はfの中でdeleteされてるから、
printf("%s",ch) は違法。
それからnew[]した配列はdeleteではなくdelete[]しないといけない。
0342デフォルトの名無しさん
2008/02/23(土) 16:34:08char *ch=NULL;
x.end=ch+strlen(ch);
ヌルポインタに整数を足しても有効な値にはならない。
0343デフォルトの名無しさん
2008/02/23(土) 16:35:22>>335をどう変更すればできますか?
0344デフォルトの名無しさん
2008/02/23(土) 16:37:350345デフォルトの名無しさん
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());
}
0346デフォルトの名無しさん
2008/02/23(土) 16:38:32f(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);}
0347デフォルトの名無しさん
2008/02/23(土) 16:38:490348デフォルトの名無しさん
2008/02/23(土) 16:41:160349デフォルトの名無しさん
2008/02/23(土) 16:42:49ポインタが参照渡しでどうのこうの言ってた奴だよな?
頼むからポインタとは何かを一から勉強し直してくれ。
0350デフォルトの名無しさん
2008/02/23(土) 16:44:23関数に渡された数値は数値がコピーされただけの別物。
だから関数内でx.start = new char [20];とかやっても呼び出し元のxには変化は無い。
0351デフォルトの名無しさん
2008/02/23(土) 16:44:320352デフォルトの名無しさん
2008/02/23(土) 16:45:30まともな本読め。
そこにいくらでもサンプルは書いてあるし、
詳細な解説も載ってる。
0353デフォルトの名無しさん
2008/02/23(土) 16:46:24後者はアドレス渡しですけど・・・
0354デフォルトの名無しさん
2008/02/23(土) 16:47:42後者では x は書き換えられるが ch は書き換えられない。
0355デフォルトの名無しさん
2008/02/23(土) 16:47:47アドレスの指す先の内容を書き換えると呼び出し元へ反映されるというだけのこと。
0356デフォルトの名無しさん
2008/02/23(土) 16:50:34ってやっても、ch と x->start がリンクされるわけじゃない
x->start の内容が変化しても、chには関係ない
0357デフォルトの名無しさん
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);}
0358デフォルトの名無しさん
2008/02/23(土) 16:52:50ch, x, そして動的に確保されたメモリが
実際にメモリ上でどう置かれていてどう参照していて
何を実行するとどう変化するか。
0359デフォルトの名無しさん
2008/02/23(土) 16:54:53それでとりあえずまともに動くね。
推奨されるコードかと言うとまたそれは別だが。
new 使ってるから C++ なんでしょ? コンテナ使えば楽だぜ。
0360デフォルトの名無しさん
2008/02/23(土) 16:58:05・>357のfに渡す前に、xはいつnewされてるの?
・関数の一行目がdeleteって、ものすごく気持ち悪いんだけど、よくつかう手法なの?
0361デフォルトの名無しさん
2008/02/23(土) 17:00:09deleteにNULLを渡しても何も起こらないことになっているから、
最初にnewされていないというのは大丈夫。エラーにはならない。
最初にdeleteというのは必要に応じて使えばいいと思うけど、
俺も書いた覚えない(clear()とかいかにもそれだけを行う関数というのでもない限り)。
0362デフォルトの名無しさん
2008/02/23(土) 17:03:440363デフォルトの名無しさん
2008/02/23(土) 17:04:300364デフォルトの名無しさん
2008/02/23(土) 17:04:41大問題。
0365デフォルトの名無しさん
2008/02/23(土) 17:05:560366デフォルトの名無しさん
2008/02/23(土) 17:06:160367デフォルトの名無しさん
2008/02/23(土) 17:07:46>deleteにNULLを渡しても何も起こらないことになっているから、
>最初にnewされていないというのは大丈夫。エラーにはならない。
なるほど、どうもです。
>最初にdeleteというのは必要に応じて使えばいいと思うけど、
>俺も書いた覚えない(clear()とかいかにもそれだけを行う関数というのでもない限り)。
なるほど。
よく考えたらC++になってからnewなんてほとんど使ったこと無かった気がします。
動的な配列が必要になったらだいたいvectorにつっこんでた。
0368デフォルトの名無しさん
2008/02/23(土) 17:10:42std::vector<int>().swap(v); みたいにしないとメモリは解放できない。
解放した方がいいかどうかは状況次第だが。
0369デフォルトの名無しさん
2008/02/23(土) 17:32:26大問題ってことで軽くググってみたら、
・配列に対して、delete [] としなかった場合、1個目の要素のみデストラクタが走り、残りの要素は走らない
・確保された領域(配列)は一応開放される(デストラクタで開放されるべき領域は除く)が、
要素数保持のための隠れた確保領域は開放されずに残る
ってな、感じかな
0370デフォルトの名無しさん
2008/02/23(土) 17:37:02#include <stdio.h>
main(){
char *ch=new char[200*1024*1024];
getchar();
printf("delete 実行\n");
delete ch;
getchar();}
0371デフォルトの名無しさん
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();}
0372デフォルトの名無しさん
2008/02/23(土) 17:42:39strch_idx関数に渡すためのcを、main関数のほうで作っておかないとだめかなと考えまして
>>332
あまり理解できませんが、なるべくforを使うようにします
>>333
消し忘れです
ご指摘ありがとうございます
>>334
理屈を丁寧に解説していただきありがとうございました
>>336を参考にやってみて、できました
>>336
ご丁寧にありがとうございました
その指針でできました
最後にご丁寧に、教えるのもわずらわしいような初歩的な愚問に答えていただき、ありがとうございました
0373デフォルトの名無しさん
2008/02/23(土) 17:44:350374デフォルトの名無しさん
2008/02/23(土) 17:47:40>>371
特に勘違いしてるところはないと思うが・・・
要素数を保持する領域はないってことを言いたいのか?
組み込み型にはないけど、クラスにはあるみたいなことが書いてあったんだが
0375デフォルトの名無しさん
2008/02/23(土) 17:49:37#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();}
0376デフォルトの名無しさん
2008/02/23(土) 17:50:41そもそもnew[]したものをdeleteするとどうなるかは未定義。
そういう挙動になったという話は、たまたまその実装ではそうだったということでしかない。
0377231
2008/02/23(土) 17:51:43MyArrayの方はデフォルトコンストラクタか引数を省略できるコンストラクタを
呼んでいるようなのですが、これのタイミングが分かりません。
コンストラクタを通過するそぶりもないし、一応初期化はされてるっぽいし・・・
特にデストラクタのタイミングも分からないのが心配です。
いつ開放されるんでしょうか?
0378デフォルトの名無しさん
2008/02/23(土) 17:54:33どこかでnew[]やdelete[]しているだろ?そのときだ。
0379デフォルトの名無しさん
2008/02/23(土) 18:04:57newで割り当てたものはdelete、new[]で割り当てたものはdelete[]で解放します。参照の深さは関係ありません。
0380デフォルトの名無しさん
2008/02/23(土) 18:12:04main(){
char *ch=new char [50];
char **start, **end;
start=&ch; //これは成功します
end=&&ch[20];
// end=&(ch+20);
}
0381デフォルトの名無しさん
2008/02/23(土) 18:24:57それを参照渡ししようとしたら&&ch[20]のはず・・・
0382デフォルトの名無しさん
2008/02/23(土) 18:26:38end = &chend;
0383デフォルトの名無しさん
2008/02/23(土) 18:33:33コンパイルはできましたが、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]) );
}
0384デフォルトの名無しさん
2008/02/23(土) 18:34:48これだとうまくいきました サンクス
char * chend = &ch[6];
end = &chend;
printf("%c\n", ((*start+1)[2]) );
printf("%c\n", ((*end-5)[2]) );
0385デフォルトの名無しさん
2008/02/23(土) 18:38:150386デフォルトの名無しさん
2008/02/23(土) 18:41:41main(){
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]) );
}
0387デフォルトの名無しさん
2008/02/23(土) 18:43:040388デフォルトの名無しさん
2008/02/23(土) 19:53:270389デフォルトの名無しさん
2008/02/23(土) 20:04:000390デフォルトの名無しさん
2008/02/23(土) 20:04:210391デフォルトの名無しさん
2008/02/23(土) 20:26:55文章で理由を説明してほしい。
0392デフォルトの名無しさん
2008/02/23(土) 20:36:550393デフォルトの名無しさん
2008/02/23(土) 20:53:56俺は>>386と同レベルのコードを保守する羽目になって殺意を覚えた。
0394デフォルトの名無しさん
2008/02/23(土) 21:00:350395デフォルトの名無しさん
2008/02/23(土) 21:02:02int main() {
int i;
cin>>i;
double a[i];
...
というコードはC++では出来ない(やりたいならnewでやるべき)と言われたのですが、
g++とiccではできました。これってだめだけど、gccやiccの拡張機能によって
できているのでしょうか?
0396デフォルトの名無しさん
2008/02/23(土) 21:04:05C++ が変化し続けているだけの話
0397デフォルトの名無しさん
2008/02/23(土) 21:09:33現状のC++標準規格じゃ無理。C99は可能。
C99サポートしてるコンパイラなら期待してもいい。
0398デフォルトの名無しさん
2008/02/23(土) 21:11:020399デフォルトの名無しさん
2008/02/23(土) 21:13:170400デフォルトの名無しさん
2008/02/23(土) 21:18:400401デフォルトの名無しさん
2008/02/23(土) 21:24:180402デフォルトの名無しさん
2008/02/23(土) 21:35:03#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); }
0403デフォルトの名無しさん
2008/02/23(土) 21:37:15ローカル変数のアドレスを関数外に持ち出すな。
0404デフォルトの名無しさん
2008/02/23(土) 21:39:050405デフォルトの名無しさん
2008/02/23(土) 21:39:210406402
2008/02/23(土) 21:45:20#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); }
0407デフォルトの名無しさん
2008/02/23(土) 21:46:360408402
2008/02/23(土) 21:48:090409デフォルトの名無しさん
2008/02/23(土) 21:53:31参照渡しにしてもだめです
f(strdata *zzz){ printf("%s",*(zzz->st)); }
main(){
strdata str;
strconstconv(&str, "abcdefgh");
f(&str); }
0410デフォルトの名無しさん
2008/02/23(土) 21:54:330411デフォルトの名無しさん
2008/02/23(土) 21:56:580412デフォルトの名無しさん
2008/02/23(土) 21:57:010413デフォルトの名無しさん
2008/02/23(土) 21:57:11トリップをつけてくれるとあぼーんしやすいのですがいかがでしょうか
0414デフォルトの名無しさん
2008/02/23(土) 22:00:250415デフォルトの名無しさん
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); }
0416デフォルトの名無しさん
2008/02/23(土) 22:03:36多少手を入れて(int mainとするとか)こっちで動かしてみましたが、ちゃんとabcdefghと表示されました。
でも、newだけc++の機能をつかってるけど、あとは全部(結構年季が入った感じの)cだし、
c++のコンパイラなら、関数の戻り値を指定しないのはダメだと思うし、
mallocとnew は併用したらダメだってどこかで聞いたけどな。
いまいちやろうとしていることの意図がつかめません。
(mallocとnewを併用して、どういう状況でまずいのかしらべようとしているのか)
もしc++を勉強しようとしているなら、なにか適当な本とかで勉強するのを勧めます。
Cを上記くらいご存知なら、すぐにC++も使えるようになりますよ。
0417デフォルトの名無しさん
2008/02/23(土) 22:03:53これでもわからないなら、なんでもいいからポインタの無い言語に行ってくれ。
そして帰ってくんな。
0418デフォルトの名無しさん
2008/02/23(土) 22:08:06なんでお前は答えを貰っても全くレスポンスを返さずに、
そんなヘドロみたいなコードを貼り続けるんだ。
頭沸いてるのか
0419デフォルトの名無しさん
2008/02/23(土) 22:08:35これなら動く。
#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;
}
0420デフォルトの名無しさん
2008/02/23(土) 22:11:12おまいやさしいな
0421デフォルトの名無しさん
2008/02/23(土) 22:14:15それだと、ポインタは値渡しのため、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));}
0422デフォルトの名無しさん
2008/02/23(土) 22:17:54( ゚д゚) ・・・
(つд⊂)ゴシゴシ
(;゚д゚) ・・・
(つд⊂)ゴシゴシゴシ
_, ._
(;゚ Д゚) …!?
0423デフォルトの名無しさん
2008/02/23(土) 22:17:550424デフォルトの名無しさん
2008/02/23(土) 22:20:55#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;}
0425デフォルトの名無しさん
2008/02/23(土) 22:21:34>それだと、ポインタは値渡しのため、strに渡した文字列が書き換えられなくなります
wwwwwwwwwwwwwwwwwwwwwww
>>419よ、これが現実だwwwwwアホは相手にするなwwwwww
0426デフォルトの名無しさん
2008/02/23(土) 22:22:150427421
2008/02/23(土) 22:26:270428デフォルトの名無しさん
2008/02/23(土) 22:28:05初心者を抜け出した程度の俺でも酷いと思うw
0429デフォルトの名無しさん
2008/02/23(土) 22:28:08変数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;
}
0430421
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);}
0431デフォルトの名無しさん
2008/02/23(土) 22:34:49お前が421や424で書いたコードは
>printf("%s",*(str.st));
だったのになぜ
>printf("%s",ch);
になってるんだ?納得のいく説明を聞こうか?
0432デフォルトの名無しさん
2008/02/23(土) 22:34:55int main() {
strdata str;
f(&str); ←ここで初期化された文字列の内容、長さを変更したいんです あと変数testほ確保しても落ちないようにしたいんです
printf("%s", str.st);
みなさんは、>>424はまともに動きますか?
0433デフォルトの名無しさん
2008/02/23(土) 22:37:26動かすまでもなく、まともに動かないのは分かる
0435デフォルトの名無しさん
2008/02/23(土) 22:37:36printf("%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;
}
0436デフォルトの名無しさん
2008/02/23(土) 22:39:36test=(char *)malloc(1);をはずすと上手くいきます なぜですか
0437デフォルトの名無しさん
2008/02/23(土) 22:40:58それは上手く動いてるんじゃなくて、たまたま動いてるだけ
0438デフォルトの名無しさん
2008/02/23(土) 22:41:46をチラ見しかしてないけどそれが動くことがとても不思議。
とりあえず期待する動作はなんなのかを日本語で書いてください。
0439デフォルトの名無しさん
2008/02/23(土) 22:42:06それだと始めにchが巨大に確保されていたらメモリーリークになると思うのですが
0440デフォルトの名無しさん
2008/02/23(土) 22:43:20偶然。
あのコードでは、すでになくなったローカル変数を読み取ろうとしている。
運良くメモリ上に残っていれば、一見正しく動いているように見える。
そのtestの行は、残っていた変数の値を破壊する決定打になったのだろう。
0441デフォルトの名無しさん
2008/02/23(土) 22:43:21思うだけだ
0442デフォルトの名無しさん
2008/02/23(土) 22:44:24高速スクロールで華麗にスルー。
違うお題ないの?
0443デフォルトの名無しさん
2008/02/23(土) 22:46:11use LWP::Simple;
sub foo{ return get('ttp://hoge.com/fuga.zip'); }
これをVC++で極力シンプルにやるにはどうすればいいでしょうか?
環境は以下のとおりです。
VisualC++.net2003 Standard
managedC++不使用 MFC不使用 ATL/WTL使用 STL/Boost使用
0444デフォルトの名無しさん
2008/02/23(土) 22:46:57バイナリ文字列 (\0を含む) の初めと終わりを構造体で関数に渡して、バイナリ文字列の内容、長さを書き換えたいんです
0445444
2008/02/23(土) 22:48:450446デフォルトの名無しさん
2008/02/23(土) 22:49:59…
一般的に知られている C言語の定義とは違うものを扱ってらっしゃるのですね
0447デフォルトの名無しさん
2008/02/23(土) 22:50:530448デフォルトの名無しさん
2008/02/23(土) 22:52:02なんでchとかtestとか別の変数が出てくるの?
構造体のまま扱い続ければいいでしょ。
0450デフォルトの名無しさん
2008/02/23(土) 22:55:140451デフォルトの名無しさん
2008/02/23(土) 22:55:32本格的に他人に頼りたいなら金でも払え
0452デフォルトの名無しさん
2008/02/23(土) 22:59:15ただのポインタだろ
str.st と等価だ
0453デフォルトの名無しさん
2008/02/23(土) 23:01:55char *ch=new char [100]; strcpy(ch, "---------");
という文字列に対して、その先頭と後方のアドレスを関数に渡して、関数側で書き換えられるようにしたいんです
0454デフォルトの名無しさん
2008/02/23(土) 23:04:50とりあえずそんなことを考える前に
入門書なりきちんと読め。
たのむから
0455デフォルトの名無しさん
2008/02/23(土) 23:09:26このとき初めの文字列を解放するか、上書きすれば最高でも400Mしかメモリを使いません
しかし、それができずに返却すると最大 200M + 200M + 200M必要になります
0456デフォルトの名無しさん
2008/02/23(土) 23:11:03ソケット使ってカリカリやるしか思いつかん
0457デフォルトの名無しさん
2008/02/23(土) 23:11:12手軽さならWinInet
真剣にやるならWinsock
0458デフォルトの名無しさん
2008/02/23(土) 23:13:38435みたいに、構造体で渡した後、元の変数に代入し直せばいい。
0459デフォルトの名無しさん
2008/02/23(土) 23:15:300460デフォルトの名無しさん
2008/02/23(土) 23:19:19だったら、
typedef struct {
char *baka;
size_t length;
} aho;
とでもして、構造体をやり取りすればいいだろ。
C++だったら、vector<char>、deque<char>でも使えや。
0461443
2008/02/23(土) 23:20:13サンクス
0462デフォルトの名無しさん
2008/02/23(土) 23:20:26URLDownloadToFile
0463デフォルトの名無しさん
2008/02/23(土) 23:26:44なぜ直接書き換えられないのかわかりません
0464デフォルトの名無しさん
2008/02/23(土) 23:29:10こっちからしてみたら、なんで構造体を使いたくないのかわからない。
0465デフォルトの名無しさん
2008/02/23(土) 23:29:25もっと勉強してから出直せ
0466デフォルトの名無しさん
2008/02/23(土) 23:40:17開始のアドレスと長さを渡しても上と同じだと思います
0467デフォルトの名無しさん
2008/02/23(土) 23:41:340468デフォルトの名無しさん
2008/02/23(土) 23:44:18「名前欄にレス番つけること」すら今日知ったっぽい
0469デフォルトの名無しさん
2008/02/23(土) 23:44:390470デフォルトの名無しさん
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] ;
}
}
0471デフォルトの名無しさん
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);
}
0472デフォルトの名無しさん
2008/02/23(土) 23:50:11http://www.google.co.jp/search?q=C%2B%2B+3%E6%A1%81+%E3%82%B3%E3%83%B3%E3%83%9E&btnG=%E6%A4%9C%E7%B4%A2&lr=
0473デフォルトの名無しさん
2008/02/23(土) 23:53:13だから x.start=&ch;と参照渡しをするために
構造体を { char **start ; char **end; }に変更します
そうすると上記のような現象が出ます
0474デフォルトの名無しさん
2008/02/23(土) 23:53:48f(&x);
ch=x.start;
printf("%s",ch);
でいいだろ
って・・・釣られちまったよ〜〜〜〜ん
0475デフォルトの名無しさん
2008/02/23(土) 23:56:53fを呼んだあとのchが指す先はfの中でdeleteされていることに気づいているか?
0477デフォルトの名無しさん
2008/02/24(日) 00:03:07>>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);}
0478デフォルトの名無しさん
2008/02/24(日) 00:06:58しかも、
baka = new aho[shine];
としたら
delete []baka;
とすることしら知らないバカ。
マニュアルでも読め
0479デフォルトの名無しさん
2008/02/24(日) 00:07:28じゃあもういいから、こうしとけ
#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);
}
これで終了、もう来るな
0480デフォルトの名無しさん
2008/02/24(日) 00:08:23deleteもnewも効いているはずだよ?
・chが指す先をdeleteしようが、x->start=new・・・をしようが、chの中身は変わらない。
・deleteしても絶対に書き込めなくなるとは限らない。
これらは理解している?
0481not 477
2008/02/24(日) 00:10:08あ・・・そういえばdelete []baka;としないといけなかったんだ・・・・
C厨ですまん。
0482デフォルトの名無しさん
2008/02/24(日) 00:15:240483デフォルトの名無しさん
2008/02/24(日) 00:17:32main関数内、chだけに注目すれば、
chはNULLで初期化された後、一切変更を受けないだろ。
printfにNULLを渡しているので、未定義。
0484デフォルトの名無しさん
2008/02/24(日) 00:18:48それだと、 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));
}
0485デフォルトの名無しさん
2008/02/24(日) 00:23:270486デフォルトの名無しさん
2008/02/24(日) 00:24:02h内のローカル変数chのアドレスをx->startに格納しているが、
chはhを抜けると無くなるので、x->startは存在しない場所を指している。
0487デフォルトの名無しさん
2008/02/24(日) 00:24:26じゃあこれでいいだろう
#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));
}
0488デフォルトの名無しさん
2008/02/24(日) 00:25:03ほかのコンパイラでは、入れなくても実行時に落ちます 原因は何ですか?
0489デフォルトの名無しさん
2008/02/24(日) 00:25:460490デフォルトの名無しさん
2008/02/24(日) 00:27:01原因はchがローカル変数だからだ
0491デフォルトの名無しさん
2008/02/24(日) 00:27:09OSが落ちろ!!って指令を下すからじゃないかな?
0492デフォルトの名無しさん
2008/02/24(日) 00:27:09こいつ分かってるけど、分からないフリしてるだけだろ
0493デフォルトの名無しさん
2008/02/24(日) 00:28:09こっちも暇だからね
0494デフォルトの名無しさん
2008/02/24(日) 00:28:54最初の例から考えると、文字列定数や、文字配列をもdeleteしようとしてるんだから。
0495デフォルトの名無しさん
2008/02/24(日) 00:30:19しかし、これはどのコンパイラでも正常に動きませんか? 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); }
0496デフォルトの名無しさん
2008/02/24(日) 00:31:31それが動くのはchar*&だからだ
0497デフォルトの名無しさん
2008/02/24(日) 00:32:23うん。それはローカル変数アドレスを取る(ポインタを取る、参照を取る)
ということをやっていないから問題ない。
0498デフォルトの名無しさん
2008/02/24(日) 00:33:28そのhは、chの「値」をコピーしているので、
chが無くなっても値はxに格納されているから動く。
>>484はchの「アドレス」を格納しているだけ。
0499デフォルトの名無しさん
2008/02/24(日) 00:33:34プログラミングは諦めたほうがいい
1.簡単な事をややこしくして
2.バグを入れて
3.聞きまくることで他人の邪魔をする
別の仕事探せ
少なくともオレはそれを勉強熱心とはいえない
0500デフォルトの名無しさん
2008/02/24(日) 00:41:03手段に固執して、何の目的でそのイミフな手段をとろうとしているのか自分でわかってない。
0501デフォルトの名無しさん
2008/02/24(日) 00:41:58タスクマネージャで確認するとf()を抜けてもメモリはそのままです
#include <stdio.h>
f(){
char *x=new char [200*1024*1024]; }
main() {
f();
getchar();
}
0502デフォルトの名無しさん
2008/02/24(日) 00:42:13ちなみに、それをポインタを使って書き直すとこうなる。
#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;
}
0503デフォルトの名無しさん
2008/02/24(日) 00:43:280504デフォルトの名無しさん
2008/02/24(日) 00:46:04マニュアル嫁
ヒープの意味を理解してからnew や delete を使え。
変数の記憶クラスを理解しろ
0505デフォルトの名無しさん
2008/02/24(日) 00:47:43allocしたなら残っているけど
0506デフォルトの名無しさん
2008/02/24(日) 00:48:18だからの前後が繋がってないぞ
newした領域がdeleteされるまで解放されなかったら
なぜローカルで定義された変数や配列をmainから操れることになるんだ
0507デフォルトの名無しさん
2008/02/24(日) 00:49:11#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();}
0508デフォルトの名無しさん
2008/02/24(日) 00:52:46それはhのローカルで定義された変数chをmainから操ってるわけではないな
単にnewした領域へのポインタchをmainのxにコピーして渡してるだけだ
0509デフォルトの名無しさん
2008/02/24(日) 00:54:230510デフォルトの名無しさん
2008/02/24(日) 00:54:390511デフォルトの名無しさん
2008/02/24(日) 00:55:37newで確保したメモリへのポインタをmainに連れて行っているだけ。
newやmallocで確保したメモリはソース上のスコープに縛られずに使える。
一方、>>484では、x->start=&ch;というように、
ローカル変数へのポインタをmainへ持って行っている。
しかし、mainに戻ったときには既に変数chそのものが居なくなっているのでうまくいかない。
0512デフォルトの名無しさん
2008/02/24(日) 00:56:05>>507
なにしてるかわかってるならいいけど、ポインタ一回お浚いしたら?
0513デフォルトの名無しさん
2008/02/24(日) 00:56:26あんたはnewで確保した領域と、それを指すポインタ変数を、同一のものであると勘違いしてないか?
>>507のコードでも、ポインタ変数chはhを抜ける時に消滅するのは分かるか?
0514デフォルトの名無しさん
2008/02/24(日) 01:00:530515デフォルトの名無しさん
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));
}
0516デフォルトの名無しさん
2008/02/24(日) 01:04:590517デフォルトの名無しさん
2008/02/24(日) 01:05:040518デフォルトの名無しさん
2008/02/24(日) 01:05:450519デフォルトの名無しさん
2008/02/24(日) 01:06:51x->startをまったく初期化しないまま、*(x->start)なんかに代入しているのが間違い。
>>513に答えろ
0520デフォルトの名無しさん
2008/02/24(日) 01:08:18このスレ読んだらなんとなく理解できてきた気がする。
C言語でnewとdeleteを使い続けてる人ありがとう!
あと、もちろん解説してくれてるみんなもありがとう!
明日からもstringばりばり使っていこうと思います。
0521デフォルトの名無しさん
2008/02/24(日) 01:09:24そうだね、それは動かないね
だから?
何を聞きたいのか明確に
0522デフォルトの名無しさん
2008/02/24(日) 01:09:53関数での、初期化と書き換えをする方法がわかりたいです
0523デフォルトの名無しさん
2008/02/24(日) 01:10:25#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;
}
0524デフォルトの名無しさん
2008/02/24(日) 01:10:30じゃあ、なんでメモリ操作を隠蔽するクラスを作ろうとしないの?
IQ低いから?
0525デフォルトの名無しさん
2008/02/24(日) 01:10:53みんなが何回も例を出しているのに・・・(T_T)
0526デフォルトの名無しさん
2008/02/24(日) 01:12:15上のほうで最終的にCで書くと言っていたはず。
俺にはなんで今はnew[]使ってC++にするのか理解できないけど。
0527デフォルトの名無しさん
2008/02/24(日) 01:12:50おまいがポインタについて知っている知識をすべて述べよ
0528デフォルトの名無しさん
2008/02/24(日) 01:12:53何度か出てる正しく動く例が気に入らない理由はなぜかね
0529デフォルトの名無しさん
2008/02/24(日) 01:18:03それでわかってくれるかどうか不安になる。
0530デフォルトの名無しさん
2008/02/24(日) 01:19:41皆が何言ってるかほとんど分からないC++素人だけど
一日ぐらい気分変えて犬の散歩にでも行ったら?
まあ、犬のウンコの処理しながら考えたりさ
その後で、また一から作ってみる
以外とできるかもよ
0531デフォルトの名無しさん
2008/02/24(日) 01:21:40それだとうごきました サンクス
x.start = &p;
h(&x);
printf("%s", *x.start);
初めにメモリ上にchar*型が確保されないと受け取れないって事か
0532デフォルトの名無しさん
2008/02/24(日) 01:23:55犬のウンコの処理を考えたり に見えて
delete unko;とか脳内で実行しそうになった
0533デフォルトの名無しさん
2008/02/24(日) 01:28:09pを確保しなくても、これでもいいはずですよね
int main() {
bin x;
x.start = new char *;
h(&x);
printf("%s", *x.start);
}
0534デフォルトの名無しさん
2008/02/24(日) 01:28:520535デフォルトの名無しさん
2008/02/24(日) 01:35:57newしたものはdeleteしないといけないのが面倒だから、
使わずに済むなら避けるべき。
0536デフォルトの名無しさん
2008/02/24(日) 01:48:500537デフォルトの名無しさん
2008/02/24(日) 01:53:19再帰関数って便利ですか?
もしよろしければ、メリットとデメリットを教えていただけないでしょうか?
自分の考えでは、 goto と同じ用に無理に使う必要はない機能だと思ってます。
0538デフォルトの名無しさん
2008/02/24(日) 01:54:370539デフォルトの名無しさん
2008/02/24(日) 01:58:18メリットデメリットという問題でもない気がする
0540デフォルトの名無しさん
2008/02/24(日) 01:58:23ポリゴン(ボーン)の操作で便利
でも、無理して使わなくてもおk
0541デフォルトの名無しさん
2008/02/24(日) 02:03:160542デフォルトの名無しさん
2008/02/24(日) 02:09:18【ソース】 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ネットワークプログラミング自体の問題かと考え
こちらに質問させていただきました。よろしくお願いいたします。
0543デフォルトの名無しさん
2008/02/24(日) 02:13:01typedef struct _D3DXFRAME {
LPSTR Name;
D3DXMATRIX TransformationMatrix;
LPD3DXMESHCONTAINER pMeshContainer;
struct _D3DXFRAME *pFrameSibling;
struct _D3DXFRAME *pFrameFirstChild;
} D3DXFRAME, *LPD3DXFRAME;
座標系の上に座標系があって、
さらにその座標系の上に座標系が…
と繰り返すので、スタックを自前で管理するより
再帰処理にしたほうが楽というだけ
(体-上腕-腕-手-指 のように繋がっていくので)
0544デフォルトの名無しさん
2008/02/24(日) 02:17:35カンなので外してたら無視してくれ
>for(i=0;i<=strlen(p);i++){
\0も送信してるが、いいのか?
i<strlen(p) なんじゃない?
0545デフォルトの名無しさん
2008/02/24(日) 02:37:36for分で体のパーツ数回してデータを読み取ってるんですが、
今は無理してそれを崩してまで使う機能ではないってことですね。
よく機能を理解して使えば楽になる物、ということですね。
答えてくれた方ありがとうございました。
0546デフォルトの名無しさん
2008/02/24(日) 03:26:15メッセージの終わりを\n → \r\n に変えてみたらいけるかも
0547デフォルトの名無しさん
2008/02/24(日) 03:33:50俺はオナニーして発射した後、ティッシュで拭いてる時にコードが閃くよ。
0548546
2008/02/24(日) 03:56:01\nでメッセージの終わりを判断してるとすると、サーバは次のメッセージの受信で
先頭に\0が入ってしまうんではないかと思う
(2回目のメッセージが、"\0JOIN #ircclidev\n"になるんじゃないかな)
0549デフォルトの名無しさん
2008/02/24(日) 04:06:10i<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を使っているところが主流のようです。
0550デフォルトの名無しさん
2008/02/24(日) 04:12:53http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6082.txt
0551デフォルトの名無しさん
2008/02/24(日) 05:11:02iconvじゃだめかい?
0552デフォルトの名無しさん
2008/02/24(日) 05:52:14VC++6.0からVisualStudio2008に移ったんですが、外観が変わりすぎててチンプンカンプン・・・
どこかVisualStudio2008 Exp の解説やってるページとかありませんか?
dllすら読み込めぬ・・・。orz
0553デフォルトの名無しさん
2008/02/24(日) 06:11:510554デフォルトの名無しさん
2008/02/24(日) 10:24:08つまり、ポインタでも、int*とか、char*とかの型がありますが、例えば
myclass*==int*
とかやるとコンパイルエラーになります。でも、myclass1*==myclass2*は、==演算子も
定義してないのに、コンパイルできるし、ちゃんと動きます。
これは、どういう理由でできるんですか?というか、ポインタの比較をする演算子って
どこで定義してるんでしょうか?
変な質問ですいません。
0555デフォルトの名無しさん
2008/02/24(日) 10:27:060556デフォルトの名無しさん
2008/02/24(日) 10:54:10規格上で「できる」と決められている処理ははコンパイラが勝手に処理してくれる、というだけ。
myclass1*==myclass2* は >555 の言うとおり myclass1 と myclass2 に継承関係があるんだろう。
この場合、暗黙の型変換が発生して同じ型になり比較できる、と決まっている。
で、規格で決められている以上のポインタに対する演算を、自前で定義する必要があるケースはまずない。
0557デフォルトの名無しさん
2008/02/24(日) 10:55:39違う型のポインタの比較はダメ
int* a;
double* b;
a == b
をやってみれば意味がわかるんじゃないかな?
0558デフォルトの名無しさん
2008/02/24(日) 12:50:040559デフォルトの名無しさん
2008/02/24(日) 12:52:24配列自体は無理
0560デフォルトの名無しさん
2008/02/24(日) 12:52:270561デフォルトの名無しさん
2008/02/24(日) 12:53:21できる
template <size_t n>
void func((&a)[n]) のように
0562デフォルトの名無しさん
2008/02/24(日) 12:53:390563デフォルトの名無しさん
2008/02/24(日) 12:58:420564デフォルトの名無しさん
2008/02/24(日) 13:14:21ありがとうございます。
たしかにできませんでした。でも、
template <class T, int N>
int func(T a[N])
{
...
}
こういう様に書いても(func()の引数に&を付けても付けなくても)、aは参照扱いになるようです。
aに対して変更を加えると、func()の呼び出し側の元配列にも変更が反映されました。
0565デフォルトの名無しさん
2008/02/24(日) 13:20:120566デフォルトの名無しさん
2008/02/24(日) 13:32:04aは参照でなくてdecayされるからポインタだろ
0567デフォルトの名無しさん
2008/02/24(日) 13:36:59そうか。ポインタですよね。
ポインタをコピーして、その先まで複製してくれるのはありえないですよね。
ありがとうございました。
0568デフォルトの名無しさん
2008/02/24(日) 13:50:24boost::array を使うとか。
0569デフォルトの名無しさん
2008/02/24(日) 16:28:53rand/srand使うしかないですか?
rand/srand使うとしたら、シードによく現在時刻使いますが
現在時刻を取得する方法はtimeしかないですか?
++らしい方法があれば教えてください。
0570デフォルトの名無しさん
2008/02/24(日) 16:30:060571デフォルトの名無しさん
2008/02/24(日) 16:31:57http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
ここから持っていけばいいんじゃね
0572デフォルトの名無しさん
2008/02/24(日) 16:32:08Boost.Random
0573デフォルトの名無しさん
2008/02/24(日) 17:06:58という風に文字列と数字を一緒にメッセージ表示出来ましたが、
C++で文字列と数字を一緒にメッセージ表示させるにはどうしたらいいでしょうか?
MessageBox(NULL, "文字列"+123, "test", NULL)
というのは出来ませんでした。
0574デフォルトの名無しさん
2008/02/24(日) 17:09:11JavaScript同様、文字列を連結してから表示すればいい。
0575デフォルトの名無しさん
2008/02/24(日) 17:19:27char msg[20] = "文字列";
char tmp[10];
itoa(123, tmp, 10);
strcat(msg, tmp);
MessageBox(NULL, msg, "test", NULL);
こんな感じですか?
メッセージ毎にこのコードを書くのも面倒臭いのと、
いつも "文字列"+数字 の組み合わせと言うわけでもなく
数字+"文字列"+数字+"文字列" という事もあるため
自作関数でmsgbox(char*, int){}という決め撃ちではやく、
文字列や数字を混同で表示できる方法はないかと考えています。
0576デフォルトの名無しさん
2008/02/24(日) 17:20:07ソース内に日本語を入れるとエラーになるんですが、
どこをどうすればいいのでしょうか?
超初心者です。よろしくお願いします。
0577デフォルトの名無しさん
2008/02/24(日) 17:21:41○ //ああああ
0578デフォルトの名無しさん
2008/02/24(日) 17:22:140579576
2008/02/24(日) 17:27:51/* hello02.c */
#include <stdio.h>
int main()
{
printf("今日はよい天気です。\n");
printf("明日もよい天気でしょう。 \n");
return 0;
}
これなんですけど…
0580デフォルトの名無しさん
2008/02/24(日) 17:30:51どんなエラー?
0581デフォルトの名無しさん
2008/02/24(日) 17:34:42ありがとうございます、Boost 試してみます。
手元の mingw にはなさそうなので、まずはgooって
Boost 環境揃えてみますね。
>>576
・ソースの文字コードを変えてみる
・処理系を変えてみる
0582576
2008/02/24(日) 17:36:23普通に表示されました。
なんか間違ったやりかたしてたみたいです…
申し訳ないです。
0583デフォルトの名無しさん
2008/02/24(日) 17:41:12そのためのsprintf、とだけいっておくけど。
0584デフォルトの名無しさん
2008/02/24(日) 17:48:41sprintfだとメッセージウィンドウは生成されないですよね?
外見としてはMessageBoxの中身に数字や文字列を表示している様な方法がいいんです。
0585デフォルトの名無しさん
2008/02/24(日) 17:54:210586デフォルトの名無しさん
2008/02/24(日) 17:55:05ならsprintfしてMessageboxにいれる処理の関数つくればよくね?
0587デフォルトの名無しさん
2008/02/24(日) 17:56:41二段構えになるのが嫌、というだけの話とエスパー
vsprintf()使って自作ラッパー関数でも書くんだな
0588デフォルトの名無しさん
2008/02/24(日) 17:58:37boost::lexical_cast
を使うと幸せになれると思う
0589デフォルトの名無しさん
2008/02/24(日) 18:04:51失礼しました。printfと勘違いしてました。
sprintfだと文字列に格納できるんですね。
boostは自分にはまだ早そうなので(正規表現使えるのは魅力的ですが)、sprintfでやってみます。
ありがとうございました。
0590デフォルトの名無しさん
2008/02/24(日) 18:05:19効率が悪いのが難点
0591デフォルトの名無しさん
2008/02/24(日) 18:07:23俺も最初それ思いついたけど、連結する数値がたくさんあると見苦しくなるから
std::stringstreamに流し込んで取り出す方がいいんじゃないかなあ。
0592デフォルトの名無しさん
2008/02/24(日) 18:45:34序数で指定しても動きません どのような理由でしょうか?
VC++だと動かないですが、BCCとDMCで動きます
0593デフォルトの名無しさん
2008/02/24(日) 18:47:43FN = (fnc) GetProcAddress(hd, (LPCSTR)4); //序数での指定
このような記述はWindowsXPなら万能ではないんでしょうか?
0594デフォルトの名無しさん
2008/02/24(日) 18:50:46読み込みはしますが、実行時にエラーになります 序数がずれるのかも・・と思い全ての番号で試したのですがだめです
0595デフォルトの名無しさん
2008/02/24(日) 18:52:47CFooから派生した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();//エラー
見たいな呼び方をしたいのですがどうすればいいのでしょうか?
0596デフォルトの名無しさん
2008/02/24(日) 18:59:37そもそもそのような継承にしてる理由は?
0597デフォルトの名無しさん
2008/02/24(日) 18:59:59CFoo のメンバ関数ならキャストは要らないはず。
IHoge〜 に意味が無くなると言うが、こっちからしたら CFoo や vec の使い方も
ひっくるめて最初からその継承関係の意味がわからん。
0598595
2008/02/24(日) 19:06:570599デフォルトの名無しさん
2008/02/24(日) 19:10:28あるいは、virtual Test()をもつ何かインターフェースに。
0600デフォルトの名無しさん
2008/02/24(日) 19:18:44ダウンキャストすることになるだろうな。
0601デフォルトの名無しさん
2008/02/24(日) 20:05:03もう自前でパースしてるよ
0602592
2008/02/24(日) 20:05:240603デフォルトの名無しさん
2008/02/24(日) 20:10:05車輪の再発明
0604デフォルトの名無しさん
2008/02/24(日) 20:25:220605デフォルトの名無しさん
2008/02/24(日) 20:29:540606デフォルトの名無しさん
2008/02/24(日) 20:58:500607デフォルトの名無しさん
2008/02/24(日) 21:06:120608デフォルトの名無しさん
2008/02/24(日) 21:06:13全てのJIS漢字のJISコードなんて、そうそう覚えられるもんじゃないと思うが。
0609デフォルトの名無しさん
2008/02/24(日) 21:14:12〜
};
class Hoge{
public:
void hoge(Piyo[][256]);
};
void Hoge::hoge(Piyo[][256] piyo){
〜
}
こんな実装をした時に、Hoge::hogeのpiyoを書いておくと'Piyoは未定義のシンボル'と怒られてしまいます。
仮引数をPiyo[][256]だけにすればコンパイルは通りますが、どう使えというのか・・・といった感じです。
コンパイラはBCC5.5を使っています。クラスの2次元配列をできれば「参照」で渡したいのですが、
どうすればいいんでしょうか?
0610デフォルトの名無しさん
2008/02/24(日) 21:15:36void Hoge::hoge(Piyo piyo[][256]) {
しかもこれいわゆる参照渡しの挙動をするが、
正確にはポインタ渡しだし。
0611609
2008/02/24(日) 21:29:18自分でもドン引きです・・・。ありがとうございました
0612デフォルトの名無しさん
2008/02/24(日) 23:16:37cmakeについてのリアルタイム講演が聞けるそうな
0613デフォルトの名無しさん
2008/02/24(日) 23:20:24ReadFile(fp , &(buf[N]) , 1500 , &sz , NULL);
でエラーで止まります bufは十分にとってあります なぜでしょうか
0614デフォルトの名無しさん
2008/02/24(日) 23:24:57bufの宣言がどうなっているかにも拠るが、&(buf[N])をbufにしてみろ。
それで巧くいくなら、お前は馬鹿だ。
0615デフォルトの名無しさん
2008/02/24(日) 23:31:32原因不明ですが、変数の位置変えたらエラーでなくなり一応うごくようになりました
0616デフォルトの名無しさん
2008/02/24(日) 23:34:06単純にバッファオーバーフローしてるだけじゃないのか?
0617デフォルトの名無しさん
2008/02/24(日) 23:36:56別のところから変更しないと直りそうにありません
設計やり直してきます
0618デフォルトの名無しさん
2008/02/24(日) 23:48:580619デフォルトの名無しさん
2008/02/24(日) 23:51:19char 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]
0620デフォルトの名無しさん
2008/02/24(日) 23:52:380621デフォルトの名無しさん
2008/02/24(日) 23:55:540622デフォルトの名無しさん
2008/02/24(日) 23:56:41ostr << hoge.str();
}
みたいなやつか。
0623デフォルトの名無しさん
2008/02/25(月) 00:07:210624デフォルトの名無しさん
2008/02/25(月) 00:08:240625デフォルトの名無しさん
2008/02/25(月) 00:09:430626デフォルトの名無しさん
2008/02/25(月) 00:10:45strcpy( &s[5], "000");
は正しいですか
0627デフォルトの名無しさん
2008/02/25(月) 00:14:03やった後、stringオブジェクトは壊れるとおもうけど
0628デフォルトの名無しさん
2008/02/25(月) 00:15:060629デフォルトの名無しさん
2008/02/25(月) 00:15:58規格ではそんな保障はされていません。
0630デフォルトの名無しさん
2008/02/25(月) 00:17:13あっ嘘、s[i]で取得できてもできないと思う
置き換えたいなら、replaceを使いなさい
0631デフォルトの名無しさん
2008/02/25(月) 00:17:23std::stringのことなら、正しくない。
0632デフォルトの名無しさん
2008/02/25(月) 00:21:59int main(){
string str="9999999999";
char *pointer=&str[5];
memcpy( pointer, "000", 3);
str+=(string)"add";
cout<<str;
return 0;}
0633デフォルトの名無しさん
2008/02/25(月) 00:25:35ユーザーは合法的でない方法を使ってもアクセスできませんか?
0634デフォルトの名無しさん
2008/02/25(月) 00:28:12必要のないポインタ操作はやめましょう。
動くか動かないかがプログラムの正しさの判定基準ではありません。
0635デフォルトの名無しさん
2008/02/25(月) 00:28:47あるコンパイラのあるバージョンで動くとしても、規格で保証されていなければ、
他のコンパイラや同じコンパイラの別バージョンでは動かないかもしれない。
それでもいいなら、どうぞ?
今後ずっと同じコンパイラを使い続けて、決して変えないのなら、たぶん問題ないだろう
0636デフォルトの名無しさん
2008/02/25(月) 00:30:23なんのためのクラスだと思う?
0637デフォルトの名無しさん
2008/02/25(月) 01:00:06エラーの通知にはエラーメッセージより例外を使う方がいいと聞いたのですが
オリジナルな例外クラスを投げたり、charを投げまくる仕様にしていいのですか?
例外というと、これ以上の実行に支障が出るときに使うようなイメージがあるのですが実際の現場ではどうなのでしょうか?
0638デフォルトの名無しさん
2008/02/25(月) 01:01:510639デフォルトの名無しさん
2008/02/25(月) 01:14:59パフォーマンスは落ちる。禁止オプションもあるくらいだからな。
特に組み込みでは。。。。。。
0640デフォルトの名無しさん
2008/02/25(月) 01:17:110641デフォルトの名無しさん
2008/02/25(月) 01:20:04好きなように使え。
ただ、エラーメッセージと例外では通知する相手が違うぞ。
エラーメッセージはエンドユーザ、例外はプログラマに通知するもんだ。
ユーザがいきなり「0x00d2345でlogic_error例外が発生しました」とか見せられても訳わからんだろ。
charも投げられるが、標準との整合を考えて投げるのはオリジナルも含めてstd::exception派生のクラスにしとけ。
0642デフォルトの名無しさん
2008/02/25(月) 01:21:41static領域に配置したオブジェクトのメンバなら、コンストラクタで何もしていなければ0になります。
それ以外は不定です。
0643デフォルトの名無しさん
2008/02/25(月) 01:29:37クラスが消滅したらアクセスできなくなると思いますが
つけなくても自動でstaticになりますか
0644デフォルトの名無しさん
2008/02/25(月) 01:50:30なるほど・・・
戻り値でエラーを知らせたり、NULLを返したりという方法もあるのでどういう方法が主流なのかなと思ってまして
自分はたいていの場合
何が起こったのか確認して、何事もなかったかのように受け流してさいごにエラーログを確認する
位のデバッグライト的な使いか確かしてないのですが・・・
0645デフォルトの名無しさん
2008/02/25(月) 01:59:21どれが主流というのは無い。場面によって適切な方法があるだけ。
ライブラリとか、設計思想によりエラーの返し方がある程度統一されてたりすることもあるけどね。
とにかく作ってみなさい。できたものを自分なりに分析して、ここはこうした方がよかったとか、省みることで成長するんだから。
0646デフォルトの名無しさん
2008/02/25(月) 02:09:23残ります、というかクラスを複数生成しても全部同じstaticメンバ変数をさすんですよ?
三行目がいまいちなに言ってるのかわからんstaticつけないとstaticにはならないよ
0647デフォルトの名無しさん
2008/02/25(月) 02:12:480648デフォルトの名無しさん
2008/02/25(月) 02:13:09>static つけたらクラスが消滅しても値が残るんですか?
(クラスではなくインスタンスのことを言いたいのだと思うが…)
staticで宣言した変数は、main関数の開始前から終了後まで存在する。
破棄されるのがmain関数終了後だから通常はそれへのアクセスが問題になることはないが、
staticの変数が異なるファイルで定義されて、一方のデストラクタからもう一方を参照するような
処理があるとまずい。
意味が分からないようなら気にしなくていい。
>つけなくても自動でstaticになりますか
ならない。
0649648
2008/02/25(月) 02:14:21×staticの変数が
○2つのstaticの変数が
0650デフォルトの名無しさん
2008/02/25(月) 02:24:32include " "
include < >
" ", < > の違いを教えて頂けませんか?
0651デフォルトの名無しさん
2008/02/25(月) 02:30:32コンパイラのマニュアルか入門書を読みなさい。
0652デフォルトの名無しさん
2008/02/25(月) 02:47:52http://www.google.co.jp/search?q=C%E8%A8%80%E8%AA%9E+include
上から順に読んでいけばそのうち解説してるサイトにたどり着く
0653デフォルトの名無しさん
2008/02/25(月) 07:25:36std::string の内部バッファの連続性は次の規格で保証されるようになる。
おそらく現状全ての実装でそうなっていることが、その規格変更を実現したんだろう。
だから一応そう言うことをしても問題は無いはずだが、
メンバ関数でできることはメンバ関数でやった方がいい。
replace 使うといい。
0654デフォルトの名無しさん
2008/02/25(月) 09:45:12返り値でエラーコード返しちゃうと返り値の型が拘束されちゃうしメンドクサ
結局こういう使い方だと例外のありがたみを半分も得ていない気がする
0655デフォルトの名無しさん
2008/02/25(月) 10:00:21ありがたみが半減する。
0656デフォルトの名無しさん
2008/02/25(月) 11:44:36自作したいです
あと、整数変数は、初期化なしでアクセスしてもエラーは出ませんか?
0657デフォルトの名無しさん
2008/02/25(月) 11:46:470658デフォルトの名無しさん
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();
}
0659デフォルトの名無しさん
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();
}
0660デフォルトの名無しさん
2008/02/25(月) 12:12:41整数変数を初期化しなくてもエラーは出ませんが、ローカルな場合に不定値なので初期化しましょう。
0661デフォルトの名無しさん
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();
}
0662デフォルトの名無しさん
2008/02/25(月) 12:42:21初期化前にコンストラクタで代入されてしまうとフラグが確認できません
0663デフォルトの名無しさん
2008/02/25(月) 12:47:110664デフォルトの名無しさん
2008/02/25(月) 12:56:55やりたいことがよくわからん。せめて、コンパイルできるソース(の断片)を貼ってくれ。
0665デフォルトの名無しさん
2008/02/25(月) 13:00:43定数文字列" "と
固定文字列char [n]と
可変文字列char *を
区別して、上の二つならメモリを確保して値渡しにしたいんです
値を書き換えたいため
0666デフォルトの名無しさん
2008/02/25(月) 13:01:400667デフォルトの名無しさん
2008/02/25(月) 13:02:010668デフォルトの名無しさん
2008/02/25(月) 13:06:38要は、const char *でコンストラクトするときはメモリを確保して、char *でコンストラクトするときは確保しなければ委員でね?
それと、書き換えのときはconst char *でもchar *でも以前の状態に応じて解放しないといけないんでね?
0669デフォルトの名無しさん
2008/02/25(月) 13:07:200670デフォルトの名無しさん
2008/02/25(月) 13:17:48constつけるだけでは無理です
#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();
}
0671デフォルトの名無しさん
2008/02/25(月) 13:19:34それを定数として扱ってはいけない理由を教えてくれ。
0672デフォルトの名無しさん
2008/02/25(月) 13:22:36char ch[] = "yyy"は書き換え可能なんだから可変長と同一視すればいいし
const char ch[] = "zzz"は書き換え不可能なんだから定数と同一視すればいいのでは?
0673デフォルトの名無しさん
2008/02/25(月) 13:22:41を分類する方法教えてください
あと、すでにメモリが確保してあればそれを解放する方法教えてください
0674デフォルトの名無しさん
2008/02/25(月) 13:23:360675デフォルトの名無しさん
2008/02/25(月) 13:24:190676デフォルトの名無しさん
2008/02/25(月) 13:26:00これは簡単。コンストラクト時にメモリを確保したらフラグをセットしておいて、代入オペレータでそれをチェックすればいい。
勿論、代入オペレータも2種類用意して必要ならフラグをセットするのは当然として。
そのフラグはいずれにしてもデストラクト時に必要にナル死ね。
0677デフォルトの名無しさん
2008/02/25(月) 13:28:05ここは一つ、char配列は渡さないと言う運用でw
0678デフォルトの名無しさん
2008/02/25(月) 13:28:420679デフォルトの名無しさん
2008/02/25(月) 13:43:23現存するやつは値渡しです
0680デフォルトの名無しさん
2008/02/25(月) 13:45:330681デフォルトの名無しさん
2008/02/25(月) 13:46:270682デフォルトの名無しさん
2008/02/25(月) 13:46:53クラスの確保と同時に代入されてしまうと、フラグが設定されていないので動作不明になりませんか?
0683デフォルトの名無しさん
2008/02/25(月) 13:50:39可変長文字列は参照渡しにして、それ以外は値渡しにして、新たな文字列が渡されたら以前のを解放したいんです
0684デフォルトの名無しさん
2008/02/25(月) 13:52:58>680
0685デフォルトの名無しさん
2008/02/25(月) 13:53:250686デフォルトの名無しさん
2008/02/25(月) 13:56:58(バイナリ) 文字列 str , p , qに対して
replace(str, p, q) strの全文でpをqに置換する
という関数を作りたいんです
0687デフォルトの名無しさん
2008/02/25(月) 14:03:08それぞれの型の応じて関数を振り分ければいいのか?
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);
}
0688デフォルトの名無しさん
2008/02/25(月) 14:03:31int main()
{
f("abc");
char a[5];
f(a);
char *p;
f(p);
}
0689デフォルトの名無しさん
2008/02/25(月) 14:08:07#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);
}
0690デフォルトの名無しさん
2008/02/25(月) 14:12:45そりゃコンパイラがだめなんだろうな。
g++ 4.2.3だとa b cになる。
0691デフォルトの名無しさん
2008/02/25(月) 14:12:57これでいいのか?
#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;
}
0692デフォルトの名無しさん
2008/02/25(月) 14:17:34俺だったら、次のどっちかにする。だから、673のようなことをしたくなる理由が理解できない。
1. strは全く書き換えず、置換後の文字列は新しく確保したメモリに書き込んで戻り値に返す。
2. strは書き換えできるという前提でstrを書き換える。(書き換えできない
文字列をstrに渡したければ、書き換え可能な場所へコピーを作ってそれを渡す)
0693デフォルトの名無しさん
2008/02/25(月) 14:25:43replace(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", "(^_^)");
がしたいんです
0694デフォルトの名無しさん
2008/02/25(月) 14:29:10もとのデータと併せて領域が2倍必要になりますしコピー時間がかかります
>>691 バリナリデータも扱いたいです
0695デフォルトの名無しさん
2008/02/25(月) 14:32:38できるぞ
>>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;
}
0696デフォルトの名無しさん
2008/02/25(月) 14:32:39開発環境 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;
}
0697デフォルトの名無しさん
2008/02/25(月) 14:35:18置換前より後の文字列のほうが長い場合、
単純にその場で書き換えていくと、1ヶ所置換が行われる度に
置換部分以降をずらしたり、時にメモリの伸張をしたりで時間がかかる。
最近のOSはメモリの扱いも上手になっているし、
そもそもPCのメモリ搭載量も大きくなっているから、
新しいメモリに書き込んでいくも選択肢として捨てたものではない。
0698デフォルトの名無しさん
2008/02/25(月) 14:38:10VC++ 2008でしか試してない。オーバーロード解決は規格に従って
いるんだが。コンパイラがテンプレート規則に対応していないのかね。
0699デフォルトの名無しさん
2008/02/25(月) 14:48:28stringにコピーするのが一番なんですかね?
関数で作業領域を確保しようとするので 初めの3倍必要になります
コピー無しなら2倍ですみます 300メガとかだと動作に支障出ないですかね・・
>>698
うちのコンパイラだと全滅しました MinGWの最新版 、DMC、VC++6.0、bcc5.5.1
0700デフォルトの名無しさん
2008/02/25(月) 14:51:462番の方向で行こうとしているところだったんです
定数なら書き換え可能な領域を確保しようとしたら、その判別がコンパイラでできないのでここで質問していたんです
0701デフォルトの名無しさん
2008/02/25(月) 14:51:46new 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", "(^_^)");
0702デフォルトの名無しさん
2008/02/25(月) 14:57:26stringに直接挿入する方向で行こうと思います
巨大な入力があるのはファイルからなので、自作して直接stringに入れるようにします
0703デフォルトの名無しさん
2008/02/25(月) 15:00:35>コピー無しなら2倍ですみます 300メガとかだと動作に支障出ないですかね・・
stringの操作云々よりも、その情報量をどう扱うかと言うアルゴリズムの方が問題になりそうな希ガス。
少なくとも、GiBオーダ未満のメモリくらい今時普通に扱えるよ。
>>696
どう、機能していないのさ。
0704デフォルトの名無しさん
2008/02/25(月) 15:01:190705692
2008/02/25(月) 15:03:09俺の場合、その判別は自分でやる。
必要なら自分でメモリ確保してmemcpyか何かでコピーしてから置換する関数へ渡すと言うこと。
メモリ確保その他をstringに任せているという点が違うけど、695案と同系統のアイデア。
0706デフォルトの名無しさん
2008/02/25(月) 15:04:31関数突入を探すwhileの条件がcount != 1だから、関数突入後に中括弧を見つけるとcountが2になって脱出できなくなる罠。
0707デフォルトの名無しさん
2008/02/25(月) 15:10:50>706に加えて、内側のwhileは両方ともifでいいだろよ。
つまり、最初のwhileは if (count == 0)で、次のwhileはif (count > 0)。
んで、fin >> bufferだと単語単位でしか入力できないから工夫が必要。
# 行単位入力すればいいのかな? 仕様がわからんからなんとも言えんが。
0708デフォルトの名無しさん
2008/02/25(月) 15:13:01ポインタのポインタとかやっているうちに動かない場合があることに気づき修復不可能になりました
そしてC++で参照や型判定して作ろうとしたらこれも上手くいきませんでした
簡明なプログラムが大事ですね
0709デフォルトの名無しさん
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);}
0710デフォルトの名無しさん
2008/02/25(月) 15:52:07無理して難しく書いても、あとあとメンテナンスやデバッグのことを考えると、シンプルに書いた方がいい場合が多い
メモリを何MBか余計に使ったり、実行時間が何分か伸びたところで、なんだというんだ
ややこしいコードは書くのもデバッグも何日もかかる
それだけの価値があればやってもいいが、たいていは割に合わない
0711デフォルトの名無しさん
2008/02/25(月) 17:21:33一日でマスターするのは無理なのかなぁ・・・
0712デフォルトの名無しさん
2008/02/25(月) 17:26:040713デフォルトの名無しさん
2008/02/25(月) 17:39:36とか言いたいけど最低10年とかいう意見もあるし
やね某が何年か前に提唱した半年ぐらいで勘弁しておいてやろう
0714デフォルトの名無しさん
2008/02/25(月) 18:04:09"aa\0aa" + "bbbbb"はどのコンパイラでも、
"aa\0aabbbbb"ですよね?
0715デフォルトの名無しさん
2008/02/25(月) 18:38:410716デフォルトの名無しさん
2008/02/25(月) 18:39:190717デフォルトの名無しさん
2008/02/25(月) 18:43:10>>714はC++でもNGだろ。C文字列同士だぞ。
0718デフォルトの名無しさん
2008/02/25(月) 18:45:360719デフォルトの名無しさん
2008/02/25(月) 18:48:480720デフォルトの名無しさん
2008/02/25(月) 19:21:16アイアイ
0721デフォルトの名無しさん
2008/02/25(月) 19:30:23これって、AUTO変数と比べてより便利な点ってあるのでしょうか?
0722デフォルトの名無しさん
2008/02/25(月) 19:36:53○std::auto_ptrが破棄されたときインスタンスも自動的に開放
0723デフォルトの名無しさん
2008/02/25(月) 19:37:01・スタックに置くには適さない巨大なデータも置ける
・最初はNULLにしておいて必要になってからnewできる
・ブロックを出るまで待たなくても好きなタイミングで削除できる
・releaseで手放せばブロックを出ても削除しないことも出来る
0724デフォルトの名無しさん
2008/02/25(月) 19:39:100725デフォルトの名無しさん
2008/02/25(月) 19:41:51string func1() {
string s = "Hello";
return s;
}
void func2(string s) {
cout << s << endl;
}
int main() {
func2(func1());
}
この渡し方って解放されなかったり破壊されたりしますか?
処理系によりけりですか?
0726デフォルトの名無しさん
2008/02/25(月) 19:43:39しません。
どの処理系でも平気。
0727デフォルトの名無しさん
2008/02/25(月) 19:59:12ありがとうです。
ところで、testは適当なクラスとして、
int main()
{
std::auto_ptr<test> tp(new test);
tp.release();
return 0;
}
とすると、メモリリークが検出されてしまうのですが、tp.release()をしないようにすると
大丈夫でした。これってrelease()の使い方が間違ってますか?
あと、最初にauto_ptr<test>だけ宣言しておいて、途中でnew testする方法もわかりません。
もうちょっとだけ教えてくださいな。
0728デフォルトの名無しさん
2008/02/25(月) 20:05:080729デフォルトの名無しさん
2008/02/25(月) 20:14:08最初は、
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();
ありがとうございました。
0730デフォルトの名無しさん
2008/02/25(月) 20:27:13tp.reset();
0731デフォルトの名無しさん
2008/02/25(月) 20:44:230732デフォルトの名無しさん
2008/02/25(月) 20:52:38729のようなことをしていないか不安。
0733デフォルトの名無しさん
2008/02/25(月) 20:58:49例えばコンストラクタとデストラクタで確保&解放を行う為に全体をそれに合わせたり
それの為にメソッドやクラスを用意したり等々
確かに見通しもよくなりますし、わかりやすくなるとは思うのですが、
それらを犠牲にすれば短く出来たりオーバーヘッドを減らせたり出来るんじゃないか?と考えてしまいます
つまりコード全体の見易さ、転じてメンテナンスが容易になるなどのメリットと
速度を犠牲にするというデメリットがあると思います
とはいえ後者は今時気にするほどでもなく、詳しくないのですがここを気にするのは組み込み系と呼ばれる分野くらいなのかなとも思います
実際はやはり見易さ等を気にした手法(なんていうんだろう?)を用いて設計を行うべきなんでしょうか?
うまく表現できなく、長くなってしまってすみません
0734デフォルトの名無しさん
2008/02/25(月) 21:01:160735デフォルトの名無しさん
2008/02/25(月) 21:04:18フルパス指定しなくて読み込めるんですか?
C:\Program Files\Microsoft Visual Studio 8\VC\include
でOK?
0736デフォルトの名無しさん
2008/02/25(月) 21:06:29ソースファイルと同じ場所なら
#include"hoge.h"
でおk
0737デフォルトの名無しさん
2008/02/25(月) 21:09:06大丈夫
君よりコンパイラのほうが賢いから
0738デフォルトの名無しさん
2008/02/25(月) 21:09:180739デフォルトの名無しさん
2008/02/25(月) 21:10:010740デフォルトの名無しさん
2008/02/25(月) 21:11:48std::sort が qsort より概して速くなる、というみたいに、
インライン化されると問題ないことも多い。
0741デフォルトの名無しさん
2008/02/25(月) 21:14:36色んな分野があるって前提で考えてるんだろう?
お前は組み込み系とビジネスソフト開発が同じだと思っているのか?
それにプログラミングしてればみんなプログラマって思考が気持ち悪い
お前見たいのは答える側に回るな
0742デフォルトの名無しさん
2008/02/25(月) 21:14:59でもやっぱり速度は気にしちゃいけないところですか、無駄だと思ってしまうところから直す必要がありそうですね
コンパイラの最適化というのも知らない分野ですし、当分は見通しの良いプログラムを目指してみようと思います
0743デフォルトの名無しさん
2008/02/25(月) 21:18:54そして遅ければ改善する。
この順だな。
0744696
2008/02/25(月) 21:19:34先ほどのプログラムを訂正したら、
一行ほどしか出力されませんでした。
どこが間違っているのでしょうか。
ttp://www.borujoa.org/upload/source/upload17009.txt
0745デフォルトの名無しさん
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;
}
0746696
2008/02/25(月) 21:28:43どなたか教えてください。
0747デフォルトの名無しさん
2008/02/25(月) 21:32:490748744
2008/02/25(月) 21:37:58そんなソフトがあったんですかw
ありがとうございます。
しかしそれではコーディングトレーニングにならないので、
ソースコードでよろしくお願いいたします。
どう考えてもイメージがわかないもので質問した次第です。
0749デフォルトの名無しさん
2008/02/25(月) 21:44:30C++でプログラミングをしようと思っているのですが
開発環境等をどうしようか迷っています
将来的には
■ゲームを動かすプログラム(同人やエロゲのアプリ程度)
■補助ソフトやパッチ
■データを暗号化して格納するプログラム
等を作りたいと思っています
何かアドバイスがあればお願いします
0750デフォルトの名無しさん
2008/02/25(月) 21:45:47タダだし
0751744
2008/02/25(月) 21:48:04「C++の勉強したいんだがどの本買って勉強したらいいんですか?」
って聞いてるのと一緒だべ?
0752デフォルトの名無しさん
2008/02/25(月) 21:50:19私にもそんな時期がありました(マジで)
0753デフォルトの名無しさん
2008/02/25(月) 21:51:50プロファイルとってそこだけしぼって最適化すればいい。
最初から保守性犠牲にしてまでパフォーマンスチューニングが必要な分野って
限られてると思うよ。
0754デフォルトの名無しさん
2008/02/25(月) 21:55:02今からC++勉強するよりもおまいは吉里吉里勉強したほうが幸せになれると思う
0755744
2008/02/25(月) 22:06:01エニバディー、ティーチ ミーしてくれませんか?
0756デフォルトの名無しさん
2008/02/25(月) 22:16:44理解できずに挫折したか。
0757デフォルトの名無しさん
2008/02/25(月) 22:16:590758デフォルトの名無しさん
2008/02/25(月) 22:18:58関係はないが、とりあえずバッファを buffer_size しか確保してないのに
fgets で filesize 読もうとしてるのはヤバい。
0759デフォルトの名無しさん
2008/02/25(月) 22:28:27else if(count > 0)
0760744
2008/02/25(月) 22:29:05bufferはstring型でいこうとおもったんですが、
fin>>buffer;でやると、単語読み込みで一行読み込みにはならないし、
fgets(buffer.c_str(),filesize,fin);はコンパイラに怒られるし、
どうしようもないんで駆け込み寺としてここにきました。
たぶんこれも慣れた人なら簡単に直せるんだとは思いますが、
いままでC言語ばっかりやってたもんで、変な癖ついてるんです。
0761デフォルトの名無しさん
2008/02/25(月) 22:30:580762744
2008/02/25(月) 22:32:36K&Rにも載ってたんで知ってます。
0763デフォルトの名無しさん
2008/02/25(月) 22:32:53よくわからんが、
一行よむなら、std::.getline( fin, buffer );だが。むろん、finはifstream辺りの必要はある。
初めて"{"が存在する行をみつけたとき、上のifでcount++になって、
下のifも成立してでcount++で2になるんだが、そういうものなのかね?
0764デフォルトの名無しさん
2008/02/25(月) 22:33:420765デフォルトの名無しさん
2008/02/25(月) 22:35:10あと必要な物はやる気と根気ですかね?
>>751
"だべ"ってどういう意味ですか?
マルチリンガーじゃないので日本語以外わからないんです、本当にごめんなさい。
0766デフォルトの名無しさん
2008/02/25(月) 22:36:48キモス
0767744
2008/02/25(月) 22:43:14else ifですか。基本的なところ躓きました。
ありがとうございます。勉強になりました。
>>763
そんな関数があったんですか。
ちょっとgetlineの中をのぞいて使わせてもらいます。
>>764
Cアンサーブックのほうです。
バイブル本とか釣られてやってみたけど、
糞面白んないんで解くのやめました。
0768デフォルトの名無しさん
2008/02/25(月) 22:44:52string buf (n, '\0' );
&buf0]; ← これはchar*のところへ入れられる
と使うと便利だ 自動で消滅するし
0769744
2008/02/25(月) 23:06:24下のほうhtmlのタグみたいですね。
奥の手っぽいんでどうしようもないときに使ってみます。
ありがとうございました。
0770デフォルトの名無しさん
2008/02/25(月) 23:48:16さっき、恐らくは想定したと思われる仕様を完璧に満たすソースを書いたんだが、
反応がなかったから会社に置いてきちゃった。次に会社に出るのは3日後なんで、
後で寝ちゃわなければ軽く再現してみるよ。
0771デフォルトの名無しさん
2008/02/25(月) 23:57:46>次に会社に出るのは3日後なんで
何でだ?
0772デフォルトの名無しさん
2008/02/26(火) 00:01:47続きそうな文章だなw
0773デフォルトの名無しさん
2008/02/26(火) 00:08:58本体 > VC++
開発用ユーティリティ > TurboC++ Exploer (BCB)
でいいんでないの?
VC++はGUIアプリの構築はそれなりに手間かかるし、BCBは紙芝居の開発じゃ全然VCLの長所が生かせない。
0774デフォルトの名無しさん
2008/02/26(火) 00:16:21単に、明日明後日は客先直行直帰だから。
>>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);
}
0775744
2008/02/26(火) 00:36:44まぁ人には癖があるからね。
ありがとう。
人と自分のソースを比較するのが、
一番勉強になるよ。
0776デフォルトの名無しさん
2008/02/26(火) 00:45:12>774は常套句の宝庫だと思うよ。fgets(buffer, sizeof(buffer), fin)とか。
>744のクラスは、変数をばら撒くだけでクラスとしては何もしない無意味な設計だったし。
後はあれだな、関数に渡すのはconst char *にしてmain()で予めargcのチェックと
argv[1]の抽出位しておくのが常套手段か。
0777744
2008/02/26(火) 00:57:36途中で配列にしたら楽だろうなぁとかは思ったが、
配列だと途中でサイズの変更が利かないから。
ポインタだと動的メモリの割り当てで適当なサイズに
割り当てできるし、と思っただけです。
別に機能さえあってればどのやりかたでもいいんだけど、
個人的には
stdoutの使い方がいまいちわかんなかったから、
そこが勉強になったのと、マクロの名前が大文字ね。
それ完全に忘れてたから勉強になった。
ありがとうってのは主にそこかなぁ・・・。
クラスは再利用に機能を発揮するから今の段階では必要としていないけど、
あとあと拡張していくにあたって必要になってくるから残しておきました。
確かにこの辺は言わんとわからんかったかもしれない。
突っ込まれたんで補足しておきました。
0778デフォルトの名無しさん
2008/02/26(火) 05:08:28ありがとう、ちょっと不安だったんだ。
名前も無いまま渡されるオブジェクトってどうなるんだろ、って。
0779デフォルトの名無しさん
2008/02/26(火) 05:56:26返してもらうにはどう書けばよいのでしょう?
BOOL hoge( HOGE *ptr )
{
…略
ptr = address;
return TRUE;
}
としても上手く動かないようです。
0780デフォルトの名無しさん
2008/02/26(火) 06:00:17整数を受け取るには整数のポインタを渡す必要がある。
構造体を受け取るには構造体のポインタを渡す必要がある。
構造体のポインタを受け取るには構造体のポインタのポインタを渡す必要がある。
0781デフォルトの名無しさん
2008/02/26(火) 06:03:19BOOL hoge( HOGE **ptr )
ちなみにC++なのですが、参照渡しを使ってこれは良いのでしょうか?
BOOL hoge( HOGE *&ptr )
一応コンパイルは通るのですが…
0782デフォルトの名無しさん
2008/02/26(火) 07:25:270783デフォルトの名無しさん
2008/02/26(火) 11:34:24ある場合には、親オブジェクトから子オブジェクトを通して親オブジェクトの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;
}
0784デフォルトの名無しさん
2008/02/26(火) 11:37:480785デフォルトの名無しさん
2008/02/26(火) 11:40:09というか出来ないとまずいだろ。
コピーコンストラクタとか代入演算子の定義が出来なくなってしまうよ。
0786デフォルトの名無しさん
2008/02/26(火) 12:06:040787デフォルトの名無しさん
2008/02/26(火) 12:22:230788デフォルトの名無しさん
2008/02/26(火) 13:01:03機能のスタティックリンクできるライブラリをご存じないでしょうか?
環境はVisualC++.net2003です。
0789デフォルトの名無しさん
2008/02/26(火) 13:07:03zlib
0790デフォルトの名無しさん
2008/02/26(火) 13:30:25同じクラスのインスタンスへの参照やポインタを持つとアクセス権限ブッチぎれちゃうのか
なんかカプセル化とかそういう面で考えると気持ち悪いというかなんというか
仕様上出来ないと仕方ないと言うのも分かるのだが・・・
0791デフォルトの名無しさん
2008/02/26(火) 13:33:530792デフォルトの名無しさん
2008/02/26(火) 13:34:460793デフォルトの名無しさん
2008/02/26(火) 14:02:36すみません、寝てました。返答有難うございます。
ちなみに「ポインタ変数を参照で渡す」と言う意味ならむしろ
BOOL hoge( HOGE &*ptr )
のような気がするのですが、なんで*&ptrなのでしょう?
それが仕様と言われればそこまでですが。
0794デフォルトの名無しさん
2008/02/26(火) 14:24:18http://kmaebashi.com/programmer/pointer.html
これの応用。
ptrのほうからreference to pointer to HOGEと読める。
0795デフォルトの名無しさん
2008/02/26(火) 14:26:03typedef HOGE * HOGE_PTRしてみれば判る。
0796デフォルトの名無しさん
2008/02/26(火) 14:37:54なるほど。正直きちんと理解できたかは自信ないですが、ちゃんと法則が
あってそうなっているのは分かりました。
どうも有難うございましたm(__)m
0797デフォルトの名無しさん
2008/02/26(火) 14:46:05vc6でコンパイルしたいです
sp1で鈍いパソコンです
0798デフォルトの名無しさん
2008/02/26(火) 14:48:160799デフォルトの名無しさん
2008/02/26(火) 14:49:23コンパイラだけ手に入れるのは無理だが
コマンドラインでの利用はできるよ
0800デフォルトの名無しさん
2008/02/26(火) 14:56:400801デフォルトの名無しさん
2008/02/26(火) 15:02:40kwsk
according to standard
0802デフォルトの名無しさん
2008/02/26(火) 15:49:24DOSの実行ファイルで、標準出力へは書き出されないメッセージを取得する方法ありませんか?
hoge.exe > log.txt
として取得できないやつです 画面には出ます
標準出力、標準エラーの取り方はわかります
0803デフォルトの名無しさん
2008/02/26(火) 16:09:38それのどこがC/C++に関係があるの?
0804デフォルトの名無しさん
2008/02/26(火) 16:18:38つ printscreen
0805デフォルトの名無しさん
2008/02/26(火) 16:34:10標準出力はこれで受け取れますが、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);
}
0806デフォルトの名無しさん
2008/02/26(火) 16:51:04そもそも、まさかHtoX32はWindowを持っているアプリケーションなのか?
だとしたら、メッセージフックなどの手段が必要になるよ。
つーか、HtoX32とやらが何ものかにも依るけど同等のプログラムを自分で書いた方が手っ取り早かったりしてね。
0807デフォルトの名無しさん
2008/02/26(火) 16:59:39ソースが公開されていたり定番のライブラリとかありませんか?
0808デフォルトの名無しさん
2008/02/26(火) 17:03:030809デフォルトの名無しさん
2008/02/26(火) 17:11:51http://support.microsoft.com/kb/190351/ja
0810デフォルトの名無しさん
2008/02/26(火) 17:15:43あればだけど
0811デフォルトの名無しさん
2008/02/26(火) 17:44:11そのコードだと、自プロセスの標準出力が hFile になるけど、子プロセ
スの HtoX32c.exe の標準出力はコンソールのままでは?
0812デフォルトの名無しさん
2008/02/26(火) 17:44:15suruct 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つ作って、その変数に代入→渡すってやり方だとできましたが
激しく面倒くさい。
0813デフォルトの名無しさん
2008/02/26(火) 17:52:410814デフォルトの名無しさん
2008/02/26(火) 17:54:43typedef SAMPLE SAMPLE2;
0815デフォルトの名無しさん
2008/02/26(火) 18:02:57>>814
情報ありがとうございます。
テンプレート関数が一番やりたかった事を解決してくれそうでした。
ありがとうございました。
0816デフォルトの名無しさん
2008/02/26(火) 18:10:58テンプレートを使うということはC++で良いので、それならメンバ関数にしてしまった方が良い。
0817デフォルトの名無しさん
2008/02/26(火) 18:22:32freadみたいにふつうに戻り値が来るのかと思いきや違うみたいですし…。
0818デフォルトの名無しさん
2008/02/26(火) 18:28:130819デフォルトの名無しさん
2008/02/26(火) 18:29:13自己レス。failで少なくとも期待通りの
バイト数読めたかどうかは取得できるのね。
0820デフォルトの名無しさん
2008/02/26(火) 18:30:300821デフォルトの名無しさん
2008/02/26(火) 18:31:39APIのほうがよい
0822デフォルトの名無しさん
2008/02/26(火) 18:55:550823デフォルトの名無しさん
2008/02/26(火) 19:18:08どのコンパイラでも同じ動作になる
あと3000個とか開けない
0824デフォルトの名無しさん
2008/02/26(火) 19:18:501 = あいうえお
2 = かきくけこ
3 = さしすせそ
4 = あいうえお
if (a = 1){
}
みたいなことをやりたいのですがどうしたら良いでしょうか?
0825デフォルトの名無しさん
2008/02/26(火) 19:19:440826デフォルトの名無しさん
2008/02/26(火) 19:20:33コンパイラで差はないかもしれないが・・・
0827デフォルトの名無しさん
2008/02/26(火) 19:21:41んなばかな
APIがMS一社で規定されてるなんて初めて知った
MSはついに世界を征服したのか
0828デフォルトの名無しさん
2008/02/26(火) 19:23:040829デフォルトの名無しさん
2008/02/26(火) 19:55:080830デフォルトの名無しさん
2008/02/26(火) 21:19:23どうやったらいいですか?
0831デフォルトの名無しさん
2008/02/26(火) 21:22:250832デフォルトの名無しさん
2008/02/26(火) 21:58:13問題ない?
0833デフォルトの名無しさん
2008/02/26(火) 22:04:41ところで_beginthreadは使うなよ。_beginthreadexにしろよ。
http://msdn2.microsoft.com/ja-jp/library/kdzttdcb(VS.80).aspx
0834デフォルトの名無しさん
2008/02/26(火) 22:15:49__declspec(dllimport) int __stdcall hoge( LPWORD, LPWORD, LPWORD );
という形の関数のアドレスが入る関数ポインタhageを作りたいのですが、
うまく宣言できません。
__declspec(dllimport) int __stdcall (*hage)(LPWORD, LPWORD, LPWORD );
などとやるとコンパイルエラーになってしまいます。
どうすれば宣言できるのでしょうか?
0835デフォルトの名無しさん
2008/02/26(火) 22:17:260836デフォルトの名無しさん
2008/02/26(火) 22:19:030837デフォルトの名無しさん
2008/02/26(火) 22:19:32typedef __declspec(dllimport) int __stdcall hogetype( LPWORD, LPWORD, LPWORD );
hogetype hoge;
0838デフォルトの名無しさん
2008/02/26(火) 22:36:15最近 if を見るたびにすぐ関数テーブル化してしまう。
間違い?
0839デフォルトの名無しさん
2008/02/26(火) 22:39:070840デフォルトの名無しさん
2008/02/26(火) 22:43:09鈍いです
0841デフォルトの名無しさん
2008/02/26(火) 22:47:58CreateProcessを短期間に20回以上使うと動かなくなるエラーってありますか?
実行する側のexeのせいかもしれないですが
0842デフォルトの名無しさん
2008/02/26(火) 22:50:02if の中にさらに if があるともうその地点でうわ・・って思ってしまう。
ちょっとソース見直してみます
0843デフォルトの名無しさん
2008/02/26(火) 22:50:41ありがとう。今度からそうする
0844デフォルトの名無しさん
2008/02/26(火) 22:54:190845デフォルトの名無しさん
2008/02/26(火) 22:59:28無理して避けることもないよ。何事も程々が1番。
0846デフォルトの名無しさん
2008/02/26(火) 23:02:18例えばゲームプログラムを作っていて、状態を管理するグローバル変数を使っているとする。
その変数には、ゲームの進行に合わせて、例えば
定数(TITLE=0, STAGE1, STAGE2, STAGE3, STAGE_CLEAR, GAME_OVER, ENDING)が入るとする。
処理は上の状態それぞれでモジュール化されているとすると、
どうしても状態管理変数はグローバル変数化してどの状態からでも
参照・設定できるようにせざるを得ないと思うのですが、何かいい手があるのでしょうか。
状態管理変数をファイル内static変数にしてセッターを使って書き換えるようにしたり、
状態管理変数とセッターをクラスにしてそのオブジェクトのスコープをグローバルにするもしくは状態管理変数とセッターを
staticにしてどのクラスからでも書き換えられるようにするくらいなら最初から状態管理変数をグローバルにしといた方が
シンプルだと思うのですがどうでしょうか。
0847デフォルトの名無しさん
2008/02/26(火) 23:03:570848デフォルトの名無しさん
2008/02/26(火) 23:05:38静的なシングルトンもグローバル変数も似たようなもんだ
グローバル変数でいいんじゃね?
ただ、関数経由にしておけばデバッグするときに setter で引っ掛ければいいだけだから
ずいぶんと楽になる*かもしれない*
0849デフォルトの名無しさん
2008/02/26(火) 23:30:59シングルタスクなら良いけど。
GUIでスレッド使って随時処理しながら入力待ちして、
入力はコールバックで処理、みたいのだと、
ゲッタやセッタ作った方が排他処理し易いかなぁ。
まぁケースバイケース?
0850デフォルトの名無しさん
2008/02/26(火) 23:32:07インスタンスが複数なら、
状態ごとの処理に、状態管理変数をクラス化したものを渡すとか、
もしくはstateパターンなんてのもいいかもしれない。
0851デフォルトの名無しさん
2008/02/26(火) 23:33:35それゆえにどこから変更されてるかを追跡するためにも
>関数経由にしておけばデバッグするときに setter で引っ掛ければいいだけだから
というのは地味に大事
0852デフォルトの名無しさん
2008/02/26(火) 23:38:31グローバルだと破綻するよね。そんな場合はゲーム状態はキャラクタに依存する情報になるわけだけど。
0853デフォルトの名無しさん
2008/02/26(火) 23:46:14グローバル変数として使ってる間違ってる例が多いのが勘違いの原因かもしれない。
自分だったら>>846の場合、シーンマネージャクラスを作ってそいつに振る舞いを管理させる。
極力グローバル変数は使わない。
0854デフォルトの名無しさん
2008/02/27(水) 00:01:100855デフォルトの名無しさん
2008/02/27(水) 00:20:00Cを極めればオブジェクト指向言語を使わなくても良いコードが書けるんじゃねえの結局クラスとか
オブジェクトとかデザインパターンとか複雑で分かりにくくするなだけじゃね
0856デフォルトの名無しさん
2008/02/27(水) 00:21:36パラメータは渡せませんか?
0857デフォルトの名無しさん
2008/02/27(水) 00:22:49んなこたーない
0858デフォルトの名無しさん
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種類あるので困っています。
よろしくお願いします。
0859デフォルトの名無しさん
2008/02/27(水) 00:28:04どんな文字列を渡したとき?
0860デフォルトの名無しさん
2008/02/27(水) 00:28:08単純に先頭からパースするだけじゃね
0861デフォルトの名無しさん
2008/02/27(水) 00:29:09s.substr(0,4);
s.substr(5,2);
s.substr(7,2);
とかでいいのでは?
0862デフォルトの名無しさん
2008/02/27(水) 00:31:49fscanf(fp, "%d/%d/%d,%d:*[^\n]", &tmp[0], &tmp[1], &tmp[2], &tmp[3]);
0863デフォルトの名無しさん
2008/02/27(水) 00:31:50自己解決しました 同名のexeがありそれが動いていたようです
0864デフォルトの名無しさん
2008/02/27(水) 00:34:11fscanf(fp, "%d/%d/%d,%d:%*[^\n]", &tmp[0], &tmp[1], &tmp[2], &tmp[3]);
0865デフォルトの名無しさん
2008/02/27(水) 00:34:23>Cを極めればオブジェクト指向言語を使わなくても良いコードが書けるんじゃねえの
これは当たり前なんだが、(といってもオブジェクト指向を使わないって意味じゃない、
Cでもオブジェクト指向は昔から存在する)
>結局クラスとかオブジェクトとかデザインパターンとか複雑で分かりにくくするなだけじゃね
何が複雑なんだ?
デザインパターンなんか当たり前の設計パターンに名前付けただけじゃないか。
0866デフォルトの名無しさん
2008/02/27(水) 00:36:27無制限に変数にアクセスできたほうが複雑だって、わかんないかなぁ。
0867デフォルトの名無しさん
2008/02/27(水) 00:48:260868858
2008/02/27(水) 01:12:38レスありがとうございます。
が、、私ではうまいこと使えませんでした。ごめんなさい。。
>860, 864
fscanfでできました。
どうもありがとうございました。
0869デフォルトの名無しさん
2008/02/27(水) 01:23:50for()文で代入を回す?
0870デフォルトの名無しさん
2008/02/27(水) 01:24:400871デフォルトの名無しさん
2008/02/27(水) 01:26:15何を以て「単純」とするかに依るんだろうな。
多分 >855 は言語の構造として単純であること、習得の容易さなどを見て言っているんだろうが
大きなコードを、そのまま扱うと中身はかなり複雑化する。
クラスや名前空間などを使って、大きなコードを小さな部品の集合体として考えて
それぞれの部品単位で扱うことで、ひとつひとつの部分は単純になる。
0872デフォルトの名無しさん
2008/02/27(水) 01:26:280873デフォルトの名無しさん
2008/02/27(水) 01:27:430874デフォルトの名無しさん
2008/02/27(水) 01:30:02vectorでもstringで有効でしょう memcpy
0875デフォルトの名無しさん
2008/02/27(水) 01:31:120876デフォルトの名無しさん
2008/02/27(水) 01:31:590877デフォルトの名無しさん
2008/02/27(水) 01:39:540878デフォルトの名無しさん
2008/02/27(水) 01:40:260879デフォルトの名無しさん
2008/02/27(水) 02:17:49SJISしかコンパイルできなくて、サイズが20Mとかになるとコンパイルに失敗する
CHMをパクってWindowsの標準ヘルプ形式を作りたい
参加者募集中
圧縮接尾辞配列がいいと思う
ブロックーソーティングしたデータはそのまま全文検索できるとおもうがどうか?
0880デフォルトの名無しさん
2008/02/27(水) 02:27:20CHMのような普及率を目指したい
デスクトップサーチとは目的が違う 元のファイルが復元できてまとめられる点が大事
0881デフォルトの名無しさん
2008/02/27(水) 02:28:280882デフォルトの名無しさん
2008/02/27(水) 02:33:300883デフォルトの名無しさん
2008/02/27(水) 02:38:510884デフォルトの名無しさん
2008/02/27(水) 02:40:51アラインメントに縛りを入れれば早くはできると思う
0885デフォルトの名無しさん
2008/02/27(水) 02:46:440886デフォルトの名無しさん
2008/02/27(水) 02:51:09専ブラのログをまとめるのに便利そうだ
あてにせず期待してるよ
0887デフォルトの名無しさん
2008/02/27(水) 03:29:32adc$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から調べていけば良さそうだが
0888デフォルトの名無しさん
2008/02/27(水) 03:41:52のような STL クラスを前方宣言するにはどうしたらいいですか?
それともこういうクラスって前方宣言しないでヘッダーに直接 include
させても問題ないですか?
0889デフォルトの名無しさん
2008/02/27(水) 04:17:01なぜかコンパイルできません。
コマンドラインで、 cl c:\source.cpp としても、
'cout' : 定義されていない識別子です。
'endl' : 定義されていない識別子です。
等とエラーが返ってきます。
ちなみに、ソースは以下のようなものです。
#include <iostream>
int main(void)
{
cout << "Hellow, World!" << endl;
return 0;
}
なぜエラーになるのか分かりません。お暇な方いましたら、どうかお知恵をお貸しください。
0890デフォルトの名無しさん
2008/02/27(水) 04:20:39○std::cout << "Hello World!" << std::endl;
0891デフォルトの名無しさん
2008/02/27(水) 04:21:19とりあえず、
std::cout << "Hellow, World!" << std::endl;
としてやってみ。
もしくは、
using namespace std:
をinclude 文の下に書いておくとか。
まあがんばれ。
0892デフォルトの名無しさん
2008/02/27(水) 04:24:33ありがとうございます。
using namespace std; を追加したらコンパイルできました・・・ ^ ^;
最初、#include <iostream.h> としていて、コンパイル時にそんなファイルは無いと言われ、
#include <iostream> に直したら今度は cout が定義されて無いと言われ・・・
完全に勉強不足ですね・・・・
0893デフォルトの名無しさん
2008/02/27(水) 04:48:08環境によっては
#include <iostream.h>
と書くと、using namespace std; を勝手にやってくれるんだわ。
多分、そういう環境を前提にしたコードだったんだろう。
0894デフォルトの名無しさん
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が代入されて無いみたいなのですが、何処がまずいのでしょうか?
0895デフォルトの名無しさん
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は何のために?
以上直すと、こっちでは代入されるよ。
0896デフォルトの名無しさん
2008/02/27(水) 09:02:30ありがとー 出来ました。
コンパイルは出来てましたがNULLが表示されました。
getchar();しないと画面が速攻閉じてしまうので、画面確認用にです。
0897デフォルトの名無しさん
2008/02/27(水) 09:06:36修正したソースを張ってみないと有効な回答は得られないと思うよ。
0898デフォルトの名無しさん
2008/02/27(水) 09:09:57shared_ptr<int> p(random_array(100));
というように書けないのですが、shared_ptrの作成時って、必ずnew[100]とかって
やらないとだめなのですか?
0899デフォルトの名無しさん
2008/02/27(水) 09:30:04arrayの共有にはshared_arrayな。
それとエラーメッセージ書かないとエスパーしか解答できない。
0900デフォルトの名無しさん
2008/02/27(水) 11:36:18が有効になりません・・・
なぜでしょう
0901デフォルトの名無しさん
2008/02/27(水) 11:59:17環境変数はプロセスごとに別々だから
子プロセスを起動してPATHを設定させても自プロセスには影響しない
0902デフォルトの名無しさん
2008/02/27(水) 12:07:43APIでPath設定できるか調べてみます
system("path C:\\hofe; \n abc.exe");
0903デフォルトの名無しさん
2008/02/27(水) 12:20:150904デフォルトの名無しさん
2008/02/27(水) 12:24:100905デフォルトの名無しさん
2008/02/27(水) 12:30:25長い実行パスと、長いパラメータパスで困ってました
これで解決しそうです
0906デフォルトの名無しさん
2008/02/27(水) 13:29:07#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が定義されていないと怒られてしまいます。どうしたら良いのでしょうか?
0907デフォルトの名無しさん
2008/02/27(水) 13:39:20sprintf(&x[0], "%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);
これは無理?
0908デフォルトの名無しさん
2008/02/27(水) 13:51:44テラThanks
0909デフォルトの名無しさん
2008/02/27(水) 13:57:030910デフォルトの名無しさん
2008/02/27(水) 14:02:11それとも負荷を下げるためにしませんか?
少量ずつデータ受け取ればミスしにくくなると思うんですけど
少しずつ受け取って確認無しでいいですか
0911デフォルトの名無しさん
2008/02/27(水) 14:02:13問題ないと言えるのは何年も先かなぁ。
0912デフォルトの名無しさん
2008/02/27(水) 14:09:00それみてデータが正常が判定したいです
0913デフォルトの名無しさん
2008/02/27(水) 14:23:32何をどこにエコーバックするんだ
ミスって何のだ
>>912
ファイルサイズは全部受信すればわかるだろう
CRCの計算方法はこれ↓
http://en.wikipedia.org/wiki/Computation_of_CRC
0914デフォルトの名無しさん
2008/02/27(水) 14:40:20サイズはレスポンスヘッダのContent-Length (ない場合もある)
CRC は無理かと
0915907
2008/02/27(水) 14:46:39char 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[]を読み込んでも"この番号は登録されていません"
と表示されてしまいます。なぜでしょうか?
0916デフォルトの名無しさん
2008/02/27(水) 14:53:34しばらく騙されてました。
0917デフォルトの名無しさん
2008/02/27(水) 14:54:360918デフォルトの名無しさん
2008/02/27(水) 15:03:58strを表示させてみるんだ
0919デフォルトの名無しさん
2008/02/27(水) 15:06:37GETでして送られてくるヘッダをみるんですよね?
2chのスレURLいれるとサイズ書いてないです
できる限りなんとか取得する方法無いですか?
0920デフォルトの名無しさん
2008/02/27(水) 15:08:28GET 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
0921デフォルトの名無しさん
2008/02/27(水) 15:12:53通信切れで見られないHMLの取得を避けたいんですけどいい方法ありませんか
0922デフォルトの名無しさん
2008/02/27(水) 15:15:270923デフォルトの名無しさん
2008/02/27(水) 15:20:51もともと不完全なHTMLならどうしたらいいですか?
サーバーのファイルと一致していてもエラーになります
0925デフォルトの名無しさん
2008/02/27(水) 15:25:54HTML4では </html> は省略可能なので万能じゃない
>>920
Connection: close
って書いてあるから接続断まで読めばそれで全部。
あと、なるべくHTTP/1.1使え
手元で確認した限り、HTTP/1.1でアクセスすると
chunked で送ってくるので末尾がちゃんと確認できる
0926920
2008/02/27(水) 15:28:360927デフォルトの名無しさん
2008/02/27(水) 15:34:26sprinf で \n を付けているのに str1, str2 には付いていないぞ
0928デフォルトの名無しさん
2008/02/27(水) 15:35:5546 名前:デフォルトの名無しさん[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>
0929デフォルトの名無しさん
2008/02/27(水) 15:42:57書式が違うんでしょうか_
buf="GET " + path + " HTTP/1.1\r\n\r\n";
n=send(sock, buf.c_str(), buf.size(), 0);
0930デフォルトの名無しさん
2008/02/27(水) 15:44:160931デフォルトの名無しさん
2008/02/27(水) 15:44:520932デフォルトの名無しさん
2008/02/27(水) 15:54:08GET /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);
0933デフォルトの名無しさん
2008/02/27(水) 15:58:540934デフォルトの名無しさん
2008/02/27(水) 16:01:240936デフォルトの名無しさん
2008/02/27(水) 16:06:31あと受け取るバッファを多くすると返却値を間違えるようなんです
どうやれば直りますか?
n = recv(sock, &buf[0], 128000, 0);
としてnまで表示するとデータ入ってないときがあります
0937デフォルトの名無しさん
2008/02/27(水) 17:05:30図書館で借りてきた本のページが抜けてて%cはどういう時に使うのか
わかりません;
%はぐぐれないみたいで困ってます。
0938デフォルトの名無しさん
2008/02/27(水) 17:08:24http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html
文字じゃね?
0940デフォルトの名無しさん
2008/02/27(水) 19:49:40send も recv も、指定したサイズ未満しか送受信できないことがあるので、
その場合にも対応すること。
あと、エラー処理もちゃんと毎回やること。
0941デフォルトの名無しさん
2008/02/27(水) 20:53:29初期化からやり直した方がいいですか?
データ位置を自前で判別して方がネットワークの負荷は少なくなりますが
0942デフォルトの名無しさん
2008/02/27(水) 20:55:33いったん全部読み込んで、ヘッダとデータを分離してサイズが不一致なら再送にします
0943デフォルトの名無しさん
2008/02/27(水) 20:56:50ポインタはメモリを格納しているアドレスの位置を指す
と言いますが、ではそのポインタの情報はどこに格納
されるのでしょうか?
0944デフォルトの名無しさん
2008/02/27(水) 21:01:14コンパイル時、&xという記述からどうやってxのアドレスを知るかと言うことなら、
それはコンパイラの仕事、コンパイラが決めること。
0945デフォルトの名無しさん
2008/02/27(水) 21:08:380946デフォルトの名無しさん
2008/02/27(水) 21:09:38(入ってるのアドレスだけじゃないですね)
0947デフォルトの名無しさん
2008/02/27(水) 21:11:45メンバポインタとかは別だが。
0948デフォルトの名無しさん
2008/02/27(水) 21:12:50xとyのデータを一致するようにできますか コピーではなくて
0949デフォルトの名無しさん
2008/02/27(水) 21:14:24&a=&b;のような事はできないですよね?
0950デフォルトの名無しさん
2008/02/27(水) 21:14:35という話ではなくて?
0951デフォルトの名無しさん
2008/02/27(水) 21:16:08参照にするしかないな。
string y = "*****", &x = y;
0952デフォルトの名無しさん
2008/02/27(水) 21:16:480953デフォルトの名無しさん
2008/02/27(水) 21:18:110954デフォルトの名無しさん
2008/02/27(水) 21:19:46アドレス演算子の結果は右辺値だと思った。
0955デフォルトの名無しさん
2008/02/27(水) 21:21:38int *ap = &a;
int *bp = &b;
ap = bp;
0956デフォルトの名無しさん
2008/02/27(水) 21:25:39何でそう言う事がしたいの?
0957デフォルトの名無しさん
2008/02/27(水) 21:36:280958デフォルトの名無しさん
2008/02/27(水) 21:38:060959デフォルトの名無しさん
2008/02/27(水) 21:40:37string x,y="...";
#define x y
0960デフォルトの名無しさん
2008/02/27(水) 21:43:17とした場合、最適化で x と y が同一視される可能性はあるんじゃないかな。
0961デフォルトの名無しさん
2008/02/27(水) 21:47:24変数のアドレスは、変数が確保されたときに固定されるものだろ。
「すでに確保された変数のアドレスを書き換えるテク」を期待する目的がわからん。
0962デフォルトの名無しさん
2008/02/27(水) 21:50:290963デフォルトの名無しさん
2008/02/27(水) 22:22:39class 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を指したままかわりません。
参照戻しではできたのですが、これで出来ない理由がわからず気持ち悪いです。
どなたか原因のご教授お願いします。
0964デフォルトの名無しさん
2008/02/27(水) 22:23:37vector<bool (*func)(int)> EroeroFunction;
↑<>の中のカッコが悪戯してうまくコンパイルが通らなくて困ってます。
構造体に関数ポインタを入れればなんとかなるんですが、メンバが1つしかないのでなんとも。
0965デフォルトの名無しさん
2008/02/27(水) 22:27:29どっちかつかえ。
< 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;
}
0966デフォルトの名無しさん
2008/02/27(水) 22:27:58get関数内でobj_s2を書き換えても、呼び出し側のobj_s2は書き換わらない。
関数に引数を渡す際の基本だろ?
ポインタを書き換えたいなら、ポインタをアドレス渡しでもすればいい。
void get( CSample2** ppobj_s2 ) { *ppobj_s2 = &m_obj_s2; }
obj_s1.get( &obj_s2 );
0967デフォルトの名無しさん
2008/02/27(水) 22:29:45vector<bool (*)(int)> じゃないの?
0968デフォルトの名無しさん
2008/02/27(水) 22:33:46そういう関数ありますか
0969デフォルトの名無しさん
2008/02/27(水) 22:34:45言ってる意味が分からない。
0970デフォルトの名無しさん
2008/02/27(水) 22:35:220971デフォルトの名無しさん
2008/02/27(水) 22:36:14std::copyとstd::back_inserterを組み合わせるんじゃねーの?
0972デフォルトの名無しさん
2008/02/27(水) 22:36:42こういうこと?
vector<char> v1, v2;
v1.insert(v1.end(), v2.begin(), v2.end()); // v1の末尾にv2の全要素を追加
0973デフォルトの名無しさん
2008/02/27(水) 22:37:22x={1,2,3}
y={4,5,6}
x.push_back(y)={1,2,3,4,5,6}
こういうやつです
0974デフォルトの名無しさん
2008/02/27(水) 22:39:200975デフォルトの名無しさん
2008/02/27(水) 22:41:490976デフォルトの名無しさん
2008/02/27(水) 22:42:56operator+=を外部に定義しておくと便利かも
0977デフォルトの名無しさん
2008/02/27(水) 22:47:040978デフォルトの名無しさん
2008/02/27(水) 23:07:18配列でポインタ表現を使ってアクセスしてインクリメントようと思って
*(array+i)++としたら'++'には左辺値が必要です、とエラーが出てきました
これは配列で宣言したからだと思うんですが
ポインタで宣言した場合は値が飛び飛びになるので、*(array+i)みたいな表現できないでしょうし
どうすればいいでしょう?
0979デフォルトの名無しさん
2008/02/27(水) 23:09:43++*(array+i);
変なことになったらとりあえず優先順位を疑うのは基本。
0980デフォルトの名無しさん
2008/02/27(水) 23:10:19*(array+i++) // iを増やす場合
0981デフォルトの名無しさん
2008/02/27(水) 23:11:350982デフォルトの名無しさん
2008/02/27(水) 23:12:23できました。ありがとうございます。
優先順位って今まで全然気にしてませんでしたので
今後注意して行こうと思いますorz
0983デフォルトの名無しさん
2008/02/27(水) 23:14:10それはともかく、array[i]++; と書けばいいのに
何でそうしないのか本気で理解できない。
0984デフォルトの名無しさん
2008/02/27(水) 23:27:310985デフォルトの名無しさん
2008/02/27(水) 23:30:030986デフォルトの名無しさん
2008/02/27(水) 23:39:05array++[i]; ←等価→ *((array++)+i) ←等価→ i[array++];
i++[array]; ←等価→ array[i++]; ←等価→ *(array+i++);
0987デフォルトの名無しさん
2008/02/27(水) 23:40:43誰だよこんな書き方見つけた奴……
0988デフォルトの名無しさん
2008/02/27(水) 23:43:59*(array+i) と *(i+array) が等価なのと同じく
array[i] と i[array] も等価だべ。
0989デフォルトの名無しさん
2008/02/27(水) 23:44:30で、誰?
0990デフォルトの名無しさん
2008/02/27(水) 23:45:420991デフォルトの名無しさん
2008/02/27(水) 23:45:54x+=y;
と
memcpy(&x[N],&y[0], y.size()); N+=y.size;
は同じのはず
yがバイナリデータだと上が失敗することが多いです
0992デフォルトの名無しさん
2008/02/27(水) 23:47:15すげぇwwww感動したwwwwwww
0993デフォルトの名無しさん
2008/02/27(水) 23:49:12x のメモリ確保はどこ行った。
0994デフォルトの名無しさん
2008/02/27(水) 23:50:050995デフォルトの名無しさん
2008/02/27(水) 23:50:49stringに文字列以外入れるなよ。
あと、x.capacity() >= y.size() でないとmemcpyがメモリ壊すぞ。
0996デフォルトの名無しさん
2008/02/27(水) 23:51:46同じというなら、同じになるコードを書けよ。
0997デフォルトの名無しさん
2008/02/27(水) 23:53:00できる理由は全然考えたことがなくて、今はじめて理解したw
0998デフォルトの名無しさん
2008/02/27(水) 23:53:19memcpyの方は書き出して復元できますが、+=はまれに正常でほとんど壊れます
原因はなんでしょう
0999デフォルトの名無しさん
2008/02/27(水) 23:55:24vectorを使わずstringを使ったから。
1000デフォルトの名無しさん
2008/02/27(水) 23:55:3210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。