【初心者歓迎】C/C++室 Ver.20【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/07/18(月) 08:59:42ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1119793525/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2005/07/18(月) 09:05:440003デフォルトの名無しさん
2005/07/18(月) 10:13:030004デフォルトの名無しさん
2005/07/18(月) 10:49:360005デフォルトの名無しさん
2005/07/18(月) 12:26:560006デフォルトの名無しさん
2005/07/18(月) 12:28:32環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0007デフォルトの名無しさん
2005/07/18(月) 12:30:06とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後氏ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0008デフォルトの名無しさん
2005/07/18(月) 13:05:16おもわず・・・・・プッ。
ここまで毎回でるとあっぱれだな。
0009デフォルトの名無しさん
2005/07/18(月) 13:23:380010デフォルトの名無しさん
2005/07/18(月) 13:31:45C++相談室 part16
http://pc5.2ch.net/test/read.cgi/tech/1045746245/15
http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
0011デフォルトの名無しさん
2005/07/19(火) 00:31:07ここまでテンプレ
0012デフォルトの名無しさん
2005/07/19(火) 02:54:08アプリケーションの左上のアイコンと実行exeのアイコンの設定の仕方を教えてください
VS付随のアイコンエディタではしょぼすぎで絵がかけないらしいのでオネガイシマス
0013デフォルトの名無しさん
2005/07/19(火) 03:05:32まぁそういわずに使ってみろ。
0014デフォルトの名無しさん
2005/07/19(火) 03:10:12好きなエディタで描いたbmpかなにかをIrfanViewかなにかでICONファイルに変換するとか。
0015デフォルトの名無しさん
2005/07/19(火) 03:57:22this->Icon = (__try_cast<System::Drawing::Icon * >(resources->GetObject(S"$this.Icon")));
の部分でerror C2039: 'GetObjectA' : 'System::Resources::ResourceManager' のメンバではありません。
ってエラーを返すようになってしまいました 確かこの部分はVC++が勝手に記述するところだったはずですが・・・
原因はあまり良くわかりませんがForm1.hとrcとアイコンファイルを適当に触ったのに問題があったんでしょうか
良い解決法があったらご教授願います
0016デフォルトの名無しさん
2005/07/19(火) 05:57:32プロジェクト作ったときに出来るアイコンのIDを
おまいがプロジェクトに追加したアイコンに割り当てる
0017デフォルトの名無しさん
2005/07/19(火) 09:38:23配布時には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です。
0018デフォルトの名無しさん
2005/07/19(火) 19:39:56できるだけ細かく書いたサイトないですか?
0019デフォルトの名無しさん
2005/07/19(火) 19:40:30アイコン作りに御勧め。
ttp://www.towofu.net/soft/aicon.php
0020デフォルトの名無しさん
2005/07/19(火) 21:26:59何よ-O2って。メニコンO2か?
情報が不足杉。もう少し詳細に書け。
0021デフォルトの名無しさん
2005/07/19(火) 21:28:54>>18の質問もナンセンスだが
0022デフォルトの名無しさん
2005/07/19(火) 21:30:16頭の悪い別人を焙り出す例だな
0023デフォルトの名無しさん
2005/07/19(火) 22:39:16自虐乙
0024デフォルトの名無しさん
2005/07/19(火) 22:54:210025デフォルトの名無しさん
2005/07/20(水) 03:13:38と出る場合、どのような間違いをしていることが考えられますでしょうか?
どこかのcppファイルで';'が抜けてるだけだと思って
現在探しているのですが中々見つからず・・・
#ifndef __HOGE_H_
#define __HOGE_H_
; ←これでエラーがなくなる
class HOGE
0026デフォルトの名無しさん
2005/07/20(水) 03:16:55他のヘッダファイルで行われているクラス定義を見直せ。
0027デフォルトの名無しさん
2005/07/20(水) 03:36:32ありがとうございます。見つかりました。
0028デフォルトの名無しさん
2005/07/20(水) 20:42:260029デフォルトの名無しさん
2005/07/20(水) 20:49:04double→int→double
0030デフォルトの名無しさん
2005/07/20(水) 21:12:46負の値のときにも 0 へ近づけるのなら (-1.2 ⇒ -1.0) >>29
負の値のときに -∞ へ近づけるのなら (-1.3 ⇒ -2.0) floor()
0031デフォルトの名無しさん
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) {}
};
0032デフォルトの名無しさん
2005/07/20(水) 21:45:44初期化。
もし「独習C++」に書いてないとしたら、よほど古い本かゴミなのだろう。
003331
2005/07/20(水) 21:59:41おかげで解決しました。
ただ自分が見落としてるだけで
「独習C++」には書いてあるかもしれません。
自分が深く確認してないだけです。ごめんなさい。
0034デフォルトの名無しさん
2005/07/22(金) 00:39:24wprintfをつかったら出力はどこに表示されるの?
0035デフォルトの名無しさん
2005/07/22(金) 00:42:47お前の頭の中です。
0036デフォルトの名無しさん
2005/07/22(金) 00:44:05マイクロソフトを相手に戦うとは・・・すごいヤシもいたもんだ。
戦いが酷く低レベルに見えるのは気のせいか?
0037デフォルトの名無しさん
2005/07/22(金) 00:48:10wprintf の w は wide の w だよ…
printfと同じ場所に出力される。
ウィンドウ上に出力したければ TextOut とかを調べるべし。
>>35-36
つまんないよ
0038デフォルトの名無しさん
2005/07/22(金) 00:51:290039デフォルトの名無しさん
2005/07/22(金) 01:14:00それ、そろそろみっともないから、やめた方がいいよ。
004034
2005/07/22(金) 02:03:18あ、そうですか。てっきりw =Windowsかと。TextOutだと、文字を出すまで
結構手間がかかるから、デバッグ用に簡単に文字出力してくれるのは無いの
かと思って。
Javaだと、System.out.printlnとかで、デバッグ用のコンソール画面にデバイス
コンテキストとか考えずに出してくれるから、そういうものかと勘違いしました。
失礼。
0041デフォルトの名無しさん
2005/07/22(金) 02:10:02OutputDebugString
0043デフォルトの名無しさん
2005/07/22(金) 05:07:41javaのデバッガよりつかいやすいよ。
eclipseも進化したのかな?
0044デフォルトの名無しさん
2005/07/23(土) 02:26:45I/Oに読み書きするのに、まずポートを開く関数を作って、そのなかで
HANDLE hIOport = CreateFile();
とかやってハンドルを取り出しますよね。
このハンドルを今度、書き込みとか読み込みとかする関数に受け渡すのは
どうやるのが定石なんですか?
なんか、WinProcとかに受け渡すのがよくわからなくて、結局グローバルで
宣言して使ってしまってるんですが、それでも動くからいいんですかね?
そこら辺が分かるようなコーディングの例とかあったら教えてください。
0045デフォルトの名無しさん
2005/07/23(土) 08:14:33WinProcの中でstatic変数にしとく。
あまり凝ったことしても面倒なだけ。
0046デフォルトの名無しさん
2005/07/23(土) 10:08:44http://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というのはどういった役割を持ったものなのでしょうか?
0047デフォルトの名無しさん
2005/07/23(土) 22:50:30いいのでしょうか?
0048デフォルトの名無しさん
2005/07/23(土) 23:59:060049デフォルトの名無しさん
2005/07/24(日) 00:03:14シンボルは libc のものだと思う。少なくとも _impure_ptr はそう。
最初の -lpsplibc が余計なんじゃないか?
0050デフォルトの名無しさん
2005/07/24(日) 00:03:170051デフォルトの名無しさん
2005/07/24(日) 03:29:57p=&a;
これで*pでaを参照できるけど
関数のとき
void fly(&a,&b)
で呼び出して
呼び出された関数がvoid fly(int *a,int *b)
になるけど前に書いた*pで値だからアドレスを渡すなら
void fly(int a,int b)だと思ったんですけどなんで(int *a,int *b)に
なるか教えてください
0052デフォルトの名無しさん
2005/07/24(日) 03:42:21> *pで値だからアドレスを渡すなら void fly(int a,int b)
意味不明。なんで void fly(int a,int b) になるのかわからん。
とりあえずポインタの意味、宣言、使い方を勉強しなおせ。
あと日本語下手すぎ。
書き込む前に読み直して、自分以外の人でも理解できるかどうかよく考えろ。
句読点を使って、適当なところで文を切るように気をつけると良いよ。
0053デフォルトの名無しさん
2005/07/24(日) 08:25:58変数宣言は式の中で*aするとintになるからint *aというように覚えるが吉。
0054デフォルトの名無しさん
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];
とするよりも速い気がするんですが、これはなぜですか?
それとも気のせいでしょうか。
0055デフォルトの名無しさん
2005/07/24(日) 09:23:06メモリの位置関係を見れ
キャッシュがあるCPUなら(ry
0056デフォルトの名無しさん
2005/07/24(日) 10:28:030057デフォルトの名無しさん
2005/07/24(日) 10:29:530058デフォルトの名無しさん
2005/07/24(日) 12:23:31C++なら<cstdlib>のstd::system()
0059デフォルトの名無しさん
2005/07/24(日) 13:07:08[0][0],[0][1],[0][2],……[1][0],[1][1],[1][2],…
って感じに並んでるからさ。まぁイメージだけど。
0060デフォルトの名無しさん
2005/07/24(日) 15:06:13どこかにまとめページのような物はないでしょうか?
0061デフォルトの名無しさん
2005/07/24(日) 15:15:35C 言語によるオブジェクト記述法 COOL
ttp://www.sage-p.com/process/cool.htm
0062デフォルトの名無しさん
2005/07/24(日) 15:50:42数回のスレッド生成はうまくいきますが
Segmentation fault (core dumped)
が表示されてエラー終了してしまいます。
原因が分かりません。
どこがエラーの原因か指摘していただけませんか?
ソースは以下にupしました。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/785.txt
0063デフォルトの名無しさん
2005/07/24(日) 16:04:16内容をざっと見ると、かなり面倒なやり方ですね…。
とりあえず、熟読してみます。
ありがとうございました。
0064デフォルトの名無しさん
2005/07/24(日) 16:16:01そのための言語じゃないんだからな
0065デフォルトの名無しさん
2005/07/24(日) 16:48:03006660
2005/07/24(日) 17:45:01・メンバ関数 → 構造体内部に関数ポインタ(コンストラクタで指定)
(instance->method() みたいに書ける)
・private → ソース内でstatic定義
・public → ヘッダor構造体内に記述
・継承 → 構造体をネスト(ベースクラスを一番上に)
・オーバーライド → 継承クラスで関数ポインタ差し替え
って、結局面倒な方法になってますがorz
もう少し検討してみます…。
>>64
素直にCライクな書き方でガシガシ書いた方がすっきりするのかもしれませんね…。
>>65
そのやり方もひとつの手ではありますが、デバッグが大変な気がします。
0067デフォルトの名無しさん
2005/07/24(日) 18:29:57構造体に直接関数ポインタってのはオーバーヘッドが大きい。
C++そっくりの記法にこだわる必要はないだろうと思う。
非仮想関数は構造体名を付けて構造体へのポインタを第一引数にとる関数にし、
仮想関数も直接メンバに持たせず、メンバにはvtbl構造体へのポインタだけを持たせて、
vtblのメンバに関数ポインタを持たせ、vtblの実体はクラスに1つだけというようにすれば、
C++の実装と大体同じような感じになる。
って書いてからCOOLを読んだら同じことが書いてあった。
鬱ダ(ry
0068デフォルトの名無しさん
2005/07/24(日) 18:40:28// 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 にすべての実装をまとめなくてはならない
0069デフォルトの名無しさん
2005/07/24(日) 18:51:45それもCOOLに同じようなことが書いてある。
0070デフォルトの名無しさん
2005/07/24(日) 19:39:09サンプルコードでヘッダに定義が書いてあったんだけど、
文面でヘッダでの定義が不要なことが書いてあるね。ゴメン
007166
2005/07/24(日) 20:31:42結局のところ、COOLでそのままコードを書くのが一番だということですね。
私の理解不足でした。
そういうわけで、COOLで少しコード書いてみます。
0072デフォルトの名無しさん
2005/07/24(日) 20:54:05COOL見たいな物を考えるのは面白いけど、激しく生産性悪いよな。
007372
2005/07/24(日) 20:55:200074デフォルトの名無しさん
2005/07/24(日) 21:00:47Subversion とか、似たような感じ。
保守性優先ってこともあるだろうが、生産性が悪いとも思わない。
C++に慣れてから、Cしか使えない環境に逝った時は自然にこうなる。
007562
2005/07/24(日) 21:17:29失礼しました。
0076デフォルトの名無しさん
2005/07/24(日) 22:06:31CのFILE *とかまさにこんな感じだろ。
こいつには仮想関数がない分すっきりしているけど。
0077デフォルトの名無しさん
2005/07/24(日) 22:23:500078デフォルトの名無しさん
2005/07/24(日) 22:30:49<stdlib.h>のsystem()
0079デフォルトの名無しさん
2005/07/24(日) 22:30:52system("start java");
0080デフォルトの名無しさん
2005/07/25(月) 00:20:44参照したいのですが、実現する方法ってありますでしょうか?
0081デフォルトの名無しさん
2005/07/25(月) 01:25:36藻前はすぐ目と鼻の先にあるものも見えないのか?
0082偽80
2005/07/25(月) 01:37:17んなこともわからないんですか?
0083デフォルトの名無しさん
2005/07/25(月) 01:41:590084デフォルトの名無しさん
2005/07/25(月) 03:31:10環境依存の方法しかないぞ。
* systemの戻り値は 実 装 依 存 * ですから。
UNIXならexecとかspawnとかその辺だったと思う。
0085デフォルトの名無しさん
2005/07/25(月) 09:52:440086デフォルトの名無しさん
2005/07/25(月) 11:12:54catch (string str) { }
のように catch で string を受けるようにすると、コンパイルは通るのですが、実行時に落ちてしまいます。
BCC だと Abnormal program termination、VC だとランタイムエラー
どの様にすればいいのでしょうか。ポインタや参照で受けても同様でした。
0087デフォルトの名無しさん
2005/07/25(月) 11:22:23catch のマッチングには、派生クラスから基底クラス以外の暗黙の型変換は効かない。
その例だと throw string("error") または catch(char const* str) とすれば捕まえられる。
0088デフォルトの名無しさん
2005/07/25(月) 11:29:14クラスを例外で受けるなら参照にするが吉。
関数の引数同様、いちいちコピーコンストラクタが発動してしまう。
0090デフォルトの名無しさん
2005/07/25(月) 15:57:17※0が入力されるまで処理を繰り返す。できれば一度目の0入力に対応していただけると
ありがたいです。
---------c:\例題.txtの内容-------
1,あああああああ
2,いいいいいいい
65,ううううう うううううう
89,えええ えええ ええ
99,お願いします。
--------------------------
↓↓↓↓実行結果↓↓↓↓
コード?65
ううううう うううううう
コード?
↑↑↑↑↑↑↑↑↑↑↑↑
OS:Windows
コンパイラ:gcc
言語:C
0091デフォルトの名無しさん
2005/07/25(月) 15:59:22宿題スレへ。
0092デフォルトの名無しさん
2005/07/25(月) 16:06:37ぼるじょあがC/C++の宿題を片づけますYO! 48代目
http://pc8.2ch.net/test/read.cgi/tech/1121471445/l50
0093デフォルトの名無しさん
2005/07/25(月) 18:29:180094デフォルトの名無しさん
2005/07/25(月) 18:32:13マルチは帰れ
009580
2005/07/25(月) 21:38:15返信ありがとうございます。
ただ、前述のsystem関数もexec関数もshellの呼び出しに成功すると制御が
戻ってこないため悩んでいます。
spawn関数というのは使ったことが無いのですが、/usr/include内見てもそれらしき
記述?が無いのでダメかもしれません。
0096デフォルトの名無しさん
2005/07/25(月) 22:31:27その戻ってこないコードを晒して
あと環境も
0097デフォルトの名無しさん
2005/07/25(月) 23:46:32これじゃダメ??
int main(){
int ret=0;
ret = system( "/home/hoge/test.sh" );
printf( "%d\n" , WEXITSTATUS( ret ) );
return 0;
}
0098デフォルトの名無しさん
2005/07/26(火) 09:21:45そろそろネイティブ系も使ってみようと思っているのですが
0099デフォルトの名無しさん
2005/07/26(火) 10:38:040100デフォルトの名無しさん
2005/07/26(火) 10:44:270101偽80
2005/07/26(火) 10:57:280102デフォルトの名無しさん
2005/07/26(火) 11:22:180103デフォルトの名無しさん
2005/07/26(火) 17:28:530104デフォルトの名無しさん
2005/07/26(火) 18:08:25俺だけでいい
0105デフォルトの名無しさん
2005/07/26(火) 19:50:20悪いことは言わん、そのままJavaやっとけ。
0106デフォルトの名無しさん
2005/07/27(水) 01:09:240107デフォルトの名無しさん
2005/07/27(水) 01:09:57warosu
0108デフォルトの名無しさん
2005/07/27(水) 14:06:45うらうらべっかんこー
0109デフォルトの名無しさん
2005/07/27(水) 20:06:460110デフォルトの名無しさん
2005/07/28(木) 02:13:09そろそろネイティブ系も使ってみようと思っているのですが
0111デフォルトの名無しさん
2005/07/28(木) 07:04:410112デフォルトの名無しさん
2005/07/28(木) 07:45:290113デフォルトの名無しさん
2005/07/28(木) 07:52:140114デフォルトの名無しさん
2005/07/28(木) 08:32:440115デフォルトの名無しさん
2005/07/28(木) 09:05:380116デフォルトの名無しさん
2005/07/28(木) 09:31:11C++にて
p = new int [5][8];
と動的に多次元配列をnewできないかなと考えていたのですが、もちろんデフォではダメでした。
new のオーバーロードに手をつけようと思ったのですが、どうやら
newは返り値がvoid* と決まっているようです。
JAVAのようなお手軽な多次元配列は作れないものでしょうか?
0117デフォルトの名無しさん
2005/07/28(木) 09:54:18newだと最上位の要素数以外はコンパイル時に決まっている必要がある。
で、どうするかというと、
int n = 8;
int *p = new[5 * n];
としてp[y * n + x]などと手動で指定したり、std::vector<std::vector<> >やboost::multi_arrayを使ったりする。
operator newの返り値がvoid *なのは、まだただのメモリの塊に過ぎないから。
そこへコンパイラがコンストラクタを動かして初めて何らかの型へのポインタになる。
(たとえintなどの組み込み型でも概念としてはそうなる)
0118デフォルトの名無しさん
2005/07/28(木) 10:17:29class 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使えって言われそうな気がしてきた。
0119デフォルトの名無しさん
2005/07/28(木) 10:22:30なるほど。ありがとうございます。
ついでといっては何なのですが、
>newだと最上位の要素数以外はコンパイル時に決まっている必要がある。
これでの記述の仕方はどのような形なのでしょうか。
想像するに
int *p[5] = new int [n][5];
とかかなと思ったのですが、うまく行きませんでした。
0120デフォルトの名無しさん
2005/07/28(木) 10:27:39int (*p)[5] = new int [n][5]; //「int[5]」の配列[要素数n]
int *p[5] = new int *[n]; //「intへのポインタ」の配列[要素数n]
0121デフォルトの名無しさん
2005/07/28(木) 10:29:05それは受け取り方が間違い。
0122デフォルトの名無しさん
2005/07/28(木) 10:36:41ありがとうございます。
int (*p)[5] = new int [n][5];
がうまくいきました。
int *p[5] = new int *[n];
のほうはダメみたいです。
私の書き方だと
*(p[5])だと判断されてしまうのですね。
0123デフォルトの名無しさん
2005/07/28(木) 10:37:51それもおもしろいアイデアですね。
.lengthなども使えて便利になりそうです。
0124デフォルトの名無しさん
2005/07/28(木) 10:47:24for(int i=0;i<m;i++) {
p[i] = new int[n];
}
面倒だけどこれでもいいんじゃなかったっけ?
0125デフォルトの名無しさん
2005/07/28(木) 10:52:21C++ならそういうどさ回りの仕事は隠蔽しようよ。
0126120
2005/07/28(木) 10:52:56スマソ
int *p[5]はint *の配列だった。使うとしたらこうだな。
for (int i = 0; i < 5; i++)
p[i] = new int[n];
0127デフォルトの名無しさん
2005/07/28(木) 13:16:32Cを飛ばしてC++が普通だから
この手の話題が苦手の奴が多いはずだ!
int *p[5] ←なんだよコレ、つかわねーよこんなの
0128デフォルトの名無しさん
2005/07/28(木) 13:24:46PINT p[5];とint *p[5];は等価。
0129デフォルトの名無しさん
2005/07/28(木) 13:27:400130デフォルトの名無しさん
2005/07/28(木) 13:58:17そこは仮引数だからargvはchar **と等価。
0131デフォルトの名無しさん
2005/07/28(木) 16:25:06それ書くのがめんどくさいんだよねー。
0132デフォルトの名無しさん
2005/07/28(木) 16:45:23それだと普通の二次元配列と同じレイアウトにはならない
まあC++ならvector<vector<int> >を使うかclass Matrixでも
定義するかだろ
0133デフォルトの名無しさん
2005/07/28(木) 18:24:13それでも普通の二次元配列と同じレイアウトにはならない
0134デフォルトの名無しさん
2005/07/28(木) 18:57:570135デフォルトの名無しさん
2005/07/29(金) 03:39:04p = new int [5][8];
cでいう
int** p
しか作れんのじゃなかったっけ
0136デフォルトの名無しさん
2005/07/29(金) 03:40:200137デフォルトの名無しさん
2005/07/29(金) 11:23:49int 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 のバグでしょうか?
0138デフォルトの名無しさん
2005/07/29(金) 12:36:29その for ループでは i64 は最終的に 0x8000000000000000 になる。
十進数に直すと -9223372036854775808。
何が不満なの?
0139デフォルトの名無しさん
2005/07/29(金) 12:37:42よく嫁
0140デフォルトの名無しさん
2005/07/29(金) 12:45:49読んでもわからんから、何が不満なのか訊いているんだが。
0141デフォルトの名無しさん
2005/07/29(金) 12:47:06ってことだろ?
0142デフォルトの名無しさん
2005/07/29(金) 12:49:12ああ、そういうことか。
・・・再現できねえ。
0143デフォルトの名無しさん
2005/07/29(金) 15:18:39std::coutの実装が違うとしか答えられんな。
STLport導入しても同様の結果か?
VC6.0 + STLportならvctkと同じ結果だったが。
0144デフォルトの名無しさん
2005/07/29(金) 20:12:40std::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関数
0145デフォルトの名無しさん
2005/07/29(金) 20:15:29うちでもBCC5.6.4では同じ結果が出る。
>>143
BCC5.6.4のSTLはSTLport4.5.3のカスタマイズ版で、おそらく
_int64に対する ostream& operator<< のオーバーロードに
不具合があるのだろう。
0146デフォルトの名無しさん
2005/07/29(金) 20:24:200147デフォルトの名無しさん
2005/07/30(土) 00:36:09ライブラリの1関数にCの関数を引数として渡す物があるのですが、
それにC++のクラスメソッドを渡すにはどう指定すればいいんでしょうか?
そのまま渡すとコンバート出来ないとコンパイルでエラーになってしまいます。
0148デフォルトの名無しさん
2005/07/30(土) 00:38:25無理。
そのコールバックに追加の引数を渡せる仕組みがあるなら、似たようなことは出来る。
0149デフォルトの名無しさん
2005/07/30(土) 00:42:41型変換できないってエラーが出たんだから、型をあわせてやると良いよ。
0150デフォルトの名無しさん
2005/07/30(土) 00:43:06staticなメンバ関数なら渡せるんで内科医?
0151デフォルトの名無しさん
2005/07/30(土) 00:51:52え、無理なんですか?
>>149
型を合わせてもダメなんです。
関数でコンパイル通るものをそのままクラスのメソッドにしてます。
>>150
それはやってみましたが、ダメみたいです。
0152デフォルトの名無しさん
2005/07/30(土) 00:55:57> 型を合わせてもダメなんです。
型を合わせたんなら「コンバートできない」なんて言われるわけ無いだろ。
非staticメンバ関数の型は見た目と違うから気をつけろ。
0153デフォルトの名無しさん
2005/07/30(土) 01:04:24うーん、そうなんですか。
例えばvoid func(char* buffer, unsigned int length)
という関数を渡す場合だと、普通の関数ではそのままでOKで、
クラスメソッドにする場合は何かを付けないといけないのでしょうか?
よかったらそれを教えてもらえませんか?
0154デフォルトの名無しさん
2005/07/30(土) 01:11:05例えば、そのfuncがclass testのメンバ関数だとすると、funcへのポインタの型は
void (test::*)(char *, unsigned int)
になって、
void (*)(char *, unsigned int)
とは違うし、前者を後者に変換することはできない。
>>152がどういう意味で「型をあわせろ」と言ったのか知らんが。
0155デフォルトの名無しさん
2005/07/30(土) 01:46:53どうもです。
やっぱり出来ないんですか。
他の方法を検討してみます。
ありがとうございました。
0156デフォルトの名無しさん
2005/07/30(土) 02:04:20こんな感じ
#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;
}
0157デフォルトの名無しさん
2005/07/30(土) 08:36:53取ろうとしているのですが、親から読み出そうとするときに止まってしまう時があります。
ファイルディスクリプタをfdopenで開いてfgetsで読み出してるんですが、その部分
で止まっているのでeofまで読めていないのかな、とも思ってるんですが…。
こういう時って、どうするのでしょうか?。UNIX依存の話で申し訳ないのですが、
どなたかご教授ください。
下にテストに使ったの最小構成のプログラムを載せます。
0158デフォルトの名無しさん
2005/07/30(土) 08:39:46{
return 0;
}
0159157
2005/07/30(土) 08:52:31アップローダにupしました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/819.c
0160157
2005/07/30(土) 08:54:51(標準出力/エラー出力を出すような)適当なコマンドを作って、実行用の
関数に与えています。
0161デフォルトの名無しさん
2005/07/30(土) 10:41:25FILE * fp = fopen("/bin/sh 2>&1", "r");
じゃだめなんだろか。
それはそうと、Unixプログラミングスレに行った方がよさそうだね。
0162デフォルトの名無しさん
2005/07/30(土) 10:51:14ありがとうございます。
よく分かりました。
0163157
2005/07/30(土) 10:53:03> 161さん
アドバイスありがとうございます。
UNIXプログラミングスレであらためて質問したいと思います。
ところで、これって何をやってるのか理解できない私なのですが、
> FILE * fp = fopen("/bin/sh 2>&1", "r");
shの標準出力とエラー出力を読むfpを確保しているのでしょうか。
0164157
2005/07/30(土) 10:53:46ハズカシイ
0165デフォルトの名無しさん
2005/07/30(土) 10:59:05#いかんなぁ、頭がやられているらしいw
0166157
2005/07/30(土) 11:04:09標準出力と標準エラー出力を別々に読み出したいのでpipeを使っています。
popenだとそれはできない、という認識です。
・・・う、不安になってきたのでpopenについて調べてみます。
0167デフォルトの名無しさん
2005/07/30(土) 13:56:30「クラスメソッド」って言ったら C++ では static メンバ関数に相当するものじゃないの?
後、C の関数だと渡せるのに static メンバ関数にしたら渡せないなんてあり得るの?
ソース見せて欲しい。
0168デフォルトの名無しさん
2005/07/30(土) 13:58:02147の言うクラスメソッドは非メンバ関数のことだろ。
0169デフォルトの名無しさん
2005/07/30(土) 14:15:120170デフォルトの名無しさん
2005/07/30(土) 17:36:030171デフォルトの名無しさん
2005/07/30(土) 18:07:15コンパイラ側で定義されてる型
char int short long float double等
0172デフォルトの名無しさん
2005/07/31(日) 13:08:37c = "abc";
これは良いのに、
char* c;
c = 'a';
これがだめなのは何故ですか?
0173デフォルトの名無しさん
2005/07/31(日) 13:09:55{
switch(iWhat) {
case WHAT_INT: return &m_int;
case WHAT_CHAR: return &m_char;
case WHAT_INTERFACE: return &m_interface;
}
}
のような任意型を返す場合、templateは使えますか?
0174デフォルトの名無しさん
2005/07/31(日) 13:16:49'c'はただの定数。ポインタに代入してどうする。
"abc"なら領域が確保されてchar *cがそこを指すポインタって事になる。
>>173
void*で返せばよくね?
0175デフォルトの名無しさん
2005/07/31(日) 13:39:03template による型の解決はコンパイル時の処理だから、実行時に型が変わる場合には対応できない。
動的に型が変わることがなく、インタフェースを統一したいだけなら
template<typename T>
T* DataClass::GetPointer(void);
で、GetPointer<int>() みたいにはできるだろうが。
本当に任意型が欲しいなら boost::any でも使えば?
0176デフォルトの名無しさん
2005/07/31(日) 21:40:21system()を使いたいんですが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と決まっています。
0177デフォルトの名無しさん
2005/07/31(日) 21:49:03>system()を使いたいんですがlinux上では"./"がいりますがwin上では"./"がいらないので
winって"./"あるとまずいんだっけ?
>>176
>main関数にバイナリデータを渡す方法はありませんか?
popen
0178デフォルトの名無しさん
2005/07/31(日) 21:59:41type ./hoge.txt
ってやったら構文エラーがでるようだ。
type .\hoge.txt
なら通るけどな。system()の場合はどうだろうなぁ。
0179デフォルトの名無しさん
2005/07/31(日) 22:04:42>'.' は、内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。
といわれてしまいます。
popen()の紹介ありがとうございました。
0180デフォルトの名無しさん
2005/07/31(日) 22:10:55>179のようなメッセージが表示されてしまいます。
0181デフォルトの名無しさん
2005/07/31(日) 22:14:400182デフォルトの名無しさん
2005/07/31(日) 22:27:01#define PASS
#elif defined UNIX
#define PASS ./
#endif
sprintf(ss, #PASS "./main.exe");
とか安易に考えてみたけど無理?
0183デフォルトの名無しさん
2005/07/31(日) 22:55:14どうせやるなら
#ifdef WINDOWS
# define DIR "\\"
#elif defined UNIX
# define DIR "/"
#endif
system("." DIR "main.exe");
で委員ジャマイカ?
0184デフォルトの名無しさん
2005/07/31(日) 23:57:13#include
だと/でいいんだよね
正直キモい
0185デフォルトの名無しさん
2005/08/01(月) 00:03:16#という無法を言ってみるテスト。
0186デフォルトの名無しさん
2005/08/01(月) 08:47:11逆にURLを\にして動くのもきもい。
http:\\www.google.co.jp\
0187デフォルトの名無しさん
2005/08/01(月) 09:15:510188デフォルトの名無しさん
2005/08/01(月) 09:20:410189デフォルトの名無しさん
2005/08/01(月) 09:26:250190デフォルトの名無しさん
2005/08/01(月) 11:35:41が有ったはずですが、関数名教えてください。
wtombみたいな。
0191デフォルトの名無しさん
2005/08/01(月) 11:38:00wctomb() / wcstombs()
「2バイト文字」じゃなくてwchar_tだけどな。
0192デフォルトの名無しさん
2005/08/01(月) 12:29:44バイナリエディタで書き換える事ができるのでしょうか?
実行可能ファイル中でウィンドウ名とクラス名の文字列そのものを
検索しても全くヒットしませんでした(´Д⊂
0193デフォルトの名無しさん
2005/08/01(月) 14:02:25文字列だからそれをどう持っているかはそのソフトによる。
究極的にはバイナリエディタでできるはずだけど、何らかの暗号化をしている可能性もあるし、
UPXなどで実行ファイルが圧縮されている可能性もある。
0194デフォルトの名無しさん
2005/08/01(月) 21:27:560195デフォルトの名無しさん
2005/08/01(月) 21:30:240196デフォルトの名無しさん
2005/08/01(月) 21:31:14仮想関数等の関係で多少増えるけど気にするレベルじゃない。
メンテや再利用等のメリットの方が遙かに大きい。
0197デフォルトの名無しさん
2005/08/01(月) 21:33:05メモ帳でできる文書を Word で作ったら時間や負荷がかかるものなんでしょうか?
0198デフォルトの名無しさん
2005/08/01(月) 21:37:30その前にUNIXで.exeって気持ち悪いよ。
0199デフォルトの名無しさん
2005/08/01(月) 22:29:31俺は常にC++だ。Better Cだ。C99相当の機能もある。
CにできてC++にできないことなどない。STLやiostream/basic_stringはかなり便利だ。
もちろんこんなときにはオブジェクト指向なんて使わない。
>>197
CとC++(OO抜き)の違いはメモ帳とテキストエディタ程度でしかない。
JavaやC#のほうがWordに近い、って言うとJavaやC#の人に怒られそうだ。せいぜいワードパッドくらいか。
やはりC++こそプログラミング言語のWordか。
0200デフォルトの名無しさん
2005/08/01(月) 23:46:20実行形式拡張子の規定など無いのにexeが気持ち悪いとか言う方が気持ち悪いよ
0201デフォルトの名無しさん
2005/08/01(月) 23:50:37規定があれば気持ち悪いなんて書かないよ。
どうしようも無いんだから。
0202デフォルトの名無しさん
2005/08/01(月) 23:51:05あきれるね
0203デフォルトの名無しさん
2005/08/01(月) 23:54:06http://www.kumei.ne.jp/c_lang/bcc/bcc_02.htm
のサイトに書かれているようなファイルの作り方が分かりません。
0204デフォルトの名無しさん
2005/08/01(月) 23:55:190205デフォルトの名無しさん
2005/08/01(月) 23:56:51「メモ帳で次のように打ち込みます。」
って書いてあるけど。
メモ帳も扱えんのかお前は。
と、釣られてみるテスト。
0206デフォルトの名無しさん
2005/08/02(火) 00:09:250207デフォルトの名無しさん
2005/08/02(火) 00:13:450208デフォルトの名無しさん
2005/08/02(火) 00:16:31ヘルプで検索してみたけど見つからない・・・orz
0209デフォルトの名無しさん
2005/08/02(火) 00:18:370210デフォルトの名無しさん
2005/08/02(火) 00:19:520211デフォルトの名無しさん
2005/08/02(火) 00:20:58屁理屈いうな禿げ
0212デフォルトの名無しさん
2005/08/02(火) 00:26:27今時の若い者はコマンドプロンプトの使い方もわからないのか
わからない単語が出てきたら、まずは自分で調べろ。
説明書見るとか、ググってみるとか、いろいろ方法あるだろ。
それでもわからなかったらココに書け。
自分で調べもしないで人に質問するな。
というわけで>>208よ、まずは「コマンドプロンプト」でググれ。話はそれからだ。
0214デフォルトの名無しさん
2005/08/02(火) 00:33:34屁理屈も理屈なのであって、論破できない論理的弱者が使う言葉。
矛盾のない論理の世界に生きる人間であるプログラマが使う言葉では
ない。以後慎んだ方が自分の品位を保てるというもの。
0215デフォルトの名無しさん
2005/08/02(火) 00:38:170216デフォルトの名無しさん
2005/08/02(火) 00:43:450217デフォルトの名無しさん
2005/08/02(火) 01:01:55屁理屈いうなハゲ
0218デフォルトの名無しさん
2005/08/02(火) 01:06:340219デフォルトの名無しさん
2005/08/02(火) 02:16:55妄言。
0220デフォルトの名無しさん
2005/08/02(火) 03:46:080221デフォルトの名無しさん
2005/08/02(火) 13:37:06あるいは正確な理屈と、それとは実は何も関係ない個人の嗜好。
この組み合わせが屁理屈の肝だな。
>>200は後者。
0222デフォルトの名無しさん
2005/08/02(火) 14:22:35200の方が正しい。
0223デフォルトの名無しさん
2005/08/02(火) 14:42:560224デフォルトの名無しさん
2005/08/02(火) 14:47:15気分の問題に正しいもくそもあるか
おまえはUNIXで*.exeでもつかっとけ
0225デフォルトの名無しさん
2005/08/02(火) 14:53:190226デフォルトの名無しさん
2005/08/02(火) 15:08:04ちゃんと*をつけてるあたりがかわいらしいなw
0227デフォルトの名無しさん
2005/08/02(火) 15:40:56クラスのメンバ変数にしたいので、↓のように書きました。
private:
void (*m_pFunc)(UINT);
これは一応コンパイルを通りました。
(一応動いてはいるようですがこの書き方で正しいのでしょうか?)
さらにこのポインタを別のクラスなどから取得する為に
Get〜みたいな関数を作りたいのですが、どうやって書けばよいのでしょうか?
0228デフォルトの名無しさん
2005/08/02(火) 16:20:10CからFORTRANのサブルーチンに生の数字を渡したいのです。
たとえば
--main.c---
main{
fsub_(12);
}
--fsub.f---
subroutine fsub(i)
write(*,*)i
return
end
みたいに12という数字を代入なしに渡したいのです。
どんなもんでしょか。
0229デフォルトの名無しさん
2005/08/02(火) 16:27:45あなたが使っているCとFortranの仕様はあなた以外に知らないのですから、
どんなコンパイラを使っているか、通常はどうやって渡しているか、などの情報無しには
何のアドバイスも得られないと思うのです。
#つーか、普通に渡せると思うんだけどねぇ。
0230デフォルトの名無しさん
2005/08/02(火) 16:47:20激しく使ってますが何か?w
0231228
2005/08/02(火) 16:52:48f77 main.c fsub.f
で出来たa.outを実行すると
セグメンテーション違反になります。
うーーん、i=12;とか代入したものを渡すとうまくいくんですけど。。
0232デフォルトの名無しさん
2005/08/02(火) 16:52:54typedefすれば使う側にとっても親切だしわかりやすい。
public:
typedef void (*Func)(UINT);
Func GetFunc() const throw() {return m_pFunc;}
private:
Func m_pFunc;
0233デフォルトの名無しさん
2005/08/02(火) 17:04:50もう少しソースを晒せないかな。
i = 12; fsub_(i); なら巧くいくってこと?
そのiの型は整数型?
最早忘れたけど、Fortranって参照渡しだったっけ?
だとしたら、値を格納する場所が必要になるから即値を渡すことは不可能だね。
0234デフォルトの名無しさん
2005/08/02(火) 17:12:330235228
2005/08/02(火) 17:13:33int i; i = 12; fsub_(i);
だとうまくいきます。
やっぱり代入必須っぽいですね・・。
0236デフォルトの名無しさん
2005/08/02(火) 19:08:11そのfsub_のプロトタイプはどこかに{作った|生成された}のかな?
普通のCコンパイラなら、仮令一旦代入しても値を積んじゃうと思うけど。
#だから環境はできるだけ晒してくれた方が早いのさ。
0237デフォルトの名無しさん
2005/08/04(木) 05:17:23ありがとうございました。
typedefしたら混乱しないで書けるようになりました。
ところでまた質問なのですが、
関数宣言の後のconst throw() っていうのが始めてみる書き方なんですが、
どういう意味があってどういう場合に用いるのでしょうか?
0238デフォルトの名無しさん
2005/08/04(木) 08:12:45constと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する。
0239194
2005/08/05(金) 13:15:01最近C++を勉強し始めたのですが、Cのほうが速いのだったらC++は使わないほうがいいかなと思ってました。
あんまり差がないそうなのでC++を引き続き勉強します。
ありがとうございました。
0240デフォルトの名無しさん
2005/08/05(金) 14:09:01処理速度だけが問題ならC++どころかCも使わずにアセンブラでも使えばいい。
速度的に疑問の残るJavaやVBが実務に使われていることからも処理速度だけが問題でないことはわかるだろう。
寧ろ勉強中のレベルなのであれば、プログラミングを身につけるためには
処理速度云々で言語を選ぶべきではない。
0241デフォルトの名無しさん
2005/08/05(金) 15:52:400242デフォルトの名無しさん
2005/08/05(金) 16:01:300243デフォルトの名無しさん
2005/08/05(金) 16:05:57char buffer[1024];
while((fgets(buffer,1024,f)!=NULL);
fclose(f);
printf("%s\n",buffer);
0244デフォルトの名無しさん
2005/08/05(金) 20:19:22また、2 つ目の + は何を表してますか?
c+ じゃいけなかったんですか?
0245デフォルトの名無しさん
2005/08/05(金) 20:30:240246デフォルトの名無しさん
2005/08/05(金) 21:29:510247デフォルトの名無しさん
2005/08/05(金) 22:48:440248デフォルトの名無しさん
2005/08/05(金) 22:55:220249デフォルトの名無しさん
2005/08/05(金) 22:56:020250デフォルトの名無しさん
2005/08/05(金) 23:00:580251デフォルトの名無しさん
2005/08/05(金) 23:03:490252デフォルトの名無しさん
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(なんちゃら));
みたいにやるのか?
どなたか丁寧にお教えください〜
0253デフォルトの名無しさん
2005/08/05(金) 23:49:13向こうで答えてくれてる人がいるぞ。
あと、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) の意味の無さっぷりに感動したことは付け加えておく。
0254デフォルトの名無しさん
2005/08/06(土) 00:07:07マルチしてる奴に答えるな
あっちこっちに書けばいっぱい答えが返ってくると勘違いするだろ
0255デフォルトの名無しさん
2005/08/06(土) 00:12:20マルチじゃなくて誘導されただけだろ?
0256デフォルトの名無しさん
2005/08/06(土) 00:15:220257デフォルトの名無しさん
2005/08/06(土) 00:20:440258デフォルトの名無しさん
2005/08/06(土) 00:36:59http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/844.txt
もしmain()以外関数作成禁止だったらころすよ。
0259デフォルトの名無しさん
2005/08/06(土) 00:38:17こんなとこでスレを無駄に使われても困るので>252はここにでも行ってくれ、
解決方法はここのHPに詳しく載ってる。
ttp://www2s.biglobe.ne.jp/~k5855/tag_03/index_tag03.html
0260デフォルトの名無しさん
2005/08/06(土) 00:45:56すみませんコンパイルの仕方がわかりません…
0261デフォルトの名無しさん
2005/08/06(土) 09:25:510262前スレ816
2005/08/06(土) 16:42:300263デフォルトの名無しさん
2005/08/06(土) 16:42:510264デフォルトの名無しさん
2005/08/06(土) 19:23:21コンパイルも分からんとよく書いてるな・・・
0265デフォルトの名無しさん
2005/08/06(土) 19:40:18脊髄レスはいかがなものかと
0266デフォルトの名無しさん
2005/08/06(土) 20:53:26private:
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];にするとなぜか通るんです。
どうしてでしょうか?
0267デフォルトの名無しさん
2005/08/06(土) 20:58:560268デフォルトの名無しさん
2005/08/06(土) 20:59:17何を言っても分かるまい
0269デフォルトの名無しさん
2005/08/06(土) 21:00:34ごめんなさい。忘れてました。
VC2003です。
0270デフォルトの名無しさん
2005/08/06(土) 21:05:49>>268
0271デフォルトの名無しさん
2005/08/06(土) 21:13:10答えようがない
0272デフォルトの名無しさん
2005/08/06(土) 21:15:180273デフォルトの名無しさん
2005/08/06(土) 21:22:33読んでますよ。
要は、コンパイラは__m128が定義されていないと思ってるってことですよね。
でもVC2003において__m128は基本データ型と同様に使用可能なはずですよね。
ためしにクラス定義の直前に適当な構造体を定義して__m128 v;と置き換えても
ちゃんと通りました。
>>271
__m128はSSEで使用する128bitのデータ型です。
0274デフォルトの名無しさん
2005/08/06(土) 21:30:15>>268
0275デフォルトの名無しさん
2005/08/06(土) 21:31:10#include <xmmintrin.h>
0276デフォルトの名無しさん
2005/08/06(土) 21:34:180277276
2005/08/06(土) 21:42:060278デフォルトの名無しさん
2005/08/06(土) 21:45:34どうやら無名共有体と同じように普通に外からアクセスできるようです。
0279デフォルトの名無しさん
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 {}のタグ名ってかかないのか?
0280デフォルトの名無しさん
2005/08/06(土) 22:48:46Cでは不要。C++では必要になる場合もある
親切な人(=できる人[俺定義])はタグ名を書く
0281デフォルトの名無しさん
2005/08/06(土) 22:57:350282デフォルトの名無しさん
2005/08/06(土) 22:58:50>あとさあ、struct {}のタグ名ってかかないのか?
え? 書いてあるじゃん。
0283デフォルトの名無しさん
2005/08/06(土) 23:48:370284デフォルトの名無しさん
2005/08/06(土) 23:59:56それがゲイツクォリティ
0285デフォルトの名無しさん
2005/08/07(日) 00:50:52たとえばヘッダファイルで
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のサイズを取得する方法はありませんか?
0286デフォルトの名無しさん
2005/08/07(日) 00:56:43単にメモリを無駄に使いたくないというなら、
struct foo *p_foo;
size\t size = sizeof(foo->name);
でいけるんじゃねーかな。ポインタ分のメモリは必要だが。
0287デフォルトの名無しさん
2005/08/07(日) 00:56:54関数ってどんな関数だよ。
想像で
要するに
文字列に対して何らかの処理を行う関数を作りたい。
サイズを得る必要があるらしいから、書き込みの操作。
えっとね、素直に関数の引数にchar配列のサイズを渡してやりなさい。
呼び出し側でsizeof使ってやればよし。
0288デフォルトの名無しさん
2005/08/07(日) 00:59:51struct foo{
char name[N];
で我慢
0289デフォルトの名無しさん
2005/08/07(日) 01:00:28int size = sizeof(((struct foo*)0)->name);
処理系によってはアクセス違反で落ちるか?
VC7は平気だった。
0290デフォルトの名無しさん
2005/08/07(日) 01:01:32そのへん意味茄子。
0291デフォルトの名無しさん
2005/08/07(日) 01:02:00void func( void ) {
struct foo a;
printf( "%d\n", sizeof(a.name) );
}
としてもaはpushされないよ。
気に入らないと言われたらそれまでだが。
0292デフォルトの名無しさん
2005/08/07(日) 01:02:55GNUのソースで何回か見たな
0293デフォルトの名無しさん
2005/08/07(日) 01:02:580294デフォルトの名無しさん
2005/08/07(日) 01:03:55通常sizeofでサイズ取るだけなら実際にヌルポインタに対して読み書きの操作は発生しないから平気だわな。
0295デフォルトの名無しさん
2005/08/07(日) 01:05:47compound literalが使えるなら使えばいいし、そうでない場合、
static struct f func(void); /* 架空の関数 */
printf("%d\n", sizeof func().name);
処理系によってはリンクエラーになるかも。
0296デフォルトの名無しさん
2005/08/07(日) 02:11:35出来るだけ、OS依存にはしたくないのですが。
0297デフォルトの名無しさん
2005/08/07(日) 02:13:41まあ、できるならOS依存とか難いこといわずにマクロで切り分けてQueryPerformanceCounterつかっとき。
0298デフォルトの名無しさん
2005/08/07(日) 11:30:020299デフォルトの名無しさん
2005/08/07(日) 13:37:53今までずっと>>289の方法しかないかと思っていた
(コンストラクタつきclassだと、>>291が使いにくい/使えない)が
どうやら>>295の変形で
extern struct foo bar;
printf("%d", sizeof(bar.name));
だと大丈夫っぽい。
VC,bcc,gccだと定数をpushしてるし、リンクエラーもでなかった。
0300デフォルトの名無しさん
2005/08/07(日) 14:06:29急遽VisulStudioを使わなければいけなくなってしまいました。
そこで今一番悩んでいることがどうやって引数を渡せばよいのかということです。
試しに以下のプログラムを「開始」というのを選んで実行しているのですが、
もちろん引数を渡していないのでnullが返ってきます。
include <stdio.h>
int main(int argc, char* argv[])
{
printf("%s\n",argv[1]);
return 0;
}
なんかアフォみたいな質問ですがマジでどうすればよいのか分かりません。
よろしくお願いします。
0301デフォルトの名無しさん
2005/08/07(日) 14:09:39IDEのことなら「実行時引数の指定」とかそんなのがメニューにないか?BCBはあるけど
0302デフォルトの名無しさん
2005/08/07(日) 14:18:102003ならメニューバーのプロジェクトか、ソリューションエクスプローラからプロジェクトののプロパティを開いて、
構成プロパティのデバッグのところにある動作グループのコマンド引数から設定できる。
0303デフォルトの名無しさん
2005/08/07(日) 14:26:16カレントディレクトリまで移動しておけばいいじゃない
0304デフォルトの名無しさん
2005/08/07(日) 14:34:45お蔭様でなんとか引数を渡す事ができるようになりました。
実行時に渡すのではなくて、事前に決めておくということですね。
勉強になりました。
0305デフォルトの名無しさん
2005/08/07(日) 14:36:08俺はさっぱりわからん。
独学で情報系でもないから
情報処理試験でも前期はのりこえても後期試験があと少しでおちちゃう。
0306デフォルトの名無しさん
2005/08/07(日) 14:56:36普通に変数使うのとどう違うんですか?
0307デフォルトの名無しさん
2005/08/07(日) 15:00:480308デフォルトの名無しさん
2005/08/07(日) 15:06:57必要となるまで知らなくてもかまわない
>>307
やりたい事を詳しく
0309デフォルトの名無しさん
2005/08/07(日) 15:37:33Windowsなら↓あたり
ms-help://MS.PSDK.1033/dllproc/base/creating_a_child_process_with_redirected_input_and_output.htm
0310デフォルトの名無しさん
2005/08/07(日) 16:00:41関数にサイズの大きい構造体とか渡す時にポインタわたしの方が
サイズを小さく出来るので高速。例えばサイズが20バイト(sizeof(A)=20)の構造帯を
わたそうとしてもポインタなら整数と同じサイズで澄んでしまう。
但し、最適化を考えると、ポインタの多用は良くない。
コードを書く時の効率とか考えて適材適所で対応すべし。
0311デフォルトの名無しさん
2005/08/07(日) 16:02:27「最適化を考えると」って何のこと?
0312デフォルトの名無しさん
2005/08/07(日) 16:12:35popen
0313デフォルトの名無しさん
2005/08/07(日) 16:53:160314デフォルトの名無しさん
2005/08/07(日) 17:01:300315デフォルトの名無しさん
2005/08/07(日) 17:03:06FILE * fp = popen("ls", "r");
char buf[200];
while (fgets(buf, sizeof(buf), fp)) {
fputs(buf, stdout);
}
fclose(fp);
0316デフォルトの名無しさん
2005/08/07(日) 17:08:21便乗ですまんけどそれってWin32 GUIアプリでも利用可?
CreatePipe使ったいいサンプル探してるが見つからないorz
0317デフォルトの名無しさん
2005/08/07(日) 17:14:51Win32の処理系だとpopenはないと思う
0318デフォルトの名無しさん
2005/08/07(日) 17:18:100319デフォルトの名無しさん
2005/08/07(日) 17:21:560320デフォルトの名無しさん
2005/08/07(日) 22:42:29VC++.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 が未解決です。
0321デフォルトの名無しさん
2005/08/07(日) 22:49:120322デフォルトの名無しさん
2005/08/07(日) 22:58:52ありがとうございます
おかげさまでできました
調査不足てした
0323デフォルトの名無しさん
2005/08/07(日) 23:31:11お前のコンパイラはexport templateをサポートしているのかと小一時間
0324デフォルトの名無しさん
2005/08/08(月) 00:01:29#ifndef A_LABELみたいな。
0325デフォルトの名無しさん
2005/08/08(月) 00:09:401. 該当 typedef を行うヘッダでマクロを定義しておいて #ifdef
2. 1. でヘッダのインクルードガード用マクロで代用
3. Autoconf とか使って外部で判定してマクロ定義で切り替え
思いつくのはこんなもんだけど。
0326デフォルトの名無しさん
2005/08/08(月) 00:09:58すでにtypedefされてればエラーを出すと思うけど
typedef int foo;
typedef char foo;
とかってしてみればいいと思うよ、多分だけど
結果教えてね
0327デフォルトの名無しさん
2005/08/08(月) 00:14:32自民党 河野洋平 神奈川17区 - 売国奴。中国の飼い犬。日朝友好議連所属。
自民党 野田毅 比例九州 ----- 売国奴。中国の飼い犬。外国人参政権推進。日朝友好議連所属。
自民党 加藤紘一 山形3区 ---- 売国奴。中国の飼い犬。
自民党 古賀誠 福岡7区 ------ 野中の子分。人権擁護法案推進。
自民党 野田聖子 岐阜1区 ---- 古賀の子分。人権擁護法案推進。
自民党 二階俊博 和歌山3区 -- 売国奴。中国の飼い犬。人権擁護法案推進。江沢民の石碑建立。
0328デフォルトの名無しさん
2005/08/08(月) 06:52:000329デフォルトの名無しさん
2005/08/08(月) 07:35:340330デフォルトの名無しさん
2005/08/08(月) 07:39:580331デフォルトの名無しさん
2005/08/08(月) 09:41:45そこで、日にちを分けて実行しょうと思いましたが、スタックを復元する方法が分かりません。
知っている方がいれば教えてくさださい。環境は Linux/gcc です。
0332デフォルトの名無しさん
2005/08/08(月) 09:54:37一般的に、OSが動的に管理するものを一アプリケーションに云々はできません。
どうしても24時間運転できない、サスペンドできない、などの理由があるなら、
計算過程を保存するようなアルゴリズムに変更すべきかと。
0333デフォルトの名無しさん
2005/08/08(月) 10:11:27もちろん環境依存は承知です。絶対に無理というならアルゴリズム変更も考えますが
とりあえず待ってみます。
0334デフォルトの名無しさん
2005/08/08(月) 10:11:49位で検索すれば自前のスタックの作り方が載ってるでしょう。
がんがれ
0335デフォルトの名無しさん
2005/08/08(月) 10:17:18再起関数に与える引数を全部構造体でまとめておいて
ファイルなりにfwrite(), fread()で書き込み、読み出しする方法じゃないかな
0336デフォルトの名無しさん
2005/08/08(月) 15:38:070337デフォルトの名無しさん
2005/08/08(月) 18:33:52>> 一般的に、OSが動的に管理するものを一アプリケーションに云々はできません。
>もちろん環境依存は承知です。絶対に無理というならアルゴリズム変更も考えますが
つうか、332は別に「環境依存どうこう」という以前の話をしているはず。
だいたい「スタックを復元する方法」がわかっただけで解決できるつもりなのか?
いわゆる core imageを取るのことや解析は簡単だが、
そこから実行を再開させるような能力を自分が持ってるつもりなのか?
「絶対に無理」とは言わないが、洗練された方法があるわけでなし、まず、
こういう質問の仕方程度の人には、まず無理だと思うが。
まあ、条件のつけかたやら何やら思いつきの域を出ない、
問題の立て方自体を間違えている。
0338デフォルトの名無しさん
2005/08/08(月) 19:16:32acceptで10038のエラーコードが返ってきます。
参考にしているのは
ttp://www.geekpage.jp/programming/winsock/
なんですが、ここの通りにやっても10038が返ってきてしまいます。
クライアントではサーバーからのメッセージを受信できているので、
ソケットがうまく作れているものだと思っていたのですが、
10038がエラールックアップで
「ソケット以外のものに対して操作を実行しようとしました。 」
と出るので、わけがわかりません。
どうしてこうなってしまうのかどなたか教えてください。
よろしくお願いします。
0339デフォルトの名無しさん
2005/08/08(月) 20:29:32東大卒→ソニーの平均年収790万円
大卒サラリーマンの平均年収560万円
全サラリーマンの平均年収430万円
コピペしろ!
特定郵便局長の平均年収は920万円
http://money4.2ch.net/test/read.cgi/nenga/1094801504/
●●【世襲制】特定郵便局●●
http://money4.2ch.net/test/read.cgi/nenga/1080883369/
0340デフォルトの名無しさん
2005/08/08(月) 20:56:59それはもうだめかもしれんね。
0341デフォルトの名無しさん
2005/08/08(月) 21:13:21どういう意味ですか?
0342デフォルトの名無しさん
2005/08/08(月) 21:21:03あと、そもそも>>338が提示している情報が少なすぎる。
もっと具体的に、どうやってどうやった場合に10038が返ってくるのか書いて。
もしくはその部分のソースを提示するとよい。
0343デフォルトの名無しさん
2005/08/08(月) 21:28:16具体的に・・・と言っても、
サイトのソースをそのままコピペして実行してるだけなんですが、
10038が返ってきます。
ソースは
>TCPを使う(サーバ、エラー処理付き)
ttp://www.geekpage.jp/programming/winsock/tcp-3.php
そのままです。
「ネットワークプログラミング相談室 Port14」
の方で続きを聞いてみたいと思います。
0344デフォルトの名無しさん
2005/08/09(火) 01:34:14スワップを十分にとって(Linuxだとスワップファイルが便利)
kill -STOP hoge
すると中断できる
使用頻度が低ければスワップアウトされる
再開は
kill -CONT hoge
0345デフォルトの名無しさん
2005/08/09(火) 11:24:210346デフォルトの名無しさん
2005/08/10(水) 08:35:36{
int x ;
int y ;
int z ;
}
という構造体をvectorにいれてソートしたいのですが、
vector<hoge> v ;
//いずれかのメンバで、降順か昇順かで、ソートしたい
sort(v.begin(), v,end(), ・・・) ;
メンバの数だけ関数オブジェクトを作るのがあまりにもあほらしいと思うのです。
もっとスマートな方法はありませんか?
0347デフォルトの名無しさん
2005/08/10(水) 08:54:18メンバへのポインタを関数オブジェクトに渡したらどう?
0349デフォルトの名無しさん
2005/08/10(水) 09:11:59class 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));
0350346
2005/08/10(水) 09:32:44おお、すごい。
こんなことができたんですか。
でも、ひとつ分からないのですが、
//hoge構造体の中のint型へのポインタ
int hoge::*mem ;
ですよね?
.* これはどういう意味でしょうか?
0351デフォルトの名無しさん
2005/08/10(水) 09:44:39メンバへのポインタでアクセスするための1つの演算子。
0352346
2005/08/10(水) 11:03:39なるほど、->*なんて演算子もあるんですか。
降順か昇順かの切り替えも、コンストラクタの引数で指定できました。
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)
もっとスマートな方法はありますか?
0353346
2005/08/10(水) 11:04:41○sort(v.begin(), v.end(), foo<char (hoge:: *)[32]>(&hoge::str) ;
0354デフォルトの名無しさん
2005/08/10(水) 11:18:340355デフォルトの名無しさん
2005/08/10(水) 11:23:49コンパイルできるかどうか試していないけどこんなのは?
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));
0356355
2005/08/10(水) 11:25:220357346
2005/08/10(水) 11:51:07VC7.1でコンパイル通りました。
これは使うときに楽ですね。
templateがらみのこういうテクニックはどうやって覚えればいいのでしょうか?
何かいい本とかありますか?
0358デフォルトの名無しさん
2005/08/10(水) 13:09:33つ[C++ Templates(英文)]
0359デフォルトの名無しさん
2005/08/10(水) 14:51:29template<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)));
0360359
2005/08/10(水) 15:08:32template<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専用である必要ないなぁ……
0361デフォルトの名無しさん
2005/08/10(水) 16:23:17素直に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));
0362346
2005/08/10(水) 16:53:12boostも面白そうですね。
いままでtemplateをほとんど理解していなかったから、
boostも理解できなかったんです。
でもこれ……本当にC++のコードなのか疑問に思えてしまいますけど。
>bind(&hoge::x, _1) < bind(&hoge::x, _2)
0363デフォルトの名無しさん
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;
0364デフォルトの名無しさん
2005/08/12(金) 14:43:05ヒープソートの「ヒープ」ってなんか関係あるんですか?
0365デフォルトの名無しさん
2005/08/12(金) 14:49:47同じ単語だけど、とくに関係はない。
前者は、「メモリのかたまり」という感じ。
後者は、「データが山の形になっている」という感じ。
0366デフォルトの名無しさん
2005/08/12(金) 18:38:17ありがとうございます。
追加で聞きたいんですが、mallocがヒープからメモリを取ってくる過程ってどうなってるんですか?
メモリがフラグメント化していた場合、どうやって大きな領域を確保するのかとか...
もちろんシステムによって違うんでしょうが、一般的な場合が知りたいんです。
このネット上のドキュメントとかあの本を参照しろ、でもいいのでお願いします。
0367デフォルトの名無しさん
2005/08/12(金) 19:30:21OSの設計に関する本を読め。
0368デフォルトの名無しさん
2005/08/12(金) 19:36:48ヒープってのは辞書引くと積み重ねたものとかそういう意味が出る。
0369デフォルトの名無しさん
2005/08/12(金) 21:05:40単純な構造で実現しようとするなら、デフラグは出来ない。
なぜなら、デフラグを行うと使用中のメモリ内容が移動してしまい、それに合わせて
プログラム内のすべてのポインタ変数を新しい正しい値に書き換えなければならない。
当然これは無理。せいぜい隣り合った空きエリアをくっつけるだけしかできない。
いまどきのOSは仮想メモリシステムを採用している。OSだけじゃなくチップレベルで
サポートしていたりする。ということは我々がプログラムで使っているポインタ(アドレス)
は仮想のものであり、物理的なメモリ番地とは直結しておらず、対応表を使って対応付
けられているだけ。ということは、物理メモリ上のデータを移動したとしても、それを追随
するように仮想アドレスと物理アドレスの対応表を書き換えるれば、あたかもデータの
移動は発生していないかのように見える。仮想メモリシステムの上でならメモリのデフラ
グも可能になる。
具体的には仮想メモリシステムの実装を調べてくれ。簡単な話じゃないよ。
0370デフォルトの名無しさん
2005/08/12(金) 21:29:49オナニーレス乙
0371デフォルトの名無しさん
2005/08/12(金) 22:33:40ライブラリ内でのヒープをページ単位でしか取得できないようにするスレはここですか?
0372デフォルトの名無しさん
2005/08/12(金) 22:45:13物理メモリをデフラグできても、仮想アドレスに連続した空きがないと確保できないという罠。
0373デフォルトの名無しさん
2005/08/12(金) 23:02:48Windowsに限って言うと、
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
今まで読んだ中では、これが一番分かりやすいかな。
0374デフォルトの名無しさん
2005/08/12(金) 23:05:23分かりにくいってレベルじゃない
分からないレベルだ
0375デフォルトの名無しさん
2005/08/12(金) 23:59:24HeadAllocは大きなメモリブロックの確保に使ってるだけかと思ってた。
ちなみにBCBでは独自管理してる(大きさ別に処理を分けている)。
メモリ確保のアルゴリズムにも
ファーストフィットとかベストフィットとかがあるので
どうやっているかは、まさしく実装依存。
で、実際にはmallocのソースを読むのが早い。
サンプル程度なら、
・K&R
・Cプログラマのためのアルゴリズムとデータ構造
・EffectiveC++(moreかも)
で読んだ覚えがある。
ちなみに、OS(カーネル)がどう管理しているかとかページ単位がどうというのは
CRTが管理しているヒープのフラグメントとはあまり関係ない話だから。
0376デフォルトの名無しさん
2005/08/13(土) 00:03:380377デフォルトの名無しさん
2005/08/13(土) 00:08:33頭の中ではHeapAllocのつもりだったのだが。
0378デフォルトの名無しさん
2005/08/13(土) 00:10:530379デフォルトの名無しさん
2005/08/13(土) 02:24:100380デフォルトの名無しさん
2005/08/13(土) 09:32:24さくらが咲いてますよ
0381366
2005/08/13(土) 10:44:35で、仮想メモリはコンパクションしたりしてそれを助ける、という感じですか。
0382デフォルトの名無しさん
2005/08/13(土) 11:52:09x86のWindowsだと仮想メモリのコンパクションはできないと思うんだが……。
フラグメント化というか、仮想メモリさえ連続していればいいわけで。
0383デフォルトの名無しさん
2005/08/13(土) 11:59:540384366
2005/08/13(土) 14:25:39といった空き場所探索はしない。
仮想メモリを使って対応付けているなら、物理メモリがフラグメント化していても問題ない。
大きな領域を確保する時でも、物理メモリ上で連続しているとは限らない。
これであってますか?
>>373のリンクは難しすぎます...これは、ここでの話を理解するのに必須なんですか?
0385デフォルトの名無しさん
2005/08/13(土) 14:51:33そう。あと物理メモリが確保されるのは、実際に使われるとき。
ヒープだけど、Windowsでメモリの確保は常にページ単位(x86なら4KB)で行われる。
でも、実際のプログラミングの際には、4KB単位でしか確保できないなんて面倒でしょ?
1バイトのメモリを確保しようとすると、もれなく4095バイトものおまけメモリがついてくる。
もちろん、そのまま使うこともできるけど、かなり無駄。
しかし、現実には、数十バイト、数百バイト単位で、なるべく無駄なくメモリを確保したい。
じゃあどうすればいいかというと、
メモリを確保するときは4KB単位で確保しておいて、
実際に使うときに、欲しいサイズ分だけ小分けにして使えばいい。
で、VC++のmallocが呼び出しているHeapAllocはこれを自動でやってくれる。
某ランドのCコンパイラは自前で実装しているんだったかな。
0386385
2005/08/13(土) 15:25:44見落としてた。
VC++のmallocは、「多分」している。
ページ単位で確保したバッファの中から、要求された長さのあいている空間を返すわけだから。
実際にはMSはヒープの実装を公開していないから、これは明言できない。
メモリの使用用途はどんどん変化していくから、OSごとに違った実装になる。
95の時代だと、一般的なPCの物理メモリは数十MBだったけど、
いまだとGB単位も珍しくないからね。
0387デフォルトの名無しさん
2005/08/13(土) 21:21:47alloc数回の結果ページが10単位取られたけど
freeの結果各ページ1バイトしか使ってないような状態になっちゃって
そこに新しいalloc(ページ9単位)の要求がきた時どうすんねんって話じゃないのけ?
0388デフォルトの名無しさん
2005/08/13(土) 21:47:17なんか勘違いして仮想記憶とかその辺の話にしようとしている人がいるけど
その方面の話はちょっと方向違い。
この、「フラグメントが起きた状態」からは、アルゴリズムも糞もない。
単に確保できないだけだから。
で、連続して確保できない場合は、結局、OSから新たにメモリブロックをもらって
そこから切り出すしかないわけ。
もちろん、OSがくれなかったら、NULLを返すなりbad_allocを投げるなりするんだけど。
ベストフィットやファーストフィットというのは、「いかにしてフラグメントを起きにくくするか」を、速度との兼ね合いでどうするかという、ポリシーの問題ね。
たとえばWindowsXPのHeapAllocは、このポリシーをユーザーから設定できるらしい。
http://www.geocities.jp/i96815/windows/win11.html
0389デフォルトの名無しさん
2005/08/14(日) 07:49:560390デフォルトの名無しさん
2005/08/14(日) 08:13:08その前にネットワークプログラミングがちゃんと理解できる?
関数1-2個でポンという訳にはいかないよ
0391デフォルトの名無しさん
2005/08/14(日) 09:49:420392366
2005/08/14(日) 10:22:29物理アドレスは解放後再利用する必要がありますが、仮想アドレスは解放しても再利用の必要はありませんよね。
それはHeapAlloc、HeapFreeの場合でも同じに思えたのですが。
だから>>366では「仮想メモリ上でフラグメントが起きても、わざわざ仮想アドレス上で隙間を探す必要はなく、
まだ手を付けていない仮想メモリ空間を使用すれば良いだけだ」と考えたんですが、それでは駄目なんでしょうか?
「メモリアドレスの型の制限で1プロセス仮想で4GBまでしか使えない」ってところがネックになっているんでしょうか。
0393デフォルトの名無しさん
2005/08/14(日) 10:23:53× >>366では
○ >>384では
すいません
0394デフォルトの名無しさん
2005/08/14(日) 10:33:20HeapAllocの呼び出しの度に、カーネルモードに移行して
ページテーブルを設定して、CR4を読み直してTLBをフラッシュして・・・
ということが行われていると思っていますか?
HeapAllocはもちろん、普通のmallocも、
実際に自身が管理しているメモリで足りないという事態が起きない限り
OSに対してメモリブロックは要求しないし、だからカーネルモードへの移行も起きないし、当然ページテーブルも仮想記憶も何の関係もないのですよ。
OSからのメモリの獲得は重い処理なので、それを軽くするためにユーザー空間で
malloc等がメモリブロックを管理しているんですよ。
この辺はわざわざOSの本を読むまでもなく、K&R等にも書いてありますが。
0395デフォルトの名無しさん
2005/08/14(日) 11:52:46無い、RFCとにらめっこするしかない
素直にソケット使いなさい
0396デフォルトの名無しさん
2005/08/14(日) 12:05:28また、クラスBの中から、クラスAのメンバ関数を呼び出したい。
こういうときはどうすればいいんでしょうか。
class A
{
B *b_ptr ;
} ;
class B
{
A *a_ptr ;
} ;
これは無理ですよね。
どうすればいいんだろう。
0397デフォルトの名無しさん
2005/08/14(日) 12:09:560398デフォルトの名無しさん
2005/08/14(日) 12:12:250399デフォルトの名無しさん
2005/08/14(日) 12:35:24これでいい。
class B;
class A
{
B *b_ptr ;
} ;
class B
{
A *a_ptr ;
} ;
0400デフォルトの名無しさん
2005/08/14(日) 12:36:050402331
2005/08/14(日) 15:11:02http://www.checkpointing.org/
導入が簡単なのはここです。
http://www.cs.wisc.edu/~zandy/ckpt
0403デフォルトの名無しさん
2005/08/16(火) 16:23:15typedef 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を期待しています。
構造体のメンバの順番が入れ替わってしまうのはどういう現象なんでしょうか?
ググルにも現象名がわかりません。
教えてください。
0404デフォルトの名無しさん
2005/08/16(火) 16:27:170405デフォルトの名無しさん
2005/08/16(火) 16:28:04リトルエンディアン
0406デフォルトの名無しさん
2005/08/16(火) 16:29:49環境は?
0407デフォルトの名無しさん
2005/08/16(火) 17:21:44ありがとうございます。
リトルエンディアンはデータ通信時だけ発生するものと思い込んでいました。
0408デフォルトの名無しさん
2005/08/16(火) 18:04:25リトルエンディアンって・・・
0409デフォルトの名無しさん
2005/08/16(火) 18:05:450410デフォルトの名無しさん
2005/08/16(火) 18:05:51現在のPCなら普通リトルエンディアンだぞ
0411デフォルトの名無しさん
2005/08/16(火) 18:22:10typedef struct{
short b;
short a;
}test_str;
で>403の望む結果にならない?
0412デフォルトの名無しさん
2005/08/16(火) 18:23:30int TextInfo(char *file, int flag, const char *format,...)
って関数があったんですがchar* formatの次の.....ってなんですか?
はじめて見るんですが、引数になるんですかこれ?
0413デフォルトの名無しさん
2005/08/16(火) 18:26:15可変長引数。
printfの関数宣言見てみ。
0414デフォルトの名無しさん
2005/08/16(火) 18:27:45結果
=>34127856
リトルエンディアン様様だね
0415デフォルトの名無しさん
2005/08/16(火) 18:28:34レスありがとうございます
さっそく調べてみます
0416デフォルトの名無しさん
2005/08/16(火) 18:30:10だから?
0417デフォルトの名無しさん
2005/08/16(火) 18:35:04それで?
0418デフォルトの名無しさん
2005/08/16(火) 18:35:34ついでに
va_start、va_arg、va_endも調べておくと吉
0419デフォルトの名無しさん
2005/08/16(火) 18:35:46ソースちゃんと見ろよ?
0420デフォルトの名無しさん
2005/08/16(火) 18:38:16あわてんぼさん♪
0421403
2005/08/16(火) 18:50:18test_str g:のデータはメモリ上
78563412の順で配置されているんですよね。
それが何故
56781234になるのですか?
0422デフォルトの名無しさん
2005/08/16(火) 18:54:15違うね。
メモリ上は 0x34 0x12 0x78 0x56 だ。
だから下から順に 0x56781234 となる。
0423デフォルトの名無しさん
2005/08/16(火) 18:54:38ノン。56781234。
0425403
2005/08/16(火) 19:03:29メモリ上は 0x34 0x12 0x78 0x56なんですね。
TPつくって確認しました。
もしもint a=0x12345678をメモリに格納する場合は
0x78,0x56,0x34,0x12となるんですね。
0426デフォルトの名無しさん
2005/08/16(火) 19:06:28uint16_t a;
uint16_t b;
} test_str = {0x1234, 0x5678};
と
uint32_t test32 = 0x12345678;
ではメモリ上のデータ並びが違うぞ。
エンディアンは組み込み型にのみ適用される。
構造体のメンバがひっくり返ることはない。
0427デフォルトの名無しさん
2005/08/16(火) 19:10:26いえす
>>426
誰に言ってんだ?
0428403
2005/08/16(火) 19:22:14なんとなく理解できたので、復習して完璧にします。
ありがとうございました。
0429デフォルトの名無しさん
2005/08/16(火) 19:36:14今更だが、もともと安易に人に聞くより、自分で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));
}
0431デフォルトの名無しさん
2005/08/16(火) 20:31:560432デフォルトの名無しさん
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;
とした方が速いのでしょうか?
0433デフォルトの名無しさん
2005/08/16(火) 21:45:43「1234567890」
のような数字が入っていて、これを特定のテキストファイル上に
「123,4567,890」
のようにCSV処理して出力するコマンドを作りたいです。
コマンドの引数として、定数名のようなものを指定することで
別のファイルの定数一覧からカンマを挟む箇所の文字数(上の例だと「3,4,3」)を受け取って
処理するようにしたいと思っていますが、どう作っていけばいいのか分かりません。
どんな感じで作る物なのか、ヒントかもしくは
参考にしやすいサンプルソースを見れるサイトがあったら教えていただきたいです。
0434デフォルトの名無しさん
2005/08/16(火) 21:55:54あっちこっちに書き散らす前に、自分がみんなのレスの何を判っていないのかきちんと整理しよう。
あんたの言うバイナリファイルがどういったものなのか、だれも理解できていないのだが
それはあんたがバイナリファイルとはどういうものなのか判っていないからだとは思わんのかね。
0435デフォルトの名無しさん
2005/08/16(火) 21:57:57気にするな。
どうしても気になるならアセンブリ出力を見よ。
0436デフォルトの名無しさん
2005/08/16(火) 22:29:08その通りです。
バイナリというのは、「コンピュータが扱うためのデータ」だと思っていました。
上の質問だと、「数字を表すコードが入っている」
というわけではないんでしょうか?
C言語なら俺に聞け!スレから
「初心者向けのスレに行った方が良い」ということでこちらに来ました。
向こうのスレの話では「バイナリダンプ」と言うらしいですが、
どういう物の事なのか、よく分かりません。
0437デフォルトの名無しさん
2005/08/16(火) 22:29:28次のソースをコンパイルして出来た実行ファイルに、君の言う「バイナリファイル」
とやらを指定して実行して出力を見せてくれ。
#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;
}
0438デフォルトの名無しさん
2005/08/16(火) 22:38:45誘導されたら黙って移動するのではなく、ちゃんと挨拶しとけと。
あっちにもレスがついてるぞ。
0439デフォルトの名無しさん
2005/08/16(火) 22:52:00すみません、元になるファイルは会社にあって、
今実行することが出来ません。
元になるファイルにどういうコードが入っているのかを確認できるプログラムなのでしょうか?
>>438
むこうの>400で挨拶はしたつもりだったのですが・・・
0440デフォルトの名無しさん
2005/08/16(火) 22:53:48バイナリファイルだと勘違いしている、筈だと、思い込みたい人がいるみたい
なので余計話が混乱している。
つうか、曲解されるかどうかはともかく、
>バイナリファイル内に
>「1234567890」
>のような数字が入っていて、
なんて書き方ではあなたの理解程度が怪しいとしか思えなくて、
設問の意味が曖昧にしか伝わらないのよ。コミュニケーション不能。
>どう作っていけばいいのか分かりません。
だいいち、こんないいかげんな質問だと、まともにプログラム経験あるのか不安。
0442デフォルトの名無しさん
2005/08/16(火) 22:56:40アセンブリで見てみました。といってもよくわからないのですが。
構造体にアクセスするとポインタ演算が余計に入っちゃうみたいです。
正確な計測法がわからない(unixコマンドのtimeで計測)上、
一度キャッシュに載ると馬鹿速くなるのでますますよくわからないのですが、
構造体を使うとかなり遅くなってるみたいです。
この辺、正確なところがわかる方がいたら教えてほしいです。
構造体のグローバルなインスタンスを使って状態管理したいと思っているんですが、
その際かなりアクセスが頻繁になるのでオーバーヘッドがあると思うと不安です。
0443デフォルトの名無しさん
2005/08/16(火) 23:23:47アセンブリを見て「よくわかからない」とか言う奴にその辺りを教えるのは無理(或いは無駄)。
0444デフォルトの名無しさん
2005/08/16(火) 23:23:57ただ処理が重くなるような文脈なら、多分最適化がかかるし、
重くもない処理なら気にするだけ無駄な差にしかならないだろう。
0445デフォルトの名無しさん
2005/08/16(火) 23:24:240446デフォルトの名無しさん
2005/08/16(火) 23:29:19一般的に言ってオーバーヘッドがあるのか、ないのかということが知りたいんです。
できればじっくり学習したいので、アセンブリがわかったとしてどういうことなのか
示していただければ幸いなのですが(わからなければそれを頼りに自分で調べます)、
説明が無理なのならせめて結果だけでも教えて欲しいです。
0447デフォルトの名無しさん
2005/08/16(火) 23:32:33一般的には、最適化を考慮すると周りの状況に大きく左右されるので、
オーバーヘッドがあるのか、ないのかという答えにはならない。
0448デフォルトの名無しさん
2005/08/16(火) 23:36:39メンバ変数のオフセット計算があるので変数単体より遅くなる
そんなに速度が気になってグローバル変数でもよいなら
変数単体にすればいいだけの話
0449デフォルトの名無しさん
2005/08/16(火) 23:36:43実際にオーバーヘッドが問題になってるの?
「あると思うと」っていう、のがすごく気になるんだけど。
アクセスが頻繁になる部分だけ、ポインタで置き換えるなりなんなりしてみれば?
毎度インデックス計算するアホコードよりはいいが、最適化されれば同じことだ。
0450デフォルトの名無しさん
2005/08/16(火) 23:42:06http://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クロック差があるかないかの違いだろうがな。
0451450
2005/08/16(火) 23:45:06>処理が複雑になれば、ほんとにゴミにすらならない差だ。
ってかいたつもりが抜けてたので、付け足しておきます。
0452デフォルトの名無しさん
2005/08/16(火) 23:47:15ワロタ
0453デフォルトの名無しさん
2005/08/16(火) 23:54:11先のは1クロックの差も無いわけだが。
0454デフォルトの名無しさん
2005/08/17(水) 00:01:26ありがとうございます。
これ、まったく差はないんじゃないんですか?
インストラクション数は同じだし、
_x+4というのは変数?の名前であって実行時に4バイト増やしてるわけじゃないですよね?
でも結局、関数に渡す際にスタックに積んだら毎回ポインタ演算するんじゃないかと心配です。
ちょっと、色々吐かせて調べてみます。>>450みたいな吐かせ方がわからないんですが、
どうやるんですか?単に-Sだともっとごちゃごちゃしてるんですが...
0455デフォルトの名無しさん
2005/08/17(水) 00:28:380456デフォルトの名無しさん
2005/08/17(水) 00:33:07データ取るときはいつも
movl _x+4 だ
0457デフォルトの名無しさん
2005/08/17(水) 00:35:490458デフォルトの名無しさん
2005/08/17(水) 00:36:450459デフォルトの名無しさん
2005/08/17(水) 03:15:43基礎教養無いくせにやたら耳年増的な心配しても、まったく無駄だ。
せめてきちんと筋道だった勉強と理解ができるようにならなきゃ。
gcc -S ...と >>450 の x.sを対応付けられないんじゃ救いようが無いかな…
とりあえず、あなたの理解レベルでは、構造体に限らず、
オーバーヘッド云々以前にきちんと読めるプログラムを書くので手一杯のはず。
速度チューニングは、きちんと差を計測できたり、 *.sを解釈できるだけの
能力が無ければ、考えても無駄。
0460デフォルトの名無しさん
2005/08/17(水) 03:47:130461デフォルトの名無しさん
2005/08/17(水) 09:27:25今になって読み返してみると可読性・保守性最悪だし
アルゴリズム見直した方がずっと速かったりでいいこと何も無かった。
0462デフォルトの名無しさん
2005/08/17(水) 11:22:19template<typename T>
class hoge
{
public :
void foo(T t) ;
void bar(T t) ;
//......
} ;
//ここでhoge::fooだけを特殊化したい、あとのメンバ関数はテンプレートに任せたい。
0463デフォルトの名無しさん
2005/08/17(水) 11:57:44template<typename T>
class hoge
{
public :
void foo(int i) {}
void foo(T t) ;
void bar(T t) ;
//......
} ;
とかでいいんじゃない?
0464デフォルトの名無しさん
2005/08/17(水) 12:14:40template<>
void Hoge<int>::foo(int i) { /* ... */ }
0465デフォルトの名無しさん
2005/08/17(水) 12:52:54それはTがint以外のときに、intからTへの暗黙の変換が使えなくなって
場合によっては、バグの温床になるのではあるまいか
0467デフォルトの名無しさん
2005/08/17(水) 15:12:18sendでよろしいんでしょうか?
いまいち分からないので知恵を貸していただきませんでしょうか。
0468デフォルトの名無しさん
2005/08/17(水) 15:20:26あと、こっちのほうが適スレ、こっちへどうぞ
ネットワークプログラミング相談室 Port14
ttp://pc8.2ch.net/test/read.cgi/tech/1118469143/
0469デフォルトの名無しさん
2005/08/17(水) 15:30:190470デフォルトの名無しさん
2005/08/17(水) 15:35:05struct infile{
char filename[129];
int filesize;
char filetime[20];}
struct infile *f1;
f1 = malloc(sizeof(struct infile) * 3 );
0471デフォルトの名無しさん
2005/08/17(水) 15:40:21struct 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
0472デフォルトの名無しさん
2005/08/17(水) 15:48:20ttp://forums.belution.com/ja/vc/000/321/07.shtml
マルチポストすんな
0473デフォルトの名無しさん
2005/08/17(水) 16:05:50char filename[129];
int filesize;
char filetime[20];
};//>471の呪い
f1 = (struct infile *)malloc(sizeof(struct infile)*3);
こんな風に変更してもエラーが出てきたら
エラー内容をコピペしてみろ
0474デフォルトの名無しさん
2005/08/17(水) 16:29:34return 0; とやってもコンパイルが通りません。
参照を返す関数ではエラーは発生しないように作るしかないのでしょうか?
0475デフォルトの名無しさん
2005/08/17(水) 16:31:54つ[例外]
0476デフォルトの名無しさん
2005/08/17(水) 16:33:12ベリューションのことまで知らんわボケ
0477デフォルトの名無しさん
2005/08/17(水) 16:33:34例外を投げるとか、引き数で結果を返すようにするとか。
異常を示す値を代入しておくとか。
0478デフォルトの名無しさん
2005/08/17(水) 16:33:58エラー情報と受け渡したい参照を持つヘルパークラスを返す。
0479デフォルトの名無しさん
2005/08/17(水) 16:35:58?
0480デフォルトの名無しさん
2005/08/17(水) 16:55:13とか
return (関数の戻り値のポインタの型に合わせて)0;
とか
0481デフォルトの名無しさん
2005/08/17(水) 17:00:05return static_cast<FooType *>( 0 );
0482デフォルトの名無しさん
2005/08/17(水) 17:17:080483デフォルトの名無しさん
2005/08/17(水) 17:20:040484デフォルトの名無しさん
2005/08/17(水) 17:29:25え?
0485デフォルトの名無しさん
2005/08/17(水) 17:33:090486デフォルトの名無しさん
2005/08/17(水) 20:16:36戻り値型がFooType*なら return 0; だけでいい。
static_castはいらない。
0487デフォルトの名無しさん
2005/08/17(水) 20:49:490488デフォルトの名無しさん
2005/08/17(水) 21:24:350489デフォルトの名無しさん
2005/08/17(水) 21:30:12何nullって。JavaかC#と勘違いしてんじゃねーの?
0490デフォルトの名無しさん
2005/08/17(水) 23:03:32つ[ boost.optional ]
0491デフォルトの名無しさん
2005/08/17(水) 23:41:35エラーがあるなら例外を使えばいいじゃない
0492デフォルトの名無しさん
2005/08/17(水) 23:44:35何で今ごろ既出の回答をするんだ?
0493デフォルトの名無しさん
2005/08/18(木) 00:20:48ぼんやり
0494デフォルトの名無しさん
2005/08/18(木) 08:35:58return NULL;
0495デフォルトの名無しさん
2005/08/18(木) 08:39:190496デフォルトの名無しさん
2005/08/18(木) 09:39:34コンパイルが通るか確かめてから書けヴォケ
0497デフォルトの名無しさん
2005/08/18(木) 09:45:34これってどういう処理が行われるんでしょうか?
0498デフォルトの名無しさん
2005/08/18(木) 10:05:10これ、痛くね?
0499デフォルトの名無しさん
2005/08/18(木) 10:19:50doneという変数の値が0の間、継続する文を実行する。
0500デフォルトの名無しさん
2005/08/18(木) 10:20:20マジレスすると
これは while 構文といって、カッコ内に書かれた式(この場合は、!done)が
0 と等しくなるまで、この直後に書かれたステートメントを、繰り返し処理する
詳しくは、まともな本読め
0501デフォルトの名無しさん
2005/08/18(木) 11:30:15while (0 == done)
0502デフォルトの名無しさん
2005/08/18(木) 11:47:550503デフォルトの名無しさん
2005/08/18(木) 11:51:540504デフォルトの名無しさん
2005/08/18(木) 12:14:11環境を書け
0505デフォルトの名無しさん
2005/08/18(木) 12:27:000506デフォルトの名無しさん
2005/08/18(木) 13:40:390507デフォルトの名無しさん
2005/08/18(木) 14:26:16FooType*の何が参照なんだ?
0508デフォルトの名無しさん
2005/08/18(木) 14:38:24もともとの質問はこれ。>>474
もとの質問をろくに読まないか、読んでも「参照」をしらない夏厨がわいている。
0509デフォルトの名無しさん
2005/08/18(木) 14:39:27最初の質問の事を言ってるとオモワレ
脱線しすぎだな
0510デフォルトの名無しさん
2005/08/18(木) 15:40:34#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が返却されていたんですが。
よろしくお願いいたします。
0511デフォルトの名無しさん
2005/08/18(木) 16:12:02test_st *point = (test_st*)&b;
printf("=>%d",*point);
をきちんと書き直しなさい
0512デフォルトの名無しさん
2005/08/18(木) 16:14:37>printf("=>%d",*point);
だとtest_stのサイズの1byte分しかスタックに積まないが
printfは%dなので4byteスタックから拾ってる。残り3byteにはゴミが入ってる。
printf("=>%d", point->a);
とすれば4byteに拡張されて積まれるから問題ない。
0513510
2005/08/18(木) 16:14:52からおかしな値が表示されるんですね。
第一、構造体をprintfで表示しようとしていること自体おかしいですね。
0514510
2005/08/18(木) 16:16:45ありがとうございました。
勉強して出直してきます。
0515デフォルトの名無しさん
2005/08/18(木) 18:21:00なるほど、そら確かにnullもNULLもアウトだわな
0516デフォルトの名無しさん
2005/08/18(木) 19:13:02その構造体にカーソルを合わせて何らかのキーを押すとヘッダファイル
のその構造体定義にジャンプしてくれるような機能って何ですか?
->以前、使っている人がいたんですが聞きそびれました。
googleりたいのですが、検索キーワードを教えていただけませんか。
0517516
2005/08/18(木) 19:22:10ctags
0518デフォルトの名無しさん
2005/08/18(木) 19:30:340519デフォルトの名無しさん
2005/08/18(木) 21:01:37>>403の話で時間たってて悪いんだが
sizeof(g) == sizeof(k)
である保証はないっていう指摘は誰もしないのか?
誰もアラインメントに関して知らないってことはないはずなんだが。
0520デフォルトの名無しさん
2005/08/18(木) 21:09:47話を無理に発散させるのはやめろ
0521デフォルトの名無しさん
2005/08/18(木) 21:21:080522デフォルトの名無しさん
2005/08/18(木) 22:46:11アライメントに限らず、あのコードの非現実性(非実用性?)自体をあの時点で
説明しても意味が無いのを感づいているから。
(好意的に解釈すれば環境依存の単なる実験コードと承知の可能性もあるし。
なにより時節柄、(今みたく)本筋外す厨がわいて出てきかねないのがウザイ)
0523デフォルトの名無しさん
2005/08/18(木) 23:34:39wstringにinsertできるように型変換したいのですが
どうしたらよいでしょうか。
0524デフォルトの名無しさん
2005/08/19(金) 00:26:07WPARAMそのままだとinsertできなかったので質問させていただいたのですが、
なぜ一度tmpを経由すると成功するのでしょうか。
WPARAMはtmpに代入できるのだからwstringと同じではないのでしょうか。
だとしたらそのままinsertできるように思えるのですが、
できない理由を教えてください。
wstring tmp;//とりあえず空のwstringを作って
tmp=wp;//WM_CHARのWPARAMの値をそのまま代入
wstr.insert(pos,tmp);//wstring文字列に挿入
0525デフォルトの名無しさん
2005/08/19(金) 00:38:29TCP/IPでバイナリデータを送信する前に送信データの全体サイズを
測りたいんですけど、送信の全体が6バイト+可変のサイズなんですけど、
ソースで書くとどのようになるんでしょうか?よろしくお願いします。
環境 win2000 VC++6.0
0526デフォルトの名無しさん
2005/08/19(金) 00:46:29>送信の全体が6バイト+可変のサイズなんですけど
その、「可変のサイズ」とやらは既知ではないのか?
既知でないとしたら、どうやって送信するつもりなのかね。
>>524
wstringへの代入が、castの代わりになっているんだろ。
0527524
2005/08/19(金) 00:49:59もしきちんとした方法でcastするとしたらどういう書き方をすればよいのでしょうか?
0528デフォルトの名無しさん
2005/08/19(金) 01:05:22キャストって何か知ってるよな?
0529デフォルトの名無しさん
2005/08/19(金) 01:25:090530デフォルトの名無しさん
2005/08/19(金) 01:28:176バイトのうち2バイトを読むと可変のサイズがわかるようになっています。
0531524
2005/08/19(金) 01:43:31型を変換しないといけないのはわかるのですが具体的にどうすればよいのかがわからないです。
最終的にinsertするにはwstringの文字列でないといけないのでWPARAMをその型に変換したいです。
wchar_t wtmp[]=L"";
printf((char*)wtmp,(char*)wp);
strcpy((char*)wtmp,"\0");
wstr.insert(pos,wtmp);
とかやってみてコンパイルは通りましたが動かしたら落ちました。
どうやれば意味的に正しくきれいに書けるでしょうか。
0532デフォルトの名無しさん
2005/08/19(金) 01:47:440533デフォルトの名無しさん
2005/08/19(金) 01:49:13じゃあそれつかえばいいやん
0534デフォルトの名無しさん
2005/08/19(金) 01:56:06ソースでどう書くのでしょうか?よろしくお願いします。。。
0535デフォルトの名無しさん
2005/08/19(金) 01:59:18まずはオマエが書いて、問題があればそれを相談しろ。
0536524
2005/08/19(金) 02:00:41それでわかったら聞かないです。
0537デフォルトの名無しさん
2005/08/19(金) 02:12:11またはその逆に変換してくれるぞ。ついでにソースを追えば
何やっているか分かる。
キャストじゃ駄目だよ。。。
0538デフォルトの名無しさん
2005/08/19(金) 02:12:41あっそ。
http://www.wakhok.ac.jp/~sumi/stl/header/string.html
0539デフォルトの名無しさん
2005/08/19(金) 02:14:55どう書いていいのかわからないです。無理ならせめてヒントください!
0540デフォルトの名無しさん
2005/08/19(金) 02:22:36全部書き上げるまで粘着されそうで、正直出て行って欲しい感じだ。
わからないことがピンポイントじゃないので、ヒントも無理。
0541524
2005/08/19(金) 02:32:50度々すいません。ありがとうございます。これ↓使えってことでしょうか?
--------------------------------------------------------
// 文字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の文字列にする方法)お願いします。
0542デフォルトの名無しさん
2005/08/19(金) 02:44:33charT についてはリンク先の「テンプレート」を見ろ。
あてずっぽうでキャストすんなボケ。
wstring には wchar_t が格納できる。 TCHAR は char または wchar_t に typedef されてる。
よって TCHAR が wchar_t なら変換は要らない。
TCHAR が char ならマルチバイトシーケンスの判定やバッファリングが必要。
0543524
2005/08/19(金) 05:40:34お互いに時間の無駄じゃないですかね。これまでの分はお礼を言いますが
別に教えたくないなら無理して教えていただかなくていいですし
こっちも別にボケとか言われてまで聞きたくないんでもう結構です。
ありがとうございました。
0544デフォルトの名無しさん
2005/08/19(金) 07:32:27お前がこいつ http://pc8.2ch.net/test/read.cgi/tech/1124113879/28 と
同一人物だと思ってるから、様子見してたんだけど、成長してないようだな。
キーワードがわかってるのに自分で調べることのできない奴まで
面倒を見る気は無い。出て行ってもらって結構。
0546デフォルトの名無しさん
2005/08/19(金) 09:53:28どっかのスレで、質問の仕方スレの使い方の質問・・・
とかわけのわからん状態になっていたのを見たことがある。
0547デフォルトの名無しさん
2005/08/19(金) 10:04:35ここは赤子に這い這いを教えるようなとこじゃ無いんだよ
0548デフォルトの名無しさん
2005/08/19(金) 10:33:06要求/返信コード 2バイト(unsigned short)
結果コード 2バイト(unsigned short)返信値のみ有効
データ部サイズ 2バイト(unsigned short)
データ部 データ部サイズにより可変
*データ部の内容は要求/返信コートにより決定する
0549デフォルトの名無しさん
2005/08/19(金) 10:42:05つーかマルチポストすんじゃねえ
0550デフォルトの名無しさん
2005/08/19(金) 10:47:45ushort 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を取得してね。
逆の処理の仕方とかは聞かないでね。
0551デフォルトの名無しさん
2005/08/19(金) 11:12:16教えてくれてありがとうございます。
早速試したいと思います。
0552デフォルトの名無しさん
2005/08/19(金) 13:19:03ushort net_datasize; //結果コード?
ushort host_datasize;//正しい値がすでに入っていると仮定 //データ部サイズ?
ushort *p; //要求コード?
ってことでしょうか?
>>550
0553デフォルトの名無しさん
2005/08/19(金) 13:23:51結果コード 2バイト(unsigned short)返信値のみ有効
データ部サイズ 2バイト(unsigned short)
の6バイトを送るだけだよ。
[]で1バイト
[要求・送信コード][要求・送信コード][結果コード][結果コード][データ部サイズ][データ部サイズ]
の順でね。
0554デフォルトの名無しさん
2005/08/19(金) 13:35:16受信のは逆っていいますと
net_datasize = htons(host_datasize);
p = (ushort *)&sixbytes[4];
*p = net_datasize;
が逆に行うってことですか?
頭悪すぎてすみません!!
0555デフォルトの名無しさん
2005/08/19(金) 13:48:30背景色が a その上に表示する画像の 色が b
とした場合の 計算式はどうなりますか?
a+b/2 とかいう単純な計算ではむりでした
0556デフォルトの名無しさん
2005/08/19(金) 13:50:34透明・不透明度tが 0〜1 として
a*(1-t) + b*t
0557デフォルトの名無しさん
2005/08/19(金) 14:04:44ありがとうございます
でもそれだと何故か出来ないんですよね
int だから だめとかですかね
0558デフォルトの名無しさん
2005/08/19(金) 14:07:23整数型で実数を扱えるわけ無いだろ。
0559デフォルトの名無しさん
2005/08/19(金) 14:10:21透明度0.5なら(a+b)/2で、この場合は整数演算でもOK。
RGB各要素を別に計算する必要があるのは理解している?
0560デフォルトの名無しさん
2005/08/19(金) 14:19:51なるほど RGB別になんですね
白 が 0x7FFF という 形式なんですけど
まず分解しないといけないんですね
0561デフォルトの名無しさん
2005/08/19(金) 14:40:210562デフォルトの名無しさん
2005/08/19(金) 14:45:14なんかYSっぽいな。
0563デフォルトの名無しさん
2005/08/19(金) 14:46:48っていうかお前にはネットワークプログラム無理だよ。
諦めるのが最善の策だ。
自分でも頭悪すぎるってわかってるっぽいし。
0564デフォルトの名無しさん
2005/08/19(金) 14:50:29自分の使っているシステムの色の定義を調べるほうが先だな
0565デフォルトの名無しさん
2005/08/19(金) 14:50:55ネットワークプログラム以前にプログラム自体が駄目だと思うよ。
思考能力が小学校低学年並。
0566デフォルトの名無しさん
2005/08/19(金) 15:15:13プログラムの処理を理解してるのか?
受信側でコードをそのままコピペしたら絶対バグ出るぞ。
0567デフォルトの名無しさん
2005/08/20(土) 17:06:32出て行ってもらって結構って、ここはお前のスレでもなんでもないんだが。
教える気がないならお前が最初から黙ってればいいだろ。
お前みたいに中途半端にレスされると質問者としても迷惑なんだよ。
質問者には過不足なく質問しろとかいうんだったら回答者も過不足なく最後まで面倒みろよ。
途中で投げ出すなら最初から教えてくれなくていい。
0568デフォルトの名無しさん
2005/08/20(土) 17:17:330569デフォルトの名無しさん
2005/08/20(土) 18:10:31m9(^Д^)プギャー
0570デフォルトの名無しさん
2005/08/20(土) 19:47:10>>547
0571デフォルトの名無しさん
2005/08/20(土) 21:43:33お前にとって迷惑なレスなんてひとつも無かったはずなんだけどな。
さらに、キーワードから自分で調べることさえすれば
面倒を見てくれるとも言っている(ように見える)。
投げ出された結果になったのは、お前がそれをしなかったからだとわからないのか?
0572デフォルトの名無しさん
2005/08/20(土) 22:01:49まともに回答できない人が偉そうに書き込むのはやめましょう。
「知識は無いけど説教はしたい」、そんなくだらない願望はチラシの裏へどうぞ。
0573デフォルトの名無しさん
2005/08/20(土) 22:03:24まともに検索できない人が偉そうに書き込むのはやめましょう。
「技術は無いけどプログラムはしたい」、そんなくだらない願望はチラシの裏へどうぞ。
0574デフォルトの名無しさん
2005/08/20(土) 22:31:05>回答者も過不足なく最後まで面倒みろよ。
過不足なく質問できたやつには過不足なく面倒を見ている。
過不足なく面倒を見てもらえない君は、とどのつまり過不足なく質問できていないのだ。
0575574
2005/08/20(土) 22:32:52>554なのか?
答えた側としては泣きたくなるぞ。
0576デフォルトの名無しさん
2005/08/20(土) 22:36:130577デフォルトの名無しさん
2005/08/20(土) 22:40:11このスレですネ!
0578デフォルトの名無しさん
2005/08/20(土) 22:44:53は?死ねよ
0579デフォルトの名無しさん
2005/08/20(土) 22:45:15何年ネットやってんだか。( ´,_ゝ`)プッ
0580デフォルトの名無しさん
2005/08/20(土) 23:06:300581デフォルトの名無しさん
2005/08/20(土) 23:10:400582デフォルトの名無しさん
2005/08/20(土) 23:15:260583デフォルトの名無しさん
2005/08/21(日) 12:10:12> 過不足なく質問できたやつには過不足なく面倒を見ている。
こういうのは自己申告するものではなく、相手が評価するのが筋では? ;-)
「質問者が過不足なく質問できているかは回答者である俺が決める。
俺が過不足なく回答できているかどうかも俺が決める」
ですか? それが通るなら、そりゃあいつだって自分は正しく相手のみ非がありますよね :-P
0584デフォルトの名無しさん
2005/08/21(日) 12:23:070585デフォルトの名無しさん
2005/08/21(日) 12:42:400586デフォルトの名無しさん
2005/08/21(日) 13:18:00最高にド低脳な発言してくださいスレで紹介されてたのだが、
http://pc8.2ch.net/test/read.cgi/tech/1108781476/ の
>>584 にならないようにな。もう50歩100歩だがね。
読み進めると、イタさが伝わってくるよ。
>>583晒し揚げ!!!
0587デフォルトの名無しさん
2005/08/21(日) 13:54:32意味不明です。
リンク先のスレと俺の>>583はまったく関係ありませんので :-P
>>583に対して有効なレスは、
「質問者が過不足なく質問できているかは回答者である俺が決める。
俺が過不足なく回答できているかどうかも俺が決める」
↑これがいかに正しいのか、ということをちゃんと説明しているレスだけですね。
(>>583がやっているのはこのことへの突っ込みなので、それ以外はすべて話題そらし)
0588デフォルトの名無しさん
2005/08/21(日) 13:57:50>>585
0590デフォルトの名無しさん
2005/08/21(日) 14:04:04574 をちょっと修正して
× 過不足なく面倒を見ている
○ 過不足なく面倒を見ているつもりだ
これでいいですね?
0591デフォルトの名無しさん
2005/08/21(日) 14:11:44>>584
0592デフォルトの名無しさん
2005/08/21(日) 16:40:000593デフォルトの名無しさん
2005/08/21(日) 16:40:480594デフォルトの名無しさん
2005/08/21(日) 16:41:330595デフォルトの名無しさん
2005/08/21(日) 17:14:510596デフォルトの名無しさん
2005/08/21(日) 17:34:140597デフォルトの名無しさん
2005/08/21(日) 17:35:570598デフォルトの名無しさん
2005/08/21(日) 22:20:440599デフォルトの名無しさん
2005/08/22(月) 13:42:53char FAR *name,
int namelen
);
これのFARってなんですか?
0600デフォルトの名無しさん
2005/08/22(月) 13:46:08遠いポインタにつけられる修飾子を隠すためのマクロです。
過去との互換性のために残されているだけでしょうから、無視していいかと。
0601デフォルトの名無しさん
2005/08/22(月) 14:11:21どのように考えればいいのでしょうか?
0602デフォルトの名無しさん
2005/08/22(月) 14:17:17それはおそらく8086のCPU用プログラムで使われたものです。
たしか far と near がありました。far のポインタは 32
ビットで、near は 16 ビットです。far も near も付けない
場合はコンパイル時にコンパイラに対してオプションで指定
していたと思いました。
0603デフォルトの名無しさん
2005/08/22(月) 14:19:35HTMLファイルは fopen() 使って "r" で開き、作業用ファイルを "w" で開く。
で、HTMLファイルから読んで作業用ファイルに書く。終わりの所に来たら
両方とも fclose() して、HTML ファイルを .bak 付きのファイル名に
リネームし、作業用ファイルのファイル名を元の HTML ファイルのファイル名に
変更する。
0604デフォルトの名無しさん
2005/08/22(月) 14:43:26プログラムを取ってくるところまでは出来たのですが、自分自身を削除してそれを新しい物に置き換える方法が分かりません。
自分自身が起動している場合、上書きできないのですが、このような場合どのようにすればよいのでしょうか?
0605デフォルトの名無しさん
2005/08/22(月) 14:45:460606デフォルトの名無しさん
2005/08/22(月) 15:16:59で、読み込もうとすると、どうしても1075838976という値になってしまいます。
(float型に入れたので実際は指数表示だった)
0x40200000が示す整数がそれなのでそれも分かるのですが、
元の2.5という小数としてfloatに入れたい時はどうすればいいのでしょうか?
0607デフォルトの名無しさん
2005/08/22(月) 15:35:27int i = 0x40200000;
float f = *reinterpret_cast<float*>(&i);
0608デフォルトの名無しさん
2005/08/22(月) 15:37:57FARポインタについては>>600や>>602で書かれてるとおり
16it環境でポインタを扱う場合に付けるもの。
typedef FAR BYTE * LPBYTE
typedef FAR char * LPSTR
って感じで使われてた(LPはLong Pointerの略)
さらに補足すると(いらないだろうが)、
モジュールをまたぐ場合のポインタ渡しや、
メモリアクセスで現在位置から64Kbyte以上離れた場所を指す場合に使う。
Win3.1や95、または98/Meのデバイスドライバ限定でしか使わない代物なので
今は無視してもOK
昔はFARポインタやセグメントやらで散々悩まされたよorz
0609608
2005/08/22(月) 15:41:54>メモリアクセスで現在位置から64Kbyte以上離れた場所を指す場合に使う
間違い。こっちはhugeポインタだった。
時代遅れのおっさんはそろそろ消えるよノシ
0610デフォルトの名無しさん
2005/08/22(月) 15:53:05うひょー、できました。
ありがとうございます。
float f = *(reinterpret_cast<float*>(&i));
はよくて
float f = reinterpret_cast<float>(i) ;
じゃダメなんだ…。つかコンパイル通らない。
奥がふかいなぁ
0611デフォルトの名無しさん
2005/08/22(月) 17:30:200612デフォルトの名無しさん
2005/08/22(月) 17:32:010613デフォルトの名無しさん
2005/08/22(月) 17:34:11環境依存だから
0614デフォルトの名無しさん
2005/08/22(月) 17:47:100615デフォルトの名無しさん
2005/08/22(月) 17:51:08環境依存とか、ベンダー独自の関数とかはアンダーバーをつけるって聞いたことがあるけど。
ごめんなさい、あとは詳しい人に任せます。
0616デフォルトの名無しさん
2005/08/22(月) 19:24:27マルチメディアタイマーをクラス化したいんですけども、どのようにすれば
良いのでしょうか?
コンストラクタで初期化して、デストラクタで削除するってだけの代物なんです
けども
0617デフォルトの名無しさん
2005/08/22(月) 19:47:360618デフォルトの名無しさん
2005/08/22(月) 19:54:582箇所の
*timer_proc
を
__stdcall *timer_proc
に。
0619デフォルトの名無しさん
2005/08/22(月) 20:19:09>>616でほとんど完成してるね。
個人的にはコンストラクタ、デストラクタとは別に
Start()とStop()メソッドが欲しいところ。
0620デフォルトの名無しさん
2005/08/22(月) 20:19:29reinterpret_cast<float&>(i);だとどうだろう?
0621デフォルトの名無しさん
2005/08/22(月) 20:46:31veryさん9!
ありがとうございました
0622デフォルトの名無しさん
2005/08/22(月) 20:54:440623偽616
2005/08/22(月) 21:13:36ありがとうございました。
0624デフォルトの名無しさん
2005/08/22(月) 21:53:350625デフォルトの名無しさん
2005/08/22(月) 22:32:490627デフォルトの名無しさん
2005/08/23(火) 15:46:34練習問題の解答が以下として載っていたのですが…
#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
と、なんか途中から誤差が出てくるんですが、どうしてでしょうか?
0628デフォルトの名無しさん
2005/08/23(火) 16:04:21不動小数点数とはそういうもの。
有効桁数は有限でしかない上に、0.1は二進法では無限小数で、誤差が出やすい。
0629デフォルトの名無しさん
2005/08/23(火) 16:35:190.1が無限になるのは固定小数だけじゃなかったっけ?
うろ覚えなので間違ってたらスマソ…
0630デフォルトの名無しさん
2005/08/23(火) 16:43:50Shell_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が適用されています。
0631デフォルトの名無しさん
2005/08/23(火) 16:44:15不動小数って……
>>629
そう思うのなら自分で計算してみるよろし。
0632デフォルトの名無しさん
2005/08/23(火) 16:45:26向こうで回答がないからってマルチすなや。
0633デフォルトの名無しさん
2005/08/23(火) 16:47:55floatの精度は10進7桁分もない。
従って、%fで表示したら誤差が出るのは自明。
%gを使うとか小数点以下の桁数を制限して誤魔化すか、
doubleで計算するようにするか、
そもそも誤差が累積しないような対策をするべき。
つーか、その練習問題を読む限り、回答としては間違いだね。
0634デフォルトの名無しさん
2005/08/23(火) 19:05:38#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;
}
ごめん、キャスト使うとこなかった。
0635デフォルトの名無しさん
2005/08/23(火) 19:19:47%2d.%d→%f
i/10, i%10→(double)i / 10
0636デフォルトの名無しさん
2005/08/23(火) 19:50:37小数点が固定だろうが浮動だろうが十進数の 0.1 は二進数では循環小数であることには代わりはない。
0637627
2005/08/23(火) 22:10:29ちなみに問題の出典は独習C 第3版。
0638デフォルトの名無しさん
2005/08/23(火) 23:58:02struct 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
・
・
・
とか書いても当然ダメですよね
0639デフォルトの名無しさん
2005/08/24(水) 00:07:24その最初のコードでtestが既に定義されているんだが、どうしたらいい?
0640デフォルトの名無しさん
2005/08/24(水) 00:10:21{1,a}って? 'a'なら分かるけど。で、当然最後はセミコロンだよね?
for文の中は「とか書く」以前に何をしたいのかも表せていないし、
そもそもCになっていない。
0641デフォルトの名無しさん
2005/08/24(水) 00:32:470642638
2005/08/24(水) 01:02:55最初似宣言しておかなければ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
で数値の合計を出そうとしていました。
0643638
2005/08/24(水) 01:05:07この
sum+=test[i].a;
のtestの部分をコマンドライン引数で指定したいわけです。
0644デフォルトの名無しさん
2005/08/24(水) 01:14:410645デフォルトの名無しさん
2005/08/24(水) 01:15:07「構造体が複数」?「配列が複数」の間違いじゃないのか?
0646デフォルトの名無しさん
2005/08/24(水) 01:21:55こういうことか?
if( strcmp(argv[1], "test") == 0 )
sum += test[i].a;
else if( strcmp(argv[1], "hoge") == 0 )
sum += hoge[i].a;
0647デフォルトの名無しさん
2005/08/24(水) 01:27:46一般いは無理だ。>>642 のように、文字列と配列の対応関係をどっかにつくって置かなければな。
>>638 のやりたいことはPerlなら出来るが、Cじゃむり。
0648647
2005/08/24(水) 01:28:26○一般的には無理だ
0649デフォルトの名無しさん
2005/08/24(水) 01:31:540650638
2005/08/24(水) 01:49:47おっしゃるとおりで。
>>646,647
どこか別に判断基準を用意しないとダメってことなんですね。
たしかに、最初に思ったのは
構造体の配列を、更に配列に入れて処理・・・って物だったんですが、
入り組みすぎると後々汎用性が下がるし分かりにくいから
別の方法でやるようにと言われてしまったので、
他にどんな方法があるのか悩んでいたのです。
お勉強になりました。
ありがとうございました。
0651デフォルトの名無しさん
2005/08/24(水) 01:52:27struct 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 ;
}
0652デフォルトの名無しさん
2005/08/24(水) 01:59:38> 入り組みすぎると後々汎用性が下がるし分かりにくいから
> 別の方法でやるようにと言われてしまったので、
そいつ、信用ならないな。
0653351
2005/08/24(水) 02:00:45でええやん。
06541/2
2005/08/24(水) 02:02:24#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),
};
06552/2
2005/08/24(水) 02:03:11struct 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;
}
0656デフォルトの名無しさん
2005/08/24(水) 02:05:46マッピングテーブルに MAP(hoge), 追加してくれ。
0657デフォルトの名無しさん
2005/08/24(水) 02:18:24typedef std::map <char* , int> HOGE;
HOGE hoge;
hoge["test"] = 1;
とした場合に、
hoge[argv[1]] みたいなアクセスの仕方って出来ないんですか?
strcmp(argv[1], "test") == 0 が真でも
違う値とみなされているのか上手くデータを取得できないのですが。
0658デフォルトの名無しさん
2005/08/24(水) 02:20:470659デフォルトの名無しさん
2005/08/24(水) 02:23:16そりゃ、文字列の内容が同じでも、同じアドレスにあるとは限らん。
リテラルと変数だったら、まず一致しないだろう。
こうしたらどうよ。
typedef std::map <std::string , int> HOGE;
HOGE hoge;
hoge[std::string("test")] = 1;
0660デフォルトの名無しさん
2005/08/24(水) 02:24:420661658
2005/08/24(水) 02:27:24あーはずかし
0662デフォルトの名無しさん
2005/08/24(水) 02:31:36暗黙の変換が効くから
hoge["test"]
hoge[argv[1]]
でいいんじゃないの。
0663デフォルトの名無しさん
2005/08/24(水) 02:32:45おお、出来ました。ありがとうございます!
実は今日一日ずっとこれをどうにかできないか色々試してましたw
お陰様で気持ちよく眠れそうです。
0664638
2005/08/24(水) 03:52:21>>651~656
追加お返事どうもでした。
ざっと眺めただけじゃ理解しきれないので、ひとまず今日は寝て
明日じっくり解読させていただきます。
0665デフォルトの名無しさん
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();
}
0666デフォルトの名無しさん
2005/08/24(水) 09:54:27君がやりたいことは多分こういうことだと思う。
#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と出力される。
}
0667デフォルトの名無しさん
2005/08/24(水) 09:55:380668デフォルトの名無しさん
2005/08/24(水) 10:26:33横から追記すると、
std::ostream& operator<<(std::ostream& ost, Point pt){
return ost;
}
0669デフォルトの名無しさん
2005/08/24(水) 10:28:25std::ostream& operator<<(std::ostream& ost, Point pt){
(ここに標準出力等に流す処理を書く)
return ost;
}
とかやんないとマニピュレータが動いてくれないんで注意。
0670665
2005/08/24(水) 10:38:00演算子<<のオーバーロード、よくわかりました。
さっそく使ってみたいと思います。
ところで
>data2 = data1 + Point(1, 1);
の行なんですが、
data2 = data1 +(1, 1);
と書けるように演算子をオーバーロードできないものでしょうか?
0671デフォルトの名無しさん
2005/08/24(水) 10:43:38その下の行、コンパイラはどう解釈したらいいの?
その(1, 1)が何者かのヒントがないとコンパイラはなんともできないわけよ。
つーことで、大人しく一時オブジェクトを生成するか、2引き数の(operator+()でない)加算関数を用意するしか。
0672665
2005/08/24(水) 10:52:07勉強になりました。
教えてくださって本当にありがとうございました。
0673デフォルトの名無しさん
2005/08/24(水) 10:53:07>>666ちゃんと理解してるか?
data2 = daat1 + Point(1, 1);
だろ
0674デフォルトの名無しさん
2005/08/24(水) 11:33:07あんたこそ日本語を理解できてませんから。
0675デフォルトの名無しさん
2005/08/24(水) 11:37:150676665
2005/08/24(水) 14:36:03演算子のオーバーロードがメンバ関数と同じものだと考えてたのがいけないみたいですね。
どうもありがとうございました。
0677デフォルトの名無しさん
2005/08/24(水) 14:39:070678デフォルトの名無しさん
2005/08/24(水) 14:42:07違います
0679デフォルトの名無しさん
2005/08/24(水) 14:48:25operatorなんちゃらはグローバルでも定義できるが。
0680デフォルトの名無しさん
2005/08/24(水) 14:56:400681デフォルトの名無しさん
2005/08/24(水) 16:22:34phpやperlではやり方が分かるのですが、Cの場合はどのようにすればよいのでしょうか?
0682デフォルトの名無しさん
2005/08/24(水) 16:27:39$ man flock
0683デフォルトの名無しさん
2005/08/24(水) 17:34:09fcntl() でも出来るよ。
ロックを掛けるファイルがNFSにある場合はfcntl()でないとロック掛からない
ので、fcntl()で書いておけば安心。(しかしちょっと複雑)
0684デフォルトの名無しさん
2005/08/24(水) 18:09:560685デフォルトの名無しさん
2005/08/24(水) 20:06:23#define WM_MESSAGEA (WM_APP+1)
のように定義したメッセージはどのような時に送られるのでしょうか?
これらのメッセージをどう判断して良いものなのかがよくわかりません。
0686デフォルトの名無しさん
2005/08/24(水) 20:09:18WM_APP以降はアプリケーション独自に定義されたメッセージ。
Windows側が送信することはない。 アプリケーション自身が投げるか関連プログラムが投げるかしかないかと。
0687デフォルトの名無しさん
2005/08/24(水) 20:12:26システムへコールバックメッセージとして渡すとかね。
ex. Shell_NotifyIcon
0688デフォルトの名無しさん
2005/08/24(水) 20:14:28なるほど、わかりました。
ありがとうございました。
0689デフォルトの名無しさん
2005/08/24(水) 21:07:27C/C++でHDDのディスクイメージを取るプログラムを作ってみようと思ってますが、
そんなこと可能ですか?
なんか参考になる書籍かURLあったらおしえてください。
0690デフォルトの名無しさん
2005/08/24(水) 21:15:13少なくとも標準では不可能だな。
環境依存。
0691デフォルトの名無しさん
2005/08/24(水) 22:39:33Windowsなら、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スレだ。
0692デフォルトの名無しさん
2005/08/24(水) 22:44:04環境依存だから環境を示せってこと。
0693デフォルトの名無しさん
2005/08/24(水) 23:06:38環境依存OKならばこそ、環境も示さずに環境依存の何を教えろと?
0694デフォルトの名無しさん
2005/08/24(水) 23:09:420695デフォルトの名無しさん
2005/08/24(水) 23:33:540696689
2005/08/24(水) 23:50:18お察しのとおりWindows(NT系、9x系どちらも)なんですが、
MBRやブートセクタの領域もイメージとして取得できたらと思っています。
(Linuxのddのクローンのようなものです)
0697デフォルトの名無しさん
2005/08/25(木) 00:06:14だからCreateFile()でデバイス指定すればdd相当のこともできるってば。
0698デフォルトの名無しさん
2005/08/25(木) 09:47:05教えてください
ノートパソコンのCPUに最適化したいのですが
Pentium(R) M プロセッサ 735(1.70GHz
とかいうCPUに最適化するには
プロセッサ別の最適化のところで Pentium4以上 /G7
ってすればいいんでしょうか?
0699デフォルトの名無しさん
2005/08/25(木) 10:25:24PentiumMはバスを高速化したP6系CPUだったような気が‥‥
PentiumII/IIIで最適化した方がいい希ガス。
気になるなら両方でビルドしてみて速度計ってみ。
0700デフォルトの名無しさん
2005/08/25(木) 11:14:50ttp://www.devx.com/Intel/Article/20804
Intel C++ Compilerの記事だけど、俺の和訳に間違いが無ければ
PenMはG7でいいっぽい
0701デフォルトの名無しさん
2005/08/25(木) 14:16:17同じコードなのにCPrintDialogで表示されるダイアログが2つのプロジェクトで異なるのですが、
どこの設定を変えればいいのでしょうか?
開発/実行ともに同じ環境です(VC++ 6.0 + Windows2000 SP4)
プロジェクトA = プリンタ選択(コンボボックス)/印刷範囲/部数
プロジェクトB = プリンタ選択(アイコン選択)/印刷範囲/部数/タブがいっぱい
0702デフォルトの名無しさん
2005/08/25(木) 14:16:370703デフォルトの名無しさん
2005/08/25(木) 14:56:57invalid initializer
UIDをユーザ名に変換するにはどうすれば酔いでしょうか。
#この関数は検索してもほとんどヒットしないのでメジャーではないのか。
0704デフォルトの名無しさん
2005/08/25(木) 15:35:30MFCのリンクが共有DLLかスタティックリンクかで変わった気がする。
0705デフォルトの名無しさん
2005/08/25(木) 16:27:15普通 getpwuid() を使うのでは?
ていうか、オマエの使っているOSはなんだ?
0706デフォルトの名無しさん
2005/08/25(木) 16:36:05PenIIIで動かす場合、Intel C++ではPenM用(/QaxB)に最適化したコードにすると
PenIII用(/QaxK)に最適化したコードよりもなぜか速い。
0707701
2005/08/25(木) 16:42:34EXEじゃなくてOCXだからっていうのは関係ないですよね?
0708デフォルトの名無しさん
2005/08/25(木) 16:53:45CPrintDialogのコンストラクタの引数は同じ?
あと、OnFilePrintSetup()で何かそれっぽい処理とかはしてない?
0709デフォルトの名無しさん
2005/08/25(木) 17:26:27片方作った後にコピペで貼り付けたのでコードは同じのはずです。
CPrintDialog dlg(FALSE);
dlg.m_pd.Flags = PD_DISABLEPRINTTOFILE | PD_NOSELECTION | PD_RETURNDC;
dlg.DoModal():
何か決定的な間違いがあるんでしょか?
0710デフォルトの名無しさん
2005/08/25(木) 17:49:14MessageBoxを使って変数と文字列を一緒に表示させたいのですが
int xとしてxだけ表示するメッセージボックスは
int x;
CString str;
str.Format("%d",str);
MessageBox(str);
で出来たのですが、たとえば「数値=x」と表示させた場合は
どのようにしたらいいのでしょうか?お知恵を貸してください。
0711710
2005/08/25(木) 17:50:24str.Format("%d",str); ⇒str.Format("%d",i);
でした。
0712デフォルトの名無しさん
2005/08/25(木) 17:54:360713デフォルトの名無しさん
2005/08/25(木) 17:58:49「選挙にはほとんど行ったことがありません。面倒くさいからです」
「ちょっと頭のいい人は、やっぱり政治家なんか、やりたくないでしょう。損だから。面倒くさいし。少なくとも僕は絶対やらない」
「女は金にもれなくついてくる」
「人の心は金で買えます」
「カネがあれば何でもできる」
「俺は死なない」
「サラリーマンは現代の奴隷階級」
「起業家は現代の貴族階級」
「女は25歳超えたら無価値で有害なだけの産業廃棄物」
「大衆の7割はバカで無能」
「世論には意味がない」
「世の中、金だ、愛情だって金で買える」
「年寄りは合法的に社会的に抹殺するしかない」
「人間はお金を見ると豹変します。豹変する瞬間が面白いのです」
「人間を動かすのはお金です」
「世の中にカネで買えないものなんて、あるわけないじゃないですか」
「なんでも金で買えるなんていってない」
「一度言っただけで言ったことにされちゃあたまりません」
0714デフォルトの名無しさん
2005/08/25(木) 18:15:15OSはLinuxです。passwd 構造体を作ってgetpwuid を使うことにしました。ありがとうございます。
0715デフォルトの名無しさん
2005/08/25(木) 21:32:24"%d"→"数値=%d"
0716デフォルトの名無しさん
2005/08/25(木) 21:52:04次に読んだほうがいい本や、やってみたら良い事等があったら
ご教授いただけませんでしょうか、よろしくお願いします。
0717デフォルトの名無しさん
2005/08/25(木) 22:10:590718デフォルトの名無しさん
2005/08/25(木) 22:11:52本ばっかり読んで良いコードが書けるなら誰も苦労してないぞ
基礎が出来たら後は実践で学べ
0719デフォルトの名無しさん
2005/08/25(木) 22:53:00何か作りたいものを見つける。後は何をするかが自ずと見えてきますよ。
0720デフォルトの名無しさん
2005/08/26(金) 00:02:230721デフォルトの名無しさん
2005/08/26(金) 00:36:02「プログラミング言語C++第3版」を買ってくる
→読んでみる
→さっぱり分からない
→「入門書一冊読んだだけで分かったつもりになったらいかんなぁ」と反省する
→自分なりに色々なコードを書きつつ勉強を続ける
→「プログラミング言語C++第3版」をちゃんと読んで理解する
0722デフォルトの名無しさん
2005/08/26(金) 00:45:24「C++ Primer」を買ってくる
→本棚の肥やし
#俺は持ってないけど
0723デフォルトの名無しさん
2005/08/26(金) 00:59:50C++コンパイラを書くというのも一興
0724デフォルトの名無しさん
2005/08/26(金) 01:33:37まさに肥やしになってます。
ごつい割りには、きちっとした説明がほとんどされてない。
template周りだけは結構まともな内容なので、これのためにだけ8000円払った。
0725デフォルトの名無しさん
2005/08/26(金) 11:33:07実践経験を積みたいならサーバー立ててソケットを動かしてみる
0726デフォルトの名無しさん
2005/08/26(金) 12:25:13一番最初にくる文字を表示するプログラム*/
#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回行われているようなんですが
どうしてでしょうか?
0727デフォルトの名無しさん
2005/08/26(金) 12:37:52あんたは英字キーしか押さなかったのか?
改行キーも押しただろう?
つまり、改行キーを押したことで改行コードも入力されるんだよ。
0728デフォルトの名無しさん
2005/08/26(金) 12:38:43\nを読み飛ばせ
0729デフォルトの名無しさん
2005/08/26(金) 12:39:05誘導元で改行コードが入力されてるからって教えてもらってたでしょ?
それを踏まえて、どうすればいいですか?って内容ならともかく
同じ質問をそのまま書いちゃダメよ。
0730デフォルトの名無しさん
2005/08/26(金) 12:42:35abcdefghij[Enter]と入力すればお前の望むとおりの入力が得られる。
a[Enter]
b[Enter]
こう入力していくと[Enter]こと改行文字もgetchar()で読み込まれる。
それをお前はi++が2回実行されていると表現した。
0731726
2005/08/26(金) 12:47:43質問の仕方は以後気をつけます。すみません
0732デフォルトの名無しさん
2005/08/26(金) 12:52:17>>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;}
}
}
0733デフォルトの名無しさん
2005/08/26(金) 13:01:58なるほど。こっちのプログラムのほうが良いね
ありがとう(^ω^)
0734デフォルトの名無しさん
2005/08/26(金) 13:11:26if (ch2 == '\n') ch2 = getchar(); でもいい
0735デフォルトの名無しさん
2005/08/26(金) 13:14:51それだと2回目も改行コードの時にカウントされるんじゃない?
0737デフォルトの名無しさん
2005/08/26(金) 14:33:57そのこと忘れてた・・・ それなら↓でどう?
while ((ch2 = getchar()) == '\n');
0738デフォルトの名無しさん
2005/08/26(金) 16:43:51OK
0739デフォルトの名無しさん
2005/08/26(金) 16:55:36class 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 );
とするのとは
どちらがいいんでしょうか。
0740デフォルトの名無しさん
2005/08/26(金) 17:00:04それだけの目的だと、push_back()の後にdeleteするわけだよね。
わざわざnew/deleteするまでもないと思う。
つーか、g_Array.push_back(Hoge());でいい気が。
更に余談だが、vector(vetorじゃないよな)をグローバルに置くのは如何な最中と。
0741デフォルトの名無しさん
2005/08/26(金) 17:16:09サイズは小さいから>>740氏のでいいんじゃない?
0742739
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> 拙僧慌てておりました。
0743739
2005/08/26(金) 17:25:15structやらいっぱい抱え込んだ classになると
newの必要性が出てくるのでしょうか。
0744739
2005/08/26(金) 17:27:54SAFE_DELETE( g_Array[i] );
でも、合っているのだろうか。
0745デフォルトの名無しさん
2005/08/26(金) 17:28:140746デフォルトの名無しさん
2005/08/26(金) 17:31:25要素に触るたびに毎回コピーされるから、大量のメンバーを抱えたclassなら
直接コンテナに放り込むのはやめた方がいい。
0747デフォルトの名無しさん
2005/08/26(金) 17:52:27思いっきり勘違いしていそうなんだが、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するとして。
0748739
2005/08/26(金) 18:05:27シングルトン? ジョン・シングルトンさんですか?
というのは冗談で、昔調べましたが意味わからんでした。
シングルトンパターンってなんぞや とw
>>746
実際に扱うclassはいろいろ数値を入れ込みますので
newしておきます。 vector 要素 コピー でググルと興味深い話が
>>747
大丈夫です 昔deleteして、苦しめられましたから。
0749デフォルトの名無しさん
2005/08/26(金) 18:48:08つ[オブジェクト指向における再利用のためのデザインパターン]
0750デフォルトの名無しさん
2005/08/26(金) 18:54:07インスタンスは常に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にし、
別途、インスタンス取得/解放用の関数を用意する。
こうすることで、ソースのどこからでもインスタンスを参照できる
ただし、最後にインスタンスを解放するのを忘れてはならない。
0751デフォルトの名無しさん
2005/08/26(金) 19:14:090752デフォルトの名無しさん
2005/08/26(金) 21:06:00char ch;として
scanf("%c", &ch);
ってやるのと
ch = getchar();
ってやるのってどうちがうの?
0753デフォルトの名無しさん
2005/08/26(金) 22:03:33ch = getchar() は、ファイル終端コードが判定できずに暴走する。
0754デフォルトの名無しさん
2005/08/26(金) 22:08:42getcharってちゃんとEOF返すようになってなかったっけ?
man見る限りじゃそう書いてあるが
0755デフォルトの名無しさん
2005/08/26(金) 22:26:31「文字以外の入力」って何?
何を入力したら暴走するの?
0756デフォルトの名無しさん
2005/08/26(金) 22:29:00暴走しません。君の使い方がおかしいだけです。
0757デフォルトの名無しさん
2005/08/26(金) 22:33:43>>752はchをchar型にしてるからEOFをうまく認識しない(またはEOFでない文字をEOFと判定してしまう)
0758デフォルトの名無しさん
2005/08/26(金) 22:38:06getche()を使えと、そういうことですね?
0760デフォルトの名無しさん
2005/08/26(金) 22:39:48まあ、フォーマットに沿わない文字列を渡すと嫌なことにはなる。
#include <stdio.h>
int main(){
int i;
do{
printf("数字を入力してください:");
scanf("%d", &i); // ここで'a'を渡すと・・・・・・
printf("[ %d ]\n", i);
} while(1);
return 0;
}
>758
getchar()はintで受けろという話。
0761デフォルトの名無しさん
2005/08/26(金) 22:42:24そんなことは聞いていない。
>scanf("%c", &ch); は、文字以外の入力で暴走する。
「文字以外の入力」って何?
何を入力したら暴走するの?
0762デフォルトの名無しさん
2005/08/26(金) 22:44:20ID表示無いのって不便な・・・
0763デフォルトの名無しさん
2005/08/26(金) 22:48:05戻り値が違うので、EOFの判定の仕方が違う。
0764デフォルトの名無しさん
2005/08/26(金) 23:03:39classObjectのポインタから実体にアクセスする方法なんですが、
classの配列をnewで宣言した場合に、
配列の一つのObjectのメソッドにアクセスするときには
_obj[i].init();
と書かないといけなくて、
配列ではなく単体でnew宣言したObjectの場合は、
_obj->init();
と書かないといけない理由がわかりません。
上のように書けばコンパイル通って動作も問題ないんですが、
どうにも納得いきません。
どこかこのへんの事を詳しく書いてあるサイトとか無いでしょうか?
コンパイル環境:bcc32 v5.5.1
0765デフォルトの名無しさん
2005/08/26(金) 23:09:03単独オブジェクトのメンバのアクセス 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();
0766デフォルトの名無しさん
2005/08/26(金) 23:09:48そりゃC++以前の問題。Cの構造体と配列とポインタから勉強し直してくれ。
0767765
2005/08/26(金) 23:10:04誤>単独オブジェクトへのポインタ Object x = new Object();
正>単独オブジェクトへのポインタ Object* x = new Object();
0768デフォルトの名無しさん
2005/08/26(金) 23:14:01型を意識しろ。
classObject a[10];
classOjbect* p = new classObject;
a[0] はclassObject。メンバアクセスには . を使う。
p はclassObject*でポインタなので、メンバにアクセスするには -> を使う。 p->Init()
*p とすればclassObjectになるので . が使える。ただし演算子の優先順位があるので (*p).Init() と書く。
0769デフォルトの名無しさん
2005/08/26(金) 23:15:0910,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;
}
}
}
0770デフォルトの名無しさん
2005/08/26(金) 23:19:45fgetcを使うのは既定事項なの?
もっと他にやりやすい方法があると思うんだが。
0771764
2005/08/26(金) 23:22:37ありがとうございます。
_obj* p0 = new _obj();
p0->init();
_obj* p1 = new _obj[10];
p1[2].init();
↑
これが通る(こうしないと通らない)のは、
_obj[i] ってやった時点で、もう実体を指してるってことですか…。
>766
痛いです。
やっぱCの基礎をちゃんと押さえておく必要がありますよね…w
0772デフォルトの名無しさん
2005/08/26(金) 23:23:53int 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 じゃないか?
0773デフォルトの名無しさん
2005/08/26(金) 23:24:21_obj[i] は *(_obj + i) と同じなので、_objがclassObject*型なら*(_obj + i)はclassObject型になる。
だからメンバアクセスには . を使う。
0774デフォルトの名無しさん
2005/08/26(金) 23:26:31int 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;}
}
0775774
2005/08/26(金) 23:27:200776デフォルトの名無しさん
2005/08/26(金) 23:31:01strtokを使って分割した方がやりやすそうなんですが、今回はこれで。
getcとfgetcはほとんど同じだとあったのでfgetcにしてみたんですがだめですか。
0777デフォルトの名無しさん
2005/08/26(金) 23:33:26すいません、更新してなかったのでアンカー入れ忘れました。
試してみます、ありがとうございました。
0779デフォルトの名無しさん
2005/08/26(金) 23:42:00getchar の代わりに fgetchar を使うやつってほとんどいないだろう?
getc の代わりに fgetc を使うのは、それと同じ。
0780デフォルトの名無しさん
2005/08/26(金) 23:47:01(_obj+i)->int();
とでもやってろ
そんなとこでw使うなキモイ
笑うとこじゃねぇだろ能無しが
0781デフォルトの名無しさん
2005/08/26(金) 23:49:53ハイ次ドゾ
0782デフォルトの名無しさん
2005/08/26(金) 23:51:04getsとfgetsなら後者を使うのが推奨されるのでそういう説明は良くないと思うが。
0783デフォルトの名無しさん
2005/08/26(金) 23:52:32fgetcharが使われないのは標準でないということもある。
0784デフォルトの名無しさん
2005/08/26(金) 23:54:36getcに関数版とマクロの両方を用意しなければならないんだし。
0785デフォルトの名無しさん
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;
}
0786デフォルトの名無しさん
2005/08/27(土) 02:53:041で割ったあまりは0
0787デフォルトの名無しさん
2005/08/27(土) 02:55:00>break; /*これでfor文抜け出せますか?*/
内側のforは抜けられるけど、外側のforは抜けられない。
0788デフォルトの名無しさん
2005/08/27(土) 03:08:170789デフォルトの名無しさん
2005/08/27(土) 03:31:08きったねーコード!
0790デフォルトの名無しさん
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;
}
0791デフォルトの名無しさん
2005/08/27(土) 07:00:03C++ではなくて、Cです。(C++とCの違いがあまりわかりませんが)
いきなり質問なのですが、コンパイルで、
「invalid operands to binary+」というエラーがでてしまうんですが、これはどのようなエラーなのでしょうか?
いくつか自分で気づいた点を修正したのですがいくらやっても直りませんでした。
できればこちらのソースを貼ってマズイところを教えていただきたいのですがよろしいですか?
0792デフォルトの名無しさん
2005/08/27(土) 07:51:28ソース貼れ。コンパイラの種類とバージョンも書け。
0793デフォルトの名無しさん
2005/08/27(土) 08:12:25"invalid operands to binary+" というそのままじゃないか。
「二項演算子 + のオペランド(項)が無効」とでも訳せばいいだけかと。
なに足し算すりゃこうなるんだと思ったら、gcc なら 10.0 + "10" とか?
0794デフォルトの名無しさん
2005/08/27(土) 08:14:270795デフォルトの名無しさん
2005/08/27(土) 09:00:29だから画像処理スレと同じ聞き方したら同じ答しか帰ってこないに決まっているだろう。
問題のソースを貼れよ、この低濃。
0796デフォルトの名無しさん
2005/08/27(土) 10:13:550797デフォルトの名無しさん
2005/08/27(土) 10:29:08man remove
0798デフォルトの名無しさん
2005/08/27(土) 11:07:140799デフォルトの名無しさん
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]; //各レンジに対し、どのドメインを持ってくるか
0800791
2005/08/27(土) 12:02:41scanf("%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++){
0801791
2005/08/27(土) 12:03:36dif=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です。
0802デフォルトの名無しさん
2005/08/27(土) 12:04:26この時点で読む気がなくなる俺がいる。
変数宣言は利用する最も狭いスコープでしろ。
0803デフォルトの名無しさん
2005/08/27(土) 12:09:01いざ貼ったら読む気しないってw
馬鹿じゃねーのwww
0804デフォルトの名無しさん
2005/08/27(土) 12:10:210805デフォルトの名無しさん
2005/08/27(土) 12:10:59Cの2次元配列の使い方が間違っとる。
× pic[i,j]
○ pic[i][j]
0806805
2005/08/27(土) 12:13:30なってしまっているので、 + 演算ができない。
unsigned char x[10];
unsigned char y[10];
で、
x + y の計算をしようとしているようなもの。
0807デフォルトの名無しさん
2005/08/27(土) 12:27:54BYTEはなんのtypedefですかと・・・
0808デフォルトの名無しさん
2005/08/27(土) 12:29:09コンパイルできました!ありがとうございます!
と思い実行したら・・・core dump・・・
0809デフォルトの名無しさん
2005/08/27(土) 12:53:58ハァ?
0810デフォルトの名無しさん
2005/08/27(土) 13:13:26・コアを吐く原因の一点目
コピペばかりでプログラムを組むのはやめた方がいいよ。
forの条件をよく見てご覧。
0811デフォルトの名無しさん
2005/08/27(土) 13:19:22・コアを吐く原因の二点目
問題の絶対値を計算している行。座標値を確認しよう。
ここで、i、jの値はそれぞれXSIZE-1、YSIZE-1になるが、それを2倍したら当然領域外になる。
0812デフォルトの名無しさん
2005/08/27(土) 13:35:16ありがとうございます!
よく確認してみます。
自分の力でできるかわからないですけどね・・・_| ̄|○
0813デフォルトの名無しさん
2005/08/27(土) 15:45:32おまえんとこは "aaa"+"bbb" や char *x,*y; x+y; が計算できるのかと(ry
>>812
Cを知らないのは致命的だが、今から習えば、来年の夏ごろまでには…
まあ、誘導されてこのていたらくなら、それ以前に見込み無さそうだが…
0814デフォルトの名無しさん
2005/08/27(土) 18:45:57ポインタ同士の足し算はどうだかわからんケド、引き算は使うことないか?
void foo(char* pTop) {
char* pFoo = strchr(pTop, '/');
int iLen = 0;
if (pFoo) iLen = pFoo - pTop;
……
}
0815デフォルトの名無しさん
2005/08/27(土) 19:10:44なあ、ボクちゃん、足し算わかってからでなおそうな。ヴォケ。
当然、自明の話をしてるだけなんだが、これまた厨は……
0816デフォルトの名無しさん
2005/08/27(土) 19:13:450817デフォルトの名無しさん
2005/08/27(土) 19:14:400818デフォルトの名無しさん
2005/08/27(土) 19:34:480819デフォルトの名無しさん
2005/08/27(土) 19:42:17ptr_diffの間違いでは?
0820デフォルトの名無しさん
2005/08/27(土) 19:54:140821デフォルトの名無しさん
2005/08/27(土) 20:00:52そうだった。うん。知らなかったわけじゃないよ!?
0822デフォルトの名無しさん
2005/08/27(土) 21:41:38うちにあるやつでは ptrdiff_t だなあ。
頭痛すぎなんで釣られておくsigh. ってもうやめろ。
0823デフォルトの名無しさん
2005/08/27(土) 22:24:000824デフォルトの名無しさん
2005/08/27(土) 23:09:06false ってなんて読むの?
ふぁるす? ふぇいるす?
0825デフォルトの名無しさん
2005/08/27(土) 23:14:350826デフォルトの名無しさん
2005/08/27(土) 23:14:36英和辞典か英英辞典見ろ
0827デフォルトの名無しさん
2005/08/27(土) 23:16:170828デフォルトの名無しさん
2005/08/27(土) 23:43:25http://dictionary.goo.ne.jp/voice/f/00030585.wav
「ふぉーるす」だと思うが
goo辞書先生は「ふぉーす」と発音しているように聞こえる
0829デフォルトの名無しさん
2005/08/27(土) 23:49:28ありがとう。ふぉーすって聴こえるね。
まぁ、無難に「ふぉーるす」って読むことにするよ
ありがと
0830デフォルトの名無しさん
2005/08/27(土) 23:53:390831デフォルトの名無しさん
2005/08/28(日) 00:11:45false のどこに巻き舌(r)の発音があるのかと
つうか、いい加減板違い
0832デフォルトの名無しさん
2005/08/28(日) 06:34:15Acceptをアセプトだの、しまいにゃResultをレサルトだの、呆れて物も言えんわ
0833デフォルトの名無しさん
2005/08/28(日) 06:47:330834デフォルトの名無しさん
2005/08/28(日) 06:59:220835デフォルトの名無しさん
2005/08/28(日) 07:42:230836デフォルトの名無しさん
2005/08/28(日) 07:50:390837デフォルトの名無しさん
2005/08/28(日) 11:01:50無理.
0838デフォルトの名無しさん
2005/08/28(日) 11:04:430839デフォルトの名無しさん
2005/08/28(日) 12:40:300840デフォルトの名無しさん
2005/08/28(日) 16:16:270841デフォルトの名無しさん
2005/08/29(月) 12:09:59int Function(char** text);な形の関数内で一文字づつスキャンしているのですが、次の文字へ移動する際に
(textは文字列へのポインタのポインタ)
*str += 1; or *str = *str+1; //正常に動作
*str++; //アクセス違反発生
となるのですが上と下では動作がどのように異なるのでしょうか?
0842デフォルトの名無しさん
2005/08/29(月) 12:27:200843デフォルトの名無しさん
2005/08/29(月) 12:29:33*や++は結合則が右から左
*str++は(*str)++じゃなくて*(str++)になる
0844デフォルトの名無しさん
2005/08/29(月) 13:36:00*が演算子てのを失念してましたorz
0845デフォルトの名無しさん
2005/08/29(月) 15:24:36ポインタ自体のインクリメントの違い
0846デフォルトの名無しさん
2005/08/29(月) 16:07:58x=x>>32;
とした時、x=0にはならないんですか?
0847846
2005/08/29(月) 16:34:57結果は未定義になるということがCの仕様に出ていたので
0になるわけではないようですね。
0848デフォルトの名無しさん
2005/08/29(月) 18:17:15おまえさん、わざわざ間違えやすいことしてないか?
文字列を受け取ってそれを一文字ずつスキャンしたいなら、
int Function(char *text); にして、text[i]で見ればいいじゃないか
0849デフォルトの名無しさん
2005/08/29(月) 19:55:15こんな感じで使うのでchar*渡しだとダメなのです。
char hoge[] = "C5D5D5#";
char *ichiji = hoge;
char note;
while(0 <= (note = Function(&ichiji)) ) //NULL文字が出現すると-1返す
printf("%d\n", note);
60
61
62
0850デフォルトの名無しさん
2005/08/29(月) 20:09:500851デフォルトの名無しさん
2005/08/29(月) 20:16:400852デフォルトの名無しさん
2005/08/29(月) 20:40:04printf("%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です。
頭こんがらがってます。助けてください。
0853デフォルトの名無しさん
2005/08/29(月) 20:52:49>BYTE* b=(BYTE*)"い";
>char* c="い";
バカかオマエは・・・
0854デフォルトの名無しさん
2005/08/29(月) 20:53:220855デフォルトの名無しさん
2005/08/29(月) 20:54:150856デフォルトの名無しさん
2005/08/29(月) 21:09:20char b = 0x80;
printf("%x %x\n",a,b);
0857デフォルトの名無しさん
2005/08/29(月) 21:24:13printf("%d %d\n",a,b);
0858デフォルトの名無しさん
2005/08/29(月) 21:27:08まぁ、あれだ。
ポインタについて勉強しなおせ。
0859デフォルトの名無しさん
2005/08/29(月) 21:32:01printfが変数のバイトサイズを認識する手段は書式にしかない。
%x と書けば、全部 int 型 と扱われる。
0860デフォルトの名無しさん
2005/08/29(月) 21:34:49printfの処理の中では char 型で処理されることはない。
%cの処理でも、いったんintにされたものをchar型にキャストしている。
0861デフォルトの名無しさん
2005/08/29(月) 21:36:170862デフォルトの名無しさん
2005/08/29(月) 21:42:090863デフォルトの名無しさん
2005/08/29(月) 21:55:07お前んとこではcharがsignedになっているんだろう。
だから*cは-126になる。
printfなどの可変個引数では必ず格上げしてint/unsigned int以上の型へ変換して引数を渡すことになる。
-126をintへ変換した値を16進法であらわすとffffff82になる。(intが32ビットとして)
0865デフォルトの名無しさん
2005/08/30(火) 05:32:08charは普通signedだろ
0866デフォルトの名無しさん
2005/08/30(火) 05:43:20unsignedの場合もある。つーか、オプションで切り替えることさえできる場合が多い。
0867デフォルトの名無しさん
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;
}
}
0868デフォルトの名無しさん
2005/08/30(火) 10:28:19転送元を走査する速度を1/n倍にすれば、転送先ではn倍になる。
0869デフォルトの名無しさん
2005/08/30(火) 10:35:52これって転送先が100*1になっているようにみえるけど気のせい?
0870デフォルトの名無しさん
2005/08/30(火) 10:41:19質問するならちゃんとした情報を書いてくれ。
そういや、この場合って拡大時の画素間の補完はしなくていいの?
0871デフォルトの名無しさん
2005/08/30(火) 10:48:47for分の 増加分を 0.5にしてみましたけど駄目でした
>>869
はい フォント表示なんですけど10×10の文字が表示されます
>>870
fnt = (unsigned short *)&zenkaku_font10[n*10];
pt = *fnt++;
pt がフォントデータのアドレスなのかも
0872852
2005/08/30(火) 10:52:03printfで%xはバイナリデータがそのまま渡されるのかと思い込んでました。
charはsigned intにされて、byteはunsigned intにされて渡されていたからだったのですね。
よくわかりました。
ありがとうございました。
0873デフォルトの名無しさん
2005/08/30(火) 10:57:490874デフォルトの名無しさん
2005/08/30(火) 10:59:37>for分の 増加分を 0.5にしてみましたけど駄目でした
おまえ何も理解して無いだろ。
0875デフォルトの名無しさん
2005/08/30(火) 11:03:02して書き込む」ってでてくんですよ。そしたら、一番下にクッキーを設定すれ
ばこの表示はなくなりますって書いてあって。意味不なんですけど。教えて下
さい。そもそもクッキーっていう意味がわからんし。
0876デフォルトの名無しさん
2005/08/30(火) 11:05:43鼬害。人に聞く前に自分で調べる習慣を身につけましょう。
0877デフォルトの名無しさん
2005/08/30(火) 11:08:04vrの初期値を見る限り、vramは横512画素分あるように見える。
翻ってその後のvrの振る舞いを見る限り、縦方向には増やされていないから
>869の言うように10x10にはならないと思うのだが。
#つーか、先ずはきちんと動いているものを貼れよ。
0878デフォルトの名無しさん
2005/08/30(火) 11:09:15> クッキーっていう意味がわからんし
お菓子だ。
0879デフォルトの名無しさん
2005/08/30(火) 11:13:07動いてるんですよ ほんとに
0880デフォルトの名無しさん
2005/08/30(火) 11:14:32ならばソースを晒せ
vramの表示に関係するところも含めて
0881デフォルトの名無しさん
2005/08/30(火) 11:15:43#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;
}
0882デフォルトの名無しさん
2005/08/30(火) 11:16:22お言葉ですが、あなたのように即そういう風に決め付けてしまうのもどうかと
思います。私は何度も2ちゃんのガイドラインを読みました。しかし、クッキ
ーという単語はかいてありましたがその意味はかいてありませんでした。なの
でこの掲示板にきて質問してみたのです。私も初心者ですがそのような最低限
なことは心得てるつもりです。 あ、取り乱してしまいましたね、すいません
。ちょっと話がそれてしまったので改めて聴きます。>>875について誰か
教えて下さい。
0883デフォルトの名無しさん
2005/08/30(火) 11:19:010884デフォルトの名無しさん
2005/08/30(火) 11:20:16それだけじゃちゃんと動いてるのか確認できないだろ
>>883
基地外は放置しとけ、後2日の辛抱だ
0885デフォルトの名無しさん
2005/08/30(火) 11:23:40「最低限なことは心得てるつもり」なら、
Cookieという単語にういてもう一度良く調べてください。
ttp://e-words.jp/w/Cookie.html
ちなみに、クッキーはインターネット上では一般的な用語です。
あと、激しくスレ違いです。
ガイドラインを何度もよく読んだなら、ちゃんと理解しましょう。
0886デフォルトの名無しさん
2005/08/30(火) 11:25:41スレタイの【初心者歓迎】だけを読んだんだろ、きっと。
0887デフォルトの名無しさん
2005/08/30(火) 11:29:41ちなみにpspのプログラムなので パソコン環境では試せないかも?
0888デフォルトの名無しさん
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;
}
0889デフォルトの名無しさん
2005/08/30(火) 11:41:06ありがとうございます
それでいけそうな気配です
あとは行間等の数値も倍にするだけです
いっぱいレス使っちゃって申し訳ありませんでした
0890デフォルトの名無しさん
2005/08/30(火) 12:31:39しかし、汚いプログラムだなぁ。元が汚いからしょうがないっちゃしょうがないが。
0891デフォルトの名無しさん
2005/08/30(火) 23:33:01「ローカル変数の寿命は、スコープを抜けた所まで」、という事がどの初心者本にも書いてありますが、
setter(参照渡し)でクラスのメンバ変数に格納した場合、スコープを抜けてもそのまま使えるようです。
これは、こういう使い方をしても良いものでしょうか?
それとも、偶然動いているだけですか?
void Hoge() {
//このhogeがスコープを抜けた後も、m_pClass->GetHoge()で拾える
CHoge hoge;
//Class::SetHoge(CHoge& hoge)
m_pClass->SetHoge(hoge);
}
0892デフォルトの名無しさん
2005/08/30(火) 23:39:12Class::SetHogeの中で何やってるかわからんから推測になるが
中でhogeのコピーを取ってるならOK。
0893デフォルトの名無しさん
2005/08/30(火) 23:41:150894デフォルトの名無しさん
2005/08/30(火) 23:41:40スコープを抜けてもすぐに使えなくなるわけではない。
その変数のメモリ領域が新たに使われるまでは、元のデータがそのままになっている。
だから一見するとそういうことをしても動くように見える。
0895偽616
2005/08/30(火) 23:43:33//このhogeがスコープを抜けた後も、m_pClass->GetHoge()で拾える
CHoge hoge;
//Class::SetHoge(CHoge& hoge)
m_pClass->SetHoge(hoge);
}
ローカル変数は
{
}
の中で有効と覚えておけばよろし。
0896デフォルトの名無しさん
2005/08/30(火) 23:53:42ああ、なるほど。
よく考えたら、無意識にコピーしてました。
Class::SetHoge(CHoge& hoge){
m_hoge = hoge;
}
0897デフォルトの名無しさん
2005/08/31(水) 02:09:20n<<3 と n*255/31 ではどちらが良いでしょうか。
0898デフォルトの名無しさん
2005/08/31(水) 02:16:13お前に目は無いのか?
0899デフォルトの名無しさん
2005/08/31(水) 02:54:26その二つの結果が違うことは理解しているよね?
0900デフォルトの名無しさん
2005/08/31(水) 03:16:30人のソース見ると速度優先なのか大抵、<<3で済ませてますが、
31が255でなくなるので、*255/31にしたのですが、これはこれで、
中間色が中途の様な気がして。
それで、(n+1)<<5 -1 なんてのも考えましたが、これだと中間色は
良くとても0が0で無くなるし、と悩んでます。
0901デフォルトの名無しさん
2005/08/31(水) 07:34:40テーブル引きはどうだ。
0902デフォルトの名無しさん
2005/08/31(水) 07:59:28その変換の目的をよく考えて、適切な方法を採るしかないっしょ。
速度優先なのか、画質優先なのか。
画質優先の場合、白は255/255/255でなければならないかどうか。
中間色の場合も要求の如何によるし。
どちらの場合もテーブル参照なら比較的高速で融通が利くんじゃない?
#私の場合は4→8ビットだったから迷わず17倍したけどね。
0903デフォルトの名無しさん
2005/08/31(水) 08:06:580904デフォルトの名無しさん
2005/08/31(水) 09:47:06sbb命令使って、0のときだけ0にすればよろし。
0905デフォルトの名無しさん
2005/08/31(水) 13:02:04他のコンストラクタを呼び出すためには、どう書けばいいですか?
Javaでいう、this();のような記述です。
0906デフォルトの名無しさん
2005/08/31(水) 13:08:14placement new を使えば実行はできるが、
おそらく望んだ結果ではないからやめたほうがいい。
共通処理を static メンバ関数にするか、
もしくは共通の初期化を行うクラスを用意して
今作成しているクラスはそれを派生するかメンバに持つと良い。
0907デフォルトの名無しさん
2005/08/31(水) 13:10:08ありがとうございます。
0908デフォルトの名無しさん
2005/08/31(水) 17:56:24int iResult;
現在4バイトのchar型配列ctmpと
int型変数iResultがあります。
配列ctmpの頭から10, 20, 30, 40を使い
iResultに数字10203040を入れたいのですが
うまくいきません。ヒントをいただけないでしょうか。
16進数の数字をそのまま10進数にする
という部分でどうやればいいのか今イメージできていません。
環境はwinxp, VC++6.0です。
0909デフォルトの名無しさん
2005/08/31(水) 18:01:11オーバーロードしたんなら、普通に呼び出したいコンストラクタを呼び出せばいい
class Hoge {
Hoge() { return; }
Hoge(int i);
}
Hoge::Hoge(int i) {
Hoge();
return;
}
オーバーライドしたんなら、ParentClass::ParentClass()として呼べばいい
0910デフォルトの名無しさん
2005/08/31(水) 18:03:29#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);
}
0911デフォルトの名無しさん
2005/08/31(水) 18:48:10ありがとうございます、iResultの変化は
00000000
00000010
00001000
00001020
00102000
00102030
10203000
10203040
となり、シフトしてから足すのですね、
シフトでできるという発想が出てこずに苦しんでおりました、
ありがとうございます、精進します。
0912デフォルトの名無しさん
2005/08/31(水) 19:42:29いやさ、(どうせ非現実的な処理だし)表示の問題だけですむならいいけど、
>>配列ctmpの頭から10, 20, 30, 40を使い
ここは初期化の部分どおり 0x10, .... だとしても、
>>iResultに数字10203040を入れたいのですが
>>16進数の数字をそのまま10進数にする
>>という部分でどうやればいいのか今イメージできていません。
この 10203000 が 16進か 10進か曖昧すぎるのだが…
>>となり、シフトしてから足すのですね、
>>シフトでできるという発想が出てこずに苦しんでおりました、
シフトというよりは、(シフトか掛け算で)必要なだけの桁の繰り上げを
行う、というだけのことだよね。(プログラムじゃなく算数)
0913デフォルトの名無しさん
2005/09/01(木) 02:03:35よくねーよ。
初心者も多く見てるスレなんだから、ネタならネタと分かるように書いてくれ。
0914デフォルトの名無しさん
2005/09/01(木) 03:12:26バーカ
0915デフォルトの名無しさん
2005/09/01(木) 06:55:06(´,_ゝ`)
0916881
2005/09/01(木) 09:38:46拡大できたのはいいのですが元のグラフィック(フォントデータ)が
荒いため 拡大すると荒さが目立ってしまいます
そこで最初から大きなフォントを実装したいのですが
やり方がわかりません
pspの開発環境ではまだ 内蔵フォントは使えないので自作するしかありません
出来れば16×16くらいのフォントを実装したいです
C言語で やるとしたらどうやりますか?
0917デフォルトの名無しさん
2005/09/01(木) 09:54:33GBAだと第二水準まで全部もってきても余裕があった
PSPは知らないが大丈夫だろう
その時はhoge[]=みたいな形に変換するツールを作った
ソースファイルがS-JISだと不都合があった事を付け加えておく
フリーフォントを使いたいならみかちゃんフォントを推薦する
0918デフォルトの名無しさん
2005/09/01(木) 10:07:36今、自分で使えるプログラムランチャーを作成しています。
ウィンドウ部分のボタンのフォントを変更しようと思うのですが、
どうするかがわかりません。
どなたか教えていただけないでしょうか
0919デフォルトの名無しさん
2005/09/01(木) 10:22:02あらわす時はこれでいいのかな。意見求む
class CHoge{
public:
CHoge& operator++();
CHoge& operator++(int){
static CHoge tmp;
tmp = *this;
operator++();
return tmp;
}
}
0920デフォルトの名無しさん
2005/09/01(木) 10:36:35後置++は値を返すべきだと思う。
CHoge operator++(int)
CHoge tmp(*this);
++*this;
return tmp;
}
0922デフォルトの名無しさん
2005/09/01(木) 11:31:36コンソールアプリを作っているのですが
パスワード入力のところで、エコーバック無しで文字を入力させたいのですが
どのようにすれば良いのでしょうか?
SetConsoleModeとか?いろいろやってみたのですがダメです。
0923881
2005/09/01(木) 11:48:12pspだとほとんど10×10の ナガフォントで
これ以上の大きさのフォントを使ってるソースが見つかりません
というわけでGBAの方をしらべてみましたが
font.c とかのファイルにテキストデータとして吐き出すツールが
無いようで 行き詰まってしまいました
0924デフォルトの名無しさん
2005/09/01(木) 11:50:56プログラムは探すものじゃない。書くものだ。
0925922
2005/09/01(木) 12:05:12Win32API質問箱に投げるつもりでした。忘れてください。
0926デフォルトの名無しさん
2005/09/01(木) 12:09:22分かってるとは思うけど一応書いておくと、
CHoge hoge;
hoge++++;
を防止するために返値はconstにすべき
0927デフォルトの名無しさん
2005/09/01(木) 12:24:56JISに16x16のドットパターンなかったっけ?
昔使った記憶があるのだけれど。
#但し、JIS1973だったかも知れず。
0928デフォルトの名無しさん
2005/09/01(木) 12:29:34CTestcls::temp(int ifd)
{
ifstream test(ifd);
というようなifstreamをファイルディスクリプタで
扱うことをやっていたのですが
gccのバージョンがあがったら
ifstream(int fd) : fstreambase(fd)
の定義が無くなっちゃいました。
これどうしたらよいんでしょうか?
0929デフォルトの名無しさん
2005/09/01(木) 12:34:41意味のない操作だからといって禁止する必要があるとは思えないんだが。
どちらかというとインターフェースを標準ライブラリに合わせる方が重要じゃないか?
0930デフォルトの名無しさん
2005/09/01(木) 12:55:50int i;
i++++;
と同じくエラーするってことだろ。
0931デフォルトの名無しさん
2005/09/01(木) 16:40:02どっち使ったほうがいいですか?
それぞれ特徴があったら教えていただけませんか?
0932デフォルトの名無しさん
2005/09/01(木) 16:42:04new: 失敗したらbad_alloc例外投げる 構造体ならコンストラクタが呼べる
0933デフォルトの名無しさん
2005/09/01(木) 17:04:430934デフォルトの名無しさん
2005/09/01(木) 17:53:05・指定したサイズの領域を確保し、そのポインタを返す
・型を気にせず(キャストして)領域を使える
・コンストラクタは呼ばない
new
・指定した型の変数を作り、そのポインタを返す
・コンストラクタを呼ぶ(クラス/構造体の場合)
(※deleteの場合はデストラクタ)
・配列で確保する場合は[]を付けなければならない
・オーバーロード可能
0935デフォルトの名無しさん
2005/09/01(木) 18:25:58long型配列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);
0936デフォルトの名無しさん
2005/09/01(木) 18:43:160937デフォルトの名無しさん
2005/09/01(木) 18:46:470938デフォルトの名無しさん
2005/09/01(木) 19:09:49OpenDialog()云々とファイル取り扱いは問題を分けるべきだし、コードも分けるべきだ。
後者は、RAWデータはバイナリなのではないのかな?
だとすればdatabox[i][j] = buf[0] | buf[1] << 8;でいいと思うのだが。
エンディアンが逆ならば、buf[0] << 8 | buf[1]でいい。
#つーか、文字列とバイト列の違いがわかっていない悪寒。
0939デフォルトの名無しさん
2005/09/01(木) 19:58:08使っている者です。
環境は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にはありません。
みなさんはこういう場合、どうコーディングされてます?
0940デフォルトの名無しさん
2005/09/01(木) 20:07:090941デフォルトの名無しさん
2005/09/01(木) 20:07:290942デフォルトの名無しさん
2005/09/01(木) 21:05:53strtokを使えばなんとかなるらしいのですが、正しいでしょうか?
ほかにもっと良い方法などあればお教えください。
0943デフォルトの名無しさん
2005/09/01(木) 21:09:55strtokで可能
後はscanfで読み込むとか、getcで読んでいってカンマが出た時点で区切るとか
0944デフォルトの名無しさん
2005/09/01(木) 21:10:07strlen関数を自作してみればやり方が分かると思うお
分割した文字列からの変換はatoiでやれば済む話だし
0945デフォルトの名無しさん
2005/09/01(木) 21:10:58プログラマのプロはプロフェッショナルのプロじゃないから、
カテゴリとしては君もプログラマだと思う。
0946デフォルトの名無しさん
2005/09/01(木) 21:15:380947デフォルトの名無しさん
2005/09/01(木) 21:19:28ありがとうございます。何とかなりそうです。
strtokとatoiを使ってやってみようと思います。
0948偽616
2005/09/01(木) 21:43:04こんなんでよければどうぞ
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;
}
}
}
0949偽616
2005/09/01(木) 21:45:37の下に
p++;
を追加しておいて
0950デフォルトの名無しさん
2005/09/01(木) 22:01:04これなんですけど、動作チェックをお願いできませんか?
レスはリンク先にお願いします。
上記を利用して
http://www5b.biglobe.ne.jp/~NAS6/html/Others.htm
*:2chのスレッドレス数の監視とコテハンの発言日時をダンプします。ソースつき。
こんなの作ったんですが・・・いや宣伝です。
0951デフォルトの名無しさん
2005/09/01(木) 22:04:060952デフォルトの名無しさん
2005/09/01(木) 22:08:45最低な奴だな
0953950
2005/09/01(木) 22:16:48直したいので教えてください。
レスはリンク先って書いておけばマルチじゃないと思っていましたが・・・
リンク先を読んでる人がいないのでは?と思いここにレスしたのですが。
0954デフォルトの名無しさん
2005/09/01(木) 22:23:04とりあえずマルチはやめろと
691 名前:634[] 投稿日:2005/09/01(木) 14:51:40
http://www5b.biglobe.ne.jp/~NAS6/html/Others.htm
*:2chのスレッドレス数の監視とコテハンの発言日時をダンプします。
出来た〜!晒しちゃおう。手抜きだけど、ソースつき。
是非是非、DLしてね。
>>637さん重ね重ね有難う。
0955950
2005/09/01(木) 22:26:56ごめんなさい。
「レスはリンク先に」でもマルチになるんですね。
スレ汚しは重ね重ねごめんなさい。
0956デフォルトの名無しさん
2005/09/01(木) 22:27:19・動作チェックしてくれと言うだけで、どこがどうおかしいかも書かない。
・他人にモノを頼んでおいてレスはリンク先へと我が儘放題。
・どんなクラスかどんな関数なのか一切情報がない。
・コードが最低最悪。
これだけ揃ってれば>952も当然だな。
0957デフォルトの名無しさん
2005/09/01(木) 22:27:36自分が作ったプログラムのデバッグを
他人にやらせるのはどうかってことでしょ。
仕様が良く分からないプログラムを動かしたら
何が起きるかわからないわけだし。
最低限、簡単な機能仕様を提示して
ソースに処理の内容がわかる程度にコメントが付いてれば
添削してくれる人はいるかもね。
手抜きで書いたソースなぞ見たくもないがな。
0958950
2005/09/01(木) 22:27:410960偽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;
}
}
}
南無三
0961偽616
2005/09/01(木) 22:41:48~
intList[i] = atoi(pp);
三度目の正直じゃなかったけど、告白
0962デフォルトの名無しさん
2005/09/01(木) 22:43:48signed→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];
}
0963デフォルトの名無しさん
2005/09/01(木) 22:44:21char が signed char の環境では、 isidigit((int)*p) は間違い。
0964偽616
2005/09/01(木) 22:52:40/* 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にキャストする必要がありそうです。
。・゚・(ノД`)ヽ
0965デフォルトの名無しさん
2005/09/01(木) 22:53:39元を残しておく必要がなければ、こうできる。
unsigned char *uc_after = reinterpret_cast<unsigned char *>(sc_before);
/* ucを処理 */
後はsc_beforeが元のコードのsc_afterとして使える。
ただ規格では負の値をunsignedへ変換するのは問題ないが、その逆は未定義か何かだったはず。
0966939
2005/09/01(木) 22:57:37>>945
Σ('A`) なぬ
それじゃグラマーなだけの営業屋だと思っていた俺は
0967デフォルトの名無しさん
2005/09/01(木) 23:55:17∩
_( ⌒) ∩__
//,. ノ ̄\ / .)E)
/i"/ /|_|i_トil_| / / / ̄ ̄ ̄ ̄ ̄
|ii.l/ /┃ ┃{. / / < ぱいぱい ボイン!ボイン!ボイン!
|i|i_/''' ヮ''丿i_/ \_____
i|/ ,ク ム"/ /
|( ヽ _,.-===、j、
ゞヽ‐イ/´ ヽ ヽ、
\! ::c:: ! :p
}ヽ __ ノ、_ノ
/ ノ ノ´
なのか?
0968デフォルトの名無しさん
2005/09/02(金) 00:19:53ありがとうございます。
>ただ規格では負の値をunsignedへ変換するのは問題ないが、
>その逆は未定義か何かだったはず。
ということは私のコードでも965さんのコードでも
問題ありということですよね。
そこを解決できないでしょうか?
signedのデータをある製品の関数に渡さなければいけないのですが、
製品の関数の入力と出力がunsignedで、出力されたunsignedを
元のsignedに変換する必要があるのです。
0970デフォルトの名無しさん
2005/09/02(金) 00:31:46char* b=(char*)calloc(100,1)と
char* c=(char*)calloc(1,100)とでは
確保されるメモリ領域のサイズは同じ?
0971デフォルトの名無しさん
2005/09/02(金) 00:33:53同じ
0972デフォルトの名無しさん
2005/09/02(金) 07:05:34ないですか?
エンディアンもこれは関係なさそうな気が
0973デフォルトの名無しさん
2005/09/02(金) 07:37:47std::stringstreamは入出力両用で、ostrstreamに対応するのはstd::ostringstreamだ。
0974デフォルトの名無しさん
2005/09/02(金) 07:38:53すまん。規格見たら「処理系定義の値になる」だった。
0975デフォルトの名無しさん
2005/09/02(金) 07:49:46例えばintが16ビットの環境で64K以上アクセスするときに便利。
0976972
2005/09/02(金) 08:29:08でも、sizeof(int)が4バイトか2バイトか分からない
状況でファイルフォーマット考えるっていうのもおかしいし。
あえて、可変にするのも逆に面倒そうな。...umm
0977デフォルトの名無しさん
2005/09/02(金) 10:35:36「文字列から文字の探索プログラム」
char *str_chr(const char *s,int c){
c = (char)c;
while(*s !=c){
if(*s == '\0')
retuern(NULL);
s++;
}
return((char *)s);
}
int main(void){
char *ptr;
char ch[2];
char letter[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
printf("英大文字を入力してください");
scanf("%s",ch);
if((ptr = str_chr(letter,ch[0])) ==NULL)
printf("%cは大文字ではありません。\n",ch[0]);
else
printf("%cから後のアルファベットは%sです。 \n",ch[0],ptr);
return(0);
}
ここで、関数 *str_chrの第二引数はint型としてあるのに、
main関数で char型のch[0]を受け取っています。
なのに、このコードはエラーが起きず、正常に動作します。
これはどうしてですか? おねがいします。
0978939 ◆4c2pT3Fe7o
2005/09/02(金) 11:37:41tnxざんす!
今見るとレキシカルキャストは「準」標準ライブラリboostなんですね。
スマートな中間記法はなかなかよさげですが、作る物はいろんな環境に持ちまわって
使っていきたいミニツール類なので、まずは標準ライブラリのstringstreamで作ってお
きます。
>>969 誰だおまへ
0979デフォルトの名無しさん
2005/09/02(金) 11:38:16charは暗黙にintに型変換される。問題ない。
0980977
2005/09/02(金) 13:00:55ありがとうございます。
暗黙に変換されるってことは、
仮引数と実引数の型が違っていても問題無いということですか?
でも、仮引数と実引数の型は同じにしないといけないと
教わったような・・・
0981デフォルトの名無しさん
2005/09/02(金) 13:15:52・関数プロトタイプがある場合
型が違ってもコンパイラが勝手に変換する。
なお、引き数の個数が違う場合はエラーとなる。
・関数プロトタイプがない場合
代表的な型であると仮定される。
#char、shortなどはintに、floatはdoubleに。
そうでない場合は異常値が引き渡されることになる。
なお、引き数の個数が違ってもエラーにはならない。
0982デフォルトの名無しさん
2005/09/02(金) 14:32:03マルチ乙。ヘソ噛んで死ね。
0983デフォルトの名無しさん
2005/09/02(金) 17:00:37いくら勝手に変換されるといっても、限度がある。
charで表せる値は必ずintでも表せるから暗黙のうちに変換される。
例外もあるが、long→shortなど、変換先の型のほうが小さい場合はキャストを明示しないとエラーや警告が出る。
0984デフォルトの名無しさん
2005/09/02(金) 20:22:31int --> char のケースがあまりに多くて禁止できなかったんじゃなかったっけ。
0985デフォルトの名無しさん
2005/09/02(金) 22:14:15ってのもD&Eに書いてあるな。
0986デフォルトの名無しさん
2005/09/03(土) 02:57:21int atox (char* c) {
char* p = c;
int n = 0;
int a = 'A' - 10;
int z = '0' - 10;
for ( ; p[0] != x; p++);
p++;
for(int x = strlen(p) - 1; x >= 0; x--) {
if (p[0] >= 'A' && p[0] <= 'F') {
// n += (p[0] - a) * 16^x;
}
else {
// n += (p[0] - z) * 16^x;
}
return n;
}
0987デフォルトの名無しさん
2005/09/03(土) 03:01:2416進数の文字列をINTに変換する方法を質問しようと思って文を考えてたら
変換方法を思いついてしまったので試しに書いてみてたら間違えて書き込んでしまいました;;
0988デフォルトの名無しさん
2005/09/03(土) 03:04:260989デフォルトの名無しさん
2005/09/03(土) 03:23:05#include <string.h>
#include <ctype.h>
unsigned int from_radix_n(char* s, int n) {
unsigned int x = 0, i, len;
for (i = 0, len = strlen(s); i < len; i++) (x *= n) += isdigit(s[i]) ? s[i] - '0' : toupper(s[i]) - 'A' + 10;
return x;
}
0991デフォルトの名無しさん
2005/09/03(土) 03:53:53じゃだめなのかね
0992デフォルトの名無しさん
2005/09/03(土) 04:12:05標準だし。
0993デフォルトの名無しさん
2005/09/03(土) 09:20:42sscanfなんてそういえばありましたね…。普段全然使わないので忘れてましたorz
>>992
strtol…初めて知りました。
ずばり必要なのはこれです。ありがとうございます。
皆様レスありがとうございました。
0994デフォルトの名無しさん
2005/09/03(土) 14:12:37char c = 1;
こんなコードもキャストが要るようになったらやってられないな。
0995デフォルトの名無しさん
2005/09/03(土) 14:13:420996デフォルトの名無しさん
2005/09/03(土) 14:17:590997デフォルトの名無しさん
2005/09/03(土) 19:09:060998デフォルトの名無しさん
2005/09/03(土) 19:14:30typedef unsigned char u8;
u8 c = 0;
これなら納得か?
0999デフォルトの名無しさん
2005/09/03(土) 19:17:21思う派であり
C++の長ったらしいキャスト形式は糞喰らえと思う派であります
ついでに、if文やwhile文の条件式に代入式を使った場合に警告を言ってくる
コンパイラもウゼーです。
if (p = strchr(str, '\n'))
みたいな書き方、俺はよくするので。
1000デフォルトの名無しさん
2005/09/03(土) 19:32:56思う派であり
>>999の長ったらしい自己主張は糞喰らえと思う派であります
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。