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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。

【歴代スレ】
1:http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
2:http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
3:http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
4:http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
5:http://pc5.2ch.net/test/read.cgi/tech/1077102238/ (dat落ち)
6:http://pc5.2ch.net/test/read.cgi/tech/1082182233/(dat落ち)
7:http://pc5.2ch.net/test/read.cgi/tech/1086373839/(dat落ち)
8:http://pc5.2ch.net/test/read.cgi/tech/1091264964/(dat落ち)
9:http://pc5.2ch.net/test/read.cgi/tech/1094494997/l50
10:http://pc5.2ch.net/test/read.cgi/tech/1097416187/
11:http://pc5.2ch.net/test/read.cgi/tech/1099190154/
12:http://pc5.2ch.net/test/read.cgi/tech/1101100031/
【ラウンジ】質問、回答が長い時はココを使うと見やすい
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html

関連スレは>>2-5ぐらい
0232デフォルトの名無しさん05/01/18 16:42:41
これから言語覚えようと思うんですけど、direct Xって、visualc++以外でも使えますか?
0233デフォルトの名無しさん05/01/18 16:46:52
>>231
gethostbyname() で、
コンピュータ名から IP 得られなかったっけ?
0234デフォルトの名無しさん05/01/18 17:29:52
>>232
COMが使える言語ならどれでもいいと思うよ。
0235デフォルトの名無しさん05/01/19 14:08:16
age
023623105/01/19 14:09:34
>>233
gethostbyname()で試したところ取得できました。
ありがとうございました。
0237デフォルトの名無しさん05/01/19 15:56:04
あえて、文字列の途中にヌル文字を挿入したいのですが、
lstrcat(buf,"\x00");
0238デフォルトの名無しさん05/01/19 15:57:21
おっと、途中で送信されてしまいました。

上記のような文をforループで回して文字列を作成したいのですが
ヌル文字の部分だけ抜けてしまいます。 何か良い方法ってありますか?
0239デフォルトの名無しさん05/01/19 15:58:25
>237
buf[len+1]=0;
0240デフォルトの名無しさん05/01/19 16:04:23
memcpyでポインタをずらしてまわれ
0241デフォルトの名無しさん05/01/19 16:09:25
[ CTest.h ]

class CTest
{
void Draw() {};
void DrawTest2( CTest2 test2 ) {};
}


[ CTest2.h ]

class CTest2
{
void Draw() {};
void DrawTest( CTest test ) {};
}

main.cppの中でこれらを使用するにはどうしたらいいんでしょうか?
024223205/01/19 16:10:27
>>234
ご返答ありがとうございました。
024324105/01/19 16:10:44
>>241

正常にコンパイルする方法が知りたいんです。
0244デフォルトの名無しさん05/01/19 16:19:09
>241
class CTest;
class CTest2;
をヘッダーの最初に書け
0245デフォルトの名無しさん05/01/19 16:31:46
>>239 ってことはできあいの関数は使えないってことですね。
よくよく考えたら当たり前か・・・。 
自作関数でもつくるしかなさそうですね。
ありがとうございました。
0246デフォルトの名無しさん05/01/19 16:44:04
>>244

VCでやってるんですが、なぜかできないんですよ
エラーメッセージは
認識できない型 'CTest' が使われています。 >>> Init( CTest test ) {}の部分
CTest2' の宣言を確認してください。 >>> clas CTest2;
0247デフォルトの名無しさん05/01/19 16:44:54
>>246

エラーメッセージ訂正

エラーメッセージは
認識できない型 'CTest' が使われています。 >>> Init( CTest test ) {}の部分
'CTest' の宣言を確認してください。 >>> class CTest;
0248デフォルトの名無しさん05/01/19 16:59:27
>247
クラス定義の後で;忘れ
0249デフォルトの名無しさん05/01/19 17:06:27
>>248

いや ちゃんと書いてます。
0250デフォルトの名無しさん05/01/19 17:07:13
以前一つのファイルでできたと思ったので、分割せずに試してみたらそれも無理でした
なんでだろ〜なんでだろ〜〜><;
0251デフォルトの名無しさん05/01/19 17:12:07
http://gamdev.org/up/img/2242.zip

UPしたのでどうやったらコンパイルできるか誰か教えて
0252デフォルトの名無しさん05/01/19 17:12:10
ソースを晒すのが早いと思われ
025325205/01/19 17:13:17
_| ̄|○
0254デフォルトの名無しさん05/01/19 17:13:52
class CTest2;

class CTest
{
  void Init( CTest2 test ) {}
};

class CTest2
{
  void Init( CTest test ) {}
};

int main()
{
  return 0;
}

まーたったこれだけだからUPするまでもなかったorz
0255デフォルトの名無しさん05/01/19 17:34:15
CTest::Init(CTest)
0256デフォルトの名無しさん05/01/19 18:05:15
main.cppで#include "Func.h"
sub.cppで#include "Func.h"

Func.h内は
クラスTimerの定義が有るとすれば
いくら
#ifndef DEF_NAME
#define DEF_NAME
...
#endif
した所で、コンパイルして後のリンク時に再定義エラー
が起こるわけで............。

これじゃ、再定義にならないように#ifndef,#defineの意味無いんじゃない?
1つのソースファイル内でまさか2度同じヘッダをインクルードするわけ
なんてないし...
だとしても、直ぐに気づくと思いますが
025725605/01/19 18:08:01
勘違い(orz
0258デフォルトの名無しさん05/01/19 18:24:38
CTest,CTest2が相互に参照している。設計自体が悪い
0259デフォルトの名無しさん05/01/19 20:05:50
>> 258

そうなのかな?
オブジェクト指向だと双方向関連って普通にあると思うけど

あと全く同じプログラムじゃないけど
Win32プログラムだとなぜかうまくいく。。。なぜなんだ・・orz
0260デフォルトの名無しさん05/01/19 20:29:21
>>259
あのね、君が普段から悪い設計しかしないのは解かったから。
0261デフォルトの名無しさん05/01/19 21:33:19
>>260

は? 双方向関連 やってると設計が悪いのか?
オマイ だめぽw
0262デフォルトの名無しさん05/01/19 23:40:18
>>256
関数の定義と実装を分ければ解決しますよ(たぶん)
0263デフォルトの名無しさん05/01/19 23:43:16
>>261
いや、ダメなのは君の方だよ。場合によってはリスナとか作れよ。
026425605/01/19 23:45:00
>>262
レスありがとうございます。
なんだかヘッダファイルの意味をとんでもなく誤解してたみたいです。
ソースファイルのみで作った方が楽な気がしてきた。
何故ライブラリ作るんだろうと思ってたんですが、腑に落ちた気がしました。
026525605/01/20 00:07:25
ライブラリも結局は関数プロトタイプは必要で
やっぱりライブラリの意味が見出せない。(ry
0266デフォルトの名無しさん05/01/20 00:22:42
>>265
でかいプロジェクト扱ったこと無いだろ。
0267デフォルトの名無しさん05/01/20 00:27:11
>>254
それだけならコンパイル通るはずだぞ。
ホントにそれだけでコンパイルしたのか?
実際はそれ以外のコードが含まれるんじゃないか?

>>265
それ、勉強つか経験が決定的に不足してるわ。
ある程度コーディングの経験があればヘッダファイルの有難味は判る。

0268デフォルトの名無しさん05/01/20 00:29:32
>>266
彼はきっと学部1年生だ。許してやれ。
0269デフォルトの名無しさん05/01/20 00:38:56
>>254
CTest2はCTestより後で定義されてるからCTestはCTest2のサイズを知らない。

そういう場合はポインタ使え。よくある相互参照の解法だ。
ポインタそのものは環境依存だがサイズは固定値。
指してる先の構造体(この場合のCTest2)のサイズがまだ分からない時にも使える。

逆に、CTestはCTest2より前に定義されてるから
CTest2はCTestのサイズを知っている。よってポインタにする必要無し。

したがってこの1箇所の修正でコンパイル通るんじゃないかな?
class CTest
{
  void Init( CTest2 *test ) {}
};
他のコードは一緒。

VC++7.1(のcl.exe)とcygwin g++3.2の両方でコンパイル通ったよ。
0270デフォルトの名無しさん05/01/20 07:59:35
>>254-
不完全型は引数の型とすることはできないだろ。
前方宣言と参照で済ますところだな。
0271デフォルトの名無しさん05/01/20 10:00:37
一定の時間感覚で処理を発生させるのはどうやればいいの?
sleepだと本当に止まってしまうので使えない
VBでいうタイマーコントロールみたいなことをしたいのだけれど
誰か教えてたも
くそ初心者でごめん
0272デフォルトの名無しさん05/01/20 10:04:18
>271
SetTimer,WM_TIMER
0273デフォルトの名無しさん05/01/20 10:07:21
>>271
>>272 の他に、マルチスレッドを使うという手もある。
0274デフォルトの名無しさん05/01/20 10:11:18
すげーレスはやっ。ありがとう>>272,273
それをキーワードに調べてみますよ
0275デフォルトの名無しさん05/01/20 10:41:05
>>269

なるほど。構造のサイズが必要になってたんですね。
さすがでした。ありがとうございます。m( _ _ )m

関連ってポインタでとるものなのに、
簡単なテストコード書いたときに、面倒だったため、
省略してしまいました。
早く気づけば・・orz
0276デフォルトの名無しさん05/01/20 12:31:05
VC++.NETについて質問です。
コンソールアプリで終了時にコンソール画面を残すことはできますか?
いままではBCC+BCC Developerで作ってたのでわかりません・・・;
初歩的な質問ですがお願いします。
0277デフォルトの名無しさん05/01/20 12:35:19
>>276
過去ログでも嫁
027827605/01/20 13:27:17
自己解決しました。
Ctrl+F5でできたとは・・・鬱
0279デフォルトの名無しさん05/01/20 14:08:08
C言語で、

for(z=-10;z<=10;z++){
for(y=-10;y<=10;y++){
x=(Xnosa1(T,A,K,y,z))*(Xnosa1(T,A,K,(y+1),z));
if(x<0){
※Xnosa1(T,A,K,y,z)、Xnosa1(T,A,K,(y+1),z)は関数

例えばこの様に書いたときに、x<0になる事が何度もあっても、初めにx<0になった時点でその時の値だけを返してfor文を終了させるにはどうすればよいでしょうか?
よろしくお願いします。
0280デフォルトの名無しさん05/01/20 14:13:40
返すと言う意味が関数から読み出し元に返すと言う意味なら
if (x < 0) {
return x;
}
単純に二重ループから脱出したいなら
for () { for () {
if (x < 0) {
goto OutOfFor;
}
}}
OutOfFor:
0281デフォルトの名無しさん05/01/20 14:49:17
VC++6を使っています
ガイシュツかもしれませんしググレって言われるかもしれませんが、どこも初心者にも
判りにくいので質問させていただきます。

「半角文字を全角文字」にする方法を教えてください。

どこのサイトもわかりにくかったので・・・。
判りやすいサイトでもあればよいのですが。
自分も引き続きしれべますけどお願いします。
0282デフォルトの名無しさん05/01/20 15:02:57
>>281
文字コードについて勉強汁。
0283デフォルトの名無しさん05/01/20 15:12:00
>281
LCMapString
028428105/01/20 15:39:27
なんとか自力でできました。スミマセンですた。
0285デフォルトの名無しさん05/01/20 19:42:18
Windowsのコンソールアプリを作ろうとしています。
パラレルポートを監視し、その状態に応じ処理を行うものです。
やりたいことは、以下の様な処理です。
int main(void){
/* ここで初期化 */
while(1){
/* パラレルポートの状態を見る。*/
/* hoge 実行 or 何もしない */
}
/* ここで終了処理 */
return 0;
}
このままですと、アプリ終了のためにはCtrl+C等が必要ですが、その場合
終了処理が行えないのが困りものです。パラレル及びhogeのコードそのものに問題はなく、
悩んでいる点は、上記の様なwhileをしつつ、どうやって終了処理をするか、です。
わからないなりに調べ、以下の方法で実現できるかも、という段階まできました。

(案1) Ctrl+Cのシグナルハンドラ作って終了処理を記述
(案2) 副スレッド作ってwhileをやらせる。本スレッドに、getcなどで副スレッド終了用のインターフェース記述

これらが妥当な方針かどうか御教示願えますでしょうか?
(シグナルにせよスレッドにせよまだ勉強不足ですが、そこは今後じっくりやるとして、
方針が正しいかどうか教えて頂きたいのです)

長文すみません。宜しくお願い致します
0286デフォルトの名無しさん05/01/20 20:05:26
案1が簡単。案2は多方向からの信号の排他制御に向いている。
028727105/01/20 20:32:43
タイマーを組み込んでみたんですけど、なんか精度が100ms以下と悪いらしいのでがっくりしました。
そんなわけで「まるちすれっど」を採用しようと思うんですけど、こいつの精度ってどんなもんですか?大体でいいから数字で知りたい。
欲を言えば5ms、最悪20msくらいの分解能はほしいのです。
0288デフォルトの名無しさん05/01/20 20:49:40
【何の質問】C++
【プログラミング歴】数ヶ月
【2ch歴】3年程
【職業】学生
【質問】卒業研究でC++のプログラムを作ることになりまして,皆さんに教えて頂きたいのです.
#include "spec.h"
const double spec::getsVST() { return 23.00; }
const double spec::getsTCV() { return 1.54; }
const double spec::getsSK() { return 0.097; }
このようなcppファイルがあり,今はreturnで数を代入していますが,
他プログラム(Visual C++)
void CCompDlg::OnSaveButton()
{
UpdateData(TRUE);
CFile f;
f.Open("C:\\Compspec.txt",
CFile::modeCreate | CFile::modeWrite );
CArchive ar( &f, CArchive::store );
ar << m_VstEdit << m_TcvEdit << m_SkEdit;
ar.Close();
f.Close();
}
で作成したファイルを読み込んで使用したいのですが,どのように組み込んで良いのかわかりません.
ぜひどなたか詳しい方,方法をお教え願います.
0289デフォルトの名無しさん05/01/20 21:01:46
>>287
藻前の作り方とコンピュータのスペック、
その時の状況などによる。
0290デフォルトの名無しさん05/01/20 21:02:28
>288
ファイルの構造は書き込んだ順にデータが並んでいるだけだ。その順で読み込め。
CFile::Open
CArchive::CArchive
CArchive::operator>>
をヘルプで見よ
0291デフォルトの名無しさん05/01/20 21:06:20
>>290
レスありがとうございます。読み込むには上のcppファイルをどのようなにすれば良いのでしょうか?
思い当たるものを試したんですが、うまくいかないんです。
0292デフォルトの名無しさん05/01/20 21:08:33
>291
ヘルプ見ない奴は何度も同じような質問をする。
0293デフォルトの名無しさん05/01/20 21:22:16
string 型変数は多用してかまいませんか?
char * で処理可能なら従来の C 的なコーディングのほうが
良いのでしょうか?(速度面やサイズなどで)
0294デフォルトの名無しさん05/01/20 21:29:21
>>293
多用OKです。環境はVisualC++6.0です。
0295デフォルトの名無しさん05/01/20 21:38:40
速度が大事なところではchar*を使うべき。
それ以外はすべてstd::string
0296デフォルトの名無しさん05/01/20 21:56:30
普通のプログラムを書くときに、char*を使わなきゃならないほど
速度を求められる場面ってまずないけどな。

アルゴリズムの方がよっぽど重要ネ
0297デフォルトの名無しさん05/01/20 22:04:55
>>295
そうか、わかった。よーくわかったぞ。
0298デフォルトの名無しさん05/01/20 22:11:03
教えてください。
フロッピーディスクが書き込み可能かどうか
(使用可能なフォーマットかどうか)
を調べる処理がどうやれば良いのかわかりません。
よろしくお願いいたします。
029929305/01/20 22:14:39
>>294-296
ありがとうございます。
特に気にするほどでもない、ということですかね。
string 型、便利ですね。
0300デフォルトの名無しさん05/01/20 22:23:27
>>299
その通りだよ。>>295みたいな時代錯誤ジジイの言うことは聞かなくていいからな。
030129505/01/20 22:29:39
必要なことは問題領域において必要十分な柔軟性があることじゃないの?
0302デフォルトの名無しさん05/01/20 22:31:18
void main()
{
char ans;
while(1) {
printf("INPUT y or n\n");
scanf("%c", &ans);
if('n' == ans)
break;
}
return;
}

上のプログラムで y を入力すると「INPUT y or n」
が2行続けて出力されてしまいます。1行のみ順に
出力するにはどうしたらいいのでしょうか?宜しくお願いします。

環境、windows2000proSP4,VisualC++ 6.0SP6
0303デフォルトの名無しさん05/01/20 22:34:58
>>287
タイマーの精度に対してはあまり正確なものは期待できない。
SetTimerよりも、と言う限定つきであれば「マルチメディアタイマー」
について調べてみよ。
0304デフォルトの名無しさん05/01/20 22:42:56
>>302
散々既出だが、scanf()を捨てることをお勧めする。
0305デフォルトの名無しさん05/01/20 22:50:38
>>302
試してないからうまくいくか分からないけど
- scanf("%c", &ans);
+ scanf("%c%*c", &ans);
030628505/01/20 22:51:45
>>286
御指導ありがとうございます。
案1を軸に、余力があれば案2にも挑戦したいと思います
0307デフォルトの名無しさん05/01/20 23:24:43
>>302
scanf(" %c", &ans);
0308デフォルトの名無しさん05/01/20 23:48:16
配列を別の配列に代入するとエラーとなるのですがいいやり方は無いでしょうか?
0309デフォルトの名無しさん05/01/20 23:53:23
>>308
std::vector
0310デフォルトの名無しさん05/01/20 23:54:53
>>308
031130205/01/21 00:00:33
教えて頂いた文で検索したら、バッファに\nが残ってしまう為とか…なるほど
ありがとうございました。
0312デフォルトの名無しさん05/01/21 11:36:15
次の方〜?
0313デフォルトの名無しさん05/01/21 12:25:38
すいません
他人のDLLを使うプログラムで
最終的にDLLを使わず
実行ファイル一本にする方法が
あったら教えていただけると助かります。
環境はWINとBCCとDIRECTX
DLLのソースが無い状態です。
ライセンスひとまず考え無いものとします。
0314デフォルトの名無しさん05/01/21 12:26:16
ライセンスはひとまず考え無いものとします。
0315デフォルトの名無しさん05/01/21 12:30:15
>313
ライセンスが不要と考える根拠は?
0316デフォルトの名無しさん05/01/21 12:33:35
パチかよ
0317デフォルトの名無しさん05/01/21 12:34:30
>>313
DLLで行っている処理を自分で実装する。
これ以外は有り得ない。

って言うか、DLLはexeと別にあるから意味がある。
031831305/01/21 12:36:08
BCC用でダイレクトxをやろうとするとき
必要になるために
無償で配布されてるライブラリなのと
作るものは商用とかそういうレベルじゃないし
仲間に配るだけなんで

0319デフォルトの名無しさん05/01/21 12:38:23
インストーラーメン
032031305/01/21 12:40:46
ファイル数を増やしたくないわけです。
0321デフォルトの名無しさん05/01/21 12:44:24
>>320
なぜ?
ファイルの数は変わっても、
全体のサイズは変わらないぞ?
0322デフォルトの名無しさん05/01/21 12:44:27
あなたを逮捕します。ガチャリ
0323デフォルトの名無しさん05/01/21 12:48:22
>>318
著作権も考えてからものを言え。
032431305/01/21 13:00:42
>>317
なるほどわかりました。ありがとうございました。
0325デフォルトの名無しさん05/01/21 20:57:06
VC++7.1なんですけど
class A : public float
{...
が通りません。
仕様ですか?
0326デフォルトの名無しさん05/01/21 21:02:17
>>325
しょうです
0327デフォルトの名無しさん05/01/21 21:28:42
>>325
float はクラスじゃないだろ。
0328デフォルトの名無しさん05/01/21 22:55:42
>>325
その発想はすごい
0329デフォルトの名無しさん05/01/21 23:26:56
>>328
なんで?
0330デフォルトの名無しさん05/01/22 09:31:31
bcc32を使っています。3つ質問があります。
ぐぐっても入門書を漁っても解決できませんでした…。
一つ目は、
class test{
char test[3]=3;
};
とすると初期化できないというエラーがでるんですが、文法的に間違っているんでしょうか?
2つ目
test.cpp
int main(void){
char test[2][2][2]{
2,2,2,2,2,2,2,2,
};
return 1;
}

とすると「初期化子の一部のみに括弧が付いている」という警告が沢山出て困っているんですが
どういう意味の警告か分かりません。どうすればこの警告が消せますか?

3つ目は入門書には配列は右から詰め込むと書いてあったので、下のようにすると
今度はさっきのに加えて初期化子が多すぎるとエラーがでます。
int main(void){
char test[2][2][2]={
{2,2},
{2,2},

{2,2},
{2,2},
};
return 1;
}
何がどうなってるのかさっぱり分かりません。どなたかよろしくお願いします…。
033133005/01/22 09:54:26
class test{
char test[3]={1,2,3};
};
でした。よく探すと、初期化リストでは出来ないと書いてありました。すみません。
■ このスレッドは過去ログ倉庫に格納されています