【初心者歓迎】C/C++室 Ver.9【環境依存OK】
>>990 >処でこの問題の場合、「手」をクラス化しました。
>しかし、コンピュータの手とオペレータの手を纏めてしまったために
>オペレータ同士の対戦にしたりコンピュータ同士の対戦にすることができません。
>このような改修に耐えられるように手はそれぞれ独立したオブジェクトとして扱えた方が面白いでしょうね。
言われたとおりに、それぞれの「手」を独立した形にしてみました。
が、やっぱりどうもゴチャゴチャしている様な気がします。。。
宜しければマズイ箇所などがあればご指摘の程をお願いします。
enum mode{ player_vs_comp = 0, player_vs_player = 1, comp_vs_comp = 2, };
enum judge{ win2 = 0, win1 = 1, even = 2, };
class cte{
protected:
int m_type;
bool m_playertype;
public:
void select(void){
if(m_playertype){
cout << "player select ";
m_type = getch() - 0x31; if(m_type > 2){ m_type = 2; }
cout << endl;
}else{
cout << "comp select " << endl;
m_type = rand() % 3;
}
}
int type(void){ return m_type; }
void playertype(bool playertype){ m_playertype = playertype; }
cte(){ m_type = 0; }
~cte(){}
};
class cjanken{
protected:
string m_typestr[3];
judge m_judgelst[3][3];
public:
void mode(cte &te1, cte &te2){
switch(getch() - 0x31){
case player_vs_comp: te1.playertype(true); te2.playertype(false); break;
case player_vs_player: te1.playertype(true); te2.playertype(true); break;
case comp_vs_comp: te1.playertype(false); te2.playertype(false); break;
}
}
void select(cte &te1, cte &te2){
te1.select();
te2.select();
}
void show(cte &te1, cte te2){ cout << m_typestr[te1.type()] << " vs " << m_typestr[te2.type()] << endl; }
judge check(cte &te1, cte &te2){ return m_judgelst[te1.type()][te2.type()]; }
cjanken(){
srand((unsigned int)time(NULL));
m_typestr[0] = "グー"; m_typestr[1] = "チョキ"; m_typestr[2] = "パー";
m_judgelst[1][2] = m_judgelst[2][0] = m_judgelst[0][1] = win1;
m_judgelst[0][0] = m_judgelst[1][1] = m_judgelst[2][2] = even;
m_judgelst[2][1] = m_judgelst[0][2] = m_judgelst[1][0] = win2;
}
~cjanken(){};
};
int main(void)
{
bool flag = true;
cjanken janken;
cte te[2];
cout << "1 = player vs comp, 2 = player vs player, 3 = comp vs comp\n" << endl;
janken.mode(te[0], te[1]);
cout << "グー = 1, チョキ = 2, パー = 3" << "\n" << endl;
while(1){
cout << "ジャンケン... " << endl;
janken.select(te[0], te[1]);
cout << "ポン !" << endl;
janken.show(te[0], te[1]);
switch(janken.check(te[0], te[1])){
case win2: cout << "win2!\n" << endl; break;
case win1: cout << "win1!\n" << endl; break;
case even: cout << "even\n" << endl; break;
}
cout << "retry? y/n";
if(getch() != 'y'){ break; }
cout << "\n" << endl;
}
return 0;
}
>>8 class JankenHand {
public:
enum Mode { MANUAL, AUTO };
enum Te { GU, TYOKI, PA, RANDOM };
enum Judgement { WIN_1, WIN_2, EVEN };
static Judgement Judge(const JankenHand& player_1, const JankenHand& player_2) {
Te t1 = player_1.get(), t2 = player_2.get();
if( t1==t2 ) return EVEN;
else if( (t1 == GU && t2 == TYOKI) || (t1 == TYOKI && t2 == PA) || (t1 == PA && t2 == GU) ) return WIN_1;
else return WIN_2;
}
JankenHand(Mode mode = AUTO) : mode_(mode), te_(GU) { srand((unsigned int)time(NULL)); }
void select() {
if( mode_ == AUTO )
te_ = static_cast<Te>(rand() % 3);
else {
cout << "ジャンケン... " << endl;
te_ = static_cast<Te>(getch() - '1');
}
}
Te get() const { return te_; }
const char* show() const {
static char* str[] = {"グー", "チョキ", "パー"};
return str[te_];
}
private:
Mode mode_;
Te te_;
};
int main(int argc, char* argv[])
{
cout << "1 = player vs comp, 2 = player vs player, 3 = comp vs comp\n" << endl;
int mode = getch() - '0';
JankenHand p1(mode == 3 ? JankenHand::AUTO : JankenHand::MANUAL),
p2(mode == 2 ? JankenHand::MANUAL : JankenHand::AUTO);
cout << "グー = 1, チョキ = 2, パー = 3" << "\n" << endl;
for(;;) {
p1.select(); p2.select();
cout << "ポン !" << endl;
cout << "player_1=" << p1.show() << " player_2=" << p2.show() << endl;
switch( JankenHand::Judge(p1, p2) ) {
case JankenHand::WIN_1: cout << "win1!\n" << endl; break;
case JankenHand::WIN_2: cout << "win2!\n" << endl; break;
case JankenHand::EVEN: cout << "even\n" << endl; break;
}
cout << "retry? y/n";
if( getch() != 'y') break;
cout << "\n" << endl;
}
return 0;
}
12 :
デフォルトの名無しさん:04/09/07 13:40
>>10 おれだったらこんな感じ
#include <iostream>
#include <map>
#include <string>
using namespace std;
void Play(int l, int r)
{
enum janken{ goo = 0, choki, pahh};
static map<int,string> gjmap;
gjmap[goo] = "ぐー";
gjmap[choki] = "ちょき";
gjmap[pahh] = "ぱー";
enum judge{ lose=0, win, even };
static int judge_map[3][3] = {{even,win,lose},{lose,even,win},{win,lose,even} };
switch(judge_map[l][r])
{
case win:
cout<<gjmap[l]; break;
case lose:
cout<<gjmap[r]; break;
case even:
cout<<"Draw"<<endl; return;
}
cout<<" winner"<<endl;
}
13 :
デフォルトの名無しさん:04/09/07 13:40
>>続き
int main()
{
int r,l;
cout << "グー = 0, チョキ = 1, パー = 2" << "\n" << endl;
while(cin>>r>>l)
if(r>=0 && r<3 && l>=0 && l<3) Play(r,l);
else cout<<"なめきっとのかーコラー。お前、ひん剥いて、写真とって校内に晒すぞ!"<<endl;
return 0;
}
14 :
デフォルトの名無しさん:04/09/07 13:42
gjmapのgは気にしないでくれ
15 :
デフォルトの名無しさん:04/09/07 15:28
strA[128][256];
strB[128][256];
という二つの文字列配列があるとして、
strAのLA列目のNA文字目を
strBのLB列目のNB文字目にコピーするにはどうしたらいいですか?
すいません、書き忘れましたが普通のcharの文字列です。
17 :
デフォルトの名無しさん:04/09/07 16:04
strB[LB][NB]=strA[LA][NA];
>>19 コンパイラによってはサポートしてたりします.
g++とか.検索してたら,どうやらVC++もそうなのかな?
21 :
前スレ976:04/09/07 19:58
おおっ、色々コードをどうもです。
>>9 ずいぶんスッキリしましたね。
手のチェックメソッド(この場合judge())を手自体のstaticメソッドにしてるんですか。
ハッキリ言って僕のcjankenクラスは不要でしたね。。。
>>12 今回はそれぞれの「手」を独立したオブジェクトにしてのプログラムという事だったので。。。
でも、mapを使うのはより象徴的になってよさげですね。
やはり、人の書いたコードを見るのは勉強になります。
色々なご意見ありがとうございました。
>>20 ありがとうございます。
VC++がサポートしているかもというのは、うれしい情報です。
Spokeを買えるお年頃なので、買ってみようかなと考えていたところです。
stlのvectorで vector< vector< int > >のように二次元配列として使用しています。
この配列の全要素に一括で同一の値を代入することってできますか?
今のところ、ループを回して逐次代入しているのですが。
>>23 #include <vector>
#include <algorithm>
void fill( std::vector< std::vector< int > >& v , int value )
{
std::fill( v[0].begin() , v[0].end() , value );
std::fill( v.begin() + 1 , v.end() , v[0] );
}
前提として
・!v.empty()
・v[0]〜v[v.size()-1] の全ての size() が v[0].size() と同じ(または処理後同じになってもいい)
ということが必要。
v.begin()〜v.end() のループを自前で回すと、
パフォーマンスを上げることができるかも知れない。
25 :
デフォルトの名無しさん:04/09/07 23:46
Cの標準関数で文字列の差分を取得するにはどうしたらいいでしょうか。
例えばabcdefgとabcdを比較したらefgと帰ってくるようにしたいです。
もしくは、PHPでいうところのsubstrのような
文字列の〜文字目から〜文字目までを返すような関数ってないでしょうか。
std::string::substr
std使わないで何とかなりませんでしょうか…
>v[0]〜v[v.size()-1] の全ての size() が v[0].size() と同じ(
n×mの単純な長方形的になっていれば良いということですね。問題ありません。
>v.begin()〜v.end() のループを自前で回すと、
>パフォーマンスを上げることができるかも知れない。
明日試してみます。
ありがとうございました。
28=23
>>25 char s1[] = "abcdefg", s2[] = "abcd";
printf("%s\n", strstr(s1, s2) + strlen(s2));
>>31 こういう事なんじゃないの?
char* delstr(char *s1, char *s2, char *buf)
{
strcpy(buf, s1);
*strstr(buf, s2) = '\0';
return strcat(buf, strstr(s1, s2) + strlen(s2));
}
int main(void)
{
char s1[] = "abcdefg", s2[] = "abc", s3[] = "bcd", s4[] = "efg";
char buf[8];
printf("%s\n", delstr(s1, s2, buf));
printf("%s\n", delstr(s1, s3, buf));
printf("%s\n", delstr(s1, s4, buf));
return 0;
}
34 :
デフォルトの名無しさん :04/09/08 15:13
char buff[256];buff[0]='\0'
sprintf(buff,"%s","こんabcにdefgちはhi");
と定義された文字列があるとして、これを
char ln[256][256];
という文字配列に、nバイト以下ずつぎりぎりまで
詰め込んでいきたいのですがどうすればいいでしょうか。
例えば4バイトずつ詰め込むとしたら、
:
:
ln[5]'\0'
ln[4]こん'\0'
ln[3]abc'\0'
ln[2]にde'\0'
ln[1]ちは'\0'
ln[0]hi'\0'
という風になるようにしたいです。
まずln[0]に詰め込んでいき、4バイト分の「こん」まで入れたところで
まだbuffは続きがあるのでln[0]はln[1]に繰り上げます。
こんどはln[0]にabc・・と入れていき、「に」も入れたいところですが
2バイトなので次に持ち越すことにして、また繰り上げ、、、
というようにbuffを全部詰め込むまで続けたいです。
35 :
デフォルトの名無しさん:04/09/08 16:33
>>34 なんか質問文が矛盾しまくってるのは気のせいか?
>>36 どのへんでしょうか?
何バイト分詰め込みたいかは状況によって変わるので、
nバイト分ということで汎用性を持たせて組みたいのです。
文字列や文字列配列の容量は余裕を持たせていますが、
文字列配列の方は、列数が足りない場合
自動的に増減させたいのですが、そういう組み方が分かりません。。。
最後の5行は、こんな感じでやればいいのかなぁ・・・
とは思って書いたのですが、もっと効率の良い方法があるのかもしれません。
どうかよろしくお願いします。
すまん勘違いしてたみたい。
>まだbuffは続きがあるのでln[0]はln[1]に繰り上げます。
繰り上げるって後ろにずらす事だと今気付いた。
>char ln[256][256];
C++ならstd::list<std::string>でpush_frontしていく方がいいんじゃね?
2バイト文字を考慮したコピーはこんな感じ。
void copyn(const char* src, char* dest, int n)
{
std::copy(src, src+n, dest);
if( isleadbyte((unsigned int)src[n-1]) )
dest[n-1] = '\0';
}
ちょい修正
int copyn(const char* src, char* dest, int n)
{
std::copy(src, src+n, dest);
if( isleadbyte((unsigned int)src[n-1]) )
dest[--n] = '\0';
return n; // コピーしたバイト数
}
どうもです。小出し小出しで申し訳ないのですが、
一応Cの標準の関数だけでやりたいのです。
stl使ってないので他の部分が動かなくなりそうです。
何とか自己解決できました。レスいただけた方、ありがとうございました。
度々すいません。
文字列を一文字ずつ走査し、全角か半角かを判別する処理を作っています。
IsDBCSLeadByteを使うと、ひらがなや全角アルファベット大文字は
問題なく全角として判定できているようなのですが、
漢字や全角アルファベット小文字などがうまく判定できていないようです。
isleadbyteを使った場合は、unsignedにキャストしてますが
全て0が帰ってきてしまいます。
単純にコーディングミスの可能性もあるかもしれませんが、
何かうまく判定する方法があったら教えて下さい。
よろしくお願いします。
>>43 なんのコンパイラ使ってるのか知らんけど、
VC++ならこんな関数があるよ。
_ismbbkana()
>>44 どうもです。判定する文字列は半角全角問わず、
ひらがなカタカナローマ字など色々入っている可能性があって、
最終的には全角か半角かができればいいです。
_ismbbkanaは半角カタカナを判定できるみたいですが、
それ以外のものも一括で判定したいです。
_ismbbleadというのも発見したのですが、
IsDBCSLeadByteと同じ結果しか得られませんでした…
>>45 マジですか。でもコーディングミスだったら
こんなに規則的にならないような気がするんですよね。
並び順とか関係なく必ず全角小文字ローマ字のところは
変になってるみたいです。漢字はものによってって感じです。
ひらがなは絶対成功してるようです。
何が違うのかちょっと謎なんですが、もうちょっと検証してみます。
すいません、書き忘れましたが環境はVC++6.0とW2kです。
>>46 assert(::IsDBCSLeadByte(*"a"));
...
assert(::IsDBCSLeadByte(*"z"));
アサーションに掛からないよ?
うちの環境 VC++6.0sp6 WinXPsp1
では、以下のコードで「multi byte string」とちゃんと表示される。
#include <iostream>
#include <mbstring.h>
int main(void)
{
char str[] = "c";
if(_ismbblead(str[0])){ cout << "multi byte string" << endl; }
return 0;
}
VC6+2kSP4
VC7.1+XPSP1
で試した。
>>48 わざわざすいません。ありがとうございます。
なんとなく原因が判明しました。
カウンタを進める処理に間違いがあったみたいで、
判定関数に全角文字の2バイト目を入れてしまった場合に
ひらがななどは0が帰ってくるのですが
全角ローマ字小文字などの今までうまくいっていなかった文字では
1が帰ってきていました。
そのため不具合が起きていたようです。
お騒がせしました。ありがとうございました。
52 :
デフォルトの名無しさん:04/09/09 15:00
はじめまして,初めて書き込みします。現在,時間を読み取る精度として
1msの物を必要としています。time.hでは精度が悪く50msしかとれず,
マルチメディアタイマーを使用しようとしてもうまくいきません。
環境はBorland C++ を使用しています。
もしなにかいい方法を知っている方がいたら教えていただきたいのですが。
timeBeginPeriod(1);
timeEndPeriod(1);
の間でマルチメディアタイマーを使えば良い。
あとはQueryPerformanceCounterとかCライブラリのclockとかかな?
vectorの要素のコピー教えて下さいでつ。
std::copy
>>52 windows.hにGetTickCount、timeGetTimeがあるけど、
それでも10ミリ秒ぐらいかな。1ミリ秒は難しいかも。
>>43 setlocaleでデフォルトの"C"から変更していないとisleadbyteは常に0を返すよ。
初心者プログラマなんですが、C++勉強しています。
C++を使ってゲームを作ろうと思っているのですが、DirectXで苦労しています。
正直、ライブラリを自分で作るだけの能力が今はないので、
他で公開されているライブラリを利用して作ろうと思っています。
そこで、お勧めのライブラリがありましたら紹介していただきたいです。
よろしくお願いします。
//テキストの表示
HDC hdc;
LPTSTR lptStr = TEXT("111");
hdc = GetDC(hWnd);
TextOut(hdc , 0 , 0 , lptStr , lstrlen(lptStr));
ReleaseDC(hWnd , hdc);
これだと111が表示されるのですが
変数Aの内容を表示させたい時はどうすればいいのでしょうか?
VC++.netです
>>62 sprintfや_stprintfかwsprintfを使って
>>61をどのように変更すればよいのでしょうか?
こういう奴って周りに迷惑しかかけない
変数Aの内容を表示って16 進ダンプでいいのか?
そもそも変数Aの型ってなんなんだろうな?
67 :
デフォルトの名無しさん:04/09/10 16:00:32
68 :
デフォルトの名無しさん:04/09/10 16:11:57
Cヒストグラムを作るプログラムが完成しません。お願いします。1000 以下の素数が格納されているデータファイル prm1000.dat を読み込み素数の度数分布表を作成したいと思っています。作ったプログラムが下にあるものです。
#include <stdio.h>
#define N 50
int main( int argc, char *argv[] ) {
FILE *fp;
char *datafile;
int i, j, width, prime, count[N];
/* error*/
if ( argc != 2 ) { printf( "error : Invalid Usage\n" );
exit( 1 );}
datafile = argv[1];
if ( ( fp = fopen( datafile, "r" ) ) == NULL ) {
printf( "error : can't open %s\n", datafile );
exit( 1 );}
/* initialize*/
for ( i = 0; i < N; i++ ) count[i] = 0;
printf( "Enter the width => " );
scanf( "%d", &width );
/* read and count*/
j = 1;
while ( fscanf( fp, "%d", &prime ) != EOF ){ if ( prime < width * j )
count[j]++;
else
count[++j]++;}
fclose( fp );
putchar( '\n' );
for ( i = 1; i <= j; i++ )
printf( "%5d 〜 %5d : %3d\n", width*(i-1), width*i-1, count[i] );
exit(0); }
作ったプログラムをコンパイル実行するとerror : Invalid Usageと出てしまいます。
このプログラムのどこに何を足したら完成できるか教えてください。お願いします
70 :
デフォルトの名無しさん:04/09/10 16:57:13
文字列の長さを指定して出力するC++流の方法ってあるんでしょうか?
char str = "jpnkor";
printf("%.3s\n", str); //こんなんのC++流
std::cout << std::setw(3) << str << std::endl; //うまくいかない
>>70 boost使っていいなら
#include <iostream>
#include <boost/format.hpp>
int main () {
char *str = "jpnkor";
std::cout << boost::format ("%.3s") % str << std::endl;
return 0;
}
72 :
デフォルトの名無しさん:04/09/10 18:23:43
>>71 ってことは標準ではそんな都合のいいものは無いのか
レスdクス
>>63 HDC hdc = GetDC(hWnd);
TCHAR szBuf[32];
wsprintf(szBuf, "%d", a);
TextOut(hdc, 0, 0, szBuf, lstrlen(szBuf));
ReleaseDC(hWnd , hdc);
>>59-60 遅レスですが、ありがとうございます。
一通り検索してみます。
>>70 std::string::substr() じゃだめ?
>>73 レスありがとうございます
早速試してみます
>>75 レスthx。stringクラスなら切り出しができるんですね
やっぱchar配列はむりぽ(´・ω・`)
printf群使いまつ
78 :
errno84??:04/09/11 02:36:20
gccで日本語を表示するとerrnoが84になってしまうのはなぜですか?
また最適化オプションで回避してもprintfの戻り値をとるとerrno=84と
なってしまうのはどうしてなんでしょう。。。環境が間違っているのでしょうか?
////////// err84.c //////////
#include <stdio.h>
#include <errno.h>
int main()
{
int ret;
errno = 0;
printf("errno test1\n");
printf("%d => %s\n", errno, strerror(errno));
errno = 0;
printf("errno test2\n");
printf("%d => %s\n", errno, strerror(errno));
errno = 0;
printf("日本語で出力test\n");
printf("%d => %s\n", errno, strerror(errno));
errno = 0;
ret = printf("retval test1\n");
printf("%d => %s\n", errno, strerror(errno));
errno = 0;
ret = printf("retval test2\n");
printf("%d => %s\n", errno, strerror(errno));
errno = 0;
ret = printf("retval 日本語で出力 test\n");
printf("%d => %s\n", errno, strerror(errno));
return 0;
}
79 :
errno84??:04/09/11 02:39:40
コンパイル方法
$ gcc err84.c -o t0 -O0
$ gcc err84.c -o t1 -O1
$ gcc err84.c -o t2 -O2
$ gcc err84.c -o t3 -O3
t0実行
errno test1
0 => Success
errno test2
0 => Success
日本語で出力test
84 => Invalid or incomplete multibyte or wide character
retval test1
0 => Success
retval test2
0 => Success
retval 日本語で出力 test
84 => Invalid or incomplete multibyte or wide character
80 :
errno84??:04/09/11 02:40:05
t1実行
errno test1
0 => Success
errno test2
0 => Success
日本語で出力test
0 => Success
retval test1
0 => Success
retval test2
0 => Success
retval 日本語で出力 test
84 => Invalid or incomplete multibyte or wide character
///////////////////////////////
t2,t3はt1と同じ結果なので省略。
>>78 gcc (GCC) 3.4.1 (cygming special) で実行してみたけど、全部 0 => No error になった。
というわけで環境きぼん。
EUCやSJISやUNICODEとかの環境もな・・・
ボキ gcc 3.3.4 で、euc-jp で
>>78 と同じ結果。参考までに
gcc先生のご意見:
nnn.c:8: 警告: implicit declaration of function 'strerror'
nnn.c:8: 警告: format '%s' expects type 'char *', but argument 3 has type 'int'
icc先生のご意見:
nnn.c(8): remark #981: operands are evaluated in unspecified order
printf("%d => %s\n", errno, strerror(errno));
>>84 上(gcc)は #include <string.h> すると黙る
86 :
デフォルトの名無しさん:04/09/11 08:08:23
GetCursorPosではマウスカーソルのスクリーン全体での座標が得られるんですが
ウインドウ内での座標(ウインドウの一番左上の座標を(0,0)とした座標)
を得るにはどうすればいいのでしょうか?
ScreenToClient()
88 :
デフォルトの名無しさん:04/09/11 08:29:58
>>87 レスありがとうございます
ScreenToClient() を検索してみましたが使い方いまいちわかりませんでした
GetCursorPosで得たスクリーン座標をウインドの座標に変換する時は
そのように使えばいいのでしょうか?
POINT pos;
GetCursorPos(&pos);
ScreenToClient(hWnd, &pos);
djgpp(gcc) ver2.7.1 で 10行程度の Hello,World をコンパイルしたら
実行ファイルが500kbにもなったんですが、もっとファイルサイズを抑えられませんか
strip したら
93 :
デフォルトの名無しさん:04/09/11 13:29:24
>>90 お返事ありがとうございました
おかげさまでちゃんとできました
ヘッダファイル削ったら?
95 :
errno84??:04/09/11 14:10:05
78です。
環境を書き忘れていました。すいません。
gcc (GCC) 3.2.3
ja_JP.eucJP
となっております。
96 :
デフォルトの名無しさん:04/09/11 18:27:54
21÷5=4余り1ですが
この商の4の部分だけが欲しい場合どうすればいいのでしょうか
21/5
98 :
デフォルトの名無しさん:04/09/11 18:36:12
>>97 れすありがとうございます
21/5=4.2にならないのでしょうか
4の部分だけが欲しいんです
だいじょうぶ
>>98 21/5だっつってんだから試すなりしろよ。
あと入門書嫁
newを使わずに、仮想関数テーブルをセットする方法はありますか?
独自のalloc関数で確保したメモリにクラスを割り当てたいのですが、
newかローカル宣言するしか仮想関数テーブルをセットする方法が
ないみたいで、今はこうやっています。
{
//newでないので、この時点ではテーブルがセットされない。
ClassA* a = my_alloc();
//ローカル宣言したオブジェクトをコピーすることでテーブルをセットする・・・
ClassA temp_a;
memcpy(a, &a, sizeof(a));
}
グローバルnewをオーバーロードするという手もありますが、大掛かりに
なってしまうので、仮想関数テーブル「だけ」をセットする
やり方があればご教授ください。
>>103 memcpy(a, &a, sizeof(a)) → memcpy(a, &temp_a, sizeof(a))
でした。
データコンバートプログラムをCで作っているのですが、
困った問題にぶつかってしまいました。
Mac OS X 10.2.8
cc (GCC) 3.1 20020420 (prerelease)
において、
fopen: Too many open files
というエラーが出ております。
正確に計算したわけではありませんが概ね1000ファイルを開いた当たりでエラーが出ているようです。
同じプログラムをcygwinで動かしていますが、今のところ問題はないようです。
念のため、cygwinでもたくさんのファイルを開いた場合どうなるかをただいまテスト中です。
質問としては、
このエラーはfcloseでファイルポインタを閉じていてもそのプログラム中
でfopenが開けるMAXファイルポインタ数というものは決まっているのでしょうか?
それとも、単にどこかでfcloseの忘れがあるのでしょうか?
#fopenで開いたファイルがちゃんとfcloseで閉じているかは確認済みなのですが...
よろしくお願いします。
>103
placement newじゃ駄目なの?
std::get_temporary_buffer
std::uninitialized_fill
>>106様
ありがとうございました。
プログラムのバグではないようなので安心しました。
>>110 1000ファイル同時に開くなんて,ものすごいプログラムですね.
112 :
デフォルトの名無しさん:04/09/11 19:39:17
スクリーン座標(x、y)をScreenToClientを使ってクライアント座標に変換するには
どのようにすればいいのですか?
>>111 そうか?socketだと大量に使うぞ?
116 :
デフォルトの名無しさん:04/09/11 19:46:49
>>114 90 名前:デフォルトの名無しさん[sage] 投稿日:04/09/11 09:01:48
POINT pos;
GetCursorPos(&pos);
ScreenToClient(hWnd, &pos);
のどこをどう変更したらいいのかわかりません
>>111 同時じゃありません。
開いて閉じての繰り返しです。
>>117 すみません.106はハズしてますね.
以下のコードでどうですか? 因みにうちのgcc 3.3.4 on Linux 2.4.26だと大丈夫です.
#include <stdio.h>
#include <stdlib.h>
const size_t SIZE = 100000;
int main () {
size_t i;
for (i = 0; i < SIZE; ++ i) {
FILE *f = fopen ("test.dat", "w");
if (f == NULL) {
printf ("0\n");
exit (1);
}
if (fclose (f) == EOF) {
printf ("1\n");
exit (1);
}
}
return 0;
}
>>107 クラスのアロケートを複数の方法から、動的に選択したいという都合があって。
グローバルnewの中でフックさせるしかないかなぁ。。
void* (*alloc_func)(size_t size);
void* operator new(size_t size)
{
return (*alloc_func)(size);
}
void set_alloc_func(void* (*newfunc)())
{
alloc_func = newfunc;
}
こんな感じかね。
>>109 配列を使う場合に使えるのかな?見てみますーthx.
>>116 真面目に言ってる?
まず POINT の意味を調べてみれ。
それで分からなかったら知らん。
>>117 因みに
gcc 3.1 20020420 on Darwin Kernel Version 6.8
でもエラーは出ません.
ひょっとして閉め忘れてませんか?
>>120 早速調べてみます
ありがとうございました
>>121様
サンプルプログラムありがとうございます。
問題なく動作しました。
やはりプログラムに問題がありそうですね。
閉じ忘れも確認しましたが、大丈夫だと思います。
データの書き出しは他の汎用ライブラリに任せているので、そのライブラリの問題かもしれませんが
まだ、きり分けができておりません。
とりあえず、テストファイルを開くだけのプログラムを作成してみます。
例えば、
CHoge hage;
printf("%s\n", hage);
のように記述してCHogeクラス中で持っている文字列を
printf()に渡して表示させることって可能でせうか?
キャストを使わないで記述したいです
>>124 できません。
prinf("%s\n", hage.getStr());
のようにするのが通常です。
getStr()は内部で持っている文字列を返すメソッド
>>124 class CHoge {
char *lpString;
};
lpString が CHoge の最初のメンバでなきゃだめだし、
他のクラスを継承していてもだめだ。
とてもじゃないがお勧めできない。
コンパイラにも依存する…?
>>124 持っている文字列をかえす関数をCHogeに装備。
va_listの仕組みを良く理解していないので、
...に渡した変数がどういう型として扱われるのかが判れば
operator定義でなんとかならんかなぁとか思ったんですが、
やっぱむりぽ?
>>129 この場合は va_list の仕組みというより printf の仕組みでしょ。
%s だから文字列ポインタとみなす、という。
>>124 こんなかんじ?
#include <stdio.h>
class CHoge {
public:
CHoge(){}
~CHoge(){}
void setStr(char* str) {
m_str = str;
}
char* getStr() {
return m_str;
}
private:
char* m_str;
};
int main(void) {
char* str = "test";
CHoge choge;
choge.setStr(str);
printf("%s", choge.getStr());
}
そういう意味でただ動けばいいというのなら
>>127で良さそうなんですが、
C++の仕様的に動作が保証できる方法が無いかとちと考えてた訳です。
でも、やっぱムリぽですね。
レスくれた皆様ありがとうございました。
>>131 いえ、記述的に
printf("%s\n", hage);
だけで済むようにできないかと
>>132 そういう要求のために iostream が設計されたんだろうけどな。
例えば
class CHoge{
public:
operator char* (void) { return m_pStr; }
protected:
char* m_pStr; // 文字列を保持してるメンバ変数
};
とかしておくと
printf("%s", (char*) hage);
でいいわけです。
つうことはデフォルトのキャストが判ればそれをoperatorで定義しとけば...?
てなことを考えてた訳です。
>>124 class CHoge {
char mFoo[10];
public:
operator char *() {return mFoo;}
CHoge(const char * foo) {strcpy(mFoo, foo);}
};
// というようにキャストオペレータを用意して、
int main()
{
CHoge hage("abc");
// たとえば、
printf("%s\n", strcat(hage, ""));
// とか
printf("%s\n", static_cast<char *>(hage));
// するのが関の山。
return 0;
}
>>121様
お恥ずかしながらプログラムのミスでした。
opendir()
に対応する
closedir()を書き忘れいたことが原因のようです。
勝手な推測ですが、FILEとDIRの型は内部的には同じものを使っていて、
>>106の問題に当たってしまったものの
エラーがfopenだったため、closedirに気付かなかったという流れだと思います。
いろいろありがとうございます。
ふつうに行儀良く書けばいいのになぁ
>>135 それやるくらいなら普通にやった方が自然だね
>>123 落ちる前に止めてみてfstatなんかで開いているファイル数確認してみてはどうでしょ?
>>141様
ありがとうございます。
fstatやっていれば、もっと早く分かっていたっぽいですね。
ディレクトリを再帰で開いているところがあり、まだ問題が残って
いる可能性が高そうなので、一度確認してみます。
sizeof(array)で配列のサイズが分かるのは何故なんでしょうか。
array配列の先頭ポインタを渡してるだけなのに。
例えば
int ReturnArraySize(int* array){
int size=sizeof(array)/sizeof(array[0]);
return size;
}
では、配列の要素数を返してくれないのは納得できるのですが...
ちなみにスコープ内で配列サイズが分かるということで合ってます?
先頭ポインタ > &array
arrayはポインタと同じように使えるだけ。
>>143 「コンパイラが コンパイルする時」は、その配列が確保したサイズはわかってるよね。
よく観察してみよう
つまり、スコープ内ではアドレスとして渡しているわけではなく
sizeof(array)はその配列全体サイズを返すという配列特有の
処理を施しているという事でしょうか。
スコープ外では必然的にポインタとして渡す事になるから...umm
>>147 sizeofを関数だとでも勘違いしてないか?
>>147 int a[100];//aが100ってわかってる
size = sizeof(a);//コンパイル時に size = 100;になる
size = sizeof(a[0]);//コンパイル時にintのサイズになる
int a[100];
int* p = a;
size = sizeof(p); // pのサイズ==int*のサイズ==4になる
実装者の裁量に任されてる
4とは限らない
>>152 そうかなあ、>149はちゃんと正しく書いてるのに。
int*が4と覚えられたらまずいと思うな。
>>153 正しくないよ。
>size = sizeof(a);//コンパイル時に size = 100;になる
size = intのサイズ*100になる
「静的次元配列に sizeof を使うと、配列全体のサイズを返します」
C解説サイトに書いてました。なんとなく腑に落ちたような。
int*が4とは限らないというのは一応知っているつもりですが。いちおう...
>>148 確かにそういう風に思ってたかも。でも、演算子ってなんなんだ
って逆に思ってしまった。なんだか、キリがないですね。すみません。
アドレスからサイズを求めているのではなく、その変数の型情報からサイズを求めている
という感じかな?
だから
>int a[100];
>int* p = a;
>size = sizeof(p);
sizeof(p)はsizeof(a)ではなくsizeof(int*)と同じになる。
配列とポインタを混同するな。
int a[100], *p; とあったとき、aとpは全然別物。
似たような使い方ができるだけであって、特別に何かをしているわけじゃない。
fooクラスをhogeクラスのメンバ(コンポジション)として使いたい時、
class hoge
{
private:
int i;
int j;
foo myfoo(i,j);//エラー
public:
hoge();
};
hoge::hoge()
{
i=100;
j=200;
}
のように、hogeオブジェクト生成時にそのメンバ変数を引数として
fooオブジェクトを作成することはできないのでしょうか。
上のような書き方ではエラーでコンパイルできませんでした。
引数を取らずにfoo myfoo();と定義すれば
うまくいくようなのですが、これでは別の場所でhogeのi,j値を
渡さないといけないので面倒くさいしなんかかっこ悪いです。
ですがそうしないといけないものなのでしょうか。
ほげ::ほげ():i(100),j(200),まいふー(i,j){}
161 :
デフォルトの名無しさん:04/09/12 09:11:32
age
>>159 foo myfoo(); では、foo型のオブジェクトを返すmyfooという名前の関数の
宣言になってしまう。
163 :
159:04/09/12 09:23:53
>>160 なんか見たことの無い書き方で
何がどうなってるのか分からないんですが
普通に整形したらどういう感じになるんでしょうか…
>>163 constructorでのmember/base classの初期化構文。
#include <iostream>
class foo {
double i, j;
public:
foo(double x = 0, double y = 0) : i(x), j(y) {}
void printfoo() const { std::cout << std::fixed << i << ", " << j << std::endl; }
};
class hoge {
int i;
int j;
foo myfoo;
public:
hoge(int x = 100, int y = 100) : i(x), j(y), myfoo(i, j) {}
void printfoo() { myfoo.printfoo(); }
};
int main()
{
hoge h;
h.printfoo();
}
166 :
159:04/09/12 10:35:03
>>165 ありがとうございます。
度々申し訳ないのですが、↓のような感じの書き方はできないんでしょうか?
慣れてないものでシンプルな書き方じゃないとよく分からないのです。
試したらエラーがでましたが、
>>165とは意味が違ってきてしまうのでしょうか。
class hoge{
private:
int i;
int j;
foo myfoo;
bublic:
hoge();
}
hoge::hoge()
{
i=100;
j=200
myfoo(i,j);
{
>>166 意味が違うからエラーが出るに決まってんじゃン。
>>165が正しい書き方なのでこれを理解して覚えること。
メンバの初期化に引数つきコンストラクタを呼ぶにはこうするしかない。
メンバ初期設定リストで調べてみ。
少しは自分で調べろよ
検索語句も示されてるのに
知障か?
>>166 何度もいいますようにmyfoo(i, j);というのは関数の呼び出しです。コンストラクタの
呼び出しではありません。そしてmyfoo(int, int)という関数が宣言されていないので
エラーになるのだと思います。
どうしても初期化リストではなくコンストラクタ内からコンストラクタを呼び出すので
あれば、newの配置構文(placement-new)を使うか、単純にfoo型の一時オブジェクト
を作って代入してやればよいです。
class hoge {
int i;
int j;
foo myfoo;
public:
hoge() {
i = 100;
j = 200;
myfoo = foo(i, j); //foo型の一時変数を代入
// new (&myfoo) foo(i, j); //こちらでもよい
}
void printfoo() const { myfoo.printfoo(); }
};
初めまして、学校の課題で摂氏を華氏に直すプログラムをC++で作ってるのですが
どうもうまくいかなくて行き詰ってしまったので助けてください><
#include<iostream>
using namespace std;
void CalcTemp(float, float,float&);
int main()
{
float tempCel,
float tempFahr,
CalcTemp(tempCel);
cout << "Enter celcius Temperature ==> ";
cin >> tempCel;
cout << "tempCel Celcius Degree = tempFahr Degree Fahrenheit ";
return 0;
}
void CalcTemp(float tempCel);
{
tempFahr = 9/5 * tempCel + 32 ;
}
>>170 void CalcTemp(float tempCel);
{
tempFahr = 9/5 * tempCel + 32 ;
}
じゃなくて、
void CalcTemp(float* tempCel)
{
tempFahr = 9/5 * tempCel + 32 ;
}
CalcTemp(tempCel);
じゃなくて、
CalcTemp(&tempCel);
#include<iostream>
using namespace std;
float CalcTemp( float );
int main()
{
float tempCel;
float tempFahr;
tempFahr = CalcTemp( tempCel );
cout << "Enter celcius Temperature ==> ";
cin >> tempCel;
cout << tempCel << " Celcius Degree = " << tempFahr << " Degree Fahrenheit ";
return 0;
}
float CalcTemp(float tempCel)
{
return 9/5 * tempCel + 32 ;
}
void Fahr911() { for(;;) puts( "NO MORE BUSH!" ); }
>>171さん
>>172さん
レスありがとうございます。起動までこぎつけることができました。感謝感激です!
ただ、実際に数字を入れてみると-1.07e+008みたいな感じになってしまいます。
これはどうしたら直せますか?ご教授お願いします。
std::setiosflags( std::ios::showpoint )
std::setiosflags( std::ios::fixed )
>>174 ソースをもっとよく見直せ。いったい何を計算してるんだ?
cinから貰ったtempCel の値で tempFahr を求めるんだろうが。
>>176さん
レスありがとうございます。
float CalcTemp(float&);
float CalcTemp(float& tempCel)
に変えてみたのですが同じような結果になってしまいました。
根本的に勘違いしてるところがあると思うのでもしよろしければ
教えて頂けませんか?
>>177 cout << "Enter celcius Temperature ==> ";
cin >> tempCel;
tempFahr = CalcTemp( tempCel );
cout << tempCel << " Celcius Degree = " << tempFahr << " Degree Fahrenheit ";
>>169 > // new (&myfoo) foo(i, j); //こちらでもよい
よくねーよ。
>>178さん
ありがとうございます!!できました。
つまりcinで数値を入れた後に計算するようになってなかったのが
原因と理解しましたが合ってますか?
>>179 お前もしかしてplacement new構文を知らないんじゃないか?
もう一度よく勉強してみろ。
>>180 すでにデフォルトコンストラクタで構築されたmyfooが解体されずに
新たに配置newでコンストラクトしてる。
だと思う。
>>183 それはおかしい。myfooのデフォルトコンストラクタはいつ呼ばれているというんだ。
>>184 hogeのコンストラクタが呼ばれる前だよ。
あるクラスのコンストラクタが呼ばれるときには、基底クラス・メンバの構築は完了してる。
>>185 これやってみ。aがデフォルトコンストラクタで構築された後、解体されずにまた構築されるから。
struct A {
A() { cout << "A::A()" << endl; }
A(int) { cout << "A::A(int)" << endl; }
~A() { cout << "A::~A()" << endl; }
};
struct B {
A a;
B(int i) {
cout << "B::B()" << endl;
new(&a) A(i);
}
};
B b(10);
(部分特別化の出来ない)VC6で使えるdelegateクラス誰か作ってください
>>189 boost::function はダメだったっけ?
>>190 function1とかfunction2と明示してやんないとダメみたいです。
>>193 入らない。
struct C{
template<class T>
void apply(boost::function<T> fn){ fn(); } };
3行で書けるものがfunctionの引数に応じたapplyのオーバーロードを書かなあかん。
それによって悪い悪臭を放つ。
>>194 delegateとして使うなら引数の型と個数は静的に決定されてるんだから
そんな屁理屈が出てこないはずなんだが。
スルーかよ。アフォが。
うっ。悔しいがあんたが大将さ。
漏れはおととい出直してくるわ。
freadで読み込んだバイナリデータを
アスキーに変換csvに出力するにはどうしたらいいでしょうか?
それはしようがないね
201 :
デフォルトの名無しさん:04/09/13 05:12:38
”a=1かつb=2でないなら”
は
”!((a==1)&(b==2))”
でいいのでしょうか?
>>204 !((a == 1) && (b == 2))
(a == 1) && (b != 2)
ご注文はどっち?
206 :
デフォルトの名無しさん:04/09/13 05:29:33
>>205 !((a == 1) && (b == 2)) の方でした
&が二ついるんですねw
ありがとうございました
207 :
デフォルトの名無しさん:04/09/13 07:55:04
ファイルの特定のアドレスにある情報を調べるにはどうすればいいのでしょうか?
例えば、ファイルの先頭から12 byte目の情報を調べたい時です
209 :
デフォルトの名無しさん:04/09/13 08:24:24
>>208 レスありがとうございます
seekについて調べてみたのですが使い方が載っていませんでした
よろしければ使い方も教えてください
載っていない訳がない
>>210 「seek ファイル」で検索してみたのですがCのseekについては見つかりませんでした
212 :
デフォルトの名無しさん:04/09/13 08:49:10
fseek
213 :
デフォルトの名無しさん:04/09/13 08:58:33
>>212 fseekでヒットしました
これから読んできます
ありがとうございました
214 :
フフフ:04/09/13 10:23:38
BorlandC++5,5をインストールし、DirectX9 SDKをインストールし、
コマンドラインからDirectXのサンプルプログラムをコンパイル
したのですがコンパイルエラーが出てしまいます。
リンカの設定をしないとダメだと聞いたので
bcc.cfgファイルに
-I"C:\DX90SDK\Include"
-L"C:\DX90SDK\Lib"
ilink32.cfgファイルに
-L"C:\DX90SDK\Lib"
と追加したのですが
Fatal: オプションが必要 :LC:\DX90SDK\Lib
と、コンパイルエラーが出てしまいます。
どうしたらいいのか教えてください。
37のn乗{n=1,2,3,…}を計算する時、下3桁が示すパターン周期を求めよ。って問題があるんですが
どうすれば下3桁だけを比較できるのか全く検討がつきません。
どうすればいいか教えてくださいお願いします。
>>216 long long int x;
x = 100100;
として
下三桁は x - x / 1000
下三桁は x % 1000
>>217 嘘
long long int tmp;
も宣言
tmp = x / 1000;
x - x * 1000;
即レスありがとうございます。
がんばってみます。
整数値の有効桁数を高速に求めるアルゴリズムってありますか?
何も考えないで書くとこんなのになるんですが・・・。
int x = 0x80000000;
int count = 0;
while (x) {
x >>= 1;
count++;
}
桁数ってビット数?
int count = sizeof(int)<<3;
それとも最大整数値?
int count = ~(1<<((sizeof(int)<<3)-1));
int型って32bitCPUと64bitCPUで有効桁数変わったっけ?(うろ覚え
対数とるんじゃ駄目?
sizeof(int) * CHAR_BITS
だな
すみません、文章がわかりにくかったですね。
>>221で言った有効桁数ってこういう意味でいっていました。
整数値 = 桁数
0x00000001 = 1
0x00000002 = 2
0x00000004 = 3
0x00000008 = 4
0x00000010 = 5
・・・
0x80000000 = 32
ようは立っているビットの最上位ビットの位置のことです。
言葉の使い方がわるかったです、スミマセン。
インラインアセンブリで BSR 命令を使うとか
#include <stdio.h>
int log2(int arg)
{
int r;
__asm {
mov eax, -1;
bsr eax, arg;
inc eax
mov r, eax;
}
return r;
}
int main()
{
int testvalues[] = { 0x00000000, 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010 };
int i, max = sizeof(testvalues) / sizeof(int);
for(i = 0; i < max; i++)
{
printf("%08X = %d\n", testvalues[i], log2(testvalues[i]));
}
getchar();
return 0;
}
C言語で配列の個数の調べ方をおしえてください。
こんな感じの場合の配列aの個数です。
int i;
int a[] = {1,2,3,4};
for(i=0;i<aの配列の個数;i++){
}
>>231 #include<stdio.h>
main(){
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)/4);
return 0;
}
4ってのはどこからやってきたのだろうか
int は4byteだから。
sizeof (a)/sizeof(a[0])
そういやどっかで
#define NUMOF( array ) ( sizeof( ( array ) ) / sizeof( ( array[ 0 ] ) ) )
なんていう糞マクロ見たっけなあ
>>232-237 Σ(゚Д゚;≡;゚д゚)
どれが一番ポピュラーな方法なんでしょうか??
こんな感じですか??
int i;
nt a[] = {1,2,3,4};
int size = sizeof (a)/sizeof(a[0]);
for(i=0;i<size;i++){
}
そうだよ
>>237 有名なマクロだよ。
Cでは良く使われるし糞とは言えない。
C++だったらテンプレートでやるべきだけど。
要素数を得るためのテンプレートなんてトリッキーすぎて
「べき」なんて言えないよ。
(sizeof(array)/sizeof(array)[0])
とかそういう話?
>>243 (^Д^) キャハハ何言ってんのこいつ
>>231はC言語で、といってるが。
テンプレートの話はひとまず置いておいたほうが混乱させなくてよいとおもうぞ。
インタプリンタ系言語だと、a.countとかa.indexみたいな感じで配列の要素数一発で調べられたりするからね。
初心者さんにはつまずきやすいところではあるな。
>>246 お前のレスのほうがよっぽど混乱させる文だな
>>245 それは私が別スレで取り上げたのと同じやつ^^;
でも、マクロはいろいろ取り扱いが危険なので、なるべく使うべきでは無いと思うよ。
マクロは結局単なる置き換えに過ぎないし、コンパイラの機能ではないから、
マクロでエラーが発生したときにエラーメッセージからどこが問題かを判断し
にくいということがある。
良くある間違いは置き換えであることを忘れて-つまり関数と勘違いして-
マクロを書いてしまうと括弧を付け忘れたりして予想もしない計算結果になること
もある。
具体的にどうすれば良いかと言うと、配列の要素数を求める計算自体は
それほど複雑でもないので、
o 配列を宣言したすぐ後で要素数を入れる変数を用意しておくか、
o その場その場でsizeof(array)/sizeof(array[0])を実行するか、
した方が良いと思う。
マクロの中身を括弧でくくっておくのは普通にやる事じゃなかったのか?
そうすりゃ計算結果が狂うなんてまずないし。
そういう問題じゃないだろ。
汎用マクロにしたら配列とポインタを混同してしまう危険があるだろ。
ポインタで渡してもエラーにならないし。
有名なのだと
#define max(n, m) (n > m ? n : m)
c=max(++a, ++b);
みたいなのだな。numofマクロならそんな事はないだろうけど。
テンプレートはconstantな要素数取れたっけ?
#define max(n, m) (n > m ? n : m) ×
#define max(n,m) (n > m ? n : m) ○
こんな初歩的ミス犯すような奴にマクロなど使えんわっ
?
けっこういろいろ流儀があるようですね。
当面、
>>249さんのいわれるように、
その場その場でsizeof(array)/sizeof(array[0])を実行する
でやってこうとおもいます。
みなさま、どうもありがとうございました。
その場その場でやるのが面倒だという考えからサブルーチンが生まれ、関数、マクロが生まれた……はず。
>>261 でも、なれていない人がやるとバグの温床にならないかな
マクロは、
どうしてもマクロじゃないと出来ない!
マクロで書いた方がスッキリ!
な時以外使わないなあ
>>259 え?これじゃまずいんですか?(゚д゚lll)
うぅ、わからん...
>>264 マクロは型情報などお構いなしだとかいった点で、
バグを追跡しにくくなるってのは昔から言われてることではあるけど、
その規模のマクロで追跡を困難にするほどの力はないと思う。
少なくとも「毎回書く」よりはマクロの方が上等な解決。
エラーメッセージが見やすいとかよりはまずソースの見易さを考えるべきで、
そのためには処理に名前をつけるってのは基本的なことがら。
というわけで私はマクロ賛成派。
結局は自分がやりやすいほうを選べばいい。どちらにもメリット・デメリットはある。
>>231氏はソース中に
sizeof(array)/sizeof(array[0])
と書かれてるのと
NUMOF( array )
と書かれているのとどっちが見やすいと思う?
でも、もしC++を使える環境なら、インラインやテンプレートを使う方がお薦めできるけれどね
>>266 そりゃそ〜だ。
普段Cしか使わないからC++のこと忘れてた。
>>265 どう考えても、sizeof(array)/sizeof(array[0]) のままの方がいいでしょ。
>268
どう考えてもって・・・発想力弱いんじゃ?
関数にポインタ渡す代わりに参照演算子(&)使えば、
配列サイズの計算できるんだ...なるほど
C言語だったらどうすればいいんだろ
>>270 できないでしょ(w
「配列」から「配列へのポインタ」に変数が変更されたりしたら、もうお手上げ。
コンパイルエラーが得られないのは相変わらず。
>>269 sizeof(a[])/sizeo(a[0])は、見るからに怪しいので、
メンテナンス時には誰もが注意を払ってくれる。
発想が弱いのは君だろ?認めろよ。
帝政
sizeof(a[])/sizeo(a[0])
↓
sizeof(a)/sizeo(a[0])
>271
俺はケースバイケースだと思うんだけど。
274 :
デフォルトの名無しさん:04/09/16 05:52:40
>>271 > sizeof(a[])/sizeo(a[0])は、見るからに怪しいので、
> メンテナンス時には誰もが注意を払ってくれる。
なんだ、「どう考えても」って、こんなのを考えただけのことなのか。
275 :
デフォルトの名無しさん:04/09/16 07:47:24
すいません
構造体について教えてほしいのですが
struct render{
int a;
int b;
char c[32]
};
render rend={64,128,"まぐろ"};
はできるのに
render rend[128];
rend[0]={64,128,"まぐろ"};
と初期化以外でするとエラー吐きますよね。
初期化以外で関数事態を一括で代入する方法を知りたいのですが
知識をご教授お願いします。
関数?
>>275 関数でなくて構造体でしょ?Cには無いっぽい。
関数で強引にやる方法はあるが。
int main(void)
{
・・・
rend[0] = InputRender(64, 128, "まぐろ");
printf("%d %d %s\n", rend[0].a, rand[0],b, rand[0].c);
・・・
}
render InputRender(int a, int b, int c[32])
{
render rend;
rend.a = a;
rend.b = b;
strcpy(rend.c, c);
return rend;
}
>>275 struct render {
int a;
int b;
char c[32];
void set(int va, int vb, char * vc) {a = va; b = vb; sprintf(c, "%.31s", vc);}
};
render rend[128];
rend[0].set(64, 128, "まぐろ");
rend[1].set(32, 64, "はまち");
ちっ、はまち書いてたら負けた
280 :
275:04/09/16 10:05:31
できましたです。
ありがとーございました。
ちまき…(・∀・)イイ!!
Cではコンパウンドリテラルを使うのが一般的だろうけど、
文字列はstrcpyでもつかわないと仕方ないな。
構造体配列を丸々引数として参照型で自作関数に渡したいのですが、中々上手く行きません。
下の例で言えば、*に当たる部分でしばらく悩んでいます。
初心者故に初歩的な質問ですみませんが、どうか宜しくお願いします。
例(変数・関数名、型宣言は適当)
int CountNum( * );
struct NUMDATA { int data1, data2, ・・・(略) }
void main(){
NUMDATA numdata[DATA_MAX] = { 10, 20,・・・(以後略)
CountNum( * ); ←ここで「numdata[DATA_MAX]」の要素全てをまとめて渡したい
・・・(略)
}
int CountNum( * )
{
・・・(略)
}
>>282 先頭ポインタと要素数を渡すようにしたらええやん。
int CountNum(NUMDATA* p, int length)
そこはふつーvectorだろ?
>>282 非現実的
template<unsigned N> int CountNum(NUMDATA(& hoge)[N]);
286 :
デフォルトの名無しさん:04/09/18 22:01:16
初期化処理(環境設定ファイル読み込み処理)
環境設定処理を読み込み、環境設定情報を環境設定情報管理テーブルに
保持するとはどーゆーことですか?
プログラムを作る実習で初期化設定のモジュール作成
の担当になったのですが、何を作ればいいのかわからず、
困っています。
>>286 実行環境は?Linux?Windows?MacOSX?設定内容は?
288 :
デフォルトの名無しさん:04/09/18 22:04:38
Linuxです。
289 :
デフォルトの名無しさん:04/09/18 22:05:30
すいせん。設定内容ってなんですか?
>>288 そのプログラムではどんな初期化・設定が必要?
それがわからないと話にならないよ
widestudioっては良いんですか?
292 :
デフォルトの名無しさん:04/09/18 22:12:40
環境設定処理を読み込み、環境設定情報を環境設定情報管理テーブルに
保持する。
環境設定のフォーマットはあるんですが…
勤怠のプログラムを作ります
>>291 超漢字ユーザにはお薦めできるけど。
WindowsやLinuxなら他にもっといいものがある。
>>292 聞いていることとは違うんだけど、もういいわ。
例えば、
------------------------
key0=value0
key1=value1
key2=value2
------------------------
というような設定ファイルだとしたら、
これを一行ずつ読み込んで、1行目ではkey0,=,value0の様に部分部分に分けて、
(key0,value0),(key1,value1),(key2,value2)
というペアで
struct {
char* key;
int value;
};
のような構造体などに保存するということではないかな。
てか、宿題スレに逝け。
296 :
デフォルトの名無しさん:04/09/18 22:38:45
>>294 ありがとうございます.
今一度仕様を読んだのですが、理解できず、
何からはじめたらいいのかもわからず、
講師にも聞いちゃいけないのでどーすることもできずに
止まってしまってます…
そうやって俺をイラつかせて、何をしたいんだ。
俺に恨みでもあるのか。それとも人をからかうのが好きなのか。
どちらにしても、お前は悪意をもって人を傷つけようとした。
こういう事はこれで最後にしろ。
298 :
デフォルトの名無しさん:04/09/18 22:49:41
どーもすいませんでした
移動します。
299 :
デフォルトの名無しさん:04/09/18 23:06:57
key0=value0
key1=value1
key2=value2
って変数ですか?
300 :
デフォルトの名無しさん:04/09/18 23:10:19
300get
>プログラムを作る実習で初期化設定のモジュール作成
>の担当になったのですが、
「もっと基本的な段階でまったく勉強せず、複数人での共同制作の段階になって
慌てて調べようとしたが、基礎が完全に抜け落ちていては何をどう調べたらよいの
か全く解らない」
ということでしょうか
出てったやつを呼び戻すなよ。
304 :
デフォルトの名無しさん:04/09/19 01:42:44
305 :
デフォルトの名無しさん:04/09/19 03:47:03
__FILE__とか__LINE__みたいな感じで関数名が取れるディレクティブ(orそれに変わるもの)
って無いでしょうか?ログ出力の際に関数名を出力したいので。
一応コンパイラはVC++6.0でお願いします。プラグマでもかまいません。
よろしくお願いします。
#でもプリプロセッサだから関数まで分らないだろうなぁ。。
>>305 BOOST_CURRENT_FUNCTION
ソースみたらVCには対応してないみたい
プリプロセッサ自分で作ればいい
>>306 ありがとうございます。
VC以外で機会があったら使ってみます。
ありがとうございます。自分でその都度#defineすることにします。
>>311 やめとけ。今は、__FILE__と__LINE__で忍耐しとくべきだ。
せっかく作った機能も、いずれコンパイラの対応で必要なくなってしまう。
2005 Beta でも出来なかったけど、一体いつ対応するのやら
いらないし。
たのむから仕様変更はまとめてやってくれない?
>>311 ファイル名と行番号で出力しておき、外部ツールで関数名に展開すればいいんでない?
>>316 それが一番、影響小・低開発コストだね。
318 :
デフォルトの名無しさん:04/09/20 01:19:19
C++学習中です。
boost::lambdaに関する質問があります。
list<メンバ関数・変数を持つオブジェクト>から、
特定の値にマッチする要素を取り出したい場合に、
(特定の値を持っている要素が複数存在することはありません)
return find_if(list.begin(),list.end(),(_1.data()==param));
としたいのですが、コンパイルエラーが以下の用に発生してしまします。
c:\~~~.cpp(13): error C2039: 'data()' : 'boost::lambda::lambda_functor<T>' のメンバではありません。
with
[
T=boost::lambda::placeholder<1>
]
そもそも、_1.data()という使い方はできないのでしょうか?
よろしくお願いします。
いcう
320 :
デフォルトの名無しさん:04/09/20 01:53:13
int a[10]とint b[10]の中身の一致数を、できるだけ短い式で求めたいのですがどうやりますか?
321 :
318:04/09/20 02:00:17
int a[10]とint b[10]の中身の一致数を、できるだけ短い式で求めたいのですがどうやりますか?
int c=0;
>>320 こうでしょうか?
for(int i=0; i<sizeof(a); i++)
for(int j=0; j<sizeof(b); j++)
if (a[i]==b[j]) c++;
すいません、なんか、アレでした・・
>>320 >int a[10]とint b[10]の中身の一致数を、できるだけ短い式で求めたいのですがどうやりますか?
int c=0;
for(int i=0; i<sizeof(a); i++)
for(int j=0; j<sizeof(b); j++)
if (a[i]==b[j]) c++;
なんかfor文使わずに一行でできませんでしたっけ?
memcmp()だね
そうなんですか?
boost配列なら出来そうですけど、それ以外の方法で可能なら、漏れも知りたいです。
>>324 memcmpは一致か不一致かしか判定できない罠
>>324 一致個数とか、a[1]==4 と b[2]==4 の一致が検出でき
すいません、横槍でした
うーん、できたような気がしたけど勘違いだったかな。
素直にfor文でやります。すいません。
>>318 boost::lambda::bind
>>329 ありがとうございます
bool compare(const obj& x,const obj& y)
{
return (x.data()==y.data());
}
obj V("hoge");
find_if(list.begin(),list.end(),bind(&compare,_1,V);
って感じですか?
やってみます.....
331 :
デフォルトの名無しさん:04/09/20 03:17:55
C言語学習中の者です。
Windows系のCではconio.hをincludeしてgetch()関数を使用できるのですが、
UNIX系(私の場合はCygwinです)ではcurses.hをinclueしてgetch()を使用できる
ということでソースを書いてみましたが、コンパイルは通るのですが実行すると
「何かキーを押す。」まで表示された後
「Segmentation fault (core dumped)」と表示されて
正常に動作いたしません。
ソースは以下の通りです。
#include <stdio.h>
#include <curses.h>
int main(void)
{
char a;
printf("何かキーを押す。\n ");
a = (char)getch();
printf("何かキーが押された。 ");
return 0;
}
コンパイル時のコマンドラインはこのようにしています。
gcc ソース名 -lcurses
よろしくご教授おねがいします。
素直にint a;でやればいいのに
333 :
デフォルトの名無しさん:04/09/20 04:35:08
クラスを外部ヘッダやcppに分割してプログラムを作るとき、using namespace std;というのは外部cppには書かないほうがいいんですか?
main()のあるcppと外部クラスの定義のあるcppのどちらともでusing namespace std;をするのはとりあえずよくないみたいなことを聞いたのですが、理由がよくわかりません。
>>333 別にそんなことないよ。
書きたいのなら好きにusing書きなさい。
>>333 名前空間が違うと言う恩恵を拒否し、アナクロニズムに浸りたいと言うのでしたらどうぞご自由に。
>>336 あえてstd空間と衝突する名前を採用する挑戦的な関数・クラスを使わない限り、恩恵はない。
どこの世に、わざわざstdと衝突させたがる人がいると?
標準のC++は、建前が先行しすぎているきらいがある。
てめえが知らない内に衝突してるかも知れねえだろ
特にalgorithmなんかは
>>338 今まで経験ないし、今後もないと思う。
名前が重複したとしても、ほとんどの場合コンパイルエラーが出るだろ。
君は、algorithmと引数まで酷似するような凝った関数使ってるのかね?
>>339 しら無い間にバグが出来ちゃったりするのが怖いから避けるんだろが
馬鹿かお前は
342 :
333:04/09/20 18:08:00
std名前空間の中にある関数やクラスと自分で定義した関数やクラスが衝突する恐れがあるから、std名前空間はstdということをはっきりさせるために
using namespace std;をつかわずにstd::cout見たいな記述をして、見た目にわかりやすくしているってことですかね?
もしかしてmain()のあるファイルでもusing namespace std;を使わないのが普通なんでしょうか?
>>337 標準やモロモロのライブラリの識別子と名前が被ってしまうことを恐れることから解放された
素晴らしいことだな。
>>331 curses使ったことないんで外してるかもしれないですけど,
たぶん使う前に初期化関数とかを呼ばなければならないんじゃないでしょうか?
替わりに
#include <stdio.h>
int getchar(void);
でどうでしょ?
今時CUIで一文字入力(≠1行入力)でもないと思うが…
>>330 find_if (list.begin (), list.end (), boost::lambda::bind (&obj::data, boost::lambda::_1) == "hoge");
C言語の基本的な文法は覚えたので
windows上で動くプログラムを作ろうかと思ってるのですが
参考になるお勧めな本を教えてくれませんか?
ソフトはVisualStudio2003を使ってます。(ソフトは関係ないと思うけど一応
348 :
デフォルトの名無しさん:04/09/20 22:00:46
>>342 他は知らないが俺はファイルの先頭でこういう具合にいちいち並べている。
using std::cout;
using std::cerr;
using std::endl;
using std::fstream;
349 :
デフォルトの名無しさん:04/09/20 22:36:21
>>348 なるほど、主によく使うものだけをnamespaceを使用しないで省略できるようにしておくのですね。。
参考になります。。。
>>348 いい方法だな。
そのへんの名前はかぶりそうにないし。
351 :
デフォルトの名無しさん:04/09/20 23:17:55
入力した文字列を逆から表示するプログラムのソースをオライリーあたりからパクって来てVC++.NETでコンパイル
して、動かそうとしたんですが、表示されるのは1行目だけで、しかも止まりません。
どうすればいいでしょうか?
#include<iostream>
#include<string>
using namespace std;
int main(int argc,char** argv){
const string delims("\t,.;");
string line;
while(getline(cin,line)){
string::size_type begIdx,endIdx;
begIdx=line.find_first_not_of(delims);
while(begIdx!=string::npos){
endIdx=line.find_first_of(delims,begIdx);
if(endIdx==string::npos){
endIdx=line.length();
}
for(int i=endIdx-1;i>=static_cast<int>(begIdx);--i){
cout<<line[i];
}
cout<<' ';
begIdx=line.find_first_not_of(delims,begIdx);
}
cout<<endl;
}
}
>>332 >>344 解答ありがとうございます。
残念ながら両方試してみましたがうまくいきませんでした。
今のところUNIX系OSを使う機会は無いので、
Windows系のC言語で学習を続けたいと思います。
>>346 Argument-Dependent-Lookup(ADL)使うともうちょっと幸せ。
find_if (list.begin (), list.end (), bind (&obj::data, boost::lambda::_1) == "hoge");
354 :
デフォルトの名無しさん:04/09/21 00:43:03
355 :
デフォルトの名無しさん:04/09/21 01:31:44
階乗プログラムてどんなやつですか??
>>355 こういうの?
template <int N> struct Factorial{ enum{ value = N * Factorial<N-1>::value }; };
template <> struct Factorial<0>{ enum{ value = 1 }; };
int
fact( int n )
{
int fact = 1;
for( int i = n; i >= 2; --i )
fact *= i;
return fact;
}
int
main()
{
std::cout << Factorial<0>::value << std::endl;
std::cout << fact( 0 ) << std::endl;
return 0;
}
357 :
デフォルトの名無しさん:04/09/21 01:49:11
>>356 まだ関数ちょっとかじったばっかまでしかわからない初心者なんですが
>>356のはわからないことが多すぎるんで
具体的にどうゆうのが階乗プログラムか教えていただければ幸いです・・・
>>357 漏れは階乗プログラムなんて名詞知らないヘタレPGなんで
階乗を求めるプログラムを書いてみただけw
>>358 そうですか・・・何とか自力でしらべまくってみます・・
わざわざ夜分遅くにご教授ありがとうございましたー
n! = n・(n-1)!
n! = n・(n-1)!
だろ?
int
fact( int n )
{
if(n<=1) return 1;
return n*fact(n-1);
}
ぢゃねの?
※intでいいのか、とか、マイナスの場合どうすんの?とかがあるが
n! = n・(n-1)! ... n >= 1のとき
n! = 1 ... n == 0 のとき
終了条件無いとだめだって
数学的にも
n! = n・(n-1) (n>=1)
だな
ま、揚げ足取りだけどさw
階乗を求めるプログラムは再帰の例としてよく出てくるが
別に再帰じゃなくて単なるループでもいいのよ
int fact(int n)
{
int f = 1;
for (int i = 1; i <= n; i++) {
f *= i;
}
return f;
}
再帰の例としては分かりやすいけど、駄目な使い方の例でもあるな
再帰を使わなくても簡単に書けるのならば、そう書くべき
じゃあフィボナッチ数列とかにしたら?
これも反復で書けるけどね
fib(n) = fib(n-1) + fib(n-2) ... n >= 3
fib(n) = 1 ... n = 1,2
>>367 再帰的定義だからといって、再帰がいいとは限らない
なんか、Efficient C++ を思い出しますなあ
(単一引数を取るinline再帰関数にリテラルを渡すことにより、
最適化によってはコンパイルタイムで計算されるというやつ)
>>354 不具合なんか起きるもんかね。起きるのがイヤだから回避策をとってるのに。
転ばぬ先の杖って言葉知ってる?
>>369 それはstdと同じ名前の関数・クラスは作らない、暗黙ルール的な解決策って意味かな?
std::つけるって話だろ?
> プゲラ
頭悪そう
>>351 自己解決しました。単なる写し間違いでした…orz
ちなみに下から5行目です。
×begIdx=line.find_first_not_of(delims,begIdx);
○begIdx=line.find_first_not_of(delims,endIdx);
>>375 > 5行目
> 5行目
> 5行目
> 5行目
てんかん発作か何かでしょ。
379 :
デフォルトの名無しさん:04/09/23 18:12:11
class A
{
virtual void func(const int& i) =0;
}
の、=0ってどういう意味があるんですか?
381 :
デフォルトの名無しさん:04/09/23 19:54:33
C++の勉強をしようと思ったら、友達に、「Javaの勉強してからC++をしなさい」って、言われました。
なぜですか?
ヽ(`Д´)ノ友達に聞け!
C++の勉強をしようと思ったら、友達に、「C++なんて問題外^^;;;;」って、言われました。
なぜですか?
>383
その友達は「C++は問題外」でなくて、本当は「C++は理解の外」って意味でしょう。
頭の悪い友達を持って、君は不幸ですね。
>>384 その子頭は確かに悪いんだけど、顔と体は最高なんです・・・
>>385 そうですか。人はそれぞれ取り柄があるので、その子の長所を最大限に
引き出す事を考えれば君は幸せになれるでしょう。
const なのに int を参照で渡す意味ってあるの??
>>387 intが1280ビットほどあれば意味があるかも。ポインタのサイズ<<intのサイズでないと
だめだけど。
何度聞いても「ブラック ロ・リ・コ・ン!」としか聞こえん……
385はいかにその子の長所を伸ばすのか。気になる。
392 :
デフォルトの名無しさん:04/09/24 10:04:01
C++での先行宣言?は、
class A;
class B { A a; };
class A { B b; };
でいいのでしょうか?
いいよ
>>393 ありがとうございます。
インテリセンスでのコード補完がB内のメソッドで効かなかったので心配でした。
コンパイルできないだろう。
ポインタをメンバにしろ。
class B { A* a; };
class A { B* b; };
インスタンスをメンバにしたらコンパイルできない。
デフォルトコンストラクタ実行しちゃうもんね…
そういう問題じゃない。
class A, Bが互いに相手のインスタンスをメンバにしたら
無限循環が起きるだろうが。
要は、「自分の型へのポインタ」はメンバに出来るが
「自分の型のインスタンス」はメンバに出来ないってのと同じ。
仕事でC99準拠のコンパイラを作ることになったんですが
C99で書いたソースの拡張子は一般的に.cなんでしょうか?
.c99
>>395-398 ありがとうございます。
実際、コンパイルが通らなかったのですが、まったく違うところで、顔を真っ赤にして悩んでいました...orz
.Ruby!
>>400 まじっすか
たぶんC++も実装することになると思うんで追加でお聞きしますけども
C99のライブラリヘッダとC++の<c.*>ヘッダって共用できなくないですか?
無理に共用させるとすればrestrictとかマクロで逃げるよりほかないとか…
>>404 おいおい。
>>400はあからさまにネタだろうがよ。
それと普通のコンパイラに付属しているヘッダ類をみれば
わかると思うけど、たいていはマクロでC/C++の場合わけはしてる。
#ifdef __cplusplus
extern "C" {
#endif
最低限必要なのは↑みたいにリンケージにかかわるところとか、
名前空間の違い(Cの標準関数は名前空間stdに配置)を
吸収する部分くらいかと思う。
406 :
デフォルトの名無しさん:04/09/24 21:50:38
お前ら、「x^=y^=x^=y」でxとyの値を入れ換えることができるのは
どうしてかわかりやすく説明していただきたいのですが。
>>398 ポインターに格納するのはアドレスというただの数値だもんね。
>>409 ああなるほどそういうことか!さんくす!
^x^=(^y^=(^x^=^y^))
412 :
デフォルトの名無しさん:04/09/25 01:18:08
char型の文字列とString型の文字列の違いって何ですか?
また、変換する方法はありますか?
s=(LPCTSTR)chstr
>>412 CStringのことかAnsiStringのことかはたまたstd::stringのことか
はっきりせんが(てか、質問するときは環境をちゃんと書け)。
char配列は組込み型でStringはクラス。
よって前者は環境に依存しないが後者は環境依存。
また後者はメンバ関数が用意されているので
String hoge = "hoge"; //const char* → String
char hogetta[5];
strcpy( hogetta, hoge.c_str() ): //String → char*
てな具合に相互変換できる。
>>414 すみません。stringはstd::stringの事だと思います(using namespace std;とやっていればstringはstd::stringになりますよね?)
char*→stringはそのままString型に代入、string→charはc_strを使えばいいんですね。
ありがとうございました。
>>415 「だと思います」「stringはstd::stringになり」「char*→stringはそのままString型に」
↑ここらへんがプログラムに向いて無さそう。
文系の人なんだろうか。
文系でも普通に頭のいい人は「質問するときは環境をちゃんと書け」を
読み落としたりしないし、キャピタライズにもちゃんと注意する。
文系理系よりも頭の良し悪しの方が遥かに重要って、当たり前の話だな。
お前らアホか?
この場合頭の善し悪しじゃねーだろ
単に
>>412がプログラミングに向いていないというだけのこと
頭のいい、悪いはまた別問題
C++は始めたばかりでよくわからないんです。
環境といわれてもstringにいくつか種類があるなんて知りませんでしたし。
すみませんでした。
スレタイの「初心者」っていうのは何処らへんまでが「初心者」として定義されるんだろう・・・・
手厚く歓迎してるよ。みんな。
少なくとも曖昧な質問の仕方をする辺りがプログラマに向いてないと。
てか、「始めたばかり」の頃って、質問することなんか殆ど無くないか普通?
複雑さの無いシンプルな知識を本とかネットのリファレンスで吸収しまくる
単純作業っぽい学習の時期で、人に訊くことなんて何も無いと思うんだけど・・・。
C++勉強し始めて日が浅いのですが、C++(Javaも)でクラス名を小文字から始めるのは
あまり勧められたものではない、となっているのかな?
hoge::ClassName object;
hoge::class_name object;
(hogeはnamespace)なんとなく大文字小文字ででこぼこするなぁ、と思ったもので。
非推奨スタイルならさっさと改めます。
std::系やboostなどは標準ないしそれに近いものとして例外とされるのかな。
STL系のhoge_hoge、WinAPIのHogeHogeとスタイルがかぶらないように
Java系のhogeHogeという命名は結構使われてたりする
426 :
デフォルトの名無しさん:04/09/25 13:50:13
当方、「これならわかるC++」小林健一郎著をみてプログラムしているものですが、
最初のコードすら実行できません。MS-DOSプロンプトで実行すると、
以下4つのエラーが発生してしまいます。
エラー E2209 hello.cpp 1:インクルードファイル'iostream'をオープンできない
エラー E2282 hello.cpp 2:名前空間名が必要
エラー E2451 hello.cpp 6:未定義のシンボル cout(関数 main())
エラー E2451 hello.cpp 6:未定義のシンボル end1(関数 main())
どなたか解決法をお教えくださらないでしょうか?
428 :
デフォルトの名無しさん:04/09/25 14:21:54
>>427 ”インクルードファイルやライブラリファイルの場所を指定したBCC32.CFGを作成しなければなりません。”
どういう意味でしょうか?マイコンピュータ→システムのプロパティ→詳細設定
→環境変数でPathを選んで編集、既存の変数値に;C:\Borland\Bcc55\Binを付け加えたのですが
それとは違うんですか?
> ”インクルードファイルやライブラリファイルの場所を指定したBCC32.CFGを作成しなければなりません。”
その直後に書いてあるだろ
430 :
デフォルトの名無しさん:04/09/25 14:49:48
>>429 BCC32.CFGをどこにどうやって作るんですか?
ホームラン級の無能
432 :
デフォルトの名無しさん:04/09/25 15:15:46
何でそこまで言われなきゃいけないんだよ!
URL張ってくれてありがとな。
けどむかつくぜ!
>>432 文章を読めないのが無能以外のなんだというのだ
434 :
デフォルトの名無しさん:04/09/25 15:23:18
文章は読めるよ。何でお前に無能なんていわれなきゃいけないんだよ。
嫌な奴だな
436 :
430:04/09/25 15:54:41
>>435 上手く実行出来ました。有難うございます。
わざわざ手数のかかることをしてもらってすみません。
”ひとを品定めするような書き方”ってどういう意味です?
>434みたいな書き方しておいて、マジで>436のように判っていないのだとしたら、
おこちゃまなんだろうな、とは思う。
#げ、読点多くて頭悪そw
旧Cライブラリの関数を呼び出すときは ::HogeFunc() のように::を一つ一つ付ける方が良いですか?
>>416 >↑ここらへんがプログラムに向いて無さそう。
>>418 >単に
>>412がプログラミングに向いていないというだけのこと
>>431 >ホームラン級の無能
>>437 >おこちゃまなんだろうな、とは思う。
この辺の書き込みは質問者の弱い立場を利用した中傷でしかないので、しない方がいいですよ。
(421さんの言う「手厚い歓迎」?)
まぁ、みなさんなんやかんやでよく答えてるのでエライとは思います。
番号上げた方ごめんなさい。
名前をメール欄に書いちまった。439は435です。
>>439 プログラムに向いてない人がプログラマになったら、不幸だとは思わないのか?
好きならいいじゃないかと思うかもしれないけど、本人だけの問題じゃないんだぞ。
>438
全部に付けるのはめんどくさいんで、
紛らわしいものだけに付けます(自分は)
>本人だけの問題じゃないんだぞ。
どんな問題だ?
444 :
434:04/09/25 22:25:43
>>437 わかるわけねーだろあほ。
何がおこちゃまだよ。俺は無能と言われたんだぞ。
目の前で言ったら殺されても仕方ないぐらいのことを言われてんだ。
黙ってられるかよ。俺の理解力が無くて教える気がなくなったんなら、
「これ以上簡単には教えようが無い」ぐらいの事を言って終わりにすれば
いいだろう。自尊心を傷つけられてなんで黙ってられるんだよ。
俺だって場所を考えて聞いてるんだ!
まぁ、頭は悪いが自尊心はあると。
それで開き直れるのも2chだからだな。
いや、それでもなんでも、馬鹿にする人間が居る代わり
回答してくれる人間も居るんだからそれでいいじゃん。
実生活じゃこうはいくまい。
だね。相手の顔が見えないからって粋がるなよ。
聞かれる前に答えるが、私はリアルでも言いたいことは言って生きてきているよ。
447 :
デフォルトの名無しさん:04/09/25 22:58:36
>>446 いいたいこと言って生きてちゃだめだろ。
お前は誰がどうみても無能と呼ばれるような聞き方をしてたぞ。
はっきり無能と指摘してくれるのもここならでは。
リアルでは誰もそんなことは言ってくれず、心の中で「こいつ無能だな」と思われるだけ。
これを機に自分を見直せ。
横レスだが。
にっこり笑顔で「次の行に書いてあるよ」といいつつ青筋立ててしまいそうな未熟者の漏れ。
酒の席とか、本人の居ないところであいつは駄目だと上司/同僚に愚痴りそうだ。
450 :
デフォルトの名無しさん:04/09/25 23:30:35
451 :
434:04/09/25 23:34:51
452 :
デフォルトの名無しさん:04/09/25 23:38:24
教えて君が逆切れするスレはここですか。
455 :
434:04/09/26 00:04:04
>>445 俺は頭悪くないから。手順がわからないから聞くのがどうして頭悪いんだよ。
嫌な奴ばっかだ
>>455 手順がわからなくて2chで聞くのが無能以外の何者だというんだ?
C/C++の仕様とかなら膨大すぎるからキーワードくらいのヒントは聞くのはしかたないし、
このスレの存在意義はそこにあると思うけど、
長くも無い説明文に堂々と書いてることを聞くってのは日本語がわかってないとしか思えんじゃないか。
>>455 自分の頭の悪さに気が付いてないって点で、既に頭が悪い。
将来悲惨だよな、お前。痛いよ。
大部分の頭の良くない普通の人は
人に聞かなくても独力で手順を調べる事はできるんです
それが出来ないあなたは、頭が悪くないとしてもやや頭が悪いといわざるを得ないでしょう。
>俺は頭悪くないから
「...お前、クスリやってるだろ?」
「や、やってねーよ」
みんな否定するんだよな
460 :
434:04/09/26 00:19:36
もうええわ
俺は頭悪くないから。手順がわからないから聞くのがどうして頭悪いんだよ。
嫌な奴ばっかだ
もうええわ
>>455 手順がこと細かく書いてあるページを教えてもらってるのに、よく読まずに質問するから
無能と呼ばれるんだよ。
464 :
434:04/09/26 00:45:13
俺は頭悪くないから。手順がわからないから聞くのがどうして頭悪いんだよ。
嫌な奴ばっかだ
もうええわ
465 :
デフォルトの名無しさん:04/09/26 00:46:15
板のレベルを考えなかったお前の負けだな。
あきらめろ。
質問するならもっと簡単なのにしとけ。
466 :
デフォルトの名無しさん:04/09/26 00:59:31
467 :
デフォルトの名無しさん:04/09/26 01:07:02
俺は頭悪くないから。手順がわからないから聞くのがどうして頭悪いんだよ。
嫌な奴ばっかだ
もうええわ
468 :
デフォルトの名無しさん:04/09/26 12:31:36
2ちゃんはクソ
Ruby以外は糞
今さらあれだけど、確認しておくぞ。
2chには、人を不快にするのが好きな人間が屯している。
だから一般の香具師は、それを無視できなければならん。
耐えるしかないんだ。わかったな。
わかったら次の質問をしろ。
2chにはスレ毎に雰囲気がある。
雰囲気は各人の投稿の集約だが各人の投稿が雰囲気に影響されるのもまた事実だ。
人を不快にする発言が憚れる雰囲気を作って行きましょう。
今更な質問よかですか?
deleteとdelete[]の明確な違いってなんでしょう?
X *pX= new X[5];
delete pX;
ってやったらどうなんの?
もう一点。
それは処理系による違いってある?
>472
pX[0]だけdeleteされて他は残る
>>473 g++だと
クラス外で定義してもエラーは出ないですね.
規格では?
ところで「自動インライン」って言うんですか? これ.
476 :
472:04/09/26 14:47:13
>474
え。。。
マジ!?
酷いな。。。
ありがd。
>>476 コンパイル時にはエラーにならなかったりするので注意すべし。
不安だったらテストコード書いとけ。
ちょうどCマガ10月号にnew/deleteをオーバーライドして解放忘れがないかチェックするネタがあるぞ。
>>475 ありがとうございます。
うーん、コンパイラオプションとかでしょうか・・・
VC.net2003で試しているんですが、エラーはきますorz
>自動インライン
インライン展開とかでしたっけ?
inlineキーワードつけないといけなかったんですよね、確か。違ったっけ。
>>472 deleteは非配列形式のnewで生成されたオブジェクトの削除。
delete[]は配列形式のnewで生成されたオブジェクトの削除。
> X *pX= new X[5];
> delete pX;
未定義。
もちろん処理系による違いは有り得るが、飽くまで未定義。
>>474はどっかの処理系においての一例と見るべき。
delete[] とするところを delete ってするのは未定義ですよ
>>478 #include <iostream>
using namespace std;
class cls
{
int i;
public:
friend ostream &operator <<( ostream &s, cls o );
};
ostream &operator <<( ostream &s, cls o )
{
s << o.i << endl;
return s;
}
VC7.1でコンパイルできた。
>自動インライン
これはおそらく、クラス定義内にメンバ関数定義を記述することを指している。
このように定義されたメンバ関数はinline扱いになる。
今思った
struct hoge{
virtual void hogefunc(){}
}
ってやるのは virtual をインラインにしてるから良くないの?
struct hoge{
virtual void hogefunc();
}
void
hoge::hogefunc(){
}
ってやるべき??
別にvirtualをインライン化しても悪くないだろ。
展開できるところは展開されるかもしれないし、遅延束縛もちゃんと機能する。
>>482 コンパイル通りますか・・・
うーん、どうも、違う部分で間違ってる感じですね・・・
ありがとうございます。
もう一度、ソース頭から眺めてみますorz
rand()関数についてお尋ねします。
1と-1の乱数が欲しかったので,rand()を使い
(rand() % 2) *2 -1
として,取り出しました。
本当に散らばっているか,100個くらい表示させてみたのですが,
何度やっても交互に並んでしまいました。
srand(time(NULL))と種を与えた場合も,与えない場合も結果が変わりませんでした。
2種類の数字をランダムに得る方法は何かありませんでしょうか?
rand() % nはあまり性質の良い乱数にならない。
rand() > RAND_MAX/2 ? 1: -1を試してみてくれ。
>>486 最下位ビットは必ず交互に変わるアルゴリズムなのだろう。
なので、上位の方のビットを使えばましになるはず。
#include <iostream>
#include <ctime>
#include <boost/random.hpp>
int
main()
{
typedef boost::mt19937 myengine;
typedef boost::uniform_int<> mydistribution;
myengine mt( static_cast<boost::uint32_t>( std::time( NULL ) ) );
mydistribution ui( 0, 1 );
boost::variate_generator<myengine, mydistribution> myrand( mt, ui );
for( int i = 0; i < 100; ++i )
std::cout << myrand() * 2 - 1 << std::endl;
return 0;
}
>>487-488 教えていただいたようにしましたら,無事解決しました。
ありがとうございました。
# 教えていただいたことをヒントに少し調べてみましたら,
# Linuxのマニュアルには上位ビットを使うように,と書いてあるそうでした。
漏れは参考のさの字にすらならなかったのか・・・(´・ω・`)
処理の内容でなく関数名の付け方についてなのですが、
もとの図形を拡大回転した新しい図形を返す関数としてrotozoom()を実装したとします。
Shape *rotated = source->rotozoom(1.0, PI * 3);
のような感じで使うとして、今度は自分自身を回転する関数名はどう付ければ???
shape->rotozoom() //rotate&zoom and set itself
のように使いたい。
source->set_hoge(source->rotozoom());
とやればいいやん、とは思ったものの、内部の処理の関係上できれば独立させたいなと。
rotozoom_self ???
>>491 参考にして欲しくて書いたんじゃないだろ。
495 :
デフォルトの名無しさん:04/09/26 17:44:27
Ruby >>>>>>>>>>>>>>>>>>>>>>> らんd
>>491 大変失礼致しました。
新着レスを調べずに,実験およびレス書きを行ったため,
アドバイスをいただいていたことに気がつきませんでした。
私如きでは今見ただけではよくわからないのですが,
いつか役立たせていただきたいと思います。
C++で作られた.exeファイルのソースを表示するソフトみたいなのありますか?
るby!!!!!!
502 :
デフォルトの名無しさん:04/09/26 21:23:22
class Hoge{
int n;
public:
Hoge(){ n = 1; }
int get(){ return n; }
};
int main(){
Hoge h;
return h.get();
}
こんな簡単なクラスでもget()を読んだ箇所の
アセンブラを見てみるとcallの字があるのですが、
これはたぶんインライン展開されて無いですよね?いやされてるんでしょうか。
癒されてません
コンパイラのスイッチが入ってないだけみたいでした
書きこんだ瞬間に気づく悲しさ
コピーしてるからじゃないの
>499
無ければ自分で作る!
今独習CでCの基本を勉強しているんですが、それが終わったらC++の勉強を始めるべきでしょうか?
これからいろいろ利用していくことを考えるとC++の方を重点的に勉強しておいたほうがいいような気がするんです。
将来はWindows用の本格的なアプリケーションも作っていきたいと考えているので、
VCの解説でよく使われるC++の方がいろいろ便利な気がします。
しかし、せっかくCの基本を覚えたんだから、それを深く学んでいく方がいいのかもしれません。
皆さんの意見を参考にしたいのですが、どっちの方がいいと思いますか?
>>507 将来的なことを考えたらC/C++以外の言語を習得したほうが良いかもしれん。
特にWindowsアプリの開発ならC++にこだわる必然性は無い。
ということを頭に入れた上で。
C++は純Cに比べて遥かに仕様が膨大で、その理解にはオブジェクト指向の
理解が不可欠。つまり習得するには非常に時間がかかる。
オレが勉強してたときはjavaなんて無い時代だから半ば必然的にC++の勉強したけど、
いまの若い人には正直あんまり勧める気はしない。
あ、Cの勉強は無駄にはならんぞ。
>>490 遅レスだけど、線形合同法による乱数生成だとそうなる。
最近のライブラリはMT(メルセンヌツイスト)導入したものも多いので、
そういうのならそんな性質はないので興味があったら調べてみるのも一興。
っていうかmanにちゃんと書いてある…
"If you want to generate a random integer between 1
and 10, you should always do it by using high-order
bits, as in
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
and never by anything resembling
j=1+(rand() % 10);
(which uses lower-order bits)."
>>508 釣りか?
もしくは、スポーツ選手などと同様で40代前に引退する羽目になるのが嫌だから、
新規参入する若手を減らして競争率を下げたいのかwwwww?
>>507 今や、いきなりC++から入るべきだよ。
Cだけに触れるのは最初だけ。
C++のiostream系はほとんど覚える必要なし。というか時間の浪費。
ポインタ→構造体→自力リスト→自力クラス/MFC/STL→あとは人それぞれ
>C++のiostream系はほとんど覚える必要なし。というか時間の浪費。
>ポインタ→構造体→自力リスト→自力クラス/MFC/STL→あとは人それぞれ
このレベルだと今時C++を使う意味は無いだろ。
配列の引き算の結果について質問なんだけど
T arr[N];
(&arr[N]-&arr[0])ここの結果っていつも「N」になるのが仕様なんですか?
要素数を求めるには最近までsizeof(T*)で割らなきゃあかんと思っていたんだけど違ったんだね。
スレの住人さん仕様なのかどうか?教えてYo。
一応環境はVC7.1、W2KですYo。
あと最近まで要素数求めてた方法はdefineかテンプレート使ってたから引き算なんて初めて挑戦したんですよね。
>>513 仕様ですよ。
sizeof(T*)で割るのは、最適化が期待できないコンパイラでも
定数の畳み込みを期待できるからです。
>>515 ありがとう。スッキリしたYo。
そうか、俺の脳内仕様が古かったのね。
517 :
デフォルトの名無しさん:04/09/27 10:13:28
実行ファイルからソースプログラミングを見る方法ってありますか?
_
以前からの疑問なのですが
「リスト等を全検索して、一つも該当の対象が無ければ処理を終え、該当があれば処理を続ける」
というのを綺麗に実装する方法はあるのでしょうか
gotoを使ったり、小さい関数に分けるなら私にも思いつくのですが…
(useGoto()、及び useSmallFunc()は、配列に8があれば処理を続ける)
int array[10] = { 1, 3, 5, 8, 9, 2, 6, 0, 7, 4 };
void useGoto()
for( int i=0; i < 10; ++i ){
if( array[i] == 8 ) goto GOES_ON;
}
return; //処理中止
GOES_ON:
printf( "処理を続ける" );
}
void useSmallFunc(){
if( small_func( array, 10 ) )
printf( "処理を続ける" );
else
return; //処理中止
}
bool small_func( int* array, int size ){ //順序が逆ですが
for( int i=0; i < size; ++i ){
if( array[i] == 8 ) return true;
}
return false;
}
520 :
519:04/09/27 11:22:48
続きです
void useFrag(){
bool flag = false;
for( int i=0; i < 10; ++i ){
if( array[i] == 8 ) flag = true;
}
if( ! frag ){
return;
}
printf( "処理を続ける" );
}
>>519 for(;;) {
for( int i=0; i < size; ++i ) {
if( array[i] == 8 )
break; // ループから抜ける
}
// 処理
}
こう?
>>521 レスありがとうございます
しかしすいません、私の理解が足りないせいか、それだと
・配列に該当の対象(数字の8)が有っても無くても、処理が続いてしまう
・無限ループになってしまう(処理でもう一度breakするのでしょうか)
様に思えてしまって。
523 :
デフォルトの名無しさん:04/09/27 13:19:44
IDみたいなものを定義したいのですが,
enumでするのがいいでしょうか?
それとも#defineでするのがいいのでしょうか?
#define ID_A 100
#define ID_B 200
enum {
ID_A = 100;
ID_B = 200;
}
どっちでやるか迷います
>>522 > しかしすいません、私の理解が足りないせいか、それだと
>>521の理解が足りないだけなので御気になさらずに
>>523 IDだったらenumの方が良い。
ちなみに、定数にdefineを使う場合があれば、なるべくconst intに置き換えるべき。
すいません
サンクスって書こうとしたらなぜか
間違った変換になりました
>>526 これ、お前か?w
評価: 非常に良い 落札者です。評価者は mana_chiyo (819)
井上和香 DVD「和香物語」 美品( ^-^) (7月 3日 23時 0分)
出品者は「 非常に良い 」と落札者を評価しました。
コメント:商品が届き安心しました。この度は迅速な対応ウンコー!(゚∀゚)!ございました。
またの機会を楽しみにしています。 (7月 12日 18時 46分)
コメント:すみません。僕の辞書が勝手に変な変換をしてしまい、
不快感を与えるコメントをしてしまい大変申し訳ございません。
この度は迅速な対応ありがとうございました。 (7月 12日 19時 7分) (最新) [返答]
ちょっとー笑いすぎて腹痛いんですけど
質問があります。
C++でクラスを作る方針としてクラスは小さい方がいいと聞いたんですが、
クラスごとにファイルを作るとすると、
ファイルがめちゃくちゃたくさんになってしまいます。
皆さんは1つのクラスごとにソースファイルとヘッダファイルを作っておられますか?
>>519 エレガントにか?
C++なら
if(std::find(array, &array[10], 8) != &array[10])
見つかった時の処理
で一発きめれるけど(要するにusefuncかな)
Cなら単純に
for(int i=0; i<10; ++i){
if(array[i]==8){
見つかった時の処理
break;
}
cout<<i<<' ';
}
ごめん間違った続き
Cなら単純に
for(int i=0; i<10; ++i){
if(array[i]==8){
見つかった時の処理
break;
}
}
でしょ。間違ってshift+Enter押しちゃった。
>>537 > 作らない。
即レス、ご教授感謝します。
関連があるクラスは一つにまとめるんですか。
(まとめすぎてヘッダファイルが大きくなってしまう場合は、どうなるんでしょうか)
この本は早速買ってきますw
>>524 >>528 なんだか今見返すと、嫌みっぽくて、すいませんでした。
本当に習いたてで、右も左も分からないだけですので…。
>>535-536 C/C++以前勉強してたのがBasic(VBではなく)だったので、
どうしてもGOTOによる流れが真っ先に念頭に浮かんでしまいました。
そのままifの条件文内で処理すれば良かったのですね。
STLも勉強してみます。レスありがとうございました。
class Derived : public Base
{
public:
Derived() : Base() {} //これ
}
派生のコンストラクタに使うあの右の奴の事をなんて言うものですか。
コンストラクタ以外でも使えますか?
Derived() : Base::Init() {}
とか
>>540 右の奴の事はコンストラクタ初期化子と呼ぶが、別に「派生の」
に限らない
デフォルトコンストラクタとコピーコンストラクタがあればできなくは無い。
Derived() : Base(Base().Init()) {}
Derived() : {Base::Init()}
じゃいかんのか?
ネームスペースが二文字というのは短すぎますか?
namespace xx;
namespace xxx;
namespace xxxx;
namespace xxxxx;
namespace xxxxxx;
それに短い方が打ちやすい
5文字までなら許せるけど6文字以上からは毎回打つにはちとキツイし
C++において宣言と定義について詳しく教えてくれませんか?
int a; は宣言で
int a = 0; は定義?
>547
定義でもある宣言とか書いてあってよく分からないんです
int a;
a=0;
と同義w
int a=0,b=a,c=b;
int a; が変数の宣言なのは分かったんですが
変数の定義はないんですか?
ぬるw
ぽw
>>552 定義というのは宣言に内包されているもの。
しかし、
type name(type、・・・);
extern type name;
struct(class) name;
こういう形のものは定義と呼ばれることはない。
宣言とは、コンパイラに認識可能な名前を導入する記述。
宣言の後であればコンパイラはその名前の意味を認識することができる。
定義とは、宣言された名前に対応する本体の記述。
定義は、それが対応する名前を確実に知るために、必ず宣言を含んでいる。
下記のようなクラス階層の時、
class a
├class b
│ └class c
├class d
└class e
└class f
class c から class d,e,f(階層上自分から見えないクラス) にアクセスしたい場合、
1.class c に class d,e,f のポインタを持たせてアクセスする
2.class c に class a のポインタを持たせてそれを経由する形でclass d,e,fにアクセスする
どちらが一般的なんでしょうか?
>>558 2では所有関係の逆参照になってしまうので、それを嫌って1のほうがマシに思える。
そういう階層ができてるというのなら、アクセスしないのがもっと一般的だとは思うけど。
コンストラクタで初期化に失敗した(ファイルを開くことができなかった、など)場合、
例外を投げるべきか、それとも取りあえず黙って受け入れて
bool Foo::valid() const { return handle_ != 0; }
のような関数で各自チェックしてくださいね〜とするのとどちらがよいのでしょう?
後者の場合、強制はできないので
int Foo::do_something() {
if (!handle_)
return -1; //とか、例外を投げるとか
//何かする。
}
のように他の関数でもいちいちチェックしなければなりませんよね?
それとも、コンストラクタを全部private or protectedにして
Foo *Foo::create() {
//いろいろチェック。ダメならすぐ0返す
return new Foo(/* 全部OKなparameters */);
}
Foo *f = Foo::create(/* parameters */); //失敗したら0がかえってくる
f->do_something();
のようにするのとどっちが良いのでしょう?
>>560 例外が問題なく使えるなら投げるのが正解。
事情があって例外を投げることができない場合の最善手は難しいが、
「それとも〜」以下の手法は有効だと思う。
戻り値を std::auto_ptr<Foo> にすると少し嬉しいかも。
非常に分岐が多い場合、効率を上げるためにswitchの代わりに関数ポインタの
配列を使うのが有効ですが、これを通常の関数の代わりにinline関数で
行うことって可能でしょうか?
もしくはgotoのジャンプ先を、ifやswitchなどの分岐数の増加で効率が落ちる
制御命令を使わずに、動的に変更する方法ってないでしょうか?
質問です。
CreateProcessでコンソールプログラムを起動するときに、
リダイレクトの標準入力をしてする方法が分かりません。
標準出力に関するサンプルは多いのですが・・・
あ、因みにvirtualにすると実行速度は遅いけどYo
>>564 だいたい標準出力と同じだよ。
ところどころ引数を気をつければ平気。
>>541 >>542 コピーコンストラクタはちょっと手間がかかりそうな気がしますが、
中括弧{}は便利ですね。switch文のcaseラベル内でも使えるし、
マクロでもまとめられるし何でも使えますね。
レスありがとうございました。
>>570 ファイルをベクタみたいに使ってみたかったので、
同じインターフェイスにしてみました。
Win32ならメモリマップドファイルがあるんでそっちを使ったほうがいいと思うが。
目的が良くわからん。
たんなるオブジェクトの永続化か、メモリに常駐できないような巨大なデータを扱うのかで
より良い実装方法があると思うんで。
キャッシュの持ち方やファイルアクセスの仕方あたりをポリシー化してみたらどうかね?
今日こそはconstを有効に使うぞと思いつつ
なんだかんだで断念する日々が続いております。
とか言うとネタみたいですが、実際皆さんconstをきちんと使ってるんでしょうか。
周りはなんか適当な人ばかりです。C++です。
そりゃ使うだろ
適当な人との関わりはたった方がいいかもよ
>>573 その程度のプログラムだと、有効に使うことはできないよ。
>>575 自分は自分自身に対してはいつでも的確だよ。
レスサンクスです、曖昧な質問のせいで微妙に荒れちゃってすんません
最近はconstが無い言語も多いみたいなので、
こんなもんでもいいのかなと思ってました。
例えばメンバクラスを返すgetterがあった場合、
constと非constの両方用意した方が良いんでしょうか?
>>561 ありがとうございます。疑問が晴れました。
インライン関数はヘッダファイルのどこに書くのがよいですか?
・クラスの宣言内に。
・クラス宣言の外、その直後辺りに。
・どっちでもいい。
>>580 ・クラス定義内に定義
・クラス定義内で宣言、クラス定義後に定義
・クラス定義内で宣言、別ファイルに定義してクラス定義後に #include
下に行くほど面倒になるのと引き換えに、
メンテナンス性などでメリットがある。
>>563 >>565 現状がそもそも検索の必要もなく普通の関数ポインタの配列で
オーダー(1)で分岐先を判別できてまして(分岐条件の変数が
そのままインデックスになってる)、呼び出し回数の多い場所
だったので効率化のためにinline展開したかったので、折角教えて
もらったんですが自分のケースには使えそうにないです(´゚ω゚`)
asmでjmpの配列を作るのが現状にジャストフィットなんですが、
かなり面倒だったので似たようなことがCでもできないかな〜と
思ったんですが、関数ポインタの配列や関数オブジェクトの配列以外では
飛び先を配列化する方法は無さそうですね。。。
どうもでした。
>>584 ラベルのアドレスをポインタにできる。まさに今欲しい機能がそれっすよ。
gccだけなのかぁ。VCにも欲しい機能だった。
>>585 関数の辺値を配列のインデックスに合わせれば言いだけの話のような・・・・
関数の辺値?
だれかサンプルソース書いてください。お願いします。
>>588 STARTUPINFO dwFlags STARTF_USESTDHANDLES hStdInput
パーツを教えてやるよ。あとは自分で考えな。
>>589 ありがとうございます。がんばってみます。
// Set up the security attributes struct.
SECURITY_ATTRIBUTES sa;
sa.nLength= sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
//入力ファイルのハンドル
HANDLE hInputRead,hInputWriteTmp;
CreatePipe(&hInputRead,&hInputWriteTmp,&sa,0);
// 起動するウィンドウの状態
PROCESS_INFORMATION procInfo;
// 新しいプロセスの情報
STARTUPINFO startInfo;
GetStartupInfo( &startInfo);
startInfo.dwFlags = STARTF_USESTDHANDLES;
startInfo.hStdInput = hInputRead;
//起動
bool bret;
bret = CreateProcess(
"D:\\aaa.exe", // プロセスのパス(EXEのパス)
" < D:\\bbb.in",//"",// プロセスへのコマンドライン
NULL, // ハンドル継承(プロセスへのセキュリティ)
NULL, // ハンドル継承(スレッドへのセキュリティ)
TRUE, // ハンドル継承を行うか否か
CREATE_NEW_PROCESS_GROUP,// プロセスタイプおよび優先順位
NULL, // 環境ブロックのポインタ
NULL, // プロセスのパス
&startInfo, // 起動状態
&procInfo); // プロセスの情報
//開放
CloseHandle(hInputRead);
CloseHandle(procInfo.hProcess);
CloseHandle(procInfo.hThread);
>>591が現在のソースです。exeは立ち上がりますが、標準入力されていない状態です。
どこを変更すればよろしいでしょうか?
昨日の朝からやっているんですが、どうにもだめな状態です。
ご指導お願いします。
ウザ杉
>>592 まずはどこでコケてるか絞り込め。
戻り値を調べたり、場合によってはGetLastError()でエラー詳細を調べるとか。
最低限これくらいやれ。
>>594 こけはしません。
普通にexeが立ち上がるのですが、標準入力がされていない状態です。
どうするば標準入力されるかが分からない状態です。
アフォ杉
実際にどのようにコンパイルされているかを学ぼうと
今更アセンブラを勉強中です。
VC6の混合モードを使ってみたところ、シンボル付きで大変分かりやすく
これなら俺にも理解できるぜわーい、なんて思ってたのですが、
考えてみるとRelease時は最適化等で、全く別のコードになりますよね。
Release時のものを、シンボル付きで見る方法は無いのでしょうか。
思いっきり環境依存の質問ですがお願いします。
>>591 おいおい、" < D:\\bbb.in"ってリダイレクトしちゃっているじゃないか。
リダイレクトがシェルの仕事だということを理解して内容だな。
DuplcateHandleとかdupあたりを調べてから出直して来い
>>597 VC6なら「プロジェクトの設定」の
C/C++タブ:
カテゴリ「一般」の「デバッグ情報」を「プログラムデータベースを使用」
リンクタブ:
カテゴリ「一般」の「デバッグ情報を出力する」をチェック
で Debug ビルドと同じように混合モードで見ることができる。
それか、
C/C++タブ:
カテゴリ「ファイルリスティング」の
「リスティングファイルタイプ」を「マシン語コードとソースを含む」
で、Release フォルダに生成される .cod ファイルを読む。
>>600 ウヒョヒョヒョヒョヒョヒョヒョ
取り乱すぐらい上手くいきました。
これから色々試したり見たりするのが楽しみでならないです。
詳細なレスありがとうございました。
atexit()で指定した関数が呼ばれるのと、クラスのstaticメンバのデストラクタが呼ばれるのと
どちらが先でしょうか?
gcc3.2.4では前者の方が先のようですが何かできちんと定められています?
ありがとうございます。よく分かりました。
605 :
デフォルトの名無しさん:04/09/30 06:43:48
0xと頭にくれば、16進数です。
607 :
デフォルトの名無しさん:04/09/30 07:12:07
>>606 そういえばそんなのがあった気がしました、どうもです
天然かよ
だとしたらスゴイ
611 :
デフォルトの名無しさん:04/10/01 11:17:49
c99に対応したコンパイラを教えてください
613 :
デフォルトの名無しさん:04/10/01 13:49:49
質問です。お願いします。
ファイル検索できるランチャ作ろうと思うんですけど何で作るか、何が作りやすいか教えてください。
一応候補はVBNET−c++−c−JAVA−です。
614 :
デフォルトの名無しさん:04/10/01 14:26:30
>>613 HSPがいいが、その中ならVB.NET
リダイレクト自己解決しました。
// 起動するウィンドウの状態
PROCESS_INFORMATION procInfo;
// 新しいプロセスの情報
STARTUPINFO startInfo;
GetStartupInfo( &startInfo);
//起動
bool bret;
bret = CreateProcess(
"C:\\WINDOWS\\system32\\cmd.exe", // プロセスのパス(EXEのパス)
"/C D:\\aaa.exe < D:\\input.txt >D:\\out.log",//"",// プロセスへのコマンドライン
NULL, // ハンドル継承(プロセスへのセキュリティ)
NULL, // ハンドル継承(スレッドへのセキュリティ)
FALSE, // ハンドル継承を行うか否か
CREATE_NEW_PROCESS_GROUP,// プロセスタイプおよび優先順位
NULL, // 環境ブロックのポインタ
NULL, // プロセスのパス
&startInfo, // 起動状態
&procInfo); // プロセスの情報
//開放
CloseHandle(procInfo.hProcess);
CloseHandle(procInfo.hThread);
最初と方向性が変わってしまいましたが、
なんとか出来ました。
皆さんありがとうございます。
617 :
デフォルトの名無しさん:04/10/01 15:56:37
vbはやめとけ
どうしてもradがいいならc++builderつかえ
system("D:\\aaa.exe < D:\\input.txt >D:\\out.log");
619 :
デフォルトの名無しさん :04/10/01 19:42:08
cコンパイラの設定を行ってるのですが全て正しく行ったのに
【'D:\' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。】
と表示されてしまします。どなたか原因がわかる方いましたらお願いします。
>>619 D:\
というコマンドは存在しないから。
623 :
デフォルトの名無しさん:04/10/01 20:39:58
D:\ではなくてD:\>bcc32です。
パスに【c:\Borland\Bcc55\bin】追加済み。
システム環境変数『Path』設定済み(変数+;c:\Borland\Bcc55\bin)
bcc32.cfgファイル、ilink32.cfgファイル作成済み。
これでエラーです。
どなたか原因解明お願い致します。
>>623 bcc32
とだけ入力したあとでDOSの勉強しろ。
625 :
デフォルトの名無しさん:04/10/01 20:51:22
>>624 できました!
どうもお手数かけましてすいません。。
ありがとうございます。
626 :
デフォルトの名無しさん:04/10/01 21:06:04
コマンド プロンプトでC:\の後にDocuments and Settings\mikami>
と表示されてしまうんですが消せますか?
また消し方わかるかたいたらお願いします。
prompt
>>626 Windows板かPC初心者板へどうぞ。
//help prompt
class A {
public:
A(int id): id_(id) {}
A(int id) { id_ = id; }//ダメ
~A() {};
void func() { id_++; } //ダメ
private:
const int id_; //<--
};
メンバ変数のconstというのはコンストラクタで初期化したあとは
一切変更できない、という理解で良いですか?
自分の読んでいる本ではメンバ変数のconstについて何も触れていなかったので。
>>629 そのとおり。
しかし、そんな本は読むだけ無駄。窓から捨てろ。
いや、これはマジな話。
入門書は定評のあるものを読んだ方が絶対に良いよ。
メンバをconstにするとなると、コンストラクタの充実が必要だな。
さもなければ、そもそも何故staticにしないのかと突っ込まれそうだ。
632 :
デフォルトの名無しさん:04/10/02 02:19:52
質問です。VC++で構築したプログラム(ただし、一般的な
関数しか使わない)をWinで動かした計算結果と、*.cppおよび*.h
だけをUNIXに持ってきてgccでコンパイルして作った実行ファイル
をUNIXで動かした計算結果が全く異なるということが起こった
のですが、考えられる原因は何かありますでしょうか?
その聞き方でわかるやつは神
>>632 どんな計算をしてるのかも分からないんじゃ
特別何といいようもないような
実は浮動小数の書式化方法が違うだけで計算結果はまったく同じだったりしてな
”一般的な関数”と”標準ライブラリ内の関数”じゃ大違いだぞなもし。
>>630-631 ありがとうございます。読んでいるのはEssential C++です。
メンバ関数のconstや、mutableメンバ変数については解説されていたのですが。
「書いていない」というのは自分の勘違いかもしれないです。
使い道としては、何らかのID番号とか、生まれたときに一度決まったら
そのオブジェクトが無くなるまで終生変わらない属性、人間で言えば性別とか、に付けるべき、ということですね?
>メンバをconstにするとなると、コンストラクタの充実が必要だな。
>さもなければ、そもそも何故staticにしないのかと突っ込まれそうだ。
すみません。この部分がよく分からないのです。
>>637 あー、Esseintial C++なら捨てる必要は無いわw
でも、こら、const変数の扱いなんか、読者は当然分かってるって
前提の本だからなぁ。
値は張るけど「プログラミング言語C++」は読んどいた方がいいよ。
constメンバ変数の役割についてはその理解でよいです。
static云々については俺も分からんw
>>637 俺は
>>631ではないけれども、おそらくstaticについて
>>631の意図する
ところは、「例えばコンストラクタのイニシャライザで定数を代入して
いたりすると、そのようにしたい時にはstatic constメンバにするのが
普通だろうという突っ込みを受けるだろう」ということだと思う。
>>629についてはconstのまま(static不要)でいいだろうと思うが。
>>638-639 ありがとうございます。捨てる必要が無くてホッとしました。
プログラミング言語C++は店頭で見かけたものの、1000ページ超という厚さに圧されスルーしていました。
今の本を読み終えたら、さっそく通読す・・・るのは大変そうだけど辞書代わりに使えそうですね。
>「例えばコンストラクタのイニシャライザで定数を代入して
>いたりすると、そのようにしたい時にはstatic constメンバにするのが
>普通だろうという突っ込みを受けるだろう」
#include <iostream>
class EssentialCplusplus {
public:
EssentialCplusplus() :price_(3600) {}
int price() const { return price_; }
private:
const int price_; //再販制度?
};
//のように「コンストラクタのイニシャライザで定数を代入していたりする」よりも
class yaEssentialCplusplus {
public:
int price() const { return PRICE; }
private:
static const int PRICE = 3600;
};
//ya...の方がオブジェクト毎に無駄なメンバを持たないし、普通の書き方だ、という理解で良いですね?
//あまり良い例が思い浮かばなかった・・・。
int main(int argc, char *argv[])
{
yaEssentialCplusplus book; //yaEssentialCplusplus book(); と書いて今までずっと悩んでいた。
std::cout << "昨日の本代は、" << book.price() << std::endl;
return 0;
}
その例だと、オプティマイズによってメンバの実態は消えてなくなるけどね。
寧ろ、3600円が普遍的ではないので私ならstaticにはしないだろう。
C++は糞
つかてるやつも糞Ruby!!!!!!
Ruby >>>>>>>>>>>>>>>>>C++
Ruby!!!!!!!!!!!
Ruby >>>>>>>>>>>>>>>>>>>> Ruby!!!!!!!!!
Ruby!””””””””””””””””””###########3
644 :
デフォルトの名無しさん:04/10/02 06:39:12
Rubyは最強言語!!!!
C++なんて論外^^;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Ruby >>>>>>>>>>>>>>>>>>>> C++++++++
実行速度でもRuby .???????????>>>>>>>>>>>>>>>>>C++++++++
Javamなんてうんjこいp!
Perlはもうメンテされてmせん。
Ruby誇らしい出宇sね。
Rubyは超言語!
649 :
デフォルトの名無しさん:04/10/02 12:22:34
int i=5;
int a[i]
はエラーがでるそうなのですが
配列のサイズに変数を指定する必要があるとき、エラーがでないように
する他の方法ってないのでしょうか?
変化するサイズの変化量を見越して多めにサイズとるしか方法はないのでしょうか?
iに5が代入されてるから定数と変わらないような気がするんですけど…
なんでなんだろう…
vector使う
enum{ i=5 };
>>649 > はエラーがでるそうなのですが
せめて自分でコンパイルして確認してから質問に来てください。
#include <vector>
してから
int i=5;
std::vector<int> a(i);
C++のメソッド内で起きたエラーの扱いに関してですが、
実行環境に依存するエラー(ex:ファイルが存在しない)を通知する場合
・メソッドの戻り値としてエラーが発生した事を返す
・std::runtime_errorを投げる
・std::exceptionから自前の派生クラスを定義してそれを投げる
などが考えられますが、どれを使うべきでしょうか?
>>649 int i = 5;
int *a = new int[i];
delete [] a;
>>655 返り値で通知するか例外投げるかは設計次第だが、そこでなんで
・std::runtime_error派生の独自例外クラス
という選択肢がない?
ファイルが見つからないといった想定できるエラーケースでは戻り値で返すのが
いいんでないの?
ただ、コマンドパターンとかプロクシパターンとかの複雑な処理の中で、
中から呼び出し元に例外(エラー)を伝えるんだったら例外のほうがすっきり
する場合があるよね。
エラーするかしないかの二値しかない場合はエラーコードで。
エラーにバリエーションがあるけどコードで済む場合
(エラーの原因が渡したパラメータ*のみ*に依存する場合なんかね)もエラーコードで。
渡されたパラメータに依存しない(メモリ不足で継続不能とか)は例外で。
呼び出し元にエラーの詳細情報を送り付けたいときも例外で。
原理主義すぎるかもしれないけど、エラーを返すのが目的の関数でもない限り、
戻り値にエラーコード入れるのは違うと思う。
C 系言語は関数のシグネチャで戻り値に名前をつかられるようになってないので、
戻り値は出来るだけ関数から自然に想像できる値だけにして、
それ以外は例外か、最悪ポインタ渡しにしたほうがいいと思う。
errnoってのもあるし。
C++ の STL は積極的に使うべきなの?
使えるときはね
>>662 サンクス。
通常の配列で処理可能のケースでも vector とか使うほうがエエの?
664 :
デフォルトの名無しさん:04/10/02 13:32:57
>>650 調べてみます
>>651 調べてみます
>>652 iはいろいろな数字に変化するようにしたいので…
>>653 実際には構造体の配列変数でやってる時に”C2057定数式が必要です”というエラーがでまして
F1で調べて見ると簡単な例として
>>649みたいな例が載ってたのでその例を元に質問をしてみました
実際には
struct a b[i]
みたいに使っててエラーがでました
>>654 調べてみます
>>656 調べてみます
レス下さった方々ありがとうございました
まだ初心者なので
皆さんのレスを参考に調べてわからないとこがありましたらまた質問するかもしれないので
その時もよろしくお願いします
>>663 他の箇所でvectorなどを使っている場合は、一貫性を示すために使う場合もある。
一貫性が重要。
vectorは遅い。
窓の杜でいいじゃん。
仕様の段階で固定個数であることが自明なら配列、
それが必要になった段階で個数が確定している状況ならnew、
そうでないならvectorだなぁ。
標準ライブラリには auto_array がついてないので new 配列は使用禁止。
>>665-669 ベリーサンクス!
vector の最大の利点は動的にサイズ拡張できる、ってことですかね?
VisualBasic の ReDim みたいな。
まだ勉強中なので >669 の言ってる意味がわかりません。スマソ
vectorならdeleteする必要がない
newと違ってやりっぱなしでいい。
boost::scoped_array
それ標準じゃないしい
やはりいろいろな思想があるようですね
>>657 ソレダ⊂(。Д。⊂⌒' つ
何で気づかなかったんだ
boost::array
また、「vectorは遅い」厨が湧いてきたか・・・。
知ったかぶりして恥ずかしくないのかねぇ。
vectorはわりと速いよ
それは前に実証済みだったと思うけれど…
正しい使い方しないと遅いけどな。
vectorは生配列よりは要素アクセスも遅いよ。まあ常識だけど。
生のポインタアクセスと同じ速さにしたければ
T *ptr = &vec[0];
みたいにポインタを取ってからポインタ演算して使う。
これも常識だけど。
脳内常識をムキになって披露しなくていいのに。
なにか嫌なことでもあったのかな。
コンパイラや実装にも依ると思うが
[]使ったアクセススピードは大抵の場合、全く同じかほぼ同じぐらいのレベルだろ
と思って書き込む前にリロードしたら
>>681 …?
測定:生配列 ポインタ 使用した時間 641
測定:すべてをポインタにした vector 使用した時間 1903
なんでこんなに違うんだ?
明らかにおかしくないか
本当かよ?って思ったから実際やってみたぞ。
VC7.1で、/O2付きSTLportだ。
>array:80.306[ms]
>vector:80.0303[ms]
だったぞ。全然かわらんではないか。
まあ速度が重要ならこうアクセスするのはvectorの基本だよ。
int *p = &vec[0];
int s = vec.size();
for(int i = 0; i < s ; ++i)
{
p[i] = x;
}
ポインタ値を直接増減させるよりp[i]のように
ポインタ値にインデックスを加算する方が早いらしいね。
>>684の見て安心した
測定:生配列 ポインタ 使用した時間 641
測定:すべてをポインタにした vector 使用した時間 1903
の例とか見ても
>>681のサイトは明らかにおかしいし、
大抵のコンパイラならvectorの実装を見てもそんなに遅くなる分けないし
688 :
デフォルトの名無しさん:04/10/02 23:08:47
Ruby >>>>>>>>>>>>>>>>>>>>>>Vector
Vector >>>>>>>>>>>>>>> 窓の杜
>>685 vectorに関する勘違いの基本だな。
大抵の実装を見ても、vectorが生ポインタより明らかに遅くなる要素は見あたらないからね。
配列と比較しての、生成/破棄のコストを除いて。
あえて違いを挙げるとすれば、
classのメンバは必ずメモリ上に置かれるので
レジスタに割り付けられる可能性の高い生ポインタより
ベンチ上は若干遅くなる可能性はあるかもしれないけど。
692 :
デフォルトの名無しさん:04/10/03 09:27:52
struct a b[i];
をvectorを使って
std::vector<struct a> b(i);
と書き換えたのですが
0x7c941230 でハンドルされていない例外が発生しました : ユーザー設定のブレークポイント。
というエラーが実行中に出て
xmemory internal header (from <memory>)
のoperator delete(_Ptr);という行が表示されました
どうすればうまくいくのでしょうか?
>>692 うまく代入出来てないだけでは。
例えば、struct aのコビーコンストラクタとoperator=がうまく動いてないとか
(お持ちの方がいればAccelerated C++、206ページの話です)
初歩的なことですがC++で質問です(現在、C++言語の基礎を学習中)。
vectorを大まかに再現したクラスを作成中です。
そのデストラクタを作っているのですが、それぞれのデータ要素の
破棄をした後にメモリを解放するのはなぜでしょうか?
というより、メモリを解放してもデータ要素は残るものなのでしょうか?
ちなみに、<memory>ヘッダにあるallocatorクラスの、destroyとdeallocateを
つかっています。
>>694 構築されたデータは適切に解体されなければならない。
たとえばそのvectorに次のようなクラスを入れることを考える。
struct test
{
test() :p(new int){}
~test(){delete p;}
private:
int *p;
};
testのインスタンスが構築されるだけで解体されないとメモリリークが起こる。
一般に、クラスは正しく解体されることを前提として設計されているから、
コンテナを書くときは要素を破棄しないといけない。
>というより、メモリを解放してもデータ要素は残るものなのでしょうか?
std::allocator<test> alloc;
test *g = alloc.allocate();
alloc.construct(p);
alloc.deallocate(p);
*gのデストラクタが呼ばれないから、このコードはメモリリークを起こす。
訂正。
>alloc.construct(p);
>alloc.deallocate(p);
alloc.construct(g);
alloc.deallocate(g);
>>695 ありがとうございました。
クラスを入れる場合、破棄しないとそのデストラクタがさぼってしまう
てことですよね。ということは逆に考えると、
(再利用性や現実味は置いといて)組み込み型のみを入れ、初期化を
ちゃんとするなら破棄はあってもなくても問題は起こらないのでしょうか?
連続質問すいません。コンストラクタむずい・・・。
>>697 その通り。
#include <cstdlib>
void f()
{
int *p = std::malloc(100 * sizeof(int));
/* ここでpをつかう */
std::free(p);
}
C言語ではこんな感じでよく使われる。(malloc/freeはallocator::allocate/deallocateに相当)
>>697 たぶん問題ないんじゃない?
C++でもmalloc/freeは使えるんだから。
>>693 レスありがとうございます
要素数がiしかないのにi+1個の要素を入れようとしてたためにエラーが起こったようです
おかげさまで無事解決しました
>>697 オブジェクトの寿命と、オブジェクトを配置するメモリの寿命は分割し得るということ。
703 :
デフォルトの名無しさん:04/10/04 06:46:50
struct a {
float x1,y1,x2,y2;
};
std::vector<struct a> b(20);
b[1].x1=10;
としてもb[1].x1に10が代入されてないのですけど
なぜでしょうか?
>>703 > b[1].x1に10が代入されてない
何を見てそう思ったの?
705 :
デフォルトの名無しさん:04/10/04 07:14:37
>>704 HDC hdc;
TCHAR szBuf[32];
hdc = GetDC(hWnd);
wsprintf(szBuf, "%d", b[1].x1);
TextOut(hdc, 1, 1, szBuf, lstrlen(szBuf));
ReleaseDC(hWnd , hdc);
で画面にb[1].x1の内容を表示させたら0が表示されました
>>705 代入と表示の間のコードはどうした?
なるべくソースを貼りたくない気持ちはわからんでもないが、
それじゃぁ何も知らない他人に教えてもらうことは期待できないぞ。
>>705 > wsprintf(szBuf, "%d", b[1].x1);
floatじゃなかったのか?
708 :
デフォルトの名無しさん:04/10/04 07:30:46
>>706 代入と表示の間のコードはこれだけなんですが…
b[1].x1=10;以降は配列bはいじってないです
>>706 >>707 struct a {
float x1,y1,x2,y2;
};
を
struct a {
int x1,y1,x2,y2;
};
にかえたらうまいこといきました
レスありがとうございました
それと、初歩的な質問なんですけど
なぜfloatだと0が表示されるんですか?
"%d"はint型を処理する。float, doubleを渡したときは何が起こるかわからない。
"%f"はfloat, double型を処理する。char, short, int, longを渡したときは何が起こるかわからない。
711 :
デフォルトの名無しさん:04/10/04 08:59:34
>>710 丁寧にご説明ありがとうございます
floatを表示させたいので早速
struct a {
float x1,y1,x2,y2;
};
wsprintf(szBuf, "%d", b[1].x1);
を
struct a {
float x1,y1,x2,y2;
};
wsprintf(szBuf, "%f", b[1].x1);
に変更したところ
画面には”f”という文字が表示されてしまいました
なぜでしょうか?
wsprintfが対応してないから
sprintf使っとけ
714 :
デフォルトの名無しさん:04/10/04 09:18:04
>>712 >>713 即レスありがとうございます
早速
wsprintf(szBuf, "%d", b[1].x1);
を
sprintf(szBuf, "%d", b[1].x1);
に変更したところちゃんと表示されました
レスのために貴重な御時間をさいてくださってありがとうございました
>レスのために貴重な御時間をさいてくださってありがとうございました
こういうことを書かれても、ちょっと調べれば判ることを質問された後だけに
誠意の欠片も感じられない気がする恭子の頃。
716 :
デフォルトの名無しさん:04/10/04 10:29:04
std::stringstream変数をクリアーしたいのですがどうすればいいのでせう?
717 :
デフォルトの名無しさん:04/10/04 10:43:12
int h;
float x;
h=10;
x=h*10.0;
とすると
warning C4244: '=' : 'double' から 'float' に変換しました。データが失われているかもしれません。
という警告が出ます
x=h*float(10.0);
とすると警告がでなくなるのですが
10.0がdoubleだから警告がでるのでしょうか?
x=10.0;としても警告でないから10.0はdoubleじゃないような気もするし…
なぜ警告が出るのでしょうか?
>>716 std::stringstream foo;
foo.str("");
>>717 10.0 は doube。
10.0f が float。
>>718 おーそんなふうに使うのか
レスありがとうございますです
演算途中に倍精度型が含まれてると、その部分だけ式の両辺が倍精度型に
格上げされてから演算が行われる。
結果の格納先が単精度型だと、倍精度が単精度型に変換されるんで、
いちいち変換処理が入って無駄が多い。
どうしても単精度がよければ式に倍精度型が含まれないようにいちいち
気を配ってやらなきゃいけない。
データがでかすぎてメモリが足りなくて、かつこれ以上アルゴリズムの改善も
出来ないという場合でなければ、倍精度型を常用したほうがいいよ。
>>719 なるほどx=h*10.0;をx=h*10.0f;とするとエラーが出ませんね
x=10.0;は右辺がdoubleなのになぜ警告が出ないんでしょうか?
>>721 どうしても単精度をつかわないといけないんです
>どうしても単精度がよければ式に倍精度型が含まれないようにいちいち
>気を配ってやらなきゃいけない。
x=h*10.0f;このようにfをつけて10.0を単精度に変換すればいいということでしょうか?
すごく勉強になりました
ご返答ありがとうございました
723 :
デフォルトの名無しさん:04/10/04 14:25:54
質問です。
自作のプログラムですが、外部ファイルのデータを10MBほど読み込んで
そのデータに基づいてプログラムが動きます。
この外部ファイルデータをプログラムに埋め込みたいのですが
うまくいきませんでした。データを16進ダンプして0x00〜0xFFに置き換え、
以下のようにunsigned char配列に格納しようとしました。
unsigned char array[] = {
#include "data.h"
};
しかし、配列サイズが大きすぎて最大メモリ割り当てを超えてしまいました。
VC++.NETです。/Zmオプションも使いましたが変化ありませんでした。
こういう巨大データをプログラムに埋め込む場合、どうすりゃいいのでしょうか。
staticにしる
725 :
723:04/10/04 14:49:17
>>724 staticですか。試してみます。
しかし実は、この配列をプログラム内ではさらに構造体配列に
マップしようと思っています。そういうのはアリなんでしょうか。
sturct abc {
float xyz[3];
float col[4];
} *ddd;
のような構造体があったとき、
ddd = (struct abc *)array;
のようなことをしたいのです。本当はクラスをマップしたいのですが、
メンバ関数や継承データのことを考えると難しそうなので構造体にしました。
727 :
デフォルトの名無しさん:04/10/04 15:24:02
winapp error LNK2019: 未解決の外部シンボル _main が関数 _mainCRTStartup で参照されました。
winapp fatal error LNK1120: 外部参照 1 が未解決です。
このようなエラーが出てしまいます。初心者なのでどうやって解決していいか分かりません。
教えてください。
>>727 "_main が関数 _mainCRTStartup で参照されました。"の文をGoogleで検索してみな・・・
729 :
デフォルトの名無しさん:04/10/04 15:45:32
有難うございます。そこで、win アプリケーションでしたところ、ビルドは
できたのですがデバッグで、このようにでました。
'WinApp.exe': 'C:\WINNT\system32\NTDLL.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'WinApp.exe': 'C:\WINNT\system32\KERNEL32.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'WinApp.exe': 'C:\WINNT\system32\USER32.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'WinApp.exe': 'C:\WINNT\system32\GDI32.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'WinApp.exe': 'C:\WINNT\system32\imm32.dll' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'WinApp.exe': 'C:\WINNT\system32\ADVAPI32.DLL' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
'WinApp.exe': 'C:\WINNT\system32\rpcrt4.dll' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
プログラム '[1760] WinApp.exe: ネイティブ' はコード 87 (0x57) で終了しました。
これはなんですか?
>>729 "必要な DBG ファイルが見つからないか、開けません。"をGoogleで
っていいかげんにしろコラ
732 :
デフォルトの名無しさん:04/10/04 16:38:57
クラスをvecter使って管理しようと思うのですが
やっぱりポインタを使ってvecterで管理するのが一般的ですよね?
でもポインタで管理するとリークの心配があるかなぁ?
ポインタで管理と実態で管理、どっちがC++ではいいのでしょうか?
ポインタを使わないでやった事ある人いませんか?
>>732 そのクラスがコピー不可orコピーにかかるコスト大ならポインタでやればよろし。
リークしたくないんならboost::shared_ptr使え。
ポインタ面倒ならスマートポインタでも使え
>>733-734 どうもです。
作りとしてはこれでいいのですよね?↓
#include <vector> // STL std::vector<>
class Data
{
public :
int a;
int b;
} ;
std::vector< Data > DataVecter ; // Dataを管理してあとで使いたい
int main()
{
{
Data X;
Data Y;
Data Z;
X.a = 100;
X.b = 100;
Y.a = 200;
Y.b = 200;
Z.a = 300;
Z.b = 300;
DataVecter.push_back(X); //ここで入れてみる
DataVecter.push_back(Y);
DataVecter.push_back(Z);
}
int a = DataVecter[2].a; //この辺で使ってみる
return 0 ;
}
C++ as better Cかな?
>>735 その目的なら、適切なコンストラクタを用意して、
DataVector.push_back(Data(100, 100));
DataVector.push_back(Data(200, 200));
DataVector.push_back(Data(300, 300));
でいいね。
つか、それなら
Data X;
X.a = 100;
X.b = 100;
DataVecter.push_back(X);
X.a = 200;
X.b = 200;
DataVecter.push_back(X);
X.a = 300;
X.b = 300;
DataVecter.push_back(X);
で良いんでは?
>>737でいいじゃん
簡単に書けてRVOも効きそうだし
>>737 あ、すんません
あくまで例でして
データが入ったクラスをvecterで管理がしたいのです。
あ、そんでデータクラスの中身は
数値が少々と文字列
もしかしたらクラスも入るかもです。
俺ならATLでCAutoPtrArray使っちゃう。
Cで書かれたライブラリで関数ポインタを受け取るものに
インスタンスのメンバ関数を(上手く言えない・・・)呼び出させたいです。
例えば
#include <iostream>
//(例)この部分は自分でいじれない----------
typedef int (*pfunc)(void);
static void
hoge(pfunc p)
{
std::cout << p() << std::endl;
}
//------------------------ここまで
class A {
public:
A(int i) :i_(i) {}
int foo(void) { return i_; }
private:
int i_;
};
int
main()
{
A a(100);
hoge(?????); //aのメンバ関数foo()を呼び出させたい
//Perlだと、aがリファレンスとして hoge( sub { a->foo() } );のような感じか・・・
}
>>744 出来ません。
普通の関数ポインタと、メンバ関数へのポインタは型が違います。
extern "C" と this渡しとメソッドのアドレス渡しでなんとかしれ
>>744 A *p (NULL);
int hage () {return p ? p->foo () : -1;}
int main() {
A a(100);
p = &a;
hoge(hage);
return 0;
}
748 :
デフォルトの名無しさん:04/10/05 00:00:02
質問です
継承したクラスの使い方がわかんなくなってきました
下のように、純粋仮想ベースクラスと、それを継承したものがあったとします
class CBasetest{
virtual int test() = 0;
};
class Ctest : public CBasetest{
int test(){return 0;}
};
で、気づいたらこんなソース書いてました
CBasetest *pBase = new Ctest;//1
delete pBase;//2
2の時にCBasetestのまま開放するのが正しいかどうかわかんなくなってしまって・・。
delete (CBasetest *)pBase;//3
みたいに、キャストしないといけないんですかね。正しい方法教えてください
749 :
デフォルトの名無しさん:04/10/05 00:00:56
さすがC++スレ
糞みたいな質問と低レベルな会話ぷぷぷ
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++++++++++
>748
Ctest *pTest = new Ctest;
delete pTest;
という選択肢はないのかよ
CBasetestに空の仮想デストラクタをつけとけば今後何かとOK
>>748 class CBasetest{
public:
virtual int test() = 0;
virtual ~CBasetest () {}
};
class Ctest : public CBasetest{
public:
int test(){return 0;}
};
ノイローゼ?
class A {
public:
class B {
};
};
のように(private,protectedでなく)publicにクラスをネストさせる意味とは何でしょうか?
>>753 入れ子クラスにすることで、その入れ子クラスが単体では無意味であることをユーザに暗示できる。
言い換えると依存関係をユーザに暗示できる。
VisualStudioなどのIDEでクラスビューのトップツリーにクラスが乱立するのを抑止できる。
>>753 class A固有のインタフェースないしプロキシであるところのclass B
>>748 class CBasetest {
virtual ~CBasetest()=0;
};
これで delete pBaseで各派生クラスのデストラクタが呼び出される。
基底クラスにはvirtualなデストラクタを用意するというのは基本中の基本。
しっかり覚えときや。
>756
>748は
CBasetest *pBase = new Ctest;//1
delete pBase;//2
ってやってるからデストラクタを純粋仮想関数にするのはまずくないか?
class CBasetest {
virtual ~CBasetest(){ /* 処理 */ };
};
>>757 あっ、ホントだよ。デストラクタを純粋仮想にしてどうすんだよ。
空のデストラクタ用意しとかなまずいわな。
virtual ~CBasetest() { //中身なし };
酔っ払ってるとダメだなw
↑さらにダメだなw
× { //中身なし };
○ { /*中身なし*/ };
もうねます。じゃねー。
class CGlobal
{
public:
static int globalData;
};
グローバル変数代わりに使いたいんですが
ネームスペース使うだけで、外部参照を行うことってできないんですか?
CGlobal::globalData=10;みたいに他のファイルで操作したい。
エラーが起こったんですが、別の部分で間違ってる可能性もあるので。
>>760 エラーが起こったならエラーメッセージを貼れ。
一番的確な情報だ。
外部参照エラー出ました。しかもそのglobalDataに当たるモノ
が。貼る事はできません。違うPCでネットしてるので。すいません。
externすればいいのかな。
>>762 class 定義内での static データメンバに初期化子が無ければ、それは宣言だけになる。
初期化子をつけて同時に定義とするか、クラス定義外に static データメンバの定義を追加しる。
ごめん。
初期化子つけて同時に定義とできるのは、型が const 付きの整数か enum の時だけ。
>>760 は整数だけど const 付いてないから、初期化子つけて定義にはできない。
ってことで、
クラス定義外に static データメンバの定義を追加しる。
その通りでした。。。
初期化忘れてました。
>>class定義内で...
でも、class定義内で初期化子つけて宣言ってできませんよね。?
初期化子つけないと定義されないというのは知らなかったです。
つけなきゃいけないってのは分かってた(つもり)でしたが...
ありがとうございました。
これで、extern無しでグローバルスコープだ。わぁい。
以下のソースをVC6でコンパイルしようとしたところ、
#include <iostream>
class Display {
public:
static Display& screen();
void show() {}
private:
Display() { std::cout << "Display()" << std::endl; }
~Display() { std::cout << "~Display()" << std::endl; }
Display(const Display&);
Display& operator=(const Display&);
};
Display&
Display::screen()
{
static Display display;
return display;
}
int
main()
{
Display& display = Display::screen();
display.show();
return 0;
}
「error C2248: 'Display::~Display' : private メンバ (クラス 'Display' で宣言されている)にアクセスできません。
'Display::~Display' の宣言を確認してください。」
デストラクタをpublicにしたらコンパイルは通るのですが、privateではいけないのですか?
mingw/g++(3.2.3)では-Wall -Werror -g -O2で何も言われずにコンパイルできたのです。
どちらが正しいのか分からなくなrじょってきあたですす。
>>767 g++。VC6はダメダメだからC++の勉強には向かないYO。
VC6は窓から投げ捨てろ
それ、本当にg++の挙動の方が正しいのか?
>>767 デストラクタがprivateだったら誰も破棄できないやん。
staticなオブジェクトだって、プログラムが終了するときには
デストラクタが呼ばれるはずでしょ。
deleteするときにprivateだとまずいのでは?
同じく、newするときもprivateだとエラーじゃなかったかな?
売る覚えスマソ。
Display::screen から呼び出してるように見える。
private でもいけるように見える。
>>771 >デストラクタがprivateだったら誰も破棄できないやん。
自分のクラス内なら破棄できる。
メンバ関数であってもstatic変数にすると、廃棄する(デストラクタ呼ぶ)のがクラス外という扱いになるっぽい>cl&bcc32
仕様に詳しい人解説キボンヌ
C++のアクセス制御はオブジェクトではなくクラスに対して働く。
デストラクタがprivateでも同じクラスのメンバ関数内なら実体作れる。
質問があります。
クラスメソッドのGet〜()やSet〜()で引数の範囲チェックを行っていると速度的に不安になるのですが、
普通こういうのはReleaseビルド時にはチェックを行わないようにしちゃうものなのでしょうか?
なわけねえだろ
>>779 ということはみんな我慢してチェックしてるんですね、レスどうもでした
範囲チェックを関数側と呼び出し側のどっちに持たせるかとか
速度気になるなら範囲チェックしない版を用意するとか考えろや
デバッグ時とリリース時でコード変えたらデバッグの意味がねー
>>781 あっなるほど、呼び出し側でチェックするわけですか。
勉強になりますた(・∀・)
783 :
デフォルトの名無しさん:04/10/06 17:33:56
お願いします。わかりません。
*
* *
* * *
* * * *
* * * * *
次は、上のような表示を行うプログラムです。空欄を埋めて完成せよ。
#include <stdio.h>
int main( void )
{
int i ,j;
for(i=1; i<=5;i++){
空欄
}
return 0;
}
>>783 puts("*\n**\n***\n****\n*****");
break;
785 :
783:04/10/06 17:38:44
すみません。
*
* *
* * *
* * * *
* * * * *
でした。よろしくお願いします
>>785 puts(" *\n * *\n * * *\n * * * *\n* * * * *");
break;
______\/┏┏┏┓┛┗━━━━━┻┃┃┃
パーツを教えてやるよ。あとは自分で考えな。
>>783の上の詰まってるをどうやって書くか分かれば、後は左の空白をどうするかだろ
段々、空白が減ってるから
Cの質問じゃないだろ。アルゴリズムの問題。
CであろうがVB、Java、Perl、Ruby、Pascalであろうが関係ない。
よって、スレ違いかと思われる。
それ以前に宿題スレ逝け
>>785 int count=10;
{
int i=0;
for(; i<count; ++i){
printf("% *s",count-i,"");
int j=i+1;
for(; j>0; --j)
printf("*");
puts("");
}
>>792 int i, jだけでやらなきゃ駄目なんじゃね?
Borland C++ Builder + ADO (Not Express) でmdbをいじるなんてことやってますが
ADOを勉強しないことには進まない、位まで行き詰まってます
適切なスレ、掲示板、サイト等
いい所がありましたら、案内をお願いします
>>785 int i=0,j=10;
for(; i<j; ++i)
printf("% *c%s\n",j-i,' ',&("**********"[(j-i-1)*2]));
796 :
デフォルトの名無しさん:04/10/06 23:40:46
C++hakuso
Ruby >>>>>>>>>>>>>>>>>>>>> CCCCCCCCCCCCCC+++++++
797 :
デフォルトの名無しさん:04/10/06 23:58:16
main.c test1.c test2.c のソースファイルがあるとします。
#gcc -c main.c test1.c test2.c
で main.o test1.o test2.o を作成します。
test1.oとtest2.oをまとめて1つのオブジェクトを作成し、
後でmain.oとくっつけて実行ファイルを作成するには
どうやれば良いんでしょうか?
#gcc -o subprogram test1.o test2.o
とやるとmain関数がありませんって怒られます。
ar
>>797 ↓じゃないの?
#gcc -o subprogram main.o test1.o test2.o
800 :
デフォルトの名無しさん:04/10/07 01:26:26
>>797 main.oは後からくっつけたいのです。
test1.oとtest2.oだけをくっつけたオブジェクトを作成し、
その後、作成したオブジェクトとmain.oをくっつけたい訳です。
C言語で、
for( int i = ...; ...; ... ){ ... }
のように、for 内で int i のように変数宣言するのは大丈夫でしょうか?
>>800 何故くっつけたいのか聞かせてもらおうか。
#答は既に>798にあることだし。
こんばんは、VC++初心者です。
<質問内容>
リストビューのアイテム毎の背景色変更についてです。
*カスタムドローにて、【猫でもわかる〜】に記載されている
処理は実現できました。
ttp://www.kumei.ne.jp/c_lang/sdk3/sdk_261.htm 応用として、一定時間毎にリストビューのアイテムが
上から順々に背景色を変更していく処理を実現したいのですが、
散々悩んだ挙句、できませんでした。
何卒、ご教授お願いいたします。
<開発環境>
OS : Windows XP
VC : VC++ 6.0 SDK ダイアログベースアプリ
805 :
デフォルトの名無しさん:04/10/07 10:23:03
グローバル変数なら関数に引数として渡さないでもその関数内でも有効なんですか?
>805
Yes! Yes! Yes!
808 :
デフォルトの名無しさん:04/10/07 10:31:42
>>806 レスありがとうございます
関数に引数として渡す時はどういう時なんでしょうか?
グローバル変数化してしまえば引数として渡す必要がなくなると思うんですが…
グローバル変数の弊害という面から調べてみろ
管理ができない・難しいという罠に陥る
コーディングという面から言うなら再帰だのが使えなくなる
810 :
デフォルトの名無しさん:04/10/07 10:40:15
>>809 目から鱗が落ちました
お返事ありがとうございました
811 :
デフォルトの名無しさん:04/10/07 11:06:13
質問なんですが
Cの構造体をC+のクラスになおしたいときのこつって
何かありますか?
812 :
デフォルトの名無しさん:04/10/07 11:09:26
public:
を先頭の行に書かなきゃ
814 :
812:04/10/07 11:12:09
ああ、structからclassにしたいならpublic:が必要。
C++でもclassではなくstructをそのまま使える。
単純にclassに書き換えるとアクセス制御がprivateになるけど、
structのままなら関係なし。
816 :
デフォルトの名無しさん:04/10/07 11:33:19
ファイル操作とかしてるけどそれも直さないで平気かな?
っつかC++勉強してから書き直せ
818 :
デフォルトの名無しさん:04/10/07 11:44:11
>>817 初心者歓迎のスレじゃないのかよ〜
ぬるぽ
C++以前に、お前のその質問を他人が読んで理解できると思うか。
「ファイル操作」とかじゃなく、もちっと具体的に書けや。
>>819 ファイルのヘッダなどのバイト列をstructの構造体で読み出してるのだけど
C++に変更した時はCでの手順でまずいことありますか?
Cでその手順が問題ないと思うなら、C++でも問題ないですよ。
824 :
デフォルトの名無しさん:04/10/07 12:56:16
今回、WindowsのGUI上で文字のブリンク・リバースをさせたいのですが
可能でしょうか?
(DOSならばエスケープシーケンスを使って出来そうなのですが)
環境 2000+VC6です。
825 :
デフォルトの名無しさん:04/10/07 12:56:41
無理にC++らしくする必要はないよ。
好きに文字色と背景色設定して描画しろ
プログラムがなかなか進まない…
プログラムの大まかなイメージができあがるまで
手は動かさないで頭の中で考えてる時間がすごく長い
こんなのでいいのかな?
一日20行程度しか進まないw
全然OK
作りたいプログラムを図にして見るとわかりやすい。
プログラム組む方がどんなプログラムを作りたいか考えるより
楽しい(という表現で正しいかは不明)のだがそんな私は
逝ってよし?
それはゲーム脳だな
なんでもゲーム脳にしてしまうこんな世の中じゃ…
NO, ワタシはゲーム脳ではない
Yes,Sir
返事の前にはSirを付けろ
,.,,..::;;:::;;;::,.、,
,:r'^ `ヽ
/:: :::\
./::: ,,,-;;;;;;...,.....,...;;-;;;;...,.::::::i ヽ人人人/
i;;/'|i<_O_ヽ二( <O`゙iヽ;::::! ノ ゝ
l;′ヽ二/⌒ミ、二ニノ ヽ::l ヽ (
_,,l; / ^` ^´ヾ、 :::l、 丿 (_
i │ / ,r――-、 i i" )  ̄ヽ (_
ゝ .l l i.j" ̄ ̄`jl l l゙ ;/ ) (
`'''; l |.l-='''''=‐/ ,r''''" 丿 ゝ
ヽ ヽ,`'-―-" / ,/l ヽ (
ヽ ゝ  ̄ / .| ) (
,r| ヽ、ヽ::,,;;::: ゙,/ l,, /⌒Y⌒Y⌒ヽ
_,,,,/ ヽ, `''-;;;;;;-'" 丿l
''"" / ヽ i: ;: _/ ヽー、、
l \ i/ l `'''
l_,,,=--‐''"゙゙;r-<゙,,,,,,, /
|O ""゙''''″
|
Sir!Yes sir!
839 :
デフォルトの名無しさん:04/10/07 18:45:06
VC++5.0 でhoge.libをリンクして、実行モジュールを作りたいのですが
やり方が分かりません。具体的にどうすれば良いのでしょうか?
プロジェクトの設定でリンカのタブから登録
841 :
デフォルトの名無しさん:04/10/07 18:59:56
リンクタブのオブジェクト/ライブラリモジュールに
追加すれば良いのでしょうか?
ソースファイルといっしょに追加できなかったっけ
std::stringに格納された文字列をstd::wstringに格納するにはどうすればいいのでしょうか。
wstringにchar*やstringの定義が見つからないのですが‥‥
mbstowcsなどを使用して変換するしか方法はないのでしょうか?
とりあえずstd::wstring = WideString(std::string.c_str()).c_bstr();でお茶を濁しているのですが。
(WideStringはVCL用のワイド文字列クラス)
844 :
デフォルトの名無しさん:04/10/07 20:10:14
DVD-RAM書き込みや、メディア(DVD)の情報を取得するには、
どのようにすればいいのでしょうか?
ご存知の方いらっしゃいましたら、教えてください。
参考になるHPを教えていただけるだけでも構いませんので、よろしくお願いします。
OS:windows2000
言語:C言語(C+ではない)
コンパイラ:VC6.0
>>843 割と最近そっくりな質問をどっかで見たな・・・。
C++関連のスレだった気がするので探してみると良い。
use_facet で codecvt 取得して・・後忘れた。
141俺ジャン
>>845-846 ありがとうございます
やっぱりその方法ですか・・
関数書くかそのままWideStringで済ますか悩む・・・
コンソール系の関数でできるんじゃないの?
と検索せずに言ってみる
んなわけねえだろボケ
あぁGUI上でか。
AllocConsole()してそこでやれ
手元不如意で持ち合わせがなかったので、Exceptional C++を立ち読みしていたところ
pimplイディオムというものを見かけたのですが、これって一般的/頻繁に使われているのですか?
>>853 ヘッダの依存関係が爆発してひどい目に遭ったC++プログラマなら大抵知ってる。
後付けで対応する手段としては手軽で効果が大きい。
最初から問題になるのが分かっていれば、
仮想関数と継承を使うようにしたほうがすっきりする。
856 :
デフォルトの名無しさん:04/10/08 10:37:13
初心者用のcかc++の雑誌を教えてください
857 :
デフォルトの名無しさん:04/10/08 17:01:27
ポインタをインクリメントすると、ポインタ分進みますが
ポインタ+=3とかでも、3ポインタ分進むことは保証されてましたよね?
確かめてもちゃんと3つ分進んでますが、なんか急に不安になってきて。
石橋を叩いても渡らない香具師だな
>>858 昔これで失敗した気がしてねぇ
というかポインタを飛ばして進ませる事は滅多に無くて
>>859 それは配列をポリモフィズム的に扱っちゃったりするときのことじゃないの」?
>>860 あーそうです配列絡みでした
レスありがとうございました、一安心
>>856 Cマガでも読んでろ。
プラグラのいってることの意味がわかってきたら中級入りだ。
>>859 あ〜、それ自分もあったわ。
結局配列じゃなくポインタ配列で回避したけど。
864 :
デフォルトの名無しさん:04/10/08 22:18:51
おそらくFAQだと思うんですが
コールバックを引数に取る関数にメンバ関数のポインタを渡したいのですが
たとえばWindowsのウィンドウプロシージャなら
インスタンスのthisポインタを仕込んでおいたりできるんですが、
そういう真似ができない場合の汎用的な解決方法とかはあるんでしょうか
865 :
ぬるぽ:04/10/08 22:24:13
はぁ〜はぁ〜
>>864 EnumWindowsやスレッドのようにユーザー定義引数が存在する場合はそこにオブジェクトのポインタをつっこんでreinterpret_cast<>
867 :
デフォルトの名無しさん:04/10/09 00:13:28
質問です。
最近オブジェクト指向(C++)に手を出している、C言語中級者です。
クラスのメンバ関数に触れたとき、
ふと関数ポインタという言葉を思い出しました。
実際関数ポインタというものを使いこなしているわけではないのですが、
関数ポインタという名前で想像できる通りの機能と解釈しています
(ここも指摘があればよろしくお願いします)
概念的には似たようなものなのでしょうか?
例え異なるとしても、この関数ポインタを利用すれば疑似メンバ関数のようになるのでしょうか?
あくまで知的探究心によるものですが、ご教授よろしくお願いします。
>>867 実装的には、仮想関数など関数ポインタを使ってるわけですが、
概念的には別の範疇に属するものです。
なんつうか、Cからの移行組はオブジェクト指向を学習するのに
何かにつけ実装レベルの発想で理解しようとしますが、
それはあんまり良くないですよ。
むかし、前橋氏は(ry
vtblってなんなのかを調べてみるとクラスの理解につながるかも。
あくまで実装面だけどね。
gobjectとか、Cで無理矢理やっているのを眺めるのも良いかもしれない。
責任は持たんけど。
>>868 返答ありがとうございます。
>概念的には別の範疇に属するものです。
そうですか…
現在パーツを作って組み合わせていく設計を極力用いて
C++でソースを書いたりしているのですが
オブジェクト指向を理解しているのか、
それともただの真似事でぜんぜん理解していないのか、自分では全く判断できず…^^;
>Cからの移行組は〜(中略)〜それはあんまり良くないですよ。
了解です。以後、念頭において学んでいきます。
>>869,870
早速参考させていただきます。
ありがとうございました。
C++では、staticな外部変数は無名namespaceに置き換えるのが
推奨されるということですが、staticな外部変数のままだと、
具体的に問題が生じたりするのでしょうか?
>>872 それは「staticにはいろんな意味があって紛らわしいから」
ということでしかない。
>>871 例えばCでこんな構造体とそれを扱う関数があったとする。
typedef struct foo {
int Bar;
double Baz;
} Foo;
void fooSet(Foo * pFoo, int bar, double baz) {pFoo->Bar = bar; pFoo->Baz = baz;}
int fooGetBar(Foo * pFoo) {return pFoo->Bar;}
double fooGetBaz(Foo * pFoo) {return pFoo->Baz;}
これらはC++のクラスでこう書ける。
class foo {
int Bar;
double Baz;
public:
void set(int bar, double baz) {Bar = bar; Baz = baz;}
void getBar() {return Bar;}
void getBaz() {return Baz;}
最適化にも拠るが、実装上どちらもほぼ同じコードが出力される。
このように、「構造体とそれを扱う関数群」をまとめたものと捉えるのも一つのやり方。
#継承を考えない限り、Cからの移行にはこれでも充分有用。
#そのうちEffectiveC++辺りを読んで目から鱗を落とせばよろしい。
ぎゃぁ。>875の
>void getBar() {return Bar;}
>void getBaz() {return Baz;}
はそれぞれ
int getBar() {return Bar;}
double getBaz() {return Baz;}
の間違い。
なお、constは敢えて省いたがきちんと書くならこうなる。
int getBar() const {return Bar;}
初歩的な質問ですが、C、もしくはC++でディレクトリの作成や削除、ファイルの削除の仕方がわかりません。
エラい人、教えてください
boost::filesystem
879 :
デフォルトの名無しさん:04/10/09 03:38:08
なんでそういう回答しかしないの?
それで
>>877が分かる人だったら
こんな質問しないでしょ?
もうちょっと考えろよ
お(ry
>>875 仰るとおり、継承を考えず、という方法ならそれなりに実現できるかと思ったわけですが、
どうも安直に考えすぎてたようで、
メンバ変数とメンバ関数のパッケージングされたものを実現する方法が思い浮かびませんでした^^;
例えば
typedef struct _foo{
int Bar;
void (*BarSet)( int bar );
}Foo;
のようにパッケージングした上で bar の値を Bar へ代入することは可能なのでしょうか?
C++のレベルはまだまだなのですが、細かいことが好きな性分なため(?)、
C言語びいきで、C言語にこだわってしまいまして…^^;
助言よろしくお願いします。
>>877 邪道かもしれませんが system 関数はどうでしょう?
>>877 結論から言う。
C/C++の規格にはそのような操作は含まれていない。
なんでそういう回答しかしないの?
それで
>>877が分かる人だったら
こんな質問しないでしょ?
もうちょっと考えろよ
884 :
デフォルトの名無しさん:04/10/09 04:06:50
>>882 偉そうに規格云々の話持ち出すなら
C言語またはC++言語には`操作'なんて含まれていない
>877
ディレクトリの作成や削除→_mkdir(), _rmdir()
ファイルの削除→remove()
ディレクトリの作成→boost::filesystem::create_directory
ディレクトリの削除→boost::filesystem::remove, remove_all
ファイルの削除→boost::filesystem::remove, remove_all
Windows限定ならこれでOK
ディレクトリの作成→MakeSureDirectoryPathExists
ディレクトリの削除→RemoveDirectory
ファイルの削除→DeleteFile
とにかく878はいっぺん死んでこい。
お前みたいなクズ二度と顔を見せるな。
891 :
デフォルトの名無しさん:04/10/09 11:49:13
こんにちは。Boland C++ を使ってC言語で個人使用のツールを細々作っているものでs。
基本的なことですいませんが、ワイドキャラクタ用の関数群ってありますよね。これらは
どんな局面で使うのでしょうか? 「世界にはばたく」ソースを書くためには、これらの関数
を積極的に使おう、という雰囲気なのか?? よろしく m(_ _)m。
893 :
877:04/10/09 12:18:26
>>877 実際のところboost::filesystemが一番移植性が高いんじゃないか。
そもそもファイル操作というものが存在しない環境もあるわけで、
CとC++自体は規格としてディレクトリという概念やファイルの削除
という概念を含んでいない。当然移植性のある標準的な操作も
存在しない。boost::filesystemについて調べてみるといい。
Boost:
http://www.boost.org/
いい加減にしろ878
全て注目して欲しい878の自作自演だろ。必死だな878。
俺はお前みたいなヤツが一番嫌いだ。
そうやって俺をイラつかせて、何をしたいんだ。
俺に恨みでもあるのか。それとも人をからかうのが好きなのか。
どちらにしても、お前は悪意をもって人を傷つけようとした。
こういう事はこれで最後にしろ。
901 :
デフォルトの名無しさん:04/10/09 13:36:48
Ruby >>>>>>>>>>>>>>>>>>>>>> ぼおst
boost::filesystemな・・・ポータブルパスの書式は
ディレクトリの区切り文字が '/' になってややこすぃ。
"C:\Windows\system" は "C://Windows/system" とか。
うっかりネイティブ形式の放り込むと例外が飛んでくるんで注意!
でもディレクトリ移動が '/' 演算死を使って実装してあるのはちょっと感動した。
>>903 だから何?remove使って何か問題あるのかね?
>>902 っつかWindows(DOS)って何でディレクトリの区切り文字を'\'にしたの?
ディレクトリはUNIXから拝借したんじゃないの?
>>905 オプションが'/'で始まる仕様だったから。
ファイルの概念の無い環境は知らんが、BTRONにはディレクトリの概念は無いよね。
#いやさ、リンクで擬似的に実現できるんだけど".."がお手上げでね。
>>907 誘導したの漏れだけど、黙って移動するかな。おまけにこっちで環境書かないし。
で、改めて言うけどLSI-Cはやめとけ。ロングファイル名にも対応できないんだから。
>>909 ほぅ
そこのボタンの掛け違いはいつ起こったんですか?
ご存知の方いるかな?
> int getBar() const {return Bar;}
このconstってどういう意味?
>>911 元々MS-DOSはUNIXじゃなくてCP/Mの真似だから。
つか、最初はディレクトリもなかったしな。
mutable を見た PG を鬱にさせるおまじない
>>913 CP/Mってオプションはやっぱ'/'だったんですかね?
>>912 「getBarではメンバ変数(Barとか)に変更を加えない」という宣言
黙っての移動すいませんでした。
以後気をつけます。
環境はボーランドのコンパイラです。
絶対値を求める演算子を教えてください
調べても出てきませんでした
文字列がatofで変換できるか調べるには
自前で関数用意するしかないですか?
>>920 int型でいいならabs()関数
あとはMSDN見ればわかるだろう。
>>922 MSDN使っていると言う前提は如何な最中。
>>921 「変換できるか」の定義に拠るが、strtod()を使えば文字列のどこまでを変換に使ったかは判る。
>>920 そういう演算子は無い。
>>920 そういう関数でやれ。
<cstdlib>
int:abs
long:labs
long long:llabs
<cmath>
double:fabs
float:fabsf
long double:fabsl
>>923 すいません、今携帯でかつ調べる手段がないのでその関数の詳細教えていただけますか?
因みに基準は文字列が数字とピリオド1つで構成されているかです。
>>923 927
解決しました。ありがとうございます。
929 :
デフォルトの名無しさん:04/10/09 19:26:06
Kdevelop使ってる人いますか?
情報が少なすぎで困っています。
関数の戻り値としてx座標とy座標の2つを指定できるのでしょうか?
いろいろな例をみていると1つしか指定できないみたいなので
(x、y)を戻り値として返すことはできるのでしょうか?
void hoge(int *x, int *y);
or
class Point {
int x_, y_;
//blah, blah, blah
};
Point hoge();
std::pair<int, int>とか
>>930 C++だったら
>>932がスマートだと思う。
Cだったら
>>931の2つかグローバル変数しか方法はなさそう。
classじゃなくてstructしか使えないけど。
古いコンパイラだと構造体の実体は返せないので注意。
>>931 >void hoge(int *x, int *y);
この方法は何という名の方法なんでしょうか
わからないので検索して調べてみたいのですが
なんて調べたらいいのかわからないもので…
>>932 調べてみます
>>933 c++.netなんですけどreturnで構造体をかえせるか試してみます
レスありがとうございました
最近C++を学び始めたのですが二進数表示にするマニピュレータとかってないんでしょうか。
回転とかシフトなどビット単位で計算することってC++やCではよくあると思うのですが。
936 :
デフォルトの名無しさん:04/10/09 20:53:55
返せないわけないだろ
937 :
デフォルトの名無しさん:04/10/09 20:55:16
Cでint型をString型に変換するにはどうすればいいのでしょうか?
JavaでいうtoStringやParseIntみたいなAPIはあるのでしょうか?
通は8進表示でビットデータを読みます
939 :
デフォルトの名無しさん:04/10/09 20:58:11
CにはString型はないんだけどsprintfでがんがれ
ほとんどの環境でitoaがあると思うけど。
941 :
デフォルトの名無しさん:04/10/09 20:59:42
>>934 >void hoge(int *x, int *y);
「参照渡し」とかでぐぐれば見つかるんじゃない?
ポインタを理解してれば自動的に理解できると思うんだけど。
>>936 安心して使ってみます
>>943 まだポインターは理解してないので
これから勉強しようと思います
レスありがとうございました
>935
unsigned char型を2進表記しようとしてこんなん
unsigned char uchar = 'c';
for(short i=sizeof(unsigned char)*8-1; i>=0; --i){
if( (uchar>>i) & 1U ){
bset[index++] = 1;
}else{
bset[index++] = 0;
}
}
書いたことある。bsetはなんらかのbitsetのインスタンスね。
もっと簡潔にするなりテンプレート化するなりはだれか偉い人やって(;´Д`)
charが8bitだと誰が決めたのか
Rubuy ???????????????????????>>>>>>>>>>>>>>>
>>945 こんなもんでどうよ。
コンパイラによっては警告くらいは出ちゃうかもしれんが。
unsigned char uchar = 'c';
_Bool bset[sizeof(unsigned char)*8];
for(int i=0; i<8; i++) bset[i++] = (((128>>i) & uchar)!=0);
949 :
デフォルトの名無しさん:04/10/10 00:05:39
pppppuuuuuuuuuuuuuuuuuuuuuuuuuぷううううううううううううううううううううう
>>935,945
…std::bitset::to_string()