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

スレを勃てるまでもないC/C++の質問はここで 4

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/09/17(水) 15:41:48
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
0002デフォルトの名無しさん2008/09/19(金) 00:40:38
1608年5月11日に3なのに『2get』と書いてしまい、
『500年ROMってろ!!』
と言われた者です。
あれから500年、ひたすらROMに徹してきました。
来る日も、来る日も。
そして今、
やっと念願叶って書き込みをしようとした矢先に、
2をget出来るだなんて………
感動で……胸が一杯です。
人間、辛抱すれば良いことって有るんですね!
こんな僕ですが、
僭越ながらとらせて貰います…!
2get!
0003デフォルトの名無しさん2008/09/19(金) 05:51:24
500年経ってねーよ
0004デフォルトの名無しさん2008/09/19(金) 10:55:20
1999年に「2GET」といって3をとってしまった時に、『10年ROMれ』といわれて私はずっとROMってきました!今ここに宣言します。【4GET!】
0005デフォルトの名無しさん2008/09/19(金) 11:07:40
10年経ってねーよ
0006デフォルトの名無しさん2008/09/19(金) 21:55:33
圧縮、解凍プログラムを作ってみたいんですけど、
fopenでバイナリ読み込んで
それを並び替えればいいだけですか?
0007デフォルトの名無しさん2008/09/20(土) 00:05:30
全然違います
0008デフォルトの名無しさん2008/09/20(土) 21:04:31
>>6
並び替えただけじゃ圧縮になってないし、元にも戻せませんがな。
しかもC/C++の問題じゃないし。
0009デフォルトの名無しさん2008/09/20(土) 21:04:38
ありがとうございました。
0010デフォルトの名無しさん2008/09/21(日) 19:46:01
rubyとかにあるnil見たいな未定義値を実装するにはどうすればいいの?
0011デフォルトの名無しさん2008/09/21(日) 20:58:55
ポインタの類(shared_ptrなど含む)なら0(ヌルポインタ)
参照型ならポインタを使うように書き換えて↑
それ以外はboost::optional
0012デフォルトの名無しさん2008/09/25(木) 10:49:31
firefoxのプラグインの作り方教えてお
0013デフォルトの名無しさん2008/09/25(木) 12:11:47
C言語の変数型のdoubleは有効数字15だか16桁とのことですが、
0.0000000000000000000000000000123
とかの極小数も1.23×10の-何乗みたいに、ちゃんと入るんでしょうか。
それとも小数点下の十何桁までしか覚えられない?
0014デフォルトの名無しさん2008/09/25(木) 12:31:13
ちゃんと入る
0015デフォルトの名無しさん2008/09/25(木) 13:05:23
ありがとうございます。
0016デフォルトの名無しさん2008/09/25(木) 21:07:01
キャストについての質問です

printf("%d",(int)(2.014*1000));
結果>>2013

上記のように
2.014 * 1000 をint型でキャストすると
2013になってしまいます。
2.013 * 1000 はちゃんと2013なのにー

何か綺麗な解決方法あるでしょうか。おねがいします
環境はGCCです。
0017デフォルトの名無しさん2008/09/26(金) 00:31:39
ない
0018デフォルトの名無しさん2008/09/29(月) 12:02:19
>>16
整数になるはずなら、四捨五入でもすれば。
正の領域なら、int(2.014 * 1000 + .5)でOK。
0019デフォルトの名無しさん2008/09/30(火) 15:59:16
勃起するまでもないC/C++かとおもた
0020デフォルトの名無しさん2008/09/30(火) 23:58:08
ソースファイルの管理なんですが

func1、func2、func3という基底クラスがあって
それらを継承して
SubA_func1、2、3・・・
SubB_func1、2、3・・・
SubC_func1、2、3・・・
というクラス群があるとき

base、SubA、SubB、SubCとファイル分けするか
func1、func2、func3と分けるのか
どちらがよいでしょうか?
0021デフォルトの名無しさん2008/10/01(水) 10:28:07
なんかそれ設計ミスってないか?
0022デフォルトの名無しさん2008/10/01(水) 20:36:02
すみません
ビルドできないんですがどうすればいいのでしょうか?
応答なしになってしまいます・・・
0023デフォルトの名無しさん2008/10/01(水) 21:00:18
パソコンを買い換えるのが、一番確実な解決法じゃないかな
0024デフォルトの名無しさん2008/10/01(水) 21:18:32
char*をwchar_t*にしたいんだが、mbstowcs()つかても変換後の日本語部分がデバッガで見ても正しくないんだが、これはどういうことなんだろうか。
それか別の変換方法ってある?
元々はVC9でfstreamのパスに日本語があると開けないやつの対策用に変換がしたいわけで・・・
0025デフォルトの名無しさん2008/10/01(水) 22:28:05
>>24
setlocaleしないとまともに動かないぞ。
0026242008/10/01(水) 22:39:41
なるほどそれってmbstowcs()の第4引数を使っても結果はsetlocaleと同等?
0027デフォルトの名無しさん2008/10/03(金) 12:32:57
例えば、クラスAに要素a、bがあるとして派生クラスBの配列要素c[i][j]の各要素ににそれぞれ違うクラスAの要素a、bを入れるようなことはできますか?
例の補足としては、c[0][0]にはa=1、b=2 c[0][1]にはa=5、b=3が入っているとしたら c[0][3]=c[0][0]+c[0][1]の計算した場合 c[0][3]はa=6、b=5になるようなことです
0028デフォルトの名無しさん2008/10/03(金) 12:36:22
頭痛くなってきた・・・
0029デフォルトの名無しさん2008/10/03(金) 23:34:08
行列計算をしたいってことか?
根本的にやり方を変えないと出来ないんじゃないか?
0030デフォルトの名無しさん2008/10/03(金) 23:40:21
つか行列ならclass Bを配列にするんじゃなくてclass Bの中にclass Aの配列を取り込むべきなんじゃないかね
外部からの入力をメンバ関数で受け取って同じ関数内で再計算までやってしまえばいいんじゃないかね

もう解決してそうな気もするけどな・・・
0031デフォルトの名無しさん2008/10/04(土) 01:12:09
[質問]インスタンスを配列とした場合、コンストラクタへ引数を与える方法がわからない。

class Huga
{
public:
Huga( int i = 0 ){ printf("%d\n", i); }
~Huga(){}
};

int _tmain(int argc, _TCHAR* argv[])
{

//Huga *huga = new Huga(5); みたいな感じにしたい
Huga *huga = new Huga[10]; // ここでコンストラクタへ引数を渡したい。
delete[] huga;
return 0;
}

なにかよい知恵があればお授けください。
0032デフォルトの名無しさん2008/10/04(土) 01:16:18
>>31
仕様上無理です。
後からsetter()でもループして回しましょう。
0033312008/10/04(土) 01:20:42
>>32
さっそくのレスありがとうございます。
了解しました。
おとなしく、他の方法を考えます。
0034デフォルトの名無しさん2008/10/04(土) 20:27:50
答えは5のようですが、なぜそうなるのかわかりません。
どなたか流れを教えてください。よろしくお願いします。

#include
int sub(int *x, int *y) {
(*x)++;
(*y)++;
return *x + *y;
}
main() {
int a = 0, b = 0;
b = sub(&a, &a);
printf(“%d %d\n”, a, b);
}

(1) 0 2
(2) 0 3
(3) 1 3
(4) 2 3
(5) 2 4
0035デフォルトの名無しさん2008/10/04(土) 21:02:23
>>34
これでOK?
int sub(int 0, int 0) {
0++; => 1
1++; => 2
return 2+2; => 4
}
0036デフォルトの名無しさん2008/10/04(土) 21:46:29
>>35
ご回答ありがとうございます。

1++; => 2       ←なぜここで1++になるのですか?*y=0ではないのですか?
return 2+2; => 4    ←これも、なぜ*x=2になるのですか?1ではないのですか?

よくわかりません。お手数ですが、お教え願います。
0037デフォルトの名無しさん2008/10/04(土) 21:53:07
>>35
長くてごめん。
>b = sub(&a, &a);
となってるからとしか言えないんだけど。
重要なのは0という数値じゃなくて0が入ったaのアドレスが渡されてるってこと。
xもyも指してる実体は同じaだから、xへの操作はyへの操作と同じだし同様にyへの操作もxへの操作となる。
だから実際は以下と同じようになってるってわけ。

int sub(int *x) {
(*x)++;
(*x)++;
return *x + *x;
}
0038デフォルトの名無しさん2008/10/04(土) 22:24:01
>>37
理解できました。ありがとうございました。
0039デフォルトの名無しさん2008/10/05(日) 03:03:40
Cのプリプロセッサで
#if sizeof(time_t) == 8
 /* time_t が 64 bit のときの処理 */
#else
 /* time_t が 32 bit のときの処理 */
#endif
みたいな書き方ってできなかったっけ?
0040デフォルトの名無しさん2008/10/05(日) 09:41:19
実務で、構造体、共用体はどう使われているのですか
0041デフォルトの名無しさん2008/10/05(日) 21:06:33
>>40

自分の場合、、、。
構造体を使わなかった場合は、
関数への引数が多くなってしまったり、
関数の戻り値を1つの型ですませることができなくなったりして
不便です。
なので、関数の引数や戻り値で大活躍です。
その他、いろいろ使っています。

共用体は自分の場合はあまり使わないです。
BYTE(unsigned char)型みたいに1byte単位での
入出力が必要な場合に、ある程度決まった型に変換が必要な
場合とかには使う場合があります。

と実務経験があまりない自分が言ってみるテスト。
0042デフォルトの名無しさん2008/10/05(日) 21:36:12
>>39
うんできない
0043デフォルトの名無しさん2008/10/06(月) 09:36:06
>>42
じゃあ>>39みたいなことしたい場合は、autoconfとかを使って、
コンパイル前にあらかじめsizeof(time_t) を調べておく必要があるってことですね。
うーん、今作ってるのは小さいプログラムだからあんまり大げさなことはしたくないなあ。
なんかいい方法があれば教えてください。
0044デフォルトの名無しさん2008/10/06(月) 10:27:02
>>43
プリプロセッサとsizeofとどっちの処理が先か考えりゃわかるべ。
0045デフォルトの名無しさん2008/10/06(月) 10:54:53
>>43
time_tが64bitの環境はまだ少ないんだし、その環境向けのifdef (OSと
かCPUとか)で分ければいいでない?
0046デフォルトの名無しさん2008/10/06(月) 11:06:21
if (sizeof(time_t) == 8) {
} else {
}
じゃだめなのか?

#include <limits.h>
#if SIZE_MAX == 4294967295
#else
#endif
とか
0047デフォルトの名無しさん2008/10/06(月) 11:11:47
そこでtmpですね
0048デフォルトの名無しさん2008/10/12(日) 14:55:45
あるローカル関数A内で
グローバルのポインタ変数にmallocし、領域を確保。
その後、他のローカル関数B内で、関数A内で確保した領域を使うことって
出来ましたっけ?
004948 補足説明2008/10/12(日) 15:14:03
上でやりたいのは、こういう事なんですが

#include <stdio.h>
#include <stdlib.h>

char *g_pcX;

int sub001(char *pcX)
{
pcX = (char*)malloc(256);
for(int i=0; i<256; i++)
{
pcX[i] = i;
}
return 0;
}


void main()
{
sub001(g_pcX);

for(int i=0; i<256; i++)
{
printf("%d ", g_pcX[i]);
}
}
0050デフォルトの名無しさん2008/10/12(日) 17:41:40
>>49
・そのサンプルではコンパイルできません。
・グローバル変数であるメリットが全くありません。
・そもそも関数内で確保した場所を誰にも伝えていないのに誰かが使えるわけがありません。
・ポインタと関数の引き数について勉強しなおすべきです。

>>48
できます。しかし、そうすべきではありません。
0051C言語始めました2008/10/12(日) 18:51:19
zero( // ???? //)
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
a[i][j]=0.;
}
}
}

main(){
int n=4;
vector< vector<double> > a( n , n );
zero(// ????? //);
}


????
↑の部分はどのように宣言したらいいのでしょうか?
0052デフォルトの名無しさん2008/10/12(日) 19:09:05
>>51
向こうで教わったでしょ。
0053C言語始めました2008/10/12(日) 19:12:59
void zero(int n, vector< vector<double> > & a)
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
a[i][j]=0.;
}
}
}

void main(){
int n=4;
vector< vector<double> > a( n , n );
zero(n, vector< vector<double> > & a);
}

さっぱりピーマンです…
0054デフォルトの名無しさん2008/10/12(日) 19:27:30
いかん、間抜けだったのか。

>>53
次のどれかを選択しろ。
・STLの勉強をする。
・C初心者スレ辺りでやりたいことから提示して初歩から教わる。
・PCを窓から投げ捨てる。
0055C言語始めました2008/10/12(日) 19:35:24
すいません。

火曜日になれば教えてもらえるけど早く使い方知りたかったんで。

基礎とかは二の次で使えたらいいのでどうか教えてください。
0056デフォルトの名無しさん2008/10/12(日) 20:58:43
これで判らなければ、火曜まで待て。
--
#include <vector>
void zero(std::vector<std::vector<double> > & a){for (unsigned i = 0; i < a.size(); ++i) for (unsigned j = 0; j < a.at(i).size(); ++j) a.at(i).at(j) = 0;}
int main(){const unsigned n = 4;std::vector<std::vector<double> > a(n, n);zero(a);return 0;}
0057C言語始めました2008/10/12(日) 21:30:04
<<56
ありがとうございます。
がんばって噛み砕きます。
0058デフォルトの名無しさん2008/10/12(日) 23:07:57
>>50
一応コンパイルは通りそうだが?
0059デフォルトの名無しさん2008/10/12(日) 23:30:21
>>58
あー確かにコンパイルは通るね。ダメダメなことに変わりはないけど。
0060デフォルトの名無しさん2008/10/13(月) 00:02:27
>>50みたいなやつはほっといていい
0061デフォルトの名無しさん2008/10/13(月) 22:44:34
VC++2005 EE使用
fatal error C1083: include ファイルを開けません。'iostream.h': No such file or directory
というエラーが出ます。
VC++2005EEをインストールしただけじゃだめなのでしょうか?

ソースは↓です。
#include <iostream.h>

int main()
{
cout << "テスト" ;
return 0;
}
0062デフォルトの名無しさん2008/10/13(月) 22:53:03
>>61
君は浦島太郎だ。今のC++に<iostream.h>は無くなった。

#include <iostream>

int main()
{
std::cout << "テスト" ;
return 0;
}
0063デフォルトの名無しさん2008/10/13(月) 23:20:34
>>62
正常に実行できました。
ありがとうございます。
参考にしていたサイトが古かったので、浦島太郎でした。
0064デフォルトの名無しさん2008/10/14(火) 07:52:07
[質問]ファイルを開けない
[環境]VC++2005

TCHARで開くファイル名を指定して TEXT("\\Data\\foo.jpg") と
しているが、CreateFileでファイルを開くことができない。

以下、プロジェクトをhogeとしている場合のフォルダ構成。
hoge.sln
hoge.ncb
hoge.suo
+[debug]
+[hoge]----+[Data]---foo.jpg
+[Source]---main.cpp
その他ソースコード

※プロジェクトのプロパティ>C/C++>追加のインクルードディレクトリ
で、SourceフォルダとDataフォルダを追加している。
Dataフォルダの追加を行っているが、これはコンパイルするときに
読み込むもののみに有効?
※foo.jpgを[hoge]フォルダ直下においた場合は読み込める。
0065642008/10/14(火) 07:58:48
>>64です。
すんません、フォルダ構成記述ミスりました。

<最上位階層>
hoge.sln
hoge.ncb
hoge.suo
+[debug]
+[hoge]

<hoge階層>
+[Source]
+[Data]
hoge.rc
hoge.vcproj
hoge.ico

<Data階層>
foo.jpg //こいつを読み込みたい

<Source階層>
main.cppなどなどその他ソースコード

0066デフォルトの名無しさん2008/10/14(火) 09:25:21
ネットワークプログラムって一体どんなことに使うんですか?
本を読んでもUNIXの鯖がどーたら
で全然意味がわかりません。

鯖を共有メモリにするってことですか?
0067デフォルトの名無しさん2008/10/14(火) 09:53:36
>>66
釣りだろ!?
釣りだと言ってくれッ…!
0068デフォルトの名無しさん2008/10/14(火) 10:41:33
>>66
ネットワークプログラムなしにネットワークを使えると思っているのですか?
あなたか書き込んでいるここはいったい何だと思って・・・
0069デフォルトの名無しさん2008/10/14(火) 15:29:42
ここというか、書き込んでるプログラムは一体何か、というところだな。
0070デフォルトの名無しさん2008/10/14(火) 22:58:00
成績をつけるプログラムを教えてほしいです。

80点以上100点以内 A
65点以上80点未満  B
50点以上65点未満  C
0点以上50点未満   D

それ以外の整数に対しては「ありえない」と出す

0071デフォルトの名無しさん2008/10/14(火) 23:13:51
>>70
C/C++の宿題を片付けます 116代目
http://pc11.2ch.net/test/read.cgi/tech/1222813731/l50
0072デフォルトの名無しさん2008/10/21(火) 09:35:45
関数かconstで宣言されていると
内容も変更しないという意味だったっけ?

たとえば
void Map_Class::second(std::map<std::string, int>& m) const {
のようなメンバ関数があったとすると
このメンバ関数の中では値を変更しちゃいけないんだっけ?
0073デフォルトの名無しさん2008/10/21(火) 11:33:31
>>72
いいえ、メンバ関数内でメンバ変数を変更できないだけです。
その例ではmを変更できてしまえます。
0074デフォルトの名無しさん2008/10/21(火) 14:23:21
>>73
では、何のための const なのでしょう?
0075デフォルトの名無しさん2008/10/21(火) 14:33:49
>>74
Map_Class自体がconstの場合のため。

std::map<std::string, int> m;
const Map_Class map_class;
map_class.second(m);

secondがconstでなければ呼べない。
map_classはconstのため変更不可だが、mはconstではないので変更可。
0076デフォルトの名無しさん2008/10/21(火) 14:33:55
>>74
だから、メンバー変数を変更しないという意味でconstでしょ。
0077デフォルトの名無しさん2008/10/22(水) 21:04:59
プログラムのデータ構造、つまり構造体をバリバリ使いまくるか
オブジェクト指向で汎用性を高くもたせるか迷ってます

構造体バリバリで書くと後のソースいじるときに大量のソースになり
保守するのが難しくなりやすいのと

オブジェクト指向で書くと汎用性を維持するためのコードで複雑になりやすく
これまた保守が難しくなりやすいかと考えています

どちらの手法で組んでいくか、また、別の手法があるかアドバイスいただけませんか?
0078デフォルトの名無しさん2008/10/22(水) 21:09:15
それは、どっちでも極端過ぎるとだめだよ、ほどほどにバランスをとりなさいという教訓。
0079デフォルトの名無しさん2008/10/23(木) 07:52:12
>>73
mapを変更したくないなら、
void Map_Class::second(const std::map<std::string, int>& m) const {
のようにmをconst参照にすればよい
すると、second内ではmのconstメンバー関数しか呼び出せなくなる。
0080デフォルトの名無しさん2008/10/23(木) 07:52:50
アンカー間違えた
>>73 → >>74
0081デフォルトの名無しさん2008/10/23(木) 13:51:51
簡単なゲームを作っているのですが、今まで使っていたアイコンは32×32だったので、それを16×16のサイズにしようと思い、そのサイズの画像を取り込んだら、32×32のサイズに拡大されて表示されてしまうのですがどうしたらよいのでしょう?
アイコンファイルってサイズ指定するとこないですよね?
Visual C++です。
0082デフォルトの名無しさん2008/10/23(木) 13:53:21
今はどうやってるの?
LoadImageならサイズも指定できるよ。
0083デフォルトの名無しさん2008/10/23(木) 16:34:30
最近、C++を使うことになったのですが、
下記のクラスの定義で、<RTC::TimedLong>の部分の意味が分かりません。
(山カッコの使い方が分からないです…)
よろしくお願いします。

class Multiply
  : public RTC::OnWriteConvert<RTC::TimedLong>
{
   :
   :
};
0084デフォルトの名無しさん2008/10/23(木) 16:47:00
クラステンプレート
0085デフォルトの名無しさん2008/10/23(木) 16:55:20
>>84
理解できました。
有難うございます。
0086デフォルトの名無しさん2008/10/23(木) 17:07:02
は、はやいな
0087デフォルトの名無しさん2008/10/23(木) 18:51:43
>>82
HICON ico;
ico = AfxGetApp()->LoadIcon(IDI_ICON1);

って感じで読み込んでます。
■ このスレッドは過去ログ倉庫に格納されています