【初心者歓迎】C/C++室 Ver.14【環境依存OK】
2 :
デフォルトの名無しさん:05/02/21 03:39:23
2様
4 :
デフォルトの名無しさん:05/02/21 03:40:21
4様
テンプレ以上です
7 :
デフォルトの名無しさん:05/02/21 03:53:24
メソッドを書くときに、スーパークラスのメソッドをオーバライドするときには、
publicとprotectedとprivateのどれを使うのが適切ですか。
>>8 「オーバーライドするから」と言う理由だけではどれが適切かは決まらない。
そのクラスにとって適切なのを選べ。
10ゲト
11 :
デフォルトの名無しさん:05/02/21 08:50:44
スーパークラスのメソッドのアクセス指定子と同じにしなさい
>>11 private 継承しても public でオーバーライドか。おめでてーな。
いつの間にか新スレが。おめでてーな。
じゅう4様
ぬるぽ様
ガッ様
class NullPointerException : public std::runtime_error {
public:
explicit NullPointerException(const std::string& what_arg) : std::runtime_error(what_arg) {}
};
空欄にiを入れると「0 1 2 3 4」と表示しますが、
これを「4 3 2 1 0」と逆順に表示するように空欄を埋めなさい。
#include <stdio.h>
void main(void)
{
int i;
for(i=0; i<5; i++) printf("%d ", );
}
馬鹿だからわかんねぇ〜〜〜〜!!!!ヽ(`Д´)ノ
4−i
じゃねえ?
20 :
デフォルトの名無しさん:05/02/22 22:25:42
・・・
>>19 ははは・・・(´ー`)そうですね、ありがとうございました。
こんなのもわかんなかった俺って・・・_| ̄|○
>>20 えぇ、その気持ちわかりますよ。ごめんなさいごめんなさい
_ト ̄|○
23 :
デフォルトの名無しさん:05/02/22 22:44:33
C++で組むとCよりプログラムサイズが大きくなるって本当ですか?
>>23 そんなことはないだろ。俺はBCC5.6.2に(ry
プログラムサイズの定義から話し合おうじゃないか。
noeh32.libをリンクしたら実行ファイルサイズが小さくなりました
STLを使うt(ry
>>27 環境によ(ry
使っても使わない時と比べ10Kほどしか(ry
29 :
デフォルトの名無しさん:05/02/23 00:39:22
クラスAは、データを取得保持する共通クラス。
クラスBは、Aからデータを受け取って処理するクラス。
Aからデータを受け取るときに、hogeからhogexx(hogeから派生)
というふうにキャスト?しちゃってるんですが、これは良くないのですか?
class A{
public:
hoge* GetData();
};
class B{
public:
A *a;
void xmethod {
hogexx *p=(hogexx*) a->GetData();
}
};
べつにいいよ。
よくねえだろ。
A::GetDataが返す実体がhogexxならいいけど。
>>29 良くないですね。
現状の hoge の定義がわからないと、言い切ることはできないのですが、
おそらく hoge に適切な仮想関数を定義するのが模範解答になると思います。
>29
class A
class B : public A
のとき
A* pa = new B;
はオッケなのはわかる?
つまり
class 猿
class 人間 : public 猿
のとき
猿を人間にキャストしたら、知能が足りないのでまともな人間にはならない
人間を猿にキャストなら頭のいい猿になるので問題ない
>>30-33 ありがとうございます。
クラスAは、もう何年も前にコーディングされhoge自身はまったく更新されていません。
hogeを派生したクラスがいろんなとこで使われているので、templateにするしかないのかな
と思っています。
他に良いほうほうがあったら教えてください。
なんでtemplateがでてくるのかようわからん
もし >29で動作してるとしたらclass Aの返しているhoge*の
インスタンスはhogexxで作られているんじゃないか?
でclass Bでhogexx*にキャストしているのはhogexxのメソッドを使いたいから?
だったらclass B以降でよくつかうhogexxのメソッドをhogeのメソッドにして、
class Bでもhogeで受け取ってそのあとの処理ができるようにするべきでは?
hogeの機能不足が問題だと思われ
実際のソースを見てないからなんともいえないが、小手先のごまかしでなく
きちんと修正すべきだと思われ
それでも修正箇所が極力少なくてすむような修正じゃないとまずいと思うが
一番ダメダメなのは最初にhogexx *p=(hogexx*) a->GetData(); と書いた香具師
修正の時間が取れずに一時しのぎで書いたにせよ、後ででもいいからきちんとした形にしておくべきだったな
苦し紛れのコードを書くと、後の人間が苦労するといういい例
class Aはhogeおよびその派生クラスの実体の生成には関与せず、
そのコンテナとしてのみ機能しているなら判らんこともない。
その場合ならclass Aの派生クラスを作ってGetDataをオーバーライドするのが手。
あー、まさかGetDataが仮想関数じゃない?
>>36 オーバーライドでは戻り値の型は変えられないし、
Aがオブジェクトを保持してるんなら、派生クラスでもそれを返すしかないし、
オーバーライドでは何も解決しないと思う。
>>37 >オーバーライドでは戻り値の型は変えられないし、
変えられるんだよ〜ン。
hogexxがhogeをpublic継承している限り、基底クラスAの hoge* GetData()を
派生クラスで hogexx* GetData() でオーバーライドすることは認められている。
ってかこれができなきゃ多態にならんでしょ。
でも、これ、知らんやつが多いんだよなぁw。
>Aがオブジェクトを保持してるんなら、派生クラスでもそれを返すしかないし、
「class Aはhogeおよびその派生クラスの実体の生成には関与せず」って断ってるやン。
当然、格納されているのはポインタか参照であることが前提だわな。
39 :
デフォルトの名無しさん:05/02/23 04:03:35
hoge* GetData() のままでも多態になるがw
GetDataを仮想関数にするのは当たり前
abstruct class
一人大馬鹿が混ざってるな
42 :
デフォルトの名無しさん:05/02/23 04:16:00
>>38 > 変えられるんだよ〜ン。
ポインタじゃない場合と勘違いしてた。ごめん。
> 「class Aはhogeおよびその派生クラスの実体の生成には関与せず」って断ってるやン。
ということは、
A は格納されるオブジェクトについて「 hoge およびその派生」を受け付けてしまうので、
これを「 hogexx およびその派生」に狭めることはできないのではないか?
と思う。
private で継承するってことかな?
でもそうなると GetData() が仮想関数である意味が無いな。
>>43 いいですよ。
実際のところは「マネージャ」ってのがMMUになるんだろうな。
ソフトでこれを実装できるかどうかは怪しいし、
できたとしてもパフォーマンス的に実用できないだろう。
try {
a = new char[1024];
b = new char[1024];
c = new char[1024];
} catch(bad_alloc e) {
return 0;
}
ここで c の new の時に例外が発生した時にはやはり a , b は解放しなくてはいけないのでしょうか
また、スマートな解放の仕方をおしえてください
初歩的な質問かもしれませんがお願いします。
debianで動くC++プログラム中で、あるタイミングで
ディスクの空き容量をチェックしたいのですが、
dfコマンドのような関数はありませんでしょうか。
ネットや本でさがしてるんですがプログラム中から
ディスクの空き容量を取得する方法がなかなかわかりません。
>>47 boost::scoped_arrayのようなスマートポインタに突っ込む。
>>47 a = b = c = NULL;
try {
a = new char[1024];
b = new char[1024];
c = new char[1024];
} chatch (bad_alloc e) {
delete a;
delete b;
delete c;
return 0;
}
>>50 このうっかりさんめw
a = b = c = NULL;
try {
a = new char[1024];
b = new char[1024];
c = new char[1024];
} catch (bad_alloc e) {
delete[] a;
delete[] b;
delete[] c;
return 0;
}
>52
オマエモナー
a = b = c = NULL;
try {
a = new char[1024];
b = new char[1024];
c = new char[1024];
} catch (bad_alloc e) {
if(a)delete[] a;
if(b)delete[] b;
if(c)delete[] c;
return 0;
}
>>53 ?
delete[] 0;は効果を持たないから、そのif()は必要ない。
a = b = c = NULL;
try {
a = new char[1024];
b = new char[1024];
c = new char[1024];
} catch (bad_alloc e) {
delete[] a;
delete[] b;
delete[] c;
return 0;
}
これでOKですか?
delete[] に NULLわたしてもOKですよね・・
a = b = c = NULL;
try {
a = new char[1024];
b = new char[1024];
c = new char[1024];
} catch (bad_alloc) { // 使わないんだから変数名は省略できるだろ。
delete[] a;
delete[] b;
delete[] c;
return 0;
}
a = b = c = 0;
try {
a = new char[1024];
b = new char[1024];
c = new char[1024];
} catch (bad_alloc&) { // 使わないんだから変数名は省略できるだろ。
delete[] a;
delete[] b;
delete[] c;
return 0;
}
0 なんか使わない
例外は参照で受け取る
orz
s/0/NULL
えーと、ポインタの初期化はNULLじゃなくて 0 を
代入することが推奨されていると、
それが言いたい訳ね?
class Kanojo : protected Girl {
//略
};
main() {
Kanojo shiho;
}
上のコードを実行するとbad_alloc例外が飛んでくるんですがどうすればよいのでしょうか?
>>60 どうすればいいんでしょうね?
あなたが何をしたいのかわからないので答えようがありません。
省略しないソースと、コンパイラー、OS、
を提出してくれれば答えてあげてもいいよ
またいつもと同じやり取りが続く・・・
BCCでGUIアプリを作りたいです。
cgiにしてApache上で動作させてブラウザからGUI…というのはできましたんで、
そのほかのGUIにする方法を教えて下さい。
もろ初心者です。
Win32APIでも覚えなさい
>>64 BCCじゃなくてBCBを金を出して買え。
金がないなら必死に「猫でも」でも読んでみろ。
>>64 それはGUIじゃない。
基礎からやり直せ。
>>64 ↓どうぞ^^
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("MainForm.cpp", Form1);
USEFORM("Unit2.cpp", Form2);
//---------------------------------------------------------------------------
#include "MainForm.h"
extern TForm1 *Form1;
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
try {
Application->Initialize();
Application->Title = "はじめての
>>64GUIプログラミング";
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception) {
Application->ShowException(&exception);
}
catch (...) {
try {
throw Exception("");
}
catch (Exception &exception) {
Application->ShowException(&exception);
}
}
return 0;
}
69 :
デフォルトの名無しさん:05/02/25 14:27:57
ずっと昔に先輩から、
「C(C++)でプログラム組むときは、1関数に1ファイル。」
と教わったことがあります。
でも、そんな事したら、1プログラムで何百ファイルとなってしまいます。
本当に皆さんもこんなことしているのでしょうか?
今でもおかしいと思ってやみません。
こっちにも貼ったのかよ
C++でもってことは、クラス内のゲッタでも1ファイルだったりして。
#1行ですむのにね。
75 :
デフォルトの名無しさん:05/02/26 00:18:51
多分その先輩はコピペしまくりの超巨大関数しか作らないんじゃないの?
もちにみ
78 :
デフォルトの名無しさん:05/02/26 01:03:23
>>69 どっかの本(雑誌だったかな?)でも似たようなこと書いた記事見たことある。
当時はそうなんだ、と感心したものだったが、
いまだに実行に移していない(ってか、移せるわきゃ無いだろ)自分がいる。
やっぱりそうですよね。
15年来の疑問がやっと解決しました。
どうもありがとうございました。
15年!
いちいち反応すなw
82 :
デフォルトの名無しさん:05/02/26 01:25:58
libc.aをバラすと1ファイル1関数になってたりする。
リンク後の実行可能ファイルのサイズをちょっとだけ抑える効果ぐらいしかない。
依存関係にある関数同士はどうせ一緒にリンクされるのでライブラリ内でも1ファイルにまとめられていることがある。
いや、15年前だと1つの関数が数百行とか平気で書く奴がいたらしい。
大丈夫、今でもいる。
某サイトでさらされている最長は六千行だったかな。
ライブラリをリンクすると関係ない関数までリンクされちゃう?
されない
>>82 >依存関係にある関数同士はどうせ一緒にリンクされるので
>ライブラリ内でも1ファイルにまとめられていることがある。
その理由を否定する訳ではないが、どちらかというと関数群内で
共通の変数などをstaticでくくって隠蔽する目的もある。
Cのファイル単位のスコープは、C++のクラスが使えるようになるまでは
よく利用された。っていうか今でも利用されている。
C++でプログラム組むときは、1ファイルに1クラス。
であってますか?
>>90 そうとも限らん。
自分的には1ファイル1ネームスペースが原則。
例外もあるが。
質問です。
EMアルゴリズムを回してます。
「アクティブな構成」が「Win32 Debug」と「Win Release」の時で
結果が違うんですけどなぜでしょうか・・・。
収束するとこも違うし、Releaseだとエラーが出て止まってしまうんです。
Visual C++ 6.0、WindowsXPです。
↑「Win32 Debug」と「Win32 Release」です。
すまぬ。もちつきます。
初めまして★ 学校の課題で、
『キーボードから入力した数字を999が入力されるまで降順にソートしていき、数字の値と共にその数字分の*を表示する。999はデータとして扱わない。配列の要素数は10で11以上の入力はなく、数字以外の入力もないものとする。』
というのをやっているのですが、私が作成した以下のプログラムでは出来ませんでした。どこを直せばいいのか教えていただけないでしょうか?
#include <stdio.h>
void main()
{
intdata[10],i=0,j,max=0,dummy;
while (i < 10) {
if (scanf("%d",&data[i]),data[i] != 999){
printf("max = %d\n",max);
if (max <= data[i]){
dummy = data[i];
data[i-1] = max;
max = dummy;
}
} else {
data[i+1] = EOF;
goto next;
}
i++;
}
next: ;
for(j = 0; data[j] != EOF; j++){
printf("data[%d] = %d\n",j,data[j]);
}
}
すみません、質問です。
変数の数値を桁ごとに分けて、
それぞれ別々の変数に入れる方法を教えてください。
>>99 1.xを10で割ったあまりをaに入れる
2.aをketa[]に入れる
3.xを10で割ってxに入れる
4.1〜3をxが0になるまでくりかえす
2)
1.xを文字列に変換する
2.その文字列を文字数分ループさせて一文字ずつとりだす
おすきなのをどうぞ
>>100 あまりを使うのですか!
ありがとうございます!
商と余りを同時に求めたかったらdiv()を使えと
>>102 div()を調べました。
こんなのがあるんですね、知らなかった
標準関数なのに・・・
>>99 sprintf()で文字列にして、
sscanf()で一桁ずつ取り出せばいいのでは?
# って、
>>100でガイシュツか…
以下のようにすると,
`A' was not declared in this scope
というエラーがでてしまうのですが,どうすれば良いのでしょうか?
= A.h:
class A {
public:
typedef struct Hoge {
...
} hoge;
}
=B.h:
#include "A.h"
class B {
public:
B(A::hoge *hoge); // ここでエラー
}
>>105 セミコロン落ちはコピペしたときのミスとすれば
エラーの原因はそこに引用した以外の部分にあるはず。
--- A.h --------------
typedef Hoge {
...
};
class A {
public:
Hoge hoge;
};
--- B.h --------------:
#include "A.h"
class B {
public:
B(Hoge *hoge);
};
とりあえずこれならOKだよな?
>>108 多分、
×typedef Hoge {
○struct Hoge {
なんだろうな。
それなら通る、ってか
>>105だって(セミコロンは要るが)通るはずなんだよ。
結局、省略してないソース全体を見なきゃ何も判らないよ。
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
FILE *fp;
unsigned count;
if(argc!=2){
exit(1);
}
if((fp=fopen(argv[1],"rb"))==NULL){
exit(1);
}
count=0;
while(!feof(fp)){
fgetc(fp);
if(ferror(fp)){
exit(1);
}
count++;
}
printf("%u",count-1);
fclose(fp);
return 0;
}
Press any key to continueで終わってしまうのですが、
コマンドラインでファイルを指定するという方法はどうすればいいのですか?
ファイルのバイト数を表示するプログラムらしいのですが。
何かプログラムソースに付け加えたり、新しいテキストファイルを作るのでしょうか?
MS-DOS プロンプトでいろいろ試しましたが、よくわかりません‥。
>>110 そのプログラムの実行方法がわからんということか?
コンパイルしたら
./a.out hoge.dat
と打ってみろ。
>>111 UNIXじゃなくてwindowsなんです、すみません‥。
Visual C++でやってるんですが、
Press any key to continueのあとは何も書き込めないみたいです。
コマンドライン引数について勉強不足なのでちっと勉強してみます。。
>>112 DOSプロンプトに
出来たexe名 引数
と打つか、VC++のIDEから実行するなら引数を指定するとこがメニューのどっかにあるはず。
C:\windows>デスクトップ\File\Debug\Cpp1.exe
とすると、「コマンドまたはファイル名が正しくありません.」
はでません。引数は謎です。
>>114 プログラミングの前にコマンドプロンプトの使い方を勉強してこい。
デスクトッフ
これ消せ
119 :
v(^・^)v:05/03/03 23:56:28
age
120 :
デフォルトの名無しさん:05/03/04 05:30:58
C++まだまだですわい。
教えてください・・・
標準関数や、WindowsAPIなどで文字列へのポインタを返してくれる関数が
いくつかあるようなのですが、その文字列のメモリ領域?は誰がいつ解放して
いるのでしょうか・・。。
WindowsAPIでプリンタ名などの文字を返してくれる関数を使っていて
とても気になり始めました・・。
宜しくお願いいたします。
何の知識もない状態で、何も調べずにカキコ
>>121 ヘルプ嫁
>>121 概ね、4種類のパターンに分かれる。
1)システム固有などの固定領域にある文字列へのポインタを返す。
→アプリケーションの存在期間を通して気兼ねなく使える。
2)クラス固有などの動的領域にある文字列へのポインタを返す。
→クラスの存在期間を通して気兼ねなく使える。
3)関数固有などの領域に一時的に文字列をコピーしてそれへのポインタを返す。
→関数呼び出しごとに破壊されるので呼出し後にコピーしておく必要がある。スレッドセーフではない。
4)ヒープなどの領域からメモリを確保し、そこに文字列をコピーしてそれへのポインタを返す。
→自前で解放などする必要がある。
5)引数で渡されたポインタをそのまま返す。(strcpy等)
>>125 いろいろ問題があるなぁ。
・その関数はポインタを返さない。
返すのはBOOLだ。
・その関数が返してくれる情報は、呼び出し側が用意したバッファに格納される。
そのバッファをどう扱うべきかは呼び出し側が承知しているはずだ。
従って、>123→124のいずれのケースにも該当しない。
ちなみに、その関数についてはあんたの提示したページからのみ情報を得た。
即ち、>122の言うようにヘルプを読みさえすれば>126で書いたような情報が得られるわけだ。
>>127様
まだぜんぜん何もわかってないようです・・もう少し勉強してから
出直します・・
板汚しすみませんでした。
>128
ま、「初心者歓迎」なので。
もう見てないかもしれんが、あんま落ち込まないようにな。
とりあえず Windows 云々の前に C/C++ 一般の勉強をした方がいいと思う。
ポインタとかメモリ確保とか。
未初期化のポインタ渡してメモリ破壊とかしてそうだぞ。
まいどまいど言われる事だが、まともな入門書一冊仕上げればいいのに。
下のようにenumにint値を入れたりintにenum値を入れるのって問題ありますか?
enum Keyname { keyShift, keyCtrl, keyAlt };
int k = 1;
Keyname optionkey = static_cast<Keyname>(k);
>>131 かまわんけど普通は
Keyname optionkey = Keyname(k);
intにenumを代入するのは問題ないが、
enumに別の型を代入するのは設計が悪い。
>>132-133 d
>133
設定ファイルやコントロールへの出入力で使ってるのですが‥‥
>134
switch (k)
{
case 0:
opt = keyShift;break;
case 1:
opt = keyCtrl;break;
case 2:
opt = keyAlt;break;
}
もしくはenum型を使うことを諦めて、ただの整数型として保持。
enum型を使う以上、要素以外の値が代入される可能性を0にしなければ意味がない。
136 :
デフォルトの名無しさん:05/03/06 11:48:36
柴田望洋著「明解C言語 入門編」のP.125、演習6-6での、
「画面に『こんにちは。』と表示して改行を行う関数
void hello(void){ /* … */ }
を作成せよ。」
という問題がいくら考えてもわかりませんorz
出来ればヒントを提示して頂けたらありがたいのですが…。
それ以前の問題は一応解けます。
携帯から書いたので記述が至らないところもあるかも知れませんがよろしくお願いします。
>>136 単に標準出力に文字出すだけならprintfで十分じゃないか?
>>137 無理ぽです。(つД`)
こんなに頭の弱い俺に解答お願いします。
台と棒があるのに天井に吊ってあるバナナが取れない
っていうレベルだな・・・
void hello(void){printf("こんにちは。\n");}
……いくらなんでもこんなことがわからないはずあるか?たぶん別のことで悩んでるんだと思うけど
>>135 enum型の値に、要素以外の値、例えば
>>131の例では範囲:0-2以外の数値を代入しようとすると
型エラーが出るから、
>>132の書き方で十分安全じゃないか?
さらには、
enum Keyname { keyShift = 1, keyCtrl = 2, keyAlt = 4 };
として、
Keyname optionkey = Keyname(keyShift | keyAlt);
といったことをする可能性もあるので、switch()だと苦しい気がする。
・整数系データ型の値は、明示的に列挙型に変換できる
・算術演算時には、列挙はデフォルトで整数に変換される
ことから、設定ファイルとの入出力においては、列挙型を整数値として取り扱ってもよいと思う。
enum型は、ユーザやコンパイラに、その変数の用途についてのヒントを与えることを目的としてるはずだし。
>136
質問の仕方が悪い
普通「画面に『こんにちは。』と表示して改行を行う関数を作成せよ」
だったら質問は
・画面に表示する方法がわからない
・改行する方法がわからない
・関数をどうやって作るのかわからない
のどれかだろ?
>138
>こんなに頭の弱い俺に解答お願いします。
頭が悪いとかレベルじゃなくて、本を読む前からなげてるだろ
プログラム以前の問題だからちゃんと本読めばバカでもわかる問題だと思われ
これくらいも独力でできないならプログラムなんかするな、ムカつく
どうせ学校の授業の課題なんだろ
学校の授業なら単位落として、その授業二度と受けるな
必須科目なら、学校辞めちまえ
multimap で 特定のkeyとvalueのペアを削除するにはどうしたらいいですか?
>>144 equal_rangeで範囲を絞って、std::remove_ifで探索して、eraseで消す。
>>144 multimap <string, int> mm;
size_t a = mm.erase((string)"apple");
a := 削除した要素数
<特定のkey>とvalueのペア?
特定の<keyとvalueのペア>?
>147
下です
forit ... {
if ((it->first == key) && (it->second == value))
mmap.erase(it);
}
っての作ってみた、やっぱり
>145さんみたいなことしたほうがいいのかな・・・
>>148 そのコードは、multimapの要素がkeyによってソートされているという事実を
利用していないから、無駄が多い。
まずequal_rangeで範囲を絞って、それから、
>>145のように標準アルゴリズムを使うなり、
手でループを書くなりして削除すると良いと思う。
>>144 template <typename key_type, typename mapped_type, typename map_type>
void remove_kv(map_type& mm, const key_type& key, const mapped_type& value)
{
typename map_type::iterator first = mm.lower_bound(key), last = mm.upper_bound(key);
while (first != last)
if (first->second == value)
mm.erase(first++);
else
++first;
}
>>150 で答え出てるのに言うのもなんだけど以降のために念のため。
remove_if は multimap (連想コンテナ)には使えないでしょ。
>>153 あえて書くなら
template <typename key_type, typename mapped_type, typename map_type>
void remove_kv(map_type& mm, const key_type& key, const mapped_type& value)
{
std::pair<typename map_type::iterator, typename map_type::iterator> kv = mm.equal_range(key);
typename map_type::iterator first = kv.first, last = kv.second;
// 以下略
}
ですが…equal_range()は本質的にstd::make_pair(lower_bound(key), upper_bound(key))
ですから、特別使う利点を感じませんでしたのであえて使いませんでした。first,lastを
使わずにループ内で何度もメンバ参照を行うのは効率的に論外ですし。もし何か上の
コードに特記すべき利点がありましたら、後学のため教えてください。
禿本では
>2つの別個の演算で先頭と末尾を探索するのは、エレガントでも効率的でもない。
>そのため、両方を同時に取得する equal_range() が用意されている。
とのこと。効率悪から equal_range 使えって言いたかったんでない?
iteratorのコピー回数的にも…理解できないです。多分私には禿の
高尚な考えは理解できないんでしょう。抜粋ありがとうございます。
これから禿本とEffective STL辺りと睨めっこしてきます…
>>156 lower と upper では内部の処理がダブりに
ダブりまくってるんでしょう
>>157 いや確かにそうなんですが、上述のようにequal_range()は本質的に
std::make_pair(lower_bound(key), upper_bound(key))と同じ…と言うか
他の実装が思いつきません。
当座おとなしくequal_range使っておきます。
>142
型エラーって何?
>Keyname optionkey = Keyname(keyShift | keyAlt);
Keynameにとって範囲外の値「5」を代入するな。で、型エラーって何。
割り込んで申し訳ないが
禿本ってよく出てくるけど,正式名称わかんないんだ
推薦図書・必読書スレでもよーわからんし…
誰か教えてちょ
お前ら禿禿禿禿って…いい加減にしろよ?
>>162 禿本ってなんでした?よくわからなかったので教えていただけないでしょうか
>>159 1. 型エラーについて
型エラー : invalid conversion from `int' to `Keyname'
列挙子に対しては、「明示的」 にしか、整数系データ型の値を入れることはできない。
従って、直接数値を代入する書き方は違法であり、型エラーとなる。
Keyname optionkey = 5; // 型エラー
Keyname optionkey = Keyname(5); // ok
2. 列挙子の範囲について
例えば、
enum Keyname { keyShift = 1, keyCtrl = 2, keyAlt = 4 };
と定義したときの、Keyname型の上限値は 「7」 である。
これは、
> 列挙の上限は、列挙に含まれるすべての列挙子の値よりも大きい
> 2の累乗値マイナス1のなかでもっとも小さい値である。
による。
もし
>>159がこれまで列挙子について誤解をしていたのなら、
文字通りの例が禿本(プログラミング言語C++ 第3版)の§4.8 列挙(手元の第一刷ではp.112)
に書かれているから、読み直して勉強するといい。
Cの話かC++の話か、前提を一致させてから議論しようよ。
リンクを上にたどって行くと、一番始めで
>>131 dynamic_castが出てくるからC++の話のはずなんだが。
×dynamic_cast
○static_cast
何となく分かった気がしました。禿本の「効率」って、速度的な効率と
いうよりもコーディング労力的な効率ですね。
170 :
デフォルトの名無しさん:05/03/07 23:07:28
構造体配列を引数とした使い方が良くわからない。
他のサイトを見てもほとんどが、広域変数として扱っているか、main関数内での使用例しか書いていない。
VC++6.0を使用しているけど、何処か参考になるサイトってあります?
Cで、実数を表す文字列を long double に変換したいです。
sscanf や strtod を使用してみたのですが、ULONG_MAX の文字列を入れた時、
期待したものと違う値になってしまいます。
どのように変換するのがよいのでしょうか?
>>172 どのような変換が正しいのでしょうか?
一文字ずつ変換して10かけて…、とかそう言うヤツですか?
>>165 enum E { A, B };
E e = static_cast<E>(2);
↑範囲外の数値を代入しようとしているが、型エラーは出ない。
これでも安全か?
>>175 Pascalと混同するな。
C/C++のenumは範囲をチェックしているわけではありませんから。
32ビット環境なら32ビット値が列挙型変数の記憶領域として割り当てられるだろ、普通。
2^n-1などという上限を設けるということは、任意のnビットの変数が存在できることにならないか?
それを実現させるメリットが現実問題としてあるかどうか・・・。
bool型でさえ8ビット変数だというのに。
>>176 俺はそんなこと承知なんだが、
>142が範囲外の値の代入に対して型エラーが出ると言ってるんで、
>159と同じ疑問を抱いたんだが、自身たっぷりに返してる>165がどうにも気になったわけよ。
>>178 ねー、
>>165の2.についてなんだけど、これは俺も読んでて知ってるんだけど、
有名どころのコンパイラでエラーか警告になる例何かある?
>>179 無い。っていうか、変数を static_cast で enum に変換するケースを考えると、ほとんど無理。
「列挙型はコンパイル時文法チェックしか意味がない」に3000トルコ・リラ。
182 :
デフォルトの名無しさん:05/03/08 07:49:31
質問です。
ダブル値を 例えば15単位までをとる方法を教えてください。
例えば a=b/c のaに1.12345678901234 のように全部で15個の数字で
保存されるようにしたいです。
よろしくお願いいたします!
>>182 × ダブル値
○ double型の値
× 15単位
○ 15桁
double型の値は数字で保存されているわけではないので、多分無理。
表示結果が15桁になるだけでいいのなら printf で可能。
sprintf()で桁数制限して、atof()かsscanf()で再び実数化。
但し、誤差の取り扱いには注意。
typedef の適応範囲をファイル内だけにする場合ってどうすればいいですか?
>>186 typedefはファイル内でしか有効でない。(ブロック内に書けばブロック内だけが有効範囲になるけど)
共通のヘッダに書かなければいいだけ。
そのファイルはヘッダーで読み込まれる先での typedef とバッティングしたくないので
define でいう undef みたいなのはないですかね
>>187 レスありがとうございます
typedef を使わないで直接全部書けばいいのですか・・・
>>170 intとかの基本型の配列の時とやり方は同じ。
struct hoge {/* 〜 */};
void f(hoge ho[]);
int main()
{
hoge h[4];
f(h);
return 0;
}
191 :
デフォルトの名無しさん:05/03/08 11:31:46
char** p=new (char*)[10];
みたいなことできないんですか
できないなら他にnewする方法ありますか
char** p = new char*[10];
普通にできんか?
あ、括弧がついてるからできなかったんですね。
195 :
デフォルトの名無しさん:05/03/08 13:03:21
WINAPI関連の事で質問です。
ダイアログウィンドウにクラスや構造体のポインタを関連付けることはできますか?
通常ウィンドウは、RegisterClass()でクラス登録するときに
cbWndExtreにポインタサイズを設定し、SetWindowLongPtrで0を指定すれば関連付けられたのですが、
こういう事をダイアログでできるのでしょうか?
環境はVS.NET2003です。回答お願いします。
>>195 SetWindowLong()のGWL_USERDATAではダメなのか?と(ry
C++で二次元配列を操作して同じ大きさの二次元配列を返す関数を作りたいのです。
が、配列の大きさを引数で指定しても、関数の中での配列宣言時にエラーになりますよね?
エラーにならずに宣言する方法って無いんですか?
>>188 C++ なら、namespace に閉じ込めてはどうか。
freadでn文字読みこもうとして、nより小さない文字数しか読み込めなかったときEOFかエラーかどっちか知る方法ありますか?
なさそうですね....なんとかポインタでやりくりします。
205 :
デフォルトの名無しさん:05/03/09 00:54:18
イテレータについて質問です。
ポインタと同じような扱い、というのはわかりました。
単純に要素をみたい場合は*をつければ(*pみたいにして)いいとは思うのですが、もし要素がクラスとか構造体の場合はどうすればいいですか?
*p->〜みたいにするとコンパイルエラー出ました。
詳しい方、教えていただけると光栄です。
206 :
デフォルトの名無しさん:05/03/09 01:08:30
詳細はわからんが、*p.〜とすれば?
>>205 要素が構造体テンプレートの場合の例。
#include <algorithm>
#include <vector>
#include <iostream>
int main()
{
std::vector<std::pair<int, int> > foo;
foo.push_back(std::make_pair(0, 1));
foo.push_back(std::make_pair(1, 2));
for (std::vector<std::pair<int, int> >::iterator it = foo.begin(); it != foo.end(); ++it) {
std::cout << it->first << '\n';
}
return 0;
}
斯くの如く、普通にアロー演算子を使うだけ。
はじめまして。流れ無視の展開で質問すみません。
Java厨なんですが、C++はじめました。
Javaしか知らないのですが、Cから勉強すべきでしょうか。
それともC++からいきなり入ってよいものでしょうか。
ポインタのあたりが心配です。
当方スペックはJavaだとdeep copyとshallow copyがなんとなくわかる程度です。
Cから
>>208 C++からでヲケ。ポインタはいずれにせよ身につけないかんが。
C++が目標なら、Cをわざわざ勉強するのは回り道以外の何者でもない。
>>209-211 レスサンクスです。
独習C++で始めようと思ってるですが、
レス見た感じ、とりあえずC++からいっちゃっていいですかね。
んで、ポインタで煮詰まったらCをザックリやろうかな、と。
どうもでした〜。
213 :
205:05/03/09 08:18:04
回答ありがとうございます。
>>206 そのようなメンバはありません、といわれます。
>>207 明示的なアドレス解決演算子が必要と言われます。
プログラム的には以下のような感じです。
class Class1{
public:
void f1();
void f2();
private:
int a, b;
}
class Class2{
public:
int f3{
vector<CCar>::iterator p;
p->f1(); //この部分でエラーになります。
private:
vector<Class1> hoge;
}
214 :
205:05/03/09 08:19:19
すいません。イテレータを定義した後の1行に
p = hoge.bugin();
を追加してください。
ブギン!
>>213 int f3 はカッコが無いが、関数のつもりか?関数の中で private: ?
CCar ってなんだ?
エラーの出るソースをそのまま貼れ。馬鹿者。
エラーメッセージはコピペしろ。未熟者。
217 :
デフォルトの名無しさん:05/03/09 09:05:59
>>216 言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
>>212 おーい、「独習C++」はC経験者向けの本だぞ。
こんなのいきなり読んで分かるわけないだろ。
C未経験者なら「標準講座C++」か「はじめてのC++」あたり。
>>213 てめぇ、他人のソースに対する感想がそれかい。
藻前は>207を理解できたんかできとらんのかどっちやねん。
>>219 礼儀を知らない質問者も迷惑だが、
傲慢な回答者も同じくらい迷惑だ。
アホか
アホな質問者への態度など傲慢でもなんでもいいってことだろ
223 :
デフォルトの名無しさん:05/03/09 13:03:22
質問です。
リソースで作ったダイアログをDialogBox()で表示する際
プロシージャにデータを送るにはグローバル変数使うしかないでしょうか?
具体的に教えてくれませんか?
嫌です。
すみません。書くの忘れてました。。。環境はVC++.NETです。
え〜;リソース絡んでる時点でレス違いになってそうなので他で聞いてきます。
すみませんでした。
>>228 メッセージでもイベントでも好きなもの使えばいいんじゃね?
231 :
Aransk:05/03/09 14:17:59
「C++の進化と設計」立ち読みしました。
Javaの話が全然出て来ない?と不思議に
思ってたら、「1994年」の本を翻訳したもの。
我々日本のC++プログラマーは10年!以上
遅れているのか?10年前の情報が日本のC++界では
未だに役に立つのか?
ご回答ありがとうございます。
>>230 モーダルダイアログなのでその方法は無理そうでした。
説明足らずですみませんでした;
>>232 もっと他の方法で実装しようかと思ってましたけどこんな
便利な関数があったとは・・・。
ありがとうございました。
リストクラスにNodeクラスのポインタをぶらさげてます。
これにtreeを作るために
class HyperNode : public Node {
リストクラスのポインタ;
etc.
}
のポインタをぶらさげようとしています。現状で
すべてのNode,HyperNodeの成分をvoid print_all(&cout)と
virtual void Node::print_node(&cout),
virtual void HyperNode::print_node(&cout){
Node::print_node(&cout);
ホニャラ->List::print_all(&cout);
}
でtreeをたどって出力することはできますが、似たような作りの関数で
各々のNodeの成分をいじると、rootのnodeやらリストやらがなくなって
しまい、treeをロストしてしまいます。
クラスの設計がまずいのでしょうか、それとも個々の関数のコーディング
ミスでしょうか。よろしくお願いします。
俺語を使われて質問しても的確に回答できる人間はおるまいよ。
ああ、ごめんなさい。
リストクラスではNodeポインタで保持すると定義しているところに
よりサイズの大きいHyperNodeポインタをぶら下げるとトラブルの
もとになるでしょうか。と訂正します。よろしくお願いします。
ぶらさげるって何?m9(^Д^)プギャー
>>236 あんたの拙い日本語を読解する努力するくらいならソースを見たほうがましだと思うよ。
ソースを貼るには躊躇する長さだったので、概略を貼ります。
C++を使うのは初めてなので間違っている記述があればご指摘ください。
いちばんひっかっかっているのが、set_node()においてnew Nodeとして
領域を確保しているのに、HyperNodeをポインタをそこへ渡していることです。
class List {public:
Node *node_ptr;
void set_node(Node *nd) {(node_ptr=new Node)=nd;}};
class HyperNode : public Node {public: List *sublist;};
HyperNode *hnd_ptr; hnd_ptr=new HyperNode;
List::set_node(hnd_ptr);
>>239 あんたの日本語同様支離滅裂で意味不明だな。
とりあえずアドバイスとしてはC++を一から勉強しなおせと。
「コンピュータが理解できるコードなら誰でも書ける。
優れたプログラマは人間が理解できるコードを書く。」
とは Martin Fowler の言だが、愚かなプログラマは
人間が理解できる文章すら書けないものなのだな。
いや、
>>239はコンピュータも理解できないw
コンピュータが理解できる部分は破壊的に不味い事してるし。
( node_ptr = new Node ) = nd;
>>239 ポインタの理解が根本的に間違っているようなので、
C言語の教科書で勉強して下さい。
(node_ptr=new Node)=nd;
これって、どういうプログラム言語の影響なのかなあ?
ビットが立っていることを確認し、まだ立っていないビットの最短位置を取得する方法で
ビットシフトと整数インクリメントで求める方法より高い効率を出せる処理ってありますか?
探索方向は昇順でも降順でもアトランダムでも構いません。
>>244 まだ立っていないビットの最短位置、を説明してくれ。
>>245 char型で10111011とあるとすると3番目(4)と7番目(64)がまだフラグが立っていないということです。
3番目が立っているか?ならば(ch & 0x0004)でいいと思うのですが、
そうではなくて、このケースでいうと8ビットあるうちのどの位置でもいいから、高速に位置情報を取得したいのです。
この場合は1がon、0がoffとして表現されていますが、逆でも構いません。
>>246 8ビットで比較回数を必ず三回にする事は可能
if (ch & 0x0F) {
if (ch & 0x03) {
if (ch & 0x01) {
// bit = 0;
} else {
// bit = 1;
}
} else if (ch & 0x0C) {
if (ch & 0x04) {
// bit = 2;
} else {
// bit = 3;
}
}
} else {
・・・省略・・・
}
他は、アセンブラ命令でビットサーチ命令を使うとか・・・
VC++ X86
入力した数の、立っているビット位置を表示
(0〜31 立ってない時は表示しない)
int main () {
{
int n;
printf ("input number: ");
scanf ("%i", &n);
if (n) {
_asm {
bsr eax, n
mov n, eax
}
printf ("%d\n", n);
}
return 0;
}
あ、int main () { の { は抜いて・・・
>>251 そのリンク先、なんかものすごく異常なことになってないか?
>>251 これは間違い探し?
本気で書いてるとしたらスゲェなw
getメソッドで値を設定するのに感動した
すいません、どこがやばいんでしょうか?
>>247 64bitなら常に6回か。
ビット数が増えれば増えるほど威力を発揮しそうですね。
シーケンシャルにすれば利用状況が良くなるほど
探索回数が増大するからこっちのがお得ですね。
>>248 すごっ、比較すらしないのか。英語から勉強してみます。
>>250 ごめん、ほんとはJavaでやるつもりだったのでasmは使えません。
やっぱこういうのはCプログラマかなと思ってここで聞きました。
ありがとう大変参考になりました。>ALL
>>256 真面目に勉強するつもりなら悪いことは言わんから購読止めろ。
それを書いてる奴はC++をほとんど理解してない。
>>258 はい、分かりました。
すいませんが、どこかオススメのC++学習サイトはありませんか?
>>259 サイトで勉強するのは全くお勧めできない。
本買え。
>>218のどっちか本屋で立ち読みして選べ。
あんまり使えない気もするけど、
n & (-n)で、一番小さい立ってるビットのみの値が帰る。
たとえば、0x42 なら 0x2
でも、どこぞの馬鹿がこれで特許とってるって話を昔聞いたw
今見直したら、
} else if (ch & 0x0C) {
は
} else {
のみで良かった・・・;
>>261 64bitなら32要素のテーブル用意すれば早く解決できるかも。
bitNum[(n&-n)];でいいなら、シンプルでいいよね。
> 特許
マジで?そんなの無効だと思うけどw
>>261は中止。違うや、全然ちがう。
アホみたいに巨大なテーブルが必要じゃないか。
ちくしょう、
>>251 のリンク先が見てみたいが
会社からだと「"_" が含まれる間抜けな URL です」とかいって
見られねぇ…っ!
コンストラクタの呼び出しワラタ
こういう呼び出し方してよかったんだっけ?
>>269 何の問題もなく、一次オブジェクトが生成されてその直後に破棄されるだけ。
決して、内部のコンストラクタを呼び直しているわけではない。
>267のソースをコンパイルして実行すると、デストラクタが4回走っていることでその様子がよく判る。
つまり、>267の記事は阿呆の書いたことを信用するな、自分の目で確かめろという教訓となっている。
うわぁ、インライン関数の説明なんてもう、滅茶苦茶。
コピーコンストラクタはコンストラクタじゃないらしいし。
272 :
デフォルトの名無しさん:05/03/10 18:44:04
printf()のほうが、ずっと使えると思うんですけど、
なぜC++っていうと>>にこだわるのですか?
>>272 使いたきゃつかっても良いと思うけど。
printfは第一引数と後続の引数の整合性がコンパイル時に保障されないのが
いやだという意見はあると思う。
sprintfはほとんどセキュリティホールそのものだから。
(´-`)。oO(…snprintf…)
boost::format を使えばいいと思う。
ヘー、boostでも穴はあるけどw、昨日booost見たけど
たいしたこと無いジャン。はぁだな,
フールプルーフじゃないよ。
boostに対応しているベンダーってどこ?
gccだけ?VC++6.0にどうやって入れたらいいのかわかんない
6.0は捨てなさい。
なんで?
>>279 オフィシャルのGetting Startedを読んで理解できないようならプログラミングの前に英語の勉強をしなさい。
283 :
デフォルトの名無しさん:05/03/10 20:39:12
テキストファイルへの上書きモードでの書き込みで、
例えば元にhogeとある所に、fooと書き込むと、
foohogeとなってくれるやり方がありましたら教えてください。
fopen("", "r+");でのだと、fooeとなりうまく行きません。
すいません。環境はWindowsMe、コンパイラはVCかBCCです。
>283
無い
a
>>285 分かりました。ありがとうございました。
これはこれで、間違いを糾弾することで多くの知識が得られそうな、模範的な間違い事例ですね。
間違い探しが簡単過ぎて問題にならんわw
つか、サンプルコードの見せ方とか、確信犯っぽいよな。
購読人数が2600人もいて誰からもつっこまれないんだろうか?
みんな笑いながらヲチしてるに決まってるやン。
294 :
デフォルトの名無しさん:05/03/11 04:55:11
できませんでした
296 :
デフォルトの名無しさん:05/03/11 16:56:35
質問させてください。
ifstream in;
string buf;
in.open("hoge.txt");
while(!in.eof()){
getline(in, buf);
cout <<++Count <<endl;
}
このようなプログラムを実行すると、3行のhoge.txtを
開いているのにカウントが、"4"と出て一行空白を読んで
きているみたいなんですが。やりかた間違ってますか?
とりあえず、
if(buf[0] == '\0')break;
というやつをgetline()の直後に書いて空白をカウントしない
ようなやりかたやったりしてます。
297 :
296:05/03/11 16:57:31
一行読み込むのにgetline以外で良い関数、機能があったら
教えて下さい.
>>296 while( getline(in, buf) )
std::cout << ++Count << endl;
0L や 1L ってどういう意味ですか?
>>299 L で long 型である事を表す。
つまり、1L で long 型の定数 1 を示す。
0.0ならdoubleで0.0Fならfloat
0ならintで0Lならlong
なんで0.0がfloatで0.0Dがdoubleじゃないのか不思議だ
306 :
296:05/03/11 18:48:01
>>298 >>297 ありがとうございます!
空行読み込まずにいけました、わざわざeof見なくても
いいんですね。
>>304,
>>305 単精度浮動小数点数ってことは、数学的にはxでしょ。
倍精度浮動小数点数ってのは、数学的には2xでしょ。
なんで二名さまからが基準になるのか不思議でしょうがない。
数学なんかは全く関係ない。単精度とか倍精度なんて物は恣意的なもの。
単にintと同じビット数の実数をフォーマットを単精度と呼んでいるだけ。
309 :
デフォルトの名無しさん:05/03/11 19:04:22
すみません、おしえてください。
VC++6.0 WinXPSp2です。
htmlを拡張子にしたファイルを量産したくて、
以下のようなコードを書いてます。
この関数がたくさん呼ばれます。
問題は、
fout.fail() でひっかかるのですが、なぜでしょうか?
errlは0になります。。
filepathは256Byte未満です。
// global
ofstream fout;
//---- 中略
void xxxxxx( char *foldername, char *set )
{
char filepath[MAX_PATH*2];
memset( filepath, 0, MAX_PATH*2 );
sprintf( filepath, "%s%s.html", foldername, set );
MakeSureDirectoryPathExists( foldername );
fout.open( filepath );
if( fout.fail() ){
unsigned long errl = GetLastError();
return;
}
fout << xxxxxxxxxx; // 略
fout.close();
}
どうかよろしくお願いいたします。
>>308 だったらshort floatとfloatでいいのでは?
>>307 その理論で行くと、整数系の基準は char でないと不思議だな(w
>>309 > // global
> ofstream fout;
やい、やめろ!
>>311 Integer = 整数
Character = 文字
不思議ではないね
>309
判らんが
sprintf( filepath, "%s\\%s.html", foldername, set );
か?あと
// global
やめろ
315 :
309:05/03/11 20:34:39
309です。
なぜか、特定の文字列のファイル名がだめみたいです。。
[email protected] はokだけど、
[email protected] はだめ。
ちなみに、↑後者もエラーで返ってくるもののファイルは作成されているが、書き込みができない。
( fout << xxxが反映されていない)
sprintf,グローバル変数の使い方に問題ありますか?
代替案あればお願いいたします。
>>310 頑張って俺規格Cを作ってください。
型名はどうでもいいけど、
標準の浮動小数点型は、
標準の整数型以上の有効桁数を持つようにしてね。
>>316 そんなことせんでも俺デコーダを作ればいいじゃないか
ミミ ヽヽヽヽリリノノノノ
ミ ,,、,、,、,、,、,、,、、 彡
l i''" i彡
.| 」 -‐ '''ー |
,r-/ ∧ く∧ |
l ´゚ ,r "_,,>、 ゚' | プギャ━━━━m9(^Д^)━━━━!!!!
ー' ト‐=‐ァ' |
∧ | | l
/\ヽ ` `二´' /
/ ヽ. `ー--一' ノ/ヽ
/ r‐-‐-‐/⌒ヽ-─'' `、
ヽ、 |_,|_,|_,h( ̄.ノヽ
>>1 ヽ
ー-ヽノ| `~`".`´ ´"⌒⌒) ヽ
ノ^ //人 入_ノ´~ ̄ )
319 :
309:05/03/11 21:33:10
解決しますた。
ありがとう!
シュタッ!
int16とかint32とかint64、float16とかfloat32とかfloat64
これらの中でOSごとの得意精度がint,floatを襲名する
これが俺の理想
>>309 せめてこれくらいにしろ。
DWORD hoge(const char *foldername, const char *set)
{
std::string filepath;
filepath += foldername;
filepath += set;
filepath += ".html";
MakeSureDirectoryPathExists(foldername);
std::ofstream fout(filepath.c_str());
if (fout.fail()) {
return GetLastError();
}
fout << xxxxxxxxxx; // 略
return 0;
}
322 :
デフォルトの名無しさん:05/03/11 21:59:08
あげまんこ
323 :
デフォルトの名無しさん:05/03/11 21:59:30
あげたてすじ
324 :
デフォルトの名無しさん:05/03/11 21:59:53
まんこ
325 :
デフォルトの名無しさん:05/03/11 22:00:30
ちんこまんこ
326 :
デフォルトの名無しさん:05/03/11 22:07:02
205はエバに乗った状態でセクースしろ。
327 :
デフォルトの名無しさん:05/03/11 22:10:50
いやだ。
なにこの流れ
春休み
330 :
デフォルトの名無しさん:05/03/11 22:18:44
>>328 ※sageは禁止です。
> 1 :デフォルトの名無しさん :05/02/21 03:38:48
> エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
> ただしその場合、質問者は必ず、環境を書きましょう。
> ※sageは禁止です。
ミミ ヽヽヽヽリリノノノノ
ミ ,,、,、,、,、,、,、,、、 彡
l i''" i彡
.| 」 -‐ '''ー |
,r-/ ∧ く∧ |
l ´゚ ,r "_,,>、 ゚' | プギャ━━━━m9(^Д^)━━━━!!!!
ー' ト‐=‐ァ' |
∧ | | l
/\ヽ ` `二´' /
/ ヽ. `ー--一' ノ/ヽ
/ r‐-‐-‐/⌒ヽ-─'' `、
ヽ、 |_,|_,|_,h( ̄.ノヽ
>>1 ヽ
ー-ヽノ| `~`".`´ ´"⌒⌒) ヽ
ノ^ //人 入_ノ´~ ̄ )
STLスレのが乗り移ってきたのだろう。
ワロス
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/252.txt ちと上のプログラムを見てくださいませ。
erstyw42756857668o8o897098-p98@h
を入力したら
見つかりました。
rt756743t43f52q35s53feuiyuuyoiop
----------------------------------------------
と表示されるべきなのですが、
見つかりました。43f52q35s53feuiyuuyoiop
rt756743t43f52q35s53feuiyuuyoiop
----------------------------------------------
↑に書いたように
"見つかりました。"
の右側に変な文字列が表示されます。
原因は何なんでしょうか。
環境は
gcc version 3.3.3 (cygwin special)
winxp home(sp2)
です。
>>335 Windowsの場合、改行コードは\r\nの2文字。
strの末尾の\nだけを\0に変えも\r(復帰)が残る。
shoukai内のprintf("0000 = %s", str);
では、行の先頭に戻るだけで、改行されない。
その後、その行を
mainのprintf("見つかりました。\n");
で上書きしている。
なんでバイナリモードじゃないのにfgetsの中で\r\nは\nに置き換えられていないんだ?
shoukai関数の30-33行目を以下のようにすることで解決しました。
if(str[len-1] == 0x0a){
str[len-1] = '\0';
if(str[len-2] == 0x0d){
str[len-2] = '\0';
}
puts("ahoaho");
}
ttp://www9.plala.or.jp/sgwr-t/c/sec17.html こちらのページに0x0dと0x0aについての記述があり
0x0d 0x0aは
>>339氏の指摘どうり
0x0aに変換されると思っていたんですが
cygwinでは違うのでしょうか。
>>338氏ありがとうございました。
\rを消して無事に実行できました。
>>340 cygwinの改行コードはLFのみだから。
>>341 Cygwin gccでも、オープンモードを"rt"にすれば、
改行コードの変換をしてくれるようなので、
今後のことを考えるとそちらの方がいいかも。
UNIXとDOSで、テキストの定義が違うので、
気をつけないといけないね。
テキストモード ≠ CR/LF変換
long double について質問です
現在の long double のサイズが
VC6〜7.1=8byte
MinGW=12byte
と、定まっていないのですが、今後どちらに収束するのでしょうか?
(それとも収束しない?)
あと、VC等で 12 byteの変数を扱いたい場合
どういった方法があるのでしょうか?
ご教授お願いします
ちなみにかなり昔のVCや今のBCCのlong doubleは10byte
char[3]
誤爆です
こういうのも誤爆って言うのか
>>351 BCB6Update4(bcc32 5.6.4)でlong doubleが80bitなのを確認しますた。
おまけ
> 3.1.2.5 各型の浮動小数点数値の表現とセット
> Intel 8086 で使用される IEEE 浮動小数点フォーマットは,すべての C++Builder 浮動小数点型で使用されます。
> float 型は 32 ビット IEEE リアルフォーマットを使用します。
> double 型は 64 ビット IEEE リアルフォーマットを使用します。
> long double 型は 80 ビット IEEE 拡張リアルフォーマットを使用します。
大変申し訳ないのですが 10byte(=80bit) を求めているのではなく
12byte(=96bit) の方なんです…(´Д⊂ヽ
16bitCPUのころの名残で80bitが残されているけど
今後は80bitは使うべきではないと書かれています
それもこれも
>>345が要らない薀蓄入れたせいだ。・゚・(ノД`)・゚・。
struct bytes { unsigned char array[12]; };
基本コレで、sizeof(bytes)が12にならなかったら、
コンパイラ依存の機能(#pragmaとか__attribute__とか)を足せばできるだろう。
>>353 それだったら多倍長浮動小数を使う。C++ならそういうクラスを、Cなら
そういうデータ型&関数群を使うことになる。組み込みの機能でって
言うのは、CPUとの兼ね合いがあるから無理がある。
サーバのためにunion使うのは無謀?
あまりにも初歩的なミスを犯しているのでしょうが、いくらやりなおしてもダメなので誰か助けてください。
http://www.kumei.ne.jp/c_lang/bcc/bcc_05.htm でBCCを使ったメニュー付きウインドー表示プログラム
のコンパイルを試しているのですが、
brc32 menu01.rc Release\menu01.exe
を実行すると
Error menu01.rc 4 11: Cannot open file: windows.h
というエラーが発生します。
ソースファイルを何度も書きなおしたり、このページまでのレッスンを全て始めからやり直したりしましたが
やっぱりダメでした。。
環境はWin98SEにBCC5.5です。
>>358 それはBCCのreadmeにあった内容とほぼ同じだと思うんですが、
bcc32.cfg
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
ilink32.cfg
-L"c:\Borland\Bcc55\lib"
これ以外にも何か必要ということですか?
WinAPIでの質問です。
HWNDから取り出したBitmap bm_fと、ファイルのBitmap bmを比較したいのですが
その比較の方法が分かりません。
BOOL chkimg(bm_f, bm, x, y)と言った感じで
bm_fのx,y地点からbmが同一であるかを取得したいです。
HBITMAPでしたねBitmapは間違いです
>>359 リソースコンパイラのほうか‥‥bcc32と勘違いしてた。
-iスイッチでインクルードパス指定すればいけるはず。
callocでメモリ確保して
strcatで書き込んだテキストが
メモ帳などで保存したファイルと異なってしまうのですが
なぜなんでしょう?
異なってる点は、strcatで書き込んだ最後は 000000000
メモ帳などで上書きすると 202020202020202020となるんです
メモ帳などで保存したと同じようにするにはどうすれば良いのでしょうか?
>>362 ありがとうございます。
でも、それは
ilink32.cfg
-L"c:\Borland\Bcc55\lib"
-I"c:\Borland\Bcc55\include"
としろという意味ですか? それともコンパイルするときに
-ic:\Borland\Bcc55\include
などとやればいいのですか?
試行錯誤すればいいのでしょううが、下手なことをしてパソコンを壊すと大変なので・・
何度もすみません。
>>363 >>1にWinAPIもOKと書いてありますが?
マルチになりますが、そちらにも書かせていただきます。
>>364 まさかとは思うが、 strcat でメモリに書き込んで、そのメモリをファイルに保存してるんだよな?
>>367 そうとうりです
どうしてもおかしくなってしまうので
文字列を合わそうとしましたが、それもうまく行きません
A.txt B.txt を読み込んで
A と Bの間にstrcatで書き込んでるんです
それをC.txtに出力してます
追加する文字数は分かるので
ファイル内の文字数は、wSize = (size_t )filelength(fileno(fp));では
ダメなのでしょうか?
>>368 brc32 -ic:\borland\bcc55\Include menu01.rc Release\menu01.exe
とやるくらいしか思いつきません…
諦める前にもう少し検索してみます。
どうもでした。
>>370 そもそも windows.h は必ずしもインクルードしなくてもいいぞ。
windows.h を外してリソースのコンパイルが通るならばそれでOK。
A.txtをfread()した後
strlen()で文字数を取得したら解決しました
>>372 >fread()した後strlen()で
根本的に理解していない悪寒。
>>372 かなりヤバくない?
fread()はそのままでは取得バッファの最後にヌルが付加されないので、
ヌル終端文字列として扱いたいなら、最低限、戻り値の位置に自分でヌルをセットする必要がある。
それでも実際には不完全だがセキュリティ上の問題は回避できる。
>>369 「文字列を合わす」「うまく行かない」「AとBの間」「間にstrcatで書き込み」「それ」
「追加する文字数」「ので」「ファイル内の文字数」
以上、さっぱりわからん。
書き込む前に、自分以外にも伝わる文章かどうか読み直せ。
>>375 お前には聞いてないからレスしなくていいよ
いや、俺も何言ってるのかさっぱり分からん。
本人に日本語で説明させるより、
ソース晒させた方がはっきりするんだがね。
copy a.txt + b.txt c.txt
で十分
人に対して上手く説明出来ないのにCPUに対して上手く説明出来る訳ないだろ
>>379 綺麗なコードが書けるお前に彼女がいないのは何故だ
>>379 的を射た表現だな。my語録として貰いますよ。
CPUに説明だって(プッ
CPUに説明すんのはコンパイラで十分だろ
それともアセンブラ信者ですかw?
>>382 墓穴を掘るタイプ
人に対して上手く説明出来ないのにコンパイラに対して上手く説明出来る訳ないだろ
墓穴の意味わかってる?
藻前ら、もっとマターリ汁
386 :
デフォルトの名無しさん:05/03/14 08:23:20
Cの隔離スレみたいだ
ここで質問する人間のレベルだと、本人の説明と実際のソースコードが
食い違うなんてザラ。そもそもまともなコードが書けてないことも多々ある。
「うまく行きません」って質問は、まずソースを晒させる。これが鉄則。
ここのスレタイに入ってる「初心者」ってのはプログラミング初心者のことなんだよ。
日本語の初心者は帰ってくれ。
むしろコミュニケーションの初心者が多いよ。
回答者の中にもね。
enum Hoge { HOGE_1 };
void WINAPI foo(Hoge);
というのがあった場合、Hogeのサイズは言語的にどう決まるのでしょうか?
というのは、fooはDLLからエクスポートする関数なのですが
EXE側の製作環境によってHogeのサイズが変わると困るのです。
また、列挙子が増えた場合にサイズが変わっても困ります。
DirectXでは
***_FORCE_DWORD = 0x7fffffff
という使わない列挙子を作って強制的に4byteにしてるようですが
これで4byteになるという保障は言語的にあるのでしょうか?
言い忘れましたが、Win32環境での話です。
boost::program_optionsて殆ど使われていないのですか?
>>390 C++Builderだとコンパイルオプションで「enumをint型として扱う」ってのがあるんだがな
他のコンパイラだとどうだろう
395 :
379:05/03/14 22:32:49
>>390 Windows上のコンパイラは関数呼び出しのとき、みんな4バイト単位で引数を渡している。
つまりchar(1Byte)もshort(2Byte)もint型(4Byte)の引数と全く同じように渡される。
だからあまり気にする必要もないと思う。
397 :
デフォルトの名無しさん:05/03/14 23:10:24
extern void WINAPI foo(DWORD Hoge);
>>394 質問者の質ってか、質問者が最初から必要な情報を提示してるかどうかだな。
情報を小出しにされると話がグダグダするし頓珍漢な回答者も出てくるし
煽りも入るしで良いこと無い。
>>390 enumを宣言した時点で無条件にsizeof(Hoge)==sizeof(int)ということはないみたい。
ISO/IEC 14882:1998 7.2 Enumeration declarations
-5
The underlying type of an enumeration is an integral type that can represent all
the enumerator values defined in the enumeration. It is implementation-defined which
integral type is used as the underlying type for an enumeration except that the
underlying type shall not be larger than int unless the value of an enumerator cannot
fit in an int or unsigned int. If the enumerator-list is empty, the underlying type
is as if the enumeration had a single enumerator with value 0. The value of sizeof()
applied to an enumeration type, an object of enumeration type, or an enumerator, is
the value of sizeof() applied to the underlying type.
-6
For an enumeration where emin is the smallest enumerator and emax is the largest, the
values of the enumeration are the values of the underlying type in the range bmin to
bmax, where bmin and bmax are, respectively, the smallest and largest values of the
smallest bitfield that can store emin and emax. It is possible to define an
enumeration that has values not defined by any of its enumerators.
だらだら引用してんじゃないよボケ
飲尿も即刻やめるべき。
女王様でふか?
>>400 まあ、まとめる能力のない人間だからしょうがないでしょ
許してあげて
グローバル変数でもローカル変数でもどっちでも良い場合
なるべくローカル変数で宣言した方がいいんですが?
ケースバイケースだ
当然。
わざわざグローバルなんて使うのはアホな2chネラくらいなものだ。
すいません
質問
http://www.asahi-net.or.jp/~yf8k-kbys/newcpp6.html の一番最後
>のように書くと、コンパイラが警告を出すかもしれません。たとえば、Borland C++ 5.6では、コンストラクタに関して
>「値でクラスを渡す引数を持つ関数はインライン展開されない」
>という警告が出ます。クラス定義内のコンストラクタの定義が
> Neko(string s){
> name = s;
> }
>でも同じです。これは、「このコンストラクタはインラインにできない」という意味です。
これは、どういう意味なのでしょうか?
どうして警告がでるのかわかりません。
質問です。
class A {
public:
static int a;
}
と書くのと、
class A {
static int a;
public:
int GetA(){ return a; }
}
と書くのは、なるべく下の方法で書いた方がいいんでしょうか?
あ、int GetA(){ return a; } → static int GetA(){ return a; } です
>>410 そりゃそうだ
あと GetA は inline にしちゃいかん
>>405 一般的なプログラマが把握できる規模というのは限られており、グローバル変数を使ったほうが良い、
という状況に出会うのはとても難しいのです。
グローバル変数を使うと、プログラムのどこで参照したり書き換えたりしているか(プログラマが忘れて
しまって)把握できなくなり、バグを探すのにプログラム全体を見直さなければならなくなるからです。
また、貧乏性の人が同じグローバル変数を複数の箇所で別の用途に用いた場合にも、上記の理由で
問題が発生することがあります。
プログラムは極力「狭い視野」で見ても大丈夫なように作るべきなのです。
>>411 なぜinlineにしてはいけないのですか?
>>411 どうしてinlineにしちゃいけないんですか?
>>411 レスありがとうございます。
inlineはだめの理由は、classAの宣言の外で、int a; と書く必要が出てくるからですか?
メソッド名に大文字を使うと背筋がぞくぞくして気持ち悪くなるのは私だけですか?
え?あなた全部小文字なんですか?
そっちのほうがゾクゾクしますけど。
唯一、あなた、あります。
私名前ジョンソン言います
>>413-415 前にもこの話題があったけど、面倒くさいんで
C++ FAQ でも読んでくれ
aimedatportrayingearthandspacesciencesinafunway.
質問です。
Linux で Cを作っているのですが、よきデバッガありませんか?
gdb使おうかと思ったのですが、man 見てもさっぱりです…
よきデバッガもしくは gdb の基本的な使い方を教えてください。
ちなみにTeraTermで繋がっているので、コマンドライン上で叩けるやつがいいです。
漏れは時代遅れなのかな…
>>423 man 見てダメ google なり yahoo なりで検索すればいいだろ
Cを作ってるって処理系つくってんのか。すげーな
TeraTermってふるいよな。
コンソール処理なんて簡単なんだから、
そろそろXP時代のUIにあったコンソールアプリが出来てもおかしくないんだが。
俺が作ろうかな?
>>426 是非頑張ってくれ。
まあ普通にコピペとかできるし、必要な機能揃ってるからじゃないのかね>TeraTerm後継が出てこない
>>425 それは別にすごくないが、Cでプログラミングしているだけだと思われ。
処理系作るぐらい大学の授業でやる程度のことだよ。
「処理系を作る」のは大したことはないが、
「C/C++ の処理系を作る」のは大したことだと思う。
次のMS-VisualStudioを作ってるといわれたら驚くけどね。
>>424 はぁ?
探したけど見つからないからここに来たんだYO!
だめもとでググったらあっさり出てきた。
前はどんなキーワードで探したんだ、俺…
∧||∧
( ⌒ ヽ ごめん、ありがとう。これで許して…
∪ c ノ
∪∪
>>431 そんな香具師がこのスレで質問していることの方が驚きだYO
classってグローバル変数使いたいがために作られた概念だろ
オブジェクト指向は建前で。
ハァ?俺は天才だっての。
あっ、マジで低脳だw
438 :
デフォルトの名無しさん:05/03/15 20:11:08
グローバルなclassがいっぱいできて結局しっちゃかめっちゃか
JavaやRubyを見習って欲しい
JavaはどうでもいからRubyを見習って欲しい
↓Ruby!!!!!!!!!!!!!!!
Rubyが最強
この訴えは毎日続けていくつもりです
JITコンパイラが未だ0.1なのに?
>>441 Rubyは既にNGワードに入ってますから!残念!!
Ruby は、まずあの小汚い syntax から変えるべきだな。
ALGOL 調の syntax なんて、ダサくて可読性が悪すぎる。
ひっそりOCamlと言ってみる…
OCamlのネイティブはC++より速いし、ソースは簡潔。
C++で5000行だったソースが1500行で書けた。
作った関数全てにinlineをつけたら速くなると思うのですが、何か悪いこととか起こったりしないでしょうか?
Rubyを見習って欲しい
>>447 Effective C++ だったか、More Effective C++ だったか、
C++ Faq だったか、Efficient C++ だったか、Exceptional C++
にのどれかに詳しく書かれてたんで書店で見て見るべし。
簡潔に言うとすこぶる良くないことになってると思われ
なんかここ1週間くらい?このスレおかしな事になってるね
春だもの・・・どこのスレも同じだよ
Rubyを見習って欲しい
>>438 クラスは大概グローバルですね。
インスタンスがグローバルだとちょっとアレですが。
おまえのかーちゃんの作ったのプログラムバグだらけー
char* const foo();
てな感じでconstを付けた場合の動作を教えていただけませんか。
何故かconst char* foo();の場合と似たような動きになってる気がするんですが。
char const * a;
char * const a;
const char a:
>>458 ?
自分も最初は普通の変数の場合と同じかと思ったんですが
どうも違うような気がするのですが。。
const char* foo(); の場合は普通の変数と同じなのですが、
char* const foo() ;の場合に
char *bar = foo(); とconst無し変数に代入すると、
このbarはconst char* bar;のような変数と同様の動きをしているような。。
>>459 「ような気がする」でこっちに何か伝わってくるとでも思ってるのか?
期待した結果と実際の結果を書いてもらわなきゃわからん。
>>458 の違いがわかれば、プロのプログラマだな
変数の場合:
const char* hoge1;
char const *hoge2;
char* const hoge3;
hoge1とhoge2は同じ。constなcharへの非constポインタ。
hoge3は非constなcharへのconstなポインタ。
関数の場合:
const char* foo1();
char const *foo2();
char* const foo3();
foo1, foo2はともにconstなcharへのポインタを返す。
foo3はconst修飾が意味をなさない。返すのは非constなcharへのポインタ。
>>462 > foo3はconst修飾が意味をなさない。
そんな事は無い。
っていうか変数の型でも関数の戻り値型でも const の効果は同じ。
>>463 んじゃ、foo3のconstは何を修飾してるの?
>>463 ・・、あー違うでしょ、それ。
char* const 変数戻り値を char*変数に代入した時点で、
const の存在意義が消滅してるのは事実。
コンパイルエラーではない。
もし、const属性を維持したいのなら、
char* const ret = foo3();
として戻り値を受ける変数にconst属性を与える必要がある。
const int Hoge();
という関数に意味があるかってのと同じことだな。
一時変数に過ぎない戻り値をconstにするのは無意味っちゃあ無意味。
多次元forループでのことなんですが、C言語ってcontinue ラベル;が使えないのですか?
現在はcontinueしたいforステートメントの最後にnext: NULL;として、
goto next;で飛ばすという変な形になっています。
IDEはVC++6.0です。
>>464-465 ↓のソースは char*& を foo3() の戻り値で初期化しようとしてエラーになる。
char* foo3() { return 0; }
template<typename T> T& ref(T& r) { return r; }
int main()
{
ref(foo3());
return 0;
}
このソースで char* foo3() を char* const foo3() にすると、エラーは出なくなる。
この const は確かに foo3() の戻り値を修辞しているのであって、「意味をなさない」とは言い切れない。
char* とかの組み込み型だと、違いの現れる状況が想定しにくいけど、
これが std::string だったりすると foo3().append("xxx") が通るか通らないかの違いにもなる。
私って
if( エラー発生)
{
//エラー処理
・・・
goto END;
}
・・・
for(i=0;i<n;i++)
{
if( エラー発生)
{
//エラー処理
・・・
goto END;
}
}
・・・
END:
//共通終了処理
・・・
return;
とか良くやるんですけど、これってDQNなのですか?
私としては単純でわかりやすいと思っていたのですが。。。
>>470 つまり、goto文の使用法のことです。
それ以前に、使用是非ってこともあるんですけど。。。
>>470 C++なら例外を使おう。でなければこれではだめかい?
void ending(){/*共通終了処理...*/}
void error(){
/*エラー処理...*/
return ending();
}
void func(){
if(/*エラー発生*/) return error();
// ...
for(i=0;i<n;i++)
if(/*エラー発生*/) return error();
// ...
return ending();
}
>>470 ふたつの「エラー処理」に共通部分があるのなら、DQNと言われてもしょうがない。
ここで goto 使うメリットは共通エラー(終了)処理をまとめられることだから、
やるんなら徹底的にやらないと、 goto 自体を嫌う人に対して説得力が無い。
もし C++ 使ってるんなら、デストラクタ使って RAII に従えばこんな心配も無い。
デストラクタは万能じゃ無いがな
>>472 実際には、ローカル変数があるからな。
関数分けして、いちいちローカル変数渡すより、
goto使った方がシンプルだ。
>>449 質問者と別者だけど、その解教えてほすぃ
せめて、どの本に書かれてあったか絞ってちょーらい(ノд`)
C言語にはcontinue ラベルはあるの?ないの?
int i,x,y;
for (i=0; i<max; i++) {
for (x=0: x<width; x++) {
for (y=0: y<height; y++) {
if (list[i][x][y]!=hoge) goto next;
}
}
next:;
}
こういうのが設計が汚いとは思わんけど
>>479 汚いと思う。
多重ループにおける goto の使用は、とっくに議論され尽くしてる。
そういうのは最高に頭の悪い発言をするスレとかでやってくれ。
gotoアレルギーな奴にとってどんなのが綺麗なんだ?
原理主義かw
>>480 古典だけどくぬーすの本読んだことある?
ラベル付きステートメントが使えるのはJavaとかJavaScriptとかか
こういう人って例外とか嫌いなんだろうな・・・
Javaがgotoを廃した変わりに
loop1: for(..
というのをcontinueやbreakで使えるのは
>>479が汚くないという証拠だろ
>>473 ふたつの「エラー処理」に共通部分があっても、
共通終了処理の手前でやる必要があれば別にいい。
冗長になるなら、それ様の関数一個作って一行で済ませばいいんだし。
極端にコーディング効率を気にしすぎると、
ソースいじってるだけで時間が過ぎてっちゃうよ。
>>488 「Java にあるから汚なくない」んだ?ふーん(´σД`)
大工ストラの弊害
492 :
デフォルトの名無しさん:05/03/16 15:36:13
例外使うと、カッコや行数が増えてあまり好きじゃない。
494 :
デフォルトの名無しさん:05/03/16 15:37:14
要はスパゲッティミートソースにならなければいいんでしょ?
gotoも捨てたもんじゃないよ。
アレルギストの惨敗だなw
497 :
デフォルトの名無しさん:05/03/16 15:39:31
gotoで飛べるのはローカルスコープ内だけでしょ?
他の関数に飛んでったりしないんだから、
使い方私大では例外よりシンプルにわかりやすくできる。
とても限った使い方に限定すればだけどね。
try catchがない頃はエラーコード設定してgoto使いまくりだったよ
gotoも例外も、結局書き方が違うだけで、
同じこと実現する意味では同じなんだよな。
実はアセンブラコードレベルでは似通ってたりして?
矛盾してんだよなぁ。
スパゲッティコードだからgotoが必要だと主張するかと思えば、
スパゲッティコードはよくないから直すと今度はgotoの存在価値も低下する。
goto文とスパゲッティコードがセットになってることが多いので、
憎悪の対象がgoto文になってしまうことが多いけど、
実際には悪いのはスパゲッティコードであって、決してgotoではない。
不当に犯人扱いされるgoto文。
しかし、goto文は、犯人を擁護・育成するかような立場にある。
503 :
デフォルトの名無しさん:05/03/16 15:43:19
なんだ。gotoって使ってる人、意外と多いのね。
安心した。これからもどんどん使おうっと。
exception Hage;;
try
raise Hage
with
Hage -> print_string "sine";;
>>500 チト違う、例外はcatchされるまでどこまでも飛んでいく
OCamlは例外が使いやすい。関数型言語なのでgotoは意味をなさない。
catch1:
goto finally;
catch2:
finally:
今とあまり変わらない?
あまり冗長な関数をかかないのであれば、gotoも見通しが良くてイイ!!
goto使ってキタネーとか感じるのは、
そもそもコーディングからやり直しなさいってことでしょ?
もっときちんとわかりやすく簡潔にモジュール分割しなさいと。
goto論議はいつの時代も花形だねぇ〜。
例外処理と goto 同じ扱いにすんなよ…。まぁ初心者スレだしな。
>>501 矛盾してないよ。
スパゲティコードであるということと、goto を使ってるということは別問題。
みなさん、代入型言語を使うとバグが増えます。特にgotoは追跡が難しくなりがちです。関数型言語を使いましょう。
>>508 「goto を使わなければいけない」という時点で、すでに冗長な関数。
「goto を使っても尚汚ない」なんてのは論外。
C言語に例外なんてないだろ?
514 :
デフォルトの名無しさん:05/03/16 15:48:51
goto分は必ず下に飛ぶ、って決めるだけでもぜんぜん違うよ。
C#はswitchのフォールスルーを禁止したくせにbreakしないと切れる。
そしてcaseラベルにgotoできる。 わけわからん。
例外処理に比べてgoto分は理解するのに10分の一の時間で済むw
>>514 そういうルールを設けないといけない時点で、何か間違ってると思わない?
goto絶対否定派の人っているの?
そういう人の意見って聞きたいな。
520 :
デフォルトの名無しさん:05/03/16 15:53:21
>>518 という人がコーディングルールには人一倍うるさいんだよね。
GOTO 5
DO 10 I=1,10
5 HOGE = HOGE * I
・・・
10 CONTINUE
見たいな事は良くない
お前らgotoは使わない、でいいじゃないか。初心者同士で下等でくだらん議論なんかしてんなよ。
お前らよりもはるかに賢い人達が考えたことに従っていればいいんだ。
524 :
デフォルトの名無しさん:05/03/16 15:54:56
>>518 ルールなんだから間違ってないでしょ。
あなたは、何のルールも持たないでプログラム組んでます?
作る人の中できちんと守るからこそルールって言うんです。
gotoのスパゲティを回避するために
例外とかラベル付きステートメントがあるんだろ
それらが無い言語仕様で同様の処理するなってアホだろ
526 :
デフォルトの名無しさん:05/03/16 15:56:20
まあ、簡単なルール守れば、それによるご利益が大きければ、
ルールもいいんじゃない?
デメリットばかり叩いてちゃ、この世に使える言語なんてひとつも無い。
意外とgoto使ってる人多いんだね。
俺、未だに使ったことないけど。
アレルギストの求める説得力をアレルギストが持ってないんだから話にならない
529 :
デフォルトの名無しさん:05/03/16 15:57:20
例外使っても、いくらでも汚いプログラムはかけますから。
要は書く人の問題。
>>529 少なくともgotoの嵐よりはましになる傾向がある。
531 :
デフォルトの名無しさん:05/03/16 15:58:29
>>525 だからgoto使えば必ずスパゲッティにならないんだって。
そう思うのは、あなたの技量がその程度だからそう感じるだけ。
>>533 お前も本質とはまったく関係の無いつまらんレス付けるな。
535 :
デフォルトの名無しさん:05/03/16 16:01:12
>>530 それも人による、スキルによる。
力ない人はすぐに言語のせいにする。
>>534 日本語理解しろって。
例外やラベル付きステートメントは
用途が特定されたgotoの置き換えだろ。
スパゲッチにならなければgotoを使ってもよい
>>535 経験的な傾向だよ。それに言語機能が成果に影響するのは自明だろう。
例外支持の人、もっと説得力のあるレスを!!
>>539 例外不思議な奴はいないだろ
例外処理できない言語で等価の処理をするなって奴がいるだけ
例外不思議ってなんだ。例外不支持だ・・・orz
goto支持も説得力にかけると思うが。
そもそも初心者同士で不毛で下等な議論は無意味。
おとなしくgoto使わないようにしとけ。偉い人はそういうだろ。
goto使って簡潔に書ければ、これほどいいものは無いのに、
なぜにそんなに例外に固執する?
別に例外が悪いと言ってるわけではないのだが、
こういう議論になると、ごく一部の例外支持派が、
徹底してgotoを叩くのはなぜ?
>>539 俺はむしろgoto支持の人にもっと説得力のある例を示してほしい。
毎回この手のframeになる度に聞くんだけど、
「あぁ、こりゃGOTO使った方がイイですね」って例を見た事がない。
もちろん、try-catchのないC言語でもね。
>>543 今のフジテレビみたいだ。
若い者は黙ってろ、みたいなw
だから一人のアレルギストに釣られるなってw
例外処理はコストが大きいので速度が大事な場合はgotoだな。
ユーザーインターフェースなら例外だな
俺は完結に書ければ、gotoを使っても良いと思ってるが、
gotoを使った完結なコードというものを見た事がない。
>>546 gotoで十分ならgotoを使う。
無理に例外使わないってだけ。
>>550 そりゃあんたが欠けないだけでIWUH('X$YJ'$#S)I"$#&J()#
>>544 gotoは自由にいろいろな処理に飛ぶことができるが、半面、追跡が難しくなる。
例を挙げるが、googleなどで希望のWEBページを検索するとき、一般的な一つの単語だけで検索にかけると
数万ページという膨大なページがヒットしてしまい、そこから希望のページを探すのは極めて困難になる。
そこで、我々は複数の単語などを検索にかけることで前以上の制約を与え、絞りこむことをする。
時には制約を与えて自由を奪うことも大切なんだよ。
>>551 俺は別に例外に拘ってるわけじゃないんだけど、
別関数にしたり、データ構造を練れば(というか、まともに作ってれば)gotoを使う必要がないと思う。
無理にgotoを使わないってだけ。使う必要性が感じられない。
556 :
デフォルトの名無しさん:05/03/16 16:11:21
>>553 飛ばなきゃイイだけの話。
無理やり悪いところだけ拾い出して叩くのはどうかな。
それにgotoで飛ぶ場所ってどこでもいけると思ってる時点でダメダメさんです。
関数は一画面内に納まるくらいで書くようにしたほうがいいですよ。
用法用量を正しくお使いください。
正しく使えないガッコのセンセあたりは原理主義的に否定しまくります。
SEやゲームプログラマはそんなこというとハァ?と言ってくれます。
>>558 小遣い稼ぎのにおいがするからいかない。
>>557 > ゲームプログラマ
m9(^Д^)プギャー
ごるぁ、CPUからjamp命令なくせよ。とか言いそう
562 :
デフォルトの名無しさん:05/03/16 16:14:11
ここでgoto使うとスパゲッティ?になるって主張している人は、
一関数に何行使ってるんだ?と聞いてみたい。
例えば40〜50行程度の関数にgoto分を使ってスパゲッティにするのって、
意図して書くほうがずっと疲れると思うのだが。
>>560 そいつら以上にコード突き詰めるサラリーマンプログラマがいたら教えて欲しい
564 :
デフォルトの名無しさん:05/03/16 16:16:23
みんな構造化プログラミングに染まりすぎ、こだわりすぎ、とらわれすぎ。
それなりのプロなんだから、goto使っても
わかりやすくかける人たちばかりでしょ?ここの中の人は。
>>562 関数は基本的に2〜3行。
OCamlのような関数型言語なら本質的にgotoを必要としない。
しかも代入文や副作用が少ないのでC/C++と比べて、コンパイルに成功すれば極めてバグが少ないプログラムになる。
ちなみに関数型言語なら関数をかなり細かく分割しても最適化されて、関数のオーバヘッドはほとんどない。
>>562 多分例外支持の人はスパゲッティがかけるんでしょう。
それを自慢したら先輩や上司に大目玉食らって、
それ以来、goto大嫌い人間になったのかと。。。
>>563 コードを突き詰めるのと読みやすいコードを書くのは違うスキル.
>>564 gotoを使っても書ける局面とgotoを使うべき局面は違う.
俺が知りたいのはgotoを使うべき局面. そんな局面, あったら教えて欲しい.
>>564 プロだって?
どうせ業務アプリ作成しているような素人だろ。
571 :
デフォルトの名無しさん:05/03/16 16:20:22
>関数は基本的に2〜3行。
???関数名とreturn文で終わり???
>>571 がんばれば一行でかけるけど、汚いので。
>>570 提示された例はgotoの必然性を語るには説得力にかけるよ.
>>563くどいねー。gotoで済むならgotoでいい。ただそれだけ。
関数型言語って使ったことないが
xyzzyってLispスクリプトだっけかが使えるよな
578 :
デフォルトの名無しさん:05/03/16 16:22:49
>がんばれば一行でかけるけど、汚いので。
ワラタ
コンパイラが悲鳴あげそうだw
>>575 お前の理解力不足を説得力不足に置き換えるなって
>>576 逆。gotoを使わないで済むなら使わない。
>>578 お前らだってmainに再帰かけてどこまで出来るかで遊んだだろ?
582 :
デフォルトの名無しさん:05/03/16 16:23:57
>>575 簡単に処理できるのにそんなに必然性が重要とは思えん。
>>574 ここのスレ住人に関数型言語布教するのはムダ
584 :
デフォルトの名無しさん:05/03/16 16:25:01
必然性に悩み仕事がぜんぜん前にすすみません。。。
586 :
デフォルトの名無しさん:05/03/16 16:25:39
所詮、バイナリーコードに落ちるんだから、
どっちだっていいだろ。
>>579 お前の説明力不足を理解力不足に置き換えるなって.
>>582 そもそもgotoを使って処理する必要がないのに, gotoが必要だとは思えん.
>>586 m9(^Д^)プギャー
そうだ、食えば一緒理論。
589 :
デフォルトの名無しさん:05/03/16 16:27:17
別にgoto使って悪いってわけで無いのに、
一部gotoを食わず嫌いな人がいるみたい。
使ったら楽チンだよ。使ってみなよ。
>>587 例外やラベル付きステートメントの無いC言語ではどのように書けばよいのですか?
教えてください。
591 :
デフォルトの名無しさん:05/03/16 16:28:21
>>587 gotoを例外に置き換えても、そのまま成り立つねw
>>590 だからgoto使ったコード持ってきてみろよ。goto使う必要がないコードばっかりだから。
>>583 ほんのちょっぴり興味もった。
xyzzy使う機会があったら勉強してみる。
594 :
デフォルトの名無しさん:05/03/16 16:29:26
>>581 スタックサイズのパラメータを1Gバイトぐらいにしないとなw
596 :
デフォルトの名無しさん:05/03/16 16:30:21
>>592 gotoを例外に置き換えても、そのまま成り立つねw
forループが3重くらいになったらgotoで脱出したいけど
598 :
デフォルトの名無しさん:05/03/16 16:32:01
>>592 gotoを例外に置き換えられるから、ってだけじゃ、
それこそ説得力無いと思うが。
600 :
デフォルトの名無しさん:05/03/16 16:32:39
601 :
デフォルトの名無しさん:05/03/16 16:33:57
無理にgoto使うことも無いよね。
無理に例外使うことも無いよね。
両方とも同レベル。
>>598 どこに飛ぶか知るのにルーチン全体を見直さないといけない。
これって面倒だよね?(エディタの検索で一発か…)
goto => 例外って言ってる goto 信者は馬鹿?
604 :
デフォルトの名無しさん:05/03/16 16:35:09
608 :
デフォルトの名無しさん:05/03/16 16:36:36
>>602 あなたも一関数を何百行にも渡って書いちゃう人ですね。
一関数で何度もスクロールしないと見渡せない関数は
書かないほうがいいですよ。
609 :
デフォルトの名無しさん:05/03/16 16:38:31
結局、例外支持してる人って、main関数だけでプログラム組んでる、
って構図が鮮明になってきたわけで。
これじゃあgoto使うの、俺だってやだよw
goto文が一つだけ含まれるだけなら簡単だけど、2つ以上になって複雑になると行数が少なくてもだめ。
611 :
デフォルトの名無しさん:05/03/16 16:39:37
>>610 まさかループ制御もgoto使ってると信じてるの?
613 :
デフォルトの名無しさん:05/03/16 16:41:37
goto叩いてる人って、最悪の場合しか考えてないんだよね。
でも、gotoを実際に使ってる人は、実に上手に使ってる。
別に必然性とかそんな隔たった話じゃなくてね。
例外使ったっていいけど、それがgotoはダメという理由にはなりえないよ。
>>613 大学を出たてでプログラムがまともに組めない新入社員がどんなプログラムを書くか。
goto禁止にしないととんでもないことになるぞ
615 :
デフォルトの名無しさん:05/03/16 16:43:20
>>612 少なくてもCのgoto使って必ずスパゲッティになるって言ってる人は、
それに近いよ。どうなったらスパゲッティになるのか不思議で仕方がない。
ここ見てわかったこと、
gotoを否定しない派−−−例外もバランス良く使っている
gotoを否定する派 −−−無駄に例外使ってわかりにくくしてる
>>479 って
for (int i = 0 ; i < max ; ++i) {
if (! contains_hoge_only(list[i])) {
continue;
}
// ...
}
でイイんじゃないの?俺ならそうする。goto 使う必要性が感じられないが。
618 :
デフォルトの名無しさん:05/03/16 16:45:04
>>614 孫なのは論外だろ。あ、ここ初心者スレかw
でも、gotoを有効に使う方法は、教えるのに10分もあれば十分。
大卒ぐらいならそのくらいの頭は持ってるでしょ?
>>617 そりゃgoto使わないようにコーディングしましたっていう練習問題じゃんw
必然性など微塵も感じんぞ。
例外が複雑ってどんな目玉ですか?改造手術必要ですか?
はっきりいいましょう。例外は簡単です。
>>617 あなたの言う必然性って、自分のコーディングスタイルに
合っているか否かだけの基準のような気がするね。
別にそれはそれでいいけどさ、goto否定の理由にはなりえんな。
#include <stdio.h>
#include <malloc.h>
main(togo,toog)
int togo;
char *toog[];
{char *ogto, tgoo[80];FILE *ogot; int oogt=0, ootg, otog=79,
ottg=1;if ( togo== ottg) goto gogo; goto goog; ggot:
if ( fgets( tgoo, otog, ogot)) goto gtgo; goto gott;
gtot: exit(); ogtg: ++oogt; goto ogoo; togg: if ( ootg > 0)
goto oggt; goto ggot; ogog: if ( !ogot) goto gogo;
goto ggto; gtto: printf( "%d goto \'s\n", oogt); goto
gtot; oggt: if ( !memcmp( ogto, "goto", 4)) goto otgg;
goto gooo; gogo: exit( ottg); tggo: ootg= strlen(tgoo);
goto tgog; oogo: --ootg; goto togg; gooo: ++ogto; goto
oogo; gott: fclose( ogot); goto gtto; otgg: ogto= ogto +3;
goto ogtg; tgog: ootg-=4;goto togg; gtgo: ogto= tgoo;
goto tggo; ogoo: ootg-=3;goto gooo; goog: ogot= fopen(
toog[ ottg], "r"); goto ogog; ggto: ogto= tgoo; goto
ggot;}
>>622 俺の例外は簡単だと思う。
ブロックでひとつネストが深くなるのがむかつくけどね。
continueだって十分思考を中断させる威力もってるぞ
括弧を探すのめんどい
>>620 gotoを使う必然性もないよね?
>>621 じゃー、
for (int i = 0 ; i < max ; ++i) {
int x, y;
if (! contains_hoge_only(list[i], &x, &y)) {
continue;
}
// ...
}
…にでもすれば?(´Д`)
>>622 例外をgotoに置き換えてもそのまま成り立つねw
629 :
デフォルトの名無しさん:05/03/16 16:49:56
この辺の話題は初心者にはちょうどいいレベルかな。
俺の例外?俺も例外は簡単って言おうとしたのにorz
631 :
デフォルトの名無しさん:05/03/16 16:50:29
633 :
デフォルトの名無しさん:05/03/16 16:51:29
>>627 >gotoを使う必然性もないよね?
何言っても例外マンセーじゃ話にならんぞ。
>>617 それをやると複雑だっていうのは偉い人もいっているぞ。
むしろgoto使った方が簡単だとも。
第3の方法として、例外が挙げられるがtry catchで囲んでしまえば、その範囲だけをみればいいわけだから、簡単だ。
単純なのはgotoだけど、例外は気をつけないといけない範囲が決まっているので楽かもしれない。
>>627 >gotoを使う必然性もないよね?
だからどっちだっていいじゃん。
そこまでこだわる理由がわからん。
引っ込みが付かなくなっただけだろうけど。
>>633 いや、俺、例外なんて一言も言ってないんだけど…。
>>634 偉い人のドキュメントへのポインタきぼんぬ。
あとここで例外使っちゃいかんでしょ。
>>635 gotoを使う必要性がない→gotoを使うと可読性が低くなる「可能性が高い」→使わない方が良い
637 :
デフォルトの名無しさん:05/03/16 16:54:18
だから、使い方を限定すれば、例外だってgotoだってどっちでもいいだろ。
goto見ただけでアレルギーおこすのは、おかしいって。
>>631 あと関係ないけどswitchのcaseラベル。
あれインデントはswitchと揃えたほうが見やすい。
実処理が2段下がってるって悲しいよホント。
走りたくなる。
639 :
デフォルトの名無しさん:05/03/16 16:55:38
>gotoを使う必要性がない→gotoを使うと可読性が低くなる「可能性が高い」→使わない方が良い
ぜんぜん論理になってないんだけど。。。
これだけ頑張って書いてるのに
内容が例外なく百番煎じなのが哀しいね。
君たちの存在ってそんな程度。
641 :
デフォルトの名無しさん:05/03/16 16:56:56
>>636 >gotoを使う必要性がない→gotoを使うと可読性が低くなる「可能性が高い」→使わない方が良い
使わないほうが良いことがなぜ使うなになるのか?
gotoを使うと可読性が低くなる「可能性がある」
gotoを使うと可読性が高くなる「可能性がある」
可読性教育しないのが悪いだけだろ。
ハンガリアンまんせーですか?
644 :
デフォルトの名無しさん:05/03/16 16:58:36
まあ、同等の処理ができるのならどっちでもいい。
それだけのこと。
645 :
デフォルトの名無しさん:05/03/16 16:59:09
ハンガリアンは6年前に卒業しました。
LPなんたらはわかりやすいけどそのごのSZがわけわかめ。
647 :
デフォルトの名無しさん:05/03/16 17:00:12
結局、gotoで済んじゃうからgotoでいいやと、
私の頭の中では結論が出ました。
どうもありがとうございました。
>>646 String terminated by Zeroだっけ?
スレに活気がなくなってきたら、この話題いいかもね。
別にgoto文を恐れなく使っていませんから。
一部、勘違いしてる人がいるだけです。
653 :
デフォルトの名無しさん:05/03/16 17:05:06
>>740みたいなシンプルな使い方、どう思います?
これも完全否定します?
>>656 どうせ OS が開放するんだし、別に free しなくてもイイんじゃねーの的な話じゃない?
>>657 初心者ってメモリリーク気にしないのかね。こわぁ〜。
さあ時よ、私のために止まりなさい
無意味なgotoネタはよそでやってよ
内容ウスいから読むだけ無駄だしさあ
>>657 MS-DOSとかWin3.xとかならそうもいかないんじゃね?
毎朝リセットするからfreeしなくても良いんだよ
でもfreeってことは確保はmallocだっけ?
今はnew、deleteしか使わんから使い方忘れたw
deleteの場合は、配列のときdelete [ ]ってやんなきゃなんないから
めんどいけど。
>>593 たぶんLispで関数型を体験すると、「なんだ、関数型って何にも出来ないじゃないか」
っていうふうになってしまうかもしれないので、OCamlを推奨。
SDL使えるよー 例外使えるよー 困った時は手続きで書くこともできるよー いろんな機能満載!
さぁ、みんなもOCamlを使おう!!!
670 :
デフォルトの名無しさん:05/03/16 17:14:13
deleteだけで済むように仕様変更しないかな?
>>669 Emacs Lisp を使えばいいよ(´ー`)
Lispって数式処理でちょっと使ったぐらいだから、
あまり良くわからないや。
>>653 if (エラー発生) goto exception1;
//処理
for(i=0;i<n;i++)
{
if( エラー発生) goto exception2;
//処理
}
//処理
finally:
//処理
return;
exception1:
//処理
goto finally;
exeption2:
//処理
goto finally;
どっちがみやすいかな?
>>657 freeしたところでメモリコンパクションまでしてはくれないというのはあったはず。
GC付きOSがないのはなんだかなぁとD言語の人が言ってました。
OSのGCに頼るのは心配で心配で胸が張り裂けそうです。
例外はスタックをガリガリ巻き戻しながら呼び出し元に伝播していくものでしょ
それが何でgotoと比較されるのかわからん
>>673 goto使うのでもその程度の使い方だから、
gotoであることのデメリットは感じません。
だからと言って例外がいけないとも思いません。
>>677 goto 厨が何故か例外に固執するから。
>>470のコードがスパゲッティには見えない。
逆立ちしても斜めから見ても見えない。
折れの目がどうにかなっちゃったのか?
共通部分は関数化しましょう。そうすればgoto使わなくても良くなります。
>>679 どう見てもあんたが固執しすぎだよw
私は例外ノーなんていってないもんね。
gotoだって使い方を考えれば有効でしょ、
とは何度も言ってるけど、そのたびに
必然性が無いとか訳わからんこと言ってくるのは
必ずあなた。
共通部分は関数化して、gotoうまく使えばネストも少なくなっていいね!!
>>677 例外の特殊さは戻り値が(Exceptionを含めると)複数あるところだよね
そして例外大前提プログラミングとか変なことが始まってしまう
もうしわけないけど、
>>470のコードについての感想ね。
>>681 使わなくても良くなるだけで、使いたければ使ったっていいんでしょ?
>>683 PG言語界でむやみにネストを増加させる奴らは巨悪だよな。
なんか、ひとりに釣られちゃってる感があるw
>>687 使いたければ使っても別に強制はできないけれど、どちらかというと
>>470の場合はgotoは不要だと思う。
>>690 「どちらかというと」って単なるあなたの主観じゃんw
もう何言ってもダメそうなのがわかってきたよ。
>>691 もともとスタイルなんていうのはそういうものだが。
次の話題。
gotoよりfreeより巨悪なのはネスト。
↓
>使いたければ使っても別に強制はできないけれど、どちらかというと
>>470の場合はgotoは不要だと思う。
自分の考えを一般論みたいに言うのはやめて。
初心者が迷惑するから。
>>694 構造化の観点から言えば関数化する方がいいんじゃないの?
>>692 つまり、gotoもあり、例外も然り、ってことでお開きにしましょうか。
俺の方がちんぽがでかいので俺が正しい
そろそろ秋てきたんだけど、帰っていい?
一名様お帰りで〜す
>>695 ひとつの関数からしか使われない共通サブ関数を用意するのは好き嫌いだろ
おっと、上司から残業要請だ...orz
暫くロムってる。。。
>>701 えと、3ヶ月くらいです… 今年大学入学なんです^^
お前らもしかしてネストが好きなの?(´・ω・`)
ネストは4つまで。深いかな?
>>704 すべてがわかった。もういいよ。これまでのことは許すw
演習が終わったら早く家に帰りなさい。
>>704 今年ってまだ3月だが1月入学の大学とか?
>>711 大学は4月からです。みなさん、プログラミング教えてあげてもいいですよ。
>>709 単に例外習いたてで、とにかく使いたいって時期なんだと思うので却下。
>>713 そういう典型的なDQN的発言は計算?
おっと、また喜んじゃうか。
学生成りすまし?
>>716 別に高校生でもプログラミングぐらいするでしょ。
すべてが明らかになったところで、終了としたいと思います。
この話題は少なくても向こう6ヶ月は凍結ということでお願いいたします。
>>714 エラーの無い処理は一画面に収まるし
エラーが発生してもすぐ下に処理が発見できる
Trueルートに専念できる最強最高のコーディングだろ?
そこらへんどうよ?
わかった。さよならー
>>718 凍結終わるまで、安心して他スレにいってていいよ
よーし、今夜もじゃんじゃんgoto文使いまくるぞー。
仕事の効率アップで、来週は一週間休んじゃうぞー。
俺はOCamlスレ行ってきます
>エラーが発生してもすぐ下に処理が発見できる
gotoなら同じスコープ内に発見できる。
>Trueルートに専念できる最強最高のコーディングだろ?
ひと目で見渡せるコード上じゃ大差ねーな。
はい終わり〜
exit(0);
#quit;;
>>724 嫉妬か。やはりgoto使い3級の俺は最強だったな。
>>728 他スレに行ってたはずが、相当このスレ気になってるんだなw
今夜はこのスレで徹夜ですか?
>>728 このくらいの会話になってくると、明らかに学生ってのが良くわかる。
ちなみに私はgoto禁止スタイルです。
もう聞いてねーよ
自作自演が過ぎます!
>735
ご勝手に。
自作自演と騙りが混ざってて、誰が誰なのかまったく分からない(;´Д`)
あぁー、そういうことだったのか。
確かにな。まったく気づかなかった。
この早さなら言える!!!!!!!!!!!!
↓
気づけ世w
例外をマスターした上でのgotoマンセー
ま・た・か・?
gotoをマスターした上での例外マンセー
マタカと書いて勇と読む。
後藤先生が気分をわるくされました
お前ら偉い人の言うこ(ry
>>748 2人目の男の子にはちょうどいい名前。
2人目の女の子の時は、勇子もおすすめ。
正直gotoは使ったことないのだけれど、
find boost_1_32_0 -name "*.hpp" -print | xargs grep goto
ってすると結構ヒットした。
>>751 お淑やかな女の子になって欲しいからダメ。
gotoを毛嫌いすると、とんでもないことになる
かもしれないよ。
boostのインストール手順を教えて。
gotoはお前ら初心者にはまだ早い。
勇子と結婚した俺の立場は...orz
ベテランの折れにはいい伴侶。
>>755 ダウンロードして展開して任意のディレクトリに置く。
使うときはインクルードパスを設定するだけ。
gotoがベストパートナー。
boostってめちゃ遅いって聞いたことあるけど。
goto使ってそんなに遅いんじゃ、例外使った日にゃ。
早いけどでか過ぎるの間違いだろ?
>>761 コンパイルはね。実効速度は使う機能による。単純なものは、力業でdefineして定義しただけの機能もある。
gotoって最適化の対象になるの?いろいろ飛び回ったら最適化できなさそうなんだけど。
っていうか、最適化しようがあるの?
>いろいろ飛び回ったら
無理やり悪い印象植え付けようとしてますねw
gotoを使って作った手続きは最適化されるの?
769 :
デフォルトの名無しさん:05/03/16 18:26:16
されうる。
コンパイラの挙動知らないやつはこれだから困る。
いかにも知ってるふうにいうやつはもっと困る。
ちょっとyaccとlex使ったぐらいで、
コンパイラマスターしたと勘違いしてる香具師は、
日本全国ごまんといるから。
オートマトンも然りw
何にもやってないやつよりまし
>>769 賢いコンパイラでないかぎりほとんどされないよね。
それでいてどうしてgotoを使うのか。
確かに型にはまった使い方なら最適化されうる可能性もあるが、それ以外ならどうだろう。
gotoを良く使う人はその辺はどう考えているのかな。
それとも、型にはまった使い方以外はしないというのかな。
>>775 > 型にはまった使い方以外
それをスパゲティコードというのではないのですか?
>>776 逆にいうとスパゲッティプログラムを書いてしまう危険性も秘めている訳だよね。
つまり危険と非効率がgotoの本当の姿だ。
もう俺にわかりやすけりゃそれでいいよ
>それをスパゲティコードというのではないのですか?
またまたはちゃめちゃな論理ですねーーー
単に話がループして終わらないだけということに
気づいているのにやめないのはなぜ?
だって論理的でないんだものさーーー
>>781 論理的に話ができない人は、いつまで経っても負け犬ですよ。
>>782 このスレでgotoの最適化について検討されたことがあるか?
>>784 動かないコードをスパゲティコードとはよばない。
可読性の悪いgoto主体のコードをスパゲティコードと呼ぶ。
型にはまったコードは可読性が高い。
ゆえに。どこが非論理的?
もう秋田、次の燃料下さい
gotoの最適化なんて議論するようなことじゃないだろw
NOTの勉強を推奨します!!!
>>789 ではfreeの必要性について同思いますか?
揚げ足とろうとかき回すことしか頭にない時点でアンチgotoは釣り。
↓ここからはextern(C)するとどうなるのという話題
gotoの最適化なんて意味の無い議論を持ち出すことにより、
goto叩きに持っていこうとしてるのは見栄三重。
↑extern(C)って何?
>>790 速いプログラムはいいプログラムだ。 最適化は重要だ。
なかなかageる勇気がありませんが何か?
798 :
デフォルトの名無しさん:05/03/16 18:50:17
>>792はfreeの必要性についてどう思いますか?
__declspec( dllimport)と__declspec( dlleximport)の違いを教えてください。
例外信者はgoto文見るだけで発狂するんだってね。
goto文見るだけで、これはミートソースだってきかないんですってね。
こうなったら、今夜の飯はナポリタンにするしかないな。
間違えました。
__declspec( dllimport)と__declspec( dllexport)の違いを教えてください、
でした。スマソ
すっぱいからあまり好きくない
折れは天津丼にするから大丈夫。
なぜ最適化を重要と思っていないのか疑問だ…こいつら本当にプロか?
なんで飛鳥でレタスチャーハンと餃子やめちゃったんだ?
>>806 exportじゃないとdllが作れない
importじゃないとdllが使えない(ヘッダでリンクって意味ね)
>>809 gotoの最適化がどれだけご利益あるのか行ってみて。
ヴァかな折れでもわかるようにね。
>>809 すいませんねー。おかげで儲けすぎちゃって困ってるくらいです〜。
まあ、金もらっている以上、
興味が有ろうと無かろうと、プロはプロだなー。
>>809 プロといえばgoto文を駆逐できるとでも思っていたのか?
わけわからん。
まあ、今の時代は相当クソプログラム組まない限りは、
処理速度でそんなに苦慮することもなくなってるし。
その分、10年前より楽させてもらってますけどね。
まだやってんのかよ。
関数型言語糞。何これ。
結局、gotoの最適化を語れる香具師はいないんじゃん。
それを材料にgoto叩こうったって意味無いことがはっきりした。
本当のプロは例外もgotoも柔軟に使います。
gotoはクソ、なんて言ってるのはそれこそ例外です。
(´-`).。oO( スレがのびてると思ったらこれか…
スレが伸びるって、いつもこんなんでしょ。
とりあえず風呂でも入って臭いからだ洗って濃いよ。
貧乏で安アパートで風呂付いてないんですー
祭は終わりですか?
あとの祭り
, ' /:::::::/!::::::l:::l l:::::::::ハ::::::::::i!:::::`ヽ、
, ' /::::::::::/ |:::::l|::l l::::::/ !:::::::| !:::::ハ:::::\ ' ,
/イ:/|::::/ !i::l l| |:::/ l::::::! l::::i l:::::::⊥
/ '::::/ |::/ |l:| l| 、|/_,. -!:::| !/ l:::(__ )、' ,
, ' /::::/、」ムノ !| ! 手咋≧=、| ノ ( l::(_ )::\ ' ,
; i:ハl 7》示气 }l込_タ冫 ⌒ |:::フ´ヽ::::::\
; _」| リ 戈ワュ′r 、 ゙≠宀⌒ヽ\ レ' /⌒ヽ:::::::::ヽ
/:::::| し´ ̄ ハ _ -‐ へ、//U // ! !ヘ:::::::::::ヽ
/:::Y´! ///// 「 ̄ ̄ | |___ -‐ ´ ヽ ハ l l ハ::::::::ヘヽ
,::::::ハ l U l ̄ ̄ | | ゙、 し ヽ- ' ノ }:::::/ヽノ(
l::::::| ヽヘ ! J i ィー冖ー一^″ -イ
l::::::| `゙、U l } U、┴’ {
ヽ:::| ' , ト 、 l __ノ イiハ ) あ ぶ }
ヽ! U ` ‐- 二  ̄ ̄ ̄ ∪ / \ ( あ ぁ |
' ' ' _ -7¨´ / _」 ) あ か 、
仄´ / r ニ \ ( あ あ 〉
| ヽ / __ // ヽ / } !! あ あ (
| ヽ`¬┌''´ノ \ / 亅 冫
この程度を祭とよんだら非難をあびる人に失礼だ
●●●●●●●●●●●●●●●●●●●●●
● ● ●
● ● ●
● ● ●
● ● ●
● ● ● エーデルワーイス エーデルワーイス
● ● ● _( "''''''::::.
● ● ● ●__ ____,,,... --‐'''^~ ヽ ゛゛:ヽ
● ● ● ●:::::::::....:"""" ・ ・ . \::. 丿
● ● ● ●::::::::::::::::::: ・ ....:::::::彡''ヘ::::/
● ●:::::::::::::::::::::::::::::;;;;;,, ---‐'' "^~
●●●●●-‐‐ ''^~
みんなデスマってるかー
思うんだけど対立点を探すからいつまでたってもまとまらないのであって、
「無制限な goto は危険」を共通認識として後は各自好きにすればいいんじゃないの?
841 :
まともに動いてない ◆/8LpUMqVAk :05/03/16 22:23:36
助けてください。
環境 Linux
#include<stdio.h>
#define MAX 100
struct student {
int no;
};
main()
{
struct student *p;
p->no = MAX;
printf("%d\n",p->no);
return;
}
コンパイルはとおるんですが、実行すると落ちます。
教えてください。
>>842 main()
{
struct student s;
struct student *p = s;
p->no = MAX;
printf("%d\n",p->no);
return 0;
}
struct student *p = &s;だな。スマン
846 :
まともに動いてない ◆/8LpUMqVAk :05/03/16 23:24:16
>>842 struct student p;
p.no = MAX;
printf("%d\n",p.no);
>>842 構造体使う前にポインタちゃんと理解しろ
>>842ってネタじゃないの?
だって、あまりにもわかりやすいミスだから。。。
851 :
デフォルトの名無しさん:05/03/17 01:04:53
>>842 コンパイル通るの?
main()って何もつけないと戻値ってintじゃなかったっけ?
852 :
デフォルトの名無しさん:05/03/17 01:06:42
ばれちゃったねw
>>851 ISO/IEC 9899:1999 Foreword -5により、暗黙のintは許されなくなりました。
854 :
デフォルトの名無しさん:05/03/17 02:56:55
VC++6.0だとintだ。
855 :
デフォルトの名無しさん:05/03/17 02:57:52
>>853 ふーん、そうなんだ。
じゃあ、暗黙はvoidなのかしら?
暗黙は許されナインでそ?
じゃあいずれにしても
>>842がコンパイル通ったって嘘じゃん。
釣り決定!!
>842 がコンパイルしたときのオプションが解らんのでは
「本当にコンパイル通ったのか」は不明だろう。
>>858 は?あんたばか?コンパイラによるだろ。
#include <stdio.h>
main()
{
puts("Hello, world.");
return;
}
少なくともCとしてコンパイルする分にはVC++6.0,gcc-2.95.4@Debian stableのどちらでも通る。
gccは-Wallとかつけないとwarningすら出ない。
>>862 cc1: unknown C standard `c99'
gcc-2.95.4だし。
基本的な質問ですいませんが、
配列で
int arg[5][10];
というものがあるとします。
その配列argに、
(1)変数名に演算はできるのか?
int* pName=arg+1;
(2)変数名に加算・減算できるのか?
arg++;arg-=5;
(3)変数名にアスタリスクをつけて、定数または変数の代入が出来るのか?
*arg='A';*arg=78;
int val=8;*arg=val;
return で二つの値を返して
それを二個の変数に入れるにはどうすればいいのでしょうか
こうですか?
int a,b=return();
>>864 できるかどうかやってみりゃ済むことだ。
>>864 変数ではないので、ここでは配列名でいいと思います。
(1)できます
(2)できません
(3)できません
あくまで配列の先頭ポインタを参照することしかできません。
代入をしたければ、別にポインタ変数を作りそれにアクセスしましょう。
int* ptr=ary;
*(ptr+3)=777;
多次元配列の場合、
あなたが示した配列では、int arg[5][10];
(第一次添え字 * 第二次要素数) + 第二次添え字
がポインタ演算のさいの加算値となりますのでご注意を!
arg[3][7]; の場合、
(3*10)+7
となります。
>>869 sizeof(int)の考慮が抜けてるぞ
>>870 int* としてポインタ変数を作るからsizeof(int)はいらない
ばか
ポインタのポインタってハンドルってことでおーけー?
>>872 「ポインタのポインタ」は「ポインタ」だ。
関数とAPI。
業界的にはどっちで呼んでるの?
意味合いは同じだとおもうけど。
875 :
デフォルトの名無しさん:05/03/17 15:05:09
SQLiteをBorlandC++から使いたいのですが、組み込み方がいまひとつ
分からないので、助言をお願いします。
SQLiteのソースコードをダウンロードして、以下のようなテストを書きましたが
Error: 外部シンボル '_sqlite3_open' が未解決
とのエラーが発生しました。確かにヘッダファイルしか読み込んでないので
その通りだと思いましたが、如何せんこの先どうすればよいのか分かりません。
sqlite3.dll, sqlite3.defをどうにかリンクすれば良いのかとも思っているのですが
LoadLibraryで読み込むのも違うような気がして悩んでいます…。
======
#include <stdio.h>
#include "sqlite/sqlite3.h"
void main(void)
{
sqlite3 *db;
int result = sqlite3_open("test.db", &db);
if(result){
printf(sqlite3_errmsg(db));
} else {
// ここで sqlite3_exec() などの処理
}
sqlite3_close(db);
}
====
環境はWindowsXP + BorlandC++5.5 + SQLite3.1.6です。
DLLの引数にクラスのポインタを使う場合、どの様に定義すれば良いのでしょうか。
DIBをまとめたクラスをDLLと受け渡したく、DLLはLoadLibraryでロードし、
typedefで定義した型に代入と言う形で呼び出したいのですが、何をどう
定義すれば良いのかさっぱり解りません。
>>875 implib.exeでインポートライブラリ作れ
880 :
875:05/03/17 16:03:25
>>877 ありがとうございます。
一応そのURL(の日本語訳)も読んでいたのですが、それ以前に
DLLの使い方というか根本的なところから分かっていなくて…orz
>>878 ありがとうございます。
以下のようにインポートライブラリを作成してみたのですが、やはり
未解決とのエラーになってしまいます。インポートライブラリの使い方を
間違っているんでしょうか。
> implib sqlite3.lib sqlite3.dll
> bcc32 test.cpp sqlite3.lib
882 :
デフォルトの名無しさん:05/03/17 16:33:26
質問させてください。WinHomeで、VC++6.0を使っています。
配布・改変が許可されたCのソースを落として、まずそのままビルド、実行したら通りました。
しかしソースに手を加えてビルド、実行を繰り返しているうちに、
LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
が出るようになってしまいました。コンソールではなくWin32APPなのですが・・・。
ファイルが壊れたのかと思って、元のファイルに、改変したいくつかのcソースを上書き
していくと、いつの間にか同じエラーが出てしまいます。。どうしてなんでしょうか・・・
>>881 ありがとうございます。できました!
implibのオプションを見た限りでは、エラーに「_sqlite3_open」と先頭にアンダースコアが
付いているから「-a」オプションが必要だった…という解釈でいいのでしょうか。
(DLLの関数だからアンダースコアが付くんでしょうか??? もう少し勉強します…)
> implib -a sqlite3.lib sqlite3.dll
885 :
882:05/03/17 16:42:41
>>883 あ、すいません。VC++の設定上の問題かと思ったので・・・
どうしてかって、改変したからに決まってるだろ。
ビルドが通らなくなるような変更を加えたお前の責任としか。
887 :
デフォルトの名無しさん:05/03/17 17:06:21
windowsで画像ビューア作ってみたいのですが、ビットマップを扱うAPIはあるようですけど
JPEGとかはどうやってるんでしょうか?
>>887 それくらいも調べられないなら、作るのをやめたほうがいい。
891 :
デフォルトの名無しさん:05/03/17 17:49:54
c++
グローバル変数ばかっかり使っていたので、できる限り使わないように組み直しています。
WndProcで何かのキーを押したらそのキーに対応したフラグ(変数)を1にするようにしていました。
そのフラグは別の関数内で使用しています。
WinMainの中で変数の宣言をしているのですが、WndProc内でどういう形で呼び出せばいいのでしょうか?
ばかっかりになってるしorz
そういうのはグローバル変数でいいんじゃないの
レスありがとうございます。
何か違和感がありますがここだけはそのままグローバル変数を使ってみます。
895 :
デフォルトの名無しさん:05/03/17 18:24:31
質問してもよろしいでしょうか。
オーバーロードしてある関数のうちのひとつを派生クラスで
オーバーライドしたのですが、オーバーライドしてない方の
関数を呼び出そうとしたときにコンパイルエラーになってしまします。
Javaでは出来るようなのですがC++は出来ない仕様なのでしょうか?
896 :
895:05/03/17 18:25:28
エラーメッセージ
'Read' : 関数が不正な 1 個の実引数をともなって呼び出されました。
コンパイラ
VC6.0SP5, BCC
class CReader{
public:
virtual ~CReader(){
}
virtual void Read(){
}
virtual void Read(int a){
}
};
class CExtendedReader : public CReader{
public:
void Read(){
}
};
int main()
{
CExtendedReader reader;
reader.Read(0);
return 0;
}
while (1) {} と for(;;) {} ってどっちが高速ですか?条件判定がない分forのが有利ですか?
>>898 そうだね。心の汚い人間になるところでした。
>>896 CExtendedReaderの定義の中に、using CReader::Read;と書け。
C++にパッケージ内パッケージってあったのか。
ちょっと驚き
パッケージなんてものはない。
>>900 無事にコンパイル出来ました!
ありがとうございました。
>>903 うんそれそれ。でも良く見たら
>>900にnamespaceって書いてないね。
Javaのimportとの違いを知りたくなったので調べて見ます。
C++ : Java / using と importの比較
using namespace hoge; : import hoge.*;
using hoge::Writer; : import hoge.Writer;
エイリアス有り : エイリアスなし
Java と違って良いのは、
using fbar = namespace foo.bar;
とかできる点だな。
namespace netque = torutk::network::que;
これはつまり netque と torutk::network::que を同時に宣言してるってこと?
>>909 それ C# じゃねーか YO!
>>910 alias.
#include <boost/program_options.hpp>
int main(int argc, char const * argv[])
{
namespace bopt = boost::program_options;
bopt::options_description a = ...;
}
…とか。エディタの補完機能使えばいいだけの話なんだけどね(´Д`)
>>911 = の右辺値は既存のネームスペースのみなのか。
そっちのが安全でいいけどね。
D言語のaliasはすごいぞ。
Dのalias = Cのtypedef
Dのtypedef = 型独立
namespaceとまるで関係ない
そんなことより、namespace foo::bar::hoge {} したい。
namespace foo::bar::hoge; はできるの?
出来るならファイル分ければいいだけさ。
916 :
デフォルトの名無しさん:05/03/17 21:22:28
例えば4つのBMPファイルを扱う場合、
あらかじめ4つのHBITMAP型を宣言して、それぞれに
LoadImageしておいた方がいいんでしょうか?
それともその場その場で一つのHBITMAP型を使いまわしたほうが良いですか?
ここは質問する人はおろか、答える人までも初心者でがんばってるんだね。
>>916 同じサイズのBMPならひとつ読み込んでBitBltでどうにかするとゲーム風。
そうじゃねなら普通別々に読み込むわな。
>>876 言いたいことはさっぱりわからないが、とりあえずvoid */const void *をやり取りすればいいんじゃないか?
921 :
sage:05/03/17 21:50:50
(今回入力したx−前回入力したx )/(今回入力したy−前回入力したy)
を求めるプログラムを教えてくれないでしょうか?
お願いします。
↑あげてすいません
strcpy(before,current,strlen(current));
cin >> current;
なんてな。
if 2回目以降 then
答え =(今回入力したx−前回入力したx )/(今回入力したy−前回入力したy)
なんでこんなスレ進むの早いんだ?春休み?いいなぁ学生は
やっぱりUNICODE使ってやってます?
>>927 学生でつ(´ω`)
そもそも調べて分かるようならここで質問しないのですが、検索しても自分のケースとは違うので結局答えに至らないという場合があります。
本の説明は難しかったり、ある程度知識がないと分からなかったり。
自分もここ(の板)で聞きたかったことがあるのですが、ソースを公開しないと説明できない量なので自力でやってました。
4日間1日12時間以上1文字変えてはデバックという作業を繰り返して、さっき上手くいったときの快感は寝るまで忘れません。
まだこういう体験をしていない人はたくさんいると思いますが、くじけず頑張ってください。
では寝ますノシ
デバッグと言うより拷問だな。
向いてなさそう
そろそろE言語が出る時代かな。
良い言語。
>929はどんなプログラム書いてるんだろう
見てみたいようなそうでないような…
単車で滑って2マソのMP3プレイヤー大破(ノ∀`)
>>933 フライトシューティングでつ。
タイムラグがあるけど一応WAN内なら対戦可能・・・に何とかなりました。
相手の座標と描画(座標がおかしければ当然変な位置に描画)がおかしく、
エラーが出るわけでもないので原因が特定できませんでした
メッセージの欠損か描画関数がおかしいのかもしくは別のところか。
バックアップもとらずに不審点をひたすら変えていったら何とか成功。
結局どこをどう弄って直ったのか把握できず。
できるだけ修復しやすいプログラムにしていますが、
音楽を流したり他のPCと通信するとなると一気に何行も書かないと駄目なのでしょうがないといえばそれまでなんですが。
E電みたいでやだ!
WANじゃないや、LANだ(´・ω|
おーし、なにやら毎度結の出ない話題がまたぶり返してたようだけどもう一度聞いちゃうぞ〜?
inline 使いまくるとダメな理由 or それ書いてる書籍の情報キボン(`・ω・´)
>>937 全部嫁よ
Efficient C++ 以外は全て良本だ
ヘタレな学生なもんで、すぐにすべてを読破するのは難しいんでつ…(´・ω・`)
まぁ良本という噂はかねがね伺ってますので(Efficientは初見だけど)
まったりと読んでいくつもりですが…
学生が一番そういうの読み込める時期じゃないかなぁ。
>>939 本を読んでも理解できなくても、自分の必要とする関数を使っていくだけで勝手に覚える。
一定期間続ければ途中の短期間で一気に本の内容が理解できるようになる。
ダイエットみたいなものかね、したことないけど。
>>941 おまえはセンス無いから
アドバイスに説得力がない
今Effective C++読んでるんだけどほかの良本おしえてください
一応全部読んでみたいので
>>943 ここには必読書のためのスレとかあるだろ?
945 :
デフォルトの名無しさん:05/03/18 21:42:28
最終的にはC言語風味のスクリプトを作ろうと思ってるわけですが、
文字列処理に関しての知識が足りないため現在修行中です。
とりあえず、ある文字列から
タブ、スペース、リターン、キャリッジリターンをデリミタ文字にして
トークンごとに文字列を取得するクラスを作れるところまでいきました。
次はCSVファイルあたりでもよみこんでみようかと、
デリミタをタブ、スペース、リターン、キャリッジリターン、コンマにして挑んだところ、
ダブルコーテーションで囲まれた範囲のリターンやスペースがデリミタ文字にならないらしく
おかしなことになっております。
こういった場合はどんな手法を使うのが定石なのでしょうか?
強引にダブルコーテーションがきたら、その中の文字をデリミタ文字jでのチェックを行わないと
してしまっていいのでしょうか?
アドバイスお願いします。
>>945 その方法でなんら問題ない。
最も綺麗な解法だと思う。
>>937 inlineばっかりしてるとサイズが爆発するぞ。
んでキャッシュが効かなくなるしロードに時間がかかるようになって結局遅くなる可能性がある。
どのへんまでが高速化の分岐点かは環境によって違う。
マクロの代わり程度の小さな関数に限っておいた方が無難。
951 :
デフォルトの名無しさん:05/03/18 22:32:36
>>947-948 リンクの紹介ありがとうございます。
色々と奥が深そうですね。
最終的にC言語風味のスクリプトを作りたいと書きましたが
実はC言語風味のスクリプトを作ってそれをどうやってプログラム側で処理したらいいのかとか
その辺からわかっていなかったりします。(スクリプトの本を買っても言語仕様はのっているのですが)
ちなみに「処理したらいいのか」というのは構文解析がどうとかいう問題ではなくて
構文解析まできたとしてその後、どうやってプログラム側にスクリプト側の値を渡すのかといったものです。
例えばいまは
NAME = "佐藤 太郎";
とかやるとNAMEというプログラム側であらかじめ決めたキーワードに値が入ってきますが、
スクリプトで作った場合だとどのようにしてプログラム側に値を渡すのでしょうか?
実は一番知りたいのはこんな部分だったりするのですが何かオススメ書籍とかないでしょうか?
>>951 その質問をこのスレでするのか?ふさわしいスレまで紹介してもらって?
>>950 実行コードのサイズと、消費メモリサイズを混同する痛い人は、あなたですか?
954 :
デフォルトの名無しさん:05/03/18 22:42:39
>>949 ところがですね。
会社にあるソース(誰が書いたかわからない)では
ダブルコーテーションからダブルコーテーションまでを
1つのキーワードと認識できているようでフォーマット定義ファイル(?)と
キーワード定義ファイル(?)をいじるだけでC言語みたいな複雑なものから
CSVみたいな簡単なものまで解析できてしまっています。
(ソースが複雑過ぎて&私の文字列処理の知識が貧困過ぎてコメントの用語からいってわかりません(笑))
なにか自分のやり方と根本的に違うような気がするので書籍をあさっているのですが、
一朝一夕では理解できないと考え地道に勉強しております。
画面を分けるためだけに儲けたsub関数と
1〜3行のif文が存在しない関数をinlineにするって基準はダメ?
957 :
デフォルトの名無しさん:05/03/18 22:52:51
>>952 もうしわけございませんでした。
>>956 ありがとうございます。
とりあえず、紹介してもらったリンク先と
拾ったキーワードに関する本を片っ端から調べてみます。
>>953 実行コードのサイズが増えても消費メモリが増えないとでも?
コードの長さ分だけはどうやっても増えるだろうが。
>>955 サイズはわかるがif文はなぜ?
何か根拠あるのかな。気になる。
>>954 文字解析や構文解析は似たようなコードがひたすら並ぶことも多いのでソース見てもわからんのはあたりまえ。
ためしにソースコードを圧縮してみると明らかに圧縮率が高かったりする。
それだけ冗長度が高いってこった。
アルゴリズムのレベルで理解しないと既存のソースなんて参考にはならんよ。
あるいはパーサジェネレータの挙動を見る方がためになるくらいだ。
ifがあるとinline化出来ないとか・・・勘でいってみる
inline付けても必ずinlineされるとは限らないんだけど
それでも爆発する程サイズ増えるもんなの?
今時のコンパイラならその辺上手くバランス取ってくれそうだけど。
>>959 制御文やstatic変数・関数がコードの中にあるとinlineは無効じゃなかった?
どうせコンパイラが無視するから関係のないことかも知れんけど。
mbstowcsしてから解析してる?
マルチバイト文字だと解析が難しくなるよ。
>>962 「今時のコンパイラがその辺上手くバランスを取って」
くれるなら、手作業でinlineをつけまくるより、
最初からコンパイラの自動inline化にまかせればいい。
inline【淫ライン】
女性のウナジからフトモモにかけてのライン。
妄想百科辞典【中国民萌書房】
>>958 なるほど。
コードの長さ分増えることでキャッシュが足りなくなるほどの
メモリ消費が発生するといいたんですね。
しつこいですが、ファイルサイズと消費メモリサイズを混同しないように。
あなたが、入門書・解説サイトなどを読んでるうちに
脳内で誤解が生じてしまった痛い人なのは、同情します。
でも間違いは間違いです。
チンケな自尊心を捨てて、反省してください。
コンパイラはinlineを無視する権限がある
コンパイラは勝手にinline化する権限がある
最適化オプションで傾向を変えられないならinlineって無駄では?
とも思ってしまう今日この頃
>>968 あのなぁ。
キャッシュのサイズってどんだけか知ってるか?
それと最初は実行コードのサイズがどうとか言ってたのにこんどはファイルサイズかよ。
実行コードが増えればファイルサイズも消費メモリも増えるだろうが。ボケ。
(そりゃ例外がないとまでは言わんよ。でもまさかここでそんなことを持ち出さないだろうな?)
キャッシュにも一字と二字があるよね。
システムによっちゃ3字もあるって聞いたことある。
例えば、
int main( void)
{
int* mem = new int[ 4ギガバイト];
delete [ ] mem;
return 0;
}
ってやったら、この数行のプログラムでさえも、
一瞬でもメモリサイズ4ギガバイト逝きますよね(細かいことは抜きで)。
もうそっとしといてあげようよ、、、
>>973 やってみたがメモリ使用量に変化無し?!
ただし、配列要素にアクセスするコードを入れたとたんに
スワップが始まったw
これって正しい動きなのか?
ちなみにOSはWinXP。
メモリを確保するという処理にスワップファイルを作るという仕様はないしな。
>>976 タスクマネージャーで確認したところ、
スワップが始まったとたんにメモリ消費量グラフ増大。
>>976 タスクマネージャの表示項目を増やすべし。
メモリ使用量だけでなく、仮想メモリサイズも注視しないといけない。
NT系のメモリ管理機構はUnixのそれより優れている(とされる)。
プログラマが意識しなくていい部分で色々やってくれる。
ためしに、メモリ書き込みした巨大バッファを数分間Sleepなどで保持した後、
アクセスしてみると・・・・。どうなるか、とりあえず、やってみれ。
デスクトップOSだからこういうことするんだろうと思うが、
余計なお世話にも感じる。
仮想メモリを体感できて感動した。
つーか4GBも確保できんだろ。アドレス空間が足りない。
>>962 関数一つinlineにしただけで、実行ファイルのサイズが700KB増えたことはある。
これが爆発する程かどうかは知らないけど。
C/C++ってダサ
挫折したからって泣くなよ
挫折したからって泣くなよ
好き嫌いしてちゃろくな大人になれませんよ
どのコンパイラだったかは忘れたけど、グローバルな名前空間に属する関数を
inline指定するとグローバルリンク用に非inline版の関数とinline展開したコードの
両方が生成された記憶が。
それでも精々30KBくらいしか増えなかったけどなぁ。
#streamとstringが絡むとどっちみち増えるし。
>>973 ちなみにインテルコンパイラは配列は2GBまでだよ。
なんで、コンパイラによって制限あるんじゃない?
コンパイラっていうかWIN32だとアプリが使えるメモリ空間は2GBまで。
まぁ、4GB超のメモリにアクセスする手段がないではないが。
>>973 32bitOSの場合、確保しない。できない。
例外をスローする。
new(nothrow)をした場合、ヌルを返す。
それだけ。つまらん。
>>984 ざせつ? なにいってんの このひと アホですか しんでいいですよ
きっと きみ の まわりには ざせつしたひとが いっぱい なんでしょうね
超図星
まず挫折する要因が解からない。
ただのプログラミング言語だろ。