【初心者歓迎】C/C++室 Ver.47【環境依存OK】
at TECH
[1からを表示]
50:デフォルトの名無しさん
08/01/17 09:36:21
4でも6でも8でも構いません。
3や5でもいいですよ。
51:デフォルトの名無しさん
08/01/17 11:44:49
標準なんてないだろう。俺は4だけど。
52:デフォルトの名無しさん
08/01/17 11:49:01
>>42-43
ありがとうございます。
そうすると、unary_function()を引数にもらって、それを内部で使う関数というのは
かけないのですか?
void *のポインタをもらって、内部で適当にキャストして、unary_function()として
使えたりしないのかな。
とりあえずやってみます。
53:デフォルトの名無しさん
08/01/17 12:13:01
a=1/350,1/320,1/360,1/368,1/397,1/400
b=1/7.90,1/8.12,1/8.23,1/8.56,1/7.97,1/8.68
と仮定する。
for ($i=0; $i<=5; $i++) {
$p1 = (1/$a[$i])**$a * (1-1/$a[$i])**($play-$a);
$p2 = (1/$b[$i])**$b * (1-1/$b[$i])**($play-$b);
$p3 = $p1 * $p2;
$t_ap += $p1; push(@ap,$p1);
$t_bp += $p2; push(@bp,$p2);
$t_abp += $p3; push(@abp, $p3);
}
上記の構文で計算すると分母に差があるのでオーバーフローを起こす・・・と言われました。
**($play-$a);←この部分の計算に問題があるようなのですが、プログラムに疎いので良く判りません><
問題のある部分をどのように記述するべきなのかご指導お願い致します。m(_ _)m
54:デフォルトの名無しさん
08/01/17 12:18:48
ここは、C/C++のスレなんだが
55:デフォルトの名無しさん
08/01/17 12:20:36
>>54
すいませんm(_ _)m
どこで聞けば良いのでしょう?
56:デフォルトの名無しさん
08/01/17 12:21:39
自分の使ってる言語のスレを探せばいいだろうが
URLリンク(pc11.2ch.net)
57:デフォルトの名無しさん
08/01/17 12:22:31
>>52
unary_functionへの参照をもらえばいいんじゃないかね
58:デフォルトの名無しさん
08/01/17 12:24:01
>>56
それすら判りません><
59:デフォルトの名無しさん
08/01/17 12:26:19
>>58
Perlについての質問箱 34箱目
スレリンク(tech板)
60:デフォルトの名無しさん
08/01/17 12:26:46
コマンド名か、コンパイル時の画面に書いてないか。
61:デフォルトの名無しさん
08/01/17 12:29:49
unary_functionの関数呼び出し演算子って
仮想関数になってんの?
62:デフォルトの名無しさん
08/01/17 12:53:20
unary_functionはテンプレート引数をargument_typeとresult_typeにtypedefしてるだけにすぎん
63:デフォルトの名無しさん
08/01/17 12:54:49
だよねやっぱ
じゃあunary_function型で引数を取ること自体が意味無い、だよね
64:デフォルトの名無しさん
08/01/17 13:02:36
以下のソースプログラムをコンパイルして実行したのですが
M:\>sort3.exe
入力ファイル名:
と表示されて、そこからどうすればいいかわかりません。
ファイル入出力とソートの宿題なのですが、
いかんせん超がつくほどの初心者なので…。
どなたかよろしかったらお願いします。
使っているソフトはVisual C++ 2005 Express Edition です。
65:デフォルトの名無しさん
08/01/17 13:03:04
上のソースプログラムです。
/* sort3.c */
#include <stdio.h>
struct kamoku { char mei[20];
char kana[10];
int ei;
int koku;
int su;
int sha;
int ri;
}
#define SIZE 30
main(){
struct kamoku seiseki[SIZE], min;
int i,j,m,n;
FILE *input, *output;
char infname[16], outfname[16];
printf("入力ファイル名: ");
scanf("%s",infname);
printf("出力ファイル名: ");
scanf("%s",outfname);
if((input=fopen(infname,"r")) == NULL ){
printf("ファイルがありません\n");
exit(1);
}
if((output=fopen(infname,"r")) == NULL ){
printf("ファイルが作成できません\n");
exit(1);
}
66:デフォルトの名無しさん
08/01/17 13:06:19
>>64
入力ファイル名を入力する。
・・・ってかプログラム以前にパソコン教室に通うべきだな。
67:デフォルトの名無しさん
08/01/17 13:12:05
>>66
どのようなファイルを入力すべきかがわかりません。
初心者ですみません。
68:デフォルトの名無しさん
08/01/17 13:15:42
>>67
鼬害。キーボードの使い方やファイルとは何かと言ったことは
プログラミング以前の知識です。
69:デフォルトの名無しさん
08/01/17 13:18:13
>>67
ちゃんと授業にはでようね
70:デフォルトの名無しさん
08/01/17 13:24:44
>>57
やってみましたが、ダメなようです。
vector<int> line2vec2(string line, char delim, const unary_function<string,int> &func) {
int begin, end;
vector<string> v;
begin = end = 0;
while (line[end]) {
begin = end;
while (line[end] != delim && line[end]) {
end++;
}
v.push_back(line.substr(begin, end-begin));
end++;
}
vector<int> v2(v.size());
transform(v.begin(), v.end(), v2.begin(), func());
return v2;
}
>>61
仮想関数になっているかどうかはよくわかりませんでしたが、
stlのソースを見ていると、pointer_to_unary_functionというクラスが
ありました。今度はこれで試してみる。
71:デフォルトの名無しさん
08/01/17 13:40:25
なんか無駄に複雑な事になってるな
72:デフォルトの名無しさん
08/01/17 13:41:27
>>70のつづき
もうなんだかわけがわからなくなってきた。
unary_functionはArgとResのtypedefなんですか?
STLのコンパイルエラーメッセージはやくにたたん。
73:デフォルトの名無しさん
08/01/17 13:53:51
普通std::unary_functionは継承して使わないと役に立たないと思うんだが。
74:デフォルトの名無しさん
08/01/17 14:14:06
>>72
そもそもunary_functionを引数にしようとした理由は?
普通継承したファンクタ作るよね
75:デフォルトの名無しさん
08/01/17 14:17:44
std::unary_functionやstd::binary_functionを継承する理由は
std::bind2ndなどのアダプタがargument_typeとresult_typeを
必要とするから。
それ以上の意味はない。別にstd::unary_functionを継承しなくても
自分でargument_typeとresult_typeをtypedefしてもいい。
76:デフォルトの名無しさん
08/01/17 14:33:29
こんな感じか?
template <typename T>
vector<int> line2vec2(string line, char delim, T func) {
transform(v.begin(), v.end(), v2.begin(), func());
}
line2vec2( , , std::ptr_fun(関数ポインタ));
line2vec2( , , 関数オブジェクト());
77:デフォルトの名無しさん
08/01/17 14:35:18
間違えた
>transform(v.begin(), v.end(), v2.begin(), func());
transform(v.begin(), v.end(), v2.begin(), func);こうだな
78:デフォルトの名無しさん
08/01/17 15:04:35
>>76-77
>>42-43
79:デフォルトの名無しさん
08/01/17 15:06:07
>>72
今回のエラーメッセージは割と理解できるものだし、
そもそも何が駄目なのか指摘されてるのに
まるで見当違いの方法を試しているのはお前自身だ
80:76
08/01/17 15:10:05
>>78
>>43はstd::ptr_funが使えない。
81:デフォルトの名無しさん
08/01/17 15:45:44
>>80
おう、こりゃ失礼
82:コンパイルできた
08/01/17 15:48:16
皆さんのおかげ様で、とうとうできました。
ソースは以下です。
template <class T, typename T2>
vector<T> line2vec2(string line, char delim, T2 func) {
int begin, end;
vector<string> v;
begin = end = 0;
while (line[end]) {
begin = end;
while (line[end] != delim && line[end]) {
end++;
}
v.push_back(line.substr(begin, end-begin));
end++;
}
vector<T> v2(v.size());
transform(v.begin(), v.end(), v2.begin(), func);
return v2;
}
この関数をこんな感じで使う。
string s = "1 2 3 4 5 - 6 7 8 9";
vector<int> v = line2vec2<int>(s, ' ', string2int());
83:コンパイルできた
08/01/17 15:48:54
<82の続きです>
ちなみにstring2int()は以下のように定義しました。
class string2int : public unary_function<string,int> {
public:
unary_function<string,int>::result_type operator() (unary_function<string,int>::argument_type str) {
if (str == "-")return 0;
else return static_cast<int>(atoi(str.c_str()));
}
};
いやー、すげえ感謝感謝。今回答えてくれた方々には昼飯一回おごってもいいくらいス。
84:デフォルトの名無しさん
08/01/17 15:57:07
昼飯一回程度の感謝
85:デフォルトの名無しさん
08/01/17 16:04:00
>>83
もうちょっと本買って読んだ方がいいな
86:デフォルトの名無しさん
08/01/17 16:04:23
名無しの書き込みから個人を特定して昼飯をおごる程の感謝
えらく大変だな
87:76
08/01/17 17:44:29
>>83
昼飯はいいから俺がニート脱出できるように神様にお願いしといてください。
88:デフォルトの名無しさん
08/01/17 20:00:30
#include <iostream>
#include <cstdio>
char ch[10];
int main()
{
while ((cin.getlie(char, 10)) != EOF) {
}
}
これをコンパイルしようとするとwhileの行でエラーが出るのですが、
何がいけないのでしょうか??
89:88
08/01/17 20:02:08
すいませんwhileの行のcharはchの間違いです。
90:デフォルトの名無しさん
08/01/17 20:03:38
>>88
余分なものが付いているk 「ar」 a
91:デフォルトの名無しさん
08/01/17 20:04:32
getlie
92:デフォルトの名無しさん
08/01/17 20:04:36
getlie ではなくて getline な。
分かってるとは思うけど
93:デフォルトの名無しさん
08/01/17 20:04:38
>>88
std:: n が足りない
94:88
08/01/17 20:12:05
回答くださった方ありがとうございます。
すいません色々抜けていました。。orz
正しくはこれです。
#include <iostream>
#include <cstdio>
using namespace std;
char ch[10];
int main()
{
while ((cin.getline(ch, 8)) != EOF) {
cout << "test";
}
}
これでもコンパイルできないのです。
whileの行でエラー出ます。
95:デフォルトの名無しさん
08/01/17 20:14:35
>>94
!= EOFこれが不要。
質問するときはエラーの内容も書いてくれ。
96:デフォルトの名無しさん
08/01/17 20:14:54
>>94
#include <iostream>
char ch[10];
int main()
{
while (std::cin.getline(ch, 8)) {
std::cout << "test";
}
}
97:デフォルトの名無しさん
08/01/17 20:35:00
#include <iostream>
int main()
{
char ch[10];
while (std::cin.getline(ch, sizeof ch)) {
std::cout << "test";
}
}
98:デフォルトの名無しさん
08/01/17 21:21:43
Fedora6 gcc
でファイルの更新を検知するプログラムを作りたいのですが、
更新までブロックする関数を教えてください。
if (ファイルの更新までブロック)
{
//更新された
read();
...
}
みたいなカンジです。
ちなみにtailのソースを見てみたのですが、
1秒毎にファイルが更新されたかチェックして処理をしているようです。
何秒毎にチェックするのではなく、更新までブロックできる関数がわかればいいです。
よろしくお願いします。
99:デフォルトの名無しさん
08/01/17 21:29:34
なんでそんなものが存在するという前提で物事を進めようとするの?
100:デフォルトの名無しさん
08/01/17 21:38:03
てゆーかチェックせずに、更新されると発見してほしいのかよwwwwwwwww
101:デフォルトの名無しさん
08/01/17 21:42:18
Windows だとディレクトリの更新を検知してシグナル送ってくれる
FindFirstChangeNotification/FindNextChangeNotification って API があるから
他の OS でもそういう API があるんじゃないかと思う気持ちも分からんでも無い。
102:デフォルトの名無しさん
08/01/17 21:53:22
>>98
Linuxなら可能。
dnotify inotify といったキーワードで調べてみて。
103:デフォルトの名無しさん
08/01/17 22:30:53
プログラムって教科で分けると数学ということですか?
104:デフォルトの名無しさん
08/01/17 22:35:11
>>103
いや、国語だろ
105:デフォルトの名無しさん
08/01/17 22:38:31
普通に、技術家庭科。
実際、技術家庭科の時間にVBプログラミングやらされてたし。
106:デフォルトの名無しさん
08/01/17 22:39:31
情報だろ
107:デフォルトの名無しさん
08/01/17 22:45:09
統一された見解が無いということですか?
哲学っぽいですね。
108:デフォルトの名無しさん
08/01/17 22:47:06
分野でいうと情報処理だろうな。
つか、いちいちageんなって。
109:デフォルトの名無しさん
08/01/17 22:51:45
>>99
Winだと
URLリンク(www.google.co.jp)
みたいな感じで、存在するんだよ。だから、98もそこから、Linuxにも存在すると期待してるんじゃないかな……
ちなみに、俺は知らん。
110:デフォルトの名無しさん
08/01/17 23:01:49
高専だと、情報基礎以外に、制御とか計算機科学、電子、通信、ソフ技、ハード技、プロ技
至る所でプログラミング漬けだったけど。時代遅れのw
111:デフォルトの名無しさん
08/01/17 23:02:50
>>102
具体的にありがとうございます。
手詰まりだったので、大変助かりました。
ありがとうございました。
>>100
何が言いたいのか分かりません。
112:デフォルトの名無しさん
08/01/17 23:15:41
>>110
そういえば親戚に情報基礎の教科書見せてもらったら15年前と大差なくてワロタ
113:デフォルトの名無しさん
08/01/17 23:17:49
15年前って言うと、数学の教科書の後ろの方に載ってる、
実際には授業で何にも使われない BASIC のことか?
114:デフォルトの名無しさん
08/01/17 23:20:48
基礎は不滅です。
115:デフォルトの名無しさん
08/01/17 23:23:16
流動的なものは情報Aなんかに任せとけば良いよ。
116:デフォルトの名無しさん
08/01/17 23:30:52
>>113
入力・出力・制御・演算・記憶
FFの応用回路・BASIC・CASL
のあたり。
117:デフォルトの名無しさん
08/01/17 23:46:44
ああ、高専の教科書か。
それは・・・知らんから何とも言えん。
118:デフォルトの名無しさん
08/01/17 23:51:09
情報関係の教科書書いてる教授がwinの基本操作とかCDの焼き方きいてくるからね〜(実話
119:デフォルトの名無しさん
08/01/17 23:52:34
VC++にtypeof()みたいのはないですか?
120:デフォルトの名無しさん
08/01/17 23:56:19
BOOST_TYPEOF
121:デフォルトの名無しさん
08/01/17 23:56:28
標準C++的にはtypeid演算子
あとMFCがなんか持っていた気がする。
C++/CLIなら当然.NET Frameworkのリフレクションが色々使える。
122:デフォルトの名無しさん
08/01/18 00:12:51
#define foreach(t, o, i) for(t::iterator (i)=(o).begin();(i)!=(o).end();++(i))
な感じのマクロの場合、それを使うと方を渡さなくて良くなりますか?
123:デフォルトの名無しさん
08/01/18 00:15:49
そんなマクロを作るな。
制御文をマクロ化すると
自分以外に読みづらいので
悪い作法だと言われている。
124:デフォルトの名無しさん
08/01/18 00:24:10
Cの文法で基本的な事かもしれないのですが、Linux のカーネルソースを読もうとして
挫折してしまったんですが、例えば
struct hw_pci mr300_pci __initdata = {
.nr_controllers = 1,
.preinit = mr300_pci_preinit,
.swizzle = pci_std_swizzle,
.setup = ixp4xx_setup,
.scan = ixp4xx_scan_bus,
.map_irq = mr300_map_irq,
};
のような struct 宣言が書いてありましたが、
.(dot)var = 値 のような記法って、そのメンバーの初期化という意味になるのでしょうか?
手元のCの文法書に見つからなかったのですが、この記述の説明文献ってありますかね?
125:デフォルトの名無しさん
08/01/18 00:25:09
C99 から導入された文法。
そのメンバの初期化という意味でおk。
126:デフォルトの名無しさん
08/01/18 00:26:17
C99 はここに簡単にまとめられてる。
URLリンク(seclan.dll.jp)
127:デフォルトの名無しさん
08/01/18 00:31:36
>>125-126 ありがとうございました。逝ってみます。
128:デフォルトの名無しさん
08/01/18 00:34:13
>>123
便利って書いてあるよ。
URLリンク(www.jah.ne.jp)
129:デフォルトの名無しさん
08/01/18 00:41:39
>>122
BOOST_FOREACH
130:デフォルトの名無しさん
08/01/18 00:54:48
>>129
むり
131:デフォルトの名無しさん
08/01/18 01:05:40
122はコンテナの型、BOOST_FOREACHは要素の型を渡す必要がある点では、どっちもどっち。
132:デフォルトの名無しさん
08/01/18 01:12:38
長いのよ
133:デフォルトの名無しさん
08/01/18 01:41:49
適当にマクロで短い名前を付ければいいだろ。
134:デフォルトの名無しさん
08/01/18 03:06:16
VC++2005、WinXPです。
チェックボックスつきのツリーコントロールを作りたいと考えています。
チェックボックスでは三つのチェック状態をあらわしたいと思っておりまして、
ちょうど、VCをカスタムインストールする時に出てくるチェック付きツリーコントロールのような物を考えております。
これを実現する簡単なAPIないし、クラスはないでしょうか?
135:デフォルトの名無しさん
08/01/18 04:20:09
xcode環境でc++を開発している人はいますか?
emacsよりもイイですか?
136:デフォルトの名無しさん
08/01/18 04:45:13
>>135
そもそもIDEとエディタを単純比較するのが間違ってる気がするよ!
気持ちは分かるけど・・・・・・
137:デフォルトの名無しさん
08/01/18 05:43:59
newでメモリを確保してdeleteをせずプログラムを終了した場合ってそのまま
ずっとメモリ確保されたままになるの?
138:デフォルトの名無しさん
08/01/18 05:45:44
cout
って何の略なんですか?
139:デフォルトの名無しさん
08/01/18 05:46:08
大抵はOSが何とかしてくれる
140:デフォルトの名無しさん
08/01/18 05:46:38
>>138
console out
141:デフォルトの名無しさん
08/01/18 06:06:10
>>139
ありがとう
再起動するまでずっと無駄に領域とられたままかと思ってたけどOSがどうにかしてるのね
142:デフォルトの名無しさん
08/01/18 07:08:07
>>138
console output
143:デフォルトの名無しさん
08/01/18 07:08:37
極めて古い OS だと分からんけどね。
144:デフォルトの名無しさん
08/01/18 11:36:39
>>136
emacs が好きなんですが、
class-name.<Tab>とか押すと、method-nameが選択できたり、
method一覧がかんたんに見れたり,そういう環境が羨ましい。
145:デフォルトの名無しさん
08/01/18 11:49:43
VB6、.NET言語のインテリセンスに比べればどうということはない。
146:デフォルトの名無しさん
08/01/18 11:51:24
インテリセンスは正直凄いと思う。
147:デフォルトの名無しさん
08/01/18 11:54:04
VCのは御馬鹿
148:デフォルトの名無しさん
08/01/18 12:20:50
eclipseとかもVC#のインテリセンス真似してくれればいいのにな
149:デフォルトの名無しさん
08/01/18 12:26:53
糞lipseは重くて嫌いだ。
150:デフォルトの名無しさん
08/01/18 16:57:49
最近のVSはC#だけインテリセンスがよく効く
C++はおざなりってか
151:デフォルトの名無しさん
08/01/18 17:35:44
C++は複雑すぎるからな
152:デフォルトの名無しさん
08/01/18 18:59:29
てゆーか昔から
153:デフォルトの名無しさん
08/01/18 19:04:38
プリプロセッサ,テンプレート,ポインタの
置き換え,マッチング,追跡の大変さを考えたら,
今の IntelliSense ってすげぇとおもうが.
154:デフォルトの名無しさん
08/01/18 19:06:52
VB.NETとC#はおなじじゃない?
155:デフォルトの名無しさん
08/01/18 19:10:49
MessageBoxの上にカーソルのせたら
WMessageBoxWにマクロで置換されてると教えてくれるけど。
肝心の引数がプロトタイプが見えないとか。
156:デフォルトの名無しさん
08/01/18 19:11:35
MessageBoxW
157:デフォルトの名無しさん
08/01/18 19:25:42
確かに引数のプロトタイプが見えないのは面倒だね
たいてい関数の末尾にA、W付ければ良いって話だけど
158:デフォルトの名無しさん
08/01/18 22:36:51
VS使ってるなら、「(」書いたときにプロトタイプ出て来ないっけ?
まぁ書いてるときじゃなくて見てるだけのときは面倒かもだけど
159:デフォルトの名無しさん
08/01/18 22:40:28
>>134
お願いします。
160:デフォルトの名無しさん
08/01/18 23:19:55
public:
template <class T> class templateA {
protected:
T value;
public:
各種メソッド
};
template <class T> class templateB {
protected:
T value;
public:
各種メソッド
}
class child : templateA<templateB<type> >{
追加メソッド
}
以上のようなクラスを作成し、
子クラス内でthis->value.valueでテンプレートクラスB内の値にアクセスしようとしたのですが、protectedの要素にアクセスできないというエラーが出ます。
どこを直せばよいのか分かりません。
どなたかご教示下さい。
宜しくお願いします。
161:デフォルトの名無しさん
08/01/18 23:30:06
templateBのvalueをpublicにすれば良い
childはtemplateBを継承してないんだからtemplateBのprotectedメンバにはアクセスできない
162:デフォルトの名無しさん
08/01/18 23:31:45
安易にpublicにしていいのだろうか。
163:デフォルトの名無しさん
08/01/18 23:47:24
なら安易にアクセスすんなよw
164:デフォルトの名無しさん
08/01/19 00:05:00
public にするくらいなら friend にするわ。
でも、設計をもうちょっと考える事をまず検討した方がいい気がする。
165:デフォルトの名無しさん
08/01/19 00:45:04
>>161-164様、ありがとうございます。
それぞれのテンプレートクラスにgetメソッドを追加して、要素にアクセスできるようにしてみました。
あまり綺麗な方法とは思いませんが、ひとまずこれで妥協しておきます。
C++初学者なので、friend関数の存在は知っていますが、使った事がないので、こちらも少し勉強してみようと思います。
オブジェクト指向が少しずつ理解できるようになってきて、数ヶ月前に作ったクラスのリファインが楽しすぎて困ります。
お陰で研究が全然進まないYO...
166:デフォルトの名無しさん
08/01/19 00:47:56
おすすめ 設計見直し > get > friend > public おすすめしない
って順かな。
167:デフォルトの名無しさん
08/01/19 00:51:39
friendもpublicも大差ない気がするけどな
研究とかならいっそstructでもいい気がする
168:デフォルトの名無しさん
08/01/19 00:57:23
一応公開する相手が制限されてる分、public よりマシだとは思うが、
決しておすすめはできないという点では確かに似たようなもんだな。
169:デフォルトの名無しさん
08/01/19 01:01:32
>>166
getは○〜△というところでしょうか。
一応意図したものにはなったので、取りあえずこれで行ってみます。
>>167
この先数年使う可能性があるので、ある程度しっかりしたものが作っておきたかったのです。
最悪の場合、お上に献上しないといけないものなのでw
リファイン前は各変数毎にgetメソッドとsetメソッドを用意していました。
これではあまりにも酷いと思いまして。
>>168
難しいですね。
自分の知識がついてきたら、またリファインすると思います。
そして無限ループへ…
170:デフォルトの名無しさん
08/01/19 01:08:37
作る前に設計をよく練った方がよさそうな・・・
設計に関する知識が無いならC++なんかやってないでそっちの勉強すべきだし
171:デフォルトの名無しさん
08/01/19 01:32:23
#include <stdio.h>
class A{
public:
virtual void func(){printf("A::func¥n");};
};
class B :public A{
private:
virtual void func() {printf("B::func¥n");}
};
int main (void)
{
A* b = new B;
b->func(); //B::funcと出力される。privateなのにアクセスできる!?
}
上記のコードについて、ご教授をお願いします。
gcc4.01で試したところコンパイルすることができました。
B::func()はprivateなのになぜコンパイルエラーにならないのでしょうか?
172:デフォルトの名無しさん
08/01/19 01:33:38
A::funcがpublicだから
173:デフォルトの名無しさん
08/01/19 01:53:13
>>171
class A の 仮想関数テーブルには
void func(){printf("A::func\n");}
の関数アドレスが配列0番に登録されている。
また、class B の 仮想関数テーブルには
void func(){printf("B::func\n");}
の関数アドレスが同じく配列0番に登録されている。
コンパイル時には静的な型であるAのfunc()が
調べられ、publicゆえにアクセスできることが
確認される。同時に仮想関数ゆえ、func()は
意味的には以下のようにコンパイルされる。
(b->vptr[0])(this);
vptrは仮想関数テーブルへのポインタで、今の
場合、派生クラスBの仮想関数テーブルのアドレス
が格納されている。仮想関数の呼び出しでは
コンパイル時はあくまで静的な型でアクセス可能性
が決定されるのがポイント。
と思う。
174:デフォルトの名無しさん
08/01/19 01:56:50
>>171
こういうコードだと分かりやすいと思う。
B の実装なんて知ったこっちゃないのよ。
// a.h
#include <stdio.h>
class A{
public:
virtual void func(){printf("A::func\n");};
};
// b.h
#include "a.h"
A* get_b();
// test1.cpp
#include "a.h"
int main (void)
{
A* a = get_b();
a->func();
}
// b.cpp
略
175:デフォルトの名無しさん
08/01/19 01:57:24
間違えた。こうだ。
// test1.cpp
#include "b.h"
int main (void)
{
A* a = get_b();
a->func();
}
176:デフォルトの名無しさん
08/01/19 02:04:01
一般的なコンパイラの実装の仮想関数呼び出し
メカニズムで理解しておいたほうがいいんじゃね?
静的な型でアクセス可能性が決まるというのが
真実だと思うが。
177:デフォルトの名無しさん
08/01/19 02:15:42
>>171-176 さん、ありがとうございました。
Final Draft IS に、そのまんまの答えがありました。
URLリンク(www.kuzbass.ru)
>静的な型でアクセス可能性が決まるというのが
>真実だと思うが。
そういうことになりますね。
178:デフォルトの名無しさん
08/01/19 04:15:38
typedef{
int x,y;
}data;
・・・
hogehoge(std::vector<data>dist);
こんな使い方はできるんでしょうか?
また、こんな使い方はトリッキーなんでしょうか?
179:デフォルトの名無しさん
08/01/19 04:22:37
>>178
vectorにユーザー型を入れれるのか?
ということであれば、普通に使えます。
その書式はおかしいけどな
180:デフォルトの名無しさん
08/01/19 04:33:56
>>178
structかclassつけーや
181:デフォルトの名無しさん
08/01/19 09:07:21
struct a { ... };
typedef t_a { ... } a;
C++コード上で下の利点ってどういったものがありますか?
182:デフォルトの名無しさん
08/01/19 09:12:45
>>181
C でも使えるコードを書くのでなければ特に何の意味もない。
183:デフォルトの名無しさん
08/01/19 09:21:06
d
184:デフォルトの名無しさん
08/01/19 10:09:32
勉強で簡易Stringクラスを作ろうとしてます。
ところがコンストラクタだけの段階で、実行時に
アクセス違反の例外で死にます。なんで?
#include <cstring>
class String {
int len;
char* s;
public:
String (const char* ch_ini) {
len = (int) strlen(ch_ini);
strcpy(s,ch_ini);
}
};
実行は
String k1("kkkkk1");
だけ(作っただけのつもり)。
これで死にまする。
185:デフォルトの名無しさん
08/01/19 10:12:37
土曜の朝から釣りか
char *sの指してる領域はどこなんだよ?
186:デフォルトの名無しさん
08/01/19 10:13:18
>>184
そのコードじゃstrcpyで死ぬわ。
char* sはどこを指してるのかね?
187:デフォルトの名無しさん
08/01/19 10:17:02
unsigned long型 = 256 * unsigned char型の計算をしています。
unsigned char型の変数に入る値はランダムで0〜150くらいの値が入るのですが、大体100以上の値が入ったときに4,294,967,295などの変な値になります。
なんで正しい値が入らないのでしょうか?
188:デフォルトの名無しさん
08/01/19 10:27:09
わかりました。あなたは世界を革命するしかないでしょう。
189:184
08/01/19 10:28:34
どこも指してない!?
どーすればよいのでしょうか。
190:デフォルトの名無しさん
08/01/19 10:29:29
古っ
191:デフォルトの名無しさん
08/01/19 10:29:53
>>189
その辺はポインタの基本中の基本なんだから、本でも読んで勉強してくれ。
192:デフォルトの名無しさん
08/01/19 10:39:07
>>187
本当に unsigned char なのかね?
符号つきになってないか?
193:デフォルトの名無しさん
08/01/19 10:44:12
>>189
正直自作クラスとか以前の問題。
文字列やポインタなどの基本から学び直してからのほうが良い。
194:デフォルトの名無しさん
08/01/19 10:46:26
>>187
ソースを晒すんだ
195:デフォルトの名無しさん
08/01/19 10:53:04
産業スパイか
196:デフォルトの名無しさん
08/01/19 10:57:22
(int)4294967295u == -1
197:187
08/01/19 11:32:13
処理の部分だけ抜き出して見ました。
traは0〜255が入ります。
unsigned char tra_undf = 0;
unsigned char tra_buff = 0;
static unsigned long ValuePuls = 0;
void main (void){
while(1){
if (tedgf_tracr == 1)
{tra_buff = tra;
flag_edge = 1;
tedgf_tracr = 0;}
if(tundf_tracr == 1)
{tra_undf++;
tundf_tracr = 0;}
if(flag_edge == 1)
{Sort();
tra_undf = 0;
flag_edge = 0;}
:
}}
void Sort(void){ValuePulse = ((256 * tra_undf) + (255 - tra_buff));}
結果は
tra_undf=189のときにValuePulse=4294950301
tra_undf=234のときにValuePulse=4294961868
念のため+ (255 - tra_buff)の部分を消して見ましたが
tra_undf=223のときにValuePulse=4294958848
でした。
198:デフォルトの名無しさん
08/01/19 12:01:07
>>184
何の本読んで勉強してんだ
さらしちまえ
199:デフォルトの名無しさん
08/01/19 12:49:14
>>197
コンパイラは?
200:デフォルトの名無しさん
08/01/19 12:56:10
int と size_t はどういう違い、あるいは、どのように使い分ければよいのでしょうか?
201:デフォルトの名無しさん
08/01/19 13:02:40
>>197
ソースを晒すんだ
202:デフォルトの名無しさん
08/01/19 13:09:31
>>197
>念のため+ (255 - tra_buff)の部分を消して見ましたが
>tra_undf=223のときにValuePulse=4294958848でした。
intが16bitの環境か?
256がintなのでtra_undfがintに格上げされ乗算され0xdf00になるが
これはintでは負数になる。
でunsignd longに代入されると符号拡張され0xffffdf00になる。
これは符号無しだと4294958848になって一致する。
203:デフォルトの名無しさん
08/01/19 13:52:20
LSI_C 試食版の悪寒
204:187
08/01/19 13:57:43
>>202
ありがとうございます。
NC30というコンパイラを使っているのですが、調べたらintは16bitと書いてありました。
回避方法は256の前に(unsigned)を付けるんで大丈夫ですか?
205:デフォルトの名無しさん
08/01/19 14:02:10
256u でおk。
206:デフォルトの名無しさん
08/01/19 14:03:11
(unsigned long) にしないと一緒じゃね?
207:206
08/01/19 14:03:49
そんなことないか、(unsigned)でもいいかも
208:デフォルトの名無しさん
08/01/19 14:06:30
256 * unsigned char 値 なら一応 16 ビットに収まるしな。
別に 256lu にしてもいいとは思うが。
209:187
08/01/19 14:15:25
助かりました!
本当にありがとうございます。
210:デフォルトの名無しさん
08/01/19 14:20:37
まだはじめたばかりなんですが、short int とかlong、double longなどの意味が分かりません。
無視して進んでも大丈夫ですか?
どんな場合に使うのかなどが把握できていない状況です。
211:デフォルトの名無しさん
08/01/19 14:26:14
必要になれば使うし、必要にならなければ使わない。
それだけの話。
212:デフォルトの名無しさん
08/01/19 14:26:16
ビールをグラスに入れるか、ジョッキに入れるか、ピッチャーに入れるかの違いだ。
213:デフォルトの名無しさん
08/01/19 14:31:33
SFCで遊ぶか、PSで遊ぶか、PS2で遊ぶかの違いくらいか?
214:デフォルトの名無しさん
08/01/19 14:35:10
現在「猫でもわかるC言語」で勉強しています。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
double pai=3.14159265358979;
int mon=2;
float flt=1.2f;
printf("%5.2hf\n",flt); ←ここだけtypeのプレフィックスの「h」を使っているのか分からないです。
printf("%-5.2f\n",flt);
printf("%05.2f\n",flt);
printf("%+08.2f\n",flt);
printf("%-08.2f\n",flt);
printf("%d\n",mon=3);
printf("%e\n",pai);
printf("%08.2f\n",pai);
printf("%05d\n",mon);
printf("円周率は%fです\n",pai);
printf("円周率は%1fです\n",pai);
printf("もう少し詳しい値は%10.8lfです\n",pai);
printf("もう少し詳しい値は%15.13lfです\n",pai);←ここの2行も「l」が使われていますが何のために使用しているのか分かりません。
printf("もう少し詳しい値は%20.18fです\n",pai)
system("PAUSE");
return 0;
}
見難いと思いますが、現在このような感じで悩んでます。
質問の内容がおかしかったらすみません。
215:デフォルトの名無しさん
08/01/19 14:44:13
hとl(長さ修飾子)そのものがわからないのか
それともどうしてそのタイミングで修飾子を使っているのがわからないのか
前者ならprintfでぐぐると一番上に出てくるけど
216:デフォルトの名無しさん
08/01/19 14:45:01
>>214
URLリンク(www.linux.or.jp)
長さ修飾子
h 整数変換に対応する引き数が short int か unsigned short int で、
n 変換に対応する引き数が short int へのポインタであることを示す。
そこで h はおかしくね?
217:デフォルトの名無しさん
08/01/19 14:47:08
lf : C89 の場合、規格違反。ただし、f と同じになるコンパイラも多い。
double を渡す時につい l を付けてしまう人がいるが、
l が必要になるのは scanf の方だけ。
printf の方では l は必要ない。
ただ、l をつける間違いを犯す人が多く、さらにそれをサポートしているコンパイラも多いため、
C99 になって l を付けてもいいことになった。
lf は f と同じ。
218:デフォルトの名無しさん
08/01/19 14:56:32
>>217
hf は?
だいたい長さ修飾子に対して浮動少数点数って関係あるの?
上のリンク読む限り関係ないと思えるんだが。
219:デフォルトの名無しさん
08/01/19 14:57:51
hf はおかしいっつーのは既に >>216 が書いてあるから
220:デフォルトの名無しさん
08/01/19 15:00:18
>>215
>>216
>>217
せっかくお答え頂いてるのにいまいち理解できないです・・・。すいません。
この「h」も「l」も書かなくても結果には関係しないのですが、
ここでは「h」も「l」も書く意味はないということですか?
221:デフォルトの名無しさん
08/01/19 15:00:30
>>217
l (エル)
各変換に対応する引き数が、整数変換では long intか unsigned long int、 n
変換では long long int へのポインタ、 c 変換では wint_t、 s 変換では
wchar_t へのポインタであることを示す。
L
a, A, e, E, f, F, g, G 変換に対応する引き数が long double であることを
示す。 (C99 では %LF を使うことを認めているが、SUSv2 では認められていな
い。)
lfじゃなくてLfのことじゃねえの?上の説明では明らかにlとLは違うし
lの意味を考えるとlfはおかしくね?
222:デフォルトの名無しさん
08/01/19 15:05:42
>>220
おれは今の場合だと、lもhも指定する意味が無いと思う。
(コンパイルエラーにはされないみたいだが。)
ありうるとすれば、Lfだが、long doubleの
引数を渡してるわけではない(floatの引数になってるよね)
のでLfも無意味だと思う。
223:デフォルトの名無しさん
08/01/19 15:07:23
>>221
URLリンク(seclan.dll.jp)
224:デフォルトの名無しさん
08/01/19 15:18:30
>>222
この場合は特に意味は無いんですね。
引数がいまいち分かっていないので、皆さんの説明を上手く理解することができませんでした。
引数はもっと本の先で解説されているようなので、そこまで進んでまた戻ってみます。
アドバイスを上手く活用できなくてすいませんでした。ありがとうございました。
225:デフォルトの名無しさん
08/01/19 15:19:38
>>223
ほほー thx
以下でいいの?
%f doubleを出力
%lf doubleを出力(実質的には今までの%fと同じ)
%Lf long doubleを出力
要は表記を許しただけということか。
226:デフォルトの名無しさん
08/01/19 15:20:22
>>224
おい、>>223を見といたほうがいい
227:デフォルトの名無しさん
08/01/19 15:27:44
>>225
Yes.
>>226
まあもう少し後でいいんじゃね。
というか、可変個引数の引数の規則とか
先まで進まないとよく分からんと思うし。
228:デフォルトの名無しさん
08/01/19 15:39:11
C89は実情に見合ってないしC99は明々後日の方向向きすぎ
229:デフォルトの名無しさん
08/01/19 15:56:52
試したみたのはgcc,bcc32, vsのやつ、です
float.hのマクロ定数を表示させる文
1.
printf("FLT_MIN = %e\n", FLT_MIN );
printf("FLT_MAX = %e\n", FLT_MAX );
2.
printf("FLT_MIN = %f\n", FLT_MIN );
printf("FLT_MAX = %f\n", FLT_MAX );
としたところFLT_MAXはどちらもまともに表示されるのですが
FLT_MINのほうは2.の方が0.000000という表示になってしまいます
これはなにがまずいのでしょうか?
どなたかお願いします
230:デフォルトの名無しさん
08/01/19 16:04:55
%.50f くらいやっとけ
231:デフォルトの名無しさん
08/01/19 16:10:07
>>230
桁が足りなくて丸められてたのですね
ありがとございました
232:デフォルトの名無しさん
08/01/19 17:56:54
丸められていたというか表示されていなかっただけかと
233:デフォルトの名無しさん
08/01/19 18:06:26
>表示されていなかっただけかと
処理系依存かどうか知らないけど、printfって小数点以下表示桁で四捨五入しないっけ?
234:デフォルトの名無しさん
08/01/19 18:14:01
>>233
ですよねぇ
>>232
言われて
気になって確かめてみました
235:デフォルトの名無しさん
08/01/19 19:08:00
>>233
%fって%.6fと同じだからこれで合ってるんじゃないの?
236:デフォルトの名無しさん
08/01/19 19:17:53
丸めるか切り捨てるかの話だろ
237:デフォルトの名無しさん
08/01/19 19:23:27
>>236
切り捨てって丸めの一種なんだけどね。
238:デフォルトの名無しさん
08/01/19 21:37:55
>>235
あぁいや、大したこっちゃないんだけど、四捨五入した結果だったら、
表示されてないだけというより丸められてるって方があってるかな、と思っただけ。
実際問題じゃどっちでも良いかな
239:デフォルトの名無しさん
08/01/19 22:07:23
Visual Studio Std 2005 で Win32API を勉強中です。
ウィンドウを表示して、その中にMoveTo や LineTo で線を書くことはできました。
そこで、その書いた線上にマウスを持って行くと
マウスポインタが変更できるようにしたいのですが、
どんな感じに作っていけばいいのでしょうか?
マウスの位置を調べる関数があるのですが、
マウスが動くたびにその関数を呼び出して、
その値を、先ほど書いた2点間の線上の一次方程式に入れて判断していくとか、
そんな感じになるのでしょうか?
それとも、もっと簡単な方法とかあるのでしょうか。
教えてください。
240:デフォルトの名無しさん
08/01/19 22:14:37
>>239
Win32APIスレの方がいい気もするが。
WM_MOUSEMOVEのlParamを使うなりしてカーソル位置を取得。
特定の方程式があるなら、それに当てはめればいいし、
GetPixel()を使って色で判別とかも出来る。
241:デフォルトの名無しさん
08/01/19 22:43:31
>>240
色で判別というのもありますね。
いずれにしても、簡単にはいかないみたいですね。
Win32API スレにも質問してみます。
ありがとうございました。
242:デフォルトの名無しさん
08/01/19 22:48:03
後のマルチである。
243:デフォルトの名無しさん
08/01/19 23:43:44
凄く簡単な質問で、自分で確かめろって感じなんですが、
今実行できる環境がないので、教えてもらえませんか。
<Head.h>で以下のように変数を宣言して、
int var;
<Main.cpp>にインクルードしたら、
#include "Head.h"
何もしないでも<Main.cpp>でvarは使えますか?
それとも<Main.cpp>で"extern int var;"としないといけないんですか?
244:デフォルトの名無しさん
08/01/19 23:47:58
じゃ俺も試さないでレスw
多分何もしないで使えるはず。
245:243
08/01/19 23:52:22
>>244
ありがとうございます。
やっぱ何か心許ないので、後で実験してみます。
すいません。
246:デフォルトの名無しさん
08/01/20 00:01:11
>>229
%fなんか使わずに%gを使っとけ。
247:デフォルトの名無しさん
08/01/20 00:03:52
%e との比較をしたい以上、%f の方が適切じゃね?
248:243
08/01/20 00:09:50
すいません、なんか混乱してきたのでもう一度質問です。
------------
<Head.h>
extern int var;
<Head.cpp>
int var;
------------
<A.h>
#include "Head.h"
<A.cpp>
#include "A.h"
------------
<B.h>
#include "Head.h"
<B.cpp>
#include "B.h"
------------
これで<A.cpp><B.cpp>共に同じvarを使えるでしょうか?
249:デフォルトの名無しさん
08/01/20 00:18:25
>>248
リンケージと宣言、定義について勉強しろ
250:デフォルトの名無しさん
08/01/20 09:29:33
>>248
使える。
>>249
もしかしたらそれ以前に、#includeの意味がわかっていない気がしないでもない。
251:デフォルトの名無しさん
08/01/20 11:03:58
私にも力が出せるかな
本気でがんばるから見ててね
キミらしく夢を語る瞳 宝石だってかなわない
(いちばん) 好きなことで (進める) 道を探そうよ
「大人になることはさみしいことさ」なんて逃げないよ
Overwrite 輝きながら あしたを塗り変えるため
最新Dream ステキな毎日を重ねたいだけ
一緒に行こう!
とまらない想いがあるってのに
誰にも言えずに温めてた
これからは話してみたいんだ
キミに会ってわかったよ
(ときどき) 確かめ合う
(希望が) 色あせぬように
「喜びをふたりで何倍にもしよう」いまを楽しくね
Overdive 広がる世界 あしたは無限に続く
最高Trance トキメキながらまた あふれるリズム
何でもできる!?
Overdive 広がる世界 あしたは無限に続く
最高Trance トキメキながらまた あふれるリズム
何でもできる!?
Overwrite 輝きながら あしたを塗り変えるため
最新Dream ステキな毎日を重ねたいだけ
キミの笑顔と 一緒に行こう!
252:デフォルトの名無しさん
08/01/20 17:58:42
>>249
>>250
ありがとうございます。やってみたらできました。
253:デフォルトの名無しさん
08/01/20 18:04:28
メモリ解放というのをいつやればいいのか分からないんですが、
例えば下の場合、methodを抜けたら解放しなくても、
bufは自動でなくなるんでしょうか?
void method(){
char buf[100];
int i = 123456;
sprintf(buf,"%d",i);
}
254:デフォルトの名無しさん
08/01/20 18:06:07
無くなる。
解放する必要があるのは malloc やら new やらしたやつ
255:デフォルトの名無しさん
08/01/20 18:14:19
ありがとうございます。
256:デフォルトの名無しさん
08/01/20 18:42:36
サーセン
「+=」
とか
「-=」
ってどんな時使うんですか?(>_<)
257:デフォルトの名無しさん
08/01/20 18:44:09
>>256
A = A + 2
でAを2回書くのがめんどくさくなったとき。
258:デフォルトの名無しさん
08/01/20 18:44:09
a = a+10;
a += 10;
259:デフォルトの名無しさん
08/01/20 18:49:12
普通は a = a + 10; なんて書かない。
BASIC や FORTRAN あがりの人が書く程度。
260:デフォルトの名無しさん
08/01/20 22:48:50
最近のVisual C++ではfopenを使うと代わりにセキュアなfopen_sを使えと警告が出るらしいのですが、
fopen_sはfopenに比べてどうセキュアなのでしょうか。
261:デフォルトの名無しさん
08/01/20 22:58:48
>>260
fopenとfopen_sのソースでも見比べたら?
262:デフォルトの名無しさん
08/01/20 23:04:45
>>261
どこにあるんですか?
263:デフォルトの名無しさん
08/01/20 23:07:54
>>262
デバッガで動かして、fopenの中にF11キーで入ればいいだろ。
そうすりゃ分かる。
264:デフォルトの名無しさん
08/01/20 23:10:58
>>263
最近のVC++は持っていません。
265:デフォルトの名無しさん
08/01/21 00:16:01
も、もうだめだ。
さよなら単位
266:デフォルトの名無しさん
08/01/21 00:37:07
さよなら(^o^)/~~
267:デフォルトの名無しさん
08/01/21 00:40:28
Cプログラマ必須テキスト!
URLリンク(mori.eco.to)
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5007日前に更新/252 KB
担当:undef