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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1121644782/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2005/09/03(土) 19:36:41
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
3デフォルトの名無しさん:2005/09/03(土) 19:37:53
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後氏ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
4デフォルトの名無しさん:2005/09/03(土) 19:39:49
急速にスレの質が低下してまいりました
5デフォルトの名無しさん:2005/09/03(土) 20:31:49
最近まで高かったのかと個一時間
6デフォルトの名無しさん:2005/09/03(土) 20:35:37
STLつかうと一気に実行ファイルサイズが10倍に?!
7デフォルトの名無しさん:2005/09/03(土) 21:16:56
8デフォルトの名無しさん:2005/09/03(土) 22:05:08
xp bcc C言語でやっております
初心者質問ですいません

printf("%x",'ソ');とすると5c83と表示されますが
SHIFT-JISコードでは「ソ」は835cとなっております。
なぜ第一バイト目と第二バイト目が逆なのでしょうか
モカニズムを簡単に教えていただけないでしょうか
9デフォルトの名無しさん:2005/09/03(土) 22:08:32
>>8
っ[ エンディアン ]
x86はリトルエンディアン。PPCはビッグエンディアン。
10デフォルトの名無しさん:2005/09/03(土) 22:09:41
インテル系のCPUを使っているから。リトルインディアンなわけだな。
11デフォルトの名無しさん:2005/09/03(土) 22:15:55
インディアン嘘つかない
12デフォルトの名無しさん:2005/09/03(土) 22:27:38
文字は左詰(左から右に伸びる)、数字は右詰(右から左へ伸びる)

13デフォルトの名無しさん:2005/09/03(土) 22:34:31
くだらんな
14デフォルトの名無しさん:2005/09/03(土) 22:46:22
ありがとうございます。
まだ完全に生理できませんがなんとか理解できたと思います
文字コードと照らし合わせるような場合は
右のバイトから読みこんで、
数値として受け取るような場合には左のバイトから読んでいくって事ですよね。
くだらんですいませんでしたーー



15デフォルトの名無しさん:2005/09/04(日) 01:41:01
>>13
くだらん部分をちゃんと学ばないから
君の書くソースはヘボいんだよ。
16舞い戻りし14:2005/09/04(日) 02:15:10
戻ってきてしまいました。先ほどはありがとうございました。
もう一つ基本的なことのような気はするのですが、よろしくおねがいします。

char str[100]="ごめんなさいa";という文字型配列を用意して

printf("%x\n",str[11]);

この上の文を実行するとffffffa2と表示されます。
「い」のコードは82a2ということなのでa2だけならわかるのですが
ffffffというのはなんなんでしょうか。

またprintf("%x\n",str[12]);ではちゃんと「a」のコード62が表示されるので
どういった違いなのかわかりません。

すみませんが、宜しくお願いいたします。
17デフォルトの名無しさん:2005/09/04(日) 02:22:38
>>16
なんで日本語が英語の倍の幅で表示されるか考えたこと有るか?
18デフォルトの名無しさん:2005/09/04(日) 02:50:28
>>16
>17はきっと寝ぼけているから無視するとして。
charの値をprintf()に渡そうとすると暗黙の型変換でintに変換される。
0xa2はcharでは-94という負の値なのでintでも同様、負の値と-94になるというわけ。
それを16進で表記するのだから当然、ffffffa2になる。
19デフォルトの名無しさん:2005/09/04(日) 06:23:42
>>15
おまえ馬鹿だろ
20デフォルトの名無しさん:2005/09/04(日) 09:01:07
>>18
charが符号付きの場合、な。
21デフォルトの名無しさん:2005/09/04(日) 09:05:06
>>20
大抵の環境の場合はcharはsignedなはず。
22デフォルトの名無しさん:2005/09/04(日) 11:59:05
>>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で確保した分しか存在してない
と、みて良いんでしょうか?
25デフォルトの名無しさん:2005/09/04(日) 15:36:15
>24
Yes, いわゆるシャロウコピー。

26デフォルトの名無しさん:2005/09/04(日) 15:47:50
>>23
> pData = new int( 10 );
> for( int i = 0; i < 10; i++ )
> pData[i] = i;

new int(10) はintを1個分確保して10で初期化するんだぞ。
2724:2005/09/04(日) 15:53:10
レスどもです。
シャロウコピーというのですか
調べてみるとディープコピーってのもあるのですね。

メモリまわりでこんがらがったもので
有難うございました。
2824:2005/09/04(日) 15:54:38
>>26
あ!
29デフォルトの名無しさん:2005/09/04(日) 16:43:49
前スレでも質問した者ですが
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));
上記のメモリ確保をつけて二次元配列にするところでポインタのポインタを、
理解しきれてないので詰まっています。
アドバイスをお願いします。
30デフォルトの名無しさん:2005/09/04(日) 16:55:00
>>29のコードに二次元配列がないように見えるのって俺だけ?
31デフォルトの名無しさん:2005/09/04(日) 17:01:40
C言語始めたいんですが
何処で入手するんですか?
32デフォルトの名無しさん:2005/09/04(日) 17:03:48
>>31
仕様書を?
33デフォルトの名無しさん:2005/09/04(日) 17:12:29
>32
C言語を
34デフォルトの名無しさん:2005/09/04(日) 17:12:48
>>31
コンパイル・システムならOS にもよるが、Unix 系なら普通ははじめからパッケージに含まれてるし
Windows なら、ビジネスソフト売ってるような店なら、扱っていることが多い。
3529:2005/09/04(日) 17:14:13
説明不足ですいません。
上記のものは動的にしないでファイルの中を一文字ずつ取ってきて一次元配列に入れたのものでして、
これを改造してint **array; 以下のメモリ確保をつけて二次元配列に出来ないものかと思いまして。
36デフォルトの名無しさん:2005/09/04(日) 17:16:12
>>35
いっぺんにやろうとするな、まず二次元化したものを作れ。
37デフォルトの名無しさん:2005/09/04(日) 17:43:42
>>31 >>33
あなたが聞いているのは
「英語の勉強を始めようと思います。英語は何処で入手するんですか?」
これと同じくらいトンチンカンなこと。だから突っ込まれる。

勉強を始めるのに必要なのは「Cのコンパイラまたは開発環境」と「入門書」。
前者は”フリー コンパイラ”でぐぐればいくらでも見つかる。
後者は推薦図書スレに定番一覧へのリンクがある。
38デフォルトの名無しさん:2005/09/04(日) 18:15:31
>37
御指摘ありがとごさます
HSP・Rubyぐらいしかやってない奴ですので・・・
39デフォルトの名無しさん:2005/09/04(日) 18:21:17
>37
免罪符になるとは思っておりませんが
HSP・Ruby等しかやっておらず、C言語というプログラムがあると思っておりました(笑われるかもしれませんが)
どうやら違うらしいですね
元々PCに入ってる何かとか?
スミマセンC言語ド初心者で
40デフォルトの名無しさん:2005/09/04(日) 18:25:24
>>39
言語(文法と意味)と言語処理系(言語を解釈するプログラムのセット)を分けて考えるべし。
HSPやRubyは言語処理系が(事実上)ひとつしかないのに対して、
C言語はそうではない。
41デフォルトの名無しさん:2005/09/04(日) 18:33:39
Borland C++ Compiler
http://www.borland.co.jp/cppbuilder/freecompiler/
VisualC++ Toolkit 2003 (Windowsアプリの開発には別途PlatformSDKが必要)
http://msdn.microsoft.com/visualc/vctoolkit2003/
MinGW (gcc)
http://www.mingw.org/
Cygwin (gcc + unix互換シェル)
http://www.cygwin.com/
DigitalMars C++
http://www.digitalmars.com/
42デフォルトの名無しさん:2005/09/04(日) 18:34:55
>40
>41
レス大変ありがとうございます
43デフォルトの名無しさん:2005/09/04(日) 19:37:39
質問させてください、
今作ってるアプリに十数個のヘッダがあるのですが、
インクルードのネストが複雑になってしまったせいか、

hoge.hでclass hogeを宣言しており、
main.cppでhoge *g_pHogeが、
44デフォルトの名無しさん:2005/09/04(日) 19:41:28
(゚∀゚)アヒャ!
45デフォルトの名無しさん:2005/09/04(日) 19:46:06
>>43
おーい、大丈夫か?
4643: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
47デフォルトの名無しさん:2005/09/04(日) 19:53:49
>>46
とりあえずデバガ使って、new した時点から g_pHoge のアドレスをチェックしてみそ
48デフォルトの名無しさん:2005/09/04(日) 19:58:37
 |ヽ‐-へ
 i _゚ワ゚」
 ゙´ノノ))))
 l ノ゚ヮ゚ノlナメンナゴラァ
 ノ⊂)卯!つ
´((く/_||リ
   しソ
4946: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
50デフォルトの名無しさん:2005/09/04(日) 20:35:55
>>49
static かあ、見逃したぜ。
静的大域変数は内部リンケージを持つから、hoge.hをインクルードしてる翻訳単位全てで別々に実体が生成されてるのが原因。
てか、ヘッダで静的大域変数の定義はやめとけ。
とりあえず、Hogeの静的メンバにでもしとけや。
51デフォルトの名無しさん:2005/09/04(日) 20:44:28
>>49
NULL 使うのはヤメレ
0 にしとけ
5249: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
了解です。
53デフォルトの名無しさん:2005/09/04(日) 23:48:41
こんにちは。
本日、C#で作成したDLLをC++できちんと動作するように、指示があったのですが、C++は初めてでよくわかりません。
C#ができるからと考えていた私が甘かった・・・。
やりたいことは、C#で作成したクラスライブラリをC++で実行したい。
ということです。

呼び出し側の情報
クラス名:Execute
メソッド名:ConeectDb
引数:string conStr ->第一引数
  :string conPw ->第二引数
戻り値:正常:0 異常:-1

以上をC++側で実行したいだけなのですが・・・。
C++側はボタンを押下するフォームのみ作成はできたのですが、
LoadLibraryなどの使い方をみても良く判らなくて・・・
すみませんが、助けてください ><
54デフォルトの名無しさん:2005/09/04(日) 23:58:05
         ∧ ∧
        (・∀ ・) <ねえ>>53って糞スレ立ててたでしょ?
         ノ(  )ヽ
         <  >




         ∧ ∧
       ヽ(・∀ ・)ノ <削除以来だしなよー!
       (( ノ(  )ヽ ))
         <  >
55デフォルトの名無しさん:2005/09/05(月) 14:58:23
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行ごとに改行するのではなく、上書きしていくようにしたいのですが
どうやってよいかわかりません。お願いします。
56デフォルトの名無しさん:2005/09/05(月) 15:05:59
printf("%cABCDEFG %d\n",12,a);

とするとできるよ
57デフォルトの名無しさん:2005/09/05(月) 15:18:21
printf("\fABCDEFG %d\n",a);
58デフォルトの名無しさん:2005/09/05(月) 15:24:01
>56
>57
 改行が1行増えるだけでした。↓
ABCDEFG 0

ABCDEFG 1
   :
   :
59デフォルトの名無しさん:2005/09/05(月) 15:49:08
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をインクルードしたファイルで普通に扱えるんですが
ヘッダーをインクルードするってことはヘッダーの中身をコピーするようなものなんでしょうか?
61デフォルトの名無しさん:2005/09/05(月) 16:09:32
>>60
#include した所にテキスト展開するだけ。
62デフォルトの名無しさん:2005/09/05(月) 16:24:00
>61
即レスありがとうございます
63デフォルトの名無しさん:2005/09/05(月) 16:46:57
#include <stdio.h>

int main()
{
int a;

for(a=0;a<5;a++)
{
printf("\rABCDEFG %d",a);
fflush(stdout);
sleep(1);
}

return 0;
}
64デフォルトの名無しさん:2005/09/05(月) 16:51:35
>>59
全然問題ない。
65デフォルトの名無しさん:2005/09/05(月) 16:54:48
>>53
VC++にはマネージ拡張といってC#なんかと同じくCLR上で動くコードを吐くモードがある。
そいつを使えばC#でそのDLLを使うときと同じ手順で、そのDLLをC++でも使える。

>>58
56-57の\nを\rに変えてみると。
66デフォルトの名無しさん:2005/09/05(月) 17:28:37
managed C++ やろうぜ!!
http://pc8.2ch.net/test/read.cgi/tech/1014486422/
67デフォルトの名無しさん:2005/09/05(月) 17:57:31
ちょっと質問させてくれ。
昔ほんの少しだけC/C++を齧った事があるんだけど一から学びなおすのに適した参考書とかないありませんか?
68デフォルトの名無しさん:2005/09/05(月) 18:00:38
はいはいスレ違いスレ違い
図書、書籍、本等で検索汁
69デフォルトの名無しさん:2005/09/05(月) 23:29:23
>>59
間違っちゃいないが、外側も[0]しないでpush_back()すればいいのに。
70デフォルトの名無しさん:2005/09/05(月) 23:39:28
>>64
遅くなりました。これで大丈夫でしたか。
vectorで動的に多次元配列を作成できるという記述は検索で引っかかるのですが
実際に多次元配列を作成、操作してるソースが見つからなかったので不安でした。
ありがとうございました。

>>69
あ、言われてみれば確かにそうした方がいいですね。
御指摘ありがとうございます。
71デフォルトの名無しさん:2005/09/07(水) 02:13:21
vc++6.0を使ってます。
vectorクラステンプレートについての質問です。

仮にStudentと言うクラスがあったとします。
ここでvectorを用いて

vector <Student *> students;

と宣言するのと

vector <Student> *students;

と宣言するのではどのような違いがあるのでしょうか?
よろしくおねがいします。
72デフォルトの名無しさん:2005/09/07(水) 04:08:20
入れる物がポインタなのか、入れ物がポインタなのか、の違い。
まぁ後者はあまり使わないんじゃないかな。
73デフォルトの名無しさん:2005/09/07(水) 07:44:39
つーか、基礎からやり直せ。
74デフォルトの名無しさん:2005/09/07(水) 09:20:03
たしかに。レベル的にSTLに手を出す段階ではない。
75デフォルトの名無しさん:2005/09/07(水) 13:33:49
違いがないと思える奴がいるとは・・・
76デフォルトの名無しさん:2005/09/07(水) 15:33:01
標準Cで、プログラムの終了時のフックをかける
関数(コールバックの登録)があったような気がするんですが、
何でした?
77デフォルトの名無しさん:2005/09/07(水) 15:39:58
>>76
atexit()
7876:2005/09/07(水) 15:44:02
>>77
thanks!
79名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:23:32
クラスは構造体のように
CPlusClass arrays[4] = {
...(略)
};
と初期化できないのでしょうか?
80名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:27:32
>>79
コンストラクタがなく、全てのメンバがpublicならそうできる。
81名無しさん@そうだ選挙に行こう:2005/09/10(土) 21:29:38
>>79 できるだろ。やってみて言ってるのか?
82名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:31:03
>>79
C++じゃクラスも構造体も同じ物だよ
8379:2005/09/10(土) 22:34:00
コンストラクタ有りました...(;´д`)
不便
84デフォルトの名無しさん:2005/09/10(土) 22:43:01
>>79
class A
{
public:
A(int);

};

A array[4] = {
A(1),
A(2),
A(3),
A(4)
};
85名無しさん@そうだ選挙に行こう:2005/09/11(日) 05:30:35
>82
まったく同じじゃないよ
86名無しさん@そうだ選挙に行こう:2005/09/11(日) 12:04:32
>>82
C++では大きさゼロの構造体を作っても、最低1バイトのsizeof()になるんじゃ
なかったっけ?
87名無しさん@そうだ選挙に行こう:2005/09/11(日) 13:28:42
>>86
いや82に対してそのレスは変ではないかと。
82は別に「Cの構造体とC++の構造体」を比べてるわけじゃないから。
88名無しさん@そうだ選挙に行こう:2005/09/11(日) 13:50:34
C++でAVIファイルを再生したい場合どうしたらいいのですか?
ヘルプにも詳しく書いてなくて詰まっています。
89名無しさん@そうだ選挙に行こう:2005/09/11(日) 13:53:57
90名無しさん@そうだ選挙に行こう:2005/09/11(日) 13:56:29
>>88
C++単体じゃ無理。環境依存の動画関連ライブラリが必要
というわけで環境を晒せ。
91名無しさん@そうだ選挙に行こう:2005/09/11(日) 14:15:46
>>90
すみません。
CPU:Celeron 1.3G
メモリ:256MB
OS:WindowsXP Visual C++.NET
です。
92名無しさん@そうだ選挙に行こう:2005/09/11(日) 15:18:09
93名無しさん@そうだ選挙に行こう:2005/09/11(日) 15:21:04
DirectX(DirectShow)とか、MediaPlayer SDKとか。
94名無しさん@そうだ選挙に行こう:2005/09/11(日) 15:30:15
>>92
フレームごとに処理をしたいのですが、MCIでできますでしょうか?
95名無しさん@そうだ選挙に行こう:2005/09/11(日) 15:33:24
そんな話は聞いていないので、答えられません。
96名無しさん@そうだ選挙に行こう:2005/09/11(日) 15:48:33
>>94
人を不快にさせるのが上手だな
97デフォルトの名無しさん:2005/09/13(火) 16:59:29
クラスのデフォルト引数はどこに書けばよいのでしょうか?ヘッダの中の定義の部分ですかそれとも実態の方でしょうか?
あるいは両方書かなければならないのでしょうか?
98デフォルトの名無しさん:2005/09/13(火) 17:10:15
試せば?
99デフォルトの名無しさん:2005/09/13(火) 19:03:42
>クラスのデフォルト引数
???
100デフォルトの名無しさん:2005/09/13(火) 19:40:55
クラスに引数なんてねぇよ・・・
101デフォルトの名無しさん:2005/09/13(火) 19:45:01
テンプレート引数かね。
102デフォルトの名無しさん:2005/09/13(火) 19:57:15
メソッドだろ。たぶん。
103デフォルトの名無しさん:2005/09/13(火) 20:57:19
単に関数だろ。
104デフォルトの名無しさん:2005/09/13(火) 21:56:35
main(){

int a[100]={1,2,3,…,99}; の配列を次のように関数へ渡しました。

for(int i=1;i<99;i++)func(a[i]);

}
void func(int i){ ・・・単純な四則演算の処理・・・ }



関数に『配列そのもの』を渡すのは出来ないと本に書いてあったのですが、
上記のプログラムは正しいですか?
定義された関数には値かポインタしか渡せず、配列そのものは渡せないらしいですが。
コンパイルは通りましたし、実行結果も論理的に正しかったです。
コンパイラはフリーのbccです。

※includeなどのは省略しています。上のは要点のみのプログラムです。※
105デフォルトの名無しさん:2005/09/13(火) 22:00:42
>>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);
}
とすると、そのバグ はなくなります。

やはり配列そのものを関数に渡すのは駄目なのでしょうか?
106デフォルトの名無しさん:2005/09/13(火) 22:03:20
理解不能
107デフォルトの名無しさん:2005/09/13(火) 22:10:28
>>104-105
すみません。
要約すると、配列を関数に渡していいんですか、ということです。。

108デフォルトの名無しさん:2005/09/13(火) 22:12:26
「配列そのもの」とは一体何なのか言ってみろ
109デフォルトの名無しさん:2005/09/13(火) 22:17:00
>>104
それは配列そのものではなく、個々の要素を引数として渡しているだけじゃないか。
110デフォルトの名無しさん:2005/09/13(火) 22:17:30
別のところで聞きます。どうも^^
111デフォルトの名無しさん:2005/09/13(火) 22:26:24
>>109
言われてみればそうですね・・・。
『そのもの』というのは本に書いてあったので、俺も意味がわかってないです。
多分、func(a[i])のようにするのではなく、func(a,i)のように、
分けて渡すという形に書くべきだという事を言いたいんだと思っているんですが。
あとは別のところで聞きますね^^
112デフォルトの名無しさん:2005/09/13(火) 22:33:51
>>111
どこで聞いても結局は同じ答えになる。
113デフォルトの名無しさん:2005/09/13(火) 22:43:08
>>111
要は普通の変数みたいに値渡しできないってことだろ
配列を関数に与えるときは、配列先頭へのポインタを渡す

ってかfunc(a, i)なんてしてるの見たこと無い
114デフォルトの名無しさん:2005/09/13(火) 22:52:00
int func(char a[]){
return sizeof(a);
}
main(){
char a[100];
printf("%d\n",sizeof(a));
printf("%d\n",func(a));
}
こういうことかなあ
前後の文を読んでみないとよく分からんね
115デフォルトの名無しさん:2005/09/14(水) 02:46:40
>として処理した場合、後々のルーチンにバグが出てきます。

>とすると、そのバグ はなくなります。


興味あるな。どんなプログラムなんだろ?
> void func(int i){ ・・・単純な四則演算の処理・・・ }
なんだよな?
116デフォルトの名無しさん:2005/09/14(水) 20:59:53
文字を整数に変換する関数_ttoiは、有ったのですが
文字を実数に変換する関数_ttofは、無いのですか?
無いのであれば、どうやって変換するのでしょうか?
117デフォルトの名無しさん:2005/09/14(水) 21:05:19
>文字を整数に変換する関数_ttoiは、有ったのですが
標準ライブラリならatoi()だろ‥‥_ttoiはVC++の独自関数じゃないのか?
文字から実数はatoiをふまえて予想汁。
118116:2005/09/14(水) 21:10:21
言葉足らずですいません
VC++でUNICODEな環境のとき上記を解決できませんか
119デフォルトの名無しさん:2005/09/14(水) 21:15:37
>>116>>118
atofでググれ。
120デフォルトの名無しさん:2005/09/14(水) 21:27:44
>>116
_tstof()
121116:2005/09/14(水) 21:28:34
>>119
ありがとうございました。
ヒントに従ってこんな感じで組んでみたら
とりあえずコンパイルエラーは、出ませんでした

str = CString(buff);
ret = float(_tcstod(str,(_TCHAR **)NULL));

取り急ぎご報告まで
122デフォルトの名無しさん:2005/09/14(水) 21:33:16
正直頭に_の付いた関数をユーザが使うのはどうかと
123119:2005/09/14(水) 21:36:15
>>121
俺の目論見だとここを見つけて120の言う_tstofを見つけるはずだったんだが。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_atof.2c_.atoi.2c_._atoi64.2c_.atol.asp

ちなみにそのコードではCStringに変換する意味がない。_tcstodに直接buffを渡せる。
124デフォルトの名無しさん:2005/09/14(水) 21:55:46
>>122
頭の_は単にANSI/ISO標準ではないという意味に過ぎん。
_が嫌なら規格厳密合致の狭い世界で生きてろ、と。
125116:2005/09/14(水) 22:07:46
>>120,123
回答ありがとうございます。
大変参考になりました。

しかし、またもや言葉足らずですいません。
開発環境としてVisual Studio 6.0を使用していたのですが、
どうやらVisual Studio 6.0では、_tstofを使えないようです。

ちょろちょろと情報を小出しにしてすいませんでした。
気楽に質問できそうな雰囲気だったので、つい勢いで投稿してしまいました。
126デフォルトの名無しさん:2005/09/14(水) 22:12:46
>>125
_wtofは?
127デフォルトの名無しさん:2005/09/14(水) 22:13:14
悪いけどatofしかねぇよ
128デフォルトの名無しさん:2005/09/14(水) 22:23:58
sscanfなどで済む話じゃないの?
129デフォルトの名無しさん:2005/09/14(水) 22:59:10
>>128
そういやそうだな

#include <stdio.h>
#include <wchar.h>

int wscanf(const wchar_t * restrict format, ...);
130デフォルトの名無しさん:2005/09/14(水) 23:09:04
>124
いや俺はVCだけでプログラム組むわけじゃないので
131デフォルトの名無しさん:2005/09/14(水) 23:12:43
VC++で書くときはTCHAR使うのが一般的な流儀なんだからしゃーないだろ
132デフォルトの名無しさん:2005/09/14(水) 23:31:30
いざとなれば自分で書けばいいだろ。
133デフォルトの名無しさん:2005/09/15(木) 12:45:55
>>131
そんな流儀が一般的な流儀なんて初耳だな。
134デフォルトの名無しさん:2005/09/15(木) 12:59:19
VC++使ってるのにTCHAR使ったことなくてごめんなさい。
135デフォルトの名無しさん:2005/09/15(木) 13:08:03
tchar.h使うとなぜかDirectXがうまく動かない
136デフォルトの名無しさん:2005/09/15(木) 13:29:07
137デフォルトの名無しさん:2005/09/15(木) 13:34:12
>>136
「C言語なら俺に聞け! Part 113」というタイトルのスレです。
138デフォルトの名無しさん:2005/09/15(木) 13:35:39
あちらのほうで解決できました。スレ汚し申し訳ありません
139デフォルトの名無しさん:2005/09/15(木) 15:20:47
マルチ、スレ汚しどころのひどさじゃない、
解決した、ってそれじゃまともなプログラミングできなさそうだが…
次の違いぐらいちゃんとわかるようになるよね?
/*1*/ char ch = 'A'; char *ch_p = &ch;
/*2*/ char str[] = "A"; char *str_p = str; /* or &str, &str[0] */
140デフォルトの名無しさん:2005/09/15(木) 16:40:49
>>133
文字列を扱うほとんどのAPIにおいて、文字列がLPTSTRかLPCTSTR
ようするにTCHARのポインタとして宣言されてるのを知らんのか。

I18N&Windows9x系対応を可能な限り簡便化するための方策だよ。
141デフォルトの名無しさん:2005/09/15(木) 17:20:30
なんだかどこかで話がずれてるような気がしないでもない
142デフォルトの名無しさん:2005/09/15(木) 21:26:13
まぁ、知らんうちにTCHARは使っとるわな
143凶笑面:2005/09/16(金) 02:15:11
今日の夜9時からフジTVで民俗学ミステリ凶笑面だ。
みんな、見ようぜ。 原作は新潮文庫から出てるよ。
俺はドラゴン桜を見るからビデオに撮るけどな。
144787:2005/09/16(金) 04:48:51
MFCダイアログベースでアプリケーション作成しているのですが、スタートメニューのプログラムを起動するにはどうしたら良いですか?
例えば、[スタート]−[プログラム]−[XXXシステム]−[XXX]の場合ですが、ショートカットを起動するというイメージでしょうか?

CreateProcess() を使うのでしょうか?


教えて下さい。

開発環境:VC++6.0
動作OS:できればWin95〜WinXPまで
145デフォルトの名無しさん:2005/09/16(金) 06:02:10
1Uって何ですか?
146デフォルトの名無しさん:2005/09/16(金) 07:10:10
>>144
そう

>>145
1unsigned
147デフォルトの名無しさん:2005/09/16(金) 08:44:15
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-
148デフォルトの名無しさん:2005/09/16(金) 09:02:33
>>147
俺は普通にやってるけどな。
後で0クリアするよりはスマートで見やすいと思うが。
149デフォルトの名無しさん:2005/09/16(金) 10:03:06
>>147
火病患者は精神科で引き取ってもらえ。
150デフォルトの名無しさん:2005/09/16(金) 12:26:52
>>148
私はこの書き方は、はじめてみたけど、
てっきりすべての要素をsizeof(DXSTRUCTURE)で埋めてくれるのかと思ったわ。
151144:2005/09/16(金) 12:40:23
スタートメニューのディレクトリは
"F:\Documents and Settings\USER\スタート メニュー\プログラム\XXXXXXXX"
のようになっていてユーザ名が含まれているため固定で指定することはできません。

今ログインしているスタートメニューのディレクトリを取得する方法があるのでしょうか?
教えて下さい。
152デフォルトの名無しさん:2005/09/16(金) 12:50:21
>>151
ある
153デフォルトの名無しさん:2005/09/16(金) 12:54:29
SHGetSpecialFolderPath
154デフォルトの名無しさん:2005/09/16(金) 13:06:35
>>150
struct {
int a;
int b;
int c;
} foo = {1};
とすれば、1, 0, 0が入るのだけど知らなかった?

>>148
STARTUPINFOでぐぐると、STARTUPINFO sui = {sizeof(sui),};って例は結構見つかるね。
まぁ、DirectXスレで暴れているのは放置で。
155デフォルトの名無しさん:2005/09/16(金) 13:25:04
C/C++でゲーム作ろうと思ったんですけど
使用者が多いVCの方が比較的いいのかな?

通常パッケージで2万か(´・ω・`)
156デフォルトの名無しさん:2005/09/16(金) 13:36:14
>>154
正直dwSizeが一番上にあることが前提のソースだから悪趣味といえば悪趣味だな。
マニュアルに定義されてるからいいものの構造体の定義の順番を利用した
プログラムってのはあまりいいとは思えないな。
例えば
struct{int a,b,c;}HOGE;

struct{int a,c,b;}HOGE
で結果が変わってしまうってのがどうにも・・・。
157デフォルトの名無しさん:2005/09/16(金) 13:36:59
間違いw

struct{int b,c,a;}HOGE;

とでもしておいてくれw
158デフォルトの名無しさん:2005/09/16(金) 13:51:21
>>154
よくわからないんだけど、これをやると0クリアされるの?
159デフォルトの名無しさん:2005/09/16(金) 13:53:48
>>158
ショッパナの要素だけにその値が入って、残りの値が0クリアされる。
160デフォルトの名無しさん:2005/09/16(金) 13:55:52
>>158
ちょうどそのよくわからんってとこについて話してるw
よくわからないよな?
161デフォルトの名無しさん:2005/09/16(金) 14:04:24
何度説明すればわかるんだ?頭悪いな
162デフォルトの名無しさん:2005/09/16(金) 14:22:57
よくわからないんだけど、
struct {
int a;
int b;
int c;
} foo = {0};
ならば、全部の要素がゼロクリアされるという認識でいいのかな?

俺はわざわざmemset(&foo, 0x00, sizeof(foo))ってやってたよorz
まあ、大抵はmallocとの組み合わせだからいいんだけど。
163デフォルトの名無しさん:2005/09/16(金) 14:28:14
164デフォルトの名無しさん:2005/09/16(金) 15:11:41
じゃあ、
STARTUPINFO sui = {0}
でいいじゃん
というか、構造体のコンストラクタに初期化処理入れてるよ俺は。
165デフォルトの名無しさん:2005/09/16(金) 15:25:53
>>156
俺の感覚だと、0クリアすることが主目的で
最初のメンバにサイズがあるからついでに入れとけ
って感じだ。
166デフォルトの名無しさん:2005/09/16(金) 15:30:28
>>156
構造体の初期化構文そのものを否定しているのか?

>>158
初期化指定子を先頭から埋めて、残りは0が埋められる。
#って、>159が書いてたか。

>>162
その通り。その場合、{0}でも{0, 0, 0}でも同じ。
ついでに言えば、calloc()でも0で埋められるのでやはり、memset()は不要。

>>164
Cにはコンストラクタがないんでね。それに、0フィルではない点に注意。
167デフォルトの名無しさん:2005/09/16(金) 16:08:33
つうかそもそもゼロクリアなんている?
構造体を出力先として使うならクリアなんてしなくていいし
入力元として使うなら、全てのメンバを規定値で初期化するのが普通だろうし。
168デフォルトの名無しさん:2005/09/16(金) 16:11:09
構造体の変数の順序が変わっただけで、まともに動かなくなるコードなんて・・・
わざわざバグの原因を仕込んでるようなもの。
169デフォルトの名無しさん:2005/09/16(金) 16:29:59
>>168
例えばコンストラクタ引数の並びだって
同様の危険性はらんでるし、それは仕方ないところじゃない?
170デフォルトの名無しさん:2005/09/16(金) 17:27:54
>>167
ウィンドウズのAPIの場合はいる。
おそろしいことにポインタの有効・無効のチェックをNULLかそうでないかで判断している。
171デフォルトの名無しさん:2005/09/16(金) 18:38:49
>>168
画像フォーマットのヘッダや通信関係のヘッダの多くがそう言う構成になってますが。
それとも、フォーマットが変わってもまともに動くように作れと?
#そうなると、単純なバイナリファイルのほぼ全てを否定することになるわけだが。
172デフォルトの名無しさん:2005/09/16(金) 18:53:01
でも、メンバ名指定してコード書いてれば
並びが変わったとしてもリビルドさえすれば解決するけど、
STARTUPINFO sui = {sizeof(sui),};
みたく先頭にあると決め打ちしてると、コードを手作業で修正しないとダメじゃない?
173デフォルトの名無しさん:2005/09/16(金) 18:57:05
>>172
大丈夫、MSにしろどこにしろ、そうそう簡単に順番変えて自分の首を締めるようなことはしないから。
#設計云々と言うことであれば、メンバにサイズを持つなんてこと自体がアナクロだが。
174デフォルトの名無しさん:2005/09/16(金) 19:25:53
順番変えても大丈夫な方法があるのに、わざわざ変えられない方法を選ぶ意図がわからない。
特にメリットがあるわけでもないだろうに
175デフォルトの名無しさん:2005/09/16(金) 19:37:06

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;

俺は初期化にこんな長いコードを書きたくないから前者の書き方が好き。
176175:2005/09/16(金) 19:38:30
あ、,が1つ多かった......
177デフォルトの名無しさん:2005/09/16(金) 19:50:14
別にどうでもいいことだなあ。
そんな瑣末なことは好きにしたら?と。
178デフォルトの名無しさん:2005/09/16(金) 20:31:58
>>175
そのコードの記述が面倒だからってのを理由にする神経は理解できない。
まあ、いままでそうやって書いちゃった分はしょうがないけど、
これからはなるべく書かないようにしたいな。って内容でFAだろ。
もしくは、なるべく構造体よりクラスを使うことを優先するとかな。
179175:2005/09/16(金) 20:39:52
>>178
クラスを使っても問題は解決しないと思うのだが。
どうやって解決するんだ?
180デフォルトの名無しさん:2005/09/16(金) 20:50:41
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 );

こうするのかな・・・
181175:2005/09/16(金) 20:55:14
それは解決じゃない。
初期化する方法として、構造体のメンバの順に依存するのと、
コンストラクタ(or関数)の引数の順に依存するのには 大きな差は無い。
順番を変えると問題が発生するのは同じ。
182175:2005/09/16(金) 21:10:03
で、それを解決するには自分が書いたように、
メンバに延々と代入する式を書くしかない。

10箇所で初期化があれば、
10箇所で延々と何行も代入する式を書くしかない。

初期化関数(いや、それどころか2引数以上の関数全て)を作るのも駄目だ。
なぜなら関数の引数の順に依存するのは駄目だからだ。

ま、自分はそもそも解決する気はないけどね。
順に依存するプログラムを>>175で書いてるから分かると思うが、それを肯定してるから。
183デフォルトの名無しさん:2005/09/16(金) 21:13:57
>>181
違うよ。
そういうイカレタコードの記述を制限できればいいんだよ。
一つ一つ代入する手間なんてプログラムを組んでるときに割く時間の1%にもみたない。
そんなの面倒臭がってる奴なんか絶対に使えない奴に決まってる。
184175: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),........
};
こういうコンストラクタと意味的には殆ど等価でしょ?
せいぜい使うときに={...}か(...)の差しかない。
イカレタコードってほどでも無いと思うが
185デフォルトの名無しさん:2005/09/16(金) 21:30:57
>>184
その辺の認識から違う人間と議論をするほど馬鹿じゃないよ。オレも。
186175:2005/09/16(金) 21:36:58
>>185
了解。
お互い別の宗教の人ということで不毛な議論はしないでおきましょう。
自分もこの話題をこれ以上しても恐らく平行線のままと思いますから。
187デフォルトの名無しさん:2005/09/16(金) 22:05:40
段違いヘイヘイホー
188名無しさん@そうだ選挙に行こう:2005/09/16(金) 23:53:06
>>184
初期化と代入を混同している典型的バカ。
189デフォルトの名無しさん:2005/09/16(金) 23:55:47
いやー、面白いなぁ
190デフォルトの名無しさん:2005/09/17(土) 01:35:59
こんなコーディングマナー(?)講座でもあったら真っ先に出てきそうだな。
肯定するやつがいるとは世の中広いわ。
191デフォルトの名無しさん:2005/09/17(土) 01:37:08
( ^ω^)
192名無しさん@そうだ選挙に行こう:2005/09/17(土) 02:15:58
>>186
const変数とかリファレンスの変数は、初期化せずにどうやって
代入するおつもりですか?と聞きたい。
193デフォルトの名無しさん:2005/09/17(土) 02:17:17
どちらにしろクラス内にリファレンス変数があったら、コンストラクタで全初期化
しないと、コンパイルエラーが出て先に進めない。
194デフォルトの名無しさん:2005/09/17(土) 02:30:34
くだらなさすぎ
195175:2005/09/17(土) 08:35:11
>>188
混同してる気はないな
メンバの順orコンストラクタの順に依存しない方法は全メンバ明示的に代入するしかない。
と言ってるだけだし(俺はそんな初期化が最初の段階で完結しない方法をしたいとは全く思わんが)
>>192
>>193
別に構造体の初期化式を必ず使えって言ってる訳じゃないし
それでカバーできない範囲はコンストラクタを使えば良い。

俺の論点はWINAPIなどのC言語用の構造体はコンストラクタが無いから、
その代わりに構造体の初期化式を使っても問題ないって言う主張だけ。
全メンバ明示的に代入するのはメンドイから。
196デフォルトの名無しさん:2005/09/17(土) 09:08:02
>>188
初期化と代入を混同してる(同一視してる)のは >183 のほうじゃないか?
197183:2005/09/17(土) 09:49:23
>>196
俺は初期化と代入なんて垣根はどうでもいいと思ってるよ。
ただ、構造体の要素の定義の順序がバグの原因になっちゃうようなプログラムはやっぱりよくないなと。
しかも、これってソース書くのが面倒なだけって理由で書くコードでしょ?
俺的には駄目。ちゃんと一つ一つ代入すればこういう危険なことが起こらないんだからそこはちゃんとする。
ちゃんとできることをちゃんとやらないってだけで、どれだけ面倒なことを減らせるかってのは
俺の経験でかなりでかいことがわかってるからこういうのは駄目。
198デフォルトの名無しさん:2005/09/17(土) 10:23:31
MFCダイアログベースです。
自身を最背面に移動するコードを教えて下さい。
199デフォルトの名無しさん:2005/09/17(土) 10:28:43
>>197
そもそも構造体の順序を変えるなんてことをするからいけないといってみるテスト。
200198:2005/09/17(土) 10:28:57
::SetWindowPos(GetSafeHwnd(),HWND_BOTTOM,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE)
で良いですか?
201デフォルトの名無しさん:2005/09/17(土) 10:33:37
>>197
メンバの順序変えることなんてあるかなぁ?
メンバを外に晒してるなら、インターフェースと同じ様に
後から変更加えるようなことしちゃマズイと思うけど。
202デフォルトの名無しさん:2005/09/17(土) 10:33:51
>>197
>ただ、構造体の要素の定義の順序がバグの原因になっちゃうようなプログラムはやっぱりよくないなと。

つまり、構造体をそのままファイルストリームにバイナリとしてロード/セーヴするコードの存在意義を全て否定するわけだね。
203デフォルトの名無しさん:2005/09/17(土) 10:40:06
>>197
> 俺は初期化と代入なんて垣根はどうでもいいと思ってるよ。
C++使っててそんなこと言う奴は勉強のやり直しが必要。
Cだけしか使わない人ならまだ許せるけど。
204デフォルトの名無しさん:2005/09/17(土) 10:40:57
まぁ、自分の書きたい様に書けばいいさ。
それが周りからどう見えるかが気にならない人は。
205デフォルトの名無しさん:2005/09/17(土) 10:45:11
>>201
もし、それをやっちゃうにしても、
それをしてはいけないということをどこかに書いておかなきゃいけないでしょ?
そういうの書く手間を考えたら1つ1つ代入するのが面倒だからなんて発言でないと思うんだけど。

>>202
実際、役に立たないっしょ。
要素に関連項目があっても追加をするには下へ追加していかなくちゃならないし。
なにより変更に激弱で全く役に立たない。
206デフォルトの名無しさん:2005/09/17(土) 10:45:53
>>203
いや、早合点すんな。
この問題でってことだよ。
207デフォルトの名無しさん:2005/09/17(土) 10:51:49
他人の書く、「構造体の順序を変えるような仕様変更は通常有り得ない」という言葉が目に入らないんだろうね。

それはさておき、X11ではこんなことがあった。
GCという構造体があるのだが、この内部の仕様は公開されていたがアプリケーションが直接設定してはいけないとされていた。
勿論そのため、内部の値を設定/取得する関数が公開されていた。
いくつかは忘れたが、あるリビジョンからその内部構造が見えないようにインクルードファイルが変更された。
つまりこの場合では、内部構造に依存するようなコードは変更を余儀なくされた。
この例では、確かに「構造体の内部仕様が変更されたら動かなくなるコード」がよくなかったように見える。
しかし問題は、「アプリケーションが直接設定してはいけない」という仕様を無視したことに問題があるわけで、
WinAPIなどのように内部に直接値を設定しておかなければならない仕様とは根本から違う。
208デフォルトの名無しさん:2005/09/17(土) 10:58:01
>>205
それは新しく構造体やインターフェースを作る側の話だろ。
既に構造体が宣言順も含めてインターフェースとなっている
Windows & C/C++ 環境でプログラミングする側の話と、噛み合ってないぞ。
209デフォルトの名無しさん:2005/09/17(土) 11:12:26
>>208
いや、だから、「それってどうよ?」ってのが今の話題なんジャマイカ?
210デフォルトの名無しさん:2005/09/17(土) 11:15:27
>>208
>既に構造体が宣言順も含めてインターフェースとなっている
なっていても変更される可能性は残されているよね?
211デフォルトの名無しさん:2005/09/17(土) 11:32:03
まあ、変化に強いプログラムコードを書くことは悪いことじゃない。
でも、めったにないことまで考えてややこしいコードを書くのもど
うかと思う。

構造体への個別代入はトレードオフのグレーゾーンだから結論は出
ないと思う。

どっちがより良いかは、プログラマーの性格や環境に依存するからな。

個人なら、自分の好きなように書けば良いし、プロジェクトならコー
ディングルールで決めておけば良い。

とにかく、結論は一つだ。

「自分の好みを人に押し付けるな。」
212デフォルトの名無しさん:2005/09/17(土) 11:32:14
>>209
そんな話なら「今ならもっといい仕様にできたかもしれないね」
って話になっていいかげんにスレ違い。

>>210
それによる混乱は変更した奴、または元のインターフェース決めた奴の責任。
構造体が仕様として公開されてるなら、
使う側がメンバの並びに依存することは問題ではない。
213デフォルトの名無しさん:2005/09/17(土) 11:35:03
>>212
じゃあ、君は仕事でそうやって説明するといいよ。
他の人のプログラムは動いてる中でね。
214デフォルトの名無しさん:2005/09/17(土) 11:51:02
>>213
ちょっと聞かせてほしい。

たとえば Point 構造体がこんなふうに定義されてて、
 struct Point { int x,y; };
なんかの座標データのテーブルを持っておこうと思ったら、
普通こんな感じになると思うんだ。
 Point const table[] = {{1,2},{3,4},{5,6}};

でもこのコードじゃぁ struct Point { int y,x; }; という変更に耐えられない。
君ならどう書くのかな?
215!213:2005/09/17(土) 12:01:51
>>214
だからそのstruct Point { int y, x; };という変更が起こることがありえないと散々書かれていただろ。
普通は少なくとも過去との互換性という名目の下に古いPointも(しばらくは)使えるようにするはずだ。

まあ答えになっていないと言われそうだが。
216デフォルトの名無しさん:2005/09/17(土) 12:05:13
俺なら、Perlで、ソース書き換えスクリプトを作る。
217デフォルトの名無しさん:2005/09/17(土) 12:16:47
>>214
昔、それと同じ問題でモデリングソフトからのデータのY軸とZ軸が
自分のプログラムの座標系とひっくりかえってて

struct XYZ{float x,z,y;};

って定義して変換して大変な目にあった、馬鹿な同僚がいたのを思い出したw

>>214
ヒント:マクロ
218デフォルトの名無しさん:2005/09/17(土) 12:18:05
>>217
マクロでどうにかなるの?
219213:2005/09/17(土) 12:21:42
>>214
長いことゲームのプログラム扱ってて
座標とかのプログラムはなれてる方だと思うけど、
そんな状況はほとんど無いからやったこと無い=考えたことも無い。ってのが正直なところ。
220デフォルトの名無しさん:2005/09/17(土) 12:22:46
>>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),
};
221デフォルトの名無しさん:2005/09/17(土) 12:42:27
>>220
何、それ、どうなってんの?w
222デフォルトの名無しさん:2005/09/17(土) 12:45:54
>>220
なんだそのDirectXはw
223デフォルトの名無しさん:2005/09/17(土) 12:45:58
>>220
それならPointかその派生クラスにコンストラクタをつければいいだけじゃないか。
224デフォルトの名無しさん:2005/09/17(土) 12:48:25
関数ポインタのテーブル化で悩んでいます。

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)だからなのでしょうか?
225デフォルトの名無しさん:2005/09/17(土) 12:54:38
>>224
それいいと思ってやってるの?
悪趣味なコードだな。
226デフォルトの名無しさん:2005/09/17(土) 13:06:17
リフレクションがやりたいんだろうな。
227デフォルトの名無しさん:2005/09/17(土) 13:15:08
tyoeofキーワードが装備されるまで待て。
228デフォルトの名無しさん:2005/09/17(土) 13:20:26
typeofか?そんなもんいつまで待っても無理だよ。C++0xにもないだろ。
229デフォルトの名無しさん:2005/09/17(土) 13:25:57
exportよりは希望が持てる。
230224:2005/09/17(土) 14:34:17
素直にswitch-caseで処理することにします。

お邪魔しました。
231デフォルトの名無しさん:2005/09/17(土) 21:12:43
>>147の904てどっかの中堅エロゲ会社の主任プログラマか何かですか?
こういう偏屈なボスがいると先細りだね

232デフォルトの名無しさん:2005/09/17(土) 23:08:24
>>231
いや社会経験ゼロの脳内PGだと思われ。
233デフォルトの名無しさん:2005/09/18(日) 14:42:47
ttp://www.kumei.ne.jp/c_lang/cpp/cpp_26.htm
猫でもわかるのページの C++のページの26章のファイルの入出力のところで
実行するとファイル名は入力してファイルができるのですが文字が書きこめません。
解かる方教えていただけないでしょうか?
234デフォルトの名無しさん:2005/09/18(日) 14:44:57
>>233
猫でもわからない人は猫以下スレへ
235デフォルトの名無しさん:2005/09/18(日) 14:45:55
猫のC++ってiostream.h世代かよ…
236デフォルトの名無しさん:2005/09/18(日) 14:47:43
>>234
申し訳ありませんでした。
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();
239デフォルトの名無しさん:2005/09/18(日) 15:12:34
240どりーむ:2005/09/18(日) 15:13:16
>>239
すいません。
241デフォルトの名無しさん:2005/09/18(日) 19:07:35
>>233=>>236
つーか猫の事はそこのHPで聞けよ
242デフォルトの名無しさん:2005/09/18(日) 21:23:22
猫の中の人はあれで商売してるから、むしろ積極的に聞くべきだよね。
243デフォルトの名無しさん:2005/09/19(月) 00:21:55
C言語で質問です

文字列を外部から入力するのに

char *p;
gets(p);


ってやるとおかしな動作したりするんだけど
どうしてですか?僕が思うにメモリの確保とかそこらへんに
問題があると思うんですけど

char str[80];
char *p = str;
gets(p);

ってやらないと駄目かなぁ
244デフォルトの名無しさん:2005/09/19(月) 00:29:11








                   ん
               う              こ







245デフォルトの名無しさん:2005/09/19(月) 00:32:22
>>243
そのとおり。
char *p;と宣言してもpはどこかを指せるというだけで、まだどこのメモリも指していない。

あとgets使うな、fgets使え。
246デフォルトの名無しさん:2005/09/19(月) 00:35:03
>>245
わかりました!即レス感謝です。
247デフォルトの名無しさん:2005/09/19(月) 10:32:17
なぜgetsではいけないのですか?
248デフォルトの名無しさん:2005/09/19(月) 10:34:25
>>247
google getsを使うな
249デフォルトの名無しさん:2005/09/19(月) 10:34:56
>>247
別にgets()使ってもええよ。但し自己責任でな。
250デフォルトの名無しさん:2005/09/19(月) 10:36:27
>>248
google getsを使うな だが実践は違う。
251247:2005/09/19(月) 10:40:28
>>428 わかりました、ありがとう
252デフォルトの名無しさん:2005/09/19(月) 10:43:31
>>250
実践?
253デフォルトの名無しさん:2005/09/19(月) 10:45:03
なぜgetsを使っていけないのか知っている奴だけ、getsを使ってよし。
254デフォルトの名無しさん:2005/09/19(月) 10:46:55
           _  _
          /´⌒´⌒\
          / 〃 ハ  ヾヽ
        | ノ∠、ノ,ムヾ |
        (|| ━` i ━ ||)
       ∩{   r ┘ 、 }∩
       _|└9 k='=ヶ} 6┘|_
      /  にニ}、_ ̄´_/にニ} \
    |ヾ  トーイ{≫又≪}ト―イ 〃 |
255デフォルトの名無しさん:2005/09/19(月) 11:22:03
getsを使うと↑の人みたいに時代から取り残されます。
256デフォルトの名無しさん:2005/09/19(月) 13:19:39
こそり使ってます。
他人に見せたり、配布してはいけません。
257デフォルトの名無しさん:2005/09/19(月) 15:18:13
FreeBSD オンラインマニュアル和訳版より抜粋

バグ
 通常、次の入力行がある任意の長さより短いことを保証するのは不可能であり、
 また入力バッファをオーバフローするとほぼ必ずセキュリティ違反となるため、
 プログラムでは gets() を 絶対に使用しないでください。 gets() は、 ISO/IEC
 9899:1990 (``ISO C89'') に適合するためだけに存在しています。


まあ
 char str[BUFSIZ];
 fgets(str, sizeof(str), stdin);
とかやっとけ
258デフォルトの名無しさん:2005/09/19(月) 19:58:47
STLのListについての質問。
ある要素を指しているite1が、ite2の前に新しく要素を挿入した後も、
引き続き同じ要素を指しているようにするには、

if (ite1 == ite2)
ite1 = list.insert(ite2, p); // ite1が宙ぶらりんにならないように
else
list.insert(ite2, p);

とすりゃいいいんだよね?
259デフォルトの名無しさん:2005/09/19(月) 20:03:15
>>258
STL専用スレがあるんじゃー。
http://pc8.2ch.net/test/read.cgi/tech/1116559700/
260258:2005/09/19(月) 20:05:46
了解
261デフォルトの名無しさん:2005/09/19(月) 20:07:06
>>258
list.insert(ite2, p) で十分だと思うが。
何を心配してるの?
262デフォルトの名無しさん:2005/09/19(月) 20:08:46
>>259
そのスレは重複という話もある。↓こっち使って欲しい。
http://pc8.2ch.net/test/read.cgi/tech/1124113879/
263デフォルトの名無しさん:2005/09/19(月) 20:14:10
>>262
STLの話題だけでも結構多いから、俺はC++でまとめなくてもいいと思うよ。
C++ってーとやっぱりこっちも入っちゃうじゃん。
STLばっかり散りばめられるとさすがに読み難いからよ。
なにせこの言語、話題が多いし、仕様が変だし。
264デフォルトの名無しさん:2005/09/19(月) 20:20:42
265258:2005/09/19(月) 20:37:00
ごめん。すごく勘違いしてた。
とにかく疑問は解消した。ありがと。
266デフォルトの名無しさん:2005/09/19(月) 21:09:51
>>264
いや、話題が多いからわけようって話なんだけど?
大きく複雑なものは、小さく単純な形にわけること。
これはプログラムの極意だよ。
267デフォルトの名無しさん:2005/09/19(月) 21:18:22
>>266
わけるには明確に区別可能であることが必要じゃないのか?
268デフォルトの名無しさん:2005/09/19(月) 21:27:06
>>267
いいじゃん。とりあえずSTLとそれ以外で。
この辺は厳密じゃなくてもわかりゃいいでしょ。
269デフォルトの名無しさん:2005/09/19(月) 21:29:54
すごい適当だなw
270デフォルトの名無しさん:2005/09/19(月) 21:30:29
>>268
わかんないから問題なんだろ。 string とか iostream とかな。
271デフォルトの名無しさん:2005/09/19(月) 21:34:38
>>270
日本語わかんない猿なの?
テキトーでいいっていってるだろ。
年がら年中そんなどっちか微妙な質問ばっかり飛び交うわけじゃねぇんだ。
分かる奴が誘導してやるか、ちょうど分かる話題だったらその場で即答で解決すりゃそれでいいだろ。
272デフォルトの名無しさん:2005/09/19(月) 21:37:08
おまえら、ageてまで何スレ違いやってんの?
273デフォルトの名無しさん:2005/09/19(月) 21:46:52
キレたw
274デフォルトの名無しさん:2005/09/19(月) 21:48:46
>>271 必死だな
275デフォルトの名無しさん:2005/09/19(月) 21:51:53
何でこんな荒れてるのかよくわからないんだけどここは環境依存はOKだけどSTLはスレ違いなの?
276デフォルトの名無しさん:2005/09/19(月) 21:56:32
>>275
説明しよう。

適切なスレに誘導するのがスレの仕事だが、
この場合(>258)どっちのスレに誘導するべきか、という話。

"STL"という曖昧さをもった呼称(参照:>264)による区別をやめよう、というものと、
曖昧なままでもいいじゃないか、というものが言い争っている。
277デフォルトの名無しさん:2005/09/19(月) 21:58:51
このスレ自体が曖昧な存在じゃねーの?
278デフォルトの名無しさん:2005/09/20(火) 02:50:58
関数のポインタをtypedefで定義する場合、どう記述したら
宜しいのでしょうか。
int test( void (*pFunc)(int, int, int ,int) ); を
int test(FUNC *pFunc); 等と簡潔に記述出来ると嬉しいのですが。
279デフォルトの名無しさん:2005/09/20(火) 02:53:17
>>278
typedef void (*FUNC)(int, int, int, int);

int test(FUNC pFunc);
280デフォルトの名無しさん:2005/09/20(火) 02:55:58
即レス有り難うございます。 早速試してみます。
281デフォルトの名無しさん:2005/09/20(火) 06:50:56
関数ポインタに*なんて要らんじゃろ
282デフォルトの名無しさん:2005/09/20(火) 15:17:02
>>281
関数の引数だけだな。
283デフォルトの名無しさん:2005/09/20(火) 22:21:47
メイン関数の引数 int argc, char *argv[] の関数名について、
argってのはargumentのことだとおもうんですけど、cとvはなんの略なんでしょうか?
気になったんですけど、考えてもハマる単語がでてきません
284デフォルトの名無しさん:2005/09/20(火) 22:28:19
count
value
285デフォルトの名無しさん:2005/09/20(火) 22:32:16
>>284
なるほど!スッキリした!
286デフォルトの名無しさん:2005/09/20(火) 22:51:46
>>283
カリ引数の名前なんて何でもいいんだよ
argc, argvとか付けたのは蟹版とか金持とかだろ
奴らのセンスのなさをあざ笑ってやれ

「だっせーcreat()って何県の言葉?create()にしたってギリギリ6文字じゃん」
みたいな
おっとこれは違う話だった
287デフォルトの名無しさん:2005/09/20(火) 22:54:10
>>286
COBOLerに刺されそうだな
288デフォルトの名無しさん:2005/09/20(火) 23:17:36
>>286
そんなこと誰も聞いてない。
289デフォルトの名無しさん:2005/09/20(火) 23:26:46
switch文ので文字列を比較することすることってできないですか?
case "文字列":
文;
break;
case "文字列":



って感じで。
なんか出来ないっぽいんですけど
290デフォルトの名無しさん:2005/09/20(火) 23:29:39
出来ないっぽいじゃなくて出来ない。以上。
291デフォルトの名無しさん:2005/09/20(火) 23:42:38
先頭の文字だけでswitchするならできるが文字列全体は無理
292デフォルトの名無しさん:2005/09/20(火) 23:45:06
そうですか…ありがとうございました。
関係ないですけど、僕、switch文つかう時いつもswichって
スペル間違えちゃうんですよね^^
293デフォルトの名無しさん:2005/09/20(火) 23:48:41
ふーん。
294デフォルトの名無しさん:2005/09/20(火) 23:52:42
ここは手前の日記じゃないんだっちゅーの
俺は母ちゃんの奴隷じゃないんだっちゅーの
295デフォルトの名無しさん:2005/09/20(火) 23:56:01
trueをtureって間違えることは良くあるがな
>>294が母ちゃんの奴隷であることはtrue(真)ですがな
296デフォルトの名無しさん:2005/09/21(水) 01:23:51
文字列比較して数値を返す関数使うべし
297デフォルトの名無しさん:2005/09/21(水) 01:45:14
TSV形式のテキストファイルをリソースとして実行ファイルに埋め込み、
fopenで開きたいのですがどうすればいいのかわかりません。
どなたか御存知でしたら御教授お願い致します。
スレ違いだったらすみません…。
298デフォルトの名無しさん:2005/09/21(水) 02:03:26
>>297
普通は同じディレクトリに置いて読むと思うけど、それじゃダメなの?
つか、実行ファイルに埋め込む意図がわからない。

実行ファイルに埋め込むくらいなら、ソース中でテーブル定義した方が良いかと。
299デフォルトの名無しさん:2005/09/21(水) 02:04:09
Tab Separated Values

データをタブ文字で区切って並べたファイル形式。
主に表計算ソフトやデータベースソフトがデータを保存するときに使う形式だが、
カンマ区切り形式(CSV)で保存されたファイルと同様に汎用性が高く、多くの電子
手帳やワープロソフトなどでも利用できる。このため、異なる種類のアプリケー
ションソフト間のデータ交換に使われることも多い。実体はテキストファイルで
あるため、テキストエディタやワープロなどで開いて直接編集することも可能。


...そのまま開けよw
300デフォルトの名無しさん:2005/09/21(水) 02:20:00
うーん、ユーザーにあまりいじって欲しくない部分なのでファイル中に隠蔽したかったのですが…。
大体300行6列ぐらいのテキストです。まあ、もう少し調べてみます。
駄目だったら拡張子変えて読み取り専用にしてごまかすかな…。
301デフォルトの名無しさん:2005/09/21(水) 02:33:30
じゃテーブルでソース埋め込みでいいじゃん
302デフォルトの名無しさん:2005/09/21(水) 02:33:44
Win32の話であれば、ユーザ定義リソースとして埋め込むのが普通じゃないのかな。
TSVは所詮テキストだからSTRINGリソースとして入れることも考えられるが、
その場合は改行を\r\nのように記述しなければならない。

リソースを読むにはfopen()ではなく、
FindResource(), LoadResource(), LockResource()のようなAPIを使う。
どーしてもfopen()で読みたければ、fopen()で実行モジュールを開き、
「自分で」リソースヘッダを検索することになるが、馬鹿馬鹿しいから
そんなことはしないように。

詳細は ttp://wisdom.sakura.ne.jp/system/winapi/win32/win75.html
でも参照のこと。
303デフォルトの名無しさん:2005/09/21(水) 02:39:42
テーブルってVC++だとリソースビューにあるString Tableのことですか?
使い方がよくわからないので勉強してみます。
304デフォルトの名無しさん:2005/09/21(水) 02:40:51
リロードしてなかったorz
>>302
ありがとうございます。早速調べてみます。
305デフォルトの名無しさん:2005/09/21(水) 02:46:06
ソースに普通に数値の配列でぺたぺたと載せれ
306デフォルトの名無しさん:2005/09/21(水) 02:48:05
>305
別に数値とは限らないのジャマイカ?
307デフォルトの名無しさん:2005/09/21(水) 03:06:22
文字列で分岐する場合、どういった方法がスマートなのでしょ。
今丁度拡張子の分岐に
if (StrComp(sExt, "GZ"){
} else if (StrComp(sExt, "ZIP"){
} else if (StrComp(sExt, "LZH"){
}
等と書いていて、もの凄く不毛に感じた所なのですが。

拡張子程度なら、4バイトを数値扱いしてswitchで分岐しても
良いんですかね。
308デフォルトの名無しさん:2005/09/21(水) 03:27:08
>>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);

みたいにやる。
309デフォルトの名無しさん:2005/09/21(水) 04:00:45
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ではマルチキャラクター云々と警告が出ましたが、
とりあえず動いた・・・けど良いのかな。
310デフォルトの名無しさん:2005/09/21(水) 04:02:42
>>309
それだと最初の1文字しか判定に使われてないと思うよ。
この場合はかぶってないから動くだろうけど
311デフォルトの名無しさん:2005/09/21(水) 04:06:23
'複数'を16進で吐いてみたら、ちゃんと数値になってますた。
警告出るから、あまりやってはいけない事なんですかね。
312デフォルトの名無しさん:2005/09/21(水) 07:18:51
中に文字が複数入った文字リテラルの値は処理系依存。
313デフォルトの名無しさん:2005/09/21(水) 08:26:42
リソースに置いたんじゃリソースハッカーとかのツールで簡単にいじられちゃうんじゃないか?
314デフォルトの名無しさん:2005/09/21(水) 15:55:11
こんにちは。
gcc(RHEL), MinGW(Win), Visual Studio .NET(Win)の各環境でC++を使って私用ミニツールなど
を作ったりして仕事してる、一介の営業マンです。最近はサービスでお客さん用のツールなんか
も作ったりし始めました。SE受注減らしてどうするんだって感じですが。

C/C++でのpthreadに関する質問です。
pthread_createでガーっと並列にスレッドを作って仕事をさせ、pthread_joinを回して終了を待つわけな
のですが、
pthread_joinはブロックするので、先頭のスレッドが長引いちゃうと後に続くスレッドが先に終わってても
ボケーっと待ってしまいますよね。
これを、スレッドが終了した順に処理する方法ってありますでしょうか?
よろしくお願いします。
315デフォルトの名無しさん:2005/09/21(水) 16:29:08
enumによる定数値をswitch文で使いたいのですが、
これに代わる似たような使い方ってありますか?
#defineだとスコープが広くなってしまうので。
316デフォルトの名無しさん:2005/09/21(水) 16:30:49
enum で列挙した値には整数値が入ってるけどそれじゃだめ?
317デフォルトの名無しさん:2005/09/21(水) 16:36:44
>>315
switchにenumって使えなかったっけ?
318ヽ(´ー`)ノ ◆.ogCuANUcE :2005/09/21(水) 16:38:21
>>314
マルチスレッドプログラミング相談室 その3
http://pc8.2ch.net/test/read.cgi/tech/1098268137/
319デフォルトの名無しさん:2005/09/21(水) 16:53:22
>>315
enumした識別子をそのままcaseに書けばいいじゃん
320デフォルトの名無しさん:2005/09/21(水) 21:45:51
#define だとスコープが広くなるの?
321デフォルトの名無しさん:2005/09/21(水) 21:47:14
全然
322デフォルトの名無しさん:2005/09/21(水) 22:01:44
MeのVC6やBCCで、VK_PAGE_UPを使いたいのですが、
定義されていないと出て使えません。
VK_HOMEとかVK_UPとかは使えるのですが、
何か別途インクルードなどしないといけないのでしょうか。
323デフォルトの名無しさん:2005/09/21(水) 22:13:40
その手のエラーは大抵は
StdAfx.hのWINVERかWINNTかWINDOWSマクロで定義されている
バージョンが違うせいだ。
324デフォルトの名無しさん:2005/09/21(水) 22:14:10
>>315
マクロはただの置換だから、スコープ云々は関係ない
さらに言うと、enum定義もスコープは関係ない

#define DEF_HOGE 3

enum{
 ENUM_HOGE = 3,
};

とした場合、以下は全く同じ物。
 case 3:
 case DEF_HOGE:
 case ENUM_HOGE:
325322:2005/09/21(水) 22:17:28
>>323
ありがとうございます。
キーワードを元にもう一度調べてみます。
326デフォルトの名無しさん:2005/09/21(水) 22:42:07
MEというのが曲者だな。NT系しか使ってないから分からないが、
WINVERが0x500じゃないと駄目なんてのもあるしな。
327デフォルトの名無しさん:2005/09/21(水) 22:43:20
>>320
namespaceの事を言いたかったんではなかろうか?
328デフォルトの名無しさん:2005/09/21(水) 23:07:40
>>322=>>325
定義されてる名前が違うから定義されてないと出るのは当たり前
PageUpはVK_PRIOR、PageDownはVK_NEXT

>>323
もうちょっと良く調べようや?
329323:2005/09/22(木) 03:46:13
>>328
釣られているのに気が付かなかったのか?w
330デフォルトの名無しさん:2005/09/22(木) 04:34:38
2chでの質問に真剣になって調べる人って素敵過ぎる
331デフォルトの名無しさん:2005/09/22(木) 04:39:48
>>330
そうすると、俺ってばここ数年は素敵過ぎっぱなし。
332322:2005/09/22(木) 06:32:39
>>328
ありがとうございます。
なるほど、名前自体が違っていたとは。
マジナン使わずに済みました。
333322:2005/09/22(木) 06:37:29
>>326
MaskBltとか使えないですしね。
334デフォルトの名無しさん:2005/09/22(木) 07:07:14
>>329
自称釣り師はお帰りくださいな
335デフォルトの名無しさん:2005/09/22(木) 13:58:33
現在、C言語でプログラムを開発しているのですが、
ちょっとした処理をラップしたいときに、
マクロ、インライン関数のどちらにするべきか迷っています。
(コンパイラはインライン関数をサポートしています)

関数をマクロ化するのと、インライン関数化するのでは
型チェックをする以外に何か大きな違いはありますか?
336デフォルトの名無しさん:2005/09/22(木) 14:03:10
>>335
俺ならインライン関数でできることはインライン関数にする。

あと、インライン関数なら必然的にブロックを作ることになるので、
何も考えずともローカル変数を宣言できる。
337デフォルトの名無しさん:2005/09/22(木) 14:05:44
マクロはデバッガが追ってくれない
338デフォルトの名無しさん:2005/09/22(木) 14:09:25
問答無用でインライン
339335:2005/09/22(木) 15:27:04
>>336-338
ありがとうございました。
インライン関数の方で作ることにします。
340デフォルトの名無しさん:2005/09/22(木) 15:43:10
>>335
インライン関数はC99だから、まだ移植性が無い点に注意だ
移植性が大事なら、マクロにしといたほうが無難
341デフォルトの名無しさん:2005/09/22(木) 15:57:44
あるプログラムでデバッグでは正常に動くのですが、
リリースだと不特定の場所でアプリケーションエラーが起きてしまいます。

色々コメントアウトしていって確認した所、
下記のコードをコメントアウトするとリリースでも正常に動くようになりました。
下記のコードは不正な処理なのでしょうか?


char chStr[1];

//strReadはCString文字列(2バイト文字の場合もあり)
strcpy( chStr, strRead.Left(1) );
342デフォルトの名無しさん:2005/09/22(木) 16:01:17
答えはそのままで、
1バイトしか確保してないところに2バイト入れてるからじゃないの?
343デフォルトの名無しさん:2005/09/22(木) 16:01:59
>>341
ヒントをあげよう

[NullTerminatedString]
[NULL終端文字列]
344デフォルトの名無しさん:2005/09/22(木) 16:02:56
なんつーか、勉強不足にも程があるな・・・
345デフォルトの名無しさん:2005/09/22(木) 16:21:19
1個だけ配列を用意するんだったら変数でも良いよな
346341: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) );
347デフォルトの名無しさん:2005/09/22(木) 16:48:48
>>346
・strRead.GetAt()がどのような関数であるかわからないと、何とも言えない。
・chStr[]がプログラム中でどのような働きをしているかわからないと、何とも言えない。
348デフォルトの名無しさん:2005/09/22(木) 16:52:28
一時間も調べないうちにあきらめるのか・・・ハァ・・・
349デフォルトの名無しさん:2005/09/22(木) 16:53:38
>>346
strcpyはコピー先の末尾に文字列の終端の印として'\0'を書き込む。
だからchStrにstrcpyで1文字書き込むならchStrの要素数は少なくとも2以上必要になる。

chStr[0] = strRead.GetAt(0);とするのは間違っていないが、そもそも要素数1なのでchStrは配列にする必要がない。

>>348
同感。
350341:2005/09/22(木) 17:03:25
>>349
どうもありがとうございます。

>strcpyはコピー先の末尾に文字列の終端の印として'\0'を書き込む。
ということを知りませんでした。

chStrも確かに配列にする必要もないですね。


勉強不足のようですいませんでした。
351デフォルトの名無しさん:2005/09/22(木) 18:00:59
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/strcpy.3.html
にstrcpy(3)の日本語マニュアルがあるが……
この訳は糞だな。
見ないほうがいい。
352デフォルトの名無しさん:2005/09/22(木) 18:01:23
>>350
お前、C言語の入門書もロクに目を通してないだろw
サンプルコードなぞることすらやってない臭いがするw
353デフォルトの名無しさん:2005/09/22(木) 18:18:33
>>351
原文の修飾関係を完全に読み誤ってるな
プログラミング何もしらない奴が訳したのか?って思える出来

素直にCygwinなりLinux実機なりでman使った方が数百倍マシ
354デフォルトの名無しさん:2005/09/22(木) 18:24:37
355デフォルトの名無しさん:2005/09/23(金) 00:40:06
普通に、「終端文字を含めてコピーします」とか書いてるマニュアルもようけあるのに、
何が知りませんでしただ。
なさけない・・・
356デフォルトの名無しさん:2005/09/23(金) 01:30:39
>>355
いや、このレベルのことすら知らないのはC言語の入門書の
サンプルコードすら打って無いレベルだよ。
普通は入門書にね、文字列をいじるコードがちょっとはあるはずだから。
357デフォルトの名無しさん:2005/09/23(金) 02:04:25
ま、C言語入門者がみんな最初に入門書を一冊読むようになれば
このスレの質問は1/10以下に減るでしょ。
358デフォルトの名無しさん:2005/09/23(金) 02:16:56
>>357
入門書って?
359デフォルトの名無しさん:2005/09/23(金) 02:38:27
二つの文字列は重ならない。
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: 構文エラー : ')'
361デフォルトの名無しさん:2005/09/23(金) 08:07:38
>>360
とりあえず本を一冊くらい読めって・・・
362デフォルトの名無しさん:2005/09/23(金) 08:36:20
>>360
エラーの出た場所の見直しくらいしてから来い
363デフォルトの名無しさん:2005/09/23(金) 08:38:27
そもそもプロトタイプ宣言を理解してなさそうだが
364デフォルトの名無しさん:2005/09/23(金) 08:41:06
>>362
場所やプロトタイプ云々の前に、行数を見た感じ・・・
365デフォルトの名無しさん:2005/09/23(金) 10:01:28
>>360
ひさびさに噴いたw
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です
マウスの座標をプログラム側で操作することは可能でしょうか
368デフォルトの名無しさん:2005/09/23(金) 10:20:43
C言語を初めて7日です。
コンソールアプリで、標準入力から値をもらう時オーバーフローが起こる時があるそうなので、調べて次のような関数をを作りました。
戻り値は*charです。
char bufs[LENGTH], *s,*rs;
s = bufs;
rs = fgets(s, LENGTH, stgin);
fflush(stdin);
return NULL != rs ? s : NULL;
今のところは問題なく動いていますが、危険な場所があれば教えていただけませんか?
369デフォルトの名無しさん:2005/09/23(金) 10:54:56
>>358
作ってわかるCプログラミング
370デフォルトの名無しさん:2005/09/23(金) 11:03:52
fflush(stdin); ←これって環境によって動きが変わる気がするんだが
371デフォルトの名無しさん:2005/09/23(金) 11:15:22
>>368
危険ではないけれど、bufsをsに代入するのは無駄。直接fgetsの引数にしてしまえ。
fgetsの戻り値はNULLか第一引数を返すとなっているからreturn rs;とだけ書けばいい。
372デフォルトの名無しさん:2005/09/23(金) 11:29:03
C言語は詳しくないんだけど、AUTO変数はreturnした後中身を保証されてるの?
373デフォルトの名無しさん:2005/09/23(金) 11:29:25
>>368
関数ローカルな変数へのポインタを返しちゃダメだよ。
374368:2005/09/23(金) 11:31:17
レスありがとうございます
>>370
動作が処理系依存?のようですね。
あってもなくても動くので、様子を見ながら使おうと思います。
>>371
大変参考になりました。
ありがとうございました。
375デフォルトの名無しさん:2005/09/23(金) 12:04:44
>>374
釣りご苦労。

釣りじゃないなら、>373をよく読むように。
376368:2005/09/23(金) 12:37:49
書き込んですぐブラ閉じてしまいました…
ということは、関数の呼び出し元でchar配列を生成し、それを引き数に渡してそこに入れれば良い、ということでしょうか?
377デフォルトの名無しさん:2005/09/23(金) 12:44:18
別に関数内でmallocなりして返してもいいぞ
ただし、ちゃんと解放しないといけないけどな
378368:2005/09/23(金) 12:53:39
なるほど…
ありがとうございました
379デフォルトの名無しさん:2005/09/23(金) 13:09:03
>>367
mouse_eventとかSendInputでお調べ
380デフォルトの名無しさん:2005/09/23(金) 13:44:07
>>368
> オーバーフロー
というよりは、要するに行が長くてfgets()で1行が読みきれなかった
場合の対策か?
その場合に単に行の残り(改行文字まで)を読み捨てたい、というのなら
fflush()では間違い。

そもそもfflush()のこうした使い方は規格上には保証されていないが、
それが動作する場合であっても、単に現在読み込み済みのバッファの
中身を空にするだけだ。
それ以上行が長ければ、次回はまた行の続きを読むことになる。
381デフォルトの名無しさん:2005/09/23(金) 15:21:44
UNIX C(OSはAIXです)について教えてください。

setuid、setgid関数を使用して任意のユーザ権限で処理を実行するプログラムで、
環境変数HOMEを起動したユーザのホームディレクトリから任意ユーザのホームに変更するよう
setenv関数を使用したのですがHOMEの内容は変更されませんでした。これって仕様なのでしょうか??
382デフォルトの名無しさん:2005/09/23(金) 15:48:43
>>381
まず読点の使い方を学べ。
383デフォルトの名無しさん:2005/09/23(金) 16:15:32
>381
>setenv関数を使用したのですがHOMEの内容は変更されませんでした。
どうやって調べた? 親プロセスの環境変数を変更することはできないぞ。
setenvしたプロセスと、そのプロセスの子プロセスの環境変数が変更されているはず。
384デフォルトの名無しさん:2005/09/23(金) 17:27:16
改頁の'\f'について訊きたいんですが、これはどういう効果があるんでしょうか?
printf("あ\fい\fう");
としてみたら、"あ い う"とスペース?が入っただけでした。
どういう場面で使うものなのでしょうか?
385デフォルトの名無しさん:2005/09/23(金) 17:38:51
\fを改ページとして認識するシステムに対して使う。

printfで何故そうなるかは
printfのマニュアルしらべて\fが何の効果になってるか調べてみればわかる。
386デフォルトの名無しさん:2005/09/23(金) 17:41:47
>384
FF(FORM FEED)をプリンタ、特に昔のラインプリンタに出力すると紙送りが行なわれた。
今のプリンタは、普通はPDLでページ単位に出力するためフォームフィードが出力ページに
含まれていても特に何も起きないえでお。
387381:2005/09/23(金) 19:02:29
>>383
dbx使ってsetenvの所でstop。
ステップインしたところでsh envとしたのですが間違いでしょうか?
388デフォルトの名無しさん:2005/09/23(金) 20:13:33
>387
それは、dbxの子プロセスの環境を表示しているだけで、
デバッグ対象のプロセスの環境を調べているわけではない。
389381:2005/09/24(土) 03:12:14
>>388

setenv後にsystem関数でenvを実行してみたんですが結果は同じでした。
理想はsetuidしたユーザのホームディレクトリが環境変数HOMEに入ることなのですが
390デフォルトの名無しさん:2005/09/24(土) 03:17:02
>>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はどういう型にしてどう初期化すればいいですか?
392デフォルトの名無しさん:2005/09/24(土) 05:13:41
>>391
これはまた危険な使い方を・・・
型縛りが嫌ならvoid*でも使えばいいんじゃね?

個人的にはオススメできない組み方だなぁ・・・
問題の本質は要するにプログラムが上手くないから型が邪魔になっちゃってるんだよね。
393デフォルトの名無しさん:2005/09/24(土) 06:30:38
関数テンプレートで渡された型をnewして返すとか出来ないかな
俺のレベルじゃよくわかんないけど・・・
394デフォルトの名無しさん:2005/09/24(土) 07:55:53
無理やりやるならこんな感じ
#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());
}
395デフォルトの名無しさん:2005/09/24(土) 08:12:08
>>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 パターン使えば済む話ではなくて?
396391:2005/09/24(土) 08:25:06

助かりました&勉強になりました。
教えていただけば「なるほど、そうだよね」なのですが、
自分ではどうやってもあと一歩が書けませんでした。
本当にありがとうございました。
397391:2005/09/24(土) 08:53:40
>>395
あ、おはずかしい。なんかそういう話みたいです。勉強します...
398デフォルトの名無しさん:2005/09/24(土) 09:13:34
>>395
Factory パターンって何だよ。

Abstract Factory も Factory Method もあてはまらないぞ。

やりたいのは、名前を指定して対応するオブジェクトを作成することだろ。
399デフォルトの名無しさん:2005/09/24(土) 09:33:44
この場合はPrototypeパターンが一番近いだろうなぁ
400デフォルトの名無しさん:2005/09/24(土) 12:59:47
>>394
こうやってまとめる意味ってないと思うんだけど
結局、何がやりたくてこんなソースになるわけ?
401394:2005/09/24(土) 13:10:19
std::map<std::string,T*(*)()>を使うほうが綺麗だったな。どうでもいいけど
402381:2005/09/24(土) 13:35:40
>>389


sprintf(userhome,"/home/%s",argv[1]);
setenv("HOME",userhome,1);
rtn=system("/usr/bin/env |grep HOME");
403デフォルトの名無しさん:2005/09/24(土) 14:47:16
>>402
最小単位の a.outを setuidとか dbx 無しに、じかに実行して確認しました?
AIX か。setenv(3)の引数の仕様を確認できないんだけれど(setenvあったっけ?)、
putenv() では確認しました?
つうか、system()とは別に getenv()くらい確認してみれば?
簡単なデバグや確認作業ができないのは問題だなあ…
>>381 例とかもいろいろ突っ込みたくなるが…
>setuid、setgid関数を使用して任意のユーザ権限で処理を実行するプログラムで、
初心者かどうかにかかわらず、今更素人がそんなプログラム書くのやめろよと…
404TOM:2005/09/24(土) 17:24:27
C++のMAPでキーの値に128ビットの値を持たせたいんですけど、
どうすればいいんですかね?
405デフォルトの名無しさん:2005/09/24(土) 17:26:04
128ビットの値をキーにすれば良い。以上
406TOM:2005/09/24(土) 17:31:13
>>405さん
intとかlongじゃあふれちゃいますよね・・。
配列とかにするってことですか?
よろしくです。
407デフォルトの名無しさん:2005/09/24(土) 17:32:56
128ビットを扱うクラスでも作れば?
408デフォルトの名無しさん:2005/09/24(土) 17:34:59
typedef std::pair<std::pair<int,int>,std::pair<int,int> >value_128;
とか。
初期化が面倒だけど
409デフォルトの名無しさん:2005/09/24(土) 17:47:39
128bitなのになぜintやlongで溢れると思うのか謎ぃんだが
410デフォルトの名無しさん:2005/09/24(土) 17:48:22
int2つよりlong2つのほうがよくね?
411デフォルトの名無しさん:2005/09/24(土) 17:52:09
>>403
レスありがとうございます。
今の案件落ち着いたら頑張ってまともなC言語書けるようにします。
412デフォルトの名無しさん:2005/09/24(土) 17:58:09
>>409
longって多くても64bitじゃなかったっけ?
413デフォルトの名無しさん:2005/09/24(土) 18:01:06
C++にstdint.hがあればなぁ……
414デフォルトの名無しさん:2005/09/24(土) 18:16:21
VC++の質問なのですが
構成をReleaseにしたexeを起動すると
STLの map insert 3回目(for文で7回繰り返す予定)
で 「問題が発生したため〜」で止まってしまいます。

ですが、VC++の方でビルドすると、問題なく実行します。
MessageBoxをちょこちょこ追加しながら見てますが
mapに入れるデータには特に問題があるわけでもないです。

となると、mapに入れるのに失敗したという事なんでしょうか。
415デフォルトの名無しさん:2005/09/24(土) 18:18:30
>構成をReleaseにしたexeを起動すると

>VC++の方でビルドすると

ha?
416デフォルトの名無しさん:2005/09/24(土) 18:20:40
問題が発生する最小のソースを出してくれ。
さすがにソースコード無しじゃ分からんよ。
今言えるのは君のコードに問題があるだろうということくらい
417414:2005/09/24(土) 18:26:51
>>415
スマソ 説明がとにかく難しい

>>416
了解、ですがちょいと小用が発生しましたので片付けてまた来ます。
申し訳ない
418デフォルトの名無しさん:2005/09/24(土) 18:30:10
>>415
exeを実行するとダメだが、IDE上から実行するとOKって言いたいんじゃないのか?
419デフォルトの名無しさん:2005/09/24(土) 18:31:27
>>414
どちらかのみ配列が0クリアされるとか
違いがあったと思うけど、そこら辺が原因かな。
Debugの方がたまたま動いている感じで。
420デフォルトの名無しさん:2005/09/24(土) 18:34:07
>>413
<boost/cstdint.hpp>
421デフォルトの名無しさん:2005/09/24(土) 18:39:24
422デフォルトの名無しさん:2005/09/24(土) 18:54:55
std::bitsetをキーにすりゃいいよふな
423デフォルトの名無しさん:2005/09/24(土) 19:08:32
>>422
std::bitsetって比較演算子定義されてたっけ?
424403:2005/09/24(土) 20:25:47
>>411
なんか誤解があるようなので。
質問したからには、せめて、普通にはありそうも無いこの現象が
何故起きたのか、種明かしは伝わるようにしてください。
そちらがまともなC言語書けるようになるかどうかは無関係ですし、
誰も関心が無いと思います。
(まともな設計やsetuid等の問題性の考察は言語とは別ですから)
425414: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 に書いておきました。
426デフォルトの名無しさん:2005/09/24(土) 20:42:46
>問題点を指摘して頂ければ幸いです。
あんたの頭。
プロジェクトを丸ごとアップロードする馬鹿がどこにいる。
427414:2005/09/24(土) 20:44:27
おっと
Test.exeはReleaseモードで作られた奴です
実行すると 「問題が〜」 が出ます。
428416:2005/09/24(土) 20:44:40
問題が発生する最小のソースと言ったんだけど……
                      ~~~~~
429414:2005/09/24(土) 20:47:30
>>426
すみません。
手を煩わせるのも申し訳ないと思ったもので。
430デフォルトの名無しさん:2005/09/24(土) 20:49:48
>>429
余計手間だろうが
最小のソース抜き出せ、それができないなら止めろ
431デフォルトの名無しさん:2005/09/24(土) 20:55:06
最低限のソースと、実際に問題の出る実行モジュール。それ以外に何が必要だと言うのだろうか。
432414:2005/09/24(土) 20:58:06
またまた、申し訳ない
もうちょっと削ってみます。
433デフォルトの名無しさん:2005/09/24(土) 21:01:49
pszStr[dwAccBytes] = '\0';
これじゃね?。
dwSize=dwAccBytesしか確保してないのに・・・
434デフォルトの名無しさん:2005/09/24(土) 21:57:21
http://gamdev.org/up/img/3415.zip
ご迷惑をお掛けしました。
さらに削ってみました。よろしくお願いします。

>>433
pszStr[dwAccBytes + 1]等
やってみましたが
そこでは無いみたいです。

mapへのinsert4回目でエラーが発生します
文字列、ファイル読み込みは問題ないのですが、何故だろう。
435デフォルトの名無しさん:2005/09/24(土) 22:00:28
>>434
+1て・・・
436デフォルトの名無しさん:2005/09/24(土) 22:05:53
>>434
うおおおい志村-1-1
437414:2005/09/24(土) 22:07:24
あ!!!
438414:2005/09/24(土) 22:13:37
お恥ずかしい。
pszStr[dwAccBytes - 1]で解決しました。
読み込んだ文字列には問題が無かったもので
この辺はまったく考えてませんでした。
後、無知も災いしたようで。

しかし、3回も読み込めたのはいったい何だったのだろう?

どうも、お騒がせしました。アップしたファイルは消しておきます。
レス有難うございました。
439デフォルトの名無しさん:2005/09/24(土) 22:16:17
pszStr[dwAccBytes - 1]に\0書いたら、最後の一文字消えないか?
440デフォルトの名無しさん:2005/09/24(土) 22:17:12
>>438
小手先だけじゃなくて、ちゃんと考えた方がいいぞ。
俺ならそこは足さない。

あえて答えは書かない。
441デフォルトの名無しさん:2005/09/24(土) 22:18:14
と思ったら書かれてた・・・(´・ω・`)ショボーン
442デフォルトの名無しさん:2005/09/24(土) 22:20:24
ワロタ
443デフォルトの名無しさん:2005/09/24(土) 22:22:14
しかも足すじゃなくて引くだし・・・
444デフォルトの名無しさん:2005/09/24(土) 22:23:12
まぁよくあるミスだよな。
オレもメモリ確保を一桁ミスってるのに気づかず
4時間悩んだことがある
445414:2005/09/24(土) 22:37:22
pszStr[dwAccBytes - 1] = '\0'
すると消えますね@@;
ファイルは
最後に \r\n 入れてたので回避してましたが。
入れない方がよさそうだ。
(psz(略)を消しても問題なく動作しました)
446デフォルトの名無しさん:2005/09/24(土) 23:00:19
Cでの質問なのですが、
ユーザーが入力した数字を、それとは別に入力した回数だけ
累乗し、その結果を表示する、というプログラムをつくろうと思っています。
累乗のところをどうしたらいいか思いつかないのですが、
どうやればできるでしょうか。

どなたか回答お願いいたします。
447デフォルトの名無しさん:2005/09/24(土) 23:05:15
>>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
449デフォルトの名無しさん:2005/09/24(土) 23:25:55
>>448
読み取り専用でfopenしてみて失敗したらディレクトリで成功したらファイルというわけにはいかないのかな?
やったことないから上手くいくかわからない。
450デフォルトの名無しさん:2005/09/24(土) 23:26:23
>>448
ほかにも方法があるかもしれないが、まともな方法はどれも
初めて include するファイルが表れることだろう。

あ、 fopen が失敗して、且つ errno が EISDIR だったら、ディレクトリかもしれない。
451デフォルトの名無しさん:2005/09/24(土) 23:27:10
>>447
ありあがとうございます!やってみます。
452デフォルトの名無しさん:2005/09/24(土) 23:28:28
>>448
何の目的で調べるかによるな
単純にファイルかディレクトリかどうか調べるなら後ろに"\\nul"つけてオープンする手も有るよ
開けたらディレクトリで開けなきゃファイル
453デフォルトの名無しさん:2005/09/24(土) 23:28:48
GetFileAttributesはびくびくするほどのものではないからとりあえず使ってみようよ。
454デフォルトの名無しさん:2005/09/24(土) 23:32:46
C言語の標準関数だけでやりたいんじゃないかな?
とりあえずfp=fopen("ディレクトリのパス", "r")はfp==NULLだった。
455448:2005/09/24(土) 23:42:23
回答していただいた皆さんありがとうございます。(みんな優しい。(涙))

ディレクトリを fopen でわざと開いて失敗させて、 errorno を見たら、
#define EACCES 5 /* Permission denied */
でした。

よくわからないので、ここは勇気をもって、GetFileAttributes に挑戦してみようと思います。
(標準関数だけの世界じゃ生きていけないのかぁ。)

ありがとうございました。(うまく行ったら報告します。)
456448: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;
}
457デフォルトの名無しさん:2005/09/25(日) 00:03:12
>>455
ちょっとまった「標準関数の世界」って何を想定、意味しているつもりなの?
(標準入出力等ならともかく、file system等は C言語外の環境なので当然…)
458デフォルトの名無しさん:2005/09/25(日) 00:17:32
センセー、Cの質問です!

今ファイル操作やってるのですが
テキストファイルの文字の消去の仕方が分かりません
fputc('\0',file);
とかやっても変なデータが上書きされるだけで orz

初心者チックな質問ですがよろしくお願いします
459デフォルトの名無しさん:2005/09/25(日) 00:20:26
> テキストファイルの文字の消去の仕方が分かりません

もちっと具体的に詳しく伝えて
どうしたいんで?
460デフォルトの名無しさん:2005/09/25(日) 00:21:15
変なデータって、どんなデータ?
461デフォルトの名無しさん:2005/09/25(日) 00:21:52
その文字以降のものを全部前に詰めるようにする。
462458:2005/09/25(日) 00:34:08
ぐぁ…説明不足で申し訳ありません
えーと…何と説明すれば良いやら

テキストモードで書かれたファイル中の文字を削除したいんですよ
テキストデータを一行削除したときに一行ずつ上にずらしているので最後の行が二重になって余ってしまうんです

start
test
test
end
というデータで2行目を削除すると
start
test
end
end

となってしまい、最後の行を消したいのですが方法が分かりません
463458:2005/09/25(日) 00:35:23
と、ちなみに変なデータってのは

" ↑"みたいのが入ってしまって意図通りに消えないってことで

下手くそな説明で申し訳ない orz
464デフォルトの名無しさん:2005/09/25(日) 00:39:57
処理系依存の問題だな
手っ取り早いのは元のファイルは消して、新しく出力しなおす
465デフォルトの名無しさん:2005/09/25(日) 00:46:08
質問です。クラス内の仮想関数のvtableを書き換えて
クラス内の関数をフックしたいのですが行き詰っています。
フックのサンプルみたいなものがあってLPDIRECTDRAW7のCreateSurfaceをフックしていたのですが

LPDIRECTDRAW7 lpdd; // DirectDrawCreateで作成済みのLPDIRECTDRAW7
void *pCreateSurface;
pCreateSurface = *(void **)(*(DWORD *)lpdd + 24);
*(void **)(*(DWORD *)lpdd + 24) = extCreateSurface;

こんな感じでフックしてたんですが、この行に出てくる24はどうも
lpddのアドレスからのCreateSurfaceへのオフセット値っぽいのですが
こんな風に作成されたクラスの仮想関数へのオフセット値を求める手段ってあるんでしょうか?
なんかよくわかんないまとめ方になってすいません。
466458:2005/09/25(日) 00:46:51
うぁー…上手く消す方法とかありませんか
その方向で考え直してみます

回答ありがとうございました
467デフォルトの名無しさん:2005/09/25(日) 01:14:12
>>466
Unix/Linux なら、 truncate() とか ftruncate() 使えない?
Windows なら、 _chsize() かな。
468デフォルトの名無しさん:2005/09/25(日) 01:34:35
>>465
そいつはクラスじゃなくてCOMだ。
まあWindows環境のC++ではたいてい同じ構造になるんだけどな。

オフセットの求め方はないと思う。
宣言された順に+4ずつ増えてくから、自分で数えるしかないんじゃね?
469デフォルトの名無しさん:2005/09/25(日) 01:42:59
offsetofは?
470458:2005/09/25(日) 02:28:20
>>467
おぉぉ!
_chsize()で解決しました!!
レス感謝です!
471デフォルトの名無しさん:2005/09/25(日) 03:24:11
継承した場合、
メモリ配置的には、基本クラスが先頭で、
次に継承した順に配置されるんでしょうか?
class CBase
{
public:
float value_base;
};
class CDerived : public CBase
{
public:
float value;
};
なら、
CBase* p;
CBase a;
p = &a;
p->value_base = 0.1f;
は有りですか?
472デフォルトの名無しさん:2005/09/25(日) 04:00:40
CDerived使ってないし。
基本クラスが普通先頭で、先頭かどうかに関係なくそれは有りなんじゃ?
配置の説明は色々あるけど、これ読みやすかった
ttp://www.microsoft.com/japan/msdn/vs_previous/visualc/techmat/feature/jangrayhood/
473デフォルトの名無しさん:2005/09/25(日) 06:29:43
今年の3月24日に「お前は半年ロムってろ」って言われたものですが
今日でようやく半年になりました。
おひさしぶりです。涙がでそうです。
474デフォルトの名無しさん:2005/09/25(日) 07:12:02
Σ(゚Д゚;≡;゚д゚)
475デフォルトの名無しさん:2005/09/25(日) 07:16:17
今は20万行ROMるのが流行らしいよ
476デフォルトの名無しさん:2005/09/25(日) 07:23:01
>>473
お前は一生ロムってろ
477デフォルトの名無しさん:2005/09/25(日) 08:01:11
それコピペだろw
478デフォルトの名無しさん:2005/09/25(日) 09:56:50
>>468
やっぱり求める方法は無いんですかね…
宣言順が分からない事にはどうしようもないですねと思ったら
SDKのddraw.hに宣言順が書いてありました(´∀`)
解決できそうです。ありがとうございました。

>>469
offsetof(lpdd,lpdd->CreateClipper)みたいにしても
構文エラーになってしまって何故エラーになってるのか
わかりませんでした。とりあえず>>468さんの方法で
行ってみようと思います。ありがとうございました。
479デフォルトの名無しさん:2005/09/25(日) 09:59:45
>>478
offsetofは非静的メンバ変数にしか使えない。
480デフォルトの名無しさん:2005/09/25(日) 12:28:07
>>471
Inside The C++ Object Model でも読め。
481デフォルトの名無しさん:2005/09/25(日) 15:49:36
Cで書かれたコードをC++に変更することになりました。
VC++6.0でデバッガを使いたいのですが、
Win32 Console Applicationのプログラムをステップ実行しながらデバッグできるのでしょうか。
コマンドプロンプトで、入力ファイル名・出力ファイル名を入力する仕様です。

それともprintfで値を出力しながらデバッグするしかないのでしょうか。
482デフォルトの名無しさん:2005/09/25(日) 15:50:17
COMプログラミングについて詳しく記述してあるページは無いでしょうか?
google先生を始めとする検索エンジンに
「COMプログラミング」とか「COM プログラム」とかで探しても
何故かCOMだけいい感じに無視されてCOM関連のページを見つけることが出来ません。
483デフォルトの名無しさん:2005/09/25(日) 15:51:24
>>481
なぜ試さない?
484481:2005/09/25(日) 16:02:05
いや、F5押して試してみたんですけど、
いきなり実行されて終了してしまうんです。
入力ファイル名などを入力することができずに。
(argc=3でないと終了する仕様。何故こうしたかは先人達の考えがあったと思うのですが。。。)

Visual Studioは初めて使うことになったので、設定等が分かりません。
485デフォルトの名無しさん:2005/09/25(日) 16:05:30
>>484
実行時のコマンドライン引数を設定をしろ
F1押して"実行時のコマンドライン引数"で探すべし

何を設定すべきかは前任者に聞く事
486481:2005/09/25(日) 16:17:47
>>485

ありがとうございます。
やってみます。
487デフォルトの名無しさん:2005/09/25(日) 16:30:17
初めて使うなら、まず説明書を見ろよ・・・
488デフォルトの名無しさん:2005/09/25(日) 16:41:23
>>481
F5じゃなくてメニューのデバッグの方から実行すれば
終了するには何かキーを押して下さいとか表示された気がする。
489デフォルトの名無しさん:2005/09/25(日) 16:44:06
カーソル前まで実行、の機能を使うか
止めたい所にブレークポイント入れとけば?
490デフォルトの名無しさん:2005/09/25(日) 16:47:16
【環境】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++;
}
}
491デフォルトの名無しさん:2005/09/25(日) 16:49:04
492デフォルトの名無しさん:2005/09/25(日) 17:06:05
>>490
lpstrFileTitleは領域確保してあるのか?
493デフォルトの名無しさん:2005/09/25(日) 17:07:21
>>491
うお、そんな技があったんですねっていうかMSDNにCOMの記事あったんですねorz
本当にありがとうございます!
494デフォルトの名無しさん:2005/09/25(日) 17:32:00
>>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];//ファイル名
です。
495デフォルトの名無しさん:2005/09/25(日) 17:36:34
すみません。
>>494はヘッダを直してませんでした。
496デフォルトの名無しさん:2005/09/25(日) 17:45:55
>>492
申し訳ありません。
ヘッダにあった関数宣言を直したらいけました。
C言語のつもりでやっててこんな大ポカするとは情けない…
497デフォルトの名無しさん:2005/09/25(日) 21:25:34
>>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バイトだろ?
500デフォルトの名無しさん:2005/09/26(月) 01:24:11
>>498 a==0 でいいだろ。
501498:2005/09/26(月) 02:00:13
数字でなく文字のときを知りたいのです
ファイルの中から特定の単語の数えるような事がしたくて
502デフォルトの名無しさん:2005/09/26(月) 02:01:23
だから a==文字 でいいだろ?
503デフォルトの名無しさん:2005/09/26(月) 02:02:56
>>501
こういう事か?
if(isdigit(a)){}

ctype.hをインクルードしとけよ
504デフォルトの名無しさん:2005/09/26(月) 02:09:24
if (strchr("OK",a)) {}
こういうことか?
505デフォルトの名無しさん:2005/09/26(月) 02:14:55
"文字"と"文字の配列"は区別しとけ>501
506デフォルトの名無しさん:2005/09/26(月) 02:16:23
そして"単語"という事から導き出されるものは"文字の配列"
507デフォルトの名無しさん:2005/09/26(月) 02:17:38
C++なら"文字列"というものもあるんだがな >506
508デフォルトの名無しさん:2005/09/26(月) 02:26:59
>>507
文字列というな。std::stringクラスと言え。
509デフォルトの名無しさん:2005/09/26(月) 02:29:32
>>508
std::stringクラスというな。クラステンプレート std::basic_string と言え。
510デフォルトの名無しさん:2005/09/26(月) 02:35:36
>507,>508
それはクラスであって、
生成したオブジェクトじゃねーんじゃねの?
511510:2005/09/26(月) 02:36:37
間違えた >510 は >508,>509 あて
512デフォルトの名無しさん:2005/09/26(月) 02:42:36
>>510 "文字列"ならオブジェクトだというわけでもなかろう。
513デフォルトの名無しさん:2005/09/26(月) 03:01:20
>509
std::basic_string<char>と(ry
514498: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は定義されていない、初めて使われる関数です
とていわれてしまうわけです
515デフォルトの名無しさん:2005/09/26(月) 03:04:27
説明が下手とかそういう以前の問題だと思う
516デフォルトの名無しさん:2005/09/26(月) 03:42:03
>>514
そりゃ文字列リテラルになってないんだから当然だな、クオートしろ
ってかそれでちゃんと読み込めてるのか?
C++流のやり方分からんのならCのやり方でやりゃいいじゃん
517デフォルトの名無しさん:2005/09/26(月) 04:27:33
>>514
cやc++は文字列同士の比較はサポートされていないので関数を使う必要がある
if( 0 == strcmp( a, "ON" ) )
とかね

あと配列について0から勉強し直した方がいいと思う。
518デフォルトの名無しさん:2005/09/26(月) 06:48:44
配列ってchar以外で使うときどんないいことがあるの?
519デフォルトの名無しさん:2005/09/26(月) 06:56:33
何このスレ・・・・・・・?
             /ヽ       /ヽ
            / ヽ      / ヽ
  ______ /U ヽ___/  ヽ
  | ____ /   U    :::::::::::U:\
  | |       // ___   \  ::::::::::::::|
  | |       |  |   |     U :::::::::::::|
  | |      .|U |   |      ::::::U::::|
  | |       | ├―-┤ U.....:::::::::::::::::::/
  | |____ ヽ     .....:::::::::::::::::::::::<
  └___/ ̄ ̄      :::::::::::::::::::::::::|
  |\    |           :::::::::::::::::::::::|
  \ \  \___      ::::::
520デフォルトの名無しさん:2005/09/26(月) 06:58:46
>>518
筆舌には尽くし難いぐらいいいことがあるよ
521デフォルトの名無しさん:2005/09/26(月) 06:59:32
>>514

> char a[3];
ダウト
522デフォルトの名無しさん:2005/09/26(月) 07:23:23
. (ピリオド)じゃなくて , (カンマ)の入ったファイル名かよ
523498:2005/09/26(月) 08:39:13
>>517
ありがとうございます
大変たすかりました
524デフォルトの名無しさん:2005/09/26(月) 09:21:47
514のプログラム見てたら朝から気分が悪くなってきた
525デフォルトの名無しさん:2005/09/26(月) 09:37:29
int cnt = 0;
std::string buf;
std::ifstream inf("f.dat");
while(inf) {
inf >> buf;
if (buf == "ON") cnt++;
}
std::cout << cnt;
…ので作ってみた。
ifstreamの動作よく知らないので手間取ってしまった。
526デフォルトの名無しさん:2005/09/26(月) 17:21:11
C++の標準規格が固まってからもう7年も経つのに、まだストリームの
基本的動作を理解してない奴がいるのか。

やはりC++は初心者にとっては鬼門なのかねえ。
527デフォルトの名無しさん:2005/09/26(月) 17:37:33
脳みそがC++に慣れて無いだけだと思うよ
ソースコードを打ち込んでると、その内シナプスが効率よく働くようになるさ
528デフォルトの名無しさん:2005/09/26(月) 19:06:00
ストリームというか、標準侑出力なんてほとんど使わないしー
みたいな
529デフォルトの名無しさん:2005/09/26(月) 19:15:31
標準侑出力標準侑出力標準侑出力標準侑出力標準侑出力
標準侑出力標準侑出力標準侑出力標準侑出力標準侑出力
標準侑出力標準侑出力標準侑出力標準侑出力標準侑出力

m9(^д^)
530デフォルトの名無しさん:2005/09/26(月) 20:14:27
C++マスター>>526-527に問題です。
>>525のプログラムには幾つか欠陥があります。
それを指摘してください。
531デフォルトの名無しさん:2005/09/27(火) 00:03:34
ひとことで言うと、ソースがキモイ。汚い。見にくい。
532デフォルトの名無しさん:2005/09/27(火) 00:05:24
>>530
俺はマスターではないが、一つだけ。
while (inf) がまずい。
やるんだったら、inf >> buf; の後に if (!inf) break; だな。
533デフォルトの名無しさん:2005/09/27(火) 02:24:42
while(inf >> buf) でいいだろ。
534デフォルトの名無しさん:2005/09/27(火) 10:00:02
ゆうの変換候補が「侑」ってのも不思議な
社名?
535デフォルトの名無しさん:2005/09/27(火) 13:09:50
あるいは人名か・・・。
536デフォルトの名無しさん:2005/09/27(火) 13:17:12
俺のオキニがその名前だったが先月dだ
537デフォルトの名無しさん:2005/09/27(火) 14:10:47
質問です

char *pBuffer;
pBuffer = new char[SIZE];

とSIZE分メモリを確保したとして、
あとでこのサイズがいくつだったか
pBufferから調べることってできますか?

sizeof(pBuffer);
みたいな感じで・・

どなたかよろ m(__)m
538デフォルトの名無しさん:2005/09/27(火) 14:12:13
>>537
その手の質問は散々既出だけど、無理。
どこかにサイズを退避させておきませう。
539デフォルトの名無しさん:2005/09/27(火) 14:15:29
>>538
ご親切にありがとうございます。
退避させちゃいまっす

ども m(__)m
540デフォルトの名無しさん:2005/09/27(火) 15:34:38
質問です

ListViewで
マウスポインタのある部分の
SubItemsのテキストを取得したいのですが
どんなコーディングになるのでしょうか??
541デフォルトの名無しさん:2005/09/27(火) 15:37:50
丸投げマンセー
542540:2005/09/27(火) 15:48:06
追加

http://dobon.net/vb/dotnet/control/lvitemtooltip.html

ここを見て、 改造してるんですが
うまくいきません。
543デフォルトの名無しさん:2005/09/27(火) 15:52:51
VBじゃねぇか
544デフォルトの名無しさん:2005/09/27(火) 15:54:01
C#じゃねぇか
545540:2005/09/27(火) 15:55:03
おっと、失礼しました。
他の板に投げます
546デフォルトの名無しさん:2005/09/27(火) 15:57:42
C#も乗ってたのか、URLだけ見て煽ったから
どのみつスレ違いだが
547デフォルトの名無しさん:2005/09/27(火) 15:58:11
>>540
言語が何だかわからんが、このスレということはC/C++なのか。
マウスの座標が分かっているのなら、SubItemHistTest()を使う。
548デフォルトの名無しさん:2005/09/28(水) 00:18:20
リストボックスの項目をクリックしただけで何らかの動作を行わせる事はできますでしょうか。
つまりはリストボックスの項目をクリックすると、ダイアログプロシージャにメッセージを送れるか
どうかを知りたいのです。

select(msg){
case: ID ←このIDに相当するIDをリストボックスの項目をクリックするだけで得られるかどうか
…(中略)…
}

まぁダメならダイアログにボタンを余分に一個作ってやればいい話なんですけどね…。
549デフォルトの名無しさん:2005/09/28(水) 00:34:18
>>548
spy++
550デフォルトの名無しさん:2005/09/28(水) 00:46:33
>>548
とりあえずWin32APIと仮定して釣られておく

メッセージIDがWM_NOTIFYでコマンドIDはNM_CLICK

http://yokohama.cool.ne.jp/chokuto/urawaza/notify/NM_CLICK.html
551デフォルトの名無しさん:2005/09/28(水) 17:37:48
質問です。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) となると思ったのですが、これはどういうカラクリなのでしょうか。
よろしくお願いします。
552デフォルトの名無しさん:2005/09/28(水) 17:45:20
>>551
CHoge::HOGEHOGE()
は、
int CHoge__HOGEHOGE( CHoge* this )
としてコンパイルされる、と考えればわかるかな?

ちなみに virtual な関数を作ると、vtbl の分だけ大きくなるけど、
構造体にもメンバ関数はつけれるし、派生もできる。
結論としては、struct と class の違いはない。
553551:2005/09/28(水) 17:54:45
>>552
あーそっか、おもいっきり納得です。
また、struct でも派生ができることも全く知りませんでした。
ありがとうございます!
554デフォルトの名無しさん:2005/09/28(水) 18:04:12
とりあえず、#include "stdio.h"が気に入らないとかprintfに書式文字列3つ指定しているのに2つしか値を渡してない事に突っ込んでも良いでしょうか
555デフォルトの名無しさん:2005/09/28(水) 18:20:47
int main(void)
にはつっこまんのか
556551:2005/09/28(水) 18:46:40
即興で書いたからorz
557デフォルトの名無しさん:2005/09/28(水) 19:16:22
はたしてCHoge::HOGEHOGE()には戻り値が必要なのかと突っ込んでも良いでしょうか
558デフォルトの名無しさん:2005/09/28(水) 19:17:59
>>555
それはOKだと思ったが
559デフォルトの名無しさん:2005/09/28(水) 19:19:44
>>557
virtualじゃないしね
560デフォルトの名無しさん:2005/09/28(水) 19:25:20
>>558
iostreamでもなくcstdioでもなくstdio.hダッサー
というのなら、main()でなくわざわざmain(void)ダッサー(C++なのに)
と言っても同じことではあるまいか
561デフォルトの名無しさん:2005/09/28(水) 19:29:01
>>560
そこじゃないような・・・
562デフォルトの名無しさん:2005/09/28(水) 19:49:06
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に変換してオフラインイメージ作っとかないとダメなんじゃないか?
564デフォルトの名無しさん:2005/09/28(水) 20:31:27
>>563
オフラインですか?
確かにDDBやDIBやデバイスコンテキストといったキーワードありましたね。
ちなみにLoadImage→SendMessageは猫プロ349章で見たものです。
565デフォルトの名無しさん:2005/09/28(水) 20:34:22
>562
たぶん>563の言い方だと難しいと思うから、通訳させてもらうと、
ビットマップ>メモリデバイスコンテキスト>デバイスコンテキスト(描画)
じゃないとダメだと思う。理由は知らない。
566デフォルトの名無しさん:2005/09/28(水) 20:39:42
eclipse+CDTの環境で、外部インクルードパスの追加の仕方を教えてください。
ここ3日ぐらい調べているのですが、わからないのです。
567デフォルトの名無しさん:2005/09/28(水) 20:57:26
>564
猫なら26章。
ただし、ID〜とリソースID割り付けると(IDはint型)、LoadBitmapの第2引数はLPCTSTR型、はっちゃき言うとchar*型だから、
""でくくられてないとダメ。(表示されない)
だから、そちらがやってるように、26章のLoadBitmapをLoadImageでやってやると、ディレクトリ直接指定できるし、便利。
どうしてもLoadBitmapを使うなら、リソースファイルを用途:テキストで開いてやって、リソースIDを"BITMAPの名前"にしてやる必要がある。
なんか、猫にいちゃもんつけてしまったみたいだけど、猫は百貨店の様にバリエーション豊富で非常に助かるサイト。
568デフォルトの名無しさん:2005/09/28(水) 20:59:10
>>565
そうですか…
流れとしてはttp://www13.plala.or.jp/kymats/study/MULTIMEDIA/load_ddb.html
のような感じになるのですね。ありがとうございました。
569デフォルトの名無しさん:2005/09/28(水) 21:01:29
>>567様も貴重な情報感謝致します。とりあえず徹夜で頑張ってきます…
570デフォルトの名無しさん:2005/09/28(水) 21:19:00
>>563
DIBにするなら、LoadImageで直接CREATEDIBSECTIONすれば
571デフォルトの名無しさん:2005/09/28(水) 21:19:47
>>567
はっちゃけて言っても違います
572デフォルトの名無しさん:2005/09/29(木) 01:20:24
コンパイルできず

いまさっき、色々サイト見回してきて、ボーランドってサイトのDLして
set path=%path%;c:\borland\bcc55\bin
これしたらコンパイルできました。
でも なんかエラーとか警告とかヒドイ・・・これって単にプログラムが間違ってるってことでしょうか?

read me嫁といわれて読んだのですが、意味がわからなくて・・・orz
どうすればいいでしょうか?
573デフォルトの名無しさん:2005/09/29(木) 01:35:04
>>572
VisualStudio買って来い。
574デフォルトの名無しさん:2005/09/29(木) 01:53:58
>>572
エラーメッセージが出てるなら、コンパイルができたとは言わない。
「なんかエラーとか警告とかヒドイ」言われても、こちらは
どんなエラーが出てるのかわからないので何とも言えない。
どんなソースをコンパイルしたのかもわからないし。
575572:2005/09/29(木) 02:05:32
スマソ・・・できた。
でもプログラムが間違えてる。

100までは\120で
200までは\250で
300以上は\400。
例えば410だったら 100*120*100*250+110*400=
っていうの作りたいんだけど、
なんか自分の作ったやつ
410だったら 410*400= になっちゃっうんだ・・・どうしたものか・・・
576デフォルトの名無しさん:2005/09/29(木) 02:06:34
訂正
>>例えば410だったら 100*120*100*250+210*400=
577デフォルトの名無しさん:2005/09/29(木) 02:22:28
>>575
なにがいいたいのかさっぱりわからない。
578デフォルトの名無しさん:2005/09/29(木) 02:24:06
>>575
???
すまん、言ってる事の意味がわからない。
1)何をするためのプログラムで、
2)中でどういう処理をして、
3)結果として何を表示するのか、
もう少しわかりやすく説明してくれ。
579572:2005/09/29(木) 02:31:13
スマソ・・・たんに計算するプログラムなんだ。

数字を記入
↓計算>>575してくれて
結果、計算後の答え みたいな感じの。

580デフォルトの名無しさん:2005/09/29(木) 02:33:38
>>579
迷惑だからもう来ないでくれ
581デフォルトの名無しさん:2005/09/29(木) 02:43:48
>>579
昨日の面接の時の俺のようだ・・
ちくしょー俺は足りない人じゃねー
ちょとあがり症なだけなんだー
582デフォルトの名無しさん:2005/09/29(木) 02:52:58
>>581
悪いが明らかに足りない人だ
583デフォルトの名無しさん:2005/09/29(木) 02:58:03
>>579
その計算の中身がわからないのだが・・・
計算式をもっと詳しく、他人が見てわかるように書いてくれ。

入力された数値の範囲によって計算式が変わるなら
そのパターンも全部書いてくれ。

>>581
プログラマには(他人との)コミュニケーション能力も必要だぞ
自分が作ったプログラムの仕様を説明できないと複数人での作業なんてできないしな。
584デフォルトの名無しさん:2005/09/29(木) 03:21:28
>>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だって言ってただろ!殺すぞ!しかもなんでそんな複雑なことになっちゃってんだよ!」
って感じ。

585デフォルトの名無しさん:2005/09/29(木) 03:50:31
バカの相手してると疲れるだけだよ
586デフォルトの名無しさん:2005/09/29(木) 04:35:42
>>100までは\120で
>>200までは\250で
>>300以上は\400。
>>例えば410だったら 100*120*100*250+110*400=

この式から解析するに300以上じゃなくて200より上ってことだろ?
x<=100 120
x<=200 250
x>200 400
587デフォルトの名無しさん:2005/09/29(木) 04:42:39
>>586
いや、そういう微妙な問題じゃねーんじゃねーかな。
とか思ってる。
つか、この状況であんまり考えても時間の無駄だから、本人さっさとでてきて説明しろ。
588デフォルトの名無しさん:2005/09/29(木) 04:46:41
>>586
しかも、

>100*120*100*250+110*400

この↑式も本当にこうなのか?って疑問もある。


100*120*100*250じゃなくて100*120+100*250じゃね?とか、
よしんば、そこがプラスだったにせよ。やっぱり、式を組み立てても、俺にはようわからん。
589デフォルトの名無しさん:2005/09/29(木) 04:51:11
>>576の訂正内容もよくわからんな。

> 100までは\120で
> 200までは\250で
> 300以上は\400。
なのに、

> 例えば410だったら 100*120*100*250+210*400=
210はどこから出てきたのかと。
いや、他の部分の計算も意味不明なのだが。
590デフォルトの名無しさん:2005/09/29(木) 04:53:16
ここは質問者の脳内を机上デバッグするスレですか?
591デフォルトの名無しさん:2005/09/29(木) 05:04:49
100個目までは、1個120円
101個目から200個目までは1個250円
201個目からは1個400円

ってことだろ?
592デフォルトの名無しさん:2005/09/29(木) 05:06:52
>>589
あー、そんな訂正レスがあったのか・・・よくみなかったぜw

やっぱそれって
100と100と210で410になるからそれっぽくね?
すると、
100*120 + 100*250 + 210*400
とかしたいんじゃね?
でも、\=円(?)とかあるからなぁ・・・
問題読み間違えてんじゃねーの?こいつ。

てか、色々考えられちまうから、まず、どんな問題を渡されてるのかはっきりしてほしいよね。
593デフォルトの名無しさん:2005/09/29(木) 05:07:23
Cか環境依存なのか判断つかないのでここで質問させてください
フォルダにあるファイル一覧を取得するにはどうすればよいでしょうか?
windowsです
594デフォルトの名無しさん:2005/09/29(木) 05:09:58
>>591
だからぁ・・・
普通、たくさん買うほど1個当たりの値段安くすんだろ?
それだと、こいつ問題読み間違えてるか、問題出した奴がガチで馬鹿かどっちかだろ?
それともビックリマンチョコ大人買い防止措置でも働いてんのか?
595デフォルトの名無しさん:2005/09/29(木) 05:20:25
596デフォルトの名無しさん:2005/09/29(木) 05:20:50
>>593
自分で調べることができない人間は買った方が早い
http://www.amazon.co.jp/exec/obidos/ASIN/4798003107/
ちなみに俺も買った。WIN32APIでできること調べるだけでも面倒臭い。時間の無駄と判断。

今回の問題についていうと
Win32APIにFindFirstFile関数ってのがあるからそれを調べてやってくれい。

C言語でそれができるかどうかは知らない。
俺はやってるサンプルみたことないけど。
597デフォルトの名無しさん:2005/09/29(木) 05:24:48
>>595
>>596
ありがとうございました
598デフォルトの名無しさん:2005/09/29(木) 05:26:15
>>595
おお、被ったw
でも、多分>>593はそれはわかってるのかもわからん。
ただ、C・C++でできるかどうかが聞きたいのかもしれん。
599デフォルトの名無しさん:2005/09/29(木) 05:28:08
C/C++の標準にディレクトリを操作するものはない
600デフォルトの名無しさん:2005/09/29(木) 05:29:28
>>594
いや、もしかしたら、100個までは1個に付き120円引きなのかもしれんw
200個までは1個に付き250円引きになるとかw
601デフォルトの名無しさん:2005/09/29(木) 05:29:53
ディレクトリって概念がもともと環境依存だからな
602デフォルトの名無しさん:2005/09/29(木) 05:33:01
>>575は腹切れ
603デフォルトの名無しさん:2005/09/29(木) 05:51:39
だが一般的なOSは全てディレクトリ構造
Windows然り、MacOS然り、Linux/Unix然り
604デフォルトの名無しさん:2005/09/29(木) 06:36:49
ここは初めてのお使いスレでつか?
605デフォルトの名無しさん:2005/09/29(木) 06:52:14
>>602,604
ワラタw
初めてのお使いで、違う物買ってきちゃった餓鬼に向かって
>>602のセリフを逝ってる図を想像したw
606デフォルトの名無しさん:2005/09/29(木) 07:12:36
>>594
いや、個とか円とかは勝手に>>591が書いただけだから
出題者は値段とか言ってないだろw
607デフォルトの名無しさん:2005/09/29(木) 07:18:32
608デフォルトの名無しさん:2005/09/29(木) 10:38:16
>>603
×一般的な
○現在のパソコンで一般的な

>>594
販売ではなく、モノを預かり(or受け取り)処理する類のサービスでは
一回あたりの量(orサイズ)が増えるほど高くなることがあるからそれジャマイカ。
#廃棄物処理とか
609デフォルトの名無しさん:2005/09/29(木) 11:41:52
各種インクルードファイルを入手するにはどうすればいいのでしょうか?
一通り網羅してるようなサイトありますか?
あと.net 2003でforkを試してみたいのですが、何をインクルードすればいいでしょうか?
610デフォルトの名無しさん:2005/09/29(木) 12:13:09
> 各種インクルードファイル

???

> fork

マルチスレッドなら専用スレがあったはずだお
611デフォルトの名無しさん:2005/09/29(木) 12:25:46
>>610
すいません。
PerlのCPANみたいに、C,C++用のインクルードファイルを一通り網羅してるサイトはありませんか?
612デフォルトの名無しさん:2005/09/29(木) 12:35:22
>>611
STLがまだ欠けてるが、本家にあがってるぞ。
http://www.cplusplus.com/ref/indexr.html

英語だけどさほど難解でもないので結構使えるぜよ。
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に行かないなんてあるのでしょうか?
614デフォルトの名無しさん:2005/09/29(木) 13:04:38
>>613
デバッガで追え。
615デフォルトの名無しさん:2005/09/29(木) 13:29:31
>>611
CのインクルードファイルはPerlのCPANモジュールなんかとは違う
ファイルその物は網羅して意味があるような物じゃない
というか、インクルードファイルだけ持ってきても仕方ない
616デフォルトの名無しさん:2005/09/29(木) 13:38:27
>>613
もっとちゃんとソースを書け
617デフォルトの名無しさん:2005/09/29(木) 14:40:12
>>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";
のようにポインタを上限を考えずに使える配列のように使い、
キーボードからの入力を受け付ける方法はないでしょうか?
619デフォルトの名無しさん:2005/09/29(木) 14:51:09
メモリ領域を無限に使えるなら安全に実現できるかも。

まあ逆にいうと現実的には無理よと言う話だが。


どうでもいいツッコミをさせてもらうと月曜日はMondayだしscanfを使うのはともかく戻り値チェックくらいはしなさい。
620デフォルトの名無しさん:2005/09/29(木) 14:56:34
>>618
制限をしたくないのであれば、fgetc()を使って改行文字が来るまで待つか、
fgets()を使って末尾が改行文字になるまで待つか、どちらかの対策が必要。
制限していいが安全に入力させたいなら、fgets()を使うか、scanf()で文字数制限をすればいい。
621デフォルトの名無しさん:2005/09/29(木) 15:11:26
>>619
>>620
返答ありがとうございました。

やはり、scanfを使って入力を受け付けるためには文字数の制限が必要なんですね^^;
622デフォルトの名無しさん:2005/09/29(木) 15:30:53
>>621
つーか、scanf()で制限しないと黙ってメモリを壊すから。
その場合はgets()と同罪になってしまう。

そもそも目的が分からないから最適解を提示できない。
623デフォルトの名無しさん:2005/09/29(木) 15:31:17
>>621
とゆうかscanfは危ないからやめれ
624デフォルトの名無しさん:2005/09/29(木) 16:16:23
Aと言うクラスと、Aをメンバに持つBと言うクラスがあった場合、
Bから見て、Aを宣言してるヘッダファイルはどこでインクルードするのが普通?

Bのヘッダファイル内なのか、Bのコード本体のファイルなのか・・・
625デフォルトの名無しさん:2005/09/29(木) 16:24:05
>>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: 構文エラー : ';' が ']' の前に必要です。
とかでるんだけどなんでですかねー?
627デフォルトの名無しさん:2005/09/29(木) 16:45:45
>>626
マクロ展開されると
char buf[128;];

どこがおかしいか分かるよな?
628624:2005/09/29(木) 16:47:24
>>625
サンクス。

>>626
defineのとこにセミコロンがあるから
629デフォルトの名無しさん:2005/09/29(木) 16:50:39
>>627
>>628
おはずかしいかぎりです
630デフォルトの名無しさん:2005/09/29(木) 16:50:40
a
631デフォルトの名無しさん:2005/09/29(木) 17:30:14
winアプリなのですが、エディットの背景色ってどうかえればいいんですか。
632デフォルトの名無しさん:2005/09/29(木) 17:35:01
>>631
初心者には無理です。そうでないなら自分で探してください。
#つーか、説明すんの面倒なんだよ。
633デフォルトの名無しさん:2005/09/29(木) 17:35:10
634デフォルトの名無しさん:2005/09/29(木) 18:18:13
char *str = "がちんこ";
この文字列から'が'の文字を削除し
'ん'と'こ'の間に'ぽ'を加えたいのですが、文字列の書き加えと削除の方法が分かりません。
教えてください。おながいします。
635デフォルトの名無しさん:2005/09/29(木) 18:27:27
>>634
char buf[10];
sprintf(buf, "%.4s%s%s", str + 2, "ぽ", str + 6);

sprintf()の応用はこの辺も参考に。
http://pc8.2ch.net/test/read.cgi/tech/1126357741/458

もっと単純にやりたければC++でstd::stringでも使うしか。
636デフォルトの名無しさん:2005/09/29(木) 18:28:55
>>634
リテラルは書き換え不能
637デフォルトの名無しさん:2005/09/29(木) 18:34:57
アセンブラ使えばできるんじゃない?やったこと無いけど
638デフォルトの名無しさん:2005/09/29(木) 18:37:53
正直もうちょっと他に適当な文字列は無かったのかと問い詰めたい
639デフォルトの名無しさん:2005/09/29(木) 18:41:46
キャスト
640634:2005/09/29(木) 19:01:35
>>635-
THX!
641デフォルトの名無しさん:2005/09/29(木) 21:02:54
>>637
できるできないの問題じゃない
やってはいけない
642デフォルトの名無しさん:2005/09/29(木) 21:06:58
>>641
それはこのスレの範囲から外れているからそうとは言い切れない。
643デフォルトの名無しさん:2005/09/29(木) 21:09:29
>>642
このスレの範囲ってなんだ?
644デフォルトの名無しさん:2005/09/29(木) 21:17:24
>>643
少なくともアセンブラはこのスレの範囲外だと俺は思う。
645デフォルトの名無しさん:2005/09/29(木) 21:23:00
>>644
馬鹿?
646デフォルトの名無しさん:2005/09/29(木) 22:08:51
C言語とかってインラインアセンブラとかそんなのがあるんじゃなかったっけ?
俺は名前すらうろ覚えだけど。
647デフォルトの名無しさん:2005/09/29(木) 22:57:43
dos.hやらunion regsやら昔やったことあったなあ
648デフォルトの名無しさん:2005/09/29(木) 23:00:56
Lattice-C?
649デフォルトの名無しさん:2005/09/30(金) 00:19:46
>>642
出来る出来ないは環境依存だが、
文字列リテラルの書き換えを行うべきではない、
と言うのはC/C++として正しいだろ。
650デフォルトの名無しさん:2005/09/30(金) 06:15:18
凄く馬鹿な質問ですいません。
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になってしまうからですか?
651デフォルトの名無しさん:2005/09/30(金) 06:27:14
>>634はリテラルなのか?
652デフォルトの名無しさん:2005/09/30(金) 07:33:18
>>651
strはリテラルをポイントしている。

>>650
藻前は頓珍漢を山盛りしている。
653デフォルトの名無しさん:2005/09/30(金) 07:37:03
>>650
だから、人に聞く前に本を一冊くらい読めと・・・
こんなの初心者以前の問題。
654デフォルトの名無しさん:2005/09/30(金) 08:37:04
Constとかしなくてもリテラルなのか
勉強になるな
655デフォルトの名無しさん:2005/09/30(金) 09:06:51
>>650
aにbを代入すればaがbと同じ値になるのは当然
代入演算子の評価値は代入された値が返ってくる
aとbが等しいか確認したいならa==bとする事
656デフォルトの名無しさん:2005/09/30(金) 10:22:06
>>654
str の型と文字列リテラルの定義に相関関係自体ないが?

# str の指している先がたまたま文字列リテラルであって、
# 文字列リテラル自体の型は、指される元とは関係ないよ。
657デフォルトの名無しさん:2005/09/30(金) 10:33:21
K&R C P47より引用

(前略)
一方、文字列定数すなわち文字列リテラルは
"I am a string"
あるいは
"" /* 空の文字列 */
のように、2重引用符で囲まれた0個以上の文字の列である。
(後略)
658デフォルトの名無しさん:2005/09/30(金) 11:59:44
>>650
if (a = b) {ってのんはこう書くのと同じ。
a = b;
if (a) {
で、if (a)はif (a != 0)と同じ。
659デフォルトの名無しさん:2005/09/30(金) 13:56:53
文字列リテラル書き換えの話でアセンブラとか持ち出してる馬鹿はどこのどいつですか?
リテラルを書き換えるのがまずいのは、

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はあるのでしょうか・・・?
661デフォルトの名無しさん:2005/09/30(金) 18:15:55
「C++を始めるのにVisualC++ toolkitとcoreSDKが必要な」ことなどありませんのでお引取りください
662デフォルトの名無しさん:2005/09/30(金) 18:40:12
>>660

>C++を始めるのにVisualc++ toolkitとcoreSDKが必要と書いてあります。
C++のプログラムを作りたいなら、コンパイラだけあれば十分です。
Windowsアプリを作るなら、SDKが必要です。

>一体どこにcoreSDKはあるのでしょうか・・・?
Platform SDKの中に入ってます。
663デフォルトの名無しさん:2005/09/30(金) 18:59:20
>>662
ありがとうございました、早速DLしてみます。
664デフォルトの名無しさん:2005/09/30(金) 19:08:03
型変換演算子のオーバーロードについて質問です。
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型への型変換演算子をオーバーロード出来たらいいのかなと思ったんですが、
やり方がわからないです。何かいい方法はありますでしょうか?
665デフォルトの名無しさん:2005/09/30(金) 20:06:51
>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;
}
666デフォルトの名無しさん:2005/09/30(金) 20:08:07
つObject& operator (const int i){val = i; return *this;}
667666:2005/09/30(金) 20:09:45
つObject& operator ()(const int i){val = i; return *this;}
668デフォルトの名無しさん:2005/09/30(金) 20:21:49
>>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++では後者の配列は定義できませんか?
670664:2005/09/30(金) 22:13:00
>>665
今試してみたらこちらでも無事動いてしましました(汗
さっきまでのは何だったのか…、なにか勘違いしていたようです、本当にすいませんorz
環境は、VisualC++ 6.0
Win32 Console Application です。
わざわざ試して下さって有難う御座いました。

static_cast<Object>(i)でエラーにならないのは
一時オブジェクトのコンストラクタにiの値が渡されるんですかね、
この辺理解が足りませんでした。申し訳ないです。

>>668
それは知りませんでした、レスどうもです。
671デフォルトの名無しさん:2005/10/01(土) 14:40:17
>2次元配列には、x[i, j]とx[i][j]のタイプがあります
違います。後者のは配列の配列です。
つまり x[i]を X とかに置き換えて X[j] と考えればよろしいかと。
672デフォルトの名無しさん:2005/10/01(土) 14:44:49
2次元配列=配列の配列です
673デフォルトの名無しさん:2005/10/01(土) 14:50:47
2次元配列は x[i, j] のタイプです
674デフォルトの名無しさん:2005/10/01(土) 15:37:05
C++にx[i, j]なんて文法ないぞ
675デフォルトの名無しさん:2005/10/01(土) 15:45:48
private:
float cellValue(int row, int col) { }

public:
__property float Cells[int row][int col] = { read=cellValue };
676デフォルトの名無しさん:2005/10/01(土) 16:17:02
なんだその__property
677デフォルトの名無しさん:2005/10/01(土) 16:41:06
>>675
そりゃC++Builderだ
678デフォルトの名無しさん:2005/10/01(土) 17:01:58
>>671,673
それなんてVB?
679デフォルトの名無しさん:2005/10/01(土) 17:28:19
680デフォルトの名無しさん:2005/10/01(土) 18:18:08
>>669
できないという仕様だ。
http://support.microsoft.com/?scid=kb;ja;814058
681デフォルトの名無しさん:2005/10/01(土) 19:27:09
>>674
managed C++ の文字が目に入らんのか
それから、標準でも x[i, j] は宣言以外のコンテキストでは有効だから、文法がないというのは言いすぎ。
682デフォルトの名無しさん:2005/10/01(土) 19:50:15
>>681
横からすまんが、
何?そのmanaged C++って環境依存ならスレチガイじゃね?
683デフォルトの名無しさん:2005/10/01(土) 19:51:52
>>682
スレタイを100回暗唱しておいでなさい
684デフォルトの名無しさん:2005/10/01(土) 19:59:09
>>683
じゃあ、visual C++=MFCもOKなのかと・・・
暗黙的には駄目だろう。
俺はmanaged C++がその仲間だと思ったんだけど。
そもそもどういうもんか知らんのよ。
685デフォルトの名無しさん:2005/10/01(土) 20:00:39
>100回暗唱

それから100回書けw
686デフォルトの名無しさん:2005/10/01(土) 20:04:19
>>684
MFCはC++と言うより、Win32APIに近いんじゃね?
テンプレ見た限りOKな気がするけど。
687デフォルトの名無しさん:2005/10/01(土) 20:07:56
>>684
勝手にVC++=MFCにすんなよw
688デフォルトの名無しさん:2005/10/01(土) 20:29:47
見た目や名前が似ててもmanaged C++は別言語だからスレ違いだと思うけどな。
その辺はっきりさせないと初心者も混乱しそうだし。
689デフォルトの名無しさん:2005/10/01(土) 20:32:21
690デフォルトの名無しさん:2005/10/01(土) 21:03:49
C# も同じだろ、って言われてもなーってことだね
691デフォルトの名無しさん:2005/10/01(土) 23:35:45
>>690
おいおい、さすがにどんな馬鹿でもまmanagedC++==C#なんて考える奴はいないだろ
JavaとC+が同じだと言ってるに等しいぞ
692デフォルトの名無しさん:2005/10/01(土) 23:50:02
managed C++とC#を混同してる奴を約一名知ってる。
693デフォルトの名無しさん:2005/10/01(土) 23:54:49
俺は>690はC/C++と比べて〜だと思ってたが、違ったみたいだね
694デフォルトの名無しさん:2005/10/02(日) 00:00:27
CとC++は知ってるが、C+は初耳だ
695デフォルトの名無しさん:2005/10/02(日) 00:18:22
C+とかC+-とかC--とかC@とかあるよ
696デフォルトの名無しさん:2005/10/02(日) 00:22:00
C?
697デフォルトの名無しさん:2005/10/02(日) 10:14:49
ポーカーのプログラムを作りたくて
以下のように役の名前を宣言するとクラスメンバーが初期化できないといわれます。
どういうことなんですか?
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",
  };
    :
    :
698デフォルトの名無しさん:2005/10/02(日) 10:26:10
>>697
そういうことはコンストラクタ初期化子でやらないといけない。
しかしコンストラクタ初期化子では配列は初期化できないという罠。

尤もそのpairNameは静的メンバで平気だと思う。
class Poker {
private:
    static const char *pairName[];
};
//どこかのcppファイル
const char *Pokar::pairName[] = {
    "No Pairs",
    "One Pair",
    "Two Pairs",
    (残りは省略)
};
699デフォルトの名無しさん:2005/10/02(日) 12:41:18
>>697
そもそも、単純に文字列(へのポインタ)の配列だけクラス内に用意しても仕方ないのでは?
常識的に考えれば役のEnum値か何かを引き数にして役の文字列を返す関数を実装して、
その関数内にその文字列テーブルを持てばいいと思うのだが。
700デフォルトの名無しさん:2005/10/02(日) 13:31:34
>>699
なるほど。
Pokerクラスはもちろん他に関数とかありますよ
701デフォルトの名無しさん:2005/10/02(日) 13:38:50
>>700
いやだから、Pokerというクラスの、全てのメンバがその文字列を必要とするわけでもないだろ?
「ポーカー」というゲームを考えても、その役名なんてぇのはI/Fにしか過ぎないわけだし。
702デフォルトの名無しさん:2005/10/02(日) 17:30:11
C++のクラスのコンストラクタについて質問っす
class tekitou
{
private:
     int n_tekitou;

public:
     tekitou(int n)
     {
          n_tekitou = n;
     }
};
みたいなクラスがあって

tekitou* pTekitou = new tekitou[100];

こんな風にメモリ確保したときにコンストラクタtekitou(int n)
を呼び出したいんですけどどうすればいいんでしょうか。

コンストラクタで値を一気に全部入れたいんですけどできないんですかね?
703デフォルトの名無しさん:2005/10/02(日) 17:46:37
>>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使ってます。
705デフォルトの名無しさん:2005/10/03(月) 01:04:34
例外、って要素追加でメモリ不足した時とかに発生するんじゃないのけ?
706デフォルトの名無しさん:2005/10/03(月) 01:28:18
これ、規格的にはどうなるんかね?
707デフォルトの名無しさん:2005/10/03(月) 01:56:10
§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としないと。
708デフォルトの名無しさん:2005/10/03(月) 08:55:43
>>704
15.4.12
"An exception-specification is not considered part of a function's type."
709デフォルトの名無しさん:2005/10/03(月) 08:56:30
>>704>>707
JIS X3014:2003には代入・初期化する元の例外指定より代入・初期化する先の例外指定の制限が緩ければよいと書いてあるよ。
710708:2005/10/03(月) 09:09:21
711デフォルトの名無しさん:2005/10/03(月) 13:40:23
>>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です。おながいします。
713デフォルトの名無しさん:2005/10/03(月) 18:28:59
>>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しても私の作りたいものが作れなさそうです。
もうちょっと考えてみます。
716デフォルトの名無しさん:2005/10/03(月) 18:40:27
          | \
          |3`) ダレモイナイ・・LoveLove! ChuっChuっスルナラ イマノウチ
          |⊂
          |


            ♪  Å
          ♪   / \   LoveLove! ChuっChuっ!
             ヽ川´3`)ノ   LaLaLa ChuっChuっ!
                (  へ)    ぎゅっとしてね 早く〜
                 く      



          ♪    Å
            ♪ / \   地球中で 貴方が一番
             ヽ川´3`) ノ   大好きなの!
                (へ  )     愛しちゃってるの!
                    >    
717デフォルトの名無しさん:2005/10/03(月) 18:42:07
>>714>>715
BCC Developerが作り出すmakefileを晒してみろ。
718712:2005/10/03(月) 18:50:32
メイクファイルって何でつか…
.mak?
デバッグとリリースのとこに一つずつあるお(´ρ`)
PCの中身漏れません?

最高にド低脳な発言してください in ム板(VII)いってきまつ…
719712:2005/10/03(月) 18:59:36
すみません。同じプロジェクトにcとcpp入れてたのですがcpp消したら直りました。

int i; 2回やったら怒られます(´・ω・`)
720デフォルトの名無しさん:2005/10/03(月) 19:05:34
そりゃ同じ名前の変数二個作っちゃダメでしょ
721712:2005/10/03(月) 19:09:17
初心者を露呈してしまいました…
もうちょっといじってみます。
ありがとうございました
722デフォルトの名無しさん:2005/10/03(月) 19:12:21
scanfだけで数字を取得しようとするのはあんまりおすすめできないけど
最低限scanfの戻り値はチェックしてな
723デフォルトの名無しさん:2005/10/03(月) 19:14:19
ここから怒涛のscanf叩きが始まります
↓はいどうぞ
724デフォルトの名無しさん:2005/10/03(月) 19:15:47
PCの中身漏れるって・・・・・・何言ってるの?
>>714でメイクファイル関連のエラーが出ているから言っているんだが。
晒すのが嫌なら残念ながらここまでだな。
725デフォルトの名無しさん:2005/10/03(月) 19:26:21
>>716
照れるじゃないかこんなところで
726デフォルトの名無しさん:2005/10/03(月) 19:38:24
scanf_sを使えばいいんだよ
727デフォルトの名無しさん:2005/10/03(月) 20:25:55
WinでC++なGUIなアプリを無償IDEで開発するには何を使うのが良いですか?
Eclipse+CDTでVEは不可能なんですよね?
DelphiとVisualAge4Jしか知らないので1から勉強になるのは覚悟しています。
728デフォルトの名無しさん:2005/10/03(月) 20:35:23
>>727
VisualStudio 2005 Beta 2
Borland C++ Builder Personal
729デフォルトの名無しさん:2005/10/03(月) 21:24:56
>>728
BCB perは有償
730デフォルトの名無しさん:2005/10/03(月) 22:12:42
>>729
スマソ、Delphiと混同してたよ(´・ω・`)
731デフォルトの名無しさん:2005/10/04(火) 00:14:29
>>727
よくわからん、Eclipse+VEで作れば良いじゃん
それ以前にJDKだけで作れるじゃん
732syosinsya: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;
733syosinsya: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]++;
}
}
}
}
}
}
734syosinsya: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]++;
}
}
}
}
}
}
735syosinsya:2005/10/04(火) 03:11:26
こんな感じで第一象限でy=xの上と下第2象限でy=-xの上と下でそれぞれ軸に近い方から角度を測ってます。
これを第4象限までやります。
Vote[0],Vote[1]はチェックのために書き直していたものを投稿前に直すのを忘れていました。
それぞれVote[t],Vote[t2]と読み直してください。
文章がつたなくて申し訳ないですが、どなたかソースの誤りをご指摘いただけると幸いです。
それではよろしくお願いします。
736デフォルトの名無しさん:2005/10/04(火) 07:19:07
前後のポインタを中に持つリストの構造体?で、
typedef struct {
 LPDATA next; LPDATA last;
} DATA, *LPDATA;
の様に自己の名前で宣言する手段はありますでしょうか。
737デフォルトの名無しさん:2005/10/04(火) 07:30:14
>>736
typedef struct tagDATA {
  struct tagDATA *next, last;
} DATA, *LPDATA;
738737:2005/10/04(火) 07:31:22
スマソ ミスorz

typedef struct tagDATA {
  struct tagDATA *next, *last;
} DATA, *LPDATA;
739デフォルトの名無しさん:2005/10/04(火) 07:34:00
>>738
有り難うございます。
740デフォルトの名無しさん:2005/10/04(火) 07:44:44
試してみた所、lpData=lpData->next; でも明確にキャストしないと警告が出ました・・・
741デフォルトの名無しさん:2005/10/04(火) 08:33:20
>>740
その警告のメッセージを書け。
742デフォルトの名無しさん:2005/10/04(火) 09:48:07
タブで区切られた数値表のテキストファイルを2次元配列に読み込むクラスかなにかありませんか?
743デフォルトの名無しさん:2005/10/04(火) 10:21:49
>>742
そのくらい自分で書けと
744デフォルトの名無しさん:2005/10/04(火) 11:08:54
>>737
タグ名だけ名前かえるのやめてくれ。
745デフォルトの名無しさん:2005/10/04(火) 11:09:18
なんで?
746デフォルトの名無しさん:2005/10/04(火) 11:23:21
>>745
struct DATA;
の宣言でヘッダの依存関係作らずにポインタを扱う方法が使えない。
逆に聞くが、なんでタグ名だけ別にするの?何がいいことある?
747デフォルトの名無しさん:2005/10/04(火) 11:34:36
「タグ名」だからtag付けてるだけの話じゃろ
748デフォルトの名無しさん:2005/10/04(火) 12:11:02
ISO/IECやMSDNでそういう書式になってるっていうだけの慣例
749727: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);
}
751デフォルトの名無しさん:2005/10/04(火) 14:55:47
全突っ込みだな。

他の人に任せた。
752デフォルトの名無しさん:2005/10/04(火) 15:00:19
漏れこれでも本気なんだおヽ(`Д´ )ノ ウワアアン!!
753デフォルトの名無しさん:2005/10/04(火) 15:03:12
ここは初心者は歓迎だが、初心者以下はお引取りください。
754デフォルトの名無しさん:2005/10/04(火) 15:07:53
>>750
全部ダメ
最初から考え直せ
755デフォルトの名無しさん:2005/10/04(火) 15:10:30
また最初からでつか…
ヒントをもらえませんか?
756デフォルトの名無しさん:2005/10/04(火) 15:12:02
ユーザ関数についてお勉強して来い
757750:2005/10/04(火) 15:17:06
void main(void)
{
int i;

srand((unsigned)time(NULL));

printf("%dです。\n%dでした。\n",rand() %10, rand() %10);
}

こんぱくとにしてみた
できたみたい
758デフォルトの名無しさん:2005/10/04(火) 15:17:55
>>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
いろいろ調べてみたのですが、解りません。教えていただけませんでしょうか!

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/952.txt
よろしくお願いします。
760デフォルトの名無しさん:2005/10/04(火) 15:37:18
>>759
突込みどころ満載なので、一から勉強しなおしてください。
761デフォルトの名無しさん:2005/10/04(火) 15:44:22
教えてください!
762デフォルトの名無しさん:2005/10/04(火) 15:53:03
100迄下がったら一から全部突っ込んでやる。
763750: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のところがよく分かりません。
764デフォルトの名無しさん:2005/10/04(火) 16:31:18
宿題か何かなのだろうか・・・
765デフォルトの名無しさん:2005/10/04(火) 16:32:46
>>763
悪いが何がしたいのかさーっぱりわからん
766デフォルトの名無しさん:2005/10/04(火) 16:36:43
>>763
とりあえず、お前が書こうとしてるものをフローチャートなりに書き直してみろ
767デフォルトの名無しさん:2005/10/04(火) 16:37:23
>>763
それを考える前に
750が何故ダメで
757が何故出来たのかを
ちゃんと理解しておいたほうがいいぞ。
768デフォルトの名無しさん:2005/10/04(火) 16:38:22
>>763
環境によるし、別にエラーにはならんが、
一般に広く使われてる、UnixだとかWinだとかのOSでは、
mainの戻り値はvoidじゃなくてint
769デフォルトの名無しさん:2005/10/04(火) 16:40:08
>>763
ついでに言うとCの仕様でもintか
770デフォルトの名無しさん:2005/10/04(火) 16:47:00
>>763
0から勉強し直した方がいいよ
771デフォルトの名無しさん:2005/10/04(火) 17:14:07
ttp://49uper.com:8080/html/img-s/85836.jpg
こんな風にバイナリエディタで開くと0000900100と
アドレスに表示される様にしたいのですが、
16進法で保存すればいいのでしょうか?
wsprintf(buf , "%x" , 0x009001);
の様にbufを出力したのですが、うまくいきません。
どうすればいいのか教えてください。お願いします。
772デフォルトの名無しさん:2005/10/04(火) 17:16:51
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
 な、なんか狐につつまれたような   |
 気がする・・・。             .|
_____  _________/
        V
            ∧_∧
            /    ヽ
            | `  ´|
      <>○<>\= o/
      // ヽ\⊂ ̄ , ヽ
      / ∧_∧ヽ  ̄   ヽ
     /,( ;´∀`)ヽ ,ゝ  |___, ヘ
     | ヽ\`yノ )(   |   <   |
     ヽ ___ノ_と_ノ\_<_ノ
773デフォルトの名無しさん:2005/10/04(火) 17:22:13
>>771
まず

 「バイナリエディタとは何か?」

から、勉強し直した方がいいぞ。
774デフォルトの名無しさん:2005/10/04(火) 17:22:13
>>771
printf系じゃなくてfwriteを使え。
つか、その前にテキストとバイナリの違いを理解しる!
775デフォルトの名無しさん:2005/10/04(火) 17:23:05
>>771
バイナリエディタがあるなら、バイナリエディタ使えばいいだろ。
776デフォルトの名無しさん:2005/10/04(火) 17:28:00
123abc
とだけ書いたtxtをバイナリエディタで開いてみればわかる
777771:2005/10/04(火) 17:28:53
>>773-775
スイマセソ。ありがとうございまつ。
理解不足でした
778750:2005/10/04(火) 17:44:52
>>764宿題ではないです。
>>765簡単なゲームを作りたいです。
>>766あとでします…
>>767引数の数ちがた、for文いらなかた
>>768>>769ラジャーです
>>770作りながら勉強
779750: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;
}
780750:2005/10/04(火) 17:48:07
誰かサンプルきぼん…
781デフォルトの名無しさん:2005/10/04(火) 17:50:37
あとでします…
あとでします…
あとでします…

フローチャート書いてから作れば、
>for文いらなかた
こんなことはおきない。
先に書け。

頭の中でまとまっていない物が、プログラムに起こせる訳が無かろう。
782デフォルトの名無しさん:2005/10/04(火) 18:04:57
>779
せめてコンパイルできるコードを書いて、それをコピペしろ。
(intとiをタブで区切ってるのかも知れんけど・・・・・・)
783デフォルトの名無しさん:2005/10/04(火) 18:06:49
つか、C/C++の勉強どころか、まともな事は何もできない/やる気無い、
のが明白なので、以降スルーするがよし。
784デフォルトの名無しさん:2005/10/04(火) 18:18:42
基底クラスのメンバ関数の引数に、派生クラスのポインタ型を取りたいんですが、予想通りコンパイルが通りません。
やっぱ無理ですか?
785デフォルトの名無しさん:2005/10/04(火) 18:22:35
>>784
前方宣言
786デフォルトの名無しさん:2005/10/04(火) 18:23:08
>>784
そんな作りありえん
787デフォルトの名無しさん:2005/10/04(火) 18:23:10
>>784
コンパイルは通るように出来るが基本的に設計ミス
788デフォルトの名無しさん:2005/10/04(火) 18:35:37
>>785
おお、さんくすできました。
そんなのがあったのか

はい、設計ミスです。うう
789デフォルトの名無しさん:2005/10/04(火) 18:42:01
バグの元だから辞めておけ
790デフォルトの名無しさん:2005/10/04(火) 18:44:50
>>784
派生先の仮想関数で処理すべき事をやらせてるんじゃないの
791デフォルトの名無しさん:2005/10/04(火) 18:46:22
wofstream::openの第一引数の型ってなんでconst char*なんですか?
wofstreamはUNICODE用なんだから引数の型はcanst wchar_t*がいいような気がするのですが…。
納得いきません。
792デフォルトの名無しさん:2005/10/04(火) 19:06:25
ファイルの中身がUNICODEでもターゲットのOSでUNICODEのパスが使えるかは別問題。
793デフォルトの名無しさん:2005/10/04(火) 20:49:09
テンプレート引数が(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でないとき、コンパイル時にエラーを発生させる事が可能でしたらそれも知りたいです。
794デフォルトの名無しさん:2005/10/04(火) 20:55:16
plain old dataのことならboost::type_traitsでも使っとけ
次の改訂で標準入りも確定している
795デフォルトの名無しさん:2005/10/04(火) 20:56:55
>>792
そう言うわけでしたか。
なるほど。考えが足りなかった見たいです。
ありがとうございました。
796732:2005/10/04(火) 21:03:37
放置プレイ?
797デフォルトの名無しさん:2005/10/04(火) 21:14:35
>>796
だってそんなのデバッカで勝手にやりゃいいじゃん。
それで駄目ならそのソース内だけのバグじゃない可能性の方が大きい。
そういう手間まで考えるとそんなの自分でやれやタコ。馬鹿。ウンコ。
お前みたいな馬鹿に付き合ってるほどみんな暇じゃねーんだよ。
798デフォルトの名無しさん:2005/10/04(火) 21:45:50
>>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]);
}
800デフォルトの名無しさん:2005/10/04(火) 22:05:27
>>799
mainを呼ぶ前にCRTが作業した痕跡
801799:2005/10/04(火) 22:10:19
ありがとうございます。
一つだけ・・
CRTって Cランタイムライブラリ で合ってますか?
802デフォルトの名無しさん:2005/10/04(火) 22:11:19
C RunTimeだと思う
803デフォルトの名無しさん:2005/10/04(火) 22:14:07
C実行時図書館
804799:2005/10/04(火) 22:15:10
>>800
>>802
>>803
ありがとうございました。
805デフォルトの名無しさん:2005/10/04(火) 22:15:46
それだったら図書館というより書庫のほうがしっくりくる。
806803:2005/10/04(火) 22:16:31
>>804
俺に礼は要らねーよw
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];

 どなたか、もっと良い手段についておしえていただけませんでしょうか?
808デフォルトの名無しさん:2005/10/04(火) 23:26:37
>>807
10M単位でデータを読んだ後、その中から改行を探して分割して、
結局は行単位で読むんでしょ?
それって、fgetsで先頭から1行ずつ読んでいくのと比べて本当に早いの?
809デフォルトの名無しさん:2005/10/04(火) 23:30:09
速度に関しては関数、APIのオーバーヘッドだけと考えるべきだと思うぞ。
ディスクキャッシュ効くだろうし。

もしやるならifstreamだと現在位置をtellg、現在位置から10MBのところまでseekg、
そこからgetlineで行末まで読んでtellg、前の位置に戻ってread。
seekgの後とかストリームの状態を忘れずに確認すること。
まあこんなんで1行1行やるのとどのくらい変わるかは知ったこっちゃないがな。
810デフォルトの名無しさん:2005/10/04(火) 23:38:58
無駄な努力に、一票
fgets()大推奨

気になるんならsetvbuf()でIOバッファのサイズ増やしてみ。
ほとんど効果は無いと思うけどね。
811デフォルトの名無しさん:2005/10/04(火) 23:39:36
>>807
下手な考え休むに似たり。
fgets()版で速度を測った? そしてそれは、単純にファイルコピーするのに較べて充分遅かった?
恐らく小手先の工夫をする甲斐はないと思うよ。
812750:2005/10/04(火) 23:59:03
できました!採点してくれませんか?するまでもないですか。やる気なしとか言うのかお
みんなありがとうございました
813750: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);

814750: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++;}}

スレ汚しごめんでした
815デフォルトの名無しさん:2005/10/05(水) 00:11:20
>>814
細かい突っ込みは省略して二点ほど。
・乱数系列の初期化はループ内で行なってはいけない。
・条件判定は、「あたり」を列挙してそれ以外を「はずれ」とするのが妥当。
816デフォルトの名無しさん:2005/10/05(水) 00:15:29
>>813
>while(i < 5)
何これ?
817807:2005/10/05(水) 00:20:48
>>808-811
orz そ、そーか、無駄な努力だったか……精進します。
818750: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回繰り返してみた
819デフォルトの名無しさん:2005/10/05(水) 00:29:05
>818
素直にforで回せよ
820デフォルトの名無しさん:2005/10/05(水) 00:30:44
>>818
だから0から勉強し直せって言ってんだろ
i の初期値はどーしたよ
821750: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");

どうでしょう
822デフォルトの名無しさん:2005/10/05(水) 00:32:40
a==bのときは[入力が違います]になるが良いのか?
823750:2005/10/05(水) 00:43:43
>>820
0からやってるじゃないですか
>>822
それはまだ考えてない
1〜9なのに0出るのも直してない
824デフォルトの名無しさん:2005/10/05(水) 00:49:16
>>823
>0からやってるじゃないですか
iに0入れてる部分はどこ?
825750: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;
}
826デフォルトの名無しさん:2005/10/05(水) 00:51:43
>823
>0からやってるじゃないですか
いつやったんだよ。
>1〜9なのに
10で割った余りだから0〜9なのは当たり前


もうほんと出直してきてくれ頼むから
827デフォルトの名無しさん:2005/10/05(水) 00:52:38
いいかげんウザイから、死ぬか黙るか消えるかどれか選択して
828デフォルトの名無しさん:2005/10/05(水) 00:58:33
おまいらが甘やかすから・・・あからさまな教えてクンはスルー汁
829デフォルトの名無しさん:2005/10/05(水) 00:58:43
>>826
今みんなをウザがらせながらも変なプログラム作って勉強中
作らないと身につかないと思ったんです
勉強したところでどうせ動かしてみたらつまる。
出直します…
>>827
黙ります。すんません
830デフォルトの名無しさん:2005/10/05(水) 01:13:11
多分君の言う勉強と、他の人が言う勉強に差があるんだろうね。
831デフォルトの名無しさん:2005/10/05(水) 01:55:16
まず、関数の使い方にアルゴリズムの組み方だな
832デフォルトの名無しさん:2005/10/05(水) 01:59:35
人の書いたソースをたくさん読まないと駄目な時期だと思うな。
もちろんその間も自分で組む練習を怠っては駄目だけど。
833デフォルトの名無しさん:2005/10/05(水) 02:10:15
いやいやいやいやいやいや
このレベルじゃ人様のソースなんて読めない読めない
834デフォルトの名無しさん:2005/10/05(水) 02:28:56
>>833
いや、C言語入門やアルゴリズム入門とかの
コードをたくさん丸写しして実行結果をみるってのを繰り返す
ってこと。
835デフォルトの名無しさん:2005/10/05(水) 04:29:14
836732:2005/10/05(水) 07:14:18
797
798
どうもでした。
誤差のチェックやります。
837807:2005/10/05(水) 09:42:27
CFile→CStdioFileに書き換えてReadString()するようにしてみました。
ほぼ同条件での計測で、807に書いたやり方では190秒、書き直した方では230秒…

前の方が早いようです。
CStdioFileだから遅いのでしょうか?
838デフォルトの名無しさん:2005/10/05(水) 09:56:29
>>837
てゆうかー。
それって処理速度云々が本当に問題なの?
時間がかかるのはもうどうしようもないんでしょ?
200秒かかる処理を100秒に縮められたらそれでOKな問題なの?
839デフォルトの名無しさん:2005/10/05(水) 10:06:14
>>837
まず、fgets()で一行毎に処理するプログラムを作れ。
そして、そのプログラムのプロファイルを取って、
全体の実行時間から、本当に遅いのか検討汁。

高速化は、プロファイルの結果からボトルネックとなっている箇所を割り出し、
その部分について、どうすれば高速化されるのか?を考えるのが普通だ。
840デフォルトの名無しさん:2005/10/05(水) 10:44:25
もしかしたら、デバッグビルドのままって落ちでは?
841デフォルトの名無しさん:2005/10/05(水) 14:14:24
>>837
通常は839の言うとおり、プロファイルしてボトルネックを見つけてから最適化しないと
意味がない。推測でやるのは往々にしてムダになる。

とりあえずためしにDBにinsertしているところをコメントアウトして実行してみては?
190秒が10秒ぐらいになったりして。だとするとファイルアクセスを改善しても意味ナシ

あえて改善するのであれば、File Mappingでメモリに貼り付けて扱うとか。
それでも有意な差がでるとは思いませんが。
842デフォルトの名無しさん:2005/10/05(水) 18:11:12
>>837
つか、自分で客観的な計測や比較、加えて実装コードの評価ができないんじゃ
現時点で高速化はあきらめてきちんと作ることを優先したら? >>841にまとめて
ある程度の見識がなければ…
(807の方法がベストとも速いとも思わないが(メモリ喰っていいならmmap?)、
ごく簡単になら最後の半端行は切り捨ててseekでその分だけ戻して先送り。
その程度のロスがいやならデータ構造や処理手順を考え直すし…)
843デフォルトの名無しさん:2005/10/05(水) 19:34:12
つか、嫌な予感がするぜー。
俺が処理で意識するのは次の5つ。

1.処理時間が一瞬で、繰り返し処理を行ってもやはり一瞬で終わる
2.処理時間は一瞬だが、繰り返し処理を行うとちょっと時間がかかる
3.処理時間が結構長く、ユーザーに経過を伝える必要がある
  しかし、メモリ内で処理を終えることができ、処理中のHDなどへの読み込み・書き込みは無い。
4.処理時間がかなり長く、ユーザーに経過を伝える必要がある
  メモリ内で処理を終えることはできず、処理中もHDなどへの読み込み・書き込みを行わなければならない。
5.日がな一日中動かしている必要がある。
  もう、処理中は最小化でもしてほっといてくれ。いつかは終わる。日付が変わることもあろうよ。
  途中で電源が切れることもあろうよ。雨にも負けず風にも負けずそういうアプリに(ry

で、これがさ、高速化によって5が4になったり3が2になったりと
ランクが変わるぐらいじゃねーと俺は高速化ってやる意味ないと思うんだけどね。
200秒が100秒になってもねぇw
844デフォルトの名無しさん:2005/10/05(水) 21:11:37
そういうのとは次元が違うと思うが
845デフォルトの名無しさん:2005/10/05(水) 21:24:04
計算量のオーダーが変わらないと、高速化とはいえないずら。
846デフォルトの名無しさん:2005/10/05(水) 21:44:43
>>844
高速化なんてそういう問題でしょ。
847デフォルトの名無しさん:2005/10/05(水) 21:54:30
次元と言うのは>>807のレベルのことを言ってるんじゃないの?
848デフォルトの名無しさん:2005/10/05(水) 21:59:30
最適化はコスト次第
849デフォルトの名無しさん:2005/10/05(水) 23:26:53
まあ大体同意。
1/50秒と1/60秒は大きな違いだが、100秒と200秒じゃたいして変わらんよな。
850デフォルトの名無しさん:2005/10/06(木) 00:12:14
(;゚Д゚)
851デフォルトの名無しさん:2005/10/06(木) 04:41:43
まあ、200年が100年になっても、大した差はないよな。たかが100年( ´,_ゝ`)
852デフォルトの名無しさん:2005/10/06(木) 11:03:09
>>851
そういうシチュエーションはないでしょ?
現実的に考えて存在しないようなパターンを偉そうにもってきて、何、悦にいってるんだかw
会社でもこういう奴いるよ。
考えなくていいようなレアパターンをもってきて「これじゃ駄目だよ」とかいって騒ぎ出す馬鹿。
ホント仕事できねぇなら、寝てろよ、邪魔だから。
853デフォルトの名無しさん:2005/10/06(木) 11:47:33
煽りレスにマジレス返しちゃダメよ
854デフォルトの名無しさん:2005/10/06(木) 12:22:14
1/50秒と1/60秒の違いと、100秒と200秒の違いの分からないやつは最適化を語る資格なし
855デフォルトの名無しさん:2005/10/06(木) 12:34:06
たかだか2分足らずの時間差など
856デフォルトの名無しさん:2005/10/06(木) 12:42:12
>>852
>現実的に考えて存在しないようなパターンを偉そうにもってきて

現実的に考えて2000年まで使用するとは思わなかった。
そんな事が数年前にあったよねぇ。
857デフォルトの名無しさん:2005/10/06(木) 13:05:51
>>856
世界が1999年で終わると信じていたんだろw
858デフォルトの名無しさん:2005/10/06(木) 13:06:47
>>856
はぁ?
 常 識 的 に 考 え て >>851 の 発 言 は ど う で す か ?

それがわからないほどあんたは馬鹿なんですか?
859デフォルトの名無しさん:2005/10/06(木) 13:07:29
世界は2038年に終焉を迎えます
860デフォルトの名無しさん:2005/10/06(木) 13:37:22
>>858
常識的に考えて>>851は冗談だとわかりませんか?
まあそれはいいとして

>現実的に考えて存在しないようなパターンを偉そうにもってきて、何、悦にいってるんだかw

そういう姿勢はどうかと思うぞ。
危機意識足らねえんじゃないの?
861デフォルトの名無しさん:2005/10/06(木) 14:03:09
>>860
>>851が冗談なら君と会話する意味は無いよ。
さっさと消えろ。
862デフォルトの名無しさん:2005/10/06(木) 14:13:25
ここはアイロニーも理解できない馬鹿がいる、愉快なスレですね。
863デフォルトの名無しさん:2005/10/06(木) 15:53:34
アイロニート
864デフォルトの名無しさん:2005/10/06(木) 16:47:49
200秒が100秒になったら全然違うだろ。
カップラーメンの待ち時間のあの空腹感の入り混じったもどかしさを思い出せ!
865デフォルトの名無しさん:2005/10/06(木) 16:50:00
>>864
最近待ち時間無しタイプのカップ麺しか食わない
866デフォルトの名無しさん:2005/10/06(木) 17:18:40
え、そんなのあるの…知らなかった(´・ω・`)
867デフォルトの名無しさん:2005/10/06(木) 17:46:59
お湯を入れて捨てる
またお湯を入れる
待ち時間なしでウマー

って入れ替えてる間に3分たってるやん!!!
868デフォルトの名無しさん:2005/10/06(木) 17:53:33
2倍量沸かしてるから無問題。
でも沸かす時間の方が長いこともある。冬場とか。
869デフォルトの名無しさん:2005/10/06(木) 17:54:48
ガス湯沸し器もってない奴は負け組
870デフォルトの名無しさん:2005/10/06(木) 18:20:51
給湯器か?
沸騰しないからまずいし、水道水以外使えないのもマイナスだな。
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;
  }
      ・
      ・
      ・
872デフォルトの名無しさん:2005/10/06(木) 18:33:01
>>869
電子ポットの方がまだマシだな
873デフォルトの名無しさん:2005/10/06(木) 18:40:38
フルパスにしてませんでした。
874デフォルトの名無しさん:2005/10/06(木) 18:40:38
>>871
ファイルが見つからないだけだろ、試しにフルパスで書いてみ。
875デフォルトの名無しさん:2005/10/06(木) 19:19:02
質問が御座います。お知恵をお貸し下さいませ。
環境依存だと思います、作成環境はLinux。実行はGumstixという小型Linuxマシンです。
クロスコンパイラで作成する環境となります。

質問は「プロセス間通信」についてです。
只今Aというプログラムを作り、GPSからデータを抽出しています。
今後Bというプログラムで、このAに「抽出したデータをファイルへ書き出せ」
という指示を与え、それを受けたAがファイルを作成するという動作をさせたいと思っています。

つきましては、Bを作成する上で参考となるサイト様などは御座いますでしょうか?
プログラムをまたいでの操作は初めてなもので、是非ともお力添えを頂ければと思います。
宜しくお願いします。
876デフォルトの名無しさん:2005/10/06(木) 22:40:03
>>875
誘導した手前一応聞いておくけど、何故プロセスを分けるか、
例えばファイル経由ではいけない理由があるのか、
その辺りの背景が判らないと情報の提示もしにくいのだけれど。
877875:2005/10/07(金) 09:25:14
>>876
お答えします。率直に言うと、「色々な監視・管理をするプログラム」が必要だからです。
このBというプログラムはAに対しての制御の他、また別のプログラムや機器、
それらの情報を一手に引き受けて処理をする事を前提としているのです。

ですから確かにファイル通信でBがAへの指示をアペンド記述で行毎に指示し、
Aが逐次そのファイルを確認・処理をしても良いのですが、
制御する情報などが今後増大した場合、ファイルなどでは手に余るのではないかと思います。

…とはいえ、実際の所「やり方を覚えてみたい」という願望も否定出来ないのですが。
878デフォルトの名無しさん:2005/10/07(金) 11:22:39
>>877
このあたりとか
http://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel-6.html
あとは普通にSocketで通信って方法も。
879875:2005/10/07(金) 11:45:58
>>878
ドンピシャです(汗) 今そこを読んでいました…
どうやら用途や方法、開発環境によって使うプロトコルは複数あるようですね。
暫く頭を捻らせてみる事にしたいと思います。

元々C言語なら…から誘導されて来たのですが、「プロセス間通信」という言葉を知らず、
遠回りな質問をしてしまっていた様です。お手間を取らせました、ありがとうございます。
頑張って習得したいと思います。
880876: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
↑解決しました
883デフォルトの名無しさん:2005/10/07(金) 14:44:17
>>882
せめて原因が何で、どうやったら解決したかくらいは書いとけ
884デフォルトの名無しさん:2005/10/07(金) 18:04:41
自作のライブラリを使用するためのヘッダで

const float PI = 3.14 ;

のように定数定義しています。
しかしこれはあればいいなというだけで必ず使うわけではないので、
使わない場合はコンパイル時に警告が出ます。

マクロにするというのもアレなので、ほかにスマートな回避方法はありませんか。
885デフォルトの名無しさん:2005/10/07(金) 18:08:28
>>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を作ってやる
887デフォルトの名無しさん:2005/10/07(金) 18:33:13
>>884
それで警告なんて普通でねぇ

>>886
そんなことするくらいならマクロにした方が簡単
888デフォルトの名無しさん:2005/10/07(金) 18:37:01
未使用変数の警告を抑制
889デフォルトの名無しさん:2005/10/07(金) 18:42:07
しかし定数は未使用で警告が出ないのが普通だと思うが。
890884:2005/10/07(金) 18:48:32
値は例なのでどうでもいいんです。

警告が出るのは BCC で -w オプションをつけたときで、デフォルトでは出ません。
普段はオプション無しで、デバッグ時にのみ付けるようにします。
891デフォルトの名無しさん:2005/10/07(金) 18:56:05
>>890
ヘッダでの変数宣言なら2重定義をはじくマクロくらい入れとけ
てか、普通入れる物だと思ってた俺ってアホ?
892デフォルトの名無しさん:2005/10/07(金) 19:13:32
(・∀・)ニヤニヤ
893デフォルトの名無しさん:2005/10/07(金) 20:04:10
シッ!
見ちゃいけません・・!
894デフォルトの名無しさん:2005/10/07(金) 20:31:37
こんばんわ。質問させて下さい。

既存のCOMサーバーのATLオブジェクト(シンプルオブジェクト)があり、
これがコネクションポイント非サポートなんですが、
コネクションポイントのサポートをさせる事は可能でしょうか?

コネクションポイントのサポートをウィザードで指定した
ATLオブジェクトを作ってみて、IDL等真似して移植してみたのですが、
クライアントから DispEventAdvise した時に
0x80004002:インターフェイスがサポートされていません
エラーが出てしまいました。

素直にイベント配信用に新しいATLオブジェクトを作成した方がいいのでしょうか。。。

開発環境はVC6.0です。

よろしくお願いします。
895デフォルトの名無しさん:2005/10/07(金) 22:05:35
下のプログラムの 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];
}
896デフォルトの名無しさん:2005/10/07(金) 22:23:33
何故エラーメッセージを晒さないくせに質問するんだろうな。
897デフォルトの名無しさん:2005/10/07(金) 22:24:09
>>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);
899デフォルトの名無しさん:2005/10/07(金) 22:36:33
>>897
通りました〜。
ありがとうございます。
900デフォルトの名無しさん:2005/10/07(金) 22:50:10
>>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 を使い始めたのですが、
閉じたくても「デバッグ中ですが終了してもよろしいですか?」
と出るので、はいにすると、「プロセスを終了できません。アクセス拒否
されました」と出て、終了できないのですが、どうしたら
いいんでしょうか?教えてください。。
903デフォルトの名無しさん:2005/10/08(土) 00:43:34
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);
904デフォルトの名無しさん:2005/10/08(土) 02:15:45
>>902
まさしくデバッグ中のプログラムが動きっぱなしなんだろ。

>>903
エラーメッセージを貼れ。
キャストは誤魔化しのためにあるのではない。
905デフォルトの名無しさん:2005/10/08(土) 02:17:24
arr2[i][j] = *((double *)&test1);
ってことがやりたいんじゃないの?
その文面だけじゃよくわからんけど
906デフォルトの名無しさん:2005/10/08(土) 06:41:22
C++Builder 6 を使い始めたのですが、
閉じたくても「デバッグ中ですが終了してもよろしいですか?」
と出るので、はいにすると、「プロセスを終了できません。アクセス拒否
されました」と出て、終了できないのですが、どうしたら
いいんでしょうか?教えてください。。
907デフォルトの名無しさん:2005/10/08(土) 08:14:24
>>906
パソコンの電源落として窓から投げ捨てろ
908デフォルトの名無しさん:2005/10/08(土) 08:17:22
C++Builder 6 を使い始めたのですが、
閉じたくても「デバッグ中ですが終了してもよろしいですか?」
と出るので、はいにすると、「プロセスを終了できません。アクセス拒否
されました」と出て、終了できないのですが、どうしたら
いいんでしょうか?教えてください。。
909デフォルトの名無しさん:2005/10/08(土) 09:18:37
サーバーとクライアントを作り、
クライアントから、IPアドレス・ポート番号を入力せずに、又はIPアドレスのみ入力せずに、
起動しているサーバーを自動検索するにはどうすればよろしいでしょうか?

知っている方いましたらお教えください。
宜しくお願いします。

環境はVC6.0です。
910デフォルトの名無しさん:2005/10/08(土) 09:23:55
>>909
考えられる全IP、全ポートにpostして応答が返ってきたもの
911デフォルトの名無しさん:2005/10/08(土) 09:25:57
相当限定された環境でないと不可能だな
912デフォルトの名無しさん:2005/10/08(土) 09:57:05
>>910
その方法は一番最初に考えついてつくってみたんですが、
検索にかなりの時間がかかってしまって、実用的ではなかったです。

時間短縮さえできれば、その方法でもいいとおもっているんですが。

>>911
やはり不可能なんですね。

ポート番号から、サーバーを探すことはできますか?
913デフォルトの名無しさん:2005/10/08(土) 09:59:33
逆接続にするのはどうだろう。
クライアントがサーバのIPを使って接続するのではなく、
クライアントのIPを使ってサーバが接続するの。
#実は某官庁系ネットワークがそういうつくりだったり。
914デフォルトの名無しさん:2005/10/08(土) 10:00:32
>>912
無理だろ。
IPとポート番号が揃ってはじめてアクセスできる。
お前の家へは市町村だけ書いて番地を書かずとも郵便は届くのか。
915デフォルトの名無しさん:2005/10/08(土) 10:02:35
UDPのブロードキャストを利用して、
専用のプロトコル作れば良いだけでは?
916デフォルトの名無しさん:2005/10/08(土) 11:39:24
ピュア型P2Pのノード探索とかが近いかも名
917デフォルトの名無しさん:2005/10/08(土) 12:25:43
>>912
もともとその発想自体が実用的でも適切でもないんじゃね?
サーバ側が約束のportで適時ブロードキャストで情報をアナウンスするか、
クライアントからのリクエスト(ブロードキャスト)に返信するようにするか…
無駄だなあ。
918903:2005/10/08(土) 12:46:48
>>904
自分のやり方は
fwrite((unsigned chart*)&arr2[i][j], sizeof(unsigned char), 1, fp);
でやったのですが、エラーがでなくてファイルが空のままでした。
読み込み時も同じ感じでやった後に配列の中身をprintfで調べても空でした。

>>905
ありがとうございます。今すぐには試せないのですが。

最初から配列をint型で確保した時は出来たのですが、double型でなってしまったので確保しなくてはいけないので、
キャストは一時しのぎで使う時だけ型を変えればいいと言われたのでして。
919デフォルトの名無しさん:2005/10/08(土) 13:06:14
>>918,903
論理的に意味の取れない断片だけ提示してもまったく無意味だぞ。
動かせる程度の最小例ぐらいにまとめないと。
bitサイズだとかtest1の型だとか、不明な点ばかりなので。
そもそも何をしたいのかまったく意味をとれないようなコードだし、
int型で本当にできたのかどうかも怪しいぐらいだ…
920デフォルトの名無しさん:2005/10/08(土) 13:41:48
>>918
もともとdouble型をsizeof(bit)だけ読んだりsizeof(unsigned char)だけ
書いたりするって、何か勘違いしてやしないか?
エラーが出なくて空って、ちゃんと fwriteの返値でエラーチェックやってる?
まさか、double値の bitがちょうど zeroの部分を 1byte書き込んだのを
zero==空 と勘違いしてやしないよね?
921デフォルトの名無しさん:2005/10/08(土) 13:55:28
>>918
IEEE754を知らないとか言わないよな?
922918: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;
 }
}
のように二次元配列に入れるもしくは出すことがしたかったものでして。
質問の仕方が悪かったのと基本的なところを理解しきれていなかったみたいです。
申し訳ありませんでした。基礎的なところをもっと詳しく調べてやり直してみます。
すみませんでした。
923デフォルトの名無しさん:2005/10/08(土) 14:13:31
>>922
ならなんで fread(&Ko.test1, sizeof(unsigned char), ... じゃないんだ?
初心者のトラブルなんだし返値のチェックぐらいきちんとしろよ。
つか、*何も*理解してないが故に質問さえまともにできないだけだな。終了。
924デフォルトの名無しさん:2005/10/08(土) 15:17:35
SuperCon課題レベルの、高度なC言語の問題が沢山載った本を、どなたがご存じないでしょうか?
925 ◆95zCfWeGH2 :2005/10/08(土) 21:33:18
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 を読み込み中にアクセス違反が発生しました。 。
というものです。


よろしくお願いいたします。
926デフォルトの名無しさん:2005/10/08(土) 21:37:43
くそプログラムのデバッグを他人にやらせようとはいい度胸をしているじゃないか。
927デフォルトの名無しさん:2005/10/08(土) 21:42:23
とりあえず、確保もしてないメモリにmemcpyを呼ぶ奴は死ね。
928デフォルトの名無しさん:2005/10/08(土) 21:59:00
>>925
operator +=はどうした。
あと、CIntegerのメンバ関数の中でもCInteger::を付けずにzeroとかの列挙へアクセスできる。
929925 ◆95zCfWeGH2 :2005/10/08(土) 22:25:58
なんとか、解決しました。

>>926
すいません。 以後気をつけます。

>>927
確かにそうでした。

>>928
operator += はまだ実装していません。 なにぶん、作っている最中なので。
後者の列挙型へのアクセスについては知りませんでした。 ありがとうございます。

ちなみに、未熟な腕で書き直して、こんな感じになりました。
http://aploda.net/dl.php?mode=pass&file_id=0000004837

しっかし、今度はoperator+の宣言が
CInteger operator+(CInteger&,CInteger&);
になってしまいました…… 値渡しは避けたいのですが、
なんとか、調べてみます。

どうもです。
930デフォルトの名無しさん:2005/10/08(土) 22:28:14
>>925
NULL を使うな! 0 にしろ
931デフォルトの名無しさん:2005/10/08(土) 22:39:20
>>929
operator +()の戻り値が値渡しになるのは仕方がない。

operator +=()があればoperator +()はすぐに作れる常套手段がある。friendにする必要もない。
CInteger operator +(const CInteger& left, const CInteger& right)
{
    return CInteger(left) += right;
}
932デフォルトの名無しさん:2005/10/08(土) 22:43:37
nullpo inter
933925 ◆95zCfWeGH2 :2005/10/08(土) 22:51:36
>>930
そうなんですか……orz
でも、見ててポインタと区別つかない……

>>931
おぉ、 確かにそうですね。
今から書いてみます。

みなさん、どうもです。
934デフォルトの名無しさん:2005/10/09(日) 01:49:42
>>794
if( boost::is_pod<TYPE>::value )
でできるみたいですね。ありがとう御座いました。
935デフォルトの名無しさん:2005/10/09(日) 03:59:04
一番シンプルな四捨五入のコードを教えてください。
936デフォルトの名無しさん:2005/10/09(日) 04:07:28
int n;
n=(n+5)/10*10;
937デフォルトの名無しさん:2005/10/09(日) 05:25:10
(int)(d + 0.5);
938935:2005/10/09(日) 05:36:45
すみません。浮動小数点でお願いします。
939デフォルトの名無しさん:2005/10/09(日) 05:39:54
そもそも四捨五入ったって、小数点以下何位を四捨五入したいの?
それを指定した上での四捨五入が欲しいのか?
940デフォルトの名無しさん
第三位なら
(int)(d*1000 + 0.5)/(double)1000;
とか