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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/06/26(日) 22:45:25
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1117984322/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0153デフォルトの名無しさん2005/06/29(水) 02:11:36
>>152
んじゃ猫のコピペで勉強だな
0154デフォルトの名無しさんNGNG
>>148
>グラフィックライブラリとは一体何ですか?
BASICの場合は、言語自体に描画機能が付いてたけど、
C/C++には描画機能がないので、
代わりに、プラットフォームが用意する関数郡(ライブラリ)を呼ぶ。
たとえば Windows で円を描きたかったら、Ellipse、
UNIX等の X Window システム上で円を描きたかったら、XDrawArc、
を呼び出す、という具合に。

>>152
>コピペでいいんですか?w
いいんですw
初めは部品部品のコピペで、必要に応じてパラメータをいじればいいと思う。
というか慣れてきた後も、(信用できる)サンプルコードの
コピーをいじるって手法はかなり活躍するかと。

生のAPIを使ってWindowsプログラムを作る場合は、
誰が書いてもああいうコードが必要になるから覚悟したほうがいい。
でも機能のかたまりは使い回せるように自分用のライブラリでも
作っておけば、アプリ作成はそんなに辛くないと思う。

VisualC++のMFCとかC++Builderとか使うと
生のAPIをあんまり使わずに簡単にWindowsアプリ組めると思うけど、
俺は使ったことないのでわからんぽ。
0155デフォルトの名無しさん2005/06/29(水) 02:14:01
3DやりたいならOpenGLだろ
DXにいくとDQN化する可能性大
0156デフォルトの名無しさん2005/06/29(水) 02:39:08
Windowsアプリケーションの基本(メッセージポンプ、メッセージ、
ウィンドウクラス、ウィンドウプロシジャ、リソース...)を
一通り理解したらさっさとMFCかATL/WTLへ行くよろし。

なお、「理解」したいんなら猫は適切ではない。
0157デフォルトの名無しさん2005/06/29(水) 02:40:27
>>108
パイプ処理はもちろん環境依存。
sendmailのようなプログラムとどういうやりとりをしたいのか書きましょう。
0158デフォルトの名無しさん2005/06/29(水) 02:48:59
ポインタを整数値にキャストすることについての質問です。
サンプルを見て理解できなかったので、色々検索してみました
が、上手く掛かりませんでした。

pBufferに、freadでファイル内のバイナリデータ全て
を入れてます。(正しくは指している、です)

typedef struct {
int num;
float (*f)[16];
} t_loader;

t_loader* LoadFile(char* pFilename)
{
t_loader* pLoader;
// ファイル読み込み&Allocate
(略)
// mallocの戻り値ポインタを変換
pLoader = (t_loader*)pMallocPtr;
// ココです
pLoader->f = (float(*)[16])( (long)pLoader->f + (long)pLoader );

ポインタをlongにキャストし、「加算」した値というのは
どういう意味を持つのでしょうか?
キャストはアドレス値に変換しているのは分かるのですが、
加算というのが理解できないです。
0159デフォルトの名無しさん2005/06/29(水) 03:21:21
>>158
pLoader->fを+1すると, sizeof(float)*16バイト進んじまうだろ?
任意バイト進めるには(char *)とか(long)とかにキャストする必要がある。
ってことなんじゃねぇかな、何したいのか分からないこの子ー度。
0160デフォルトの名無しさん2005/06/29(水) 03:26:35
>>158
それ、実際に動作するコードなのか?
少なくともそれだけだと、ちょっと理解しかねる
0161デフォルトの名無しさん2005/06/29(水) 03:31:54
longにキャストしてる時点で糞コード
0162デフォルトの名無しさん2005/06/29(水) 03:36:30
161なら何にキャストする?
0163デフォルトの名無しさんNGNG
>>162
161じゃないが、演算のためにポインタを整数値にキャストすること自体が
間違ってると言いたいのだろう。
0164デフォルトの名無しさん2005/06/29(水) 03:53:39
アドレス+整数は普通だが
アドレス+アドレスって、何か意味あんのか

一体何がしたいんだ
01651582005/06/29(水) 03:54:00
構造体はサンプルでは、もっとメンバ多いです。
int n;
int nA;
...
float (*f)[16];
float (*f1)[4];
...
だから、本来(というより自分の知識内でのやり方)は
アドレスをサイズ分ずらしメンバのポインタに入れていくのを
longキャストの部分のおかげでコード量がかなり抑えられているように
感じます。
ポインタ->整数値の例を取り上げたサイトは御存じありませんでしょうか
0166デフォルトの名無しさん2005/06/29(水) 03:58:21
なんか、offsetofとか使えば済む話のように聞こえるんだが
気のせいだろうか
それにしても>>158のコードは不可解
0167デフォルトの名無しさんNGNG
あぁ、なんかやりたいことわかってきた。
>pLoader->f = (float(*)[16])( (long)pLoader->f + (long)pLoader );
この行より前に、ポインタに整数値読み込む処理があるだろ?

組込系とかで、めちゃめちゃに資源が限られてたりするわけ?
そうでなければ、そのサンプルは糞だから参考にしないほうがいい。
0168デフォルトの名無しさん2005/06/29(水) 04:10:07
1)pLoader->f1, pLoader->f2,....に、実際のデータにおけるオフセットを入れる
2)pLoaderに、データ読み込み
3)pLoader->f1, pLoader->f2,....を再計算
ってとこかな

いや実に糞なコードだな
組み込みであっても、不要なコードだろ
0169デフォルトの名無しさん2005/06/29(水) 04:10:43
つーか(float(*)[16])の意味がわからんが
((float*)( (long)pLoader->f + (long)pLoader ))[16]
これならまだわかるが。
0170デフォルトの名無しさん2005/06/29(水) 04:14:08
テポドンの制御ソフトらへんだと思われ。
0171デフォルトの名無しさん2005/06/29(水) 04:15:10
>>169
はぁ?
(float(*)[16])は、float[][16]のような二次元配列を指すポインタに
キャストしとるだけだろ
0172デフォルトの名無しさん2005/06/29(水) 04:22:42
>>171
なるほど、やっとわかった。
なんつーか高度なのか
単にわかりづらいだけのコードなのかわからん。
0173デフォルトの名無しさん2005/06/29(水) 04:24:08
>>170
そうか。ポテドンだったのか。
0174デフォルトの名無しさん2005/06/29(水) 04:35:16
>>158
やっとわかった。
t_loaderのメンバのポインタは、ロード時にfread()でセットされるんだろ。
ファイルのヘッダレコードの中に、構造体のレイアウトどおりに
オフセットが記録してあって、データの先頭からのバイト位置(オフセット)が
一旦ポインタに格納される。
で、データをロードした後で、メモリ上のレイアウトを再計算してるわけだ。

ちょっとトリッキーだな。
01751582005/06/29(水) 04:44:35
なるほど。fread時にポインタにオフセット値を
入れておくのですか。
ポンと手を叩きたくなるほど納得行く説明
ありがとうございました。
0176デフォルトの名無しさん2005/06/29(水) 09:53:02
>>158 は中略したのは問題有りだな。
0177デフォルトの名無しさん2005/06/29(水) 13:45:33
ctrl+cでプログラムを強制終了する際に、これをキャッチすることは出来ないでしょうか?
0178デフォルトの名無しさん2005/06/29(水) 13:59:24
自作クラスって外部変数として使えますか?

error C2653 : 識別子がクラス名でも名前空間名でもありません。
というエラーが出るのですが
0179デフォルトの名無しさん2005/06/29(水) 14:08:45
>>178
ヘッダをインクルドする前に型を使っている予感
0180デフォルトの名無しさん2005/06/29(水) 14:14:29
>>177
環境依存。
0181デフォルトの名無しさんNGNG
>>180
ヒント:スレタイ
01821802005/06/29(水) 14:21:15
>>181
ヒント:>177は環境を提示していない。
0183デフォルトの名無しさん2005/06/29(水) 14:38:29
>>179
ありがとうございます。解決しました。
0184デフォルトの名無しさん2005/06/29(水) 18:54:00
>>182
スマソ
0185デフォルトの名無しさん2005/06/29(水) 19:25:09
#include <iostream>
using namespace std;

class CA {
public:
CA(void){}
CA(int){cout << "a";}
};
main()
{
//new CA(1)[2];
//new CA[2](1);
}

CA(int) のコンストラクタが2回呼ばれると思ったのですが、駄目でした。
配列でとった時、デフォルトコンストラクタ以外を走らせるのは不可能なの
ですか?
0186デフォルトの名無しさん2005/06/29(水) 19:44:50
不可能
0187デフォルトの名無しさん2005/06/29(水) 19:47:56
>>185
C++0xを待たれい
0188デフォルトの名無しさん2005/06/29(水) 19:49:32
>>186-187
諦めます。レスあじがとございました;;
0189まとめ中2005/06/29(水) 20:02:31
まとめサイト作るって言って歓迎されたのでまとめ開始してます。
ver17あたりからまとめてる所。
1スレだけで膨大な量なんでメモ帳で項目分割。
17以後のログは勝手にまとめてますが許してください。
17以前は過去ログにあるものだけ掘って見ます。
過去ログ進呈してくださる方歓迎。

日々日々良ソースやアルゴリズムなど有難う。
プログラマの皆さんに感謝をしつつ、まとめ作業開始。

以後、何事も無かったかのように本来の質疑応答をどぞ ↓
0190デフォルトの名無しさん2005/06/29(水) 20:06:58
>>188
配列各要素に同じ値でいいんだったら、
class CA1 : public CA {CA1() : CA(1) {}};
とでもすればいいじゃん。
#私は嫌だけど。
0191デフォルトの名無しさん2005/06/29(水) 20:07:47
>>185の
new CA[2]; ってどういう意味ですか?
どういうふうに使うのですか?
0192デフォルトの名無しさん2005/06/29(水) 20:09:09
>>189
頑張れよー
0193デフォルトの名無しさん2005/06/29(水) 20:26:40
>>191
CAがクラスならCAクラスのインスタンスを2つ作る
CAが何かのデータ型なら、2つ分の連続したCA型変数の領域を確保する
0194デフォルトの名無しさん2005/06/29(水) 20:33:47
ん? こうなったよ?
#include <iostream>
using namespace std;
class CA
{
public:
  CA(){cout << "default" << endl;}
  CA(int x){ cout << "param int x = " << x << endl;}
};
main()
{
  new CA[2](10);
}

[実行結果]
param int x = 10
param int x = 10
0195デフォルトの名無しさん2005/06/29(水) 21:00:19
>>193
ありがとうございます。
0196デフォルトの名無しさん2005/06/29(水) 21:11:23
何かゴミ捨て場漁ってたらVC++6.0が出てきた。
どうすりゃいいんだ?一応インストしてみたら使えるし。
まぁ、いいや。わーいいいもん手に入れたー
0197デフォルトの名無しさん2005/06/29(水) 21:12:06
とりあえずSTLPortでもいれとけ。
0198デフォルトの名無しさん2005/06/29(水) 21:13:59
最新のPlatformSDKはVC++6.0では使えないので注意


所詮は過去のコンパイラよ
0199デフォルトの名無しさん2005/06/29(水) 21:28:58
ヽ(`Д´)ノ ウルサーーーイ
02001452005/06/29(水) 21:57:49
Windowsアプリを作る場合、MicrosoftのVisualC++とかいうのは必要なのでしょうか?

いきなり数万も投資するのは抵抗があるので、とりあえずフリーでダウンロードできる
VisualC++Express2005Beta2とかいうのをダウンロードしたのですが、ボタンが多すぎるし
ヘルプは何処を読んで良いのか解らず全然使い方が解りませんorz
0201デフォルトの名無しさん2005/06/29(水) 22:06:21
WinAPIが扱えるならどれでも
VCがそれなりに便利なのは確かだけど
02021452005/06/29(水) 22:08:26
ちなみに今使っているのは本のCD-ROMについていたBorlandC++コンパイラとかいう
DOS窓から使う味も素っ気もない奴なんですが、これで問題ないでしょうか?
0203デフォルトの名無しさん2005/06/29(水) 22:08:53
>>200
↓でも使ってみれば?C/C++じゃないけどC++書けるなら簡単に使えるはず
http://onigiri.s3.xrea.com:8080/delphi/index.php?Delphi%A4%CE%C6%FE%BC%EA%A4%C8%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB%2FDelphi6
0204デフォルトの名無しさん2005/06/29(水) 22:17:00
このスレ褒められてから回答が丁寧だな

おまいらほめられて伸びるタイプなんですね
0205デフォルトの名無しさん2005/06/29(水) 22:42:10
>>189
part18までのログdat
ttp://www.uploda.org/file/uporg137053.zip.html
0206デフォルトの名無しさん2005/06/29(水) 23:46:24
>>194
そんな文法は標準では無かったはず・・・。
コンパイラ何?
0207デフォルトの名無しさん2005/06/29(水) 23:47:39
>>187
組み込み配列の要素ごとのコンストラクタ制御について、何か提案されてたっけ?
0208過去ログQ&Aまとめ中 ◆tOP1/BWZ7g 2005/06/30(木) 00:01:33
>>205
有難うございます。作業量大幅UPキター(汗
作業してたらこんな時間orz
明日からpart1から編集入ろう。
まだローカル作業中。ページ申し込みしてきました。
1日で100レス以上行くので早い事part19まで編集しなければ追いつかない。

ガンガル
スレ汚しレスすまそ。
以後、何事も無かったかのように ↓
0209デフォルトの名無しさん2005/06/30(木) 00:03:57
>>208
現時点からにしとけよ。
0210デフォルトの名無しさん2005/06/30(木) 00:09:07
Unixとかのコマンドラインアプリで、画面の状態を更新する物はどうやっているんですか?
例えば、エディタとかゲームとか。普通にprintf系で出力してないんでしょうか。
0211デフォルトの名無しさん2005/06/30(木) 00:09:22
>>208ガンガレ
0212デフォルトの名無しさん2005/06/30(木) 00:45:05
>>210

cursesのことを指してるのかぇ?
0213デフォルトの名無しさん2005/06/30(木) 00:47:25
>>210
エスケープシーケンス
0214デフォルトの名無しさん2005/06/30(木) 00:56:19
>>208
もし貴方の優れた試みが成功したならば、恐らく多くの2chのプログラマーが
大きな助けとなるでしょう。

英語の直訳風に言ってみた。
0215デフォルトの名無しさん2005/06/30(木) 01:06:43
>>212
>>213
cursesで行けそうですね。有り難うございます。
エスケープシーケンスでもできるんですか?ちょっと想像つかないのですが...
02161452005/06/30(木) 01:14:22
>>203
DelphiってPascalですよね。
CとC++を覚えたばかりで更に他の言語を詰め込むのってどうなんだろう。

普通Winアプリを作る場合、やっぱりC++BuilderとかVC++のようなRADツールを使うんですよね?
メモ帳でWinアプリのソースを書いてBorlandのC++コンパイラを使ってDOS窓からコンパイルしている人っていますか?
VC++Express2005の使い方がどこかにあればいいんですが、全然見つからないorz
やっぱり諭吉さんとお別れして製品版を手に入れるほか無いですかね。
というか製品版にはマニュアルついているんですよね?
パソコンにプリインストされていたOfficeみたいにマニュアルが付属していなかったら最悪orz
0217デフォルトの名無しさん2005/06/30(木) 01:15:31
>>215
man terminfo

つか、その手のプログラムのソース見れ
0218デフォルトの名無しさん2005/06/30(木) 01:16:18
書評みたいでいいな。発言者が「208氏」ってなんの。

「本ページは名無しの、名無しによる、名無しの為の過去ログである。
 トピックはどれも現場(学校、研修所、会社、学校)で生まれたものであり、
 これを読めば貴方もデフォルトと成ることでしょう(意味不明」
0219デフォルトの名無しさん2005/06/30(木) 01:54:04
>>217
man見ときます。すいません。
この手のプログラムって大抵巨大なんで初心者には厳しい...
0220デフォルトの名無しさん2005/06/30(木) 06:09:52
>>216
DelphiはDelphiである
0221デフォルトの名無しさん2005/06/30(木) 07:19:16
>>216
>CとC++を覚えたばかりで更に他の言語を詰め込むのってどうなんだろう。

そう思うでしょ? でもね、人間というのはティミが考えてるよりもっともっと
包容力があるんだよ。
0222デフォルトの名無しさん2005/06/30(木) 07:38:49
accelerated c++(和訳版)に載っていた入力単語の登場回数を数えるサンプルコードなのですが、
コンパイルは成功するのですが実行しても意図した動作をしません。
恐らく無限ループになっています。
何度か見直して、ちゃんと本の通りになっていると思うのですが・・・何処がダメなのでしょうか?
int main(){
string s;
map <string,int> counters;
while (cin >> s)
++counters[s];
for (map<string,int>::const_iterator it = counters.begin();it != counters.end(); ++it){
cout << it->first << "\t" << it->second << endl;
}
return 0;
}
0223デフォルトの名無しさん2005/06/30(木) 07:44:19
>>222
BCC5.5.1 + WindowsXPSP2 では正しく動く。
環境は?
0224デフォルトの名無しさん2005/06/30(木) 08:07:45
>>223
cinの入力終了方法を分かってませんでした_no
Ctrl+zを入力たら上手く動きました。
すみません。
0225デフォルトの名無しさん2005/06/30(木) 10:11:42
>>224
ダメだこりゃ! パーフーパーフー
0226デフォルトの名無しさん2005/06/30(木) 10:30:21
以下のプログラムを実行してもkeyは何も表示されず最後のレコードの値しか表示されません。
mapの使用を終える前にkeyをdeleteしてしまうとまずいのでしょうか?
しかし、最初のループでdeleteをせずに後のループでdelete &(it->first)と言う様にやってもダメな様だし
どうすれば良いのでしょうか?やりたい事は文字列をキーにしてunsigned int二つ分のデータを値にする事です。
#include <iostream>
#include <string>
#include <map>
using namespace std;
void itoa(char* str,unsigned int num) //数値から数字への変換関数
{unsigned int radix=10;unsigned int i=0;while(num){str[4-i]=(char)(num%radix+48);num/=radix;i++;}}
int main(){
map <string,unsigned int*> range;int i=0;string *index = NULL;char tmp[5] = "";while(i<10){itoa(tmp,i);index = new string(tmp);
range[*index] = (unsigned int*)malloc(sizeof(unsigned int)*2);(range[*index])[0] = i;(range[*index])[1] = i+10000;
delete index;i++;}i=0;for(map<string,unsigned int*>::const_iterator it = range.begin();
it != range.end(); ++it){
cout << "key:" << it->first << "\tvalue1:" << (it->second)[0] << "\tvalue2:" << (it->second)[1] << endl;free(it->second);}
0227デフォルトの名無しさん2005/06/30(木) 13:39:36
>>226
突込みどころ満載なんで一言だけ。
itoaが期待通り動作してない。
0228デフォルトの名無しさん2005/06/30(木) 14:42:23
>>226
itoa()のような非標準の関数使うなや。検証できない環境の香具師もいるんだぞ。
0229デフォルトの名無しさん2005/06/30(木) 14:57:05
>>226
こう?
#include <iostream>
#include <string>
#include <map>
#include <sstream>
#include <vector>
using namespace std;
int main()
{
typedef string Key;
typedef vector <unsigned int> Value_Container;
typedef map <Key, Value_Container> Map;
Map range;
for (int i (0); i < 10; ++ i)
{
ostringstream index;
index << i;
Value_Container &value_container (range[index.str ()]);
value_container.resize (2);
value_container[0] = i;
value_container[1] = i+10000;
}
for(Map::const_iterator it = range.begin(); it != range.end(); ++ it)
cout << "key:" << it->first << "\tvalue1:" << (it->second)[0] << "\tvalue2:" << (it->second)[1] << endl;
}
0230デフォルトの名無しさん2005/06/30(木) 15:01:28
64bitポインタの32bitへの縮小ってできます?
間違って宿題スレに書いてた..
0231デフォルトの名無しさん2005/06/30(木) 15:08:39
>>228
レス良く見れや。itoaをわざわざ定義してるやン
それがおかしいんだけど
あと、このスレは環境依存OKだったはず

>>229
struct Value_Container {
 unsigned int first, second;
 Value_Container( unsigned int f=0, unsigned int s=0)
   : first(f), second(s) {};
};
でいいような。
0232デフォルトの名無しさん2005/06/30(木) 15:26:07
>>230
キャストできるけど何が起きても責任は取れない
0233デフォルトの名無しさん2005/06/30(木) 15:26:58
>>231
もちろん

typedef pair <unsigned int, unsigned int> Value_Container;
とかも
0234デフォルトの名無しさん2005/06/30(木) 15:28:44
226はmallocだからvectorにしときました
0235デフォルトの名無しさん2005/06/30(木) 15:29:35
>>232
キャスト以外に方法ないんですかね?
32bitの領域にメモリ確保して移すとか
0236デフォルトの名無しさん2005/06/30(木) 15:55:54
>>235
キャストは方法に入らない
ダウンサンクで検索汁
0237デフォルトの名無しさん2005/06/30(木) 17:13:33
すんごい初心者な質問ですいません。

コンパイラがstdio.hファイルをオープン出来ないなですが、何故なんでしょうか?
0238デフォルトの名無しさん2005/06/30(木) 17:16:25
>>237
コンパイラが正しくインストール/セットアップされていない
0239デフォルトの名無しさん2005/06/30(木) 17:22:26
>>238 一応マニュアル通りにセットアップしたのですが
自分に落ち度があったかもしれません。
もう一度やり直してみます。ありがとうございます。
0240デフォルトの名無しさん2005/06/30(木) 17:38:53
パスが正しく設定されていない。
環境変数のチェック汁
0241デフォルトの名無しさん2005/06/30(木) 18:08:55
>>240
コンパイラは作動してるんだろうから、環境変数の問題じゃなさそうじゃね?
予想だがBCCの.cfgにパスを書き込んでいないくさい希ガス。
>>237はまずコンパイラが何なのかを書き込みましょう。
でないと答えようがないです。
0242デフォルトの名無しさん2005/06/30(木) 19:00:04
>>240-241さん。
コンパイルできました。
別の本みて、cfgファイル作ってみたら、上手く動作しました。
何で上手くいったのかはよく分かりませんが、何にせよ助言ありがとうございました。
0243デフォルトの名無しさん2005/06/30(木) 19:06:55
64bitポインタ型へのキャストの文がわからない..
64bitであることを明示するにはどうすればいいんですかね?.
(?)hoge
0244デフォルトの名無しさん2005/06/30(木) 19:20:26
>>243
64bitポインタの環境ならば*で64bitになるんじゃないのか?
0245デフォルトの名無しさん2005/06/30(木) 19:26:50
mingw日本版のインストール方法がわかりません
どなたか教えてください
mingwのインストールは出来ました

ディレクトリ名はMingw-jpにしておきました
そうしろとあったので
02462452005/06/30(木) 19:27:23
win98です
0247デフォルトの名無しさん2005/06/30(木) 19:39:29
>>206
亀レスだが、cygwin gcc 3.3.3 です。
0248デフォルトの名無しさん2005/06/30(木) 19:44:10
インストーラダブルクリックであとは自動じゃなかったっけ?
環境変数
PATH  に Mingwのbin CPLUS_INCLUDE_PATH に includeが必要だっけ。
0249デフォルトの名無しさん2005/06/30(木) 19:49:11
>>244
設定とは関係なしに明示したいのですが...
ちなみにVS.net2003です
0250デフォルトの名無しさん2005/06/30(木) 19:49:25
1からCをやるのにオススメのサイトとかある?
0251デフォルトの名無しさん2005/06/30(木) 19:51:58
角度を入力してラジアンに変えるのを関数で定義したいです。
#include <stdio.h>
#define pi 3.141592
double rad(double a)

main(){
int ans,rad,x;
printf("角度を入力してください");
scanf("%lf", &x);
ans=double rad(double a)
printf("%f\n",ans);
}
double rad(double a){
int x;
a=x*(pi/180);
}
こう書いたんですがうまくきません。
0252デフォルトの名無しさん2005/06/30(木) 19:59:33
で、そのradって関数の定義はどこにあるんだ?
■ このスレッドは過去ログ倉庫に格納されています