【初心者歓迎】C/C++室 Ver.30【環境依存OK】
2 :
デフォルトの名無しさん:2006/08/21(月) 16:40:12
また双子スレか
おもしろいな、専用ブラウザで
>>3のリンクをクリック連打してっと行ったり着たりできる
相互再帰か
なにこのすれ
まあ向こうは後で再利用すればよいだろう。
どっちがどっちだかわからなくなってきた
そっくりくりくりくりっくり
削除人が困るぞw
どっちが何なんだか分かんねーよ
質問しづらいな
C言語に興味を持つ
↓
解説書購入
↓
printfやifを一通り使えるようになるレベル ←いまココ
オセロは何段階くらい先?
人により1段階〜無限段階
ミラーリング阻止
ミラーリング阻止
ミラーリング阻止 したところでどちらを削除してよいかは分かるまい
わろす
俺もミラーリング参加する!
遅いほう削除するに決まってるだろ。
25 :
23:2006/08/21(月) 22:47:41
俺としては削除して欲しくない。
正常に運営しつつ、「双子スレ」の記録を狙ってみては。
Turboスレでやれ
27 :
デフォルトの名無しさん:2006/08/21(月) 22:49:28
それにしてもどっちを本スレとするかという問題は残るわけで。
そんなに暇じゃあありません。
同期を取りました。
誰も言わないから俺が言ってやる
まさに マルチスレッド
馬鹿じゃねぇの?
30秒の壁は結構危ないな。
ミラーリング厨が都合の悪いレスだけ別の文にしてるwwwwww
あほか
36 :
デフォルトの名無しさん:2006/08/21(月) 23:15:58
久しぶりにアホなスレに嗤ったw
この話題で30も行くとこうなるのか。
こっちのスレだけ加速させればいいだけ
同期が外れました。リビルドをおながいします。
どっかの馬鹿のせいでこんな流れか
ミラーリング厨が泣きながら去っていきます
よし次はストライピングだ
>>41 ああ、俺がちょうど書いてやろうと思ったのに。
微妙に改行が多い件
44 :
953:2006/08/22(火) 01:18:50
前のスレではみなさんにお世話になりました。
>>18私はC++を勉強して4ヶ月目で、授業では一応教科書一冊の範囲(ポインタまで)も終わったんですが
ぜんぜん駄目でした。
45 :
デフォルトの名無しさん:2006/08/22(火) 01:20:07
strcmp関数とかのソースコードを見たいのですが、どこらへんにソースファイルがあるのでしょうか・・?
OSはfreebsd4.11です。
#一応findしてみたところ/usr/includeにstring.hはあったのですが、
肝心のコードが書いてあるファイルが見つかりませんでした・・・
B++の参考書ってどれがいいんですか?
Bは一通りわかってます。
これは双子スレ?ミラーリングされてるの?
これは双子スレ?ミラーリングされてるの?
おまえら、遊ぶのはせめて一桁までにしておけよ
なめんな
おまえらマルチポストするなよ
何このスレ
こちらの
>>1のタイムスタンプが2006/08/21(月) 16:32:04でもうひとつのスレより早いので
こちらが本スレということで、こちらで質問していいのでしょうか?
56 :
55:2006/08/22(火) 14:13:34
ありがとうございます、自己解決しました。
printf関数の書式%pの出力形式を自分で制御できませんか?
自分の環境(bc++5.5.1)では16進数で表示されるのですが、これを10進数で表示したいです。
unsigned intにキャストするとかsprintfで16進にしたあとstrtolで整数に戻すとか。
>>58 %pでは無理なのですね。
整数型にキャストするのが簡単そうなのでキャストでいこうと思います。
どうもありがとうございました。
可変引数だから型は関係なく、キャストしてもダメだと思うぞ。
%dでいいんじゃね。
>>60 bccはどうだか知らんが、gccとvc7ではprintfの書式と型の対応をチェックする。
>>61 でも%pでの出力形式には影響しないでしょ。
>>62 だから、整数型にキャストした時点で"%p"は使えなくなるっつー話なんだけど。
57です。
整数型にキャストしたので当然%dで書式を指定しました。
%pは63さんが仰るようにポインタに対する書式だと思っていましたので。
それでやりたかったことがうまくできたのですが、
実は何か潜在的な問題があるのでしょうか?
あるとしたら、ポインタ型と同じ大きさの整数型が環境に依存すること。
(u)intptr_tを使うにしても、printfには(u)intptr_tに対応する長さ修飾子が存在しないこと。
57です。
問題が起こるとすれば環境依存性がある点なのですね。
今のところ%dだけでprintfがよしなにやってくれているようなので、
とりあえずこれでいこうと思います。
相談に乗っていただいて、ありがとうございました。
>>69 オレは%uをお勧めする。
って言うか、普通に16進の方がわかりやすいと思うが?
69 :
68:2006/08/22(火) 20:56:28
70 :
デフォルトの名無しさん:2006/08/23(水) 17:11:16
本スレage
重複のほうが勢いがある件
双子の弟の方が人気があるって感じだな
73 :
京大生www:2006/08/23(水) 17:59:20
プログラムで素数をモノすごい勢いで計算させようという考えにいたり以下のようなプログラムを作りました。
でもmax >= 17ではプログラムが動きません。
どうしてでしょうか?
http://www.uploda.org/uporg489202.cpp.html 環境はbcc32
windows xp
1.3Ghz 512MB
これより処理を早くする方法は分かるのですが、それにしても17以上で動かなくなるのは解せません。
74 :
京大生www:2006/08/23(水) 18:04:10
あれ、よくみると結果が狂ってる・・・・どうしてですか;;
75 :
デフォルトの名無しさん:2006/08/23(水) 18:06:45
>>74 は解決しました。iになってたw
でも
>>73は・・・あれ?20では出来てる。でも50じゃ出来ないw
76 :
京大生www:2006/08/23(水) 18:07:57
20までしか出来ないようです。
何ででしょう
77 :
京大生www:2006/08/23(水) 18:26:20
プログラムを改善したら21までいけるようになった。
けどなんで・・・・1000までやりたい。
78 :
京大生www:2006/08/23(水) 18:29:51
いろいろあれだがとりあえず
int prime[] = {2, 3};
これは
int prime[2] ...と同じだからな
//関数を作らず直に作ってしまいましょう
関数作れ
81 :
京大生www:2006/08/23(水) 18:44:48
>>79 知ってます。
だから要素数record_num = 2になってるでしょ。
いろいろとアレっていうのはどこですか。
おれにはver.2以上早いアルゴリズムが思い浮かびません。
>>80 やろうとしたらポインタとか意味不明になってキレた。
短いからいいやみたいな。
プログラムが読みにくいのは察しますが^^;
>>81 >知ってます。
京大をブラックリストに…あ、もう入ってたわ。
84 :
83:2006/08/23(水) 18:55:26
100年とは言わないけど100時間くらいはROMって欲しいかも
86 :
83:2006/08/23(水) 19:00:43
1行目の
#include <iostream>
がなぜか見えない
こぴぺでなくファイルのアップロードなのになぜだ
87 :
京大生www:2006/08/23(水) 19:30:56
>>83 どういう意味ですか、ソースはちゃんと読んでもらえたでしょうか?
88 :
京大生www:2006/08/23(水) 19:33:33
>>81 どうしてだ・・・これだといくらでもでる。
でもおれのも21まではいける。どうしてだ。
89 :
83:2006/08/23(水) 19:34:55
90 :
京大生www:2006/08/23(水) 19:36:51
いや、これは出来ていますが、アルゴとしては低脳です。
なぜなら、素数は6n±1の形であるというところまでは最低絞りこんだほうが格段に速度があがるのは明確だから
91 :
京大生www:2006/08/23(水) 19:38:30
改善しやがった
92 :
京大生www:2006/08/23(水) 19:41:12
最初にポインタで動的確保の時の/2は何?
説明せよ
京大生wwwってのが低脳なのはわかった
アルゴリズムの優劣以前の問題
もう一回CでもC++でもいいから勉強し直して
なおかつ人の意見をちゃんと聞けるようになったらここにおいで
ヒント、偶数の素数は1個しかない。だからmax=0はエラーになる。
95 :
京大生www:2006/08/23(水) 19:59:24
つまり素数はかならず奇数だから半分にしたってか。
笑わせるぜ、6n周期の中で2つしか調べてないんだから割る3くらいではいけるんじゃねーの?
今C勉強してんだよ、てゆうかなんか忘れたからC++勉強したついでに復習しておくかってカンジ。
おれは人の意見はきくよ、ただしまともな意見ならね。間違ったことは徹底的に批判する、それだけ。
おれのプログラムの間違いは、最初に要領確保しなかったこと。
それでも21までできてしまったのはなぜか、本来ならできんはず、なぜか答えてくれ。
C/C++は基本的に配列の添え字が範囲外かどうかを確かめない。
そしてたとえ範囲外の要素を使おうとしても、そこに対応するメモリが特に使われていない場合、
まるで何事も無いかのように使えることはよくある。
ただ、それは偶然何事も無く動いているのであり、決してそれに頼ってはいけない。
京大生のプログラムもまさにそうなっていた。
98 :
京大生www:2006/08/23(水) 20:24:14
なるほど。
わかったぜ。
あと演算時間を計算したいんだが、どうすればいい。
time()とdifftime()か?
これだと秒までしかでねーんだけどwwww
べ、別に感謝なんてしてないんだからね!
秒より細かい精度を扱いたければ、WindowsやPOSIXなどの環境固有の関数を使うのが確実。
で、お前は何を使っていると書こうとしたが、既にWindowsと書いてあるな、よし。
Windowsなら<windows.h>をインクルードすればGetTickCountが使える。
一番お手軽で、ミリ秒単位の数値が返ってくる。(ただし実際の精度は数ミリ〜数十ミリ秒のはず)
使い方はtimeとあまり変わらない。大雑把に言ってGetTickCountには引数がなく、またtime_tの代わりにDWORDを使うだけ。
difftimeに相当するものはなく、ただの整数なので直に減算して構わない。
少しは感謝しろよ
clock()あたりでいいんじゃないか?
102 :
京大生www:2006/08/23(水) 20:42:26
clock()は秒単位じゃねーの?
>>100 やってみる
だが、clockも単位が一定でなく、まともに使うには結局CLOCKS_PER_SECで割って秒単位にするしかないと思う。
一番お手軽だと思ったんだけど
数十_秒くらいの精度で計れなかったかな
初心者は歓迎しても、こう言うバカは歓迎しないで欲しいと思った
まぁ重複より進んだしいいんじゃね?
107 :
京大生www:2006/08/23(水) 20:52:37
出来なかったw
変な数値でたけど単位不明w
でusing namespace std;って何?
>>107 std::cin >> max;って書くべきところを
cin >> max;って省略して書けるおまじない
109 :
京大生www:2006/08/23(水) 21:01:58
それ書かなくても出来ますよ。
一番最初の使用ではそうだったけど、以降デフォで大丈夫になったと読んだ気がする。
すごい釣り能力に嫉妬
>>106 そんな悠長な事を言ってるから、調子にのってるじゃねぇか!
>>京大生
いい加減、本買って来て嫁
112 :
京大生www:2006/08/23(水) 21:12:10
本はあります。
林ハルヒコ先生の新C言語入門シニア編は大体読みました。
が、実戦経験が少ないのでミスが多いのです。
言われれば理解は出来ます。
あとはクラスと継承完全制覇って本を読みましたがこれは意味が分かりませんでした。
クラスは用途がよく分かりません;;
君たちは京大生に教えてるのですよ、誇りに思わないのですか。
「京大生の埃に教えてる」の間違いだろ
>>112 全く理解出来ていない。
100万回位読み返せ。
116 :
デフォルトの名無しさん:2006/08/23(水) 21:33:53
ねえねえ京大生くん
CとC++の違いってなに?
学歴コンプの奴が多いな
学歴複素数
ハイハイ、荒らしは無視で。
120 :
京大生www:2006/08/23(水) 21:38:42
>>116 クラスを使えばC++と書いてあった。
C with Class = C++
>>117 大変失礼な発言です。取り消しなさい
あれ、埃はいいのか?
>>95 別に3で割っても俺はかまわないがmax=4以下では使えない
max=100000より小さい値は指定しないことにして14で割っちゃえよ
124 :
デフォルトの名無しさん:2006/08/23(水) 21:48:44
126 :
デフォルトの名無しさん:2006/08/23(水) 22:50:33
昼に間違えてJAVAスレに書き込んでしまった者です。
XPで、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;
}
しかし、出力できませんでした。どのようにすべきか、ご教示願います
デバッグできない子はゆとり世代かな?
どっかにi#include<math.h>ぶち込んで
float
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),とかになって
中も改造してどうたらこうたら
関数ブロック{}抜けて値消えてるなと思ったらポインタ返しにしとけ!と脊髄反射
>>129 レスありがとうございます
分かりました、明日朝一で試してみます!
>>127-128 プログラムとは無縁の世界で生きていたのですが、上司に「プログラムできるの?」と聞かれて、「コンニチワって表示させるぐらいなら出来ますよ^^」と答えたのが運の尽きでした
やったこともないのに、こんな仕事が回ってくるとは思いもしませんでした
>プログラムとは無縁の世界で生きていたのですが、上司に「プログラムできるの?」と
聞かれて、「コンニチワって表示させるぐらいなら出来ますよ^^」と答えたのが運の尽きでした
その状態ならはっきり言って、あれ改造するの結構しんどいかもなw
関数内に関数ポインタとかあるし
柴田本とか朝井本とか読んで頑張る時間があれば良いけど。
main関数内でもっとゴチャゴチャと積分計算する方針にするのはダメなのか?
>>131 はい、朝一でやってみますとは言いましたが、はっきり言って地獄ですw
#include<math.h>を加えることぐらいはさすがに分かったので、それだけは既にしてあります
本読んで勉強する時間もありませんし、実は最終締め切りは金曜の午前中だそうです
現在、Cでやるのを諦めて自宅のPCのエクセルで何とかならないものか試している最中です
>main関数内でもっとゴチャゴチャと積分計算する方針にするのはダメなのか?
僕としては計算さえできれば、プログラムの文の美しさは求めていません
ならVBAスレに移動だなw
>僕としては計算さえできれば、プログラムの文の美しさは求めていません
美しさはともかく、「理解しやすさ」は保守管理に必要だぞ
3ヵ月後の自分は他人〜
136 :
デフォルトの名無しさん:2006/08/24(木) 01:03:56
long long int型を使ってみようと思って65536*65536を
計算してみたのですが、結果がおかしいです。
これはコンパイラのバグでしょうか?
#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
x = 65536LL * 65536LL;
y = 4294967296LL * 65536LL;
>>137 ああ、出来ました。ありがとうございます。
お手数ですが、どうして私のプログラムでは
このような結果になったのか、教えていただけますか?
65536 * 65536 // 32bit ← 32bit * 32bit;
4294967296 * 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;
140 :
136:2006/08/24(木) 01:34:23
>>139 分かりやすい説明、ありがとうございました。
よく理解できました。
趨
142 :
デフォルトの名無しさん:2006/08/24(木) 03:24:08
126です。
自己解決しました。自分の実際のプログラムでは
別のディレクトリだったのですが、パスの書き方を間違えていました。
ご迷惑をおかけしました。
>>125氏へ
これ関数返り値をポインタにしなくても、そのままで動く
#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);
}
続き
float 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関数を使いこなせるか)
>>143 ありがとうございます!
今から仕事場いくんで、やってみます!
>>129 オメー関数ポインタ分かってねえだろ!
柴田のポインタ極意でも100回写して変数あれこれ変えて
型変えてprintfで出力して見直して来い!
クイックソートのアルゴリズムを本で読んで書いてみたのですが、
void 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
として以下のように書くとちゃんとソートされません。
148 :
147:2006/08/24(木) 18:12:54
void 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);
}
勉強始めたばかりなので初心者な質問だと思いますが、
どなたか悪いところを教えてください。
a[axis]は変動するだろ。
150 :
麻布卒www:2006/08/24(木) 18:39:38
クイックソートって関数にあるじゃんqsortだっけ。
なんでそんなもん作ろうとするの?勉強のため?
じゃ、おれもやってみようかなw
今日生協にアルゴの本買いにいったらよさそうなのが7600円もして死んだ。
アルゴはひとつの学問だからなー、面白いからいろいろ勉強してみたいや。数学とかパズル好きだし。
>>149 あぁ、なるほど!
lpかrpが=axisの時にaxisの位置との交換になるからその位置の値が変わるんですね><
こんなのに気付かなかった自分の馬鹿さにガッカリでした・・・orz
指数関数の積分について質問していた者です。
結局うまくプログラムを動かすことは出来ませんでした。
しかし、エクセルで同様の台形公式を用いた積分を考えることにより、指数関数が複雑に絡み合う式だったのですが、計算に成功し締め切りも守れました。
プログラムはうまくいきませんでしたがお世話になりました、ありがとうございました。
それは良かった。
また、何よりプログラムを書かないことはプログラミングの基本だ。
154 :
誰か助けて!:2006/08/25(金) 00:01:06
ifstream f("test.dat", ios_base::binary | ios_base::in);
......
unsigned short n;
f >> n;
// f.read((char*) &n, 2);
こんなソースを書いて、 f >> n だとエラーになるのに、
コメントのように read 関数を使うと、ちゃんと読めるのです。
原因はなんでしょうか。よろしくお願いします。
printf に指定した 2 番目の argument が表示されません。
環境は 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;
}
(続く)
157 :
デフォルトの名無しさん:2006/08/25(金) 01:09:30
>>156 の続き
結果は次のとおりです。
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 に問題がある。
アドバイスいただけるとありがたいです。
>>157 time_tの型がlongであると期待したのが敗因。
実際最近のVCではtime_tはlongではなくlong longになっている。
また、time_tは秒単位で実装されているはずなので、
高々10000回程度の標準出力で1秒掛かることを期待するのも問題あり。
160 :
デフォルトの名無しさん:2006/08/25(金) 02:22:22
161 :
デフォルトの名無しさん:2006/08/25(金) 02:32:30
ここの人達のソースは全く美しくない。
変数は意味深でやたらに長い名前を付けている。恥ずかしくないのかと思う。
私のすすめはこれ。3文字変数。そしてフォント、Verdana。
この殺風景さが良い。よく思えば、これ以上に美しいソースは存在するのかと不思議に思う。
それを、わざわざ食事の時間や昼寝をする時間を削ってまで改悪するのは私には理解できない。
そこまでするなら、その時間を勉強や仕事などの有意義なことに消費すべきではないか。
そもそも、人間というのは時々つまらないことに時間を費やしてしまいがちな変わった唯一の動物である。
もし、それが長引いている場合は、人間性がよくよく変わってきていることなのであろう。
自分の考えが昔の自分と違ったり、やたらと意見に反対したりされたりするのは、まさにそれである。
しかし、それがある日突然問題を引き起こすかもしれない。
162 :
156:2006/08/25(金) 02:37:29
>>158 ありがとうございます。次のように変更することで期待通りに動きました。
printf("time1=%lld time2=%lld\n", t1, t2);
printf("time2=%lld time1=%lld\n", t2, t1);
こ
変
私
こ
そ
そ
そ
も
自
し
数
の
こ
エロいな!
殺
し
>>162 そして非互換コードをばら撒くと。
本質的な解決になってないことにご用心。
>153
そうだな
書かなければバグらないしな
windows
vc60
入力された日付又は時刻が存在しているのか確認する方法を教えてください
うるう秒も?
170 :
デフォルトの名無しさん:2006/08/25(金) 11:53:01
/l、
(゚、 。 7 ハァ?
l、 ~ヽ
じしf_, )ノ
171 :
デフォルトの名無しさん:2006/08/25(金) 11:53:42
>>169 マジ捻くれてるよなw
お前って馬鹿の典型例だなw
>>171 そうか?俺は普通だと思った。
仕様にあいまいな部分があると気持ち悪いし。
175 :
デフォルトの名無しさん:2006/08/25(金) 13:18:49
だよな。
仕様は明確にしてもらわないと、あとでちょっと違いましたなんて言われると殴りたくなるからな。
俺なんかちょっとでも仕様に違いがあったら実際に殴るからな。
177 :
デフォルトの名無しさん:2006/08/25(金) 14:46:15
環境、OS:Linux、コンパイラ:CC
ttp://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」を押せば前ページに戻るようにしたいです
ヒント・アドバイスでも構いませんのでよろしくお願いします。
>>177 書いてあるとおり改造すればいいじゃん。
何が分からないのかが分からない。
まあ漏れは実際ガチで殴るけどね
180 :
デフォルトの名無しさん:2006/08/25(金) 16:09:43
>>177 なにをしてほしいのかわからんな
その仕様を満たすコードを書いてほしいのか?
182 :
京大生www:2006/08/25(金) 16:36:37
正多角形を角数増やしていくと円に近づくのでそれを利用してパイを求めようとしましたが、再帰形になりました。
誰かプログラムをかけませんか?
漏れが入学したとき、実際そんな問題が出たなw
まだ高1だから数学はよくわからないがこんな感じか?
サイン求めるのにラジアン値が必要なせいですげえ意味ないプログラムになった
#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);
}
}
185 :
177:2006/08/25(金) 17:02:38
>>181 >その仕様を満たすコードを書いてほしいのか?
はい、そうです。よろしくお願いします。
187 :
京大生www:2006/08/25(金) 17:56:24
>>184 お前ばかだろ、最初にパイを定義してどうすんだよ。
そのパイを求めたいんだよ。
188 :
デフォルトの名無しさん:2006/08/25(金) 18:09:23
型として自分自身の関数へのポインタを返す関数の宣言(引数は無しとして)
ret_type Foo(void);
は C/C++ で直接的に宣言できず?
ret_type ptr = Foo;
ptr = (*ptr)(); // 型的に 左辺 & 右辺 が等価となる
>>189 自分自身のポインタを返す関数は宣言できないよ。
191 :
189:2006/08/25(金) 18:38:47
>>190 THX
void* 戻しで 呼び出し時キャスト か
struct foo { struct foo* (*func)(void); }; のような構造体経由でないと表現できない
ってことですね。
一応忠告しとくとvoid*から関数ポインタへの変換は
Cでは保障されていない(C++は規格書真面目に読んだことないから知らん)
だから標準を遵守する気ならやめといたほうが良い。
関数ポインタから関数ポインタへの変換はありだから
typedef void(*void_fun)(void);
void_fun f(void){return (void_fun)f;}
ならC言語の仕様的にはあり。
193 :
189:2006/08/25(金) 18:52:50
>>192 重ね重ね感謝
void* <-> 関数のポインタ のポータビリティ(?) は保証外だったのは知りませんでした。
標準枠内で書くか環境枠内で書くかは、それぞれあるので
今度真面目に規格書に目を通してみよう。
194 :
京大生www:2006/08/25(金) 19:15:29
195 :
京大生www:2006/08/25(金) 22:05:46
できん
質問です
進行を一時ストップさせるのに
cin.sync();
cin.get();
を使うみたいなのですが、停止しません
これを使った例文をコピペしてみたのですが
それでもダメでした
環境が問題なのでしょうか?
環境はbcc32 windows xp
1.86Ghz 1Gです
πは普通マチンの公式とか使って求めるもんだ。
>>196 進行とか停止とかの意味がわからん。
ソースと、期待している動作の説明が必要。
199 :
196:2006/08/26(土) 00:18:15
>>199 #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文字ずつしか出ない。
201 :
196:2006/08/26(土) 14:41:36
>>200 VC2005EEで試したところうまくいきました。
ありがとうございました。
203 :
デフォルトの名無しさん:2006/08/26(土) 20:42:37
コマンドライン引数を取得するにはGetCommandLine関数を使えばいいですが、
引数の数を取得するような関数はないのでしょうか。
標準には無いと思うよ
ありがとうございます
無いのか(´・ω・`)
argcじゃなくて?
207 :
元気になれるデバッグ支援ソフト:2006/08/26(土) 21:31:33
OutputDebugStringとかを表示してくれるやつないかな
210 :
209:2006/08/26(土) 21:36:25
しまったマジレスしてしまった
212 :
208:2006/08/26(土) 22:29:03
そのままではoperator newでエラーがでる。
そこをコメントアウトしてもリンクでこける。
例えば
undefined reference to `Suit::clubs'
とか。
214 :
208:2006/08/26(土) 22:36:53
Suit::LiteralがSuitで前方参照されてるのにSuitのstaticメンバに
なれるの?ポインタで扱うならわかるけど。
それとLiteralがSuitをprivate継承してるけどLiteralはSuitのメンバ。
ひよこが先か卵が先か。
>>214 クラスの static データメンバの宣言では型が不完全型でもいい。
>212
完全なソースコードがダウンロード出来ないから勘で答えるけど
その部分はエラーテストコードじゃないのか?
217 :
208:2006/08/26(土) 23:04:41
それは違う。
newできないようにoperator newをprivateにしている。
>>212 エラーが出てるんなら直せばいいんじゃないのか?
220 :
208:2006/08/26(土) 23:23:29
だいたいstaticメンバって定義が別にいるよね。
この場合Literalの定義の後にしないと駄目だ。
>>220 undefine reference のほうは、それだろうな。
operator new のほうはどんなエラーが出るのさ?
222 :
208:2006/08/26(土) 23:33:57
variable declaration is not allowed here
変数の宣言なんてしてねえっつーのw
>>222 size_t が見えてないんじゃないかな?
#include <cstddef> の追加で通る?
224 :
208:2006/08/26(土) 23:47:16
そういえばsize_tって組み込みじゃないでしたね。
確か適切なヘッダーをincludeする必要があった。
ちなみにnewでもOKですね。当然ですけど。
225 :
208:2006/08/26(土) 23:56:51
結局最下部に
const 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でした。
printf("%d%",300);
300%と表示したい場合%がエスケープシーケンスになって壊れる。
どうしたらいいんでしょうか?
\x25とかやれば表示できるんですかね?
%d%%
ありがとうございます。これで寝れる。
229 :
京大生www:2006/08/28(月) 20:16:23
つーかC++ならstd::sort使えよ。std::qsort()ならcstdlibな。
>>230 そこじゃ無くてcompareの返り値じゃね?
って回答しちまったけど、別に
>>229は質問して無いんだよな。「原因が分らない」っていってるだけで。
234 :
京大生www:2006/08/28(月) 20:57:19
出来ない・・・・。
ようするに.xの成分で並び替えたいんです。
原因を追求してもらえませんか?
頭が悪いからじゃね?
>>234 return (p1->x - p2->x) ? (p1->x < p2->x) ? -1 : 1 : 0;
doubleがintに変換される際に小数点以下が切り捨てられてしまってるぞ。
なんつうか意味なく三項演算子とか使って背伸びしてるのが
別に無理してねーよ。最初の書き方から出来るだけ少ないタイプ量で
直しただけで。
239 :
京大生www:2006/08/28(月) 21:37:21
>>236 意味がわかりません。
ちゃんと書いてください。
>>239 if (p1->x < p2->x)
return -1;
else if (p1->x > p2->x)
return 1;
else
return 0;
と等価です。
本当に京大生か?頭悪そう・・・・
242 :
京大生www:2006/08/28(月) 21:50:55
あー。なるほど、正(負)の整数じゃなきゃだめなのか。
おkwwwwwwww
あとはー、どうやってパイ計算するか分かるか。
いや、おれにも出来るかどうかの確信はないのだがな。
そりゃ多角形の面積を求めればπも出てくるだろ・・・・
昔の数学者が初めて円周率を求めたのと同じ方法だ。
π=3
246 :
京大生www:2006/08/28(月) 22:50:46
>>243 まぁそういうことなんだけど、ただどうしておれがこんなややこしい変数のとり方をしているのかが分からないかな。
いや、ただしいという確証はないんだよ、でもおれのカンが正しければきっとsampleをあげれば正しいパイに収束するはずなんだ。
違うかな、なんとなくのカンなんだけど。
片方だけの取り方だと分布が一定じゃないんだけど、両方から攻めると分布が一定じゃないにしろ対称になる。(もちろん無限個とれば完全対称)
基本的には角度をとってやりたいんだけどパイが入るから出来ない。(求めるパイを使ってやるから)
なので無理やりにでも角度の分布とこの場合に同じ条件のものを作ろうと考えた結果、逆の分布を足して非対称を対称にしたらどうかと考えた。
ちょっとやってみるかな・・・出来なかったらちょっと頭が悪かったってことでw
ちょっとじゃなくてかなりだろ
無理せずにマチンの公式でも使っておけば?
テーラー展開すれば多倍長演算だけでできるぞ。
249 :
京大生www:2006/08/28(月) 23:13:35
頭が悪かったようだ・・・
質問です。
汎用レジスタ(ER0)の値をプログラムで判定したいのですが、
アセンブラ内でしかER0をいじれません。
C上で動かすにはどうしたらいいのでしょうか?
環境はHEW、CPUはH8Sです。お願いします。
252 :
京大生www:2006/08/28(月) 23:29:13
やったぁああああああああああああ
キタ━━━━━━(゜∀゜)━━━━━━!!!!
やべ・・・・・天才。
今から論文かこ、超画期的なアイデアだ・・・・
ちなみに
3.14159
までちゃんとでた。
>>251 EROはマン・コマンド といってみるレイヤー
たぶんライブラリ関数の帰り値がER0と書かれているんだろな。
ER0はCの関数の帰り値
つまり、C上で使えないどころか、その関数を呼んで
やりたい判定とやらをやればいいのであって
ある変数が、ヒープ上にあるか、そうでないかを判定する方法があれば教えてください。
>>259 標準には無い。環境を特定して移植性を無視すれば、なんとかなるかもしれない。
大抵の環境ならアドレス範囲見れば大体分かる。
262 :
京大生www:2006/08/30(水) 13:19:49
#include <math.h>
#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になる?
教えてくれよ
>>262 途中でsumがオーバーフローして結果がおかしくなってる。
intの代わりにdouble使ってみろよ。
いやdoubleでもオーバーフローするな。
long double(80ビット)を使ってようやく
1.02019e+612
という答えを得た。
オーバーフローしたからといって必ず0になるわけではない。
1*2*3*4*5*6*7*...*300
という計算をする途中 6=2*3 4*2*2 8=2*2*2
と2倍が1つある毎に下の桁が0に固定されてゆく
だからこの計算の結果は0になるわけだ
「答え」というのなら戻り値が0だからいいんじゃん。
>>266 そろそろ恥ずかしくなってきたんじゃないか?
268 :
京大生www:2006/08/30(水) 13:42:55
300だと演算が遅くてずっと計算中になった。
100だと一瞬で終わったがまぁ、元にかけるものも増えるから演算にかかる時間が爆発的に上がるんだろう。
足し算だと速い。
つまり足し算と掛け算の入り組む計算ではなるべく掛け算を減らした方が一般的に演算速度が早くなるということがいえる。
でおk?
そもそも、sum?
270 :
京大生www:2006/08/30(水) 13:44:44
別にいいじゃん。
どんなPC使ってんだよw
long doubleで300!を求めても一瞬だぞ。それともオーバーフローに
何らかの処理をする処理系なのか。
272 :
京大生www:2006/08/30(水) 13:50:52
え、そんなに性能悪くないと思うけど。
1,3Ghzあるし、メモリも512MB、何か問題があるのか。
300までの掛け算は諦めた、これ答えでねーよ。永遠の謎ってことでおk?
O(n) のアルゴリズムで n が 3倍になったら おおよそ3倍の時間コストかかるのは良いとしてだな
それ以上の時間差があったように見受けられるが、
オーバーフロー発生するごとにペナルティかかっているのか?
274 :
京大生www:2006/08/30(水) 13:51:40
ちなみにlong doubleはdoubleと等価でしょ?
とりあえずコテハンがウザイ
276 :
京大生www:2006/08/30(水) 13:53:08
>>273 なんで3倍なんだよ。もっとかかるだろ。
元の桁数が爆発的に増えすぎる。
>>274 処理系による。規格ではsizeof(double)==sizeof(long double)でも
一向に構わない。
俺はBCC使ってるから。VCだと同じ。
gccだとなぜかsizeof(long double) == 10になる。
>>276 あのう・・・・浮動小数点ってご存じですか?
279 :
麻布卒www:2006/08/30(水) 13:53:48
>>276 固定小数点演算してるのか? どういう処理系だよそれ
整数だけなんだから、多倍長演算もいいかもね。これなら
きちんと1の位まで求められる。
282 :
京大生www:2006/08/30(水) 14:08:05
#include <iostream.h>
#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;
}
max = 6でとまるんだが。
以前から思っていたが、京大生wwwは無知から来る謎の思い込みで
問題を無理矢理解釈しようとすることが多すぎだ。
前提知識が圧倒的に足りない。人に聞く前に勉強した方が早いと思う。
285 :
京大生www:2006/08/30(水) 14:10:46
京大生に教えるチャンスなんか滅多にないぞ
取り敢えずBCC用にこう直した。
#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;
}
1.60694e+60
2.58225e+120
4.14952e+180
6.66801e+240
1.07151e+301
1.72185e+361
0
結果はこう。
ちなみにVC8で
#include "stdafx.h"
#include <iostream>
#include <limits>
int main()
{
std::cout << std::numeric_limits<double>::max() << std::endl;
}
を実行すると
1.79769e+308
なので、そのままでは途中でオーバーフローを起こすのが目に見えている。
そこでBigInt
290 :
京大生www:2006/08/30(水) 14:31:26
>>287 おれはプログラムが止まった。
途中まではもちろん0
仕様?
今BCCのコンパイラ使ってるんだけど、これから
C++ builderを買うのと
VCの新しいやつ買うのとどっちがオススメ?なんかBorland悪名高いんだけど。
>>290 用途によるだろ。BDSは仕事にも勉強にも向かない。どちらかと言うと
趣味用。
VC8は仕事にも勉強にも多用されるし、参考書も参考サイトもいっぱいある。
途中で止まるのは、オーバーフローを起こした結果トラップでもかかったから。
そういう場合は、DBL_MAX以上の小数を扱えるクラスを作るしかない。
VC8のExpress Editionは無料なんでまずそれにしとけ
293 :
京大生www:2006/08/30(水) 14:36:34
BDSって何だよ
このスレだけ見てると京大の先生ってものすごく大変そうだな
そんな遠まわしじゃなくていいから、こういうやつには素直に言ってやれよ!
297 :
デフォルトの名無しさん:2006/08/30(水) 15:01:06
京大生はバカ
京大生wwwは、やればできる子。
京大生wwwに対して親切にレスしている奴は
何か親近感でも持っちゃってるの?
ヒント:ここは初心者歓迎
初心者以前はいかがいたしましょう
論外
きっと「俺もこんな時期あったなぁ」とほほえましく思って、
親切なレスをしてしまうのではないだろうか。
京大生wwwくんの中身予想
勉強がけっこうできる中学生か高校生。日本史苦手。
容姿普通。モテるほうではない。
特別な苦労をせずにいままで勉強ができていたのに、プログラミングで詰まっている。
将来京大に入りたいと思っていて、入れるくらいの成績もいまのところ取っている。
クラスでは頭がよくて嫌味なやつ、と思われているが、仲の良い友達はいる。
犬にかまれたのがトラウマ。動物全般が嫌い。
親にはついつい憎まれ口をたたいてしまう。
年の離れた兄とは仲がいい。妹をよくからかっている。
304 :
デフォルトの名無しさん: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;
}
配列の勉強やり直した方がいいと思うよ
306 :
304:2006/08/30(水) 17:33:32
ダメみたいですね。
Cでは、以下のようにできたんですが、
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;
}
どうやら君は初心者未満のようだ。
C言語なら俺に聞けの入門編スレにも行きなさい。
308 :
304:2006/08/30(水) 17:37:27
int **NewTwoInt(int X, int Y)
{
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;
}
それいぜんにその二次元配列の宣言の仕方は C# のもので、
C/C++ ではあなたの意図とはまったく違う。
310 :
304:2006/08/30(水) 17:42:26
ページに書いてあることと、
>>304のソースが同じに見える?
ちゃんとすみっこまで数字が格納できるか試してないでしょう。
今日からプログラムを勉強してみようと思ってるんですが
CとC++ どちらからはじめたほうがいいですか?
313 :
304:2006/08/30(水) 17:52:28
あっ、C#のやり方というのは
>>304の事で、
>>306>>308のやり方の方ではないのですね。
>>304のは、始めはうまく起動されたのですが、
何度かやると、強制終了されてうまくいかなくなっていました。
「わかったつもり」になる前に
どんな入門書にも書いてある「文法」を学べよ。
315 :
京大生www:2006/08/30(水) 18:11:11
おれはふつうにプログラムを勉強中の京大生です。
この前円周率の出し方をプログラムしたけど下10桁くらいでズレた。
たぶん精度の問題だと思うし、doubleとかintとかの違いを勉強してる。
あと演算速度とか、最適化っていうのかな。
基本的に頭はいいです。分かってるだろうけど。
教えてもらえば理解はするし、頼むからいろいろ教えてくれ。
BDSはわかった。
IDEという言葉は知ってたが、borland C++ builderという呼び名しか知らなかったし。
おれが言ったふたつのソフトの差は何?
どっちが優れてるんだ、ソフトを作るにはどっちがいいんだ。
borlandは倒産したんじゃねーの?
> 基本的に頭はいいです。分かってるだろうけど。
すまんが後半読んだだけで頭悪いこと丸わかりだから。
317 :
京大生www:2006/08/30(水) 18:34:10
才能をねたまれるのは慣れてます。
京大ってのは、なんでも手取り足取り教えてくれる大学なのかい?
自分で学ぶことの大切さを学ばなかったのかい?
そのへんが京大ぽくない。あくまでイメージだけど。
院卒がいるんだが(現在休職中)、そいつと似たり寄ったりで なんだかなーと思う次第。
# サンプルが極少数と限られているので一般化するのは危ないが。
自分で学ぼうとしない人にプログラミングは向いてないね。
というか自分で学ぼうとしない人に大学は向いてない罠。
322 :
京大生www:2006/08/30(水) 18:52:50
授業にはでません。
でも単位はとれます、なぜなら図書館で勉強するからです。
プログラムは授業ではやりましたが、足りません。だから自分でももっと深く踏み込んでいます。
これを自学自習といい、これこそが京大の掲げる教育理念であります。
だが、しかしプログラムは調べても分からないことが多すぎる。
なのであなた方に直接、ソースを見てミスを直してもらうという道をとっているだけ。
いってみれば2ちゃんはテキスト。
聞けば答えてくれるテキスト。
だけどあなた方から問題を出されたりすることはないでしょう。だからこれは自学自習です。
踏み込んでるじゃなくて迷い込んでるの間違いだろうw
324 :
京大生www:2006/08/30(水) 19:11:02
迷うことを怖れて踏み込まなかったのは誰だ?
>>315 よくわからないならとりあえずVisual Studio買っておけ
学生なら安いだろ
326 :
京大生www:2006/08/30(水) 19:19:05
安いが、いらないものを買ってもしゃーない。
それぞれに長所短所をまとめてくれ。
>>326 自分で長所短所を調べられないようなやつは
とりあえずVisual Studio買っておけ
328 :
デフォルトの名無しさん:2006/08/30(水) 19:42:35
分割コンパイルについて初歩的な質問をさせて下さい。
a.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です。
よろしくお願いいたします。
329 :
麻布卒www:2006/08/30(水) 19:47:13
>>327 とりあえずVisualを買うと、現在の環境(borland complierとbcpad)から何が変わるか教えてくれ。
IDEを買うとGUIのソフト作るの楽て聞いたけど、じゃあなぜVisualが売れるんだ、これでもソフトが作れるのか?
とりあえずデバッグが楽になるぞって書こうと思ったんだけど、
冷静に考えたら自分でデバッグとかしそうにないよね・・・
>>329 とりあえずIDEという言葉について少し用語集で検索して来い。
>>328 何のために
#ifndef _TMP_H_
#define _TMP_H_
をしているのか、よーく考えてみなさい。
馬鹿は意味も知らずにすぐ知ってる略語を使いたがるから困る
つられちゃダメだぞ!
335 :
京大生www:2006/08/30(水) 20:17:08
バカにしてんの?
デバックが楽になるってどういうことー?
おまえらそろそろ池沼STOP
337 :
デフォルトの名無しさん: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の関数を呼び出すと言った
方法が適切なのでしょうか?
>>337 g++ -c a.cpp -o a.o
gcc -c b.c -o b.o
g++ a.o b.o -o a.exe
/tmpにa.oとb.oを吐き出せばいいじゃん。
>>337 gcc -c b.c
g++ b.o a.cpp
b.cの関数の宣言を下記のようにextern "C" { }で囲むこと。
#ifdef __cplusplus
extern "C" {
#endif
// 関数宣言
void TestFunc();
#ifdef __cplusplus
}
#endif
342 :
デフォルトの名無しさん:2006/08/30(水) 21:01:57
ありがとうございます。
やってみます!
一番簡単なのは拡張子を・・・・
(完全アッパーコンパチではないから場合によっては無理だけど。)
344 :
京大生www:2006/08/30(水) 21:05:14
東大生がきたwww
345 :
デフォルトの名無しさん:2006/08/30(水) 21:06:06
だから、京大生じゃないんだって
いつまでマジレスしてんだか・・
346 :
デフォルトの名無しさん:2006/08/30(水) 22:13:52
>>337です。
皆さんアドバイスありがとうございました。
>>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 ...
という感じになりました。
本当に助かりました。有難う御座いました。
makeファイル書けよ・・・・
>>347 makefileを書くと負けだと思っている
automake使えよ
mkmfでいいじゃん
京大生ってなんて読むの?
きょん・でじゅん?
京大生www =
×京都大学
○京城帝国大学(現ソウル大学)
うはwこっちのスレも京大生に感染したwww
354 :
京大生www:2006/08/31(木) 10:56:35
呼んだ?
108 名前: デフォルトの名無しさん 投稿日: 2006/08/31(木) 15:00:13
win98でも動くようにと思いながら作ってて試してみたら正常に動かなかったので、環境依存の問題として質問させてください。
値が変になったクラスは、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依存
そしてここは重複スレだ
すみませんでした。
そうですよね、なんで値があわないんだろう。
357 :
355:2006/08/31(木) 16:25:52
重複すれの108です。
>>356 重複すれだと言われたので、移動して、最後に返答しました。
「すみませんでした。
そうですよね、なんで値があわないんだろう。」
が最後の返答でした。
358 :
355:2006/08/31(木) 16:37:08
>>109 2.コンパイラによる
というのは、コンパイラによってはOS依存になりえるということでしょうか。
32bit整数はos依存とかいう記載もいくつかあったもので・・・・・
359 :
337:2006/08/31(木) 21:34:13
>>337です。
c++のソースの中で他のファイル(c言語)の関数を実行するプログラムを書いています。
System関数を用いて、cのオブジェクトファイルを実行すると何度でも問題なく動くのですが、
c++のソース内から直接cの関数を呼び出そうとすると、1度目は成功するのですが、2度目からSegmentationFaultに
なってしまう現象が発生してしまいます。(cの関数内では、システム情報を
取得し、ファイルに書き出す処理をしています。)
System関数で呼び出す方法と、直接呼び出す方法では何か大きな違いがあるのでしょうか?
cの関数内でfreeを行っているのでメモリの問題は無いと思っているのですが...
>>359 Cのソースが一度の呼び出ししか想定していない、とか。
static変数の初期値に依存していたりしないか?
>>355 x86系のWin98とXPなら、そのへんは環境による差はないよ。
本当に同じプログラムを実行しているのか確認せよ。
これ以上は、実際のコードを出さないとアドバイスは得られないと思う。
どうせwin98でサポートしてないAPIでも呼び出したのでわ?
>>359 >System関数で呼び出す方法と、直接呼び出す方法では何か大きな違い
ありすぎですわ。
多分
>>360の指摘するとおり。
365 :
355:2006/09/01(金) 10:02:50
>>361-363 関係ないところでミスしてました。
お騒がせして申し訳ありませんでした。
API使ってないと云ってましたが、ユーザ名とコンピュータ名の呼び出ししてて、
コンピュータ名の呼び出しで、第2引数のバッファの大きさの値が、ユーザ名の呼び出しの
ときに小さい値に変えられてて、それを直すの忘れてたからでした。
win98のPCのユーザ名がコンピュータ名より短くなっててコンピュータ名が取れて無かった
せいでした。
本当にごめんなさい。
最近C言語に興味をもった初心者以前の者です。
お薦めな入門書とかあったら教えていただけないでしょうか?
367 :
京大生www:2006/09/01(金) 19:22:26
ネットで十分
>>366 最近はアセンブラの良い本が出てるらしいな
それを読め
C言語の入門書で正確にマシンアーキテクチャの概念を
定義している本はないので読んでも無駄
メモリやアドレスの定義がないので絶対わからん
あー、そうかそうか!
実際のメモリがどうなってるか知らなければ、そりゃポインタわからないよな。
何かすごい納得した。今日はいい日だった。
370 :
デフォルトの名無しさん:2006/09/01(金) 23:32:01
はじめまして。最近C++を勉強しだしたものです。
OOPの本を読んで、基底クラスの属性を、派生クラスは
継承するもんだと思ってたのですが、
実際にコードを打ってみた所、理解できない現象が起きて困っています。
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();
}
371 :
デフォルトの名無しさん:2006/09/01(金) 23:32:32
↑の続き。
publicで継承した場合、派生クラスは基底クラスのprivateメンバ変数と同じ変数を自分で持っているんじゃないんでしょうか?
このプログラムだとエラーが起きて、Base::iMemberの宣言を確かめろ、みたいに言われてしまいます。
protectedに指定すれば、privateでもちゃんと継承しますよね。
protectedに指定するしかないんでしょうか。
>>371 private宣言のプロパティは子クラスからは参照できない
373 :
デフォルトの名無しさん:2006/09/01(金) 23:49:56
>>372 ありがとうございます。ちょっと理解できました。
すみません、少し違う質問をしたいのですがいいですか?
派生クラスのオブジェクトを生成すると、自動的に基底クラスも生成されるんですよね?
374 :
京大生www:2006/09/01(金) 23:50:49
継承は
::publicではなかったか。
>>373 派生クラスのオブジェクトの中に基底クラス部分が含まれるという
意味なら合っている。
376 :
デフォルトの名無しさん:2006/09/01(金) 23:56:32
>>374 それはソースのどの部分のことを言っているんですか?
スコープ演算子は継承と直接的にはあまり関係ないような気がするのですが・・・。
378 :
デフォルトの名無しさん:2006/09/02(土) 00:08:35
>>375 ありがとうございます。最後の質問をさせてください><
派生クラスのオブジェクトを作った際に、基底クラスのpublic宣言したメソッドを利用して
基底クラスのprivate変数にアクセスすることはできないのでしょうか。
派生クラスの部分として基底クラスも生成されているのだとしたら、
できそうな気がするのですが・・・。
>>377 了解しました。
>>378 それはやってみれば分かるんじゃないか?
書くのがそんなに難しいコードになるとは思えんが。
380 :
デフォルトの名無しさん:2006/09/02(土) 00:12:22
>>378 すみません、一応書いて実行したらエラーが出た所まではやってみました。
ただこれをどう理解すればいいかで、ちょっと解らなくて聞いてしまいました^^;
381 :
デフォルトの名無しさん:2006/09/02(土) 00:17:20
Java使いがC/C++言語を学ぶ上で特に気をつける点はなんですか?
>381
Bjarne Stroustrupのギャグには大爆笑する。
質問です、DLLを作ろうと思うのですが
・実行時ロードでクラスをDLLに含む事は可能でしょうか?
・A.dllを作成した時、A.dll内に本体(仮にB.exeとする)の関数(B.exe内のHoge()とか)を呼び出す事は可能でしょうか?
>>387 「クラスをDLLに含む」の意味がわからん。
B.exe から Hoge() がエクスポートされていれば呼び出すことは可能なはず。
>>387 前者は無理だ。
オブジェクトを作って返す関数を公開するなどの間接的な手段を取る必要がある。
後者は388の言うとおりだが、EXEからDLLへ関数へのポインタを引き渡すのが一般的だと思う。
390 :
387:2006/09/02(土) 00:44:43
>388
ありがとうございます、「・実行時ロードでクラスをDLLに含む事は可能でしょうか?」は
DLL内に関数のようにクラスが記述できるかということです。DLLはクラス非対応と聞いたのですが、
とはいえクラスだけの為にCOMを使うのも………どうにか使う手段があるのでしょうか、といった感じです。
純粋仮想関数のみで構成されたインターフェースクラスを利用するとか。
言語的な保証は無いがCOMも同じ様な仕組みだし、注意深くやれば大丈夫だと思う。
393 :
デフォルトの名無しさん:2006/09/02(土) 00:59:27
ロケールについて質問なんですが、
std::locale::global(std::locale("japanese"));
ofstream file("ほげ.txt");
file << 12345 << endl;
とやると、ほげ.txtには"12,345"みたいに、
整数文字列中にカンマが入っちゃうんですが、
これを"12345"と出すにはどうすればいいんでしょうか?
環境はVC2005です。
>389
ありがとうございます、やはり無理ですかorz
「EXEからDLLへ関数へのポインタを引き渡す」とは、どんな感じでしょうか?
プロトタイプ宣言とかでしょうか?
>391
FactoryMethodとインターフェースクラスとかでしょうか?
何と無く理解出来た気が、ありがとうございます。
TTBaseっていうオープンソースのフリーソフトがexe本体からdllに関数をエクスポートしていた記憶がある
>>393 これでどう?
// japanese ロケールのうち numeric カテゴリのファセットを
// C ロケールのファセットで置き換えたロケールをグローバルにセット
using std::locale;
locale::global(locale(locale("japanese"), "C", locale::numeric));
>>396 やってみると、出力は12345になってくれるんですが、
出力ファイルのファイル名が化けてしまいます("ほげ"のところ)。
ロケール関連は情報が少なくて困る・・・
>>397 >>393 のままならファイル名は化けないの?
numeric カテゴリ以外は japanese が使われるはずなんで、
そんなことは無いと思うんだけど。
VC2005 のロケールにはバグがあったような覚えがあるんだけど、
これも関係あるのかな?
そもそもファイル名はマルチバイト文字だし、ロケールは関係ないはず。
ofstream file("ほげ.txt");
のところを
ofstream file(L"ほげ.txt");
としたら、出力ファイル名OKでカンマもなくなりました。
なんか結局ロケール設定はいらなかったぽいです。
でも、ofstreamにwchar_t *渡してコンパイル通るのっていいのかな・・・
>>398 >>393のままならファイル名は化けませんでした。
なんかここら辺の関連性が良くわからない・・・
ちなみに、ロケール設定なしでofstream file("ほげ.txt")にすると、
ファイル名化けました。
401 :
400:2006/09/02(土) 02:12:41
402 :
380:2006/09/02(土) 02:13:04
>>382 すみません、あれから色々試した結果一応解決(?)できたと思います。
最初↓のようなコードを書いて試したらエラーになりました。
#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();
}
403 :
380: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関数からアクセスする場合は、派生クラスの関数を利用しないと
駄目なんですね。
>>403 アクセサについて調べた方が良さそうだな。
405 :
380:2006/09/02(土) 02:54:50
>>404 ありがとうございます。調べてみました。↓のように変えればいいのでしょうか?
この方が良いコードなのですか?
#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();
}
>>405 普通はそういう風に書くね。見通しがいいだろ?
>>405 そんなサンプルでは良い悪いは判別不能。
そういう方法が使えるということだけ覚えておけばいい。
408 :
380:2006/09/02(土) 03:07:37
>>406、
>>407 ありがとうございます。大体の文法は頭に入れたつもりなんですが、
どういう風に使うのかとかがぜんぜん解らず^^;
デザインパターンを覚えろと言われたので、今度からそれも勉強していきたいと
思っています。
387
TTBaseについて調べてみました
externでプロトタイプ宣言するといった感じの様に思えますが、合っていますでしょうか?
410 :
387:2006/09/02(土) 09:29:49
連レスすみません、どうやらexternではないようですね(汗
GetModuleHandle(NULL)からGetProcAddressするみたいですね。
GetProcAddressは知っていましたが、本体側にコールする方法に使うとは想像出来ませんでしたorz
一応、報告までに。色々教えてくださり、有難う御座いましたm(_ _)m
411 :
デフォルトの名無しさん:2006/09/02(土) 11:40:51
C++で書いたプログラムにコマンドラインのユーザーインターフェースを付けたいのですが
どうしたらいいでしょうか? シェルとかgnuplotみたいな感じで履歴とか補完ができるとうれしいです。
一から全部作るべきでしょうか?
八方ふさがりです。助けてください。
>>411 B-ShellなりGnuPlotなりのソースでも見てみたら?
尤も、1行編集機能は環境に任せられるなら
履歴管理くらいは自分で作っても簡単だろうけど。
>>411 >ユーザーインターフェース
これをemacsにするとか
414 :
デフォルトの名無しさん:2006/09/02(土) 16:48:53
C++ で
sizeof(bool) == sizeof(char)
であることは、保証されていますか?
>>414 されていない。sizeof(char) == 1 だが、sizeof(bool) は実装依存。
ISO/IEC 14882, Section 5.3.2 参照。
int サイズのコンパイラも見た事ある。
VC++4.2では4byteらしいよ
>>411 readline(GPL)や、libedit(BSD)というライブラリがあります。使い方は難しくないです。
でもあなたの環境ですんなりリンクできるかは知りません。
420 :
デフォルトの名無しさん:2006/09/03(日) 00:25:37
C++は、ANSI-CでどのC (C89、C99とか)と互換があるんですか?
421 :
デフォルトの名無しさん:2006/09/03(日) 00:30:42
C言語勉強中です。
float array[3][2] = {1.1 , 2.2 , 3.3 , 4.4, 5.5 , 6.6 };
float *p;
p=(float *)array;
ここでfloat *型にキャストしないとエラーになるのはどういう理屈なんでしょうか。
p=array;でもいいような?
422 :
デフォルトの名無しさん:2006/09/03(日) 00:39:30
float array[3][2] = {{1.1 , 2.2 , 3.3}, {4.4, 5.5 , 6.6 }};
float *row0=array[0]
float *row1=array[1]
だから。
p=(float *)array;
は、
float array[3*2]
と同じようなもので、float array[][]ではないからキャストが必要。
arrayの方は float (*)[2] であって、float * ではないから。
>>420 どれとも完全な互換性はない。
非互換になっているところは型安全性のためというのが主な理由。
>>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]
>>421 2次元配列ならダブルポインタ(float **p)にしないとだめなのよ
ポインタの配列を示すポインタってことになるかな
いや、実際の処理系がどうこうじゃなく、そう考えた方が理解しやすいという話
>>426 理解しやすいとかじゃなくて完全な間違いだボケ。
gccにC++のISO規格に準拠できていない機能ってありますか?
>>42 完全な間違いではないよ
アセンブラでは結局アドレスに1次元のサイズをn倍したアドレスを計算で求めてるだけでそれをテーブルに展開していれば同じこと
君インデックスレジスタとかオフセットアドレッシングとかはわかってるかな?
>>430 float[][] の配列にアドレスのテーブルなど無い。
>>431 テーブルがあるかないかではないんだけど
ま、いいけどね
アセンブラ勉強してみ
アセンブラ云々言う前に
配列の配列
ポインタの配列
の違いはわかってるのかね。
アセンブラでの扱いだって全然違うよ。
(x86の場合)、配列はleaでアドレスを得るもので
ポインタはmovでアドレスを得るもの。(この場合はロードの意のmov)
>>430 もう見ていて痛すぎるので知ったかぶりはやめろ
また新しいのが湧いたな。たのむからコテハン使ってくれよ。
アセンブラ君はコテハンとトリップ付けてよ。君の発言面白いから。
>>434 いや多分
>>430の本来言いたいことは、配列が*になるならば、配列の配列は**になる
という摩訶不思議なCの法則(ってか初心者が挫折しやすいところかな?)を理解するにはそう考えるといいのかな?
って事なんじゃない貝?
よくわからんけど
>>439 なぜ配列の配列が ** になるんだ馬鹿か?
配列が*になるならば、配列の配列は**になるという摩訶不思議な法則などありません。
「ポインタ配列」なら ** に変換できるかもしれないが、配列の配列は
[]の数が増えるだけですよ。
飽きた
たぶん分かっててわざと間違えたふりをしてるんだろ。そうだろ?
皆さんレスありがとうございます。なかなか難しいですね。
ポインタをみっちりやったら充分な理解ができるでしょうか…
とりあえず
・float array[x][y]は【float [y]の配列】という型
という認識を胸に刻んでおきます。
あ、445は421です。
>>445 ちなみに、Cの多次元配列は、最初の次元に限りポインタ化する事ができる。
float[1][2][3]なら、float (*)[2][3]に変換できる。というかされる。
あ〜ごめん
**じゃなくて*[]の話してたみたいだ俺w
元レス読んでなかったわ
酔ってるし寝るわ
449 :
デフォルトの名無しさん:2006/09/03(日) 02:25:33
>>422で分からなかった?
いつまでもつまらんけど、やっぱ初心者が集まってるんだなと思った。
>>424規格(C)がどうのなら、float * p = &**arrayかな
>>449 >規格(C)がどうのなら、float * p = &**arrayかな
またわけのわからん事を言う。
451 :
デフォルトの名無しさん: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");
}
>>451 %cは何を出力するかわかっている?
つーか、0x7888の文字って何の積もりよ。
453 :
デフォルトの名無しさん:2006/09/03(日) 08:07:44
>> 452
%c は文字を出力。
その(0x7888)は、どの文字に該当するかを知りたい
だけ、初期値はなんでもよいと考えました。
>>453 そんな文字はない。だから何が見えるかは環境依存。
455 :
デフォルトの名無しさん:2006/09/03(日) 09:19:00
文字というか1キャラクタじゃないの?
シングルバイト文字。
マルチバイト文字を%cで表示しようとしてるならアフォでは?
>>455 んなこたーない。マルチバイト文字列は一バイトずつ出力してもいい筈だ。
#環境によるカも知れない。
457 :
デフォルトの名無しさん:2006/09/03(日) 10:46:29
みなんさんご支援ありがとうございます。451です。
ん〜、マルチバイトコードを表示させるには
どうすればよいのか? %cではNG?
取り敢えず素直に既存文字を出力することを考えてみたらどうだろう。
Ex.
char code1 = "糞"[0];
char code2 = "糞"[1];
unsigend code = code1 << 8 | code2;
printf("%x:%c%c\n", code, code1, code2);
ターミナルのコードページがあってないだけだったりして
大丈夫、>451はそれ以前に全く理解ができていないから。
461 :
デフォルトの名無しさん:2006/09/03(日) 11:38:04
tera termの設定でECUに設定しますよ。
>>460 本来と逆(逆引きに)なりますが、"日本" というコードは、
EUC または、SJISではどのような16進数になりますか?
としたら?
日本語でおk
バイナリエディタで見るなりコード書くなりで調べろカス
>>461 >458をやってみて納得できてから先へ進め。
465 :
デフォルトの名無しさん:2006/09/03(日) 11:59:05
どうもありがとう。> 463 調べる大元を対応表みたいなものを
コードで書こうとした結果です。コメントが厳しいね。
> 464 どうもありがとう。そうします。
466 :
デフォルトの名無しさん:2006/09/03(日) 13:46:39
もうしわけない。
> 464 "糞" -> "日" に変更して実機でやってみた。
0xfffffffc:日
16進の表示がおかしくないですかね。
EUCの場合は、0xc6fc ぽい表示でないと。
ヒント:補数
468 :
デフォルトの名無しさん:2006/09/03(日) 14:15:50
> 467
補数? わからない。です。
2の補数は引き算を加算にする場合に使用するものだが。
468からはエキサイト翻訳の香りがする
Excite翻訳って「ん〜」とか出るのかよw
符号拡張。
つうか、文字コード確認せずに表示おかしいって、釣りだろ、これ。
>458はcharじゃなくてunsigned charだな。
473 :
デフォルトの名無しさん:2006/09/03(日) 15:07:14
> 472
0xc6fc:日
unsigned char に変更したら、期待したコードが表示されました。
474 :
デフォルトの名無しさん:2006/09/03(日) 15:52:21
EUCコード表にないコード(0xc6ff)を表示は、表示できない?
たとえば、以下のコードの順番で、0xc6ff は?
0xc6fc:日 0xc6fd:乳 0xc6fe:入 0xc6ff:�
動xc700: 念xc701: 念xc702: 念xc703:
476 :
デフォルトの名無しさん:2006/09/03(日) 15:59:52
>> 475 やった結果なんですが。
478 :
デフォルトの名無しさん:2006/09/03(日) 16:06:27
>> 477 すいません。
>451 のサンプルコードで、CODE=0x7888; を CODE=0xc6fc
に変更してコンパイル実行した結果。 >474 の結果になりました。
480 :
デフォルトの名無しさん:2006/09/03(日) 16:17:12
>> 479
いやいや、そのあとのコード(0xc6ff 以降が)表示が
おかしくなるのです。
>>480 ない文字を表示しようとしてどうするの?
483 :
デフォルトの名無しさん:2006/09/03(日) 17:42:25
>> 481 482
そういうことですか。割り当てられていないコードは
なにか、空でもよいから表示されるものかと思いました。
484 :
デフォルトの名無しさん:2006/09/03(日) 20:18:15
C++ で次のようなことはできないの?
#if sizeof(bool) == sizeof(char)
同じようなことをしたいとき、どうやればいい?
>>484 プリプロセッサで sizeof は評価されない。
template メタプログラミングの手法を使えば、大体のことはできる。
一体何がしたくてそんな事をするのか
487 :
デフォルトの名無しさん:2006/09/03(日) 20:24:14
>>485 やっぱそれしかないかー。
>>486 bool 型のサイズに等しい符号付き整数型 (仮に BoolInt とする) を使って、
bool バッファを BoolInt バッファに変換した上で、
負の数を格納したいのら。
void Func1(bool* pBool)
{
BoolInt* pInt = (BoolInt*) pBool;
pInt[0] = -1;
... ごにょごにょ ...
最後はバッファには 0, 1 しか格納されていないことを保証する
}
何かの研究でやってるのか?
BOOL使う時って、0かそれ以外の理論値判断なんだから普通気にしないだろ。
メモリを爪に火をともすように頑張っていた昔と違って、PCスペックの余裕がある今
BOOLで真偽以外の数値を扱うって見にくいプログラムになりやすいと思うけど。
>>487 > 負の数を格納したいのら。
> ...
> 最後はバッファには 0, 1 しか格納されていないことを保証する
おかしくね?
491 :
デフォルトの名無しさん:2006/09/03(日) 20:59:35
>>489 >何かの研究でやってるのか?
まあ、そうだね。
画像処理のアルゴリズムでよく出てくるのだが、
一時的に 0,1 以外の値を入れたいことがある。
>>490 計算の途中だけ -1 をいれたいのら。
>>491 そんなもんは最初っから signed char か適切な enum の配列にしておけ。
計算の途中だけというのが重要なら Func1() の前後で変換しろ。
493 :
ららら:2006/09/03(日) 21:11:50
>>492 二値画像は、デフォルトで bool 型にしたいのら。
char と相互変換するのはコストが高いのら。
494 :
ららら:2006/09/03(日) 21:13:15
>>485 とりあえず、テンプレート メタで実装しといた。
Generative Programming に書いてある IF テンプレートで。
そんなに気になるならOSとコンパイラの中身チェックしないと駄目だろ
ユーザがその気でも中身では違う事やってますとかあるし
移植性が要らないなら好きにすればよかろう。
497 :
ららら:2006/09/03(日) 21:17:03
>>495 私にいってんの?意味がよく分からないのだけど。
498 :
ららら:2006/09/03(日) 21:17:42
>>496 なにいってんの。移植性を保ちたいから sizeof で判断してんじゃない。
>>493 二値画像は、デフォルトで bool 型にしたいのら。
これが間違いだな。余計にコストがかかってる可能性もある。
>>498 移植性が要るなら無茶なキャスト挟んだ時点でアウトだろ。
501 :
ららら:2006/09/03(日) 21:19:20
>>499 じゃあ、何型にすればいいのら?
一時的に bool 型と同じサイズの整数型に変換できるなら、何もコストかからないだろう。
どうしてこう、次から次へと逸材が現れるんだろう?
503 :
ららら:2006/09/03(日) 21:20:10
>>500 どうして無茶なのら?サイズが同じなら、いいだろ?
504 :
ららら:2006/09/03(日) 21:20:18
わたし ファンキーーララー
505 :
ららら:2006/09/03(日) 21:21:14
506 :
ららら:2006/09/03(日) 21:21:51
507 :
ららら:2006/09/03(日) 21:22:11
ららら〜♪
以降私が本物ですので。
偽物ずうずうしい
偽物は余裕が無くてこまるら
>>501 例えば、
int i = ...;
bool b = i; // (i != 0) がテストされる。
signed char c = i; // 単純に上位ビットが切り捨てられる。
i = b; // b に対応するメモリから読み出した値が 0 かどうかによって 1 と 0 に変換される。
i = c; // 単純に符号拡張された値が入る。
こんな違いが考えられる。最適化で消えることもあるだろうけどね。
偽物は消えてください。
514 :
ららら:2006/09/03(日) 21:28:36
>>503 移植性は失っている。
整数 1 のメモリ上の表現と true のメモリ上の表現とに互換性があるという保証は無い。
516 :
ららら:2006/09/03(日) 21:29:24
2人も偽者がいるようなのら。本物はトリップつけておりませんので。
>>512 論点が分からないなー。それで何かコストがかかっているの?
518 :
ららら:2006/09/03(日) 21:30:12
519 :
ららら:2006/09/03(日) 21:34:03
>>516 この違いが気にならないなら、コストでんでんを語る必要は無い。
521 :
ららら:2006/09/03(日) 21:34:39
>>515 > 整数 1 のメモリ上の表現と true のメモリ上の表現とに互換性があるという保証は無い。
ふむー。たしかになー。
何かうまい方法はないかなー。
523 :
ららら:2006/09/03(日) 21:36:43
>>522 その方法しかない?
bool 型は変えたくないんだけど。。
524 :
デフォルトの名無しさん: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' の宣言を確認してください。
のエラーがでます。関数内で構造体の宣言をするとエラーはでませんでした。
しかし、他の関数からも参照したいのでグローバル領域で宣言する方法はありますか?
どなたか教えてください。
>>524 最初の typedef が要らないんじゃね?
527 :
ららら:2006/09/03(日) 21:43:07
>>525 0-画素か 1-画素かの判定に、ブール演算で記述できること。
if (img(0,0)) とか。
これを char 型にしてしまうと、
if (img(0,0) == 1) とか書かないと、意味がはっきりしないよね。
つまり、二値画像において、-1 という値は通常有り得ないんだけど、
計算の都合上、ちょっとだけマークをつけたいときにだけ使いたい。
528 :
ららら:2006/09/03(日) 21:46:32
>>524 変な定義の仕方だねー。普通こんなにするだろ。
typedef struct FILEINFO_ {
HGLOBALhMem;
structFILEINFO *prev;
structFILEINFO *next;
WIN32_FIND_DATAw32fd;
} FILEINFO
FILEINFO fileinfo;
>>528 タグ名に意味の無いアンダースコアつけるのやめてくれ。
530 :
ららら:2006/09/03(日) 21:49:39
532 :
ららら:2006/09/03(日) 21:54:31
>>531 使うのは FILEINFO のほうだけだから、いいだろ。
533 :
ららら:2006/09/03(日) 21:55:13
FILEINFO *fileinfo; だよ。
>>532 あくまで一般論だが、アンダースコアはタグ名の頭か、または両方だろう。
>>520 >コストでんでん
突っ込んで欲しかった?
537 :
ららら:2006/09/03(日) 21:57:31
でんでんむしむしららららら〜♪
539 :
ららら:2006/09/03(日) 21:58:31
>>535 すんません。構造体の中で使っているんだな。気がつかんかった。
typedef struct FILEINFO_ {
HGLOBALh Mem;
struct FILEINFO_ *prev;
struct FILEINFO_ *next;
WIN32_FIND_DATAw32fd;
} FILEINFO;
FILEINFO fileinfo;
540 :
ららら:2006/09/03(日) 21:59:27
>>535 すんません。構造体の中で使っているんだな。気がつかんかった
typedef struct FILEINPO_ {
HGLOBALOSww Mem;
struct FILEINPO_ *prev;
struct FILEINPO_ *next;
WIN32_FIND_DATAw32fd;
} FILEINPO;
FILEINPO fileinpo;
541 :
ららら:2006/09/03(日) 22:00:10
>>535 すんません。構造体の中で使っているんだな。気がつかんかった
typedef struct FILEINPO_ {
HGLOBALOSww Mem;
struct FILEINPO_ *prev;
struct FILEINPO_ *next;
WIN32_FIND_DATAw32fd;
} FILEINPO;
FILEINPO fileinpo;
>>527 その記述上の利点と、移植性を失うことおよび template メタ IF まで
担ぎ出す破目になったことを秤にかけて、あとは自分で選べ。
543 :
ららら:2006/09/03(日) 22:01:34
>>539 やめてくれって言ってるのに、そっちを直すのか。何の宗教かねまったく。
545 :
ららら:2006/09/03(日) 22:02:44
>>542 いや、それは違うと思う。自分でやるなのら。
546 :
デフォルトの名無しさん:2006/09/03(日) 22:02:53
ちょっと目を離した隙に随分進んでますね
早々にコテハン付いたんで被害は少ないな。
548 :
ららら:2006/09/03(日) 22:04:05
偽物がたくさん湧いて困るのら
549 :
524:2006/09/03(日) 22:05:41
ありゃ、どうも徹夜で頭が混乱してました。定義自体そのものが
間違ってました。(^^;)
皆様ありがとうございました
デストラクタが例外を投げてはいけないと聞いたのですが、
なぜですか?
>>551 デストラクタは例外が投げられたときによく使われるからです。
>>552 retgkregkre:kg3^4−0ti5tすきすいせまきいすりれきまふれまけすき
重複スレでようやるわ
リアルタイムで必要なデータの量が多く、
頻繁にソートやデータのコピーをする場合
一般的にどのような方法で保持するんでしょうか?
例えば
typedef struct{ typedef struct{
int a; char str[128];
int b; int c,d,e;
{ Hoge; Hoge hoge[30];
} Piyo;
こんな感じの構造体があって、Piyoが数万件ある場合などです。
ポインタの配列でも持っておけばいい。
557 :
デフォルトの名無しさん:2006/09/04(月) 17:53:33
質問です。Perlの配列のように、各要素が型を限定しないようなリスト構造をC言語で作りたいと思っています。
リストの構造は線形リストを使えばそんなに難しくないと思うのですが、データを保持する方法で悩んでいます。
基本的には格納するデータへのポインタをリストの要素に保持すれば良いと思うのですが、どのような手法を使うか悩んでいます。
現時点で思いついたのは
1.
リストの要素に格納する時点でポインタに型を持たせる
2.格納しているときはvoidにしておいて要素を参照するときに型を変換する
です。どちらにしてもそのポインタがどんな型のオブジェクトへのポインタであるか判定して、適切に型変換をしないといけませんよね。
その「どんな型のオブジェクトへのポインタか判定する」方法がなかなか思いつきません。
よろしければアドバイスをお願い致します。
Cなら配列要素に型情報も含める enum が適当か? Set 時は自己責任だな。
C++ ならオブジェクトを基底クラスにして、そのポインタを保持。
Set時は new 派生クラス ってな感じか。
>>557 格納するときに、(フラグとして)中身の型を示す変数も格納しておくとよい。
std::list<boost::any>
>>560 俺もそう書こうとしたが、557はCでと書いている。
面倒だから union 使ってしまうなぁ。
上に同じ。
union大好きー。
C言語を勉強したばかりの頃(いや、今も初心者脱出できてないけど)は
unionを何に使うのかサッパリ思いつきもしなかったなあ。
いまだにわざわざ使う必要性が理解できません。
ファイルヘッダとか通信で使う事はある。
unionとgotoはソースに打ったことがない。
goto は使うだろ。普通。
使わねぇよ
BASIC使ったこと無いやつが居るらしいな
BASICの話なんかしてねーよボケ
俺はgotoよりunionを使ったことの方が多い。
goto 使わない奴は多段ループをどうやって抜けるのかな
まさかループを細かく切り取って関数にしてないだろうな
returnでいいじゃん
沢山 return使うと、アセンブラが読みにくいから止めてくれと、まあ、昔はそう言われたんですよ。
goto擁護はいつも多段ループ多段ループって五月蝿いけど
多段ループから抜けなきゃならないようなプログラムを
しょっちゅう書いているのか?
だとしたらその糞プログラム構成をまずどうにかしろよ。
無駄に関数に分けたり後始末を分散させるよりまし。
多段ループから抜ける必要のないプログラムなら
まず関数に分ける必要もないわけだが
多段ループよりエラー処理に使うな
C++じゃ使わないけど
多段ループからの脱出なら、goto使って悪いとは思わないし、
むしろ唯一といってよいほどのgotoの使いどころだと思っている。
goto で脱けなきゃならない多段ループなんてのは実装に問題ありだろ。
まあ、エラー処理で使うのがもっとも妥当。
ええい、ごとごとうるせい。
むしろunionについて熱く語れよ。
俺が読んだ入門書にはunionの使い方として
x86のレジスタをエミュレーションする例が載ってた
axとeaxをunionのメンバにしたりして
おいおいえらい限定的な使い方だなと突っ込みつつ読んだ記憶が
全銀手順とか郵政手順とか、固定レコード長でフラグによって内容が
変わるようなデータに使ったよ。
ハードウエアのレジスタ触る時はunion便利。
windows上のアプリ作成等ではほとんど不要なのかね。
588 :
デフォルトの名無しさん:2006/09/05(火) 21:00:26
C言語を
アセンブラの延長と見るか
OSのAPI操作の一貫と見るか
その差じゃないか
UNDO/REDOのリスト構造で union 使ってるのは見たことがあるな。
C++ なら仮想関数でやるんだろうけど、C だと enum で適当に判断してやるしかない。
590 :
デフォルトの名無しさん:2006/09/05(火) 22:50:08
557です。お答え頂いた皆様どうも有り難うございます。
ちょっとスレが進んでしまったので場違いみたいですがお礼申し上げます。
私が思いつかなかったアイデアがあって参考になりました。
チャレンジしてみようと思います。
unionは組み込み系の実験の時多用したな。
gotoはこの間初めて使ったけど、多分2度と使わないな。
実は一番gotoを使ったのはVBだったのは内緒だ
もちろんエラー処理でね
how many filesの時代はgotoだらけだった
unionと言えば、下の関数のCHAR_INFOのメンバーに
unionのメンバー変数があるみたいだが、使い方が分からん。
どなたか知っている方がいたら、ご教授よろしく。
BOOL ScrollConsoleScreenBuffer(
HANDLE hConsoleOutput, // コンソールスクリーンバッファのハンドル
CONST SMALL_RECT *lpScrollRectangle,
// 移動対象のデータブロックを表す長方形のアドレス
CONST SMALL_RECT *lpClipRectangle,
// クリッピング長方形のアドレス
COORD dwDestinationOrigin, // スクリーンバッファ長方形の新しい位置
CONST CHAR_INFO *lpFill // 塗りつぶしに使う文字と色のアドレス
);
MSDNは見ないのか
WindowsAPIのunionなら、VARIANTが最強だな。
こんちは、お世話になります。
C++のmap(STL)を使って連想配列のクラスを作ろうと思います。
そこで相談です。keyとなる型にchar[256]を使うか、std::string
を使うか悩みます。stringの方が圧倒的に楽そうなのですが、
charの固定長でもいいかな、と思います。どちらがお勧めですかね?
条件として、
1. なるべく環境非依存にしたい(Linux+gcc,Windows+VCの両方で無難に使えるコード)
2. キーになる文字列はシングルバイト文字だけ。
3. 用途はexpatを使って解析したXMLのデータを収めたい。
char型で作るなら、mapなんか使わず、0から実装してもいいという感じもします。
STLは今日勉強し始めたばかりなので、悩みます。
よろしくお願いします。
>>597 string の方が楽なんだろ。何を悩んでいる?
599 :
デフォルトの名無しさん: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;
};
>>599 >class base
>{
>friend class base;
なにこれ?
601 :
599:2006/09/06(水) 07:56:03
書き間違えました。
[正] friend class funcs;
>>599 static_cast<base&>(obj).foo();
603 :
599:2006/09/06(水) 08:19:41
>>587 LARGE_INTEGER(64bit整数)でお世話になってます
>>606 そんな君にプレゼント
//これじゃテンプレートが動かないな、困った。
//#define class struct
#define private public
#define protected public
608 :
デフォルトの名無しさん:2006/09/06(水) 16:07:10
A というクラスがあります。
A にはデフォルトコンストラクタの他に
コピーコンストラクタと代入演算子が定義されています。
このとき次の二つのコードは同じ意味を持ちますか?
a2 はコンストラクト済みの A のインスタンスです。
イ)A a1(a2);
ロ)A a1 = a2;
609 :
デフォルトの名無しさん:2006/09/06(水) 16:13:33 BE:72306656-2BP(7)
済みません、あと、ハ)も追加させてください。
イ)A a1(a2);
ロ)A a1 = a2;
ハ)A a1 = A(a2);
610 :
デフォルトの名無しさん:2006/09/06(水) 17:06:18
int をとるコンストラクタ、コピーコンストラクタ、
デフォルトコンストラクタ、代入演算子を用意して実験。
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 がデフォルトコンストラクタで生成され、
続いて代入演算子が呼ばれる、なんてことはない?
>>610 規格を確認してないけど
それには以外な結果はないな
>a4 がデフォルトコンストラクタで生成され、
>続いて代入演算子が呼ばれる、なんてことはない?
初期化と解されるのでない
612 :
デフォルトの名無しさん:2006/09/06(水) 17:57:47
constについてイマイチわかってないんで調べてます
次のコードの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つはエラーにならない
なお、この書式だとどちらのテストもエラー(=求めている動作)になります
const int * const cipc=ar;
int const * const icpc=ar;
614 :
デフォルトの名無しさん:2006/09/06(水) 18:00:53
const const ってなんですか?
const int *p
はポイント先のデータがconst
int * const p
はポインタ自体がconst
const int == int const
>>614 なぜか一応コンパイルは通ります
int const hoge;
const int bar;
これら二つが同じものらしいので、
constは隣にくっついてる型をconstにしているのかなと思ったわけです
ある程度法則がつかめないと例としては極端だが
const int * const * const **const hoge;
↑こんなのがどういうものなのかがわからないと思うので。
まぁ実際こんなのは使わないでしょうが
ちゃんと動作を理解したいだけです
>615
組み合わせ的にはもう一つあります
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パターンはすべて同じ型をあらわすのかなと思い
テストした結果、異なる結果となったので
こうして質問してみました
ヘッダファイルをのけてコンパイルしてみると
この二つは同じ型修飾子が2回以上使われています
と警告が出ました
const int const * cicp=ar;
int const const * iccp=ar;
const→int←const * cicp=ar;
int←const←const * iccp=ar;
こういう修飾のされ方みたいです
<stdio.h>をインクルードしているとなぜか警告がでなかったので・・
スレ汚しすみません
Microsoft Visual Studio .NETで開発したソースを用いて、
現環境(Microsoft Visual Studio 6.0)で修正開発したいのですが、
コンバートする方法ありますか?
※ワークスペースファイルは、.NETのprojファイルしかありません。
型からではなく、変数からCV修飾子がどう見えるかを考えるべきだ。
linux上のc言語でしつもんがあります。
同一の関数func()を持つ aaa.c、bbb.c をコンパイルしてアーカイブしたとして、
あるプログラムでfunc()を呼び出したとき、どちらがのfunc()が呼び出されるのでしょうか?
ちなみに、引数も同じです。
よろしくお願いします。
>>619 * の右側に const があるか左側にあるかで判別すればよい
625 :
デフォルトの名無しさん:2006/09/06(水) 18:50:06
>>622 アーカイブってなに?ar?
リンカに怒られる。
名前空間使うべし。
>625
Cに名前空間はない
>>621 ttp://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
>>624 ありがとうございます。
度々すみませんが、これって登録しないとダウンロードできませんか?
>>621,623
もしかして
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;
こういうことでしょうか
630 :
622:2006/09/06(水) 19:29:06
>>625 アーカイブ=ar の事です。
リンカに怒られない、というか実行形式のファイルができてしまいましたんで、
一体どうなっているのかなぁ、と。
動かしてみたところ、名前順って訳でもなさそうなので、保証されない、
ってところでしょうか?
>>629 typedef int *pint;
const pint pi1;
pint const pi2;
const int* pi3; // ?
int* const pi4;
見た目だけでルールを判断すると落とし穴にはまることが多い。
>629
>>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 も定数
VC++.NETのコンソールアプリケーションで
AsynceSocketクラスを使って
DOSでチャットソフトは作ることが可能ですか?
VC++.netは16bitDOSコードを吐けないので無理。
ん? そういう問題じゃない?
>634
コンソールアプリケーションでチャットを作れるか、でお願いします
636 :
デフォルトの名無しさん:2006/09/06(水) 22:10:38
牛丼、並一丁でおながいね!
>>630 リンカは、未解決のシンボルが見つかった時点でその探索を中断するから、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内のファイルの物理順序によるような気もするし、手元の環境では確かにそうなる。
・・・答えになってないね。
638 :
デフォルトの名無しさん:2006/09/06(水) 22:24:24
なんだ?また無礼者でも湧いてきたのか??
>>631>>632 解説ありがとうございます
変数のあるほうから
*の左右で判断し見るというのでいけそうです
実際に次のようなコードを試して実験してみました
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
これで判定できそうです
640 :
597:2006/09/06(水) 22:57:33
C++ですが
領域を確保していない(newしていない)ポインタをdeleteするとどうなりますか?
またNULLの入ったポインタをdeleteするとどうなりますか(同じこと?)
>>641 ヌルポインタに対する delete は何もしない。
new の戻り値でもヌルでもないポインタに対する delete はすべて未定義動作。
643 :
デフォルトの名無しさん:2006/09/07(木) 00:45:58
適当なアドレスを指すポインタを delete すると
何が起こるかは未定義。デバッグ用タイムをリンクしてれば
たいていは止まってくれる。
NULL ポインタを delete すると、何も起こらない。
何も起こらないことが保証されている。
>>642 >>643 お二人ともありがとうございます。NULLだと何もしないと
普通に宣言しただけのポインタだと危険ですね
646 :
デフォルトの名無しさん:2006/09/07(木) 01:00:00
まあいいじゃん
わきみちだし
648 :
デフォルトの名無しさん:2006/09/07(木) 01:07:43
VCでプログラムを作っているのですが、
unsigned char型の配列同士を比較しようとするとコンパイルは通るんですが実行した後エラーが起きて強制終了されてしまいます。
上記の型同士の比較はできないんでしょうか?
二つの配列のどちらも0〜255の値が入っています。
ランタイムライブラリのまちがい
>>648 初心者歓迎スレッドと言うことで勝手な憶測だけど、
配列として確保されている領域をオーバーランしているのでは?
たぶん、こういう間違いしてるんだろうなぁ
unsigned char A[10],B[10];
if(A == B){...}
653 :
デフォルトの名無しさん:2006/09/07(木) 08:58:09
strcmpに一票
654 :
648:2006/09/07(木) 10:34:32
問題の部分だけですが・・・
unsigned 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;
}
}
}}
> if (Fsobel[i][j]==Temp[x][y]){
x, yの初期値が不定。この条件が成立して、次にきた時には範囲外アクセス。
>>652 それって配列の先頭ポインタの比較だから、必ず偽を返すだけで
実行後エラーにはならないんじゃないか?
ベクターならベクターなら何とかしてくれるっ
すいません。お聞きしたいことがあるのですが配列の範囲以外の値ってどうなっているのでしょうか。
例えば x[5][5]の値が全部5という配列があったとしてx[-1][5]やx[5][-1]などの値はどうなっているかいまいち判りません。
どなたかご教示お願いいたします。
printfとかcoutで表示してみれば分かるよ。
>>659 その手がありました、ありがとうございます!
>>660 それを試したところで、その結果はたまたまそうなっただけのもの。
仮に0が表示されたとしても、「配列の範囲外は0になってるんだ!」なんて
思わないようにね。
>x[-1][5]
大抵は、x[0][0]の値が真っ当に表示される。
>x[5][-1]
恐らくは、x[4][4]の値が真っ当に表示される。
#つーか釣り?
>>658 x[-1] や x[5] を評価した時点で未定義動作。
値は意味を成さない。
>>630 リンクできてるなら、先にリンクしたほうが呼ばれてると思う。
&x[-1]がOSにとって致命的な情報を格納していることってあるの?
x[-1]=~0x00とかやってOSがイッちまったなんて聞いた事ないけど
667 :
デフォルトの名無しさん:2006/09/08(金) 21:43:05
for ループが2重になっているところを、最内側から脱出するのに、
goto 使わないためには、フラグ立てるしかないですか?
こういうときは goto 使うのが普通ですか?
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
if (gonyo gonyo) goto LOOP_END;
}
}
LOOP_END:
>>667 for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
if (gonyo gonyo) {
i = 100;
break;
}
}
でいいんじゃないすかね。
他は関数にするぐらいかな。めんどくさいけど。
static 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;
}
>>666 未定義動作だから、何が起ころうと知ったこっちゃない。
メモリ保護違反の例外を起こしてプロセスが終了してもいいし、
たんに無かったことにされてもいいし、
鼻から悪魔が出てきたっていい。
やってる作業量にもよるけどこんなのダメかな
sub(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);
}
>>667 多重ループの脱出はgoto使っても良いと思う。Javaとかでも同じような方法使ってるし(ラベルつきbreak)
んで、他の手段としては多重ループ全体を一つの関数に括りだしてreturnを多重ループの脱出に使うってのもある。
これ以外のフラグ立てる方法やそれの亜種形(
>>668,669,672とか)は大抵の場合汚くなるからあんまりお勧めできない。
自分は素直にgotoのほうが好き。
674 :
デフォルトの名無しさん:2006/09/08(金) 23:03:33
独習C++を勉強しているのですが、そこにのっているコードでわからないものがありまして・・。
参照返し+演算子オーバーロードなんですが、なんでこうなるのか
コンパイルの内部的なこと教えてもらえないでしょうか。
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にその値が代入するようにしているのですよね。
『*this』はポインタじゃない。
676 :
デフォルトの名無しさん:2006/09/08(金) 23:13:06
>>675 ポインタじゃないっていうのはどういうことでしょうか・・・?
thisポインタはこの関数が呼び出されたオブジェクト
つまり、Demoのオブジェクトを指しているポインタじゃないんですか?
どこを調べれば解るようになれますか?
『this』はポインタだな。
でも返しているのは『this』ではなく『*this』だ。
678 :
デフォルトの名無しさん:2006/09/08(金) 23:24:09
>>677 *thisにすると何か変わるんでしょうか・・・。
C的にはポインタの指しているアドレスの中身(値)ですよね?
ってことは戻り値はDemoでもいけるんでしょうか・・。
いま試した所確かにコンパイル通りました。
でも、なんで参照返しにしているんですか?
679 :
デフォルトの名無しさん:2006/09/08(金) 23:29:50
戻り値の型をただDemoにしても同じ結果が出るみたいです・・・。
なんで、Demo&なんでしょうか・・・。
>678
自分自身への参照を返してる。
Demo型を返す理由は、
Demo a(1.0), b, c;
b = c = a; // b、cともに1.0になる
などとできるようにするため。また、参照にすることで無駄な一時オブジェクトが生成されない。
681 :
デフォルトの名無しさん:2006/09/08(金) 23:46:33
>>680 ありがとうございます。でも、参照というのがよくわからなくて^^;
その変数の別名。。。?
なんでそれが無駄な一時オブジェクトを生成しないんでしょうか^^;
そもそも参照を理解してないのか?
int a;
int& func()
{
return a;
}
これは分かるか?
int* b;
int& func()
{
return *b;
}
これは?
683 :
680:2006/09/09(土) 00:00:32
すまんちょっと間違えた。
Demo a, b;
a = b = 1.0; // a, bともに1.0になる
などというようにできる。
Demo& でなく Demoを返すようにすると,、無名のDemoインスタンスが生成されそれが返される。
Demo&だと、元々存在する自分自身を返す為、一時オブジェクトの生成の手間が要らない。
684 :
デフォルトの名無しさん:2006/09/09(土) 00:11:34
>>682 int a;
int& func()
{
return a;
}
変数aのアドレスみたいなもの(参照?)を返すってことでしょうか・・。
内部的には、int& some = a;みたいな処理がされてるということでしょうか。。。
int* b;
int& func()
{
return *b;
}
ちょっと解らないです^^;
>>683 >Demo& でなく Demoを返すようにすると,、無名のDemoインスタンスが生成されそれが返される。
>Demo&だと、元々存在する自分自身を返す為、一時オブジェクトの生成の手間が要らない。
解りやすくて嬉しいです。でも上の方の言っている部分が理解できてないようなので、
半分くらいしか理解できません^^;
686 :
デフォルトの名無しさん:2006/09/09(土) 00:31:41
>>685 >>682のコードを半分理解できるようになりました^^
int a;
int& func()
{
return a;
}
int& fuc() = a;
みたいに参照の変数名が関数になっているということでしょうか?
つまり、その関数を変数aと同じように扱えるという?
だからその関数に代入すると、aの値が変わるのですね・・・?
int* b;
int& func()
{
return *b;
}
ポインタの方がちょっと言葉で説明できません^^;
独習C++に参照載ってるだろ・・・
>>686 コードに疑問があるなら書き込む前にコンパイルぐらい試せボケ。
説明できませんとか意味の無い報告は要らん。チラシの裏にでも書いとけ。
>>682 なかなか的確ですね。
教えるのが上手だと思います。
>>686 > int a;
> int& fuc() = a;
何度見ても、これ、笑える。
きっとアドレス「演算子と同じ」だろうと考えてるんだろうな・・
変な話、それはストラストラップの人が悪いと言えなくもない・・・か?
C++は初学者がけっつまずく要素満載だ。
それはC++で始まった事ではなくてCからのはず。
それも、Cだと配列とポインタが曖昧に見えてしまうのが元凶だったねぇ。
同じ型のポインタ同士の引き算で要素数の差が返るとか、
理屈は通ってるんだが直感的ではないかもだなあ。
>>693 それは間違わなかった。
要素数の差と書いてあるけど、
きっと、話したいのは、
同じ型っていうのは配列型の事なのか?
ポインタと書いている時点で、もうそれは配列とは限らんぞ。
あー、またポインタと配列からやり直しになるのか?
>>658 大抵のコンパイラなら、その配列から外れた別メモリを指してるのが普通の動作だろう。
>>696 大抵のコンパイラなら
>>662。
x[-1][0]とかx[0][-1]とかx[5][0]なら外れるだろうけどねぇ。
ちゃんと見てなかった。
699 :
デフォルトの名無しさん:2006/09/09(土) 06:45:59
>>692 配列とポインタが似ている、というか、
同じようにいじれるというのは、ややこしいところ、
というよりはむしろ C の利点だよな。
C++ の参照って、Java や C# におけるいわゆる参照型
とは違うものだから、すでに他言語を知っている人には
余計に説明しづいらい。参照がやれることは本質的には
ポインタと変わらないので、シンタックスシュガーだと
言えないこともないけど、それを越えてあまりある
表記の便利さがあるよな。
あ、でも参照は「参照しない」ということが許されないから
ポインタとはその辺の能力が違うか。
void foo(int& n) { }
foo(*(int*)NULL);
701 :
デフォルトの名無しさん:2006/09/09(土) 07:07:34
>>700 まぁたしかにそういうことはできるな。
参照が本当に何らかの有効なオブジェクトを指しているか
否かの判定は &n が NULL か否かを見ることになるから、
やっぱり本質的な能力としてはポインタと同じか。
普通 NULL なんか渡さないし、やっちゃだめだけどな。
703 :
デフォルトの名無しさん:2006/09/09(土) 07:34:41
C++ の参照は他の言語の参照型とは違って、
参照し直せないところがキモだな。
>>701 ヌルをデリファレンスした時点で未定義動作。
& によるチェックは意味を成さない。
705 :
デフォルトの名無しさん:2006/09/09(土) 08:39:38
>>704 a 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.
ということだな
706 :
デフォルトの名無しさん:2006/09/09(土) 08:40:30
質問です。
自作のDLLとそれを使用する実行ファイルを作成しています。
DLLを使用するには、実行ファイルと同じフォルダにDLLをおかなければエラーになりますが、
DLLを別のフォルダに置いて使用する方法はありますか?
具体的には、C:\Test\Exec.exeからC:\Test\bin\DLL.dllを使用するようにしたいのです。
開発環境はVisualStudio.net2003。言語はCです。
現在、ライブラリは#pragma comment (lib, "DLL.lib")で使用しています。
PATH
LoadLibrary
質問です、可変引数の関数ポインタというのは定義可能でしょうか?
typedef int (*HogeFunc)(unsigned int, ... );
みたいな感じで………。
試してみた?
通常scanfでは変数の前に&をつけるが、配列の場合はつけない
とあったのですが、&をつけないのは文字列の場合で、数列の場合は必要でいいのでしょうか?
その様子だとなぜ&を付けなければいけないか分かってないね。
>>712 変数の前に&付けると何を意味するか分かってる?
配列名が何を指しているか分かってる?
>>667 遅レスだけど、多重ループ抜けるには多重ループ全体を関数化する。
void LoopFunc()
{
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++)
{
if (gonyo gonyo) return;
}
}
}
そうすればどこでも好きなところから全体を抜けられる。
717 :
712:2006/09/10(日) 15:19:24
済みません、よく分からないです
>>717 どの程度分からないのか言えよな。
一から百まで全く分からないのか、どこか一部が分からないのか。
719 :
712:2006/09/10(日) 15:47:12
ポインタが何の事なのかすら教わっていません
>>717 いや、まあ、その、なんだ。
それなりの再利用性があるなら、そういう選択は有りなんだろうが、
goto憎しでそこまでやる奴は、そもそもCから宗旨替えした方が
自分にとっても周りにとっても幸せな気が。
721 :
712:2006/09/10(日) 15:55:44
済みません、よく分からないです
>>720は
>>716を指してるから問題ない
寧ろそれが分からないお前には問題がある
習ってないならこれ以上突っ込まずに後回しにしとけ
ポインタを勉強するまで「おまじない」と思っとけばおk
なんでポインタも教えないうちにscanfを教えるんだろ?
ポインタの前にアドレスの概念を教えないと
>>724 printf()だってポインタを使うじゃない。
>>724 ポインタを全く使うなと言われるとC言語使えないじゃん。
順序的にはどんな本でも入出力が先じゃね
変数varにおいて&varは変数varのアドレスを指す
配列arr[]においてarrは配列の先頭アドレスを指す → &(arr[0])と同じ
利便性からそうなっているのか、これはCの決まり事
(配列の各要素は連続したメモリ上にあるので、
配列の先頭アドレスは頻繁に使われる(先頭アドレスから全要素を特定できる)
頻繁に使うんで&arr[0]などという記述は非常にめんどうい)
scanfはこのアドレス(メモリ)に値を取得しろ、って命令
アドレスとは何か、ってのは後で教えてくれるから大丈夫
>>728の言う事は正しいんだけどね、
Cの関数では引数は値渡しになるとか、いろいろ説明しないと
「アドレスを渡す場合とそうでない場合とどう区別するか」とか
なかなか「&」を付ける理由の説明にならんのいねぇ。
まあ、それは後で勉強する話
>通常scanfでは変数の前に&をつけるが、配列の場合はつけない
今は↑に対する答えを何となく理解してもらえばいいんじゃないか
まぁ、最初は仕方ないかなぁという気もする。
でも
「変数の前に&つけるとその変数のアドレスになるんだよー」
「配列の名前だけだと、その先頭の要素のアドレスになるんだよー」
ってのは判ってて欲しいよね。
732 :
デフォルトの名無しさん:2006/09/10(日) 19:41:56
VC++6.0です。自分で作ったヘッダーファイルをインクルードするのは
どうすればいいのでしょうか?
#include "ts21tf.h"
とやったのですが「インクルード ファイルがオープンできません。'ts21tf.h':
No such file or directory」と言われます。
多分、"ts21tf.h"のパスを教えてやらなければいけないと思うのですが、
どうやったらいいのでしょうか?
そもそもstdio.hなんかはどこに入っていて、どうして#include "stdio.h"
って書くだけでインクルードできるのか、参考書を何冊読んでも書いてあ
りません。。。って言う初心者なんですが、よろしくお願いします。
そりゃ、どんなC/C++の参考書にも、ヘッダファイルの位置なんか書いてないさ。
規格では、コンパイラが内部に持っていることすら許されるんだから。
で、VC++の場合は環境変数INCLUDEを参照している。
#include "xxx" で読み込むのは、カレントディレクトリと処理系既定のディレクトリ。
そういえば、MSは
OS部門では、頑張って「フォルダ」という名前をデフォにしようとしているけど
コンパイラのメッセージはdirectoryのままなのね。
>>720 アンカーミスったうえにその発言か。
挙げた程度の解決策もでてきてなかったから選択肢として出したんだが。
キミはちょっと被害妄想が過ぎるようだ。
>>732 プロジェクト
設定
C/C++
カテゴリ:プリプロセッサ
インクルードファイルのパス
ここに書く
複数あるときは;で区切って書く
>>734 別に頑張ってるわけでもないんじゃね。
フォルダって別にMSが言い始めた言葉でもないし。
>>728 arrと&(arr[0])は値は一緒だが意味が違う
>>737 そりゃ、appleとかのが先だが
DOSやWin3.1の頃は、フォルダなんて呼び方は誰一人してなかった。
そういう意味が分かる人はこんなところでやわな質問はしないよね。
定数だし。
UNIXでは?
フォルダとディレクトリの違いが判らない人がいるらしい。
一緒一緒一緒一緒一緒
744 :
732:2006/09/10(日) 21:13:16
フォルダの方がより論理的な意味づけがあるものと漠然と思ってたが。
>>744 漏れは10年以上前からVC使ってるが
ダイアログでの場所は今日初めて発見した
さよか
フォルダは概念、ディレクトリは実装。
749 :
デフォルトの名無しさん:2006/09/10(日) 22:30:02
WTLでCButton作成したんですけど、ボタンの周りが白くなってしまいます。
背景色で塗ることは出来ませんか?
CButton m_button;
m_button.Create(m_hWnd,CRect(50,50,100,80),NULL,WS_CHILD|WS_VISIBLE ,0);
とりあえず背景色を白にする
一例
int array[5];
printf("%d\n", sizeof(array));
printf("%d\n", sizeof(&array[0]));
なんだ、そんな屁理屈か
そんな使い方しねーし
初心者に簡潔に教える事に必要とも思えないが
一例として挙げるならせめて実用的な例を
>>749 Windowsシェル(エクスプローラなど)では、
マイコンピュータなどディスク上のディレクトリでないものもフォルダと呼ぶことを、
748は言いたいのだと思う。
フォルダ⊇ディレクトリ
>>752 「配列→先頭要素へのポインタ」への変換が行われる前は、まだarrは配列型。
>>758 >「配列→先頭要素へのポインタ」への変換が行われる前は、まだarrは配列型。
これは具体的にどういった意味を持つのですか?
int array[5];
array は int (*)[5]
&array[0] は int *
サイズが違うってだけ?
蛇足ってやつだ
>>760のように詳しく知らなくても済ましてたなんて、お前ら苦労を知らないなぁ?
$ cat a.c
int 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 `&'
そんな当たり前のハナシ
要するにarray[0]がchar型だと、そんなもん初心者でも分かりきってるだろ
ああ、int型か
だな
実用性の無い屁理屈を言う奴は、初心者にとっては単なる教え下手
おやおや・・・
まあまあ
やれやれ
: : : : : : Λ ヽ : : : / : : : : : : : : : : : : : : :\ : : : ',
: : : : : /:,ハ } : : / : : : : : : : : : : : : : : : : : : : \: : 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: |
while(1){
switch(xxx){
a: hoge; break;
b: foo; break;
}
}
というコードで、bの場合にのみ、whileのループも抜けたい場合は
どう記述したらいいのでしょうか。
返信ありがとうございます。
gotoしかないでしょうか、、gotoは使いたくないのですが。
779 :
デフォルトの名無しさん:2006/09/11(月) 04:42:35
>>776 flag = true;
while (flag) {
flag = false;
}
>>778 関数にしておき、returnとか。まあそういうダーティな方法しかない。
781 :
デフォルトの名無しさん:2006/09/11(月) 04:50:33
goto嫌う奴は将来の見込みが無い
gotoは悪だ!と教わったので躊躇してしまいます。
会社とかでgoto使って書いてもいいのでしょうか?
flagはいい方法ですね。
みなさま、ありがとうございます。
それよりも、
>while(1){
これはどうなんだ?
ループを抜ける基本的な条件ないのか?
ラベルbの処理を行った場合、抜けたいと考えています。
>>782 フラグなんて使うなよ。
良い方法でもなんでもない。
素直にgoto使いなさい。
goto がベスト。
関数にして return は、関数にする意味があればやってもいいが、
そうでなければいい解決法とは思わない。
goto は、使用箇所は限定されるが、ごく普通に使う。
goto を意味なく嫌う人は、思考停止してるだけ。
goto をなるべく使いたくないのは確かだが、
goto を使うのがベストな状況なら、使うべき。
まあ、本来は goto が必要ないような言語仕様にすべきだとは思うんだけどね。
C/C++ がそういう言語仕様になってないんだから仕方が無い。
>>784 もし本当にあのプログラムならswitchじゃなくif文にしなさい。
まあ、switch 使うならもっと分岐あるんじゃね? 流石に。
もしgotoを使うなと言ったのが先輩や上司なら、素直に従っておけよ。
無視して使ってると最悪イジメにあう。
部署が代わるまでガマンだ。
790 :
デフォルトの名無しさん:2006/09/11(月) 05:31:31
自作自演もたいがいにしとけよ
勉強になりました。
ありがとうございました。
if (xxx==b) break;
793 :
デフォルトの名無しさん:2006/09/11(月) 08:55:37
gotoは使用が乱発的でなく、
使用により芸術的かつ簡潔にコーディングが成せる場合に限り
堂々と躊躇無く自信を持って使用する。
gotoはドラマにおけるハイライトである。
ドラマのハイライトを日常で安易に演じれば
単なるスタンドプレイに陥り恥ずかしく痛い奴に成り下がる危険がある。
よって、知性と精神を総動員して、注意深く且つ揺るぎ無き強い意思を持ってそこに刻み込む。
そう!まさしく空気を読まず声高らかにぬるぽと叫ぶがごとく!
自演のオンパレードだな
そして、更に空気を読まず声高らかに
>>794 ガッ と叫ぶがごとく!
痛々しいからそのくらいで
最近色んなスレでgoto信者を見かけるのだが同一人物か?
Unix系の話です。GNUlpr1.0.1のソースが解せないので質問します。
ディレクトリ内のファイル一覧を作成する処理(getqって関数)で、
ファイルの情報を記録する配列のメモリをmallocで確保して
reallocで拡張するような仕組みがあります。
解せない点は2つです。
1.ファイルのリストを記録する配列を確保する際の初期要素数として、
ディレクトリに対してfstatを掛けて取得したファイルサイズ/24を採っているのですが、
これはどういう根拠でこうしているのか。
Linuxだと常に0になると思うけど、そうではない環境があるのでしょうか。
2.上記配列が足りなくなった時にreallocで拡張しているけど、
毎回、その時に走査していたファイルのサイズ/12を拡張後の要素数としている。
わけわかりません。これでいい環境があるのでしょうか。
ちなみに、うちの環境(Linux2.4系)だと2.が原因で当然のようにSEGVを起こします。
>>793 分かってるならこのスレでも騒がないように
801 :
デフォルトの名無しさん:2006/09/11(月) 11:29:29
>>799 少なくともソースへのリンクを示してもらわんとな・・・
802 :
799:2006/09/11(月) 11:35:47
803 :
デフォルトの名無しさん:2006/09/11(月) 12:18:45
>>799 dir 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
sage忘れスマソ・・・
>>799 同じくdir entryに詳しくないので、想像を交えて。
>1.ファイルのリストを記録する配列を確保する際の初期要素数として、
>ディレクトリに対してfstatを掛けて取得したファイルサイズ/24を採っているのですが、
>これはどういう根拠でこうしているのか。
ディレクトリ内のファイルひとつのdir entryが最小で24バイトだからでは。
> 2.上記配列が足りなくなった時にreallocで拡張しているけど、
> 毎回、その時に走査していたファイルのサイズ/12を拡張後の要素数としている。
> わけわかりません。これでいい環境があるのでしょうか。
「ファイルサイズ/12」と考えると良く分からないけど、「dir entryが最小サイズだった
場合の個数*2」を確保してると考えるとわかりやすいと思う。一度拡張されるときに
余裕をもってメモリを用意しておく戦略。STLでも使われてる。
806 :
799:2006/09/11(月) 13:14:55
>>803,805
レスありがとうございます。おおむね解決しました。
1.については、確かに803でおっしゃるようにディレクトリエントリの
サイズが得られるのが普通のようです。
今回の私の環境では、対象ディレクトリがtmpfs上にあったことが原因でした。
tmpfs上のディレクトリにfstatを掛けると、サイズは必ず0が返るようです。
MontavistaLinux3.0で確認しました。
2.については、バグだったようです。どっかのブランチで修正されてるようでした。
805でおっしゃるようにサイズを2倍に拡張する意図だったのは間違いないようですが、
ディレクトリを開く時のfstatでのstat構造体を
ファイルをリストアップする時のstatで使いまわしていたので、
間違ったサイズで計算してしまっているようです。
おかげさまですっきりしました。ほんとにありがとうございます。
WN2000SP4、VCEEを使ってプログラムしています。
ファイル操作関数群をまとめたいと思い、プログラムを書き始めましたが
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" );
ポインター理解できてる?
Main.cpp
FILE* fp;
OpenFile(&fp, 以下略
FILE*fp = NULL;
OpenFile(&fp, "r", "text.txt" );
>808
>809
どうもありがとうございましたm(__)m
ポインタのポインタの意味が少し分かったようなギガする。。
FILE**fp = NULL;
*fp = (FILE *)malloc(sizeof(FILE *));
OpenFile( fp, "r", "text.txt" );
〜〜〜〜
free(*fp);
812 :
デフォルトの名無しさん:2006/09/11(月) 17:11:27
質問です。
C++で構造体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);
}
}
ご指摘お願いします。
>>812 ・どう巧くいかないのか。
*エラーが出たならエラーメッセージ
*期待する動作と異なるなら、それらの動作
・環境は何か。
#この場合は必要ないだろうが念の為。
3重ループで、一番内側から2つのループを抜け出すための以下のような
書き方は普通に問題ないのでしょうか?
EXITのあとに;をつけないとエラーになるのがちょっと気になるのですが…
for(i=0;i<a;i++){
for(j=0;j<b;j++){
for(k=0;k<c;k++){
if( hoge ){
goto EXIT;
}
}
}
EXIT:
;
}
あ、
ラベルEXIT:の後に;を付けないとエラーになるのが気になる
です。
構文規則上 <ラベル> : <式> だから
なるほど。ちなみに書き方自体はこれが一般的でしょうか?
それとも以下のように毎回フラグ変数を用意するような感じが
一般的なのでしょうか?
if( hoge ){
flag = TRUE;
break;
}
}
if( flag ){
break;
}
}
}
>>812 VECTOR2 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; }
819 :
812:2006/09/11(月) 18:11:49
情報少なくてすみません。
返り値戻して無かっただけでした。自己解決しました。すんません
プ
>>818 その程度、メンバ関数で充分だ。
>>817 どっちの方が読みやすいと思う?
特にコーディングルールなどに縛られないなら読みやすい(≒シンプル)と思う方にしておけ。
822 :
818:2006/09/11(月) 18:20:02
>>821 無知でスマン
2項演算子ってメンバ関数化できるの知らなかった。
いや、俺は2項演算子をメンバにすべきではないと思う。
operator -=をメンバで定義して、非メンバでoperator -をという具合に。
>>823 実際 812 のコードだと 副作用おこしてるしね。
実質 a-=b と同じことになってる
825 :
デフォルトの名無しさん:2006/09/11(月) 19:08:09
無知でごめんさない。
hoge.h 内で
float hoge(int hoge)
{
return hoge++;
}
のようにグローバル関数をつくって、
hoge.hをインクルードしたクラスで使えるようにしたいのだが、
他のオブジェクトで既に定義されていると言われた。
ちなみにどのクラスでも、
#program once
#include "hoge.h"
としているので2重でインクルード読込むことはないはずなのだが・・。
>>825
>#program once
これはなんだ?
>>825 「二重インクルードはしちゃダメ」って聞いて、意味も分からず使ってない?
今回の問題はそこじゃないよ。
一つの翻訳単位(つまり一つのソースファイル)でhoge.hを複数回インクルードするのを
防止したいというのが、二重インクルード防止。
aaa.c と bbb.c でそれぞれ hoge.h を一回ずつインクルードするのは防げないから、
aaa.o と bbb.o の両方に同名の関数が定義されたことになって、リンクしたらエラーになる。
関数の実体はどれか一つのソースだけにあればいいから、
hoge.c (新しいソースでもいいし、既存のどれかのソースでもいい)に関数定義を移動。
hoge.h には関数のプロトタイプ宣言だけ書く。
にすればいい。
関数定義にstaticつけるとかinline関数にするというのもあるけど、
まずは基本的なことから理解したほうがいいと思う。
あと、そもそも #pragma once (の間違いだよね)の使い方を間違ってる。
これはhoge.h の頭に書くもの。
>>825 あるファイルで
int Fund() { return 0; }
とあり、別のファイルで
int Fund() { return 1; }
とあったらリンカはどっちリンクしていいか困るよね。
仮に戻り値が同じであってもやはりどっちリンクしていいか困るわけだ。
関数の実体はリンクするファイルの中に複数あってはならない。
>>828 > とあったらリンカはどっちリンクしていいか困るよね。
困らないよ。
830 :
825:2006/09/11(月) 20:15:45
827さん828さん ありがとうございます。
無事解決しました。
未だにプロトタイプ宣言と関数定義の違いがわかりませんが、
ようは宣言は何回でもいいけど、実装は一つにしろってことですね。
しかし、構造体宣言のなかで関数を書いた場合は・・実装になるの?
とりあえず入門書はちゃんと読めってことだ。
#includeの意味も宣言と定義の意味も全部書いてある。
ただ、中には char a = 'あ'; みたいな本もあるらしいから
そういうのは捨てろ。
833 :
750: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);
なぜなぜ!?!?
親Windowの background color で描かれてるんじゃないの?
# Layerd window かもしれんけど
835 :
750:2006/09/11(月) 21:35:41
FrameWindow -- White
└ViewWindow -- Gray
└Button -- ココ
FrameWindowの背景色をGrayに設定してもダメでした。
と、色々試行錯誤してたら出来ました。
GetWndClassInfo()で背景色設定してたんですけど、これをDECLARE_WND_CLASS_EXで設定するようにしたらOKになりました。
ありがとうございました。
836 :
デフォルトの名無しさん:2006/09/11(月) 22:22:53
int (*(*p)())[5]
これってどういう風に解釈すればいいのでしょうか?
int (void*(*p)(void))[5]
か?
後ろのvoidはいいけど前のは余分じゃない?
複雑だな。
int *(*p)(void)[5]
こうじゃないか?
>>840 それじゃあ*より[]の方が優先度が高いので、意味が変わっちまう。
int*をかえす関数void p(void)が5個。
int*を返す
関数int * func(void)
が5個。
のまちがえ。
>>843 それだったら
int *(*p[5])(void); じゃね?
>>840は
p is a pointer to function (void) returning array[5] of pointer to int
つまりint型へのポインタを5個持つ配列を返す引数voidの関数へのポインタでわ?
違うと思う。
>>845 嘘付けぇこれが通るのをどう説明するつもりだぁ
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;
}
typedef使えよと思ってしまう逃げ腰な俺。
>838, 840, 842, 843, 845
837のリンク先を読み返してから出直せ。
パズル気分で関数ポインタの配列やら関数ポインタを返す関数やらを読むのは別にいいが
実際に使用するときはtypedefして欲しい。
少なくとも俺はそうなっているものじゃないと、読む気がしない。
でもたまに必要になるが。
関数は配列を返す事はできない。配列へのポインタなら返す事ができる。
int (*((*p)(void)))[5];
int (*(func1(void)))[5];
int i[5];
int main()
{
p = func1;
return 0;
}
int (*(func1(void)))[5]
{
return 0;
}
>>851 p is a pointer to function (void) returning pointer to array[5] of int
~~~~~~~~~~~
>>848 そうは言うけどお前は、void (*beam(int arg, void (*func)(int)))(int) 読めるのか?
あ。悪い
×return 0;
○return &i;
>>853 んー・・・・
beam is a function (int, pointer to function void(int)) returning pointer to function void(int)
大きく出たわりには、勉強中なのか?
ところで、
>>836は自分で創作しただろ。
コンパイル可能なのか?
どうやら合ってたらしい
#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;
}
>>836 こういう事だろ。
#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;
}
ちょっと修正。これならOK?
#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;
}
質問です。
C++で作ったEXEファイルをWEBページから起動するというプログラムをC++で作ることは可能でしょうか?
ご教示お願いします。
難しいなぁ。
>>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;}
>>862 二次元配列と配列へのポインタを混同したら危ないですよ。
この場合はiは int[5]へのポインタとして解釈されています。
だから*p()[1]でi[1][0]が出力されます。
しかし、私も勘違いしていたように、*p(){1]という書き方では、
二次元配列を返す場合はいいですが、一次元配列へのポインタを
返すと、おかしな事になります。
そこで(*p())[1]と書いたのです。
>>861 ご教示ありがとうございます。
また、以前オセロゲームについて意見していただいた方、本当にありがとうございました。
>>863 これは関数なのか、なんなんだ?
int (*func1())[5]
{
return i;
}
>>865 関数ですよ。もし
int *func1()[5]
と書いてコンパイルしたら、「関数は配列を返せない」等のエラーが出るはずです。
それって、関数定義なんだろ。
なんか、不思議だな〜
見た事無いのは俺だけか?
ちょっとわからん。
要するに、「何を受け取り」「何を返す」かしっかり書けていればいいんですよ。
関数名にカッコを付けても意味が変わらなければエラーは出ません。
難しいのは、Cの演算子の優先順位と適用方向がゴチャゴチャだからです。
>>863 単に配列のポインタ返すだけなら下記でもよさそうですよね。
わざわざ関数の宣言に要素数が入っているのは何故でしょう?
要素数が入ることで下記と何が変わるのでしょうか?
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;
}
>>869 ご存じの通りCでは二次元配列以上の場合、最初の次元以外は
要素数を省略した定義や宣言が出来ません。
ご呈示いただいたソースでは、あくまでもintへのポインタ、もしくは
一次元配列を返す、と読めます。
次元が付いていると、二次元配列を返す事が出来るようになります。
私のソースでは二次元配列ではなく、配列へのポインタを返すように
しました。(どちらでも同じですけど)
だから、*p()[1]は、i[5]をアクセスする事になります。i[1]ではありません。
後置演算子うぜー
やっぱJavaのほうがいい
int[] meth(), int[][] meth() はCと意味違うけど
C#でいいじゃん。Javaは糞。
VC++ (.Net) 選ばなければどっちでもいいよ。
874 :
デフォルトの名無しさん:2006/09/12(火) 08:51:39
僕は断然 C++/CLI ちゃん!
875 :
デフォルトの名無しさん:2006/09/12(火) 09:39:49
Ruby以外全部糞糞糞
もんもん万歳!
876 :
M$:2006/09/12(火) 12:07:19
M$の製品以外全部糞糞、糞!
Vistaはええぞー。
ゲーシ様、マンセー!
M$とか書かれても、Basicはスレ違いだ。
Microsoft Visual C++ 2005 Express Editionの無償版って期限すぎたら登録キー入力しろって出るけど
キー入手するの面倒くさいし
再インストールしたらまた使えるか?
ライセンス登録すりゃいいじゃん
質問です
値引数←これってなんて読むんですか?w
スレ違い?
ぐぐれ
ねびきすうに決まってるだろ!
ちなみに、
「値渡し」は「あたいわたし」
「引数」は「ひきすう」
と読む。
「あたいわたし」というのは
女言葉の「自分自分」とは、ちょっとだけ違うので注意。
\___________/
∨
___ _
/ ____ヽ /  ̄  ̄ \
| | /, −、, -、l /、 ヽ きみ頭だいじょうぶ?
| _| -|○ | ○|| |・ |―-、 |
, ―-、 (6 _ー っ-´、} q -´ 二 ヽ |
| -⊂) \ ヽ_  ̄ ̄ノノ ノ_ ー | |
| ̄ ̄|/ (_ ∪ ̄ / 、 \ \. ̄` | /
ヽ ` ,.|  ̄ | | O===== |
`− ´ | | _| / |
オモスレーwww
ぐぐっても値引数がどんなものかの説明ばかりで
読み方が書いてないのです。
ものすごい本読みにくいので
誰か教えてほしいです。
886 :
880:2006/09/12(火) 20:22:53
>>882 どもー、「あたいひきすう」って読むんですね
感謝
「ねびきすう」だって言ってるだろ!
888 :
880:2006/09/12(火) 20:47:26
>>887 うは、「ねびきすう」でよかったんですか
疑い深くてすみません・・・
こらこら
890 :
880:2006/09/12(火) 21:23:22
今、詳しい友達に聞いてみたら「ねびきすう」
でいいそうです。
みなさんありがとうです
>890
そんな餌でクマー(AA略
ねいんすう
893 :
デフォルトの名無しさん:2006/09/12(火) 22:08:24
typedef struct foo {
int 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]にはどうやって
アクセスすれば良いのでしょうか?
xxx->hoge[i].b[256];
って256にアクセスしちゃだめだろ
>>893 こういうことか?
xxx->hoge[任意].b
>>893 じゃなくてb[256]はないっつーてるの。b[255]までだろ。
897 :
893:2006/09/12(火) 22:53:45
書き方悪くて申し訳ないです。
>>895 の方が書かれている通りのことです。
>>894, 895, 896各氏どうもありがとう。
すいません。構造体の質問です。
CYLS 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;
以下略・・・
と書けば、xsizeに320、ysizeに200、vramに0x000a0000
が代入されるのですが、これは、アセンブラの段階で以下のようになっていて、
番地 入っている値
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などに値を代入していないのに
どのような過程で値が代入されるのかなという質問です。
環境は?
すいません。対応表読みにくいですね。
実は30日で出来るOS自作入門という本で勉強しているんですが、
プログラミング言語初体験で四苦八苦しています・・・
環境はgccに著者が手を入れた奴で
アセンブラもnasmに著者が手を入れた奴です。
OSはwinです。
いまは画面表示の関数を作っているところなんです。
素人にはお勧めできない。
悪い事言わないから止めとけ。
そんな事で悩むようでは、後が辛すぎる。
そうですかねぇ。
自分の買った本には構造体型のサイズは各メンバのサイズの合計かそれ以上と有ったんですよ。
もし、それ以上の場合なら0x0ff4とxsizeがずれて対応される可能性があるかなと思ったんです。
例えばxsize = (*binfo).scrnx;としたのにxsizeに200が代入されていたりとか・・・
>>903 「そうですかねぇ」じゃねえよ、ヴォケが
質問者の発する言葉じゃないだろ
905 :
デフォルトの名無しさん:2006/09/13(水) 14:11:27
>>903 そりゃ、構造体のメンバがどうアラインメントされるかで
構造体のサイズは変わるし、各メンバが連続して配置
されるかどうかも保証されていないからな。
構造体がパックされるように強制できたっけ?
>>904 俺は903ではないが、お前も質問者にとっては回答者でも何でもないがな
俺は904ではないが、「そうですかねぇ」にはカチンと来た。
カルシウム不足なんじゃね?
構造体のサイズが各メンバのサイズの合計を超えてる場合でも、
各メンバは連続してることもある。
xsizeが0x0ff4にならないことはない。
>>893 これってアドレスしか確保してないのにxxx->なんてやっていいの?
>>905 VCなら
#pragma pack(push, 1)
<構造体宣言>
#pragma pack(pop)
でパディングを0にすることが可能
ヒント:省略
gccなんだけど。
それに今回はpack関係ないし。
gccのinfo読めば、仕様が書いてあるだろ。
著者が独自に変更していれば、それについて言及してあるだろうし。
>struct BOOTINFOと言う12バイトの構造体型
なぜ12バイトだとわかったのか。
12バイトであるなら、0x0ff4以外には考えられないだろう。
お取り込み中失礼
SDKでMFCのクラスを使うにはどうすればいいでうか?
初心者の陥り易い注意点とかもあれば教えて草代。
まずMFCのDLLを用意する
誰も「そんな事」について明確な答えを出せない点について、
と煽ってみる。
ま、モレは分からんけどね。
出ていませんね。
# こんなまぬけな開き直りは久しぶりに見た :-)
そんな書き込みしても、これ以上のコメントは付きませんよ :-P
マジレス。
>>899 >早い話、変数xsizeなどに値を代入していないのに
>>898 >xsize = (*binfo).scrnx;
代入してますね。
>>899 >どのような過程で値が代入されるのかなという質問です。
P75〜P99を理解できるまで読め。
この程度のことが理解できないなら、この本を読むのは無理。
924 :
デフォルトの名無しさん:2006/09/13(水) 22:13:59
rand()関数の精度が悪いっていうのは、具体的にはどういうことなのですか?
線形合同法自体が良くないってことでしょうか。
あと、最大値と最小値を指定する方法で
return min + (int)(rand() * (max-min+1.0) / (1.0 + RAND_MAX)
という方法を見つけたのですが、これを使うのも良くないんでしょうか?
Visual C++ .NET2003を使っているのですがこれは関係ないのかな。
今のところ特に何に使いたいということでもないんですが…
>>899 >上記のように変数と値が、対応付けられるのでしょうか?
あなたがイメージしている事はだいたいあってる。
ただ、実際の動作(メンバーに対応するオフセット等)は環境による。
927 :
デフォルトの名無しさん:2006/09/13(水) 23:05:44
いきなりですみませんが、C言語のエディタで字下げをTabではなく、スペースでしてくれるエディタって無いでしょうか?
スレ違い
>>926 > ただ、実際の動作(メンバーに対応するオフセット等)は環境による。
的外れ。
メモリ上のデータに対応するように構造体を定義してるのだ。
>>925 すみません、rndtestの使い方がわかりませんでした(泣)
できれば擬似乱数について解説しているサイトを教えていただきたいのですが・・・
勉強不足で本当にすみません・・・
wikipediaに割と詳しく書いてあるよ
>>930 "pseudo random number"でぐぐったら?
日本ではメルセンヌ・ツイスターが有名だけど。boostにも入ってるし。
934 :
デフォルトの名無しさん:2006/09/14(木) 01:21:04
今までC言語を勉強していたんですが
C++と比べて機能的にはどっちがいいのでしょうか
人気がないという話を聞いたのですが・・・・
優れていたり将来性があるならC++に乗り換えたいと思っています
また無料で出来るのかも教えてくれるとありがたいです
それとC#というのは最近よく聞きますが、これの現状はどうなのでしょうか
935 :
デフォルトの名無しさん:2006/09/14(木) 01:22:16
訂正です
また無料で出来るのかも教えてくれるとありがたいです
これを抜かしてください
まずはC言語を極めてみてはどうだろうか
937 :
デフォルトの名無しさん:2006/09/14(木) 01:25:38
お早い返事ありがとうございます
C言語を極めても結局C++に乗り換えることになるなら
初めからC++をやったほうがいいと思っているのですが
C言語で勉強したことはC++でそのまま通用するのでしょうか
938 :
デフォルトの名無しさん:2006/09/14(木) 01:27:14
君にはうんこが似合ってるよ
>>937 C89の機能の殆どはC++でも使えます。
C99の一部の(便利な)機能はC++では使えませんが、他の手段があります。
従って、C++を勉強することをお勧めしておきます。
GUIを手軽に作ってみたいなど、言語そのものより作ることに興味があるならC#を齧るのも悪くないでしょう。
940 :
デフォルトの名無しさん:2006/09/14(木) 01:30:44
>>939 ありがとうございます
今日試しにやってみることにします
vsnprintfとかってC99だけなんだっけ。
地味に羨ましい。
942 :
937:2006/09/14(木) 01:39:37
C++の無料ソフトはどこのがいいのでしょうか
今のところBorlandを考えているのですが
お勧めとかありますか?
VCEE。
タダ。MFC他は付いてないけどね。
どうせならあと2万出してStandard買うのがオススメ。
944 :
デフォルトの名無しさん:2006/09/14(木) 01:57:41
>>943 ありがとうございます
学生なのでお金に今余裕がなくて・・・・
お金に余裕が出来たらStandardの購入を検討してみます
どうもありがとうございました
つ[gcc w/cygwin]
>>945 修羅の道すぎる。
せめてEclipse+CDTで緩和してさしあげるんだ。
そしてCに愛想を尽かされJavaに逃げられる罠。
Turbo C++ ExplorerをDLして、BCC5.82を使うとかね。
中途半端かもしれないが使いやすい。
948 :
デフォルトの名無しさん:2006/09/14(木) 02:05:15
>>945-947 皆さんご意見ありがとうございます
色々あるみたいなので明日にでもゆっくり考えて
自分にあったものを使いたいと思います
gcc でも windows dll を簡単に作れると
gcc(とC99) もwindowsで使ってもらえるんだけどなぁ
950 :
898:2006/09/14(木) 02:12:04
お返事できなくてすいません。今日のバイト10時間だったんで。
えっと、こんな未熟者のためにプロの方が答えを考えてくれて凄く感謝しています。
構造体のことはだいぶ分かりました。
>メモリ上のデータに対応するように構造体を定義してるのだ。
つまり今回の場合、scrnxが、構造体の先頭から4の倍数の場所になっているので、隙間は入らず、
結果アライメントやパディングの問題は発生しない。
よってstruct BOOTINFOは確実に12バイトの構造体変数になると。
最初からアセンブラでメモリの番地にデータを計算して書き込んでいるからこそ出来た訳ですね。
以上のような理解でよろしいでしょうか?
>そんな事で悩むようでは、後が辛すぎる。
プログラミング経験0から始めたので、C言語の本併読しながらですから結構大変ですけれど、
だんだん絵が出てきたりして今までの詰め込みから面白くなってきた所なんですよ。
もう少し頑張ってみますね。
>>929 >的外れ。
>メモリ上のデータに対応するように構造体を定義してるのだ。
その指定方法が処理系やターゲット等の環境依存なのだが、理解できないか?
>>950 >確実に12バイトの構造体変数になる
その本を読んでないのでなんともいえないけど
1、>4の倍数の場所になっているので、隙間は入らず
作者も同じように考えてタマタマ処理系の動作と一致している
2、処理系の動作を調べて一致することを確認してある
3、アセンブラの方を構造体にあわせて書いてある
などなど、可能性はいろいろある。
動作には不定とか未定義とか実装依存とかあって、実験結果が
いつも正しいわけではない事を、頭の隅っこにでも置いといて吉。
953 :
898:2006/09/14(木) 05:39:17
>処理系の動作を調べて一致することを確認してある
処理系ってコンパイラの事ですよね。
>動作には不定とか未定義とか実装依存とかあって、実験結果が
>いつも正しいわけではない事を、頭の隅っこにでも置いといて吉。
コンピュータープログラムってどんなときも同じ結果だと思っていたんですけど、
そうじゃないんですね。変なの。
>>952 それ逆。
メモリ上に12バイトのある情報があって、それにあうように構造体を定義してるの。
「タマタマ」などではない。
955 :
デフォルトの名無しさん:2006/09/14(木) 06:24:50
>>954 一般にメモリ上での配置に従って構造体を定義するなんてできるのか?
struct {
char a;
char b;
};
がメモリ上の連続した2バイトに配置されるなんて保証はないわけで。
コンパイラオプションや pragma でコンパイラの挙動を制御しなけりゃ
「それにあうように構造体を定義」なんてできないと思うんだが。
>944
学生ならAcademic Editionもあるでよ(\4800)
Standard相当
ま、言語に慣れる段階ならExpressでもいいけど
>>955 今回は、Windowsでgccね。
そんな一般論ならぬ特殊論をいつまでも続けるより、「そうならない処理系」の例でもあげたほうが生産的だな。
自己中心な奴ほどプログラムに興味あるんだよね。
「オレ様プログラムを作るぞー」って意気込んで、
そのうちに真性プログラマーになって人生落ちていくんだろうよ。
>>955 >一般にメモリ上での配置に従って構造体を定義するなんてできるのか?
え、出来ないの?
>>955 それも考え方が逆。
筆者は構造体でアクセスするために、0xff0からchar,char,char,char,short,short,pointerと配置しておいたの。
で、最初はひとつひとつアドレスでアクセスしてて「めんどいよね」ってことで構造体登場となる。
962 :
デフォルトの名無しさん:2006/09/14(木) 07:03:50
>>961 であれば、構造体の方も
__attribute__ ((packed))
指定をすべきではないだろうか。
964 :
デフォルトの名無しさん:2006/09/14(木) 07:23:12
アセンブラの方で構造体でのアクセスを考慮したコーディングするなら
Cのコードの方でもアセンブラでのアクセスを考慮したコーディングしないと。
コンパイラ依存でも環境依存でも構わないんだが、
そのコンパイラですら保証されていない特性に頼るのは危険だと思う。
>>964 その議論はどうでもいいけど、
>>955のケースでメモリ上で連続しないような処理系があるなら教えて。
>>960 コンパイラをバージョン含めて限定して検証しながら作れば可能。
>>966 無いと思うよ。 char 二つの間にパディング入れる意味はまったく無い。
でもそれは規格では保証されていないので、期待するもんじゃない。
なに構造体について議論しているの?
>>898がOS自作入門とか言う本よんでて、
初心者だったから、当たり前だろと思うことに変な疑問を持ったんでしょ。
で、作者が俺様理論で本書いてたから説明下手だっただけでしょ。
>>968 処理系ごとのデフォルトの動作を期待するなと?
>>970 デフォルトのアラインを調べておけ、と。
そして、処理系の実装依存である以上、たとえば
「charを4つ並べて4バイトの構造体を定義しました」ではなく
「charを4つ並べると4バイトになることは確認済みです」ということ。
事実上どっちでも変わらないからこそ、正しい解釈をしとけ、という話だな。
972 :
971:2006/09/14(木) 10:27:14
処理系の仕様書調べなくても、確認方法が「うごいてるからいいや」
でもかまわないから、解釈は正しく、な。
>>971 こいつが何にこだわってるのか、さっぱりわからん。
だれか つぎすれ たのむ
アラインメントにこだわる奴が多いな。
もういいじゃん、質問者も理解したみたいだし。
っーか、俺もこの本持っているけど確かにパティングについては書いてないんだよね。
ただ、12バイトになるとしか書いてない。
俺は流し読みをしながら読んだから、「そうね」としか思わなかったけれど、
質問者はマジで素人みたいだし、ちゃんと理解しようと勉強しながら読んでいるみたいだから、
この問題?に気づいたのはえらいと思う。
>>923 >P75〜P99を理解できるまで読め。
>この程度のことが理解できないなら、この本を読むのは無理。
理解できるまで読んでもワカラねぇんじゃねえの?
>自分の買った本には構造体型のサイズは各メンバのサイズの合計かそれ以上と有ったんですよ。
>もし、それ以上の場合なら0x0ff4とxsizeがずれて対応される可能性があるかなと思ったんです。
>例えばxsize = (*binfo).scrnx;としたのにxsizeに200が代入されていたりとか・・・
そもそもパティングについて解説してないもん。理解できるはずがない。
979 :
デフォルトの名無しさん:2006/09/14(木) 13:06:43
>>978 実は本を書いた人が
パディングって知らなかったとか。
981 :
デフォルトの名無しさん:2006/09/14(木) 13:40:14
ifstreamをつかってバイナリファイルを読み込んでいます。
ファイルの末尾からある一定の間隔を持ちながら後ろにさかのぼる様なプログラムを書きたいです。
例えば次のようなプログラムです。うしろからdeltaバイトずつスキップしながらデータをとっていきます。
while( 1 ) {
fin.seekg(-i*delta , ios::end);
if (終了条件) {
break;
}
fin.read((char*)&data,sizeof(int));
処理
++i;
}
ファイルの「終了条件」を先頭にきたときとしたいのですが、
どうしたらいいでしょうか?
982 :
デフォルトの名無しさん:2006/09/14(木) 13:50:35
質問失礼します。
ListBoxから派生させたクラスで、ユーザ定義のデータを参照(保持)し行ごとの描画を変えたいのですが…
ユーザ定義のデータをどうやって持つのかに悩んでいます。
ListBoxは行が難行になるか分からないので、内部テーブルを持つ訳にも行かない。
ItemDataはユーザが使用するでしょうし。
コールバック関数を定義させて問い合わせるにはスタックが膨大すぎてしまいそうで、
実現的ではないし。(ON PAINTなどで処理するのでね)
何か良い実現方法はありませんか?
>>978 そりゃ本にも載ってなけりゃ、ぐぐってもでてこないだろうさ。
>>978 >>この程度のことが理解できないなら、この本を読むのは無理。
>理解できるまで読んでもワカラねぇんじゃねえの?
なら、この本を読むのは無理だということだね。
引用符が統一されてなくてゲジゲジです><;
>>982 何行か判らない、と内部テーブルが駄目、との関係がよく解らないな。
コールバック関数でも問題無いようにも思えるし。
描画はWM_PAINTでなくて、WM_DRAWITEMで個々のアイテム毎だし。
アライメントって普通CPUのためのものだからなー。
4バイト整列してない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な気もするけど、それならそれで言質が欲しい。
順番的には同じになる。
intが4バイトなのは言語仕様で決定されている事なのでしょうか?
void __stdcall Hoge(int x, int y);
という関数の装飾名は(extern "C"していれば)、_Hoge@8に32ビット環境ではなりますよね。
ですが、intが4バイト固定でないと64ビット環境とかでおかしくなるような気が…。
そんなもん環境依存に決まっとろーが
991 :
デフォルトの名無しさん:2006/09/15(金) 13:51:04
>>986 よくわからないが、
サブクラスからAP関数のコールバックなんて極力やりたくないんじゃないかな?
呼ばれる回数が少ないにせよスタック潰しなのかな、と。
>何行になるか分からないので、内部テーブルを持つ訳にも行かない。
これは単純に a[] の[]内がかけないという意味じゃ?
メモリアロケートしてポインタでつなげて…じゃ、面倒かな?
.libのファイルってどうやったら中身が見れますか?
このなかに入っている関数と似た関数を作りたくて、どうやっているのか調べたいの
です。
Visual Studio.NETでは意味のわからない数字とかが出てきてしまいました。
>>989 環境依存。
Win32とWin64ではintは32ビットと決められている。
Win32&Win64ではlongも32ビットと決められている。