1 :
デフォルトの名無しさん :
2005/07/06(水) 05:48:01
夢の2ゲト! ムマー。
3 :
デフォルトの名無しさん :2005/07/06(水) 06:42:42
C言語で作成されたクイックソートについて悩んでるのですけど。 クイックソートなのに交換回数がN^2になる並び替えってどんなの ですかね?
javaとc言語併用で勉強するのってどう?ありえないすか?
>>3 実装時のピボットの選び方による。
ピボットが常に最小値または常に最大値になる場合にO(N^2)になる。
交換回数をE、要素数をNとすると、
E(N) = cN + E(N - 1), N > 1, E(1) = 0 (cは定数)
=> E(N) = cN(N - 1)/2 + E(1) = O(N^2)
ピボットが常にど真ん中の値になる場合が最良でO(N log N)。
E(N) = cN + 2 E(N / 2), N > 1, E(1) = 0 (cは定数)
=> E(N) = N(c log N + E(1)) = O(N log N)
C言語をはじめたばかりであまりわからないのですが、 ビッ
クカメラでC言語は買えますか?
かえる
なにこのすれ? 誰が立てたの? ただ質問がしたい奴?
>>9 2ちゃんねるではpart 30を超えるスレは自動で立つ様になってるんだ。
わかったらさっさとネギを紫のシールで束ねる仕事に戻るんだ
11 :
デフォルトの名無しさん :2005/07/06(水) 11:15:22
質問させてただきます char *tmp; tmp = 'aiueo'; これはどうなっているのでしょうか? char型のポインタをtmpにいれるんですよね? そして、[aiueo]をそのポインタのさきに入れると考えると 6つのcharのスペースがいるわけですよね? ですが、char *tmp;では、サイズまでは指定していません オーバーフローとかではないのですか?
>>11 ×: tmp = 'aiueo';
○:tmp = "aiueo";
と仮定して答えさせて貰うと
> 6つのcharのスペースがいるわけですよね?
コンパイラが勝手にその領域を確保して、"aiueo"で初期化している。
その確保した「場所」をtmpに代入しているだけなので無問題。
13 :
11 :2005/07/06(水) 11:36:16
>>12 ありがとうございます
ですが、その場合は初期化できるとしても
引数によって変わる場合等はコンパイラが初期化できないと思うのですがどうなっているのでしょうか?
14 :
らら :2005/07/06(水) 11:44:04
【お願いします。他の板で友達が同じ質問しているかもしれませんが 一人一人違うプログラムでなければならないので迷惑かけますがお願いいたします。 】 [1] 授業単元: データ構造をアルゴリズムでC言語のプログラミング [2] 問題文(含コード&リンク): 配列のデータ構造を実現するプログラムを作成する。 ●データの挿入削除表示が可能であること ●配列に代入するデータは整数型とする ●プログラムの仕様(関数への入出力表示方法など)は各自で決めること [3] 環境 [3.1] OS:Windows/Linux/等々 Windows bcpadで授業しています。 [3.2] コンパイラ(バージョン): Borland c++ Compiler5.5 [3.3] 言語:C/C++/どちらでも可 のいずれか 可。 [4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか 2005.9.4 [5] その他の制限:どこまで習っているか、等々 特に制限ありません。一人一人違うプログラムを作成する必要があるのでできるかぎり多くのパターンのプログラムがほしいです。 お願いいたします。
15 :
らら :2005/07/06(水) 11:46:03
板間違いました^^;すいません。
17 :
11 :2005/07/06(水) 11:53:10
gcc 3.3.3 なんですけど、 -Wall にしてもワーニングもだしません 今まで数年間実行してきたコードなんですがセグフォもおこしたこともありません
warning: suggest parentheses around assignment used as truth value って、どういう意味ですか? 自分解釈だと、括弧がおかしいみたいにかんじるのですが 括弧はおかしくないと思います ですので、私の解釈が間違っていると思うのですがどうなのでしょうか?
>>17 問題にしたいコードを貼ってくれ。
>11(>12)じゃ、何の問題もあるわけがない。
>>18 自分解釈しないで、ちゃんと英語を理解しろ。ダメなら翻訳サイトへ。
20 :
18 :2005/07/06(水) 12:28:50
infoseekの翻訳をしたら >真実価値として使用される割り当てのまわりの括弧を示唆します。 となりました、 やはり、括弧だとおもうのですが・・・
21 :
デフォルトの名無しさん :2005/07/06(水) 12:49:14
>>18 > 自分解釈だと、括弧がおかしいみたいにかんじるのですが
ごめん。笑わせてもらた。
たぶん == って書くべきであることが多いところ(ifのカッコなど)で = による代入をしちゃってるけど、
「本当にいいの?カッコでもつけたらどう?」
と提案してくれている。
suggest 提案する
parentheses カッコ(←これだけわかってたみたいねw)
around 〜のまわりに
assignment 代入
used 使われてる
as 〜として
truth value 真や偽の値(trueかfalse)
23 :
ぼるじょあ ◆yBEncckFOU :2005/07/06(水) 12:52:52
>>18 gccか?
確かif(a=kansu(b))とかやると出たような。
無視していいよ。
24 :
18 :2005/07/06(水) 12:56:45
ごめんなさい、ありがとう 出かける前に解決できて本当によかった、、 while( tmp_1 = *tmp++){ ってやってたのが原因でした エラーはワーニングも全て埋めたんですけど これだけどうしても、うまらなかった でもまあこれは、意図してこうしてる(他にいい方法が思い浮かばない・・・)ので このワーニングは放っておくとするか・・・
while((tmp_1 = *tmp++)) != 0) { って書けば warninng は消えるんでない?
26 :
ぼるじょあ ◆yBEncckFOU :2005/07/06(水) 13:01:51
NLSをenableにして コンパイラをコンパイルすると ぅをーにんぐが日本語になる しかし、その場合 > 警告: 互換性のない引数3個のポインタを渡しますです のように、ときどき 英語よりもわかりにくい日本語が出現
28 :
25 :2005/07/06(水) 13:15:12
ごめん warninng は消えるが error は出るね。 正しくは: while((tmp_1 = *tmp++) != 0) {
例えば、 FILE * fp = fopen(...); if (fp = NULL) { ...; } なんて書いてしまったときには大変助かる警告だね。
>>28 黙らせる目的なら、
while ((tmp_1 = *tmp++)) {
...;
}
でもいい気もする。
>>30 昔の msc6 だったかは、それでも消えなかった経験があって、いちいち
>>28 表記してた。
コンパイラの賢さ次第かもね。
>>32 寧ろ、
if (fp = fopen(...) == NULL) ...;
と書いたときに
if ((fp = fopen(...)) == NULL) ...;
としないといけないってことかと。
34 :
デフォルトの名無しさん :2005/07/06(水) 14:04:47
あるプログラムで2×2行列を計算してその結果を i j data[i][j] という形式でデータファイルに書き出しました。 そのデータファイルを別のプログラムで読み込ませたい (新しいプログラムでの2次元配列の初期値として使いたい)のですが、 どうやってデータを読み込めばよいのでしょうか? fgetsとかsscanfとか検索しましたがよくわかりませんでした。
scanf("%d %d %f", &i, &j, &d); data[i][j] = d;
>>34 書き出した方法が判らないと読み込みようがない。
>>前スレ969 search(void) の中の、 while(top > 0){ top--; s = space[top]; を、 for( ; top > front; front++){ /* top--; いらない */ s = space[front]; に修正。
>>35 これちょっといじったらできましたorz
>>36 書き出した方法というのはどう説明すればいいんでしょうか?
プログラム上では
fprintf(fout, "%d %d %f\n", i, j, data[i][j]);
データファイルは
# i j data[i][j]
0 0 1.20
0 1 2.33
0 2 4.22
1 0 5.33
1 1 3.33
1 2 1.11
・・・って感じで書いてますが。
39 :
34 :2005/07/06(水) 14:31:09
>>38 型も書いてないからよく判らんが、
char buf[十分な長さ];
int row;
int col;
double data[適当な列数][適当な桁数];
FILE * fp = fopen("...", "r");
while (fgets(buf, sizeof(buf), fp) != NULL) {
double val;
if (buf[0] != '#') {
continue;
}
sscanf("%d%d%lf", & row, & col, val);
data[row][col] = val;
}
かな。
しかし、冗長なファイルフォーマットだな。
41 :
34 :2005/07/06(水) 15:25:40
>>40 sscanf内で「問題のあるポインタの変換」ってwarning出る上に
すごい値が出てくるんですが。@bcc32
valでも&valでも。
42 :
40 :2005/07/06(水) 15:37:04
あぁ、& valだね。 つーか、 sscanf(buf, "%d%d%lf", & row, & col, & val); だ。 ちっとは調べてくれよぉ。
43 :
34 :2005/07/06(水) 15:43:45
valでも&valにしても正しく読んでくれないんですが。 &valだとwarningはなくなりますけど。
>>43 ちゃんとコピペしている?
>42は「パーセントエルエフ」だよ。
#あと、double val;ね。
予想
なんとなく
>>34 は
sscanf(buf, ←コレ
をまだ入れ忘れてるんだと思う。
46 :
34 :2005/07/06(水) 16:06:07
どこがおかしいんだよヽ(`Д´)ノ #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char buf[10000]; int row; int col; double data[5][5]; FILE * fp; if ((fp = fopen("aa.dat", "r")) !=NULL) { while (fgets(buf, sizeof(buf), fp) != NULL) { double val; if (buf[0] != '#') continue; sscanf(buf, "%d %d %lf", &row, &col, &val); data[row][col] = val; } for (row=0; row<5; row++) { for (col=0; col<5; col++) { printf("%d %d %f\n", row, col, data[row][col]); } } } return 0; } 本題が進まない・・・
使ってるコンパイラが bcc32 ってのは判るから (
>>41 )
コンパイラが吐き出すエラーを正確にコピペすりゃ 誰かが答えてくれるかもしれん。
答えてもらえる為に必要な情報を提示する方法を知るのも一興
48 :
34 :2005/07/06(水) 16:24:12
>>47 そうですね、失礼しました。
val の場合
>bcc32 -w d.c
警告 W8013 d.c 16: 'val' は、おそらく値が代入される前に使われている(関数 main )
(16行目がsscanfの行)
>>41 のエラーとちがうのはなんでだろ・・・
&val の場合 warningなし
%lfで読んでるんだったら%lfで出力しないの?
if (buf[0] != '#') continue; ^^?
空白入んないんだ…!=であってる? continueしたら次の行いくよ?
52 :
34 :2005/07/06(水) 16:37:32
>>50-51 あ、でけた・・・
sscanfとdata[][]=をelseではさむのと、ifの中は==ですね。
ご迷惑おかけしました。
>>49 そうなんですか?
54 :
40 :2005/07/06(水) 16:44:07
だから初心者は回答書くなと。
>>49 printf()系の変換指定子とscanf()系のそれは互換性がありそうでないから要注意。
>>34 いや、単純に
if (buf[0] == '#') {
continue;
}
だけでいい。
56 :
34 :2005/07/06(水) 16:53:41
そうですね、
>>35 でも一応できてます。
ただ本当は頭に#ついてたりするので40氏の方法のほうが使えます。
>>40 ifが1行ですんでるから{}いらないかなと思って勝手に省いていました。
やっと本題移れる・・・
57 :
49 :2005/07/06(水) 16:58:27
すいません勉強してきますーorz
58 :
40 :2005/07/06(水) 16:58:41
>>56 あぁ>54では、ブロック化しないのは勝手だがcontinue;しているのだからelseは要らんと言いたいだけだ。
てかdata[i][j]だけを出力すればいいじゃん。 なんでi,jまで必要なんだよ。
うるせえな
61 :
デフォルトの名無しさん :2005/07/06(水) 20:36:15
関数の引数は調べたほうがいいですか? ssize_t strlen(const char *s) { if (!s) return -1; //こういうことはどの程度したほうがいいの?
このスレはもうテンプレ貼ってないのな
63 :
前スレ989 :2005/07/06(水) 21:02:28
残りレス少なくて流されてしまったのですが以下 何卒よろしくお願いいたします printf( "ファイルの大きさ : %ld\n", FileSt.st_size ); 上記で表示される結果(数値)を char strLine[MAX_PATH];で定義したシンボルに格納したいのですが どうすればよいでしょうか?
sprintf(strLine, "ファイルの大きさ : %ld\n", FileSt.st_size);
ん? 標準出力を読み込んでstrLineに格納するってことですか?
数値のみ sprintf( strLine, "%ld", FileSt.st_size );
そういう意味すか・・・。orz
68 :
前スレ989 :2005/07/06(水) 21:12:49
非常にありがとうございました。すんなり行きました。
変な日本語
うるせえな
71 :
デフォルトの名無しさん :2005/07/06(水) 22:39:59
C言語で標準偏差ってどうやって求めるの?
たとえば if( option -> window_grid == 1){ 、や option -> window_grid_x = value; 、等の コードが含まれる関数があるとします それは、"option -> window_grid"等の部分を変えて数百個作っているのですが 増やす際に、コードが莫大におおきくなっていきます これを、関数の引数から変更することはできないのでしょうか? 上の場合だと if( hoge == 1){ hogeの部分を、関数の引数によってかえることはできないのでしょうか?
75 :
デフォルトの名無しさん :2005/07/06(水) 22:59:05
>>72 見たけどΣとか難しい記号がいっぱいあってよくわかんなかった
>>75 標準偏差=sqrt(分散)
あとは自分で調べろ
つーかCじゃないし
>>74 hogeを引数に持つ関数を作ればいいんじゃないの?
78 :
74 :2005/07/06(水) 23:36:44
すいません、説明が悪いみたいですね どうも、説明と言うものが下手なものですいません もう少し考え直してみます
79 :
デフォルトの名無しさん :2005/07/07(木) 02:04:51
教えてください。 バイナリファイルに指定長(2バイト)でintを書き込む際に、 例えば数値を255としたときに0xff00ではなく0x00ff、256としたときに0x0100というように 書き込みするにはどうしたらいいでしょうか?
80 :
79 :2005/07/07(木) 02:10:16
事故解決しました><
81 :
79 :2005/07/07(木) 02:14:09
>>80 は煽りです。
小一時間考えてもわからなかったので教えてください。
>>79 #include <stdio.h>
#include <limits.h>
int main(void) {
FILE *fp = fopen("test.dat", "wb");
int i;
unsigned int hoge = 255;
unsigned char temp;
for (i = sizeof(unsigned int) - 1; i >= 0; i--) {
temp = (hoge >> i * CHAR_BIT) & 0xff;
fwrite(&temp, 1, 1, fp);
}
fclose(fp);
}
#include <stdio.h> #include <stdlib.h> #include <time.h> void main() { int k; double b[2000]; srand((unsigned int ) time(NULL)*4876465); for(k=0;k<2000;k++) b[k]=rand(); for(k=0;k<2000;k++) printf("%f",b[k]); } 配列の一つ一つに異なる乱数を代入したいのですが、 以上のようにやるとすべて同じ値が代入されてしまいます。 for文の中にsrandを入れても同様の結果になってしまいました。 原因を教えていただきたいです・・
>>79 void writeRev2(FILE * fp, unsigned a)
{
fputc((a >> 8) & 0xff, fp);
fputc((a & 0xff, fp);
}
87 :
79 :2005/07/07(木) 02:33:17
>>83 >>85 ビットシフトすればいいんですかね。
やってみます。
ありがとう。
88 :
84 :2005/07/07(木) 02:37:14
すいません、自己解決しました
90 :
デフォルトの名無しさん :2005/07/07(木) 12:01:22
JMがあるからいいや。
92 :
74 :2005/07/07(木) 12:24:44
無限をメモリを喰い続けるコードってどうなんですか? #include<stdio.h> int main(void){ int *mem; while(1){ malloc(10000); } return 0; } だと、だめでした
>>92 「どうですか」って何が知りたいんだ?
「だめでした」って、何を期待してるんだ?
ヒント:釣り
名前と一部のコードが間違ってましたすいません int *memはコピーミスです 無限にメモリを悔い続けると言うのは マシン上のメモリを確保し続けるということです メモリを使い果たしたらどうなるかと言うてすとがしたいのです
99 :
>>92 :2005/07/07(木) 12:48:53
int main(void){ size_t *mem,i=0; while(1){ mem = (siz_t*)malloc(sizeof(size_t)); *mem = i++; } return 0; } リソース見ながらこれでも試してみろ。 何が起きても知らんがな。
あほなのか? それをテストするためにコード書いてたんだろ
>>96 前述のコードでテストできてると思うぞ?
最終的には、malloc()がNULLを返すようになるだけ。
今日びのOSなら、遅くはなってもOSが落ちたりすることはないだろう。
malloc()等がNULLを返すのは、メモリがなくなった時とは限らない。
>>105 便乗質問。
メモリ不足以外の時ってどんな時ですか?
つフラグメント
work=num[i]; i++; と work=num[i++]; って同じこと?
ちがう
work=num[i++]; は i++; work=num[i]; ってことか
やべリロードしてなかった。同じでいいのかな?
i++ は 値を渡してから 加算。 ++i は 加算してから 値を渡す。 num[i++] は num[ 値くれ ]、i++ の値ってなによ? と読めるから 加算前の値になるべ。 int a = 0; int b = 0; int a1 = a++; int b1 = ++b; とやって違いを見るべし
ある関数が構造体の中の要素を変えて複数個あるのですが これを1つの関数で要素を変えて実行したいのですがどうすればいいのでしょうか? typedef struct{ char *a; int b; int c; int d; } TYPE; void hoge(){ } int main(void){ hoge () } と言う感じで、hogeの引数として構造体の要素を渡したいと思うのですが どういうふうに渡しどういうふうに受け取ればいいのでしょうか?
>>115 日本語は正しく
typedef struct{
char *a;
int b;
int c;
int d;
} TYPE;
void hoge( TYPE *hoge ){
/* hogeを使ってあれこれ */
}
int main(void){
TYPE foo;
hoge( &foo );
}
こういう事?
言っている意味がよく分からん
まさか offsetof とか使うような特殊なことしようとしてるのか? やりたいことをちゃんと伝えられるような訓練したほうが良いぞ…
>>114 理解できたあああああああああああああああああああ
>>115 hoge_int(int a){
}
int main(){
TYPE a;
hoge_int(a.a);
...
}
のような事をやりたいのか?
あ。MASM の 繰り返し展開マクロみたいなのを期待してるんか? ※ たしかにそういうのが欲しい時もあるけど… #define IMP_HOGE(a) hage->a = 0; として IMP_HOGE( <foo, bar> ) が hage->foo = 0; hage->bar = 0; にプリプロセスされる っていう都合の良いものは C言語の枠組みには無い (よね?
122 :
デフォルトの名無しさん :2005/07/07(木) 16:25:40
linux C で メモリの空き容量を取得したいのですが どのような方法があるでしょうか教えていただけないでしょうか。 よろしくお願い致します。 コンパイラはgccです。
/proc/meminfo つか、スレ違い。
>123 すみませんC言語ならいいかと思って。
>>124 >1くらい読んでから書きましょう。
>>121 既に>118でキーワードが出てるんだから調べてから回答しいや。
>>125 121=118 なんだけど ID ないから判らないわな。 半端回答スマン。
127 :
115 :2005/07/07(木) 19:34:45
説明が下手ですいません
>>116 それだと複数個の関数を用意しなければなりませんよね?
>>120 はい、そのようなことをしたいのですが
それだと、hoge_int内でaが変更されても実際にはa.aは変更されませんよね?
それが変更できるように使いたいです
typedefは
>>115 のままだとして
void hoge(char temp, int temp_1){
temp = &temp_1;
}
int main(void){
TYPE a;
hoge(a.a, a.b);
hoge(a.a, a.c);
}
のようなことがやりたいのです
hoge内で変更されたないようはa構造体の中身の変更になるようにはできないでしょうか?
それって int main(void){ TYPE a; a.a = a.b; a.a, = a.c; } でいいじゃねーの?
>>127 a.b と a.c の型は異なる場合があるってこと?
どっちもintとかなら、hoge(int *b, int *c)
でいいんじゃない?
130 :
115 :2005/07/07(木) 19:56:25
>>128 例で書いただけですのでhogeの中の実際の処理とは違います
やはり説明が悪いみたいですね
実際のTYPEは数百の要素があり、hoge関数は数百回呼び出されます
ですので、hogeをひとつ書いておき それに渡す引数で計算を変えたいのです
例えば
hoge_1(TYPE *a){
a->a = a->b;
}
hoge_2(TYPE *a){
a->a = a->c;
}
void main(void){
TYPE a;
hoge_1(&a);
hoge_2(&a)
}
これだと、a.aに次々入れると言うだけの単調な処理なのにhoge_iのiが増えるだけコードも関数も増えていきます
131 :
115 :2005/07/07(木) 19:59:36
ですので、 void hoge(char temp, int temp_1){ temp = &temp_1; } int main(void){ TYPE a; hoge(a.a, a.b); hoge(a.a, a.c); } この例えのように、すれば関数の数を増やさなくてもいいと思うのですが こういうことはできないのでしょうか?
>>130 言いたいことがさっぱり分からんが
hoge(int *n) { *n = ... }
main() { TYPE a; hoge(&a.a); }
ではだめなのか。
>>131 それなら
hoge(char* a, char *b) { *a = *b; }
main() { TYPE a; hoge(&a.a, &a.b); hoge(&a.a, &a.c); }
でいいだろ
>>131 そもそも
>void hoge(char temp, int temp_1){
>temp = &temp_1;
>}
はコンパイルできないぞ。
temp と、&temp_1 は型が違う。
char* a これってどういう意味なの?
char 型変数へのポインタ変数 a
>>130 そもそも、構造体が数百の要素を持つというのが異常な気がするが。
配列で持つことはできないのか?
>>138 禿同。
事業主に似たようなケースのソースを修正してくれと頼まれたことがある。
「ソースのバイト量で見積もりが高かった頃の名残ですね」
と言ったら苦笑してたよ。
構造体を配列でもつってどういうこと?
struct hoge{int i1, i2, i3, i4....}; みたいになってるhogeのi1〜iNに対して同じ関数を適用したい、みたいな話だなぁ。 配列を展開しておきました、みたいな。
>140 あえてマジレス。 構造体の「要素」を配列でもつ、だ。>141 なら struct hoge { int i[4]; }; みたいな感じ。 文字通り構造体を配列でもつなら struct hoge boke[4]; なだけだが。
C言語よりこのスレの日本語が難しいと感じる今日この頃。
>>115 今、問題になっているソースを晒した方がいいと思われ。
構造体の要素が数百個だぞ
147 :
115 :2005/07/08(金) 00:02:43
皆様ありがとうございました もう少し自分で考えてみるとします どうも本当にすいませんでした
>>115 >>118 だろ?
行数が多いって怒られちゃったよ...orz
/* C FAQ 2.14, 2.15 */
#include <stddef.h>
#include <stdio.h>
#ifndef offsetof
#define offsetof(type, mem) ((size_t) \
((char *)&((type *)0)->mem - (char *)(type *)0))
#endif /* !offsetof */
typedef struct TYPE {
char *a;
int b;
int c;
int d;
} TYPE;
void hoge(TYPE* type, size_t offset) {
type->a = ((char*)type) + offset;
}
int main() {
TYPE a = { NULL, 3, 2, 1 };
hoge(&a, offsetof(TYPE, b));
printf("%d\n", (int)*a.a);
hoge(&a, offsetof(TYPE, c));
printf("%d\n", (int)*a.a);
hoge(&a, offsetof(TYPE, d));
printf("%d\n", (int)*a.a);
}
>>148 offsetof って無いこともあるの?
150 :
148 :2005/07/08(金) 00:35:58
自分はそんな処理系を使ったことがないけれど、 C FAQ には無いこともある、と書いてある。 調べて >> 149
151 :
115 :2005/07/08(金) 00:50:55
ダメだこりゃ。
>>149 C99には、規格として規定されている。しかしながら、C89しか考慮して
いない、またはC99の新機能の一部しか考慮していない処理系が大部分を
占めると考えられる現状においては、ない可能性が十分にある。
C FAQには、「ANSI Cなら用意されている」と書いてあるだろ(2.14)。
つまり、C89準拠なら確実にあるんだよ。
FAQで「ない場合」というのは、俗に言うK&R時代のCのこと。
(プロトタイプやvoidの無いやつ)
だから、
>>153 は、1行目の前半以外は大嘘。
誰でも安心して使って良いし、再defineなどは絶対にしてはならない。
(これは、同2.14の最後に触れているように、0番地のキャスト、及びそのアドレスを取ることを
認めないコンパイラというのも規格上存在する可能性があり、
その場合にはコンパイラが内部機能としてoffsetofの計算を行っているため)
typedef struct{ int a; int b; int c; } TEST; という、構造体を初期化するときはどうするのでしょうか? typedef struct{ int a=0; int b=0; int c=0; } TEST; とかくのでしょうか?
>>155 頼むから余りに初歩的な質問は初心者スレへ行ってくれ。
で、初期化は実体を定義するときに行なう。
つまり、
typedef struct {...} TEST;
のときではなく、
TEST foo = {0, 0, 0};
というように。
どうせあんたのレベルだといろいろ判っていないだろうから、
これに頼らず初心者向けの資料でちゃんと調べておくといい。
このレスは相当親切で自分の利益になった取るのが吉
>>156 >初期化は実体を定義するとき
'定義'じゃなくて'宣言'ね。
>>156 気にくわないならスルーすれないいじゃん
あほなの?
どうして、struct内で初期化したらダメなの?
べつにやってもいいんじゃないの? できるし
できるからやりたければやればいいじゃない 不便だという人がいる事を念頭においておけばいつかそれが役に立つかもしれないじゃない
いや、できないね ごめん ってか、おっきめの構造体を0で初期化しようとおもったら TEST hoge = {0, 0, 0, 0, 0, ....} って、百個ちかく書かなくちゃいけないね
ほらなんで不便か直に教えてもらえたじゃない
ほとんどゼロなら TEST hoge = {0}; でいいじゃん・・・。
169 :
156 :2005/07/08(金) 11:57:17
>>165 >どうせあんたのレベルだといろいろ判っていないだろうから、
>これに頼らず初心者向けの資料でちゃんと調べておくといい。
>>168 それだとポインタがはいってたらできないでしょ
>>170 だ か ら 「0なら」だと言っとるだろうが。
誰もNULLとは言ってない。
殆ど0なら、0で埋めてから任意に初期化すればいい。
172 :
デフォルトの名無しさん :2005/07/08(金) 12:34:18
>>170 ポインタならNULL、浮動小数点数なら0.0に初期化されるはずだが?
特に面白いと思ったわけではないが軽い半ネタにマジレスされてマジで返さなきゃいけなくなった時の辛さ
>>172 どっちも保証はされてない。
少なくとも、普及してるパソコン上ではそうなるけどね。
組込みだとそうはいかんってだけ。
構造体のなかで構造体は定義できますか?
できます。さようなら。
177 :
デフォルトの名無しさん :2005/07/08(金) 12:39:45
できるよ!どんどんするといいよ!
>>174 されてるだろ。
calloc や memset で 0 埋めしても 0 で初期化したことにはならないけど。
struct stat とはどういう意味ですか?
エキサイトの翻訳で調べたら structスタット だそうだ エキサイト便利だね
>>179 組込みなら保証されないよ。
char unko[256]={0};
とやったときに残りを0埋めするのは「自分」ですから。
市販ライブラリをぶち込む分には大丈夫だと思うけど。
おれはしてる
素敵
>>182 の言ってる例(unko)はNULLと浮動小数点について
保証されてる云々の話とは違う。
C++ではNULLは0であると保証されているが、
C言語では保証されていない(これは勘違い野郎が多い)。
C言語ではNULLが偽のなることだけが保証されている。
それにC言語の浮動小数点はIEEE754にするなどと規定していないし、
0-fillした時に0.0になるなどとも規定していない。
ただ、実用上はそのような前提にしても問題なかろう、という話だ。
以上。
188 :
180 :2005/07/08(金) 13:38:14
おしえていただけませんかね?
>>187 0-fillとかそういう話でなくて、
初期化子のない静的変数や初期化子の足りない構造体、配列は
0で初期化されるが、この場合0で初期化するというのは、
ポインタならNULL、浮動小数点数なら0.0で初期化される
ということが保証されてるのかどうかって話。
191 :
180 :2005/07/08(金) 13:52:29
statの実体はどこにあるんですか?
192 :
デフォルトの名無しさん :2005/07/08(金) 13:52:58
unsigned char に入っている16進数(0〜f)を 10進数(0〜15)に直すにはどうしたらよいのですか? 簡単な質問で申し訳ないですが、よろしくお願いします。
16進数を10進数に計算しなおせばいい
だから余りに初歩的な質問は……
>>188 statというタグ名のついた構造体。
sys/stat.hを見るなりman statするなりして調べましょう。
unsigned char c = 0xf; printf("%d", c);
197 :
192 :2005/07/08(金) 14:07:21
ありがとうございます。 大変申し訳ないんですが、質問を微妙に間違えてしまいました。 unsigned char には16進数としてではなく、文字列として0〜fまで入ってます。 unsigned char c = 'f';のように。 スレ違いでしたら、初心者歓迎のスレを見つけたので、そこで聞いてみます。。。
すれ違いじゃないけどきみは意味がわかっていない 0-fなら16進数でしょ どこかにかきだしたいんならprintfでいいじゃん
199 :
デフォルトの名無しさん :2005/07/08(金) 14:14:16
>>187 Cのソース上で「0」と書かれたものが、
ポインタとして解釈される場合、それはNULLポインタを意味する。
これはCの仕様。
ただし、NULLポインタのビットパターンがAll0である保証がないだけ。
200 :
198 :2005/07/08(金) 14:14:24
ちょっとまってあんた 俺が読み違えてた 頭使ってちょっと考えてみ きみがいいたいのは fなら15にしたいとかでしょ? 例えば ffだとすると1515こんなもんにしてどうするの? ffと1515の意味はまったく違うよ?
多分16進数とか10進数がなにかがわかってないんだろうね
>>192 取り敢えず、これでどうだろう。
unsigned char foo = 'f';
printf("%d\n", foo >= '0' && foo <= '9' ? foo - '0' : foo >= 'a' && foo <= 'f' ? foo - 'a' + 10 : -1);
203 :
192 :2005/07/08(金) 14:21:37
最初の説明が足りませんでした。 自分がしたいのは、 4つの文字列を16ビットの数字に変換したいのです。 00ffときたら、0000 0000 1111 1111 というふうに。 この場合ですと、256ですね。 0〜fまでの文字列を0〜15に変換できれば あとはビット演算で計算しようと思ってたのです。
>>202 そんなことしなくても
man printfみたらもっと便利な方法があると思うよ
情報の小出しはやめとけ
>>203 それなら、これでいいっしょ。
unsigned char foo[] = "00ff";
printf("%d\n", strtol(foo, NULL, 16));
>>192 int x;
char str[] = "deadbeef";
sscanf(str, "%x", &x);
sprintf(str, "%d", x);
>>203 まったくもってなにがしたいのかがわからない
よく考えたら struct stat hoge; って不便だな なんでstat型をつくらないんだろう
>>209 なんでだろうね
構造体を自分で宣言するときは必ずtypedefしてるけど
>>210 俺もしてる
その方が楽っていうかやりやすいし
わかりやすいと思うのに
昔のコンパイラはそれほど賢く作られていなかったのですよ。 C++のように、struct stat {...};でstat foo;と書けるようにするとparseが面倒でしょ。
そういうことを訊いてるんじゃないと思う。
>>212 「エキスパートCプログラミング」の著者が
構造体をtypedefすると構造体であることがわかりにくいからすんなって主張してた。
わかりにくくて困ることが何かあるのか?って思った。
>>213 ああ、なるほど
確かにそれはあるかもね。
いや、無いか。いまさら。
漏れは外部向け構造体はtypedefして、 モジュール内部でしか使わない構造体はstructのままにしてる。 FILEのように、使う側が構造体メンバにアクセスする必要が無いなら typedefしてもいいんじゃないかな。
statってC99の範囲外だったんだ
217 :
デフォルトの名無しさん :2005/07/08(金) 15:20:11
(space) = (cast)malloc((u_long)(size), type, flags) なぜ、mallocはキャストしなければならないのでしょうか?
Cではキャスト不要 C++では型を合わせるために必要になる。 int *ip; char *cp = ip; こういううっかりバグを防ぐために。
Cでもキャストしてるコードをよく見るけど あれは確認の意味を込めて見たいな感じ?
もしかしてfreadの(void *)も不要?
fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream); キャストする必要があるの?
void *「へ」のキャストは、C++でも不要 void *「から」のキャストは、C++では必要 Cでは、両方不要 もちろん、データのポインタ型に限る
>ポインタキャスト コンパイラによってはデフォルトでエラーになるから悲しい。 特にSGI(IRIX)のとかね。
225 :
デフォルトの名無しさん :2005/07/08(金) 16:56:23
すいません… 学校の課題ででたんですけど・・・(´・ω・`)/ ポインタで入力した文字列をその配列の中で逆転するのはどうやったら いいんですか?? 問題が、課題2において、文字列へのポインタstr1を 入力し、その文字列を逆順にしたものを改めて str1が指す文字列に格納する関数reverse_str_2を 作成したうえでプログラムJuly17.cに追加し、これを 完成させなさい。 なんです。 プログラムuly17.cが #include<stdio.h> /* プロトタイプ宣言は考えること・・・ヒント:呼び出し部分を見ればわかる */ main(){ char string[100]; /* 入力する文字列(99文字までOK(なぜ99文字なのか考えること) */ printf("文字列を入力してください:"); gets(string); /* 文字列を入力 */ reverse_str2(string); /* 文字列を逆に並べる */ printf("\n\n"); /* 少しあける */ printf("逆にしたら: %s\n", string); } /* この下に関数 reverse_str2 を書いてください */ なんです。 おねがいします(><)
>>213-214 おもしろいことにC++を作ったBjarneはユーザ定義型の差別だとD&Eに書いた。
>>225 char* reverse_str2(char *string) {
static int i,j;
char geriunko = string[i];
if ( string[i++] )
reverse_str2( string ), string[j] = geriunko, j++;
else
string[--i] = '\0';
return string;
}
229 :
デフォルトの名無しさん :2005/07/08(金) 20:24:19
m(int x,int y,int k){ int j; if(x<y){ for(j=x;j>0;J--){ if(x % j ==0){ k=j; if(y %k ==0){ printf("%d\n",k); j=0; } }}} if(x>y){ for(j=y;j>0;J--){ if(y % j ==0){ k=j; if(y %k ==0){ printf("%d\n",k); j=0; } }}} } を再帰で書くとどうなりますか?
よみづらい 名前ちゃんと付けてこいや
そのコードでほんとにあってるのか? Jってなんだ?
k 要らなくね?
233 :
デフォルトの名無しさん :2005/07/08(金) 20:33:50
kいらないです。
234 :
デフォルトの名無しさん :2005/07/08(金) 20:38:27
m(int x,int y){ int j; if(x<y){ for(j=x;j>0;j--){ if(x % j ==0){ if(y %j ==0){ printf("%d\n",j); j=0; break; } }}} if(x>y){ for(j=y;j>0;j--){ if(y % j ==0){ if(x % j ==0){ printf("%d\n",j); j=0; } }}} } 少しだけ簡潔にしましたが、動きませんorz
簡潔ツーか、ロジック変わってるやん。 それに動かないものを再帰にさせようとしているのか? 再起不能。
>>234 今度は、二つのifブロックの中身がまったく同じになったぞ。
ごめん、微妙に違った。
何をしたいかを日本語で書いて宿題スレへ持っていく方が早そうな予感。 ただし「まともな」日本語を229==234が書けることを前提とする。
239 :
デフォルトの名無しさん :2005/07/08(金) 20:44:15
gccではうごいたんです。
一から書き直したほうがいいと思うよ
241 :
デフォルトの名無しさん :2005/07/08(金) 20:47:32
動かないわけではないですけど、x,y何を代入しても4が帰ってきます。
最大公約数計算っぽいな #include <stdio.h> //ロジックの整理 void m(int x,int y){ int j; if(x<y){ for(j=x;j>0;j--){ if(x % j ==0 && y %j ==0){ printf("%d\n",j); break; } } } if(x>y){ for(j=y;j>0;j--){ if(y % j ==0 && x % j ==0) { printf("%d\n",j); break; } } } }
//再帰版 void r(int x,int y,int j) { if( j == 0 ) return; if( y % j || x % j) r(x,y,--j); else printf("%d\n", j); } void m2(int x, int y) { if( x == y ) return; if( x < y ) r( x, y, x); else r( x, y, y); } //動作確認 int main() { int x = 111, y = 99; m(x,y); m2(x,y); return 0; }
244 :
デフォルトの名無しさん :2005/07/08(金) 21:04:25
というか、何でコマンドプロンプトはすぐに計算終了後閉じるんですか?
処理が終わったから。
246 :
デフォルトの名無しさん :2005/07/08(金) 21:08:39
結果が見えないじゃないですか。
248 :
デフォルトの名無しさん :2005/07/08(金) 21:09:49
DOSの問題ですけど、ターミナルしか使ったことないんで。
ターミナルなら、./a.out > t.t で、出来るるんですけど、それと同じこと出来ませんか?
スタートメニュー > ファイル名を指定して起動 > cmd.exe と入力。
それで?
いや、もうウインドウズ使う機会ないんで。
「ターミナルなら」だってよ、馬鹿は帰れ。
258 :
デフォルトの名無しさん :2005/07/08(金) 21:29:07
意味不明
Mac(Unix)やLINUX使ったことないんですか?
>>259 使ってる人間に馬鹿にされていることをわからないと
そ れ で !
>>261 回線切って首吊って寝ろ。 600秒くらい。
それで十分だろ。
小学生をいじめちゃいかんよ!
F3ってgoto文が入ってたんだっけ?
てめーらいちいちパンチラ見えた小学生みたいにはしゃいでんじゃねえよ
270 :
266 :2005/07/08(金) 21:57:25
273 :
たすけて :2005/07/09(土) 01:28:09
コンパイルは出来るのに「問題が発生したため***.exeを終了します。ご不便をおかけして申し訳ありません。」というウィンドウが出て実行できません。なぜですか??誰か教えてください!
コンパイルが通ったらバグのないコードなら 世の中に流通してるほぼ全てのバイナリはバグ0だネ
>>273 プログラムのコードに問題があるから。
"コンパイルできればエラーがない"ということにはならないよ。
>>273 コンパイルできたというのは
そのソースコードがシンタクス的に正しい
というそれだけのことです
コンパイラはプログラムの意味や処理が正しいか、なんてことは判断できませんし
しません
あなたのプログラムがメモリを壊そうがHDDを初期化しようが
全世界に向けてラブレターを振りまこうが、知ったことではないのです
コンパイルが通れば動いてくれればいいのにな 今書いてるコード制作期間は2週間なのに なぜかセグフォる、デバッグにもう10日はかけてる しにたくなってくるな
>>273 これって、確実に関係ないメモリ破壊してるよね
メッセージが出るってことは、=被害大きいってことなの?
だた単にファイルオープンぬrぽなんてこともあるし。。
281 :
デフォルトの名無しさん :2005/07/09(土) 11:18:19
10日もかけてわからんのかよ・・・
for( int i = 1; i <= 10; i++ ) ってC言語でも書けるの?
286 :
デフォルトの名無しさん :2005/07/09(土) 14:41:51
mystrndupというのがでてきたので検索してみたのですが 説明が見当たりません わかるかたいましたら説明していただけないでしょうか?
Makefile?
288 :
285 :2005/07/09(土) 15:14:35
事故解決しますた
示談キター
290 :
日本道路公団 :2005/07/09(土) 15:15:22
複数ファイルのコンパイル、リンクの仕方教えてください。 LSI C-86 v3.30c 試食版を使ってます。この説明書みたいのには 載ってませんでした。
292 :
日本道路公団 :2005/07/09(土) 15:32:03
makeとは?
294 :
日本道路公団 :2005/07/09(土) 15:40:27
書いてねーよw
日本道路公団って喧嘩売ってる名前だなw
297 :
日本道路公団 :2005/07/09(土) 15:48:48
てか悪いけど俺典型的な量産型厨房で自分で探すとか無理なんだ。そのスレのどこらへんですか
298 :
286 :2005/07/09(土) 15:49:23
わかるかたいませんでしょうか?
>>294 ちゃんとLSIC86.MANに書かれてある
>>297 そこでふたたび聞けってことじゃないの?
まぁNGワード登録できるだけ良心的だな。
>>286 ググればいくつかでてきたけど。ほんとに検索したの?
>>290 lcc a.c b.cでできないのか?
>>302 してたらこんな質問してないよ。
まー釣られて楽しもうでは内科医。
305 :
日本道路公団 :2005/07/09(土) 15:54:06
>>299 教えてくれてありがたいんだけど、俺のフォルダ拡張子とかでめちゃくちゃで
よくわかんねーや。
>>303 詳しく
307 :
日本道路公団 :2005/07/09(土) 16:00:17
>>306 そこをなんとか。意地悪しないで。これわかんないと先進めない。
>>307 こちらは十分情報を与えた
意地悪なんてしていない
>>305 そもそも単一ファイルでもコンパイルできてねーだろ。
311 :
日本道路公団 :2005/07/09(土) 16:02:26
313 :
日本道路公団 :2005/07/09(土) 16:06:55
例えば Sample1.h・・・関数プロトタイプ宣言 Sample2.c・・・関数の定義 Sample3.c・・・プログラム本体 だったら lcc Sample1.Sample3 Sample2.Sample3 ってこと?
>>313 lcc Sample2.c Sample3.c
.hのファイルは.c内にインクルードするの
>>313 ソースファイルに
#include <con.h>
#include <nul.h>
が必要
317 :
日本道路公団 :2005/07/09(土) 16:15:21
>>314 さん ありがとうございます。
今からポインタです。ここがやっかいと聞きました。
ここでつまづいたら煮るなり焼くなりしてください。
調査能力に問題ありだな
319 :
デフォルトの名無しさん :2005/07/09(土) 16:32:46
#include <stdio.h> #include <stdlib.h> #include <string.h> main() { int test = 9; char a[256], b[256]; itoa( test, b, 10 ); if ( test < 10 )sprintf( a, "0%s" ,b );// 1 else strcpy( a, b );// ( test < 10 ) ? sprintf( a, "0%s" ,b ):// 2 (※) strcpy( a, b );// printf( a ); } 2 の部分でエラーが出るのはどうしてですか? ほぼ同じ処理をしているはずだと思っていたのですが。 戻り値の問題かなぁ、と思って、strcpy( a, b ),0; としてみても、結果は同じでした。 コンパイラはVC6.0です。
>>319 > エラーが出る
ならエラーメッセージくらい貼れ。
>>319 sprintf( a, "%02d", test );
>>322 やべっ・・・この時間馬鹿しかいないみたい・・・問題はそこじゃねーだろが
一応エラーメッセージは張っとくけどさ・・・
つchar *' 型から 'int' 型への変換ができません。
この時間の質問者は(略
ま、教えてやっている奴の意図は、狭量な質問者には伝わらん罠
326 :
デフォルトの名無しさん :2005/07/09(土) 16:43:33
stdio.hってスタジオ・エッチって読むんですよね? 中黒の発音がポイントって聞いたんですが…?
>>323 ヒント:char *strcpy( char *, const char * );
>>326 正しくはストゥディオ・ドット・エッチだ
332 :
デフォルトの名無しさん :2005/07/09(土) 16:46:17
質問です。 reallocでメモリ割り当てサイズを縮小した場合、割り当てエリアの再配置(移動)が発生しないという保障はありますか?
if ( test < 10 ) sprintf( a, "%02d", test );
else sprintf( a, "%2d", test );
こうしとけと言いたいんだろうけど、俺が聞きたいのはそこじゃないっすよ。
>>319 これで読み取れないんなら邪魔なレスしてんじゃねぇよw
あは〜んアハ〜ン
あせって自分にレスしてらっしゃるw
もうちょっとマシなコードが見たいなぁ。
>char *' 型から 'int' 型への変換ができません。 これで読み取れないんなら邪魔なレスしてんじゃねぇよw
>>338 いや、コードとかの問題じゃなくてさ、
俺が聞きたいなんでの部分に答えれているやつはいないみたいだけど?
ほんっっっと失敗した^^
最近煽るだけのやつが多いのな
正解を提示してみてください あなたあおりながら、画面の前でハテナが浮かんでますよ
あ、あんたに言ったつもりではなくスレッドを読み流して 思っただけだったのでキニスンナw
ボク、今は煽ってるだけです〜 てこと?
>>346 ぼくはもとから回答する気はありませんよ
ただ他の良心的な方々からも答えてもらえませんよ?ってこと
みてみてー、コンパイルできたよー ( test < 10 ) ? sprintf( a, "0%s" ,b ) : 0,strcpy( a, b );
>>346 どうして三項演算子について調べようとしない?
誰も答えられないのか・・・ このスレアホの巣窟だな
>>319 ? : の条件演算子は真のときと偽のときとで式の型が一致している必要がある。
なぜならを条件演算子は演算子だから結果を出す必要があるため。
たとえばこんなこともできる。
int n;
n = test < 10 ? 0 : 10;
sprintfはint、strcpyはchar *を返すので型を合わせようにも変換できないのでエラーになる。
あほがあほにあほって
356 :
日本道路公団 :2005/07/09(土) 17:04:36
アドレスという言葉があるんだな
空気嫁よ…
>>356 お前はいちいち学習内容を報告しに来る気かw
360 :
デフォルトの名無しさん :2005/07/09(土) 17:11:05
Cのコード最低30万行は書いてないとこのスレで答える資格はないと思うよ。 ちょっとレベル低すぎ。
361 :
日本道路公団 :2005/07/09(土) 17:11:30
int型へのポインタpA 意味わかんね
>>319 は、これまで書いてきた行数には関係ないと思うけどなw
>>319 > 戻り値の問題かなぁ、と思って、strcpy( a, b ),0; としてみても、結果は同じでした。
?: と , の優先順位。
だらだららだだら づぁららららだあらあらら これな〜んだ?
つまんね
>>360 30万行書いてもヘボいやつはヘボいぞ。
漏れや藻前みたいにな。
これでいいだろ。 test < 10 ? (void)sprintf(a, "0%s", b) : (void)strcpy(a, b);
だめなやつはいくらやってもダメ?
行数で語る奴ってどーなのかね。皆までは言わないが。
そういう奴に限って、グローバル変数100行、関数内フラグ30行、関数500行とかなw
371 :
日本道路公団 :2005/07/09(土) 17:30:13
30万行作るのにどれくらいかかるの?
372 :
デフォルトの名無しさん :2005/07/09(土) 17:31:34
int i=0; i = (i==0) ? printf("1:%d\n",i),printf("2:%d\n",i): printf("dummy"); printf("3:%d",i); これの printf("2:%d\n",i) が 4 にならないのはどうしてですか? faq ですか?
strndup と言う関数がどこにも見付からないのですが どのヘッダに入っているのでしょうか? string.h にもなかったです
そういうインチキ関数は使わない方がいい
すいません 自分で作った方が早いですね お手数をお掛けしました
まあ信頼がおけるなら使ってもいいけどね
381 :
日本道路公団 :2005/07/09(土) 18:46:20
ポインタむずい
ポインタ自体は難しくもなんともない。 Cのポインタがいろいろと面倒なだけ。
リストから削除する、関数del_listを作成する。 という事なのですが、実行できたものの削除したと出たのに 実際削除されませんでした。★で囲まれてる場所があやしいので もしよろしければ、ご教授お願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct list{ char name[100]; struct list *next;//自己参照構造体 }NODE; void list_out(NODE *); void add_list(NODE);//リストの登録 NODE *del_list(NODE);//リストの削除 NODE *head;//先頭ポインタ void main(void) { NODE adddata; NODE deldata,*p; printf("***文字列の昇順に登録***\n"); printf("文字列入力 (CTRL+Zで終了)\n");
Display *display; と言う変数があるのですが これを違う関数にわたし、その関数で変更したら元の関数でも変更されているように渡したいのですが どういうふうに渡したらいいのでしょうか? 違う関数での受け方も教えていただけるとうれしいです
head = NULL; while(printf("->"),gets(adddata.name) !=NULL){ add_list(adddata); } printf("***リストの削除***\n"); list_out(head); printf("\n*** リストの削除 ***\n"); printf("削除文字列入力\n"); while(printf("->"),gets(deldata.name) !=NULL){ if((★p=del_list(deldata)★) ==NULL) printf("未発見\n"); else printf("%p番地のノードを削除\n",p); } printf("***リストの内容***\n"); list_out(head); } void list_out(NODE *p) { while(p != NULL){ printf("%p番地:%s\n",p,p->name); p=p->next;
} /*ポイントのつなぎ替え*/ new->next= p; back->next=new; } } NODE *del_list(NODE deldata) { NODE *p,*back; if★(head == NULL)★return NULL;//リストが空なら、NULLを戻す if★(strcmp(deldata.name,head->name)){★//リストの先頭なら /*ポインタのつなぎ換え*/ back = head; ★head = head->next;★ return ★head;★ } else{ p=head;//削除するノードを探す while(★p != NULL && strcmp(deldata.name,p->name) >= 0★){ back=p; p=p->next; } /*pポインタの繋ぎ換え*/ if(p != NULL)★head->next= p;★ return p; } }
387 :
デフォルトの名無しさん :2005/07/09(土) 20:19:44
for(i = 1; i <= 5; i++){ sleep(10); kill(pid[i], SIGTERM); waitpid(pid[i], &status, 0); } これだと10秒毎にpid[i]が終了されるのですが, 10秒でpid[1]からpid[5]を一度に終わらせるにはどうすればいいのでしょうか? vine linuxで gccです
あの、ちょっといいでしょうか。最近Cはじめたのですが関数のとこになり少し疑問が生じたので質問させて頂きます。 ある本には最初にmain関数がありその下にint date(int x)とありますが、ある本には int date(int x)の下にmain関数があります。プログラムは答えが出れば正解らしいですが 一般的にはmain関数は上にあるのでしょうか、下にあるのでしょうか。
sleep(10); for(i = 1; i <= 5; i++){ kill(pid[i], SIGTERM); waitpid(pid[i], &status, 0); }
>>388 下じゃないとプロトタイプ宣言がひつよう
上に書く場合でもプロトタイプ宣言がその上に必要
>>388 関数を書く順番は任意。好きにすればいい。
ただし、関数を呼び出すためにはその関数のプロトタイプを知る必要がある。
関数コールするよりも前(上)に関数定義があれば、その定義から関数仕様は明確になるが、
関数コールよりも後(下)に関数定義がある場合、その関数が見えていないので、引数や戻り値の方が不明になる。
こういう場合は、関数コールする位置よりも前にプロトタイプ宣言を書けば、コールできる。
Cコンパイルは前方参照だからね。
394 :
384 :2005/07/09(土) 20:31:03
わかるかたいませんでしょうか?
ポインタ渡しすればいいだろ。
>>389 ちょっと変えるだけでよかったんですねorz
ありがとうございました。
398 :
384 :2005/07/09(土) 20:56:51
>>396 根本的にできないんですか・・・
では、みなさんはこのようなときどうしてるんですかね?
>>384 Display *display の指している先の構造体かなんかの中身を書き換えることは出来るが、
displayの値そのものを書き換えることは出来ない。
>>390 〜392 ありがとうございます。392さんの言う事は少しだけわからないとこありますが、
(すみません。もっと勉強します。)にベテランじゃないので上書くことにしておきます。
!!!
愛用の本である解きながら学ぶC言語という本はベテラン志向でした。。
まあ両方ともやってみますね。本当にありがとうございました。
プロトタイプ宣言が無かった頃の(ry
403 :
384 :2005/07/09(土) 21:16:56
ありがとうございます Display型はWindowのポインタを入れる型です void hoge(Display *display){ display = XOpenDisplay( NULL); } main(){ Display *display; hoge( display); } だと、hogeで格納してもmainにかえってきたときに変更されていません
>>403 素直に
Display *hoge() {
return XOpenDisplay(NULL);
}
main() {
Display *display = hoge();
}
じゃ駄目なんか?
ポインタを入れる型へのポインタを使って渡せ。
406 :
384 :2005/07/09(土) 21:22:56
>>404 ありがとうございます
ここにかかさせていただくので実際の処理は省いたのですが
hogeの中では他にもいろいろな処理をしています
>>406 Display *hoge() {
//他の処理いろいろ
return XOpenDisplay(NULL);
}
main() {
Display *display = hoge();
}
もとい、こうか。 Display *hoge() { Display * pDsp = XOpenDisplay(NULL); //他の処理いろいろ return pDsp; } main() { Display *display = hoge(); }
void hoge(Display **display) { Display *d = *display; // いろいろ処理 } main() { Display *display; hoge(&display); }
410 :
409 :2005/07/09(土) 21:27:45
上、ちと失敗。 void hoge(Display **display) { Display *d = *display; d = XOpenDisplay(NULL); // いろいろ処理 } main() { Display *display; hoge(&display); }
それじゃできないでしょ
だから初心者は回答するなと……
>>410 * display = XOpenDisplay(NULL);
どうでもよいけど char hoge[256]; while(gets(hoge) !=NULL); が無限ループになっちゃうのは自分の環境の所為nano?
while(fgets(hoge,stdin) !=NULL); にしとけ
本当にどうでもいいな
while(fgets(hoge,sizeof(hoge),stdin) !=NULL); だった
>>417 無限ループになったと判断した根拠は?
ただ単に、入力を終えたつもりになっているだけなら以下の点について調べよ。
・リダイレクトでファイルを入力しても無限ループになるか。
・端末エミュレータで入力のクローズは行なえているのか。
#一般的にUnixなら^D、DOS系なら^Z
419 :
384 :2005/07/09(土) 21:57:09
みなさまありがとうございます どれをやってもうまくいかないです・・・
420 :
414 :2005/07/09(土) 22:04:16
Enter押したら終わるって思い込んでた・・~Z で終えてくれまひた レベル低い自分はスルーで、以下何事もなかったかのように(ry ↓
>>419 void f(Display **);
f(&display);
こうでもだめか?
渡す渡せないの問題じゃないんじゃねーの? 他のとこでミスってるとか、ミスってると思い込んでいるとか。
こう書けたらいいっていうような脳内拡張Cのコードでも書いてくれれば伝わりやすいかもね>384
424 :
デフォルトの名無しさん :2005/07/09(土) 22:38:57
いきなり質問してもいいですか?
425 :
384 :2005/07/09(土) 22:39:41
void hoge(Display *display){
printf("%p\n", display);
display = XOpenDisplay( NULL);
printf("%p\n", display);
}
main(){
Display *display;
printf("%p\n", display);
hoge( display);
printf("%p\n", display);
}
とこのようにして、中身を確認しているのですが
display = XOpenDisplay( NULL);
の、後と前では変わるのですが hoge( display);の後ではまたもどっています
今まで教えていただいた方法を使ってやってみたのですが
変わるものはありませんでした
>>421 すいませんが、それをどうすればいいかがわかりません
どうすればいいのでしょうか?
>>425 引数で渡さなくて、戻り値で返せばいい。
428 :
デフォルトの名無しさん :2005/07/09(土) 22:43:19
すんません。板違いだったらごめんなさい 「C/C++ Users Journal」って年間購読とは別に一冊買えるようなとこってないんですかね?
430 :
デフォルトの名無しさん :2005/07/09(土) 22:46:47
431 :
デフォルトの名無しさん :2005/07/09(土) 22:47:20
>>425 これで確認できたよ(
>>421 の方法)
--------------------------------------
struct Display{
int x;
};
void f(Display** display)
{
*display = new Display;
(*display)->x = 10;
}
int main(int argc, char* argv[])
{
Display* display = NULL;
f(&display);
if(display){
printf("D:%d\n",display->x);
}
return 0;
}
こっちの方が、使いやすいと思うけどな。 Display* hoge(void){ Display *pDisp; printf("%p\n", display); pDisp = XOpenDisplay( NULL); printf("%p\n", display); return pDisp; } main(){ Display *display; printf("%p\n", display); display = hoge(); printf("%p\n", display); }
>>425 intをDisplay *に読み替えれば425のコードと同じようなもんだ。
void f(int n)
{
n = 10;
}
int main()
{
int n = 0;
f(n);
printf("%d", n);
return 0;
}
ぉぃ
だだすだすだだ だだすだすだだ これな〜んだ?
1101011 1101011
ううまま うままう うまう うままう?
ああんあんああ ああんあんああ
441 :
384 :2005/07/10(日) 01:36:33
みなさまありがとうございます returnで返す方法以外はありませんでしょうか? 別の値を返すのにreturnは使っているのでできれば使いたくありません
Display **display; って何個か前のは読めなかったのか?
>>441 氏ね、バカ。
>>432 がわざわざコードにまで起こしてくれてるだろうが。
自分で考える能力が無いならせめてレスくらいちゃんと確認しろ。
>>441 最初からそういえよ。情報小出しはこっとも嫌われると言うことを理解したら、もううくるな。
#include<stdio.h> #define NINZU 10 #define KAMOKU 5 struct student { char name[8]; int en,ma,la,sc,so; int sum,mean,max; }; sub_sum(int n,struct student d[]) { int i; for(i=0;i<n;i++){ d[i].sum=d[i].en+d[i].ma+d[i].la+d[i].sc+d[i].so; d[i].mean=d[i].sum/KAMOKU; d[i].max=d[i].en; if(d[i].max<d[i].ma) d[i].max=d[i].ma; if(d[i].max<d[i].la) d[i].max=d[i].la; if(d[i].max<d[i].sc) d[i].max=d[i].sc; if(d[i].max<d[i].so) d[i].max=d[i].so; } }
↑の続き main() { int i; struct student data[NINZU]; FILE *fp; fp=fopen("seiseki.txt","r"); for(i=0;i<NINZU;i++) fscanf(fp,"%s %d %d %d %d %d", &data[i].name,&data[i].en,&data[i].ma,&data[i].la,&data[i].sc,&data [i].so); fclose(fp); sub_sum(NINZU,data); for(i=0;i<NINZU;i++) printf("(%d) %-3s 総点:%d 平均点:%d 最高点:%d\n", i,data[i].name,data[i].sum,data[i].mean,data[i].max); } 上記のプログラムを、科目ごとの総点・平均点・最高点も 求めれるように改造したいのですが、どうしたら良いでしょうか?
↑の追記。 ちなみに「seiseki.txt」の中身は下記の通り。 A 70 56 66 45 88 B 66 85 68 55 73 C 55 65 53 67 55 D 85 72 76 58 65 E 92 70 45 73 55 F 56 57 52 62 82 G 72 62 33 85 95 H 46 95 48 72 34 I 83 42 88 92 56 J 68 65 91 82 66
宿題スレは無くなったのか?
450 :
384 :2005/07/10(日) 02:52:14
わからないんだったらレスしないで
451 :
384 :2005/07/10(日) 02:52:50
ここはおまえらの家じゃねぇ 気にくわないんだったらお前が来るな
こういうのが一番ウザい、愚痴まで小出しにしやがる。 一生小出しでふんばってろ教えて君。
死ね糞
どなたか教えてください。 Cで数値計算をしているのですが、2台のパソコンで 同じプログラムを走らせたところ パソコンA:最後まで計算できるが、gdbである変数を printコマンドで見ようとするとセグメントエラー パソコンB:特定の場所でセグメントエラー、挙動もおかしい その場所は、ある関数内で、 { 計算 printf("計算結果"); printf("バグ取り"); } このprintとfprintfの間でセグメントエラーを吐きます。 しかも「計算結果」を表示した後、2秒位たって、「バグ取り」を 表示せずに落ちてしまいます。 まったく原因が分からず困っています。よろしくお願いします。
>>454 ここはそういう質問をするスレじゃないんだ
最近はキレやすい子供が多いらしいからな・・・ 近い将来は大人まで・・・
>454 とりあえずどっかのメモリを破壊してる可能性が高い。
windowsならめもりくり〜なあたりを行使してみ
だから初心者は回答するなと……
どこからネタなのかわからなくてつい…
461 :
454 :2005/07/10(日) 12:24:04
>>457 ,458
やっぱりそうですか。
もう一度、メモリ破壊を疑ってデバッグしてみます。
ありがとうございました。
printf挟むと挙動が変わるのはスタック破壊の可能性が高い
463 :
454 :2005/07/10(日) 12:53:38
>>462 printfとprintfの間の2秒間も、スタック破壊が
原因でしょうか?
464 :
デフォルトの名無しさん :2005/07/10(日) 13:06:21
C言語の開設HPを見てて、 #include <stdio.h> void main() { int val; val = 5; printf( "今、変数の中身は、%dです\n", val ); val = val + 1; printf( "今、変数の中身は、%dです\n", val ); val ++; printf( "今、変数の中身は、%dです\n", val ); } というプログラムを組んでコンパイルしたのですが、 エラー E2048 test_3.c 1: 認識できないプリプロセッサ指令: 'inclube' 警告 W8065 test_3.c 9: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) 警告 W8065 test_3.c 13: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) 警告 W8065 test_3.c 17: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) *** 1 errors in Compile *** というエラーが出ます、どこがおかしいのでしょうか?
printf( "今、変数の中身は、%dです\n", val ); val = val + 1; printf( "今、変数の中身は、%dです\n", val );
>#include <stdio.h> >エラー E2048 test_3.c 1: 認識できないプリプロセッサ指令: 'inclube' (・3・) エェー
468 :
464 :2005/07/10(日) 13:15:08
馬鹿なミスでした。 すいませんでした。
いくるぅーべ
煽ってんじゃねえよクソッタレ!
餅ついていこうよクソッタレ!
474 :
デフォルトの名無しさん :2005/07/10(日) 16:01:49
count1とcount2という2つをint型で定義して、 1秒ごとにsleepでカウントしていって、 count1とcount2が両方10になったら終了する。という ソースを作りたいのですが、 for( count1=1; ; count1++){ for( count2=1; ★;count2++){ sleep( 1 ); printf("count1=%d\n", count1); printf("count2=%d\n", count2); } if( count1==10 && count2==10){ break; } という風に、for2重ループで作ってみたのですが、 この場合は★になんと宣言したらいいでしょうか? forループの2重目は毎回脱出する…という風にしたいのです。 よろしくお願いします。
なにがしたいのか意味不明だな。
477 :
474 :2005/07/10(日) 16:17:38
>476 ありがとうございます! 毎回脱出は0なんですね…知らなかった…
478 :
デフォルトの名無しさん :2005/07/10(日) 16:35:08
毎回ぬけたら、count2は永遠に10にならない悪寒。
ソフトバンク社の明解C言語の80P〜81Pにある演習4−17と演習4−18の問題の解答が分かりません・・・。 よろしくお願いします。
>>481 ちゃんとその本読んで、明解に解けるようにせれ。
そうでもなければ冥界送り。
というか、そんな本持ってる人限定で質問する時点で冥界だ。
以前、この板のどこかのスレで for (int i=0 ; i<strlen(str) ; i++ ) 文字列 str の長さを変えない処理; という書き方は、一般的には毎回 strlen を呼ぶので遅いが、 どこぞの処理系では一度しか呼ばないように最適化する、という 話があったようななかったような気がするんですが、どなたか ご存知でしょうか。
すれ違い
どのスレがいいの?
>>483 今手元のgcc(3.3.3 cygwin special)で試したら、strが固定長であることが明らかなときのみstrlen()が省略された。
つまり、
int main()
{
int i;
char str[] = "Whee!";
for (i = 0; i < strlen(str); ++i) {
printf("%c", str[i]);
}
return 0;
}
のような場合。
しかし、char *str = argv[0]; としたら毎回strlen()を呼び出していた。
>>485 このスレッドの名前を読んでみ
「忘れた会話を思い出すための質問スレッド」
ってかいてあっか?
ワロタ
489 :
483 :2005/07/10(日) 20:19:01
お前馬鹿だろ。知らないなら黙ってろ。何か書きたけりゃ
「忘れた会話を思い出すための質問スレッド」
を立ててからにしろ。な?
>>486 ありがとう。さらに調べてみたら、gcc-3.3.3 で -O つければ
argv でも strlen は呼ばず、自前で 0 かどうかの比較だけやってた。
-fno-builtin を付けたら strlen 呼んでくれたよ。
gcc がそういう処理系だったんだね。
残念ながらあほだな
ここまでカスなやつってなかなかいないよね 現実じゃ、ものすっごい下手でさ そんなやつでもこんな発言んができるって恐いね
492 :
483 :2005/07/10(日) 20:25:23
もう解決したから帰っていいよ。 今度来るときは句点打てるようになってるんだぞ。
この手の質問も答えてくれる人いるんだし、 それくらいの寛大さと融通は効いても毒ではないだろう。 逆に噛み付いて荒れるよりは遥かにいい。
あからさまに
>>489 の区点のほうがひどく感じるのだがw
日本語が明らかにおかしい奴はいるが、 日本語を指摘を捨て台詞にする奴はい やな奴にしか見えない。
>もう解決したから帰っていいよ 帰るのは君では?
職場でもよくいるよね。 たいした技術の話も出来ないくせに、やたらと「日本語大丈夫〜?」 とか言って新人君に苦笑されている奴。
そうやって揚げ足をとることしかできない人間なんだからしかたがない 放っといてあげなさい
gccがそういう処理をするからといって、 以前の会話で出てきた処理系がgccであるとは限らないと思うのだが。
スルーしとけって こういう必死君は今に暴れ出すぞ
503 :
483 :2005/07/10(日) 20:45:16
>>502 ただの通りすがりだけどさ、もういいかげんにほじくるのはやめなよ
見てて痛々しいよ
以下のコードを実行してみたのですが、なぜrefとstructのサイズが違うのでしょうか? void main(void) { typedef struct { char str1; int digit1; double dot1; } TEST1; typedef union { char str2; int digit2; double dot2; } TEST2; TEST1 s; TEST2 u; char str; int digit; double dot; printf("ref:%d\nstruct:%d\nunion:%d\n",sizeof(str)+sizeof(digit)+sizeof(dot),sizeof(s),sizeof(u));
バウンダリ 構造体アライメント で検索汁
>>504 structには境界調整を合わせるための隙間が入っている。
合っていないとメモリアクセスに余計な時間がかかったり、下手すると落ちる環境も存在する。
あと、sizeofには括弧でくくれば型名も直接指定できる。
>>505 すいません。
検索が下手なので有用な情報が得られませんでした。
>>506 ありがとうございます。納得しました。
sizeofの使い方についても勉強になりました。
通りすがりが名前欄を・・・
切角みんながスルーしてんのに突っ込むなよ あまりにも痛々しくて可哀想だからだまってたのに
>>508 2chで「通りすがり」って言ってる時点で以下略
クッキーって残酷ね
このスレのレベルってもはや底辺な。
そういえば、そろそろ夏休みなのか?
>>513 そうだよね。はやくID制にならないかな。
まぁこの板はそれ程アラシ等も激しくないので、IDでなくてもいいんでないの? たまにある自作自演は2ch名物みたいなもんだし。
>>516 下手にID制になって自作自演が見れなくなるのもさびしいしな。
このスレを見る限り、俺が思っていた以上に自作自演が行われてそうだな。 ID制賛成だな。
そなの? 今まで、まじめに答えてたのに...
520 :
デフォルトの名無しさん :2005/07/11(月) 02:03:33
if(no == 0) puts("その数は0です。"); else if(no > 0) puts("その数は正です。"); else puts("その数は負です。"); これの最後のelse を else if( no < 0)にしても大丈夫ですか?
522 :
デフォルトで名無しさん :2005/07/11(月) 02:30:06 BE:282408858-
C言語覚えるのにどんな本買えばいい? お勧めなのあったらおせーて
main(){ char *file; load(file); } load(char *file){ file = malloc(file_status.st_size); fp = fopen( file_name, "r"); fread( file_data, file_status.st_size, 1, fp); } と言う処理では、load関数が終わった時点で中身がおかしくなっています(Segmentation fault (core dumped)) ファイルネームとファイルステータスの処理は割愛しています mallocの処理が問題だと思うのですがどのようにしたら対処できるでしょうか?
>>522 おまえが本屋にいって適当に何冊か見てみて
これだったら最後迄ようめそうだと思った本
525 :
デフォルトで名無しさん :2005/07/11(月) 02:38:30 BE:254167294-
ふむ。。 そっか 了解>524
>>523 fopenに失敗しているかもしれない。
mallocに失敗してるかもしれない。
いきなり出てきたfile_dataってなに?
mallocで確保した領域はmainでは使えないけどいいの?
527 :
デフォルトの名無しさん :2005/07/11(月) 02:51:46
528 :
523 :2005/07/11(月) 02:57:36
すいません file_dataはfileの間違いです 割愛していますが、fopenとmallocのエラー処理はしています >mallocで確保した領域はmainでは使えないけどいいの? これがどうしてもわからないのですが、どうしてなのでしょうか? 実際には、mainで使えるようにしたいです すいませんが教えていただけると助かります
>>527 >>521 じゃないけど、大丈夫ってことだよ。
ちょっと特殊な場合では大丈夫じゃないかもしれないけど。
ちなみに、なんでそうしたいの?
>>527 どうしてそんな無駄なことをしたがるの?
531 :
527 :2005/07/11(月) 03:04:20
場合わけで、0か正かそれ以外か、っていうのに違和感?を感じるわけです。 高校数学の影響ですかね・・・
数学ができたらそんなむだなことしなくてもいいことがわかるでしょ 算数で止まってるひとなら「やっとかないとまずくない?」って思うかもしれないけど
>0か正かそれ以外 その他どんな場合があるというんだ?
>場合わけで、0か正かそれ以外か、っていうのに違和感?を感じるわけです。 場合分けなら、正か負かそれ以外でしょ
0は正じゃなかったっけ? んなこと忘れたよ
0かそれ以外だろ?
>>528 load(char** file)
詳細はこのスレか前スレでdisplayがどうとかいう議論があったと思うのでそれ参照。
>これがどうしてもわからないのですが、どうしてなのでしょうか? 煽るようで悪いけど、基本がわかって無いと思われ 変数の有効範囲と関数の戻り値に付いて調べてみたら? この辺きちっと押さえておかないと、なんとなく動くようになっても メモリリークしまくるようなプログラムにしかならないと思う
>>538 それだと呼んでる方と呼ばれたほうで型違いになるでしょ
こうかな? ---- #include <stdio.h> #define SIZE 123 /* 適当 */ #define file_name "hoge.txt" /* 適当 */ extern char* load(void); int main(void) { char* file = load(); /* Segmentation fault の在った位置 */ return 0; } char* load(void) { char* file = malloc(SIZE); FILE* fp = fopen(file_name, "r"); fread(file, SIZE, 1, fp); return file; }
542 :
541 :2005/07/11(月) 03:38:42
fclose()呼んでないけど、いいか?
お前、根本的にかえてやんなよ 変数宣言と関数の呼出と受取でどうにかすべし returnで値を渡すなんて言語道断
うむ 割愛してるっていってるんだから実際はもっと処理をしてるんだろ それを根本的に作りなおさせるのはどうかと
>>531 こうするといくらかマシな気分になったりする?
if(no == 0) {
puts("その数は0です。");
}
else {
if(no > 0) {
puts("その数は正です。");
}
else {
puts("その数は負です。");
}
}
ちなみにこのケースだと、ゼロの時には判定が一回、それ以外は二回になるわけだ。
もしあらかじめ no の取る値が、ゼロと正負で確率的に偏ることがわかっているならば、最も高い確率の値の判定の時に
一回で済むように構成すると、ちょっぴり処理効率がいいよ。
546 :
541 :2005/07/11(月) 04:02:20
>>543 引数から戻り値にしたのは悪かったけど、
return でポインタ(char*)の値返すのが言語道断って、何で?
三項演算子って一項にコンマ演算子いくつでも使えるの?
親亀の上に小亀載せて孫亀乗せればいいじゃない
>>531 おれは
else /* if(no<0) */
的なことを書くことがある。「その他の場合」と「つまりno<0なら」を両方言いたいとき。
こんなのは文芸の世界だと思うけどね。
必要なことしか書いてない無口なプログラムのほうがかっこいいんだけど
ついついよけいなことを言いたくなる。
>>550 俺も以前はそうだったが、最近は if-else if-else の行数を短くして、
コメントしないようにしている。
後は、保守する側の責任ってことで。
>>551 理由も書かんと、分からんがな。
>>550 >>551 そのくらいは自明だけど、とり得る値が x==a , x==bの限定的な場合だったら、
if(x==a){
} else /*if(x==b)*/{
}
ってやるよ。整数の範囲という普遍性のあるものではなくて、
人為的な条件だからこうした方が後々無難。条件が増える
場合もあるし、コーディングを増設するときのガイドにもなって
作業効率が上がる
>>545 >もしあらかじめ no の取る値が、ゼロと正負で確率的に偏ることがわかっているならば、
最近はガイドオプティマイズというのもあるね。
テストプレーしなきゃいけないのが面倒だが、手作業では
とても無理な大量の条件の偏りを調べて判定順序を入れ
替えてくれる。
マジで性能アップするよ>VS2005のPGO最適化
>>553 その場合に限って言うなら、
switch (x) {
case a:
...;
break;
case b:
default:
...;
break;
}
とでもしておく方が保守性は高いんジャマイカ。
>>555 例が簡略すぎたか
条件が==とは限らない。strcmpだったり範囲c<=x<dだったり
と、caseでは対応できないケースも多々あり
557 :
527 :2005/07/11(月) 10:21:00
回答が難しくて理解できない部分があるとです('A`)
558 :
デフォルトの名無しさん :2005/07/11(月) 10:22:07
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
>>558 符号を拡張するのに使う。たとえば、
符号付12ビット数とかが必要なときに
signed int に取り合えずぶちこんで
a << 20 >> 20 とかやると符号が復活
>>557 書き方は2ch的っつーかあれだけど、決して難しいことは書いてない。
今の527さんのレベルだとmallocは早いんじゃないか? おそらく
ポインタやメモリの概念も理解して無い感じだし。
まず大き目の固定バッファに読み込んで、処理内容を自分の
思い通りに書ける様になってから、その過程で固定バッファ
では限界だと自然に思うようになったら、メモリ動的確保を勉強
すればいいと思う。
それまでには変数スコープや戻り値に関しても身に付いてると思われ。
>>558 もっと簡単な例だと、
2倍4倍8倍16倍したいとき
1/2倍1/4倍1/8倍1/16倍したいとき
というか、この機能があるから何かに使いたい、は逆。
これこれこうしたいけど、どういう機能を組み合わせるのか、でしょ。
それともテストの問題か? ビットシフトの用例を上げよ、みたいな
>>553 漏れの場合は
if(x==a){
} else if(x==b) {
} else {
assert(0);
}
ってするな。
前提条件が成立してることは信用しない。
>>562 否定はせんけど、パフォーマンスを重視したい場合もある
>>563 assert絡みは最適化スイッチをONにすると
消えるから、最適化かかってパフォーマンスも
>>553 とまったく同じになるということは期待しても
問題ないレベルだと思う
>>564 } else if(x==b) {
があっても?
>>565 パフォーマンスを考えるなら、
} else {
assert(x==b); ...
567 :
デフォルトの名無しさん :2005/07/11(月) 11:50:53
ポインタに[]をつけるとどうなるんだっけ? int *p; p = new int; p[3]=???
>>566 了解。
でも、前提条件が成立してることは信用できないケースだと、
リリースビルドでその判定を取っちゃってもいいのかな?
話がそれてきたけどw
570 :
デフォルトの名無しさん :2005/07/11(月) 11:56:47
>569 いらないことしてすまんかった。 どうすれば吹き飛ばない?
ポインタの指すメモリからの配列になるんじゃないっけ?あれ?
>>567 参考までに。
char str[] = "abc"
str[0] == *(str + 0) == *(0 + str) == 0[str] == 'a'
>>570 即時的な解決なら
p = new int[4];
p[3]=???
で済むけど、どうしてこうなるのかは理解した方がいいと思うよ。
質問からは、アドレスやメモリの概念がつかめて無い感じを受ける
おまいらありがとう。 >572の答えが知りたかったです。助かった。
それ以前に、CとC++の区別をつけたほうがいい。
>>571 解決したようだけど一応指摘
>ポインタの指すメモリからの配列になるんじゃないっけ?
ポインタの指す先のことなど考えずに配列としてアクセスする、が正確
先がNULLだったり領域外だったら当然吹き飛ぶよ
つまり int x[3]; int *p; p = x; /* p[1] == x[1] */ ってこと?
>>559 それだと負数を2の補数で表現し、なおかつ算術シフトする処理系じゃないと復活しない。
a | -1U << 12
の方が確実
>>578 その場合はxが有効な期間内なら問題ないです
>>579 よく検証したわけじゃないんだけど、それだとaが+でも上が
埋められないか?
>>578 > p = x; /* p[1] == x[1] */
違う。
p= x; /* p = &(x[0]);*/
584 :
デフォルトの名無しさん :2005/07/11(月) 12:59:47
>>584 学生?
ガンガレ
今のうちにいじり倒してプログラムが何たるものか肌で理解しとくといいよ
入門編の本のとおりにやったら動くと思うから、どうしてそう書かないと
いけないのか考えてみるといい。で、自分の動かないプログラムと
どこが違うのか検討汁
586 :
579 :2005/07/11(月) 13:06:30
>>581 あ、そうだね。orz
a | -((unsigned)(a >> 11) << 12)
>>568 信用できないなら取っちゃだめだと思う。
「信用できない」がプログラマの勘違いなら、コンパイラが最適化して取ってくれると思う。
ま、
>>562 でも同じことがいえそうだけど。
>「信用できない」がプログラマの勘違いなら、コンパイラが最適化して取ってくれると思う。 ? 書かれた有意なコードをコンパイラは取らないでしょ。人間が見て 不要と思われるものもコンパイラには判断付かないから
>>589 横から首突っ込むけど、
assert はりリースビルドの時に取り除かれるから、
それに繋がる if も最適化されて消滅する、っていう話ではなかったの?
>>590 たぶん
>>562 の場合は最後のelse節は消えるけど、} else if(x==b) {
は消えない。結論は
>>566 で出ているけど、すでに話は違っている模様
>>589 「人間が見て不要と思われるもの」の指してるものが曖昧で良くわからんが、
翻訳単位全体を見た上で論理的に明らかに不要なものを消すぐらいのことは今の技術で十分可能。
可能だからって実際に実装してるとは限らんが、そういうのもあるんじゃないの?
と、微妙にトーンダウンするおれガイル。
>>592 確かにトーンダウン(^^;)
目の前で話したらまた違うだろうけど、あまり有意な話でも
無くなりつつあるし、この辺で御開きに
引数で渡された値が不正な時にassertしてるようなケースでは、 信用できる値が渡されるかどうかまでコンパイラはチェックできないんじゃ?
595 :
523 :2005/07/11(月) 15:06:59
結局誰もできないんですね
Cじゃできないでしょ
int (*pf[10])(int, void(*)(char *)); まったくもってこれの意味がわからないんですけど解説していただけませんか?
>>594 コンパイラが(性能上の問題でなく)原理的にチェックできないようなケースでは
assertを消すのもまずいんじゃない?
>>597 pf is array[0..9] of pointer to function(int, pointer to function(pointer to char) returning void) returning int.
>>597 pfは、「引数が2つ(※)で戻り値がint型の関数」へのポインタで、配列宣言されている。
(※)2つの引数
・int型
・引数char*型で、戻り値無しの関数へのポインタ
>>597 まず、関数はわかるか?そりゃわかるか。
関数ポインタはわかるか?
#include <stdio.h>
int main(void) {
int (*f)(const char *, ...) = printf;
f("Hello World.\n");
return 0;
}
なんてポインタ変数を使って関数を呼び出したりできる。
あとは自分で考えるなり調べるなりすれば、わかると思う。
意味わかんね 俺にもわかるように説明しろよ
>>595 >>523 仕方ないな。みんな答えないみたいだから、オレが。
ファイルを"r"で開いてるだろ。それをfreadで読んだら
ファイルのサイズより若干多く読み込まれることがある。
(改行を変換して読み込むから)
mallocは正味のサイズしか確保されていないから、増えた分で
バッファオーバー起こして吹き飛んでんじゃねーの?
604 :
デフォルトの名無しさん :2005/07/11(月) 16:28:29
じゃんけんをするプログラムを下のように作ったんですが、 終了を宣言するまで繰り返し実行させたい場合は、どうしたらいいんでしょうか。 一応5回繰り返すことになってるんですが。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int i,m,e,w[3]={0},j; char h[][9] = {"グー","チョキ","パー","勝ち","負け","あいこ"}; srand((unsigned)time(0)); for(i=0;i<5;i++){ printf("%s:0 %s:1 %s:2\n",h,h+1,h+2);scanf("%d",&m); ++w[j=(m==(e=(double)rand()/RAND_MAX*3)?2:(m+1)%3==e?0:1)]; printf("YOU:%s,PC:%s,%s\n\n",h+m,h+e,h+j+3); } printf("%s:%d,%s:%d,%s:%d,勝率:%d%%",h+3,*w,h+4,w[1],h+5,w[2],*w*100/5); }
>>604 for(i=0;i<5;i++) → for(;;)
にしてみな。無限回繰り返すから。
あとは終了条件でbreakすればいい。
607 :
デフォルトの名無しさん :2005/07/11(月) 17:20:32
誰か教えてください! 入力した数字(最大8行)を、「*」を用いて花文字で表示するプログラム (例)数字を入力してください:56 ***** ***** * * ***** ***** * * * ***** *****
608 :
デフォルトの名無しさん :2005/07/11(月) 17:21:28
↑ミスった
>>607 何がわからないのか、具体的に。
# 全部はなしだぞ。
>>603 > ファイルを"r"で開いてるだろ。それをfreadで読んだら
> ファイルのサイズより若干多く読み込まれることがある。
もしかして、本気でそう思ってる?
>>610 ちがうのか? それ以外の理由があったらご教示お願い
>>611 Cでは改行の内部表現は常に'\n'1文字。
どうやっても外部表現だってそれより短くはできないだろ。
>>611 fread()の件に関しては、ファイルサイズより若干余計に*読むことができる*が、
決してパラメータで渡したよりも余計に*読み込む*訳ではない。
>523は別の原因だろ。
614 :
デフォルトの名無しさん :2005/07/11(月) 17:52:39
あれ? \n->\n\rへの変換って出力時?
>>611 読み込みの改行変換でサイズが増える環境は現存しない。
>>523 に対して解決策が示されていないのは、挙げてあるコード
だけでは情報量が少なくてどこが間違っているのかわからないから。
618 :
デフォルトの名無しさん :2005/07/11(月) 17:59:41
ひどいコードだなおい
>>615 出力先っつーかまあ大体はターミナルがそう変換してる
だから\r\nとかきちんと書かないとダメなパターンも
それなりにある
622 :
607 :2005/07/11(月) 18:42:45
どなたか綺麗なコードでお願いします
自分で書け
>>622 おまえのきれいなコードとやらを書いてくれよ
汚いコードだとは思わないけどな
せめてstaticつけとけ
628 :
デフォルトの名無しさん :2005/07/11(月) 21:25:50
ファイル出力をするのですが、出力のたびに名前を変えるにはどうしたらよいですか? FILE *fp; fp=fopen("c:/data.txt","w"); if(fp==NULL){ printf("open error"); exit(0); } ここの部分でたとえばファイル名をdata1.txt/data2.txt/data3.txt・・・と自動で変化させることはできますか?
>>628 できる。
文字列定数じゃなくて、文字列配列で、sprintfとかつかえばよろし。
630 :
628 :2005/07/11(月) 21:29:41
ファイル関係については参考書を写しただけなのでちょっと知識に乏しいです もしよろしければ文例など教えてもらえませんか?
>>630 直書きだが。
char filename[64];
FILE *fp;
int i;
for (i = 0; i < 10; i++) {
sprintf(filename, "c:\\data%d.txt", i);
fp = fopen(filename, "w");
....
}
632 :
628 :2005/07/11(月) 21:40:14
ありがとうございます
後だしで申し訳ないんですが、実行毎に名前が変わってほしいのが目的なんですがぁ・・・
>>631 だとファイル呼び出しの度に・・・ってことだと理解したんですが
なんていうか
1回目実行・・・ファイル作成した・・・終了
数値ちょっと変えてリビルドして実行・・・ファイル作成・・・終了
の時に毎回違うファイル名になるようにってことなんですが
すいませんわけわかんなくて
perlとかスクリプト使ってファイル名defineしたヘッダ吐いて、 それをmakefileに組み込めばできる。 けど、それを細かく説明する気は起きない。 すまんな。
あ、必ず一回実行するんなら、番号をファイルに吐き出して それを元に+1した数値を使えばいいんかな。 ビルド毎だとめんどいと思う。
意味わからん。 sprintf(filename, "c:\\data%d.txt", rand());
636 :
628 :2005/07/11(月) 21:44:50
プログラムで処理するくらいなら手動で 実行・終了・ファイル作成 手動でファイル名変えておく また実行・・・・ファイル作成 としたほうが面倒じゃないということですね ありがとうございました
>>632 001が存在すれば002、
002が存在すれば003
っていう風に変化させればいいじゃん。
fopenでは読み取りで開こうとしたときにファイルが存在しなければ失敗するからファイルがあるか判定できる。
ファイル名に時刻を入れとけばいいんじゃないの?
639 :
628 :2005/07/11(月) 22:00:47
自己解決しておいていまさらなんでsage
>>635 を少し変えて
sprintf(filename, "c:\\data%d.txt",time(NULL));
にすれば毎度違うファイルが出来るのに気づきました
キーボードから英文を読み込み、英文に現れる異なる単語の数を求めるプログラムってどうすればいいんでしょうか? strcmpを使うようなのですが。
>>640 まず、キーボードから英文を読む
この時点で英文かどうかのチェックを済ませておいたほうがいいな
つぎに、英文を単語に分割する
スペースかなんかで区切ればいいな
再利用なんか考えずに元英文は破壊してもいいよな
区切ったらポインタの配列に放り込んでいこう
その後、最初の単語から順に異なってないか調べる
もし一致してたら面倒だからその単語はぬるぽしとこう
最後に、集計結果を表示だ
643 :
デフォルトの名無しさん :2005/07/11(月) 23:24:12
名前呼びを用いると、ある式eに対してD,ρ├ e ⇒ A kとなる数字kが存在するけれども、値呼びを用いると、D,ρ├ e ⇒ A kとなる数字が存在しない宣言の例ってありますか?
644 :
デフォルトの名無しさん :2005/07/11(月) 23:27:40
Cのコンパイラってどこに置いてありますかね・・・?
/bin
646 :
日本道路公団 :2005/07/11(月) 23:31:11
今日もさぼちまった
>>644 C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin
>>647 へー。VCバージョン7って名前ついてんだ
煽るならもうちょっと面白いこと言えよな…
651 :
デフォルトの名無しさん :2005/07/12(火) 00:55:00
二次元配列を利用するとなぜかSegmentation faultがでるのはどうしてでしょうか? プログラムは間違っていないんですが。
プログラムが間違ってないならメモリのハードウェアエラーだな。 PCの修理をすれば直る。
ハード不良
654 :
651 :2005/07/12(火) 01:01:08
どうも。調べてみます。
>>639 前にそのコード書いて
「OSの時刻戻されたらどうすんだよ。」と言う上司と
1時間もめたことがあるw
>>651 プログラムが正しいと判断した理由教えて
大きい配列を取るときは、エラーチェックすべきですか? 例えば、 static double f[10][100][1000]; とか書くときです。
何の?
はみ出てるかでてないかの?
すいません、確保できたかどうかのです。
どうやって?
main() { static double f[10][100][1000]; puts("succ"); } で文字が出たら成功でなかったら失敗。
普通に宣言したならコンパイル時にチェックじゃないの?
>>664 本当に確保できるかどうかは実行時にしかわからないだろ。
OS側の問題。
ああ、そうだな…ボケてた。
>>663 ありがとうございます。試してみます。
>>664 コンパイラが自動でチェックしてくれるということですか?
669 :
667 :2005/07/12(火) 02:15:07
要するに 663を試せってことですよね?
>>658 グローバル変数とかなら、コンパイルした実行ファイルが起動できれば確保は成功してると思っていいと思う。
こういう変数の領域は、プログラム起動時からメモリ中に居座るから、もし確保できなければプログラムが起動しない。
だから、コードでそれを検出する必要は無い。
スタック上に取る auto な変数なら、その関数に入った段階でメモリ(スタック)が足りなくなれば、stack overflow で落ちる。
コードでそれを検出することはできない。
malloc 等で確保するならば、確保が失敗したら NULL が返ってくるから、それで判断できる。
ただし環境によっては、広大なメモリ領域をリクエストした段階では確保に成功したかのごとく返ってきて(アドレス空間だけ
確保する)、実際にメモリを使っていくと突然メモリが足りなくなって意図しないことが起こる、なんてこともある(Linux の
楽観的メモリ配置)。
これはコードで検出できるのかな?
>>670 じゃあstaticしてるから検出必要なし?
672 :
670 :2005/07/12(火) 02:25:56
>>671 うん。
書き忘れたけど、static な変数もグローバルな変数と同じで、起動時に確保されちゃう(はず)。
だから、プログラムが起動できるかできないかのいづれしかないから、コードで検出する必要は無い。
そもそも、馬鹿でかい配列はmallocなどで確保するようにすればいい
あんちゃん、それを言っちゃあ(ry
#include <stdio.h> #include <limits.h> int main(void) { int i = 1; while(i < INT_MAX) { printf("%d\n", i); i *= 2; } return 0; } これを実行すると0がずっと表示されるのですが何故でしょうか (i < 1073741824)までは正常に表示されるのですが gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)
i *= 2; printf("%d\n", i); に順番変えて実行してみなー
mallocはしょきかがむずかしいじゃん
>>677 コードで書けばいいじゃん
CPUにとってはやってるステップ数さほどかわらんよ
>>677 calloc()使えば?
実際には実メモリ以上のメモリを確保したときに、calloc()は不利なわけだが。
>>675 int が 32bit な環境だと、INT_MAX は 0x7fffffff = 2145483647 になる。
i*=2 を繰り返していくと、いずれ i は 0x40000000 = 1073741824 になる。
この状態でさらに i*=2 をすると、i は 0x80000000 になるが、これは符号付整数では -2147483648 になってしまう。
だから while の i < INT_MAX で終了できない。
さらに i*=2 をすると、i は 0x100000000 になり、32bit の範囲を超えてしまい、結果の下 32bit = 0x00000000 = 0 が
残り、以降 i = 0 のままループを繰り返す。
まず符号付のしくみから教えないといけないヨカーン
>>680 詳しい説明ありがとうございました。
符号付整数は多分こんな感じになっているのですね。
0xffffffff = -1
0xc0000000 = -1073741824
0x80000000 = -2147483648
0x7fffffff = 2145483647
0x40000000 = 1073741824
0x00000000 = 0
それで0x80000000の2倍は0x1(00000000)で
この括弧の部分が32bit分なので0になるってことなのかな。
勉強になりました。ほかの人たちもありがとう。
683 :
デフォルトの名無しさん :2005/07/12(火) 10:46:41
#include <stdio.h> #include <stdlib.h> #include <time.h> double a_init(double a) { int i; srand(time(NULL)); a = rand(); return a; } double a_rms(double a) { double s = 0.0; s += a + a; return (s); } int main() { double x, y; printf("X = %lf\n", a_rms(a_init(x))); printf("Y = %lf\n", a_rms(a_init(y))); return 0; } これで実行しても、同じ秒数の間に実行されちゃって、XとYの値が同じになっちゃいますよね? どう変えたらXとYに別々の乱数を読み込めますか?
srand()はmain()の頭で一回のみ呼べば良い。
「宣言に型が多すぎる」てエラーが出ました エラー行は「void main()」です どうしたらよいでしょうか?
なんで最近の若者はtimeで乱数をつくろうとするの?
スレ違い
int main(short argc, char **argv) で、宣言すると なんで warning: first argument of `main' should be `int' って怒られんの? 引数の数なんてcharでも足りるでしょ ちゃんとした理由知ってるひといます?
規格でそう定められてるから。
初期化?
>>691 フレームカウンタとか、ユーザからの入力とか。
プ
timeのほうがよっぽど汎用的じゃねぇか。
>>686 が何を非難しようとしてるのか分からん。うらやましいだけか?
>>686 1. 手っ取り早い
2. よく使われている例を丸写ししただけ
3. 他の方法を考えるのが面倒
こんな感じでは?
そもそも、昔は乱数表だろ。
C/C++でスレッドプールを扱うための標準ライブラリってあるんですか?
ない。
701 :
683 :2005/07/12(火) 13:03:42
>>684 int main()
srand(time(NULL));
・
・
ってことですか?
コンパイルするとここでは宣言できないって言われるですが
>>701 int main()
{
srand(time(NULL));
:
}
ただ、main の頭でやるというか、他で rand を使うに先立って一度だけ srand をすればいい。
だから別に main でやらなくてもいいよ。
>>701 「mainの頭」と言われて、srandを変数宣言よりも前に置いたのかw
愉快な奴だなw
705 :
683 :2005/07/12(火) 13:16:38
706 :
683 :2005/07/12(火) 13:19:56
c99なら無問題。
まぁ、mainの頭といったら srand(time(NULL)); int main とかするよりもマシだろう。 # ソースを「実行」しようとした奴もいたし...Cはスクリプトじゃねーよ
>>708 いくらなんでも関数本体のブロックに入る前じゃダメだろ
慎重を期してrandの直前で呼ぶのがいいよ
712 :
デフォルトの名無しさん :2005/07/12(火) 15:36:01
整数nを入力し,下記の数列の和を計算するプログラムを作成しなさい. 8/(1×3)+8/(5×7)+ ‥‥ +8/{(4n-3)×(4n-1)} ただし,nは1以上とする #include<stdio.h> void main() { int i,n,kou,wa=0; printf("1以上の整数nは?\n"); scanf("%lf",&n); for (i = 1;i <= n; i++) { wa += kou; kou = (double) 8 / (4 * i - 3) * ( 4 * i - 1); } printf("和=%lf\n",wa); } すいません・・・ずっと考えているんですがどこが違っているのか わかりません。どなたか教えてください。
>>712 int は整数の型ってことに注意。
少数を扱いたいなら float か double。
ソースを見たところ i と n は int で構わないだろうけど、それ以外は少数なんでないかい?
wa kou が逆だろ。ゆとりありすぎ
蛇足ながらもう一点。 浮動小数点型においてたくさんの数値を足し込むときには、値の小さいものから足していくと誤差が少なくなるよ。 とどのつまり上記問題では、i を 1 から n に向かってループさせるのではなく、n から 1 に向かってループさせると 精度が良くなるってこと。 これは C固有のテクニックではないけどね。
716 :
712 :2005/07/12(火) 15:52:23
みなさんどうもありがとうございました
>>712 >713の注意と、scanf()の型指定子にも注意。
それと、>714の言いたいことはwaに加算する順序が違うだろうと言うことだな。
カッコが足りんような気するのはオレだけか? <kou = (double) 8 / (4 * i - 3) * ( 4 * i - 1); >kou = (double) 8 / ((4 * i - 3) * ( 4 * i - 1));
>>718 括弧より、お前の知識が足りない。小学校からやり直せ
720 :
718 :2005/07/12(火) 17:05:43
小学校にはなれませんね、残念ながら。
なんだか凄い流れだな
>>718 だけじゃないようだ。よかったね。
だが気のせいだ。何を気にしているのか知らんが。
fflush(stdin);のもっと行儀のいいポータブルな書き方ってないの?
処理系依存
じゃあ712でscanfの入力でリトライ機能入れようと思ったらどう書くの? for(;;){ printf("1以上の整数nは?\n"); if(scanf("%d",&n)==1 && n>=1) break; *ここで行末まで読み捨てる。 }
scanf("%*[^\n]%*c");
そもそもscanfは使わない希ガス
.。o sscanfとfgetsが相談しているようです。
やっぱり括弧が足りない気がする。
733 :
726 :2005/07/12(火) 18:14:51
>>728 なるほど。
でもEOFも検出しないと無限ループだからこんな感じか。ショッペー
for(;;){ int c = getchar(); if(c==EOF) return 0; if(c=='\n') break; }
バッファをフラッシュするのとEOFまで読み捨てるのとでは意味が違う
>>732 いったいどういう仕組みなんだろう、何で括弧入らないんだ?
割り算が先に評価されると思うのだが
>>735 サンプルソース
int i=1;
printf("%f\n", (double)8 / (4*i-3)*(4*i-1));
printf("%f\n", (double)8 / ((4*i-3)*(4*i-1)));
実行結果
24.000000
2.666667
どっちが正しいの?
fgetsとgetcharとstrchrで自作関数だ!
今頃Cなんてやってどうするの?バカジャネーノ
>>734 フラッシュする代わりに読み捨てちゃダメなの…?
741 :
736 :2005/07/12(火) 18:36:26
>>737 あ、ちなみにおれは括弧が必要だと思ってるよ。
小学校に入れるものなら入ってやり直して女友達をいっぱい作りたい。
あれ、1行目と2行目がつながりませんよ
>>742 どういうこと、つながってないとは、一連の問題文に読めるが?
double f(int n) { return (n<1) ? 0 : f(n-1) + (8.0 / ((4*n-3) * (4*n-1))); }
>>738 最近C言語の解説本、増えてるよね? 流行ってんじゃねーの
今更なんだけど、 >8/(1×3)+8/(5×7)+ ‥‥ +8/{(4n-3)×(4n-1)} これさ >8/(1×3)+8/(5×7) >8/{(4n-3)×(4n-1)} おかしくね?
お前ら頭悪すぎ
>>748 さすがにそれは違う
8/(1×3)+8/(5×7)
これはn=1 , n=2を連続して書いてるだけだ。代入してみなよ
>>743 ごめん。おれの読み間違いみたいだ。
小学校に入って女友達作ってくる
>>749 だから何で括弧が要らないのか教えてくれ。気になって仕事に戻れんw
割るは÷だろ /は分数 だから8/(4n-3)×(4n-1)は 8 −−−−−− (4n-3)×(4n-1) なんだよ。小学校から出直せ。
C2005では分数がサポートされます。
>>754 a/b*c+d って書いたらどうなるんだい?
a
−−−−
b * c + d
とか言っちゃう?
759 :
デフォルトの名無しさん :2005/07/12(火) 19:23:55
char Buf[480][640]; こういう2次元配列用のポインタって宣言出来ましたっけ?
できるけどちょっと難しいよね。typedef組み合わせればわかりやすくなるかも
char (*bufp)[640];
762 :
759 :2005/07/12(火) 19:48:37
thx
>>760-761 上手くいきました。
>char (*bufp)[640];
どう読むのか難しいでつね。
763 :
デフォルトの名無しさん :2005/07/12(火) 19:48:45
「FFZ→C言語 FF[→アセンブラ言語」
>>762 bufp is pointer to array[0..639] of char.
結びつきの強いものから順に。英語で読む。
bufpはcharの配列[0..639]へのポインタ
みんなクイックソートって何に使う? 自力で組めるようになった? おれは自力で行ったのはマージソート。そのあと基数ソートにたどり着い ちゃってクイックソートイラネ
766 :
デフォルトの名無しさん :2005/07/12(火) 22:10:17
#include <stdio.h> int is_prime(int n) { int i; if (n < 2) return 0; for (i = 2; i < n; i++) if ((n % i) == 0) return 0; return 1; } int main(void) { int i; for (i = 2; i < 500; i++) { if (is_prime(i) && is_prime(1000-i)) printf("%d %d\n", i, 1000-i); } return 0; } このプログラムで各々が何をしているのかわかりません。 教えてくれないでしょうか?
それC言語の話題じゃない。
関数名だけ見て。 素数かどうかチェックする関数だろ。
if は条件分岐で、 for は条件ループで、returnは変数からのリターンで is_primeは素数判定で、printfは標準出力への文字列表示です。
771 :
デフォルトの名無しさん :2005/07/12(火) 22:55:03
ファイルを開くとき、ファイル名に~/とか../を使いたいんですが、 fopenではファイル名にこういうのを入れられない。 フルパスに展開する関数とかあるんでしょうか。
ないよ。環境変数のHOMEとか取得するしかないかな。 いずれにせよ、環境依存のコードになるだろうな。
../って使えないの?
>>771 Winなら GetFullPathName とかなかったっけ? ~ ならUNIX系か
>>773 Winなら使えた記憶がある
はー?
#include <stdio.h> int main(void) { int i, j; int ma[2][3] = { {1, 2, 3}, {4, 5, 6} }; int mb[3][2] = { {1, 5}, {5, 3}, {8, 1} }; for (i = 1; i < 2; i++) for (j = 1; j < 2; j++) mc[1][1] = ma[i][j]*mb[i][j] + ma[i+1][j]*mb[i][j+1] + ma[i+2][j]*mb[i][j+2]; mc[1][2] = ma[i][j]*mb[i+1][j] + ma[i+1][j]*mb[i+1][j+1] + ma[i+2][j]*mb[i+1][j+2]; mc[2][1] = ma[i+1][j]*mb[i][j] + ma[i+1][j+1]*mb[i][j+1] + ma[i+1][j+2]*mb[i][j+2]; mc[2][2] = ma[i+1][j]*mb[i+1][j] + ma[i+1][j+1]*mb[i+1][j+1] + ma[i+1][j+2]*mb[i+1][j+2]; for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); } 2行3列と3行2列の積をもとめるプログラムなんですが mcを求める演算を簡単にするにはどうしたらいいのでしょうか。 しかもこれさえまともに動かない・・orz
>>777 まともに動かないのは、forの括弧が抜けてるから
779 :
778 :2005/07/12(火) 23:15:10
それだけじゃ、ないみたい・・・w
まるでループ不要
ループ意味をなしてないですよねw かなり強引につくったんですが
782 :
デフォルトの名無しさん :2005/07/13(水) 00:08:37
double a, b, c; a = 0.509; b = 1.501; c = a ^ b; ↑こんな感じで書くとビルドエラーになるんですが、小数同士の Xorを取るにはどうすればいいんでしょう? "^"の左右オペランドが間違いとか言われます。
小数のXORって……一体どんな値が出ることを期待しているのかなぁ。
>>783 C のビット演算は整数専用なんだけど。
整数、というか概念的には、ビット集合だよねぇ。 論理演算が使えるのは。
SSE2レジスタに浮動小数イメージのままxorする命令があった
命令サポートするって事は用途があるって事なんだろうけど 何に使うんだろう
>>782 参考になりました。ありがとうございます
Cとかwプッw
なにをするきさまらー
ここはゲーム板じゃねえんだよ。 腐りきったロマサガネタなんぞ書くなバカモノ。
794 :
ぬるぽ :2005/07/13(水) 02:50:57
なにをするきさまらー
795 :
ルート :2005/07/13(水) 03:19:48
Borland C++コンパイラをダウンロードしたんですけど、これってダウンロードしただけで使えるんですか? ダウンロードしたファイルからインストールするものとかあるんでしょうか? あと、Borland C++コンパイラの命令コマンドって何ですか?
くだらんネタ続けるなよ
797 :
デフォルトの名無しさん :2005/07/13(水) 05:22:51
#include<stdio.h> int sub(int x,int *y) { x = x + *y; *y= x + *y; } main() { int a,b; a = 3; b = 2; printf("a=%d b=%d",sub(a,b)); return 0; }
798 :
デフォルトの名無しさん :2005/07/13(水) 05:29:17
情報処理試験の問題をCで書き直してみたのですが、 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。 という警告が出ます 仮引数xは値呼出し、yは参照呼出しにしたいんですけど。。 すいませんが、詳しい方、ちょっと手伝って下さい
訂正です printf("a=%d b=%d",sub(a,&b)); に、変更したのですが まだうまくいきません 最終的に、a = 3, b = 7 にしたいのですが
「うまくいきません」じゃなくてさ…
>>799 できました
sub(a,&b);
printf("a=%d b=%d",a,b);
有難うございました
情報処理試験の問題作成者って楽な仕事だな。 俺もやりたい。
お前は試験官
>>788 例えば最上位ビットを切り捨てれば絶対値が取れるのは割りと有名
最上位だけ1でxorしたら符号反転したことになる
もっとも
>>783 の質問の意図はわからん。そういうことがしたいのかな?
>>783 double サイズ分、char に見立てて xor かければいいだけだろ?
807 :
東海大学前 :2005/07/13(水) 10:11:42
プログラミング初心者なのですが、「別に保存してあるデータから、数の総和とそれぞれの平均を計算し、表示する。という問題で二つの数字のどちらも60のを合格者として、 その人数を表示し、60以上の数字を合格者として、その人数を表示する。」という問題が教科書にあったのですが、まだ始めたばかりなのでよく分からないのでよかったら教えてください。
>>805 最上位ビットを反転すると符号反転になる?
int でそれやるとぜんぜん違う値になるんだけど、浮動小数点ってそうなの?
>>809 そう、なる。だから浮動小数にはマイナスゼロ(0x800000…)がある。
普通に演算子使ってもそういうコードが吐かれるんじゃないの?
>>811 符号反転なら浮動小数命令が使われる場合もある(not a number例外がほしいなど)
絶対値だとCに演算子が無いんだな、これが
813 :
409 :2005/07/13(水) 12:13:42
>>810 なるほどおもしろいな。
たしかに浮動少数は、固定長の値みたいに2の補数表記にしたからといって演算上のメリットは乏しいもんな。
Cで浮動小数の絶対値取りたいなら、IEEEのフォーマットに合わせた ビットフィールドとの共用体を定義して、最上位に代入する形で 実現できる。これもよくやる手だよ union{ float f; struct{ int s:1; int e:8; int n:23; }; }; sを消せばfの絶対値が取れる
>>810 データとしてはあり得るが、値としてはないんじゃないか。
IEEE754では-0.0は+0.0にされちゃうんじゃなかったっけ?
>>816 処理系依存だし・・・普通にfabs使えよ・・・。
そのへんはよく知らないが、実際マイナスゼロをプロセッサに 突っ込んでもおかしくならない。
>>818 float f;
if(f<0)f=-f;
と書くと fabs使ってくれるコンパイラと処理系もあるかもしれん。
まあ、Cでやるならビットフィールド使うにしても、もう一枚マクロ着せるか
>>820 でも memcpy とか memset とかは、扱うサイズが小さい場合は関数呼出にもかかわらず最適化されて
インライン展開(というかストレートライン展開?)されることもあるよ。
そういったことも全て処理系依存なんだから、極力見やすいコードを書く方がいいと思われ。
# テクニックとして知っていることはいいことだけど
そだね
>>809 負整数の表現方法は3つ規定されている。
・2の補数
・1の補数
・符号と絶対値
最後の方法を採ってる処理系なら符号反転するが、そんな処理系は滅多にない。
浮動小数は普通は上位から順に符号ビット、指数ビット(列)、仮数ビット(列)となってるから
最上位を反転させれば符号が逆になる。
void test1( int limit, ... ) { va_list ptr; va_start( ptr, limit ); // 間違ってるかも test2( 2, ??? ); } void test2( int limit, ... ) { // 4. 5 と表示 } main() { test( 2, 4, 5 ); } 意味だけ汲み取っていただけると幸いです。 こんな感じで可変長引数を宣言したとして、test1 の 可変長引数を test2 に引き継ぐにはどうすればいいのでしょうか?
>>825 できるのか?
インラインアセンブラ使ってjmpするくらいしか思いつかん。
例えばprintfなら展開された後の配列を受け取るvsprintfみたいなのに
処理を引き渡すけど、そういうんじゃ駄目なのかな?
828 :
デフォルトの名無しさん :2005/07/13(水) 18:43:42
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
>>828 友達いないの?そんなにさびしい人生おくってるの?
氏ねば?
>>829 よっぽどストレスのたまる人生をおくってるようで。
まったく同じことどっかに書いてるけど、自動書き込みロボットとか
>>828 画面イメージをビットパターンで持っているとき
横スクロールに使える
暇つぶしに FAQ 日本語訳呼んでたけど、 15.10: よって va_arg(argp, float);と書くのは常に誤りである。 かわりに va_arg(argp, float)と常に書かなければならない。 ってあったけど、どう違うの??
それ見ただけでクオリティーが分かろうってもんだ
>>833 可変長引数にfloatは無い。
値はdoubleに成り上がってスタックに取り付くのだよ。
837 :
デフォルトの名無しさん :2005/07/13(水) 23:12:58
838 :
デフォルトの名無しさん :2005/07/14(木) 01:30:23
aが入力されると1が出力されて bが入力されると2がしゅ(ry これはどうやればいいのかご伝授願います
>>838 main() { int c; while((c = getchar()) != EOF) putchar(c - 'a' + '1'); }
>>839 即レスthxです
aが入力されるとプログラム上ではc=1と入力されてるはずですが
if (c==1) printf ("てst");
これを付け加えてみた所、正しく表示されませんでした
また、aを入力すると 1レ と表示されましたがこれでよろしいのでしょうか?
>>840 あれじゃ所詮数文字しか出せないからな。
>>840 レは多分LFが化けたんだろう
a->1という仕様は
>>839 で満たされている。
他に要求があるんならもっと仕様をはっきりさせろ。
イタタタ
>aが入力されるとプログラム上ではc=1と入力されてるはずですが ? そうなのか? c=='a'じゃないの?
845 :
デフォルトの名無しさん :2005/07/14(木) 18:38:12
C言語の事で聞きたいのですが。 スタック構造を使って逆ボーランド記法をプログラムして、プッシュとポップを それぞれ関数で書くのは、どうやってやったらいいですか? 教えてください〜
>>845 何がわからないのか、もっと具体的に。
と言うか、他の言語ならわかるのか?と小一時間(ry
もしかして:逆ポーランド記法
>>845 マルチ乙。宿題スレで回答があるようだぞ。
.,Å .r-‐i'''''''''''i''''‐-、 o| o! .o i o !o .|\__|`‐´`‐/|__/| |_, ─''''''''''''─ ,、 / 、-' u -、 / U 0 \ / / i | ● ,,. .,, ● | __ . ! (_人__) ノ /´ ̄ `!. 丶_ u U ノ | `にこ匸'_ノ . '-、、,,,,,,_______,,,,,,、、-' ノ u { _.. -―| :{ ,/ / \ . / l | __ / ̄ ̄`>'´ ノ' ´ {、 \ / |/ {'´ `ヽ. " ̄\ U `ヽ. __,,.. -‐丶 u ヽ | / ヾ、.. } u' 〉、 } `ー''´ /´ ̄ `ヽ '" ̄\ ! :} )「` ノ、 ノ l\"´_,,ニ=-― <´ ヽ{ ノ( `、 | l 、_,/j `ー一''" }, ノ , '''''"" \ ヽ ⌒ヾ v | ヽ _ / } {. { l ┌n‐く ヽ/ ``\ ノ `¨´ `¨¨¨¨´ ̄`{ 0 `'^┴'ー┘|ヾ }、 u' ` --‐r'′ キングヤッタス!!
ほとんど同じような処理を行う関数を作る場合、 ふつうに二つ関数を定義するのと、引数とかによって条件分岐させて一つの関数ですませた方がいいのか、 分からないので教えてください。もしかして、好みとか気分の問題になってくるんでしょうかね?
852 :
デフォルトの名無しさん :2005/07/15(金) 00:37:54
int main(){ ・ ・ ・ return 0; ←の意味を教えてください } 0を返す、というのは分かるんですが、 返すことでどうなるのか、そこが気になるのです
バッチファイルやMakefileで使う
>>852 そのCで作ったアプリ・ツールを呼び出す側で使う。
0なら正常終了でエラーがでたら1, 2, 3と数字を増やして返すのが一般的。
>>850 実装上の都合で考えるのではなく、その関数を利用する立場で考えるのがいいかと。
例えば利用する側が双方を交互に呼ぶようなら一つの関数で引き数で分けるのがいいし、
同一対象を片方は読み片方は書くなど利用する目的が異なるなら関数を分けるべき。
前者は例えばstrtok()、後者はfread()/fwrite()など。
>>850 引数の個数が違うなら素直に分ければいいし
int foo(int flag, BOOL use_flag); // みたいに無理にまとめるのはバカっぽい。
個数が同じならモードや引数の解釈に関する引数をもう一つ追加するのもあり。
どっちでもいいと思えるなら処理が同じということでまとめてしまってもいいか。
「実装」ではなく関数の「意味」から考えるべき。
858 :
856 :2005/07/15(金) 01:25:01
意味がかけ離れてないってのが前提だけどな。 856はC++のoverloadか分割か程度の判断基準。 さすがにfread/fwriteみたいなのをまとめるかで迷ってはいないだろ。
>>850 引数で処理を分ける関数と、それを呼び出す入り口関数を用意するって方法もあるよ。
/* 関数の実装 mode によって処理を分ける */
int FuncImpl(int arg1, int arg2, int mode)
{
:
}
/* 関数の入り口A */
int FuncA(int arg1, int arg2)
{
return FuncImpl(arg1, arg2, 0); /* mode=0 で処理本体を呼出 */
}
/* 関数の入り口B */
int FuncB(int arg1, int arg2)
{
return FuncImpl(arg1, arg2, 1); /* mode=1 で処理本体を呼出 */
}
入り口関数の代わりにマクロを定義してもいいと思うけど、共通ではない処理の一部を入り口関数に追い出すことにより
FuncImpl の実装が完結になったりするから、状況に応じて検討すればいい。
>ほとんど同じような処理を行う関数 使う側の都合による a.ある場所からそれぞれ使う b.まったく別の場所から呼び出す a.ならパラメータにより1関数内部で分岐 b.なら別関数
>855が書いたことを、自分流に言い直すスレはここですか?
>855が書いたことを、自分流に言い直すスレはここです
863 :
デフォルトの名無しさん :2005/07/15(金) 09:22:23
すいません。C言語の変数の宣言と代入式の質問なのですが char型の一次元配列の内容をコピーして二次元配列に格納したいんですけども char toranp[13] = {"A","2","3","4","5","6","7", "8","9","10","J","Q","K"}; char toranp[13][4] = {{"A","2","3","4","5","6","7", "8","9","10","J","Q","K"},{}};
864 :
デフォルトの名無しさん :2005/07/15(金) 09:27:09
皆さんのような優秀なプログラマは、トランプのカードを配列に入れたいときどのような方法を取られますか?
>>864 0〜nまで、順番に選んだカードをランダムに選んだカードと交換していく。
これが完全シャッフルになるという証明もどっかにあった希ガス。
for (i = 0; i < n; i++) {
swap_card(&card[i], &card[rand()%n]);
}
>>865 投稿してから気づいたよ。
むしゃくしゃしてやった。
いまは反省してる。
初心者です。 エラーE2209 インクルードファイル'stdio.h'をオープンできない どなたか対処法お願い致します。
>>850 関数をそれぞれ作って、共通部分だけを別関数にする。
と言う方法もある。
>>868 メモ帳で stdio.h というファイルを作れば
そのエラーは解決
>>868 コンパイラのインストールに失敗してるんだろ。
ちゃんと環境設定しろ。
873 :
デフォルトの名無しさん :2005/07/15(金) 11:13:35
マイコンとかh8とかに使うCソースをvcでコンパイルしようとしてそんなエラーが出たことがある
875 :
デフォルトの名無しさん :2005/07/15(金) 12:03:33
2から100までの階乗を計算するプログラムを作れと言われました。 ヒントとして、 「1桁ずつ配列にして考える。 100!でも、高々200桁なので、配列を200個用意して考える。」 というのが与えられている。 ヒントの意味がわかる人は解説してください。
>>875 宿題は宿題スレへ。
つーか、ヒントの意味が判らないんだったらプログラミング止めたら?
>>865 ×完全シャッフル
○ランダムシャッフル
完全シャッフルは↓
{0,1,2,3,4,5,6,7,8,9} ---> {0,5,1,6,2,7,3,8,4,9}
>配列を200個 >配列を200個
出題した教師がアホなだけ。
このぐらいのことでアホアホ言ってやんなよ なんにも出来ない無能だっているんだからな
再帰関数が何回呼ばれたかを知るために 関数内でstaticで宣言した変数を使ってるのですが、 その再帰関数が一度結果を出した後、別の機会に再び使うと 前回呼ばれた回数+今回呼ばれた回数になってしまいます 今回の回数だけを知るために staticで宣言した関数を再び初期化するにはどうしたらよいのでしょうか?
再帰から抜けるときにクリアすれば?
>>882 関数内static な再帰カウンタを関数外staticに追い出す & カウンタ初期化関数つくる
>>883 関数内でクリアしようとすると毎回クリアされてしまう気がするのですが?
と思ったんですがif文使えばできそうな気も。
試してみます。
>>884 ありがとうございます。関数外で宣言すればいいんですね。ちょっとやってみます。
ひょっとしてものすごく馬鹿な質問しましたか?orz
886 :
884 :2005/07/15(金) 17:41:59
よーく考えたら 関数内static だから、その値は関数外で利用されないんだよな…
だったら
>>883 でいいんでねーの?
入り口で ++ しといて 出口で -- すりゃ 自分自身の再帰のネストが ?段目か判断できるっしょ
# 再帰関数の引数にネスト値ぶっこむのも手か?
# foo(int nest) {
# ....
# foo(nest+1);
# }
>>882 こういうこと?
#include <stdio.h>
#include <stdlib.h>
int fact(int x) {
static int level = 0;
int ans;
++ level;
printf("--> %d\n", level); /* 確認用 */
if (x <= 0) {
-- level;
return 1;
} else {
ans = x * fact(x - 1);
-- level;
printf("<-- %d\n", level); /* 確認用 */
return ans;
}
}
int main() {
printf("%d\n", fact(10));
printf("%d\n", fact(10));
}
再帰関数の初期化について解決しました。皆様ありがとうございました。
関数内のstatic変数はポインタを返せば外からアクセス出来る。 BoyoのC++本に練習問題で載ってた。解答ページに 「この問題が解けなかった人は本書を読む資格がありません」 て書いてあって、俺は解けたけどむかついた。
891 :
デフォルトの名無しさん :2005/07/15(金) 21:57:38
2次限のx、yの点の集合を与えられて、 その淵を取るようなコードはどうやって書けばいいんでしょうか? 言葉では伝わりにくいのですが、点が大量にあって、 その点の輪郭を取るのです・・・ 輪郭の凹凸は不明です。 どうぞよろしくお願いします。
>>891 最もy座標の大きい点(P0)を通り、x軸と平行な直線を求める。
直線をP0で固定して、この直縁の傾きを増加させていくと直線がどこか別の点(P1)に触れる。
これで外周の2点が取得できたことになる。
こんどはP1で直線を固定して、さらに傾きを増やしていくと、別の点P3に触れるので、これを次の支点とする。
これを繰り返して、P0まで一周すれば、すべての外周点が取得できるはず。
893 :
デフォルトの名無しさん :2005/07/15(金) 22:09:17
長さ30の数列で0〜4の数を並べるのですが、隣り合う数字の差が1以内というものを作るにはどうすればいいですかね? 例えば100012344343443 みたいなのです。 簡単な質問ですいません
894 :
893 :2005/07/15(金) 22:10:20
あ、それを全部探したいんです。
なんでそんなもんが探したいんだ?
>>893 5進数でインクリメントしながら隣接する桁をチェックして該当するものをストックしていく。
5^30の数を調べるには途方も無い時間が掛かりそうだが。
898 :
デフォルトの名無しさん :2005/07/15(金) 22:26:16
>>892 すばやい回答ありがとうです。
それだと凹凸に対応しきれないと思います・・
傾きの増加を正と負にわけてやった場合も、PiのxがPi+1のxと大きい場合と小さい場合で区別がつかなくなるかと・・・
一回やってみます。
899 :
デフォルトの名無しさん :2005/07/15(金) 22:35:41
>>893 0〜4が輪になっていると考え、それが、そのまま、右、左の3命令で数列を動いて行く。
これをSim。すればよい。
>>891 例えば与えられた点が
p1(0,0) p2(0,2) p3(2,2) p4(2,0) p5(1,1) だとすると、
p1-p2-p3-p4-p1
p1-p2-p3-p4-p5-p1
p1-p2-p3-p5-p4-p1
p1-p2-p5-p3-p4-p1
p1-p5-p2-p3-p4-p1
の何れも答えになりうる。条件を追加しなければ解答不能だと思われ。
901 :
デフォルトの名無しさん :2005/07/15(金) 23:03:46
>>900 点の集合を全て含む面積最小の直線で出来た図形でどうじゃ。
K&Rって、読まないといけないのかな? 簡単な入門書から難しい技術書まで、 C言語関係の本は腐るほどたくさん読んできたが、 なぜかK&Rだけは読んだことがない。 C言語厨のあいつに怒られたよ・・・
>>898 凹の形を含めると一意に決まらないんじゃね?
>>902 読んだ方が良い。読まなくてもよい。
K&R は ANSI な内容だから
規格書を読んだ方が得るものが多いかも
>>902 >C言語関係の本は腐るほどたくさん読んできた
なら別に読まなくてもいいだろ
そいつに借りてよめばいいんじゃまいか
906 :
デフォルトの名無しさん :2005/07/15(金) 23:11:40
891です。返答ありがとうです。
>>900 すいません・・・条件の加え方がわかりません・・・
補足で与えられる点は1万点以上で、できあがる輪郭は一個のみです。
>>901 考えてみます。よさげです
>>893 30桁だとメチャクチャ多いぞ。 10桁で4万弱だった。30桁は今処理中だが、なかなか終わらん。
#include <stdio.h>
#define LEN 30
#define NUMMAX 4
void r(int *a, int index, int end)
{
int i;
if( index == end )
{
for(i = 0; i != end; ++i) printf("%d",a[i]);
putchar('\n');
}
else
{
int left = a[index-1];
for(i = 0; i < NUMMAX+1; ++i)
{
if( index != 0 && 1 < (left > i ? left - i : i - left)) continue;
a[index] = i;
r(a, index+1, end);
}
}
}
int main()
{
int a[LEN] ={0};
r(a,0,LEN);
return 0;
}
908 :
デフォルトの名無しさん :2005/07/15(金) 23:18:51
891です
>>903 人目にみて、形を作れるので、できないことはないと思うのですが・・・
ちょっと困惑してます、すいません。。。
腐るほど読む機械があったのに、未だに読んだことがないというのはもはや運命 これからも読まない方がいいかと思われ
910 :
907 :2005/07/15(金) 23:20:45
10桁で、約4万件 15桁で、約100万件 でした、30桁だと何件になるんだ? まだ終わらん。
>>908 輪郭だよな?
・ ・
・
・ ・
これに対しては
┌─┐
| ・ |
└─┘
と
┌─┐
| <
└─┘
のどっちも会になるんじゃないか?
さらに回転したものも解になるよな?
さらに、911の例を発展させて、内部の点を増やしたら、 輪郭の「へこませ方」はいくらでも増えていく。
解は × だけですが?
解は × だけですが?
>>915 すべての点を結んだときの線分の長さの合計が最小になるものを求めよ。
なら、それだね。
適当に考えた。 1. 適当な三点を選んで三角形を作って三角形の集合に入れる。 2. 三角形の集合と頂点の集合から、「一番近い」三角形と頂点の組を求める。 3. 求めた三角形と頂点から新しい三角形を作って三角形の集合に入れる。 全ての頂点を使い切るまで、2-3を繰り返す。
馬鹿ですね。
919 :
デフォルトの名無しさん :2005/07/15(金) 23:51:05
>>911 それの解は上かと・・・
もっと点があるもので考える方向でして・・・
>>912 意味がよくわかりません。点を増やせばパターンはしぼれませんか?
・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・
・・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・
・・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・・ ・ ・
・ ・ ・ ・ ・・・・
・ ・ ・ ・ ・
・ ・ ・
・
なら解はでませんか?
>>917 思考します・・
920 :
デフォルトの名無しさん :2005/07/15(金) 23:52:27
スペースが_no 面積が最小の方法も募集中・・・
>>919 お前の文章からは何が解なのか理解できない。
>>919 数学板にでも行ってくれ
はっきりいって迷惑だ
っていうかやりたいことの定義をはっきりさせてから質問してほしいな。
>>919 何故上なのだ?
じゃぁ、☆を構成する10の点が与えられたときは、
外周の五角形が解なのか?
それとも星形が解なのか?
こういう単純な例で、理論的に解を導いて見せて
くれないと、この問題は回答不能だ。
上だと思います、じゃ分からん。
925 :
デフォルトの名無しさん :2005/07/16(土) 00:02:14
数学板ですか、すいません。 Cのプログラムの課題だったので・・・ お騒がせしました。
数学板行っても同じだと思うがな。
宿題は宿題スレへ。 つか、課題なら授業中にやり方教えてもらってるだろ。
928 :
デフォルトの名無しさん :2005/07/16(土) 00:09:21
初心者質問スマソ char **array=(char**)malloc(sizeof(char *)*a); for(i=0;i<a;i++){ array[i]=malloc(sizeof(char)*a); } このように動的に2次元配列を得たとき、 割り当てた全てのメモリを開放するには free(array);でいいのですか? (このように書かれたページがあったのですが)
930 :
デフォルトの名無しさん :2005/07/16(土) 00:10:34
>>924 ☆なら☆が答えです。
正方形の例は、あまりに点が少なすぎて、自分でもよくわかりませんでした。
点は1万点以上用意されます・・・
>>927 やり方はスネーク法と言われたのですがぐぐってもわからなかったので
自前でやろうかと思いました・・・
>>930 うわぁ、方法を出されてるくせに情報後だしかよ
あまりにも酷すぎる
>>930 だから、何故そうなのかを言えといっているだろうが・・・・
なぜ五角形ではなく星なんだ? 直観か? お前の直感を表示するプログラムなのかあぢえうぃdがwふじこわヴぇ
>>925 これ良い問題だと思うが。
差し支えない範囲でいいから
学年、専攻、科目名を教えてくれないか?
>>930 なんとなく言わんとしていることは分かる気もする。"が"、もう少し他人に
間違いなく自分の質問を理解してもらえる文章を書くべきだな。
なお、数学的には簡単だけど、効率よくそれをやるための質問ならこの
板で問題ない。"が"、宿題スレ向きかな。
935 :
デフォルトの名無しさん :2005/07/16(土) 00:26:25
>>931 すいません・・・忘れてました・・・
>>932 ああっと・・・すいません
直感ではなく輪郭で考えたんですが・・・・
>>933 2年、専攻?ってよくわかりません、科目はC言語です
です。
>>934 でなおします。。。
いいから輪郭の定義をくれ。
それより、sageることを覚えて。
いままでのやりとり見ればわかるだろ 本人が一番わかってない事を。 いつまでたっても矛盾した定義しか出てこない。
940 :
郵政公社 :2005/07/16(土) 00:38:11
構造体まで終わりました
941 :
デフォルトの名無しさん :2005/07/16(土) 00:39:29
実験で使う器具名、その製造会社・型番・製造番号を入力し それをループさせて器具名でexitと入力されたらそこで終了というプログラムを作りたいのですが どうやって終了させれば良いのか分かりません。 どなたか教えてもらえないでしょうか? char data[4][20]; while(data[0] != "exit"){ printf("器具名を入力してください(exitで終了)->"); scanf("%s",data[0]); printf("製造会社を入力してください->"); scanf("%s",data[1]); printf("型番を入力してください)->"); scanf("%s",data[2]); printf("製造番号を入力してください->"); scanf("%s",data[3]); printf("\n"); }
宿題をここで聞くな。
マルチなので放置
944 :
933 :2005/07/16(土) 00:57:32
2年って大学か高校かでずいぶん違うが、、、、専攻がわからないって事は高校かな。
んで、
>>933 を書いた時点で
>>930 を見落としてた。
ただ授業中に出されたヒントを聞き落としているだけ、のように思えてきた。
945 :
デフォルトの名無しさん :2005/07/16(土) 01:03:07
質問に聞いた時は輪郭を取る具合で、スネーク法っていう例から調べてみてと。
凸とは限らないとも言われました。
忙しいらしく、詳しくは聞けませんでした・・・
>>936 自分でも不明になってきましたごめんなさい・・・
>>939 そうですね・・・わからないので質問にいきますね・・・
>>942 ごめんなさい・・・
w関数の外に出して事前にクリアするか depthをみてクリアする int foo(int depth) { if(depth==0) counter=0; ... foo(depth+1); } main(){ foo(0); }
>>893 ,907
1桁 5件
2桁 13件
3桁 35件
4桁 95件
5桁 259件
6桁 707件
7桁 1931件
8桁 5275件
9桁 14411件
10桁 39371件
11桁 107563件
12桁 293867件
13桁 802859件
14桁 2193451件
15桁 5992619件
16桁 16372139件
17桁 44729515件
18桁 122203307件
19桁 333865643件
20桁 912137899件
21桁 2492007083件
22桁 6808289963件
23桁 18600594091件
24桁 50817768107件
25桁 138836724395件
26桁 379308985003件
27桁 1036291418795件
28桁 2831200807595件
29桁 7734984452779件
30桁 21132370520747件
948 :
デフォルトの名無しさん :2005/07/16(土) 05:52:18
CSVファイルなのですが、うまく読み込ませるにはどうしたらよいのでしょうか? fscanf()系だと','は区切り記号と認識してくれないのですが・・・
一文字ずつパースしとけ
>>948 fgets()で読み込んでから、strtok()なりsscanf("%[^,]s")なりを駆使してばらせ。
間違っても>949みたいなアプローチから入るな。
#とは言っても、csvの仕様によっては結局一文字ずつ解釈する必要があるんだけどね。
63 :csv ◆d4Q1dM/8Ps :04/04/11 15:21 作ってみた(age) /* CSVデータ(数値)分割 */ /* ・maxItem迄、item[]に格納 */ /* ・分割できた個数を返す / -1は分割NG */ int divCSV(const char *src, int *item, int maxItem) { char *p; int n,itemNum=0; if(src==NULL || item==NULL || maxItem<1) return -1; do{ if((p=strchr(src,','))) *p='\0'; n=sscanf(src, "%d", (item+itemNum)); if(p) *p=','; if(n<1) return itemNum; ++itemNum; src=p+1; }while(p && itemNum<maxItem); return itemNum; } こんなの見つけたけどsrc書き換えちゃってるねw
長い処理の待ち時間の間にコマンドプロンプトの画面上に \→-→/→| みたいにくるくる回るのを表示したり、プログレス バーみたいなのを描画したりしてるのはどうやってるのでしょうか。 stdoutに書き出すのと違って、前に出力したやつの上に重ねて(?) 出力してるような感じなんですが、うまくいえなくてスイマセン
954 :
>>928 :2005/07/16(土) 13:31:53
こんな質問しといて遅レス真にスマソ
>>929 やっぱだめですか
一つ一つ開放していくしかないのですね
ありがとうございました。
>>953 windowsXPでコマンドプロンプトの場合は
先頭行にいく\r使えばよろし。
\nは改行だからね。
>>955 >先頭行にいく\r使えばよろし。
できれば日本語で説明してください。
配列の配列を動的に確保するのはどうすればいいのでしょうか? いろいろ調べたのですがわからなくて、、1次元配列の確保ならわかるのですが。
>>957 int * * alloArray2(int size1, int size2)
{
int * * tmp = malloc(sizeof(int *) * size1);
for (int i = 0; i < size1; ++i) {
tmp[i] = malloc(sizeof(int) * size2);
return tmp;
}
void freeArray2(int * * arr2, int size1)
{
for (int i = 0; i < size1; ++i) {
free(arr2[i]);
}
free(arr2);
}
>>957-958 こうすると、組み込みの配列みたいに要素が連続し、
freeも戻り値のポインタに対してだけ実行すればいいのでやや楽。
ただし要素数があまりにも多ければ無理かもしれないが。
void **SquareAlloc(size_t size, size_t x, size_t y)
{
size_t offset = sizeof (void*) * x;
void **pp = malloc(offset + size * x * y);
if (pp)
{
void **ppIndex = pp;
size_t i;
for (i = 0; i < x; i++)
ppIndex[i] = (char *)pp + offset + size * y * i;
}
return pp;
}
malloc(sizeof(int *) * size1); とか malloc(sizeof(int) * size2); がアホ
第1引数で読み込んだテキストファイルの「半角スペース」「全角スペース」「タブ」「改行」を取り除いて 第2引数で指定したファイルに保存するプログラムなんですが 最後にどうしても変な一文字が入ってしまいます。 whileがいけないと思い、do-whileにしたのですがだめでした。 どうやれば消えるでしょうか?どなたか教えてください。 #include<stdio.h> int main(int argc, char *argv[]) { int txt; FILE *before, *after; before = fopen(argv[1], "r"); after = fopen(argv[2], "w"); do { txt = fgetc(before); if(txt == ' ' || txt == ' ' || txt == '' || txt == '\n') continue; fputc(txt, after); fputc(txt, stdout); } while(!feof(before)); fclose(before); fclose(after); return 0; }
>>961 ところで全角スペースは1バイト文字じゃないからそれでは判定できない。
963 :
958 :2005/07/16(土) 16:29:25
>>961 ストリームからの入力は、fgetc()がEOFを返すまでループするのが常道。
feof()を調べるまでもない。
>>960 アホでない例を所望します。
964 :
961 :2005/07/16(土) 16:34:50
>>962 早速の返信ありがとうございます。
全角は判定しませんでした。
全角なしでお願いします
965 :
961 :2005/07/16(土) 16:43:46
>>963 feof()を取り除いて作り直したらできました。
ありがとうございました。
>>959 それdoubleの配列でも大丈夫か?整列しない気がするんだが
>>952 ""での引用やカラム中の改行にも対応してないのに無駄に長く汚い
ま、糞ソースだな
class Class{ public: void method(int (*array)[10] ){} } を class Class{ public: void method(int ???); } void Class::method(int (*array)[10]){} のように書き換えたいのですが???部分はどのように書いたらよいのでしょうか?
>>968 好きなように書いてください。???部分をどのように書いてもコンパイルできませんから。
>>969 セミコロンを2つほど書き忘れたのは気がつきましたが、
他にもまずいところがありますか?
〃∩ ∧_∧ ⊂⌒( ・ω・) はいはいわろすわろす `ヽ_っ⌒/⌒c ⌒ ⌒ (´〜`;)ああ、イヤダイヤダ。 夏厨が湧き出しちゃったよ。 これから9月まで2ch全体が つまらなくなるだよな。さっさと 夏終われ。ガキは学校でクセエ 汁垂らして部活でもやってろ。 あーあー、ウザイウザイw
2chぐらいしか楽しみのないニートって大変だな…… ガキ相手に「ボクの遊び場を荒らすな〜!」ってか?
void method(int ???);
void method(int (*array)[10]){}
と書けば答えてもらえたんですかね?
>>969 >>971 的確なアドバイスをありがとうございました。
>>972 笑いを提供できて幸いです。
>まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう C++とCは違う
976 :
ikaikaikajika :2005/07/17(日) 00:52:48
以下のプログラムはお茶運びロボットのプログラムなのですが、これを 改良してほしいんです。 これは お茶を置いたら タッチセンサーが感知して ロボット発進、そしてお茶を持ってるときに 障害物を 光センサーが感知 すると 止まり、お茶を取られると、180度回転して、帰るのですが、帰る途中に 障害物を光センサーが感知すると 避けて行くように してほしいんですが? どうでしょうか?
int main() { return 0; }
>>955 ありがとうございます。なんとかできました。
カンマで区切られたデータを構造体に格納するプログラムってどうすればいいんでしょうか? abc,def,ghi,jikl mno,ofi,jik,ji, . . 以下延々という感じなのですが リダイレクションを使って標準入力としていいようなのですが、格納の仕方がわかりません。
scanf
>>980 fgets() + sscanf() w/ "%[^,]"
983 :
980 :2005/07/17(日) 18:03:42
>>982 ありがとうございます。あのW/ってどういう意味でしょうか?
T
>>980 >982
関数fgetsと、"%[^,]"を伴った関数sscanf。
配列の初期化で0クリアする場合に a[5] = { } とするのはベテランの人から見てどうなんでしょうか。 ネットで検索したところ a[5] = { 0 }
988 :
987 :2005/07/17(日) 23:12:48
ネットで検索したところ a[5] = { 0 } と書くのはよく見かけたんですが 専門学校の先生には「見た目がよくない」と言われました。 普通に使う書き方なんでしょうか。
memset
先生に訊き返せよ 金払ってんだろ?
>>987 a[5] = { }; は規格で認められているのか?
a[5] = {0}; で通してきたぞ俺は。
>>989 memse は初期化と言いません
俺ならaがchar/wchar_t配列ならchar a[5] = ""; wchar_t a[5] = L"";にする。 ほかはしかたないから{0}にするけど。
memse t⊂(`Д´)
994 :
987 :2005/07/17(日) 23:33:52
今慌てて試したら = { } は動きませんでした、勘違いしてたみたいです。 = {0} のほうは普通に使われるみたいですね。 将来人に見せることになると考えると「見た目が悪い」という言葉が気になったので。
見た目が悪いと言った人間に聞くのが一番かと
>>987 適所適材。
「見た目が良い初期化」なんか見たことない。
その教員は鏡でも見てたんだろう。
1000ならC滅亡
>>994 君は先生に質問し、どのような方法であれば見た目が良い方法なのか
ここに報告する義務がある
このスレが終わるまでに報告しなければならない
これは命令だ
gccは={}通るぞ
gcc拡張かよ 1000get
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。