トップページ⇒tech
1001コメント326KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/01/17(水) 22:16:00
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.33【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1164376287/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん2007/01/17(水) 22:17:45
>>1乙
0003デフォルトの名無しさん2007/01/17(水) 22:24:22
>>1
乙
0004質問1(続き)2007/01/17(水) 23:01:47
Ver.33の989-992で質問した者です。
いろいろ回答ありがとうございました。
そうですね。まず普通は、publicにするものだと、
キャストならdynamic_castだと思っておりました。

柏原著のサンプルソースを編集したものですが、
この著者は、static_castを使用して

static_cast<mypair &>(rp).getkey());
static_cast<mypair &>(rp).getvalue());

としていたので、これがベストな方法かと思って
疑問に思っておりました。
皆様のご意見が聞けてよかったです。ありがとうございました。

柏原正三の美しいC++プログラミング見本帖(翔泳社)
(http://www.seshop.com/book/download/)
(元ファイル:Abstract2Bad.cpp)
0005デフォルトの名無しさん2007/01/17(水) 23:06:08
柏原・・・・悪書をつかんだものだな。同上するよ。
0006デフォルトの名無しさん2007/01/17(水) 23:39:39
質問です。
グローバルな定数を元に、特定の要素数の配列を作るにはどうしたらよいでしょ
うか?

一つのファイルで、
extern const int MAXLEN = 65535;
残りのファイルで
extern const int MAXLEN;
として、各ファイルで
int array[MAXLEN];
としようと思ったのですが、
error: ISO C++ forbids variable-size array `line'
というエラーになります。

とりあえず、共通ヘッダファイルで
#define MAXLEN 65535
としてしのいでいますが、C みたいですっきりしません。
000762007/01/17(水) 23:43:39
書き忘れました。コンパイラは GCC3.4.3 で、-pedantic オプションをつけています。
0008デフォルトの名無しさん2007/01/18(木) 00:05:03
>>7
§3.1.3
extren const int MAXLEN = 65535; // definitions
extern const int MAXLEN; // declarations

前者は定義なのに対して後者は宣言に過ぎない。という事は、
リンク時まで値が決定しないという事であり、配列はコンパイル時
に大きさを要求する事から、使えない。

ヘッダファイルにでも入れたらどうか。
0009デフォルトの名無しさん2007/01/18(木) 00:10:06
ちなみにヘッダファイルに入れる時はexternを取らないとリンカエラーになる。
当然だが。
0010デフォルトの名無しさん2007/01/18(木) 00:12:52
ヘッダにconst int MAXLEN = 65535;と書け。
001162007/01/18(木) 00:21:31
皆さん、ありがとうございます。
const int MAXLEN = 65535;
で行こうと思います。

ところで、C++のconst は内部リンケージだと知ったのですが、
http://seclan.dll.jp/dtdiary/2000/dt20000413.htm

通常の変数は従来どおり、staticにしないと内部リンケージにならないのです
よね?なぜconstの場合だけ、こうなったのでしょうか?
また、
static const int MAXLEN = 65535;
のように、static constの場合は、単なるconstの場合と、挙動は全く同じな
のでしょうか?
0012デフォルトの名無しさん2007/01/18(木) 00:25:38
>>11
constが内部リンケージを持つのは、#defineの代わりにコンパイル時定数として扱えるようにするため。
const自体に内部リンケージを持つ意味が含まれているので、staticはあってもなくても同じ。ただしクラス・関数内を除く。
001362007/01/18(木) 00:29:05
>>12
ありがとうございます。よく分かりました。
私のような初心者が誤解しないよう、static をつけて宣言しようと思います。
0014デフォルトの名無しさん2007/01/18(木) 00:30:16
>>11
C++ではconstの意味が拡張されているからだろう。
§5.19 Constant Expressions
In several places, C + + requires expressions that evaluate to an integral or enumeration constant: as array
bounds (8.3.4, 5.3.4), as case expressions (6.4.2), as bit-field lengths (9.6), as enumerator initializers (7.2),
as static member initializers (9.4.2), and as integral or enumeration non-type template arguments (14.3).
constant-expression:
conditional-expression
An integral constant-expression can involve only literals (2.13), enumerators, const variables or static
data members of integral or enumeration types initialized with constant expressions (8.5), non-type template
parameters of integral or enumeration types, and sizeof expressions. Floating literals (2.13.3) can
appear only if they are cast to integral or enumeration types. Only type conversions to integral or enumeration
types can be used. In particular, except in sizeof expressions, functions, class objects, pointers, or
references shall not be used, and assignment, increment, decrement, function-call, or comma operators shall
not be used.
また、その意味から、static constでもconstでも挙動は同じだろう。
但し実際に領域を使うとすれば、多分違う場所に確保されるだろう。
001562007/01/18(木) 00:38:36
>>14
重ね重ね、ありがとうございます。
>>ALL
瑣末な疑問かとも思いましたが、勉強になりました。思い切って質問して良かっ
たです。ありがとうございました。
0016デフォルトの名無しさん2007/01/18(木) 03:15:15
夜分遅くすいません。
独習Cを終えた程度の素人です。
練習問題としてCプログラムをなるべく多く作ってみたいのですが、
Webに問題集みたいなサイトありませんか。よろしくお願いします。
0017デフォルトの名無しさん2007/01/18(木) 05:01:06
>>16
Webには無いと思う。
C/C++の宿題片付けますのスレの問題やってみるぐらいじゃない?
でも、独習Cってどれくらいの内容の物かわからないけど
たぶん、まだ知らないことは多いと思うから、書籍購入して
サンプルみながら勉強続けるとかが良いんじゃない?
ちなみに家に、C言語500問っていう本あるけど
「ん〜・・簡単だな・・」って思ったけど知識が身に付いてる分
簡単だと思ったのかもしれない。でも、別にこの本を勧めはしない。
0018デフォルトの名無しさん2007/01/18(木) 13:46:26
ゲームでも何でもいいから、何か1つ作るっていうのはどう?
明確な目標がある分やりやすいよ。
0019デフォルトの名無しさん2007/01/18(木) 15:34:45
ゲーム作るのは明確な目標じゃないよな。
「RPG作るぞ!」も明確じゃない
「MMORPGならどうだ?いっぱい人があつまって楽しくできるゲームつくるぞ!」もだめ

何を言いたいかってーと、動機と目標を一色多にするなってことです
0020デフォルトの名無しさん2007/01/18(木) 18:58:19
vector<int> の中に適当な数字がいくつか入っているとして、
この中にもし整数nが含まれるとしたらそれが何番目に入っているかを知りたいです。
それで調べたらなにやらfindとかいうのが使えるみたいなんですが
イテレータとかいうのがワケが分からないのでどう書いたらいいか分かりません。
書き方を教えてください。
0021デフォルトの名無しさん2007/01/18(木) 19:03:27
if (vector<int>::iterator ii = find(vec.begin(), vec.end(), n))
  cout << n << " is found at " << ii - vec.begin() << endl;
else
  cout << n << " is not found" << endl;
0022212007/01/18(木) 19:05:30
すまん
一行目は以下と置き換えてくれ

vector<int>iterator ii = find(vec.begin(), vec.end(), n);
if (ii != vec.end())
0023名前は開発中のものです。2007/01/18(木) 19:37:51
>>21
うまくいきました。サンクスコ。
0024デフォルトの名無しさん2007/01/18(木) 23:24:30
>>17 >>18 >>19
ありがとうございます。本を購入してもうすこし勉強してみます。
0025デフォルトの名無しさん2007/01/19(金) 14:44:13
string str;
int i;
cin >> str;
i = atoi(str);

こういう風にするとconstじゃないって怒られるんですが
stringをintに変換するにはどうすればいいんでしょうか?
cin >> i; ではなくて一度stringに入れてからatoi()というかJavaのInteger.parseInt()みちあな感じでやりたいんです
0026デフォルトの名無しさん2007/01/19(金) 14:47:56
i = atoi(str.c_str());
0027デフォルトの名無しさん2007/01/19(金) 14:48:20
std::istringstream s(str);
s >> i;

または

i = atoi(str.str());

または

i = boost::lexical_cast<int>(str);
0028デフォルトの名無しさん2007/01/19(金) 14:48:55
あ、ごめん
×i = atoi(str.str());
○i = atoi(str.c_str());
0029252007/01/19(金) 14:49:22
>>26
できました
ありがとうございました
0030252007/01/19(金) 14:50:40
>>27-28さんもありがとうございました
0031252007/01/19(金) 15:04:24
>>31さんもありがとうございました
0032デフォルトの名無しさん2007/01/19(金) 15:13:48
strに整数と解釈できない文字列が入っている場合の挙動が
>>27の例では三者三様なので注意。
C標準関数でatoi()より高級なものとしては、strtol()なんてのもある。
0033252007/01/19(金) 21:45:00
>>34さんもありがとうございました
0034デフォルトの名無しさん2007/01/19(金) 21:46:53
いえいえ、どういたしまして
0035デフォルトの名無しさん2007/01/19(金) 21:55:20
この2分足らずの寸劇にちょっと笑ってしまった
0036デフォルトの名無しさん2007/01/20(土) 10:34:40
16進文字列を数値配列に変換したいです。

"AABBCC"
↓
[0]=0xAA
[1]=0xBB
[2]=0xCC

16進以外の文字が含まれないという前提のとき、
上記操作を行うような処理はどの用にすればよいでしょうか?

いくつか調べて出てきたものはistringstreamですが、
16進文字は数値に変換できなさそうです。
先頭から1文字ずつ取り出して、自前で"A"→10などと
地道に変換するしかないでしょうか?

すいませんがよろしくお願いします。
0037デフォルトの名無しさん2007/01/20(土) 10:58:49
>>36
strtol
0038デフォルトの名無しさん2007/01/20(土) 11:10:56
>>37さん
ありがとうございました!
0039デフォルトの名無しさん2007/01/20(土) 11:22:51
VC6で正規表現を使うときの関数はRegex使ったらいいのでしょうか?
例えば西暦4桁の数字をあらわす場合どのように書いたらイイデツカ?
0040デフォルトの名無しさん2007/01/20(土) 12:01:32
>>39
西暦4桁の定義をしてくれたまえ。
#もしかしたら、西暦は3000まで行かないかもしれないジャマイカ。
0041デフォルトの名無しさん2007/01/20(土) 12:53:19
winXP環境では、ファイルを最高で何個オープンできますか?
0042デフォルトの名無しさん2007/01/20(土) 12:55:27
メモリの許す限り。と言っても物理的な搭載量や仮想メモリの量ではないだろうが。
0043デフォルトの名無しさん2007/01/20(土) 13:01:06
【ネガティブ派遣根性チェック】

3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。

□派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする
□派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われている
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣労働の問題点の話題が出ると感情剥き出しにする
□派遣労働の問題を指摘する人は嫌いだ
□派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□派遣先社員より自分の生涯収入が低いのは当然だ
□派遣先に尻尾を振り、いつまでも派遣を続けることが大切だ
0044デフォルトの名無しさん2007/01/20(土) 13:47:23
>>40
39ですが、とりあえず西暦9999年迄でオナガイシマシウ
[0-9].[0-9].[0-9].[0-9]
秀丸の正規表現ならこんな感じだと思うのですが、C++はわからねぇ〜
0045デフォルトの名無しさん2007/01/20(土) 14:07:17
>>44
C++言語自体にも標準ライブラリにも正規表現はないから、外部ライブラリを使う。
Boost.Regexとか
ttp://www.boost.org/libs/regex/doc/index.html
0046デフォルトの名無しさん2007/01/20(土) 14:09:38
39のせりふから考えるとたぶん「C++で正規表現」以外の方法をとるべき
Regexコンパイル要るし
0047デフォルトの名無しさん2007/01/20(土) 14:32:13
どうして日本だけバックスラッシュは\なんですか?【winで】
0048デフォルトの名無しさん2007/01/20(土) 14:40:53
>>47
日本で実際に使われているのはASCIIではなくJIS X 0201。
JIS X 0201はほぼアスキーのスーパーセットで互換性があるが、
バックスラッシュは円記号になっている。
0049デフォルトの名無しさん2007/01/20(土) 14:50:57
>>39
多少正規表現っぽいことはscanf()ファミリーにもできる。
それを明らかに越えることをしたいのなら正規表現ライブラリの出番だが....

VC++なら、COM経由でVBScriptのIRegExpなどを使うという手もある。
Cのライブラリとしては、鬼車あたりが定評があるか。

VC++6でBoostはおすすめしないねぇ。
0050デフォルトの名無しさん2007/01/20(土) 14:53:23
>>47-48
それを(互換性のためだが)だらだら引きずって、Unicodeの時代になっても
Windowsの日本語フォントはバックスラッシュのグリフにするべきところを円記号にしている。
0051デフォルトの名無しさん2007/01/20(土) 15:10:38
>5
日本ではU+5cを円記号として扱うために(典型的にはソート)、
"Japanese Unicode"とかがあるんだよな。
0052デフォルトの名無しさん2007/01/20(土) 15:55:41
>>47
ちなみに他国でも同じことやってるとこもある。もちろん、\じゃないけどな
0053デフォルトの名無しさん2007/01/20(土) 16:18:57
ファイルから1行数字を読み込んで
その数字を比較したいんですけど
どうやればいいでしょうか?

#include <fstream>
 using namespace std;
int main() {
char str[8];
ifstream file("1.txt");
file.getline(str, '\n');
if str < (str+1)  //error C2061: 構文エラー : 識別子 'str'
}
0054デフォルトの名無しさん2007/01/20(土) 16:33:50
>>53
boost::lexical_cast
もしくはstd::stringstream
0055532007/01/20(土) 21:14:02
>>54
レスありがとうございます。
相変わらずエラーが出ます。
助けてください。

#include <fstream>
#include <boost/lexical_cast.hpp>
 using namespace std;
int main() {
char str[8];
ifstream file("1.txt");
file.getline(str, '\n');
int a = boost::lexical_cast<int>(str);
if a < (a+1);  //error C2061: 構文エラー : 識別子 'a'
}
0056デフォルトの名無しさん2007/01/20(土) 21:15:53
>>55
boostなんてレベルじゃないぞ。
if文の書き方から遣り直せ。
0057デフォルトの名無しさん2007/01/20(土) 21:16:35
>>55
うん、わかった。
キミはまず入門書を読んだ方がいい。
0058デフォルトの名無しさん2007/01/20(土) 21:43:56
ありがとうございます。
できました。
0059デフォルトの名無しさん2007/01/20(土) 22:32:52
SYSTEM関数でdosコマンドを使用する場合、
system("mkdir c:\Aaaa\Aa");
としてもC:\にAaaaaaが出来ます
c:\Aaaa\Aaを作る方法を教えて下さい
0060デフォルトの名無しさん2007/01/20(土) 22:37:27
\ → \\
0061デフォルトの名無しさん2007/01/20(土) 22:46:50
>>60
本当にありがとうございました
0062デフォルトの名無しさん2007/01/21(日) 03:29:28
Windows(XP)の各環境に合わせて下のC:\\Program Filesを、
DOSやエクスプローラでいう%programfiles%にしたいのですが、
どうやったらできますか?

ShellExecute(NULL,L"open",L"C:\\Program Files\\test.exe",NULL,NULL,SW_SHOWNORMAL);
0063デフォルトの名無しさん2007/01/21(日) 03:40:22
getenv()
0064デフォルトの名無しさん2007/01/21(日) 04:20:16
ありがとうございます。
便利な関数が用意されているんですね。
ですが代入の仕方が分かりません><
すみませんが教えて頂けないでしょうか?

char *env;
env = getenv("programfiles");
ShellExecute(NULL,L"open",L"C:\\Program Files\\test.exe",NULL,NULL,SW_SHOWNORMAL);
0065デフォルトの名無しさん2007/01/21(日) 04:26:24
>>64 これでいけるかな?
char app_name[FILENAME_MAX];
sprintf(app_name, "%s\\test.exe", getenv("programfiles"));
ShellExecute(NULL,L"open",app_name,NULL,NULL,SW_SHOWNORMAL);
0066642007/01/21(日) 05:20:19
ありがとうございます。
Unicode文字セットだとtest.exeが起動しません。
どこを直せばよろしいでしょうか?

TCHAR app_name[FILENAME_MAX];
wsprintf(app_name,L"%s\\test.exe",getenv("programfiles"));
ShellExecute(NULL,L"open",app_name,NULL,NULL,SW_SHOWNORMAL);
0067デフォルトの名無しさん2007/01/21(日) 09:34:09
getenvがchar*を返すため。_tgetenv@<tchar.h>を使え。
また、WindowsだったらExpandEnvironmentStringsを使うのがいいかもしれない。
0068デフォルトの名無しさん2007/01/21(日) 12:37:17
>>66
TCHAR app_name[FILENAME_MAX];
_sntprintf(app_name, FILENAME_MAX,
     _T("%s\\test.exe"), _tgetenv(_T("ProgramFiles")));
ShellExecute(0, _T("open"), app_name, 0, 0, SW_SHOWNORMAL);
0069662007/01/21(日) 13:03:41
>>67-68
上手く動きました。
本当にありがとうございました。
0070デフォルトの名無しさん2007/01/21(日) 21:14:06
どのスレに書けばいいのかわからなかったので、こちらに書きました。
Windows Vista発売に伴い、WinsockのプログラムのUnicode対応を考えています。
ホスト名からIPアドレスを取得するAPI「WSAAsyncGetHostByName()」のUnicode
対応はどのように対応すればいいの?
WSAAsyncGetHostByName()のインターフェースは以下のとおり。
HANDLE WSAAsyncGetHostByName(
HWND hWnd,
unsigned int wMsg,
const char* name,
char* buf,
int buflen
);
ホスト名を指定する変数は、「const char* name」なのでそのままでは使えないと思われます。
WSAAsyncGetHostByName()のUnicode対応用のAPIがあるのでしょうか?又は別の対応方法があるの
でしょうか?
御存知の方がいたら教えてください。

環境:VC++ Ver6.0,開発OS:WinXP SP2

0071デフォルトの名無しさん2007/01/21(日) 21:22:52
>>70
dumpbin -EXPORTS %WINDIR%\system32\ws2_32.dll
してみれば分かるが、WSAAsyncGetHostByName()にはUnicode用APIとの区別は無い。

まー実用上非ASCIIのホスト名、ドメイン名が使われることは無いから
問題ないんだろうけど。
詳しいことは知らんが、
http://developer.mozilla.org/ja/docs/Internationalized_Domain_Names_(IDN)_Support_in_Mozilla_Browsers
などを見る限りでは、非ASCIIドメイン名を7bit-ASCIIにエンコードするRFCなんかも
出来てはいるようだな。

本式で対応するなら、それを使うべきだが、実用的にはwchar_tを使っている場合も
非ASCII文字は含まれていないと仮定し、何も考えずにASCIIへの
狭化変換を行ってしまってよいんでないの?
0072702007/01/21(日) 22:26:45
>>71
ありがとう。
「狭化変換」とはどういう処理のことでしょうか?
Unicodeの倍角文字や4倍角文字にも対応しますか?
御存知であれば教えてください。
0073デフォルトの名無しさん2007/01/21(日) 22:45:37
まだC++勉強を始めて日が浅いのであまり深いことは分かりませんが
#include <iostream.h>
char kotae;

void Qestion_1()
{
    cout << "A" << endl;
    cin >> ::kotae
        if (::kotae== 1)    //エラー
            cout << "OK!" << endl;
        else    //エラー
            cout << "No!" << endl;
}

int main()
{
    int A_A;

    switch (A_A){

    case 1:
        void Qestion_1();
        break;
一部省略しましたが↑のようなプログラムを書いています。
いろいろ変えてみたりしたのですが、どうしてもエラーとした部分でコンパイルエラーがでてしまいます・・・。
どなたかご教示願います
以下エラーの文コピー
ステートメントにセミコロン ( ; ) がない(関数 Question_1() )
else の位置が誤っている(関数 Question_1() )
0074デフォルトの名無しさん2007/01/21(日) 22:46:02
>>72
要するに
void nallow(char *dst, const wchar_t *src)
{
  while (*dst++ = (char)*src++)
    ;
}
のようなものだな。ASCII文字のコードポイントはUnicodeでも同じことを
利用して単純にコピーする。

非ASCIIのホスト名やドメイン名に真面目に対応したければ、
>>71に上げたリンクは最低読むべきだろう。
変換アルゴリズムは自分で組むんだね。勿論WideCharToMultibyte()などは
役に立たないぞ。
0075デフォルトの名無しさん2007/01/21(日) 22:47:15
>>73
エラーメッセージの通りじゃないか。
cin >> ::kotae
の後のセミコロンが抜けている。
0076702007/01/21(日) 22:49:25
>>74
ありがとう。
ちょっと考えてみるよ。
0077デフォルトの名無しさん2007/01/21(日) 22:51:07
>>75
こんな凡ミスでスレを汚してしまい申し訳ありませんでした(´・ω・`)
ちゃんとコンパイルできました・・・。
0078デフォルトの名無しさん2007/01/22(月) 01:53:49
C言語でlog()を使ったプログラムを書いたのですが、

/tmp/cc06qAQP.o(.text+0x2d): In function `main':
: undefined reference to `log'

というエラーメッセージがでてうまく動きません。
ご教授お願いします

#include <math.h>
#include <stdio.h>

int main(void)
{
double val=1.0;
do{
  printf("%f %f\n", val,log(val));
  val++;
}while(val < 11.0);

return 0;
}
0079デフォルトの名無しさん2007/01/22(月) 02:05:57
>>78
コンパイルオプションに -lm を追加汁
0080デフォルトの名無しさん2007/01/22(月) 02:08:32
-lm
0081デフォルトの名無しさん2007/01/22(月) 02:20:07
-lmって何ですか?
0082782007/01/22(月) 02:24:45
>>79-80
質問に答えていただいてありがとうございます!!
無事動きました!!
0083デフォルトの名無しさん2007/01/22(月) 03:41:25
           ∧ ∧
          (*‘ω‘ *)  ちんぽっぽ
           (   )
  ムズムズ     v v    
  ∧ ∧         ぼいんっ
 (*‘ω‘ *)      川
  ((∩∩))    ( (  ) )
0084デフォルトの名無しさん2007/01/22(月) 09:02:10
>>81
一般的なコンパイルオプションで、ライブラリ"m"をリンクしろという指定。
ライブラリ"m"は、一般的に数値演算系の標準関数が入っていると思えばいい。
0085デフォルトの名無しさん2007/01/22(月) 17:28:07
ファイル入出力に関して質問なのですが、今現在
ofstream fout("1.txt");
のような形で計算結果を出力しています。ただこれだと内部変数をいじったときも同じ名前になってしまい
紛らわしいので内部変数とリンクさせて動的なファイル作成をしたいのです。イメージとしては
ofstream fout(N".txt");
です。ただしこれではエラーとなってしまいます。

ofstream fout を使って動的にファイル名をつける方法を教えてください。
もし無理ならば他の手段を教えていただけるとうれしいです。

よろしくお願いいたします。
0086デフォルトの名無しさん2007/01/22(月) 17:33:56
sprintf(file_name, "%d.txt", N);
とでもすると良いのではないかな?
0087デフォルトの名無しさん2007/01/22(月) 17:49:06
C++の標準ライブラリを使ってそれらしくやりたいなら

std::stringstream str;
str << i << ".txt";
{
 ofstream fout(str.str().c_str());
 .......
}
0088852007/01/22(月) 18:00:22
お二方ありがとう御座います。
私の理解度では少し厳しいですが、何とか両方とも勉強してみたいと思います。
ヒントありがとう御座いました。
0089デフォルトの名無しさん2007/01/22(月) 19:13:21
幾つかC言語の初心者向けの書籍を借りたり購入したりしたのですが
#include <stdio.h> の次が書籍によって
int main() や
void main() だったり
main() だけだったり、
()内に void があったり無かったりするのですが
どういった違いで記述が変わっているのでしょうか?
0090デフォルトの名無しさん2007/01/22(月) 19:18:54
>int main() や
>void main() だったり
>main() だけだったり、
>()内に void があったり無かったりするのですが

戻り値の型は明記するべき。
○int main()
×main()
main()の戻り値はintが標準的。
○int main()
×void main()
括弧内を省略すると、引き数のチェックが行なわれない。
#明示的に引き数なしと宣言したわけではない。
○int main(void)
△int main()
尚、C++では省略すると引き数なしとなる。
0091デフォルトの名無しさん2007/01/22(月) 19:22:35
int main()  :正しい。文句無し。
void main() :標準 C では main の戻り値の型は int 。環境依存で void でもコンパイル可能なことも多いし、
        組み込み系では void main を実際に使う場合もあるが、基本的に void main 使う本は糞。
main()    :一応正しいけど、int がないと警告される場合もあるので int は付けた方がいい。
        ささやかなインクや執筆時間の節約の可能性も。

main の中の void の有無は、違いはあるけど、どっちでも実害はない。
普通の関数の場合は、void を入れた方がいい。>>90 を参照
0092デフォルトの名無しさん2007/01/22(月) 19:48:08
>>90-91
詳しい説明ありがとうございます。
0093デフォルトの名無しさん2007/01/22(月) 21:26:40
ttp://www.radiumsoftware.com/0305.html
で紹介されているLeakTracerというソフトを使おうとしているのですが、
紹介通りに進めていって、
$ leak-analyze test.exe
とやった後に
(no debugging symbols found)...(gdb)
と出てきてしまって、メモリリーク先が特定できません。
-gオプションを付けていても、(no debugging symbols found)
などと出る場合はどうすればいいのでしょうか?
gccのバージョンは2.95.3
gdbのバージョンは5.2.1
よろしくお願いします。
0094852007/01/22(月) 21:59:38
http://www9.plala.or.jp/sgwr-t/lib/sprintf.html
このページを参考に
char file_name[100];
sprintf(file_name, "%d.txt", N);

ofstream fout(file_name);

としたところ上手く行きそうです。>86氏の方法も今後探ってみます。
おかげさまで苦手意識の強かった構造体に対する理解が深まりました。
ありがとうございました。
0095sage2007/01/23(火) 00:32:58
次のプログラムを入力してg++ -cでオブジェクトファイルを作ったところ、そのシンボル情報が消えてしまう事態が発生しています。
理由が分かる方はどなたかいらっしゃらないでしょうか。
---ソース---
const int var_const = 0;
const char* str_const = "str_const is const.";
int var = 0;
char* str = "str is not const.";

static int hoge(int a);
struct Fuga {
int var;
int (*func)(int);
};
const struct Fuga fuga_const[] = { {1, hoge}, };
static int hoge(int a) { return 1; }
---実行結果---
$ g++ hoge.c -c -O3
$ nm hoge.o
00000008 D str
00000000 D str_const
00000004 D var
---
というように、constを付けたint、構造体が消えてます(const char*は残ってる)。色々調べてみると、gccだと最適化オプションに関係なく全部残っていて、g++は-O0以外は消えました。
static関数は分かるんですが、それ以外は何故なんでしょう?
別のファイルからこのconst付き変数を使おうと思っても使えず、困っています・・・。
0096デフォルトの名無しさん2007/01/23(火) 00:34:44
extern付けれ。
0097デフォルトの名無しさん2007/01/23(火) 00:40:56
constは自動的にstatic指定されたと見なされる。
0098932007/01/23(火) 01:49:29
自己解決しました。
スレ汚しごめんなさい。
0099デフォルトの名無しさん2007/01/23(火) 03:01:52
超初歩的な質問ですが、->ってどういう意味でしょうか?
例えば↓こういうときの
p=p->next;
0100デフォルトの名無しさん2007/01/23(火) 03:02:23
ポインタを通じたメンバの参照
0101デフォルトの名無しさん2007/01/23(火) 03:09:31
(*p).nextと同じ意味。
■ このスレッドは過去ログ倉庫に格納されています