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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1119793525/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2005/07/18(月) 09:05:44
2 get
3デフォルトの名無しさん:2005/07/18(月) 10:13:03
>>1
4デフォルトの名無しさん:2005/07/18(月) 10:49:36
ほ、ほーっ、ホアアーッ!! ホアーッ!!
5デフォルトの名無しさん:2005/07/18(月) 12:26:56
STLつかうと一気に実行ファイルサイズが10倍に?!
6デフォルトの名無しさん:2005/07/18(月) 12:28:32
>>5
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
7デフォルトの名無しさん:2005/07/18(月) 12:30:06
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後氏ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
8デフォルトの名無しさん:2005/07/18(月) 13:05:16
>>6,7
おもわず・・・・・プッ。
ここまで毎回でるとあっぱれだな。
9デフォルトの名無しさん:2005/07/18(月) 13:23:38
息が合ってません
10デフォルトの名無しさん:2005/07/18(月) 13:31:45
11デフォルトの名無しさん:2005/07/19(火) 00:31:07
-----------------------------------
ここまでテンプレ
12デフォルトの名無しさん:2005/07/19(火) 02:54:08
VisualC++プロジェクトの.NETでWindowsフォームアプリケーションを製作しているときの
アプリケーションの左上のアイコンと実行exeのアイコンの設定の仕方を教えてください
VS付随のアイコンエディタではしょぼすぎで絵がかけないらしいのでオネガイシマス
13デフォルトの名無しさん:2005/07/19(火) 03:05:32
>>12
まぁそういわずに使ってみろ。
14デフォルトの名無しさん:2005/07/19(火) 03:10:12
つーか、ICONファイルを扱える好きなエディタで描くとか、
好きなエディタで描いたbmpかなにかをIrfanViewかなにかでICONファイルに変換するとか。
15デフォルトの名無しさん:2005/07/19(火) 03:57:22
そうですね〜アイコンは用意できたんですが
this->Icon = (__try_cast<System::Drawing::Icon * >(resources->GetObject(S"$this.Icon")));
の部分でerror C2039: 'GetObjectA' : 'System::Resources::ResourceManager' のメンバではありません。
ってエラーを返すようになってしまいました 確かこの部分はVC++が勝手に記述するところだったはずですが・・・
原因はあまり良くわかりませんがForm1.hとrcとアイコンファイルを適当に触ったのに問題があったんでしょうか
良い解決法があったらご教授願います
16デフォルトの名無しさん:2005/07/19(火) 05:57:32
>>12
プロジェクト作ったときに出来るアイコンのIDを
おまいがプロジェクトに追加したアイコンに割り当てる
17デフォルトの名無しさん:2005/07/19(火) 09:38:23
一部のViewにFlashを使用したアプリケーションを作成しようと思っています。
配布時にはFlash.ocxに依存しない、スタンドアローンのアプリケーションにしたいと
考えているのですが、exeにFlash.ocxを埋め込む方法が分かりません。

ZINC v2や、SWF Studioといった数種類のswf to exeアプリケーションがあるので、
exeにFlash.ocxを埋め込む何らかの方法はあるようです。
(ZINCの説明では、advanced OCX handling Techniquesを使用したとあります。)

exeにFlash.ocxを埋め込むにはどのような方法が考えられますでしょうか?
アドバイスよろしくお願いいたします。

開発環境は、VC++.netです。
18デフォルトの名無しさん:2005/07/19(火) 19:39:56
-O2とか使うと実行が遅くなりうることを
できるだけ細かく書いたサイトないですか?
19デフォルトの名無しさん:2005/07/19(火) 19:40:30
>>15
アイコン作りに御勧め。
ttp://www.towofu.net/soft/aicon.php
20デフォルトの名無しさん:2005/07/19(火) 21:26:59
>>18
何よ-O2って。メニコンO2か?
情報が不足杉。もう少し詳細に書け。
21デフォルトの名無しさん:2005/07/19(火) 21:28:54
clのコンパイラオプションだろ
>>18の質問もナンセンスだが
22デフォルトの名無しさん:2005/07/19(火) 21:30:16
頭の悪い質問が
頭の悪い別人を焙り出す例だな
23デフォルトの名無しさん:2005/07/19(火) 22:39:16
>>22
自虐乙
24デフォルトの名無しさん:2005/07/19(火) 22:54:21
なにその逆に相手の主張を裏付ける反撃
25デフォルトの名無しさん:2005/07/20(水) 03:13:38
「構文エラー : ';' が '<クラスヘッド>' の前にありません。」
と出る場合、どのような間違いをしていることが考えられますでしょうか?
どこかのcppファイルで';'が抜けてるだけだと思って
現在探しているのですが中々見つからず・・・

#ifndef __HOGE_H_
#define __HOGE_H_

; ←これでエラーがなくなる

class HOGE
26デフォルトの名無しさん:2005/07/20(水) 03:16:55
>>25
他のヘッダファイルで行われているクラス定義を見直せ。
27デフォルトの名無しさん:2005/07/20(水) 03:36:32
>>26
ありがとうございます。見つかりました。
28デフォルトの名無しさん:2005/07/20(水) 20:42:26
小数点以下切り捨てってどうやるんだっけ?
29デフォルトの名無しさん:2005/07/20(水) 20:49:04
>>28
double→int→double
30デフォルトの名無しさん:2005/07/20(水) 21:12:46
>>28
負の値のときにも 0 へ近づけるのなら (-1.2 ⇒ -1.0) >>29
負の値のときに -∞ へ近づけるのなら (-1.3 ⇒ -2.0) floor()
31デフォルトの名無しさん:2005/07/20(水) 21:19:55
こんにちは。いつもお世話になってます。
クラスの内容とかは置いといて、構文のことなんですが、
下のCMaxSizeTask() の後の :〜 がわかりません。こんなやり方
独習C++には書いてないと思うんですが。どういう意味なんでしょうか?

class CMaxSizeTask : public CTask {
protected:
    char Work[WORK_SIZE];
public:
    CMaxSizeTask() : CTask(TASK_NONE, 0, 0, 0, 0, 0, 0) {}
};
32デフォルトの名無しさん:2005/07/20(水) 21:45:44
>>31
初期化。
もし「独習C++」に書いてないとしたら、よほど古い本かゴミなのだろう。
3331:2005/07/20(水) 21:59:41
ありがとうございました。
おかげで解決しました。

ただ自分が見落としてるだけで
「独習C++」には書いてあるかもしれません。
自分が深く確認してないだけです。ごめんなさい。
34デフォルトの名無しさん:2005/07/22(金) 00:39:24
ウインドウズに挑戦してる超初心者なんだけど、おまいら教えてください。

wprintfをつかったら出力はどこに表示されるの?
35デフォルトの名無しさん:2005/07/22(金) 00:42:47
>>34
お前の頭の中です。
36デフォルトの名無しさん:2005/07/22(金) 00:44:05
>>34
マイクロソフトを相手に戦うとは・・・すごいヤシもいたもんだ。
戦いが酷く低レベルに見えるのは気のせいか?
37デフォルトの名無しさん:2005/07/22(金) 00:48:10
>>34
wprintf の w は wide の w だよ…
printfと同じ場所に出力される。
ウィンドウ上に出力したければ TextOut とかを調べるべし。

>>35-36
つまんないよ
38デフォルトの名無しさん:2005/07/22(金) 00:51:29
マジレスみめぇwwwっうぇwっうぇwwwwwwwww
39デフォルトの名無しさん:2005/07/22(金) 01:14:00
>>38
それ、そろそろみっともないから、やめた方がいいよ。
4034:2005/07/22(金) 02:03:18
>>37
あ、そうですか。てっきりw =Windowsかと。TextOutだと、文字を出すまで
結構手間がかかるから、デバッグ用に簡単に文字出力してくれるのは無いの
かと思って。
Javaだと、System.out.printlnとかで、デバッグ用のコンソール画面にデバイス
コンテキストとか考えずに出してくれるから、そういうものかと勘違いしました。
失礼。
41デフォルトの名無しさん:2005/07/22(金) 02:10:02
>>40
OutputDebugString
4234:2005/07/22(金) 02:32:31
>>41
おおお、そういうものがちゃんとあったんですね。MSDNでちょっと調べてみます。
どうもです。
43デフォルトの名無しさん:2005/07/22(金) 05:07:41
vcだったらデバッガつかったほうが楽だよ
javaのデバッガよりつかいやすいよ。
eclipseも進化したのかな?
44デフォルトの名無しさん:2005/07/23(土) 02:26:45
超初心者ですがお願いします。

I/Oに読み書きするのに、まずポートを開く関数を作って、そのなかで
HANDLE hIOport = CreateFile();
とかやってハンドルを取り出しますよね。

このハンドルを今度、書き込みとか読み込みとかする関数に受け渡すのは
どうやるのが定石なんですか?

なんか、WinProcとかに受け渡すのがよくわからなくて、結局グローバルで
宣言して使ってしまってるんですが、それでも動くからいいんですかね?

そこら辺が分かるようなコーディングの例とかあったら教えてください。
45デフォルトの名無しさん:2005/07/23(土) 08:14:33
>>44
WinProcの中でstatic変数にしとく。
あまり凝ったことしても面倒なだけ。
46デフォルトの名無しさん:2005/07/23(土) 10:08:44
PSPSDKを使ってPSP用のプログラムを作ろうと思っているのですが、

http://d.hatena.ne.jp/yaneurao/20050714
↑ここにある
http://yaneu.com/yaneurao/hatena/hellocpp050710.zip
これをmakeすると

リンク時に

psp-gcc -I. -I/usr/local/pspdev/psp/sdk/include -O2 -G0 -Wall -L. -L/usr/local/
pspdev/psp/sdk/lib src/cpptest.o yaneSDK/draw.o -lpsplibc -lstdc++ -lpspdebug
-lpsplibc -lpspkernel -o testme.elf
/usr/local/pspdev/lib/gcc/psp/4.0.0/../../../../psp/lib/crt0.o: In function `__e
ntrytable':
crt0.S:(.rodata.sceResident+0xc): undefined reference to `module_info'
/usr/local/pspdev/lib/gcc/psp/4.0.0/../../../../psp/lib/libstdc++.a(vterminate.o
):../../../../libstdc++-v3/libsupc++/vterminate.cc:69: undefined reference to `_
impure_ptr'
/usr/local/pspdev/lib/gcc/psp/4.0.0/../../../../psp/lib/libstdc++.a(vterminate.o
):../../../../libstdc++-v3/libsupc++/vterminate.cc:70: undefined reference to `_
impure_ptr'

中略
/usr/local/pspdev/lib/gcc/psp/4.0.0/../../../../psp/lib/libstdc++.a(vterminate.o
):../../../../libstdc++-v3/libsupc++/vterminate.cc:51: more undefined references
to `_impure_ptr' follow

というエラーが出てしまいます。
module_infoや_impure_ptrというのはどういった役割を持ったものなのでしょうか?
47デフォルトの名無しさん:2005/07/23(土) 22:50:30
spawn関数が使えない環境で、spawnlpと等価な機能を実装するにはどうすれば
いいのでしょうか?
48デフォルトの名無しさん:2005/07/23(土) 23:59:06
環境による
49デフォルトの名無しさん:2005/07/24(日) 00:03:14
>>46
シンボルは libc のものだと思う。少なくとも _impure_ptr はそう。
最初の -lpsplibc が余計なんじゃないか?
50デフォルトの名無しさん:2005/07/24(日) 00:03:17
元々が環境依存じゃね?
51デフォルトの名無しさん:2005/07/24(日) 03:29:57
int *p, a=2;
p=&a;
これで*pでaを参照できるけど
関数のとき
void fly(&a,&b)
で呼び出して
呼び出された関数がvoid fly(int *a,int *b)
になるけど前に書いた*pで値だからアドレスを渡すなら
void fly(int a,int b)だと思ったんですけどなんで(int *a,int *b)に
なるか教えてください
52デフォルトの名無しさん:2005/07/24(日) 03:42:21
>>51
> *pで値だからアドレスを渡すなら void fly(int a,int b)

意味不明。なんで void fly(int a,int b) になるのかわからん。

とりあえずポインタの意味、宣言、使い方を勉強しなおせ。

あと日本語下手すぎ。
書き込む前に読み直して、自分以外の人でも理解できるかどうかよく考えろ。
句読点を使って、適当なところで文を切るように気をつけると良いよ。
53デフォルトの名無しさん:2005/07/24(日) 08:25:58
>>51
変数宣言は式の中で*aするとintになるからint *aというように覚えるが吉。
54デフォルトの名無しさん:2005/07/24(日) 09:15:10
二次元配列にアクセスする際、
例えば、
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
sum += array[i][j];
}
}
とするほうが、
sum += array[j][i];
とするよりも速い気がするんですが、これはなぜですか?
それとも気のせいでしょうか。
55デフォルトの名無しさん:2005/07/24(日) 09:23:06
>>54
メモリの位置関係を見れ
キャッシュがあるCPUなら(ry
56デフォルトの名無しさん:2005/07/24(日) 10:28:03
指定したファイルを実行する関数みたいのってない?
57デフォルトの名無しさん:2005/07/24(日) 10:29:53
ある
58デフォルトの名無しさん:2005/07/24(日) 12:23:31
>>56
C++なら<cstdlib>のstd::system()
59デフォルトの名無しさん:2005/07/24(日) 13:07:08
>>54
[0][0],[0][1],[0][2],……[1][0],[1][1],[1][2],…
って感じに並んでるからさ。まぁイメージだけど。
60デフォルトの名無しさん:2005/07/24(日) 15:06:13
諸事情により、C言語でクラス構造を実現したいのですが、
どこかにまとめページのような物はないでしょうか?
61デフォルトの名無しさん:2005/07/24(日) 15:15:35
>>60
C 言語によるオブジェクト記述法 COOL
ttp://www.sage-p.com/process/cool.htm
62デフォルトの名無しさん:2005/07/24(日) 15:50:42
今gcc3.3.3にてスレッドを利用したプログラムを作成しようとしています。
数回のスレッド生成はうまくいきますが
Segmentation fault (core dumped)
が表示されてエラー終了してしまいます。

原因が分かりません。
どこがエラーの原因か指摘していただけませんか?
ソースは以下にupしました。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/785.txt
63デフォルトの名無しさん:2005/07/24(日) 16:04:16
>>61
内容をざっと見ると、かなり面倒なやり方ですね…。
とりあえず、熟読してみます。
ありがとうございました。
64デフォルトの名無しさん:2005/07/24(日) 16:16:01
まぁ面倒なのはしょうがねぇさね
そのための言語じゃないんだからな
65デフォルトの名無しさん:2005/07/24(日) 16:48:03
しかしCのコードを吐くC++コンパイラを探したほうが楽かもしれん。
6660:2005/07/24(日) 17:45:01
>>61を参考にして、自分なりに考えてみました。

・メンバ関数 → 構造体内部に関数ポインタ(コンストラクタで指定)
           (instance->method() みたいに書ける)
・private    → ソース内でstatic定義
・public    → ヘッダor構造体内に記述
・継承     → 構造体をネスト(ベースクラスを一番上に)
・オーバーライド → 継承クラスで関数ポインタ差し替え

って、結局面倒な方法になってますがorz
もう少し検討してみます…。

>>64
素直にCライクな書き方でガシガシ書いた方がすっきりするのかもしれませんね…。

>>65
そのやり方もひとつの手ではありますが、デバッグが大変な気がします。
67デフォルトの名無しさん:2005/07/24(日) 18:29:57
>>66
構造体に直接関数ポインタってのはオーバーヘッドが大きい。
C++そっくりの記法にこだわる必要はないだろうと思う。

非仮想関数は構造体名を付けて構造体へのポインタを第一引数にとる関数にし、
仮想関数も直接メンバに持たせず、メンバにはvtbl構造体へのポインタだけを持たせて、
vtblのメンバに関数ポインタを持たせ、vtblの実体はクラスに1つだけというようにすれば、
C++の実装と大体同じような感じになる。

って書いてからCOOLを読んだら同じことが書いてあった。
鬱ダ(ry
68デフォルトの名無しさん:2005/07/24(日) 18:40:28
>>66
// T.h
struct T;
T* new_T(...);
void delete_T(T* this);
void T_dosomething(struct T* this);

// T.c
#include "T.h"
struct T
{
 ...
};
T* new_T(...) { T* this = (T*)malloc(sizeof(T)); ...; return this; }
void delete_T(T* this) { if(this) { ...; free(this); } }
void T_dosomething(struct T* this) { ... }

こうすると、Tのメンバを変更しても使用側の再コンパイルがかからなくてウマー。
ほぼ完全な private を実現できる。
仮想関数も T.c の都合で決めればいい。

ただしデメリットもある。
・生成にはほぼメモリの動的確保が必須、
・T.c にすべての実装をまとめなくてはならない
69デフォルトの名無しさん:2005/07/24(日) 18:51:45
>>68
それもCOOLに同じようなことが書いてある。
70デフォルトの名無しさん:2005/07/24(日) 19:39:09
>>69
サンプルコードでヘッダに定義が書いてあったんだけど、
文面でヘッダでの定義が不要なことが書いてあるね。ゴメン
7166:2005/07/24(日) 20:31:42
みなさんレスありがとうございました。
結局のところ、COOLでそのままコードを書くのが一番だということですね。
私の理解不足でした。

そういうわけで、COOLで少しコード書いてみます。
72デフォルトの名無しさん:2005/07/24(日) 20:54:05
CでOOをまともに取り組んでるプロジェクトってあるのかね。
COOL見たいな物を考えるのは面白いけど、激しく生産性悪いよな。
7372:2005/07/24(日) 20:55:20
というか、多態か。Cでやる場合の一番の問題点は。
74デフォルトの名無しさん:2005/07/24(日) 21:00:47
>>72
Subversion とか、似たような感じ。

保守性優先ってこともあるだろうが、生産性が悪いとも思わない。
C++に慣れてから、Cしか使えない環境に逝った時は自然にこうなる。
7562:2005/07/24(日) 21:17:29
マルチスレッド用のスレ見つけたのでそちらへ移動します。
失礼しました。
76デフォルトの名無しさん:2005/07/24(日) 22:06:31
>>60-74
CのFILE *とかまさにこんな感じだろ。
こいつには仮想関数がない分すっきりしているけど。
77デフォルトの名無しさん:2005/07/24(日) 22:23:50
CのプラグラムからJavaのプログラムを起動するにはどうしたら良いですか?
78デフォルトの名無しさん:2005/07/24(日) 22:30:49
>>77
<stdlib.h>のsystem()
79デフォルトの名無しさん:2005/07/24(日) 22:30:52
>>77
system("start java");
80デフォルトの名無しさん:2005/07/25(月) 00:20:44
UNIXのCプログラム内でshellを起動して、そのリターンコードを
参照したいのですが、実現する方法ってありますでしょうか?
81デフォルトの名無しさん:2005/07/25(月) 01:25:36
>>80
藻前はすぐ目と鼻の先にあるものも見えないのか?
82偽80:2005/07/25(月) 01:37:17
見えてたら質問しません。
んなこともわからないんですか?
83デフォルトの名無しさん:2005/07/25(月) 01:41:59
お前は正直者なのか
84デフォルトの名無しさん:2005/07/25(月) 03:31:10
>>80
環境依存の方法しかないぞ。
* systemの戻り値は 実 装 依 存 * ですから。
UNIXならexecとかspawnとかその辺だったと思う。
85デフォルトの名無しさん:2005/07/25(月) 09:52:44
偽80
86デフォルトの名無しさん:2005/07/25(月) 11:12:54
try { throw "error" ; }
catch (string str) { }

のように catch で string を受けるようにすると、コンパイルは通るのですが、実行時に落ちてしまいます。
BCC だと Abnormal program termination、VC だとランタイムエラー

どの様にすればいいのでしょうか。ポインタや参照で受けても同様でした。
87デフォルトの名無しさん:2005/07/25(月) 11:22:23
>>86
catch のマッチングには、派生クラスから基底クラス以外の暗黙の型変換は効かない。
その例だと throw string("error") または catch(char const* str) とすれば捕まえられる。
88デフォルトの名無しさん:2005/07/25(月) 11:29:14
>>86
クラスを例外で受けるなら参照にするが吉。
関数の引数同様、いちいちコピーコンストラクタが発動してしまう。
8986:2005/07/25(月) 12:16:51
>>87-88
元コードを見直すとミスと勘違いが混じった質問でしたが理解が深まりました。
ありがとうございました。
90デフォルトの名無しさん:2005/07/25(月) 15:57:17
入力されたコードから一致するデータを"c:\例題.txt"から取得する。
  ※0が入力されるまで処理を繰り返す。できれば一度目の0入力に対応していただけると
   ありがたいです。
  ---------c:\例題.txtの内容-------
  1,あああああああ
  2,いいいいいいい
  65,ううううう うううううう
  89,えええ   えええ ええ
  99,お願いします。

--------------------------
↓↓↓↓実行結果↓↓↓↓
コード?65
ううううう うううううう
コード?
↑↑↑↑↑↑↑↑↑↑↑↑


OS:Windows
コンパイラ:gcc
言語:C
91デフォルトの名無しさん:2005/07/25(月) 15:59:22
すれ違いです。
宿題スレへ。
92デフォルトの名無しさん:2005/07/25(月) 16:06:37
>>90
ぼるじょあがC/C++の宿題を片づけますYO! 48代目
http://pc8.2ch.net/test/read.cgi/tech/1121471445/l50
93デフォルトの名無しさん:2005/07/25(月) 18:29:18
つーかそんなこともできんようなヤツがプログラムしようなんぞ百億年早い
94デフォルトの名無しさん:2005/07/25(月) 18:32:13
>>90
マルチは帰れ
9580:2005/07/25(月) 21:38:15
>>84
返信ありがとうございます。
ただ、前述のsystem関数もexec関数もshellの呼び出しに成功すると制御が
戻ってこないため悩んでいます。
spawn関数というのは使ったことが無いのですが、/usr/include内見てもそれらしき
記述?が無いのでダメかもしれません。

96デフォルトの名無しさん:2005/07/25(月) 22:31:27
>>95
その戻ってこないコードを晒して
あと環境も
97デフォルトの名無しさん:2005/07/25(月) 23:46:32
>>80
これじゃダメ??

int main(){
int ret=0;

ret = system( "/home/hoge/test.sh" );
printf( "%d\n" , WEXITSTATUS( ret ) );

return 0;
}
98デフォルトの名無しさん:2005/07/26(火) 09:21:45
JavaとC++ではどのくらい違いますか?
そろそろネイティブ系も使ってみようと思っているのですが
99デフォルトの名無しさん:2005/07/26(火) 10:38:04
主語も書けない奴がプログラムをするな
100デフォルトの名無しさん:2005/07/26(火) 10:44:27
「プログラムをする」なんて表現する香具師が(ry
101偽80:2005/07/26(火) 10:57:28
はい、私インターネットできます。
102デフォルトの名無しさん:2005/07/26(火) 11:22:18
お茶する?
103デフォルトの名無しさん:2005/07/26(火) 17:28:53
ごまする
104デフォルトの名無しさん:2005/07/26(火) 18:08:25
ユウジローの「するーズ」を思い出したのは
俺だけでいい
105デフォルトの名無しさん:2005/07/26(火) 19:50:20
>>98
悪いことは言わん、そのままJavaやっとけ。
106デフォルトの名無しさん:2005/07/27(水) 01:09:24
おれもVBスクリプトハッカーだからそろそろネイティブ系も使ってみるかな
107デフォルトの名無しさん:2005/07/27(水) 01:09:57
>>106
warosu
108デフォルトの名無しさん:2005/07/27(水) 14:06:45
>>106
うらうらべっかんこー
109デフォルトの名無しさん:2005/07/27(水) 20:06:46
漏れもHSPスクリプトハッカーだから(ry
110デフォルトの名無しさん:2005/07/28(木) 02:13:09
HTMLとC++ではどのくらい違いますか?
そろそろネイティブ系も使ってみようと思っているのですが
111デフォルトの名無しさん:2005/07/28(木) 07:04:41
月とすっぽんくらい違います
112デフォルトの名無しさん:2005/07/28(木) 07:45:29
銀河系とミトコンドリアぐらい違います。
113デフォルトの名無しさん:2005/07/28(木) 07:52:14
ホットボンドと半田ごてくらい違います。
114デフォルトの名無しさん:2005/07/28(木) 08:32:44
そもそもそれぞれ別世界です。
115デフォルトの名無しさん:2005/07/28(木) 09:05:38
くだらないネタでスレを浪費するな
116デフォルトの名無しさん:2005/07/28(木) 09:31:11
質問させていただきます。

C++にて
p = new int [5][8];
と動的に多次元配列をnewできないかなと考えていたのですが、もちろんデフォではダメでした。
new のオーバーロードに手をつけようと思ったのですが、どうやら
newは返り値がvoid* と決まっているようです。

JAVAのようなお手軽な多次元配列は作れないものでしょうか?
117デフォルトの名無しさん:2005/07/28(木) 09:54:18
>>116
newだと最上位の要素数以外はコンパイル時に決まっている必要がある。
で、どうするかというと、
int n = 8;
int *p = new[5 * n];
としてp[y * n + x]などと手動で指定したり、std::vector<std::vector<> >やboost::multi_arrayを使ったりする。

operator newの返り値がvoid *なのは、まだただのメモリの塊に過ぎないから。
そこへコンパイラがコンストラクタを動かして初めて何らかの型へのポインタになる。
(たとえintなどの組み込み型でも概念としてはそうなる)
118デフォルトの名無しさん:2005/07/28(木) 10:17:29
寧ろ、配列に拘らずにクラス化しちゃえばいいんでない?
class intArray2 {
unsigned mx, my;
int * ma;
public:
intArray2() : ma(0) {}
intArray2(unsigned x, unsigned y) {
mx = x;
my = y;
ma = new int[x * y];
}
~intArray2() {delete int[] ma;}
int at(unsigned x, unsigned y) const {return ma[x + mx * y];}
int & at(unsigned x, unsigned y) {return ma[x + mx * y];}
};
#だったらmulti_array使えって言われそうな気がしてきた。
119デフォルトの名無しさん:2005/07/28(木) 10:22:30
>>117
なるほど。ありがとうございます。
ついでといっては何なのですが、

>newだと最上位の要素数以外はコンパイル時に決まっている必要がある。
これでの記述の仕方はどのような形なのでしょうか。
想像するに
int *p[5] = new int [n][5];
とかかなと思ったのですが、うまく行きませんでした。
120デフォルトの名無しさん:2005/07/28(木) 10:27:39
>>119
int (*p)[5] = new int [n][5]; //「int[5]」の配列[要素数n]
int *p[5] = new int *[n]; //「intへのポインタ」の配列[要素数n]
121デフォルトの名無しさん:2005/07/28(木) 10:29:05
>>119
それは受け取り方が間違い。
122デフォルトの名無しさん:2005/07/28(木) 10:36:41
>>120-121
ありがとうございます。
int (*p)[5] = new int [n][5];
がうまくいきました。

int *p[5] = new int *[n];
のほうはダメみたいです。

私の書き方だと
*(p[5])だと判断されてしまうのですね。
123デフォルトの名無しさん:2005/07/28(木) 10:37:51
>>118
それもおもしろいアイデアですね。
.lengthなども使えて便利になりそうです。
124デフォルトの名無しさん:2005/07/28(木) 10:47:24
int **p = new int*[m];
for(int i=0;i<m;i++) {
  p[i] = new int[n];
}
面倒だけどこれでもいいんじゃなかったっけ?
125デフォルトの名無しさん:2005/07/28(木) 10:52:21
アクセスにノウハウが必要なんてCじゃないんだから……
C++ならそういうどさ回りの仕事は隠蔽しようよ。
126120:2005/07/28(木) 10:52:56
>>122
スマソ
int *p[5]はint *の配列だった。使うとしたらこうだな。
for (int i = 0; i < 5; i++)
    p[i] = new int[n];
127デフォルトの名無しさん:2005/07/28(木) 13:16:32
俺みたいに最近の奴は
Cを飛ばしてC++が普通だから
この手の話題が苦手の奴が多いはずだ!
int *p[5] ←なんだよコレ、つかわねーよこんなの
128デフォルトの名無しさん:2005/07/28(木) 13:24:46
typedef int *PINT;
PINT p[5];とint *p[5];は等価。
129デフォルトの名無しさん:2005/07/28(木) 13:27:40
main(int argc,char *argv[])
130デフォルトの名無しさん:2005/07/28(木) 13:58:17
>>129
そこは仮引数だからargvはchar **と等価。
131デフォルトの名無しさん:2005/07/28(木) 16:25:06
>>124
それ書くのがめんどくさいんだよねー。
132デフォルトの名無しさん:2005/07/28(木) 16:45:23
>>124
それだと普通の二次元配列と同じレイアウトにはならない

まあC++ならvector<vector<int> >を使うかclass Matrixでも
定義するかだろ
133デフォルトの名無しさん:2005/07/28(木) 18:24:13
>>132
それでも普通の二次元配列と同じレイアウトにはならない
134デフォルトの名無しさん:2005/07/28(木) 18:57:57
そこでboost::multi_arrayですよ。
135デフォルトの名無しさん:2005/07/29(金) 03:39:04
javaってこんなんできたっけ?
p = new int [5][8];
cでいう
int** p
しか作れんのじゃなかったっけ
136デフォルトの名無しさん:2005/07/29(金) 03:40:20
2次元目のサイズがばらばらってことね
137デフォルトの名無しさん:2005/07/29(金) 11:23:49
#include <iostream>

int main() {
__int64 i64 = 1 ;

for (int i = 0; i < 63; ++i) i64 <<= 1 ;

std::cout << i64 ;

return 0 ;
}

↑これの出力結果が

BCC 5.6.4
-'..--).0-*(+,))+(0(

vctk
-9223372036854775808

になります。BCC のバグでしょうか?
138デフォルトの名無しさん:2005/07/29(金) 12:36:29
>>137
その for ループでは i64 は最終的に 0x8000000000000000 になる。
十進数に直すと -9223372036854775808。
何が不満なの?
139デフォルトの名無しさん:2005/07/29(金) 12:37:42
>>138
よく嫁
140デフォルトの名無しさん:2005/07/29(金) 12:45:49
>>139
読んでもわからんから、何が不満なのか訊いているんだが。
141デフォルトの名無しさん:2005/07/29(金) 12:47:06
vctkでは正常に表示されるのに、BCCでは変な文字が表示されるのは何故か
ってことだろ?
142デフォルトの名無しさん:2005/07/29(金) 12:49:12
>>141
ああ、そういうことか。


・・・再現できねえ。
143デフォルトの名無しさん:2005/07/29(金) 15:18:39
>>137
std::coutの実装が違うとしか答えられんな。
STLport導入しても同様の結果か?

VC6.0 + STLportならvctkと同じ結果だったが。
144デフォルトの名無しさん:2005/07/29(金) 20:12:40
>>137
std::coutが__int64扱えてないっぽい (bcc5.6.4(BCB6) (5.6.0以降はSTLportが標準))
てかヘルプ見たらbasic_ostream::operator<<(__int64)自体が定義されてないもより

#include <iostream>
#include <vcl.h>
#pragma link "vcl.lib"
#pragma link "rtl.lib"

int main() {
__int64 i64 = 1 ;

for (int i = 0; i < 63; ++i)
i64 <<= 1 ;

std::cout << i64 << std::endl;
std::cout << IntToStr(i64) << std::endl;
std::cout << AnsiString().sprintf("%Ld", i64) << std::endl;

return 0 ;
}

結果:
-'..--).0-*(+,))+(0(
-9223372036854775808
-9223372036854775808

※IntToStrはint型/__int64型をBCB標準のDelphi互換文字列型(AnsiString)に変換するVCL関数
145デフォルトの名無しさん:2005/07/29(金) 20:15:29
>>137
うちでもBCC5.6.4では同じ結果が出る。
>>143
BCC5.6.4のSTLはSTLport4.5.3のカスタマイズ版で、おそらく
_int64に対する ostream& operator<< のオーバーロードに
不具合があるのだろう。
146デフォルトの名無しさん:2005/07/29(金) 20:24:20
じゃ自前でoperator <<を書いてみたらどうなるだろう?
147デフォルトの名無しさん:2005/07/30(土) 00:36:09
C++でCのライブラリを使ってます。
ライブラリの1関数にCの関数を引数として渡す物があるのですが、
それにC++のクラスメソッドを渡すにはどう指定すればいいんでしょうか?

そのまま渡すとコンバート出来ないとコンパイルでエラーになってしまいます。
148デフォルトの名無しさん:2005/07/30(土) 00:38:25
>>147
無理。
そのコールバックに追加の引数を渡せる仕組みがあるなら、似たようなことは出来る。
149デフォルトの名無しさん:2005/07/30(土) 00:42:41
>>147
型変換できないってエラーが出たんだから、型をあわせてやると良いよ。
150デフォルトの名無しさん:2005/07/30(土) 00:43:06
>>147
staticなメンバ関数なら渡せるんで内科医?
151デフォルトの名無しさん:2005/07/30(土) 00:51:52
>>148
え、無理なんですか?

>>149
型を合わせてもダメなんです。
関数でコンパイル通るものをそのままクラスのメソッドにしてます。

>>150
それはやってみましたが、ダメみたいです。
152デフォルトの名無しさん:2005/07/30(土) 00:55:57
>>151
> 型を合わせてもダメなんです。

型を合わせたんなら「コンバートできない」なんて言われるわけ無いだろ。
非staticメンバ関数の型は見た目と違うから気をつけろ。
153デフォルトの名無しさん:2005/07/30(土) 01:04:24
>>152
うーん、そうなんですか。
例えばvoid func(char* buffer, unsigned int length)
という関数を渡す場合だと、普通の関数ではそのままでOKで、
クラスメソッドにする場合は何かを付けないといけないのでしょうか?

よかったらそれを教えてもらえませんか?
154デフォルトの名無しさん:2005/07/30(土) 01:11:05
>>153
例えば、そのfuncがclass testのメンバ関数だとすると、funcへのポインタの型は
void (test::*)(char *, unsigned int)
になって、
void (*)(char *, unsigned int)
とは違うし、前者を後者に変換することはできない。
>>152がどういう意味で「型をあわせろ」と言ったのか知らんが。
155デフォルトの名無しさん:2005/07/30(土) 01:46:53
>>154
どうもです。
やっぱり出来ないんですか。
他の方法を検討してみます。
ありがとうございました。
156デフォルトの名無しさん:2005/07/30(土) 02:04:20
>>155
こんな感じ
#include <iostream>
using namespace std;
class A {
public:
void funcm(char* buffer, unsigned int length) {
cout << "A::funcm" << endl;
}
static void funcs(char* buffer, unsigned int length) {
cout << "A::funcs" << endl;
}
};
void func(char* buffer, unsigned int length) {
cout << "func" << endl;
}
void exec (void (*func)(char*, unsigned int)) {
char* buffer; unsigned int length;
(*func) (buffer, length);
}
A *ap (0);
void call_funcm(char* buffer, unsigned int length) {
if (ap) ap->funcm (buffer, length);
}
int main () {
exec (&func);
exec (&A::funcs);
A a; ap = &a;
exec (&call_funcm);
return 0;
}
157デフォルトの名無しさん:2005/07/30(土) 08:36:53
Linux/gccで親プロセスからforkした子プロセスの標準出力/標準エラー出力を
取ろうとしているのですが、親から読み出そうとするときに止まってしまう時があります。
ファイルディスクリプタをfdopenで開いてfgetsで読み出してるんですが、その部分
で止まっているのでeofまで読めていないのかな、とも思ってるんですが…。

こういう時って、どうするのでしょうか?。UNIX依存の話で申し訳ないのですが、
どなたかご教授ください。

下にテストに使ったの最小構成のプログラムを載せます。
158デフォルトの名無しさん:2005/07/30(土) 08:39:46
int main()
{
return 0;
}
159157:2005/07/30(土) 08:52:31
…のせようと思ったのですが、投稿制限に引っかかったので
アップローダにupしました。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/819.c
160157:2005/07/30(土) 08:54:51
う、たびたびすいません。上のソースのmain関数内でexecに対して
(標準出力/エラー出力を出すような)適当なコマンドを作って、実行用の
関数に与えています。
161デフォルトの名無しさん:2005/07/30(土) 10:41:25
なんか無駄に難しくしている気がする。
FILE * fp = fopen("/bin/sh 2>&1", "r");
じゃだめなんだろか。

それはそうと、Unixプログラミングスレに行った方がよさそうだね。
162デフォルトの名無しさん:2005/07/30(土) 10:51:14
>>156
ありがとうございます。
よく分かりました。
163157:2005/07/30(土) 10:53:03
ID変わってますけど、別PCからの投稿です。

> 161さん
アドバイスありがとうございます。
UNIXプログラミングスレであらためて質問したいと思います。

ところで、これって何をやってるのか理解できない私なのですが、

> FILE * fp = fopen("/bin/sh 2>&1", "r");

shの標準出力とエラー出力を読むfpを確保しているのでしょうか。
164157:2005/07/30(土) 10:53:46
・・・ってここID出なかったのか。

ハズカシイ
165デフォルトの名無しさん:2005/07/30(土) 10:59:05
ごめ、popen()だよ。
#いかんなぁ、頭がやられているらしいw
166157:2005/07/30(土) 11:04:09
> 165さん
標準出力と標準エラー出力を別々に読み出したいのでpipeを使っています。
popenだとそれはできない、という認識です。

・・・う、不安になってきたのでpopenについて調べてみます。
167デフォルトの名無しさん:2005/07/30(土) 13:56:30
漏れは >147 じゃないんだどさ。
「クラスメソッド」って言ったら C++ では static メンバ関数に相当するものじゃないの?
後、C の関数だと渡せるのに static メンバ関数にしたら渡せないなんてあり得るの?
ソース見せて欲しい。
168デフォルトの名無しさん:2005/07/30(土) 13:58:02
>>167
147の言うクラスメソッドは非メンバ関数のことだろ。
169デフォルトの名無しさん:2005/07/30(土) 14:15:12
>>168 いくらなんでもそれはありえない。
170デフォルトの名無しさん:2005/07/30(土) 17:36:03
組み込み型って何ですか?
171デフォルトの名無しさん:2005/07/30(土) 18:07:15
>>170
コンパイラ側で定義されてる型
char int short long float double等
172デフォルトの名無しさん:2005/07/31(日) 13:08:37
char* c;
c = "abc";
これは良いのに、
char* c;
c = 'a';
これがだめなのは何故ですか?
173デフォルトの名無しさん:2005/07/31(日) 13:09:55
任意型のポインタ DataClass::GetPointer(int iWhat)
{
switch(iWhat) {
case WHAT_INT: return &m_int;
case WHAT_CHAR: return &m_char;
case WHAT_INTERFACE: return &m_interface;
}
}
のような任意型を返す場合、templateは使えますか?
174デフォルトの名無しさん:2005/07/31(日) 13:16:49
>>172
'c'はただの定数。ポインタに代入してどうする。
"abc"なら領域が確保されてchar *cがそこを指すポインタって事になる。

>>173
void*で返せばよくね?
175デフォルトの名無しさん:2005/07/31(日) 13:39:03
>173
template による型の解決はコンパイル時の処理だから、実行時に型が変わる場合には対応できない。
動的に型が変わることがなく、インタフェースを統一したいだけなら
template<typename T>
T* DataClass::GetPointer(void);
で、GetPointer<int>() みたいにはできるだろうが。
本当に任意型が欲しいなら boost::any でも使えば?
176デフォルトの名無しさん:2005/07/31(日) 21:40:21
C言語での質問です。

system()を使いたいんですがlinux上では"./"がいりますがwin上では"./"がいらないので
どう対応させたらいいのかで困っています。

一番素直なのは

#ifdef WINDOWS
sprintf(ss, "main.exe");
#elif defined UNIX
sprintf("ss, "./main.exe");
#endif
system(ss);

なんですが#ifdef, #endifをいちいち入力するのは面倒です。
なにかいい方法はありませんか?

すいません別件でもう一つあります。

system()をつかってあるプログラムを実行したいんですが、
そのときにバイナリデータを渡したいと思っています。

その方法として、ファイルにfwrite()でバイナリを一気に書いておいて
引数としてファイル名を渡そうかとも思ったんですが
main関数にバイナリデータを渡す方法はありませんか?
ファイルを通過させるとどうしてもIO時間がかかるのであまり使いたくありません。
渡したいデータは256バイト×2と決まっています。
177デフォルトの名無しさん:2005/07/31(日) 21:49:03
>>176
>system()を使いたいんですがlinux上では"./"がいりますがwin上では"./"がいらないので
winって"./"あるとまずいんだっけ?

>>176
>main関数にバイナリデータを渡す方法はありませんか?
popen
178デフォルトの名無しさん:2005/07/31(日) 21:59:41
XPのプロンプトから
type ./hoge.txt
ってやったら構文エラーがでるようだ。
type .\hoge.txt
なら通るけどな。system()の場合はどうだろうなぁ。
179デフォルトの名無しさん:2005/07/31(日) 22:04:42
>winって"./"あるとまずいんだっけ?

>'.' は、内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。

といわれてしまいます。

popen()の紹介ありがとうございました。
180デフォルトの名無しさん:2005/07/31(日) 22:10:55
system()でも"./"があると
>179のようなメッセージが表示されてしまいます。
181デフォルトの名無しさん:2005/07/31(日) 22:14:40
フルパスだと/で動く摩訶不思議
182デフォルトの名無しさん:2005/07/31(日) 22:27:01
#ifdef WINDOWS
 #define PASS
#elif defined UNIX
 #define PASS ./
#endif

sprintf(ss, #PASS "./main.exe");

とか安易に考えてみたけど無理?
183デフォルトの名無しさん:2005/07/31(日) 22:55:14
>>182
どうせやるなら

#ifdef WINDOWS 
#   define DIR "\\"
#elif defined UNIX 
#   define DIR "/"
#endif
    system("." DIR "main.exe");
で委員ジャマイカ?
184デフォルトの名無しさん:2005/07/31(日) 23:57:13
>>181
#include
だと/でいいんだよね
正直キモい
185デフォルトの名無しさん:2005/08/01(月) 00:03:16
つーかLinuxのログインシェルかどこかでPATHの末尾に.を入れておけばいいじゃん。
#という無法を言ってみるテスト。
186デフォルトの名無しさん:2005/08/01(月) 08:47:11
>>184
逆にURLを\にして動くのもきもい。
http:\\www.google.co.jp\
187デフォルトの名無しさん:2005/08/01(月) 09:15:51
もうぜんぶ「/」にしてほすぃ
188デフォルトの名無しさん:2005/08/01(月) 09:20:41
Apple-HFSはディレクトリ区切りが':'で'/'はファイルに使えるしなぁ。
189デフォルトの名無しさん:2005/08/01(月) 09:26:25
キモ木彡
190デフォルトの名無しさん:2005/08/01(月) 11:35:41
2バイト文字からマルチバイト文字に変換する標準関数(じゃないかも)
が有ったはずですが、関数名教えてください。
wtombみたいな。
191デフォルトの名無しさん:2005/08/01(月) 11:38:00
>>190
wctomb() / wcstombs()
「2バイト文字」じゃなくてwchar_tだけどな。
192デフォルトの名無しさん:2005/08/01(月) 12:29:44
Windows上の実行可能ファイルのウィンドウ名とクラス名は
バイナリエディタで書き換える事ができるのでしょうか?

実行可能ファイル中でウィンドウ名とクラス名の文字列そのものを
検索しても全くヒットしませんでした(´Д⊂
193デフォルトの名無しさん:2005/08/01(月) 14:02:25
>>192
文字列だからそれをどう持っているかはそのソフトによる。
究極的にはバイナリエディタでできるはずだけど、何らかの暗号化をしている可能性もあるし、
UPXなどで実行ファイルが圧縮されている可能性もある。
194デフォルトの名無しさん:2005/08/01(月) 21:27:56
Cで作れそうなものをC++で作ったら時間や負荷がかかるものなんでしょうか?
195デフォルトの名無しさん:2005/08/01(月) 21:30:24
作る人による
196デフォルトの名無しさん:2005/08/01(月) 21:31:14
>>194
仮想関数等の関係で多少増えるけど気にするレベルじゃない。
メンテや再利用等のメリットの方が遙かに大きい。
197デフォルトの名無しさん:2005/08/01(月) 21:33:05
>194
メモ帳でできる文書を Word で作ったら時間や負荷がかかるものなんでしょうか?
198デフォルトの名無しさん:2005/08/01(月) 21:37:30
>>183
その前にUNIXで.exeって気持ち悪いよ。
199デフォルトの名無しさん:2005/08/01(月) 22:29:31
>>194
俺は常にC++だ。Better Cだ。C99相当の機能もある。
CにできてC++にできないことなどない。STLやiostream/basic_stringはかなり便利だ。
もちろんこんなときにはオブジェクト指向なんて使わない。

>>197
CとC++(OO抜き)の違いはメモ帳とテキストエディタ程度でしかない。
JavaやC#のほうがWordに近い、って言うとJavaやC#の人に怒られそうだ。せいぜいワードパッドくらいか。
やはりC++こそプログラミング言語のWordか。
200デフォルトの名無しさん:2005/08/01(月) 23:46:20
>>198
実行形式拡張子の規定など無いのにexeが気持ち悪いとか言う方が気持ち悪いよ
201デフォルトの名無しさん:2005/08/01(月) 23:50:37
>>200
規定があれば気持ち悪いなんて書かないよ。
どうしようも無いんだから。
202デフォルトの名無しさん:2005/08/01(月) 23:51:05
>>201
あきれるね
203デフォルトの名無しさん:2005/08/01(月) 23:54:06
borlandのbccをダウンロードしたのですが、
http://www.kumei.ne.jp/c_lang/bcc/bcc_02.htm
のサイトに書かれているようなファイルの作り方が分かりません。
204デフォルトの名無しさん:2005/08/01(月) 23:55:19
↑ウインドウズxp使用しています
205デフォルトの名無しさん:2005/08/01(月) 23:56:51
>>203
「メモ帳で次のように打ち込みます。」
って書いてあるけど。
メモ帳も扱えんのかお前は。

と、釣られてみるテスト。
206デフォルトの名無しさん:2005/08/02(火) 00:09:25
スタート→すべてのプログラム→アクセサリ→メモ帳
207デフォルトの名無しさん:2005/08/02(火) 00:13:45
メモ帳での設定完了しますた。
208デフォルトの名無しさん:2005/08/02(火) 00:16:31
「コマンドライン リファレンス」って・・・
ヘルプで検索してみたけど見つからない・・・orz
209デフォルトの名無しさん:2005/08/02(火) 00:18:37
ここはお前の日記帳じゃねえんだ
210デフォルトの名無しさん:2005/08/02(火) 00:19:52
そうだ。俺の日記帳だ。
211デフォルトの名無しさん:2005/08/02(火) 00:20:58
>>200
屁理屈いうな禿げ
212デフォルトの名無しさん:2005/08/02(火) 00:26:27
>>208
今時の若い者はコマンドプロンプトの使い方もわからないのか
わからない単語が出てきたら、まずは自分で調べろ。
説明書見るとか、ググってみるとか、いろいろ方法あるだろ。
それでもわからなかったらココに書け。
自分で調べもしないで人に質問するな。

というわけで>>208よ、まずは「コマンドプロンプト」でググれ。話はそれからだ。
213192:2005/08/02(火) 00:28:51
>>193
アリガトウゴザイマシタ(´∀`)ノシ
214デフォルトの名無しさん:2005/08/02(火) 00:33:34
>>211
屁理屈も理屈なのであって、論破できない論理的弱者が使う言葉。
矛盾のない論理の世界に生きる人間であるプログラマが使う言葉では
ない。以後慎んだ方が自分の品位を保てるというもの。
215デフォルトの名無しさん:2005/08/02(火) 00:38:17
始めから相手にしない方が自分の品位を保てるというもの。
216デフォルトの名無しさん:2005/08/02(火) 00:43:45
品位なんて言葉を持ち出す事自体が品位の無い人間なのだよ
217デフォルトの名無しさん:2005/08/02(火) 01:01:55
>>214
屁理屈いうなハゲ
218デフォルトの名無しさん:2005/08/02(火) 01:06:34
屁理屈を信じろ!屁理屈は無限の力だ!それを信じろッ!
219デフォルトの名無しさん:2005/08/02(火) 02:16:55
お前のは屁理屈ですらない。
妄言。
220デフォルトの名無しさん:2005/08/02(火) 03:46:08
確かに屁理屈には無限の力が秘められている。イタチゴッコとも言うが。
221デフォルトの名無しさん:2005/08/02(火) 13:37:06
正確な理屈と不正確なTPO。
あるいは正確な理屈と、それとは実は何も関係ない個人の嗜好。
この組み合わせが屁理屈の肝だな。
>>200は後者。
222デフォルトの名無しさん:2005/08/02(火) 14:22:35
>>211
200の方が正しい。
223デフォルトの名無しさん:2005/08/02(火) 14:42:56
他にネタは無いのかね
224デフォルトの名無しさん:2005/08/02(火) 14:47:15
>>222
気分の問題に正しいもくそもあるか
おまえはUNIXで*.exeでもつかっとけ
225デフォルトの名無しさん:2005/08/02(火) 14:53:19
某所で見たプロセスはexexec.exeだったなぁ。
226デフォルトの名無しさん:2005/08/02(火) 15:08:04
>>224
ちゃんと*をつけてるあたりがかわいらしいなw
227デフォルトの名無しさん:2005/08/02(火) 15:40:56
「引数がUINTで戻り値がvoid」型の関数へのポインタをm_pFuncとし
クラスのメンバ変数にしたいので、↓のように書きました。
private:
void (*m_pFunc)(UINT);
これは一応コンパイルを通りました。
(一応動いてはいるようですがこの書き方で正しいのでしょうか?)
さらにこのポインタを別のクラスなどから取得する為に
Get〜みたいな関数を作りたいのですが、どうやって書けばよいのでしょうか?
228デフォルトの名無しさん:2005/08/02(火) 16:20:10
場違いでしたらすみません。
CからFORTRANのサブルーチンに生の数字を渡したいのです。
たとえば
--main.c---
main{
fsub_(12);
}
--fsub.f---
subroutine fsub(i)
write(*,*)i
return
end

みたいに12という数字を代入なしに渡したいのです。
どんなもんでしょか。
229デフォルトの名無しさん:2005/08/02(火) 16:27:45
>>228
あなたが使っているCとFortranの仕様はあなた以外に知らないのですから、
どんなコンパイラを使っているか、通常はどうやって渡しているか、などの情報無しには
何のアドバイスも得られないと思うのです。
#つーか、普通に渡せると思うんだけどねぇ。
230デフォルトの名無しさん:2005/08/02(火) 16:47:20
>>224
激しく使ってますが何か?w
231228:2005/08/02(火) 16:52:48
すみません、環境はfedoraのf77でコンパイルしてます。
f77 main.c fsub.f
で出来たa.outを実行すると
セグメンテーション違反になります。
うーーん、i=12;とか代入したものを渡すとうまくいくんですけど。。
232デフォルトの名無しさん:2005/08/02(火) 16:52:54
>>227
typedefすれば使う側にとっても親切だしわかりやすい。
public:
typedef void (*Func)(UINT);
Func GetFunc() const throw() {return m_pFunc;}
private:
Func m_pFunc;
233デフォルトの名無しさん:2005/08/02(火) 17:04:50
>>231
もう少しソースを晒せないかな。
i = 12; fsub_(i); なら巧くいくってこと?
そのiの型は整数型?

最早忘れたけど、Fortranって参照渡しだったっけ?
だとしたら、値を格納する場所が必要になるから即値を渡すことは不可能だね。
234デフォルトの名無しさん:2005/08/02(火) 17:12:33
それだったらC++のconst参照を使えば即値を使えるんじゃないの?
235228:2005/08/02(火) 17:13:33
ソースは実装前のお試し用ですので228のまんまです。
int i; i = 12; fsub_(i);
だとうまくいきます。
やっぱり代入必須っぽいですね・・。
236デフォルトの名無しさん:2005/08/02(火) 19:08:11
>>235
そのfsub_のプロトタイプはどこかに{作った|生成された}のかな?
普通のCコンパイラなら、仮令一旦代入しても値を積んじゃうと思うけど。
#だから環境はできるだけ晒してくれた方が早いのさ。
237デフォルトの名無しさん:2005/08/04(木) 05:17:23
>>232
ありがとうございました。
typedefしたら混乱しないで書けるようになりました。

ところでまた質問なのですが、
関数宣言の後のconst throw() っていうのが始めてみる書き方なんですが、
どういう意味があってどういう場合に用いるのでしょうか?
238デフォルトの名無しさん:2005/08/04(木) 08:12:45
>>237
constとthrow()は別の意味を持つ。
constは、そのメンバ関数がconstなオブジェクトに対して使用できることを表す。
例えばgetterはオブジェクトを変更しないのでconstをつけるべき。こうしないと、
class foo {
int mFoo;
public:
int getter() {return mFoo;}
};
const foo bar;
bar.getter();
でこのgetter()が失敗する。
throw(リスト)はこの関数が投げる例外のリストを示す。
中身がないこの例ではgetterが例外を投げることがないことを保証している。
実際、getter内で例外を投げようとすると上でtryを張っていてもいきなりabortする。
239194:2005/08/05(金) 13:15:01
返事遅れました、すみません。
最近C++を勉強し始めたのですが、Cのほうが速いのだったらC++は使わないほうがいいかなと思ってました。
あんまり差がないそうなのでC++を引き続き勉強します。
ありがとうございました。
240デフォルトの名無しさん:2005/08/05(金) 14:09:01
>>194
処理速度だけが問題ならC++どころかCも使わずにアセンブラでも使えばいい。
速度的に疑問の残るJavaやVBが実務に使われていることからも処理速度だけが問題でないことはわかるだろう。
寧ろ勉強中のレベルなのであれば、プログラミングを身につけるためには
処理速度云々で言語を選ぶべきではない。
241デフォルトの名無しさん:2005/08/05(金) 15:52:40
テキストファイルの最終行を読み込む方法を教えてください。
242デフォルトの名無しさん:2005/08/05(金) 16:01:30
テキストファイルの最終行を読み込めない方法を教えてください。
243デフォルトの名無しさん:2005/08/05(金) 16:05:57
FILE* f=fopen("txt.txt","r");
char buffer[1024];
while((fgets(buffer,1024,f)!=NULL);
fclose(f);
printf("%s\n",buffer);

244デフォルトの名無しさん:2005/08/05(金) 20:19:22
c++ の 1 つ目の + は何を表してますか?
また、2 つ目の + は何を表してますか?
c+ じゃいけなかったんですか?
245デフォルトの名無しさん:2005/08/05(金) 20:30:24
Cを++(インクリメント)してるからC++なんです
246デフォルトの名無しさん:2005/08/05(金) 21:29:51
cのバージョンが1上がりマスタ
247デフォルトの名無しさん:2005/08/05(金) 22:48:44
でも後置インクリメントだと評価の時点では元のCと等価な罠
248デフォルトの名無しさん:2005/08/05(金) 22:55:22
Cの性質も併せ持つ、という意味ではそのほうがいいカモ
249デフォルトの名無しさん:2005/08/05(金) 22:56:02
だからC++はCとの最大限の互換性の確保に懸命だった。
250デフォルトの名無しさん:2005/08/05(金) 23:00:58
++Cじゃなくて本当によかった
251デフォルトの名無しさん:2005/08/05(金) 23:03:49
もう~cでいきます
252デフォルトの名無しさん:2005/08/05(金) 23:33:29
誘導されてきました

行列の積を求めるプログラムを書こうとしたが、コンパイルエラーが出てしまいます。
46行目で変数宣言できないと言われ、かつ定数式が必要と6つも出てきた…
OS:XP
言語:C
コンパイラ:BCC です。
タダのコンパイラではやはり無理なのでしょうか?
アルゴリズムについてはせめないで。。
ソースはこちら:
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/843.txt

『C言語なら俺に聞け! Part111』 の >>817-830 あたりの質問:
825 名前: デフォルトの名無しさん [sage] 投稿日: 2005/08/05(金) 23:20:24
>>818
malloc でビープ領域に作られた領域のアドレスが帰ってきて、
それをどうやって後で取得する l と m と n に関連付けるのか、実際の運用方法が分からない。。

malloc の引数は領域のバイトサイズだけど、配列の大きさが決まらないうちは使いようがないのでは?

Parray=malloc(sizeof(なんちゃら));
みたいにやるのか?

どなたか丁寧にお教えください〜
253デフォルトの名無しさん:2005/08/05(金) 23:49:13
>252
向こうで答えてくれてる人がいるぞ。
あと、FAQ 嫁。
ttp://www.kouno.jp/home/c_faq/c6.html#16

×タダのコンパイラではやはり無理なのでしょうか?
○C99非対応のコンパイラでは無理
向こうで gcc 使えって言われなかったか?gcc はタダだぞ?

>malloc の引数は領域のバイトサイズだけど、配列の大きさが決まらないうちは使いようがないのでは?
配列の大きさが決まった後に malloc すればいいんじゃないかな?ないかな?
つーか
>int a[l][m],b[m][n],p[l][n];/*  ここが46行目  */
の時点で配列の大きさ決まってるだろうが、ぼけが。

あと while(1) の意味の無さっぷりに感動したことは付け加えておく。
254デフォルトの名無しさん:2005/08/06(土) 00:07:07
>>253
マルチしてる奴に答えるな
あっちこっちに書けばいっぱい答えが返ってくると勘違いするだろ
255デフォルトの名無しさん:2005/08/06(土) 00:12:20
>>254
マルチじゃなくて誘導されただけだろ?
256デフォルトの名無しさん:2005/08/06(土) 00:15:22
自演乙。
257デフォルトの名無しさん:2005/08/06(土) 00:20:44
(´ー`)┌
258デフォルトの名無しさん:2005/08/06(土) 00:36:59
>>252
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/844.txt
もしmain()以外関数作成禁止だったらころすよ。
259デフォルトの名無しさん:2005/08/06(土) 00:38:17
go, gotoを見ちゃったよお母ちゃん、ダイクストラさんが怒りそうなgotoだったよ。

こんなとこでスレを無駄に使われても困るので>252はここにでも行ってくれ、
解決方法はここのHPに詳しく載ってる。
ttp://www2s.biglobe.ne.jp/~k5855/tag_03/index_tag03.html
260デフォルトの名無しさん:2005/08/06(土) 00:45:56
>>259
すみませんコンパイルの仕方がわかりません…
261デフォルトの名無しさん:2005/08/06(土) 09:25:51
でもヘタにスコープネストしまくるよりgotoのほうがスマートな時もあるお><
262前スレ816:2005/08/06(土) 16:42:30
VIPPERはgotoがお好き☆
263デフォルトの名無しさん:2005/08/06(土) 16:42:51
しまった名前消し忘れた
264デフォルトの名無しさん:2005/08/06(土) 19:23:21
>>260
コンパイルも分からんとよく書いてるな・・・
265デフォルトの名無しさん:2005/08/06(土) 19:40:18
>>264
脊髄レスはいかがなものかと
266デフォルトの名無しさん:2005/08/06(土) 20:53:26
class Vector {
private:
  union {
    __m128 v;
    struct {
      float x;
      float y;
      float z;
      float w;
    };
  };

public:
・・・
};


error C2146: 構文エラー : ';' が、識別子 'v' の前に必要です。
error C2501: 'Vector::__unnamed::__m128' : 識別名を宣言するのに、型が指定されていません。
error C2501: 'Vector::__unnamed::v' : 識別名を宣言するのに、型が指定されていません。

__m128 v;をfloat v[4];にするとなぜか通るんです。
どうしてでしょうか?
267デフォルトの名無しさん:2005/08/06(土) 20:58:56
>>266 コンパイラのバージョンは?
268デフォルトの名無しさん:2005/08/06(土) 20:59:17
エラーメッセージすら読めない池沼には
何を言っても分かるまい
269デフォルトの名無しさん:2005/08/06(土) 21:00:34
>>267
ごめんなさい。忘れてました。
VC2003です。
270デフォルトの名無しさん:2005/08/06(土) 21:05:49
271デフォルトの名無しさん:2005/08/06(土) 21:13:10
__m128の定義をおしえてくれー
答えようがない
272デフォルトの名無しさん:2005/08/06(土) 21:15:18
ググったら速攻で出てきたというのに、まさに>>268だな
273デフォルトの名無しさん:2005/08/06(土) 21:22:33
>>268>>270
読んでますよ。
要は、コンパイラは__m128が定義されていないと思ってるってことですよね。
でもVC2003において__m128は基本データ型と同様に使用可能なはずですよね。
ためしにクラス定義の直前に適当な構造体を定義して__m128 v;と置き換えても
ちゃんと通りました。

>>271
__m128はSSEで使用する128bitのデータ型です。
274デフォルトの名無しさん:2005/08/06(土) 21:30:15
275デフォルトの名無しさん:2005/08/06(土) 21:31:10
>>273
#include <xmmintrin.h>
276デフォルトの名無しさん:2005/08/06(土) 21:34:18
ところでfloat x にはどうやってアクセスするんだ?
277276:2005/08/06(土) 21:42:06
あ、いけるんだ。しらんかった。
278デフォルトの名無しさん:2005/08/06(土) 21:45:34
>>277
どうやら無名共有体と同じように普通に外からアクセスできるようです。
279デフォルトの名無しさん:2005/08/06(土) 22:38:34
ヘッダでの定義を書いて欲しいよー
と思っているうちに自分で探してきた
// data_types__m128.cpp
typedef struct __declspec(intrin_type) __declspec(align(16)) __m128 {
float m128_f32[4];
} __m128;
よくわからんがきちんと定義ファイルをインクルードしてるか?

あとさあ、struct {}のタグ名ってかかないのか?
280デフォルトの名無しさん:2005/08/06(土) 22:48:46
>>279
Cでは不要。C++では必要になる場合もある
親切な人(=できる人[俺定義])はタグ名を書く
281デフォルトの名無しさん:2005/08/06(土) 22:57:35
ぶっちゃけ自分で見てて気持ち悪いから書いてる
282デフォルトの名無しさん:2005/08/06(土) 22:58:50
>279
>あとさあ、struct {}のタグ名ってかかないのか?
え? 書いてあるじゃん。
283デフォルトの名無しさん:2005/08/06(土) 23:48:37
タグ名に怪しい名前( _tag〜 とか)を使う悪習をひきずってるやつも多いが、やめて欲しいな。
284デフォルトの名無しさん:2005/08/06(土) 23:59:56
>>283
それがゲイツクォリティ
285デフォルトの名無しさん:2005/08/07(日) 00:50:52
cでの質問ですが

たとえばヘッダファイルで
struct foo{
char name[64];
int data;
} baa;

struct foo{}を定義しているヘッダファイルをインクルードしておいて

struct foo baa;
size_t tmp;
tmp = sizeof(baa.name);

上と同じような事を関数にstruct foo型の構造体を引数として渡さずに、
関数内でもstruct foo型の構造体を宣言せずにbaa.nameのサイズを取得する方法はありませんか?
286デフォルトの名無しさん:2005/08/07(日) 00:56:43
まったく使わないのは無理だな。
単にメモリを無駄に使いたくないというなら、

struct foo *p_foo;
size\t size = sizeof(foo->name);

でいけるんじゃねーかな。ポインタ分のメモリは必要だが。
287デフォルトの名無しさん:2005/08/07(日) 00:56:54
>>285
関数ってどんな関数だよ。

想像で


要するに
文字列に対して何らかの処理を行う関数を作りたい。
サイズを得る必要があるらしいから、書き込みの操作。



えっとね、素直に関数の引数にchar配列のサイズを渡してやりなさい。
呼び出し側でsizeof使ってやればよし。
288デフォルトの名無しさん:2005/08/07(日) 00:59:51
#define N 64
struct foo{
char name[N];
で我慢
289デフォルトの名無しさん:2005/08/07(日) 01:00:28
一応これでサイズ取れるけど。

int size = sizeof(((struct foo*)0)->name);

処理系によってはアクセス違反で落ちるか?
VC7は平気だった。
290デフォルトの名無しさん:2005/08/07(日) 01:01:32
ヘッダ非依存のコード書きたいって言ってるんだから構造体に依存しない汎用の文字列操作関数を作りたいんだろ。
そのへん意味茄子。
291デフォルトの名無しさん:2005/08/07(日) 01:02:00
つか普通は
void func( void ) {
struct foo a;
printf( "%d\n", sizeof(a.name) );
}
としてもaはpushされないよ。
気に入らないと言われたらそれまでだが。
292デフォルトの名無しさん:2005/08/07(日) 01:02:55
>>289
GNUのソースで何回か見たな
293デフォルトの名無しさん:2005/08/07(日) 01:02:58
構造体に依存しないのではなく、構造体の実体を使わずにとも読める。
294デフォルトの名無しさん:2005/08/07(日) 01:03:55
>>289
通常sizeofでサイズ取るだけなら実際にヌルポインタに対して読み書きの操作は発生しないから平気だわな。
295デフォルトの名無しさん:2005/08/07(日) 01:05:47
>>285
compound literalが使えるなら使えばいいし、そうでない場合、
static struct f func(void); /* 架空の関数 */
printf("%d\n", sizeof func().name);
処理系によってはリンクエラーになるかも。
296デフォルトの名無しさん:2005/08/07(日) 02:11:35
difftime関数は秒単位までしか計算しませんが、ミリ秒単位までの精度を出したい場合どうすればよいのでしょうか?
出来るだけ、OS依存にはしたくないのですが。
297デフォルトの名無しさん:2005/08/07(日) 02:13:41
clock

まあ、できるならOS依存とか難いこといわずにマクロで切り分けてQueryPerformanceCounterつかっとき。
298デフォルトの名無しさん:2005/08/07(日) 11:30:02
486ユーザーですg(ry
299デフォルトの名無しさん:2005/08/07(日) 13:37:53
>>285の件だが、
今までずっと>>289の方法しかないかと思っていた
(コンストラクタつきclassだと、>>291が使いにくい/使えない)が
どうやら>>295の変形で

extern struct foo bar;
printf("%d", sizeof(bar.name));
だと大丈夫っぽい。

VC,bcc,gccだと定数をpushしてるし、リンクエラーもでなかった。
300デフォルトの名無しさん:2005/08/07(日) 14:06:29
今までLinuxのgccでしかプログラムをコンパイルしたことがなかったのですが、
急遽VisulStudioを使わなければいけなくなってしまいました。

そこで今一番悩んでいることがどうやって引数を渡せばよいのかということです。
試しに以下のプログラムを「開始」というのを選んで実行しているのですが、
もちろん引数を渡していないのでnullが返ってきます。

include <stdio.h>

int main(int argc, char* argv[])
{
printf("%s\n",argv[1]);
return 0;
}

なんかアフォみたいな質問ですがマジでどうすればよいのか分かりません。
よろしくお願いします。
301デフォルトの名無しさん:2005/08/07(日) 14:09:39
>>300
IDEのことなら「実行時引数の指定」とかそんなのがメニューにないか?BCBはあるけど
302デフォルトの名無しさん:2005/08/07(日) 14:18:10
>>300
2003ならメニューバーのプロジェクトか、ソリューションエクスプローラからプロジェクトののプロパティを開いて、
構成プロパティのデバッグのところにある動作グループのコマンド引数から設定できる。
303デフォルトの名無しさん:2005/08/07(日) 14:26:16
MSのコマンドラインから普通に使えるでしょうに
カレントディレクトリまで移動しておけばいいじゃない
304デフォルトの名無しさん:2005/08/07(日) 14:34:45
>>301-303
お蔭様でなんとか引数を渡す事ができるようになりました。
実行時に渡すのではなくて、事前に決めておくということですね。
勉強になりました。
305デフォルトの名無しさん:2005/08/07(日) 14:36:08
ってかみんな凄すぎだな。
俺はさっぱりわからん。
独学で情報系でもないから
情報処理試験でも前期はのりこえても後期試験があと少しでおちちゃう。
306デフォルトの名無しさん:2005/08/07(日) 14:56:36
ポインタ使うことの利点教えてくださいな
普通に変数使うのとどう違うんですか?
307デフォルトの名無しさん:2005/08/07(日) 15:00:48
コマンドラインプログラムの出力を直接プログラムに取り込む方法はありませんか?
308デフォルトの名無しさん:2005/08/07(日) 15:06:57
>>306
必要となるまで知らなくてもかまわない

>>307
やりたい事を詳しく
309デフォルトの名無しさん:2005/08/07(日) 15:37:33
>>307
Windowsなら↓あたり
ms-help://MS.PSDK.1033/dllproc/base/creating_a_child_process_with_redirected_input_and_output.htm
310デフォルトの名無しさん:2005/08/07(日) 16:00:41
>>306
関数にサイズの大きい構造体とか渡す時にポインタわたしの方が
サイズを小さく出来るので高速。例えばサイズが20バイト(sizeof(A)=20)の構造帯を
わたそうとしてもポインタなら整数と同じサイズで澄んでしまう。
但し、最適化を考えると、ポインタの多用は良くない。
コードを書く時の効率とか考えて適材適所で対応すべし。
311デフォルトの名無しさん:2005/08/07(日) 16:02:27
>>310
「最適化を考えると」って何のこと?
312デフォルトの名無しさん:2005/08/07(日) 16:12:35
>>307
popen
313デフォルトの名無しさん:2005/08/07(日) 16:53:16
popenのサンプルか何かはありませんか?
314デフォルトの名無しさん:2005/08/07(日) 17:01:30
315デフォルトの名無しさん:2005/08/07(日) 17:03:06
>>313
FILE * fp = popen("ls", "r");
char buf[200];
while (fgets(buf, sizeof(buf), fp)) {
fputs(buf, stdout);
}
fclose(fp);
316デフォルトの名無しさん:2005/08/07(日) 17:08:21
>>315
便乗ですまんけどそれってWin32 GUIアプリでも利用可?
CreatePipe使ったいいサンプル探してるが見つからないorz
317デフォルトの名無しさん:2005/08/07(日) 17:14:51
>>316 >>309
Win32の処理系だとpopenはないと思う
318デフォルトの名無しさん:2005/08/07(日) 17:18:10
_popen()かもしれず。
319デフォルトの名無しさん:2005/08/07(日) 17:21:56
_popenで見つかった(´ω`)
320デフォルトの名無しさん:2005/08/07(日) 22:42:29
規制のため代理レスしてもらっています。
VC++.net2002でのtemplateについての質問です。
以下のようなクラスを書いて使おうとしたらリンカエラーがでます。
template使うのは初めてなので参考書を見てもどこが違うのか全くわかりません。
そもそもこの環境でtemplateが使えるのかすらわからない状態です。
どこをどう直せばよいのでしょうか?
#pragma once
template <typename T>
class Hoge{
public:
Hoge(void);
virtual ~Hoge(void);
void Test(void);
};
#include "StdAfx.h"
#include "hoge.h"
template <typename T>
Hoge<T>::Hoge(void){}
template <typename T>
Hoge<T>::~Hoge(void){}
template <typename T>
void Hoge<T>::Test(void){}

_tWinMainの最初に以下のように書いたらリンクエラーがでます。
Hoge<int> hoge;
hoge.Test(0);

Test error LNK2019: 未解決の外部シンボル "public: __thiscall Hoge<int>::Hoge<int>(void)" (??0?$Hoge@H@@QAE@XZ) が関数 _WinMain@16 で参照されました。
Test error LNK2019: 未解決の外部シンボル "public: virtual __thiscall Hoge<int>::~Hoge<int>(void)" (??1?$Hoge@H@@UAE@XZ) が関数 _WinMain@16 で参照されました。
Test error LNK2019: 未解決の外部シンボル "public: void __thiscall Hoge<int>::Test(void)" (?Test@?$Hoge@H@@QAEXXZ) が関数 _WinMain@16 で参照されました。
Test fatal error LNK1120: 外部参照 3 が未解決です。
321デフォルトの名無しさん:2005/08/07(日) 22:49:12
Hogeのメンバ関数等は全てヘッダに記述しる
322デフォルトの名無しさん:2005/08/07(日) 22:58:52
>>321
ありがとうございます
おかげさまでできました
調査不足てした
323デフォルトの名無しさん:2005/08/07(日) 23:31:11
>>320
お前のコンパイラはexport templateをサポートしているのかと小一時間
324デフォルトの名無しさん:2005/08/08(月) 00:01:29
識別子が既にtypedefされたか調べる方法はありませんか。
#ifndef A_LABELみたいな。
325デフォルトの名無しさん:2005/08/08(月) 00:09:40
C/C++ 標準内では無理なんじゃないかな。
1. 該当 typedef を行うヘッダでマクロを定義しておいて #ifdef
2. 1. でヘッダのインクルードガード用マクロで代用
3. Autoconf とか使って外部で判定してマクロ定義で切り替え
思いつくのはこんなもんだけど。
326デフォルトの名無しさん:2005/08/08(月) 00:09:58
わざとその識別子で新しくtypedefしてみたら?
すでにtypedefされてればエラーを出すと思うけど

typedef int foo;
typedef char foo;

とかってしてみればいいと思うよ、多分だけど
結果教えてね
327デフォルトの名無しさん:2005/08/08(月) 00:14:32
次の選挙で落選させなければならない議員のリスト1

自民党 河野洋平 神奈川17区 - 売国奴。中国の飼い犬。日朝友好議連所属。
自民党 野田毅 比例九州 ----- 売国奴。中国の飼い犬。外国人参政権推進。日朝友好議連所属。
自民党 加藤紘一 山形3区 ---- 売国奴。中国の飼い犬。
自民党 古賀誠 福岡7区 ------ 野中の子分。人権擁護法案推進。
自民党 野田聖子 岐阜1区 ---- 古賀の子分。人権擁護法案推進。
自民党 二階俊博 和歌山3区 -- 売国奴。中国の飼い犬。人権擁護法案推進。江沢民の石碑建立。
328デフォルトの名無しさん:2005/08/08(月) 06:52:00
はいはいわろすわろす( ^ω^)
329デフォルトの名無しさん:2005/08/08(月) 07:35:34
32ビットマシンではintは常に32ビットですか?
330デフォルトの名無しさん:2005/08/08(月) 07:39:58
lsic86試食版は、32bit環境でもintは16bitです。
331デフォルトの名無しさん:2005/08/08(月) 09:41:45
再帰呼び出しする関数を実行したいのですけど、とても時間がかかる事が分かっています。
そこで、日にちを分けて実行しょうと思いましたが、スタックを復元する方法が分かりません。
知っている方がいれば教えてくさださい。環境は Linux/gcc です。
332デフォルトの名無しさん:2005/08/08(月) 09:54:37
>>331
一般的に、OSが動的に管理するものを一アプリケーションに云々はできません。
どうしても24時間運転できない、サスペンドできない、などの理由があるなら、
計算過程を保存するようなアルゴリズムに変更すべきかと。
333デフォルトの名無しさん:2005/08/08(月) 10:11:27
> 一般的に、OSが動的に管理するものを一アプリケーションに云々はできません。
もちろん環境依存は承知です。絶対に無理というならアルゴリズム変更も考えますが
とりあえず待ってみます。
334デフォルトの名無しさん:2005/08/08(月) 10:11:49
クイックソート スタック
位で検索すれば自前のスタックの作り方が載ってるでしょう。
がんがれ
335デフォルトの名無しさん:2005/08/08(月) 10:17:18
一番簡単なのは
再起関数に与える引数を全部構造体でまとめておいて
ファイルなりにfwrite(), fread()で書き込み、読み出しする方法じゃないかな
336デフォルトの名無しさん:2005/08/08(月) 15:38:07
コアダンプさせてデバッガで再開とか。つまりがんばればできるんじゃないの?
337デフォルトの名無しさん:2005/08/08(月) 18:33:52
>>331,333
>> 一般的に、OSが動的に管理するものを一アプリケーションに云々はできません。
>もちろん環境依存は承知です。絶対に無理というならアルゴリズム変更も考えますが
つうか、332は別に「環境依存どうこう」という以前の話をしているはず。
だいたい「スタックを復元する方法」がわかっただけで解決できるつもりなのか?
いわゆる core imageを取るのことや解析は簡単だが、
そこから実行を再開させるような能力を自分が持ってるつもりなのか?
「絶対に無理」とは言わないが、洗練された方法があるわけでなし、まず、
こういう質問の仕方程度の人には、まず無理だと思うが。
まあ、条件のつけかたやら何やら思いつきの域を出ない、
問題の立て方自体を間違えている。
338デフォルトの名無しさん:2005/08/08(月) 19:16:32
TCP/IPを使った通信の勉強してるんですが、
acceptで10038のエラーコードが返ってきます。

参考にしているのは
ttp://www.geekpage.jp/programming/winsock/
なんですが、ここの通りにやっても10038が返ってきてしまいます。

クライアントではサーバーからのメッセージを受信できているので、
ソケットがうまく作れているものだと思っていたのですが、
10038がエラールックアップで
「ソケット以外のものに対して操作を実行しようとしました。 」
と出るので、わけがわかりません。

どうしてこうなってしまうのかどなたか教えてください。
よろしくお願いします。
339デフォルトの名無しさん:2005/08/08(月) 20:29:32
>特定郵便局長の”平均”年収は約900万円 + 賃貸料430万円(自宅が郵便局だから) =1330万円


東大卒→ソニーの平均年収790万円
大卒サラリーマンの平均年収560万円
全サラリーマンの平均年収430万円

コピペしろ!

特定郵便局長の平均年収は920万円
http://money4.2ch.net/test/read.cgi/nenga/1094801504/

●●【世襲制】特定郵便局●●
http://money4.2ch.net/test/read.cgi/nenga/1080883369/
340デフォルトの名無しさん:2005/08/08(月) 20:56:59
>>338
それはもうだめかもしれんね。
341デフォルトの名無しさん:2005/08/08(月) 21:13:21
>>340
どういう意味ですか?
342デフォルトの名無しさん:2005/08/08(月) 21:21:03
ネットワークプログラミングを専門に扱っているスレッドを探して、そこで聞いた方がいいんじゃない?

あと、そもそも>>338が提示している情報が少なすぎる。
もっと具体的に、どうやってどうやった場合に10038が返ってくるのか書いて。
もしくはその部分のソースを提示するとよい。
343デフォルトの名無しさん:2005/08/08(月) 21:28:16
>>342
具体的に・・・と言っても、
サイトのソースをそのままコピペして実行してるだけなんですが、
10038が返ってきます。

ソースは
>TCPを使う(サーバ、エラー処理付き)
ttp://www.geekpage.jp/programming/winsock/tcp-3.php
そのままです。

「ネットワークプログラミング相談室 Port14」
の方で続きを聞いてみたいと思います。
344デフォルトの名無しさん:2005/08/09(火) 01:34:14
>>331
スワップを十分にとって(Linuxだとスワップファイルが便利)
kill -STOP hoge
すると中断できる
使用頻度が低ければスワップアウトされる

再開は
kill -CONT hoge
345デフォルトの名無しさん:2005/08/09(火) 11:24:21
ctrl+Zとfgで。(w
346デフォルトの名無しさん:2005/08/10(水) 08:35:36
struct hoge
{
int x ;
int y ;
int z ;
}

という構造体をvectorにいれてソートしたいのですが、

vector<hoge> v ;

//いずれかのメンバで、降順か昇順かで、ソートしたい
sort(v.begin(), v,end(), ・・・) ;

メンバの数だけ関数オブジェクトを作るのがあまりにもあほらしいと思うのです。
もっとスマートな方法はありませんか?
347デフォルトの名無しさん:2005/08/10(水) 08:54:18
>>346
メンバへのポインタを関数オブジェクトに渡したらどう?
348346:2005/08/10(水) 08:58:32
>>347
どういうことですか?
349デフォルトの名無しさん:2005/08/10(水) 09:11:59
>>348
class foo
{
    int hoge::*mem;
public:
    foo(int hoge::*mp) : mem(mp) {}
    bool operator ()(const hoge& x, const hoge& y)
    {
        return x.*mem < y.*mem;
    }
};

sort(v.begin(), v.end(), foo(&hoge::y));
350346:2005/08/10(水) 09:32:44
>>349
おお、すごい。
こんなことができたんですか。

でも、ひとつ分からないのですが、

//hoge構造体の中のint型へのポインタ
int hoge::*mem ;

ですよね?

.* これはどういう意味でしょうか?
351デフォルトの名無しさん:2005/08/10(水) 09:44:39
>>350
メンバへのポインタでアクセスするための1つの演算子。
352346:2005/08/10(水) 11:03:39
>>351
なるほど、->*なんて演算子もあるんですか。
降順か昇順かの切り替えも、コンストラクタの引数で指定できました。
C++を覚えるために、いろんなことを試しているのですが、なんだかC++は、とても複雑すぎるような……。

struct hoge
{
int x; int y; int z;
double d ;
char str[32] ;
} ;

何度もすみませんが、>>346の構造体をこのように拡張して、これを各メンバでソートするために、
>>349のfooクラスをテンプレート化してみたのですが、
hoge::strはどうすればいいのでしょうか。
ちょっと考えてみて、こんな風に特殊化してみたのですが
//>>349のfooクラスのテンプレート化
template<typename T>
class foo
{
//比較演算子を使った比較
} ;
//特殊化
template<>
class foo<char (hoge:: *)[32]>
{
//自分で定義した文字配列の比較をする、たとえばstrcmp()とか
} ;
sort(v.begin(), v.end(), foo<char (hoge:: *)[32]>(&hoge::x)

もっとスマートな方法はありますか?
353346:2005/08/10(水) 11:04:41
×sort(v.begin(), v.end(), foo<char (hoge:: *)[32]>(&hoge::x)
○sort(v.begin(), v.end(), foo<char (hoge:: *)[32]>(&hoge::str) ;
354デフォルトの名無しさん:2005/08/10(水) 11:18:34
>>352 std::string str;
355デフォルトの名無しさん:2005/08/10(水) 11:23:49
>>352
コンパイルできるかどうか試していないけどこんなのは?
template <typename T>
foo<T> create_foo(T mem_ptr)
{
    return foo<T>(mem_ptr);
}
こうしたらsort()を呼ぶときに型を意識する必要がなくなる。
sort(v.begin(), v.end(), create_foo(&hoge::x));
356355:2005/08/10(水) 11:25:22
std::make_pairに合わせてcreate_fooからmake_fooにしたほうがいいな。
357346:2005/08/10(水) 11:51:07
>>355
VC7.1でコンパイル通りました。
これは使うときに楽ですね。

templateがらみのこういうテクニックはどうやって覚えればいいのでしょうか?
何かいい本とかありますか?
358デフォルトの名無しさん:2005/08/10(水) 13:09:33
>>357
つ[C++ Templates(英文)]
359デフォルトの名無しさん:2005/08/10(水) 14:51:29
応用してみた。
template<class T, typename V>struct hoge_equal : public std::binary_function<T, V, bool>
{
V hoge::*mem;
hoge_equal(V hoge::*mp) : mem(mp) {}
bool operator()(const T & x, const V & y) const {return x.*mem == y;}
};
template<class T, typename V>inline hoge_equal<T, V> make_hoge_equal(V hoge::*mem)
{
return hoge_equal<T, V>(mem);
}
//hogeにはhoge(int,int,int);とprint(const hoge&)const;を追加済み
bar.push_back(hoge(1, 2, 3));
bar.push_back(hoge(2, 3, 1));
bar.push_back(hoge(3, 1, 2));
hoge::print(*std::find_if(baz.begin(), baz.end(),
std::bind2nd(make_hoge_equal<hoge>(& hoge::z), 3)));
360359:2005/08/10(水) 15:08:32
汎用にする過程の激しく半端なの載せちった。
template<class T, typename V>struct equal_to : public std::binary_function<T, V, bool>
{
V T::*mem;
equal_to(V T::*mp) : mem(mp) {}
bool operator()(const T & x, const V & y) const {return x.*mem == y;}
};
template<class T, typename V>inline equal_to<T, V> make_equal(V T::*mem) {return equal_to<T, V>(mem);}
って、make_equalもequal_to専用である必要ないなぁ……
361デフォルトの名無しさん:2005/08/10(水) 16:23:17
>>346
素直にboost使えば?
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

using namespace boost::lambda;
std::sort(v.begin(), v.end(), bind(&hoge::x, _1) < bind(&hoge::x, _2));
362346:2005/08/10(水) 16:53:12
>>361
boostも面白そうですね。
いままでtemplateをほとんど理解していなかったから、
boostも理解できなかったんです。

でもこれ……本当にC++のコードなのか疑問に思えてしまいますけど。

 >bind(&hoge::x, _1) < bind(&hoge::x, _2)
363デフォルトの名無しさん:2005/08/10(水) 17:18:37
文法上は正しい。
演算子が再定義されてはいるが。

boost::assignのサンプルも最初見たときなんじゃこりゃと思った

#include <boost/assign/std/vector.hpp>
#include <vector>
using namespace boost::assign;
using std::vector;

vector<int> v;
v += 1, 2, 3, 4, 5, 6, 7, 8, 9;
364デフォルトの名無しさん:2005/08/12(金) 14:43:05
mallocがメモリを取ってくる「ヒープ」領域と
ヒープソートの「ヒープ」ってなんか関係あるんですか?
365デフォルトの名無しさん:2005/08/12(金) 14:49:47
>>364
同じ単語だけど、とくに関係はない。
前者は、「メモリのかたまり」という感じ。
後者は、「データが山の形になっている」という感じ。
366デフォルトの名無しさん:2005/08/12(金) 18:38:17
>>365
ありがとうございます。

追加で聞きたいんですが、mallocがヒープからメモリを取ってくる過程ってどうなってるんですか?
メモリがフラグメント化していた場合、どうやって大きな領域を確保するのかとか...
もちろんシステムによって違うんでしょうが、一般的な場合が知りたいんです。
このネット上のドキュメントとかあの本を参照しろ、でもいいのでお願いします。
367デフォルトの名無しさん:2005/08/12(金) 19:30:21
>>366
OSの設計に関する本を読め。
368デフォルトの名無しさん:2005/08/12(金) 19:36:48
>>364
ヒープってのは辞書引くと積み重ねたものとかそういう意味が出る。
369デフォルトの名無しさん:2005/08/12(金) 21:05:40
>>366
単純な構造で実現しようとするなら、デフラグは出来ない。
なぜなら、デフラグを行うと使用中のメモリ内容が移動してしまい、それに合わせて
プログラム内のすべてのポインタ変数を新しい正しい値に書き換えなければならない。
当然これは無理。せいぜい隣り合った空きエリアをくっつけるだけしかできない。

いまどきのOSは仮想メモリシステムを採用している。OSだけじゃなくチップレベルで
サポートしていたりする。ということは我々がプログラムで使っているポインタ(アドレス)
は仮想のものであり、物理的なメモリ番地とは直結しておらず、対応表を使って対応付
けられているだけ。ということは、物理メモリ上のデータを移動したとしても、それを追随
するように仮想アドレスと物理アドレスの対応表を書き換えるれば、あたかもデータの
移動は発生していないかのように見える。仮想メモリシステムの上でならメモリのデフラ
グも可能になる。

具体的には仮想メモリシステムの実装を調べてくれ。簡単な話じゃないよ。
370デフォルトの名無しさん:2005/08/12(金) 21:29:49
>>369
オナニーレス乙
371デフォルトの名無しさん:2005/08/12(金) 22:33:40
仮想記憶を有効に使うために
ライブラリ内でのヒープをページ単位でしか取得できないようにするスレはここですか?
372デフォルトの名無しさん:2005/08/12(金) 22:45:13
>>369
物理メモリをデフラグできても、仮想アドレスに連続した空きがないと確保できないという罠。
373デフォルトの名無しさん:2005/08/12(金) 23:02:48
>>366
Windowsに限って言うと、
VC++のmalloc()はHeapAllocを使っている。
本は、Advanced Windowsに詳しい。
Windowsプログラマなら絶対読んでおいた方がいい。

ネット上のドキュメントというと

Inside Memory Management part 1
ttp://www.windowsitpro.com/Article/ArticleID/3686/3686.html
part 2
ttp://www.windowsitpro.com/Article/ArticleID/3774/3774.html

今まで読んだ中では、これが一番分かりやすいかな。
374デフォルトの名無しさん:2005/08/12(金) 23:05:23
英語じゃん
分かりにくいってレベルじゃない
分からないレベルだ
375デフォルトの名無しさん:2005/08/12(金) 23:59:24
むー、今PSDKのmallocのソースみたら、本当にHeadAllocをただ呼び出してるだけなんだね。
HeadAllocは大きなメモリブロックの確保に使ってるだけかと思ってた。
ちなみにBCBでは独自管理してる(大きさ別に処理を分けている)。
メモリ確保のアルゴリズムにも
ファーストフィットとかベストフィットとかがあるので
どうやっているかは、まさしく実装依存。

で、実際にはmallocのソースを読むのが早い。
サンプル程度なら、
・K&R
・Cプログラマのためのアルゴリズムとデータ構造
・EffectiveC++(moreかも)
で読んだ覚えがある。

ちなみに、OS(カーネル)がどう管理しているかとかページ単位がどうというのは
CRTが管理しているヒープのフラグメントとはあまり関係ない話だから。
376デフォルトの名無しさん:2005/08/13(土) 00:03:38
1度なら打ち間違えと見逃すが2度もHeadAllocと打つのは何か意図してのものなのか、とつついてみるテスト
377デフォルトの名無しさん:2005/08/13(土) 00:08:33
なぜこんなタコな間違いをしたのか、俺にもわからん。
頭の中ではHeapAllocのつもりだったのだが。
378デフォルトの名無しさん:2005/08/13(土) 00:10:53
HipAlloc
379デフォルトの名無しさん:2005/08/13(土) 02:24:10
HeadLock
380デフォルトの名無しさん:2005/08/13(土) 09:32:24
Rock54
さくらが咲いてますよ
381366:2005/08/13(土) 10:44:35
基本的にはフラグメント化しても、単に十分な空きを探すんですね。
で、仮想メモリはコンパクションしたりしてそれを助ける、という感じですか。
382デフォルトの名無しさん:2005/08/13(土) 11:52:09
どの処理系を言っているのか知らんが、
x86のWindowsだと仮想メモリのコンパクションはできないと思うんだが……。

フラグメント化というか、仮想メモリさえ連続していればいいわけで。
383デフォルトの名無しさん:2005/08/13(土) 11:59:54
ページングを使っているから、そもそもデフラグメントも糞もないと思うんだが。
384366:2005/08/13(土) 14:25:39
仮想メモリを使っているOSなら、mallocしたときにファーストフィットとかベストフィット
といった空き場所探索はしない。
仮想メモリを使って対応付けているなら、物理メモリがフラグメント化していても問題ない。
大きな領域を確保する時でも、物理メモリ上で連続しているとは限らない。

これであってますか?
>>373のリンクは難しすぎます...これは、ここでの話を理解するのに必須なんですか?
385デフォルトの名無しさん:2005/08/13(土) 14:51:33
>>384
そう。あと物理メモリが確保されるのは、実際に使われるとき。

ヒープだけど、Windowsでメモリの確保は常にページ単位(x86なら4KB)で行われる。
でも、実際のプログラミングの際には、4KB単位でしか確保できないなんて面倒でしょ?
1バイトのメモリを確保しようとすると、もれなく4095バイトものおまけメモリがついてくる。
もちろん、そのまま使うこともできるけど、かなり無駄。
しかし、現実には、数十バイト、数百バイト単位で、なるべく無駄なくメモリを確保したい。

じゃあどうすればいいかというと、
メモリを確保するときは4KB単位で確保しておいて、
実際に使うときに、欲しいサイズ分だけ小分けにして使えばいい。

で、VC++のmallocが呼び出しているHeapAllocはこれを自動でやってくれる。
某ランドのCコンパイラは自前で実装しているんだったかな。
386385:2005/08/13(土) 15:25:44
 >mallocしたときにファーストフィットとかベストフィットといった空き場所探索はしない。
見落としてた。
VC++のmallocは、「多分」している。
ページ単位で確保したバッファの中から、要求された長さのあいている空間を返すわけだから。


実際にはMSはヒープの実装を公開していないから、これは明言できない。
メモリの使用用途はどんどん変化していくから、OSごとに違った実装になる。
95の時代だと、一般的なPCの物理メモリは数十MBだったけど、
いまだとGB単位も珍しくないからね。


387デフォルトの名無しさん:2005/08/13(土) 21:21:47
いま言ってるのって
alloc数回の結果ページが10単位取られたけど
freeの結果各ページ1バイトしか使ってないような状態になっちゃって
そこに新しいalloc(ページ9単位)の要求がきた時どうすんねんって話じゃないのけ?
388デフォルトの名無しさん:2005/08/13(土) 21:47:17
うん、フラグメントの結果、(今現在管理しているメモリでは)充分な連続した空き領域が確保できない場合のことだよね。
なんか勘違いして仮想記憶とかその辺の話にしようとしている人がいるけど
その方面の話はちょっと方向違い。
この、「フラグメントが起きた状態」からは、アルゴリズムも糞もない。
単に確保できないだけだから。

で、連続して確保できない場合は、結局、OSから新たにメモリブロックをもらって
そこから切り出すしかないわけ。
もちろん、OSがくれなかったら、NULLを返すなりbad_allocを投げるなりするんだけど。

ベストフィットやファーストフィットというのは、「いかにしてフラグメントを起きにくくするか」を、速度との兼ね合いでどうするかという、ポリシーの問題ね。
たとえばWindowsXPのHeapAllocは、このポリシーをユーザーから設定できるらしい。
http://www.geocities.jp/i96815/windows/win11.html
389デフォルトの名無しさん:2005/08/14(日) 07:49:56
sftpを扱いたいのですが、何か良いライブラリはありませんか?
390デフォルトの名無しさん:2005/08/14(日) 08:13:08
>>389
その前にネットワークプログラミングがちゃんと理解できる?
関数1-2個でポンという訳にはいかないよ
391デフォルトの名無しさん:2005/08/14(日) 09:49:42
C++Builderで組んでいるので、Indyの様な物があれば一番良いのですが
392366:2005/08/14(日) 10:22:29
>>385-388
物理アドレスは解放後再利用する必要がありますが、仮想アドレスは解放しても再利用の必要はありませんよね。
それはHeapAlloc、HeapFreeの場合でも同じに思えたのですが。
だから>>366では「仮想メモリ上でフラグメントが起きても、わざわざ仮想アドレス上で隙間を探す必要はなく、
まだ手を付けていない仮想メモリ空間を使用すれば良いだけだ」と考えたんですが、それでは駄目なんでしょうか?
「メモリアドレスの型の制限で1プロセス仮想で4GBまでしか使えない」ってところがネックになっているんでしょうか。
393デフォルトの名無しさん:2005/08/14(日) 10:23:53
訂正
× >>366では
○ >>384では

すいません
394デフォルトの名無しさん:2005/08/14(日) 10:33:20
えーと、もしかして
HeapAllocの呼び出しの度に、カーネルモードに移行して
ページテーブルを設定して、CR4を読み直してTLBをフラッシュして・・・
ということが行われていると思っていますか?

HeapAllocはもちろん、普通のmallocも、
実際に自身が管理しているメモリで足りないという事態が起きない限り
OSに対してメモリブロックは要求しないし、だからカーネルモードへの移行も起きないし、当然ページテーブルも仮想記憶も何の関係もないのですよ。

OSからのメモリの獲得は重い処理なので、それを軽くするためにユーザー空間で
malloc等がメモリブロックを管理しているんですよ。
この辺はわざわざOSの本を読むまでもなく、K&R等にも書いてありますが。
395デフォルトの名無しさん:2005/08/14(日) 11:52:46
>>391
無い、RFCとにらめっこするしかない
素直にソケット使いなさい
396デフォルトの名無しさん:2005/08/14(日) 12:05:28
クラスAの中からクラスBのメンバ関数をよびだしたい。
また、クラスBの中から、クラスAのメンバ関数を呼び出したい。

こういうときはどうすればいいんでしょうか。


class A
{
  B *b_ptr ;
} ;

class B
{
  A *a_ptr ;
} ;

これは無理ですよね。
どうすればいいんだろう。
397デフォルトの名無しさん:2005/08/14(日) 12:09:56
いや、出来るでしょ。
398デフォルトの名無しさん:2005/08/14(日) 12:12:25
先行宣言
399デフォルトの名無しさん:2005/08/14(日) 12:35:24
>>396
これでいい。

class B;

class A
{
  B *b_ptr ;
} ;

class B
{
  A *a_ptr ;
} ;
400デフォルトの名無しさん:2005/08/14(日) 12:36:05
この質問は未来永劫続くのかね。
401396:2005/08/14(日) 12:58:01
>>397-399
それだけのことだったとはOrz
402331:2005/08/14(日) 15:11:02
ここに解決方法がありました。
http://www.checkpointing.org/

導入が簡単なのはここです。
http://www.cs.wisc.edu/~zandy/ckpt
403デフォルトの名無しさん:2005/08/16(火) 16:23:15
お願いします。linuxです。
typedef struct{
short a;
short b;
}test_str

int main()
{
test_str g;
int k;

g.a = 0x1234;
g.b = 0x5678;

memcpy(&k,(int*)&g,sizeof(int));

printf("=>%x\n",k)
}

実行
=>56781234

本来は12345678を期待しています。
構造体のメンバの順番が入れ替わってしまうのはどういう現象なんでしょうか?
ググルにも現象名がわかりません。
教えてください。
404デフォルトの名無しさん:2005/08/16(火) 16:27:17
ディレクトリがすでに存在するかどうかを調べるにはどのようにしたらよいのでしょうか?
405デフォルトの名無しさん:2005/08/16(火) 16:28:04
>>403
リトルエンディアン
406デフォルトの名無しさん:2005/08/16(火) 16:29:49
>>404
環境は?
407デフォルトの名無しさん:2005/08/16(火) 17:21:44
>>405
ありがとうございます。

 リトルエンディアンはデータ通信時だけ発生するものと思い込んでいました。
408デフォルトの名無しさん:2005/08/16(火) 18:04:25
ハァ?
リトルエンディアンって・・・
409デフォルトの名無しさん:2005/08/16(火) 18:05:45
?
410デフォルトの名無しさん:2005/08/16(火) 18:05:51
>>407
現在のPCなら普通リトルエンディアンだぞ
411デフォルトの名無しさん:2005/08/16(火) 18:22:10
リトルエンディアンって上位バイトと下位バイトの格納方式でしょ?
typedef struct{
short b;
short a;
}test_str;
で>403の望む結果にならない?
412デフォルトの名無しさん:2005/08/16(火) 18:23:30
ダウンロードしたソースに
int TextInfo(char *file, int flag, const char *format,...)
って関数があったんですがchar* formatの次の.....ってなんですか?
はじめて見るんですが、引数になるんですかこれ?
413デフォルトの名無しさん:2005/08/16(火) 18:26:15
>>412
可変長引数。
printfの関数宣言見てみ。
414デフォルトの名無しさん:2005/08/16(火) 18:27:45
printf("=>%x\n",htonl(k));
結果
=>34127856
リトルエンディアン様様だね
415デフォルトの名無しさん:2005/08/16(火) 18:28:34
>413
レスありがとうございます
さっそく調べてみます
416デフォルトの名無しさん:2005/08/16(火) 18:30:10
>>411
だから?
417デフォルトの名無しさん:2005/08/16(火) 18:35:04
>411
それで?
418デフォルトの名無しさん:2005/08/16(火) 18:35:34
>>415
ついでに
va_start、va_arg、va_endも調べておくと吉
419デフォルトの名無しさん:2005/08/16(火) 18:35:46
>>411
ソースちゃんと見ろよ?
420デフォルトの名無しさん:2005/08/16(火) 18:38:16
>>411
あわてんぼさん♪
421403:2005/08/16(火) 18:50:18
混乱しています。
test_str g:のデータはメモリ上
78563412の順で配置されているんですよね。

それが何故
56781234になるのですか?
422デフォルトの名無しさん:2005/08/16(火) 18:54:15
>>421
違うね。
メモリ上は 0x34 0x12 0x78 0x56 だ。
だから下から順に 0x56781234 となる。
423デフォルトの名無しさん:2005/08/16(火) 18:54:38
>78563412の順で配置されているんですよね。
ノン。56781234。
424423:2005/08/16(火) 18:55:57
間違えた。>>422がタダスィ
425403:2005/08/16(火) 19:03:29
>>422さん、423さん
メモリ上は 0x34 0x12 0x78 0x56なんですね。
TPつくって確認しました。

もしもint a=0x12345678をメモリに格納する場合は
0x78,0x56,0x34,0x12となるんですね。
426デフォルトの名無しさん:2005/08/16(火) 19:06:28
typedef struct{
uint16_t a;
uint16_t b;
} test_str = {0x1234, 0x5678};



uint32_t test32 = 0x12345678;

ではメモリ上のデータ並びが違うぞ。
エンディアンは組み込み型にのみ適用される。

構造体のメンバがひっくり返ることはない。
427デフォルトの名無しさん:2005/08/16(火) 19:10:26
>>425
いえす

>>426
誰に言ってんだ?
428403:2005/08/16(火) 19:22:14
>427さん

なんとなく理解できたので、復習して完璧にします。
ありがとうございました。
429デフォルトの名無しさん:2005/08/16(火) 19:36:14
>>428,403
今更だが、もともと安易に人に聞くより、自分でdebuggerや次程度の
サンプルでちゃんと確認できるし確実なだけの話のはずだ。あほらし。

void dump2(void *v, int sz)
{
unsigned char *x = v;
printf("#%0x:\t", x);
while (--sz >= 0) printf(" %02x", *(x++));
printf("\n");
}
inta = 0x12345678;
intb = 0x78563412;
main()
{
printf("= 0x%0x\n", a);
dump2(&a, sizeof(a));
printf("= 0x%0x\n", b);
dump2(&b, sizeof(b));
}
430403:2005/08/16(火) 19:58:38
>>429さん

口は悪いが、すごい親切です。かこいいです。

ありがとうございます。
431デフォルトの名無しさん:2005/08/16(火) 20:31:56
検索キーワードは「バイトオーダー」な。
432デフォルトの名無しさん:2005/08/16(火) 21:43:47
構造体へのアクセス演算は実行時の負担になりますか?

インスタンスが1つなら、
the_cat.age = 4;
the_cat.sex = MALE;
とせずに、
int the_cat_age, the_cat_sex;
と宣言してから
the_cat_age = 4
the_cat_sex = MALE;
とした方が速いのでしょうか?
433デフォルトの名無しさん:2005/08/16(火) 21:45:43
バイナリファイル内に
「1234567890」
のような数字が入っていて、これを特定のテキストファイル上に
「123,4567,890」
のようにCSV処理して出力するコマンドを作りたいです。

コマンドの引数として、定数名のようなものを指定することで
別のファイルの定数一覧からカンマを挟む箇所の文字数(上の例だと「3,4,3」)を受け取って
処理するようにしたいと思っていますが、どう作っていけばいいのか分かりません。

どんな感じで作る物なのか、ヒントかもしくは
参考にしやすいサンプルソースを見れるサイトがあったら教えていただきたいです。
434デフォルトの名無しさん:2005/08/16(火) 21:55:54
>>433
あっちこっちに書き散らす前に、自分がみんなのレスの何を判っていないのかきちんと整理しよう。
あんたの言うバイナリファイルがどういったものなのか、だれも理解できていないのだが
それはあんたがバイナリファイルとはどういうものなのか判っていないからだとは思わんのかね。
435デフォルトの名無しさん:2005/08/16(火) 21:57:57
>>432
気にするな。

どうしても気になるならアセンブリ出力を見よ。
436デフォルトの名無しさん:2005/08/16(火) 22:29:08
>>434
その通りです。
バイナリというのは、「コンピュータが扱うためのデータ」だと思っていました。
上の質問だと、「数字を表すコードが入っている」
というわけではないんでしょうか?


C言語なら俺に聞け!スレから
「初心者向けのスレに行った方が良い」ということでこちらに来ました。
向こうのスレの話では「バイナリダンプ」と言うらしいですが、
どういう物の事なのか、よく分かりません。
437デフォルトの名無しさん:2005/08/16(火) 22:29:28
>>433
次のソースをコンパイルして出来た実行ファイルに、君の言う「バイナリファイル」
とやらを指定して実行して出力を見せてくれ。
#include <stdio.h>
int main(int argc, char *argv[]) {
    int c;
    FILE* fp = fopen(argv[1], "rb");
    while ((c = fgetc(fp)) != EOF) printf("%02X", c & 0xFF);
    return 0;
}
438デフォルトの名無しさん:2005/08/16(火) 22:38:45
>>436
誘導されたら黙って移動するのではなく、ちゃんと挨拶しとけと。
あっちにもレスがついてるぞ。
439デフォルトの名無しさん:2005/08/16(火) 22:52:00
>>437
すみません、元になるファイルは会社にあって、
今実行することが出来ません。
元になるファイルにどういうコードが入っているのかを確認できるプログラムなのでしょうか?


>>438
むこうの>400で挨拶はしたつもりだったのですが・・・
440デフォルトの名無しさん:2005/08/16(火) 22:53:48
若干名、質問者がテキスト形式で数字の文字列が入っているファイルを
バイナリファイルだと勘違いしている、筈だと、思い込みたい人がいるみたい
なので余計話が混乱している。
つうか、曲解されるかどうかはともかく、
>バイナリファイル内に
>「1234567890」
>のような数字が入っていて、
なんて書き方ではあなたの理解程度が怪しいとしか思えなくて、
設問の意味が曖昧にしか伝わらないのよ。コミュニケーション不能。
>どう作っていけばいいのか分かりません。
だいいち、こんないいかげんな質問だと、まともにプログラム経験あるのか不安。
441437:2005/08/16(火) 22:56:24
>>439
そう。手元にないならどうしようもない。会社が始まるまで待ちな。
442デフォルトの名無しさん:2005/08/16(火) 22:56:40
>>435
アセンブリで見てみました。といってもよくわからないのですが。
構造体にアクセスするとポインタ演算が余計に入っちゃうみたいです。
正確な計測法がわからない(unixコマンドのtimeで計測)上、
一度キャッシュに載ると馬鹿速くなるのでますますよくわからないのですが、
構造体を使うとかなり遅くなってるみたいです。
この辺、正確なところがわかる方がいたら教えてほしいです。

構造体のグローバルなインスタンスを使って状態管理したいと思っているんですが、
その際かなりアクセスが頻繁になるのでオーバーヘッドがあると思うと不安です。
443デフォルトの名無しさん:2005/08/16(火) 23:23:47
>>442
アセンブリを見て「よくわかからない」とか言う奴にその辺りを教えるのは無理(或いは無駄)。
444デフォルトの名無しさん:2005/08/16(火) 23:23:57
前後の処理によってかわるからなんともいえない。
ただ処理が重くなるような文脈なら、多分最適化がかかるし、
重くもない処理なら気にするだけ無駄な差にしかならないだろう。
445デフォルトの名無しさん:2005/08/16(火) 23:24:24
×わかからない ○わからない
446デフォルトの名無しさん:2005/08/16(火) 23:29:19
>>443
一般的に言ってオーバーヘッドがあるのか、ないのかということが知りたいんです。
できればじっくり学習したいので、アセンブリがわかったとしてどういうことなのか
示していただければ幸いなのですが(わからなければそれを頼りに自分で調べます)、
説明が無理なのならせめて結果だけでも教えて欲しいです。
447デフォルトの名無しさん:2005/08/16(火) 23:32:33
>>446
一般的には、最適化を考慮すると周りの状況に大きく左右されるので、
オーバーヘッドがあるのか、ないのかという答えにはならない。
448デフォルトの名無しさん:2005/08/16(火) 23:36:39
>>432のコードなら、よーいドンで実行すると構造体アクセスのほうは
メンバ変数のオフセット計算があるので変数単体より遅くなる
そんなに速度が気になってグローバル変数でもよいなら
変数単体にすればいいだけの話
449デフォルトの名無しさん:2005/08/16(火) 23:36:43
>>446
実際にオーバーヘッドが問題になってるの?
「あると思うと」っていう、のがすごく気になるんだけど。

アクセスが頻繁になる部分だけ、ポインタで置き換えるなりなんなりしてみれば?
毎度インデックス計算するアホコードよりはいいが、最適化されれば同じことだ。
450デフォルトの名無しさん:2005/08/16(火) 23:42:06
>>446
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/867.txt

ほらよ。単純な例を作ったから、よく見ておけ。 (Cygwin gcc 3.4.4)

違いは、リターン値をレジスタに設定している部分。
foo_a : movl _a2, %eax
foo_b : movl _x+4, %eax

この違いがどれだけの差になるか知りたければIntelのマニュアル見てクロック数調べてくれ。
1クロック差があるかないかの違いだろうがな。
451450:2005/08/16(火) 23:45:06
>単純な例を書いたから見てくれ。
>処理が複雑になれば、ほんとにゴミにすらならない差だ。

ってかいたつもりが抜けてたので、付け足しておきます。
452デフォルトの名無しさん:2005/08/16(火) 23:47:15
>>451
ワロタ
453デフォルトの名無しさん:2005/08/16(火) 23:54:11
ま、Pentiumはアドレッシングは強力だから、
先のは1クロックの差も無いわけだが。
454デフォルトの名無しさん:2005/08/17(水) 00:01:26
>>450
ありがとうございます。

これ、まったく差はないんじゃないんですか?
インストラクション数は同じだし、
_x+4というのは変数?の名前であって実行時に4バイト増やしてるわけじゃないですよね?

でも結局、関数に渡す際にスタックに積んだら毎回ポインタ演算するんじゃないかと心配です。
ちょっと、色々吐かせて調べてみます。>>450みたいな吐かせ方がわからないんですが、
どうやるんですか?単に-Sだともっとごちゃごちゃしてるんですが...
455デフォルトの名無しさん:2005/08/17(水) 00:28:38
じゃあ、構造体使うのやめろ。
456デフォルトの名無しさん:2005/08/17(水) 00:33:07
関数渡しのスタック積むから云々なんて関係ないだろ。
データ取るときはいつも
movl _x+4 だ
457デフォルトの名無しさん:2005/08/17(水) 00:35:49
そんなにコードジェネレータのお仕事が気に入らないならアセンブラで組めば良いことさ
458デフォルトの名無しさん:2005/08/17(水) 00:36:45
てか、構造体はグローバルっていってなかったっけ? 最初。
459デフォルトの名無しさん:2005/08/17(水) 03:15:43
>>453
基礎教養無いくせにやたら耳年増的な心配しても、まったく無駄だ。
せめてきちんと筋道だった勉強と理解ができるようにならなきゃ。
gcc -S ...と >>450 の x.sを対応付けられないんじゃ救いようが無いかな…
とりあえず、あなたの理解レベルでは、構造体に限らず、
オーバーヘッド云々以前にきちんと読めるプログラムを書くので手一杯のはず。
速度チューニングは、きちんと差を計測できたり、 *.sを解釈できるだけの
能力が無ければ、考えても無駄。
460デフォルトの名無しさん:2005/08/17(水) 03:47:13
まさか最適化していない落ち?
461デフォルトの名無しさん:2005/08/17(水) 09:27:25
俺も最初の頃はこういう微々たる速度UPにこだわってたけど
今になって読み返してみると可読性・保守性最悪だし
アルゴリズム見直した方がずっと速かったりでいいこと何も無かった。
462デフォルトの名無しさん:2005/08/17(水) 11:22:19
templateの特殊化って、クラスのあるメンバ関数だけに使うことはできますか?

template<typename T>
class hoge
{
public :
void foo(T t) ;
void bar(T t) ;
//......

} ;

//ここでhoge::fooだけを特殊化したい、あとのメンバ関数はテンプレートに任せたい。
463デフォルトの名無しさん:2005/08/17(水) 11:57:44
>>462
template<typename T>
class hoge
{
public :
void foo(int i) {}
void foo(T t) ;
void bar(T t) ;
//......

} ;

とかでいいんじゃない?
464デフォルトの名無しさん:2005/08/17(水) 12:14:40
>>462
template<>
void Hoge<int>::foo(int i) { /* ... */ }

465デフォルトの名無しさん:2005/08/17(水) 12:52:54
>>463
それはTがint以外のときに、intからTへの暗黙の変換が使えなくなって
場合によっては、バグの温床になるのではあるまいか
466462:2005/08/17(水) 14:02:41
>>464
どうも。
たぶんできると思っていたんですが、
どう書けばいいのか分からなかったので。
467デフォルトの名無しさん:2005/08/17(水) 15:12:18
connect確立後サーバのポート番号をサーバに送信したいんですけど、
sendでよろしいんでしょうか?
いまいち分からないので知恵を貸していただきませんでしょうか。
468デフォルトの名無しさん:2005/08/17(水) 15:20:26
なんか変な勘違いしてる気がする
あと、こっちのほうが適スレ、こっちへどうぞ

ネットワークプログラミング相談室 Port14
ttp://pc8.2ch.net/test/read.cgi/tech/1118469143/
469デフォルトの名無しさん:2005/08/17(水) 15:30:19
失敬だけど、ひと大杉ってやつではいれません。
470デフォルトの名無しさん:2005/08/17(水) 15:35:05
以下のようなプログラムで構造体配列を動的に取得したいのですが、mallocでエラーになるようです。これはsizeofでサイズが取得できていないからでしょうか?
struct infile{
char filename[129];
int filesize;
char filetime[20];}
struct infile *f1;
f1 = malloc(sizeof(struct infile) * 3 );
471デフォルトの名無しさん:2005/08/17(水) 15:40:21
まさかとは思うが……

struct infile{
char filename[129];
int filesize;
char filetime[20];};//<-ここにセミコロン
struct infile *f1;
f1 = malloc(sizeof(struct infile) * 3 );


なわけないよな。
単なるコピペミスだよなw

C++なら、void *を適切な型にキャストしないといけないが、
f1 = reinterpret_cast<infile *> ( malloc(sizeof(infile) * 3) ) ;
わざわざstruct つけているからそれもないよなぁ……。

なんだろw
472デフォルトの名無しさん:2005/08/17(水) 15:48:20
473デフォルトの名無しさん:2005/08/17(水) 16:05:50
struct infile{
char filename[129];
int filesize;
char filetime[20];
};//>471の呪い

f1 = (struct infile *)malloc(sizeof(struct infile)*3);

こんな風に変更してもエラーが出てきたら
エラー内容をコピペしてみろ
474デフォルトの名無しさん:2005/08/17(水) 16:29:34
参照を返す関数があるのですが、エラーが起こったときはヌルポインタのようなものを返したいのですが、
return 0; とやってもコンパイルが通りません。
参照を返す関数ではエラーは発生しないように作るしかないのでしょうか?
475デフォルトの名無しさん:2005/08/17(水) 16:31:54
>>474
つ[例外]
476デフォルトの名無しさん:2005/08/17(水) 16:33:12
>>472
ベリューションのことまで知らんわボケ
477デフォルトの名無しさん:2005/08/17(水) 16:33:34
>>474
例外を投げるとか、引き数で結果を返すようにするとか。
異常を示す値を代入しておくとか。
478デフォルトの名無しさん:2005/08/17(水) 16:33:58
>>474
エラー情報と受け渡したい参照を持つヘルパークラスを返す。
479デフォルトの名無しさん:2005/08/17(水) 16:35:58
>>476
?
480デフォルトの名無しさん:2005/08/17(水) 16:55:13
return NULL;
とか
return (関数の戻り値のポインタの型に合わせて)0;
とか
481デフォルトの名無しさん:2005/08/17(水) 17:00:05

return static_cast<FooType *>( 0 );
482デフォルトの名無しさん:2005/08/17(水) 17:17:08
よく嫁
483デフォルトの名無しさん:2005/08/17(水) 17:20:04
そもそもポインタの型変換はreinterpret_castだしな・・・ウツダシノウ
484デフォルトの名無しさん:2005/08/17(水) 17:29:25
>>483
え?
485デフォルトの名無しさん:2005/08/17(水) 17:33:09
すまん、staticでいいのか。今確認
486デフォルトの名無しさん:2005/08/17(水) 20:16:36
>>485
戻り値型がFooType*なら return 0; だけでいい。
static_castはいらない。
487デフォルトの名無しさん:2005/08/17(水) 20:49:49
むしろ return null; だろ
488デフォルトの名無しさん:2005/08/17(水) 21:24:35
(゚Д゚)ポカーン
489デフォルトの名無しさん:2005/08/17(水) 21:30:12
>>487
何nullって。JavaかC#と勘違いしてんじゃねーの?
490デフォルトの名無しさん:2005/08/17(水) 23:03:32
>>474
つ[ boost.optional ]
491デフォルトの名無しさん:2005/08/17(水) 23:41:35
>>474
エラーがあるなら例外を使えばいいじゃない
492デフォルトの名無しさん:2005/08/17(水) 23:44:35
>>491
何で今ごろ既出の回答をするんだ?
493デフォルトの名無しさん:2005/08/18(木) 00:20:48
>>492
ぼんやり
494デフォルトの名無しさん:2005/08/18(木) 08:35:58
>>487
return NULL;
495デフォルトの名無しさん:2005/08/18(木) 08:39:19
参照を返す関数だと言うに……
496デフォルトの名無しさん:2005/08/18(木) 09:39:34
>>494
コンパイルが通るか確かめてから書けヴォケ
497デフォルトの名無しさん:2005/08/18(木) 09:45:34
while (!done)

これってどういう処理が行われるんでしょうか?
498デフォルトの名無しさん:2005/08/18(木) 10:05:10
499デフォルトの名無しさん:2005/08/18(木) 10:19:50
>>497
doneという変数の値が0の間、継続する文を実行する。
500デフォルトの名無しさん:2005/08/18(木) 10:20:20
>>497
マジレスすると
これは while 構文といって、カッコ内に書かれた式(この場合は、!done)が
0 と等しくなるまで、この直後に書かれたステートメントを、繰り返し処理する
詳しくは、まともな本読め
501デフォルトの名無しさん:2005/08/18(木) 11:30:15
while (!done)

while (0 == done)
502デフォルトの名無しさん:2005/08/18(木) 11:47:55
while (´・ω・`)
503デフォルトの名無しさん:2005/08/18(木) 11:51:54
std::vector<丶`∀´> nida;
504デフォルトの名無しさん:2005/08/18(木) 12:14:11
>>502-503
環境を書け
505デフォルトの名無しさん:2005/08/18(木) 12:27:00
2バイト文字が識別子として許容されるC++コンパイラとか……
506デフォルトの名無しさん:2005/08/18(木) 13:40:39
ネタニマジレススンスンスーン
507デフォルトの名無しさん:2005/08/18(木) 14:26:16
>>495
FooType*の何が参照なんだ?
508デフォルトの名無しさん:2005/08/18(木) 14:38:24
>>507
もともとの質問はこれ。>>474
もとの質問をろくに読まないか、読んでも「参照」をしらない夏厨がわいている。
509デフォルトの名無しさん:2005/08/18(木) 14:39:27
>>507
最初の質問の事を言ってるとオモワレ
脱線しすぎだな
510デフォルトの名無しさん:2005/08/18(木) 15:40:34
linuxなのですがお願いします。
#include<stdio.h>

typedef struct{
unsigned char a;
}test_st;

int main()
{
unsigned char b;
test_st *point = (test_st*)&b;

b=10;
printf("=>%d",*point);

return(0);
}
=>58890

回答として10を期待しているのですが、このプログラムを動かすたびに
58890等のおかしな値が出てしまいます。
HP_UXの場合は10が返却されていたんですが。
よろしくお願いいたします。
511デフォルトの名無しさん:2005/08/18(木) 16:12:02
理由説明すんの面倒だから
test_st *point = (test_st*)&b;
printf("=>%d",*point);
をきちんと書き直しなさい
512デフォルトの名無しさん:2005/08/18(木) 16:14:37
>>510
>printf("=>%d",*point);
だとtest_stのサイズの1byte分しかスタックに積まないが
printfは%dなので4byteスタックから拾ってる。残り3byteにはゴミが入ってる。

printf("=>%d", point->a);
とすれば4byteに拡張されて積まれるから問題ない。
513510:2005/08/18(木) 16:14:52
charサイズの構造体きったら1ワード分メモリが取られ、char以外の部分にごみが入ってしまう
からおかしな値が表示されるんですね。
第一、構造体をprintfで表示しようとしていること自体おかしいですね。
514510:2005/08/18(木) 16:16:45
>511さん,512さん

ありがとうございました。
勉強して出直してきます。
515デフォルトの名無しさん:2005/08/18(木) 18:21:00
>>508-509
なるほど、そら確かにnullもNULLもアウトだわな
516デフォルトの名無しさん:2005/08/18(木) 19:13:02
linuxのviでCソースファイルを見ていて、わからない構造体がでてきたとき
その構造体にカーソルを合わせて何らかのキーを押すとヘッダファイル
のその構造体定義にジャンプしてくれるような機能って何ですか?
->以前、使っている人がいたんですが聞きそびれました。

googleりたいのですが、検索キーワードを教えていただけませんか。
517516:2005/08/18(木) 19:22:10
>516
ctags
518デフォルトの名無しさん:2005/08/18(木) 19:30:34
自演乙
519デフォルトの名無しさん:2005/08/18(木) 21:01:37
久々に見たんだがなんか構造体についての質問多いな。
>>403の話で時間たってて悪いんだが
sizeof(g) == sizeof(k)
である保証はないっていう指摘は誰もしないのか?
誰もアラインメントに関して知らないってことはないはずなんだが。
520デフォルトの名無しさん:2005/08/18(木) 21:09:47
最初の発言からアライメントは問題になってないってわかるじゃん。
話を無理に発散させるのはやめろ
521デフォルトの名無しさん:2005/08/18(木) 21:21:08
この場合はアライメントは問題になってないけど、エンディアン以前の問題という事ですな。
522デフォルトの名無しさん:2005/08/18(木) 22:46:11
>>519
アライメントに限らず、あのコードの非現実性(非実用性?)自体をあの時点で
説明しても意味が無いのを感づいているから。
(好意的に解釈すれば環境依存の単なる実験コードと承知の可能性もあるし。
なにより時節柄、(今みたく)本筋外す厨がわいて出てきかねないのがウザイ)
523デフォルトの名無しさん:2005/08/18(木) 23:34:39
WM_CHARのWPARAMでながれてきた文字コード(TCHAR)を
wstringにinsertできるように型変換したいのですが
どうしたらよいでしょうか。
524デフォルトの名無しさん:2005/08/19(金) 00:26:07
下のようにしたらとりあえずできました。
WPARAMそのままだとinsertできなかったので質問させていただいたのですが、
なぜ一度tmpを経由すると成功するのでしょうか。
WPARAMはtmpに代入できるのだからwstringと同じではないのでしょうか。
だとしたらそのままinsertできるように思えるのですが、
できない理由を教えてください。

wstring tmp;//とりあえず空のwstringを作って
tmp=wp;//WM_CHARのWPARAMの値をそのまま代入
wstr.insert(pos,tmp);//wstring文字列に挿入
525デフォルトの名無しさん:2005/08/19(金) 00:38:29
ちょっとホントに困ってるんですけど、教えてくれませんか。。。
TCP/IPでバイナリデータを送信する前に送信データの全体サイズを
測りたいんですけど、送信の全体が6バイト+可変のサイズなんですけど、
ソースで書くとどのようになるんでしょうか?よろしくお願いします。
環境 win2000 VC++6.0
526デフォルトの名無しさん:2005/08/19(金) 00:46:29
>>525
>送信の全体が6バイト+可変のサイズなんですけど
その、「可変のサイズ」とやらは既知ではないのか?
既知でないとしたら、どうやって送信するつもりなのかね。

>>524
wstringへの代入が、castの代わりになっているんだろ。
527524:2005/08/19(金) 00:49:59
>>526
もしきちんとした方法でcastするとしたらどういう書き方をすればよいのでしょうか?
528デフォルトの名無しさん:2005/08/19(金) 01:05:22
>>527
キャストって何か知ってるよな?
529デフォルトの名無しさん:2005/08/19(金) 01:25:09
ATL と MFC の文字列変換マクロ
530デフォルトの名無しさん:2005/08/19(金) 01:28:17
>>526
6バイトのうち2バイトを読むと可変のサイズがわかるようになっています。
531524:2005/08/19(金) 01:43:31
>>528
型を変換しないといけないのはわかるのですが具体的にどうすればよいのかがわからないです。
最終的にinsertするにはwstringの文字列でないといけないのでWPARAMをその型に変換したいです。
wchar_t wtmp[]=L"";
printf((char*)wtmp,(char*)wp);
strcpy((char*)wtmp,"\0");
wstr.insert(pos,wtmp);
とかやってみてコンパイルは通りましたが動かしたら落ちました。
どうやれば意味的に正しくきれいに書けるでしょうか。
532デフォルトの名無しさん:2005/08/19(金) 01:47:44
533デフォルトの名無しさん:2005/08/19(金) 01:49:13
>>530
じゃあそれつかえばいいやん
534デフォルトの名無しさん:2005/08/19(金) 01:56:06
>>533
ソースでどう書くのでしょうか?よろしくお願いします。。。
535デフォルトの名無しさん:2005/08/19(金) 01:59:18
>>534
まずはオマエが書いて、問題があればそれを相談しろ。
536524:2005/08/19(金) 02:00:41
>>532
それでわかったら聞かないです。
537デフォルトの名無しさん:2005/08/19(金) 02:12:11
W2AとかA2Wマクロ使えばいいじゃん。ワイド文字からアスキーへ
またはその逆に変換してくれるぞ。ついでにソースを追えば
何やっているか分かる。
キャストじゃ駄目だよ。。。
538デフォルトの名無しさん:2005/08/19(金) 02:12:41
539デフォルトの名無しさん:2005/08/19(金) 02:14:55
>>535
どう書いていいのかわからないです。無理ならせめてヒントください!
540デフォルトの名無しさん:2005/08/19(金) 02:22:36
>>539
全部書き上げるまで粘着されそうで、正直出て行って欲しい感じだ。
わからないことがピンポイントじゃないので、ヒントも無理。
541524:2005/08/19(金) 02:32:50
>>538
度々すいません。ありがとうございます。これ↓使えってことでしょうか?
--------------------------------------------------------
// 文字cをpos文字目にn文字挿入
basic_string& insert(size_type pos, size_type n, charT c);
--------------------------------------------------------
だとしたら、、、
wstr.insert(pos,1,(char)wp);
と、やってみたらできました。
ところでこのcharTの「T」ってのはなんでしょうか?
あてずっぽうで(char)をつけたらうまくいってしまいましたが。。。
あと一応、>>531みたいな感じの型変換の方法も聞いておきたいのですが、
どなたか教えて頂けないでしょうか。
(WPARAMの文字コード(TCHAR)をwstringの文字列にする方法)お願いします。
542デフォルトの名無しさん:2005/08/19(金) 02:44:33
>>541
charT についてはリンク先の「テンプレート」を見ろ。
あてずっぽうでキャストすんなボケ。

wstring には wchar_t が格納できる。 TCHAR は char または wchar_t に typedef されてる。
よって TCHAR が wchar_t なら変換は要らない。
TCHAR が char ならマルチバイトシーケンスの判定やバッファリングが必要。
543524:2005/08/19(金) 05:40:34
ですからその方法を教えて欲しいのですが、なぜそんなに小出し小出しで説明するのですか?
お互いに時間の無駄じゃないですかね。これまでの分はお礼を言いますが
別に教えたくないなら無理して教えていただかなくていいですし
こっちも別にボケとか言われてまで聞きたくないんでもう結構です。
ありがとうございました。
544デフォルトの名無しさん:2005/08/19(金) 07:32:27
>>543
お前がこいつ http://pc8.2ch.net/test/read.cgi/tech/1124113879/28
同一人物だと思ってるから、様子見してたんだけど、成長してないようだな。

キーワードがわかってるのに自分で調べることのできない奴まで
面倒を見る気は無い。出て行ってもらって結構。
545526:2005/08/19(金) 08:17:55
>>539
・上げるな。
・その6バイトの仕様を提示せよ。
546デフォルトの名無しさん:2005/08/19(金) 09:53:28
質問の仕方スレッドってム板になかったか?

どっかのスレで、質問の仕方スレの使い方の質問・・・
とかわけのわからん状態になっていたのを見たことがある。
547デフォルトの名無しさん:2005/08/19(金) 10:04:35
>>539
ここは赤子に這い這いを教えるようなとこじゃ無いんだよ
548デフォルトの名無しさん:2005/08/19(金) 10:33:06
>>545
  要求/返信コード    2バイト(unsigned short)
  結果コード       2バイト(unsigned short)返信値のみ有効
  データ部サイズ     2バイト(unsigned short)
  データ部        データ部サイズにより可変

 *データ部の内容は要求/返信コートにより決定する
549デフォルトの名無しさん:2005/08/19(金) 10:42:05
>>525
つーかマルチポストすんじゃねえ
550デフォルトの名無しさん:2005/08/19(金) 10:47:45
uchar sixbytes[6];
ushort net_datasize;
ushort host_datasize;//正しい値がすでに入っていると仮定
ushort *p;

memset(sixbytes, 0, sizeof(sixbytes));

net_datasize = htons(host_datasize);
p = (ushort *)&sixbytes[4];
*p = net_datasize;

send(sock, sixbytes, sizeof(sixbytes), 0);

こんな感じでどう?

受けて側では逆の処理をして適切なhost_datasizeを取得してね。
逆の処理の仕方とかは聞かないでね。
551デフォルトの名無しさん:2005/08/19(金) 11:12:16
>>550
教えてくれてありがとうございます。
早速試したいと思います。
552デフォルトの名無しさん:2005/08/19(金) 13:19:03
uchar sixbytes[6]; //送信するポインタ?
ushort net_datasize; //結果コード?
ushort host_datasize;//正しい値がすでに入っていると仮定 //データ部サイズ?
ushort *p; //要求コード?

ってことでしょうか?
>>550
553デフォルトの名無しさん:2005/08/19(金) 13:23:51
要求/返信コード    2バイト(unsigned short)
結果コード       2バイト(unsigned short)返信値のみ有効
データ部サイズ     2バイト(unsigned short)
の6バイトを送るだけだよ。

[]で1バイト
[要求・送信コード][要求・送信コード][結果コード][結果コード][データ部サイズ][データ部サイズ]
の順でね。
554デフォルトの名無しさん:2005/08/19(金) 13:35:16
なるほど!ありがとうございます。
受信のは逆っていいますと

net_datasize = htons(host_datasize);
p = (ushort *)&sixbytes[4];
*p = net_datasize;
が逆に行うってことですか?

頭悪すぎてすみません!!
555デフォルトの名無しさん:2005/08/19(金) 13:48:30
半透明化ってどうやるのでしょう

背景色が a その上に表示する画像の 色が b

とした場合の 計算式はどうなりますか?

a+b/2 とかいう単純な計算ではむりでした
556デフォルトの名無しさん:2005/08/19(金) 13:50:34
>>555
透明・不透明度tが 0〜1 として
a*(1-t) + b*t
557デフォルトの名無しさん:2005/08/19(金) 14:04:44
>>556

ありがとうございます
でもそれだと何故か出来ないんですよね

int だから だめとかですかね
558デフォルトの名無しさん:2005/08/19(金) 14:07:23
>>557
整数型で実数を扱えるわけ無いだろ。
559デフォルトの名無しさん:2005/08/19(金) 14:10:21
>>557
透明度0.5なら(a+b)/2で、この場合は整数演算でもOK。
RGB各要素を別に計算する必要があるのは理解している?
560デフォルトの名無しさん:2005/08/19(金) 14:19:51
>>559

なるほど RGB別になんですね

白 が 0x7FFF という 形式なんですけど

まず分解しないといけないんですね
561デフォルトの名無しさん:2005/08/19(金) 14:40:21
いやおまえ、白が7FFFってどういう計算だよ・・・
562デフォルトの名無しさん:2005/08/19(金) 14:45:14
RGBが5bitずつってことだろ?
なんかYSっぽいな。
563デフォルトの名無しさん:2005/08/19(金) 14:46:48
>554
っていうかお前にはネットワークプログラム無理だよ。
諦めるのが最善の策だ。

自分でも頭悪すぎるってわかってるっぽいし。
564デフォルトの名無しさん:2005/08/19(金) 14:50:29
>>560
自分の使っているシステムの色の定義を調べるほうが先だな
565デフォルトの名無しさん:2005/08/19(金) 14:50:55
>>563
ネットワークプログラム以前にプログラム自体が駄目だと思うよ。
思考能力が小学校低学年並。
566デフォルトの名無しさん:2005/08/19(金) 15:15:13
そもそも、>>554
プログラムの処理を理解してるのか?

受信側でコードをそのままコピペしたら絶対バグ出るぞ。
567デフォルトの名無しさん:2005/08/20(土) 17:06:32
>>544
出て行ってもらって結構って、ここはお前のスレでもなんでもないんだが。
教える気がないならお前が最初から黙ってればいいだろ。
お前みたいに中途半端にレスされると質問者としても迷惑なんだよ。
質問者には過不足なく質問しろとかいうんだったら回答者も過不足なく最後まで面倒みろよ。
途中で投げ出すなら最初から教えてくれなくていい。
568デフォルトの名無しさん:2005/08/20(土) 17:17:33
ここはバカにしあって遊ぶスレではありません。
569デフォルトの名無しさん:2005/08/20(土) 18:10:31
>>567
m9(^Д^)プギャー
570デフォルトの名無しさん:2005/08/20(土) 19:47:10
571デフォルトの名無しさん:2005/08/20(土) 21:43:33
>>567
お前にとって迷惑なレスなんてひとつも無かったはずなんだけどな。
さらに、キーワードから自分で調べることさえすれば
面倒を見てくれるとも言っている(ように見える)。
投げ出された結果になったのは、お前がそれをしなかったからだとわからないのか?
572デフォルトの名無しさん:2005/08/20(土) 22:01:49
はいはい。
まともに回答できない人が偉そうに書き込むのはやめましょう。
「知識は無いけど説教はしたい」、そんなくだらない願望はチラシの裏へどうぞ。
573デフォルトの名無しさん:2005/08/20(土) 22:03:24
はいはい。
まともに検索できない人が偉そうに書き込むのはやめましょう。
「技術は無いけどプログラムはしたい」、そんなくだらない願望はチラシの裏へどうぞ。
574デフォルトの名無しさん:2005/08/20(土) 22:31:05
>質問者には過不足なく質問しろとかいうんだったら
>回答者も過不足なく最後まで面倒みろよ。

過不足なく質問できたやつには過不足なく面倒を見ている。
過不足なく面倒を見てもらえない君は、とどのつまり過不足なく質問できていないのだ。
575574:2005/08/20(土) 22:32:52
それと質問者側を擁護しているやつは
>554なのか?
答えた側としては泣きたくなるぞ。
576デフォルトの名無しさん:2005/08/20(土) 22:36:13
おまえら、何がしたいの?
577デフォルトの名無しさん:2005/08/20(土) 22:40:11
>チラシの裏へどうぞ。
このスレですネ!
578デフォルトの名無しさん:2005/08/20(土) 22:44:53
>>577
は?死ねよ
579デフォルトの名無しさん:2005/08/20(土) 22:45:15
頭にきたらスルーすればいいのに。
何年ネットやってんだか。( ´,_ゝ`)プッ
580デフォルトの名無しさん:2005/08/20(土) 23:06:30
キィーッ!
581デフォルトの名無しさん:2005/08/20(土) 23:10:40
ムキャ────( `д´)─────ッ!!
582デフォルトの名無しさん:2005/08/20(土) 23:15:26
( ^ω^)テラワロス
583デフォルトの名無しさん:2005/08/21(日) 12:10:12
>>574
> 過不足なく質問できたやつには過不足なく面倒を見ている。
こういうのは自己申告するものではなく、相手が評価するのが筋では? ;-)
「質問者が過不足なく質問できているかは回答者である俺が決める。
俺が過不足なく回答できているかどうかも俺が決める」
ですか? それが通るなら、そりゃあいつだって自分は正しく相手のみ非がありますよね :-P
584デフォルトの名無しさん:2005/08/21(日) 12:23:07
はいはいワロスワロス
585デフォルトの名無しさん:2005/08/21(日) 12:42:40
↓次の質問どうぞ
586デフォルトの名無しさん:2005/08/21(日) 13:18:00
>>583
最高にド低脳な発言してくださいスレで紹介されてたのだが、
http://pc8.2ch.net/test/read.cgi/tech/1108781476/ の
>>584 にならないようにな。もう50歩100歩だがね。
読み進めると、イタさが伝わってくるよ。

>>583晒し揚げ!!!
587デフォルトの名無しさん:2005/08/21(日) 13:54:32
>>586
意味不明です。
リンク先のスレと俺の>>583はまったく関係ありませんので :-P

>>583に対して有効なレスは、
「質問者が過不足なく質問できているかは回答者である俺が決める。
俺が過不足なく回答できているかどうかも俺が決める」
↑これがいかに正しいのか、ということをちゃんと説明しているレスだけですね。
>>583がやっているのはこのことへの突っ込みなので、それ以外はすべて話題そらし)
588デフォルトの名無しさん:2005/08/21(日) 13:57:50
589デフォルトの名無しさん:2005/08/21(日) 14:00:40
590デフォルトの名無しさん:2005/08/21(日) 14:04:04
>>583
574 をちょっと修正して
× 過不足なく面倒を見ている
○ 過不足なく面倒を見ているつもりだ
これでいいですね?
591デフォルトの名無しさん:2005/08/21(日) 14:11:44
592デフォルトの名無しさん:2005/08/21(日) 16:40:00










593デフォルトの名無しさん:2005/08/21(日) 16:40:48




















594デフォルトの名無しさん:2005/08/21(日) 16:41:33






























595デフォルトの名無しさん:2005/08/21(日) 17:14:51
急速にスレの質が低下してまいりました
596デフォルトの名無しさん:2005/08/21(日) 17:34:14
 
  
   
    
     
     
      
       
        
 
  
   
    
     
     
      
       
        
 
  
   
    
     
     
      
       
        
597デフォルトの名無しさん:2005/08/21(日) 17:35:57
 
  
   
    
     
      
       
        
         
 
  
   
    
     
      
       
        
         
 
  
   
    
     
      
       
        
         
598デフォルトの名無しさん:2005/08/21(日) 22:20:44
ちょっと釣られすぎじゃね?お茶でも飲んで落ち着こうぜ
599デフォルトの名無しさん:2005/08/22(月) 13:42:53
int gethostname(
char FAR *name,
int namelen
);
これのFARってなんですか?

600デフォルトの名無しさん:2005/08/22(月) 13:46:08
>>599
遠いポインタにつけられる修飾子を隠すためのマクロです。
過去との互換性のために残されているだけでしょうから、無視していいかと。
601デフォルトの名無しさん:2005/08/22(月) 14:11:21
htmlファイルを読み込んで、ある部分から先を削除したいんですけど
どのように考えればいいのでしょうか?
602デフォルトの名無しさん:2005/08/22(月) 14:17:17
>>599
それはおそらく8086のCPU用プログラムで使われたものです。
たしか far と near がありました。far のポインタは 32
ビットで、near は 16 ビットです。far も near も付けない
場合はコンパイル時にコンパイラに対してオプションで指定
していたと思いました。
603デフォルトの名無しさん:2005/08/22(月) 14:19:35
>>601
HTMLファイルは fopen() 使って "r" で開き、作業用ファイルを "w" で開く。
で、HTMLファイルから読んで作業用ファイルに書く。終わりの所に来たら
両方とも fclose() して、HTML ファイルを .bak 付きのファイル名に
リネームし、作業用ファイルのファイル名を元の HTML ファイルのファイル名に
変更する。
604デフォルトの名無しさん:2005/08/22(月) 14:43:26
Windowsで自分自身のアップデートプログラムをweb上から取ってきて、更新する方法を考えています。
プログラムを取ってくるところまでは出来たのですが、自分自身を削除してそれを新しい物に置き換える方法が分かりません。
自分自身が起動している場合、上書きできないのですが、このような場合どのようにすればよいのでしょうか?
605デフォルトの名無しさん:2005/08/22(月) 14:45:46
書き換えるためのプログラムを別に用意すれば良いだけじゃね?
606デフォルトの名無しさん:2005/08/22(月) 15:16:59
バイナリファイルに浮動小数2.5を保存 。値は"00 00 20 40"
で、読み込もうとすると、どうしても1075838976という値になってしまいます。
(float型に入れたので実際は指数表示だった)
0x40200000が示す整数がそれなのでそれも分かるのですが、
元の2.5という小数としてfloatに入れたい時はどうすればいいのでしょうか?
607デフォルトの名無しさん:2005/08/22(月) 15:35:27
>>606
int i = 0x40200000;
float f = *reinterpret_cast<float*>(&i);
608デフォルトの名無しさん:2005/08/22(月) 15:37:57
>>599
FARポインタについては>>600>>602で書かれてるとおり
16it環境でポインタを扱う場合に付けるもの。

typedef FAR BYTE * LPBYTE
typedef FAR char * LPSTR
って感じで使われてた(LPはLong Pointerの略)

さらに補足すると(いらないだろうが)、
モジュールをまたぐ場合のポインタ渡しや、
メモリアクセスで現在位置から64Kbyte以上離れた場所を指す場合に使う。

Win3.1や95、または98/Meのデバイスドライバ限定でしか使わない代物なので
今は無視してもOK

昔はFARポインタやセグメントやらで散々悩まされたよorz
609608:2005/08/22(月) 15:41:54
>>608
>メモリアクセスで現在位置から64Kbyte以上離れた場所を指す場合に使う
間違い。こっちはhugeポインタだった。
時代遅れのおっさんはそろそろ消えるよノシ
610デフォルトの名無しさん:2005/08/22(月) 15:53:05
>>607
うひょー、できました。
ありがとうございます。

float f = *(reinterpret_cast<float*>(&i));
はよくて
float f = reinterpret_cast<float>(i) ;
じゃダメなんだ…。つかコンパイル通らない。
奥がふかいなぁ
611デフォルトの名無しさん:2005/08/22(月) 17:30:20
_beginthread()とか_endthread()ってなんで_がついてるんですか?
612デフォルトの名無しさん:2005/08/22(月) 17:32:01
つけたかったから
613デフォルトの名無しさん:2005/08/22(月) 17:34:11
>>611
環境依存だから
614デフォルトの名無しさん:2005/08/22(月) 17:47:10
UNIXとかではbeginthread()とかが使われているからってことですか?
615デフォルトの名無しさん:2005/08/22(月) 17:51:08
標準関数や自分で作る関数と区別がつくように
環境依存とか、ベンダー独自の関数とかはアンダーバーをつけるって聞いたことがあるけど。

ごめんなさい、あとは詳しい人に任せます。
616デフォルトの名無しさん:2005/08/22(月) 19:24:27
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/871.txt
マルチメディアタイマーをクラス化したいんですけども、どのようにすれば
良いのでしょうか?
コンストラクタで初期化して、デストラクタで削除するってだけの代物なんです
けども
617デフォルトの名無しさん:2005/08/22(月) 19:47:36
じゃあそれでいいじゃん
618デフォルトの名無しさん:2005/08/22(月) 19:54:58
>>616
2箇所の
*timer_proc

__stdcall *timer_proc
に。
619デフォルトの名無しさん:2005/08/22(月) 20:19:09
単なるラッパークラスとしてだったら、
>>616でほとんど完成してるね。
個人的にはコンストラクタ、デストラクタとは別に
Start()とStop()メソッドが欲しいところ。

620デフォルトの名無しさん:2005/08/22(月) 20:19:29
>>610
reinterpret_cast<float&>(i);だとどうだろう?
621デフォルトの名無しさん:2005/08/22(月) 20:46:31
>>619
veryさん9!
ありがとうございました
622デフォルトの名無しさん:2005/08/22(月) 20:54:44
そして感謝されない>618
623偽616:2005/08/22(月) 21:13:36
>618さん
ありがとうございました。
624デフォルトの名無しさん:2005/08/22(月) 21:53:35
そしてveryさんって誰だよって本気で思った俺
625デフォルトの名無しさん:2005/08/22(月) 22:32:49
<丶`∀´>
626601:2005/08/23(火) 01:36:00
>>603
できました!ありがとうございます〜
627デフォルトの名無しさん:2005/08/23(火) 15:46:34
キャストとforを使って1から10までの値を0.1刻みで順に表示するプログラムを作れという
練習問題の解答が以下として載っていたのですが…

#include <stdio.h>

int main(void)
{
float f;

for(f=1.0; (int) f<= 9; f=f + 0.1)
printf("%f ", f);

return 0;
}

これを実行すると、
1.000000 1.100000 1.200000 1.300000 1.400000 1.500000 1.600000 1.700000
1.800000 1.900000 2.000000 2.100000 2.200000 2.300000 2.400000 2.500000
2.600000 2.700000 2.799999 2.899999 2.999999 3.099999 3.199999 3.299999
3.399999 3.499999 3.599999 3.699999 3.799999 3.899998 3.999998 4.099998
4.199998 4.299998 4.399998 4.499998 4.599998 4.699998 4.799998 4.899998
4.999998 5.099998 5.199997 5.299997 5.399997 5.499997 5.599997 5.699997
5.799997 5.899997 5.999997 6.099997 6.199996 6.299996 6.399996 6.499996
6.599996 6.699996 6.799996 6.899996 6.999996 7.099996 7.199996 7.299995
7.399995 7.499995 7.599995 7.699995 7.799995 7.899995 7.999995 8.099995
8.199995 8.299995 8.399996 8.499996 8.599997 8.699997 8.799997 8.899998
8.999998 9.099998 9.199999 9.299999 9.400000 9.500000 9.600000 9.700001
9.800001 9.900002

と、なんか途中から誤差が出てくるんですが、どうしてでしょうか?
628デフォルトの名無しさん:2005/08/23(火) 16:04:21
>>627
不動小数点数とはそういうもの。
有効桁数は有限でしかない上に、0.1は二進法では無限小数で、誤差が出やすい。
629デフォルトの名無しさん:2005/08/23(火) 16:35:19
>>628
0.1が無限になるのは固定小数だけじゃなかったっけ?
うろ覚えなので間違ってたらスマソ…
630デフォルトの名無しさん:2005/08/23(火) 16:43:50
タスクバーのツールチップを強制的にバルーンにしたいんですが
Shell_TrayWndを親にもつtooltips_class32を探して、
そのウインドウスタイルにTTS_BALLOONをSetWindowLongAしました。
(WS_BORDERも消しました。)

バルーンにはなるんですがなぜか場所がかなり上によってしまいます。
http://sakots.pekori.jp/cgi/sn/src/up32253.png
ちなみにstartbuttonerというアプリでは、新しいtooltips_class32の
インスタンスを作っているようですが、VisualStyleの適用されている
XPではスタートボタンだけしかバルーンにできないみたいです。

うまい方法を御存知の方いらっしゃいませんか?
対象OSはXPでVisualStyleが適用されています。
631デフォルトの名無しさん:2005/08/23(火) 16:44:15
>>628
不動小数って……

>>629
そう思うのなら自分で計算してみるよろし。
632デフォルトの名無しさん:2005/08/23(火) 16:45:26
>>630
向こうで回答がないからってマルチすなや。
633デフォルトの名無しさん:2005/08/23(火) 16:47:55
>>627
floatの精度は10進7桁分もない。
従って、%fで表示したら誤差が出るのは自明。
%gを使うとか小数点以下の桁数を制限して誤魔化すか、
doubleで計算するようにするか、
そもそも誤差が累積しないような対策をするべき。

つーか、その練習問題を読む限り、回答としては間違いだね。
634デフォルトの名無しさん:2005/08/23(火) 19:05:38
>>627
#include <stdio.h>
int main()
{
  int i;
  for(i = 10; i <= 100; ++i)
    printf("%2d.%d%c", i / 10, i % 10, i % 10 == 9 ? '\n':' ');
  return 0;
}

ごめん、キャスト使うとこなかった。
635デフォルトの名無しさん:2005/08/23(火) 19:19:47
横槍スマソ。キャスト使うとしたら>>634が書いてくれてる奴のprintfの引数を↓に変更
%2d.%d→%f
i/10, i%10→(double)i / 10
636デフォルトの名無しさん:2005/08/23(火) 19:50:37
>>629
小数点が固定だろうが浮動だろうが十進数の 0.1 は二進数では循環小数であることには代わりはない。
637627:2005/08/23(火) 22:10:29
なるほど、勉強になりました。皆さんどうもありがとう。
ちなみに問題の出典は独習C 第3版。
638デフォルトの名無しさん:2005/08/23(火) 23:58:02
構造体についての質問です。

struct kouzoutai{
  int a;
  char b;
}test;

ここで

const struct kouzoutai test[] = {{1,a},{2,b},{3,c}}

という定数宣言はできるのでしょうか?


あと、上記のようにtest[]を宣言しておいて
コマンドライン引数で「test」を与えた時に、構造体の値を参照するには
どうすればいいのでしょうか?

for(i=0;i<10;i++){
  sum=(argv[1])[i].a
 ・
 ・
 ・

とか書いても当然ダメですよね
639デフォルトの名無しさん:2005/08/24(水) 00:07:24
>>638
その最初のコードでtestが既に定義されているんだが、どうしたらいい?
640デフォルトの名無しさん:2005/08/24(水) 00:10:21
>>638
{1,a}って? 'a'なら分かるけど。で、当然最後はセミコロンだよね?
for文の中は「とか書く」以前に何をしたいのかも表せていないし、
そもそもCになっていない。
641デフォルトの名無しさん:2005/08/24(水) 00:32:47
exeファイルになったときには構造体名とか変数名はなくなってるよ。
642638:2005/08/24(水) 01:02:55
>>639
最初似宣言しておかなければconstを付けられるということでしょうか?

>>640
{{1,'x'},{2,'y'},{3,'z'}};
こうでした。すみません。

見直したら自分めちゃくちゃなこと書いてましたね。失礼しました。

やりたいことを挙げますと、

struct kouzoutai{
  int a;
  char b;
};

struct kouzoutai test[] ={{1,'x'},{2,'y'},{3,'z'}};

のような構造体が複数あって、
コマンドライン引数から指定した特定の構造体にfor文でループさせて

sum+=test[i].a

で数値の合計を出そうとしていました。
643638:2005/08/24(水) 01:05:07
途中で送信しちゃいました。
この

sum+=test[i].a;

のtestの部分をコマンドライン引数で指定したいわけです。
644デフォルトの名無しさん:2005/08/24(水) 01:14:41
正直、何のためにコマンドラインから指定できるようにしたいのか分からん。
645デフォルトの名無しさん:2005/08/24(水) 01:15:07
>>642
「構造体が複数」?「配列が複数」の間違いじゃないのか?
646デフォルトの名無しさん:2005/08/24(水) 01:21:55
>>642
こういうことか?

if( strcmp(argv[1], "test") == 0 )
 sum += test[i].a;
else if( strcmp(argv[1], "hoge") == 0 )
 sum += hoge[i].a;
647デフォルトの名無しさん:2005/08/24(水) 01:27:46
配列の識別名を、外部から文字定数で与えて、その配列を使うってことだろうな。
一般いは無理だ。>>642 のように、文字列と配列の対応関係をどっかにつくって置かなければな。

>>638 のやりたいことはPerlなら出来るが、Cじゃむり。
648647:2005/08/24(水) 01:28:26
×一般いは無理だ
○一般的には無理だ
649デフォルトの名無しさん:2005/08/24(水) 01:31:54
配列の配列を作って、番号(index)指定して目的の配列を使うのがC流かな。
650638:2005/08/24(水) 01:49:47
>>645
おっしゃるとおりで。

>>646,647
どこか別に判断基準を用意しないとダメってことなんですね。


たしかに、最初に思ったのは
構造体の配列を、更に配列に入れて処理・・・って物だったんですが、
入り組みすぎると後々汎用性が下がるし分かりにくいから
別の方法でやるようにと言われてしまったので、
他にどんな方法があるのか悩んでいたのです。

お勉強になりました。
ありがとうございました。
651デフォルトの名無しさん:2005/08/24(水) 01:52:27
struct kouzoutai test[10], hoge[10] ;
struct kouzoutai *target ;

/* argc check 必須 */

target= ( !strcmp(argv[1], "test") )? test :
     ( !strcmp(argv[1], "hoge") )? hoge : NULL ;

if ( target != NULL ) {
  for ( i=0; i<10; i++ )
    sum += target[i].a ;
}
652デフォルトの名無しさん:2005/08/24(水) 01:59:38
>>650
> 入り組みすぎると後々汎用性が下がるし分かりにくいから
> 別の方法でやるようにと言われてしまったので、

そいつ、信用ならないな。
653351:2005/08/24(水) 02:00:45
typedef map<string, kouzotai> kouzoutai_map_t;
でええやん。
6541/2:2005/08/24(水) 02:02:24
本質的にはif で比較するのと代わらないが。
#include <stdio.h>
#include <string.h>
/****** 目的のTABLE群 *****/
struct kouzoutai { int a; char b;};  /* 型 */
/* table */
struct kouzoutai test[] = {{1,'1'}, {2,'2'}, {3,'3'}};
struct kouzoutai foo[] = {{10,'a'}, {20,'b'}, {30,'c'}};
struct kouzoutai bar[] = {{100,'X'}, {101,'Y'}};
struct kouzoutai hoge[] = {{500,'G'}, {600,'H'}, {700,'I'}, {800,'J'}};

/***** マッピングTable ****/
/* マッピングTable レコード型 */
struct map_kouzoutai{
  const char *name;
  struct kouzoutai *table;
  int table_size;
};

/* マッピングテーブル */
#define MAP(name) { #name , name, sizeof(name)/sizeof(name[0])}
struct map_kouzoutai map_kzt[] =
{
  MAP(test),
  MAP(foo),
  MAP(bar),
};

6552/2:2005/08/24(水) 02:03:11
/* テーブル取得関数 */
struct map_kouzoutai *get_map_kzt(const char *name)
{
  int i;
  for(i = 0; i < sizeof(map_kzt)/sizeof(map_kzt[0]); ++i)
    if( strcmp(map_kzt[i].name, name) == 0 ) return &map_kzt[i];
  return NULL;
}

/* テストメイン */
int main(int argc, char **argv)
{
  struct map_kouzoutai *p_mk = get_map_kzt(argv[1]);
  if( p_mk )
  {
    int i;
    printf("table : %s\n", p_mk->name);
    for(i = 0; i < p_mk->table_size; ++i)
      printf("[%d]  %d , %c\n", i, p_mk->table[i].a, p_mk->table[i].b);
  }
  else
  {
    printf("table not found [ %s ]\n", argv[1]);
  }
  return 0;
}
656デフォルトの名無しさん:2005/08/24(水) 02:05:46
あ、hoge 登録し忘れた。
マッピングテーブルに MAP(hoge), 追加してくれ。
657デフォルトの名無しさん:2005/08/24(水) 02:18:24
あ、ちょうどマップの話になってるようなのでついでに質問させていただきます。
typedef std::map <char* , int> HOGE;
HOGE hoge;
hoge["test"] = 1;
とした場合に、
hoge[argv[1]] みたいなアクセスの仕方って出来ないんですか?
strcmp(argv[1], "test") == 0 が真でも
違う値とみなされているのか上手くデータを取得できないのですが。
658デフォルトの名無しさん:2005/08/24(水) 02:20:47
文字列を添字にするのはどうかと
659デフォルトの名無しさん:2005/08/24(水) 02:23:16
>>657
そりゃ、文字列の内容が同じでも、同じアドレスにあるとは限らん。
リテラルと変数だったら、まず一致しないだろう。

こうしたらどうよ。

typedef std::map <std::string , int> HOGE;
HOGE hoge;
hoge[std::string("test")] = 1;
660デフォルトの名無しさん:2005/08/24(水) 02:24:42
hoge[std::string(argv[1])] ;でアクセスね。
661658:2005/08/24(水) 02:27:24
CとC++まちがえた
あーはずかし
662デフォルトの名無しさん:2005/08/24(水) 02:31:36
>659-660
暗黙の変換が効くから

hoge["test"]
hoge[argv[1]]

でいいんじゃないの。
663デフォルトの名無しさん:2005/08/24(水) 02:32:45
>>659
おお、出来ました。ありがとうございます!
実は今日一日ずっとこれをどうにかできないか色々試してましたw
お陰様で気持ちよく眠れそうです。
664638:2005/08/24(水) 03:52:21
お風呂入ってました。

>>651~656
追加お返事どうもでした。

ざっと眺めただけじゃ理解しきれないので、ひとまず今日は寝て
明日じっくり解読させていただきます。
665デフォルトの名無しさん:2005/08/24(水) 09:42:27
あのーちょっと演算子のオーバーロードについて質問させてください。
オーバーロードした演算子の引数って複数取れないんでしょうか?
下のように書いてコンパイルすると、
`Point Point::operator+(int, int)' must take either zero or one argument
ってエラーが出るんです。
data2 = data1 + (1,1)の部分は実現できないんでしょうか

#include <iostream>
class Point{
private :
int x;
int y;
public :
void echo(void){
std::cout << x <<" "<< y << std::endl;
};

Point operator+ ( int a, int b ){
this ->x = a;
this ->y = b;
return *this;
};
};

main(){
Point data1,data2;

data2 = data1 + (1,1);
data2.echo();
}
666デフォルトの名無しさん:2005/08/24(水) 09:54:27
>>665
君がやりたいことは多分こういうことだと思う。
#include <iostream>
class Point
{
private:
    int x;
    int y;
public:
    Point(int x, int y) : x(x), y(y) {}
    Point() : x(0), y(0) {}
    void echo() {
        std::cout << x << " " << y << std::endl;
    };

    Point& operator +=(Point pt) {
        x += pt.x;
        y += pt.y;
        return *this;
    };

    Point operator +(Point pt) {
        return Point(*this) += pt;
    }
};

main() {
    Point data1(10, 20), data2;

    data2 = data1 + Point(1, 1);
    data2.echo(); //11 21と出力される。
}
667デフォルトの名無しさん:2005/08/24(水) 09:55:38
書き忘れたけどoperator <<()をオーバーロードすれば、std::cout << data2 << std::endl;と書けるようにもできる。
668デフォルトの名無しさん:2005/08/24(水) 10:26:33
>operator <<()をオーバーロードすれば
横から追記すると、



std::ostream& operator<<(std::ostream& ost, Point pt){

  return ost;
}
669デフォルトの名無しさん:2005/08/24(水) 10:28:25
ごめん途中で送信した

std::ostream& operator<<(std::ostream& ost, Point pt){
  (ここに標準出力等に流す処理を書く)
  return ost;
}

とかやんないとマニピュレータが動いてくれないんで注意。
670665:2005/08/24(水) 10:38:00
ご教示ありがとうございます。
演算子<<のオーバーロード、よくわかりました。
さっそく使ってみたいと思います。

ところで
>data2 = data1 + Point(1, 1);
の行なんですが、
data2 = data1 +(1, 1);
と書けるように演算子をオーバーロードできないものでしょうか?
671デフォルトの名無しさん:2005/08/24(水) 10:43:38
>>670
その下の行、コンパイラはどう解釈したらいいの?
その(1, 1)が何者かのヒントがないとコンパイラはなんともできないわけよ。
つーことで、大人しく一時オブジェクトを生成するか、2引き数の(operator+()でない)加算関数を用意するしか。
672665:2005/08/24(水) 10:52:07
なるほど。確かにおっしゃるとおりですね。
勉強になりました。
教えてくださって本当にありがとうございました。
673デフォルトの名無しさん:2005/08/24(水) 10:53:07
>>670
>>666ちゃんと理解してるか?

data2 = daat1 + Point(1, 1);

だろ
674デフォルトの名無しさん:2005/08/24(水) 11:33:07
>>673
あんたこそ日本語を理解できてませんから。
675デフォルトの名無しさん:2005/08/24(水) 11:37:15
ありゃん、最後以外読み飛ばしてたわ。
676665:2005/08/24(水) 14:36:03
なるほどよくわかりました。
演算子のオーバーロードがメンバ関数と同じものだと考えてたのがいけないみたいですね。
どうもありがとうございました。
677デフォルトの名無しさん:2005/08/24(水) 14:39:07
同じものだろ。どこを読んだんだ?
678デフォルトの名無しさん:2005/08/24(水) 14:42:07
>>677
違います
679デフォルトの名無しさん:2005/08/24(水) 14:48:25
>677
operatorなんちゃらはグローバルでも定義できるが。
680デフォルトの名無しさん:2005/08/24(水) 14:56:40
ああそういう意味か
681デフォルトの名無しさん:2005/08/24(水) 16:22:34
Linuxでのファイルのロックの方法を教えてください。
phpやperlではやり方が分かるのですが、Cの場合はどのようにすればよいのでしょうか?
682デフォルトの名無しさん:2005/08/24(水) 16:27:39
>>681
$ man flock
683デフォルトの名無しさん:2005/08/24(水) 17:34:09
>>681
fcntl() でも出来るよ。
ロックを掛けるファイルがNFSにある場合はfcntl()でないとロック掛からない
ので、fcntl()で書いておけば安心。(しかしちょっと複雑)
684デフォルトの名無しさん:2005/08/24(水) 18:09:56
寧ろその辺に多くを期待するよりファイルのパーミッションを落としてしまうとか。
685デフォルトの名無しさん:2005/08/24(水) 20:06:23
Windowsプログラミングで

#define WM_MESSAGEA (WM_APP+1)

のように定義したメッセージはどのような時に送られるのでしょうか?
これらのメッセージをどう判断して良いものなのかがよくわかりません。
686デフォルトの名無しさん:2005/08/24(水) 20:09:18
>>685
WM_APP以降はアプリケーション独自に定義されたメッセージ。
Windows側が送信することはない。 アプリケーション自身が投げるか関連プログラムが投げるかしかないかと。
687デフォルトの名無しさん:2005/08/24(水) 20:12:26
>>685
システムへコールバックメッセージとして渡すとかね。
ex. Shell_NotifyIcon
688デフォルトの名無しさん:2005/08/24(水) 20:14:28
>>686-687
なるほど、わかりました。
ありがとうございました。
689デフォルトの名無しさん:2005/08/24(水) 21:07:27
スレにあってるかどうかわからんのですが、
C/C++でHDDのディスクイメージを取るプログラムを作ってみようと思ってますが、
そんなこと可能ですか?

なんか参考になる書籍かURLあったらおしえてください。
690デフォルトの名無しさん:2005/08/24(水) 21:15:13
>>689
少なくとも標準では不可能だな。
環境依存。
691デフォルトの名無しさん:2005/08/24(水) 22:39:33
>>689
Windowsなら、NT系ではCreateFile(TEXT("\\\\.\\C:")などとして直接ディスクを開いてReadFileが使えるらしい。
9xではvmm32を開いて、DeviceIoControlでなんとかするしかない。
http://web.archive.org/web/20040216212849/tech.millto.net/~morry/vwin32/adio/
http://homepage2.nifty.com/DSS/WinSys/Win95/SectorHDFD.htm

そういうことするソースもあるが、何せお前のやろうとしていることそのもののソフトだから教えないでおく。

>>690
ここは環境依存OKスレだ。
692デフォルトの名無しさん:2005/08/24(水) 22:44:04
>>691
環境依存だから環境を示せってこと。
693デフォルトの名無しさん:2005/08/24(水) 23:06:38
>>691
環境依存OKならばこそ、環境も示さずに環境依存の何を教えろと?
694デフォルトの名無しさん:2005/08/24(水) 23:09:42
どうせ689のような質問をする奴はWindowsに違いないと思った。
695デフォルトの名無しさん:2005/08/24(水) 23:33:54
意外とBeOSかもよ。
696689:2005/08/24(水) 23:50:18
皆さんありがとうです。
お察しのとおりWindows(NT系、9x系どちらも)なんですが、
MBRやブートセクタの領域もイメージとして取得できたらと思っています。
(Linuxのddのクローンのようなものです)
697デフォルトの名無しさん:2005/08/25(木) 00:06:14
>>696
だからCreateFile()でデバイス指定すればdd相当のこともできるってば。
698デフォルトの名無しさん:2005/08/25(木) 09:47:05
Visual C++ .net 2003の最適化コンパイルオプションについて
教えてください
ノートパソコンのCPUに最適化したいのですが
Pentium(R) M プロセッサ 735(1.70GHz
とかいうCPUに最適化するには
プロセッサ別の最適化のところで Pentium4以上 /G7
ってすればいいんでしょうか?
699デフォルトの名無しさん:2005/08/25(木) 10:25:24
>>698
PentiumMはバスを高速化したP6系CPUだったような気が‥‥
PentiumII/IIIで最適化した方がいい希ガス。

気になるなら両方でビルドしてみて速度計ってみ。
700デフォルトの名無しさん:2005/08/25(木) 11:14:50
>>698
ttp://www.devx.com/Intel/Article/20804
Intel C++ Compilerの記事だけど、俺の和訳に間違いが無ければ
PenMはG7でいいっぽい
701デフォルトの名無しさん:2005/08/25(木) 14:16:17
MFCスレのほうにも書いたのですが反応なかったのでこっちにも書きます


同じコードなのにCPrintDialogで表示されるダイアログが2つのプロジェクトで異なるのですが、
どこの設定を変えればいいのでしょうか?
開発/実行ともに同じ環境です(VC++ 6.0 + Windows2000 SP4)

プロジェクトA = プリンタ選択(コンボボックス)/印刷範囲/部数
プロジェクトB = プリンタ選択(アイコン選択)/印刷範囲/部数/タブがいっぱい
702デフォルトの名無しさん:2005/08/25(木) 14:16:37
質問なのにsageちゃったのでageます
703デフォルトの名無しさん:2005/08/25(木) 14:56:57
statでファイルの所有者(uid)を取得したのですが、これをユーザ名に変換する関数uid2uname が使えません。以下のようなエラーがでています。
invalid initializer
UIDをユーザ名に変換するにはどうすれば酔いでしょうか。
#この関数は検索してもほとんどヒットしないのでメジャーではないのか。
704デフォルトの名無しさん:2005/08/25(木) 15:35:30
>>701
MFCのリンクが共有DLLかスタティックリンクかで変わった気がする。
705デフォルトの名無しさん:2005/08/25(木) 16:27:15
>>703
普通 getpwuid() を使うのでは?
ていうか、オマエの使っているOSはなんだ?
706デフォルトの名無しさん:2005/08/25(木) 16:36:05
>>698
PenIIIで動かす場合、Intel C++ではPenM用(/QaxB)に最適化したコードにすると
PenIII用(/QaxK)に最適化したコードよりもなぜか速い。
707701:2005/08/25(木) 16:42:34
MFCのリンクの設定を両方変更してみたけど外観変わらず orz...
EXEじゃなくてOCXだからっていうのは関係ないですよね?
708デフォルトの名無しさん:2005/08/25(木) 16:53:45
>>701
CPrintDialogのコンストラクタの引数は同じ?
あと、OnFilePrintSetup()で何かそれっぽい処理とかはしてない?
709デフォルトの名無しさん:2005/08/25(木) 17:26:27
OnFilePrintSetup()に処理はありません。
片方作った後にコピペで貼り付けたのでコードは同じのはずです。

CPrintDialog dlg(FALSE);
dlg.m_pd.Flags = PD_DISABLEPRINTTOFILE | PD_NOSELECTION | PD_RETURNDC;
dlg.DoModal():

何か決定的な間違いがあるんでしょか?
710デフォルトの名無しさん:2005/08/25(木) 17:49:14
MFCでダイアログを作ってます。
MessageBoxを使って変数と文字列を一緒に表示させたいのですが
int xとしてxだけ表示するメッセージボックスは
int x;
CString str;
str.Format("%d",str);
MessageBox(str);
で出来たのですが、たとえば「数値=x」と表示させた場合は
どのようにしたらいいのでしょうか?お知恵を貸してください。
711710:2005/08/25(木) 17:50:24
訂正します。
str.Format("%d",str); ⇒str.Format("%d",i);
でした。
712デフォルトの名無しさん:2005/08/25(木) 17:54:36
printfと同じだが?
713デフォルトの名無しさん:2005/08/25(木) 17:58:49
堀江貴文 語録

「選挙にはほとんど行ったことがありません。面倒くさいからです」
「ちょっと頭のいい人は、やっぱり政治家なんか、やりたくないでしょう。損だから。面倒くさいし。少なくとも僕は絶対やらない」
「女は金にもれなくついてくる」
「人の心は金で買えます」
「カネがあれば何でもできる」
「俺は死なない」
「サラリーマンは現代の奴隷階級」
「起業家は現代の貴族階級」
「女は25歳超えたら無価値で有害なだけの産業廃棄物」
「大衆の7割はバカで無能」
「世論には意味がない」
「世の中、金だ、愛情だって金で買える」
「年寄りは合法的に社会的に抹殺するしかない」
「人間はお金を見ると豹変します。豹変する瞬間が面白いのです」
「人間を動かすのはお金です」
「世の中にカネで買えないものなんて、あるわけないじゃないですか」
「なんでも金で買えるなんていってない」
「一度言っただけで言ったことにされちゃあたまりません」
714デフォルトの名無しさん:2005/08/25(木) 18:15:15
>>705
OSはLinuxです。passwd 構造体を作ってgetpwuid を使うことにしました。ありがとうございます。
715デフォルトの名無しさん:2005/08/25(木) 21:32:24
>>710
"%d"→"数値=%d"
716デフォルトの名無しさん:2005/08/25(木) 21:52:04
「決定版 はじめてのC++」をそろそろ読み終わりそうなのですが
次に読んだほうがいい本や、やってみたら良い事等があったら
ご教授いただけませんでしょうか、よろしくお願いします。
717デフォルトの名無しさん:2005/08/25(木) 22:10:59
読むだけなら辞めちまいな
718デフォルトの名無しさん:2005/08/25(木) 22:11:52
>>716
本ばっかり読んで良いコードが書けるなら誰も苦労してないぞ
基礎が出来たら後は実践で学べ
719デフォルトの名無しさん:2005/08/25(木) 22:53:00
>>716
何か作りたいものを見つける。後は何をするかが自ずと見えてきますよ。
720デフォルトの名無しさん:2005/08/26(金) 00:02:23
>716は何のためにプログラミングのお勉強してるんだろう
721デフォルトの名無しさん:2005/08/26(金) 00:36:02
>>716
「プログラミング言語C++第3版」を買ってくる
→読んでみる
→さっぱり分からない
→「入門書一冊読んだだけで分かったつもりになったらいかんなぁ」と反省する
→自分なりに色々なコードを書きつつ勉強を続ける
→「プログラミング言語C++第3版」をちゃんと読んで理解する
722デフォルトの名無しさん:2005/08/26(金) 00:45:24
>716
「C++ Primer」を買ってくる
→本棚の肥やし

#俺は持ってないけど
723デフォルトの名無しさん:2005/08/26(金) 00:59:50
作りたいものが見付からなければ
C++コンパイラを書くというのも一興
724デフォルトの名無しさん:2005/08/26(金) 01:33:37
>>722
まさに肥やしになってます。
ごつい割りには、きちっとした説明がほとんどされてない。
template周りだけは結構まともな内容なので、これのためにだけ8000円払った。
725デフォルトの名無しさん:2005/08/26(金) 11:33:07
>>716
実践経験を積みたいならサーバー立ててソケットを動かしてみる
726デフォルトの名無しさん:2005/08/26(金) 12:25:13
/*10個の英字を読み取り、その中からアルファベット順に並べたとき
  一番最初にくる文字を表示するプログラム*/
#include <stdio.h>

int main(void)
{
int i;
char ch1, ch2;

printf("英字を10個入力してください\n");
ch1 = getchar();

for(i = 1; i < 10; i++){
printf("%d", i); /*動作確認のため*/
ch2 = getchar();
if(ch1 > ch2){ch1 = ch2;}
}

printf("%c", ch1);

return 0;
}

ループの中で1つ文字を読み込むときにi++が2回行われているようなんですが
どうしてでしょうか?
727デフォルトの名無しさん:2005/08/26(金) 12:37:52
>>726
あんたは英字キーしか押さなかったのか?
改行キーも押しただろう?
つまり、改行キーを押したことで改行コードも入力されるんだよ。
728デフォルトの名無しさん:2005/08/26(金) 12:38:43
>>726
\nを読み飛ばせ
729デフォルトの名無しさん:2005/08/26(金) 12:39:05
>>726
誘導元で改行コードが入力されてるからって教えてもらってたでしょ?
それを踏まえて、どうすればいいですか?って内容ならともかく
同じ質問をそのまま書いちゃダメよ。
730デフォルトの名無しさん:2005/08/26(金) 12:42:35
>>726
abcdefghij[Enter]と入力すればお前の望むとおりの入力が得られる。
a[Enter]
b[Enter]
こう入力していくと[Enter]こと改行文字もgetchar()で読み込まれる。
それをお前はi++が2回実行されていると表現した。
731726:2005/08/26(金) 12:47:43
ありがとうございます!おかげで解りました。
質問の仕方は以後気をつけます。すみません
732デフォルトの名無しさん:2005/08/26(金) 12:52:17
>>726
>>728で言ってるのはこんな感じね。

printf("英字を10個入力してください\n");
ch1 = getchar();
i = 1;
while(i<10)
{
 ch2 = getchar();
 if(ch2 != '\n')
 {
  printf("%d\n", i); /*動作確認のため*/
  i++;
  if(ch1 > ch2){ch1 = ch2;}
 }
}
733デフォルトの名無しさん:2005/08/26(金) 13:01:58
>>732
なるほど。こっちのプログラムのほうが良いね
ありがとう(^ω^)
734デフォルトの名無しさん:2005/08/26(金) 13:11:26
普通にForループ内でgetchar呼んだ後に
if (ch2 == '\n') ch2 = getchar(); でもいい
735デフォルトの名無しさん:2005/08/26(金) 13:14:51
>>734
それだと2回目も改行コードの時にカウントされるんじゃない?
736誘導者:2005/08/26(金) 13:14:57
>>729
同じ質問そのままだったから誘導だけして何もヒント書かなかったと思っちゃったよw
737デフォルトの名無しさん:2005/08/26(金) 14:33:57
>>735
そのこと忘れてた・・・ それなら↓でどう?
while ((ch2 = getchar()) == '\n');
738デフォルトの名無しさん:2005/08/26(金) 16:43:51
>>737
OK
739デフォルトの名無しさん:2005/08/26(金) 16:55:36
メモリ確保すべきかどうか、についての質問ですが

class Hoge
{
     int a;
public:
     void SetData( int data );
     int   GetData();
};


vector<Hoge> g_Array;

void Piyo()
{
    Hoge tmpH;
    g_Array.push_back( tmpH );
とするのと

vetor<Hoge*> g_Array;

void Piyo()
{
     Hoge* ptmpH;
     ptmpH = new Hoge;
     g_Array.push_back( ptmpH );
とするのとは
どちらがいいんでしょうか。
740デフォルトの名無しさん:2005/08/26(金) 17:00:04
>>739
それだけの目的だと、push_back()の後にdeleteするわけだよね。
わざわざnew/deleteするまでもないと思う。

つーか、g_Array.push_back(Hoge());でいい気が。

更に余談だが、vector(vetorじゃないよな)をグローバルに置くのは如何な最中と。
741デフォルトの名無しさん:2005/08/26(金) 17:16:09
>>739
サイズは小さいから>>740氏のでいいんじゃない?
742739:2005/08/26(金) 17:22:04
レスどもです。
コードは簡潔に書いてますが
あちらこちらの関数で g_Arrayを使いまくる
といった予定です。

で、最終的には
(newした場合)
#define SAFE_DELETE { if(p) { delete (p); (p) = NULL; } }
void Clear()
{
     for( int i = 0; i < g_Array.size(); i++ )
          SAFE_DELETE( g_Array );
     g_Array.clear();
}
を呼び出しちゃったりなんかしてみたりしようかと。

目的によってnewは必要ではなかったりするのですね
参考資料でよく、newを見かけるもので。
で、<vetor> 拙僧慌てておりました。
743739:2005/08/26(金) 17:25:15
なるほど サイズですか

structやらいっぱい抱え込んだ classになると
newの必要性が出てくるのでしょうか。
744739:2005/08/26(金) 17:27:54
おおおお 間違えてる
SAFE_DELETE( g_Array[i] );

でも、合っているのだろうか。
745デフォルトの名無しさん:2005/08/26(金) 17:28:14
せめてシングルトン。
746デフォルトの名無しさん:2005/08/26(金) 17:31:25
>>743
要素に触るたびに毎回コピーされるから、大量のメンバーを抱えたclassなら
直接コンテナに放り込むのはやめた方がいい。
747デフォルトの名無しさん:2005/08/26(金) 17:52:27
>>739
思いっきり勘違いしていそうなんだが、vector<Hoge> g_Arrayに
g_Array.push_back(?)したら放り込まれるのはHogeの実体のコピーだぞ。
つまり、あんたのコードで言えば
Hoge tmpH;
g_Array.push_back(tmpH);
でも
Hoge*ptmpH;
g_Array.push_back(*ptmpH);
delete ptmpH;
でも
g_Arrayの中身をdeleteしちゃいかん。
Hogeの実体ではなくポインタを放り込みたいなら
vector<Hoge*> g_Array;
Hoge*ptmpH=new Hoge;
g_Array.push_back(ptmpH);
でいい。
#勿論、後でdeleteするとして。
748739:2005/08/26(金) 18:05:27
>>745
シングルトン? ジョン・シングルトンさんですか?
というのは冗談で、昔調べましたが意味わからんでした。
シングルトンパターンってなんぞや とw

>>746
実際に扱うclassはいろいろ数値を入れ込みますので
newしておきます。 vector 要素 コピー でググルと興味深い話が

>>747
大丈夫です 昔deleteして、苦しめられましたから。
749デフォルトの名無しさん:2005/08/26(金) 18:48:08
>>748
つ[オブジェクト指向における再利用のためのデザインパターン]
750デフォルトの名無しさん:2005/08/26(金) 18:54:07
>>748
インスタンスは常に1つであると保証されるデザインパターンのこと。

class Foo{
private:
 static Foo* foo;
 Foo(){ ... };
public:
 Foo* GetFoo()
 {
  if(!foo)
   foo = new Foo();
  return foo;
 }
 void DeleteFoo()
 {
  if(foo)
   delete foo;
  foo = NULL;
 }
void Func(){ ... }
};
Foo* Foo::foo = NULL;

こんな感じでコンストラクタをprivateにし、
別途、インスタンス取得/解放用の関数を用意する。
こうすることで、ソースのどこからでもインスタンスを参照できる
ただし、最後にインスタンスを解放するのを忘れてはならない。
751デフォルトの名無しさん:2005/08/26(金) 19:14:09
Modern C++ Designにもひとくさりsingleton周りの話が載っていたな。
752デフォルトの名無しさん:2005/08/26(金) 21:06:00
ふと思ったんだけど文字を入力するのに

char ch;として

scanf("%c", &ch);
ってやるのと

ch = getchar();
ってやるのってどうちがうの?
753デフォルトの名無しさん:2005/08/26(金) 22:03:33
scanf("%c", &ch);  は、文字以外の入力で暴走する。

ch = getchar() は、ファイル終端コードが判定できずに暴走する。

754デフォルトの名無しさん:2005/08/26(金) 22:08:42
>>753
getcharってちゃんとEOF返すようになってなかったっけ?
man見る限りじゃそう書いてあるが
755デフォルトの名無しさん:2005/08/26(金) 22:26:31
>753
「文字以外の入力」って何?
何を入力したら暴走するの?
756デフォルトの名無しさん:2005/08/26(金) 22:29:00
>>753
暴走しません。君の使い方がおかしいだけです。
757デフォルトの名無しさん:2005/08/26(金) 22:33:43
>>754

>>752はchをchar型にしてるからEOFをうまく認識しない(またはEOFでない文字をEOFと判定してしまう)
758デフォルトの名無しさん:2005/08/26(金) 22:38:06
つまり、
getche()を使えと、そういうことですね?
759739:2005/08/26(金) 22:38:34
>>749-751
デザパタですか
興味はあるのですが
なかなかに難しそうで。
760デフォルトの名無しさん:2005/08/26(金) 22:39:48
>755
まあ、フォーマットに沿わない文字列を渡すと嫌なことにはなる。

#include <stdio.h>

int main(){
int i;
do{
printf("数字を入力してください:");
scanf("%d", &i); // ここで'a'を渡すと・・・・・・
printf("[ %d ]\n", i);
} while(1);

return 0;
}

>758
getchar()はintで受けろという話。
761デフォルトの名無しさん:2005/08/26(金) 22:42:24
>760
そんなことは聞いていない。

>scanf("%c", &ch);  は、文字以外の入力で暴走する。
「文字以外の入力」って何?
何を入力したら暴走するの?
762デフォルトの名無しさん:2005/08/26(金) 22:44:20
いや、俺に言われても困る。753に聞いてくれ。

ID表示無いのって不便な・・・
763デフォルトの名無しさん:2005/08/26(金) 22:48:05
>>752
戻り値が違うので、EOFの判定の仕方が違う。
764デフォルトの名無しさん:2005/08/26(金) 23:03:39
C++の基本的な部分と思われるところで疑問点が。
classObjectのポインタから実体にアクセスする方法なんですが、
classの配列をnewで宣言した場合に、
配列の一つのObjectのメソッドにアクセスするときには
_obj[i].init();
と書かないといけなくて、
配列ではなく単体でnew宣言したObjectの場合は、
_obj->init();
と書かないといけない理由がわかりません。
上のように書けばコンパイル通って動作も問題ないんですが、
どうにも納得いきません。
どこかこのへんの事を詳しく書いてあるサイトとか無いでしょうか?

コンパイル環境:bcc32 v5.5.1
765デフォルトの名無しさん:2005/08/26(金) 23:09:03
単独オブジェクト Object x = Object();
単独オブジェクトのメンバのアクセス x.init();

単独オブジェクトへのポインタ Object x = new Object();
単独オブジェクトのメンバのアクセス x.init();

オブジェクト配列 Object x[] = { Object(), Object(), Object() };
オブジェクト配列のメンバのアクセス x[i].init();

オブジェクトポインタの配列 Object* x[] = { new Object(), new Object(), new Object() };
オブジェクトポインタの配列のメンバのアクセス x[i]->init();
766デフォルトの名無しさん:2005/08/26(金) 23:09:48
>>764
そりゃC++以前の問題。Cの構造体と配列とポインタから勉強し直してくれ。
767765:2005/08/26(金) 23:10:04
訂正
誤>単独オブジェクトへのポインタ Object x = new Object();
正>単独オブジェクトへのポインタ Object* x = new Object();
768デフォルトの名無しさん:2005/08/26(金) 23:14:01
>>764
型を意識しろ。

classObject a[10];
classOjbect* p = new classObject;

a[0] はclassObject。メンバアクセスには . を使う。
p はclassObject*でポインタなので、メンバにアクセスするには -> を使う。 p->Init()
*p とすればclassObjectになるので . が使える。ただし演算子の優先順位があるので (*p).Init() と書く。
769デフォルトの名無しさん:2005/08/26(金) 23:15:09
00,01,02,03,04,05,06,07,08,09
10,11,12,13,14,15,16,17,18,19

C言語でこのようなファイルの中身をfgetcで一文字ずつとりだし、20の一次配列に格納したいのですが
どのようにすればよいのでしょうか。
whileで一文字づつ取っていくので00だったら0と1がそろってから配列にいれカンマはj除きたいのですが
swith文で可能でしょうか?
初心者で解りづらいかもしれませんがアドバイスをお願いします。

while((c=fgetc(fp)) != EOF){

swith(c){
case ',':

case ' ':

default:

   for (i = 0; i < 20; i++){
  array[i] = d;
}
}
}

770デフォルトの名無しさん:2005/08/26(金) 23:19:45
>769
fgetcを使うのは既定事項なの?
もっと他にやりやすい方法があると思うんだが。
771764:2005/08/26(金) 23:22:37
>>765-768
ありがとうございます。

_obj* p0 = new _obj();
p0->init();
_obj* p1 = new _obj[10];
p1[2].init();
 ↑
これが通る(こうしないと通らない)のは、
_obj[i] ってやった時点で、もう実体を指してるってことですか…。

>766
痛いです。
やっぱCの基礎をちゃんと押さえておく必要がありますよね…w
772デフォルトの名無しさん:2005/08/26(金) 23:23:53
int array[20];
int i = 0;
int d = 0;
while ((c = fgetc(fp) != EOF) {
if (isdigit(c)) {
d = d * 10 + c - '0';
} else if (c == ',' || c == '\n') {
array[i++] = d;
d = 0;
}
}

fgetc より getc じゃないか?
773デフォルトの名無しさん:2005/08/26(金) 23:24:21
>>764
_obj[i] は *(_obj + i) と同じなので、_objがclassObject*型なら*(_obj + i)はclassObject型になる。
だからメンバアクセスには . を使う。
774デフォルトの名無しさん:2005/08/26(金) 23:26:31
>>769
  int array[20];
  int i = 0, n = 0, ch;
  while(i < 20 && (ch=fgetc(fp)) != EOF)
  {
    if( isdigit(ch) ) n = (n * 10) + ch - '0';
    else {array[i++] = n; n = 0;}
  }
775774:2005/08/26(金) 23:27:20
あ、ちょっとまずいけど、題意は満たすか。
776デフォルトの名無しさん:2005/08/26(金) 23:31:01
>>770 >>772 ありがとうございます。
strtokを使って分割した方がやりやすそうなんですが、今回はこれで。
getcとfgetcはほとんど同じだとあったのでfgetcにしてみたんですがだめですか。
777デフォルトの名無しさん:2005/08/26(金) 23:33:26
>>774
すいません、更新してなかったのでアンカー入れ忘れました。
試してみます、ありがとうございました。
778764:2005/08/26(金) 23:41:55
>>773
あー、なるほど。納得です。
ついでにCの構造体と配列周辺を見直してきます…w
779デフォルトの名無しさん:2005/08/26(金) 23:42:00
>776
getchar の代わりに fgetchar を使うやつってほとんどいないだろう?
getc の代わりに fgetc を使うのは、それと同じ。
780デフォルトの名無しさん:2005/08/26(金) 23:47:01
>>771
(_obj+i)->int();
とでもやってろ

そんなとこでw使うなキモイ
笑うとこじゃねぇだろ能無しが
781デフォルトの名無しさん:2005/08/26(金) 23:49:53
笑わせておけばいいじゃねぇか

ハイ次ドゾ
782デフォルトの名無しさん:2005/08/26(金) 23:51:04
>779
getsとfgetsなら後者を使うのが推奨されるのでそういう説明は良くないと思うが。
783デフォルトの名無しさん:2005/08/26(金) 23:52:32
>>779
fgetcharが使われないのは標準でないということもある。
784デフォルトの名無しさん:2005/08/26(金) 23:54:36
今となっては、fgetcだって盲腸みたいなもんだろ?
getcに関数版とマクロの両方を用意しなければならないんだし。
785デフォルトの名無しさん:2005/08/27(土) 02:49:21
素数求めたいんですけど、どこが悪いんでしょうか?
答えとにらめっこしてもさっぱりorz

int s,x,y;
scanf("%d",&s);
for(x=1;s>x;x++)
{
y=0;
for(y=1;x>y;y++)
{
if (0==x%y)
{
printf("%d\n",x);
break; /*これでfor文抜け出せますか?*/
}
}
}

return 0;
}
786デフォルトの名無しさん:2005/08/27(土) 02:53:04
>785
1で割ったあまりは0
787デフォルトの名無しさん:2005/08/27(土) 02:55:00
>786
>break; /*これでfor文抜け出せますか?*/
内側のforは抜けられるけど、外側のforは抜けられない。
788デフォルトの名無しさん:2005/08/27(土) 03:08:17
これはgotoの出番ですね!
789デフォルトの名無しさん:2005/08/27(土) 03:31:08
>>785
きったねーコード!
790デフォルトの名無しさん:2005/08/27(土) 03:54:04
適当にエラトステネスのふるい

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

int main(){
int num;
char str[10];
fgets(str, sizeof(str), stdin);
if(!sscanf(str, "%d\n", &num))
exit(EXIT_FAILURE);

/* ここから本題 */
int *array = (int *)calloc(num+1, sizeof(int));
for(int i=2; i<=num/2; i++){
/* マーク済みならスキップ */
if(array[i] == 1)
continue;
/* 倍数にマーク付け */
for(int j=2; i*j<=num; j++)
array[i*j] = 1;
}
/* 表示 */
for(int i=2; i<=num; i++){
if(array[i] == 0)
printf("%d ", i);
}
/* ここまで本題 */
free(array);
return EXIT_SUCCESS;
}
791デフォルトの名無しさん:2005/08/27(土) 07:00:03
はじめまして。

C++ではなくて、Cです。(C++とCの違いがあまりわかりませんが)
いきなり質問なのですが、コンパイルで、
「invalid operands to binary+」というエラーがでてしまうんですが、これはどのようなエラーなのでしょうか?

いくつか自分で気づいた点を修正したのですがいくらやっても直りませんでした。
できればこちらのソースを貼ってマズイところを教えていただきたいのですがよろしいですか?
792デフォルトの名無しさん:2005/08/27(土) 07:51:28
>>791
ソース貼れ。コンパイラの種類とバージョンも書け。
793デフォルトの名無しさん:2005/08/27(土) 08:12:25
>>791
"invalid operands to binary+" というそのままじゃないか。
「二項演算子 + のオペランド(項)が無効」とでも訳せばいいだけかと。
なに足し算すりゃこうなるんだと思ったら、gcc なら 10.0 + "10" とか?
794デフォルトの名無しさん:2005/08/27(土) 08:14:27
無効、より、不正、のほうが通じるか。
795デフォルトの名無しさん:2005/08/27(土) 09:00:29
>>791
だから画像処理スレと同じ聞き方したら同じ答しか帰ってこないに決まっているだろう。
問題のソースを貼れよ、この低濃。
796デフォルトの名無しさん:2005/08/27(土) 10:13:55
fedora core4 gcc4.0.1の環境で、ファイルの削除方法を教えてください
797デフォルトの名無しさん:2005/08/27(土) 10:29:08
>>796
man remove
798デフォルトの名無しさん:2005/08/27(土) 11:07:14
>>796 rm /usr/bin/*
799デフォルトの名無しさん:2005/08/27(土) 12:01:55
ソースです。
コンパイラは・・・GCC on Cygwin?かな?バージョンはちょっとわかりません。怒られて3つになってしまいました

#include<stdio.h>
#include<string.h>
#include<math.h>

#define X_SIZE 512
#define Y_SIZE 512

main(){
int i,j,m,n,p,q,rsc,rsr,dsc,dsr,mp,mq,RN,DN;
double min,dif;
unsigned char pic[X_SIZE][Y_SIZE];
char fnamein[100],fnameout[100];
FILE *fin,*fout;

RN=4; DN=2; //レンジとドメインの分割数

rsc=X_SIZE/RN; rsr=Y_SIZE/RN; dsc=X_SIZE/DN; dsr=Y_SIZE/DN;

int fr[RN][RN], fc[RN][RN]; //各レンジに対し、どのドメインを持ってくるか

800791:2005/08/27(土) 12:02:41
printf("ファイル名:");
scanf("%s",fnamein);
printf("圧縮後ファイル名:");
scanf("%s",fnameout);

if((fin = fopen(fnamein,"r"))==NULL){
printf("%sファイルを開けません\n",fnamein);
exit(0);
}
for(i=0;i<X_SIZE;i++){
for(j=0;j<Y_SIZE;j++){
pic[i][j] = fgetc(fin);      //pic[][]に全ピクセルを読み込む
}
}
fclose(fin);
//1つのレンジブロック
for(m=0;m<RN;m++){
 for(n=0;m<RN;n++){

min=1.0e10;       //各レンジに対して最も良いドメインを探す
for(p=0;p<DN;p++){
for(q=0;q<DN;q++){

801791:2005/08/27(土) 12:03:36

    dif=0;
for(i=m*rsr;i<(m+1)*rsr;i++){
for(j=n*rsc;j<(n+1)*rsc;j++){
◎ dif+=fabs(pic[i,j]-(pic[2*i,2*j]+pic[2*i,2*j+1]+pic[2*i+1,2*q]+pic[2*i+1,2*j+1])/4.0);  //ドメイン(p,q)とレンジ(m,n)の誤差を計算
}
}
if(min>dif){min=dif; mp=p; mq=q;}   //更に近似するドメインがあれば、前のものと取り替えて記憶
}
}
fr[m][n]=mp; fc[m][n]=mq;      //レンジ(m,n)に対する最適なドメイン(mp,mq)を記憶
}
}
fout=fopen(fnameout, "w");
for(i=0;i<X_SIZE;i++){
for(j=0;j<Y_SIZE;j++){
fprintf(fout,"%d",pic[i][j]);
}
}
fclose(fout);
}

フラクタル画像圧縮をするプログラムのつもりなんですが、エラーがでるのは◎のついた行です。
他にマズイとこがあったら指摘してほしいです。スキルに見合わぬことやってるので、ほんとわけわかめです。
宜しくお願いします

>>799=>>791です。
802デフォルトの名無しさん:2005/08/27(土) 12:04:26
> int i,j,m,n,p,q,rsc,rsr,dsc,dsr,mp,mq,RN,DN;

この時点で読む気がなくなる俺がいる。
変数宣言は利用する最も狭いスコープでしろ。
803デフォルトの名無しさん:2005/08/27(土) 12:09:01
ソース貼れとか言っておいて
いざ貼ったら読む気しないってw
馬鹿じゃねーのwww
804デフォルトの名無しさん:2005/08/27(土) 12:10:21
言ってないもん。馬鹿ジャねーの?www
805デフォルトの名無しさん:2005/08/27(土) 12:10:59
>>800
Cの2次元配列の使い方が間違っとる。
× pic[i,j]
○ pic[i][j]
806805:2005/08/27(土) 12:13:30
そのせいで、 pic[2*i,2*j]などの型が unsigned char[] に
なってしまっているので、 + 演算ができない。

unsigned char x[10];
unsigned char y[10];
で、
x + y の計算をしようとしているようなもの。
807デフォルトの名無しさん:2005/08/27(土) 12:27:54
そのx+yはできるだろ・・・
BYTEはなんのtypedefですかと・・・
808デフォルトの名無しさん:2005/08/27(土) 12:29:09
>>805
コンパイルできました!ありがとうございます!

と思い実行したら・・・core dump・・・

809デフォルトの名無しさん:2005/08/27(土) 12:53:58
>>807
ハァ?
810デフォルトの名無しさん:2005/08/27(土) 13:13:26
>>808
・コアを吐く原因の一点目
コピペばかりでプログラムを組むのはやめた方がいいよ。
forの条件をよく見てご覧。
811デフォルトの名無しさん:2005/08/27(土) 13:19:22
>>808
・コアを吐く原因の二点目
問題の絶対値を計算している行。座標値を確認しよう。
ここで、i、jの値はそれぞれXSIZE-1、YSIZE-1になるが、それを2倍したら当然領域外になる。
812デフォルトの名無しさん:2005/08/27(土) 13:35:16
>>810
ありがとうございます!
よく確認してみます。

自分の力でできるかわからないですけどね・・・_| ̄|○
813デフォルトの名無しさん:2005/08/27(土) 15:45:32
>>807
おまえんとこは "aaa"+"bbb" や char *x,*y; x+y; が計算できるのかと(ry
>>812
Cを知らないのは致命的だが、今から習えば、来年の夏ごろまでには…
まあ、誘導されてこのていたらくなら、それ以前に見込み無さそうだが…
814デフォルトの名無しさん:2005/08/27(土) 18:45:57
>>813
ポインタ同士の足し算はどうだかわからんケド、引き算は使うことないか?

void foo(char* pTop) {
 char* pFoo = strchr(pTop, '/');
 int iLen = 0;
 if (pFoo) iLen = pFoo - pTop;
 ……
}
815デフォルトの名無しさん:2005/08/27(土) 19:10:44
>>814
なあ、ボクちゃん、足し算わかってからでなおそうな。ヴォケ。
当然、自明の話をしてるだけなんだが、これまた厨は……
816デフォルトの名無しさん:2005/08/27(土) 19:13:45
まぁホットケよ
817デフォルトの名無しさん:2005/08/27(土) 19:14:40
相手にすんな
818デフォルトの名無しさん:2005/08/27(土) 19:34:48
ポインタ同士の減算はできるな。その結果は要素数でsize_tになるが。
819デフォルトの名無しさん:2005/08/27(土) 19:42:17
>>818
ptr_diffの間違いでは?
820デフォルトの名無しさん:2005/08/27(土) 19:54:14
急速にスレの質が(ry
821デフォルトの名無しさん:2005/08/27(土) 20:00:52
>>819
そうだった。うん。知らなかったわけじゃないよ!?
822デフォルトの名無しさん:2005/08/27(土) 21:41:38
>>819
うちにあるやつでは ptrdiff_t だなあ。
頭痛すぎなんで釣られておくsigh. ってもうやめろ。
823デフォルトの名無しさん:2005/08/27(土) 22:24:00
たいていは、size_t が unsigned int で、ptr_diff は int
824デフォルトの名無しさん:2005/08/27(土) 23:09:06
初心者大歓迎って書いてあるからおそるおそる聞いてみる

false ってなんて読むの?

ふぁるす? ふぇいるす?
825デフォルトの名無しさん:2005/08/27(土) 23:14:35
ふぁるす
826デフォルトの名無しさん:2005/08/27(土) 23:14:36
>>824
英和辞典か英英辞典見ろ
827デフォルトの名無しさん:2005/08/27(土) 23:16:17
英語教室は有料サービスとなっております
828デフォルトの名無しさん:2005/08/27(土) 23:43:25
>>824
http://dictionary.goo.ne.jp/voice/f/00030585.wav
「ふぉーるす」だと思うが
goo辞書先生は「ふぉーす」と発音しているように聞こえる
829デフォルトの名無しさん:2005/08/27(土) 23:49:28
>>828
ありがとう。ふぉーすって聴こえるね。
まぁ、無難に「ふぉーるす」って読むことにするよ
ありがと
830デフォルトの名無しさん:2005/08/27(土) 23:53:39
おまいら巻き舌の聞き分けもできないのかと
831デフォルトの名無しさん:2005/08/28(日) 00:11:45
>>830
false のどこに巻き舌(r)の発音があるのかと

つうか、いい加減板違い
832デフォルトの名無しさん:2005/08/28(日) 06:34:15
プログラマって簡単な英語も読めないヤツが多くて困るな。

Acceptをアセプトだの、しまいにゃResultをレサルトだの、呆れて物も言えんわ
833デフォルトの名無しさん:2005/08/28(日) 06:47:33
違うのか!?
834デフォルトの名無しさん:2005/08/28(日) 06:59:22
何に対して違うのかといってるのだw
835デフォルトの名無しさん:2005/08/28(日) 07:42:23
ノンノン!ルィザィアルトゥ
836デフォルトの名無しさん:2005/08/28(日) 07:50:39
なんか字の感じがジョジョっぽい
837デフォルトの名無しさん:2005/08/28(日) 11:01:50
>ザィ
無理.
838デフォルトの名無しさん:2005/08/28(日) 11:04:43
むりどっと
839デフォルトの名無しさん:2005/08/28(日) 12:40:30
ム・リゾット
840デフォルトの名無しさん:2005/08/28(日) 16:16:27
idle→アブドゥル
841デフォルトの名無しさん:2005/08/29(月) 12:09:59
ポインタ演算についての質問です。

int Function(char** text);な形の関数内で一文字づつスキャンしているのですが、次の文字へ移動する際に
(textは文字列へのポインタのポインタ)

*str += 1; or *str = *str+1; //正常に動作
*str++; //アクセス違反発生

となるのですが上と下では動作がどのように異なるのでしょうか?
842デフォルトの名無しさん:2005/08/29(月) 12:27:20
(*a)++ と *(a++) の違い
843デフォルトの名無しさん:2005/08/29(月) 12:29:33
>>841
*や++は結合則が右から左
*str++は(*str)++じゃなくて*(str++)になる
844デフォルトの名無しさん:2005/08/29(月) 13:36:00
>>842-843
*が演算子てのを失念してましたorz
845デフォルトの名無しさん:2005/08/29(月) 15:24:36
ポインタの中身を足してるのと、
ポインタ自体のインクリメントの違い
846デフォルトの名無しさん:2005/08/29(月) 16:07:58
unsigned x=0xFFFFFFFF;
x=x>>32;
とした時、x=0にはならないんですか?
847846:2005/08/29(月) 16:34:57
解決しました。
結果は未定義になるということがCの仕様に出ていたので
0になるわけではないようですね。
848デフォルトの名無しさん:2005/08/29(月) 18:17:15
>>841
おまえさん、わざわざ間違えやすいことしてないか?
文字列を受け取ってそれを一文字ずつスキャンしたいなら、

int Function(char *text); にして、text[i]で見ればいいじゃないか
849デフォルトの名無しさん:2005/08/29(月) 19:55:15
>>848
こんな感じで使うのでchar*渡しだとダメなのです。

char hoge[] = "C5D5D5#";
char *ichiji = hoge;
char note;
while(0 <= (note = Function(&ichiji)) ) //NULL文字が出現すると-1返す
  printf("%d\n", note);

60
61
62
850デフォルトの名無しさん:2005/08/29(月) 20:09:50
char**の必要ねぇじゃん・・・
851デフォルトの名無しさん:2005/08/29(月) 20:16:40
たぶんポインタの意味や使いどころを誤解していると思う。
852デフォルトの名無しさん:2005/08/29(月) 20:40:04
BYTE* b=(BYTE*)"い";
printf("%x\n",*b);

これだと出力は82なのに、

char* c="い";
printf("%x\n",*c);

これだと出力はffffff82になります。


char型は1バイト変数だと思っていたのですが、0xffffff82は4バイトですよね。

どうしてこんなことになるんですか?


メモリの1アドレスのビット長って1バイトなんですか?4バイトなんですか?
BYTE変数やchar変数って4バイト中の1バイトしか使わない変数ってことになるんですか?

dosVでインテルのペンティアム4 ハイパースレッドのCPUです。
頭こんがらがってます。助けてください。
853デフォルトの名無しさん:2005/08/29(月) 20:52:49
>>852
>BYTE* b=(BYTE*)"い";
>char* c="い";

バカかオマエは・・・
854デフォルトの名無しさん:2005/08/29(月) 20:53:22
整数の格上げと符号拡張
855デフォルトの名無しさん:2005/08/29(月) 20:54:15
ポインタだから。
856デフォルトの名無しさん:2005/08/29(月) 21:09:20
unsigned char a = 0x80;

char b = 0x80;
printf("%x %x\n",a,b);
857デフォルトの名無しさん:2005/08/29(月) 21:24:13
オマケ
printf("%d %d\n",a,b);
858デフォルトの名無しさん:2005/08/29(月) 21:27:08
>>852
まぁ、あれだ。
ポインタについて勉強しなおせ。
859デフォルトの名無しさん:2005/08/29(月) 21:32:01
>>852
printfが変数のバイトサイズを認識する手段は書式にしかない。
%x と書けば、全部 int 型 と扱われる。
860デフォルトの名無しさん:2005/08/29(月) 21:34:49
char 型の引数はすべてint 型に拡張されて引数渡しされている。
printfの処理の中では char 型で処理されることはない。
%cの処理でも、いったんintにされたものをchar型にキャストしている。
861デフォルトの名無しさん:2005/08/29(月) 21:36:17
ポインタ以前にいろいろ駄目だろ。謙虚にはじめからやり直しできなきゃ…
862デフォルトの名無しさん:2005/08/29(月) 21:42:09
ポインタは無関係だから無視していいぞ。
863デフォルトの名無しさん:2005/08/29(月) 21:55:07
>>852
お前んとこではcharがsignedになっているんだろう。
だから*cは-126になる。
printfなどの可変個引数では必ず格上げしてint/unsigned int以上の型へ変換して引数を渡すことになる。
-126をintへ変換した値を16進法であらわすとffffff82になる。(intが32ビットとして)
864861:2005/08/29(月) 21:58:19
>>862
おお、それさえはっきり言わんと駄目そうだったんだ。
とりあえずは >>856 をきちんと理解できるまでになるかだよなあ。
865デフォルトの名無しさん:2005/08/30(火) 05:32:08
>>863
charは普通signedだろ
866デフォルトの名無しさん:2005/08/30(火) 05:43:20
>>865
unsignedの場合もある。つーか、オプションで切り替えることさえできる場合が多い。
867デフォルトの名無しさん:2005/08/30(火) 09:58:42
質問させてください
下のソースは
VRAMに10×10のドット画を表示するソースなんですけど
この画像を20×20に拡大したいんです
どうすればいいでしょうか?
出来れば 後々また質問に来なくていいように注釈付だとありがたいです

vr    vram アドレス
pt ???
fnt 画像データアドレス
col カラー

vr = (unsigned short *)0x4000000+(y*512+x);
for(y1=0;y1<10;y1++) {
pt = *fnt++;
for(x1=0;x1<10;x1++) {
if (pt & 1)
*vr = col;
vr++;
pt = pt >> 1;
}
}
868デフォルトの名無しさん:2005/08/30(火) 10:28:19
>>867
転送元を走査する速度を1/n倍にすれば、転送先ではn倍になる。
869デフォルトの名無しさん:2005/08/30(火) 10:35:52
そのソースで10*10の表示ってできるの?
これって転送先が100*1になっているようにみえるけど気のせい?
870デフォルトの名無しさん:2005/08/30(火) 10:41:19
というか、「pt ???」ってなんだよ
質問するならちゃんとした情報を書いてくれ。

そういや、この場合って拡大時の画素間の補完はしなくていいの?
871デフォルトの名無しさん:2005/08/30(火) 10:48:47
>>868

for分の 増加分を 0.5にしてみましたけど駄目でした

>>869

はい フォント表示なんですけど10×10の文字が表示されます

>>870

fnt = (unsigned short *)&zenkaku_font10[n*10];
pt = *fnt++;

pt がフォントデータのアドレスなのかも
872852:2005/08/30(火) 10:52:03
>>853-866
printfで%xはバイナリデータがそのまま渡されるのかと思い込んでました。
charはsigned intにされて、byteはunsigned intにされて渡されていたからだったのですね。
よくわかりました。
ありがとうございました。
873デフォルトの名無しさん:2005/08/30(火) 10:57:49
本文を書いて「書き込む」をクリックした後に何か色々出てきて「全てをしょう
874デフォルトの名無しさん:2005/08/30(火) 10:59:37
>>871
>for分の 増加分を 0.5にしてみましたけど駄目でした

おまえ何も理解して無いだろ。
875デフォルトの名無しさん:2005/08/30(火) 11:03:02
本文を書いて「書き込む」をクリックした後に何か色々出てきて「全てを承諾
して書き込む」ってでてくんですよ。そしたら、一番下にクッキーを設定すれ
ばこの表示はなくなりますって書いてあって。意味不なんですけど。教えて下
さい。そもそもクッキーっていう意味がわからんし。
876デフォルトの名無しさん:2005/08/30(火) 11:05:43
>>875
鼬害。人に聞く前に自分で調べる習慣を身につけましょう。
877デフォルトの名無しさん:2005/08/30(火) 11:08:04
>>867
vrの初期値を見る限り、vramは横512画素分あるように見える。
翻ってその後のvrの振る舞いを見る限り、縦方向には増やされていないから
>869の言うように10x10にはならないと思うのだが。
#つーか、先ずはきちんと動いているものを貼れよ。
878デフォルトの名無しさん:2005/08/30(火) 11:09:15
>>875
> クッキーっていう意味がわからんし

お菓子だ。
879デフォルトの名無しさん:2005/08/30(火) 11:13:07
>>877

動いてるんですよ ほんとに
880デフォルトの名無しさん:2005/08/30(火) 11:14:32
>>879
ならばソースを晒せ
vramの表示に関係するところも含めて
881デフォルトの名無しさん:2005/08/30(火) 11:15:43
申し訳ない ソースが欠落してたorz

#defineLINESIZE512

fnt = (unsigned short *)&zenkaku_font10[n*10];

vr = (unsigned short *)0x4000000+(y*512+x);
for(y1=0;y1<10;y1++) {
pt = *fnt++;
for(x1=0;x1<10;x1++) {
if (pt & 1)
*vr = col;
vr++;
pt = pt >> 1;
}
vr += LINESIZE-10;
}
882デフォルトの名無しさん:2005/08/30(火) 11:16:22
>>876
お言葉ですが、あなたのように即そういう風に決め付けてしまうのもどうかと
思います。私は何度も2ちゃんのガイドラインを読みました。しかし、クッキ
ーという単語はかいてありましたがその意味はかいてありませんでした。なの
でこの掲示板にきて質問してみたのです。私も初心者ですがそのような最低限
なことは心得てるつもりです。 あ、取り乱してしまいましたね、すいません
。ちょっと話がそれてしまったので改めて聴きます。>>875について誰か
教えて下さい。
883デフォルトの名無しさん:2005/08/30(火) 11:19:01
>>882 なんでこのスレに来たんだ?
884デフォルトの名無しさん:2005/08/30(火) 11:20:16
>>881
それだけじゃちゃんと動いてるのか確認できないだろ

>>883
基地外は放置しとけ、後2日の辛抱だ
885デフォルトの名無しさん:2005/08/30(火) 11:23:40
>>882
「最低限なことは心得てるつもり」なら、
Cookieという単語にういてもう一度良く調べてください。
ttp://e-words.jp/w/Cookie.html

ちなみに、クッキーはインターネット上では一般的な用語です。
あと、激しくスレ違いです。
ガイドラインを何度もよく読んだなら、ちゃんと理解しましょう。
886デフォルトの名無しさん:2005/08/30(火) 11:25:41
>>883
スレタイの【初心者歓迎】だけを読んだんだろ、きっと。
887デフォルトの名無しさん:2005/08/30(火) 11:29:41
長すぎて 書き込めない・・・

ちなみにpspのプログラムなので パソコン環境では試せないかも?
888デフォルトの名無しさん:2005/08/30(火) 11:31:59
脳内コンパイル。正しく動くかは知らん

#define LINESIZE 512

fnt = (unsigned short *)&zenkaku_font10[n*10];

vr = (unsigned short *)0x4000000+(y*512+x);
for(y1=0;y1<20;y1++) {
    pt = fnt[y1/2];
    for(x1=0;x1<20;x1++) {
        if (pt & 1<<(x1/2))
            *vr = col;
        vr++;
    }
    vr += LINESIZE-20;
}
889デフォルトの名無しさん:2005/08/30(火) 11:41:06
>>888

ありがとうございます
それでいけそうな気配です

あとは行間等の数値も倍にするだけです

いっぱいレス使っちゃって申し訳ありませんでした
890デフォルトの名無しさん:2005/08/30(火) 12:31:39
>>888
しかし、汚いプログラムだなぁ。元が汚いからしょうがないっちゃしょうがないが。
891デフォルトの名無しさん:2005/08/30(火) 23:33:01
本を読んでも、よく分からないので確認させてください。

「ローカル変数の寿命は、スコープを抜けた所まで」、という事がどの初心者本にも書いてありますが、
setter(参照渡し)でクラスのメンバ変数に格納した場合、スコープを抜けてもそのまま使えるようです。

これは、こういう使い方をしても良いものでしょうか?
それとも、偶然動いているだけですか?

void Hoge() {
  //このhogeがスコープを抜けた後も、m_pClass->GetHoge()で拾える
  CHoge hoge;
  //Class::SetHoge(CHoge& hoge)
  m_pClass->SetHoge(hoge);
}

892デフォルトの名無しさん:2005/08/30(火) 23:39:12
>>891
Class::SetHogeの中で何やってるかわからんから推測になるが
中でhogeのコピーを取ってるならOK。
893デフォルトの名無しさん:2005/08/30(火) 23:41:15
まずはm_pClassとやらの正体を教えてくれんか
894デフォルトの名無しさん:2005/08/30(火) 23:41:40
>>891
スコープを抜けてもすぐに使えなくなるわけではない。
その変数のメモリ領域が新たに使われるまでは、元のデータがそのままになっている。
だから一見するとそういうことをしても動くように見える。
895偽616:2005/08/30(火) 23:43:33
void Hoge() {
  //このhogeがスコープを抜けた後も、m_pClass->GetHoge()で拾える
  CHoge hoge;
  //Class::SetHoge(CHoge& hoge)
  m_pClass->SetHoge(hoge);
}

ローカル変数は
{

}
の中で有効と覚えておけばよろし。
896デフォルトの名無しさん:2005/08/30(火) 23:53:42
>>892-895
ああ、なるほど。
よく考えたら、無意識にコピーしてました。

Class::SetHoge(CHoge& hoge){
  m_hoge = hoge;
}

897デフォルトの名無しさん:2005/08/31(水) 02:09:20
RGB15bitの0〜31の値をRGB24bitの0〜255の値に拡張する場合、
n<<3 と n*255/31 ではどちらが良いでしょうか。
898デフォルトの名無しさん:2005/08/31(水) 02:16:13
>>897
お前に目は無いのか?
899デフォルトの名無しさん:2005/08/31(水) 02:54:26
>>897
その二つの結果が違うことは理解しているよね?
900デフォルトの名無しさん:2005/08/31(水) 03:16:30
>>899
人のソース見ると速度優先なのか大抵、<<3で済ませてますが、
31が255でなくなるので、*255/31にしたのですが、これはこれで、
中間色が中途の様な気がして。

それで、(n+1)<<5 -1 なんてのも考えましたが、これだと中間色は
良くとても0が0で無くなるし、と悩んでます。
901デフォルトの名無しさん:2005/08/31(水) 07:34:40
>>900
テーブル引きはどうだ。
902デフォルトの名無しさん:2005/08/31(水) 07:59:28
>>900
その変換の目的をよく考えて、適切な方法を採るしかないっしょ。
速度優先なのか、画質優先なのか。
画質優先の場合、白は255/255/255でなければならないかどうか。
中間色の場合も要求の如何によるし。
どちらの場合もテーブル参照なら比較的高速で融通が利くんじゃない?
#私の場合は4→8ビットだったから迷わず17倍したけどね。
903デフォルトの名無しさん:2005/08/31(水) 08:06:58
(n << 3) + (n >> 2)
904デフォルトの名無しさん:2005/08/31(水) 09:47:06
>>900
sbb命令使って、0のときだけ0にすればよろし。
905デフォルトの名無しさん:2005/08/31(水) 13:02:04
コンストラクタをオーバーロードした際、
他のコンストラクタを呼び出すためには、どう書けばいいですか?

Javaでいう、this();のような記述です。
906デフォルトの名無しさん:2005/08/31(水) 13:08:14
>>905
placement new を使えば実行はできるが、
おそらく望んだ結果ではないからやめたほうがいい。

共通処理を static メンバ関数にするか、
もしくは共通の初期化を行うクラスを用意して
今作成しているクラスはそれを派生するかメンバに持つと良い。
907デフォルトの名無しさん:2005/08/31(水) 13:10:08
>>906
ありがとうございます。
908デフォルトの名無しさん:2005/08/31(水) 17:56:24
char ctmp[4] = {0x10, 0x20, 0x30, 0x40};
int iResult;

現在4バイトのchar型配列ctmpと
int型変数iResultがあります。

配列ctmpの頭から10, 20, 30, 40を使い
iResultに数字10203040を入れたいのですが
うまくいきません。ヒントをいただけないでしょうか。

16進数の数字をそのまま10進数にする
という部分でどうやればいいのか今イメージできていません。

環境はwinxp, VC++6.0です。
909デフォルトの名無しさん:2005/08/31(水) 18:01:11
>>905
オーバーロードしたんなら、普通に呼び出したいコンストラクタを呼び出せばいい

class Hoge {
  Hoge() { return; }

  Hoge(int i);
}

Hoge::Hoge(int i) {
  Hoge();

  return;
}


オーバーライドしたんなら、ParentClass::ParentClass()として呼べばいい
910デフォルトの名無しさん:2005/08/31(水) 18:03:29
>>908
#include <stdio.h>
int main(void) {
    char ctmp[4] = {0x10, 0x20, 0x30, 0x40};
    int iResult = 0, i;
    for (i = 0; i < 4; i++)
        (iResult <<= 8) += ctmp[i];
    printf("%X", iResult);
}
911デフォルトの名無しさん:2005/08/31(水) 18:48:10
>>910
ありがとうございます、iResultの変化は
00000000
00000010

00001000
00001020

00102000
00102030

10203000
10203040

となり、シフトしてから足すのですね、
シフトでできるという発想が出てこずに苦しんでおりました、
ありがとうございます、精進します。
912デフォルトの名無しさん:2005/08/31(水) 19:42:29
>>908
いやさ、(どうせ非現実的な処理だし)表示の問題だけですむならいいけど、
>>配列ctmpの頭から10, 20, 30, 40を使い
ここは初期化の部分どおり 0x10, .... だとしても、

>>iResultに数字10203040を入れたいのですが
>>16進数の数字をそのまま10進数にする
>>という部分でどうやればいいのか今イメージできていません。
この 10203000 が 16進か 10進か曖昧すぎるのだが…

>>となり、シフトしてから足すのですね、
>>シフトでできるという発想が出てこずに苦しんでおりました、
シフトというよりは、(シフトか掛け算で)必要なだけの桁の繰り上げを
行う、というだけのことだよね。(プログラムじゃなく算数)
913デフォルトの名無しさん:2005/09/01(木) 02:03:35
>>909
よくねーよ。
初心者も多く見てるスレなんだから、ネタならネタと分かるように書いてくれ。
914デフォルトの名無しさん:2005/09/01(木) 03:12:26
>>909
バーカ
915デフォルトの名無しさん:2005/09/01(木) 06:55:06
>>913-914

(´,_ゝ`)
916881:2005/09/01(木) 09:38:46
以前 グラフィック拡大の質問をしたものです

拡大できたのはいいのですが元のグラフィック(フォントデータ)が
荒いため 拡大すると荒さが目立ってしまいます

そこで最初から大きなフォントを実装したいのですが
やり方がわかりません
pspの開発環境ではまだ 内蔵フォントは使えないので自作するしかありません

出来れば16×16くらいのフォントを実装したいです

C言語で やるとしたらどうやりますか?
917デフォルトの名無しさん:2005/09/01(木) 09:54:33
他所から持ってくる

GBAだと第二水準まで全部もってきても余裕があった
PSPは知らないが大丈夫だろう
その時はhoge[]=みたいな形に変換するツールを作った
ソースファイルがS-JISだと不都合があった事を付け加えておく
フリーフォントを使いたいならみかちゃんフォントを推薦する
918デフォルトの名無しさん:2005/09/01(木) 10:07:36
はじめまして。

今、自分で使えるプログラムランチャーを作成しています。

ウィンドウ部分のボタンのフォントを変更しようと思うのですが、
どうするかがわかりません。

どなたか教えていただけないでしょうか
919デフォルトの名無しさん:2005/09/01(木) 10:22:02
後置と前置の差異をオーバーロードで
あらわす時はこれでいいのかな。意見求む

class CHoge{
public:
  CHoge& operator++();
  CHoge& operator++(int){
    static CHoge tmp;
    tmp = *this;
    operator++();
    return tmp;
  }
}
920デフォルトの名無しさん:2005/09/01(木) 10:36:35
>>919
後置++は値を返すべきだと思う。
CHoge operator++(int)
  CHoge tmp(*this);
  ++*this;
  return tmp;
}
921919:2005/09/01(木) 10:48:03
>>920
ああなるほど thx
922デフォルトの名無しさん:2005/09/01(木) 11:31:36
初めまして。すみません教えてください。
コンソールアプリを作っているのですが
パスワード入力のところで、エコーバック無しで文字を入力させたいのですが
どのようにすれば良いのでしょうか?
SetConsoleModeとか?いろいろやってみたのですがダメです。
923881:2005/09/01(木) 11:48:12
>>917

pspだとほとんど10×10の ナガフォントで
これ以上の大きさのフォントを使ってるソースが見つかりません


というわけでGBAの方をしらべてみましたが

font.c とかのファイルにテキストデータとして吐き出すツールが
無いようで 行き詰まってしまいました
924デフォルトの名無しさん:2005/09/01(木) 11:50:56
>>923
プログラムは探すものじゃない。書くものだ。
925922:2005/09/01(木) 12:05:12
すいません誤爆しました。
Win32API質問箱に投げるつもりでした。忘れてください。
926デフォルトの名無しさん:2005/09/01(木) 12:09:22
>>920
分かってるとは思うけど一応書いておくと、
CHoge hoge;
hoge++++;
を防止するために返値はconstにすべき
927デフォルトの名無しさん:2005/09/01(木) 12:24:56
>>923
JISに16x16のドットパターンなかったっけ?
昔使った記憶があるのだけれど。
#但し、JIS1973だったかも知れず。
928デフォルトの名無しさん:2005/09/01(木) 12:29:34
Red Hat Linuxのgcc3.0にて

CTestcls::temp(int ifd)
{
ifstream test(ifd);

というようなifstreamをファイルディスクリプタで
扱うことをやっていたのですが
gccのバージョンがあがったら

ifstream(int fd) : fstreambase(fd)

の定義が無くなっちゃいました。
これどうしたらよいんでしょうか?
929デフォルトの名無しさん:2005/09/01(木) 12:34:41
>>926
意味のない操作だからといって禁止する必要があるとは思えないんだが。
どちらかというとインターフェースを標準ライブラリに合わせる方が重要じゃないか?
930デフォルトの名無しさん:2005/09/01(木) 12:55:50
>>929
int i;
i++++;
と同じくエラーするってことだろ。
931デフォルトの名無しさん:2005/09/01(木) 16:40:02
malloc使って領域確保するのとnew演算子で確保するのって
どっち使ったほうがいいですか?
それぞれ特徴があったら教えていただけませんか?
932デフォルトの名無しさん:2005/09/01(木) 16:42:04
malloc: 失敗したらNULL返す
new: 失敗したらbad_alloc例外投げる 構造体ならコンストラクタが呼べる
933デフォルトの名無しさん:2005/09/01(木) 17:04:43
newは領域確保するだけじゃないので、同列に扱うのはどうかと。
934デフォルトの名無しさん:2005/09/01(木) 17:53:05
malloc
・指定したサイズの領域を確保し、そのポインタを返す
・型を気にせず(キャストして)領域を使える
・コンストラクタは呼ばない

new
・指定した型の変数を作り、そのポインタを返す
・コンストラクタを呼ぶ(クラス/構造体の場合)
  (※deleteの場合はデストラクタ)
・配列で確保する場合は[]を付けなければならない
・オーバーロード可能
935デフォルトの名無しさん:2005/09/01(木) 18:25:58
OpenDialogで開いたRAWデータ(16bitグレースケール)をFileReadを使って読み込み、
long型配列databoxに書き込みたいんですがさっぱり分かりません。ご助力お願いします。

if(OpenDialog2->Execute() == false) return;
// ファイルを開く
int theFile = FileOpen(OpenDialog2->FileName, fmOpenRead);
FileSeek (theFile,0,0);
buf=new char[3];
for(int j=0; j<Image1->Picture->Bitmap->Height;j++){
for(int i=0; i<Image1->Picture->Bitmap->Width; i++){
FileRead(theFile,buf,2);
databox[i][j]=strtol(buf,&emdptr,10);
}
}

FileClose(theFile);
936デフォルトの名無しさん:2005/09/01(木) 18:43:16
例外投げないでNULL返すnewもあるだろ。
937デフォルトの名無しさん:2005/09/01(木) 18:46:47
nothrow指定すりゃな。
938デフォルトの名無しさん:2005/09/01(木) 19:09:49
>>935
OpenDialog()云々とファイル取り扱いは問題を分けるべきだし、コードも分けるべきだ。
後者は、RAWデータはバイナリなのではないのかな?
だとすればdatabox[i][j] = buf[0] | buf[1] << 8;でいいと思うのだが。
エンディアンが逆ならば、buf[0] << 8 | buf[1]でいい。
#つーか、文字列とバイト列の違いがわかっていない悪寒。
939デフォルトの名無しさん:2005/09/01(木) 19:58:08
皆さんこんにちは。プログラマーではなく、私的な仕事ツールとしてスクリプトや簡単なC++を
使っている者です。
環境はVisual Studio .NET、MinGW on WIndowsXP、RHEL上のg++といったところです。
文字列処理は昔からstrstreamを使っていたのですが、そろそろ「古い機能使うなや」warning
がウザくなってきたのでstringクラスかなにかにシフトしようと考えています。

今まで、こんなふうに書いていました。

string a = "taskfile_";
int b = 10; // 番号変えて別ファイルを作ったりするため
string c = ".txt";
char fnbuf[255];
ostrstream ostr(fnbuf, sizeof fnbuf);
ostr << a << b << c << ends;
ofstream fout(fnbuf, ios::trunc);
....

で、こいつをstringで書こうとすると、int bを文字列に変換するのにsprintf使う方法しか
思いつかない自分がいました。
itoa関数はVC++とMinGWにはあるけどgccにはありません。
みなさんはこういう場合、どうコーディングされてます?
940デフォルトの名無しさん:2005/09/01(木) 20:07:09
stringstream、あるいはboost::lexical_cast。
941デフォルトの名無しさん:2005/09/01(木) 20:07:29
strstreamの代わりにstringstreamを使え。以上
942デフォルトの名無しさん:2005/09/01(木) 21:05:53
C言語でcsvファイルから要素をint型で読み込みたいのですが、なかなか難しいです。
strtokを使えばなんとかなるらしいのですが、正しいでしょうか?
ほかにもっと良い方法などあればお教えください。
943デフォルトの名無しさん:2005/09/01(木) 21:09:55
>>942
strtokで可能
後はscanfで読み込むとか、getcで読んでいってカンマが出た時点で区切るとか
944デフォルトの名無しさん:2005/09/01(木) 21:10:07
>>942
strlen関数を自作してみればやり方が分かると思うお
分割した文字列からの変換はatoiでやれば済む話だし
945デフォルトの名無しさん:2005/09/01(木) 21:10:58
>>939
プログラマのプロはプロフェッショナルのプロじゃないから、
カテゴリとしては君もプログラマだと思う。
946デフォルトの名無しさん:2005/09/01(木) 21:15:38
プロテイン・グラマー
947デフォルトの名無しさん:2005/09/01(木) 21:19:28
>>943-944
ありがとうございます。何とかなりそうです。
strtokとatoiを使ってやってみようと思います。
948偽616:2005/09/01(木) 21:43:04
>942
こんなんでよければどうぞ

void csvread(int intList[], char *str)
{
 int i;
 char *p, *pp;
 char tmp;
 p = str;
 for(i=0;;i++){
  pp = p;
  while(isdigit((int)*p))p++;
  if(*p == ','){
   tmp = *p;
   *p = '\0';
   intLlist[i] = atoi(pp);
   *p = tmp;
  }else{
   break;
  }
 }
}
949偽616:2005/09/01(木) 21:45:37
*p = tmp;
の下に
p++;
を追加しておいて
950デフォルトの名無しさん:2005/09/01(木) 22:01:04
http://pc8.2ch.net/test/read.cgi/tech/1080569567/29
これなんですけど、動作チェックをお願いできませんか?
レスはリンク先にお願いします。

上記を利用して
http://www5b.biglobe.ne.jp/~NAS6/html/Others.htm
*:2chのスレッドレス数の監視とコテハンの発言日時をダンプします。ソースつき。
こんなの作ったんですが・・・いや宣伝です。
951デフォルトの名無しさん:2005/09/01(木) 22:04:06
カエレ
952デフォルトの名無しさん:2005/09/01(木) 22:08:45
>>950
最低な奴だな
953950:2005/09/01(木) 22:16:48
私は何かのマナー違反したのでしょうか?
直したいので教えてください。
レスはリンク先って書いておけばマルチじゃないと思っていましたが・・・
リンク先を読んでる人がいないのでは?と思いここにレスしたのですが。
954デフォルトの名無しさん:2005/09/01(木) 22:23:04
>>953
とりあえずマルチはやめろと

691 名前:634[] 投稿日:2005/09/01(木) 14:51:40
http://www5b.biglobe.ne.jp/~NAS6/html/Others.htm
*:2chのスレッドレス数の監視とコテハンの発言日時をダンプします。

出来た〜!晒しちゃおう。手抜きだけど、ソースつき。
是非是非、DLしてね。

>>637さん重ね重ね有難う。
955950:2005/09/01(木) 22:26:56
>>954
ごめんなさい。
「レスはリンク先に」でもマルチになるんですね。
スレ汚しは重ね重ねごめんなさい。
956デフォルトの名無しさん:2005/09/01(木) 22:27:19
>>953
・動作チェックしてくれと言うだけで、どこがどうおかしいかも書かない。
・他人にモノを頼んでおいてレスはリンク先へと我が儘放題。
・どんなクラスかどんな関数なのか一切情報がない。
・コードが最低最悪。

これだけ揃ってれば>952も当然だな。
957デフォルトの名無しさん:2005/09/01(木) 22:27:36
>>953
自分が作ったプログラムのデバッグを
他人にやらせるのはどうかってことでしょ。

仕様が良く分からないプログラムを動かしたら
何が起きるかわからないわけだし。

最低限、簡単な機能仕様を提示して
ソースに処理の内容がわかる程度にコメントが付いてれば
添削してくれる人はいるかもね。

手抜きで書いたソースなぞ見たくもないがな。
958950:2005/09/01(木) 22:27:41
sage忘れてしまいました。ごめんなさい。
959957:2005/09/01(木) 22:28:22
>>956
うはwかぶったww
960偽616:2005/09/01(木) 22:39:32
三度目の正直だったらバイト先の好きな子に日曜日告白
バグはないよね・・・

void csvread(int intList[], char *str)
{
 int i;
 char *p, *pp;
 char tmp;
 p = str;
 for(i=0;;i++){
  pp = p;
  while(isdigit((int)*p))p++;
  tmp = *p;
  *p = '\0';
  intLlist[i] = atoi(pp);
  *p = tmp;

  if(*p == ','){
   p++;
  }else{
   break;
  }
 }
}

南無三
961偽616:2005/09/01(木) 22:41:48
intLlist[i] = atoi(pp);
  ~
intList[i] = atoi(pp);

三度目の正直じゃなかったけど、告白
962デフォルトの名無しさん:2005/09/01(木) 22:43:48
質問です。
signed→unsigned変換、unsigned→signed変換をするために
こんな感じで書きました。
変換の過程でデータが誤変換することは考えられますか?
またもっと良い変換方法はありますか?

signed char sc_before[5] = {0,-1,2,-3,4};
signed char sc_after[5];
unsigned char uc_after[5];
int i;
for(i=0; i<5;i++) {
uc[i] = sc_before[i];
}

/* ucを処理 */

for(i=0; i<5;i++) {
sc_after[i] = uc[i];
}
963デフォルトの名無しさん:2005/09/01(木) 22:44:21
isdigit()の定義域は 0..255 と EOF(-1)

char が signed char の環境では、 isidigit((int)*p) は間違い。
964偽616:2005/09/01(木) 22:52:40
memcpy(uc, (unsigned char *)sc_before, 5);
/* ucを処理 */
memcpy(unsigned char *)sc_after, uc, 5);

memcpy()については自分で調べてちょ

>963
ありがとうございます。
こんなの見つけてきました。

str[i]が数字でないのにisdigitが真になってしまうバグがありました。
str[i]が負になっていたことが原因でした。

isdigitなどctype.hのマクロの引数は-1〜255でなければならないそうです
(man isdigit)。この引数の型がcharの場合、-128〜127の値になるので、誤動
作を起こすことがあります。

isalnum, isalpha, isascii, isblank, iscntrl, isdigit, isgraph,
islower, isprint, ispunct, isspace, isupper, isxdigit
これらのマクロを使う場合は
isdigit((unsigned char)c)
のようにunsigned charにキャストする必要がありそうです。

。・゚・(ノД`)ヽ
965デフォルトの名無しさん:2005/09/01(木) 22:53:39
>>962
元を残しておく必要がなければ、こうできる。
unsigned char *uc_after = reinterpret_cast<unsigned char *>(sc_before);
/* ucを処理 */
後はsc_beforeが元のコードのsc_afterとして使える。

ただ規格では負の値をunsignedへ変換するのは問題ないが、その逆は未定義か何かだったはず。
966939:2005/09/01(木) 22:57:37
ありです。コンテナには結局ないんですねえ。明日会社行ったら試してみます。

>>945

Σ('A`) なぬ
それじゃグラマーなだけの営業屋だと思っていた俺は

967デフォルトの名無しさん:2005/09/01(木) 23:55:17
>>966

    ∩
    _( ⌒)     ∩__
  //,. ノ ̄\   / .)E)
 /i"/ /|_|i_トil_| / /      / ̄ ̄ ̄ ̄ ̄
 |ii.l/ /┃ ┃{. / /     < ぱいぱい ボイン!ボイン!ボイン!
 |i|i_/''' ヮ''丿i_/       \_____
 i|/ ,ク ム"/ /
 |(  ヽ _,.-===、j、
 ゞヽ‐イ/´   ヽ ヽ、
   \!   ::c:: !  :p
     }ヽ __ ノ、_ノ
   /    ノ ノ´

なのか?
968デフォルトの名無しさん:2005/09/02(金) 00:19:53
>>965
ありがとうございます。
>ただ規格では負の値をunsignedへ変換するのは問題ないが、
>その逆は未定義か何かだったはず。
ということは私のコードでも965さんのコードでも
問題ありということですよね。
そこを解決できないでしょうか?
signedのデータをある製品の関数に渡さなければいけないのですが、
製品の関数の入力と出力がunsignedで、出力されたunsignedを
元のsignedに変換する必要があるのです。
969966:2005/09/02(金) 00:26:02
>>967
違います。そんなAA貼って楽しいですか?
970デフォルトの名無しさん:2005/09/02(金) 00:31:46
char* a=(char*)malloc(100)と
char* b=(char*)calloc(100,1)と
char* c=(char*)calloc(1,100)とでは
確保されるメモリ領域のサイズは同じ?
971デフォルトの名無しさん:2005/09/02(金) 00:33:53
>>970
同じ
972デフォルトの名無しさん:2005/09/02(金) 07:05:34
fwrite,freadの2、3番目の引数って一つで十分なんじゃ
ないですか?
エンディアンもこれは関係なさそうな気が
973デフォルトの名無しさん:2005/09/02(金) 07:37:47
>>966
std::stringstreamは入出力両用で、ostrstreamに対応するのはstd::ostringstreamだ。
974デフォルトの名無しさん:2005/09/02(金) 07:38:53
>>968
すまん。規格見たら「処理系定義の値になる」だった。
975デフォルトの名無しさん
>>972
例えばintが16ビットの環境で64K以上アクセスするときに便利。