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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。

【歴代スレ】
1:http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
2:http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
3:http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
4:http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
5:http://pc5.2ch.net/test/read.cgi/tech/1077102238/ (dat落ち)
6:http://pc5.2ch.net/test/read.cgi/tech/1082182233/(dat落ち)
7:http://pc5.2ch.net/test/read.cgi/tech/1086373839/(dat落ち)
8:http://pc5.2ch.net/test/read.cgi/tech/1091264964/(dat落ち)
9:http://pc5.2ch.net/test/read.cgi/tech/1094494997/l50
10:http://pc5.2ch.net/test/read.cgi/tech/1097416187/l50
【ラウンジ】質問、回答が長い時はココを使うと見やすい
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html

関連スレは>>2-5ぐらい
2デフォルトの名無しさん:04/10/31 11:37:27
終了します
3デフォルトの名無しさん:04/10/31 11:39:08
【関連スレ(処理系別)】
★初心者にVisual C++を教えるスレ★ Part15
http://pc5.2ch.net/test/read.cgi/tech/1097880265/l50

■MFC相談室 mfc11.dll■
http://pc5.2ch.net/test/read.cgi/tech/1088084875/l50

C++Builder相談室 Part11
http://pc5.2ch.net/test/read.cgi/tech/1094749339/

GCCについて part4
http://pc5.2ch.net/test/read.cgi/tech/1090062751/l50

cygwin + mingwn + gcc 相談室
http://pc5.2ch.net/test/read.cgi/tech/1058134693/

タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/l50

タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/l50

Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/l50

Turbo C++ 5.0 プログラミング
http://pc5.2ch.net/test/read.cgi/tech/1030878794/l50
4デフォルトの名無しさん:04/10/31 11:44:39
【関連スレ(その他)】
C言語なら俺に聞け! Part 93
http://pc5.2ch.net/test/read.cgi/tech/1098007606/l50

C++相談室 part37
http://pc5.2ch.net/test/read.cgi/tech/1098543578/l50

暇な人がエレガントにC/C++の宿題片づけます 33代目
http://pc5.2ch.net/test/read.cgi/tech/1097932699/l50

【C++】template 統合スレ -- Part5
http://pc5.2ch.net/test/read.cgi/tech/1091522597/l50

C++は難しすぎ 難易度:2
http://pc5.2ch.net/test/read.cgi/tech/1071697977/l50

C言語の第一歩
http://pc5.2ch.net/test/read.cgi/tech/1031374980/l50
5デフォルトの名無しさん:04/10/31 11:45:40
【関連スレ(その他)】
★C言語で遊ぼう!★
http://pc5.2ch.net/test/read.cgi/tech/1028269762/l50

プリプロセッサについて熱く語るスレ。
http://pc5.2ch.net/test/read.cgi/tech/1058203590/l50

C統合・質問スレッド
http://pc5.2ch.net/test/read.cgi/tech/1068359871/l50

フリーコンパイラー使えよ。
http://pc5.2ch.net/test/read.cgi/tech/1061384369/l50

C、C++の最適化について語るスレ
http://pc5.2ch.net/test/read.cgi/tech/1084676298/l50

ラウンジでC言語
http://etc3.2ch.net/test/read.cgi/entrance/1093006298/l50
6デフォルトの名無しさん:04/10/31 11:47:36
リクエストにお応えして新スレ立てました。
目についたところはリンクを張り替えましたが、
至らない点などございましたらご容赦ください。

>>2
再開します
7デフォルトの名無しさん:04/10/31 14:39:20
>>1
8前スレ999:04/10/31 15:47:23
要はmcが消失したテンポラリを参照しているから動作は不定
9前スレ999:04/10/31 17:12:34
スマン
いじってるうちに勘違いしてたようだ
前スレ999と8取り消す
惑わして御免
10前スレ999:04/10/31 18:19:58
再チャレンジ
こんな感じでx[i]がdouble *のテンポラリを作ってるような気がする
#include <iostream>
#include <iomanip>
#include <memory>
using namespace std;
template<class Container>
class Tester {
const Container& mc;
int mn;
Tester();
public:
Tester(const Container& c, int n): mc(c), mn(n) {}
void disp() {for (int i=0; i<mn; i++) cout << setw(3) << mc[i]; cout << endl;}
};
int main() {
enum { N=3, n=10 };
double x[N][n];
for (int i=0; i<N; i++) for (int j=0; j<n; j++) {x[i][j] = n*i + j;}
auto_ptr< Tester<double*> > p[N];
for (int i=0; i<N; i++) {
double *tmp (static_cast <double *> (x[i]));
p[i].reset(new Tester<double*>(tmp, n));
}
for (int i=0; i<N; i++) {cout << "Tester[" << i << "]: "; p[i]->disp();}
return 0;
}
11デフォルトの名無しさん:04/11/01 15:22:54
新しく機能つけるごとにバグがでてくるな
ウインドウズなんか作ってる人ってすごいな
まともに動くだけでもすばらしい
12デフォルトの名無しさん:04/11/01 18:10:49
>>11
バグって?
13デフォルトの名無しさん:04/11/01 18:57:37
VisualC++.net2003で作ったアプリをビルドして友達に使ってもらおうと思ったんですが
95/98/ME環境の人のみ文字化けしてしまいます。
文字コードの問題?っと思うんですが、ビルド設定に見当たらないんですが
どうしたらいいですか?
14デフォルトの名無しさん:04/11/01 19:48:41
newでメモリ確保に失敗することって本当にあるんですか?
15デフォルトの名無しさん:04/11/01 19:51:20
>>14
メモリがなくなったりとかしたら当然失敗するでしょ
16前スレ916:04/11/01 20:28:21
>>10
返事が遅くなり申し訳ございません。
なるほど……。
べたで展開した場合は、コンストラクタごとに別のテンポラリ変数を作って
それへの参照をコンストラクタに渡していたわけですね。for loop で記述
した場合はテンポラリ変数を使いまわして最適化を図っていたと……。
{ // for loop を再現するよう、べたに展開
  int i=0;
  double *tmp;
  tmp = (static_cast <double *> (x[i]));
  p[i].reset(new Tester<double*>(tmp, n)); // tmpへの参照で初期化
  i++;
  tmp = (static_cast <double *> (x[i]));
  p[i].reset(new Tester<double*>(tmp, n));
  i++;
  tmp = (static_cast <double *> (x[i])); // tmpへの最後の代入
  p[i].reset(new Tester<double*>(tmp, n));
}
しかし勝手にこんな展開をされるのは怖いなあ…。
一時変数は式の最後(';')の時点で寿命が尽きると理解していたのですが
意識を改めなければならないようです。解決。

わかり易い解を有り難うございました。また他の方々も親身になってお答え
くださり、まことに有り難うございました。
17デフォルトの名無しさん:04/11/01 20:48:28
>>16
微妙に誤解してる気がするが...

配列とポインタは型が違うのよ
例)
int array [10]; int *pointer;
cout << (typeid (array) == typeid (pointer)) << endl;
結果: 0

Tester <double *>のコンストラクタにx[i]を渡すときに
x[i]は(double [10])から(double*)に暗黙の型変換が起こり(つまり一時変数)
コンストラクタのcはこの一時変数を参照する
そしてmcがcで初期化される

>一時変数は式の最後(';')の時点で寿命が尽きると理解していたのですが
この理解はあってるでしょ
寿命の尽きた一時変数をmcが参照しているので今回のようなことになるわけで
1817:04/11/01 20:52:36
>17
>今回のようなこと
捕捉すると
つまり動作は不定
表示されたのはたまたま
19デフォルトの名無しさん:04/11/01 21:05:06
>>14
俺っちはnewでメモリ確保に失敗なんて一度も無いけどな。
失敗した時のコードを書くのはスペースの無駄。
気にすんな。
20デフォルトの名無しさん:04/11/01 21:15:56
>>19
そのプログラムを動かしながら、バックで何かとてつもなくメモリを食う
プログラムが動いていたとしたら?
そうでなかったとしてもそのプログラム自体がとてつもなくメモリを食うとしたら?
21デフォルトの名無しさん:04/11/01 21:26:25
仮想メモリだのがあるOSを使ってるとばかみたいにメモリ確保できるから、
メモリ確保に失敗する前にむしろOSがおかしげになりそうではある。
DOSの頃は切実だったけど。
22デフォルトの名無しさん:04/11/01 21:44:20
とてつもなくメモリを食うプログラムが
動いていてもメモリ確保出来ちゃうから
特に問題無い。
23大原ゆき:04/11/01 22:11:23
なんか、Cスレでもそうなのですが、freeは要らないとか、エラーチェックは要らない
とか、なんだか将来が心配ですね。
24デフォルトの名無しさん:04/11/01 22:11:47
遊び程度ならそれで無問題。
25デフォルトの名無しさん:04/11/01 22:21:27
>>24
あそびならむしろプロと違って切実な納期とかあるわけじゃないんだから、
ちゃんとこだわって書いていきたいと思う。
エラーチェックはある程度までで仕方ない点はあるけど、
freeはちゃんと書こうぜ。
2624:04/11/01 22:23:39
>>25
俺はどっちかというとnewやmallocのメモリ確保失敗チェックを
しない、delete、freeをしない奴を揶揄して書いた。

それと24の書き込みは22宛て。時間見て。
27デフォルトの名無しさん:04/11/01 22:39:59
そんなのはどうでもいいけど、確保失敗チェックを行って
そのチェックに引っかかったことはあるの?
28大原ゆき:04/11/01 22:45:57
>>27
開発中は正常に動作し、テスト中も正常に動作し、一番大事な顧客の前で突然
動かなくなる。
29デフォルトの名無しさん:04/11/01 22:47:43
それはメモリ確保の失敗が原因なのか、
他の原因なのか。
30大原ゆき:04/11/01 22:49:34
ユーザはそのソフトをどのように使うか解からないし、長時間かけないと
解からないこともあります。
フリーウェアであっても同じ事がいえます。
使う人間が増えればそれだけ露見することも多いでしょう。
31大原ゆき:04/11/01 22:52:35
エラーがどこかということは発生してみないとわかりません。
解からない以上、知りうる限りの対策を予め講じておかなければなりません。
エラーが発生して被害を受けるのは顧客だけでなく開発者もそうなのです。
32デフォルトの名無しさん:04/11/01 22:53:02
>>19>>22>>27などはプログラマに向いてない性格に思える。
33大原ゆき:04/11/01 23:02:07
と、言ってしまってから気づきましたが、一つのオブジェクトだけをnewする
場合は、多くの場合、エラーチェックすると「やりすぎ」かもしれません。
上述はたくさんのオブジェクトをnewする時だけの話です。
new/deleteは必ずペアで使う、というのは変わりませんが。
34デフォルトの名無しさん:04/11/01 23:07:26
必死ですね。w
35大原ゆき:04/11/01 23:10:05
>>34
必死だよ
だって、おみやげの梅ケ枝餅全部食べられたんやもん。
36デフォルトの名無しさん:04/11/01 23:36:06
まぁ、生でnew/deleteなんて使わないでコンストラクタでnew、デストラクタでdeleteしてれば
意識する必要もないわけだが。
#精々APIで終了してしまってデストラクタを通らないなんて事が無いよう気にするくらい。
37デフォルトの名無しさん:04/11/02 00:30:40
set_new_handlerだっけか
38デフォルトの名無しさん:04/11/02 12:17:39
機能追加のために数百カ所書き加えないといけないはめに…
やっぱ地道に書くしかないのかな…
最近こんなんばっか
39デフォルトの名無しさん:04/11/02 12:20:05
ここはお前の日記帳じゃないんだ
愚痴をこぼす前に手を動かせ、な!
40デフォルトの名無しさん:04/11/02 15:21:13
>>23
プロセス消滅前に態々 free する莫迦の存在が寧ろ心配なんですが。
41デフォルトの名無しさん:04/11/02 16:31:27
Visual C++.netを使用して、
VisualC++プロジェクト→.NET→コンソールアプリケーション
で下記を作成し、ウォッチで"tmp->c"を参照しても、2次元配列
の中身が参照できません。

#include "stdafx.h"
#using <mscorlib.dll>
using namespace System;

typedef struct{
    int a;
    int b;
    int c[5][2];
}AAA;
AAA aaa;

int _tmain()
{
  AAA *tmp;

  tmp = &aaa;

  return 0;
}

VisualC++プロジェクト→Win32→Win32コンソールプロジェクト
で作成すると、参照できるのですが、.NETの方で参照できる
方法はあれば、教えて下さい。
42大原ゆき:04/11/02 16:58:34
>>40
なるべくプログラムを部品化して再利用した方がコストがかからなくて良い、
というのは賛成していただけるのでしょうか。
もし、賛成していただけるとしたら、その部品がなるべくどの環境でも正常な
動作を期待したいと思うでしょう?
OS任せ→環境依存→再利用が困難→一から作らないといけない→コスト増し
43デフォルトの名無しさん:04/11/02 18:33:57
>>40
もちろん>>42の意見は当然なんだけど、
それ以前に「開けたら閉める」ってのは普通の感性だと思うんだけど。
44デフォルトの名無しさん:04/11/02 19:19:59
linux上でCPU使用率やメモリ使用率を取得して表示するプログラムを組みたい
のですが、Widowsのように以下のGlobalMemoryStatus関数のようなシステム情報
を取得する関数は存在しますか?
 GlobalMemoryStatus関数
  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/globalmemorystatus.asp

上のような関数でなくとも、システム情報を取得する方法があれば教えて頂きたいです。
45デフォルトの名無しさん:04/11/02 19:25:13
デザインパターンの勉強に、あるHPのサンプルコードを参考にさせてもらってるのだけど、

class A
{
public:
virtual void NamePuts() = 0 ;
} ;

class B
{
public:
A* m_low ;

B( A* in )
: m_low( in ) //←
{}

virtual void Puts() = 0 ;
} ;

の、
B( A* in )
: m_low( in )
ってのが、解りません。継承した基本クラスのコンストラクタに値を渡すような書式だけど、
継承してないし、メンバのAのポインタだし…。
: m_low( in )の部分を取ってコンパイルしてみてもエラーは出ませんでしたが、
実行中にエラーがでました。
値を代入しているようには思えますが、どういった意味なんでしょうか?

ちなみに、Bridgeパターンです。
46デフォルトの名無しさん:04/11/02 19:27:15
サイト見る前に基礎を学べよ
class Bのメンバをコンストラクタの引数で初期化してる
つーかそれ以外にどういう解釈があるんだ
47デフォルトの名無しさん:04/11/02 19:29:17
>>45
継承ではなくてコンポジション(包含)だろ。デザパタ以前にもう少しクラスの
お勉強をした方がいいね。
48デフォルトの名無しさん:04/11/02 19:39:13
>>44
topのソース見ればいいじゃないか?
4948:04/11/02 19:39:18
>>46,47
コンポジションてのは初めて聞きました。OTL
クラスの基礎、もう一度見直したいと思います。
ありがとうございました。
5045=49:04/11/02 19:40:44
リロードし忘れた…。OTL
>>48ごめんよ
51デフォルトの名無しさん:04/11/02 19:41:56
>>42
「プロセス消滅前」と言っている。つか、何で部品化云々の話が?
>OS任せ→環境依存
リソースをマトモに管理できない環境でメモリヒープ使う事自体が自殺行為。

>>43
malloc/calloc/realloc が「開ける」とするなら
free は「閉めた事にする」なんだが。
52デフォルトの名無しさん:04/11/02 19:43:00
うわ、なんかマジでfreeネタやってやがるっ!
53大原ゆき:04/11/02 19:44:19
>>52
ごめんごめん、もう止めるから。
次回からは俺俺で。
54デフォルトの名無しさん:04/11/02 19:46:50
環境:W2K VC++6.0
short型にint型を代入すると、警告レベル4だと警告出るじゃん。
その警告出さない為に、あらかじめshort型で宣言しておきたいんだけど、どうやって宣言すればいいの?

実際は、MSXMLのIXMLDOMDocument2Ptr::preserveWhiteSpaceにVARIANT_BOOL型で代入すると
警告が出るんだけど、VARIANT_BOOLのVARIANT_TRUEって(VARIANT_BOOL)0xffffでdefineされてんだよね。
んで、preserveWhiteSpaceはshort型なもんで、警告がでるの。大丈夫かMS。

この警告を巧く消す方法ってないかな?
55デフォルトの名無しさん:04/11/02 19:48:43
なにが「大丈夫か」なのかな。
56デフォルトの名無しさん:04/11/02 19:48:56
警告の意味ないじゃん
57デフォルトの名無しさん:04/11/02 19:49:33
警告消したら警告の意味ないじゃん
5854:04/11/02 19:50:24
>>55
別にpreserveWhiteSpaceメンバはshortである必要がないじゃん。
59デフォルトの名無しさん:04/11/02 19:53:29
必要か、「VARIANT_BOOL型で代入する」必要はあるの?
60デフォルトの名無しさん:04/11/02 19:55:44
>>48
topというコマンドが私のやろうとしている事を行っているみたいですね。
即レスありがとうございましたm(__)m
6154:04/11/02 19:57:28
>>59
必要ない。
ので、別にオールビット立っている直値でも突っ込みたい気分なんだがそれをやっても警告は消えない。
short型で宣言して値を初期化しようとした段階でエラーになるんだよ・・・。

short hoge = 0xffff; <-警告発生

どうやりゃいいの?
62デフォルトの名無しさん:04/11/02 20:04:58
true
6354:04/11/02 20:07:18
>>62
Thanks!
64デフォルトの名無しさん:04/11/02 20:08:09
C++によるプログラミングをはじめてみようと思っている者です。
手元にある書籍は、エディタにコードをうち、Borlandのコンパイラにかけてプログラムを作っていくものです。
これは覚えていくことで将来的にGUIアプリケーションは作成できるものなのでしょうか?
もしかしたらVisualC++などを買わないとGUIは作成できないのではないかと不安です。
65デフォルトの名無しさん:04/11/02 20:11:11
>>63
true == 1
6654:04/11/02 20:12:54
>>65
orz...
67デフォルトの名無しさん:04/11/02 20:13:22
FALSE が 0 なら TRUE は -1 が正しい
http://pc5.2ch.net/test/read.cgi/prog/1082154544/l50
68大原ゆき:04/11/02 20:20:19
>>64
GUIプログラミングをするのは結構ですが、何か目的あってのことですか?
とりあえずGUIであても無く何かを作りたいと思っているだけでしたら、
そういう考えは捨て、もっと有益なテーマを見つけてからプログラミング
に取り掛かることをお薦めします。
例えば、手書き文字認識に興味があって、その入力ツールを作るために
GUIがどうしても必要だ、ということになって始めてGUIの書き方を学ぶと
良いでしょう。
もっとも、GUIのしくみ自体に興味があるのでしたら、それでも構いませんが。

さて、GUIアプリケーションを作るにあたって、WindowsでしたらWin32API
を使って書けばウインドウを開いたり、一般的なGUIと言えるインターフェース
を構築することは可能です。
Win32APIを扱うためにはVC++でなければならないわけではなく、BorlandC++Compiler(以下BCC)
のような無償のコンパイラでも全く問題なくコンパイルできます。
VC++を使うことのメリットは統合開発環境としてのVC++を利用できる点で、
BCCのような多くの無償コンパイラに付属していない便利な機能が付属しています。
何が便利かというと検索していただければすぐに解かります。
6954:04/11/02 20:31:57
>>67
あんがと
70デフォルトの名無しさん:04/11/02 20:42:45
BCCを使うことのメリットは統合開発環境としてのBCCを利用できる点で、
VC++のようなMSコンパイラに付属していない便利な機能が付属しています。
何が便利かというと検索していただければすぐに解かります。
71デフォルトの名無しさん:04/11/02 21:35:36
ちょっと考えてみた
short hoge = ~0;
ダメだよな
72デフォルトの名無しさん:04/11/02 21:57:51
#include <stdio.h>
#include <windows.h>
#include <windowsx.h>
int main()
{
int d,e,f;
bool a,b,c;
d=0,e=0,f=0;
a=(d!=0);
b=(e!=0);
c=(f!=0);
if (a||(b&&c))
{
printf("%d\n" , 777);
}
else
{
printf("%d\n" , 999);
}
}
を実行すると
error C2065: 'a' : 定義されていない識別子です。
error C2065: 'b' : 定義されていない識別子です。
error C2065: 'bool' : 定義されていない識別子です。
error C2065: 'c' : 定義されていない識別子です。
error C2143: 構文エラー : ';' が '識別子' の前にありません。
:error C2144: 構文エラー : '<不明>' は '<不明>' によって先行されなければなりません
error C2144: 構文エラー : '<不明>' は '<不明>' によって先行されなければなりません。
error C2146: 構文エラー : ';' が、識別子 'a' の前に必要です。
というエラーが出ます
なぜでしょうか?
73大原ゆき:04/11/02 21:59:26
>>72
C++としてコンパイルしていますか?
74デフォルトの名無しさん:04/11/02 22:04:00
>>73
拡張子をcppに変更したらいけました
ありがとうございました
75デフォルトの名無しさん:04/11/02 22:29:14
c++ の質問です。
CString *s[] = new CString[10];
delete[] s; // 質問:どうして delete s; では駄目なの?
76デフォルトの名無しさん:04/11/02 22:37:34
>>75
マルチさんさようなら。
77デフォルトの名無しさん:04/11/02 22:40:43
>>75
newならばdelete、new[]ならばdelete[]。
1つと複数では、確保の方法が違う(実装がある)場合があるから
区別が必要。考えるのが面倒臭ければ1つの領域を確保する場合に
new[1]とすることもできるけれども、あまりお勧めしない。
78デフォルトの名無しさん:04/11/02 22:46:42
>>77
ぶっぶー
79デフォルトの名無しさん:04/11/02 22:54:26
>>77
本当の正しい答えを知ってるけど、もったいないから教えてげないよ。
80デフォルトの名無しさん:04/11/02 23:07:33
>>75
もういいから、本を買えよ。
EffectiveC++くらい持っていても存はないよ。
81デフォルトの名無しさん:04/11/02 23:18:37
プログラミング言語C++に
(double(rand())/RAND_MAX)
という記述があったのですが rand() を囲っている double にはどういう意味があるんでしょうか?
82デフォルトの名無しさん:04/11/02 23:19:32
C++スタイルのキャスト
気になるなら
static_cast<double>(rand())
とフィルタしとけ
83マイク ◆yrBrqfF1Ew :04/11/02 23:20:27
>質問:どうして delete s; では駄目なの?

そういうものだから。
あとsの宣言・定義時の[]もいらない。
84デフォルトの名無しさん:04/11/02 23:46:13
>>64
まず言語仕様を覚えることから始めないとどうしようもなかんべ。
それをきっちり身に付けてからGUIに逝け。
基本を身に付けずにVCにいくと、何か一つしようとするたびに
ここで質問にしなければ手が出ないようなことになるぞ。

>>70
統合開発環境はBCBだべ。

85デフォルトの名無しさん:04/11/03 11:28:02
ある程度でかくなったプログラムはまるで生き物みたいに動き出すね
86デフォルトの名無しさん:04/11/03 13:13:31
(void)(*test)->GetErrorName(&errnum_str);
C言語のサンプルコードなのですが、
visual studio.net2003で拡張子を.c -> .cppにしてコンパイルするとエラーがでてしまいます。
こういうコードはC++ではエラーになってしまって通らないのですが、どうしたらいいでしょうか?
87デフォルトの名無しさん:04/11/03 13:39:50
>>86
そこ1行だけじゃ良くわからないが、どこかをキャストすればいいような気がする。
88デフォルトの名無しさん:04/11/03 15:27:54
>>81
double 入れないと、常に 0 になっちゃう。C の基本だよ。
89デフォルトの名無しさん:04/11/03 15:28:26
プログラム実行中にたまに
"pure virtual function called"
と言うエラーが出るのですが原因は何でしょうか?

純粋仮想関数絡みみたいですが対策がわかりません

VC6,SP5適用済みです
90デフォルトの名無しさん:04/11/03 15:28:40
>>85
どういうことでしゅか?
91デフォルトの名無しさん:04/11/03 15:29:33
>>89
実装の与えられていない仮想関数が呼び出されたってこと。
purecall でウェブ検索してみるといい。
92デフォルトの名無しさん:04/11/03 15:31:25
>>86
どんなエラーが出るのか書きなされ。
たぶん、その文を少し修正するだけで C++ でもとおると思われるが。
最初の (void) は不要なんでは?
93デフォルトの名無しさん:04/11/03 15:41:29
ICUを利用するとブレークポイントが置けなくなるのですが
解決策しってる人 教えてください
94モモ:04/11/03 15:45:01
>>93
ICU って http://oss.software.ibm.com/icu/ これのこと?
開発環境はなに?
9589:04/11/03 15:47:06
>91
おかげさまで解決できそうです。

回答ありがとうございました
9693:04/11/03 15:53:42
ごめんなさい開発環境書き忘れ VC6.0です。
ICUはソレ
http://oss.software.ibm.com/icu/
です。バイナリ版使うとブレークポイントが使えなくなる
ソースからBuildしてデバッグライブラリを明示的にLinkしたけどダメ
STLportとBoost使ってますが ICUのビルドではSTLportでコンパイルできなかったので
ICUのBuildには 標準のSTLを利用しました

97モモ:04/11/03 15:56:45
>>96
何かプログラムを作っていて、
そこからライブラリを利用しており、
プログラムのコード上にブレークを置けない
ということですか?
9893:04/11/03 16:13:53
#include <unicode/ucnv.h>
を書くと、プログラム上にブレークポイント置いても
ブレークポイントが無効にされてしまうんです。
99モモ:04/11/03 16:16:45
>>98
原因がわからなくてすまんけど、
VC6 って、プロジェクトファイル (.dsp) が不適切だと、
デバッグビルドでもブレーク置けないことがあるよ。
そういうときは、プロジェクトを作り直すと直ることがある。
10093:04/11/03 16:36:52
解決しました
原因は結局よくわかりませんでしたが
Includeの順番を入れ替えたりしているうちに直ったのですが
その後再現性が全くないのです・・・
単に運が悪かったのかもしれません お付き合いありがとうございました
101デフォルトの名無しさん:04/11/03 16:40:36
(;´Д`)…
102デフォルトの名無しさん:04/11/03 18:54:37
Windowsアプリケーションを作りたくてプログラミングを勉強しはじめてC++の基礎を
だいたい知ったのですがこの先APIをすっとばしてMFCから学び始めるってのはアリなんでしょうか?
103モモ:04/11/03 18:56:32
>>102
API を先に勉強するほうがいいと思うよ。
MFC ってこの先将来性あるのかな。
104デフォルトの名無しさん:04/11/03 19:19:04
MFCってなんですか?
105デフォルトの名無しさん:04/11/03 19:36:45
MFCは使わない方がいいんじゃない?
106モモ:04/11/03 19:37:49
>>105
そう?何を使うほうがいいと思う?
私は BCB が好きだが。
107デフォルトの名無しさん:04/11/03 19:40:00
GTK+。
Windowsは使わない。
108デフォルトの名無しさん:04/11/03 19:41:02
>>106
う〜ん、生Win32APIかな。
109デフォルトの名無しさん:04/11/03 19:42:50
API->WTLが良いと思う。
Win32系は全部将来消えることが確定してるから(MFCのようにやたら無意味に)苦労して覚える必要は無いと思う。
110モモ:04/11/03 19:43:39
>>108
Win32 API だけって、実際の製品開発で使われているのかな?
Win32 API だけにするぐらいなら MFC 使うほうがいくらかましじゃないかい?
111102:04/11/03 19:43:58
>>103 105
ふむふむAPIを勉強しておいたほうがいいんですね。
APIを学ぶ前にCも勉強しておいたほうがいいでしょうか?それともC++の知識があれば十分でしょうか?
112モモ:04/11/03 19:45:48
>>111
C++ は C を含んでいるから、C++ を習得したら C も習得したと思っていい。
113デフォルトの名無しさん:04/11/03 19:49:07
>>110
MFCで作っているアプリケーションは手抜き
114デフォルトの名無しさん:04/11/03 19:58:36
【GUI】wxWidgets(旧wxWindows) その2【サイザー】
http://pc5.2ch.net/test/read.cgi/tech/1097524712/
これ使え
115デフォルトの名無しさん:04/11/03 20:18:14
>>109
>Win32系は全部将来消えることが確定してるから

(゚Д゚)ハァ?
116デフォルトの名無しさん:04/11/03 20:25:04
オンラインゲームなどにあるチャット機能を作りたいと思ってるんですが、
IME制御の方法がよくわかりません。
サンプルも見つからないし;

詳しい方教えてください
117デフォルトの名無しさん:04/11/03 21:09:16
スレ違いかどうかもわからん椰子がまともなものを作れるとは思えんが…
118デフォルトの名無しさん:04/11/03 22:44:55
何行くらいになったらcppファイルを分割したほうがいいですか?
今のcppファイルは10000行近くあります
分割した方がいいかな?
119デフォルトの名無しさん:04/11/03 22:47:00
>>118
クラス単位で分割。
120デフォルトの名無しさん:04/11/03 22:47:21
行数で分けるな。
機能で分けろ。
121デフォルトの名無しさん:04/11/03 22:49:13
うわぁ…1関数1000行とかあったりして。
122デフォルトの名無しさん:04/11/03 22:51:09
>>119
>>120
クラスは使ってないので関数単位で分けるんですかね?
関数の数も10個くらいあるので分割すると10ファイルもできちゃいそうなんですが
それでもいいのでしょうか?
123デフォルトの名無しさん:04/11/03 22:52:07
>>122
分割する必要は無い。

捨てろ。
124デフォルトの名無しさん:04/11/03 22:52:53
>>121
一関数につき千行以上あります
一つの関数はなるべくコンパクトにまとめたほうがいいんですか?
125デフォルトの名無しさん:04/11/03 22:53:38
>>123
捨てれませんw
126デフォルトの名無しさん:04/11/03 22:56:01
>>124
捨てろ。そして書き直せ。
127デフォルトの名無しさん:04/11/03 22:57:57
プログラミングを捨てるか、ファイルを捨てるか
漏れは前者をお薦めする
128デフォルトの名無しさん:04/11/03 23:01:35
>>124
通りすがりの俺ですら捨てることをお薦めするぜ
129デフォルトの名無しさん:04/11/03 23:07:17
なんで捨てなきゃいけないんですか?
理由を教えてください
130デフォルトの名無しさん:04/11/03 23:07:54
プログラミングやめる、という手もあるぞ。
131デフォルトの名無しさん:04/11/03 23:08:35
さすがにつりだろうなぁ。
天然だとしたら10年ぐらい植物人間してたのかね?
132デフォルトの名無しさん:04/11/03 23:10:15
マジレスお願いします
133デフォルトの名無しさん:04/11/03 23:10:28
いや、でもリアルであって欲しいってちょっと期待しちゃうな('A`*)



そのソースを渡されたら即効その組織から抜けるが
134デフォルトの名無しさん:04/11/03 23:12:28
それ以上縮めようのない関数が多いので1000行超えてるんです
135デフォルトの名無しさん:04/11/03 23:13:26
ほれ
http://www.pro.or.jp/~fuji/mybooks/cdiag/
これも初版は10年以上前だぞ。
136デフォルトの名無しさん:04/11/03 23:13:30
初心者だから仕方がないです
137デフォルトの名無しさん:04/11/03 23:13:45
何するプログラムなの?
138デフォルトの名無しさん:04/11/03 23:14:13
縮めようが無いなら、そのままにしとけ。
139デフォルトの名無しさん:04/11/03 23:15:57
>>137
移動ルーチンです
140デフォルトの名無しさん:04/11/03 23:19:21
1000行より縮めようの無い関数なんて有り得ないな。
141デフォルトの名無しさん:04/11/03 23:20:00
初心者ならそのコードは捨てて1から勉強しなおすべきだな。
まだやり直しはできるだろう。
142デフォルトの名無しさん:04/11/03 23:21:46
移動ルーチン??
データファイルにでも追い出せそうなことをずらずらハードコードしてるとか?
143デフォルトの名無しさん:04/11/03 23:24:44
条件1の場合
条件2の場合



という風に条件文がおおいので行数が多くなるんです
一行あたりの文字数は少ないですが
144デフォルトの名無しさん:04/11/03 23:27:48
(´-`).。oO( 「条件別に関数化」とかは考えないんだろうか・・・・
145デフォルトの名無しさん:04/11/03 23:29:43
(´-`).。oO(そろそろ"大漁"のAA登場してもいいんじゃないかな…
146デフォルトの名無しさん:04/11/03 23:31:15
まさか藤原の翁の本のネタの如く、マウス座標の条件分けしてたりしないだろうなぁ。
147デフォルトの名無しさん:04/11/03 23:33:47
>>144
関数にすると引数とかプロトタイプ宣言とかしないといけないんであまりやってませんでした
条件別にしたら一関数500行程度に収まりそうです
関数が多いと関数名考えないといけないのでそれもめんどくさいです
英語での銘々は苦手です
148デフォルトの名無しさん:04/11/03 23:34:59
関数1つにつき25行までとする。
149デフォルトの名無しさん:04/11/03 23:36:15
>>148
まじっすか?
関数が増えすぎると逆にぶちぶち切れててわかりずらくありませんか?
150デフォルトの名無しさん:04/11/03 23:36:59
>>149
おまえプログラミングに向いてないわ

プログラミングを捨てる

これが正解だな
151デフォルトの名無しさん:04/11/03 23:37:26
漏れには何も見えない
透明あぼーん設定してるわけでもないのに


あれ?なんか記憶が飛んでしまってるのかな…
152デフォルトの名無しさん:04/11/03 23:44:40
>>149
関数が全部自分の頭に入る程度でなくてどうやってメンテナンスするんだ?
よっぽど優秀なエディタを使っているかよっぽど非効率なことやってるかどっちかだとは思うが。
153デフォルトの名無しさん:04/11/03 23:46:25
>>149
とりあえず>>135を全部読むまでもう書き込みするな。
ってか、まともに勉強してたら「関数は一目で把握できる長さ」って
常識なのだが。
いったいどういう勉強してきたのかね。
154デフォルトの名無しさん:04/11/03 23:46:44
なんか一瞬そのソースを見てみたくなったぞ

一瞬だけな
155デフォルトの名無しさん:04/11/03 23:52:44
>>152
できるだけ関数化してサイズを小さくしてみます

ソース分割する際に分割したソースファイルをフォルダに分けて管理したいんですが
勝手にフォルダにファイル入れてもコンパイルしてくれるんですか?
ファイルのパスとかも指定しないといけないんですかね?
156デフォルトの名無しさん:04/11/03 23:55:18
>>153
早速読んできます
157デフォルトの名無しさん:04/11/03 23:55:59
>>155
しないといけないです。
158デフォルトの名無しさん:04/11/04 00:01:54
大学生で、しかも研究室に所属してると予想
もしそうなら、もうじき社会へ旅立つのか…ガクブル
159デフォルトの名無しさん:04/11/04 00:07:21
どっちっつうと、WEBの入門サイト読んで我流で勉強って気がする。
研究室なら周りから教えてもらえるからここまで酷くはならないだろう。

>>155
使ってる開発環境なりコンパイラなりのヘルプ嫁。
その前にまともな入門書をきちんと読め。
160デフォルトの名無しさん:04/11/04 00:09:13
forでループすりゃ済むことを延々と展開してるとかね
161デフォルトの名無しさん:04/11/04 00:09:38
関数化させる意味とかが分かって無いと
本気でこれ以上プログラム書くのはやめて勉強しなおした方が良いと思う

あとmakefileの存在忘れないであげて
162デフォルトの名無しさん:04/11/04 00:09:52
>>157
なるほど、パスの指定法をしらべてみます
>>158
>>159
趣味でやってるだけです我流です
163デフォルトの名無しさん:04/11/04 00:10:14
書籍代はケチらんようにな
未来への投資だと思えば安い安い
164デフォルトの名無しさん:04/11/04 00:11:41
しかし何でこういう質問する椰子ってageるんだろね
165デフォルトの名無しさん:04/11/04 00:14:21
質問のときはageろというローカルルールのあるスレが2chに存在するから
166デフォルトの名無しさん:04/11/04 00:15:55
質問のときにageるのはまったく問題ない。
167デフォルトの名無しさん:04/11/04 00:16:28
というよりage,sage知らないのが大半だと思う
168デフォルトの名無しさん:04/11/04 00:17:44
「質問のときはageろ」と「質問者はageろ」とは違う。
169デフォルトの名無しさん:04/11/04 00:26:31
誰かマジで教えて。
サンプルある場所でもいいから。
MSDNみたけど、サンプルがないんですよ
>>116
170デフォルトの名無しさん:04/11/04 00:32:07
>>169
サクラエディタのソースでも参考にしたら?
171デフォルトの名無しさん:04/11/04 00:43:27
この辺でぐぐれ

imm32.dll

ImmGetContext
ImmSetOptionStatus
ImmReleaseContext
172デフォルトの名無しさん:04/11/04 02:55:37
IME の返信ありー
検索して調べてみます
173デフォルトの名無しさん:04/11/04 12:07:27
>>17
そうか。
ということは、参照渡しで参照メンバを初期化する場合は、
暗黙の型変換が起こらないように気をつけるか、それを監視する
コードが必要なわけですね。

どうやって監視すれば良いのか、ちと考えてみます。
細部にまでわたるご指摘、ありがとうございました。

# とりあえず explicit 宣言周りから調べてみます。

# コンストラクタで size 関数を呼び出して、STL コンテナに
# 型を制限するのは簡単なのですが、静的配列にも使えるように
# するのが一応のゴールなのです。配列型を struct でラップする
# しかないのかなあ。
174デフォルトの名無しさん:04/11/04 12:08:54
VC6を使って、UNICODE変数をファイル出力行いたいと思っています。
ファイル出力形式はS-JISでもUNICODEでもいいのですが
変数がUNICODEなのでその方が楽だと思ってUNICODEで出力しています

wchar_twszTest[1000];
FILE *fp = _wfopen( L"c:\\temp\\aa.txt", L"w" );
fputws( L"AAAあいうえおBBB", fp );
fclose( fp );

と実行するとファイルには "AAA" しか出力されず、全角文字以降が無視されています
何を間違えているのかわからないのです。誰か教えて下さい
175デフォルトの名無しさん:04/11/04 12:20:53
たぶん
setlocale( LC_ALL, "Japanese" );
176174:04/11/04 12:27:14
>>175
ありがd
即解決しますた
177デフォルトの名無しさん:04/11/04 14:22:37
VC++.NETを使っています。
最初から使わないことが分かっている関数をビルド時に
無視することは可能でしょうか?
(したい処理によって#defineで定義した値Tを変えてビルドして
いますが、処理によっては使わない関数もコンパイルするのは時間が
(10秒もしないですが)掛かるような気がして…。)
178デフォルトの名無しさん:04/11/04 14:24:54
VC良く知らんが、ソースファイル分けておけば変更が無い分はコンパイルされないのでは?
179デフォルトの名無しさん:04/11/04 14:37:16
コンボボックスについて聞きたいのですが、何個かデータが
コンボボックスにある状態で、右の矢印を押すと今は
一つしか表示されません。それを、ずらぁーっと下に表示
させることは可能でしょうか?教えてください。
180デフォルトの名無しさん:04/11/04 14:42:07
出来るぽ。
181デフォルトの名無しさん:04/11/04 14:55:14
コンソールアプリをvisual C++6.0でしこしこ作ってるんですが、
よくあるiniファイルを扱うソリューションは用意されているんでしょうか?
もしなければどう扱うの一般的ですか?
182デフォルトの名無しさん:04/11/04 14:57:11
そりゅーしょん?
GetProFile系のAPIでやっとれ
183177:04/11/04 14:57:59
>178さん
ソースコードは分けています。
そーすか(ベタで済みません^^;)、変更はされないのですかね。
でも、ヘッダーファイルで#defineした部分は全てのファイルで
書き換えられているのかなぁという気がします。
184デフォルトの名無しさん:04/11/04 15:09:55
>>183
ソースファイルを変更した場合、そのファイルのみ再コンパイルされる。
インクルードファイルを変更した場合、そのファイルをインクルードしているソースファイルが再コンパイルされる。

>>179
ダイアログエディタで▼をクリックしてから枠をドラッグしてサイズ調整。
185デフォルトの名無しさん:04/11/04 15:20:55
>>182
おお、こんなんがあるんですね。ありがとう。
186181:04/11/04 15:51:15
と、思ったのですが出来なそうですね。
CWinApp::GetProfileXXXというのがあるようですが、NT系だと
レジストリを使うようです。
187デフォルトの名無しさん:04/11/04 16:07:37

GetPrivateProfile〜
188デフォルトの名無しさん:04/11/04 16:10:42
189デフォルトの名無しさん:04/11/04 16:20:13
>>186
MFCでもレジストリ使わないでiniにできるよ。
CWinApp::SetRegistryKey を呼はないようにする。
190181:04/11/04 16:35:10
みなさんありがとう。
APIとかMFCとか使ったことないのでそれから勉強してます。
ヘルプ見ても何がなにやら・・・。
191デフォルトの名無しさん:04/11/04 16:40:03
>>173
>配列型を struct でラップするしかないのかなあ。
boost::array
192デフォルトの名無しさん:04/11/04 18:57:53
C++のスタイルで、みなさんはどれですかー?

1.
a void func( int a ); b void func(int a);
2.
a int GetNumber(); b bool GetNumber(int *n);

どれが一番主流なんだろう。
193デフォルトの名無しさん:04/11/04 19:03:33
いや、全然わからん
何を対比させてるんだ。
194デフォルトの名無しさん:04/11/04 19:04:06
>>192
1,a
2,a

1は正直どうでもいいが、
2の問いが意味不明だな。例外失敗する可能性あるなら例外飛ばせばいいんでね?
てかポインタじゃなくて参照に汁。
195デフォルトの名無しさん:04/11/04 19:23:19
回答者に感謝!

さらに質問
あとできれば、回答者のプログラミングレベル教えてください。( 自己分析で )

3. (空白関係なし)
a. POINT GetNum(); b. bool GetNum(int *x, int *y);

4 戻り値がbool の関数と intなどの値を返す関数 を混同して自作する
( int などのとき、あらかじめエラー値をきめておく。正常値はプログラムで使われる )
a しない b する
196デフォルトの名無しさん:04/11/04 19:48:30
なんか知障が沸いてるみたいだな
197デフォルトの名無しさん:04/11/04 19:50:21
>>196 ---> >>196
198ジゴロウ:04/11/04 20:12:23
はじめまして。

質問です。
@BCB5で、WindowsXPのビジュアルスタイルにする方法はありますか?
Aあれば、どうすればできますか?
以上のこと教えてください。お願いします。
199デフォルトの名無しさん:04/11/04 20:15:11
200デフォルトの名無しさん:04/11/04 20:27:22
>>195
3 bool GetNum(POINT& rpt);
4 bに近い。boolとvoidとの混同になる。
201ジゴロウ:04/11/04 20:34:45
>>199
早速ありがとうございます。
関係ないところばかり探していました。
202デフォルトの名無しさん:04/11/04 20:58:59
>>200

Thanks !

>>194の人とは違う人っぽい。。。 どっちがいいんだろう。
203デフォルトの名無しさん:04/11/04 22:14:42
スレタイに初心者歓迎って書いてたんで覗いてみたら・・。
漏れのような超初心者が来るようなところじゃ無かったよorz
別スレ探してきまつ。(´・ω・`)
204デフォルトの名無しさん:04/11/04 22:15:46
>>203
歓迎するよ〜
いらっしゃい〜
205デフォルトの名無しさん:04/11/04 22:19:51
ほとんど返信こなくて 全然統計取れない;;;;;;;;;;;;;;;;
206デフォルトの名無しさん:04/11/04 22:26:13
そりゃあんな変なノリで聞かれちゃ
ネタにしか思えんし、答える気も失せる


そもそも質問の意図も意味も伝わっとらんしな
207デフォルトの名無しさん:04/11/04 22:30:16
回りくどくいってきたんだけど、ようはC++のスタンダードなスタイルがしりたいんですよ
会社にはいって、個性あるプログラムだねぇといわれたくないもので。
208デフォルトの名無しさん:04/11/04 22:34:39
>>207
正直見づらい上にバラバラに聞いてるからなぁ‥‥

せめて↓な感じで書けばまだ見やすいんだが‥‥
3. (空白関係なし)
 a:. POINT GetNum();
 b: bool GetNum(int *x, int *y);
209デフォルトの名無しさん:04/11/04 22:37:33
コーディング規約 第2条
http://pc5.2ch.net/test/read.cgi/tech/1068752664/l50
C/C++ Coding Style Thread
http://pc5.2ch.net/test/read.cgi/tech/1096687703/l50
C++相談室 part37
http://pc5.2ch.net/test/read.cgi/tech/1098543578/l50

この辺ならそういう話題を結構取り扱っている
けど、コーディングの規則は会社や仕事依頼元に左右され
必ずしも画一的ではない


と、今まで↑のスレ読んできた限りでは、学生風情の漏れはそう判断した
210デフォルトの名無しさん:04/11/04 22:42:06
>>209
おお さんきゅ〜〜〜

こんなすれがったのかーーー
まじありがとーー
211デフォルトの名無しさん:04/11/05 00:53:22
>>210
おまえさん、会社に入る=就職するつもりならコーディング規約より先に
まともなコミュニケーション能力をつける必要があるぞ。
212209:04/11/05 01:22:50
漏れも書き込んだ後にそう思った
オンラインゲームかチャットかの雰囲気そのままここに持ってきた感じだよな
213デフォルトの名無しさん:04/11/05 01:30:05
>>212
あんたは、なにいまさらいってるんだよ
ここはオンラインゲームかチャットよりもひどい板だろ
214デフォルトの名無しさん:04/11/05 02:51:22
プログラム中の特定の箇所に限って

open("mona/giko", O_RDONLY);

がなぜか 0 を返す・・・。
他とナニが違うから、よりによって 0 を返すのか見当も付かない・・・。

open(2) 関数@Vine Linux and Cygwin でつ。
215デフォルトの名無しさん:04/11/05 03:28:41
>>214
オープンハンドル使い切ってたりしない?
216214:04/11/05 07:57:35
>>215
エラーなら open() は -1 を返すはずなんですよねえ。

0 という値自体は有効なものなんだが、それは本来は標準入力を表すファイル記述子のはず・・・。
いったいどんな状況に open() がこんな値(0)を返すのか、man とか見ても
さっぱり分からない。
217デフォルトの名無しさん:04/11/05 08:30:13
質問よろしいでしょうか。
For next文の実行中で
何かのキーが押された時に、
実行を中止するにはbreak以外の方法はありますか?
breakってあまり使いたくないので…。
よろしくお願いします。
218デフォルトの名無しさん:04/11/05 08:40:39
For next文って…BASICか何かと勘違いしてるのか?
それはともかく、好き嫌いは知らないがほかの方法(gotoなど)を
使われても周りは読みにくくて迷惑するんじゃないのか?
219デフォルトの名無しさん:04/11/05 08:42:43
longjmp
220デフォルトの名無しさん:04/11/05 08:43:06
throw
221デフォルトの名無しさん:04/11/05 08:45:18
後藤
222デフォルトの名無しさん:04/11/05 08:46:42
exit
223デフォルトの名無しさん:04/11/05 08:54:37
>>217
こいつVBの質問を誤爆してると思う。
breakってbreakキーのことじゃないのか?
224デフォルトの名無しさん:04/11/05 09:28:11
if(条件式)
{
 while(条件式)
 {
  if(条件式)
  {
   //正常処理
   goto END;
  }
 }
 //異常処理
 return;
}

//正常処理

END:
//必要な後始末

上記の様な感じでgoto文使うのは一般的に問題があるようなgotoの使い方でしょうか?
ちなみに2箇所の正常処理部分は一部処理内容が異なります。
225デフォルトの名無しさん:04/11/05 09:38:25
if(!条件式)
{
 //正常処理
}
else
{
 while(条件式)
 {
  if(条件式)
  {
   //正常処理
   break;
  }
 }
 //異常処理
 return;
}

//必要な後始末
226デフォルトの名無しさん:04/11/05 09:39:33
おいおい
227デフォルトの名無しさん:04/11/05 09:44:30
「一般的」なんて曖昧な物シラネ
宗教問題起こしたいんじゃなければ、好きにしろとしか
228デフォルトの名無しさん:04/11/05 09:47:03
whileの中に正常処理(1)を入れているのが変。
正常処理(1)、正常処理(2)、異常処理、後始末をそれぞれ関数にしちゃえばすっきりするだろうし。
229コピペ推奨:04/11/05 10:09:34
■ユダヤと朝鮮人の蛮行

○2チャン運営は創価と統一が乗っ取った!....朝鮮宗教派遣の2チャン運営が削除
http://ex5.2ch.net/test/read.cgi/accuse/1096781624/l50

○2チャン運営は、創価と統一の朝鮮人脈に乗っ取られた!....宗教鮮人がスレスト
http://qb5.2ch.net/test/read.cgi/operate/1096699253/l50
230デフォルトの名無しさん:04/11/05 10:12:50
if(条件式)
{
 while(条件式)
 {
  if(!条件式)
  {
   //異常処理
   return;
  }
 }
}
//正常処理

231デフォルトの名無しさん:04/11/05 12:29:15
このスレで初めて質問させていただきます。
今後もお世話になる確率が非常に高いので宜しくお願いします。

クラスAを用意し、メンバー関数(a,b,c)を3つほど作りました。
派生クラスはありません。

そのメンバ関数aの中で、動的変数を配列で定義したのですが、
b,cで認識してくれません。

これは常識なのでしょうか。
つまらない質問だろうとは思いますが、返答をもらえれば幸いです。
追加で、クラス内で動的変数を定義する為にはどうしたらいいかも教えていただければ幸いです。
232デフォルトの名無しさん:04/11/05 12:44:50
>>231
ソースを手短に書き込んでくれ
233デフォルトの名無しさん:04/11/05 12:56:54
> 動的変数を配列
動的変数ってなんじゃワリャー
234デフォルトの名無しさん:04/11/05 12:58:05
って、まさかと思うがメンバ関数a内の自動変数(ローカル変数)が
メンバ関数b、メンバ関数cで見えないなんて事を言ってるわけじゃないよな?
235231:04/11/05 13:08:47
>>234
あぁ・・・まさにその通りでした。
言われて気づきました。
申し訳ないです。クラス以前の問題でしたね。ありがとうございました。
>>232さん、お騒がせしました。

そしてもう一つ問題が出てしまいました。

class A の private の中で、変数を定義し、同時に数値を代入すると
class A{
private:
int aaa=0;
関数でない識別子が純粋関数であると指定されています。とコンパイルエラーになってしまいます。

使い方がおかしいのでしょうか。
236デフォルトの名無しさん:04/11/05 13:11:41
メンバ変数の初期化はコンストラクタで。
237231:04/11/05 13:15:23
>>236
なるほど、そこでコンストラクタの出番なのですね。
ちょっと知識がつながった気がしました。
ありがとうございました。
238デフォルトの名無しさん:04/11/05 13:16:54
・・・
239デフォルトの名無しさん:04/11/05 13:18:01
>>238
落ち着け。
ここは初心者歓迎なスレだ。
240デフォルトの名無しさん:04/11/05 13:40:31
俺最初は、こういう質問に答えようとここに来たよ。
1スレ読んだ後、質問側に回ることにしたけど。
241デフォルトの名無しさん:04/11/05 14:15:03
#include <stdio.h>


int main()
{
int a,b,c;
a=b=0;
c=a+b;
a=b=1;
printf("%d\n" , c);
}
とすると0が表示されます
aとbに1を代入してるから
cは2になるはずなのになんでですか?
242デフォルトの名無しさん:04/11/05 14:20:06
処理が上から下に流れるから
243デフォルトの名無しさん:04/11/05 14:22:33
>>241
お前の考えだと、a=b=0; とa=b=1; が
矛盾してるというか相反すると思いませんかー
244デフォルトの名無しさん:04/11/05 14:24:55
>>242
>>243
レスありがとうございました
なぜかふと、疑問に思ってしまいました
時々、基本中の基本をど忘れすることがありまして
アルツハイマーぎみですw
245デフォルトの名無しさん:04/11/05 14:44:30
病院行って脳の検査しる
246デフォルトの名無しさん:04/11/05 14:45:42
>>235
int aaa=0;
これは代入でなくて初期化。
そしてクラス定義内で初期化できるのはstaticな整数のみ。
247デフォルトの名無しさん:04/11/05 14:47:13
↑訂正
×staticな整数
○staticなconst整数
248デフォルトの名無しさん:04/11/05 14:50:49
整数?
249デフォルトの名無しさん:04/11/05 15:39:57
>>248
『プログラミング言語C++第3版』 10.4.6.2
「静的な整数の定数メンバは、メンバ宣言に constant-expression 初期設定子を
追加することによって初期設定することもできる。」
250デフォルトの名無しさん:04/11/05 17:18:05
同書に「浮動小数点を宣言したくなる誘惑」なんて書かれていますが。
どうしてfloatやdoubleはだめなのですか?
251 :04/11/05 17:50:12
gcc34 (GCC) 3.4.0 (Red Hat Linux 3.4.0-1)

実践MySQL4 に書いてある Cクライアントのサンプルコードを入力してコンパイルしてみると

/usr/include/mysql.h:59:21: typelib.h: そのようなファイルやディレクトリはありません

typelib.hというインクルードファイルはどこで提供されているのでしょうか?
mysqlの方にはついてなかったと思うのですが、
一応ディスク内は検索してみましたがありませんでした。
gccの方で標準的に提供しているでしょうか?

252デフォルトの名無しさん:04/11/05 18:44:28
auto_ptrについてなんですが、ちょっと気になることがあります。

auto_ptr<int> p1(new int), p2;

p1.release();

p2 = p1;
とするとVC6付属のSTLでは所有権のみの移動なのですが
STLPortでは所有権だけでなくp1が保持するポインタもヌルになります。
規格が新しくなってこうなったのだと思いますが
どういう意図でポインタもヌルになるようになったのでしょうか?
253デフォルトの名無しさん:04/11/05 18:44:41
>>251
ttp://bugs.mysql.com/bug.php?id=4168

ここによると最新版では修正されているらしい。(これはWin版の記事だけど)
254217:04/11/05 20:07:31
お返事遅れて申し訳ありません。
元々VBを使っているので間違えてしまいましたが、
意図を汲んでくださってありがとうございます。
感謝します。

C言語を勉強した中で、
breakやgotoは使ってはいけないような気になっていたのですが
色々なソースを見ているとgotoよりもbreakで抜けてしまったほうが
わかりやすいみたいですね。

longjmpも面白そうですが、初心者なのでbreakを使ってみようと思います。
どうもありがとうございました!!

また何かわからなくなったら教えてくださいー
(ゲームに挑戦中ですw)
255デフォルトの名無しさん:04/11/05 20:27:58
void hoge1(int a[]);

main
{
int b[10];
hoge(b);
}
void hoge(int a[])
{
a[1]=1;
}
だと配列b[1]が1に書き換えられてしまうのですが
配列bが関数hoge内で書き換えられないようにhogeに配列bを渡すにはどうすればいいのでしょうか?
256訂正します:04/11/05 20:28:38
void hoge(int a[]);

main
{
int b[10];
hoge(b);
}
void hoge(int a[])
{
a[1]=1;
}
だと配列b[1]が1に書き換えられてしまうのですが
配列bが関数hoge内で書き換えられないようにhogeに配列bを渡すにはどうすればいいのでしょうか?
257デフォルトの名無しさん:04/11/05 20:37:39
>>256
void hoge(const int a[])
258デフォルトの名無しさん:04/11/05 21:34:15
>>257
別の場所で配列bの内容を書き換えたいのでそれはちょっと・・・



for (i=0; i<10; i++)
  {
b[i] = a[i];
}
hoge内で上のようにコピーするしかないのでしょうか?
変数を関数に渡した時は元の変数が勝手に書き換えられることがなかったのでちょっと不思議です
259デフォルトの名無しさん:04/11/05 21:54:00
>>258
C++ならvectorとかのコンテナを使えば可能
260デフォルトの名無しさん:04/11/05 22:02:04
>>259
vectorは難しそうなんで>>258の方法で地道にコピーしてみます
261デフォルトの名無しさん:04/11/05 22:27:46
>>260
あんまり難しくもないんだけどね
参考までにあなたのやりたいことはこんな風に書ける(それ以外もちょっと修正したけど)
#include <vector>
using namespace std;
void hoge(vector <int> a);
int main ()
{
vector <int> b (10);
hoge(b);
return 0;
}
void hoge(vector <int> a)
{
a[1]=1;
}
262デフォルトの名無しさん:04/11/05 22:34:04
>>260
俺もせっかく書いたので・・・

#include <vector> // ← STLのvectorを使うため

void hoge(std::vector<int> a);

int main()
{
  std::vector<int> b(10); // ←要素数10の配列だと思ってもらっていい
  hoge(b);
}

void hoge(std::vector<int> a) // ←ここの配列aは配列bのコピー
{
  a[1]=1; // ← コピーなので配列aの中身を書き換えても配列bの中身は書き換わらない
}

書き換えたい場合は参照渡しにすればOK
263デフォルトの名無しさん:04/11/06 01:34:13
>>261
>>262
ご説明ありがとうございます
早速試してみます
264デフォルトの名無しさん:04/11/06 07:47:02
class/structのstaticメンバの質問です。
--- aaa.hpp ---
struct AAA
{
 static const int table_aaa[];
 void a( )
 {
  //ここでtable_aaa[]にアクセス
 }
};
--- aaa.cpp ---
const int AAA::table_aaa[]=
{
 //色々
};
--- main.cpp ---
int main( )
{
 AAA aaa;
 aaa.a( ); // ※
}

※の部分に関してですが、
MinGWでは、AAA のstaticメンバ(table_aaa[])に対しての
undefined reference が発生しますが、
VCToolkit2003では、通ります。

どちらが正しいのでしょうか?
265264:04/11/06 08:08:24
makefileを間違えていました。

申し訳ありませんでした。
266デフォルトの名無しさん:04/11/06 09:57:23
>>259-262

>変数を関数に渡した時は元の変数が勝手に書き換えられることがなかったのでちょっと不思議です
>vectorは難しそうなんで>>258の方法で地道にコピーしてみます

こんなこと言ってる奴に教えても無駄だと思われ
267デフォルトの名無しさん:04/11/06 11:38:33
ソースファイルを分割した後に実行したら
hoge.exeの0x00401009でハンドルされていない例外が発生しました
0xc0000005:場所0x00030bcに書き込み中にアクセス違反が発生しました
と言うエラーが出ました
分割するのに必要なとこだけしか変更してないのになんででしょうか?
268デフォルトの名無しさん:04/11/06 12:32:57
エスパーさん出番ですよ。
269デフォルトの名無しさん:04/11/06 12:45:25
♪「好きよ」と言い出せないうちに、貴方のロッカー奪ったLove-letter
270デフォルトの名無しさん:04/11/06 12:48:16
依頼人は嘘をつく
271デフォルトの名無しさん:04/11/06 13:39:52
>>267
ワトソン博士のログファイルなんかから
場所と原因を特定してみるのも面白いぞ。
練習だと思ってやってみ。
272デフォルトの名無しさん:04/11/06 14:10:32
ワトソン、インスコ直後に機能切ってるよ…('A`)
273デフォルトの名無しさん:04/11/06 14:20:21
#define DEBUG TRUE
は同じファイル内だけで有効なのか・・・
ファイルごとにオンオフすんのめんどくさいな
274デフォルトの名無しさん:04/11/06 14:23:26
普通、コンパイラにはコマンドラインオプションとしてマクロ定義が可能なんで、
IDEのプロジェクト設定なりmakeいじるなりすれば全ファイルのコンパイル時にマクロ定義できる。
275デフォルトの名無しさん:04/11/06 14:23:27
そういうときは全てのファイルでインクルードするヘッダに#defineを書けばいい。
276デフォルトの名無しさん:04/11/06 15:03:56
ソース内に埋めると消し忘れる原因になるからIDEならビルドごとに設定、
Makefileならターゲットごとに設定するのが基本。
277デフォルトの名無しさん:04/11/06 15:17:02
(;´Д`)ウウ・・C++builder6を購入してやりだしたのはいいのですがイキナリ詰まりました。
とりあえず自分で関数を作ってみようと下記のようにしたのですが
どうやったらこのエラーを修正できるでしょうか。。

[リンカ エラー] 外部シンボル 'TForm1::message()' が未解決(C:\BUILDER\PRACTICE\1106\UNIT1.OBJ が参照)

ソースは下記のようにしました。
ヘッダふぁいる。
class TForm1 : public TForm
{
__published:// IDE 管理のコンポーネント
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private:// ユーザー宣言
public:// ユーザー宣言
__fastcall TForm1(TComponent* Owner);
void message();
};
cppふぁいる。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
message();
}
void message()
{
ShowMessage("通ったよ");
}


278デフォルトの名無しさん:04/11/06 15:25:23
void message()
→void TForm1::message()
279デフォルトの名無しさん:04/11/06 15:34:00
むしろこっちの薬缶

class TForm1 : public TForm
{
__published:// IDE 管理のコンポーネント
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private:// ユーザー宣言
public:// ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};

void message();
280276:04/11/06 15:44:04
>>278さん
(・∀・)ありがとーございます。

クラスの中に入っているときには「クラス名::関数名」ってやればいいんですね。

逆に言うとTFormのクラスの外に関数のプロトタイプ宣言を出してやれば。
関数の名前にTForm::ってつけなくてもいいみたいですね。。

(・∀・)一つ進化した気がする。
281デフォルトの名無しさん:04/11/06 15:47:39
>>280
とりあえずC++の入門書読みなさい。
282277:04/11/06 15:51:05
・・・(;´Д`)ウウッ… 277だった。

>>279さん
(・∀・)ありがとーございます。

後なんとなく、クラスにおけるpublicとかprivateとかイメージがつかめてきた気が。。

今まで無茶苦茶曖昧だった。。
283デフォルトの名無しさん:04/11/06 20:59:05
3ヶ月くらい前に、とあるスレでC++を学ぶならCをある程度理解してから、と言われました。
とりあえず猫でも分かるシリーズ3冊読みました。
そろそろC++やりたいんですけど、いい入門書あれば教えてください。
284デフォルトの名無しさん:04/11/06 21:02:20
Cをやってしまったのならば最初からバイブルでもいいんじゃないか?
ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X/
285デフォルトの名無しさん:04/11/06 21:03:24
>>283
似たような質問ばかり見るんだけど、ちゃんと適当なスレを探している?
さんざん既出で、もうその質問にはうんざりなんだけど。
286デフォルトの名無しさん:04/11/06 21:55:34
Windows 2000 の環境下で作成したC/C++のアプリケーションを
Windows XP や Windows 2003 Server の環境下で実行することはできますか?

簡単なテキストファイルを編集したり、ファイルを検索したりコピーしたりする
アプリケーションを作ろうと考えています。
287デフォルトの名無しさん:04/11/06 22:10:01
>>286
普通はOK
288デフォルトの名無しさん:04/11/06 23:25:53
>>287
サンキューです。
Cの経験はほとんどないですが、勉強がてら作ってみようと思います。
289デフォルトの名無しさん:04/11/06 23:37:26
>>283
本を何冊も読むより、自分でコードを書いた経験がはるかに大事だよ。
猫3冊読んだだけじゃ、経験値は0みたいなものだな。

↓C++の定番入門書。
http://www.amazon.co.jp/exec/obidos/ASIN/489471115X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/
ダイテル本は全3冊

どちらかを勉強したら、自分でコードをガシガシ書いて経験値を上げた後>>284を。
290デフォルトの名無しさん:04/11/07 00:03:59
>>250
誰かエロイ人
291デフォルトの名無しさん:04/11/07 00:15:32
bmpファイルをpgm形式に変換するプログラムを作るのに参考になるサイトありますか?
292Rubykitch:04/11/07 00:24:48
www.wotsit.org
sf.net
293デフォルトの名無しさん:04/11/07 00:29:54
>>291
PGM作る関数。
前に宿題スレ作った分の残りもの。
void save_pgm( char* filename, unsigned char** image, int xsize, int ysize ) {
FILE* fp;
int x, y;

fp = fopen( filename, "wb" );

fprintf( fp, "P5\n" );
fprintf( fp, "%d %d\n", xsize, ysize );
fprintf( fp, "%d\n", 255 );

for ( y = 0; y < ysize; y++ ){
for ( x = 0; x < xsize; x++ ){
fputc( image[y][x], fp );
}
}

fclose(fp);
}
294デフォルトの名無しさん:04/11/07 00:49:59
>>290
そこ誤訳があるところ。
禿の文意はおそらく(かなりの意訳)
「クラス宣言内でシンボル定数が必要なら列挙を使うようにしろ。
そうすれば変数や浮動少数点数をクラス宣言内で初期化しようとする
ミスは防げる。」
295デフォルトの名無しさん:04/11/07 12:53:19
2変数方程式を入力する関数どうすればいいですか?
2xyとか
296デフォルトの名無しさん:04/11/07 13:03:57
>>295
// こういうこと?
double func2xy(double x, double y) {return 2 * x * y;}
297デフォルトの名無しさん:04/11/07 13:06:03
方程式を入力する関数って言う意味が分からない。
298デフォルトの名無しさん:04/11/07 13:07:35
>>294
結局整数しばりは禿様がなんらかの思想の元きめたことなのですかね
特に深い理由はないのかな。どうもです。
299295:04/11/07 13:08:52
2xy限定じゃなくて任意に式を入力したいんだけど
300デフォルトの名無しさん:04/11/07 13:12:46
つまり、2変数方程式を解きたいんですか?
まず普通の2*3^4とかを入力して、結果を表示するプログラムを作ってみれば良いのでは?
301デフォルトの名無しさん:04/11/07 13:14:03
本当に聞きたいのならもう少し具体的にきちんと説明
302デフォルトの名無しさん:04/11/07 13:19:34
プログラム初心者なら歓迎だが、
意思伝達の初心者だと (このスレを利用するのは) 難しい
303デフォルトの名無しさん:04/11/07 13:24:22
コンパイルしてできた、実行ファイルを
バイナリエディタとかで開くと、使ったコンパイラの情報が入ってますよね?
それをなくしたいんですけど、どうやったら良いですか?
304デフォルトの名無しさん:04/11/07 13:28:55
2ちゃんねるの悪体質は改善せねばなりません。
305デフォルトの名無しさん:04/11/07 13:37:30
304=295
306デフォルトの名無しさん:04/11/07 13:48:19
>>303
ハンドアセンブルすればいいよ
307デフォルトの名無しさん:04/11/07 13:49:10
305=304=295
308デフォルトの名無しさん:04/11/07 13:58:27
>>303
空白か何かで埋める。
309デフォルトの名無しさん:04/11/07 17:18:58
>>303
どんな情報が入ってるの?
シリアルナンバー、使用者の名前、とかの情報も入ってるの?
310デフォルトの名無しさん:04/11/07 17:22:34
>>309
適当にバイナリエディタで見てみたら?
そんなたいしたこと書いて無いよ
311デフォルトの名無しさん:04/11/07 18:12:25
>>299
式のパースをしたいならパーサを書け。lex、yaccなどについて調べよ。
312デフォルトの名無しさん:04/11/07 18:34:06
>>303
gcc -S hoge.c
で出てきたアセンブリ言語のソースで気になるところをチェックして
アセンブラにかければよろし。
313デフォルトの名無しさん:04/11/07 22:01:18
>>306
Cなんだから、ハンドコンパイルって言おうよ。
314デフォルトの名無しさん:04/11/07 22:36:25
>>312
ライブラリの中とかに情報が入ってたりするよ。
315デフォルトの名無しさん:04/11/07 23:39:07
VC6なのですが、F5の実行では出ないで、
Ctrl+F5の実行だと必ず再現するバグって何が原因か心当たりないでしょうか。
いずれもDebugモードです。

「Debugモードでは出ないで、Releaseモードでは出るエラー」だと
初期化のし忘れなどが多いですが、F5とCtrl+F5で挙動が違うのは初めてで、お手上げです。
316デフォルトの名無しさん:04/11/07 23:40:45
>>315
まずその「バグ」の内容を書こうとは思わんのか?
317デフォルトの名無しさん:04/11/08 00:06:05
>>316
それがこみ入ってまして、バッファがおかしいのか、
描画ライブラリの振る舞いなのか、フラグのつけ忘れか、初期化周りか…。

なので有名な「Releaseビルド時にのみ出るバグ」、みたいな常套チェック項目が
無いかなとお尋ねした次第。まぁ幾らぐぐっても無いみたいなので、総ざらいしてきます。
318デフォルトの名無しさん:04/11/08 00:13:55
>>317
初期カレントディレクトリが違ったような気がした。
319デフォルトの名無しさん:04/11/08 00:16:58
>>317
Debugモードは余分にメモリを確保する。
バッファ辺り調べてみるといいかも。
320デフォルトの名無しさん:04/11/08 00:19:23
ちげーだろ
321デフォルトの名無しさん:04/11/08 00:27:25
>>317
F5なら設定でコマンドラインの指定ができる。そこは大丈夫?
322デフォルトの名無しさん:04/11/08 01:25:30
>>318-321
皆さんレスありがとうございます
まだ取れてないのですが、その線で洗い直してみます。

なにせデバッガで追えないので、手がかりは本当に助かります
323デフォルトの名無しさん:04/11/08 05:41:42
(g_diMouseState.rgbButtons[0] & 0x80) ? MState.lButton = true : MState.lButton = false;
これはどういう文なんでしょうか?
?なんていう命令は見たことないのでこの文の意味を教えてください
324デフォルトの名無しさん:04/11/08 06:00:03
325デフォルトの名無しさん:04/11/08 06:06:36
>>323
それは三項演算子というもので、もしそれがコンパイルできるとするなら、
if (g_diMouseState.rgbButton[0] & 0x80) {
  MState.lButton = ture;
} else {
  MState.lButton = false;
}
と等価。
が、普通は?の後ろに式なんか書かない(書けない?)し、下の書き方の方が普通。
MState.lButton = (g_diMouseState.rgbButton[0] & 0x80) != 0;
326デフォルトの名無しさん:04/11/08 06:35:05
>>324
>>325
レスありがとうございます
おかげさまで解決しました
327デフォルトの名無しさん:04/11/08 07:08:22
> 普通は?の後ろに式なんか書かない(書けない?)

いや、そこは式だよ。
328デフォルトの名無しさん:04/11/08 07:19:57
>>327
式じゃないよ
329デフォルトの名無しさん:04/11/08 07:22:52
>>328
エクスプレッションだよ
330328:04/11/08 07:25:33
あー、ちょっと省略しすぎかな。そこにかけるのはleft valueだけ
331デフォルトの名無しさん:04/11/08 07:26:37
>>329
エクスプレッションって式だよ。
332デフォルトの名無しさん:04/11/08 07:28:10
>>331
しってるよ

>>330
なにもかもまちがっている
333デフォルトの名無しさん:04/11/08 07:29:01
なに?こいつ
334デフォルトの名無しさん:04/11/08 07:31:53
「式」って何ですか?
335デフォルトの名無しさん:04/11/08 07:34:18
コレだよ、コレ。
http://www-ccs.ucsd.edu/c/express.html
336デフォルトの名無しさん:04/11/08 07:36:13
つまり、説明できないってことですね
337デフォルトの名無しさん:04/11/08 07:36:18
>>330
なにが省略だ。プッ
left value?プッ
338デフォルトの名無しさん:04/11/08 07:38:58
学校池
339328:04/11/08 07:41:10
あー、なんか俺激しく間違ってるみたいだなorz
いろいろ調べてみるよ。
340デフォルトの名無しさん:04/11/08 07:42:00
初心者向けには、
カッコで囲めるものは全部文法上の「式」である
ってことでいいかい?
341デフォルトの名無しさん:04/11/08 07:57:39
いいよ。
342デフォルトの名無しさん:04/11/08 11:49:24
(display "Hello 式!")
343デフォルトの名無しさん:04/11/08 13:32:55
if( didod[ i ].dwData & 0x80 )
_tcscat( strNewText, TEXT("U ") );

これの条件式の意味を教えてください
&が2個続いてるのしか見たことないので…
344デフォルトの名無しさん:04/11/08 13:36:32
ビット演算のAND
345デフォルトの名無しさん:04/11/08 14:17:55
マウスの押されていたボタンが放されたことを検出するにはどうすればいいのでしょうか?
346345:04/11/08 14:18:55
マウスがドラッグされてるのを検出したいんです
347デフォルトの名無しさん:04/11/08 14:21:09
>>345
環境は? 環境によってかなり異なるので明記されたし。
348345:04/11/08 14:24:15
>>347
windowsXPでVC.netです
349デフォルトの名無しさん:04/11/08 15:04:55
SetCapture
350デフォルトの名無しさん:04/11/08 16:36:55
>>349
早速しらべてみます
ありがとうございました
351デフォルトの名無しさん:04/11/08 16:51:23
typedefの構造体は普通の構造体とどう違うのでしょうか?
352デフォルトの名無しさん:04/11/08 16:58:02
>>351
構造体変数を宣言するときにstructを付ける必要がなくなる。
353デフォルトの名無しさん:04/11/08 16:59:34
>>352
なるほど、解決しました
ご返答ありがとうございました
354デフォルトの名無しさん:04/11/08 17:00:08
>>351
typedefの構造体なんて物はない。
構造体にtypedefで型名をつけることはできるが。
即ち、次はいずれも有効。

/* 無名の構造体 */
struct {
int foo;
double bar;
} st;

/* タグ名つき構造体 */
struct foo {
int foo;
double bar;
};
struct foo st;

/* 無名の構造体に型名を宣言 */
typedef struct {
int foo;
double bar;
} st_t;
st_t st;

>352は必ずしも正解ではないので注意。
355デフォルトの名無しさん:04/11/08 17:29:15
typedef struct が意味を持つのは  C だけ。
C++ では付けても付けなくても違いは無い。
356デフォルトの名無しさん:04/11/08 18:43:35
>>355
C99でも付けなくていいんじゃなかったっけ?
うろおぼえなので違うかもしんないけど
357デフォルトの名無しさん:04/11/08 19:48:41
const RECT a;
a=0;
a=0;
a=0;
a=0;
としてもエラーが出ます
aの座標を初期設定する方法を教えてください
358Ruby!!!!!!:04/11/08 19:50:04
いろいろ死ね」「
359デフォルトの名無しさん:04/11/08 19:50:28
const RECT a;
a.left=0;
a.top=0;
a.right=0;
a.bottom=0;

でした訂正します
360デフォルトの名無しさん:04/11/08 19:52:29
{0, 0, 0, 0}
361デフォルトの名無しさん:04/11/08 19:52:41
それがWindowsのRECT構造体のことであるとするならば、
const RECT a = {left, top, right, bottom};となる。constと指定して
いる以上は初期化以降変更できないことは分かっているんだろうな。
362デフォルトの名無しさん:04/11/08 19:55:30
>>356
ダメのようだ。
363デフォルトの名無しさん:04/11/08 19:55:47
const RECT a = { 0 };
364デフォルトの名無しさん:04/11/08 20:01:31
また少し訂正を加えました
const RECT *a={0, 0, 0, 0};
これでも
error C2078: 初期化子の数が多すぎます。
と言われます
365デフォルトの名無しさん:04/11/08 20:03:30
なんだお前は。
366デフォルトの名無しさん:04/11/08 20:08:01
後から色々訂正するなよ。
それではポインタに対して配列の初期化子で初期化しようと
しているのだから、文句を言われて当然だ。君はポインタに
ついて理解がない。勉強し直しなさい。
もしWindows APIにRECTへのポインタを渡したいという意図で
あるならば、const RECT a = {0, 0, 0, 0};の形式で初期化した後
&aを渡しなさい。とエスパーっぽく語ってみる。
367デフォルトの名無しさん:04/11/08 20:09:11
BOOL ClipCursor(
CONST RECT *lpRect // 画面の座標
);
この関数に渡すための
CONST RECT *lpRect // 画面の座標
を設定したいのです
368デフォルトの名無しさん:04/11/08 20:10:10
怖いね。
369デフォルトの名無しさん:04/11/08 20:14:50
>>366
できました
ありがとうございました
370366:04/11/08 20:17:50
ていうか引数の型がconst RECT*として指定されている分には
渡す側はconst指定しなくていいじゃん
371デフォルトの名無しさん:04/11/08 20:18:52
Cの理解が不十分にもかかわらずWindowプログラムを始めたばっかりに
挫折していった奴を何人も知ってる。
>>369もその一人になるだろう・・・
372デフォルトの名無しさん:04/11/08 20:19:12
const RECT rc = {1, 2, 3, 4};
ClipCursor(&rc);
あるいは
RECT rc;
rc.left = 1;
rc.top = 2;
rc.right = 3;
rc.bottom = 4;
ClipCursor(&rc);

BOOL ClipCursor(CONST RECT *lpRect);
この場合のCONSTは関数内で変数の中身を書き換えないことを意味するのでrcにconstはなくても良い
373デフォルトの名無しさん:04/11/08 21:09:20
>>370
>>372
ご教授有り難うございました
とても参考になります
>>371
そうならないようにがんばりたいと思います
374デフォルトの名無しさん:04/11/08 21:11:58
ちなみにC99の複合リテラルを使うとClipCursor(&(RECT){1, 2, 3, 4});
375デフォルトの名無しさん:04/11/08 21:14:01
>>373
そうならないためにも基礎を飛ばさずC言語からきちんと勉強しろ
376デフォルトの名無しさん:04/11/09 02:04:12
C以前の問題だと思うんだが。
377デフォルトの名無しさん:04/11/09 02:06:58
ΩΩ Ω<な、何だってー!?
378デフォルトの名無しさん:04/11/09 02:14:10
え?僕の好みですか?やっぱ顔がかわいい子がtypedefね
379デフォルトの名無しさん:04/11/09 02:51:42
typedefが流行っていますな。
380デフォルトの名無しさん:04/11/09 03:08:20
>>373
もうそうなってんだよ
381デフォルトの名無しさん:04/11/09 10:53:39
>>371
朝田さんが来てる
382デフォルトの名無しさん:04/11/09 15:07:43
struct A
{
int p : 10;
};
この「: 10」ってのはなんですか?
383デフォルトの名無しさん:04/11/09 15:19:25
>>382
ビットフィールド
pに10ビット割り当てられる。
384デフォルトの名無しさん:04/11/09 15:27:14
int array[] = { 1, 2, 3 };

arrayがメンバ変数の場合でも、上記の様な
要素数を省略した配列を初期化をする方法はあるのでしょうか
385デフォルトの名無しさん:04/11/09 15:28:00
>>383
どうもありがとう御座います
386デフォルトの名無しさん:04/11/09 15:36:13
>>384
arrayがstaticメンバ変数なら可能だけど
387デフォルトの名無しさん:04/11/09 15:38:04
>>386
ありがとうございます。やはり静的じゃないと駄目ですか。
大人しく別に用意してmemcpyでも使っておきます。
388デフォルトの名無しさん:04/11/09 16:04:25
>>387
君にとってconstructは何?
389デフォルトの名無しさん:04/11/09 16:18:55
char *cpy_buff[256];//社員ID格納用ポインタ配列バッファ
char *cpy[258];
char buff[256];//社員データ読み込みバッファ用
int =i;
i=0;

while(fgets(buff,sizeof(buff),fp)!=NULL)
{
cpy_buff[i]=strtok(buff,",");
strcpy(cpy[i], cpy_buff[i]);
i++;
}

カンマ区切りのデータを一行読み込み
最初のカンマで区切りまでの文字列を
配列に代入したいと思うのですが
上記ソースで行うと
コンパイルは通るのですが
以下の文字列のコピーでエラーとなります。
strcpy(cpy[i], cpy_buff[i]);

回避方法あります?
390デフォルトの名無しさん:04/11/09 16:33:31
>>389
cpy[i]はちゃんとメモリ確保してある?
それから、strtok()が返すのは常にbuffの中だからcpy_buffに格納する意味がないよ。
文字列処理とポインタについて、勉強しなおすことをお勧めしておく。
391デフォルトの名無しさん:04/11/09 16:34:45
>>389
cpyの中身はどこへ行った?
strcpyは謎アドレスには書けないと仰られております。
392デフォルトの名無しさん:04/11/09 17:04:42
#include <stdio.h>
#include <windows.h>// WindowsAPIを使用可能にする
#include <windowsx.h>

struct c
{
int b;
}a,*d;

void e(struct d f);

int main()
{
struct c g[10];
g[1].b=0;
e(&g[1]);
printf("%d\n" ,g[1].b );
}
void e (struct d f)
{
f->b=777;
}
だと
error C2027: 認識できない型 'd' が使われています。
error C2227: '->b' : 左側がクラス、構造体、共用体へのポインタではありません。
error C2664: 'e' : 1 番目の引数を 'c *__w64 ' から 'd' に変換できません。
というエラーが出てきます
どうしたらいいのでしょうか
ポインターを勉強中なのでお手柔らかにお願いします
393デフォルトの名無しさん:04/11/09 17:06:45
struct dじゃなくてstruct cだろ。
394デフォルトの名無しさん:04/11/09 17:07:55
void e(struct d f) → void e(struct c f)
単純なtypo
395デフォルトの名無しさん:04/11/09 17:10:16
>>392
dは型名じゃない。aも。ポインタの問題じゃない。
396デフォルトの名無しさん:04/11/09 17:19:37
#include <stdio.h>
#include <windows.h>// WindowsAPIを使用可能にする
#include <windowsx.h>

typedef struct c
{
int b;
}a,*d;

void e(d f);

int main()
{
struct c g[10];
g[1].b=0;
e(&g[1]);
printf("%d\n" ,g[1].b );
}
void e (d f)
{
f->b=777;
}
これだとちゃんとできるんですが>>392からtypedef取ってstructを付け足したらエラーが出たので
不思議に思ってます
397デフォルトの名無しさん:04/11/09 17:24:43
>>396
typedef struct c {} a, *d;
は、struct cをa という型に、struct c * をdという型に定義している。
struct c {} a, *d;
では、struct c と言う型のaと、struct c *と言う型のdを定義しているだけだ。
398デフォルトの名無しさん:04/11/09 17:27:03
>>397
なるほど!!
目から鱗が落ちました
これですっきり解決しました
ありがとうございました
399デフォルトの名無しさん:04/11/09 17:44:06
SourceForgeにあるDev-C++って使ってる香具師いる?
ttp://sourceforge.net/projects/dev-cpp/
400デフォルトの名無しさん:04/11/09 20:00:58
C++でクラスのメンバに関数ポインタ用の変数を用意して
現在の状態からswitch使って呼ぶ関数を決めるのではなくて
状態の変化があった時にその変数に関数ポインタを代入しておいて
それを呼ぶ形にしたいと思ったのですが
代入している所で
void (_cdecl クラス名::*)から(void) void (_cdecl *)(void)に変換することは〜
と言われてコンパイルが通りません
(呼び出し規約というのは調べたらすぐ出てきたので_cdeclにしました)
クラスのメンバ関数はポインタで扱えないんでしょうか?
401デフォルトの名無しさん:04/11/09 20:15:22
メンバ関数へのポインタはメンバ関数ポインタにしか代入できない。
402デフォルトの名無しさん:04/11/09 20:29:33
非常に初歩的な質問で申し訳ありませんが
double x = 3.14; x>>3; と記述したところ
エラー c41.c 15: doubleの不正な使用(関数main) というエラーが出ました
シフト演算子は浮動小数には使用できないのですか?
403デフォルトの名無しさん:04/11/09 20:33:37
float、double、ポインタには使用できない
404400:04/11/09 20:43:41
>>401
ちゃんとそういうものがあったのですね
勉強に使っている本やサイトになかったもので
ありがとうございました
405デフォルトの名無しさん:04/11/10 00:10:06
>>402
何をやりたいのかわからない。
406デフォルトの名無しさん:04/11/10 01:16:51
>>400
「関数ポインタ用の変数」の型をメンバ関数へのポインタにするべし。
そのエラーメッセージから察するに、現状はメンバではない関数へのポインタになってる。
構文キモイから覚悟して。
407デフォルトの名無しさん:04/11/10 02:12:48
そこで、関数オブジェクトですよ。
408デフォルトの名無しさん:04/11/10 02:51:37
そふぉで、ふぁんすうふぉふぅじぇふとでひゅよ。(おでん食いながら)
409デフォルトの名無しさん:04/11/10 05:53:05
便乗して関数ポインタについてお聞きしたいのですが、関数ポインタはどんな状況で使うべきなのでしょうか?
単にswitchの代わりに使うのではあまり意味がなさそうですし、あとは引数として使うくらいしか知らないのですが
有効な使い方を教えていただけないでしょうか>
410デフォルトの名無しさん:04/11/10 06:16:35
WindowClass を C++ の class で作って window procedure に
その class の member function を登録したいとき
call back function としてメンバ関数ポインタを使う
411デフォルトの名無しさん:04/11/10 08:07:31
>>409
C++で仮想関数を使いたい場面をCでがんばって実装するのに使う。
412デフォルトの名無しさん:04/11/10 10:13:03
POINT a;

struct s
{
int x;
int y;
}a;
は何が異なるんでしょうか?
413デフォルトの名無しさん:04/11/10 10:16:39
POINTの定義次第じゃないか?
414デフォルトの名無しさん:04/11/10 10:24:59
>>413
POINTは定義しないでも使えるんですけど
なんでですか?
415デフォルトの名無しさん:04/11/10 11:06:16
定義してるヘッダをインクルードしてるんだろ
416デフォルトの名無しさん:04/11/10 11:47:33
>>409
タスクシステム使うとき
417デフォルトの名無しさん:04/11/10 16:54:26
なかなか思い通りにいかないな
つぎからつぎへと細かいバグが出てくる
同じような操作の繰り返しでつかれました
418デフォルトの名無しさん:04/11/10 17:15:23
製品クオリティーにはほど遠いな…
419デフォルトの名無しさん:04/11/10 21:31:42
1,御kjの,女fだ,jk所
2,f打御,kもf,qjf朝

のように、半角全角が混じった適当なCSVファイルがあります。
それをfgetsで一行ずつ文字列配列に入れているつもりなのですが、
適当な行を取り出して中身をのぞいてみると「1,御kjの,女fだ,jk所・」
のように行末に余計な文字が出て来る場合があります。
どこがおかしいか教えてください。よろしくお願いします。
/////
char list[128][128];
int i;
for (i=0;i>128;i++)list[i][0]='\0';//初期化のつもり。正しい?
fp = fopen("test.csv","r");
i=0;
while (fgets(list[i],256,fp) != NULL){
printf("%s",list[i]);
i++;
}
fclose(fp);
420デフォルトの名無しさん:04/11/10 21:34:38
× i>128
○ i<128
421デフォルトの名無しさん:04/11/10 21:38:50
>>420
すいません、それはここにUPするため体裁を整えた際のミスです。
ソースではi<128となっております。
422デフォルトの名無しさん:04/11/10 22:26:58
>>419
改行コードじゃ?
423デフォルトの名無しさん:04/11/11 00:39:09
>>422
ありがとうございます。試してみたんですが、
そうかもしれません。
CSVを一行だけのファイルにして改行のない状態にしたら消えました。
そうだとしたら、本番で使うファイルは複数行あるものなので、
その改行コードというのを取り除きたいのですが
どうやって取り除けばよいのでしょうか…
424デフォルトの名無しさん:04/11/11 00:46:58
>>423
strlenとかで長さ計って改行コードを\0で上書きするとか?

それはそうと128バイトのバッファに
fgets(list[i],256,fp)
していいの?
425409:04/11/11 01:10:15
皆さんどうもありがとうございます m(_ _)m
それにしても、意外と関数ポインタを使う状況って限られているみたいですね
426419:04/11/11 01:20:10
>>424
ありがとうございます。↓のような物をWhileの中に入れてみました。
ファイルの最後の行とかには改行がないかもしれないので、
改行がある場合のみ置き換えるようにしてみようと思ったのですが
上手く置き換わらず、そのままの状態で出力されます。
度々申し訳ないのですが、何が悪いのでしょうか。。。

if(list[i][strlen(list[i])] == '\r\n'){
list[i][strlen(list[i])-1]='\0';
}
427デフォルトの名無しさん:04/11/11 01:38:48
>>426
char * p = strchr(list[i], '\0');
if (p > list[i] && p[-1] == '\n') {
p[-1] = '\0';
}
/* 或いは */
size_t l = strlen(list[i]);
if (l > 0 && list[i][l - 1] == '\n') {
list[i][l - 1] = '\0';
}
/* 或いは */
char * p = strrchr(list[i], '\n');
if (p) {
*p = '\0';
}
いずれにしても、'\r\n'は間違い。
428419:04/11/11 01:54:10
>>427
いろいろありがとうございます。わざわざすいません。
最後の奴が分かりやすかったので使ってみたら上手くいきました。
ところで
if(list[i][strlen(list[i])] == '\n'){
list[i][strlen(list[i])-1]='\0';
}
としてもダメだったんですが、これがいけない理由が分かりません。
理屈を言葉で理解したいのですが、これはどういったことなのでしょうか。
429デフォルトの名無しさん:04/11/11 02:15:26
>>428
strlenって何する関数か調べれば分かるよ
430デフォルトの名無しさん:04/11/11 02:56:10
>>428
char型1個に\rと\nが両方入るの?
>>429
431デフォルトの名無しさん:04/11/11 03:06:13
ごめん426の方のコード見てた
428は無視して
432431:04/11/11 03:07:43
×428
○430
433デフォルトの名無しさん:04/11/11 04:54:30
つまり、430-432はスルーと言うことで。
434デフォルトの名無しさん:04/11/11 07:22:26
ドラグでマウスの左ボタン押してから離すまでという条件文はどうやればいいのでしょうか?
WM_LBUTTONUP
WM_MOUSEMOVE
WM_LBUTTONDOWN
上の3個のメッセージ使ってドラッグを表現できないでしょうか?
435434:04/11/11 07:35:38
解決しました
436デフォルトの名無しさん:04/11/11 07:41:22
( ゚д゚)ポカーン
437419:04/11/11 08:04:49
力尽きました。限界であります。
VC6++のプロジェクトごと入ってますのでそのままビルドできると思います。
超単純なダイアログベースアプリでの
ファイル読み込み→リストビューに表示、という簡単なテストプログラムです。
実はこういったものを作っていたのですが、もう何がなにやらわけが分からないです。
どなたか助けていただけると助かります、、分からない事はソースにコメントしてあります。。
ttp://gamdev.org/up/img/1835.zip
438419:04/11/11 08:31:00
ちなみにMFCとか使ってません。
リソースエディタで作ってDialogBoxしてあるだけの超単純なやつです。
ですがなににしろAPIとかの間違いじゃなくて
初歩的なCの問題のような気がします…
439デフォルトの名無しさん:04/11/11 15:14:46
ウィルスが検出されたけど?
440デフォルトの名無しさん:04/11/11 16:29:51
>>438
行を分解するのに自前でやるからバグに気付かない罠。
sscanf()でばらしてみ。strtok()でもいいけど。
#ヒント:行内最後のセルには','はつかない。
441デフォルトの名無しさん:04/11/11 16:30:16
class CClassA;

typedef struct _tagStructB
{
CClassA::enumC en;
} StructB;

class CClassA
{
public:
enum enumC
{
ok,
err
};

StructB m_B;
};

と言う事をしたいのですが、どうしてもうまくいきません。

error C2027: 認識できない型 'CClassA' が使われています。

どうか、お慈悲を…
442デフォルトの名無しさん:04/11/11 16:46:28
>>441
これくらいがせいぜいか

struct CClassA_Base
{
enum enumC
{
ok,
err
};
};

struct StructB
{
CClassA_Base::enumC en;
};

class CClassA: public CClassA_Base
{
public:
StructB m_B;
};
443デフォルトの名無しさん:04/11/11 16:53:10
>>441
あとは

class StructB;

class CClassA
{
public:
enum enumC
{
ok,
err
};

StructB *m_B;
};

struct StructB
{
CClassA::enumC en;
};
444441:04/11/11 17:01:13
>>442-443 THX!

スマートな書き方はないんですね…
とりあえず、意味合いは変わってきますが、こんな感じで逃げようかと思います。

class CClassA
{
public:
enum enumC
{
ok,
err
};

typedef struct _tagStructB
{
CClassA::enumC en;
} StructB;

StructB m_B;
};
445デフォルトの名無しさん:04/11/11 17:05:44
>>444
ちなみにC++では構造体もクラス同様、変数宣言などのときにstructはなくても平気だからtypedefする必要はない。
446444:04/11/11 17:09:15
この癖はもう抜けません…
447デフォルトの名無しさん:04/11/11 17:20:14
typoの元だから抜いとけよ。
448デフォルトの名無しさん:04/11/11 18:17:04
1380791345などの、Long型の値を、文字列に変換するには
どうしたら良いでしょうか?

gccコンパイラ使ってます。
449デフォルトの名無しさん:04/11/11 18:17:54
itoa
450デフォルトの名無しさん:04/11/11 18:18:41
sprintf
451デフォルトの名無しさん:04/11/11 18:24:47
boost::lexical_cast
452デフォルトの名無しさん:04/11/11 19:14:26
可変引数の関数を作っているのですが

bool function(int a, int b, ... );

この場合、va_startに渡す第2引数はbでいいの?
453デフォルトの名無しさん:04/11/11 19:24:08
ok
454デフォルトの名無しさん:04/11/11 20:32:54
初心者な質問ですみません。
C言語で標準関数を使用してBASICの様にLine見たいな感じで描画する事は可能なんでしょうか?
線や円を色などを指定して描画したいんですが。
もし不可能であればそのような事を実現するのに適したライブラリ等、お勧めな物はありますか?
455454 :04/11/11 20:40:38
書き忘れましたが、使用環境はSolaris9+gcc2.95.3
もしくは Linux(カーネル3.3.32.4)+gcc3.3.3
できるだけunix+gccで実現したいんですが、windowsのほうが手っ取り早いというならば
WindowsXP+VisualC++6.0辺りでも構いません。
456デフォルトの名無しさん:04/11/11 20:43:59
質問します。
Visual Studio .net なんですが、
それにDirectXを関連付けてインストールするにはどうしたらいいんでしょうか?
457大原ゆき:04/11/11 20:46:34
>>454
よく学科の初級演習でちょっとしたシミュレーション結果などを学生に
表示させるのにSGL(Simple Graphics Library)というグラフィックス
ライブラリが使われたりすることがあるそうです。
その名の通りごく単純な機能しか持っていないので、習得が短時間でできます。
グラフィックスに重点を置かないようなプログラムの描画テストなどであれば、
ある程度使いものになるでしょう。
http://www.rzuser.uni-heidelberg.de/~demscher/public/sgl/
458419:04/11/11 21:13:04
>>439
マジですか?
からかいだったら氏ね。
>>440
こんな便利なものがあったとは…
なんとかsscanfを使って解決できました。
ありがとうございました。
459デフォルトの名無しさん:04/11/11 21:14:04
ちと環境依存OKに甘えさせて下さい
最近のIDEだと、iteratorやクラスメンバなんかでも
入力補助(インテリセンス、メンバ表示)が効くのでしょうか?

もう5年近くVC6を使っていて、未だ買い換える気にもならないので
ちょっと物欲を刺激してみようかと
460デフォルトの名無しさん:04/11/11 21:30:55
>459
普通に効きますよ
461デフォルトの名無しさん:04/11/11 21:35:18
>>460
サンクスです!
あーやっぱりそろそろ買い換えよう…便利だろうなぁ
462デフォルトの名無しさん:04/11/11 21:39:55
アプリケーションがやり取りしているデータを(たとえばIE)
読み取りたいんですが全く方法がわかりません。
どなたかヒント頂けないでしょうか?
言語はC++を使おうと思っています。
よろしくお願いします。
463デフォルトの名無しさん:04/11/11 21:46:58
意味不明。
クリップボード、プロクシもどき、クッキー、キャッシュ、メッセージ、ちょっと考えるだけでこんなに候補がある。
464462:04/11/11 21:50:28
メッセージの部類に入ると思います。
たとえばサーバにURL送る時は(おそらくURL情報、送信元IP、ブラウザ情報・・・)
IEにかかわらずたとえばアプリがやり取りしてるデータ(メッセージ?)に
アクセスしたいです。
465デフォルトの名無しさん:04/11/11 22:00:42
>>464
アプリケーション間やOSとやりとりするメッセージと
IEからサーバーに送られるリクエストパケットは別物
アクセス方法も違う。
何をしたいか明確にしないと答えようがない
466デフォルトの名無しさん:04/11/11 22:01:18
>>464
その前にWindowsがどういう仕組みになっているか勉強した方がいいと思います
467462:04/11/11 22:06:49
>>465
勉強不足でうまく伝わらないようです・・・
アプリがやり取りしてるデータと言うのを具体的に明記すると
Windows上で動く一つのオンラインゲームがあり
そのオンラインゲームがサーバとやり取りしているデータを読み取りたいです。
オンラインゲームにかかわらずネットワーク経由でデータをやり取りしているアプリのデータを
横から読み取る方法は無いでしょうか?

>>466
お勧めの本あったら教えてください。
勉強不足のようです。。。
468デフォルトの名無しさん:04/11/11 22:10:48
>>467
最初からそう言えば分かりやすいのに。
> アプリケーションがやり取りしているデータ
で分かる奴がいるか?
データの具体的な中身も種類も、やり取りしてる相手も書かれてない。
469デフォルトの名無しさん:04/11/11 22:12:36
>>467
チートでもしたいのか?

自前でやるならwinsockのrecvをwrapするDLLを作るか、
外部のアプリからAPIHookをかけるのが手っ取り早いだろうけど、
ただデータを見て、ちょっとした書き換えをやりたいだけなら、WPEPro等を使うのが楽
470デフォルトの名無しさん:04/11/11 22:19:58
質問です。
いまファイル読み込みをやっていて
全角文字を0x80以上として、
0x80以上の値がきたら次の文字も読み込む
としているのですが、これだと半角カナの文字を判定することができないので
困っています。
何かてっとりばやい方法はないでしょうか?
471462:04/11/11 22:23:45
>>469
キーワードいくつか頂いてありがとうございます。
ぐぐって勉強して来ます。

またお世話になるときはよろしくお願いします。
472デフォルトの名無しさん:04/11/11 22:25:57
>>470
Shift JISなら
http://homepage1.nifty.com/herumi/adv/adv40.html#003
他にもWindowsならIsDBCSLeadByte()とか
473デフォルトの名無しさん:04/11/11 22:27:29
>>467
横取り丸をためしてみそ。オープンソース(VC)。検索すればすぐ見つかる。
動機が不純そうだが、俺も不純な動機でいじったから許す。
474473:04/11/11 22:31:41
訂正。
DLLサンプルがオープンソース。
httpの送受信書き換えはなんでも出来る。
475デフォルトの名無しさん:04/11/11 22:31:49
>>471
http://winpcap.polito.it/
って、もうどっか行っちゃったのかよ・・・。
476462:04/11/11 22:36:05
>>473
やりたいことにかなり近い物があります。
ヒントありがとうございます。

>>475
教授ありがとうございます。
参考にさせて頂きます。
477デフォルトの名無しさん:04/11/11 22:40:10
>>472
うおー。
ありがとうございます。
478デフォルトの名無しさん:04/11/11 22:41:14
>>454
OpenGL
SDL
glut
あたりで検索されたし
479デフォルトの名無しさん:04/11/11 22:53:06
Windows専用で良いなら、システムコールで直接描くのが速くていいよ。
GDIというしくみ。「猫でも」にあるよ。
ピクセル単位での計算結果の出力が主体なら、GDIはちょっと遅いかも。
WIN32SDK+DIBで検索してみては?

速度よりも汎用性なら、>>478さんの言うとうり、OpenGLがいいね。
480デフォルトの名無しさん:04/11/11 23:01:42
>>462
パケットモニタでググレ
481デフォルトの名無しさん:04/11/11 23:47:31
先日から始めたばかりでの質問ですがよろしくお願い致します。

int hensu1, hensu2;
中略
hensu1 = ( hensu2 -40 ) * 0.5;

上記の計算式で hensu2 が 40 の時に途中でエラーが出ます。
この問題の条件として演算は整数とありましたので int を使いました。

自分で考えた限りでは式を二つに分けて零に乗算をしない事はできました。
ただ、もっとスマートに解決出来ないものでしょうか?
よろしくお願い致します。
482デフォルトの名無しさん:04/11/11 23:52:23
>>481
40が全角だからです
483デフォルトの名無しさん:04/11/12 00:14:17
>482
お答えありがとうございます。

ただ、残念ながら変数の値はきちんと半角で受け取っております。
484デフォルトの名無しさん:04/11/12 00:16:03
>481
それでは返答のしようが無いです。
ソースを省略してはいかんです。
省略しても大丈夫と思った所にバグが有るものです。
485デフォルトの名無しさん:04/11/12 00:46:52
>>481
エラーの内容くらいちゃんと書け。


# あと、「希望する動作」と「現在の動作」もな。
486454 :04/11/12 00:50:07
>>457 さん
>>478 さん
>>479 さん
ありがとうございます。
やっぱり標準関数では無理そうですね。
Windowsのシステムコールですか。
UnixのシステムコールはかじってるんですがWindowsは全く
わからないですね。ちょっと勉強してみますか。
OpenGLはなんとなく手をだしたことないですね。やはり使いやすいんでしょうか?
ちょっとみなさんからもらったヒントを元にいろいろ検討してみようと思います。
ありがとうございます。
487デフォルトの名無しさん:04/11/12 01:08:52
>>481-485
あの部分のあとで hensu1 で割ってるんだろう。
488デフォルトの名無しさん:04/11/12 01:10:51
>>454
FLY も試してみそ
489479:04/11/12 01:35:44
>486
がんばってね。おすすめは、
"猫でも" http://www.kumei.ne.jp/
"DIB" http://www.gen-ta.net/
どちらも、VisualC++が無いと厳しいかもです。
490デフォルトの名無しさん:04/11/12 01:36:16
>>489
は?
491479:04/11/12 01:39:58
>>490
へ?
492デフォルトの名無しさん:04/11/12 01:43:47
>>491
ほ?
493デフォルトの名無しさん:04/11/12 01:45:13
どうしてもわからないことがあるので質問させていただきます。
プログラムのリソースにexeやdllなどのバイナリを保持させた場合、
それを取り出すとバイナリリソースへのポインタが取得できますが、
このメモリ上にデータとして展開されたバイナリリソースから
インスタンスを生成する(実行する)ことは出来るでしょうか?
一旦それをファイルに書き出して実行するという手段以外で
方法がありましたらご教授願います。
494デフォルトの名無しさん:04/11/12 02:02:52
リソースと実行コードではメモリ管理が異なるので不可能です。
可能にしている特殊分野もありますが、お勧めいたしかねます。
495デフォルトの名無しさん:04/11/12 02:05:31
>>493
メモリに展開して、先頭アドレスにjmpする…じゃだめなの?
496デフォルトの名無しさん:04/11/12 02:07:47
ローダーでぐぐれ
497493:04/11/12 02:18:14
>>494
やはりファイルに落とすしかないのでしょうか・・・

>>495
保持しているポインタはメモリに展開された実行ファイルそのものなので
jmpだけで実行できないと思うのです。

>>496
検索ヒット数が多すぎてわかりませんでした。
498496:04/11/12 02:21:12
自己解凍実行形式のLZHファイルとかZIPファイルとかが
事実上きみがやりたいことをやっている
499493:04/11/12 02:28:55
>>498
レスありがとうございます。
自己解凍系もしらべましたが、あくまでデータとして扱っているので
インスタンスを生成するという主旨からはずれてしまうのです。
CreateProcessやLoadLibraryの引数がメモリに展開された実行ファイルへの
ポインタだったら楽なんですけどね・・・・
500デフォルトの名無しさん:04/11/12 02:31:07
ソースはみた?
501493:04/11/12 02:36:45
CodeGuruにあったものを見ました。
こちらはMFCでかかれていましたが、Win32sdkでも記述できるはずですので
そちらを参照しました。
502デフォルトの名無しさん:04/11/12 02:40:55
セキュリティ上問題がありそう
503496:04/11/12 02:47:07
504デフォルトの名無しさん:04/11/12 02:53:26
>>496
ありがとうございます。
目を通してきますm(_ _)m
505デフォルトの名無しさん:04/11/12 03:17:59
超超初心者です。申し訳ないんですが教えてください。
(重複スレで質問しちゃってマルチごめんなさい)

数値計算をしていてパラメタは全てdoubleにしているんですがこの2式

z[ 4 ] = y[ 2 ] ^2 - 2.0e2 ;
z[ 5 ] = y[ 3 ] ^2 - 20.0 ;

で 浮動小数点の不正な使用 とエラーになってしまいます。
なにがいけないんでしょうか…?
506デフォルトの名無しさん:04/11/12 03:30:26
2.0e2
507デフォルトの名無しさん:04/11/12 03:31:55
doubleと2でbitwise-XORをとるとはどういう了見だい?
508505:04/11/12 03:33:49
よくわかんないんですけど、始め200.0にしてたんですが
それでもエラーが出たので
本見て変えてみただけです。。。
どうしたらいいんでしょうか?
509505:04/11/12 03:34:58
この式の問題じゃないんでしょうかね?
510デフォルトの名無しさん:04/11/12 03:41:13
#include <math.h>

z[4] = pow(y[2], 2) - 2.0e2;
z[5] = pow(y[3], 2) - 20.0;
511505:04/11/12 03:46:50
>>510
おおおおお!行った!!
有難うございます!!ほんと有難うございます。・゚・(ノД`)・゚・。
^じゃダメなんですね。。。助かりました<(_ _)>
512デフォルトの名無しさん:04/11/12 06:33:09
昔のBASICの人だったのかな。

いちいち関数呼び出しになるのが馬鹿馬鹿しいよね・・・。
513デフォルトの名無しさん:04/11/12 08:44:45
なんだかグラフィックの話題が出てたけれど、やっぱりopenGLが主流なのかな?
DirectXでやってきたけれど仕様変更について行くのが嫌になってきて。
いまからでもopenGL覚えた方が良いんだろうか...
514デフォルトの名無しさん:04/11/12 09:05:38
初心者を超えて更に超えた所には一体何があるのだろう。
初心者を超えたら只の初級者だと思うのだが。
515デフォルトの名無しさん:04/11/12 09:13:13
超初心者
516デフォルトの名無しさん:04/11/12 10:35:33
誰か助けてください。
次の関数で0≦x≦2の範囲で、xの値の0,1ごとに
yの値を計算するプログラムを作成せよ。画面にはx、y両方の値を表示す
るようにすること。while文を使うこと。y=x*x−3x+5/4
517デフォルトの名無しさん:04/11/12 10:43:25
>>514
入門者→初心者→初級者→中級者→上級者。
初心者を超えたら初級者になる。
518デフォルトの名無しさん:04/11/12 12:19:34
>>516
マルチやめれ
519516:04/11/12 13:59:36
すいません。期限ギリギリだったので。反省します。
520デフォルトの名無しさん:04/11/12 14:09:36
理由としてダメ人間の部類だな。
521デフォルトの名無しさん:04/11/12 14:27:29
ITEM name, password;

これってどういう意味ですか?
522デフォルトの名無しさん:04/11/12 14:38:39
int name, password;

これってどういう意味ですか?
523デフォルトの名無しさん:04/11/12 14:43:19
たったこれだけのこともだれもおしえてくれないんですか?
524にんどる:04/11/12 14:43:51
質問なんですが、
ソートされたデータの配列を対象としたとき、その中に与えられた任意のキャラクタが含まれているか否か2分探索より効率的に判断できるようにするにはどのような方法を採用すればいいんですか?
教えてください。
525デフォルトの名無しさん:04/11/12 14:44:46
>>523
回線気って首吊って氏んどけ
526デフォルトの名無しさん:04/11/12 14:46:05
普通にmemchr()でいいんでね?
527デフォルトの名無しさん:04/11/12 19:39:28
構造体のメンバの並べる順序って重要なんですか?
ソースを分割する際に構造体のメンバの順序変えて宣言したら
実行時にメンバが入れ替わってたんで
528デフォルトの名無しさん:04/11/12 19:48:03
>>527
そりゃそうだ。
メンバはメモリ上でも宣言した順に並べられる。
529デフォルトの名無しさん:04/11/12 20:06:30
Visual C++ 6 (+SP6) で setvbuf がいつもエラーを返すのですが、
どうしてでしょうか。

FILE* fp = fopen("test.txt", "w");
if (! setvbuf(fp, NULL, _IOFBF, 1024*1024)) {
 printf("Failed to reserve buffer.");
}

このコードは 1MB のバッファを確保しようとしていますが、
64KB, 8KB でもだめでした。
530デフォルトの名無しさん:04/11/12 20:08:31
すいません、上げるの忘れました。
531デフォルトの名無しさん:04/11/12 20:11:33
>>529
> 戻り値
> 正常に終了した場合は 0 を返します。
532529:04/11/12 20:13:32
>>531
ありゃりゃりゃー、そうでしたか。
ありがとうございます!
もう1時間ほど悩んでいました。。。
533デフォルトの名無しさん:04/11/12 20:20:15
UNIX で自分のプログラムのフルパスを取得するには
どうしたらよいでしょうか。
Win32 では GetModuleFileNam() が使えるんだけど。。。
534デフォルトの名無しさん:04/11/12 20:21:27
>>532
有効範囲は 2 < size < 32768
とも書いてある。MSDNよく読め。
535デフォルトの名無しさん:04/11/12 20:22:33
>>534
すいません。。。よく読むようにします。
536デフォルトの名無しさん:04/11/12 20:44:08
>>524
二分探索が使えるなら、それ以上に高速なものってあまり思いつかないな
むしろ二分探索が使えない時の速度の上げ方の方が悩むところだと思うけれど
>>526
memchr()は先頭から順番に探索してるだけじゃね?
537デフォルトの名無しさん:04/11/12 21:06:36
一文字探すにはそれで充分かと思ってね。ソートされていることに意味はないし。
538デフォルトの名無しさん:04/11/12 21:11:52
>>537
ソートされていないと2分探索は使えない
539デフォルトの名無しさん:04/11/12 21:15:30
>>533
GetModuleFileNam()って機能を知らんので外してるかもしれんけど
#include <limits.h>
#include <stdlib.h>
char *realpath(const char *path, char *resolved_path);
このへんかなぁ? これにarg[0]渡せば行けそう

Linuxでproc fs使えるなら
/proc/self/cmdline
を読むのもいいかも
540デフォルトの名無しさん:04/11/12 21:16:34
だから、ソートされたデータでもその中の一文字探すのに2分探索できないっしょ。
先頭の文字ならいざ知らず。
541デフォルトの名無しさん:04/11/12 21:18:17
>>539
argv[0]にフルパスが入っている保証はない。
542デフォルトの名無しさん:04/11/12 21:24:54
>>541
argv[0]にフルパスが入っているなら
char *realpath(const char *path, char *resolved_path);
なんて使わなくてもいいのでは?
543デフォルトの名無しさん:04/11/12 21:39:31
>>542
argv[0]はコマンドラインから渡るから
入る場合もあれば入らない場合もあるということだろ
544デフォルトの名無しさん:04/11/12 21:59:19
541の「フル」パスってのは誤表記ってことね
>>543
その入らない場合ってのはどんな場合を想定してる?
545デフォルトの名無しさん:04/11/12 22:14:46
546デフォルトの名無しさん:04/11/12 22:27:07
>>544
お前超初心者?
547デフォルトの名無しさん:04/11/12 22:36:14
来たぞ来たぞ
548デフォルトの名無しさん:04/11/12 23:29:22
共通ヘッダにはexternしか置いたらだめなんですか?
構造体の本体置いてもいいんですか?
本体置けたら共通ヘッダ以外に書かなくていいから楽なんだけど
549デフォルトの名無しさん:04/11/12 23:42:25
当事者じゃないが揉めないうちに argv[0] についてまとめとくと、
・そもそも argv[0] に自分のプログラムのパスが入っているとは限らない。
 環境によっては設定されない場合もあるし、fake することも可能。
 規格上も単に program name とされており空白の環境も許容されている。
・argv[0] に自分のプログラムのパスが設定されるとしてもフルパスとは限らない。
 "./a.out" のように相対パスで設定されている可能性がある他、単にコマンド名だけで
 環境変数 PATH の探索によってフルパスが得られる場合もある。
 この場合は、realpath だけでは解決することができない。

参考:
ttp://www.nurs.or.jp/~asada/FAQ/UNIX/section4.4.html

こんなもんでどうでしょ?

>548
「構造体の本体」とは何かを述べよ。
550デフォルトの名無しさん:04/11/12 23:44:01
>>549
extern付けてない構造体のことです
551デフォルトの名無しさん:04/11/13 00:22:40
>>550
>本体置けたら共通ヘッダ以外に書かなくていいから楽なんだけど
その「本体」とやらは一個じゃないの?
それをも省略したいってこと?
552デフォルトの名無しさん:04/11/13 01:36:22
とりあえず、本体とやらは
struct hoge{
 int integer;
 char character;
};
のことだよね
553デフォルトの名無しさん:04/11/13 01:38:43
静的な構造体のインスタンスのことではないよね?

関数のプロトタイプ宣言と定義のこととごっちゃになってるんじゃない。
554デフォルトの名無しさん:04/11/13 05:17:16
>>551
共通ヘッダにexternなしで構造体宣言書けばいいとおもったんだけど
実際やてみるとエラーがでました
共通ヘッダにexternなしの構造体書くと各ソースにexternなしの構造体書いたことになって
定義がダブることになるからエラー出たのかなと思いました
>>552
はいそのことです
ソースを分割するとソースごとに本体以外はexternを前につけて書かないといけないんで
>>553
552のことです
555デフォルトの名無しさん:04/11/13 05:25:59
>>554
それは何かがおかしい。君の言っていることが正しいことになると、例えば
C++の標準ライブラリはほとんどがエラーを発することになる。
556デフォルトの名無しさん:04/11/13 06:03:43
>>554
エラーが再現する最小のコードを書いて貼ってみてよ
恐らくすぐ解決するよ
557デフォルトの名無しさん:04/11/13 07:23:34
>>555
>>556
最小のコード書いてエラーを再現しようとしましたけど再現できませんでした

LNK2005: "struct a b" (?b@@3Ua@@A) は既に c.obj で定義されています。
というエラーがでます
c.cppファイルには定義は書いてないので定義がだぶることはないと思うのですが・・・
558デフォルトの名無しさん:04/11/13 07:38:32
後、typedefの構造体にextern付けるとなんでエラーがでるんですか?
559デフォルトの名無しさん:04/11/13 07:42:37
>>557
とりあえず再現してなくていいから
その今書いたのを貼ってみて

それにある間違いを指摘するから
その知識を元に当初のコードを修正すると
問題の一つは解決すると思うよ
560デフォルトの名無しさん:04/11/13 07:46:08
//mein.cpp
#include <stdio.h>
#include "common.h"
int main()
{
struct x z;
z.c=10;
hoge(z);
}
//test.cpp
#include <stdio.h>
#include "common.h"

void hoge(struct x z)
{

printf("%d\n" , z.c);
}
//common.cpp
struct x
{
int c;
};
void hoge(struct x z);

です、これだとエラーが出ないのです
561デフォルトの名無しさん:04/11/13 07:54:43
common.hは?
562デフォルトの名無しさん:04/11/13 07:57:42
>>561
すいません
訂正します
×common.ccp→○common.h
563デフォルトの名無しさん:04/11/13 08:16:59
557の
>LNK2005: "struct a b" (?b@@3Ua@@A) は既に c.obj で定義されています。
このエラーは元のコードのか

>c.cppファイルには定義は書いてないので定義がだぶることはないと思うのですが・・・
c.cppになくてもinclude先に
struct a b;
ってない? 直接c.cppからincludeされてなくてもincludeの連鎖上に

c.cppってでかいの?
564デフォルトの名無しさん:04/11/13 08:19:34
>>560
それと関係ないけど560の
void hoge(struct x z)
は参照で受けた方が良い
structも省略して
void hoge(const x &z)
565デフォルトの名無しさん:04/11/13 08:34:23
>>563
元のコードのです
c.cppは140行くらいで
#include <stdio.h>
#include "common.h"
しかインクルードしていません
あとc.cppはソルーションエクスプローラ中のソースファイルホルダの最上部に位置してます
>>564
ご忠告有り難うございます
566デフォルトの名無しさん:04/11/13 11:18:59
要するに、こんな事をやっちゃってるんでそ

//--- common.h
#ifndef common_h
#define common_h
struct a { int foo; } b;
#endif // common_h

//--- main.cpp
#include "common.h"
int main () {}

//--- common.cpp
#include "common.h"

これじゃ struct a 型変数 b の実体が main.obj にも common.obj にも
存在しちゃって、リンカの中の人も困る罠。
567566:04/11/13 11:25:18
こうすれ。なぜかは自分で考えるよろし。

//--- common.h
#ifndef common_h
#define common_h
struct a {};
extern a b; // <- このプロジェクトのどこかに1つだけ b があるよ、と
       //   コンパイラ (やリンカ) に指導している
#endif // common_h

//--- main.cpp
#include "common.h"
int main () {} // <- ここで b を使う事は *もちろん* 可能

//--- common.cpp
#include "common.h"
a b; // <- b の実体はここにある

>566 も↑のコードも、ファイルをそれぞれ分けて保存すれば
きちんとコンパイルもリンクも通るから。試してみるべし。
568デフォルトの名無しさん:04/11/13 11:32:48
(;´Д`) 何を書いてるんだ自分は。

>566 はリンクは通らない。
>557 のエラーが再現するコードな。
569デフォルトの名無しさん :04/11/13 12:56:13
メンバに2次元の文字列配列str[128][128]を持ったクラスがあります。
外からこの文字列配列を丸ごと取れるようにしたいんですが、
どうやって書いたらよいのでしょうか。
文字列を返す為のメンバ関数の型とか、
もらう方の側の書き方とかがどうすればよいのか分かりません。
(もらう方法があるとしたら)もらう方の文字列をstr2[128][128]として、
サンプルを書いていただけると大変助かります。よろしくお願いします。
570デフォルトの名無しさん:04/11/13 13:00:13
char const (&get_str())[128][128] const{ return str; }

char const& str2[128][128] = moge.get_str();
571デフォルトの名無しさん:04/11/13 13:00:49
constの位置間違ったかもしれない。
まぁいいか。
572デフォルトの名無しさん:04/11/13 13:27:28
>>570
ありがとうございます。
関数の方が初めて見る書き方でどこが切れ目か分からないので
とりあえずクラス定義の中にそのままの形で書いてみたのですが、
・const char (' は不正です
・{' の前に予期しないトークンがありました。関数の本体は無視されます
と怒られました。

できたらクラス定義の外で「戻り値 クラス名::関数名()」みたいに書く
方式で教えていただけないでしょうか…
573デフォルトの名無しさん:04/11/13 13:32:07
class Hoge
{
  char str[128][128];
public:
  const char (&get_str())[128][128] const;
};

const char (&Hoge::get_str())[128][128] const {return str;}

でもこれぐらいインライン展開した方がいいと思うけど。
574デフォルトの名無しさん:04/11/13 13:48:57
やっぱconstの位置間違ってたわ。
char const (&get_str() const)[128][128]{ return str; }
575569:04/11/13 14:06:36
たびたびすいませんです。今度は呼ぶ側で怒られました。
こっちは変更いらないんですよね?
ちなみに環境はVC++ですが、環境のせいとかありえますかね…

: 参照の配列は宣言できません。
: 'const char [128][128]' から 'const char *[128][128]' に変換することはできません。
(新しい動作 ; ヘルプを参照)この変換が可能なコンテキストはありません。
576デフォルトの名無しさん:04/11/13 14:15:14
呼ぶ側も間違った
char const (&str2)[128][128] = moge.get_str();
俺もそろそろぼけ始めたか・・・。
577デフォルトの名無しさん:04/11/13 14:17:45
typedef したらどう書ける?
578569:04/11/13 14:43:33
>>576
成功したみたいです。なんか難しいですね。
あんまり意味を理解できてないですが。。。修行します。
度々すいませんでした。ありがとうございました。
579デフォルトの名無しさん:04/11/13 14:50:56
std::vector<std::string>じゃダメなのか?
580デフォルトの名無しさん:04/11/13 15:27:34
>>567
試してみます
ありがとうございました
581569:04/11/13 15:30:53
>>579
参考のためにSDL(?)での書き方も教えて
頂けるとかなり嬉しいのですが。
582デフォルトの名無しさん:04/11/13 15:59:42
>>567
ばっちりうまくいきました
本当にどうもありがとうございました
583デフォルトの名無しさん:04/11/13 18:58:57
すいません質問があります。
strcspn関数についての質問なのですが、

文章の中で全角スペースがある場所までのバイト数を求めたいのですが、

int aNum = strcspn( "あいうえおーかきくけこ", " " );
とやると aNumに 10が入ってしまいます。

なぜか全角スペースの検査に"ー"が反応してしまうようなのですが、
これは何か使い方を間違っていますでしょうか?
584デフォルトの名無しさん:04/11/13 19:18:28
例えばShift_JISにおいては、" "は0x81と0x40という二つの文字からなる文字列だから、
strcspnは0x81と0x5bからなる"ー"という文字列の文字0x81を検出した。それだけ。
585デフォルトの名無しさん:04/11/13 20:56:35
>>581
STL(standard template library)な。
class hoge{
std::vector<std::string> fuga;
public:
std::vector<std::string> get_fuga(){return fuga;};
};
586デフォルトの名無しさん:04/11/13 21:12:50
すいません。今勉強中の身でタダの愚痴なんですが、ポインタは、例えば

int *ptr;

とせずに

pointer int ptr;

という表現で、設計すればよかったんでは?const int a; を見て思い付きました。
なんで int *ptr; という表現になっちゃったんでしょうか??
初期の学習者は、*演算子の意味と混同しそうだし、関数へのポインタの表現も少しややこしく見えます。
ただ自分が見慣れていないせいだとは思いますけど。
587デフォルトの名無しさん:04/11/13 21:23:26
関数へのポインタの表現はtypedefでもすれば、初心者でも
大丈夫だと思うんだが。
588デフォルトの名無しさん:04/11/13 21:48:10
>>586
キーワードを増やしたくなかったんだろう。
589デフォルトの名無しさん:04/11/13 22:17:12
>>586
template <class T> class ptr;
でも作りなされ(w
590デフォルトの名無しさん:04/11/13 22:18:53
>>586
int *ptr は、ptr 変数に * をつけて逆参照すると int 型だよー、っていう意味。
pointer キーワードを使うと、そういう意味がわからなくなるね。
591デフォルトの名無しさん:04/11/13 22:46:47
んじゃ、
int a;
int * ptr = & a;
* ptr = 0;
のかわりに、
int a;
pointer int ptr = enreference(a);
dereference(ptr) = 0;
とでもするかね。
592569:04/11/13 22:48:54
>>585
ありがとうございます。
覚えたら書き方的には分かりやすそうでよいですね。
勉強になりました。ありがとうございました。
593デフォルトの名無しさん:04/11/13 22:50:19
むしろ俺はなんで*なのか?なんだよな
&じゃだめだったのかな?
594デフォルトの名無しさん:04/11/13 22:53:11
>>593
& をつかうんだったらさ、
int* &ptr;
は、ptr に & をつけたら int* 型だよ、となっていいけど、
int &ptr
は、ptr に & をつけたら int 型だよ、となって
これは逆参照を表す。

つまり、アドレスをとる & 演算子と、逆参照の & が混同しちゃうだろ。
595デフォルトの名無しさん:04/11/14 01:52:12
単項 -> <-演算子を定義しても良かったかもね。
int i;
int<-p = ->i;
int j = <-p;

いややっぱ分かりにくいわ。
&*は一文字で適度に目立つのがいいね。
596デフォルトの名無しさん:04/11/14 02:05:46
APLの悪夢の再来ですか?
597デフォルトの名無しさん:04/11/14 09:21:11
みなさん愚痴を聞いて頂いてありがとうございます m(_ _)m
typedef, template はまだ到達してません…
ポインタ宣言は>>590さんの書き込みでやっとはっきり理解できました。ありがとうございました。
598デフォルトの名無しさん:04/11/14 10:00:55
最近、クラスを勉強し始めた。
でも、クラスの利点がイマイチ分からない。

サンプルを用いながら、「ほら、こんなに便利!わかったかゴルァ!!」
ってな感じにおしえて!
599デフォルトの名無しさん:04/11/14 10:22:34
憂鬱本を買って読む。これ。
600デフォルトの名無しさん:04/11/14 10:25:16
Delphiでもさわってみれ
601デフォルトの名無しさん:04/11/14 10:37:31
クラスが分かると、世の中に出回ってるC++で書かれたライブラリを利用できるようになります。
ね、便利でしょ?w
602デフォルトの名無しさん:04/11/14 10:52:31
>>598
std::stringとかstd::vectorとか便利。
面倒なメモリ管理から逃れられる。
603デフォルトの名無しさん:04/11/14 11:20:21
>>602
それクラスの利点じゃないし
604デフォルトの名無しさん:04/11/14 11:59:44
>>598
C使いで構造化プログラミングに精通しているなら、「情報の隠蔽化」だけでも便利だと思う。
その方向でよければ具体例を挙げてみようか?
605デフォルトの名無しさん:04/11/14 12:08:05
>>598
とりあえずクラスの意味を勉強しておいて、
クラスが使われているコードを数多く読むようになれば
その便利さやきれいさがわかる。

勉強してすぐによさが分かりにくいものって、よくあるよね。
そういうときはとにかく詰め込んでおけばいいと思うよ。私は。
606デフォルトの名無しさん:04/11/14 13:26:03
本質的にクラスが良く分かると、世の中に出回ってるC++で書かれたライブラリを使いたくなくなります。
607デフォルトの名無しさん:04/11/14 13:54:11
他人の書いたクラスはよう分からん
608デフォルトの名無しさん:04/11/14 16:20:45
>>607
あなたか
その他人がクラスをあまり理解していないと思われます
609デフォルトの名無しさん:04/11/14 16:25:06
最初はパターンを使ってエレガントに書いてたとしても
だんだん汚くなってきて終いには訳が分からなくなるもの
610デフォルトの名無しさん:04/11/14 17:03:51
それでwindowsとかmacOSみたいな代物が世の中に出回ってるわけね
611デフォルトの名無しさん:04/11/14 17:27:57
正直、継承とかってガンガン使ってる?
612デフォルトの名無しさん:04/11/14 17:46:51
>>611
逆に聞こうか。
使わないでどうしてるんだ?
613デフォルトの名無しさん:04/11/14 17:48:06
バカみたいに継承するのはやめてください
614デフォルトの名無しさん:04/11/14 18:19:33
正直、実装含む多重継承とかってガンガン使ってる?
615デフォルトの名無しさん:04/11/14 18:21:56
継承するより、直にクラス使うほうが軽いんでない?
616デフォルトの名無しさん:04/11/14 18:32:06
オブジェクト指向が出て来た頃は継承はもてはやされたんだろうが、
最近では継承を出来るだけ使用しないと考え方が広まってきたんでしょ。
無駄な継承はデバッグを困難にさせ、結局は開発効率を落とすとか。
617デフォルトの名無しさん:04/11/14 18:37:58
MFC使うと嫌でも継承使う羽目になるのだが、自分ではそれほど継承を使うことはない。
618617:04/11/14 18:38:50
つーか、多段継承クラスを作ることは少ないと言うべきだったか。
619デフォルトの名無しさん:04/11/14 19:12:50
つーかそれは継承以前の問題じゃ。
620デフォルトの名無しさん:04/11/14 19:21:51
int a=10;
int b=10000;

a=a+a;
b=b+b;

の計算はどちらが速いのでしょうか?
桁数が多いほど計算速度も遅くなるのでしょうか?
621デフォルトの名無しさん:04/11/14 19:22:55
いっしょ。
ならない。
622訂正:04/11/14 19:23:20
for (i=0;i<1000;i++)
{
a=a+a;
b=b+b;
}
です
623デフォルトの名無しさん:04/11/14 19:24:06
>>621
なんでですか?
桁数が多いほど遅くなりそうな感じがするのですが…
624デフォルトの名無しさん:04/11/14 19:27:40
>>623
桁数の応じて遅くなったら困るだろ。
CPUの設計者がそこらへん気を使ってくれてるんだよ。
625デフォルトの名無しさん:04/11/14 19:30:13
簡単なテスト用コードお願いできますか?
626デフォルトの名無しさん:04/11/14 19:31:26
>>623
桁数が多いほど遅くなりそうに思うのはなぜだい?
627デフォルトの名無しさん:04/11/14 19:35:44
もちろん32ビットCPUで64ビット整数の演算をさせたら大抵32ビット整数演算の2倍の時間が掛かるし、実数演算は更に時間が掛かる。
628デフォルトの名無しさん:04/11/14 19:41:03
int型はそのマシンで最高速度の演算が可能な大きさであることが保障されているので
int型に入るならどんな計算も一緒
629デフォルトの名無しさん:04/11/14 19:44:47
>>628
そんな保証はねーよ。
「自然な」とかいういいかげんな指定があるだけ。
630デフォルトの名無しさん:04/11/14 19:55:43
では

int a = 10, b = 100000;
int c = 2, d = 997;

a = a / c;
b = b / d;

だと、どちらが速いですか?
631デフォルトの名無しさん:04/11/14 19:57:18
>>630
どっちも最適化で消える(プ
632デフォルトの名無しさん:04/11/14 19:59:53
じゃ、volatile 付けたとして。
633デフォルトの名無しさん:04/11/14 20:01:20
T[1000000]に対する演算だったりするとTの型でかなり処理時間かかるけどな。
634デフォルトの名無しさん:04/11/14 20:27:35
>>630
一応マジレスしとくと、「同じ」
635デフォルトの名無しさん:04/11/14 20:41:39
コンパイラが非常に賢ければ/2はshiftにしてくれるかもしれんが
まあ一緒だろうな
636デフォルトの名無しさん:04/11/14 21:07:28
いや、どちらも最適化で割り算そのものが消える。
637デフォルトの名無しさん:04/11/14 21:08:25
gcc環境でC++によるコマンドラインプログラムを作っており、悩んでいることがあります。
起動時に設定ファイル(パラメータが入っています)を読み込みたいのですが、
作ったプログラムと同じディレクトリに置いてある設定ファイルを読むためにはどのよう
に記述すれば良いしょうか?

設定ファイルをソースの中に埋め込んでも良いのですが、
ほぼ一つしか使うことが無いとはいえ2種類あり、
一つが3000行ちかくありますので
外部に出したほうがよいと自分は考えております。

FAQでしたら申し訳ありません。
638デフォルトの名無しさん:04/11/14 21:09:02
>>636
結論は「同じ」でいいんだよね?
639デフォルトの名無しさん:04/11/14 21:13:32
C言語からORACLEのPL/SQLを呼びたいのですが

どうしたらできます?
640デフォルトの名無しさん:04/11/14 21:19:01
>>630
x86アーキテクチャではこっちの方が速い
unsigned int a = 10, b = 100000;
unsigned int c = 2, d = 997;

a = a / c;
b = b / d;
641デフォルトの名無しさん:04/11/14 21:20:03
>>639
OracleJapanに問い合わせる。
#そしてoo4oを使う羽目になる。

>>638
そそ、シフトがどうとかではなく、単にどちらもイミディエイトな代入になることが予想される。
642デフォルトの名無しさん:04/11/14 21:21:57
9
3969
29929
1999396
299739969
2909199969
19299599929
909995799969
???????????????

なんかC言語知ってる方なら?に入る数字がわかるらしいのですが・・・
わかる方がいたなら教えてください、お願いします・・・・
643デフォルトの名無しさん:04/11/14 21:24:12
>>636
a,b代入されてるじゃん多分消えないよ
644デフォルトの名無しさん:04/11/14 21:24:49
>>640
ただし、最適化を一切行なわない、比較する意味のない条件においてのみ。

>>637
カレントワークディレクトリに置いていいならfopen("foo", "r")でいいだろう。
実行モジュールと同じディレクトリに置きたいなら、環境依存。
Unixなどのコマンドライン環境では、一般的には無理。
Windowsでは限定的には実行モジュールのあるディレクトリ=カレントワークディレクトリとなるが、
決定的ではない。
645デフォルトの名無しさん:04/11/14 21:25:21
>>637
移植性を考慮しないならOSなどの環境を書いて再度相談すべし。
646デフォルトの名無しさん:04/11/14 21:27:21
割り算が消えるというのは
掛け算に直されるという意味ですか?
647デフォルトの名無しさん:04/11/14 21:29:03
>>643
実験してから出直しておいで。

>>646
>>641
648デフォルトの名無しさん:04/11/14 21:29:16
>>644
> Windowsでは限定的には実行モジュールのあるディレクトリ=カレントワークディレクトリとなる

Windowsでもそんなことは期待できない。
WindowsならGetModuleFilename()が使える。
649デフォルトの名無しさん:04/11/14 21:31:31
>>648
あなたの頭にある、その白地に黒っぽい丸の描かれた球状の物体はガラス細工か何かですか?
650デフォルトの名無しさん:04/11/14 21:37:15
>>644
>>645
お返事ありがとうございます。
将来的にはWINDOWSでも動かしたいなとは思っています。
現時点では、UNIXで動作すればよいです。

一応自分なりの考えをまとめました。
CFLAGSで、make installで入る予定のフォルダを指定してプログラム内に埋め込む。
プログラム内で、
実行モジュールと同じディレクトリと、カレントディレクトリ
の2箇所に設定ファイルがあるかどうかを確認する。
発見できればOK、無ければエラー終了。
と考えております。

651デフォルトの名無しさん:04/11/14 21:56:35
>>649
「限定的には」「決定的ではない」なんてのはちゃんと読んだ上で言ってんだよ。
644の書き方だと、UnixとWindowsでOSレベルの差が有るように読めちゃうだろ。
652デフォルトの名無しさん:04/11/14 21:57:28
>>649
おまえはアフォ
653デフォルトの名無しさん:04/11/14 22:03:18
operator+=を書くときに
メンバとして
Hoge& operator+=(const Hoge& h)
と書くのと、グローバルに
Hoge& operator+=(Hoge& h1, const Hoge& h2)
と書くことの違いはなんですか?
特に違いは無く後者のほうはHogeと関係の無いところで演算子を定義できる便利機能ということでしょうか?
654デフォルトの名無しさん:04/11/14 22:07:10
>>653
違いはメンバ関数か否か、としか言いようがないな。

大抵はprivateメンバを触る必要があるだろうからメンバになるけど、
friendにする必要がなければグローバルでも全然問題ないし。
655デフォルトの名無しさん:04/11/14 22:07:58
継承とか
656デフォルトの名無しさん:04/11/14 22:11:42
>>654
thx
657デフォルトの名無しさん:04/11/14 22:25:12
継承はポリモーフィズムを活用するために利用するのであって、
インタフェースが似てるからとかいう理由だけで継承するのは
間違い。
658デフォルトの名無しさん:04/11/14 22:35:01
>>653の質問に関連するとおもいますが、

class Complex
{
    double r, i;
    public :
     Complex(double r= 0.0, double i = 0.0) : r(r), i(i) {}
     double real() const{return r;}
     double imag() const{return i;}

     Complex & operator += (const Complex & rhs) throw ()
     {
       r += rhs.real();
       i += rhs.imag();
       return *this;
     }
   };

上で定義した複素数クラスで複素数同士の和を計算するオペレーター
operator += (const Complex & rhs)
では、引数が1つですが、
a+=b
を計算すると、どうしてa+bが計算されるのかわからないんす。
この場合、引数はbだと思いますが、aも引数にならない(なっているのかもしれない)
んでしょうか?
どう考えたらいいんすか?
とにかく、お聞きしたいのは、引数が一つでありながら、引数が2ついるような計算が
どうやって実現されているのか、っす。。
659デフォルトの名無しさん:04/11/14 22:38:58
>>658

a+=b;

a.operator+=(b);
660デフォルトの名無しさん:04/11/14 23:04:34
>>650
UNIXだと
インストール先のパスをPREFIXとすると
その手の設定ファイル(仮にhoge.confとする)は
$PREFIX/share/hoge/hoge.conf
こんな感じに置くのが一般的な気がする

PREFIXは
$ ./configure --prefix /usr/local
こんな感じで指定
661デフォルトの名無しさん:04/11/14 23:06:36
すいません初歩的な質問かもしれません。
C言語の標準命令でコンソールアプリケーションのカーソルを
移動させたり画面を消去したりする命令があれば教えてください。
printfでエスケープシーケンスを使う以外の方法が知りたいのですが‥
よろしくお願いします。
662デフォルトの名無しさん:04/11/14 23:07:46
>>661
ないよ。
コンソールのカーソルなんて想定されてないし。
663デフォルトの名無しさん:04/11/14 23:13:39
>>661
環境依存だけど

UNIX
system("clear");

Windows
system("cls");
664デフォルトの名無しさん:04/11/14 23:18:47
>>661
#include <windows.ini>

COORDp;
p.X = x;
p.Y = y;
SetConsoleCursorPosition(h, p);
665デフォルトの名無しさん:04/11/14 23:30:01
>>662-664
即レスありがとうございました。
標準命令ではないんですね。
>>664さんの方法でも調べてやってみます。
この場合コンソール画面のハンドルを取ってこないと駄目なんですね。
画面消去だけなら>>663さんの方法でできそうなんでこちらも参考にさせていただきます。
どうもありがとうございました。
666デフォルトの名無しさん:04/11/14 23:33:05
>>650
正しくないとは思いつつもbin/以下に設定ファイルを入れてました。
早速shareに変更します。
ありがとうございました。
667デフォルトの名無しさん:04/11/15 01:51:27
>>653
friend関数なら多態が効く。
メンバ関数は効かない。
668デフォルトの名無しさん:04/11/15 03:16:18
確かにクラスを使うと頭の整理はつくが、
デバッグは面倒になったような気がする。
669デフォルトの名無しさん:04/11/15 04:46:57
>>668
それは変だぞ。
670デフォルトの名無しさん:04/11/15 05:17:06
hoge.exe の 0x00478bd0 でハンドルされていない例外が発生しました : 0xC00000FD: Stack overflow。
というエラーが出て
黄色い矢印がこの行を指してました
if (abs(a)==abs(b))

どうすればいいのでしょうか?
考えられる原因や対策を教えてください
671デフォルトの名無しさん:04/11/15 05:25:22
>>670
>どうすればいいのでしょうか?
ソースを晒す。あと環境も。
672デフォルトの名無しさん:04/11/15 05:29:32
>>668-669
いろんな力量の人が係わってるプロジェクトでは現実そうなるのでは。
スーパーハカー集団が組んでるならどんなクラスを使ってもいいんだろうけど。
673デフォルトの名無しさん:04/11/15 05:30:48
>>671
ソースはサイズが大きいので無理です、すいません
環境はVC++.netです
674デフォルトの名無しさん:04/11/15 05:33:38
>>672
いろんな力量の人が係わってるプロジェクトを純Cで遂行したら
その方が遥かにデバッグが面倒だと思うが?
675デフォルトの名無しさん:04/11/15 05:35:46
>>673
初心者が何処で勘違いしてるかなぞソース見な誰もわからん。
ソース晒すのが嫌なら自力で解決しろ。
676デフォルトの名無しさん:04/11/15 05:51:28
abs()が再帰しているか、defineマクロでaとかbとか使っているか、その辺かな?
677デフォルトの名無しさん:04/11/15 07:05:15
>>667
単純ミスだとおもうのですが、メンバとfriend指定が逆ですよね。
Base*に入れた派生型のオブジェクトに対して呼ばれて欲しいoperatorが呼ばれないと。
そういうことですね。
678デフォルトの名無しさん:04/11/15 07:45:11
>>659
>a.operator+=(b);

レスどうもです。
それでも、やっぱり引数が一つ(b)なのにもう一つの「a」 との和が計算できる
理由がわからんのです。。

それとも「a」も引数と考えていいんですか。。。?
679デフォルトの名無しさん:04/11/15 08:20:38
char str[128]に入っている文字列を
LPSTR型に変換するにはどうしたら良いでしょうか?
680デフォルトの名無しさん:04/11/15 08:36:28
>>678
> それとも「a」も引数と考えていいんですか。。。?

それが正解。
「thisポインタ」を調べれ。
681デフォルトの名無しさん:04/11/15 08:38:50
>>678
そんじゃ君は
a.operator+=(b);
~
↑このaが意味ないと思ってるワケ?
682デフォルトの名無しさん:04/11/15 08:59:36
C風に書くと
a->operator+=(this, b);
683デフォルトの名無しさん:04/11/15 13:49:45
>>650
>CFLAGSで、make installで入る予定のフォルダを指定してプログラム内に埋め込む。
別の案としては今作っている実行ファイルは直接は呼び出さないようにして
$PREFIX/lib/hoge/hoge.real
みたいにパスの通ってないところに置いといて
hoge.realを呼び出す以下のようなhogeを$PREFIX/binに置いておくとか

$ cat hoge
#!/bin/sh
PREFIX=`which hoge | sed 's/\/bin\/hoge/ /g' | awk '{print $1}'`
$PREFIX/lib/hoge/hoge.real "$@"
exit

>>666
各ファイルの置場は
$ man hier
が参考になるよ

UNIXプログラミング質問すれの方が良いレスがつくかもね
684683:04/11/15 14:34:12
ちょっと補足すると
hoge経由でhoge.real(当初のプログラム)を起動することで
arg[0]
からPREFIXが分かり設定ファイルの位置($PREFIX/share/hoge/hoge.conf)が特定出来ます
PREFIXの解析をダブらせたくなかったら

$ cat hoge
#!/bin/sh
PREFIX=`which hoge | sed 's/\/bin\/hoge/ /g' | awk '{print $1}'`
$PREFIX/lib/hoge/hoge.real $PREFIX "$@"
exit

みたいにしてhogeで得たPREFIXを引数に渡して起動してもいいかも
685デフォルトの名無しさん:04/11/15 14:38:36
a+=b;

a=a+b;
は同値と形で覚えちゃえ!
686デフォルトの名無しさん:04/11/15 14:40:45
a+=b;
を「aに足すのはb」と読むようになったら違和感なくなった。
687デフォルトの名無しさん:04/11/15 15:11:03
fgetsでテキストファイルから読み込んだ時のストリームのフラッシュには
どのようにすればいいのでしょうか、
688デフォルトの名無しさん:04/11/15 15:18:49
>>687
読み込んだときにフラッシュする必要はないと思うのだが。
再度読ませたいならシークすればいいかと。
689デフォルトの名無しさん:04/11/15 15:46:54
a+=b;

mov eax, a;
add eax, b;
mov a, eax;
と覚えたら違和感なくなった
690デフォルトの名無しさん:04/11/15 16:00:42
>>689
むしろ
lea eax, a
mov ebx, b
add [eax], ebx
の方がイメージ近くないか?
691デフォルトの名無しさん:04/11/15 17:08:29
初心者にゃわからんて...orz
692デフォルトの名無しさん:04/11/15 19:10:31
>>682
>a->operator+=(this, b);
なるほど。。そう見るってことっすか。
ちょっと目から鱗が落ちた感じっす。
どうもありがとうっす!
693デフォルトの名無しさん:04/11/15 19:21:02
在日 +=ニューカマー

mov ニューカマー、半島人
add 密入国者、ニューカマー
mov 在日、密入国者
694デフォルトの名無しさん:04/11/15 19:26:10
w

695デフォルトの名無しさん:04/11/15 21:19:55
VC6 を使っているのですが、
MSDN に setvbuf で指定できるサイズの上限は 32768 未満
と書かれているのですが、1MB を指定してもエラーにならないのはどうしてでしょうか。
696デフォルトの名無しさん:04/11/15 21:21:35
so-suyome
697695:04/11/15 21:22:51
VC6 の CRT ソースコードは次のようになっていた。

#ifdef _WIN32
if ( (type != _IONBF) && ((size < 2) || (size > INT_MAX) ||
#else /* _WIN32 */
#if defined (_M_MPPC) || defined (_M_M68K)
if ( (type != _IONBF) && ((size == 0) || (size > INT_MAX) ||
#endif /* defined (_M_MPPC) || defined (_M_M68K) */
#endif /* _WIN32 */
((type != _IOFBF) && (type != _IOLBF))) )
return(-1);

MSDN のドキュメントは 16 ビット コンパイラでも
動作するように書かれているわけかな。。。
698マイク ◆yrBrqfF1Ew :04/11/16 04:07:35
>>685
それは結城浩的には「aにbを足し込む」だな
699デフォルトの名無しさん:04/11/16 20:15:47
原因不明のバグに取り憑かれてしまった
こんなのありえねーってなバグ
700デフォルトの名無しさん:04/11/16 20:17:55
どんなの?
701デフォルトの名無しさん:04/11/16 20:51:44
>>699
そうか、バグフィックス頑張れよ
702デフォルトの名無しさん:04/11/17 00:13:15
しかしこいつもしつこいな
いつまで粘着するつもりだ

とりあえず下げることを覚えろ、この池沼めが
703r:04/11/17 02:03:54
>>698
+= 足し込む
-= 引き込む
*= 駆け込む
/= 割り込む
&= 且つ込む
|= 或は込む
<<= 論理左シフト込む
>>= 論理右シフト込む

足し込む以外はちょっと不自然かな。
704デフォルトの名無しさん:04/11/17 02:12:52
ちょっとどころじゃないだろw
705デフォルトの名無しさん:04/11/17 02:28:22
a.func();
は、「aにfuncをどっとこむ」
706デフォルトの名無しさん:04/11/17 02:29:27
>>705
こむってなに?
707デフォルトの名無しさん:04/11/17 02:42:08
a+=b 「a」に「足す」の「は」「b」
a-=b 「a」から「引く」の「は」「b」
a*=b 「a」に「掛ける」の「は」「b」
a/=b 「a」を「割る」の「は」「b」
a&=b 「a」に「andる」の「は」「b」
a|=b 「a」に「orる」の「は」「b」
a<<=b 「a」を「左シフトる」の「は」「b」
a>>=b 「a」を「右シフトる」の「は」「b」

後半の演算子を「〜る」にしたのはちょっと不自然かな。
708デフォルトの名無しさん:04/11/17 09:34:14
fuck
709デフォルトの名無しさん:04/11/17 09:57:14
関数内でreturn書いたらそこから呼び出し元に戻るんですよね?
関数内の途中でで処理を終了したいときはそこにreturnを書けばいいのでしょうか?
710デフォルトの名無しさん:04/11/17 10:04:53
Visual C++ (Mac版)ってないんですか?

すごくやりたいです。
もうCodewarriorやProject builderから逃げ出したいんです。
でもMacからは離れたくないんです。

夜も眠れません。。
だれか助けて。。
711デフォルトの名無しさん:04/11/17 10:09:36
>>710
>もうCodewarriorやProject builderから逃げ出したいんです。

その気持ちはわかる。

>でもMacからは離れたくないんです。

その気持ちがわからん。
712!=710:04/11/17 10:21:19
Macだとマシンの構成からOSまで全部同じなので調べるときに迷わないで済む。
713デフォルトの名無しさん:04/11/17 10:23:40
>>712
何が?
714!=710:04/11/17 10:23:40
システムオタクだっていうなら好きにしてくれ。
715デフォルトの名無しさん:04/11/17 11:12:22
未だにMacOS7.6.3使ってるからOSXなんてちっとも判りませんが何か。
716デフォルトの名無しさん:04/11/17 11:57:57
>>709
出来るけど、returnは関数の最後にひとつだけが好ましいとされている。
これもgoto論争ほどではないにしても昔から言われている問題。
簡単に構成しなおせるなら最後にひとつだけになるようにするほうが無難だと思う。

とりあえず、喪前が書こうとしている関数をさらしてみれ
717デフォルトの名無しさん:04/11/17 13:32:15
#include <stdio.h>
struct a
{
int x;
int y;
};
int main()
{
struct a b[3];
b[0]={1,2};
}
としてbに値を代入しようとするとエラーが出ます
なぜでしょうか?
718デフォルトの名無しさん:04/11/17 13:41:39
charからTCHARに変換するときって何使うんですか?教えてください。
719デフォルトの名無しさん:04/11/17 14:11:48
>>717
>b[0]={1,2};
これは何ですか?
720デフォルトの名無しさん:04/11/17 14:17:53
>>719
b[0].xに1
b[0].yに2を代入しようとしたのです
721デフォルトの名無しさん:04/11/17 14:20:35
せめて入門書くらいは読め
もし既に読んでてその程度なんだったら人間やめろ
722デフォルトの名無しさん:04/11/17 14:22:42
>>717
変数宣言時にこうやって初期化するしかない。
struct a b[3] = {{1,2}, {3, 4}, {5, 6}};
これは後に改良されていてC99対応コンパイラならb[0] = (struct a){1, 2};とできる。

C99非対応コンパイラでもこういう関数を作ることもできるがおすすめしない。
struct a create_a(int a, int b)
{
  struct a new_a = {a, b};
  return a
}
C++ならこういうのをコンストラクタに用意するのはたまに見かける。(これは良いと思う)
723デフォルトの名無しさん:04/11/17 14:28:45
>>722
お返事ありがとうございます
早速試してみます
724デフォルトの名無しさん:04/11/17 14:31:10
725デフォルトの名無しさん:04/11/17 14:42:39
>>723
書き忘れていたけど、当然こう書く方法もある。メンバ数が少ない物限定だが。
b[0].x = 1;
b[0].y = 2;
726デフォルトの名無しさん:04/11/17 14:43:54
やさしいCにあったコードですが、

#include <stdio.h>
int main(void)
{
FILE *pf;
pf = fopen("test.txt", "w");
if (pf == NULL)
{
printf("ファイルをオープンできませんでした。\n");
return 1;
}
else {
printf("ファイルをオープンしました。\n");
}
fclose(pf);
printf("ファイルをクローズしました。\n");
return 0;
}

なぜ return 1 と return 0 を使い分けているのですか?
727デフォルトの名無しさん:04/11/17 14:51:40
>>726
そのプログラム単一では意味がないけど
別のプログラム(Aとしよう)からそのプログラム(Bとしよう)を呼んだ場合に
Bの返り値(returnで返す値)によってAのその後の処理を分岐するのに使用する
728デフォルトの名無しさん:04/11/17 14:55:09
プログラム終了時や関数終了時の返り値は基本的に
0が正常終了でそれ以外は異常終了ってことが多いから。
他のプログラムや関数で利用するときに便利でしょ。
729デフォルトの名無しさん:04/11/17 14:56:24
>>727
なるほど、そういうことでしたか。
ありがとうございます。
730デフォルトの名無しさん:04/11/17 14:57:47
>>725
重ね重ねありがとうございます
731デフォルトの名無しさん:04/11/17 14:59:11
>>728
レスありがとうございます。
732デフォルトの名無しさん:04/11/17 15:37:39
C++でμs単位でプログラムの実行を待機させるいい方法ないですか?
733デフォルトの名無しさん:04/11/17 15:41:27
volatile { a = a; }
734デフォルトの名無しさん:04/11/17 15:50:42
>>732
マイクロ秒待機させるってどんな用途なの?
735デフォルトの名無しさん:04/11/17 15:51:44
>>734
制御系
736デフォルトの名無しさん:04/11/17 15:53:33
>>735
割り込み使えよ
737デフォルトの名無しさん:04/11/17 15:55:23
制御系だったら、チップによって違うだろうけれど内部になんらかのタイマを持っているんじゃない?
738デフォルトの名無しさん:04/11/17 15:57:12
739デフォルトの名無しさん:04/11/17 16:02:01
>>734
C++でネットワークのシミュレーションを行っているのですが、
その中で使いたいと考えているのです。
740デフォルトの名無しさん:04/11/17 16:05:25
>>739
http://pc5.2ch.net/test/read.cgi/tech/1098912550/891-899
ここのマルチじゃないよな?
741デフォルトの名無しさん:04/11/17 16:06:22
環境くらい書け
742デフォルトの名無しさん :04/11/17 16:07:30
.NETプログラム(__gcのついたクラス内)で、STLとか、
CのファイルAPIとか(FILE*とか)使うには
どうするんですか?
String*はwchar_tに変換できるみたいですが、
デフォルトでwide characterを使用するんですかね?
743デフォルトの名無しさん:04/11/17 16:07:32
>>740
違います。ms単位でのやり方はわかっていたのですが、
もっと精度の良い方法はないものかと思って質問しました。
744デフォルトの名無しさん:04/11/17 16:10:15
環境くらい書け
745デフォルトの名無しさん:04/11/17 16:12:21
>>741,744
すみません。VC++です。。
746デフォルトの名無しさん:04/11/17 16:13:46
>>743
あるにはあるけれど、マイクロ秒だと結果に誤差がありすぎて使いものになるかどうか
わからないよ
747デフォルトの名無しさん:04/11/17 16:18:42
>>746
そうですか・・・
けど、一応教えていただけますか?
748デフォルトの名無しさん:04/11/17 16:29:12
Windowsでμ秒を扱おうなどとは笑止。
749デフォルトの名無しさん:04/11/17 16:33:02
>>748
Linuxなら可能ですか?
750デフォルトの名無しさん:04/11/17 16:41:40
>>749
リアルタイムリナックスについて
http://pc5.2ch.net/test/read.cgi/linux/988393952/
751デフォルトの名無しさん:04/11/17 16:41:48
パソコンなんぞでμ秒を扱おうなどとは笑止千万。
752デフォルトの名無しさん:04/11/17 16:47:47
>>742
コピーコンストラクタを持たないGCのクラスにSTLは使えないらしい。
753デフォルトの名無しさん:04/11/17 21:21:42
>>752
普通GCクラスはコンテナに入れるときもポインタ使うから
コピーコンストラクタは不要かと。
754デフォルトの名無しさん:04/11/18 03:47:38
パソコンでピコ秒を扱うスレはここですか?
755デフォルトの名無しさん:04/11/18 03:54:19
μ秒を扱いたいなら組み込み系
756デフォルトの名無しさん:04/11/18 04:20:59
手元の本に「(デバッグが面倒でも)最低でもassert()は使え、使いまくれ!」
とあるので早速私もassert教にに入信しようと思ったのですが、
assert()ちゅうのはReleaseビルドだと完璧に無視されるのでしょうか?
ヘッダとやらを覗いてみてもプルプロセッサがゴチャゴチャしてて降参です。
757デフォルトの名無しさん:04/11/18 04:40:36
はいそうです
758デフォルトの名無しさん:04/11/18 04:50:21
>>757
便利なもんですなー、跡形もなくなりますか
使いまくります、レスありがとうございました
759デフォルトの名無しさん:04/11/18 06:29:23
コードコンプリート?
760デフォルトの名無しさん:04/11/18 08:57:59
static constなメンバ変数を初期化するのに、ヘッダにて
const int Hoge::value = 0;
と書いて複数翻訳単位からincludeするとリンカで多重定義だとおこられますよね。
しかし以下のようなtemplateクラスの場合は問題ないようですがどうしてでしょうか?
template<typename T> const T Hoge<T>::value = 0;

複数の翻訳単位でそれぞれ例えばHoge<int>を実体化させれば
valueもそれぞれに定義されそうですが。。。
761デフォルトの名無しさん:04/11/18 09:00:34
ちなみに特殊化バージョンでは怒られました。
template<> const int Hage<int>::v = 0;
VC6です。
762デフォルトの名無しさん:04/11/18 09:46:33
VC6を捨てるのが一番。
763デフォルトの名無しさん:04/11/18 09:57:46
>>762
これは規格どおりの動作。どのコンパイラでも同じだろう。
764デフォルトの名無しさん:04/11/18 10:05:07
>>760
テンプレートってそういうものだから。
765デフォルトの名無しさん:04/11/18 10:11:00
たぶん >>760

>static constなメンバ変数を初期化するのに、ヘッダにて
>const int Hoge::value = 0;
>と書いて複数翻訳単位からincludeするとリンカで多重定義だとおこられますよね。

これの理由も分かっていないと思われ
766デフォルトの名無しさん:04/11/18 10:18:14
ん、わかってるけど初心者スレなんだから、理由説明したってわからんでしょ。
それはそういうものだとしとくのが一番。
767デフォルトの名無しさん:04/11/18 10:19:39
あー、初心者スレじゃなかったな。スマソ。
でも理由は面倒なので説明しない。
768デフォルトの名無しさん:04/11/18 10:40:01
One Definition Rule(ODR) と、キーワードを置いておこう。
769760:04/11/18 15:17:19
>>768
ODRは>>765に対するキーワードですよね?
>>760ではtemplateにしたところで複数翻訳単位から実体化すれば
ODRに引っかかるのではないのですか?という質問です。

main.cppでHoge<int>使用 Hoge<int>::value = 0;
sub.cppでHoge<int>使用 Hoge<int>::value = 0;

リンカであぽーん
とならないのは何故ですかという質問です。
770760:04/11/18 15:44:15
あれれれれ。そんなことを言い出すとテンプレートすべてがODR違反になりますね。
結局>>764ということで、templateとして解決されるということか。。。
771デフォルトの名無しさん:04/11/18 15:46:13
>>760
アフォ?
772760:04/11/18 16:05:56
>>771
えぇぇ。まだ間違っているの?
もう頭がパンクしました
773デフォルトの名無しさん:04/11/18 16:14:42
複数の翻訳単位で実体化したとしても同じ型のテンプレートクラスは
1回しか生成されない罠。
でなきゃテンプレート使ってられないだろ。
774760:04/11/18 16:24:09
>>773
了解です。
最初におおきなかん違いをして混乱しました。
775デフォルトの名無しさん:04/11/18 18:55:33
ある変数の値が真になるまで待ってから次の処理を行う、という感じの
ソフトを作ってますが、CPU 使用率が 100% になってしまいます。
(あたりまえですが )
何か良い方法ってありませんでしょうか?
776デフォルトの名無しさん:04/11/18 18:56:34
待ち時間はCPUを占有するな

以上
777デフォルトの名無しさん:04/11/18 19:05:46
>>776
どうすれば占有しないように出来ますか?やっぱり sleep ?
778デフォルトの名無しさん:04/11/18 19:19:44
>>777
・自分で見に行くのではなく、通知して貰えないか検討する。
・自分で見に行くなら最低限、ほんの僅かでもsleepする。
#Unixならselect()で代用化、Win32APIならSleep(1)。
779デフォルトの名無しさん:04/11/18 19:40:03
>>778
ありがとうございます。
やっぱりそうですよね。Unix でネットワーク関連やったときは
select で行えたので問題なかったので、大丈夫と思ってましたが
Win では select が使えないでこういう問題になってしまいました。
通知というのは Unix でいうところの signal のようなものですね?
780デフォルトの名無しさん:04/11/18 21:06:58
関数に戻り値がない時はreturnは書かなくてもいいのでしょうか?
781デフォルトの名無しさん:04/11/18 21:19:10
return を値を返すもの、という考え方より
(関数に入って)戻ってくるという考え方の方がいいかと

ループ途中に一定条件で return で関数抜けるときとかによく使うしね
782デフォルトの名無しさん:04/11/18 21:41:53
>>779
いや、Win32APIなら通知して貰う手段は色々あるよ。専用スレで聞いてみたら?
783デフォルトの名無しさん:04/11/18 22:18:47
784デフォルトの名無しさん:04/11/18 22:41:45
>>775
Windowsならある変数(boolだよな)の代わりにイベントオブジェクトを作り、待機にはWaitForSingleObject()などを使う。
785デフォルトの名無しさん:04/11/18 23:10:17
ある未知のクラスに対し、何らかのイベントが発生したことを知らせたいのですが、
次の3つの方法以外に何かスマートな方法はありますでしょうか。
・(Cの)コールバック関数を接続する
・連絡用のクラスを作り、未知のクラスにこのクラスを継承させる
・externで連絡先クラスのオブジェクトを取り込む

具体的には、Qtのsignal/slotのような手法を取りたいのですが、
標準のC++でこれに似た方法は何かないですか?
786785:04/11/18 23:18:29
つまり簡単に言うと、コールバック関数の接続をCの関数ではなく、
クラスのメンバ関数に行えるようにしたいわけです。
787デフォルトの名無しさん:04/11/18 23:24:51
ソースに
printf(" %7.4f と %7.4f です。\n",x1,x2);
っていうのがあるんだけど、7.4って何?
788デフォルトの名無しさん:04/11/18 23:25:15
>>787
整数部7桁 小数部4桁で揃え表示
789デフォルトの名無しさん:04/11/18 23:25:52
>>788即レス 感謝です。
790788:04/11/18 23:29:16
脊髄反射で間違えた(;´Д`)
全体で7桁揃えで、小数部の精度が4桁
791デフォルトの名無しさん:04/11/18 23:35:53
整数→文字列への変換を行う関数ってありませんか?逆はatoi関数でできると思うのですが…
792デフォルトの名無しさん:04/11/18 23:36:41
itoaか、printf系関数で%dを指定
793デフォルトの名無しさん:04/11/18 23:39:13
itoaでしたか…ありがとうございます。
解説ページにitocってあったので勘違いしてましたorz
794デフォルトの名無しさん:04/11/18 23:58:49
boost::lexical_cast<std::string>()が一番楽
795デフォルトの名無しさん:04/11/19 00:40:53
そして一番遅い
796デフォルトの名無しさん:04/11/19 00:45:43
しかし安全
797デフォルトの名無しさん:04/11/19 00:46:04
そしてスマート
798デフォルトの名無しさん:04/11/19 00:57:31
後からCOOL!!
799デフォルトの名無しさん:04/11/19 01:15:41
そしてそのうち標準
800デフォルトの名無しさん:04/11/19 01:32:25
例えばプログラムを組んでいて、クラスをほとんど構造体の代わりの
ように使いたい場合があります。

class A {
public:
int a;
int b;
};

のようなコンストラクタやデストラクタが明示的に定義されてないクラスの場合、
コンストラクタやデストラクタはデフォルトが使われるようなのですが
この場合のデフォルトコンストラクタ、デストラクタでは何が行われる
んでしょうか? a, bが0に初期化されたりするんでしょうか?

上記のような構造体代わりに使いたいクラスの例の場合、コンストラクタ
デストラクタは省略しちゃっていいんでしょうか?
801デフォルトの名無しさん:04/11/19 01:36:10
>>800
デフォルトコンストラクタとデストラクタは何もしない
コピーコンストラクタは文字通りコピーする
802デフォルトの名無しさん:04/11/19 01:46:24
構造体代わりに使いたいのであれば、struct使えばいいような。
違いはメンバのデフォルトがpublicかprivateかというだけな訳で。
803デフォルトの名無しさん:04/11/19 01:52:34
>>800
むしろコンストラクタなしにしないと自由度が下がる。

A array[] = {
    { 10, 20, },
    { 30, 40, },
};

コンストラクタがあるとこんなことができなくなる。
804デフォルトの名無しさん:04/11/19 01:52:57
構造体代わりに使いたいのであれば、構造体使えばいいような。
違いはメンバのデフォルトがpublicかprivateかというだけな訳で。

たしか継承する時にもpublicかprivateの違いでてこなかったか?
805デフォルトの名無しさん:04/11/19 01:56:26
>>800
引数を必要としないコンストラクタとしての「デフォルトコンストラクタ」と紛らわしいので、
その意味では「デフォルト」と言わないほうがいい。
規格中の言葉に従って、「暗黙の」と言うのがお勧め。

暗黙のデフォルトコンストラクタは A() {} と同じ。
暗黙のデストラクタは ~A() {} と同じ。
806デフォルトの名無しさん:04/11/19 02:00:03
>>805
明示的にA()呼べば、暗黙のデフォルトコンストラクタはメンバを初期化してくれる。
807デフォルトの名無しさん:04/11/19 02:13:12
bcc32だとエラー E2015 runge.cpp 272: 'vector(long)'
と 'std::vector<T,Allocator>' の区別が曖昧 というエラーが
でてしまいます(bcc32 runge.cpp -lstdc++ -lm)。
Cygwinではコンパイルできます(gcc runge.cpp -lstdc++ -lm)。
bcc32でコンパイルするにはどうすればいいのですか?
お願いします。

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1099536469&res=2
808デフォルトの名無しさん:04/11/19 02:24:37
>>807
"butil.h"って何?これも晒してくれない事には何とも言えない。
809デフォルトの名無しさん:04/11/19 02:25:44
>>808
添付についてたよ
810デフォルトの名無しさん:04/11/19 02:26:24
どっかで
#include <vector>

using namespace std;
されちゃってるんじゃないかな。
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
この辺怪しそう。
つーか使うなこんなの。
どっちにしろvectorは紛らわしいから名前変えてみたら?
811デフォルトの名無しさん:04/11/19 02:31:01
>>809
サンクス。
>>807
Number *vector(long nh);
こういう名前の関数は取りあえず名前替えれ。
812デフォルトの名無しさん:04/11/19 02:39:18
>>806
PODに対しては特別にゼロ初期化がかかるというルール。
暗黙のデフォルトコンストラクタが初期化しているわけじゃない。

メンバに非PODを持ったり、デストラクタだけ定義したりすると
PODではなくなるのだが、その場合の動作については Defect Reports に載っている。
ttp://www.comeaucomputing.com/iso/cwg_defects.html#35
ttp://www.comeaucomputing.com/iso/cwg_defects.html#178
813デフォルトの名無しさん:04/11/19 03:37:31
namespaceについて教えてください。
以下のようなソースを書きましたが、
'hoge' : 識別子がクラス名でも名前空間名でもありません
というエラーが出てコンパイルが通りません。
ポインタしか定義してないのでTestA.hはなるべく
includeしたくないのですがこういう場合どうするのが一般的なのでしょうか?

TestB.h の方に namespace hoge{ class TestA; }
というダミーの宣言(?)をつけておけば
一応コンパイルは通りますが何か気持ち悪いです。

======================
TestA.h

namespace hoge{
class TestA
{
};
}

======================
TestB.h

class TestA;

class TestB
{
hoge::TestA* ptrA;
};
814デフォルトの名無しさん:04/11/19 03:41:30
正解は
======================
Test.A_fwd.h

namespace hoge{
class TestA;
}
======================
Test.A.h

#include "TestA_fwd.h"
namespace hoge{
class TestA
{
};
}
======================
TestB.h

#include "TestA_fwd.h"

class TestB
{
hoge::TestA* ptrA;
};
815デフォルトの名無しさん:04/11/19 14:02:59
以下のようなソースがうまく動かないんですけど、どこに問題があるのですか?
getcharを無視して後のコードを処理してしまいます。

do {
printf("終了しますか(Y/N)?\n");
ch = getchar();
} while (ch == 'Y' || ch == 'y' || ch == 'N' || ch == 'n');

試しに以下のように変えてみてもやはりうまくいきません。
printfが2回でてしまいます。

while (1){
printf("終了しますか(Y/N)?\n");
ch = getchar();
if (ch == 'Y' || ch == 'y' || ch == 'N' || ch == 'n'){
break;
}
}
816デフォルトの名無しさん:04/11/19 14:15:27
上のコードで、whileの後の
ch == 'Y'とかは ch != 'Y'の
書き間違いです。
817デフォルトの名無しさん:04/11/19 14:16:01
>>815
それは多分、そのコード以前にscanf等の関数で処理されなかった
改行コード等のゴミが標準入力に残ってるからだと思われ。
面倒なら、do {の前にfflush(stdin);を入れてみるとか
818デフォルトの名無しさん:04/11/19 14:23:07
>>817
レスありがとうございます。
fflush(stdin);を入れると、while(1)のほうではうまくいきました。
do の方はどうもうまくいきません。
819デフォルトの名無しさん:04/11/19 14:25:49
char *p = malloc(100);
if(p==NULL){
 エラー処理
}else{
 本処理
 free(p);
}
Cでmallocに失敗したとき、エラー処理をしている人はいますか?
また、エラー処理にはどんなコードを書きますか?
実際に書いている人がいたら具体的に教えてください。
820デフォルトの名無しさん:04/11/19 14:30:17
>>819
俺はこうしている。
if (p == NULL)
 return エラー値;
失敗時に0を返す関数なら0を返すし、失敗時に1を返す関数なら1を返す。
821デフォルトの名無しさん:04/11/19 14:38:41
815
doの中にも
ch = getchar();
fflush(stdin);
とすることでprintfが2回処理されるのはなくなりました。
whileの条件式も
while (ch != 'Y' && ch != 'y' && ch != 'N' && ch != 'n');
でした。
初心者に付き合っていただいてありがとうございました。
822デフォルトの名無しさん:04/11/19 14:49:23
根本的に間違っているけどまぁいいか。
823デフォルトの名無しさん:04/11/19 14:53:51
>>820
同一ブロック内でmalloc/freeが完結しているような処理で、
エラーを返すインターフェースのない場合のエラー処理について聞きたいのですが。

そういうのはよくない、内部でmallocしているすべての関数にエラーを返す
インターフェースを作れ。という方針でやるべきですか?
824デフォルトの名無しさん:04/11/19 14:54:34
質問です。
WindowsXP 上で、VC++ 6.0 SP5 を使っています。

ある MFC プロジェクトを新規作成し、
「プロジェクト」→「プロジェクトへ追加」→「ファイル」を用いて
外部から test.cpp と test.h を追加しました。
FileView にはこの2つのファイルが、
ClassView にはこのクラス内で定義されているクラスが表示されています。

プロジェクト名を Project とすると、CProjectView というクラスが最初から定義されていますが、
そのクラスの定義部分の // アトリビュート とあるところに、

(line:22) public:
(line:23) CClass test;

と追加したところ、
〜\projectview.h(23) : error C2146: 構文エラー : ';' が、識別子 'test' の前に必要です。

と言われました。
test.cpp、test.h は書籍の付録についていたもので、
22〜23 行目(上記)はサンプルを見てコピペしたものなので、エラーはないと思います。
プロジェクトへの追加方法が間違っているのかと思うのですが……。
よろしくお願いします。
825824:04/11/19 14:55:45
書き忘れました。
CClass は、test.h で定義されているクラスです。
826デフォルトの名無しさん:04/11/19 14:56:32
includeしてないんちゃうんか
827デフォルトの名無しさん:04/11/19 15:03:16
>>823
do{}while(failed);
を書いておく。
失敗を外部に伝える手段が無い=絶対に成功しなければいけない関数で、
万が一失敗してしまったら、その関数を終わることが出来ない。
成功するまでひたすら繰り返すしかない。
失敗したくせに何事も無かったかのように関数を抜けるのは最悪のパターン。
828≠820:04/11/19 15:04:17
>>823
例えば関数内でのmalloc()で確保するメモリ量が関数内で見積もれる場合、
MBオーダーでもなければ私はエラー処理しないこともある。
#外部要因でサイズが変わる可能性がある場合、そのサイズに制限がなければエラーチェックすると。
829デフォルトの名無しさん:04/11/19 15:09:37
>>823
if (p == NULL)
{
 puts("スマソ\n");
 abort();
}
830デフォルトの名無しさん:04/11/19 15:11:08
敢えてぬるぽを起こさせるべきだろう
831デフォルトの名無しさん:04/11/19 15:31:27
Cで、

typedef struct foo {
    int bar;
    char *baz;
    int x, y, z;
} foo_t;

foo->bar = 0;
foo->baz = NULL;
foo->x = 1;
foo->y = 1;
foo->z = 1;

...のように初期化してゆくのと、

foo_t foo_static_initializer = { NULL, 0, 1, 1, 1 };
foo_t *foo = malloc(sizeof(foo_t);
*foo = foo_static_initializer;

とどちらがいいですか?
832デフォルトの名無しさん:04/11/19 15:34:37
>>831
初期化用関数を書くのがいい。
833デフォルトの名無しさん:04/11/19 15:39:25
>>831
後者は冗長だし可読性も低いから嫌い。
前者は構造体が小さければ普通に代入。
大きければ初期化忘れ等を考慮してmemsetで0fillして0とNULLのセットを省略するとか。
834831:04/11/19 16:15:31
>>832-833
ありがとうございます。本当は、

/*ヘッダファイル内で*/
typedef struct foo foo_t;
foo_t *foo_new(/*some hints*/);

/*.cソース内で*/
struct foo {
/*メンバが10-*/
};
で、そのメンバ初期化関数foo_new()のなかで
foo->member = value_such_as_0_and_NULL;
がズラズラ20行近く並んだのを見て、なんかちょっとなぁと思いどちらが好ましいか聞いてみたくなったのです。
メンバが少ない時は前者でFAなのですすがすっt。

>後者は冗長だし可読性も低い
これはfoo_static_initializer = { ... }でどの初期値がどのメンバに対応するか一目で見て分かりにくい、ということですよね?
foo_t foo_static_initializer = {
    0, /*bar*/
    NULL, /*baz*/
とか値毎にコメントを付けるのもなんか面倒そうなので
アドバイス通りcalloc()して必要なメンバだけfoo->member = ...と書くことにします。

ちょっと積み込めすぎの気がしてきたので、グループ化して分けた方がいい気がしてきまったたt
835デフォルトの名無しさん:04/11/19 16:32:56
なぜRuby以外の言語はこんなに糞なのですか?
教えてください!!!!!!!!!!!
836デフォルトの名無しさん:04/11/19 16:45:23
Rubyの為なら死ねる!!!!!!!!!!!!!!!!!!!!!!!!!!
837デフォルトの名無しさん:04/11/19 16:47:11
Ruby is nanbar one!
838デフォルトの名無しさん:04/11/19 16:50:42

普通のgccでメールを送受信したいんですが
プログラム例ってどんなもんでしょう?


839デフォルトの名無しさん:04/11/19 16:51:34
>>838
Rubyなら簡単だよ!!!!!!!!!!!!!!!1
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> gcc
840デフォルトの名無しさん:04/11/19 16:58:11
>>839
じゃRubyでもおねがいします
841デフォルトの名無しさん:04/11/19 16:58:58
返事がな(ry
842デフォルトの名無しさん:04/11/19 17:22:46
>>831
そこでC99ですよ。
foo_t *foo = malloc(sizeof(foo_t);
*foo = (struct foo) {NULL, 0, 1, 1, 1};
843デフォルトの名無しさん:04/11/19 17:43:32
すみませんプログラミングではないのですが質問があります
Borland C++ Compilerとメモ帳を使って勉強しています

今までC言語の基礎をやっていたのですが
WINDOWSプログラミングの方に行こうとしたのですが

WINDOWSプログラミングをするとき
「Broland C++ Compilerの場合は-Wオプションをつけてください。」
と書いてあったのですが
Borlandのヘルプを色々検索したのですが
どこでその設定を変えるのか分からなく
解決できない状態になっています

どなたか解決方法わからないでしょうか?
宜しくお願いします
844デフォルトの名無しさん:04/11/19 17:47:11
スレ違いだクソボケ

タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/
845デフォルトの名無しさん:04/11/19 17:55:56
>>843
今まで:bcc32 hoge.c
この先:bcc32 -W hoge.c
846デフォルトの名無しさん:04/11/19 18:01:18
>>844
すみませんでした
向こうに書こうと思ったのですが
向こう16日ぐらいから書き込みが無いので
こっちに書いてしまいました

>>845
ありがとうございます
ーWをコンパイルするとき挟んであげれば良いんですね。

スレ汚し申し訳ありませんでした
847デフォルトの名無しさん:04/11/19 18:03:10
>>845
試したところ
無事出来ましたありがとうございました
848デフォルトの名無しさん:04/11/19 19:07:05
struct pos{
int x;
int y;
}:
↑の構造体で定義したpをstlのvectorに入れたい場合どうしたらよいでしょうか。
練習としてVCでコンソールアプリを作ってみているのですが、書き方が分かりません。
cout<<"xの値を入力"<<endl;
cin>>p.x;///←エラー

のような感じで10個ほど列(要素?)を追加していって
構造体配列の様にして、最後に表示してみたいのですが。。。
849デフォルトの名無しさん:04/11/19 19:19:28
>>848
最低一冊は入門書を読みましょう

エラーメッセージは?
それとposの定義の最後のコロンはセミコロンが正解だよ
850デフォルトの名無しさん:04/11/19 19:50:42
それ言ったら全部それで済むやん
851デフォルトの名無しさん:04/11/19 19:55:02
>>848
cin>>p.at(XX).x;
ではないのと、遠回しに言ってみるテスト
852デフォルトの名無しさん:04/11/19 19:59:11
>>837
全角な上に綴り違いなのはネタ?
まぁ、漏れもRubyは使うけど、
C/C++とは比較対象にはならんな。
853デフォルトの名無しさん:04/11/19 20:02:08
こんなアホ過ぎるエサで釣られる馬鹿初めて見たw
854Ruby >>>>>>>>>>>>> C++:04/11/19 20:02:18
http://web.archive.org/web/20000302001334/http://www.ruby-lang.org/ja/compar.html
--------------------------------------------------------------------------

C++
いろいろと有名なオブジェクト指向言語であるC++とRubyを比較すると:


C++なぞ問題外.^^;;;

--------------------------------------------------------------------------
855デフォルトの名無しさん:04/11/19 20:06:27
HSP 「21世紀にこんな言語はないだろう」 by まつもとゆきひろ

Perl 「Perlユーザは臭い」 by るびきち

Java 「Javaなんてうんこ」 by kitaj

C++ 「C++なぞ問題外.^^;;;」 by オフィシャルサイト

Ruby 「Rubyこそ最高言語」 by Rubyユーザ一同
856デフォルトの名無しさん:04/11/19 20:09:56
>>854
それはジョークだよ。馬鹿?
857デフォルトの名無しさん:04/11/19 20:11:48
http://web.archive.org/web/20000303064314/www.ruby-lang.org/en/compar.html
Let's compare other languages with Ruby.
We take up Perl, Python, Tcl, Java, Eiffel and C++.
This is based on our own judgment and biased view, however, it does not intend to spread fibs.
----snip--
C++
C++ is famous OOPL in many places. Now, let's compare C++ with Ruby:


Ruby is too good to compare ;-)

ジョークですか。そうですか。
858848:04/11/19 20:18:56
>>851
atっていうのは中身を取り出すやつじゃないんでしょうか?
調べても単純なintの場合とかしか載ってなくて構造体の場合の書き方が。。。
859デフォルトの名無しさん:04/11/19 20:24:37
851だけどごめんよ良く読んでなかった。
std::vector<pos> vec;
for(…){…
vec.push_back(p);
}
for(i=0…){…
cout<<vec[i].x;
}
を求めてるのかな?ふつーに参考書に載ってると思われ
ってゆうか載ってなかったらその本捨てておしまい。
860デフォルトの名無しさん:04/11/19 20:25:59
int* p;
int main (){
  p = new int[1000]
  for(int i=0; i<1000; i++)  p[i]++;
}
とするより
int main (){
  int* p = new int[1000];
  for(int i=0; i<1000; i++)  p[i]++;
}
としたほうが処理速度が速くなる理由はなぜでしょうか?
VCでリリースビルドした結果
mov  ecx,dword ptr ds:[418C34h]
inc   dword ptr [eax+ecx]

inc   dword ptr [eax]
のようになっていましたが全然わかりません
861デフォルトの名無しさん:04/11/19 20:34:25
>>858
at(n)はn番目の要素のある位置、つまりそこへの参照を返す。

>>860
pが後者ではレジスタ変数になっているように見える。
862デフォルトの名無しさん:04/11/19 20:35:06
// C++のファイル入出力ストリームについてなんですが

typedf struct ABC{ char a; int b; double c; };
ABC abc;

ifstream fin;
fin.open(filename, ios::binary);

// ここでabcにfinでopenしたファイルからABC型のバイナリデータを読み込みたい

fin.close();


// どうすりゃいいんでしょうか…
// Cだとfread(&abc, sizeof(ABC), 1, fp);ですよね…
// 環境はVC++.NETです
863デフォルトの名無しさん:04/11/19 20:35:46
read
864デフォルトの名無しさん:04/11/19 20:40:28
やはりreadですか…ありがとうございます。

ついでで申し訳ないんですが、そいつに渡す引数はどうすればいいでしょうか、、
865838:04/11/19 20:49:34
難しくてもいいからとりあえずメールを送ったりする
サンプルソースありませんか...
866デフォルトの名無しさん:04/11/19 21:00:50
msdn
867デフォルトの名無しさん:04/11/19 21:06:25
オープンソースのメールソフトなんかいっぱいあるだろうに
868デフォルトの名無しさん:04/11/19 21:57:36
>>865
メールの送信にはSMTP、
受信にはPOPというプロトコルを使う。
とりあえずPOPについて分かりやすいページとしては
↓これなんかオススメ
http://x68000.q-e-d.net/~68user/net/

これはアプリケーション層の説明しかないみたいだけど、
下位層のプロトコルはWininetとかのライブラリを使って解決するだけだから説明は略。
869デフォルトの名無しさん:04/11/19 21:59:42
>>861
レジスタ変数をよく理解していませんが確かにレジスタ1個でアドレッシングしているようです
一方グローバル変数のほうはp+オフセットという形で行っているようです
たまたまVCがそう最適化しただけで、C++一般の常識的な問題ではないのなら気にしないでおきます
870デフォルトの名無しさん:04/11/19 22:54:15
>>862
// ここでabcにfinでopenしたファイルからABC型のバイナリデータを読み込みたい
には結局何を打ち込めばいいんでしょうか・・・

msdn開いても理解できませんでしたorz
871デフォルトの名無しさん:04/11/19 22:59:00
>>865
sylpheed
kmail
辺りのソースをあたるとか
872デフォルトの名無しさん:04/11/19 23:01:42
>>869
グローバル変数にすると、マルチスレッドの場合を考慮して
pを参照しようとするたびにメモリからpの値をReadするようになってる。
別のスレッドが、いつpの値を書き換えてしまうか分からないから。

関数のローカル変数ならそういう心配はないので
レジスタに割り当てることができ、処理速度が速くなる。
873デフォルトの名無しさん:04/11/19 23:30:22
質問よろしいでしょうか。
キーを押し "続けて" いるにも関わらず、OnKeyDown() が何度も呼び出されます。
エディタ上などでの、文字入力中の処理を考えると自然な気もしますが、
これをやめ、キーを押し続けても、最初の1度のみ OnKeyDown() を呼び出させる方法はないでしょうか?
874デフォルトの名無しさん:04/11/19 23:33:59
OnKeyUp()
875デフォルトの名無しさん:04/11/19 23:53:05
OnKeyUp() で実現できるでしょうか?
キーを押し続けている間、WM_KEYUP は起きないと思うのですが……。
876デフォルトの名無しさん:04/11/19 23:55:07
どんな押し方をしてもボタン押下1回につき1度呼ばれる。
駄目ですか?
877デフォルトの名無しさん:04/11/19 23:55:54
>>875
初回のOnKeyDownでフラグを立て
フラグが立ってる間、OnKeyDownは無視
OnKeyUpでフラグをおろせばいいんじゃない?
878デフォルトの名無しさん:04/11/19 23:56:47
押し続けると、OnKeyDown() が何度も呼ばれてしまいます。
879デフォルトの名無しさん:04/11/19 23:57:34
>>877
ああ、全くその通りです(゚Д゚;)
ありがとうございます。
880デフォルトの名無しさん:04/11/20 00:01:50
むしろそういう場合、非同期のキー状態取得APIを使うべきじゃないだろうか…
881デフォルトの名無しさん:04/11/20 00:25:43
サブ関数内で変数を宣言し、サブ関数から抜け出した後には宣言した変数はメモリから消えてますか?それともちゃんとfree()で開放しなければいけない?
882デフォルトの名無しさん:04/11/20 00:37:20
いまいち質問の意味が分からないけど…

void foo( ) {
    char *p;
    p = (char*)malloc(100);
}

関数 foo を抜けたとき、
p は消えるけど p が指していたメモリは消えない。
free しなきゃだめ。
883デフォルトの名無しさん:04/11/20 00:44:25
VC++でもJavaやその他の言語と同様
APIなどいくつか用意されていると思いますが
どういう関数があるのとかどこで調べればいいのでしょうか?
884デフォルトの名無しさん:04/11/20 00:47:25
>>883
MSDN
885860:04/11/20 00:50:51
>>872
なるほど。よくわかりましたありがとうございます!
886デフォルトの名無しさん:04/11/20 00:52:26
>>882
レスありがとうございます。宣言した変数は消えるんですね。こういうメモリの動きを見るソフト・機能とかあるんでしょうか?
887デフォルトの名無しさん:04/11/20 00:55:17
>>886
見なくて済むようにするためのGC
888デフォルトの名無しさん:04/11/20 01:38:16
質問すいません。(;´Д`)
列挙型で、

enum Hoge{
 Hoge1 = 0,
 Hoge2,
 Hoge3,
};

・・・の時、{Hoge1,Hoge2,Hoge3}を{0,1,2}という整数に変換する事はできるんですが、
その逆に{0,1,2}から{"Hoge1","Hoge2","Hoge3"}というふうに列挙子を
文字列として取得する方法はないのでしょうか?よろしくお願いします。
889デフォルトの名無しさん:04/11/20 01:42:47
出来ない。
自分で関数作るなりすれ。
890デフォルトの名無しさん:04/11/20 01:42:59
>>886
ローカル変数はスタック上に作られて関数を抜けた時点でなくなる
891デフォルトの名無しさん:04/11/20 01:43:12
>>888
std::mapにでもかちこんどけ。
892デフォルトの名無しさん:04/11/20 01:47:50
質問です。
#include <iostream>
#include <string>
int main(void){
std::string str("abcde");
const char* p=str.c_str();
int len=0;
while(p!='\0'){
p++;
len++;
}
std::cout<<len<<std::endl;
return 0;
}

このコードで、whileループが終わらないのですがどうしてなんですか?
str.c_str()は¥0で終わる文字列を返すので、ループが終わらないのは
おかしいと思ったんですが。。
コンパイラはBorland C++ compilerを使いました。
893デフォルトの名無しさん:04/11/20 01:52:20
s/while(p!='\0'){/while(*p!='\0'){
894888:04/11/20 01:55:14
>>889 >>891
ありがd。
mapで逝かせていただきまつ。
895892:04/11/20 01:59:54
うう、893さんありがとう
恥ずかしい限りですorz
896デフォルトの名無しさん:04/11/20 02:02:50
どうでもいいがsageろと
897デフォルトの名無しさん:04/11/20 02:11:12
while(p!='\0'){
p++;
len++;
}
…どうでもいいことだが格好が…
while (*p++) ++len;
898デフォルトの名無しさん:04/11/20 02:11:24
C言語を始めて1ヶ月目です。よろしくお願いします。
質問です。

8bitの2進数を左右反転させたいのですが手法が分かりません。

11111101→10111111

シフトレジスタ>>,<<
論理積&
論理和|
排他的論理和^

等を使えばいいのでしょうか?
899デフォルトの名無しさん:04/11/20 02:13:30
テスト中に代入文を埋め込むと読みにくいからやめれといわれますが,
皆さんはどうしてますか?
多用していますか?
なるべく排除しようとしていますか?
900デフォルトの名無しさん:04/11/20 02:14:03
遠慮なしに使います
901デフォルトの名無しさん:04/11/20 02:14:32
>テスト中に代入文を埋め込むと読みにくいからやめれといわれますが,

意味不明
902デフォルトの名無しさん:04/11/20 02:16:01
わけわからん
903デフォルトの名無しさん:04/11/20 02:18:18
>>901
hoge = function();
while (hoge != 0)



while ((hoge = function()) != 0)
と書くこと
904デフォルトの名無しさん:04/11/20 02:20:20
>>901
補足
hoge = function();
while (hoge != 0) {
 doSomething();
 hoge = function();
}



while ((hoge = function()) != 0)
 doSomething();
と書くこと
905デフォルトの名無しさん:04/11/20 02:21:20
if (Base* b = dynamic_cast<Base*>(d))
とか?簡潔で分かりやすいじゃん
906デフォルトの名無しさん:04/11/20 02:23:40
>903 はアフォ

>904
どー考えても 下の方が理解しやすいと思うんだが違うのか、お気の毒.
あえて上の書き方してるとしたら氏ね
907デフォルトの名無しさん:04/11/20 02:40:03
while (hoge = function())
 doSomething();
908デフォルトの名無しさん:04/11/20 03:15:14
特に、C++ に多いと思うんだが、
if (xxx)
{

}
else
{

}

while (1)
{

}
この形のインデントが増えてないか?

俺はK&Rスタイルを貫いているが。
if (1) {

} else {

}

while (1) {

}
どっちでもいいといえば、どっちでもいいが、ちょっと疑問に思ったので。
909デフォルトの名無しさん:04/11/20 03:17:08
>この形のインデントが増えてないか?

別に
910デフォルトの名無しさん:04/11/20 03:19:32
>>908
俺は最初前者から入って、今は後者
911デフォルトの名無しさん:04/11/20 03:23:01
俺はずっと前者。ブロックであること、オブジェクトのlifetimeが
明示しやすいから。
正直読めれば他人の書くコードはどうでもいいが。
912デフォルトの名無しさん:04/11/20 03:24:10
#include <stdio.h>

void hoge(int *a);
int main()
{
int a;

hoge(&a);
printf("%d\n" , a);

}
void hoge(int *b)
{
b++;
if (b>5)
{
return;
}

hoge(b);

}

上のプログラムだと
error C2040: '>' : 'int *' は 'int' と間接操作のレベルが異なります。
error C2446: '>' : 'int' 型から 'int *' 型への変換ができません。
というエラーがでます

aの値が6になったか確認したいのですけどどうしたらいいのでしょうか?
913デフォルトの名無しさん:04/11/20 03:27:21
b++ → *b++
if (b>5) → if(*b > 5)
そもそも未初期化の変数を使うなと
int a = 0; とでもしとき
914913:04/11/20 03:28:20
(*b)++ だったorz
915デフォルトの名無しさん:04/11/20 03:28:34
void hoge(int *b)
{
(*b)++;
if (*b > 5) return;
hoge(b);
}
916915:04/11/20 03:29:02
orz
917デフォルトの名無しさん:04/11/20 03:32:25
>>913
ご返答ありがとうございます
エラーはでなくなったのですけど
aの値が6になってないのですが
hoge内のbの変化がaにも適応されるようにしたいんですけど
どうしたらいいのでしょうか?
918デフォルトの名無しさん:04/11/20 03:34:08
>>914
>>915
ありがとうございます
ちゃんとaが6になるようになりました
919デフォルトの名無しさん:04/11/20 03:58:24
#include <stdio.h>
void hoge(POINT *b );
int main()
{
POINT a;
a.x=0;
a.y=0
hoge(&a);
printf("%d\n" , a.x);
}
void hoge(POINT *b)
{
(*b->x)++;
if (*b->x>5) return;
hoge(b);
}
でerror C2065: 'b' : 定義されていない識別子です。
と: error C2065: 'POINT' : 定義されていない識別子です。
とerror C2182: 'hoge' : 'void' 型が不適切に使用されています。
というエラーがでました
なぜでしょうか?
VC++.netです
920デフォルトの名無しさん:04/11/20 04:01:51
>>919
(゚Д゚)…

一度入門書を読んで来た方がいいんじゃないか?
921デフォルトの名無しさん:04/11/20 04:04:22
>>920
ネットの入門HPで勉強中なんです
922デフォルトの名無しさん:04/11/20 04:08:53
まずPOINTという構造体を作る必要があるのと、
(*b).x は b->x と同義であることを理解してるか?
923デフォルトの名無しさん:04/11/20 04:14:42
>>922
>>919でa.まで書くと自動的にxとyの候補が表示されるので
すでにどこかでPOINTが定義されてるのかなと思ってました
>(*b).x は b->x と同義であることを理解してるか?
知りませんでした
924デフォルトの名無しさん:04/11/20 04:18:16
>>923
どこかで定義されているのは正しい(windef.hだったかな?)が、
その定義をincludeしていないでしょう。

VC++は直接includeしていなくてもインテリセンスが働く悪い癖がある。
925デフォルトの名無しさん:04/11/20 04:21:26
>>924
#include <stdio.h>以外インクルードしてません
>VC++は直接includeしていなくてもインテリセンスが働く悪い癖がある。
初心者にとっては便利な機能みたいですねw
926デフォルトの名無しさん:04/11/20 04:39:03
>>925
初心者にとってはよくない機能だと思われ
927デフォルトの名無しさん:04/11/20 06:58:43
>>898

src = 0xfd;

dst = (src & 0x80) >> 7 +
    (src & 0x40) >> 5 +
    (src & 0x20) >> 3 +
    (src & 0x10) >> 1 +
    (src & 0x08) << 1 +
    (src & 0x04) << 3 +
    (src & 0x02) << 5 +
    (src & 0x01) << 7;

これでどうだw
928デフォルトの名無しさん:04/11/20 09:08:23
inline unsigned char invert(unsigned char x)
{
    x = (0xF0 & x << 4) | (0x0F & x >> 4);
    x = (0xCC & x << 2) | (0x33 & x >> 2);
    x = (0xAA & x << 1) | (0x55 & x >> 1);
    return x;
}

だっけ。まぁ、8bit程度だとあんま意味ないが。
929デフォルトの名無しさん:04/11/20 09:23:17
配列変数a[i]のiを得るにはどうすればいいですか?
たとえばa[0]〜a[9]のうちの最大のものがa[3]とするとmax=3としたいとか。
930デフォルトの名無しさん:04/11/20 09:47:10
他スレに誤爆してしまった…けど一応書き
>>898
unsigned char a = 0xF2; //反転させたいビット列 (入力)

unsigned char HANTEN(unsigned char a){
unsigned char b = 0x01;
unsigned char work =0, out =0;
for(int i=0; i<=7; i++){
work = a & b;
work << (7 - i);
out = out | work;
b << 1;
}
return out;
}

下位から1bitずつ取り出してその分シフト、orで足し算、と。
取り出したビットがゼロだったら飛ばしてもいいかも。

>>987-928と比べたらメリットは、他の変数型への移植性くらいしかないけど
931デフォルトの名無しさん:04/11/20 09:50:51
すまん、なんか間違えてる

b << 1;を削除して
a >> 1;で
932デフォルトの名無しさん:04/11/20 10:07:28
ループなんぞするなら、
template<typename T>
inline T tinvert(T t){
    T x = T();
    for (T m = 1; m; m <<= 1)
        x = (x << 1) + (t & m ? 1 : 0);
    return x;
}

のほうがよくないか。
933デフォルトの名無しさん:04/11/20 11:32:37
>>929
max=&(a[3])-a;
934デフォルトの名無しさん:04/11/20 13:13:54
max=(maxの型)(&(a[3])-&(a[0]))
935デフォルトの名無しさん:04/11/20 15:49:42
>>933
>>934
どーもです。
936デフォルトの名無しさん:04/11/20 18:43:45
VC++ 6.0 で質問です。
Debug モードではコンパイルが通ったのですが、Release モードにすると、
〜\hogehoge.h(12) : fatal error C1083: インクルード ファイルがオープンできません。'aaaa.h': No such file or directory
とエラーがでました。
aaaa.h は外部から追加したヘッダファイルのため、パスが通ってないと考えたのですが、
Debug と Release でなぜ違いがでるのかが分かりませんでした。
よろしくお願いします。
937デフォルトの名無しさん:04/11/20 19:54:55
>>936
プロジェクトの設定は、Debug と Release モードで別々なんだよ。
Release モードの C/C++ コンパイラ オプションでも
/I オプションを追加するといい。
938デフォルトの名無しさん:04/11/20 22:50:05
ヌヌネネヌヌネノ
(中略)
(゚∀゚) ruby!!
939デフォルトの名無しさん:04/11/20 22:52:43
Rubyのためなら死ねる
940デフォルトの名無しさん:04/11/20 22:54:08
>>938,939
君らの行為がRubyの評価を下げている
Rubyのためにも逝ってくれ
941デフォルトの名無しさん:04/11/20 22:54:59
罵倒されそうな事を質問、多分合ってはいると思うんだが自信無いので(;´Д`)

|と+の違いって、キャリーがあるかないかだよな?
1+1は2で、1|1は1?
それを利用したら、配列に入った全ての値が同じか否か検出出来る?
942941:04/11/20 22:56:53
補足
配列の[0]に入ってた値を保存して、各値とのorをとって同一かどうかで検出出来る?
943デフォルトの名無しさん:04/11/20 23:00:10
よくわからんが、2値のXOR取って0であれば同一、not 0なら違う値
944モウモウ:04/11/20 23:06:20
>>942
できるわけない。よく考えてみよう。
単純に == で比較するのじゃ不満なのかい?
945デフォルトの名無しさん:04/11/20 23:26:38
>943、944
thx、よく考えたら無理ですた。
ループで同等比較するしかないのか、めんどいナァ………。
946デフォルトの名無しさん:04/11/20 23:51:37
半分どうしでstrcmpなんか使って同等比較して、
その半分の更に半分同士をstrcmpで同等比較

…の2段階じゃダメかなぁ。
どこかに違う値入ってたら引っかかると思うんだけど

思いつきなんで間違ってたら「こいつアホだ」とでも何とでも…
947デフォルトの名無しさん:04/11/20 23:53:43
と、レスしたそばから…
12121212みたいに入ってると通ってしまうことに気づいた

やっぱ俺はアホだ!
948デフォルトの名無しさん:04/11/20 23:56:15
おめでとう
949デフォルトの名無しさん:04/11/20 23:57:08
strcmpだって内部ではループ使ってるんだから、
普通にループで書いた方が賢明な気がする。

ループを書くのはカッコワルイ、とかいう理由なら別だけど
950デフォルトの名無しさん:04/11/21 00:58:43
#include <algorythm>
951リズムに乗って:04/11/21 01:02:14
     ♪  Å
   ♪   / \   ランタ タン
      ヽ(´Д`;)ノ   ランタ タン
         (  へ)    ランタ ランタ
          く       タン



   ♪    Å
     ♪ / \   ランタ ランタ
      ヽ(;´Д`)ノ  ランタ タン
         (へ  )    ランタ タンタ
             >    タン

と思ったけど、rhythm でもないじゃないか…
952デフォルトの名無しさん:04/11/21 01:25:12
#include <algorithm>
      ○| ̄|_
953デフォルトの名無しさん:04/11/21 01:27:41
最初は良く間違えるからキニスンナ
954デフォルトの名無しさん:04/11/21 01:32:09
釣りかとしか思ってなかった
955デフォルトの名無しさん:04/11/21 02:29:50
正直C++なんてなにもわかんないのに始めるんですが、stdioとiostreamどっちやろうか悩んでるので
こっちはコレ系に強い、とかありませんか?それともたいていどっちもやるとか、片方やればどっちもわかったりするんですか?
956デフォルトの名無しさん:04/11/21 02:33:15
>>955
両方やれ。
957デフォルトの名無しさん:04/11/21 02:33:52
>>955
stdio.hもしくはcstdioで定義されているものはレガシー関数といわれています。
あまり使うべきではありません。
958デフォルトの名無しさん:04/11/21 02:36:14
C/C++が初めてなら素直にCでprintfつかっとけ
959デフォルトの名無しさん:04/11/21 02:40:24
C++ のストリームって、あんまり使い勝手いいと思わないよな。
960デフォルトの名無しさん:04/11/21 02:41:52
stdio -> 拡張性無し、型非安全、熟知、早い
iostream -> 拡張性有り、型安全、stdio より遅いことがほとんど
961デフォルトの名無しさん:04/11/21 02:42:45
>>960
printf()はとても重いし遅いけれど。
962デフォルトの名無しさん:04/11/21 02:49:42
cout よりマシなのでは?
963デフォルトの名無しさん:04/11/21 02:57:55
入力チェックができるのでscanf使うくらいならcinのほうがいいとは思うが
それ以外はどっちも同じようなものなのがなぁ・・・
964デフォルトの名無しさん:04/11/21 02:59:26
iostreamで書式を指定するのは激しくめんどくさい
965デフォルトの名無しさん:04/11/21 03:01:34
>>962
確かにそうだね。
昔の話だけれど、実際使うときはprintfを自作していたよ。
966デフォルトの名無しさん:04/11/21 08:46:05
コンソールはほとんど使わないし
sprintfとかCString::Formatとか書式の方をよく使うから
967デフォルトの名無しさん:04/11/21 09:01:00
へぇ
968デフォルトの名無しさん:04/11/21 18:30:27
せめてsnprintf使えよ
969デフォルトの名無しさん:04/11/21 20:43:54
なんかこの話の流れ Déjà vu?
970デフォルトの名無しさん:04/11/21 20:51:17
誰もが好きなお話ってことよ
971デフォルトの名無しさん:04/11/21 22:24:24
これからCかC++を学ぼうと思うんですがどちらがお勧めですか?
また、開発環境はどれが扱いやすいですか?
972デフォルトの名無しさん:04/11/21 22:29:16
C++
禿も推奨
973デフォルトの名無しさん:04/11/21 23:31:09
>>971
いきなり開発環境はいらんからフリーのコンパイラつかって
とりあえずCでもC++でもいいから入門書を一冊仕上げろ。
入門書は安いのは役に立たんから値は張っても定評のあるのにしろ。
C++ならダイテルかPrimerか。Cは俺は知らん。
974デフォルトの名無しさん:04/11/21 23:40:53
とりあえず使うOSぐらい書かんと処理系についてはアドバイスのしようがないが。
975デフォルトの名無しさん:04/11/21 23:43:24
Rubyにします。
976971:04/11/22 00:16:52
OSはXPPROを使ってます

>>973
ありがとうございます。
アマゾンで調べたところ、いろいろ種類がありました。
基本的に、ダイテルの本を買っていって順に学んでいくのかPrimerの本を買っていって順に学んでいくかは好みで選んでも問題ないでしょうか?
977デフォルトの名無しさん:04/11/22 00:25:41
あるtemplateクラスがあって、それを継承してtemplateで
ないクラスを作成することができるのでしょうか?
978デフォルトの名無しさん:04/11/22 00:35:22
>>977
class A : public TemplateClass<ほげ>
{};
979デフォルトの名無しさん:04/11/22 00:37:37
Ruby!
980デフォルトの名無しさん:04/11/22 00:56:10
猫でもわかるのSDK編のサンプルは.NET2003だとそのままでは
動かないんすか?
981デフォルトの名無しさん:04/11/22 02:33:44
著者に聞けよ
982デフォルトの名無しさん:04/11/22 06:04:54
最近そういうページだけで覚えようとするヤツが多いみたいだけど
最低限の本ぐらい買って読めよ、と思う
983デフォルトの名無しさん:04/11/22 09:11:26
984デフォルトの名無しさん:04/11/22 13:40:40
fgetsでファイルから読み込んだ時にデータが長すぎて読みきれずに
バッファに残ってしまったデータのクリアのやり方がわかりません。
おしえてください。
985デフォルトの名無しさん:04/11/22 13:50:37
やっぱネットで勉強するより本買ったほうがいいんすか?
986デフォルトの名無しさん:04/11/22 13:55:29
>>984
ファイルから読み込んでるならクローズすればいい。
標準入力から読み込んでるなら読み捨てるロジックを書けばいい。
987デフォルトの名無しさん:04/11/22 13:57:40
>>985
画面見ながら勉強するのは21インチモニターなどで画面分割しながら
やらないと苦しい。それかページを印刷してしまうかだね。

俺は本を買った方が絶対に良いと思う。
988デフォルトの名無しさん:04/11/22 14:07:55
989デフォルトの名無しさん:04/11/22 14:37:48
>fgetsでファイルから読み込んだ時にデータが長すぎて読みきれずに
>バッファに残ってしまったデータのクリアのやり方がわかりません。

読みきれなかったデータはバッファではなくファイル側にある。
990984:04/11/22 14:40:07
>>986さん
即レスありがとうございます。
標準入力の場合はgetcharで空読みをしてできたのですが
ファイル入力の場合でも同じような事は出来ませんか?
次の行も読み込まなくてはいけないので。
991デフォルトの名無しさん:04/11/22 14:47:21
>>990
fgetc()で読み捨てるか、fgets()で読み捨てる。
992984:04/11/22 14:51:04
1〜10まで質問してもうしわけないのですが
fgetsで読み捨てるとしたら具体的にはどうしたらいいんでしょうか。
993デフォルトの名無しさん:04/11/22 15:01:51
>>992
/* fgetc()を使った読み捨て関数。 */
void readAndThrow(FILE * fp)
{
 int rtn;
 do {
  rtn = fgetc(fp);
 } while (rtn != '\n' && rtn != EOF);
}
#if 0 /* 使用例 */
while (fgets(buf, sizeof(buf), fp)) {
 if (strchr(buf, strchr('\n') == NULL) {
  readAndThrow(fp);
 }
 /* ... */
}
#endif
994992:04/11/22 15:31:11
>>993さん
ありがとうございます。できました。
995デフォルトの名無しさん:04/11/22 18:59:38
...
996デフォルトの名無しさん:04/11/22 19:01:44
readAndThrough ではないかと
997デフォルトの名無しさん
読み捨てだから、読んで投げ捨てたんだろ。