【初心者歓迎】C/C++室 Ver.22【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/10/10(月) 00:44:47ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1125743714/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2005/10/10(月) 00:46:11早くうpしろよ
0003デフォルトの名無しさん
2005/10/10(月) 00:46:18前スレ>>1000 うpうp!
0004デフォルトの名無しさん
2005/10/10(月) 00:46:56>>1000 早く
0005デフォルトの名無しさん
2005/10/10(月) 00:47:001000なら妹の下着うpする。
0006デフォルトの名無しさん
2005/10/10(月) 00:48:061000なら妹の下着うpする。
1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20
1000なら妹の下着うpする。
1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20
1000なら妹の下着うpする。
1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20
1000なら妹の下着うpする。
1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20
1000なら妹の下着うpする。
0007デフォルトの名無しさん
2005/10/10(月) 00:57:56VIPでやれ
0008デフォルトの名無しさん
2005/10/10(月) 01:13:52環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0009デフォルトの名無しさん
2005/10/10(月) 01:16:41とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後氏ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0010デフォルトの名無しさん
2005/10/10(月) 01:17:29とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
あと死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0011デフォルトの名無しさん
2005/10/10(月) 01:34:11VIPでやれ
0012デフォルトの名無しさん
2005/10/10(月) 01:49:32data.datというファイルから数値を入力し合計と平均を出すだけの
プログラムだと思うのですが全く何も起こらなくて。
何がいけないんでしょう?
#include<stdio.h>
#include<stdlib.h>
void main(void)
{int val;
int sum=0;
int cnt;
FILE *fp;
if((fp=fopen("data.dat","r"))==NULL)
{ printf("File not found---\n");
exit(1);
}
for(cnt=0;;cnt++)
{fscanf(fp,"%d",&val);
if(val==0)
{break;
} sum+=val; }
if(cnt>0)
{
printf("Sum=%d Ave=%f",sum,(double)sum/cnt);
} fclose(fp); }
0013デフォルトの名無しさん
2005/10/10(月) 01:55:35デバッガで一行ずつ追っていけばすぐ解決するお。
0014デフォルトの名無しさん
2005/10/10(月) 01:57:330015デフォルトの名無しさん
2005/10/10(月) 02:01:04forの条件式は?
0016デフォルトの名無しさん
2005/10/10(月) 02:05:05fscanfでvalに読み込んだ値が0ならbreakするようになってる
0がなかったら無限ループになるだろうね
0017デフォルトの名無しさん
2005/10/10(月) 02:12:030018デフォルトの名無しさん
2005/10/10(月) 02:14:110019デフォルトの名無しさん
2005/10/10(月) 02:14:25fscanfが失敗したらbreakもいれておこう
0020デフォルトの名無しさん
2005/10/10(月) 02:19:510021デフォルトの名無しさん
2005/10/10(月) 02:26:17教えて下さい。
0022デフォルトの名無しさん
2005/10/10(月) 02:36:30まあどっちにしろgccで使えるよ。
0023デフォルトの名無しさん
2005/10/10(月) 02:37:160024デフォルトの名無しさん
2005/10/10(月) 02:41:30bccでも駄目でした・・・
かろうじてFTN95とg77がサポートしてましたが、符号なしは無理なようで・・
0025デフォルトの名無しさん
2005/10/10(月) 02:41:38そういうCPUの桁数(ビット数)を超えちゃう計算ってC言語でどうやるの?
例えばハードディスクの容量の計算とかって余裕で足りないじゃん。
普通に足し算するにしても頭こんがらがるんだけど。
0026デフォルトの名無しさん
2005/10/10(月) 02:42:370027デフォルトの名無しさん
2005/10/10(月) 02:45:21そうすればパンツをご覧にみせます
0028デフォルトの名無しさん
2005/10/10(月) 02:47:54gmpとかのライブラリを使う
0029デフォルトの名無しさん
2005/10/10(月) 02:48:10同感です、FTN95で、922京あたりの素数が求められた時には感動しました。
セレロンだから遅いですけどw
0030デフォルトの名無しさん
2005/10/10(月) 02:48:27手元のcygwin/gcc v3.4.4で
unsigned long long int hoge;
printf("%d\n", sizeof(hoge));
とやったら 8 と出力されるけど。__int64に直してBCC5.5.1でやっても同様。
0031デフォルトの名無しさん
2005/10/10(月) 02:52:29これで心おきなく1844京辺りの素数が求められそうです、
ありがとうございました!
0032デフォルトの名無しさん
2005/10/10(月) 02:55:330033デフォルトの名無しさん
2005/10/10(月) 03:12:17そういうのあるんだ。サンクス。
0034デフォルトの名無しさん
2005/10/10(月) 03:12:28main(){
unsigned __int64 i,j,k;
scanf("%d",&j);
scanf("%d",&k);
i=j*k;
printf("%d %d",i);
return 0;
}
i=4200000000,j=5とかやってみたら、いきなりあふれてしまった、
一筋縄ではいかないようですねw
0035デフォルトの名無しさん
2005/10/10(月) 03:29:22printfのところを//でコメントアウトして実行してみたら?
0036デフォルトの名無しさん
2005/10/10(月) 03:35:51bcc32でやってるんなら、scanf()で__int64とかunsigned __int64を読み込む
書式は用意されてないよ。
自前で用意汁。これがさっき言っていた問題点。
0037デフォルトの名無しさん
2005/10/10(月) 03:37:33んなこたぁない。
%I64dと、%I64uがある。from BCB6。BCC5.5.1でも同じじゃマカろーか。
0038デフォルトの名無しさん
2005/10/10(月) 03:55:05ついでにソース晒してみます。
#include<stdio.h>
#include<math.h>
main(){
unsigned __int64 n,a=0,i,j,m=2,l;
printf("Start number = ");
scanf("%I64u",&l);
printf("End Number = ");
scanf("%I64u",&n);
printf("[%10d] = %10d \n",1,2);
for(i=l;i<=n;i+=2){
for(j=3;j<=__int64(sqrt(i));j+=2){
if(i%j==0){
a=1;
break;
}
}
if(a==0){
printf("[%10I64u] = %10I64u \n",m,i);
m=m+1;
}else{
a=0;
}
}
return 0;
}
0039デフォルトの名無しさん
2005/10/10(月) 04:02:120040デフォルトの名無しさん
2005/10/10(月) 04:12:400041デフォルトの名無しさん
2005/10/10(月) 04:15:46http://www.linux.or.jp/JM/html/LDP_man-pages/man3/scanf.3.html
0042デフォルトの名無しさん
2005/10/10(月) 04:16:300043デフォルトの名無しさん
2005/10/10(月) 04:31:140044デフォルトの名無しさん
2005/10/10(月) 04:47:27あと1も素数と判定されてしまう。
0045デフォルトの名無しさん
2005/10/10(月) 05:22:15#include<math.h>
main(){
unsigned __int64 n,a=0,i,j,m=2,l=1;
printf("Start number = ");
scanf("%I64u",&l);
while(l%2==0 || l==1){
printf("Start number = ");
scanf("%I64u",&l);
}
printf("End Number = ");
scanf("%I64u",&n);
for(i=l;i<=n;i+=2){
for(j=3;j<=__int64(sqrt(i));j+=2){
if(i%j==0){
a=1;
break;
}
}
if(a==0){
printf("[%5I64u] = %20I64u \n",m,i);
m=m+1;
}else{
a=0;
}
}
return 0;
}
0046デフォルトの名無しさん
2005/10/10(月) 05:23:180047デフォルトの名無しさん
2005/10/10(月) 05:27:350048デフォルトの名無しさん
2005/10/10(月) 05:41:25#include<math.h>
main(){
unsigned __int64 n,a=0,i,j,m=1,l=1;
printf("Start number = ");
scanf("%I64u",&l);
if(l==1L){
l=3L;
}
if(l%2==0){
l=l+1L;
}
printf("End Number = ");
scanf("%I64u",&n);
for(i=l;i<=n;i+=2){
for(j=3;j<=__int64(sqrt(i));j+=2){
if(i%j==0){
a=1;
break;
}
}
if(a==0){
printf("[%5I64u] = %20I64u \n",m,i);
m=m+1;
}else{
a=0;
}
}
return 0;
}
0049デフォルトの名無しさん
2005/10/10(月) 05:43:41あと18446744073709549951が個人で求められる最終解っぽいですね
0050デフォルトの名無しさん
2005/10/10(月) 05:46:59今度は2から開始した時に2がカウントされないよ
アルゴリズムの方を見直すという考えはないの
0051デフォルトの名無しさん
2005/10/10(月) 06:13:37#include<math.h>
main(){
for(;;){
unsigned __int64 n,a=0,i,j,m=1,l=1;
printf("Start number = ");
scanf("%I64u",&l);
if(l==1L){
l=3L;
}
if(l%2==0 && l!=2){
l=l+1L;
}
printf("End Number = ");
scanf("%I64u",&n);
if(l==2){
l=l+1;
printf("[ 1] = 2\n");
m=2;
}
for(i=l;i<=n;i+=2){
for(j=3;j<=__int64(sqrt(i));j+=2){
if(i%j==0){
a=1;
break;
}
}
略
これでOKっぽいですね、ありがとうございました。
0052デフォルトの名無しさん
2005/10/10(月) 06:29:000053デフォルトの名無しさん
2005/10/10(月) 07:58:10そんなループwhile使えよ
かっこ悪い
0054デフォルトの名無しさん
2005/10/10(月) 08:26:45言われたとこだけ直して、これでいいでしょ!
とっとと終わらせたい、みたいな。
0055デフォルトの名無しさん
2005/10/10(月) 13:01:58本人はとりあえず結果がでて満足してるんだし
まさか、完璧なコード以外認めないとか言うんじゃなかろうな
0056デフォルトの名無しさん
2005/10/10(月) 13:33:33005751
2005/10/10(月) 14:28:43forで書くとbreakとcontinueがごっちゃになってバグりやすかったです。
0058デフォルトの名無しさん
2005/10/10(月) 14:43:37まあ本当に優雅に見えたのならそれで間違いじゃないし、スレとは全然関係ないけど。
0059デフォルトの名無しさん
2005/10/10(月) 15:16:42という関数を作りたく、以下のようにしたところ、
引数が少ない と、怒られました。2個であってる気がするのですが、
何故怒られるのでしょうか?ちなみに、SHARP を 2 に変えると引数少ないエラーは
消えます。
#include <stdio.h>
#define HYPHEN 0;
#define ASTERISK 1;
#define SHARP 2;
#define PLUS 3;
void draw_symbol(int symbol, int count);
int main(){
draw_symbol(SHARP, 10);
}
0060sage
2005/10/10(月) 15:17:34{
int i;
switch symbol
{
case HYPHEN:
for(i=0; i > count; count++){ printf("-"); }
break;
case ASTERISK:
for(i=0; i > count; count++){ printf("*"); }
break;
case SHARP:
for(i=0; i > count; count++){ printf("#"); }
break;
case PLUS:
for(i=0; i > count; count++){ printf("+"); }
break;
}
}
0061デフォルトの名無しさん
2005/10/10(月) 15:40:41SHARPが"2;"と展開されている。
0062デフォルトの名無しさん
2005/10/10(月) 15:43:47あああああ!!
ありがとうございます。
とってみたらswitchで爆発しました。
0063デフォルトの名無しさん
2005/10/10(月) 15:44:480064デフォルトの名無しさん
2005/10/10(月) 15:53:20すいません。つい。
以下の内容で解決しました。
・switchにの条件式に()を付け忘れていた
・タグの先のforで比較対照(count)を++していた
0065デフォルトの名無しさん
2005/10/10(月) 17:49:37どうすれば良いんでしょうか.
istream_iteratorの使い方がおかしいのかな?
std::vector<std::string> text;
std::ifstream ifs("data.txt");
if(!ifs)
std::exit(EXIT_FAILURE);
std::istream_iterator<std::string> it1(ifs), it2, eof;
it2 = std::find(it1, eof, "山田\n");
std::copy(it1, it2, std::back_inserter(text));
std::copy(text.begin(), text.end(), std::ostream_iterator<std::string>(std::cout));
data.txt
小林
田中
山田
大村
0066デフォルトの名無しさん
2005/10/10(月) 17:56:38#define HYPHEN 0 のままテーブル(?もしくはswitch)でch拾うほうが
いいかもしれんが。さらにくずコードですまん。
#include <stdio.h>
#define HYPHEN '-'
#define ASTERISK '*'
#define SHARP '#'
#define PLUS '+'
void draw_symbol(int ch, int count)
{
while(count-- > 0){ putchar(ch); }
}
int main(void)
{
draw_symbol(SHARP, 10);
}
0067デフォルトの名無しさん
2005/10/10(月) 18:18:480068デフォルトの名無しさん
2005/10/10(月) 18:24:49ちゃんと動くが?
0069デフォルトの名無しさん
2005/10/10(月) 18:29:23結果は
98年1月31日 23時59分59秒 ==> 888937199
98年2月1日 0時0分0秒 ==> 888678000
となってしまいます。
使い方が間違ってますか?
#include<iostream>
#include<time.h>
using namespace std;
main(){
time_t seconds;
struct tm timeptr;
timeptr.tm_mday = 31;
timeptr.tm_mon = 1;
timeptr.tm_year = 98;
timeptr.tm_hour =23;
timeptr.tm_min = 59;
timeptr.tm_sec = 59;
seconds = mktime(&timeptr);
cout<<seconds<<endl;
timeptr.tm_mday = 1;
timeptr.tm_mon = 2;
timeptr.tm_year = 98;
timeptr.tm_hour =0;
timeptr.tm_min = 0;
timeptr.tm_sec = 0;
seconds = mktime(&timeptr);
cout<<seconds<<endl;
return 0;
}
0070デフォルトの名無しさん
2005/10/10(月) 19:13:09mktime()かstruct tmの説明をよく読め。tm_monは1オリジンではない。
0071デフォルトの名無しさん
2005/10/10(月) 19:48:49うち(WinXP, CodeWarrior8.3)じゃ
小林
しかtextに突っ込まれないのです
0072デフォルトの名無しさん
2005/10/10(月) 19:54:59それで正しい動作です。
0073デフォルトの名無しさん
2005/10/10(月) 19:57:29全部小林にしたらヨクネ?
0074デフォルトの名無しさん
2005/10/10(月) 19:59:48すいません.
私の質問は>>71の1行目,「ファイルを特定の行まで読みたい」と言うことです.
私のコードが間違っていて(私の意図とは異なっていて),コンパイル結果がC++としては正しい動作をしていることはわかります.
しかしながらその正しい動作は,私の意図した動作とは異なります.
私の書いたコードのどの部分がおかしくて,どう修正すれば意図した動作になるのか教えてくださればありがたいです.
0075デフォルトの名無しさん
2005/10/10(月) 20:13:40istream_iterator は InputIterator で ForwardIterator じゃないから、1度しか値を取り出せないよ。
0076デフォルトの名無しさん
2005/10/10(月) 20:16:39それと、STLの反復子は、「本当のend」を一つ通り過ぎた位置である
事に注意。
007712
2005/10/10(月) 20:49:33forの条件文は省略してます。
ちょっとまだできないのでもいっかい考えてみます
お騒がせしましたー
0078デフォルトの名無しさん
2005/10/10(月) 21:00:47include <stdio.h>
#include <math.h>
main()
{
double x,y,z;
printf("x =");
scanf("%lf",&x);
printf("y =");
scanf("%lf",&y);
z = pow(x ,y);
printf("x\ty = %lf", z);
}
0079デフォルトの名無しさん
2005/10/10(月) 21:03:37思い通りの動いてるなら、間違っていない。
思い通りに動いていないなら、間違ってる。
0080デフォルトの名無しさん
2005/10/10(月) 21:08:41くだらない事でマルチをする君の行動と態度が間違っている
0081デフォルトの名無しさん
2005/10/10(月) 21:10:14エラーが発生してるから困ってるんです。
0082デフォルトの名無しさん
2005/10/10(月) 21:20:07どんなエラー?
0083デフォルトの名無しさん
2005/10/10(月) 21:24:32H.M.ダイテル+P.J.ダイテル著
学生時代趣味で始めようとして、結局読まずじまいだった本が出てきた。
社会人になってから8年、エクセルのVBAのfor文、if文しか使ったことか無かった俺だが、
2週間で読破し、用語や内容についても読んでいるだけでほぼ理解することができた。
俺の頭が良すぎるのか、テキストがすばらしいのか。とりあえず、おすすめしときます。
なんかサクサク理解できたからか、おもしろくなってきたので
Visual C++.NET 2003 stdを買ってきた。
そして、各種VC++の本を買ってきてきては orz。また買ってきては、orz。
このままでは、合計3万5千円の損になる。C++については理解してると仮定して、
どなたか、良い本知りませんか。
0084デフォルトの名無しさん
2005/10/10(月) 21:26:31推薦図書/必読書のためのスレッド PART26
http://pc8.2ch.net/test/read.cgi/tech/1126785299/
0085デフォルトの名無しさん
2005/10/10(月) 21:29:10VC++で何をしたいんだよ?コンソールアプリ作るのか、WebなのかそれともGUIなのか
GUIにしてもWin32APIを叩くのか、MFC使うのか
まぁ何が言いたいかっていうと ス レ 違 い って事なんだけどな
0086デフォルトの名無しさん
2005/10/10(月) 21:39:38どんなエラーかがちょっとわからないんですけど、
確実にコンパイル通りません。
0087デフォルトの名無しさん
2005/10/10(月) 21:44:15include <stdio.h>
#include <math.h>
include <stdio.h>
#include <math.h>
include <stdio.h>
#include <math.h>
include <stdio.h>
#include <math.h>
これが原因?
0088デフォルトの名無しさん
2005/10/10(月) 21:49:12大事な質問のコツを教えてやる。
エラーメッセージはコピペしろ。
0089デフォルトの名無しさん
2005/10/10(月) 21:51:59すみません、
エラーメッセージってなんですか?
0090デフォルトの名無しさん
2005/10/10(月) 21:53:45まぁ、待て
includeの前に # つけてみ
0091デフォルトの名無しさん
2005/10/10(月) 21:54:380092デフォルトの名無しさん
2005/10/10(月) 22:01:28ないか・・・・・・
0093デフォルトの名無しさん
2005/10/10(月) 22:03:580094デフォルトの名無しさん
2005/10/10(月) 22:40:10009565
2005/10/10(月) 23:06:20なるほど.意図した動作にならない理由が分かりました.
そうするとcopyでファイルの部分部分を一気に読み取る,というのは難しいですかね.
0096デフォルトの名無しさん
2005/10/10(月) 23:14:06GAFREC* pGAFRecs;
LAFREC* pLAFRecs;
int j;
intiNum = 3;
floatfNum = 123.123F;
for(j = 0; j < 20; j++ )
{
pGAFRecs[j].nWL= iNum;
pGAFRecs[j].fFactValue= fNum;
pLAFRecs[j].nWL= iNum;
pLAFRecs[j].fX= fNum;
pLAFRecs[j].fY= fNum;
pLAFRecs[j].fZ= fNum;
iNum *= 3;
fNum += 11.222F;
}
テストしたくて、このように値を入れてあげようかとやったんですけど、下記のエラーがでてしまいました。
&つけるなり、キャストなりとしてみたんですけど、わからずここにきました。
:\HIROEO&RYU\WriteFactorFiles\WriteFactorFilesDlg.cpp(189) : warning C4700: 値が割り当てられていないローカルな変数 'pGAFRecs' に対して参照が行われました。
C:\HIROEO&RYU\WriteFactorFiles\WriteFactorFilesDlg.cpp(191) : warning C4700: 値が割り当てられていないローカルな変数 'pLAFRecs' に対して参照が行われました。
リンク中...
WriteFactorFiles.exe - エラー 0、警告 2
よろしくお願いします。
0097デフォルトの名無しさん
2005/10/10(月) 23:17:47こちらこそよろしくお願いします。
∧_∧
( ・∀・)
( ∪ ∪
と__)__)
0098デフォルトの名無しさん
2005/10/10(月) 23:23:150099デフォルトの名無しさん
2005/10/10(月) 23:26:18多分
pGAFRecs = new GAFREC[20];
pLAFRecs = new LAFREC[20];
っていうのがいるんじゃない?
0100デフォルトの名無しさん
2005/10/10(月) 23:35:32//GAFファイル書き込みデータレコード構造体
typedef struct _tagGAFREC
{
int nWL; //WL値
floatfFactValue; //f値
}GAFREC;
//LAFファイル書き込みデータレコード構造体
typedef struct _tagLAFREC
{
intnWL;//WL値
floatfX;//x値
floatfY;//y値
floatfZ;//z値
}LAFREC;
newは他の関数でして処理してます。
0101デフォルトの名無しさん
2005/10/10(月) 23:38:09まて、 ほかの関数でって言ってるけど、
>>96を見る限り、変数 pGAFRecs; は定義されてから一度もnewされてないじゃないか?
そりゃ、エラーも出るだろ。
0102デフォルトの名無しさん
2005/10/10(月) 23:44:290103デフォルトの名無しさん
2005/10/10(月) 23:45:470104デフォルトの名無しさん
2005/10/10(月) 23:49:110105デフォルトの名無しさん
2005/10/10(月) 23:53:50ファイルポインタの渡し方がわからずどうすればよろしいですか?
自分で行ったポインタの渡し方↓
WriteFactorFiles( "gaffile.csv", "laffaile.csv",
2,pGAFRecs,3,pLAFRecs );
プロトタイプ宣言↓
bool WriteFactorFiles( LPCTSTR lpszGAFName, LPCTSTR lpszLAFName,
int nGAFRecCnt,GAFREC* pGAFRecs,
int nLAFRecCnt,LAFREC* pLAFRecs );
って感じなんですけど、どうすればうまく渡せますか?
0106デフォルトの名無しさん
2005/10/10(月) 23:55:24画面が出てきて終わってしまいます。これは何がいけないんですか?
0107デフォルトの名無しさん
2005/10/10(月) 23:57:21コマンドプロンプトから起動しないから。あるいは入力待ち状態にならないから。
0108デフォルトの名無しさん
2005/10/10(月) 23:57:270109デフォルトの名無しさん
2005/10/10(月) 23:57:410110デフォルトの名無しさん
2005/10/10(月) 23:59:01bool WriteFactorFiles(
LPCTSTR lpszGAFName,
LPCTSTR lpszLAFName,
int nGAFRecCnt,
GAFREC* pGAFRecs,
int nLAFRecCnt,
LAFREC* pLAFRecs );
lpszGAFName にフルパスでファイル名渡すんなら、もらった後で
ファイル開けばいいだけだと思うんだけど……
それがいやなら、多分VC使ってると思うんで、 CFile&とかってやってみるか。
bool WriteFactorFiles(
CFile& gafFile,
CFile& lafFile,
int nGAFRecCnt,
GAFREC* pGAFRecs,
int nLAFRecCnt,
LAFREC* pLAFRecs );
こんな感じ?
0111デフォルトの名無しさん
2005/10/11(火) 00:09:510112デフォルトの名無しさん
2005/10/11(火) 00:27:030113デフォルトの名無しさん
2005/10/11(火) 00:27:04getchar();
これでおk
0114デフォルトの名無しさん
2005/10/11(火) 00:40:260115デフォルトの名無しさん
2005/10/11(火) 00:48:52デバッグしてたんですが。エラーしてしまいました。
どこが悪いか指摘して頂きませんか!お願いします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/970.txt
0116デフォルトの名無しさん
2005/10/11(火) 00:53:080117デフォルトの名無しさん
2005/10/11(火) 00:57:020118デフォルトの名無しさん
2005/10/11(火) 00:57:45delete pGmem;
0119デフォルトの名無しさん
2005/10/11(火) 01:04:270120119
2005/10/11(火) 01:04:590121デフォルトの名無しさん
2005/10/11(火) 01:07:27なんかダイアログがでてきて、英語でわけのわからぬことが
書いてあります。
0122デフォルトの名無しさん
2005/10/11(火) 01:09:49そのわけがわからないことは君にとって分からないことなのであって
普通のプログラマにとっては最も重要な情報の1つなのですよ
0123デフォルトの名無しさん
2005/10/11(火) 01:24:02Program C:\w\WriteFactorFiles.exe
DAMAGE;after Normal block (#81)at 0x00346010
0124デフォルトの名無しさん
2005/10/11(火) 01:25:08deleteするところで↑エラーしてしまいます。
考えられる原因はなんでしょうか?
0125デフォルトの名無しさん
2005/10/11(火) 01:33:28ポインタと、メモリの確保を勉強しなおして来い。
0126デフォルトの名無しさん
2005/10/11(火) 01:33:510127デフォルトの名無しさん
2005/10/11(火) 03:24:30入力ミスとの戦いになるだけでおもしろくもなんともないだろうなぁ。
0128デフォルトの名無しさん
2005/10/11(火) 03:48:18そんなの3ヶ月もすりゃ慣れるべ。
長い目でみてやれや。
0129長い目
2005/10/11(火) 03:53:220130デフォルトの名無しさん
2005/10/11(火) 03:55:24freadがsizeof(int)とsizeof(float)なんじゃ?それだけかどうかは知らんけど。
エラーは"after Normal block"でググれば判る。
0131デフォルトの名無しさん
2005/10/11(火) 07:35:590132デフォルトの名無しさん
2005/10/11(火) 08:49:350133デフォルトの名無しさん
2005/10/11(火) 08:54:44プリントスクリーンキーでとって画像うpしる!
0134デフォルトの名無しさん
2005/10/11(火) 10:03:31[Ctrl]+[C]
0135デフォルトの名無しさん
2005/10/11(火) 10:04:470136デフォルトの名無しさん
2005/10/11(火) 10:57:460137デフォルトの名無しさん
2005/10/11(火) 11:04:040138デフォルトの名無しさん
2005/10/11(火) 11:12:13勉強になりますた
0139デフォルトの名無しさん
2005/10/11(火) 12:39:22漏れも初めて知った
ありがとう^^
0140デフォルトの名無しさん
2005/10/11(火) 12:44:470141デフォルトの名無しさん
2005/10/11(火) 13:52:220142デフォルトの名無しさん
2005/10/11(火) 14:56:40//レコード値を書き込む
for(i = 0; i < nGAFRecCnt; i++)
{
//レコード値を読み込む
fread(&pGmem[i].nWL,sizeof(GAFREC),1,GLFP);
fread(&pGmem[i].fFactValue,sizeof(GAFREC),1,GLFP);
Ret = fprintf(GLFP,"%d,%f",pGmem[i].nWL,pGmem[i].fFactValue );
if(Ret == NULL)
{
delete [] pGmem;
fclose(GLFP);
return false;
}
}
って書いてあるけど、 ここでpGmemがdeleteされたときってもう一回
→→→→delete[]pGmem;←←←ここでエラーが起きてしまいます。
でdelete喰らうわけだよね。
その場合、二回deleteされるわけだけど、そういう時って何が起こってるの?
0143デフォルトの名無しさん
2005/10/11(火) 17:25:170144デフォルトの名無しさん
2005/10/11(火) 18:49:230145デフォルトの名無しさん
2005/10/11(火) 18:50:230146デフォルトの名無しさん
2005/10/11(火) 19:09:310147デフォルトの名無しさん
2005/10/11(火) 20:45:240148デフォルトの名無しさん
2005/10/11(火) 21:51:460149デフォルトの名無しさん
2005/10/11(火) 21:53:020150デフォルトの名無しさん
2005/10/11(火) 22:29:30よくある質問だ。
キミは↓こんな事をしたかったが、できなかった。そうだね?
class Thread {
public:
Thread() { fHandle = CreateThread( ThreadProc ); }
DWORD WINAPI ThreadProc(void *) { return 0; }
};
かわりに↓こうすればよい。
class Thread {
public:
Thread() { fHandle = CreateThread( StaticThreadProc, this ); }
DWORD ThreadProc() { return 0; }
static DWORD WINAPI StaticThreadProc(void *aParam) { return ((Thread*)aParam)->ThreadProc(); }
};
CreateThread には (_beginthread(ex)にも) "パラメータ" を渡すところがあるね?
そこに this を入れるのがコツだ。
0151デフォルトの名無しさん
2005/10/11(火) 22:50:08main() {
int *integer = new int[];
for (int i = 1; i <= 10; i++)
cin >> integer[i];
return 0;
}
これは、コンパイル時にエラーにならないのですが、
メモリの内容壊してますか?
0152デフォルトの名無しさん
2005/10/11(火) 23:02:39でも、俺のやろうとしてる方法と違います。
class Thread{
public:
DWORD __stdcall Thread1(PVOID);
};
クラス内はこうなってます。
これを
class Thread{
public:
static DWORD __stdcall Thread1(PVOID);
};
にするとコンパイル出来るんですが、private部分にある変数が使えません
これはどうすれば??
0153デフォルトの名無しさん
2005/10/11(火) 23:42:05thisを渡したら。
0154デフォルトの名無しさん
2005/10/11(火) 23:57:30明らかにシンタックスエラーじゃないか
どんな糞コンパイラだよ
0155デフォルトの名無しさん
2005/10/12(水) 00:03:57あとC++じゃ関数の戻り値の型省略できない
0156デフォルトの名無しさん
2005/10/12(水) 00:48:50もっと冷静に150を読むんだ。
ナゾナゾだ。150のクラス(下の方のヤシな)で、最終的に
スレッドとして実行される関数はどーれだ?
答え: DWORD ThreadProc()。
じゃあもう一つナゾナゾだ。
ThreadProc() の中で、privateな変数は使えないか?
0157デフォルトの名無しさん
2005/10/12(水) 01:45:03もしかして基本的に関数の定義より先に関数の宣言をしないと、インライン化されるのですか?
0158デフォルトの名無しさん
2005/10/12(水) 01:50:55thisを渡してもダメでした
0159デフォルトの名無しさん
2005/10/12(水) 01:52:53別にインライン化されるとは限らない。
明示的に"inline"指定してもインライン化されるとは限らない。
ただコンパイラに「可能ならそうしてね」とお願いするだけ。
以上は仕様で決まっている話。
0160デフォルトの名無しさん
2005/10/12(水) 01:53:11関数定義するのが一番楽なんじゃないの?
0161デフォルトの名無しさん
2005/10/12(水) 01:54:19C++なら関数の前に宣言を書かないと規格違反
>何でクラス定義の中でメンバ関数を定義したらインライン化されるのですか?
規格でそう定義されてるから
0162161
2005/10/12(水) 01:55:000163デフォルトの名無しさん
2005/10/12(水) 01:58:430164デフォルトの名無しさん
2005/10/12(水) 07:31:220165デフォルトの名無しさん
2005/10/12(水) 07:32:320166デフォルトの名無しさん
2005/10/12(水) 07:42:07ShowWindow
0167デフォルトの名無しさん
2005/10/12(水) 09:33:260168デフォルトの名無しさん
2005/10/12(水) 09:36:40違う
デフォルトのアクセス制限がpublicとprivateの違いしか、
構造体とクラスにはない。
別に構造体でもアクセス制限はできる。
0169デフォルトの名無しさん
2005/10/12(水) 15:00:25そういや何で重複機能なのにclassとstructってあるんかな?
クラスのインターフェースたるpublic部分はクラス宣言の最初に来てる方が
見た目に分かりやすいしstructだけでも問題ないと思うんだけど
0170デフォルトの名無しさん
2005/10/12(水) 15:07:39D&EとARMを嫁
0171デフォルトの名無しさん
2005/10/12(水) 15:11:27D&Eには書いてなかったと思うが
ARM当たるよ
0172デフォルトの名無しさん
2005/10/12(水) 15:58:360173デフォルトの名無しさん
2005/10/12(水) 16:04:550174151
2005/10/12(水) 18:28:18>>154
VC++.NET 2003 stdでし
Win32 コンソールにて
勉強してて、ふと思って書いてみたらエラーにならんかったもんで。
と、いうことはVC++は、コンパイラとしてはあまり良くないんですか?
それともVC++は、あまりにバカバカしいエラーなんで、あきれたのか?
0175デフォルトの名無しさん
2005/10/12(水) 20:07:24fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
こんなエラーでたよ。
0176174
2005/10/12(水) 20:49:33えぇ!?なぜ俺だけ?
ファイル−新規作成−プロジェクト−Win32−Win32コンソールプロジェクト
−−アプリケーションの設定−空のプロジェクト
でつくりました。スレ違いなのでこれ以上は書きませんが、なんでだろ?
0177デフォルトの名無しさん
2005/10/12(水) 20:58:320178デフォルトの名無しさん
2005/10/12(水) 21:11:58んなこと言ってる時点で設計間違ってる。
RTTIについて勉強汁。
0179デフォルトの名無しさん
2005/10/12(水) 21:12:42そういうプログラムが必要になる自分の設計能力を疑うのが先。
0180デフォルトの名無しさん
2005/10/12(水) 21:16:29C++なら
#include <typeinfo>
typeid(なんちゃら).name() で型名が返される、がどう返すかは処理系依存
#include <cstdio>
#include <typeinfo>
#include <string>
using namespace std;
class Hoge{};
int main() {
int i;
const double PI = 3.14159;
Hoge hoge;
printf("%s\n", typeid(i).name());
printf("%s\n", typeid(PI).name());
printf("%s\n", typeid(hoge).name());
printf("%s\n", typeid(string("hoge")).name()); // テンプレートクラスはテンプレートも展開されるのでたいへん
return 0;
}
0181デフォルトの名無しさん
2005/10/12(水) 21:30:56BOOST TYPEOF
0182デフォルトの名無しさん
2005/10/12(水) 22:20:01#include <stdafx.h>
後氏ね。
0183デフォルトの名無しさん
2005/10/12(水) 23:07:15#include "stdafx.h"
0184デフォルトの名無しさん
2005/10/13(木) 00:10:43num = r1
if(r2 < num)
num = r2;
else if(r3 < num)
num = r3;
else if(r4 < num)
num = r4;
else if(r5 < num)
num = r5;
else print("hoge %d" , num);
のようなソースがあったとして、
例えばr3までnumが更新されて、r4で条件を満たさなくなった場合
r5 r6 は判定されなくなりますよね?
それをr2からr6まで判定して決めたいんですけど、どのように記述すればいいでしょうか?
0185デフォルトの名無しさん
2005/10/13(木) 00:13:40無理にif - else if で繋がず、if を繰り返すだけで医院で内科医?
0186デフォルトの名無しさん
2005/10/13(木) 00:13:55意味が分からん、とりあえずr1~r5の大小関係を書け
0187デフォルトの名無しさん
2005/10/13(木) 00:17:360188デフォルトの名無しさん
2005/10/13(木) 00:18:03そのコードだとr2<numがtrueと判定された時点でr3からr5は判定されない
全部判定させたいなら>>185
0189184
2005/10/13(木) 00:41:16ちょっとやってみます
>>186
r1〜r6はこの上で入力データーから計算で出すんですが
サンプルで順に(r1 r2 ・・・)
1100 850 850 1100 400 900
※このソースだとr2が出力されます。でもr5が欲しいです。
>>187
そういうことです。
0190デフォルトの名無しさん
2005/10/13(木) 00:54:22最小値なら、こうすりゃいいんじゃまいか?
int min = r1;
if (r2 < min) min = r2;
if (r3 < min) min = r3;
略
if (r6 < min) min = r6;
r1〜r6が配列にでも入っててくれればもっとすっきりした実装できるんだがな
0191184
2005/10/13(木) 01:04:44実は問題を読み違えてて・・・
最少数も出力しなきゃなりません。(;´Д`)
num = r1;
if(r2 < num) {
num = r2;
printf("hoge2 %d", num);
}
if(r3 < num){
num = r3;
printf("hoge3 %d", num);
}
if(r4 < num) {
num = r4;
printf("hoge4 %d", num);
}
if(r5 < num) {
num = r5;
printf("hoge5 %d", num);
}
if(r6 < num) {
num = r6;
printf("hoge6 %d", num);
} else printf("hoge1 %d", num);
としたんですが、今度は条件を満たしたところすべてが出力されてしまいます・・。
しかもr1〜r6でprintfの内容が異なります。
どうすればいいでしょう・・・
0193デフォルトの名無しさん
2005/10/13(木) 01:14:00struct min{
int num;
int name;
} min;
min.num = r1;
min.name = 1;
if (r2 < min.num) {
min.num = r2;
min.name = 2;
}
if (r3 < min.num) {
min.num = r3;
min.name = 3;
}
略
if (r6 < min.num) {
min.num = r6;
min.name = 6;
}
printf("hoge%d %d\n", min.name, min.num);
書いてから気づいたが、配列がまだなら当然構造体なんてやってないよな・・・
その場合は最初のstructで始まるブロック消して
int num, name;追加して、min.num, min.nameをそれぞれnum, nameに置換してくれ
0194184
2005/10/13(木) 01:25:18hoge1、hoge2とかはたまたま例として書いただけで数字を変えればいいって内容じゃないんです・・・。
個別にあります・・。それでelse ifを考えたんですけど>>184のザマです。
ループですみません;
0195デフォルトの名無しさん
2005/10/13(木) 01:31:49名前が別についてるのか?
それならchar name[10];ぐらい宣言しといてstrcpyでって手もあるが配列やってないんだよな・・・
眠くて頭はたらんのでパス('A`)
0196デフォルトの名無しさん
2005/10/13(木) 01:34:260197184
2005/10/13(木) 02:27:17宿題スレに書いてきました。
こちらにも全部書いてあります。
ここのスレの人どうもでした。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/984.txt
0198デフォルトの名無しさん
2005/10/13(木) 04:39:00num = r1; v=1;
if(r2 < num){ num = r2; V=2; }
if(r3 < num){ num = r3; V=3; }
if(r4 < num){ num = r4; V=4; }
if(r5 < num){ num = r5; V=5; }
if(r6 < num){ num = r6; V=6; }
if(v==1){ printf("hoge1 %d", num); /* その他色々な処理 */ }
if(v==2){ printf("hoge2 %d", num); /* その他色々な処理 */ }
:
0199デフォルトの名無しさん
2005/10/13(木) 06:24:330200デフォルトの名無しさん
2005/10/13(木) 07:40:33KILLでもSTOPでもないんだし。
0201199
2005/10/13(木) 11:26:37ありがとうございます。もう少し詳しく教えていただけないでしょうか?
signal(SIGKILL,func)
とやっても、失敗(SIG_ERR)します。
0202デフォルトの名無しさん
2005/10/13(木) 11:49:41>>199では HUPシグナルを捕まえたかったんじゃないのか?
0203199
2005/10/13(木) 11:54:460204デフォルトの名無しさん
2005/10/13(木) 12:14:370205デフォルトの名無しさん
2005/10/13(木) 12:20:030206デフォルトの名無しさん
2005/10/13(木) 16:38:11ソートできるんですが?
0207デフォルトの名無しさん
2005/10/13(木) 17:05:490208デフォルトの名無しさん
2005/10/13(木) 23:04:030209デフォルトの名無しさん
2005/10/14(金) 01:34:40馬鹿発見
0210デフォルトの名無しさん
2005/10/14(金) 01:56:43じゃあ教えろ
0211デフォルトの名無しさん
2005/10/14(金) 02:19:27>>207
0212デフォルトの名無しさん
2005/10/14(金) 06:45:10この「L」って何なんですか?
普通の「0」とどんな違いがありますか?
0213デフォルトの名無しさん
2005/10/14(金) 06:49:400214213
2005/10/14(金) 06:52:340215デフォルトの名無しさん
2005/10/14(金) 07:06:14同じじゃん。longもlong intも。
0216デフォルトの名無しさん
2005/10/14(金) 07:08:210217デフォルトの名無しさん
2005/10/14(金) 07:25:440218デフォルトの名無しさん
2005/10/14(金) 07:30:34ありがと
0219デフォルトの名無しさん
2005/10/14(金) 07:39:420220デフォルトの名無しさん
2005/10/14(金) 07:40:00あ、素で理解できてないんだ。納得。
0221デフォルトの名無しさん
2005/10/14(金) 07:43:21説明もせずに、理解とかそういう言葉使うわけか。立派な詭弁ですね。
0222デフォルトの名無しさん
2005/10/14(金) 08:09:58C99でどうなったか追っかけてないが、手元のK&R C第2版にはこうある。
P45 2.3 定数
(略)大きすぎてintに収まりきれない整数もlongとして扱われる。(略)
とはいえ、Cの仕様ではintの幅 = longの幅ということも許されるので
intで収まらん数はlongでも収まらんという場合もある。
printf("%s", typeid(100000000000000).name());
↑を各コンパイラに食わせてみたら、VC++.NET 2003とBCC5.5.1は__int64と返し、
g++は「error: integer constant is too large for "long" type」とコンパイルエラーとなった。
0223デフォルトの名無しさん
2005/10/14(金) 08:14:00誰とは言わんが
0224デフォルトの名無しさん
2005/10/14(金) 08:51:53そんなレスしたってまた痛いこと言い出すだけから、
このスレのためにもスルーが一番だと思うよ。
0225デフォルトの名無しさん
2005/10/14(金) 09:13:44考えてみれば理解力が無いから煽ってるんであって、言うだけ無駄なんだよね。
0226デフォルトの名無しさん
2005/10/14(金) 09:35:420227デフォルトの名無しさん
2005/10/14(金) 09:46:55_itoa、_i64toa、_itow、_i64tow
_ltoa、_ltow
_ecvt
_fcvt
_gcvt
stringstream
strstream
0228デフォルトの名無しさん
2005/10/14(金) 09:48:53文字? 文字列じゃなくて?
0229デフォルトの名無しさん
2005/10/14(金) 09:50:510230デフォルトの名無しさん
2005/10/14(金) 10:10:17char s[100];
sprintf(s,"%s",nTableNo);
//FileNameを作成する
lpszFileName = strcat(lpszFileName,s);
なにか上手くいってないんですけど、なにか見落としてるところ
ありますでしょうか?
0231デフォルトの名無しさん
2005/10/14(金) 10:11:380232デフォルトの名無しさん
2005/10/14(金) 10:47:35lpszFileNameを書き換えてはいけません
書き換えたい場合は配列にするか動的にメモリを確保してください
(わかりづらい説明で申し訳ない‥‥リテラル、メモリなどでググってみて)
それとstrcatで文字列を連結しなくてもsprintfで連結できますよ
あとsprintfの第2引数は%sではなくて%dね
0233デフォルトの名無しさん
2005/10/14(金) 11:02:28sprintf(lpszFileName,"%s%d",lpszFileName,nTableNo);
ってやってみましたらOKです。ありがとうございます。みなさん感謝。
0234デフォルトの名無しさん
2005/10/14(金) 11:04:08猫を見てもいまいち理解できなかったのですが、、、
0235デフォルトの名無しさん
2005/10/14(金) 11:05:27こっちで聞いたほうがいいと思うよ
http://pc8.2ch.net/test/read.cgi/tech/1128951330/
0236デフォルトの名無しさん
2005/10/14(金) 11:11:57日を改めて書き込むことにするよ
>>235サンクス
0237デフォルトの名無しさん
2005/10/14(金) 11:36:38sprintf(lpszFileName,"_GRAPHSPEC%d" TableNo);
_GRAPHSPEC固定ならこの方がいいかもしれません
理由はlpszFileNameを第1引数と第3引数の両方に指定しているから。
lpszFileNameから読み込んだ内容がlpszFileNameに書き込まれることになり、
その動作は保証されていなかったと思う。(でも、ちょっと自信がないので詳しい人フォローを‥‥)
まぁ趣味のプログラム程度なら問題ないんだけどね^^
こんなこともあるんだな程度に‥‥
0238デフォルトの名無しさん
2005/10/14(金) 12:12:05誘導されてるんだから、移動する旨、誘導されてきた旨書き添えて書けば問題無いべ
0239デフォルトの名無しさん
2005/10/14(金) 13:16:47それではお言葉に甘えて
以降
http://pc8.2ch.net/test/read.cgi/tech/1128951330/
に移動します。
失礼しました。
0240デフォルトの名無しさん
2005/10/14(金) 17:23:44どこに置いておけばいいのでしょうか?
教えてください。
0241デフォルトの名無しさん
2005/10/14(金) 17:29:470242デフォルトの名無しさん
2005/10/14(金) 17:41:270243デフォルトの名無しさん
2005/10/14(金) 18:16:150244デフォルトの名無しさん
2005/10/14(金) 18:22:17int i;
void main(){}
C++だとエラーになるんですが、Cだとエラーになりません。
何でですか。
明らかにint iの再定義でエラーだと思うんですが
0245デフォルトの名無しさん
2005/10/14(金) 22:41:02while( scanf("%d" , &x) != -1 ){
だと-1を入力しても終わらないんだが・・・
0246デフォルトの名無しさん
2005/10/14(金) 22:42:010247デフォルトの名無しさん
2005/10/14(金) 22:43:450248デフォルトの名無しさん
2005/10/14(金) 22:44:54すれ違い
http://pc8.2ch.net/test/read.cgi/tech/1128354256/
0249デフォルトの名無しさん
2005/10/15(土) 00:31:27おいおい。実行ファイルのある場所=cwdなんて環境の方が少ないことに気付きたまえ。
0250デフォルトの名無しさん
2005/10/15(土) 00:50:21PCの環境変数にPathとかあるじゃないですか?
これって色んなアプリでとりあいになってるっぽいんですけど、
これってなんかうまい使い方あるんですかね?
何が問題かというとですね。
後から設定したものに始めに設定したものが消されてしまって、
始めに設定したアプリが動かなくなってしまうんですよ。
0251デフォルトの名無しさん
2005/10/15(土) 00:52:49必要なものを付け足していけば良いだけ。区切子':'(コロン)
0252デフォルトの名無しさん
2005/10/15(土) 00:52:490253デフォルトの名無しさん
2005/10/15(土) 01:48:41それってアプリインストールしたときに勝手にやってくれます?
>>252
えー。もしかして、そんな方法しかないんすか?
ショボーン。
つか、なんでこんな糞みたいなもん使うのか非常に疑問っす。
激しくウザイ。
なんでこんなもん使いたがるのか。>アプリ制作者
0254デフォルトの名無しさん
2005/10/15(土) 01:59:580255デフォルトの名無しさん
2005/10/15(土) 05:57:50キー入力を行うにはどうすればよいのでしょうか。
WIN APIとMFCをごっちゃで使っています。
HWND wh = ::GetForegroundWindow();
::SendMessage(wh, WM_CHAR, 'a', 0);
として、メモ帳をアクティブにしても何も表示されません。
0256デフォルトの名無しさん
2005/10/15(土) 05:59:030257デフォルトの名無しさん
2005/10/15(土) 06:11:38>>235
0258デフォルトの名無しさん
2005/10/15(土) 07:39:46GetForegroundWindowで取れりゃ苦労せんわ
0259デフォルトの名無しさん
2005/10/15(土) 11:54:13一応マジレス
scanf等の実行文そのものは数じゃないから演算子使っても無駄。
x != -1にしたいなら
while(x != -1){
scanf("%d", &x);
として次のwhile判定で弾く。もしくはbreakを使う。
0260デフォルトの名無しさん
2005/10/15(土) 12:09:41>scanf等の実行文そのものは数じゃない
scanfの返り値はintだけど。
代入に成功した入力項目の数が返される。まあ-1になることはないから>245の例は無限ループだな。
0261デフォルトの名無しさん
2005/10/15(土) 13:04:33ちゃんと定義してヘッダもインクルードしてるのにヽ(`Д´)ノ
0262デフォルトの名無しさん
2005/10/15(土) 14:22:55一応マジレス。
読み込み不一致の対策取っとけ。
0263デフォルトの名無しさん
2005/10/15(土) 14:26:30p = new ((int*)[5])[ncount];
0264デフォルトの名無しさん
2005/10/15(土) 14:28:000265デフォルトの名無しさん
2005/10/15(土) 14:46:11typedef int (*ptr_to_array5_of_int)[5];
ptr_to_array5_of_int *p = new ptr_to_array5_of_int[ncount];
0266デフォルトの名無しさん
2005/10/16(日) 11:42:42intをintの範囲内で簡潔に求める事は出来ますでしょうか。
最上位ビットから論理演算だけでどうにか・・・は無理ですかね。
0267デフォルトの名無しさん
2005/10/16(日) 11:50:31できる
0268デフォルトの名無しさん
2005/10/16(日) 12:30:03SIGTERM に自前のハンドラを設定しているプロセスが、stdin を fgets してブロックしています。
このプロセスに SIGTERM を送ると、ハンドラが実行されるのはいいのですが、
fgets が復帰してくれません。
他のI/Oでは signal が入るとEINTRで復帰すると思うのですが、fgets ではそうならないのでしょうか。
signal が入ったら fgets から復帰させるには、どうしたらよいのでしょうか。
0269デフォルトの名無しさん
2005/10/16(日) 12:37:57int abs(int n){
int c = n >> 31;
return n+c^c;
}
intが32bitでシフト演算が算術シフトと仮定するとこんな感じ。
そうじゃなかったらint c = -(n<0);にしても同じ。
ようするにcは負数なら全ビットが1、そうでなければ0にすれば良い。
0270268
2005/10/16(日) 12:49:23シグナルハンドラの中で fclose(stdin) をしたら、fgets が復帰しました。
が、fgets してる最中に fclose してしまうのってどうなんですかね?
問題無いでしょうか?
0271デフォルトの名無しさん
2005/10/16(日) 12:58:03試してみたら確かに結果は正しいのですが、何故なのか解らず、
16進で1ステップ毎にダンプしてみたら、負の数をシフトすると
シフトしたビットは埋まるのですね。 今まで知りませんですた。 orz
有り難うございました。
0272デフォルトの名無しさん
2005/10/16(日) 13:25:53>269も書いているが、負の値の右シフトが算術シフトである保証はないので要注意。
0273デフォルトの名無しさん
2005/10/16(日) 13:30:34select とか?
スレ違いかな。
0274デフォルトの名無しさん
2005/10/16(日) 17:09:32コード上から値を設定して、そのプログラムが動作時にその環境変数
をずっと有効(export)していたいのですが、どのようにすれば
良いでしょうか?
0275デフォルトの名無しさん
2005/10/16(日) 17:17:04int abs(int x) {
return x & ~0377777777777;
}
C言語の定義内で、ポータブルな方法はない。
0276デフォルトの名無しさん
2005/10/16(日) 17:44:55どういう形で作っているのか知らないけど、
ダイアログベースやSDI等のGUIベースなら、Appクラスなどにメンバ変数として
持たせるって言う手段があると思う。
0277デフォルトの名無しさん
2005/10/16(日) 17:57:37abs() つかえよ。
分岐を使わずに効率よく実装できるなら、コンパイラがそうしてくれるだろう。
0278デフォルトの名無しさん
2005/10/16(日) 17:58:40多分宿題かなんかなんだよ
0279デフォルトの名無しさん
2005/10/16(日) 18:19:30absてlibcだと思いますが、269をインラインかそのまま記述した場合と、
速度的に違い無いんですか?
0280デフォルトの名無しさん
2005/10/16(日) 18:30:37んなもんコンパイラによる。
標準ヘッダのインクルードをただのスイッチとして扱う処理系だって存在しうる。
0281デフォルトの名無しさん
2005/10/16(日) 19:48:49実は単純にif文で書くのが一番速いかも知れない。
0282デフォルトの名無しさん
2005/10/16(日) 20:14:470283デフォルトの名無しさん
2005/10/16(日) 20:24:510284デフォルトの名無しさん
2005/10/16(日) 21:08:370285デフォルトの名無しさん
2005/10/16(日) 22:18:410286デフォルトの名無しさん
2005/10/17(月) 00:30:11その結果
if(n>1){
処理1
}else{
処理2
}
などと言う文が
{処理1}goto out
{処理2}
out:
このようなコードになる可能性がある
その最適化を妨げるのがvolatile宣言
0287デフォルトの名無しさん
2005/10/17(月) 00:31:420288270
2005/10/17(月) 01:34:47stdin は FILE* なので、select とは相性が良くないです。
fd から FILE* のバッファに読み込み済みだと、fread はすぐできても read はすぐできない状況となり、
select は返ってこなくなります。
というか、スレ違いでしたか。
うーん、困った
0289デフォルトの名無しさん
2005/10/17(月) 07:27:53(中略)
#endif
をビルドしてみると
「"defined" の後ろの ')' が欠けています」
とエラーが出るのですが、わたしの環境だけでしょうか?
(gccです)
#if defined(TEST1) && defined(TEST2)
だとうまくいきます
http://www.kumei.ne.jp/c_lang/intro/no_37.htm
0290デフォルトの名無しさん
2005/10/17(月) 07:48:42gccが正しい
0291デフォルトの名無しさん
2005/10/17(月) 09:30:55char * ptr = malloc(1024);
の後で
free(ptr);
をするときにサイズを指定しなくてもきちんとmallocした分が開放されるのでしょうか?
たとえmallocとfreeを別の関数の中で呼び出したとしても、ptrがキャストなどで違う型になっていても、いついかなるときでも大丈夫なのでしょうか?
0292デフォルトの名無しさん
2005/10/17(月) 09:49:22printfは遅いと良くききますが、
なぜ遅いのでしょうか?どの程度遅いのでしょうか?
printf("%c%c%c%c%c",a,b,c,d,e);
と
putc(a);putc(b);putc(c);putc(d);putc(e);
では、どちらが速そうでしょうか?
文字数が変わると、どう変化してくるでしょうか?
0293デフォルトの名無しさん
2005/10/17(月) 10:08:210294デフォルトの名無しさん
2005/10/17(月) 12:03:07たとえば、sprintf( string, "%c%c", c1, c2 )とした場合、
stringの三文字目は、必ず、\0になるのでしょうか?
そういう仕様が決まっているでしょうか?
fprintfについても同様でしょうか?
0295デフォルトの名無しさん
2005/10/17(月) 12:05:43sprintfは文字列の最後にNULL文字を追加する仕様になっています。
fprintfは追加しません。
0296デフォルトの名無しさん
2005/10/17(月) 15:12:14typedef struct aaa {
int x; char y;
} aaa;
として
aaa * ptr = malloc(1234);
のようなサイズで確保した場合でも
void * p = ptr;
free(p);
で正確に1234バイト開放されるのでしょうか?
0297デフォルトの名無しさん
2005/10/17(月) 15:19:06Yes.
0298デフォルトの名無しさん
2005/10/17(月) 15:35:39ありがとうございます!
いったいどういう仕組でそんなことができるのか不思議ですが、今は信じておきます。
どんなコンパイラでも同様に処理してくれると考えてもよいでしょうか?
0299デフォルトの名無しさん
2005/10/17(月) 15:36:08その場合の1234バイトが開放される事はYESだが、2つの領域(aバイト,bバイト)を開放した場合、次に(a+b)バイトの領域を確保できるかどうかは不明
0300デフォルトの名無しさん
2005/10/17(月) 15:36:160301デフォルトの名無しさん
2005/10/17(月) 15:44:54規格に準拠したコンパイラであれば、そう処理してくれる。
0302デフォルトの名無しさん
2005/10/17(月) 15:47:06そうなのですか。例え開放した後でもmallocの後には毎回NULLかどうかチェックしないとダメってことですね。
>>300 >>301
なるほど、納得しました。
しかし、コンパイラは動的確保したサイズは覚えててくれるのに、確保したかどうかや開放したかどうかは覚えててくれないのですね。
面倒ですが、サイズを管理しなくてすむ分は楽だと考えてfreeしまくります!
みなさん、どうもありがとうございました。
0303デフォルトの名無しさん
2005/10/17(月) 15:53:09サイズを覚えているのはコンパイラじゃない。
ヒープマネージャが覚えている。
0304デフォルトの名無しさん
2005/10/17(月) 15:55:161 #include <iostream>
2 #include <algorithm>
3 #include <functional>
4 #include <iterator>
5 using namespace std;
6
7 template <class T>
8 class MyFirstContainer {
9 public:
10 typedef T value_type;
11 typedef value_type *pointer;
12 typedef value_type &reference;
13 typedef size_t size_type;
14 typedef ptrdiff_t difference_type;
15 //typedef pointer iterator;
16 class MyIterator: public iterator <forward_iterator_tag, T> {
17 typename MyIterator::value_type *vp;
18 public:
...
これで、
list4-4.cc:16: parse error before `<'
...
のようになってしまいます。
よろしくお願いします。
0305デフォルトの名無しさん
2005/10/17(月) 16:05:07コンパイラのバグが修正されたってことじゃね?
とソースも読まずにレスしてみる
0306デフォルトの名無しさん
2005/10/17(月) 18:35:30どこを修正したらいいですか?
よろしくお願いします。
#include <stdio.h>
int main(void)
{
char ch;
int num;
ch = 'X';
num = 100;
printf("この %c は", ch);
printf(" %d です", num);
return 0;
}
0307デフォルトの名無しさん
2005/10/17(月) 18:36:46全角文字は多バイト
0308デフォルトの名無しさん
2005/10/17(月) 18:49:11ありがとうございます。
Xをxにしたらきちんと表示されました。
X(2バイト以上)を代入して表示させたい時はどうすればいいですか?
0309デフォルトの名無しさん
2005/10/17(月) 19:01:520310デフォルトの名無しさん
2005/10/17(月) 19:07:59マルチバイト文字列を使うか、ワイド文字を使う
0311デフォルトの名無しさん
2005/10/17(月) 19:21:57だとすると、いずれスタックオーバーフロー?
0312308
2005/10/17(月) 19:30:34ありがとうございます。
ググってみても使い方も分からずまだ理解不足ですが、ひとまずscanf()などの先のステップに進んでみます。
0313デフォルトの名無しさん
2005/10/17(月) 19:51:02Yes.
0314デフォルトの名無しさん
2005/10/17(月) 19:56:05確かなことは言えないんだけど,
g++-2.95のときはクラステンプレート内のサブクラスの定義で
テンプレート使ったら理不尽なエラーが起こっていた.
あと,クラステンプレート内でメンバー関数テンプレートなんか
使うときもエラーの回避に苦労したような記憶がある.
0315デフォルトの名無しさん
2005/10/17(月) 19:57:24Cを想定していますが、別のアプローチがあるならC++でも構いません。
何らかの仕事をし、その結果が成功か失敗かを取得したいとします。
このとき戻り値はどのように設計するのが適切でしょうか?
状況次第というのはごもっともだと思いますが、参考としてだけでも。
私は、以下のように考えました。
(1)成功なら1、失敗なら0を返す
(2)成功なら0、失敗ならエラーの内容により非0(正の数)を返す
(3)成功なら0、失敗ならエラーの内容により非0(負の数)を返す
条件式に使用することを考えると(1)が楽っぽいのです。
この場合、関数名は IsHoge 等にするべきでしょうか?
ただ、それだと値をチェックしてるだけで実際の仕事はしていないようにも見えてしまいます。
(2)や(3)だと、成功したら0なのか、失敗したら0なのかが分かり辛そうです。
(1)のように分かり易い命名法があれば別ですが…。
# 同じ質問をJavaでもしたかったりするのですが、
# さすがにスレ違いかマルチポストは避けられませんよね……
0316デフォルトの名無しさん
2005/10/17(月) 20:00:11C++ならboolを使うなりクラス内で静的定数でtrueとfalseを定義するとか。
0317デフォルトの名無しさん
2005/10/17(月) 20:01:07(1)か(3)が一般的だろうね。
何かのハンドルを返す関数であれば、
失敗時にNULLを返すという意味で(1)にするのが適切だと思うけど
ただエラーコードを返すだけならば(3)でも構わないと思う。
if (DoSomething() < 0) { // error
のような仕様はよく見かけるし。
関数名は特にIsをつける必要はないかと。
0318デフォルトの名無しさん
2005/10/17(月) 20:02:16時によりけり。
それだけでは決めかねる。
# とりあえず、IsHoge なんてネーミングはナンセンスだと思われ
0319315
2005/10/17(月) 20:18:43ありがとうございます。
とりあえず分かったのは、
適切なコメントやドキュメントが大切ということでしょうか。
>>316
それって(1)と何か違うのでしょうか?
>>317-318
値をチェックするだけなら IsHoge でもOKってことですよね?
0320デフォルトの名無しさん
2005/10/17(月) 20:22:18Isをつける場合はエラーコード等は返さず、trueかfalseのみを返した方が直感的。
エラーコードを返す場合は別の名前にした方がいいと思われ
0321デフォルトの名無しさん
2005/10/17(月) 20:36:57>それって(1)と何か違うのでしょうか?
0を返すか1を返すかなんて内部仕様。
TRUEやFALSEを書いとけば動くコードにしとけば
後で気が変わっても今までのもちゃんと動く。
0322315
2005/10/17(月) 21:53:080323デフォルトの名無しさん
2005/10/17(月) 21:58:57どこが適当かイマイチよくわからなくて…
「DirectXゲームグラフィックスプログラミング」という本で勉強しているのですが
ヘッダファイルに
#ifndef _Common_h_
#define _Common_h_
(中略)
#endif // _Common_h_
とされているのですがコレらの意味はなんでしょうか?
重複して読み込まないため?とも思うのですがハッキリした答えがわかりません
どなたかアドバイスお願いいたします
0324デフォルトの名無しさん
2005/10/17(月) 22:03:37>重複して読み込まないため?とも思うのですが
そのとおり.
通称インクルードガード
0325デフォルトの名無しさん
2005/10/17(月) 22:09:22ありがとうございます!
今まではCommon.hに全てのヘッダファイル読ませてましたのですが
それだと無駄なものまで読み込んでしまうので何か無いかと思ってたトコロでした
# インクルードガードってなんとなくカコイイ響きですね
0326315
2005/10/17(月) 22:50:26#ifndef は、既にどこかで定義されていたら読み込まない、という意味なので
1回目にヘッダを読み込んだとき
(1) _Common_h_ が定義されていないので普通に読み込む
(2) _Common_h_ を定義する
(3) 本文を読み込む
(4) ファイル末尾で読み込み終了
となるが、2回目以降は
(1) _Common_h_ が定義されているので #endif まで飛ぶ
(2) ファイル末尾で読み込み終了
となる。
0327デフォルトの名無しさん
2005/10/17(月) 22:51:09名前が残ったままだったぜ!
0328デフォルトの名無しさん
2005/10/17(月) 22:52:06だな
VCのコンパイラとかこれが使える
0329デフォルトの名無しさん
2005/10/17(月) 23:58:360330デフォルトの名無しさん
2005/10/18(火) 00:12:56両方を使っている。
一体何がしたいんだろう……
0331デフォルトの名無しさん
2005/10/18(火) 00:18:01他のコンパイラではonceを無視してくれることを祈りつつ従来のガード?
0332デフォルトの名無しさん
2005/10/18(火) 00:30:30#pragma onceだったらヘッダの読み込みをそこで中断できるから、
インクルードガードと比べて高速になるから。
ただ#pragma onceのない環境も考慮してインクルードガードもついでに付加してる......かな?
0333デフォルトの名無しさん
2005/10/18(火) 00:34:41#include "Common.h"
#endif
0334デフォルトの名無しさん
2005/10/18(火) 00:50:41・_で始まりその次が大文字の名前
・__を含む名前
は予約されてるから_Common_h_みたいなのはイクナイ
0335デフォルトの名無しさん
2005/10/18(火) 03:47:09Javaのパッケージ名はFQDNを逆にしたものが推奨されているようだけど
(com.example.hoge など)
C/C++でもそのようにしたほうがいいのかな?
(#ifndef COM_EXAMPLE_HOGE_XXX.H みたいな感じ)
0336デフォルトの名無しさん
2005/10/18(火) 05:30:47ファイル名にヒネリを加えた名前でいいと思う。
その前提がない場合はUUIDを使うんじゃないかな。
0337デフォルトの名無しさん
2005/10/18(火) 08:05:24VCが吐くpragma onceを入れたヘッダファイルは、
ちゃんとその前後をVCのコンパイラだということを判別する#ifdef〜#endifで囲んである
他コンパイラで読み込めばそこは飛ばされるだけ
>>335
ファイル名がhoge.hだったら
#ifndef ___HOGE_H_DEFINED_AND_INCLUDED_
ってしてる
こんな感じでちょっと捻っただけでええと思う
0338デフォルトの名無しさん
2005/10/18(火) 08:34:190339デフォルトの名無しさん
2005/10/18(火) 10:39:250340デフォルトの名無しさん
2005/10/18(火) 10:45:01まぁ落ち着けよ
0341デフォルトの名無しさん
2005/10/18(火) 12:17:370342デフォルトの名無しさん
2005/10/18(火) 13:03:26効率のいい方法って無いですかね?
かなり高い頻度で検索するので、各要素を順番に_mbsstrで調べていくのは効率が悪いと思いました。
0343デフォルトの名無しさん
2005/10/18(火) 13:05:450344デフォルトの名無しさん
2005/10/18(火) 13:06:480345デフォルトの名無しさん
2005/10/18(火) 13:07:45それじゃ「ある文字列を含む」ではなく「ある文字列と一致する要素」しか探せない希ガス
0346デフォルトの名無しさん
2005/10/18(火) 13:13:26std::find
0348デフォルトの名無しさん
2005/10/18(火) 13:18:49メモリ消費にある程度融通が利くならSuffixArray(もしくはSuffixTree)を使うといいんじゃまいか?
文字列集合全体に対してSuffixArrayを作り、各インデックスとペアで所属するstringへのポインタなりを格納しておけば
全体で数千万文字あっても20〜30回程度の探索で含まれている部分を見つけることができるはず。
0350デフォルトの名無しさん
2005/10/18(火) 13:26:29B&M法でも自分で組むしかあるまい。
0351デフォルトの名無しさん
2005/10/18(火) 14:41:26どうすればいいのでしょうか?
#include <stdio.h>
int main(){
int i,j;
double a;
for(a=0.0,j=0; a<10.0; a+=0.1,j++) {
i=(int)a;
if(j==10){
printf("%f %d \n",a,i);
j=0;
}
}
return(0);
}
0352デフォルトの名無しさん
2005/10/18(火) 14:49:21「うまく出来ません」を説明しろよ。
0353デフォルトの名無しさん
2005/10/18(火) 14:55:38double型は制御変数に使うべきでは有りません。
0354351
2005/10/18(火) 16:35:161.000000 0
2.000000 2
3.000000 3
4.000000 4
5.000000 4
6.000000 5
7.000000 6
8.000000 7
9.000000 8
10.000000 9
>>353
実際のプログラムでは使っていません。
状況を再現するのにやりやすかったので使いました。
0355デフォルトの名無しさん
2005/10/18(火) 16:38:43勝手に察しろというのがばかげてるって分かってる?
0356デフォルトの名無しさん
2005/10/18(火) 16:39:30丸め誤差でググれ
0357デフォルトの名無しさん
2005/10/18(火) 16:43:200358デフォルトの名無しさん
2005/10/19(水) 00:41:20入力するプログラムを作りたいのですが、できますか?
0359デフォルトの名無しさん
2005/10/19(水) 00:44:460360デフォルトの名無しさん
2005/10/19(水) 00:45:42どのような 方法でやればいいのか教えてください
0361デフォルトの名無しさん
2005/10/19(水) 00:57:04とりあえずその起動中のテキストやワードを作った人と連絡を取って
プログラムからの入力方法を聞いたらどうかな
winでならSendMessageとかで送りつければ出来るけど
0362デフォルトの名無しさん
2005/10/19(水) 01:01:36VBでやれば5分もあれば作れる。ODEについてくる開発ガイドを読め。
どうしてもVCでやりたいと言うならまずMFCかATLの経験はあるか?
0363デフォルトの名無しさん
2005/10/19(水) 01:03:03http://pc8.2ch.net/test/read.cgi/tech/1129043264/26
0364デフォルトの名無しさん
2005/10/19(水) 01:11:39よく「テキスト」と「ワード」がアプリの名前だってわかったな。
オレには全然わからなかったぞい。
0365デフォルトの名無しさん
2005/10/19(水) 07:51:24srand(1)とsrand(2)は違う結果になるのですが、srand(0)とsrand(1)はおなじ系列を返します。
それともコンパイラのバグでしょうか?環境はgcc4.0.2、Suse Linux9.2です。
0366デフォルトの名無しさん
2005/10/19(水) 08:06:16MaxOSのシンプルテキストか?
0367デフォルトの名無しさん
2005/10/19(水) 08:08:26MacOSだろ・・・
0368デフォルトの名無しさん
2005/10/19(水) 08:47:51違う引き数で同じ系列を返してはいけないという仕様はなかったと思う。
srand()を呼ばない場合はsrand(1)と同じ系列を使う実装が多い筈なので、
srand(0)とsrand(1)が同じ系列になるのかもしれない。
0369デフォルトの名無しさん
2005/10/19(水) 12:54:32「起動中のテキスト」→痛々しいな
0370デフォルトの名無しさん
2005/10/19(水) 13:10:010371デフォルトの名無しさん
2005/10/19(水) 13:13:280372デフォルトの名無しさん
2005/10/19(水) 15:21:020373デフォルトの名無しさん
2005/10/19(水) 15:47:180374デフォルトの名無しさん
2005/10/19(水) 19:55:13#include<string.h>
main(){
char kekka[5];
char str[40];
printf("【おみくじ】");
getchar();
strcpy(kekka, "大吉");
strcpy(str, "充実した一日。いろいろな所に遊びに行こう");
printf("%s:%s" , kekka, str);
return 0;
}
こんなプログラムを書いたのはいいものの、"大吉"が出力されない。
他の英数字ならできたんだけど、何が悪いんだろう。
0375デフォルトの名無しさん
2005/10/19(水) 20:08:120376デフォルトの名無しさん
2005/10/19(水) 20:14:51とりあえずstrの領域が足りないな。
char str[41]
にしてみそ。
0377デフォルトの名無しさん
2005/10/19(水) 20:19:45ありがとう、無事解決。これで毎朝、大吉しか出ない占いプログラムが鬱な俺を勇気付けてくれます。
0378デフォルトの名無しさん
2005/10/19(水) 20:24:370379デフォルトの名無しさん
2005/10/19(水) 20:27:140380デフォルトの名無しさん
2005/10/19(水) 20:29:480381デフォルトの名無しさん
2005/10/19(水) 20:55:25こちらにコピペさせていだだきます。よろしくお願いします。
激しくレベルが低い質問でとても恥ずかしいのですが教えてください。
Linuxでアプリケーション作っているんですけど、そのアプリケーションの
設定ファイルをそれぞれの一般ユーザーのホームディレクトリに作りたいと
思っています。プログラム自身は/usr/local/binに置くつもりです。
ofstream fout("hogehoge.txt");
でファイルを作ると実行ファイルと同じ場所に出来てしまいます。
というか、/usr/local/binではパーミッションで作れません。
ホームディレクトリはどのように指定してやればいいのでしょうか。
教えてください。お願いします。
FedoraCore4でフルインストール、フルアップデートな状態です。
0382デフォルトの名無しさん
2005/10/19(水) 20:57:280383デフォルトの名無しさん
2005/10/19(水) 21:07:58それだとカレントディレクトリにhogehoge.txtが出来てしまいます。
0384デフォルトの名無しさん
2005/10/19(水) 21:13:50こんなこと聞くのはダメな証拠なのですが
GUIのツール・ソフトウェアを作るのに、最適なツールとか開発ソフトってなんでしょうか
おすすめなのを教えてください
小さなアプリとか、そういう類。で、どんなアプリやツールにはどの言語がいいかとかおながいしまつ
0385デフォルトの名無しさん
2005/10/19(水) 21:15:10../hogehoge.txt
0386デフォルトの名無しさん
2005/10/19(水) 21:16:07つかわすれてしもた。タッチノ
0387デフォルトの名無しさん
2005/10/19(水) 21:16:51つman getenv
0388デフォルトの名無しさん
2005/10/19(水) 21:18:35スレ立てるまでもないにも質問いってきます
0389デフォルトの名無しさん
2005/10/19(水) 21:29:360390デフォルトの名無しさん
2005/10/19(水) 21:31:030391デフォルトの名無しさん
2005/10/19(水) 21:33:440392デフォルトの名無しさん
2005/10/20(木) 01:39:38当方C++でGSLを使っておりまして、GSL_blasを使って、行列計算をしてみたのですが、
500×500の正方行列同士の積にかかる演算時間が1回当たり1.5〜1.7秒と芳しくありません。
GSLを用いずにfor文を用いて同じ演算をやらせても同じような結果が出てしまいます。
通常、このくらいのサイズの行列の演算にはどのくらいの時間を要するのでしょうか?
先ほど、Cの方の質問スレに載せてしまい、マルチになってしまうのですが、どうか教えてくださいませ。
よろしくお願いします。
0393デフォルトの名無しさん
2005/10/20(木) 03:19:34質問が曖昧すぎ。
ハードウェアは何使ってるの?そのスペックは?コンパイラは?
0394デフォルトの名無しさん
2005/10/20(木) 04:10:30うちの3倍は遅いね
0395392
2005/10/20(木) 11:41:25FreeBSDでCPUはathlonXP、コンパイラはG++で-O2をかけてあります。
ほかの事に関してはちょいと分からないかも・・・
0396デフォルトの名無しさん
2005/10/20(木) 12:58:200397デフォルトの名無しさん
2005/10/20(木) 13:05:35ある。
0398デフォルトの名無しさん
2005/10/20(木) 13:12:37計算回数の算出した?
0399デフォルトの名無しさん
2005/10/20(木) 13:22:19void mystrcpy(char *, char *);
void main()
{
char cstr[50], str[]={"leafsaasin-"};
mystrcpy(cstr, str);
printf("%s\n"
"%s\n", str, cstr);
}
void mystrcpy(char *csp, char *sp)
{
int n=0;
while(*(sp+n) != '\0'){
*(csp+n) = *(sp+n);
n++;
}
*(csp+n) = '\0';
}
上記のプログラムのmystrcpy関数を一行で書けるというのですが
どのようにすればいいでしょうか。
0400デフォルトの名無しさん
2005/10/20(木) 13:29:31void mystrcpy(char *csp, char *sp) {int n=0; while(*(sp+n) != '\0'){*(csp+n) = *(sp+n); n++;} *(csp+n) = '\0';}
0401デフォルトの名無しさん
2005/10/20(木) 13:38:41while ( (*csp++ = *sp++) != '\0' );
でいいのかな
0403394
2005/10/20(木) 14:35:50Pentium III (Coppermine) 853.308 Hz
g++ (Debian 1:3.3.5-13)
-O3 -march=pentium3 -msse -mfpmath=sse -fforce-addr -fomit-frame-pointer
liboctave,atlas使って0.47089秒くらい
0405デフォルトの名無しさん
2005/10/20(木) 14:47:49gmpとか
0406デフォルトの名無しさん
2005/10/20(木) 14:59:33for文使ってる方は何回回ってるか判るでしょ
0407デフォルトの名無しさん
2005/10/20(木) 15:01:510408デフォルトの名無しさん
2005/10/20(木) 15:03:53計算量じゃねえよ
0409デフォルトの名無しさん
2005/10/20(木) 15:11:33もっと簡単にスマートに書く方法はありませんか?
std::string* a = new std::string[3];
a[0] = "foo";a[1] = "bar";a[2] = "buz";
for (int i = 0; i < 3; i++) {
if (i != 0) std::cout << ",";
std::cout << a[i];
}
std::cout << std::endl;
0410デフォルトの名無しさん
2005/10/20(木) 15:13:38・・・と内容読まずにレスってみる
0411デフォルトの名無しさん
2005/10/20(木) 15:24:403固定なら
cout << a[0] << "," << a[1] << "," << a[2] << endl;
n なら
if (n){
cout << a[0];
for(int i=1; i<n; ++i) cout << "," << a[i] ;
cout << endl;
}
てきとうだけど
0413デフォルトの名無しさん
2005/10/20(木) 16:40:01とあるクラスAと、それを継承したBを作ったのですが
class A{
void operator =(A&);
};
class B : public A{
void operator =(A&);
};
とやり、メインスレッドで
B b1, b2;
b1 = b2;
とやったところ、何故かBのoperator=(A&)ではなく、Aのoperator=(A&)に飛んでしまいました。
これは何故なのでしょうか。
0414デフォルトの名無しさん
2005/10/20(木) 16:46:35char *a[N] = { /* ... */ };
char *div = "";
int i;
for( i=0; i<N; i++,div="," )
{
printf( "%s%s", div, a[i] );
}
0415デフォルトの名無しさん
2005/10/20(木) 16:50:39const static char punct[] = ",,\n";
for (i = 0; ry
{
fprintf(stdout, "%s%c", a[i], punct[i]);
}
fflush(stdout);
0416デフォルトの名無しさん
2005/10/20(木) 17:18:38aをvectorか配列のラッパテンプレートクラスにして,
std::copy(a.begin(), a.end() - 1, std::ostream_iterator<std::string>(std::cout, ","));
std::cout << *(a.end() - 1) << std::endl;
ってのは?
0417416
2005/10/20(木) 17:25:51std::copy(a.begin(), a.end() - 1, std::ostream_iterator<std::string>(std::cout, ","));
std::cout << a.back() << std::endl;
0418デフォルトの名無しさん
2005/10/20(木) 17:44:41ファイル名を知るには、どうしたらよいでしょうか。
OS:Windows Xp Pro SP2 コンパイラ:Borland C++ 5.5.1
#include <stdio.h>
#include <windows.h>
void main(void)
{
HANDLE hProcess;
char fileName[1000];
/* 第三引数は、タスクマネージャで見つけた notepad.exe の PID */
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 3644);
GetModuleFileName(hProcess, fileName, 1000);
printf("ハンドル:%d\n", hProcess);
printf("ファイル名:%s\n", fileName);
CloseHandle(hProcess);
}
ソースファイル名 getName.c
コンパイル時のコマンド >bcc32 getName.c
実行結果
ハンドル:2000
ファイル名:タ・
0419デフォルトの名無しさん
2005/10/20(木) 17:55:55最低限返り値を調べろよ。
0420418
2005/10/20(木) 19:12:37上記のように書き換えてみると、
GetMFN:0 と表示されました。
notepad.exeのファイル名の取得に失敗しているようです。
また、notepad.exe以外の実行ファイルのPIDを試したところ、
以下のような規則性がありました。
「プロセス」の「ユーザー名」が SYSTEM の場合
GetMFN:35
ハンドル:0
ファイル名:D:\mydata\C\新しいフォルダ\getName.exe
「プロセス」の「ユーザー名」が ログインユーザ名 の場合
GetMFN:0
ハンドル:2000
ファイル名:タ・
管理者、制限ユーザ両方でログインしてみましたが、結果は同様です。
0421デフォルトの名無しさん
2005/10/20(木) 19:32:09GetModuleFileNameが失敗する原因をGetLastErrorで調べてみた?
0422418
2005/10/20(木) 20:12:14hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 1472);
1箇所目……
GetModuleFileName(hProcess, fileName, 1000));
2箇所目……
「プロセス」の「ユーザー名」が SYSTEM の場合
アクセスが拒否されました。
この操作を正しく終了しました。
「プロセス」の「ユーザー名」が ログインユーザ名 の場合
指定されたプロシージャが見つかりません。
この操作を正しく終了しました。
OpenProcess()が失敗しているようです。
タスクマネージャで見たPIDをそのまま打ち込んではいけないのでしょうか。
0424デフォルトの名無しさん
2005/10/20(木) 21:17:14最後の項目を特別扱いすればいいじゃん。
for (int ic = 0; ic < cols; ++ic) {
std::cout << a[ic] << ic == cols - 1 ? '\n' : ',';
}
0425デフォルトの名無しさん
2005/10/20(木) 21:29:03特定の条件を満たさない場合はポインタを返さず
エラーで終了させたい場合はどうやるのが一般的でしょうか?
Test* func(int a)
{
if(a==5) return p;
}
だとビルド時に戻り値がないと警告がでてしまいます
0426デフォルトの名無しさん
2005/10/20(木) 21:30:240427デフォルトの名無しさん
2005/10/20(木) 21:31:58if(!func(4)) return ;
0428デフォルトの名無しさん
2005/10/20(木) 21:38:16MSDN嫁。PROCESS_ALL_ACCESS権限で他プロセスのハンドルを得るには
SeDebugPrivilege特権を得ておく必要があると書いてある。
GetModuleFileName()にしかハンドルを使わないのなら、
PROCESS_QUERY_INFORMATION程度で十分なんじゃないか?
0429デフォルトの名無しさん
2005/10/20(木) 22:13:57"エラーで終了させたい" って何をどのように終了させるんだか?
関数を終了(return)するだけなら、0(NULL,正常なポインタでない値)を
返して上位でエラー処理、とか、プログラム自体をここで強制終了
したいなら必要な終了処理を呼び出した後に、exit(1) とか?
一般的ったって、目的必要に応じてだから、質問下手すぎ。
0430デフォルトの名無しさん
2005/10/20(木) 22:20:07Cなら単純にexit()してもいいかもしらん。
C++なら素直に例外を投げるのがよい。
0431デフォルトの名無しさん
2005/10/20(木) 22:21:32どちらにしても、戻り値を返す関数は、戻り値を返さないわけにはいかない。
どの場合でも(exitなど制御を飛ばすものはともかく)表記上は必ず戻り値を
返すように記述する必要があるのは当然。
0432418
2005/10/20(木) 22:37:28これがキーワードだったようです。
http://support.microsoft.com/default.aspx?scid=kb;ja;131065
こちらのページのサンプルでは、動作が確認できました。
ありがとうございました。
0433392
2005/10/20(木) 23:07:05遅レス申し訳ないです。
>>407さんのとおり、計算回数はO(N^3)(500^3)だと思います。
for文の中では掛け算を500^2回実行している事になります。
どうにかして、もうちょっと早く動かす事は出来ないのでしょうか?
0434デフォルトの名無しさん
2005/10/20(木) 23:59:250436デフォルトの名無しさん
2005/10/21(金) 00:59:060437デフォルトの名無しさん
2005/10/21(金) 01:02:06for(i=0; i<MAX; i++){処理;}だと1回ごとにforの条件判定が来るがfor(i=0; i<MAX; i+=2){ 処理;処理; }だと2回に1回forの条件判定が来る
これをfor(i=0; i<MAX; i+=100){ 処理; ... 処理; }とするとforの条件判定が100回に1回になる
これがエンロール
0438デフォルトの名無しさん
2005/10/21(金) 01:06:470439デフォルトの名無しさん
2005/10/21(金) 01:10:47そうやってCPUのキャッシュをだめにするのが速くする秘訣か。
0440デフォルトの名無しさん
2005/10/21(金) 01:15:010441デフォルトの名無しさん
2005/10/21(金) 01:22:35>>439
キャッシュのミスヒットが起きると性能落ちるから1次キャッシュいっぱいまで広げるのがミソ
キャッシュのアラインにあわせてループの展開回数を調整する必要があるがまあそこまでやらないでも条件判定が減るだけでもだいぶ違う
Pentium4用に最適化かけるのとXeon用に最適化かけるのとではコードサイズに差がでる
0442434
2005/10/21(金) 01:25:350443デフォルトの名無しさん
2005/10/21(金) 01:25:380444デフォルトの名無しさん
2005/10/21(金) 01:30:50例えばPrescottだと命令キャッシュは実行トレースだからキャッシュに収まるように
工夫するのにμOP考えないといけないから無理だと思うよ。
0445デフォルトの名無しさん
2005/10/21(金) 01:31:47ではグッドノウハウとやらをお願いします。
0446デフォルトの名無しさん
2005/10/21(金) 01:36:17とある駐車場の駐車料金の計算をするのにプログラム組みたいのですが
色々わからないとこあるので教えてほしいです。
まず、そこの駐車場は
1日の駐車料金の最大料金が
平日1500円 土日祝日1200円で当日最大ではなく毎日適用。
時間料金が曜日時間関わらず 15分100円(1時間400円)
つまり、平日だと駐車時間が3時間30分を超えたあたりで1500円でそれ以上料金はあがらない。
という料金設定です。
で、組みたいのが
入庫時間(月日時分を続けて入力 例:10月21日1時30分なら 10210130)
と出庫時間(上記同様)
を入力すると駐車料金が表示されるのを作りたいのです。
コンパイラは MS Visual C++ 2003
一応、C++でコンソールアプリケーションとして作りたいのですが
OSの時計機能から時分と取り込んだりして祝日などの判別もしてみたいのです。
どうふうにすればいいのか
よろしくおねがいします。
0447デフォルトの名無しさん
2005/10/21(金) 01:38:130448デフォルトの名無しさん
2005/10/21(金) 01:39:41というか、条件判断のコードが出てこなくなるから単純にキャッシュのミスヒットや分岐予測をする必要が無くなり
その結果としてパイプラインのストールも減る
したがってNetBurstなんかでも有効
まあ、この辺は最近はコンパイラが最適化として考えてくれるんだっけ?
0449デフォルトの名無しさん
2005/10/21(金) 01:43:07そういうので処理速度を少しでも縮めようと可読性の低いコードを量産するよりも
律速になっている部位を特定してそこのアルゴリズムを改良する、あるいは設計を見直す
これでいいですか
0450デフォルトの名無しさん
2005/10/21(金) 01:49:29本計算の際には計算時間が短くなるほうが良いコード
いわゆる、通常アプリケーションとは少し考え方が違う
0451デフォルトの名無しさん
2005/10/21(金) 01:50:16b1 = b2;
で呼ばれるのは暗黙のB::operator=(B&);
0452デフォルトの名無しさん
2005/10/21(金) 01:52:36ストールするのはほとんどの場合ループを抜ける時だけ。
むしろ実行トレースキャッシュに収まらなくて毎回トレースキャッシュミス起こす方が
コストが高くつくと思うけど。
0453デフォルトの名無しさん
2005/10/21(金) 01:56:48それは、今回のバッドノウハウと指摘した物に対比した場合、
グッドノウハウと呼べるほど具体的なものでは無いような気がしますけど。
俺の気のせいですかそうですか。
まぁいいんでない?それで満足なら。
0454デフォルトの名無しさん
2005/10/21(金) 02:13:08どうなんだろうね?NetBurstにはV-Tune掛けろとしか言い様が無いな
0455デフォルトの名無しさん
2005/10/21(金) 03:11:02this->items(これはArray何とか型)->Clear();
でthisによってitemsという変数を引っ張って来るのは分かるのですが
そこからArray何とか型(失念してしまいました)::Clear();となりitemsの中身が
クリアされるのは何故なのか分かりません。
どういった処理がここでは行われているのでしょうか?
0456デフォルトの名無しさん
2005/10/21(金) 04:17:35itemsの中身をクリアする処理に決まってるじゃんか
0457デフォルトの名無しさん
2005/10/21(金) 07:09:36items(これはArray何とか型)->Clear(); の結果
Array何とか型(失念してしまいました)::Clear();
に何故なるのかという事です。申し訳ないです
0458デフォルトの名無しさん
2005/10/21(金) 07:11:030459デフォルトの名無しさん
2005/10/21(金) 07:46:410460デフォルトの名無しさん
2005/10/21(金) 10:02:54派生できないのですが、なぜかわかりますか?
#ifndef COMMAND_WINDOW_H
#define COMMAND_WINDOW_H
#include <afxwin.h>
class CCommandWindow {
public:
CCommandWindow() {}
virtual void Main() = 0;
void Draw();
};
#endif // COMMAND_WINDOW_H
#ifndef GAME_SELECT_WINDOW_H
#define GAME_SELECT_WINDOW_H
#include <afxwin.h>
#include "CommandWindow.h"
class CGameSelectWindow : public CCommandWindow { // ここでエラー
public:
CGameSelectWindow() {}
CGameSelectWindow(int x, int y);
virtual void Main();
};
#endif // GAME_SELECT_WINDOW_H
0461デフォルトの名無しさん
2005/10/21(金) 10:19:13itemsを仮にCitems型と仮定して
下二つの文のやってることは同じ
this->items->clear();
↓
Citems* items = this->items;
items->clear();
0462デフォルトの名無しさん
2005/10/21(金) 10:22:02とりあえずヘッダ内の宣言だけはコンパイル通った。
void CGameSelectWindow::Main()
を定義してないものをコンパイルしようとした。
StdAfx.h,CommandWindow.cpp,CGameSelectWindow.cpp
その他の*.h,*.cppのインクルードファイルをミスった。
を予想。
0463デフォルトの名無しさん
2005/10/21(金) 11:00:49Main()は派生クラスで定義してあります
ファイル名は何度も確認したので間違ってないと思います
空のプロジェクトで作ったのでstdafx.hはありません
今コンパイルしたら意味不明なエラーがいっぱい出てきた・・・
enum {
SPADE = 1, CLUB, HEART, DIAMOND, JOKER, BOTTOM
};
// error C2065: 'CLUB' : 定義されていない識別子です。
// error C2065: 'HEART' : 定義されていない識別子です。
// error C2065: 'DIAMOND' : 定義されていない識別子です。
// error C2065: 'JOKER' : 定義されていない識別子です。
// error C2065: 'BOTTOM' : 定義されていない識別子です。
(今定義してるのに)
// error C2143: 構文エラー : ';' が '{' の前にありません。
// error C2143: 構文エラー : ',' が '}' の前にありません。
(全ての{}にエラー出してるらしい)
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
// error C2275: 'UINT' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
(使用してない)
こんな感じで140ほど
0464デフォルトの名無しさん
2005/10/21(金) 11:01:380465デフォルトの名無しさん
2005/10/21(金) 13:13:54派生クラスのMainからvirtualを取れ
0466デフォルトの名無しさん
2005/10/21(金) 13:26:26「未定義のシンボルIHTMLDocument」っていうコンパイルエラーが出ます
C++Builder使ってます
0467466
2005/10/21(金) 13:43:15でした
0468デフォルトの名無しさん
2005/10/21(金) 17:09:16まだコンパイル通りませんが、そうしてみます
>>462>>465
付き合ってくれてありがとうございました
0469デフォルトの名無しさん
2005/10/22(土) 08:24:54おかしなエラーは出てきませんでした。継承も問題無くできました
ソースの書き換えとコンパイルしかしていないのに、
突然>>463のように意味不明なエラーが大量に出てきました
ソースをエラーが出る前の状態に戻してもエラーは消えませんでした
もうコンパイラのバグとしか思えません
こういう症状に心当たりはありませんか?
winxphomeSP2、vc++.net2003です
0470463
2005/10/22(土) 08:25:260471デフォルトの名無しさん
2005/10/22(土) 08:42:23その新しいプロジェクトのファイル構成を全部挙げてみろ
0472デフォルトの名無しさん
2005/10/22(土) 08:48:43頭悪いとしか言いようがない。
0473デフォルトの名無しさん
2005/10/22(土) 08:50:38カードゲームです。メニュー画面の作りかけです
他にresource.hと画像ファイルがあります
0474デフォルトの名無しさん
2005/10/22(土) 09:00:16コンパイルの流れを追ってみろ。
まずMyMenu.cppをコンパイルする時にインクルードされる順番は
MyMenu.h ・・・(1)
StdAfx.h
CommandWindow.h→Draw.h→MainFrame.h→CardGame.h→MyMenu.h
ここでCardGame.hからMyMenu.hをインクルードして安心しているようだが
(1)でインクルードガードが既に発動していて中身は読み飛ばされる。
しかも(1)でも内容は読み込まれる前。
コンパイラがCMyMenuを把握するタイミングなぞないよな?
0475デフォルトの名無しさん
2005/10/22(土) 09:09:59キミたぶん、この新しいプロジェクトと前のプロジェクトは同じ構成と思ってるんだろう
そうでないと、コンパイラのバグとか思うわけもないからな
ハッキリ言う、同じ構成じゃない
前のプロジェクトは、必要なファイルが作られてなかった
だからエラーが出てるんだよ
0476463
2005/10/22(土) 09:14:50インクルード先の読み込みが終わったら
インクルード元に戻ってくるんじゃないんですか?
関数の呼び出しみたいに
MyMenu.hの最初の別ヘッダの読み込みが終わったら
下の内容が読み込まれるんじゃないんですか?
0477デフォルトの名無しさん
2005/10/22(土) 09:20:08悪いことは言わん、もっとVC++でのプログラムの仕方を勉強してから出直せ
空プロジェクト作って1から自作するには早すぎる
0478デフォルトの名無しさん
2005/10/22(土) 09:21:340479デフォルトの名無しさん
2005/10/22(土) 09:28:20>>476
> インクルード先の読み込みが終わったら
> インクルード元に戻ってくるんじゃないんですか?
> 関数の呼び出しみたいに
読み込みじゃなくて一つのファイルに展開するようなモンなんだが。
MyMenu.hのインクルードより下の内容が読まれる前に
CardGame.hで未定義の識別子CMyMenuが出てくるでしょ?
CMyMenuが未定義になるのは、CardGame.hでMyMenu.hをインクルードしていても
そもそもCardGame.hがMyMenu.hからいつくかのヘッダーファイルを経由して
呼び出されているわけだから、既にMY_MENU_Hが定義されていて
その時のCardGame.hからはインクルードガードで中身が見えない。
~~~~~~~~~
処理系依存になっていいなら#pragma onceでも使え。
0480463
2005/10/22(土) 09:39:40確かに順番通り見ていくとCMyMenuの定義が済む前に使用してます
#pragma onceでも使ってみます
教えてくれてありがとうございました
0481デフォルトの名無しさん
2005/10/22(土) 11:29:000482デフォルトの名無しさん
2005/10/22(土) 11:41:11>>480
気にするなよ。
慣れないうちは誰でもそんなもんだ。
0483デフォルトの名無しさん
2005/10/22(土) 11:43:010484デフォルトの名無しさん
2005/10/22(土) 11:45:360485デフォルトの名無しさん
2005/10/22(土) 14:30:340486デフォルトの名無しさん
2005/10/22(土) 15:22:030487デフォルトの名無しさん
2005/10/22(土) 16:03:10fileno
0488デフォルトの名無しさん
2005/10/22(土) 16:08:39そんな低レベルな問題じゃないから。
0489デフォルトの名無しさん
2005/10/22(土) 16:17:300490デフォルトの名無しさん
2005/10/22(土) 17:28:06selectは相性が良くないって話だろ
常識だぞ
0491デフォルトの名無しさん
2005/10/22(土) 17:30:46sizeof(a);
と
int a = 123;
sizeof(int);
って全く等しいのですか
0492デフォルトの名無しさん
2005/10/22(土) 17:31:460493デフォルトの名無しさん
2005/10/22(土) 17:34:32いいえ、前者と後者では括弧を省略できるかできないかの違いがあります。
0494デフォルトの名無しさん
2005/10/22(土) 18:32:12それは「いいえ 'a' と 'int' が違います」と言うようなもんだろ。
0495デフォルトの名無しさん
2005/10/22(土) 18:45:10そこで思考停止するのはもったいない。
0496デフォルトの名無しさん
2005/10/22(土) 22:44:37ヘルプ嫁
0497デフォルトの名無しさん
2005/10/23(日) 10:43:200498デフォルトの名無しさん
2005/10/23(日) 11:06:36とにかくsizeofの結果は同じになる。
ちなみに構文上、sizeofに指定するのが型名でない場合はsizeof aと書ける。
0499デフォルトの名無しさん
2005/10/23(日) 11:37:30inline void func() { ... }
という関数があり、何カ所からか利用され、ある程度インライン展開されているのは確認しています。
この関数を、さらに関数テーブルでのアクセスにも利用したいと考えております。
void (*pfunc)() = func;
このようなコードを埋め込むと、その他の参照箇所のインライン化まで阻害してしまうのでしょうか?
別途funcの実体を用意し、その他のインライン展開に影響は与えないように最適化されるのでしょうか。
一般的なコンパイラの実装の場合で構いませんので、ご教授いただきたく(´・ω・`)
0500デフォルトの名無しさん
2005/10/23(日) 11:52:10おそらく後者。
0501デフォルトの名無しさん
2005/10/23(日) 12:10:19>>500に一票
0502デフォルトの名無しさん
2005/10/23(日) 12:19:34素早いレスありがとうございます。
かなり実行速度にシビアな環境なので、本来ならばマクロやらで強制展開させるべきなのでしょうが
可読性やその他もろもろを考えると、、、というところで悩んでいました。
とりあえずこのまま行けそうなことが分かり安心いたしました。
ありがとうございました。
0503デフォルトの名無しさん
2005/10/23(日) 14:49:220504デフォルトの名無しさん
2005/10/23(日) 16:15:400505デフォルトの名無しさん
2005/10/23(日) 18:59:470506デフォルトの名無しさん
2005/10/23(日) 19:03:50標準の範囲でやろうとするならば
int size;
fseek(fp, 0, SEEK_END);
size = ftell(fp);
ただし確実ではないので、出来ることならシステム固有のAPIを使うべき。
0507デフォルトの名無しさん
2005/10/23(日) 19:58:42ファイルサイズが2GBを超える場合、>506の手法は使えない場合が多いので念のため。
0508デフォルトの名無しさん
2005/10/25(火) 15:16:51その引数をポインタにするか参照にするかでいつも迷うんですけど、
皆さんはそこら辺はどうしてるんですか?
0509デフォルトの名無しさん
2005/10/25(火) 15:19:15基本的には参照。
NULLを渡す可能性がある場合はポインタ。
0510デフォルトの名無しさん
2005/10/25(火) 15:20:040511デフォルトの名無しさん
2005/10/25(火) 15:25:130512デフォルトの名無しさん
2005/10/25(火) 15:52:450513デフォルトの名無しさん
2005/10/25(火) 16:07:55[in]パラメータは参照
[out]、[in,out]パラメータはポインタ
0515デフォルトの名無しさん
2005/10/25(火) 17:29:530516デフォルトの名無しさん
2005/10/25(火) 17:58:480517デフォルトの名無しさん
2005/10/25(火) 18:20:410518デフォルトの名無しさん
2005/10/25(火) 18:21:46何がわからないのかわからない。
0519デフォルトの名無しさん
2005/10/25(火) 18:23:590520デフォルトの名無しさん
2005/10/25(火) 18:39:28あるポインタから別のポインタまでのアドレスに格納されてる値の全てを配列に格納したのですがどうすればいいですか
って事です。
繰り返し文使わないと駄目ですかね
0521デフォルトの名無しさん
2005/10/25(火) 18:40:19じゃあもういいんじゃね?
したいの?
じゃあmemcpyでも使えば?
0522デフォルトの名無しさん
2005/10/25(火) 18:44:44ありがとビーム}!!!!!!!!!!111111111^^^^^^^
0523デフォルトの名無しさん
2005/10/25(火) 19:01:30C++ならstd::copyとか使うほうが良いかもしれない。
0524デフォルトの名無しさん
2005/10/25(火) 23:49:45X Y Z
X Y Z
…
X Y Z
っていう座標があるんだけど、これを比較するのだけど
1行目読み込んでから、下の行全部比較して
次は2行目から下の行を比較っていうのやるにはどうすりゃいいのかな
行単位で指定して、数値型で読み込むのってどうやったらいいのかわかんなくて
0525デフォルトの名無しさん
2005/10/25(火) 23:54:06全部メモリに読み込んでから処理したら?
0526デフォルトの名無しさん
2005/10/25(火) 23:54:100527デフォルトの名無しさん
2005/10/25(火) 23:56:12メモリが足りなくなるほどの行数なので
順次比較してメモリを消費しない方向でやりたいのです
>>526
テキストファイルです
ファイル操作で、何行目から読み込むとかそういう指定が出来ないのかと…
0528デフォルトの名無しさん
2005/10/25(火) 23:59:05メモリが足りなくなるほどの行数ってどれくらいよ。
実際にやってみもしないうちから足りない足りない言うのは阿呆だよ。
0529デフォルトの名無しさん
2005/10/26(水) 00:01:140530デフォルトの名無しさん
2005/10/26(水) 00:01:470531デフォルトの名無しさん
2005/10/26(水) 00:02:230532デフォルトの名無しさん
2005/10/26(水) 00:06:39fgetsとかだと、1行単位で読み込んでも、文字型だし比較が出来ず
何行目を読み込むかという指定が出来ないと効率も悪いので
早い話が1個目の座標をがーっと最期の1000万まで比較して、
次の座標は、またはじめから比較するのはアフォくさいからそれより下の行から比較ってのをやりたいのです
0533デフォルトの名無しさん
2005/10/26(水) 00:10:440534デフォルトの名無しさん
2005/10/26(水) 00:13:23ファイルにするんだね。そうすればランダムアクセスできるから。
さらに高速化したいんなら、バイナリに汁。
0535デフォルトの名無しさん
2005/10/26(水) 00:13:26無理。何回もそれはやってるから
一時変数にはじめの座標格納して
それ以下のは比較の変数に格納して、それを順次更新していけばメモリは食わないじゃん
ただ、それをやるのに、行指定で数値型で格納する方法がわからなくて
0536デフォルトの名無しさん
2005/10/26(水) 00:14:310537デフォルトの名無しさん
2005/10/26(水) 00:16:58領域の取り方が悪いだけじゃ・・・
0538デフォルトの名無しさん
2005/10/26(水) 00:17:350539デフォルトの名無しさん
2005/10/26(水) 00:20:380540デフォルトの名無しさん
2005/10/26(水) 00:25:530541デフォルトの名無しさん
2005/10/26(水) 00:43:26その位の事、自力でやれよ。
役に立たないヤシだなぁ…
0542デフォルトの名無しさん
2005/10/26(水) 00:45:52----create.cpp(1000万行のテキストデータを作る)-----
#include <fstream>
using namespace std;
int main(){
ofstream ost("hoge.txt");
for(int i=0; i<10000000; i++){
ost << i << " " << 255 << " " << 255 << endl;
}
ost.close();
return 0;
}
0543542
2005/10/26(水) 00:47:42#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <ctime>
using namespace std;
int main(){
clock_t start = clock(), end;
ifstream fin("hoge.txt");
string buf;
vector<string> vstr;
while(getline(fin, buf))
vstr.push_back(buf);
end = clock();
cout << "elapsed time: " << (end-start) / CLOCKS_PER_SEC << endl;
cout << vstr[5976367] << endl; //適当に抽出
return 0;
}
手元のPCでは30秒ちょいかかった。オーバーフローはなし。
データの符号化に凝れないなら気の利いたPCでも調達すれば?
0544デフォルトの名無しさん
2005/10/26(水) 00:48:20ソースがおかしいだけじゃないのか?
とりあえず、データ構造とアルゴリズムを見直せ。
後、やりたい事を箇条書きするなど、
考えをまとめてからコーディングする癖を付けておいた方がいいぞ
0545デフォルトの名無しさん
2005/10/26(水) 00:53:17でかいテキストファイルだとfopenでは開けないの?
fgetsしてsscanfするっていう方法しか考えつかなかった。……orz
0546545
2005/10/26(水) 01:12:16fopenしたものを、全部配列に読み込もうとして失敗してる模様?
「100万〜1000万の行で、配列に入れようとしてメモリがぶっ飛びます 」
「fgetsとかだと、1行単位で読み込んでも、文字型だし比較が出来ず」
配列に読み込まず、fopenしたままfseekなりなんなり使えばいいんじゃなかろうか。
それとも、OSの都合で4ギガを超えるファイルを扱えないとか、
そういう方向の問題だろうか。
0547542
2005/10/26(水) 01:19:05上のコードで実際に生成したけど161MB程度だったよ。
0548デフォルトの名無しさん
2005/10/26(水) 01:41:15fscanf等でデータ取ってきて適当にatoi等で数値に変換
#俺ならデータベースを利用するけどな
0549デフォルトの名無しさん
2005/10/26(水) 01:42:18fseek()とか使いたいんなら、ランダムアクセス可能なように
最初から固定長のファイルにしとけ、と。
0550デフォルトの名無しさん
2005/10/26(水) 01:42:30>>524,etc
>行単位で指定して、数値型で読み込むのってどうやったらいいのかわかんなくて
>ファイル操作で、何行目から読み込むとかそういう指定が出来ないのかと…
ファイルの先頭に戻すか開きなおして必要な行まで読み飛ばせばいいだけだろが?
特殊な約束事が無い限り、行での指定は出来ない。自分で行を数える。
自分で行数数えながらその位置を覚えておけば(ftell)次回はそこまで
読み飛ばせるし。(fseek)
>fgetsとかだと、1行単位で読み込んでも、文字型だし比較が出来ず
カスか? 文字列から必要な数値を読み取るのは入門レベルの例題だろうに。
>何行目を読み込むかという指定が出来ないと効率も悪いので
入門者以下が足りない考えで効率云々するのは失笑ものかと。
>メモリが足りなくなるほどの行数なので
>だからオーバーフローするの
まさかメモリを確保できなくなるのを「オーバーフロー」と言って通じる
なんて思ってやしないよな??
1000万行としてint X,Y,Z でも sizeof(int)*3*10 MegaByte だから、
まあ効率云々能書きたれるなら、まあ今時充分利用可能な程度の
大きさだな。(仮想メモリででも)
0551545
2005/10/26(水) 01:42:41質問者が言ってる「オーバーフロー」は、
こんな感じのコードを書いたせいじゃないかと思った。
char buf[100][1000000]; /* 100万行 100MB */
for (i=0; i<1000000; i++) {
fgets(云々……
例えばボーランドの無料コンパイラだと、
配列とかスタックメモリ(?)が1MBを超えたらアウトだった(気がする)
……俺、すげー馬鹿なこと言ってるかも?
全然的外れだったら、誰か俺を止めて。
0552デフォルトの名無しさん
2005/10/26(水) 01:43:09どーしても固定長にできないんなら、まあそうなるな
バカバカしいけど
0554デフォルトの名無しさん
2005/10/26(水) 02:12:53ええと、静的領域にではなく、関数内などスタック領域にとってしまったと?
それをスタックオーバーフローとでも表示する処理系でもあるのか?
まあ確かにそういった区別やmalloc()など理解してそうにもないなあ、
いぜれにせよ、入門者がわかったつもりでトンデモなのは今回に限らない。
0555デフォルトの名無しさん
2005/10/26(水) 02:22:30激しく素人くさくて意味わかんね。
目的と応用性によって、もっと簡単な手順や、前処理がいくらでもあろうに。
0556デフォルトの名無しさん
2005/10/26(水) 06:24:11スワップする事を考慮すれば、
よっぽど古いPCじゃない限りメモリが足りなくなることは無いんじゃないの?
総当りなら時間はめちゃかかるだろうけど。
0557デフォルトの名無しさん
2005/10/26(水) 08:40:130558デフォルトの名無しさん
2005/10/26(水) 08:50:270559デフォルトの名無しさん
2005/10/26(水) 08:55:40無名パイプ
0560デフォルトの名無しさん
2005/10/26(水) 09:52:22newのオーバーライドなのですが、適用するソース範囲を制限することはできませんでしょうか。
例えば「このCPPファイルの中のnewのみオーバーライド」や「このクラスのメンバー関数の中でつかわれるnewのみオーバーライド」が欲しいのです。
最も外側でoperator newをオーバーライドすると、全てのnewが上書きされますよね。
とある組み込み機器の環境でこれに困っていまして、システム側が勝手にnewを使ってるっぽいのです。
オーバーライドしたnewの中身には、自前メモリー管理システムが入っているのに、その管理クラスの初期化前に呼ばれてエラーになってしまいます。
制限によって、システム側の勝手にnew呼び出しの前に処理を書くことができませんし、初期化時の値が保証されている変数も存在しません。(あればnewの中でそれをフラグにして分岐を行なうのですが)
例えばあるクラスの中で行なうnewのみをオーバーライドできるというのが理想です。
・CPPファイルを分ければOKかと思ったのですが、リンクの段階で「すでに定義されています」エラー
・(自作)CAppクラスのCApp::operator newをオーバーライドすれば、CAppの中で使われているnewがオーバーライドされるのかと思ったら、new CAppがオーバーライドされるだけだった
0561デフォルトの名無しさん
2005/10/26(水) 10:04:48自分で定義を与えることができるのはグローバルな new とクラスごとの new だけ。
望みの効果を実現する簡単な方法は無い。
static bool みたいな静的変数の初期化も保証されないタイミングで new が呼び出されてるの?
本当にそんなタイミングだとしたら、デフォルトの new すら動く保証がないはずだよ。
0562デフォルトの名無しさん
2005/10/26(水) 10:07:59お返事ありがとうございます。
なんとその環境ではstatic変数が利用できないのです(つД`)
とここまで言うと環境がわかる人が出てきそうですが…。
とりあえず暮らすごとのnewをオーバーライドし、
new char; とかについては専用のクラス関数を用意することにします。
しかし、CPPファイルをまたいで影響を受けるとはかなり意外でした。
これ、他の人が公開しているライブラリ(cppファイルで公開)を利用したら、自前のnewオーバーライドと必ず衝突してしまいますよね?
0563デフォルトの名無しさん
2005/10/26(水) 10:13:180564デフォルトの名無しさん
2005/10/26(水) 10:18:05なんとなく環境の想定がついたが、深くは突っ込まないでおこう。
呼び出し箇所を置き換えて回る覚悟があるなら
引数つき new (配置 new と呼ばれるもの)を作って
そちらを呼ぶようにすればいい。
new(customized) char とか書ける。
標準の nothrow_t nothrow を参考に。
まともな知識があれば、ライブラリの一部として
グローバルな new の置き換えを定義するようなことはしない。
やるにしてもオプション扱いだろう。
0565デフォルトの名無しさん
2005/10/26(水) 10:29:06配置newというのは知りませんでした。
try/catchも無いような環境ですので不安ですが、これからテストしてみます。
本当に助かります。
0566デフォルトの名無しさん
2005/10/26(水) 11:17:58というわけでマクロ化して
#define NEW(x) new(0) x
とでもしておこうかと思います。
本当にありがとうございましたっ。まだ全機種チェックはできてませんが…。
0567デフォルトの名無しさん
2005/10/26(水) 17:07:49しかし、DLL_PROCESS_DETACHの際に、MessageBox関数を呼び出しても、メッセージボックスは作成されません。
環境は、 Windows2000 SP4 Borland C++ 5.5.1 SDK
具体的には、以下のようなプログラムを書いています。
//------------------------------------------------------------------//
BOOL WINAPI DllMain(HANDLE hInstance, DWORD what, LPVOID Notused)
{
switch(what) {
case DLL_PROCESS_ATTACH:
MessageBox(HWND_DESKTOP, "Process attaching DLL.", "DLL Action", MB_OK);
break;
case DLL_PROCESS_DETACH:
MessageBox(HWND_DESKTOP, "Process detaching DLL.", "DLL Action", MB_OK);
break;
case DLL_THREAD_ATTACH:
MessageBox(HWND_DESKTOP, "Thread attaching DLL.", "DLL Action", MB_OK);
break;
case DLL_THREAD_DETACH:
MessageBox(HWND_DESKTOP, "Thread detaching DLL.", "DLL Action", MB_OK);
break;
}
return 1;
}
//------------------------------------------------------------------//
参考:DLL_PROCESS_DETACH と MessageBox関数の問題例
ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200212/02120053.txt
DLL_PROCESS_DETACHの際に、MessageBox関数を使うのは不正なのでしょうか。
0568デフォルトの名無しさん
2005/10/26(水) 17:22:59ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/dllmain.asp
>There are serious limits on what you can do in a DLL entry point.
>To provide more complex initialization, create an initialization routine for the DLL.
多分ダメ。
0569デフォルトの名無しさん
2005/10/26(水) 17:50:27原則DllMainではkernel32.dllの関数しか使えないと思ったほうがいい。(Advanced Windowsに書いてある)
IDEを使っているのならOutputDebugStringなんかを使うようにしたらいいかと思う。
0570デフォルトの名無しさん
2005/10/26(水) 18:11:550571デフォルトの名無しさん
2005/10/26(水) 18:33:38DLLのエントリポイントでできることには、重大な制限があります。
より複雑な初期化を行うには、DLLのための初期化ルーチンを作る必要があります。
と訳したけど、MessageBox関数が使えない理由になるのか分からなかった。
>>569
> 原則DllMainではkernel32.dllの関数しか使えないと思ったほうがいい。(Advanced Windowsに書いてある)
DLLにそんな制約があるとは知らなかった。勉強になりました。
OutputDebugStringを利用するようにしてみます。
長いこと悩んでいたけど、すっきりしました。ありがとうございます。
0572508
2005/10/26(水) 19:08:16class foo
{
public:
void put(){
puts("HogeHoge");
}
};
void main()
{
foo *pfoo = NULL;
pfoo->put();
}
と書いて実行したら画面に
HogeHoge
と表示されてしまいました。
pfooは有効では無いはずなのに、何で表示されたんでしょうか?
0573デフォルトの名無しさん
2005/10/26(水) 19:09:070574デフォルトの名無しさん
2005/10/26(水) 19:14:45foo::put()がvirtualでなく、メンバにもさわってないから。
でも実装上たまたまうまくいっただけで、C++的には鼻から悪魔だと思う。
0575デフォルトの名無しさん
2005/10/26(水) 19:19:26通常の処理系では、virtualでないメンバ関数は、thisを引数にとる
関数として実現される。よって、そのコードは、以下のコードと同じようにコンパイルされる。
void __foo_put(foo *this){ puts("HogeHoge"); }
void main()
{
foo *pfoo = NULL;
__foo_put(pfoo);
}
で、__foo_putはthisパラメタに触れていないから、NULLが渡されても問題なく振る舞う。
ただし正常に動作する保証がある訳ではないはず。
0576デフォルトの名無しさん
2005/10/26(水) 19:55:03なるほど。そう言う訳だったんですか。
C/C++の世界は深いですね…。
ありがとうございました。
0577デフォルトの名無しさん
2005/10/26(水) 21:30:150578デフォルトの名無しさん
2005/10/27(木) 00:07:190579デフォルトの名無しさん
2005/10/27(木) 17:21:17いいってことですか?
0580デフォルトの名無しさん
2005/10/27(木) 18:21:570581デフォルトの名無しさん
2005/10/27(木) 18:31:05どう見ても誤爆です。
本当にありがとうございました
0582デフォルトの名無しさん
2005/10/27(木) 19:37:54ポインタの質問です。
もし、vectorクラスのポインタを引数として渡し。
そこにデータを追加したいとき
void watasu(vector<string> *data){
string moji = "sss";
data.push_back(moji);
}
このvector にも、メモリーを割り当てておく
必要があるのでしょうか。
0583デフォルトの名無しさん
2005/10/27(木) 19:39:280584デフォルトの名無しさん
2005/10/27(木) 19:39:49書き込んでから、私すごい誤解していますよね。
vector は、ひとつだけなんですから。
それはしなくていいということですね。
0585デフォルトの名無しさん
2005/10/27(木) 19:45:38.じゃなくて->だと思うが。
0586デフォルトの名無しさん
2005/10/27(木) 20:43:39ヽ(`Д´)ノ ミエネエヨ!
0587デフォルトの名無しさん
2005/10/27(木) 20:55:380588デフォルトの名無しさん
2005/10/27(木) 22:05:37アドバイスを頂きたいです。
OSはWindowsXP、コンパイラはVisualC++6.0で、課題の内容は
「1〜50人までの数学、英語の成績を入力して、それぞれの教科についての合計点、平均点、最高点、最低点を集計結果にまとめよ。尚、負の数が入力された時点で入力が終了したと判断し、直前の入力までを集計せよ」という内容です。
今現在の状況は
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1016.txt
という所までで数学、英語それぞれについての合計がmt,et
平均がma,ea 最高点がmmax,emax 最低点がmmin,eminです。
入門書や教科書とにらめっこしてなんとかここまではできたのですが、
これを実行しても最高点しか正常に表示されない状況でして・・・。
どなたかアドバイスお願いできないでしょうか?
ちなみに変数宣言の所で0を代入しているのは配列の初期化やらよく分からなかったので
取り合えず全部初期化しておこうと思った次第です。長文失礼しました。
0589デフォルトの名無しさん
2005/10/27(木) 22:16:21Serviceからならアクセス出来ましたが、一般のEXEからだと
クラスのCoCreateInstanceで失敗してしまいます
なんらかの権限の問題だと思いますが、わかる方いませんか?
0590デフォルトの名無しさん
2005/10/27(木) 22:26:18等幅フォントにすれば普通に見える
0591デフォルトの名無しさん
2005/10/27(木) 22:34:24minの初期値、配列の添え字をもう少し考えなさい。
scanfで入力した値と比較している値の添え字が違うよ。
0592588
2005/10/27(木) 23:16:03アドバイス有難うございます。
しばらく考えてみたのですが、minの初期値は満点の100を代入して
なんとか修正できたものの、配列の添え字については
n番目の負の値を集計から除くとn-1になると思うのですが
これはおかしいのでしょうか・・・・
未だに合計が修正できないので間違っている事は分かるのですがどう間違っているのかが分かりません。
0593デフォルトの名無しさん
2005/10/27(木) 23:20:53おかしいのはscanfしてから出力する間の配列へのアクセス。
nに今回入力された値を格納しているようだけど、max、minの比較が何で前回入力した値(n-1)なの?
totalに足してる値が何で前回入力した値なの?
ずれてませんか?
0594デフォルトの名無しさん
2005/10/27(木) 23:32:20VC++.NETでWindowsのプログラムを作るときに、
ダイアログエディタみたいなので
簡単にメインウィンドウにコントロールを配置することってできるんすか?
0595デフォルトの名無しさん
2005/10/27(木) 23:40:39メインウィンドウ自体をダイアログにしてしまえばいい。
0596デフォルトの名無しさん
2005/10/27(木) 23:42:39managedC++限定なのかね
0597デフォルトの名無しさん
2005/10/27(木) 23:51:52別にMFCでもダイアログベースで開発すれば済む話では内科医?
0598デフォルトの名無しさん
2005/10/27(木) 23:54:270599588
2005/10/27(木) 23:56:03言われている事が理解出来ていないかもしれませんが、
確かにn-1だと最初のループでm[-1],e[-1]とおかしい値になりますね・・・
最終的に負の値を入力する事が入力終了のフラグだったので
[n]だとその負の値が集計に入って合計と最小値が狂ってしまうと思って
n-1にしたのですがやはりおかしいですね。
集計に影響せず、かつ負の値を入力終了のフラグにするには
どうすればいいのか考えてみましたが思いつきません。
0601デフォルトの名無しさん
2005/10/28(金) 00:00:17for(n=0;n<50;n=n+1){
printf("%2d番:",n+1);
scanf("%d %d",&m[n],&e[n]);
if(m[n]<0||e[n]<0){break;}
if(m[n] > mmax){mmax = m[n];}
if(e[n] > emax){emax = e[n];}
if(m[n] < mmin){mmin = m[n];}
if(e[n] < emin){emin = e[n];}
mt += m[n];
et += e[n];
ma = mt/(n + 1);
ea = et/(n + 1);
printf("--- 集計結果 -------------------------\n");
printf("人数:%d\n",n+1);
printf(" 数学英語\n");
printf("合計点: %f %f\n",mt,et);
printf("平均点: %f %f\n",ma,ea);
printf("最高点: %d%d\n",mmax,emax);
printf("最低点: %d%d\n",mmin,emin);
}
0602デフォルトの名無しさん
2005/10/28(金) 00:01:21そもそもループ内で結果を出力しているのがおかしいと思うのだけど。
0603588
2005/10/28(金) 00:08:39どもです。
それを参考にしてもうちょっと考えてみる事にします(´・ω・`)
0604デフォルトの名無しさん
2005/10/28(金) 00:16:15こんな感じでいける。
#include <stdio.h>
#include <limits.h>
int main()
{
int e, m;
int num = 0, msum = 0, esum = 0;
int mmax = INT_MIN, emax = INT_MIN;
int mmin = INT_MAX, emin = INT_MAX;
for (; scanf("%d %d", &m, &e) == 2 && m > 0 && n > 0; ++num) {
if (m > mmax) mmax = m;
if (m < mmin) mmin = m;
if (e > emax) emax = e;
if (e < emin) emin = e;
msum += m;
esum += e;
}
printf("人数: %d人\n", num);
printf(" 数学 英語\n");
printf("合計 %5d %5d\n", msum, esum);
printf("平均 %5.1f %5.1f\n", (double)msum/num, (double)esum/num);
printf("最高 %5d %5d\n", mmax, emax);
printf("最低 %5d %5d\n", mmin, emin);
return 0;
}
0605604
2005/10/28(金) 00:18:03if文の
m > 0 && n > 0
は
m >= 0 && n >= 0
に直してくれ。
で、>>588は今後こういうのは宿題スレに持ち込むように。
0606デフォルトの名無しさん
2005/10/28(金) 02:30:130607デフォルトの名無しさん
2005/10/28(金) 09:05:190608デフォルトの名無しさん
2005/10/28(金) 10:30:30作って終わりのプログラムならな
実際は配列をベースに(ry
0609デフォルトの名無しさん
2005/10/28(金) 10:41:250610デフォルトの名無しさん
2005/10/28(金) 14:46:16Object obj = NULL;
という宣言をすると(Objectは自作クラスです)、
error C2440: 'initializing' : 'const int' から 'class Object' に変換することはできません。
というエラーが出ます。
ですがObjectは
void operator=(void*);
がオーバーロードしてあり、実際
Object obj;
obj = NULL;
はコンパイルが問題無くとおります。
initializingという単語から考えて、変数の宣言と同一時の=は通常の=とは別扱いなのでしょうか?
なるべくなら
Object obj = NULL;
という宣言方法で書きたいのですが、できないものでしょうか。
0611デフォルトの名無しさん
2005/10/28(金) 14:48:11インスタンスそのものをNULLにしようとしてどうするんだおまいさん?
0612デフォルトの名無しさん
2005/10/28(金) 15:05:42初期化と代入の違いを勉強しよう
0613デフォルトの名無しさん
2005/10/28(金) 15:59:40お返事ありがとうございます。
>>611
そこは「わざと」なんで気にしないで下さい。
私の例が誤解を招くような例でした。
確かにObject* obj = NULL; を勘違いしているように見えますね。すいません。
>>612
確認できました。
なるほど
Object obj = NULL;
は
Object obj(NULL);
と解釈されるんですね。ありがとうございました。
0614デフォルトの名無しさん
2005/10/28(金) 16:11:33Object obj;
obj = NULL;
なら大丈夫だろ?
#気色悪い設計だと思うが。
0615デフォルトの名無しさん
2005/10/28(金) 16:12:37>Object obj;
>obj = NULL;
>はコンパイルが問題無くとおります。
0616結論書き落としたばかりにつまらんレスをされた
2005/10/28(金) 16:17:44斯くの如く、初期化と代入は違うのだよ。
0617デフォルトの名無しさん
2005/10/28(金) 16:48:51もっと根本的にObjectなんてクラスは本当に必要?
0618デフォルトの名無しさん
2005/10/28(金) 16:58:04コピーコンストラクタを自前で書け。
0619デフォルトの名無しさん
2005/10/28(金) 18:40:28おぉ、なるほど。
ありがとうございます
0620デフォルトの名無しさん
2005/10/28(金) 19:53:10あるテキスト(テキスト形式のメール本文とか)の中に
URLがあった場合、そのURLに自動的にリンクを張ろうとしています
URLのある場所とかがわかればそこにタグを追加するだけなんですが
URLをどうやって検出するかというところで悩んでいます。
どなたかアドバイス・ヒント等いただければよろしくお願いします
0621デフォルトの名無しさん
2005/10/28(金) 20:12:00通常、プロトコル(例えばhttp)を検出する。問題は、どこで終端するかだが。
0622デフォルトの名無しさん
2005/10/28(金) 20:19:16すいません、>>620じゃ全然情報足りないですね
現在はhttpで開始点を検出することはできてるんですが
おっしゃるとおりどこまでをURLか、という部分で悩んでいます
0623デフォルトの名無しさん
2005/10/28(金) 20:25:42但し、ピリオドも正しい構成要素なのでこの方法では
The URL is http://foo/bar.html.
のように文章のピリオドも構成要素として見なしてしまうのが難点。
0624デフォルトの名無しさん
2005/10/28(金) 20:27:59空白の前まで。httpの前が開き括弧なら、空白の前の対になる閉じ括弧は無視。
2バイト文字を無視するかどうかは主義主張に則ってどうぞ。
尚、元来'?'や'&'は含まれない筈だがcgiの呼び出しなどで当たり前に使われてしまっているので要注意で。
0626デフォルトの名無しさん
2005/10/28(金) 21:15:41ぐぐっても感想が見つからなかったので、どなたか使ってる方がいたら
使える本かどうか伺いたいです
ttp://www.gihyo.co.jp/books/syoseki.php/4-7741-2526-1
まだ勉強中の身分で、同じ出版社から出てるC言語辞典は結構役に立ってるのですが
問題の本を見た感じだとC言語辞典とは大分違いそうなので質問にあがりました
0627デフォルトの名無しさん
2005/10/28(金) 23:28:05>C++はメジャーなプログラミング言語(C言語のスーパーセット)ですが、入門書の数はそれなりにあるのに、ほかの種類の書籍に恵まれてきませんでした。
腐るほど出てると思うんだが
0628デフォルトの名無しさん
2005/10/28(金) 23:54:040629デフォルトの名無しさん
2005/10/29(土) 09:57:44これを見て思ったんだけど、
ダイアログをベースにしたプログラムってどうするんですか?
VC++.NETでWin32のプログラムです。
0630デフォルトの名無しさん
2005/10/29(土) 10:00:30説明書くらい読め。
0631デフォルトの名無しさん
2005/10/29(土) 10:02:10WinMainの中でいきなりDialogBoxやCreateDialogを呼べばいい。
ところでダイアログボックスにはウィンドウクラスを指定できるから、
自分でRegisterClassEx()して(ダイアログプロシージャではなく)ウィンドウプロシージャを書くこともできる。
0632デフォルトの名無しさん
2005/10/29(土) 14:43:46先ほど他スレに投稿したのですが、スレ違いと判断して、誘導の後こちらに引っ越させていただきました。
関数ポインタについてです。
CHoge hoge {
public:
bool (*pFunc)();
bool Func();
void test();
}
CHoge::test()
{
pFunc = Func;
}
上記のコードをコンパイルした結果、関数へのポインタへの代入に失敗しました。
Func() の型は bool (*)(CHoge*) のため(CHoge* は暗黙の引数 this を受け取る)、
bool (*)() 型の pFunc には代入できなかった、という理解でよろしいのでしょうか?
また、上記問題を解決するため、
bool (*pFunc)(CHoge* pHoge);
static bool Func(CHoge* pHoge);
というように、Func を静的にし、メンバを呼ぶためオブジェクトのアドレスを渡すようにしたのですが、
これでは、Func() の記述内に pHoge-> が散乱してしまい、格好悪くなってしまいます。
何かいい解決法はないでしょうか。
よろしくお願いします。
0633デフォルトの名無しさん
2005/10/29(土) 14:48:210634632
2005/10/29(土) 14:50:44CHoge::test() → void CHoge::test() です。
0635デフォルトの名無しさん
2005/10/29(土) 14:51:29メンバ関数ポインタを使いなさい。
説明はメンドイんでググレ
0636デフォルトの名無しさん
2005/10/29(土) 14:53:23class CHoge {
public:
bool (CHoge::*pFunc)();
bool Func() { return false; };
void test();
};
void CHoge::test()
{
pFunc = Func;
}
こんな感じだが…
あまりに低脳なミスが多すぎてやる気なくす
0638デフォルトの名無しさん
2005/10/29(土) 14:59:02大体そんな認識でいいけど、Funcの型はbool (hoge::*)();
メンバへのポインタを使うとこうなる。
class CHoge {
public:
typedef bool (hoge::*FuncType)();
FuncType pFunc;
bool Func();
void test();
};
void CHoge::test() {
pFunc = &CHoge::Func;
}
これを使うときには
CHoge obj;
obj.test();
FuncType pfn = obj.pFunc;
(obj.*pfn)();
下2行は勿論(obj.*obj.pFunc)();とまとめられる。
あるいはboost::mem_funとboost::functionなどを使うとするとこうなる。
class CHoge {
public:
boost::function<bool ()> Func1;
bool Func();
void test();
};
void CHoge::test() {
Func1 = boost::bind(&CHoge::Func, this);
}
これだとobj.Func1()と呼べる。
0639デフォルトの名無しさん
2005/10/29(土) 17:22:26どこかいいサイトがあったら教えてください。
0640デフォルトの名無しさん
2005/10/29(土) 17:26:27Effective C++辺り読むのがオススメ
どっちにしろ必読書だし
0641デフォルトの名無しさん
2005/10/29(土) 22:27:17Aという基本クラスを作り、Aクラスを派生したクラスを100個ほど作ります。
その際、派生クラスの名前をA_00, A_01, A_02....A_99というふうに、基本クラス名の後に2ケタの数字がつくようにします。
そしてそのAの派生クラス達をあるクラスで生成し、それぞれの呼ぶのですが、
その生成の個所が以下のようになってしまいます。
pA[0] = new A_00();
pA[1] = new A_01();
:
:
pA[99] = new A_99();
で、質問なのですが、クラス名の文字列から、クラスオブジェクトを生成できないでしょうか?
それができると生成の個所が
for( int i = 0; i < 100; i++ )
{
CString className;
className.Format( "A_%02d", i );
pA[i] = (A*)new XXXX( className ); ←これが不明
}
というふうに簡素化できるのですが…。
0642デフォルトの名無しさん
2005/10/29(土) 22:33:19名前にはきちんとした意味を持たせろ。話はそれからだ。
0643デフォルトの名無しさん
2005/10/29(土) 22:41:06100個となると少々設計に問題がある気がするけど、
boost::preprocessorがそういったループ展開可能なマクロを提供しているから
それを使えば簡潔に書くことはできると思う。
0644629
2005/10/30(日) 00:09:21説明書て、ダイナミックヘルプのこと?
>>631
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
char szClassName[] = "main01"; //ウィンドウクラス
int WINAPI WinMain(/*略*/)
{
BOOL bRet; //メッセージループで使う
MSG msg;
WNDCLASSEX wc;
//ウィンドウクラスの登録
wc.cbSize = sizeof(WNDCLASSEX);
//以下略
if (RegisterClassEx(&wc) == 0)
return FALSE;
DialogBox(hCurInst, "Top01", (HWND)wc,(DLGPROC)WndProc); //ダイアログリソースは"Top01"で扱った
//メッセージループ
//(略)
}
こんな感じにすれば良いんですか?
いや、動かないんで間違ってるんですけど…(--;
0645デフォルトの名無しさん
2005/10/30(日) 00:26:24いいや。
RegisterClassEx云々はそうもできると言う話であって、今回の話とは別個。
普通にRegisterClassExしないで、DialogBoxを使いな。
0646デフォルトの名無しさん
2005/10/30(日) 00:26:48void func(MyClass *myclass)
を
pthread_t t[10];
int res,i;
MyClass myclass[10];
for(i=0;i<10;i++)
res = pthread_create(&t[i],NULL,(void *)func,&myclass[i]);
とするとエラーがでてコンパイルが通りません。
何がいけないのか教えてくれませんか?
0647デフォルトの名無しさん
2005/10/30(日) 00:35:50pthreadが許可する関数エントリはvoid*を受け取りvoid*を返すように決められているから、
funcをキャストするなら(void *)ではなく(void *(*)(void *))にキャストする必要がある。
実際のところ、 void *func(void *arg) としておいて、内部で
MyClass *myclass = (MyClass *)arg;
とするのがいいんじゃまいか。
そうすればpthread_createの無駄なキャストが消えて
pthread_create(&t[1], NULL, func, &myclass[i]);
と出来るかと
0648デフォルトの名無しさん
2005/10/30(日) 00:37:42納期が近くなって数時間を争う状況になったとき、
�@納期後のメンテナンス性を考えたコーディング→ある程度改修が必要で時間がかかる
�Aべた書きのスパゲッティコード→すぐ書けるがメンテナンス性皆無
のどちらかの方向を選ばなくてはならなくなったら�@,�Aのどちらの道をとるのが
ベターなんですか?
0649デフォルトの名無しさん
2005/10/30(日) 00:51:14みんな(2)を選ぶから保守が大変なんだろうて。
0650デフォルトの名無しさん
2005/10/30(日) 00:55:24おとなしくVB/VC#/Delphi/BCB/VC++.net(Windows.Form)のどれかを使う。
0651デフォルトの名無しさん
2005/10/30(日) 02:25:10納期が数時間単位でヤバイなんて時期になって、
�@か�Aかを選択する余地は普通無いと思うが。
それに、�@を選択するのなら、最初からそういう設計になっているべき。
ということで、そういう状況になるとすればほぼ�Aを選択することになる。
というか、そういう選択を迫られる状況にならないように、
出来る限り先回りで対応する事と、今日出来ることを明日に延期しない心がけが大切。
0652デフォルトの名無しさん
2005/10/30(日) 02:29:280653デフォルトの名無しさん
2005/10/30(日) 02:31:32> 納期が近くなって数時間を争う状況
でまだ「コーディング」をやっている、というのがそもそも論外。
0654デフォルトの名無しさん
2005/10/30(日) 05:05:31選択どころか「コーディング」自体に意味が無い。
たとえテストやデバグ改修にしてもなあ…
(実態はともかくか?)設問自体が意味をなさない(はずだが)。
0655デフォルトの名無しさん
2005/10/30(日) 06:14:4210 num = new int;
20 num = new int;
という風にnewで動的に確保したメモリのアドレスを、ひとつのポインタに
入れちゃうと10行で確保したメモリはdeleteできなくなっちゃうんですかね?
それとも
delete[] num;
でdeleteできるんですか?
0656デフォルトの名無しさん
2005/10/30(日) 06:42:27delete できない。いわゆるメモリリークってやつ。
その行番号、 BASIC みたいだな。
0657職業プログラマ(自称)
2005/10/30(日) 11:24:21�B自動実行できるテスト と リファクタリング で後の事は気にするまでもない
だな
ちなみにそんな切羽詰まった状況なら確実に�A’←�Aでもテストを実行するコードは付けとく
きれいだが動かないプログラムは意味がない。
汚くても動くプログラムとテストコードがあれば、後になって救える。
0658デフォルトの名無しさん
2005/10/30(日) 11:39:35感謝です。
動きました。でも自分で理解できてないのが悔しい・・・
0659デフォルトの名無しさん
2005/10/30(日) 11:48:29単純な話で、任意のポインタからvoid *への変換は許可されているけど、逆は不可(キャストが必要)
>>646のように書いてしまうと
(void *(*)(MyClass *))を(void *)にキャスト // ここはOK
(void *)を(void *(*)(void *))に変換しようとする // ここでエラー
となっているだけ。
0660デフォルトの名無しさん
2005/10/30(日) 12:26:56う〜ん、少なくとも俺には十分難しいです。
引数のオブジェクトにアクセスできん・・・
0661デフォルトの名無しさん
2005/10/30(日) 14:32:10状況いまいちつかめないけど、
C++規則として、
・派生クラスから基本クラスへはキャスト無しでいけるが、逆はキャストしないと不可。(Javaだと逆になる)
・参照の変数に代入する時の右辺値は変数で無ければならない、またこれは、関数の引数が参照の時も同じで、
参照の引数を採る関数には、その引数に変数を介さなければ値を渡せない。
というところで。
0662デフォルトの名無しさん
2005/10/30(日) 14:35:490663デフォルトの名無しさん
2005/10/30(日) 16:38:35{
int t;
t = *a;
*a = *b;
*b = t;
}
int GCD(int *a, int *b)
{
if(*b>*a) swap(a,b);
while(*b != 0){
*a = *a % *b;
swap(a,b);
}
return(*a);
}
int LCM(int a, int b)
{
if( a==0 || b==0)
return(0);
return((a/GCD(a,b))*b);
}
上記のような関数で最大公約数と最小公倍数出そうとしたのですが
どうしても最小公倍数が0になってしまいます。
どこが間違っているのかご教授ください
0664663
2005/10/30(日) 16:40:14それでもできない・・・うーん
0665デフォルトの名無しさん
2005/10/30(日) 16:40:58GCDにLCMのaとbのポインタを渡してるから、
LCMから戻ったときにはaとbの値が変わってる。
具体的には、bが0になってる。
0666デフォルトの名無しさん
2005/10/30(日) 16:48:19ポインタを受け取るようなGCD()が蛸。
0667デフォルトの名無しさん
2005/10/30(日) 16:49:13まじ素早いレスありがとう
ホントですね。GCDでbが0になっちゃってる。
ポインタ使わずにGCD作っとこ。
ありがとうございました
0668デフォルトの名無しさん
2005/10/30(日) 16:50:47バグを探せ、という課題だったのですが
GCDがポインタ扱ってるのが問題だったのですね。
GCDはちゃんと出るからずっとLCMに問題があるかとおもって必死に試行してました(汗
0669デフォルトの名無しさん
2005/10/30(日) 17:51:590670デフォルトの名無しさん
2005/10/31(月) 03:51:29STL の list のソートを使っています。
list<CHoge*> hogeList;
のように、ポインタのリストを作成すると、
hogeList.sort();
としても、オブジェクトのアドレス順にソートされてしまい、
当然、CHoge クラスに "<" 演算子を定義しても意味がありません。
好みの順にソートさせるには、"<" 演算子ではなく、ソート用の関数を作成して渡すか、
list<CHoge> hogeList; とできるよう設計しなおすしかないでしょうか。
よろしくお願いします。
0671デフォルトの名無しさん
2005/10/31(月) 04:34:390673デフォルトの名無しさん
2005/10/31(月) 10:49:29//foo.h
template <typename T>
class foo
{
public :
void bar(void) ;
} ;
//foo.cpp
#include "hoge.h"
template<typename T>
void foo<T>::bar(void) {}
//main.cpp
#include "hoge.h"
int main()
{
foo<int> hoge ;
hoge.bar() ;
}
LNK2019: 未解決の外部シンボル "public: void __thiscall foo<int>::bar(void)" (?bar@?$foo@H@@QAEXXZ) が関数 _main で参照されました。
なぜかリンクできないのですが、どうすればいいのでしょうか?
0674デフォルトの名無しさん
2005/10/31(月) 10:55:50テンプレート関数やクラステンプレートのメンバ関数は、ヘッダファイルに定義を書くか、
exportキーワードを付けてcppファイルに定義を書く必要がある。
ただし、VC7.1はexportキーワードに対応していない。
0675デフォルトの名無しさん
2005/10/31(月) 10:57:18テンプレートクラスはコンパイル時に型ごとに別の実体を生成します。実装はヘッダに書きましょう。
0676673
2005/10/31(月) 11:04:36存在だけは知っていたんですが。
今、exportをサポートしているコンパイラってあるのでしょうか?
0677デフォルトの名無しさん
2005/10/31(月) 11:21:00http://www.comeaucomputing.com/4.0/docs/userman/export.html
0678デフォルトの名無しさん
2005/10/31(月) 12:39:390679デフォルトの名無しさん
2005/10/31(月) 16:07:02CやC++で、一度も使っていないローカル変数は
「一度も使われていません」と警告がでるわけですが、
「この変数は使って無くても、使われたことにする」ための記述方があったかと思います。
int a;
a = 0;
など代入をするのではなく、またpragmaなどで警告を非表示するわけでもありません。
use a;
こんな感じ?だったかと思うのですが…。
0680デフォルトの名無しさん
2005/10/31(月) 16:20:55volatile int a ;
のこと?
0681デフォルトの名無しさん
2005/10/31(月) 16:25:27volatileは関係ないかと
0682デフォルトの名無しさん
2005/10/31(月) 16:34:10単に a; とだけすればいい。
SDKにそんなマクロがあったような気がするが、名前忘れた。
0683デフォルトの名無しさん
2005/10/31(月) 16:42:48それだと参照されね?
実行速度もったいない。
0684デフォルトの名無しさん
2005/10/31(月) 16:43:300685デフォルトの名無しさん
2005/10/31(月) 16:47:22Windowsならこのあたりですね。
・UNREFERENCED_PARAMETER
・DBG_UNREFERENCED_PARAMETER
・DBG_UNREFERENCED_LOCAL_VARIABLE
下2個はヘッダを見てはじめて存在を知った。
0686デフォルトの名無しさん
2005/10/31(月) 16:49:46最適化はともかく、それじゃ普通別の警告になる罠。
0687デフォルトの名無しさん
2005/10/31(月) 16:58:50意外とメジャーじゃないもんですね。Google使っても全然ひっかからなかったのでそうかなとは思ってたのですが…。
>>685
マクロなんですね。C/C++の標準機能だと思ってました。
0688デフォルトの名無しさん
2005/10/31(月) 17:05:12なんでわざわざ使われても無い変数を残しときたがるんだか・・・
0689デフォルトの名無しさん
2005/10/31(月) 17:13:050690デフォルトの名無しさん
2005/10/31(月) 17:14:30システム側からコールされるお定まり型の関数が、使わない(使い道あるんでしょうけど)変数まで引数にしてるんです。
0691デフォルトの名無しさん
2005/10/31(月) 17:32:320692デフォルトの名無しさん
2005/10/31(月) 17:33:240693デフォルトの名無しさん
2005/10/31(月) 17:35:51コールバックの中身を書いてるんじゃないの?
0694デフォルトの名無しさん
2005/10/31(月) 17:42:10もちろん、実際には使うのかもしれないが。
すくなくともコード中で使うことはありえない。
0695デフォルトの名無しさん
2005/10/31(月) 17:43:260696デフォルトの名無しさん
2005/10/31(月) 17:44:54という出力が出てくるのですが、これはどういったものなのでしょうか?
exeファイルを実行しても何も起こらないのは、これが原因だと思う
のですが。
0697デフォルトの名無しさん
2005/10/31(月) 17:46:270698デフォルトの名無しさん
2005/10/31(月) 17:47:13多分コンパイラによるんだと思いますよ。
WindowsのVS6.0のコンパイラは出さないみたいですね。
0699デフォルトの名無しさん
2005/10/31(月) 17:49:36C++では引数に名前を与えないことができるから、
親切なコンパイラは警告してくる。
0700デフォルトの名無しさん
2005/10/31(月) 17:53:20高卒で国立医療系に入ったのは良いけど中退しました。特技は特にないです。
漢検と英検が学生の頃に両方とも二級があります。後、車くらい。
それと友達に誘われて自分は興味は無いけど色彩二級があります。
これが自分の持ってる全部の資格です。学生ならまだしも、
社会人になっては意味のない資格しか無いので路頭に迷っていますorz
プログラムは5年前から興味を持っていて、本も何冊か買っていますが、
実際には組んだことはありません。Eclipseも入れたけど2のままです。
誰か助けて、鬱が止まらないです。どうしたら良いんだろう。
0701デフォルトの名無しさん
2005/10/31(月) 17:58:35何か別のことはじめた方が良いと思われ。
ちなみに、本は買うだけじゃ、ソフトは入れるだけじゃ何の役にも立たない。
0702デフォルトの名無しさん
2005/10/31(月) 19:47:270703デフォルトの名無しさん
2005/10/31(月) 20:10:270704デフォルトの名無しさん
2005/10/31(月) 21:35:27ここまでコピペ
0705デフォルトの名無しさん
2005/10/31(月) 22:00:10たとえばその関数がint hoge(int foo, int bar) {}だとして、
barを使わないのならint hoge(int foo, int) {}と書けば、
引数を受け取るけど使わないと言う意思表示になりコンパイラも警告しなくなる。
>>694
というわけでこうすればいい。
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, PSTR pszCmdLine, int nCmdShow) {}
0706デフォルトの名無しさん
2005/10/31(月) 22:08:31PSTR型はいつでもLPSTR型と同一なの?
0707デフォルトの名無しさん
2005/10/31(月) 22:18:44昔のWin16では違ったのだが、今のWin32/64ではそのとおりで全く同じ。
0708デフォルトの名無しさん
2005/10/31(月) 22:32:32サンクス
0709デフォルトの名無しさん
2005/10/31(月) 23:31:49持ってないともぐりと言われそうで、買った方がいいのかなぁ。
0710デフォルトの名無しさん
2005/10/31(月) 23:48:39基本的に、C++を使うならば知っておかなければいけない内容が書いてある。
もちろんEffectiveC++で全てを網羅してあるわけじゃない。
ネットで同じ内容をかき集めることは可能だけど、
俺個人としては紙媒体でまとまった情報を持っていた方がいいと思うので
目次を立ち読みして知らない・分からない内容があったら買ってもいいと思う。
0711デフォルトの名無しさん
2005/11/01(火) 01:04:02参考になるかは判らんが、C上級者がC++を始めて半年間あれこれ試行錯誤して判ったことが、
全てEffectiveC++に書かれていた。
0712デフォルトの名無しさん
2005/11/01(火) 01:16:36何か感心する様な一例きぼん。
0713デフォルトの名無しさん
2005/11/01(火) 02:19:13一般的には (void)a; じゃないのか?
親切なコンパイラなら警告も出なくなるし
最適化されてコードも生成されないはず。
0714デフォルトの名無しさん
2005/11/01(火) 05:03:59GetMessage(&msg , NULL , 0 , 0);
if (msg.message == WM_LBUTTONUP) break;
DispatchMessage(&msg);
}
これってDispatchMessage(&msg);が意味なくないですか?
GetMessageでメッセージを取得してDispatchMessageで送出してからbreakする方がいいと思うのですが。
0715デフォルトの名無しさん
2005/11/01(火) 05:57:420716デフォルトの名無しさん
2005/11/01(火) 06:31:32そもそもその方法だと、マウスクリックが発生せずにウインドウが閉じられた場合、どうするつもりだ?
0717デフォルトの名無しさん
2005/11/01(火) 07:20:170718デフォルトの名無しさん
2005/11/01(火) 16:25:16VC++6.0のデフォルトの警告レベルが低すぎるので警告が出ないだけだったかと。
0719デフォルトの名無しさん
2005/11/01(火) 16:34:39例えば
CHoge p = new CHoge();
p->hoge();
とすれば
・メモリーが割り当てられ
・コンストラクタが呼ばれ
・その後hoge()が呼ばれる
で、
CHoge p = malloc(sizeof(CHoge));
p->hoge();
とした場合どうなるのだろうか?
コンストラクタが呼ばれないのは知っているのだが、hogeは(標準仕様上)正しく呼ばれることは保証されるのだろうか?
0720デフォルトの名無しさん
2005/11/01(火) 16:40:05hogeがvirtualだったりすると、仮想関数テーブルが初期化されてないから落ちるな。
そうでなくても、コンストラクタが呼ばれてないオブジェクトに対して操作するのは鼻から悪魔が(ry
つーか CHoge p じゃなくて CHoge* p だろうと。
0721デフォルトの名無しさん
2005/11/01(火) 16:44:41*は書き忘れです。ごめん(;´Д`)
やっぱりキモいかー…。うし。初期化周り書き直すよ。ありがとう!
0722デフォルトの名無しさん
2005/11/01(火) 16:45:140723デフォルトの名無しさん
2005/11/01(火) 16:45:180724デフォルトの名無しさん
2005/11/01(火) 16:46:430725デフォルトの名無しさん
2005/11/01(火) 17:11:16で、そのメモリープールを管理するクラスはMALLOCで確保しなきゃいけないんで(´・ω・`)
0726デフォルトの名無しさん
2005/11/01(火) 17:13:530727デフォルトの名無しさん
2005/11/01(火) 17:35:43>>722
0728デフォルトの名無しさん
2005/11/01(火) 17:38:10mallocで確保すること自体は大丈夫だよ。
その確保した領域に配置newでオブジェクトを構築すれば無問題。
0729デフォルトの名無しさん
2005/11/01(火) 17:54:27それだ!!なんで気づかなかったんだろう。・゚・(ノД`)・゚・。
ありがとう!!!
0730デフォルトの名無しさん
2005/11/01(火) 17:55:54環境のせいでmallocしかないんYO!
0731デフォルトの名無しさん
2005/11/01(火) 18:01:180732デフォルトの名無しさん
2005/11/02(水) 09:04:54vector<hoge> hage()
{
vector<hoge> hogehoge;
return hogehoge;
}
このように関数内で宣言したオブジェクトを返していますが
この場合はint型のようにコピーが返されるのでしょうか?
0733デフォルトの名無しさん
2005/11/02(水) 09:36:120734デフォルトの名無しさん
2005/11/02(水) 11:13:47うん
0735デフォルトの名無しさん
2005/11/02(水) 13:39:23memsetなどを使うよりoperator=を構造体に作った方が良いらしいのですが
具体的にはどうすればいいのか少し迷っています。
operator=(const Buffer* buf)
を構造体内で実装しバッファをそれぞれのメンバの型に変換し代入すればよいのでしょうか?
0736デフォルトの名無しさん
2005/11/02(水) 13:46:43placement newは?
0737デフォルトの名無しさん
2005/11/02(水) 14:23:00なるほど、これでコピーすればよいのですね。
ありがとうござ
0738デフォルトの名無しさん
2005/11/02(水) 14:24:19いや、コピーじゃないんだけど・・・・
0739デフォルトの名無しさん
2005/11/02(水) 20:32:10ちがうんですか?よくわからんとです・・・。
0740デフォルトの名無しさん
2005/11/02(水) 20:44:220741デフォルトの名無しさん
2005/11/02(水) 21:18:590742デフォルトの名無しさん
2005/11/02(水) 21:52:550743デフォルトの名無しさん
2005/11/03(木) 02:50:16自分でもよくわからなくなってきました。
とりあえず、>>736>>742を使って自分で実験しまくってみます。
ありがとうございました。
0744デフォルトの名無しさん
2005/11/03(木) 17:18:32STL の deque から、ある条件を満たす要素を全て削除する良い方法はないでしょうか。
// イテレータを使った場合
deque<CHoge> que;
deque<CHoge>::iterator itr;
for(itr=que.begin(); itr!=que.end(); i++) {
if ( /* 好きな条件 */ )
que.erase(i);
}
こうすると、erase した時点で i の指すものが不定になり、
i++ が上手く動作しません。
// operator[]() を使った場合
deque<CHoge> que;
for(int i=0; i<que.size(); i++) {
if ( /* 好きな条件 */ ) {
deque<CHoge>::iterator itr == ( /* i 番目の要素のイテレータ */ )
que.erase(i); //
}
}
operator[] を使ってループを整数でまわそうにも、
n 番目の要素のイテレータを返す操作が見つからず、うまくいきません。
よろしくお願いします。
0745デフォルトの名無しさん
2005/11/03(木) 17:23:13n番目の要素のイテレータは
que.begin() + n
std::removeを使うという手もある。
0746デフォルトの名無しさん
2005/11/03(木) 17:29:24まだSTLやってないからdequeがどんなのか分かってないが
読み進めてるAccelerateC++に乗ってた奴から
remove_if(que.begin(), que.end(), hoge());
hoge()は好きな条件の時にTrueを返す
0747デフォルトの名無しさん
2005/11/03(木) 17:34:48それでは、削除しないものを前に集めるだけで、消去までされない。
que.erase(std::remove_if(que.begin(), que.end(), hoge()), que.end());
0748デフォルトの名無しさん
2005/11/03(木) 17:38:25すまない、後でiter以降をごっそり消すってのを書き忘れてた・・・
所でAcceleratedC++読んでて思ったが、C++って無茶苦茶楽しいな
Cでちまちまやってたのがアホらしい_| ̄|○
0749744
2005/11/03(木) 18:05:19++ ができてなぜ +n が思いつかなかったか謎ですorz
remove については詳細を調べてみます。
ありがとうございました。
0750デフォルトの名無しさん
2005/11/03(木) 22:18:39int *num = new int[0];
と書くと0個の配列を確保したことになるんでしょうか?
そして
delete[] num;
と書けば開放できるんでしょうか?
0751デフォルトの名無しさん
2005/11/03(木) 22:20:500753デフォルトの名無しさん
2005/11/03(木) 22:30:45staticな要素数0の配列を禁止しといて
動的な要素数0の配列を禁止しない理由
って何かあるんですか?
0754デフォルトの名無しさん
2005/11/03(木) 22:36:43malloc(0)もできるからnew T[0]もできるようにしたというところだと思う。
0755デフォルトの名無しさん
2005/11/03(木) 22:43:01使い道あるのだろうか。それともこれを許すと
何かがうまくいくのかな?
0756デフォルトの名無しさん
2005/11/03(木) 23:03:16つ[realloc()]
0757デフォルトの名無しさん
2005/11/03(木) 23:28:530758デフォルトの名無しさん
2005/11/04(金) 14:00:00erase() が返す iterator の意味を調べると吉。
0759デフォルトの名無しさん
2005/11/04(金) 21:46:42以下のようなコードを実行したところ
class A
{
int m_n;
public:
A::A(int n) :m_n(n){ cout << "コンストラクタ" << endl; }
A::A(const A& a):m_n(a.m_n){ cout << "コピーコンストラクタ" << endl; }
A::~A() { cout << "デストラクタ"<< endl; }
};
A func()
{
return A(10);
}
int main()
{
A a(func());
return 0;
}
Borland C++ では
コンストラクタ
コピーコンストラクタ
デストラクタ
デストラクタ
Visual C++ 6.0では
コンストラクタ
デストラクタ
となりました。なぜ、違った結果になるのかわかりません。
どちらも最適化はOFFにしてあります。どなたか助けてください。
0760デフォルトの名無しさん
2005/11/04(金) 21:55:32どこからどこまでを最適化というかは処理系依存。
一般に最適化をオフにしても定数部分の処理は勝手にやってしまう場合が多い。
func()が定数を引数に取るクラスを返すと考えるか、
返すクラスを定数と考えるかって所で変わってるんじゃないかな?
0761デフォルトの名無しさん
2005/11/04(金) 22:00:17VCのように一時オブジェクトの作成をしなくても良いと規格で定められている。
0762デフォルトの名無しさん
2005/11/04(金) 22:00:550763デフォルトの名無しさん
2005/11/04(金) 22:04:02>>761
なるほど。コンパイラ側で自動でやってくれる処理だったんですね。
ありがとうございました。
0764デフォルトの名無しさん
2005/11/04(金) 22:24:510765デフォルトの名無しさん
2005/11/04(金) 22:39:210766デフォルトの名無しさん
2005/11/05(土) 00:46:12double型などの浮動小数で、
指数だけをぐりぐり動かす事ってできるんですか?
例えば、
3.14159265e-010があったとして、
それを3.14159265e000とか、3.14159265e008とかに変換したいんです。
言って位置で変換するなら、*=1e10とか、1e18とかすれば良さげなんですけど、
持ってくる数値によって、動かす指数の幅を変えたいとき、
1eXとかにできないものですから…
0767デフォルトの名無しさん
2005/11/05(土) 02:07:16環境非依存の内容を要求しているのならば、* pow(10, x)とするしか
ないんじゃないかな。そもそも内部では仮数も指数も2進数で保持して
いるのが普通なんだし、正確には計算できないでしょ。今のx86のCPU
なら指数部(2進)と仮数部(2進)を分離する命令(FXTRACT)があるけど。
0768デフォルトの名無しさん
2005/11/05(土) 09:05:20標準関数だけならfrexpとlrexpがある。
0769デフォルトの名無しさん
2005/11/05(土) 13:28:03winsock2です
0770デフォルトの名無しさん
2005/11/05(土) 14:03:28// Hoge.h
class CHoge
{
public:
enum EHOGE { HOGE };
EHOGE func();
};
// Hoge.cpp
EHOGE CHoge::func()
{
return HOGE;
}
上記のようなコードのコンパイルが通りません。
Hoge.cpp(12): error C2143: 構文エラー : ';' が 'CHoge::func' の前にありません。
Hoge.cpp(13): error C2371: 'CHoge::func' : 再定義されています。異なる基本型です。
Hoge.h(10) : 'CHoge::func' の宣言を確認してください。
Hoge.cpp(12): error C2501: 'EHOGE' : 識別名を宣言するのに、型が指定されていません。
Hoge.cpp(13): error C2556: 'int CHoge::func(void)' : オーバーロード関数の戻り値は異なっていますが、引数リストは同一です。
列挙型は int 値ということで、戻り値を int 型にすれば確かにコンパイルは通りますが、どうも釈然としません。
列挙型を明示的に戻り値とすることはできないのでしょうか?
よろしくお願いします。
0771デフォルトの名無しさん
2005/11/05(土) 14:08:10ttp://msdn.microsoft.com/library/en-us/winsock/winsock/winsock_functions.asp
0772デフォルトの名無しさん
2005/11/05(土) 14:08:16CHoge::EHOGE CHoge::func();
でないけ
0774デフォルトの名無しさん
2005/11/05(土) 17:36:18英語わかんね(^−^;)
0775デフォルトの名無しさん
2005/11/05(土) 17:42:430776デフォルトの名無しさん
2005/11/05(土) 17:44:02わかんないもん(^o^;)
0777デフォルトの名無しさん
2005/11/05(土) 17:47:180778デフォルトの名無しさん
2005/11/05(土) 17:56:110779デフォルトの名無しさん
2005/11/05(土) 18:08:260780デフォルトの名無しさん
2005/11/05(土) 18:14:40中学生以下か、女子大生なら歓迎だが。
0781デフォルトの名無しさん
2005/11/05(土) 18:20:47馬鹿姉のためにお願いしまーす☆
0782デフォルトの名無しさん
2005/11/05(土) 18:25:270783デフォルトの名無しさん
2005/11/05(土) 18:29:370784デフォルトの名無しさん
2005/11/05(土) 18:32:160785デフォルトの名無しさん
2005/11/05(土) 19:09:040786デフォルトの名無しさん
2005/11/06(日) 00:22:59今日、銭湯行ったら女子小学生(幼女)が3人ぐらいいた。
0787デフォルトの名無しさん
2005/11/06(日) 00:27:11ちゃんとwinsock2教えてきたか?
0788デフォルトの名無しさん
2005/11/06(日) 00:34:58一番下の子がトイレにいくのが面倒だったらしく放尿して、親父に軽くしかられてたからそれどころじゃなかったw
0789デフォルトの名無しさん
2005/11/06(日) 01:11:53その子の父に「ばかやろう、汚いだろうが」叱られているのを見たことがあるが、
既にある程度ロリが開花していた私は、
「何もそこまで起こらなくても、むしろ私が飲んであげたい」とか思ったものだ。
うは、変態www テラヤバスwww
0790デフォルトの名無しさん
2005/11/06(日) 02:36:47それは正常wwwwっうぇww
0791デフォルトの名無しさん
2005/11/06(日) 02:38:440792デフォルトの名無しさん
2005/11/06(日) 03:17:15お風呂上りの肛門なめるのは問題ないが
0793デフォルトの名無しさん
2005/11/06(日) 06:04:430794デフォルトの名無しさん
2005/11/06(日) 10:49:410795デフォルトの名無しさん
2005/11/06(日) 11:03:410796デフォルトの名無しさん
2005/11/06(日) 11:07:300797デフォルトの名無しさん
2005/11/06(日) 11:10:460798デフォルトの名無しさん
2005/11/06(日) 11:12:300799デフォルトの名無しさん
2005/11/06(日) 11:16:580800デフォルトの名無しさん
2005/11/06(日) 11:20:380801デフォルトの名無しさん
2005/11/06(日) 11:24:130802デフォルトの名無しさん
2005/11/06(日) 11:26:150803デフォルトの名無しさん
2005/11/06(日) 11:26:540804デフォルトの名無しさん
2005/11/06(日) 11:31:10阻止。
0805デフォルトの名無しさん
2005/11/06(日) 11:36:210806デフォルトの名無しさん
2005/11/06(日) 11:39:07無視
0807デフォルトの名無しさん
2005/11/06(日) 11:49:15無
0808デフォルトの名無しさん
2005/11/06(日) 11:53:230809デフォルトの名無しさん
2005/11/06(日) 12:47:33ちなみに私の正常と異常のラインは「幼女のおしりを舐められるか否か」です。
舐められる人は異常、舐められずおしっこを飲むくらいまでの人は正常。
私はおしっこを飲むくらいまではできると思いますけど、おしりはどう足掻いてもダメですね。
0810デフォルトの名無しさん
2005/11/06(日) 12:51:31たまってる?
0811デフォルトの名無しさん
2005/11/06(日) 13:20:130812デフォルトの名無しさん
2005/11/06(日) 14:06:46嫌なら見なければ良いだけ。
0813デフォルトの名無しさん
2005/11/06(日) 14:17:420814デフォルトの名無しさん
2005/11/06(日) 14:21:05公共の場を異常な言動で占有した挙句、文句言われたら「見るな」とチョーゴーマン理論展開。
つーか見たから嫌なんだっつーの!順序が逆だっつーの!
何かしら無理しないと見れない場所ならともかく、誰でも見れる場所でそんな屁理屈通用しないっての。
こういう輩って国立公園でアナルオナニーした挙句、とっ捕まっても同じ台詞言えるんでしょうかね?
0815デフォルトの名無しさん
2005/11/06(日) 14:29:250816デフォルトの名無しさん
2005/11/06(日) 16:31:48C/C++のスレでロリコン共がスカトロ談義なんぞしてるなんてことが事前に予想できれば最初から見に来ねえよ
マジキモい
0817デフォルトの名無しさん
2005/11/06(日) 16:57:470818デフォルトの名無しさん
2005/11/06(日) 17:00:060819デフォルトの名無しさん
2005/11/06(日) 17:07:34鏡でも見てろ
0820デフォルトの名無しさん
2005/11/07(月) 17:58:58例えば変数を宣言するだけでそれを全く使用しないプログラムでも、その変数は確保されるのですか
0821デフォルトの名無しさん
2005/11/07(月) 18:02:15確保というのはスタック領域に確保するという意味かな?
だとしたら処理系による。
最適化の具合にもよる。
0822デフォルトの名無しさん
2005/11/07(月) 18:03:360823デフォルトの名無しさん
2005/11/07(月) 18:06:25毎回毎回(その変数を全く使用しない場合でも)確保されて、returnに達すると開放されるのですか?
かなり無駄な感じがするのですが
0824デフォルトの名無しさん
2005/11/07(月) 18:07:440825デフォルトの名無しさん
2005/11/07(月) 18:08:130826デフォルトの名無しさん
2005/11/07(月) 18:09:26>>823
一般的に言って、スタック上のメモリ確保はものすごく速い。
0828デフォルトの名無しさん
2005/11/07(月) 18:17:04これは宣言時にメモリ上に実体ができている。
ポインタ変数の宣言は、逆にメモリ上に実体ができていず、名前が作られただけ。
更に、staticの場合は、プログラムの最初にメモリが確保される。
すなはちプログラム開始>static変数メモリ確保(場合によっては初期化も)>mainの開始
0829デフォルトの名無しさん
2005/11/07(月) 18:28:26ダウト
0830デフォルトの名無しさん
2005/11/07(月) 18:30:33というのは、もっと明確に言うと、名前はあるけど、値を入れるメモリアドレス無し(入れ物なし、メモリ未確保)。
0831デフォルトの名無しさん
2005/11/07(月) 18:34:16超ダウト
0832デフォルトの名無しさん
2005/11/07(月) 18:40:40めちゃくちゃおもしれぇなこのスレ。
0833デフォルトの名無しさん
2005/11/07(月) 18:47:39>int型変数の宣言のように、初期値を省略すると0を当てられるもの
>宣言時にメモリ上に実体ができている
>プログラム開始>static変数メモリ確保(場合によっては初期化も)
>ポインタ変数の宣言は、逆にメモリ上に実体ができていず、名前が作られただけ
>名前はある
>入れ物なし
>メモリ未確保
0834デフォルトの名無しさん
2005/11/07(月) 18:48:300835デフォルトの名無しさん
2005/11/07(月) 19:35:510836デフォルトの名無しさん
2005/11/07(月) 19:54:49http://homepage1.nifty.com/rucio/main/VBdotNet/AboutVB/WhatsVBdotNet.htm
Visual Basic.NETではどのようなアプリケーションが作れるのか
Visual Basic.NETではWindows上、Web上、モバイル上で動作するさまざまな種類のアプリケーションが作成できます。
ユーティリティやちょっとしたツール、データベースを操作するアプリケーション、ゲームなどアイディアしだいでさまざまなものが作れます。DirectXと連動して3Dやポリゴンを利用したゲームを作ることもできます。
ただし、プレイステーションなどの家庭用ゲーム機のゲームのほとんどはC++という言語で開発されていることに注意してください。このような本格的なゲームプログラマを目指している方はC++を勉強してください。
けれどVBに熟達すればC++にも通じるようになります。(とはいえC++が目的ならはじめからC++を勉強した方が早いです。)
0837デフォルトの名無しさん
2005/11/07(月) 20:48:17ポインタ変数だって変数であることに違いはないのだから、ポインタ変数自体の実体がある。
0838デフォルトの名無しさん
2005/11/07(月) 22:02:22ゴミが入っているから、そこに値とか格納すると危なかったような。
下手するとフリーズやシステムを壊しかねない。
0839デフォルトの名無しさん
2005/11/07(月) 22:05:410840デフォルトの名無しさん
2005/11/07(月) 22:08:14アドレスなんだから値じゃないの?
0841デフォルトの名無しさん
2005/11/07(月) 22:11:270842デフォルトの名無しさん
2005/11/07(月) 22:13:16当然、ポインタ変数を宣言(正しくは定義)したときに
そのアドレスを格納する領域がメモリ上に確保される
ただし、宣言(正しくは定義)したポインタ変数に
適切な値(もちろんアドレスだ)を代入しない限り
そのポインタを逆参照することはできない
0843デフォルトの名無しさん
2005/11/07(月) 22:17:41それが「適切なアドレスが格納されてないポインタ変数を逆参照しようとした」ってこと
0844デフォルトの名無しさん
2005/11/07(月) 22:20:04_gcvt関数のようなもので、LPTSTR型にも対応できるようなものってあるんですかね?
そもそもLPTSTRとchar* で混ぜて使ってかまわないんでしょうか。
(そこら辺がどうもはっきりしなくて。Unicodeとかwchar_tとか)
0845デフォルトの名無しさん
2005/11/07(月) 22:21:230846デフォルトの名無しさん
2005/11/07(月) 22:22:53TCHARは_UNICODEの指定があればwcharになり、なければcharになる
0847デフォルトの名無しさん
2005/11/07(月) 22:35:21UNICODEが定義されている/されていないに関わらず動作するコードにしたい
ならば、当然変換すべき。
そのための変換マクロその他がVC++には多数用意されてる。
ATLのCT2A他を使うなり、_bstr_tに頼るなり、まあ方法は色々あるが
好きにしる。
0848デフォルトの名無しさん
2005/11/07(月) 22:40:400849デフォルトの名無しさん
2005/11/07(月) 23:24:310850デフォルトの名無しさん
2005/11/07(月) 23:25:140851デフォルトの名無しさん
2005/11/07(月) 23:26:120852デフォルトの名無しさん
2005/11/07(月) 23:26:46どういう意味で解釈すればよいでしょうか?
アドレス? 変数の実体?
例:func(A& ,B&);
0853デフォルトの名無しさん
2005/11/07(月) 23:28:140854デフォルトの名無しさん
2005/11/07(月) 23:29:21そりゃ変数の後じゃなくて型の後だ
で、それは参照
0855デフォルトの名無しさん
2005/11/07(月) 23:45:58勉強不足ですいません。
&は参照型を意味するでよいでしょうか。
0856デフォルトの名無しさん
2005/11/07(月) 23:58:270857デフォルトの名無しさん
2005/11/08(火) 00:00:460858デフォルトの名無しさん
2005/11/08(火) 00:02:20こいうところがC++のややこしいところだなw
0859デフォルトの名無しさん
2005/11/08(火) 00:06:57>>846
>>847
なるほど。やっぱりTCHARの方が良いのか…
そこで、
double型をLPTSTR(TCHAR *)の文字列に変換する関数ってありますか?
0860デフォルトの名無しさん
2005/11/08(火) 00:08:27ある。
0861デフォルトの名無しさん
2005/11/08(火) 00:09:430862デフォルトの名無しさん
2005/11/08(火) 00:12:350863デフォルトの名無しさん
2005/11/08(火) 04:00:13int& r = n;
int* pn = &n;
int* pr = &r ;
(pn == pr) == trueですか?
0864チラシの裏
2005/11/08(火) 06:46:02if(!!a ^ !b)としないといかん。
文字列に文字や文字列を追加したく、
sprintf(str, "%s%c", str, 'a');としてしまっっていた。
VCではOKだが、BCCだと後ろの文字のみになってしまう。
多次元配列は、一応右の様に初期化するべし。hoge[5][5] = {0};
0865デフォルトの名無しさん
2005/11/08(火) 07:25:38教えていただきありがとうございました。
0866デフォルトの名無しさん
2005/11/08(火) 08:35:38是非自分の目で確かめてみてくれ。
0867デフォルトの名無しさん
2005/11/08(火) 08:41:25>if((a && b) || (!a && !b))を短くしたく、if(a ^ !b)と書いてしまっていた。
>if(!!a ^ !b)としないといかん。
そのように書き直しても、厳密には未だ等価ではない。
>多次元配列は、一応右の様に初期化するべし
そうとも限らん。
>sprintf(str, "%s%c", str, 'a');
例えばこう書けばいい。
sprintf(strchr(str, '\0'), "%c", 'a');
0868デフォルトの名無しさん
2005/11/08(火) 08:43:29どこがややこしいの?
0869デフォルトの名無しさん
2005/11/08(火) 09:58:20といった程度かと。
0870デフォルトの名無しさん
2005/11/08(火) 11:45:50そだよ。それが参照およびポインタ変数。
0871デフォルトの名無しさん
2005/11/08(火) 11:54:28ベン図描け
0872デフォルトの名無しさん
2005/11/08(火) 12:05:17絶対に一緒に仕事したくねー。
0873デフォルトの名無しさん
2005/11/08(火) 12:07:17難解だと思ったら、そんな書き方やめりゃーいいじゃん。
0874デフォルトの名無しさん
2005/11/08(火) 12:08:32なんだその的外れなレス
0875デフォルトの名無しさん
2005/11/08(火) 13:41:24そんな便利そうなものがあったのか
キャストだけでどっちにも対応できるってのは良いな
0876デフォルトの名無しさん
2005/11/08(火) 16:22:14Windowsでこんな処理がある時、
while(1){
printf("HelloWorld\n");
}
速度が落ちても良いのでCPU使用率を下げる為に
while(1){
printf("HelloWorld\n");
sleep(1);
}
こんな事をしています。
これをLinuxでやろうとするとsleepの単位が秒でした。
さすがに1秒は待てないのですが、なにか良い代案はないでしょうか。
0877デフォルトの名無しさん
2005/11/08(火) 16:48:510878デフォルトの名無しさん
2005/11/08(火) 16:51:25残りのタイムスライスを他のプロセスに譲るようにはならないのか?
0879デフォルトの名無しさん
2005/11/08(火) 17:21:40調べてみました、うまくいきそうです。
ありがとうございます。
>>878
sleep(0)試してみました。
こちらもうまくいきました。
両方単純なプログラムで試してみたところ、
sleep(0)の方がCPU使用率5%位でかなり早い。
usleep(1)or(0)だと、CPU使用率がほとんど0%で遅い。sleep(0)の1/50位かなぁ。
用途に合わせて洗濯してみます。
ありがとうございました。
0880デフォルトの名無しさん
2005/11/08(火) 17:26:060881デフォルトの名無しさん
2005/11/08(火) 17:42:150882デフォルトの名無しさん
2005/11/08(火) 18:45:29コンパイルエラーでなかったよ。
0883デフォルトの名無しさん
2005/11/08(火) 19:39:38使うメリットは?
0884デフォルトの名無しさん
2005/11/08(火) 19:43:280885デフォルトの名無しさん
2005/11/08(火) 19:48:06int+ nullpo;
int main()
{
int* nullpo;
nullpo = 0;
::nullpo = 0; /* こういうの */
return *nullpo;
}
0886デフォルトの名無しさん
2005/11/08(火) 20:37:19public:
int func(int a) {
return a-::func(a); // こういうの
}
}
int func(int a) {
return a+5;
}
0887デフォルトの名無しさん
2005/11/08(火) 21:25:10#include<stdio.h>
int+ nullpo;
int main()
{
int* nullpo;
nullpo = 0;
::nullpo = 0; /* こういうの */
return *nullpo;
}
↑これじゃだめなの?
0888デフォルトの名無しさん
2005/11/08(火) 21:26:10そのエラー見て直せ
そして帰れ
0889デフォルトの名無しさん
2005/11/08(火) 21:49:08コンストラクタ・デストラクタが呼ばれる。
型安全。(new intとするとint *型で返してくれるのでmalloc()などと違いキャスト不要)
0890デフォルトの名無しさん
2005/11/08(火) 21:53:37採点してくれてサンクス。
勉強になった。
>>871
分かった。
>>872
個人製作だから、それは大丈夫だけど、
エラーチェックは特に気をつけるようにする。
0891デフォルトの名無しさん
2005/11/08(火) 22:18:59#include<stdio.h>
void main(void)
{
int x[5.5];
x[0.2]=2;
printf ("%d\n",x[0.2]);
}
↑勘で作った・・・動かん!
0892デフォルトの名無しさん
2005/11/08(火) 22:22:000893デフォルトの名無しさん
2005/11/08(火) 22:28:56勘で直した。
#include <stdio.h>
int main(void)
{
int x[5][5];
x[0][2]=2;
printf("%d\n", x[0][2]);
}
0894デフォルトの名無しさん
2005/11/08(火) 22:31:55最近、Borland C++Compiler + Cpad環境で
Cを始めたのですが、
#include <stdio.h>
main()
{
printf("あいうえお");
return 0;
}
というプログラムを実行すると、Cpadではうまくいくのですが
windwsのdos窓からコマンドラインでコンパイル指示すると
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
と出力され、命令した文字が表示されません。
これはどういう事なのでしょうか?
自分なりに調べてはみたのですが結局わかりませんでした。
0895デフォルトの名無しさん
2005/11/08(火) 22:33:23コンパイルは機械語への翻訳でしかない。
出来たexeファイルを実行しろ。
0896デフォルトの名無しさん
2005/11/08(火) 22:34:300897デフォルトの名無しさん
2005/11/08(火) 22:39:09thx
0898デフォルトの名無しさん
2005/11/08(火) 22:39:22いちおー、今後のために専用スレを紹介しておく
タダで使えるBorland C++ Part4
ttp://pc8.2ch.net/test/read.cgi/tech/1091066805/l50
0900デフォルトの名無しさん
2005/11/09(水) 00:08:03>>894←お前馬鹿だろ?プログラムとかそういうの以前にw
0901デフォルトの名無しさん
2005/11/09(水) 00:43:33すまんです。 言葉足らずでした。
その関数はなんという名前でどういうものですか?
MSDNで調べても巧くヒットしなくて
0902デフォルトの名無しさん
2005/11/09(水) 01:04:34いやね、全くの初心者がサイトの情報だけではじめるとこうなっちゃうんだよ
それは仕方がない
だからちゃんとした入門書買えと繰り返し言うことになるんだが
0903デフォルトの名無しさん
2005/11/09(水) 01:06:27_stprintf
0904デフォルトの名無しさん
2005/11/09(水) 09:46:35#define INPUT_MAX 19
があるとして、これを
printf()の文字幅(と言うのかな?)の指定に当てたいのですが、
""内に入れると、そのままINPUT_MAXが出力されてしまいます。
こういった場合はdefineは使えないのでしょうか?
0905デフォルトの名無しさん
2005/11/09(水) 10:28:28プリプロセッサを駆使すればなんとか出来る。
#include<stdio.h>
#define T(S) #S
#define TT(S) T(S)
#define INPUT_MAX 19
int main(){
int x=10;
/*
Tを直接呼び出した場合、"INPUT_MAX"と展開されるので
二重に展開するためにTTを使う。
*/
printf("x = %"TT(INPUT_MAX)"d",x);
return 0;
}
0906デフォルトの名無しさん
2005/11/09(水) 11:09:39回答ありがとうございます。
知識が追いつかないので、今回はdefineを使わずに行こうと思います。
0907デフォルトの名無しさん
2005/11/09(水) 11:19:020908デフォルトの名無しさん
2005/11/09(水) 11:25:36printf の第一引数(たぶんchar*)に渡す文字列を、配列なりにしてあらかじめ用意しておく。
これならsprintfとかで INPUT_MAX の値を埋め込むことも出来る。
で、printf ( string , x ) とかすれば。
効率悪い? 速度遅い? ソースが汚い? 知るかボケ
0909デフォルトの名無しさん
2005/11/09(水) 11:38:29sprintf(a, "\%%dd", INPUT_MAX);
printf(a, ...);
printf系の書式指定はあくまで文字列
何もその場で""で囲んだリテラルを指定しなきゃいけないわけじゃないことを忘れるな
0910初心者
2005/11/09(水) 11:39:23できなければこのheadfileついているプログラムはどうやってビルトしますか??
是非教えてください
0911デフォルトの名無しさん
2005/11/09(水) 11:41:54最後2行には同意だが、なんだそのイッちゃったプログラム・・・
0912デフォルトの名無しさん
2005/11/09(水) 11:43:00そのheadfileをおまえのVC6.0がファイル検索できるディレクトリに入れりゃいいだろ
0913デフォルトの名無しさん
2005/11/09(水) 11:46:22ゆとり教育の弊害って奴か。
そもそもgraphcis.hってなんだ?
ぐぐったら、もしかしてgraphics.hと指摘されたが、
DOS時代の、Turbo C++付属のライブラリのヘッダのことか?
まさかいまどき、そんなはずはないし。
0914デフォルトの名無しさん
2005/11/09(水) 12:00:00printf("%*d", INPUT_MAX, ...
0915デフォルトの名無しさん
2005/11/09(水) 12:11:49>>914
こんな簡単な事だったんですね。
自分の書き方が悪かったばかりに、
皆さんに難しく考えさせてしまって申し訳ないです。
0917デフォルトの名無しさん
2005/11/09(水) 17:28:33むしろやさしく教えてあげるべき。俺はしらん
0918デフォルトの名無しさん
2005/11/09(水) 17:37:390919デフォルトの名無しさん
2005/11/09(水) 17:45:20実は本人というオチ。
0920デフォルトの名無しさん
2005/11/09(水) 22:43:16>910には「その本捨てろウンコタレ」とレスしてあげるべきだな
0921デフォルトの名無しさん
2005/11/09(水) 22:48:00構造体の進化版なんだろー!
ハッハッハ
リスト構造わかんねー
ハッハッハッハッハ
0922デフォルトの名無しさん
2005/11/09(水) 22:50:09クラス使うのヤメレ。というかやめてくれ。
その理解でクラス使うと絶対に後悔する。
0923デフォルトの名無しさん
2005/11/09(水) 23:13:47周りがな
0924デフォルトの名無しさん
2005/11/09(水) 23:17:52ハッハッハッハ!
0925デフォルトの名無しさん
2005/11/10(木) 13:31:34C++のテンプレートに興味を持ち色々試行錯誤しているのですが
template<class T>
void test(){
printf("%d\n", sizeof(T));
}
void main(){
test<int>();
test<char>();
}
とやると、testのprintfで両方とも 1 が出力されてしまいます。
私は
4
1
と表示されることを期待していたのですが、異なった引数を持たない場合関数が上書きされてしまうのでしょうか?
testの引数に test(T tmp)としたら期待通りの動きになりましたが…。
0926デフォルトの名無しさん
2005/11/10(木) 13:53:53void test(T x) {
printf("%d\n", sizeof(x));
}
void main() {
int a;
char b;
test(a);
test(b);
}
やるならこうだろ
テンプレートクラスじゃねぇんだぞ?
0927デフォルトの名無しさん
2005/11/10(木) 14:01:31テンプレートクラスのstatic関数にするという手もありますし、検討してみます。
0928デフォルトの名無しさん
2005/11/10(木) 14:01:41コンパイラのバグかと。
手元のg++では
4
1
と表示された。
0929デフォルトの名無しさん
2005/11/10(木) 14:02:262003では期待通りの出力がされた。
VC6だったらコンパイラがヘタレなので投げ捨てろ。
0930デフォルトの名無しさん
2005/11/10(木) 14:04:20void* operator new[](size_t t);
でtの値を調べていたところ、
intやcharならそのままのサイズ。つまり4*x個や1*x個のバイト数になり
クラスだとさらに+4バイトだけかかることに気づいた。
この余分な4バイトは何なんでしょうか?
0931デフォルトの名無しさん
2005/11/10(木) 14:05:16VC6です(つД`)
まぁテンプレートクラスのstatic関数にしたらうまくいったので、こっち使います。
0932930
2005/11/10(木) 14:07:52new int [8]; // 4*8=32バイト
new char [4]: // 1*4=4バイト
new CHoge[4]; // sizeof(CHoge) * 4 + 4バイト
になります。
0933デフォルトの名無しさん
2005/11/10(木) 14:09:11コンパイラの実装しだい。
どのコンパイラのどのプラットフォームなのかもわからないけど、
thisじゃないのかな?
0934デフォルトの名無しさん
2005/11/10(木) 14:10:10多分配列の要素数。
クラスの場合 delete [] 時にデストラクタを呼ぶ必要があるので要素数が必要になる。
VCでは先頭アドレス-4の所に要素数が格納されているようだが、実装依存なんで気にするな。
0935デフォルトの名無しさん
2005/11/10(木) 14:16:25ありがとう。
助言をもとに返されるアドレスから4バイトさかのぼってintに変換してみたところ、わけのわからん数字が…。
[1] だと 4
[2] だと 5
[3] だと 5
[4] だと 6
[5] だと 11
うーむ、謎。まぁ実装依存ということで。
0936デフォルトの名無しさん
2005/11/10(木) 14:18:250937デフォルトの名無しさん
2005/11/10(木) 14:19:200938デフォルトの名無しさん
2005/11/10(木) 14:19:46デストラクタが必要ないから要素数は必要ない。
0939デフォルトの名無しさん
2005/11/10(木) 14:22:02単純に
*(int*)((byte*)p - 4)
しただけなんだけど、間違ってたかな?
0940デフォルトの名無しさん
2005/11/10(木) 14:23:40これじゃだめなのかな。
*((int *)(p) -1)
0941デフォルトの名無しさん
2005/11/10(木) 14:24:440942デフォルトの名無しさん
2005/11/10(木) 14:25:28sizeof(CHoge)バイト戻るのでダメ。
0943942
2005/11/10(木) 14:26:110944デフォルトの名無しさん
2005/11/10(木) 14:41:30デバッグでちゃんと4バイトだけ戻されてるの確認した?
0945デフォルトの名無しさん
2005/11/10(木) 15:13:34なるほど。TCHARを直接引数に定義してあるのばかり探してました…
こうやって、臨機応変にcharとwchar_tで使い分けられればよいわけですね?
int DtoS(char *buffer, double value) {
return sprintf(*buffer, "%.18G", value);
}
int DtoS(wchar_t *buffer, double value) {
return swprintf(*buffer, "%.18G", value);
}
や、
#ifdef UNICODE
#define DtoS(buffer, value) swprintf(buffer, "%18G", value)
#else
#define DtoS(buffer, value) sprintf(buffer, "%18G", value)
#endif
みたいなかんじで。
0946デフォルトの名無しさん
2005/11/10(木) 15:41:50??
後者を自動的にやってくれるのが、_stprintfですよね。
一度ヘッダを見てみることをオススメします。
0947デフォルトの名無しさん
2005/11/10(木) 15:52:16つーかIWebBrowser2を使ってるときになんでわざわざ
WideCharToMultiByteを使ってSJISに変換しないといけないんだと・・
0948デフォルトの名無しさん
2005/11/10(木) 15:52:20コンパイル時にエラーになると思うのですが、constを外す事以外で回避できる書き方でもあるのでしょうか?
char *func(const char *a)
{
char *b;
b = a;
return b;
}
0949デフォルトの名無しさん
2005/11/10(木) 15:57:35可能。
char *b = (char *)a;
>コンパイル時にエラーになると思うのですが、constを外す事以外で回避できる書き方でもあるのでしょうか?
質問の意味がわからんので、説明してくれるか?
0950デフォルトの名無しさん
2005/11/10(木) 15:57:46今時UNICODE嫌いですか?w
0951デフォルトの名無しさん
2005/11/10(木) 15:58:42const_castを使う。
char *func(const char *a)
{
char *b;
b = const_cast<char *>(a);
return b;
}
0952デフォルトの名無しさん
2005/11/10(木) 16:00:42うにうにしてて(´・д・`) ヤダ
0953デフォルトの名無しさん
2005/11/10(木) 16:02:25いずれすべて、UNICODEになるさ。
NTカーネルでは、ANSIのAPIは、ワイド文字に変換して、丸投げだからな。
でもなぜXPでもGetAddrInfoW()がないんだろう……。
0954デフォルトの名無しさん
2005/11/10(木) 16:03:15普通にキャストできたんですね。ただの勘違いでした。
ありがとうございました。
0955デフォルトの名無しさん
2005/11/10(木) 16:05:020956デフォルトの名無しさん
2005/11/10(木) 16:23:25エラーになるのは訳があるわけだが、ちゃんと理解してるのか?
const_castが必要というのは、基本的に設計が悪い。
0957デフォルトの名無しさん
2005/11/10(木) 16:25:470958948
2005/11/10(木) 17:07:22constをポインタに付けると、そのポインタを介した値を書き換えようとした時にコンパイラが警告を出す、で正しいでしょうか。
確かに設計に問題があると思ったので既に改善しましたが、気になったので質問させていただきました。
0959デフォルトの名無しさん
2005/11/10(木) 17:29:32あ、ホントだ…
全然、全く、知りませんでした…orz
0960デフォルトの名無しさん
2005/11/10(木) 17:42:26TCHAR と _TCHAR では基本的に同じものと考えて良いのですか?
0961デフォルトの名無しさん
2005/11/10(木) 17:42:560962デフォルトの名無しさん
2005/11/10(木) 17:53:38operator new と operator new[] をオーバーライドしているのですが、
char *p = new char [4];
が
とあるクラスの中ではoperator new に飛び、
とあるクラスの中ではoperator new[] に飛びます。
特に不具合は起きていないのですが、なんとも気味が悪いです。
原因の心当たりがある方はいらっしゃいませんでしょうか。
charの配列のため、生成しようとしているもののoperator newがオーバーロードされているわけでもありませんし…。
この現象が起こるのはVC6.0です。
友達の環境(すいません、聞きそびれました)では両方new []に飛んだそうです。
0963デフォルトの名無しさん
2005/11/10(木) 18:06:45直ちにVC6.0を使うのを止めて下さい。
0964デフォルトの名無しさん
2005/11/10(木) 18:11:030965デフォルトの名無しさん
2005/11/10(木) 18:15:130966デフォルトの名無しさん
2005/11/10(木) 18:22:06コンパイラの最適化の度合いが全然違うぞw
換えてよかったと思ってる
不満点はvc7.1のintellisenseが循環参照してる定義があるとフリーズすることぐらいだよ
0967デフォルトの名無しさん
2005/11/10(木) 18:23:060968デフォルトの名無しさん
2005/11/10(木) 18:24:34同じwchar_tですね。
ええ。同じだと分かりました。
0969デフォルトの名無しさん
2005/11/10(木) 18:54:42おい
0970デフォルトの名無しさん
2005/11/10(木) 20:44:12TCHARは<Windows.h>の中の中でインクルードされる<WinNT.h>の中で
UNICODEが定義されているかどうかでcharかwchar_tからtypedefされる。
_TCHARは<tchar.h>の中で_UNICODEが定義されているかどうかでcharかwchar_tからtypedefされる。
ところどころでUNICODEが定義されていれば_UNICODEを定義し、
_UNICODEを定義が定義されていればUNICODEを定義するように書かれているから両者はごっちゃにしても差し支えない。
実質的にTCHARと_TCHARも同一視して良いと思われる。
0971デフォルトの名無しさん
2005/11/10(木) 21:41:53え?
>>970
なるほど。一応別物なんですね。
取りあえずごっちゃにしても大丈夫そうだということなのは分かりました(笑)
どうもありがとうございます。
0972デフォルトの名無しさん
2005/11/10(木) 21:47:120973デフォルトの名無しさん
2005/11/10(木) 22:04:38ありゃ?
どこでtypedefされてるかで違うんじゃないんですか?
>>970さんが言っているのは、
どこでUNICODEが定義されているかの違いがあるが、
別々(charとwchar_t)のものを指すことはないから同じと見て問題がない
という意味だと思ったのですけど。
…んまぁ 同じなのか。
難しく考えないようにします。(そんなに考えられるような知恵無いしw)
0974デフォルトの名無しさん
2005/11/10(木) 23:42:510975デフォルトの名無しさん
2005/11/11(金) 00:05:21UNICODE/_UNICODEを定義するのは自身。
ソースコードでは#ifdefなどで切り分けているだけ。
>>974
C/C++に命令などありませんがなにか。
0976デフォルトの名無しさん
2005/11/11(金) 00:10:38とかって命令じゃないの?
0977デフォルトの名無しさん
2005/11/11(金) 00:12:220978デフォルトの名無しさん
2005/11/11(金) 00:16:400979デフォルトの名無しさん
2005/11/11(金) 00:50:230980デフォルトの名無しさん
2005/11/11(金) 00:58:410981デフォルトの名無しさん
2005/11/11(金) 02:49:26class Base {
public:
Base();
virtual ~Base();
};
class Derived : public Base {
public:
Derived();
virtual ~Derived();
};
void
foo(Derived& arg)
{
Base local(arg);
}
0982デフォルトの名無しさん
2005/11/11(金) 02:54:02メンバ関数を仮想関数にすれば行ける。
0983デフォルトの名無しさん
2005/11/11(金) 03:59:12(catch(Exception *e){}) が当然だと思っていたのですが
ポインタで受ける(catch(Exception *e){})
コピーして受ける(catch(Exception e){})
参照で受ける(catch(Exception &e){})
の3種があると聞きました…。
この3つの使い分けって何でしょうか?
また、どれを使用するのが望ましいのでしょうか。
初心者房ですみませんがよろしくお願いします。
0984デフォルトの名無しさん
2005/11/11(金) 04:07:52sched_yield()
0985デフォルトの名無しさん
2005/11/11(金) 05:13:33効率の問題。
ポインタで受けるには、アドレスを投げる必要があるので面倒。
実体で受けると、例外オブジェクトが大きい場合、コピーコンストラクタの
処理が重くなる。
従って、参照で受けると良い。例外オブジェクトの変更の必要がなければ、
const参照で受ける。
0986デフォルトの名無しさん
2005/11/11(金) 05:38:11だから、catch節で、deleteしないといけないし。
0987デフォルトの名無しさん
2005/11/11(金) 05:45:56#include <iostream>
#include <exception>
#include <memory>
class A {
public:
static char* what() {
return "class A";
}
};
int main()
{
try {
throw std::auto_ptr<A>(new A);
}
catch (std::auto_ptr<A> a) {
std::cout << a->what() << std::endl;
}
}
0988デフォルトの名無しさん
2005/11/11(金) 08:52:18アドレスを投げるのが面倒って、バカじゃねーの?
0989デフォルトの名無しさん
2005/11/11(金) 11:17:51>>986
0990デフォルトの名無しさん
2005/11/11(金) 12:10:21って本当ですか?
これ、仕事にも使っても大丈夫ですよね?
0991デフォルトの名無しさん
2005/11/11(金) 12:19:35商用利用も可だったはず。
0992デフォルトの名無しさん
2005/11/11(金) 12:48:010993デフォルトの名無しさん
2005/11/11(金) 12:50:35うわーいと言いたいところだけど、最近2003買ったばっかりなんだよね(´・ω・`)
0994デフォルトの名無しさん
2005/11/11(金) 13:00:38fp = new float [5];
のようにfloat型へのポインタに5つの配列を宣言しました
この時はfp[0]...fp[4]まで初期化しないとおかしな数値が入っているのでしょうか?
printf("%f", fp[i]);のようにforでまわしてみたところ-44556.0000みたいになっておりました。
それとも値の参照の仕方が違うのでしょうか?
0995994
2005/11/11(金) 13:01:54float *fp; でした
0996デフォルトの名無しさん
2005/11/11(金) 13:28:48・参照の仕方はそれでいい
まぁ、確保時に明示的に0で埋めておくのが一番安全だろう
0997994
2005/11/11(金) 14:12:14初期化って大切ですね(´・ω・`)
これに気づかず数時間も悩んでました
0998デフォルトの名無しさん
2005/11/11(金) 14:30:57vectorがおすすめ
994相当のことをして100で初期化するとすると
vector <float> fp (5, 100);
///
printf("%f", fp[i]);
こんな感じ
0999994
2005/11/11(金) 15:02:01ありがとうございます
vector使うだけで見た目も量もいいですねぇ
1000デフォルトの名無しさん
2005/11/11(金) 15:37:29【初心者歓迎】C/C++室 Ver.24【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1131691023/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。