C言語なら俺に聞け! Part 111
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/07/18(月) 12:38:31質問する前には最低限検索を。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
C言語なら俺に聞け! Part 110
http://pc8.2ch.net/test/read.cgi/tech/1120596481/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0002デフォルトの名無しさん
2005/07/18(月) 12:42:52おつ
0003デフォルトの名無しさん
2005/07/18(月) 14:19:44乙華麗
0004デフォルトの名無しさん
2005/07/18(月) 16:17:57解放されているのか確認する方法はありますか?
0005ヒットマン
2005/07/18(月) 16:22:30ちょくちょく、質問をするのでよろしくおねがいします。
0006デフォルトの名無しさん
2005/07/18(月) 16:33:14標準Cの範囲内では無理。
0007デフォルトの名無しさん
2005/07/18(月) 17:07:040008デフォルトの名無しさん
2005/07/18(月) 17:59:38初心者スレへどうぞ。
http://pc8.2ch.net/test/read.cgi/tech/1118072681/
0009デフォルトの名無しさん
2005/07/18(月) 18:15:21ワロス
0010デフォルトの名無しさん
2005/07/18(月) 18:31:07どうぞ。
0011デフォルトの名無しさん
2005/07/18(月) 18:57:160012デフォルトの名無しさん
2005/07/18(月) 18:57:39f(x) を考えます。
f(x) は、0<=x<1/2 では2*xを返し、 1/2<=x<=1では(-2x+2)を返します。
x_n+1 = f(x_n) とし、n=0から次々と計算をさせていくプログラムをC言語で作りました。
初期値x_0 を 0<=x_0<=1 の範囲から手入力させて、適当な回数分、計算結果を出力
させています。今は100回ほど計算を行っています。
(範囲内で)どんな初期値を与えても、ある回数計算をするとxが必ず0になるのですが、
これはどうしてなのでしょうか?初期値を0.1や0.2など比較的綺麗な数値にすると、f(x)
の計算ごとに0.4と0.8の表示を繰り返します。計算回数を重ねると
0.799999、0.400002、0.800003・・・と値が崩れていき、最終的には、0.406250、0.812500、
0.375000、0.750000、0.500000、1.000000、0.000000、0.000000、...
と0に落ちてしまいます。初期値に関わらず、です。
どうしてなのでしょうか?お願いします。
001312
2005/07/18(月) 19:00:09初期値を0.1や0.2などにとると、0.4 0.8 の繰り返しをするようになり、最終的に0に落ちます。
初期値を0.23423など綺麗でないものにすると、0.4 0.8 0.4 ...のような周期的な解は出てきませんが、
最終的には(いきなり)0に落ちるのです。
お願いします。
0014デフォルトの名無しさん
2005/07/18(月) 19:04:19きれいな二進数の値に書きなおせるかどうかが問題だと思うよ。
0015デフォルトの名無しさん
2005/07/18(月) 19:21:15例えば0.1は2進数では
0.0001100110011…
と循環小数になるから、正確に表すことが出来ない。
んで計算を繰り返すと誤差が積もり積もって変な値になっちゃうと
001611=12
2005/07/18(月) 19:21:55レスありがとうございます。
計算機誤差ということですね。しかし、なぜ0に落ちてしまうのでしょうか?
今、ふと思いついたことを書きます。
f(x) = 0 となるには、 x = 0, 1
f(x) = 1 となるには、 x= 1/2
f(x) = 1/2 となるには、 x = 1/4, 3/4
f(x) = 1/4 となるには、 x = *, *
f(x) = 3/4 となるには、 x = *, *
f(x) = * となるには、 x = *, *
...
これを逆に考えると、xが「ある数値」になった途端にその解は1に集束してしまい、次いで0
に落ちてしまうことが分かります。仮に0.4 0.8 0.4 の繰り返しとなる写像であっても、計算機
の計算誤差により、上の「ある数値」になってしまい、0に落ちてしまう。
どうでしょうか?
0018デフォルトの名無しさん
2005/07/18(月) 20:17:14入力された順番とは逆順に線形リストに格納し、そのたびにリスト全体を印字する
プログラムを作成せよ。入力データは正の整数とし、負の数の入力により入力終了とする。
次に、再び入力を受け付け、入力されたデータと一致するデータを線形リストから取り除く
プログラムを作成せよ。
よろしくお願いします。
001918続き
2005/07/18(月) 20:22:11リストに追加するデータを入力して下さい:3
list = 3
リストに追加するデータを入力して下さい:2
list = 2 3
リストに追加するデータを入力して下さい:4
list = 4 2 3
リストに追加するデータを入力して下さい:1
list = 1 4 2 3
リストに追加するデータを入力して下さい:3
list = 3 1 4 2 3
リストに追加するデータを入力して下さい:-1
list = 3 1 4 2 3
リストから削除するデータを入力して下さい:4
list = 3 1 2 3
リストから削除するデータを入力して下さい:5
list = 3 1 2 3
リストから削除するデータを入力して下さい:3
list= 1 2
0021デフォルトの名無しさん
2005/07/18(月) 20:24:460023デフォルトの名無しさん
2005/07/18(月) 21:32:11スレ違いだから今後は宿題スレへ行くように。今回は特別だぞ。
尚、質問は受け付けない。自分で理解してくれ。
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
struct list { int val; struct list *next; } *head = 0;
int len = 0;
for (int x; printf("リストに追加するデータを入力して下さい:"), scanf("%d", &x), 0 <= x;) {
head = realloc(head, sizeof *head * ++len);
head[len - 1].val = x;
for (int i = len - 1; 0 <= i; i--) {
printf("%d ", head[i].val);
}
putchar('\n');
}
for (int x; printf("リストから削除するデータを入力して下さい:"), scanf("%d", &x), 0 <= x;) {
for (int i = len - 1; 0 <= i; i--) {
if (head[i].val == x) {
head[i].val = -1;
} else if (head[i].val != -1) {
printf("%d ", head[i].val);
}
}
putchar('\n');
}
}
002417
2005/07/18(月) 21:36:12ありがとうございます。
これは数学の最後の授業で「試験範囲まで終わったから」ということで教わったものです。
どのような挙動を示すのかなと、少しくらいは書けるC言語でプログラムを書いてみたところ、
初期値にかかわらず0に落ちたのです。気になって質問をしてみました。
先生は、「テント型写像」と言っていました。
「テント型写像」でググってみましたが、2件しか引っかかりませんでした。
ちゃんとした名前では無いのかもしれません。
0025デフォルトの名無しさん
2005/07/18(月) 21:41:31構造体listのnextメンバが無意味だし
0026デフォルトの名無しさん
2005/07/18(月) 21:44:23マジレスされてもな...
0027デフォルトの名無しさん
2005/07/18(月) 21:51:33減算によって有効桁数がどんどん減っていくから
という方が正しい。
0028デフォルトの名無しさん
2005/07/18(月) 21:53:30初期値に1/3(or2/3)を与えると2/3のまま誤差が拡散していく。
初期値に1/7(or2/7...)を与えると2/7, 4/7, 6/7で循環しつつ誤差が拡散していく。
for (ic = 0; va != 0; ++ic) {
int it;
va = 2 * (va < 0.5 ? va : (1 - va));
for (it = 0; it < sizeof(double); ++it) {
#if 0
printf("%02x", ((unsigned char *) & va)[7 - it]);
#else
printf("%02x", ((unsigned char *) & va)[it]);
#endif
}
printf(", %.15g\n", va);
}
こんなコードを書いてみると、引き算でビットが落ちる様子がよく見えるかも。
0029デフォルトの名無しさん
2005/07/18(月) 21:56:48#include <stdio.h>
#include <stdlib.h>
void main(void) {
struct list { int val; struct list *next; } *head= 0,tmp=0;
int len = 0;
for (int x; printf("リストに追加するデータを入力して下さい:"), scanf("%d", &x), 0 <= x;) {
tmp = malloc(sizeof(struct list));
tmp->val = x;
tmp->next = head;
head = tmp;
++len;
for (int i = len - 1; 0 <= i; i--) {
printf("%d ",tmp->val);
tmp = tmp->next;
}
putchar('\n');
}
for (int x; printf("リストから削除するデータを入力して下さい:"), scanf("%d", &x), 0 <= x;) {
tmp = head;
for (int i = len - 1; 0 <= i; i--) {
if (tmp->val == x) {
tmp->val = -1;
} else if (tmp->val != -1) {
printf("%d ", tmp->val);
}
}
tmp = tmp->next;
putchar('\n');
}
}
0030デフォルトの名無しさん
2005/07/18(月) 22:47:20ありがとうございました!
以後気をつけます。
0031デフォルトの名無しさん
2005/07/18(月) 22:56:11select関数を使って、データが送信されたかどうか毎回LOOPしてチェックしている
んですが、これって、回線切断時にもselect関数の戻り値が1になって返って
来てるみたいなんですがどういう事かよくわかりません。
データが届いている時しか戻り値が1ではないんですか?
0032デフォルトの名無しさん
2005/07/18(月) 23:01:12ネットワークプログラミングのスレの>>1くらい読めよ
0033デフォルトの名無しさん
2005/07/18(月) 23:03:08スレ違い
0034デフォルトの名無しさん
2005/07/18(月) 23:55:190035デフォルトの名無しさん
2005/07/18(月) 23:57:53文字列に使う
0036デフォルトの名無しさん
2005/07/18(月) 23:59:09"文字"に使う
0037デフォルトの名無しさん
2005/07/18(月) 23:59:20コンパイルして出来たexeファイルを普通にダブルクリックして実行したいんですが、それは無理でしょうか?
変な質問ですが誰か分かる方教えてもらえませんか?お願いします。
0038デフォルトの名無しさん
2005/07/19(火) 00:00:36コンパイルして出来たexeファイルを普通にダブルクリックして実行できますよ?
0039デフォルトの名無しさん
2005/07/19(火) 00:10:29即レスありがとうございます
でもそのファイルをクリックすると一瞬DOS窓があらわれてすぐ消えるんだけで、なにも変化がないんです
0041デフォルトの名無しさん
2005/07/19(火) 00:15:17プログラムが正しく終了しただけです。問題無い。
0042デフォルトの名無しさん
2005/07/19(火) 00:25:13プログラム正しく終了したとゆうことは、そのゲームは実行されたとゆうことでしょうか?
もしprintfなどで何かを表示するプログラムの場合、それが実行されているとゆうことですが、どこに表示されているんですか?
0043デフォルトの名無しさん
2005/07/19(火) 00:27:20一瞬の間に出た窓に表示された
0044デフォルトの名無しさん
2005/07/19(火) 00:32:21あれは一瞬表示されていたんですか。ではそれをずっと表示させるとゆうのはできないんですか?
0045デフォルトの名無しさん
2005/07/19(火) 00:36:40ヒント:何か入力したら終了
0046デフォルトの名無しさん
2005/07/19(火) 00:37:590047デフォルトの名無しさん
2005/07/19(火) 00:38:01各々の文字にtolowerを適用したまへ
0048デフォルトの名無しさん
2005/07/19(火) 00:46:30なぜだか俺にはそういう時期がまったくありませんでした…
なぜだ
0049デフォルトの名無しさん
2005/07/19(火) 00:47:35初心者な発想ですみません
0050デフォルトの名無しさん
2005/07/19(火) 00:48:48そんなもんで良いんじゃない?
0051デフォルトの名無しさん
2005/07/19(火) 00:52:370052デフォルトの名無しさん
2005/07/19(火) 00:53:51そうですか、ではその方法でやることにします。ありがとうございました
0053デフォルトの名無しさん
2005/07/19(火) 01:00:13「DOS窓がすぐに閉じる」って言っているレベルの人間に、新しいものを
教えてどうする?scanf知ってるならまずそっちを使わせておいて、不満を
感じ始めるくらいになったら自分で探し始めるだろうよ。
0054デフォルトの名無しさん
2005/07/19(火) 01:01:45MS-DOS時代にプログラム始めたから?
いや、俺がそうなんだけど
0055デフォルトの名無しさん
2005/07/19(火) 04:26:12Turbo-Cで覚えたからな。
0056デフォルトの名無しさん
2005/07/19(火) 08:07:59写像そのものはカオスの話で出てくると思う。
「テント写像」なら引っかかるね。
0057デフォルトの名無しさん
2005/07/19(火) 12:15:39cmd.exeじゃねーのか?
0058デフォルトの名無しさん
2005/07/19(火) 12:22:100059デフォルトの名無しさん
2005/07/19(火) 13:57:38大体の流れを教えてください。
Dim X(100)
INPUT N
For I = 1 To N
INPUT X(I)
Next I
For I=1 To N-1
For J=I+1 To N-1
If X(I)>X(J)
W=X(I)
X(I)=X(J)
X(J)=W
Next J
Next I
End
0060デフォルトの名無しさん
2005/07/19(火) 14:11:51Visual c++6.0にてc言語のプログラムを作成中です。
検索プログラムを作成した際、最大表示件数を5件にし
↑↓キーでページスクロールさせるというのはいかにして作るのでしょうか?
教えていただけると幸いです。よろしくお願いします。
0061釣られてみる
2005/07/19(火) 14:12:38えーと、どこから突っ込んでいいやら……
・それはCではありません。
・ここはプログラムの流れを教えるスレではありません。
・要は入力数値をソートしているわけですな。
0062デフォルトの名無しさん
2005/07/19(火) 14:13:05Cじゃないし
0063デフォルトの名無しさん
2005/07/19(火) 14:14:02C言語の標準関数だけでは無理なので、該当スレへどうぞ。
・VCスレ
・初心者質問スレ
・MFCスレ
http://pc8.2ch.net/test/read.cgi/tech/1118072681/
0064デフォルトの名無しさん
2005/07/19(火) 15:09:48ここでよろしいですか?
0065デフォルトの名無しさん
2005/07/19(火) 15:10:3700662から始まる偶数を5個出力
2005/07/19(火) 15:16:11void main(void)
{
int cnt,guusuu;
cnt=2;
while(cnt<=5)
{
printf("%d\n",guusuu);
guusuu=guusuu*2;
cnt=cnt+1;
}
}
としたら、
-858993460
・・・(以下略)
とでてきた。
結果は
2
4
6
8
10
と出てくるはずなのに
0067デフォルトの名無しさん
2005/07/19(火) 15:18:47guusuuの初期値はなんだ?
00682から始まる偶数を5個出力
2005/07/19(火) 15:19:470069guusuuの初期値は?
2005/07/19(火) 15:21:14初心者スレへどうぞ。
http://pc8.2ch.net/test/read.cgi/tech/1118072681/
0070デフォルトの名無しさん
2005/07/19(火) 15:28:21じゃ、その通りにしれ!
0071デフォルトの名無しさん
2005/07/19(火) 15:28:24cnt=1;
0072デフォルトの名無しさん
2005/07/19(火) 18:00:36でも、guusuuの初期値を2としても、結果は
2
4
6
8
10
にはなりませんよ。
0073デフォルトの名無しさん
2005/07/19(火) 18:02:440074かあたん
2005/07/19(火) 18:20:33お願いします。
0075デフォルトの名無しさん
2005/07/19(火) 18:22:20void main(void)
{
int cnt;
for(cnt=1;cnt<=5;++cnt)
{
printf("%d\n",cnt*2);
}
0076デフォルトの名無しさん
2005/07/19(火) 18:26:57全画素(要は画像全体)をビット反転させたらネガポジ変換になるんじゃないの。
0077デフォルトの名無しさん
2005/07/19(火) 18:29:020078デフォルトの名無しさん
2005/07/19(火) 18:51:17プログラムを作成したいのですが、まったくわかりません。
だれか教えてください。
0079デフォルトの名無しさん
2005/07/19(火) 19:16:39スレ違い。
0080デフォルトの名無しさん
2005/07/19(火) 19:46:51それはもう板違いだろ。
物理板へ:http://science3.2ch.net/sci/
0081デフォルトの名無しさん
2005/07/19(火) 19:57:02それをCのソースで表現することは可能だけどね
0082デフォルトの名無しさん
2005/07/19(火) 20:28:08for(;a[i];i++)
printf("%d ",a[i]);
というforの書き方を見たのですが、これは不等号を使った条件式にするとどうなるのでしょうか
0083デフォルトの名無しさん
2005/07/19(火) 20:33:170084デフォルトの名無しさん
2005/07/19(火) 20:39:50つまりfor(;a[i] != 0 ;i++)ということですね
どうもありがとうございました
0085デフォルトの名無しさん
2005/07/19(火) 23:16:34#define M 3
#define N 3
main(){
double i[M][N];
int a,b,c,d; /*カウンタ*/
for(a=0;a<M;a++){
for(b=0;b<N;b++){
c=a+1;
d=b+1;
printf("%d行%d列を入力",c,d);
scanf("%lf",&i[a][b]);
}
}
printf("%f %f %f\n%f %f %f\n%f %f %f\n",i[a][b]);
} 3行3列の行列の値を入力して表示させるプログラムなんですが、微妙に結果が変です。直してください
0086デフォルトの名無しさん
2005/07/19(火) 23:21:57printf()の書式で9個の値を表示するよう指定しているのに、値は
i[a][b]しか渡してない。しかもaとbが配列の範囲外。
0087デフォルトの名無しさん
2005/07/19(火) 23:24:56よく理解できないです。
0088デフォルトの名無しさん
2005/07/19(火) 23:26:040089デフォルトの名無しさん
2005/07/19(火) 23:27:53,i[0][0],i[0][1],i[0][2],i[1][0],i[1][1],i[1][2],i[2][0],i[2][1],i[2][2]);
0090デフォルトの名無しさん
2005/07/19(火) 23:28:51もっと簡潔なかきかたはできないんですね?
0091デフォルトの名無しさん
2005/07/19(火) 23:34:00for(a=0;a<M;a++){
for(b=0;b<N;b++){
printf("%f ", i[a][b]);
}
putchar('\n');
}
0092デフォルトの名無しさん
2005/07/19(火) 23:36:270093デフォルトの名無しさん
2005/07/19(火) 23:39:021文字をstdoutへ出力する。
putc(c)はprintf("%c", c);相当だと思えばいい。
0094デフォルトの名無しさん
2005/07/19(火) 23:39:55よくわかんないので89の書き方でいいや。ありがとうございます!
0095デフォルトの名無しさん
2005/07/19(火) 23:45:520096デフォルトの名無しさん
2005/07/19(火) 23:53:20i=i+1;
printf("%i",i);
禿藁
0097デフォルトの名無しさん
2005/07/20(水) 00:13:190098デフォルトの名無しさん
2005/07/20(水) 00:17:36GNU global
0099デフォルトの名無しさん
2005/07/20(水) 00:23:03コードの意図するところも、何がおかしいのかも判らん。
0100デフォルトの名無しさん
2005/07/20(水) 08:17:58スコープが可笑しいから、自信満々でコンパイルしたけどエラーが出たんだろうよ。
自分の馬鹿さに笑うしか無かったのさ。
0101デフォルトの名無しさん
2005/07/20(水) 12:55:080102デフォルトの名無しさん
2005/07/20(水) 13:15:59int *p[M];
int i;
p[0] = (int *)malloc(sizeof(int)*M*N);
for(i=1;i<N;i++)
p[i-1]=p[i]+N;
動的に確保したメモリって二次元配列として扱うのは上の方法くらいしかないんでしょうか・・・
上の方法だとsizeof(int *)*Nバイト分メモリが無駄になるので好きではないんですが。
0103デフォルトの名無しさん
2005/07/20(水) 14:07:490104デフォルトの名無しさん
2005/07/20(水) 14:12:370105デフォルトの名無しさん
2005/07/20(水) 14:19:22↓
for(i=1;i<M;i++) p[i]=p[i-1]+N;
じゃないか
0106デフォルトの名無しさん
2005/07/20(水) 14:21:06p = (int **)malloc(sizeof(int)*M*N);
0107デフォルトの名無しさん
2005/07/20(水) 14:24:45#define M 20
struct foo { int elem[N][M]; };
int* p = (int *)malloc(sizeof(int)*N*M);
…
((struct foo *)&p)->elem[i][j] = …
N, M がリテラルなら使えるかもしんない
0108102
2005/07/20(水) 14:37:30for(i=1;i<M;i++) p[i]=p[i-1]+N;
が正しいです。
>107さんそうですね。
構造体にして使えば動的メモリ確保でも二次元配列として使えますね。
ありがとうございます。構造体を利用しようと思います。
0109デフォルトの名無しさん
2005/07/20(水) 14:46:07struct foo* p = (struct foo*)malloc(sizeof(struct foo));
0110デフォルトの名無しさん
2005/07/20(水) 14:59:310111デフォルトの名無しさん
2005/07/20(水) 16:41:10標準のCではグラフィックはサポートされない。
環境依存
0112デフォルトの名無しさん
2005/07/20(水) 16:48:16aが1または2でないときの条件の書き方はコレでOKですか?
0113デフォルトの名無しさん
2005/07/20(水) 17:15:21まことに申し訳ないですが、C言語で
「線形代数の方程式AX+XB=Q(すべてn×n)のx」を出力するプログラム、
もしくは
「AXA=A,XAX=X、AXの転置=AX、XAの転置=XAとなるX」を出力するプログラム
をお持ちの方はいませんか…?
いきなり書き込んで申し訳ありません。
0114デフォルトの名無しさん
2005/07/20(水) 17:15:290115デフォルトの名無しさん
2005/07/20(水) 17:28:21ヒント:ド・モルガン
0116デフォルトの名無しさん
2005/07/20(水) 17:29:060117デフォルトの名無しさん
2005/07/20(水) 17:30:59それって一般化逆行列っていうやつかもな
0118デフォルトの名無しさん
2005/07/20(水) 17:33:31わかりますか・・・?
0119デフォルトの名無しさん
2005/07/20(水) 17:36:54いや。。。
0120デフォルトの名無しさん
2005/07/20(水) 17:45:31そうですか、わかりました!またよろしくお願いします
0121デフォルトの名無しさん
2005/07/20(水) 19:03:29遅レスですみません
環境依存てことは、使っているコンパイラによって決まると言うことですか?
0122デフォルトの名無しさん
2005/07/20(水) 19:05:38違う。
0123デフォルトの名無しさん
2005/07/20(水) 19:12:53では、環境とは何の事を示すんですか?
0124デフォルトの名無しさん
2005/07/20(水) 19:19:25定義は知らんけど。
0125デフォルトの名無しさん
2005/07/20(水) 19:28:430126デフォルトの名無しさん
2005/07/20(水) 19:35:59そう結論付けられても困るな。
0127デフォルトの名無しさん
2005/07/20(水) 19:37:01(OSとかが)異なる場合もあるから、さらにややこしい
0128デフォルトの名無しさん
2005/07/20(水) 19:45:372次方程式は解の公式でできますけど
0129デフォルトの名無しさん
2005/07/20(水) 20:16:154次までは公式あるよ。俺は知らんけど。
0130129
2005/07/20(水) 20:20:500131128
2005/07/20(水) 21:21:32ax^3+bx^2+cx+d=0となるxを探す方法では
かけないですかね?
0132デフォルトの名無しさん
2005/07/20(水) 21:39:12数値解析で近似解しか探せない。
つまり ax^3+bx^2+cx+d≒0 となる x は求まることもあるが
厳密に ax^3+bx^2+cx+d=0 となる x は求まらない (ことがほとんど)
# ところで数値解析法で3次方程式の実数解って有限時間内に求まる?
0133デフォルトの名無しさん
2005/07/20(水) 21:48:00解法みたけど良くわからない・・・無理だ
0134デフォルトの名無しさん
2005/07/20(水) 21:50:27いずれにしても、言語の話題からは逸れていくので後は
アルゴリズムスレなり数学板なりでどうぞ。
0135デフォルトの名無しさん
2005/07/20(水) 22:07:250136デフォルトの名無しさん
2005/07/20(水) 22:15:330137デフォルトの名無しさん
2005/07/20(水) 22:59:15五次方程式以上の解の公式は作れないことが証明されているんだっけ?
0138デフォルトの名無しさん
2005/07/20(水) 23:23:48ttp://ja.wikipedia.org/wiki/%E4%B8%89%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F
カルダノの公式
四次方程式 - Wikipedia
ttp://ja.wikipedia.org/wiki/%E5%9B%9B%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F
フェラリの解法
五次方程式 - Wikipedia
ttp://ja.wikipedia.org/wiki/%E4%BA%94%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F
「5次より高次の方程式には一般には代数的解法は必ずしも存在しない。」
0139デフォルトの名無しさん
2005/07/21(木) 01:58:08forを2回組むのはわかるのですが、中の処理の仕方がわかりません。
0140デフォルトの名無しさん
2005/07/21(木) 02:05:27もっと具体的に。
0141デフォルトの名無しさん
2005/07/21(木) 02:23:35int weight;
int pixels[];
int pixels2[][];
中略
for(int y=0; y<height; y++){
for(int x=0; x<width; x++){
pixels[ ]=pixels2[y][x];
} ~~~~~~~
}
略
となる予定なんですが、2次元配列を1次元配列に戻す式?がわからないんです。
0142デフォルトの名無しさん
2005/07/21(木) 02:41:320143142
2005/07/21(木) 02:43:19つpixels[ y*width+x]
0144デフォルトの名無しさん
2005/07/21(木) 02:46:510145デフォルトの名無しさん
2005/07/21(木) 03:54:23配列は式の中ではポインタと同等である
たしかCの規約であったかと
つまり、無駄な領域使用と無駄なコピーをするのではなく
int* p_pixels = NULL;
p_pixels = *pixels2;
以降
p_pixels[y*width+x]
の様に使えば、
…これで一発ではないだろうか…
0146デフォルトの名無しさん
2005/07/21(木) 05:35:240147デフォルトの名無しさん
2005/07/21(木) 06:01:11C言語で、例えば1〜5までの数字を改行ごとに
例1 | 例2
1,2,3 | 1,2
1,3,4,5 | 3,4
2,4 | 2,4,5
とこんな感じで出力したいです。
1行に出てくる数字の個数は、ランダムで(この例だと5以下ですが)、
その際、選ばれる数字もランダムで、同じ行に同じ数字は禁止。
後、同じ数字列も禁止(例:ある行が1,2,3で、それと別の行が1,2,3)。
できれば、数字の間にカンマをいれたいです。
どなたか分かる人がいれば教えて下さい。
Borland C++ 5.5.1 for Win32を使用してます。
0148147
2005/07/21(木) 06:02:50例1
1,2,3
1,3,4,5
2,4
例2
1,2
3,4
2,4,5
です_| ̄|○
0149デフォルトの名無しさん
2005/07/21(木) 07:53:160150デフォルトの名無しさん
2005/07/21(木) 07:55:490151デフォルトの名無しさん
2005/07/21(木) 13:16:02qsortをつかってソートするプログラムを作ったのですが
比較関数のなかでintを比較する場合と、floatを比較する場合では、
floatを比較するほうが時間が倍以上もかかってしまいます。
浮動小数点は==にならないということを聞いたので
int型の中身はかぶらないような数字にもしてみましたがやっぱり
floatのほうが時間がかかります。。
また比較関数が呼び出されている回数もfloatの時のほうが1.5倍くらい多いです。
理由がまったくつかめないです、どなたかお教えください。
0152デフォルトの名無しさん
2005/07/21(木) 13:26:38一般的に浮動小数点数の演算は整数型より遅い。
何故遅くなるかは環境依存。
浮動小数点数の演算をサポートしているCPU上で動作させれば速度が上がる'かも'しれない。
0153デフォルトの名無しさん
2005/07/21(木) 13:30:03こんなとこで質問するもんかね・・・。
それはさておき、比較回数が多いってのはおかしい。
コードを見ないと何が問題なのかは分からんが。
0154デフォルトの名無しさん
2005/07/21(木) 13:35:51#include<stdio.h>
#include <math.h>
int main(void)
{
int k;
double a,b,c,d,e,f;
a=0;b=0;c=0;d=0;e=0;f=0;
for(k=0;k<=1000000;k++)
{
f=1/pow(16,k);
b=4/(8*k+1);
c=2/(8*k+4);
d=1/(8*k+5);
e=1/(8*k+6);
a=a+f*(b-c-d-e);
}
printf("%f",a);
}
実行結果が4.0000となってしまいます。どこがおかしいかどなたか
教えていただけませんか?
0155デフォルトの名無しさん
2005/07/21(木) 13:40:070156デフォルトの名無しさん
2005/07/21(木) 13:46:250157デフォルトの名無しさん
2005/07/21(木) 13:47:03計算時における情報の欠落ということに関して考えたほうがいい。
Cの四則演算は無限の精度を持っているわけではないのだが、
整数での割り算がどういう結果を招くかまったく知らないようだから、
基本がなっていないと思われます
0158デフォルトの名無しさん
2005/07/21(木) 13:49:51abcdが何になってるか一回一回printfしたら?
>>156
ハロワを知らないほどの初心者なのか?
0159151
2005/07/21(木) 13:50:55long型の配列に、構造体のリストの先頭からアドレスを代入した配列で行っています。
qsort( Object , OBJEC_MAX , sizeof( long ) , 比較関数のアドレス );
比較関数
int compare( const void *x , const void *y ){
Count ++;
return ( ( POBJECT )( *( const long * )x ) )->a - ( ( POBJECT )( *( const long * )y ) )->a;
}
int compare2( const void *x , const void *y ){
Count ++;
return ( ( POBJECT )( *( const long * )x ) )->Length < ( ( POBJECT )( *( const long * )y ) )->Length ? -1 : ( ( POBJECT )( *( const long * )x ) )->Length > ( ( POBJECT )( *( const long * )y ) )->Length;
}
quick sort データ : 50000個 , 回数 : 10回
平均(int) 呼び出し回数 : 733630 , 時間 : 22
平均(float) 呼び出し回数 : 860843 , 時間 : 56
もう少し詳しく平均を取ってみたところ1.5倍は少し多すぎたようですがやはり
floatの比較関数のほうが呼ばれている回数は多いです。
0160デフォルトの名無しさん
2005/07/21(木) 13:51:05ホントにやり始めで基本全然なってないんです。
ごめんなさい><
計算の所をもっと細かく分けた方がいいのですか?
0161デフォルトの名無しさん
2005/07/21(木) 13:51:58脳みそ蛆わいてんのか?
0162デフォルトの名無しさん
2005/07/21(木) 13:52:49昔英語の教材でそれを使ってたのでそうだと思いました><
マジで初心者です・・・
0163デフォルトの名無しさん
2005/07/21(木) 13:53:22>計算の所をもっと細かく分けた方がいいのですか?
何でこうなんのよ?
違う初級本かって勉強した方がいいよ
0164デフォルトの名無しさん
2005/07/21(木) 13:56:30#include <math.h>
4.0 * atan(1.0)
0165デフォルトの名無しさん
2005/07/21(木) 13:57:46intの方は同値のとき0を返すのに対して、
floatの方は0を返すことが無い。
0166デフォルトの名無しさん
2005/07/21(木) 13:58:10printfしたら0000000004.0000とか・・・根本的におかしそうですね・・・
>>163
ホントその通りです・・・
0168デフォルトの名無しさん
2005/07/21(木) 14:01:53一応やってみたのですが値は変わりませんでした。
ごめんなさい
4.0 * atan(1.0)
はどういう意味ですか??
0169デフォルトの名無しさん
2005/07/21(木) 14:06:13int k=1;
double b;
b=4/(8*k+1);
printf("%f\n",b);
b=4.0/(8*k+1);
printf("%f\n",b);
何故、答えが違うか分かったらまたおいで
0170デフォルトの名無しさん
2005/07/21(木) 14:11:14答え違いますね!?
でもなんか調べる所がわかったんで、浮動小数点の
所調べてきてみます!
親切にありがとうございました!
0171デフォルトの名無しさん
2005/07/21(木) 14:37:22自力解決しただろうけど、とりあえず。
b=4.0/(8*k+1);
c=2.0/(8*k+4);
d=1.0/(8*k+5);
e=1.0/(8*k+6);
右辺の計算で整数型しか使われてないので、除算部分で整数にまるめられてしまうわけ。
演算結果は演算に絡む型のうち、最も大きい数値を表現できる型に合わせられる。
0172デフォルトの名無しさん
2005/07/21(木) 16:26:33#include <stdio.h>
#include <cmath.h>
int main() {
inta = (int)(log(8.) / log(2.));
printf("%d\n", a);
return 0;
}
このプログラムを整数型へのキャストなしに実行すると,期待通り3が出ます.
ですが上のように整数型へキャストすると,2.8くらいの値になっているようなんです.
できればなぜなのか,またどうすれば期待通りに動いてくれるのかおしえてくらさい
0173デフォルトの名無しさん
2005/07/21(木) 16:35:19cmath.hじゃなくてmath.hな。C++標準ヘッダと混ざってる。
で、普通に3が出力されたが。
0174デフォルトの名無しさん
2005/07/21(木) 17:50:51> 4.0 * atan(1.0)
> はどういう意味ですか??
printf() でそのまま表示して見れ。
0175デフォルトの名無しさん
2005/07/21(木) 17:57:42int a[2][300000]でいいですか?
この場合はmallocとかいらないですか?
0176デフォルトの名無しさん
2005/07/21(木) 18:03:02mallocのほうがいい。mallocも必ず成功するわけではないが。
0177デフォルトの名無しさん
2005/07/21(木) 18:05:42うちじゃ無理だったがな。
0178デフォルトの名無しさん
2005/07/21(木) 18:17:01そのまま配列を宣言するとスタックに確保されるが、大きすぎるとダメ
そのときはmalloc使ってヒープにメモリ確保する、失敗する場合もある
ってことでしょうか?
0179デフォルトの名無しさん
2005/07/21(木) 18:25:470180デフォルトの名無しさん
2005/07/21(木) 18:27:070181デフォルトの名無しさん
2005/07/21(木) 20:37:06せっかくみんなが答えてくれたのに・・・
結局激しくマルチ、ハゲシク(・A ・)イクナイ!
計算アルゴリズム
http://pc8.2ch.net/test/read.cgi/tech/1090227743/796-803
ぼるじょあがC/C++の宿題を片づけますYO! 48代目
http://pc8.2ch.net/test/read.cgi/tech/1121471445/207
0182デフォルトの名無しさん
2005/07/21(木) 22:30:0685ページ
〜「関数へのポインタ」と「文字列リテラル」が、かなり近い領域にお
かれています。〜
の部分ですが、"関数へのポインタ"ではなく、"関数本体"の間違いではないで
しょうか?
知識があやふやな学生なので、正しいなら正しい、間違いならば間違いだという
知識を確定させたいので誰かお答えいただけませんか?
0183デフォルトの名無しさん
2005/07/21(木) 23:05:360184デフォルトの名無しさん
2005/07/21(木) 23:07:19関数本体とは、その関数の先頭ポインタ
つまり、関数へのポインタ
と +その関数のサイズ分のメモリ領域の事じゃないの?
84ページに"関数へのポインタ"が太字で書かれた以降に
その説明があるでしょ。
更に、86ページのFig2-3の図に"関数本体"がボリュームある四角枠で
記入されてるよね。
ポインタってのは、アドレスであって、
メモリの何処からココまでの領域って
ボリュームを示すものでは無いとおもうが…
0185デフォルトの名無しさん
2005/07/21(木) 23:17:52「関数へのポインタ」=関数へのポインタ変数・・・では無く
「関数へのポインタ」=関数本体の先頭アドレス
と、書いてあるつもりっぽいね
0186初心者
2005/07/21(木) 23:31:580187デフォルトの名無しさん
2005/07/21(木) 23:33:43ひょっとして:コンパイラ
0188初心者
2005/07/21(木) 23:35:25windowsXPならコンパイラは何がいいですかね?
0189デフォルトの名無しさん
2005/07/21(木) 23:38:13コンパイラを含む、総合開発環境って事で
C++.NET
0190初心者
2005/07/21(木) 23:39:550191デフォルトの名無しさん
2005/07/21(木) 23:41:110192初心者
2005/07/21(木) 23:42:230193デフォルトの名無しさん
2005/07/21(木) 23:48:57ただで済まそうとすると、コンパイラを使えるように準備するだけで手間がかかる。
買ってくればCDを入れてインストーラの言うとおりにすればとりあえずなんとかなる。
学生ならVS spokeなんかが数千円くらいからあるはず。
0194初心者
2005/07/21(木) 23:51:580195デフォルトの名無しさん
2005/07/21(木) 23:53:27Cを薦められるのではないですか。って、言おうとしたら
マルチだよ。上手に訊くようにしてください。
0196デフォルトの名無しさん
2005/07/21(木) 23:54:330197初心者
2005/07/21(木) 23:59:56何度も質問してすいませんが最後に一つ。
あとでちゃんと調べてみますけど、VS spokeはC言語ですか?
0198デフォルトの名無しさん
2005/07/22(金) 00:06:21VC++はC++だけどもちろんCとしても使える。
0199デフォルトの名無しさん
2005/07/22(金) 00:08:300200初心者
2005/07/22(金) 00:08:560201デフォルトの名無しさん
2005/07/22(金) 00:25:570202デフォルトの名無しさん
2005/07/22(金) 00:27:360203デフォルトの名無しさん
2005/07/22(金) 00:31:250204デフォルトの名無しさん
2005/07/22(金) 00:35:24256入る領域が10個あってその文字配列が5つあると考えるんでしょうか?
strcpyしたときに先頭だけしかコピーがうまくいかず困っておりますだれかお助けください
while(idx<9){
strcpy(hoge[0][idx++],"ahya");
}
0205デフォルトの名無しさん
2005/07/22(金) 00:53:01どうしたいのよ?
hoge[1][][]にもコピーしたいの?
0206デフォルトの名無しさん
2005/07/22(金) 00:54:45とか使うのが良いんじゃないか?
ランダムにアクセスしないのならそれほど速度落ちなさそう。
・・・試してないけど
0207デフォルトの名無しさん
2005/07/22(金) 01:08:150208デフォルトの名無しさん
2005/07/22(金) 01:10:53推測だが。「データをメモリに置かずにファイルに置いておけば良い」かな
0209デフォルトの名無しさん
2005/07/22(金) 01:13:030210デフォルトの名無しさん
2005/07/22(金) 01:20:00Perlのtruncateのような関数は、無いのでしょうか?
行ごとに文字長を詰めたい(余計な文字列を消したい)場合、どのように書けばよいのでしょうか?
現在は、rモードでファイルを読んで、wモードで上書きしていますが、
w+モードで開いて、書き込みまでしたいのです。
0211172
2005/07/22(金) 01:27:28まじですか?
私の環境だと2と出ます。
WinXP home+cygwin+gcc 3.3.3です。
誰か試してみてください!!
0212デフォルトの名無しさん
2005/07/22(金) 01:33:342
0213デフォルトの名無しさん
2005/07/22(金) 01:37:54ありがとん。
なんで2なのか分かりますか?
0214204
2005/07/22(金) 01:55:19この場合hoge[0][0][]〜[0][9][]にahyaが入ると思ったんですが
[0][1][]からデータが入らないんです オネガイシマス
0215≠212
2005/07/22(金) 02:05:48恐らく、2.9999...が切り捨てられて2になったのかと。
仮令doubleの精度があってもlog(8)/log(2)では理論通りに3と言う訳にはいかないのでしょう。
0216173
2005/07/22(金) 02:36:58(↑VCTK2003のやつね)
Metrowerks CodeWarrior for Windows v8.3
ともに3になった。
0217デフォルトの名無しさん
2005/07/22(金) 02:40:47とりあえずどこで問題が発生するのかを確かめるために、
strcpyするごとにidxとhogeの内容を表示させてみたら?
デバッガ使えるのならそれ使ったほうが早いだろうけど。
0218デフォルトの名無しさん
2005/07/22(金) 02:53:33#include <stdio.h>
#include <string.h>
char hoge[5][10][256];
int main()
{
int idx = 0;
while(idx<9){
strcpy(hoge[0][idx++],"ahya");
}
idx = 0;
while(idx<9){
puts(hoge[0][idx++]);
}
return 0;
}
[動作結果]
ahya
ahya
ahya
ahya
ahya
ahya
ahya
ahya
ahya
はいってるよ?
0219デフォルトの名無しさん
2005/07/22(金) 03:13:28textBへShift-JISコードで表示させるにはどうしたらいいでしょうか?
0220デフォルトの名無しさん
2005/07/22(金) 03:15:01「textBへShift-JISコードで表示させる」という部分がどういう意味か
量りかねるし、スレ違い。
0221デフォルトの名無しさん
2005/07/22(金) 03:17:36あ、16進数"%X"って意味です。・゚・(ノД`)・゚・。
0222デフォルトの名無しさん
2005/07/22(金) 03:29:53fprintf()に何かご不満でも?
0223デフォルトの名無しさん
2005/07/22(金) 07:16:14ってのは、AにB[0][0]を代入した後、Aが300未満ならループ続行って事ですか?
0224デフォルトの名無しさん
2005/07/22(金) 08:51:37そう
0225デフォルトの名無しさん
2005/07/22(金) 09:48:03hoge[0][1]にstrcpyしようとしてバスエラーで落ちるなら、ヒントはargv。
0226デフォルトの名無しさん
2005/07/22(金) 10:19:53どうやって文字列を単語に区切ればいいですか?
0227デフォルトの名無しさん
2005/07/22(金) 10:30:450228デフォルトの名無しさん
2005/07/22(金) 11:08:34ありがとうございます
0229デフォルトの名無しさん
2005/07/22(金) 12:30:40sscanf()を駆使した方が……
0230デフォルトの名無しさん
2005/07/22(金) 12:44:06どのように書くのが一番よいのでしょうか?
0231デフォルトの名無しさん
2005/07/22(金) 12:45:15そのまんまやないけ
0232デフォルトの名無しさん
2005/07/22(金) 12:47:16fgets()で文字列入力して、sscanf()かstrtol()で変換、戻り値などで異常を検出。
例えばscanf("%d", ...)すると数字以外の文字を入れた段階で処理が止まるぞ。
0233デフォルトの名無しさん
2005/07/22(金) 13:53:13結構うまくいきました。ありがとうございました。
0234デフォルトの名無しさん
2005/07/22(金) 14:31:14long_options[]の定義方法に関して質問です。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getopt.3.html
の例を見ると、
static struct option long_options[]
と、staticが付いていますが、
staticは必須でしょうか?
staticにする必然性がよくわからないです。
0235AAA
2005/07/22(金) 14:47:070236デフォルトの名無しさん
2005/07/22(金) 14:49:27必須じゃないけど、付けておくと毎回初期化しなくて(・∀・)イイ!!
0237ttt ◆2kifrUvNoc
2005/07/22(金) 15:02:14他のところでもお聞きしたのですが、回答をもらえなかったのでこちらで
質問させていただきます。(この問題は一般的に難しいようです)
VisualStdio.NETでC言語でシリアル通信をしたいと思っています(RS232C)。
PCとH8との通信なのですが、H8には受け取ったデータをそのまま
返すプログラムが入っています。
まずPCからデータを送信して、H8から返ってきたデータを
printf文で表示したいと思っています。
下記のように書いたのですが、実行するとデバッグエラーと出てしまいます。
------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
int main(void){
HANDLE hComm;
DCB dcb;
char* pszBuf; /* 書き込みデータバッファ */
char* pszBuf2; /* 読み込みデータバッファ */
DWORD dwWritten; /* ポートへ書き込んだバイト数 */
DWORD Event;
DWORD dwCount; /* 受信データのバイト数 */
DWORD dwRead; /* ポートから読み出したバイト数 */
hComm = CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
(次に続く) (次に続く)
0238ttt ◆2kifrUvNoc
2005/07/22(金) 15:03:39dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = EVENPARITY;
dcb.fParity = TRUE;
dcb.StopBits = ONESTOPBIT;
SetCommState(hComm, &dcb); /* DCB を設定 */
pszBuf="abcd"; //送信するデータ
WriteFile(hComm,pszBuf, strlen(pszBuf), &dwWritten, NULL);
WaitCommEvent(hComm,&Event,NULL);
ReadFile(hComm,pszBuf2,10, &dwRead, NULL);
printf("%s\n",pszBuf2);
CloseHandle(hComm);
}
-----------------------------------------------------
バグってしまう原因は
ReadFile の行の「(読み込みデータバッファ) pszBuf2」
のところだと思います 。
また、3つ目の引数の「10」のところもどう書いていいのか
よくわかりません。
WaitCommEvent と ReadFile の使い方もよくわかりません。
このコードを正しくする具体的なコードを教えて頂けると幸いです。
0239デフォルトの名無しさん
2005/07/22(金) 15:24:470241デフォルトの名無しさん
2005/07/22(金) 15:30:200242デフォルトの名無しさん
2005/07/22(金) 15:52:20単語に分けるにはどうかけばいいのですか?
strtokだとそれなりに出来ましたがsscanfだと動かない(つД`)
0243デフォルトの名無しさん
2005/07/22(金) 15:59:48mallocする癖を付けたほうがいい。
0244デフォルトの名無しさん
2005/07/22(金) 16:38:21何を困っているのか。
どう動くことを期待してどう書いたらどうなったのか。
%nについて調べると幸せになれるかもしれないけど的外れかもしれない。
0245ttt ◆2kifrUvNoc
2005/07/22(金) 17:02:570246デフォルトの名無しさん
2005/07/22(金) 18:02:24%[^ :]
0247デフォルトの名無しさん
2005/07/22(金) 18:58:22#include <stdio.h>
int main(void)
{
const char *rest = "Stereotyped phrase : Hello C-World";
for (;;) {
int stride = 0;
char word[64] = "";
sscanf(rest, "%*[ :]%n", &stride);
rest += stride;
sscanf(rest, "%[^ :]%n", word, &stride);
if (word[0] == '\0')
break;
rest += stride;
puts(word);
}
return 0;
}
0248デフォルトの名無しさん
2005/07/22(金) 19:50:150249デフォルトの名無しさん
2005/07/22(金) 19:53:02ヒント:ISO/IEC 9899:1999
0250デフォルトの名無しさん
2005/07/22(金) 20:08:55確か、最初に読んだ本にCでgotoは使うべきでは無い等と書かれていて、
それを鵜呑みにし、以来一度も使って来なかったのですが、他人のソース
見ると、よくエラー処理に、 関数の尻に error: 諸々解放とかやっていて、
楽で良いなぁとか思ってるんですが、やはり使わずに済むなら使わない
方が良いのでしょうか?
0251デフォルトの名無しさん
2005/07/22(金) 20:19:14そうならない使い方なら問題ない。
0252226
2005/07/22(金) 20:57:02構造体の中の文字列データ(10個ほど)を単語に区切ろうと思い
for(i=0;i<total;i++){
while(list[i].title!=""){
sscanf(list[i].title,"%s",text);
}
とやってみましたが動きませんでした。
とりあえず>>247を参考にいじってみます。
0253kuro
2005/07/22(金) 21:55:20void main(){
int i,j;
char top[2][4]={{10,0},{10.34.0}},tail[2][4]={{0},{34,44,0}};
chara [15][100]={
"#include<stdio.h>",
"void main(){",
"int i,j;",
"char top[2][4]={{10,0},{10.34.0}},tail[2][4]={{0},{34,44,0}};",
"char a[15][100]={",
"};",
"for(i=0;i<=1;i++)for(j=0;J<5;j++){",
"printf(top[i]);printf(a[j]);printf(tail[i]);",
"}",
"for(i=1;i>=0;i--)for(j=5;J<13;j++){",
"printf(top[i]);printf(a[j]);printf(tail[i]);",
"}",
"}",
};
for(i=0;i<=1;i++)for(j=0;J<5;j++){
printf(top[i]);printf(a[j]);printf(tail[i]);
}
for(i=1;i>=0;i--)for(j=5;J<13;j++){
printf(top[i]);printf(a[j]);printf(tail[i]);
}
}
という実行すると自分とまったく同じものを表示するプログラムを見たのですが…
見やすいようにこれにインデントをつけようとしてもなかなかできません;
なんかあっちをやるとこっちが…みたいになってしまって(汗
どなたか手伝っていただけないでしょうか?><
0254デフォルトの名無しさん
2005/07/22(金) 22:58:44ヒントになってない。
0255デフォルトの名無しさん
2005/07/22(金) 23:03:42批判的な人多そう by高級アセンブラ
0256デフォルトの名無しさん
2005/07/23(土) 00:10:21printf("%lf \n", 5.3 % 2); と書くとエラーになってしまいまして・・・。
0257デフォルトの名無しさん
2005/07/23(土) 00:13:03use fmod()
0258デフォルトの名無しさん
2005/07/23(土) 00:16:13ありがとうございます!!こんな便利な関数があったとは・・・
0259デフォルトの名無しさん
2005/07/23(土) 03:45:140260デフォルトの名無しさん
2005/07/23(土) 09:29:22ついでに言うと、printfのフォーマットに%lfは(少なくともC89には)無い。
間違える人が多いので、printfの%lfは%fとして解釈するようになってる場合が多いが。
0261デフォルトの名無しさん
2005/07/23(土) 10:03:291番の謎が<tgmath.h>。やっていることはどうみてもオーバーロード。
けど変数宣言がブロック先頭に縛られないのは良かったと思う。その他C++から取り入れたものは悪くない。
long longやstdint.hあたりも当然OK。
個人的には複合リテラルはC++にも欲しい。
0262デフォルトの名無しさん
2005/07/23(土) 13:45:32と言うwarningがでるのですが
よく意味が分かりません
shortで型宣言しているのですが、いけないのですか?
0263デフォルトの名無しさん
2005/07/23(土) 13:55:440264デフォルトの名無しさん
2005/07/23(土) 13:57:390265262
2005/07/23(土) 14:00:44単に型の問題じゃなくて、代入ミスでした
お手数をお掛けしました
0266デフォルトの名無しさん
2005/07/23(土) 16:42:37そのポインタの値(ポインタの指した先の値ではなくて)を変更しないのに
constをつけないことが多いのは、つけないほうがいい理由があるからなのですか?
それとも面倒臭いからですか?
例:
func(const char * str) はしっかりつけてコーディングしてるのに
func(char * const str) は書かれていないのを見かけることが多い希ガス・・・
いや、まあそんなこと言ったら
func(const int n) も大概ついてないな。
なぜ!?
0267デフォルトの名無しさん
2005/07/23(土) 16:47:57もしかしたらとは思うが、ポインタをコピーして渡すわけだから、関数内で
strを変更しても、渡した側には影響はない。むしろ、
func(const char * const str)と書かれると、関数内でstrを動かせなくなって
不便になる。
0268デフォルトの名無しさん
2005/07/23(土) 16:50:41シグネチャは同じ。例えば
void f(char* p);
void f(char* const p); // f(char* const) の再宣言
これは使う側に混乱を招くだけ
それに char* const p; の p 事態が変更されないというのに
呼び出し側が影響を受けたり依存したりすることはないので
役に立つ保証とは言えない
0269デフォルトの名無しさん
2005/07/23(土) 16:51:450270デフォルトの名無しさん
2005/07/23(土) 16:59:35const付けようが付けまいが、値渡しであることには変わらないのでは?
0271デフォルトの名無しさん
2005/07/23(土) 17:04:20回答どうもです。
いや、何ていうか、f(char * const str)っていうのは一番安直なケースで言うと関数内で
str = ...
とやるのを防ぐ(=つまり関数内のスコープでstrがポイントする場所を固定)って意味だと思うわけです。
なんか言葉遣いがうまくいかないな・・・
「ポイントする場所を固定」 != 「ポイントする場所にある値を固定」
ってのはわかってもらえるでしょうか?
呼び出し側に影響与えないってのはその通りなんですが、
要は、「関数内でstr = ... なんて間違い普通しないだろ!」っていうのは、
constつけるの面倒くさいからってことになるのでは!?という気がするのです。
他にconstをつけることによる害がないなら、積極的につけるべきではないかと。
0272デフォルトの名無しさん
2005/07/23(土) 17:07:32お前一人が理解できてないだけだろ
>>267-268をよく嫁よ
0273デフォルトの名無しさん
2005/07/23(土) 17:10:28プログラムの仕様はコメントにして書いています。指摘をお願いします。
ttp://tool-ya.ddo.jp/2ch/trash-box/file/20050723170743417.txt
0274デフォルトの名無しさん
2005/07/23(土) 17:13:55foo.hで
void f(char *str);
foo.cで
void f(char * const str) {...}
というのなら、「やりたければ勝手にやれば?」と言えるけどね。
他に公開するインターフェース部分に意味のないconstを置くのは
混乱させるだけでただの害悪。
0275デフォルトの名無しさん
2005/07/23(土) 17:17:59これの意味が分からないのですがどういう意味でしょうか?
0276デフォルトの名無しさん
2005/07/23(土) 17:22:50いや、>>267-268の論点は「呼び出し側への影響」の話だと思うのですが。
char * const str の const をつけるかどうかの問題は
「呼び出し側への影響」はないって話は双方一貫してますが、
それは質問内容ではないです。
っていうか char * を持ちだしてしまったのは、
文字列操作を彷彿させて誤解を招きやすかったかもしれませんね。
たとえば構造体へのポインタを渡すときでも同じで
return_type func(struct hoge * const x)
ってやるべきではないかと思うわけです。(そういう目的で使う場合には)
ところがこのconstは明らかにつけるべき場所でもついていないことが多い気がするわけです。
そこに何らかの難点があるからなのであれば理解しておきたいし。
面倒だからみんなつけないというのであれば自分はつけるようにしたいし。
ちなみにfuncって同じ名前使ったのは再宣言って意味じゃなくて、例を列挙したかっただけなんですが・・・orz
0277デフォルトの名無しさん
2005/07/23(土) 17:25:520278デフォルトの名無しさん
2005/07/23(土) 17:26:49インターフェースに書いとくと混乱招きますかね・・・?orz
まあ混乱招くにしても、実装部分だけに書くことにはマズイ点は特にないわけですよね?
むしろconst本来の意味として使う役割を果たしているなら
「やりたければ勝手にやれば?」
というより
「本当ならやるべき」
と解釈すべきでは?
0279デフォルトの名無しさん
2005/07/23(土) 17:28:580280デフォルトの名無しさん
2005/07/23(土) 17:35:39として使うものを
Object * const p = ...
とするのが、
「見やすくわかりやすい」と思うなら、「勝手にやれば」なだけ。
俺は絶対にやらないけど。
0281デフォルトの名無しさん
2005/07/23(土) 17:41:30じゃあやればいいよ。
引数だけじゃなく、変数も必要とあらば全部const付ければいいんじゃないかな。
保守や変更する人は大変だろうけど。
0282デフォルトの名無しさん
2005/07/23(土) 17:48:18グローバル変数は減らせる限り減らす「べき」と同じ程度の意味の「べき」です。
int teisu = 100;
は
const int teisu = 100;
と書くべきでしょ?
関数の引数はローカル変数の一種であると同時にインターフェイスとして使われる点もあるから、
インターフェイス側に書くと混乱を招きやすいってのは納得のいく説明ですね。
その点さえ留意すれば、他の定数と同様にconstをつける意義があると考えただけの話です。
まあ「やるべき」かどうか云々に言及しすぎても初めに言わんとしていたこととはズレかねないので、
むしろ実装部にconstをつけて定数化することができる点に難点がないと言えるならそれでOKです。
0283デフォルトの名無しさん
2005/07/23(土) 17:53:26{
char a[234];
p = a;
p[0] = 0; // assignment of read-only location
}
voidfunc2(char *const p)
{
char a[234];
p = a; //assignment of read-only location
p[0] = 0;
}
voidfunc3(const char *const p)
{
char a[234];
p = a; //assignment of read-only location
p[0] = 0; //assignment of read-only location
}
int main()
{
return(0);
}
gcc通してみたらこんな感じ。関数内でpをどう使おうが勝手だが、
オレの渡したpの中身を書き換えるなという意味でfunc1以外は
使った事がない。
0284デフォルトの名無しさん
2005/07/23(土) 17:57:04だから、難点は「読みやすさと理解しやすさを損なう」こと。
自分一人でしか読み書きしないソースであれば
ご自由に全てのローカル変数にconstを付けてくださいな。
0285デフォルトの名無しさん
2005/07/23(土) 17:58:01○ ご自由に可能な限りの全てのローカル変数にconstを付けてくださいな。
0286デフォルトの名無しさん
2005/07/23(土) 18:00:20マクロ使え
0287デフォルトの名無しさん
2005/07/23(土) 18:02:46>混乱を招く
って言ってるのに、いつまでたっても理解できないみたいだな
そんなにつけたきゃ勝手につけろと言いたい
0288デフォルトの名無しさん
2005/07/23(土) 18:03:48constつけても利点が少ない割りに冗長ってのはまだ納得のいく話ですね。
ま、煽りが多いのでこの辺でお暇します。
0289デフォルトの名無しさん
2005/07/23(土) 18:05:38*( s_ol + temp) != '\0'
これはどういう意味か説明していただけ無いでしょうか?
s_ol + tempは 単に文字列のByteを足しているだけです
0290デフォルトの名無しさん
2005/07/23(土) 18:05:57head = malloc(sizeof(List));
new_node = malloc(sizeof(List));
0291デフォルトの名無しさん
2005/07/23(土) 18:06:15○ 意味のないconstつけただけで可読性が下がる
全然わかってないようです。
0292デフォルトの名無しさん
2005/07/23(土) 18:07:380293デフォルトの名無しさん
2005/07/23(土) 18:08:31自分以外の全ての人が述べることを
「煽り」としか受け取れないようでは
0294デフォルトの名無しさん
2005/07/23(土) 18:09:11いろんなサイトにもmallocやcallocが使われていたのですが、やはりそれを使うしかないのですね。
ありがとうございました。
0295デフォルトの名無しさん
2005/07/23(土) 18:11:39プログラマーのコミュニティサイト作ってみますた
0296289
2005/07/23(土) 18:12:49s_olは文字列のポインタで、tempが文字列のByte数でした
0297デフォルトの名無しさん
2005/07/23(土) 18:15:10それ単体か?ifかなにかに包んでなかったか?
*( s_ol + temp) != '\0' 特に意味なし
a = *( s_ol + temp) != '\0' a = true/false
if(*( s_ol + temp) != '\0') 普通に比較演算
0298デフォルトの名無しさん
2005/07/23(土) 18:20:010299289
2005/07/23(土) 18:20:37forの中で比較として入れられているのですが
意味が分からないです・・・
括弧の前の*はどういういみなのでしょうか?
ポインタの何かへのキャストですか?
それと、"\0"というのがなにかわからないです・・・
0300デフォルトの名無しさん
2005/07/23(土) 18:21:34s_ol[temp] != '\0'
と同じ。
0301デフォルトの名無しさん
2005/07/23(土) 18:26:300302デフォルトの名無しさん
2005/07/23(土) 18:30:300303デフォルトの名無しさん
2005/07/23(土) 18:31:24\n・・・改行
\0・・・文字列終端(でいいのかな?)
0304デフォルトの名無しさん
2005/07/23(土) 18:34:020305デフォルトの名無しさん
2005/07/23(土) 18:35:11自作自演バレバレだな
0306デフォルトの名無しさん
2005/07/23(土) 18:38:190307デフォルトの名無しさん
2005/07/23(土) 18:48:05'\n'も'\0'も改行です。って教えてるけどな
大体聞いたらそのくらいは、想像できそうなものでしょ
>>305の思考力が少し足りてないだけでは?
まあ、肩もつ気は無いけどさ
0308デフォルトの名無しさん
2005/07/23(土) 18:51:55めんどくさいからって、そんな風に教えんな。
# 開発に入ったら、また再教育かよ...orz
0309デフォルトの名無しさん
2005/07/23(土) 18:54:39#include<stdio.h>, return 0; が、おまじないです
とかいってるのよりは、多少ましだと思うけど
0310デフォルトの名無しさん
2005/07/23(土) 18:55:16俺はさらに=>>307=>>288と予想する
0311デフォルトの名無しさん
2005/07/23(土) 18:55:430312デフォルトの名無しさん
2005/07/23(土) 18:58:41嘘教えてどーすんだよ
0313デフォルトの名無しさん
2005/07/23(土) 19:00:500314デフォルトの名無しさん
2005/07/23(土) 19:01:10お前自身ホントに分かってるのか?
分かってたら絶対そんな風に教えないと思うが…
邪悪すぎる
0315デフォルトの名無しさん
2005/07/23(土) 19:01:18C文字列の根幹をなす考え方だろうに。
0316デフォルトの名無しさん
2005/07/23(土) 19:02:00おまえは初心者の説明者
0317デフォルトの名無しさん
2005/07/23(土) 19:02:35でFA
0318デフォルトの名無しさん
2005/07/23(土) 19:56:11あほの集まりだな
0319デフォルトの名無しさん
2005/07/23(土) 20:07:15インストラクトしてみたら分かると思うけど、いきなり終端とかいっても
ほとんどの人が分からない、のっけからそんな惑わす必要は無いしね
徐々にいろいろなことを教えていくと、途中で終端の意味を教えたときには
最初から教えるときより理解がしやすい
どうでもいいけど、うちも「おまじない」って教えはしないけど
本とか見てるとたまにあるけど、それはひどすぎると思う
0320デフォルトの名無しさん
2005/07/23(土) 20:09:47インストラクターなどの職業の方はマ板へどうぞ
ここの人達は自分の意見のみが正しいと思っているので
何を言っても無駄です
お引き取り下さい
0321デフォルトの名無しさん
2005/07/23(土) 20:14:00氏ねよまじで
0322デフォルトの名無しさん
2005/07/23(土) 20:38:430323デフォルトの名無しさん
2005/07/23(土) 20:39:120324デフォルトの名無しさん
2005/07/23(土) 20:39:550325デフォルトの名無しさん
2005/07/23(土) 20:40:19こっちのほうが適してるかも
http://pc8.2ch.net/test/read.cgi/tech/1121471445/
0326デフォルトの名無しさん
2005/07/23(土) 20:49:19数学→66点
理科→91点
社会→76点
英語→80点
B君 国語→66点
数学→59点
理科→68点
社会→59点
英語→79点
C君 国語→33点
数学→40点
理科→48点
社会→60点
英語→50点
それぞれの点数を配列化し、構造体として表し、3人の平均点を計算して、さらに5教科の合計点が380点以上のものを合格とするプログラムを作っていただけないでしょうか?
0327デフォルトの名無しさん
2005/07/23(土) 20:58:360328デフォルトの名無しさん
2005/07/23(土) 20:58:45マルチ氏ね
0329デフォルトの名無しさん
2005/07/23(土) 20:58:51作っていただけません。
0330デフォルトの名無しさん
2005/07/23(土) 21:09:06「宿題なんぞ教えるかボケ」と書くよりも
「ぼくちんそんなのわかんない」
と書いた方が早くいなくなる気がする
0331デフォルトの名無しさん
2005/07/23(土) 21:09:24作った
printf("合格者=A君\n");
printf("A君の平均=79.2\n");
printf("B君の平均=66.2\n");
printf("C君の平均=46.2\n");
0332デフォルトの名無しさん
2005/07/23(土) 21:11:48Cタンも合格だぞ
0333332
2005/07/23(土) 21:12:260334デフォルトの名無しさん
2005/07/23(土) 21:18:07typedef struct {
char name;
float tensuu;
} TensuuRec;
TensuuRec table[] = {
"A君", 79.2,
"B君", 66.2,
"C君", 46.2,
};
printf("合格者=A君\n");
for(i = 0; i < sizeof(table) / sizeof(TensuuRec)){
printf("%sの平均=%f点\n", table[i].name, table[i].tensuu);
}
0335デフォルトの名無しさん
2005/07/23(土) 21:19:20>char name
0336デフォルトの名無しさん
2005/07/23(土) 21:22:11typedef struct {
char *name;
float tensuu;
} TensuuRec;
TensuuRec table[] = {
"A君", 79.2,
"B君", 66.2,
"C君", 46.2,
};
printf("合格者=A君\n");
for(i = 0; i < sizeof(table) / sizeof(TensuuRec)){
printf("%sの平均=%f点\n", table[i].name, table[i].tensuu);
}
0337デフォルトの名無しさん
2005/07/23(土) 21:26:12>for(i = 0; i < sizeof(table) / sizeof(TensuuRec)){
0338デフォルトの名無しさん
2005/07/23(土) 21:29:380339デフォルトの名無しさん
2005/07/23(土) 21:30:490340デフォルトの名無しさん
2005/07/23(土) 21:33:020341デフォルトの名無しさん
2005/07/23(土) 21:33:51ただし、浮動小数点を用いること。
0342デフォルトの名無しさん
2005/07/23(土) 21:34:29for(i = 0; i < sizeof(table) / sizeof(TensuuRec)){
じゃなくて
for(i = 0; i < sizeof(table) / sizeof(table[0])){
0343デフォルトの名無しさん
2005/07/23(土) 21:34:440344デフォルトの名無しさん
2005/07/23(土) 21:36:460345デフォルトの名無しさん
2005/07/23(土) 21:48:180346デフォルトの名無しさん
2005/07/23(土) 21:50:53ただし、浮動小数点を用いること。
0347デフォルトの名無しさん
2005/07/23(土) 21:57:32そこは「なお」だろ。
0348デフォルトの名無しさん
2005/07/23(土) 22:06:34課題で本当にそんな感じで書いた奴がいて
先生「これは…寒いですね……」
ワロスwww
0349デフォルトの名無しさん
2005/07/23(土) 22:20:35やっぱり>>1のやつがいいんですか?
0350デフォルトの名無しさん
2005/07/23(土) 22:23:06コレならCまで順番どおりに学べるはず
ttp://61.199.33.219/info/studioring/abc/sp/
0351デフォルトの名無しさん
2005/07/23(土) 22:57:160352デフォルトの名無しさん
2005/07/23(土) 23:03:540353デフォルトの名無しさん
2005/07/23(土) 23:34:51更に「アルファベットを入力してください」が二回出ます。なぜですか?
#include <stdio.h>
int main(void)
{
int a,b;
char ch;
printf("実行したい演算は\n");
printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか?\n");
do{
printf("アルファベットを入力してください:");
ch=getchar();
}while(ch!='A'&&ch!='S'&&ch!='M'&&ch!='D');
printf("\n");
printf("最初の数字を入力してください:");
scanf("%d",&a);
printf("二番目の数字を入力してください:");
scanf("%d",&b);
if(ch=='A')printf("%d",a+b);
else if(ch=='S')printf("%d",a-b);
else if(ch=='M')printf("%d",a*b);
else if(ch=='D')printf("%d",a/b);
return 0;
}
0354デフォルトの名無しさん
2005/07/23(土) 23:34:540355デフォルトの名無しさん
2005/07/23(土) 23:37:20お前が判定条件をそうしてるからだろ
0356デフォルトの名無しさん
2005/07/23(土) 23:40:15改行を拾ってるから。
0357デフォルトの名無しさん
2005/07/24(日) 00:00:37だから改行文字のときは、メッセージを表示しないようにすればいい。
char ch = '\0';
//略
do {
if (ch != '\n')
printf("アルファベットを入力してください:");
ch = toupper(getchar());
} while(ch != 'A' && ch != 'S' && ch != 'M' && ch != 'D');
ほかにも方法はいくつかあるけど。
0358デフォルトの名無しさん
2005/07/24(日) 00:14:41自分はできるだけ使わないようにしてるが。
0359デフォルトの名無しさん
2005/07/24(日) 00:21:28scanf("%s", &ch);
じゃダメポ?
0360デフォルトの名無しさん
2005/07/24(日) 00:31:55%sは'\0'を書き込むからchar ch[2]にしないといけない。
そして%1sにすればとりあえず問題ないと思う。
0361デフォルトの名無しさん
2005/07/24(日) 00:39:440362デフォルトの名無しさん
2005/07/24(日) 00:42:050363デフォルトの名無しさん
2005/07/24(日) 01:15:04%*c って必要?
0364デフォルトの名無しさん
2005/07/24(日) 08:31:45%*[^\n]で改行文字が現れるまでということだから%*cで改行文字を拾って捨てることになる。
0365デフォルトの名無しさん
2005/07/24(日) 08:43:49改行は読もうとしない限り捨てられるから要らないんじゃないの?
0366デフォルトの名無しさん
2005/07/24(日) 08:46:490367デフォルトの名無しさん
2005/07/24(日) 12:51:58float a;
if ( a ) {
;
}
とかってやると、aは、int型に勝手に変換される?
unsigned int a;
とか
char a;
とかも、みんなintになる?
0368デフォルトの名無しさん
2005/07/24(日) 13:03:43No
0369デフォルトの名無しさん
2005/07/24(日) 13:05:470370デフォルトの名無しさん
2005/07/24(日) 13:34:11ちなみにcharは今回の場合に限らないが右辺値になるときには常にint(だめならunsigned int)に昇格される。
0371デフォルトの名無しさん
2005/07/24(日) 13:39:12今、右辺値は関係ないじゃん
0372デフォルトの名無しさん
2005/07/24(日) 13:53:01ifの条件式って右辺値じゃないの?
0373デフォルトの名無しさん
2005/07/24(日) 13:53:420374デフォルトの名無しさん
2005/07/24(日) 14:54:530375デフォルトの名無しさん
2005/07/24(日) 14:58:17キーボード使って記述すればいいと思います。
0376デフォルトの名無しさん
2005/07/24(日) 15:07:590377デフォルトの名無しさん
2005/07/24(日) 15:10:450378デフォルトの名無しさん
2005/07/24(日) 15:11:180379デフォルトの名無しさん
2005/07/24(日) 15:17:520380デフォルトの名無しさん
2005/07/24(日) 15:19:22scanfで表面積。。
int main()
{
int a;
scanf("%d",&a);
printf("S=%d",surface(a));
return 0;
}
int surface(int a)
{
return a*a*6;
}
0381デフォルトの名無しさん
2005/07/24(日) 15:20:04380使えばできる、ってか1つの数じゃ無理よな、三角錐はw
0382374
2005/07/24(日) 15:26:440383デフォルトの名無しさん
2005/07/24(日) 15:27:45int型の変数をsqrt()の引数にしても良いのですか?
0384デフォルトの名無しさん
2005/07/24(日) 15:28:54無問題
0385デフォルトの名無しさん
2005/07/24(日) 15:33:58基本は>380と同じ
・main()で半径を入力、surface()とvolume()の結果を出力
・surface()で表面積を計算
・volume()で体積を計算
でOK
0386デフォルトの名無しさん
2005/07/24(日) 15:39:22thx
0388デフォルトの名無しさん
2005/07/24(日) 16:10:43体積・・・・・みのうえにしんぱいあーるのさんじょう
0389273
2005/07/24(日) 18:28:11mallocの使い方はこれであってますよね?
ttp://ccfa.info/cgi-bin/up/src/up14080.txt
0390デフォルトの名無しさん
2005/07/24(日) 18:50:421個余計に表示されるのなら1つ先がNULLかどうかを見ればいい。
for(; head->next; head = head->next) {
0391デフォルトの名無しさん
2005/07/24(日) 19:16:32ありがとうございます。できました。
0392デフォルトの名無しさん
2005/07/25(月) 02:22:58ビットシフトはなんの役に立つのでしょうか?
0393デフォルトの名無しさん
2005/07/25(月) 03:21:09過去ログ参照。
0394デフォルトの名無しさん
2005/07/25(月) 04:05:07unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)
{
unsigned long result = 0,value;
if (!base) {
base = 10;
if (*cp == '0') {
base = 8;
cp++;
if ((*cp == 'x') && isxdigit(cp[1])) {
cp++;
base = 16;
}
}
}
while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
? toupper(*cp) : *cp)-'A'+10) < base) {
result = result*base + value;
cp++;
}
if (endp)
*endp = (char *)cp;
return result;
}
某所から拾ってきたコードで、ちゃんと動作もします。
しかしながら何故これが正常に動作するのかが分かりません。
result*baseで今までのビットに重みを付けているようですが、
value=digit(*cp)で現在ビットが得られるとは思えません。
valueは何処で現在ビットを得ているのでしょうか?
日本語として破綻している箇所があればご指摘下さい。ご教授お願いします。
0395394
2005/07/25(月) 04:19:30(value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
? toupper(*cp) : *cp)-'A'+10) < base
ではisdigit(*cp)?~~~~~~~~'A'+10)が先に評価されるのですね。
式のネストが複雑で、思い違いをしていました。
スレッドの無駄消費申し訳ありません。
失礼致しました。
0396デフォルトの名無しさん
2005/07/26(火) 04:58:26なので,低い程よくなります.そこで,1試合ごとの投球回数と失点数
を入力し,「全試合を通しての防御率」と「最近5試合の防御率」を入
力するたびに計算するプログラムを作ってください.ただし,1/3 回
のようなアウトカウントによる投球回数は考えず,投球回数単位で計算
するものとします.
下の表に出ている値で正しいかどうかを確認してください.
なお,最大140試合まで入力できるようにしてください.また,
日本のプロ野球では,延長戦は12回までなので,投球回数に12より
大きい数値は入らないようにしてください.
0397デフォルトの名無しさん
2005/07/26(火) 05:05:47>>1くらい読め
0398デフォルトの名無しさん
2005/07/26(火) 05:17:36{
int i, j, k;
for (i = 0; s[i] != '\0'; i++) {
ここ→for (j=i, k=0; t[k]!='\0' && s{j}==t[k]; j++, k++)
;
if(k > 0 && t[k] == '\0')
returni;
}
return-1;
}
ここでエラーが出るのですが、理由が分かりません。
0399デフォルトの名無しさん
2005/07/26(火) 05:19:180400デフォルトの名無しさん
2005/07/26(火) 05:29:180401デフォルトの名無しさん
2005/07/26(火) 16:15:46どんなエラーが出てるのだ?
0402デフォルトの名無しさん
2005/07/26(火) 20:34:09これらの関数は絶対に使用しないことなんて書かれていて驚いているのですが
使うことを推奨されていないならgetsに対するfgetsのように
代替となる関数があったりするのでしょうか?
それともただ単に使うときは注意しなさいという警告だけの意味合いなのでしょうか
0403デフォルトの名無しさん
2005/07/26(火) 20:40:03もし使用する場合は、以下のことに注意すること。
これらの関数はその最初の引数を変更する。
これらの関数は const な文字列では使えない。
終端文字はすべて \0 になってしまう。
strtok() 関数はパーズに静的バッファを用いるので、スレッドセーフでない。
もしこれが問題になる場合は strtok_r() を用いること。
0404デフォルトの名無しさん
2005/07/27(水) 07:38:28使わずに済むならそれに越したことはない。
少なくともCで広く使われているライブラリには代替は見当たらない。
0405デフォルトの名無しさん
2005/07/27(水) 10:38:01大抵はsscanf()で事が足りる。
それでダメならどの道strtok()だけでは済まない筈。
0406デフォルトの名無しさん
2005/07/27(水) 11:04:48トークン数が不明なときはsscanfでどう書けばいいの?
0407デフォルトの名無しさん
2005/07/27(水) 12:34:21一個ずつ取り出すループを回す。strtok()より簡単。
/* for example. */
void func(const char * foo)
{
int bar;
do {
int idx;
char buf[100];
bar = sscanf(foo, "%99[^,;:]%n", buf, & idx);
if (bar > 0) {
do_anything(buf);
}
foo += idx;
} while (bar > 0);
}
0408デフォルトの名無しさん
2005/07/27(水) 16:55:290409デフォルトの名無しさん
2005/07/27(水) 17:02:100410デフォルトの名無しさん
2005/07/27(水) 17:11:27俺は 0行からだは、
最小行で負けた・・・ orz
0411デフォルトの名無しさん
2005/07/27(水) 17:14:26定型ヘッダコメントをコピペするからな・・・
それが10行くらい
0412410
2005/07/27(水) 17:18:28ってか昔、一週間位かけて
八千ステップくらいのコード書いたわけよ
それがハカーに圧縮されて千ステップ以下になったわけよ
それから自分からコードは書かなくなった
書くとしてもパッチ位かな
0413デフォルトの名無しさん
2005/07/27(水) 17:29:18パッチを書ける奴の方が凄いと思う
0414デフォルトの名無しさん
2005/07/27(水) 17:30:49文字列操作をぐだらぐだらやってたからsprintf()一文で置き換えた。
0415デフォルトの名無しさん
2005/07/27(水) 17:33:36当り前、どれだけ自分でコードがかけても
他人のが読めなかったらできないのと一緒
>>414
自分から経験年数をいう奴にはまともな奴がいないのが事実
それはおいといて
>文字列操作をぐだらぐだらやってたからsprintf()一文で置き換えた。
理由は無かったのか?
なんでもかんでもsprintfで書いたらいいわけではないんだぞ
0416デフォルトの名無しさん
2005/07/27(水) 17:52:470417デフォルトの名無しさん
2005/07/27(水) 17:55:12この時点で無い
0418デフォルトの名無しさん
2005/07/27(水) 17:56:24まあ、個人ではないだろうな
0419デフォルトの名無しさん
2005/07/27(水) 18:19:160420デフォルトの名無しさん
2005/07/27(水) 18:23:250421デフォルトの名無しさん
2005/07/27(水) 18:23:37んなやつプログラマじゃねーよ
0422デフォルトの名無しさん
2005/07/27(水) 18:30:180423デフォルトの名無しさん
2005/07/27(水) 18:40:07自分はプログラマじゃないけどあるよ
まぁ、数時間を数十分だけど
最寄駅から電車にのって路線変えて2時間強の通勤だったけど
自転車でいったら45分で着いた
0424デフォルトの名無しさん
2005/07/27(水) 18:45:010425デフォルトの名無しさん
2005/07/27(水) 18:46:05乗って来てる人から聞いたら道込んでるから1時間強はかかるって事だった
まぁ、もう止めたからどうでもいいけど
0427デフォルトの名無しさん
2005/07/27(水) 18:49:020428デフォルトの名無しさん
2005/07/27(水) 18:57:47というか、車道は込んでるから原付でもたいして変わらないかと、
だいたい、自分は車とかの間をぬっていったし
歩道も駆使したので早く付いただけですし・・・
大体アベレージが30km/h強位で走ってましたし、
信号がアホみたいに多いのでしょっちゅう止まってたので時間をだいぶ無駄にしてますが
確か、自転車でいく道だと会社まで15km位だったかな?
0430414
2005/07/27(水) 19:17:49理由? さぁ?
少なくとも想定されている入力に対しては同じ出力を返すし、
それ以上に最低限バッファオーバフローは起こさないように改善さえしたよ。
つーか、そのくらいの検証もできないほど漏れが馬鹿なら最初から手をつけないよ。
時間の方ではそうだなぁ、パターンマッチングのロジックを整理して所要時間を
半分にしたことはあったな。
0431デフォルトの名無しさん
2005/07/27(水) 20:06:04距離は15km
で、走行時間は45分というと
15分も信号待ちがあるのか
それはもったいないな
その待ち時間にコンパイルとかしたらどうだろう
0432デフォルトの名無しさん
2005/07/27(水) 20:13:42コンパイルっていわれても、工場なんでそんなものありませんが・・・
0434デフォルトの名無しさん
2005/07/27(水) 21:05:38処理時間が倍以上になったんじゃないか?
0435C言語初心者
2005/07/27(水) 22:23:57パスの設定の仕方等初めから上手く行きません。
どこでつまずいたのか分からないのでインストールしてからの手順を教えていただきたいのですが。。
お願いします。
コマンドプロンプトのエラーとして内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。
と出ます。
0436デフォルトの名無しさん
2005/07/27(水) 22:27:130437デフォルトの名無しさん
2005/07/27(水) 22:27:56っていうかスレ違いだし。
0438デフォルトの名無しさん
2005/07/27(水) 22:34:47http://www.kumei.ne.jp/c_lang/bcc/bcc_01.htm
猫自体は良くないからここだけ読んだらほか行け。
0439デフォルトの名無しさん
2005/07/27(水) 22:41:29どこにスレがあるんですか?
0440デフォルトの名無しさん
2005/07/27(水) 22:49:01分かりやすいかといわれると疑問が残る部分もあるが、
順に読んでいけば何とか分かるし、あんだけ書いてくれ
てるんだからとても有り難い。そのコメントは少しかわい
そうだな。
まぁ、今は本の収入とかもあるんだろうけど・・・
それでも、今もwebだけで十分理解できるようにしている
姿勢は好感が持てる。
0441デフォルトの名無しさん
2005/07/27(水) 22:49:01タダで使えるBorland C++ Part4
http://pc8.2ch.net/test/read.cgi/tech/1091066805/l50
ここはC自体の話限定。
0442デフォルトの名無しさん
2005/07/27(水) 23:08:050443デフォルトの名無しさん
2005/07/27(水) 23:21:48コマンドプロンプトの初期設定を努力して設定するのと、
その初期設定をやってくれるモノをインストールして使い始めるのとでは
今後PCを理解していく上でどちらのほうがいいですか?
やってくれるソフトがあるのだからわざわざ設定する必要もないのですかね?
0444デフォルトの名無しさん
2005/07/27(水) 23:25:260445デフォルトの名無しさん
2005/07/27(水) 23:26:370446デフォルトの名無しさん
2005/07/27(水) 23:46:54どうせ苦労するのならLinuxでも入れとけ。
Windowsじゃそのへんで苦労してもあまり役に立たない。
0447デフォルトの名無しさん
2005/07/27(水) 23:58:25例文は、「yahoo」です。
0448デフォルトの名無しさん
2005/07/28(木) 00:00:330449デフォルトの名無しさん
2005/07/28(木) 00:01:51変数Aと変数Bの内容が等しい場合、変数Cに文字「E」を設定する時の
プログラム部分も教えて下さい。
0450デフォルトの名無しさん
2005/07/28(木) 00:03:40つぼった
0451デフォルトの名無しさん
2005/07/28(木) 00:06:47好きなのを選べ
const char *p = "yahoo";
char a[] = "yahoo";
static char s[] = "yahoo";
>>449
if (A == B) //AとBが文字列ならif (strcmp(A, B) == 0)
C = 'E'; //Cはchar(char *やchar[]ではない)あるいはintだとする。
0452デフォルトの名無しさん
2005/07/28(木) 00:26:110453デフォルトの名無しさん
2005/07/28(木) 00:27:22[]←って何ですか?
0454デフォルトの名無しさん
2005/07/28(木) 00:32:55( ,_ノ` )つc[]
0455デフォルトの名無しさん
2005/07/28(木) 00:36:12( ,_ノ` )
[]E
0456デフォルトの名無しさん
2005/07/28(木) 00:43:59配列
0457デフォルトの名無しさん
2005/07/28(木) 09:43:45マジレスしちゃうほうもどうかと思うがw
0458デフォルトの名無しさん
2005/07/28(木) 09:49:370459デフォルトの名無しさん
2005/07/28(木) 09:53:43ポインタの先のサイズを測ればいい
sizeof(*hoge)
0460デフォルトの名無しさん
2005/07/28(木) 09:55:20要素数を知る方法はない。
関数の引数にポインタを渡すときには要素数も引数として渡すのが一般的。
0461デフォルトの名無しさん
2005/07/28(木) 09:57:44それが一般的なのか・・・
ケツに番犬貼り付けて渡すのが一般的だと思ってたよ。
文字列みたいに。
0463デフォルトの名無しさん
2005/07/28(木) 10:00:12どうやって?
0464デフォルトの名無しさん
2005/07/28(木) 10:01:41文字列みたいに。
0465デフォルトの名無しさん
2005/07/28(木) 10:03:44だから、どうやって?
0466デフォルトの名無しさん
2005/07/28(木) 10:10:220467デフォルトの名無しさん
2005/07/28(木) 10:10:51構造体の場合はSentinel確認用のメンバを用意するなど工夫が必要。
ポインタの場合はNULLをSentinelとして使う手もある。
>>466
>461だけだろ。
0468デフォルトの名無しさん
2005/07/28(木) 10:14:340469デフォルトの名無しさん
2005/07/28(木) 10:16:590470デフォルトの名無しさん
2005/07/28(木) 10:19:50それも一理あるんだが、古い(頭の堅い)C屋には[from, to)であることを理解したがらない香具師がいるからねぇ。
0471デフォルトの名無しさん
2005/07/28(木) 10:23:070473470
2005/07/28(木) 10:31:290474デフォルトの名無しさん
2005/07/28(木) 12:41:50その辺って、途中から変わったんだっけ?
はじめから[from, to)だと思ってた(C-FAQにも載ってるし)。
0475デフォルトの名無しさん
2005/07/28(木) 15:58:08{
int n;
for (n=2; n<=100; n=n+2) {
if (n%3 == 0)
printf("%3d",n);
}
}
これは何を意味するのでしょうか?
100まで2から2を足して行き、そのかずでわったあまり???
途中まで考えたのですが…
0476デフォルトの名無しさん
2005/07/28(木) 16:00:41偶数で3で割り切れる値の列挙
つまり、6の倍数
0477デフォルトの名無しさん
2005/07/28(木) 16:01:010478475
2005/07/28(木) 16:04:450479475
2005/07/28(木) 16:22:34変数aの内容が英大文字のとき真となる論理演算式というのは
(a>='A') && (a<='A')
で宜しいのでしょうか?
0480デフォルトの名無しさん
2005/07/28(木) 16:23:060481デフォルトの名無しさん
2005/07/28(木) 16:26:400482デフォルトの名無しさん
2005/07/28(木) 16:33:210483475
2005/07/28(木) 16:35:28もちろん最初から聞いてるのではなく
考えて分からなかったところを聞いてますので
怒らないで下さい。信じてください
0484デフォルトの名無しさん
2005/07/28(木) 16:39:36使っていいなら<ctype.h>のisupper()を使え。
0485デフォルトの名無しさん
2005/07/28(木) 16:43:330486デフォルトの名無しさん
2005/07/28(木) 16:59:49((a >= 'A') && (a <= 'Z'))
0487デフォルトの名無しさん
2005/07/28(木) 17:51:00{
int i, s=0, n=5, d[10];
for (i=0; i<n; i++) {
scanf("%d",&d[i]);
s = s + d[i];
}
printf("\n答えは%dです\n",s/n);
}
これを実行してもなぜか何も表示されないのですが…
0488デフォルトの名無しさん
2005/07/28(木) 17:51:360489デフォルトの名無しさん
2005/07/28(木) 18:08:39scanfで入力待ちになってるんじゃないの?
数値を入力してリターン、を5回繰り返してみ。
scanfの前に、
printf("input[%d]:", i);
を入れるとわかりやすいかも。
0490デフォルトの名無しさん
2005/07/28(木) 18:25:240491デフォルトの名無しさん
2005/07/28(木) 18:30:24i = i + 2;
}
�A for (n > 0; n++) {
a = a - 2;
}
�B for (i = 'a'; i < 'Y' ; ++i ) {
a = 'Z';
}
�C for (n = 0; n <= 'A'; ++n) {
a = 'F' ='A' ;
}
この中で文法的に間違っているのはどれですか?
理由も教えて下さいm(__)m
0492デフォルトの名無しさん
2005/07/28(木) 18:32:240493491
2005/07/28(木) 18:39:04いっしょうけんめい調べたのですが、読んでも分からなくて…
0494デフォルトの名無しさん
2005/07/28(木) 18:40:551.
for文の初期化項目がない。
nが事前に初期化されているなら、
for ( ; n > 0; n++)
と書くべき。
4.
リテラル(この場合は’F’)に代入はできない。
というか、このレベルの話題は宿題スレの方がいんじゃない?
0495491
2005/07/28(木) 18:44:39すいません、正しく定義されているとする、と欠いてありました…
宿題すれって何処ですか?
0496デフォルトの名無しさん
2005/07/28(木) 18:48:271→2の誤りじゃないか?
0497494
2005/07/28(木) 18:59:30ちなみに、宿題スレってのはここ
ぼるじょあがC/C++の宿題を片づけますYO! 48代目
http://pc8.2ch.net/test/read.cgi/tech/1121471445/l50
0498.491
2005/07/28(木) 19:10:400499デフォルトの名無しさん
2005/07/28(木) 23:24:550500デフォルトの名無しさん
2005/07/28(木) 23:25:50処理系依存なんですれ違い。
0501デフォルトの名無しさん
2005/07/28(木) 23:42:34ビットシフトはなんの役に立つのでしょうか?
0502デフォルトの名無しさん
2005/07/28(木) 23:50:51ビットごとのキュー構造、リングバッファすなはち、実用例としてはシリアル通信
0503デフォルトの名無しさん
2005/07/29(金) 00:39:42上手い書き方はありませんか?
enum{
apple;
orange;
banana;
};
char *s[] = {
"apple",
"orange",
"banana"
};
puts(s[orange]);
0504デフォルトの名無しさん
2005/07/29(金) 00:40:15char a[4];
printf("四文字入力");
scanf("%s",a);
のようにして、四文字を一文字ずつ読み込ませる方法はありますか?
超初心者に教えてください。
0505503
2005/07/29(金) 00:47:210506デフォルトの名無しさん
2005/07/29(金) 00:47:47#include <stdio.h>
int main()
{
char a[4];
int i;
printf("四文字入力\n");
for (i = 0; i < 4; ++i) scanf("%c", a + i);
printf("\n");
for (i = 0; i < 4; ++i) printf("%c", a[i]);
}
0507デフォルトの名無しさん
2005/07/29(金) 00:56:14puts("orange");
0508デフォルトの名無しさん
2005/07/29(金) 01:03:28要素数4なら'\0'が入るから入力できるのは3文字までじゃない?
0509503
2005/07/29(金) 01:11:460512デフォルトの名無しさん
2005/07/29(金) 01:22:19文字列ならそうだが文字の集まりとしてだったら4つでOK
0513デフォルトの名無しさん
2005/07/29(金) 01:50:23↓こんなふうにして追加・削除時に間違えないようにするしか無いんじゃないかなぁ・・・
enum { apple , orange , banana };
char *s[] = { "apple", "orange", "banana" };
0514デフォルトの名無しさん
2005/07/29(金) 02:04:57めちゃ泥臭くても構わないなら
HOGE(apple),
HOGE(orange),
HOGE(banana),
ってのを fruits.list ってファイルにもでも書いて
#define HOGE(X) X
enum {
#include "fruits.list"
};
#undef HOGE
#define HOGE(X) #X
char *s[] = {
#include "fruits.list"
};
#undef HOGE
でいける。
0515デフォルトの名無しさん
2005/07/29(金) 02:09:21こんなんしか思いつかんかった...orz
char *s[] = {
#define apple 1
"apple",
#define orange 2
"orange",
#define banana 3
"banana"
};
0516515
2005/07/29(金) 02:10:39char *s[] = {
#define apple 0
"apple",
#define orange 1
"orange",
#define banana 2
"banana"
};
0517デフォルトの名無しさん
2005/07/29(金) 07:01:07基本情報処理試験のスレがないので
ここに書き込ませてください。
基本情報処理試験は通常どれくらいの勉強時間で受かりますか?
パソコンの能力として参考に
1週間前から猫さんのとこでc言語を学び始めました。現在制御文のところ
ワードエクセルを開いたこともありません。
現在一橋大の法の2年です。受験勉強の能力としては自身があります。
パソコンの能力に関係あるかどうか分かりませんが。
0518デフォルトの名無しさん
2005/07/29(金) 07:49:17扱うのは無理なんでしょうか
簡単なコード書いてみたんですがエラーが。
0519デフォルトの名無しさん
2005/07/29(金) 08:02:54素直にvoid*じゃ、あかんのか?
0520デフォルトの名無しさん
2005/07/29(金) 08:48:58【ム板で】基本情報技術者試験【合格しよう】
http://pc8.2ch.net/test/read.cgi/tech/1097165080/l50
0521デフォルトの名無しさん
2005/07/29(金) 08:51:23void **へ入れるときも出すときもキャストすればいいだけ。
0522デフォルトの名無しさん
2005/07/29(金) 10:32:28void型でboo1からboo100までを作りたいのですが、いちいち
void boo1, boo2, boo3・・・, boo100とやるのは時間が掛かるし、面倒じゃないですか。
そこでforを使って変数を作りたいのですが、どのようにすれば良いでしょうか?
0523デフォルトの名無しさん
2005/07/29(金) 10:36:32配列使えばいいだろ。
0524デフォルトの名無しさん
2005/07/29(金) 10:37:24宣言できても何に使うか想像できないけど
0525デフォルトの名無しさん
2005/07/29(金) 10:39:14文字列も扱いたかったんです
>>521
ありがとうございます。できました
0527デフォルトの名無しさん
2005/07/29(金) 11:08:17_ _
Σ( O ;)
0528デフォルトの名無しさん
2005/07/29(金) 11:09:080529デフォルトの名無しさん
2005/07/29(金) 11:13:560530デフォルトの名無しさん
2005/07/29(金) 11:59:33ここにある、bmp.h、bmp.c、test0.c(test1.c)をcygwin+gccでコンパイル+実行すると、きちんとbmpが
作成されたんですが、これを自分なりに修正していくうちにスタックオーバーフローが出るようになりました。
以下はその修正したのを省略したものです。
img.c
------------
#include "bmp.h"
int main(int argc, char** argv) {
img tmp;
return 0;
}
-------------
bmp.h
-------------
#define MAXWIDTH 1000
#define MAXHEIGHT 1000
typedef struct {
unsigned char r;
unsigned char g;
unsigned char b;
} color;
typedef struct {
color data[MAXHEIGHT][MAXWIDTH];
} img;
--------------
0531デフォルトの名無しさん
2005/07/29(金) 12:00:39配列にいじめられたのか?
小さい頃、配列に噛まれたとか・・・
トラウマってやつ?
0532続き
2005/07/29(金) 12:01:235 [main] img 1980 handle_exceptions: Exception: STATUS_STACK_OVERFLOW
634 [main] img 1980 open_stackdumpfile: Dumping stack trace to img.exe.stack dump
MAXWIDTHとMAXHEIGHTをそれぞれ 590 程度にしたところ、エラーはなくなったのですが、
スタック領域2MBの制限を受けているということでしょうか?他のスレで聞いたところ、
imgは静的変数なんでスタックには配置されないらしいのですが、なぜこのようなエラーが出るのでしょうか?
# static img tmp;のようにしたところそのエラーは出なくなったのですが、staticをつける必要はあるのでしょうか?
0533デフォルトの名無しさん
2005/07/29(金) 12:29:42自動変数じゃん
0534デフォルトの名無しさん
2005/07/29(金) 12:38:21なぜでしょうか?
コードは以下のようなものです。
void func(int size)
{
int i;
int buf[size];
for (i = 0; i < size; i++)
buf[i] = i;
}
bufに変な数値が入ってしまってるのです。
0535デフォルトの名無しさん
2005/07/29(金) 12:43:14それをどんな風に使ってる?
0536デフォルトの名無しさん
2005/07/29(金) 13:09:06自分で改変するからバグるんだってば。
元のtest0.cでも問題なく動くよ。
つーか、スレ違いなんだから初心者スレでも環境依存OKスレにでも行ってくれ。
0537デフォルトの名無しさん
2005/07/29(金) 13:18:19>>533
"cygwin + mingwn + gcc 相談室" では別の質問から始まった。
基のURL上のサンプル test0.cでは静的変数だから、スタック関係ない、
と言われただけ。
つまり、スタックもローカル/グローバル変数もまるっきり解かってない。
>>530,532
おまえがいわゆる「記憶クラス」に関して何も理解しないまま、
半端な知識で、馬鹿な改悪をして質問するのが悪い。
C言語の超初心者として、勉強し直せ。教科書選びからだろうなあ。
0538534
2005/07/29(金) 13:20:36おかしくなってたんです。
buf[0] = -4523832
buf[1] = 1
buf[2~9] = 0
...
普通に固定長の配列として宣言したものは、当然ですがちゃんと正しい
値が代入されます。
使い方は、この後配列の中身をランダムにスワップして、ランダムな数
列として使っています。
0539デフォルトの名無しさん
2005/07/29(金) 13:44:53そもそもそのページのそのコードは、チュートリアルにはなるかも知らんが実用にはならない。
0540デフォルトの名無しさん
2005/07/29(金) 14:00:450541デフォルトの名無しさん
2005/07/29(金) 14:04:38お帰り下さい。
0542デフォルトの名無しさん
2005/07/29(金) 14:12:34こちらは小さなサンプルで buf[]の内容をprintfしたのは正常だなあ。
デバッガは何をどのように使ってる?
こっちのgdbではちゃんとシンボル情報を扱えなかったようだし、
-4523832 も stack上の addr.ぽい気もするし。
とにかく step実行より確認にサンプルと実行結果を提示したほうが
よいと思われ。
そうじゃないとそちらのコードが悪いか、gccの問題か判断できないから。
0543デフォルトの名無しさん
2005/07/29(金) 14:33:21#include <string.h>
int main(void)
{
unsigned int i, len;
int j;
char magic[]="concatenation";
char unknown[] = "-------------";
char ch;
printf(unknown);
printf("\n");
len = strlen(magic);
for(j=0;j<15;j++){
printf("文字を入力してください\n");
ch = getchar();
for(i=0;i<len;i++){
if(ch == magic[i]){
unknown[i] = magic[i];
}
}
printf("%s\n", unknown);
if(!strcmp(magic, unknown)){
printf("Good Job!!\n");
break;
} else if(j==15){
printf("HangMan!!\n");
}
}
return 0;
}
0544543
2005/07/29(金) 14:37:48これをコンパイルして実行して、たとえばcを入力すると
c--c---------
文字を入力してください
c--c---------
文字を入力してください
「文字を入力してください」の後にgetchar()があるのに2回「文字を入力してください」と表示されます
どこが間違ってるか指摘お願いします。
0545デフォルトの名無しさん
2005/07/29(金) 14:43:07'\n'も入力されるから。
0546534
2005/07/29(金) 15:01:32こちらも小さいのでテストしてみました。
printfで出力したところ、正常な数値が出力されました。
しかし、gdbで
print buf[0]
等と確認するとめちゃくちゃな値が入ってるのですが、これはなぜでしょうか
下ので確認しました
int main(void)
{
func(10);
return 0;
}
void func(int size)
{
int i;
int buf[size];
for (i = 0; i < size; i++) {
buf[i] = i;
printf("%d:%d\n", i, buf[i]);
}
}
0547デフォルトの名無しさん
2005/07/29(金) 15:35:33char tex[4][4][256];
tex[1][4] = "noname";
上手くいきません。tex[1][4]に文字列を格納する方法を教えてください。
0548デフォルトの名無しさん
2005/07/29(金) 15:37:10strcpy
0549デフォルトの名無しさん
2005/07/29(金) 15:39:13じゃあ、今のところあなたのコードがおかしい「らしい」、
ということで、もとの質問に意味なくなるね。お終い。
(data sizeやら最適化やらの問題もあるかしらんが。
まあ、もともと可変長配列を使わないほうがいいだろうけど。)
0550デフォルトの名無しさん
2005/07/29(金) 15:41:40そうだった。�dクス
0551デフォルトの名無しさん
2005/07/29(金) 15:42:18以下のプログラムが思うように動きません。
文字を入力してEnterを押しても何も表示されず、プログラムも終了しません。
どうすれば正常に動作するのでしょうか?
環境は、XP SP1, コンパイラはbccです。
K&R, p.22より、入力される文字をカウントするプログラム
------------
#include <stdio.h>
main()
{
long nc;
nc = 0;
while(getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
---------------
0552デフォルトの名無しさん
2005/07/29(金) 15:50:46リダイレクトすればいいんじゃないの?
0553デフォルトの名無しさん
2005/07/29(金) 15:55:21■ ■ ■
■ ■ ■
■ ■ ■
こういう並べ方で画像など表示する時、
for (x = 0 ; x < 3 ; x++) {
for (y = 0 ; y < 3 ; y++) {
(描画処理)
}
}
こんな感じだと思いますが、
■
■ ■
■ ■ ■
■ ■
■
こういう並べ方で表示する場合
どうすればいいのでしょうか?
0554デフォルトの名無しさん
2005/07/29(金) 16:37:23その時−の数字も含み、
最初に0を入れたら何もありませんでしたと表示し、途中で0を入れたら↑の最小値の表示を行うPの一例をお願いします。
0555デフォルトの名無しさん
2005/07/29(金) 16:45:01>>1 を読んで、恥ずかしくない奴だけ質問しようよ。
0556549
2005/07/29(金) 16:46:56(gdbなら x/3wx buf とかで済むし)ふと思い出した。
gcc -ggdb ... なら p buf[0] や p buf で大丈夫そう、だった。
(変な質問の奴ってやはり最後は挨拶無しなのね)
0557デフォルトの名無しさん
2005/07/29(金) 16:58:46EOFってCtrl+dとかじゃなかった?
0558デフォルトの名無しさん
2005/07/29(金) 17:01:41ぐちゃぐちゃ頑張るべし。
nとかで横幅を指定したいなら、
空白、黒、空白、黒、空白・・・のそれぞれの数は、
(n-1) 1 (n-1)
(n-2) 1 1 1 (n-2)
(n-3) 1 1 1 1 1 (n-3)
・・・分かりにくくてスマソ
0559デフォルトの名無しさん
2005/07/29(金) 17:02:04Win は行頭で Ctrl+Z。
0560デフォルトの名無しさん
2005/07/29(金) 17:19:490561デフォルトの名無しさん
2005/07/29(金) 17:24:540562553
2005/07/29(金) 17:25:19綺麗なコードじゃ作れないってことですか。
サンクス。
0563デフォルトの名無しさん
2005/07/29(金) 17:26:20>>551
初心者が K&Rを参考にするなら、unix上でやれ。
そうでないと混乱するだろうから。
あるいは、せめて Win上での環境にも触れている副読本、
または Win上での学習書を用意しろ。目標次第だが、
そこらへんをケチれるほどの余裕はまだ無いだろうから。
0565デフォルトの名無しさん
2005/07/29(金) 17:30:34↓ここで、宿題ですって言ってこい
ぼるじょあがC/C++の宿題を片づけますYO! 48代目
http://pc8.2ch.net/test/read.cgi/tech/1121471445/l50
0566デフォルトの名無しさん
2005/07/29(金) 17:30:57#include <stdio.h>
#include <stdlib.h>
int main()
{
char buf[10];
int fan_no_kaitensuu;
puts("Fanの回転数を入力して下さい。");
fgets(buf, sizeof(buf), stdin);
fan_no_kaitensuu = atoi(buf);
printf("Fanの回転数は %d です。\n", fan_no_kaitensuu);
return 0;
}
0567532
2005/07/29(金) 17:35:49staticについてはあまり知識がなかったので気づきませんでした。imgをmainの中で宣言してたから
だめだったのですね、わかりました。
0569デフォルトの名無しさん
2005/07/29(金) 17:46:51>>502さんが書かれたことと、あとは2を掛けたり2で割ったりするのが素早く
出来るというのがあります( << で2倍、 >> で 2 分の 1)。
但しそんなことは今時のPC用のプログラムではあまり考える必要はありません。
主に昔の非力な8ビットや16ビットCPU用のプログラムで多用されたワザですが、
現在では掛算割算はCPUに命令があってそれを通して行われるしCコンパイラも
最適化を行うので自分で変な最適化をしてコンパイラの最適化の邪魔をする
よりはそのまま書いちゃった方が良いと思います。(a / 2 と書くのが良いか
a >> 1 と書くのが良いかはどちらの方が見やすくて分かりやすいかという
基準で決めてよい)。
0570デフォルトの名無しさん
2005/07/29(金) 17:49:09おまえまったく駄目だよ。わかったつもりになるな。
グローバル変数になると知ってたつもりのくせに、スタックがどうこうと
言い出してたんだろ。はなからてんで理解してないじゃん。
(「記憶クラス」についてはもとより)勉強のしかた自体考え直せって。
0571デフォルトの名無しさん
2005/07/29(金) 18:09:46氏ねばいいのに。
0572デフォルトの名無しさん
2005/07/29(金) 18:13:20そんなにおかしいことじゃないと思うけど。
0573デフォルトの名無しさん
2005/07/29(金) 18:21:24gyahahahaha
0574デフォルトの名無しさん
2005/07/29(金) 18:22:15??
0576デフォルトの名無しさん
2005/07/29(金) 18:30:25ビットシフト云々の質問は、最近良く見るコピペです
これにうんざりした人が、このコピペにちゃんと回答してるの見ると
過敏に反応する様です
0577デフォルトの名無しさん
2005/07/29(金) 18:44:49いまくらいのペースならまだまだOK
0580デフォルトの名無しさん
2005/07/29(金) 19:27:27夏休みの宿題なみだからよそでやれ。(というか消えろ)
分かりやすく言うと、
問題の法則性さえ理解しないお前には解説も無駄。
0581デフォルトの名無しさん
2005/07/29(金) 19:28:21>よく分からない
んだったら説明しても無理だろうからganngare
0582デフォルトの名無しさん
2005/07/29(金) 19:29:09おまえ、写像って学校で習った?
厨房かな
0583551
2005/07/29(金) 19:45:42>>552
どこでリダイレクトを使えばいいんですか?
>>557
>>559
ありがとうございます。Enterの後、Ctrl+Zでなんとか通りました。
文末に行ったらgetchar()が自動的にEOFを返すもんだと勝手に思ってたのが原因みたいです。
自分で入力しなきゃいけないんですね。
0584デフォルトの名無しさん
2005/07/29(金) 20:06:59void func(int n)
{
int y, x, z, m, flg;
m = n / 2;
for(y=0;y<n;y++){
if(y<n/2){
m = (n / 2) - y;
}else{
m = y - (n / 2);
}
for(x=0;x<n;x++){
if(x<m){
printf("△");
}else if(x<n-m){
if((m+x)%2==0){
printf("●");
}else{
printf("○");
}
}else{
printf("□");
}
}
puts("");
}
}
0585デフォルトの名無しさん
2005/07/29(金) 20:19:59回転行列のことか、納得。
>553
>584で満足できなかったら
「行列」「行列式」「一次変換」「回転行列」
で具具って数学の勉強ガン( ゚д゚)ガレ
0586デフォルトの名無しさん
2005/07/29(金) 20:23:08>>1 読めよ。ソース丸投げな「プログラミング」の話は
スレ違いだろ。
0587デフォルトの名無しさん
2005/07/29(金) 20:30:06はあ? 誰もおかしがっとらんだろ?
おそらくは無知に気がつかないままの迷惑な半端ものや、
それこそ努力以上に理解力や論理能力の足りない人やらは、
はいて捨てる程いるので、みんなうんざりしてるだろうけど。
0588デフォルトの名無しさん
2005/07/29(金) 21:40:50>どこでリダイレクト
( ´゜д゜`)
>文末に行ったら〜EOF
( ´゜д゜`)
激しくがんがれ。
0589デフォルトの名無しさん
2005/07/29(金) 23:37:28typedef struct Test {
int unko;
}Test;
void hoge( void *p ){
}
main()
{
Test *baka;
hoge( &baka );
}
Test のポインタのポインタなのに、コンパイルが通ってしまうのは
問題ではないのですか? void ** 型なら納得できるけど。
Win32 SDK の話になりますが、 SelectObject( hdc, &oldpen ); なんて
やってるソースを見かけたことがあります。
0590デフォルトの名無しさん
2005/07/29(金) 23:42:11どんなポインタ型もvoid *へ変換できるし、その逆もまた可能。(さすがにC++では逆はキャストが必要になったが)
ポインタへのポインタ型もポインタ型の一種であることには間違いないのだからそんなのも問題ない。
0591503
2005/07/29(金) 23:42:45回答ありがとうございます。>>514の方法はすごいです。文字列化演算子なんて
ある事すら忘れていました。それから、>>514を一つのファイル内でできるようにしてみました。
ただ、要素をコメントアウトするのに // では無理で /**/ を使わなければならなくなって
しまいましたが…。
#define FRUITS_LIST {\
HOGE(apple),\
HOGE(orange),\
HOGE(banana),\
}
#define HOGE(X) X
enum FRUITS_LIST;
#undef HOGE
#define HOGE(X) #X
char *s[] = FRUITS_LIST;
0592デフォルトの名無しさん
2005/07/29(金) 23:48:49Boost Preprocesser libraryを使えばもうちょっと自然にできると思われる。
0593デフォルトの名無しさん
2005/07/30(土) 03:55:11malloc関数でメモリを確保して配列にしたいのですが、
その配列を2次元配列として扱っていくにはどうしたらよいでしょうか?
つまり配列の縦横の大きさの定義ができればと思うのですが・・・
0594デフォルトの名無しさん
2005/07/30(土) 05:25:11int (*hoge)[y] = malloc(x * y);
0595593
2005/07/30(土) 06:24:10レスありがとうございます。勉強になります。
ところでこのやり方は関数中ではできないのでしょうか?
int width, hight;
char *data;
<scanfでhight, widthを入力>
data[width] = (char)malloc(sizeof(char) * hight*width );
とすると'data' used before setとエラーが出てしまいます。
0596デフォルトの名無しさん
2005/07/30(土) 06:28:45data = (char *)malloc(sizeof(char) * hight*width );
0597593
2005/07/30(土) 06:38:34素早いレス感謝です。
その配列を2次元配列(data[hight][width])として扱いたいというのが質問なのですが、
そのままでは1次元配列として扱われてしまいませんか?
最初に
char *data[1000][1000]
などとして十分に大きなメモリを確保すればすむ話ではあるのですが、
できれば関数中でできればと思いまして。
0598デフォルトの名無しさん
2005/07/30(土) 06:49:41たしかに一次元配列になっている。
dataにアクセスするときにはdata[y * width + x]とする。これで[y][x]相当。
0599593
2005/07/30(土) 06:57:32ありがとうございます。やはりそうするしかないですか。
そのことは知っていたのですが、扱いの利便性から2次元にできればと思ったのです。
回答ありがとうございました
0600デフォルトの名無しさん
2005/07/30(土) 06:59:09char (*data)[WIDTH];
data[i][j] は *(data + i*WIDTH + j)
宣言時にwidthが解っていないと、
データを格納するアドレスを計算できない
それから、char *data[1000][1000]
だと、charへのポインタ がたくさん確保されちゃうよ
0601デフォルトの名無しさん
2005/07/30(土) 07:18:12http://www.kouno.jp/home/c_faq/c6.html#16
0602デフォルトの名無しさん
2005/07/30(土) 07:31:44char (*data)[width] = malloc(sizeof (char) * height * width);
0603593
2005/07/30(土) 08:01:54ありがとうございます。そのようですね。
>ポインタがたくさん
うわわ、おっしゃるとおりです。おはずかしい
>>601
参考にさせていただきます。
色々なやり方があるのですね。
>>602
ありがとうございます。
助かります
0605デフォルトの名無しさん
2005/07/30(土) 09:55:41int ary[4][4];
}
struct foo *p;
p = (struct foo *)malloc(sizeof(struct foo));
p->ary[0][0] = ....;
...
0606デフォルトの名無しさん
2005/07/30(土) 10:51:35いいや、sizeof(char)なんて無駄なことをしているのは正しくない。
>>605
流れ嫁。
それではwidthとheightを可変にすると言う目的には使えないぞ。
>>593
変に凝らずに、data[x + width * y]というアクセス方法に馴れておいた方がいいぞ。
毎回書くのがいやなら、
int offset(int x, int y, unsigned width) {return x + width * y;}
なんて関数にしておくといい。
0607デフォルトの名無しさん
2005/07/30(土) 12:34:25http://www.geocities.jp/ky_webid/c/055ans.html
0608デフォルトの名無しさん
2005/07/30(土) 13:33:33{
int **p;
p = (int **)malloc(sizeof(int *))*y);
p[0] = (int *)malloc(sizeof(int)*x*y);
for(i=1;i<y;i++)
p[i] = p[i-1]+x;
return p;
}
0609デフォルトの名無しさん
2005/07/30(土) 19:40:00どの辺りがC99なの?
0610デフォルトの名無しさん
2005/07/30(土) 20:41:10#include <string.h>
void reverse(char str[]);
main()
{
int i;
char s[5];
for(i = 0; i < 5; i++)
s[i] = 'a' + i;
reverse(s);
printf("%s", s);
return 0;
}
void reverse(char s[])
{
int c, i, j;
for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
c = s[i], s[i] = s[j], s[j] = c;
}
これを実行すると"Bedcba"と表示してフリーズするんですけどどこがいけないんですか?
0611デフォルトの名無しさん
2005/07/30(土) 20:42:270612デフォルトの名無しさん
2005/07/30(土) 20:45:00すみません。ありがとうございます。
0613デフォルトの名無しさん
2005/07/31(日) 05:15:26(*data)[width]のwidthが定数でないところ。
0614デフォルトの名無しさん
2005/07/31(日) 05:22:000615デフォルトの名無しさん
2005/07/31(日) 05:53:26だから602は可変長配列じゃないってことわっているじゃないか。
0616デフォルトの名無しさん
2005/07/31(日) 06:10:51そんなおれは、Cとやらをサンデープログラマーしてやる!!!
さあ、何時間あれば習得でける!!!
さあ!!!
0617デフォルトの名無しさん
2005/07/31(日) 06:12:46おおおん!!!どないやねん!!!
0618デフォルトの名無しさん
2005/07/31(日) 06:48:49上記問題、設問1の(b)は、
エの「++CP」が正解になっています。
ウの「cp+1」では、不正解なのでしょうか?
実行結果は同じになると思いますが、
わざわざインクリメントを使用する意味が分かりません。
よろしくお願いします。
0619デフォルトの名無しさん
2005/07/31(日) 06:51:57まずは実行してみろ。
話はそれからだ。
0620デフォルトの名無しさん
2005/07/31(日) 07:11:56うんちがしたくなってきた・・・
0621デフォルトの名無しさん
2005/07/31(日) 07:38:37それは別にANSI-Cでも認められてるけど。
0622デフォルトの名無しさん
2005/07/31(日) 08:05:40だからC99じゃないと無理だって。
試してみろよ。
0623デフォルトの名無しさん
2005/07/31(日) 08:22:250624デフォルトの名無しさん
2005/07/31(日) 08:30:490625デフォルトの名無しさん
2005/07/31(日) 08:58:170626618
2005/07/31(日) 09:12:43長文になると、変な勘違いを起こして、
そこから抜け出れませんでした。
0627デフォルトの名無しさん
2005/07/31(日) 12:51:42ずばり、何日で習得できる!!!
※45歳毒
0628デフォルトの名無しさん
2005/07/31(日) 12:54:55COBOLを書いていたのなら数日。
書かされていたのなら無理。
0629デフォルトの名無しさん
2005/07/31(日) 13:15:06簡略化して、ちゃんと動くようにしたいんですけど…
キーボードからAかBを入力しそれとその文字列の長さ
(AAABABBBA なら 9 を)出力させたいのですが。。
#include <stdio.h>
int main(void)
{
char c[256];
int t;
t=strlen(c);
printf("AかBを入力。Ctrl-zで終了します:");
scanf("%s",&c);
while((c[256] = getchar()) != EOF){
printf("%s",c);
}
printf("%d",t);
}
長さが3と出て、うまく行きません。while文がおかしそうなんですけれども。
どこがまずいんでしょうか??
0630デフォルトの名無しさん
2005/07/31(日) 13:16:470631デフォルトの名無しさん
2005/07/31(日) 13:22:05つまんね
0632デフォルトの名無しさん
2005/07/31(日) 13:58:45>t=strlen(c);
c は未初期化でまだ何も入ってない。適当な値しか返ってこない。
>scanf("%s",&c);
char * を引数にとるので、意味的には scanf("%s", c); が正しいはず。&c だと char[256] へのポインタだ。
>while((c[256] = getchar()) != EOF){
char c[256]; て宣言してるんだから有効なのは c[0]〜c[255] だ。
scanf() で読み込んでるのに何で getchar() してるの?while の意味は何?
int main(void) なんだから値を返すように。
0633デフォルトの名無しさん
2005/07/31(日) 14:17:07sageぐらい覚えよう/覚えてもらえ。
>>1は読もう。宿題はよそでやれ。(相手にしない。誘導)
それらはたいてい「Cの話」以前だ。
涼しい生活を
0634デフォルトの名無しさん
2005/07/31(日) 15:21:02VISUAL C++で
ひとつのファイルを無事成功し、
違うファイルを作り、実行しようとすると
コンパイルの時点で「_main はすでに 定義されています」
とでて、そこから先へ進めません。
成功したファイルには「プロジェクトファイル」なるものなどが勝手に作られています。
一つを実行させた後でも、何個も作業を実行するにはどうすればいいのでしょうか?
0635デフォルトの名無しさん
2005/07/31(日) 15:28:180636634
2005/07/31(日) 15:35:42本当に分からないから聞いてるのです
なんでそういじめるのですか
0637デフォルトの名無しさん
2005/07/31(日) 15:39:26余計たちが悪いな
0638デフォルトの名無しさん
2005/07/31(日) 15:41:40志村ー!日本語日本語!
0639デフォルトの名無しさん
2005/07/31(日) 15:42:16これを開き直りと言うのでは?
0640634
2005/07/31(日) 15:43:00聞くべきところでも帰ってこなかったからお伺いしてると上で書いたのですが…
0641デフォルトの名無しさん
2005/07/31(日) 15:48:320642デフォルトの名無しさん
2005/07/31(日) 15:59:09言ってることがわかりません。
まずは質問の仕方から勉強してください。
>ひとつのファイルを無事成功
何が成功したの?
>違うファイルを作り、実行しようとすると
何を作って、何を実行しようとしたの?
>成功したファイルには〜
だから意味がわからん。
>一つを実行させた後でも、何個も作業を実行するには〜
何を実行するの?何個も作業を実行ってどういうこと?
0643634
2005/07/31(日) 16:02:57どうしてそんなに変に細かいのですか?
普通に教えて頂ければ簡単に済む事なのに…
もういいです。失礼いたしました。
日常生活では是非お気をつけ下さい
0644デフォルトの名無しさん
2005/07/31(日) 16:08:50オマエモナー
0645642
2005/07/31(日) 16:12:36質問に答えようにも
あなたの説明では状況が全然わからないのです。
私達だって神様ではありません。
状況を理解するために適切な情報がないとどうしようもありません。
まず、質問をする際はちゃんと要点をまとめてください。
その後、自分で読み直して意味が通じるかどうか確認してください。
>日常生活では是非お気をつけ下さい
少し言い方がきつかったかもしれませんね。その点は反省します。
でも、あなたの方こそ気をつけるべきだと思いますよ。
0646デフォルトの名無しさん
2005/07/31(日) 16:15:29おまいもスレ違いって事に気付け
0648デフォルトの名無しさん
2005/07/31(日) 17:32:18あなたが大至急だろうがなんだろうが、関係ありません。ここで
その質問はスレ違いです。以下のスレへ移動してください。
★初心者にVisual C++を教えるスレ★ Part20
http://pc8.2ch.net/test/read.cgi/tech/1120222322/
0649デフォルトの名無しさん
2005/07/31(日) 17:40:08いや、見てみればわかるが、そのスレには既にw
0650デフォルトの名無しさん
2005/07/31(日) 17:44:07見た上で言っているわけだが。
0651デフォルトの名無しさん
2005/07/31(日) 17:45:57単にツールの使い方をまったく知らない初心者未満だから、
教えようもないのだろうけど。使い方読めよ。
"くだすれVisual C++(超初心者用)" じゃあないのか。
0652デフォルトの名無しさん
2005/07/31(日) 17:54:500653デフォルトの名無しさん
2005/07/31(日) 19:50:52b!=c であることは保証されてます。
a に、 bでもcでも無い値を入れたいのですが
これを1行でかっこよく書く方法はありますか?
0654デフォルトの名無しさん
2005/07/31(日) 19:57:21適当なので正しく動くかどうかは知らん。
0655デフォルトの名無しさん
2005/07/31(日) 19:59:40っつーのはどうだろう。
0656655
2005/07/31(日) 20:00:18すまん、ダブった。
0657デフォルトの名無しさん
2005/07/31(日) 20:00:37ありがとうございます(><)!
0658デフォルトの名無しさん
2005/07/31(日) 20:00:58a = 3 ^ b ^ c
とかどう
0659デフォルトの名無しさん
2005/07/31(日) 20:01:080660デフォルトの名無しさん
2005/07/31(日) 20:03:470661デフォルトの名無しさん
2005/07/31(日) 20:06:54aが0〜2の範囲内でさらにa!=bかつa!=cであるようにaを決めたいときは
さすがに1行じゃあ無理だろうな
0662デフォルトの名無しさん
2005/07/31(日) 20:18:36それじゃ解が一つに定まらんだろう
0663デフォルトの名無しさん
2005/07/31(日) 20:28:363^b^cならばb==cのときに常に3になるので検出しやすいのね。
0664デフォルトの名無しさん
2005/07/31(日) 20:30:44そのときは0から順に適当な数値をaに
0665デフォルトの名無しさん
2005/07/31(日) 20:52:170666デフォルトの名無しさん
2005/07/31(日) 20:53:460667デフォルトの名無しさん
2005/07/31(日) 22:40:20a = ( (b!=0)&&(c!=0) ) ? 0 : ( (b!=1)&&(c!=1) ? 1 : 2 );
これでいいですか(><)?
0668デフォルトの名無しさん
2005/07/31(日) 23:07:43char *a
って書くのと、
char a[]
って書くのの違いが分からない。
何が違うのだ?
0669デフォルトの名無しさん
2005/07/31(日) 23:15:11上はコンパイルできるが下はコンパイルできない。
0670デフォルトの名無しさん
2005/07/31(日) 23:16:29変わらない。
引数に配列を指定してもポインタ(char*)に成り下がる。
関数側と関数の呼び出し側とでsizeof(a)してみて。
0671デフォルトの名無しさん
2005/07/31(日) 23:19:330672デフォルトの名無しさん
2005/07/31(日) 23:23:370673デフォルトの名無しさん
2005/07/31(日) 23:29:25そうなってないのか?
0674デフォルトの名無しさん
2005/07/31(日) 23:38:10勝手にconstになられたら、困ります(><)!
0675デフォルトの名無しさん
2005/08/01(月) 00:32:59const char*
じゃなくて
char* const
だぞ?
0676デフォルトの名無しさん
2005/08/01(月) 00:41:280677デフォルトの名無しさん
2005/08/01(月) 00:48:100678デフォルトの名無しさん
2005/08/01(月) 01:29:18とはどういう意味でしょう?
0679デフォルトの名無しさん
2005/08/01(月) 01:32:48予想もしなかったEOFを食らって森崎くんが吹っ飛んだ
0680デフォルトの名無しさん
2005/08/01(月) 01:37:37予期しないEOFを検出した。
括弧の閉じ忘れやセミコロンが無かったりしてない?
0681デフォルトの名無しさん
2005/08/01(月) 01:50:29ありがとうです
0682デフォルトの名無しさん
2005/08/01(月) 02:06:07ではなぜ '\\' や '\"' といったものが成立するのですか?
0683デフォルトの名無しさん
2005/08/01(月) 02:16:27\nとかは2文字で1文字なんだよ
北斗と南みたいなもんだな
0684デフォルトの名無しさん
2005/08/01(月) 02:23:230685デフォルトの名無しさん
2005/08/01(月) 02:57:46struct B { struct A a; };
という、ふたつの構造体を定義したいんだけど
どうしたらいいんだっけ
0686デフォルトの名無しさん
2005/08/01(月) 03:00:16struct A { struct B *b; };
struct B { struct A *a; };
だった
0687デフォルトの名無しさん
2005/08/01(月) 03:35:24穴埋め配列問題
int a[8];, int b[29]で確保した配列aを、配列bの先頭部分へコピー
************************
for(k = 0; k < 8; k++)
??? = ???;
************************
の???て何が入るのん?
変数kの処理を8回繰り返して得たデータを配列bの先頭に入れろって事?
b[0] = a[8]とか
b[8] = aとかやっても間違ってるってでるよママン。
そんなに難しい問題じゃ無いのはわかってるんだけども誰か教えて下さいまし。
。・゚・(ノД`)・゚・。
0688デフォルトの名無しさん
2005/08/01(月) 03:39:510689デフォルトの名無しさん
2005/08/01(月) 03:43:18神様ありがとうございました。
0690デフォルトの名無しさん
2005/08/01(月) 03:44:27定石があるのかどうか知らないけど、思いついたのはこれ
typedef struct _a A;
typedef struct _b B;
struct _a { B *b; };
struct _b { A *a; };
0691デフォルトの名無しさん
2005/08/01(月) 03:49:35誰かC++に詳しい人メッセ友達になって欲しい…
0692デフォルトの名無しさん
2005/08/01(月) 03:50:050693デフォルトの名無しさん
2005/08/01(月) 05:44:43そんな気にしてることいわないでよ(ノД`)
せめてかわいらしくぱげっていって
0694デフォルトの名無しさん
2005/08/01(月) 06:07:51うるさいぞっ♪ハゲ♪
0695デフォルトの名無しさん
2005/08/01(月) 07:34:27ユーザーインターフェイス(?)を持ったプログラムを作成するにはどのようにしたら良いのでしょうか?
0696デフォルトの名無しさん
2005/08/01(月) 07:45:170697デフォルトの名無しさん
2005/08/01(月) 07:52:270698735
2005/08/01(月) 08:01:30ええっと、ごめんなさい。おっしゃることがよく理解できません
UI=ユーザーインターフェイスかな?
たとえば
#include<stdio.h>
int main(void){
int a;
scanf("%d",&a);
printf("a+1 = %d",a+1);
return 0;
}
ではDOS窓に数字を打ち込むとそれに1足した数字が表示されるというものができますよね。
それをインターフェイスを表示して計算させるようにさせたいのですが・・・
もしかしてC以前の質問だったでしょうか
0699デフォルトの名無しさん
2005/08/01(月) 08:05:080700デフォルトの名無しさん
2005/08/01(月) 08:06:41>>1を読んだことはありますか?
0701デフォルトの名無しさん
2005/08/01(月) 08:07:190702デフォルトの名無しさん
2005/08/01(月) 08:09:00CUIとGUIという単語について調べてみ
0703702
2005/08/01(月) 08:10:010704695
2005/08/01(月) 08:11:44>>697
ありがとうございます。
プログラミング段階の問題ではなくて開発環境の問題ということでしょうか
>>699
なるほど。自分で質問の問題を調べた時に出てきた単語を勘違いして認識していました。
DOS窓自体もユーザーインターフェイスなのですね。
質問の意図としては自分でUIの形態を設定することができないのかということになりましょうか。
0705695
2005/08/01(月) 08:17:041はよんでいたのですがFAQのほうに注目していました。
C自身の問題とはちょっとずれてしまうようですね。
失礼しました
>>701>>702
ありがとうございます。
GUIで表示したいという質問内容でした。
もう少し調べてみたいと思います。
0706デフォルトの名無しさん
2005/08/01(月) 08:18:13そこまで解ったのなら、
自分が使ってるコンパイラもしくは統合開発環境の質問スレへGO!
0707デフォルトの名無しさん
2005/08/01(月) 18:49:340708デフォルトの名無しさん
2005/08/01(月) 19:04:300709デフォルトの名無しさん
2005/08/02(火) 02:41:06さっぱりだ・・・取っ掛かりすら・・・
何か参考になるいいサイトとかないでしょうか?
0710デフォルトの名無しさん
2005/08/02(火) 07:44:11つ[www.oracle.co.jp]
0711デフォルトの名無しさん
2005/08/02(火) 10:07:510712デフォルトの名無しさん
2005/08/02(火) 14:15:19少なくともウチでは現役バリバリ。
>>709 のように UNIX+C の組み合わせで
クライアント側だと他に解がないし。
0713デフォルトの名無しさん
2005/08/02(火) 18:13:36問題は、
(1)簡単なスレッドプログラミング及びスレッドの動作について解説せよ。
(2)相互封鎖や相互実行が起こるプログラムを作成し、その動作を解説せよ。
(3)マルチスレッドで、turnやflagを使った排他制御のプログラムを作成し、その動作を解説せよ。
(4)消費者・生産者問題のプログラムを解説せよ。
です。宜しくお願いします。
0714713
2005/08/02(火) 18:19:29検索しましたが、javaばかりでCが載ってないので聞いてみました。
ヒントだけでもいいのでお願いします。
0715ヒント
2005/08/02(火) 18:59:15こちらへどうぞ
マルチスレッドプログラミング相談室 その3
http://pc8.2ch.net/test/read.cgi/tech/1098268137/l50
0716デフォルトの名無しさん
2005/08/02(火) 19:06:19スレ違い。
マルチスレッドプログラミングスレなどへどうぞ。
http://pc8.2ch.net/test/read.cgi/tech/1118072681/
0717デフォルトの名無しさん
2005/08/02(火) 20:15:34PerlでDBI、これ最強
0718デフォルトの名無しさん
2005/08/02(火) 20:20:320719デフォルトの名無しさん
2005/08/02(火) 20:21:54printf("あいうえお");
putchar('\r');
fflush(stdout);
printf("かきくけこ");
fflush(stdout);
0720デフォルトの名無しさん
2005/08/02(火) 20:35:55わかりました。ありがとうございます
0721デフォルトの名無しさん
2005/08/02(火) 20:59:14もう見てないかも知れないが注意すべき点を書いておく。
\r (CR) でカーソルが行の先頭に動くというのはそういう風に動く
端末だからであって、これは全世界の端末が必ずそう動くという
保証はない。カーソルが全く動かず無視される端末もある。
0722デフォルトの名無しさん
2005/08/02(火) 21:03:24ワイド文字は内部的にはどのエンコードで保存されているかは環境依存ということで合ってますか?
ある文字のワイド文字での値は環境ごとに異なることも十分にあり得るということでOK?
0723デフォルトの名無しさん
2005/08/02(火) 21:11:54環境ごとに違うっつーか
「ワイド文字列 (って何だ?)」 をそもそも認識しない
という素敵空間の方が世の中の8割を占めております
0724デフォルトの名無しさん
2005/08/02(火) 21:17:12\rをprintfで出力しないのはなぜ?
>>721
確かにそうかもしれないが
標準では行頭へ移動することが決められている
printf("a\n");とかも無視される処理系があるかもしれんし
「規格通りではない処理系がある」という話はキリがないぞ
(少なくともこのスレでは)ナンセンスな話だ
0725デフォルトの名無しさん
2005/08/02(火) 21:32:35どうだろうな 出力先にも寄るし
printfの出力先はコンソールだけじゃないことを
肝に銘じておいてクダサイ。
0726デフォルトの名無しさん
2005/08/02(火) 21:34:06知っていて損はない程度か。
0727デフォルトの名無しさん
2005/08/02(火) 21:46:05\r を printf で出力しないのは気分の問題。
しかし \r で CR の動作をするは「標準」というよりは
デファクトスタンダードなのでは?
0728デフォルトの名無しさん
2005/08/02(火) 21:49:26そこまで規格で決められてるのか?
0729デフォルトの名無しさん
2005/08/02(火) 21:54:16プリンタの制御コードがハシリなのかと調べてみてるけど
見つからない。
0730デフォルトの名無しさん
2005/08/02(火) 21:59:23>>724
>>標準では行頭へ移動することが決められている
ここでいう「標準」って、何の事を指している?
0731730
2005/08/02(火) 22:17:05せめて、言語仕様(規格?)で '\r' が「復帰」を表す制御文字であることと、
制御文字「復帰」の振舞い(動作)の期待が何に基づいているのか、
の区別はしたほうがいいぞ。
0732デフォルトの名無しさん
2005/08/02(火) 22:59:405.2.2
実行文字集合中の非図形文字を表す英字逆斜線表記は, 次に列挙する表示装置上での動作を生じることを意図する。
:
:
\r 復帰 (cariage return) 現表示位置をその行の最初の位置に移動する。
意図するって何だよ。ファイルに書き込む場合は別だってさ。
0733デフォルトの名無しさん
2005/08/02(火) 23:04:45合ってる。
同じエンコードの同じ文字を表現するマルチバイト文字をwchar_tにし
ても、実際Windows、glibc、NetBSDでwchar_tの値がまったく違う。
0734デフォルトの名無しさん
2005/08/02(火) 23:25:35ア) 規格で保証されている。
イ) 保証はされていないが、ほとんどの処理系でそうなってる。
ウ) そんなことは全然無い。
質問2 1の回答がア・イの場合。(ウの場合は無視してくれい) 整数型をint型で
宣言ていれば他の型よりも速いコードとなる確率が高い。
エ) そう。(←この答えの場合解説をつけてくれるとありがたい)
オ) そんなことは無い。
よろしくおねがいします。
0735デフォルトの名無しさん
2005/08/02(火) 23:25:410736デフォルトの名無しさん
2005/08/02(火) 23:28:48ウ
0737デフォルトの名無しさん
2005/08/02(火) 23:30:091 ウ たとえばDOS/Win16ではintは16ビット、farポインタは32ビット。Win64はintは32ビット、ポインタは64ビット。
代わりにC99の<stdint.h>のintptr_t/uintptr_tがポインタと相互変換しても値不変を保証する型として存在する。
2 エ intは実行する環境で最も自然な型となっているのだから早いと言うのも期待していいだろう。
0738デフォルトの名無しさん
2005/08/02(火) 23:30:37組み込み系まで入れればバラバラだし
0739734
2005/08/02(火) 23:37:470740730
2005/08/02(火) 23:46:47だから、「意図している」(期待している?)だけであって、
動作が生じることを定義や決定しているわけでないよなあ。
なわけで、>>724あたりが何を言ってるのかよくわからんと。
0741デフォルトの名無しさん
2005/08/03(水) 00:26:29テストをする標準的な方法は無いんでしょうか?
filenoでディスクリプタを取り出して環境依存のpollを
するのは避けたいと思っています
0742デフォルトの名無しさん
2005/08/03(水) 00:58:19>>732のことです
>>740
「意図している」の定義の差ですな
「〜なければならない」とはやっぱ違うのか…
ナンセンスは言い過ぎだったかも
0743デフォルトの名無しさん
2005/08/03(水) 01:44:01shall はついてないから必ずそうなるって言ってるわけじゃなさそう。
0744730
2005/08/03(水) 05:50:48>>742 ということなら、「C言語の規格」のその部分のみ(?)を基に、
>>標準では行頭へ移動することが決められている
と言うのはナンセンス(というか間違い)だし、つぅか……、
>>「〜なければならない」とはやっぱ違うのか…
あたりまえだ。「意図している」としか読みようが無いので、
擁護しようが無い。721のほうがまだまとも。
まあ、もともと718の上書きって、どういうデバイスに対して
どうしたいのか、さっぱりだし、それはこのスレの話かと…
0745デフォルトの名無しさん
2005/08/03(水) 12:46:12#include<stdio.h>
int gcd( int m, int n );
int lcm( int m, int n );
int main(void)
{
int m,n,x,y;
while(1){
printf("(実数)\n");
scanf("%d%d",&m,&n);
if(m>2000000000||n>2000000000)
printf("ERROR\n");
else
break;
}
x=gcd(m,n);
y=lcm(m,n);
printf("\n%d\n",x);
printf("%d\n",y);
return 0;
}
0746デフォルトの名無しさん
2005/08/03(水) 12:46:52// 最大公約数(Greatest Common Divisor)を返す。
//*********************************************************
int gcd( int m, int n )
{
while( m != n )
{
if ( m > n ) m = m - n;
else n = n - m;
}
return m;
}
//*********************************************************
// 最小公倍数(Least Common Multiple)を返す。
//*********************************************************
int lcm( int m, int n )
{
return ((m / gcd(m, n)) * n);
}
このプログラムを最小公倍数が20億を超えないようにするにはどうすればよろしいでしょうか??
よろしくお願いいたしますm(__)m
0747デフォルトの名無しさん
2005/08/03(水) 13:04:53マルチ乙
0748デフォルトの名無しさん
2005/08/03(水) 13:05:520749デフォルトの名無しさん
2005/08/03(水) 13:59:08そうしろって教師に言われた
0750デフォルトの名無しさん
2005/08/03(水) 21:03:36関数を授業で使わせる教師は逝ってよしだな
0751デフォルトの名無しさん
2005/08/03(水) 21:24:290752デフォルトの名無しさん
2005/08/03(水) 21:59:02エキスパートなら使いこなせるが、使わないだけだ
クライアントに使えと指示されればきちんと問題なく使うのがプロ
0753デフォルトの名無しさん
2005/08/03(水) 22:24:40scanfを使いこなせないのは>>750だけ
0754デフォルトの名無しさん
2005/08/04(木) 02:33:07C++プログラマは char* ptr と書く
この違いはなんなんですか
0755デフォルトの名無しさん
2005/08/04(木) 02:46:48俺はC++プログラマだけど、char *ptr って書くぞ。
Cプログラマは i++ と書く
C++プログラマは ++i と書く
って話なら分かるけど。
0756デフォルトの名無しさん
2005/08/04(木) 02:58:33「char*」で1つの型だと考えるからくっ付けたくなるのでは?
0757デフォルトの名無しさん
2005/08/04(木) 03:16:26char* a, b; とした時に a と b が異なる型になるんで、俺は「char *ptr」派。
もっとも、一文で複数の変数宣言するようなことはやらんけど。
0758デフォルトの名無しさん
2005/08/04(木) 03:39:23これにあわせてポインタも char *a とはしないんじゃないの?
0759デフォルトの名無しさん
2005/08/04(木) 03:45:340760デフォルトの名無しさん
2005/08/04(木) 11:14:410761デフォルトの名無しさん
2005/08/04(木) 11:18:300762デフォルトの名無しさん
2005/08/04(木) 11:47:41そんなんでウケ取れるとかマジで思ってんの?
0763デフォルトの名無しさん
2005/08/04(木) 12:22:47誰かお願いします
課題内容
与えられた有向グラフGに対し,強連結成分を求めるプログラムを作りなさい
ただし,Gの入力は以下の形式に記述されたテキストファイルによるものとする:
Gの頂点数
Gの隣接行列
たとえば、次は頂点数が4のグラフの例である.
4
0 1 −1 0
−1 0 1 −1
1 −1 0 −1
0 1 1 0
また,出力は各強連結成分について,含まれる頂点を1行に書き出すこと.
たとえば,上の例のグラフの場合,出力は以下のようになる:
component 1: 4
component 2: 1 2 3
0764デフォルトの名無しさん
2005/08/04(木) 12:29:00ここは宿題を丸投げするスレじゃねえよボケ
0765デフォルトの名無しさん
2005/08/04(木) 12:31:12ぼるじょあがC/C++の宿題を片づけますYO! 48代目
http://pc8.2ch.net/test/read.cgi/tech/1121471445/
0766デフォルトの名無しさん
2005/08/04(木) 12:53:140767デフォルトの名無しさん
2005/08/04(木) 12:54:08なんだその態度は
0768デフォルトの名無しさん
2005/08/04(木) 13:02:370769ビル・ジョブス
2005/08/04(木) 15:00:240770デフォルトの名無しさん
2005/08/04(木) 15:31:27いや、俺は萌えた<「しみません」
0771デフォルトの名無しさん
2005/08/04(木) 22:29:14char &a
が、なんで参照になるのか、わからない・・・
aのアドレスがchar型?
0772デフォルトの名無しさん
2005/08/04(木) 22:30:56単に適当な記号を使っただけと思え。
0773デフォルトの名無しさん
2005/08/04(木) 23:08:28* 「ア」ス「タ」リスク→アタイ(値)
覚えやすいように決めたんだよ...
0774デフォルトの名無しさん
2005/08/04(木) 23:09:54氏ね
0775デフォルトの名無しさん
2005/08/05(金) 01:07:09>>760
ナカーマ
規格書も*の両側にスペース入ってるね
0776デフォルトの名無しさん
2005/08/05(金) 01:26:15char mojiretu[] = "ABC";
int suuji = 3;
strcpy(mojiretu, suuji);//×
strcpy(mojiretu, (char)suuji);//×
0777デフォルトの名無しさん
2005/08/05(金) 01:32:04がんばれ!
0778デフォルトの名無しさん
2005/08/05(金) 01:45:19sprintf(mojiretsu, "%d", suuji);
0779デフォルトの名無しさん
2005/08/05(金) 01:45:21突っ込みどころの指摘だけしておく。
環境にもよるがintは大概4バイトなので、配列の長さは4以上と明示しておくべきかな。
strcpyはコピー元がNULL終端の文字列で、コピー先に十分なサイズがあることが保障されてるときのみ有効。
安全なプログラムを組みたいならsrtncpyを使いましょう。
0780デフォルトの名無しさん
2005/08/05(金) 01:47:04えっ
0781デフォルトの名無しさん
2005/08/05(金) 01:48:52むしろこっちがやりたいかと思った。
strncpy(mojiretu, (char *)&suuji, sizeof(int));
0782デフォルトの名無しさん
2005/08/05(金) 01:50:00数「字」を入れたいって書いてあるからなぁ。>>778じゃない?
0783デフォルトの名無しさん
2005/08/05(金) 01:51:54memcpy の方がふさわしい
0784776
2005/08/05(金) 08:03:15提示された方法で試してみます
0785デフォルトの名無しさん
2005/08/05(金) 08:35:10sprintf(mojiretsu, "%s%d", mojiretsu, suuji);
0786デフォルトの名無しさん
2005/08/05(金) 08:38:26int suuji = 3;
char mojiretu[] = "ABC";
char gousei[10];
sprintf(gousei, "%s%d", mojiretsu, suuji);
0787デフォルトの名無しさん
2005/08/05(金) 08:40:44>>784
char mojiretu[80] = "ABC"; /*文字列の長さを変えたい場合は配列長は大きめにとっておけ。[]だと長さは4で、終端文字を除けば3文字しか表現できない */
int suuji = 3;
0788デフォルトの名無しさん
2005/08/05(金) 08:43:22char mojiretu[80] = "ABC";
char tmp[10];
sprintf(tmp, "%d", suuji);
strcat(mojiretu, tmp);
0789デフォルトの名無しさん
2005/08/05(金) 08:58:50sprintf(tmp + strlen(temp), "%d", suuji);でいいだろ。
0790デフォルトの名無しさん
2005/08/05(金) 09:39:08sprintf(strchr(mojiretu, '\0'), "%d", suuji);
0791デフォルトの名無しさん
2005/08/05(金) 10:37:32> sprintf(mojiretsu, "%s%d", mojiretsu, suuji);
sprintfのパラメータは restrict ポインタなので、これはダメだろう。
0792デフォルトの名無しさん
2005/08/05(金) 10:40:100793デフォルトの名無しさん
2005/08/05(金) 17:09:0746行目で変数宣言できないと言われ、かつ定数式が必要と6つも出てきた…
OS:XP
言語:C
コンパイラ:BCC です。
タダのコンパイラではやはり無理なのでしょうか?
アルゴリズムについてはせめないで。。
ソースはこちら:
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/843.txt
0794デフォルトの名無しさん
2005/08/05(金) 17:30:42malloc-freeでも使え、自分でくぐれよ
0795デフォルトの名無しさん
2005/08/05(金) 18:10:12c99として書いている積もりならgccでも使え。
>>794
>くぐれよ
何を? リンボーダンス?
0796デフォルトの名無しさん
2005/08/05(金) 19:56:24whileの意味無いじゃん。
何が起きても一回目で外に出る。
しかも>>748じゃね?
0797デフォルトの名無しさん
2005/08/05(金) 20:05:39whileはおそらく最初はbreakで抜けるためのワザのつもりだったと思う
0798デフォルトの名無しさん
2005/08/05(金) 20:27:570799デフォルトの名無しさん
2005/08/05(金) 20:44:28C99で追加された奴だよな。
restrictがついたポインタは、それらが同じ領域のデータを
示すことが無いとこをコンパイラーに伝えるらしい。
同じ領域を示した時の挙動は未定義。
0800デフォルトの名無しさん
2005/08/05(金) 21:28:25結局、同じ領域かどうか、プログラマが気を使わないといかんの?
0801デフォルトの名無しさん
2005/08/05(金) 21:45:17同じ領域でないことをプログラマが保証することで、
コンパイラは安全に最適化を行うことができる。
>プログラマが気を使わないといかんの?
C言語はそういうもの。
0802デフォルトの名無しさん
2005/08/05(金) 21:59:260803デフォルトの名無しさん
2005/08/05(金) 22:09:38最適化に利用している処理系もあるというべきだろう。
あくまでコンパイラに伝えるのが主目的だから何に使うかは処理系の自由。
~~~~~~
他にも
void *memcpy(void * restrict s1, const void * restrict s2, size_t n);
とすることでプログラマに注意を促す用法もある。
0804デフォルトの名無しさん
2005/08/05(金) 22:28:16なんで変数宣言できないのかがわからない…
変数が使われる前ならどこでもいいのでは?
0805デフォルトの名無しさん
2005/08/05(金) 22:30:200806デフォルトの名無しさん
2005/08/05(金) 22:37:03決まりに従え
0807デフォルトの名無しさん
2005/08/05(金) 22:37:47ブロック内での変数宣言は使う前ならどこでもよいというのは、
最新のCの規格(通称C99)ではいいのだが、それ以前の規格では認められていなかった。
そして現在C99に対応しているコンパイラはgccくらいしか知られていない。
C++では全然問題なく行えるのだが、ここはCのスレなのでスレ違い。
(ちなみにC++でできるからC99で取り入れられた)
0808デフォルトの名無しさん
2005/08/05(金) 22:41:21引数は始点のX,Y座標、終点のX,Y座標、色番号の5つとするってきまっているんですが
あと、それを使って「H.K」という文字を線で描画したいのですが
0809デフォルトの名無しさん
2005/08/05(金) 22:45:39標準Cだけではできないから悪いけどスレ違い。
0810デフォルトの名無しさん
2005/08/05(金) 22:52:38ヒント:ブレゼンハム,pnm
0811デフォルトの名無しさん
2005/08/05(金) 22:55:47>決まりに従え
>>807
>最新のCの規格(通称C99)ではいいのだが、それ以前の規格では認められていなかった。
それ以前の決まりとは??
特にその点に触れた本を読んだことがない
0812デフォルトの名無しさん
2005/08/05(金) 23:00:06「そう思うから」宣言できなきゃおかしいと考えるのはウン子
0813デフォルトの名無しさん
2005/08/05(金) 23:00:30C90,C89
最近のC言語の教科書は、C99ベースで書かれているの?
へ〜。
0814デフォルトの名無しさん
2005/08/05(金) 23:00:380815デフォルトの名無しさん
2005/08/05(金) 23:02:240816デフォルトの名無しさん
2005/08/05(金) 23:07:25そーいやANSIで採用された関数の引数の書き方もC++(C with Classes)由来だな。
0817デフォルトの名無しさん
2005/08/05(金) 23:07:33スマソ。K&Rに載ってた。関数最初の実行可能部分…
>>793のソースで最初に scanf でm と n と l を取得して、そのサイズの配列を作るにはどうすればいいのか。。
うまい解決法はないものか?
0818デフォルトの名無しさん
2005/08/05(金) 23:09:39malloc
「麻呂ck」って読む奴が嫌いだ
0819デフォルトの名無しさん
2005/08/05(金) 23:13:06って読まなきゃ駄目?
0820デフォルトの名無しさん
2005/08/05(金) 23:14:21「まろっく」でいいじゃないか。
# 実際、どっちでもいい。
0821デフォルトの名無しさん
2005/08/05(金) 23:14:290822デフォルトの名無しさん
2005/08/05(金) 23:15:32C90じゃなくてC95だろ。
>>811
ちなみにそれ以前の規格(C89)はこれのことね。
ANSI X3.159-1989
ISO/IEC 9899 : 1990
0823デフォルトの名無しさん
2005/08/05(金) 23:16:280824デフォルトの名無しさん
2005/08/05(金) 23:19:35そんな理由で俺を嫌わないでくれ。
0825デフォルトの名無しさん
2005/08/05(金) 23:20:24malloc でビープ領域に作られた領域のアドレスが帰ってきて、
それをどうやって後で取得する l と m と n に関連付けるのか、実際の運用方法が分からない。。
malloc の引数は領域のバイトサイズだけど、配列の大きさが決まらないうちは使いようがないのでは?
Parray=malloc(sizeof(なんちゃら));
みたいにやるのか?
0826デフォルトの名無しさん
2005/08/05(金) 23:21:59頼む、このスレだとネタ扱いしかされないから初心者スレに逝ってくれ。
0827813
2005/08/05(金) 23:23:58フォロー、サンクス。
C90は、これのことです。
> ISO/IEC?9899?:?1990
# もしかして、間違ってるのか。ちょっと調べてみる
0828デフォルトの名無しさん
2005/08/05(金) 23:24:01何でお前はこんなにも定石を知らないんだ?
いったい何を読んで学んできたんだか不思議でならないんだが。
0829デフォルトの名無しさん
2005/08/05(金) 23:24:28scanf()を呼んだ後にmalloc()を呼べばいいだけだろ。
0830デフォルトの名無しさん
2005/08/05(金) 23:28:05おさわがせしました
0831デフォルトの名無しさん
2005/08/05(金) 23:28:15ANSI C89とISO C90はどっちも同じ内容。
C95はAmendment1。
0832デフォルトの名無しさん
2005/08/05(金) 23:34:04int **matrix;
int i;
matrix = (n * sizeof(int*));
matrix[0] = (n * m * sizeof(int));
for(i = 1; i < n; i++) matrix[i] = matrix[i-1] + m ;
開放はこの順で。
free(matrix[0]);
free(matrix);
malloc一回で済ます方法もあるがあんま綺麗じゃないので。。。
この手のプログラムは自分で書く必要があったときはC++で組むからあんま困ったことは無いな。
0833デフォルトの名無しさん
2005/08/05(金) 23:35:11matrix = malloc(n * sizeof(int*));
matrix[0] = malloc(n * m * sizeof(int));
0834デフォルトの名無しさん
2005/08/06(土) 06:09:34db 100h dup(-1)
などとできるわけですが、Cの場合、どうすればよいのでしょうか?
char buf[0x100] = ???
0835デフォルトの名無しさん
2005/08/06(土) 08:14:08memset(buf, -1, sizeof(buf));
0836デフォルトの名無しさん
2005/08/06(土) 08:23:16確かに普通はそう書くけど、
>>834 のアセンブラとは等価じゃないよね。
オブジェクト内に256個 -1 が埋め込まれるっていうのが>>834の目的だとしたら、
の話だけど。
0837デフォルトの名無しさん
2005/08/06(土) 08:27:05-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, };
0838デフォルトの名無しさん
2005/08/06(土) 15:36:260839デフォルトの名無しさん
2005/08/06(土) 15:48:450840デフォルトの名無しさん
2005/08/06(土) 15:50:230841838
2005/08/06(土) 15:53:57ありがとう。
0842デフォルトの名無しさん
2005/08/06(土) 16:36:02-----------------------------------------
#define STRICT
#include <windows.h>
#include <stdio.h>
#include <string.h>
int main()
{
UINT a=0x88888888;
BYTE b[8];
memcpy(b+4,&a,sizeof(UINT));
memcpy(b,&a,sizeof(UINT));
return 0;
}
-----------------------------------------
なんでコピーされないの?bは0で埋められてしまいます。
memcpy()で、ちゃんとコピーできる(bを8で埋める)方法を教えて下さい。
0843デフォルトの名無しさん
2005/08/06(土) 16:44:50初心者は初心者スレへどうぞ。
あ、ちなみにそのコードでbにはきちんと0x88が格納されますよ。
0844デフォルトの名無しさん
2005/08/06(土) 16:47:500845デフォルトの名無しさん
2005/08/06(土) 17:00:59のほうが気になってくるなあ…… でもスレ違い。
0846デフォルトの名無しさん
2005/08/06(土) 18:03:200847デフォルトの名無しさん
2005/08/06(土) 18:12:04* (unsigned int*)(b+4) = a;
* (unsigned int*)(b) = a;
0848デフォルトの名無しさん
2005/08/06(土) 18:16:12もしかして:
BYTE b[9];
sprintf(b, "%x", a);
0849デフォルトの名無しさん
2005/08/06(土) 18:16:22windows.hでtypedefされてる。
0850デフォルトの名無しさん
2005/08/06(土) 18:18:133年ROMってろボケ
0851デフォルトの名無しさん
2005/08/06(土) 18:29:260852デフォルトの名無しさん
2005/08/06(土) 18:33:343年ROMってろボケ
0853デフォルトの名無しさん
2005/08/06(土) 18:37:050854デフォルトの名無しさん
2005/08/06(土) 18:39:48> てかDWORD単位でコピーするならmemcpyなんて使う必要ないわけで
>
> * (unsigned int*)(b+4) = a;
> * (unsigned int*)(b) = a;
こういうことすると環境によってはアクセス違反でプログラムが落ちますよ
0855デフォルトの名無しさん
2005/08/06(土) 18:41:16どんな環境で落ちるの?それはmemcpyで解決するの?
0856デフォルトの名無しさん
2005/08/06(土) 18:41:36環境によってはとかくだらないこと考える必要は無い
0857デフォルトの名無しさん
2005/08/06(土) 18:47:06エンディアンの違いとか?
この手のテクってMMXやSSE使う場面では常套手段だし
そもそもWindowsのヘッダなんて使ってる時点でおもっきし環境依存だから問題茄子
0858デフォルトの名無しさん
2005/08/06(土) 18:47:340859デフォルトの名無しさん
2005/08/06(土) 18:49:030860デフォルトの名無しさん
2005/08/06(土) 18:50:46キャストでデータ構造さえ変わらない限り型のサイズさえあってればなんでもいいと思う
0861デフォルトの名無しさん
2005/08/06(土) 18:50:564バイト境界以外での、DWORDアクセスや、
奇数番地へのWORDアクセスを許さないプロセッサもある
そういうプロセッサ用のライブラリでは、
memcpy内でコピー開始アドレスを判定して、
BYTE, WORD, DWORD を使い分けて書き込む用になってる
0862デフォルトの名無しさん
2005/08/06(土) 18:55:05使ったことないけど。
0863デフォルトの名無しさん
2005/08/06(土) 18:56:520864デフォルトの名無しさん
2005/08/06(土) 19:00:57普通はそういうプロセッサ向けのコンパイラならバイト配列変数の先頭をアラインメント合わせると思うけど。。。
ま、パフォーマンスが重要な部分では基本的にデータを16バイト境界で合わせてmovdqa使えるように
してるけどね。
0865デフォルトの名無しさん
2005/08/06(土) 19:12:20前者のaは配列。後者のaはポインタ。
0866デフォルトの名無しさん
2005/08/06(土) 19:17:33前者は int型に対するアドレスの配列(要素数10)
と、
後者はint型配列(要素数10)に対するポインタ
0867デフォルトの名無しさん
2005/08/06(土) 20:04:41それは知っている世間が狭すぎ。
例えばSunOSでお馴染みのSparcでは、charの配列は隙間無しに詰め込む実装もある。
4バイト境界をはみ出すintアクセスがcoreを吐くにも関わらず、ね。
あー、intは4バイト境界だけどdoubleに至っては8バイト境界になるからもっとややこしいな。
0868デフォルトの名無しさん
2005/08/06(土) 20:37:05まぁ、あるんだから仕方ない。
0869デフォルトの名無しさん
2005/08/06(土) 20:39:55SunOS&SPARCは利用頻度の低い命令はCPUには実装せず例外をトラップしてOSが提供するって実装じゃなかたっけ?
0870デフォルトの名無しさん
2005/08/06(土) 20:49:310871デフォルトの名無しさん
2005/08/06(土) 20:55:01ローエンドサーバはOpteronベースに差し替えてるし、そのうち終わるよ。
0872デフォルトの名無しさん
2005/08/06(土) 20:55:030873デフォルトの名無しさん
2005/08/06(土) 21:01:130874デフォルトの名無しさん
2005/08/06(土) 21:17:50落ちたりしないんだよな
でもメモリアクセスが無意味に2倍になるから
気をつけて書いたほうがスピードは上がるな。
0875デフォルトの名無しさん
2005/08/06(土) 21:19:560876デフォルトの名無しさん
2005/08/06(土) 21:31:07まあアラインメントが保障されない場合向けのロードストアの手段も提供されてるからいいが
キャッシュラインのこともあるし、どちらにしろアラインメントはきちんと合わせるので
落とし穴にははまることはまず無いと思うが
0877デフォルトの名無しさん
2005/08/06(土) 22:21:10他にも冗長な部分があれば指摘していただけるとありがたいです。
プログラムの説明は↓に上げたソース内にコメントとして書いたのですが、足りないところがありましたら
お手数ですが逐次聞いてください。
ttp://oekaki.s56.xrea.com/x/uploader/src/oe2312.txt
0878デフォルトの名無しさん
2005/08/06(土) 22:24:42詩ね
0879デフォルトの名無しさん
2005/08/06(土) 22:25:18ゲーム作成板もしくは宿題スレへどうぞ
0880デフォルトの名無しさん
2005/08/06(土) 22:33:07コンパイルはできるけど実行途中でエラーがでる。。
/* int a[l][m],b[m][n],p[l][n]; が使いたい */
a=malloc(l*sizeof(int*));
a[0]=malloc(l*m*sizeof(int));
for(h=1;h<l;h++) a[h]=a[h-1]+m*sizeof(int);
b=malloc(m*sizeof(int*));
b[0]=malloc(m*n*sizeof(int));
for(h=1;h<l;h++) b[h]=b[h-1]+n*sizeof(int);
p=malloc(l*sizeof(int*));
p[0]=malloc(l*n*sizeof(int));
for(h=1;h<l;h++) p[h]=p[h-1]+n*sizeof(int);
:
free(a[0]); free(a);
free(b[0]); free(b);
free(p[0]); free(p);
あと、次の質問に部分的でもいいので答えてくれたらとても助かる…
配列とポインタは表現形式が違うだけで本質的には全く同じものなのですか?違うとしたら、どこあたりなんですか?
int **aa;int *a[];int aa[][]; と宣言するのは全く同じこと?
0881デフォルトの名無しさん
2005/08/06(土) 22:34:12誘導ありがとうございます。
宿題ではないのでゲーム製作板に行ってみます
0882デフォルトの名無しさん
2005/08/06(土) 22:37:41ダメ。
本質的に違う。
0883デフォルトの名無しさん
2005/08/06(土) 22:38:04○ for(h=1;h<l;h++) p[h]=p[h-1]+n
int型へのポインタに対する足し算引き算は、デフォでint型のサイズ単位なのでsizeof(int)をかけてやる必要は無い
0884デフォルトの名無しさん
2005/08/06(土) 22:43:51http://pc8.2ch.net/test/read.cgi/tech/1121644782/258n
配列とポインタは別物。だけど同じような感覚で使えるようになっているからややこしい。
配列変数は要素数分格納できるだけのメモリが用意される。
ポインタ変数は単に他のメモリを指せるだけのメモリしか持たない。
0885デフォルトの名無しさん
2005/08/06(土) 22:44:16(1)ポインタに対して[] 演算子を使える。 int *p; p[0] = 100;
(2)配列の識別名は、単独で使うと先頭要素へのポインタとなる。
(3)関数の引数に配列表現を使用するとそれはポインタとまったく同じ。void for(int a[]);
これら3点はあくまでも例外的な用法。
本来ポインタと配列ははまったくの別物。
0886デフォルトの名無しさん
2005/08/06(土) 22:44:45sizeof 消しても Windows が怒ってくる。マ社に報告しますか。。と
0887デフォルトの名無しさん
2005/08/06(土) 22:47:280888デフォルトの名無しさん
2005/08/06(土) 22:48:130889デフォルトの名無しさん
2005/08/06(土) 22:52:26p=malloc(l*sizeof(int*));
p[0]=malloc(l*n*sizeof(int));
for(h=1;h<l;h++) p[h]= &p[h-1][n];
配列サイズをちゃんと記憶しておけるならトリッキーな方法を用いる必要はない。
したがって別にこれでも構わないし
p=malloc(l*sizeof(int*));
for(h=0;h<l;h++) p[h]=malloc(n*sizeof(int));
0890デフォルトの名無しさん
2005/08/06(土) 22:52:46malloc の中身はそのまま。ソースしうpしたので。。goto については今日は見逃すということで…(汗)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/847.txt
0891デフォルトの名無しさん
2005/08/06(土) 23:01:32「9人が数学のテストを受けその結果が それぞれ 50,78,91,61,42,77,82,33,84,点だった。
この平均を求め、60点を超えた人が何人いるか求めるプログラムを書け。」
という問題で、
#include <stdio.h>
main(){
int a[]={50,78,91,61,42,77,82,33,84};
int t=0,i,c=0,n=9;
double ave;
for(i=0;i<n;i++){
t += a[i];
ave = t/n;
if(a[i] > 60){
c++;}}
printf("avelage : %f\n",ave);
printf("over 60 : %d\n",c);
return 0;}
としたのですが、n=9といちいちテストを受けた人数を代入しなければならないんでしょうか?
配列の中の数値の個数をnの代わりに使えるような表し方はありませんか?
よろしくお願いします。
0892デフォルトの名無しさん
2005/08/06(土) 23:02:44n = sizeof(a)/sizeof(a[0])
0893デフォルトの名無しさん
2005/08/06(土) 23:03:43その括弧は不要。
0894デフォルトの名無しさん
2005/08/06(土) 23:04:520895デフォルトの名無しさん
2005/08/06(土) 23:06:56かっこで漢字変換するといっぱいでてくるからな
0896891
2005/08/06(土) 23:08:030897デフォルトの名無しさん
2005/08/06(土) 23:14:590898デフォルトの名無しさん
2005/08/06(土) 23:16:260899デフォルトの名無しさん
2005/08/06(土) 23:19:120900デフォルトの名無しさん
2005/08/06(土) 23:19:51「あったらいけない」とかって強弁するのが
0901デフォルトの名無しさん
2005/08/06(土) 23:21:000902デフォルトの名無しさん
2005/08/06(土) 23:23:57sizeof a / sizeof a[0]
0903デフォルトの名無しさん
2005/08/06(土) 23:25:210904デフォルトの名無しさん
2005/08/06(土) 23:26:04見にくくて吐きそう
0905デフォルトの名無しさん
2005/08/06(土) 23:30:22#include <stdlib.h>
int **alloc_array2(int n, int m)
{
int i;
int pp_size = n * sizeof(int**); /* ポインタ配列のサイズ */
int p_size = n * m * sizeof(int); /* データエリアのサイズ */
/* ポインタ配列+データ格納エリアをまとめて確保*/
char *p = malloc(pp_size + p_size);
int **pp = (int**)p; /* 割り当てエリアの頭はポインタ配列用とする */
p += pp_size; /* データエリア先頭まで移動 */
pp[0] = (int*)p;
for(i = 1; i < n; ++i) pp[i] = pp[i-1] + m;
return pp;
}
void free_array2(int **pp){ free(pp[0]);}
int main()
{
/* int a[l][m],b[m][n],p[l][n]; が使いたい */
int l = 10, m = 20, n = 30;
int **a = alloc_array2(l,m);
int **b = alloc_array2(m,n);
int **c = alloc_array2(l,n);
/* a[1][2] = 100; みたいに使う。*/
free_array2(a);
free_array2(b);
free_array2(c);
return 0;
}
0906905
2005/08/06(土) 23:32:37void free_array2(int **pp){ free((char*)pp);}
こうかな。キャストいらないか?
0907デフォルトの名無しさん
2005/08/06(土) 23:35:15むしろキャストするなら void*
0908デフォルトの名無しさん
2005/08/06(土) 23:35:26外出>>884
0909デフォルトの名無しさん
2005/08/06(土) 23:41:11環境依存なのか?それとも、コーディングが間違っているのか。。
A(1,1)? : 1
A(1,2)? : 5
A(1,3)? : 3 ここで 3 を入力してやると強制的に問題発生になる。
C:\…>
0910デフォルトの名無しさん
2005/08/06(土) 23:46:350911905
2005/08/06(土) 23:47:34ほんとや。失礼。
ま、こういうのは実用化を考えたら、バッファとバッファサイズとディメンション情報を
まとめて情報管理構造体にして、各種処理関数を実装するのがいいだろうな。
0912デフォルトの名無しさん
2005/08/06(土) 23:58:14C++のが楽。vectorやvalarrayから派生すればいいし。
0913デフォルトの名無しさん
2005/08/07(日) 00:30:07C++のおいしいとこだけ使いたいんだけど難しいわ・・・
0914デフォルトの名無しさん
2005/08/07(日) 00:30:420915デフォルトの名無しさん
2005/08/07(日) 00:40:460916デフォルトの名無しさん
2005/08/07(日) 02:34:59int a
の数値が正負それぞれの場合
02
-02
の様に表示したいのですが、
%02d
を指定しても、正の場合は02と表示されるのですが、負の場合は-2と表示されてしまいます。
どのような書式指定子を書けばよいのでしょうか。
0917デフォルトの名無しさん
2005/08/07(日) 02:55:120918デフォルトの名無しさん
2005/08/07(日) 13:32:44は左寄せだろ
0919デフォルトの名無しさん
2005/08/07(日) 15:30:37+だな
0920デフォルトの名無しさん
2005/08/07(日) 17:17:15#define MACRO(X) = {X, #X};
struct STRUCT{ int, char[10] };
struct STRUCT = MACRO(name);
char[]に、#nameが代入されているように見えるんですが、どういう意味でしょう?
0921デフォルトの名無しさん
2005/08/07(日) 17:27:000922デフォルトの名無しさん
2005/08/07(日) 17:34:29#defineなどの中での#は続く字句を文字列リテラル化する効果がある。
つまりMACRO(name)は{name, "name"}と展開される。
0923デフォルトの名無しさん
2005/08/07(日) 17:45:21変数名をそのままキー名にすんの。
最終的には、めんどくさくなったのでPerlでコードジェネレータ書いたww
0924デフォルトの名無しさん
2005/08/07(日) 17:59:420925デフォルトの名無しさん
2005/08/07(日) 18:04:200926デフォルトの名無しさん
2005/08/07(日) 18:46:11それまでの読み込んだ文字をカンマでひとつずつ区切り変数に格納し、
スペース文字がきたらスルーする様な
細かい作業が必要なとき、
fgetcで一文字ずつ判別する方法は分かったのですが
fgetsでまとめて読み込んで変数に格納し、その内容を
編集する方法の方が効率がよく早いらしいので、
その方法を教えてください。お願いします。
0927デフォルトの名無しさん
2005/08/07(日) 18:56:35> fgetsでまとめて読み込んで変数に格納し、その内容を
> 編集する方法の方が効率がよく早いらしいので、
それは幻想です
0928デフォルトの名無しさん
2005/08/07(日) 18:57:08char buf[1024];
int i;
(略)
fgets(buf, sizeof buf, fileptr);
buflen = strlen(buf);
for (i = 0; i < buflen; i++) {
//ここで buf[i] について何かの操作
}
効率云々って、単純に毎回呼ぶと関数コールの展開のオーバーヘッドの問題かと思う
0929デフォルトの名無しさん
2005/08/07(日) 19:09:02むしろ下手なコードで無駄に分岐を増やす方がとろくなる。
0930デフォルトの名無しさん
2005/08/07(日) 19:09:13あとはchar*を駆使してがんがれ
もしくはflex/bison(LEX/YACC)使うかだな
flexも-f/-Fオプション使うとread使うコード吐く
0931デフォルトの名無しさん
2005/08/07(日) 19:12:24スタック操作のオーバーヘッド軽減する機構付いてるってPentium Mくらいだけど?
単純なループならそれこそ分岐予測は当てやすい。
0932デフォルトの名無しさん
2005/08/07(日) 19:16:45入力元のデバイスや、ドライバ、OSなどによっては、ありうるとおもうけど。
なにも、ハイエンドなCPUやOS使ってる人ばかりじゃないだろう。
特に、今時純粋なC言語でアプリを組む必要が多いのは。
0933デフォルトの名無しさん
2005/08/07(日) 19:17:44本当にそう思うならコード書いて証明してみろ。話はそれからだ。
0934デフォルトの名無しさん
2005/08/07(日) 19:18:34(関数コール+分岐)*ループ回数よりも
関数コール+分岐*ループ回数のほうが速かろう。
0935デフォルトの名無しさん
2005/08/07(日) 19:20:33最適化されれば同じだっていってるんだろ。
本当かどうかはしらないが。
0936デフォルトの名無しさん
2005/08/07(日) 19:23:04いまどきも、ふるどきもスタック操作や関数コールでオーバーヘッドがでるのは変わらんがな。
いつからフォンノイマン型じゃなくなったんだ?
0937デフォルトの名無しさん
2005/08/07(日) 19:23:15夏だな
0938デフォルトの名無しさん
2005/08/07(日) 19:23:54別の関数呼び出し一つに変換するような機能がついているのか?
0939デフォルトの名無しさん
2005/08/07(日) 19:24:28じゃあ単純なループとやらを書いてくれ
>>934
ディスクアクセスを伴うプログラムの速度が単純にコードだけで議論できると?
0940デフォルトの名無しさん
2005/08/07(日) 19:24:56ICC9ですらそんなのは無いな。
0941デフォルトの名無しさん
2005/08/07(日) 19:28:07だからコード書いて検証してみろ。おまえのちんけな仮説など聞きたくない。
0942デフォルトの名無しさん
2005/08/07(日) 19:30:01ありがとうございます。
>>924
本ではないです。
>>923は会社の先輩かもしれません。
0943デフォルトの名無しさん
2005/08/07(日) 19:30:58ディスクアクセスの低減は、fgetcを使おうがfgetsを使おうが
ライブラリが行うことでは?
fgetcだけディスクアクセス低減の機能が入っていると仮定するのは
ちょっと無理が無いか?
0944デフォルトの名無しさん
2005/08/07(日) 19:40:16それこそベクトル化などのアグレッシブな最適化も使える罠(そこまで速度に拘る処理じゃないと思うが)
てか、CPU-メモリ間のバスに限って言えば、1バイトずつ転送するより8バイトなり16バイトなりブロック単位で
転送したほうが効率がいい筈だが。
0945デフォルトの名無しさん
2005/08/07(日) 19:43:31会社で最年少だけど。。。>>923は学生のときに書いたやつ。
0946デフォルトの名無しさん
2005/08/07(日) 19:49:170947デフォルトの名無しさん
2005/08/07(日) 19:51:24マクロ(かもしれない)のはgetcの方
0948デフォルトの名無しさん
2005/08/07(日) 20:02:180949926
2005/08/07(日) 20:05:30みんなありが�d
0950デフォルトの名無しさん
2005/08/07(日) 20:18:28同じにはならないよ
最適化処理さんが、その関数について
一回呼べばあとは毎回同じ結果を得るものか
それとも毎回結果が違うものか判断は出来ない
その判断ができるのはプログラマだけ
0951デフォルトの名無しさん
2005/08/07(日) 20:20:27int i;
for (i=0; i<1000000; i++) {
関数コール;
}
の場合、今時のCPUが分岐ミスするのはおそらく100万回に1回だが、
関数コールのオーバーヘッドはおそらく100万回発生する
0952デフォルトの名無しさん
2005/08/07(日) 20:21:25少なくとも>930みたいなアプローチをするよりは。
0953デフォルトの名無しさん
2005/08/07(日) 20:51:360954デフォルトの名無しさん
2005/08/07(日) 20:52:430955デフォルトの名無しさん
2005/08/07(日) 21:10:00プッ
0956デフォルトの名無しさん
2005/08/07(日) 21:15:06MS系の改行コードはCR+LF、MacはCRだから話がメンドイのよ。
0957デフォルトの名無しさん
2005/08/07(日) 21:45:03初心者なので上手く説明できないかもしれませんが、許して…
こんな配列があったとして、
Test[4] = ' ABC ';
Testは配列の先頭要素のアドレスを指しているのは分かったんですが、
*Test
で呼び出した時っていうのは、
配列の先頭要素のAだけを指すのか、
配列全体のABCを指すのかが、はっきりしません。
教えて下さい。
0958デフォルトの名無しさん
2005/08/07(日) 21:46:59その文章の中に「配列のポインタ」は一つも出てきていない。
Test はあくまでも、先頭要素へのポインタで。*Test は先頭要素のポインタ解決。つまり先頭要素の値。
0959デフォルトの名無しさん
2005/08/07(日) 21:51:05char *p1 = Test; /* 先頭要素へのポインタ */
char (*p2)[4] = &Test; /* 配列へのポインタ */
0960デフォルトの名無しさん
2005/08/07(日) 21:52:05Aだけ。
余談だがポインタ Test[0] と *(Test + 0) は等価で
0[Test] でも参照できる。
配列へのポインタの場合、その値に1を足すと、アドレスは、配列の要素単体のサイズではなく
配列自体のサイズ分だけ増加することに注意。
0961デフォルトの名無しさん
2005/08/07(日) 21:57:52交換法則により、*(Test + 0) は *(0 + Test) と等価。
したがって、 Test[0] も 0[Test] と等価である。
といわないと、わかんないだろ。
0962デフォルトの名無しさん
2005/08/07(日) 22:03:36ムダに知識をひけらかすのはよせって。
Test[0] == 0[Test]な話なんて知ってる必要全然ないし、混乱させるだけだって。
0963デフォルトの名無しさん
2005/08/07(日) 22:05:270964957
2005/08/07(日) 22:08:04>>960を読んで「え?(;´д`)」って混乱しました…。
>>961さん助かりました。なんとなくですが、賢くなった気がします。
しかし余計に分からなくなってしまった部分も…。
配列の要素全部を読み込ませたい時はどうすればよいのでしょうか。
for文使って1個ずつ要素を抜き出すしかないのでしょうか?
0965デフォルトの名無しさん
2005/08/07(日) 22:10:37だからアドレスが同じでも char *p; と int *p; は同じではない。
0966デフォルトの名無しさん
2005/08/07(日) 22:12:22>配列の要素全部を読み込ませたい時はどうすればよいのでしょうか。
>for文使って1個ずつ要素を抜き出すしかないのでしょうか
YES
0967デフォルトの名無しさん
2005/08/07(日) 22:14:40構造体の代入が出来ることを利用して。
struct A { char data[100]; };
struct A a;
struct A b;
a = b;
というテクニックはあるが、あまり使われない。
0968デフォルトの名無しさん
2005/08/07(日) 22:15:50> 配列の要素全部を読み込ませたい
というのがよくわからんが、他の配列にコピーしたいというような話なら
> for文使って1個ずつ要素を抜き出す
というのが一番わかりやすいのではないかと。
配列の内容が保持されているメモリ領域を指定して(memcpyなどで)丸ごと
コピーするというのもありだが。
0969デフォルトの名無しさん
2005/08/07(日) 22:17:27ポインタは、アドレスを保存すると同時に、その指し示す変数の型も表現している。
だからアドレスとサイズが同じでも float *p; と long*p; は同じではない。
0970デフォルトの名無しさん
2005/08/07(日) 22:22:39ものすごい冗長なコードが吐かれる罠。
普段組むときは配列は大抵STLから派生するのでそれに任せるし
タイムクリティカルな部分ならそれこそMOVQとかMOVDQAかな。
0971デフォルトの名無しさん
2005/08/07(日) 22:23:550972デフォルトの名無しさん
2005/08/07(日) 22:32:15C言語ってテンプレート使えるの?
#define マクロ駆使すれば、擬似的なこと可能?
0973デフォルトの名無しさん
2005/08/07(日) 22:33:22混じれ酢するとされてないよ。
テンプレートくらいは移植されてもいい気がするんだけどね。あと無名関数とかも欲しい。
マクロは使い難す。
0974デフォルトの名無しさん
2005/08/07(日) 22:37:280975デフォルトの名無しさん
2005/08/07(日) 22:38:05再帰みたいなことは無理だけど、もともとマクロの機能を整理したのがインライン関数だったり
テンプレートだったりする。
もちろん真似事程度には使える。
てかWin32のメッセージマップマクロまわりが結構それっぽいんだけど、MSにはできればアレをうまくテンプレート化してほしいと思っている。
0976デフォルトの名無しさん
2005/08/07(日) 22:43:020977デフォルトの名無しさん
2005/08/07(日) 22:45:41#include <string.h>
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(*(a)))
#define ARRAY_BEGIN(a) (a)
#define ARRAY_END(a) (ARRAY_BEGIN(a) + ARRAY_SIZE(a))
#define COPY_ARRAY_N(src,dst,n) memmove((dst), (src), (n)*sizeof(*(src)))
#define COPY_ARRAY(src_begin, src_end, dst) \
COPY_ARRAY_N(src_begin, dst, (src_end)-(src_begin))
int main()
{
int src[10],dst[10];
COPY_ARRAY_N(ARRAY_BEGIN(src), ARRAY_BEGIN(dst), ARRAY_SIZE(src));
COPY_ARRAY(ARRAY_BEGIN(src), ARRAY_END(src), ARRAY_BEGIN(dst));
return 0;
}
0978デフォルトの名無しさん
2005/08/07(日) 22:59:130979デフォルトの名無しさん
2005/08/07(日) 23:09:58入力:
標準入力から入力待ちをする
出力:
他プロセスから標準出力へ。入力待ち中でも、同じところに出力される
ので、混ざってしまって表示が変。
この出力だけを別の行に表示するようには出来ないでしょうか?
0980デフォルトの名無しさん
2005/08/07(日) 23:16:05標準関数だけでやる方法は知らないが、環境依存の方法ならいくらでもやり方はある。
0981デフォルトの名無しさん
2005/08/07(日) 23:21:33窓(or term) を入力用、出力用に二つ開いてプロセス間通信使えば?
0982デフォルトの名無しさん
2005/08/07(日) 23:27:16今はLinuxのbashでやっていますが、どんな方法があるのか検索のヒント
なりないでしょうか?
>>981
二つの窓でやるのは考えてもいませんでした。
Linux関係の知識は全くないのですが、一つ目のプロセスから別窓で
プロセスを実行させる方法があるのでしょうか?
0983デフォルトの名無しさん
2005/08/07(日) 23:28:44適したスレへ行け
0984デフォルトの名無しさん
2005/08/07(日) 23:30:03あんまいい方法じゃないけど、入力の画面エコーを抑止して、自分の都合のいいタイミングでstderrかなんかに
そのまんま吐かせる方法とか。
0985デフォルトの名無しさん
2005/08/07(日) 23:39:22プロセス云々にするときはLinux関係のとこに行って来ます。
>>984
出来れば入力してる内容はリアルタイムで見られるようにしたいと思っ
ています。注文ばっかりですみません。
これはなかなか難しいのでしょうか……
0986デフォルトの名無しさん
2005/08/07(日) 23:43:29お前は標準Cにこだわってるのか?
0987デフォルトの名無しさん
2005/08/07(日) 23:45:50最近のCに標準的に用意されてるようなライブラリ関数なら全く抵抗はないです。
0988デフォルトの名無しさん
2005/08/07(日) 23:48:50>>982
2つの窓を開いて、一方では入力用のプログラムを手動
で起動、もう一方で出力用のプログラムを手動で起動。
そして二つのプログラム間で通信をさせる、というアイデア。
他方のプロセス起動まで自動でやるのはめんどくさいし、
やるとしてもそれは次の段階だろ。
0989デフォルトの名無しさん
2005/08/07(日) 23:57:15了解です、その方向で試してみます。
素早い反応ありがとうございました。
0990デフォルトの名無しさん
2005/08/08(月) 00:04:480991デフォルトの名無しさん
2005/08/08(月) 00:18:120992デフォルトの名無しさん
2005/08/08(月) 01:24:04## を使えば単純な generic programming はできるはず。
#define define_list(type) struct list_##type { struct list_##type *next; type value; }; \
void init_list_##type(struct list_##type*) { /* ... */ } /*... */
使う側では
define_define(int)
struct list_int hoge;
init_list_int(&hoge); みたいな感じで。
二重定義とか考えると declare と define に分けた方がいいと思うけど。
>975
Boost::Preprocessor 使えばかなり無茶なことをかなり無茶に実現可能かと。
ttp://www.boost.org/libs/preprocessor/doc/examples/linear_fib.c
フィボナッチ数列の計算してるみたい。
0993デフォルトの名無しさん
2005/08/08(月) 01:32:50C言語なら俺に聞け! Part 112
http://pc8.2ch.net/test/read.cgi/tech/1123432321/
0994デフォルトの名無しさん
2005/08/08(月) 08:28:010995デフォルトの名無しさん
2005/08/08(月) 08:30:300996デフォルトの名無しさん
2005/08/08(月) 08:34:290997デフォルトの名無しさん
2005/08/08(月) 08:40:540998デフォルトの名無しさん
2005/08/08(月) 08:48:480999デフォルトの名無しさん
2005/08/08(月) 08:56:321000デフォルトの名無しさん
2005/08/08(月) 08:56:5510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。