07/04/01 23:01:13
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.35【環境依存OK】
スレリンク(tech板)l50
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
2:デフォルトの名無しさん
07/04/01 23:37:03
先生方、どうぞ宜しくお願いします。
3:デフォルトの名無しさん
07/04/02 00:08:17
WinXPでC言語勉強し始めた者です。
ソートの問題で、「ただし同じ値なら同じ順位を返しなさい」という
ただし書きがあって、今までなかった注意書きでどうすればいいのか分かりません。
ググったのですが・・・選択ソートを使っています。IF文の
elseでどのような指示をつければよろしいでしょうか?
4:デフォルトの名無しさん
07/04/02 01:05:35
>>3
順位って1位2位ビリってか。
5:デフォルトの名無しさん
07/04/02 02:19:29
保守しないと落ちそう
6:デフォルトの名無しさん
07/04/02 02:23:27
>>3
まずはソースをさらすんだ
7:デフォルトの名無しさん
07/04/02 02:38:47
「安定なソート」という意味だろ
8:デフォルトの名無しさん
07/04/02 03:05:45
C言語学ぶのにいい本を次からおしえて
K&W
独習C
結城浩のC言語プログラミングレッスン
9:デフォルトの名無しさん
07/04/02 03:26:31
K&W
10:デフォルトの名無しさん
07/04/02 04:24:10
作って分か……ごめん、エイプリルフールはとっくに過ぎてたね。
11:デフォルトの名無しさん
07/04/02 06:25:03
【ネガティブ派遣根性チェック】
3つ以上、チェックがつけばアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。
□派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする
□派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われて嬉しい
□自社で仕事なんてできるわけがない
□派遣労働の問題点の話題が出ると感情剥き出しにして反論する
□派遣労働の問題を指摘する人は嫌いだ
□派遣先には仕事だけでなくプライベートについてもグイグイ引っ張って欲しい
□奢ってくれる派遣先正社員を尊敬する
□自分の月額金額を知らないのは当然だ、単金を聞いてはいけない
□派遣先正社員より自分の生涯収入が低いのは当然だ
□派遣先に尻尾を振り、かわいがってもらうことが大切だ
12:デフォルトの名無しさん
07/04/02 13:39:48
>>10 お前は頑張ったよ
13:デフォルトの名無しさん
07/04/02 16:44:09
結城ってひとの本図書館にあったから立ち読みしたけど
あれで勉強してるひといるのか?
ちょっと見て、ん~?ってとこが多かった。
あれで基礎固めたら大変だろうね。
14:デフォルトの名無しさん
07/04/02 19:27:14
>>13
柴田望洋乙
15:デフォルトの名無しさん
07/04/02 19:31:52
質問です。
C++で日本語のファイル名を作成する場合はどうすればいいの
でしょうか?
ofstream out("ほげ.txt");
と書いたソースをsjisで保存してもutf-8で保存しても出来る
ファイル名は文字化けしてしまいます。
OSはWindowsXP、開発環境はVS2005です。
どなたかご教授お願い致します。
16:デフォルトの名無しさん
07/04/02 19:34:36
>>15
UNICODEの定義を外すorロケール設定をする
17:デフォルトの名無しさん
07/04/02 20:20:24
ポインタがよくわかりません
18:デフォルトの名無しさん
07/04/02 20:22:22
>>17
URLリンク(www.google.co.jp)
19:C++初心者
07/04/02 20:46:41
質問があります。
現在、VisualStudio2005上でWindowsFormアプリケーション上に配置した
ボタンクリックイベントにて別クラス
①TestClass2.cpp
②TestClass2.h
にて定義したメソッドを呼出そうとしているのですがうまく呼出せません。
どこに問題があるのでしょうか?
①
#include "StdAfx.h"
#include "TestClass2.h"
TestClass2::TestClass2(void)
{
int Method2()
{
return 10;
}
}
②
#pragma once
ref class TestClass2
{
public:
TestClass2(void);
int TestClass2::Method2();
};
20:C++初心者
07/04/02 20:48:26
【ボタンクリックイベント部分】
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
int i_return = TestMethod();
Debug::WriteLine("処理が終了しました!!");
//この部分でTestClass2の中にあるMethod2()関数を呼出したいです。
int i_return2 = TestClass2::Method2();
}
21:デフォルトの名無しさん
07/04/02 21:38:08
クラスメソッドとインスタンスメソッドというのがあってだな
C++的には静的メンバ関数だっけ?
22:デフォルトの名無しさん
07/04/02 22:17:53
どっち方向に勘違いしているかわからないね。3つポイントがあって2つ間違ってる感じかな。
23:20
07/04/02 22:29:55
自己解決しました。
24:デフォルトの名無しさん
07/04/02 22:40:16
実数の比較で == をつかっちゃいかんというのは良く聞くけど
double a=0;
printf("ヌルポ\n");
if( a==0 ) printf("ガッ\n");
これも例外なくNG?
ゼロだけは許されるとか、そういうのアリ?
25:デフォルトの名無しさん
07/04/02 22:48:03
使っちゃならんって言われる意味わかってるか?
26:デフォルトの名無しさん
07/04/02 22:49:54
実数は丸めたりするから、比較けっかが
理想通りにいかなかったりするからだろ
27:デフォルトの名無しさん
07/04/02 22:50:01
+0 -0
28:デフォルトの名無しさん
07/04/02 22:52:06
>>24
εを0とみなさないなら問題ない。
+0.と-0.は等しい。
29:デフォルトの名無しさん
07/04/02 23:04:29
>>26
ゼロは特別に許された方が便利だろとか
思ったりしたんだよ
話変わるけど
大体ポインタがゼロのときエラーとかいう仕様が
まかり通ってる時点でなんかもうおかしいんだよ
ゼロ番地なのかエラーなのかわかんねーじゃん
30:デフォルトの名無しさん
07/04/02 23:06:57
>>29
お前がポインタのゼロだと思ってるものはヌルポインタ。
URLリンク(www.kouno.jp)
31:デフォルトの名無しさん
07/04/02 23:07:55
浮動小数点の話なのかポインタの話なのかはっきりしろ
32:デフォルトの名無しさん
07/04/02 23:09:20
ポインタが0でもエラーじゃないこともあれば
0以外でエラーになることもあるだろ
33:デフォルトの名無しさん
07/04/02 23:40:17
日本語でおk
34:デフォルトの名無しさん
07/04/02 23:42:16
0をポインタに入れるとヌルポインタになる。
ヌルポインタはどこも指してない無効なポインタであることが保証されてる。
ヌルポインタが全bit0であるかは環境依存。
35:デフォルトの名無しさん
07/04/02 23:45:45
>>34
わかってるんだろうが、その書き方は誤解を招く虞が…。
ポインタが必要な文脈で現れた整数リテラルの0がヌルポインタを意味するのであって、
整数0をポインタとして扱ってもヌルポインタに化けるわけじゃない。
36:デフォルトの名無しさん
07/04/02 23:46:58
>>34-35
どう書いても誤解の可能性は避けられないんだから、
ごちゃごちゃ言わずに C FAQ で済ませとけよ。
37:デフォルトの名無しさん
07/04/02 23:50:34
ヌルポインタて、いくつの数字を入れるとなるの?
38:デフォルトの名無しさん
07/04/02 23:55:00
テキストエディタ使ってC書いてるんだけど、コンパイルするにはどしたらいいの?
コマンドプロンプトで
bcc32もgccも試したけど
内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
と出る。
何かインストールが必要なん?
39:デフォルトの名無しさん
07/04/02 23:55:40
bcc32はBorand C++
gccはCygwinもしくはMinGWのインストールが必要。
40:デフォルトの名無しさん
07/04/02 23:58:43
0をぬるぽとして扱うと正式に決まってるのはC++だけだったような
41:デフォルトの名無しさん
07/04/02 23:59:00
初心者の俺に教えてほしい。
昔(10年前くらい)、コンパイラってのは高いやつとフリーのやつではうんと差があると聞いたのですが、
今でも、borandや、gccとかじゃやっぱり駄目駄目なんですか?
42:デフォルトの名無しさん
07/04/03 00:00:51
>>40
C FAQ読んでこい
43:デフォルトの名無しさん
07/04/03 00:01:03
別に困らんよ。
何をしたいかによっては差があるだろうけど
だいぶ前からしょぼしょぼなサブセットなんてないでしょ。
44:デフォルトの名無しさん
07/04/03 00:03:47
>>41
コンパイラを買う時代は終わったよ。
最適化性能にはそれぞれ癖があるが、入門レベルじゃ違いなんかわかりゃせん
45:デフォルトの名無しさん
07/04/03 00:05:21
>>41
そもそもコンピュータの性能が10年間で物凄く向上したし、コンパイラの技術も向上した。
Borland C++やGCCも全然問題ない。
そして社会も変わった。
今はMicrosoftすらコンパイラはおろかIDEもフリーで公開している。
もうコンパイラを売るような時代ではなくなった。
まあでもIntel C++はすごいという噂は良く聞くけどな。
46:デフォルトの名無しさん
07/04/03 00:22:12
そうなんですか。
何でも無料になるのも開発者にとって損じゃないですかね?
47:デフォルトの名無しさん
07/04/03 00:40:56
>>46
プログラムを作る動機は金だけじゃない。
金が最終目的だとしても、企業であれば宣伝効果というものもある。
48:ひろゆき@どうやら管理人
07/04/03 00:46:30
>>46
一般の企業やプログラマにとってはむしろ得じゃまいか?
MSとか某は別として。MSとか某の場合は>>47の言うとおり
49:デフォルトの名無しさん
07/04/03 00:48:36
ひろゆきのお尻ゲット
50:デフォルトの名無しさん
07/04/03 00:56:23
何処で聞いたらいいのか分からないのでこちらで
質問させて下さい。
現在就職活動をしていて先日中小メーカーの面接に行ったのですが、
プログラミング経験はあるか、と聞かれました。
社内SEというものを募集しているとのことでした。
その場では無いと答えたのですが、中学校でパソコン部に所属して
いたとき、暇だったので部室にあったシューティングゲームの
プログラムらしきものが書いてあるマニュアルを見ながらtowns(?)
とかいうOSで凄くショボイゲームを作ったことがあるのですが、この
ような経験でもプログラミング経験アリといえるのでしょうか?
…自分でも意味不明なことを聞いていると思うのですが、どなたか
よろしくお願いします。。
51:デフォルトの名無しさん
07/04/03 00:58:47
>>50
それはマ版ネタだとからプログラマー板へ
52:デフォルトの名無しさん
07/04/03 01:07:18
>>50
昔なんてどうだっていい、今、プログラミングをCなりC++なりJAVAなり
なんなりと、現在出来るかどうかだろ。
まぁ、経験ありますと言ったら仕事増えるだけだから
やめとけばいいじゃん
53:デフォルトの名無しさん
07/04/03 01:08:33
だいたい、コンパイラの売上げなんて、Office等の売上げに比べたらたいした額にはならないしね。
だからって、コンパイラ製品自体を売るのをやめて
他の企業がOffice競合製品を開発できないようにすべき、という話には
決してならない。
54:50
07/04/03 01:25:49
スミマセン、プログラマー板で伺ってきます。
でもなんか関係ないみたいですね。。
55:デフォルトの名無しさん
07/04/03 03:32:20
0からはじめるゲームプログラムのページで
スケルトン使ってゲーム作れるまでになったのですが
細かいことが分からないので質問させてください
・スプライトを使って加算合成する方法
・テキストを表示するとフルスクリーンにできなくなるのはなぜか
下は自分のソースのせいかもしれないですが
何か分かることがあればお願いします
56:デフォルトの名無しさん
07/04/03 08:14:12
>>55
情報が少なすぎて何言ってる不明だが
文脈からするに DirectX の話か?
もしそうなら DirectX 関連のスレへ。
57:デフォルトの名無しさん
07/04/03 12:21:23
class A{
public:
static double a;
};
double A::a=10;
int main(void)
{
A x;
x.a=15;
A y;
}
とすると、A yで再びaが10にリセットされてしまいますが、
a=15を維持したままにすることはできないでしょうか?
クラスで共通の変数aを使いたいのですが、
クラスがどこかで作成されるたびに、aの値がリセットされてしまい、困っています。
58:デフォルトの名無しさん
07/04/03 12:36:00
リセットされないよ。どうやって確認したんだ?
59:デフォルトの名無しさん
07/04/03 18:43:19
シラネ
60:デフォルトの名無しさん
07/04/03 19:00:45
ARMコンパイラ(ADS)でnewのオーバーライドをしたいんですが、
「Error: C3009E: 'operator new' must have a return type of 'void*' and have a first argument of type 'size_t'」
こんなエラーが出てしまいます。
実装はこんな感じです。
class base{
static void * operator new( size_t size) {
return malloc_local(size);
}
}
間違いの指摘や、ご存知な事がありましたら教えてください。
61:60
07/04/03 19:02:45
class base{
public:
static void * operator new( size_t size ) {
return malloc_local(size);
}
};
すみません。修正。
62:20
07/04/03 20:30:43
すみません自己解決したと申しましたが未解決ですので
再度ご質問させて下さい。
現在、プロジェクトに(通常)C++クラスファイルを追加して
クラスの中にメソッドを組み込み他メソッドより(ボタンクリックイベント)
① C_plus2.cpp
② C_plus2.h
①にプログラム本体(メソッド)を記述し、②にプロトタイプ宣言を
行った上でWindowsForm上のボタンクリックイベントより①に本体のある
メソッドを呼出そうとしているのですが呼出す事が出来ません。
(インテリセンスは通りますがエラーになります。)
どうすれば2ファイル(*.cpp & *.h)に分けたクラスに記載のメソッドを
呼出す事が出来るのでしょうか?
※ヘッダーファイルにメソッド本体を記述すると、ボタンクリックイベント
の内部に通常の呼出しコードを気記述することによりメソッドを呼出せます。
(ヘッダーファイルにメソッドを全て記述すれば他クラスと2ファイル
63:20
07/04/03 20:32:42
『訂正』です。
(ヘッダーファイルにメソッドを全て記述すれば
問題無くボタンクリックイベント内部から①に本体のあるメソッドを呼出す
事が出来ます。)
64:デフォルトの名無しさん
07/04/03 20:58:20
>>60
class base{
public:
void * operator new( size_t size ) {
return malloc_local(size);
}
};
65:デフォルトの名無しさん
07/04/03 21:08:42
>>63
↓こんなんで動いてるけどそうじゃなくて?
○test.h
class CTest{
public:
CTest(){};
~CTest(){};
void debug( char *str);
};
○test.cpp
#include "stdafx.h"
#include "test.h"
void CTest::debug(char *str){
OutputDebugString(str);
}
○XXXDlg.cpp
#include "test.h"
void CXXXDlg::OnBnClickedOk()
{
CTest hoge;
hoge.debug("OK\n");
//OnOK();
}
66:60
07/04/03 21:18:22
>>64
static削っても、同様のエラーが出ます。
class base{
public:
void * operator new( size_t size ) {
return 0;
}
};
malloc_local()に起因してるのではないかと思い、
してみましたが、これも変わらず。
67:C++初心者?
07/04/03 21:23:47
スレを探してみたのですがなさそうなのでここに書かせていただきます。
只今、VC6を使用してPro*Cのプログラミングをしているのですがビルドすると不要なBreak文がありますとエラーが出てしまいます。
プログラムの流れとしては
①DBからデータを取得する
②取得したデータをもう片方のテーブルと差分を取り対象のデータを取得する。
③②で取得した差分のデータをワークテーブルにインサートする
今の問題の現象は③でおきています。
うまく説明できていないと思うのですが、何かヒントとなるようなことを教えていただけるとありがたいです。
DBはオラクル9を使用しています。
68:デフォルトの名無しさん
07/04/03 21:37:36
ストアドならDB板で聞けばいいんじゃね
69:20
07/04/03 21:39:00
>>65さん
解決しました。どうもありがとうございます。
どうやら #include <hoge2.h> の記述位置を using 直下(同一スコープ)
に記述していたことが原因でした。
本当にありがとうございます^^;
70:デフォルトの名無しさん
07/04/03 22:13:07
質問させてください。
いま、プログラムの勉強もかねて作ってみたいPGがあるのですが、C#で作ったほうがよいのか、
C++で作ったほうが良いのか迷っております。
作ってみたいPGとは、オンラインゲームの麻雀ゲームの支援ソフトです。
既存の画面だとどうにもやりづらくて、それならば勉強もかねて、
専用のGUIを作成し、このボタンを押したらこの牌をすてるだとか、
自分のやりやすいようにGUIを作成してみたいなと、思ったわけです。
色々調べてみたのですが、C#というのはC++とVBの良いところを持ち合わせたものだとか
というのはわかったのですが、ではこのようなPGを作ったときの相性はどちらが
よいのだろうと疑問がでました。
また、WinnyはC++で作成されており、なぜC#ではつくられていないのだろうという
疑問もあります。
もし、お分かりになる方がいらっしゃれば、ご教授願えないでしょうか?
71:デフォルトの名無しさん
07/04/03 23:10:23
> オンラインゲームの麻雀ゲーム
ってのがそもそもどういうのかによるかな。
場合によってはUWSCみたいなマクロのがよい。(非GUIだけど)
作りたいものってのは置いといて、言語の勉強ならC#でいい。
C++は悪い意味で多くを受け入れすぎ。先にモダン言語に矯正されとくといい。
> また、WinnyはC++で作成されており、なぜC#ではつくられていないのだろう
C++は一番融通が利くからね。RADからアセンブリまできめ細かく。
ということで、C#ならスレ違いになるので他で勉強してください。
72:デフォルトの名無しさん
07/04/04 00:40:52
>>67
Pro*CはCじゃないからここで回答は得られにくいかと。
つーか、折角Oracleに大枚叩いているんだろうから聞けばいいじゃん。
73:デフォルトの名無しさん
07/04/04 01:01:07
>>70
C#でもC++でも、使いこなせるほうで作れば良いじゃん。
っていうか、勉強がてらか。
気楽にやれると思いきや結局DllImportで
api使う事になっちゃうC#?
mfcを使ってみてはむかついて、クラス設計で悩んで
頭がクラクラしちゃうC++?
メッセージ毎の処理と、api群や自作関数とたわむれて
しまいに何の処理書いてるのかわからなくなるC?
ま、C#で良いか。
>WinnyはC++で作成されており
>なぜC#ではつくられていないのだろう
C#登場2001年Winny2002年5月に公開
74:デフォルトの名無しさん
07/04/04 13:18:34
ofstreamでは書き込みバッファの容量はどこで指定すればよいのでしょうか?
75:デフォルトの名無しさん
07/04/04 16:01:07
setvbuf()と同じような物を考えているんならそういうのは無いよ
76:デフォルトの名無しさん
07/04/04 16:07:00
>>74
streambuf::pubsetbuf()
77:デフォルトの名無しさん
07/04/04 16:19:51
>>75
C++ストリームはCのFILE*でできたことなら
何でもできるようになっていると思って間違いない
78:デフォルトの名無しさん
07/04/04 18:00:11
*関数ってどういう意味?
あとUNIX(XWINDOW)とVCのchar型って何バイト違うんですか?
2個目の質問の解説等が日本語で載ってるサイト知ってたら教えてください。
79:デフォルトの名無しさん
07/04/04 18:33:35
>>78
1. 式の中ならあってもなくても同じこと。
URLリンク(www.kouno.jp)
2. sizeof (char)は常に1と定められている。
1バイトが8ビットとは限らないが、それは基本的にCPU次第。
URLリンク(www.kouno.jp)
80:デフォルトの名無しさん
07/04/04 19:52:47
>>78
関数ポインタのことか?
81:デフォルトの名無しさん
07/04/04 19:59:31
char *Func();
みたいのを*Funcで一塊だと思ってるとか?
82:78
07/04/04 20:03:16
>>79
レスどうもです。
1なんですが、宣言で*関数とあります。戻り値は関数の中でchar *r
と宣言されたものがreturn rで返ってます。
使われる場合は
i=*関数;
ってなってます。
ようするに関数に*がついてるからiにはrの中身が代入されるんですか?
ポインタと同じで
紹介してもらったHP見たんですが、質問の仕方が悪かったため
違う様な気がします…
情報小出しにして申し訳ないですがもう一度教えてください。
83:デフォルトの名無しさん
07/04/04 20:34:30
int hoge() //返り値はint型
{
int ret=うんたら;
return ret;
}
char * hoge2() //返り値は(char *)型
{
char *ret=うんたら;
retern ret;
}
何の違いもない。
84:78
07/04/04 21:30:02
>>83
ありがとう!!
85:デフォルトの名無しさん
07/04/04 21:34:46
先生、>>83の下の例はちょっとまずいと思いまーす
86:デフォルトの名無しさん
07/04/04 21:37:36
場合によってはまずいが、全ての場合でいけないわけじゃなかろう
87:デフォルトの名無しさん
07/04/04 22:26:13
どこがまちがえているのでしょうか?ループします
#include <stdio.h>
#include <dir.h>
main(){
char b[1024];
struct ffblk Fd;
do{
if( findfirst("*",&Fd,FA_RDONLY|FA_HIDDEN|FA_ARCH)==EOF)break;
printf("%s\n",Fd.ff_name);
}
while(!findnext(&Fd));
}
88:デフォルトの名無しさん
07/04/04 22:27:04
そりゃぁ、毎回findfirst()したらいつまで経っても終わらん罠。
89:デフォルトの名無しさん
07/04/04 22:29:46
>>88
ありがとうございます
わかりました
90:824
07/04/04 22:50:26
C++.netでは文字列を連結したい場合
Debug::WriteLine("A","の値は","ホゲです。");
という風にしか連結することは出来ないのでしょうか?
C#の場合だと
Debug.WriteLine("A" + "の値は" + "ホゲです。");
といった感じで連結出来るのですがC++.netでもお手軽な連結
方法は何かありますか?(VS2003利用です。)
91:デフォルトの名無しさん
07/04/04 22:57:27
それくらいしかないと思う。
WriteLine以外ではString::ConcatとかStringBuilderを使っておけ。
ネイティブなstd::wstringに変換する関数を作ってやるなんて方法も考え付くけど、
それはそれで色々制限があって面倒だろう。
ちなみにVC++ 2005 (C++/CLI)だとマネージドでも演算子多重定義が使えるようになった。
92:デフォルトの名無しさん
07/04/04 23:39:49
>>91
そうですか。残念ですが諦めます。
やっぱりC#が一番便利です。
93:デフォルトの名無しさん
07/04/04 23:45:48
配列の配列を参照渡しするとき
どうやってわたせばいいんでしょうか
94:デフォルトの名無しさん
07/04/04 23:51:27
typedef int ARR[5][5]
void f(ARR&);
ARR a;
f(a);
95:デフォルトの名無しさん
07/04/05 09:15:38
>>94
配列の配列といっても二次元配列じゃなくて
96:デフォルトの名無しさん
07/04/05 10:31:05
Turbo C++のC言語の使い方がまったくわからなくて困ってます
BccDevやVisualC++なら
#include <stdio.h>
//---------------------------------------------------------------------------
int main(void)
{
printf("hello");
return 0;
}
//---------------------------------------------------------------------------
を保存してデバッグなしで開始するとウィンドウが現れてちゃんとhelloと表示されます。
ところがTurboでコンソールアプリケーションでC言語を選び
上記の操作をすると一瞬ウィンドウが開いたかなと思ったら即閉じてしまうんです
hello だけ表示できればあとは何とかなると思いますがそこまで教えていただけませんか?
97:デフォルトの名無しさん
07/04/05 10:46:52
>>96
キー入力、時間待ちをいれろ
98:デフォルトの名無しさん
07/04/05 11:36:42
>>97
#include <stdio.h>
int ch;
int main(ivoid)
{
printf("pl");
ch=getchar() ;
return 0;
}
getchar を使ってwindowを表示しEnterを押すと消えるようになりました
とりあえずしばらくこれでやってみます。
ありがとうございました
99:デフォルトの名無しさん
07/04/05 11:49:43
C++を使ってのWeb開発を行うことになったんですが可能なのでしょうか?
100:デフォルトの名無しさん
07/04/05 11:51:54
可能
101:デフォルトの名無しさん
07/04/05 15:11:46
インライン関数とstaticの違いって何ですか?
インラインは関数のみに使うもの?
それともCとC++の違いですか?
102:デフォルトの名無しさん
07/04/05 15:17:05
staticは外部変数と内部変数と関数のそれぞれにおいて少しずつ意味が違う。
inlineは関数にのみc99やc++で使用できる。
103:102
07/04/05 16:12:31
>>102
staticで外部変数ならそのファイルでのみ有効
内部変数ならその関数の内部のみで有効
関数はそのファイルでのみ有効
ということですか。ありがとうございます。
104:102
07/04/05 16:13:20
自分は101です…
間違った
105:デフォルトの名無しさん
07/04/05 21:13:20
WinXP Pro VS2005の開発環境を持っている者からの質問です。
信頼できる知人からVC++6.0で動いているソースコードを頂きました。
実際、コンパイルできるところと、実行できるところは確認済みです。
そのコードをVS2005に移植してみようと思い、コンパイルをかけてみたのですが、
CString CxxxDoc::Func()
{
//中略
return -1;
}
のようなコードがありました。VC++6.0Proでコンパイルが通っている事を確認したので、
ソースに間違いはないと思っていたのですが……、これは一体どういうことでしょうか。
VC++6.0では、こんなコードが許されるのでしょうか?
知人の環境はXP Pro VC6.0 Proです。
よろしくご解答お願いします。
106:デフォルトの名無しさん
07/04/05 21:17:13
#define ishigh(c) ((c) >= 0x80)
というマクロが定義してあるのですが、コレどういう意味なのでしょうか?
こんなマクロ初めてみた上にishigh(c)なんてソースの中のどこにもなくて
困っています。
107:デフォルトの名無しさん
07/04/05 21:21:39
>>105
VC++ 6のやつの代わりにVC++ 2005 (ATL/MFC 8)のCStringTのコンストラクタを見てみたけど、
URLリンク(msdn2.microsoft.com)(VS.80).aspx
有り得そうな可能性としては、次のどちらか。
•_variant_t1つを引数に取るもの
•char/wchar_t1つとその長さ(デフォルト引数=1)を取るもの
標準C++では複数回の暗黙の変換はやらないことになっており、
VC++ 2005がそれに準拠するようになったからだと思う。
>>106
charが8ビットだとして、最上位ビットが立っているかどうかということだろう。
108:デフォルトの名無しさん
07/04/05 23:19:08
struct Test{
bool a;
bool b;
};
これが定義されてて
cppファイルに
Test func(Test t){
return t;
}
こういう関数を作りました
そして.hファイルに
Test func(Test t);
と定義しても宣言構文エラーになっちゃいます
どうしたらいいでしょうか
わかりづらくてすいません
109:デフォルトの名無しさん
07/04/05 23:21:41
Test func(Test t);
↓
struct Test func(struct Test t);
110:デフォルトの名無しさん
07/04/05 23:22:03
>>108
そのTest構造体が定義されているのはどこだ?
111:デフォルトの名無しさん
07/04/05 23:23:22
>>109
ヒント:cppファイル
112:デフォルトの名無しさん
07/04/05 23:27:56
Common.hに.hファイルは全部includeしてあって
cppファイルは全部Common.hをincludeしてあるんですが
Test構造体が定義してあるのは他の.cppファイル.hファイルとは違う.hファイル
です
そこに問題があるんでしょうかね
113:デフォルトの名無しさん
07/04/05 23:30:20
>>112
エラーメッセージをコピペして下さい
114:デフォルトの名無しさん
07/04/05 23:35:30
エラー E2141 C:\My Documents\Project3\Npc.h 112: 宣言の構文エラー
ふたつ定義すると
エラー E2141 C:\My Documents\Project3\Npc.h 112: 宣言の構文エラー
エラー E2238 C:\My Documents\Project3\Npc.h 114: 'MAP_SCENE' の宣言が複数見つかった
エラー E2344 C:\My Documents\Project3\Npc.h 112: 一つ前の 'MAP_SCENE' の定義位置
エラー E2141 C:\My Documents\Project3\Npc.h 114: 宣言の構文エラー
115:デフォルトの名無しさん
07/04/06 00:24:59
インクルードガードがないのかな
116:デフォルトの名無しさん
07/04/06 01:01:32
とりあえずCommon.h内に
struct Test;
の行を入れてみてから、もう一度
117:デフォルトの名無しさん
07/04/06 07:43:18
Common.hにstruct Test;入れたら大丈夫でした!
でも参考にしている人のソースにはそんな文ないんですが
どうしてなんでしょうか
118:デフォルトの名無しさん
07/04/06 07:51:43
ヒント:
インクルード順序
119:デフォルトの名無しさん
07/04/06 09:52:10
でも順序がある時点でヘッダの不具合だよな
120:デフォルトの名無しさん
07/04/06 10:47:30
初歩的な疑問があるんですが、お教え願えないでしょうか。
環境はVS.NET 2003です。
MSDNチュートリアルを見ながら、ATL のActiveX コントロールを作ってみたんですが、dll の容量が324Kbでした。
同様の物を MFC で作った ocx の容量は144Kbでした。
てっきり ATL の方が小さくなると思ってたんですが...
ひょっとして、MFC の方は別途必要な物があるんでしょうか?VBRUNJPなんとかみたいに。
どうかよろしくお願いします。
121:デフォルトの名無しさん
07/04/06 11:30:05
>>120
静的にリンクする(ルーチンを自分で持つからでかくなる)か
dllを使う(dllを呼ぶから自分は小さいが実行時に呼ぶdllが必要)かは
ATL, MFCともにプロジェクトのプロパティで設定できる。
デフォだとATLは静的リンクでMFCは共有dllだったかも。
MFCで共有dllにしたときに必要なdllは、vectorとかでパッケージになってます。
122:デフォルトの名無しさん
07/04/06 21:09:15
CでCGI作ろうとしてるんですが、普通にコンパイルすると生成される実行ファイルは
.exeになってしまいます。exeでもcgi-binのディレクトリに置けばCGIとして実行されますが
URLの最後がexeだと怪しいファイルをDLさせようとしているのだと勘違いされるかもしれないので
拡張子をCGIにしたいんですけど、どうすればいいんですか?
Visual Studio.net使ってます
123:デフォルトの名無しさん
07/04/06 21:17:34
ren *.exe *.cgi
124:デフォルトの名無しさん
07/04/06 21:22:46
>>123
すみません、それはどこに記述すればいいんですか?
125:デフォルトの名無しさん
07/04/06 22:22:05
コマンドプロンプト
126:デフォルトの名無しさん
07/04/07 00:32:34
グローバル変数について、気になったことがあるので質問させてください。
「グローバル変数の作成順番というものは、存在するのでしょうか?」
(例えば、ポインター変数の方が優先的に作られるとか。)
(下記のプログラムを例とする):
なぜ、このような質問をしたかというと、
もし、グローバル変数の順番が決まってないと、
先にhoge g_obj;が生成された場合、
g_objのコンストラクタ内でまだ作成されていないg_pが使用されることに
なってしまい、危ないと思ったからです。
//グローバルな場所
int *g_p=0;
hoge g_obj;//オブジェクトを作ることで、このクラスのコンストラクタ発動
//hogeクラス
class hoge{
hoge(){//コンストラクタ内
g_p = new int;//g_pを使う
}
};
どうかよろしくお願いします。
127:デフォルトの名無しさん
07/04/07 00:44:22
ググればすぐに出る。
128:デフォルトの名無しさん
07/04/07 00:54:36
>>127
初心者にそれはないだろ、取り合えず、おまい、氏ね
129:126
07/04/07 01:32:14
>>127
グローバル変数 順番 などで一通り検索して、見つからなかったので
ここで質問させてもらいました。
意地悪言わないで、どうかご教授お願いできないでしょうか?
130:デフォルトの名無しさん
07/04/07 01:36:31
×ご教授
○ご教示
知らない言葉を無理して使わないほうがいい
131:デフォルトの名無しさん
07/04/07 01:40:49
ぐぐればすぐ出てくる
グローバル変数の初期化順序は不定
132:デフォルトの名無しさん
07/04/07 01:40:51
非ローカルなstatic変数の初期化順には何の規定もないので、
初期化順に依存するコードからは、鼻から悪魔が出る可能性がある。
現実には、「初期化コードを必要としない(POD)データ」は
最初から実行ファイルに含められて(必要なら開始時にコピー)いるし
「初期値が与えられてない変数」は、スタートアップルーチンで0に埋められる。
133:126
07/04/07 02:16:22
>>130
勉強になりました^^;
>>131
>>132
グローバル変数 順序 で検索したら、出てきてくれました。
順序が不定ということがはっきりわかりました。
これで安心して眠れます。
ご回答ありがとうございました!
134:デフォルトの名無しさん
07/04/07 03:38:38
zero initialization
static initialization
dynamic initialization
の順に初期化される(らしい)ので依存できたりできなかったりする
135:デフォルトの名無しさん
07/04/07 08:10:16
String s;
//char s[50]; いつもはこっちでした。
char* str="hello";
sprintf(s.c_str(),"%s",str);
OutputDebugString(s.c_str());
buiderの環境になりまして、動的な感じで文字列の
長さを扱いたいと思ってます。
上記のようにすると、"hello"が出力されましたが、
こういう使い方しても大丈夫でしょうか?
136:デフォルトの名無しさん
07/04/07 08:54:19
>>135
String s が別のものならばなんともいえんけど、
stlのstringだったら、const cahr *c_str() だと思うからコンパイル時にエラーとか警告が出てない?
s = str で十分だろう。
137:デフォルトの名無しさん
07/04/07 23:03:52
>>135
Stringって何。typedef std::string String とかやってんの?
だとすると、
sprintf(s.c_str(),"%s",str);
こんなことやっちゃ駄目。
sprintf()には十分なサイズの書き込み可能な領域を指す非constなcharポインタを
渡さなければならない。
sprintf()はもともとC++ではその型安全性の無さによって好ましくないと
言われている(snprintf()ではなくsprintf()を使うなら、バッファ
オーバーフローの問題もある)。
代表的な代案は
1) std::sstreamを使うか、
2) printf-likeにやりたいなら、非標準だがboost::formatなり類似のものを使う
ってとこだ。
138:デフォルトの名無しさん
07/04/08 00:13:18
BCBのStringは、AnsiStringのtypedef。
まあ、c_str()がconstなchar*を返す点は全く同じだが。
139:デフォルトの名無しさん
07/04/08 00:39:56
SirectShow 始めたばかりです。ビデオプレーヤーとか作って楽勝じゃーて思ってですね。
いっちょフィルターでも作ってみるかとググってみたら、理学博士の方がソース公開してるの見つけました。
やったーと思って目を通してみたんですが...むずい!
即効寝ちゃって今だに鬱の自分。。。氏んだほうがいいですか?
ソース URLリンク(open.nime.ac.jp)
140:デフォルトの名無しさん
07/04/08 04:33:31
>>139
SirectShowだろうがDirectShowだろうが、やってみて
壁に当たってあきらめようと思ったり、頭ん中真っ白になって
もうわけわからんってなったりしても、やり続ければ実は実る。
Cを勉強しだした頃を思い出せ、ポインタや構造体や再帰やetc
いろいろ壁にぶち当たってきただろ、それでも続けてきたから
今があるんだろうが。
時計の針だぞ、前に進まなきゃ捨てられるんだよ。
でも寝とけ。
俺はC#で苦戦中じゃ。
141:デフォルトの名無しさん
07/04/08 09:31:16
>>140
寝たらちょっと復活。気長にやります。アリ。いっぺんに全部理解しようとしてた。神か>>141
C#か。FrameWork 覚えるので苦戦してるのかな。ガンガレ、でも寝とけ。
142:デフォルトの名無しさん
07/04/08 14:04:10
Visual Studio.NET使ってます
Debugモードだとビルドできるのですが
Releaseモードにするとエラーがでてビルドできません
しかも、そのエラーは自分のソースじゃない部分で起きているんです
未解決の外部シンボル _GUID_PerfMasterTempo が関数 "int __cdecl AdoInit(void)" (?AdoInit@@YAHXZ) で参照されました。
こういう感じのエラーがたくさん出てます
どうすればいいんですか?
143:デフォルトの名無しさん
07/04/08 15:08:40
privateメンバーに構造体のポインタを宣言
コンストラクタでnewによりメモリを割り当てて、以降メンバー関数で使いたいのですが
何故か割り当てたはずのメモリが解放?されている模様。
(Access Violationエラーになり、ポインタのアドレスも0xcdcdcdcdに)
こういう使い方って出来ないのでしょうか?
144:デフォルトの名無しさん
07/04/08 15:13:27
何の問題もありませんが。
再現する最小のソースを晒して味噌。
145:デフォルトの名無しさん
07/04/08 15:24:39
typedef struct {
int a;
int b;
} _ST_KIHON;
class Myclass
{
private:
_ST_KIHON *m_stKihon;
public:
Myclass();
~Myclass();
void Set(int, int, int);
};
Myclass::Myclass()
{
_ST_KIHON *m_stKihon = new _ST_KIHON[20000];
memset(m_stKihon, 0, sizeof(_ST_KIHON) * 20000);
}
Myclass::~Myclass()
{
delete []m_stKihon;
}
void Myclass::Set(int a, int b, int n)
{
m_stKihon[n].a = a;
m_stKihon[n].b = b;
}
146:デフォルトの名無しさん
07/04/08 15:25:18
(改行が多すぎると怒られるので分割しました。)
void main()
{
Myclass *cmy = new Myclass;
cmy->Set(1,2,0);
}
再現するソースを載せます。環境はVC6です。cmy->Setでアクセスする際、落ちてしまいます。
147:デフォルトの名無しさん
07/04/08 15:35:00
> _ST_KIHON *m_stKihon = new _ST_KIHON[20000];
ローカル変数に突っ込んでどうする。
148:デフォルトの名無しさん
07/04/08 15:36:00
ワロッシュw
149:デフォルトの名無しさん
07/04/08 15:40:49
え?
privateに宣言しているポインタではなくローカルで宣言していることになってるのか?w
150:デフォルトの名無しさん
07/04/08 15:52:01
×_ST_KIHON *m_stKihon = new _ST_KIHON[20000];
○m_stKihon = new _ST_KIHON[20000];
151:デフォルトの名無しさん
07/04/08 16:32:10
>>150
ありがとう
152:デフォルトの名無しさん
07/04/08 17:11:28
>>150
初期化子使えよ
153:デフォルトの名無しさん
07/04/08 17:28:06
>>152
どっちでも一緒だよ
154:152
07/04/08 17:44:05
>>153
そうだよ、単に気分の問題。
155:150
07/04/08 18:12:10
>>152
最低限の修正にしてみた。
156:デフォルトの名無しさん
07/04/09 02:34:06
vc++を勉強しています
関数呼び出しのときアドレス呼び出しをすると呼び出し元の
変数の値を呼び出し先の関数内部で書き換えることができるのは理解しています
同じようにポインタ変数を書き換えたいのですが、どうやってアドレス呼び出ししたらいいのでしょうか?
よろしくお願いします。
157:デフォルトの名無しさん
07/04/09 02:46:10
>>156
char * foo;
someFunction(& foo);
ということをしたいのなら、
void someFunction(char ** bar);
158:デフォルトの名無しさん
07/04/09 02:55:17
>>157 なるほど!ありがとうございました。
159:デフォルトの名無しさん
07/04/10 03:36:50
メンバーイニシャライザで0を指定するとどうなるんですか?
160:デフォルトの名無しさん
07/04/10 03:54:30
日本語でおk
161:デフォルトの名無しさん
07/04/10 08:24:08
include <stdio.h>
int main (void)
{
unsigned int ch;
ch = 'あ';
printf("%c\n",ch);
return 0;
}
で「あ」が表示されないのですけれど、
どうすれば表示されるのでしょうか?
162:デフォルトの名無しさん
07/04/10 08:36:56
#include <stdio.h>
int main (void)
{
char ch[] = "あ";
printf("%s\n",ch);
return 0;
}
163:デフォルトの名無しさん
07/04/10 08:38:09
#include <stdio.h>
int main (void)
{
char* ch = "あ";
printf("%c%c\n",ch[0],ch[1]);
return 0;
}
164:デフォルトの名無しさん
07/04/10 08:39:27
#include <stdio.h>
int main (void)
{
char* ch = "あ";
printf("%c%c\n",*ch,*(ch+1));
return 0;
}
165:デフォルトの名無しさん
07/04/10 08:42:29
#include <stdio.h>
int main (void)
{
int ch = 'あ';
printf("%c%c\n",ch&255,ch>>8);
return 0;
}
166:デフォルトの名無しさん
07/04/10 08:49:09
これは酷い荒らし
167:デフォルトの名無しさん
07/04/10 10:35:11
if ( lh == LOW){
if ( c == ESC){ code = JIS}
else if ( isspace(c) || isprint(c)) { }
else if ( c >= 0x80{
if ( code == JIS) return BIN;
lh = HIGH;
}
else { return BIN;}
}
というコードで
else if ( isspace(c) || isprint(c)) { } は
条件式が真の場合何も実行されなくて、
このif ( lh == LOW)のブロックから何も返さず抜けるのでしょうか?
それと
if ( code == JIS) return BIN;
lh = HIGH;
の部分はcodeにJISが代入されていた場合return BINが実行されて、関数が終了するから
lh = HIGH;は実行されないんでしょうか?
168:デフォルトの名無しさん
07/04/10 12:53:55
1) はい
2) はい
169:デフォルトの名無しさん
07/04/10 12:55:45
>>168
ホントですか?
まったくあてずっぽうに解釈したのに俺ってセンスいいのかな?
170:デフォルトの名無しさん
07/04/10 12:57:33
センスとか以前の問題だろ。
171:デフォルトの名無しさん
07/04/10 15:18:43
色々突っ込みたいが敢えて何も言うまい。
172:デフォルトの名無しさん
07/04/10 15:38:13
↑こういう思わせぶりなこと言う人いるよねぇ。
こんな事言って何も言わないなら最初から何も言わなきゃいいのに。
173:デフォルトの名無しさん
07/04/10 17:11:08
そういうお前の書き込みに、意味はあるのか?
174:デフォルトの名無しさん
07/04/10 17:12:15
>>173の書き込みよりはあると思うな。
175:デフォルトの名無しさん
07/04/10 19:07:42
ソースファイルでメンバ関数を書くときに
親クラス名::メンバと書かなければいけないわけですが、
この親クラス名が長けりゃを何回も書くのが面倒なので#defineマクロつかって短くしちゃう
ってのはありなんでしょうか?
元に戻すとしても、検索置換一発なんであまり悪く無いとは思うんですがどうなんですか?
176:デフォルトの名無しさん
07/04/10 19:09:28
やったこと無いからできるんか知らんけどできるならありだろ
ていうか毎度クラス名タイプしてんの?
普通コピペだと思ってた・・・
177:デフォルトの名無しさん
07/04/10 19:09:45
>>175
IDEの支援機能 or コピペでいいじゃん
178:デフォルトの名無しさん
07/04/10 19:16:40
できるできないは別として、そんなソースコード読みたくない。
あくまで自分用ならやってみてもいいとは思うけど。
179:デフォルトの名無しさん
07/04/10 19:19:51
やっぱり読みにくくなるんですか?
慣れの問題以外で何か理由とかあるんでしょうか?
180:デフォルトの名無しさん
07/04/10 19:36:30
あるていど長くても分かりやすい名前なら問題ない。
長い上に意味が不明瞭で、しかも似たような関数や変数が点在したりすると目も当てられない。
181:デフォルトの名無しさん
07/04/10 20:31:16
>>175
せめてマクロよりはtypedefを使え
182:デフォルトの名無しさん
07/04/10 20:33:07
>>181
ちょw
183:デフォルトの名無しさん
07/04/10 21:09:51
>>181
マジすか!
184:デフォルトの名無しさん
07/04/11 03:52:55
定義の部分なんだから変に略そうとするなよ。
185:デフォルトの名無しさん
07/04/11 05:08:58
Cだけど、関数の仮引数を#defineしちゃうことはあったな。
そのときは関数ポインタを使う必要があって、同じ引数を持つ関数が10個くらいあったから。(しかも長い)
186:デフォルトの名無しさん
07/04/11 05:14:36
構造体にして渡すという方法は思いつかなかったのか
187:デフォルトの名無しさん
07/04/11 08:54:00
ヘッダにinlineとして定義できないような長い関数は作るべきではない
ゆえに.cppは不要
188:デフォルトの名無しさん
07/04/11 09:25:21
それ、このスレのネタじゃないから。
189:185
07/04/11 15:11:58
外部から呼び出す関係で、引数が指定されてた。
今にして思えばラッパ関数でも作ればよかったんだが。
でも、引数が多くなった時に構造体使うのってなんか好きになれない。
あ、複合リテラル使えばいいのか……C99対応してないけど……。
190:デフォルトの名無しさん
07/04/11 23:52:46
char **namelist;
これを関数に渡して中身を更新するようにしたいのですが、
引数の指定や渡し方がいまいち分かりません。
誰かアドバイスおねがいします
191:デフォルトの名無しさん
07/04/11 23:56:13
どう更新するのか分からんので何とも言えない
192:デフォルトの名無しさん
07/04/12 00:02:12
関数の中でダブルポインタに配列を作成して、
その配列のアドレスを**namelistに返したいと思っています。
193:デフォルトの名無しさん
07/04/12 00:13:14
ダブルポインタってなんですか?
194:デフォルトの名無しさん
07/04/12 00:18:31
えと、私の持ってる本では「ポインタのポインタ」=「ダブルポインタ」みたいなことが書いてあったので、
その言葉を使用しました
195:デフォルトの名無しさん
07/04/12 00:40:17
>119
>関数の中でダブルポインタに配列を作成して、
>その配列のアドレスを**namelistに返したいと思っています。
そのまま渡せばいいんじゃないの?
いいから書いた関数をあっぷしてみ。
じゃなければ呼び出し側をあっぷしてみ。
話はそれからだ。
196:デフォルトの名無しさん
07/04/12 03:27:00
>>192の質問に近いのですが、私もおそらく同じ問題に直面しています。
main()
{
STAT stat[5];
func(stat);
}
func(STAT *stat[])
{
for(int i=0;i<5;i++)stat[i]->menber1=1;
}
上のように、構造体STATを要素数5の配列で宣言して、
その中身を関数funcで操作したいのですが、エラーがでてしまいます。
(上のままだと「STAT * 型は STAT ** 型に変換できない」という具合でエラーがでます)
これはどこが間違っているのでしょうか・・・よろしければご助言お願いします。
197:デフォルトの名無しさん
07/04/12 03:55:41
>>196
STAT型のポインタを保持する配列statの中身はSTAT*だから
STAT stat[i]って宣言だとstat[i]の中身はSTAT型そのものになってしまう
試しにうちの環境で適当にSTAT定義して、STAT* stat[5];って宣言したら通ったから
多分あってると思う!!
198:デフォルトの名無しさん
07/04/12 04:14:35
>>196
呼び出し元で STAT stat[5]; と宣言するなら func(STAT *stat)でstat[5]の中身を操作できる。
func(STAT *stat) { for(int i=0;i<5;i++)stat[i].menber1=1; }
ポインタを2重に使わなければいけないのは次のようなケース。
func(STAT **stat) {
int i;
*stat = malloc(sizeof(STAT)*5);
for (i=0; i<5; i++) (*stat)[i].menber1 = 1;
}
main() {
int i;
STAT *stat;
func(&stat);
for (i=0; i<5; i++) printf("%d\n", stat[i].menber1);
}
199:デフォルトの名無しさん
07/04/12 04:32:05
>>197 >>198
それぞれの方法で試したところ、上手くいきました。
質問の回答だけでなく、細かな補足説明までしていただいて
ありがとうございます。勉強になりました&&キュゥンときました。
200:デフォルトの名無しさん
07/04/12 04:34:39
もっと簡単に書く方法はないんですか?
たとえば stat[5]でSTATのインスタンスごと作ってくれて
stat[5].member[1]でアクセスできるようなの
多重間接参照ってなんかダサいですし
201:デフォルトの名無しさん
07/04/12 04:58:56
>>200
配列へのポインタとポインタの配列は別物だからな。
あとSTATの定義を晒さないとコメントできんよ。
202:デフォルトの名無しさん
07/04/12 05:38:26
>>198のコードを動かそうと以下のようなテストコードを組んでみたんですが
コンパイラを通りません、どうしてでしょうか?
#include <stdio.h>
#include <stdlib.h>
struct STAT {
int member1;
} ;
func(STAT **stat) {
int i;
*stat = malloc(sizeof(STAT)*5);
for (i=0; i<5; i++) (*stat)[i].menber1 = 1;
return;
}
main() {
int i;
STAT *stat;
func(&stat);
for (i=0; i<5; i++) printf("%d\n", stat[i].menber1);
return;
}
203:デフォルトの名無しさん
07/04/12 05:58:48
ただ通らないといわれても困るが、なんかメッセージがでてるだろ。
もしCでコンパイルしてるならtypedefがいるんじゃね?
typedef struct stat_ { int menber1; } STAT;
204:202
07/04/12 06:05:58
func()内のmallocの部分で明示的型キャストをつかったりしていくらか通してみた結果
どうやら
> (*stat)[i].menber1
がSTATのメンバであるmember1にならないのが原因のようです
これを他の部分を変えず、かつ直感的な表現に直す方法ってありますかね?
205:デフォルトの名無しさん
07/04/12 06:17:22
>>204
単なる誤字だろそれ
member1
menber1
206:202
07/04/12 06:21:01
解決しました!!
これで学校行けますありがとうございました!!!
やっぱコピペで済ませるのって慣れてないやばいんですね^^
207:デフォルトの名無しさん
07/04/12 06:39:48
>えと、私の持ってる本では「ポインタのポインタ」=「ダブルポインタ」みたいなことが書いてあったので、
そうか、面接で「ダブルポインタは自信がありますがトリプルポインタはちょっと……」なんて
すっとこどっこいなことを言ってた香具師もその本を読んでたのかも知らんな。
208:デフォルトの名無しさん
07/04/12 06:44:15
ぬるぽいんた
209:デフォルトの名無しさん
07/04/12 06:47:35
>>202
C++でこれをコンパイルしてるのなら警告でまくりだろ
210:デフォルトの名無しさん
07/04/12 07:16:54
トリプルって使う機会無いなあ
211:デフォルトの名無しさん
07/04/12 07:20:07
三次元のボリュームデータ扱う時にトリプルは使うよ
212:デフォルトの名無しさん
07/04/12 07:28:27
間接参照演算子って内部実装晒してるのと同じじゃん
*一個ならまだ許せるけど、多重はちょっと厳しいじゃん
組み込みとかC++が使えないところってそんなのばかりなの?
213:デフォルトの名無しさん
07/04/12 07:28:46
だから、ポインタに階層を意味する単語をつけるのが愚なんだって。
リンクドリストなんかどうするんだよ。
214:デフォルトの名無しさん
07/04/12 07:38:21
教科書どおりに自己参照ポインタを持った構造体を使う
これぐらいなら階層じゃなく、「次」とか「前」とか「先頭」みたいに「ポインタ」の意味で使えるから脳足りんの俺でも理解できる
で、階層構造どうやって表現したらいいの?
215:デフォルトの名無しさん
07/04/12 07:40:49
リンクトリストではポインタへのポインタは出てこないだろ
216:デフォルトの名無しさん
07/04/12 07:53:11
"ダブル"ポインタ
"トリプル"ポインタ
ダブルって言う人はアスタリスクの数を数えているのかもしれないが、
ダブルってのは階層を示すものではないと考えるのでオレは受け入れられない
217:デフォルトの名無しさん
07/04/12 08:10:19
最終的には type*************** value
のような型になるような構造も普通に出てくるのかなぁ…
218:デフォルトの名無しさん
07/04/12 08:19:25
終わってるだろ、その*の数
219:デフォルトの名無しさん
07/04/12 08:36:58
int a[1][1][1][1][1][1][1][1][1][1];
**********a = 1;
220:デフォルトの名無しさん
07/04/12 08:49:17
複雑なデータだと、構造体が3重になってるくらいはあるけどな。
221:デフォルトの名無しさん
07/04/12 13:09:08
Perlのchop()みたいな末尾を削る関数ってありますか?
std::string s = "abcdefg";
でgを削りたい場合は
s = s.substr(0,s.size()-1);とやるしかないのでしょうか?
222:デフォルトの名無しさん
07/04/12 13:15:05
>>221
You、末尾に'\0'を書いちゃえYO!
223:デフォルトの名無しさん
07/04/12 13:19:59
>>222
std::stringは直接編集してはいけない。
224:デフォルトの名無しさん
07/04/12 13:41:39
>>221
resize すれば
225:デフォルトの名無しさん
07/04/12 13:51:06
eraseでいいじゃん
226:デフォルトの名無しさん
07/04/12 14:00:49
>>224,225
ありがとうございます。resizeもeraseも自分が見てるサイトには載ってなかったもので・・・
どちらか使ってやってみます。
227:デフォルトの名無しさん
07/04/12 17:23:55
Cを独学ではじめました。「ポインタ」というのが出て来たので
ポインタを使ってメモリの0から100を読み込んでみようと下のプログラム
書いてみたのですが、実行すると、0x00000000をread出来ないと出て来ます。
どうすれば0x00000000からのデータを読む事が出来ますでしょうか?
--------------ソース--------------
#include <stdio.h>
void main(void){
int *p=0;
int n;
for(n=0;n<=100;n++){
printf("%x", *p);
}
}
228:デフォルトの名無しさん
07/04/12 17:28:06
>>227
今のOSでは一般のプログラムが見られる場所はそのプログラムに割り当てられた空間だけです。
大人しくargvの辺りでも覗いてなさい。
229:デフォルトの名無しさん
07/04/12 17:28:49
p=0はp=NULLの意味
ヌルポインタはどこも指していないポインタだから読めるわけがない
230:デフォルトの名無しさん
07/04/12 17:39:33
略してぬるぽ
この問題で一番大事なことは上の事実
231:227
07/04/12 17:45:46
>>228
でも、diskprobeとかだとMBRが読めたりしますよね?
これって全然違う話なんですかね?mbrをc言語で読み込んでみたいんです…。
というか、OS書くの忘れてました。すみません。
>>229
なるほど。
232:デフォルトの名無しさん
07/04/12 17:49:23
0番地が読めるかどうかはOSによる
233:デフォルトの名無しさん
07/04/12 17:50:57
>>231
ディスクの特定の場所を読みたいならディスクのドライバに命令を送って読み出せばいい
234:デフォルトの名無しさん
07/04/12 17:52:09
>>231
mbrってハードディスクにある奴じゃないのか?
お前が読もうとしてるのはメモリなんだが
235:デフォルトの名無しさん
07/04/12 17:59:05
>>231
ディスクの先頭セクタを読みたいなら、ディスクデバイスを適当に開けば普通に読めます。
#大抵のOSで。
尤も、それ自体もやはり、管理者権限が必要だったりもします。
処で、>231にもOSが書いてありませんねぇ。
236:227
07/04/12 18:02:26
>>222
XPは読み込めるんですか?SP2なんですが。
>>233
検索してみます!
>>234
Σ( ̄Д ̄)ガーン
そうですよね…MBRってHDDの先頭セクタなのか!
ってか、メモリの最初には何が読み込まれてるんだろう…。
HDDのデータなんですけど、ポインタでメモリの番地を指定して操作出来るように
HDDもアドレス(セクタ?)で指定して読み込む事は可能なんですか?
それともファイルポインタでファイル名とかを指定する事でしか
読み込めない/書き込めないんですかね?
237:227
07/04/12 18:07:18
というか、>>236の答えって>>233なのか!!俺ってなんてばかなんだ!
お騒がせしております(T-T)
>>235
>処で、>231にもOSが書いてありませんねぇ。
申し訳ありません!!!!!!m(T◇T )m
Windows XP(SP2)です。
238:235
07/04/12 18:12:37
>>237
>235に書いたことがそのままXPにも当て嵌まる。
詳しくは、MSDNのCreateFileの(なが~~い)説明参照。
239:227
07/04/12 18:21:00
>>238
今みてみました。それから検索してたら
URLリンク(ext2read.sourceforge.net)
こういうのが出て来たんですけど、msdnの解説同様( ゚д゚)ポカーンな状態なので、
まずは買って来た本を一通り読み終えてから(まだポインタの章なので)
いただいた情報をもとに検索してみたいとおもいます!
>>235さん、質問に答えていただいたみなさん、ありがとうございました!
240:デフォルトの名無しさん
07/04/12 18:46:38
>>225
erase は古い環境で名前が違ってたり引数違ってたりすることもあるから、その点は注意な。
241:デフォルトの名無しさん
07/04/12 20:14:47
全てのデバイスが mmap ってるのはそれなりに綺麗かもしれないな(w
242:でぬるぽ
07/04/12 22:59:28
C/C++用のぬるぽチェッカーを作ってみた
叩くなりスルーなりお好きに
URLリンク(denullpo.exblog.jp)
243:デフォルトの名無しさん
07/04/12 23:50:22
\\
\\\
\ ∧_∧
( ´・ω・)
G と) ガッ >>242
ヽ⌒)、 \人∧__∧
 ̄ (_) >`д´)')
∨つ /
244:デフォルトの名無しさん
07/04/13 06:51:35
VSでテンプレートの勉強始めました。
普通のクラスを書くときにはヘッダファイルとソースファイルを
別々に作りますが、テンプレートクラスに関しては
同一のファイルに記述しないと外部参照エラーが出てしまいます。
Javaみたいでどうも気持ち悪いんですが、何か解決策はありますか?
template <typename X> X CTest<X>::func(){ ... }
↑これをクラスの宣言の後ろに書けばちゃんと動きますが、
別のソースファイルに書くとダメです。
245:デフォルトの名無しさん
07/04/13 07:24:15
#define HOGE_ template <typename X> X CTest<X>
246:デフォルトの名無しさん
07/04/13 08:21:36
明示的実体化という方法がなくはない。
URLリンク(www.fides.dti.ne.jp)
247:デフォルトの名無しさん
07/04/13 08:54:57
>>246さんの示してくれた方法でできました。
テンプレートはあくまでコンパイル時に解釈・生成されるものだというのは
要するにこういうことだったんですね。
ありがとうございました。
248:デフォルトの名無しさん
07/04/13 09:05:22
newで0で初期化した状態で確保する方法を教えてください。
249:デフォルトの名無しさん
07/04/13 09:09:51
new演算子はそこまで面倒見てくれないから自分で0代入汁
Windowsなら
Zeromemory(pDest, sizeof(type)*size);
みたいな感じか、もちろん基本型に限るが
250:デフォルトの名無しさん
07/04/13 09:12:01
unixなら?
251:デフォルトの名無しさん
07/04/13 09:17:14
どうよこの超原始的手段
char *hoge=(char *)Dest;
for(int i=0; i<sizeof(type)*size; i++)
hoge[i]=0;
てか、そもそも何をnewで確保するの?
252:デフォルトの名無しさん
07/04/13 09:31:52
intです。
memsetでもOKですか?
253:デフォルトの名無しさん
07/04/13 09:41:12
普通にstd::fillでも使っとけ。
254:デフォルトの名無しさん
07/04/13 12:09:41
>>249
PODなら初期化してくれるだろ
T* t = new T();
e.g.
int* p = new int(); // *p->0
255:デフォルトの名無しさん
07/04/13 12:50:45
newで初期化の問題云々いうときは大抵配列の方だと思うがね
256:デフォルトの名無しさん
07/04/13 14:24:39
exportがあればなあ…。
257:デフォルトの名無しさん
07/04/13 17:49:26
>>248
普通にstd::vector<int>確保すればデフォルトコンストラクタで初期化されるよ
258:デフォルトの名無しさん
07/04/13 17:54:44
>>255
配列でも初期値で初期化なら問題ないでしょ
int* p = new int[10]();
259:デフォルトの名無しさん
07/04/13 19:25:50
明解C言語の入門と実践編を終えたばかりの青二才未満のものなんですが、
Cを使ったソケットプログラミング(ネットワークプログラミング)を学ぶのに
オススメの書籍、又はWEBサイトが御座いましたら、教えていただけますでしょうか。
260:デフォルトの名無しさん
07/04/13 19:30:18
猫C
261:デフォルトの名無しさん
07/04/13 19:41:11
まずは標準入出力をソケットに見立てて書いてみる
→ inetd で ウマー
プロトコル周りは RFC (原文&日本語訳) を参照
# 「インターネットRFC辞典」持ってるけど結局 RFC本体を追うしなぁ…
Windows だと ASync 周りが嫌らしいので、
MSDN +
スレリンク(tech板) のテンプレサイト +
ぐぐる +
MFCのソース眺める +
などなど
262:デフォルトの名無しさん
07/04/13 20:09:18
そんなの出来るんすか?
じゃあ入出力インターフェイスとしてistream/ostream持ってるクラスなら
それをそのままhttpストリームにして出力できるんすか?
263:デフォルトの名無しさん
07/04/13 20:18:19
タイムアウトとか面倒見なけりゃそこそこいけるんじゃね?
ソケット ⇔ ファイルハンドル が inetd の仕事だからな。
# クライアント記述だと inetd ダメポかも…
ソケットに流すべきパケットのルール = プロトコル は、
千差万別なので 仕様書 (=RFC) を見るしかない。
で、HTTP ぐらいになると、そのルールが複雑怪奇だから難しいさね。
264:デフォルトの名無しさん
07/04/13 20:37:44
あとC++のiostreamは「その気になれば」、
どんな相手でも入出力できるようにできる。
inetdとか使わないで自前でやるときにはね。
265:デフォルトの名無しさん
07/04/13 23:57:03
throw()って宣言したほうがいい?
266:デフォルトの名無しさん
07/04/13 23:59:07
>>265
百害あって一利なし
267:デフォルトの名無しさん
07/04/14 00:27:06
デストラクタのthrow()宣言くらいはいいと思うよ.
絶対に投げちゃダメだから.
全然強制力もないし,あんま意味ないけどね
268:デフォルトの名無しさん
07/04/14 00:28:23
一利ぐらいはあるんじゃないか。
とりあえずデストラクタとswapにはつける。
269:デフォルトの名無しさん
07/04/14 00:47:33
さんくす
やっぱその程度にしか使えないのね
270:デフォルトの名無しさん
07/04/14 00:48:42
C++の例外って使いどころが分からない
271:デフォルトの名無しさん
07/04/14 02:14:51
たまに継承もとのデストラクタがthrow()で宣言されてる場合が・・・
272:259
07/04/14 04:13:08
>>260
今度立ち読みしてみます。ありがとうございます。
>>261
沢山の回答ありがとうございます。かなり勉強になりそうなので
特にテンプレによく目を通したいと思います。ありがとうございました!
273:デフォルトの名無しさん
07/04/14 04:54:14
>>270
C++以外の例外について分かっているなら、いっしょだと思うよ。
274:デフォルトの名無しさん
07/04/14 07:27:44
危険性が違うだろ
275:デフォルトの名無しさん
07/04/14 10:27:12
finallyなんていらんのですよ
276:デフォルトの名無しさん
07/04/14 12:56:37
HDCに書き込んだ文字や線を画像ファイルとして保存したいのですが、
BMPファイルに保存するだけでも、なんかすげー色々やることあって敷居高いのですが、
HDC渡すだけで勝手に画像ファイル作って保存してくれるみたいな
都合のいいライブラリってないもんですか?
277:デフォルトの名無しさん
07/04/14 13:22:31
GDI+
278:デフォルトの名無しさん
07/04/14 13:39:09
>>277
レスありがとうございます。GDI+ってプラスって言うくらいだから
さらに高機能でめんどくさくなると思ったのですが、
調べてみたら簡単になってるのですね。
なんか良い書籍ないか探して、GDI+について勉強してみます。
279:デフォルトの名無しさん
07/04/14 15:34:28
>>274
危険性って何のこと?
280:オナニストガロア ◆HEfxsk5e3k
07/04/14 16:17:47
vineLinuxでC++やります。
今さっきまでnamespaceの存在を知らなくてコンパイルが出来なくて困ってました。
よろしくおねがいしまふ
281:デフォルトの名無しさん
07/04/14 20:31:30
Visual Studio C++ 2005 EXPRESS EDITIONで、
Windows APIを使ったプログラミングを始めようとしたんですが、
ビルドするといきなり、
\source\main.c(1) : fatal error C1083: include ファイルを開けません。'windows': No such file or directory
というエラーが出てしまいます。
プロジェクトは、Win32コンソールアプリケーションでつくったので
問題はないと思うのですが、
何がいけないのでしょうか?
#include <windows.h>
int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hPreInst, LPSTR pCmdLine,int nCmdShow)
{
MessageBox(NULL,"Hello, World","タイトル",MB_OK);
return 0;
}
282:デフォルトの名無しさん
07/04/14 20:33:43
Express Editinonでは、別途Windows SDKかPlatform SDKをインストールする必要がある。
283:デフォルトの名無しさん
07/04/14 20:40:58
>>282
Platform SDKは、インストールをしています。
PSDK~.exeってやつですよね?
284:デフォルトの名無しさん
07/04/14 20:43:20
>>283
VisualStudio(C++)専用スレへどうぞ。
285:デフォルトの名無しさん
07/04/14 20:47:09
>>283
VCにPSDKの場所を設定する必要もある。
286:デフォルトの名無しさん
07/04/14 22:50:54
すみません、C言語に関するご質問です
'a'は一文字、"abcde"は文字列と教わりましたが、では
'abcde'と定義した場合どういう意味になるのでしょうか?
287:デフォルトの名無しさん
07/04/14 22:58:45
>>286
コンパイラによって"str"と同じだったり、エラーが出たり
288:デフォルトの名無しさん
07/04/14 22:58:48
>>286
出来たか?
4文字までならできる処理系もないではないが…
289:デフォルトの名無しさん
07/04/14 23:05:20
>>287
妄想乙。
>>286
シングルコーテーションで囲んだ文字は整数値として扱われるので、
sizeof(int)と同じ文字数までしか書けない筈。
おまけにその値が同解釈されるかは環境依存。
例えば、'abcd'と書いて'a'<<24|'b'<<16|'c'<8|'d'になるか'a'|'b'<<8|'c'<<16|'d'<<24になるかは
同じコンパイラでもバージョンによって違っていたりする。
290:デフォルトの名無しさん
07/04/14 23:09:42
ちなみにC++だと文字リテラルはcharだ。
互換性を断ち切ったそう多くない箇所なので要チェック。
291:デフォルトの名無しさん
07/04/14 23:36:01
Cで、 !0 が1にならない処理系・コンパイラで有名どころは何があります?
292:デフォルトの名無しさん
07/04/14 23:46:30
ISOやANSIに準拠してなくてK&Rとの互換性もない処理系
293:デフォルトの名無しさん
07/04/14 23:50:11
>>292
具体的にはどんなの?今でも触れたり使われたりしてる?
>>292が今使ってるとか?
294:デフォルトの名無しさん
07/04/14 23:51:55
そんなけったいなもの現存してないだろ
295:デフォルトの名無しさん
07/04/15 00:02:44
>>294
本当!?大丈夫なの!?そんな処理系もうない!?
296:デフォルトの名無しさん
07/04/15 00:04:11
あぁー僕は今処理系依存コードを書いているよー!気をつけようねぇー!
297:デフォルトの名無しさん
07/04/15 00:07:27
何を書いてるのか知らんが、お前のレベルなら規格に準拠してない処理系まで考慮することはないだろ。
298:デフォルトの名無しさん
07/04/15 00:09:38
programming初心者です
visual c++をインストールしたのですが、c言語を使ってprogrammingの学習をしたいのですが
windowsのコマンドプロンプト上でc言語のprogramをするにはどうしたらよろしいのですか?
環境設定等が解らず困ってます。
どうか、ご指導のほどよろしくお願いします。
299:デフォルトの名無しさん
07/04/15 00:14:22
>>297
どのくらいのレベル以上からだと 規格に準拠していない処理系まで
考慮しなければならない?
せいぜいintが16ビット系にしかあたったことないなー
NULLが0じゃないのにもあたったことないし運がいいだけかなー
300:デフォルトの名無しさん
07/04/15 00:19:11
> intが16ビット
> NULLが0じゃない
それはどっちもANSI準拠だろ
301:オナニストガロア ◆HEfxsk5e3k
07/04/15 00:19:56
rubyが出来るのですが、C++もすぐに出来るようになりそうですか?
302:デフォルトの名無しさん
07/04/15 00:23:04
いいえ
303:デフォルトの名無しさん
07/04/15 00:24:15
>>300
NULL==0なものにしかあたったことがない。
というか、NULL==0という前提なコード書きまくりんぐ。
お前はどうだい?
304:デフォルトの名無しさん
07/04/15 00:26:22
NULLは0の#defineだろ。==が成り立たないほうがおかしい
305:デフォルトの名無しさん
07/04/15 00:28:17
あーもう C FAQ 嫁。
URLリンク(www.kouno.jp)
はい、おしまい。
306:デフォルトの名無しさん
07/04/15 00:42:05
ぬるぽ
307:デフォルトの名無しさん
07/04/15 01:11:48
>>305
4月だな
308:デフォルトの名無しさん
07/04/15 02:01:40
>>305
0はNULLとしてよいがNULLは0とは限らない と書いてあるンだけど・・・
NULLが0でない処理系が今でも生き残ッているのか聞きたいンだが。
309:デフォルトの名無しさん
07/04/15 02:04:02
ポインタ型のNULLと整数型の0を比較するのはナンセンス。
ヌルポインタの内部表現が0でない処理系ならごまんとある。
310:デフォルトの名無しさん
07/04/15 02:12:54
>>308
#define NULL ((void*)0)
とされてるCの処理系なら今でもあるよ。
311:デフォルトの名無しさん
07/04/15 02:15:17
>>308
NULL が 0 でないコンパイラを自分で作ればいいじゃないか
312:デフォルトの名無しさん
07/04/15 02:25:57
>>309
具体例機盆ぬ
313:デフォルトの名無しさん
07/04/15 03:06:51
>>309
ポインタが現われるべきところに書かれた0は
整数型として解釈されることはないんだけど。
「16進数の0x1Aはおかしい!整数の中に文字定数'A'が入っている!」
って言っているようなもの。
314:デフォルトの名無しさん
07/04/15 03:07:38
>>313
流れ読めよ。
315:デフォルトの名無しさん
07/04/15 03:11:24
>>309
具体例きぼんぬ
>>314
こうですか?わかりません><
316:デフォルトの名無しさん
07/04/15 03:35:07
>>309が知ったかのアホでFA
317:デフォルトの名無しさん
07/04/15 03:51:35
>>313
ポインタ様と0を比較するというのは
ポインタ様がぬるぽかどうか比較することと等しいということガッ
言語規定で規定されているので、これはおかしくない
318:デフォルトの名無しさん
07/04/15 03:53:39
ぬるぽ
319:デフォルトの名無しさん
07/04/15 04:18:49
島根県のみなさん、パチンコをするなら、
優良パチンコ店 エイトワン
に行こう! 遠隔(※1)を絶対やってないのは「エイトワン」だけ!
違法ロム(※2)を絶対使ってないのも「エイトワン」だけ!
エイトワンでは、遠隔等が可能な設備は入れていません。 ロムも、警察がチェックしやすいようにしています。
詳しい方はご存知の通り、どんなにパチンコの遊戯人口が変動しても、その市場規模は変わりません(※3)。
要するに、客が減っても、残った客から絞り盗る量を増やして調整しているのです。
しかし、何故それが可能なのか?…ご理解頂けると思いますが、9割以上の店が確実に遠隔等を行ってます。
1万店以上の中でも、遠隔も違法ロムも確実にやってないのは「エイトワン」1店だけです!
※1…遠隔とは
「お、あの客は新顔だな。勝たせて味を占めさせるか。遠隔操作で設定変更しよ」
「客が減ってきたな。ま、設定を絞めて(違法)、1人あたりから搾る量を増やせばいいか」
「あのオヤジ負け続けてるからそろそろ辞めるかもな。今日は勝たせてやるか」
※2…違法ロムとは
「うちのアタリ確率は、もちろん他と同じ『○○○分の1』ですよ!(ロムいじってるからウソだけど)」
※3 市場規模 遊戯人口
平成06年 30兆4,780億円 2,930万人
平成08年 30兆0,630億円 2,760万人
平成10年 28兆0,570億円 1,980万人
平成12年 28兆6,970億円 2,020万人
平成14年 29兆2,250億円 2,170万人
平成16年 29兆4,860億円 1,790万人
320:デフォルトの名無しさん
07/04/15 04:19:59
ぽるの
321:オナニストガロア ◆HEfxsk5e3k
07/04/15 08:34:26
c++ではNULLは整数型の0で定義されてますよっと。
今林先生の本読んでる
322:デフォルトの名無しさん
07/04/15 15:23:03
SIMDって何て読むんですか?
323:デフォルトの名無しさん
07/04/15 15:38:40
C++ではNULLではなく0を使うことが推奨されているわけだが。
324:デフォルトの名無しさん
07/04/15 16:29:54
>>322
like "Ess, I'm Dee".
325:デフォルトの名無しさん
07/04/15 17:28:37
>>324
どっちかというとEss, I aim Dee.
326:デフォルトの名無しさん
07/04/15 19:25:13
>>321
誰も定義の話をしてないだろ
ちゃんと読めよ低脳
327:286
07/04/15 19:43:02
>>287-290
ありがとうございました。
ちなみに試したわけではなく
純粋にどうなるのかと思った
だけでした。
328:デフォルトの名無しさん
07/04/15 21:13:07
vipからきました q(^-^)p
329:デフォルトの名無しさん
07/04/15 21:29:29
URLリンク(52.xmbs.jp)
↑
このサイトぶっ潰しませんか??
写メとか貼って気持ち悪いです。自分は初心者なんで潰し方がよく
分からないのでみなさんお願いします。
330:デフォルトの名無しさん
07/04/15 22:14:26
void *m = 0;のとき、*(size_t*)&m!=0ということじゃね?
331:デフォルトの名無しさん
07/04/15 22:17:12
>>329
お前を通報しました
332:デフォルトの名無しさん
07/04/15 22:56:52
C++の言語仕様ではヌルポインタは0なをだがな。
333:デフォルトの名無しさん
07/04/16 00:56:11
構造体の配列の配列を動的確保するにはどうしたらいいのでしょうか?
typedef struct {
char a;
char b;
} St;
void poo(int x, int y){
St **hoge;
hoge = (St **)malloc(sizeof(St*)*x);
for(int i=0;i<x;i++){
hoge[i] = (St *)malloc(sizeof(St)*y);
}
}
これだと駄目でした。コンパイル通っても中身にアクセスしようとするとふっとびます。
hoge[3][5].a = 'T';
のように使いたいのですが。
334:デフォルトの名無しさん
07/04/16 01:04:23
>>333
poo(3, 5); って呼び出してるって落ちでは?
こちらではpoo(4, 6)でちゃんと動く。
335:デフォルトの名無しさん
07/04/16 01:14:56
>>334
poo(100,100)等と入れてるのでそういうわけではないみたいです。
他の部分との影響かもしれないのでもう少しいじくってみます。
336:デフォルトの名無しさん
07/04/16 01:25:55
>>335
念のためCodeGuardを掛けてみたけど「解放されていません」の
警告以外はエラー出ないねやっぱり。
337:デフォルトの名無しさん
07/04/16 02:02:54
コピーコンストラクタを使った初期化でauto_ptrで
メンバ関数を呼び出すとアクセス違反が発生しましたって
怒られるんですが、何が悪いんでしょうか。
class Circle : public Shape{
public:
Circle(int radius=0)throw();
Circle(const Circle& circle) throw();
virtual void draw() const throw();
virtual ShapePtr clone() const throw(bad_alloc);
virtual ShapePtr createSimilar() const throw(bad_alloc);
protected:
int radius_;
};
ShapePtr Circle::createSimilar() const throw(bad_alloc)
{ return new Circle(); }
ShapePtr Circle::clone() const throw(bad_alloc)
{ return new Circle(*this); }
void userCode(ShapePtr s ) throw(){
cout << "userCode() number1:";
s->draw();
ShapePtr copy = s->clone();
cout << "userCode() number2:";
copy->draw();
ShapePtr similar = s->createSimilar();
cout<< "userCode() number3:";
similar->draw();
}
338:デフォルトの名無しさん
07/04/16 02:10:10
>>337
コードが足りない。症状が再現する最小のソースを貼って。
339:デフォルトの名無しさん
07/04/16 02:22:49
#include <iostream>
#include <new>
#include <memory>
using namespace std;
class Shape;
typedef auto_ptr<Shape> ShapePtr;
class Shape{
public:
Shape() throw();
virtual ~Shape() throw();
virtual void draw() const throw() =0;
virtual ShapePtr clone() const throw(bad_alloc)=0;
virtual ShapePtr createSimilar() const throw(bad_alloc) =0;
protected:
int radius_;
};
Shape::Shape() throw(){}
Shape::~Shape() throw(){}
class Circle : public Shape{
public:
Circle(int radius=0)throw();
Circle(const Circle& circle) throw();
virtual void draw() const throw();
virtual ShapePtr clone() const throw(bad_alloc);
virtual ShapePtr createSimilar() const throw(bad_alloc);
protected:
int radius_;
};
340:デフォルトの名無しさん
07/04/16 02:23:28
Circle::Circle(int radius)throw()
:Shape(), radius_(radius){}
Circle::Circle(const Circle& circle)throw()
{ this->radius_ = circle.radius_; }
void Circle::draw() const throw()
{ cout << "Circle: radius=" << radius_ << "\n"; }
ShapePtr Circle::createSimilar() const throw(bad_alloc)
{ return new Circle(); }
ShapePtr Circle::clone() const throw(bad_alloc)
{ return new Circle(*this); }
void userCode(ShapePtr s ) throw(){
cout << "userCode() number1:";
s->draw();
ShapePtr copy = s->clone();
cout << "userCode() number2:";
copy->draw();
ShapePtr similar = s->createSimilar();
cout<< "userCode() number3:";
similar->draw();
}
int _tmain(int argc, _TCHAR* argv[])
{
ShapePtr c(new Circle(42) );
cout << "main() number1:";
c->draw();
userCode(c);
return 0;
}
こんな感じです。
お願いします。
341:デフォルトの名無しさん
07/04/16 02:28:52
ShapePtr Circle::createSimilar() const throw(bad_alloc)
{ return auto_ptr<Circle>(new Circle()); }
ShapePtr Circle::clone() const throw(bad_alloc)
{ return auto_ptr<Circle>(new Circle(*this)); }
これでどう?
342:デフォルトの名無しさん
07/04/16 02:31:57
ShapePtr Circle::createSimilar() const throw(bad_alloc) {
return ShapePtr(new Circle());
}
ShapePtr Circle::clone() const throw(bad_alloc) {
return ShapePtr(new Circle(*this));
}
悪いこっちの方が見やすいね。
343:デフォルトの名無しさん
07/04/16 02:51:24
うおお。
いけました。ありがとうございます。
なるほど、ちゃんとauto_ptrにして返さないと駄目だったんですね。
344:デフォルトの名無しさん
07/04/16 02:54:43
>>343
簡単に言うとそういう事なんだけど、その前にコンパイルエラーに
ならなかった?
_tmain()とあるからVisual C++だと思うんだけど。
345:デフォルトの名無しさん
07/04/16 02:57:48
ちなみにgcc(MinGW 3.4.2)だと
error_cc1.cpp:46: error: conversion from `Circle*' to non-scalar type `ShapePtr' requested
のようなエラーを返す。
346:デフォルトの名無しさん
07/04/16 12:19:02
long long って、まだ現在の C++ の規格には入ってないの?
347:デフォルトの名無しさん
07/04/16 13:01:37
どーでもいいけどlong longって
ちょっと、ちょっとちょっとレベルだよな
348:デフォルトの名無しさん
07/04/16 13:33:13
DLLの関数を呼ぶときに
Func(p1,p2,p3,p4)
として呼び出した関数が、呼び出された側では
1: Func(謎の値, p1, p2, p3)
ってなっちゃうケースと、正しく
2: Func(p1,p2,p3,p4)
てなるのにその関数内でp4が破壊される(あたらしく宣言したローカル変数が上書きしてしまう)ケースがある。
デバッガでアセンブラを追ったところ、call Func の直前にpush p1 しているのは確認済み。
(呼び出し側はcdeclなのでp4から順に全てpush。)
callで呼ばれた関数に入った直後に、デバッガのスタックトレースウィンドウ内で上記現象を確認している。
(これってスタックを見てるのかな)
callと、call内部最初のステップとの間に、デバッガでは見えない何らかのバイナリがあるのかな。
もしくはDLLプロセス空間へ切り替わる(この辺じつはよく理解していない)際に、スタックポインタがおかしくなる(上記現象を説明できる仮説が立てられていない)とかそういうことかな。
DLL経由関数呼び出しの、バイナリレベルの挙動についてなにか知ってたら教えてくれ~
349:デフォルトの名無しさん
07/04/16 13:48:24
関数の宣言で何か(主に呼び出し規約を)ミスってんじゃないの?
350:デフォルトの名無しさん
07/04/16 14:00:01
__stdcall とか __cdecl とか __pascal って書いてないの?
351:デフォルトの名無しさん
07/04/16 14:01:38
謎の値というのはひょっとするとthisポインタの可能性もあるかも。
extern "C" で呼び出すようにし、C++の形式の関数は使わない
ようにするのが原則だけどそんな事は知ってるよね。
352:デフォルトの名無しさん
07/04/16 14:06:35
呼び出し規約かthisポインタかどっちかの問題だと思う
353:デフォルトの名無しさん
07/04/16 14:07:44
this 積むのは __thiscall かメンバ関数だと思うが…
C++ って標準は __stdcall だっけか?
354:デフォルトの名無しさん
07/04/16 14:22:23
__stdcallを使うとCでも他の言語でも整合性がとれたスタックを
提供できる。
ただし、extern "C" を使った場合でもCならばC、C++ならC++で
受けないとthisポインタの絡みでずれてくる。
extern "C"は名前マングリングだけに関係する。
355:デフォルトの名無しさん
07/04/16 14:30:19
呼び出し側も呼び出され側も _cdecl を明示的に指定している。
extern "C"はDLL側では指定してるが、呼び出し側はどこでどうやって指定すればいいのかわからんw
(GetProcAddress で関数ポインタで呼んでいる)
>>351
>>352
その場合、callの前に push this 的なものが入るんじゃないの?
さらに調べていたら、1のケースでも最後のパラメタは破壊されるようだ。
あと、Debugでビルドするとすべて正常に動く。
356:デフォルトの名無しさん
07/04/16 14:33:35
メインプログラムもDLLもC++なの?
一度__stdcallにしてビルドしなおしてみてよ。
DEFファイルの書き方はわかるよね?これを書けば
extern "C"は不要になるので。
357:348
07/04/16 14:34:53
あ、355は僕です スマソ
>Debugでビルドするとすべて正常に動く。
訂正。DLL側をDebugでビルドするとすべて正常に動く。
358:デフォルトの名無しさん
07/04/16 14:34:56
>>355
typedef ret_type (__cdecl *pfunc) (arg_types...) PFUNC;
PFUNC pfn;
(FARPROC&)pfn = GetProcAddress();
アドレスを受ける変数に呼び出し規約を埋めるんだ
359:348
07/04/16 14:36:28
>>358
んにゃ、 _cdecl はちゃんと指定しているよ。
extern "C"は呼び出し側は関係ないってことでいいんだよね?
360:デフォルトの名無しさん
07/04/16 14:39:35
ああ
GetProcAddress() だけで完結した呼び出しなら
明示してるんだから extern "C" はイラネ-な。
361:デフォルトの名無しさん
07/04/16 14:40:12
>>359
extern "C"はC++の名前マングリングを止めるもの。
メインもDLLも同じ処理系の同じC++で開発するなら必要ない。
(修飾名も同じになるから)
__declspec(ddexport)とか__declspec(dllimport)を使えば
DEFファイルは不要。
362:デフォルトの名無しさん
07/04/16 14:41:25
GetProcAddressにはextern"C"付けておく必要がある。
なぜならWin32APIには名前マングリングが存在しないから。
それと
×ddexport
○dllexport
363:デフォルトの名無しさん
07/04/16 14:42:42
まあwindows.hをインクルードしておけばextern "C"は自動的に
やってくれるので気にする必要はない。
364:デフォルトの名無しさん
07/04/16 14:51:18
呼び出し規約以外にも、引数のサイズの不一致とかありそうだな
構造体を値渡ししてたり とか 可変引数だけど個数間違えたり とかしてない?
365:348
07/04/16 15:01:02
引数の数が違うとやっぱり問題なのかな。
実は呼び出しは結構怪しいことになってて、
union DllVar { //4-byte generic container variable
HWND handle;
DWORD dword; //NULL
LPCSTR string; //String
bool boolean; //Boolean
float number; //Number
};
というのがまずあって、呼び出し側は
typedef LPCSTR (_stdcall *METHOD)(DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar);
ってなってるが、受け取り側は必要な数しか受け取らない。
オーストラリア人の技術者が「これでOK」って言ってたので
(_cdeclでは呼び出し側がスタック破棄もするからその点で言っても問題なさそう)
信用してるんだが。
__stdcall 試してみるyo。
366:デフォルトの名無しさん
07/04/16 15:05:51
それはまずいぞ。
stdcallは呼び出された側がスタックを破棄するので、
スタックにつまれた引数の数を正確に知らなくてはならない。
可変個引数を取る関数ではstdcallを使えない(指定してもcdeclと同じになる)のもこのため。
だからそういう関数ならcdeclにしておけ。
367:デフォルトの名無しさん
07/04/16 15:33:28
sizeof(wchar_t) の大きさによって定義を変えたいのですが、
#if sizeof(wchar_t) == 4 も
#if sizeof(L'A') == 4 も
定数式では無いと、コンパイラが受け付けてくれません。
何かいい方法ありませんか?
368:デフォルトの名無しさん
07/04/16 16:36:22
C++ならテンプレートを使ってごにょごにょ、
CならWCHAR_MAXの値を見るくらいしかないと思う。
369:デフォルトの名無しさん
07/04/16 16:43:58
bccでは通った。
370:デフォルトの名無しさん
07/04/16 16:52:01
でも規格上はプリプロセッサ内でsizeofは使えない仕様のはず
371:デフォルトの名無しさん
07/04/16 17:05:41
URLリンク(kansai2channeler.hp.infoseek.co.jp)
マルチスレッドで、ソケットプログラミングをしたいのですが、
winsock2.hをインクルードするだけでエラーが出てしまいます。
どうすればよいのでしょうか?
372:デフォルトの名無しさん
07/04/16 17:08:32
どんなエラーが出てるのかくらい書けよ
373:371
07/04/16 17:11:58
>>372
すみませんでした。
↓みたいなエラーが57個でます
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(112) : error C2011: 'fd_set' : 'struct' 型の再定義
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(54) : 'fd_set' の宣言を確認してください。
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(147) : warning C4005: 'FD_SET' : マクロが再定義されました。
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(88) : 'FD_SET' の前の定義を確認してください
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(156) : error C2011: 'timeval' : 'struct' 型の再定義
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(97) : 'timeval' の宣言を確認してください。
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(212) : error C2011: 'hostent' : 'struct' 型の再定義
374:デフォルトの名無しさん
07/04/16 17:19:58
<winsock2.h>は<windows.h>よりも先に#includeする。
375:371
07/04/16 17:39:38
>>374
ありがとうございましたm(_ _)m
無事解決しました!
376:デフォルトの名無しさん
07/04/16 18:30:52
#define WIN32_LEAN_AND_MEAN
でもよかったとおもた。
Windows.hがwinsock.hもincludeするのが理由とか何とか
377:デフォルトの名無しさん
07/04/16 18:33:15
WIN32_LEAN_AND_MEAN教えると、必要なヘッダがincludeされなくなってて、また泣き付かれることになるやもしれん。
378:デフォルトの名無しさん
07/04/16 18:38:20
WIN32_LEAN_AND_MEAN はとりあえず無効化するね。
379:デフォルトの名無しさん
07/04/16 19:32:45
どっちにしろホントに必要なヘッダはMSDN見ないとダメだからねー
380:デフォルトの名無しさん
07/04/16 20:32:14
質問があります。
string str[] = {"aaa", "bbb", "ccc", ""};
を宣言して、
string *tmp = str;
while (*tmp->c_str()) {
printf("%s", tmp->c_str());
tmp++;
}
とやると、一応cccと表示されループを抜けるのですがこれは正しい処理なのでしょうか?
もし間違っているなら正しいやり方を教えてください。御願いします。
381:デフォルトの名無しさん
07/04/16 20:55:45
>>368
>>369
>>370
sizeofが使えないのは不便ですよね^^
結局、WCHAR_MAXの値を使うことにしました。
ありがとうございました。
382:デフォルトの名無しさん
07/04/16 21:04:40
>>380
for (string *tmp = str; !tmp->empty(): ++tmp) {
printf("%s", tmp->c_str());
}
自分ならこう書く
383:デフォルトの名無しさん
07/04/16 21:20:14
!tmp.size()でもいいな
384:デフォルトの名無しさん
07/04/16 21:26:29
気持ち悪い
385:380
07/04/16 21:29:02
>>382-383
有り難うございます。
参考にさせて頂きます。
386:デフォルトの名無しさん
07/04/16 21:46:06
C++なら余りポインタは使いたくないな・・・
std::vector<std::string> str;
str.push_back("aaa");
str.push_back("bbb");
str.push_back("ccc");
for (std::vector<std::string>::const_iterator pos = str.begin(); pos != str.end(); ++pos)
std::cout << pos->c_str() << std::endl;
と書いちゃうな・・・・
387:デフォルトの名無しさん
07/04/16 21:48:10
std::copy(str.begin(), str.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
388:デフォルトの名無しさん
07/04/16 22:08:05
>>383
tmp->size()では?
つまり論理が逆ではと思います。
389:デフォルトの名無しさん
07/04/17 00:13:19
あるクラスのメンバ変数としてこんな定義があった場合、
class Neko {
classA hoge1;
classB hoge2;
}
コンストラクタは hoge1→hoge2、デストラクタはその逆の順番で
呼び出されているように見えますが、
これはC++の規格として保証されていますか?
390:デフォルトの名無しさん
07/04/17 00:14:58
いいえ
391:デフォルトの名無しさん
07/04/17 00:24:31
呼び出される順番は不定ということですね。
ありがとうございました。
392:デフォルトの名無しさん
07/04/17 00:30:01
自分の処理系では保証されてるんだから
それでいいじゃんと思う俺ホビープログラマー
393:デフォルトの名無しさん
07/04/17 00:52:09
ラベルをまたがなければ上から順、と決まってなかったっけ?
394:デフォルトの名無しさん
07/04/17 00:55:35
つ[規格票]
これ以外の書き込みは嘘だと思え
395:デフォルトの名無しさん
07/04/17 01:02:18
宣言順だったはずだけど
396:デフォルトの名無しさん
07/04/17 01:04:41
あった
URLリンク(www.kuzbass.ru:8086)
の-5-から
>Then, nonstatic data members shall be initialized
>in the order they were declared in the class definition
>(again regardless of the order of the mem-initializers).
非staticデータメンバはクラス定義での宣言順に初期化される。(メンバ初期化リストの順序は関係ない)
397:デフォルトの名無しさん
07/04/17 01:10:03
ラベル云々って人は、メンバのメモリ配置と混同してるかな。
398:デフォルトの名無しさん
07/04/17 01:16:28
>>389
保障されている。
staticでないメンバ変数は宣言どおりの順番でコンストラクタが呼び出され―12.6.2
デストラクタはその逆順で呼び出される―12.4.6
399:デフォルトの名無しさん
07/04/17 01:25:30
規格で保障されているとはいえ、初期化順序をあてにしたコードは書きたくない。
エディタで宣言の順番を変えてしまうだけで動かなくなる不思議なコードになる。
とはいえ、そういう初期化順序を考慮したい場合もままあるわけで、そんなコードを書くなと主張するわけにも行かず。
せめて、書かないほうが良いと主張するのが精一杯。
>>390みたいに、C++プログラマ全員に、規格書をきっちり読んで置けというのも酷な話。
400:デフォルトの名無しさん
07/04/17 01:25:42
a=a++;
そろそろ、この類の事象を 不定だの未定義だの屁理屈並べずに
エラーにするか動作を定義するか どちらかにすべきだと思うんだ。
401:デフォルトの名無しさん
07/04/17 01:28:16
>>400
参照が問題を複雑にしてくれるから、とりあえずエラーにするという選択肢じゃ解決にはならんだろうな。
402:デフォルトの名無しさん
07/04/17 01:29:03
>>399
だったらC++なんか使うなよ
403:391
07/04/17 04:36:55
ちゃんと規定があったんですね……改めてありがとうございました。
いくつかの値(hoge1とかhoge2とか)のポインタを保持しておいて、
デストラクタでファイルに書き出す、というクラスを
C++をやり始めた頃に作ってずっと使っていたのですが、
このクラスのデストラクタが呼び出されるよりも先に
hoge1やhoge2が破壊されてしまったらまずいじゃん、
ということに最近気付いたんです。
404:デフォルトの名無しさん
07/04/17 08:26:50
>>403
親子関係だからセーフだね
親戚同士の順序依存するってーと >>389 での classB のコンストラクタに
classA のポインタとるようなやつとかかな