トップページ⇒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ぐらい
0002デフォルトの名無しさんNGNG
なんで重複スレを立てるんだよ。
http://dayomon.org/
0003デフォルトの名無しさんNGNG
【関連スレ(処理系別)】
★初心者にVisual C++を教えるスレ★ Part16
http://pc5.2ch.net/test/read.cgi/tech/1101022051/
■ MFC相談室 MFC12.dll■
http://pc5.2ch.net/test/read.cgi/tech/1096848771/
C++Builder相談室 Part12
http://pc5.2ch.net/test/read.cgi/tech/1099238936/
GCCについて part5
http://pc5.2ch.net/test/read.cgi/tech/1103057320/
cygwin + mingwn + gcc 相談室
http://pc5.2ch.net/test/read.cgi/tech/1058134693/
タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/
Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/
Turbo C++ 5.0 プログラミング
http://pc5.2ch.net/test/read.cgi/tech/1030878794/
0004デフォルトの名無しさんNGNG
【関連スレ(その他)】
C言語なら俺に聞け! Part 98
http://pc5.2ch.net/test/read.cgi/tech/1104114259/
C++相談室 part38
http://pc5.2ch.net/test/read.cgi/tech/1101473340/
ぼるじょあがC/C++の宿題を片付けますYO! 37代目
http://pc5.2ch.net/test/read.cgi/tech/1103913840/
【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/
C++は難しすぎ 難易度:2
http://pc5.2ch.net/test/read.cgi/tech/1071697977/
C言語の第一歩
http://pc5.2ch.net/test/read.cgi/tech/1031374980/
★C言語で遊ぼう!★
http://pc5.2ch.net/test/read.cgi/tech/1028269762/
プリプロセッサについて熱く語るスレ。
http://pc5.2ch.net/test/read.cgi/tech/1058203590/
C統合・質問スレッド
http://pc5.2ch.net/test/read.cgi/tech/1068359871/
フリーコンパイラー使えよ。
http://pc5.2ch.net/test/read.cgi/tech/1061384369/
C、C++の最適化について語るスレ
http://pc5.2ch.net/test/read.cgi/tech/1084676298/
0005 NGNG
重視スレだと思うんだが?
【初心者歓迎】を入れ忘れた程度で立て直しか?
0006デフォルトの名無しさんNGNG
こっちが本スレでいいんかな
だれか向うの方削除依頼出した?
0007デフォルトの名無しさんNGNG
いや向こうが本スレ
0008デフォルトの名無しさんNGNG
こっちが本刷れだよ。
0009デフォルトの名無しさんNGNG
>>5
> 【初心者歓迎】を入れ忘れた程度で
致命的
0010デフォルトの名無しさんNGNG
>>9
俺にはそう思えないが、そう言うならそうなんだろうな
0011デフォルトの名無しさんNGNG
>9 は潔癖性
0012デフォルトの名無しさんNGNG
http://pc5.2ch.net/test/read.cgi/tech/1104814358/ が本スレ
0013デフォルトの名無しさんNGNG
>>9
確かに。こちらが本スレかな。
0014デフォルトの名無しさんNGNG
EXEからDLLを呼び出していて、
あるタイミングでDLLからEXEへPostMessageしています。
その引数内で、構造体(DLLでnewしている)のポインタを渡していて、
EXEでdeleteしたいのだが、delete時に異常終了してしまいます。
そもそも上記のようなことってできるのでしょうか?

開発環境 VC++6 SP6 WinXPです。
0015デフォルトの名無しさんNGNG
できない。
どうしてもそういうことやりたいならAPIでメモリ確保してplacement newすればいけるかもしれんが。
0016デフォルトの名無しさんNGNG
>14
そのDLLは別スレッドで動くので、アドレス空間が違う。だからPostM~の代わりにPostThreadM~使う必要。でもポインタは使えない。構造体ならWM_COPYDATAかCreateFileMa~の共有メモリ使え。
0017デフォルトの名無しさんNGNG
for(j = 0; j < 4; j++) {
 tmp = tip[j].x;
 tip[j].x = -tip[j].y;
 tip[j].y = tmp;
}

C++でこんなコードを見つけたのですが3行目の -tip[j].y の意味がわかりません。
数学と同じマイナスの解釈でいいのでしょうか。
0018デフォルトの名無しさんNGNG
はお
0019デフォルトの名無しさんNGNG
単項マイナス演算子
0020デフォルトの名無しさんNGNG
>17
左様。後は自力で考えな
0021デフォルトの名無しさんNGNG
ありがとうございます。
>>19をキーワードにしてぐぐったらわかりました。
0022デフォルトの名無しさんNGNG
>21
ヘルプも使え、ボケ
002314NGNG
>15,16
どもでした。

えーと、仕様の練り直しです。。
0024デフォルトの名無しさんNGNG
>>23
その構造体がPODならHeapAllocとHeapFreeで
メモリ確保・解放するようにすれば平気だよ。
それがいいかどうかはともかく。
0025デフォルトの名無しさんNGNG
>>16
大嘘書くなよ。
EXEとDLLはDLLが内部的に別スレッドを生成したりしない限り基本的に同一スレッドで動くし、
そもそも別プロセスならともかくマルチスレッドなら全てアドレス空間は同じ。
0026デフォルトの名無しさんNGNG
配列の内用を、関数呼び出しの括弧の中に直接書いて渡したいんですけど、
わかるかたいたら教えてください。

void Test( int * );
↑に対して
Test( (int*)&{1,2,3,4} );
↑のようなかたちで呼び出したいということです。
ちなみにこれではエラーになります。

外に出せば全て解決するのは十分承知の上ですが、
以前適当に書いたらできたような記憶があって、
いろいろやってみたんだけど、どうしても思い出せなくて気持ち悪いです。

環境はVC++で通ればいいんですが、
Cの一般的な文法として認められてるやり方があればいいなと。

0027デフォルトの名無しさんNGNG
>>26
>Cの一般的な文法として認められてるやり方があればいいなと。
VCのことは知らんが、Cにそんな構文は無い。
002827NGNG
ゴメンすっかり忘れてた。
(int[]){1, 2, 3, 4}
C99なら↑でいける。
002926NGNG
ありがとうございます。
以前GCCで書いたときもそんな感じだった気がしますが、VC++6.0ではできないようです。
残念。
0030デフォルトの名無しさんNGNG
VC++6を使っています。
三辺の長さがわかっている直角三角形の
直角以外の角を出す関数って無いんですか?

sin(87/654) = 0.123456の時、0.123456からsinに使う2辺の角度を知りたいのです。
0031デフォルトの名無しさんNGNG
asinでいいんだっけか、その場合。
0032デフォルトの名無しさんNGNG
>>31
Thx.
0033デフォルトの名無しさんNGNG
Cのconio.hで提供するような機能のC++版ってなんでしょうか。
0034デフォルトの名無しさんNGNG
conio.hでいいだろ
0035デフォルトの名無しさんNGNG
まったくだ。
conio.h の最初の
  #ifdef __cplusplus
  extern "C" {
  #endif
と、最後の
  #ifdef __cplusplus
  }
  #endif
を入れた人の身にもなってやれ。>>33
003633NGNG
>>34-35
そうですね・・・おとなしくconio.hで逝きます。thx
0037デフォルトの名無しさんNGNG
このスレでいいのかわかりませんが、VC専用の質問スレが見つからなかったので質問させていただきます。

VC++6.0を使用しています。
コーディングしているとたまに、全く反応が無くフリーズしたような状態になります。
フリーズ時間は数十秒〜1分くらいで、発生頻度は一定していません。
全く出ないときもありますし、30秒に1回くらいのペースで発生するときもあります。
自動保存にしては頻度が高すぎます。
フリーズするのはVCだけで、他のソフトは普通に操作できます。
CPU負荷にも変化は無いので、CPU100%で重くなっているというわけではないようです。

OSはWinXP SP2ですがSP1の頃からずっと発生していました。
0038デフォルトの名無しさんNGNG
★初心者にVisual C++を教えるスレ★ Part16
http://pc5.2ch.net/test/read.cgi/tech/1101022051/
0039デフォルトの名無しさんNGNG
int i;
char c;
c = (char *)i;

上記のコードですが、
* が付いていると、どう言う事になるんでしょうか。
0040デフォルトの名無しさんNGNG
>>39
そのコードは激しく感心しない
0041デフォルトの名無しさんNGNG
>39
実体をポインタ型にキャストするのはやらない方が良い。結果は実行環境による。知りたければnasmで難解なアセンブリ学べ
004239NGNG
レスどうもです。
先輩教えてもらったのですが、何が何だか分からなくて...
0043デフォルトの名無しさんNGNG
>42
アドレス0xa0番地のメモリにアクセスするために(char*)0xa0と書く。でも最近のOSはメモリ保護のために例外を投げてしまう。char*p=(char*)NULL; *p=0x7f;などは確実に失敗する。
0044デフォルトの名無しさんNGNG
>>43
藻前は >>42 のソースを 100 万回ほど朗読しろ
0045デフォルトの名無しさんNGNG
>>44
×>>42
○>>39

orz
0046デフォルトの名無しさんNGNG
>>1
乙!!
0047デフォルトの名無しさんNGNG
まったくもって、処理系依存だから、
何も答えられないが最適解ですね。
0048デフォルトの名無しさんNGNG
基礎クラスの中に
virtual void Show() = 0;
とあるんですが、=0;ってなんなんでしょうか?
仮想関数で返り値なしのshow()に=0;ってのがよくわからないんですが・・・

派生クラスには
virtual void Show() { myData->Show(); myNext->Show(); }
というのがあります。

関数に代入とか出来ないですよね?
0049デフォルトの名無しさんNGNG
>>48
純粋仮想関数でぐぐれ
0050デフォルトの名無しさんNGNG
>49
即レスthx
解決しました
0051デフォルトの名無しさんNGNG
はじめまして。

質問なんですが、純粋仮想関数みたいな感じで、
派生クラスに引数を取るコンストラクタの実装を強要することってできますか?

今組んでるプログラムが、幾つかのフォーマットのファイルを扱う予定なんですが
各フォーマット共通の部分を基底クラスのパラメータとして持って、
各フォーマット固有の部分を派生クラスで扱いたいんです。

派生クラスのインターフェイスを統一するために、派生クラス全部に
同じ引数を取るコンストラクタを実装したいと思ってます。
解決策があったらお願いします。
0052デフォルトの名無しさんNGNG
仮想関数の利点はわかるんですが
純粋仮想関数の利点ってなんでしょうか?
0053デフォルトの名無しさんNGNG
>>52
派生クラスにオーバーライドを強要できる(しないとエラーになる)
基底クラスのインスタンスを作れなくなる(インターフェースクラスに使える)
0054デフォルトの名無しさんNGNG
>51
>派生クラスに引数を取るコンストラクタの実装を強要することってできますか?
.基底クラスに引数ありのコンストラクタ以外用意しないではだめなのかな?
良心的な人なら、派生クラスのコンストラクタでもその引数を受け取るようにするでしょう。
0055デフォルトの名無しさんNGNG
コンパイラについていろいろ調べたのですが、なんだか良く分かりませんでした
MicrosoftのC/C++のコンパイラって
[Visual C++ 6.0] → [Visual C++ .net] → [Visual C++ .net 2003]
って変わったんですか?
.netって6.0の次ですよね?
0056デフォルトの名無しさんNGNG
.net = 7.0
.net 2003 = 7.1
0057デフォルトの名無しさんNGNG
>>56

あ、そうなのか、どうりで.net 2003は良く検索で出てきたけど
.netはあまり出なかったわけだ
謎が解決しました、ありがとう
0058デフォルトの名無しさんNGNG
VC++6使ってます。
メッセンジャーのような複数の相手とP2P接続させたいのですが
参考になるサイトとか書籍などありましたら教えてください。
0059デフォルトの名無しさんNGNG
>>58
Regnessemのソース。
Delphiだけど読むだけならそれほど困難ではない。
006058NGNG
>>59
Regnessemってソース公開してたんですね。知りませんでした(汗
早速DLしてきたので参考にさせてもらいます。
ありがとうございました。
0061デフォルトの名無しさんNGNG
#include <iostream> 
と
#include <iostream.h>
の違いを教えてください

あと 
#include <cstdlib> 
と
#include <stdlib.h>
の使い分けについても教えてください 
0062デフォルトの名無しさんNGNG
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2004-33,GGLD:ja&q=iostream+%22iostream%2Eh%22+stdlib+cstdlib
なんでこの程度のことも調べられないの?脳みそ腐ってんのか?
0063デフォルトの名無しさんNGNG
1.指定フォルダ内のファイル一覧を取得。
2.ファイル一覧にフォルダがあればそのフォルダ内のファイル一覧も取得。
3.2を繰り返して指定フォルダ以下のツリーを作成。

ということをやりたいんですけど、2以下をどうすればいいか思いつきません。
参考になるサイトとかあったら教えてください。
コンパイラはBCC5.5です。
0064デフォルトの名無しさんNGNG
>>63
スレ違いだべ
Windows -> http://www.google.co.jp/search?hl=ja&q=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB+%E6%A4%9C%E7%B4%A2+%E5%86%8D%E5%B8%B0+FindFirstFile&lr=lang_ja
C++ -> ↑を boost::filesystem で

(しかし boost::filesystemって日本語使えてなかったような…)
0065デフォルトの名無しさんNGNG
>>64
かなり参考になりますた。
0066デフォルトの名無しさんNGNG
>>63
boost::filesystemを使った例。
#include <algorithm>
#include <fstream>
#include <string>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
std::ofstream myout("一覧.txt", std::ios::out);
struct pred_p{bool operator()(const boost::filesystem::path& x){return !boost::filesystem::is_directory(x);}};
void scan_folder(const unsigned int level, const boost::filesystem::path& scan_path, const std::string& lines)
{
    std::vector<boost::filesystem::path> folders((boost::filesystem::directory_iterator(scan_path)), boost::filesystem::directory_iterator());
    folders.erase(std::remove_if(folders.begin(), folders.end(), pred_p()), folders.end());
    std::vector<boost::filesystem::path>::const_iterator first(folders.begin());
    std::vector<boost::filesystem::path>::const_iterator last(folders.end());
    if (first != last)
    {
        for ( ;first != last - 1; ++first)
        {
            myout << lines << "├" << first->leaf() << std::endl;
            scan_folder(level + 1, *first, lines + "│");
        }
        myout << lines << "└" << first->leaf() << std::endl;
        scan_folder(level + 1, *first, lines + " ");
    }
}
int main()
{
    scan_folder(0, boost::filesystem::current_path(), "");
    return 0;
}
0067デフォルトの名無しさんNGNG
C/C++というよりはWindowsの話ではあるのですが
Program Files下のファイルに対してfopen関数にてファイルを開こうと試みたのですが出来ませんでした。
理由と解決方法が知りたいのですが、よいサイト等ご教授願えないでしょうか?

環境は Windows2000 VC++6.0 です
0068デフォルトの名無しさんNGNG
>>67 errno
0069初心者NGNG
現在Windows2000 VC++6.0を使ってOpenGLを用いた3次元画像の表示プログラムを作っています。
ですが、OpenGLの画像を2つのwindowで表示したいのですがうまく表示できません。
そこで、可能かどうかと、可能ならばよい解決方法を教えていただきたいです。
どうかよろしくお願いします。
0070デフォルトの名無しさんNGNG
完全にスレ違いなんですが
0071デフォルトの名無しさんNGNG
>>68
レスありがとうございます
No such file or directoryと返されました
ファイル名等は間違えていないのですが…

errnoに関してはひとつ利口になりました、どうもありがとう
0072デフォルトの名無しさんNGNG
>>71
まさか fopen("C:\Program Files\...") とか?
0073デフォルトの名無しさんNGNG
一度開くファイル名を標準入力から入力してからですが事実上は
fopen(C:\Program Files\.....")となってます
0074デフォルトの名無しさんNGNG
>>73
「事実上は」ってのがよくわからないけど、
fopen("C:\\Program Files\\...") にしたら開けたりするのかな?
0075デフォルトの名無しさんNGNG
scanfにて一度 char FileName[512] に入れていますので
エスケープシーケンスによるエラーとかではないとは思っています
コンパイル自体は通っています
0076デフォルトの名無しさんNGNG
これはもう、ソース晒すしかないね。
007767NGNG
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main()
{
FILE *file;
int c;
char string[512];
char FileName[256];
char *err;
int swich = 1;

printf("ファイル名を入力してください\n>>");
scanf("%s", &FileName);
errno = 0;

if((file = fopen(FileName, "r")) == NULL)
{
err = strerror(errno);
perror(err);
printf("File Open miss.\n");
return -1;
}
007867NGNG
else
{
while(swich == 1)
{
file = fopen(FileName, "r");
printf("Open succses.\n");
while((fscanf(file, "%s", &string)) != EOF)
{
printf("%s\n", string);
}

printf("reLoad?\n>>");
scanf("%d", &c);
if(c == 1)
{
swich = 1;
}
else
{
swich = 0;
}
fclose(file);
}
}
return 0;
}
ソース出してみます
任意のフォルダ内のファイルは読めたのですが
Program Files下のファイルが読めなくて困っているところです(目的のファイルはProgram Files下のファイルです)
0079デフォルトの名無しさんNGNG
>>67
- scanf("%s", &FileName);
+ scanf("%[^\n]", FileName);
0080デフォルトの名無しさんNGNG
>>77
scanfでスペース含んだ名前は入力できないような気がする。
perror(FileName); にしてみな。
008167NGNG
>>79
おおお、ありがとうございます
0082デフォルトの名無しさんNGNG
危なくてもいいならgets()でも使え。
008379NGNG
>>81
scanf 使わなければ
scanf("%s", &FileName); を
fgets(FileName, sizeof(FileName, stdin);
FileName[strlen(FileName) - 1] = '\0';
008467NGNG
他ソフトでアクセス中のファイルにこのプログラムでアクセスする方法を模索しておりまして
まずは通常アクセス出来るかProgram Filesを試したところアクセスすら出来なくて困っていたというところでした
また頑張ってみます
>>79-81
レスありがとうございました
008567NGNG
>>83
入力ストリームを標準入力にするんですね、なるほど
0086デフォルトの名無しさんNGNG
>>67
私はDドライブに市販ソフトを
インストールするようにしてるよ
CドライブはOSのインスコのみ

こんな椰子もいるから
0087デフォルトの名無しさんNGNG
>>86
市販ソフトはレジストリを使うから、
ファイルさえあればいいってものじゃないんで
結局C:\Program Filesに入れている。
0088Rubyist!NGNG
てゆーかなんで対話的にして標準入力を潰すのかね?
しかもscanfかい
0089デフォルトの名無しさんNGNG
>>84
>他ソフトでアクセス中のファイルにこのプログラムでアクセスする方法を模索しておりまして

アクセス中のファイルにアクセスするな。
0090デフォルトの名無しさんNGNG
寿命を迎えた変数はメモリから解放されますか?
0091デフォルトの名無しさんNGNG
>>90
自動変数・メンバ変数なら、変数自体のメモリはスコープアウトで解放される。
ポインタがぶら下がってる場合はデストラクタでどうにかしないとダメ。
0092デフォルトの名無しさんNGNG
>>91
ありがとうございます
0093デフォルトの名無しさんNGNG
初心者なんですが、教えてください。

int Len(const string& str)
{
return str.length();
}

このような関数がある場合、

Len(string());

という呼び出しをしても大丈夫でしょうか?
string()で作成されたインスタンスが、呼び出した関数内で有効なのか教えてください。
0094デフォルトの名無しさんNGNG
>>93
有効です
0095デフォルトの名無しさんNGNG
>>94
ありがとうございました!
0096デフォルトの名無しさんNGNG
現在C++を勉強中の者です。
ネットや書籍で調べたのですが、見つけられなかったので質問させてください。

デフォルトコンストラクタと、その他引数つきのコンストラクタをいくつか
宣言した場合、いくつかのコンストラクタで共通する初期化リストも
それぞれに書かなくてはならないのでしょうか?

初期化リストがかなり長大なため、出来るだけ共通する部分は簡略化
したいと思っているのですが、どなたか教えてください。
0097デフォルトの名無しさんNGNG
初期化を関数に分けてしまうのが一番楽じゃないでしょか
0098デフォルトの名無しさんNGNG
>>96
メンバの構成をいじらない限りは、書かなくてはならない。

構成に手を入れてもいいなら、
共通の初期化を行うメンバをひとつのクラスにまとめてコンストラクタを書いたり、
private なコンストラクタ+インスタンス生成用static関数を作ったりできる。

>>97
メンバに「初期化」が重要な意味を持つクラスがあると、そう簡単にはいかない。
0099デフォルトの名無しさんNGNG
>>98

>共通の初期化を行うメンバをひとつのクラスにまとめてコンストラクタを書いたり、
あ〜、なるほど〜。今回はこの方法でいけそうです!!ありがとうございました。
0100デフォルトの名無しさんNGNG
スレ違いだったらスミマセン。

Windowsのプログラムを書くときってfstreamは使わないほうが良いのでしょうか?
それともCreateFileのほうが使い勝手が良いだけなんでしょうか?

「使用を避けるべき」なのか「使用可だがCreateFileのほうがベター」なのか
どなたか教えて下さい。出来れば理由もおねがいします。
0101デフォルトの名無しさんNGNG
Win32環境では、ファイルを開くためのAPI(CreateFile)に共有モードを
指定するパラメータがある。
意図的に「共有」を指定しない限り、(不用意にファイルを上書きしないように)
ファイルを開くときには「排他モード」になる
■ このスレッドは過去ログ倉庫に格納されています