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

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

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

過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
0771デフォルトの名無しさん2008/12/22(月) 21:47:21
C++ でプロジェクト作っても、
ファイルの拡張子を .c にすれば C になるはず
0772デフォルトの名無しさん2008/12/22(月) 22:50:56
今、ポインターを学んでるんですけど・・
なんでアドレスとか表示する意味があるんだ?
どうして、ポインターで指す必要があるんだ?
間接的にオブジェクトに代入してなんの意味がある?
ビット数の表示に意味なんてあるんだろうか?
いまやってることに、意味がない気がして・・
今、すげー・・やる気を失ってるところです・・
だれか・・元気付けてください・・
0773デフォルトの名無しさん2008/12/22(月) 22:55:00
>>772
すごく使うことになるのでとりあえず使い方をマスターしておけ
0774デフォルトの名無しさん2008/12/22(月) 22:57:09
>>772
お前の家の住所に意味はないのか?
例えば、「お前の家が見たい」って言われたとして、家ごとコピーして渡さなくても住所教えればいいだろ。そういうことだ。
0775デフォルトの名無しさん2008/12/22(月) 22:57:30
>>773
どう使うのか・・こう・・具体的に説明してくれるとありがたいです・・
0776デフォルトの名無しさん2008/12/22(月) 22:58:01
>>774
そ・・そういうことか!!!!!!!!
0777デフォルトの名無しさん2008/12/22(月) 22:58:52
>>772
なんでかっていうとめんどくさいからググレ
でも必要だから絶対覚えろ

・・・これは流石にひどいか

http://www7b.biglobe.ne.jp/robe/cpphtml/
ここのポインタの部分だけでもみるといいよ
C言語だったとしても内容変わらんから
0778デフォルトの名無しさん2008/12/22(月) 23:23:27
int c;
c=getc();

これで合ってると思うんですが、printf("c=%d", c);で表示すると入力したものじゃなくて変なのが入るんですがなぜですか?
0779デフォルトの名無しさん2008/12/22(月) 23:25:02
>>778
%cだ。
それだと。文字コードが表示される。
0780デフォルトの名無しさん2008/12/23(火) 00:01:22
>>775
100000個の要素を持った配列を渡すとき、「ちょっとこれサイズでかくね?」って思うでしょ
でもポインタ1個渡せば、あとはポインタの位置をずらしていくだけで配列を参照できるの
ねっ簡単でしょ
以上、ヴァンプ将軍のさっと簡単ハッキングでした
0781デフォルトの名無しさん2008/12/23(火) 02:49:18
なんだか聞きたいことがうまくまとめられてないのですが.....
先日Cの入門書を一通り学習し終えたのでwindowsアプリに手を出し始めました
しかしwindowsアプリではCの入門書でいうところの最初に学んだprintfやscanfのようなものが一切出てこず、違うものばかりです
ではそういったCの入門書ででてきてwindowsアプリの入門書では全くでてこない↑等のものはどこで使うのでしょうか?
また、書店にいくとCの関数辞典のようなものがありますがそういった書籍にのっているものも上記のようにwindowsアプリではでてこないものばかりなのでしょうか?
0782デフォルトの名無しさん2008/12/23(火) 02:59:31
上記のようにwindowsアプリではでてこないものばかり
0783デフォルトの名無しさん2008/12/23(火) 03:01:14
cはどのOSでも共通して使える言語。Windows限定の場合は、下地に使うだけ。
0784デフォルトの名無しさん2008/12/23(火) 03:04:27
>>781
Windowsでも一応コンソールアプリがあるけど、ふつーはprintf()とか標準入出力系の
関数は使いません。
それ以外の、ファイル入出力とか、文字種のチェックとか数学系とか時間計とかは使います。
ファイルにロックとかけるとか、ミリ秒単位で時間を扱うとか、ちょっとこった使い方をすると
WindowsのAPIとかを使うことになります。
0785デフォルトの名無しさん2008/12/23(火) 03:09:27
>>782-784
ありがとう、入門書で最初にやったことがいきなり不要扱いだったんで居間まで何やってたんだろう('A`)と少し不安になりました
プログラムを勉強するなら関数辞典は買っておけとよく言われるのですがこの関数辞典とは一般にC/C++のものをさすのでしょうか?
0786デフォルトの名無しさん2008/12/23(火) 03:17:45
>>785
そうだと思うけど、買う必要はないかな?
Cの標準関数の説明なら、ネットで探せばみつかるし。

http://www.bohyoh.com/CandCPP/C/Library/index.html

こういうやつとか。
0787デフォルトの名無しさん2008/12/23(火) 03:23:32
>>786
お気に入りにいれました
しかし結構何のことか全くわからん内容の関数とかあるんだなぁ・・・
0788デフォルトの名無しさん2008/12/23(火) 03:30:22
googleで「manpage fread」とかmanpageをつけてググると、詳細な説明がでてくる。

本を買うならリファレンスより、何とかクックブックとか何とかの技500とかみたいに、短いサンプルが
たくさん乗ってるやつのやつのほうがいいけど、オンラインでそういうやつあるかな?
0789デフォルトの名無しさん2008/12/23(火) 08:59:44
敵が右往左往して巡回するようにしたいのですが、なぜか右端でブルブル高速で震えているだけになっています
どうすればよいのでしょうか
敵の位置を変数「enemyposx」に入れてます

if(enemyposx<79.0)
{
enemyposx+=0.8;
}
if(enemyposx>113.0)
{
enemyposx-=0.8;
}
else
{
enemyposx+=0.8;
}
0790デフォルトの名無しさん2008/12/23(火) 09:09:51
113.1 -(2つ目のブロック)-> 112.3 -(3つ目のブロック)-> 113.1 -(2つ目のブロック)-> 112.3 -> ...
0791デフォルトの名無しさん2008/12/23(火) 10:00:28
普通は x座標とは別に、進行方向を示す変数を持つもんだよ

if( x < 79 ) diff = +0.8 ;
if( x > 113 ) diff = -0.8;
x += diff;
0792デフォルトの名無しさん2008/12/23(火) 10:17:59
>>780
> ねっ簡単でしょ

ボブ! ボブじゃないか!
0793デフォルトの名無しさん2008/12/23(火) 11:38:56
>>791
できました。ありがとうございました
0794デフォルトの名無しさん2008/12/23(火) 12:01:20
自分も最初はポインタの概念がよく分からなかったなw

でも解析とか始めるようになってデバッガーとか使い出してからやっと理解できたわ
07957692008/12/23(火) 15:13:54
>>771
CLRオプションでコンパイルできないと言われましたがどうすればいいでしょうか?
0796デフォルトの名無しさん2008/12/23(火) 16:10:58
どこで聞くのが適切なのかよく分からなかったのでここで質問致します。
以下をご存じの方がいらっしゃいましたら、ご教授頂けましたらありがたいです。

環境はcygwin + g++です。将来的に linux でも使いたいと思っています。
異なる2台のHDDに各々数10GBのデータが入っています。
両方の HDD から、一度に512MB 程度づつ、データをメモリに読み込み、
逐次比較をしていくようなプログラムを作っているます。

HDD1台ごとに、一つのスレッドを作成し、スレッド内で HDD->メモリの
DMA 転送を行いつつ、dual buffer 構成にして別のスレッドで比較をしようと考えています。

HDD からメモリへDMA 転送をさせる方法を知りたいのですが、
普通に fread 文で読み込めば、勝手にDMA転送をしてくれるものなのでしょうか?
0797デフォルトの名無しさん2008/12/23(火) 16:16:33
>>795
プロジェクト作る時はCLRじゃなくてWin32のほうで
0798デフォルトの名無しさん2008/12/23(火) 16:39:58
>>796
DMA するかどうかはプログラミングの外の話じゃないかな。
それとメモリに読み込むより mmap した方が良いんじゃね?
0799デフォルトの名無しさん2008/12/23(火) 18:15:48
Cで
int a[n][2]という配列を作りたいのですが、

int **a;
a = (int *)malloc(n * sizeof(int *));
for(i = 0; i < n; i++){
 a[i] = (int *)malloc(2 * sizeof(int));
}

でいいのでしょうか?
0800デフォルトの名無しさん2008/12/23(火) 18:20:56
二つ目が決まってるなら
int (*a)[2]で確保一回で済ますというのもあるな
0801デフォルトの名無しさん2008/12/23(火) 18:46:49
レスありがとうございます。

int (*a)[3];
a = (int *)malloc(n * sizeof(*a));

これでいいのでしょうか?
0802デフォルトの名無しさん2008/12/23(火) 18:50:10
>794
Javaのほうが先にやってた俺は「参照が具体的な数値になったようなもんか」と考えたっけな
0803デフォルトの名無しさん2008/12/23(火) 20:15:59
ポインタはすんなり理解できたから、なんで理解できないのか、理解できない。
0804デフォルトの名無しさん2008/12/23(火) 21:11:49
なぜか昔からポインタで詰まる人が多いんだよね
ある程度コンピュータを知ってれば、アドレスのことでしょ?って思って
正確ではないにしろ、理解に詰まることはないんだけどね

Javaの参照とポインタは言葉通り、ちょっとニュアンスが違う。
そのあたりが"ポインタ"で詰まる理由のひとつかもね

0805デフォルトの名無しさん2008/12/23(火) 21:52:39
>>801
int (*a)[3];
a = (int (*)[3])malloc(sizeof(int [3]) * n);
だな
0806デフォルトの名無しさん2008/12/23(火) 22:20:22
visual C++2008 ......を使ってるんですが・・
プロジェクトの消去する方法がわかりません
ヘルプとかで、いろいろ探したりもしてみたんですが、わかりませんでした
どなたか、教えてください
0807デフォルトの名無しさん2008/12/23(火) 22:36:04
>>806
ソリューションエクスプローラーで右クリックしてメニューで削除を選ぶと削除される。
0808デフォルトの名無しさん2008/12/23(火) 22:39:07
おぉ、サンクス!
でも、消えない・・
0809デフォルトの名無しさん2008/12/23(火) 22:39:53
>>805
ありがとうございました。
0810デフォルトの名無しさん2008/12/23(火) 23:12:55
>>799
も間違ってるよな
0811デフォルトの名無しさん2008/12/24(水) 10:02:22
Visual C++を使っています。
http://www.asahi-net.or.jp/~yf8k-kbys/newcpp2.htmlのサイトにある、

//hello.cpp
#include <iostream>
using namespace std;

int main()
{
cout << "hello" << endl;
}

をコンパイルしたのですが、
MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\test\Debug\test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
とエラーが表示されコンパイルできません。

こんな初歩的な質問ですみませんが、どうすればコンパイルできますか?
またエラーの意味も出来れば教えてください。
0812デフォルトの名無しさん2008/12/24(水) 10:16:38
エラーの意味:
  「Windows アプリケーションだっていうから
   WinMain() を呼び出そうとしたら
   そんな関数なかった」
解決法:
  コンソールアプリケーションとしてプロジェクト作り直す。
0813デフォルトの名無しさん2008/12/24(水) 10:24:37
>>812
解決法とエラーの意味ありがとうございます!
無事コンパイルできました。

ここで疑問ですが、
win32コンソールアプリケーションとwin32プロジェクトの違いはなんなのでしょうか?
よければ教えていただきたいです。
0814デフォルトの名無しさん2008/12/24(水) 10:27:10
Windowsアプリケーションにはメッセージループがあるだろ
0815デフォルトの名無しさん2008/12/24(水) 10:28:55
>>814
返答ありがとうございます
0816デフォルトの名無しさん2008/12/24(水) 10:34:27
>>813
win32プロジェクトはイベント割り込みを考慮して作る
たとえば「ウィンドウを再描画してくれ」といってきたりする(以下、イベント)
このようなイベントが起きたときにどう処理するかをプログラムしていく
だが、コンソールにはイベントがない
0817デフォルトの名無しさん2008/12/24(水) 10:35:56
ここではイベントじゃなくメッセージというべきだったか
0818デフォルトの名無しさん2008/12/24(水) 10:41:08
>>816
なるほど、大まかに理解することが出来ました。
つまりは、イベントを考慮する場合はwin32プロジェクトで作れということですね
返答ありがとうございました
0819デフォルトの名無しさん2008/12/24(水) 11:00:20
>>811の者です。度々失礼します。
現在http://www.asahi-net.or.jp/~yf8k-kbys/newcpp3.htmlのプログラム

//hello2.cpp
#include <iostream>
#include <string>
using namespace std;

int main()
{
string name;
cout << "こんにちは。私はコンピュータです。" <<endl;
cout << "あなたの名前を入力してください。" <<endl;
cin >> name;
cout<<name<<"さん。よろしく。"<<endl;
}

をコンパイルし、
画面を表示し、入力することにも一応成功しているのですが、
名前「小林」を入力し、エンターを押すと同時に「小林さん。よろしく」の表示を見るまもなく、
表示されると同時にウインドウが消えてしまいます。
これは正常な動作でしょうか?
0820デフォルトの名無しさん2008/12/24(水) 11:10:59
終端まで実行すると即座に終了する
正常ですよ
0821デフォルトの名無しさん2008/12/24(水) 11:12:22
>>820
正常でしたか。安心しました。
回答ありがとうございます
0822デフォルトの名無しさん2008/12/24(水) 11:13:34
はい。あなたの反応速度が遅いだけです。

ところで、int main()と宣言しておきながらintを返さないサンプルを掲示しているような
ヘッポコサイトは参考にしない方がいいです。
0823デフォルトの名無しさん2008/12/24(水) 11:31:43
C99以降は (C++も?) main の終了後は 0 を戻すが
それ以前だと未定義だっけ?

>>819
デバッグなしで実行 (Ctrl+F5) すると
終了時に一時停止する。

>>822
>あなたの反応速度が遅いだけ
イミフ
0824デフォルトの名無しさん2008/12/24(水) 11:34:32
>>823
>>デバッグなしで実行 (Ctrl+F5) すると 終了時に一時停止する。
確かに一時停止しました!!参考になります
0825デフォルトの名無しさん2008/12/24(水) 18:06:50
質問です。
VC6.0時代は
for(int i = 0; i < 10; ++i)
{
//いろいろ
}
printf("%d", i);

とすることができましたが、VC9.0ではprintfのところではすでにiが無効になってしまいますよね。
これって、C/C++が昔からこだわっていた「互換性を保つ」に反している気がするのですが、どうなのでしょうか?

VC6.0時代の解釈がC++の言語仕様上間違っていたので、直したとかなんでしょうか?
0826デフォルトの名無しさん2008/12/24(水) 18:11:18
>>825
VC6時代にはまだ正式な規格じゃなかったから。
.NET(2002)から対応したが、デフォルトではVC6互換だった。
2005からデフォルトがISO準拠になったが、プロジェクトのプロパティのC/C++ 言語の
for ループ スコープの強制準拠をいいえにすれば同じ動作になる。
0827デフォルトの名無しさん2008/12/24(水) 18:14:45
>>825
C++の最初の定義ではVC6.0の仕様だった。
その後変更になった。
0828デフォルトの名無しさん2008/12/24(水) 18:54:22
>>826-827
ありがとうございます。
良くわかりました
0829デフォルトの名無しさん2008/12/24(水) 19:40:45
C言語で以下の用なプログラムを見ました。
このようなプログラムの記述でもよい?というかどういう意味なのでしょうか?
よろしくお願い致します。

1.
(kata)自作関数()
戻りの型を”()で閉じてる”上に関数との間に”スペース”がありません。
ちなみにkataには、変数でvoidが入ります。後半の()はvoid型なのに。

2.
rrom.abc[0].ddd[0]
ピリオドが二つあるのですが、これは一体何を意味しているのでしょうか?
構造体かと思いましたが、そのあとにまたピリオドがあって、構造体の構造体?

3.
struct destr s_ssss;
struct destr aaaa;

void aa_a;
void aa_b;
char dd_d;

といった文があったのですが、1行目でstructを宣言しておきながら;してる意味は?
そのあとにもまた;で終了して、次の行からは構造体の中身ともおわれしき代入があります。
{}で閉じる必要はないのでしょうか?
0830デフォルトの名無しさん2008/12/24(水) 19:58:03
>>829
中途半端な知識で中途半端に引用しているから、説明してもいいけど余計に混乱すると思う。
丸ごとアップローダにあげた方がいいと思う。

一応簡単に。
1.
・記号の前後のスペースなんか気にするな。殆どの場合に省略可能だ。
・「変数でvoidが入る」なんてことはない。何か勘違いをしている。

2.
・rromという構造体の実態の、メンバabcと言う構造体配列の0番目の要素のメンバdddという配列なのだろう。

3.
・1行目のそれは、そういう構造体があると言う只の宣言だ。
・3行目以降は構造体の中身ではない。引用が不充分なので、それが何かはわからない。
0831デフォルトの名無しさん2008/12/24(水) 21:34:22
>>830
ありがとうございます。

1.に関してということは
voidJISAKUkANSU() でもvoid JISAKUKANSU でもよいということでしょうか?

ちなみにkataは、別のヘッダファイルで void kata; なっていたのでvoidかとおもっていました。

2.
struct rrom{
abc[10]
}
strcut abc{
ddd[10]
} とかいった感じではなく

struct rrom{
abc[10]
}
abc[0] = nanka

とかいった感じなのでしょうか?この場合でも一番上が構造体だから.をつけると
理解すればよいのかな?

3.
3行目以降は本当に何行か構造体の中身みたいな感じで書かれていました。
なんでこんな書き方してるんだろうとおもってました。他の所でこの構造体
つかってた感じだったので、;をつけて下に何故かいているんだろうって
0832デフォルトの名無しさん2008/12/24(水) 21:46:03
>struct rrom{
>abc[10]
>}
>strcut abc{
>ddd[10]
>} とかいった感じではなく
>
>struct rrom{
>abc[10]
>}
>abc[0] = nanka
>
>とかいった感じなのでしょうか?

違う。
struct ddd_t {
/* 何か */
};

struct abt_t {
struct ddd_t ddd[10];
};

struct rrom_t {
struct abc_t abc[10];
};

rrom_t rrom;

rrom.abc[0].ddd[0]
みたいなかんじだと思われ。型と変数を混同しないように。
0833デフォルトの名無しさん2008/12/24(水) 22:12:19
ある構造体fooを一行でunsigned char[40]に型キャストするのは不可能でしょうか。。。
struct Foo{
(sizeofが40になる単純なデータ群)
}
をboost::serializeで使うのにいちいちserialize書くのかったるいのですorz
0834デフォルトの名無しさん2008/12/24(水) 22:22:34
833の者です。
質問が不誠実過ぎたと思うので加筆します
struct Foo;

void function{
Foo f;

//この下2行の文章のmemcpyする必要がないので(&uchar[0])=&Fooにしたい->型キャスト って発想なのですが。
unsigned char n[40];
memcpy(&n[0],&f,sizeof(f));
};
何か思い当たる人はご教示お願いいたします。
0835デフォルトの名無しさん2008/12/24(水) 22:25:04
*(char*)(&foo)
0836デフォルトの名無しさん2008/12/24(水) 22:26:31
ごめん >>834 読む前に買いあ
0837デフォルトの名無しさん2008/12/24(水) 23:35:35
>voidJISAKUkANSU() でもvoid JISAKUKANSU でもよいということでしょうか?
にほんごよめますか?
>830には、「きごうのぜんご」とかいてありますよ。


>ちなみにkataは、別のヘッダファイルで void kata; なっていたのでvoidかとおもっていました。
だから、1行ずつ切り出さないで全部貼れ。


>3行目以降は本当に何行か構造体の中身みたいな感じで書かれていました。
>なんでこんな書き方してるんだろうとおもってました。他の所でこの構造体
>つかってた感じだったので、;をつけて下に何故かいているんだろうって
自分で読み直して、説明が理解できますか?
いいから貼れ。
0838デフォルトの名無しさん2008/12/24(水) 23:37:44
>>833
unionならキャストの必要さえない。
が、キャストでやるならunsigned char * foo = reinterpret_cast<unsigned char *>(& f)でいい。
0839デフォルトの名無しさん2008/12/24(水) 23:50:38
シェルでpwdしてカレントディレクトリ表示するのと
cでgetcwd()して表示するのって何か違いがありますか?
0840デフォルトの名無しさん2008/12/24(水) 23:54:16
はい。実装によっては異なります。
シンボリックリンクの解釈の辺りで。
0841デフォルトの名無しさん2008/12/25(木) 00:07:39
>>838
単純ポインタに変換してしまうとucharが1/40しか保存されないんです><
0842デフォルトの名無しさん2008/12/25(木) 00:24:26
>>841
そんなことは無いと思いながら実験してみたら、やはりそんなことはなかった。

typedef struct {
int i, j;
char s[32];
} Type;

int main(void)
{
Type t;
t.i = 0xabadcafe;
t.j = 0xdeadbeef;
strlcpy(t.s, "foobar", sizeof(t.s));
unsigned char *uc = (unsigned char *)(&t);
printf("0x%x\n", *(int *)uc);
printf("0x%x\n", *(int *)(uc+4));
printf("%s\n", uc+8);
return 0;
}

$ ./a.out
0xabadcafe
0xdeadbeef
foobar

なんか別のところで間違えてるんじゃないの?
0843デフォルトの名無しさん2008/12/25(木) 00:32:23
>>840

なるほど、ありがとうございます。
シンボリックの扱いを実験してみることにします。
0844デフォルトの名無しさん2008/12/25(木) 00:32:38
>>842
一応こちらでも実験したつもりで居るのですが、
boost::serializeの仕様が関わってるのかもしれませんし、速度重視で実験コード書いたので失敗したのかもしれません。
が、ちょっと今日は時間がないので明日以降に再質問したいと思います。
ご丁寧にありがとうございましたmm
08457962008/12/25(木) 00:36:01
>>798
遅くなりましたがレスをどうもありがとうございます。

>DMA するかどうかはプログラミングの外の話じゃないかな。

素人ですみません。DMA するかどうかを調べる方法を
議論するとしたら、例えばどのあたりの板が適当でしょうか?

>それとメモリに読み込むより mmap した方が良いんじゃね?

ランダムアクセスは行わずに、シーケンシャルアクセスのみで、
また、一度読んだ領域は2度と読みません。
また、HDD からの読み込みが終了しているタイミングに、別スレッドから
占有的に,、同じHDDに対して高速書き込みを行いたいと考えてますので、
mmap のように必要になった時に初めてメモリ転送を行うのではなく、
決まったタイミングに全てのデータを一気にメモリに転送してしまいたいと
考えており、fread (or read?)文が適切かなと考えています。
0846デフォルトの名無しさん2008/12/25(木) 00:54:19
>>845
DMAはデバイスドライバが行う。Windowsではアプリケーションから制御できない。
0847デフォルトの名無しさん2008/12/25(木) 01:14:50
796がDMAと呼んでいるものは、
DMAではなくlibaioとかFILE_FLAG_OVERLAPPEDとかの
非同期IOのことではないだろうか。
0848デフォルトの名無しさん2008/12/25(木) 01:17:07
fread使ったことないとか?
08497962008/12/25(木) 01:24:03
>>846
レスをどうもありがとうございます。
linux であれば、O_DIRECT フラグをつけて
open する事により、DMA 出来る(?)ようですが、
windows の場合は、DMA を行ってくれるかくれないかは、
プログラマレベルでは全く制御できず、運任せという事でしょうか。
ファイル転送ブロック容量等を色々と変えてさまざま条件で
転送速度を計測し、各々の条件でデバイスドライバが
DMAを行ったか否かを推測して、DMAを行ってくれる条件を
試行錯誤して探してみるしかないでしょうか?

08507962008/12/25(木) 01:31:01
>>847
レスをありがとうございます。
cygwin ではなく VC++ で FILE_FLAG_OVERLAPPED
を使った経験はあり、実際に速度向上を体感できていましたが、
libaio というのは全く知りませんでした。これはcygwin で使えるのでしょうか。
ぜひ勉強してみようと思います。
0851デフォルトの名無しさん2008/12/25(木) 01:38:11
>>849
君が言ってるDMAって、誰に教えてもらったの?
08527962008/12/25(木) 01:46:30
別に誰に教えてもらったわけでもないですが。。
1 TB×16 台(16TB) の RAID0 に 2Gbps の速度で
高速アクセスを行うようなハードウェア+アプリケーションを作成しており、
可能な限り高速なアクセスをしたいと考えております。
DMA 転送は、DSP やFPGA のアプリケーションで扱った経験は
ありますが、PC 上で確実にDMAを行いたいという経験は
初めてです。
0853デフォルトの名無しさん2008/12/25(木) 01:59:00
今時のパソコンなら、HDDアクセスはDMA転送してるんじゃないの、ドライバが?
0854デフォルトの名無しさん2008/12/25(木) 02:11:21
>>849
> O_DIRECT
それはやっぱりDMAとは呼ばない。
間にディスクキャッシュを噛ませないという意味でしかない。
ちなみにWindowsだとFILE_FLAG_NO_BUFFERINGが近い。

O_DIRECTがなくても、ディスクとOSキャッシュのメモリとの間の転送はDMAが使われる。
DMAなんてものは1アプリケーションが介入する領域の話ではない。

DMAがされるかどうか確認・設定したいなら、
WindowsではデバイスマネージャでATAコントローラのところを見ればいい。
もちろん可能ならDMA有効が初期設定、不可能なものなんて今時存在しないだろ。
08557962008/12/25(木) 02:30:37
>>853
>>854
レスどうもありがとうございます。大変勉強になります。
理論値よりもだいぶ遅かったので、DMA できていない事が原因なのかなと
思いこんでいたのですが、別の原因で遅くなっているのかもしれませんね。

>O_DIRECTがなくても、ディスクとOSキャッシュのメモリとの間の転送はDMAが使われる。

OSキャッシュという概念がよくわかっておらず恐縮ですが、
O_DIRECTがなくても、DMAは必ず行われ、CPU の2次キャッシュや3次キャッシュは
汚染されないという理解でよろしいでしょうか?

とりあえず、
1.ディスクキャッシュを使用せず
2.非同期 I/O を用いる
という方法が考えうる最速の方法という事でしょうか?
可能であれば、cygwin でwindows/linux のマルチプラットフォームに対応したいと
考えていましたが、各々の OS で固有の API を使うしかないという事のようですね。
0856デフォルトの名無しさん2008/12/25(木) 02:36:03
if (suuti > 100){

printf("100以上なので修正します\n");

suuti = 100;
}
printf("数値は%dです\n",suuti);

100以上の数字を入力してもメッセージを表示してくれません

何か間違ってるのでしょうか・・?
0857デフォルトの名無しさん2008/12/25(木) 02:39:23
>>855
なんかキミ、用語だけは知ってるけど全然理解してないみたいだね。
本読んで勉強してきなよ。
08587962008/12/25(木) 02:45:05
>>857
すみません。。元々ハードウェア設計が専門で正直、PCは
あまり詳しくありません。cygwin を使うのも初めてです。
具体的に855のどのあたりが致命的に間違っている点でしょうか?
0859デフォルトの名無しさん2008/12/25(木) 02:49:15
>>856
きっと間違ってるんでしょうね
どっかが
0860デフォルトの名無しさん2008/12/25(木) 06:36:50
>>858
CPUのキャッシュがどういう性質のものかも理解できていないじゃん。

>>856
100を超える比較しかしていないから、100を入力してもメッセージは出ないね。
0861デフォルトの名無しさん2008/12/25(木) 06:52:34
(kata)自作関数()

本来ならこのkataにはどういったものがはいるのでしょうか?
0862デフォルトの名無しさん2008/12/25(木) 06:53:50
>>861
断片を貼られてもなんとも言えません。いい加減大人しく全体を提示するか、さもなければお帰りください。
0863デフォルトの名無しさん2008/12/25(木) 07:32:11
教科書をじっくり時間をかけて読む事をお勧めする
0864デフォルトの名無しさん2008/12/25(木) 07:33:38
>>862
全体は個人的なものじゃないので無理なのです・・・
考えられるパターンとしてはやっぱり戻り方では?
0865デフォルトの名無しさん2008/12/25(木) 07:41:03
>>864
にほんごよめますか?
>862には「かえれ」、>863には「きょうかしょをじっくりよめ」とかいてあります。
0866デフォルトの名無しさん2008/12/25(木) 07:56:49
手を隠したまま手相を見てもらおうとするようなもので
それはもう常人ではなくエスパーに頼むしかない
0867デフォルトの名無しさん2008/12/25(木) 08:15:44
携帯から失礼します
自分は最近C++に手を出し、今classで止まってます
本当に基礎の概念
classは設計図みたいなものである
と言うことやコンストラクタ、デストラクタ、メンバ変数
くらいは理解したのですが、ここから先(プロパティ、継承)などが理解できません

使い道が分かればもう少し理解が深まると思うのでどなたか、「なるほど、これは確かにclassと言う概念が必要だな」
と思うようなソースなり、コピペなり、ありましたら教えてください

例えば関数なら、何度も使うような処理を複数回書かないため
とか
マクロなら、あとで値の変更が容易なのと、見通しをよくするため
とか

色々「なるほどこれは必要だな」と思える理由があります。
しかしclassに関しては何も見えてこないんです
よろしくお願いします
0868デフォルトの名無しさん2008/12/25(木) 08:35:02
継承は置いておいて、クラスに関して簡単に。

例えば何かのアプリケーションがあり、それには複数の設定があるとする。
そのアプリの実装において、設定ファイルがどういう構造かは決定的ではない場合、
しかも一箇所では一部のデータのみを読み書きしたい場合、
普通は設定の一部のみを読み書きする関数を用意すると思う。
しかし、データの管理を呼び出し側に委ねることになる。
クラスにしておけば、データ構造を隠蔽することができるので、
呼び出し側にデータの管理を任せることなく密かに管理できると言う次第。
0869デフォルトの名無しさん2008/12/25(木) 08:37:41
>>867
例えばMFCでは
ウィンドーを作るだけのCWndクラスがあって
それを継承して表示用のクラスCViewが作られる
CViewを継承してCScrollViewクラスやCListViewクラスなどが作られる
こうすればCListViewを作るときウィンドー関係や表示関係の処理を複数回書かなくてすむし見通しも良くなる
(ここでいうウィンドーはボタンやテキストボックスやバーなどの表示単位のこと)
0870デフォルトの名無しさん2008/12/25(木) 08:47:15
>>867
まずオブジェクト指向を学びたまえ
そしてJavaやC#やVBへと旅立つのだ
0871デフォルトの名無しさん2008/12/25(木) 08:52:34
>>867
カプセル化とか多態性とかいろいろ利点はあるんだけれども、
はじめのうちはデータと関数を一緒に管理できる、ってとこかな
囲碁のプログラムを作っているとして、駒を置く・目の数を数える、等の
盤面のデータ(int board[15][15]みたいな)を引数にとって何か仕事をする関数をたくさん作ると思うが、
それなら盤面のデータもそれに付随する関数もclassの中に取り込んでしまえば、管理が楽になる。
■ このスレッドは過去ログ倉庫に格納されています