【初心者歓迎】C/C++室 Ver.35【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/02/19(月) 21:36:23ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.34【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1169039760/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2007/02/19(月) 21:37:35ついでに自分で2get
0003デフォルトの名無しさん
2007/02/19(月) 21:38:310004デフォルトの名無しさん
2007/02/19(月) 22:09:180005デフォルトの名無しさん
2007/02/19(月) 22:09:210006デフォルトの名無しさん
2007/02/19(月) 22:12:28releaseしないといけないのが面倒
0007デフォルトの名無しさん
2007/02/19(月) 23:02:43で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
0008デフォルトの名無しさん
2007/02/19(月) 23:27:330009デフォルトの名無しさん
2007/02/20(火) 01:48:03秋刀魚を食べたら
まで読んだ
0010デフォルトの名無しさん
2007/02/20(火) 09:30:57クラスメンバに配列を持っている場合、その初期化はどうすればよいでしょうか?
現在は
class foo{
foo(int *b){
a[0] = b[0];
a[1] = b[1];
}
private:
int a[2];
}
としているのですが、初期化リストで初期化することはできないでしょうか?
0011デフォルトの名無しさん
2007/02/20(火) 09:38:21C++には「これ一発でおk」な方法が無い。
0012デフォルトの名無しさん
2007/02/20(火) 09:49:00配列は初期化リストで初期化できない。
どうしても初期化リストで初期化するのが必要な場合は vector を使うと
可能になる。少し大げさなようだけど、動的確保が一つ追加されるほかは
たいした違いは無い。
class foo{
foo(int *b) : a(&b[0], &b[2]) {}
private:
std::vector<int> a;
}
0013デフォルトの名無しさん
2007/02/20(火) 13:59:37お願いします。
static cardData cD[256];
ReadCastFile(cD);
int ReadCastFile(cardData **cD) {
cD[0]->cName = (LPSTR)malloc(GetFileSize(hFile , NULL));
…
}
0014デフォルトの名無しさん
2007/02/20(火) 14:04:590015デフォルトの名無しさん
2007/02/20(火) 14:12:58ありがとうございます。
0016デフォルトの名無しさん
2007/02/20(火) 15:31:24#include<iostream>
using namespace std;
const int MAX_NUMBER = 2000; //保存できる素数の数
int sosu[MAX_NUMBER]; //この配列に素数を保存
int main(){ int num=0; //見つけた素数の総数 初期値は0
int i,j,route;
int judge; //素数のとき1,素数でないとき0とする
int k=0,h=0;
sosu[num] = 0; //素数の初期化
for(i=2;i<=10000;i++) //1をとばして2から素数判定を始める {
/*エラトステネスのふるい*/
for(route=1;route*route<=i;route++); //iの平方根より大きい自然数で、最も小さいものを求める
for(j=0,judge=1;sosu[j]!=0 && sosu[j]<route;j++)//iの平方根より小さい素数で割り切れるものが無いとき、iは素数 {
if(i % sosu[j] == 0){ //何らかの素数で割り切れたとき、その数は素数でないので終了
judge = 0; //素数でないので0にする
break; } }
if(judge){
sosu[num] = i; //新しく見つけた素数の保存
num++; //見つけた素数の数を1増やす
sosu[num] = 0; //保存されている素数配列の終わりが分かるように、配列の最後を0にしておく } }
while(sosu[k+1]){ //求めた素数のうち双子素数を表示
if(sosu[k+1] - sosu[k] == 2){ //連続する二つの素数の差が2なら双子素数なので表示
cout << "(" << sosu[k] << "," << sosu[k+1] << ")" << " ";
h++; //一つの組を表示するたびにカウンタhを1増やす
}
if(h == 6){ //1行に6つの組が表示されたら改行
cout << endl;
h = 0; //カウンタ初期化
} k++; } cout << endl; return 0;}
0017デフォルトの名無しさん
2007/02/20(火) 15:32:57http://pc10.2ch.net/test/read.cgi/tech/1170343752/273
向こうにレスついているからそれ読んだら二度と来るなよ。
0018デフォルトの名無しさん
2007/02/20(火) 17:43:120019デフォルトの名無しさん
2007/02/20(火) 18:18:29GetPrivateProfile*で始まる関数を調べるるるる〜
GetPrivateProfileInt
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpsysinf/html/_win32_getprivateprofileint.asp
・
・
・
0020デフォルトの名無しさん
2007/02/20(火) 19:00:14まぁたぶんWindowsだろうけど
0021デフォルトの名無しさん
2007/02/20(火) 19:52:58一個ずつコピーするぐらいなら、せめてstd::copyを使え。
0022デフォルトの名無しさん
2007/02/20(火) 22:24:49元々は正社員だったのに取引先にフリーのほうが稼げるとか騙されて派遣やってるバカのことw
前の会社を裏切り、結局派遣先からも騙されてる。
そもそも信頼されてるなら直接契約するか正社員にするはずだが、派遣会社経由って舐められ杉
自分でも騙され裏切れられてることは薄々わかってるから派遣問題の話が出るとウッキー!って逆ギレw
0023デフォルトの名無しさん
2007/02/20(火) 22:33:55ってMSDNに書いてるよね。どうなんだろ。
俺は自分で関数書いてるけどさ。
0024デフォルトの名無しさん
2007/02/20(火) 23:06:07あとNT系ではいっさいキャッシュが効かないのでパフォーマンス的にはごめんなさい、だったと思う。
0025デフォルトの名無しさん
2007/02/20(火) 23:13:090026デフォルトの名無しさん
2007/02/20(火) 23:18:54機能ごとに関数を別ファイルにして分割コンパイルにしたいのだが、
そうするとグローバル変数を、いちいちexternでファイルの先頭に持ってくるのも面倒なので、
ヘッダファイルにまとめてしまいたいのだが、何かウマい方法ありませんか?
externで宣言されているヘッダをすべてにつけて、
main関数のあるところにだけ、externが付いていない宣言をつけたヘッダをつける方法で、間違っていませんか?
…なんか日本語おかしい
0027デフォルトの名無しさん
2007/02/20(火) 23:25:28XMLって面倒なんだけど
0028デフォルトの名無しさん
2007/02/20(火) 23:26:06グローバル変数をやめればおk。
0029デフォルトの名無しさん
2007/02/20(火) 23:32:25MSXML
0030デフォルトの名無しさん
2007/02/20(火) 23:32:55そんな Σ(´Д`lll)
0031デフォルトの名無しさん
2007/02/20(火) 23:36:17グローバル変数をやめて、今までグローバル変数にしていたものを管理するクラスを作ればいい。
#つーか、設計しなおせよ。
0032デフォルトの名無しさん
2007/02/20(火) 23:47:24全部パラメータ渡しに変える。可能な限りconstつきで。
これで今まで気がつかなかったバグも見つかって一石二鳥。
0033デフォルトの名無しさん
2007/02/20(火) 23:49:480034デフォルトの名無しさん
2007/02/20(火) 23:50:23003526
2007/02/21(水) 00:01:23なるほどー…
クラスってこういう使い方もするんですね…
しかし、一つしかないグローバル変数扱うのに
わざわざクラス作って宣言し、pc->a(data)とかやるのは非効率な気がしてならないのですが、
そこら辺教えていただけませんか?
0036デフォルトの名無しさん
2007/02/21(水) 00:07:47コーディングのしやすさや後々のわかりやすさという意味なら、ぐろーばるはしねばいいのに
0037デフォルトの名無しさん
2007/02/21(水) 00:21:08それがめんどくさい。
スペースをどうするかとか同期か非同期か指定して
BSTRとかvariantとかL"〜"とか、
HRESULT hr =〜
if(FAILD(hr)〜
もっと、楽に設定ファイルの読み書きが出来たらなあ。
GetPrivateProfileは、キーがなかったらデフォルト値を返す
みたいな便利なのがある。
てか、便利なものってC/C++標準装備になんねーかな。
0038デフォルトの名無しさん
2007/02/21(水) 00:30:17時間ないし、複雑じゃないし、いっそグローバル変数にしたほうが楽なら
グローバル変数でいいと思うのが俺。
悩んで時間かけて改造したけどたいしたことないなら効率悪いじゃん。
でも、そうでないなら、グローバル変数やめたほうがいい。
引数減らす程度でどれくらい速くなると思う?
俺は調べたことないけどさ
メモリアクセスがわりとキャッシュにヒットしたと考えれば
よほど大量に実行しないと測定できないんじゃないの。
アセンブラでスタック積み込みに数命令、
読み込みはグローバルでもスタック積み込みでもたいして命令数かわらんだろ。
0039デフォルトの名無しさん
2007/02/21(水) 00:35:25externつけてない宣言でも外部から参照可能だよ。
externつけた宣言しておきながら定義してもOKだよ。
それともCとC++でちがったっけ?
ちゃんと確認していないので間違えてたらすみません。
グローバル変数はあまり使わないものでして。
0040デフォルトの名無しさん
2007/02/21(水) 01:49:000041デフォルトの名無しさん
2007/02/21(水) 09:35:380042デフォルトの名無しさん
2007/02/21(水) 09:45:48ヘッダー内で extern 無しを書いて、あちこちでインクルードされると、
じゃどれつかうんだよコラ!!! とリンカが怒る
0043デフォルトの名無しさん
2007/02/21(水) 10:06:320044デフォルトの名無しさん
2007/02/21(水) 10:19:440045デフォルトの名無しさん
2007/02/21(水) 10:40:48Simula使った後にC with classを開発する際にその必要性を
痛感していたようだ
C++ならてきとーにnamespaceにくるんどけば、別に困らんと思うよ
0046デフォルトの名無しさん
2007/02/21(水) 10:53:430047デフォルトの名無しさん
2007/02/21(水) 12:22:01よって本物のプログラマはグローバル変数を使わない
0048デフォルトの名無しさん
2007/02/21(水) 12:26:190049デフォルトの名無しさん
2007/02/21(水) 13:47:07#import使えば戻り値のHRESULTの値がエラーのとき勝手に例外に変えてくれるから、
それに関しては毎回FAILDなんかで調べる必要はなくせるぞ。
0050デフォルトの名無しさん
2007/02/21(水) 15:17:14偽者発見
0051デフォルトの名無しさん
2007/02/21(水) 17:33:390052デフォルトの名無しさん
2007/02/21(水) 17:41:53グローバル変数など静的記憶期間にあるオブジェクトはデストラクタで解体される。
abortはそれすらも保障がない。
それを踏まえた上で呼ぶのなら誰も止める者はいない。
0053デフォルトの名無しさん
2007/02/21(水) 17:42:22デストラクタがすっ飛ばされちゃうんだっけ?
0054デフォルトの名無しさん
2007/02/21(水) 17:46:50例外をスローして main でキャッチして return しかないのか。。。
0055デフォルトの名無しさん
2007/02/21(水) 18:28:37簡単に実装できるからいいんじゃね?
でも catch(...) とかあるから確実に exit することができないって問題があるか。
まぁ、これは利点でもあるわけだが。
0056デフォルトの名無しさん
2007/02/21(水) 18:33:570057デフォルトの名無しさん
2007/02/21(水) 18:37:380058デフォルトの名無しさん
2007/02/21(水) 18:47:560059デフォルトの名無しさん
2007/02/21(水) 18:51:23それは自分ですべてのコントロールが可能であることが前提だし、
catch(...)じゃなにを捕まえたのかわからんから再throwすべきものなのか
再throwしちゃいけないものなのかの判断ができんし。
0060デフォルトの名無しさん
2007/02/21(水) 21:40:16よく分からない例外を握りつぶすなよ。
処理できる例外なら...で捕まえるなよ。
0061デフォルトの名無しさん
2007/02/22(木) 02:02:00{
FLOAT fHigh;
};
のとき、fHighを初期化するには、何か特別なことをしなければいけないのでしょうか?
0062デフォルトの名無しさん
2007/02/22(木) 02:24:16コンストラクタで初期化すれば?
0063デフォルトの名無しさん
2007/02/22(木) 02:58:250064デフォルトの名無しさん
2007/02/22(木) 02:59:14struct OBJECT a={12.345};
0065デフォルトの名無しさん
2007/02/22(木) 06:44:450066デフォルトの名無しさん
2007/02/22(木) 09:43:150067デフォルトの名無しさん
2007/02/22(木) 19:55:420068デフォルトの名無しさん
2007/02/22(木) 20:07:15std::scanf()
0069デフォルトの名無しさん
2007/02/22(木) 20:11:32型安全性が無いのと、文字列読み込みで長さを無制限にできない点がちょっと。
素直にstd::stringに読み込みたいのですが。
0070デフォルトの名無しさん
2007/02/22(木) 20:14:34std::basic_istream<_Elem,_Traits> operator>>(なんとか)
0071デフォルトの名無しさん
2007/02/22(木) 20:15:14それって、%[a-z]とか%[^,]みたいなことができますか?
0072デフォルトの名無しさん
2007/02/22(木) 20:20:250073デフォルトの名無しさん
2007/02/22(木) 20:21:120074デフォルトの名無しさん
2007/02/22(木) 20:23:11boost::formatがサポートしているのは出力だけだと思っていました。
入力もサポートしていたのですね。
0075デフォルトの名無しさん
2007/02/22(木) 20:24:14それはscanf()の代わりにlex & yaccを使え、と言っているようなもので、
適切な代替物というよりはオーバースペックに思えます。
無論、もともとlexが適切なケースではlexを使えばよいでしょう。
0076デフォルトの名無しさん
2007/02/22(木) 20:27:14入力でboost::formatが使えるなんて与太話は聞かない。
つ boost::Xpressive
0077デフォルトの名無しさん
2007/02/22(木) 20:28:450078デフォルトの名無しさん
2007/02/22(木) 20:33:38初めて知りました。boost::regexの次期バージョンなのでしょうか。
>>77
regexpだと、その後さらに型変換が必要ですよね。文字列からの。
scanf()より余程複雑な字句解析を行うことができますが、
記述性と簡便性においては、かなり劣るといわざるを得ないのではないでしょうか。
0079デフォルトの名無しさん
2007/02/22(木) 20:37:49自作するしかないのでは。
0080デフォルトの名無しさん
2007/02/22(木) 20:44:27int n;
string s;
pcrecpp:RE re("(\\w+)=(\\d+)");
re.FullMatch("ruby=1234", &s, &n);
のようなことが出来るようですね。
これぐらいだとかなりいい感じです。
0081デフォルトの名無しさん
2007/02/23(金) 11:36:38派生クラスで再定義するメンバ関数以外に仮想関数にする意味はありますか?
0082デフォルトの名無しさん
2007/02/23(金) 11:45:35あんまり無い。
仮想関数の意味を理解していれば自明だと思うが。
ただしデストラクタとか暗黙のうちに再定義されるものも
あるので、知らないと良く分からない場合もあるかも。
あとは RTTI を有効にするためだけのダミーとか。
0083デフォルトの名無しさん
2007/02/23(金) 17:58:490084デフォルトの名無しさん
2007/02/23(金) 18:05:45つ[std::vector]
0085デフォルトの名無しさん
2007/02/23(金) 18:08:070086デフォルトの名無しさん
2007/02/23(金) 18:12:330087デフォルトの名無しさん
2007/02/23(金) 18:25:570088デフォルトの名無しさん
2007/02/23(金) 18:39:05せめてstd::fill()を使え。
0089デフォルトの名無しさん
2007/02/23(金) 18:41:540090デフォルトの名無しさん
2007/02/23(金) 19:41:21SetTextColor+DrawTextだと限度を感じました。(頑張っても行単位がいいところ)
黒黒赤赤黒黒
黒黒青青赤青
こんな風に描写するのに適した関数教えてください。
0091デフォルトの名無しさん
2007/02/23(金) 19:42:59スレ違い
Win32API質問箱 Build50
http://pc10.2ch.net/test/read.cgi/tech/1171721448/
0092デフォルトの名無しさん
2007/02/23(金) 19:53:32一文字ずつ色設定して一文字ずつ書き込む
どうかんがえても、これしかないでしょう
どの環境でも
0093デフォルトの名無しさん
2007/02/23(金) 19:59:59stringstream::operator <<()を使用すると
プロセス終了まで開放されないメモリプールが発生しているようなのですが
対応方法をご存知の方いらっしゃいませんか?
スレッドを作っては消すを繰り返すプログラムで
生成したスレッド内でoperator<<()を使用すると使用メモリが増加するのですが
インスタンス・スレッドハンドルの開放を行ってもメモリが減りません
(インスタンスを生成しただけでは問題ないようです)
CreateThread()ではCライブラリでメモリリークが発生するとの記述もありますが
スレッドを_beginthreadex()で生成しても発生していて困っています
0095デフォルトの名無しさん
2007/02/23(金) 21:12:58Win32APIスレ行け
んでもってリッチテキストでも使ってろ
0096デフォルトの名無しさん
2007/02/24(土) 00:15:58それは繰り返しただけメモリ使用量が増加していくの?
プールがちゃんと再利用されてれば問題ないようにも思うんだけど。
0097デフォルトの名無しさん
2007/02/24(土) 11:50:18配列を使い、その値の合計値を出す際に私はループカウンタを利用して足す手法を
思いつくのですが、それ以外の方法があると聞きました。
ですが、それ以外の方法が思いつかなく質問させてください。
int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int nSum = 0;
for ( int i = 0; i < 10; i++ )
{
nSum += a[i];
}
return nSum;
ここでループカウンタを使用せず、配列の全てを足すにはどうしたら良いでしょうか。
0098デフォルトの名無しさん
2007/02/24(土) 11:57:24こんなのじゃなくて
int nsum(int data[], int data_num){
if(data_num<=0) return 0;
return data[data_num-1]+nsum(data, data_num-1);
}
int nsum(int data[], int data_num){
int *p, sum=0;
for(p=&data[0];p!=&data[data_num];p++)
sum+=*p;
return sum;
}
0099デフォルトの名無しさん
2007/02/24(土) 11:59:22std::accumulate()
0100デフォルトの名無しさん
2007/02/24(土) 12:05:12引き数がポインタなので、&data[0]する意味がない。p = dataで充分。
そもそも、ポインタを回す必要はない。ポインタ演算はバグの温床として禁止するコーディング規約もあるくらいだ。
したがって、
int nsum(int data[], int data_num){
// if (data_num < 0 || data == NULL) return 0; // 状況によっては神経質にここまでやるべき。
int sum = 0;
for (int ic = 0; ic < data_num; ++ic) {
sum += data[ic];
}
return sum;
}
の方が自然だろう。
0101デフォルトの名無しさん
2007/02/24(土) 12:12:07>引き数がポインタなので、&data[0]する意味がない。p = dataで充分。
終了条件と書き方を合わせたほうがいいと判断した
>そもそも、ポインタを回す必要はない。
*ループカウンタを使用せずに*
ついでいうと >>98 の書き方を推奨してはいない
0102デフォルトの名無しさん
2007/02/24(土) 12:14:390103デフォルトの名無しさん
2007/02/24(土) 14:12:19ちょっと>>98を改造して末尾再帰になるようにしたぞ。
これなら文句あるまい。
#include <stdio.h>
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int nsum(int data[], int data_num, int acc){
return data_num<=0?acc:nsum(&data[1], data_num-1, *data+acc);
}
int main(void) {
printf("%d\n", nsum(a, 10, 0));
return 0;
}
0104デフォルトの名無しさん
2007/02/24(土) 16:37:53これに自作のクラスのメンバ関数のアドレスを渡すと、DWORDに変換できないと言われ、コンパイルできません。
そのメンバ関数がstaticなら、コンパイルに成功するので、
「メンバ関数は、普通の関数とは構造が異なる」という理由だと思うのですが・・・
メンバ関数のアドレスを渡すことは不可能ですか?
0105デフォルトの名無しさん
2007/02/24(土) 16:43:43非staticなメンバ関数≒インスタンス情報をパラメータに取るstaticなメンバ関数 なので、
そのままでは渡せません。素直にstaticなメンバ関数を渡せば宜しいのでは?
0106デフォルトの名無しさん
2007/02/24(土) 16:47:55ウィンドウクラスを作ろうとしているなら、
つ [SetProp]
0107デフォルトの名無しさん
2007/02/24(土) 17:11:31その「コールバック関数を引数に取る関数」に、
コールバック関数に渡す値という引数はないか?
ところでWindows APIのコールバック関数のアドレスを引数に取るのだったら、
DWORD型ではなく何か関数へのポインタ型になっていると思うのだが、
一体何の関数だ?
0108デフォルトの名無しさん
2007/02/24(土) 17:13:24if文の中で処理をしてから判断できるんですか?
if(a=5,a==5)みたいな感じ
0109デフォルトの名無しさん
2007/02/24(土) 17:16:39int moji;
while((moji=getchar())!=EOF)
putchar(moji);
典型的なパターンの時以外はやめたほうがいいよ
0110デフォルトの名無しさん
2007/02/24(土) 17:21:200111デフォルトの名無しさん
2007/02/24(土) 17:22:130112デフォルトの名無しさん
2007/02/24(土) 17:26:56>108の例だと、素直に a = 5; if (a == 5) ...; と書いた方がいい。
醜くなるだけでメリットは殆どない。
0113デフォルトの名無しさん
2007/02/24(土) 17:34:40if(関数式==1)
else if(関数式==1)
else if(関数式==1)
else if(返り値=関数==1)
のときの
else if(返り値=関数)の関数にかかる時間を計りたいとき
関数の中で時間を計らないで関数の呼び出されてから終了までの
経過時間を計りたいときはどうすればいいですか?
その場合 if(整数A=clock(),評価式)
整数B=clock();
整数A-=整数Bでいけますか?
0114デフォルトの名無しさん
2007/02/24(土) 18:03:270115デフォルトの名無しさん
2007/02/24(土) 18:05:280116デフォルトの名無しさん
2007/02/24(土) 18:06:310117デフォルトの名無しさん
2007/02/24(土) 18:07:24なにか良い方法があれば教えてください
0118デフォルトの名無しさん
2007/02/24(土) 18:08:461000で割れば経過秒数になりますよね?
0119デフォルトの名無しさん
2007/02/24(土) 18:10:510120デフォルトの名無しさん
2007/02/24(土) 18:11:170121デフォルトの名無しさん
2007/02/24(土) 18:16:020122デフォルトの名無しさん
2007/02/24(土) 18:38:30if(返り値=関数==1)
こういうのって修正とかデバッグなどしにくいから俺としてはNG。
返り値=関数;
if(返り値==1)
最初からこうならデバッグとか修正とかしやすい。
確かに行数増えるけど
今の俺はそんなこと気にしなくなった。
経過時間は以下みたいに巣りゃいいんじゃナインお
st = 現在時間取得
返り値=関数
et = 現在時間取得
経過時間 = et - st
0123デフォルトの名無しさん
2007/02/24(土) 18:43:36それ意味変わってね?
==のほうが優先順位高いよ。
0124デフォルトの名無しさん
2007/02/24(土) 18:43:38>>113をよく嫁
0125デフォルトの名無しさん
2007/02/24(土) 18:46:430126デフォルトの名無しさん
2007/02/24(土) 18:47:500127デフォルトの名無しさん
2007/02/24(土) 18:51:23初心者なんですいません
やってみたらできたんで今はclock()を使ってます
0128デフォルトの名無しさん
2007/02/24(土) 20:30:321スレッドごとにプールを製作するようです
したがって、同一スレッド内では再利用されるので問題ないのですが
スレッドを閉じて新しいスレッドを生成すると
新しいプールが作成されて、古いプールが残るようなのです
このプールがいつまでも残っているようで困っております
遅レスでもうしわけないです
0129デフォルトの名無しさん
2007/02/24(土) 20:32:310130デフォルトの名無しさん
2007/02/24(土) 20:57:20「〜ようです」って、何見て言ってるんだ?
0131デフォルトの名無しさん
2007/02/24(土) 21:04:07「〜ようです」って、何見て言ってるんだ?
0132デフォルトの名無しさん
2007/02/24(土) 21:12:55「〜ようです」って、何見て言ってるんだ?
0133デフォルトの名無しさん
2007/02/24(土) 21:17:320134デフォルトの名無しさん
2007/02/24(土) 21:18:15超基本的事項を知っているか。
free()されたメモリはOSに返さず次のmalloc()で再利用するのがこうした
関数の基本的な戦略だ。
したがって、一般にプロセスの最初にガバッとmalloc()して大きな仕事をし、
その後free()してもプロセスのワーキングセットは大きいままだ。
これは俗に言う「メモリリーク」ではないのだが、
それが問題になるようであれば、自分でHeapAlloc()なりVirtualAlloc()なりを
用いてカスタムのアロケータを書いて、basic_stringstream<>の
テンプレートパラメータとして渡してやるんだな。
0135デフォルトの名無しさん
2007/02/24(土) 22:15:30ありがとうございます
やってみます
0136デフォルトの名無しさん
2007/02/24(土) 22:18:53HeapDestroyでは流石にOSへ返すが。
0137デフォルトの名無しさん
2007/02/24(土) 22:35:45例えば、FreeBSD 6.0、Vine Linux 4.0などです。
WindowsはGetVersionExなどで出来ました。
0138デフォルトの名無しさん
2007/02/24(土) 22:38:590139デフォルトの名無しさん
2007/02/24(土) 23:02:10ディレクトリの中のファイルの日付を取得したいのですが、
opendirとreaddir関数使いました。
struct dirent {
ino_t d_ino; /* "inode number" of entry */
off_t d_off; /* offset of disk directory entry */
unsigned short d_reclen; /* length of this record */
char d_name[1]; /* name of file */
};
この中に日付無いのですが、どうしたらよろしいでしょうか。
よろしくお願いします。
0140デフォルトの名無しさん
2007/02/24(土) 23:12:23つ[stat()]
0141デフォルトの名無しさん
2007/02/24(土) 23:37:57レスありがとうございます。
d_nameを元にファイルのpath指定して、
stat()実行して、struct statを取得する感じですか。
なんか大変な感じします。(汗
0142デフォルトの名無しさん
2007/02/24(土) 23:55:57つ[popen("/bin/ls -l", "r")]
0143デフォルトの名無しさん
2007/02/25(日) 00:48:23例えばループのカンターなんかは符号付きを使用すると思いますが、
実際の所は符号なしの方が意味的にはあっていると思います。
ビットシフトしたいとき、くらいしか思いつかないんですが、他にどんな使い道がありますか。
0144デフォルトの名無しさん
2007/02/25(日) 01:07:48typedef unsigned char BYTE;
size_tもunsignedだな
ループカウンタとかunsigned付けるの面倒だよね。
size_tがunsignedだからもっと使っているはずだけど面倒。
負にならないもの全てunsignedとか面倒だからやらないんじゃない。
unsigned intならファイルサイズとか4Gまで表現できるけど面倒だからintで計算。
2GB以上はこのプログラム動きません。
たとえlong longとかあっても面倒だからunsigned long longでファイルサイズを表そうとも思わない。
俺の場合はね。
0145デフォルトの名無しさん
2007/02/25(日) 01:36:52レスありがとうございます。
FILE *p;
p = popen("/bin/ls -l", "r");
ネットで検索したところ、
こういう使い方すると、出力をファイルのように
扱うことが出来るみたいですね。
一行ずつ読み込んで、スペースで区切ると日付も取得できそうです。
コマンド実行->標準出力取得 って、やり方知らなかったので
大変勉強になりました。
でも、時間の型を考えるとやっぱり、今回は、stat()関数使用してみます。
ありがとうございました。
0146デフォルトの名無しさん
2007/02/25(日) 17:45:57CのソースからC++のソースを呼び出したいのです。
具体的には、
既にかなりの規模になってしまった拡張子.cのプログラムソースがありまして、
どうしても欲しい機能がC++で書かれているので、インクルードしたんですが、当然Cのソースからそれらを読むとコンパイルエラーになってしまいました。
hoge.cppと言うファイルにC++関連のプログラムを書き、何とかその関数をc側から読み出したいのですが
インクルードすると、エラーが出ますし、どのようにすれば良いのでしょうか?
尚環境はVC++.NET 2003です。
よろしくお願いします。
0147デフォルトの名無しさん
2007/02/25(日) 17:55:140148デフォルトの名無しさん
2007/02/25(日) 17:58:33レスありがとうございます。
extern "C"
をつけた関数の中から、C++固有の機能(クラスなど)へのアクセスが出来ないのですが…
具体的には、error LNK2019: 未解決の外部シンボル とエラーが出ます。
0149デフォルトの名無しさん
2007/02/25(日) 18:00:080150デフォルトの名無しさん
2007/02/25(日) 18:02:01設定ファイルに記録しておこうと思うのですが、
どういう形式で記録するのが一般的ですか?
asctime 関数のような 「Sun Feb 03 11:38:58 2002」 のような形式は
気持ち悪いので採用したくないです。
0151デフォルトの名無しさん
2007/02/25(日) 18:02:58そりゃC言語にない機能だからクラスを扱えないよ。
C++の方で呼べるようにしてあげないと。
0152デフォルトの名無しさん
2007/02/25(日) 18:06:46間違えたかも。
>>148
C++の方では
Cから呼べるようにクラスじゃない関数でextern "C"を付けて作る。
Cの方では
extern "C"を付けた宣言をする。
これで呼び出せると思うけど忘れた。
0153デフォルトの名無しさん
2007/02/25(日) 18:11:24確認したいのですが、extern "C"をつけるのはC++側の関数へですよね?
main.c
#include "hogehoge.h"
int main(void){
int a=0;
func(a);
return 0;
}
hogehoge.cpp
#include <vector.h>
extern "C" void func(int a){
vector<int> v;
}
hogehoge.h
#ifdef __cplusplus
extern "C" {
#endif
void func(int a);
#ifdef __cplusplus
}
#endif
こういう形なんですが・・・。
0154デフォルトの名無しさん
2007/02/25(日) 18:18:52設定ファイルを直接見る必要が無いなら
timeで拾った値をバイナリで書き込めばいいんじゃないかな。
0155デフォルトの名無しさん
2007/02/25(日) 18:20:35見ることはあまりないですけど、たまに見ることもあるものです。
0156デフォルトの名無しさん
2007/02/25(日) 18:25:04W3C-DTF
0157デフォルトの名無しさん
2007/02/25(日) 18:30:34rfc 3339
0158デフォルトの名無しさん
2007/02/25(日) 18:33:33これで動くんじゃないの?
0159デフォルトの名無しさん
2007/02/25(日) 18:38:480160デフォルトの名無しさん
2007/02/25(日) 18:51:23time_tの整数値
yyyymmddhhmmss形式
y/m/d h:m:s形式
好きにしな。
0161デフォルトの名無しさん
2007/02/25(日) 19:00:51どういう形式にするにしても、strftime関数が使えると思う。
0162デフォルトの名無しさん
2007/02/25(日) 19:12:08一般的といいつつも日本人向けにしたいっていうことだよね。
0163デフォルトの名無しさん
2007/02/25(日) 20:11:34情報ありがとうございます。
0164デフォルトの名無しさん
2007/02/25(日) 21:51:020165デフォルトの名無しさん
2007/02/25(日) 21:53:350166164
2007/02/25(日) 22:04:000167デフォルトの名無しさん
2007/02/25(日) 22:06:14system("dir > hoge.txt")して、fopen("hoge.txt","r")...みたいなことを
やってた連中が居た。
0168デフォルトの名無しさん
2007/02/25(日) 22:11:16環境依存
>質問者は必ず、環境を書きましょう。
0169デフォルトの名無しさん
2007/02/25(日) 22:13:08十分アリだと思う dir /b ほうがイイと思うが
0170デフォルトの名無しさん
2007/02/25(日) 22:15:150171164
2007/02/25(日) 22:16:58WindowsXP
フォルダ内のファイル名をstd::stringの配列に格納したいのです
0172デフォルトの名無しさん
2007/02/25(日) 22:32:34FindFirstFile
FindNextFile
あたりでどうかな
0173デフォルトの名無しさん
2007/02/25(日) 22:56:24どうしたらいい? WaitForSingleObject を使うの?
0174デフォルトの名無しさん
2007/02/25(日) 23:03:350175デフォルトの名無しさん
2007/02/25(日) 23:08:320176デフォルトの名無しさん
2007/02/25(日) 23:11:26使い方がわかりません
0177デフォルトの名無しさん
2007/02/25(日) 23:20:03#include<windows.h>
#include<stdio.h>
int func1(void){
HANDLE h_find;
WIN32_FIND_DATA file_info;
printf("\n----- func1 -----\n");
h_find=FindFirstFile("*", &file_info);
if(h_find==NULL) return 0;
do{
printf("%s\n", file_info.cFileName);
}while(FindNextFile(h_find, &file_info)==TRUE);
FindClose(h_find);
return 1;
}
int func2(void){
FILE *fp;
char filename[FILENAME_MAX];
printf("\n----- func2 -----\n");
fp=popen("dir /b", "r");
if(fp==NULL) return 0;
while(fgets(filename, sizeof(filename), fp)!=NULL)
printf("%s", filename);
fclose(fp);
return 1;
}
int main(void){
func1();
func2();
return 0;
}
0178デフォルトの名無しさん
2007/02/25(日) 23:21:25クラスのオブジェクトの配列を作るとき、
そのクラスに引数を持つコンストラクタを持たせることは出来ないのですか?
一つ一つコンストラクタ引数を指定する形でも良いので、配列化させたいのですが…
一つ一つ宣言した上でポインタの配列を作った方が手っ取り早いですか?
0179デフォルトの名無しさん
2007/02/25(日) 23:33:210180デフォルトの名無しさん
2007/02/25(日) 23:38:28引数を持つコンストラクタを持たせることは可能だが、
クラスの配列の初期化時にはデフォルトコンストラクタが呼ばれるので
デフォルトコンストラクタが必須。
どーしてもデフォルトコンストラクタを持たせたくないのなら、
(スマート)ポインタの配列にするしかないな。
0181デフォルトの名無しさん
2007/02/25(日) 23:40:35現在のC++ではどうしようもないから179-180の言うとおりにするしかない。
0182デフォルトの名無しさん
2007/02/26(月) 00:07:26vectorに収納…というのは、どのような使い方ですか?
vector<MyClass> c1(10);
のような使い方だとデフォルトコンストラクタしか呼べませんよね?
0183デフォルトの名無しさん
2007/02/26(月) 00:09:250184デフォルトの名無しさん
2007/02/26(月) 00:19:57ありがとう
フォルダとかディレクトリまで表示されるけどファイルだけに
するにはどうするの?
0185デフォルトの名無しさん
2007/02/26(月) 00:22:201. それぞれのファイル属性を調べる
2. dir のオプションを調べる
0186デフォルトの名無しさん
2007/02/26(月) 00:22:41少しは自分で調べろ。
0187デフォルトの名無しさん
2007/02/26(月) 12:34:030188デフォルトの名無しさん
2007/02/26(月) 12:52:250189デフォルトの名無しさん
2007/02/26(月) 13:19:14クラスを作った場合、
class File {
private:
HANDLE m_handle;
public:
.....
HANDLE GetHandle(void) { reeturn m_handle; }
operator HANDLE(void) { return m_handle; }
};
この GetHandle や operator HANDLE は const 関数にすべき?
0190デフォルトの名無しさん
2007/02/26(月) 13:26:32MFCのCWndや、ATL::CWindowではconst付けているけど。
0191デフォルトの名無しさん
2007/02/26(月) 19:36:57Visual C++ で作られたと言うことが想像できるんですが、具体的にVisual C++ のどのバージョン
で作られているのかを知るためにはどうやって調べたらいいのでしょうか?僕の持っているVisual C++
ではコンパイルに失敗して困ってます。
0192デフォルトの名無しさん
2007/02/26(月) 19:41:06VC++のバージョンが書いてあります
0193デフォルトの名無しさん
2007/02/26(月) 19:46:26だっは〜すいません、ありがとうございます!
0194デフォルトの名無しさん
2007/02/26(月) 20:51:36>ProjectType="Visual C++"
>Version="7.10"
とあったのですが、これは .NETになるんですかね?
Visual Studioの .NETを使うべきですかね、それともVisual Studio2005でしょうか
0195デフォルトの名無しさん
2007/02/26(月) 20:56:037.0は2002
7.1は2003
8.0は2005
0196デフォルトの名無しさん
2007/02/26(月) 20:57:33どもです!!
0197デフォルトの名無しさん
2007/02/26(月) 21:04:542003を使うのが手っ取り早いですが、2005でも問題ないと思います。
0198デフォルトの名無しさん
2007/02/26(月) 22:13:12class A
{...}
class B: public A
{...}
class C
{
B* b;
vector <A> a;
}
こんな感じのクラスを作成してて
C::a のうちの一つの参照から C::b へポインタをコピーした場合
C::b を B* として適切に扱えるのでしょうか?
0199デフォルトの名無しさん
2007/02/26(月) 22:16:23追加したメンバ変数・仮想関数がないというような
限定条件を付ければ、reinterpret_castしても動くだろうけどさ。
0200198
2007/02/26(月) 22:28:22上でやりたいことを少し説明します。
まず A が基本フレームと呼ばれるセクタ単位のデータ構造を扱います。
B は基本フレームを拡張したフレームで基本的には仮想ではない関数郡です。
そして C はフレーム集合を保持するクラスです。
C では C::a のうち頻繁に利用するフレームを C::b として利用できたらいいのにと考えています。
今手元に開発環境がないのですが
適切に扱える C::b1 もあったりできない C::b2 があったりして悩んでいます。
ポインタを使わないでよい用法があればよいのですがありますでしょうか。
0201デフォルトの名無しさん
2007/02/26(月) 22:28:30aをstd::vector<boost::shared_ptr<B> >型にでもしておけ。
0202デフォルトの名無しさん
2007/02/26(月) 23:02:250203デフォルトの名無しさん
2007/02/26(月) 23:57:44なるほど!
ありがとう!!
0204デフォルトの名無しさん
2007/02/27(火) 09:41:55vector<A*>にしてBにキャストしたい要素はちゃんとBのインスタンスを格納しとけば普通にダウンキャストできると思うんだが
キャストしたくないというならクラス別に配列分けるか、クラスの設計見直すか
0205デフォルトの名無しさん
2007/02/27(火) 21:24:13俺の想像だけどさ
某ライブラリで
struct Box { int x0,y0,x1,y1; }; が既にあるとする。
値の配列でライブラリから受け取ったり渡したりするから
Box型の配列のまま変えられない。
受け取ったり渡したりするだけならそのままでいいが
頻繁に使う要素は、やはり不便だ。
そこで
struct BoxEx : Box
{
int GetWidht() { return x1-x0; }
};
みたいに便利なメソッドつきの無理やりキャストしたいって事か。
0206デフォルトの名無しさん
2007/02/27(火) 21:30:58for(i = 0; i < 10; i++){
if(i < 5) a();
if(i < 7) b();
if(i < 9) c();
d();
}
と、
for(i = 0; i < 5; i++) a();
for(i = 0; i < 7; i++) b();
for(i = 0; i < 9; i++) c();
for(i = 0; i < 10; i++) d();
ではどっちが効率的ですか?
0207デフォルトの名無しさん
2007/02/27(火) 21:38:01パフォーマンスに関してはとにかく実測(して比較)しろ。それが鉄則だ。
0208デフォルトの名無しさん
2007/02/27(火) 21:46:020209デフォルトの名無しさん
2007/02/27(火) 21:47:13そんな効率気にする必要があるのか
「これじゃぁ効率悪いよなぁ」と余計なとこまで考えてプログラミングがなかなか進まないのは罠
0210デフォルトの名無しさん
2007/02/27(火) 22:02:03追加モードで開いて書き込むと、一番最後に追加されます。
”先頭に追加した文字列を作ってから書き込む以外”
先頭に追加する方法はあるでしょうか?
std::ofstream ofs( "hoge.txt", std::ios::app );
seekで先頭にファイルのポインタ先頭にしても
末尾に追加されるみたいなんです。
よろしくお願いします。
0211デフォルトの名無しさん
2007/02/27(火) 22:06:05要するに、ファイルの先頭行が最新の書き込みであってほしい、という話?
0212デフォルトの名無しさん
2007/02/27(火) 22:26:29先頭に追加?OSレベルでもそういう機能をファイルシステムに
備えている物はないんじゃないか?
0213デフォルトの名無しさん
2007/02/27(火) 22:35:09追加だから最後に追加されるのが正しいでしょ。
先頭に書いたら上書きじゃないのか。
それとも先頭に挿入?
メモリでもファイルでも挿入というのは、
それ以降の全てのデータをずらして書き込み場所を空けてから
書き込むのでちょっと大変なサギョウだ。
0214デフォルトの名無しさん
2007/02/27(火) 22:50:12ファイルの先頭だけ特別扱いすれば・・・誰かそんな変態FS作らないかな。
0215デフォルトの名無しさん
2007/02/27(火) 23:01:51確かに…
実測すべきでした。ハイ。
済みませんでした。
やってみます。
0216デフォルトの名無しさん
2007/02/27(火) 23:15:00>>213
はい。やりたいことは挿入です。
挿入みたいなモードは無いですか。
ログの保存を先頭に挿入して、逆の順番に保存してる
アプリがあったので、どうしてるのかと思いまして。
レスありがとうございました。
0217198
2007/02/27(火) 23:21:41ありがとうございます。
でもちと違うのかな。
198 の
vector <A> a;
を
vector <A*> a;
として
b = a.at (x);
とすることでやりたいことができました。
0218デフォルトの名無しさん
2007/02/27(火) 23:26:58> error C2440: '初期化中' : 'A *' から 'B *' に変換できません。
> base から derived へのキャストには、dynamic_cast または static_cast が必要です。
0219デフォルトの名無しさん
2007/02/27(火) 23:29:45そのログのフォーマットはどんなかんじでしょうか?
タグ(目印)みたいなものがついてないでしょうか?
ログのフォーマットがわかればそのアプリがどんな
実装してるかわかるかもしれんよ
0220デフォルトの名無しさん
2007/02/28(水) 08:10:06被らず代入する方法を教えてください。お願いします。
0221デフォルトの名無しさん
2007/02/28(水) 08:21:50手順
要素数を N とするとき
1. そっくりそのまま別の配列にコピーする
2. 配列の 1 番目の要素と x1 番目の要素を交換する (x1 は 1 から N までの一様乱数で求める)
3. 配列の 2 番目の要素と x2 番目の要素を交換する
...
配列の N 番目の要素と xN 番目の要素を交換する
0222デフォルトの名無しさん
2007/02/28(水) 08:22:470223デフォルトの名無しさん
2007/02/28(水) 08:29:55ありがとうございます。
なるほど、入れ替えた回数が「ランダム」ということになりますね
0224デフォルトの名無しさん
2007/02/28(水) 08:33:56rand() の精度で良ければサンプルはこんな感じ
N 回の入れ替えで全体の順序がランダムになる
#include<stdio.h>
#include<stdlib.h>
#define N 10
void swap(int *a, int *b){
int c;
c=*a;
*a=*b;
*b=c;
}
int main(void){
int a[N], b[N];
int i;
for(i=0;i<N;i++) a[i]=i+1;
for(i=0;i<N;i++) b[i]=a[i];
for(i=0;i<N;i++) swap(&b[i], &b[rand()%N]);
for(i=0;i<N;i++) printf(" %d", b[i]);
printf("\n");
return 0;
}
0225デフォルトの名無しさん
2007/02/28(水) 16:53:000226デフォルトの名無しさん
2007/02/28(水) 17:27:59に様々な+-含めた値が入ってて、そいつをfloat型として無理に渡した関数先で
+- 32768.0の範囲に収まるfloat型にきちんと直したいんですけど
具体的には
void func(float *b){
int o[1024];
for(int i=0; i<1024;i++){
o[i]=b[i]*(1.0 /32768.0);
}
}
int main(void){
func(b);
}
}
こんな感じにしたいんです。
func()の引数がfloatではなくintであれば、この計算で正常に変換出来るんですが
どうしてもfloatで渡す必要があって困っています。
func内でint型の変数を用意してコピーしてやると上手くいきますが、ループ内の計算式で何とかしたいのです。
どうすれば上手くいくのでしょうか?
0227デフォルトの名無しさん
2007/02/28(水) 19:58:37void func(float *b){
float o[1024];
for(int i=0; i<1024;i++){
o[i]=b[i]*(1.0 /32768.0);
}
}
です。結果はfloatで出したいのです。
0228デフォルトの名無しさん
2007/02/28(水) 20:19:570229デフォルトの名無しさん
2007/02/28(水) 22:57:53どうしたいのかよく和下欄のだが、
それだと、bの中身とoの中身が全然変わっちまうぞ。
0230デフォルトの名無しさん
2007/02/28(水) 23:07:59>>228のとおり、ようするに正しくfloatからintへ変換したいのです。
例えば
int f=-2
printf("%f\n",f);
これで正しく-2が表示出来るようにしたいのです。
この場合fに何か計算式をかければいけそうだとは思うんですが…。
0231デフォルトの名無しさん
2007/02/28(水) 23:10:120232デフォルトの名無しさん
2007/02/28(水) 23:15:17その前の話を全て無視して、単にそのprintfの場合だったら、
可変個引数だからキャスト演算子を明示しろということになるが。
printf("%f\n", (float)f);
0233デフォルトの名無しさん
2007/02/28(水) 23:17:30まて落ち着け。
前の文を見る限りそんな単純な問題でもなさそうだが…
その話なら単純にキャストだ。
とりあえず落ち着けw
0234デフォルトの名無しさん
2007/02/28(水) 23:26:40GPGPU
http://pc11.2ch.net/test/read.cgi/tech/1128780920/377
とは別の人?
0235デフォルトの名無しさん
2007/02/28(水) 23:33:32for(int i=0; i<128;i++)
printf("%f\n",t[i]);
}
int main(void){
int t[128];
for(int i=0; i<128; i++){
t[i]=i;
}
func((float *)t);
return 0;
}
これで0〜128が表現できねぇよって話か?
GPUの事はわからんから、intやfloatのサイズの事はわからんからアドバイスは出来ない。
0236デフォルトの名無しさん
2007/02/28(水) 23:45:10そうです!それです!
GPUじゃなくて、CPUでのやり方が知りたいんです。
0237デフォルトの名無しさん
2007/02/28(水) 23:51:42int f;
*(float*)&f = -2;
printf("%f\n", *(float*)&f);
C++ なら
int f;
(float&)f = -2;
printf("%f\n", (float&)f);
0238デフォルトの名無しさん
2007/02/28(水) 23:52:41int f;
reinterpret_cast<float&>(f) = -2;
printf("%f\n", reinterpret_cast<float&>(f));
だな。
0239デフォルトの名無しさん
2007/03/01(木) 01:07:250240デフォルトの名無しさん
2007/03/01(木) 01:16:39アセンブラの機能を使わないで済むならアセンブラの機能は使わない方がよい。
0241デフォルトの名無しさん
2007/03/01(木) 01:16:40*pt>> (8 * sizeof(int) - 16)
int to floart
*p<< (8 * sizeof(int) - 32)
0242デフォルトの名無しさん
2007/03/01(木) 01:21:29質問者はint型の変数をfloatの引数を持った関数に渡して
関数内でfloatからintに戻すって話だろ
0243デフォルトの名無しさん
2007/03/01(木) 01:42:08それってsizeof(int) < sizeof(float)のときにメモリ破壊しね?
0244デフォルトの名無しさん
2007/03/01(木) 02:17:41だから>>235の例は上手くいかない。
0245デフォルトの名無しさん
2007/03/01(木) 07:03:140246デフォルトの名無しさん
2007/03/01(木) 07:35:14CreatThreadを使用したマルチスレッドのアプリケーションを
ウィンドウの右上の×ボタンを、押して終了させたとき、
リソースとか全部開放されるのでしょうか?
0247デフォルトの名無しさん
2007/03/01(木) 10:00:08動的に確保したリソースは自分で開放
0248デフォルトの名無しさん
2007/03/01(木) 10:44:51はやいお返事、どうもありがとうございます。
0249デフォルトの名無しさん
2007/03/01(木) 14:52:28このスレは環境依存 OK なはずなんだが
0250デフォルトの名無しさん
2007/03/01(木) 16:26:530251デフォルトの名無しさん
2007/03/01(木) 16:30:370252デフォルトの名無しさん
2007/03/01(木) 17:30:330253デフォルトの名無しさん
2007/03/01(木) 17:33:23C++の何がほしいんだ?
0254デフォルトの名無しさん
2007/03/01(木) 17:42:230255デフォルトの名無しさん
2007/03/01(木) 18:12:160256デフォルトの名無しさん
2007/03/01(木) 18:44:22Microsoft Visual C++ 2005 Express Edition
0257デフォルトの名無しさん
2007/03/01(木) 19:08:40窓っ子として注釈しておくと、
プロセス(タスクマネージャで見れるプログラムの単位)が終了した段階で
すべてのリソースはキレイに開放される
窓を[×]で閉じる=プロセスの終了ならそれで問題ない
だからスレッドの終了やCloseWindowだけとかなら駄目だし、
精神論で言って理想的なのはもちろん>>247
0258デフォルトの名無しさん
2007/03/01(木) 23:03:49詳細に、どうもありがとうございます。
理解できました。
0259デフォルトの名無しさん
2007/03/02(金) 23:16:03配列をグローバルに扱う方法がわかりません…
コントロールのハンドル等を扱うクラスなので、
初期化をウィンドウプロシージャ内で行いたいのですが、
どのようにすればいいのでしょうか。
0260デフォルトの名無しさん
2007/03/02(金) 23:19:010261259
2007/03/02(金) 23:29:03最初どこでどのように最初のメモリの確保を行えばよいのでしょうか。
0262デフォルトの名無しさん
2007/03/02(金) 23:33:14typedef vector<T> vT;
extern vT *pvT;
どっかのcファイルで
static vT *pvT;
最初のメモリ確保は、WM_CREATEとかでnewしておけば良い。
0263デフォルトの名無しさん
2007/03/02(金) 23:37:04えーと、あるウィンドウに属するコントロールの配列を管理するんだろ?
何で「グローバル」である必要があるんだ?
0264デフォルトの名無しさん
2007/03/02(金) 23:42:22vector<T> v;
でいいんじゃないの?
0265デフォルトの名無しさん
2007/03/02(金) 23:42:26なぜポインタにする必要がある?
0266デフォルトの名無しさん
2007/03/02(金) 23:44:13staticな変数をexternしてもリンクエラーが出るだけな気が。
0267デフォルトの名無しさん
2007/03/03(土) 00:20:41int型の変数だろうとvector<T>型の変数だろうと
グローバル変数の使い方は同じじゃね?
0268デフォルトの名無しさん
2007/03/03(土) 00:24:21static配列は
int a[] = { 0, 1, .. };
のような配列初期化構文が使えるが、vector<T>では使えないという
違いがあるな。
vector<T>をstaticに初期化したいならば
int a[] = { 0, 1, .. }:
vector<int> v(&a[0], &a[N]);
のように書くしかないが、メモリの無駄だな。
が、今回のケースでは初期化はWinProc内で行いたいそうだから
どうでもいいんだな。
0269デフォルトの名無しさん
2007/03/03(土) 00:25:57単なる配列でいいんじゃないの?
要素数が固定なら、vector<>はオーバースペック。
0270デフォルトの名無しさん
2007/03/03(土) 08:45:11仮にvector<int> v = {0, 1, ...};のような初期化ができるようになっとしても、
コンストラクタの呼出まで初期化子を静的に用意しておくことになるだろうから、
その実装はおそらくこう書くのと同じようになると思う。
int a[] = {0, 1, ...}:
vector<int> v(&a[0], &a[N]);
0271デフォルトの名無しさん
2007/03/04(日) 00:41:25C++によるオブジェクト間のメッセージ通信についてなんですが、
オブジェクトAがオブジェクトBを含有する構造の場合、
AからBへのメッセージ送信は、AがBのメソッドを呼び出すという形でOKですが、
BからAへのメッセージ送信はどう実装するのがベターなんでしょうか?
1.AからBのメソッドを呼び出し、戻り値をメッセージとして扱う、(BはAに処理させたい内容を戻り値で返す)
2.BにAの参照を渡しておいて、BからAのメソッドを呼び出す、
3.各オブジェクトにメッセージプロシージャを用意して、そこにメッセージを投げる、(ウィンドウメッセージのように)
あたりは試してみているんですが、どうにもソースがスパゲッティになりがちで悩んでいます。
現在は、オブジェクトへのアクセス手段を統一でき、尚且つ不要なメッセージを無視することが可能な「3」を用いて実装しているのですが・・・
何か他にいい手法はないでしょうか?
0272デフォルトの名無しさん
2007/03/04(日) 01:02:31相互依存するぐらいなら同じクラスにしちゃえばいいのに。
それでおかしくなるようなら A, B のどちらか(または両方)が大きすぎるんじゃないの?
0273デフォルトの名無しさん
2007/03/04(日) 01:25:41デリゲートな悩みですか
0274デフォルトの名無しさん
2007/03/04(日) 01:35:33配列の並び順を変更するときに、テンポラリ変数としてヒープ領域を使うのはありでしょうか。
0275デフォルトの名無しさん
2007/03/04(日) 01:37:36うっかりミスでリークしたりしたらあれだし
0276デフォルトの名無しさん
2007/03/04(日) 01:40:47ケースバイケースだなぁ。
オブジェクト間のコミュニケーションが複雑化しすぎると感じるなら、
Mediatorパターンなんてのもあるよ。
ウィンドウメッセージは直接的なC++のメンバ関数呼び出しより
はるかに非効率だけれども、
非同期にできたり、相手が死んでいた場合のdangling pointer問題を
回避できたりという利点はある。
0277デフォルトの名無しさん
2007/03/04(日) 01:42:18ヒープ使ってstd::auto_ptr<>に突っ込む分には>>275の言うような
問題はないが、
速度の問題だけで言えばalloca()の方が速い。移植性が劣るし
スタックサイズの制限にひっかかるかもしれないが。
0278デフォルトの名無しさん
2007/03/04(日) 01:54:53元は全部1つのクラスで処理をしていたんですが、
行数が多すぎて分かり辛くなってきたため、分割しようとしたところ、相互依存の問題が出てきた感じです。
>>273,276
色々ありがとうございます。
デリゲート、Mediatorパターン、ちょっと調べてみます。
ゲームプログラムで、非同期処理なので、その辺ももう少し考えてみます。
0279デフォルトの名無しさん
2007/03/04(日) 07:12:040280デフォルトの名無しさん
2007/03/04(日) 07:26:12100年後とかには生き残ってないだろな。
0281デフォルトの名無しさん
2007/03/04(日) 10:23:01allocaをMSのライブラリは拒否している(昔は使っていたが)。
デフォルトで配列を使ってサイズオーバーしたら
ヒープを使うという戦略になっている
当然allocaより速い
0282デフォルトの名無しさん
2007/03/04(日) 11:16:360283デフォルトの名無しさん
2007/03/04(日) 11:31:090284デフォルトの名無しさん
2007/03/04(日) 15:13:110285デフォルトの名無しさん
2007/03/05(月) 18:32:04Visual Studio2005 C++で
SystemParametersInfo(SPI_SETDESKWALLPAPER, NULL,
"c:\\a.bmp" ,0 );
しても壁紙が変更しません
解る方、教えてください
0286デフォルトの名無しさん
2007/03/05(月) 20:14:000287デフォルトの名無しさん
2007/03/06(火) 00:14:35最後の引数に
SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE
しとけ
0288デフォルトの名無しさん
2007/03/06(火) 04:34:28void __fastcall TForm1::Button1Click(TObject *Sender){
//処理
}
他の関数で、ボタンを押した動作をしたいときは、
どのようにすればよいでしょうか。
0289デフォルトの名無しさん
2007/03/06(火) 10:29:580290デフォルトの名無しさん
2007/03/06(火) 14:06:31ありがとうございます。
0291デフォルトの名無しさん
2007/03/06(火) 21:30:09レスどうもです
SystemParametersInfo(SPI_SETDESKWALLPAPER, NULL,
"c:\\a.bmp" ,SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE );
ってしたんですが、だめでした
他にあればお願いします
0292デフォルトの名無しさん
2007/03/07(水) 02:58:25WinAPIをまとめてあるフレームワークライブラリを解析していたんですが
///// hoge.h ////
class hoge{
hoge();
}
extern hoge* phoge;
///// hoge.cpp ////
hoge* phoge;
hoge::hoge(){
phoge = this;
}
上のような(簡略化してあります)記述がありました。
コンストラクタ内でthisポインタでインスタンスのアドレスを
取得していると思うのですが、このインスタンスが実際に何処にあるのかが、分かりません。
他のファイルも調べてみましたが上の場所でしか、phogeにアドレスが代入されていませんでした。
環境はVisualC++2005です。
0293デフォルトの名無しさん
2007/03/07(水) 03:04:16したがって、phogeは常にNULLのはず。
とおもったが、phogeの代入箇所?さがすのはhogeのインスタンス化位置でそ?
0294デフォルトの名無しさん
2007/03/07(水) 03:38:54さっき気がついたのですがウィンドウの作成時にWNDCLASSではなくCREATESTRUCTが
つかわれていました。これが何か関係あるのでしょうか?
以下のように、この構造体のhInstanceに先ほどのhogeのインスタンスがわたされていました。
cs.hInstance = *app;
0295デフォルトの名無しさん
2007/03/07(水) 07:08:45ソースがあるならそこにブレークポインタでとめて
ステップ実行で周辺を探すって手もある。
上手く行くか知らん。
hoge派生クラスがあるとか。
んなわけないか。
0296デフォルトの名無しさん
2007/03/07(水) 07:30:280297デフォルトの名無しさん
2007/03/07(水) 07:36:58何処で生成しているか判らないから聞いている質問だと思うが?
ブレークポイントを置いてこのときはまだ生成されていないとかから
すこしずつ絞り込んで行くとか。
0298デフォルトの名無しさん
2007/03/07(水) 07:41:430299デフォルトの名無しさん
2007/03/07(水) 07:43:120300デフォルトの名無しさん
2007/03/07(水) 08:58:45で、どこかで作られたであろう インスタンス をポインタで保持して、
いつでも呼び出せるようにしている と。
# MFC の CWinApp じゃね?
0301デフォルトの名無しさん
2007/03/07(水) 09:00:010302デフォルトの名無しさん
2007/03/07(水) 09:30:18フリーソフトによる開発環境では不可能なのでしょうか?
Visual C++では出来なかった物で…。
0303デフォルトの名無しさん
2007/03/07(水) 09:45:38VCのスレ…いや、画像付きの解説ページがあったはずだから、ぐぐった方が良いな
0304デフォルトの名無しさん
2007/03/07(水) 09:50:37ExpressバージョンではMFS、ATLが含まれていないので作成出来ないと思っていました。
有難うございます、もう少しぐぐってみます。
0305デフォルトの名無しさん
2007/03/07(水) 10:43:30プロジェクト作るときにどこかでDLLを選ぶだけ。
0306デフォルトの名無しさん
2007/03/07(水) 11:29:49つ GetLastError()
0307デフォルトの名無しさん
2007/03/07(水) 16:27:32クラスの「constメンバ関数」は、メンバー変数の書き換えを禁止しますよね。
これによって「その関数は何度呼び出しても問題ないはずだな」
と思って分担作業をしていました。
ところがconstメンバ関数の中から、グローバル空間の変数を書き換えている奴がいたのです。
いままで知らなかったのですが、constメンバ関数はグローバル空間の変数などを書き換えてもコンパイルエラーにならないのですね。
この行為を禁じるための、C++文法的な書き方はありませんでしょうか。
「グローバル変数使うの禁止!」といっても使う奴が稀にでてきてコマっています。
0308デフォルトの名無しさん
2007/03/07(水) 16:31:380309デフォルトの名無しさん
2007/03/07(水) 16:43:50ヘッダーファイルで
private:
int (*ptr)[10];
int x[10][10];
と宣言しています。ちゃんと機能しています。
それでデコンストラクターでメモリの解放をしたいんですけど
delete [][] x;
ではコンパイルが通りません。
delete [] x;
では
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
と出てRun-Time Errorになってしまいました。
どうやって解放するんでしょうか?教えてください。
環境はVC++2005 Express Editionです。
0310デフォルトの名無しさん
2007/03/07(水) 16:49:12newしてないんだからdeleteする必要はない。
0312デフォルトの名無しさん
2007/03/07(水) 17:02:02俺も昔勘違いしてた。
0313デフォルトの名無しさん
2007/03/07(水) 17:40:36のように
if(aaa>='1' && aaa<='10')
これも文字だけでできますか?わざわざ数字に変換しなくてもいいですか?
0314デフォルトの名無しさん
2007/03/07(水) 17:43:270315デフォルトの名無しさん
2007/03/07(水) 17:43:510316デフォルトの名無しさん
2007/03/07(水) 17:45:250317デフォルトの名無しさん
2007/03/07(水) 17:47:250318デフォルトの名無しさん
2007/03/07(水) 17:49:530319デフォルトの名無しさん
2007/03/07(水) 17:54:320320デフォルトの名無しさん
2007/03/07(水) 18:00:410321デフォルトの名無しさん
2007/03/07(水) 18:30:53その取得した時間に10時間プラスしたときに
24時間を越えると日付によって年月日は変動すると思います
時間をたしたいのですが
こういう処理のためになにか用意されていないでしょうか?
環境はVC++2002です
0322デフォルトの名無しさん
2007/03/07(水) 18:33:170323デフォルトの名無しさん
2007/03/07(水) 18:34:19struct tm
0324デフォルトの名無しさん
2007/03/07(水) 18:34:25time_t型にした上で、10時間(10 * 60 * 60[sec])を足し、localtime()でばらすかstrftime()で文字列にすれば宜しい。
既にlocaltime()でばらしてあるなら、tm_hourに10を足してからmktime()でtime_tにしてもいい。
0325デフォルトの名無しさん
2007/03/07(水) 18:39:11ちなみに、localtime(), gmtime(), asctime(), ctime()はスレッドセーフではないので
マルチスレッドプログラミングのときはご用心。
0326321
2007/03/07(水) 18:45:560327デフォルトの名無しさん
2007/03/07(水) 18:49:180328デフォルトの名無しさん
2007/03/07(水) 18:49:49横線を引きたいのですが、何かいい方法はありますでしょうか?
0329321
2007/03/07(水) 18:50:51time_tに対して10*3600してできました
ありがとうございます
0330デフォルトの名無しさん
2007/03/07(水) 19:00:18それを呼び出すスレッドが複数ある場合は衝突が発生する可能性がある。
まぁ、呼び出すスレッドが一つだけなら問題ないけどね。
簡単に図式化するとこうなる。
・単一スレッドからの呼び出し
スレッドA ──localtime()呼び出し──内部領域変更──localtime()から復帰──内部領域から結果を回収──
・複数スレッドからの呼び出し
スレッドA ──localtime()呼び出し──内部領域変更──localtime()から復帰──内部領域から結果を回収──
スレッドB ────localtime()呼び出し──内部領域変更──localtime()から復帰──内部領域から結果を回収──
↑ ↑
ここで壊れる。 もし壊れなくても、ここでスレッドBからの呼び出しの結果を読む羽目になる。
0331デフォルトの名無しさん
2007/03/07(水) 19:08:53すごく参考になりました
0332デフォルトの名無しさん
2007/03/07(水) 19:43:27ふざけたこと抜かすんじゃねー
0333デフォルトの名無しさん
2007/03/07(水) 19:44:010334デフォルトの名無しさん
2007/03/07(水) 19:48:49数値と文字を一緒にするな。
他の言語だと自動で文字を数値に変換したりするけど
C/C++などは'9'をそのままASCII文字コードだよ。
http://e-words.jp/p/r-ascii.html
つまり
'9'を数値で言うと57
'$'を数値で言うと36
だ。
'10'はコンパイラによって違うと思う。
0335デフォルトの名無しさん
2007/03/07(水) 21:39:31継承された場合、継承後のインスタンスでnewしたいのですが、エレガントな方法が
思いつきません、ご教授お願いします。
0336デフォルトの名無しさん
2007/03/07(水) 21:49:53複数のクラスがそのクラスを継承してる場合はどうするべき?
0337デフォルトの名無しさん
2007/03/07(水) 21:52:44もうすでにnewしちゃったんじゃしようがないんじゃない。
0338デフォルトの名無しさん
2007/03/07(水) 21:54:410339デフォルトの名無しさん
2007/03/07(水) 22:13:46継承後も含めてそのクラスのインスタンスが一つしか存在しないようにします。
>>338
Factoryでインスタンスを取得し、
FactoryをVirtualtou(等)にして継承した場合書き換えるという風にですか?
0340デフォルトの名無しさん
2007/03/07(水) 22:36:25グローバルな関数 Base *new_derivered_class(); を実装すればよくね?
それとも、継承先のクラスが存在しない場合Baseをnewする必要があるわけ?
0341デフォルトの名無しさん
2007/03/07(水) 23:07:38さっぱりその方法が解りません。
その手のことが書かれたサイトを教えていただけませんか?
0342デフォルトの名無しさん
2007/03/07(水) 23:10:180343デフォルトの名無しさん
2007/03/07(水) 23:14:21やはりそうですか。
Cでやりたかったのですが、素直に真珠でやります。
ありがとうございました。
0344デフォルトの名無しさん
2007/03/07(水) 23:15:590345デフォルトの名無しさん
2007/03/07(水) 23:20:04継承してメンバー関数を上書きして処理を記述するようにしたいので、
何か処理をする場合には、必ず継承しなければならないです。
継承しない場合は、現実的にはないと思うのですが・・・
0346デフォルトの名無しさん
2007/03/07(水) 23:23:48「猫でも分かるネットワークプログラミング」にhtmlを読み込んで表示する方法が書いてあったと思う
今手元にないので分からんが、WinSockをつかってたとおも
0347デフォルトの名無しさん
2007/03/07(水) 23:29:170348デフォルトの名無しさん
2007/03/07(水) 23:38:18分野はネットワーク関係なんですね。
それが解っただけでも十分です。
ありがとうございました。
0349デフォルトの名無しさん
2007/03/07(水) 23:51:03WindowsならURLDownloadToCacheFile()が一番お手軽
0350デフォルトの名無しさん
2007/03/08(木) 01:16:50真珠ってPearlって書くのしってんのか?
いやPerlもPearlから来てるんだがな
0351デフォルトの名無しさん
2007/03/08(木) 11:07:27unsigned char*とchar*のキャストは、(*型)だけでキャストできるのでしょうか?
出来ないキャストの場合は、エラーや警告などでますか?
以下のようにしてプログラミングしましたが、希望通りの出力でした。
ネットで危険なキャストがどうの、って良く見かけるんですが
よくわかりません。
”桁が大きくなると、小さい型にキャストするときは気をつける。”
これだけ注意すれば大丈夫でしょうか?
unsigned char* un_str="hoge";
char* str;
unsigned char* from_char_to_unsigned_char_str; //char*->unsigned char *の格納する変数
printf("un_str=%s\n",un_str); //unsigned char*は、char*みたいに出力できるか
str=(char*)un_str;
printf("str=%s\n",str);//(char*)だけで、キャストできるのか
from_char_to_unsigned_char_str=(unsigned char *)str;
printf("from_char_to_unsigned_char_str=%s\n",from_char_to_unsigned_char_str);//(unsigned char*)だけで、キャストできるのか
------出力-------------------------------
un_str=hoge
str=hoge
from_char_to_unsigned_char_str=hoge
0352デフォルトの名無しさん
2007/03/08(木) 14:03:04> printf("un_str=%s\n",un_str);
%s は const char* 型の引数を期待するから、
*((const char*)un_str)という変換が行われることになる。
un_strが指してるのは"hoge"、つまり const char[] だから、問題なく変換できる。
他も同じ。
0353デフォルトの名無しさん
2007/03/08(木) 14:26:55現実には大抵そうなっているけど、規格上はそんな規定なんてないはず。
0354デフォルトの名無しさん
2007/03/08(木) 14:28:46んじゃvoid*の扱いはどうなるんだ?
0355デフォルトの名無しさん
2007/03/08(木) 14:29:45そして使うときはキャストされるので問題なし
0356デフォルトの名無しさん
2007/03/08(木) 14:32:170357デフォルトの名無しさん
2007/03/08(木) 14:40:290358デフォルトの名無しさん
2007/03/08(木) 14:42:580359デフォルトの名無しさん
2007/03/08(木) 14:45:19普通に char* と int* のサイズが違うようなアーキテクチャも存在した。
0360デフォルトの名無しさん
2007/03/08(木) 17:23:43> C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。
いろいろと実験しながら、少しずつわかってきました。
丁寧に説明ありがとうございました。
0361デフォルトの名無しさん
2007/03/09(金) 20:15:24モーダルダイアログボックスを使っているとき、
プロシージャに最後に呼ばれるメッセージは何ですか?
WM_CLOSEメッセージでDestroyWindow(hDlg)して、
WM_DESTROYメッセージが呼ばれた後に、WM_COMMANDがくるのですが…
0362デフォルトの名無しさん
2007/03/09(金) 20:55:26たとえそのウィンドウ宛にメッセージが来ても
それは存在しないウィンドウハンドル宛だし
処理するところがないので無視することになるだけだと思うけど。
何か特殊なケース?
0363デフォルトの名無しさん
2007/03/09(金) 21:06:17WM_COMMANDがくること自体は問題ないのですが、
エディットコントロールにWM_COMMANDがきたときに使うメモリを解放するのに、
WM_DESTROYの後にエディットコントロールに対してWM_COMMANDがきてしまうと、
わざわざWM_DESTROY呼ばれる前後で、場合分けするのが無駄だと思えるので…
0364デフォルトの名無しさん
2007/03/09(金) 21:31:38CString な変数に ANSI コードページでもユニコードでもない文字列つっこんで処理したいんですわ。
具体的には、GetLenth とか Replace したい(ANSI コードページでもまともに処理してなさそうだけど)
楽に処理するにはどうしたらいいでしょう?CString 捨てな方法でもいいです。
0365デフォルトの名無しさん
2007/03/09(金) 21:56:120366364
2007/03/09(金) 22:07:24俺に言ってる?
CString はたとえばコードページ 932 の場合、
Replace で 1 バイト文字を置換対象にするときに、2 バイト文字の下位バイトが置換対象とバイト的には等しくても、置換しないようにするよね?
そういうのをすべてのコードページでやりたいの。
ではよろしくお願いします。
0367デフォルトの名無しさん
2007/03/09(金) 22:08:23っ nkf
0368364
2007/03/09(金) 22:33:56nkf のライブラリにコードページを指定出来るようなメソッドを追加したクラスが実装されているということでしょうか?
単なる変換ができるというだけなら却下ですな。
(nkf 使わなくても文字コードの変換はできるし、変換することによってコードをマッピングできなくなる場合とか考えたくない。
ユニコード系のコードに変換すればマップだけはできるんだろうけど。
それといちいち文字コード変換するとよさげなソースコードにならなさそうなんだ。
そもそも nkf って日本語しか対応してないだろ?
個人的には今回の場合 UTF-8,CP51932,CP932 を使えれば問題ないと思ってるんだけど、他の奴が許さないんだぁ。)
注文多すぎてむかつくかもしれないけど、どうかどうかよろしくお願いします。
ぶっちゃけ CString::SetCodepage() とかいうメソッドが実装されていて、あとはよきにはからってくれる実装がほしい。
0369デフォルトの名無しさん
2007/03/09(金) 22:44:11一々文字コード変換をしたほうがデバッグが楽だと思う
UTF-8 -> Unicode 変換
↓
Unicode で何か処理
↓
Unicode -> UTF-8 変換
よさげなソースコードにならなさそうって言われればそれまでだけど…
0370デフォルトの名無しさん
2007/03/09(金) 22:50:22それにあわせてReplaceの動作が変わるなんて出来ないんじゃないのって思うから
vector<BYTE>でよくね?
0371デフォルトの名無しさん
2007/03/09(金) 22:53:13つ MLang
0372364
2007/03/09(金) 23:14:46やりたいことの一つに、「ANSI CP 以外の文字列読み込み->文字置換->そのまま書き込み」ってのがあるんだけど、
ユニコードにいちいち変換してたら絶対にスマートでないよね。
あと、調べたところまずなさそうなんだけど、変換->逆変換で違うコードにマッピングされると困る。
>>370
コードページ指定して UNICODE には変換できるんだから、出来ないはずはないとおもうんだけどなぁ。
クラスに変数 1 つだけ入れておけば使用側がセットして良きにはからうことはできるはず。デフォルトは CP_ACP で。
なんで実装されてないのか理解できないほどだ。
vc8 だと reentrant locale が一部実装されていて、1文字送りは簡単にできそうになってるなぁ。VC6 でつくらないといけないんだけど。。。
>>371
ちょっと調べてみます。ざっとみた感じでは変換しかしてくれなさそうだけど。
あと、これつかわないと CP51932 つかえなさそうですね。
MultibyteToWidechar とかに 51932 とかつっこめば変換だけは出来るとおもってたけど。
0373デフォルトの名無しさん
2007/03/09(金) 23:17:130374デフォルトの名無しさん
2007/03/09(金) 23:30:14> ユニコードにいちいち変換してたら絶対にスマートでないよね。
コードページごとに処理を特殊化させるほうがよほどスマートじゃないと思うがね。
0375デフォルトの名無しさん
2007/03/09(金) 23:36:58UNICODEの変換・復元がもったいない、なんていうことを言うのは
日本人だけなのではないか?(w
0376デフォルトの名無しさん
2007/03/09(金) 23:38:03クライアントからホストを
char* szHost = "www.google.co.jp"
gethostbyname( szHost );
の様に指定してHTMLをサーバから取得できる事は判ったのですが、例えば、
取得したいHTMLが、
www.google.co.jp/search?hl=ja&q=c言語&btnG=Google+検索&lr=
の様にクエリも含む場合はどうすれば良いのでしょうか。
よろしくお願いします。(板違いなら誘導お願いします。)
0377デフォルトの名無しさん
2007/03/09(金) 23:40:20CESも場合によっては変換する必要があるけど。
0378デフォルトの名無しさん
2007/03/09(金) 23:47:15暮れ暮れ君で申し訳ないですが、URLのエンコードってどうやるんでしょうか。
0379364
2007/03/09(金) 23:52:19単純な置換にはかなり大げさなライブラリですな。いざとなったらこれで Replace をオーバーライドするか。
どうもありがとうございます。
もっと単純にできる方法も引き続き募集いたします。
>>374
個人的にはコードページが違うんだから、特殊になるのは当然だとおもうけど。
ユニコードが*本当に万能*なら汎用的に処理できるんでしょうけど。ま、CSI 論争はやめておきましょうか。
>>375
ま、大きな声でいってるのは日本人だけでしょうな。
でも、XFree86 で utf8 関数が投入されたときは一部の外国人もぶーたれてたな。
CSI かどうかはおいといて、reentrant locale がほしい人は外国でも結構いるみたい。
0380デフォルトの名無しさん
2007/03/09(金) 23:55:410381デフォルトの名無しさん
2007/03/09(金) 23:58:26おまえもな
0382デフォルトの名無しさん
2007/03/09(金) 23:59:170383デフォルトの名無しさん
2007/03/09(金) 23:59:45traitsを自作するとかさ。
0384デフォルトの名無しさん
2007/03/10(土) 00:05:36「URLのエンコード」程度なら、検索するべきですわん。
簡単に見つかるから。正確な事もわかるし。
ラフに解説すると、URLとして使ってよい文字ってのは
あらかじめ決まってるから(←ってのは知ってたと思うけど)
使えない文字は %xx みたいな形式に置き換える事。
0385デフォルトの名無しさん
2007/03/10(土) 00:42:35変換コストがもったいないと思っているのなら
大抵のCSI対応クラスは内部で統一コードに変換してるから意味ないぞ
0386デフォルトの名無しさん
2007/03/10(土) 00:46:18CSIの意味わかってる???
0387デフォルトの名無しさん
2007/03/10(土) 01:13:10whileの中で、
if(キーが倒されている)
アニメーションAを再生
アニメーションBを停止
else if(キーが倒されている)
アニメーションAを停止
アニメーションBを再生
と書くと、()内が真or偽が判定されるたびに、アニメーションが最初から再生されて、0フレーム目しか再生されません。
最初に書いたようなことをするには、どういう風にプログラムを書けば良いでしょうか?
できればヒントでよろしくお願いします。
0388デフォルトの名無しさん
2007/03/10(土) 01:19:580389デフォルトの名無しさん
2007/03/10(土) 01:35:22キーも大変だな、一々倒されて。
0390デフォルトの名無しさん
2007/03/10(土) 01:36:17ヘンなとこで敬語使ってるからじゃね。
0391デフォルトの名無しさん
2007/03/10(土) 02:00:270392デフォルトの名無しさん
2007/03/10(土) 02:03:470393デフォルトの名無しさん
2007/03/10(土) 02:30:54鼻から悪魔がでたらオーバーフローしていると判断してよろしい。
処理系によっては、オーバーフローした場合を判断する方法があるかもしれない。
0394デフォルトの名無しさん
2007/03/10(土) 10:26:51クラスBの中でクラスAのオブジェクトの配列を管理したい。
でもクラスAは、A2やA3などにも派生させてて、それも配列に入れたい、って場合。
class A {
...
};
class A2 : public A{
...
}
class A3 : public A{
...
}
class B {
vector<A> a1_vector;
}
ってしたいんだが、これだとa1_vectorにはA2,A3が入らないですよね?
ってなると・・
class B {
vector<A*> a1_vector;
}
で、new A, new A2とかでオブジェクト作って、そのポインタをa1_vectorにpushすることになると思うんですが、これだとクラスBのインスタンスが破棄されたときに、a1_vectorで管理されている各オブジェクトって廃棄されないですよね?
で、google先生とかに聞くと、share_ptr使う人がいるみたいなんですが、それで問題ないですかね?
なんか注意点とかありますか?もしくは他にいい方法ありますでしょうか?
0395デフォルトの名無しさん
2007/03/10(土) 11:11:030396デフォルトの名無しさん
2007/03/10(土) 11:19:430397デフォルトの名無しさん
2007/03/10(土) 11:28:53boost::shared_ptrでおk
std:auto_ptrはコピーが破壊的でコンテナにいれらんないから駄目
敢えて他の方法を挙げるとすれば、Boehm GCを使うとか?
0398デフォルトの名無しさん
2007/03/10(土) 11:34:10予測不能にならない?
0399デフォルトの名無しさん
2007/03/10(土) 11:35:30>>396
参考までに聞きたいが、どう設計を見直すんだ?
C++でポリモーフィズムを実現したいなら、参照を経由するしかないし
派生クラスを基底型の配列やvectorに突っ込もうとすると
スライシングが発生するから、>>394の言っていることはごく当然の話では?
C++でポリモーフィズムを使うなと言ってる?
0400デフォルトの名無しさん
2007/03/10(土) 11:39:21勿論その辺は他のGC言語となんも変わらない。
0401デフォルトの名無しさん
2007/03/10(土) 12:31:450402デフォルトの名無しさん
2007/03/10(土) 13:11:10>396ではないが、「他にいい方法」を模索するなら実装方法を検討する前に設計を見直せということでしょ。
>394ではないから、そのクラス構成が最適解なのかは判らないのだから。
0403デフォルトの名無しさん
2007/03/10(土) 14:19:41それは深読みじゃねえの?
>>394はC++でポリモーフィズムをやりたいときのスマートな方法を問うている
だけに見えるけど。
0404デフォルトの名無しさん
2007/03/10(土) 14:36:21最適解なのか「判らない」んなら、少なくとも「設計見直せ」は言いすぎだろうな。
「その設計では駄目だ」と断定してるのと同じだ。
0405デフォルトの名無しさん
2007/03/10(土) 15:08:24みなさん、いろいろありがとうございます。
おおむねsharedでよさげな感じですね。
ただ、396さんの「設計みなおせ」も気にはなるところです。
やっぱり、こういう書き方になる設計って良くないんですかね?
他の人のソース見ても、こういう書き方してるの、あまり見たことないし。
0406デフォルトの名無しさん
2007/03/10(土) 15:28:51サンプルにboost使う状況を避けた設計してるとかじゃないかなぁ(適当
sharedなら割と直感的になるので悪くないと思うし、
EffectiveSTLの7項にもマンドクセってなったらsharedを検討してみては? ってある
0407デフォルトの名無しさん
2007/03/10(土) 16:26:350408デフォルトの名無しさん
2007/03/10(土) 16:50:440409デフォルトの名無しさん
2007/03/10(土) 16:53:030410デフォルトの名無しさん
2007/03/10(土) 17:01:33iostreamやソートは「筆舌に尽くしがたいくらい遅い」んだろうね。
0411デフォルトの名無しさん
2007/03/10(土) 17:45:37鼻から悪魔ですか・・・
まあ、Intel系ならちゃんとオーバーフローしてくれますよね^^
どうもありがとうございました。
0412デフォルトの名無しさん
2007/03/10(土) 22:49:42別にstrtok()でも目的は果たせるんですが、
元の文字列を破壊したり、同時に2ヶ所以上で呼びづらかったりと
あまり美しいとは言えないような気がして。
0413デフォルトの名無しさん
2007/03/10(土) 22:59:03けどそれくらい自分で作ればいいんじゃ?
std::stringとか、目的の機能を実装するのに使えそうなモノはあるし
0414デフォルトの名無しさん
2007/03/10(土) 23:01:17istringstreamからデリミタを指定してgetline()
0415デフォルトの名無しさん
2007/03/10(土) 23:11:450416デフォルトの名無しさん
2007/03/10(土) 23:14:210417デフォルトの名無しさん
2007/03/10(土) 23:17:43ただのistream_iteratorだとtokenじゃなくてcharが返らんか?
0418417
2007/03/10(土) 23:24:39でも、これってデリミタ指定できるか?
0419412
2007/03/11(日) 00:10:10いただいたヒントを元に、更に調べてみようと思います。
それにしても、strtok()ってクセ強いですよねぇ……。
0420デフォルトの名無しさん
2007/03/11(日) 00:23:25ちゃんとしたベンダーならマルチスレッドな環境で同時に使っても
問題が起きないことを保証してくれてるもんだぞ>strtok()
まぁ、同じスレッドから複数の処理をやっちゃうと確実にアウトだけど。
0421デフォルトの名無しさん
2007/03/11(日) 00:30:41を選べるのが良いな。
strtok()には色々問題があるが、デリミタも空トークンも捨てる仕様なので、
これでは困ることもある。
シェルのような感じで空白文字を区切りに使うときはこれでよいのだが。
環境によってはBSD由来のstrsep()という関数が使える場合もある。
こっちは予めリエントラントで、デリミタを捨てて空トークンを残す仕様だ。
ただし、コピーを避けるために元のバッファに破壊的に動作するのは同じ。
Cなら単にsscanf()を使うのも悪くない選択肢。
0422デフォルトの名無しさん
2007/03/11(日) 00:32:24MSVC++の場合はhidden dataをTLSに隠す仕様だから問題ない。
が、リエントラント版strtok()はstrtok_r()のような別名で提供している
実装も多いよ。
こういうことがあるから、移植性を考えてもstrtok()の使用は
好ましいとは言えない。
0423デフォルトの名無しさん
2007/03/11(日) 01:58:54/* test.c */
#include <stdio.h>
#include <math.h>
int main(void) {
double i = 2;
double foo;
printf("%d\n", (int)pow(10, 2)); /* 結果 100 */
printf("%d\n", (int)pow(10, i)); /* 結果 99 */
printf("%f\n", pow(10, i)); /* 結果 100.000000 */
foo = pow(10, i);
printf("%d\n", (int)foo); /* 結果 100 */
return 0;
}
このソースをMinGW32-gccでコンパイル・実行すると、結果がコメントのようになります。
(bccだと、100、100、100.000000、100 になるのですが。)
これはコンパイラの仕様なのか、それともバグなのか、どちらでしょうか?
0424デフォルトの名無しさん
2007/03/11(日) 03:01:43double i = 2;
double foo;
foo = pow(10, i) - 100.0;
printf("%e\n", foo);
foo = pow(10, i);
printf("%e\n", foo);
}
多分情報落ちしてるだけだと思う。
0425デフォルトの名無しさん
2007/03/11(日) 13:03:40派生クラスでも同様に代入演算子をオーバーロードした時に基底クラスのメンバをコピーするためには
派生クラスのオーバーロード内に基底クラスのメンバをコピーするような処理を自前で用意しないといけないのでしょうか?
0426425
2007/03/11(日) 13:12:55派生クラスのコピーコンストラクタで自動的に基底クラスのコピーコンストラクタが
呼ばれているように見えましたので。。。
0427デフォルトの名無しさん
2007/03/11(日) 13:17:40class Base
{
public:
Base& operator =(const Base&);
};
class Derived : public Base
{
public:
Derived& operator =(const Derived&);
};
Derived& Derived::operator =(cosnt Derived& d)
{
Base::operator =(d);
//以下Drived分のコピー処理
}
0428425
2007/03/11(日) 13:46:43なるほど。基底クラスを指定して呼び出せばよかったのですね。
基本的なことだったのかもしれませんがとても勉強になりました。
0429デフォルトの名無しさん
2007/03/11(日) 15:08:05class Hoge { … }
vector<Hoge> HogeArray;
文法としてこんなことできますか?
0430デフォルトの名無しさん
2007/03/11(日) 15:13:140431デフォルトの名無しさん
2007/03/11(日) 15:43:210432デフォルトの名無しさん
2007/03/11(日) 16:39:160433デフォルトの名無しさん
2007/03/11(日) 16:47:46ある意味度胸かも
0434デフォルトの名無しさん
2007/03/11(日) 16:58:21言ってあげるべきモノではあると思う。
慣れないうちはつけ忘れ多いだろうし。
0435デフォルトの名無しさん
2007/03/11(日) 16:59:370436デフォルトの名無しさん
2007/03/11(日) 17:25:540437デフォルトの名無しさん
2007/03/11(日) 17:38:43ヒント:ココは初心者スレ
0438デフォルトの名無しさん
2007/03/11(日) 17:43:57もれなく>>435が全て解決してくれるスレになりました。
0439デフォルトの名無しさん
2007/03/11(日) 17:47:23初心者はどれを載せたらいいのかもわからんし難しいなw
0440デフォルトの名無しさん
2007/03/11(日) 19:00:00基本的には、初心者どころか入門者(入門書を読み始めたばかり)というレベルだけだろ。
それを解決するもの簡単だし。
もちろん、規格の細部や処理系異存かなんて話はあるけどさ。
本当に時間がかかる「バグ」というのは
「コンパイルは通るけど意図通りに動きません」なんだから。
もちろん、極稀なコンパイラのバグにぶつからない限り
「ソースの通りに動いている」わけだけど。
0441429
2007/03/12(月) 00:31:30431さんの言うとうりセミコロンの付け忘れでした。
0442デフォルトの名無しさん
2007/03/12(月) 01:44:480443デフォルトの名無しさん
2007/03/12(月) 01:54:300444デフォルトの名無しさん
2007/03/12(月) 06:03:42三点リーダを>>429のように使えるはずないもん!
0445デフォルトの名無しさん
2007/03/12(月) 11:07:510446デフォルトの名無しさん
2007/03/12(月) 11:09:38std::auto_ptrなど何らかのスマートポインタに入れておくべき。
0447デフォルトの名無しさん
2007/03/12(月) 16:47:03実行すると途中のcount=35あたりまで表示されてエラーが起こります。
メッセージ:「ハンドルされていない例外は TEST.exe にあります:0xC0000005: Access Violation。」
これは何故起こるのでしょうか。解決法もできれば教えてください。お願いします。
struct Test
{ int x;
Test *p;
};
int main()
{ int i;
std::vector<Test> v; //xに1〜99を順に入れていく。pには一つ前のポインタを入れる
Test b;
b.p = NULL;
v.push_back(b);
for (i=1;i<100;i++) { //
b.x = i;
b.p = &v[i-1]; //
v.push_back(b);
}
Test *c;
c = &v[v.size()-1];
int count = 0;
while ( c->p != NULL ) { // NULLが出るまでpを辿る
printf("%d: %d\n",count++,c->x);
c = c->p;
} 長くなってすいません。
0448デフォルトの名無しさん
2007/03/12(月) 17:02:59なので&v[i-1]は途中から不正なポインタを指す。
なので本当は&v[i-1]が不変なのを期待しちゃダメ。
↓こうやって最初に100確保しておけば再割り当てが起こらないだろうから大丈夫。
int main()
{
int i;
std::vector<Test> v(100);
Test b;
b.p = NULL;
v[0] = b;
for (i=1;i<100;i++) {
b.x = i;
b.p = &v[i-1];
v[i] = b;
}
Test *c;
c = &v[v.size()-1];
int count = 0;
while ( c->p != NULL ) {
printf("%d: %d\n",count++,c->x);
c = c->p;
}
}
0449デフォルトの名無しさん
2007/03/12(月) 17:04:210450デフォルトの名無しさん
2007/03/12(月) 17:59:18で、不足してきたらまた余裕を持ってNULLと末端の要素を
実際に割り当てた時は割り当てた所に書き込むのと同時に、末端となる位置も変えてやらにゃならん
こんな事してたらvectorの意味無いじゃん
0451デフォルトの名無しさん
2007/03/12(月) 18:13:42削除する関数ってあるでしょうか。
C++Builderです。
0452デフォルトの名無しさん
2007/03/12(月) 18:18:30Win32 APIにはSHFileOperationがあるが。
0453デフォルトの名無しさん
2007/03/12(月) 18:24:200454デフォルトの名無しさん
2007/03/12(月) 18:30:34やはり場所が変わっていたのですか・・・
vectorを使うべきじゃなかったようですね
ありがとうございました。
0455デフォルトの名無しさん
2007/03/12(月) 18:44:58イレテータ使え
0456デフォルトの名無しさん
2007/03/12(月) 18:51:320457デフォルトの名無しさん
2007/03/12(月) 18:54:06SHFileOperationですか。
見てみたんですが、引数がたくさんあって難しそうですね。(汗
簡単な解説と使用例どこかにないか探して見ます。
>>453
おおお。今はこの方法で行きたいと思います。
ありがとうございました。
0458デフォルトの名無しさん
2007/03/12(月) 19:26:01あるクラス内でnewしたメンバ変数への参照かポインタを返す場合、
クラスの外側からdeleteさせないようにするにはどうすればいいんでしょうか?
constつければコンパイルエラーになるもんだと思ってたんですが、
試してみたらダメでした。
class moge;//詳細は略
class hoge{
moge* mp;
public:
//略
const moge * const getMp(){return mp;};
const moge& getMRef(){return *mp};
}
void f(hoge& h){
const moge * const mp = h.getMp();
delete mp; //コンパイルエラーになってほしい
}
void g(hoge& h){
const int& i = h.getRef();
delete &i; //コンパイルエラーになってほしい
}
0459458
2007/03/12(月) 19:29:44void g(hoge& h){
const moge& m = h.getMRef();
delete &m;//コンパイルエラーになってほしい
}
が正しいですね。
0460デフォルトの名無しさん
2007/03/12(月) 19:32:010461デフォルトの名無しさん
2007/03/12(月) 19:36:53std::vectorのイテレータは、
基のvectorの要素数が変わったら無効になってよいとなっているので、
何の解決にもならない。
0462458
2007/03/12(月) 20:02:43確かに質問内容の答えにはなってるんですが、ちょっと説明不足でした。
class hogeのメンバ関数内でmogeをnewしていて、hogeのデストラクタで
deleteしたいんです。
mogeのデストラクタをprivateにするとhogeの破棄時にdeleteできずにメモリが
リークしてしまうという問題が出てしまいますよね。
0463デフォルトの名無しさん
2007/03/12(月) 20:16:050464デフォルトの名無しさん
2007/03/12(月) 20:21:160465デフォルトの名無しさん
2007/03/12(月) 20:29:52class IMoge{ protected:~IMoge(){}};
class moge : public IMoge{public:~moge(){} };
class hoge{ moge *mp;
public : IMoge &getmogeref(){ return *mp; }
~hoge(){delete mp;} };
0466デフォルトの名無しさん
2007/03/12(月) 20:36:14うわ俺マジ頭良い^^
0467458
2007/03/12(月) 20:39:01どうもありがとうございます。
たぶん友達にするのが一番個人的な要求に合っていると思います。
というか、こんな基本的なことも浮かばないあたり、ダメダメですね。
0468デフォルトの名無しさん
2007/03/13(火) 00:04:47いや、たぶん突っ込まれてもそれはそれで困るんだろうけど。
0469デフォルトの名無しさん
2007/03/13(火) 19:37:36error LNK2019: 未解決の外部シンボル "public: void __thiscall C01::TEST(void)"〜
とでます。
inlineをはずれば通るのですが、どうしてもinlineを付けたいです。
解決方法御願いします。
//00.cpp
#include "01.h"
void main()
{
C01 c;
c.TEST();
}
//01.h
class C01
{
public:
void TEST();
};
//01.cpp
inline
void C01::TEST()
{
}
0470デフォルトの名無しさん
2007/03/13(火) 19:48:320471デフォルトの名無しさん
2007/03/13(火) 19:49:280472469
2007/03/13(火) 21:04:32コンストラクタの有無は関係有りませんでした。
>>471
TEST()関数をヘッダに書いたら通りました。
有り難うございます。
ちなみに.cppの方に書く事は出来ないのでしょうか?
0473デフォルトの名無しさん
2007/03/13(火) 21:06:380474デフォルトの名無しさん
2007/03/13(火) 21:07:28リンカがやってくれたりもする場合もあるらしいけど
0476デフォルトの名無しさん
2007/03/13(火) 23:34:14gcc version 3.4.6
コンパイルオプション
-D_XOPEN_SOURCE=600
警告: 引数 2 個の `read' を渡しますにより、ポインタの示す型か
らの修飾子が切り捨てられます。
read()を利用しているソースをコンパイルしようとすると上記のような
警告が出ます。なぜこんな警告が出るのかさっぱりです。
何かよい解決方法をご存知の方はおられませんか?
0477デフォルトの名無しさん
2007/03/14(水) 00:09:420478デフォルトの名無しさん
2007/03/14(水) 01:27:36警告:readに渡す第二引き数のポインタ修飾子が剥がされます。
read()にconst char *渡したりしていない?
0479デフォルトの名無しさん
2007/03/14(水) 01:35:350480デフォルトの名無しさん
2007/03/14(水) 01:44:53gccのエラーメッセージの日本語訳が無茶苦茶なの。正解は>478。
0481デフォルトの名無しさん
2007/03/14(水) 16:23:49handle[i]=_beginthread(...);
}
//handle[0],handle[1],handle[2]どれから、終わるのかわかりません
for(int i=0; i<3; i++){
WaitForSingleObject( handle[i] , INFINITE );
}
3つスレッドを立ち上げましたが、後処理の方法で困っております。
上記のようにすると、WaitForSingleObjectで、
永遠に待つ状態になってしまいます。
どうするときれいに、後処理できるでしょうか?
よろしくお願いします。
0482デフォルトの名無しさん
2007/03/14(水) 16:25:030483デフォルトの名無しさん
2007/03/14(水) 16:44:150484デフォルトの名無しさん
2007/03/14(水) 16:50:340485デフォルトの名無しさん
2007/03/14(水) 21:17:270486デフォルトの名無しさん
2007/03/14(水) 21:18:300487デフォルトの名無しさん
2007/03/14(水) 21:27:520488デフォルトの名無しさん
2007/03/15(木) 00:11:280489デフォルトの名無しさん
2007/03/15(木) 10:16:57レスありがとうございます。
for (int i=0; i<3; i++){
while(WaitForMultipleObjects(3, handle,TRUE, 1000) == WAIT_TIMEOUT){
OutputDebugString("タイムアウトしました");
}
OutputDebugString("タイムアウト以外デス");
}
これで、きれいに後処理できました。
>>483
_beginthreadは、CloseHandle()しなくても、自動で閉じてるかもしれないです。
ネットで検索すると、自動で閉じてるみたいなこと書いてありました。
試しにCloseHandle()してみると、エラーでました。
環境は、C++Builderですが、_beginthreadexを使用したほうが、良いのでしょうか?
0490デフォルトの名無しさん
2007/03/15(木) 13:10:23URLデコードについて教えてください。
ttp://work.tkensaku.com/tool/urldec.html
こちらのサイトなど、インターネットに落ちているものを利用して
デコードしてみたのですが、きちんとデコードできるときとできないときがあります。
例えば、
1.「%82%A0%82%A0%82%A0」->「あああ」
2.「%E6%96%B0%E8%A6%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%20%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88.txt」->「譁ー隕上ユ繧ュ繧ケ繝・繝峨く繝・繝。繝ウ繝・txt」
1は、うまくいきましたが2が文字化けしてしまいました。
ttp://www.taka-k.com/pg.html
こちらの関数で、確認しましたが同様に「譁ー隕上ユ繧ュ繧ケ繝・繝峨く繝・繝。繝ウ繝・txt」と出力されました。
ttp://www.tagindex.com/tool/url.htmlで、2を確認すると「新規テキスト ドキュメント.txt」と正常に表示されました。
「新規テキスト ドキュメント.txt」->「%E6%96%B0%E8%A6%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%20%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88.txt」
のエンコードは正常なのかもしれません。
何が原因なのかわからないのですが、どうすれば常に正常にデコードできるでしょうか。
よろしくお願いします。
0491デフォルトの名無しさん
2007/03/15(木) 13:13:110492デフォルトの名無しさん
2007/03/15(木) 13:27:10templateを使っているのですが、
template<class T>とした時、このTが「IHogeを継承したクラスかどうか」を判断する方法はないでしょうか?
if (isIHogesChild(T))
{
IHogeを継承しているときの処理.
}
else
{
それ意外の時の処理.
}
とやりたいのです。
0493デフォルトの名無しさん
2007/03/15(木) 14:14:161はCP932、2はUTF-8。UTF-8をCP932環境で表示しようとするから文字化けしているだけ。
0494デフォルトの名無しさん
2007/03/15(木) 14:48:28>>493
>1はCP932、2はUTF-8。UTF-8をCP932環境で表示しようとするから文字化けしているだけ。
すごい。どうやって2はUTF-8とわかるのでしょうか。
「%E6%96・・・」を眺めているとわかるのですか?
0495デフォルトの名無しさん
2007/03/15(木) 14:51:43そして、3バイト文字なら1110 で始まるので必ずEで始まる。
0496デフォルトの名無しさん
2007/03/15(木) 14:53:50で、予想通りこんな出力が得られたわけだ。
--
0000000 e6 96 b0 e8 a6 8f e3 83 86 e3 82 ad e3 82 b9 e3
0000020 83 88 20 e3 83 89 e3 82 ad e3 83 a5 e3 83 a1 e3
0000040 83 b3 e3 83 88 0a
0000046
0497デフォルトの名無しさん
2007/03/15(木) 15:31:49boost::is_base_of<IHoge, T>
0498デフォルトの名無しさん
2007/03/15(木) 16:49:31コンパイル時に分かる事を実行時に判定するのは非効率だよ。
非効率どころかコンパイルが通らなくなることも多い。
0499デフォルトの名無しさん
2007/03/15(木) 16:55:590500デフォルトの名無しさん
2007/03/15(木) 17:07:09誰もそんなこと言ってないが
0501デフォルトの名無しさん
2007/03/15(木) 17:08:160502デフォルトの名無しさん
2007/03/15(木) 18:08:05実用的なコンパイラなら最適化でif文をさっくりと消してくれる。
0503デフォルトの名無しさん
2007/03/15(木) 20:52:02その文字数を整数に直す(この場合だと5)方法ってありますか?
別にstringを使わなくてもいいんですが・・・・
0504デフォルトの名無しさん
2007/03/15(木) 20:53:58length()
0505デフォルトの名無しさん
2007/03/15(木) 20:55:49整数じゃないのかよ元は
0506デフォルトの名無しさん
2007/03/15(木) 20:59:47どうもありがとう。
0507デフォルトの名無しさん
2007/03/15(木) 21:00:140508デフォルトの名無しさん
2007/03/15(木) 21:05:31ただしその場合、質問者は必ず、出身地を書きましょう
0509デフォルトの名無しさん
2007/03/15(木) 21:28:270510デフォルトの名無しさん
2007/03/15(木) 21:56:27unsigned char * と System::String^ (#include<string.h>)
この二つをお互い変換する方法を教えていただきたいです
0511デフォルトの名無しさん
2007/03/15(木) 22:02:19マネージドC++向けの記事だが、たとえC++/CLIでも構文が違うだけで中身は通用する。
0512デフォルトの名無しさん
2007/03/15(木) 22:05:37abcde
という文字列があるとして、左から4番目・dを取り出すのはどうすればよいですか?
0513デフォルトの名無しさん
2007/03/15(木) 22:11:080514デフォルトの名無しさん
2007/03/15(木) 22:11:420515デフォルトの名無しさん
2007/03/15(木) 22:14:33いまいちわからないのですが・・・
>>514
出身地?
一応東京ですけど・・・
もう少し詳しく教えて頂けませんか?
困ってるんです。
0516デフォルトの名無しさん
2007/03/15(木) 22:19:42あとは検索でもして勉強しろよ。20分で理解できるだろ。
0517デフォルトの名無しさん
2007/03/15(木) 22:25:37>>513の c=s[3]; がズバリ答えなんですか?
C++って一文字で書かれているのを見たことがなかったので
なにか省略されてるのかと誤解してました。すいませんでした。
0518デフォルトの名無しさん
2007/03/15(木) 22:45:44それ以前にコンパイル通らなくなるときがあるって。
Modern C++ Designあたりに書いてなかったかな〜
0520デフォルトの名無しさん
2007/03/15(木) 23:49:55>>496
ちょっと時間かかってしまいましたが、
文字コード変換できました!
まだ、あんまり理解できて無いですが
ネットで検索して勉強します。
どうもありがとうございました。
ほんと助かりました。
0521デフォルトの名無しさん
2007/03/16(金) 00:53:20もはやModernでもなんでもない本を持ち出してきてもらっても困る。
どういう時だ?
0522デフォルトの名無しさん
2007/03/16(金) 01:50:540523デフォルトの名無しさん
2007/03/16(金) 06:20:04遅いけどexじゃない方はハンドルを自動で閉じるのでWaitFor〜を使うべきではありません
すでに終了しているスレッドハンドルに対してWaitForSingleObject(hoge,INFINITE)
するとずっと戻ってこなかったりします
昔はまったことがあったんだけど今見てみたらMSDNにも書いてありますね
0524デフォルトの名無しさん
2007/03/16(金) 07:36:44例えば
T hoge;
if(isIHogesChild(T)){
hoge.fun1();
}else{
hoge.fun2();
}
は
Tにfun1,fun2の両方が定義されてないとコンパイルエラー
0525デフォルトの名無しさん
2007/03/16(金) 07:40:110526デフォルトの名無しさん
2007/03/16(金) 08:35:42普通ifは使わないでしょ。
0527デフォルトの名無しさん
2007/03/16(金) 08:49:39普通ifは使わないでしょ。
0528デフォルトの名無しさん
2007/03/16(金) 09:22:12普通ifは使わないでしょ。 nullpo
0529デフォルトの名無しさん
2007/03/16(金) 09:57:05hoge.iniみたいな、設定ファイルがないのに
exeファイルをクリックして再起動しても、設定値を
保持してるアプリケーションを、良く見かけますが
あれはどうやるのでしょうか。
0530デフォルトの名無しさん
2007/03/16(金) 10:45:200531デフォルトの名無しさん
2007/03/16(金) 11:21:490532デフォルトの名無しさん
2007/03/16(金) 12:47:52レスありがとうございます。
インストールしてないソフトでも,設定値を保持しているので、
不思議だったんですが、そういう方法もあるんですね。
今は、自分で作るとき"hoge=hoge"(key=value)だけの形式でやっているので、
「getlineで一行ずつ読み込んで、std::map<std::string,std::string>に格納」
で簡単なんですが。
[hoge]
hoge=hoge
hoge=hoge
[hoge]
hoge=hoge
・・・
こういう設定ファイルの読み書きの方法解説してる
サイト無いでしょうか。
オープンソースのソフトなどのソース見て勉強しようと
思ってるんですが、ソースが膨大なのが多くて、
なかなか設定値の読み込んでる部分を、探し当てること出来ません。
([]の部分の名前,key値,value値)構造体に格納していくのかと思ったんですが、
読み込みも書き込みも、なんだか難しいです。
0533532
2007/03/16(金) 15:27:28struct inistruct{
char* section; //[]の値
std::map<std::string,std::string> map;
};
struct inistruct *p = new inistruct[length];
//iniファイルを読み込んで、pに格納
//もし、特定のsectionの値を取り出したい場合
for(int i=0;i< length;i++){
//もし、特定のsection="hoge"の値を参照したい場合
if(strcmp(p[i].section,"hoge")==0 ){
//p[i].mapから、値を取り出す
break;
}else{
continue;
}
}
こういう感じで、"読み取り"と"参照"できそうです。
あと、特定のsectionの中の値を一つ変更された場合の
設定ファイルに書き込む方法が、よくわかりません。
std::string str; //新しい設定ファイルの全文を格納
while(getline(fin,s)){
if(更新したいsectinじゃない or 更新したいmapじゃない){//ここもっと複雑かもです
str+=s;
}else{
str+="更新したい文字列";
}
}
こういう感じでしょうか。よろしくお願いします。
0534デフォルトの名無しさん
2007/03/16(金) 18:31:12http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpsysinf/html/_win32_getprivateprofilestring.asp
0535532
2007/03/16(金) 20:00:44GetPrivateProfileStringというキーワードで
いろいろと検索できそうです。
ピンときたので、作りかけのやつ完成させたいと思います。
どうもありがとうございました。
0536デフォルトの名無しさん
2007/03/16(金) 23:47:52環境はWindows2000以降(ただし可能なら9x系も)、C++のネイティブアプリケーション。
(1) MSのサイトによると、iniファイルは使うなと書いてありますが
少なくとも内部ツールや規模の小さなフリーウェア程度では、16ビット非対応でもまだiniファイル使っても問題ないのでしょうか?
(2) 最近はレジストリよりも、XML設定ファイルが普及しつつある気もしますが、
検索してもC#や.NET Framework向けの説明ばかりで、C++のネイティブアプリ向けの説明が見つかりません。
何か良さげなテキストを知ってたらお願いします。
0537デフォルトの名無しさん
2007/03/16(金) 23:54:53すくなくとも、exeと同じパスにiniを書くようなアプリを今から作るのはどーかなー。
0538デフォルトの名無しさん
2007/03/16(金) 23:56:540539536
2007/03/17(土) 00:08:44マジっすか…。
既存プログラムのアドオンとかも考えていたのですが、それだと今あるソースを変更しないとダメですね……。
0540デフォルトの名無しさん
2007/03/17(土) 00:11:510541デフォルトの名無しさん
2007/03/17(土) 01:17:000542デフォルトの名無しさん
2007/03/17(土) 01:32:230543デフォルトの名無しさん
2007/03/17(土) 02:02:55C++でXML設定ファイルを簡単に使う機能が用意されていない限り
このままini使ってた方が楽だな。
0544じゅん
2007/03/17(土) 02:24:430545デフォルトの名無しさん
2007/03/17(土) 02:51:020546デフォルトの名無しさん
2007/03/17(土) 02:52:40日本語でおk
0547デフォルトの名無しさん
2007/03/17(土) 08:21:56Store the string in character array 'charArray'.
Eliminate the quatation marks from the input stream.
Read a maximum of 50 characters.
標準入力から"characters"という文字列を読み込みなさい。
その文字列をcharArrayという文字列配列に入れなさい。
入力ストリームから二重引用符を取り除きなさい。
最大で50文字読みなさい。
…という問題なんだが
int charArray;
const int SIZE = 50;
char buffer[SIZE];
cout << "Type something surrounded by \'\" \"\': ";
cin.getline(buffer, SIZE);
while ((charArray = cin.get()) != '\"')
{
cout.put(charArray);
}
while ((charArray = cin.get()) != '\"')
{
cout.put(charArray);
}
cout << endl;
こういう解でいいのかね?
0548デフォルトの名無しさん
2007/03/17(土) 08:24:14こんにちは、UTF-32(sizeof(int)が4であるならば)の文字コードを操る世界の人
0549547 続き
2007/03/17(土) 08:24:17##################################################
Type something surrounded by '" "': "characters"
characters
Press any key to continue . . .
##################################################
他にもっとスマートな方法がある気がしてならんのだがどうでしょう?
0550デフォルトの名無しさん
2007/03/17(土) 11:12:30intの配列にする必要は無いだろうというのが、>548の主張だ。
0551デフォルトの名無しさん
2007/03/17(土) 11:14:120552デフォルトの名無しさん
2007/03/17(土) 11:15:110553デフォルトの名無しさん
2007/03/17(土) 11:30:08それも引っ掛かってたんだよ。
だから、ここで質問してるわけなんだけど。
てか、このテキストに載ってる方法だとそれが唯一の方法に見えるんだ。
で、肝心のchar charArray[SIZE]と宣言した場合はどうやればいいの?
0554デフォルトの名無しさん
2007/03/17(土) 11:58:52Boost.Serializationは設定ファイルくらいならそう面倒なく使えると思う。
0555デフォルトの名無しさん
2007/03/17(土) 12:03:53詳しく
0556デフォルトの名無しさん
2007/03/17(土) 12:17:270557デフォルトの名無しさん
2007/03/17(土) 12:39:52書いた通りそのまんまだが
今読んでるテキスト"C++ How To Program"には
区切り文字を指定して文字を読み込む方法はこれだけしか載ってない。
だから、intで宣言してるのはおかしいけどあれを使うしかなかった。
結果的には一応正しい出力になってる、でもなんか引っ掛かる。
俺的には「"」が見つかったときは読み込まずにスキップして後は全部読み込む、
みたいなアルゴリズムが浮かんでる。
そ・こ・で、ここの住人の力が必要なんだが…。
0558デフォルトの名無しさん
2007/03/17(土) 12:43:59> でもなんか引っ掛かる
それを説明しないと質問が成り立たないだろう。
エスパー募集なら他所でやれ。
0559デフォルトの名無しさん
2007/03/17(土) 12:55:42じゃ、箇条書きで。(というか、こんな説明しなくても回答できるはずだが…)
�@文字列をcharArrayという文字列配列に入れろ、という指示があるのにintで宣言している
�A例えば、この入力が"character"ではなく""cha"r""ac"ter"みたいに「"」が任意の数で入ってる場合でも
きちんと読めるべきでは、と思っている(←確かに指示には書いてないが気になる)
という二点です。
そろそろ回答の方をよろしくお願いしますよ。
0560デフォルトの名無しさん
2007/03/17(土) 13:02:362. 1文字ずつサーチすりゃいいじゃん
0561デフォルトの名無しさん
2007/03/17(土) 13:05:10それを具体的に教えてください、どの関数を使うかなどでいいですから。
0562デフォルトの名無しさん
2007/03/17(土) 13:14:15最初からそれを聞けばよかったのに
0563デフォルトの名無しさん
2007/03/17(土) 13:16:53いやいや、最初からそう聞いてます。
つらつらと説明してきましたけど
>>547の問題読んだだけで「俺ならこうやるな」って
回答がくれば即解決のはずなんですが…。
0564デフォルトの名無しさん
2007/03/17(土) 13:19:46てーか、何か根本的に間違ってないかい?
標準入力からcharArrayに入れるんだろ?
なら char charArray[SIZE]; と宣言して
cin.getline(charArray, SIZE); とするべきだろ。
(詳しい仕様は忘れたので終端文字については考えてない)
そして「そこ」から引用符を取り除くという話なんじゃないの?
>>547のコードじゃ何がしたいのかイマイチ分からん。
0565デフォルトの名無しさん
2007/03/17(土) 13:21:53プログラム書いて欲しいなら最初からそういえば言えばいいのに。
宿題スレあたりで頼めばいいんじゃね?
0566デフォルトの名無しさん
2007/03/17(土) 13:23:36決して周りの人間の理解力や洞察力が足りないからじゃない、
お前に説明能力が足りないからだよ。
そこんとこ分かっていないと損するよ。他の誰でもないお前が。
多分お前よりは(無駄に)長く生きてきた俺からの真面目な忠告。
0567デフォルトの名無しさん
2007/03/17(土) 13:23:53こっちでやれ。
0568デフォルトの名無しさん
2007/03/17(土) 13:27:05iniに比べてXMLは面倒だよ。
世間でXMLが騒がれているとかiniが推奨されていないとかで
わざわざ面倒な方法で実装するようにしなければいけないなんて納得いかない。
一つ一つNodeを辿るのではなく1つのXPathで指定したり
自分でサブルーチン作ったりして何とかするけど
みんなどうしてんのか?
このパラメタがなかったらエラーだが
このパラメタがなかったらデフォルト知を使うとか
ころころ追加や削除も容易であってほしいところだし。
MSXMLはBSTRやvariant型でATLテンプレートがなかったら地獄だぜ
って感じている。
0569デフォルトの名無しさん
2007/03/17(土) 13:27:07そこまでは思いついたんですよ。
でも、さっきも書いた通り、
このテキストには指定した区切り文字だけ取り除く方法が
while ((charArray = cin.get()) != '\"')
{
cout.put(charArray);
}
しか載ってないんですよ。
だからbuffer[SIZE]と組み合わせたんです。
で、その方法だと肝心の二重引用符はどのようにして取り除くんですか?
0570デフォルトの名無しさん
2007/03/17(土) 13:28:11ここまで時間かけたんですからここでお願いしますよ。
もう五時間ですよ?
0571デフォルトの名無しさん
2007/03/17(土) 13:29:22「え、自分でテキスト読んでやってんの?なら宿題じゃないじゃん」って書かれた経験あり。
0572デフォルトの名無しさん
2007/03/17(土) 13:33:27なんでテキストに載ってる方法しか使っちゃいけないの?
0573デフォルトの名無しさん
2007/03/17(土) 13:34:26他の方法を知らないからですよ
0574デフォルトの名無しさん
2007/03/17(土) 13:36:310575デフォルトの名無しさん
2007/03/17(土) 13:36:39もっとまともなのを探せばいいだろうに。
0576デフォルトの名無しさん
2007/03/17(土) 13:37:16そりゃ、普通は勉強のためにテキスト読んでるんなら、
人にコード書いてもらおうなんてのは本末転倒だからな。
0577デフォルトの名無しさん
2007/03/17(土) 13:37:550578デフォルトの名無しさん
2007/03/17(土) 13:38:59いや。割と迷惑。
0579デフォルトの名無しさん
2007/03/17(土) 13:39:20それこのスレの意義を否定してるぞ
0580デフォルトの名無しさん
2007/03/17(土) 13:39:20int counter=0;
char output[SIZE];
for(int i=0; i<SIZE; i++)
if(charArray[i]!='\"')
output[counter++]=charArray[i];
これで解決。
0581デフォルトの名無しさん
2007/03/17(土) 13:39:230582デフォルトの名無しさん
2007/03/17(土) 13:39:55がんばれ!
途中参加の俺には何が何だかさっぱりわからないけどさ
0584デフォルトの名無しさん
2007/03/17(土) 13:42:25死ね、マジで死ね
おまいなんか生きる資格ねぇよカス
0585デフォルトの名無しさん
2007/03/17(土) 13:44:09だれが書いたか知らないけどそんなこというなよ
0586デフォルトの名無しさん
2007/03/17(土) 13:44:34「調べる=人に聞く」だとでも思ってるの?
0587デフォルトの名無しさん
2007/03/17(土) 13:45:190588デフォルトの名無しさん
2007/03/17(土) 13:45:54>>547は自分でコード書いてどうですかって聞いてるんだから
それから調べるキーワードくらい教えてやってもよかったんじゃないか?
0589デフォルトの名無しさん
2007/03/17(土) 13:46:35原文もついてる訳だから読めなかった回答者が悪い
0590デフォルトの名無しさん
2007/03/17(土) 13:46:480591デフォルトの名無しさん
2007/03/17(土) 13:47:26それなら早く言ってあげればよかったのによくもまあネチネチと
0592デフォルトの名無しさん
2007/03/17(土) 13:48:130593デフォルトの名無しさん
2007/03/17(土) 13:48:130594デフォルトの名無しさん
2007/03/17(土) 13:48:490595デフォルトの名無しさん
2007/03/17(土) 13:50:50よかったね
0596デフォルトの名無しさん
2007/03/17(土) 13:51:26そうは言っても元のコードが iostream 使ってるんだから
そこから調べたらいくらでも情報が出てくるはずだろ。
模範解答らしい >580 にはキーワードを足す必要があるものは
一個も無いし。その後の流れを見ても質問者がとんでもなく
アホだったとしか考えられない。
0597デフォルトの名無しさん
2007/03/17(土) 13:53:25じゃ、そのiostream使ってるんだから、のくだりを書いてやれよ
自分が初心者だった頃は泣きついてたくせに
0598デフォルトの名無しさん
2007/03/17(土) 13:55:27そのいくらでも情報が出てくるから困るんだろが
電話帳渡されて583-1723見つけろって言われて見つけられるかおまえ?
お前が言ってるのはそういうこと
0599デフォルトの名無しさん
2007/03/17(土) 13:56:36まぁいきなり全部理解しようとせずに少しずつ順番に使うようにすると
勝手に手が動くようになってるけど
0600デフォルトの名無しさん
2007/03/17(土) 13:57:16「くだり」って、「〜調べたらいくらでも情報が出てくるはずだろ」って書けばよかったのか?
言ってることは >577 と同じなんだが。
0601デフォルトの名無しさん
2007/03/17(土) 13:58:59電話帳は番号で検索できないが Web はキーワードで検索できる。全然違うな。
0602デフォルトの名無しさん
2007/03/17(土) 13:59:10本のコピペでプログラムを作ろうとしているのか。
俺はiostreamに詳しくないのだ。
質問者が何処まで知っていて何を知らないのか判らないから
回答が難しいよね。
まだ5時間しかやってないのか。
これにこりずに続けろよ。
0603デフォルトの名無しさん
2007/03/17(土) 14:01:300604デフォルトの名無しさん
2007/03/17(土) 14:02:32ほっとけ
0605デフォルトの名無しさん
2007/03/17(土) 14:04:130606デフォルトの名無しさん
2007/03/17(土) 14:05:370607デフォルトの名無しさん
2007/03/17(土) 14:06:430608デフォルトの名無しさん
2007/03/17(土) 14:07:310609デフォルトの名無しさん
2007/03/17(土) 14:34:42俺からは>>586は無事なんだが
>>586の子供がいじめられて自殺するように呪っとくわ
それくらい悪質だな
0610デフォルトの名無しさん
2007/03/17(土) 14:57:190611デフォルトの名無しさん
2007/03/17(土) 15:12:51なんつーか、行き詰まっているのに妙に自信過剰というか、
変な意地が見え隠れするのが気になった。
真面目なのは確かなんだろうけど、それは必ずしも
皆から受け容れられるということを保証してはくれないわけでさ。
自分も相手も匿名のこの場でこういう経験しておけたのは
長い目で見ればプラスなんじゃないのかなぁと思ってみたり。
0612デフォルトの名無しさん
2007/03/17(土) 15:20:010613デフォルトの名無しさん
2007/03/17(土) 15:40:57運が悪かっただけだよ。
2ちゃんねるが@IT会議室みたいにはなって欲しくない。
0614デフォルトの名無しさん
2007/03/17(土) 16:14:050615デフォルトの名無しさん
2007/03/17(土) 16:30:080616デフォルトの名無しさん
2007/03/17(土) 16:46:26そんなに暇なのか?
>>547なら、こんなもんでいいだろ。
#include <iostream>
int main()
{
int i, c;
char charArray[51];
std::streambuf *sb = std::cin.rdbuf();
if ((c = sb->sbumpc()) != '"')
return 1;
for (i = 0; i < 50 && (c = sb->sbumpc()) >= 0 && c != '"'; )
charArray[i++] = static_cast<char>(c);
charArray[i++] = '\n';
std::cout.rdbuf()->sputn(charArray, i);
return 0;
}
0617デフォルトの名無しさん
2007/03/17(土) 16:54:16C初心者は歓迎だがネット初心者や2ch初心者は帰れ
0618デフォルトの名無しさん
2007/03/17(土) 17:01:26#include <stdio.h>
int main()
{
char charArray[51];
if (scanf("\"%50[^\"]\"", charArray) != 1)
return 1;
puts(charArray);
return 0;
}
0619デフォルトの名無しさん
2007/03/17(土) 17:17:29最初と最後にしか出てこないんだな
0620デフォルトの名無しさん
2007/03/17(土) 17:19:39Read a string of the form "characters"
0621デフォルトの名無しさん
2007/03/17(土) 17:54:39一般的なC++におけるDebugビルド用のマクロって何か決まっていますか?
_DEBUGってのは Visual C++用みたいですが・・・
自分で勝手にマクロ決めていいもんなんですかねえ
0622デフォルトの名無しさん
2007/03/17(土) 17:56:240623デフォルトの名無しさん
2007/03/17(土) 17:57:32まぁ無難に、DEBUGで委員ジャマイカ。
0624デフォルトの名無しさん
2007/03/17(土) 18:21:13リリースビルド時に NDEBUG 定義するから NDEBUG 定義されてないときがデバッグビルド。
0625デフォルトの名無しさん
2007/03/17(土) 20:07:57それとも規格で決まってるの?
0626デフォルトの名無しさん
2007/03/17(土) 21:00:440627625
2007/03/17(土) 22:01:11どんな環境でも安心して使えるんだね。
0628デフォルトの名無しさん
2007/03/18(日) 00:06:17どんな環境でも安心して使えるということにはならん
0629デフォルトの名無しさん
2007/03/18(日) 00:18:410630デフォルトの名無しさん
2007/03/18(日) 00:25:28読み込んだり計算したりして出した
正の整数値分の配列を宣言したいのですが
取り方がわからないので教えていただきたいです
unsigned int a;
char buf[10] = "231";
a = atoi( buf );
こんな感じで a を取っていたとき
a の大きさ分だけもった b 配列をつくることってできないでしょうか?
/*---------------------
const unsigned int c = 231;
int d[c];
-----------------------*/
気分的に(笑)上の様な感じで
int b[a];
と宣言してしまうと
定数式が必要です。 とか
サイズが 0 の配列を割り当てまたは宣言しようとしました。 とか
'b' : サイズが不明です。 とか怒られてしまいます・・・
0631デフォルトの名無しさん
2007/03/18(日) 00:38:02int *d = malloc(c);
こんなかんじ?
0632デフォルトの名無しさん
2007/03/18(日) 00:42:17int* b = new int[a];
使い終わったら delete b[];
0633デフォルトの名無しさん
2007/03/18(日) 00:43:05でしょうがぁぁぁあああ!!!
0634デフォルトの名無しさん
2007/03/18(日) 00:44:07boost::shared_ptr しか使ってないからもう忘れました><
0635630
2007/03/18(日) 00:54:35ありがとうございます
0636デフォルトの名無しさん
2007/03/18(日) 01:18:400637デフォルトの名無しさん
2007/03/18(日) 01:19:430638デフォルトの名無しさん
2007/03/18(日) 01:22:09shared_array があるじゃん
0639デフォルトの名無しさん
2007/03/18(日) 06:54:25たぶんこんな感じ
namespace bll = boost::lambda;
boost::shared_ptr<int> hoge(new int[42], bll::bind(bll::delete_array, bll::_1));
0640デフォルトの名無しさん
2007/03/18(日) 08:00:390641デフォルトの名無しさん
2007/03/18(日) 08:30:550642デフォルトの名無しさん
2007/03/18(日) 08:32:24早くシャーベットを食べるんだ。
0643デフォルトの名無しさん
2007/03/18(日) 13:34:060644デフォルトの名無しさん
2007/03/18(日) 23:56:17引数を反復子(ポインタ)にして
template<class Ran>
double average(const Ran& begin, const Ran& end){ (略) }
と定義したのですが、関数呼び出し部分で
double av_arr[] = {10, 20, 30, 10};
size_t av_arr_size = sizeof(av_arr) / sizeof(*av_arr);
double x = average(av_arr, av_arr + av_arr_size);
としたところ、
「テンプレート のパラメータ 'Ran' があいまいです。
'double *' の可能性があります。または 'double [4]'」
とコンパイラ(VC2005)にダメ出しされてしまいます。
average(av_arr + 0, av_arr + av_arr_size);
とすれば共にポインタとして認識してくれるようですが、
読んだ本には、「配列の名前を添え字なしで使うと配列の先頭のポインタが渡される」と書いていたので、
元のままだと何が悪いのかよくわかりません。
"double [4]"って何の型?? みたいな話もあるんですが、
解説とスマートな解決策をご教授願えれば幸いです。
0645デフォルトの名無しさん
2007/03/19(月) 00:04:28double av_arr[4];
確かに av_arr と &av_arr[0] は、
同じ値になるけど
型としては別のものだよ。
ちょっとややこしいね。
0646デフォルトの名無しさん
2007/03/19(月) 00:07:06template<class Ran>
double average(Ran begin, Ran end);
エラーメッセージによると、
double average<double*>(double* const& begin, double* const& end);
double average<double [4]>(double const (&begin)[4], double const (&end)[4]);
のどちらか決めかねるようだけど、1つめの引数がどっちでも
マッチしてしまうからエラーになるんだと思う。
テンプレート引数の推測時には配列はまだ配列のまま。
読んだ本は C の本か、 C++ でも入門書あたりだろう。
0647デフォルトの名無しさん
2007/03/19(月) 00:10:12double av_arr[] = {10, 20, 30, 10};
において、av_arrは、'double [4]'という型ですよ。
もしav_arrが'double *'という型だと
size_t av_arr_size = sizeof(av_arr) / sizeof(*av_arr);
は、sizeof(double *) / sizeof(double);
になっちゃうよ。
0648デフォルトの名無しさん
2007/03/19(月) 00:31:57ご丁寧な解説、痛み入ります。
おかげさまで、理解に至りました。ありがとうございます。
お察しの通り、読んでいるのはC++の入門書ですね、はい。
精進いたします。
0649デフォルトの名無しさん
2007/03/19(月) 01:13:27デストラクタは作った順とは逆の順番で呼び出されるようですが
これに依存するような、オブジェクト間の依存関係を作ったりしてもOKなんでしょうか?
0650デフォルトの名無しさん
2007/03/19(月) 12:20:290651デフォルトの名無しさん
2007/03/19(月) 12:22:510652デフォルトの名無しさん
2007/03/19(月) 21:19:450653デフォルトの名無しさん
2007/03/19(月) 21:25:42そういう意味じゃないだろー。
0654デフォルトの名無しさん
2007/03/19(月) 21:57:370655デフォルトの名無しさん
2007/03/19(月) 22:01:17依存し合ってる場合とか。
そもそも、自動変数がスタックで実装されるかどうかなんて
規格で決まってないっしょ?
0656デフォルトの名無しさん
2007/03/19(月) 22:15:12kouza.hの6行目で「宣言の構文エラー」と表示されます。
1ファイルにまとめれば正常にコンパイルされるのですが、どういった問題があるのでしょうか?
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3759.zip
ソースはこれです。
0657デフォルトの名無しさん
2007/03/19(月) 22:48:300658デフォルトの名無しさん
2007/03/19(月) 22:51:13kouza.cppとmain.cpp両方で、多重対策してないkouza.hをインクルードしてるせいで多重定義になってるだけじゃないの?
0659デフォルトの名無しさん
2007/03/19(月) 22:58:24オブジェクトA・B・CとプッシュされたものはC・B・Aと取り出される
プログラムの関数もスタックを使って実装されてる
0660デフォルトの名無しさん
2007/03/19(月) 23:42:22LFが挿入されているのをよく見掛けるんですが
これってどういう意味があるんですか?
void hoge(int piyo)
{
}
^L
みたいな感じ
0661デフォルトの名無しさん
2007/03/19(月) 23:44:44文字コードの違う環境でいじったんじゃね?
0662デフォルトの名無しさん
2007/03/20(火) 00:22:40LF(^J)なら必ず入るだろ、改行コードだから。
FF(^L)なら改ページコードとして入れるという習慣が一部にあるらしい。
プリンタに出力したときに関数単位で出力されることを期待しているのだろう。
0663656
2007/03/20(火) 00:33:27kouza.cppの中身(「#include"kouza.h」以外")をkouza.hに移して試してみたのですが、
依然エラーは消えないままです。
main.cppの方に移しても同様なので、原因は別のところにありそうです。
0664デフォルトの名無しさん
2007/03/20(火) 00:42:400665656
2007/03/20(火) 02:05:14Cpadでコンパイル時パラメータの欄に
main.cpp kouza.cpp kouza.h
と入力した状態でコンパイルしています。
0666デフォルトの名無しさん
2007/03/20(火) 03:16:34Cpadは使った事無いけど、ヘッダーファイル(kouza.h)も指定しないといけないの?
Visual C++ 2005EEとg++ 4.1.2で普通にコンパイル通ったよ。
0667デフォルトの名無しさん
2007/03/20(火) 06:37:45CPadってBorlandC++Compilerだけだっけ?
↑なら
bcc32 main.cpp kouza.cpp で正常にコンパイルできたけど
0668デフォルトの名無しさん
2007/03/20(火) 06:50:51kouza.h kouza.cpp main.cpp とか
0669デフォルトの名無しさん
2007/03/20(火) 07:16:510670デフォルトの名無しさん
2007/03/20(火) 07:25:43そんなことしても多重対策にはならんわいw
0671656
2007/03/20(火) 15:43:42>>666
kouza.hを外したらコンパイルが通りました。
以前にヘッダも指定した時はたまたま上手くいったので、
それが正しいと思い込んでしまっていました。
>>670
kouza.cppの中身を移してkouza.hとmain.cppだけをコンパイルすれば
対策ではなく、そもそも多重定義が起こらないと思ったのですが・・・
何か自分が勘違いしてるかもしれません。申し訳ないです。
0672デフォルトの名無しさん
2007/03/20(火) 16:02:45^LはFFなんだね.首でも吊ってくるよ
勉強になった �dクス
0673デフォルトの名無しさん
2007/03/20(火) 23:31:41久しぶりに職場にお泊りしてしまった
遅くなったけど、ありがとう
0674デフォルトの名無しさん
2007/03/21(水) 15:21:56outlookで、メール送信することできるでしょうか?
APIかコマンドラインから使うことできれば、便利なんですが。
よろしくお願いします。
0675デフォルトの名無しさん
2007/03/21(水) 15:24:56OfficeのOutlookなら、VBAでできるかやってみろ。
それでできたらC++でもできる。
0676デフォルトの名無しさん
2007/03/21(水) 17:26:27レス感謝です。
検索して、しらべてみます。
0677デフォルトの名無しさん
2007/03/21(水) 18:05:11メーラーを外部から操作するためのMAPIというAPIがあり、Outlookは
対応しているが、ある時点で(XPのSP2だったかな?)、セキュリティ絡みで
非常に強い制限が課せられるようになったはず。
送信が許可されてたかどうか。
0678デフォルトの名無しさん
2007/03/22(木) 17:20:23そのまた逆にする場合はどうしたらいいでしょうか?
ググッたんですがJavaやC#は見つかったんですけれども
C++が見つからなくて
初心者の質問で済みません
0679デフォルトの名無しさん
2007/03/22(木) 17:22:500680デフォルトの名無しさん
2007/03/22(木) 17:27:08そうすると今使ってる
byteはwinやTurbo C++の環境なのかな...orz
もうちょっと調べてみます
0681デフォルトの名無しさん
2007/03/22(木) 17:33:12castすればいい。もちろんcastの動作を理解した上でやってね。
0682デフォルトの名無しさん
2007/03/22(木) 17:42:530683デフォルトの名無しさん
2007/03/22(木) 17:43:22勉強しながらやってみます
0684デフォルトの名無しさん
2007/03/22(木) 18:02:02charはコンパイラによって符号ありだったりなしだったりするが
BYTEは大抵は符号なしcharのtypedef
byteはシラネ
0685デフォルトの名無しさん
2007/03/22(木) 18:47:47static_cast
おそらくbyte→intのように、扱える範囲が広くなるほうへは使わなくても平気。
Cとの互換を保つため実は狭くなる方へもキャスト無しで行けるが、キャスト使っておけ。
エラーにできないもんだから、みんな警告を出す。
0686デフォルトの名無しさん
2007/03/22(木) 19:20:44やってみます
0687デフォルトの名無しさん
2007/03/23(金) 05:44:57tableと言う配列があったとして
ループ部分で、前の値を計算式に含める場合。スマートな方法は無いのでしょうか?
具体的には
int table[128],res[128];
for(int i=0; i<128; i++){
res[i]=table[i-1]*5;
}
こういった式の事です。
このままでは、1回目のi=0の時に負の値が添え字に与えられてしまいます。
int i=1だと、res[i-1]としなければならず、なんとも気持ちが悪いものです。
一般的にはこのようなループはどのように対処するものなのでしょうか?イディオム的なものはあるのでしょうか?
0688デフォルトの名無しさん
2007/03/23(金) 05:51:26res[0]には何入れるの?
0689デフォルトの名無しさん
2007/03/23(金) 06:19:26int * dest = &res[0] ;
int * src = table[-1] ;
for ( ; dest != &res[128] ; ++dest, ++src )
{ *dest = *src * 5 ; }
あるいは、
std::copy( &table[-1], &table[127], &res[0] ) ;
>>688
悪魔が入ります。
0690デフォルトの名無しさん
2007/03/23(金) 07:31:31> int * src = table[-1];
おまえ正気かいな
0691デフォルトの名無しさん
2007/03/23(金) 07:37:29それ何の解決にもなってないだろ
0692デフォルトの名無しさん
2007/03/23(金) 08:28:34>res[i-1]
結局行き着くのはここ
それで気持ちが悪いとか言ってたらC/C++なんてやってらんねぇよ
>>689
そんなにアクセス違反とか領域破壊とかしたいのかおまいはw
0693デフォルトの名無しさん
2007/03/23(金) 13:44:090694デフォルトの名無しさん
2007/03/23(金) 17:51:14res[i-1] はコンパイラによって (res-1)[i] みたいに
なることが多いので気持悪く思う必要はない。最初から
(res-1)[i] とも書けるけどこれは規約違反。
0695デフォルトの名無しさん
2007/03/23(金) 19:41:220696デフォルトの名無しさん
2007/03/23(金) 20:06:10(res-1)[i] <-> *(res-1+i) <-> res[i-1]
resがポインタ型なら常にこれらは等価。
規格にもなんら違反していない。
0697デフォルトの名無しさん
2007/03/23(金) 20:19:320698デフォルトの名無しさん
2007/03/23(金) 20:30:38>>694はポインタ同士の演算(減算を除く)が不正であることと
混同してるんじゃないか?
0699デフォルトの名無しさん
2007/03/23(金) 21:41:50for( int i=1; i<128; i++){
res[ i - 1 ]=table[ i ]*5;
}
じゃダメなの?
0700デフォルトの名無しさん
2007/03/23(金) 21:57:260701デフォルトの名無しさん
2007/03/23(金) 22:03:48さすがにそんなコードは書かないけど、
C言語におけるポインタとはどういうものかを知るには
素晴らしい例だと思う
0702デフォルトの名無しさん
2007/03/23(金) 22:09:57の解説キボンウ
0703デフォルトの名無しさん
2007/03/23(金) 22:13:46(resが指し示すアドレス)と(添え字=この場合ならi-1)
との単なる加算を行い、そのアドレスが保持している値を返す。
数字が前に来ようが後に来ようが両方に来ようが
加算の結果は変わらないので指し示すアドレスも変わらず、
よって問題は起こらないと
0704デフォルトの名無しさん
2007/03/23(金) 22:14:01解説面倒だからポインタがなんであるかの勉強してこい
0705デフォルトの名無しさん
2007/03/23(金) 22:15:49a, bの片方がポインタ型で他方が整数型である場合、a[b] は *(a+b) に等しい。
0706デフォルトの名無しさん
2007/03/23(金) 22:18:12(-1 + i)[res] ⇔ *(-1 + i + res) ⇔ *(res + -1 + i) ⇔ res[-1 + i] ⇔ res[i - 1]
これ書いていて思い出した。CもC++も規格では
配列の先頭要素〜最後の要素を1つ越えたところの範囲外を指すポインタの存在すると
プログラムの挙動が未定義になる。694が規約違反と言っているのはこのことだ。
http://www.kouno.jp/home/c_faq/c6.html#17
0707デフォルトの名無しさん
2007/03/23(金) 22:19:56解説あんがとさんでした
0708デフォルトの名無しさん
2007/03/23(金) 22:55:030709デフォルトの名無しさん
2007/03/23(金) 22:56:420710デフォルトの名無しさん
2007/03/23(金) 23:01:17VC++EE
0711デフォルトの名無しさん
2007/03/23(金) 23:01:44なるほど。C FAQをもう一度読み直すとするか…。
0712デフォルトの名無しさん
2007/03/24(土) 01:23:19目にガッしていいの?
目にガッって、やっていいの?
BCC
0713デフォルトの名無しさん
2007/03/24(土) 01:24:49どうでもいいけど日本語がおかしい。
0714デフォルトの名無しさん
2007/03/24(土) 01:41:55#流石にga["NULLPO"]とはしないけど。
0715デフォルトの名無しさん
2007/03/24(土) 01:48:48最初は反応してくれる人が居たけど、最近は誰も反応してくれなくなった。
いいかげん、次のネタを考えんといかん。
0716デフォルトの名無しさん
2007/03/24(土) 02:17:01コンパイルすると「外部シンボル”○○(自分で定義した関数)”が未解決です」
ってでるんですが、俺はどうしたらいいですか?
0717デフォルトの名無しさん
2007/03/24(土) 02:18:23コンパイラエンジンの使い方を勉強すればいいと思います。
0718デフォルトの名無しさん
2007/03/24(土) 02:27:23コンパイルだけじゃなくてリンクまでやっちゃってるから。
それはリンカが出してるエラーメッセージ。
0719デフォルトの名無しさん
2007/03/24(土) 03:13:58メンバ変数の末尾に"_"をつけているソースをよく見ますが、
これはシステムが利用している変数名とは被らないのでしょうか?
自分で調べたところ、_xや__xや_x_はダメだという記述は
見られましたが、x_に関しての記述はなかったもので。
0720716
2007/03/24(土) 03:20:22こんな質問に答えてくれてありがとうです。
このエラーを解決するにはどうすればいいですか?
一通りググってみたけど、いまいち理解出来ませんでした。
質問ばかりですいません。
0721デフォルトの名無しさん
2007/03/24(土) 03:26:47末尾なら良いんでないでしょうか。
俺はアンダースコア(アンダーバー)で終わる変数名は
つけないけど。
0722デフォルトの名無しさん
2007/03/24(土) 03:29:57末尾についてるのは大丈夫。ただし C++ では末尾でも(途中も含めて)二重なのはダメ。
0723デフォルトの名無しさん
2007/03/24(土) 03:31:20○○が定義されているオブジェクトファイルもリンカに渡せ。
0724デフォルトの名無しさん
2007/03/24(土) 03:33:17まず、お前自身が自分がなにをやってるのか正確に理解する必要がある。
フツーのコンパイルなら一度に全てのソースをコンパイルしリンクを行う。
分割コンパイルの場合は一部のソースのコンパイルだけ行う。
リンクは全てのソースのコンパイルが完了している任意のタイミングで行う。
で、お前の今の状況だが、大きく二つのケースに分かれると思う。
ひとつはコンパイルだけ行えばいいタイミングでリンクまでやっている。
( 通常、コンパイラは"コンパイルのみを行う"という指示がない場合、勝手にリンクまでやっちゃう。 )
もうひとつはリンク時に必要な( ソースファイルをコンパイルして生成される )オブジェクトファイルが
全部そろってない、あるいはオブジェクトファイル自体はあるが、リンカに渡っていない。
0725デフォルトの名無しさん
2007/03/24(土) 03:36:07ヘッダで関数宣言だけしてあるけど、
中身の定義が見つからんてことだよ
0726716
2007/03/24(土) 03:59:33取り敢えずもう少し勉強してみます。
こんな時間におさがわせしました
0727デフォルトの名無しさん
2007/03/24(土) 04:01:150728デフォルトの名無しさん
2007/03/24(土) 04:15:14具体的にどんな環境でどんなふうにコンパイルしてるのか、詳しく教えてくれれば
多分、ちょっとしたことでうまくいく問題だぞ。
0730デフォルトの名無しさん
2007/03/24(土) 04:22:44また同じ #define をソ−スごとに書かないと駄目なの?
0731デフォルトの名無しさん
2007/03/24(土) 04:27:33プリプロセッサだもの、そりゃそうでしょ。
いっぱい書きたくなかったらヘッダに書けばおk。
0732デフォルトの名無しさん
2007/03/24(土) 04:28:340733デフォルトの名無しさん
2007/03/24(土) 04:32:25コンパイルオプションで指定するならソース上のどこにも書かなくていいよ。
0734デフォルトの名無しさん
2007/03/24(土) 04:34:19ヘッダに書いてインクルードさせれば使えるの?
0735デフォルトの名無しさん
2007/03/24(土) 05:04:18気張る必要はないよ
0736デフォルトの名無しさん
2007/03/24(土) 09:37:31それそのまんまマイクロソフトに言ってやれ
0737デフォルトの名無しさん
2007/03/24(土) 10:03:11msdnから抜粋しといた。必要ないから、俺は使ったこと無いけど
コマンド ラインで、オブジェクト ファイル FIRST.obj と SECOND.obj が作成される。
CL /c FIRST.C SECOND.C
実行可能ファイルを作成するには、LINK を呼び出す必要があります。
LINK firsti.obj second.obj /OUT:filename.exe
0738デフォルトの名無しさん
2007/03/24(土) 11:19:5710E13位の実数を扱いたいんですが、float型やdouble型で宣言しても
warning: integer constant is too large for "long" type
というエラーが出てしまいます。どうすれば解決できるでしょうか。
0739デフォルトの名無しさん
2007/03/24(土) 11:22:200740738
2007/03/24(土) 11:27:25float na;
long nb;
na = 100000000000;
nb = 1000000000;
0741デフォルトの名無しさん
2007/03/24(土) 11:29:050742デフォルトの名無しさん
2007/03/24(土) 11:30:28それはlongリテラルだもん
0743デフォルトの名無しさん
2007/03/24(土) 11:33:42小数点でも書いとけばいいんじゃないの
0744デフォルトの名無しさん
2007/03/24(土) 11:34:11longリテラルではなく浮動小数点リテラルとして認識させればいいだけ。
0745738
2007/03/24(土) 11:36:04代入するには
f[0] = 100000000000;
でいいんですか?
0746デフォルトの名無しさん
2007/03/24(土) 11:36:32na = 100000000000.0f;
つーか10E13ってそういうことか
てっきり0x10E13かと思ってたわ
0747デフォルトの名無しさん
2007/03/24(土) 11:40:24だからdoubleリテラルにするために小数点かeつけろよ
0748738
2007/03/24(土) 11:48:23f = 100000000000.;
としたら解決しました。ありがとうございます。
0749デフォルトの名無しさん
2007/03/24(土) 11:55:31-cオプション与えなければclでexeを直接生成できるよ。
cl -o foo.exe first.c second.c
でよい。
ま、普通は(Makefileを使うような場合は)-cオプションつきでobjを
作った後で結合するけどな。
0750デフォルトの名無しさん
2007/03/24(土) 12:18:510751デフォルトの名無しさん
2007/03/24(土) 12:25:29まあ、conio.hがある環境なら#includeしとけば使えると思うよ
0752デフォルトの名無しさん
2007/03/24(土) 12:34:29回答ありがとうございました
0753デフォルトの名無しさん
2007/03/24(土) 17:36:07#include <iostream>
BYTE A(const BYTE* a)
{ return a[0]; }
BYTE A(const PBYTE a)
{ return a[1]; }
int main() {
const BYTE a[] = { '0', '1', '2', '\0', };
/* */ BYTE b[] = { '0', '1', '2', '\0', };
std::cout << A(a) << A(b) << std::endl;
return 0;
}
このコードは 01 と表示するんですが、aとbが区別される理屈がわかりません
また、Aの定義からconstを取り除いた場合、同じBYTE*の関数としてあつかわれて
コンパイルエラーになるのに、constがあるとOKなのも理解できません
なぜこうなるんでしょうか?
0754デフォルトの名無しさん
2007/03/24(土) 17:48:28const BYTE* aはaの指す先がconstという意味。
BYTE* const aはaそのものがconstという意味。
それぞれ別の型として扱われるので多重定義できる。
仮引数そのものがconstかどうかは多重定義の解決の際に考慮されないので、
実質的にはA(const BYTE* a)とA(BYTE* a)の中からどちらのAを呼ぶかということになる。
main関数の中のAの呼出では、それぞれaとbの型に引数が最も合うAが選ばれたということ。
0755デフォルトの名無しさん
2007/03/24(土) 17:54:04int i;
const int c;
int *const pc;
const int* cp;
pc = &i; //エラー:pcはconstだから
cp = &c; //Ok
*pc = 0; //Ok
*cp = 0; //エラー:cpの指す先はconstだから
0756デフォルトの名無しさん
2007/03/24(土) 17:57:58うぉぉ すごく良くわかりました
> const PBYTEはBYTE* constになる。
これに気づけなかった。感激です
あとドルジっょぃ
0757デフォルトの名無しさん
2007/03/24(土) 18:15:44cont BYTE *
だから分かりにくいのであって
BYTE const * //上の型はこれ
BYTE * const
BYTE const * const
そもそもなんで、型の前にも後ろにも付けられるようにしたんだか。
後ろだけだったら、こんなに混乱しなかったはずなのに。
0758デフォルトの名無しさん
2007/03/24(土) 18:22:36C++の言語仕様は何でもあり
これがすべての混乱の元と言われている
0759デフォルトの名無しさん
2007/03/24(土) 18:30:57スキルのもった、何でも自分で出来る現場のおっさんが、好きなように出来るように作られたもの
それが出来ないなら、制限されたC♯で"安全な"プログラムを組めって事さ
0760デフォルトの名無しさん
2007/03/24(土) 18:35:28http://www.research.att.com/~bs/bs_faq2.html#constplacement
0761デフォルトの名無しさん
2007/03/24(土) 18:40:16これはC++だけではなく、基のCからそうだった。
0762デフォルトの名無しさん
2007/03/24(土) 18:50:53(const BYTE)←Aって感じでポインタのAがconst BYTEを指してますよーっ
て感じで直感的かもしれない気がしただけでしたごめんなしあ
0763デフォルトの名無しさん
2007/03/24(土) 18:51:13CはポインタとGOTOを制限すれば構造化プログラミングを
正常に行える。
オブジェクト指向言語でありながらポインタがある。この言語仕様で
自由にプログラマーがコーディングする他人が読めないコードに
なるのはむしろ必然
0764デフォルトの名無しさん
2007/03/24(土) 19:14:330765デフォルトの名無しさん
2007/03/24(土) 22:11:17初心者丸出しの発言乙w
0766デフォルトの名無しさん
2007/03/24(土) 22:23:510767デフォルトの名無しさん
2007/03/24(土) 22:25:490768デフォルトの名無しさん
2007/03/24(土) 22:28:47プログラムを複雑にするのは事実
フレームワークを言語に取り入れるのは大規模開発では常識となっている。
世界で活躍するプログラマになると実行速度・コードサイズ・可読性に優れた
コーディングを行っている。
他人が読めないコードは最悪のコーディングスタイルだ
0769デフォルトの名無しさん
2007/03/24(土) 22:33:570770デフォルトの名無しさん
2007/03/24(土) 22:38:530771デフォルトの名無しさん
2007/03/24(土) 22:40:33可読性はクラス設計を適切に行い、関数の粒度を均一にすることで実現
更に優秀なプログラマなら再利用可能なプログラム設計も行える。
0772デフォルトの名無しさん
2007/03/24(土) 23:05:56どれも出来ません。
0773デフォルトの名無しさん
2007/03/24(土) 23:06:22・適切に
・関数の粒度を均一にすること
・優秀なプログラマ
0774デフォルトの名無しさん
2007/03/24(土) 23:09:560775デフォルトの名無しさん
2007/03/24(土) 23:11:01まあ俺はgoto使っちまうがな
0776デフォルトの名無しさん
2007/03/24(土) 23:11:450777デフォルトの名無しさん
2007/03/24(土) 23:16:070778デフォルトの名無しさん
2007/03/24(土) 23:25:070779デフォルトの名無しさん
2007/03/24(土) 23:38:250780デフォルトの名無しさん
2007/03/24(土) 23:44:060781デフォルトの名無しさん
2007/03/24(土) 23:45:140782デフォルトの名無しさん
2007/03/25(日) 00:58:07多重ループからの離脱はgoto使うとむしろ可読性が良くなるから使うべきケース
0783デフォルトの名無しさん
2007/03/25(日) 01:23:560784デフォルトの名無しさん
2007/03/25(日) 01:27:33もちろん、ちょーやばい。宇宙並みにヤバイ。お前は絶対使うなよ! やばいから!
・・・俺は使うけど。
0785デフォルトの名無しさん
2007/03/25(日) 02:04:48悪用すると、gotoよりも可読性が悪くなる。
使わなくて済むのなら避けるべき。
0786デフォルトの名無しさん
2007/03/25(日) 02:44:480787デフォルトの名無しさん
2007/03/25(日) 10:25:08「使わざるを得ない」ものではなかろうか
0788デフォルトの名無しさん
2007/03/25(日) 12:41:010789デフォルトの名無しさん
2007/03/25(日) 16:35:02とある関数で、time(NULL)を種として乱数を発生させているのですが、
高速で繰り返し関数を呼び出しているため、同じ乱数が何度も発生してしまいます。
速度を落とさずこれを回避するには、どうすればよいでしょうか?
0790デフォルトの名無しさん
2007/03/25(日) 16:36:120791デフォルトの名無しさん
2007/03/25(日) 18:43:58このヘッダインクルードしたらこのヘッダもついてくるから
新しくヘッダつくるかそしたらこのヘッダインクルードしないといけないから
そしたらこのヘッダもついてくるからって
もう嫌になった
0792デフォルトの名無しさん
2007/03/25(日) 18:46:200793デフォルトの名無しさん
2007/03/25(日) 19:53:170794デフォルトの名無しさん
2007/03/25(日) 20:00:55それはただの対処法ってだけじゃないの?
0795デフォルトの名無しさん
2007/03/25(日) 20:04:530796デフォルトの名無しさん
2007/03/25(日) 20:09:15ただの対処法がダメならどうしろとw
>>795
そいつぁコンパイラを選ぶんじゃなかったか
0797デフォルトの名無しさん
2007/03/25(日) 20:14:56基本的に循環しないように分割の設計していかないと駄目だと思うのよね。
それが基本的に本当だと思うのよね。
ヘッダ1000個とかになって人間として難しいって時の対処法でインクルードガードがあるんだと思うんだよね。
0798デフォルトの名無しさん
2007/03/25(日) 20:32:57stdio.hやstdlib.h内でstddef.hをincludeするのは禁止で、かつ
ユーザーはstdio.hとstdlib.hの両方を使用するコードを書くべきではない
ということですよね?
0799デフォルトの名無しさん
2007/03/25(日) 20:46:450800デフォルトの名無しさん
2007/03/25(日) 20:48:24オブジェクトコードを1バイトでも軽くしたいとかコンパイルを1秒でも早く終わらせたいとか
そんな目標があるのか?
0801デフォルトの名無しさん
2007/03/25(日) 20:51:500802デフォルトの名無しさん
2007/03/25(日) 21:00:31>基本的に循環しないように分割の設計していかないと駄目だと思うのよね。
>それが基本的に本当だと思うのよね。
んなこたねーよ馬鹿。循環していなくても
同じ宣言・定義を2回読む危険性はあるだろ。
>>799
標準ライブラリもインクルードガードされているから大丈夫。ソース見れ。
>>800
#include <stdio.h>と何回も書くと
その分だけオブジェクトコードが増えるとでも思ってるのか?
時間は数ミリくらいは遅くなるだろうが。
0803デフォルトの名無しさん
2007/03/25(日) 21:11:19>>799は>>797理論について標準ライブラリも重複しないようにせにゃならんのかと言ってんじゃね?
0804デフォルトの名無しさん
2007/03/25(日) 23:18:38バカかお前ら。依存関係の事言ってんだよ
0805デフォルトの名無しさん
2007/03/25(日) 23:24:590806デフォルトの名無しさん
2007/03/25(日) 23:25:03http://www.kouno.jp/home/c_faq/c10.html#7
0807デフォルトの名無しさん
2007/03/25(日) 23:28:37無能
0808デフォルトの名無しさん
2007/03/25(日) 23:34:21borlandのコンパイラ及びmakeは、自動的に依存ファイルの更新をチェックする機能がある
(.objのコメントにincludeされたファイルと日付を含め、makeがそれをチェックする)
まあmakeにかかる時間が若干増えるが。
0809デフォルトの名無しさん
2007/03/26(月) 00:24:06Indian Hill スタイルガイドを策定したヤツは馬鹿ですか? 信じられん。
一度、#include を入れ子にしてないプログラムのメンテしたことあるけど地獄だったぞ。
0810デフォルトの名無しさん
2007/03/26(月) 02:43:27.cpp と .h のセットに記述されていた場合とか、
入れ子 #include が禁止だと非常に困る
0811デフォルトの名無しさん
2007/03/26(月) 05:27:27どういう状況かは知らないが、似たような経験がある。
とあるアプリのプラグインを開発していたんだけど、
アプリの仕様上、その機能が使われる度に毎回プラグインがロードされるので
static変数が使いにくいという状況だった。
そのときに色々と調べて見つかった方法が、
・シードをファイル等に書き込んでおく
・プラグインとは別にプロセスを立ち上げ、種を保持しておく
・ミリ秒ではなくマイクロ秒を種に与える
の3つだった。他にもあるかもしれない。
0812デフォルトの名無しさん
2007/03/26(月) 16:52:23ユニットテストでAPI呼出失敗を検証する為、
APIフックを行う必要があります。
いろいろ調べた結果、以下のHPにサンプルがありました。
ttp://ruffnex.oc.to/kenji/text/api_hook/
ttp://ruffnex.oc.to/kenji/text/api_hook/ex2.cpp
動作検証した所、フックは成功しました。
しかし、フック状態から元の状態に戻す方法がわかりませんでした。
(プログラムを終了すれば元の状態にもどりますが、そうではなく、任意のタイミングで戻したい)
どのようなコードを書けばよいのか、識者の方ご教授いただけませんでしょうか。
0813デフォルトの名無しさん
2007/03/26(月) 16:57:48そこのページに置いてある API_Hook.zip をちゃんと読めば分かるよ。
0814デフォルトの名無しさん
2007/03/26(月) 17:03:34http://pc11.2ch.net/test/read.cgi/tech/1174416295/l50
さらにいうなら親切にBBS用意してるんだからそっちで聞くほうがいいとおもうけどな
さらにいうならもう一個下のサンプルにはちゃんと実装されてるんだから
それぐらい調べてからでも遅くないと思うんだけどな
でもってReplaceIATEntryInAllModsの引数逆転させてみな
0815812
2007/03/26(月) 17:40:00>>814
レスありがとうございます。
ご指摘の通り、ソースを調べてから質問するべきでした。
また、スレ違いであることも、重ねてお詫びします。
申し訳ありませんでした。
0816デフォルトの名無しさん
2007/03/26(月) 18:34:00unsigned int a = 1;
a -= 2;
このとき、aの値がUINT_MAXになることは保障されているのでしょうか?
0817デフォルトの名無しさん
2007/03/26(月) 18:42:170818デフォルトの名無しさん
2007/03/26(月) 18:52:17整数オーバーフローが発生した場合の動作は未定義
そもそもUINT_MAX==2^(sizeof unsigned)-1である保証もない
0820デフォルトの名無しさん
2007/03/26(月) 19:31:05あれ、そうだっけ。
intとかの負数を含む型は、
オーバーフローは未定義だったのは規格で書いてあった覚えあるけど。
unsignedも未定義って書いてたっけ?
確か2^Nで余剰を取った結果になるって書いてたと思うけど。
0821デフォルトの名無しさん
2007/03/26(月) 21:09:16規格では、符号なし整数の演算結果が範囲外になったときは範囲内に収まるまで
(その型の最大値+1) を足したり引いたりした値になるとされている。 ISO C 6.3.1.3
これにより ((unsigned int)-1) は常に UINT_MAX に等しいと言える。
0822デフォルトの名無しさん
2007/03/26(月) 21:19:31単なる好みの問題だけど
0823デフォルトの名無しさん
2007/03/26(月) 21:21:05実際にプログラムに組み込むなよw
0824デフォルトの名無しさん
2007/03/26(月) 21:44:31それって保証されてるん?
0825デフォルトの名無しさん
2007/03/26(月) 22:00:58それを全ビット反転するわけだから -1 になると思うが
0826デフォルトの名無しさん
2007/03/26(月) 22:01:46int範囲で -1 になると思う
0827デフォルトの名無しさん
2007/03/26(月) 22:02:270828デフォルトの名無しさん
2007/03/26(月) 22:03:450829デフォルトの名無しさん
2007/03/26(月) 22:12:28(unsigned)-1 は 0xFFFFFFFF (が UINT_MAX とする)になるということか。
0830デフォルトの名無しさん
2007/03/26(月) 22:15:01ただの -1 なら 0x80000001 で解釈されるけど
(unsigned)キャスト時はコンパイルでUINT_MAXに置換されるってことなんだろうか
0831デフォルトの名無しさん
2007/03/26(月) 23:28:52Byte単位でのファイル入出力はできますか?
ビギナー本には書いてないし、ネットでも色々探したのですが…。
エロい人、方法を教えてくだされ。
0832デフォルトの名無しさん
2007/03/26(月) 23:34:420833デフォルトの名無しさん
2007/03/26(月) 23:36:000834デフォルトの名無しさん
2007/03/27(火) 07:39:040835デフォルトの名無しさん
2007/03/27(火) 08:05:170836デフォルトの名無しさん
2007/03/27(火) 08:19:020837デフォルトの名無しさん
2007/03/27(火) 19:33:15POSTメソッドのHTMLのタグ処理について、
SSIを実行できないように、perlだと下記のようになります。
$hoge =~ s/<!--(.|\n)*-->//g;
#任意の文字か改行が続く場合削除
これをC/C++でやりたいんですが、どうなるでしょうか。
0838デフォルトの名無しさん
2007/03/27(火) 19:37:340839デフォルトの名無しさん
2007/03/27(火) 20:29:35クラスのメンバになっているファイルポインタ等ポインタが
がよくそのクラスのデストラクタ内でfree()を使って手動的に
メモリ開放されているのですが、ポインタはデストラクタを
呼び出すだけでは消滅しないのですか?
0840デフォルトの名無しさん
2007/03/27(火) 20:34:23だいたい、どういう手段で確保したメモリなのかも定かではない。
ので、メンバ変数だからといって、自動的にポインタの指す先を消滅させたりはできない。
0841デフォルトの名無しさん
2007/03/27(火) 20:36:410842デフォルトの名無しさん
2007/03/27(火) 20:45:53自動的に消されるのはポインタそのものであって、
ポインタが指す先にあるものを消すことはない。
0843デフォルトの名無しさん
2007/03/27(火) 20:50:20消されるようなこともあるし消されないようなこともある
0844デフォルトの名無しさん
2007/03/27(火) 20:53:06うんこ本と名高い独習C++でもnwe delete使ってるぞ
0845デフォルトの名無しさん
2007/03/27(火) 21:16:17ファイルポインタって何?
freeで解放するのはmallocなどで確保したメモリでしょ。
0846デフォルトの名無しさん
2007/03/27(火) 21:19:050847839
2007/03/27(火) 21:33:44mallocによる動的確保なのでfreeで解放しているだけのようです。
*char は別に関係ない模様・・・。
はず貸しながらもう一つ質問します。
クラスオブジェクトをデストラクタではなくfree()で開放することはできますか?
0848デフォルトの名無しさん
2007/03/27(火) 21:38:38そのオブジェクトはどうやって構築したの?
malloc()ではコンストラクタは呼ばれない。
free()ではデストラクタは呼ばれない。
malloc()で確保したメモリ以外をfree()で解放するのは誤り。
placement newを用いてmalloc()で確保したメモリ上にオブジェクトを構築し
陽にデストラクタを呼び出し
free()で解放することは原理的に可能だが
多分それはあなたのレベルで考えるべきことではない
0849デフォルトの名無しさん
2007/03/27(火) 21:40:20flex (lex)
という手もある
0850デフォルトの名無しさん
2007/03/27(火) 21:41:09そこで、適切な時にfree() を呼び出すことが重要になります。
あるメモリブロックに対して、free() を呼ばなかったにもかかわらずそのアドレスを忘却してしまうと、
ブロックが占有しているメモリはプログラムが終了するまで再利用できなくなります。
これはメモリリーク(memory leak) と呼ばれています。
逆に、プログラムがあるメモリブロックに対してfree() を呼んでおきながら、
そのブロックを使い続けようとすると、別の malloc() 呼び出しによって行われるブロックの再利用と衝突を起こします。
これは解放済みメモリの使用 (using freed memory) と呼ばれます。
これは初期化されていないデータに対する参照と同様のよくない結果 -- コアダンプ、誤った参照、不可解なクラッシュ -- を引き起こします。
0851デフォルトの名無しさん
2007/03/27(火) 21:54:53char abc[8000][4000];
とかって配列作ったら怒られたんだけど、大きさの制限はどのくらいなの?
0852デフォルトの名無しさん
2007/03/27(火) 21:55:40VBScript.RegExp COM APIは除く。
0853839
2007/03/27(火) 22:02:59int iNum;
public:
cMyclass();
void fSample();
}
void cMyclass::cMyclass(){
iNum = 0;
}
void cMyclass::fSample(){
iNum++;
}
main(){
cMyclass oMyclass1;
for(int i=0; i<250; i++){
oMyclass1.fSample();
}
for(int i=0; i<500; i++){
oMyclass1.fSample();
}
//ここでoMyclass1を開放できないかなー。
return 0;
}
・・・こんな感じです。
メンバ関数を一度読んだだけでデストラクタによってオブジェクトを消してしまったら、
メンバ変数の変化を継続できなくなってしまうので、デストラクタのないクラスをつくり、
その1つのオブジェクトを複数回使った後にデストラクタ以外の方法でオブジェクトを
開放しようと思ったのです。
0854デフォルトの名無しさん
2007/03/27(火) 22:06:16VC++のデフォルトのスタックサイズは1MBだそうだ。
それ以上の配列が作りたいのならリンカオプションで増やすか
staticにするか動的確保かvector
>>852
boost::regex
boost::xpressive
鬼車
Perl等正規表現をサポートするスクリプトエンジンをembedする
0855デフォルトの名無しさん
2007/03/27(火) 22:14:02それだけ大きいものを記憶する場合、
ファイル入出力か、メモリマップドファイルを利用することがいいと思います。
0856851
2007/03/27(火) 23:08:42>>854
リンカオプション…調べてみます。でなんとかなりますかねえ。
>>855
メモリマップドファイル…う、これも初耳。メモリ上に展開する?こと?
0857デフォルトの名無しさん
2007/03/27(火) 23:11:33char * a = new char[n]とかvector<char> a(n)でいいと思うんだけど。
0858デフォルトの名無しさん
2007/03/27(火) 23:33:49ストレージ上のファイルをメモリ領域としてアクセスできるようにする方法。
CreateFileMappingで作成できる。
まあ、今のPCで25MB程度ならnewでオンメモリさせてもいいと思うけどね。
いずれにしても単にスタックを増やすのは正道ではない。
0859デフォルトの名無しさん
2007/03/28(水) 00:12:27裏でこっそり小人さんがファイルのRead/Writeをしてくれます。>メモリマップドファイル
0860デフォルトの名無しさん
2007/03/28(水) 00:36:170861デフォルトの名無しさん
2007/03/28(水) 00:45:21>>849
レス感謝です。
検索してますが、なんか難しそうです。
0862デフォルトの名無しさん
2007/03/28(水) 00:55:26あとで、realloc( )できるようにするため。
0863デフォルトの名無しさん
2007/03/28(水) 01:04:19thx
0864デフォルトの名無しさん
2007/03/28(水) 01:07:19ISO X 3010 (C99) section 7.20.3
| 要求された領域の大きさが 0 であるとき, その動作は処理系定義とする。
| ただし, 空ポインタを返すか, 又は 0 ではない大きさを要求したときと同じ動作
| (このとき, 返されたポインタをオブジェクトのアクセスにしようしてはならない。),
| のいずれかでなければならない。
ANSI Cでも同じだったはずだが確認はしてない
0865デフォルトの名無しさん
2007/03/28(水) 01:11:55それ、どこ行けばよめる?
0866デフォルトの名無しさん
2007/03/28(水) 01:13:58http://www.jisc.go.jp/app/pager?id=8683
>>864
s/ISO/JIS/;
0867デフォルトの名無しさん
2007/03/28(水) 01:17:50jiscのpagerのidはセッション毎に作られるもので、他のPCからそのURLへはアクセスできない。
トップからJIS検索→規格番号でX3010と入力しろと伝えるしか確実な手段は無い。
0868デフォルトの名無しさん
2007/03/28(水) 04:04:27サービスを停止しています。
誠に申し訳ございません。
Service is currently unavailable.
0869デフォルトの名無しさん
2007/03/28(水) 07:44:02デストラクタ無視するなんてただのバカですが
0870デフォルトの名無しさん
2007/03/28(水) 19:56:16んなわけないか
0871デフォルトの名無しさん
2007/03/28(水) 20:44:05生成するものに対応する破棄があり、確保には解放がある。
この通り覚えておけばいいんでないの?
0872デフォルトの名無しさん
2007/03/28(水) 20:56:11え、まさか、new&deleteでコンストラクタ&デストラクタが使われないとか思ってるとか・・・
0873デフォルトの名無しさん
2007/03/28(水) 21:03:190874デフォルトの名無しさん
2007/03/28(水) 23:28:44newは確保 + コンストラクタで
deleteはデストラクタ + 解放だ。
コンストラクタとデストラクタ自体は
newとdeleteで呼び出されることを除けば単なる関数だ。
0875デフォルトの名無しさん
2007/03/29(木) 01:08:18delete演算子はデストラクタとdelete演算子関数を呼ぶ。
0876デフォルトの名無しさん
2007/03/29(木) 03:11:56int i;
int (*function_add[256])(int);
function_add_ini((*function_add[])(int));
上記は、要素数256の関数のポインタの配列(*function_add[256])(int)
を宣言して、function_add_ini(int (*function_add[])(int)) で初期化しようと
試みたのですが、「式の構文エラー」ではじかれてしまいます。
どこがおかしいのか、教えていただけないでしょうか?
0877デフォルトの名無しさん
2007/03/29(木) 03:27:36× function_add_ini((*function_add[])(int));
○ function_add_ini(function_add);
こうか?
0878デフォルトの名無しさん
2007/03/29(木) 05:45:55関数ポインタを使うのが超初心者とは…ありえないな
素直に typedef することを薦める
typedef int (*func_t)(int);
func_t function_add[256];
function_add_ini(func_t function_add[]);
0879デフォルトの名無しさん
2007/03/29(木) 10:10:59その方法で通りました・・・ありがとうございました。
typedefでも同様にしてみたところ、こっちでもいけました。
いろいろ勉強になります。感謝、感謝です。
0880デフォルトの名無しさん
2007/03/29(木) 20:29:394バイトfloatの符号部だけを0にして絶対値を取得するマクロを作りたいんですけど、
#define abs_f(floatvar) とし、 (0x7FFFFFFF&(*(unsigned int*)&floatvar) のビット列をfloatと見なすにはどうすればいいんでしょうか。
reinterpret_cast<float>では、「Cスタイルかstatic_cast使え」と怒られます。
どこかにダミーのunsidned int型の変数を宣言し、(____uint____=0x7FFFFFFF&(*(unsigned int*)&floatvar,*(float*)&____uint____)
とすれば動くんですが、変数が別に必要なこと、副作用が起こるのが嫌です。
(もし速度面で条件分岐を使ったものよりも早ければこれで我慢しますが。)
0881デフォルトの名無しさん
2007/03/29(木) 20:47:22で何か不満なのか
0882デフォルトの名無しさん
2007/03/29(木) 22:33:120883デフォルトの名無しさん
2007/03/30(金) 00:25:310884デフォルトの名無しさん
2007/03/30(金) 00:38:070885デフォルトの名無しさん
2007/03/30(金) 05:12:51char *str;
for (str = "abcdefg"; *str; str++) {
/* 各文字に対する処理 */
}
の条件式の所は、strに文字列を代入して初期化するのはわかるのですが、
*strでどうして文字列の終了がわかるのでしょうか?
*strの場合配列の先頭要素のaが代入されているのではないんでしょうか?
0886デフォルトの名無しさん
2007/03/30(金) 05:26:22そしてNUL以外は0ではないのでループが継続される。
もしNULが入ってなかったらバッファオーバーラン、即ち鼻から悪魔。
0887デフォルトの名無しさん
2007/03/30(金) 05:37:21str++してるでしょ。それによって、strはa->b->c...->g->\0を順に指す。
\0を指した時点で終了。
0888デフォルトの名無しさん
2007/03/30(金) 09:04:25for (str = "abcdefg"; *str='\0'; str++) {
/* 各文字に対する処理 */
}
0889デフォルトの名無しさん
2007/03/30(金) 09:05:440890デフォルトの名無しさん
2007/03/30(金) 10:21:20typedef struct _fruit {
int no;
char* name;
} fruit;
という構造体があるとき
fruit ft;
ft.no = 1;
ft.name= "りんご";
fp =...
fwrite(&ft, sizeof(ft), 1 , fp); ※
fclose(fp);
でfwriteと同じ出力をprintfやsprintfで欲しい場合どうすればいいのでしょうか?
0891デフォルトの名無しさん
2007/03/30(金) 10:29:110892デフォルトの名無しさん
2007/03/30(金) 10:31:55>fwriteと同じ出力をprintfやsprintfで欲しい
これの意味がわかりません。
0893デフォルトの名無しさん
2007/03/30(金) 10:32:00printf()で欲しいということは標準出力に出せばいい?
それならfwrite(& ft, sizeof(ft), 1, stdout);で。
sprintf()で欲しいということは適当なポインタの指すところにコピーすればいい?
それならmemcpy(anyPointer, & ft, sizeof(ft);で。
まぁ、やってみれば判るけど意味ないよ。
0894890
2007/03/30(金) 11:00:48説明不足でした。すいません。
printfで上記の場合
01 00 00 00 28 A1 40 00
という出力が欲しいのですがprintfだけでは無理でしょうか
>>893
出力してみたところメモ帳で開いたのと同じのが
標準出力に出んですね
0895デフォルトの名無しさん
2007/03/30(金) 11:07:55for (int ic = 0; ic < sizeof(ft); ++ic) printf("%02x%c", ((char *) & ft)[ic], ic < sizeof(ft) - 1 ? ' ' : '\n');
でもまぁ、これでも未だ意味が無いなぁ。
0897デフォルトの名無しさん
2007/03/30(金) 12:35:19vectorで、eraseをつかっているんですが、eraseした項目を読みにいったときにエラーになるようです。
動的配列の型は自作のstructで、それが原因のような気もします。
参照すべき要素の番号をもらったときにその要素にちゃんとしたデータがあるか調べる方法を教えてください。
0898デフォルトの名無しさん
2007/03/30(金) 12:37:54申し訳ありませんがよろしくお願いします。
0899デフォルトの名無しさん
2007/03/30(金) 12:50:58eraseした後もeraseする前のイテレータ使ってないか?
eraseしたらイテレータが無効になるのでもう一度作成
0900デフォルトの名無しさん
2007/03/30(金) 12:52:060901デフォルトの名無しさん
2007/03/30(金) 14:18:51erase() を使うにしても
for(it = v.begin(); it != v.end(); ++it) {
if (cond(*it)) {
v.erase(it);
}
}
なんて書けないからな。普通は std::remove_if() だろうけど、
自前でやるにしても erase() の戻値であるイテレータを使う。
while (it != v.end()) {
if (bar(*it)) {
it = v.erase(it);
} else {
++it;
}
}
0902897
2007/03/30(金) 19:58:40どうやらかなり違う問題だったようで、単に私の勘違いでした。
無事解決しましたが、申し訳ありませんでした
0903デフォルトの名無しさん
2007/03/31(土) 00:40:12ウインドウを移動したり隠したりすると描いた絵が消えてしまいます。
ググって調べてUpdateWindowを使うのかなあと思ったんだけど
どこでどのタイミングで使えばいいのかわかりません。
教えてくださいエロい人。
0904903
2007/03/31(土) 00:41:050905デフォルトの名無しさん
2007/03/31(土) 01:15:400906デフォルトの名無しさん
2007/03/31(土) 02:08:55要は、WM_PAINTが来たときに呼ばれるのがOnPaint()だってことだけ理解できればいい。
0907デフォルトの名無しさん
2007/03/31(土) 02:21:240908デフォルトの名無しさん
2007/03/31(土) 04:09:40function(this);
みたいにthisを使うのはマズイですよね…?
0909デフォルトの名無しさん
2007/03/31(土) 04:48:43delete this;
が大丈夫なのと同じなのだろうか。
0910デフォルトの名無しさん
2007/03/31(土) 04:52:29delete thisも、デストラクタがそれ単体で呼び出せるのと同じ理屈で呼び出す場合もある。
thisの型のdeleteがオーバーロードされてる場合もあるしね。
0911デフォルトの名無しさん
2007/03/31(土) 06:10:530912デフォルトの名無しさん
2007/03/31(土) 10:16:50コンパイラ:MinGW
typedef struct Parent{
Child child;
} Parent;
typedef struct Child{
Parent* parent;
} Child;
こういう構造体を作りたいのですが、Parentの定義時にはChildが未定義なので、
以下のようなエラーが出てしまいます。
error: syntax error before "Parent"
warning: no semicolon at end of struct or union
warning: type defaults to `int' in declaration of `Child'
warning: data definition has no type or storage class
error: syntax error before "Child"
warning: no semicolon at end of struct or union
warning: type defaults to `int' in declaration of `Parent'
warning: data definition has no type or storage class
このエラーを回避する方法はありませんか?
Javaではよく使っていた方法なのですが・・・。
よろしくお願いします。
0913デフォルトの名無しさん
2007/03/31(土) 10:19:41typedef struct Parent Parent;
typedef struct Child{
Parent* parent;
} Child;
struct Parent{
Child child;
};
0914デフォルトの名無しさん
2007/03/31(土) 10:21:15typedef struct Parent Parent;
typedef struct Child {
Parent* parent;
} Child;
struct Parent {
Child child;
};
0915デフォルトの名無しさん
2007/03/31(土) 10:25:22即レスありがとうございます。解決しました。
こういう宣言が使えるとは・・・。
0917デフォルトの名無しさん
2007/03/31(土) 16:38:130918デフォルトの名無しさん
2007/03/31(土) 16:51:25JIS検索→規格番号 X3014
0919デフォルトの名無しさん
2007/03/31(土) 17:33:07http://pc11.2ch.net/test/read.cgi/tech/1170343752/3
http://pc11.2ch.net/test/read.cgi/tech/1170343752/7
0920デフォルトの名無しさん
2007/04/01(日) 03:03:16struct _Child *child;
};
struct _Child {
struct _Parent *parent;
};
typedef _Parent Parent;
typedef _Child Child;
0921デフォルトの名無しさん
2007/04/01(日) 03:52:25struct _Parent {
struct _Child *child;
};
struct _Child {
struct _Parent *parent;
};
typedef _Parent Parent;
typedef _Child Child;
じゃないと無理じゃね?
0922デフォルトの名無しさん
2007/04/01(日) 03:53:380923デフォルトの名無しさん
2007/04/01(日) 11:36:560924デフォルトの名無しさん
2007/04/01(日) 11:45:29ありがとうございます。
http://www.cppll.jp/cppreference/
このページはどうなってしまったんでしょう…
0925デフォルトの名無しさん
2007/04/01(日) 11:53:06いやいや、ひょっとしたら俺様コンパイラ用の俺様STLを実装しているのかもしれないぞ。
0926デフォルトの名無しさん
2007/04/01(日) 12:21:59void hyoji(int num, char *top)という関数に
hyoji(3, &moji[0]);
というように値を代入します。
そうすると、*topのところに&moji[0]を入れるわけだけど、これは問題ないの?
ポインタのところに配列を入れたり、文字列入れたりわけわからんのですが・・・
0927デフォルトの名無しさん
2007/04/01(日) 12:30:08そもそも、配列をポインタに渡せるのが誤解の元。
そもそもどういう型になっているかというと。
int array[10] ; int型の10個の配列型
array ; // int型の10個の配列型
array[0] ; // int型
&array[0] ; //int型へのポインタ
//合法
int * p = array ;
なぜこれができるかというと、暗黙の型変換で、配列から、配列の先頭要素へのポインタになるから。
次と同等
int * p = &array[0] ;
0928926
2007/04/01(日) 12:36:20なんで、
arrayと&array[0]で型変換できるのかわからん
arrayと&array[0]じゃ意味違うじゃん
0929デフォルトの名無しさん
2007/04/01(日) 12:40:41どう違うんだよ。言ってみろ
0930デフォルトの名無しさん
2007/04/01(日) 12:42:00&array[0] == (int *)array + 0
0931デフォルトの名無しさん
2007/04/01(日) 12:43:160932デフォルトの名無しさん
2007/04/01(日) 12:45:35array は配列の先頭を指すポインタ
&array[0] は配列の先頭要素を指すポインタ
それでこれら二つは等しいと規格で決められている
0933デフォルトの名無しさん
2007/04/01(日) 12:52:210934926
2007/04/01(日) 13:00:02&array[0] == (int *)array + 0
右の式の意味は何?
>>932
なるほど、それはわかりました。
では何で
p=&array[0]
ではなく、
*p=&array[0]
なのでしょうか?
0936デフォルトの名無しさん
2007/04/01(日) 13:03:01*p=&array[0] ではなくて、int *p=&array[0]
これは、int *p; p=&array[0] と同じ意味。
0937デフォルトの名無しさん
2007/04/01(日) 13:04:34arrayの先頭ポインタに0足したもの
&演算子のオペランドが[]演算子のときは
&a[b] を (a+b) と解釈することになっている
0938926
2007/04/01(日) 13:40:500939デフォルトの名無しさん
2007/04/01(日) 13:44:32int *p = &array[0]
↑
ここじゃなくて
int *p = &array[0]
↑
ここで切れてる
0940名有りさん
2007/04/01(日) 13:46:06分かりやすく解説しますんで
0941デフォルトの名無しさん
2007/04/01(日) 13:48:010942デフォルトの名無しさん
2007/04/01(日) 13:48:43C#みたいにint*をIntPtrと定義するように。
0944デフォルトの名無しさん
2007/04/01(日) 18:37:58むしろどんなポインタすらIntPtr1種類になることのどこが明示的なのでしょうか。
ついでに言うとC#もunsafeならC風のポインタも出てきますが。
0945デフォルトの名無しさん
2007/04/01(日) 18:42:30IntPtrはint*とは別物だよ。
IntPtrはOSの提供するポインタやハンドルを扱うための型で、intのポインタじゃない。
0946デフォルトの名無しさん
2007/04/01(日) 19:11:42まぁ、INT_PTR = int*じゃないけどな
0947デフォルトの名無しさん
2007/04/01(日) 19:13:23C99やVC++、Boostにはintptr_tもあるが。
0948デフォルトの名無しさん
2007/04/01(日) 19:19:38一番スマートなのか迷ってしまう。
0949デフォルトの名無しさん
2007/04/01(日) 19:21:520950デフォルトの名無しさん
2007/04/01(日) 19:26:59迷ったらintとdoubleを使っておけば問題ない
必要に応じて列挙型
文字にはchar/wchar_t
メモリの大きさや要素数にはsize_t
ライブラリやAPIが要求するならunsigned
short, long, long long, single, long doubleは基本的に要らない子
0951デフォルトの名無しさん
2007/04/01(日) 19:41:130952926
2007/04/01(日) 19:44:41この引数に"ABC"を代入するプログラムがあるのですが、
pnt="ABC"
という意味ですか?
0953デフォルトの名無しさん
2007/04/01(日) 20:00:280954デフォルトの名無しさん
2007/04/01(日) 20:11:05何かうかつに答えにくいな。
たぶんそういう意味だ。
0955926
2007/04/01(日) 20:11:28printf("%s",pnt);
}
int void main(){
表示("ABC");
return 0;
}
という関数があるとします。
この時、表示関数に"ABC"を代入していますよね?
だけど、表示関数の引数は、pntですよね?
てことは、pnt="ABC"が行われるってことなの?
0956デフォルトの名無しさん
2007/04/01(日) 20:13:29考えてることは大きくは間違ってないだろう。
0957デフォルトの名無しさん
2007/04/01(日) 20:19:510958デフォルトの名無しさん
2007/04/01(日) 20:23:47人から見た動作結果はそんな感じだけど
実際にコンパイラが作っている実行プログラムは違う。
引数はどっちかと言うと渡すっていう言い方が一般的じゃないのかな。
// 宣言
void 表示(char *);
int main()
{
// この時点でコンパイラは引数の名前がpntであることなんてシラネ
表示("ABC");
return 0;
}
// 定義
void 表示(char *pnt)
{
printf("%s",pnt);
}
0959デフォルトの名無しさん
2007/04/01(日) 20:25:30そうだね。
もし言うならば引数に代入だね。
0960デフォルトの名無しさん
2007/04/01(日) 20:28:180961926
2007/04/01(日) 20:37:35みなさん。色々とありがとうございます。
ただ、その関数で
pnt="ABC";
のような形で引数が渡された場合はうまくいかないような気がするんです。
pnt[0]='A';
pnt[1]='B';
pnt[2]='C';
pnt[3]='0'
と同じ結果になっているとおもうのですが、どうですか?
0962デフォルトの名無しさん
2007/04/01(日) 20:37:42それがあたいわたしという奴だし。
0963デフォルトの名無しさん
2007/04/01(日) 20:45:270964デフォルトの名無しさん
2007/04/01(日) 20:58:170965926
2007/04/01(日) 21:12:02char*pnt;;
pnt[0]='A';
pnt[1]='B';
pnt[2]='C';
pnt[3]='0'
printf("%s",pnt);
と
char*pnt;
pnt="ABC"
printf("%s",pnt);
とは違いますよね?
下の場合が958の動作を書いたつもりなんですが、
ほんとは上のようにかかないといけないのではないでしょうか?
0966デフォルトの名無しさん
2007/04/01(日) 21:16:160967デフォルトの名無しさん
2007/04/01(日) 21:20:25http://www.google.co.jp/search?q=c+faq
0968デフォルトの名無しさん
2007/04/01(日) 21:20:52char*pnt;
pnt[0]='A'; この時点で間違え。
pntは何処を指しているか不明なポインタ。
そのpntが指している先頭へ'A'を設定したらまずいだろ。
char*pnt;
pnt="ABC";
これは、pnt[0〜3]に'A','B','C',0を設定しているのではない。
pnt = "ABC\000"が存在するアドレス;
なのです。
0969デフォルトの名無しさん
2007/04/01(日) 21:21:05上と下はちがう。上のほうはいろいろとダメ。
上の方では pntは初期化されておらず、
メモリ上のどこだか分からないが 'A' を書き込んでいる。
それはおそらく君の期待する動作ではない。
下の方は、"ABC"はメモリ上のある領域に既に設定されており、
pntにはその領域のアドレスを入れている。
絵でも描いて整理したら?
ついでに pnt[3]='0' じゃなく pnt[3]='\0'だろ。
0970デフォルトの名無しさん
2007/04/01(日) 21:25:18まじで、本読め
ここで効率悪い時間を使うなら、ちょっと分厚い本読んだ方がよっぽど良い。
おっきい図書館あったら無料で良い本借りれるし
0971926
2007/04/01(日) 21:28:560972926
2007/04/01(日) 21:29:29pnt="ABC"とかくと、
"ABC"とは、ABCが存在するアドレスを示すのですね。これはもう規約のようなものなのでしょうか?
0973デフォルトの名無しさん
2007/04/01(日) 21:33:160974926
2007/04/01(日) 21:44:33K&R読んでるのに・・
0975デフォルトの名無しさん
2007/04/01(日) 21:44:550976デフォルトの名無しさん
2007/04/01(日) 21:46:030977926
2007/04/01(日) 21:46:19Javaが流行るわけだわ
0978デフォルトの名無しさん
2007/04/01(日) 21:47:04もっと身の丈にあったのを読めよ
K&Rは初心者向けの本じゃない
0979デフォルトの名無しさん
2007/04/01(日) 21:48:080980デフォルトの名無しさん
2007/04/01(日) 21:49:260981デフォルトの名無しさん
2007/04/01(日) 21:50:250982デフォルトの名無しさん
2007/04/01(日) 21:53:140983デフォルトの名無しさん
2007/04/01(日) 22:04:37K&Rで十分だろ。
頭から読んでいけばわかる。
0984デフォルトの名無しさん
2007/04/01(日) 22:04:47いるのはお金と時間と???
0985926
2007/04/01(日) 22:06:55K&Rは悪評もあるようですが・・・
あと、それらの本を終えたらどんな勉強をするべきでしょうか?
0986デフォルトの名無しさん
2007/04/01(日) 22:06:550987デフォルトの名無しさん
2007/04/01(日) 22:20:04金も要らないだろ。
いるのは時間っていうか根気だよな。
0988デフォルトの名無しさん
2007/04/01(日) 22:29:43努力ではカバーできないほど
素質がない奴ってたまにいるんだ。
0989926
2007/04/01(日) 22:33:350990デフォルトの名無しさん
2007/04/01(日) 22:37:15挽回するにはかなりの努力がいると思う。
0991926
2007/04/01(日) 22:38:32なんか受かりそうですよ。頑張ります。
ちなみにJAVAはできます。あるていど
0992デフォルトの名無しさん
2007/04/01(日) 22:40:380993デフォルトの名無しさん
2007/04/01(日) 22:41:40(言い方間違ってるあたりは気にしないでくれ。)
配列を作ったとき、その配列の分だけど固化にメモリが確保され、
その配列名は、配列の先頭のアドレスを指し示す。
確保された配列の住所なので、当然書き換えられない(読み出し専用)
ポインタ変数は、アドレスを格納できる変数であり、
つまるところ数値を格納するintやcharなどと同じモノ。
格納するアドレスはもちろん自分自身のアドレスでもかまわないし、ほかの物でも良い。
ポインタ変数の中身は書き換えられる。
また、intやcharと同じように、宣言時に初期化しないと、中に入っている値は不定になってしまう。
char*pnt;
pnt[0]='A';
なんてコトすると、pnt変数の中に入っているアドレスはなんだかわからないので、
そのアドレスの0バイト目を'A'に書き換えてしまうと、
例えばもし、Windowsのシステムが使っていたりすれば、とんでもないことになるのはわかるよな?
…と、俺の文章読んで理解しろとは言わないが、
そこら辺のことぐらい、本なんか読まなくともネットで沢山かかれてるし、
それを調べる気にならないのなら、マジでC言語とかやるべきではない。
もっとほかに楽な言語あるから、(ひまわりとか、なでしことか。
そっちを使うことを強くおすすめする。
0995デフォルトの名無しさん
2007/04/01(日) 23:02:02【初心者歓迎】C/C++室 Ver.36【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1175436073/l50
0996デフォルトの名無しさん
2007/04/01(日) 23:38:46冷たいんじゃなくて、あるものは有効に活用すべきだという意味でのアドバイスだよ。
0997926
2007/04/02(月) 00:51:50しつこいようですが、冷たいっていうか、ひまわりやなでしこ(よくしらないけど)勧められても困るんで・・
一応職業でITをやらないければいけない立場なので、やはりCくらいはそれなりにできないといけないのです(ひまわりとかできても、仕事に使えないですよね?)
努力不足なのは、認めます。甘えてすみませんでした。勉強頑張ります。
また、教えてください。よろしくお願いいたします
0998デフォルトの名無しさん
2007/04/02(月) 00:53:07あ、職業プログラマだったのか。
今すぐダーマ神殿を目指して旅に出るんだ。
0999デフォルトの名無しさん
2007/04/02(月) 00:58:44>職業にするわけでもないのに、本まで買うのはもったいないです。
>>997
>一応職業でITをやらないければいけない立場なので、やはりCくらいは
>それなりにできないといけないのです(ひまわりとかできても、仕事に使えないですよね?)
??
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。