【初心者歓迎】C/C++室 Ver.30【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/08/21(月) 16:32:04ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.29【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1152367512/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2006/08/21(月) 16:40:120003デフォルトの名無しさん
2006/08/21(月) 16:47:16重複スレはこっち
http://pc8.2ch.net/test/read.cgi/tech/1156145593/
0004デフォルトの名無しさん
2006/08/21(月) 16:55:17乙
0005デフォルトの名無しさん
2006/08/21(月) 17:54:380006デフォルトの名無しさん
2006/08/21(月) 17:57:39再帰構造ととらえてよろしいのか?
0007デフォルトの名無しさん
2006/08/21(月) 19:15:190008デフォルトの名無しさん
2006/08/21(月) 19:17:250009デフォルトの名無しさん
2006/08/21(月) 20:23:160010デフォルトの名無しさん
2006/08/21(月) 20:27:570011デフォルトの名無しさん
2006/08/21(月) 20:35:260012デフォルトの名無しさん
2006/08/21(月) 20:55:060013デフォルトの名無しさん
2006/08/21(月) 21:00:220014デフォルトの名無しさん
2006/08/21(月) 21:01:550015【初心者歓迎】C/C++室 Ver.31【環境依存OK】
2006/08/21(月) 21:37:16エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0016【初心者歓迎】C/C++室 Ver.30【環境依存OK】
2006/08/21(月) 21:37:35エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.29【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1152367512/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0017デフォルトの名無しさん
2006/08/21(月) 21:39:12判らなくなるだろw
0018デフォルトの名無しさん
2006/08/21(月) 22:08:10↓
解説書購入
↓
printfやifを一通り使えるようになるレベル ←いまココ
オセロは何段階くらい先?
0019デフォルトの名無しさん
2006/08/21(月) 22:30:000020デフォルトの名無しさん
2006/08/21(月) 22:36:460021デフォルトの名無しさん
2006/08/21(月) 22:37:120022デフォルトの名無しさん
2006/08/21(月) 22:43:200023デフォルトの名無しさん
2006/08/21(月) 22:45:02俺もミラーリング参加する!
0024デフォルトの名無しさん
2006/08/21(月) 22:45:47002523
2006/08/21(月) 22:47:41正常に運営しつつ、「双子スレ」の記録を狙ってみては。
0026デフォルトの名無しさん
2006/08/21(月) 22:48:520027デフォルトの名無しさん
2006/08/21(月) 22:49:280028デフォルトの名無しさん
2006/08/21(月) 22:51:210029デフォルトの名無しさん
2006/08/21(月) 22:58:360030デフォルトの名無しさん
2006/08/21(月) 23:08:370031デフォルトの名無しさん
2006/08/21(月) 23:11:15まさに マルチスレッド
0032デフォルトの名無しさん
2006/08/21(月) 23:13:180033デフォルトの名無しさん
2006/08/21(月) 23:13:200034デフォルトの名無しさん
2006/08/21(月) 23:15:020035デフォルトの名無しさん
2006/08/21(月) 23:15:530036デフォルトの名無しさん
2006/08/21(月) 23:15:58この話題で30も行くとこうなるのか。
0037デフォルトの名無しさん
2006/08/21(月) 23:16:430038デフォルトの名無しさん
2006/08/21(月) 23:17:150039デフォルトの名無しさん
2006/08/21(月) 23:18:390040デフォルトの名無しさん
2006/08/21(月) 23:19:460041デフォルトの名無しさん
2006/08/21(月) 23:42:350042デフォルトの名無しさん
2006/08/22(火) 00:03:56ああ、俺がちょうど書いてやろうと思ったのに。
0043デフォルトの名無しさん
2006/08/22(火) 00:04:270044953
2006/08/22(火) 01:18:50>>18私はC++を勉強して4ヶ月目で、授業では一応教科書一冊の範囲(ポインタまで)も終わったんですが
ぜんぜん駄目でした。
0045デフォルトの名無しさん
2006/08/22(火) 01:20:07OSはfreebsd4.11です。
#一応findしてみたところ/usr/includeにstring.hはあったのですが、
肝心のコードが書いてあるファイルが見つかりませんでした・・・
0046デフォルトの名無しさん
2006/08/22(火) 03:32:05Bは一通りわかってます。
0047デフォルトの名無しさん
2006/08/22(火) 04:30:560048デフォルトの名無しさん
2006/08/22(火) 04:38:270049デフォルトの名無しさん
2006/08/22(火) 08:55:480050デフォルトの名無しさん
2006/08/22(火) 09:27:230051デフォルトの名無しさん
2006/08/22(火) 09:27:310052デフォルトの名無しさん
2006/08/22(火) 11:20:03失敗ぷっ
0053デフォルトの名無しさん
2006/08/22(火) 11:27:24失敗ぷっ
0054デフォルトの名無しさん
2006/08/22(火) 11:48:210055デフォルトの名無しさん
2006/08/22(火) 13:54:57こちらが本スレということで、こちらで質問していいのでしょうか?
005655
2006/08/22(火) 14:13:340057デフォルトの名無しさん
2006/08/22(火) 14:38:14自分の環境(bc++5.5.1)では16進数で表示されるのですが、これを10進数で表示したいです。
0059デフォルトの名無しさん
2006/08/22(火) 14:58:42%pでは無理なのですね。
整数型にキャストするのが簡単そうなのでキャストでいこうと思います。
どうもありがとうございました。
0060デフォルトの名無しさん
2006/08/22(火) 15:32:30%dでいいんじゃね。
bccはどうだか知らんが、gccとvc7ではprintfの書式と型の対応をチェックする。
0062デフォルトの名無しさん
2006/08/22(火) 16:07:37でも%pでの出力形式には影響しないでしょ。
だから、整数型にキャストした時点で"%p"は使えなくなるっつー話なんだけど。
0064デフォルトの名無しさん
2006/08/22(火) 16:46:57整数型にキャストしたので当然%dで書式を指定しました。
%pは63さんが仰るようにポインタに対する書式だと思っていましたので。
それでやりたかったことがうまくできたのですが、
実は何か潜在的な問題があるのでしょうか?
別にない。
0066デフォルトの名無しさん
2006/08/22(火) 17:42:19(u)intptr_tを使うにしても、printfには(u)intptr_tに対応する長さ修飾子が存在しないこと。
0067デフォルトの名無しさん
2006/08/22(火) 17:59:24問題が起こるとすれば環境依存性がある点なのですね。
今のところ%dだけでprintfがよしなにやってくれているようなので、
とりあえずこれでいこうと思います。
相談に乗っていただいて、ありがとうございました。
0068デフォルトの名無しさん
2006/08/22(火) 20:55:14オレは%uをお勧めする。
って言うか、普通に16進の方がわかりやすいと思うが?
0070デフォルトの名無しさん
2006/08/23(水) 17:11:160071デフォルトの名無しさん
2006/08/23(水) 17:13:470072デフォルトの名無しさん
2006/08/23(水) 17:28:160073京大生www
2006/08/23(水) 17:59:20でもmax >= 17ではプログラムが動きません。
どうしてでしょうか?
http://www.uploda.org/uporg489202.cpp.html
環境はbcc32
windows xp
1.3Ghz 512MB
これより処理を早くする方法は分かるのですが、それにしても17以上で動かなくなるのは解せません。
0074京大生www
2006/08/23(水) 18:04:100076京大生www
2006/08/23(水) 18:07:57何ででしょう
0077京大生www
2006/08/23(水) 18:26:20けどなんで・・・・1000までやりたい。
0078京大生www
2006/08/23(水) 18:29:51http://www.uploda.org/uporg489242.cpp.html
どうしてか早く教えてください。
0079デフォルトの名無しさん
2006/08/23(水) 18:30:01int prime[] = {2, 3};
これは
int prime[2] ...と同じだからな
0080デフォルトの名無しさん
2006/08/23(水) 18:32:38関数作れ
0081京大生www
2006/08/23(水) 18:44:48知ってます。
だから要素数record_num = 2になってるでしょ。
いろいろとアレっていうのはどこですか。
おれにはver.2以上早いアルゴリズムが思い浮かびません。
>>80
やろうとしたらポインタとか意味不明になってキレた。
短いからいいやみたいな。
プログラムが読みにくいのは察しますが^^;
>知ってます。
京大をブラックリストに…あ、もう入ってたわ。
0083デフォルトの名無しさん
2006/08/23(水) 18:54:11じゃあ、要素数2個の配列に3個以上の要素を入れんなや
ttp://www.uploda.org/uporg489268.cpp.html
0085デフォルトの名無しさん
2006/08/23(水) 18:56:58008683
2006/08/23(水) 19:00:43#include <iostream>
がなぜか見えない
こぴぺでなくファイルのアップロードなのになぜだ
0087京大生www
2006/08/23(水) 19:30:56どういう意味ですか、ソースはちゃんと読んでもらえたでしょうか?
0088京大生www
2006/08/23(水) 19:33:33どうしてだ・・・これだといくらでもでる。
でもおれのも21まではいける。どうしてだ。
008983
2006/08/23(水) 19:34:55ttp://www.uploda.org/uporg489292.cpp.html
0090京大生www
2006/08/23(水) 19:36:51なぜなら、素数は6n±1の形であるというところまでは最低絞りこんだほうが格段に速度があがるのは明確だから
0091京大生www
2006/08/23(水) 19:38:300092京大生www
2006/08/23(水) 19:41:12説明せよ
0093デフォルトの名無しさん
2006/08/23(水) 19:43:450094デフォルトの名無しさん
2006/08/23(水) 19:49:51もう一回CでもC++でもいいから勉強し直して
なおかつ人の意見をちゃんと聞けるようになったらここにおいで
ヒント、偶数の素数は1個しかない。だからmax=0はエラーになる。
0095京大生www
2006/08/23(水) 19:59:24笑わせるぜ、6n周期の中で2つしか調べてないんだから割る3くらいではいけるんじゃねーの?
今C勉強してんだよ、てゆうかなんか忘れたからC++勉強したついでに復習しておくかってカンジ。
おれは人の意見はきくよ、ただしまともな意見ならね。間違ったことは徹底的に批判する、それだけ。
おれのプログラムの間違いは、最初に要領確保しなかったこと。
それでも21までできてしまったのはなぜか、本来ならできんはず、なぜか答えてくれ。
0096デフォルトの名無しさん
2006/08/23(水) 20:06:28ママに聞けば?
0097デフォルトの名無しさん
2006/08/23(水) 20:10:46そしてたとえ範囲外の要素を使おうとしても、そこに対応するメモリが特に使われていない場合、
まるで何事も無いかのように使えることはよくある。
ただ、それは偶然何事も無く動いているのであり、決してそれに頼ってはいけない。
京大生のプログラムもまさにそうなっていた。
0098京大生www
2006/08/23(水) 20:24:14わかったぜ。
あと演算時間を計算したいんだが、どうすればいい。
time()とdifftime()か?
これだと秒までしかでねーんだけどwwww
0099京大生www
2006/08/23(水) 20:35:000100デフォルトの名無しさん
2006/08/23(水) 20:36:01で、お前は何を使っていると書こうとしたが、既にWindowsと書いてあるな、よし。
Windowsなら<windows.h>をインクルードすればGetTickCountが使える。
一番お手軽で、ミリ秒単位の数値が返ってくる。(ただし実際の精度は数ミリ〜数十ミリ秒のはず)
使い方はtimeとあまり変わらない。大雑把に言ってGetTickCountには引数がなく、またtime_tの代わりにDWORDを使うだけ。
difftimeに相当するものはなく、ただの整数なので直に減算して構わない。
0101デフォルトの名無しさん
2006/08/23(水) 20:36:59clock()あたりでいいんじゃないか?
0102京大生www
2006/08/23(水) 20:42:26>>100
やってみる
0103デフォルトの名無しさん
2006/08/23(水) 20:43:080104デフォルトの名無しさん
2006/08/23(水) 20:46:20数十�_秒くらいの精度で計れなかったかな
0105デフォルトの名無しさん
2006/08/23(水) 20:47:410106デフォルトの名無しさん
2006/08/23(水) 20:51:510107京大生www
2006/08/23(水) 20:52:37変な数値でたけど単位不明w
でusing namespace std;って何?
0108デフォルトの名無しさん
2006/08/23(水) 20:57:18std::cin >> max;って書くべきところを
cin >> max;って省略して書けるおまじない
0109京大生www
2006/08/23(水) 21:01:58一番最初の使用ではそうだったけど、以降デフォで大丈夫になったと読んだ気がする。
0110デフォルトの名無しさん
2006/08/23(水) 21:01:590111デフォルトの名無しさん
2006/08/23(水) 21:04:08そんな悠長な事を言ってるから、調子にのってるじゃねぇか!
>>京大生
いい加減、本買って来て嫁
0112京大生www
2006/08/23(水) 21:12:10林ハルヒコ先生の新C言語入門シニア編は大体読みました。
が、実戦経験が少ないのでミスが多いのです。
言われれば理解は出来ます。
あとはクラスと継承完全制覇って本を読みましたがこれは意味が分かりませんでした。
クラスは用途がよく分かりません;;
君たちは京大生に教えてるのですよ、誇りに思わないのですか。
0113デフォルトの名無しさん
2006/08/23(水) 21:14:260114デフォルトの名無しさん
2006/08/23(水) 21:16:36全く理解出来ていない。
100万回位読み返せ。
0115デフォルトの名無しさん
2006/08/23(水) 21:21:17上手いなww
0116デフォルトの名無しさん
2006/08/23(水) 21:33:53CとC++の違いってなに?
0117デフォルトの名無しさん
2006/08/23(水) 21:35:010118デフォルトの名無しさん
2006/08/23(水) 21:37:230119デフォルトの名無しさん
2006/08/23(水) 21:38:180120京大生www
2006/08/23(水) 21:38:42クラスを使えばC++と書いてあった。
C with Class = C++
>>117
大変失礼な発言です。取り消しなさい
0121デフォルトの名無しさん
2006/08/23(水) 21:43:400122デフォルトの名無しさん
2006/08/23(水) 21:45:43別に3で割っても俺はかまわないがmax=4以下では使えない
max=100000より小さい値は指定しないことにして14で割っちゃえよ
0123デフォルトの名無しさん
2006/08/23(水) 21:45:51きっと読めなかったんだよ(w
0124デフォルトの名無しさん
2006/08/23(水) 21:48:44C++の本も読んでみるといいお
0125デフォルトの名無しさん
2006/08/23(水) 21:57:01現在、次のページを写してY = x^2 ぐらいの簡単な計算は出来るようになりました。
ttp://www.h7.dion.ne.jp/~matsu/pc_cluster/mpi/intro/daikei.html
しかし、このプログラムでは指数exp()の計算が出来ないのです。
このプログラムのどこをどう直したら指数の積分が出来るようになるのか、またはもっと良い方法があったら教えてください。。
0126デフォルトの名無しさん
2006/08/23(水) 22:50:33XPで、BCCとフリーのエディタで作業しております。
Dドライブ内のフォルダ D:\hoge に作ったプログラムを置いて、出力されるファイルを
そのフォルダ内の小フォルダに出力しようと思いまして
D:\hoge\hogedat というフォルダを作ってから、D:\hoge内に以下のようなコードのプログラム
を置きました
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
FILE *fp1;
int i;
char *fn;
fn=(char*)malloc(30*sizeof(char));
sprintf(fn,"D:\\hoge\\hogedat\\dat1.dat");
fp1=fopen(fn,"w");
for(i=0;i<10;i++)
{
fprintf(fp1,"write%d\n",i);
}
fclose(fp1);
free(fn);
return 0;
}
しかし、出力できませんでした。どのようにすべきか、ご教示願います
0127デフォルトの名無しさん
2006/08/23(水) 23:21:31デバッグは自分でやれ。
>>126
せめて、fopenのエラーチェック位入れれ。
0128デフォルトの名無しさん
2006/08/23(水) 23:54:590129デフォルトの名無しさん
2006/08/23(水) 23:55:41float
function (float x)
{
float result;
result = x;
return result;
}
を
↓
float* function(float *x)
{
float* result;
result = &exp(x);
return result;
}
で、ポインタ型の返り値にして逃げといて
関数daikei_integral ではfloat daikei_integral (float (*)(float), float, float, int);
がfloat* (*)(float),とかになって
中も改造してどうたらこうたら
関数ブロック{}抜けて値消えてるなと思ったらポインタ返しにしとけ!と脊髄反射
0130デフォルトの名無しさん
2006/08/24(木) 00:09:36レスありがとうございます
分かりました、明日朝一で試してみます!
>>127-128
プログラムとは無縁の世界で生きていたのですが、上司に「プログラムできるの?」と聞かれて、「コンニチワって表示させるぐらいなら出来ますよ^^」と答えたのが運の尽きでした
やったこともないのに、こんな仕事が回ってくるとは思いもしませんでした
0131デフォルトの名無しさん
2006/08/24(木) 00:19:34聞かれて、「コンニチワって表示させるぐらいなら出来ますよ^^」と答えたのが運の尽きでした
その状態ならはっきり言って、あれ改造するの結構しんどいかもなw
関数内に関数ポインタとかあるし
柴田本とか朝井本とか読んで頑張る時間があれば良いけど。
main関数内でもっとゴチャゴチャと積分計算する方針にするのはダメなのか?
0132デフォルトの名無しさん
2006/08/24(木) 00:33:15はい、朝一でやってみますとは言いましたが、はっきり言って地獄ですw
#include<math.h>を加えることぐらいはさすがに分かったので、それだけは既にしてあります
本読んで勉強する時間もありませんし、実は最終締め切りは金曜の午前中だそうです
現在、Cでやるのを諦めて自宅のPCのエクセルで何とかならないものか試している最中です
>main関数内でもっとゴチャゴチャと積分計算する方針にするのはダメなのか?
僕としては計算さえできれば、プログラムの文の美しさは求めていません
0133デフォルトの名無しさん
2006/08/24(木) 00:42:540134デフォルトの名無しさん
2006/08/24(木) 00:49:17ttp://pc8.2ch.net/test/read.cgi/tech/1151412015/205-305
軽く流し見したのですが、上記のところで質問していいのか分からなかったので聞きました
0135デフォルトの名無しさん
2006/08/24(木) 00:51:19美しさはともかく、「理解しやすさ」は保守管理に必要だぞ
3ヵ月後の自分は他人〜
0136デフォルトの名無しさん
2006/08/24(木) 01:03:56計算してみたのですが、結果がおかしいです。
これはコンパイラのバグでしょうか?
#include<limits.h>
#include<iostream>
using namespace std;
int main(){
long long int x,y;
x = 65536 * 65536;
y = 4294967296 * 65536;
cout << x << " "<< y << endl;
return 0;
}
実行結果:
0 281474976710656
コンパイラ:Microsoft Visual Studio 2005
OS:windows xp home
CPU:鱈セレ1.4GHz
メモリ:512MB
0137デフォルトの名無しさん
2006/08/24(木) 01:10:00y = 4294967296LL * 65536LL;
0138デフォルトの名無しさん
2006/08/24(木) 01:15:12ああ、出来ました。ありがとうございます。
お手数ですが、どうして私のプログラムでは
このような結果になったのか、教えていただけますか?
0139デフォルトの名無しさん
2006/08/24(木) 01:23:544294967296 * 65536; // 64bit ← 64bit * 32bit;
65536LL * 65536LL; // 64bit ← 64bit * 64bit;
4294967296LL * 65536LL; // 64bit ← 64bit * 64bit;
65536 * 65536LL; // 64bit ← 32bit * 64bit;
65536LL * 65536; // 64bit ← 64bit * 32bit;
4294967296 * 65536; // 64bit ← 64bit * 32bit;
0141デフォルトの名無しさん
2006/08/24(木) 01:42:110142デフォルトの名無しさん
2006/08/24(木) 03:24:08自己解決しました。自分の実際のプログラムでは
別のディレクトリだったのですが、パスの書き方を間違えていました。
ご迷惑をおかけしました。
0143デフォルトの名無しさん
2006/08/24(木) 03:31:55これ関数返り値をポインタにしなくても、そのままで動く
#include <stdio.h>
#include<math.h>
#define X_MIN 0.0/* 閾値の最小値 */
#define X_MAX 100.0/* 閾値の最大値 */
#define DIV_NUM 120/* 閾値の分割数 */
float function (float);
daikei_integral (float (*function) (float), float x_min, float x_max, int n);
int main (int argc, char **argv)
{
float result;/* 積分結果 */
fprintf (stdout, "x = [%f,%f] n = %d\n", X_MIN, X_MAX, DIV_NUM);
result = daikei_integral (function, X_MIN, X_MAX, DIV_NUM);
fprintf (stdout, "S = %f\n", result);
}
float function (float x)
{
return exp(x);
}
0144デフォルトの名無しさん
2006/08/24(木) 03:35:19float daikei_integral (float (*function) (float), float x_min, float x_max, int n)
{
float integral;/* 積分値 */
float h;/* 閾値をn個に分割したときの幅 */
float x;
int i;
h = (x_max - x_min) / n;
integral = ((function (x_min)) + (function (x_max))) / 2.0;
x = x_min;
for (i = 1; i <= n - 1; i++)
{
x += h;
integral += (function (x));
}
integral *= h;
return integral;
}
日刊工業新聞社「Visual C++による理工学問題の解法」に殆ど同じ問題あった。
このスレに戻ってくるかどうか知らんが念のため
(しかしウィンドウズ時代以降の初心者がint argc,char** argvタイプのmain関数を使いこなせるか)
0145デフォルトの名無しさん
2006/08/24(木) 08:10:52ありがとうございます!
今から仕事場いくんで、やってみます!
0146デフォルトの名無しさん
2006/08/24(木) 10:26:43柴田のポインタ極意でも100回写して変数あれこれ変えて
型変えてprintfで出力して見直して来い!
0147デフォルトの名無しさん
2006/08/24(木) 18:12:05void quick(int a[],int top,int end)
{
int lp=top;
int rp=end;
int tmp;
int axis=a[(top+end)/2];
do{
while(a[lp]<axis)lp++;
while(a[rp]>axis)rp--;
if(lp<=rp){tmp=a[lp];a[lp]=a[rp];a[rp]=tmp;
lp++;rp--;}
}while(lp<=rp);
if(rp>top)quick(a,top,rp);
if(lp<end)quick(a,lp,end);
}
このように書くとちゃんとソートできるのですが、
axis=a[(top+end)/2]の部分をaxis=(top+end)/2
として以下のように書くとちゃんとソートされません。
0148147
2006/08/24(木) 18:12:54void quick(int a[],int top,int end)
{
int lp=top;
int rp=end;
int tmp;
int axis=(top+end)/2;
do{
while(a[lp]<a[axis])lp++;
while(a[rp]>a[axis])rp--;
if(lp<=rp){tmp=a[lp];a[lp]=a[rp];a[rp]=tmp;
lp++;rp--;}
}while(lp<=rp);
if(rp>top)quick(a,top,rp);
if(lp<end)quick(a,lp,end);
}
勉強始めたばかりなので初心者な質問だと思いますが、
どなたか悪いところを教えてください。
0149デフォルトの名無しさん
2006/08/24(木) 18:21:390150麻布卒www
2006/08/24(木) 18:39:38なんでそんなもん作ろうとするの?勉強のため?
じゃ、おれもやってみようかなw
今日生協にアルゴの本買いにいったらよさそうなのが7600円もして死んだ。
アルゴはひとつの学問だからなー、面白いからいろいろ勉強してみたいや。数学とかパズル好きだし。
0151デフォルトの名無しさん
2006/08/24(木) 18:40:39あぁ、なるほど!
lpかrpが=axisの時にaxisの位置との交換になるからその位置の値が変わるんですね><
こんなのに気付かなかった自分の馬鹿さにガッカリでした・・・orz
0152デフォルトの名無しさん
2006/08/24(木) 20:51:18結局うまくプログラムを動かすことは出来ませんでした。
しかし、エクセルで同様の台形公式を用いた積分を考えることにより、指数関数が複雑に絡み合う式だったのですが、計算に成功し締め切りも守れました。
プログラムはうまくいきませんでしたがお世話になりました、ありがとうございました。
0153デフォルトの名無しさん
2006/08/24(木) 21:05:36また、何よりプログラムを書かないことはプログラミングの基本だ。
0154誰か助けて!
2006/08/25(金) 00:01:06ifstream f("test.dat", ios_base::binary | ios_base::in);
......
unsigned short n;
f >> n;
// f.read((char*) &n, 2);
こんなソースを書いて、 f >> n だとエラーになるのに、
コメントのように read 関数を使うと、ちゃんと読めるのです。
原因はなんでしょうか。よろしくお願いします。
0155デフォルトの名無しさん
2006/08/25(金) 00:15:170156デフォルトの名無しさん
2006/08/25(金) 01:07:45環境は VC++ 8.0 Express で、C ランタイムは MSVCR80.dll です。
OS は Windows XP SP2 と Windows Server 2003 で試しました。
http://www.kumei.ne.jp/c_lang/intro/no_13.htm を見て、次のプログラムを入力しました。
#include <stdio.h>
#include <time.h>
void main()
{
int i = 1;
time_t t1, t2;
time(&t1);
while(i <= 10000)
printf("%d,", i++);
time(&t2);
printf("\n");
printf("time1=%ld time2=%ld\n", t1, t2);
printf("time2=%ld time1=%ld\n", t2, t1);
printf("It takes %ld sec.\n", t2 - t1);
return;
}
(続く)
0157デフォルトの名無しさん
2006/08/25(金) 01:09:30結果は次のとおりです。
time1=1156435112 time2=0
time2=1156435116 time1=0
It takes 4 sec.
次のような結果を期待していました。
time1=1156435112 time2=1156435116// t2 が 0 でなく表示される。
time2=1156435116 time1=1156435112// t1 が 0 でなく表示される。
It takes 4 sec.
format に対する 2 番目の argument(printf の第 3 引数)に指定した値が表示されません。
何がよくないのでしょう?私が思いついたのは次の 2 つです。
a) printf の引数の指定の仕方が正しくない
b) MSVCR80.dll の printf に問題がある。
アドバイスいただけるとありがたいです。
0158デフォルトの名無しさん
2006/08/25(金) 01:17:17time_tの型がlongであると期待したのが敗因。
実際最近のVCではtime_tはlongではなくlong longになっている。
また、time_tは秒単位で実装されているはずなので、
高々10000回程度の標準出力で1秒掛かることを期待するのも問題あり。
0159デフォルトの名無しさん
2006/08/25(金) 01:24:16>>154は重複のほうで答えてもらったみたいだぞ
>>154
向こうで答えてもらったならちゃんとそう書けよ
0160デフォルトの名無しさん
2006/08/25(金) 02:22:22クヌース先生に喧嘩売ってんのか?
0161デフォルトの名無しさん
2006/08/25(金) 02:32:30変数は意味深でやたらに長い名前を付けている。恥ずかしくないのかと思う。
私のすすめはこれ。3文字変数。そしてフォント、Verdana。
この殺風景さが良い。よく思えば、これ以上に美しいソースは存在するのかと不思議に思う。
それを、わざわざ食事の時間や昼寝をする時間を削ってまで改悪するのは私には理解できない。
そこまでするなら、その時間を勉強や仕事などの有意義なことに消費すべきではないか。
そもそも、人間というのは時々つまらないことに時間を費やしてしまいがちな変わった唯一の動物である。
もし、それが長引いている場合は、人間性がよくよく変わってきていることなのであろう。
自分の考えが昔の自分と違ったり、やたらと意見に反対したりされたりするのは、まさにそれである。
しかし、それがある日突然問題を引き起こすかもしれない。
0162156
2006/08/25(金) 02:37:29ありがとうございます。次のように変更することで期待通りに動きました。
printf("time1=%lld time2=%lld\n", t1, t2);
printf("time2=%lld time1=%lld\n", t2, t1);
0163デフォルトの名無しさん
2006/08/25(金) 03:07:45変
私
こ
そ
そ
そ
も
自
し
0164デフォルトの名無しさん
2006/08/25(金) 03:27:26数
の
こ
エロいな!
0165デフォルトの名無しさん
2006/08/25(金) 04:16:11殺
し
0166デフォルトの名無しさん
2006/08/25(金) 04:47:19そして非互換コードをばら撒くと。
本質的な解決になってないことにご用心。
0167デフォルトの名無しさん
2006/08/25(金) 10:06:15そうだな
書かなければバグらないしな
0168デフォルトの名無しさん
2006/08/25(金) 10:15:22vc60
入力された日付又は時刻が存在しているのか確認する方法を教えてください
0169デフォルトの名無しさん
2006/08/25(金) 10:25:100170デフォルトの名無しさん
2006/08/25(金) 11:53:01(゚、 。 7 ハァ?
l、 ~ヽ
じしf_, )ノ
0171デフォルトの名無しさん
2006/08/25(金) 11:53:42マジ捻くれてるよなw
お前って馬鹿の典型例だなw
0172デフォルトの名無しさん
2006/08/25(金) 11:56:26お褒めに預かり光栄です
0173デフォルトの名無しさん
2006/08/25(金) 12:23:46日本語でおk
0174デフォルトの名無しさん
2006/08/25(金) 12:57:00そうか?俺は普通だと思った。
仕様にあいまいな部分があると気持ち悪いし。
0175デフォルトの名無しさん
2006/08/25(金) 13:18:49仕様は明確にしてもらわないと、あとでちょっと違いましたなんて言われると殴りたくなるからな。
0176デフォルトの名無しさん
2006/08/25(金) 13:29:060177デフォルトの名無しさん
2006/08/25(金) 14:46:15ttp://www.geocities.jp/ky_webid/algorithm/012.html
ここのソースにある
「void addlist(void)」部分で
● 構造体に新たなデータNoを追加して1件登録するごとに
Noを現在の最大値+1を割り振りたいです。
例:
最初に登録時、Noには1を割り当てる。その後登録する度に+1ずつ増加
● 途中のデータを削除しても、
常に今までつけた連番の最大値+1を割り振りたいです。
例:
No.1〜10まで登録されていてNo.5を削除した場合
次に登録されるNo.は11にしたい。
No.1〜10まで登録されていてNo.1〜10まで削除した後に
割り振られるNo.は11にしたい。
「void showlist(void)」の部分で
● データが登録されていない場合は「データ未登録」と表示。
● 登録したものを10件ずつ表示、
10件以上ある場合は「1」を押せば新たに10件ずつ表示
(表示されていた前のリストは画面から消して新たに10件を表示)
「9」を押せば前ページに戻るようにしたいです
ヒント・アドバイスでも構いませんのでよろしくお願いします。
0178デフォルトの名無しさん
2006/08/25(金) 14:52:55書いてあるとおり改造すればいいじゃん。
何が分からないのかが分からない。
0179品質保証屋
2006/08/25(金) 15:18:490181デフォルトの名無しさん
2006/08/25(金) 16:16:19なにをしてほしいのかわからんな
その仕様を満たすコードを書いてほしいのか?
0182京大生www
2006/08/25(金) 16:36:37誰かプログラムをかけませんか?
0183デフォルトの名無しさん
2006/08/25(金) 16:38:520184デフォルトの名無しさん
2006/08/25(金) 16:58:31サイン求めるのにラジアン値が必要なせいですげえ意味ないプログラムになった
#include <stdio.h>
#include <math.h>
#define MPI 3.14159265358979323846
main(){
double n_sin, area;
for(double i = 3.0; i < 1000.0; i++){
n_sin = sin(360.0 / i * MPI / 180.0);
area = n_sin * 1 * 1 * 1/2 * i;
printf("半径1の円に内接する正%f角形の面積は%f (sin:%f)\n", i, area, n_sin);
}
}
0186デフォルトの名無しさん
2006/08/25(金) 17:24:27ならスレ違い
0187京大生www
2006/08/25(金) 17:56:24お前ばかだろ、最初にパイを定義してどうすんだよ。
そのパイを求めたいんだよ。
0188デフォルトの名無しさん
2006/08/25(金) 18:09:23ラマヌジャンの式でも参照してろカス
0189デフォルトの名無しさん
2006/08/25(金) 18:19:47ret_type Foo(void);
は C/C++ で直接的に宣言できず?
ret_type ptr = Foo;
ptr = (*ptr)(); // 型的に 左辺 & 右辺 が等価となる
0190デフォルトの名無しさん
2006/08/25(金) 18:31:24自分自身のポインタを返す関数は宣言できないよ。
0191189
2006/08/25(金) 18:38:47void* 戻しで 呼び出し時キャスト か
struct foo { struct foo* (*func)(void); }; のような構造体経由でないと表現できない
ってことですね。
0192デフォルトの名無しさん
2006/08/25(金) 18:47:09Cでは保障されていない(C++は規格書真面目に読んだことないから知らん)
だから標準を遵守する気ならやめといたほうが良い。
関数ポインタから関数ポインタへの変換はありだから
typedef void(*void_fun)(void);
void_fun f(void){return (void_fun)f;}
ならC言語の仕様的にはあり。
0193189
2006/08/25(金) 18:52:50重ね重ね感謝
void* <-> 関数のポインタ のポータビリティ(?) は保証外だったのは知りませんでした。
標準枠内で書くか環境枠内で書くかは、それぞれあるので
今度真面目に規格書に目を通してみよう。
0194京大生www
2006/08/25(金) 19:15:29やってみる。
0195京大生www
2006/08/25(金) 22:05:460196デフォルトの名無しさん
2006/08/25(金) 22:58:13進行を一時ストップさせるのに
cin.sync();
cin.get();
を使うみたいなのですが、停止しません
これを使った例文をコピペしてみたのですが
それでもダメでした
環境が問題なのでしょうか?
環境はbcc32 windows xp
1.86Ghz 1Gです
0197デフォルトの名無しさん
2006/08/25(金) 23:55:080198デフォルトの名無しさん
2006/08/26(土) 00:11:08進行とか停止とかの意味がわからん。
ソースと、期待している動作の説明が必要。
0199196
2006/08/26(土) 00:18:15すみません、言葉足らずでした。
ttp://www.asahi-net.or.jp/~yf8k-kbys/newcpp9.html
ここを参考にやっているんですが、
プログラムの進行を一時ストップし、エンターキー(リターンキー)で進行を再開とならないのです。
ご教授お願いします。
0200デフォルトの名無しさん
2006/08/26(土) 01:13:14#include <iostream>
int main()
{
using std::cin; using std::cout;
do { cout << '*'; cin.sync(); cin.get(); } while(cin.good());
}
こんなんでテストできることだと思ってやってみたんだが、
cygwin g++ 3.4.4 では * が連続して数文字続くことがある。
VC2005EE ではどんだけ文字打っても * は1文字ずつしか出ない。
0202デフォルトの名無しさん
2006/08/26(土) 15:24:14ポインタか配列でどうにかならないか?
0203デフォルトの名無しさん
2006/08/26(土) 20:42:37引数の数を取得するような関数はないのでしょうか。
0204デフォルトの名無しさん
2006/08/26(土) 20:55:380205デフォルトの名無しさん
2006/08/26(土) 21:03:30無いのか(´・ω・`)
0206デフォルトの名無しさん
2006/08/26(土) 21:13:590207元気になれるデバッグ支援ソフト
2006/08/26(土) 21:31:330208デフォルトの名無しさん
2006/08/26(土) 21:34:00http://www.geocities.jp/bleis_tift/cpp/typesafeenum.html
の最下部の最終バージョンってやつ動くの?
0209デフォルトの名無しさん
2006/08/26(土) 21:34:05stream_bufをカスタマイズするとか
http://homepage2.nifty.com/well/Stream.html
ツールもあるよ
http://www.vector.co.jp/vpack/filearea/win/prog/debug/
0210209
2006/08/26(土) 21:36:250211デフォルトの名無しさん
2006/08/26(土) 22:05:280212208
2006/08/26(土) 22:29:03そこをコメントアウトしてもリンクでこける。
例えば
undefined reference to `Suit::clubs'
とか。
0213デフォルトの名無しさん
2006/08/26(土) 22:35:55じゃ、動かないんじゃね?
0214208
2006/08/26(土) 22:36:53なれるの?ポインタで扱うならわかるけど。
それとLiteralがSuitをprivate継承してるけどLiteralはSuitのメンバ。
ひよこが先か卵が先か。
0215デフォルトの名無しさん
2006/08/26(土) 22:46:49クラスの static データメンバの宣言では型が不完全型でもいい。
0216デフォルトの名無しさん
2006/08/26(土) 22:57:31完全なソースコードがダウンロード出来ないから勘で答えるけど
その部分はエラーテストコードじゃないのか?
0217208
2006/08/26(土) 23:04:41newできないようにoperator newをprivateにしている。
0218デフォルトの名無しさん
2006/08/26(土) 23:10:00エラーが出てるんなら直せばいいんじゃないのか?
0219デフォルトの名無しさん
2006/08/26(土) 23:11:19スレタイ嫁
0220208
2006/08/26(土) 23:23:29この場合Literalの定義の後にしないと駄目だ。
0221デフォルトの名無しさん
2006/08/26(土) 23:28:57undefine reference のほうは、それだろうな。
operator new のほうはどんなエラーが出るのさ?
0222208
2006/08/26(土) 23:33:57変数の宣言なんてしてねえっつーのw
0223デフォルトの名無しさん
2006/08/26(土) 23:39:41size_t が見えてないんじゃないかな?
#include <cstddef> の追加で通る?
0224208
2006/08/26(土) 23:47:16確か適切なヘッダーをincludeする必要があった。
ちなみにnewでもOKですね。当然ですけど。
0225208
2006/08/26(土) 23:56:51const Suit::Literal<Suit::CLUBS> Suit::clubs;
const Suit::Literal<Suit::DIAMONDS> Suit::diamonds;
const Suit::Literal<Suit::HEARTS> Suit::hearts;
const Suit::Literal<Suit::SPADES> Suit::spades;
追加すればOKでした。
0226デフォルトの名無しさん
2006/08/27(日) 03:16:48300%と表示したい場合%がエスケープシーケンスになって壊れる。
どうしたらいいんでしょうか?
\x25とかやれば表示できるんですかね?
0227デフォルトの名無しさん
2006/08/27(日) 03:19:590228デフォルトの名無しさん
2006/08/27(日) 03:24:150229京大生www
2006/08/28(月) 20:16:23http://www.uploda.org/uporg496204.cpp.html
うpしました。
これからどうやって円周率を求めるかはあとでお見せします。
芸術的な方法だと自分では思っています。
0230デフォルトの名無しさん
2006/08/28(月) 20:36:17ttp://www.kyoto-su.ac.jp/~yamada/ap/qsort.html
>標準ライブラリ関数 qsort は, stdlib.h の中で次のように宣言されており,
0231デフォルトの名無しさん
2006/08/28(月) 20:42:460232デフォルトの名無しさん
2006/08/28(月) 20:48:59そこじゃ無くてcompareの返り値じゃね?
0233デフォルトの名無しさん
2006/08/28(月) 20:50:450234京大生www
2006/08/28(月) 20:57:19ようするに.xの成分で並び替えたいんです。
原因を追求してもらえませんか?
0235デフォルトの名無しさん
2006/08/28(月) 21:01:520236デフォルトの名無しさん
2006/08/28(月) 21:02:54return (p1->x - p2->x) ? (p1->x < p2->x) ? -1 : 1 : 0;
doubleがintに変換される際に小数点以下が切り捨てられてしまってるぞ。
0237デフォルトの名無しさん
2006/08/28(月) 21:08:070238デフォルトの名無しさん
2006/08/28(月) 21:10:44直しただけで。
0239京大生www
2006/08/28(月) 21:37:21意味がわかりません。
ちゃんと書いてください。
0240デフォルトの名無しさん
2006/08/28(月) 21:39:03if (p1->x < p2->x)
return -1;
else if (p1->x > p2->x)
return 1;
else
return 0;
と等価です。
0241デフォルトの名無しさん
2006/08/28(月) 21:48:410242京大生www
2006/08/28(月) 21:50:55おkwwwwwwww
あとはー、どうやってパイ計算するか分かるか。
いや、おれにも出来るかどうかの確信はないのだがな。
0243デフォルトの名無しさん
2006/08/28(月) 21:54:21昔の数学者が初めて円周率を求めたのと同じ方法だ。
0244デフォルトの名無しさん
2006/08/28(月) 22:17:020245デフォルトの名無しさん
2006/08/28(月) 22:32:21きっと京都学園大生かと。
0246京大生www
2006/08/28(月) 22:50:46まぁそういうことなんだけど、ただどうしておれがこんなややこしい変数のとり方をしているのかが分からないかな。
いや、ただしいという確証はないんだよ、でもおれのカンが正しければきっとsampleをあげれば正しいパイに収束するはずなんだ。
違うかな、なんとなくのカンなんだけど。
片方だけの取り方だと分布が一定じゃないんだけど、両方から攻めると分布が一定じゃないにしろ対称になる。(もちろん無限個とれば完全対称)
基本的には角度をとってやりたいんだけどパイが入るから出来ない。(求めるパイを使ってやるから)
なので無理やりにでも角度の分布とこの場合に同じ条件のものを作ろうと考えた結果、逆の分布を足して非対称を対称にしたらどうかと考えた。
ちょっとやってみるかな・・・出来なかったらちょっと頭が悪かったってことでw
0247デフォルトの名無しさん
2006/08/28(月) 23:01:210248デフォルトの名無しさん
2006/08/28(月) 23:06:20テーラー展開すれば多倍長演算だけでできるぞ。
0249京大生www
2006/08/28(月) 23:13:350250デフォルトの名無しさん
2006/08/28(月) 23:15:15秋刀魚食え。頭が良くなるぞ。
0251デフォルトの名無しさん
2006/08/28(月) 23:26:30汎用レジスタ(ER0)の値をプログラムで判定したいのですが、
アセンブラ内でしかER0をいじれません。
C上で動かすにはどうしたらいいのでしょうか?
環境はHEW、CPUはH8Sです。お願いします。
0252京大生www
2006/08/28(月) 23:29:13キタ━━━━━━(゜∀゜)━━━━━━!!!!
やべ・・・・・天才。
今から論文かこ、超画期的なアイデアだ・・・・
ちなみに
3.14159
までちゃんとでた。
0253デフォルトの名無しさん
2006/08/28(月) 23:33:54EROはマン・コマンド といってみるレイヤー
0254デフォルトの名無しさん
2006/08/28(月) 23:38:03コンパイラのマニュアル嫁。
0255デフォルトの名無しさん
2006/08/29(火) 00:08:55http://pc8.2ch.net/test/read.cgi/tech/1125994426/919
???
0256デフォルトの名無しさん
2006/08/29(火) 01:19:56スレ違い。
↓こちらへどうぞ。
ttp://c-au.2ch.net/test/-/tech/1148297648/i
0257デフォルトの名無しさん
2006/08/29(火) 08:11:31ER0はCの関数の帰り値
つまり、C上で使えないどころか、その関数を呼んで
やりたい判定とやらをやればいいのであって
0258デフォルトの名無しさん
2006/08/29(火) 09:06:07コンパイラのマニュアル
(M8S2378なら
ttp://japan.renesas.com/fmwk.jsp?cnt=h8s2378_h8s2378r_root.jsp&fp=/products/mpumcu/h8s_family/h8s2300_series/h8s2378_h8s2378r_group/
のドキュメント内
「H8S H8/300シリーズ C/C++コンパイラパッケージ V.6.01 ユーザーズマニュアル」)
の「9.3C/C++プログラムとアセンブリプログラムとの結合」
...と書いても仕方がない気がした。
0259デフォルトの名無しさん
2006/08/29(火) 18:05:390260デフォルトの名無しさん
2006/08/29(火) 18:37:06標準には無い。環境を特定して移植性を無視すれば、なんとかなるかもしれない。
0261デフォルトの名無しさん
2006/08/30(水) 03:13:390262京大生www
2006/08/30(水) 13:19:49#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#define max 300
int main (void) {
int i;
int sum = 1;
for (i=1; i<max; i++) {
sum = sum * i;
}
cout << sum << endl;
return 0;
}
なぜ答えが0になる?
教えてくれよ
0263デフォルトの名無しさん
2006/08/30(水) 13:22:17途中でsumがオーバーフローして結果がおかしくなってる。
intの代わりにdouble使ってみろよ。
0264デフォルトの名無しさん
2006/08/30(水) 13:24:02long double(80ビット)を使ってようやく
1.02019e+612
という答えを得た。
0265デフォルトの名無しさん
2006/08/30(水) 13:27:241*2*3*4*5*6*7*...*300
という計算をする途中 6=2*3 4*2*2 8=2*2*2
と2倍が1つある毎に下の桁が0に固定されてゆく
だからこの計算の結果は0になるわけだ
0266デフォルトの名無しさん
2006/08/30(水) 13:31:030267デフォルトの名無しさん
2006/08/30(水) 13:32:25そろそろ恥ずかしくなってきたんじゃないか?
0268京大生www
2006/08/30(水) 13:42:55100だと一瞬で終わったがまぁ、元にかけるものも増えるから演算にかかる時間が爆発的に上がるんだろう。
足し算だと速い。
つまり足し算と掛け算の入り組む計算ではなるべく掛け算を減らした方が一般的に演算速度が早くなるということがいえる。
でおk?
0269デフォルトの名無しさん
2006/08/30(水) 13:43:400270京大生www
2006/08/30(水) 13:44:440271デフォルトの名無しさん
2006/08/30(水) 13:47:22long doubleで300!を求めても一瞬だぞ。それともオーバーフローに
何らかの処理をする処理系なのか。
0272京大生www
2006/08/30(水) 13:50:521,3Ghzあるし、メモリも512MB、何か問題があるのか。
300までの掛け算は諦めた、これ答えでねーよ。永遠の謎ってことでおk?
0273デフォルトの名無しさん
2006/08/30(水) 13:51:37それ以上の時間差があったように見受けられるが、
オーバーフロー発生するごとにペナルティかかっているのか?
0274京大生www
2006/08/30(水) 13:51:400275デフォルトの名無しさん
2006/08/30(水) 13:52:590276京大生www
2006/08/30(水) 13:53:08なんで3倍なんだよ。もっとかかるだろ。
元の桁数が爆発的に増えすぎる。
0277デフォルトの名無しさん
2006/08/30(水) 13:53:17処理系による。規格ではsizeof(double)==sizeof(long double)でも
一向に構わない。
俺はBCC使ってるから。VCだと同じ。
gccだとなぜかsizeof(long double) == 10になる。
0278デフォルトの名無しさん
2006/08/30(水) 13:53:48あのう・・・・浮動小数点ってご存じですか?
0279麻布卒www
2006/08/30(水) 13:53:48これもある
0280デフォルトの名無しさん
2006/08/30(水) 13:54:15固定小数点演算してるのか? どういう処理系だよそれ
0281デフォルトの名無しさん
2006/08/30(水) 13:58:19きちんと1の位まで求められる。
0282京大生www
2006/08/30(水) 14:08:05#include <math.h>
#include <windows.h>
#define max 6
int main (void) {
int i;
double ans[max];
DWORD start, end;
start = timeGetTime();
for(i=1;i<=max;i++) {
ans[i] = pow(2, i*100)* pow(2, i*100);
}
end = timeGetTime();
for(i=1; i<=max; i++) {
cout << ans[i]<<endl;
}
cout << start-end << endl;
return 0;
}
0283京大生www
2006/08/30(水) 14:09:200284デフォルトの名無しさん
2006/08/30(水) 14:09:43問題を無理矢理解釈しようとすることが多すぎだ。
前提知識が圧倒的に足りない。人に聞く前に勉強した方が早いと思う。
0285京大生www
2006/08/30(水) 14:10:460286デフォルトの名無しさん
2006/08/30(水) 14:13:28#include <iostream.h>
#include <math.h>
#include <windows.h>
#define max 6
int main (void) {
int i;
long double ans[max+1];
DWORD start, end;
start = timeGetTime();
for(i=1;i<=max;i++) {
ans[i] = powl(2, i*100) * powl(2, i*100);
}
end = timeGetTime();
for(i=1; i<=max; i++) {
cout << ans[i]<<endl;
}
cout << end-start << endl;
return 0;
}
0287デフォルトの名無しさん
2006/08/30(水) 14:14:112.58225e+120
4.14952e+180
6.66801e+240
1.07151e+301
1.72185e+361
0
結果はこう。
0288デフォルトの名無しさん
2006/08/30(水) 14:20:08#include "stdafx.h"
#include <iostream>
#include <limits>
int main()
{
std::cout << std::numeric_limits<double>::max() << std::endl;
}
を実行すると
1.79769e+308
なので、そのままでは途中でオーバーフローを起こすのが目に見えている。
0289デフォルトの名無しさん
2006/08/30(水) 14:20:590290京大生www
2006/08/30(水) 14:31:26おれはプログラムが止まった。
途中まではもちろん0
仕様?
今BCCのコンパイラ使ってるんだけど、これから
C++ builderを買うのと
VCの新しいやつ買うのとどっちがオススメ?なんかBorland悪名高いんだけど。
0291デフォルトの名無しさん
2006/08/30(水) 14:34:48用途によるだろ。BDSは仕事にも勉強にも向かない。どちらかと言うと
趣味用。
VC8は仕事にも勉強にも多用されるし、参考書も参考サイトもいっぱいある。
途中で止まるのは、オーバーフローを起こした結果トラップでもかかったから。
そういう場合は、DBL_MAX以上の小数を扱えるクラスを作るしかない。
0292デフォルトの名無しさん
2006/08/30(水) 14:35:000293京大生www
2006/08/30(水) 14:36:340294デフォルトの名無しさん
2006/08/30(水) 14:43:26Borland Developer Studio 2006 No.07
http://pc8.2ch.net/test/read.cgi/tech/1154069526/
Turbo Free版をDLすれば、C++Builderのサブセットのような事もできる。
おまけとしてBCCの最新版も付いている。
0295デフォルトの名無しさん
2006/08/30(水) 14:44:450296デフォルトの名無しさん
2006/08/30(水) 15:00:170297デフォルトの名無しさん
2006/08/30(水) 15:01:060298デフォルトの名無しさん
2006/08/30(水) 15:06:570299デフォルトの名無しさん
2006/08/30(水) 15:11:19何か親近感でも持っちゃってるの?
0300デフォルトの名無しさん
2006/08/30(水) 16:28:540301デフォルトの名無しさん
2006/08/30(水) 16:31:080302デフォルトの名無しさん
2006/08/30(水) 16:35:020303デフォルトの名無しさん
2006/08/30(水) 17:00:43親切なレスをしてしまうのではないだろうか。
京大生wwwくんの中身予想
勉強がけっこうできる中学生か高校生。日本史苦手。
容姿普通。モテるほうではない。
特別な苦労をせずにいままで勉強ができていたのに、プログラミングで詰まっている。
将来京大に入りたいと思っていて、入れるくらいの成績もいまのところ取っている。
クラスでは頭がよくて嫌味なやつ、と思われているが、仲の良い友達はいる。
犬にかまれたのがトラウマ。動物全般が嫌い。
親にはついつい憎まれ口をたたいてしまう。
年の離れた兄とは仲がいい。妹をよくからかっている。
0304デフォルトの名無しさん
2006/08/30(水) 17:11:13以下のやり方でいいでしょうか。
int main(void)
{
enum {x = 20, y = 10};
char **strs = new char *[y, x];
int i;
for(i = 0; i < y; i++){
delete[] strs[i];}
delete[] strs;
return 0;
}
0305デフォルトの名無しさん
2006/08/30(水) 17:19:440306304
2006/08/30(水) 17:33:32Cでは、以下のようにできたんですが、
c++は直前に型の名前自体を付けないといけないので、
MallocTwoInt、MallocTwoCharとか
型の種類分作らないといけなくなるので、
変なやり方を試していました。
void **MallocTwo(size_t size, int X, int Y)
{
int y;
void **data;
if((data = malloc(sizeof(void *) * Y)) == NULL)
return NULL;
for(y=0; y<Y; y++)
if((data[y] = malloc(size * X)) == NULL)
{
FreeTwoTwo(data);
return NULL;
}
return data;
}
0307デフォルトの名無しさん
2006/08/30(水) 17:37:09C言語なら俺に聞けの入門編スレにも行きなさい。
0308304
2006/08/30(水) 17:37:27{
int y;
int **data;
data = new int *[Y];
for(y=0; y<Y; y++)
data[y] = new int[X];
return data;
}
char **NewTwoChar(int X, int Y)
{
int y;
char **data;
data = new char *[Y];
for(y=0; y<Y; y++)
data[y] = new char[X];
return data;
}
0309デフォルトの名無しさん
2006/08/30(水) 17:37:54C/C++ ではあなたの意図とはまったく違う。
0310304
2006/08/30(水) 17:42:26ずっと、これでやっていました。
講座にも書いてありますし。
ttp://www.clip.gr.jp/~imai/PukiImaiWiki/index.php?C%2B%2B%2F%C2%BF%BC%A1%B8%B5%C7%DB%CE%F3%A4%CE%C6%B0%C5%AA%BA%EE%C0%AE
0311デフォルトの名無しさん
2006/08/30(水) 17:46:25ちゃんとすみっこまで数字が格納できるか試してないでしょう。
0312デフォルトの名無しさん
2006/08/30(水) 17:49:36CとC++ どちらからはじめたほうがいいですか?
0313304
2006/08/30(水) 17:52:28>>306>>308のやり方の方ではないのですね。
>>304のは、始めはうまく起動されたのですが、
何度かやると、強制終了されてうまくいかなくなっていました。
0314デフォルトの名無しさん
2006/08/30(水) 18:06:56どんな入門書にも書いてある「文法」を学べよ。
0315京大生www
2006/08/30(水) 18:11:11この前円周率の出し方をプログラムしたけど下10桁くらいでズレた。
たぶん精度の問題だと思うし、doubleとかintとかの違いを勉強してる。
あと演算速度とか、最適化っていうのかな。
基本的に頭はいいです。分かってるだろうけど。
教えてもらえば理解はするし、頼むからいろいろ教えてくれ。
BDSはわかった。
IDEという言葉は知ってたが、borland C++ builderという呼び名しか知らなかったし。
おれが言ったふたつのソフトの差は何?
どっちが優れてるんだ、ソフトを作るにはどっちがいいんだ。
borlandは倒産したんじゃねーの?
0316デフォルトの名無しさん
2006/08/30(水) 18:30:21すまんが後半読んだだけで頭悪いこと丸わかりだから。
0317京大生www
2006/08/30(水) 18:34:100318デフォルトの名無しさん
2006/08/30(水) 18:41:03自分で学ぶことの大切さを学ばなかったのかい?
そのへんが京大ぽくない。あくまでイメージだけど。
0319デフォルトの名無しさん
2006/08/30(水) 18:43:24# サンプルが極少数と限られているので一般化するのは危ないが。
0320デフォルトの名無しさん
2006/08/30(水) 18:45:120321デフォルトの名無しさん
2006/08/30(水) 18:49:020322京大生www
2006/08/30(水) 18:52:50でも単位はとれます、なぜなら図書館で勉強するからです。
プログラムは授業ではやりましたが、足りません。だから自分でももっと深く踏み込んでいます。
これを自学自習といい、これこそが京大の掲げる教育理念であります。
だが、しかしプログラムは調べても分からないことが多すぎる。
なのであなた方に直接、ソースを見てミスを直してもらうという道をとっているだけ。
いってみれば2ちゃんはテキスト。
聞けば答えてくれるテキスト。
だけどあなた方から問題を出されたりすることはないでしょう。だからこれは自学自習です。
0323デフォルトの名無しさん
2006/08/30(水) 19:04:550324京大生www
2006/08/30(水) 19:11:020325デフォルトの名無しさん
2006/08/30(水) 19:16:45よくわからないならとりあえずVisual Studio買っておけ
学生なら安いだろ
0326京大生www
2006/08/30(水) 19:19:05それぞれに長所短所をまとめてくれ。
0327デフォルトの名無しさん
2006/08/30(水) 19:30:11自分で長所短所を調べられないようなやつは
とりあえずVisual Studio買っておけ
0328デフォルトの名無しさん
2006/08/30(水) 19:42:35a.cppとb.cppに
#ifndef _TMP_H_
#define _TMP_H_
extern int tmp_for_save;
#else
int tmp_for_save;
#endif
と書くと
error LNK2001: 外部シンボル ""int tmp_for_save" (?tmp_for_save@@3HA)" は未解決です。
というエラーがでます。
また両方のcppに
#ifndef _TMP_H_
#define _TMP_H_
int tmp_for_save;
#else
extern int tmp_for_save;
#endif
とextern宣言を入れ替えると
error LNK2005: "int tmp_for_save" (?tmp_for_save@@3HA) は既に定義されています。
と怒られます。
#define _TMP_H_ が効いていない様なのですが、
どうすればビルド出来るでしょうか。
環境はVC.net2003です。
よろしくお願いいたします。
0329麻布卒www
2006/08/30(水) 19:47:13とりあえずVisualを買うと、現在の環境(borland complierとbcpad)から何が変わるか教えてくれ。
IDEを買うとGUIのソフト作るの楽て聞いたけど、じゃあなぜVisualが売れるんだ、これでもソフトが作れるのか?
0330デフォルトの名無しさん
2006/08/30(水) 20:07:26冷静に考えたら自分でデバッグとかしそうにないよね・・・
0331デフォルトの名無しさん
2006/08/30(水) 20:08:35とりあえずIDEという言葉について少し用語集で検索して来い。
0332デフォルトの名無しさん
2006/08/30(水) 20:08:47何のために
#ifndef _TMP_H_
#define _TMP_H_
をしているのか、よーく考えてみなさい。
0333デフォルトの名無しさん
2006/08/30(水) 20:08:480334デフォルトの名無しさん
2006/08/30(水) 20:13:130335京大生www
2006/08/30(水) 20:17:08デバックが楽になるってどういうことー?
0336デフォルトの名無しさん
2006/08/30(水) 20:18:050337デフォルトの名無しさん
2006/08/30(水) 20:44:01現在、C++(a.cpp)のソースの中で、C(b.c)のソースの関数を呼び出そうとしています。
Cのソースはgccのみでコンパイル可能です(g++では不可)
又、C++のソースはg++でコンパイル可能でした。
そのため、
g++ a.cpp b.c
でコンパイルしようとすると、大量のエラーが発生してしまいます。
cのソースをc++に移植しようとしたのですが、ソースコードが大量で移植しきれません。
又、gccでb.cをコンパイルして、a.cppの中で、b.cのオブジェクトファイル
を呼び出せば良いのですが、リソースの問題上、裏でシェルを走らせる
事は出来ない状態です。
この解決法として、b.cのdllを生成し、a.cpp内からb.cの関数を呼び出すと言った
方法が適切なのでしょうか?
0338デフォルトの名無しさん
2006/08/30(水) 20:46:06g++ -c a.cpp -o a.o
gcc -c b.c -o b.o
g++ a.o b.o -o a.exe
0339デフォルトの名無しさん
2006/08/30(水) 20:46:300340デフォルトの名無しさん
2006/08/30(水) 20:46:43extern "C"を忘れずにね!
0341東大生www
2006/08/30(水) 20:55:01gcc -c b.c
g++ b.o a.cpp
b.cの関数の宣言を下記のようにextern "C" { }で囲むこと。
#ifdef __cplusplus
extern "C" {
#endif
// 関数宣言
void TestFunc();
#ifdef __cplusplus
}
#endif
0342デフォルトの名無しさん
2006/08/30(水) 21:01:57やってみます!
0343デフォルトの名無しさん
2006/08/30(水) 21:03:12(完全アッパーコンパチではないから場合によっては無理だけど。)
0344京大生www
2006/08/30(水) 21:05:140345デフォルトの名無しさん
2006/08/30(水) 21:06:06いつまでマジレスしてんだか・・
0346デフォルトの名無しさん
2006/08/30(水) 22:13:52皆さんアドバイスありがとうございました。
>>341さんの方法でやってみたところ、コンパイルすることが出来ました。
簡易化のためにcのソースが一つの場合で質問しましたが、実際には
一つのcの関数を呼ぶために、20個くらいの.cファイルを用いていたので、
gcc -c a1.c a2.c a3.c ...
としてそれぞれのオブジェクトファイルを生成して、
g++ -o b.o b.c a1.o a2.o a3.o ...
という感じになりました。
本当に助かりました。有難う御座いました。
0347デフォルトの名無しさん
2006/08/30(水) 22:29:510348デフォルトの名無しさん
2006/08/30(水) 22:34:20makefileを書くと負けだと思っている
0349デフォルトの名無しさん
2006/08/30(水) 23:02:460350デフォルトの名無しさん
2006/08/30(水) 23:43:160351デフォルトの名無しさん
2006/08/31(木) 10:29:14きょん・でじゅん?
0352デフォルトの名無しさん
2006/08/31(木) 10:32:12×京都大学
○京城帝国大学(現ソウル大学)
0353デフォルトの名無しさん
2006/08/31(木) 10:42:490354京大生www
2006/08/31(木) 10:56:350355デフォルトの名無しさん
2006/08/31(木) 15:53:24win98でも動くようにと思いながら作ってて試してみたら正常に動かなかったので、環境依存の問題として質問させてください。
値が変になったクラスは、APIとかmfcとか使ってなく、純粋な演算系のクラスなんですが、
__int64の演算と、__int64の変数をBYTEにキャストして1バイトずつ処理しているところがあります。
1.win98では、__int64は使えないのでしょうか。
2.int変数や、使えるなら__int64変数に確保される領域は、win98も32bitxpも同じと思って間違いないでしょうか。
3.int内のBYTEコードが逆順に並んでいるとかはwin98(dos/v intel)でも同じと思って間違いないでしょうか。
新着レス 2006/08/31(木) 15:42
>>109 名前: デフォルトの名無しさん [sage] 投稿日: 2006/08/31(木) 15:27:21
1,OS依存ではなくコンパイラ依存
2.コンパイラによる
3.エンディアンはCPU依存
そしてここは重複スレだ
すみませんでした。
そうですよね、なんで値があわないんだろう。
0356デフォルトの名無しさん
2006/08/31(木) 15:58:22なにをどうしたいんだ、おまいさんは?
0357355
2006/08/31(木) 16:25:52>>356
重複すれだと言われたので、移動して、最後に返答しました。
「すみませんでした。
そうですよね、なんで値があわないんだろう。」
が最後の返答でした。
0358355
2006/08/31(木) 16:37:082.コンパイラによる
というのは、コンパイラによってはOS依存になりえるということでしょうか。
32bit整数はos依存とかいう記載もいくつかあったもので・・・・・
0359337
2006/08/31(木) 21:34:13c++のソースの中で他のファイル(c言語)の関数を実行するプログラムを書いています。
System関数を用いて、cのオブジェクトファイルを実行すると何度でも問題なく動くのですが、
c++のソース内から直接cの関数を呼び出そうとすると、1度目は成功するのですが、2度目からSegmentationFaultに
なってしまう現象が発生してしまいます。(cの関数内では、システム情報を
取得し、ファイルに書き出す処理をしています。)
System関数で呼び出す方法と、直接呼び出す方法では何か大きな違いがあるのでしょうか?
cの関数内でfreeを行っているのでメモリの問題は無いと思っているのですが...
0360デフォルトの名無しさん
2006/08/31(木) 21:56:50Cのソースが一度の呼び出ししか想定していない、とか。
static変数の初期値に依存していたりしないか?
0361デフォルトの名無しさん
2006/09/01(金) 01:46:47x86系のWin98とXPなら、そのへんは環境による差はないよ。
本当に同じプログラムを実行しているのか確認せよ。
これ以上は、実際のコードを出さないとアドバイスは得られないと思う。
0362デフォルトの名無しさん
2006/09/01(金) 01:49:490363デフォルトの名無しさん
2006/09/01(金) 02:09:34それは、起動できないか落ちるのでは?
0364デフォルトの名無しさん
2006/09/01(金) 04:16:42>System関数で呼び出す方法と、直接呼び出す方法では何か大きな違い
ありすぎですわ。
多分>>360の指摘するとおり。
0365355
2006/09/01(金) 10:02:50関係ないところでミスしてました。
お騒がせして申し訳ありませんでした。
API使ってないと云ってましたが、ユーザ名とコンピュータ名の呼び出ししてて、
コンピュータ名の呼び出しで、第2引数のバッファの大きさの値が、ユーザ名の呼び出しの
ときに小さい値に変えられてて、それを直すの忘れてたからでした。
win98のPCのユーザ名がコンピュータ名より短くなっててコンピュータ名が取れて無かった
せいでした。
本当にごめんなさい。
0366デフォルトの名無しさん
2006/09/01(金) 19:20:03お薦めな入門書とかあったら教えていただけないでしょうか?
0367京大生www
2006/09/01(金) 19:22:260368デフォルトの名無しさん
2006/09/01(金) 22:39:59最近はアセンブラの良い本が出てるらしいな
それを読め
C言語の入門書で正確にマシンアーキテクチャの概念を
定義している本はないので読んでも無駄
メモリやアドレスの定義がないので絶対わからん
0369デフォルトの名無しさん
2006/09/01(金) 22:50:34実際のメモリがどうなってるか知らなければ、そりゃポインタわからないよな。
何かすごい納得した。今日はいい日だった。
0370デフォルトの名無しさん
2006/09/01(金) 23:32:01OOPの本を読んで、基底クラスの属性を、派生クラスは
継承するもんだと思ってたのですが、
実際にコードを打ってみた所、理解できない現象が起きて困っています。
class Base{
private:
int iMember;
};
class Derived:public Base{
public:
Derived(int aInput)
{
iMember = aInput;
}
void show_iMember()
{
cout << iMember << endl;
}
};
int main(){
Derived obj;
obj.show_iMember();
}
0371デフォルトの名無しさん
2006/09/01(金) 23:32:32publicで継承した場合、派生クラスは基底クラスのprivateメンバ変数と同じ変数を自分で持っているんじゃないんでしょうか?
このプログラムだとエラーが起きて、Base::iMemberの宣言を確かめろ、みたいに言われてしまいます。
protectedに指定すれば、privateでもちゃんと継承しますよね。
protectedに指定するしかないんでしょうか。
0372デフォルトの名無しさん
2006/09/01(金) 23:33:56private宣言のプロパティは子クラスからは参照できない
0373デフォルトの名無しさん
2006/09/01(金) 23:49:56ありがとうございます。ちょっと理解できました。
すみません、少し違う質問をしたいのですがいいですか?
派生クラスのオブジェクトを生成すると、自動的に基底クラスも生成されるんですよね?
0374京大生www
2006/09/01(金) 23:50:49::publicではなかったか。
0375デフォルトの名無しさん
2006/09/01(金) 23:54:54派生クラスのオブジェクトの中に基底クラス部分が含まれるという
意味なら合っている。
0376デフォルトの名無しさん
2006/09/01(金) 23:56:32それはソースのどの部分のことを言っているんですか?
スコープ演算子は継承と直接的にはあまり関係ないような気がするのですが・・・。
0377デフォルトの名無しさん
2006/09/01(金) 23:58:04スルーしる
0378デフォルトの名無しさん
2006/09/02(土) 00:08:35ありがとうございます。最後の質問をさせてください><
派生クラスのオブジェクトを作った際に、基底クラスのpublic宣言したメソッドを利用して
基底クラスのprivate変数にアクセスすることはできないのでしょうか。
派生クラスの部分として基底クラスも生成されているのだとしたら、
できそうな気がするのですが・・・。
>>377
了解しました。
0379デフォルトの名無しさん
2006/09/02(土) 00:09:58それはやってみれば分かるんじゃないか?
書くのがそんなに難しいコードになるとは思えんが。
0380デフォルトの名無しさん
2006/09/02(土) 00:12:22すみません、一応書いて実行したらエラーが出た所まではやってみました。
ただこれをどう理解すればいいかで、ちょっと解らなくて聞いてしまいました^^;
0381デフォルトの名無しさん
2006/09/02(土) 00:17:200382デフォルトの名無しさん
2006/09/02(土) 00:22:240383デフォルトの名無しさん
2006/09/02(土) 00:22:55コード載せてみろ。
0384デフォルトの名無しさん
2006/09/02(土) 00:24:26Bjarne Stroustrupのギャグには大爆笑する。
0385デフォルトの名無しさん
2006/09/02(土) 00:26:19禿げた頭は残さずなでる。
0386デフォルトの名無しさん
2006/09/02(土) 00:27:48読んどけ
ttp://www.ogis-ri.co.jp/otc/hiroba/technical/CppForJava/1/index.html
0387デフォルトの名無しさん
2006/09/02(土) 00:32:32・実行時ロードでクラスをDLLに含む事は可能でしょうか?
・A.dllを作成した時、A.dll内に本体(仮にB.exeとする)の関数(B.exe内のHoge()とか)を呼び出す事は可能でしょうか?
0388デフォルトの名無しさん
2006/09/02(土) 00:38:33「クラスをDLLに含む」の意味がわからん。
B.exe から Hoge() がエクスポートされていれば呼び出すことは可能なはず。
0389デフォルトの名無しさん
2006/09/02(土) 00:43:34前者は無理だ。
オブジェクトを作って返す関数を公開するなどの間接的な手段を取る必要がある。
後者は388の言うとおりだが、EXEからDLLへ関数へのポインタを引き渡すのが一般的だと思う。
0390387
2006/09/02(土) 00:44:43ありがとうございます、「・実行時ロードでクラスをDLLに含む事は可能でしょうか?」は
DLL内に関数のようにクラスが記述できるかということです。DLLはクラス非対応と聞いたのですが、
とはいえクラスだけの為にCOMを使うのも………どうにか使う手段があるのでしょうか、といった感じです。
0391デフォルトの名無しさん
2006/09/02(土) 00:50:42言語的な保証は無いがCOMも同じ様な仕組みだし、注意深くやれば大丈夫だと思う。
0392デフォルトの名無しさん
2006/09/02(土) 00:52:05http://msdn.microsoft.com/library/ja/vccore/html/_core_export_from_a_dll_using___declspec.28.dllexport.29.asp
0393デフォルトの名無しさん
2006/09/02(土) 00:59:27std::locale::global(std::locale("japanese"));
ofstream file("ほげ.txt");
file << 12345 << endl;
とやると、ほげ.txtには"12,345"みたいに、
整数文字列中にカンマが入っちゃうんですが、
これを"12345"と出すにはどうすればいいんでしょうか?
環境はVC2005です。
0394デフォルトの名無しさん
2006/09/02(土) 01:01:54ありがとうございます、やはり無理ですかorz
「EXEからDLLへ関数へのポインタを引き渡す」とは、どんな感じでしょうか?
プロトタイプ宣言とかでしょうか?
>391
FactoryMethodとインターフェースクラスとかでしょうか?
何と無く理解出来た気が、ありがとうございます。
0395デフォルトの名無しさん
2006/09/02(土) 01:28:280396デフォルトの名無しさん
2006/09/02(土) 01:30:29これでどう?
// japanese ロケールのうち numeric カテゴリのファセットを
// C ロケールのファセットで置き換えたロケールをグローバルにセット
using std::locale;
locale::global(locale(locale("japanese"), "C", locale::numeric));
0397デフォルトの名無しさん
2006/09/02(土) 01:40:18やってみると、出力は12345になってくれるんですが、
出力ファイルのファイル名が化けてしまいます("ほげ"のところ)。
ロケール関連は情報が少なくて困る・・・
0398デフォルトの名無しさん
2006/09/02(土) 01:51:25>>393 のままならファイル名は化けないの?
numeric カテゴリ以外は japanese が使われるはずなんで、
そんなことは無いと思うんだけど。
VC2005 のロケールにはバグがあったような覚えがあるんだけど、
これも関係あるのかな?
0399デフォルトの名無しさん
2006/09/02(土) 01:56:030400デフォルトの名無しさん
2006/09/02(土) 02:06:06のところを
ofstream file(L"ほげ.txt");
としたら、出力ファイル名OKでカンマもなくなりました。
なんか結局ロケール設定はいらなかったぽいです。
でも、ofstreamにwchar_t *渡してコンパイル通るのっていいのかな・・・
>>398
>>393のままならファイル名は化けませんでした。
なんかここら辺の関連性が良くわからない・・・
ちなみに、ロケール設定なしでofstream file("ほげ.txt")にすると、
ファイル名化けました。
0401400
2006/09/02(土) 02:12:41これに関連したような問題?
まあunicode使えば問題なさそうですね。
0402380
2006/09/02(土) 02:13:04すみません、あれから色々試した結果一応解決(?)できたと思います。
最初↓のようなコードを書いて試したらエラーになりました。
#include<iostream>
using namespace std;
class Base{
private:
int iMember;
public:
Base():iMember(10){}
void show()
{
cout << iMember << endl;
}
};
class Derived:public Base{
public:
};
int main(){
Derived obj;
obj.show();
}
0403380
2006/09/02(土) 02:15:55#include<iostream>
using namespace std;
class Base{
private:
int iMember;
public:
Base():iMember(10){}
void show()
{
cout << iMember << endl;
}
};
class Derived:public Base{
public:
void show_iMember()
{
show();
}
};
int main(){
Derived obj;
obj.show_iMember();
}
ちゃんと基底クラスのオブジェクトは存在しているんですね。
ただmain関数からアクセスする場合は、派生クラスの関数を利用しないと
駄目なんですね。
0404デフォルトの名無しさん
2006/09/02(土) 02:20:34アクセサについて調べた方が良さそうだな。
0405380
2006/09/02(土) 02:54:50ありがとうございます。調べてみました。↓のように変えればいいのでしょうか?
この方が良いコードなのですか?
#include<iostream>
using namespace std;
class Base{
private:
int iMember;
public:
Base():iMember(10){}
int get_iMember()const //getter
{
return iMember;
}
};
class Derived:public Base{
public:
void show_iMember()
{
cout << get_iMember() << endl;
}
};
int main(){
Derived obj;
obj.show_iMember();
}
0406デフォルトの名無しさん
2006/09/02(土) 02:56:50普通はそういう風に書くね。見通しがいいだろ?
0407デフォルトの名無しさん
2006/09/02(土) 02:57:01そんなサンプルでは良い悪いは判別不能。
そういう方法が使えるということだけ覚えておけばいい。
0408380
2006/09/02(土) 03:07:37ありがとうございます。大体の文法は頭に入れたつもりなんですが、
どういう風に使うのかとかがぜんぜん解らず^^;
デザインパターンを覚えろと言われたので、今度からそれも勉強していきたいと
思っています。
0409デフォルトの名無しさん
2006/09/02(土) 03:16:14TTBaseについて調べてみました
externでプロトタイプ宣言するといった感じの様に思えますが、合っていますでしょうか?
0410387
2006/09/02(土) 09:29:49GetModuleHandle(NULL)からGetProcAddressするみたいですね。
GetProcAddressは知っていましたが、本体側にコールする方法に使うとは想像出来ませんでしたorz
一応、報告までに。色々教えてくださり、有難う御座いましたm(_ _)m
0411デフォルトの名無しさん
2006/09/02(土) 11:40:51C++で書いたプログラムにコマンドラインのユーザーインターフェースを付けたいのですが
どうしたらいいでしょうか? シェルとかgnuplotみたいな感じで履歴とか補完ができるとうれしいです。
一から全部作るべきでしょうか?
八方ふさがりです。助けてください。
0412デフォルトの名無しさん
2006/09/02(土) 11:44:43B-ShellなりGnuPlotなりのソースでも見てみたら?
尤も、1行編集機能は環境に任せられるなら
履歴管理くらいは自分で作っても簡単だろうけど。
0413デフォルトの名無しさん
2006/09/02(土) 16:44:04>ユーザーインターフェース
これをemacsにするとか
0414デフォルトの名無しさん
2006/09/02(土) 16:48:53sizeof(bool) == sizeof(char)
であることは、保証されていますか?
0415デフォルトの名無しさん
2006/09/02(土) 16:57:42されていない。sizeof(char) == 1 だが、sizeof(bool) は実装依存。
ISO/IEC 14882, Section 5.3.2 参照。
0416デフォルトの名無しさん
2006/09/02(土) 17:04:410417デフォルトの名無しさん
2006/09/02(土) 18:27:48できればコンパイラ名教えて。
0418デフォルトの名無しさん
2006/09/02(土) 18:40:370419デフォルトの名無しさん
2006/09/02(土) 20:04:07readline(GPL)や、libedit(BSD)というライブラリがあります。使い方は難しくないです。
でもあなたの環境ですんなりリンクできるかは知りません。
0420デフォルトの名無しさん
2006/09/03(日) 00:25:370421デフォルトの名無しさん
2006/09/03(日) 00:30:42float array[3][2] = {1.1 , 2.2 , 3.3 , 4.4, 5.5 , 6.6 };
float *p;
p=(float *)array;
ここでfloat *型にキャストしないとエラーになるのはどういう理屈なんでしょうか。
p=array;でもいいような?
0422デフォルトの名無しさん
2006/09/03(日) 00:39:30float *row0=array[0]
float *row1=array[1]
だから。
p=(float *)array;
は、
float array[3*2]
と同じようなもので、float array[][]ではないからキャストが必要。
0423デフォルトの名無しさん
2006/09/03(日) 00:41:320424デフォルトの名無しさん
2006/09/03(日) 00:41:38どれとも完全な互換性はない。
非互換になっているところは型安全性のためというのが主な理由。
>>421
そのarrayはfloat [2]の配列という型。
T型の配列のオブジェクトは式内でTへのポインタ型に変換されるという規則を当てはめると、
arrayはfloat [2]へのポインタ型になる。
ようするにfloat [2]へのポインタ型へならキャストなしで代入できる。
typedef float hoge_t [2];
hoge_t *ptr = array;
また、大抵は次のようにしても問題はない。(規格に照らし合わせて問題ないかは微妙だったはず)
float *p = &array[0][0]
0425デフォルトの名無しさん
2006/09/03(日) 01:03:572次元配列ならダブルポインタ(float **p)にしないとだめなのよ
ポインタの配列を示すポインタってことになるかな
0426デフォルトの名無しさん
2006/09/03(日) 01:07:04デタラメ書くなハゲ
0427デフォルトの名無しさん
2006/09/03(日) 01:09:300428デフォルトの名無しさん
2006/09/03(日) 01:18:00理解しやすいとかじゃなくて完全な間違いだボケ。
0429デフォルトの名無しさん
2006/09/03(日) 01:22:420430デフォルトの名無しさん
2006/09/03(日) 01:23:23完全な間違いではないよ
アセンブラでは結局アドレスに1次元のサイズをn倍したアドレスを計算で求めてるだけでそれをテーブルに展開していれば同じこと
君インデックスレジスタとかオフセットアドレッシングとかはわかってるかな?
0431デフォルトの名無しさん
2006/09/03(日) 01:26:58float[][] の配列にアドレスのテーブルなど無い。
0432デフォルトの名無しさん
2006/09/03(日) 01:27:300433デフォルトの名無しさん
2006/09/03(日) 01:31:04テーブルがあるかないかではないんだけど
ま、いいけどね
アセンブラ勉強してみ
0434デフォルトの名無しさん
2006/09/03(日) 01:32:06配列の配列
ポインタの配列
の違いはわかってるのかね。
アセンブラでの扱いだって全然違うよ。
(x86の場合)、配列はleaでアドレスを得るもので
ポインタはmovでアドレスを得るもの。(この場合はロードの意のmov)
0435デフォルトの名無しさん
2006/09/03(日) 01:33:29もう見ていて痛すぎるので知ったかぶりはやめろ
0436デフォルトの名無しさん
2006/09/03(日) 01:33:580437デフォルトの名無しさん
2006/09/03(日) 01:35:32噸クス
0438デフォルトの名無しさん
2006/09/03(日) 01:35:490439デフォルトの名無しさん
2006/09/03(日) 01:40:22いや多分>>430の本来言いたいことは、配列が*になるならば、配列の配列は**になる
という摩訶不思議なCの法則(ってか初心者が挫折しやすいところかな?)を理解するにはそう考えるといいのかな?
って事なんじゃない貝?
よくわからんけど
0440デフォルトの名無しさん
2006/09/03(日) 01:44:24なぜ配列の配列が ** になるんだ馬鹿か?
0441デフォルトの名無しさん
2006/09/03(日) 01:44:400442デフォルトの名無しさん
2006/09/03(日) 01:46:40[]の数が増えるだけですよ。
0443デフォルトの名無しさん
2006/09/03(日) 01:49:270444デフォルトの名無しさん
2006/09/03(日) 01:51:090445デフォルトの名無しさん
2006/09/03(日) 01:51:26ポインタをみっちりやったら充分な理解ができるでしょうか…
とりあえず
・float array[x][y]は【float [y]の配列】という型
という認識を胸に刻んでおきます。
0446デフォルトの名無しさん
2006/09/03(日) 01:52:190447デフォルトの名無しさん
2006/09/03(日) 01:54:37ちなみに、Cの多次元配列は、最初の次元に限りポインタ化する事ができる。
float[1][2][3]なら、float (*)[2][3]に変換できる。というかされる。
0448デフォルトの名無しさん
2006/09/03(日) 02:20:56**じゃなくて*[]の話してたみたいだ俺w
元レス読んでなかったわ
酔ってるし寝るわ
0449デフォルトの名無しさん
2006/09/03(日) 02:25:33いつまでもつまらんけど、やっぱ初心者が集まってるんだなと思った。
>>424規格(C)がどうのなら、float * p = &**arrayかな
0450デフォルトの名無しさん
2006/09/03(日) 02:43:36>規格(C)がどうのなら、float * p = &**arrayかな
またわけのわからん事を言う。
0451デフォルトの名無しさん
2006/09/03(日) 07:52:22環境はLinux Plamo(2.6.15.7)でgccを使用。
2バイトコード(日本語)を出力させるようなプログラムで
printfの出力がおかしくなります。 勉強不足ですいませんが
よろしくお願いします。
#include <stdio.h>
#define MAX 8
int main()
{
int i;
unsigned short CODE;
unsigned char hi,lo;
CODE=0x7888;
for (i=1; i<=MAX; i++)
{
lo = CODE & 0xFF;
hi = CODE >> 8 & 0xFF;
printf("0x%x:%c%c ",CODE,hi,lo);
if ( (i % 4) == 0 )
printf("\n");
CODE++;
}
printf("\n");
}
0452だからおかしいのはあんただって
2006/09/03(日) 08:03:31%cは何を出力するかわかっている?
つーか、0x7888の文字って何の積もりよ。
0453デフォルトの名無しさん
2006/09/03(日) 08:07:44%c は文字を出力。
その(0x7888)は、どの文字に該当するかを知りたい
だけ、初期値はなんでもよいと考えました。
0454デフォルトの名無しさん
2006/09/03(日) 08:40:08そんな文字はない。だから何が見えるかは環境依存。
0455デフォルトの名無しさん
2006/09/03(日) 09:19:00シングルバイト文字。
マルチバイト文字を%cで表示しようとしてるならアフォでは?
0456デフォルトの名無しさん
2006/09/03(日) 10:04:12んなこたーない。マルチバイト文字列は一バイトずつ出力してもいい筈だ。
#環境によるカも知れない。
0457デフォルトの名無しさん
2006/09/03(日) 10:46:29ん〜、マルチバイトコードを表示させるには
どうすればよいのか? %cではNG?
0458デフォルトの名無しさん
2006/09/03(日) 11:16:24Ex.
char code1 = "糞"[0];
char code2 = "糞"[1];
unsigend code = code1 << 8 | code2;
printf("%x:%c%c\n", code, code1, code2);
0459デフォルトの名無しさん
2006/09/03(日) 11:21:100460デフォルトの名無しさん
2006/09/03(日) 11:23:380461デフォルトの名無しさん
2006/09/03(日) 11:38:04>>460
本来と逆(逆引きに)なりますが、"日本" というコードは、
EUC または、SJISではどのような16進数になりますか?
としたら?
0462デフォルトの名無しさん
2006/09/03(日) 11:46:060463デフォルトの名無しさん
2006/09/03(日) 11:50:290464デフォルトの名無しさん
2006/09/03(日) 11:52:28>458をやってみて納得できてから先へ進め。
0465デフォルトの名無しさん
2006/09/03(日) 11:59:05コードで書こうとした結果です。コメントが厳しいね。
> 464 どうもありがとう。そうします。
0466デフォルトの名無しさん
2006/09/03(日) 13:46:39> 464 "糞" -> "日" に変更して実機でやってみた。
0xfffffffc:日
16進の表示がおかしくないですかね。
EUCの場合は、0xc6fc ぽい表示でないと。
0467デフォルトの名無しさん
2006/09/03(日) 14:05:200468デフォルトの名無しさん
2006/09/03(日) 14:15:50補数? わからない。です。
2の補数は引き算を加算にする場合に使用するものだが。
0469デフォルトの名無しさん
2006/09/03(日) 14:21:260470デフォルトの名無しさん
2006/09/03(日) 14:38:070471デフォルトの名無しさん
2006/09/03(日) 14:44:50つうか、文字コード確認せずに表示おかしいって、釣りだろ、これ。
0472デフォルトの名無しさん
2006/09/03(日) 14:49:180473デフォルトの名無しさん
2006/09/03(日) 15:07:140xc6fc:日
unsigned char に変更したら、期待したコードが表示されました。
0474デフォルトの名無しさん
2006/09/03(日) 15:52:21たとえば、以下のコードの順番で、0xc6ff は?
0xc6fc:日 0xc6fd:乳 0xc6fe:入 0xc6ff:
動xc700: 念xc701: 念xc702: 念xc703:
0475デフォルトの名無しさん
2006/09/03(日) 15:54:16自分でやってみろよ。
0476デフォルトの名無しさん
2006/09/03(日) 15:59:520477デフォルトの名無しさん
2006/09/03(日) 16:01:47何をしたくて何をやったらどうなったのか、 >>474 ではわからん。
0478デフォルトの名無しさん
2006/09/03(日) 16:06:27>451 のサンプルコードで、CODE=0x7888; を CODE=0xc6fc
に変更してコンパイル実行した結果。 >474 の結果になりました。
0479デフォルトの名無しさん
2006/09/03(日) 16:10:56じゃぁ答えは出てるんじゃないか?
0480デフォルトの名無しさん
2006/09/03(日) 16:17:12いやいや、そのあとのコード(0xc6ff 以降が)表示が
おかしくなるのです。
0481デフォルトの名無しさん
2006/09/03(日) 16:19:09だから、 >>474 の質問だとそれが答えになるだろ?
0482デフォルトの名無しさん
2006/09/03(日) 17:01:04ない文字を表示しようとしてどうするの?
0483デフォルトの名無しさん
2006/09/03(日) 17:42:25そういうことですか。割り当てられていないコードは
なにか、空でもよいから表示されるものかと思いました。
0484デフォルトの名無しさん
2006/09/03(日) 20:18:15#if sizeof(bool) == sizeof(char)
同じようなことをしたいとき、どうやればいい?
0485デフォルトの名無しさん
2006/09/03(日) 20:19:59プリプロセッサで sizeof は評価されない。
template メタプログラミングの手法を使えば、大体のことはできる。
0486デフォルトの名無しさん
2006/09/03(日) 20:21:320487デフォルトの名無しさん
2006/09/03(日) 20:24:14やっぱそれしかないかー。
>>486
bool 型のサイズに等しい符号付き整数型 (仮に BoolInt とする) を使って、
bool バッファを BoolInt バッファに変換した上で、
負の数を格納したいのら。
void Func1(bool* pBool)
{
BoolInt* pInt = (BoolInt*) pBool;
pInt[0] = -1;
... ごにょごにょ ...
最後はバッファには 0, 1 しか格納されていないことを保証する
}
0488デフォルトの名無しさん
2006/09/03(日) 20:51:27何がしたいのかさっぱりわからん。
0489デフォルトの名無しさん
2006/09/03(日) 20:51:57BOOL使う時って、0かそれ以外の理論値判断なんだから普通気にしないだろ。
メモリを爪に火をともすように頑張っていた昔と違って、PCスペックの余裕がある今
BOOLで真偽以外の数値を扱うって見にくいプログラムになりやすいと思うけど。
0490デフォルトの名無しさん
2006/09/03(日) 20:52:32> 負の数を格納したいのら。
> ...
> 最後はバッファには 0, 1 しか格納されていないことを保証する
おかしくね?
0491デフォルトの名無しさん
2006/09/03(日) 20:59:35>何かの研究でやってるのか?
まあ、そうだね。
画像処理のアルゴリズムでよく出てくるのだが、
一時的に 0,1 以外の値を入れたいことがある。
>>490
計算の途中だけ -1 をいれたいのら。
0492デフォルトの名無しさん
2006/09/03(日) 21:04:47そんなもんは最初っから signed char か適切な enum の配列にしておけ。
計算の途中だけというのが重要なら Func1() の前後で変換しろ。
0493ららら
2006/09/03(日) 21:11:50二値画像は、デフォルトで bool 型にしたいのら。
char と相互変換するのはコストが高いのら。
0494ららら
2006/09/03(日) 21:13:15とりあえず、テンプレート メタで実装しといた。
Generative Programming に書いてある IF テンプレートで。
0495デフォルトの名無しさん
2006/09/03(日) 21:15:02ユーザがその気でも中身では違う事やってますとかあるし
0496デフォルトの名無しさん
2006/09/03(日) 21:16:280499デフォルトの名無しさん
2006/09/03(日) 21:18:21二値画像は、デフォルトで bool 型にしたいのら。
これが間違いだな。余計にコストがかかってる可能性もある。
0500デフォルトの名無しさん
2006/09/03(日) 21:19:12移植性が要るなら無茶なキャスト挟んだ時点でアウトだろ。
0502デフォルトの名無しさん
2006/09/03(日) 21:19:470504ららら
2006/09/03(日) 21:20:180507ららら
2006/09/03(日) 21:22:110508ららら ◆KFIzlPh4XQ
2006/09/03(日) 21:22:420509ららら ◆Qf4QxB6kQE
2006/09/03(日) 21:23:290511ららら ◆Qf4QxB6kQE
2006/09/03(日) 21:25:230512デフォルトの名無しさん
2006/09/03(日) 21:25:32例えば、
int i = ...;
bool b = i; // (i != 0) がテストされる。
signed char c = i; // 単純に上位ビットが切り捨てられる。
i = b; // b に対応するメモリから読み出した値が 0 かどうかによって 1 と 0 に変換される。
i = c; // 単純に符号拡張された値が入る。
こんな違いが考えられる。最適化で消えることもあるだろうけどね。
0513ららら ◆KFIzlPh4XQ
2006/09/03(日) 21:25:550515デフォルトの名無しさん
2006/09/03(日) 21:28:50移植性は失っている。
整数 1 のメモリ上の表現と true のメモリ上の表現とに互換性があるという保証は無い。
0517デフォルトの名無しさん
2006/09/03(日) 21:30:06何を根拠に言っている?
0520デフォルトの名無しさん
2006/09/03(日) 21:34:17この違いが気にならないなら、コストでんでんを語る必要は無い。
0521ららら
2006/09/03(日) 21:34:39> 整数 1 のメモリ上の表現と true のメモリ上の表現とに互換性があるという保証は無い。
ふむー。たしかになー。
何かうまい方法はないかなー。
0522デフォルトの名無しさん
2006/09/03(日) 21:35:220524デフォルトの名無しさん
2006/09/03(日) 21:39:35以下のような構造体を作りました
typedefstructFILEINFO {
HGLOBALhMem;
structFILEINFO *prev;
structFILEINFO *next;
WIN32_FIND_DATAw32fd;
}fileinfo;
FILEINFO fileinfo;
メイン関数よりも前のグローバル領域で構造体の宣言をすると
ex.cpp(17) : error C2377: 'fileinfo' : typedef 識別子が再定義されています。
ex.cpp(14) : 'fileinfo' の宣言を確認してください。
のエラーがでます。関数内で構造体の宣言をするとエラーはでませんでした。
しかし、他の関数からも参照したいのでグローバル領域で宣言する方法はありますか?
どなたか教えてください。
0525デフォルトの名無しさん
2006/09/03(日) 21:39:43bool にしてる利点は何だ?
0526デフォルトの名無しさん
2006/09/03(日) 21:40:53最初の typedef が要らないんじゃね?
0527ららら
2006/09/03(日) 21:43:070-画素か 1-画素かの判定に、ブール演算で記述できること。
if (img(0,0)) とか。
これを char 型にしてしまうと、
if (img(0,0) == 1) とか書かないと、意味がはっきりしないよね。
つまり、二値画像において、-1 という値は通常有り得ないんだけど、
計算の都合上、ちょっとだけマークをつけたいときにだけ使いたい。
0528ららら
2006/09/03(日) 21:46:32変な定義の仕方だねー。普通こんなにするだろ。
typedef struct FILEINFO_ {
HGLOBALhMem;
structFILEINFO *prev;
structFILEINFO *next;
WIN32_FIND_DATAw32fd;
} FILEINFO
FILEINFO fileinfo;
0529デフォルトの名無しさん
2006/09/03(日) 21:48:34タグ名に意味の無いアンダースコアつけるのやめてくれ。
0531デフォルトの名無しさん
2006/09/03(日) 21:52:30意味が無いうえに使いにくい。
0533ららら
2006/09/03(日) 21:55:130534デフォルトの名無しさん
2006/09/03(日) 21:55:59あくまで一般論だが、アンダースコアはタグ名の頭か、または両方だろう。
0535デフォルトの名無しさん
2006/09/03(日) 21:56:08自分で >>528 で使って、しっかり失敗しているわけだが。
0536デフォルトの名無しさん
2006/09/03(日) 21:56:37>コストでんでん
突っ込んで欲しかった?
0537ららら
2006/09/03(日) 21:57:310538デフォルトの名無しさん
2006/09/03(日) 21:57:41頭に付けるのは尚悪い。
0539ららら
2006/09/03(日) 21:58:31すんません。構造体の中で使っているんだな。気がつかんかった。
typedef struct FILEINFO_ {
HGLOBALh Mem;
struct FILEINFO_ *prev;
struct FILEINFO_ *next;
WIN32_FIND_DATAw32fd;
} FILEINFO;
FILEINFO fileinfo;
0540ららら
2006/09/03(日) 21:59:27すんません。構造体の中で使っているんだな。気がつかんかった
typedef struct FILEINPO_ {
HGLOBALOSww Mem;
struct FILEINPO_ *prev;
struct FILEINPO_ *next;
WIN32_FIND_DATAw32fd;
} FILEINPO;
FILEINPO fileinpo;
0541ららら
2006/09/03(日) 22:00:10すんません。構造体の中で使っているんだな。気がつかんかった
typedef struct FILEINPO_ {
HGLOBALOSww Mem;
struct FILEINPO_ *prev;
struct FILEINPO_ *next;
WIN32_FIND_DATAw32fd;
} FILEINPO;
FILEINPO fileinpo;
0542デフォルトの名無しさん
2006/09/03(日) 22:00:23その記述上の利点と、移植性を失うことおよび template メタ IF まで
担ぎ出す破目になったことを秤にかけて、あとは自分で選べ。
0544デフォルトの名無しさん
2006/09/03(日) 22:02:35やめてくれって言ってるのに、そっちを直すのか。何の宗教かねまったく。
0546デフォルトの名無しさん
2006/09/03(日) 22:02:530547デフォルトの名無しさん
2006/09/03(日) 22:04:010548ららら
2006/09/03(日) 22:04:050549524
2006/09/03(日) 22:05:41間違ってました。(^^;)
皆様ありがとうございました
0550デフォルトの名無しさん
2006/09/03(日) 22:13:04ごめん、吊ってくる
0551デフォルトの名無しさん
2006/09/03(日) 22:34:54なぜですか?
0552デフォルトの名無しさん
2006/09/03(日) 22:36:31デストラクタは例外が投げられたときによく使われるからです。
0553デフォルトの名無しさん
2006/09/03(日) 22:51:09retgkregkre:kg3^4−0ti5tすきすいせまきいすりれきまふれまけすき
0554デフォルトの名無しさん
2006/09/03(日) 23:02:380555デフォルトの名無しさん
2006/09/04(月) 07:04:55頻繁にソートやデータのコピーをする場合
一般的にどのような方法で保持するんでしょうか?
例えば
typedef struct{ typedef struct{
int a; char str[128];
int b; int c,d,e;
{ Hoge; Hoge hoge[30];
} Piyo;
こんな感じの構造体があって、Piyoが数万件ある場合などです。
0556デフォルトの名無しさん
2006/09/04(月) 07:14:050557デフォルトの名無しさん
2006/09/04(月) 17:53:33リストの構造は線形リストを使えばそんなに難しくないと思うのですが、データを保持する方法で悩んでいます。
基本的には格納するデータへのポインタをリストの要素に保持すれば良いと思うのですが、どのような手法を使うか悩んでいます。
現時点で思いついたのは
1.
リストの要素に格納する時点でポインタに型を持たせる
2.格納しているときはvoidにしておいて要素を参照するときに型を変換する
です。どちらにしてもそのポインタがどんな型のオブジェクトへのポインタであるか判定して、適切に型変換をしないといけませんよね。
その「どんな型のオブジェクトへのポインタか判定する」方法がなかなか思いつきません。
よろしければアドバイスをお願い致します。
0558デフォルトの名無しさん
2006/09/04(月) 18:02:33C++ ならオブジェクトを基底クラスにして、そのポインタを保持。
Set時は new 派生クラス ってな感じか。
0559デフォルトの名無しさん
2006/09/04(月) 18:32:530560デフォルトの名無しさん
2006/09/04(月) 20:23:050561デフォルトの名無しさん
2006/09/04(月) 23:34:28俺もそう書こうとしたが、557はCでと書いている。
0562デフォルトの名無しさん
2006/09/04(月) 23:38:230563デフォルトの名無しさん
2006/09/05(火) 02:56:21union大好きー。
0564デフォルトの名無しさん
2006/09/05(火) 14:30:24unionを何に使うのかサッパリ思いつきもしなかったなあ。
0565デフォルトの名無しさん
2006/09/05(火) 15:35:300566デフォルトの名無しさん
2006/09/05(火) 17:06:010567デフォルトの名無しさん
2006/09/05(火) 17:53:020568デフォルトの名無しさん
2006/09/05(火) 18:20:270569デフォルトの名無しさん
2006/09/05(火) 18:22:500570デフォルトの名無しさん
2006/09/05(火) 18:27:110571デフォルトの名無しさん
2006/09/05(火) 18:38:120572デフォルトの名無しさん
2006/09/05(火) 19:37:020573デフォルトの名無しさん
2006/09/05(火) 19:51:59まさかループを細かく切り取って関数にしてないだろうな
0574デフォルトの名無しさん
2006/09/05(火) 20:06:530575デフォルトの名無しさん
2006/09/05(火) 20:14:110576デフォルトの名無しさん
2006/09/05(火) 20:15:26多段ループから抜けなきゃならないようなプログラムを
しょっちゅう書いているのか?
だとしたらその糞プログラム構成をまずどうにかしろよ。
0577デフォルトの名無しさん
2006/09/05(火) 20:16:530578デフォルトの名無しさん
2006/09/05(火) 20:20:03まず関数に分ける必要もないわけだが
0579デフォルトの名無しさん
2006/09/05(火) 20:20:12C++じゃ使わないけど
0580デフォルトの名無しさん
2006/09/05(火) 20:22:14むしろ唯一といってよいほどのgotoの使いどころだと思っている。
0581デフォルトの名無しさん
2006/09/05(火) 20:24:11まあ、エラー処理で使うのがもっとも妥当。
0582デフォルトの名無しさん
2006/09/05(火) 20:25:35むしろunionについて熱く語れよ。
0583デフォルトの名無しさん
2006/09/05(火) 20:25:550584デフォルトの名無しさん
2006/09/05(火) 20:36:51先に語ってから言えよ
0585デフォルトの名無しさん
2006/09/05(火) 20:40:01x86のレジスタをエミュレーションする例が載ってた
axとeaxをunionのメンバにしたりして
おいおいえらい限定的な使い方だなと突っ込みつつ読んだ記憶が
0586デフォルトの名無しさん
2006/09/05(火) 20:44:42変わるようなデータに使ったよ。
0587デフォルトの名無しさん
2006/09/05(火) 20:48:02windows上のアプリ作成等ではほとんど不要なのかね。
0588デフォルトの名無しさん
2006/09/05(火) 21:00:26アセンブラの延長と見るか
OSのAPI操作の一貫と見るか
その差じゃないか
0589デフォルトの名無しさん
2006/09/05(火) 22:17:12C++ なら仮想関数でやるんだろうけど、C だと enum で適当に判断してやるしかない。
0590デフォルトの名無しさん
2006/09/05(火) 22:50:08ちょっとスレが進んでしまったので場違いみたいですがお礼申し上げます。
私が思いつかなかったアイデアがあって参考になりました。
チャレンジしてみようと思います。
0591デフォルトの名無しさん
2006/09/05(火) 22:58:49gotoはこの間初めて使ったけど、多分2度と使わないな。
0592デフォルトの名無しさん
2006/09/05(火) 22:59:45もちろんエラー処理でね
0593デフォルトの名無しさん
2006/09/05(火) 23:06:370594デフォルトの名無しさん
2006/09/05(火) 23:07:20unionのメンバー変数があるみたいだが、使い方が分からん。
どなたか知っている方がいたら、ご教授よろしく。
BOOL ScrollConsoleScreenBuffer(
HANDLE hConsoleOutput, // コンソールスクリーンバッファのハンドル
CONST SMALL_RECT *lpScrollRectangle,
// 移動対象のデータブロックを表す長方形のアドレス
CONST SMALL_RECT *lpClipRectangle,
// クリッピング長方形のアドレス
COORD dwDestinationOrigin, // スクリーンバッファ長方形の新しい位置
CONST CHAR_INFO *lpFill // 塗りつぶしに使う文字と色のアドレス
);
0595デフォルトの名無しさん
2006/09/06(水) 00:43:430596デフォルトの名無しさん
2006/09/06(水) 00:51:340597デフォルトの名無しさん
2006/09/06(水) 00:59:44C++のmap(STL)を使って連想配列のクラスを作ろうと思います。
そこで相談です。keyとなる型にchar[256]を使うか、std::string
を使うか悩みます。stringの方が圧倒的に楽そうなのですが、
charの固定長でもいいかな、と思います。どちらがお勧めですかね?
条件として、
1. なるべく環境非依存にしたい(Linux+gcc,Windows+VCの両方で無難に使えるコード)
2. キーになる文字列はシングルバイト文字だけ。
3. 用途はexpatを使って解析したXMLのデータを収めたい。
char型で作るなら、mapなんか使わず、0から実装してもいいという感じもします。
STLは今日勉強し始めたばかりなので、悩みます。
よろしくお願いします。
0598デフォルトの名無しさん
2006/09/06(水) 01:03:28string の方が楽なんだろ。何を悩んでいる?
0599デフォルトの名無しさん
2006/09/06(水) 05:13:25下記のようなクラス定義をしたのですが、funcs::main()が
コンパイルエラーとなってしまいます。
このような使い方は出来ないのでしょうか?
よろしくお願いします。
class base
{
friend class base;
private:
virtual int foo() = 0;
};
class super : public base
{
private:
int foo();
};
class funcs
{
int main(){
obj.foo();
};
super obj;
};
0600デフォルトの名無しさん
2006/09/06(水) 05:53:10>class base
>{
>friend class base;
なにこれ?
0601599
2006/09/06(水) 07:56:03[正] friend class funcs;
0602デフォルトの名無しさん
2006/09/06(水) 08:02:41static_cast<base&>(obj).foo();
0604デフォルトの名無しさん
2006/09/06(水) 13:25:06LARGE_INTEGER(64bit整数)でお世話になってます
0605デフォルトの名無しさん
2006/09/06(水) 13:57:13自分だけがお友達なんだよ!
0606デフォルトの名無しさん
2006/09/06(水) 14:35:25俺のこと?
0607デフォルトの名無しさん
2006/09/06(水) 14:40:32そんな君にプレゼント
//これじゃテンプレートが動かないな、困った。
//#define class struct
#define private public
#define protected public
0608デフォルトの名無しさん
2006/09/06(水) 16:07:10A にはデフォルトコンストラクタの他に
コピーコンストラクタと代入演算子が定義されています。
このとき次の二つのコードは同じ意味を持ちますか?
a2 はコンストラクト済みの A のインスタンスです。
イ)A a1(a2);
ロ)A a1 = a2;
イ)A a1(a2);
ロ)A a1 = a2;
ハ)A a1 = A(a2);
0610デフォルトの名無しさん
2006/09/06(水) 17:06:18デフォルトコンストラクタ、代入演算子を用意して実験。
A a1(0); //コンストラクタが呼ばれる
A a2=0; //コンストラクタが呼ばれる
A a3(a1); //コピーコンストラクタが呼ばれる
A a4=a1; //コピーコンストラクタが呼ばれる
A a5=A(0); //コンストラクタが呼ばれる
A a6=A(a1); //コピーコンストラクタが呼ばれる
a5 とか a6 のケースはちょっと予想外。
一時オブジェクトの生成のためにコンストラクタが呼ばれて、
それを使った a5, a6 の生成のためにもう一度コンストラクタが
呼ばれると思ってたのに。って、こういう挙動って
処理系に拠らず決まっているもの?
a4 がデフォルトコンストラクタで生成され、
続いて代入演算子が呼ばれる、なんてことはない?
0611デフォルトの名無しさん
2006/09/06(水) 17:34:19規格を確認してないけど
それには以外な結果はないな
>a4 がデフォルトコンストラクタで生成され、
>続いて代入演算子が呼ばれる、なんてことはない?
初期化と解されるのでない
0612デフォルトの名無しさん
2006/09/06(水) 17:57:47次のコードのcicpとiccpの宣言では
ポインタをconstにはしないのでしょうか
//テスト
int ar[30]={11,12,13,14,15};
int ar2[40]={21,22,23,24,25};
const int const * cicp=ar;
int const const * iccp=ar;
//*cicp=10;
//*iccp=10;
//↑この2つはエラー
cicp=ar2;
iccp=ar2;
//↑しかしこの2つはエラーにならない
0613デフォルトの名無しさん
2006/09/06(水) 18:00:46const int * const cipc=ar;
int const * const icpc=ar;
0614デフォルトの名無しさん
2006/09/06(水) 18:00:530615デフォルトの名無しさん
2006/09/06(水) 18:06:26はポイント先のデータがconst
int * const p
はポインタ自体がconst
0616デフォルトの名無しさん
2006/09/06(水) 18:10:260617デフォルトの名無しさん
2006/09/06(水) 18:14:16なぜか一応コンパイルは通ります
int const hoge;
const int bar;
これら二つが同じものらしいので、
constは隣にくっついてる型をconstにしているのかなと思ったわけです
ある程度法則がつかめないと例としては極端だが
const int * const * const **const hoge;
↑こんなのがどういうものなのかがわからないと思うので。
まぁ実際こんなのは使わないでしょうが
ちゃんと動作を理解したいだけです
0618デフォルトの名無しさん
2006/09/06(水) 18:18:56組み合わせ的にはもう一つあります
const int *cip=ar; //1こめ データがconst
int const * icp=ar; //2こめ テスト結果、データがconst
int * const ipc=ar; //3こめ ポインタがconst
2番目はintと結合するのか*と結合するのかテストしてみたところ
ポインタが指し示す先のint型のデータがconstになりました
ということは、constは左側に優先的に結合するのかな、と。
そこで、612、613の4パターンはすべて同じ型をあらわすのかなと思い
テストした結果、異なる結果となったので
こうして質問してみました
0619デフォルトの名無しさん
2006/09/06(水) 18:36:30この二つは同じ型修飾子が2回以上使われています
と警告が出ました
const int const * cicp=ar;
int const const * iccp=ar;
const→int←const * cicp=ar;
int←const←const * iccp=ar;
こういう修飾のされ方みたいです
<stdio.h>をインクルードしているとなぜか警告がでなかったので・・
スレ汚しすみません
0620デフォルトの名無しさん
2006/09/06(水) 18:37:51現環境(Microsoft Visual Studio 6.0)で修正開発したいのですが、
コンバートする方法ありますか?
※ワークスペースファイルは、.NETのprojファイルしかありません。
0621デフォルトの名無しさん
2006/09/06(水) 18:45:350622デフォルトの名無しさん
2006/09/06(水) 18:46:41同一の関数func()を持つ aaa.c、bbb.c をコンパイルしてアーカイブしたとして、
あるプログラムでfunc()を呼び出したとき、どちらがのfunc()が呼び出されるのでしょうか?
ちなみに、引数も同じです。
よろしくお願いします。
0623デフォルトの名無しさん
2006/09/06(水) 18:47:19* の右側に const があるか左側にあるかで判別すればよい
0624デフォルトの名無しさん
2006/09/06(水) 18:47:26ttp://www.codeproject.com/tools/prjconverter.asp
0625デフォルトの名無しさん
2006/09/06(水) 18:50:06アーカイブってなに?ar?
リンカに怒られる。
名前空間使うべし。
0626デフォルトの名無しさん
2006/09/06(水) 18:53:54Cに名前空間はない
0627デフォルトの名無しさん
2006/09/06(水) 19:08:43ttp://www.tietew.jp/cppll/archive/5132
cvっていうのはこういうやつでしょうか
変数から見るというのは、どういうことなんでしょうか^^;
int * const * const ipcpc=p;
例えばこういうのがあった場合は
一番右のconstをとってきて
(const int ipcpc)
* const *
右のconst *をとってきて
(const *(const int ipcpc))
*
残ったポインタを使って
*(const *(const int ipcpc)))
→const intと、それをさしているポインタがconst
0628デフォルトの名無しさん
2006/09/06(水) 19:12:53ありがとうございます。
度々すみませんが、これって登録しないとダウンロードできませんか?
0629デフォルトの名無しさん
2006/09/06(水) 19:17:29もしかして
int * const * const ipcpc=p;
↓
int * const (* const) ipcpc=p;
↑ポインタのポインタはconst
int (* cosnt) * const ipcpc=p;
↑ポインタはconst
(int) * const * const ipcpc=p;
↑データをさしているところはint
そんでもって、一番左側だけは
constとintを入れ替え可能って感じでしょうか
(const int )* const * const *p1;
(int const )* const * const *p2;
p1==p2;
こういうことでしょうか
0630622
2006/09/06(水) 19:29:06アーカイブ=ar の事です。
リンカに怒られない、というか実行形式のファイルができてしまいましたんで、
一体どうなっているのかなぁ、と。
動かしてみたところ、名前順って訳でもなさそうなので、保証されない、
ってところでしょうか?
0631デフォルトの名無しさん
2006/09/06(水) 21:15:57typedef int *pint;
const pint pi1;
pint const pi2;
const int* pi3; // ?
int* const pi4;
見た目だけでルールを判断すると落とし穴にはまることが多い。
0632デフォルトの名無しさん
2006/09/06(水) 21:47:33>>623 の意味は int 等を無視して const と * の順序だけ見るということ
const int* var → const *var → *var は定数
int const* var → const *var → *var は定数
int* const var → * const var → var は定数
const int* const var → const *(const var) → var は定数、*var も定数
0633デフォルトの名無しさん
2006/09/06(水) 21:51:52AsynceSocketクラスを使って
DOSでチャットソフトは作ることが可能ですか?
0634デフォルトの名無しさん
2006/09/06(水) 21:54:08ん? そういう問題じゃない?
0635デフォルトの名無しさん
2006/09/06(水) 22:05:55コンソールアプリケーションでチャットを作れるか、でお願いします
0636デフォルトの名無しさん
2006/09/06(水) 22:10:380637デフォルトの名無しさん
2006/09/06(水) 22:20:38リンカは、未解決のシンボルが見つかった時点でその探索を中断するから、illegalなわけではないよ。
$ cc -o foo foo.c aaa.c bbb.c
$ cc -o foo foo.c bbb.c aaa.c
としてみれば、そのようになることがわかると思う。
aaa.oとbbb.oがarchiveになっているときはどうなるのかなぁ?
archive内のファイルの物理順序によるような気もするし、手元の環境では確かにそうなる。
・・・答えになってないね。
0638デフォルトの名無しさん
2006/09/06(水) 22:24:240639デフォルトの名無しさん
2006/09/06(水) 22:27:13解説ありがとうございます
変数のあるほうから
*の左右で判断し見るというのでいけそうです
実際に次のようなコードを試して実験してみました
int i = 10;
int *const ipc=&i;
int *const ipc2=&i;
int *const*ipcp=&ipc;
int *const*ipcp2=&ipc;
int *const** ipcpp=&ipcp;
int *const** ipcpp2=&ipcp;
int *const***const ipcpppc =&ipcpp;
int *const***const ipcpppc2=&ipcpp;
//エラー ipcpppc=ipcpppc2;
*ipcpppc=ipcpp2;
**ipcpppc=ipcp2;
//エラー ***ipcpppc=ipc2;
****ipcpppc=10;
結論としては右側から見ていって
一番右側にconst
→宣言したポインタがconst
一番右側の*の左側にconstがあるかどうか
→あれば、宣言したポインタのさす先がconst
...
一番左側の*の左側に、最終的に指されている型(この例ではint)の
ほかにconstがあるかどうか(順番はconstと入れ替わっても良い)
→あれば、最終的に指されている型がconst
これで判定できそうです
0640597
2006/09/06(水) 22:57:33関連するプロジェクト全体で文字列の扱いをまだstringにするかcharにするか決めあぐねてたからなんです。
確かにstringの方がすっきりするし、簡単でした。
実装してみました。passは"c++hash"
http://www.uploda.org/uporg506958.cpp.html
コードのコメントにもあるとおり、findで見つからなかった時の処理に悩みますが、とりあえずやりたい事はできました。
ありがとうー。
0641デフォルトの名無しさん
2006/09/07(木) 00:39:13領域を確保していない(newしていない)ポインタをdeleteするとどうなりますか?
またNULLの入ったポインタをdeleteするとどうなりますか(同じこと?)
0642デフォルトの名無しさん
2006/09/07(木) 00:44:08ヌルポインタに対する delete は何もしない。
new の戻り値でもヌルでもないポインタに対する delete はすべて未定義動作。
0643デフォルトの名無しさん
2006/09/07(木) 00:45:58何が起こるかは未定義。デバッグ用タイムをリンクしてれば
たいていは止まってくれる。
NULL ポインタを delete すると、何も起こらない。
何も起こらないことが保証されている。
0644デフォルトの名無しさん
2006/09/07(木) 00:52:39お二人ともありがとうございます。NULLだと何もしないと
普通に宣言しただけのポインタだと危険ですね
0645デフォルトの名無しさん
2006/09/07(木) 00:57:35「デバッグ用タイム」って何?
0646デフォルトの名無しさん
2006/09/07(木) 01:00:00わきみちだし
0647デフォルトの名無しさん
2006/09/07(木) 01:07:000648デフォルトの名無しさん
2006/09/07(木) 01:07:43unsigned char型の配列同士を比較しようとするとコンパイルは通るんですが実行した後エラーが起きて強制終了されてしまいます。
上記の型同士の比較はできないんでしょうか?
二つの配列のどちらも0〜255の値が入っています。
0649デフォルトの名無しさん
2006/09/07(木) 01:07:500650デフォルトの名無しさん
2006/09/07(木) 01:08:28コード晒せ。
0651デフォルトの名無しさん
2006/09/07(木) 01:11:08配列として確保されている領域をオーバーランしているのでは?
0652デフォルトの名無しさん
2006/09/07(木) 07:10:03unsigned char A[10],B[10];
if(A == B){...}
0653デフォルトの名無しさん
2006/09/07(木) 08:58:090654648
2006/09/07(木) 10:34:32unsigned char Temp[3][3]={{0,255,0},{255,0,255},{0,255,0}};
unsigned char Fsobel[480][640];
for(i=0;i<nHeight-3;i++){for(j=0;j<nWidth-3;j++){
if (Fsobel[i][j]==Temp[x][y]){
for(x=0;x<3;x++){for(y=0;y<3;y++){
if (Fsobel[i+x][j+y]==Temp[x][y]){
count++;
}
}}
if (count>=4){
Fsobel[i][j]=100;
}
}
}}
0655デフォルトの名無しさん
2006/09/07(木) 10:50:37x, yの初期値が不定。この条件が成立して、次にきた時には範囲外アクセス。
0656デフォルトの名無しさん
2006/09/07(木) 20:34:26それって配列の先頭ポインタの比較だから、必ず偽を返すだけで
実行後エラーにはならないんじゃないか?
0657デフォルトの名無しさん
2006/09/07(木) 22:02:290658デフォルトの名無しさん
2006/09/07(木) 22:14:31例えば x[5][5]の値が全部5という配列があったとしてx[-1][5]やx[5][-1]などの値はどうなっているかいまいち判りません。
どなたかご教示お願いいたします。
0659デフォルトの名無しさん
2006/09/07(木) 22:18:030660デフォルトの名無しさん
2006/09/07(木) 22:18:39その手がありました、ありがとうございます!
0661デフォルトの名無しさん
2006/09/07(木) 22:42:43それを試したところで、その結果はたまたまそうなっただけのもの。
仮に0が表示されたとしても、「配列の範囲外は0になってるんだ!」なんて
思わないようにね。
0662デフォルトの名無しさん
2006/09/08(金) 00:04:38大抵は、x[0][0]の値が真っ当に表示される。
>x[5][-1]
恐らくは、x[4][4]の値が真っ当に表示される。
#つーか釣り?
0663デフォルトの名無しさん
2006/09/08(金) 00:29:16x[-1] や x[5] を評価した時点で未定義動作。
値は意味を成さない。
0664デフォルトの名無しさん
2006/09/08(金) 00:57:49リンクできてるなら、先にリンクしたほうが呼ばれてると思う。
0665デフォルトの名無しさん
2006/09/08(金) 01:17:11>>637
0666デフォルトの名無しさん
2006/09/08(金) 21:38:19x[-1]=~0x00とかやってOSがイッちまったなんて聞いた事ないけど
0667デフォルトの名無しさん
2006/09/08(金) 21:43:05goto 使わないためには、フラグ立てるしかないですか?
こういうときは goto 使うのが普通ですか?
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
if (gonyo gonyo) goto LOOP_END;
}
}
LOOP_END:
0668デフォルトの名無しさん
2006/09/08(金) 21:59:00for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
if (gonyo gonyo) {
i = 100;
break;
}
}
でいいんじゃないすかね。
0669デフォルトの名無しさん
2006/09/08(金) 22:02:18static int j_loop(int i)
{
int j;
for(j = 0; j < 100; j++)
if(gonyo gonyo) return 1;
return 0;
}
void i_loop(void)
{
int i;
for(i = 0; i < 100; i++)
if(j_loop(i)) break;
}
0670デフォルトの名無しさん
2006/09/08(金) 22:16:06C++なら例外でもいけそう
0671デフォルトの名無しさん
2006/09/08(金) 22:35:52未定義動作だから、何が起ころうと知ったこっちゃない。
メモリ保護違反の例外を起こしてプロセスが終了してもいいし、
たんに無かったことにされてもいいし、
鼻から悪魔が出てきたっていい。
0672デフォルトの名無しさん
2006/09/08(金) 22:45:16sub(int i)
{
for (int j = 0; j < 100; j++)
{
if (gonyo gonyo)
return 100;
}
return i;
}
for (int i = 0; i < 100; i++)
{
i = sub(i);
}
0673デフォルトの名無しさん
2006/09/08(金) 22:47:23多重ループの脱出はgoto使っても良いと思う。Javaとかでも同じような方法使ってるし(ラベルつきbreak)
んで、他の手段としては多重ループ全体を一つの関数に括りだしてreturnを多重ループの脱出に使うってのもある。
これ以外のフラグ立てる方法やそれの亜種形(>>668,669,672とか)は大抵の場合汚くなるからあんまりお勧めできない。
自分は素直にgotoのほうが好き。
0674デフォルトの名無しさん
2006/09/08(金) 23:03:33参照返し+演算子オーバーロードなんですが、なんでこうなるのか
コンパイルの内部的なこと教えてもらえないでしょうか。
P455^456
class Demo{
double d;
public:
Demo(){d = 0.0;}
Demo(double x){d = x;}
Demo& operator=(double x)
{
d = x; return *this;
}
double getd(){return d;}
};
こういう定義されてるクラスがあったんですが、
なんで演算子オーバーロードの所で、returnでポインタの値を返しているのに、
戻り値が&なのですか?
やろうとしていることは、Demoオブジェクトに小数点の値を代入したら、
オブジェクトのメンバ変数dにその値が代入するようにしているのですよね。
0675デフォルトの名無しさん
2006/09/08(金) 23:07:450676デフォルトの名無しさん
2006/09/08(金) 23:13:06ポインタじゃないっていうのはどういうことでしょうか・・・?
thisポインタはこの関数が呼び出されたオブジェクト
つまり、Demoのオブジェクトを指しているポインタじゃないんですか?
どこを調べれば解るようになれますか?
0677デフォルトの名無しさん
2006/09/08(金) 23:14:03でも返しているのは『this』ではなく『*this』だ。
0678デフォルトの名無しさん
2006/09/08(金) 23:24:09*thisにすると何か変わるんでしょうか・・・。
C的にはポインタの指しているアドレスの中身(値)ですよね?
ってことは戻り値はDemoでもいけるんでしょうか・・。
いま試した所確かにコンパイル通りました。
でも、なんで参照返しにしているんですか?
0679デフォルトの名無しさん
2006/09/08(金) 23:29:50なんで、Demo&なんでしょうか・・・。
0680デフォルトの名無しさん
2006/09/08(金) 23:31:32自分自身への参照を返してる。
Demo型を返す理由は、
Demo a(1.0), b, c;
b = c = a; // b、cともに1.0になる
などとできるようにするため。また、参照にすることで無駄な一時オブジェクトが生成されない。
0681デフォルトの名無しさん
2006/09/08(金) 23:46:33ありがとうございます。でも、参照というのがよくわからなくて^^;
その変数の別名。。。?
なんでそれが無駄な一時オブジェクトを生成しないんでしょうか^^;
0682デフォルトの名無しさん
2006/09/08(金) 23:57:38int a;
int& func()
{
return a;
}
これは分かるか?
int* b;
int& func()
{
return *b;
}
これは?
0683680
2006/09/09(土) 00:00:32Demo a, b;
a = b = 1.0; // a, bともに1.0になる
などというようにできる。
Demo& でなく Demoを返すようにすると,、無名のDemoインスタンスが生成されそれが返される。
Demo&だと、元々存在する自分自身を返す為、一時オブジェクトの生成の手間が要らない。
0684デフォルトの名無しさん
2006/09/09(土) 00:11:34int a;
int& func()
{
return a;
}
変数aのアドレスみたいなもの(参照?)を返すってことでしょうか・・。
内部的には、int& some = a;みたいな処理がされてるということでしょうか。。。
int* b;
int& func()
{
return *b;
}
ちょっと解らないです^^;
>>683
>Demo& でなく Demoを返すようにすると,、無名のDemoインスタンスが生成されそれが返される。
>Demo&だと、元々存在する自分自身を返す為、一時オブジェクトの生成の手間が要らない。
解りやすくて嬉しいです。でも上の方の言っている部分が理解できてないようなので、
半分くらいしか理解できません^^;
0685デフォルトの名無しさん
2006/09/09(土) 00:17:37参照はポインタみたいなもの。↓でいろいろ読んでこい。
http://www.google.co.jp/search?q=%e5%8f%82%e7%85%a7+%e3%83%9d%e3%82%a4%e3%83%b3%e3%82%bf
0686デフォルトの名無しさん
2006/09/09(土) 00:31:41>>682のコードを半分理解できるようになりました^^
int a;
int& func()
{
return a;
}
int& fuc() = a;
みたいに参照の変数名が関数になっているということでしょうか?
つまり、その関数を変数aと同じように扱えるという?
だからその関数に代入すると、aの値が変わるのですね・・・?
int* b;
int& func()
{
return *b;
}
ポインタの方がちょっと言葉で説明できません^^;
0687デフォルトの名無しさん
2006/09/09(土) 00:39:580688デフォルトの名無しさん
2006/09/09(土) 00:42:16コードに疑問があるなら書き込む前にコンパイルぐらい試せボケ。
説明できませんとか意味の無い報告は要らん。チラシの裏にでも書いとけ。
0689デフォルトの名無しさん
2006/09/09(土) 01:43:39なかなか的確ですね。
教えるのが上手だと思います。
0690デフォルトの名無しさん
2006/09/09(土) 02:05:09> int a;
> int& fuc() = a;
何度見ても、これ、笑える。
きっとアドレス「演算子と同じ」だろうと考えてるんだろうな・・
0691デフォルトの名無しさん
2006/09/09(土) 02:09:40C++は初学者がけっつまずく要素満載だ。
0692デフォルトの名無しさん
2006/09/09(土) 02:15:18それも、Cだと配列とポインタが曖昧に見えてしまうのが元凶だったねぇ。
0693デフォルトの名無しさん
2006/09/09(土) 02:17:55理屈は通ってるんだが直感的ではないかもだなあ。
0694デフォルトの名無しさん
2006/09/09(土) 02:26:12最近よく思うことは、Cと同じでC++が見えた人(極めた人?)には、
何でも出来るかなり楽しい「言語」なのかなという事。
といって、現時点でかなり普及しているからという観点だから、
C++が廃れて人がいなくなったら他の言語に目がいくんだろうだけどね・・
関係ないけど、Haskellとかすごいパラダイム持ってるし
http://pc8.2ch.net/test/read.cgi/tech/1157227790/166
0695デフォルトの名無しさん
2006/09/09(土) 02:39:31それは間違わなかった。
要素数の差と書いてあるけど、
きっと、話したいのは、
同じ型っていうのは配列型の事なのか?
ポインタと書いている時点で、もうそれは配列とは限らんぞ。
あー、またポインタと配列からやり直しになるのか?
0696デフォルトの名無しさん
2006/09/09(土) 02:43:20大抵のコンパイラなら、その配列から外れた別メモリを指してるのが普通の動作だろう。
0697デフォルトの名無しさん
2006/09/09(土) 03:53:02大抵のコンパイラなら>>662。
x[-1][0]とかx[0][-1]とかx[5][0]なら外れるだろうけどねぇ。
0698デフォルトの名無しさん
2006/09/09(土) 05:18:010699デフォルトの名無しさん
2006/09/09(土) 06:45:59同じようにいじれるというのは、ややこしいところ、
というよりはむしろ C の利点だよな。
C++ の参照って、Java や C# におけるいわゆる参照型
とは違うものだから、すでに他言語を知っている人には
余計に説明しづいらい。参照がやれることは本質的には
ポインタと変わらないので、シンタックスシュガーだと
言えないこともないけど、それを越えてあまりある
表記の便利さがあるよな。
あ、でも参照は「参照しない」ということが許されないから
ポインタとはその辺の能力が違うか。
0700デフォルトの名無しさん
2006/09/09(土) 06:58:33foo(*(int*)NULL);
0701デフォルトの名無しさん
2006/09/09(土) 07:07:34参照が本当に何らかの有効なオブジェクトを指しているか
否かの判定は &n が NULL か否かを見ることになるから、
やっぱり本質的な能力としてはポインタと同じか。
0702デフォルトの名無しさん
2006/09/09(土) 07:10:270703デフォルトの名無しさん
2006/09/09(土) 07:34:41参照し直せないところがキモだな。
0704デフォルトの名無しさん
2006/09/09(土) 08:17:17ヌルをデリファレンスした時点で未定義動作。
& によるチェックは意味を成さない。
0705デフォルトの名無しさん
2006/09/09(土) 08:39:38a null reference cannot exist in a well-defined program,
because the only way to create such a reference would
be to bind it to the “object” obtained by dereferencing
a null pointer, which causes undefined behavior.
ということだな
0706デフォルトの名無しさん
2006/09/09(土) 08:40:30http://en.wikipedia.org/wiki/Reference_(C++)
0707デフォルトの名無しさん
2006/09/09(土) 12:32:11自作のDLLとそれを使用する実行ファイルを作成しています。
DLLを使用するには、実行ファイルと同じフォルダにDLLをおかなければエラーになりますが、
DLLを別のフォルダに置いて使用する方法はありますか?
具体的には、C:\Test\Exec.exeからC:\Test\bin\DLL.dllを使用するようにしたいのです。
開発環境はVisualStudio.net2003。言語はCです。
現在、ライブラリは#pragma comment (lib, "DLL.lib")で使用しています。
0708デフォルトの名無しさん
2006/09/09(土) 12:37:090709デフォルトの名無しさん
2006/09/09(土) 13:05:070710デフォルトの名無しさん
2006/09/10(日) 11:19:56typedef int (*HogeFunc)(unsigned int, ... );
みたいな感じで………。
0711デフォルトの名無しさん
2006/09/10(日) 11:22:280712デフォルトの名無しさん
2006/09/10(日) 14:37:56とあったのですが、&をつけないのは文字列の場合で、数列の場合は必要でいいのでしょうか?
0713デフォルトの名無しさん
2006/09/10(日) 14:41:370714デフォルトの名無しさん
2006/09/10(日) 14:41:42「配列の場合は付けない」でいいです。
0715デフォルトの名無しさん
2006/09/10(日) 14:46:30変数の前に&付けると何を意味するか分かってる?
配列名が何を指しているか分かってる?
0716デフォルトの名無しさん
2006/09/10(日) 15:09:57遅レスだけど、多重ループ抜けるには多重ループ全体を関数化する。
void LoopFunc()
{
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++)
{
if (gonyo gonyo) return;
}
}
}
そうすればどこでも好きなところから全体を抜けられる。
0717712
2006/09/10(日) 15:19:240718デフォルトの名無しさん
2006/09/10(日) 15:32:27どの程度分からないのか言えよな。
一から百まで全く分からないのか、どこか一部が分からないのか。
0719712
2006/09/10(日) 15:47:120720デフォルトの名無しさん
2006/09/10(日) 15:54:00いや、まあ、その、なんだ。
それなりの再利用性があるなら、そういう選択は有りなんだろうが、
goto憎しでそこまでやる奴は、そもそもCから宗旨替えした方が
自分にとっても周りにとっても幸せな気が。
0721712
2006/09/10(日) 15:55:440722デフォルトの名無しさん
2006/09/10(日) 15:57:00寧ろそれが分からないお前には問題がある
習ってないならこれ以上突っ込まずに後回しにしとけ
0723デフォルトの名無しさん
2006/09/10(日) 16:06:080724デフォルトの名無しさん
2006/09/10(日) 18:12:040725デフォルトの名無しさん
2006/09/10(日) 18:14:360726デフォルトの名無しさん
2006/09/10(日) 18:24:18printf()だってポインタを使うじゃない。
0727デフォルトの名無しさん
2006/09/10(日) 18:33:51ポインタを全く使うなと言われるとC言語使えないじゃん。
0728デフォルトの名無しさん
2006/09/10(日) 18:59:10変数varにおいて&varは変数varのアドレスを指す
配列arr[]においてarrは配列の先頭アドレスを指す → &(arr[0])と同じ
利便性からそうなっているのか、これはCの決まり事
(配列の各要素は連続したメモリ上にあるので、
配列の先頭アドレスは頻繁に使われる(先頭アドレスから全要素を特定できる)
頻繁に使うんで&arr[0]などという記述は非常にめんどうい)
scanfはこのアドレス(メモリ)に値を取得しろ、って命令
アドレスとは何か、ってのは後で教えてくれるから大丈夫
0729デフォルトの名無しさん
2006/09/10(日) 19:06:49Cの関数では引数は値渡しになるとか、いろいろ説明しないと
「アドレスを渡す場合とそうでない場合とどう区別するか」とか
なかなか「&」を付ける理由の説明にならんのいねぇ。
0730デフォルトの名無しさん
2006/09/10(日) 19:09:48>通常scanfでは変数の前に&をつけるが、配列の場合はつけない
今は↑に対する答えを何となく理解してもらえばいいんじゃないか
0731デフォルトの名無しさん
2006/09/10(日) 19:15:59でも
「変数の前に&つけるとその変数のアドレスになるんだよー」
「配列の名前だけだと、その先頭の要素のアドレスになるんだよー」
ってのは判ってて欲しいよね。
0732デフォルトの名無しさん
2006/09/10(日) 19:41:56どうすればいいのでしょうか?
#include "ts21tf.h"
とやったのですが「インクルード ファイルがオープンできません。'ts21tf.h':
No such file or directory」と言われます。
多分、"ts21tf.h"のパスを教えてやらなければいけないと思うのですが、
どうやったらいいのでしょうか?
そもそもstdio.hなんかはどこに入っていて、どうして#include "stdio.h"
って書くだけでインクルードできるのか、参考書を何冊読んでも書いてあ
りません。。。って言う初心者なんですが、よろしくお願いします。
0733デフォルトの名無しさん
2006/09/10(日) 19:55:43規格では、コンパイラが内部に持っていることすら許されるんだから。
で、VC++の場合は環境変数INCLUDEを参照している。
#include "xxx" で読み込むのは、カレントディレクトリと処理系既定のディレクトリ。
0734デフォルトの名無しさん
2006/09/10(日) 19:58:36OS部門では、頑張って「フォルダ」という名前をデフォにしようとしているけど
コンパイラのメッセージはdirectoryのままなのね。
0735デフォルトの名無しさん
2006/09/10(日) 20:08:53アンカーミスったうえにその発言か。
挙げた程度の解決策もでてきてなかったから選択肢として出したんだが。
キミはちょっと被害妄想が過ぎるようだ。
0736デフォルトの名無しさん
2006/09/10(日) 20:10:13プロジェクト
設定
C/C++
カテゴリ:プリプロセッサ
インクルードファイルのパス
ここに書く
複数あるときは;で区切って書く
0737デフォルトの名無しさん
2006/09/10(日) 20:11:14別に頑張ってるわけでもないんじゃね。
フォルダって別にMSが言い始めた言葉でもないし。
0738デフォルトの名無しさん
2006/09/10(日) 20:11:25arrと&(arr[0])は値は一緒だが意味が違う
0739デフォルトの名無しさん
2006/09/10(日) 20:20:28そりゃ、appleとかのが先だが
DOSやWin3.1の頃は、フォルダなんて呼び方は誰一人してなかった。
0740デフォルトの名無しさん
2006/09/10(日) 20:20:39定数だし。
0741デフォルトの名無しさん
2006/09/10(日) 20:56:290742デフォルトの名無しさん
2006/09/10(日) 21:01:140743デフォルトの名無しさん
2006/09/10(日) 21:03:120745デフォルトの名無しさん
2006/09/10(日) 21:15:420746デフォルトの名無しさん
2006/09/10(日) 21:24:10漏れは10年以上前からVC使ってるが
ダイアログでの場所は今日初めて発見した
0747デフォルトの名無しさん
2006/09/10(日) 21:24:430748デフォルトの名無しさん
2006/09/10(日) 22:17:070749デフォルトの名無しさん
2006/09/10(日) 22:30:02ハァ?
0750デフォルトの名無しさん
2006/09/10(日) 22:56:25背景色で塗ることは出来ませんか?
CButton m_button;
m_button.Create(m_hWnd,CRect(50,50,100,80),NULL,WS_CHILD|WS_VISIBLE ,0);
0751デフォルトの名無しさん
2006/09/10(日) 23:30:050752デフォルトの名無しさん
2006/09/10(日) 23:37:33どんな違い?
0753デフォルトの名無しさん
2006/09/10(日) 23:42:38int array[5];
printf("%d\n", sizeof(array));
printf("%d\n", sizeof(&array[0]));
0754デフォルトの名無しさん
2006/09/10(日) 23:44:120755デフォルトの名無しさん
2006/09/10(日) 23:45:28それを屁理屈だと言うお前は凄い
0756デフォルトの名無しさん
2006/09/10(日) 23:47:45初心者に簡潔に教える事に必要とも思えないが
0757デフォルトの名無しさん
2006/09/10(日) 23:49:070758デフォルトの名無しさん
2006/09/10(日) 23:50:03Windowsシェル(エクスプローラなど)では、
マイコンピュータなどディスク上のディレクトリでないものもフォルダと呼ぶことを、
748は言いたいのだと思う。
フォルダ⊇ディレクトリ
>>752
「配列→先頭要素へのポインタ」への変換が行われる前は、まだarrは配列型。
0759デフォルトの名無しさん
2006/09/10(日) 23:52:55>「配列→先頭要素へのポインタ」への変換が行われる前は、まだarrは配列型。
これは具体的にどういった意味を持つのですか?
0760デフォルトの名無しさん
2006/09/11(月) 00:02:00array は int (*)[5]
&array[0] は int *
0761デフォルトの名無しさん
2006/09/11(月) 00:08:180762デフォルトの名無しさん
2006/09/11(月) 00:11:560763デフォルトの名無しさん
2006/09/11(月) 00:17:240764デフォルトの名無しさん
2006/09/11(月) 00:18:12int main(int ac, char *av[])
{
int array[5];
int *p;
int (*q)[5];
p = array;
p = &array[0];
q = &array;
q = &(&array[0]);
return 0;
}
$ gcc a.c
a.c: In function `main':
a.c:14: error: invalid lvalue in unary `&'
0765デフォルトの名無しさん
2006/09/11(月) 00:18:470766デフォルトの名無しさん
2006/09/11(月) 00:25:560767デフォルトの名無しさん
2006/09/11(月) 00:27:360768デフォルトの名無しさん
2006/09/11(月) 00:34:23違う、arrayはint [5]。
0769デフォルトの名無しさん
2006/09/11(月) 00:35:310770デフォルトの名無しさん
2006/09/11(月) 00:36:400771デフォルトの名無しさん
2006/09/11(月) 00:37:43ネタにマジレス
0772デフォルトの名無しさん
2006/09/11(月) 00:38:020773デフォルトの名無しさん
2006/09/11(月) 00:39:360774デフォルトの名無しさん
2006/09/11(月) 00:40:150775デフォルトの名無しさん
2006/09/11(月) 01:10:40: : : : : /:,ハ } : : / : : : : : : : : : : : : : : : : : : : \: : i
: : : : : : : : :},.イ: : /. : : : : : : : : : : : : :ヽ : : : : : : : :\l
: : : : : : : :/ /: / : : : : : : : : : : : : : : ', : : : : : : : 、:ヽ
: : : : : : :/ノ: : / : : : : : : :/ : : : /: j: l: : l: ', : 、 : : : ヽ: :',
!: : : : : ,'、 : : ,' ,': : : : : : / /: : /: /j: !: : }斗‐‐',: : : !: i: :l
',: : : : :l : `ー! !: : : : : :/_厶∠∠.//l: :,ハ,ニ=ァ'i: :l :l: :}:lノ
: '、 : : l:\_ r{ {: : : : : :{´{=_;;云ァァ' ,ノノ 仂jイ}/: /:/ //
: : ヽ: :lヽ : :{ ヾ\ : ‐=f壬辷'丿; ゚ー〈ノ/ノイ´
: : :',:ヽl : \\ |\: {´¨''¬'"´ ` ``}: :l : :i:l バ カ ば っ か
: : : ',: :ヽ: : :`7`T|: : l`ー ヽヽヽ (_ア ,.イ: :.:l : :i l
: : : :.',: : :ヽ : {{ 「゙|: : |、ヽ、_ ,.イ: :l : :.l : :i l
: : : : :'、: : :ヽrく '、: '、\ `T¬ーrく: :! : !.:.:.:l : :i: l
: : : : : ヽ : : : ヽ \ヽ :ヽ \,ハ. ヽハ: : :| : :.l : :i: |
0776デフォルトの名無しさん
2006/09/11(月) 04:31:12switch(xxx){
a: hoge; break;
b: foo; break;
}
}
というコードで、bの場合にのみ、whileのループも抜けたい場合は
どう記述したらいいのでしょうか。
0777デフォルトの名無しさん
2006/09/11(月) 04:38:49goto
0778デフォルトの名無しさん
2006/09/11(月) 04:41:04gotoしかないでしょうか、、gotoは使いたくないのですが。
0779デフォルトの名無しさん
2006/09/11(月) 04:42:35flag = true;
while (flag) {
flag = false;
}
0780デフォルトの名無しさん
2006/09/11(月) 04:43:40関数にしておき、returnとか。まあそういうダーティな方法しかない。
0781デフォルトの名無しさん
2006/09/11(月) 04:50:330782デフォルトの名無しさん
2006/09/11(月) 04:53:14会社とかでgoto使って書いてもいいのでしょうか?
flagはいい方法ですね。
みなさま、ありがとうございます。
0783デフォルトの名無しさん
2006/09/11(月) 04:57:33>while(1){
これはどうなんだ?
ループを抜ける基本的な条件ないのか?
0784デフォルトの名無しさん
2006/09/11(月) 04:59:160785デフォルトの名無しさん
2006/09/11(月) 05:00:08フラグなんて使うなよ。
良い方法でもなんでもない。
素直にgoto使いなさい。
0786デフォルトの名無しさん
2006/09/11(月) 05:03:15関数にして return は、関数にする意味があればやってもいいが、
そうでなければいい解決法とは思わない。
goto は、使用箇所は限定されるが、ごく普通に使う。
goto を意味なく嫌う人は、思考停止してるだけ。
goto をなるべく使いたくないのは確かだが、
goto を使うのがベストな状況なら、使うべき。
まあ、本来は goto が必要ないような言語仕様にすべきだとは思うんだけどね。
C/C++ がそういう言語仕様になってないんだから仕方が無い。
0787デフォルトの名無しさん
2006/09/11(月) 05:03:39もし本当にあのプログラムならswitchじゃなくif文にしなさい。
0788デフォルトの名無しさん
2006/09/11(月) 05:11:100789デフォルトの名無しさん
2006/09/11(月) 05:11:27無視して使ってると最悪イジメにあう。
部署が代わるまでガマンだ。
0790デフォルトの名無しさん
2006/09/11(月) 05:31:310791デフォルトの名無しさん
2006/09/11(月) 05:37:40ありがとうございました。
0792デフォルトの名無しさん
2006/09/11(月) 07:44:180793デフォルトの名無しさん
2006/09/11(月) 08:55:37使用により芸術的かつ簡潔にコーディングが成せる場合に限り
堂々と躊躇無く自信を持って使用する。
gotoはドラマにおけるハイライトである。
ドラマのハイライトを日常で安易に演じれば
単なるスタンドプレイに陥り恥ずかしく痛い奴に成り下がる危険がある。
よって、知性と精神を総動員して、注意深く且つ揺るぎ無き強い意思を持ってそこに刻み込む。
0794デフォルトの名無しさん
2006/09/11(月) 09:21:300795デフォルトの名無しさん
2006/09/11(月) 09:31:310796デフォルトの名無しさん
2006/09/11(月) 09:39:400797デフォルトの名無しさん
2006/09/11(月) 09:56:240798デフォルトの名無しさん
2006/09/11(月) 10:17:130799デフォルトの名無しさん
2006/09/11(月) 10:23:47ディレクトリ内のファイル一覧を作成する処理(getqって関数)で、
ファイルの情報を記録する配列のメモリをmallocで確保して
reallocで拡張するような仕組みがあります。
解せない点は2つです。
1.ファイルのリストを記録する配列を確保する際の初期要素数として、
ディレクトリに対してfstatを掛けて取得したファイルサイズ/24を採っているのですが、
これはどういう根拠でこうしているのか。
Linuxだと常に0になると思うけど、そうではない環境があるのでしょうか。
2.上記配列が足りなくなった時にreallocで拡張しているけど、
毎回、その時に走査していたファイルのサイズ/12を拡張後の要素数としている。
わけわかりません。これでいい環境があるのでしょうか。
ちなみに、うちの環境(Linux2.4系)だと2.が原因で当然のようにSEGVを起こします。
0800デフォルトの名無しさん
2006/09/11(月) 11:20:16分かってるならこのスレでも騒がないように
0801デフォルトの名無しさん
2006/09/11(月) 11:29:29少なくともソースへのリンクを示してもらわんとな・・・
0802799
2006/09/11(月) 11:35:47ソースを転載するのはライセンス上どうかと思ったので、tarボールで失礼します。
http://prdownloads.sourceforge.net/lpr/gnulpr-1.0.1.tar.gz?use_mirror=jaist
0803デフォルトの名無しさん
2006/09/11(月) 12:18:45dir entryの内部構造は良く知らないけど、最低block sizeになると思うけど。
ちなみに以下の環境ではstbuf.st_sizeは4096だったよ。
Fedora Core5
Linux * 2.6.16-1.2133_FC5 #1 Tue Jun 6 00:52:14 EDT 2006 i686 i686 i386 GNU/Linux
Montavista Linux
Linux * 2.4.17_mvl21 #24 2004年 10月 19日 火曜日 17:17:03 JST ppc unknown unknown GNU/Linux
0804デフォルトの名無しさん
2006/09/11(月) 12:20:160805デフォルトの名無しさん
2006/09/11(月) 12:41:03同じくdir entryに詳しくないので、想像を交えて。
>1.ファイルのリストを記録する配列を確保する際の初期要素数として、
>ディレクトリに対してfstatを掛けて取得したファイルサイズ/24を採っているのですが、
>これはどういう根拠でこうしているのか。
ディレクトリ内のファイルひとつのdir entryが最小で24バイトだからでは。
> 2.上記配列が足りなくなった時にreallocで拡張しているけど、
> 毎回、その時に走査していたファイルのサイズ/12を拡張後の要素数としている。
> わけわかりません。これでいい環境があるのでしょうか。
「ファイルサイズ/12」と考えると良く分からないけど、「dir entryが最小サイズだった
場合の個数*2」を確保してると考えるとわかりやすいと思う。一度拡張されるときに
余裕をもってメモリを用意しておく戦略。STLでも使われてる。
0806799
2006/09/11(月) 13:14:55レスありがとうございます。おおむね解決しました。
1.については、確かに803でおっしゃるようにディレクトリエントリの
サイズが得られるのが普通のようです。
今回の私の環境では、対象ディレクトリがtmpfs上にあったことが原因でした。
tmpfs上のディレクトリにfstatを掛けると、サイズは必ず0が返るようです。
MontavistaLinux3.0で確認しました。
2.については、バグだったようです。どっかのブランチで修正されてるようでした。
805でおっしゃるようにサイズを2倍に拡張する意図だったのは間違いないようですが、
ディレクトリを開く時のfstatでのstat構造体を
ファイルをリストアップする時のstatで使いまわしていたので、
間違ったサイズで計算してしまっているようです。
おかげさまですっきりしました。ほんとにありがとうございます。
0807デフォルトの名無しさん
2006/09/11(月) 13:47:33ファイル操作関数群をまとめたいと思い、プログラムを書き始めましたが
fopen();のところで以下のメッセージがMessageBoxで出ます。
test.exe の 0x0041151b でハンドルされていない例外が発生しました:
0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。
fopen関係でぐぐりましたが、有効な解決策が見つかりません。
どうか救いの手を差し伸べてください(+д+)マズー
-----------------------
File.cpp
boolOpenFile( FILE **fp, LPSTR lpMode, LPSTR lpFileName )
{
*fp = fopen( lpFileName, lpMode );
return true;
}
------------------------
Main.cpp
FILE**fp = NULL;
OpenFile( fp, "r", "text.txt" );
0808デフォルトの名無しさん
2006/09/11(月) 13:52:36Main.cpp
FILE* fp;
OpenFile(&fp, 以下略
0809デフォルトの名無しさん
2006/09/11(月) 13:53:13OpenFile(&fp, "r", "text.txt" );
0810デフォルトの名無しさん
2006/09/11(月) 14:17:53>809
どうもありがとうございましたm(__)m
ポインタのポインタの意味が少し分かったようなギガする。。
0811デフォルトの名無しさん
2006/09/11(月) 16:11:43*fp = (FILE *)malloc(sizeof(FILE *));
OpenFile( fp, "r", "text.txt" );
〜〜〜〜
free(*fp);
0812デフォルトの名無しさん
2006/09/11(月) 17:11:27C++で構造体VECTOR2を作成しています。
この構造体の中に関数を入れて、演算子による動作を設定したいのですが
うまく行きません。
struct VECTOR2{
float x;
float y;
VECTOR2 operator-(VECTOR2 op2)
{
x -= op2.x;
y -= op2.y;
}
bool opEquals(VECTOR2 op2) {
return (x == op2.x && y == op2.y);
}
}
ご指摘お願いします。
0813デフォルトの名無しさん
2006/09/11(月) 17:29:42・どう巧くいかないのか。
*エラーが出たならエラーメッセージ
*期待する動作と異なるなら、それらの動作
・環境は何か。
#この場合は必要ないだろうが念の為。
0814デフォルトの名無しさん
2006/09/11(月) 17:32:02書き方は普通に問題ないのでしょうか?
EXITのあとに;をつけないとエラーになるのがちょっと気になるのですが…
for(i=0;i<a;i++){
for(j=0;j<b;j++){
for(k=0;k<c;k++){
if( hoge ){
goto EXIT;
}
}
}
EXIT:
;
}
0815デフォルトの名無しさん
2006/09/11(月) 17:34:01ラベルEXIT:の後に;を付けないとエラーになるのが気になる
です。
0816デフォルトの名無しさん
2006/09/11(月) 17:43:270817デフォルトの名無しさん
2006/09/11(月) 17:50:20それとも以下のように毎回フラグ変数を用意するような感じが
一般的なのでしょうか?
if( hoge ){
flag = TRUE;
break;
}
}
if( flag ){
break;
}
}
}
0818デフォルトの名無しさん
2006/09/11(月) 17:51:47VECTOR2 a, b, c; で c = a-b; とし、 c.x == a.x-b.x; c.y == a.y-b.y; となる動作を期待してる
のかな?
struct VECTOR2 {
float x, y;
};
VECTOR2 operator-(VECTOR2 a, VECTOR2 b) { a.x -= b.x; a.y -= b.y; return a; }
0819812
2006/09/11(月) 18:11:49返り値戻して無かっただけでした。自己解決しました。すんません
0820デフォルトの名無しさん
2006/09/11(月) 18:12:170821デフォルトの名無しさん
2006/09/11(月) 18:18:17その程度、メンバ関数で充分だ。
>>817
どっちの方が読みやすいと思う?
特にコーディングルールなどに縛られないなら読みやすい(≒シンプル)と思う方にしておけ。
0823デフォルトの名無しさん
2006/09/11(月) 18:42:53operator -=をメンバで定義して、非メンバでoperator -をという具合に。
0824デフォルトの名無しさん
2006/09/11(月) 18:46:17実際 812 のコードだと 副作用おこしてるしね。
実質 a-=b と同じことになってる
0825デフォルトの名無しさん
2006/09/11(月) 19:08:09hoge.h 内で
float hoge(int hoge)
{
return hoge++;
}
のようにグローバル関数をつくって、
hoge.hをインクルードしたクラスで使えるようにしたいのだが、
他のオブジェクトで既に定義されていると言われた。
ちなみにどのクラスでも、
#program once
#include "hoge.h"
としているので2重でインクルード読込むことはないはずなのだが・・。
0826デフォルトの名無しさん
2006/09/11(月) 19:18:26>#program once
これはなんだ?
0827デフォルトの名無しさん
2006/09/11(月) 19:44:31「二重インクルードはしちゃダメ」って聞いて、意味も分からず使ってない?
今回の問題はそこじゃないよ。
一つの翻訳単位(つまり一つのソースファイル)でhoge.hを複数回インクルードするのを
防止したいというのが、二重インクルード防止。
aaa.c と bbb.c でそれぞれ hoge.h を一回ずつインクルードするのは防げないから、
aaa.o と bbb.o の両方に同名の関数が定義されたことになって、リンクしたらエラーになる。
関数の実体はどれか一つのソースだけにあればいいから、
hoge.c (新しいソースでもいいし、既存のどれかのソースでもいい)に関数定義を移動。
hoge.h には関数のプロトタイプ宣言だけ書く。
にすればいい。
関数定義にstaticつけるとかinline関数にするというのもあるけど、
まずは基本的なことから理解したほうがいいと思う。
あと、そもそも #pragma once (の間違いだよね)の使い方を間違ってる。
これはhoge.h の頭に書くもの。
0828デフォルトの名無しさん
2006/09/11(月) 19:56:39あるファイルで
int Fund() { return 0; }
とあり、別のファイルで
int Fund() { return 1; }
とあったらリンカはどっちリンクしていいか困るよね。
仮に戻り値が同じであってもやはりどっちリンクしていいか困るわけだ。
関数の実体はリンクするファイルの中に複数あってはならない。
0829デフォルトの名無しさん
2006/09/11(月) 20:05:45> とあったらリンカはどっちリンクしていいか困るよね。
困らないよ。
0830825
2006/09/11(月) 20:15:45無事解決しました。
未だにプロトタイプ宣言と関数定義の違いがわかりませんが、
ようは宣言は何回でもいいけど、実装は一つにしろってことですね。
しかし、構造体宣言のなかで関数を書いた場合は・・実装になるの?
0831デフォルトの名無しさん
2006/09/11(月) 20:17:36http://msdn2.microsoft.com/ja-jp/library/72zdcz6f.aspx
0832デフォルトの名無しさん
2006/09/11(月) 20:18:19#includeの意味も宣言と定義の意味も全部書いてある。
ただ、中には char a = 'あ'; みたいな本もあるらしいから
そういうのは捨てろ。
0833750
2006/09/11(月) 20:21:09ダイアログフォームならボタンの背景グレーになってるんだけど、
普通のウィンドウだとボタンの背景が白なんよ。
ココで言う背景ってのは、たとえばXPスタイルのボタンとかだと角が丸いよね
その丸い部分の外側。外接する四角との隙間のことです。
CButton m_button;
m_button.Create(m_hWnd,CRect(50,50,100,80),NULL,WS_CHILD|WS_VISIBLE ,0);
なぜなぜ!?!?
0834デフォルトの名無しさん
2006/09/11(月) 20:28:23# Layerd window かもしれんけど
0835750
2006/09/11(月) 21:35:41└ViewWindow -- Gray
└Button -- ココ
FrameWindowの背景色をGrayに設定してもダメでした。
と、色々試行錯誤してたら出来ました。
GetWndClassInfo()で背景色設定してたんですけど、これをDECLARE_WND_CLASS_EXで設定するようにしたらOKになりました。
ありがとうございました。
0836デフォルトの名無しさん
2006/09/11(月) 22:22:53これってどういう風に解釈すればいいのでしょうか?
0837デフォルトの名無しさん
2006/09/11(月) 22:29:42http://kmaebashi.com/programmer/pointer.html
p is pointer to function returning pointer to array of int.
pは、intの配列へのポインタを返す関数へのポインタ。
0838デフォルトの名無しさん
2006/09/11(月) 22:30:01か?
0839デフォルトの名無しさん
2006/09/11(月) 22:36:070840デフォルトの名無しさん
2006/09/11(月) 22:42:10int *(*p)(void)[5]
こうじゃないか?
0841デフォルトの名無しさん
2006/09/11(月) 22:46:34それじゃあ*より[]の方が優先度が高いので、意味が変わっちまう。
0842デフォルトの名無しさん
2006/09/11(月) 22:49:110843デフォルトの名無しさん
2006/09/11(月) 22:50:30関数int * func(void)
が5個。
のまちがえ。
0844デフォルトの名無しさん
2006/09/11(月) 22:56:12それだったら
int *(*p[5])(void); じゃね?
>>840は
p is a pointer to function (void) returning array[5] of pointer to int
つまりint型へのポインタを5個持つ配列を返す引数voidの関数へのポインタでわ?
0845デフォルトの名無しさん
2006/09/11(月) 22:59:210846デフォルトの名無しさん
2006/09/11(月) 23:02:27嘘付けぇこれが通るのをどう説明するつもりだぁ
int *(*p[5])(void);
int *func1(void);
int *func2(void);
int i;
int main()
{
p[0] = func1;
return 0;
}
int *func1(void)
{
return &i;
}
int *func2(void)
{
return &i;
}
0847デフォルトの名無しさん
2006/09/11(月) 23:04:080848デフォルトの名無しさん
2006/09/11(月) 23:04:27837のリンク先を読み返してから出直せ。
0849デフォルトの名無しさん
2006/09/11(月) 23:05:11実際に使用するときはtypedefして欲しい。
少なくとも俺はそうなっているものじゃないと、読む気がしない。
でもたまに必要になるが。
0850デフォルトの名無しさん
2006/09/11(月) 23:06:300851デフォルトの名無しさん
2006/09/11(月) 23:10:17int (*(func1(void)))[5];
int i[5];
int main()
{
p = func1;
return 0;
}
int (*(func1(void)))[5]
{
return 0;
}
0852デフォルトの名無しさん
2006/09/11(月) 23:11:08p is a pointer to function (void) returning pointer to array[5] of int
~~~~~~~~~~~
0853デフォルトの名無しさん
2006/09/11(月) 23:11:420854デフォルトの名無しさん
2006/09/11(月) 23:12:06×return 0;
○return &i;
0855デフォルトの名無しさん
2006/09/11(月) 23:18:09んー・・・・
beam is a function (int, pointer to function void(int)) returning pointer to function void(int)
0856デフォルトの名無しさん
2006/09/11(月) 23:24:44ところで、>>836は自分で創作しただろ。
コンパイル可能なのか?
0857デフォルトの名無しさん
2006/09/11(月) 23:25:58#include <stdio.h>
void func(int i);
void (*beam(int arg, void (*func)(int)))(int);
int main(void)
{
beam(1, func);
return 0;
}
void func(int i)
{
printf("func(%d)\n", i);
}
void (*beam(int arg, void (*func)(int)))(int)
{
printf("arg = %d\n", arg);
func(2);
return func;
}
0858デフォルトの名無しさん
2006/09/11(月) 23:32:58こういう事だろ。
#include <stdio.h>
int (*(*p)())[5]; // p is a pointer ti function () returning pointer to array[5] of int
int (*func1())[5];
int i[5];
int j = 12345;
int main(void)
{
p = func1;
i[0] = j;
printf("%d\n", *p()[0]);
return 0;
}
int (*func1())[5]
{
return &i;
}
0859デフォルトの名無しさん
2006/09/11(月) 23:35:14#include <stdio.h>
int (*(*p)())[5]; // p is a pointer ti function () returning pointer to array[5] of int
int (*func1())[5];
int i[5];
int main(void)
{
p = func1;
i[0] = 12345;
i[1] = 56789;
printf("%d\n", (*p())[0]);
printf("%d\n", (*p())[1]);
return 0;
}
int (*func1())[5]
{
return &i;
}
0860デフォルトの名無しさん
2006/09/11(月) 23:38:34C++で作ったEXEファイルをWEBページから起動するというプログラムをC++で作ることは可能でしょうか?
ご教示お願いします。
0861デフォルトの名無しさん
2006/09/11(月) 23:39:42ActiveX
0862デフォルトの名無しさん
2006/09/11(月) 23:47:22>>859
↑と、下記はint (*(*p)())[5]の解釈は同じ?
#include <stdio.h>
int (*(*p)())[5];
int (*func1())[5];
int i[][5]= {{0,1,2,3,4},{5,6,7,8,9}};
int main(void) {
p = func1;
printf("%d\n", *p()[1]);
return 0;
}
int (*func1())[5]{return i;}
0863デフォルトの名無しさん
2006/09/11(月) 23:53:12二次元配列と配列へのポインタを混同したら危ないですよ。
この場合はiは int[5]へのポインタとして解釈されています。
だから*p()[1]でi[1][0]が出力されます。
しかし、私も勘違いしていたように、*p(){1]という書き方では、
二次元配列を返す場合はいいですが、一次元配列へのポインタを
返すと、おかしな事になります。
そこで(*p())[1]と書いたのです。
0864デフォルトの名無しさん
2006/09/11(月) 23:55:33ご教示ありがとうございます。
また、以前オセロゲームについて意見していただいた方、本当にありがとうございました。
0865デフォルトの名無しさん
2006/09/12(火) 00:05:09これは関数なのか、なんなんだ?
int (*func1())[5]
{
return i;
}
0866デフォルトの名無しさん
2006/09/12(火) 00:07:15関数ですよ。もし
int *func1()[5]
と書いてコンパイルしたら、「関数は配列を返せない」等のエラーが出るはずです。
0867デフォルトの名無しさん
2006/09/12(火) 00:17:10なんか、不思議だな〜
見た事無いのは俺だけか?
ちょっとわからん。
0868デフォルトの名無しさん
2006/09/12(火) 00:19:26関数名にカッコを付けても意味が変わらなければエラーは出ません。
難しいのは、Cの演算子の優先順位と適用方向がゴチャゴチャだからです。
0869デフォルトの名無しさん
2006/09/12(火) 00:22:50単に配列のポインタ返すだけなら下記でもよさそうですよね。
わざわざ関数の宣言に要素数が入っているのは何故でしょう?
要素数が入ることで下記と何が変わるのでしょうか?
int i[5]= {0,1,2,3,4};
int *(*p)();
int *func1(){return i;}
int main(void) {
p = func1;
printf("%d\n", p()[1]);
return 0;
}
0870デフォルトの名無しさん
2006/09/12(火) 00:27:50ご存じの通りCでは二次元配列以上の場合、最初の次元以外は
要素数を省略した定義や宣言が出来ません。
ご呈示いただいたソースでは、あくまでもintへのポインタ、もしくは
一次元配列を返す、と読めます。
次元が付いていると、二次元配列を返す事が出来るようになります。
私のソースでは二次元配列ではなく、配列へのポインタを返すように
しました。(どちらでも同じですけど)
だから、*p()[1]は、i[5]をアクセスする事になります。i[1]ではありません。
0871デフォルトの名無しさん
2006/09/12(火) 01:34:48やっぱJavaのほうがいい
int[] meth(), int[][] meth() はCと意味違うけど
0872デフォルトの名無しさん
2006/09/12(火) 01:39:170873デフォルトの名無しさん
2006/09/12(火) 01:52:160874デフォルトの名無しさん
2006/09/12(火) 08:51:390875デフォルトの名無しさん
2006/09/12(火) 09:39:49もんもん万歳!
0876M$
2006/09/12(火) 12:07:19Vistaはええぞー。
ゲーシ様、マンセー!
0877デフォルトの名無しさん
2006/09/12(火) 13:12:020878デフォルトの名無しさん
2006/09/12(火) 16:03:38キー入手するの面倒くさいし
再インストールしたらまた使えるか?
0879デフォルトの名無しさん
2006/09/12(火) 16:16:480880デフォルトの名無しさん
2006/09/12(火) 20:04:00値引数←これってなんて読むんですか?w
スレ違い?
0881デフォルトの名無しさん
2006/09/12(火) 20:10:140882デフォルトの名無しさん
2006/09/12(火) 20:13:12ちなみに、
「値渡し」は「あたいわたし」
「引数」は「ひきすう」
と読む。
「あたいわたし」というのは
女言葉の「自分自分」とは、ちょっとだけ違うので注意。
0883デフォルトの名無しさん
2006/09/12(火) 20:14:52∨
___ _
/ ____ヽ /  ̄  ̄ \
| | /, −、, -、l /、 ヽ きみ頭だいじょうぶ?
| _| -|○ | ○|| |・ |―-、 |
, ―-、 (6 _ー っ-´、} q -´ 二 ヽ |
| -⊂) \ ヽ_  ̄ ̄ノノ ノ_ ー | |
| ̄ ̄|/ (_ ∪ ̄ / 、 \ \. ̄` | /
ヽ ` ,.|  ̄ | | O===== |
`− ´ | | _| / |
0884デフォルトの名無しさん
2006/09/12(火) 20:18:100885デフォルトの名無しさん
2006/09/12(火) 20:19:44読み方が書いてないのです。
ものすごい本読みにくいので
誰か教えてほしいです。
0887デフォルトの名無しさん
2006/09/12(火) 20:29:400889デフォルトの名無しさん
2006/09/12(火) 21:20:020890880
2006/09/12(火) 21:23:22でいいそうです。
みなさんありがとうです
0891デフォルトの名無しさん
2006/09/12(火) 21:58:39そんな餌でクマー(AA略
0892デフォルトの名無しさん
2006/09/12(火) 22:03:230893デフォルトの名無しさん
2006/09/12(火) 22:08:24int a;
char b[256];
} foo_t;
typedef struct bar {
int c;
int d;
foo_t *hoge;
} bar_t;
ってな構造体があって、
bar_t *xxx;
int n = 100;
xxx->hoge = (foo_t *)malloc(sizeof(foo_t)*n);
ってやったとき、任意のfoo_tのb[256]にはどうやって
アクセスすれば良いのでしょうか?
0894デフォルトの名無しさん
2006/09/12(火) 22:11:18って256にアクセスしちゃだめだろ
0895デフォルトの名無しさん
2006/09/12(火) 22:14:14こういうことか?
xxx->hoge[任意].b
0896デフォルトの名無しさん
2006/09/12(火) 22:46:08じゃなくてb[256]はないっつーてるの。b[255]までだろ。
0898デフォルトの名無しさん
2006/09/13(水) 10:59:15CYLS EQU 0x0ff0
LEDS EQU 0x0ff1
VMODE EQU 0x0ff2
SCRNX EQU 0x0ff4
SCRNY EQU 0x0ff6
VRAM EQU 0x0ff8
MOV BYTE [VMODE],8
MOV WORD [SCRNX],320
MOV WORD [SCRNY],200
MOV DWORD [VRAM],0x000a0000
MOV [LEDS],AL
MOV BYTE [CYLS],10
というアセンブラがあって、この値をポインタを使って受け取りたいとき、
struct BOOTINFO {
char cyls,leds,vmode,reserve;
short scanx,scany;
char *VRAM;
};
void hagemain(void)
{
char *vram;
int xsize,ysize;
struct BOOTINFO *binfo;
binfo = (struct BOOTINFO *) 0x0ff0;
xsize = (*binfo).scrnx;
ysize = (*binfo).scrny;
vram = (*binfo).vram;
以下略・・・
0899デフォルトの名無しさん
2006/09/13(水) 11:01:01が代入されるのですが、これは、アセンブラの段階で以下のようになっていて、
番地 入っている値
0x0ff0 10
0x0ff1ALの値
0x0ff28
0x0ff3
0x0ff4320
0x0ff6200
0x0ff80x00a0000
次に、C言語のところでstruct BOOTINFOと言う12バイトの構造体型を宣言して
その後、struct BOOTINFO *binfo;で構造体の変数の宣言をし、
binfo = (struct BOOTINFO *) 0x0ff0;で番地を設定することで、
番地 入っている値 変数
0x0ff0 10cyls
0x0ff1ALの値leds
0x0ff28vmode
0x0ff3reserve
0x0ff4320xsize
0x0ff6200ysize
0x0ff80x00a0000vram(メモリ番地変数)
上記のように変数と値が、対応付けられるのでしょうか?
えっと説明は長いんですが、早い話、変数xsizeなどに値を代入していないのに
どのような過程で値が代入されるのかなという質問です。
0900デフォルトの名無しさん
2006/09/13(水) 11:02:300901デフォルトの名無しさん
2006/09/13(水) 11:08:53実は30日で出来るOS自作入門という本で勉強しているんですが、
プログラミング言語初体験で四苦八苦しています・・・
環境はgccに著者が手を入れた奴で
アセンブラもnasmに著者が手を入れた奴です。
OSはwinです。
いまは画面表示の関数を作っているところなんです。
0902デフォルトの名無しさん
2006/09/13(水) 13:07:54悪い事言わないから止めとけ。
そんな事で悩むようでは、後が辛すぎる。
0903デフォルトの名無しさん
2006/09/13(水) 13:43:53自分の買った本には構造体型のサイズは各メンバのサイズの合計かそれ以上と有ったんですよ。
もし、それ以上の場合なら0x0ff4とxsizeがずれて対応される可能性があるかなと思ったんです。
例えばxsize = (*binfo).scrnx;としたのにxsizeに200が代入されていたりとか・・・
0904デフォルトの名無しさん
2006/09/13(水) 13:49:55「そうですかねぇ」じゃねえよ、ヴォケが
質問者の発する言葉じゃないだろ
0905デフォルトの名無しさん
2006/09/13(水) 14:11:27そりゃ、構造体のメンバがどうアラインメントされるかで
構造体のサイズは変わるし、各メンバが連続して配置
されるかどうかも保証されていないからな。
構造体がパックされるように強制できたっけ?
0906デフォルトの名無しさん
2006/09/13(水) 14:35:55俺は903ではないが、お前も質問者にとっては回答者でも何でもないがな
0907デフォルトの名無しさん
2006/09/13(水) 14:43:040908デフォルトの名無しさん
2006/09/13(水) 14:45:490909デフォルトの名無しさん
2006/09/13(水) 14:47:38各メンバは連続してることもある。
0910デフォルトの名無しさん
2006/09/13(水) 14:51:140911デフォルトの名無しさん
2006/09/13(水) 14:58:17これってアドレスしか確保してないのにxxx->なんてやっていいの?
0912デフォルトの名無しさん
2006/09/13(水) 15:04:22VCなら
#pragma pack(push, 1)
<構造体宣言>
#pragma pack(pop)
でパディングを0にすることが可能
0913デフォルトの名無しさん
2006/09/13(水) 15:05:560914デフォルトの名無しさん
2006/09/13(水) 15:05:57それに今回はpack関係ないし。
0915デフォルトの名無しさん
2006/09/13(水) 15:08:08著者が独自に変更していれば、それについて言及してあるだろうし。
0916デフォルトの名無しさん
2006/09/13(水) 15:12:53なぜ12バイトだとわかったのか。
12バイトであるなら、0x0ff4以外には考えられないだろう。
0917デフォルトの名無しさん
2006/09/13(水) 16:00:57SDKでMFCのクラスを使うにはどうすればいいでうか?
初心者の陥り易い注意点とかもあれば教えて草代。
0918デフォルトの名無しさん
2006/09/13(水) 16:17:240919デフォルトの名無しさん
2006/09/13(水) 16:43:55と煽ってみる。
ま、モレは分からんけどね。
0920デフォルトの名無しさん
2006/09/13(水) 16:55:59出てるジャン。
読解力ゼロ?
0921デフォルトの名無しさん
2006/09/13(水) 19:34:58# こんなまぬけな開き直りは久しぶりに見た :-)
0922デフォルトの名無しさん
2006/09/13(水) 19:36:090923デフォルトの名無しさん
2006/09/13(水) 19:51:33>>899
>早い話、変数xsizeなどに値を代入していないのに
>>898
>xsize = (*binfo).scrnx;
代入してますね。
>>899
>どのような過程で値が代入されるのかなという質問です。
P75〜P99を理解できるまで読め。
この程度のことが理解できないなら、この本を読むのは無理。
0924デフォルトの名無しさん
2006/09/13(水) 22:13:59線形合同法自体が良くないってことでしょうか。
あと、最大値と最小値を指定する方法で
return min + (int)(rand() * (max-min+1.0) / (1.0 + RAND_MAX)
という方法を見つけたのですが、これを使うのも良くないんでしょうか?
Visual C++ .NET2003を使っているのですがこれは関係ないのかな。
今のところ特に何に使いたいということでもないんですが…
0925デフォルトの名無しさん
2006/09/13(水) 22:29:21http://www.vector.co.jp/soft/data/prog/se002453.html
↑これをDLして、中のrndtest.cに掛けてみればよい。
他にもいろいろな乱数ルーチンが入っているので遊べる。
0926デフォルトの名無しさん
2006/09/13(水) 23:04:20>上記のように変数と値が、対応付けられるのでしょうか?
あなたがイメージしている事はだいたいあってる。
ただ、実際の動作(メンバーに対応するオフセット等)は環境による。
0927デフォルトの名無しさん
2006/09/13(水) 23:05:440928デフォルトの名無しさん
2006/09/13(水) 23:07:100929デフォルトの名無しさん
2006/09/13(水) 23:08:23> ただ、実際の動作(メンバーに対応するオフセット等)は環境による。
的外れ。
メモリ上のデータに対応するように構造体を定義してるのだ。
0930デフォルトの名無しさん
2006/09/13(水) 23:09:01すみません、rndtestの使い方がわかりませんでした(泣)
できれば擬似乱数について解説しているサイトを教えていただきたいのですが・・・
勉強不足で本当にすみません・・・
0931デフォルトの名無しさん
2006/09/13(水) 23:17:530932デフォルトの名無しさん
2006/09/13(水) 23:25:18"pseudo random number"でぐぐったら?
日本ではメルセンヌ・ツイスターが有名だけど。boostにも入ってるし。
0933デフォルトの名無しさん
2006/09/13(水) 23:27:03あとこの当たりとか。
0934デフォルトの名無しさん
2006/09/14(木) 01:21:04C++と比べて機能的にはどっちがいいのでしょうか
人気がないという話を聞いたのですが・・・・
優れていたり将来性があるならC++に乗り換えたいと思っています
また無料で出来るのかも教えてくれるとありがたいです
それとC#というのは最近よく聞きますが、これの現状はどうなのでしょうか
0935デフォルトの名無しさん
2006/09/14(木) 01:22:16また無料で出来るのかも教えてくれるとありがたいです
これを抜かしてください
0936デフォルトの名無しさん
2006/09/14(木) 01:22:180937デフォルトの名無しさん
2006/09/14(木) 01:25:38C言語を極めても結局C++に乗り換えることになるなら
初めからC++をやったほうがいいと思っているのですが
C言語で勉強したことはC++でそのまま通用するのでしょうか
0938デフォルトの名無しさん
2006/09/14(木) 01:27:140939デフォルトの名無しさん
2006/09/14(木) 01:29:06C89の機能の殆どはC++でも使えます。
C99の一部の(便利な)機能はC++では使えませんが、他の手段があります。
従って、C++を勉強することをお勧めしておきます。
GUIを手軽に作ってみたいなど、言語そのものより作ることに興味があるならC#を齧るのも悪くないでしょう。
0940デフォルトの名無しさん
2006/09/14(木) 01:30:44ありがとうございます
今日試しにやってみることにします
0941デフォルトの名無しさん
2006/09/14(木) 01:31:53地味に羨ましい。
0942937
2006/09/14(木) 01:39:37今のところBorlandを考えているのですが
お勧めとかありますか?
0943デフォルトの名無しさん
2006/09/14(木) 01:54:06タダ。MFC他は付いてないけどね。
どうせならあと2万出してStandard買うのがオススメ。
0944デフォルトの名無しさん
2006/09/14(木) 01:57:41ありがとうございます
学生なのでお金に今余裕がなくて・・・・
お金に余裕が出来たらStandardの購入を検討してみます
どうもありがとうございました
0945デフォルトの名無しさん
2006/09/14(木) 01:59:020946デフォルトの名無しさん
2006/09/14(木) 02:00:09修羅の道すぎる。
せめてEclipse+CDTで緩和してさしあげるんだ。
そしてCに愛想を尽かされJavaに逃げられる罠。
0947デフォルトの名無しさん
2006/09/14(木) 02:03:32中途半端かもしれないが使いやすい。
0948デフォルトの名無しさん
2006/09/14(木) 02:05:15皆さんご意見ありがとうございます
色々あるみたいなので明日にでもゆっくり考えて
自分にあったものを使いたいと思います
0949デフォルトの名無しさん
2006/09/14(木) 02:09:44gcc(とC99) もwindowsで使ってもらえるんだけどなぁ
0950898
2006/09/14(木) 02:12:04えっと、こんな未熟者のためにプロの方が答えを考えてくれて凄く感謝しています。
構造体のことはだいぶ分かりました。
>メモリ上のデータに対応するように構造体を定義してるのだ。
つまり今回の場合、scrnxが、構造体の先頭から4の倍数の場所になっているので、隙間は入らず、
結果アライメントやパディングの問題は発生しない。
よってstruct BOOTINFOは確実に12バイトの構造体変数になると。
最初からアセンブラでメモリの番地にデータを計算して書き込んでいるからこそ出来た訳ですね。
以上のような理解でよろしいでしょうか?
>そんな事で悩むようでは、後が辛すぎる。
プログラミング経験0から始めたので、C言語の本併読しながらですから結構大変ですけれど、
だんだん絵が出てきたりして今までの詰め込みから面白くなってきた所なんですよ。
もう少し頑張ってみますね。
0951デフォルトの名無しさん
2006/09/14(木) 03:45:04>的外れ。
>メモリ上のデータに対応するように構造体を定義してるのだ。
その指定方法が処理系やターゲット等の環境依存なのだが、理解できないか?
0952デフォルトの名無しさん
2006/09/14(木) 04:05:36>確実に12バイトの構造体変数になる
その本を読んでないのでなんともいえないけど
1、>4の倍数の場所になっているので、隙間は入らず
作者も同じように考えてタマタマ処理系の動作と一致している
2、処理系の動作を調べて一致することを確認してある
3、アセンブラの方を構造体にあわせて書いてある
などなど、可能性はいろいろある。
動作には不定とか未定義とか実装依存とかあって、実験結果が
いつも正しいわけではない事を、頭の隅っこにでも置いといて吉。
0953898
2006/09/14(木) 05:39:17処理系ってコンパイラの事ですよね。
>動作には不定とか未定義とか実装依存とかあって、実験結果が
>いつも正しいわけではない事を、頭の隅っこにでも置いといて吉。
コンピュータープログラムってどんなときも同じ結果だと思っていたんですけど、
そうじゃないんですね。変なの。
0954デフォルトの名無しさん
2006/09/14(木) 06:07:02それ逆。
メモリ上に12バイトのある情報があって、それにあうように構造体を定義してるの。
「タマタマ」などではない。
0955デフォルトの名無しさん
2006/09/14(木) 06:24:50一般にメモリ上での配置に従って構造体を定義するなんてできるのか?
struct {
char a;
char b;
};
がメモリ上の連続した2バイトに配置されるなんて保証はないわけで。
コンパイラオプションや pragma でコンパイラの挙動を制御しなけりゃ
「それにあうように構造体を定義」なんてできないと思うんだが。
0956デフォルトの名無しさん
2006/09/14(木) 06:25:29学生ならAcademic Editionもあるでよ(\4800)
Standard相当
ま、言語に慣れる段階ならExpressでもいいけど
0957デフォルトの名無しさん
2006/09/14(木) 06:39:08今回は、Windowsでgccね。
そんな一般論ならぬ特殊論をいつまでも続けるより、「そうならない処理系」の例でもあげたほうが生産的だな。
0959デフォルトの名無しさん
2006/09/14(木) 06:49:21自己中心な奴ほどプログラムに興味あるんだよね。
「オレ様プログラムを作るぞー」って意気込んで、
そのうちに真性プログラマーになって人生落ちていくんだろうよ。
0960デフォルトの名無しさん
2006/09/14(木) 06:53:49>一般にメモリ上での配置に従って構造体を定義するなんてできるのか?
え、出来ないの?
0961デフォルトの名無しさん
2006/09/14(木) 06:57:05それも考え方が逆。
筆者は構造体でアクセスするために、0xff0からchar,char,char,char,short,short,pointerと配置しておいたの。
で、最初はひとつひとつアドレスでアクセスしてて「めんどいよね」ってことで構造体登場となる。
0962デフォルトの名無しさん
2006/09/14(木) 07:03:50__attribute__ ((packed))
指定をすべきではないだろうか。
0963デフォルトの名無しさん
2006/09/14(木) 07:13:13なんで?
0964デフォルトの名無しさん
2006/09/14(木) 07:23:12Cのコードの方でもアセンブラでのアクセスを考慮したコーディングしないと。
コンパイラ依存でも環境依存でも構わないんだが、
そのコンパイラですら保証されていない特性に頼るのは危険だと思う。
0965デフォルトの名無しさん
2006/09/14(木) 07:25:13どこがどう危険なの?
0966デフォルトの名無しさん
2006/09/14(木) 07:39:23その議論はどうでもいいけど、>>955のケースでメモリ上で連続しないような処理系があるなら教えて。
0967デフォルトの名無しさん
2006/09/14(木) 07:40:44コンパイラをバージョン含めて限定して検証しながら作れば可能。
0968デフォルトの名無しさん
2006/09/14(木) 07:43:18無いと思うよ。 char 二つの間にパディング入れる意味はまったく無い。
でもそれは規格では保証されていないので、期待するもんじゃない。
0969デフォルトの名無しさん
2006/09/14(木) 08:01:37>>898がOS自作入門とか言う本よんでて、
初心者だったから、当たり前だろと思うことに変な疑問を持ったんでしょ。
で、作者が俺様理論で本書いてたから説明下手だっただけでしょ。
0970デフォルトの名無しさん
2006/09/14(木) 10:13:59処理系ごとのデフォルトの動作を期待するなと?
0971デフォルトの名無しさん
2006/09/14(木) 10:23:12デフォルトのアラインを調べておけ、と。
そして、処理系の実装依存である以上、たとえば
「charを4つ並べて4バイトの構造体を定義しました」ではなく
「charを4つ並べると4バイトになることは確認済みです」ということ。
事実上どっちでも変わらないからこそ、正しい解釈をしとけ、という話だな。
0972971
2006/09/14(木) 10:27:14でもかまわないから、解釈は正しく、な。
0973デフォルトの名無しさん
2006/09/14(木) 10:38:30>>968
CPUのバス幅に合わせたいとか、ブロック転送命令を使いたいとか
特殊な状況だけど、charのメンバのアラインを強制的に変える事は何度かやったよ。
あと
http://www.microsoft.com/japan/msdn/vs/vc/vcconWindowsDataAlignmentOnIPFX86X86-64.aspx
とか
0974デフォルトの名無しさん
2006/09/14(木) 10:38:33こいつが何にこだわってるのか、さっぱりわからん。
0975デフォルトの名無しさん
2006/09/14(木) 10:41:350976デフォルトの名無しさん
2006/09/14(木) 11:03:02【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145593/
0977デフォルトの名無しさん
2006/09/14(木) 11:44:550978デフォルトの名無しさん
2006/09/14(木) 12:27:26っーか、俺もこの本持っているけど確かにパティングについては書いてないんだよね。
ただ、12バイトになるとしか書いてない。
俺は流し読みをしながら読んだから、「そうね」としか思わなかったけれど、
質問者はマジで素人みたいだし、ちゃんと理解しようと勉強しながら読んでいるみたいだから、
この問題?に気づいたのはえらいと思う。
>>923
>P75〜P99を理解できるまで読め。
>この程度のことが理解できないなら、この本を読むのは無理。
理解できるまで読んでもワカラねぇんじゃねえの?
>自分の買った本には構造体型のサイズは各メンバのサイズの合計かそれ以上と有ったんですよ。
>もし、それ以上の場合なら0x0ff4とxsizeがずれて対応される可能性があるかなと思ったんです。
>例えばxsize = (*binfo).scrnx;としたのにxsizeに200が代入されていたりとか・・・
そもそもパティングについて解説してないもん。理解できるはずがない。
0979デフォルトの名無しさん
2006/09/14(木) 13:06:43パディングって知らなかったとか。
0980デフォルトの名無しさん
2006/09/14(木) 13:28:44必死だな
0981デフォルトの名無しさん
2006/09/14(木) 13:40:14ファイルの末尾からある一定の間隔を持ちながら後ろにさかのぼる様なプログラムを書きたいです。
例えば次のようなプログラムです。うしろからdeltaバイトずつスキップしながらデータをとっていきます。
while( 1 ) {
fin.seekg(-i*delta , ios::end);
if (終了条件) {
break;
}
fin.read((char*)&data,sizeof(int));
処理
++i;
}
ファイルの「終了条件」を先頭にきたときとしたいのですが、
どうしたらいいでしょうか?
0982デフォルトの名無しさん
2006/09/14(木) 13:50:35ListBoxから派生させたクラスで、ユーザ定義のデータを参照(保持)し行ごとの描画を変えたいのですが…
ユーザ定義のデータをどうやって持つのかに悩んでいます。
ListBoxは行が難行になるか分からないので、内部テーブルを持つ訳にも行かない。
ItemDataはユーザが使用するでしょうし。
コールバック関数を定義させて問い合わせるにはスタックが膨大すぎてしまいそうで、
実現的ではないし。(ON PAINTなどで処理するのでね)
何か良い実現方法はありませんか?
0983デフォルトの名無しさん
2006/09/14(木) 13:54:37そりゃ本にも載ってなけりゃ、ぐぐってもでてこないだろうさ。
0984デフォルトの名無しさん
2006/09/14(木) 14:17:29>>この程度のことが理解できないなら、この本を読むのは無理。
>理解できるまで読んでもワカラねぇんじゃねえの?
なら、この本を読むのは無理だということだね。
0985デフォルトの名無しさん
2006/09/14(木) 14:21:000986デフォルトの名無しさん
2006/09/15(金) 01:49:54何行か判らない、と内部テーブルが駄目、との関係がよく解らないな。
コールバック関数でも問題無いようにも思えるし。
描画はWM_PAINTでなくて、WM_DRAWITEMで個々のアイテム毎だし。
0987デフォルトの名無しさん
2006/09/15(金) 02:40:394バイト整列してないintへのアクセスでコケるCPUなんてザラなんだが、
あまり意識されないもんなのかな。
話が飛ぶような飛ばないような。
仮想関数を伴わない構造体の継承って、継承元の構造体の
メモリ配置ってなんか仕様決まってるのかな。
struct A
{
char a, b, c, d;
};
struct B : public A
{
char e, f, g, h;
};
って時に、
struct C
{
char a, b, c, d;
char e, f, g, h;
}
と等価になるのかって話。
保証されてないでFAな気もするけど、それならそれで言質が欲しい。
0988デフォルトの名無しさん
2006/09/15(金) 06:39:370989デフォルトの名無しさん
2006/09/15(金) 13:48:57void __stdcall Hoge(int x, int y);
という関数の装飾名は(extern "C"していれば)、_Hoge@8に32ビット環境ではなりますよね。
ですが、intが4バイト固定でないと64ビット環境とかでおかしくなるような気が…。
0990デフォルトの名無しさん
2006/09/15(金) 13:49:550991デフォルトの名無しさん
2006/09/15(金) 13:51:04よくわからないが、
サブクラスからAP関数のコールバックなんて極力やりたくないんじゃないかな?
呼ばれる回数が少ないにせよスタック潰しなのかな、と。
>何行になるか分からないので、内部テーブルを持つ訳にも行かない。
これは単純に a[] の[]内がかけないという意味じゃ?
メモリアロケートしてポインタでつなげて…じゃ、面倒かな?
0992デフォルトの名無しさん
2006/09/15(金) 15:31:14このなかに入っている関数と似た関数を作りたくて、どうやっているのか調べたいの
です。
Visual Studio.NETでは意味のわからない数字とかが出てきてしまいました。
0993デフォルトの名無しさん
2006/09/15(金) 16:08:10環境依存。
Win32とWin64ではintは32ビットと決められている。
Win32&Win64ではlongも32ビットと決められている。
0994デフォルトの名無しさん
2006/09/15(金) 16:09:11ソースが無ければ無理
0995デフォルトの名無しさん
2006/09/15(金) 17:54:52少なくとも16bitであることは保証される
0996デフォルトの名無しさん
2006/09/15(金) 18:43:55int 型に代入するって方法はなにか問題とか起こる可能性がありますか?
0997デフォルトの名無しさん
2006/09/15(金) 19:00:02そのままintにキャストした場合、小数点以下が切り捨てられる。
「○○を超えない最大の整数」とか「○○を下回らない最小の整数」が欲しいんなら
math.hインクルードしてfloor()なりceil()なり使う。直接返されるのはdouble型だけど。
これが頭に入ってれば問題ないかと。
0998デフォルトの名無しさん
2006/09/15(金) 19:14:31サンクス 汚らわしくもキャストしていきます
0999デフォルトの名無しさん
2006/09/15(金) 21:17:21負の値の取り扱いに注意。
#c99ならround()系もお勧め。
1000デフォルトの名無しさん
2006/09/15(金) 22:04:1710011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。