C統合・質問スレッドat TECH
C統合・質問スレッド - 暇つぶし2ch175:160
04/05/28 23:52
なんか3回も書き込んである・・・orz

>>174
おお ありがとうございます。

(*ptr)[2]は*ptrの変数配列ですか?

ptr[1][1]と*(ptr+(1*2)+1)ではどっちの方が処理早いですかね?

176:デフォルトの名無しさん
04/05/29 16:03
>>175
最適化でどっちも同じになるだろ

177:デフォルトの名無しさん
04/05/29 19:54
>>175
>(*ptr)[2]は*ptrの変数配列ですか?
>>159参照。
ptrはint[2]へのポインタ。

>ptr[1][1]と*(ptr+(1*2)+1)ではどっちの方が処理早いですかね?
この二つは全く意味が違う。
後者はptr[3]と同じで、型はintの配列。

178:177
04/05/29 20:42
>>160が理解していないと思われることを補足しておく。
必要がなかったらスルーしてくれ。

まず、二次元配列は、配列の配列である。つまり、
int arr[2][3];
という宣言があるとき、arr[0]やarr[1]はintの配列で、要素数は3である。
ここで、配列はその先頭要素へのポインタに変換されることを思い出して欲しい。
だから、arrはarr[0]へのポインタに変換される。arr[0]はintの配列だから、
変換された後のarrはintの配列へのポインタ、つまり型はint (*)[3]である。
int (*)[3]型の変数pを宣言するにはint (*p)[3];と書く。これが、>>174
ptr = a;
が正しくコンパイルされる理由だ。

次に、配列の要素を指しているポインタに整数nを足すと、
はじめに指していた要素のn個先の要素を指すポインタができる。
これは、その配列が、配列への配列(二次元配列)であっても同じことである。
だから、>>174の例で*(ptr+(1*2)+1)と書くと、ptrの三番目の要素が得られる。
実際にはptrには二つの要素しかないから、この結果は意味を成さない。

最後に、配列はメモリ上で、各要素が隙間なく並べられる。たとえば、
int arr[2][3];
と宣言した場合、arr[0]とarr[1]が隙間なく並べられる。
このとき、arr[0]やarr[1]も配列だから、これらの各要素も隙間なく並べられる。結果的に、
arr[0][0] arr[0][1] arr[0][2] arr[1][0] arr[1][1] arr[1][2]
と並ぶことになる。
この並びを一次元配列とみなしてアクセスするのが、>>161の方法である。
このとき、一次元配列の各要素はintであることに注意してくれ。
これを実現するには、添え字を一次元配列用に計算してarr[0][0]へのポインタに足せば良い。
arrはarr[0]へのポインタであってarr[0][0]へのポインタではないから、そのままでは使えない。
そこで、素直に&arr[0][0]と書くか、(int *)arrと強引にキャストする。

179:177
04/05/29 20:52
#include <stdio.h>
#include <conio.h>
int main()
{
int *p, a[2][2] = {{0, 1}, {2, 3}},b;

p = &a[0][0]; /* p = (int *)a;と書いても同じ */

a[1][1] = 5; /* a[1][2]は配列の外 */

b = *(p + (1*2+1)); /* b = p[1*2+1]; と書いても同じ */

printf("%d",b);
getch();
}

>>160がやりたかったのはこれかな?

180:160
04/05/29 21:43
>177-179
おお 分かりやすい説明ありがとうございます。
p=&arr[0][0]の方法は2次元以上の配列だと楽ですね。



181:デフォルトの名無しさん
04/06/09 15:05
調べても分からなかったんで教えてください。

イーサネット接続するときに connect()を使うわけですが
これのタイムアウト値を設定したいときどうすればよいのでしょうか。
settimeoutとか見かけたけど使い方が分かりませんでした。


182:デフォルトの名無しさん
04/06/29 16:56
連立方程式を解くプログラムを教えて下さい~!

ax+by+c=0
dx+ey+f=0

のときx,yをとくような奴です。

C言語でおながいいいい

183:デフォルトの名無しさん
04/06/29 17:07
>>182 代数・幾何学の勉強しなさい。逆行列を作れば簡単に解ける。
理系の大学生なら授業でやると思われ。


184:デフォルトの名無しさん
04/07/04 01:11
初めまして。色々と試しているのですが、プログラムが作れません。
よろしければ、教えてください。
「チーム研究発表会の評価を集計するプログラムを作る。3人以内の学生メンバーで構成される4
チームが発表会に参加する。評価は調査内容、提案内容、発表資料、発表方法の4つのポイントで
行われ、各々のチームに対して合計点数が付けられる。」
1.評価に必要なデータを全て含むようなチームを表す構造体を作成し、typedefで名前を付けよ。
  変数名はできる限り理解しやすいものを考え、各チームのメンバーのフルネームと学籍番号も
  分かるようにすること。また、各チームにはチーム番号をつけよ。

という物なのですが、ここまで指定されていたら作れるのが当たりまえなのかもしれませんが、初心者
なものでほぼ手につきません。よろしければ、ヒント的なものでもかまわないので教えてください。

185:デフォルトの名無しさん
04/07/04 10:03
>>184

ヒント
こちらで聞いたほうがいいでしょう。

ぼるじょあがC/C++の宿題を片づけますYO! 25代目
スレリンク(tech板)l50

書き込む前に
スレリンク(tech板:1番)
を読むことをお忘れなく。

186:184
04/07/04 19:32
>>185
ありがとうございます。そちらの方で聞いてみます。

187:デフォルトの名無しさん
04/07/09 16:53
質問です.
循環リストの長所と短所と、どのようなアプリケーションに
循環リストは向いているかを教えてください。

188:デフォルトの名無しさん
04/10/09 22:28:31
すみません。

C言語 dos で
msecの時間を表示したいのですが、
どのようにすればよいでしょうか?

よろしくお願いします。

189:デフォルトの名無しさん
04/10/09 23:07:53
>>1
> いろんなスレが乱立していますが、
お前が言うことではないな。


190:デフォルトの名無しさん
04/10/15 19:31:51
C/C++ でフリーのライブラリとかでperl相当の正規表現処理
とかテキスト処理とかしてくれるようなものって存在しませんか?
あるいはperlのスクリプトをそのまま使えるような・・・
フリーで無ければ有料でも構いませんが。


191:190
04/10/15 19:32:10
age忘れました

192:デフォルトの名無しさん
04/10/15 19:59:47
>>190
C++ならboostでも使っとけ

193:190
04/10/15 20:34:31
紹介thx.

194:デフォルトの名無しさん
04/11/09 21:13:39
LSI C-86 超簡単セットアップの  
Setlsic.batを実行したんですが
LSI C-86試食版をF:\LSIC86にセットアップします。
と表示されてドライブを指定できません。
何ででしょうか?

195:デフォルトの名無しさん
04/11/09 21:23:34
>>194
そのSetlsic.batとやらを直接書き換えてみたらどうだ?

196:デフォルトの名無しさん
04/11/11 15:25:53
今Cのコンパイラしかないプラットフォームで開発をしていまして、
もともとC++で書いていたコードを移植しています。
クラスになっている箇所は、C++のクラスみたいに、

struct AbstractClass{
 int (*funcA)(void);
 int (*funcB)(void);
 int (*funcC)(void);
};

struct ConcreteClass{
 struct AbstractClass _super;
};


という風に仮想関数テーブルみたいなものを作ってるんですが、

struct ConcreteClass c;
struct AbstractClass *abstract;

abstract = (struct AbstractClass*)c;
abstract->funcA(abstract);

とかいちいち先頭に呼び出しのオブジェクトを入れたりするのが面倒だったり、
構造体のメンバのスコープを限定できなかったり、と色々不便です。
C++みたいなシンタクス(仮想関数テーブルとか構造体のメンバのスコープの限定とか)で書けて、
普通のC言語のコードを吐き出してくれるパーサーとかないでしょうか?
以前、昔のC++コンパイラは一旦Cのコードに変換してからコンパイルしていた、と読んだのですが、
今でもそのようなものはありますでしょうか?

197:デフォルトの名無しさん
04/11/11 18:02:27
今Cのコンパイラしかないプラットフォームで開発をしていまして、
もともとC++で書いていたコードを移植しています。
クラスになっている箇所は、C++のクラスみたいに、

struct AbstractClass{
 int (*funcA)(void);
 int (*funcB)(void);
 int (*funcC)(void);
};

struct ConcreteClass{
 struct AbstractClass _super;
};


という風に仮想関数テーブルみたいなものを作ってるんですが、

struct ConcreteClass c;
struct AbstractClass *abstract;

abstract = (struct AbstractClass*)c;
abstract->funcA(abstract);

とかいちいち先頭に呼び出しのオブジェクトを入れたりするのが面倒だったり、
構造体のメンバのスコープを限定できなかったり、と色々不便です。
C++みたいなシンタクス(仮想関数テーブルとか構造体のメンバのスコープの限定とか)で書けて、
普通のC言語のコードを吐き出してくれるパーサーとかないでしょうか?
以前、昔のC++コンパイラは一旦Cのコードに変換してからコンパイルしていた、と読んだのですが、
今でもそのようなものはありますでしょうか?

198:デフォルトの名無しさん
04/11/11 18:05:37
C++の方のオプションで出来たような希ガス

199:デフォルトの名無しさん
04/11/11 18:11:01
>>196
今まともに使えるのはないっぽい。

200:196
04/11/11 18:38:21
>>198
gccのman見たけど見つからなかった。
どのコンパイラで使えるかご存知でしたら教えていただけませんか?

>>199
一部機能が使えない(関数のオーバーロードとか)くらいなら問題ないんですが、
プリプロセスの結果が怪しい、ってことでしょうか?

201:デフォルトの名無しさん
04/11/11 19:44:30
>>197
>普通のC言語のコードを吐き出してくれるパーサーとかないでしょうか?

普通、そういうのは「パーサー」と呼ばず「トランスレータ」と呼ぶ。
後は自分で調べれ。


202:デフォルトの名無しさん
04/11/11 20:00:30
gccの環境ってどこでDLすればいいんでしょうか?
ググッたけれど見つからないので(´・ω・`)

203:デフォルトの名無しさん
04/11/11 20:07:28
>>202
Windows?Linux?


204:202
04/11/11 20:18:24
Windowsです。
そろそろLinuxに移行しようと思ってるのでLinuxも教えていただければ幸いです。

205:デフォルトの名無しさん
04/11/11 20:23:10
>>204
WindowsならCygwinをインストールするときにgccを指定できるし、
MinGWというフリー環境もある。
Linuxだと大抵のディストリビューションに付属しているので特に問題はないと思う。
debianなどのディストリビューションでは初めから入っているわけではないが、
apt-getなどのツールで一発でインストールできる場合がほとんどなので、
Linuxの場合は開発環境に悩まされる事はほとんどないと思うよ。

206:デフォルトの名無しさん
04/11/11 20:25:56
>>205
即レスありがとうございます。
Cygwinを入れたときに指定していなかったらしいのでMinGWを使ってみます。

207:デフォルトの名無しさん
04/11/11 20:29:32
>>206
もう一度Cygwinのセットアッププログラムを実行して、gccを指定すれば
そのままインストールできるけれど。
再インストールではなく追加インストールになる。

208:デフォルトの名無しさん
04/11/11 20:44:11
>>207
MinWinでどれをDLしてよいかわからなかったのでCygwinのほうでやってみます。
とりあえずパッケージ選択時に全部選択しました。疲れたorz

209:デフォルトの名無しさん
04/11/11 20:54:30
Cygwinはデフォルトでgcc3.3.3だから、3.4入れたければ設定替えないとね

210:196
04/11/11 21:25:17
>>201
ありがとうございまつ。

探したけどもう全然ないんですね(´・ω・`)

211:デフォルトの名無しさん
04/11/11 22:41:57
>>210
Objective-Cならトランスレーターがあるが・・・

212:デフォルトの名無しさん
04/11/11 23:02:50
プログラマさんからみて、unixのソースコードってどうなんでしょう?
インターフェース関係ぐらいしか読んでないのでわかりませんが、
やっぱりプロはすごい。

213:デフォルトの名無しさん
04/11/12 21:39:10
#include <stdio.h>

main ()
{
int res;
char ans;

printf("何番目を選びますか?\n");
printf("整数を入力してください。\n");

scanf("%d",&res);

if(res == 1)
ans = 'A';
else
ans = 'B';

printf("%cコースを選択しました。\n",res);

return 0;
}


って本に書いてたんでコンパイルしようとしたら
ansに代入した値は使われていない。
と表示されてコンパイルできません。
なんででしょうか?

214:デフォルトの名無しさん
04/11/12 21:47:16
printf("%cコースを選択しました。\n",res);
 ↓
printf("%cコースを選択しました。\n",ans);

215:213
04/11/12 22:25:31
>>214
ありがとうございます。
できました。
これで先に進めます。

216:215
04/11/12 22:31:43
すいません。
次のsampleもできません。
内容は
#include <stdio.h>

main ()
[
int res;
char ans;

printf("何番目を選びますか?\n");
printf("整数を入力してください。\n");

scanf("%d",&res);

ans = (res==1) ? 'A' : 'B';

printf("%cコースを選択しました。\n",ans);

return 0;
}

というのものですがどこが変なんでしょうか?

217:デフォルトの名無しさん
04/11/12 22:39:53
>>216
main()の直後の [ を { へ。

218:216
04/11/12 23:05:27
>>217
コンパイルできました。
こんな質問にも答えてくれてありがとうございます。

219:デフォルトの名無しさん
04/11/15 09:09:01
目の前にあるバグが見えるか見えないかは経験の問題だからな


220:196
04/11/16 15:36:24
>>211
禿しくありがとう!!
試してみまつ。

221:デフォルトの名無しさん
04/11/16 21:55:34
①for(i=0;i<5;i++)
②for(i=0;<=5;i++)

①は0,1,2,3,4と5回
②は0,1,2,3,4,5と6回繰り返す
という意味合いでいいんですか?

222:デフォルトの名無しさん
04/11/16 22:03:19
あげさせてもらいますよ

223:デフォルトの名無しさん
04/11/16 22:05:55
>>222
氏ね

224:デフォルトの名無しさん
04/11/16 22:08:37
>>221
それであっている。

225:デフォルトの名無しさん
04/11/16 22:09:27
②は違う

226:デフォルトの名無しさん
04/11/16 22:09:27
いまくだらんプログラム作っていまして、ビルドしたらエラーが12・・・orz
何回も見直したんですが、原因が見いだせなくて・・・
初歩ですが、どうかよろしくお願いいたします。
/*shm.c*/
#include<stdio.h>
#include<conio.h>

int main(void){
int age;
int seito;
printf("▼はENTERを押してください。\nまた、INPUT[というのが出た場合は、整数値を入力してENTERを押してください\n");
printf("A:ちょっと聞きたいことがあるんだよ。いいかな?.....▼\n");
getch();
printf("A:一応、自分刑事で、極秘の捜査中でね。秘密だよ。お願いがあるんだけど年齢教えてくれないかな?▼\n");
getch();
printf("俺の年齢は......INPUT[");
scanf("%d", &age);
printf("俺の年齢は%dです。", age);
printf("A:ありがとう。%d歳なんだね。ところでMONEY IS LIFEという学校をしているかい?捜査中で必要な情報なんでね。知らないか?▼\n",age);
   getch();
printf("自分がその学校の生徒ということを教える.....YES=1 NO=0.....INPUT[");
scanf("%d", &seito);


227:226
04/11/16 22:09:52
if(age >= 15){
printf("A:ありがとう。君は好青年だね。ところでお金をくれないか?あぁ?残念だったな。いろいろ教えてくれてありがとうよ。あとは金奪ってサヨナラだ。( ゚Д゚)イッテヨシ!▼\n");
}else if(seito == 1){
printf("A:ありがとう。君は好青年だね。ところでお金をくれないか?あぁ?残念だったな。いろいろ教えてくれてありがとうよ。あとは金奪ってサヨナラだ。( ゚Д゚)イッテヨシ!▼\n");
}else{
printf("A:いろいろ教えてくれてありがとう。じゃぁマタね。▼\n");
}
getch();
printf("こういう奴には気をつけよう▼!\n");
  getch();
printf("おわり。▼\n");
return 0;
}

228:221
04/11/16 22:15:36
ほかのスレで聞いてきます

229:デフォルトの名無しさん
04/11/16 22:15:55
カワイソウナショウネン…

230:デフォルトの名無しさん
04/11/17 00:39:05
>>225
違うかのか?

231:デフォルトの名無しさん
04/11/17 00:47:59
>>230
とりあえずコンパイルできなかった

232:デフォルトの名無しさん
04/11/17 00:52:13
>>231
すいませんでした。

233:デフォルトの名無しさん
04/11/18 00:45:36
goto文って飛べるの関数内だけだけでしたっけ?
その場合にかなり深い位置にある関数内からmainのある位置に戻すいい方法ってありますか?

234:デフォルトの名無しさん
04/11/18 00:54:11
>>233
setjmp,longjmp

235:デフォルトの名無しさん
04/11/18 00:55:09
>>233
gotoは関数内のみ。 もっと飛ぶならlongjmp。

236:デフォルトの名無しさん
04/11/18 00:57:46
>>233
setjmp と longjmp でいけます。

237:233
04/11/18 01:20:14
>>234-236
ありがとうございます

238:デフォルトの名無しさん
04/11/18 03:23:17
>>226 はスルーなのか・・・
「人工無能」でぐぐってくれ


239:デフォルトの名無しさん
04/11/18 09:33:22
   getch();

240:デフォルトの名無しさん
04/11/18 12:03:53
再確認。

  こ こ は ス レ タ イ ト ル を ミ ス っ た C ♯ ス レ で す にょ

241:デフォルトの名無しさん
04/11/22 15:01:17


242:デフォルトの名無しさん
05/01/03 17:19:42
UnixとWindows両方で使えるCのZip操作ライブラリが欲しいんですが、どんなのがありますか?
zipという単語が一般的過ぎてぐぐってもノイズばかり…

243:デフォルトの名無しさん
05/01/03 17:21:05
重複スレ

= = = = = = = = = = = 終 了 = = = = = = = = = = =

244:デフォルトの名無しさん
05/01/03 17:58:01
じゃあ本スレってどこ?

245:デフォルトの名無しさん
05/01/03 18:00:55
>>244
スレリンク(tech板)

246:デフォルトの名無しさん
05/01/03 18:11:50
>>242
zlibでいいんじゃないの? Windows端末でもCygwin使えば使えるし。

247:デフォルトの名無しさん
05/01/04 10:26:26
とりあえずexeファイル作りたいんですが
どうすればいいんですか。

248:デフォルトの名無しさん
05/01/04 14:12:58
>247
解決

249:247
05/01/04 15:29:13
>>248
ありがとうございます。
それを使ってみます。


250:デフォルトの名無しさん
05/02/03 00:21:32
マルチメディアタイマを使って、8Hz(125ms周期)にある関数を起動させたいのですが、
方法(できればコード)を教えて下さい。

251:デフォルトの名無しさん
05/02/03 00:42:03
while(1){foo();sleep(125);}

252:デフォルトの名無しさん
05/02/03 02:59:07
>>251
煽りはいいけど、マルチメディアタイマ使ってないですね。

253:デフォルトの名無しさん
05/02/03 03:30:26
>>252
悔しい?w

254:デフォルトの名無しさん
05/02/03 06:23:35
1次元配列と2次元配列でたとえば
int a[6],b[2][3]を確保して
a[0]とb[0][0]、a[1]とb[0][1]、a[2]とb[0][2]、
a[3]とb[1][0]、a[4]とb[1][1]、a[5]とb[1][2]が
それぞれ同じアドレスを参照してa[0]を変えたらb[0][0]も一緒に中身が変わるようにしたいんだけど

#include <stdio.h>
void main(void)
{
int *a[2];
int b[6];

a[0]=&b[0];
a[1]=&b[3];
}

って書き方でいいかな?
なんか問題ある気がするんだけど他にいい方法ないかな?
あとポインタにするのは2次元配列のほうにしてほしいのよ

255:254
05/02/03 06:30:01
ここC#スレだったのか
スレ違いスマソ
他スレ行ってきます

256:デフォルトの名無しさん
05/02/03 14:03:04
【質問】 VC++でdouble型の数字を小数点以下を切り捨ててCString型に変換するにはどうすればいいか?

CString strAAA;
double dBBB;

dBBB = (double)50.0;
strAAA.Format(_T("%f"), dBBB);

とすると、strAAAには"50.00000"
という文字列が入りますが、
strAAAには"50"という文字列を入れたいのです。
どうすればいいのでしょうか?

257:デフォルトの名無しさん
05/02/03 14:10:26
>>256
%gにしろ

258:デフォルトの名無しさん
05/02/03 14:17:48
>>257
サンクス。
MSDNライブラリで
%d や %f
に関する説明ページが見つからなかったもので。

259:デフォルトの名無しさん
05/02/03 15:05:03
>>258
探し方が悪い。
CString::Format()の説明からリンクを二回手繰れば書いてある。

260:デフォルトの名無しさん
05/02/03 15:19:09
っていうか、それ以前に、幼児期の直感教育がしっかりなされていない。
書式がprintfと同じではないかとどうして想像できなかったんだろう。
想像していたら%gを試していたはずだ。
知らなかったとしてもprintfの書式で調べていたはずだ。

261:デフォルトの名無しさん
05/02/03 16:18:18
【追加質問】 double型の数字を7桁にすると ***e+006となってしまうのを、7桁の文字列にしたい。

CString strAAA;
CString strBBB;
double dCCC;
double dDDD;

dCCC = (double)1234567;
dDDD = (double)123456;
strAAA.Format(_T("%g"), dCCC);
strBBB.Format(_T("%g"), dDDD);

とするとstrAAAには"123456"という文字列が入りますが
strBBBには"1.23457e+006"という文字列が入ってしまいます。
strBBBに"1234567"という文字列を入れたい場合はどうすればいいのでしょうか?
最高10桁までちゃんと入るようにしたいんです。


262:デフォルトの名無しさん
05/02/03 16:28:41
多倍長浮動小数点演算ライブラリ使えよ

263:デフォルトの名無しさん
05/02/03 16:45:28
>>261
%.7g
7の部分は精度。

264:デフォルトの名無しさん
05/02/03 16:46:59
10桁までなら%.10g

265:デフォルトの名無しさん
05/02/03 16:49:45
>>263
>>264
デキターありがとう!

>>262
よくわかりません。

266:デフォルトの名無しさん
05/02/03 16:50:59
>>259
>>260

しんでしまえ

267:デフォルトの名無しさん
05/02/03 16:55:03
>>266
>>259=>>260=>>263=>>264なんだがね。

268:259
05/02/03 19:08:08
違うよ。

269:259=268
05/02/03 19:09:08
つーか、260,263,264は私じゃない。

270:デフォルトの名無しさん
05/02/03 20:03:35
スレリンク(tech板:247番)n-

此処で訊いたら、こう言われましたが、何故かC言語の教本のサンプルはは
#include <stdio.h>

main() {
printf("Hello!");
return 0;
}

の様に空白欄が在るのに、自分が書いたのに空白欄を作ると
何故か上記のアドレスに出た、エラーが出てしまいます
調べても、本にも書いていませんでした、ご教授お願い致します。

271:デフォルトの名無しさん
05/02/03 20:09:55
あれ・・・?空白欄がない。
メモ帳で見るとあるんです。

272:デフォルトの名無しさん
05/02/03 20:28:27
ネタかなあ・・

ヒント:全角スペース

273:デフォルトの名無しさん
05/02/03 20:29:44
>>270
もしかすると、君は全角スペースを入れているのでないだろうか。
使っても良いのは半角スペースとアルファベット、半角の記号のみ。

274:デフォルトの名無しさん
05/02/03 20:32:56
ま、全角スペースを解釈しないコンパイラが悪いんだな。
うんうん。

275:デフォルトの名無しさん
05/02/03 20:33:39
それは言えてる。

276:デフォルトの名無しさん
05/02/03 20:34:03
ありがとうございました
要は空欄を空けてもいいけど、半角を使えと言う事でしょうか?

277:デフォルトの名無しさん
05/02/03 20:35:38
だめだこいつ
全然わかってない・・

278:デフォルトの名無しさん
05/02/03 20:40:51
すみません・・・
簡単に言えば、空欄(スペース)は空けない方がいいですよね?

279:デフォルトの名無しさん
05/02/03 20:43:28
ブラウン運動を非整数階微積分するプログラムを作成したのですが、上手く動きません。どこがわるいのでしょうか??
実行結果は数値を出し、エクセルでグラフ化しています。(window.hが使えないため)
#include <stdio.h>  #include <stdlib.h>
#include <time.h>  #include <math.h>
#define KMAX 100  #define XMAX 300
#define PI 3.14159265358979323846
double gar()
{double r = 0.0;
int i;
for(i = 0; i < 10; i++){r += ((double)rand() / RAND_MAX) - 0.5;}
return r;}
int main(void)
{int x, k;     float d; scanf("%f",&d);
double ek = PI * 2.0 * 0.7 / XMAX; double a = 5.0 – 2*d;
double f[XMAX];  double g[KMAX];
srand((unsigned)time(NULL));
for(k = 1; k < KMAX; k++){
g[k]=pow(( ek * rk ),-a/2);}
for(x = 0; x < XMAX; x++){  f[x] = 0.0;
for(k = 1; k < KMAX; k++){  double kx = ek * rk * x;
f[x] = f[x]+g[k]*(gar() * cos(kx) - gai() * sin(kx));}
printf("%g\n",f[x]);}
}

280:デフォルトの名無しさん
05/02/03 20:51:47
>>278
先頭に付けてもいいのは半角スペースとTABのみ。
スペースを空けるのは括弧同士の対応や意味的な違いを付けるためで、それをインデント
を付けるといいます。
これをしないとプログラムが見憎くなります。
的確にスペースを空けてください。

281:デフォルトの名無しさん
05/02/03 20:54:30
>>280
ありがとうございます!!
とりあえず、半角でスペースを空けたら、何の問題もなく
実行できました。
たぶん、全角だったのでエラー出たみたいでした。

282:ななし
05/02/03 22:14:53
どなたかC言語でHTTPリクエストを送信できるようなライブラリを
ご存知のかたいらっしゃいませんか?
ヘッダーを意識しなくてすむような形のもので!


283:デフォルトの名無しさん
05/02/04 00:40:29
WinInet

284:デフォルトの名無しさん
05/02/06 23:45:27
質問です。
以下の環境で、外部バイナリ(画像)ファイルを実行ファイルにリンクしたいのです。
何かスマートな方法はあるのでしょうか?

開発環境OS : FreeBSD 5.3
コンパイラ : gcc 2.95.4

調べたこと :
binutils の objcopy でオブジェクトファイルに変換n出来るかなと
ドキュメントを流し読みしましたが、出来そうにありません。

以上、よろしくお願いします。

285:デフォルトの名無しさん
05/02/09 12:50:59
Labeling.c1: "#include" expect "FILENAME"or<FILENAME>

このエラーを回避する方法わかる方いますか?よろしくお願いします

286:285
05/02/09 13:00:42
すみません。なんか初歩的入力ミス見たいです

287:デフォルトの名無しさん
05/02/09 13:14:18
ウインドウズプログラミングで仮想キーコードを使って
数字を表示したいのですが、0が表示できません。
keybd_event(VK_NUMPAD0,0,0,0);
keybd_event(VK_NUMPAD0, 0, KEYEVENTF_KEYUP, 0);
文法的に誤りがあるのでしょうか?
わかる方いましたら、お願いします。

288:デフォルトの名無しさん
05/02/09 13:36:43
誰かFTPサーバのソースプログラム教えてくれない?
今すぐ欲しいから誰かお願いします。Cの初心者なんで、そ
んなの簡単だよって思うかもしれませんが、どうかC言語
できる人よろしくお願いします。


289:デフォルトの名無しさん
05/02/09 13:41:16
Linuxのソースがあるべ、バカだな

290:デフォルトの名無しさん
05/02/09 13:51:38
おい!そいつは初心者だぞ。Linuxのソースの見れる方法も
ついでに教えてやれ。たぶんわかっとらんと思うぞ。

291:デフォルトの名無しさん
05/02/09 13:55:53
おっしゃるとおりです・・・。教えていただけます?


292:デフォルトの名無しさん
05/02/09 13:56:22
嫌だね、プ

293:デフォルトの名無しさん
05/02/09 14:03:09
RFC FTPでぐぐれば仕様書が出てくるからそれで作るのもいいかも

294:デフォルトの名無しさん
05/02/09 14:12:10
>>287
VK_NUMPAD0の代わりに'0'にしてみたらどう?

295:デフォルトの名無しさん
05/02/09 14:22:03
あのー・・・いまいちよくわかりません・・・。どなたかサンプルプログラム
書けるひといます?もしよかったらここに表示していただけたらと思い
ます。それをそのまま打ち込んでいくんで・・・。

296:デフォルトの名無しさん
05/02/09 14:26:11
ポート20をリッスン、認証できたら、ポート20のコマンドどうりに
ポート21でデータ転送。以上

297:デフォルトの名無しさん
05/02/09 15:11:36
私はCommonArchiverProjectのftp.dllを参考にしたことがあるなぁ。
バグがあって笑えたけど。

298:デフォルトの名無しさん
05/02/09 15:13:55
わらってはいけない。只で提供してるんだから。
金取ってるやつには罵詈雑言OK

299:デフォルトの名無しさん
05/02/09 15:16:10
いやぁ、使ってる人いないんだろうなぁと。<笑えた
尤も、作者に指摘メール送ったが黙殺されたので、本当のところは知らん。

300:デフォルトの名無しさん
05/02/09 17:03:27
#include <stdio.h>

void main(void)
{
int i;
char a[5];
for(i = 0; i < 5; i++){
printf("何か1文字入力する\n");
scanf("%c",&a[i]);
}
printf("%c,%c,%c,%c,%c\n",a[1],a[2],a[3],a[4],a[5]);
}

非常に簡単な質問で申し訳ないのですが…
このプログラムを実行するとforのi=2,i=4のときのscanfが飛ばされてしまいます。
その後の結果表示も何かおかしいのです。

自分なりに調べてはみましたが、一体何が悪いのかがわかりません。
コンパイラはBorland C++ Compiler 5.5を使っています。


301:デフォルトの名無しさん
05/02/09 17:06:20
改行コードもsacanfだな

302:デフォルトの名無しさん
05/02/09 17:37:54
void main(void)
{
int i;
char a[5]; // ←範囲は、0~4までで 5個
char b[1024];
for(i = 0; i < 5; i++){
printf("何か1文字入力する\n");
scanf("%s",&b); // バッファーフォローの危険性があり、実務だと駄目!
a[i] = b[0];
}
printf("%c,%c,%c,%c,%c\n",a[0],a[1],a[2],a[3],a[4]);
}

こんな感じだけど、入力は別関数を作ってね!

303:デフォルトの名無しさん
05/02/09 17:48:30
ださ

304:デフォルトの名無しさん
05/02/09 18:10:25
>>302
突っ込みどころ満載だな。
・バッファオーバフローの心配するなら指定子で制限しろ。
・配列のアドレスを渡すな。
・バッファーフォローなんて俺語を作るな。
・main()の戻り値を勝手にvoidにするな。

305:デフォルトの名無しさん
05/02/09 18:43:32
>>300
最後のprintfところでa[1]~a[5]になってるとこをa[0]~a[4]になおして、
それから一回目の入力で入れたい数字を全部連続でいれてみ?2468って感じで
最後の出力だけはきれいにでるとおもうよw

306:デフォルトの名無しさん
05/02/09 21:05:07
>>304
で、模範解答は?
文字列の読み込みって、簡単なようで難しいんだよね。

scanf を使って・・・・

307:300
05/02/09 21:22:25
300です。
皆さんレスありがとうございます。

あれからも考えてみましたが、やっぱりわかりませんでした。
aの配列というのが不味いのかと思って、a,b,c,d,eと定義してみましたが、これもまた同じ結果になってしまいます。
もうあきらめた方がいいんでしょうか。
バグの原因がわからないと、また再発させそうで非常に気になるんですが…

308:デフォルトの名無しさん
05/02/09 22:31:28
scanf使うのが悪い
fgetsしてsscanf使え


309:デフォルトの名無しさん
05/02/09 22:35:34
>>300
まず1文字目を入力した後、Enterを打つだろ。
そのEnterもscanfの%cで入力されているのだろう。
と、俺は予想した。
#include <stdio.h>
int main(void)
{
    int i;
    char a[5];
    for (i = 0; i < sizeof a; i++)
        scanf("%c%*[^\n]%*c", &a[i]);
        //%*[^\n]は'\n'が出るまで読み飛ばす指定
        //%*cは1文字読み飛ばし('\n'まで読み飛ばしたので当然'\n'を読み飛ばす事になる)
    printf("%c, %c, %c, %c, %c\n", a[0], a[1], a[2], a[3], a[4]);
    return 0;
}


310:デフォルトの名無しさん
05/02/09 22:41:35
>>300
301さんが解答ですよ。

  scanf("%c",&a[i]);

で一文字読み込んだとき、まだ標準入力のバッファには改行文字が残っているのです。
それが自動的に偶数回のscanf(...)の入力となっています。

  scanf("%c",&a[i]);
  fflush(stdin);

として標準入力のバッファをクリアしてあげれば、一文字ずつ入力できます。


311:デフォルトの名無しさん
05/02/09 22:47:26
>>310
fflushは出力バッファのフラッシュ用なんで残念!
stdinに対しては未定義り!

312:デフォルトの名無しさん
05/02/09 22:49:21
>>301-310
皆さんどうもありがとうございました。
おかげで解決しました。



313:デフォルトの名無しさん
05/02/09 22:53:31
#include <stdio.h>
#include <stdlib.h>

int GetStdinToInt()
{
  char buf[256];
  int result;
  char* check;

  while(1){
    fgets(buf, 255, stdin);
    result = (int)strtol(buf, &check, 0);
    if(check != buf) break;
    printf("もう一度入力してください:");
  }

  return result;
}


314:310
05/02/09 22:55:12
>>311
そのようですね。今調べて認識しました。

URLリンク(www9.plala.or.jp)

今回の解答は

URLリンク(www9.plala.or.jp)

に書いてありました。

315:302
05/02/09 23:02:16
>scanf("%s",&b);
scanf("%s",b); ←訂正すんまそ

最近、JavaとVBしかやってないから・・・・ (ーー

316:310
05/02/09 23:08:39
>>300

fflush(stdin)

のかわりに、

fseek(stdin, 0, SEEK_SET);

が動作保証されています。

でも、今回の場合は314で2番目のURLに書いてあることが一番いいかも。


317:310
05/02/09 23:11:50
失礼
fseek(stdin, 0L, SEEK_SET);
でした。

318:デフォルトの名無しさん
05/02/09 23:35:32
simpson法の中で関数を呼び出してその中で積分の計算を行うプログラムを作っています。
しかし、計算速度がものすごく遅いんですがなにかいい方法ありませんか?


319:デフォルトの名無しさん
05/02/09 23:37:51
で、今の計算機は?

320:デフォルトの名無しさん
05/02/09 23:50:30
>>318
難しいことやってるんだね、学生さん。
おいらにはよく分からないけど...。

URLリンク(www.mech.tohoku-gakuin.ac.jp)
にjavaだけれどコードがのってますよ。
良かったら参考にしてみたら。

321:デフォルトの名無しさん
05/02/09 23:57:32
>>320
thx
SSEつかって高速化図ってみます、、

322:デフォルトの名無しさん
05/02/11 00:36:27
C言語のバージョン教えてと言われた。
どうやって知ればいいんだろうか。

323:デフォルトの名無しさん
05/02/11 00:41:21
sにcharを足すstrcatってないの?

324:デフォルトの名無しさん
05/02/11 00:42:42
>>322
URLリンク(seclan.dll.jp)
の__STDC_VERSION__

325:デフォルトの名無しさん
05/02/11 01:14:37
>>323
ありませんよ。

Cで一般的に言われる文字列というものは、最後がヌル文字'\0'で終わることを前提
としています。提供されるシステム関数strcat()などもそうです。
一文字のcharはそういった関数で使用することはできません。

char dest[100];
char src1[] = "abc";
char src2 = 'x';
int len;

len = strlen(strcpy(dest, src1));
dest[len] = src2;
dest[len + 1] = '\0';

こんな感じですかね。もっとアクロバット的な方法もあるんでしょうが...。

326:デフォルトの名無しさん
05/02/11 01:49:10
int n = c;
strcat(s, &n);

327:デフォルトの名無しさん
05/02/11 02:14:49
>>326
関数内の自動変数の場合、
int n
の場合、cを代入した次のバイトがNULLである保証はありませんよ。

328:デフォルトの名無しさん
05/02/11 02:16:47
補足。
CPUのアーキテクチャによって異なります。
言語としてそういったことに依存すべきではないと言いたかったのです。

329:デフォルトの名無しさん
05/02/11 02:50:54
>>327
ん? cは1バイトだから他の3バイトは当然0になるでしょう。 しかしこれは
endianによっては右に詰まってだめだと思うので >>328は正しいと
思うけど。

ちなみにこんなのはどう?
sprintf(s, "%s%c", s, c);


330:デフォルトの名無しさん
05/02/11 06:51:06
>>329
未定義

>>326
char s2[] = {c, '\0'};
strcat(s, s2);でいいじゃん。

C99ならstrcat(s, (char []){c, '\0'});って書ける筈だけど。

331:デフォルトの名無しさん
05/02/11 10:17:54
私はこんな幹事かな。
sprintf(strchr(str, '\0'), "%c", ch);
或いはこう。
char * p = str + strlen(str);
p[0] = ch;
p[1] = '\0';

332:デフォルトの名無しさん
05/02/27 16:56:10
すみません、妙な質問で恐縮ですが、どなたか教えてください。

sprintf() の s ってどういう意味ですか?f は format の意味だと思うのですが。

333:デフォルトの名無しさん
05/02/27 16:59:08
stringじゃない?

334:デフォルトの名無しさん
05/02/27 17:01:38
sはsecond。fはfirst

335:デフォルトの名無しさん
05/02/27 18:04:22
string ですか。ありがとうございました。
scond ですか(ry

336:デフォルトの名無しさん
05/02/28 12:51:53
>>332
printf()「系」とかssanf()「系」とか言う言葉があるよ。
先頭の's'はstring、'f'は自分でオープンしたファイル、付かないものは対象がstdinか
stdout。結構系統立てられているんですよ。

337:336
05/02/28 12:53:07
メンゴです。
一行目のssanf()はscanf()でした。

338:デフォルトの名無しさん
05/02/28 14:16:48
>>336
さらにva_listを引数に取るvprintf/vscanfも有る。当然fとsも有る。
vscanf系はC99で追加されたものだけど。

339:デフォルトの名無しさん
05/02/28 18:51:54
springfというのもある

340:デフォルトの名無しさん
05/02/28 22:45:28
さらに最新最強はsnprintf。 渡したchar *のサイズを2つ目の引数で指定でき、
そのサイズを超えて書かないことが保障されているのでやや安全。

341:デフォルトの名無しさん
05/03/02 16:40:40
アドレスに関する質問。
型は不明で、要素一つのサイズは分かってる場合。

次の要素にアクセスする方法を教えて下さい。
または次の要素へのアドレスを取得する方法。


342:342
05/03/02 16:42:50
サイズがBYTEだってことに気づかなかった....。
解決しました。

343:デフォルトの名無しさん
05/03/09 14:33:38
POINT point[3] = { {0,0} , {1,0} , {0,1} };
っていう初期化はできるんですが

point[3] = { {0,0} , {1,0} , {0,1} }
という風に値を入れることが出来ません
配列全体に値を入れる方法は無いんですか?

344:デフォルトの名無しさん
05/03/09 16:00:29
>>343
配列に代入はできません。
精々コピー用の関数を用意するのが関の山です。
要素数が3で固定ならば、構造体にしてしまえば(直値ではありませんが)代入できなくもありません。


345:デフォルトの名無しさん
05/03/09 16:10:27
>344
関数でもつくってそれで入力するようにします
ありがとうございました。

346:デフォルトの名無しさん
05/03/10 00:43:33
Cって、こういうとこアフォだよなあ

347:デフォルトの名無しさん
05/03/10 19:02:05
やっぱりRubyがいいね

348:デフォルトの名無しさん
05/03/13 17:13:30
cでコンパイルする際に

windres: can't open `obj/EK-MAMEko/ui/mame32k.res' No such for directory
make: *** [obj/EK-MAMEko/ui/mame32.res] Error 1

こういうエラーが出て困ってるんだけど
これってどういう意味かわかる?

349:デフォルトの名無しさん
05/03/13 17:14:00
age

350:デフォルトの名無しさん
05/03/13 18:48:41
>>347
いや、Rubyは問題外。

351:デフォルトの名無しさん
05/03/17 00:52:33
変数を入れ替えるときに別の変数を用意せず、

X = X ^ Y, Y = X ^ Y, X = X ^ Y;

とするのがよくないのはなぜ?

352:デフォルトの名無しさん
05/03/17 00:56:22
>>351
数値以外には使えない
XとYが同じ変数を指していると上手くいかない

353:351
05/03/17 01:17:15
>>352
なるほど。
これをプリプロッセスでやって構造体なんかを渡しちゃうとマズーだ。
アリガト。

354:デフォルトの名無しさん
05/03/22 21:55:06
new演算子で作ったオブジェクトをdeleteした後に
デストラクタでdeleteすると何か問題ありますか?

355:デフォルトの名無しさん
05/03/22 23:09:33
mallocで確保した領域をfreeで開放しますが、
システムはどのようにして、はじめに確保した領域を知ることができるのでしょうか。

356:デフォルトの名無しさん
05/03/23 01:23:39
>>354
deleteしたら、0を入れておけば大丈夫。

>>355
malloc()で戻されたポインタの指すメモリの直前辺りに管理情報を埋めておくのが一般的。

357:デフォルトの名無しさん
05/04/03 14:07:55
配列同士の数値の比較をしたいのですが、下記のようだとうまくいきません。
どのようにすればよいのでしょうか?
for(i=0;i<5;i++)
for(j=0; j<5; j++)
if(group[i] == group[j] && i != j) count[i]++;

358:デフォルトの名無しさん
05/04/03 15:10:03
>>357
j = i

359:デフォルトの名無しさん
05/04/03 15:22:36
>>357
配列の同じインデックスを持つ要素同士を比較したいのであれば、単純な(一重の)ループでいい。
つーか、>357では日本語の説明が足りんし、コードがおかしいし、何がしたいのか判らんのだが。

360:デフォルトの名無しさん
05/04/04 00:24:27
すみません。初歩的な質問をさせていただきます。

char *func1(){
 return "a";
}

char *func2(){
 char *s = "a";
 return s;
}

こんな2つの関数があったとして、これらが関数の呼び出し元に返ってきた際に
戻り値のポインタが正しい場所を指し示すことはどこまで(いつまで)保障できるんでしょうか?
func1は保障できる、func2はできる、それとも両方できない/できる、どこまでなのか…等。
また、私の勉強不足のせいで、両者のメモリ上での違いがいまいちはっきりしてません。

一応どちらでも動作するにはするんですが、いつか不正な参照とかで
落ちちゃうんじゃないかと気になって怖くて夜も眠れません。

参考になるサイトを教えていただけるだけでも結構ですのでよろしくお願いします。

361:デフォルトの名無しさん
05/04/04 01:05:29
規格ではどうか忘れたけど、たいがいいけるはず。
どうしても心配ならstatic const char ret_str[] = "a";とかすれば?
あとchar *じゃなくてconst char *を使え。

362:デフォルトの名無しさん
05/04/04 01:08:07
>>360
定数(リテラル)の寿命はプログラムの開始から終了まで。
関数内で宣言されたauto変数の寿命は、関数の開始から終了まで。

char *func1(){
 return "a"; /* "a" を指すポインタを返している */
}
char *func2(){
 char *s = "a"; /* ポインタ s を "a" を指すポインタで初期化 */
 return s; /* ポインタ s の値、つまり "a" を指すポインタを返している */
}

つまり、どっちも同じ。
リテラルはいつでもどこからでも参照出来るので、戻り値を使ってても大丈夫。

363:360
05/04/04 02:05:28
>>361-362
ありがとうございます!だいぶスッキリしました。
リテラルに関しては参照先が不正な値になるんじゃないかとかいう
心配は無用なわけですね。逆の場合(変数、関数のポインタ)は気をつけろと。

すみません。あとここからもう一段階お願いします。
実は言うと今、Unix系ソフトの移植作業をやってまして
こいつらと同等の動作をするものを作りました。

char *dirname(char *path);
char *basename(char *path);

basename()はパス名からディレクトリを除いた部分(ファイル名)を返せばいいので
引数のポインタをそのまま使い回してreturn path+pos;のようにして返してます。

dirname()の方は引数で与えられたパス名からファイル名を除いたものを返すものなので、
関数内でdir[MAX_PATH]のように宣言した配列に、引数の文字列からファイル名部分を
除いたものをstrncpyでコピーなどして、最後にdir(先頭アドレス)を戻り値にしてます。
(ちなみにさっきの質問は"."「カレントディレクトリ」を返す場合でした。)

長すぎるのでまとめると、
・basename()の戻り値は呼び出し先のローカル変数とは無関係である。
・dirname()の戻り値は呼び出し先のローカル変数に依存している。

この場合だと、dirで確保していたアドレスは戻り先で参照しても安全なのでしょうか?
ちゃんと動くし、自分でも大丈夫だと思ってたのに警告が出たので不安になりました。

やたら長くてすみません。何かこれより良い実装方法がもしあればご教授願います。

364:360
05/04/04 02:14:47
何度もすみません。つまりさっき私が言ったdirname()の実装は

char *func2(){
 char *s = "a"; /* ポインタ s を "a" を指すポインタで初期化 */
 return s; /* ポインタ s の値、つまり "a" を指すポインタを返している */
}

この場合と同じと考えていいんでしょうか?ってことですね。
私の目には全く同じものに映るのですが、間違いありませんでしょうか。

365:デフォルトの名無しさん
05/04/04 02:15:23
floatがもてる最大値はどのように調べればよいのでしょうか?

366:デフォルトの名無しさん
05/04/04 02:30:48
>>363-364
const char *func3(void){
const char s[] = "a";
return s; /* ローカルな配列 s へのポインタを返す */
}

const char *p;
p = func(); /* 0, func() の s へのポインタを受け取る */
printf("%p\n", p); /* 1, これは構わない */
printf("%s\n", p); /* 2, これは駄目 */

0 は何ら構わない。戻ってきたアドレスをコピーしているだけ。
1 も何ら構わない。コピーしたアドレスを表示しているだけ。

2 は駄目。アドレスの先を参照してしまっているから。
何故参照してはいけなかというと、アドレスの先にある func3() の s の寿命は、
func3() を抜けた時点で既に尽きてしまっているから。

func2(), func3() は全然違う関数。

367:デフォルトの名無しさん
05/04/04 02:35:17
>>365
float.h にある FLT_MAX マクロで定義されてる。

#include <stdio.h>
#include <float.h>
int main(void)
{
 printf("%f\n", FLT_MAX);
 return 0;
}

368:デフォルトの名無しさん
05/04/04 02:50:42
>364
ダメ。変数の寿命について学んでください。

1.関数の引数を変える。
void dirname(char *dest,int dest_size,const char *path)

2.静的に保持する。使用に若干注意が加わる
static char dir[]

3.動的に確保する。呼び出し側に解放義務が発生する
char *dir = malloc()

369:デフォルトの名無しさん
05/04/04 03:05:49
>>367
thx
limit.hしか知らなかった

370:360
05/04/04 03:13:01
そのまま貼っちゃいます。今はこんな状態です。

char* dirname(char* path)
{
  int pos = strlen(path)-1;
  int lastPathSepFoundPos = -1;
  static dir[MAX_PATH]="";
  while(pos >= 0) {
    if (path[pos] == '/' || path[pos] == '\\') {
      lastPathSepFoundPos = pos;
      break;
    }
    else pos--;
  }
  if (lastPathSepFoundPos == -1) return "."; // current dir
  else{
    strncpy(dir,path,lastPathSepFoundPos);
    dir[lastPathSepFoundPos] = 0;
    return dir;
  }
}

static dir[MAX_PATH]="";をchar dir[MAX_PATH]にすると
→警告「ローカル変数またはテンポラリのアドレスを返します」
となってました。今考えてみれば当然ですよね。。

>>368
どうもです。ちょうど昨日、その2を回避策としてやってみてたとこでした。
その注意というのは関数へのアクセスが同時に起こるような場合でしょうか?

条件コンパイル(#ifdef-#endif)等が面倒になりそうですが、
1の方法が一番簡単そうなので、その方向でやってみることにします。

371:デフォルトの名無しさん
05/04/04 03:14:54
↑static char dir[MAX_PATH]="";の間違いです。

372:デフォルトの名無しさん
05/04/04 12:12:39
strrchr 使えば簡単にみえるな・・・

373:デフォルトの名無しさん
05/04/04 16:49:40
すみません最近C++触ったばかしですみませんが

class auのコントラクタ関数
au(string s) : enr(s) {}について
文字列をsに代入し enrを生成する時にsを代入すると読めるのですが
なぜ au(string s) { enr(s); }とできないんですか?

個人的に関数内容 { }内 は動作命令のみの記述と解釈すれば
au(string s) { enr = s; }
はenr = s;という動作命令であるから適応であるが
{ enr(s); }・・・であるから不適と思ってしまうのですが・・

書いててよくわからなくなってきた・・
au (string s) : enr(s) {}について
なぜ : で区切るのかと enr(s)はなぜ{}内に記述してはいけないのかについて詳しくお願いします

374:デフォルトの名無しさん
05/04/04 17:09:15
>>373
:の後は初期化。{}の中だとメンバ変数への代入になってしまう。

例えば、
class foo {
const int bar;
foo() : bar(0) {}
};
とした場合、この例のように初期化はできるが、
class foo {
const int bar;
foo() {bar = 0;}
};
このような代入はできない。

375:デフォルトの名無しさん
05/04/04 17:33:16
>>374
全て解決できました。
どうもありがとです

376:デフォルトの名無しさん
05/04/19 19:50:11
共用体ってどういうときに使うんですか?
また利点とかあるんですか?

377:デフォルトの名無しさん
05/04/20 00:05:37
すみません。教えてください。
下記のようなプログラムを書くと、結果に必ず0.0が混ざってしまい、困っています。
乱数を3つ表示させたいのですが、0.0を含まないようにするにはどうしたらよいのでしょうか?

#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define N 3
int main(void)
{ int i,j=0,check;
double data[N],dia[N],tmp;
srand((unsigned)time(NULL));
printf("\n乱数のつもり:\n");
for (i=1; i<=N; i++)
{data[i]=rand()%100+(double)rand()/32768.0;}
/* 並替えの計算 */
for (i = 1; i < N - 1; i++)
for (j = i + 1; j < N; j++)
if (data[j] < data[i]) /* <: 昇順, >: 降順 */
{ tmp = data[i];
data[i] = data[j];
data[j] = tmp;};
for (i = 0; i < N; i++)
printf("%.1f ", data[i]); /*並替えデータの表示*/
}

378:デフォルトの名無しさん
05/04/20 00:47:24
>>376

それくらい調べろよ。

379:デフォルトの名無しさん
05/04/20 01:25:42
>>376
メモリの節約
同じメモリブロックを複数の型として解釈したい時

380:デフォルトの名無しさん
05/04/20 11:52:18
>>377
取り敢えず落ち着け。
深呼吸でもした後、data[] の添え字の範囲が
0~N-1 だと言うことを思い出せ。

381:デフォルトの名無しさん
05/04/20 13:25:48
>>376
通信などで、整数型や実数型をバイト列と相互変換したい場合、
ポートアクセスなどでビットフィールドとバイト列を相互変換したい場合などに使う。
メリットは、他の方法に較べて簡便に書けること。
デメリットとしてよく言われる非互換性については、元々汎用的でないコードを書く場合には無視できる。
#勿論、それ相応のコメントは必要。

382:デフォルトの名無しさん
05/04/23 00:09:57
C、C++ある程度覚えるまで、どのくらい掛かった?今から、勉強しようと思うのですが、C→C++→C#か、Javaって感じに逝こうかと思うのですが、C++から移行した人、する人は、C#か、Javaどっち盗ります?←煮たスレあるけどノリで…ゴメソ

383:デフォルトの名無しさん
05/04/23 00:19:39
>>382
無意味なアンケートするな。

384:デフォルトの名無しさん
05/04/23 10:31:57
無意味っていいよね。
まぁ答えてやんなよ。発想の無い、IT土方プログラマーの行く末までを……ハァー 


385:デフォルトの名無しさん
05/04/23 12:04:48
なんでこう勉強する前にウダウダ人に聞くやつが多いんだろう

386:デフォルトの名無しさん
05/04/23 12:20:20
>何でこう勉強する前にウダウダ人にきく奴が、多いのだろう 
って、自分も聞いてるじゃんWWW プギャー、と云ってみたくなる。まあ、オイラは聞かなかった、お陰でプログラマーなんかになってしまった訳だが…ハァー

387:デフォルトの名無しさん
05/04/23 12:23:43
ageんなやボケがあああああ、と自分に云ってみるテst
すまんです

388:デフォルトの名無しさん
05/04/26 11:13:11
  ∧_∧
 ( ´∀`) < ぬるぽ

389:デフォルトの名無しさん
05/04/27 10:54:11
1+2+3+・・・+N を計算する関数を作成せよ。

390:デフォルトの名無しさん
05/04/27 11:48:18
>>389
int f(int N){return((1+N)*N/2);}

391:デフォルトの名無しさん
05/04/27 11:57:21
1/2/3/・・・/N を計算する関数を作成せよ。

392:デフォルトの名無しさん
05/04/27 12:05:48
>>391
int f(int N){return0;}

393:デフォルトの名無しさん
05/04/27 12:45:24
>>390
感動した
>>392
ワロタ

394:デフォルトの名無しさん
05/04/28 04:36:53
>>391
double f(int N){double x=1.0;if(N>1)while(N)x*=(double)N--;return 1.0/x;}

395:394
05/04/28 04:42:40
あんま変わらんけど、こっちの方が良かったかな…?
double f(int N){double x;for(x=1.0;N>1;N--)x*=(double)N;return 1.0/x;}

396:デフォルトの名無しさん
05/05/04 18:36:51
スレリンク(news4vip板:18番)
↑exitするならfcloseもfreeもしなくていいんだけど
  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ってあるんですが、そうなんですか?
ファイルディスクリプタはプログラム終了時に閉じられるとしても
メモリリークっすよねコレ

397:デフォルトの名無しさん
05/05/04 19:00:23
>>28
ガッ

398:デフォルトの名無しさん
05/05/04 19:58:54
>>396
大丈夫。真っ当なOSならアプリケーション終了時にきちんと開放する。

399:デフォルトの名無しさん
05/05/04 20:06:09
>真っ当なOSなら


400:デフォルトの名無しさん
05/05/04 22:08:18
OSが真っ当かどうかに関わらず真っ当な規格合致処理系なら、
exit()を呼んでいなくてもmain()からreturnすればファイルは閉じられる。
main()でのreturnはexit()の呼び出しと等価とも書かれている。(他の関数からmain()を呼んだ場合は別だが)

しかしfree()の方にはそのような記述は見当たらない。
(free()を呼ばないで終了するとどうなるかということは書いていない)

401:デフォルトの名無しさん
05/05/04 22:14:15
>>400
>(free()を呼ばないで終了するとどうなるかということは書いていない)

free() を読んで終了すればどうなるかということも書いていないけどな。


402:デフォルトの名無しさん
05/05/04 22:23:14
またこの話題か
好きにすれ

403:デフォルトの名無しさん
05/05/04 22:31:48
gotoを使うのは不味いのでしょうか?
どなたかおすえてください

404:デフォルトの名無しさん
05/05/04 22:57:09
Cで質問です。
変数nの値が??のとき、filename??という名前のファイルを開きたい
という場合に、fopenの第1引数にはどのように記述すればよいでしょうか?
先にsprintfを使えばできるようですが
直接引数の部分に記述して何とかする方法がないかと思いまして。

405:デフォルトの名無しさん
05/05/04 23:19:00
>>404
char *filename(int n) { static char buf[100]; sprintf(buf, "filename%d", n); return buf; }

fopen(filename(n), ... )



406:デフォルトの名無しさん
05/05/04 23:26:43
>>405
なるほど!その手がありましたか!
おめでとうございます!ありがとうございます!


(ノ´Д`)ノ 彡┻┻

407:デフォルトの名無しさん
05/05/05 19:22:25
次にこんなことをしてハマると見た。
rename( filename(1), filename(2) ); // filename.1 を filename.2 にバックアップ

408:デフォルトの名無しさん
05/05/05 23:19:39
>fopenの第1引数
そもそもパスとか編集しなくていいのか?

素直に
>先にsprintfを使え

409:デフォルトの名無しさん
05/05/05 23:28:04
そこでC++ですよ。
std::string filename(int n) {return "filename" + boost::lexcal_cast<std::string>(n);}

410:デフォルトの名無しさん
05/05/09 09:50:14
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?

411:デフォルトの名無しさん
05/05/09 09:51:19
URLリンク(p6222ed.kyotac00.ap.so-net.ne.jp)

うはっwwwwwwwwwwwwwww

っうぇwwwwww
っうぇうぇwww
wおkwwwwうはっwww
おkwww

っwwwwww

うぇwww


412:デフォルトの名無しさん
05/05/09 10:07:08
URLリンク(EAOcf-526p83.ppp15.odn.ne.jp)
おkwwwwwwwwwwwwおkうぇおkwwwwww
うはっwwwwwwwwwwwwwwwwwwwwwwwwwwwww
うはっうはっwwwwwwwwwwwwwww
wwwwwwwwwwwwっっうぇうぇ
うはっ

413:デフォルトの名無しさん
05/05/09 10:14:46
URLリンク(pdf791d.tokynt01.ap.so-net.ne.jp)

wwwおkwwwwwwうぇwwwwwwwwwっうぇ

おkwwwっうぇうはっwwwwうぇwww

wっうぇうはっwwwwwwwwwwwwwwwwww

414:デフォルトの名無しさん
05/05/10 16:35:01
>>410
ビットシフトしたいときに役に立つ

415:デフォルトの名無しさん
05/05/10 18:01:05
あと、2進数の桁をずらしたいときにも役に立つね。

416:デフォルトの名無しさん
05/05/10 18:29:55
>>410
任意の上位Nビットを取り出したいとかその逆をしたいときとかに。
DWORD dw = 0x12345678;
WORD wHigh = dw >> 16; // 0x1234
WORD wLow = dw & 0xffff // 0x5678
DWORD dw2 = dw << 16 | wLow // 0x12345678


417:デフォルトの名無しさん
05/05/11 18:16:54
<質問>
ピクチャポックに表示した画像をマウスドラッグで範囲選択します。
その選択範囲をマウスのドラッグ中、リアルタイムに枠線で囲みたいのですが
どういう処理が一般的でしょうか?

DrawLineで線を書いたり消したりとかは、おかしいですよね?

418:デフォルトの名無しさん
05/05/11 18:53:11
>>417
>>1-10 を見ろ。
回答が欲しければ Windows 系のスレに行くんだな。

419:デフォルトの名無しさん
05/05/11 20:15:27
XOR

420:417
05/05/11 23:15:27
すまそん。
他で聞いてきます・・・。(・・`)

421:417
05/05/12 00:23:25
>419
もしかして、私へのヒント?
そうだったら、ありがとうございます。

ビット反転させたらいいのかなー。
とりあえず、C#の過去ログ見てます。


422:デフォルトの名無しさん
05/05/12 10:11:02
int main(void)
{
double i;

for(i=1.0; (int)i<=9; i=i+0.1) {
printf("%d", (int)i);
printf("%lf ", i);
}

return 0;
}
iが5.000000のとき(int)iがなぜ4になるのか分かりません。
小数部を切り捨てて5になると思うのですが。

423:デフォルトの名無しさん
05/05/12 11:35:49
>>422
誤差の累積。誤差について調べられたし。

424:デフォルトの名無しさん
05/05/13 16:14:34
>>417
まさしくそれ向けの関数がMFCにあった気がする。

425:デフォルトの名無しさん
05/05/13 16:21:49
MFCつーか、、、APIであるけど
今はもうXORの時代じゃないのかもなあ

426:デフォルトの名無しさん
05/05/13 16:26:18
いちおー書いておくか
APIなら
DrawForcusRect
MFCだと
CDC::DrawForcusRect

それよりも、CRectTracker クラス使ったほうがいいかも

427:426
05/05/13 16:39:17
ってここC#のスレだった・・・
スレタイで半角#使ったのか・・・

428:デフォルトの名無しさん
05/05/14 07:08:29
>>427
気にするな
ごみスレだ

429:デフォルトの名無しさん
05/06/28 09:16:29
LSI C-86でコンパイルしてるんですが
unknown dimensionっていうエラーは
どんな間違いをしてる可能性があるんですか?

430:デフォルトの名無しさん
05/06/28 09:45:41
>>429
>どんな間違いをしてる
コンパイラの選択。

まぁ、恐らくは二重以上の配列で、要素数の指定が漏れているんだろうけど。
int func(int a[][]);
とかね。

431:デフォルトの名無しさん
05/06/28 10:21:35
二次元と表現せずに二重と表現するのが
Cらしいなw

432:デフォルトの名無しさん
05/07/05 16:40:43
クラス継承で教えて
class AandB : public A , public B
{

}
というのを作ろうとしたら
Aのメンバー関数で
A::data()

Bのメンバー変数で
char * B;;data
と名前が衝突していた.

B::dataのみにアクセスするにはどうすればいいの?

433:デフォルトの名無しさん
05/07/05 17:26:48
>>432
B::dataでダメなら、using

434:デフォルトの名無しさん
05/07/05 21:16:22
うまくいった
class AandB : public A , public B
{
AandB(){
this -> B::data
}
}
でアクセスできた

もうひとつ疑問が
class AandB : public A , public B
{
class B *pB;
AandB(): pB(&B)
{
}
}
pBにポインターの値を代入したいんだけどできない

435:デフォルトの名無しさん
05/07/05 22:17:22
>>434
class AandB : public A , public B
{
  class B *pB;
  AandB(): pB(static_cast<B *>(this))
  {
  }
};
キャストは要らないが一応書いておいた。

436:デフォルトの名無しさん
05/07/10 11:50:07
namespace your {
  struct girlfriend {
    void lips();
  };
}

namespace my {
  struct girlfriend {
    static void lips();
  };
  class wife : your::girlfriend {
  public:
    void kiss() { girlfriend::lips(); }
  };
}

さて、wife::kiss() するとgirlfriend::lips()によって
奪われるのは基底クラスの your::girlfriend::lips() か、
はたまた同じnamespaceにある my::girlfriend::lips() なのか?

VC7, gcc3.1 では基底クラス your:girlfriend::lips() で、
BCC564では 名前空間を優先して my::girlfriend::lips() でした。

どっちがせーかいでしょう? 
雰囲気からして基底クラスを採るのがスジっぽいけど。 


437:デフォルトの名無しさん
05/07/10 14:17:24
みなさん、コンパイラなどする時はコマンドプロントからやっていますか?
それとも編集もまとめて出来るフリーツールなど使ってらっしゃいますか?

まだプログラミング始めたばかりなんですが、コマンドプロントの方法もやはり覚えといた方がいいんですかね?

438:デフォルトの名無しさん
05/07/10 14:31:47
プログラムを学習する目的が限定されていて、コマンドプロンプトを使わなくて済むなら、
覚える必要はない。
授業でどうしてもやらなきゃいけないとか。

プログラミング全般に詳しくなりたいなら、覚えておいた方がいい。


439:デフォルトの名無しさん
05/07/10 19:03:07
学習目的でプログラムを組む際、教科書によってはコマンドプロンプトを前提としているものがある。
だから、教科書しだいかな。
個人的には、ツールを組み合わせることが楽なので、覚えるといいとおもう。

440:デフォルトの名無しさん
05/07/10 20:20:05
簡単な、初級プログラムというのはどうしても、コマンドラインを使った処理、
入出力になるからな。憶えるべきというか、憶えないと学習効率が悪いと思うぞ。
世の中に出ている初級者用のC言語情報なんて、ほとんどがコマンドラインを
前提としているからな。

441:デフォルトの名無しさん
05/07/10 22:20:27
やはりそうですか
分かりました、ありがとうございました。

442:デフォルトの名無しさん
05/07/11 23:02:56
IDEかmakeかって話だろ。
そんなの当面どうだっていいだろ。

443:デフォルトの名無しさん
05/07/16 19:15:31
質問
int a = 1;
if ( a == (int)0) {
...
}
のように、キャストした方がいいの?

444:デフォルトの名無しさん
05/07/16 21:53:36
いらない

445:デフォルトの名無しさん
05/07/16 22:06:14
>>443
ただの整数は元からint型。

446:デフォルトの名無しさん
05/07/20 17:02:19
この速度ならぬるぽ

447:デフォルトの名無しさん
05/08/09 01:41:05
Cを使った開発で質問させて頂きたいのですが

ありがちなDBを使った業務システムを開発するときに
MFCと.netフレームワークを比べると
どちらの開発効率が上でしょうか。

漠然とした質問ですが
主観等々で構いませんので、ご意見いただけますでしょうか。

448:デフォルトの名無しさん
05/08/09 01:59:47
MFCも.netもCじゃなくC++だが。

449:デフォルトの名無しさん
05/08/09 02:00:46
ありがちなDBを使った業務システムは開発効率より優先する
ものがあるんでねぇ?
oo4o+vbに1票

450:デフォルトの名無しさん
05/08/09 09:50:43
スレ違いだったらすみません。
自分用にデバグしやすいmalloc/realloc/freeを実装してみようと
思っていますが何を参考にすればいいかわかりません。
シンプルで小さい実装のソースがあったらURLを教えて下さい。


451:デフォルトの名無しさん
05/08/09 11:50:46
void *my_malloc(size_t size) {
  void *p = malloc(size);
  ...hoge
  ...fuga
  return p;
}
みたいのじゃだめなのか。
メモリアロケーションを実装するのは大変だと思うが。

452:デフォルトの名無しさん
05/08/09 13:21:22
#define malloc my_malloc

453:デフォルトの名無しさん
05/08/09 14:20:45
すみません、質問が悪かったですね。
端的に、mmap を実装してみたいんです。
ある組込の環境で、malloc がかなり遅い
環境があるんですが、自分で実装してみたら
それを速くできるのか、それとも自分だともっと
遅くなってしまうのか、興味があったのです。



454:デフォルトの名無しさん
05/08/09 16:08:50
mmapの実装って環境依存じゃないだろうか。ソースならunix系オープンソースosのを
見ればいいだろうけど、参考にはならないような。それはそのままハードorOSの性能
くさいし。欲しいのは多分メモリプールだろうからやるとしてもmallocをラップして
プールするのがいいんじゃないかと。
おもろい文章
URLリンク(www-6.ibm.com)

455:デフォルトの名無しさん
05/08/09 19:51:06
>>453
URLリンク(www.uclibc.org)
あたりの実装は参考になるんじゃないかな。 MMUあり、無しの両方に対応する実装がある。


456:デフォルトの名無しさん
05/08/15 12:17:32
あるファイルが存在するかどうかを確認するにはどうしたらよいのでしょうか?
出来るだけ環境に依存しない方法がよいのですが

457:デフォルトの名無しさん
05/08/15 13:06:53
>>456
環境依存しないと言うことなら、存在する≒読めるということで
fopen(targetFile, "r")が成功するかどうかで判断するのが無難。

まぁ、大抵の環境でaccess()かstat()はあると思うがな。
#某環境では、access()がfopen()で実装されているのは内緒。

458:デフォルトの名無しさん
05/08/18 12:41:09
K&Rにmalloc/freeの実装が乗ってる。


459:デフォルトの名無しさん
05/08/19 23:34:15
C言語一通り学んだらDirextXとWINAPIどっちやればいい?

460:デフォルトの名無しさん
05/08/20 00:28:38
>>459
C++
特にDirectXをやるのなら絶対。WinAPIをやるのでもなるべく。
そもそもDirectXはライブラリなどで隠されていない限りある程度WinAPIで下準備が要るから、
結局WinAPIの知識が要る。

461:デフォルトの名無しさん
05/08/31 11:32:56
a, bが変数だとして(…の中で変更される可能性あり)、

(1)
if (a == b) {
 while(a == b) {
  …
 }
 // ★
}


(2)
if (a == b) {
 do {
  …
 } while (a == b) ;
 // ★
}

は同じ意味ですか?

今(1)のコードで★部分にコードを追加したいので、
(2)に変えても問題ないか知りたいです。


462:デフォルトの名無しさん
05/08/31 11:34:53
while(a == b) {
 …
}
if (a == b) {
 // ★
}
のほうがまだ読みやすくない・・・?

463:デフォルトの名無しさん
05/08/31 11:39:19
>>461
同じだと思う。

>>462
それは意味が変わってる。

464:デフォルトの名無しさん
05/08/31 12:01:38
>>461
積極的に(2)に変えたい理由は?
別に(1)のままでもいいと思うのだけど。

465:デフォルトの名無しさん
05/08/31 14:03:12
最初に一回無駄な比較が増える

466:デフォルトの名無しさん
05/08/31 14:12:57
>>462
>461 (…の中で変更される可能性あり)

467: ◆cFJoQcQH2U
05/08/31 14:16:11
「神戸 330 ふ 1234 この車はどうのこうの(箇条書き)」
sscanfで、上のような文字列を読み取るのに、
"%s %d %s %d %s"を使っているのですが、最後の備考欄に
空白文字が入っているとすべてが読み取れません。
「残りすべての文字列」というマークはありますか?
WinXp,VS.netです。

468:デフォルトの名無しさん
05/08/31 15:15:43
>「残りすべての文字列」というマークはありますか?
そんなものは無い。
fgetsで行末まで読んで、読んだ文字列を変換するのが良い

469: ◆cFJoQcQH2U
05/08/31 15:25:43
そうですか・・・ありがとうございます。
fgetsで読んで、4つ目の改行文字以降を読み取ることにします。

470:デフォルトの名無しさん
05/08/31 15:28:51
"%s %d %s %d %[\x01-\xff]"

471:デフォルトの名無しさん
05/08/31 21:45:00
条件演算子の? : は右結合ということですが、
a() { printf("a\n"); return 0; }
b() { printf("b\n"); return 0; }
c() { printf("c\n"); return 0; }
d() { printf("d\n"); return 0; }
e() { printf("e\n"); return 0; }
f() { printf("f\n"); return 0; }
g() { printf("g\n"); return 0; }

main() {
a() ? b() ? c() : d() : e() ? f() : g();
}

とした場合、結果が
a
e
g
となりました。

? : の右結合とは、どの部分に掛かってるんでしょうか?


472:デフォルトの名無しさん
05/08/31 21:46:37
↑結果を見ると左結合に見える、ということです。

473:デフォルトの名無しさん
05/08/31 21:52:57
>461

なぜ(2)の形にしたいのかがわからない。
必ず一回余分な判定が入るのが嫌程度なら(1)の書き方をお勧めする。
上から下への流れで読みやすい。

(2)だとループ条件がループの終わりにならないと分からないので
一部の人間からは嫌われてたりする。

自分は(1)はだね。

474:デフォルトの名無しさん
05/08/31 21:55:04
参考に
void loopfunc(void)
{
clock_t s[2], e[2], t[2];
int i, j;int a, b;
 s[0] = clock();
 for(j=0;j<100000000;j++){
  a = 4568992;
  b = -5621984;
  if(a==b){
   while(a==b){
    a %= b;
    a *= b;
   }
  b %= a;
 }
 e[0] = clock(); t[0] = e[0] - s[0];
 s[1] = clock();
 for(j=0;j<100000000;j++){
  a = 4568992;b = -5621984;
  if(a==b){
   do{
    a %= b;
    a *= b;
   }while(a==b);
  b %= a;
 }
 e[1] = clock(); t[1] = e[1] - s[1];
printf("t[0] = %d\nt[1] = %d\n", t[0], t[1]);
}

475:デフォルトの名無しさん
05/08/31 22:08:54
>>474
if(a==b)の括弧が閉じてないので修正しましたが、
うちの環境では

t[0] = 2593
t[1] = 2384

(2)が速いみたいですね。


476:デフォルトの名無しさん
05/08/31 22:10:32
>>471

C言語の有名なバグです。
条件演算子の仕様的にも左結合で合ってます。

477:デフォルトの名無しさん
05/08/31 22:16:06
>>476
違うよー
1?2?3:4:5
と書けるのは右結合だから。(結果は3)

>>471
結合規則と評価順序は関係ないよ。

478:デフォルトの名無しさん
05/08/31 22:18:25
つまり右結合の掛かる場所は、括弧で括ると
1?(2?3:4):5
こういうことね。

479:デフォルトの名無しさん
05/08/31 22:21:11
>>478
し、知らなかった・・
これでもC言語暦10年なんだが。

480:デフォルトの名無しさん
05/08/31 23:21:11
main(argc, argv)
int argc;
char *argv[];
{

↑↓

main ( int argc, char *argv )
{

どうちがうの??

481:デフォルトの名無しさん
05/08/31 23:35:22
上 K&R
下 ANSI

上は古い書き方で、普通は下の書き方を使う。
意味上の差はない。

482:デフォルトの名無しさん
05/08/31 23:37:48
と思ったが、よく見ると下のargvがchar*になってやがる。

それ以外は同じ。
あと、戻り値の型もちゃんと明示したほうが良い

483:デフォルトの名無しさん
05/08/31 23:51:47
cdeclなら別にどうでもいいよ

484:デフォルトの名無しさん
05/09/01 00:00:31
int func(float a)
{
return sizeof(a);
}

int func(a)
float a;
{
return sizeof(a);
}
では違う結果を返すコンパイラもある。

485:480
05/09/01 00:37:29
ありがとうございます。

したのargvに[]が無いのは転記漏れでした。申し訳ない。



486:デフォルトの名無しさん
05/09/01 00:38:47
なんで?
ビット長が違う環境とか?

487:デフォルトの名無しさん
05/09/01 00:44:35
>484の後者はfloat aと書いてもdouble aと解釈されるのか。
流石にそこまで古いCは知らないなぁ。

488:デフォルトの名無しさん
05/10/02 20:41:06
以下の問題を配列を必ず使ってプログラミングしてください。

[課題2] 正整数を入力し、それをローマ数字で表示するプログラムを配列を使って作りなさい。
1000がM, 100がC, 10がX, 1がIであるので、たとえば、123と入力するとCXXIII、1365はMCCCXXXXXXIIIIIと出力できればよい。
<入力例>
Input: 3247

<出力結果>
MMMCCXXXXIIIIIII

お願いします。

489:デフォルトの名無しさん
05/10/02 20:56:21
初めて投稿します。
STLのiostreamヘッダを汎用テキストマッピングとして利用したいのです。
stringはtypedefで、std::basic_string<TCHAR>~としたのですがが、
iostreamはどうすればいいんでしょ?

なお、MS-Visual C++ ver 6.0で実験しています。

<ソース>
#include <tchar.h>
#include <iostream>

int _tmain(void){

// この coutとwcoutを一つにまとめたい。
std::cout << _T("Hello C++ World!\n") << std::endl;

return 0;
}

識者の皆様、ご教授お願いしたいです。

490:デフォルトの名無しさん
05/10/02 21:00:07
関数化してください。

URLリンク(briefcase.yahoo.co.jp)
問題はいってます

491:デフォルトの名無しさん
05/10/02 21:43:22
>>489
coutとかは型ではないからtypedefできない。
だからこうするしかないと思う。cinやcerr、clogも同じ。
#ifdef UNICODE
#define tcout std::wcout
#else
#define tcout std::cout
#endif

492:デフォルトの名無しさん
05/10/02 22:22:03
>>491
ご返答ありがとうございます。

なるほど、
cin, cout, cerr, clogはIOストリームオブジェクトなので、
defineで置き換えるしかないですか・・・

ご指摘を参考にしてみます。

493:デフォルトの名無しさん
05/10/02 22:57:40
>>488(前半)

#include "ctype.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"

// 文字
static char code[4][2]={"I","X","C","M"};

int main(void){
int i, j, max, len, dec[4];
char inpbuf[5];// 4桁 + NULL
char outbuf[37];// 9文字 x 4桁 + NULL

// 初期化
memset(outbuf, 0, sizeof(outbuf));
memset(inpbuf, 0, sizeof(outbuf));

// 入力
printf("input:");
scanf("%5s", inpbuf);



494:デフォルトの名無しさん
05/10/02 22:59:11
>>488(中)
// 入力チェック
len=strlen(inpbuf);
for (i=0; i<len; i++){
if (!isdigit(inpbuf[i])){
printf("数値を入力してください\n");
return -1;
}
}
i=atoi(inpbuf);
if (i>9999 || i<0){
printf("数値は0-9999までの範囲で入力してください。\n");
return -1;
}
_itoa(i, inpbuf, 10);
len=strlen(inpbuf);

// バッファを数値に変換して
max=len-1;
for (i=max; i >= 0; i--){
dec[i]=inpbuf[i]-48;
if (dec[i]!=0)
max=len-i-1;
}



495:デフォルトの名無しさん
05/10/02 23:00:56
>>488(後半)
// 文字列作成
for (i=0; i <= max; i++){
for (j=0; j < dec[i]; j++)
strcat(outbuf, &code[max-i][0]);

}

// 出力
printf("%s\n", outbuf);

return 0;
}

くどいので、部分部分は修正してね

496:デフォルトの名無しさん
05/11/01 00:27:12
質問させてもらいます。
SDL_ttfでの表示の際にUnicode文字列が必要なのですが、
S-JISからUnicodeへの変換にはやっぱりICU使うしか無い
でしょうか?



497:デフォルトの名無しさん
05/11/01 00:27:50
質問なのでageさせて貰います。

498:デフォルトの名無しさん
05/11/01 00:55:13
いいえ

499:デフォルトの名無しさん
05/11/01 03:39:10
ぽいんた~がわかりまっせ~ん

おしえてくださ~い

500:ハーピィ
05/11/01 05:56:56
E・∇・ヨノシ <500ゲット♫

501:496
05/11/01 10:13:50
変換するのは大げさなのでデータにUTF-8で埋め込むことにしますた。

502:デフォルトの名無しさん
05/11/01 18:29:34
>>496
ちなみにマルチバイト文字(char型)にShift-JISが使われていれば、mbstowcsという標準関数が使えなくもない。

503:デフォルトの名無しさん
06/01/06 16:32:17
文字コードについてなのですが・・

a b c d eなどはASCIIコードって事はわかってるのですが
"あ"とか"い"とかは何コードなのでしょうか

strcpy(str,"あ");

printf("0x%X\n",str[0]);
printf("0x%X\n",str[1]);

とか調べてみたのですが全然判らなくて・・

504:デフォルトの名無しさん
06/01/06 16:48:32
> a b c d eなどはASCIIコードって事はわかってるのですが

ここで既に終わっている

505:デフォルトの名無しさん
06/01/06 16:52:52
ぇー数値ASCIIの数値を当てはめて出力しても期待される文字が出力されましたが

506:デフォルトの名無しさん
06/01/06 16:55:18
>>503
Windows系ならShift-JISでUnix系ならEUC-JP。ほかは知らん。
Cとしては文字コードは一定の基準さえ満たせば何でも良いということになっているから、
特定の文字コードに頼り切ったコードは書くな。

507:デフォルトの名無しさん
06/01/06 16:57:36
>>502
すみませんorz
ありがとうございました

508:デフォルトの名無しさん
06/01/08 18:59:22
演算についてなんですけど
C言語において被除数=0の時の計算っていうのはまずいですよね?

例えば
0/3
0%7
などです。

うちの処理系では例外処理が加えられて0を返すようになってるみたいなんですけど
どうでしょうか

509:デフォルトの名無しさん
06/01/08 19:44:30
んなこたーない。
もし、本当に例外処理が行なわれているとしたら、その処理系は糞未満だ。

510:デフォルトの名無しさん
06/01/08 19:58:49
>>508
0以外を返すのは数学的にもアーキテクチャから見てもおかしい。

511:デフォルトの名無しさん
06/01/08 20:00:12
0 で割る方じゃなくて、0 が割られる方なのな。

>C言語において被除数=0の時の計算っていうのはまずいですよね?
なんでまずいって思ったの?いずれも答え 0 で数学的にも正しい結果でしょ?
どっちかに負数が入る場合は C89 では処理系定義の部分は入るけど、それでも結果自体は
規定されるから例外処理なんてない。
(C99 では 0 方向に丸めるよう規定されてる)

「5.4 整数除算」を参照の事
URLリンク(seclan.dll.jp)

512:デフォルトの名無しさん
06/01/08 20:55:50
>>509-511
すいません少しこんがらがってました
0が除数である場合の計算でしたorz


513:デフォルトの名無しさん
06/01/09 21:38:36
>512
手元に C99 の規格書しかないけど、
> 9899:1999 6.5.5/5
>The result of the / operator is the quotient from the division of the first operand by the
>second; the result of the % operator is the remainder. In both operations, if the value of
>the second operand is zero, the behavior is undefined.
ということで未定義動作だから何が起こっても規格準拠だね。

514:デフォルトの名無しさん
06/01/13 09:35:53
こんにちは。質問です。お願いします。
C言語のif文で、条件式の中でfloat型の変数は使えますか?
こういう処理なんですが・・・
float fA,fB;
:
:
if(fA != fB)
{
:
}
例えば、for文の条件式とかで浮動少数型の変数を用いるのが
明らかに変なのは分かります。では、if文は、どうなのですか?

515:デフォルトの名無しさん
06/01/13 09:56:57
>>514
できるけど、やっぱり紙の上での計算と違って誤差が出るから

static float tol = 0.0001f;
float a,b;

if((a-b) < tol) {
/***/
}

とやるべきだろうね。

516:デフォルトの名無しさん
06/01/13 11:05:56
>>515
if ( abs(a-b) < tol ) {
/***/
}
なのでは?tolの値は妥当などうかも疑義がありますが

517:デフォルトの名無しさん
06/01/13 11:24:44
for(double d = 0.0; d < 100.0; d += 0.5)

誤差だけ気にしなければ別に変じゃないな

518:デフォルトの名無しさん
06/01/13 11:40:29
変だよ

519:デフォルトの名無しさん
06/01/13 15:27:00
sin(x)のマクローリン展開から√2の近似を計算するプログラムを作成したいんですが、どなたかご指導ご鞭撻の程お願いします。
sin(π/4)を2倍するところまではわかるんですが、マクローリン展開がどうもよくわからないので

520:514
06/01/13 18:21:16
早速の回答を有り難う御座います。
因みに、VC++を使っているのですが、前述の問題に関して
Debugモード、或いはReleaseの最適化を外すと
何ら問題が出ないのです・・・
コンパイラのバグなのか、誤差の問題なのか
悩むところです。。

521:デフォルトの名無しさん
06/01/13 18:41:40
自分のソースが悪い、に一票

522:デフォルトの名無しさん
06/01/13 18:55:29
>>520
浮動小数点数は同じ値でありながらビットイメージが違う場合も存在するから、
>516 の方法で丸めた方がいいよ。
tol の値は #include <float.h> して FLT_EPSILON 使えばいい。

523:デフォルトの名無しさん
06/01/13 20:30:06
見事にC言語のスレになっててワロタw

524:デフォルトの名無しさん
06/01/15 11:10:14
質問です。
#include<stdio.h>
#include<string.h>

#define N 32

void sorting(char*,char*);

main(int argc,char *argv[]){
char read[N*N],Memory[N][N],CASL[N][N][N];
sorting(CASL,read);
}
void sorting(char *CASL,char *read){
int i=0,j=0,k=0,z=0,I,J;
while(1){
I=i*(N*N);J=j*N;
if(*(read+z) == '\0') break;
else if(*(read+z) == ' '){
*(CASL+I+J+k) = '\0';
j++;k=0;
}
else if(*(read+z) == '\n'){
*(CASL+I+J+k) = '\0';
i++;j=0;k=0;
}
else{
*(CASL+I+J+k) = *(read+z);
k++;
}z++;}}
上記のプログラムでコンパイルするとwarning: passing arg 1 of `sorting' from incompatible pointer type
のエラーメッセージがでてしまいます。関数間での受け渡しで発生しているエラーだと思うのですが、どこを直せばいいのでしょうか?教えてください。

525:デフォルトの名無しさん
06/01/15 11:50:26
>>524
マルチうぜえ

526:デフォルトの名無しさん
06/01/15 11:50:43
>>524
CASL の宣言か、sorting() の引数宣言 (プロトタイプ含む)

527:デフォルトの名無しさん
06/01/15 22:23:00
floatが整数かどうかの判定ってどうします?

if(x - (int)x == 0.0f)

で良いの?
キャストに頼るのが変な気がするんですが・・・。

528:デフォルトの名無しさん
06/01/15 23:01:34
> floatが整数かどうかの判定ってどうします?

移植可能な方法で、判定する方法はない。

529:デフォルトの名無しさん
06/01/15 23:09:40
>>528
こら。modfがあるだろ。
ちなみにfloat版はmodff。

530:デフォルトの名無しさん
06/01/15 23:36:58
>>529
modf(...) == 0 とするのか?
>>527 とたいして変わらんぞ、それ。

浮動小数点に対して == 演算子を使う奴は、大抵バカ
であることがまたもや実証されたな...。

531:デフォルトの名無しさん
06/01/17 02:46:27
>527だとintの範囲を超えたときに何が起こるかわからんからmodfの方がまし。
そもそも整数かどうかの判定が必要な値にfloatを使っていることがおかしい気がするが。

532:デフォルトの名無しさん
06/01/17 09:20:37
>>531
整数というか、小数の位が存在するかどうかで処理を変更したかったので。
modfで誤差を考慮しとけば良さそうですね。

533:デフォルトの名無しさん
06/01/17 17:17:00
>>523
スレタイだけで >>1 を読まない間抜けが多いって事です。

534:デフォルトの名無しさん
06/01/24 12:41:38
配列の初期化について質問です。

int test[4] = {10, 100, 50, 1};
などの様に初期化したいのですが、
宣言した後で、このように一気に初期化する方法は無いのでしょうか?

具体的には、配列をクラスのメンバに持っていて、
コンストラクタで初期化したいのですが、
test[0] = 10;
test[1] = 100;



などのように、一つずつ初期化していくしかないのでしょうか?

535:デフォルトの名無しさん
06/01/24 12:52:00
>>534
それしかありません。

536:534
06/01/24 14:38:34
コンストラクタでローカル変数
int l_test[4] = {10, 100, 50, 1};
を作って、それをメンバの配列にmemcpyすることで解決しました。

あまりキレイな解決策ではないですが、
実際は2次元配列で要素が多かったので、どうしても一気に初期化したかったのでした。

537:デフォルトの名無しさん
06/01/24 22:06:31
> コンストラクタでローカル変数
> int l_test[4] = {10, 100, 50, 1};
> を作って、

まあ、最近のマシンなら気にすることではないのだろうが、
static const をつけておいた方がちと早くなるかもし
れない。

538:デフォルトの名無しさん
06/01/25 06:19:38
何故vectorかなにかのコンテナを使わないのだろう。

539:デフォルトの名無しさん
06/01/25 07:40:22
>538
それはさすがにスレ違い。

540:デフォルトの名無しさん
06/01/25 17:51:24
このスレで「スレ違い」って言われてもな

541:デフォルトの名無しさん
06/01/27 16:02:03
スレタイに半角の#を入れようとしたのが問題

542:デフォルトの名無しさん
06/01/27 22:59:12
>>541
これってCすれじゃなかったのか!!!!

543:デフォルトの名無しさん
06/01/27 23:08:23
気付いてない子がいたのか・・・

544:デフォルトの名無しさん
06/02/02 23:17:53
for(;;);
for(;;)
といった文を見たんですがこういう文はどういう働きをするんでしょうか?

545:デフォルトの名無しさん
06/02/02 23:27:06
ループ・ザ・インフィニット! ・・・とかって言うとスタンドっぽくね?

546:デフォルトの名無しさん
06/02/02 23:41:02
>>544
forの括弧の中の3つのそれぞれの部分は省略できる。
2つのセミコロンの間の継続条件を省略すると無限ループになる。

547:デフォルトの名無しさん
06/02/03 16:06:33
>>546
すいません、ちょっと言葉足らずでした。

for(初期条件;終了条件;加算);
for(初期条件;終了条件;加算){
文;
}

こんな感じの文だったのですが、
最初のfor文の最後に ; が入った形をみたことがなかったので、
この2個のfor文がどのように動くのかを教えてほしいです。

548:デフォルトの名無しさん
06/02/03 16:16:08
rr

549:デフォルトの名無しさん
06/02/03 16:21:58
>>547
↓こう書いたら解る?
for(初期条件;終了条件;加算)
  ;

550:デフォルトの名無しさん
06/02/03 16:23:07
>>549
何もしないんですね。orz
理解できました。ありがとうございます。

551:デフォルトの名無しさん
06/02/03 21:35:03
#include <stdio.h>
int main(){
int *pa[500],*pb[500],*pc[500],*pd[500],*pe[500],*pf[500];
int i;
for(i-0;i<500;i++){
*pa[i]=5;
*pb[i]=5;
*pc[i]=5;
*pd[i]=5;
*pe[i]=5;
*pf[i]=5;
printf("%d,%d,%d,%d,%d,%d\n",*pa[i],*pb[i],*pc[i],*pd[i],*pe[i],*pf[i]);
}
return 0;
}
このプログラムってかなりやばいよな;

552:デフォルトの名無しさん
06/02/03 21:35:49
>>551
マルチうざい

553:デフォルトの名無しさん
06/02/04 16:45:57
構造体についての質問です。

#include<stdio.h>
struct string{
char *a;};
struct string data[]={
"a","b","c","d",};

int main(){
struct string *p;
char *s;
int i;
scanf("%s",&s);
p=data;
for(i=0;i<=3;i++){
if(s==(p+i)->a){
printf("%s\n",(p+i)->a);}}
return 0;
}
以上をコンパイルして実行した場合、scanfで入力した値がa~dのどれかでも
if(s==(p+i)->a)が真と判断されないのですが、間違いについての教唆をお願いします。

554:デフォルトの名無しさん
06/02/04 16:57:35
>>553
>間違いについての教唆をお願いします。

教え唆すのか?


555:デフォルトの名無しさん
06/02/04 17:13:29
そそのかされてどうする俺…
普通に間違いについて教えてほしいです

556:デフォルトの名無しさん
06/02/04 17:23:21
たとえば、scanf で "abc" という文字列を読み込んで、
それらの文字一つ一つ( 'a' とか 'b' とか 'c' とか '\0' とか・・・)は
メモリの何処に保管されるのさ?

今、値を記憶できる変数の領域は string 構造体のアドレスを保持する p と
char のアドレスを保持する s と
int の値を保持する i しかないぞ?


557:582
06/02/04 18:00:29
>>553
よーし、パパそそのかしちゃうぞ。

よくコンパイル通ったな。 構造体のメンバが char へのポインタ1つだけと判っていれば、
構造体配列 = { char*その1, char*その2, ・・・ , char*そのn }
なんて初期化が許されるのか ・・・ 知らなかった (マジ
ここは、
struct string data[]={
{"a"}, {"b"}, {"c"}, {"d"}
};
じゃなきゃ い神埼だと オモテタ。

でも、バグの本質は、>>556 の指摘のとおり。
scanf() で、ポインタ変数にコンソール入力しようとしているが、おまえには特定の
char の場所を示すポインタ ( アドレス ) が判るのか? メモリの中身に詳しいヤツ
だな。

558:デフォルトの名無しさん
06/02/04 18:23:12
本当に唆しているだけだなお前ら。

559:553
06/02/04 19:25:32
>>556-557
charで*でなく適当な長さの配列を宣言して
if()で照会するのは2つの配列[0]に格納した値…ってことですね。
どうみても俺の勉強不足です。本当にありがとうございました

560:デフォルトの名無しさん
06/02/13 03:43:09
関数を定義するときに
void xxx(int yyy)
int A;
char B;
{
~~~
}
こんなふうに書かれたものを良く見かけるのですが
このときAとBは何か特別なものなんですか?

561:デフォルトの名無しさん
06/02/13 08:39:53
>>560
void xxx(int yyy)
{
...;
}
ならば、古いスタイルで
void xxx(yyy)
int yyy;
{
...;
}
となるがそのことだろうか。
それならばプロトタイプ宣言のなかった時代の名残だ。

562:デフォルトの名無しさん
06/02/27 10:34:29
Borland C Compilerのエラーメッセージについて詳しく解説している
『bcc32_messages』というファイルがあるのですが(中には数百のHTMLが
入っていて、エラーと警告1つ1つに細かい説明が書かれている)、どなたか
これの英語版がどこにあるかご存じないでしょうか?

563:デフォルトの名無しさん
06/04/21 23:47:15
COMMAND getCommand(char *c)
{
       int i, j, k, l, len;
       char comtmp[128], fileNametmp[128], comExtmp[128];
       COMMAND command;

       len = strlen(c);
       for(i=0; i<len+1; i++){
             if(c[i] == '-'){
                     for(j=0; c[i]!='\0'; j++){
                            i++;
                            if(c[i] == '@'){
                                   comtmp[j] = '\0';
                                   for(k=0; c[i]!='\0'; k++){
                                          i++;
/*printf("\nc[%d] = %c\n", i, c[i]);*/
                                          if(c[i] == '>'){
/*printf("\n>>in\n");*/
                                                 for(l=0; c[i]!='\0'; l++){
                                                        i++;
                                                        comExtmp[l] = c[i];
printf("\nc[%d] = %c\n", i, c[i]);
                                                 }
                                          }

564:デフォルトの名無しさん
06/04/21 23:48:36
                                          if(c[i] == '\0'){
                                                 comExtmp[k] = '\0';
                                                 command.com = malloc(sizeof(char)*(strlen(comtmp)+1));
                                                 command.fileName = malloc(sizeof(char)*(strlen(fileNametmp)+1));
                                                 command.comEx = malloc(sizeof(char)*(strlen(comExtmp)+1));
                                                 strcpy(command.com, comtmp);
                                                 strcpy(command.fileName, fileNametmp);
                                                 strcpy(command.comEx, comExtmp);

                                                 return command;
                                          }
                                          fileNametmp[k] = c[i];
                                   }
                            }else if(c[i]!='\0'){
                                   comtmp[j] = c[i];
                            }
                     }
              }else if(c[i]=='\0'){
                     break;
              }



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch