【初心者歓迎】C/C++室 Ver.44【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/11/03(土) 00:20:13ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.43【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1190860744/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2007/11/03(土) 00:27:39:::::::::::::::::::::::::::::::::::::::::::::::: / /
::∩::::::::::::::::::::::::::: / /
∧_∧ ...| | ( ( /⌒ヽ
< `Д´>// ∧_∧ ヽ ヽ⊂ ̄ ̄ ̄⊃ ヨッシャ行くぞ、ゴルァ!!
/ ソウル.. ∧_∧ ´ー`) \\(´∀` ) n .∩
∧_∧ ( ´A `)浪人i ハ \ ( E)|| ∧_∧ ∧_∧ ∧_∧
(丶`∀´) /童貞 \ ノ | 無職/ヽ ヽ_// | .| (丶`∀´) ( ´∀`) ( ^ω^)
( ヽ, / 秋葉 ヽ、/ , // ヽ, | ノ \__/ | .| /高卒 ヽ/ 中卒 ヽ、/ニート ヽ、
0003デフォルトの名無しさん
2007/11/03(土) 00:40:45これだと1文字2バイトってことだと思うのですか゛
while(!fp.eof()){
fp.read(( char * ) &(wbuf[n]), 4096 );
n+=fp.gcount()/2;}
wcout<<wbuf<<endl;
0004デフォルトの名無しさん
2007/11/03(土) 00:43:200005デフォルトの名無しさん
2007/11/03(土) 00:47:430006デフォルトの名無しさん
2007/11/03(土) 01:23:28wbufの型がUTF-16なら、1文字4バイトでアドレスが2つ進むのは問題無いんでねーの。
0007デフォルトの名無しさん
2007/11/03(土) 01:40:140008デフォルトの名無しさん
2007/11/03(土) 04:12:410009デフォルトの名無しさん
2007/11/03(土) 04:45:39ひとつひとつコピーするのは面倒なのでパス stringは確保した時点ではメモリは0しか確保してない
0のままでほなんども足すとかなり鈍い
0010デフォルトの名無しさん
2007/11/03(土) 05:13:48str.reserve(1000*1000*1000);はエラーになります
プログラムでエラーを察知できますか?
0011デフォルトの名無しさん
2007/11/03(土) 05:30:230012デフォルトの名無しさん
2007/11/03(土) 05:42:16万が一数ギガのファイルを渡されたら処理しきれなくなるからエラーを返さないとと思った
0013デフォルトの名無しさん
2007/11/03(土) 05:46:37新規に確保してコピーするみたいだね realloc()は内部でそのようなことをやっているらしい
となるとvectorでもstringでも初めに必要な領域をうまく設定することが速度にかなり影響するだろう
0014デフォルトの名無しさん
2007/11/03(土) 06:04:46stringは最低限の確保しかしないけどvectorは一気に倍に増やすね
だからvectorはそれほど慎重に領域設定しなくていいとはおもうけど
それでも例えば500M 使うとすると途中で合計500M前後領域を作成してコピーすることになるから
確保しておけば速くなるね
0015デフォルトの名無しさん
2007/11/03(土) 06:41:41ビルドを実行したら、出力タブに途中結果、エラーメッセージが一切
表示されず最終結果しか表示されません。
例)
------ ビルド開始: プロジェクト: MatrixMultiply, 構成: Debug Win32 ------
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
わざとスペルミスしても、正常終了しておりエラー一覧タブにも
一切表示されません。
修正したら、ビルドに成功してプログラムを実行できます。
ビルドの途中結果とエラーメッセージを表示する方法を教えて欲しいです。
0016デフォルトの名無しさん
2007/11/03(土) 09:32:29にCreateFileなどでファイルの文字列を一気に読んで
それをstrtok_sで分割し、とっておきたいとします。
char* hoge = strtok_s(NULL,delim,&nexttoken);
char* hage = strtok_s(NULL,delim,&nexttoken);
int sage = atoi(strtok_s(NULL,delim,&nexttoken));
そして、読み込み&分割が終わった後に
delete[] buffer
と、後始末をすると、hoge hageの内容も一緒に消えてしまいます。
コピーをとっておく場合はどうやって書いたらいいんでしょうか?
文字列関係がまだ良く分かりませんので、できれば具体的に教えてください。
ちなみに、
char hoge[256];
strcpy(hoge,strtok_s(NULL,delim,&nexttoken));
とか
char hoge[256];
sprintf(hoge,strtok_s(NULL,delim,&nexttoken));
などとやttみたんですが、内容がフフフフの連続のようになってしまいました。
正しくはどうやって書いたらいいですか?
0017nkkn5
2007/11/03(土) 13:56:21(初心者です)
int l;
l = isprint(-1); cout << l << endl;
はOKなのですが、
l = isprint(-2); cout << l << endl;
とすると実行時に assertion failed の
エラーとなります。
これはなぜなのか教えてください。
(環境はWinXP、VisualC++2005ExpressEditionです)
<質問の過程>
あるC++の本にcharの文字と文字コードを
表示するプログラムが載っていて、
その中で表示できない文字は(isprintで判定)
" "を出力するというようになっておりました。
ところがその本ではcharは0から255という環境を
前提にfor文で0からCHAR_MAXまでループするよう
書かれており、自分の環境では-128(CHAR_MIN)から
127なのでこの部分を修正して実行してみたわけです。
すると実行時にエラーで落ちてしまい、
追及していったところ、isprintが原因らしいことが
わかったところです。
負の数を-1以外入れてはいけないのでしょうか?
0018デフォルトの名無しさん
2007/11/03(土) 14:02:49それ以外の値を指定したときの動作は未定義。
0019nkkn5
2007/11/03(土) 14:24:52ありがとうございます。
やはりそうなんですか。
そうしますと、私が見た本のように
charの定義域全体をisprintを使いながら
(表示できないものは表示しないようにしながら)
表示していくということはできないということですね。
あと、お答えにあったようなことは
今後どういった資料をみたらよいのか
教えていただけませんでしょうか。
HELP見たのですが、まだ理解できない
私のC++にの対しての理解状態ですので、
わかりやすいものがあればと思ったのですが。
0020デフォルトの名無しさん
2007/11/03(土) 14:43:03開発環境はVisualC++ 2005を想定しています。どなたか、よい教科書をご存知の方がいらっしゃいましたら、教えてください。
0021デフォルトの名無しさん
2007/11/03(土) 14:44:010022デフォルトの名無しさん
2007/11/03(土) 14:49:47SetWindowRgnでぐぐるといいかも
0023デフォルトの名無しさん
2007/11/03(土) 15:13:04できる
char に対する CHAR_MAX のように、unsigned char に対しては UCHAR_MAX があるので、 0 〜 UCHAR_MAX まで回せばいい
資料は VC 使ってるなら MSDN でいいんじゃない
インストールしてるかどうか知らないが、オンラインでも読める
http://msdn2.microsoft.com/ja-jp/library/4yc6feha(VS.80).aspx
>is 系ルーチンは、-1 (EOF) 〜 UCHAR_MAX (0xFF) の整数の引数に対して、意味のある結果を生成します。
http://msdn2.microsoft.com/ja-jp/library/ewx8s4kw(VS.80).aspx
>isprint は EOF でないパラメータまたは 0 〜 0xFF の範囲にないパラメータを渡された場合に CRT アサートを表示します
わかりやすいかどうかはなんとも
0024デフォルトの名無しさん
2007/11/03(土) 15:54:43> encodingのauto-detectionに関しては俺も知りたいな。
> Mozillaのソースとか読むと良いのかな?
> マルチプラットフォームでライセンス緩めの適当なライブラリがあると有難いんだが。
universalchardet っていう Mozilla 由来のライブラリがある。
ライセンスは、「MPL1.1/GPL2.0/LGPL2.1 のいずれかを選択」らしい。微妙だな。
002516
2007/11/03(土) 17:48:570026デフォルトの名無しさん
2007/11/03(土) 18:07:250027デフォルトの名無しさん
2007/11/03(土) 18:13:01聞き方が悪いんだよ。ソースを切り貼りせずに、せめて関数ひとつくらいをそのまま貼ってくれ。
buffer がどこで確保されてどこで解放されてるのか、それに対してコピーをどこでやってるのかが
さっぱりわからん。
002916
2007/11/03(土) 18:18:560030デフォルトの名無しさん
2007/11/03(土) 18:21:39俺もわからん
情報が不足しすぎてる
コンパイルして実行できる(そのフフフという現象を確認できる)完全なプログラムを見せれと言いたい
0031デフォルトの名無しさん
2007/11/03(土) 18:22:340034デフォルトの名無しさん
2007/11/03(土) 18:43:26003516
2007/11/03(土) 19:00:41http://pc11.2ch.net/test/read.cgi/tech/1190745673/l50
のスレ>>747に書きましたのでよければ見てください。お願いします。
0036nkkn5
2007/11/03(土) 19:23:44ありがとうございます。
試してみたのですが、unsigned char で
うまくいきませんでした。
コード:
//for (char i = 0; ; i++) { <--- もともと
//for (char i = CHAR_MIN; ; i++) { <--- 実行時ERROR !
for (unsigned char i = 0; ; i++) { <--- テスト
switch (i) {
case '\a' : cout << "\\a"; break;
case '\b' : cout << "\\b"; break;
case '\f' : cout << "\\f"; break;
case '\n' : cout << "\\n"; break;
case '\r' : cout << "\\r"; break;
case '\t' : cout << "\\t"; break;
case '\v' : cout << "\\v"; break;
default : cout << ' ' << (isprint(i) ? i : ' '); // <--- ISPRINTはここです
}
// 整数型にキャストしたものを表示
cout << ' ' << hex << int(i) << ' ' << dec << int(i) << '\n';
//if (i == CHAR_MAX) break;
if (i == UCHAR_MAX) break;
}
つづく
0037nkkn5
2007/11/03(土) 19:24:44結果:表示されるものがcharの場合は、
cout << ' ' << (isprint(i) ? i : ' '); での出力が、
その値が示す”文字”だったのですが
unsigned charにすると、
文字にならずに”数値”になってしまいます。
coutがよくわかっていないのかもしれません。
coutでunsigned charで定義した変数を使って、その数値ではなく
文字を出力する方法を教えていただけませんでしょうか。
MSDNの件、ありがとうございました。
まだ自分のレベルからすると難しいですが。。。
結論を教えていただいた後なので該当箇所は
雰囲気としてはわかる、、、という感じです。
0038デフォルトの名無しさん
2007/11/03(土) 19:28:13coutでの出力される形式は、データの型によって決まるから、
文字として出力したければchar型の値を渡す必要があるよ。
cout << ' ' << (isprint(i) ? static_cast<char>(i) : ' ');
0039デフォルトの名無しさん
2007/11/03(土) 19:30:52for (int i = 0; i <= UCHAR_MAX; i++) {
cout << (isprint(i) ? char(i) : ' ');
cout << ' ' << hex << i << ' ' << dec << i << endl;
}
こんな感じでどうか。 (switchは面倒いから省略した)
0040デフォルトの名無しさん
2007/11/03(土) 19:32:130041nkkn5
2007/11/03(土) 19:40:26ありがとうございます!
結果自体は、うまくいきました。
すいません、新たな疑問です。
static_cast<char>で、
charの範囲外のははずの
unsigned charが128以上の場合でも
(私の環境での話です)
なぜうまく文字になるのでしょうか。
0042デフォルトの名無しさん
2007/11/03(土) 19:40:310043nkkn5
2007/11/03(土) 19:45:57ありがとうございます。
こちらもできました。
ただ、すいません、41と同じ疑問があります。
そういうものなのでしょうか。
0044デフォルトの名無しさん
2007/11/03(土) 19:58:400045nkkn5
2007/11/03(土) 19:59:53すいません。
いただいたご提案では
うまく行ってなかったみたいです。
charが負のときにisprinntなしで行うと
カタカナの範囲も文字として出力されたのですが
よく結果を見ていたら出力されておりませんでした。
範囲外のcastは
やはり勝手な値になる?ようですね。
double--->intを実験したら、
(100000000000)
intの最小値に無理やりcast後の値が
なってしまいました。
(実行時エラーにも
ならないものなんですねえ)
0046デフォルトの名無しさん
2007/11/03(土) 20:18:27んーむ。 根拠は見つけられなかった。
正しくは
for (int i = CHAR_MIN; i <= CHAR_MAX; i++) {
cout << (isprint((unsigned char)i) ? (char)i : ' ');
}
と書くべきかもしれんね。
規格上は signed char の範囲外の値を signed char に変換したときの動作は実装依存らしいけど、実際にはそれが問題になったことはないな。
signed char と unsigned char は 1 対 1 で対応してるもんだと考えてる。
>>45
それはたぶんロケールのせい。
setlocale(LC_ALL, ""); を試してみそ。
ムダかもしれんが。
0047nkkn5
2007/11/03(土) 21:49:17どうやら、うまく行っていなかったのも
isprintのせいのようです。
isprintに128以上の数値を渡すと、
0が返ってきます(私の実験です)。
---実験コード---
for (int i = 0; i <= UCHAR_MAX; i++) {
cout << setw(3) << char(i) << ' ' ;
cout << setw(3) << (isprint(i) ? char(i) : '-') << ' ' ;
cout << setw(3) << isprint(i) << ' ' ; // <--- この部分128以上では0
cout << setw(3) << dec << i << endl;
}
----------------
そのため、カタカナがでるような数値になると
私の前のコードではスペースに置き換えられて
いたために出力されていないように見えて
いたのだしょう。
つづく
0048nkkn5
2007/11/03(土) 21:50:54(訂正)
いたのだしょう--->いたのでしょう
なぜカタカナが非表示文字と判断されるのか、?です。
そういう仕様なんでしょうか。
ただ英語圏生まれのため、isprintとしては
そういうことになるのかな、とも思っております。
違いますでしょうか。
また、上記のコードを、
setlocale(LC_ALL, "");
後に実行すると、
ループ自体が128で止まってしまいます。
UCHAR_MAX自体は(表示させてみたところ)
255のまま変わっていないのですがね、、、
(こちらも?ですが、setlocaleは
私にはレベル的に早いかなーという気がします。
私の見ている本には載ってませんし。)
0049nkkn5
2007/11/03(土) 21:56:37そうみたいですね。
先ほどこちらで教えていただきました。
(18です)
17--->18--->19--->23--->36,37
という流れをみていただけるとうれしいです。
結局のところ、今は、私が見ている本の前提である、
charの範囲が0から255ならば
「charの定義域全体に渡って、
”表示できない文字はisprintを使ってスペースに置き換えながら"
文字と数値を一覧で出す」ことができるが、
charの定義域が-128から127である私の環境の場合、
うまくいく方法は見つかっておりません。
(とくにマイナス部分(カタカナなど)について)
”表示できない文字はisprintを使ってスペースに置き換えながら"
ということを行わないのであれば話は簡単なのですが。
17で質問したときにはこんなに大事(オオゴト)になるとは
思っておりませんでした。。。
0050デフォルトの名無しさん
2007/11/03(土) 22:37:36http://pc11.2ch.net/test/read.cgi/tech/1190261457/
こっちのスレで訊いた方が良いかもしれない。
0051デフォルトの名無しさん
2007/11/03(土) 22:48:17再び、VC++ 2005 EXPRESS で質問です。
http://msdn2.microsoft.com/en-us/library/ms533895.aspx
↑ここ見て、とりあえず線を引くところから初めてみようと思ったのですが、
外部参照 5 が未解決です。(リンクエラー?)がでます。
これは、ウィンドウズプラットフォームSDKのインストール後の設定になんか不備があるのでしょうか?
それとも、ウィンドウズプラットフォームSDKのDLLを手動でリンカに設定するもんなのでしょうか?
0053デフォルトの名無しさん
2007/11/03(土) 22:59:14自分でソケット関連のシステムコールをクラス化して
作るものですか?それとも既存のライブラリがあって、それを
利用するのが今の定石でしょうか?
Cでソケットプログラミングはしてるのですが、C++で
同じことをする場合、自作のクラスの作り方の雛形
というか定石がわかりません。大体、形は決まってると
予想しているのですが。
0054デフォルトの名無しさん
2007/11/03(土) 23:02:310055デフォルトの名無しさん
2007/11/03(土) 23:03:380056デフォルトの名無しさん
2007/11/03(土) 23:05:51それは現段階では誤解を招くぞ
0057デフォルトの名無しさん
2007/11/03(土) 23:09:20下記のソースでできるなら、どこが間違っているか、分かる方は教えてください。
この方法自体が間違っているのでしょうか。
#include <stdio.h>
int dec(int y){
int z; z=y+1;
return(z);
}
int inc(int y){
int z; z=y+1;
return(z);
}
int mult2(int y){
int i,j; i=y,j=y;
while(i>=0){
i=dec(i),j=inc(j);
}
return(j);
}
main(){
int i; i=6;
printf("%d\n",mult2(i));
}
0058デフォルトの名無しさん
2007/11/03(土) 23:10:20リンカ-入力-追加の依存ファイル にgdiplus.libを追加。
ソースに #pragma comment(lib, "gdiplus") って書いておく方が楽だけど。
0059デフォルトの名無しさん
2007/11/03(土) 23:12:34値が表示されないという事は、
そもそもprintfが機能していないという意味なのだが。
そういう話なのか?
0060デフォルトの名無しさん
2007/11/03(土) 23:14:05int z; z=y-1;
return(z);
}
int inc(int y){
int z; z=y+1;
return(z);
}
int mult2(int y){
int i,j; i=y,j=y;
while(i>0){
i=dec(i),j=inc(j);
}
0062デフォルトの名無しさん
2007/11/03(土) 23:17:21無限ループじゃないの?
0063デフォルトの名無しさん
2007/11/03(土) 23:18:35×int z; z=y+1;
○int z; z=y-1;
return(z);
}
0064デフォルトの名無しさん
2007/11/03(土) 23:30:5460のように
while(i>0){
と >=ではなく、>
0065デフォルトの名無しさん
2007/11/03(土) 23:45:17cout << setw(3) << char(i) << ' ' ;の行をコメントアウトしたら、
UCHAR_MAX == 255まで結果が出力されたぞ。
>>46>>48
C++では、std::locale::global(std::locale(""))が
Cでのsetlocale(LC_ALL, "")に相当する。
これには<locale>が必要。
0066nkkn
2007/11/04(日) 00:25:05ありがとうございます。
うまくいったみたいです。
まとめてみます。
・setlocale(LC_ALL, ""); を設定しないと、
isprintは、カタカナ部分について
0を返してしまう。
なお、
cout << setw(3) << char(i) << ' ' ;
はiが129以降でも出力自体はされる。
・setlocale(LC_ALL, ""); を設定すると、
カタカナ部分についてのisprintの返り値が
ちゃんと0以外(私の環境では255)になる。
一方、
cout << setw(3) << char(i) << ' ' ;
はiが129以降は、(その出力行自体)なにも
出力されなくなる。
この部分をコメントアウトすれば、
途中で止まらず、カタカナも出力される。
これで合っていますでしょうか。
当初の質問の目的が達成されました!
ありがとうございました。
0067nkfを使って日本語ファイルをwstringへ読み込む関数出来たよ
2007/11/04(日) 01:03:45#include <string>
#include <vector>
#include <fstream>
using namespace std;
void wreadfile(char *inputfile, vector<wstring> &z){
typedef int (__stdcall *FNC)(char*);
typedef void (__stdcall *FND)(char* ,char*);
locale::global(locale("japanese"));setlocale(LC_ALL,"japanese");
HINSTANCE hd = LoadLibrary("nkf32.DLL");
FNC SetNkfOption=(FNC)GetProcAddress(hd,"SetNkfOption");
FND NkfFileConvert=(FND)GetProcAddress(hd,"NkfFileConvert2");
int n;char *tempdir;n=GetTempPath(1, tempdir);
tempdir = new char[n+30];GetTempPath(n, tempdir);
char temfile[20]="nihongohenkanyo";
strcat(tempdir, temfile);
SetNkfOption("-w16L0 -X -Lu -d");
NkfFileConvert(inputfile,tempdir);
fstream fp(tempdir,ios::in | ios::binary );
static wchar_t wbuf[2][1024*1024+20];
int N,flg=0,k;wstring str=L"";
while(!fp.eof()){
fp.read((char *)(wbuf[flg]), 1024*1024);
for(N=fp.gcount()/2+5; wbuf[flg][N-1]==0; N--);
wbuf[flg][N]='\0';
k=0;while(1){
for(n=k; wbuf[flg][n]!='\n'; n++)
if(n>=N){str=(wstring)&(wbuf[flg][k]); flg=1-flg; goto end;}
wbuf[flg][n]='\0';
z.push_back( str + (wstring)&(wbuf[flg][k]) );
if(k==0)str=L"";
k=n+1;}end:}remove(tempdir);}
0068デフォルトの名無しさん
2007/11/04(日) 01:05:57#include <string>
#include <vector>
#include "wreadfile.h"
using namespace std;
main(){
vector<wstring> z;
wreadfile("file",z);
for(int n=0;n<z.size();n++)wcout<<z[n]<<endl;
}
0070デフォルトの名無しさん
2007/11/04(日) 04:16:17wcoutって危険( 認識できない文字があると落ちる )と思うので、wcoutを自作したいのですが
自作関数に置き換えられますか?
0071デフォルトの名無しさん
2007/11/04(日) 04:20:460072デフォルトの名無しさん
2007/11/04(日) 10:27:49名前空間に閉じ込めれば、wcoutって名前でそのまま使えるし
0073デフォルトの名無しさん
2007/11/04(日) 10:33:21んなもんは用途に寄るだろ。UTF-8で吐けるんなら問題ねえし、エンコーディングが
仮定できないコンソール出力で、情報を全く失いたくないんなら、出力を
フィルターすべきかもな。
boost::iostreamsなんかが使えると思うよ。
0074デフォルトの名無しさん
2007/11/04(日) 14:24:320075デフォルトの名無しさん
2007/11/04(日) 16:37:47ActiveXを使う要領でできるけど道のりは遠い。
0076デフォルトの名無しさん
2007/11/04(日) 16:45:15やはりshared_ptrを使うのが当たり前ですかね?
0077デフォルトの名無しさん
2007/11/04(日) 17:10:22よく分かってるじゃない。
0078デフォルトの名無しさん
2007/11/04(日) 17:28:45「参照回数計測クラスを自作する」ことが目的じゃなければそうすべき。
0079デフォルトの名無しさん
2007/11/04(日) 18:06:08>>78
レスどうも。C++の勉強のために一度作って動かして、
あとはライブラリを使用します。
仕事でC++を使うときに皆さんどうしてるのかなと思いまして。
0080デフォルトの名無しさん
2007/11/04(日) 19:09:26なんでなんだぜ
Image image(L"Grapes.jpg");
graphics.DrawImage(&image, 60, 10);
↓
Image image(L"C:/1111.bmp");
graphics.DrawImage(&image, 60, 10);
あと、線を引いてみよう、文字列を書いてみようも試してみたんだが、画面がマッシロなままなのさ!
0081デフォルトの名無しさん
2007/11/04(日) 20:05:55そうしたら影を付けるところで止まります。
コンパイルは出来るのに、実行すると止まります。
どうすればいいでしょうか。
0082デフォルトの名無しさん
2007/11/04(日) 20:18:04具体的にどの関数をどういうふうに使ったのか
それと、そこで止まるっていうのはどうやって確かめた?
実は他のところで止まってるのかもしれんぞ
「止まる」っていうのも、もう少し具体的に
アニメーションしてるのが止まるのか、キーやマウスの反応がなくなることなのか、エラーメッセージが出て強制終了くらうことなのか、OSごと落ちるのか
0083デフォルトの名無しさん
2007/11/04(日) 20:20:270084デフォルトの名無しさん
2007/11/04(日) 20:21:260085分からないから寝る
2007/11/05(月) 00:44:19一番最初のたった5行の文がコンパイルするとエラーを吐きます
main()
{
printf("C言語で遊ぼう\n");
while(!kbhit());
}
3.4行目共にCall to undefined function なんですがなにが悪いんでしょうか?
0086デフォルトの名無しさん
2007/11/05(月) 01:12:11ちゃんと適切なヘッダをインクルードする必要がある。
0087デフォルトの名無しさん
2007/11/05(月) 01:48:19どちらを使って勉強をすればいいのでしょうか?
0088デフォルトの名無しさん
2007/11/05(月) 02:13:050089デフォルトの名無しさん
2007/11/05(月) 02:16:04みなさん「ハンガリアン記法」ってのを使ってますか?
009080
2007/11/05(月) 02:25:10といっても、java使いなんで、Cだとどうなることやら
エラーの原因がトンと分からなかったので、FromFileで読み込めるようなので試してみた。
Image::FromFile(L"1111.bmp");
Image::FromFile(L"C:\\1111.bmp");
Image::FromFile(L"C:/1111.bmp");
ぜんぶ0x00000000(null?)が返ってくる。なんで?
内部で画像の読み込みに失敗して、javaでいうヌルポでも発生してたんかしら?
0091デフォルトの名無しさん
2007/11/05(月) 02:30:19GCCの方が文法に厳しいので勉強するならGCC
0092デフォルトの名無しさん
2007/11/05(月) 02:35:18for(int i=0;i<10;i++) cout << i << endl;
cout << i << endl;
で、いらないテクニックを覚える…と
#define for if(1)for
0093デフォルトの名無しさん
2007/11/05(月) 07:59:41タイプの方なら自然と使ってる。ってか便利。
システムの方は自然と使わなくなった。
0094デフォルトの名無しさん
2007/11/05(月) 08:16:02さすがに、それはVC++でもNET 2003あたりから
コンパイル通らないほうがデフォルトになった。
>>93
それをいうならアプリケーションハンガリアンではないのか?
0095デフォルトの名無しさん
2007/11/05(月) 12:21:07indexごとにファイルを読みに行くとします
このとき、ファイルを一つにまとめるのと、一つ一つ分けるのと、いくつか束にするのではどれが速度速いですか?
ランダムに3個程度のindex値をアクセスすることにします
0096デフォルトの名無しさん
2007/11/05(月) 12:29:25このときファイルサイズは最大1Gになります
indexは、0から10万の数字で与えられるとします
indexごとにファイルの位置を記録しておくか、index名のファイルを10万用意するかですが
どっちが良いですか?
0097デフォルトの名無しさん
2007/11/05(月) 13:00:4910バイトしか記録しなくても512バイト程度使ってしまいますね
0098デフォルトの名無しさん
2007/11/05(月) 14:31:55あたりを相互変換できる文字コードライブラリを探しています。
・言語はCオンリー
・ライセンスがBSD以下のゆるさ
・サイズはなるべく小さめ
・ポータブル
の条件に合うよさげなライブラリがあったら教えてください。
よろしくお願いします。
0099デフォルトの名無しさん
2007/11/05(月) 15:53:160100デフォルトの名無しさん
2007/11/05(月) 16:58:31改行で入力終了にしたいのですが,どうすればいいですか?
1 1 0 0 1 0 1 1 改行
で入力を終了したいです。
教えてください。よろしくお願いします。
//---- 配列入力
num = 0;
do {
scanf("%d", &arr[num]);
} while ( arr[num++] != EOF ); // 改行は入力の終了
num--; // 有効な入力数
0101デフォルトの名無しさん
2007/11/05(月) 17:45:46マルチすんなカス
0102デフォルトの名無しさん
2007/11/05(月) 19:23:00char buf[MAXSIZE];
char *p;
fgets(buf, 99, stdin);
p = strtok(buf, " ");
while(p != NULL) {
arr[num++] = atoi(p);
p = strtok(NULL, " ");
}
0103デフォルトの名無しさん
2007/11/05(月) 19:24:02訂正
char buf[MAXSIZE];
char *p;
fgets(buf, MAXSIZE - 1, stdin);
p = strtok(buf, " ");
while(p != NULL) {
arr[num++] = atoi(p);
p = strtok(NULL, " ");
}
0104デフォルトの名無しさん
2007/11/05(月) 19:26:35サイズ小さいライセンスも気にしない
0105デフォルトの名無しさん
2007/11/05(月) 19:48:49その中にある特定のディレクトリを参照させないようにするにはどうすればいいですか?
たとえば
-L/usr/local/lib と指定したもののうち /usr/local/lib/gcc-4.0.4 は参照しないようにする
とかいう感じです
0106デフォルトの名無しさん
2007/11/05(月) 21:02:23速度は実測が基本。
良い悪いの判断は本人にしかできない。
0107デフォルトの名無しさん
2007/11/05(月) 21:07:59ファイルのオープンの方がコストは多そうですが
0108デフォルトの名無しさん
2007/11/05(月) 21:09:470109デフォルトの名無しさん
2007/11/05(月) 21:20:470110デフォルトの名無しさん
2007/11/05(月) 21:44:45使用するファイルシステムによっても違うしだろうし、ファイルシステム上の断片化などの状態にも依る。
キャッシュに乗ってるかも影響するはず。
試せ。
0111デフォルトの名無しさん
2007/11/05(月) 22:21:46ttp://www.katsakuri.sakura.ne.jp/src/up29024.txt.html
この項目を入れたら
0x00412984 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00090f44 を読み込み中にアクセス違反が発生しました。
とエラーが出るようになったのですが、どこがおかしいのでしょうか?
作っているプログラムの内容は、チェックボックスにチェックが入っているところにEDITボックスを表示する、と言う感じです。
選択した場所によってはうまく動作することもあります。
0112デフォルトの名無しさん
2007/11/06(火) 00:37:59文字列をlongに変換するstrtol()という関数ですが
失敗時の返り値が0なのはいいのですが、文字列が"0"だったときの区別のつけ方は
変換不可能な文字列へのポインタの格納先を準備してあげるしかないのでしょうか?
0113デフォルトの名無しさん
2007/11/06(火) 01:31:55long mystrtol(char *cary, char **ep)
{
if(!strcmp(cary,"0"))
return 0L;
return strtol(cary,ep,10);
}
こんなのとかさ
0114デフォルトの名無しさん
2007/11/06(火) 01:58:100115デフォルトの名無しさん
2007/11/06(火) 02:16:20つっこんでやれよ、本人のためにもさ
0116デフォルトの名無しさん
2007/11/06(火) 02:16:440117デフォルトの名無しさん
2007/11/06(火) 02:24:27http://video.nifty.com/cs/catalog/video_metadata/catalog_071105039557_1.htm
店でNo4 ホスト VS 黒帯空手家 死闘の映像
http://video.nifty.com/cs/catalog/video_metadata/catalog_071104039294_1.htm
イケメン ホスト VS ブルースリー ボコボコに殴る映像
http://video.nifty.com/cs/catalog/video_metadata/catalog_071103039028_1.htm
893 VS ブルースリー 対決映像
http://video.nifty.com/cs/catalog/video_metadata/catalog_071102038922_1.htm
0118デフォルトの名無しさん
2007/11/06(火) 05:27:21例えば0 1の出現率が等しいとするとどのビット列も同じ確率になりますよね?
データの並び順を考えないと駄目ではないですか?
たとえば0000000000000000000000000000011111111111111111111111111111111などは
繰りかえし数を記録することでかなり圧縮できると思うのですが
0119デフォルトの名無しさん
2007/11/06(火) 05:42:46あと、文書を圧縮するならば前の1、2バイトごとに確率分布表を作って圧縮するといいと思うけど
0120デフォルトの名無しさん
2007/11/06(火) 06:39:22確率1%のものがあれば、2^(-7) = 0.0078125 だから小数点以下7桁程度を与えるのが良いと言うことになる
ハフマン圧縮の一般化といえるね
0121デフォルトの名無しさん
2007/11/06(火) 13:49:45public:
int a;
BaseClass(){};
~BaseClass(){};
virtual void Func(){};
};
class SubClass : public BaseClass{
public:
int b;
void Func(){};
};
int main(){
BaseClass *pointer = new SubClass[2];
for(int i=0; i<2; i++) pointer[i].Func();
delete [] pointer;
return 0;
}
これでエラー起こるの何故
0122デフォルトの名無しさん
2007/11/06(火) 13:53:35配列へのポインタはキャストしてはいけない
0123デフォルトの名無しさん
2007/11/06(火) 13:58:11もし上みたいに子クラスのインスタンスの配列を親クラスのポインタに入れて使いたい場合どうしたらいいんですか?
0124デフォルトの名無しさん
2007/11/06(火) 14:04:500125デフォルトの名無しさん
2007/11/06(火) 14:17:58具体的にはどんな書き方に…?
0126125
2007/11/06(火) 14:22:08ありがとうございました
0127デフォルトの名無しさん
2007/11/06(火) 17:52:460128デフォルトの名無しさん
2007/11/06(火) 19:06:46二つの正の整数の積ということなのですが、二つの整数をかけるだけ(a*b)ではいけないのでしょうか?
while文の処理がさっぱりわかりません。
よろしくお願いします。
#include <stdio.h>
void main(void){
int a,b,prod=0,temp;
printf("a="); scanf("%d",&a);
printf("b="); scanf("&d",&b);
if(a>b){
temp=a;
a=b;
b=temp;
}
while(a != 0){
if(a%2 == 1) prod +=b;
a=a/2
b=2*b
}
printf("product of %d * %d = %d", a, b, prod);
exit(0);
}
0129デフォルトの名無しさん
2007/11/06(火) 19:31:10乗除の演算なしで掛け算が出来るなぁ…、なんて。
0130デフォルトの名無しさん
2007/11/06(火) 19:33:330131デフォルトの名無しさん
2007/11/06(火) 19:37:32小学校で習った掛け算の筆算を二進数でやってるようなもんだ
0132128
2007/11/06(火) 19:40:53while(a != 0){
if(a%2 == 1) prod +=b;
a=a >> 1 /* a=a/2 */
b=b << 1 /* b=2*b */
}
0133デフォルトの名無しさん
2007/11/06(火) 20:28:03そこはコンパイラの最適化に期待ということでは?
もっとも、これくらいならC/C++でもシフト使えということは同意。
0134デフォルトの名無しさん
2007/11/06(火) 22:35:19「じゃあ(a*b)でよくね」みたいな話になるから(w
0135デフォルトの名無しさん
2007/11/07(水) 19:47:22{
private:
base* m_base;
};
これって循環ですか?
0136デフォルトの名無しさん
2007/11/07(水) 20:25:070137デフォルトの名無しさん
2007/11/07(水) 20:58:33循環ですか?
hogeの定義にbaseが必要で
でもhogeはbaseを持ってるので
なんか循環っぽいなぁと。
0138デフォルトの名無しさん
2007/11/07(水) 21:13:180139デフォルトの名無しさん
2007/11/07(水) 21:16:02そもそも知らない人は
自分が知らないのに人に教えられるわけがないでしょう。
0140デフォルトの名無しさん
2007/11/07(水) 21:18:340141デフォルトの名無しさん
2007/11/07(水) 21:20:44全知全能の神光臨。
0142デフォルトの名無しさん
2007/11/07(水) 21:29:490143デフォルトの名無しさん
2007/11/07(水) 21:30:14ただ場合によるので、具体的にやりたいことを示してくれないと問題点の指摘は出来ん。
0144デフォルトの名無しさん
2007/11/07(水) 21:33:340145デフォルトの名無しさん
2007/11/07(水) 21:35:38class sage の宣言に class age を使ってて
class age の宣言に class sage を使ってる場合。
よって循環ではないべ?
0146デフォルトの名無しさん
2007/11/07(水) 21:36:24普通に連結リストかなんかでありそうな気がするが
0147デフォルトの名無しさん
2007/11/07(水) 21:38:300148デフォルトの名無しさん
2007/11/07(水) 21:43:030149デフォルトの名無しさん
2007/11/07(水) 21:43:04あほすぎ
0150デフォルトの名無しさん
2007/11/07(水) 21:55:380151デフォルトの名無しさん
2007/11/07(水) 22:08:21はずれ
0152デフォルトの名無しさん
2007/11/07(水) 22:19:11エスパーがいない可能性を考えないのか?
0153wolf ◆8VH3XAqjlU
2007/11/07(水) 23:08:13base<---hogeで循環は存在しないけど
m_base = new する第3のクラスを含めた循環に注意です
0154デフォルトの名無しさん
2007/11/08(木) 00:11:410155デフォルトの名無しさん
2007/11/08(木) 00:51:46>>153
0156デフォルトの名無しさん
2007/11/08(木) 00:59:520157デフォルトの名無しさん
2007/11/08(木) 10:37:40お仕事頑張ってくださいね
0158デフォルトの名無しさん
2007/11/08(木) 10:38:570159デフォルトの名無しさん
2007/11/08(木) 11:07:44聞いてる時点でお前はそれ以下じゃんw
0160デフォルトの名無しさん
2007/11/08(木) 11:28:52>>137読めば分かるだろ。
0161デフォルトの名無しさん
2007/11/08(木) 16:06:16それはつまり、回答者と質問者の理解度を対等に比較するのが
あなたにとっては「自然」である、ということですよね?
でもそれって、教師の知識が怪しい、という話をしている時に「生徒はそれ以下じゃんw」と
返すようなものですね。
こっちは、そういうレベルの人間が、知識を持っているという嘘をついて「教壇に立」って、
誰かに物を教えるのが間違いである、という点を言っているんですよ。
そういうレベルの人に回答者になってもらっては困るんです。質問者も、場も、混乱するだけなので。
確かに理解度は俺のほうが下です。
でも、あなた方も俺と同じ、質問者レベルなんです。回答者気取りをされると邪魔なのです。
そういうことです。
0162デフォルトの名無しさん
2007/11/08(木) 16:10:410163デフォルトの名無しさん
2007/11/08(木) 16:15:12何を聞きたいのか分かりません
実体の循環参照ならコンパイルできないので安心して下さい
ポインタを使う限り循環参照になる可能性は常にあります
諦めて下さい
0164デフォルトの名無しさん
2007/11/08(木) 16:28:370165デフォルトの名無しさん
2007/11/08(木) 16:31:58がっかりするとは俺もお前にがっかりだ
0166デフォルトの名無しさん
2007/11/08(木) 16:32:030167デフォルトの名無しさん
2007/11/08(木) 17:15:41周りから言われるんじゃね?
教師は仕事で金もらって教えてるわけだが、
ここは2chだしなー
質問者はこうあるべき!
回答者はこうあるべき!
とか真面目に言われてもなー
郷に入れば郷に従えっていうから、
説教長文書くより、どうすれば
2chで回答を得られる可能性が高くなるのか?
を考えたほうが現実的。
妥協できないなら、ネットで質問なんてするな。
第三者からみれば、あんたが荒らしだから。
0168デフォルトの名無しさん
2007/11/08(木) 17:35:280169デフォルトの名無しさん
2007/11/08(木) 17:58:31まったくです。困ったものですね。
人に何かを教える立場というのは、自己顕示欲の異常に強い人達にとっては
魅力的なものなのでしょうね。だからそのスキルも無いのに気取りたがるのでしょう。
>>165
がっかりする分には好きなだけがっかりしてもいいですよ。
能もないのにでしゃばったりしないこと、これを学習することのほうが大切です。
>>167
「ここは2chだし理論」で物を言う人は、相手の言い分にもきちんとそれを適用して、
ここは2chなのだから説教なんかしてもしょうがない、という風に思い至るべきですよ。
ある理屈を、ある側にだけ適用するのはおかしな言動だと言わざるを得ません。
それから、「2chで回答を得られる可能性」は、この場合関係ありません。
回答者が回答できるレベルにあれば、それで解決していたことなので。
あと、第三者というのを一つの意志のように語るのは気持ち悪すぎです。
あっちの第三者と向こうの第三者は、異なる意識を持っているのです。
架空のみんなが自分を支持する夢から出て、自分の名義で物を言いましょう。
0170167
2007/11/08(木) 18:14:58だから空気読めといっとろうが
質問してみた
↓
バカにされた
↓
マジ反論 ←いまここ
まともな回答もついてるんだからさ
それでいいじゃん?
これ以上何を望んでるの?
0171167
2007/11/08(木) 18:16:160172デフォルトの名無しさん
2007/11/08(木) 18:37:210173デフォルトの名無しさん
2007/11/08(木) 19:19:35ダメ回答者達が維持したがっているダメな空気は、読んだ上で否定しています。
そんな種類の空気に支配的になられては困るので。
0174173
2007/11/08(木) 19:32:480175デフォルトの名無しさん
2007/11/08(木) 19:34:54救世主が登場
0176デフォルトの名無しさん
2007/11/08(木) 19:45:20がメンツをつぶされた挙句暴れている模様。
0177140
2007/11/08(木) 20:33:360178デフォルトの名無しさん
2007/11/08(木) 23:26:502つ以上の引数をスレッドに渡すにはどうすればいいですか?
0179デフォルトの名無しさん
2007/11/08(木) 23:44:35void func(void *arg)
{
((hogeclass *)arg)->func();
}
0180デフォルトの名無しさん
2007/11/08(木) 23:49:050181デフォルトの名無しさん
2007/11/08(木) 23:50:40HogeClass hoge = (HogeClass) threadArg;
なんて記述をしてるんじゃ…。
0182デフォルトの名無しさん
2007/11/08(木) 23:59:34が適切な物なら良いけど、もしそうじゃないなら怖いな
0183デフォルトの名無しさん
2007/11/09(金) 00:12:570184デフォルトの名無しさん
2007/11/09(金) 04:19:15リアルでは出会えない珍獣を見た
0185デフォルトの名無しさん
2007/11/09(金) 05:51:13とっくにスレの流れ変わってるんだから、空気読めよ。
0186デフォルトの名無しさん
2007/11/09(金) 06:34:460187デフォルトの名無しさん
2007/11/09(金) 10:24:19#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 1000
#define K 320000
unsigned int su[256];
unsigned WINAPI open(void *p){
unsigned long size; char *buf=new char [K+100];
HANDLE fp=CreateFile((char*)p,GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
ReadFile(fp,buf,K,&size,NULL);
for(int i=0;i<size;i++)su[ (unsigned char)buf[i] ]++;}
main(){
WIN32_FIND_DATA fd;
char path[200]="d:\\aaa\\",serchpath[200];
strcpy(serchpath, path); strcat(serchpath, "*");
SetCurrentDirectory(path);
HANDLE hd = FindFirstFile(serchpath, &fd);
int n; HANDLE hf[N];
for(n=0;n<256;n++)su[n]=0;
for(n=0;;n++){
for(;;){if(!FindNextFile(hd, &fd))goto end;
if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))break;}
hf[n]=(HANDLE)_beginthreadex(NULL, 0, open,(void*)fd.cFileName, 0 ,NULL);}
WaitForMultipleObjects(N, hf, TRUE, INFINITE);
end:
for(n=0;n<256;n++)cout<<n<<" no kosu "<<su[n]<<endl;}
0188デフォルトの名無しさん
2007/11/09(金) 10:27:390189デフォルトの名無しさん
2007/11/09(金) 10:39:10・同一メモリに複数スレッドから同時にアクセスしているから
・serchpathなんてへんな変数名だから
・thread内でnewしているのに解放していないから
・高々Kバイトしか読み込まないのに100バイトも余計に確保しているから
・変数nを違う目的に使い回しているから
・コーディングスタイルが変態だから
・ハンドル変数にfpなんて名前を使っているから
・どっかWinAPIと思しき辺りの使い方が間違っているから
・毎回ディレクトリの状態が違うから
・毎回ファイルの内容が違うから
どれだろね。
0190デフォルトの名無しさん
2007/11/09(金) 10:47:500191デフォルトの名無しさん
2007/11/09(金) 10:56:481つずつ問題がないかどうか確認するんだ
0192デフォルトの名無しさん
2007/11/09(金) 10:58:06#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 200
#define K 16
unsigned int su[K];
unsigned WINAPI f(void *p){
int n=(int)p;
for(int i=0;i<n*n;i++)su[i%K]++;}
main(){
int n;
for(n=0;n<K;n++)su[n]=0;
HANDLE hf[N];
for(n=0;n<N;n++){
hf[n]=(HANDLE)_beginthreadex(NULL, 0, f,(void*)n, 0 ,NULL);}
end:
WaitForMultipleObjects(N, hf, TRUE, INFINITE);
for(n=0;n<K;n++)cout<<n<<" no kosu "<<su[n]<<endl;}
0193デフォルトの名無しさん
2007/11/09(金) 11:01:05馬鹿だから。
0194デフォルトの名無しさん
2007/11/09(金) 11:03:41#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 200
#define K 12
unsigned int su[K];
unsigned WINAPI f(void *p){for(int i=0;i<(int)p;i++)su[i%K]++;}
main(){
int n; for(n=0;n<K;n++)su[n]=0;
HANDLE hf[N];
for(n=0;n<N;n++){hf[n]=(HANDLE)_beginthreadex(NULL, 0, f,(void*)n, 0 ,NULL);}
WaitForMultipleObjects(N, hf, TRUE, INFINITE);
for(n=0;n<K;n++)cout<<n<<" no kosu "<<su[n]<<endl;}
0195デフォルトの名無しさん
2007/11/09(金) 11:09:000196デフォルトの名無しさん
2007/11/09(金) 11:12:06メモリがFDくらい動作がのろいとするとsu[・]の値を呼び出して
1を足して書き戻すときに、同時に呼び出して計算していた値で置き換えられると言うことです
0197189
2007/11/09(金) 11:16:260198デフォルトの名無しさん
2007/11/09(金) 11:18:140199デフォルトの名無しさん
2007/11/09(金) 11:20:38クリティカルセクション
例
ウェブページの来訪者数を表すカウンタのプログラムを例にとって説明する。カウンターのプログラムはおおまかに次の処理からなる。
ディスク等の記憶装置から現在のカウンタの値を読み出す
カウンタの値を1増やす
カウンタの値を記憶装置に書き戻す
ttp://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AB%E3%83%AB%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3
0200デフォルトの名無しさん
2007/11/09(金) 11:24:240201187
2007/11/09(金) 11:33:53これなら時間のかかる部分はスレッドでやってあるから高速のはず
0202デフォルトの名無しさん
2007/11/09(金) 12:39:04ある市販のDLL(libも付いてたので「追加の依存ファイルに指定済み」)の外部関数をコールするたびに、以下のようなメッセージが出力ウィンドウにでます。
HOGE.EXEの0x7c812a5bで初回の例外が発生しました:Microsoft C++の例外: std::runtime_error (メモリの場所 0x0012f16c)
0x7c812a5bでググるといくつかヒットしましたが、原因特定できず。
仕方ないので関数コールをtry catchでくくってもcatchできず。
_try _exceptでも受けれず。
このエラーはどうやったら出なくなるでしょうか?
0203デフォルトの名無しさん
2007/11/09(金) 12:40:31よく知らねぇんだが、デュアルコアとは言え
プロセスでもない単なるスレッドでOSがマルチな処理してくれるんか?
シングルコアな動きするなら、ディスパッチするだけでむしろ遅くなりそうなんだが。
0204デフォルトの名無しさん
2007/11/09(金) 12:42:39変態と言われてもそのままってことは真性のMなんだろうか
0205デフォルトの名無しさん
2007/11/09(金) 12:45:39しかも、実態はディスクアクセスで律速されるから(同じディスク上のファイルを調べる限り)殆ど速くなる余地がない罠。
0206202
2007/11/09(金) 12:47:30動作には影響は今のところありません。
あと、その市販のDLLに付いてきたMFCのサンプルプロジェクトで試しても同じエラーが出力ウィンドウに出ます。
0207デフォルトの名無しさん
2007/11/09(金) 14:46:340208デフォルトの名無しさん
2007/11/09(金) 15:54:581 #include <iostream>
2
3 void extfunc(const int &val)
4 { std::cout << val << std::endl; }
5
6 class A
7 {
8 static const int CONSTDATA = 0x100;
9 public:
10 void func()
11 { extfunc(CONSTDATA); }
12 };
13
14 int
15 main()
16 {
17 A a;
18 a.func();
19 return 0;
20 }
$ g++ --version
g++ (GCC) 4.2.3 20071014 (prerelease) (Debian 4.2.2-3)
$ g++ const.cpp
/tmp/ccN8OXMd.o: In function `A::func()':
const.cpp:(.text._ZN1A4funcEv[A::func()]+0x9): undefined reference to `A::CONSTDATA'
うーん・・・コンストメンバ変数って、参照で受ける事が出来ないんでしょうか?
extfunc(int(CONSTDATA)); とすれば通りますがなんか・・・
0209デフォルトの名無しさん
2007/11/09(金) 15:59:370210デフォルトの名無しさん
2007/11/09(金) 16:19:18定義が無いから賢いコンパイラなら定数データの領域は確保しないらしいね
(なので当然シンボルもない)
by メイヤーズ
定義してみなよ
const int A::CONSTDATA;
0211デフォルトの名無しさん
2007/11/09(金) 16:41:20187の場合で効果があるかどうかは別として、少なくともWindowsでは、
マルチスレッドでも複数の論理CPUを使ってくれる。
0212デフォルトの名無しさん
2007/11/09(金) 16:46:47従って、特定のスレッドがどのコアで実行されるかは
原則的にカーネルにゆだねられる。
0213デフォルトの名無しさん
2007/11/09(金) 17:07:17なんと・・・
6 class A
7 {
8 static const int CONSTDATA;
9 public:
10 void func()
11 { extfunc(CONSTDATA); }
12 };
13
14 const int A:CONSTDATA = 0x100;
でOKでした,#defineしちゃいそうだけどここは我慢・・・
サンクスです
0214デフォルトの名無しさん
2007/11/09(金) 22:00:56初期値の指定はクラス定義内でいいんだぜ。そうしないと配列要素数とかの
定数式につかえない。
>>210
クラスのメンバ変数は定義しない限り実体がなくて、参照やポインタを取ろうとすると
エラーになることは決まっている。整数型に限って初期値をクラス定義内に書けて、
書けば定数式に使えるという特別ルール。
0215デフォルトの名無しさん
2007/11/09(金) 22:03:41DLL 内で throw されて DLL 内で catch されてるんでしょ。何も問題ない。
0216デフォルトの名無しさん
2007/11/10(土) 00:33:03DES や AES など、一般的な暗号方式のライブラリはありませんか?
C でも C++ でもいいです。
ご存知のかた、もしくは自作モノを持っているかた、情報をお願いします。
;; できれば SHA-1 や base64 まで対応していると嬉しいですが、
;; 無くても構いません。
0217デフォルトの名無しさん
2007/11/10(土) 00:39:48あとSHA-1やbase64は暗号じゃない
0218デフォルトの名無しさん
2007/11/10(土) 00:58:37opensslとかか?
まぁでも>>217に1票
0219デフォルトの名無しさん
2007/11/10(土) 01:07:12だからEffectiveC++に載っていると。。
0221187 スレッド出来ました
2007/11/10(土) 03:02:08#include <windows.h>
#include <process.h>
using namespace std;
#define N 100
#define K 320000
unsigned int su[N][256]; char fname[N][256],chk[N];
unsigned WINAPI open(void *p){
unsigned long size,n=(int)p; char *buf=new char [K+100];
HANDLE fp=CreateFile(fname[n],GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
while(1){ ReadFile(fp,buf,K,&size,NULL); if(size==0){chk[n]=0;return 0;}
for(int i=0;i<size;i++)su[n][ (unsigned char)buf[i] ]++;}}
main(){ WIN32_FIND_DATA fd;
char path[200]="d:\\aaa\\",serchpath[200];
strcpy(serchpath, path); strcat(serchpath, "*");
SetCurrentDirectory(path);
HANDLE hd = FindFirstFile(serchpath, &fd);
int n,i; HANDLE hf[N];
for(n=0;n<N;n++)for(i=0;i<256;i++)su[n][i]=0;for(n=0;n<N;n++)chk[n]=0;
for(;;){ if(chk[n]==0){
for(;;){if(!FindNextFile(hd, &fd))goto end;
if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))break;}
strcpy(fname[n],fd.cFileName); chk[n]=1;
hf[n]=(HANDLE)_beginthreadex(NULL, 0, open,(void*)n, 0 ,NULL);}
n++;if(n>=N)n=0;}
end: WaitForMultipleObjects(N, hf, TRUE, INFINITE);
for(n=1;n<N;n++)for(i=0;i<256;i++)su[0][i]+=su[n][i];
for(i=0;i<256;i++)cout<<i<<" no kosu "<<su[0][i]<<endl;}
0222デフォルトの名無しさん
2007/11/10(土) 08:40:14>for(;;){ if(chk[n]==0){
最初にこの行に到達するとき n=N だぞ。
0223デフォルトの名無しさん
2007/11/10(土) 10:27:45本は持ってないので知らないけど、クラス定義内の static const な整数型について
>210 みたいに「賢いコンパイラなら〜」って書いてあるなら、ちょっと不正確だと思う。
0224デフォルトの名無しさん
2007/11/10(土) 11:24:44これは必ずしも正しくないということが書かれてるよ。
これを実現するコンパイラがいわゆる賢いコンパイラ。
標準で、絶対に領域確保がされないことが保障されている
わけではなく、実装依存となる。static constなデータは、
確保されるならば、大抵静的領域になる。アドレスを必要とする
処理がある場合に限って(この場合は必ず領域確保が必要)領域
を確保してもいいし、無条件に確保しておいてもいい。
それは実装依存ということ。
領域確保を絶対に避けたければenumを使えばいい。
0225224
2007/11/10(土) 11:27:22というのは、もちろん非staticなメンバーについては正しい。
上で書いたのはstaticなメンバーについて。
0226デフォルトの名無しさん
2007/11/10(土) 11:34:49BCCで>>208で引っかかって調べたときに
「>>208は新しい規格で>>213は古い規格」
みたいな記述を見たんだが。
コレがホントなら、「賢い」とかあんまり関係ないんじゃね?
正確なところ知ってる人、フォローplz
0227デフォルトの名無しさん
2007/11/10(土) 11:50:28ポインタや参照とかのアドレスを必要としない場合でも常にメモリ確保
を強制されるというのを新しい規格で認るのは信じがたいけど。
正確なところ知ってる人、フォローplz
0228デフォルトの名無しさん
2007/11/10(土) 12:43:08さっきから実装依存だと言ってるのって、名前空間スコープに定義した const 変数の
話じゃないの?
クラスの static const なメンバ変数はクラス定義内では宣言しかされないので、
別途定義が必要。整数型に限って、宣言につけた初期値を持つ定数式として使える
という特別ルールがあるだけ。
C++ 2003 規格の 9.4.2 p2 より
> The declaration of a static data member in its class definition is not a definition and may be of an
> incomplete type other than cv-qualified void. The definition for a static data member shall appear in a
> namespace scope enclosing the member’s class definition.
同じく 9.4.2 p4
> If a static data member is of const integral or const enumeration type, its declaration in the class
> definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that
> case, the member can appear in integral constant expressions. The member shall still be defined in a namespace
> scope if it is used in the program and the namespace scope definition shall not contain an initializer.
0229228
2007/11/10(土) 12:53:51定数式の一部として使うぶんには定義は必要無いね。参照やポインタを取られる
可能性があるなら関係ないけど。
>208 の例もあるし、ライブラリとして提供するような時には気をつけて定義しとかないと
まずいね。
0230デフォルトの名無しさん
2007/11/10(土) 14:09:21thx
0231デフォルトの名無しさん
2007/11/10(土) 14:23:44どういう性質のものなのか?あと型名とか。
0232デフォルトの名無しさん
2007/11/10(土) 15:20:540233デフォルトの名無しさん
2007/11/10(土) 17:13:27それは引数を一つとるoperator( )が定義されている関数オブジェクトの
クラス型ということですよね?
0234デフォルトの名無しさん
2007/11/10(土) 17:36:10直接binder1stやbinder2ndを使っても問題は無いんだけど、
その場合はbinder1st<ここを書かなきゃいけないのがめんどいよね>。
0235デフォルトの名無しさん
2007/11/10(土) 17:42:20どうも。
ストラップ本で理解できました。
0236デフォルトの名無しさん
2007/11/10(土) 18:11:210237デフォルトの名無しさん
2007/11/10(土) 18:14:490238デフォルトの名無しさん
2007/11/11(日) 15:11:11あるプロセスでstrtok()で、トークン分解中に静的リンクしたDLLの関数を呼んでいます。
その関数内でもstrtok()してるらしく、関数終えて呼び出し元で続きのstrtok()をしようとすると、意図しない値(具体的にはNULL)が入ってしまいます。
MSDNにはCランタイムライブラリの頁に静的リンクなら問題ないようなことを書いてますが、
なぜstrtok()が静的リンクした関数にひきづられるのでしょうか。
あとVC6.0の頃は引きずられなかったのでしょうか。
環境:XP MFC
0239デフォルトの名無しさん
2007/11/11(日) 15:26:26strtok() はヌルを渡されたときのために前回の分割位置を静的な変数に覚えている
ことがある。だから、基本的にそういう使い方はできない。
http://msdn2.microsoft.com/ja-jp/library/abx4dbyh(VS.80).aspx
静的リンクで DLL との競合が起こらない理由もちゃんと書いてある。
VC8(VS2005) でも静的リンクは使えるから、明示的に指定すれば同じ動作に
なるんじゃないの?
0240238
2007/11/11(日) 17:30:02ありがとう。
自分もその頁見てたけど、静的リンクするのはCRTであって、
こちらが作ったDLLじゃないわけですね。
そこを勘違いしてました。
結局どのコンパイラオプションを選べばいいか調べきれなかったので
VC6.0の時は適切なコンパイラオプションだったんだろうけど、今回はstrtok_s()使うことにしました。
0241デフォルトの名無しさん
2007/11/11(日) 17:38:52というような話をときどき伺うのですが、
どういうことなのか理解できません……
教えて頂けませんか?
0242デフォルトの名無しさん
2007/11/11(日) 17:56:280243デフォルトの名無しさん
2007/11/11(日) 18:00:02符号なし整数の計算では、最大値の次が 0 で 0 の前が最大値というふうにラップしている
ものとして結果が必ずその型の範囲内に収まる、と規格で定められている。
ラップする場合を指してオーバーフローと言うかどうかは微妙なところ。
0244デフォルトの名無しさん
2007/11/11(日) 18:28:41なるほど、納得できました
ありがとうございます
0245デフォルトの名無しさん
2007/11/11(日) 18:50:42初心者です。
C++について質問があります。
ArrayとVecotorの全ての値をファンクションに渡して、Arrayの全ての値をReturnしたいのですが、
うまくいきません。
コールの仕方と、プロトタイプの書き方、それからReturnの書き方を教えてください。
もしくは、何か別の方法をしないといけないのでしょうか…?
よろしくお願いします。
0246デフォルトの名無しさん
2007/11/11(日) 18:58:21Array とか Vecotor とか聞いたことないけど
int なり何なりと変わらんと思うよ
Array func(Array a)
{
/* a についていろいろ処理 */
return a;
}
void func(Array *a)
{
/* a についていろいろ処理 */
}
0247245
2007/11/11(日) 19:14:29IntやDouble、Char等のScalar変数(ひとつの値しか含まない変数)なら
うまくいくのですが、ArrayやVectorのようなCollection変数(二つ以上の値を含む変数)は
なぜかうまくいかないのです。
Int型Arrayについて、
Int myFunction(myArray[])
{
Arrayについて処理
return myArray[];
}
や、
String型Vectorについて
String myFunction(myVector[])
{
myVector処理
return myVector[];
{
のようにやろうとしているのですが、間違えているのでしょうか…?
0248デフォルトの名無しさん
2007/11/11(日) 19:36:53コンパイルもできないコードを貼って「間違えているのでしょうか…?」って、何考えてんだ?
エスパーでも募集してんのか?
とりあえず C/C++ では大文字小文字が区別されるから、区別しろ。いまのままじゃ
めちゃくちゃすぎる。
実際にコードを書いてコンパイルしろ。そしたらエラーメッセージが出るから、それを嫁。
0249デフォルトの名無しさん
2007/11/11(日) 19:36:590250デフォルトの名無しさん
2007/11/11(日) 19:38:02myArray/myVectorがテンプレートなのかも怪しいけど
STL前提ならこう書くんじゃないか
// int型のベクタを定義
typedef std::vector<int> myIntArray;
myIntArray myIntFunction(myIntArray array)
{
myArray::iterator i = array.begin();
myArray::iterator e = array.end();
while(i != e) {
// arrayに対する処理(要素に1を足す)
*i += 1;
i++;
}
return array; // 処理結果を返す
}
0251デフォルトの名無しさん
2007/11/11(日) 19:42:54myIntArray::iterator i = array.begin();
myIntArray::iterator e = array.end();
だわ
0252デフォルトの名無しさん
2007/11/11(日) 20:08:260254デフォルトの名無しさん
2007/11/11(日) 20:41:47Int って何だ。Array って何だ。String って何だ。C/C++ にそんなものはない。
しかも、せっかく
>Array func(Array a)
ってアドバイスもらってるのに、
>Int myFunction(myArray[])
って思いっきり無視してるし。
0255デフォルトの名無しさん
2007/11/11(日) 21:58:30Windows VistaとVisual C++ 2005 ExpでOpenGLを使い簡単なゲームアプリを製作しました。
友人AのVista機ではなんら問題なく動作したのですが、友人BのXPでは動作しませんでした。
友人A、BともにOpenGLのDLLは入っています。
どなたか解決のヒントでもいいのでご存じであればよろしくおねがいします。
0256デフォルトの名無しさん
2007/11/11(日) 22:02:47VC++ 2005のランタイムを入れろ。
0257デフォルトの名無しさん
2007/11/11(日) 22:02:510258デフォルトの名無しさん
2007/11/11(日) 22:08:27『このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。
アプリケーションを再度インストールすることにより問題が解決する場合があります。 』
らしいです。Vista環境では正常に動作するのですが……
0259デフォルトの名無しさん
2007/11/11(日) 22:22:560260デフォルトの名無しさん
2007/11/11(日) 22:45:16それともMFCは今後使用されなくなっていくことが濃厚で
.NETとCLR?(この違いはわかりませんが)を勉強
したほうが良いでしょうか?
0261デフォルトの名無しさん
2007/11/11(日) 22:46:08エラーメッセージでググったら、こんなの出てきたがどうよ?
ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060025.txt
0262デフォルトの名無しさん
2007/11/11(日) 22:57:08個人的な意見
.NETで良いと思う。
でもどっちみち、ちょっと突っ込んだことしようとすると
Win32APIをガシガシ叩くことになるんで、
まずはウィンドウに子ウィンドウ貼り付けて絵と文字を表示するぐらいは
Win32APIを触っとくのが良いと思う。
1週間も掛からんと思うし。
0263デフォルトの名無しさん
2007/11/11(日) 23:05:56何か一冊.NETの本読んでみます。
ちなみにCLRは.NETとは関係無いものですか?
.NETはVBやVC#でも共通に使えるものでCLRはVC++
固有のものですか?
0264デフォルトの名無しさん
2007/11/11(日) 23:07:11現在シューティングゲームを作ってるのですが、以下のようなタスクシステムで行なっています
class ITask
{
virtual void task()=0;
virtual void draw()=0;
};
class CEnemyZakoA : public ITask
class CEnemyZakoB : public ITask
class CEnemyFactory : public ITask
class CBg : public ITask
class CItem : public ITask
こんな感じで、全てのオブジェクトはITaskを継承し、一つのITaskリストに登録しています。
そこで疑問なのですが、Task同士が連携するにはどうすればよいでしょうか?
例えば「CBgの持つ『どのくらいスクロールしたか』の情報によって、CEnemyFactoryは生み出すZakoの種類を変える」
といった場合です。
一応素人考えながらこういう手を考えましたが、一般的にはどうするべきなのでしょうか?
1・FacotryのようなほかのTaskの情報に依存するものは、リストに登録せず特別扱いする(CEnemyFactryとして保持しておく)べき
2・他のTaskに依存するTaskは、その生成時にそのTaskへのポインタをもらっておくべき
3・他のTaskに影響を与える情報をまとめた構造体を持ち、それへのポインタをtask()の引数で渡してあげるべき
1はいまいちだと思います。特別が増えるたびに管理が増えますし、何のためのITaskリストなのかわかりません
2はなかなかいい手ですが、CBgが削除された時などに困ります(share_ptrを使うべき?)
3は構造体に新しい情報が加わるたびに、全てのCXXX.cppが再コンパイルになるのが不満です
0265デフォルトの名無しさん
2007/11/11(日) 23:15:15こちらへ↓どうぞ。
タスクシステム総合スレ
http://pc11.2ch.net/test/read.cgi/gamedev/1173708588/
0266263
2007/11/11(日) 23:17:22入門書にも書いてありました。
0267デフォルトの名無しさん
2007/11/11(日) 23:42:05ありがとうございます!上手く行きました!
他にも助言頂いた方々本当にありがとうございました。
0268デフォルトの名無しさん
2007/11/12(月) 15:09:38MFCだかCLIだか知らんけど、それを上なぞりするだけの言語仕様がつかめる
C++の本ないですか?一から細かいことまで調べる必要ないので。
C++も一応はわかっています。MFCとかCLIがソース見て理解できる程度の
上辺の知識を理解できるまでの文法力がつく本ってないですか?細かい言語使用は
適宜分厚い本でしらべるので。。よろしくお願いします。
0269デフォルトの名無しさん
2007/11/12(月) 16:15:11動的なメモリの割当をしたいとき、どのようにしますか?
i=0;
while(fgets(...) != NULL ){
++i;
}
とやってからnewとかmallocとかで配列を確保するのかなあ
とか考えましたけど、どう考えても余計な事をしているようで…
0270デフォルトの名無しさん
2007/11/12(月) 16:29:18つ[std::vector]
つ[realloc()]
0271デフォルトの名無しさん
2007/11/12(月) 17:00:39filelengthとか何らかの手段を使って、ファイルサイズを先に調べて、一気に割り当てる。
標準入力やパイプのようにサイズがわからない場合は、ある程度の大きさのブロックごとに
読み込み、ブロックのlinked listを作成する。大きさがあまり大きくないことがわかっているなら
reallocもあり。
0272デフォルトの名無しさん
2007/11/12(月) 17:21:57バイナリモードでファイルオープンしてシーク操作でファイルサイズ取得
ifstream
seekg
tellg
0273デフォルトの名無しさん
2007/11/12(月) 18:49:16class sample {
int power;
public setPower(int power) {
this.power=power;
}
};
ってしたいんだけど、文法的に間違いだよね?
0274デフォルトの名無しさん
2007/11/12(月) 18:52:55Javaとは違って、
this->power
0275デフォルトの名無しさん
2007/11/12(月) 21:17:31C++のthisはポインタ
0276デフォルトの名無しさん
2007/11/13(火) 11:42:55可変長自動配列はC99からサポートされたらしいですがVC++ 2005は未対応?
固定長/ヒープにすればそれで終わりなのですけど、折角の便利仕様なので使いたい・・・
static cosnt int ARRAY_MAX 256
bool variable_array_test(int variable_len)
{
if (variable_len <= 0 || variable_len > ARRAY_MAX)
return false; // bad length
char temporary[variable_len]; // << C2054 でエラー
return true; // ok
}
c:\ cl
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
CXXFLAGS = -nologo -Zm200 -GS -Od -Zi -Gm -MDd -GR -EHsc -W
0277273
2007/11/13(火) 11:52:33とおもったら、来てた。おかげでよくわかりました。使い方と理屈が。
PHPのも参照だから矢印記号なんだ。なるほど、なるほど。お礼が遅くなり申し訳ないです。
0278デフォルトの名無しさん
2007/11/13(火) 11:53:21以上
0279デフォルトの名無しさん
2007/11/13(火) 12:05:27('д`;)・・・把握,mingw入れて吊ってきます
0280デフォルトの名無しさん
2007/11/13(火) 12:06:320281デフォルトの名無しさん
2007/11/13(火) 16:06:150282デフォルトの名無しさん
2007/11/13(火) 23:14:060283デフォルトの名無しさん
2007/11/13(火) 23:57:520284デフォルトの名無しさん
2007/11/14(水) 01:48:090285デフォルトの名無しさん
2007/11/14(水) 01:50:520286デフォルトの名無しさん
2007/11/14(水) 02:44:38両方 C++0x に入るみたい。ただし __FUNC__ じゃなくて __func__ ね。
0287デフォルトの名無しさん
2007/11/14(水) 07:41:100288デフォルトの名無しさん
2007/11/14(水) 10:34:460289デフォルトの名無しさん
2007/11/14(水) 11:41:060290デフォルトの名無しさん
2007/11/14(水) 12:53:51これも止めた方がいい?
0291デフォルトの名無しさん
2007/11/14(水) 12:54:470292デフォルトの名無しさん
2007/11/14(水) 13:49:55using namespace std;
class Palindrome{
private:
char *inputValue;
public:
Palindrome();
void setInputValue(char*);
bool isPalindrome();
~Palindrome();
};
Palindrome::Palindrome(){
this->inputValue = new char[100];
}
void Palindrome::setInputValue(char *str){
strcpy(this->inputValue,str);
}
Palindrome::~Palindrome(){
delete [] this->inputValue;
}
0293デフォルトの名無しさん
2007/11/14(水) 13:50:32bool Palindrome::isPalindrome(){
char *aux = new char[100];
int k=0;
for(size_t i=0;i<strlen(this->inputValue);i++){
if((this->inputValue[i] >= 'A' && this->inputValue[i] <= 'Z') || (this->inputValue[i] >= 'a' && this->inputValue[i] <= 'z')){
aux[k] = tolower(this->inputValue[i]);
k++;
}}
aux[k] = '\0';
for(size_t i=0;i<strlen(aux)/2;i++){
if(aux[i] != aux[strlen(aux) - 1 - i]){
delete [] aux;
return false;
}}
delete [] aux;
return true;
}
0294デフォルトの名無しさん
2007/11/14(水) 13:52:03#include "Palindrome.cpp"
#include <iostream>
using namespace std;
int main(){
Palindrome p;
char string[100];
while(true){
cout<<"文字を入力してください: ";
cin.getline(string,100);
if(strcmp(string,"") == 0){
break;
}
p.setInputValue(string);
cout<<"その文字は "<<(p.isPalindrome() == true ? "はパリンドロームです " : "違います ")<<endl;
}
return 0;
}
0295デフォルトの名無しさん
2007/11/14(水) 13:54:09コンパイルできません。
だれか、直してもらえますか?
0296デフォルトの名無しさん
2007/11/14(水) 13:57:240297デフォルトの名無しさん
2007/11/14(水) 14:09:02(Ubuntu 7.10 / g++ 4.1)
まさかgccでコンパイルしようとはしてないだろうな
0298デフォルトの名無しさん
2007/11/14(水) 14:16:52どうやってこんぱいるするんですか?
教えてください。
0299デフォルトの名無しさん
2007/11/14(水) 15:07:130300デフォルトの名無しさん
2007/11/14(水) 15:07:540301デフォルトの名無しさん
2007/11/14(水) 15:18:14g++ でコンパイルできました。
どうもすみませんでした。
g++というのを知りませんでした。
0302デフォルトの名無しさん
2007/11/14(水) 16:12:07質問です。
コンパイルは出来たんですが、実行が出来ません。
g++ aMain.cpp -o aMain
では何も起こらないんですがどうやって実行したんですか?
0303デフォルトの名無しさん
2007/11/14(水) 16:14:59g++はC++コンパイラだからC++特化のライブラリも探してくれる。
0304デフォルトの名無しさん
2007/11/14(水) 16:16:51実行するには、./a.outでいい。
つーか、その程度の基礎知識もなしにコンパイルなんてするなよw
0305デフォルトの名無しさん
2007/11/14(水) 16:18:11何したいの?それで aMain というファイルができてるの?
できていえれば、 ./aMain とすれば走るはずだけど。
0306デフォルトの名無しさん
2007/11/14(水) 16:26:340307デフォルトの名無しさん
2007/11/14(水) 16:40:07./aMainだとpermission denied となってしまいます。
0308デフォルトの名無しさん
2007/11/14(水) 16:45:08g++ aMain.cpp -o aMain && ./aMain
で実行できました。
お騒がせしてすみませんでした。
0309デフォルトの名無しさん
2007/11/14(水) 17:40:55ただのタイプミスな気がする
0310デフォルトの名無しさん
2007/11/14(水) 18:06:04そんなにあせらずに、Unix 系の CUI 使いかたの本薄いので
良いから一冊読むと大分時間の節約になると思うよぉ。
0311デフォルトの名無しさん
2007/11/14(水) 20:33:43mallocなどで確保されてない領域を知る方法はありませんか?
char *str;
str=(char *)malloc(sizeof(char)*2);
for(int i=0; i<5; i++){
if( (str+i) == NULL)
//未確保
}
みたいな形でわかればいいんですが、必ずしもNULLが入ってるとは限らないので…。
よろしくお願いします。
0312デフォルトの名無しさん
2007/11/14(水) 20:40:370313311
2007/11/14(水) 20:41:58なるほど・・・。
やっぱり、そういう方法しかないんですか・・・
せめてtry catchがあれば、強引に出来そうなんですけどね。
どうもありがとうございました。
0314デフォルトの名無しさん
2007/11/14(水) 20:46:310315デフォルトの名無しさん
2007/11/14(水) 20:47:440317デフォルトの名無しさん
2007/11/14(水) 21:18:32そこでお聞きしたいのですが、例えば以下のような場合
・アプリケーションAがDLL_BとDLL_Cを参照
・DLL_B自身もDLL_Cを参照
DLL_BがDLL_Cで確保したメモリを
アプリケーションAからリンクされたDLL_Cで解放するのは大丈夫なのでしょうか?
よろしくお願いします。
0318デフォルトの名無しさん
2007/11/14(水) 21:33:27OKだけど、LocalAllocにすればそんなこと気にしなくてもいいんじゃね?
0319デフォルトの名無しさん
2007/11/14(水) 21:42:200320デフォルトの名無しさん
2007/11/14(水) 21:55:12>if ( ( str + i ) == NULL )
この行で、iに2以上の値が入った時点でアウト。
確保されていない領域を参照することになる。
NULLとの比較も無意味。
初期化されていない領域はゴミが入っているのでNULLかどうかなんてわからない。
0321デフォルトの名無しさん
2007/11/14(水) 22:06:290322デフォルトの名無しさん
2007/11/14(水) 22:07:09LocalAlloc, HeapAlloc, GlobalAlloc
って名前が違うだけでは無いんですね。
知りませんでした。
>>319
Heap系はよけいなオブジェクトが必要になるのであまり使いたくないです・・・
そこが肝という気もしますが
0323デフォルトの名無しさん
2007/11/14(水) 22:09:06それが出来ないから質問きたんだろ
出来るなら、既に解決してるじゃんw
そもそも
>この行で、iに2以上の値が入った時点でアウト。
これを判定したいって言う質問なのに、そのレスはナンセンス過ぎる
0324デフォルトの名無しさん
2007/11/14(水) 23:06:43>この行で、iに2以上の値が入った時点でアウト。
単なるポインタに数字を足した値を見ただけで何でアウトなんだ?
*つけて参照してるならともかく・・・
0325デフォルトの名無しさん
2007/11/14(水) 23:14:37ヒープハンドルは常にGetProcessHeap()で得たものを使うことにすれば、
Local/Globalと比べ、新たな面倒さが生まれることはないと思うぞ。
0326デフォルトの名無しさん
2007/11/14(水) 23:39:430327デフォルトの名無しさん
2007/11/15(木) 01:27:020328デフォルトの名無しさん
2007/11/15(木) 01:59:11配列要素数を超えたところを指すようにポインタに足し算すると未定義動作になる。
C99 6.5.6 p8 より( C++ では 5.7 p5 に同じ文面がある)
> If both the pointer operand and the result point to elements of the same array object, or one past the last element
> of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.
この場合だと要素数 2 の char 配列とみなせるから、 2 までは大丈夫で 3 以上でアウトね。
0329デフォルトの名無しさん
2007/11/15(木) 02:05:54しかも、ポインタ変数に代入したわけでもなく、単に+3をやってifで比較しただけでしょ?
その文面は
*(str+i)のように参照した場合や、str+=iのように加算を行った場合であって
str+iでは、何の意味もないかと。
試してみれば分かると思うけど
char *str;
に
if( (str+5000)!=NULL)
ってやろうと
if( (str+50000000)!=NULL)
ってやろうと、エラーは出るはず無いよ。
0330デフォルトの名無しさん
2007/11/15(木) 02:23:13> *(str+i)のように参照した場合や、str+=iのように加算を行った場合であって
そんなことどこにも書いてない。 p + n という式自体について述べた部分だよ。
* で参照したり = で代入したりする前の話。
0331デフォルトの名無しさん
2007/11/15(木) 02:43:49一瞬、「じゃあふたつ後ろならいいのかよ」とか思ってしまったよ
0332デフォルトの名無しさん
2007/11/15(木) 10:42:18仕様の読み方わかってないだろ。
プログラムの勉強からはじめたほうがいいね。
0333デフォルトの名無しさん
2007/11/15(木) 10:57:22どこをどう読んだら >329 みたいな解釈になるのか教えてください。
0334デフォルトの名無しさん
2007/11/15(木) 11:24:57加減演算子
ポインタオペランド及びその結果の両方が同じ配列オブジェクトの要素、又は
配列オブジェクトの最後の要素を一つ越えたところを指している場合、演算に
よって、オーバーフローを生じてはならない。それ以外の場合、動作は未定義
とする。
あくまで未定義といっているのだから、規格上は何でもあり得る、つまり
実装依存ということになるね。>>329の言っている、エラーが出ない
とか参照しなければ単なる数字になるということは、多くの実装がそう
なっているだけであって、str+5000の加算演算で仮にクラッシュする実装が
あっても、それは規格には従っていることになる。結局、この場合、
動作は未定義だから実装まかせ。
なので、厳密には>>328の意見が正しいと思われる。
0335デフォルトの名無しさん
2007/11/15(木) 13:04:40例えばint array[2]に対してarrayが0xfff0にアサインされているかもしれない。
ポインタもintも16bitなら、array + 4が0になってしまい、NULLと区別できなくなってしまう。
# 流石に即クラッシュはしないだろうけどね。
0336デフォルトの名無しさん
2007/11/15(木) 14:02:360337デフォルトの名無しさん
2007/11/15(木) 17:44:010338デフォルトの名無しさん
2007/11/15(木) 17:57:270339デフォルトの名無しさん
2007/11/15(木) 18:16:43そもそも誰か、境界の話なんてしているんですか?
0340デフォルトの名無しさん
2007/11/15(木) 18:31:330341wolf ◆8VH3XAqjlU
2007/11/15(木) 22:09:24*** For your reference ***
Windows. _heapwalk (CRT)
http://msdn2.microsoft.com/en-us/library/h0c183dk(VS.80).aspx
Linux 2.4x
src\drivers\char\drm\sis_ds.c "void mmDumpMemInfo( memHeap_t *mmInit )"
0342デフォルトの名無しさん
2007/11/16(金) 13:49:41単純な文章をファイル出力させようとfoutを使っているのですが
”(ダブルクォーテーション)
って奴はどうやったら出力できますか?
囲みを’に変えてみたりしたがうまくいかねえ…
0343デフォルトの名無しさん
2007/11/16(金) 13:58:430344デフォルトの名無しさん
2007/11/16(金) 15:06:55MFCDLLにはMFCのクラスのポインタを引数としたエクスポート関数があります。
MFCDLLでそのクラスをnewし、アプリケーション側でdeleteしています。
この両者が、プロジェクトの設定の"MFCの使用"を"共有DLLでMFCを使用する"
の設定だったらうまく動いてるけれど、
"スタティックライブラリでMFCを使用する"の設定にすると、アプリケーション側で
DLLでnewしたクラスをdeleteしたタイミングでハングします。
なぜスタティックリンクすると、だめなんでしょうか。
0345344
2007/11/16(金) 15:07:370346デフォルトの名無しさん
2007/11/16(金) 15:19:42サンクスです。それをやってもできないから質問したのに、
そこ以外の場所でミスってるとは思わなかった…
0347デフォルトの名無しさん
2007/11/16(金) 15:20:26EXEにスタティックリンクされたMFCとDLLにスタティックリンクされたMFCの2つのMFCが存在することになるから管理が混乱するんじゃないの
0348デフォルトの名無しさん
2007/11/16(金) 22:43:06ってのは嘘だけど、newもdeleteもアプリ側で行うようにできないのかね?
0349デフォルトの名無しさん
2007/11/16(金) 23:02:27関数のオーバーロードをした際、引数がぴたりとあってない場合に
「引数の型があいまいです」とでますよね。
暗黙の型変換をがんばろうとして駄目だった。ということはわかるのですが
どういう優先度でがんばろうとしてるのか、色々実験してみても法則がわかりませんでした
C++における「関数オーバーロード時の呼び出し優先順位の決め方」みたいなものを教えていただけませんでしょうか
0350OPENCV
2007/11/16(金) 23:36:35ttp://www.seman.cs.uec.ac.jp/~takahashi/OpenCV/functions/index.htm
などを参考にすれば導入できるはずなのですが、
デバッグなしで開始をしたときに、
「プログラム 'C:\Users\koizumi\Documents\Visual Studio 2005\Projects\cv
\debug\cv.exe'を開始できません。
指定されたパスが見つかりません」
と言われてしまいます。
リンカの設定で
追加のライブラリディレクトリ--C:\Program Files\OpenCV\lib
追加の依存ファイル--cv.lib cxcore.lib cvaux.lib highgui.lib
と設定しましたし、
インクルードファイル、ライブラリファイルのパス設定もしました。
どこが悪いかわかる方がいらっしゃいましたら、教えてください。
よろしくお願いします。
0351デフォルトの名無しさん
2007/11/16(金) 23:44:58cv.exeが見つからないって感じに見えるんだけどコイズミくん。
0352OPENCV
2007/11/17(土) 00:00:45お返事ありがとうございます。
ビルドしたとき、エラーになっている感じはありません。
========== ビルド: 0 正常終了、0 失敗、1 更新、0 スキップ ==========
いつものようにデバッグなしで開始が通るときは、
Documentsフォルダの中にexeファイルができるのですが、
今回はexeファイル自体が作成されていないようです。
何かわかることがあれば、コメントお願いします。
0353デフォルトの名無しさん
2007/11/17(土) 00:16:55プログラミング言語C++を見てみろ
0354デフォルトの名無しさん
2007/11/17(土) 00:50:48JIS の規格買うか、 JIS の糞思い pdf を見るか、 ISO のドラフトダウンロードするか。
0355OPENCV
2007/11/17(土) 08:08:15>>354
コメントありがとうございます。
プログラミング言語C++は規格についても書かれた本のようですね。ただ、高い。。。
JISの規格は、私ではなおさら分からなくなりそう。。。
もう少し格闘してみます。
それで分からなければまた質問させてください。それでは。
0356デフォルトの名無しさん
2007/11/17(土) 08:27:27ルールを見る前に格闘したって時間の無駄。
先に確認すればいだろ。
0357デフォルトの名無しさん
2007/11/17(土) 09:02:21ScreenFlip関数ってのは、「表示する画面を入れ替える」なんでしょうか、それとも「書き込む画面を入れ替える」なんでしょうか?
0358357
2007/11/17(土) 09:07:00すんません
0359デフォルトの名無しさん
2007/11/17(土) 15:31:07>>355
プログラミング言語C++(第3版)の7.4(p193)にあります。立ち読みでどうぞ。
0360デフォルトの名無しさん
2007/11/17(土) 15:39:450361デフォルトの名無しさん
2007/11/17(土) 15:56:49MFCでメンバ変数のCFontをOnInitDialog内でダイアログのコントロールに設定してますが、
なぜかフォントの種類がMS ゴシックになってしまいます。
デフォルトはダイアログエディタでMS 明朝にしてます。
が、SetFontを呼ぶとサイズはCreatePointFontで指定したサイズになりますが、
なぜかフォントの種類が勝手にMS ゴシックになってしまうのです。
フォントには何を指定してもだめでした。(意味はなくてもMS 明朝で試しましたがMS ゴシックになりました)
サイズは変わってるのに何故でしょうか?
0362361
2007/11/17(土) 16:22:41フォント作成時に指定したフォント名に1バイト余計な空白がありました。
なのにCreatePointFontが成功を返してたので気づきませんでした。
0364デフォルトの名無しさん
2007/11/18(日) 13:34:54char *utf8Char に、ヌルターミネイトされたUTF8のバイト列が入っています。
("wb"でfopenして、fwrite( utf8Char, strlen( utf8Char), 1, fp )したものを
テキストエディタでUTF8指定で開くとちゃんと読める。
何もせずにcoutしてDOS窓に出すと、ASCII文字は読めるけど日本語が化ける)
これを_bstr_t型の変数に入れ込みたいのですが、どうすれば良いのでしょうか。
_bstr_t utf8Bstr( utf8Char );
cout << _com_util::ConvertBSTRToString( utf8Bstr ) << endl;
とすると、全体が文字化けしたようになりますし、
WideCharToMultibyteで別のchar *hogeに入れて、cout << hoge << endl;
としても文字化けしました…。
0365デフォルトの名無しさん
2007/11/18(日) 14:14:04だから、MultiByte2WideCharなんかで、UTF-8を明示した上で、WCHAR変換をかける。
これ以外の、ソースエンコーディングの指定がない変換系関数は、だいたい
ANSIコード(日本ではCP932)を仮定するので、変換が破綻する。
0366デフォルトの名無しさん
2007/11/18(日) 16:15:42http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200701/07010007.txt
このページの最後の方にある、UTF8ToUTF16という処理であってますでしょうか?
手元に開発環境がないので、今試せないのですが…。
0367デフォルトの名無しさん
2007/11/18(日) 18:12:18CComPtr< IHage > hage;
//hoge->HageがIHageのインスタンスを持つ処理
hage = hoge->Hage;
としたとき、その後すぐ hoge.Release() としてもいいんでしょうか。
した後でもhageはNULLになったりしてないようですが、
それはたまたまメモリがそのままになってるだけで、本当はhageを完全に使い終わってから
hage.Release();
hoge.Release();
としなければならないのでしょうか。
0368デフォルトの名無しさん
2007/11/18(日) 19:43:29それでもあってはいるけど、俺だったら直接_bstr_tへ書き込むようにする。
BOOL UTF8ToUTF16(const char* data, const int len, _bstr_t& ret)
{
if (!data)
{
return FALSE;
}
if (len == 0)
{
ret = L"";
return TRUE;
}
_bstr_t t;
const int wlen = ::MultiByteToWideChar(CP_UTF8, 0, data, len, NULL, 0);
if (wlen == 0)
{
return FALSE;
}
t.Attach(SysAllocStringLen(0, wlen));
if (t.GetBSTR() == 0)
{
return FALSE;
}
if (::MultiByteToWideChar(CP_UTF8, 0, data, len, t.GetBSTR(), wlen) != 0)
{
ret = t;
return TRUE;
}
return FALSE;
}
0369デフォルトの名無しさん
2007/11/18(日) 19:46:13そのための参照カウントなのだから大丈夫。
そもそもCComPtr使うんだったら、
必要に迫られない限りReleaseを明示的に呼ぶ必要もないと思うけど。
0370デフォルトの名無しさん
2007/11/18(日) 19:50:32VC++なら_com_ptr_t使ったほうがよくね?
0371デフォルトの名無しさん
2007/11/18(日) 19:52:24理論上はhoge.Release()を先にしても問題無いし、そう実装されているべき。
ただ、OfficeのApplicationオブジェクトとかで、
稀に子オブジェクトも一緒くたに無効化してしまうことがあるので、
一応頭の片隅に置いておくといい。
昔の話かもしれないけど。
0372デフォルトの名無しさん
2007/11/18(日) 19:58:16_COM_SMARTPTR_TYPEDEF ('A`)マンドクセ
例外対応 ('A`)マンドクセ
ATLのシンプルな構造 (゚д゚)ウマー
0373デフォルトの名無しさん
2007/11/18(日) 20:09:14int x;
int y;
};
というクラスの「ポインタ」がたくさん入ったvectorがあるとして、
例えばこれを各ポインタが指しているxでソートすることってできますか?
ポインタでなければ<の定義でできると思うんですが、
ポインタの場合どうやって書いたらよいか分かりません。
もし可能でしたら書き方を教えてください。お願いします。
0374デフォルトの名無しさん
2007/11/18(日) 20:11:360375デフォルトの名無しさん
2007/11/18(日) 20:17:19>>374 アリ。
0376デフォルトの名無しさん
2007/11/18(日) 20:32:08#include <functional>
#include <vector>
#include <cassert>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
struct Value {
int x;
int y;
};
struct comparator : public std::binary_function<const Value*, const Value*, bool> {
result_type operator()(first_argument_type lhs, second_argument_type rhs) const {
return lhs->x > rhs->x;
}
};
int main() {
Value v0 = { 1,2 }, v1 = { 2,3};
std::vector<Value*> v;
v.push_back(&v0);
v.push_back(&v1);
std::sort(v.begin(), v.end(), comparator());
assert(v[0]->x == 2 || v[0]->y == 3);
using namespace boost::lambda;
std::sort(v.begin(), v.end(), bind(&Value::x, *_1) < bind(&Value::x, *_2));
assert(v[0]->x == 1 || v[0]->y == 2);
}
どっちにしろ大概だな
0377デフォルトの名無しさん
2007/11/18(日) 20:36:13bool hoge_less_x(hoge const* lhs, hoge const* rhs) { return lhs->x < rhs->x; }
でいいだろ。
0378デフォルトの名無しさん
2007/11/18(日) 20:50:59ども。
とりあえず比較関数を渡せるsortってのを試してみようと思います。
ありがとうございました。
0379デフォルトの名無しさん
2007/11/19(月) 02:46:28という関数があった場合、
doSomething(&Widget());
という風にWidgetのオブジェクトを引数で作成して、そのままアドレス取って呼び出すのは、全く問題ないですか?
0380デフォルトの名無しさん
2007/11/19(月) 05:50:07そのオブジェクトがなくなってしまっていても
いいならいいんじゃないの
0381デフォルトの名無しさん
2007/11/19(月) 09:10:290382デフォルトの名無しさん
2007/11/19(月) 10:47:53&演算子はオブジェクトに対しては左辺値にしか適用できないんでないか?
0383デフォルトの名無しさん
2007/11/19(月) 12:51:390384デフォルトの名無しさん
2007/11/19(月) 12:56:300385デフォルトの名無しさん
2007/11/19(月) 13:05:51ファイルを閉じるときに、
fp.close();
while( fp && fp.fail() )Sleep(10);
とやると良いよ
まだ閉じていないで次のやつを開くと駄目だからだ
0386デフォルトの名無しさん
2007/11/19(月) 13:08:05class A{
public:
A(){}
int operator&(){return 123;}
};
int main()
{
printf("%d\n", &A());
}
0387デフォルトの名無しさん
2007/11/19(月) 13:14:37まずは、その必要性をよく考えたほうがいい。
0388デフォルトの名無しさん
2007/11/19(月) 13:15:31379はあくまでアドレスが欲しいわけだから意味ないんでない?
0389デフォルトの名無しさん
2007/11/19(月) 13:32:34#include <string.h>
char s[] = "This is a pen. That is an apple.";
void main(void)
{ char check[256],str[256];
int i;
printf("This is a pen. That is an apple.\n\n");
gets(str);
for(i=0;str[i]==s[i];i++)
{
check[i]=strcmp(str[i],s[i]);
if (check[i]==0)
{printf("ok");}
else
{printf("ng");}}}
初期化した文字列と入力した文字列strに対しThis is〜がstrで始まっているかどうかを
判定するプログラムですが、check[i]=strcmp(str[i],s[i]);にてエラーが出ます。
教えてください(例えばThis→OK,Th→OK,Thos→NG.....)
0390デフォルトの名無しさん
2007/11/19(月) 14:05:06char s[] = "This is a pen. That is an apple.";
int main(void)
{ char check[256],str[256];
int i,checker;
printf("This is a pen. That is an apple.\n\n");
gets(str);
for(i=0;str[i]!='\0';i++)
if(str[i]==s[i])
{
checker=1;
}
else
{
checker=0;
break;
}
if(checker==0)
{
printf("NG!その文字列から始まっていません。\n");
}
else
{
printf("OK!その文字列から始まっています。\n");
}
}
これでいけた
0391デフォルトの名無しさん
2007/11/19(月) 14:10:470392デフォルトの名無しさん
2007/11/19(月) 15:06:09この関数はlexicographical_compare(s1, s2);
とした場合、辞書順でs1がs2より前にあるときにtrueを返し、
そうでないときfalseを返すため、文字列の一致は判定できない
と思います。
この関数を使って二つの文字列(string)が等しいことを判定するためには
lexicographical_compare(s1, s2); //false (s1はs2の前にはない)
lexicographical_compare(s2, s1); //false (s2はs1の前にはない)
がともにfalseを返すことを確認しなければいけないのでしょうか?
0393デフォルトの名無しさん
2007/11/19(月) 15:43:510394392
2007/11/19(月) 15:47:44方法として以下のコードがあるのですが、これでは一致を
判定できないのでは?と思ったんです。
bool ciStringCompare(const string &s1, const string &s2)
{
return lexicographical_compare(s1.begin(), s1.end(),
s2.begin(), s2.end(),
ciCharLess);
}
// 1文字の比較
bool ciCharLess(char c1, char c2)
{
return tolower(static_cast<unsigned char>(c1)) <
tolower(static_cast<unsigend char>(c2));
}
0395デフォルトの名無しさん
2007/11/19(月) 15:55:50言いたいことがわからん。大文字小文字区別しないならその範囲で
しか一致は判定できないのでは?そんだけじゃないの?
0396392
2007/11/19(月) 17:03:12上記のプログラムでいうと
lexicographical_compareでは一方の文字列が他方のものより
辞書順で前にあるかないかは判定できますが、一致は判定
できないのでは?という意味です。
たとえば、ciStringCompareで二つのstringが一致
するかどうかを判定できるなら
ciStringCompare("ABC", "abc");
はtrueを返すと思ったのですが、呼び出している
lexicographical_compareの仕様ではfalseになります
よね?結局文字列の一致は判定できないのではないかと。
ソース Effective STL 第35項
0397デフォルトの名無しさん
2007/11/19(月) 17:27:33ttp://www.aristeia.com/BookErrata/estl1e-errata_frames.html
0398デフォルトの名無しさん
2007/11/19(月) 18:01:30また、どの部分に依存してますか?
0399デフォルトの名無しさん
2007/11/19(月) 18:09:15CPU,メモリも大事だけど、HDDが高速な方がいい。
ヘッダやライブラリ等がIDE接続のフラッシュメモリにあるとコンパイルは早い。
たぶんね。
0400デフォルトの名無しさん
2007/11/19(月) 18:19:26コンパイルするやつもある。
0401デフォルトの名無しさん
2007/11/19(月) 18:31:190402デフォルトの名無しさん
2007/11/19(月) 18:38:58スワップが発生したらかなりの速度低下になるし、逆にパフォーマンス改善としては一番コストパフォーマンスがいいかも
最初から2Gとか積んでたらほとんど変わらないだろうがね
ちなみにクロック速度は殆ど関係ないと思うけど、実際はどうなんだろう
0404デフォルトの名無しさん
2007/11/19(月) 19:24:08thisを返すoperator &をメンバとして定義すれば可能なはず。
誰がやるかそんなもん、って程度のことだが。
0405デフォルトの名無しさん
2007/11/19(月) 22:50:54すいません、t.Attachのところなんですけど、_bstr_tにAttachという
メソッドが見あたらなかったんですが…。
何かをインクルードすればいいのでしょうか?
0406デフォルトの名無しさん
2007/11/19(月) 22:53:110407デフォルトの名無しさん
2007/11/20(火) 00:19:01CComPtr< _bstr_t > t;
とかって…。
違う気がする。
すみません!教えてください!
>>368そのままではコンパイラ通らないので…。
0408デフォルトの名無しさん
2007/11/20(火) 01:32:14バージョンは何?
少なくともVC++ 7.1にはあるはずなんだけど。
http://msdn2.microsoft.com/en-us/library/c671cyay(VS.71).aspx
0409デフォルトの名無しさん
2007/11/20(火) 03:01:35あてずっぽうだけど
0410デフォルトの名無しさん
2007/11/20(火) 06:54:36VC6です。
0411デフォルトの名無しさん
2007/11/20(火) 17:10:12キューブ状態のものにLogo.bmpをテクスチャで貼り付けてクルクル回したスクリーンセーバを作りたいと考えました
OMEGA POINT - プログラミング(OpenGL,数学,画像処理,Win32API, C++) -
http://omega-point.ddo.jp/programming/opengl/index.html
の上から2コ目のzipファイルが使えそうだったのでホイホイ弄ってたら画像の読み込みで壁にぶつかりました
現在はキューブがクルクル回っているところですが、画像は読み込めてません
MFC使ってないのでBitmap定義が使えないみたいなんです ( ; ; )
ResouceFilesにはLogo.bmp(256*256)を登録してあるのでどうにかして触る方法がありませんか?
何かを勘違いしてる場合は指摘してくださいー
0412デフォルトの名無しさん
2007/11/20(火) 17:42:070413デフォルトの名無しさん
2007/11/20(火) 20:51:20例えば
char File_Name[30];
fout.open(File_Name,ios::out);
とした場合、File_Nameに文章を詰め込む(File_Name="Function_Name")
みたいなことはできますか?
いや、できないことはなさげだけど、string型が詰められないとなると手がない…
0414デフォルトの名無しさん
2007/11/20(火) 20:56:150415デフォルトの名無しさん
2007/11/20(火) 21:01:51Cでは char Filename[] と char * Filename は同じモノ
つまりFilename[]="name"としてれば
0416デフォルトの名無しさん
2007/11/20(火) 21:46:21え?
0417デフォルトの名無しさん
2007/11/20(火) 21:49:26ろ?
0418デフォルトの名無しさん
2007/11/20(火) 21:50:29>Cでは char Filename[] と char * Filename は同じモノ
違う。前者はあくまで配列で、後者はポインタ。
関数の仮引数としてなら同義だ。
void func(char Filename[]);
void func(char *Filename);
0419デフォルトの名無しさん
2007/11/20(火) 21:53:01どうしてもというならstrcpyでも使えば?
stringのc_str使えばいいとは思うけど。
string File_Name;
fout.open(File_Name.c_str(),ios::out);
0420419
2007/11/20(火) 21:54:23string File_Name("Function_Name");
0421デフォルトの名無しさん
2007/11/20(火) 21:57:22{
strcpy( buf, src ):
return src;
}
0422デフォルトの名無しさん
2007/11/20(火) 22:08:300423デフォルトの名無しさん
2007/11/20(火) 22:09:100424デフォルトの名無しさん
2007/11/20(火) 22:53:460425デフォルトの名無しさん
2007/11/20(火) 23:21:450426デフォルトの名無しさん
2007/11/20(火) 23:25:200427デフォルトの名無しさん
2007/11/20(火) 23:51:290428デフォルトの名無しさん
2007/11/21(水) 00:32:33馬鹿ですか?
0429デフォルトの名無しさん
2007/11/21(水) 01:12:010430デフォルトの名無しさん
2007/11/21(水) 01:21:33ここまで理解できてたらこれから先も呑み込めて行けそうじゃね?
間違いを受け止める心があればだけど・・・
0431デフォルトの名無しさん
2007/11/21(水) 16:06:24daemonを作りたいときに、
#include <stdlib.h>
int daemon(int nochdir, int noclose);
呼ぶのと、
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
を2回呼ぶのって、実用上何か大きな違いはありますか?
0432デフォルトの名無しさん
2007/11/21(水) 16:11:340433デフォルトの名無しさん
2007/11/21(水) 16:12:46じゃあ、fork()しかない環境ではforkを2回にして、
daemon()がある環境ではdaemon()使っとけって感じですかね。
0434wolf ◆8VH3XAqjlU
2007/11/21(水) 21:32:30*** For your reference ***
How to Daemonize in Linux [Doug Potter]
http://www-theorie.physik.unizh.ch/~dpotter/howto/daemonize
0435デフォルトの名無しさん
2007/11/21(水) 22:16:54と、djb教授がお怒りです(嘘
0436デフォルトの名無しさん
2007/11/22(木) 12:04:210437デフォルトの名無しさん
2007/11/22(木) 12:06:31fprintf(fp , )は出来ないですけどsprintfでchar配列に入れて出力すれば出来ますね
0438デフォルトの名無しさん
2007/11/22(木) 12:50:29機能の上位機能についてです
0439438
2007/11/22(木) 13:11:03うちのパソコン鈍いので保存に二日かかりそうなんですが
あとこれってテキストファイルやhtmlに変換できますか
0440デフォルトの名無しさん
2007/11/22(木) 13:17:09<<演算子とマニピュレータ使えばできるんじゃない?
0441デフォルトの名無しさん
2007/11/22(木) 20:54:43MFCのこと?
>>439
MSDNライブラリの各記事の実体はHTML。
ただし、複数ファイルをまとめて圧縮した形で格納されている。
ms-help:で始まるURLを使えばIEからも見れる。
0442デフォルトの名無しさん
2007/11/23(金) 05:06:20> next の代わりに (++lst.begin()) と書けば良いではないか?と思われるかもしれませんが、
> begin() の返すイテレータが例えば int* などの組込型であった場合、
> 残念ながらその記述はコンパイルエラーになってしまいます。
どうしてコンパイルエラーになってしまうのですか?
0443デフォルトの名無しさん
2007/11/23(金) 05:33:15++0; がエラーなのと同じ。
0444デフォルトの名無しさん
2007/11/23(金) 05:39:36前置++の対象は変更可能な左辺値じゃない許されない(5.3.2)
から?
規格書買っちゃったけどイマイチ読みかたがわからねぇや
0446デフォルトの名無しさん
2007/11/23(金) 06:52:27++foo(); // エラー
0447デフォルトの名無しさん
2007/11/23(金) 14:35:51#include <stdio.h>
int *get_number(void){
static int number[2]={0,999};
return number;
}
int main(void){
printf("%d\n", ++*get_number());
printf("%d\n", ++*get_number());
printf("%d\n", (*get_number())++);
printf("%d\n", (*get_number())++);
printf("%d\n", *get_number()+1);
printf("%d\n", *(get_number()+1));
return 0;
}
0448デフォルトの名無しさん
2007/11/23(金) 14:37:57何が目的?
0449デフォルトの名無しさん
2007/11/23(金) 14:44:32なんとなく書いてみただけからスルーしてもらっておkです
#include <stdio.h>
typedef void (*func_t)(void);
typedef func_t (*func2_t)(void);
void hello(void){printf("Hello\n");}
func_t hello_func(void){return hello;}
func2_t hello_func_func(void){return hello_func;}
int main(void){
hello_func_func()()();
return 0;
}
0450デフォルトの名無しさん
2007/11/23(金) 14:45:200451デフォルトの名無しさん
2007/11/23(金) 17:01:21Aは1秒ごとに、Bは5秒ごとに呼ばれるものとします。
この1秒と5秒はおおよそで良いので、sleepで止めます。
このAとBを並行して実行させたいとき、
普通はマルチスレッドにするものですか?
Linuxです。
0452デフォルトの名無しさん
2007/11/23(金) 17:03:530453451
2007/11/23(金) 17:16:07そこまでは「およそ」じゃないんです。
リアルタイム性は要らない程度の意味でした。
設定秒数を渡して5秒とか1秒ってのは変わりうるので。
0454デフォルトの名無しさん
2007/11/23(金) 17:40:440455デフォルトの名無しさん
2007/11/23(金) 17:42:29sleep(1);
++cnt;
if (cnt % intervalA == 0) A();
if (cnt % intervalB == 0) B();
}
0457デフォルトの名無しさん
2007/11/23(金) 18:39:37どれくらいの誤差まで許されるかが問題だな
0458デフォルトの名無しさん
2007/11/23(金) 18:40:50だからなんなんだw
455のソースをms単位に変更するだけじゃないか
0459デフォルトの名無しさん
2007/11/23(金) 18:44:390460デフォルトの名無しさん
2007/11/23(金) 18:59:330461デフォルトの名無しさん
2007/11/23(金) 22:10:54いきなりスコープ解決演算子を二つ続けて、関数を呼び出す意味が分からないのですが、
普通は [クラス名] :: [関数名]() のようにして、どのクラスのメソッドを呼び出しているか
指定する為に使うんですよね?
誰かクラス名が無い場合の意味を教えてください
0462デフォルトの名無しさん
2007/11/23(金) 22:19:15そこらへんは趣味の世界だし
0463デフォルトの名無しさん
2007/11/23(金) 22:22:29そのクラスに属していない、グローバルネームスペースの関数を呼び出すことを明示するために使う。
MFCのソースはその典型。
0464デフォルトの名無しさん
2007/11/23(金) 22:23:41どこのクラスにも名前空間にも属していない名前を明示的に指定したいときに使う。
void f(); //(1)
class Hoge
{
void f(); //(2)
void g()
{
::f(); //(1)を呼ぶ
f(); //(2)を呼ぶ
this->f(); //(2)を呼ぶ
}
};
0465デフォルトの名無しさん
2007/11/23(金) 22:37:18ありがとうございます
なくても良かったんですね^^;
聞いて本当によかった。もうすぐ発狂するところでした。
0466デフォルトの名無しさん
2007/11/23(金) 22:47:33分かっているとは思うけど、「なくても良い」ではないよ。
>>464の(1)を呼ぶ例のように、場面によっては必要だからね。
0467デフォルトの名無しさん
2007/11/23(金) 22:57:440468デフォルトの名無しさん
2007/11/23(金) 22:58:29>>464を読んで「なくても良かった」という結論はないな。
0469デフォルトの名無しさん
2007/11/23(金) 23:42:390470デフォルトの名無しさん
2007/11/24(土) 00:11:40かったるいし。
0471デフォルトの名無しさん
2007/11/24(土) 22:04:08Visual Studio .NET 2005 C++ の WIN32 プロジェクトで、
TRACE("hogehoge="+hogehoge)
のように、自分用デバッグログを出力ウィンドウかどこかに出したいのですが、方法がわかりません。
標準出力に出力してもどこにも出力されていません(と思う)
どなたかご教授お願いいたします。
0472デフォルトの名無しさん
2007/11/24(土) 22:19:47基本はOutputDebugString。ただし引数は文字列の一つのみ。
CRTのデバッグルーチンも悪くないが、引数が真面目過ぎて多少面倒。
void dbgprintf (LPCTSTR fmt, ...)
みたいなのを自分で用意しておくのが無難じゃないかな。
0473デフォルトの名無しさん
2007/11/24(土) 22:51:16C言語を使って構文解析ソフトCaboChaを使いたいのですが
ttp://chasen.org/~taku/software/cabocha/libcabocha.html
↑このサイトの通りに以下のプログラムを実行してみたのですが
Undefined symbol: cabocha_destroy_
Undefined symbol: cabocha_new_
Undefined symbol: cabocha_sparse_tostr_
↑このようなエラーが表示されてうまくできません。
どなたかわかるかたいらっしゃいませんか?
〜実行したプログラム〜
#include <cabocha.h>
#include <stdio.h>
int main (int argc, char **argv)
{
cabocha_t *c;
char p[1024] = "太郎は次郎が持っている本を花子に渡した。";
c = cabocha_new(argc, argv);
printf ("INPUT: %s\n", p);
printf ("RESULT:\n%s", cabocha_sparse_tostr(c, p));
cabocha_destroy(c);
return 0;
}
0474デフォルトの名無しさん
2007/11/24(土) 22:54:04以下がソースです。
ifstream fin;
TCHAR line[252];
LPTSTR buff[3];
int result[64][3];
stringstream ss;
fin.open(_T("temp.csv"));
if(!fin.is_open()) // 開いていなければ、FALSEを返す
{
return FALSE;
}
int i = 0;
while (!fin.eof()){
fin.getline(&line[0],sizeof(line));
buff[0] = strtok(line,",");
buff[1] = strtok(NULL,",");
buff[2] = strtok(NULL,",");
ss.str(""); //stringstreamをクリア
ss << buff[0] << _T(" ") << buff[1] << _T(" ") << buff[2];
ss >> result[i][0] >> result[i][1] >> result[i][2];
//カウンタ
i++;
}
fin.close();
0475デフォルトの名無しさん
2007/11/24(土) 22:54:372,2,49,
2,4,0,
...
2,46,27
2,48,0
fin.close()のひとつ前の行でブレークポイントを入れると「アクセス違反」のエラーがでます。
i++の行でブレークポイントを入れると、i=0のときはうまくresult配列にデータが入ってくれますが、
i=1以降は、何も代入されないようです。
これを直す方法をご教授くださいませんか。
なお、今回のcsvファイルにはint型に代入するデータしかありませんが、
以下のような文字交じりのcsvファイルも使用したいので、string型の変数に代入する予定です。
36,1,1,3,Orange,50,長崎
24,1,2,2,Red,50,静岡
...
↑のプログラムがうまくいっていたら、stringstreamから>>演算子でstring型の変数に代入するつもりでしたが、
stringに代入するにあたって、何か注意するべき点がありましたら、ご教授ください
0476デフォルトの名無しさん
2007/11/24(土) 22:55:44「コンパイル方法」の項を読めば分かる
0477471
2007/11/24(土) 23:17:36お答いただいてありがとうございます。
OutputDebugString("hoge");
でコンパイルすると、
error C2664: 'OutputDebugStringW' : 1 番目の引数を 'const char [5]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
とコンパイルエラーにになり(昔はでなかったような)、そこで
const char a[] = "hoge";
OutputDebugString((LPCWSTR)a);
とやってみたところ、コンパイルは通り、実行もできるのですが、残念ながらあいかわらずどこに"hoge"が出力されるのかわかりませんでした。
何か良い方法がありましたらお願いします。
0478デフォルトの名無しさん
2007/11/24(土) 23:18:32OutputDebugStringA
0479デフォルトの名無しさん
2007/11/24(土) 23:51:42の方が好みだなー
0480471
2007/11/25(日) 00:00:46OutputDebugStringA !!目から鱗ありがとうございます!!!
コンソールにも出したかったのですが、これは一応自己解決しましたのでご報告。
FILE *stream;
if (!::AttachConsole(ATTACH_PARENT_PROCESS)) { //XP以降はアタッチ
::AllocConsole(); //無理な場合は新たに開く
}
freopen_s(&stream, "CON", "r", stdin); // 標準入力の割り当て
freopen_s(&stream, "CON", "w", stdout); // 標準出力の割り当て
cout << "hoge" << endl;
::FreeConsole(); //アタッチ解放
以上です、ありがとうございました!
0481デフォルトの名無しさん
2007/11/25(日) 00:02:560483デフォルトの名無しさん
2007/11/25(日) 13:11:04cout << "ok" << endl;
else
cout << "ng" << endl;
この場合はokと表示されるのですが
if ("aa" < "bb")
cout << "ok" << endl;
else
cout << "ng" << endl;
この場合はngと表示されます。
aのほうが文字コードが小さいのでokと表示されることを期待しているのですが
なぜこうなってしまうのでしょうか?
0484デフォルトの名無しさん
2007/11/25(日) 13:15:39大小を比較しているだけだよ。
文字順の比較をしたければ strcmp などを使え。
上記の意味が分からなければ、まずはちゃんとした入門書などを読んだほうがいい。
0485デフォルトの名無しさん
2007/11/25(日) 14:39:570486デフォルトの名無しさん
2007/11/25(日) 15:45:20それは文字列が格納されているメモリアドレスを比較してるだけ
文字列の内容を比較したいなら strcmp を使え
0487デフォルトの名無しさん
2007/11/25(日) 16:09:55つ[ std::string("aa") < std::string("bb")]
0488デフォルトの名無しさん
2007/11/25(日) 16:17:47共通ヘッダ: typedef struct TAG TYPE_NAME;
TYPE_NAME nantoka1;
ソースA: struct TAG { int a; int b; };
ソースB: nantoka1 = { 3, 5 }
こんな風にしてみたんですが、ソースBは 'TAG' を認識してくれません。
どうすればいいでしょうか
0489デフォルトの名無しさん
2007/11/25(日) 16:27:38共通ヘッダ:
struct TAG { int a; int b; };
extern struct TAG nantoka1;
ソースA:
いらない。
ソースB:
struct TAG nantoka1 = {3, 5}
0490デフォルトの名無しさん
2007/11/25(日) 16:39:43nantoka1が必要なソースでexternするようにした方がいいと思う。
0491488
2007/11/25(日) 17:05:020492デフォルトの名無しさん
2007/11/25(日) 23:01:29連結リストの先頭のHeadをポインタで宣言しないのはどうして?
ポインタで宣言したほうが構造体分無駄にならなくなくない?
0493デフォルトの名無しさん
2007/11/25(日) 23:03:56以下がVC+2005ではコンパイル・実行できますが、Linux g++ 4.0ではコンパイル
できません。エラーコードはテンプレートだらけでよくわかりません。
何が違うのでしょうか?
#include <iostream>
#include <boost/bind.hpp>
using namespace std;
using namespace boost;
int someKeisan(int n1, int n2)
{
return n1 * n2;
}
int main()
{
cout << bind(someKeisan, _1, 10)(6) << endl;
return 0;
}
0494デフォルトの名無しさん
2007/11/25(日) 23:06:44ポインタで宣言できるなら、そうすればいいんじゃないか?
むしろ、先頭用の構造体を持ってる実装のほうが珍しいと思うが。
0495デフォルトの名無しさん
2007/11/25(日) 23:11:42そうなの?
Googleとかで引っかかるサイトだと普通に宣言してるのが多いから
そういうもんかと思ってたよ
何にしてもありがとう
疑問が一つ解けたよ
0496デフォルトの名無しさん
2007/11/25(日) 23:16:08Cygwinでg++ 4.1.1だけどコンパイルできたよ。
0497デフォルトの名無しさん
2007/11/25(日) 23:17:45「連結リスト」でググって一番上にあるサイトからポインタで実装してるぞw
その次のはダミー作ってたけど。
0498デフォルトの名無しさん
2007/11/25(日) 23:18:38ヘッダーも存在してるし、
実装が未熟なんですかね?
0499デフォルトの名無しさん
2007/11/25(日) 23:22:47OS : Fedora Core 4
g++ 4.0.0でデフォルトのものを使ってます。
0500デフォルトの名無しさん
2007/11/25(日) 23:26:35boostを入れてないってことないか?
0501デフォルトの名無しさん
2007/11/25(日) 23:29:22functionやtokenizerは動作しますんで
boostは入ってると思います。
/usr/include/boostにhppファイルはあります。
0502デフォルトの名無しさん
2007/11/25(日) 23:41:100503デフォルトの名無しさん
2007/11/26(月) 00:02:09先頭要素が必ず存在するようにしたほうがコードを簡略化できるケースもあるから
あえてポインタではなく構造体を使用するということもあるよ。
よほど大きな構造体でない限り、高々1個を省略することは大きな意味はないから。
0504デフォルトの名無しさん
2007/11/26(月) 00:22:16そうですか。
tr1/functionalヘッダとtr1::placeholdersを指定しても
ダメでした。
VC++で我慢します。
0505502
2007/11/26(月) 01:38:50以下結果と環境だけ。エラーメッセージは長いので省きます。
[FreeBSD 6.2R : コンパイル成功]
>GNU C++ version 3.4.6 [FreeBSD] 20060305 (i386-undermydesk-freebsd)
> compiled by GNU C version 3.4.6 [FreeBSD] 20060305.
>GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
[ Fedora7 : コンパイル失敗 ]
>GNU C++ version 4.1.2 20070925 (Red Hat 4.1.2-27) (i386-redhat-linux)
> compiled by GNU C version 4.1.2 20070925 (Red Hat 4.1.2-27).
>GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=129178
[ Cygwin : コンパイル失敗 ]
>GNU C++ version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) (i686-pc-cygwin)
> compiled by GNU C version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125).
>GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
コンパイル失敗した二つは同じエラーが出てる。
>a.cpp:13: error: no match for call to ‘(boost::_bi::bind_t<int, int (*)(int, int), boost::_bi::list2<boost::arg<1>, boost::_bi::value<int> > >) (int)’
0506503
2007/11/26(月) 01:49:36以下boost/version.hpp 内の定義比較。
[FreeBSD 6.2R]
>#define BOOST_VERSION 103401
>#define BOOST_LIB_VERSION "1_34_1"
[Fedora7][Cygwin]
>#define BOOST_VERSION 103301
>#define BOOST_LIB_VERSION "1_33_1"
コンパイル成功したFreeBSDだけ、1_34_1 だ
0507502
2007/11/26(月) 01:51:57これがboostのバージョンが原因なら、boostバージョンアップで解決するかもね。
0508デフォルトの名無しさん
2007/11/26(月) 02:06:32にしたらどう?
0509502
2007/11/26(月) 02:19:41なんか修正されたんだな。リリースノートどこにあるんだろ・・・。
とりあえずすっきりした。これで寝れる。
>>508
だめ。
0510デフォルトの名無しさん
2007/11/26(月) 15:06:00VS2005でC++を使って組んでいるのですが、「関数宣言はされているものの実態が存在しない」というリンクエラーが大量に出て困っています。
(私の言う関数とは、クラスの関数。つまりメソッドです)
自分で作ったのなら当然実体も定義するのですが、これは他人のソースで、さらにその人は「とりあえずヘッダに必要そうな関数をかたっぱしから宣言しておく」人のようです。
実体が存在しない関数に関しては「一度も呼び出した無い」そうで、コンパイルオプションだかで「一度も呼び出してない関数は、宣言もろとも無視する」ことができる(そうやって実行ファイルを作りテストした)そうなのですが、どうすればよいのでしょうか?
(残念ながら、そのソースを書いた人自身に質問することができないのです)
0511デフォルトの名無しさん
2007/11/26(月) 15:08:02警告じゃなくて?
0512デフォルトの名無しさん
2007/11/26(月) 15:18:44仮想関数の場合は実体は必要だけどね。
0513デフォルトの名無しさん
2007/11/26(月) 15:19:500514デフォルトの名無しさん
2007/11/26(月) 15:22:34すいません、自己解決しました
>>510は友人の悩みをヒアリングして私が(私の体験っぽく)書き込んだのですが、511の指摘で「確かに警告ならわかるんだけどなぁ」と思い私自身でソースを調べてみました。
単に友人が渡されてるlibファイルを組み込んでいないだけの話でした(ちなみにその関数はちゃんと呼び出されていました。呼び出されていたからこそ警告ではなくエラーとなっていました)
お騒がせしてすいませんでした
0515デフォルトの名無しさん
2007/11/26(月) 15:25:21そんなミスは誰でもよくやることですから気にしなくてよいのですよ。
と、ご友人にはお伝えください。
0516493=504
2007/11/26(月) 15:41:12コンパイル・実行できました。
0517デフォルトの名無しさん
2007/11/26(月) 23:15:38これまでマクロとか使ったことがなくて…教えてください。
#define IX(i,j) ((i)+(N+2)*(j))
と書かれていて
1次元の配列ポインタに x[IX(i,j)]
こう書かれていた場合、どこをアクセスしてるのでしょうか。
また
#define SWAP(x0,x) {float * tmp=x0;x0=x;x=tmp;}
これも意味がわかっていません。
おねがいします、助けてください
0518デフォルトの名無しさん
2007/11/26(月) 23:21:23落ち着いて展開すれば大丈夫。
x[ IX( i, j ) ]→x[ i + N + 2 * j ]
一次元配列を二次元配列のように扱う時に使ったりするかな?
SWAPのほうは単純に2つの値(float *)を入れ替えてるだけ。
SWAP( fp1, fp2 );とかけば
{ float * tmp = fp1; fp1 = fp2; fp2 = tmp; }
0519デフォルトの名無しさん
2007/11/26(月) 23:34:20ものすごい優しく応えてくれて、なんかほんとに涙出てきました。
>一次元配列を二次元配列のように扱う時に使ったりするかな?
まさしくその通りです。
1次元配列の i+N+2*j ということですね。
{1 2 3 4
5 6 7 8
9 8 7 6
5 4 3 2} の場合 2段目の6にアクセスしたいとき N=4だから
IX(1,1) = 1+4+2*1 = 6 つまり、前から6番目の6にアクセスできますね!
ありがとうございます。。。ほんとようやくわかりました(;;
SWAPの方は、入る値は float * 型じゃないとダメ、ですよね?
これに1次元の配列ポインタが入ると、配列そのものが入れ替わる、ということですよね?
ほんと、、、わからなくて、悶々として、誰にも聞けなかったので
本当に助かりました。ありがとうございました(;;
0520デフォルトの名無しさん
2007/11/27(火) 01:11:23>これに1次元の配列ポインタが入ると、配列そのものが入れ替わる、ということですよね
単に変な文章になっているだけかもしれないけど、配列そのものが入れ替わるのではなく、
ポインタが指しているものが入れ替わるだけだよ。
int a[100], b[100];
int *p = a;
int *q = b;
SWAP(a, b); // コンパイルエラー
SWAP(p, q); // pがbを指し、qがaを指すようになる。a, bの実体は何も変わらない。
0521デフォルトの名無しさん
2007/11/27(火) 14:42:13これを高速にソートするにはどういった方法があるのでしょうか?
頻繁にソートが呼び出されるのでバブルソートでいいものなのかどうなのか判断つきません
0522デフォルトの名無しさん
2007/11/27(火) 14:51:15頻繁の程度にもよるし、どの程度の遅さまで許容されるかにもよるし、
実際やってみて遅くなければ別にいいんじゃね?
0523デフォルトの名無しさん
2007/11/27(火) 15:04:460524デフォルトの名無しさん
2007/11/27(火) 15:11:550525デフォルトの名無しさん
2007/11/27(火) 16:36:22ありがとうございました
0526デフォルトの名無しさん
2007/11/27(火) 18:19:500527デフォルトの名無しさん
2007/11/27(火) 21:00:210528wolf ◆8VH3XAqjlU
2007/11/27(火) 22:09:04>>525
**** may be something complicated *****
strategy pattern
http://home.earthlink.net/~huston2/dp/strategy.html
0529デフォルトの名無しさん
2007/11/28(水) 00:48:43[]を使用した際に想定した動きをしてくれません。
下記がそのソースです。
#include <iostream>
#include <map>
#include <string>
// キー
struct StaffKey {
int section;
std::string code;
};
bool operator <(const StaffKey& lhs, const StaffKey& rhs) {
return lhs.section < rhs.section || lhs.code < rhs.code;
}
// データ
struct StaffData {
std::string name;
};
// キーとデータを紐付ける
typedef std::map<StaffKey, StaffData> StaffMap;
void insert(StaffMap& staffs, int sect, const char* cd, const char* nm) {
StaffKey key = {sect, cd};
StaffData& data = staffs[key];
data.name = nm;
}
0530529
2007/11/28(水) 00:49:27StaffMap staffs;
insert(staffs, 1, "ab123", "Taro");
insert(staffs, 2, "ab123", "Jiro");
insert(staffs, 1, "ab111", "Hanako");
insert(staffs, 1, "ab133", "Ken");
for (StaffMap::iterator it = staffs.begin(); it != staffs.end(); ++it) {
const StaffKey& key = it->first;
const StaffData& data = it->second;
std::cout << key.section << "," << key.code << ":" << data.name << std::endl;
}
std::cout << std::endl;
for (StaffMap::iterator it = staffs.begin(); it != staffs.end(); ++it) {
const StaffKey& key = it->first;
const StaffData& data = staffs[key];
std::cout << key.section << "," << key.code << ":" << data.name << std::endl;
}
}
0531529
2007/11/28(水) 00:50:28実行結果
----------------
1,ab111:Hanako
1,ab123:Taro
1,ab133:Ken
2,ab123:Jiro
1,ab111:Hanako
1,ab123:Taro
1,ab133:
2,ab123:Jiro
はじめにイテレータを用いて全件のダンプを出力しています。
次に、[]を使ってデータを取得&出力しているのですが、
一部のデータのみ値が取得できない状態に陥っています(ab133:Kenのデータ)
独学で勉強しており他の人に聞くことが出来ないため、どこがおかしいのか全く判りません。
どうか助力をお願いします
長々とすみません。
なお、環境はLinux + GCC4.1.2です。
0532デフォルトの名無しさん
2007/11/28(水) 00:53:27allocator が無いからじゃないかな?(綴り怪しいけど)
0533デフォルトの名無しさん
2007/11/28(水) 00:58:09> bool operator <(const StaffKey& lhs, const StaffKey& rhs) {
> return lhs.section < rhs.section || lhs.code < rhs.code;
> }
これが順序付けになってないっぽい。
↓これでいいかな?
if (lhs.section < rhs.section) return true; else if (rhs.section < lhs.section) return false;
return lhs.code < rhs.code;
0534529
2007/11/28(水) 01:11:31mapのテンプレート引数にstd::allocator<StaffKey> を追加してみましたが変わらずでした。
(見よう見まねに意味判らずやってます)
>>533
出来ました!!
||だとショートサーキットが有効になるので大丈夫だろうと思って深く考えていませんでしたが
やはり単純なミスだったんですね。。。
助かりました。どうもありがとうございました
0535デフォルトの名無しさん
2007/11/28(水) 01:16:33という仕様とは完全に異なるからな。
0536529
2007/11/28(水) 01:27:07ってことですよね?
だから正しく順序付けが出来ず、key指定時にデータの特定が出来なかった。
0537デフォルトの名無しさん
2007/11/28(水) 02:17:08ながーい構造体とかポインタの参照は
コンピュータ内部では一つ一つ計算してたぐり寄せているのでしょうか?
仮にそうだとして10万くらい続いているとしたら
終わりのx->y->z ←こいつのポインタを持っておけば無駄が省けるのでしょうか?
0538デフォルトの名無しさん
2007/11/28(水) 02:19:17持っておけるなら。
0539デフォルトの名無しさん
2007/11/28(水) 02:25:03やはりそうでしたか
これでまた一つ疑問が解けました
ありがとうございました
0540デフォルトの名無しさん
2007/11/28(水) 04:46:32a->b->cは間接参照で、実行時に中身を追うから、bに相当するポインタをtmpとして持つ意味があるけど。
もちろんこれはC/C++の話で、
他言語だとCの->に相当する部分で.を使用するから別の話になるし
配列として宣言して、あえて->を使う場合なんかはあてはまらないけどね。
0541デフォルトの名無しさん
2007/11/28(水) 09:31:450542デフォルトの名無しさん
2007/11/28(水) 10:02:240543デフォルトの名無しさん
2007/11/28(水) 10:07:21天皇陛下万歳
0544デフォルトの名無しさん
2007/11/28(水) 10:08:200545デフォルトの名無しさん
2007/11/28(水) 10:40:100546デフォルトの名無しさん
2007/11/28(水) 12:01:54シリアルポートの開け方について質問させてください.
環境は…Windows XP SP2,Borland C++ Compiler 5.5,言語はC言語です.
この環境で下のコードをコンパイルしようとするのですが,
C:\borland\bcc55\Include\winuser.h 4804: 宣言が正しく終了していない
C:\borland\bcc55\Include\winuser.h 4811: 型名が必要
という二つのエラーがでて,コンパイルできません.
winuser.hの該当箇所は, typedef struct tagINPUT{…} の部分です.
いろいろいじってみたのですが,どうも見当がつきません.どこがおかしいのでしょうか.
下のコードは,
ttp://www.geocities.jp/terukat/_geo_contents_/win/comm.html
ttp://members.jcom.home.ne.jp/0434383301/vc10.htm
ttp://plaza.harmonix.ne.jp/~ahoshino/vb/CreateFile.htm
を参考にしました.
#include<windows.h>
int main(void){
HANDLE hComm = CreateFile(
"COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
return 0;
}
0547デフォルトの名無しさん
2007/11/28(水) 12:05:11bccで他にWinAPIを呼ぶプログラムを書いたことは?
それがあるならそれを参考に見直してみればいい。
そうでないなら、そういうサンプルを探せばいい。
0548デフォルトの名無しさん
2007/11/28(水) 12:20:06Ctrl + Alt Dlt を無視したいとかそういうアプリではどうにもならない割り込みのあれかな?
0549デフォルトの名無しさん
2007/11/28(水) 12:34:00>bcc32 a
Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
test.cpp:
警告 W8004 a.cpp 13: 'hComm' に代入した値は使われていない(関数 main() )
Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland
BCB6だけどエラーが出ない
>>541
WindowsならCtrl+Alt+Deleteとかの特殊なの以外はキーフックで殺せる
0550546
2007/11/28(水) 12:42:20ありがとうございます.
APIプログラミングの経験はないです.
C言語とAPIでシリアルポートにアクセスしているプログラムのソースは
見つかったんですが,どこが違うのかわかりません.
他に必要な処理があるのかと思ったんですが,
私の力ではそのプログラムのなかからそれを見つけることができませんでした….
>>549
ありがとうございます.
私も今TurboC++で試してみたんですが,
同じ警告しかでませんでした.
うーん.なんででしょう.
0551546
2007/11/28(水) 12:45:20Turbo C++ でならコンパイルできたということです.
0552デフォルトの名無しさん
2007/11/28(水) 12:45:320553デフォルトの名無しさん
2007/11/28(水) 12:48:18#include <windows.h> だけのソースもコンパイルできなかったりする?
0554546
2007/11/28(水) 12:51:48550で書いているソースがインクルードしていたものを
一応すべてインクルードしてみたんですが,だめでした….
>>553
コンパイルできなかったです.
0555デフォルトの名無しさん
2007/11/28(水) 12:58:35bcc5.5.1で>>546のソースコンパイルできたよ
ファイルが壊れてるかもしれんから、再インストールしてみ
0556デフォルトの名無しさん
2007/11/28(水) 12:58:37そりゃなんかおかしいね
bcc再インストールしてみた方がいいかもしんない
0557546
2007/11/28(水) 13:20:32お騒がせしました.みなさん本当にありがとうございました!
0558デフォルトの名無しさん
2007/11/28(水) 18:14:23仮想関数を含むオリジナルクラスを継承したクラスのインスタンスをnewしてそのポインタを
オリジナルクラスにキャストしてもう一度もとのクラスにキャストし直したもどした場合は
正常に動作するのですが、オリジナルクラスに仮想関数が含まれない場合はコンパイラエラーが出ます、
これは仮想関数を含むオリジナルクラスのインスタンスの場合だけそのクラスを継承したポインタにキャストできるということなのでしょうか?
この場合、オリジナルクラスのインスタンスには継承先の情報が無いと思うのですがどこから持ってきてるのでしょうか?
ついでにもうひとつお願いします
newでインスタンスを作成した場合deleteしなければ、プログラム終了まで有効なのでしょうか?
例えば関数の中でnewを行いクラスのポインタを変数に格納してそれを関数の引数として戻してnewを行った関数の外で使用しても
最後にdeleteさえすれば大丈夫なのでしょうか?
乱文失礼しましたが、よろしくお願いします。
0559デフォルトの名無しさん
2007/11/28(水) 18:29:41dynamic_castの話なら、そのとおり。仮想関数を持たないクラスには働かない。
継承先の情報はインスタンスが隠し持ってる仮想関数テーブルに入ってる。
そもそもそれがなきゃ仮想関数の呼び先を解決できない。
deleteしなければプログラム終了まで有効。その続きのも大丈夫。
deleteし忘れてどんどんnewしてるとそのうちメモリを食い尽くすから要注意。
0560デフォルトの名無しさん
2007/11/28(水) 18:54:52回答、ありがとうございます。
これでやっと先にすすめそうです。
0561デフォルトの名無しさん
2007/11/28(水) 18:59:420562デフォルトの名無しさん
2007/11/28(水) 19:04:580563デフォルトの名無しさん
2007/11/28(水) 19:37:45【○○にはお好きな(またはお嫌いな)単語をお入れください】
0564デフォルトの名無しさん
2007/11/28(水) 19:38:210565デフォルトの名無しさん
2007/11/28(水) 19:39:460566デフォルトの名無しさん
2007/11/28(水) 19:53:16関数内で仮想関数を含むオリジナルクラスを継承したクラスのインスタンスをnewでつくりそのポインタを
オリジナルクラスにキャストして関数の引数として返し、そのポインタをもう一度継承後のクラスにキャストした場合、
オリジナルクラスに存在しない継承後のクラスが持っているメンバ変数の値が維持されているのを確認できたのですが
この部分の値もずっと保持されるであってますか?
0567デフォルトの名無しさん
2007/11/28(水) 20:03:54+ 本物のプログラマは有給を使えない
0568デフォルトの名無しさん
2007/11/28(水) 20:11:30そういうネタはマ板の方がいいんじゃね
0569デフォルトの名無しさん
2007/11/28(水) 20:13:07合ってる
ポインタをいくらキャストしてもインスタンスの実際のクラスが変わったりはしない
0570デフォルトの名無しさん
2007/11/28(水) 20:31:14回答、ありがとうございます
0571デフォルトの名無しさん
2007/11/28(水) 20:36:460572デフォルトの名無しさん
2007/11/28(水) 21:05:56それはダウンキャストと言うのは知ってるね
dynamic_castは何をしようとするのかプログラマが知ってる限り
問題はない
0573デフォルトの名無しさん
2007/11/28(水) 21:24:520574デフォルトの名無しさん
2007/11/28(水) 23:00:01・C++にはキャストがいくつかありますが、それぞれの役割がよく分かりません。詳説願います。
・inline関数についてですが、同一ソース中でないとinline展開されえないですか?
・演算子オーバーロードにおいて左オペランドに自作関数をとる演算子等を定義する場合、
通常のメンバ関数のような形式で定義するのと通常のグローバル関数のような形式で定義するのにはどのような違いがありますか?
bool Foo::operator +(Foo rhs)とbool operator +(Foo lhs,Foo rhs)みたいなののことです
よろしくお願いします
0575デフォルトの名無しさん
2007/11/28(水) 23:09:03http://www.google.co.jp/search?q=C%2B%2B+%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88
0576デフォルトの名無しさん
2007/11/28(水) 23:31:54オブジェクト間最適化機能のあるコンパイラなら、別のコンパイル単位にある関数でも
インライン展開され得る。
0577デフォルトの名無しさん
2007/11/28(水) 23:41:11詳説せず、厳密さも気にせず簡単にまとめるとこんな感じ。
・const の付け外し→const_cast
・標準変換、およびその逆変換→static_cast
・安全な downcast や crosscast→dynamic_cast
・A→B→Aで戻る以外は実装依存→reinterpret_cast
■inline
同一ソースって何?
規格上は基本的に同一翻訳単位に inline 関数の定義がないと駄目だし(ただし定義前に呼び出しがあってもOKと書いてあった)、翻訳単位間で定義が一致する必要がある。
最適化としての inline 化なら最近は >576 らしい。Exceptional C++ Style にもそんなことが書いてあった。
■演算子オーバーロード
×自作関数
○自作クラス
だとして、メンバ関数にすると第 1 引数がその自作クラスの場合に限定される。
例えば、Foo() + 1 はどちらでも実現可能だけど、 1 + Foo() はメンバ関数で実現することができない。
0578デフォルトの名無しさん
2007/11/28(水) 23:46:00>左オペランドに
って明示してあった。
その場合は、operator+() が class Foo が定義されている namespace 内で定義されている限りはほとんど変わらないと思う。
もちろんメンバに対するアクセス制限は異なるけど。
0579デフォルトの名無しさん
2007/11/29(木) 01:07:40C言語(linux gcc)にて、テキストファイルの指定した一行を読み込んだ後に、
その行を削除する処理を行いたいのですが、何か手立てはありませんでしょうか?
無理言って申し訳ないのですが、別ファイルに指定行以外をコピーした後ファイルのリネームを行う、
もしくはメモリにファイル内容を確保し、指定行以外をファイルに上書きすると言う手法以外で
何か解決手段をご教授いただければと思います・・・。
よろしくお願いします。
0580デフォルトの名無しさん
2007/11/29(木) 01:09:48つまり、それをやればよい
0581デフォルトの名無しさん
2007/11/29(木) 01:54:000582デフォルトの名無しさん
2007/11/29(木) 02:16:170583デフォルトの名無しさん
2007/11/29(木) 07:37:02それでは時間がかかるので適当なバッファを用意してある程度まとめて読んでまとめて書く
て定石はさておいて
メモリに読み込まずにずらす方法を考えようか
アセンブラでレジスタだけ使ってどうにかならんかね
0584デフォルトの名無しさん
2007/11/29(木) 07:58:01サンクスサンクスサンクス
参考になりますた
0585デフォルトの名無しさん
2007/11/29(木) 08:11:39例えば、ブロック単位で読み書きするのではなく
1バイトごとにリスト構造にして持つとか。
0586デフォルトの名無しさん
2007/11/29(木) 08:18:510587デフォルトの名無しさん
2007/11/29(木) 12:32:010588デフォルトの名無しさん
2007/11/29(木) 20:35:17DLLを作成し、そのDLLの関数にCWnd型(MFCのやつです)のポインタを渡そうと思って、次のようなコードを書いてみましたが、
上手く渡りません。問題としてはCWnd::m_hWndの値が変わってしまうというものです。
以下にコードをあげます。
//DLL
void CTestClass::TestFunc(CWnd* pWnd)
{
TRACE(_T("TestFunc 0x%08x \n"), pWnd->m_hWnd);
}
//EXE
void CTestDialog::OnOK()
{
CTestClass test;
TRACE(_T("OnOK 0x%08x \n"), m_hWnd);
test.TestFunc(this);
}
このようにして、処理を行うと出力されるm_hWndの値が変わってしまいます。
理由をご存知の方がいらっしゃいましたら、教えてください。
よろしくお願いします。
0589デフォルトの名無しさん
2007/11/29(木) 20:50:590590デフォルトの名無しさん
2007/11/29(木) 20:54:35マージソートするにはどうすればいいのでしょうか?
普通のマージソートなら出来るのですが
双方向の場合どうすればいいのか解りません;;
0591デフォルトの名無しさん
2007/11/29(木) 21:31:42その後、ソートしたリストを順方向に辿りながら、逆向きのリンクを張りなおす
0592デフォルトの名無しさん
2007/11/29(木) 21:59:51おおー、その発送はありませんでした
無事できましたありがとう^^
0593デフォルトの名無しさん
2007/11/29(木) 22:31:14ZERO-WIDTH系の文字に置換しとけばよくね?
0594デフォルトの名無しさん
2007/11/29(木) 22:34:42回答ありがとうございます。ですが、それは違いました。
0595デフォルトの名無しさん
2007/11/29(木) 22:42:35EXE->スタティクリンクしたMFCで違う、みたいな話ではない?
0596デフォルトの名無しさん
2007/11/29(木) 23:07:08TRACE(_T("OnOK 0x%08x 0x%08x \n"), this->m_hWnd, &(this->m_hWnd));
とりあえずDLL,EXE両方が同じアドレスを参照出来ているかを確かめてみようか。
0597デフォルトの名無しさん
2007/11/30(金) 00:26:19あるISequentialStreamのオブジェクトstreamにデータが入っていて、Readメソッドで
vector< char > buf;
buf.reserve( MAX );
for ( 読み終わるまでループ ) {
buf.resize( buf.size() + size );
stream.Read( &buf[ 0 ], size, read );
}
のように、size単位でデータをバッファに格納しようとしています。
データのサイズは1KB〜130MBほど、MAXは余裕をもって150MB、sizeは1MBです。
このstreamはあるライブラリ(Soap Toolkit 3.0)で提供されているもので、内部の実装は
どうなってるかわかりません。
上記でデータ自体は取ってこれるんですが、非常に時間がかかってしまいます。
3GHz、2GメモリのPCで3分とか…。
メモリに格納するだけでこんなに時間がかかる訳ないと思うんですが、Readのやり方が
間違っているのでしょうか?
sizeが1MBなのは、小さいサイズのデータの方がほとんどで100MBクラスはまれである
ということと、
buf.resize( MAX );
stream.Read( &buf[ 0 ], MAX - 1, read );
のように、一回で全部読み込もうとしたときに、Readの返値のHRESULTが不明なエラーを
示す値を返し、readが0になるという現象が起きるのが理由です。
この原因もわかってないです。
ISequentialStreamとかは使ったことないので、どう使うのが正しいのかよく分からない状況です。
教えていただけると助かります。よろしくお願いします。
0598デフォルトの名無しさん
2007/11/30(金) 02:42:18そんなものだよ。正常。
0599デフォルトの名無しさん
2007/11/30(金) 03:15:230600デフォルトの名無しさん
2007/11/30(金) 14:58:28sizeof(CWnd)を出力してみて、違う値が出てきたので、色々確認した結果、
>>595さんの言う通りの話でした。
ありがとうございます。
0601デフォルトの名無しさん
2007/11/30(金) 20:29:340 #include<stdio.h>
1 void quicksort(int x[],int n){
2 int m;
3 int *pa=x+2. *pz=x+n
4 if(n==2){
5 if(x[1]>x[2])m=x[1],x[1]x[2],x[2]=m;
6 return;
7 }
8 while(pa<pz){
9 while(pa<=x+n && *pa<x[1])pa++;
10 while(pz>=x+2 && *pz>=x[1])pz--;
11 if(pa<pz)m=*pa, *pa++=*pz, *pz--=m;
12 }
13 if(pa>x+2)m=x[1],x[1]=*(--pa),:pa=m;
14 if(pa-x>2)quicksort(x,pa-1-x);
15 if(x+n-pz>1)quicksort(pz.x+n-pz);
16 }
これの8〜12行目の部分は、9行目で前から数列の6,4,7,12まで進み、
10行目で後ろから2まで進み、12と2を交換するという意味であってますか?
0602デフォルトの名無しさん
2007/11/30(金) 21:44:310603デフォルトの名無しさん
2007/11/30(金) 22:06:450604デフォルトの名無しさん
2007/11/30(金) 23:54:11コンパイラーあれば、教えて頂けないでしょうか?
ちなみにVisual C++ 2005 Express Edition持ってます、使えますでしょうか?
0605デフォルトの名無しさん
2007/11/30(金) 23:57:530606デフォルトの名無しさん
2007/11/30(金) 23:58:460607デフォルトの名無しさん
2007/12/01(土) 00:03:29とりあえずコピペで、ちゃんとコンパイルできるか見てみましたが、
エラーなにがおかしいですか?
// test.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i;
for(i = 0; i < 10; i++)
printf("i = %d\n", i);
printf("end.\n");
return 0;
}
0608デフォルトの名無しさん
2007/12/01(土) 00:05:090609デフォルトの名無しさん
2007/12/01(土) 00:14:15Visual C++ 2005 Express Editionのプロジェクトを開けて、コード記入する欄が
できたので、上のように試しにコードを貼り付けして デバッグというボタン押したら、
エラーになりました。コードのどこがおかしいのでしょうか
0610デフォルトの名無しさん
2007/12/01(土) 00:24:47stdio.hをincludeしてないからだと思うけど
0611デフォルトの名無しさん
2007/12/01(土) 00:34:17#include"stdio.h"と入力すればよろしいでしょうか
0612デフォルトの名無しさん
2007/12/01(土) 00:35:510613デフォルトの名無しさん
2007/12/01(土) 00:44:13死んでほしいな、こういうヤツ。
0614デフォルトの名無しさん
2007/12/01(土) 03:28:40グローバル変数にして使いたいのですが
0615デフォルトの名無しさん
2007/12/01(土) 03:29:52void (int x, int *pt)
{
int i;
i = 0; *pt = 1;
while (i < x) {
++i; *pr = *pt * i;
}
printf("factorial called, %3d!=%12ld\n", x, *pt);
}
最初の定義をこんな風につくったんですがダメなとこを指摘してください。
0616614
2007/12/01(土) 03:31:050617デフォルトの名無しさん
2007/12/01(土) 03:35:54>void (int x, int *pt)
関数の名前がない
>>616
関数の外でグローバル変数を定義すればいいじゃん
何か問題があるのか?
0618614
2007/12/01(土) 03:37:00わかりました 外に定義します
0619デフォルトの名無しさん
2007/12/01(土) 03:42:11そもそもグローバル変数が何かをわかってないだろ。
0620615
2007/12/01(土) 03:43:09void factorial(int x, int *pt);
こうですか
0621デフォルトの名無しさん
2007/12/01(土) 03:57:01Cの標準ライブラリの関数を使おうとしたら色々とエラーが出てきました。
で、MSDNを読んでみたら、
1. 標準関数の strlen とかは危険だから _strnlen_l みたいなVCの独自関数を使え。
2. WinAPI は char の時代は終わったから TCHAR や _tcs 系の関数を使え。
ってことが書いてありました。
警告を減らせば char 型やCの標準関数も使えるみたいですが、
このままVC独自色に染まってしまった方が良いのでしょうか?
0622デフォルトの名無しさん
2007/12/01(土) 04:10:05for (counter=i ;counter<=i+9;counter++) {・・・
for文が苦手です。この一文はどういうふうに解釈してよいか
わかりません。解説して頂けないでしょうか
0623デフォルトの名無しさん
2007/12/01(土) 04:16:41{
文
}
は
式1
while( 式2 )
{
文
式3
}
と殆ど同じ。
こうすればわかるか?
counter=i;
while( counter <= i+9 )
{
/* 何か */
counter++;
}
0624デフォルトの名無しさん
2007/12/01(土) 04:19:070625デフォルトの名無しさん
2007/12/01(土) 04:25:29なるべく標準的にしたいなら標準で
速度を優先したいならWindows APIなどで
0626デフォルトの名無しさん
2007/12/01(土) 05:17:00なぜstrlenが危険といわれるのか?scanfやprintf、strcpyなどもそう
なぜcharを使用しなくなったのか?
それをちゃんと知っておいたほうがいい。
VC色に染まってもいいが、VC以外で開発するときに代替案がすぐに
浮かぶようであれば問題ないと思う。
標準準拠を目標にして自作するのもいいし、危険とされる関数を
ラッピングして安全なものを作るのでもいい(←この時はpragmaで警告抑制)
0627デフォルトの名無しさん
2007/12/01(土) 06:55:28標準関数は関数の方でバッファサイズをチェックしてなかったり文字列が '\0' で終了していないと止まらなかったりで危険。
VC 版は必ずバッファサイズと最大長を指定させていて、文字列が長すぎたりする時は途中で打ち切ってくれるので安全。
ってことですよね。
char は...Win9x は内部的に char 型だったけど最近のXPとかは内部的に UNICODE だから?
一緒に買ってきた教科書には当然のごとく _strnlen_l とか何にも載っていないんですが、
VC流で勉強しても教科書探しとか他の人との情報交換とかの妨げにならないか心配です。
0628デフォルトの名無しさん
2007/12/01(土) 07:27:170629デフォルトの名無しさん
2007/12/01(土) 07:39:53const char *eos = str;
while( *eos++ ) ;
return( eos - str - 1 );
}
koeeeee!!!
0630デフォルトの名無しさん
2007/12/01(土) 07:41:22size_t n;
for (n = 0; n < maxsize && *str; n++, str++);
return n;
}
よs
0631デフォルトの名無しさん
2007/12/01(土) 07:43:47打ち切って欲しい長さはやりたいことやプログラムの仕様によって決まるはず。
例えば文字列が100文字未満か100文字以上かで分岐させたいとき、
strlen だと'\0'が見つかるまで暴走を続けるが
strnlen_lなら「とりあえず100文字目までに'\0'はなかった」と帰ってきてくれる。
それ以外の場合でも「これ以上長いのは怪しいから扱いません」って断れるはず。
0632デフォルトの名無しさん
2007/12/01(土) 07:44:500633デフォルトの名無しさん
2007/12/01(土) 07:58:090634デフォルトの名無しさん
2007/12/01(土) 08:01:06しかもその為のコストは極僅かときたもんだ
少なくともその部分でのオーバーフローの可能性は無くなる
まぁ大抵の人はこんなもの出る前から自作のセーフなライブラリ作って使ってたけどね
0635デフォルトの名無しさん
2007/12/01(土) 08:11:350636デフォルトの名無しさん
2007/12/01(土) 08:24:28123456.jpg
123.jpg
このようファイル名の、数字のところだけを抜き出したいんです。
数字のところの長さは変わります。
そこでとりあえず、
char argnum[10];
hogeStrcpy(argv[1], argnum);
void hogeStrcpy(char *origin, char *number){
int i;
for(i = 0; origin[i] != '¥x2e'; i++){
number[i] = origin[i];
}
}
みたいなださださな物を書いてみたのですが、
引数の数字が短かかった場合、表示するとargnumにゴミが残ってしまいます。
なんとか数字だけをコピーしたいのですが、何か良い方法はないでしょうか?
0637デフォルトの名無しさん
2007/12/01(土) 08:28:060638デフォルトの名無しさん
2007/12/01(土) 08:35:55atoi("123456.jpg")とかじゃなくて?
そうでないならsscanf("123456.jpg", "%[^.]", buf)って話かな。
0639デフォルトの名無しさん
2007/12/01(土) 08:52:40strnlen_lが十分に安全じゃなかったとしても、strlenはそれ以上に危険なんだから。
0640デフォルトの名無しさん
2007/12/01(土) 09:02:09atoi完全に存在を忘れてました。
ありがとうございます。
0641デフォルトの名無しさん
2007/12/01(土) 09:05:29>引数の数字が短かかった場合、表示するとargnumにゴミが残ってしまいます。
文字列の長さがargnumの配列サイズ以下、ってことか?
argnumを初期化するか、hogeStrcpyの最後で'\0'を入れればいい。
0642636
2007/12/01(土) 09:34:44>>641
すいません。atoiでは駄目みたいです。
やりたいことは、
絶対パス
/usr/boku/graphic/123456.jpg
/usr/boku/graphic/1234.jpg
で渡される引数を、
/usr/boku/graphic/123456
/usr/boku/graphic/1234
で切り出して、
/usr/boku/graphic/123456hoge.jpg
/usr/boku/graphic/1234meso.jpg
みたいな感じで書き出したいんです。
/usr/boku/graphic/123456
/usr/boku/graphic/1234
の長さが変わるので、
配列argnum以下の長さだった場合、
argnumにゴミが残ってしまうんです。
で、別に文字列として表示する訳ではないので、
argnumを0で初期化したり、最後に'¥0'を入れたとしても、
/usr/boku/graphic/12345600hoge.jpgや
/usr/boku/graphic/12340000meso.jpg
みたいになるんじゃないかなと。
何か良い方法はないでしょうか?
0643デフォルトの名無しさん
2007/12/01(土) 09:39:25"0"と'\0'は違う。
ヌルターミネートでぐぐれ
0644デフォルトの名無しさん
2007/12/01(土) 09:58:37Borland 用のGRWINをインストールしました。
#include <stdio.h>
#include "GrWin.h"
int main(){
GWinit();
GWopen(0);
GWindow(-1,-1,1,1);
GWline(-1,-1,1,1);
}
のプログラムのコンパイルが通りません。
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_GWinit' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_GWopen' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_GWindow' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_GWline' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
** error 1 ** deleting Debug\grwin.exe
インストールがちゃんとできてないんでしょうか??
0645デフォルトの名無しさん
2007/12/01(土) 10:04:51libはちゃんとリンクしてんの?
0646デフォルトの名無しさん
2007/12/01(土) 10:09:18それはなんですか?Includeフォルダには grwin.hがインストールされてますが・・・・
0647636
2007/12/01(土) 10:14:28アルェー。
ビックリ。
出来てしまいました。
ヌルターミネートって何なんですか?
調べた限り、¥0との違いが良くわかんなかったです。
配列に文字列を代入した場合、0が続くと文字の終端になる?
1230000000005みたいな物だった場合もうまくいくのは何故ですか?
0648デフォルトの名無しさん
2007/12/01(土) 10:16:07自分の環境くらい晒してくれ
grwinは使ったことないが、
http://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=753
とか見る限りヘッダには宣言しかされてなくて、libファイルをリンクしないと駄目なんだろ、たぶん
0649デフォルトの名無しさん
2007/12/01(土) 10:22:30リンク先みたらわかりました!助かりました。
ありがとうございました
0650デフォルトの名無しさん
2007/12/01(土) 12:22:39int i;
で定義したchar型のデータに変数を代入したいんですが、どうすればいいですか?
pt = "ほげほげ";
はできるんですが、
ほげほげ i みたいに変数の値も代入するやりかたがわからないです
0651デフォルトの名無しさん
2007/12/01(土) 12:23:10は
ch = "ほげほげ";
でした
0652デフォルトの名無しさん
2007/12/01(土) 12:23:25'0'は、0の文字コードをあらわします。(値としては0x30)
'\0'は、値として0をあらわします
文字列と言うのは、char型の配列であるので、
たとえば、"1230005"と言う文字列は、
31,32,33,30,30,30,35,0
と言う風に入っていると考えれば大体問題ないかと
ちなみに、 ""で括るのと、''で括るのでも意味が違うので、注意してください。
0653デフォルトの名無しさん
2007/12/01(土) 12:35:08>char *ch;
これは、char型のポインタです。char変数のアドレスもしくは、
配列の先頭アドレスを入れるものです。
>ch = "ほげほげ";
これは、わかりやすく言うと、実行プログラム中に、
"ほげほげ"という文字列が確保されていて、
そこの先頭アドレスをchに代入しているだけのことです。
>ほげほげ i みたいに変数の値も代入するやりかたがわからないです
いまいちやりたいことがわからないのですが、
変数の値を文字列にして、ほげほげのあとに追加するのなら、
charの配列をある程度確保しておいて、そこに、ほげほげをコピーして、
その後ろに文字列に変換した数字をコピーすればいい。
なんにせよ、ポインタをきちんと理解しておいたほうがいいですよ。
0654デフォルトの名無しさん
2007/12/01(土) 12:51:35文字列をグラフに印字する関数に、文字列を渡すんです。
char a[2] ;
a[0]='A';
a[1]=i;
として、iをfor文でまわして、A1 A2 A3みたいにしたいんですが、こうすると
Aのあとに変な記号が出てしまいます
0655デフォルトの名無しさん
2007/12/01(土) 12:54:07文字列を充分理解してない
char a[3];
a[0] = 'A';
a[1] = i + '0';
a[2] = '\0';
0656デフォルトの名無しさん
2007/12/01(土) 12:56:40なるほど
a[1]で、i+'0'としてるのはなぜですか?
0657デフォルトの名無しさん
2007/12/01(土) 13:01:23もしくは、ヌルターミネーターで調べても良い。
0658デフォルトの名無しさん
2007/12/01(土) 13:02:48この場合は、>>652を参照なのは確かだが、ヌルターミネータは関係なかった。
0659デフォルトの名無しさん
2007/12/01(土) 13:13:15文字コード表では文字0〜9の文字コードは連続してる。
'0'は整数0x30
'1'は整数0x31
'2'は整数0x32
・
・
・
'9'は整数0x39
0660デフォルトの名無しさん
2007/12/01(土) 13:14:25なぜプラスしないといけないんでしょうか?
0661デフォルトの名無しさん
2007/12/01(土) 13:18:28一般的にchar型に入れる文字コード上で、
数字を表す文字'0'〜'9'は連続した数値で表される
'0' = 48
'1' = 49
'2' = 50
(以下略)
だから、iが10進で一桁であれば、'0'+iで該当の文字コード(数値)が得られる
○ i=2の時に、2を'2'に変換
'0'+i = 48+2 = 50 = '2'
iが0〜9で無い場合(10以上とか負数とか)であれば
charの配列とitoaやsprintf辺りを使う。
char str[256];/* 全体で255文字まで保存出来る領域) */
char *ch;
int i;
ch = "hoge";
sprintf(str, "%s%d", ch, i);
「char str[256]」と「char *ch」の違いについては、また別途調べてみ。
0662デフォルトの名無しさん
2007/12/01(土) 13:23:50分かりました。ありがとうございました。
0663デフォルトの名無しさん
2007/12/01(土) 14:25:24for文のループを使って計算させるには、どういう風に
書けばいいんだろう? もし、書けるとしたらこれは無限ループってことになるよね?
俺のイメージだとfor(i=0; i>=0; i++)
{平均値を求めよ}
0664デフォルトの名無しさん
2007/12/01(土) 14:32:18よく意味がわからないが最初は1個の数字、1分後には2個の数字さらに1分後は3個の数字
ってなるなら無限ループにならないでその数字の数のMAXとればいいだけじゃね?
0665デフォルトの名無しさん
2007/12/01(土) 15:09:01iが10以上の時もできるようにしたんですが、
一番最後のiの時だけおかしいです。
0666665
2007/12/01(土) 15:16:270667デフォルトの名無しさん
2007/12/01(土) 15:35:24void Func()
{
return;
}
void Func()
{
}
この二つの関数の実行速度は同じですか?
0668デフォルトの名無しさん
2007/12/01(土) 15:41:39うん
0669デフォルトの名無しさん
2007/12/01(土) 15:44:02LABEL:
if(a>10000)goto END;
a++;
goto LABEL:
END:
for(a=0;a<=10000;a++);
の速度は同じですか?
0670デフォルトの名無しさん
2007/12/01(土) 15:51:530671デフォルトの名無しさん
2007/12/01(土) 15:57:11LABEL:
if(a>10000)goto END;
a++;x+=3:
goto LABEL:
END:
printf("%d",x);
x=0;for(a=0;a<=10000;a++);x+=3;printf("%d",x);
はどうですか
0672デフォルトの名無しさん
2007/12/01(土) 15:57:520673デフォルトの名無しさん
2007/12/01(土) 16:00:01それは後者の方が速いと思う
なぜなら前者はループの中でx+=3してるが後者はループの中が空っぽ
0674デフォルトの名無しさん
2007/12/01(土) 16:03:090675デフォルトの名無しさん
2007/12/01(土) 16:07:30実際にやって測ってみろ
0676デフォルトの名無しさん
2007/12/01(土) 16:09:420677デフォルトの名無しさん
2007/12/01(土) 16:11:07頭にウンコがのってるよ
0678デフォルトの名無しさん
2007/12/01(土) 16:18:40例えば、1分ずつ時間が経つと数字も1増えるとしたら、
最初の1時間は 1〜60と数字が増えていきます。
これを時間ごと平均値を出すように命令したいので、60で割った計算をさせる
2時間目は数字は61〜120までなので、これらをすべて足して60で割る計算を
させる。
こんな感じの命令文作るとしたら、どんな文を作ったらよいか思ったのです。
で、もし、作ることができるなら、何時間後までやって下さいという命令文で
なければ、無限ループになるのではと思ったのです。
0679デフォルトの名無しさん
2007/12/01(土) 16:21:41うちのコンパイラが生成したコードを見てみると
movl $LC0, (%esp)
movl $30003, %edx
movl %edx, 4(%esp)
call _printf
計算済みの答え30003が即値で渡されている
0680デフォルトの名無しさん
2007/12/01(土) 16:25:11time関数で現在時刻を取得できるから、それを見て判断すればいいんじゃないか
0681デフォルトの名無しさん
2007/12/01(土) 16:32:35タイム関数というのまだ使ったことないのですが、どのような命令文
を作成して、1〜60を自動的に計算させることができるのでしょうか?
0682デフォルトの名無しさん
2007/12/01(土) 16:37:311分に1回だけ1個ずつ出すの?
1分間のあいだ同じ数字をずーっと何個も出し続けるの?
0683デフォルトの名無しさん
2007/12/01(土) 16:39:510684デフォルトの名無しさん
2007/12/01(土) 16:43:452分目 2
・
・
45分目 45
というふうに1分経つと、数字の方も1ずつ多くカウントされて
数字の方は1〜60をどんどん足し算して、
1時間ずつ経ったらら、その合計値を60で割って、平均値を出すということです
わかりづらい質問してすいません。よろしくお願いします
0685デフォルトの名無しさん
2007/12/01(土) 16:46:05ことを考えていたのです。プログラム自体も初心者なので、専門用語
もよくわかりませんので、妥当そうな言葉使ってすいません
0686デフォルトの名無しさん
2007/12/01(土) 16:56:02こんな感じかね
#include <stdio.h>
#include <time.h>
int main()
{
int i = 0, j = 0;
time_t t = time(NULL);
for (;;) {
i++;
while (difftime(time(NULL), t) < i * 60);
printf("%d分目 %d\n", i, i);
j += i;
if (i % 60 == 0) {
printf("1時間経った 平均%d\n", (j / 60));
j = 0;
}
}
}
0687デフォルトの名無しさん
2007/12/01(土) 17:06:55見えるが、頭で思っていたよりいろんな関数が必要なんですね。
whileが必要とは以外でした。for文ですべてできるかと思いました・・・
熟読してみます。
0688デフォルトの名無しさん
2007/12/01(土) 17:08:040689デフォルトの名無しさん
2007/12/01(土) 17:09:350690デフォルトの名無しさん
2007/12/01(土) 17:10:09いやforとwhileは可換だからどっち使ってもいいんだけどね
書きやすいとか読みにくいとかその程度の問題だし
0691デフォルトの名無しさん
2007/12/01(土) 17:30:570692デフォルトの名無しさん
2007/12/01(土) 17:34:13unkoがのってるよ
0693デフォルトの名無しさん
2007/12/01(土) 17:45:59とかでいいのかしらん。
0694デフォルトの名無しさん
2007/12/01(土) 19:12:41やりたいことは
typedef struct{
Fuga f;
}Hoge;
typedef struct{
Hoge h;
}Fuga;
ということがしたいのですが2行目で怒られます…よろしくお願いします
0695デフォルトの名無しさん
2007/12/01(土) 19:17:21f.h.f.h.f.h.f.h.......?
そんな無限ループみたいな構造体は作れません。
0696694
2007/12/01(土) 19:45:02C++ではできるのですがCではできないということですか?
2つのオブジェクト(データ)がお互いを指しているような構造は
Cでは実現できないのでしょうか?
0697デフォルトの名無しさん
2007/12/01(土) 19:55:040698694
2007/12/01(土) 19:58:49typedef struct{
Fuga* f;
}Hoge;
typedef struct{
Hoge* h;
}Fuga;
0699デフォルトの名無しさん
2007/12/01(土) 19:59:04指すんなら出来る
typedef struct Fuga Fuga;
typedef struct Hoge Hoge;
struct Hoge{
Fuga *f;
};
struct Fuga{
Hoge *h;
};
0700デフォルトの名無しさん
2007/12/01(土) 20:07:33> C++ではできるのですが
うそつくなヴォケ
0701694
2007/12/01(土) 20:11:01ありがとうございました。
私の初めの例が変でした。すみません。
699がまさにやりたかったことでした。重ね重ねありがとうございます。
0702694
2007/12/01(土) 20:21:12すみません
class Hoge;
class Fuga{
Hoge* h;
};
class Hoge{
Fuga* f;
};
ならできますよね?ということが言いたかったんです(ポインタなんですが)
つまり初めの例が変だったんです。
初心者歓迎ということで許してね♪
0703デフォルトの名無しさん
2007/12/01(土) 21:00:140704デフォルトの名無しさん
2007/12/01(土) 22:50:15なかなか面白いこと吐くじゃねーか
0705デフォルトの名無しさん
2007/12/01(土) 23:19:390706デフォルトの名無しさん
2007/12/01(土) 23:25:48> ま
> 者
0707デフォルトの名無しさん
2007/12/01(土) 23:36:330708デフォルトの名無しさん
2007/12/01(土) 23:47:23#include <stdio.h>
#include <time.h>
int main()
{
time_t t = time(NULL);
struct tm *tm = gmtime(&t);
printf("%s",asctime(tm));
return 0;
}
0709デフォルトの名無しさん
2007/12/02(日) 00:26:35int ymd = 20071201;
int y, m, d;
y = 2007
m = 12
d = 1
のように年月日をそれぞれy m dに取得するいい方法はないですか?
0710デフォルトの名無しさん
2007/12/02(日) 00:45:30m = ymd % 10000 / 100;
d = ymd % 100;
こうしたいの?
0711デフォルトの名無しさん
2007/12/02(日) 01:23:21サンクス、ばっちりです
0712デフォルトの名無しさん
2007/12/02(日) 01:38:53仮に {0,1,2,3,4,5,6,7,8,9} という配列が書き込まれているとし、
それが再生される段階でどこかが抜けてしまった場合、
例えば {0,1,2,4,5,6,7,8,9,0} となってしまうプログラムを書きたいんですが、
全然うまくいきません。
以下のものを書きました・・
*****************************************************************
#include<stdio.h>
int main()
{
int i;
int length = 10; //length of the sequence
int start = 3; //start of asynchronous
int Seq1[] = {0,1,2,3,4,5,6,7,8,9};
int Seq2[] = {0,0,0,0,0,0,0,0,0,0};
for(i = start; i < length; i++)
{
Seq2[i] = Seq1[i+1];
};
printf("%3d", Seq2[]);
return(0);
}
0713デフォルトの名無しさん
2007/12/02(日) 01:50:31>Seq2[i] = Seq1[i+1];
iが9のとき、10番目にアクセスしてアウト。
ってか、何がやりたいのかさっぱり。
startが3だから3が抜けた配列を作りたいの?
for ( i = 0; i < length; i++ ) {
if ( Seq1[ i ] != start ) {
Seq2[ i ] = Seq1[ i ];
}
}
こういうことか?
0714デフォルトの名無しさん
2007/12/02(日) 01:51:48>それが再生される段階でどこかが抜けてしまった場合
ここを詳しく
0715デフォルトの名無しさん
2007/12/02(日) 01:53:31俺なら日本語でおkとしか言えない
0716デフォルトの名無しさん
2007/12/02(日) 02:12:34実はこのプログラムはですね、HDDのある特殊な媒体において、
「再生時に同期が外れて書き込まれている磁化パターンがヘッドで読めないところが出てくる」という現象を作りたいんです。
ABCDEF という系列を挙げると、左が過去です。A→B→C→・・・ という順でヘッドで再生されていくと考えてください。
そこで、どこかでヘッドと媒体の同期が取れなくて、読めないとこが出て、A→B→D→・・・ となる場合があるとしてます。
このプログラムは、ある既存のプログラムに追加したいものなのですが、
とりあえずプログラムを書いたことが無いので、このプログラム単体でビットのシフトを再現したいんです・・・
日本語おkですみません・・
0717デフォルトの名無しさん
2007/12/02(日) 02:21:09rd
for(i = 0; i < NUM_MAX; i++)
{
0718712
2007/12/02(日) 02:37:49ありがとう
実際は同期がはずれるのは当然ランダムだから、参考にさせてもらうよ
ところで、結果を表示する
printf("%3d", Seq2[]); っておかしいでしょうか?
適当に書いてたらこれがあると構文エラーになって出力できない・・・・orz
俺アホすぎ・・
0719デフォルトの名無しさん
2007/12/02(日) 02:58:16void main ()
{
srand( (unsigned int)time(NULL) );
int i;
const int length = 20;
int index = 0;
int Seq1[length];
int Seq2[length];
for( i = 0; i < length; i++ ){
Seq1[i] = i;
Seq2[i] = 0;
}
// 抜けた数字
int out = rand() % length;
for( i = 0; i < length; i++ ){
if( out != i ){
Seq2[index] = Seq1[i];
index++;
}
}
printf( "抜けた数字:%d\n", out );
for(i = 0; i < length; i++)
printf("%d ", Seq2[i]);
printf("\n");
}
0721デフォルトの名無しさん
2007/12/02(日) 05:58:57int x;//X座標
int y;//Y座標
};
int main(void)
{
struct Point A[1000],B[1000];
線分A[i]B[i]とA[j]B[j]が交差するか判定していくプログラムで
単に二重for文で一個ずつ判定していくんじゃなくて(n-1)^2/2回の判定で済むようなプログラムの書き方を
ご教授願いたいのですが
0722デフォルトの名無しさん
2007/12/02(日) 11:13:41n(n-1) / 2 回の判定で行けるんじゃないの?
0723デフォルトの名無しさん
2007/12/02(日) 11:16:56for(i=0;i<n;++i){
for(j=i+1;j<n;++j){
//処理
}
}
こういうこと?
多分n(n-1)/2だが。
0724デフォルトの名無しさん
2007/12/02(日) 11:18:32(n-1)^2/2回じゃ全て網羅しきれない
0725デフォルトの名無しさん
2007/12/02(日) 14:59:42一回目…A[0]B[0]に対して残り全部の照合1000-1回
二回目…A[1]B[1]に対してA[0]B[0]を除いた1000-2回
・
・
・
1000回目…A[1000]B[1000]に対して0回
for文は使わないという意味じゃなくて
for(i=0;i<n:i++){
for(j=0;j<n:j++){
と単にするだけじゃなくてもっと効率よくするという意味です。
分かり辛くてすいません。
0726636
2007/12/02(日) 15:44:54皆様のお陰で、文字列の抜き出し、結合は出来るようになりました。
今度は、抜き出した文字列の分離をしたいんですが、そんな関数有りますでしょうか?
具体的には
argv[1] = "/usr/boku/graphics/1234.jpg
から、"/usr/boku/graphics/1234"を抜き出して
hoge[40] = "/usr/boku/graphics/1234"
meso[] = "ero.jpg"
strcat(hoge, meso);
でhoge[40] = "/usr/boku/guraphics/1234ero.jpg"
にすることは出来たんです。
それでこんどはまた、
hoge[40] = "/usr/boku/guraphics/1234ero.jpg"
から"/usr/boku/graphics/1234"を抜き出して、
masaru [] = "eroero.jpg"
strcat(hoge, meso)
でhoge[40] = "/usr/boku/guraphics/1234eroero.jpg"
にしたいんです。
抜き出す時点で、
hoge[40] = "/usr/boku/graphics/1234"
hoge1[40]
strcpy(hoge1, hoge);
で後は、strcpyでhoge1を使い回せば良い気もするんですが、もっと良い方法はないでしょうか?
0727デフォルトの名無しさん
2007/12/02(日) 15:49:13それは >723 な気がするが。
もうちょっと工夫するなら
・A[i].x <= B[i].x となるように必要があれば A[i] と B[i] を交換
・A[i].x で昇順ソート
しておけば、B[i].x < A[j].x になった時点で内側の j のループを break できるので、短い線分が広い範囲にばらばら存在してるケースでは比較回数が削れると思う。
まじめにやるんだったら平面走査法になると思うけどいい参考ページがちょっと見つからなかった……
0728デフォルトの名無しさん
2007/12/02(日) 15:53:17hoge[40] = "/usr/boku/graphics/1234" になってる時点で、
char *begin = hoge + strlen(hoge);
しておいて、
strcpy(begin, masaru);
0729636
2007/12/02(日) 16:29:19なるほど。
こんなことが出来たのは感激。さすがC言語って感じ。
char *begin = hoge + strlen(hoge);
で*beginにhoge[40] = "/usr/boku/graphics/1234"以降の空白の配列のポインタを代入して、
strcpy(begin, masaru);で結果として、/usr/boku/graphics/1234eroero.jpgが出来ると。
char masaru[] = "ero.jpg";
char meso[] ="eroero.jpg";
char hoge[40] = "/usr/boku/graphics/1234" ;
int i = strlen(hoge);
char *begin = hoge + i;
strcpy(begin, masaru);
printf("%s¥n",hoge);
begin = hoge + i;
strcpy(begin, meso);
printf("%s¥n",hoge);
これだったら、確かに"/usr/boku/graphics/1234"が使い回せますね。
でも、こんなプログラム書いたらコメントしてないと後で何してるのかわからなくなりそう。
0730デフォルトの名無しさん
2007/12/02(日) 16:40:38>hoge[40] = "/usr/boku/guraphics/1234ero.jpg"
>から"/usr/boku/graphics/1234"を抜き出して、
ディレクトリ変わってるのはtypoよな?
>今度は、抜き出した文字列の分離をしたいんですが、そんな関数有りますでしょうか?
ない
具体的なコードの流れとか関数の切り分け方とか
分からんとどうするのが良いとか何とも言えないけど、
個人的な好みだと、
hoge[40] = "/usr/boku/graphics/1234" の段階でstrcatは使わずに
hoge1[40]、hoge2[40]を用意してそれぞれ
sprintf(hoge1, "%s%s", hoge, meso);
sprintf(hoge2, "%s%s", hoge, masaru);
とすると思う。
どうしても切り出す必要があるなら、前提条件が揃えばstrstrを使うとか
hoge[strlen(hoge)-strlen(meso)] = '\0'とか、まぁ色々あると思うけど。
0731730
2007/12/02(日) 16:42:12でしゃばってすんまへん
0733デフォルトの名無しさん
2007/12/02(日) 16:56:33失礼な!
0734デフォルトの名無しさん
2007/12/02(日) 17:49:490735デフォルトの名無しさん
2007/12/02(日) 18:05:210736デフォルトの名無しさん
2007/12/02(日) 18:44:080737デフォルトの名無しさん
2007/12/02(日) 19:33:37参考書等を頼りに勉強して、不明点が出てきたらまた聞きに来るといい。
0738デフォルトの名無しさん
2007/12/02(日) 19:35:010739デフォルトの名無しさん
2007/12/02(日) 20:12:12そういうことってできますか?
0740デフォルトの名無しさん
2007/12/02(日) 20:20:100741デフォルトの名無しさん
2007/12/02(日) 20:25:58ケースバイケース。
Cの場合、使われてる場所で引数の型が異なると無理。
C++だと、テンプレートにすれば大概OK。
引数の型が一緒なら、どっちでもできるはず。
0742デフォルトの名無しさん
2007/12/02(日) 21:06:060743デフォルトの名無しさん
2007/12/02(日) 22:44:59int foo(int x){
return x+1;
}
int main(){
return func(foo,-1);
}
0744デフォルトの名無しさん
2007/12/02(日) 22:48:24int func(p_func f,int x){
return f(x);
}
int foo(int x){
return x+1;
}
int main(){
return func(f,-1);
}
0745デフォルトの名無しさん
2007/12/02(日) 22:49:14return func(f,-1);
}
↓
int main(){
return func(foo,-1);
}
0746デフォルトの名無しさん
2007/12/02(日) 23:31:040747デフォルトの名無しさん
2007/12/02(日) 23:33:280748デフォルトの名無しさん
2007/12/02(日) 23:36:100749デフォルトの名無しさん
2007/12/02(日) 23:37:580750デフォルトの名無しさん
2007/12/02(日) 23:40:42int* a; //「型が変化するのに修飾対象が変数名だなんておかしい」と現実に目を向けない人可哀相な人がよくする書き方。
0751デフォルトの名無しさん
2007/12/02(日) 23:48:52別にどっちだっていいよ、プロジェクト等ならコーディング規約に沿えばいい。
個人なら自分がいいと思うほうにすればいい。
何でこの話題で荒れるか知りたければCFAQとか見ればいい。
0752デフォルトの名無しさん
2007/12/02(日) 23:49:020753デフォルトの名無しさん
2007/12/02(日) 23:51:530754デフォルトの名無しさん
2007/12/02(日) 23:57:460755デフォルトの名無しさん
2007/12/02(日) 23:58:070756デフォルトの名無しさん
2007/12/02(日) 23:58:29まぁ俺も「int * a」派だから似たようなもんかw
0757デフォルトの名無しさん
2007/12/03(月) 00:02:400758デフォルトの名無しさん
2007/12/03(月) 00:11:060759デフォルトの名無しさん
2007/12/03(月) 00:11:350760デフォルトの名無しさん
2007/12/03(月) 00:21:47Cをしているなら: int *a
C++をしているなら: int* a
どちらか不明な場合は: int * a
ちょうど初心者なら: int*a
と書くのが良いと思われます。
0761デフォルトの名無しさん
2007/12/03(月) 01:53:37まぁ好みでどうぞ
0762デフォルトの名無しさん
2007/12/03(月) 01:55:43みたいなw
0763デフォルトの名無しさん
2007/12/03(月) 04:09:41ポインタは「イテレータと呼ばれる型」の一形態で、ポインタのデリファレンスはoperator*の一形態、
という意識がどんどん支配的なっていく。
昔ながらの下位概念側から比較的新しい上位概念を見る、のではなく、その逆の見方になる。
イテレータやスマートポインタを自作したりすると、特に。
そういう意識の中で int *a; という書き方を見ると、ちょいと異物感があるというか、
自分の「C++スタイルの深まり」との協調性に欠けていると感じる、ってのはあるかな。
もちろん、こんなのは小さなこと・・・っていうか、極端にいえば単なる「気分」の話であって、
実際には読み書き両面において、あらゆる書き方に慣れているべきなわけだけど。
結論:どっちでもいい。ただ、どんなスタイルであれ、それなりに理由があって生まれているから、
語り出すと長いしウザいw
0764デフォルトの名無しさん
2007/12/03(月) 04:12:57T* f()
T *f()
dotch?
A:
pointer<T> f()
よs(ry
0765デフォルトの名無しさん
2007/12/03(月) 07:12:16ショートコード大好きな人には大問題なのかもしれないけど。
0766デフォルトの名無しさん
2007/12/03(月) 09:50:340767デフォルトの名無しさん
2007/12/03(月) 10:16:340768デフォルトの名無しさん
2007/12/03(月) 12:21:17int *hoge
型を表すだけの場合は、文法に沿って
int*
0769デフォルトの名無しさん
2007/12/03(月) 15:15:56もともとのサンプルプログラムに指定した情報を書き込めるようにしようと以下のプログラムを加えました。
以下実際に自分が加筆した部分を含んだソースコードのURLと自分で加筆した部分です。
ソースコード:ttp://www.uploda.org/uporg1141577.zip.html
以下実際に書き込んだ部分
/*----------------加筆部分ここから----------------*/
//自分で書き込むデータを指定する場合
unsigned char write_block_data[16];
//gets()の引用数、\0+1のサイズを設定
char str[80];
char strlen;
size_t len;
fprintf(stdout,"書き込むデータの入力(16バイト以下)");
gets(str);
//16バイト以上を入力してしまった場合
while(len = strlen(str)>16){
fprintf(stdout,"文字数が多すぎます。もう一度入力してください。");
gets(str);
}
//i文字目がNULLにならない間一文字ずつ入力
for(int i=0;str[i]!='\0';i=i+1)
write_block_data[i] = str[i];
//文字数が少ない間
while(i < 16)
//文字数が少ない場合はゴミを表示しないようにする。
write_block_data[i++] = ' ';
input_write_block_without_encryption.block_data = write_block_data;
/*----------------加筆部分ここまで----------------*/
0770769
2007/12/03(月) 15:18:31そのあとコンパイルをしたら
1>sample_09.cpp
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(77) : warning C4996: 'gets' が古い形式として宣言されました。
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(270) : 'gets' の宣言を確認してください。
1> メッセージ: 'This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(79) : error C2064: 1 引数を取り込む関数には評価されません。
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(79) : fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
1>ビルドログは "file://c:\Documents and Settings\ユーザー1\My Documents\Visual Studio 2005\Projects\felica\felica\Debug\BuildLog.htm" に保存されました。
と表示されました。
error C2064: 1 引数を取り込む関数には評価されません。
というものの対処法をぐぐっても意味がわからないのでどうやって解決していいのかもわかりません。
もしよろしければこれらのエラーの解決方法を教えていただけないでしょうか。
環境は
Windows XP Professional SP2
Microsoft Visual C++ 2005 Express Edition
です。
よろしくお願いします。
長文失礼しました。
0771デフォルトの名無しさん
2007/12/03(月) 15:27:02#include <cstring>
0772デフォルトの名無しさん
2007/12/03(月) 15:31:42原因は寧ろこれ。
>char strlen;
つーか、突っ込みどころ多すぎだろ。
0773デフォルトの名無しさん
2007/12/03(月) 15:33:00fgets使え
0774デフォルトの名無しさん
2007/12/03(月) 15:35:28unsigned char write_block_data[17];
char str[sizeof(write_block_data + 1];
fprintf(stdout, "...");
fgets(str, sizeof(str), stdin);
char * p = strchr(str, '\n');
if (p) * p = '\0';
sprintf(write_block_data, "%16.16s", str);
// 最後の一行コピペすんのめんどくせ
0775769
2007/12/03(月) 15:37:25レスありがとうございます。
>>771
先頭につけてもエラーはかわりませんでした。
>>772
char strlenというものをつけないでやってみたのですが、そのときは
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(80) : error C3861: 'strlen': 識別子が見つかりませんでした
というエラーが出てしまいました。
>>773
fgetsですか。
getsとかいてある部分をfgetsになおせばいいのでしょうか。
0776769
2007/12/03(月) 15:40:02最後の一行は
input_write_block_without_encryption.block_data = write_block_data;
ですよね?
F5を押してコンパイルしたら
1>sample_09.cpp
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(94) : error C2143: 構文エラー : ')' が ']' の前にありません。
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(97) : error C3861: 'strchr': 識別子が見つかりませんでした
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(99) : error C2664: 'sprintf' : 1 番目の引数を 'unsigned char [17]' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(119) : error C3861: 'print_vrctor': 識別子が見つかりませんでした
というエラーが出てきました。
0777769
2007/12/03(月) 15:43:51というのは
char str[sizeof(write_block_data + 1]; を
char str[sizeof(write_block_data + 1)]; に変更したらエラーがなくなりました。
識別子が見つかりませんというエラーは例えばintやcharの宣言が必要という意味なのでしょうか。
0778デフォルトの名無しさん
2007/12/03(月) 15:48:040780デフォルトの名無しさん
2007/12/03(月) 15:52:58char str[sizeof(write_block_data) + 1]
0782デフォルトの名無しさん
2007/12/03(月) 16:05:460783769
2007/12/03(月) 16:07:19C言語だと思っていたのですが*.cppファイルだからC++なんじゃないのかと思ってますw
といってもサンプルプログラムの入っていたフォルダの名前がCになっていたのでC言語だとは思うのですが・・・。
0784769
2007/12/03(月) 16:22:12//#include "stdafx.h"
#include <cstdio>
#include <cstdlib>
#include <conio.h>
#include <cstring>
#include "felica.h"
としてみたらエラーが2つになりました。
1>コンパイルしています...
1>sample_09.cpp
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(99) : error C2664: 'sprintf' : 1 番目の引数を 'unsigned char [17]' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(119) : error C3861: 'print_vrctor': 識別子が見つかりませんでした
0785デフォルトの名無しさん
2007/12/03(月) 16:26:120786769
2007/12/03(月) 16:29:56unsigned char write_block_data[17];
char str[sizeof(write_block_data) + 1];
reinterpret_cast<char *>(write_block_data);
fprintf(stdout, "...");
fgets(str, sizeof(str), stdin);
char * p = strchr(str, '\n');
if (p) * p = '\0';
sprintf(write_block_data, "%16.16s", str);
input_write_block_without_encryption.block_data = write_block_data;
と設定してみました。
でもエラーメッセージがかわらないです。。。
0787デフォルトの名無しさん
2007/12/03(月) 16:34:160788デフォルトの名無しさん
2007/12/03(月) 16:37:59reinterpret_cast<char *>(write_block_data);
はおかしいだろ。
sprintf(reinterpret_cast<char *>(write_block_data), "%16.16s", str);
0790769
2007/12/03(月) 16:42:40アドバイスありがとうございます。
早速直してみたところエラーがひとつになりました。
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(122) : error C3861: 'print_vrctor': 識別子が見つかりませんでした
というエラー文です。
識別子が見つからないのというのは単にintやcharなどの宣言がないと言うことなのかと思ったのですがどうやら違うようでした。
0791デフォルトの名無しさん
2007/12/03(月) 16:46:55変数だか関数だか知らんがprint_vrctorという識別子を持つ何かが定義
されてないとコンパイラがメッセージ出してるだろ。
勝手な予想だがキーボードの位置からして
print_vector
の間違いか?
0792デフォルトの名無しさん
2007/12/03(月) 16:50:19--
print_vrctor("書き込みデータ:",write_block_data,sizeof(write_block_data));
--
void print_vector(char* title, unsigned char* vector, int length);
--
0793769
2007/12/03(月) 16:52:59たしかにそうなのかもしれません。
print_vrctorをprint_vector
に訂正してみました。
そうしたら
1>------ ビルド開始: プロジェクト: felica, 構成: Debug Win32 ------
1>コンパイルしています...
1>sample_09.cpp
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(102) : warning C4996: 'sprintf' が古い形式として宣言されました。
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(345) : 'sprintf' の宣言を確認してください。
1> メッセージ: 'This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
1>マニフェストをリソースにコンパイルしています...
1>リンクしています...
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__dispose_library が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__close_reader_writer が関数 _main で参照されました。
0794769
2007/12/03(月) 16:54:031>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__read_block_without_encryption が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__write_block_without_encryption が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__polling_and_get_card_information が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__open_reader_writer_auto が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__initialize_library が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__get_last_error_types が関数 "void __cdecl error_routine(void)" (?error_routine@@YAXXZ) で参照されました。
1>C:\Documents and Settings\ユーザー1\My Documents\Visual Studio 2005\Projects\felica\Debug\felica.exe : fatal error LNK1120: 外部参照 8 が未解決です。
1>ビルドログは "file://c:\Documents and Settings\ユーザー1\My Documents\Visual Studio 2005\Projects\felica\felica\Debug\BuildLog.htm" に保存されました。
1>felica - エラー 9、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
というエラーが出てきました。
>>792
すみません。本気で書いてましたorz タイピングミスはしないように見直しているつもりなのですが・・・。
0795デフォルトの名無しさん
2007/12/03(月) 16:54:220796デフォルトの名無しさん
2007/12/03(月) 16:59:290797769
2007/12/03(月) 17:01:31はい、でも卒業研究で作成中のプログラムの一部として使用していまして。
どうしてもこの部分が必要になってまして・・・。
自分なりに頑張って他のパーツの作成は、できたのですがどうしてもこれだけができなくてorz
>>796
*.libをリンク??
*.libを持っていないので作成する必要がありますよね。
>>779のURLにうpしたファイルがすべてなのでちょっとわからないです。
すみません。。。
0798デフォルトの名無しさん
2007/12/03(月) 17:05:28それにlibが入ってるか、ソースが入ってるならそれをビルドすればいい
0799769
2007/12/03(月) 17:13:45CD-ROMにlibraryというフォルダがあります。
その中に
felica.lib
felica_for_vb.lib
rw.lib
というファイルがあります。
これをMicrosoft Visual C++ 2005 Express Editionを使って
ファイル→開く→ファイルでfelica.libを指定して開いてみようとしたら
"C:\(略)\felica.lib"に対応するエディタはありません。
このファイルの種類(lib)のアプリケーションがインストールされていることを確認してください。
という警告が表示されてしまい表示できないですorz
0800デフォルトの名無しさん
2007/12/03(月) 17:16:280801デフォルトの名無しさん
2007/12/03(月) 17:17:160803デフォルトの名無しさん
2007/12/03(月) 17:19:38その問題解決能力ではこれから厳しいぞ
とりあえず、今までのレスからlibやらリンクやらのキーワードがあるんだからぐぐろうよ
数時間試行錯誤して駄目だったら再び質問するくらいの根気でがんばれ
0804デフォルトの名無しさん
2007/12/03(月) 17:19:57じゃあまずはC言語の勉強から始めたら?
0805デフォルトの名無しさん
2007/12/03(月) 17:23:26真面目に答えてやりたいが、VC++は(というかIDEは)使ったことないので完璧に予測で答えてみる。
多分、以下のどれかだ。
・プロジェクトにlibファイルを追加する
・「プロジェクトで使用するlibファイル」みたいなところに追加する
・ビルド時にlibファイルを指定する
まあ、メニューからそれっぽいの探して試してみろよ。
それくらいできるだろ
0806デフォルトの名無しさん
2007/12/03(月) 17:24:00コンパイル、リンクとか少なくとも作業としてわかってるのかしらん。
0807デフォルトの名無しさん
2007/12/03(月) 17:27:54それでも一部上場のSIへ入社していった。入社後の本人&指導役が大変そうだ。
今の中堅以下の情報系学部ってそんなもんじゃないだろうか。
0808デフォルトの名無しさん
2007/12/03(月) 17:29:52立派なパワポマスターに成長するさ
0809デフォルトの名無しさん
2007/12/03(月) 17:31:470810デフォルトの名無しさん
2007/12/03(月) 17:31:48そうそう、かの人はパワポと発表は上手だった。
彼は絶対、営業職の方が成功すると思ったなぁ。
まぁ既に営業系のSEに配置換えになってるかもしれないけどw
0811デフォルトの名無しさん
2007/12/03(月) 17:32:31何しに大学行ってたんだい?
0812769
2007/12/03(月) 17:36:34>>803
もう少し試行錯誤してみます。
>>805
よくわかりませんが色々試してみます。
追加してみることはできたけど変なエラーが出てしまったので恐らく追加の仕方が間違っているのだと思うのでもう少し探してみます。
>>806
はい、情報系です。正直よくわかりませんorz
>>811
毎日それなりにプログラミングはやっていたつもりなのですが4年間まったくわからなくて・・・。
0813デフォルトの名無しさん
2007/12/03(月) 17:40:250814デフォルトの名無しさん
2007/12/03(月) 17:41:540815デフォルトの名無しさん
2007/12/03(月) 17:43:46根本的にプログラミングに向いてないね。
そこまで理解できてないのってのはいっそ文系脳では? 何故に情報学部に行った?
0816デフォルトの名無しさん
2007/12/03(月) 17:47:07文系を人外の生物みたいに言うな!
文系と理系の違いは興味の方向性みたいなもんだ
できるかできないかは別問題
0817デフォルトの名無しさん
2007/12/03(月) 17:48:55うっかり情報系に入っちゃった人は、就職で心機一転、情報系以外の職種に就いた方がいいね。
学部で流れて就職するときっと後々後悔する。
0818デフォルトの名無しさん
2007/12/03(月) 17:52:55ような気がする。「一流大学」でも結構よくいる。情報が簡単に
見つかるのでついつい情報集め命で対処療法になってしまう。
一二冊で良いから本を初めから最後まで読んで、系統的に理解すれば
最終的には大分楽なんだけどね(情報系に限らず)。
0819デフォルトの名無しさん
2007/12/03(月) 18:20:09いったい何を得に行ってるのやら。
学費もったいねぇ。
とりあえず入れたところがたまたま
情報学部ってところなんだろうな。
0820デフォルトの名無しさん
2007/12/03(月) 18:20:52まぁ文系理系にかかわらずまれにいるけどな
0821769
2007/12/03(月) 18:32:33皆様のお力添えでようやくライブラリの問題は解決しました。
少しプログラム上の問題が出ているので考えてみます。
>>814
一応毎日やってました。プログラミング演習という実習が再履修一度だけというのもあったので。
forやif文を書くレベルで落ちて再履修しましたorz
0822デフォルトの名無しさん
2007/12/03(月) 19:03:27独習Cとか買って最低限勉強しておいたほうがいいかもね
0823デフォルトの名無しさん
2007/12/03(月) 19:06:42makeとかbjamの使い方も載ってる
特にbjam、C++使うならこれを使わない手は無いぜ?
0824769
2007/12/03(月) 19:11:460825デフォルトの名無しさん
2007/12/03(月) 19:26:49慣れだ。
あときちんと本を読んで実際にコーディングをすることをお勧めする。
IT業界にいくつもりなら会社に入れば嫌でも覚える。
プログラミングもできない、なんちゃってSEも多いけど。
情報収集には英語は必須だからきちんと勉強しておいたほうがいい。
語学の習得に比べたらプログラムなんてなんてことはない。
数学の弱いプログラマにはレベル低い奴が多いから勉強しとけ。
DSPとかいじるなら数学のセンスは必須。
0826デフォルトの名無しさん
2007/12/03(月) 19:37:400827769
2007/12/03(月) 19:41:57貴重なアドバイスありがとうございます。
C言語の初歩から家で就職まで勉強します。
SEではなく一応コンサル配属らしいけど親会社が外資系メーカーなのでIT業界には変わりないと思うので頑張ります。
英語はずっと勉強してます。院生に英語の文献読まされてよく和訳依頼されるのでw
数学ももっとやっときます。大学の教養レベルまで大抵わかってるつもりなのでプログラミングにも応用できるよう頑張ります。
0828デフォルトの名無しさん
2007/12/03(月) 20:21:020829デフォルトの名無しさん
2007/12/03(月) 20:22:32new演算子はオーバーロードできない。
operator newならできる。
0830デフォルトの名無しさん
2007/12/03(月) 20:24:11それnew演算子w
いや、言いたいことはわからなくもないけどさ。
>>828
クラスなら可能。
非侵入的にはできないと思う。
0831デフォルトの名無しさん
2007/12/03(月) 20:28:08operator newとnew演算子の違いが判らないのですが?
0832828
2007/12/03(月) 20:42:07クラスのメンバにすると解決しました
0833デフォルトの名無しさん
2007/12/03(月) 21:22:21new演算子とoperator new()は明確に違う。
new演算子は
1. operator new()でメモリ確保する。
2. コンストラクタで初期化する。
この動作を変えることはできない。そういう意味でオーバーロード不可能。
ただし、1. の動作を再定義することはできる。
おれはこう理解している。
0834デフォルトの名無しさん
2007/12/03(月) 21:59:120835デフォルトの名無しさん
2007/12/04(火) 00:29:00その後いろんな処理を経た後、マイナス値があればエラーを返して終了、
というものの場合、以下の「⇒」の箇所でアボートします。
他のうまくいっているプログラムと同じように書いたつもりなんですが、
ループの中でdeleteするのがいけないんでしょうか。
double* Array = NULL;
Array = new double[ N ];
// この後なんやかんやで値が入る
for( int i = 0; i < N; i++ )
{
if( Array[i] < 0.0 )
{
⇒ delete [] Array; // ここでアボート
Array = NULL;
}
0836デフォルトの名無しさん
2007/12/04(火) 00:34:54どのように書いたらよろしいでしょうか。
よろしくお願いします
0837デフォルトの名無しさん
2007/12/04(火) 00:36:33配列Arrayの複数の要素が負だったら、複数回deleteしてるんじゃね?
0838デフォルトの名無しさん
2007/12/04(火) 00:39:02int f(int x)
{
return 2 * x;
}
0839デフォルトの名無しさん
2007/12/04(火) 00:43:01簡単に言えばi==0の時点でArray[i]にマイナス値が入ってたら
その時点でif文内のdeleteが実行されてメモリ解放されても
引き続きi=1,2,3・・ってインデックスでアクセスし続ける訳だから・・・
まぁ、解ってのとおりループ内でdeleteしてるのがまずい。
0840835
2007/12/04(火) 01:20:44⇒ delete [] Array; // ここでアボート
Array = NULL;
retuen -1; // ここでエラーコードを返しているのです・・・
せっかく答えてくださったのにごめんなさい。
0841835
2007/12/04(火) 01:22:28retuen ⇒ return です。
一個でもマイナス値があると、returnで抜けてるはずなんです・・
0842デフォルトの名無しさん
2007/12/04(火) 01:36:50ミスもあるし、関係ないと思って省いたところが原因だったりもする。
0843デフォルトの名無しさん
2007/12/04(火) 01:39:50// この後なんやかんやで値が入る
Arrayの値を書き換えたりしてないよね?
0844デフォルトの名無しさん
2007/12/04(火) 01:44:180845841
2007/12/04(火) 07:32:48は、複雑な関数をいっぱい呼んでて、全体はコピペしきれません。
>>Arrayの値を書き換えたりしてないよね?
いろんなところでしてます。値を書き換えてるところをもう一度、確認してみます。
おさわがせしますた
0846デフォルトの名無しさん
2007/12/04(火) 10:04:140847デフォルトの名無しさん
2007/12/04(火) 10:06:33無論できるが、計算だけなら筆算でも電卓でも出来るだろうにw
0848デフォルトの名無しさん
2007/12/04(火) 10:12:060849デフォルトの名無しさん
2007/12/04(火) 10:25:09>C言語使って移動平均線の計算をするにはどうしたら良い?
ttp://pc11.2ch.net/test/read.cgi/prog/1189987548/889
0850デフォルトの名無しさん
2007/12/04(火) 13:00:26勉強ついでに移動平均線を作ってみたいのでアドバイス頂けませんか?
0851デフォルトの名無しさん
2007/12/04(火) 13:05:470852デフォルトの名無しさん
2007/12/04(火) 13:37:240853デフォルトの名無しさん
2007/12/04(火) 13:41:060854デフォルトの名無しさん
2007/12/04(火) 14:04:450855デフォルトの名無しさん
2007/12/04(火) 14:17:15受精できるのはIQ130の優秀などうみても精子
0856デフォルトの名無しさん
2007/12/04(火) 16:55:53実行ファイルからどのコンパイラでコンパイルしたか判別することは可能なのでしょうか?
たとえば、visual c++ .net 2003 アカデミックパッケージ
でコンパイルした実行ファイルは、このパッケージのコンパイラで
コンパイルされたという情報が含まれていたりするのでしょうか?
また、gccでコンパイルしたのかvisual c++でコンパイルされたのか判別できるのでしょうか?
0857デフォルトの名無しさん
2007/12/04(火) 17:01:26ELF PE
よくわかんね。
0858デフォルトの名無しさん
2007/12/04(火) 17:22:36同じ環境でもコンパイラによってリンクするモジュールが若干違うので
埋め込まれたシンボルからコンパイラを推測することは可能。
例えば、同じLinux上でgccとiccでコンパイルした場合を較べると、
後者には前者に存在しない__intel_cpu_indicatorなんてシンボルが埋まっている。
しかし、IDEのパッケージの違いまでは判らないと思うが。
0859デフォルトの名無しさん
2007/12/04(火) 17:29:55全部C言語なんじゃないんですか?
0860デフォルトの名無しさん
2007/12/04(火) 17:33:01C++はCのオブジェクト指向拡張に過ぎない。
0861デフォルトの名無しさん
2007/12/04(火) 17:39:15騙されるな。C++もCをベースにしてはいるが最早別の言語だ。
0862デフォルトの名無しさん
2007/12/04(火) 17:48:31半音上げたのがC#だ
0863デフォルトの名無しさん
2007/12/04(火) 17:48:400864デフォルトの名無しさん
2007/12/04(火) 18:13:160865デフォルトの名無しさん
2007/12/04(火) 18:24:400866デフォルトの名無しさん
2007/12/04(火) 18:33:47#define TEST_PRINT( ... ) printf( __VA_ARGS__ )
とやると、...の部分で
error C2010: '.' : マクロの仮引数リスト内に予期せぬ文字列があります。
と出ます。
これは、どうやったら予期してくれるんでしょうか?
0867デフォルトの名無しさん
2007/12/04(火) 18:36:41int N=100;
int a[N];
でNの値を100から500000ぐらいに変えると、コンパイルはできるのですが実行画面に
Documents and Setting\ユーザー名\デスクトップ>ファイル名
Press any key to exit (Input "c" to Continue)
と出てしまい実行結果が出力されません。どうしたらよいでしょうか。
Cpadを使っています。ただのメモリー不足でしょうか。配列の要素数が多ければ多いほど信頼性のあるデータが得られるので、できるだけNの値を大きくしたいのです。
0868デフォルトの名無しさん
2007/12/04(火) 18:37:37C++Builderのコンポーネント作ってたレベルだからあれだが
DelphiとC#の似てる部分はVCLとFrameworkぐらいで
文法はずいぶん違うよ〜
0869デフォルトの名無しさん
2007/12/04(火) 18:40:28空白が入っていないところにデータをおくんだ 保存するんだ
#include <vector>
using namespace std;
main(){
int N=100;
vector< int > a;
a.resize[N];
}
とやると巨大配列が作成できる たんなるintでは制限がきつい
0870デフォルトの名無しさん
2007/12/04(火) 18:45:290871デフォルトの名無しさん
2007/12/04(火) 18:52:35残念ながらVC++はC99未対応
0872デフォルトの名無しさん
2007/12/04(火) 19:00:11ありがとうございます。
検索してみたら他にも色々対応していないのも分かり参考になりました。
0873デフォルトの名無しさん
2007/12/04(火) 19:09:24でかい配列を作るときはnew(ただのCならmalloc)を使って作るんだ。
int a[N]; では一時変数用の領域(あんまり広くない)に確保されちゃうから。
newやmallocで確保した領域は、使い終わったらdelete(ただのCならfree)すること。
で、メモリ管理の面倒さを感じ始めたら>>869が教えてくれたvectorにGOだ。
(以上、かなり乱暴な説明をしてるので使う前にちゃんと勉強してね。)
0874デフォルトの名無しさん
2007/12/04(火) 19:15:48Visual C++ 2005以上を使えばいい。
http://msdn2.microsoft.com/en-us/library/ms177415(VS.80).aspx
0875デフォルトの名無しさん
2007/12/04(火) 19:29:43詳しく解説して下さってありがとうございます。
Victorっていうのを使った後はfor文の中で
b[i]=a[i];
のように使えるのでしょうか。
>>863
どうもありがとうございます。今日はパソコン室閉まっちゃったので試せませんが明日試してみます。
0876デフォルトの名無しさん
2007/12/04(火) 19:35:030877デフォルトの名無しさん
2007/12/04(火) 23:00:23よく考えたらこちら向きな気がするので質問です
マルチ気味で申し訳ないです
スプライト処理をしたいのですがマスクしてBitBltする以外に方法はあるのでしょうか
やはりdirectXをりようしたほうが手っ取り早いのですか?
0878デフォルトの名無しさん
2007/12/04(火) 23:15:06すごく簡単なことだと思うのですが、C言語を始めたばかりでまだあまり分かっていないので、どうかよろしくお願いします。
0879デフォルトの名無しさん
2007/12/04(火) 23:26:26C言語というかプログラム自体も経験少なそうだね。
エラーが出て作ることができないのか、それ以外なのか、
エラーが出ているならどういうエラーが出ているのかを書いた方が応えやすい。
質問の仕方から勉強した方がいい。
0880デフォルトの名無しさん
2007/12/04(火) 23:44:40textBox1などの値を変えるためにメンバ関数を作りたいのですが、それを呼び出そうとすると
「静的でないメンバ関数の呼び出しが正しくありません」
とエラーがでます。そこで関数にstaticをつけると
「左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。」
と出てしまいます。
分かることがあればヒントでいいのでお願いします
0881デフォルトの名無しさん
2007/12/04(火) 23:57:59とりあえずC/C++にはあまり関係ない。
DirectXが手っ取り早いかどうかは人による。
0882デフォルトの名無しさん
2007/12/04(火) 23:59:16class::メンバ関数で呼び出せないかな?
なにをしたいかよくわからないけど
0883デフォルトの名無しさん
2007/12/05(水) 00:18:54ボタンをクリックしたときに呼び出される関数button1_Clickなどでは
textBox1->Text = "test";ということができるので、
外部からtextBox1の値を変えるのも同じようにそこに関数を作っていき、
それを呼び出せばいいと思っていたのですが・・・。
0884デフォルトの名無しさん
2007/12/05(水) 00:46:28textBox1->Textってのがローカル変数というかメンバ変数じゃないんでないの?
0885デフォルトの名無しさん
2007/12/05(水) 00:58:44そのメンバ変数を外部から見たいときはどうすればいいんでしょうか
0886デフォルトの名無しさん
2007/12/05(水) 01:05:24パブリックにすればいいのでは・・・。
というか、textBox1ってもダイアログとか別のクラスのものですよね?
そういうのは
CTestDlg Dlg;
でまずクラスを作ってあげる?ことをしないと基本できませんよねたしか。
0887デフォルトの名無しさん
2007/12/05(水) 03:06:45どうすればいいですか
while(fp&&fp.fail())Sleep(10);
0888デフォルトの名無しさん
2007/12/05(水) 04:08:57fp != NULL
0889デフォルトの名無しさん
2007/12/05(水) 04:18:500890デフォルトの名無しさん
2007/12/05(水) 09:05:22教授には、「タイムスラングはやった?やってない?じゃあもういーや」というようなことを言われました。
具体的にはどうすればよいのでしょうか。
0891デフォルトの名無しさん
2007/12/05(水) 09:07:20srand(time(NULL));
0892デフォルトの名無しさん
2007/12/05(水) 09:19:06入出力にエディットコントロールを1つずつ設置して、エンターキーが押されたら
入力エリアの内容を出力エリアに渡したいんですが、漢字変換の決定のエンターキーでも
反応してしまって、単語単位でしか打てません。
何かいい方法はないでしょうか。
0893892
2007/12/05(水) 09:39:230894デフォルトの名無しさん
2007/12/05(水) 10:13:17どうもありがとうございます。
頭にそれを付ければよいのですよね?
0895デフォルトの名無しさん
2007/12/05(水) 10:22:05プログラム実行の最初に1回だけな。
乱数出力の関数を呼び出すたびに呼ぶんじゃないぞ。
0896892
2007/12/05(水) 10:22:45正規表現で改行コードを監視し続ける方法も考えたけど、正規表現を使うのにライブラリが必要らしく諦めました。
どうすればいいんでしょうか。
0897デフォルトの名無しさん
2007/12/05(水) 10:27:57普通そのreturnは区別できるけど。
0898デフォルトの名無しさん
2007/12/05(水) 10:39:08なんで正規表現が要るのよ?
単純に文字列から"\r\n"を検索するだけだろ?
stringのfindか、Cならstrstrかなんかで。
0899892
2007/12/05(水) 10:39:24| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| ←出力用エディットコントロール
| .| (エンターキーが押されたら、ここに入力された文を出力したい)
|________|
________
|あいうえお | ←入力用エディットコントロール(一行)
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
今はこれでGetAsyncKeyState(VK_RETURN)でエンターキーの入力を監視して、trueなら
GetWindowTextで入力内容を取得→SetWindowTextで出力をしようとしています。
0900デフォルトの名無しさん
2007/12/05(水) 10:41:230901デフォルトの名無しさん
2007/12/05(水) 10:42:32どうもありがとうございます。一行だけ加えればよいとのことで修正が楽そうでよかったです。本当にありがとうございました!
0902デフォルトの名無しさん
2007/12/05(水) 11:19:08WM_IME_STARTCOMPOSITIONとENDCOMPOSITION拾ってその間のキー入力は無視
0903デフォルトの名無しさん
2007/12/05(水) 11:48:55例えば巨大配列にa[i]にiをいれてa[i]を表示するというプログラムを作成する場合、
昨日の解説を元に以下のようなプログラムを作成したのですが、
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<time.h>
#include<vector>
using namespace std;
main(){
int N=1000000000;
vector<int> a;
a.resize[N];
int i,n;
n=N;
for(i=0;i<n;++i){
a[i]=i;
}
for(i=0;i<n;++i){
cout << a[i] << " ";
}
}
以下のようなエラーが出ました。
エラー E2235 練習.cpp 14: メンバー関数は呼び出すかそのアドレスをとらなければならない(関数 main() )
エラー E2062 練習.cpp 14: 無効な間接参照(関数 main() )
根本的に間違って理解してしまっているような気がするので、どうかご指導をよろしくお願いします。
0904デフォルトの名無しさん
2007/12/05(水) 11:52:2814行目ってどこだよ。
0905デフォルトの名無しさん
2007/12/05(水) 12:00:29a.resize[N]; はおかしいだろ。a.resize(N);じゃないの?
だが何故にresize?
最初からvector<int> a(N);じゃだめなのか?
それに領域は確保せずにpush_back使えばいいだろ。
それとCのライブラリを使うのは控えたほうがよいと思う。
どうしても使う場合C++ヘッダcstdlibやctimeを使った
ほうが良いと思う。
0906デフォルトの名無しさん
2007/12/05(水) 12:09:59すいません
14行目となっているのは
a.resize[N];
の部分です。
>>905
いろいろなご指摘ありがとうございます。
昨日の指摘にそってプログラムを組んだつもりなのですが・・・。
なるほど、resizeでやる必要はないのですね。
0907デフォルトの名無しさん
2007/12/05(水) 12:15:21push_backは遅い。せめてreserveしてからにしろ。
0908デフォルトの名無しさん
2007/12/05(水) 12:17:10コンパイルはできたのですが、今度は実行画面に
Abnormal program termination
と表示されてしまいました。
うーん、なんじゃこりゃ。
0909デフォルトの名無しさん
2007/12/05(水) 12:18:26#include<stdio.h> // 間違い。iostreamを使うなら不要
#include<stdlib.h> // 間違い。現時点では不要
#include<iostream>
#include<time.h> // 間違い。現時点では不要
#include<vector>
using namespace std;
main(){ // 間違い。
int N=1000000000;
vector<int> a;
a.resize[N]; // 間違い。そもそも必要ない。
int i,n; // iはここで宣言すべきではない。nは存在意義がない。
n=N;
for(i=0;i<n;++i){
a[i]=i;
}
for(i=0;i<n;++i){ // iteratorを使うほうがいい。
cout << a[i] << " ";
}
}
0910デフォルトの名無しさん
2007/12/05(水) 12:19:44だってお前、int型を10億個っていったら、4GBのメモリが要るってことだぞ。
0911デフォルトの名無しさん
2007/12/05(水) 12:20:01そんなに大きな配列は32bit環境では作れない。
0912デフォルトの名無しさん
2007/12/05(水) 12:20:40いいえ。メモリがないのが問題じゃありません。
0913デフォルトの名無しさん
2007/12/05(水) 12:25:380914デフォルトの名無しさん
2007/12/05(水) 12:43:54ただ練習ではできたのですが、本番の課題でコンパイルし、実行した結果、ウィンドウが出て来てアドレス系の警告がでて正しく動作しませんでした。
一度int a[N]で作ったソースはかなり長いものなので、あまり大体的には変えたくないのです。
もうすこし頑張ってみます。
0915デフォルトの名無しさん
2007/12/05(水) 12:52:01そこまで書いたってわからねーだろ
0916892
2007/12/05(水) 13:05:01たぶん自分のソースの書き方が悪いんだと思うんですが、やってみてもエンターと同時に出力するか
表示されないかでした。ちょっと時間がないので明日あたり報告にきます。
0917デフォルトの名無しさん
2007/12/05(水) 13:43:450から書き直したほうが早いと思うぞ
0918デフォルトの名無しさん
2007/12/05(水) 21:31:140919デフォルトの名無しさん
2007/12/05(水) 21:39:52まさしく一人デスマだった
思い出したくもない
0920デフォルトの名無しさん
2007/12/05(水) 21:47:230921デフォルトの名無しさん
2007/12/05(水) 22:08:29という2つの2次元配列を宣言したすると、その配列の領域のオーダーはどうなりますか?
N^2ですか?
0922デフォルトの名無しさん
2007/12/05(水) 22:13:56そう。ってかスレ違いじゃね?
0923デフォルトの名無しさん
2007/12/05(水) 22:38:05どのあたりのスレがいいんですか?
0924デフォルトの名無しさん
2007/12/05(水) 22:54:00#include <time.h>
int main(void){
clock_t start, end;
start = clock();
なんかの処理
end = clock();
printf("%5.2f\n", (double)(end-start)/CLOCKS_PER_SEC);
return 0;
}
これをC++で書くとどうなりますか?
0925デフォルトの名無しさん
2007/12/05(水) 23:02:08同じ
0926デフォルトの名無しさん
2007/12/05(水) 23:04:41変えるのは、表示の部分だけですね。ありがとうございます
0927デフォルトの名無しさん
2007/12/05(水) 23:10:26http://www.kmonos.net/alang/boost/classes/timer.html
これだな。
0928デフォルトの名無しさん
2007/12/05(水) 23:23:30別に、C++でprintfを使ってはいけないという法はないがな
0929デフォルトの名無しさん
2007/12/06(木) 04:04:080930デフォルトの名無しさん
2007/12/06(木) 04:12:53WindowsXP SP2 VC++6.0で動くプログラムの
共有メモリについて質問があります。
複数プロセス間で参照する共有メモリとして、
メモリマップドファイルを検討しているのですが
以下の認識であっていますでしょうか
・mallocで動的に確保する場合に(3M確保を想定)発生する
O/Sのページング作業がありませんか?
(連続した物理メモリを取る為に、メモリの入れ替え作業が
必要になりファイルにメモリの内容を書いたりする事全般)
・メモリマップドファイルの確保、読み書きは普通のファイル
より高速らしいですが、普通のメモリ確保とどう違いますか?
・メモリマップドファイルを確保したプロセスが解放せず死亡
した場合にファイルに書く事はできますか?
・そもそも、メモリを確保する際ページング作業をしない保障は
WIndowsではできないのでしょうか?
そうだとしたら、ディスクをFlashMemory等のRAMディスク
にした場合高速にできますか?
当方、組み込み系システムの詳細設計レベルしかやったことがなく、
担当設計者のフォロー?で、代わりにWINDOWSで基本設計 しています。
時間的要件があるので、処理時間が特定できないのはマズいのですが・・
0931デフォルトの名無しさん
2007/12/06(木) 04:26:15・3MB程度なら、搭載メモリが512くらいあれば余程過労してない限り発生しない。
・メモリマップドファイルとはあたかもメモリの一部のように読み書きできるファイルのことである
・しらね
・できない。普通は備え付け補助記憶装置であるHDDの方が
外部から差し込んだFlashMemoryよりも距離的に近いし高速。
0932デフォルトの名無しさん
2007/12/06(木) 08:34:03すみません質問です。上のC++プログラムをg++でコンパイルすると、イテレータの所でエラーが出て失敗するんですが
どうすれば上手くいくでしょうか?
0933デフォルトの名無しさん
2007/12/06(木) 08:54:06質問するならコンパイルエラーなのか実行時エラーなのか、あとエラーの内容も書いてくれ。
イテレータの宣言のところでコンパイルエラーが出るってわかってるのなら、
その辺の文法とか見直そうよ。
vector<int>::iterator ite;
0934892
2007/12/06(木) 11:24:25case WM_LBUTTONUP:
if(Myflag==false){ //Myflagは変換用アンダーバーが出ていたらtrue
strText = (char *)malloc(256);
GetWindowText(edit , strText , 256);
SetWindowText(copy , strText);
free(strText);
}
return 0;
case WM_COMMAND:
if(GetAsyncKeyState(VK_RETURN)&0x8000){
if(Myflag==false){ //Myflagは変換用アンダーバーが出ていたらtrue
strText = (char *)malloc(256);
GetWindowText(edit , strText , 256);
SetWindowText(copy , strText);
free(strText);
}
}
return 0;
こうすると、左クリックを押した時は期待通りに入力ウィンドウの内容を出力ウィンドウへコピーしてくれるんですが、
エンターキーを押した時は無反応です。
WM_COMMANDとGetAsyncKeyStateの相性が悪いんだろうと思ってメッセージループに同じ内容を書き込んでみたら、
今度は逆に変換決定のエンターキーで反応してしまってます。
0935デフォルトの名無しさん
2007/12/06(木) 11:51:33if (wParam == VK_RETURN) {
は?
0936デフォルトの名無しさん
2007/12/06(木) 11:54:230937デフォルトの名無しさん
2007/12/06(木) 11:57:000938デフォルトの名無しさん
2007/12/06(木) 12:58:09newやvectorを使って書き直したところ、メモリのアドレスがでてきてwrite出来ませんでしたやら、readできませんやら出てきました。原因の行はわかったのですが、他の行となんらかわりのない文です。これはもう初めからやり直すしかないですかね?
0939デフォルトの名無しさん
2007/12/06(木) 13:14:29たとえば10000個しか確保していないのにa[10001]に代入しようとしたらエラーになる
0940デフォルトの名無しさん
2007/12/06(木) 13:16:280941デフォルトの名無しさん
2007/12/06(木) 13:21:330942デフォルトの名無しさん
2007/12/06(木) 13:24:220943デフォルトの名無しさん
2007/12/06(木) 13:27:39ってなんですか?
0944デフォルトの名無しさん
2007/12/06(木) 13:28:58vcでできるんでしょうか?>まともな方々
0945デフォルトの名無しさん
2007/12/06(木) 13:30:120946デフォルトの名無しさん
2007/12/06(木) 13:35:23>bluetoothのプログラミング
(笑)
0947デフォルトの名無しさん
2007/12/06(木) 13:45:57どうやって環境をそろえるんですか?
なんて聞く奴は環境をそろえる事は出来ないと思うけどな〜
0948デフォルトの名無しさん
2007/12/06(木) 13:49:180949デフォルトの名無しさん
2007/12/06(木) 13:50:17m 番の石を最初に取り除く.直前に除いた石から時計回りに石をたどって k 個目を取り除く作業を,残り 1個になるまで繰り返すとする.
標準入力から,n, m, k の 3つの整数値が与えられたとき,最後に残る石の番号を答えるプログラムを書きなさい.
普通の継子立てとおなじく考えてたら全然ダメでした。。。アドバイスお願いします。
0950デフォルトの名無しさん
2007/12/06(木) 13:53:130951デフォルトの名無しさん
2007/12/06(木) 13:57:19ここで質問する==調べものをする
だからなw
0952デフォルトの名無しさん
2007/12/06(木) 13:58:29どこで詰まってるのかよくわからんが、代数的に解かなくても
>m 番の石を最初に取り除く.直前に除いた石から時計回りに石をたどって k 個目を取り除く作業を,残り 1個になるまで繰り返す
この手順通りのことを実際にやるようなプログラムを作ればいいんでない?
0953デフォルトの名無しさん
2007/12/06(木) 14:29:050954デフォルトの名無しさん
2007/12/06(木) 14:31:34long
0955デフォルトの名無しさん
2007/12/06(木) 14:31:380L とか 4095L とか
0956デフォルトの名無しさん
2007/12/06(木) 14:34:04継子立てでいけると思うけど、どうダメだった?
0957デフォルトの名無しさん
2007/12/06(木) 21:50:36課題もなんとか終わりました。質問に対して答えてくれた方々、本当にどうもありがとうございました。
0958デフォルトの名無しさん
2007/12/06(木) 23:35:17配列のサイズってどこに格納されているんでしょうか?
gcc -S でソースを眺めてみたところ特にサイズらしきデータが見当たらず、
sizeofした結果は即値で見つけやすかったんですが。
関係あるかどうかinfo scopeでは配列はサイズは表示されるのですが、
型と要素数では表示されないんですね。
スレ違いなら誘導よろ。
0959デフォルトの名無しさん
2007/12/06(木) 23:49:39配列のサイズって格納されてるの? 俺はできるだけ
vector とか使って size わかるようにして使うようにしてるけど。
0960デフォルトの名無しさん
2007/12/06(木) 23:50:37配列サイズメモリには残っていない
コンパイル中にだけ残っている
サイズ知りたければvector
0961デフォルトの名無しさん
2007/12/06(木) 23:51:100962デフォルトの名無しさん
2007/12/06(木) 23:59:07ただし、newで作った配列は、どこかにサイズ情報を持ってる。返されるアドレスの直前とか。
そうでないと、delete[]で正しく開放できないからね。
0963デフォルトの名無しさん
2007/12/07(金) 00:06:26スタック上の固定長配列はオフセットに化けてメモリ上には展開されないって感じでしょうか。
>>962
そういえば、delete[]はサイズ意識しますもんね。
今度newした配列見てみることにします。
0964デフォルトの名無しさん
2007/12/07(金) 00:58:340965デフォルトの名無しさん
2007/12/07(金) 08:50:47すみません、ご指摘ありがとうございました。
0966282
2007/12/07(金) 20:55:28#include <iostream>
#include <fstream>
#include <sstream>
using namespace std ;
int main(){
stringstream ss;
FILE *fp ;
for ( int t = 0 ; t < 100 ; t++ ){
ss << "data" << t ;
cout << ss.str() <<endl;
if ((fp = fopen(ss.str().c_str(), "r" )) == NULL )
return 0 ;
ss.str("");}}
上記の部分で、ファイルはresult0〜result99まで存在しているにもかかわらず
result46でプログラムが終了します。
ifの判定ミス?だとは思うのですが、どうしてそうなるのかまったくわかりません。
コンパイラはborland C++です
0967デフォルトの名無しさん
2007/12/07(金) 21:05:440968デフォルトの名無しさん
2007/12/07(金) 21:11:57知っている方がおられれば教えてください
10進数で11とかだと16進数でbになると思うのですが
4桁で000bと出力するにはどうすればよろしいでしょうか?
よろしくお願いします。
0969デフォルトの名無しさん
2007/12/07(金) 21:13:37ageたり、282とか間違ってるし答えも単純だし、終わってるな俺 orz
0970デフォルトの名無しさん
2007/12/07(金) 21:14:540971デフォルトの名無しさん
2007/12/07(金) 21:20:01すいません、ありがとうございます。
04の0が抜けてました。
ほんとうにありがとうございます。
0972デフォルトの名無しさん
2007/12/07(金) 22:50:12多重継承時に処理のし忘れを防止するというのはわかるが
それだけのためにラッパーを作るのはどうかなという気がしないわけでもないのですが…
0973デフォルトの名無しさん
2007/12/07(金) 23:04:14意味や意図がわかってれば
public な仮想関数は2つの役目を担っているので
public な非仮想関数と private な仮想関数に分けましょう
ってことを意識すれば public な仮想関数は気持ちわるい
そうやって1つのエンティティに1つの役目を負わすことを意識して
シンプルで扱いやすい設計ができた経験があれば
0974デフォルトの名無しさん
2007/12/08(土) 02:25:51気持ち悪いと思うならやめた方がいいと思う。
そもそもある設計手法が効果的に働くためには一定の条件が必要で、
>>972のプログラムではNVI(Non Virtual Interface)が効果的に働かない部類のものかもしれない。
将来的に不具合が出てきたら変えればいい。
パターンは大事だけど、経験も大事。
0975デフォルトの名無しさん
2007/12/08(土) 07:26:29デルファイのようにGUIでプログラムできるC++はありますか ボーランドC++以外のやつ有りますか?
0976デフォルトの名無しさん
2007/12/08(土) 08:05:46・WideStudio
0977デフォルトの名無しさん
2007/12/08(土) 08:18:40サンクス
0978デフォルトの名無しさん
2007/12/08(土) 08:28:10なんか初めの二つは、SP2とドットネットのインストールが必須な上に作業中の動作が重いんだ
古いパソコンでもDelphi6のように動くC++が使いたいとおもった
0979デフォルトの名無しさん
2007/12/08(土) 08:33:03なんかこれでも難しいんだ・・・
0980デフォルトの名無しさん
2007/12/08(土) 09:06:440981デフォルトの名無しさん
2007/12/08(土) 09:07:280982デフォルトの名無しさん
2007/12/08(土) 10:04:450983デフォルトの名無しさん
2007/12/08(土) 10:07:57釣りか?
一番なんてものは主観だ
全て使ってみて自分で選べ
0984デフォルトの名無しさん
2007/12/08(土) 10:55:08Win32API の方が良いといって使ってたりする。
0985デフォルトの名無しさん
2007/12/08(土) 11:14:23C++Builder6
0986デフォルトの名無しさん
2007/12/08(土) 11:26:150987デフォルトの名無しさん
2007/12/08(土) 11:39:080988デフォルトの名無しさん
2007/12/08(土) 11:41:42A[n][n]の配列を宣言するにはどうしたらいいですか?
0989デフォルトの名無しさん
2007/12/08(土) 11:45:19scanf("%d",&n);
int A[n][n];
0990デフォルトの名無しさん
2007/12/08(土) 11:46:20それじゃできないです
0991デフォルトの名無しさん
2007/12/08(土) 11:47:56A=new int*[N];
for(n=0;n<N;n++)A[n]=new int[N];
0992デフォルトの名無しさん
2007/12/08(土) 11:51:49for(int n=0;n<10;n++)A[n].resize(10);
0994989
2007/12/08(土) 11:53:33#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int A[n][n];
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
A[i][j] = i * 10 + j;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
printf("A[%d][%d]=%d\n", i, j, A[i][j]);
return 0;
}
$ cc -std=c99 a.c
$ ./a
3
A[0][0]=0
A[0][1]=1
A[0][2]=2
A[1][0]=10
A[1][1]=11
A[1][2]=12
A[2][0]=20
A[2][1]=21
A[2][2]=22
0995デフォルトの名無しさん
2007/12/08(土) 11:54:320996デフォルトの名無しさん
2007/12/08(土) 12:07:32> vector< vector<int> > A(10);
> for(int n=0;n<10;n++)A[n].resize(10);
10 ってなんだ?
cin>>n;
vector<vector<int> > A(n,vector<int>(n));
かな。
0997デフォルトの名無しさん
2007/12/08(土) 12:08:28定数値が必要っていわれます
0998デフォルトの名無しさん
2007/12/08(土) 12:10:120999デフォルトの名無しさん
2007/12/08(土) 12:10:22自分の環境も書かずに質問するからそうなる。
1000デフォルトの名無しさん
2007/12/08(土) 12:25:0910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。