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

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2007/09/25(火) 18:22:31
time.hのtm構造体についての質問です。
なぜtm_monは0〜11であり、
なぜtm_mdayは1〜31なのでしょうか。

どちらか一方にそろえる形で両方を0から起算、1から起算とするわけには
いかなかったのでしょうか。
953デフォルトの名無しさん:2007/09/25(火) 18:25:05
(´・ω・`)知らんがな
954デフォルトの名無しさん:2007/09/25(火) 18:29:53
K&Rにでも聞きにいってくれ。
955デフォルトの名無しさん:2007/09/25(火) 18:49:08
>>952
英語では月を 1, 2, ..., 12 と書くよりも January, February, ..., December のように書くので、
配列のインデックスとして直接使える方が良かった(例:↓)という説がある

const char *monthNames[12] = { "January", "February", ..., "December" };
printf("%s", monthNames[t.tm_mon]);

日は英語でも 1st, 2nd, ..., 31st のように書くので、1...31 そのままなんだろ、たぶん
956デフォルトの名無しさん:2007/09/25(火) 21:01:40
車輪の再発明と車輪がどういう仕組みかを理解する事は違う。
957デフォルトの名無しさん:2007/09/25(火) 21:33:23
誰もその車輪の性能を説明してくれない。車輪作った人ですらも。

挙句の果てに「使ってから文句家」「自分で分解して調べろ」だろ。
これじゃどうしようもない
958デフォルトの名無しさん:2007/09/25(火) 21:38:27
使い方の説明もいいかげんだから
ばらしながら使い方覚えないと駄目だしね
しかし教材として考えればなかなかいいかもしれん
膨大なMLにヒントは用意されているし
959デフォルトの名無しさん:2007/09/25(火) 22:31:51
replace_copy_if(v.begin(), v.end(), back_inserter(v2), bind2nd(ptr_fun(str_comp), "C"), "C++");

これ、Borland Turbo C++ だとコンパイルできない。
g++だとできる。

"C++"を string("C++")にするとTurbo C++はコンパイルできる。
単なる実装の違いということ?
960デフォルトの名無しさん:2007/09/25(火) 22:39:30
旧い実装のコンパイラなんか使うからだろ。
961デフォルトの名無しさん:2007/09/25(火) 22:43:16
>>960
コンパイラじゃなくてライブラリじゃないの?
962デフォルトの名無しさん:2007/09/25(火) 22:45:46
>>957
何を期待してるの?
どうしようもない。っていう意味には、
あなたのスキルが低いからという理由も含まれるんだよね?
少なくとも車輪を分解して調べられる。
これをメリットととるかデメリットととるかだな。
サポート期待するなら、商用製品買えばいい。
分解するのがめんどくさいなら、自分で作ればいい。
選択する自由は自分にあるだろ。
963デフォルトの名無しさん:2007/09/25(火) 22:49:22
ま、使いづらい・わかり辛いとかって時点で車輪じゃないんだろうな。
個人の技術レベルをあげるほうがのほうが先だろうけど。
964デフォルトの名無しさん:2007/09/26(水) 04:10:19
list<CHoge *>で持ってるメンバ変数を
const list<const CHoge * const> &の参照で返す関数を作りたいんですが
単純にキャストすると怒られます
どうすればいいんでしょうか

今は仕方ないので別にlist<const CHoge * const>を作ってコピーしてますが
const参照させるためだけに全く同じ内容のリストを作るのが嫌なんです
何とかならないでしょうか
965デフォルトの名無しさん:2007/09/26(水) 04:16:07
>>964
CHoge * と const CHoge * const はバイナリレベルで互換することが保証されて
いるので、 list 自体も const な参照ならキャストしちゃっても安全だと言えると思う。
コメント添えてキャストすればいいんじゃない?

ただし public なインターフェースであればメンバへの参照を返すのは実装を
固定することに繋がるのでお勧めしない。
966デフォルトの名無しさん:2007/09/26(水) 09:17:36
>>962
仕様書くらい用意しろボケ
という話です
967デフォルトの名無しさん:2007/09/26(水) 09:30:42
用意終わた
いえーい!
968デフォルトの名無しさん:2007/09/26(水) 16:54:45
>>955
なるほどthx、ちょうど友人と配列に英語での名前取った時に都合がいいんじゃ
ないかって議論もしてました。
969デフォルトの名無しさん:2007/09/26(水) 17:17:33
>>968
なるほどthx、ちょうど友人と配列に英語での名前取った時に都合がいいんじゃ
ないかって議論もしてるんじゃないかって議論もしてました。
970デフォルトの名無しさん:2007/09/26(水) 20:28:09
 int data[10] ={10,20,30,40,50,60,70,80,-999} このようなint配列があります       配列の内容を実行結果のように表示するプログラムを作りなさい         -999になれば処理を終了します 
 ポインタを固定して表示させる処理とポインタを変化させて表示させる処理の2つ作成しなさい 
 この内容がわからないので教えて下さいお願い致します
971デフォルトの名無しさん:2007/09/26(水) 20:33:27
>>970
マルチポスト死ね
972デフォルトの名無しさん:2007/09/26(水) 20:55:35
命令形で問われても答える気になれない
973デフォルトの名無しさん:2007/09/26(水) 20:59:40
実行結果のようにとか言っておきながらないし
974デフォルトの名無しさん:2007/09/26(水) 21:02:35
>>970
>配列の内容を実行結果のように表示する

実行結果がわからんから答えられないなあ

要は添え字で処理するかポインタで処理するかということか?
添え字なら data[i] で扱って i を変えてく
ポインタなら
int *p = data; pを順番に進めていけばいいんでないか?
975デフォルトの名無しさん:2007/09/26(水) 21:05:54
しかし実際はどちらもポインタ演算という…
976デフォルトの名無しさん:2007/09/26(水) 21:21:46
[1] 授業単元: 教科書
[2] OS Windows
[3]問題
int data[10] ={5,8,10,2,1,14,35,6,12}:
配列中の最大値と最小値を表示するプログラムをポインタを使用して作成するプログラムが解らないので教えて貰えませんか?
977デフォルトの名無しさん:2007/09/26(水) 21:39:09
宿題スレへ池
978デフォルトの名無しさん:2007/09/26(水) 22:48:23
max_element
min_element
979デフォルトの名無しさん:2007/09/26(水) 23:22:39
int a[0] = {10};
int a = 10;
って実質的に同じ?
980デフォルトの名無しさん:2007/09/26(水) 23:23:30
>>979
全然違う
981デフォルトの名無しさん:2007/09/26(水) 23:25:43
int a[0] = {10};
int b = 10;

*(a + 0) == a[0] == b
982デフォルトの名無しさん:2007/09/27(木) 00:22:25
ん?int a[0]ってコンパイル通るのか?
983デフォルトの名無しさん:2007/09/27(木) 01:11:21
>>982
蟹炒飯を読むと、問題ないと書いてある
984デフォルトの名無しさん:2007/09/27(木) 02:15:10
蟹炒飯をググってみたがさっぱりわからんかった。
そしてコンパイルは通らなかった。(VSEE 2008)
C99からの仕様?俺の無知?だんだん不安になってきた・・・
985デフォルトの名無しさん:2007/09/27(木) 02:21:40
struct TEST
{
DWORD dammy ;
BYTE x ;
DWORD dammy2;
BYTE y;
};

TEST Test ;
ZeroMemory(&Test, sizeof(TEST)) ;
Test.x = 0xAA ;
Test.y = 0xBB ;

脳内結果予想
00 00 00 00 AA 00 00 00 00 BB

現実
00 00 00 00 AA 00 00 00 00 00 00 00 BB 00 00 00

なんです?
986985:2007/09/27(木) 02:23:54
途中で送信してしまいました><
なんでこういう結果になるのかわからないです。よろしくお願いします。
987デフォルトの名無しさん:2007/09/27(木) 02:25:23
>>986
DWORDが4バイト境界に配置されたため。
988デフォルトの名無しさん:2007/09/27(木) 02:26:24
しかも説明が抜けてる。il||li(つω-`。)il||li
バイナリはファイルに保存したときに思い通りにならないって話です
989デフォルトの名無しさん:2007/09/27(木) 02:34:14
>>986
アライメント、パディング、構造体とかでぐぐれば幸せになれるよ。
990デフォルトの名無しさん:2007/09/27(木) 02:47:12
>>987,>>989
( ・∀・)わかった!ありがと〜
991デフォルトの名無しさん:2007/09/27(木) 11:08:00
*char[] = {"hoge","hage","boke"}

こういう初期化を std::string 使って表現出来ないのでしょうか?
992デフォルトの名無しさん:2007/09/27(木) 11:20:06
std::string *Bjarne_Stroustrup[] = {new std::string("hage"), new std::string("hage"), new std::string("hage")} ;
993デフォルトの名無しさん:2007/09/27(木) 11:27:27
>>992
newする意味はあるのか…
994デフォルトの名無しさん:2007/09/27(木) 11:39:57
995デフォルトの名無しさん:2007/09/27(木) 11:50:57
vs2005を使ってるんですが、グローバルな関数の関数ポインタと
クラスのメンバ関数の関数ポインタを統一的に保持しておきたいです。
(どんな自作クラスのメンバにでも対応したい)
実現する方法があれば書き方を具体的に教えてください。

class CFuncHolder{
private:
void (*m_pFunc)(char*);
public:
CFuncHolder(){};
void SetFunc(void (*pfunc)(char*)){m_pFunc = pfunc;}
void RunFunc(char* str){m_pFunc(str);}
};

void gfunc(char* str){
MessageBox(NULL,str,"",NULL);
}

class cfunc{
public:  
void func(char* str){MessageBox(NULL,str,"",NULL);}
void (cfunc::*GetFuncPtr())(char*){return &cfunc::func;}
};

void main(){
CFuncHolder fh;
fh.SetFunc(gfunc);
fh.RunFunc("hohoho");
//cfunc cf;
//fh.SetFunc(cf.GetFuncPtr());
}
996デフォルトの名無しさん:2007/09/27(木) 11:56:12
そんなあなたに boost::function
997デフォルトの名無しさん:2007/09/27(木) 12:43:20
>>996
ども。保持する方は、
class CFuncHolder{
private:
boost::function1<void, char*> m_func;
public:
CFuncHolder(){};
void SetFunc(void (*pfunc)(char*)){m_func = pfunc;}
void RunFunc(char* str){m_func(str);}
};
とかでいいんですよね?
で、渡す方は、boost::bindとやらが使えるっぽいのですが、書き方がさっぱり分かりません。
void gfunc(char* str){
MessageBox(NULL,str,"",NULL);
}
class cfunc{
public:
void func(char* str){MessageBox(NULL,str,"",NULL);}
void (cfunc::*GetFuncPtr())(char*){return &cfunc::func;}
};

void main(){
CFuncHolder fh;
//グローバルの関数ポインタを渡す
fh.SetFunc(gfunc);
fh.RunFunc("hohoho");
//クラスメンバの関数ポインタを渡す
cfunc cf;
//fh.SetFunc( boost::bind(/*?????*/) );←ここの書き方教えてください。
fh.RunFunc("hehehe");
}
998デフォルトの名無しさん:2007/09/27(木) 12:55:30
boost::bind(&cfunc::func, cf, _1);
999デフォルトの名無しさん:2007/09/27(木) 12:58:20
ごめん↑のは多分動かない
1000デフォルトの名無しさん:2007/09/27(木) 12:59:39
そして伝説へ・・・
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。