【初心者歓迎】C/C++室 Ver.34【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/01/17(水) 22:16:00ただしその場合、質問者は必ず、環境を書きましょう。
※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:450003デフォルトの名無しさん
2007/01/17(水) 22:24:22乙
0004質問1(続き)
2007/01/17(水) 23:01:47いろいろ回答ありがとうございました。
そうですね。まず普通は、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:080006デフォルトの名無しさん
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 みたいですっきりしません。
00076
2007/01/17(水) 23:43:390008デフォルトの名無しさん
2007/01/18(木) 00:05:03§3.1.3
extren const int MAXLEN = 65535; // definitions
extern const int MAXLEN; // declarations
前者は定義なのに対して後者は宣言に過ぎない。という事は、
リンク時まで値が決定しないという事であり、配列はコンパイル時
に大きさを要求する事から、使えない。
ヘッダファイルにでも入れたらどうか。
0009デフォルトの名無しさん
2007/01/18(木) 00:10:06当然だが。
0010デフォルトの名無しさん
2007/01/18(木) 00:12:5200116
2007/01/18(木) 00:21:31const 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:38constが内部リンケージを持つのは、#defineの代わりにコンパイル時定数として扱えるようにするため。
const自体に内部リンケージを持つ意味が含まれているので、staticはあってもなくても同じ。ただしクラス・関数内を除く。
0014デフォルトの名無しさん
2007/01/18(木) 00:30:16C++では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でも挙動は同じだろう。
但し実際に領域を使うとすれば、多分違う場所に確保されるだろう。
00156
2007/01/18(木) 00:38:36重ね重ね、ありがとうございます。
>>ALL
瑣末な疑問かとも思いましたが、勉強になりました。思い切って質問して良かっ
たです。ありがとうございました。
0016デフォルトの名無しさん
2007/01/18(木) 03:15:15独習Cを終えた程度の素人です。
練習問題としてCプログラムをなるべく多く作ってみたいのですが、
Webに問題集みたいなサイトありませんか。よろしくお願いします。
0017デフォルトの名無しさん
2007/01/18(木) 05:01:06Webには無いと思う。
C/C++の宿題片付けますのスレの問題やってみるぐらいじゃない?
でも、独習Cってどれくらいの内容の物かわからないけど
たぶん、まだ知らないことは多いと思うから、書籍購入して
サンプルみながら勉強続けるとかが良いんじゃない?
ちなみに家に、C言語500問っていう本あるけど
「ん〜・・簡単だな・・」って思ったけど知識が身に付いてる分
簡単だと思ったのかもしれない。でも、別にこの本を勧めはしない。
0018デフォルトの名無しさん
2007/01/18(木) 13:46:26明確な目標がある分やりやすいよ。
0019デフォルトの名無しさん
2007/01/18(木) 15:34:45「RPG作るぞ!」も明確じゃない
「MMORPGならどうだ?いっぱい人があつまって楽しくできるゲームつくるぞ!」もだめ
何を言いたいかってーと、動機と目標を一色多にするなってことです
0020デフォルトの名無しさん
2007/01/18(木) 18:58:19この中にもし整数nが含まれるとしたらそれが何番目に入っているかを知りたいです。
それで調べたらなにやらfindとかいうのが使えるみたいなんですが
イテレータとかいうのがワケが分からないのでどう書いたらいいか分かりません。
書き方を教えてください。
0021デフォルトの名無しさん
2007/01/18(木) 19:03:27cout << n << " is found at " << ii - vec.begin() << endl;
else
cout << n << " is not found" << endl;
002221
2007/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うまくいきました。サンクスコ。
0024デフォルトの名無しさん
2007/01/18(木) 23:24:30ありがとうございます。本を購入してもうすこし勉強してみます。
0025デフォルトの名無しさん
2007/01/19(金) 14:44:13int i;
cin >> str;
i = atoi(str);
こういう風にするとconstじゃないって怒られるんですが
stringをintに変換するにはどうすればいいんでしょうか?
cin >> i; ではなくて一度stringに入れてからatoi()というかJavaのInteger.parseInt()みちあな感じでやりたいんです
0026デフォルトの名無しさん
2007/01/19(金) 14:47:560027デフォルトの名無しさん
2007/01/19(金) 14:48:20s >> 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());
002925
2007/01/19(金) 14:49:22できました
ありがとうございました
003025
2007/01/19(金) 14:50:400032デフォルトの名無しさん
2007/01/19(金) 15:13:48>>27の例では三者三様なので注意。
C標準関数でatoi()より高級なものとしては、strtol()なんてのもある。
0034デフォルトの名無しさん
2007/01/19(金) 21:46:530035デフォルトの名無しさん
2007/01/19(金) 21:55:200036デフォルトの名無しさん
2007/01/20(土) 10:34:40"AABBCC"
↓
[0]=0xAA
[1]=0xBB
[2]=0xCC
16進以外の文字が含まれないという前提のとき、
上記操作を行うような処理はどの用にすればよいでしょうか?
いくつか調べて出てきたものはistringstreamですが、
16進文字は数値に変換できなさそうです。
先頭から1文字ずつ取り出して、自前で"A"→10などと
地道に変換するしかないでしょうか?
すいませんがよろしくお願いします。
0037デフォルトの名無しさん
2007/01/20(土) 10:58:49strtol
0038デフォルトの名無しさん
2007/01/20(土) 11:10:56ありがとうございました!
0039デフォルトの名無しさん
2007/01/20(土) 11:22:51例えば西暦4桁の数字をあらわす場合どのように書いたらイイデツカ?
0040デフォルトの名無しさん
2007/01/20(土) 12:01:32西暦4桁の定義をしてくれたまえ。
#もしかしたら、西暦は3000まで行かないかもしれないジャマイカ。
0041デフォルトの名無しさん
2007/01/20(土) 12:53:190042デフォルトの名無しさん
2007/01/20(土) 12:55:270043デフォルトの名無しさん
2007/01/20(土) 13:01:063つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。
□派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする
□派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われている
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣労働の問題点の話題が出ると感情剥き出しにする
□派遣労働の問題を指摘する人は嫌いだ
□派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□派遣先社員より自分の生涯収入が低いのは当然だ
□派遣先に尻尾を振り、いつまでも派遣を続けることが大切だ
0044デフォルトの名無しさん
2007/01/20(土) 13:47:2339ですが、とりあえず西暦9999年迄でオナガイシマシウ
[0-9].[0-9].[0-9].[0-9]
秀丸の正規表現ならこんな感じだと思うのですが、C++はわからねぇ〜
0045デフォルトの名無しさん
2007/01/20(土) 14:07:17C++言語自体にも標準ライブラリにも正規表現はないから、外部ライブラリを使う。
Boost.Regexとか
ttp://www.boost.org/libs/regex/doc/index.html
0046デフォルトの名無しさん
2007/01/20(土) 14:09:38Regexコンパイル要るし
0047デフォルトの名無しさん
2007/01/20(土) 14:32:130048デフォルトの名無しさん
2007/01/20(土) 14:40:53日本で実際に使われているのはASCIIではなくJIS X 0201。
JIS X 0201はほぼアスキーのスーパーセットで互換性があるが、
バックスラッシュは円記号になっている。
0049デフォルトの名無しさん
2007/01/20(土) 14:50:57多少正規表現っぽいことはscanf()ファミリーにもできる。
それを明らかに越えることをしたいのなら正規表現ライブラリの出番だが....
VC++なら、COM経由でVBScriptのIRegExpなどを使うという手もある。
Cのライブラリとしては、鬼車あたりが定評があるか。
VC++6でBoostはおすすめしないねぇ。
0050デフォルトの名無しさん
2007/01/20(土) 14:53:23それを(互換性のためだが)だらだら引きずって、Unicodeの時代になっても
Windowsの日本語フォントはバックスラッシュのグリフにするべきところを円記号にしている。
0051デフォルトの名無しさん
2007/01/20(土) 15:10:38日本ではU+5cを円記号として扱うために(典型的にはソート)、
"Japanese Unicode"とかがあるんだよな。
0052デフォルトの名無しさん
2007/01/20(土) 15:55:41ちなみに他国でも同じことやってるとこもある。もちろん、\じゃないけどな
0053デフォルトの名無しさん
2007/01/20(土) 16:18:57その数字を比較したいんですけど
どうやればいいでしょうか?
#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:50boost::lexical_cast
もしくはstd::stringstream
005553
2007/01/20(土) 21:14:02レスありがとうございます。
相変わらずエラーが出ます。
助けてください。
#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:53boostなんてレベルじゃないぞ。
if文の書き方から遣り直せ。
0057デフォルトの名無しさん
2007/01/20(土) 21:16:35うん、わかった。
キミはまず入門書を読んだ方がいい。
0058デフォルトの名無しさん
2007/01/20(土) 21:43:56できました。
0059デフォルトの名無しさん
2007/01/20(土) 22:32:52system("mkdir c:\Aaaa\Aa");
としてもC:\にAaaaaaが出来ます
c:\Aaaa\Aaを作る方法を教えて下さい
0060デフォルトの名無しさん
2007/01/20(土) 22:37:270061デフォルトの名無しさん
2007/01/20(土) 22:46:50本当にありがとうございました
0062デフォルトの名無しさん
2007/01/21(日) 03:29:28DOSやエクスプローラでいう%programfiles%にしたいのですが、
どうやったらできますか?
ShellExecute(NULL,L"open",L"C:\\Program Files\\test.exe",NULL,NULL,SW_SHOWNORMAL);
0063デフォルトの名無しさん
2007/01/21(日) 03:40:220064デフォルトの名無しさん
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:24char app_name[FILENAME_MAX];
sprintf(app_name, "%s\\test.exe", getenv("programfiles"));
ShellExecute(NULL,L"open",app_name,NULL,NULL,SW_SHOWNORMAL);
006664
2007/01/21(日) 05:20:19Unicode文字セットだと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また、WindowsだったらExpandEnvironmentStringsを使うのがいいかもしれない。
0068デフォルトの名無しさん
2007/01/21(日) 12:37:17TCHAR 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);
0070デフォルトの名無しさん
2007/01/21(日) 21:14:06Windows 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:52dumpbin -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への
狭化変換を行ってしまってよいんでないの?
007270
2007/01/21(日) 22:26:45ありがとう。
「狭化変換」とはどういう処理のことでしょうか?
Unicodeの倍角文字や4倍角文字にも対応しますか?
御存知であれば教えてください。
0073デフォルトの名無しさん
2007/01/21(日) 22:45:37#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要するに
void nallow(char *dst, const wchar_t *src)
{
while (*dst++ = (char)*src++)
;
}
のようなものだな。ASCII文字のコードポイントはUnicodeでも同じことを
利用して単純にコピーする。
非ASCIIのホスト名やドメイン名に真面目に対応したければ、
>>71に上げたリンクは最低読むべきだろう。
変換アルゴリズムは自分で組むんだね。勿論WideCharToMultibyte()などは
役に立たないぞ。
0075デフォルトの名無しさん
2007/01/21(日) 22:47:15エラーメッセージの通りじゃないか。
cin >> ::kotae
の後のセミコロンが抜けている。
0077デフォルトの名無しさん
2007/01/21(日) 22:51:07こんな凡ミスでスレを汚してしまい申し訳ありませんでした(´・ω・`)
ちゃんとコンパイルできました・・・。
0078デフォルトの名無しさん
2007/01/22(月) 01:53:49/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コンパイルオプションに -lm を追加汁
0080デフォルトの名無しさん
2007/01/22(月) 02:08:320081デフォルトの名無しさん
2007/01/22(月) 02:20:070083デフォルトの名無しさん
2007/01/22(月) 03:41:25(*‘ω‘ *) ちんぽっぽ
( )
ムズムズ v v
∧ ∧ ぼいんっ
(*‘ω‘ *) 川
((∩∩)) ( ( ) )
0084デフォルトの名無しさん
2007/01/22(月) 09:02:10一般的なコンパイルオプションで、ライブラリ"m"をリンクしろという指定。
ライブラリ"m"は、一般的に数値演算系の標準関数が入っていると思えばいい。
0085デフォルトの名無しさん
2007/01/22(月) 17:28:07ofstream fout("1.txt");
のような形で計算結果を出力しています。ただこれだと内部変数をいじったときも同じ名前になってしまい
紛らわしいので内部変数とリンクさせて動的なファイル作成をしたいのです。イメージとしては
ofstream fout(N".txt");
です。ただしこれではエラーとなってしまいます。
ofstream fout を使って動的にファイル名をつける方法を教えてください。
もし無理ならば他の手段を教えていただけるとうれしいです。
よろしくお願いいたします。
0086デフォルトの名無しさん
2007/01/22(月) 17:33:56とでもすると良いのではないかな?
0087デフォルトの名無しさん
2007/01/22(月) 17:49:06std::stringstream str;
str << i << ".txt";
{
ofstream fout(str.str().c_str());
.......
}
008885
2007/01/22(月) 18:00:22私の理解度では少し厳しいですが、何とか両方とも勉強してみたいと思います。
ヒントありがとう御座いました。
0089デフォルトの名無しさん
2007/01/22(月) 19:13:21#include <stdio.h> の次が書籍によって
int main() や
void main() だったり
main() だけだったり、
()内に void があったり無かったりするのですが
どういった違いで記述が変わっているのでしょうか?
0090デフォルトの名無しさん
2007/01/22(月) 19:18:54>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:35void main() :標準 C では main の戻り値の型は int 。環境依存で void でもコンパイル可能なことも多いし、
組み込み系では void main を実際に使う場合もあるが、基本的に void main 使う本は糞。
main() :一応正しいけど、int がないと警告される場合もあるので int は付けた方がいい。
ささやかなインクや執筆時間の節約の可能性も。
main の中の void の有無は、違いはあるけど、どっちでも実害はない。
普通の関数の場合は、void を入れた方がいい。>>90 を参照
0092デフォルトの名無しさん
2007/01/22(月) 19:48:08詳しい説明ありがとうございます。
0093デフォルトの名無しさん
2007/01/22(月) 21:26:40で紹介されているLeakTracerというソフトを使おうとしているのですが、
紹介通りに進めていって、
$ leak-analyze test.exe
とやった後に
(no debugging symbols found)...(gdb)
と出てきてしまって、メモリリーク先が特定できません。
-gオプションを付けていても、(no debugging symbols found)
などと出る場合はどうすればいいのでしょうか?
gccのバージョンは2.95.3
gdbのバージョンは5.2.1
よろしくお願いします。
009485
2007/01/22(月) 21:59:38このページを参考に
char file_name[100];
sprintf(file_name, "%d.txt", N);
ofstream fout(file_name);
としたところ上手く行きそうです。>86氏の方法も今後探ってみます。
おかげさまで苦手意識の強かった構造体に対する理解が深まりました。
ありがとうございました。
0095sage
2007/01/23(火) 00:32:58理由が分かる方はどなたかいらっしゃらないでしょうか。
---ソース---
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:440097デフォルトの名無しさん
2007/01/23(火) 00:40:56009893
2007/01/23(火) 01:49:29スレ汚しごめんなさい。
0099デフォルトの名無しさん
2007/01/23(火) 03:01:52例えば↓こういうときの
p=p->next;
0100デフォルトの名無しさん
2007/01/23(火) 03:02:230101デフォルトの名無しさん
2007/01/23(火) 03:09:31■ このスレッドは過去ログ倉庫に格納されています