【初心者歓迎】C/C++室 Ver.54【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/05/14(水) 01:00:02ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.53【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1208989385/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0663デフォルトの名無しさん
2008/06/04(水) 20:43:06ストリームからは一文字づつ取得すればいいいだろ
0664デフォルトの名無しさん
2008/06/04(水) 20:45:08それはダメだ。{}の中には最低一つの式がないといけない。
0665デフォルトの名無しさん
2008/06/04(水) 20:49:51レスありがとうございます
オール0になってて使えそうです
0666デフォルトの名無しさん
2008/06/04(水) 20:52:59そもそもその処理は頻繁に行う必要があり、短時間で処理を終える
必要があるの?
0667デフォルトの名無しさん
2008/06/04(水) 20:59:5710Kバイトくらいをバッファとして用意していて、入力が数バイトしかなければ
残りの9Kバイトくらいは無駄になりますね。
けれど、実際の環境において、9Kバイト余分に使用したからといって
破綻するような精一杯な状態って、あまりないですよね。
富豪的プログラミングというか、そういう発想でいいと思いますよ。
どうしても無駄にallocしたくない、って言うのであれば一文字ずつ取得して、
都度reallocすればいいと思いますが。。
0668660
2008/06/04(水) 21:16:55レスありがとうございます。
プロバイダ規制中のため、携帯でちまちま打ってたら反応が遅くなってしまいました。
打ってる最中でしたが、望んでいた答えが>>667さんから得られたので、
ここは、富豪的プログラミングということで手を打ちたいと思います。
ありがとうございました。
0669デフォルトの名無しさん
2008/06/04(水) 21:32:370670デフォルトの名無しさん
2008/06/04(水) 21:37:47VBAから呼ばれる関数の引数で返せばいい。
配列(ポインタ)引数で、要素に書き込んでおけば、VBA側にも反映される。
0671デフォルトの名無しさん
2008/06/04(水) 21:55:140672デフォルトの名無しさん
2008/06/04(水) 21:57:14読み込んだ量
0673デフォルトの名無しさん
2008/06/04(水) 21:59:100674デフォルトの名無しさん
2008/06/04(水) 22:01:58量の単位は何ですか?
0675デフォルトの名無しさん
2008/06/04(水) 22:14:570676デフォルトの名無しさん
2008/06/04(水) 22:18:550677デフォルトの名無しさん
2008/06/04(水) 22:19:290678デフォルトの名無しさん
2008/06/04(水) 22:21:320679デフォルトの名無しさん
2008/06/04(水) 22:23:020680デフォルトの名無しさん
2008/06/04(水) 22:38:39ん?
0681デフォルトの名無しさん
2008/06/04(水) 23:13:18Cのエディタって何使ってます?
今までVS使ってたんですけど、マイコン用のに使うのには向かなくて…
テキストエディタでオススメの教えていただけませんか?
個人的に、ヘッダファイル読んで構造体や関数の補完入力、表示の機能があるといいですね。
0682デフォルトの名無しさん
2008/06/04(水) 23:16:52個人的にはvimなんだけど、sakuraとかemacsとかEclipseもいいんでないの?
0683デフォルトの名無しさん
2008/06/04(水) 23:17:45つってもVS見たいなポップアップではないが
0684デフォルトの名無しさん
2008/06/04(水) 23:36:22宿題スレから。realloc() を使います。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFSIZE 3 /* >= 2 */
char *getline(void) {
static char inbuff[BUFFSIZE];
char *outbuff_malloc, *tmpbuff, *p;
int fEOL;
if ((outbuff_malloc = malloc(1)) == NULL)
return NULL;
*outbuff_malloc = '\0';
fEOL = 0;
do {
if (fgets(inbuff, BUFFSIZE, stdin) == NULL) break;
for (p = inbuff; *p != '\0'; p++);
if (*(p - 1) == '\n') { *(p - 1) = '\0'; fEOL = 1; }
if ((tmpbuff = realloc(outbuff_malloc, strlen(outbuff_malloc) + strlen(inbuff) + 1)) ==NULL) { free(outbuff_malloc); return NULL; }
strcat(tmpbuff, inbuff);
outbuff_malloc = tmpbuff;
} while (!fEOL);
return outbuff_malloc;
}
int main()
{
char *inputLine_malloc;
if ((inputLine_malloc = getline()) != NULL) { printf(">>%s\n", inputLine_malloc); } else { printf("getline: cannot alloc memory.\n"); }
free(inputLine_malloc); /* NULL ok */
return 0;
}
/* end */
0685デフォルトの名無しさん
2008/06/04(水) 23:56:36ありがとうございます!
試してみます
0686C++で質問です
2008/06/05(木) 00:14:03#include <string>
#include <cstddef>
// T 型オブジェクト e 個分の領域を確保し、値 t で埋める
template< class T >
void foo( const int e, const T& t )
{
using namespace std;
allocator< T > alloc;
T *begin, *end, *iter;
// 領域の確保
begin = alloc.allocate( e );
end = begin + e;
uninitialized_fill( begin, end, t );
// 何らかの処理
// 領域の開放
iter = end;
while( iter != begin )
{
alloc.destroy( --iter ); // オブジェクトを後方から順に破棄
}
alloc.deallocate( begin, end - begin ); // 確保した領域を破棄
}
上記のような関数で、領域開放の際、 deallocate の前に
各要素に対して destroy を実行するのが通例ですが、
これを行う意味ってなんでしょう? 実行しない場合、何が起こると考えられますか?
0687デフォルトの名無しさん
2008/06/05(木) 00:24:410688686
2008/06/05(木) 00:32:49なるほど。
型 T がポインタやクラス(特に自らリソースを確保するクラス)であったような時
メモリリークを引き起こす可能性があるわけですね。
一方、型 T が int や double であった場合には
オブジェクトが使っているメモリ領域は
まさに deallocate で削除される領域なので問題はおきない
と考えてよろしいでしょうか?
0689デフォルトの名無しさん
2008/06/05(木) 01:15:19テンプレートを使わない場合でもコードが入り組んでくると
ほにゃらら_tみたいな、実態が組み込み型なんだかクラスなんだか
後で組み込み型からクラスに変更されるかも知れないような怪しいtypedefが出てくるので、
POD型の時にはデストラクタを呼ばないようなテンプレートを書いておいて
call_destructors<T>(begin, end);
みたいな感じで必ず記述しておいたほうが良いと思うけど。
0690デフォルトの名無しさん
2008/06/05(木) 01:23:050691デフォルトの名無しさん
2008/06/05(木) 01:29:260693デフォルトの名無しさん
2008/06/05(木) 12:44:52VC++2008EEで独自のダイアログを表示するクラスを作ったのですが、メンバ関数からDialogBox()する時に同じメンバ関数のダイアログプロシージャを呼ぶ方法が良く分りません。
DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), g_hWnd, hoge::MsgBox);
↓
error C3867: 'hoge::MsgBox: 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&hoge::MsgBox' を使用してください
その通り書き換えてもキャスト出来ない旨のエラーが出ますし、ヘルプの凡例には該当するものがなくて対処出来ません。
クラスを使わなければ表示出来るのですが、何が原因でしょうか。
0694デフォルトの名無しさん
2008/06/05(木) 12:47:310695デフォルトの名無しさん
2008/06/05(木) 12:55:44MsgBoxが非staticメンバ関数であることが原因
非staticメンバ関数にはthisポインタという隠れた引数があるので普通の関数と同等には扱えない
そういう場合には普通の関数かstaticメンバ関数を渡しておき、
何かのトリックを使ってどこかからthisポインタを取り出し、それを使ってメンバ関数を呼ぶ
0696デフォルトの名無しさん
2008/06/05(木) 13:36:08回答ありがとうございます。
処理が複雑になりそうなので(普通の関数とローカル変数を使えば出来そうな気もしますが)、現状ではダイアログプロシージャをクラスに含めない事にしました。
本当にありがとうございました。
0697デフォルトの名無しさん
2008/06/05(木) 16:16:26あー__is_podか。
大分前にispodって書いてる人がいて、それで検索してたんだけど、
どうりで見つからなかったわけだ。
0698デフォルトの名無しさん
2008/06/05(木) 16:20:480699デフォルトの名無しさん
2008/06/05(木) 16:36:34yacc/lex
0700デフォルトの名無しさん
2008/06/05(木) 20:26:23> POD型の時にはデストラクタを呼ばないような
それ、まさにallocatorのdestroy。
正確に言うとx.~T()の構文はPODでもエラーにならず、何の効果も起きないだけ。
ちなみに、こんなコードも合法のはず。
int main()
{
typedef int t;
t i;
i.~t();
}
0701デフォルトの名無しさん
2008/06/06(金) 14:37:58やり方が分かりません。
アプリケーションのアイコンをタスクトレイに表示させた後、そのアイコン上に
マウスを移動させた場合に指定したメッセージを表示させる事は出来ます。
これを、マウスをアイコン上に移動させなくてもイベントが発生した際に
バルーンを表示させるようにしたいのですが・・・。
NIM_SETFOCUSを使えば似た事が可能なのですが、NIM_SETFOCUSを利用すると
ウィンドウのフォーカスがアイコンに持っていかれてしまうので不便です。
別のやり方は無いでしょうか?
伝えにくいので以下に現状のプログラムを示します。
NOTIFYICONDATA g_nid;
case WM_CREATE:
ZeroMemory ( &g_nid, sizeof( NOTIFYICONDATA ));
sprintf( g_nid.szTip, "TESTメッセージです" );
g_nid.cbSize = sizeof( NOTIFYICONDATA );
g_nid.hWnd = hWnd;
g_nid.uID = TRAY_ID;
g_nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
g_nid.uCallbackMessage = MYWM_NOTIFYICON;
Shell_NotifyIcon( NIM_ADD, &g_nid );
break;
case WM_MYEVENT://任意のタイミングでメッセージを表示
Shell_NotifyIcon( NIM_SETFOCUS , &g_nid );//フォーカスを割り当てる、これで一応バルーンは表示される
break;
0702デフォルトの名無しさん
2008/06/06(金) 20:35:140703デフォルトの名無しさん
2008/06/07(土) 08:07:02以下のプログラムで構造体を初期化するには
どう記述すればいいでしょうか。
括弧のつけ方をいろいろ変えているんですけど、
初期化の一部だけに括弧が付いているとか、
宣言構文エラーとか出てうまくいきません。
typedef struct {
int a;
int b;
}FOO_STRUCT;
typedef struct {
FOO_STRUCT foo[2];
}HOGE_STRUCT;
int main(void)
{
HOGE_STRUCT hoge = {{0, 1}, {2, 3}};
return 0;
}
0704デフォルトの名無しさん
2008/06/07(土) 08:32:03HOGE_STRUCT hoge = {{{0, 1}, {2, 3}}};
0705デフォルトの名無しさん
2008/06/07(土) 08:45:48通りました。ありがとうございます。
0706デフォルトの名無しさん
2008/06/07(土) 13:44:39なぜ calloc等で動的確保した変数には、
解放のコードを書かないといけないのでしょうか、
逆に自動変数はなぜ解放のコードが不要なのでしょうか。
0707デフォルトの名無しさん
2008/06/07(土) 13:57:31自動変数は自動的に確保/解放されるから「自動」変数なのです
0708デフォルトの名無しさん
2008/06/07(土) 14:13:32ありがとうございます、初歩的な質問ですみませんでした
0709デフォルトの名無しさん
2008/06/07(土) 14:18:38結合規則の問題で悩んでます。
|A| = |B|*|C|*|D|の式をプログラムで表現するときに、
MATRIX matA, matB, matC, matD;
matA = matB * matC * matD;
と書いて表現させたいのですが、普通にやると
|A| = (|B|*|C|)*|D|
と認識してしまいます。
()などを使わずに
右辺を右から左の順序で乗算させる方法が何かありませんでしょうか
0710デフォルトの名無しさん
2008/06/07(土) 14:26:29結合律が成り立たない場合は括弧で括ってください。
0711デフォルトの名無しさん
2008/06/07(土) 14:30:13ありがとうございました。
それでやろうと思います。
0712デフォルトの名無しさん
2008/06/07(土) 14:31:44(B×C)×D = B×(C×D) でしょ?
どっちでも一緒じゃん?
0713デフォルトの名無しさん
2008/06/07(土) 14:33:05結合順によって計算量が変わる可能性は高い
0714デフォルトの名無しさん
2008/06/07(土) 14:55:30行列演算で×を使うと意味が変わっちゃうよ
0715デフォルトの名無しさん
2008/06/07(土) 15:14:340716デフォルトの名無しさん
2008/06/07(土) 15:28:01ただ外積は順番によっては計算量が著しく変わる。内積はどんな順番でも行 * 列 * 項の数で一定
0717デフォルトの名無しさん
2008/06/07(土) 15:50:05そもそも行列積に operator* を使わない方がいいと思うが。
0718デフォルトの名無しさん
2008/06/07(土) 15:51:07A 100x100
B 100x100
C 10x100
(AB)C
100x100x100+100x10x100=1100000
A(BC)
100x10x100+100x10x100=200000
0719デフォルトの名無しさん
2008/06/07(土) 16:00:330720デフォルトの名無しさん
2008/06/07(土) 16:16:160721デフォルトの名無しさん
2008/06/07(土) 16:20:51ない。
0722デフォルトの名無しさん
2008/06/07(土) 16:27:47それならスカラーになるから>>716の言ってるのはアダマール積のことだと思う。
0723デフォルトの名無しさん
2008/06/07(土) 16:54:150724デフォルトの名無しさん
2008/06/07(土) 17:07:16そして行列の外積って何を表しているんだろう?
0725デフォルトの名無しさん
2008/06/07(土) 17:09:18Σij AijBji のことか? と聞こうとしたんだった。
要するに tr A^T B
0726デフォルトの名無しさん
2008/06/07(土) 19:08:48_,,....,,_ _人人人人人人人人人人人人人人人_
-''":::::::::::::`''> ゆっくりしていってね!!! <
ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
|::::::;ノ´ ̄\:::::::::::\_,. -‐ァ __ _____ ______
|::::ノ ヽ、ヽr-r'"´ (.__ ,´ _,, '-´ ̄ ̄`-ゝ 、_ イ、
_,.!イ_ _,.ヘーァ'二ハ二ヽ、へ,_7 'r ´ ヽ、ン、
::::::rー''7コ-‐'"´ ; ', `ヽ/`7 ,'==─- -─==', i
r-'ァ'"´/ /! ハ ハ ! iヾ_ノ i イ iゝ、イ人レ/_ルヽイ i |
!イ´ ,' | /__,.!/ V 、!__ハ ,' ,ゝ レリイi (ヒ_] ヒ_ン ).| .|、i .||
`! !/レi' (ヒ_] ヒ_ン レ'i ノ !Y!"" ,___, "" 「 !ノ i |
,' ノ !'" ,___, "' i .レ' L.',. ヽ _ン L」 ノ| .|
( ,ハ ヽ _ン 人! | ||ヽ、 ,イ| ||イ| /
,.ヘ,)、 )>,、 _____, ,.イ ハ レ ル` ー--─ ´ルレ レ´
0727デフォルトの名無しさん
2008/06/07(土) 19:09:230728デフォルトの名無しさん
2008/06/07(土) 19:12:52電磁気の話だと物理的意味があるよ
0729デフォルトの名無しさん
2008/06/07(土) 19:15:48行列でouter productって言ったらテンソル積のことじゃね。
0730デフォルトの名無しさん
2008/06/07(土) 19:19:10http://www.jspf.or.jp/cd2/7505cd/75-5/sakagami/2-11.html
などのサイトに乗っている15種類の状態からでは2^8=256通りではなく254通りしか
生成できません
具体的には立方体のうち向かい会う2面のそれぞれ対角線上の格子点が垂直をなすように
ON(OFF)になっているケースの2通りの状態が含まれていません。
どこのサイトを見てもこのことに関する情報はありませんでした。
マーチングキューブ法ではこのような状態は異常として無視して描画しないのでしょうか?
しかしどこを見ても必ず「256通り」の記述があるのがどうにも・・
0731デフォルトの名無しさん
2008/06/07(土) 19:24:10おまいら頭だけはでかいんだな
0732デフォルトの名無しさん
2008/06/07(土) 19:25:290733デフォルトの名無しさん
2008/06/07(土) 19:28:2614通りのうち表の左上が0。
そしてトポロジーにより0の状態が2つある。
よって2^256 - 2 = 254
0734デフォルトの名無しさん
2008/06/07(土) 19:34:221+Σ(1/i!) (1〜10まで)
やってみたのですが分かりません。
何がおかしいでしょうか?
#include <stdio.h>
main(){
int i,fact;
double j,e;
fact=1;
i=1;
while(i<=10){
fact=fact*i;
j=1/fact;
i=i+1;
}
e=1+j;
printf("e=%lf\n",e);
}
0735デフォルトの名無しさん
2008/06/07(土) 19:36:100736デフォルトの名無しさん
2008/06/07(土) 19:36:13とりあえず
1/fact;
これの結果は切り捨てになるぞ?
0.いくつとかにはならずに
0737デフォルトの名無しさん
2008/06/07(土) 19:37:14main(){
int i,fact;
double j = 0.0,e;
fact=1;
i=1;
while(i<=10){
fact=fact*i;
j+=1.0/fact;
i=i+1;
}
e=1+j;
printf("e=%lf\n",e);
}
0738デフォルトの名無しさん
2008/06/07(土) 19:38:4813番目の状態が>>730で欠落している2箇所にあたります
ポリゴンは正しいけど黒丸の表示位置がそれとずれていました
0739デフォルトの名無しさん
2008/06/07(土) 19:46:36doubleで定義すると1.0としないとだめなんですか?
>>736
なぜですか?
>>737
なぜそういう風にしないといけないのか教えてもらいたいのですが・・・
0740デフォルトの名無しさん
2008/06/07(土) 19:50:150741デフォルトの名無しさん
2008/06/07(土) 19:53:34整数同士の演算結果は整数だから、そんでその結果をdoubleにして代入だから
暗黙の型変換とかでぐぐれ
0743デフォルトの名無しさん
2008/06/07(土) 21:25:22doubleだけだとちょっと辛いだろw
0744デフォルトの名無しさん
2008/06/07(土) 21:27:380745デフォルトの名無しさん
2008/06/07(土) 21:30:340746デフォルトの名無しさん
2008/06/08(日) 09:04:59[2]問題文
三つの整数値を読み込んで、それらの値が全て等しければ、「三つの値は等しいです。」と、どれか二つの値が等しければ、「二つの値が等しいです。」と、そうでなければ、「三つの値は異なります。」と表示するプログラムを作る。
[3-1]windows
[3-2]gcc
[3-3]C言語
[4]明後日まで。
[5]if文を使って下さい。お願いいたします。
0747デフォルトの名無しさん
2008/06/08(日) 09:07:45スレ違いです
こちらへどうぞw
http://pc11.2ch.net/test/read.cgi/tech/1211980711/944
0748デフォルトの名無しさん
2008/06/08(日) 09:19:330749デフォルトの名無しさん
2008/06/08(日) 10:20:13[5]が増えてるw
0750デフォルトの名無しさん
2008/06/08(日) 12:18:02ttp://moyashi.air-nifty.com/hitori/2006/09/gsplayer225_0036.html
を読んでGSPlayerをビルドしようとしたんですが上手くいきません
そこに書いてあるようにVisual C++ 4.0などを入れてファイルを開いたら固まるので
Visual C++ 2005 Express EditionとPlatform SDKを入れてみたんですが上手くいきません
他に何かインストールしなきゃダメな物があるんでしょうか?
0751デフォルトの名無しさん
2008/06/08(日) 12:21:51目的はWin32版のビルドです
0752デフォルトの名無しさん
2008/06/08(日) 12:39:540753デフォルトの名無しさん
2008/06/08(日) 12:40:10上手くいきません、だけじゃ回答の仕様が無い。
何をやって、どういう状況になったか明確に説明せずに、回答者側にそれを想像することを求めている?
そもそも、そのブログに
>eVC++ 4.0、eVC++ 4.0のサービスパッチ、PPC2003 SDK、PPC2003のエミュレータを順次インストールすればOK。
と書いてあるのに、勝手にVC++2005を使って上手くいかないと言われても。
VC++2005の他に何かインストールしなければいけないのではなく、上記のものを正しくインストールすべき。
>Visual C++ 4.0などを入れてファイルを開いたら固まるので
これについてはどこか他スレで。
0754デフォルトの名無しさん
2008/06/08(日) 12:43:34自分では試せないので、上記を参考に試してみてください。
現在GSPlayer2は「Windows Mobile 2005」にも対応してます。この場合は、「Visual Studio 2005 Standard Edition」でビルドするんですかね。
相応のSDKも必要になるでしょう。
ただ、上記の手順で作ったバイナリは、H/PC系を除き、各種WMで動くと思います。
をやろうとしたんだと思う。多分。
0755750
2008/06/08(日) 13:02:52>VC++ 4.0、eVC++ 4.0のサービスパッチ、PPC2003 SDK、PPC2003のエミュレータを順次インストール
はやったのですが固まってしまうので下の方に書いてあるVisual Studio 2005 Standard Editionを入れました。
libmad.vcwを開くとあるのですが見つからないので、libmad.dspをダブルクリックで開くと
「Visual C++ プロジェクト形式に変換されなければなりません」と出たので変換して開いてソリューションのビルドをすると1 失敗となってしまいます
>>754
それをやろうとしたんですが上手くいきませんでした
>相応のSDKも必要
とあるので何かインストールしなければならない物があるのかと思ったのですが見当違いでしょうか
0756デフォルトの名無しさん
2008/06/08(日) 13:19:11勝手に、インクルードのパス変えてみたりフォルダの構造変えてみたり・・・
聴いてみれば、あれがなかったからかえてみた。とか、パスを通すの面倒だからコピーしたとか・・・・
どんな経験者でも、他人が作ったプロジェクトのどこにノウハウが隠れているか分からないものを変更するのは細心の注意が必要なのにな。
0757デフォルトの名無しさん
2008/06/08(日) 13:37:33>ソリューションのビルドをすると1 失敗となってしまいます
ビルドエラー時にもっと詳細なメッセージが出ているはずだけど、それについて調べる努力はした?
自分にとって意味不明なメッセージはスルー?
>>753も書いているけど、失敗というだけでなくもっと詳細な情報を出さなければ回答してもらえないよ。
たぶんこのスレで聞く様な問題ではなく、visual stdioとかそっち系を探すべきだとは思うけど。
0758750
2008/06/08(日) 13:54:49すみません
エラーが多いので環境自体が整ってないのかと思っていました。
長いのでttp://uproda.2ch-library.com/src/lib030582.txt
スレ違いのようでしたら移ります。
0759デフォルトの名無しさん
2008/06/08(日) 14:13:530760デフォルトの名無しさん
2008/06/08(日) 14:18:09d:\gsplayer\libmad\libmad.c(2) : fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory
0761デフォルトの名無しさん
2008/06/08(日) 15:42:11++a; /* lvalue required as increment operand */
printf("%p", &a);でアドレスは取れるのにもかかわらず、このaは左辺値じゃないんですか?
0762デフォルトの名無しさん
2008/06/08(日) 15:43:04■ このスレッドは過去ログ倉庫に格納されています