【初心者歓迎】C/C++室 Ver.21【環境依存OK】
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後氏ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
急速にスレの質が低下してまいりました
5 :
デフォルトの名無しさん:2005/09/03(土) 20:31:49
最近まで高かったのかと個一時間
STLつかうと一気に実行ファイルサイズが10倍に?!
8 :
デフォルトの名無しさん:2005/09/03(土) 22:05:08
xp bcc C言語でやっております
初心者質問ですいません
printf("%x",'ソ');とすると5c83と表示されますが
SHIFT-JISコードでは「ソ」は835cとなっております。
なぜ第一バイト目と第二バイト目が逆なのでしょうか
モカニズムを簡単に教えていただけないでしょうか
>>8 っ[ エンディアン ]
x86はリトルエンディアン。PPCはビッグエンディアン。
インテル系のCPUを使っているから。リトルインディアンなわけだな。
インディアン嘘つかない
文字は左詰(左から右に伸びる)、数字は右詰(右から左へ伸びる)
くだらんな
14 :
デフォルトの名無しさん:2005/09/03(土) 22:46:22
ありがとうございます。
まだ完全に生理できませんがなんとか理解できたと思います
文字コードと照らし合わせるような場合は
右のバイトから読みこんで、
数値として受け取るような場合には左のバイトから読んでいくって事ですよね。
くだらんですいませんでしたーー
>>13 くだらん部分をちゃんと学ばないから
君の書くソースはヘボいんだよ。
戻ってきてしまいました。先ほどはありがとうございました。
もう一つ基本的なことのような気はするのですが、よろしくおねがいします。
char str[100]="ごめんなさいa";という文字型配列を用意して
printf("%x\n",str[11]);
この上の文を実行するとffffffa2と表示されます。
「い」のコードは82a2ということなのでa2だけならわかるのですが
ffffffというのはなんなんでしょうか。
またprintf("%x\n",str[12]);ではちゃんと「a」のコード62が表示されるので
どういった違いなのかわかりません。
すみませんが、宜しくお願いいたします。
>>16 なんで日本語が英語の倍の幅で表示されるか考えたこと有るか?
>>16 >17はきっと寝ぼけているから無視するとして。
charの値をprintf()に渡そうとすると暗黙の型変換でintに変換される。
0xa2はcharでは-94という負の値なのでintでも同様、負の値と-94になるというわけ。
それを16進で表記するのだから当然、ffffffa2になる。
>>20 大抵の環境の場合はcharはsignedなはず。
>>18 >16の環境の場合と書くべきだったな。
>>21 つーか、大抵オプションかpragmaで変更可能なわけだが。
23 :
デフォルトの名無しさん:2005/09/04(日) 15:33:15
メモリに関してですが
class Hoge
{
int* pData;
public:
void Init()
{
pData = new int( 10 );
for( int i = 0; i < 10; i++ )
pData[i] = i;
}
void SetData()
{
for( int i = 0; i < 10; i++ )
pData[i] = i * 10;
}
略
を
(続く
24 :
続き:2005/09/04(日) 15:34:44
Hoge a;
a.Init();
Hoge b = a;
a.SetData();
をやってみたところ bの値が 0, 10, 20...
と、なったという事は
bのpData は aのpDataを参照して
pDataは newで確保した分しか存在してない
と、みて良いんでしょうか?
>24
Yes, いわゆるシャロウコピー。
>>23 > pData = new int( 10 );
> for( int i = 0; i < 10; i++ )
> pData[i] = i;
new int(10) はintを1個分確保して10で初期化するんだぞ。
27 :
24:2005/09/04(日) 15:53:10
レスどもです。
シャロウコピーというのですか
調べてみるとディープコピーってのもあるのですね。
メモリまわりでこんがらがったもので
有難うございました。
28 :
24:2005/09/04(日) 15:54:38
前スレでも質問した者ですが
00,01,02,03,04,05,06,07,08,09
10,11,12,13,14,15,16,17,18,19
20,21,22,23,24,25,26,27,28,29
このようなファイルの中身をgetcで取り出しmallocで動的に確保したメモリで
二次元配列に入れ表示させるにはどうしたらよいのでしょうか?
動的にしない時は下記のソースでいけるようになったのですが
while ((c = getc(fp)) != EOF) {
//カンマもしくは改行の場合
if (c == ',' || c == '\n' ) {
//文字列を整数に変換し配列へ格納
array[i] = atoi(array2);
i++;
j=0;
//array2中身の初期化
for(int k = 0; k<3; k++){
array2[k] = NULL;
}
}else{
//array2に一時保存
array2[j] = c;
j++;
}
}
int **array;
char *buffer;
array = (int**) malloc (sizeof(int));
array2 = (char*)malloc(sizeof(char));
上記のメモリ確保をつけて二次元配列にするところでポインタのポインタを、
理解しきれてないので詰まっています。
アドバイスをお願いします。
>>29のコードに二次元配列がないように見えるのって俺だけ?
31 :
デフォルトの名無しさん:2005/09/04(日) 17:01:40
C言語始めたいんですが
何処で入手するんですか?
33 :
デフォルトの名無しさん:2005/09/04(日) 17:12:29
>32
C言語を
>>31 コンパイル・システムならOS にもよるが、Unix 系なら普通ははじめからパッケージに含まれてるし
Windows なら、ビジネスソフト売ってるような店なら、扱っていることが多い。
35 :
29:2005/09/04(日) 17:14:13
説明不足ですいません。
上記のものは動的にしないでファイルの中を一文字ずつ取ってきて一次元配列に入れたのものでして、
これを改造してint **array; 以下のメモリ確保をつけて二次元配列に出来ないものかと思いまして。
>>35 いっぺんにやろうとするな、まず二次元化したものを作れ。
>>31 >>33 あなたが聞いているのは
「英語の勉強を始めようと思います。英語は何処で入手するんですか?」
これと同じくらいトンチンカンなこと。だから突っ込まれる。
勉強を始めるのに必要なのは「Cのコンパイラまたは開発環境」と「入門書」。
前者は”フリー コンパイラ”でぐぐればいくらでも見つかる。
後者は推薦図書スレに定番一覧へのリンクがある。
38 :
デフォルトの名無しさん:2005/09/04(日) 18:15:31
>37
御指摘ありがとごさます
HSP・Rubyぐらいしかやってない奴ですので・・・
>37
免罪符になるとは思っておりませんが
HSP・Ruby等しかやっておらず、C言語というプログラムがあると思っておりました(笑われるかもしれませんが)
どうやら違うらしいですね
元々PCに入ってる何かとか?
スミマセンC言語ド初心者で
>>39 言語(文法と意味)と言語処理系(言語を解釈するプログラムのセット)を分けて考えるべし。
HSPやRubyは言語処理系が(事実上)ひとつしかないのに対して、
C言語はそうではない。
42 :
デフォルトの名無しさん:2005/09/04(日) 18:34:55
>40
>41
レス大変ありがとうございます
質問させてください、
今作ってるアプリに十数個のヘッダがあるのですが、
インクルードのネストが複雑になってしまったせいか、
hoge.hでclass hogeを宣言しており、
main.cppでhoge *g_pHogeが、
(゚∀゚)アヒャ!
46 :
43:2005/09/04(日) 19:46:20
すみません、ミスって途中で投稿してしまいましたorz
hoge.hでclass hogeを宣言しており、
main.cppで
hoge *g_pHoge = NULL;
(略)
g_pHoge = new hoge(うんたら);
(略)
g_pHoge->DoHoge();
とやると、DoHoge()内で、thisが0xcdcdcdcdになっていて
アクセス違反になりました。
(DoHoge()の実装は、hoge.hのclass hogeの宣言内でインラインで書いています)
hoge.hの最初で
class hoge;
extern hoge *g_pHoge;
とやっても、
class hoge {
} static *g_pHoge;
とやっても同じ結果になりました。
main.hとfuga.hの2箇所でhoge.hをインクルードしており、
main.hとfuga.hはmain.cppとfuga.cppにインクルードされています。
この現象は何が悪くて起こるのでしょうか・・・?
コンパイルは正常に通過します。
よろしくお願いしますm(_ _)m
>>46 とりあえずデバガ使って、new した時点から g_pHoge のアドレスをチェックしてみそ
48 :
デフォルトの名無しさん:2005/09/04(日) 19:58:37
|ヽ‐-へ
i _゚ワ゚」
゙´ノノ))))
l ノ゚ヮ゚ノlナメンナゴラァ
ノ⊂)卯!つ
´((く/_||リ
しソ
49 :
46:2005/09/04(日) 20:05:50
>>47 レスありがとうございます、
呼び出してたDoHoge()はhoge.hにある別のクラスの
同名のメンバ関数でした・・・アクセス違反は別の原因でした、
すみませんorz
ただmain.cppではnewで確保したアドレスを指しているのに
fuga.cppではNULLのままでした
(hoge.hでクラス宣言の後にstatic *g_pInput = NULLとしました)
これが以前も起こった現象で原因がわからないので、
ちゃんと検証してからまた質問させていただきますm(_ _)m
>>49 static かあ、見逃したぜ。
静的大域変数は内部リンケージを持つから、hoge.hをインクルードしてる翻訳単位全てで別々に実体が生成されてるのが原因。
てか、ヘッダで静的大域変数の定義はやめとけ。
とりあえず、Hogeの静的メンバにでもしとけや。
52 :
49:2005/09/04(日) 21:08:13
>>50 >hoge.hをインクルードしてる翻訳単位全てで別々に実体が生成
なるほど、知りませんでした・・・どうもありがとうございました。
static *g_pInputはstatic *g_pHogeの間違いでした、書きミス多いorz
なので
hoge.hでextern hoge *g_pHoge;
main.cppでhoge *g_pHoge = 0;
に戻したら直りました。どうもありがとうございましたm(_ _)m
>>51 了解です。
こんにちは。
本日、C#で作成したDLLをC++できちんと動作するように、指示があったのですが、C++は初めてでよくわかりません。
C#ができるからと考えていた私が甘かった・・・。
やりたいことは、C#で作成したクラスライブラリをC++で実行したい。
ということです。
呼び出し側の情報
クラス名:Execute
メソッド名:ConeectDb
引数:string conStr ->第一引数
:string conPw ->第二引数
戻り値:正常:0 異常:-1
以上をC++側で実行したいだけなのですが・・・。
C++側はボタンを押下するフォームのみ作成はできたのですが、
LoadLibraryなどの使い方をみても良く判らなくて・・・
すみませんが、助けてください ><
∧ ∧
(・∀ ・) <ねえ
>>53って糞スレ立ててたでしょ?
ノ( )ヽ
< >
∧ ∧
ヽ(・∀ ・)ノ <削除以来だしなよー!
(( ノ( )ヽ ))
< >
linuxのC言語で質問です。
int main()
{
int a;
for(a=0;a<5;a++)
{
printf("ABCDEFG %d\n",a);
}
return 1;
}
出力結果:
ABCDEFG 0
ABCDEFG 1
ABCDEFG 2
ABCDEFG 3
ABCDEFG 4
printf文で1行ごとに改行するのではなく、上書きしていくようにしたいのですが
どうやってよいかわかりません。お願いします。
printf("%cABCDEFG %d\n",12,a);
とするとできるよ
printf("\fABCDEFG %d\n",a);
>56
>57
改行が1行増えるだけでした。↓
ABCDEFG 0
ABCDEFG 1
:
:
std::vectorでstd::stringを要素に持つ二次元配列を動的に作成したいのですが
扱い方がよくわかりません。
↓の様に使用して一応動いてはいるのですがこれで問題ないのでしょうか…。
using namespace std;
void main() {
vector <vector <string> > vtest;
vtest.resize(1);
vtest[0].push_back("hoge");
vtest[0].push_back("hoge");
printf("%s%s", vtest[0][0].c_str(), vtest[0][1].c_str());
}
60 :
デフォルトの名無しさん:2005/09/05(月) 16:03:18
static定義してある変数はスコープがそのファイル中に限定される
とC++の参考書にあるんですが
head.hでstatic int a = 0; を宣言して
head.hをインクルードしたファイルで普通に扱えるんですが
ヘッダーをインクルードするってことはヘッダーの中身をコピーするようなものなんでしょうか?
>>60 #include した所にテキスト展開するだけ。
>61
即レスありがとうございます
#include <stdio.h>
int main()
{
int a;
for(a=0;a<5;a++)
{
printf("\rABCDEFG %d",a);
fflush(stdout);
sleep(1);
}
return 0;
}
>>53 VC++にはマネージ拡張といってC#なんかと同じくCLR上で動くコードを吐くモードがある。
そいつを使えばC#でそのDLLを使うときと同じ手順で、そのDLLをC++でも使える。
>>58 56-57の\nを\rに変えてみると。
ちょっと質問させてくれ。
昔ほんの少しだけC/C++を齧った事があるんだけど一から学びなおすのに適した参考書とかないありませんか?
はいはいスレ違いスレ違い
図書、書籍、本等で検索汁
>>59 間違っちゃいないが、外側も[0]しないでpush_back()すればいいのに。
>>64 遅くなりました。これで大丈夫でしたか。
vectorで動的に多次元配列を作成できるという記述は検索で引っかかるのですが
実際に多次元配列を作成、操作してるソースが見つからなかったので不安でした。
ありがとうございました。
>>69 あ、言われてみれば確かにそうした方がいいですね。
御指摘ありがとうございます。
vc++6.0を使ってます。
vectorクラステンプレートについての質問です。
仮にStudentと言うクラスがあったとします。
ここでvectorを用いて
vector <Student *> students;
と宣言するのと
vector <Student> *students;
と宣言するのではどのような違いがあるのでしょうか?
よろしくおねがいします。
入れる物がポインタなのか、入れ物がポインタなのか、の違い。
まぁ後者はあまり使わないんじゃないかな。
つーか、基礎からやり直せ。
たしかに。レベル的にSTLに手を出す段階ではない。
違いがないと思える奴がいるとは・・・
標準Cで、プログラムの終了時のフックをかける
関数(コールバックの登録)があったような気がするんですが、
何でした?
78 :
76:2005/09/07(水) 15:44:02
クラスは構造体のように
CPlusClass arrays[4] = {
...(略)
};
と初期化できないのでしょうか?
>>79 コンストラクタがなく、全てのメンバがpublicならそうできる。
83 :
79:2005/09/10(土) 22:34:00
コンストラクタ有りました...(;´д`)
不便
>>79 class A
{
public:
A(int);
略
};
A array[4] = {
A(1),
A(2),
A(3),
A(4)
};
>82
まったく同じじゃないよ
86 :
名無しさん@そうだ選挙に行こう:2005/09/11(日) 12:04:32
>>82 C++では大きさゼロの構造体を作っても、最低1バイトのsizeof()になるんじゃ
なかったっけ?
>>86 いや82に対してそのレスは変ではないかと。
82は別に「Cの構造体とC++の構造体」を比べてるわけじゃないから。
C++でAVIファイルを再生したい場合どうしたらいいのですか?
ヘルプにも詳しく書いてなくて詰まっています。
>>88 C++単体じゃ無理。環境依存の動画関連ライブラリが必要
というわけで環境を晒せ。
>>90 すみません。
CPU:Celeron 1.3G
メモリ:256MB
OS:WindowsXP Visual C++.NET
です。
DirectX(DirectShow)とか、MediaPlayer SDKとか。
>>92 フレームごとに処理をしたいのですが、MCIでできますでしょうか?
そんな話は聞いていないので、答えられません。
クラスのデフォルト引数はどこに書けばよいのでしょうか?ヘッダの中の定義の部分ですかそれとも実態の方でしょうか?
あるいは両方書かなければならないのでしょうか?
試せば?
>クラスのデフォルト引数
???
クラスに引数なんてねぇよ・・・
テンプレート引数かね。
メソッドだろ。たぶん。
単に関数だろ。
main(){
int a[100]={1,2,3,…,99}; の配列を次のように関数へ渡しました。
for(int i=1;i<99;i++)func(a[i]);
}
void func(int i){ ・・・単純な四則演算の処理・・・ }
関数に『配列そのもの』を渡すのは出来ないと本に書いてあったのですが、
上記のプログラムは正しいですか?
定義された関数には値かポインタしか渡せず、配列そのものは渡せないらしいですが。
コンパイルは通りましたし、実行結果も論理的に正しかったです。
コンパイラはフリーのbccです。
※includeなどのは省略しています。上のは要点のみのプログラムです。※
>>104 ちなみに、
for(int i=1;i<99;i++)func(a[i]);
として処理した場合、後々のルーチンにバグが出てきます。
しかし、
int num;
for(int i=1;i<99;i++){
num=a[i]
func(num);
}
とすると、そのバグ はなくなります。
やはり配列そのものを関数に渡すのは駄目なのでしょうか?
理解不能
>>104-105 すみません。
要約すると、配列を関数に渡していいんですか、ということです。。
「配列そのもの」とは一体何なのか言ってみろ
>>104 それは配列そのものではなく、個々の要素を引数として渡しているだけじゃないか。
別のところで聞きます。どうも^^
>>109 言われてみればそうですね・・・。
『そのもの』というのは本に書いてあったので、俺も意味がわかってないです。
多分、func(a[i])のようにするのではなく、func(a,i)のように、
分けて渡すという形に書くべきだという事を言いたいんだと思っているんですが。
あとは別のところで聞きますね^^
>>111 要は普通の変数みたいに値渡しできないってことだろ
配列を関数に与えるときは、配列先頭へのポインタを渡す
ってかfunc(a, i)なんてしてるの見たこと無い
int func(char a[]){
return sizeof(a);
}
main(){
char a[100];
printf("%d\n",sizeof(a));
printf("%d\n",func(a));
}
こういうことかなあ
前後の文を読んでみないとよく分からんね
>として処理した場合、後々のルーチンにバグが出てきます。
>とすると、そのバグ はなくなります。
興味あるな。どんなプログラムなんだろ?
> void func(int i){ ・・・単純な四則演算の処理・・・ }
なんだよな?
116 :
デフォルトの名無しさん:2005/09/14(水) 20:59:53
文字を整数に変換する関数_ttoiは、有ったのですが
文字を実数に変換する関数_ttofは、無いのですか?
無いのであれば、どうやって変換するのでしょうか?
>文字を整数に変換する関数_ttoiは、有ったのですが
標準ライブラリならatoi()だろ‥‥_ttoiはVC++の独自関数じゃないのか?
文字から実数はatoiをふまえて予想汁。
118 :
116:2005/09/14(水) 21:10:21
言葉足らずですいません
VC++でUNICODEな環境のとき上記を解決できませんか
121 :
116:2005/09/14(水) 21:28:34
>>119 ありがとうございました。
ヒントに従ってこんな感じで組んでみたら
とりあえずコンパイルエラーは、出ませんでした
str = CString(buff);
ret = float(_tcstod(str,(_TCHAR **)NULL));
取り急ぎご報告まで
正直頭に_の付いた関数をユーザが使うのはどうかと
123 :
119:2005/09/14(水) 21:36:15
>>122 頭の_は単にANSI/ISO標準ではないという意味に過ぎん。
_が嫌なら規格厳密合致の狭い世界で生きてろ、と。
125 :
116:2005/09/14(水) 22:07:46
>>120,123
回答ありがとうございます。
大変参考になりました。
しかし、またもや言葉足らずですいません。
開発環境としてVisual Studio 6.0を使用していたのですが、
どうやらVisual Studio 6.0では、_tstofを使えないようです。
ちょろちょろと情報を小出しにしてすいませんでした。
気楽に質問できそうな雰囲気だったので、つい勢いで投稿してしまいました。
悪いけどatofしかねぇよ
sscanfなどで済む話じゃないの?
>>128 そういやそうだな
#include <stdio.h>
#include <wchar.h>
int wscanf(const wchar_t * restrict format, ...);
>124
いや俺はVCだけでプログラム組むわけじゃないので
VC++で書くときはTCHAR使うのが一般的な流儀なんだからしゃーないだろ
いざとなれば自分で書けばいいだろ。
>>131 そんな流儀が一般的な流儀なんて初耳だな。
VC++使ってるのにTCHAR使ったことなくてごめんなさい。
tchar.h使うとなぜかDirectXがうまく動かない
136 :
デフォルトの名無しさん:2005/09/15(木) 13:29:07
>>136 「C言語なら俺に聞け! Part 113」というタイトルのスレです。
あちらのほうで解決できました。スレ汚し申し訳ありません
マルチ、スレ汚しどころのひどさじゃない、
解決した、ってそれじゃまともなプログラミングできなさそうだが…
次の違いぐらいちゃんとわかるようになるよね?
/*1*/ char ch = 'A'; char *ch_p = &ch;
/*2*/ char str[] = "A"; char *str_p = str; /* or &str, &str[0] */
>>133 文字列を扱うほとんどのAPIにおいて、文字列がLPTSTRかLPCTSTR
ようするにTCHARのポインタとして宣言されてるのを知らんのか。
I18N&Windows9x系対応を可能な限り簡便化するための方策だよ。
なんだかどこかで話がずれてるような気がしないでもない
まぁ、知らんうちにTCHARは使っとるわな
143 :
凶笑面:2005/09/16(金) 02:15:11
今日の夜9時からフジTVで民俗学ミステリ凶笑面だ。
みんな、見ようぜ。 原作は新潮文庫から出てるよ。
俺はドラゴン桜を見るからビデオに撮るけどな。
144 :
787:2005/09/16(金) 04:48:51
MFCダイアログベースでアプリケーション作成しているのですが、スタートメニューのプログラムを起動するにはどうしたら良いですか?
例えば、[スタート]−[プログラム]−[XXXシステム]−[XXX]の場合ですが、ショートカットを起動するというイメージでしょうか?
CreateProcess() を使うのでしょうか?
教えて下さい。
開発環境:VC++6.0
動作OS:できればWin95〜WinXPまで
145 :
デフォルトの名無しさん:2005/09/16(金) 06:02:10
1Uって何ですか?
DXSTRUCTURE s = {sizeof(DXSTRUCTURE)};
↑のような書き方は↓のように言われるほど糞ってほんとですか?
904 名前:デフォルトの名無しさん [] 投稿日:2005/09/16(金) 08:09:58
結論はでてる。
仕様にも糞仕様ってものが存在する。
特にプログラムにおいて可読性は最優先事項だ。
一体
>>888で何が得られるものがあるのか激しく疑問。
就職作品なら書いてあった時点で落とす。あまりにもキモ過ぎ。
-ここから来ました------------------------
【C++】 DirectX初心者質問スレ Part5 【C++】
http://pc8.2ch.net/test/read.cgi/tech/1122031254/888-
>>147 俺は普通にやってるけどな。
後で0クリアするよりはスマートで見やすいと思うが。
>>148 私はこの書き方は、はじめてみたけど、
てっきりすべての要素をsizeof(DXSTRUCTURE)で埋めてくれるのかと思ったわ。
151 :
144:2005/09/16(金) 12:40:23
スタートメニューのディレクトリは
"F:\Documents and Settings\USER\スタート メニュー\プログラム\XXXXXXXX"
のようになっていてユーザ名が含まれているため固定で指定することはできません。
今ログインしているスタートメニューのディレクトリを取得する方法があるのでしょうか?
教えて下さい。
SHGetSpecialFolderPath
>>150 struct {
int a;
int b;
int c;
} foo = {1};
とすれば、1, 0, 0が入るのだけど知らなかった?
>>148 STARTUPINFOでぐぐると、STARTUPINFO sui = {sizeof(sui),};って例は結構見つかるね。
まぁ、DirectXスレで暴れているのは放置で。
C/C++でゲーム作ろうと思ったんですけど
使用者が多いVCの方が比較的いいのかな?
通常パッケージで2万か(´・ω・`)
>>154 正直dwSizeが一番上にあることが前提のソースだから悪趣味といえば悪趣味だな。
マニュアルに定義されてるからいいものの構造体の定義の順番を利用した
プログラムってのはあまりいいとは思えないな。
例えば
struct{int a,b,c;}HOGE;
と
struct{int a,c,b;}HOGE
で結果が変わってしまうってのがどうにも・・・。
間違いw
struct{int b,c,a;}HOGE;
とでもしておいてくれw
>>154 よくわからないんだけど、これをやると0クリアされるの?
>>158 ショッパナの要素だけにその値が入って、残りの値が0クリアされる。
>>158 ちょうどそのよくわからんってとこについて話してるw
よくわからないよな?
何度説明すればわかるんだ?頭悪いな
よくわからないんだけど、
struct {
int a;
int b;
int c;
} foo = {0};
ならば、全部の要素がゼロクリアされるという認識でいいのかな?
俺はわざわざmemset(&foo, 0x00, sizeof(foo))ってやってたよorz
まあ、大抵はmallocとの組み合わせだからいいんだけど。
じゃあ、
STARTUPINFO sui = {0}
でいいじゃん
というか、構造体のコンストラクタに初期化処理入れてるよ俺は。
>>156 俺の感覚だと、0クリアすることが主目的で
最初のメンバにサイズがあるからついでに入れとけ
って感じだ。
>>156 構造体の初期化構文そのものを否定しているのか?
>>158 初期化指定子を先頭から埋めて、残りは0が埋められる。
#って、>159が書いてたか。
>>162 その通り。その場合、{0}でも{0, 0, 0}でも同じ。
ついでに言えば、calloc()でも0で埋められるのでやはり、memset()は不要。
>>164 Cにはコンストラクタがないんでね。それに、0フィルではない点に注意。
167 :
デフォルトの名無しさん:2005/09/16(金) 16:08:33
つうかそもそもゼロクリアなんている?
構造体を出力先として使うならクリアなんてしなくていいし
入力元として使うなら、全てのメンバを規定値で初期化するのが普通だろうし。
構造体の変数の順序が変わっただけで、まともに動かなくなるコードなんて・・・
わざわざバグの原因を仕込んでるようなもの。
>>168 例えばコンストラクタ引数の並びだって
同様の危険性はらんでるし、それは仕方ないところじゃない?
>>167 ウィンドウズのAPIの場合はいる。
おそろしいことにポインタの有効・無効のチェックをNULLかそうでないかで判断している。
>>168 画像フォーマットのヘッダや通信関係のヘッダの多くがそう言う構成になってますが。
それとも、フォーマットが変わってもまともに動くように作れと?
#そうなると、単純なバイナリファイルのほぼ全てを否定することになるわけだが。
でも、メンバ名指定してコード書いてれば
並びが変わったとしてもリビルドさえすれば解決するけど、
STARTUPINFO sui = {sizeof(sui),};
みたく先頭にあると決め打ちしてると、コードを手作業で修正しないとダメじゃない?
>>172 大丈夫、MSにしろどこにしろ、そうそう簡単に順番変えて自分の首を締めるようなことはしないから。
#設計云々と言うことであれば、メンバにサイズを持つなんてこと自体がアナクロだが。
順番変えても大丈夫な方法があるのに、わざわざ変えられない方法を選ぶ意図がわからない。
特にメリットがあるわけでもないだろうに
struct hoge{
int a , b, c, d , e , f ;
};
hoge h={1,2,,3,4,5,6};
hoge h;
h.a = 1;
h.b = 2;
h.c = 3;
h.d = 4;
h.e = 5;
h.f = 6;
俺は初期化にこんな長いコードを書きたくないから前者の書き方が好き。
176 :
175:2005/09/16(金) 19:38:30
あ、,が1つ多かった......
別にどうでもいいことだなあ。
そんな瑣末なことは好きにしたら?と。
>>175 そのコードの記述が面倒だからってのを理由にする神経は理解できない。
まあ、いままでそうやって書いちゃった分はしょうがないけど、
これからはなるべく書かないようにしたいな。って内容でFAだろ。
もしくは、なるべく構造体よりクラスを使うことを優先するとかな。
179 :
175:2005/09/16(金) 20:39:52
>>178 クラスを使っても問題は解決しないと思うのだが。
どうやって解決するんだ?
class huga {
int ma;
int mb;
int mc;
huga( int a, int b, int c ) : ma(a), mb(b),mc(c) {}
}
huga h( 1,2,3 );
こうするのかな・・・
181 :
175:2005/09/16(金) 20:55:14
それは解決じゃない。
初期化する方法として、構造体のメンバの順に依存するのと、
コンストラクタ(or関数)の引数の順に依存するのには 大きな差は無い。
順番を変えると問題が発生するのは同じ。
182 :
175:2005/09/16(金) 21:10:03
で、それを解決するには自分が書いたように、
メンバに延々と代入する式を書くしかない。
10箇所で初期化があれば、
10箇所で延々と何行も代入する式を書くしかない。
初期化関数(いや、それどころか2引数以上の関数全て)を作るのも駄目だ。
なぜなら関数の引数の順に依存するのは駄目だからだ。
ま、自分はそもそも解決する気はないけどね。
順に依存するプログラムを
>>175で書いてるから分かると思うが、それを肯定してるから。
183 :
デフォルトの名無しさん:2005/09/16(金) 21:13:57
>>181 違うよ。
そういうイカレタコードの記述を制限できればいいんだよ。
一つ一つ代入する手間なんてプログラムを組んでるときに割く時間の1%にもみたない。
そんなの面倒臭がってる奴なんか絶対に使えない奴に決まってる。
184 :
175:2005/09/16(金) 21:26:02
>>183 すまん。なぜ、構造体の初期化式がイカレテてるのか理解できん。
struct hoge{
・・・・・・
・・・・・・
hoge(int a=0,int b=0,int c=0,........):a(a),b(b),c(d),........
};
こういうコンストラクタと意味的には殆ど等価でしょ?
せいぜい使うときに={...}か(...)の差しかない。
イカレタコードってほどでも無いと思うが
>>184 その辺の認識から違う人間と議論をするほど馬鹿じゃないよ。オレも。
186 :
175:2005/09/16(金) 21:36:58
>>185 了解。
お互い別の宗教の人ということで不毛な議論はしないでおきましょう。
自分もこの話題をこれ以上しても恐らく平行線のままと思いますから。
段違いヘイヘイホー
188 :
名無しさん@そうだ選挙に行こう:2005/09/16(金) 23:53:06
>>184 初期化と代入を混同している典型的バカ。
いやー、面白いなぁ
こんなコーディングマナー(?)講座でもあったら真っ先に出てきそうだな。
肯定するやつがいるとは世の中広いわ。
191 :
デフォルトの名無しさん:2005/09/17(土) 01:37:08
( ^ω^)
192 :
名無しさん@そうだ選挙に行こう:2005/09/17(土) 02:15:58
>>186 const変数とかリファレンスの変数は、初期化せずにどうやって
代入するおつもりですか?と聞きたい。
193 :
デフォルトの名無しさん:2005/09/17(土) 02:17:17
どちらにしろクラス内にリファレンス変数があったら、コンストラクタで全初期化
しないと、コンパイルエラーが出て先に進めない。
くだらなさすぎ
195 :
175:2005/09/17(土) 08:35:11
>>188 混同してる気はないな
メンバの順orコンストラクタの順に依存しない方法は全メンバ明示的に代入するしかない。
と言ってるだけだし(俺はそんな初期化が最初の段階で完結しない方法をしたいとは全く思わんが)
>>192 >>193 別に構造体の初期化式を必ず使えって言ってる訳じゃないし
それでカバーできない範囲はコンストラクタを使えば良い。
俺の論点はWINAPIなどのC言語用の構造体はコンストラクタが無いから、
その代わりに構造体の初期化式を使っても問題ないって言う主張だけ。
全メンバ明示的に代入するのはメンドイから。
>>188 初期化と代入を混同してる(同一視してる)のは >183 のほうじゃないか?
197 :
183:2005/09/17(土) 09:49:23
>>196 俺は初期化と代入なんて垣根はどうでもいいと思ってるよ。
ただ、構造体の要素の定義の順序がバグの原因になっちゃうようなプログラムはやっぱりよくないなと。
しかも、これってソース書くのが面倒なだけって理由で書くコードでしょ?
俺的には駄目。ちゃんと一つ一つ代入すればこういう危険なことが起こらないんだからそこはちゃんとする。
ちゃんとできることをちゃんとやらないってだけで、どれだけ面倒なことを減らせるかってのは
俺の経験でかなりでかいことがわかってるからこういうのは駄目。
198 :
デフォルトの名無しさん:2005/09/17(土) 10:23:31
MFCダイアログベースです。
自身を最背面に移動するコードを教えて下さい。
>>197 そもそも構造体の順序を変えるなんてことをするからいけないといってみるテスト。
200 :
198:2005/09/17(土) 10:28:57
::SetWindowPos(GetSafeHwnd(),HWND_BOTTOM,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE)
で良いですか?
>>197 メンバの順序変えることなんてあるかなぁ?
メンバを外に晒してるなら、インターフェースと同じ様に
後から変更加えるようなことしちゃマズイと思うけど。
>>197 >ただ、構造体の要素の定義の順序がバグの原因になっちゃうようなプログラムはやっぱりよくないなと。
つまり、構造体をそのままファイルストリームにバイナリとしてロード/セーヴするコードの存在意義を全て否定するわけだね。
>>197 > 俺は初期化と代入なんて垣根はどうでもいいと思ってるよ。
C++使っててそんなこと言う奴は勉強のやり直しが必要。
Cだけしか使わない人ならまだ許せるけど。
まぁ、自分の書きたい様に書けばいいさ。
それが周りからどう見えるかが気にならない人は。
>>201 もし、それをやっちゃうにしても、
それをしてはいけないということをどこかに書いておかなきゃいけないでしょ?
そういうの書く手間を考えたら1つ1つ代入するのが面倒だからなんて発言でないと思うんだけど。
>>202 実際、役に立たないっしょ。
要素に関連項目があっても追加をするには下へ追加していかなくちゃならないし。
なにより変更に激弱で全く役に立たない。
>>203 いや、早合点すんな。
この問題でってことだよ。
他人の書く、「構造体の順序を変えるような仕様変更は通常有り得ない」という言葉が目に入らないんだろうね。
それはさておき、X11ではこんなことがあった。
GCという構造体があるのだが、この内部の仕様は公開されていたがアプリケーションが直接設定してはいけないとされていた。
勿論そのため、内部の値を設定/取得する関数が公開されていた。
いくつかは忘れたが、あるリビジョンからその内部構造が見えないようにインクルードファイルが変更された。
つまりこの場合では、内部構造に依存するようなコードは変更を余儀なくされた。
この例では、確かに「構造体の内部仕様が変更されたら動かなくなるコード」がよくなかったように見える。
しかし問題は、「アプリケーションが直接設定してはいけない」という仕様を無視したことに問題があるわけで、
WinAPIなどのように内部に直接値を設定しておかなければならない仕様とは根本から違う。
>>205 それは新しく構造体やインターフェースを作る側の話だろ。
既に構造体が宣言順も含めてインターフェースとなっている
Windows & C/C++ 環境でプログラミングする側の話と、噛み合ってないぞ。
>>208 いや、だから、「それってどうよ?」ってのが今の話題なんジャマイカ?
>>208 >既に構造体が宣言順も含めてインターフェースとなっている
なっていても変更される可能性は残されているよね?
まあ、変化に強いプログラムコードを書くことは悪いことじゃない。
でも、めったにないことまで考えてややこしいコードを書くのもど
うかと思う。
構造体への個別代入はトレードオフのグレーゾーンだから結論は出
ないと思う。
どっちがより良いかは、プログラマーの性格や環境に依存するからな。
個人なら、自分の好きなように書けば良いし、プロジェクトならコー
ディングルールで決めておけば良い。
とにかく、結論は一つだ。
「自分の好みを人に押し付けるな。」
>>209 そんな話なら「今ならもっといい仕様にできたかもしれないね」
って話になっていいかげんにスレ違い。
>>210 それによる混乱は変更した奴、または元のインターフェース決めた奴の責任。
構造体が仕様として公開されてるなら、
使う側がメンバの並びに依存することは問題ではない。
>>212 じゃあ、君は仕事でそうやって説明するといいよ。
他の人のプログラムは動いてる中でね。
>>213 ちょっと聞かせてほしい。
たとえば Point 構造体がこんなふうに定義されてて、
struct Point { int x,y; };
なんかの座標データのテーブルを持っておこうと思ったら、
普通こんな感じになると思うんだ。
Point const table[] = {{1,2},{3,4},{5,6}};
でもこのコードじゃぁ struct Point { int y,x; }; という変更に耐えられない。
君ならどう書くのかな?
>>214 だからそのstruct Point { int y, x; };という変更が起こることがありえないと散々書かれていただろ。
普通は少なくとも過去との互換性という名目の下に古いPointも(しばらくは)使えるようにするはずだ。
まあ答えになっていないと言われそうだが。
俺なら、Perlで、ソース書き換えスクリプトを作る。
>>214 昔、それと同じ問題でモデリングソフトからのデータのY軸とZ軸が
自分のプログラムの座標系とひっくりかえってて
struct XYZ{float x,z,y;};
って定義して変換して大変な目にあった、馬鹿な同僚がいたのを思い出したw
>>214 ヒント:マクロ
219 :
213:2005/09/17(土) 12:21:42
>>214 長いことゲームのプログラム扱ってて
座標とかのプログラムはなれてる方だと思うけど、
そんな状況はほとんど無いからやったこと無い=考えたことも無い。ってのが正直なところ。
>>218 217 じゃないけど、こういうことじゃねーの?
#ifdef OLD_SYSTEM
#define POINT_DATA(x,y) {(x),(y)}
#else
#define POINT_DATA(x,y) {(y),(x)}
#endif
Point const table[] =
{
POINT_DATA(1,2),
POINT_DATA(3,4),
POINT_DATA(5,6),
};
>>220 それならPointかその派生クラスにコンストラクタをつければいいだけじゃないか。
関数ポインタのテーブル化で悩んでいます。
Class B
{
static __m128i ( B::*Test[] )( int n );
__m128i TestA( int n );
};
__m128i B::TestA( int n )
{
//省略
}
__m128i ( B::*B::Test[] )( int n ) =
{
&B::TestA, // c2440
};
error C2440: 'initializing' : cannot convert from '__m128i (__thiscall B::* )(int)' to '__m128i (__thiscall B::* )(int)'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
戻り値がintの時は問題なかったのですが、
この場合は、__m128i(union)だからなのでしょうか?
>>224 それいいと思ってやってるの?
悪趣味なコードだな。
リフレクションがやりたいんだろうな。
227 :
デフォルトの名無しさん:2005/09/17(土) 13:15:08
tyoeofキーワードが装備されるまで待て。
typeofか?そんなもんいつまで待っても無理だよ。C++0xにもないだろ。
exportよりは希望が持てる。
230 :
224:2005/09/17(土) 14:34:17
素直にswitch-caseで処理することにします。
お邪魔しました。
>>147の904てどっかの中堅エロゲ会社の主任プログラマか何かですか?
こういう偏屈なボスがいると先細りだね
>>231 いや社会経験ゼロの脳内PGだと思われ。
233 :
デフォルトの名無しさん:2005/09/18(日) 14:42:47
猫のC++ってiostream.h世代かよ…
237 :
どりーむ:2005/09/18(日) 15:11:27
今ファイルの読み込みを試みようとしようとしてるんですが、
うまい事いきません。
もし足りない所があれば助言よろしくおねがいします。
コード
struct MovieItem{
long callNo;
char title[50];
bool status;
int frequency;
MovieItem *next;
};
238 :
どりーむ:2005/09/18(日) 15:12:34
in.open(file, ios::in);
if(!in.is_open()){
cerr << "\nInput file" << file << " does not exist\n" << endl;
cerr << "Please check your file.\n" << endl;
exit(1);
}
while((ch=in.peek())!= EOF){
tempITEM.callNo = 0;
strcpy(tempITEM.title, " ");
in >> tempITEM.callNo;
in.getline (tempITEM.title,sizeof(tempITEM.title),';');
tempITEM.status = true;
tempITEM.frequency = 0;
in >> tempITEM.status;
in >> tempITEM.frequency;
addResult = MS.addNode (tempITEM);
if(addResult != 0){
if(addResult == -1){
cout << "Memory overflow adding movie\a\n";
exit (120);
}else{
cout << "Duplicate year: " << tempITEM.callNo << " not added\n\a";
}//Second IF
}// First IF
} // while
in.close();
240 :
どりーむ:2005/09/18(日) 15:13:16
猫の中の人はあれで商売してるから、むしろ積極的に聞くべきだよね。
C言語で質問です
文字列を外部から入力するのに
char *p;
gets(p);
ってやるとおかしな動作したりするんだけど
どうしてですか?僕が思うにメモリの確保とかそこらへんに
問題があると思うんですけど
char str[80];
char *p = str;
gets(p);
ってやらないと駄目かなぁ
ん
う こ
>>243 そのとおり。
char *p;と宣言してもpはどこかを指せるというだけで、まだどこのメモリも指していない。
あとgets使うな、fgets使え。
247 :
デフォルトの名無しさん:2005/09/19(月) 10:32:17
なぜgetsではいけないのですか?
>>247 別にgets()使ってもええよ。但し自己責任でな。
>>248 google getsを使うな だが実践は違う。
251 :
247:2005/09/19(月) 10:40:28
なぜgetsを使っていけないのか知っている奴だけ、getsを使ってよし。
_ _
/´⌒´⌒\
/ 〃 ハ ヾヽ
| ノ∠、ノ,ムヾ |
(|| ━` i ━ ||)
∩{ r ┘ 、 }∩
_|└9 k='=ヶ} 6┘|_
/ にニ}、_ ̄´_/にニ} \
|ヾ トーイ{≫又≪}ト―イ 〃 |
getsを使うと↑の人みたいに時代から取り残されます。
こそり使ってます。
他人に見せたり、配布してはいけません。
FreeBSD オンラインマニュアル和訳版より抜粋
バグ
通常、次の入力行がある任意の長さより短いことを保証するのは不可能であり、
また入力バッファをオーバフローするとほぼ必ずセキュリティ違反となるため、
プログラムでは gets() を 絶対に使用しないでください。 gets() は、 ISO/IEC
9899:1990 (``ISO C89'') に適合するためだけに存在しています。
まあ
char str[BUFSIZ];
fgets(str, sizeof(str), stdin);
とかやっとけ
STLのListについての質問。
ある要素を指しているite1が、ite2の前に新しく要素を挿入した後も、
引き続き同じ要素を指しているようにするには、
if (ite1 == ite2)
ite1 = list.insert(ite2, p); // ite1が宙ぶらりんにならないように
else
list.insert(ite2, p);
とすりゃいいいんだよね?
260 :
258:2005/09/19(月) 20:05:46
了解
>>258 list.insert(ite2, p) で十分だと思うが。
何を心配してるの?
>>262 STLの話題だけでも結構多いから、俺はC++でまとめなくてもいいと思うよ。
C++ってーとやっぱりこっちも入っちゃうじゃん。
STLばっかり散りばめられるとさすがに読み難いからよ。
なにせこの言語、話題が多いし、仕様が変だし。
265 :
258:2005/09/19(月) 20:37:00
ごめん。すごく勘違いしてた。
とにかく疑問は解消した。ありがと。
>>264 いや、話題が多いからわけようって話なんだけど?
大きく複雑なものは、小さく単純な形にわけること。
これはプログラムの極意だよ。
>>266 わけるには明確に区別可能であることが必要じゃないのか?
>>267 いいじゃん。とりあえずSTLとそれ以外で。
この辺は厳密じゃなくてもわかりゃいいでしょ。
すごい適当だなw
>>268 わかんないから問題なんだろ。 string とか iostream とかな。
271 :
デフォルトの名無しさん:2005/09/19(月) 21:34:38
>>270 日本語わかんない猿なの?
テキトーでいいっていってるだろ。
年がら年中そんなどっちか微妙な質問ばっかり飛び交うわけじゃねぇんだ。
分かる奴が誘導してやるか、ちょうど分かる話題だったらその場で即答で解決すりゃそれでいいだろ。
おまえら、ageてまで何スレ違いやってんの?
キレたw
何でこんな荒れてるのかよくわからないんだけどここは環境依存はOKだけどSTLはスレ違いなの?
>>275 説明しよう。
適切なスレに誘導するのがスレの仕事だが、
この場合(>258)どっちのスレに誘導するべきか、という話。
"STL"という曖昧さをもった呼称(参照:>264)による区別をやめよう、というものと、
曖昧なままでもいいじゃないか、というものが言い争っている。
このスレ自体が曖昧な存在じゃねーの?
関数のポインタをtypedefで定義する場合、どう記述したら
宜しいのでしょうか。
int test( void (*pFunc)(int, int, int ,int) ); を
int test(FUNC *pFunc); 等と簡潔に記述出来ると嬉しいのですが。
>>278 typedef void (*FUNC)(int, int, int, int);
int test(FUNC pFunc);
即レス有り難うございます。 早速試してみます。
関数ポインタに*なんて要らんじゃろ
メイン関数の引数 int argc, char *argv[] の関数名について、
argってのはargumentのことだとおもうんですけど、cとvはなんの略なんでしょうか?
気になったんですけど、考えてもハマる単語がでてきません
count
value
>>283 カリ引数の名前なんて何でもいいんだよ
argc, argvとか付けたのは蟹版とか金持とかだろ
奴らのセンスのなさをあざ笑ってやれ
「だっせーcreat()って何県の言葉?create()にしたってギリギリ6文字じゃん」
みたいな
おっとこれは違う話だった
switch文ので文字列を比較することすることってできないですか?
case "文字列":
文;
break;
case "文字列":
・
・
・
って感じで。
なんか出来ないっぽいんですけど
出来ないっぽいじゃなくて出来ない。以上。
先頭の文字だけでswitchするならできるが文字列全体は無理
そうですか…ありがとうございました。
関係ないですけど、僕、switch文つかう時いつもswichって
スペル間違えちゃうんですよね^^
ふーん。
ここは手前の日記じゃないんだっちゅーの
俺は母ちゃんの奴隷じゃないんだっちゅーの
trueをtureって間違えることは良くあるがな
>>294が母ちゃんの奴隷であることはtrue(真)ですがな
文字列比較して数値を返す関数使うべし
TSV形式のテキストファイルをリソースとして実行ファイルに埋め込み、
fopenで開きたいのですがどうすればいいのかわかりません。
どなたか御存知でしたら御教授お願い致します。
スレ違いだったらすみません…。
>>297 普通は同じディレクトリに置いて読むと思うけど、それじゃダメなの?
つか、実行ファイルに埋め込む意図がわからない。
実行ファイルに埋め込むくらいなら、ソース中でテーブル定義した方が良いかと。
Tab Separated Values
データをタブ文字で区切って並べたファイル形式。
主に表計算ソフトやデータベースソフトがデータを保存するときに使う形式だが、
カンマ区切り形式(CSV)で保存されたファイルと同様に汎用性が高く、多くの電子
手帳やワープロソフトなどでも利用できる。このため、異なる種類のアプリケー
ションソフト間のデータ交換に使われることも多い。実体はテキストファイルで
あるため、テキストエディタやワープロなどで開いて直接編集することも可能。
...そのまま開けよw
うーん、ユーザーにあまりいじって欲しくない部分なのでファイル中に隠蔽したかったのですが…。
大体300行6列ぐらいのテキストです。まあ、もう少し調べてみます。
駄目だったら拡張子変えて読み取り専用にしてごまかすかな…。
じゃテーブルでソース埋め込みでいいじゃん
Win32の話であれば、ユーザ定義リソースとして埋め込むのが普通じゃないのかな。
TSVは所詮テキストだからSTRINGリソースとして入れることも考えられるが、
その場合は改行を\r\nのように記述しなければならない。
リソースを読むにはfopen()ではなく、
FindResource(), LoadResource(), LockResource()のようなAPIを使う。
どーしてもfopen()で読みたければ、fopen()で実行モジュールを開き、
「自分で」リソースヘッダを検索することになるが、馬鹿馬鹿しいから
そんなことはしないように。
詳細は
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win75.html でも参照のこと。
テーブルってVC++だとリソースビューにあるString Tableのことですか?
使い方がよくわからないので勉強してみます。
リロードしてなかったorz
>>302 ありがとうございます。早速調べてみます。
ソースに普通に数値の配列でぺたぺたと載せれ
>305
別に数値とは限らないのジャマイカ?
文字列で分岐する場合、どういった方法がスマートなのでしょ。
今丁度拡張子の分岐に
if (StrComp(sExt, "GZ"){
} else if (StrComp(sExt, "ZIP"){
} else if (StrComp(sExt, "LZH"){
}
等と書いていて、もの凄く不毛に感じた所なのですが。
拡張子程度なら、4バイトを数値扱いしてswitchで分岐しても
良いんですかね。
>>307 凝りたければ色々テクニックは考えられるが、if/elseが
一番愚直で普通な方法だよ。
ま、それが嫌なら、有りがちなのはテーブル用意することかな。
struct tbl_t { char *name, void (*fn)(void *arg) } tbl = {
{ "gz", gz_func },
{ "zip", zip_func },
:
{ 0, 0 }
};
みたいにしといて、
for (tbl_t *p = tbl; p; ++p)
if (!stricmp(ext, p->name))
(*p->fn)(arg);
みたいにやる。
int l, n;
DWORD dwExt=0;
for (l=0; l<4; l++) if (!sExt[l]) break;
for (n=0; n<l; n++) dwExt|=sExt[n]<<(l-n-1)*8;
switch(dwExt){
case 'ZIP': case 'LZH': case 'GZ':
break;
case 'BMP': case 'PNG': case 'JPG': case 'JPEG':
break;
}
GCCではマルチキャラクター云々と警告が出ましたが、
とりあえず動いた・・・けど良いのかな。
>>309 それだと最初の1文字しか判定に使われてないと思うよ。
この場合はかぶってないから動くだろうけど
'複数'を16進で吐いてみたら、ちゃんと数値になってますた。
警告出るから、あまりやってはいけない事なんですかね。
中に文字が複数入った文字リテラルの値は処理系依存。
リソースに置いたんじゃリソースハッカーとかのツールで簡単にいじられちゃうんじゃないか?
こんにちは。
gcc(RHEL), MinGW(Win), Visual Studio .NET(Win)の各環境でC++を使って私用ミニツールなど
を作ったりして仕事してる、一介の営業マンです。最近はサービスでお客さん用のツールなんか
も作ったりし始めました。SE受注減らしてどうするんだって感じですが。
C/C++でのpthreadに関する質問です。
pthread_createでガーっと並列にスレッドを作って仕事をさせ、pthread_joinを回して終了を待つわけな
のですが、
pthread_joinはブロックするので、先頭のスレッドが長引いちゃうと後に続くスレッドが先に終わってても
ボケーっと待ってしまいますよね。
これを、スレッドが終了した順に処理する方法ってありますでしょうか?
よろしくお願いします。
enumによる定数値をswitch文で使いたいのですが、
これに代わる似たような使い方ってありますか?
#defineだとスコープが広くなってしまうので。
enum で列挙した値には整数値が入ってるけどそれじゃだめ?
>>315 switchにenumって使えなかったっけ?
>>315 enumした識別子をそのままcaseに書けばいいじゃん
#define だとスコープが広くなるの?
全然
322 :
デフォルトの名無しさん:2005/09/21(水) 22:01:44
MeのVC6やBCCで、VK_PAGE_UPを使いたいのですが、
定義されていないと出て使えません。
VK_HOMEとかVK_UPとかは使えるのですが、
何か別途インクルードなどしないといけないのでしょうか。
その手のエラーは大抵は
StdAfx.hのWINVERかWINNTかWINDOWSマクロで定義されている
バージョンが違うせいだ。
>>315 マクロはただの置換だから、スコープ云々は関係ない
さらに言うと、enum定義もスコープは関係ない
#define DEF_HOGE 3
enum{
ENUM_HOGE = 3,
};
とした場合、以下は全く同じ物。
case 3:
case DEF_HOGE:
case ENUM_HOGE:
325 :
322:2005/09/21(水) 22:17:28
>>323 ありがとうございます。
キーワードを元にもう一度調べてみます。
MEというのが曲者だな。NT系しか使ってないから分からないが、
WINVERが0x500じゃないと駄目なんてのもあるしな。
>>320 namespaceの事を言いたかったんではなかろうか?
>>322=
>>325 定義されてる名前が違うから定義されてないと出るのは当たり前
PageUpはVK_PRIOR、PageDownはVK_NEXT
>>323 もうちょっと良く調べようや?
329 :
323:2005/09/22(木) 03:46:13
>>328 釣られているのに気が付かなかったのか?w
2chでの質問に真剣になって調べる人って素敵過ぎる
>>330 そうすると、俺ってばここ数年は素敵過ぎっぱなし。
332 :
322:2005/09/22(木) 06:32:39
>>328 ありがとうございます。
なるほど、名前自体が違っていたとは。
マジナン使わずに済みました。
333 :
322:2005/09/22(木) 06:37:29
現在、C言語でプログラムを開発しているのですが、
ちょっとした処理をラップしたいときに、
マクロ、インライン関数のどちらにするべきか迷っています。
(コンパイラはインライン関数をサポートしています)
関数をマクロ化するのと、インライン関数化するのでは
型チェックをする以外に何か大きな違いはありますか?
>>335 俺ならインライン関数でできることはインライン関数にする。
あと、インライン関数なら必然的にブロックを作ることになるので、
何も考えずともローカル変数を宣言できる。
マクロはデバッガが追ってくれない
問答無用でインライン
339 :
335:2005/09/22(木) 15:27:04
>>335 インライン関数はC99だから、まだ移植性が無い点に注意だ
移植性が大事なら、マクロにしといたほうが無難
あるプログラムでデバッグでは正常に動くのですが、
リリースだと不特定の場所でアプリケーションエラーが起きてしまいます。
色々コメントアウトしていって確認した所、
下記のコードをコメントアウトするとリリースでも正常に動くようになりました。
下記のコードは不正な処理なのでしょうか?
char chStr[1];
//strReadはCString文字列(2バイト文字の場合もあり)
strcpy( chStr, strRead.Left(1) );
答えはそのままで、
1バイトしか確保してないところに2バイト入れてるからじゃないの?
>>341 ヒントをあげよう
[NullTerminatedString]
[NULL終端文字列]
なんつーか、勉強不足にも程があるな・・・
1個だけ配列を用意するんだったら変数でも良いよな
346 :
341:2005/09/22(木) 16:46:36
>>342 すいません、strReadですが2バイト文字が入る可能性は無かったです。
>>343 NULL終端文字列とやらを調べてみたのですが、イマイチ分かりません。
よくわからないのですが、下記のように直したら正常に動きました。
下記の処理だと問題ないんでしょうか?
char chStr[1];
//strReadは
chStr[0] = strRead.GetAt(0);
//strcpy( chStr, strRead.Left(1) );
>>346 ・strRead.GetAt()がどのような関数であるかわからないと、何とも言えない。
・chStr[]がプログラム中でどのような働きをしているかわからないと、何とも言えない。
一時間も調べないうちにあきらめるのか・・・ハァ・・・
>>346 strcpyはコピー先の末尾に文字列の終端の印として'\0'を書き込む。
だからchStrにstrcpyで1文字書き込むならchStrの要素数は少なくとも2以上必要になる。
chStr[0] = strRead.GetAt(0);とするのは間違っていないが、そもそも要素数1なのでchStrは配列にする必要がない。
>>348 同感。
350 :
341:2005/09/22(木) 17:03:25
>>349 どうもありがとうございます。
>strcpyはコピー先の末尾に文字列の終端の印として'\0'を書き込む。
ということを知りませんでした。
chStrも確かに配列にする必要もないですね。
勉強不足のようですいませんでした。
>>350 お前、C言語の入門書もロクに目を通してないだろw
サンプルコードなぞることすらやってない臭いがするw
>>351 原文の修飾関係を完全に読み誤ってるな
プログラミング何もしらない奴が訳したのか?って思える出来
素直にCygwinなりLinux実機なりでman使った方が数百倍マシ
普通に、「終端文字を含めてコピーします」とか書いてるマニュアルもようけあるのに、
何が知りませんでしただ。
なさけない・・・
>>355 いや、このレベルのことすら知らないのはC言語の入門書の
サンプルコードすら打って無いレベルだよ。
普通は入門書にね、文字列をいじるコードがちょっとはあるはずだから。
ま、C言語入門者がみんな最初に入門書を一冊読むようになれば
このスレの質問は1/10以下に減るでしょ。
二つの文字列は重ならない。
360 :
デフォルトの名無しさん:2005/09/23(金) 07:57:29
VC.net使ってます。
ttp://www.winapi-database.com/System/Time/GetLocalTime.html のサイトからコードをコピーしてVCで「ソリュージョンのビルド」をしたのですが
エラーがでて動きません。
どなたかご教授お願い致します。
VOID GetLocalTime(
LPSYSTEMTIME lpSystemTime
);
でたエラーはこれです。
c:\Documents and Settings\user1\My Documents\Csample\test\test.cpp error C2146: 構文エラー : ';' が、識別子 'GetLocalTime' の前に必要です。
c:\Documents and Settings\user1\My Documents\Csample\test\test.cpp error C2501: 'VOID' : 識別名を宣言するのに、型が指定されていません。
c:\Documents and Settings\user1\My Documents\Csample\test\test.cpp(2): error C2065: 'LPSYSTEMTIME' : 定義されていない識別子です。
c:\Documents and Settings\user1\My Documents\Csample\test\test.cpp(3): error C2146: 構文エラー : ')' が、識別子 'lpSystemTime' の前に必要です。
c:\Documents and Settings\user1\My Documents\Csample\test\test.cpp(3): error C2501: 'GetLocalTime' : 識別名を宣言するのに、型が指定されていません。
c:\Documents and Settings\user1\My Documents\Csample\test\test.cpp(3): error C2059: 構文エラー : ')'
>>360 とりあえず本を一冊くらい読めって・・・
>>360 エラーの出た場所の見直しくらいしてから来い
そもそもプロトタイプ宣言を理解してなさそうだが
>>362 場所やプロトタイプ云々の前に、行数を見た感じ・・・
365 :
デフォルトの名無しさん:2005/09/23(金) 10:01:28
366 :
デフォルトの名無しさん:2005/09/23(金) 10:07:04
VC++ .Net 2003、WindowsXP SP2です。
ダイアログベースアプリで以下の個所で異常が発生して「TODOうんたらかんたらマイクソソフトに送信しますか?」
となってしまいます。
CString str;
m_Edit.GetWindowText( str ); ←ココ
VCの入ってるマシンでは起きません。VCの入ってないマシンにMFC71.DLLやMFC71JPN.DLL等をコピーして
動かしています。なぜここで異常が起きたかわかったかというと、GetWindowText()の前後に
ファイルにログを出すようにしてて、GetWindowText()の前までしかログが出てなかったからです。
で、実は以下のようにしたら異常が出なくなりました。
CString str;
str.Empty();
m_Edit.GetWindowText( str );
GetWindowText()の中を見たらCStringのGetBuffer()とかReleaseBuffer()をやってたんでEmpty()を呼ぶように
してみたんですが、なぜかこれで改善されました。
しかし宣言したばかりのCStringを引数に使うことってよくあると思うんですよ。
なぜEmpty()を入れないといけないのでしょうか? それともEmpty()を入れたら異常が起きにくくなってるだけ
なのでしょうか?
367 :
デフォルトの名無しさん:2005/09/23(金) 10:13:08
VC++6.0、windowsXPです
マウスの座標をプログラム側で操作することは可能でしょうか
C言語を初めて7日です。
コンソールアプリで、標準入力から値をもらう時オーバーフローが起こる時があるそうなので、調べて次のような関数をを作りました。
戻り値は*charです。
char bufs[LENGTH], *s,*rs;
s = bufs;
rs = fgets(s, LENGTH, stgin);
fflush(stdin);
return NULL != rs ? s : NULL;
今のところは問題なく動いていますが、危険な場所があれば教えていただけませんか?
fflush(stdin); ←これって環境によって動きが変わる気がするんだが
>>368 危険ではないけれど、bufsをsに代入するのは無駄。直接fgetsの引数にしてしまえ。
fgetsの戻り値はNULLか第一引数を返すとなっているからreturn rs;とだけ書けばいい。
C言語は詳しくないんだけど、AUTO変数はreturnした後中身を保証されてるの?
>>368 関数ローカルな変数へのポインタを返しちゃダメだよ。
374 :
368:2005/09/23(金) 11:31:17
レスありがとうございます
>>370 動作が処理系依存?のようですね。
あってもなくても動くので、様子を見ながら使おうと思います。
>>371 大変参考になりました。
ありがとうございました。
>>374 釣りご苦労。
釣りじゃないなら、>373をよく読むように。
376 :
368:2005/09/23(金) 12:37:49
書き込んですぐブラ閉じてしまいました…
ということは、関数の呼び出し元でchar配列を生成し、それを引き数に渡してそこに入れれば良い、ということでしょうか?
別に関数内でmallocなりして返してもいいぞ
ただし、ちゃんと解放しないといけないけどな
378 :
368:2005/09/23(金) 12:53:39
なるほど…
ありがとうございました
>>367 mouse_eventとかSendInputでお調べ
>>368 > オーバーフロー
というよりは、要するに行が長くてfgets()で1行が読みきれなかった
場合の対策か?
その場合に単に行の残り(改行文字まで)を読み捨てたい、というのなら
fflush()では間違い。
そもそもfflush()のこうした使い方は規格上には保証されていないが、
それが動作する場合であっても、単に現在読み込み済みのバッファの
中身を空にするだけだ。
それ以上行が長ければ、次回はまた行の続きを読むことになる。
UNIX C(OSはAIXです)について教えてください。
setuid、setgid関数を使用して任意のユーザ権限で処理を実行するプログラムで、
環境変数HOMEを起動したユーザのホームディレクトリから任意ユーザのホームに変更するよう
setenv関数を使用したのですがHOMEの内容は変更されませんでした。これって仕様なのでしょうか??
>381
>setenv関数を使用したのですがHOMEの内容は変更されませんでした。
どうやって調べた? 親プロセスの環境変数を変更することはできないぞ。
setenvしたプロセスと、そのプロセスの子プロセスの環境変数が変更されているはず。
改頁の'\f'について訊きたいんですが、これはどういう効果があるんでしょうか?
printf("あ\fい\fう");
としてみたら、"あ い う"とスペース?が入っただけでした。
どういう場面で使うものなのでしょうか?
\fを改ページとして認識するシステムに対して使う。
printfで何故そうなるかは
printfのマニュアルしらべて\fが何の効果になってるか調べてみればわかる。
>384
FF(FORM FEED)をプリンタ、特に昔のラインプリンタに出力すると紙送りが行なわれた。
今のプリンタは、普通はPDLでページ単位に出力するためフォームフィードが出力ページに
含まれていても特に何も起きないえでお。
387 :
381:2005/09/23(金) 19:02:29
>>383 dbx使ってsetenvの所でstop。
ステップインしたところでsh envとしたのですが間違いでしょうか?
>387
それは、dbxの子プロセスの環境を表示しているだけで、
デバッグ対象のプロセスの環境を調べているわけではない。
389 :
381:2005/09/24(土) 03:12:14
>>388 setenv後にsystem関数でenvを実行してみたんですが結果は同じでした。
理想はsetuidしたユーザのホームディレクトリが環境変数HOMEに入ることなのですが
>>389 >setenv後にsystem関数でenvを実行してみたんですが
この辺りのコードを具体的に。
391 :
デフォルトの名無しさん:2005/09/24(土) 05:07:30
質問です。(WindowsXP VC.net)たとえば、
クラスAnimalから派生しかクラスがいっぱいあった場合、
vector < Animal * > table;
に色んなクラスのポインタを登録したいんですけど、
string name;
...
if (name=="inu") table.push_back( new Dog );
else if (name=="neko") table.push_back( new Cat );
else if (name=="buta") table.push_back( new Pig );
...
みたいのを
for(...){
if (name == classTable[i].name){ table.push_back( new classTable[i].class );break;}
}
みたいにすることって出来るでしょうか
もし出来るとしたらclassTable[].classはどういう型にしてどう初期化すればいいですか?
>>391 これはまた危険な使い方を・・・
型縛りが嫌ならvoid*でも使えばいいんじゃね?
個人的にはオススメできない組み方だなぁ・・・
問題の本質は要するにプログラムが上手くないから型が邪魔になっちゃってるんだよね。
関数テンプレートで渡された型をnewして返すとか出来ないかな
俺のレベルじゃよくわかんないけど・・・
無理やりやるならこんな感じ
#include<string.h>
#include<vector>
template<typename T>struct ClassTable{char*Name;T*(*New)();};
template<typename T,typename T2>T*New(){return new T2;}
struct Animal{virtual ~Animal(){}};struct Dog:Animal{};struct Cat:Animal{};
ClassTable<Animal>classtable[]={"Dog",New<Animal,Dog>,"Cat",New<Animal,Cat>};
enum{length=sizeof(classtable)/sizeof(classtable[0])};
int main(){
std::vector<Animal*>a;
char*Name="Dog";
for(int i=0;i<length;++i)
if(!strcmp(Name,classtable[i].Name))a.push_back(classtable[i].New());
}
>>391 > string name;
> ...
> if (name=="inu") table.push_back( new Dog );
> else if (name=="neko") table.push_back( new Cat );
> else if (name=="buta") table.push_back( new Pig );
> ...
ここの部分で Factory パターン使えば済む話ではなくて?
396 :
391:2005/09/24(土) 08:25:06
助かりました&勉強になりました。
教えていただけば「なるほど、そうだよね」なのですが、
自分ではどうやってもあと一歩が書けませんでした。
本当にありがとうございました。
397 :
391:2005/09/24(土) 08:53:40
>>395 あ、おはずかしい。なんかそういう話みたいです。勉強します...
>>395 Factory パターンって何だよ。
Abstract Factory も Factory Method もあてはまらないぞ。
やりたいのは、名前を指定して対応するオブジェクトを作成することだろ。
この場合はPrototypeパターンが一番近いだろうなぁ
>>394 こうやってまとめる意味ってないと思うんだけど
結局、何がやりたくてこんなソースになるわけ?
401 :
394:2005/09/24(土) 13:10:19
std::map<std::string,T*(*)()>を使うほうが綺麗だったな。どうでもいいけど
402 :
381:2005/09/24(土) 13:35:40
>>389 sprintf(userhome,"/home/%s",argv[1]);
setenv("HOME",userhome,1);
rtn=system("/usr/bin/env |grep HOME");
>>402 最小単位の a.outを setuidとか dbx 無しに、じかに実行して確認しました?
AIX か。setenv(3)の引数の仕様を確認できないんだけれど(setenvあったっけ?)、
putenv() では確認しました?
つうか、system()とは別に getenv()くらい確認してみれば?
簡単なデバグや確認作業ができないのは問題だなあ…
>>381 例とかもいろいろ突っ込みたくなるが…
>setuid、setgid関数を使用して任意のユーザ権限で処理を実行するプログラムで、
初心者かどうかにかかわらず、今更素人がそんなプログラム書くのやめろよと…
404 :
TOM:2005/09/24(土) 17:24:27
C++のMAPでキーの値に128ビットの値を持たせたいんですけど、
どうすればいいんですかね?
128ビットの値をキーにすれば良い。以上
406 :
TOM:2005/09/24(土) 17:31:13
>>405さん
intとかlongじゃあふれちゃいますよね・・。
配列とかにするってことですか?
よろしくです。
128ビットを扱うクラスでも作れば?
typedef std::pair<std::pair<int,int>,std::pair<int,int> >value_128;
とか。
初期化が面倒だけど
128bitなのになぜintやlongで溢れると思うのか謎ぃんだが
int2つよりlong2つのほうがよくね?
411 :
デフォルトの名無しさん:2005/09/24(土) 17:52:09
>>403 レスありがとうございます。
今の案件落ち着いたら頑張ってまともなC言語書けるようにします。
>>409 longって多くても64bitじゃなかったっけ?
C++にstdint.hがあればなぁ……
414 :
デフォルトの名無しさん:2005/09/24(土) 18:16:21
VC++の質問なのですが
構成をReleaseにしたexeを起動すると
STLの map insert 3回目(for文で7回繰り返す予定)
で 「問題が発生したため〜」で止まってしまいます。
ですが、VC++の方でビルドすると、問題なく実行します。
MessageBoxをちょこちょこ追加しながら見てますが
mapに入れるデータには特に問題があるわけでもないです。
となると、mapに入れるのに失敗したという事なんでしょうか。
>構成をReleaseにしたexeを起動すると
>VC++の方でビルドすると
ha?
問題が発生する最小のソースを出してくれ。
さすがにソースコード無しじゃ分からんよ。
今言えるのは君のコードに問題があるだろうということくらい
417 :
414:2005/09/24(土) 18:26:51
>>415 スマソ 説明がとにかく難しい
>>416 了解、ですがちょいと小用が発生しましたので片付けてまた来ます。
申し訳ない
418 :
デフォルトの名無しさん:2005/09/24(土) 18:30:10
>>415 exeを実行するとダメだが、IDE上から実行するとOKって言いたいんじゃないのか?
>>414 どちらかのみ配列が0クリアされるとか
違いがあったと思うけど、そこら辺が原因かな。
Debugの方がたまたま動いている感じで。
>>413 <boost/cstdint.hpp>
std::bitsetをキーにすりゃいいよふな
>>422 std::bitsetって比較演算子定義されてたっけ?
424 :
403:2005/09/24(土) 20:25:47
>>411 なんか誤解があるようなので。
質問したからには、せめて、普通にはありそうも無いこの現象が
何故起きたのか、種明かしは伝わるようにしてください。
そちらがまともなC言語書けるようになるかどうかは無関係ですし、
誰も関心が無いと思います。
(まともな設計やsetuid等の問題性の考察は言語とは別ですから)
425 :
414:2005/09/24(土) 20:38:13
http://gamdev.org/up/img/3414.zip デバッグとリリース入れたら7Mになって弾かれた
>>419 mapに入れ込むと順番をずらす為に
中身がとりあえず消えるとかですか?
>>421 ソレです
ファイルは色々ありますが
Test.cpp
ReadMapFile.cpp
CMapObjet.cpp
の3つが主です。
もし宜しければ、問題点を指摘して頂ければ幸いです。
流れは プログラムの流れ.txt に書いておきました。
>問題点を指摘して頂ければ幸いです。
あんたの頭。
プロジェクトを丸ごとアップロードする馬鹿がどこにいる。
427 :
414:2005/09/24(土) 20:44:27
おっと
Test.exeはReleaseモードで作られた奴です
実行すると 「問題が〜」 が出ます。
428 :
416:2005/09/24(土) 20:44:40
問題が発生する最小のソースと言ったんだけど……
~~~~~
429 :
414:2005/09/24(土) 20:47:30
>>426 すみません。
手を煩わせるのも申し訳ないと思ったもので。
>>429 余計手間だろうが
最小のソース抜き出せ、それができないなら止めろ
最低限のソースと、実際に問題の出る実行モジュール。それ以外に何が必要だと言うのだろうか。
432 :
414:2005/09/24(土) 20:58:06
またまた、申し訳ない
もうちょっと削ってみます。
pszStr[dwAccBytes] = '\0';
これじゃね?。
dwSize=dwAccBytesしか確保してないのに・・・
437 :
414:2005/09/24(土) 22:07:24
あ!!!
438 :
414:2005/09/24(土) 22:13:37
お恥ずかしい。
pszStr[dwAccBytes - 1]で解決しました。
読み込んだ文字列には問題が無かったもので
この辺はまったく考えてませんでした。
後、無知も災いしたようで。
しかし、3回も読み込めたのはいったい何だったのだろう?
どうも、お騒がせしました。アップしたファイルは消しておきます。
レス有難うございました。
pszStr[dwAccBytes - 1]に\0書いたら、最後の一文字消えないか?
440 :
デフォルトの名無しさん:2005/09/24(土) 22:17:12
>>438 小手先だけじゃなくて、ちゃんと考えた方がいいぞ。
俺ならそこは足さない。
あえて答えは書かない。
441 :
デフォルトの名無しさん:2005/09/24(土) 22:18:14
と思ったら書かれてた・・・(´・ω・`)ショボーン
ワロタ
しかも足すじゃなくて引くだし・・・
まぁよくあるミスだよな。
オレもメモリ確保を一桁ミスってるのに気づかず
4時間悩んだことがある
445 :
414:2005/09/24(土) 22:37:22
pszStr[dwAccBytes - 1] = '\0'
すると消えますね@@;
ファイルは
最後に \r\n 入れてたので回避してましたが。
入れない方がよさそうだ。
(psz(略)を消しても問題なく動作しました)
Cでの質問なのですが、
ユーザーが入力した数字を、それとは別に入力した回数だけ
累乗し、その結果を表示する、というプログラムをつくろうと思っています。
累乗のところをどうしたらいいか思いつかないのですが、
どうやればできるでしょうか。
どなたか回答お願いいたします。
>>446 int n;
int p;
int r = 1; // r = n のp乗
for(int i = 1; i <= p; i++) {
r *= n;
}
448 :
デフォルトの名無しさん:2005/09/24(土) 23:21:44
C言語の質問です。
あるパス名が与えられたときに、それがファイルなのかディレクトリなのかを
調べる方法を探しています。
「C言語なら、俺に聞け! <21>」に、次のような記述がありました。
http://nssearch.hp.infoseek.co.jp/clang/1022045622.html 367 名前:デフォルトの名無しさん 投稿日:02/05/24 10:46
ディレクトリとファイルの判別するにはどうしたらいいのですか?
関数とかあれば教えてください。
379 名前:デフォルトの名無しさん 投稿日:02/05/24 13:01
>>367 標準ライブラリにはない。OS依存。
WinならGetFileAttributes(filename)&FILE_ATTRIBUTE_DIRECTORY
Unixならstat(filename, &stat_buf), S_ISDIR(stat_buf.st_mode)
私は、Borland のフリーのコンパイラを Win98 で使用しているのですが、この場合にも、
上記で示されているGetFileAttributesしか方法はないでしょうか。
(windows.h を include するようなプログラムを書いたことがないので、できれば避けたいのです。)
OS: Win98
Compiler: Borland C++ 5.5.1 for Win32
>>448 読み取り専用でfopenしてみて失敗したらディレクトリで成功したらファイルというわけにはいかないのかな?
やったことないから上手くいくかわからない。
>>448 ほかにも方法があるかもしれないが、まともな方法はどれも
初めて include するファイルが表れることだろう。
あ、 fopen が失敗して、且つ errno が EISDIR だったら、ディレクトリかもしれない。
>>447 ありあがとうございます!やってみます。
>>448 何の目的で調べるかによるな
単純にファイルかディレクトリかどうか調べるなら後ろに"\\nul"つけてオープンする手も有るよ
開けたらディレクトリで開けなきゃファイル
GetFileAttributesはびくびくするほどのものではないからとりあえず使ってみようよ。
C言語の標準関数だけでやりたいんじゃないかな?
とりあえずfp=fopen("ディレクトリのパス", "r")はfp==NULLだった。
455 :
448:2005/09/24(土) 23:42:23
回答していただいた皆さんありがとうございます。(みんな優しい。(涙))
ディレクトリを fopen でわざと開いて失敗させて、 errorno を見たら、
#define EACCES 5 /* Permission denied */
でした。
よくわからないので、ここは勇気をもって、GetFileAttributes に挑戦してみようと思います。
(標準関数だけの世界じゃ生きていけないのかぁ。)
ありがとうございました。(うまく行ったら報告します。)
456 :
448:2005/09/24(土) 23:54:17
あっさりうまく行きました。ありがとうございました。
参考にしたページ。
ttp://nienie.com/~masapico/api_GetFileAttributes.html #include <stdio.h>
#include <windows.h>
int main(int argc, char **argv) {
DWORD ret;
if (argc < 2) exit(1);
ret = GetFileAttributes(argv[1]);
if (ret & FILE_ATTRIBUTE_DIRECTORY) {
printf("directory.\n");
} else {
printf("not directory.\n");
}
return 0;
}
>>455 ちょっとまった「標準関数の世界」って何を想定、意味しているつもりなの?
(標準入出力等ならともかく、file system等は C言語外の環境なので当然…)
センセー、Cの質問です!
今ファイル操作やってるのですが
テキストファイルの文字の消去の仕方が分かりません
fputc('\0',file);
とかやっても変なデータが上書きされるだけで orz
初心者チックな質問ですがよろしくお願いします
> テキストファイルの文字の消去の仕方が分かりません
もちっと具体的に詳しく伝えて
どうしたいんで?
変なデータって、どんなデータ?
その文字以降のものを全部前に詰めるようにする。
462 :
458:2005/09/25(日) 00:34:08
ぐぁ…説明不足で申し訳ありません
えーと…何と説明すれば良いやら
テキストモードで書かれたファイル中の文字を削除したいんですよ
テキストデータを一行削除したときに一行ずつ上にずらしているので最後の行が二重になって余ってしまうんです
start
test
test
end
というデータで2行目を削除すると
start
test
end
end
となってしまい、最後の行を消したいのですが方法が分かりません
463 :
458:2005/09/25(日) 00:35:23
と、ちなみに変なデータってのは
" ↑"みたいのが入ってしまって意図通りに消えないってことで
下手くそな説明で申し訳ない orz
処理系依存の問題だな
手っ取り早いのは元のファイルは消して、新しく出力しなおす
質問です。クラス内の仮想関数のvtableを書き換えて
クラス内の関数をフックしたいのですが行き詰っています。
フックのサンプルみたいなものがあってLPDIRECTDRAW7のCreateSurfaceをフックしていたのですが
LPDIRECTDRAW7 lpdd; // DirectDrawCreateで作成済みのLPDIRECTDRAW7
void *pCreateSurface;
pCreateSurface = *(void **)(*(DWORD *)lpdd + 24);
*(void **)(*(DWORD *)lpdd + 24) = extCreateSurface;
こんな感じでフックしてたんですが、この行に出てくる24はどうも
lpddのアドレスからのCreateSurfaceへのオフセット値っぽいのですが
こんな風に作成されたクラスの仮想関数へのオフセット値を求める手段ってあるんでしょうか?
なんかよくわかんないまとめ方になってすいません。
466 :
458:2005/09/25(日) 00:46:51
うぁー…上手く消す方法とかありませんか
その方向で考え直してみます
回答ありがとうございました
>>466 Unix/Linux なら、 truncate() とか ftruncate() 使えない?
Windows なら、 _chsize() かな。
>>465 そいつはクラスじゃなくてCOMだ。
まあWindows環境のC++ではたいてい同じ構造になるんだけどな。
オフセットの求め方はないと思う。
宣言された順に+4ずつ増えてくから、自分で数えるしかないんじゃね?
offsetofは?
470 :
458:2005/09/25(日) 02:28:20
>>467 おぉぉ!
_chsize()で解決しました!!
レス感謝です!
継承した場合、
メモリ配置的には、基本クラスが先頭で、
次に継承した順に配置されるんでしょうか?
class CBase
{
public:
float value_base;
};
class CDerived : public CBase
{
public:
float value;
};
なら、
CBase* p;
CBase a;
p = &a;
p->value_base = 0.1f;
は有りですか?
473 :
デフォルトの名無しさん:2005/09/25(日) 06:29:43
今年の3月24日に「お前は半年ロムってろ」って言われたものですが
今日でようやく半年になりました。
おひさしぶりです。涙がでそうです。
Σ(゚Д゚;≡;゚д゚)
今は20万行ROMるのが流行らしいよ
それコピペだろw
>>468 やっぱり求める方法は無いんですかね…
宣言順が分からない事にはどうしようもないですねと思ったら
SDKのddraw.hに宣言順が書いてありました(´∀`)
解決できそうです。ありがとうございました。
>>469 offsetof(lpdd,lpdd->CreateClipper)みたいにしても
構文エラーになってしまって何故エラーになってるのか
わかりませんでした。とりあえず
>>468さんの方法で
行ってみようと思います。ありがとうございました。
>>478 offsetofは非静的メンバ変数にしか使えない。
>>471 Inside The C++ Object Model でも読め。
481 :
デフォルトの名無しさん:2005/09/25(日) 15:49:36
Cで書かれたコードをC++に変更することになりました。
VC++6.0でデバッガを使いたいのですが、
Win32 Console Applicationのプログラムをステップ実行しながらデバッグできるのでしょうか。
コマンドプロンプトで、入力ファイル名・出力ファイル名を入力する仕様です。
それともprintfで値を出力しながらデバッグするしかないのでしょうか。
COMプログラミングについて詳しく記述してあるページは無いでしょうか?
google先生を始めとする検索エンジンに
「COMプログラミング」とか「COM プログラム」とかで探しても
何故かCOMだけいい感じに無視されてCOM関連のページを見つけることが出来ません。
484 :
481:2005/09/25(日) 16:02:05
いや、F5押して試してみたんですけど、
いきなり実行されて終了してしまうんです。
入力ファイル名などを入力することができずに。
(argc=3でないと終了する仕様。何故こうしたかは先人達の考えがあったと思うのですが。。。)
Visual Studioは初めて使うことになったので、設定等が分かりません。
>>484 実行時のコマンドライン引数を設定をしろ
F1押して"実行時のコマンドライン引数"で探すべし
何を設定すべきかは前任者に聞く事
486 :
481:2005/09/25(日) 16:17:47
>>485 ありがとうございます。
やってみます。
初めて使うなら、まず説明書を見ろよ・・・
>>481 F5じゃなくてメニューのデバッグの方から実行すれば
終了するには何かキーを押して下さいとか表示された気がする。
カーソル前まで実行、の機能を使うか
止めたい所にブレークポイント入れとけば?
【環境】VC++.net2003
開いたファイルの存在するディレクトリを得るためにまずコモンダイアログでOPENFILE型変数ofnを取得したのですが、
フルパスのファイル名ofn.lpstrFileは取得できているのにファイル名ofn.lpstrFileTitleがなぜか取得できないため
自作関数で行うことにしましたが、
エラー:error C2664: 'FolderName' : 1 番目の引数を 'OPENFILENAME' から 'char' に変換できません。
が出てしまっております。どうか助言をお願いします。
void FolderName(OPENFILENAME OpenFname)
{
int i = 0;
int k = 0;
while(OpenFname.lpstrFile[i])//フルパス最後の'\'は何文字目か取得する
{
if(OpenFname.lpstrFile[i] == '\\')
k = i;
i++;
}
i = 0;//iの初期化
while(i<k)//フルパスからファイル名を除いて全て書き込む
{
OpenFname.lpstrFileTitle[i] = OpenFname.lpstrFile[i];
i++;
}
}
>>490 lpstrFileTitleは領域確保してあるのか?
>>491 うお、そんな技があったんですねっていうかMSDNにCOMの記事あったんですねorz
本当にありがとうございます!
>>492 NULLのままなので領域確保はしていないみたいですね。
その領域確保はどうするのでしょうか。
関数をchar引数に変えてFolderName(char A, char B)もしくはFolderName(char A[], char B[])
と定義してFolderName(szFile, szFileName)と使用しても
「関数に2個の引数を指定できません」と言われるし…
2個引数入ってるのに何でこんなエラーが返ってくるのやら。
ちなみに
char szFileName[64];//オープンするファイル名(パス付き)
char szFile[MAX_PATH];//ファイル名
です。
すみません。
>>494はヘッダを直してませんでした。
>>492 申し訳ありません。
ヘッダにあった関数宣言を直したらいけました。
C言語のつもりでやっててこんな大ポカするとは情けない…
>>479 条件はもっと厳しくて、PODにしか使えないよ。
498 :
デフォルトの名無しさん:2005/09/26(月) 01:15:19
int a;
のときの
if(a==0){}
のようなことを
char a;
の時にするにはどうしたら良いのでしょうか
if(a==OK){}
if(a=="OK"){}
などとやってもだめみたいで
499 :
デフォルトの名無しさん:2005/09/26(月) 01:18:08
?charは1バイトだろ?
501 :
498:2005/09/26(月) 02:00:13
数字でなく文字のときを知りたいのです
ファイルの中から特定の単語の数えるような事がしたくて
だから a==文字 でいいだろ?
>>501 こういう事か?
if(isdigit(a)){}
ctype.hをインクルードしとけよ
if (strchr("OK",a)) {}
こういうことか?
"文字"と"文字の配列"は区別しとけ>501
そして"単語"という事から導き出されるものは"文字の配列"
C++なら"文字列"というものもあるんだがな >506
>>507 文字列というな。std::stringクラスと言え。
>>508 std::stringクラスというな。クラステンプレート std::basic_string と言え。
>507,>508
それはクラスであって、
生成したオブジェクトじゃねーんじゃねの?
511 :
510:2005/09/26(月) 02:36:37
間違えた >510 は >508,>509 あて
>>510 "文字列"ならオブジェクトだというわけでもなかろう。
>509
std::basic_string<char>と(ry
514 :
498:2005/09/26(月) 03:02:21
説明が下手ですいません
たとえば、0と1が百個並んでるファイルF.datがあったとして
その中に0が何個あるか数えたいときは
int a,n=0;
ifstream inf("F,dat");
for(int i=0; i<100; i++){
inf >> a;
if(a==0){n++;}
}
とすれば0の数が変数nに出てきますよね
では、ONとOFFの羅列だったら
ON OFF OFF ON ON ON OFF OFF ON ……
ONの数を数えるにはどうしたらいいのでしょう
int n=0;
char a[3];
ifstream inf("F,dat");
for(int i=0; i<100; i++){
inf >> a;
if(a==ON){n++;}
}
とすると
ONは定義されていない、初めて使われる関数です
とていわれてしまうわけです
説明が下手とかそういう以前の問題だと思う
>>514 そりゃ文字列リテラルになってないんだから当然だな、クオートしろ
ってかそれでちゃんと読み込めてるのか?
C++流のやり方分からんのならCのやり方でやりゃいいじゃん
>>514 cやc++は文字列同士の比較はサポートされていないので関数を使う必要がある
if( 0 == strcmp( a, "ON" ) )
とかね
あと配列について0から勉強し直した方がいいと思う。
配列ってchar以外で使うときどんないいことがあるの?
何このスレ・・・・・・・?
/ヽ /ヽ
/ ヽ / ヽ
______ /U ヽ___/ ヽ
| ____ / U :::::::::::U:\
| | // ___ \ ::::::::::::::|
| | | | | U :::::::::::::|
| | .|U | | ::::::U::::|
| | | ├―-┤ U.....:::::::::::::::::::/
| |____ ヽ .....:::::::::::::::::::::::<
└___/ ̄ ̄ :::::::::::::::::::::::::|
|\ | :::::::::::::::::::::::|
\ \ \___ ::::::
>>518 筆舌には尽くし難いぐらいいいことがあるよ
. (ピリオド)じゃなくて , (カンマ)の入ったファイル名かよ
523 :
498:2005/09/26(月) 08:39:13
>>517 ありがとうございます
大変たすかりました
514のプログラム見てたら朝から気分が悪くなってきた
int cnt = 0;
std::string buf;
std::ifstream inf("f.dat");
while(inf) {
inf >> buf;
if (buf == "ON") cnt++;
}
std::cout << cnt;
…ので作ってみた。
ifstreamの動作よく知らないので手間取ってしまった。
C++の標準規格が固まってからもう7年も経つのに、まだストリームの
基本的動作を理解してない奴がいるのか。
やはりC++は初心者にとっては鬼門なのかねえ。
脳みそがC++に慣れて無いだけだと思うよ
ソースコードを打ち込んでると、その内シナプスが効率よく働くようになるさ
ストリームというか、標準侑出力なんてほとんど使わないしー
みたいな
標準侑出力標準侑出力標準侑出力標準侑出力標準侑出力
標準侑出力標準侑出力標準侑出力標準侑出力標準侑出力
標準侑出力標準侑出力標準侑出力標準侑出力標準侑出力
m9(^д^)
ひとことで言うと、ソースがキモイ。汚い。見にくい。
>>530 俺はマスターではないが、一つだけ。
while (inf) がまずい。
やるんだったら、inf >> buf; の後に if (!inf) break; だな。
while(inf >> buf) でいいだろ。
ゆうの変換候補が「侑」ってのも不思議な
社名?
あるいは人名か・・・。
536 :
デフォルトの名無しさん:2005/09/27(火) 13:17:12
俺のオキニがその名前だったが先月dだ
質問です
char *pBuffer;
pBuffer = new char[SIZE];
とSIZE分メモリを確保したとして、
あとでこのサイズがいくつだったか
pBufferから調べることってできますか?
sizeof(pBuffer);
みたいな感じで・・
どなたかよろ m(__)m
>>537 その手の質問は散々既出だけど、無理。
どこかにサイズを退避させておきませう。
>>538 ご親切にありがとうございます。
退避させちゃいまっす
ども m(__)m
540 :
デフォルトの名無しさん:2005/09/27(火) 15:34:38
質問です
ListViewで
マウスポインタのある部分の
SubItemsのテキストを取得したいのですが
どんなコーディングになるのでしょうか??
541 :
デフォルトの名無しさん:2005/09/27(火) 15:37:50
丸投げマンセー
542 :
540:2005/09/27(火) 15:48:06
VBじゃねぇか
C#じゃねぇか
545 :
540:2005/09/27(火) 15:55:03
おっと、失礼しました。
他の板に投げます
C#も乗ってたのか、URLだけ見て煽ったから
どのみつスレ違いだが
>>540 言語が何だかわからんが、このスレということはC/C++なのか。
マウスの座標が分かっているのなら、SubItemHistTest()を使う。
リストボックスの項目をクリックしただけで何らかの動作を行わせる事はできますでしょうか。
つまりはリストボックスの項目をクリックすると、ダイアログプロシージャにメッセージを送れるか
どうかを知りたいのです。
select(msg){
case: ID ←このIDに相当するIDをリストボックスの項目をクリックするだけで得られるかどうか
…(中略)…
}
まぁダメならダイアログにボタンを余分に一個作ってやればいい話なんですけどね…。
質問です。XP、.NET です。
#include "stdio.h"
class CHoge {
int HOGEHOGE() { a=4; return 0; }
int a;
};
struct SHoge {
int a;
};
int main(void){
CHoge c1;
SHoge s1;
printf("%d,%d,%d", sizeof(c1), sizeof(s1));
return 0;
}
(メンバは全て public 指定をしています。)
構造体とクラスの違いを調べるため、上記のようなコードを書いてテストした結果、"4,4" と出力されました。
クラス CHoge はメンバ関数を持つため、関数実態へのアドレスを格納する必要があるので、
sizeof(CHoge) > sizeof(SHoge) となると思ったのですが、これはどういうカラクリなのでしょうか。
よろしくお願いします。
>>551 CHoge::HOGEHOGE()
は、
int CHoge__HOGEHOGE( CHoge* this )
としてコンパイルされる、と考えればわかるかな?
ちなみに virtual な関数を作ると、vtbl の分だけ大きくなるけど、
構造体にもメンバ関数はつけれるし、派生もできる。
結論としては、struct と class の違いはない。
553 :
551:2005/09/28(水) 17:54:45
>>552 あーそっか、おもいっきり納得です。
また、struct でも派生ができることも全く知りませんでした。
ありがとうございます!
554 :
デフォルトの名無しさん:2005/09/28(水) 18:04:12
とりあえず、#include "stdio.h"が気に入らないとかprintfに書式文字列3つ指定しているのに2つしか値を渡してない事に突っ込んでも良いでしょうか
int main(void)
にはつっこまんのか
556 :
551:2005/09/28(水) 18:46:40
即興で書いたからorz
はたしてCHoge::HOGEHOGE()には戻り値が必要なのかと突っ込んでも良いでしょうか
559 :
デフォルトの名無しさん:2005/09/28(水) 19:19:44
>>558 iostreamでもなくcstdioでもなくstdio.hダッサー
というのなら、main()でなくわざわざmain(void)ダッサー(C++なのに)
と言っても同じことではあるまいか
VisualC++.net2003でMFCを使わないでプログラムを作っています。(CFileやクラスの類は使用せず)
ダイアログ内のピクチャコントロールにファイルから読み込んだBMPやJPGを表示させたいのですが、
様々なサイトを回ってみて6時間以上試行錯誤を繰り返しても上手く表示されなくて困っています。
case ID_IMAGE: //画像を表示させるボタンのID
hImg = (HBITMAP)LoadImage(hInst1, (LPCTSTR)buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
//注;bufはファイル名がフルパスで示された文字列
でBMPのハンドルを取得して
SendMessage(GetDlgItem(hDlgWnd, ID_IMG), STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hImg);
//※ID_IMGはピクチャコントロールのID hDlgWndはダイアログのハンドル
でピクチャコントロールにメッセージを送れば表示されるはずなのですが…
ビューワのような動作をさせるため画像はリソースとして取り込んではおりません。
ボタンを押した一回目はhImgはNULLでは無かったのが2回目押すとNULLになっていた点から
ハンドルがうまく取得できていないのだと考えてます。
ディレクトリ内の画像ファイルをピクチャコントロールに表示させるにはどのように記述したら良いのか
563 :
デフォルトの名無しさん:2005/09/28(水) 20:19:24
>>562 細かい事忘れたが、LoadImageして出来たDDBをDIBに変換してオフラインイメージ作っとかないとダメなんじゃないか?
>>563 オフラインですか?
確かにDDBやDIBやデバイスコンテキストといったキーワードありましたね。
ちなみにLoadImage→SendMessageは猫プロ349章で見たものです。
>562
たぶん>563の言い方だと難しいと思うから、通訳させてもらうと、
ビットマップ>メモリデバイスコンテキスト>デバイスコンテキスト(描画)
じゃないとダメだと思う。理由は知らない。
566 :
デフォルトの名無しさん:2005/09/28(水) 20:39:42
eclipse+CDTの環境で、外部インクルードパスの追加の仕方を教えてください。
ここ3日ぐらい調べているのですが、わからないのです。
>564
猫なら26章。
ただし、ID〜とリソースID割り付けると(IDはint型)、LoadBitmapの第2引数はLPCTSTR型、はっちゃき言うとchar*型だから、
""でくくられてないとダメ。(表示されない)
だから、そちらがやってるように、26章のLoadBitmapをLoadImageでやってやると、ディレクトリ直接指定できるし、便利。
どうしてもLoadBitmapを使うなら、リソースファイルを用途:テキストで開いてやって、リソースIDを"BITMAPの名前"にしてやる必要がある。
なんか、猫にいちゃもんつけてしまったみたいだけど、猫は百貨店の様にバリエーション豊富で非常に助かるサイト。
>>567様も貴重な情報感謝致します。とりあえず徹夜で頑張ってきます…
>>563 DIBにするなら、LoadImageで直接CREATEDIBSECTIONすれば
コンパイルできず
↓
いまさっき、色々サイト見回してきて、ボーランドってサイトのDLして
set path=%path%;c:\borland\bcc55\bin
これしたらコンパイルできました。
でも なんかエラーとか警告とかヒドイ・・・これって単にプログラムが間違ってるってことでしょうか?
↓
read me嫁といわれて読んだのですが、意味がわからなくて・・・orz
どうすればいいでしょうか?
>>572 エラーメッセージが出てるなら、コンパイルができたとは言わない。
「なんかエラーとか警告とかヒドイ」言われても、こちらは
どんなエラーが出てるのかわからないので何とも言えない。
どんなソースをコンパイルしたのかもわからないし。
575 :
572:2005/09/29(木) 02:05:32
スマソ・・・できた。
でもプログラムが間違えてる。
100までは\120で
200までは\250で
300以上は\400。
例えば410だったら 100*120*100*250+110*400=
っていうの作りたいんだけど、
なんか自分の作ったやつ
410だったら 410*400= になっちゃっうんだ・・・どうしたものか・・・
訂正
>>例えば410だったら 100*120*100*250+210*400=
>>575 なにがいいたいのかさっぱりわからない。
>>575 ???
すまん、言ってる事の意味がわからない。
1)何をするためのプログラムで、
2)中でどういう処理をして、
3)結果として何を表示するのか、
もう少しわかりやすく説明してくれ。
579 :
572:2005/09/29(木) 02:31:13
スマソ・・・たんに計算するプログラムなんだ。
数字を記入
↓計算
>>575してくれて
結果、計算後の答え みたいな感じの。
>>579 昨日の面接の時の俺のようだ・・
ちくしょー俺は足りない人じゃねー
ちょとあがり症なだけなんだー
>>579 その計算の中身がわからないのだが・・・
計算式をもっと詳しく、他人が見てわかるように書いてくれ。
入力された数値の範囲によって計算式が変わるなら
そのパターンも全部書いてくれ。
>>581 プログラマには(他人との)コミュニケーション能力も必要だぞ
自分が作ったプログラムの仕様を説明できないと複数人での作業なんてできないしな。
>>575 俺等が何がわからないのか、俺が君から引き出してあげよう。
>100までは\120で 200までは\250で 300以上は\400。
>例えば410だったら 100*120*100*250+110*400=
>っていうの作りたいんだけど
ってあるけど、「100までは〜、200までは〜、300以上は〜、」って文章と
その後の、「例えば〜」って文章が、俺等の方では全く繋がらない。
正直、前半の説明の時点で
int kansu(int atai)
{
if(atai <= 100)return 120;
if(atai <= 200)return 250;
if(atai < 300)return はぁ?;
if(atai >= 300)return 400;
return ウンコ!;
}
で、いいじゃんとか思ったけど、
後半で「例えば410だったら 100*120*100*250+110*400=」なんて言ってるから、
俺等からしてみれば「はぁ?お前300以上は400だって言ってただろ!殺すぞ!しかもなんでそんな複雑なことになっちゃってんだよ!」
って感じ。
バカの相手してると疲れるだけだよ
>>100までは\120で
>>200までは\250で
>>300以上は\400。
>>例えば410だったら 100*120*100*250+110*400=
この式から解析するに300以上じゃなくて200より上ってことだろ?
x<=100 120
x<=200 250
x>200 400
>>586 いや、そういう微妙な問題じゃねーんじゃねーかな。
とか思ってる。
つか、この状況であんまり考えても時間の無駄だから、本人さっさとでてきて説明しろ。
>>586 しかも、
>100*120*100*250+110*400
この↑式も本当にこうなのか?って疑問もある。
100*120*100*250じゃなくて100*120+100*250じゃね?とか、
よしんば、そこがプラスだったにせよ。やっぱり、式を組み立てても、俺にはようわからん。
>>576の訂正内容もよくわからんな。
> 100までは\120で
> 200までは\250で
> 300以上は\400。
なのに、
> 例えば410だったら 100*120*100*250+210*400=
210はどこから出てきたのかと。
いや、他の部分の計算も意味不明なのだが。
ここは質問者の脳内を机上デバッグするスレですか?
100個目までは、1個120円
101個目から200個目までは1個250円
201個目からは1個400円
ってことだろ?
>>589 あー、そんな訂正レスがあったのか・・・よくみなかったぜw
やっぱそれって
100と100と210で410になるからそれっぽくね?
すると、
100*120 + 100*250 + 210*400
とかしたいんじゃね?
でも、\=円(?)とかあるからなぁ・・・
問題読み間違えてんじゃねーの?こいつ。
てか、色々考えられちまうから、まず、どんな問題を渡されてるのかはっきりしてほしいよね。
Cか環境依存なのか判断つかないのでここで質問させてください
フォルダにあるファイル一覧を取得するにはどうすればよいでしょうか?
windowsです
>>591 だからぁ・・・
普通、たくさん買うほど1個当たりの値段安くすんだろ?
それだと、こいつ問題読み間違えてるか、問題出した奴がガチで馬鹿かどっちかだろ?
それともビックリマンチョコ大人買い防止措置でも働いてんのか?
>>595 おお、被ったw
でも、多分
>>593はそれはわかってるのかもわからん。
ただ、C・C++でできるかどうかが聞きたいのかもしれん。
C/C++の標準にディレクトリを操作するものはない
>>594 いや、もしかしたら、100個までは1個に付き120円引きなのかもしれんw
200個までは1個に付き250円引きになるとかw
ディレクトリって概念がもともと環境依存だからな
だが一般的なOSは全てディレクトリ構造
Windows然り、MacOS然り、Linux/Unix然り
ここは初めてのお使いスレでつか?
>>602,604
ワラタw
初めてのお使いで、違う物買ってきちゃった餓鬼に向かって
>>602のセリフを逝ってる図を想像したw
>>594 いや、個とか円とかは勝手に
>>591が書いただけだから
出題者は値段とか言ってないだろw
>>603 ×一般的な
○現在のパソコンで一般的な
>>594 販売ではなく、モノを預かり(or受け取り)処理する類のサービスでは
一回あたりの量(orサイズ)が増えるほど高くなることがあるからそれジャマイカ。
#廃棄物処理とか
各種インクルードファイルを入手するにはどうすればいいのでしょうか?
一通り網羅してるようなサイトありますか?
あと.net 2003でforkを試してみたいのですが、何をインクルードすればいいでしょうか?
> 各種インクルードファイル
???
> fork
マルチスレッドなら専用スレがあったはずだお
>>610 すいません。
PerlのCPANみたいに、C,C++用のインクルードファイルを一通り網羅してるサイトはありませんか?
613 :
デフォルトの名無しさん:2005/09/29(木) 13:00:21
VC++6で
大ループはじめ
if(条件)(変数名=001;チェック1;)else 変数名=111;チェック2;
switch(変数名) case 001:チェック3;
case 111:チェック4;
defoult:チェック5;
大ループ閉じ
fprintf
というように分岐させてるんですが、変数に111が入ってもcase111の処理に行きません。
チェック3の場所のループ回数をfprintfで数えましたところ0ではなかったので変数はちゃんと111の値をとっています。
変数が111なのにcase111に行かないなんてあるのでしょうか?
>>611 CのインクルードファイルはPerlのCPANモジュールなんかとは違う
ファイルその物は網羅して意味があるような物じゃない
というか、インクルードファイルだけ持ってきても仕方ない
>>613 全然何言ってるか何書いてるか分からんけど
>チェック3の場所のループ回数をfprintfで数えましたところ0ではなかったので変数はちゃんと111の値をとっています。
チェック 3 を通ってるということは変数が 001 なんだから、case 111 を通らないのは当たり前じゃないのか?
各 case 内で break してるかどうか知らんが
618 :
デフォルトの名無しさん:2005/09/29(木) 14:42:03
キーボードから文字列の入力を受け付けるときに、文字数の制限
を設けたくないのですがよい方法はないでしょうか?
良い方法が思いつかなかったので、
-----------------------------------------------
char *buff;
char tmp[256]; <- ここを制限したくない
scanf("%s", tmp);
buff = (char *)malloc(strlen(tmp)+1);
strcpy(buff, tmp);
-----------------------------------------------
としたのですが、
char *buff = "Manday";
のようにポインタを上限を考えずに使える配列のように使い、
キーボードからの入力を受け付ける方法はないでしょうか?
メモリ領域を無限に使えるなら安全に実現できるかも。
まあ逆にいうと現実的には無理よと言う話だが。
どうでもいいツッコミをさせてもらうと月曜日はMondayだしscanfを使うのはともかく戻り値チェックくらいはしなさい。
>>618 制限をしたくないのであれば、fgetc()を使って改行文字が来るまで待つか、
fgets()を使って末尾が改行文字になるまで待つか、どちらかの対策が必要。
制限していいが安全に入力させたいなら、fgets()を使うか、scanf()で文字数制限をすればいい。
621 :
デフォルトの名無しさん:2005/09/29(木) 15:11:26
>>619 >>620 返答ありがとうございました。
やはり、scanfを使って入力を受け付けるためには文字数の制限が必要なんですね^^;
>>621 つーか、scanf()で制限しないと黙ってメモリを壊すから。
その場合はgets()と同罪になってしまう。
そもそも目的が分からないから最適解を提示できない。
624 :
デフォルトの名無しさん:2005/09/29(木) 16:16:23
Aと言うクラスと、Aをメンバに持つBと言うクラスがあった場合、
Bから見て、Aを宣言してるヘッダファイルはどこでインクルードするのが普通?
Bのヘッダファイル内なのか、Bのコード本体のファイルなのか・・・
>>624 Bを宣言しているヘッダ。
ただしAへのポインタや参照だけならヘッダでは前方参照だけを書けば済むので、その場合はcppファイルでインクルードする
626 :
デフォルトの名無しさん:2005/09/29(木) 16:43:54
VC++6.0です。
#include <stdio.h>
#include <stdlib.h>
#define MAX 128;
int main(void);
int main(void)
{
char buf[MAX]; ←ここで
int n;
error C2143: 構文エラー : ']' が ';' の前に必要です。
error C2143: 構文エラー : ';' が ']' の前に必要です。
とかでるんだけどなんでですかねー?
>>626 マクロ展開されると
char buf[128;];
どこがおかしいか分かるよな?
628 :
624:2005/09/29(木) 16:47:24
630 :
デフォルトの名無しさん:2005/09/29(木) 16:50:40
a
631 :
デフォルトの名無しさん:2005/09/29(木) 17:30:14
winアプリなのですが、エディットの背景色ってどうかえればいいんですか。
>>631 初心者には無理です。そうでないなら自分で探してください。
#つーか、説明すんの面倒なんだよ。
char *str = "がちんこ";
この文字列から'が'の文字を削除し
'ん'と'こ'の間に'ぽ'を加えたいのですが、文字列の書き加えと削除の方法が分かりません。
教えてください。おながいします。
アセンブラ使えばできるんじゃない?やったこと無いけど
正直もうちょっと他に適当な文字列は無かったのかと問い詰めたい
キャスト
640 :
634:2005/09/29(木) 19:01:35
>>637 できるできないの問題じゃない
やってはいけない
>>641 それはこのスレの範囲から外れているからそうとは言い切れない。
>>643 少なくともアセンブラはこのスレの範囲外だと俺は思う。
C言語とかってインラインアセンブラとかそんなのがあるんじゃなかったっけ?
俺は名前すらうろ覚えだけど。
dos.hやらunion regsやら昔やったことあったなあ
Lattice-C?
>>642 出来る出来ないは環境依存だが、
文字列リテラルの書き換えを行うべきではない、
と言うのはC/C++として正しいだろ。
凄く馬鹿な質問ですいません。
a=10;
b=34;
if (a=b){
printf("a==b \n");
}
と言うプログラムでifが実行されるのは分かるのですが、
a=bの結果がbが34により34になるというのが分かりません。
なぜaが10により10にはならないのですか?
代入演算子が右結合だから、aに10が代入されてbに34が代入されて
a=bを評価するときaも34になってしまうからですか?
>>650 だから、人に聞く前に本を一冊くらい読めと・・・
こんなの初心者以前の問題。
Constとかしなくてもリテラルなのか
勉強になるな
>>650 aにbを代入すればaがbと同じ値になるのは当然
代入演算子の評価値は代入された値が返ってくる
aとbが等しいか確認したいならa==bとする事
>>654 str の型と文字列リテラルの定義に相関関係自体ないが?
# str の指している先がたまたま文字列リテラルであって、
# 文字列リテラル自体の型は、指される元とは関係ないよ。
K&R C P47より引用
(前略)
一方、文字列定数すなわち文字列リテラルは
"I am a string"
あるいは
"" /* 空の文字列 */
のように、2重引用符で囲まれた0個以上の文字の列である。
(後略)
>>650 if (a = b) {ってのんはこう書くのと同じ。
a = b;
if (a) {
で、if (a)はif (a != 0)と同じ。
文字列リテラル書き換えの話でアセンブラとか持ち出してる馬鹿はどこのどいつですか?
リテラルを書き換えるのがまずいのは、
1) 規格上は「未定義」。つまり文字列リテラルの中身を書き換えることにより
HDDがISO委員会からのラブレターで埋め尽くされても文句は言えない。
上記で終わりにしてもいいんだが、実装依存の話をすると、
2) 文字列リテラルはメモリ上の書き込み不可能な領域に配置されることがある。
当然その場合は書き込もうとすると、メモリ保護のあるシステムでは
セグメント違反のようなエラーが発生する。
この辺は完全に処理系やコンパイラのオプション設定による。
例えばgccはデフォルトで文字列リテラルをTEXTに配置し
msvcではDATAに配置する。両者とも、オプションでその挙動を変更できる。
# つまり、msvcではデフォルトでは文字列リテラルを書き換えられる。
# が、良い子はやってはいけない。
3) K&R時代の古いCプログラムでは、確信犯的にリテラルの中身をいじっている
プログラムがたまにあった。そういうプログラムを扱えるようにするために、
実際には文字列リテラルを書き込み可能にするようなオプションを提供している
Cコンパイラが多い、と思われる。
660 :
デフォルトの名無しさん:2005/09/30(金) 18:11:53
初歩以前の質問で申し訳ないのですが、C++を始めるのにVisualc++ toolkitとcoreSDKが必要と書いてあります。
しかしplatformSDKのDLサイトに飛んでも「coreSDK」をDLする所が見つかりません・・・
検索等してみましたがどこのHPにも同じ事しか書いてありません。
一体どこにcoreSDKはあるのでしょうか・・・?
「C++を始めるのにVisualC++ toolkitとcoreSDKが必要な」ことなどありませんのでお引取りください
>>660 >C++を始めるのにVisualc++ toolkitとcoreSDKが必要と書いてあります。
C++のプログラムを作りたいなら、コンパイラだけあれば十分です。
Windowsアプリを作るなら、SDKが必要です。
>一体どこにcoreSDKはあるのでしょうか・・・?
Platform SDKの中に入ってます。
663 :
デフォルトの名無しさん:2005/09/30(金) 18:59:20
>>662 ありがとうございました、早速DLしてみます。
型変換演算子のオーバーロードについて質問です。
class Object
{
public:
Object(int i=0):val(i){}// コンストラクタ
operator int() { return val;}// int型へのキャスト
private:
int val;
};
void func1(int a);
void func2(Object &o);
int i;
Object obj;
まずこんなクラス、関数、変数があるとします。
それで関数を呼ぶとき、
func1( static_cast<int>(obj) );
こちらは問題無くキャストされfunc1を呼ぶ事が出来るので、func2も
func2( static_cast<Object>(i) );
このように呼びたいと思っているのですが、このままではコンパイルエラーになってしまいます。
operator Object(int i){Object o(i); return o;}
こんな感じにObject型への型変換演算子をオーバーロード出来たらいいのかなと思ったんですが、
やり方がわからないです。何かいい方法はありますでしょうか?
>664
とりあえずbcc5.5.1とVC++.NET2003では下のコードがコンパイル通るし動作するようだけど
そちらの環境を晒してくれんか
#include <cstdio>
using namespace std;
class Object
{
public:
Object(int i=0):val(i){}
operator int() { return val;}
private:
int val;
};
void func1(int a){
printf("func1 : %d\n", a);
}
void func2(Object& o){
printf("func2 : %d\n", static_cast<int>(o));
}
int main(){
Object obj(100);
int i=200;
func1( static_cast<int>(obj) );
func2( static_cast<Object>(i) );
return 0;
}
つObject& operator (const int i){val = i; return *this;}
667 :
666:2005/09/30(金) 20:09:45
つObject& operator ()(const int i){val = i; return *this;}
>>664 - void func2(Object &o);
+ void func2(const Object &o);
「一時オブジェクトは非const参照型に束縛できない」だっけ?
669 :
デフォルトの名無しさん:2005/09/30(金) 21:30:15
managed C++(Visual Studio .NET 2003)の質問でもいいですか?
2次元配列には、x[i, j]とx[i][j]のタイプがありますが、後者の宣言の方法が分かりません。
前者は
double x __gc[,];
でうまくいくのですが、後者を
double x __gc[] __gc[];
としてもコンパイルエラーになってしまいます。
文法が誤っていますか?それともmanage C++では後者の配列は定義できませんか?
670 :
664:2005/09/30(金) 22:13:00
>>665 今試してみたらこちらでも無事動いてしましました(汗
さっきまでのは何だったのか…、なにか勘違いしていたようです、本当にすいませんorz
環境は、VisualC++ 6.0
Win32 Console Application です。
わざわざ試して下さって有難う御座いました。
static_cast<Object>(i)でエラーにならないのは
一時オブジェクトのコンストラクタにiの値が渡されるんですかね、
この辺理解が足りませんでした。申し訳ないです。
>>668 それは知りませんでした、レスどうもです。
>2次元配列には、x[i, j]とx[i][j]のタイプがあります
違います。後者のは配列の配列です。
つまり x[i]を X とかに置き換えて X[j] と考えればよろしいかと。
2次元配列=配列の配列です
2次元配列は x[i, j] のタイプです
C++にx[i, j]なんて文法ないぞ
private:
float cellValue(int row, int col) { }
public:
__property float Cells[int row][int col] = { read=cellValue };
なんだその__property
>>674 managed C++ の文字が目に入らんのか
それから、標準でも x[i, j] は宣言以外のコンテキストでは有効だから、文法がないというのは言いすぎ。
682 :
デフォルトの名無しさん:2005/10/01(土) 19:50:15
>>681 横からすまんが、
何?そのmanaged C++って環境依存ならスレチガイじゃね?
>>682 スレタイを100回暗唱しておいでなさい
684 :
デフォルトの名無しさん:2005/10/01(土) 19:59:09
>>683 じゃあ、visual C++=MFCもOKなのかと・・・
暗黙的には駄目だろう。
俺はmanaged C++がその仲間だと思ったんだけど。
そもそもどういうもんか知らんのよ。
>100回暗唱
それから100回書けw
>>684 MFCはC++と言うより、Win32APIに近いんじゃね?
テンプレ見た限りOKな気がするけど。
見た目や名前が似ててもmanaged C++は別言語だからスレ違いだと思うけどな。
その辺はっきりさせないと初心者も混乱しそうだし。
C# も同じだろ、って言われてもなーってことだね
>>690 おいおい、さすがにどんな馬鹿でもまmanagedC++==C#なんて考える奴はいないだろ
JavaとC+が同じだと言ってるに等しいぞ
managed C++とC#を混同してる奴を約一名知ってる。
俺は>690はC/C++と比べて〜だと思ってたが、違ったみたいだね
CとC++は知ってるが、C+は初耳だ
C+とかC+-とかC--とかC@とかあるよ
C?
ポーカーのプログラムを作りたくて
以下のように役の名前を宣言するとクラスメンバーが初期化できないといわれます。
どういうことなんですか?
Win+BCC32です。
class Poker{
private:const char *pairName[] = {
"No Pairs",
"One Pair",
"Two Pairs",
"Three of a Kind",
"Straight",
"Flush",
"Full House",
"Four of a Kind",
"Straight Flush",
"Royal Flush",
};
:
:
>>697 そういうことはコンストラクタ初期化子でやらないといけない。
しかしコンストラクタ初期化子では配列は初期化できないという罠。
尤もそのpairNameは静的メンバで平気だと思う。
class Poker {
private:
static const char *pairName[];
};
//どこかのcppファイル
const char *Pokar::pairName[] = {
"No Pairs",
"One Pair",
"Two Pairs",
(残りは省略)
};
>>697 そもそも、単純に文字列(へのポインタ)の配列だけクラス内に用意しても仕方ないのでは?
常識的に考えれば役のEnum値か何かを引き数にして役の文字列を返す関数を実装して、
その関数内にその文字列テーブルを持てばいいと思うのだが。
>>699 なるほど。
Pokerクラスはもちろん他に関数とかありますよ
>>700 いやだから、Pokerというクラスの、全てのメンバがその文字列を必要とするわけでもないだろ?
「ポーカー」というゲームを考えても、その役名なんてぇのはI/Fにしか過ぎないわけだし。
C++のクラスのコンストラクタについて質問っす
class tekitou
{
private:
int n_tekitou;
public:
tekitou(int n)
{
n_tekitou = n;
}
};
みたいなクラスがあって
tekitou* pTekitou = new tekitou[100];
こんな風にメモリ確保したときにコンストラクタtekitou(int n)
を呼び出したいんですけどどうすればいいんでしょうか。
コンストラクタで値を一気に全部入れたいんですけどできないんですかね?
>>702 配列の new でコンストラクタに引数を指定することはできない。
コピーができるクラスなら
std::vector<tekitou> v(100,n);
704 :
デフォルトの名無しさん:2005/10/03(月) 00:44:32
質問です。
例外リストつきメンバ関数ポインタって・・・
int (MyClass::*pfunc)(std::string&) throw(std::exception) = MyClass::function1;
"throw(std::exception)"
↑この部分があっても無くてもコンパイル通るんですけど、あんまし重要じゃないんですか?
MyClass::function1 の宣言で、例外リストがあっても無くても、互換性の無い型の例外リストでも
コンパイル通るんですけど。
単にコンパイラが無視しているだけですか?
BCC使ってます。
例外、って要素追加でメモリ不足した時とかに発生するんじゃないのけ?
これ、規格的にはどうなるんかね?
§15.4.2より
If any declaration of a pointer to function, reference to function, or pointer to member function has an
exception-specification, all occurrences of that declaration shall have an exception-specification with the
same set of type-ids.
とあるから、本来は無いといけないはずなんだけど、gcc3.4.2(MinGW)でも同じ
結果に終わるし・・・・ただ、MyClass::function1は通りませんよ。
&Myclass::function1としないと。
>>704 15.4.12
"An exception-specification is not considered part of a function's type."
>>704>>707 JIS X3014:2003には代入・初期化する元の例外指定より代入・初期化する先の例外指定の制限が緩ければよいと書いてあるよ。
710 :
708:2005/10/03(月) 09:09:21
>>709 これか。ISO/IEC 14882:2003より
§15.4.3
A similar restriction applies to assignment to and initialization of pointers to functions, pointers
to member functions, and references to functions: the target entity shall allow at least the exceptions
allowed by the source value in the assignment or initialization. [Example:
class A { /* ... */ };
void (*pf1)(); // no exception specification
void (*pf2)() throw(A);
void f()
{
pf1 = pf2; // OK: pf1 is less restrictive
pf2 = pf1; // error: pf2 is more restrictive
.end example]
712 :
デフォルトの名無しさん:2005/10/03(月) 18:25:59
最初にランダムで一桁の数字を表示して、それより大きいか小さいか予想した後
またランダムで一桁の数字を出して、予想が当たりかはずれか、というゲームを
作りたいのですが、
#include<stdio.h>
#include<stdlib.h>// srand, rand 関数を使用するために必要
#include<time.h>// time 関数を使用するために必要
void main(void)
{
int i;// 現在の時刻値を使って、乱数ジェネレータを初期化
srand((unsigned)time(NULL));
for(i = 0; i < 1; i++);
printf("%d\n", rand() % 10);
int number;
scanf("%d", &number);
printf("%d\n", number);
printf("大きいのはどっち?\n");
}
int numberのところでエラーが出ます。どう直せばいいでしょうか。
環境Borland、BCCDeveloperです。おながいします。
>>712 拡張子が.cppではなくて.cなら、int number を int i; の前か後ろに持って行け。
714 :
デフォルトの名無しさん:2005/10/03(月) 18:36:02
おー、見苦しいものを見てくれてありがとうございます。
cppにしてみたら違うとこのエラーが出ました。
Error Release\ikusei.mak 27: Too many rules for target 'Release\ikusei.obj'
*** 1 errors during make ***
これはなんでしょうか…
715 :
デフォルトの名無しさん:2005/10/03(月) 18:39:56
よく考えたら、scanfしても私の作りたいものが作れなさそうです。
もうちょっと考えてみます。
| \
|3`) ダレモイナイ・・LoveLove! ChuっChuっスルナラ イマノウチ
|⊂
|
♪ Å
♪ / \ LoveLove! ChuっChuっ!
ヽ川´3`)ノ LaLaLa ChuっChuっ!
( へ) ぎゅっとしてね 早く〜
く
♪ Å
♪ / \ 地球中で 貴方が一番
ヽ川´3`) ノ 大好きなの!
(へ ) 愛しちゃってるの!
>
718 :
712:2005/10/03(月) 18:50:32
メイクファイルって何でつか…
.mak?
デバッグとリリースのとこに一つずつあるお(´ρ`)
PCの中身漏れません?
最高にド低脳な発言してください in ム板(VII)いってきまつ…
719 :
712:2005/10/03(月) 18:59:36
すみません。同じプロジェクトにcとcpp入れてたのですがcpp消したら直りました。
int i; 2回やったら怒られます(´・ω・`)
そりゃ同じ名前の変数二個作っちゃダメでしょ
721 :
712:2005/10/03(月) 19:09:17
初心者を露呈してしまいました…
もうちょっといじってみます。
ありがとうございました
scanfだけで数字を取得しようとするのはあんまりおすすめできないけど
最低限scanfの戻り値はチェックしてな
ここから怒涛のscanf叩きが始まります
↓はいどうぞ
PCの中身漏れるって・・・・・・何言ってるの?
>>714でメイクファイル関連のエラーが出ているから言っているんだが。
晒すのが嫌なら残念ながらここまでだな。
scanf_sを使えばいいんだよ
WinでC++なGUIなアプリを無償IDEで開発するには何を使うのが良いですか?
Eclipse+CDTでVEは不可能なんですよね?
DelphiとVisualAge4Jしか知らないので1から勉強になるのは覚悟しています。
>>727 VisualStudio 2005 Beta 2
Borland C++ Builder Personal
>>729 スマソ、Delphiと混同してたよ(´・ω・`)
>>727 よくわからん、Eclipse+VEで作れば良いじゃん
それ以前にJDKだけで作れるじゃん
732 :
syosinsya:2005/10/04(火) 03:02:23
ハフ変換作ってます。
2値画像で注目点からN*Nの範囲にあるクロテンについて上辺と下辺のtangentを取り
その間の角度を取ります。角度を全クロテンについて集計してもっとも投票の多い角度を注目点における線方向とみなします。
で、N*Nの中身のドットすべてをクロテンにしたら全部の角度に対して同じ投票量になるはずですがなりません。
if(Threshold[loopTemp1]==1){
for(loopTemp3=0;loopTemp3<NWidth;loopTemp3++){
for(loopTemp2=0;loopTemp2<NWidth;loopTemp2++){
loopTemp4=loopY + LHight*loopX+loopTemp3-NWidth/2+LHight*(loopTemp2-NWidth/2);
if(Threshold[loopTemp4]==1){;
c=NWidth/2;
s=(c%2);
if(s==1)d=(double)c+0.5;else;
Xlength=(double)loopTemp2-(double)d+0.5;
Ylength=(double)loopTemp3-(double)d+0.5;
733 :
syosinsya:2005/10/04(火) 03:03:41
//1
if(Xlength>0){
if(Ylength>=0){
if(Xlength>Ylength){
tangent1=(Ylength+0.5)/Xlength;
tangent2=(Ylength-0.5)/Xlength;
for(t=0;t<180;t++){
if(tan[t]>=tangent2){
if(tan[t]<=tangent1){
Vote[0]++;
}
}
}
}
}
}
734 :
syosinsya:2005/10/04(火) 03:04:49
//2
if(Xlength>0){
if(Ylength>0){
if(Xlength<=Ylength){
tangent1=(Xlength+0.5)/Ylength;
tangent2=(Xlength-0.5)/Ylength;
for(t=0;t<180;t++){
if(tan[t]>=tangent2){
if(tan[t]<=tangent1){
t2=90-t;
Vote[1]++;
}
}
}
}
}
}
735 :
syosinsya:2005/10/04(火) 03:11:26
こんな感じで第一象限でy=xの上と下第2象限でy=-xの上と下でそれぞれ軸に近い方から角度を測ってます。
これを第4象限までやります。
Vote[0],Vote[1]はチェックのために書き直していたものを投稿前に直すのを忘れていました。
それぞれVote[t],Vote[t2]と読み直してください。
文章がつたなくて申し訳ないですが、どなたかソースの誤りをご指摘いただけると幸いです。
それではよろしくお願いします。
前後のポインタを中に持つリストの構造体?で、
typedef struct {
LPDATA next; LPDATA last;
} DATA, *LPDATA;
の様に自己の名前で宣言する手段はありますでしょうか。
>>736 typedef struct tagDATA {
struct tagDATA *next, last;
} DATA, *LPDATA;
738 :
737:2005/10/04(火) 07:31:22
スマソ ミスorz
typedef struct tagDATA {
struct tagDATA *next, *last;
} DATA, *LPDATA;
試してみた所、lpData=lpData->next; でも明確にキャストしないと警告が出ました・・・
タブで区切られた数値表のテキストファイルを2次元配列に読み込むクラスかなにかありませんか?
なんで?
>>745 struct DATA;
の宣言でヘッダの依存関係作らずにポインタを扱う方法が使えない。
逆に聞くが、なんでタグ名だけ別にするの?何がいいことある?
「タグ名」だからtag付けてるだけの話じゃろ
ISO/IECやMSDNでそういう書式になってるっていうだけの慣例
749 :
727:2005/10/04(火) 12:50:54
>>728 >>729 >>731 レスありがとうございます。
VEのSWTコンポはCDT上で扱えるのですか?
まだJavaだけかと思ってました。
勉強してきます。
750 :
デフォルトの名無しさん:2005/10/04(火) 14:52:29
>>712です
ランダムで一桁(10未満)の数字を2回表示させたいのですが、なぜか7桁の
数字が2回出ます。直してください。おながいします
void suuji1(int suujia);
void main(void)
{
printf("%dです。\n%dでした。\n", suuji1 );
}
void suuji1(int suujia)
{
int i;
srand((unsigned)time(NULL));
for(i = 0; i < 1; i++ )
printf("%d\n", rand() % 10);
}
全突っ込みだな。
他の人に任せた。
752 :
デフォルトの名無しさん:2005/10/04(火) 15:00:19
漏れこれでも本気なんだおヽ(`Д´ )ノ ウワアアン!!
ここは初心者は歓迎だが、初心者以下はお引取りください。
755 :
デフォルトの名無しさん:2005/10/04(火) 15:10:30
また最初からでつか…
ヒントをもらえませんか?
ユーザ関数についてお勉強して来い
757 :
750:2005/10/04(火) 15:17:06
void main(void)
{
int i;
srand((unsigned)time(NULL));
printf("%dです。\n%dでした。\n",rand() %10, rand() %10);
}
こんぱくとにしてみた
できたみたい
>>750 コンパイル通るのか?
余計な考えは捨ててまずはmain関数からだ
void main(void){
printf("%dです。\n%dでした。\n", suuji1 );
}
1.main関数の戻り値の型
2.printf関数の引き数の数
3.return 0;
759 :
デフォルトの名無しさん:2005/10/04(火) 15:31:54
>>759 突込みどころ満載なので、一から勉強しなおしてください。
761 :
デフォルトの名無しさん:2005/10/04(火) 15:44:22
教えてください!
100迄下がったら一から全部突っ込んでやる。
763 :
750:2005/10/04(火) 16:23:25
>>758 コンパイル通ります。1番と3番が分かりません…
直してみました
void main(void)
{
int i;
int number;
srand((unsigned)time(NULL));
printf("%d\n\n",rand() %10);
printf("これより大きいか小さいか当ててください\n大きい b\n小さい s を押してください\n\n");
scanf("%d", &number);
printf("結果は%dでした。\n", rand() %10);
if(number)
printf("当たり!\n");
}
ifのところがよく分かりません。
宿題か何かなのだろうか・・・
>>763 悪いが何がしたいのかさーっぱりわからん
766 :
デフォルトの名無しさん:2005/10/04(火) 16:36:43
>>763 とりあえず、お前が書こうとしてるものをフローチャートなりに書き直してみろ
>>763 それを考える前に
750が何故ダメで
757が何故出来たのかを
ちゃんと理解しておいたほうがいいぞ。
>>763 環境によるし、別にエラーにはならんが、
一般に広く使われてる、UnixだとかWinだとかのOSでは、
mainの戻り値はvoidじゃなくてint
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
な、なんか狐につつまれたような |
気がする・・・。 .|
_____ _________/
V
∧_∧
/ ヽ
| ` ´|
<>○<>\= o/
// ヽ\⊂ ̄ , ヽ
/ ∧_∧ヽ  ̄ ヽ
/,( ;´∀`)ヽ ,ゝ |___, ヘ
| ヽ\`yノ )( | < |
ヽ ___ノ_と_ノ\_<_ノ
>>771 まず
「バイナリエディタとは何か?」
から、勉強し直した方がいいぞ。
>>771 printf系じゃなくてfwriteを使え。
つか、その前にテキストとバイナリの違いを理解しる!
>>771 バイナリエディタがあるなら、バイナリエディタ使えばいいだろ。
123abc
とだけ書いたtxtをバイナリエディタで開いてみればわかる
777 :
771:2005/10/04(火) 17:28:53
778 :
750:2005/10/04(火) 17:44:52
779 :
750:2005/10/04(火) 17:46:35
int main(void)
{
inti;
intnumber;
//inta, b;
srand((unsigned)time(NULL));
printf("%d\n\n",rand() %10);
printf("これより大きいか小さいか当ててください\n大きい 1\n小さい 2 を押してください\n\n");
scanf("%d", &number);
switch(number)
{
case 1:
printf("当たり\n");
break;
case 2:
printf("はずれ\n");
break;
default:
printf("入力が違います\n");
break;
}
printf("\n結果は%dでした。\n", rand() %10);
return 0;
}
780 :
750:2005/10/04(火) 17:48:07
誰かサンプルきぼん…
あとでします…
あとでします…
あとでします…
フローチャート書いてから作れば、
>for文いらなかた
こんなことはおきない。
先に書け。
頭の中でまとまっていない物が、プログラムに起こせる訳が無かろう。
>779
せめてコンパイルできるコードを書いて、それをコピペしろ。
(intとiをタブで区切ってるのかも知れんけど・・・・・・)
つか、C/C++の勉強どころか、まともな事は何もできない/やる気無い、
のが明白なので、以降スルーするがよし。
784 :
デフォルトの名無しさん:2005/10/04(火) 18:18:42
基底クラスのメンバ関数の引数に、派生クラスのポインタ型を取りたいんですが、予想通りコンパイルが通りません。
やっぱ無理ですか?
>>784 コンパイルは通るように出来るが基本的に設計ミス
>>785 おお、さんくすできました。
そんなのがあったのか
はい、設計ミスです。うう
バグの元だから辞めておけ
>>784 派生先の仮想関数で処理すべき事をやらせてるんじゃないの
wofstream::openの第一引数の型ってなんでconst char*なんですか?
wofstreamはUNICODE用なんだから引数の型はcanst wchar_t*がいいような気がするのですが…。
納得いきません。
ファイルの中身がUNICODEでもターゲットのOSでUNICODEのパスが使えるかは別問題。
テンプレート引数が(Plane Old Data)なのか、そうでないのかを判別する方法ってないでしょうか?
template <typename TYPE>
void Copy(TYPE *a, TYPE *b, int size)
{
if( IsPOD(TYPE) ) { // TYPE が POD ならメモリコピー
memcpy(a, b, sizeof(TYPE) * size);
} else { // POD でないならfor文で代入
for(int i=0;i<size;i++) a[i] = b[i];
}
}
みたいな事をやりたいのですが。 環境はVC++6.0です。
あとTYPEがPODでないとき、コンパイル時にエラーを発生させる事が可能でしたらそれも知りたいです。
plain old dataのことならboost::type_traitsでも使っとけ
次の改訂で標準入りも確定している
>>792 そう言うわけでしたか。
なるほど。考えが足りなかった見たいです。
ありがとうございました。
796 :
732:2005/10/04(火) 21:03:37
放置プレイ?
>>796 だってそんなのデバッカで勝手にやりゃいいじゃん。
それで駄目ならそのソース内だけのバグじゃない可能性の方が大きい。
そういう手間まで考えるとそんなの自分でやれやタコ。馬鹿。ウンコ。
お前みたいな馬鹿に付き合ってるほどみんな暇じゃねーんだよ。
>>796 よくわからんがdoubleを足してるみたいだけど計算誤差の処理はちゃんとやってる?
799 :
デフォルトの名無しさん:2005/10/04(火) 21:56:52
athlonXP 1800
windows 2000
C++ builder (borlandのタダのやつです)
なんですが。
以下のプログラムを走らせると、かならず入力前の文字列の値が
0 -16 -3 127 88
になります。
つまり、一回目の実行で11111って入力して49 49...
に変えても、二回目の実行では 0 -16...になるんです。
これって、どうしてなんですか?
#include <stdio.h>
void main() {
char sen[20];
int i;
for(i=0;i<5;i++) printf("%6d",sen[i]);
printf("\n");
scanf("%s",&sen);
printf("\n");
for(i=0;i<5;i++) printf("%6d",sen[i]);
}
>>799 mainを呼ぶ前にCRTが作業した痕跡
801 :
799:2005/10/04(火) 22:10:19
ありがとうございます。
一つだけ・・
CRTって Cランタイムライブラリ で合ってますか?
C RunTimeだと思う
C実行時図書館
804 :
799:2005/10/04(火) 22:15:10
それだったら図書館というより書庫のほうがしっくりくる。
806 :
803:2005/10/04(火) 22:16:31
807 :
デフォルトの名無しさん:2005/10/04(火) 23:11:27
ファイル処理についての質問です(MFC)。
100MB単位のサイズのログファイルを加工してDBに落とし込むプログラムを作成しています。
行単位での処理とはいえ、fgets()で律儀に1行1行読んで処理してたら、さすがに時間を食って
仕方がないので、バイナリ扱いで10MBとかのサイズを一気に読んで処理しようと考えています。
ただ、1行の長さは固定ではないため、10MB分を読んだ際、ぴったりの位置に行の終端(\n)
があるとは限らない、という状態になっています。
今現在は、カレント位置から10MBの位置にファイルポインタを移動した後、whileループ
中で1文字ずつ読んで改行を検索、発見したらそのポインタ位置まで含められるサイズの
メモリを確保して、fseek()前の位置からの内容を読み込む、といった処理の流れになっていますが、
ループで1文字ずつ読む、というのが、最善手なのかわからないでいます。
現在のソースはこのような感じです(MFC利用)
uiCurrent = ReadFile->GetPosition();
ReadFile->Seek(DEF_READ_LEN,CFile::current);
while(post != '\r' || post != '\0'){
ReadFile->Read((LPVOID)&post,1);
}
uiSeekptr = ReadFile->GetPosition();
uiLenSize = uiSeekptr - uiCurrent;
retAddr = new char[uiLenSize +1];
どなたか、もっと良い手段についておしえていただけませんでしょうか?
>>807 10M単位でデータを読んだ後、その中から改行を探して分割して、
結局は行単位で読むんでしょ?
それって、fgetsで先頭から1行ずつ読んでいくのと比べて本当に早いの?
速度に関しては関数、APIのオーバーヘッドだけと考えるべきだと思うぞ。
ディスクキャッシュ効くだろうし。
もしやるならifstreamだと現在位置をtellg、現在位置から10MBのところまでseekg、
そこからgetlineで行末まで読んでtellg、前の位置に戻ってread。
seekgの後とかストリームの状態を忘れずに確認すること。
まあこんなんで1行1行やるのとどのくらい変わるかは知ったこっちゃないがな。
無駄な努力に、一票
fgets()大推奨
気になるんならsetvbuf()でIOバッファのサイズ増やしてみ。
ほとんど効果は無いと思うけどね。
>>807 下手な考え休むに似たり。
fgets()版で速度を測った? そしてそれは、単純にファイルコピーするのに較べて充分遅かった?
恐らく小手先の工夫をする甲斐はないと思うよ。
812 :
750:2005/10/04(火) 23:59:03
できました!採点してくれませんか?するまでもないですか。やる気なしとか言うのかお
みんなありがとうございました
813 :
750:2005/10/05(水) 00:02:19
#include<stdio.h>
#include<stdlib.h>// srand, rand 関数を使用するために必要
#include<time.h>// time 関数を使用するために必要
int main(void)
{
int i;
int number;
int a, b;
while(i < 5)
{
srand((unsigned)time(NULL));
a=rand() %10;
b=rand() %10;
printf("\n%d\n\n",a);
printf("1〜9の数字を出します。\n上の数より大きいか小さいか予想してください\n大きい 1\n小さい 2 を押してください\n\n");
scanf("%d", &number);
printf("\n結果は%dでした。\n",b);
814 :
750:2005/10/05(水) 00:02:59
if(number == 1 && a<b)
{printf("あたり\n");}
else if(number == 1 && a>b)
{printf("はずれ\n");}
else if(number == 2 && a>b)
{printf("あたり\n");}
else if(number == 2 && a<b)
{printf("はずれ\n");}
else printf("入力が違います\n");
i++;}}
スレ汚しごめんでした
>>814 細かい突っ込みは省略して二点ほど。
・乱数系列の初期化はループ内で行なってはいけない。
・条件判定は、「あたり」を列挙してそれ以外を「はずれ」とするのが妥当。
817 :
807:2005/10/05(水) 00:20:48
818 :
750:2005/10/05(水) 00:23:03
int main(void)
{
int i;
int number;
int a, b;
srand((unsigned)time(NULL));
while(i < 5)
{
a=rand() %10;
b=rand() %10;
>>815 ありがとうございます。こんなんでいいですか
条件判定のはもうちょっと考えてみます。
>>816 5回繰り返してみた
>818
素直にforで回せよ
>>818 だから0から勉強し直せって言ってんだろ
i の初期値はどーしたよ
821 :
750:2005/10/05(水) 00:31:39
>>815 if(number == 1 && a<b || number == 2 && a>b)
{printf("あたり\n");}
else if(number == 1 && a>b)
{printf("はずれ\n");}
else if(number == 2 && a<b)
{printf("はずれ\n");}
else printf("入力が違います\n");
どうでしょう
a==bのときは[入力が違います]になるが良いのか?
823 :
750:2005/10/05(水) 00:43:43
>>820 0からやってるじゃないですか
>>822 それはまだ考えてない
1〜9なのに0出るのも直してない
>>823 >0からやってるじゃないですか
iに0入れてる部分はどこ?
825 :
750:2005/10/05(水) 00:50:16
>>819 forが素直とは知りませんでした。ありがとう
int main(void)
{
int i;
int number;
int a, b;
srand((unsigned)time(NULL));
for(i = 0; i < 5; i++)
{
a=rand() %10;
b=rand() %10;
略
else printf("入力が違います\n");
}
return 0;
}
>823
>0からやってるじゃないですか
いつやったんだよ。
>1〜9なのに
10で割った余りだから0〜9なのは当たり前
もうほんと出直してきてくれ頼むから
いいかげんウザイから、死ぬか黙るか消えるかどれか選択して
おまいらが甘やかすから・・・あからさまな教えてクンはスルー汁
>>826 今みんなをウザがらせながらも変なプログラム作って勉強中
作らないと身につかないと思ったんです
勉強したところでどうせ動かしてみたらつまる。
出直します…
>>827 黙ります。すんません
多分君の言う勉強と、他の人が言う勉強に差があるんだろうね。
まず、関数の使い方にアルゴリズムの組み方だな
人の書いたソースをたくさん読まないと駄目な時期だと思うな。
もちろんその間も自分で組む練習を怠っては駄目だけど。
いやいやいやいやいやいや
このレベルじゃ人様のソースなんて読めない読めない
>>833 いや、C言語入門やアルゴリズム入門とかの
コードをたくさん丸写しして実行結果をみるってのを繰り返す
ってこと。
836 :
732:2005/10/05(水) 07:14:18
797
798
どうもでした。
誤差のチェックやります。
837 :
807:2005/10/05(水) 09:42:27
CFile→CStdioFileに書き換えてReadString()するようにしてみました。
ほぼ同条件での計測で、807に書いたやり方では190秒、書き直した方では230秒…
前の方が早いようです。
CStdioFileだから遅いのでしょうか?
838 :
デフォルトの名無しさん:2005/10/05(水) 09:56:29
>>837 てゆうかー。
それって処理速度云々が本当に問題なの?
時間がかかるのはもうどうしようもないんでしょ?
200秒かかる処理を100秒に縮められたらそれでOKな問題なの?
>>837 まず、fgets()で一行毎に処理するプログラムを作れ。
そして、そのプログラムのプロファイルを取って、
全体の実行時間から、本当に遅いのか検討汁。
高速化は、プロファイルの結果からボトルネックとなっている箇所を割り出し、
その部分について、どうすれば高速化されるのか?を考えるのが普通だ。
もしかしたら、デバッグビルドのままって落ちでは?
>>837 通常は839の言うとおり、プロファイルしてボトルネックを見つけてから最適化しないと
意味がない。推測でやるのは往々にしてムダになる。
とりあえずためしにDBにinsertしているところをコメントアウトして実行してみては?
190秒が10秒ぐらいになったりして。だとするとファイルアクセスを改善しても意味ナシ
あえて改善するのであれば、File Mappingでメモリに貼り付けて扱うとか。
それでも有意な差がでるとは思いませんが。
>>837 つか、自分で客観的な計測や比較、加えて実装コードの評価ができないんじゃ
現時点で高速化はあきらめてきちんと作ることを優先したら?
>>841にまとめて
ある程度の見識がなければ…
(807の方法がベストとも速いとも思わないが(メモリ喰っていいならmmap?)、
ごく簡単になら最後の半端行は切り捨ててseekでその分だけ戻して先送り。
その程度のロスがいやならデータ構造や処理手順を考え直すし…)
つか、嫌な予感がするぜー。
俺が処理で意識するのは次の5つ。
1.処理時間が一瞬で、繰り返し処理を行ってもやはり一瞬で終わる
2.処理時間は一瞬だが、繰り返し処理を行うとちょっと時間がかかる
3.処理時間が結構長く、ユーザーに経過を伝える必要がある
しかし、メモリ内で処理を終えることができ、処理中のHDなどへの読み込み・書き込みは無い。
4.処理時間がかなり長く、ユーザーに経過を伝える必要がある
メモリ内で処理を終えることはできず、処理中もHDなどへの読み込み・書き込みを行わなければならない。
5.日がな一日中動かしている必要がある。
もう、処理中は最小化でもしてほっといてくれ。いつかは終わる。日付が変わることもあろうよ。
途中で電源が切れることもあろうよ。雨にも負けず風にも負けずそういうアプリに(ry
で、これがさ、高速化によって5が4になったり3が2になったりと
ランクが変わるぐらいじゃねーと俺は高速化ってやる意味ないと思うんだけどね。
200秒が100秒になってもねぇw
そういうのとは次元が違うと思うが
計算量のオーダーが変わらないと、高速化とはいえないずら。
次元と言うのは
>>807のレベルのことを言ってるんじゃないの?
最適化はコスト次第
まあ大体同意。
1/50秒と1/60秒は大きな違いだが、100秒と200秒じゃたいして変わらんよな。
(;゚Д゚)
まあ、200年が100年になっても、大した差はないよな。たかが100年( ´,_ゝ`)
852 :
デフォルトの名無しさん:2005/10/06(木) 11:03:09
>>851 そういうシチュエーションはないでしょ?
現実的に考えて存在しないようなパターンを偉そうにもってきて、何、悦にいってるんだかw
会社でもこういう奴いるよ。
考えなくていいようなレアパターンをもってきて「これじゃ駄目だよ」とかいって騒ぎ出す馬鹿。
ホント仕事できねぇなら、寝てろよ、邪魔だから。
煽りレスにマジレス返しちゃダメよ
854 :
デフォルトの名無しさん:2005/10/06(木) 12:22:14
1/50秒と1/60秒の違いと、100秒と200秒の違いの分からないやつは最適化を語る資格なし
たかだか2分足らずの時間差など
>>852 >現実的に考えて存在しないようなパターンを偉そうにもってきて
現実的に考えて2000年まで使用するとは思わなかった。
そんな事が数年前にあったよねぇ。
>>856 世界が1999年で終わると信じていたんだろw
858 :
デフォルトの名無しさん:2005/10/06(木) 13:06:47
>>856 はぁ?
常 識 的 に 考 え て
>>851 の 発 言 は ど う で す か ?
それがわからないほどあんたは馬鹿なんですか?
世界は2038年に終焉を迎えます
>>858 常識的に考えて
>>851は冗談だとわかりませんか?
まあそれはいいとして
>現実的に考えて存在しないようなパターンを偉そうにもってきて、何、悦にいってるんだかw
そういう姿勢はどうかと思うぞ。
危機意識足らねえんじゃないの?
ここはアイロニーも理解できない馬鹿がいる、愉快なスレですね。
アイロニート
200秒が100秒になったら全然違うだろ。
カップラーメンの待ち時間のあの空腹感の入り混じったもどかしさを思い出せ!
>>864 最近待ち時間無しタイプのカップ麺しか食わない
え、そんなのあるの…知らなかった(´・ω・`)
お湯を入れて捨てる
またお湯を入れる
待ち時間なしでウマー
って入れ替えてる間に3分たってるやん!!!
2倍量沸かしてるから無問題。
でも沸かす時間の方が長いこともある。冬場とか。
ガス湯沸し器もってない奴は負け組
給湯器か?
沸騰しないからまずいし、水道水以外使えないのもマイナスだな。
871 :
デフォルトの名無しさん:2005/10/06(木) 18:31:35
よろしくお願いします。
コンパイルは通ったのですが、ファイルがオープンできません。
考えられる原因はなんですか?
自分で怪しいなって思ったところをUPしておきます。
bool AllToAscFileConvert( LPCTSTR lpszFileName, int nStep);
bool asd = AllToAscFileConvert("20051004142940_01000.all",2);
bool AllToAscFileConvert( LPCTSTR lpszFileName, int nStep)
{
FILE *allFp;
・
・
・
//all用ファイルを読み込みでオープン
allFp = fopen(lpszFileName,"rb");
if( allFp == NULL )
{
return false;
}
・
・
・
873 :
デフォルトの名無しさん:2005/10/06(木) 18:40:38
フルパスにしてませんでした。
>>871 ファイルが見つからないだけだろ、試しにフルパスで書いてみ。
質問が御座います。お知恵をお貸し下さいませ。
環境依存だと思います、作成環境はLinux。実行はGumstixという小型Linuxマシンです。
クロスコンパイラで作成する環境となります。
質問は「プロセス間通信」についてです。
只今Aというプログラムを作り、GPSからデータを抽出しています。
今後Bというプログラムで、このAに「抽出したデータをファイルへ書き出せ」
という指示を与え、それを受けたAがファイルを作成するという動作をさせたいと思っています。
つきましては、Bを作成する上で参考となるサイト様などは御座いますでしょうか?
プログラムをまたいでの操作は初めてなもので、是非ともお力添えを頂ければと思います。
宜しくお願いします。
>>875 誘導した手前一応聞いておくけど、何故プロセスを分けるか、
例えばファイル経由ではいけない理由があるのか、
その辺りの背景が判らないと情報の提示もしにくいのだけれど。
877 :
875:2005/10/07(金) 09:25:14
>>876 お答えします。率直に言うと、「色々な監視・管理をするプログラム」が必要だからです。
このBというプログラムはAに対しての制御の他、また別のプログラムや機器、
それらの情報を一手に引き受けて処理をする事を前提としているのです。
ですから確かにファイル通信でBがAへの指示をアペンド記述で行毎に指示し、
Aが逐次そのファイルを確認・処理をしても良いのですが、
制御する情報などが今後増大した場合、ファイルなどでは手に余るのではないかと思います。
…とはいえ、実際の所「やり方を覚えてみたい」という願望も否定出来ないのですが。
879 :
875:2005/10/07(金) 11:45:58
>>878 ドンピシャです(汗) 今そこを読んでいました…
どうやら用途や方法、開発環境によって使うプロトコルは複数あるようですね。
暫く頭を捻らせてみる事にしたいと思います。
元々C言語なら…から誘導されて来たのですが、「プロセス間通信」という言葉を知らず、
遠回りな質問をしてしまっていた様です。お手間を取らせました、ありがとうございます。
頑張って習得したいと思います。
880 :
876:2005/10/07(金) 13:10:14
>>879 確かにその辺だねw
パイプを使うとデバッグが楽というメリットもあるけど、データの遣り取りもあるならメッセージキュー、
資源管理がシビアならセマフォか。そのページだと全部書いてあるから一通り試してもいいかもね。
881 :
デフォルトの名無しさん:2005/10/07(金) 13:26:07
VC6.0で作ったソースをデバッグしたんですけど、
いきなりメモリが不足していますのダイアログがでまして、
どうすればよいのか困ってます。再起動しても駄目でした。。。
タスクマネージャでみた
メモリ使用量
202268KB/550480KB
とりあえず載せておきます。。
よろしくお願いします。
882 :
デフォルトの名無しさん:2005/10/07(金) 13:56:37
↑解決しました
>>882 せめて原因が何で、どうやったら解決したかくらいは書いとけ
自作のライブラリを使用するためのヘッダで
const float PI = 3.14 ;
のように定数定義しています。
しかしこれはあればいいなというだけで必ず使うわけではないので、
使わない場合はコンパイル時に警告が出ます。
マクロにするというのもアレなので、ほかにスマートな回避方法はありませんか。
>>884 そもそもその値では誤差が大きすぎて使い物にならないわけだが。
つーか、float型なんて使うなや。
それと、それでどんな警告が出るんだ?
警告が出るというなら貼って味噌。
886 :
デフォルトの名無しさん:2005/10/07(金) 18:30:36
>>884 gnuなツールのautoconfパッケージのアイデアをパクってしまえ
ヘッダーでこんな感じに宣言しておいて
#indelu "config.h"
#ifdef USE_CONST_PI
const float IP=3.14;
#endfi
ユーザーソースとしてconfig.hをつくり
そこで使用する物の#define USE_xxxを作ってやる
未使用変数の警告を抑制
しかし定数は未使用で警告が出ないのが普通だと思うが。
890 :
884:2005/10/07(金) 18:48:32
値は例なのでどうでもいいんです。
警告が出るのは BCC で -w オプションをつけたときで、デフォルトでは出ません。
普段はオプション無しで、デバッグ時にのみ付けるようにします。
891 :
デフォルトの名無しさん:2005/10/07(金) 18:56:05
>>890 ヘッダでの変数宣言なら2重定義をはじくマクロくらい入れとけ
てか、普通入れる物だと思ってた俺ってアホ?
(・∀・)ニヤニヤ
シッ!
見ちゃいけません・・!
894 :
デフォルトの名無しさん:2005/10/07(金) 20:31:37
こんばんわ。質問させて下さい。
既存のCOMサーバーのATLオブジェクト(シンプルオブジェクト)があり、
これがコネクションポイント非サポートなんですが、
コネクションポイントのサポートをさせる事は可能でしょうか?
コネクションポイントのサポートをウィザードで指定した
ATLオブジェクトを作ってみて、IDL等真似して移植してみたのですが、
クライアントから DispEventAdvise した時に
0x80004002:インターフェイスがサポートされていません
エラーが出てしまいました。
素直にイベント配信用に新しいATLオブジェクトを作成した方がいいのでしょうか。。。
開発環境はVC6.0です。
よろしくお願いします。
下のプログラムの c[0] のところで
コンパイルエラーが発生してしまうのですが、
このような使い方はできないのでしょうか?
class CHoge {
public:
int& operator[]( int i ) { return x[i]; }
protected:
int x[1];
};
void main() {
CHoge a;
CHoge& b = a;
const CHoge& c = a;
a[0];
b[0];
c[0];
}
何故エラーメッセージを晒さないくせに質問するんだろうな。
>>895 constなオブジェクトはconstなメンバ関数しか呼び出せない。
const int& operator[](int i) const { return x[i]; }
を用意すれ
898 :
デフォルトの名無しさん:2005/10/07(金) 22:25:00
httpでアクセスして,ページのソースをmyDataBufferに格納しました↓
InternetReadFile(hFile,myDataBuffer,(DWORD)(size),&dwSize);
ただヤフーのページのため,EUC-JPでエンコード(ディコード?)しないと文字化けします
C++ではどのようにしてエンコードするのでしょうか?
調べてみたところ,使えそうなのが
HRESULT ConvertINetString( LPDWORD lpdwMode,
DWORD dwSrcEncoding,
DWORD dwDstEncoding,
LPCSTR lpSrcStr,
LPINT lpnSrcSize,
LPBYTE lpDstStr,
LPINT lpnDstSize
);
ここでEUC-JP → UNICODEやShift-JISとしてみたものの,文字化けします
どのようにするのがいいでしょうか?
C#の場合は,非常に簡単にできるみたいです↓
//C#の場合
Encoding.GetEncoding("EUC-JP").GetString(myDataBuffer);
>>897 通りました〜。
ありがとうございます。
>>884 そもそも自作のライブラリで piを提供する必要があるとは思わないが、
(普通に math.h M_PIとか使いたい)
その糞ライブラリはオブジェクト.o,.aを提供するんだろうから、
警告もマクロもdefineも嫌ならヘッダには extern const double PI;
ぐらいしか書きようがないのでは。
901 :
デフォルトの名無しさん:2005/10/08(土) 00:38:53
C++Builder 6 を使い始めたのですが、
閉じたくても「デバッグ中ですが終了してもよろしいですか?」
と出るので、はいにすると、「プロセスを終了できません。アクセス拒否
されました」と出て、終了できないのですが、どうしたら
いいんでしょうか?教えてください。。
902 :
デフォルトの名無しさん:2005/10/08(土) 00:39:36
C++Builder 6 を使い始めたのですが、
閉じたくても「デバッグ中ですが終了してもよろしいですか?」
と出るので、はいにすると、「プロセスを終了できません。アクセス拒否
されました」と出て、終了できないのですが、どうしたら
いいんでしょうか?教えてください。。
double型で確保した二次元配列にファイルからfreadでbitサイズの物を格納または
fwriteでunsigned charサイズのものをファイルに出力できないのでしょうか。
キャストしなくてはいけないはずなのですが、二次元配列のキャストも(int)のようなものを
変数の前につけるだけでいいのでしょうか。試してみたのですがうまく値を格納・出力できなかったもので。
どこにキャストの宣言をつけるのか解らないのでよろしくお願いします。
C言語、 VC 6.0、Win2000です。
double **arr2;
double *buff;
buff = (double *)malloc(sizeof(double) * (x * y));
arr2 = (double **)malloc(sizeof(double) * (y));
fread(&test1, sizeof(bit), 1, fp);
arr2[i][j] = test1;
fwrite(&arr2[i][j], sizeof(unsigned char), 1, fp);
>>902 まさしくデバッグ中のプログラムが動きっぱなしなんだろ。
>>903 エラーメッセージを貼れ。
キャストは誤魔化しのためにあるのではない。
arr2[i][j] = *((double *)&test1);
ってことがやりたいんじゃないの?
その文面だけじゃよくわからんけど
C++Builder 6 を使い始めたのですが、
閉じたくても「デバッグ中ですが終了してもよろしいですか?」
と出るので、はいにすると、「プロセスを終了できません。アクセス拒否
されました」と出て、終了できないのですが、どうしたら
いいんでしょうか?教えてください。。
>>906 パソコンの電源落として窓から投げ捨てろ
C++Builder 6 を使い始めたのですが、
閉じたくても「デバッグ中ですが終了してもよろしいですか?」
と出るので、はいにすると、「プロセスを終了できません。アクセス拒否
されました」と出て、終了できないのですが、どうしたら
いいんでしょうか?教えてください。。
909 :
デフォルトの名無しさん:2005/10/08(土) 09:18:37
サーバーとクライアントを作り、
クライアントから、IPアドレス・ポート番号を入力せずに、又はIPアドレスのみ入力せずに、
起動しているサーバーを自動検索するにはどうすればよろしいでしょうか?
知っている方いましたらお教えください。
宜しくお願いします。
環境はVC6.0です。
>>909 考えられる全IP、全ポートにpostして応答が返ってきたもの
相当限定された環境でないと不可能だな
912 :
デフォルトの名無しさん:2005/10/08(土) 09:57:05
>>910 その方法は一番最初に考えついてつくってみたんですが、
検索にかなりの時間がかかってしまって、実用的ではなかったです。
時間短縮さえできれば、その方法でもいいとおもっているんですが。
>>911 やはり不可能なんですね。
ポート番号から、サーバーを探すことはできますか?
逆接続にするのはどうだろう。
クライアントがサーバのIPを使って接続するのではなく、
クライアントのIPを使ってサーバが接続するの。
#実は某官庁系ネットワークがそういうつくりだったり。
>>912 無理だろ。
IPとポート番号が揃ってはじめてアクセスできる。
お前の家へは市町村だけ書いて番地を書かずとも郵便は届くのか。
UDPのブロードキャストを利用して、
専用のプロトコル作れば良いだけでは?
ピュア型P2Pのノード探索とかが近いかも名
>>912 もともとその発想自体が実用的でも適切でもないんじゃね?
サーバ側が約束のportで適時ブロードキャストで情報をアナウンスするか、
クライアントからのリクエスト(ブロードキャスト)に返信するようにするか…
無駄だなあ。
918 :
903:2005/10/08(土) 12:46:48
>>904 自分のやり方は
fwrite((unsigned chart*)&arr2[i][j], sizeof(unsigned char), 1, fp);
でやったのですが、エラーがでなくてファイルが空のままでした。
読み込み時も同じ感じでやった後に配列の中身をprintfで調べても空でした。
>>905 ありがとうございます。今すぐには試せないのですが。
最初から配列をint型で確保した時は出来たのですが、double型でなってしまったので確保しなくてはいけないので、
キャストは一時しのぎで使う時だけ型を変えればいいと言われたのでして。
>>918,903
論理的に意味の取れない断片だけ提示してもまったく無意味だぞ。
動かせる程度の最小例ぐらいにまとめないと。
bitサイズだとかtest1の型だとか、不明な点ばかりなので。
そもそも何をしたいのかまったく意味をとれないようなコードだし、
int型で本当にできたのかどうかも怪しいぐらいだ…
>>918 もともとdouble型をsizeof(bit)だけ読んだりsizeof(unsigned char)だけ
書いたりするって、何か勘違いしてやしないか?
エラーが出なくて空って、ちゃんと fwriteの返値でエラーチェックやってる?
まさか、double値の bitがちょうど zeroの部分を 1byte書き込んだのを
zero==空 と勘違いしてやしないよね?
>>918 IEEE754を知らないとか言わないよな?
922 :
918:2005/10/08(土) 14:04:08
test1は構造体でunsigned char型で宣言してました。
for(i=0; i<20; i++){
for(j=0; j<20; j++){
fread(&Ko.test1, sizeof(bit), 1, fp);
log[i][j] = Ko.test1;
}
}
のように二次元配列に入れるもしくは出すことがしたかったものでして。
質問の仕方が悪かったのと基本的なところを理解しきれていなかったみたいです。
申し訳ありませんでした。基礎的なところをもっと詳しく調べてやり直してみます。
すみませんでした。
>>922 ならなんで fread(&Ko.test1, sizeof(unsigned char), ... じゃないんだ?
初心者のトラブルなんだし返値のチェックぐらいきちんとしろよ。
つか、*何も*理解してないが故に質問さえまともにできないだけだな。終了。
SuperCon課題レベルの、高度なC言語の問題が沢山載った本を、どなたがご存じないでしょうか?
C++に関する基本的な質問です。
開発環境は WinXP Pro SP2 、VC++.NET です。
現在C++勉強のために多倍長整数のクラスを自作しております。
http://aploda.net/dl.php?mode=pass&file_id=0000004834 のような形で、クラスを書いてみました。 (operator+ はまだ実装してません。)
このクラスを使って
void CtestDlg::OnBnClickedOk() {
{
CInteger a(1);
CInteger b(2);
CInteger c;
c = a+b;
}
}
という関数を作ったところ、
c=a+b; から抜けたあたりで、 プログラムが落ちてしまいます。
エラーメッセージは
test.exe の 0x1020a702 (msvcr71d.dll) でハンドルされていない例外が発生しました :
0xC0000005: 場所 0xccccccc8 を読み込み中にアクセス違反が発生しました。 。
というものです。
よろしくお願いいたします。
くそプログラムのデバッグを他人にやらせようとはいい度胸をしているじゃないか。
とりあえず、確保もしてないメモリにmemcpyを呼ぶ奴は死ね。
>>925 operator +=はどうした。
あと、CIntegerのメンバ関数の中でもCInteger::を付けずにzeroとかの列挙へアクセスできる。
>>929 operator +()の戻り値が値渡しになるのは仕方がない。
operator +=()があればoperator +()はすぐに作れる常套手段がある。friendにする必要もない。
CInteger operator +(const CInteger& left, const CInteger& right)
{
return CInteger(left) += right;
}
nullpo inter
>>930 そうなんですか……orz
でも、見ててポインタと区別つかない……
>>931 おぉ、 確かにそうですね。
今から書いてみます。
みなさん、どうもです。
>>794 if( boost::is_pod<TYPE>::value )
でできるみたいですね。ありがとう御座いました。
一番シンプルな四捨五入のコードを教えてください。
int n;
n=(n+5)/10*10;
(int)(d + 0.5);
938 :
935:2005/10/09(日) 05:36:45
すみません。浮動小数点でお願いします。
そもそも四捨五入ったって、小数点以下何位を四捨五入したいの?
それを指定した上での四捨五入が欲しいのか?
第三位なら
(int)(d*1000 + 0.5)/(double)1000;
とか