1 :
デフォルトの名無しさん :
2005/06/02(木) 14:37:56
うっかりしてますた
4 :
4様 :2005/06/02(木) 19:42:43
1-2<<乙
C89とか言われたので、規格票を持ってない俺はどうすればいいのかと悩んでた。 よくよく考えればK&Rの第二版がだいたいC89だったなぁ、と思い起こした あたりで、時間切れですた。
質問なのですが、Cプログラム内に「LIB(\)$〜」といったコマンド(LIB(\)$STOP等)が出てきたのですが意味がわかりません。ネットで調べてもよくわかりませんでした。 どなたか解説サイト、ヒント、又は書籍でもいいので教えて下さいm(__)m
>>6 Cコンパイラに掛ける前に、なんらかの処理系を通すんだろうねぇ。
取り敢えず聞いたことがあるのはSQLとかGUI処理系だけど違いそうだね。
VMSかい・・
本などでは char str[10]; strcpy(str, "あいう"); と書いてますが、 char* str; str = "あいう"; こっちでもできるし、strcpy関数使わなくてすむんじゃないんでしょうか? 後者じゃだめな理由ってなんですか?
>>10 全く問題ない。
ただし後者の場合、文字列は書き換えしてはいけないから変数の型をconst char *にするのが望ましい。
>>10 やっている事は全く違うという事は理解できてる?
>>10 char* str;
str = "あいう";
strcpy(str, "えお");
ってする?
14 :
10 :2005/06/02(木) 21:39:39
ありがとうございます、だったら本でも両方教えればいいと思うんですけどね char* str; こっちだと、ただのポインタで領域を確保はしてないから他のプログラム等で上書きされる恐れがあるのかな、とか思ってたんですが・・・
>>14 "あいう"って文字列はそれ用の領域が用意される。
だからconst char *の変数へ入れても全く問題ない。
16 :
10 :2005/06/02(木) 21:43:04
>12
文字列の先頭のポインタの代入と文字列のコピーですよね?
>>13 すいません言ってる意味がわかりません・・・
> ただのポインタで領域を確保はしてないから他のプログラム等で上書きされる恐れがあるのかな、とか思ってたんですが・・・ 思ってたって、昔は思ってたが今は思わなくなっちまったってことか? 誰だ?ちゃんと責任取れよ。
18 :
デフォルトの名無しさん :2005/06/02(木) 21:49:48
>>10 メモリ上の位置が変わるからじゃないですか?
19 :
13 :2005/06/02(木) 22:05:26
やらないなら、いいんじゃない。
20 :
13 :2005/06/02(木) 22:05:49
質問です。 str系、is系を使わずに、 文字列比較をしたいのですが、 どのようにやるのでしょうか?
1文字ずつ charで比較する。 char同士なら、<,>,==等使える
>>22 ひょっとしてそれは宿題で言っているのか?(AA略)
pthreadについて質問です。 メインスレッド ----------- 1-1. socket要求待ち受け 1-2. accept()、recv() 1-3. pthread_attr_init() 1-4. pthread_attr_setdetachstate()でPTHREAD_CREATE_DETACHEDを設定 1-5. pthread_create() 1-6. pthread_attr_destroy() 1-7. pthread_cancel() 子スレッド ----------- 2-1. 1-2の残りをrecv()、send() 2-2. select()で1秒ほど待機 2-3 socket解放 2-4. return 0 こんな感じのコードを書いて動かしたところ、クライアントからの一発目の要求は2-2で pthread_cancel()が走り、正常に取り消されまた1-1に戻ったんですが、直後に二発目 の要求を出すと、pthread_create()の戻り値は正常なのに2-1の処理が走りません。 スレッドはデタッチ状態で起動するため、pthread_cancel()の後スタックが解放されるから 二発目以降の要求も問題ないと思ったんですが、何が問題なんでしょうか。 ソケットのclose、shutdownをしていないのが問題? OSはHP-UX11.0、コンパイラはgcc2.95です。
リスト構造の番兵って一体何なんですか? 検索しても、いまいち分からないもので…
28 :
デフォルトの名無しさん :2005/06/03(金) 02:15:01
>>27 リストや配列の終端を表す特殊値のこと
乱暴な話、Cの文字列終端の'\0'も番兵の一種
番兵って言うから判りにくいんだよ。 センティナェォって言えば意味が判りやすいんじゃないかな。
30 :
27 :2005/06/03(金) 02:24:42
>>28-29 ありがとうございます!
なるほど…\0もセンティナェォの一種なのか…
31 :
データボックス :2005/06/03(金) 06:16:11
ちょっとお聞きしたい、ビジュアルスタジオC++のコンソールアプリケーションに関する話なんだけど、 ソース内で、コンソール画面の大きさを変更って出来ますか? 標準のヘッダーでインクルードできる範囲内で教えて欲しい。 昨日から考えてるんだけど全然わかんなくて・・・それともスレ違い?
>31 終端の;を強制できるし、if(a) swapf(b,c); else swapf(d,e);みたいな コードでエラーを出さずにすむ。はっきり言うなら、マクロの定石。
まあこんな変なマクロ書くくらいなら関数にするけどな
>>35 そうか?ループ中など、関数によるオーバーヘッドが大きい時はこういう事もありと思うがな
一個や二個だったら手書きで書くけど。
inline ・・・ ってここはCスレか。
38 :
デフォルトの名無しさん :2005/06/03(金) 09:52:03
C99(ボソッ
39 :
デフォルトの名無しさん :2005/06/03(金) 10:37:25
srand(time(null)%100); ってどういう意味ですか?
適当に乱数の種をまく
41 :
39 :2005/06/03(金) 13:26:15
nullはここではどういう意味(使われ方)ですか?%100はどういう意味ですか?
time関数は戻り値でも時間を持ってこれるから null以外で指定した場合はそこに時間を格納してくれる %は除余演算子 つまり、時間を100で割ったあまりをsrandの引数(乱数種)としているわけです
nullじゃなくてNULLだな。 それにしても、種の種類が100しかないのか。
47 :
デフォルトの名無しさん :2005/06/03(金) 15:45:37
int tes[2]; tes[0] = 0x0A; tes[1] = 0xBC; 上のtes[0]とtes[1]をくっつけて0x0ABCという風にしたいんですが やり方がわかりません。。。
>>47 (tes[0] << 8) | tes[1]
とか。符号が気になるけど
49 :
32 :2005/06/03(金) 16:18:20
>>33 ,46
答えてくれてありがと、できるならがんばってみる。スレ違いごめん
50 :
47 :2005/06/03(金) 16:31:52
ありがとうございます 参考にします。
VC++で_msize()にmalloc()で確保したポインタを渡せば、そのメモリブロックサイズを返してくれますが、gccでmalloc()で確保したポインタを元に、メモリブロックサイズを取得するのってどうやるんでしょうか? 宜しくお願いします。
環境依存だ。 スレ遣い。
>>51 標準Cでは、malloc()で確保した領域のサイズは自分で管理しなければならない。
>>52 スレ違いになるんですね(汗
すみません。
>>53 そうなんですか!(汗
C++のstringのような動的配列もどきを作ろうかと思ったのですが、
mallocやreallocの返すポインタからサイズが取得できないとなると、
返り値のポインタと一緒に確保したサイズを保存しておくリスト構造の
ような領域が別途必要になるってことですね…。
ありがとうございました。
> リスト構造のような ???
さて、そろそろビットシフトでも召喚するとするか。
>>54 こんなんじゃだめ? (offsetofは標準じゃなかったはずだが、同等のマクロがどっかにあるはず)
typedef struct {
size_t size;
char buffer[1];
} string_t;
string_t *string_new(size_t size) {
string_t *s;
if ((s = malloc(offsetof(string_t, buffer) + size)) == NULL) {
return NULL;
}
s->size = size;
return s;
}
sizeof(size_t) じゃダメなのか?
61 :
59 :2005/06/03(金) 23:29:38
>>60 >>59 だけだったら結果的には問題はでないだろうけど、bufferの手前にいろいろメタデータ持たせたらハマる要因にならん?
あと、string的なものを実装するなら、sizeに1足して、最後に\0入れといた方がいいね。
それを言うなら sizeof(string_t) じゃないか \0の分の領域は必要だしな。sizeof(string_t) + sizeで、 ちょうどsize分の長さの文字列を格納するのに具合のいいサイズになる。 でも俺なら struct vec { T *data; size_t length; // データ長 size_t capacity; // 確保済みの領域長 }; みたいにするけどな。
>>59 offsetofは標準。<stddef.h>
あと俺ならこうする、どうでもいいけど。
string_t *s = malloc(offsetof(string_t, buffer) + size);
if (s == NULL)
65 :
59 :2005/06/03(金) 23:35:44
でも実はそーゆーのを必死で実装するより、aprとか使った方が生産性が良さげな罠orz
ていうか素直にC++使えと
幼稚な質問すみません(><) int型の変数を3つ用意して数値を それぞれの変数に格納するんだけど ※(enter)はエンターキーを打つ。 A ---------------------------- 数値を入力して下さい。 10(enter) ←コマンドプロンプト画面 11(enter) 12(enter) ---------------------------- B ---------------------------- 数値を入力して下さい。 10(enter) 11(enter) 12(enter) ---------------------------- AじゃなくてBみたいな感じにしたいけど分かりません(><) どーしたらいいか教えて下さいm(_ _)m
なんだそりゃ。ユーザがenter押しても改行しないで欲しいの? 端末の通常の動作では、ユーザのキー入力はそのまま端末にエコーバックされる (表示される)から、それを変えないとダメだ。で、そのやり方は 完全に処理系依存だ。
>>68 早い返答ありがとうございますm(_ _)m
環境はwinXP,でコンパイラはBorland C++ Compiler 5.5なんですが・・・
あとは自分で調べます。ありがとうございました。
>int型の変数を3つ用意して数値を >それぞれの変数に格納するんだけど scanf("%d,%d,%d",&a,&b,&c); 10,20,30(enter) ではいかんのか?
うん。駄目。
WindowsならコンソールAPI調べろ。 UNIX/Mac OS X/Cygwinなら端末制御だ。 どっちにしろ、素人にはお勧めしかねるが。
74 :
デフォルトの名無しさん :2005/06/04(土) 04:59:29
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
ひーとびとーのひっとびっと〜
>>74 ステッピングモータを駆動するために存在します
>> ビットシフトしたい時に使う。 パリティビットの計算とか、ビット単位で処理を行いたい時とかあるだろ。
新たにマジレスする人が後を絶たないな
「ビットシフトなんて実際使わないよ」 なんてことを まるで 自分は知識人? 常識人である風に 言うヤツには 正面から 向かって 目を見て 言ってやれ 俺が使うんだ 私がビットシフトするんだ みんなビットシフト使おうよ でかい、でかいビットシフターになれ!
「でかいビット」って何?
ちんこのこと?
ビットシフトで行なう処理の大半は、データ構造から考え直せば別の処理でもできる。 ビットシフトにする利点は、処理が早い事とコード量が少なくて済む事。 人間の側から機械に歩み寄ってやれば、機械は楽になるって事だ。 最近の流行とは逆方向だけどな。
横レス。 マジレスする親切な人も ネタレスする寒い人も 似たり寄ったり目糞鼻糞。
86 :
デフォルトの名無しさん :2005/06/04(土) 15:51:23
printf と sanf と 繰り返し(for文)と if文 すべてを使って自分でプログラムを作成しろって課題がでてるのですが 何にするかマッタク思いつかない…。何かいいのありませんでしょうか? よろしくお願いします。
>>86 for(;;)
printf("sanf\n");
>>86 char typo[]="scanf";
if(strcmp(typo,"sanf"))
exit(0);
>>86 無限ループ使って、二つの数字を入力したら
その積を出力せよ。
なお、0が入力されたらループ終了。
>86 与えられた文字列に対し、 ************** * こんな感じで * ************** 飾りをつけて出力するプログラム(某書籍のサンプルのパクリ)。
>printf と sanf と 繰り返し(for文)と if文 あと、せめて乱数が使えれば...
93 :
デフォルトの名無しさん :2005/06/05(日) 00:53:57
電卓
while ではなく for と言うところに着目しなければ駄目だゾ。
95 :
デフォルトの名無しさん :2005/06/05(日) 01:55:13
おにいちゃんC言語おしえて
このスレには、おじいちゃんしか居ません。
600をdoubleに変換して10100で割ってる。 p = 0.059405940594059405940594059405941
>>92 初期化してない自動変数の値読んだら駄目?>乱数
>99 結構同じ値っぽい希ガス...試してみる価値はあるかな?
101 :
97 :2005/06/05(日) 02:32:50
>>98 はい、それは解るのですが、何を表しているのかが解りません…
102 :
98 :2005/06/05(日) 02:36:41
gw_line関数のパラメータ作ってる。
103 :
97 :2005/06/05(日) 02:37:28
質問の仕方が悪いです。 そのプログラムで、どういう役割を果たしてるのか?です。
104 :
98 :2005/06/05(日) 02:40:08
しらんがな。 gw_line関数の仕様か、もしくは関数の中を読まな。
>100 試したがいつも同じ
>>97 p = (double) 300 / SIZE;
とかに変えて、表示がどう変わるか試してみそ。
たぶん役割が判ると思うよ。
曰 \ もう、わかんないんです…. / | | \ ∧_∧ ∧_∧ ./ ノ__丶 ∧_∧\ ハァ...( ><) ≡3 (>< )うう… /__| ||鬼||( ><) \ | ⊃ヽC C/⊂ |. /||||| _ ||殺||./ [¢、) \ 、_( )) ( ( )_ノ.. / | ̄| ∧ ウウ・・・ \ ||し||∪ ̄ ̄. ̄ ̄\ \ ∧∧∧∧∧. ... ./ | |<) ||\.`~~´ ((二゚。◎彡) \ \ < の わ > /. | |⊂ | わかんないんです… ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄ \ < か > ...../ | | ∪ . || ̄ ̄ ̄ ̄ ̄ ̄ ̄|| \< 予 ん > / わかんないんです… < な > / ―――――――――――――――< 感 い >――――――――――――――――― ∧ ∧ < ん > / ;わかんないんです / <. !!! で > / '; / .< す > ∧_∧∩ / ̄ ̄ / ;______/ ;/∨∨∨∨∨\ ( >< ノ<わかんないんです / / .\ __/ノ / \__ / ┯━┯ ┯━┯ ./ \\  ̄ ̄ ̄ ̄ ̄ ̄\ .| ..) ) _____ ) )/ / ヽ .\||\ \ | ...( ( ;, / ( (/. / ヽ ..\ || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
急速に(ry
>>97 描画される幅が全部で600ピクセルってことでしょ。
pは1データあたりの描画幅の増加量。
ただ、gw_line()にdouble型を使ったり、
SIZEは定義しているのに600は定義してなかったり、
あまりいいプログラムではないと思うね。
110 :
デフォルトの名無しさん :2005/06/05(日) 10:00:48
関数strlenの使い方がよくわかりません。どなたかご教授よろしくお願い します。 #include <stdio.h> #include <string.h> main() { char A[500]; printf("INPUT>>>"); gets(A); strlen(A); printf("%d\n",A); } 文字列を入力してその長さを出力するプログラムです。これではダメでした。
#include <stdio.h> #include <string.h> main() { char A[500]; int B; printf("INPUT>>>"); gets(A); B = strlen(A); printf("%d\n",B); }
112 :
デフォルトの名無しさん :2005/06/05(日) 10:09:10
ものすんごく、初歩的な質問かもしれませんが、 visual C++の環境で普通のC言語を用いてプログラムを書くことは可能なのでしょうか? スレ違いな質問でしたら、大変申し訳ございません・・。
113 :
110 :2005/06/05(日) 10:12:52
わかりました。ありがとうございました。 >111
>>112 余裕でできる。
完璧にできるかは知らないけど。
115 :
112 :2005/06/05(日) 10:19:05
>114 分かりました!! 早速のご回答、ありがとうございます!!
116 :
110 :2005/06/05(日) 10:27:19
もう一つ質問なのですが、度々すみません。 visual C++ 6.0 を使って、C言語で以下のようなプログラムを書いたのですが↓ #include <stdio.h> #include <math.h> main(){ double pi; pi=3.1415; printf("%d",pi); } ビルドして実行しますと何故か↓ -1065151889Press any key continue って出力されます。 どうしてなのでしょうか? どうか、よろしくお願いします。
printf("%f",pi); かな?
118 :
110 :2005/06/05(日) 10:37:53
>>117 ほ、ほ、ほホントだ!!
printf("%f",pi);
に変えただけで、出力が3.141500になりました!!
ありがとうございます★
標準ライブラリに時間を計るためのタイマ関数ってありますか?
120 :
97 :2005/06/05(日) 11:28:59
皆さん有難うございます。 何となく解ってきました。
>>119 <time.h>
の中に、clock()って関数があるようですが、
それでいいん?
122 :
デフォルトの名無しさん :2005/06/05(日) 12:25:45
二つの文字列ptnとstrを引数とし、ptnがstrの一部分として現れていれば、先頭から何文字目から現れて いるかを返し、もしptnがstrの一部分として現れなければ0を返す 関数を作成せよ。ただしptnがstrの二ヵ所以上に現れていれば、最後に現れるものの 先頭の位置を返すことにする。 例、str=abdacabcd ptn=abcならばptnは先頭から六文字目と十文字目に現れているが 後に現れる10を返す #include <stdio.h> #define N 80 int match(char str[],char ptn[]); int main(void) { char string[N],pattern[N]; gets(string); gets(pattern); if(match(string,pattern)!=0) printf("先頭から%d番目です\n",match(string,pattern)); else printf("%dです。ありません\n",match(string,pattern)); return 0;} int match(char str[],char ptn[]) { int k,m; for(k=0;str[k]!='\0';k++){ for(m=0;str[k+m]==ptn[m]&&ptn[m]!='\0';m++){;} if(ptn[m]=='\0') return k+1;} return 0;} と書いたのですが、先頭の値を返してしまいます。 どなたかヒントをください。(*/□\*)うわぁ〜ん
>>122 >>1 >ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
124 :
デフォルトの名無しさん :2005/06/05(日) 12:35:25
あい・・・ (゜дÅ)ホロリ
何げにgetsがわらわら出てくるのが激しく気になる。どんなテキスト使ってんだ……。 十数年前ですら「getsなんざ一律使用禁止」とゆー意見に特に異論は出てなかったと思うんだが。
126 :
デフォルトの名無しさん :2005/06/05(日) 14:49:29
あるプログラムの途中なのですが、 if(key ==4 && ) とありますが、==と&& がどうしてでてくるかわかりません。意味もわかりません。
ほんとに途中だろそれ &&で終わってないよな?
>122 ぢゃヒントだけでも if(match(string,pattern)!=0) printf("先頭から%d番目です\n",match(string,pattern)); else printf("%dです。ありません\n",match(string,pattern)); ここをループして
129 :
デフォルトの名無しさん :2005/06/05(日) 15:49:09
int match(char *str,char *ptn){ int num1 = 0, num2; int rtn = 0; for(num2 = 0; str[num2] != '\0'; num2++){ if(ptn[num1] == str[num2]){ num1++; if(ptn[num1] == '\0'){ rtn = num2 - num1 + 2; num1 = 0; } } else { num1 = 0; } } return rtn; }
せっかくなので strlen strncmp の把握に役立てよう /* 最後に現れるものの 先頭の位置を返す */ int match(char str[],char ptn[]) { int i,k,m; for(k=0; str[k]; ++k); /* k=strlen(str); */ for(m=0; ptn[m]; ++m); /* m=strlen(ptn); */ for(k-=m; k>=0; --k){ /* if(strncmp(&str[k],ptn,m)==0) return k+1; */ for(i=0; i<m && str[k+i]==ptn[i]; ++i); if(i==m) return k+1; } return 0; }
132 :
デフォルトの名無しさん :2005/06/05(日) 18:17:12
UNIXよりの質問になろうかと思いますが FストリームはUNIXでも使えるインクルードですか? さらにstat関数でファイル情報を取得するプログラムを 作りたいのですがWinAPI関数となるFindFirst FindNextに変わる UNIXで使用できるステートメントがあれば御教授いただきたい
日本語で
かいてね
135 :
132 :2005/06/05(日) 18:38:14
十分に日本語であろうかと思いますが どこか伝わらなかった点がございますでしょうか?
だな
直接C言語の質問ではないのですが、 Pro*Cを実行させる環境にランタイムは必要になるでしょうか? つまり、開発環境でプリコンパイル、コンパイルした実行物を 別の実行環境(ただのCの実行環境)で使用することは可能でしょうか? どこか参考になるサイト込みで教えていただけると幸いです。 よろしくお願いいたします。
なんで「C言語の質問ではない」とわかっているのに 「C言語のスレ」で質問するんだろう。
過去ログでおせっかいなくらい親切な人を確認したから。
>>135 本気? 「Fストリーム」って何? 「インクルード」って何? 「ステートメント」って何? 専門用語使うなら正しく使いましょう。理解が怪しいなら無理に使わない。
142 :
デフォルトの名無しさん :2005/06/05(日) 20:13:42
ポインタの指し示す先が動的に作られたものか、 変数として宣言されたものかを判断する方法は無いでしょうか?
一般的にはない。 環境依存なら、あるかもしれない。 解決策は、自分でalloc,freeを包む関数を作ること。
>>142 そんなことを意識しなければならないこと自体があんまりないような…
>>132 もしやFストリームとはC++のヘッダのfstreamのことか?
148 :
デフォルトの名無しさん :2005/06/05(日) 21:45:58
本に載ってるプログラムを聞きたいのだがそのまま書き込んでよい?
Aというプログラム中でBというプログラムを 起動したいと思っています。 execl()という関数で試してみたのですが、Bを起動する とAのメモリ上に展開されるため、Bが処理を終了すると 必然的に、Aも終了してしまいます。 Aを生かしつつ、Bというプログラムを実行する 関数ってありますでしょうか? (スレッドとかではなく、実行ファイルを実行する関数が あれば、ご教授ください。)
system. execlはfork前提だからなぁ。
151 :
デフォルトの名無しさん :2005/06/05(日) 22:15:59
>>141 ファイルストリームご存知ないようですね
インクルードはヘッダで定義するファイルの事ですよ
ステートメントは知っての通り関数群です。
釣人あらわれますた
>>150 おお!
ご教授ありがとう御座います。
実は、Cのソースコード中でBashファイルを
実行使用としていたのです。(Linux環境)
今からテストしてみます。
感謝!!
>>143 関数を包むって、たとえば#define alloc myalloc とかいう類いのこと?
開放忘れ探しに(デバッガが貧弱なら)、、、assertを参考に作ったよ。
bccだと__FUNC__ __LINE__ __FILE__もつかった。
で、__FILE__使うと絶対パスが入るらしく、後方から数えてn個目の\以
降のみの文字列を取得、、で力尽きた。おやすみねむ
>>154 そんなことをしちゃいかーん
常に標準関数を呼ぶだけのラッパー関数を用意して使うようにしなさい。
で、何かあったらラッパー関数で処理の付け足しをするようにしなさい。
C言語をはじめたばかりであまりわからないのですが、 gets()はなんの役に立つのでしょうか?
>>156 過去との互換性のため「だけ」に残されてる
つかっちゃいけない関数の筆頭
オマエのチソコと同じ。 オ○ニーには使えるが 実践では役に立たない。
しまった、俺釣られたのか……。orz
しかし泌尿機器としては超一流
161 :
デフォルトの名無しさん :2005/06/06(月) 10:37:42
struct KOU{ long a; long b; }; KOU *kou = new KOU [100]; こういう感じで構造体を宣言したものを 0埋めの初期化処理ってどうやったらいいんでしょうか? delete[];で一旦消すしか無理ですか?
C++? structにもコンストラクタ書けるんじゃなかったっけ?
>>158 実践て排尿の事だろ
十二分に使えているよ
>>161 memset()でも、forループでも好きに使えばいいと思うよ
165 :
デフォルトの名無しさん :2005/06/06(月) 12:24:41
>>164 memset(&kou,0,sizeof(kou));とやると落ちてしまいます。
どこかおかしいですか?
>>165 それはポインタkouを0クリアしてるだけ。
memset(kou, 0, sizeof(KOU) * 100); じゃないかな。
あと、delete[]で消すことに何の意味が…
167 :
デフォルトの名無しさん :2005/06/06(月) 13:00:47
>>166 なるほど!
ありがとうございます!
delte[]でどうこうしようと思ったのは、
一旦削除して生成し直したらいけるかなーと思ったので。
168 :
デフォルトの名無しさん :2005/06/06(月) 13:17:19
乱数を使ってアルファベットと数字をいりまぜたパスワードを自動生成するプログラムってどう作ればいいですか? コンパイラはborlandです。
>>167 newの意味もdeleteの意味も勘違いしている。
そもそも、newの時点でスレ違い。
>>168 char s[16],p[63]="0123456789AB…YZab…yz";
for(i=0;i<15;i++)
s[i]=p[(rand()%62)];
s[15]=0;
printf("%s\n",s);
この程度でよければ
>>168 宿題スレでも見たな。イパーイ解答もらえて幸せ者だな。
173 :
デフォルトの名無しさん :2005/06/06(月) 15:40:44
抽象的で分かりずらいかもしれませんが、 表○ 裏● の2通りがあって例えば、 ○○○○○ なら赤色 ○○○○● なら青色 ○○○●○ なら黄色 ○○○●● なら緑色 ○○●○○ なら紫色 ○○●○● なら茶色 ○○●●○ なら水色 ・ ・ ・ と並べた時に、全パターンを調べるには どのようにループ文を使えば効率的に分かるのでしょうか?
!
効率的と入れた以上そうなる罠
じゃなきゃ
>>174
ん?しまった
>>174 じゃない
2の5乗でいいじゃん
178 :
デフォルトの名無しさん :2005/06/06(月) 16:16:40
unsigned long int next =1; int rand(void) { next=next *1130351524+12345; return(unsigned int )(next \65536)%32768; } void srand (unsigned int seed) { next=seed; } これをつかって100個の疑似乱数を作成ってどうやるんですか>?
C言語勉強中の者ですが、kbhit()とrand()についていまいち分かりません 参考にしている本の練習問題の一部ですが while(!kbhit())rand(); i = rand()%2 ? printf("表"):printf("裏"); とは、どのような内容なのでしょうか? 何かキーを押すまで、プログラムは↑のrand()で乱数を作りどこにも代入していないので、 作った乱数を捨て、また作り捨て、作り捨て、をひたすら繰り返し 何かキーが押されると↓のrand()で今まで作った乱数とは全く関係ない乱数を作り その乱数を2で割った余りが1なら表、0なら裏と表示する っという内容で合ってますか?
181 :
180 :2005/06/06(月) 19:10:10
i = は書き間違いです、すいません
その解釈であってるんじゃないかな。 ただ、乱数って、srand()しなきゃいつも同じ順番で回ってくると思うから、 何回も無駄に回す事によって、そのときでる順番も 変えてるのかな? うーん。 たぶん次の章で、乱数の初期化のしかたでも出るんじゃない?
183 :
デフォルトの名無しさん :2005/06/06(月) 19:46:56
> while(!kbhit())rand(); これ思いっきりビジーループだな。 kbhit()使ってるあたりから見ても、その教科書MS-DOS時代のやつ じゃないのか? もっとマシな本に変えたほうがいいぞ。
p = 03 で、*p = 01 かな。 たぶん。間違ってたらごめんね。
てゆか、答え書いてあるじゃんか orz p を直で表示しようとすると、メモリの番号が表示されるよん。 p の中身は、 *p ってやんなきゃ出ないよ。
187 :
183 :2005/06/06(月) 19:55:49
サンクス! 俺はp=01で*p=08かなーと思ってこの答えに納得いかなかったんだけど これで合ってるのか どもども
エンディアンはどうなってるの? pの型はデフォルトでcharでいいの? sizeof(long)が、8である処理系の存在を、規格は妨げていなかったはずだけど、どうなの? アラインメントが揃わないとバスエラーが起こる処理系はどうするの?
ポインタ変数pが3番地に割り当てられている、を char *p = 3; と読むか、 extern char *p; (&p = 3)と読むかだな。
190 :
183 :2005/06/06(月) 19:58:18
>>188 俺の問題?
ごめん、わかんない。
問題にこれしか書いてなかった。
いま、ビット列の圧縮プログラムを作ろうとしてるんだけど 同じビットの出現の度に置き換えようとしてる。 でも、効率よく同じビット列が探せない。 どうしたらいい?
ビット列の圧縮? 頻度テーブルでも作りたいんだろうか 固定(8とか)で探せば楽だろうけど 可変長だと難しそう
>>192 可変長。
10000000000000011000000000000001
これで、1000000000000001が2回連続してるってことをヒットすれば
かなりの圧縮になると思うんだが。
194 :
デフォルトの名無しさん :2005/06/06(月) 21:49:15
UTF-8 <-> EUC 変換の仕方が分かりませヌ。。。orz
196 :
デフォルトの名無しさん :2005/06/06(月) 21:56:55
質問の仕方が分からないけど書いてみる。 int* num と int *num って違うの?
197 :
デフォルトの名無しさん :2005/06/06(月) 22:00:04
>> 196 同じっぱい
>>194 iconv使え。あと、Windowsもからむなら、JIS標準UnicodeとMicrosoft Unicodeとの違いにも注意。
199 :
デフォルトの名無しさん :2005/06/06(月) 22:06:34
>>196 int と * と num がそれぞれトークンだから
int*num でもおk
203 :
デフォルトの名無しさん :2005/06/06(月) 22:12:48
>>198 すみません。
使い方がサッパリです。。
簡単なサンプルを。。。
>>198 「JIS標準Unicode」ってなに?
205 :
デフォルトの名無しさん :2005/06/06(月) 22:52:27
sqrtってなんて読むの? エスキュート?
>>204 「〜」=「WAVE DASH」になるのがJIS標準。
「〜」=「FULLWIDTH TILDE」になるのがMicrosoft。
(他にもいくつかある)
困ったことに完全に100% Pure Unicode環境で固めてもこの問題からは逃れられない……。
long型が1個とchar型4個の構造体で共用体を作って、 long型で読み込んだ値をchar型4個の構造体の方で 1バイトずつ参照してるプログラムがあったのだが、 これって、大丈夫なの? 構造体や共用体って、型を並べた順番にその型のサイズで隙間なく 埋まるようにメモリ上に確保されることが保障されるの?
208 :
デフォルトの名無しさん :2005/06/06(月) 23:09:02
>>207 ビッグ・リトル問題に直面すると思われ。
209 :
その1 :2005/06/06(月) 23:10:39
>>203 ほれ。
#include <stdio.h>
#include <errno.h>
#include <iconv.h>
#define BUF_SIZE 1024
int
main(void)
{
iconv_t cd;
char ibuf[BUF_SIZE];
char obuf[BUF_SIZE * 2];
/* ASCII以外は1文字3バイトになるので適当に大きく */
if ((cd = iconv_open("UTF-8", "EUC-JP")) == NULL)
return 1;
while (fgets(ibuf, BUF_SIZE, stdin)) {
const char *ip;
char *op;
size_t ileft, oleft, result;
ip = ibuf;
op = obuf;
ileft = sizeof(ibuf);
oleft = sizeof(obuf);
210 :
その2 :2005/06/06(月) 23:11:03
/* 変換された分だけipとopが進み、ileftとoleftが減る */ switch (result = iconv(cd, &ip, &ileft, &op, &oleft)) { case E2BIG: /* 出力バッファが足りない */ break; case EILSEQ: /* 入力が正しくない */ break; case EINVAL: /* マルチバイト文字が途中で終わってる */ break; default: break; } fputs(obuf, stdout); } iconv_close(cd); return 0; } 必要に応じてlibiconvをリンクすれ。 あとエラーチェックとそのリカバリは全部さぼってるから気を付けろ。
環境がリトルエンディアンかビッグエンディアンか 確かめる方法を知りたいのですが。
213 :
デフォルトの名無しさん :2005/06/06(月) 23:29:11
>>209 ,210
ありがとうございます。
ただ、iconv_open()でEINVALに。。orz
エンディアンって、何がEndなのですか
218 :
デフォルトの名無しさん :2005/06/07(火) 00:03:35
>>215 重ね重ねありがとうございます。
iconv_open("UTF-8", "eucJP")
でokでした!
ですが、今度はiconvで-1っぽいです。。_| ̄|○
でも大体見えてきたので、こちらで頑張ってみます。
お手数かけました。
マウスの座標がミッキーとか、妙な言葉の作り方止めて欲しいと思った
>>205 「スクウェアルート」と呼んでいる
反論されたことはない
222 :
デフォルトの名無しさん :2005/06/07(火) 13:33:16
ちょっと双方向リストでも書こうと思うんだけど struct list_a { void *data; struct list_a *next; struct list_a *prev; }; struct list_b { struct list_b *next; struct list_b *prev; void *data; }; どっちが良いですか? 今までずっとlist_bだったんだけど、 list_aの方が一般的っぽい(glibとか)から 今回から変えようかと思うんだけど
好きなほうで書け。
224 :
デフォルトの名無しさん :2005/06/07(火) 15:06:26
数値のある部分を取り出すことはできますか? int a=20050607 2005だけを取り出す
struct list_b { struct list_b *prev; void *data; struct list_b *next; };
227 :
デフォルトの名無しさん :2005/06/07(火) 17:23:55
複利計算のプログラムを作っていて壁にブチ当たったのですが、 切捨てというのはどうやって行えば良いのでしょうか?
int x = 1.5; /* x==1になる */
小数点以下も表示、計算させたいときは10で割ってから
>>228 して
また10かけたりすんですか?
逆でした
小数点以下も表示、計算させたいときは
xを10や100かけてから
>>228 して
また10や100でわったりしなければいけませんか?
小数点第n位で切り捨て、みたいな処理をしたいのか? なら割って切り捨ててかけて、で問題ない。 あと、>228の書き方を丸呑みにすると変な書き方しそうなので、キャストとか型変換でぐぐって調べれ。 floatやdoubleをintに型変換すると小数点以下は切り捨てられる。 >228は暗黙の型変換を行なってるわけだ。 蛇足だが、切捨ては表示する段階でだけ適用しないと誤差が膨れまくるぞ。
複利計算のプログラムを作っていて壁にブチ当たったのですが、 ビットシフトはなんの役に立つのでしょうか?
ビットシフトご登場 ('A`)
malloc() 関数の戻り値をキャストしているプログラムを見つけたのですが、 このキャストはいったい何の役に立つのでしょうか?
>>235 C++ コンパイラでエラーにならないようにするため。
237 :
358 :2005/06/07(火) 20:41:36
EOFってキーボード上でどのように操作したら実行できるのですか?
Ctrl+DとかCtrl+Zとか。
239 :
237 :2005/06/07(火) 20:47:12
追記です。EOFなんですが、WindowsXPでコンパイラはBorlandです。 Unixではシフト+Dでできたようなのですが・・。
240 :
237 :2005/06/07(火) 20:49:32
あ、Ctrlでしたか。 でもそれでもできませんでした。 他に方法があるのでしょうか・・
そろそろ独習CというC言語入門書を勉強し終わり次にC++やAPIを勉強しようとしているC初心者です 2つ質問させてください 1・mallocで確保したメモリに変数や配列を入れ、freeでメモリを開放すると その変数や配列は開放後には使えなくなるのでしょうか? 開放後同じ名前の変数・配列を宣言しても平気でしょうか? 2・WindowsAPIを直接用いないMFCではなく、SDKベースでプログラムを 組めるようになりたいのですが、お勧めの本等ありませんか? また、現在は無料BORLANDコンパイラを使っているのですが、VC++を購入しようか 迷っております、SDKベースでプログラムしようとしてもVC++は便利でしょうか?
244 :
243 :2005/06/07(火) 21:30:04
もう2つ質問追加です 3・WINXPか2000等色々なOSでプログラムを作りたい場合等 テスト用に Virtual PC 2004 を購入しようか迷っております、使い勝手等はいいのでしょうか? また、Virtual PC 2004 は色々なOSでの動作が試せるけど、各OSのライセンスが ないとダメなのかも不安です 4・プログラムを作る環境(WINのOSバージョンやCPU)とプログラムを動作させる 環境は同じだったりしないと駄目なのでしょうか? 主に2000とXPを使っており、片方でしか使えないとなると厳しいのです・・ プログラミングやC勉強の際や関係ソフト購入の際等注意する点あったら 教えていただきたいです 長々となりましたが 宜しくお願いします
245 :
デフォルトの名無しさん :2005/06/07(火) 21:41:42
unsigned int toggle=0; int val[2]; while(1){ hoge(val[toggle]); toggle=!toggle; } というコードを時々見かけるんですが !0は1になる事は規格で保証されているんでしょうか !0は非0かと思ってますた
>>245 保証されてる
!0 → 1
!1 → 0
!-1 → 0
>>243 >変数や配列は開放後には使えなくなるのでしょうか?
同一ブロックで
void* hoge = malloc(hogehoge);
free(hoge):
hoge = malloc(hogehoge2);
free(hoge):
できるかってこと? ならできる。
>開放後同じ名前の変数・配列を宣言しても平気?
俺なら異なる名前空間なら同名変数宣言してもOKという場合もある。
同じ関数内ではやらね。
同一ブロックじゃ無理っていうかそれくらいなら試したりテキスト読めばわかる。
>お勧めの本等ありませんか?
URLなら猫でもわかるプログラミングていうかググればいくらでも解説ページあると思う。
>SDKベースでプログラムしようとしてもVC++は便利でしょうか?
DirectX、デバッガ目的で買った。使いこなすにはそれなりの労力は必要だろう。
今は買って満足している。買うならpro以上。
>>243-244 1. 意味不明。例となるコードを見せろ。
2. 俺も最初BCCを使っていたがVCを手に入れてよかったと思っている。
3. VirtualPCの中で動かすOSにもそれぞれ当然ライセンスが必要。
4. そんなことはありえない。市販ソフト・フリーソフトやコンパイラ自体も動作条件Win XX以上って具合だろ。
249 :
245 :2005/06/07(火) 22:00:14
>>246 ありがとうです
!0→1
!非0→0
っつう認識でいいんですね
>>243 1.解放後にも使えることは使えるけど、開放したらポインタが指すものが
無いわけだから不定値とか意味の無い値になる。変数が解放後も同じスコープに
あるなら同じ変数をそのまま使える。もし、同じ変数名で宣言したら
再宣言されているとかエラーになる。この辺は普通のローカル変数の宣言と同じだね。
2.SDKベースならペゾルド?の本かな。あとAdvanced Windows。コンパイラだけでなく、
エディタを含めた開発環境が一式手に入るからVC++は便利だよ。入力補完機能とか、
変数の引数の表示とか出来るしね。
3.Virtual PCでもそこにインストールするのは本物のOSだから、ちゃんと ライセンスを持っていないと駄目です。使い勝手は悪くないですが、出来るだけ 高速なCPUとハードディスクで運用して下さい。間違っても1GHz以下のCPUでは使用しないように。 4.同じの方が色々使っている時の不具合とか使用感とか分かるから望ましいですが、 駄目ならデュアルブート出来るようにしておいて、開発がある程度終わったら 切り替えて動作検証するとかですね。CPUはMMXとかの拡張命令に依存するのでなければ あまり気にしなくても良いと思います。 まとめると、MSDN Pro以上に入会するとVirtual PCやVC++とかの開発環境も 格安で全部揃ってウマーです。
1.0 を 1.0f と書けば double から float 型に変られるように、 1.0e-6 といった数字も double から float に書けませんでしょうか? 1.0fe-6 とかはムリでしたし、(float)1.0e-6とキャストするのは汚くて面倒です…
>>252 そもそも、わざわざfloatに直す意味が見いだせない。
極めてエレメンタルで不可欠な記述を汚いと判断すべきではないよ 必要で無いから汚いんだ、このレスのように
実際、floatをわざわざ使う意味はほとんどの場合無いけどな 使うのは、名前にだまされてる初心者だけ
名前にだまされてる初心者だけとか断言してる奴が一番ボケ
>>252 1.0e-6f
接尾語なんだから最後に付けないと駄目だろ。
じゃあなんでdoubleを使わずにfloatを使おうとするの?
たしかDirect3Dなんかは全部floatじゃなかったっけ
3D 系はだいたい float だな
264 :
デフォルトの名無しさん :2005/06/08(水) 21:07:53
hoge, 1, 10 piyo, 3, 8 fuga, 5, 16 ... みたいな入力に対して第三列目だけを取りたいんですが,どうするのがエレガントですか? 今は char dummy[1024] とか作っておいて sscanf(input, "%s, %s, %d", dummy, dummy, &data); とやってるんですが,わざわざ dummy を作らないでやる方法があれば教えてください.
sscanf(input, "%*s, %*s, %d", &data);
266 :
264 :2005/06/08(水) 21:14:28
うあ,* なんてあったんですか.知りませんでした.多謝!
突然すみませんが、以下のコードを実行するとアプリケーションエラーが出てしまいます。 デバッガではハンドルされてない例外は test.exeにあります。 と出て、非常に困っております。 どこが間違っているのか、教えていただけませんか。
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int data[10],table[10]; int i,j,temp; srand((unsigned int)time(NULL)); for (i = 0; i < 10; i++); { table[i] = i; data[i] = rand() % 100; }
for (i = 0; i < 10; i++); { printf("data[%d]:%4d\t\ttable[%d]:%4d\n", i, data[i], i, table[i]); } for (i = 9; i > 0; i--); { for (j = 0; j < i; j++) { if (data[j] > data[j+1]) { temp = data[j]; data[j] = data[j+1]; data[j+1] = temp; } } } for (i = 0; i< 10; i++); { printf("data[table[%d]}:%4d", i, data[table[i]]); } return 0; }
あう……何故かステップ実行が出来ないんです。 そう書いたつもりですが、全然書いてませんでした。すいません。
俺がデバッグしてやろうと思ったら何箇所かforの直後にセミコロンが付いているじゃないか。 まずそこを直せ。
フォー!? VC++6.0は馬鹿だ!! 気づかなかった俺もっと馬鹿だ!! 直したら正常に動作しました、どうもお騒がせして申し訳ございません。
えっと更に図々しくてすいません。 さっきの↑のプログラムで、配列dataのところのバブルソートを dataの順番は弄らずに配列tableだけをソートしたいのですが、dataの部分を tableに変えても上手くいきません。 具体的には data[0]:32 table[0]:0 data[1]:15 table[1]:1 data[2]:18 table[2]:2 data[3]:06 table[3]:3 を data[0]:32 table[0]:3 data[1]:15 table[1]:1 data[2]:18 table[2]:2 data[3]:06 table[3]:0 のようにtable[x]の要素を順番に抜き出せばソート出来る。 という表示にしたいのですが、考え方が分からず煮詰まってます。 とっかかりでも教えていただけませんか?
はじめまして。質問いいでしょうか? File出力に関する質問なんですが、演算結果を いくつものファイルに出力しようと思ってます。 そこでfpirintで出力するファイル名をfor等でループさせて 出したいんですが、可能でしょうか? fopen("---", "w")の---の部分を変数にして、ループ出力 させるイメージなんですが…。 ファイル名を変化させて自動で出力できればどんな方法でもいいんで よろしくお願いします。
>>275 struct F { char *name, FILE *fp };
main()
{
F[] = {{"a.txt",0},{"b.txt",0},{"c.txt",0},{0,0}};
int i;
for (i = 0; F[i].name; ++i)
F[i].fp = fopen(F[i].name, "w");
for (i = 0; F[i].name; ++i) {
fprintf(F[i].fp, "%s\n", F[i].name);
fprintf(F[i].fp, ...);
}
}
277 :
デフォルトの名無しさん :2005/06/08(水) 23:59:20
278 :
デフォルトの名無しさん :2005/06/08(水) 23:59:24
>>275 void hoge(void){
int i;
char filename[32];
for(i=0;i<10;i++){
FILE *fp;
sprintf(filename,"%d.dat",i); /*ファイル名生成*/
fp= fopen(filename,"w");
fprintf(fp,"it's data #%d\n", i);
fclose(fp);
}
}
>277 : の両側の型が同じ(と見なせる)なら問題ない。 9899:1999 だと両方が void でも OK となっている。
>279 printf() 自体は戻り値の型が int なんで。void ですら OK という意味ね。一応補足。
>>277 printf(rand() % 2 ? "表" : "裏");
とかでもいいよ
282 :
デフォルトの名無しさん :2005/06/09(木) 00:46:46
整数値を入力して、その値が積となる2つの整数の組を0〜19のまでの範囲であるだけ 求めて出力するプログラムなのですが、積と一致しても「一致しません」が最後にでてしまいます。 どうすれば、出ないようになるでしょうか?ご教授お願いします。 #include <stdio.h> int main(void) { int data[20][20]; int a, i, j, k; for(i = 0; i < 20; i++) for(j = 0; j < 20; j++) data[i][j] = i * j; printf("1つの整数を入力してください(k)\n"); scanf("%d", &k); for(i = 0; i < 20; i++) for(j = 0; j < 20; j++) if(k == data[i][j]) printf("(%d,%d)\n", i, j); else if(k != data[i][j]); printf("一致しません\n"); return 0; }
else ifの後のセミコロン。
Cのオススメの本教えろや
>>282 私へのレスかな…
確かにそこはおかしいですね。
そこを直したら、出力がさらにおかしくなってしまいましたorz
287 :
282 :2005/06/09(木) 01:21:32
286は282です
>>284 CプログラミングFAQ―Cプログラミングのよく尋ねられる質問 新紀元社情報工学シリーズ
スティーブ サミット (著), Steve Summit (原著), 北野 欽一 (翻訳)
289 :
283 :2005/06/09(木) 01:36:49
確認したが、正常に動作するぞ@Cygwin+GCC。 どうおかしいのか教えて欲しい。 一応言っておくが、「一致しません」が300個以上表示されるのは正しい動作だ。
>>282 int flag=0;
〜〜
for(i = 0; i < 20; i++)
for(j = 0; j < 20; j++)
if(k == data[i][j]){
flag=1;
printf("(%d,%d)\n", i, j);
}
if(flag==0)
printf("一致しません\n");
>>290 それでうまく動作しました。
有難うございました。
>>275 です
>>276 >>278 レスありがとうございます。
278を参考に作ってみようと思います。
初心者なので286は少々難しいです。イメージと
してはわかるのですがどうもエラーが出てしまいます。
あと試してみればわかるとは思うのですが、アドレスで
指定するとfopenのファイル名に""(ダブルクォート)はいらないの
でしょうか?
293 :
282 :2005/06/09(木) 02:13:40
>>290 度々すいません。
変数?flagについて調べようと思い手持ちの参考書を調べても載ってなくて、
検索してみたのですがいいページが見つかりませんでした。
もしよろしければ、簡単に説明をお願いします。
ネタくさいな
>>293 int doraemon=0;
〜〜
for(i = 0; i < 20; i++)
for(j = 0; j < 20; j++)
if(k == data[i][j]){
doraemon=1;
printf("(%d,%d)\n", i, j);
}
if(doraemon==0)
printf("一致しません\n");
296 :
293 :2005/06/09(木) 09:13:02
ネタじゃないので、お願いします。。。
>290と>293を見て、尚>296と抜かすか。
298 :
デフォルトの名無しさん :2005/06/09(木) 12:41:15
二冊ぐらいC言語の入門書よんでも、分割コンパイルがよくわからんーー。 誰か教えてください。
>>298 a.c b.cなどと別々のファイルから1つの実行ファイルを作るのが分割コンパイル。
他のファイルに存在する関数を使いたいときには、ヘッダファイルを作ってその中にその関数の宣言を書いておき、
それを関数を使いたいファイルと、実際に関数の中身があるファイルの双方がincludeする。
グローバル変数も同様。
>>298 概念がわかっててやり方がわからないなら、本をよむよりは実際に試し
てみて覚えたほうがいいよ。試しててわからないことがあれば、具体例
でここで聞くべし。
301 :
え :2005/06/09(木) 13:30:36
302 :
288 :2005/06/09(木) 13:31:13
298-299 親切にどうもでした。
スレ違いだったらスマソ C言語の変数宣言をBNFで定義せよ。 ただし、下記はすでに定義されているものとする。 また、データ型に関するキーワードは以下のものだけとする。 int,double,struct,long,short,static よろしくお願いします。
304 :
デフォルトの名無しさん :2005/06/09(木) 17:30:57
円周率を求めようとして以下のようなプログラムを書きました。コンパイルは問題ないのですが、うまく動きません。 printf("dx = ");scanf("%f", &dx);を書かずにdx = 0.0001;とするとうまくいくのですが。教えてください。レス違ったらすみません。 #include <stdio.h> #include <math.h> main(){ double dx, a, b = 0, k, pai; printf("dx = "); scanf("%f", &dx); for(k = 0;k < 10;k += dx){ a = -1*k*k; b += dx*exp(a); } pai = 4*b*b; printf("pai = %f", pai); return 0; }
306 :
デフォルトの名無しさん :2005/06/09(木) 17:52:24
ありがとうございました。
307 :
デフォルトの名無しさん :2005/06/09(木) 19:45:52
ヒープソートの構造は、 8 7 5 6 2 4 3 1 5 こんな感じだと思うのですが、これをそのままprintfで出力する方法はないでしょうか? これをそのまま出力するのではなくて、たとえばこの図の値の数は9個で4段ですが、値の数によって段数も変わるようにしたいです。 宜しくお願いします。
>>307 「ヒープソートの構造」ってなんだかしらんが、
>307のようなツリー構造はデータ構造を舐めながら地道に書いていけばよろしい。
再帰はこのためにあるようなもんだな
>>290 のflagのところはどういう仕組みになっているのでしょうか?
少し勘違いしてましたが、本当に何方かご教授お願いします。
>>282 ==311
else if(k != data[i][j]); ←ここ注目
printf("一致しません\n");
return 0;
}
313 :
307 :2005/06/09(木) 21:11:36
かなり悩んでいるのですがが難しいですね・・。 ちなみに再帰は関係ないと思います。
>>313 ツリーを書くプログラムを何回か書いたが
再帰が一番楽だった
315 :
307 :2005/06/09(木) 21:34:47
そもそも値はランダムなんだし再帰のしようがないと思うのですが。
316 :
デフォルトの名無しさん :2005/06/09(木) 21:42:02
初心者なんですけど、forかwhile使って2-100までの数字の中で素数だけを表示するプログラム教えて下さい。
>>316 なんか大学や専門学校の宿題で出そうな問題だな
え?順序木じゃないの?
>>317 いや、ただ単に自分で思っただけだよ。
バカなもんでわからない
この板はアフォばっかだから質問しても無駄だな
>>321 そう怒るなw
難しい問題にでも答えてくれる人はそうそういないよ。
>>307 こんなので良いか? 桁数とかハードコードだから適当に直してくれ。
void printheap(int *data, int size){
int i,j,k,spc;
for(i=1,j=0; j<size;i++) j+=i;
spc=(i-1)*2;
for(i=0,j=0,k=0; i<size; i++){
if(j++==0){
printf("%*c",spc,' ');
k++;
spc-=2;
}
printf("%4d",data[i]);
if(j==k || i==size-1){
printf("\n");
j=0;
}
}
}
>>316 #include<stdio.h>
int main(void){int i,j,f;for(i=2;i<101;++i){for(j=f=2;j<i;j++)if(i/j*j==i){f=0;
break;}if(f)printf("%d\r",i);}return 1;}
325 :
デフォルトの名無しさん :2005/06/09(木) 23:02:55
#include<stdio.h> int main() { int x; double y; for(x = 0, y = 0.0; x < 10; x++, y += 0.1){ printf("%d %lf\n", x, y); } for(x = 0, y = 0.0; y < 1.0; x++, y += 0.1){ printf("%d %lf\n", x, y); } return 0; } 二つ目のfor文のカウンタの更新のところで、 y += 0.1となっているんです。 これをコンパイルして、実行してみると、 一つ目のfor文の方は0〜9までしか表示されないのに対し、 二つ目は0〜10まで表示されてしまうんです。 繰り返しの条件かどこかに何かを付け加えれば良いと聞いたのですが、 教えてください。
328 :
311 :2005/06/09(木) 23:07:39
自分なりに解釈してみたのですが、 入力した値が積と一致した時はflagの値を1として 一致しなかった時はflagの値を0としている という意味で合ってますでしょうか?
329 :
デフォルトの名無しさん :2005/06/09(木) 23:07:50
>>326 やっぱり、yが小数のままではまずいですか?
>>325 for (x = 0, y = 0.0; y < 1.0 - DBL_EPSILON; x++, y += 0.1)
ならいけるんじゃないかな。
DBL_EPSILONはfloat.hに定義されてる
くわしくはぐぐってみてね。
331 :
デフォルトの名無しさん :2005/06/09(木) 23:12:32
>>329 ↓を実行してみて。
#include<stdio.h>
int main(void){
printf("%.30f\n", 0.1);
return(0);
}
332 :
デフォルトの名無しさん :2005/06/09(木) 23:13:13
>>330 分かりました。
ありがとうございました。
重ねて申し訳ないんですが、
「%○○」とかはやっぱり関係無いんでしょうか?
>>328 一致しなかった時はflagは0のまま
~~~~
334 :
329 :2005/06/09(木) 23:16:15
>>331 ありがとうございます。
今は出来ないので、明日やってみます。
335 :
325 :2005/06/09(木) 23:21:56
とりあえず、皆様に教えて頂いた事を元に、 やってみます。 ありがとうございました。
336 :
328 :2005/06/09(木) 23:36:05
>332 関係ない。つーか>326の解答が必要かつ充分。 0.1+0.1は0.2ではなく、0.199999999999998とか2.000000000000001になるって話。(桁数は適当) だから、floatやdoubleを==で比較してはいけない。まず一致することは無いからな。 比較したいときは誤差の存在を考慮に入れた比較をする必要がある。 %dとか%lfはprintfやscanfなどで使える書式指定用の文字。 ぐぐれば解説してるページがあるはず。 書式を指定するだけなので、変数はいじらない=動作には影響は無い。
幅が違う場合動作に影響するだろ
339 :
337 :2005/06/10(金) 01:31:54
確かに。最悪core吐いて強制終了する場合もあるな。 ちょっと誤解を招く表現だった。 他の部分に影響は無い、という事。
つまらない質問かもですが、atoi の a って何ですか?たぶん "a" to int だと思うんですけど、a は何者なんでしょうか? それから atoi をアトイって発音してもいいですか?
チョビはシベリアンアスキー
>>340 ASCII と見せかけて実は Adept
110 :sage:2005/06/09(木) 21:03:38
宿題じゃないんだけど Cで
「配列の型にかかわらず、全要素の平均値をdouble型で返す関数」
って作ることできますか? void *とか使ったんだけどうまくいかなかった...。
できたとしても、一般的にそーいう作り方はしないの?
Cの基本は理解できた気がするけど
実際に作るとなるとどーしていいのか分らないこと多すぎ...。
116 :110:2005/06/09(木) 21:32:35
>>112 ありがとうございます!
で、実際にこのような関数が必要になった場合どうします?
関数をint用とdouble用に作ると、型が違うだけなのに同じ処理をする関数が
あって気持ち悪い。けど、他の人が使うときは分り易いと思う。
逆に1つにまとめるとコード的にはスマートだけど、他の人が使うときに
datatype があることが不親切な気がすると考えてしまうんですけど。
こーいうプログラミングの
「文法的な意味じゃない"書き方"」
っていうーのを解説してる本を見たことないので...。
344 :
デフォルトの名無しさん :2005/06/10(金) 04:20:35
MFCを使わずにPOSTを送るにはどうしたらいいでしょうか・・? ATL Serverを調べたのですが受信のことばかりで 送信の仕方が外語文献を見てもなくて・・・
#include <stdio.h> void foo(void){ printf("foo\n"); } int main(int argc, char **argv){ char *ptr; ptr = argc > 1 ? "ok" : (foo(), NULL); return 0; } このプログラム、GCCでコンパイルしたときに、32ビットの処理系だと何も 警告が出ないのに、64ビットの処理系だと。 warning: pointer/integer type mismatch in conditional expression という警告がでてしまいます。C言語としては問題ないような気がするのですが、 なぜこのような警告が出るのでしょうか。
347 :
デフォルトの名無しさん :2005/06/10(金) 12:52:56
Cの宿題スレってどこにあるんですか?
フルスクラッチってどーゆ意味でしょうか? webでいろいろ漁っていたら見かけた言葉なのですが,もし御存じの方いましたら 教えてください。
348 誘導お願いします。
いえ誘導はありません、検索ぐらいしろです
348 ぬぅ
0から書くこと
>>348 「フルスクラッチ」ってのは「ぜんぶ自分で作る」という意味。
和製英語ではないらしいんだが、英語では普通 full scratch とは言わ
ないで from scratch と言う。
プログラミング的には、ライブラリなど既存のパーツを使わないで、ぜ
んぶ自分で書くという意味ではないだろーか。
つまりフルスクラッチ≒ジサクジエンですね
フルスクラッチって、模型用語だと思ってた。
スレ違いの質問に答えんなよ。夏休みにはまだ早いぞ。
>>395 フルカスタムだと、「全てがカスタマイズ可能」みたいに聞こえる(w
>>360 やる人はいないと思うけど、可能ではある。
362 :
デフォルトの名無しさん :2005/06/10(金) 19:31:52
__STDC_VERSION__ってC99対応ならいくつになるの? gcc3.3.3(cygwin special)で199901になったけど これ以外の値になることはないんですか?
ググればいくらでも出てくるだろ
外部変数と静的変数って結局どっちがいいの?
一つの関数内でしか使わないのなら静的変数。多数の関数から利用するなら外部変数。 目的によって使い分けるもので「どっちがいいか?」というものではない。
#include<stdio.h> void main(void) { printf("\x1b[0;36m"); printf("うんこばすたー"); return ; } これをBCCでコンパイルしても「[0;36mうんこばすたー」と表示されて うまく水色にならない・・。機種の問題ですか?
プロジェクトメンバーの一人のC言語厨が、 どうしてもコーディング規約を守ってくれません。 俺の部下だけど先輩なんだよなぁ・・・。 どうしたらコーディング規約を守ってくれるようになりますか?
>>367 そいつにどーしても守る気がないなら排除すれ。と、XPやアジャイルの本には書いてありますた。(まじ)
>>366 32BitEXEの場合はWin9xでしかできない。
代わりにWin32APIの中にコンソールの色を変更する関数がある。(9xでも使える)
fclose()を使用したら、この関数から戻ってきた時点で ディスクに書き込みは完了したと思っていいんですか? それとも関数から戻って来てもディスクに書き込みを続けている 可能性はありますか?
371 :
370 :2005/06/10(金) 22:48:33
すみません、解決しました。
373 :
デフォルトの名無しさん :2005/06/11(土) 00:54:01
>>370 もはやCの範疇ではない
HDD が write back cache を持っている可能性をどうやって否定するんだ?
書き込み先がネット越しの仮想ドライブだったら??
374 :
デフォルトの名無しさん :2005/06/11(土) 01:11:43
画像ファイル(BMPなど)を読み込んで、OpenGLで表示するにはどうすればいいですか?
>>370 そもそもディスクとは限らない。
テープかも知れないし、USBメモリかも知れない。
ぁぃ、「もしも〜」を「まさか〜ないだろう」で考えてとんでもない事をした事がありますw
もしもし? まさかりかついだきんたろう
378 :
デフォルトの名無しさん :2005/06/11(土) 01:54:47
まさかりかついだきんたろうはいないだろう
まさかユーザが format C とかしないだろう という前提でプログラム作ってます
>>364 どっちもあまり多用すべきものではない。そうしたものの全部が
有害というわけでもないが。
名前空間を汚染しないという意味ではファイルスコープまたは関数スコープの
static変数のが害が少ないが、もともと有害なそうした変数の存在が
目立たなくなるという欠陥もある。
>>379 あ、そのプログラム商用じゃなきゃ貰ってformatしてみたい♪
昔シェルスクリプトであっさりc:/を殺したうんこです
戯言スマンス
C言語さえ出来れば、出来ないことはないって友人に聞いたのですが本当ですか。
>>382 本当です
なまじプログラムができる為に…
他の就職先があるのに…
虚弱体質なのに…(以下略
ぼろぼろになって幻をみて入院して
退院直後に3日間完徹してまたぶっ倒れて点滴打ってまた徹夜できます
トリップできますから
>>382 ものによっては不便とか面倒とか非現実的とかそういうことを度外視すればまぁ本当。
385 :
デフォルトの名無しさん :2005/06/11(土) 03:03:07
>>285 なぜ冒頭でエスパー君は怒っているのですか?
>382 自分に自信が持てなかった僕もC言語を始めてからみるみる成績アップ。 身長も10cm伸び近視も解消、一日10分のプログラミングで見違えるようなたくましい体に。 阿修羅級の功徳兵器により豪運が唸り爆運が炸裂、万札風呂に女の子二人と共に入浴とかも出来ます。
>>382 インラインアセンブラを使わなきゃレジスタとかはいじれないよ
389 :
デフォルトの名無しさん :2005/06/11(土) 03:17:48
>>388 シーとニーを間違えたのではないだろうか?
いやデズニ─ラソドの話だけど
レスありがとうございます、 2chもC言語で出来てるって言うし C言語をがんばってみます
392 :
デフォルトの名無しさん :2005/06/11(土) 05:51:25
Cはおおよそマスターしたと思うのですが(C++は×)、いまだに、関数ポインタの記述法がよくわかりません。 1. まず、 int (* MyFunc)(int); などと書いて関数アドレスを入れる変数を定義するようですが、この書き方がよくわからない。 (* MyFunc)の部分をどう考えたらいいのでしょうか? int (__cdecl *) MyFunc(int); とかだったら納得いくような気がするんですが・・・ 2. そして、 int (* MyFunc)(int); のMyFuncを使ってパラメータの数などを変更したいのですが、この場合のキャストがどのように書くのかわからない。 x = (int (* MyFunc))(int, double)(1, 2); などとやってもダメ。どう書くといいのでしょうか?
C言語勉強中の者です、いくつか分からない事あり、教えて頂けると助かります 1・scanf・getchar・getche・getch で入力を求めた時、ただENTERを押した場合 何が返るか、バッファに何が入るか 、が良く分かりません scanfは何もなし、getcharは\n、getcheは\r で宜しいでしょうか? 2・型の拡張の関係ですが、 short型 * unsigned long型 はunsigned long型になると 本には書いてあるのですが、shortが負の数の場合でもunsigned long型なのでしょうか? 他の型になるのでしょうか? 3・以下のプログラムは1から10までの値を0.1づつ表示するプログラムです コンパイルして実行すると、2.8と表示されるべき所が2.799だったり誤差が出ます float f; ではなく double f; と宣言すると誤差が出ません。 なぜでしょうか? #include <stdio.h> int main(void){ float f; for(f=1.0; (int) f<=9; f=f + 0.1) printf("%f \n", f); return 0;} 宜しくお願いします
>>392 1. ばらして考えれば分かりやすいかと。
1) 識別子 MyFunc を宣言する。 -> MyFunc
2) MyFunc はポインタだ。 -> *MyFunc
3) なんのポインタかというと、関数へのポインタだ。 -> *MyFunc()
4) その関数の引数はintだ。 -> *MyFunc(int)
5) その関数の戻り値はintだ。 -> int *MyFunc(int)
6) intへのポインタを返す関数の宣言のできあがり。あれ?
3')ポインタの'*'より、関数の'()'の方が優先順位が高いので、
()で括ってポインタの優先順位を上げてやる。 -> (*MyFunc)()
4')その関数の引数はintだ。 -> (*MyFunc)(int)
5')その関数の戻り値はintだ。 -> int (*MyFunc)(int)
6')intを返す関数のポインタのできあがり。
2.
x = ((int (*)(int, double))MyFunc)(1, 2);
395 :
デフォルトの名無しさん :2005/06/11(土) 07:17:24
>>380 名前空間の汚染が理由なら関数化もできない
ちなみに俺は関数内 static に関しては先だって検討する手段が腐るほどある
例えば親側の auto にしてアドレス渡しなど
強いて言うなら定数の配列くらいか? これも extern が頭にちらつくけどね
>>393 1. scanfでも%cとかでは\nを受け取れる。
2. 負の場合でもunsigned longにされる。まずlongにしてからULONG_MAX + 1を加えた値になる。
3. そりゃfloatの方がdoubleより精度が悪いから。doubleもfloatも内部は2進法を使っていて、
0.1は2進法では無限小数になってしまう。だからdoubleでも誤差が出ることはある。
397 :
デフォルトの名無しさん :2005/06/11(土) 08:12:23
>>393 1. printf 等で確認すればいい、scanf は戻った後の値が有効性を返却値で示す
2. 変換後の型で元の値を表現できない場合、結果は未定義
3. 0.1 が出てきてる人に説明は不用と思量する
398 :
デフォルトの名無しさん :2005/06/11(土) 08:14:26
>>397 s/値が/値の/
3. 0.1 が double 型であることはよろしいか?
>>397 整数同士の変換に未定義の物は存在しない。
処理系依存の場合はあるが、signed→unsignedでは396のようになり処理系依存ではない。
400 :
デフォルトの名無しさん :2005/06/11(土) 11:21:03
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
忘れたころにワロタ
ウェブ C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか? の検索結果 8 件中 1 - 8 件目 (0.23 秒)
>>400 あー、最初は不思議だよね。
用法は多岐にわたるが、
あんま気にしないで、次に進めばいいと思うよ。
色んなサンプルを見てるうちに、気づくことがあるだろうから。
405 :
乙 :2005/06/11(土) 12:41:10
乙
>>400 意味どおりにビットがずれると考えるか
2のn乗を手際よく計算する方法と考えるか
そんなところかね
後者は今のコンパイラなら使える場合はシフトを使うように勝手にオプティマイズしてくれるが、
シフトの知識があれば掛け算を使うにしても意識して組めるかもね
407 :
デフォルトの名無しさん :2005/06/11(土) 12:48:25
_______ __ // ̄~`i ゝ `l | / / ,______ ,_____ ________ | | ____ TM | | ___ // ̄ヽヽ // ̄ヽヽ (( ̄)) | | // ̄_>> \ヽ、 |l | | | | | | | | ``( (. .| | | | ~~ `、二===-' ` ===' ' ` ===' ' // ̄ヽヽ |__ゝ ヽ二='' ヽヽ___// 日本 _____ _____ ______ _______ | ウェブ | | イメージ | | グループ | | ディレクトリ |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ._________________ | │・検索オプション └────────────────┘・表示設定 | Google検索 | I'm Feeling Lucky | ・言語ツール  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ○ウェブ全体から検索 ◎日本語のページを検索
409 :
乙 :2005/06/11(土) 12:54:09
乙
ズットシフトしてろ。
ループの頭ごとに2次元配列の全要素をを0で初期化したい のですが、どうすればよいでしょうか?以下のようにstaticで 宣言しなおしているのですが出来ません。 #define A --- #define B --- main(){ for(;;){ static double X[A][B] = { 0 } ; for(;;){ --- X[ ][ ] ---- }; } }
>>411 >static double X[A][B] = { 0 } ;
プログラム開始時に 0 になるだけ。
>ループの頭ごとに2次元配列の全要素をを0で初期化したい
なら、その都度自分でクリアしないと。
>>383 良く、点滴打って頑張ってると聞きますが、
何処行けば点滴打ってくれるの?
病院って待ち時間が長いイメージが有って、
>>411 int a_nArray[5][10];
int i, j;
for (i = 0; i < 5; i++)
for (j = 0; j = 10; j++)
a_nArray[i][j] = 0;
もしや、こういうこと?違ったらすまん。
memset使えよ
>>417 doubleでmemset()は駄目だろ。
419 :
1/3 :2005/06/11(土) 18:29:36
シフト演算子の挙動について質問があります。 i386互換CPUにおいて、CL 6.0/7.0/7.1/8.0とgcc 3.3.3(cugwin)を用いての結果です #include <stdio.h> int main(void) { int j; for( j = 0; j < 100; j++ ) { printf( "%d\t%d\n", j, 1 >> j ); } return 0; } 以上のコードを実行すると、32の倍数で1、それ以外で0が表示されます。 ビット長以上のシフト命令はマスクがかけられたような結果になっています。
420 :
2/3 :2005/06/11(土) 18:29:59
そこで、このような結果が正しいのかを検証するために ISO/IEC 9899:1999 (E)の6.5.7 Bitwise shift operatorsの5を参照したところ、 The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 / 2^E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined. となり、E2がE1のビット長より大きい場合の定義はどこにも見当たらないため、 E1 / 2^E2の解釈より、0が返されるものと推測できます。
421 :
3/3 :2005/06/11(土) 18:30:20
そこで、該当部分、printf( "%d\t%d\n", j, 1 >> j );の機械語の出力を見ると(CL7.1)
mov eax,1
mov ecx,dword ptr [j]
sar eax,cl
push eax
mov ecx,dword ptr [j]
push ecx
push offset string "%d\t%d\n" (42401Ch)
call @ILT+1170(_printf) (411497h)
add esp,0Ch
ここの、「sar eax,cl」がShift Alothmeric Rightで右シフトをしている部分と思われます。
機械語には詳しくないので、このsar命令のclが32以上の時の挙動が詳しく分かりません。
また、この命令は16bitや64bitのCPUでは挙動が変化するのでしょうか?
長くなってしまったのでまとめます。
・i386互換プラットフォーム上のCLとgccにおいて、1
>>32 が1となってしまうのは定義されていない動作でよろしいでしょうか?
・すれ違いかもしれませんが、問題となっているsar命令の挙動を教えてくれますでしょうか?
>>411 static付けずに宣言すれば良いんでない?
>>421 i386系CPUのシフト命令は下位5ビットしか見ない仕様だったと思う。
>>422 何をトンチキなことを言うておるのだ
このイカレポンチめ
ごめん酔ってた
memset 使ったら移植性にかけるっていうけど何でごすか?
double型の0の内部表現は処理系に依存するから。 全ビットを0にしても値0になるとは限らない。 殆どの環境で大丈夫だけど。
429 :
411 :2005/06/11(土) 19:05:39
回答ありがとうございます。 とりあえずメモリ開放でOKのようなのですが、 memset()ではやはり0で初期化できないのでしょうか? 出来ればExternで宣言してポインタなしで使用したいと 考えてるので。
430 :
411 :2005/06/11(土) 19:06:42
>>428 0は近似でいいんで大丈夫だと思います。
431 :
411 :2005/06/11(土) 19:08:23
>>421 ビット幅以上のシフトは未定義だとその近所に書いて有ったと思うが。
記憶違いか?
>>430 近似値になるとも限らないんだけど。
だからさ、
#define A ---
#define B ---
main(){
for(;;){
double X[A][B] = { 0 } ; // staticを外す
for(;;){ --- X[ ][ ] ---- };
}
}
じゃだめなの?
やはりな。 どこにも見当たらないって言った>421は 6.5.7 #1〜4も嫁。 たぶん#3だろ。 #4は<<の説明だろうからな。
436 :
411 :2005/06/11(土) 19:58:39
>>433 まだ試してないんですが、それで0セット可能なんでしたら
無問題です。
出来れば初期化以外の方法での0セットも出来ると助かるのですが…。
>出来れば初期化以外の方法での0セットも出来ると助かるのですが…。
>>416 一気にやりたいならゼロで埋めた配列を用意しておいて memcpyを使ってコピーすればいい。
点滴の打ち方おしえれー。
439 :
419 :2005/06/11(土) 22:12:21
>>432 >>435 あ…#3にしっかりと書いてありました。
The integer promotions are performed on each of the operands. The type of the result is
that of the promoted left operand. If the value of the right operand is negative or is
greater than or equal to the width of the promoted left operand, the behavior is undefined.
情報ありがとうございました。
しっかし、こうしてみるとビットシフトは未定義だらけですね。
CPUの命令に落としたときに、余計な処理が必要にならないようにだろうね
442 :
デフォルトの名無しさん :2005/06/11(土) 23:02:34
点滴でか? 致死量超えないようにするとほとんど水だぞ
443 :
カバクラ坊 :2005/06/11(土) 23:24:22
質問です。 あるヘッダファイルSの中で、別のヘッダファイルMをインクルードすると、 そのヘッダSをインクルードしたファイルはMファイルのシンボルも見えてしまうじゃないですか。 これを防ぐことは出来ないのでしょうか? ご教授お願いします。
includeしない
>>443 防げないしそれで困ることも大してない。
そうなんですか・・・ どうも有り難うございました。C言語の素晴らしさを改めて実感させてもらいました。
>>446 まあ、隠蔽したいならライブラリにしちまえってこった。
自分でinclude しといて見えて困るってどういう量見だ?
ヘッダにソース書いちゃうとかってオチじゃないよな。
>>446 モジュールAのヘッダでBのヘッダを#includeする必要があるってことは、
AのインタフェースにBのインタフェースが現れているってことだから、
ユーザに見えるのはしょーがない
BがAのインタフェースではなく実装(*.c)にしか現れていないのなら
AのヘッダでBのヘッダを#includeする必要はなく、実装でBのヘッダを
インクルードすればよい
この場合は、ユーザに隠すことが可能だな
>>443 > Mファイルのシンボルも見えてしまうじゃないですか。
見るためにincludeするものだ。
見えては困るものはヘッダに書くな。
452 :
デフォルトの名無しさん :2005/06/12(日) 01:05:33
static
static関係なくね?
いまいち説明が漠然とし過ぎていた為、 状況が伝わらなかったみたいですね。すみません。 例えば、ヘッダQ内のシンボルの宣言が、 別のヘッダTに依存している場合はどうでしょう。 この場合はQでインクルードせざるを得ませんよね。 ヘッダQは折角Tをラップして使いやすくしたのに、Tのシンボルが 名前空間を汚してしまうのはなんとなく嫌だな、という話です。 上記の状況でも、殆どの場合はキャスト等で回避することが可能なのですが、 現在それが出来ない状況でありまして。(非常に特殊なケースなのですが)
>>454 いやだから、徹底して隠したいんなら、Tのシンボルを隠さなきゃダメだろ
それが「出来ない状況」ならあきらめろってこった
456 :
デフォルトの名無しさん :2005/06/12(日) 01:43:42
>>453 なんで? 隠蔽するならリンク時に衝突が起こらないことを保証する必要があるぞ
457 :
カバ :2005/06/12(日) 01:45:02
そうですね。
ああ、あと
>>446 で既に諦めておりますので。
これ以上はスレ汚ししてしまうのは悪いので、ここで立ち去らせて頂きます。
皆様どうも有難う御座いました。
458 :
:2005/06/12(日) 03:03:07
cで書かれたオープンソースで簡単なソフトってないでしょうか 日本製で参考になるような
>>458 sourceforgeにたくさんあるだろ。
>>457 =カバ
こんな感じか?
--foo.c
static int foo;
--bar.c
static int bar;
--baz.c
#include "foo.c"
#include "bar.c"
int baz = foo+bar;
foo.c bar.c をコンパイルせずに、
$ cc baz.c
製品でやると顰蹙ものだけど、個人的なアプリならやっても良いんじゃねえか。
蛇足、 既に foo.h bar.h baz.h を作っていて、 .c ファイルを #include するのが嫌なら、 foo.c bar.c baz.c を全部あわせた大きな hoge.c を作るのが良いんじゃないかな。
下のようなカウントダウンループでunsigned intを使用するとiが0に達した後の i--でオーバーフローして無限ループ? for(unsigned i=10;i>=0;i--) printf("%u\n",i);
する。 素直にintにしろ。
465 :
デフォルトの名無しさん :2005/06/12(日) 06:16:52
>>463 こういうのってオーバーフローって言う?
466 :
◆bk1IKp1NkI :2005/06/12(日) 11:21:38 BE:25356522-#
初心者です。 C言語について、わかりやすく書かれたサイトはどこでしょう? 猫でもわかる の他にはありませんか? 僕は小学生なので、わかりやすく書かれたサイトがいいです。
>>466 藻前にとっての「わかりやすい」なんて、
誰にもわからねぇよ。
>>454 具体的なソースを晒した方がいいジャマイカ?
470 :
◆bk1IKp1NkI :2005/06/12(日) 11:29:49 BE:88747027-#
初心者が最初に見る、Cの解説ページを教えて欲しいんです。
>>470 > 初心者が最初に見る、Cの解説ページ
そんなものはない。
どこを見ようがその人の勝手だ。
好きなサイト見れや
472 :
デフォルトの名無しさん :2005/06/12(日) 11:34:53
>>466 小学生って言っても1年生か6年生かでやりようが違いすぎるよね
それから個人差もすっごく出る
ちなみに俺は4年生の頃に高校の化学Tを読んでたり同級生にアンプ作ってる子がいたよ
あと、あんま2ちゃんで小学生とか書かないほうがいいな。 ナメられたり、やっかみに会ったりするから。
474 :
◆bk1IKp1NkI :2005/06/12(日) 11:37:49 BE:152136364-#
>>472 6年です 少し学校の勉強を予習している程度です。
初心者向けでC言語講座などがあるサイトを教えてください。
476 :
◆bk1IKp1NkI :2005/06/12(日) 11:43:52 BE:38034623-#
ただ僕は初心者にお勧めのサイトを皆さんに聞きたいだけなんですが・・・
478 :
デフォルトの名無しさん :2005/06/12(日) 11:46:33
479 :
◆bk1IKp1NkI :2005/06/12(日) 11:46:38 BE:399357397-#
>>477 どのスレで質問すればいいんですか?
質問ばかりですみません・・・。
480 :
◆bk1IKp1NkI :2005/06/12(日) 11:48:08 BE:152136364-#
>>478 ありがとうございます。色々なサイトを見てみます。
481 :
デフォルトの名無しさん :2005/06/12(日) 11:48:23
482 :
◆bk1IKp1NkI :2005/06/12(日) 11:49:59 BE:114103229-#
>>481 ありがとうございます。わかりやすくて気に入りました。
1分36秒でわかりやすいと判断したのか。 末恐ろしい小六生だな・・・。
484 :
デフォルトの名無しさん :2005/06/12(日) 13:11:26
小学生が使った社交辞令を額面どおりとる奴がいるスレはここですか?
おまいら大人げないよな・・・。
配列でのポインタ用法について勉強しているんですが float balance[10][5] という配列の balance[3][1] にポインタでアクセスしたい場合 float *p; p=(float*)balance; printf("%d",*(p+(3*5)+1)); のように書きますが、何故p+(3*5)+1なのかいまいち理解できません。 *pがbalance[0][0]として、順番に並べると、 [0][0],[0][1],[0][2],[0][3],[0][4],[0][5],[1][0],[1][1],[1][2],[1][3], [1][4],[1][5],[2][0],[2][1],[2][2],[2][3],[2][4],[2][5],[3][0],[3][1] と、p+(3*6)+1 だと思うのですが・・ 配列の際[〜][5]の5のような最後の場所は、 float balance[10][5]と宣言してもメモリ上にも作られないのでしょうか? 初歩的 かつ 分かりにくい質問ですいません。 どなたか教えて頂けると助かります、宜しくお願いします
>>469 setjmp.hなのですが。
setjmpは関数の実装で隠蔽出来ませんよね…
returnしたらそこで終わりになってしまいますから。
機能拡張するならどうしてもマクロを使うしかない。
あ、一つずつ#undefしてく…ってのは無しですよw
>>486 違うぞ。
[0][0],[0][1],[0][2],[0][3],[0][4],
[1][0],[1][1],[1][2],[1][3],[1][4],
[2][0],[2][1],[2][2],[2][3],[2][4],
[3][0],[3][1]
だ。
宣言のところの角括弧の中身は個数を表し、
使用するときは角括弧の中身は0から始まるインデックスを表す。
だからbalance[0][5]はありえない。(同様にbalance[10][0]もない)
ガンガレ!
宣言時に指定するのはサイズ。 実行に指定するのはインデクス(オフセット)。 そしてインデクスは0から始まる。
>>486 printf("%f"
だべ
あと、Cでの二次元配列のレイアウトがそうなってるから
それでも動くけど、正しくはbalanceを指すポインタの型は
float (*)[5]
でしょ。
491 :
デフォルトの名無しさん :2005/06/12(日) 17:19:44
>>487 シンボルひとつにつきインクルードファイルをひとつずつ
作っていけばいかがですか
492 :
486 :2005/06/12(日) 17:47:20
レスありがとうございます int i[2]と宣言しても int[0]〜[2]まで3つの要素が入る訳ではなかったんですね 大目に配列のサイズを指定しておく癖になってて今までさっぱり気付きませんでした;; とても助かりました、ありがとうございます! もう一つ質問なのですが 多重間接参照(ポインタのポインタ)についてです #include <stdio.h> int main(void){ char *p, **mp, str[80]; p = str; mp = &p; printf("名前を入力してください: "); gets(*mp); printf("今日は %s さん", *mp); return 0; } のgets(*mp); と printf("今日は %s さん", *mp); の*mpがどうして*mpになるのか どうしても分かりません・・・ **mpのように書いてある他の例題もあるし、 *でも**でもどっちでもいいんじゃと思って変えてみてコンパイルしてみてもエラーでますし 色々WEBサイトで検索してみたのですがさっぱりです>< 私的には、ややこしくて、こんがらがってる文字列定数がらみかな?とも思うのですが どなたか猿にでも分かるように解説していただけませんか? 宜しくお願いしますm(_ _)m
同じデータを扱っていて **mpになることはありえないが。
>>492 pはpointer to strで、mpはpointer to pになる。
よってmpはpointer to pointer to strになる。
mpをdereferenceするとpointer to strとなる。
つまりtypeof(*mp) == char*となる。
495 :
494 :2005/06/12(日) 17:59:04
間違った。 pはpointer to str[0]で、mpはpointer to pになる。 よってmpはpointer to pointer to str[0]になる。 mpをdereferenceするとpointer to str[0]となる。 つまりtypeof(*mp) == pointer to str[0]になる。 str[]に対してstrは&str[0](pointer to str[0])と同じなので、 *mpはstrと同じになる。
2ヶ月ほど前からCを学び始め、ずっと気になってたことがあり、 それが今になってさらに無性に気になってきたので聞かせてください 1つ目は関数の前の int や void の意味 2つ目は return の意味 return を使う場合は int main() とか、関数の前に int をつけなければ 使えないみたいなんですが、よく例のソースコードについている return 0; を つけなくてもエラーは出ませんし、ちゃんとプログラムは動きますし 大変初歩的なことは承知なのですが御教授お願いします
> 関数の前のintやvoidの意味 関数がreturnする値の型。 > returnの意味 値を返す。 ちなみに、main()では何も値を返さずに末尾に達した場合には return 0;したのと同義であることが規格で定められている。
>>497 スピーディーな回答ありがとうございます
main 以外の関数では必ず return を記述する必要がある、ということでしょうか
return する値の型を色々変えてみて試してみようと思います
printfみたいな引数が可変な関数って、どうやって作るの? 俺が読んだ入門書には載ってなかった。 正直、printf系の関数以外で引数が可変の関数を知らない・・・
500 :
デフォルトの名無しさん :2005/06/12(日) 19:45:48
たとえば、こうつくる #include <stdio.h> #include <stdarg.h> void func(int count, ...) { int i, num; va_list ap; va_start(ap, args); for (i=0; i<count; i++) { num = va_arg(ap, int); printf("%d\n", num); } va_end(ap); }
501 :
デフォルトの名無しさん :2005/06/12(日) 19:47:16
間違えた、こう #include <stdio.h> #include <stdarg.h> void func(int count, ...) { int i, num; va_list ap; va_start(ap, count); for (i=0; i<count; i++) { num = va_arg(ap, int); printf("%d\n", num); } va_end(ap); } func(3, 1, 2, 3); と呼ぶと 1 2 3 と出力する
ファイルポインタを勉強しはじめたのですが、 fopen("C:\Documents and Settings\Dai\My Documents\C\test\test.txt","w") としてもfopenに失敗してしまいます パスの指定方法がおかしいと思うのですが、正しいパスの書き方を教えてください
>>502 \はエスケープ文字だから、\自体を表すには\\と書かなければならない。
>>499 学校の課題を2ちゃんで聞くのはやめましょう
宿題は宿題スレへ
入門書調べるくせに、検索はかけないのな printf 可変 なんかでググればいくらでも出てくるのに・・・
そして教えてもらったお礼もなし、と これだから最近の馬鹿学生は
池沼相手に大人げないな
文字列配列 char str[80]; と宣言して その後添え字をつけず、str と表記すると str[0]のアドレスの事を意味するのか、str文字列の内容全てを意味するのか 混乱しております。 教えていただけませんか?
両方の意味がある。どちらになるかは文脈によって決まる。
>>510 原則前者だが例外的に配列全体(文字列全体ではない)を意味することがある。
まずsizeof strと書くと配列の要素数80を返す。
&strと書くとstrへのポインタ、つまり(char *)[80]型になる。
strと書いた場合はstr[0]のアドレスだからchar *型。Cでは文字列を(const )char *などで扱うからこれを文字列全体を表すと言えなくもない。
C言語を今から始めようと思っています。
>>2 のコンパイラの中から
選ぼうと思っていますがどれを使おうか迷ってます。
みなさんのおすすめを教えていただけませんか?
514 :
デフォルトの名無しさん :2005/06/12(日) 22:43:39
超基本的な問題なんですけど、以下のプログラムを実行しても 税率が計算されずにそのまま出てきます。 nedanはグローバル変数にしているのですが…。 #include <stdio.h> int keisan(int, int, int); int nedan; int main() { int kingaku, zeiritsu; printf("金額を入力して下さい="); scanf("%d", &kingaku); printf("\n消費税率を入力して下さい(%%)= "); scanf("%d", &zeiritsu); keisan(kingaku, zeiritsu, nedan); printf("%dに%d%の消費税を加えると%d円になる\n", kingaku, zeiritsu, nedan); return 0; } int keisan(int kingaku, int zeiritsu, int) { nedan = kingaku * (1 + zeiritsu / 100); return 0; }
>>513 学生ならVisual Studio the Spokeを買え。
>>514 税率の出し方がおかしい。
return kingaku * (100 + zeiritsu) / 100;
あと、関数定義時に仮引数名を省略できるのはC++。
518 :
513 :2005/06/12(日) 22:57:53
すみません。書き忘れましたがフリーでお願いします。 WindowsXPです。
519 :
デフォルトの名無しさん :2005/06/12(日) 23:01:05
>>517 なるほど、そういうことでしたか。ありがとうございます。
>>514 voidkeisan(int kingaku, int zeiritsu)
{
nedan = kingaku * (1 + zeiritsu / 100.0);
}
zeiritsu / 100 だとint / int 答えもintになる
zeiritsuが5だとすると 5 / 100 で 0
>>497 >main()では何も値を返さずに末尾に達した場合には
>return 0;したのと同義である
それC++じゃね?
手元の cygwin なら
#include <stdio.h>
int main(void)
{
printf("hello\n");
}
% ./a.exe
hello
% echo $?
6
522 :
デフォルトの名無しさん :2005/06/12(日) 23:22:28
>>513 なぜgcc-cygwinがリストの一番上にあるのかを考えろ
524 :
513 :2005/06/12(日) 23:30:57
>>523 gcc-cygwinにします。ありがとうございました。
525 :
デフォルトの名無しさん :2005/06/12(日) 23:41:45
なんで入門用がシミュなんだよ、頭元気か? 規格合致性なんて後から憶えればいいんだよ どんな処理系でもそいつのフルパワーの出し方が肝心要だろうが 目的より手段の本末転倒には反吐が出るね
質問です。 int ary[3][3] = { 1 , 5 , 10 , 50 , 100 , 500 , 1000 , 5000 , 10000 }; 「初期化の一部だけにカッコがついている」 とか警告が出るのですが問題なしですか?
>>521 ISO/IEC 9899:1999 5.1.2.2.3 Program termination -1より
reaching the } that terminates the main function returns a value of 0.
>>526 int ary[3][3] = {
{ 1 , 5 , 10 }
,{ 50 , 100 , 500 }
,{ 1000 , 5000 , 10000 }
};
>>527 ,. -‐ ''"  ̄ ̄ ``丶、
i:::::::::::::::::::::::::::::::::::::::::::i |
カ ヽ:::_; ‐--、、 、---、 ;;_:| |
チ `!;{ |トNヽ }.:.:.:| |ヽ' 要
カ lf へ、| 、,. へ、ヽ;| | チ
チ ,.-!. <(')' '(')> '=、 | ェ
カ .{{〉,| '" , , ` ム }〉 、 | ッ
チ /ヾ‐l ,.---、 u i、..イ ``'| ク
カ ,.ィ_" |`''i、 〈ヨ ̄´,〉 / / | や
チ/,ノr:} ヽ ヽ `'三'"/ / ム !!
/ /,.⊥L_ \l! ` -‐' / / /|
/ / ─‐〈 `ヽ、一r''" ! |/ ̄ !ヽ
r''" .ノ 'ー─〈 __ -─‐=ニ二二) l / |
/ ( 、 二.フ |-ニ ̄ -──- | | i
p = &(*p)->right の両辺に*をほどこすと、 *p = (*p)->right になりますが、 この2つの違いを教えてくだちい
532 :
デフォルトの名無しさん :2005/06/13(月) 00:32:21
main(){ char c_test1[9], c_test2[9]; scanf("%s/%s", &c_test1, &c_test2); printf("test1:%s test2:%s\n", c_test1, c_test2);} 上のプログラムを実行してmo/naと入力すると、 test1:mo/na test2: と出力されてしまいます。 test1:mo test2:na と出力させたいのですが、どのへんがいけないのでしょうか?
>>531 p = &(*p)->right
p.rightのアドレスをポインタpに代入
*p = (*p)->right
p.rightの中身をpが指すアドレスに代入
int *a, b;
a = &b; // bのアドレスをaに代入
*a = b; // bの中身を*aに代入
これととよく見比べて
freestandingだと main()の戻り値とかも実装定義のようだ でもOSの機能をつかうと反則らしい。
535 :
526 :2005/06/13(月) 08:43:46
>528 dクス
効率のいいキューファイルの作り方教えてください 行単位で管理したいんだけど 追加時は最終行に追加するとして 取り出し時は先頭行から取り出したい でもこういう構成にすると、結局メモリ上に ファイルの内容を全部持たなきゃならなくなるんだけど ファイルはキューへの追加・削除時に毎回保存したい なんか、効率悪くて遅い
>>536 行長が固定できるならリングバッファにするとか。
538 :
536 :2005/06/13(月) 14:45:07
>>537 固定できればリングにしてランダムアクセスにしたいんですけど
可変長なので・・・
DBの利用も考えたのですがガンガン追加→ガンガン削除という
ログっぽいデータでDB使うと良くないので 見合わせています
#include <stdio.h> int main(void) { char ch; do { ch = getchar(); putchar('.'); } while(ch != 'l'); return 0; } 例えば、このようなプログラムで aaalbbbと入力した場合、bbbがバッファに 残り、もしこれがもっと長いプログラムだった場合エラーの原因となりそうなので while(getchar()!='\n'); と空のループを作り、getcharを一回使うたびに使おうかと 考えております、考えすぎ とか 他にもっといい方法があるとかありますか?
>>539 scanf("%*[^\n]%*c");と書けば改行までの読み捨てができる。
scanfって正規表現使えるんだ 便利だな
>>539 オレには何をやりたいのか?すらわからない… orz
>>541 scanf系の書式は正規表現とは言えない。
>>540 漏れも初めて知った。dクス!
もしかして正規表現ってもともとscanf系の書式を誰かが拡張させたものなんじゃ、と想像してみる。
とりあえずscanfを少し見直した。
scanfって正規表現のようなもの使えるんだ 便利だな
scanfでは[]系しか使えない。これだけで正規表現だというのはいかがなものか。
あくまで対象は1文字だけということか
1文字?
scanfって正規表現とはお世辞にも言えないがそれっぽい表記使えるんだ 便利だな
scanfって便利だな
552 :
539 :2005/06/13(月) 16:51:54
レスありがとうございます scanfでやればよかったんですね もう一つ質問です #include <stdio.h> int main(void){ int i, j; char op; printf("演算を入力してください: "); scanf("%d%c%d", &i, &op, &j); switch(op) { case '+': printf("%d", i+j); break; case '-': printf("%d", i-j); break; case '/': if(j) printf("%d", i/j); break; case '*': printf("%d", i*j); } return 0; } のプログラムで、演算ができますが 計算式を入力する際、「1+1」では成功でも 「1 +1」のようにスペースを入れると失敗します "%d%c%d"を"%d %c%d"に書き直すと「1 +1」でも、「1+ 1」でも、「1 + 1」でも、 「1 + 1」でも成功します ですが、何故成功するようになるのかが理解できません。 教えていただけませんか?
>>552 scanf類の書式文字列で空白類文字を書くと0個以上の空白類文字を読み捨てるという意味になるから。
554 :
539 :2005/06/13(月) 17:05:40
553様レスありがとうございます 書式文字列で空白を書く場所はどのように決まっているのでしょうか? "%d %c%d"ではなく "%d%c %d" や " %d%c%d"や "%d%c%d "と書くと失敗するもので;;
>>554 "%d %c%d"なら「1 +1」は成功する。
"%d%c %d"なら「1+ 1」は成功する。
556 :
539 :2005/06/13(月) 17:18:04
自分でも試してみたところ、私の環境では "%d %c%d"なら 「1 +1」でも「1+ 1」でも「1 + 1」でも、 計算式のどこにスペースを入れても成功し "%d%c %d"では、「1+ 1」や「1+ 1」の時と「1+1」の時だけ成功です 実はPCやコンパイラによっても違いがあるのでしょうか? セレロン600のWINXPの無料BCC++コンパイラを使用しております
557 :
554 :2005/06/13(月) 17:20:59
>>556 554は勘違いだ。スマソ
正しくはこうだったはず。
%cは空白文字も入力として受け付ける。
%dは空白文字を受け付けないから読み飛ばす。
558 :
◆bk1IKp1NkI :2005/06/13(月) 17:27:29 BE:342306869-#
前質問させてもらった小学生の者です。 あるHPに printf("\x1b[2J") と書くと画面が消える、と書いていたのですが、実際には変な記号のようなものが表示されるだけで、消去できません。 どうすれば画面消去できるのでしょうか? ちなみにXPを使っています。
>>558 スレ違い。環境依存スレへどうぞ。
#つーか激しく既出だがね。
560 :
◆bk1IKp1NkI :2005/06/13(月) 17:32:51 BE:456408498-#
そんなスレあるんですか? すみませんが既出でも教えてください。過去ログ見れないので・・・。
562 :
◆bk1IKp1NkI :2005/06/13(月) 17:40:15 BE:76068443-#
>>561 ありがとうございます。今から探してみます。
telnet経由で見れば消えるはず
564 :
◆bk1IKp1NkI :2005/06/13(月) 17:51:37 BE:63390252-#
すみません、一応このスレを全部見たんですが、色の変え方しかのっていませんでした。 僕の見落としだったらすみません。 過去ログも検索しましたが、XPでは使えないということだけで、方法がのっていませんでした。 すみませんが、消す方法を教えてくれませんか?
566 :
◆bk1IKp1NkI :2005/06/13(月) 18:00:36 BE:177492274-#
>>565 ありがとうございます。これからはそのスレで質問すればいいんですね。
>>564 教えたいのは山々だが、ここのスレではスレ違いだから教えられない。
やさしいなお前等。
569 :
デフォルトの名無しさん :2005/06/13(月) 18:13:07
質問です。 YesかNoで答えられる質問を出して、 ユーザが入力するまでの時間を計りたいんだがどうするのが一番いいのかな。 コンマ秒単位で計りたいのでdifftimeでは荒すぎるし、 clockが計るのはシステム時間だから0になっちゃうしで困りますた。
環境依存じゃね?
571 :
◆bk1IKp1NkI :2005/06/13(月) 18:20:10 BE:228204094-#
C言語とは違いますが、このスレって質問をするスレではないのですか?
>571 スレタイになんと書いてある?
>>571 環境非依存の内容を質問するなら構わない。
575 :
デフォルトの名無しさん :2005/06/13(月) 18:30:18
環境依存別にいいじゃん。 なんでそんなにめくじら立てるの?
>>575 ・鬱陶しいから。
・他に適当なスレがあるから。
・環境を聞き出して回答するのが面倒だから。
577 :
デフォルトの名無しさん :2005/06/13(月) 18:32:31
システムコール使うのだってCでできることなんだし、Win32APIだってCで使えるんだからいいじゃない。 printfだってライブラリを使っているに過ぎないわけだし、内部ではシステムコールだって呼んでいるわけだし。
>>575 >>1 > 標準Cではできない事の質問は使用している開発環境のスレへGo!
>>576 ・鬱陶しいから。
・他に適当なスレがあるから。
・環境を聞き出して回答するのが面倒だから。
それってお前の主観的な感想でしかないよな。
それに、他に適当なスレがあるっていうのは理由にならないよ。 ここはCのスレで、他のスレと連動しているわけではないんだから。
>575 そう思うなら、「環境依存上等!1が全部答えます」スレでも 建てれば?
>>581 別に1が教えなくてもいいんじゃない?
お前が仕切るなよ。
質問するだけの消防池沼はぐだぐだ言わんととっとと去ね。
584 :
デフォルトの名無しさん :2005/06/13(月) 18:36:35
あるファイルには数字とアルファベットが入っていて、 ファイルからデータを読み込んで出力する時に数字だけ読み込んで出力する、次に アルファベットだけ読み込んで出力するにはどうしたら良いのでしょうか? ファイルの形式 1 a 2 b 3 c . . . 26 z
>>583 それも主観的な感想に過ぎないね。
感想なんか聞きたくないよ。
>582 おまえはこのスレの1を知らないな。 >C言語なら、オレに聞け! >1 名前:ビル・ジョブス 投稿日:2000/09/03(日) 21:43 > おれは25才、3年間プログラムを一生懸命作ってきた。 > C言語しか知らないがC言語なら誰にも負けない...
>>586 放置した方がいいと思ったけど、丁寧に返答しとくね。
去ね
589 :
584 :2005/06/13(月) 18:44:16
数字だけ読み込んでそのまま1 2 3 ... 26と表示させたいです。 アルファベットだけ読み込んでそのままa b c ... zと表示させたいです。
>>588 命令なんてありえない。
だとすれば、その意図は感想だよ。
>>589 char buf[BUFFER_SIZE];
FILE * fp = fopen(dataFile, "r");
while (fgets(buf, sizeof(buf), fp)) {
printf("%d\n", atoi(buf));
}
rewind(fp);
while (fgets(buf, sizeof(buf), fp)) {
char alphabet[BUFFER_SIZE];
sscanf(buf, "%*d%s", alphabet);
printf("%s\n", alphabet);
}
fclose(fp);
これだけ部品を用意しておけば後は適当に加工できるっしょ。
「αは主観的な感想にすぎない」というβについて、 βもやはり主観的な感想なんじゃねーの。
593 :
584 :2005/06/13(月) 18:50:24
感想だと否応に主観的だから、感想では無いな。 客観的事実。
>>580 適切なスレを選択できない
あなたの頭の悪さの言い訳にもなりませんね。
597 :
デフォルトの名無しさん :2005/06/13(月) 22:14:05
スレ違いと指摘する者が「適当なスレ」を考えずに発言するのもどうかしてるよ 答えのない問いをつきつけて困惑する様を楽しんでいる悪趣味が見え見え
599 :
デフォルトの名無しさん :2005/06/13(月) 22:56:00
あんたはそれを言わなかった
601 :
デフォルトの名無しさん :2005/06/13(月) 23:26:35
>>600 甘えてるのはそっち
自分の主張を定義しそびれた/持たずに発言した己の愚行を
人の落ち度に便乗して誤魔化そうとしているだけ
これがゆとり世代クォリティ
603 :
デフォルトの名無しさん :2005/06/13(月) 23:44:11
主張に対する責任範囲も3とか教えられていそうだな
今までcygwin使ってて、そろそろC++もやってみたいなって思い出したんだが、まず何をダウソすればいいんだ?
砂糖っていつごろから日本に入って来たんですか? 何百年も続く伝統的な和菓子なんていうものもあるくらいだから 相当昔ではないかと思うんですが、砂糖なんてとれるのは沖縄あたり でサトウキビくらいなもんですよね?中国ですか?
すみません。誤爆しました。
いや、合ってる
>>601 適切なスレを選択するのは、
質問者・見る人の義務だろう。
このスレは、標準Cの範疇に関する質問スレだ、
と
>>1 に書いているのに、考えもなしに質問する方が怠慢だ。
ものすごい誤爆っぷりだなw 8世紀に唐僧鑑真が来日した際に黒砂糖500斤をもたらしたという説があるから そのときじゃね?
構文糖っていつごろから(ry
>>611 syntax sugarの直訳だから、これが日本に入ってきてすぐじゃないか?
613 :
デフォルトの名無しさん :2005/06/14(火) 18:51:37
すいません、以下のプログラムで変数nに代入された数値がlong型の範囲を 超えている場合にif文で警告を出すには、どうすればいいのですか? #include <stdio.h> int main(void) { long n; long *p; scanf("%d", &n); p = &n;
「構文糖」って訳にしてるのは近藤嘉雪さんだけという説あり。 「糖衣構文」のほうが意味もわかりやすいしー
>>613 そのプログラムでは、longの範囲を超える値は入りません。
617 :
デフォルトの名無しさん :2005/06/14(火) 19:38:31
#include <stdio.h>
int main()
{
printf("\x1b[4;31m");
printf("色が変わってアンダーラインが付く\n");
printf("\x1b[7;32m");
printf("今度は反転です。 \n");
putchar(0x1b);
printf("[0;36m");
printf("今度は水色です\n");
printf("%c%s今度は緑\n", 0x1b, "[32m");
printf("%c%s%s\n", 0x1b, "[1;35m","こんな書き方もあります\n");
printf("\x1b[0m");
return 0;
}
WINDOWS XPではエスケープシーケンスは使えないのでしょうか?
猫でもわかるプログラミングというサイトを見ていてそれが出てきたのですが
実行しても色が変わりません。
ttp://www.kumei.ne.jp/c_lang/intro/no_26.htm これなのですが…
>>617 XPにエスケープシーケンス自体はある
つか、一通り目を通してから聞けよ
>>617 無断で転載するなって書いてあるだろうがゴルァ!
スレ違いだし。
>>617 NT系では16ビットプログラムでしかエスケープシーケンスは使えない。
58章からWindowsでの代替の方法が載っている。
>>619 これはただの引用だろ。
XPでエスケープシーケンスがつかえない、というのは、正当な引用とは言い難くね? 主と従の構成になってないし。
622 :
デフォルトの名無しさん :2005/06/14(火) 19:56:14
>>618 ひとつずつ理解しているので先読みしてないんですよ…。
とりあえず全部の章に目を通してみるべきですか?
>>619 URLだけ記述したほうがよかったですね、すみません。
>>620 わかりました、そちらの章を読み始めてみます。
>>620 URL書けばいいだけの物を、転載する事も無いだろう。
禁じますとかかれてある物を何故わざわざ?
XPでエスケープシーケンスに対応したシェルとか作ったら こういううざい連中とおさらばできるかな?
625 :
デフォルトの名無しさん :2005/06/14(火) 20:06:51
>>609 >>569 のような質問をする人が、それが標準の範疇かどうか知っていると思うか?
あなたが規格票を熟読精通してからこのスレに来ていて、それを他の人にも義務づけたいと言うなら
賛同はしないものの言っている意味はわかるが
急速にスレの質が低下してまいりました
>>625 そう思うんなら、あんたはそういう姿勢で質問者に答えるんだね。
どうぞご勝手に。
でも、
>>1 を読めば分かるとおり、実装系依存の問題はスレの趣旨から外れる以上、
それを他の回答者に強要することはできんよ。
628 :
613 :2005/06/14(火) 21:35:41
うほ、無理ですか……よかった提出せんで。 それなら、long型で宣言した変数に、ユーザーが任意の数値を入力するとして その数値がlong型の範囲内であるかどうかチェックする処理はどうすれば 出来ますか? 元々この問題で考えていたサンプルプログラムが上のだったもんで…… 他にshort型で同じ問題があって、どちらも指定した型以外大きさで 宣言はしてはならないということなんですが。
>>628 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
main()
{
char buff[1024];
char *endp;
long value;
while (fgets(buff, sizeof buff, stdin)) {
if (endp = strchr(buff, '\n'))
*endp = '\0';
errno = 0;
value = strtol(buff, &endp, 10);
if (endp == buff)
puts("ぜんぜん変換できねーYO!!");
else if (errno == ERANGE)
puts("オーバーフローっす");
else if (*endp != '\0')
puts("なんかケツに数字じゃない文字があるよ");
else
printf("おめでとう!: %ld\n", value);
}
}
CPUのフラグをみればいいんじゃね?
>>625 標準の範疇かわからないなら、
まずは、自分の環境に合ったスレを探して、
そのスレに行くべきじゃないのか?
わざわざ「標準の範疇内のみ」と銘打っているスレに来る理由がわからない。
cygwinってCもC++もコンパイルできる?
できる。gccとかで つうかcygwinはコンパイラじゃないぞ
てーかコンパイラって何?
ググれ
何だよデバックって… しかもアセンブラちょっちキモいぞ。
cygwinがコンパイラと聞いて実践占星術板から来ますた
そんな板、無いじゃねぇかよ…
だってコンパイラじゃないじゃん( ´・ω・`)
セグウェイのことなら俺に聞け!
>>643 バッテリーだか油だかしらんけど一回の充電(給油)でフツーの下町(江東区)でどのくらい走れる?
千代田区まで通勤できる?
>>645 あぁ、スマン
神戸って何かカコイイ
retern 0:
}
u!!!!!!!
>644 その質問は環境依存。 江東区から千代田区までの距離を地図で測って「〜km走れる?」と聞け。
距離だけじゃないんだなぁ 信号〜信号までの距離でのエンジンのオンオフとか直線とカーブの割合とか
他スレに誘導されても質問を繰り返す(自称)糞餓鬼よりは、 スレ違いネタの方が未だましだと思うのだが。
セグウェイって新しいコンパイラ?
落ち着け segwayとcygwinってあんま似て無いぞ('A`)
-= ∧_∧ -=≡ ( ・∀・) -=( つ┯つ -=≡/ / //∧ ガッ -=≡(__)/ )< >__∧∩ -= (◎) ̄)) ∨`Д´)/ /
知らんでも煽る事じゃないんだが セグウェイ=ジンジャー
ジンジャーワショーイ
ジンジャーは開発コードでセグウェイは製品名。
へ〜〜〜。
int hoge[]={1,1,1,1,1}; で、 hogeの配列はいくつセットされたかはどうやって調べればいいのでしょうか?
>>661 sizeof(hoge)/sizeof(hoge[0])
sizeof(hoge)/sizeof(*hoge)
664 :
デフォルトの名無しさん :2005/06/16(木) 19:22:47
結合順序を知らない童貞
>>664 いやまて順序ってつまり先に後使うとうんこ付いちゃうとかそうゆう(ry
すみません、一つ質問なんですが int型の数値から文字列に変換する関数で、戻り値に変換された文字列の先頭のポインタを返す場合 呼び出し先の関数ではstatic宣言をした配列にしないと戻り先の関数から参照できませんよね。 ですがその場合だと、呼び出し元の関数が二回連続して同じ関数を呼び出すと当然の事ながら結果は上書き されてしまいます。 そこでこの状態に対する対処法はなにかありますか? 例 char *ItoA(int); char *p1; char *p2; p1 = ItoA(1234); p2 = ItoA(-1234); printf("%d\n", p1); printf("%d", p2); の場合、呼び出し先の配列がstatic宣言されていると -1234 -1234 と表示されてしまうのを回避したい。 お願いします。
>すみません、一つ質問なんですが 一つにしぼって
そんなもん、書き込み先を引数でもらうか、mallocして返すか、 staticなリングバッファで返すかしかないだろう。
>>666 1番よいのはchar *へのポインタを引数に取り、そこへ結果を書き出すようにすること。
あまりお勧めしないがItoA内部でmallocを読んでその目盛りへのポインタを返す方法もある。
ほかにもものすごく小さなプログラムなら戻り値をstrcpyでコピーするようにとコメントを書いておくという手もある。
>>666 char p1[64] = { '\0' };
char p2[64] = { '\0' };
sprintf( p1, "%d", 1234 );
sprintf( p2, "%d", -1234 );
printf("%d\n", p1);
printf("%d", p2);
SuffixArrayのインデックスを作成する関数ご存じないですか? ググって見ても、プログラムの一部だったりして使えません・・・。 アルゴリズムは何でもいいのですが・・・。 良ければ、引数が文字列(とその長さも?)とインデックスを格納する配列へのポインタなら 助かりますが、そうでなくても頑張ります。
673 :
デフォルトの名無しさん :2005/06/17(金) 00:36:31
>>666 char p1[40];
strcpy(p1, ItoA(1234))
>672 c++ でいいならすぐ書けるんだけどなあ vector<int> make_suffixarray(const string& str) { vector< pair<string, int> > v; for (int i = 0; i < str.size(); ++i) v.push_back(pair<string, int>(str.substr(i), i)); sort(v.begin(), v.end()); // sort by first elements vector<int> suffixarray; for (int i = 0; i < v.size(); ++i) suffixarray.push_back(v[i].second); return suffixarray; }
C++厨は他所にいけ
良く無いだろwwwwwwwwワロ
strcpy が文字列を先頭からコピーすることは規格で決められているんですか?
>>677 質問の意味が判らん。
尻尾から頭に向かってコピーしていく変態な実装が許されてるかどうかってことか?
>>678 質問が下手ですいません…
その通りの意味です
文字列が連続してメモリにあるともかぎらないし、若いアドレス順に 格納されているともかぎらないし。
>>679 SSE2を使った実装は(まだ)無いと思うが、使えば、
36バイトいっぺんにコピーされるので、順番と言う
概念が崩壊するね。
で、Cの規格では、それをやっても構わないことになってる。
685 :
デフォルトの名無しさん :2005/06/17(金) 11:05:43
特定のメモリアドレスの文字列を取得したいのですが memcpy(str, 0x????????, n) のようにアドレス指定ってできないのでしょうか? VBだと CopyMemory VarPtr(strBuf(0)), &H????????, cstrLen とAPIでは指定できるのですが、Cだと他の方法があるのでしょうか? ご教授願います。
>>685 できると思うが、ここでは環境に依存した内容は扱えないので詳細はWindowsProgrammingに関したスレへ。
Cは標準ではスレッドを扱うための機構は用意されてないのでしょうか?
はい、用意されていません。
689 :
687 :2005/06/17(金) 12:37:03
文法ミス。Cは、ではなくCには、です。
690 :
デフォルトの名無しさん :2005/06/17(金) 12:43:30
include<stdio.h> int main(void) { char buf[80]; char SS[80] printf("string="); gets(buf); while (strcmp(ss,"") != 0){ puts(buf); printf("%s\n",buf); printf("%s\n",buf); } return 0; } 上記の例題で実行したら string= と表示されて、=の横にC languageと入力したら、 C language C language C language C language と表示されますが、C languageを10行以上表示させる方法ってありますか?
>>690 何をしたいのかよく判らんが、strcmp(ss, "")はssが初期化されていないので動作未定義になる。
で、一体何がしたいの?
693 :
デフォルトの名無しさん :2005/06/17(金) 13:01:23
すみません、ちょっとわからない事があったので教えてください。 memset ((char *)&me),0,sizeof(me); memset関数を利用する時に第一引数の意味がわからないんですけど。 よろしくお願いします。
>>693 memset()の第一引き数がchar *だった頃の名残ジャマイカ。
void *memset( void *dest, int c, size_t count );
だから素直にmemset(& me, 0, sizeof(me));でいいはず。
尚、(char *) はchar * へのキャスト。
695 :
デフォルトの名無しさん :2005/06/17(金) 13:16:33
>>694 わかりました。ありがとうございます!!
696 :
デフォルトの名無しさん :2005/06/17(金) 18:54:06
>>692 初期化出来ていませんでしたか…どうやるのでしたっけ…?
どうしても4行しか表示されなくて…
10行以上表示できると聞いて試したいのですがやり方がわからないのです。
>>696 10行以上出すだけなら
puts(buf);
を10回以上書けばいいだろ。
何がしたいんだ、何が。
>>685 #include <stdlib.h>
memcpy(str, (void *)0x????????, n);
or
#include <windows.h>
CopyMemory(str, (void *)0x?????????, n);
699 :
696 :2005/06/17(金) 21:28:59
他には何か方法がありますでしょうか?
んなもんループを使うなりすればいいだろ
>>699 include<stdio.h>
int main(void)
{
&bnsp; char buf[80];
&bnsp; int i;
&bnsp; printf("string=");
&bnsp; fgets(buf, sizeof buf, stdin);
&bnsp; for (i = 0; i < 10; i++) {
&bnsp; &bnsp; printf("%s", buf);
&bnsp; }
&bnsp; return 0;
}
○| ̄|_
int bnsp;書いとけば問題ないw
705 :
699 :2005/06/17(金) 22:24:34
ループ…?えっと…どう入力するんでしょうか?
706 :
699 :2005/06/17(金) 22:25:05
ループ…?えっと…どう入力するんでしたっけ?
708 :
デフォルトの名無しさん :2005/06/17(金) 22:35:42
スペースを含んだ文字列をスペースを削除して表示するプログラムを作っていますが、 #include <stdio.h> #include <ctype.h> int main(void) { char str[100],tmp[100]; int i,strl=0; scanf("%s",str); for(i=0;str[i]!='\0';i++){ while(isspace(str[i])!=0) i++; tmp[strl]=str[i]; strl++; } printf("%s",tmp); } こうやると、スペースの前で文字列が終了していることになっているようです。
すいません、字下げがなくなって見づらくなってますねorz #include <stdio.h> #include <ctype.h> #include <string.h> int main(void) { char str[100],tmp[100]; int i,strl=0; scanf("%s",str); for(i=0;str[i]!='\0';i++){ while(isspace(str[i])!=0) i++; tmp[strl]=str[i]; strl++; } printf("%s",tmp); }
>>709 scanf("%s",str) → gets(str)
あとループ出たらtmp[strl] = '\0'
getsは安全じゃないとか言って荒らしていいですか
>>708 #include <stdio.h>
#include <ctype.h>
int main(void) {
int c;
while ((c = getchar()) != EOF) if (!isspace(c)) putchar(c);
return 0;
}
これで十分ジャマイカ?
え?タブとか改行とか殺していいの?
718 :
714 :2005/06/17(金) 23:26:36
これで十分ジャマイカ? #include<stdio.h> int main(void){int c;while((c=getchar())-EOF)if(!((c-' ')*(c-'\t')))putchar(c); return 0;}
普通にisspaceの方が速そうだが
>>720 isspaceは改行とかも非0を返すわけだが。
□うるさいでちゅね
724 :
デフォルトの名無しさん :2005/06/18(土) 02:15:24
defineで定義された値がどこで使われているかログを取りたいので ファイルに出力したいのですが、そのまま出力するとマジックナンバーになってしまいます defineで定義された名前(と値)を記録したいのですがなにか良いテクは無いでしょうか 今のところ ・define名と値をペアにした静的なテーブルを用意 ・値をキーとして名前を取得 ・名前をファイルに書く としてるんですが、コンパイル時に決まっているものを 実行時にわざわざサーチして取得してるのは無駄な気がします ※defineの値に重複は無いです
gccでなら何かかっこいいテクがあった気がする H8 gcc でググると
726 :
デフォルトの名無しさん :2005/06/18(土) 05:03:23
>>727 ありがとうございます。libspf2-1.2.5/src/libspf2/spf_config.c にある、
SPF_config_t は何なのでしょうか。てっきり、SPF_create_config が返す型で、
int とかではないから構造体かと思ったのですが…。
57 SPF_config_t SPF_create_config()
58 {
59 SPF_iconfig_t *spfic;
60
61 spfic = calloc( 1, sizeof(*spfic) );
62 if ( spfic )
63 SPF_reset_config( SPF_spfic2cid(spfic) );
64
65 return SPF_spfic2cid(spfic);
66 }
>>728 過去使ってたけど、今のバージョンでは使われてないから定義されてないのでは?
SPF_config_tが登場するところは全部#if 0と#endifに囲まれてて、
コンパイルされないしね。
>>729 わー、ありがとうございます。#if 0 をみのがしていました。どうもです。
>>725 情報ありがとうございます
ググるとH8というマイコンを扱ったページがヒットします
H8用のgccで何かかっこいいテクを使ってるんでしょうか
とりあえずネットの海をクロールしてきます
??
>724 ログ、って何で出力四天王? 文字列じゃねの?
#define HOGE 1 str[1]="HOGE"; printf("%02X(%s)\n",HOGE,str[HOGE]); こういうことをやってると思う。 で、いちいちstrに入れることなく HOGEを"HOGE"として扱う方法を 彼は探している。
>>724 コンパイラからは定数に見えているんだから、無茶
>>724 こういうことがしたいのか?
#include <stdio.h>
#define EVAL(x) #x
#define LOG(x) printf("%s: %d: %s: %s\n", __FILE__, __LINE__, #x, EVAL(x))
#define FOO 1
#define BAR 2.0
int main() {
LOG(FOO);
LOG(BAR);
return 0;
}
>#x これ、どの版のCから使えるの?
>HOGEを"HOGE"として扱う方法 ?単にそうすればええやん printf("%s","HOGE");
>741 ほんとだ、thanks
ファイルかフォルダかを判別するにはどうすればよろしいですか?
>>743 処理系依存
まあstat()が使えるんならstat()で。
/A 指定した属性のファイルを表示します. 属性 : D ディレクトリ
>>744 環境依存でしたか。 stat ありました。さっそくやってみます。
>>745 そちらのほうは何とかなっとりました。けれども、レスありがとうございまス!
&& やら || で、左に来る式が真(偽)ならば、右側は実行しないという のは保障されていますよね??
c = a(x) + b(x); 実行されるのは aとb どっちが先だっけ
>>751 処理系依存だったよーな。最適化の都合で、同一処理系内でも保証されてないかも。
>751 それは決まってない
>規格 うそつくなよw
>>752 これって、「必ずどっちかが先に実行される」というのすら
規定はされてないよね?
最適化の都合なら、同時に動くこともあるよね?
でも普通、Aやって、Bやって、最後はCだろ? 漏れはまだAもやってないけど。
>同時に動くことも な、なんだって〜!
>>758 最近はCPUがたくさんあるのも珍しくないし
「同時」は普通のことだと思うので。
>>759 未規定ってなに?不定のこと?未定義のこと?
>最近はCPUがたくさんある それはCの話ではないだろ? ベーシックだろうが機械語だろうがコボルだろうが
>>761 3.4.4 未規定の動作(unspecified behavior)
この規格が,二つ以上の可能性を提供し,
個々の場合にどの可能性を選択するかに関して
何ら要求を課さない動作。
例 未規定の動作の例としては,関数の実引数の評価順序がある。
764 :
デフォルトの名無しさん :2005/06/18(土) 23:09:40
>>763 その定義では処理系定義も含んでしまうな
学校でCを習ってるんですが、バブルソートがわけわからんですばい というか全般的にサッパリ・・・
バグルソートが分からないんじゃあ…
>>765 やめちまえって
そして頭の悪いロボットサラリーマンとして
搾取される側に周るがいいよ
バブルソートが分からないって香具師はさすがに初めて見ましたな 今後の身の振り方を考えるいい機会なんじゃないの?
770 :
デフォルトの名無しさん :2005/06/18(土) 23:21:44
あーわ あーわー
まぁバブルソートわかんなくても、トランプの並べ替えができれば大丈夫 人間的にはバブルソートしないからな
多分考えようとしてないだけだろ。 最近は公立中学の技術の教科書にもプログラミングについて載ってるからな。 やりたくもない事やらされたらなんも考えようとしないだろう。 彼はそんな中学生。
あぁその公立中学の技術の教科書に載っていたBASICに感銘を 受けてFM-TOWNSでプログラムを始めた頃がナツカス…
%演算子っていつから存在しているんですか? C言語が出来た当初からあったんですか?それとも 適当な時期に導入されたものなんですか?
>>773 漏れは親父が買った「マイコン」の説明書に載ってた
サンプルプログラムを打ち込んだのが最初だったな。
当時、まだ消防だった。
ただのオヤジじゃないかと
>>777 何歳以上なら「オヤジ」に分類されるんだ?
779 :
773 :2005/06/19(日) 00:01:28
漏れ的には30越えたらオッサンだな
まあ大体30くらいからだろうな。
40超えたらおじさんだよ
784 :
775 :2005/06/19(日) 01:20:25
40どころか30にもなってないよ… orz
両手を使って2倍の速さで、両足も使って4倍の速さで入力 ハッピーバースデーの音楽でケーキに蝋燭が立ってて スペースを押すと火が消える そんな感じの漫画だったと思うんですけど、覚えてる人いますか?
>>775 そうか、じゃあいいこと教えてやろう。
30前になるとチンゲの色がやや脱色ぎみになる。
30も半ばになるとチンゲに白髪が交じって来る
その後は白髪でいっぱいのチンコの完成だ。
チンコ見てるとどんどん年を食っていくのが良く分かるぞw
いや、髪は大分白くなったが下は黒々としているよ。
チソゲにもいろいろあるんだな
ちんげより、当面の問題はけつげなのだが。 脱毛クリームで全滅させても大丈夫かな? 毛で肛門切れたりして痛いときがあるのだが
男は黙って毛抜きで抜く
温度高めのシャワーで毛穴を開いておいて一気に抜く
あぅっ!イタイッ!! ハァハァ
>764 3.4.1 処理系定義の動作(implementation-defined behavior) 未規定の動作のうち、各処理系が選択した動作を文書化するもの。 例 処理系定義の動作の例としては、符号付き整数を右シフトした場合の最上位ビットの伝播法がある。
794 :
ccc :2005/06/19(日) 21:10:36
教えてもらたい問題がいくつかるんすけどいいっすか?
796 :
デフォルトの名無しさん :2005/06/19(日) 21:18:24
797 :
ccc :2005/06/19(日) 21:27:10
わかりました・・・
798 :
デフォルトの名無しさん :2005/06/19(日) 22:17:25
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
偉大なるビットシフターであるわたしが答えようか?
800 :
デフォルトの名無しさん :2005/06/19(日) 22:20:16
ビットをずらす必要があるとき 身も蓋もない答え方なのは仕方がない 本当にそういう場合がビシバシ出てくるから
もしかして: 身も蓋もない 20年間間違って覚えてたらしいこの俺様
802 :
デフォルトの名無しさん :2005/06/19(日) 22:25:07
ほんの数年「正しく憶えた」小僧かい?
キャリア≠実力
ちょと質問です。 unsigned char buf[4]; unsigned int n; fread(buf, sizeof(char), sizeof(buf), FP); n = (buf[3]<<24)^(buf[2]<<16)^(buf[1]<<8)^buf[0]; printf("n = %d\n", n); n が符号付になってしまうんですがこういうものなんでしょうか? 符号なし整数になってほしいんですが、ドコがどういけないのかサッパリで・・
%u
>>804 %dは符号付整数の指定。符号なしにするには%u。
807 :
804 :2005/06/19(日) 22:48:07
なるほど、%uってのがあるんですね。 ということは n は内部で符号付きとして扱われているってことでしょうか?
>>807 いいえ、あなたの書いたとおりに解釈します。
809 :
デフォルトの名無しさん :2005/06/19(日) 22:54:01
>>807 いいえ、printfの内部で無理矢理符号付きに解釈されているだけです
ためしにコンパイラに警告オプションをつけてコンパイルしてみなさい
警告されるから
810 :
804 :2005/06/19(日) 22:56:16
>808 安心しました。 みなさんありがとでした。
ただし符号付整数型とそれに対応する符号無整数型、両者どちらでも表現できる値は内部のビットパターンが同じになっていることが規格で保障されている。
812 :
804 :2005/06/19(日) 22:58:15
>809 そういうことでしたか。ガッテンしました。
813 :
デフォルトの名無しさん :2005/06/19(日) 23:44:50
剰余演算子とfmod以外に剰余を求める方法ってないのでしょうか?
div
減算をループして求めるとか。
>>813 m = n != 0 ? hoge - hoge / n * n : 0
とか?
scanf( ) や gets( ) などの関数がありますが、 これは商用に適さないので、商用で適する関数を使え。 と言われたのですが、何を使えばいいですか? 初心者にはわからないです…
>>817 ・scanf()
戦術から練り直す必要があるが、一般的にはfgets()+sscanf()で代用できるだろう。
・gets()
無条件にfgets()に置き換え可能。
819 :
デフォルトの名無しさん :2005/06/20(月) 00:13:52
>>817 s/使え/探せ/
もしくは
s/使え/作れ/
fgets を含むシーケンスをバラで書いているようなセンパイを見かけたら師匠は他を探せ
821 :
デフォルトの名無しさん :2005/06/20(月) 01:15:09
マインスイーパーのスコアってどこに記録されてるんですか?改竄とかできちゃう?
822 :
デフォルトの名無しさん :2005/06/20(月) 01:18:34
板違い ゲイツ板池
823 :
デフォルトの名無しさん :2005/06/20(月) 01:39:14
>>819 > fgets を含むシーケンスをバラで書いている
これの意味がわからないのですが・・・
824 :
デフォルトの名無しさん :2005/06/20(月) 01:42:12
わかんなくていい failed unit は assy ごと交換
825 :
デフォルトの名無しさん :2005/06/20(月) 01:42:49
最長不倒関数ジェネレータ氏ね
826 :
ビル・ジョブス :2005/06/20(月) 17:24:02
>>798 例えば1BPPのビットマップをnドット右へずらしたい時どうしたらいーと思う?
828 :
ビル・ジョブス :2005/06/20(月) 18:02:40
今俺は、「死んだ筈のゴキブリがまだ生きていた」、みたいな感覚に襲われている。
それよりも、くだらんビットマップのコピペに反応するカスが 未だにいたのかと驚いた。
ビットマップのコピペに反応するカスに反応するアホは どうしたもんでしょうか?
ビットマップのコピペに反応するカスに反応するアホに反応するマヌケは どうしたもんでしょうか?
僕はビットマップのコピペに反応するカスに反応するアホに反応するマヌケに反応するチンカスです。
つか、ビットマップ? 彼は特別な病院から退院したばっかりなんで 最近の流行についていけてないんです。
退院なんてできるのか?
お前より症状は軽いだろ
何の?
鎖骨骨折
センスの無い奴だ
三国無双
マクロを詳しく解説してるとこない?
何のマクロ? マクロの作り方? 定義済みマクロ?
マクロをつくるなら、lispにしときなさい、ってemacsのえらい人が言ってたよ
>>842 #ifdefみたいな
#**ってのがどんなのがあるかとか。
これでおれ様便利に暮らしてますとか。
845 :
デフォルトの名無しさん :2005/06/20(月) 20:57:29
マクロねえ 林なんたらとかいう【作家さん】がペタシーベルト級のトンデモ本書いてたが・・・・
>>844 > #ifdefみたいな
#ifdef マクロじゃない。
もう真っ黒
プリプロセスディレクティブのことか。 #idef #ifndef #if #if defined #elif #undef #include #define #error #pragma まとめてかいてあるところは知らないけど、検索すればいくらでも出てくるべ。
肛門裂傷とかじゃね?
850 :
デフォルトの名無しさん :2005/06/20(月) 21:36:41
コンパイラ(できればgcc)とかの標準関数のソースってないんですか?? printfとかmemcmpとかそういうやつです。。
>>851 処理系に付属していることが多い。もちろんgccにも付属している。
尤もgccはコンパイラ自身さえ……。
853 :
851 :2005/06/20(月) 22:00:02
>>852 検索してみたんですけどどのファイルかわからないんですが…
Vine Linuxの3.1が入ってるんですけどどこかにあるんですか??
もしくはネット上にあるとか…>_<;
ダイテル親子の本、全部終わらすのに3年くらいかかりそうだ・・・ 解答ってどっかにないの?
つfind / -name include
ライブラリソースは別にインストールしないとないかもね
>>853 glibc のソースを落として来ればいい。
でも、自分が使っているライブラリのソースが見たいとかじゃないなら、
FreeBSD とか NetBSD のソース見るのがお勧め。GNU は読み辛い。
でも、肛門が切れると治りが遅いんだよ。 基本的に綺麗なところではないからね。
char *a,*b; if(scanf("%s",a)==scanf("%s",b)) が常に真になるのですがなぜでしょうか?
>>859 未定義動作。逝ってよし
ポインタの先に何があるんだよ?
>>860 すいません。確かにそうですね。
ということで宣言を
char a[256],b[256],*pa,*pb;
とし、
・if(scanf("%s",a)==scanf("%s",b))
・if((pa=scanf("%s",a))==((pb=scanf("%s",b)))
・if((scanf("%s",a))==(scanf("%s",b)))
の三つの方法を試しても思ったような結果がえられませんでした。
どこが悪いのか教えてください
862 :
861 :2005/06/21(火) 00:01:06
すいません。 二つ目の方法は ・if((pa=scanf("%s",a))==(pb=scanf("%s",b))) です
scanf()の実行順序がどっちが先かわからない(っつーか処理系依存)だからだ
f() + g() * h() 掛け算は足し算の前に起こるということはわかっているけれど、3つ の関数のうちどの関数が最初に呼ばれるかはわからない。
scanfの戻り値って、成功した変換の個数だが?
>>863 ,864
ありがとうございます。
いろいろ調べて見ます
>>865 if(〜〜〜)
printf("同じ\n");
else
printf("違う\n");
です
868 :
867 :2005/06/21(火) 00:13:47
標準関数使ったらめんどくさそうなのでstrcmp使います。 ありがとうございました。
869 :
デフォルトの名無しさん :2005/06/21(火) 00:15:44
(゚Д゚)
。。。もまえがやりたかったのは入力文字列が一致したかどうかなのか!
strcmpって標準関数じゃないのか。
872 :
867 :2005/06/21(火) 00:17:59
>>871 stdio.h内の関数=標準関数だと思ってましたorz
>>867 結構やってしまいがちな誤りだが・・・
俺はずっと下のやり方が正しいやり方だと思っていたよ
char idt[101];
char *p=idt;
.......
*(p+99)='\n';
*(p+100)='\0';
fputs(p,fout);
??? >873って何がいいたいの?
なんだかばかばっか
scanfの戻り値を比較して文字列が同一かどうか判断することを
> 結構やってしまいがちな誤りだが・・・
と言ってしまう
>>873 ってどうよ?
おまえらこんな下らない低レベルの話にいつまでも 付き合うなよ
878 :
デフォルトの名無しさん :2005/06/21(火) 02:06:02
おまいら全員「こちらへどうぞ」
879 :
デフォルトの名無しさん :2005/06/21(火) 05:06:47
下のような文字列たちをファイルから読み込み、 PIE - St Petersburg/Clearwater : FL : USA St Petersburg/Clearwater Intl 最初のPIEをchar型配列keyに、St以降をdataに格納したいのだけど 下のじゃだめでした。どうすればいいですか? while( fgets( string, STRING_SIZE, fp) ) { sscanf( string, "%s %*s %s", key, data); }
>>879 sscanf(string, "%s - %[^\n]", key, data);
[課題Q]3角形の底辺の長さ,高さをキーボードから読込み,その面積を計算するプログラムを作成しなさい. ただし,底辺の長さ,高さ,面積の値を入れる変数名をそれぞれteihen, takasa,mensekiとし,いずれも実数型(double型)とする. void main( void ) { double teihen, takasa, menseki; printf( "底辺は?\n" ); /* 入力を促すメッセージを表示 */ scanf( "%d", &teihen ); menseki = teihen * takasa / 2; printf("%f\n",menseki); } これ誰か完成させてくれ
え、それくらい頑張りなよ その調子で行けばいけるって
>883 もう大学に課題提出しなきゃいけないんですよ。とりあえず答え教えてください
そりゃ酷いよ だれか教えてあげなよ
誰もわからないんですね こんな糞スレに書き込んだ俺が馬鹿でした
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。 質問する前には最低限検索を。 GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目) ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。 エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
>>888 そう書けば教えてもらえると見ての煽りですね。
薄っぺらい人だ。
891 :
881 :2005/06/21(火) 12:26:07
>888 は俺じゃないんだが
それが何か?
{double teihen,takasa,menseki;printf("底辺?\n");scanf("%lf", &teihen);printf("畳鰯?\n");scanf("%lf",&takasa);menseki=teihen*takasa/2;printf("%lf\n",menseki);}
895 :
881 :2005/06/21(火) 12:34:55
なんかもうこのスレいやになってきた・・・・ とりあえず>893ありがとうございます
>>895 なんだよ、このスレなりに超歓迎されてるし、すごく馴染んでるぞ
また来てね
printf("%lf\n", ↑???
>>895 おーい、向こうにもレス来てるぞ。ちゃんと謝ってこいや。
1000001010001001010111111101100001100011100010110001010 このビット列(文字列型で出力)を6bitごとに(余ったものは切り捨て)区分けしたら 100001 101001 100100 011111 110110 000110 001110 001010 000101 って出力されたんだけど なんで最下位ビットだけおかしいのがあるのかがわからん・・・
char str[] = "hello\n"; int i; ・・・ for(i=0; str[i]!='\0'; i++){ printf("%c☆",str[i]); } で、printf("%c☆",str[i]);の部分をprintf("%s☆",str[i]);にするとエラーを吐いてしまいます。 なぜでしょうか?
型が違うから。
なんか今日、このスレが変だわ! 地震でもくるのかしら
str[i]は文字列の中の一文字を表しているので%sではいけませんの。 岡さん、よくって?
はいっ!お蝶婦人!
でもあれでエラー吐くかな・・?
core dumpedとか。 gccなら、*printfのフィールドの不一致でエラー吐くな。
911 :
851 :2005/06/21(火) 21:51:26
882さん、ありがとうございます^^ ちゃんとブックマークしておきます☆
851は女
他にもいるのにw
906は女
漏れは?
804は女
918 :
904 :2005/06/21(火) 23:03:12
>>905 ,907
わかりました。ありがとうございます
そして下げ忘れた俺氏ね
char *型の変数の後ろにint型の変数をくっつけていきたいんですけど、どうすれば出来ますか? strcatやsprintfでも試したんですけど、強制終了食らって出来ませんでした
921 :
デフォルトの名無しさん :2005/06/21(火) 23:40:22
腐ってもム板にとてつもなく非科学的な奴がいるな
>>920 何をやりたいのかよーわからん
強制終了食らったソース晒すよろし
>>920 はおそらくこうしてると俺のゴーストがささやいている
char* p="Hello";
int i=100;
strcat(p,(char*)&i);
>>920 はどういう結果を期待しているんだろうか?
>>923 でいうと、
文字列が"Hello100"となってほしいのか、
それとも"Hello"の後ろに文字コード100番の文字を一文字足したいのか?
925 :
920 :2005/06/22(水) 00:20:56
>>925 char buf[100] = "Hello";
sprintf(strchr(buf, '\0'), "%d", 100);
>>920 char buf[256];
sprintf( buf, "%s%d", "Hello", 100 );
ちょとまて、
>>920 は 「くっつけていきたい」 っていってるぞ。
>>920 は文字列のメモリへの格納のされ方知らないみたいだし
char buf[100] や [256] で足りるのかw
929 :
デフォルトの名無しさん :2005/06/22(水) 01:26:44
幾つかの処理ごとに関数を用意し、処理を行う関数を読んだら元の位置に戻って コードを実行するプログラムを書いています。 すると、関数が関数を呼び、再帰的に深い呼び出しになってしまうのですが これは良くないでしょうか。 これが良くないとすればどのような方法で回避できるでしょうか。 教えてください。 main(){ test1(); } test1(){ /*何か処理*/ test2(); /*飛ばす*/ } test2(){ /*何か処理*/ test1(); /*戻る*/ }
930 :
デフォルトの名無しさん :2005/06/22(水) 01:28:04
なにがやりたいんだ?
>>930 関数の呼び出しが入れ子になってしまうので、それがまず大丈夫なのか。
大丈夫でないならどのような回避方法があるか、という質問でした。
例えばtest1で画面を出してtest2で実際の処理を行う場合
画面を表示する、処理を行う、と言う組み合わせを交互に何度もやりますよね。
932 :
デフォルトの名無しさん :2005/06/22(水) 01:37:43
>>931 直接的な再帰がちゃんと使えている人にとって
間接的な再帰には特に変わったことはないはず
どうしても悩むようなら直接的な再帰に戻って
ウイークポイントがないかチェックすべし
933 :
デフォルトの名無しさん :2005/06/22(水) 01:38:37
>test1で画面を出してtest2で実際の処理を行う場合 ループしたけりゃループ{ test1() test2() } だな、ふつうは
934 :
デフォルトの名無しさん :2005/06/22(水) 01:41:20
再帰が嫌いとか言いながら SendMessage は平気で使う人とか・・・
935 :
929 :2005/06/22(水) 01:49:02
分かりづらい説明で申し訳ありません。実際に試しました。 void Test1(void){ printf("TEST1:%d", ++count); Test2(); } void Test2(void){ printf("TEST2:%d", ++count); Test1(); } このような形でTest1関数を呼ぶと、数万回でエラーがでますね。 やはり何らかの方法で回避しなければいけないのですが アルゴリズムを書き換えるか、一定回数以上は終了するなどの例外処理を入れてやるしか無いのでしょうか。
本質的に判ってないというか…… ただの馬鹿?
いや、だからふつうは void Test1(void){ printf("TEST1:%d", ++count); } void Test2(void){ printf("TEST2:%d", ++count); } ループ{ Test1(); Test2(); } だってば
>>929 933の方法と君が実現しようとしているやり方の
メリット、デメリットを箇条書きにしてみろ。
>>938 この例だと当然ループに2つ関数を書けば良いですが。
実際には互いにもっと大きな機能を受け持っているので、呼ばれるタイミングなども一定ではありません。
ですのでそもそもそういう書き方は出来ないです。
void Test1(void){ printf("TEST1:%d", ++count); 条件1 Test2(); 条件2 } void Test2(void){ printf("TEST2:%d", ++count); 条件1 Test2(); 条件2 Test1(); }
>>939 再帰の理解が出来てない。書きかえるのが既知。
942 :
941 :2005/06/22(水) 02:01:42
吉
>そもそもそういう書き方は出来ないです。 そもそもそういう書き方はしないです。
944 :
940 :2005/06/22(水) 02:09:47
途中で書き込みしちまった(汗 void Test1(void){ printf("TEST1:%d", ++count); if(hoge) Test2(); } void Test2(void){ printf("TEST2:%d", ++count); if(hoge2) Test1(); } 再帰的呼び出しが必ず hoge == false || hoge1 == false になるよう収束させれば 目指そうとしていることができるんじゃないの
945 :
944 :2005/06/22(水) 02:10:30
hoge2→hoge1
>944 なぜループにしない?
>>929 × test1(); /*戻る*/
○ return(); /*戻る*/
948 :
944 :2005/06/22(水) 02:21:01
>>946 いや敢えて939のルールにのっとって聞いただけ
実は933派だってのは内緒だ(w
ステートマシンみたいなものを作ろうとしてるんだろうか。 state1() state2() : stateN() みたいな関数があって、それぞれを遷移していくんだが、 今は直接的に state1()の中でstate2()とかを呼んでしまっていて、結果的に 無限再帰になっていると。 こういう場合は、たとえばstate1()...stateN()の関数型を 一緒にして、直接それらの中で次状態の関数を呼ぶのではなく、 呼び出し側に次ステートを示すもの(関数ポインタなど)を返し、 ドライバループの中で次の状態に遷移するように書き直せばよい。 こうすると、 StateFunc nextstate = state1; while (nextstate) nextstate(); のように書ける。
(  ̄□ ̄)まぁー 大変ねぇ
>>939 あのな、関数ってのは、通常は呼ばれたら必ずそこへ戻ってくるもんなんだ。
解りやすく言うと、
呼ぶときに、戻ってくるための情報を記憶してるわけよ。
呼びっぱなしで戻ってこないってことは、
戻るための情報がどんどんメモリに溜まっていって、
いずれはオーバーフローする。
関数の中で自分をさらに呼び出す(再帰)こと自体はOKだが、
関数内で再帰しない条件なんかをつけて、
最終的には戻さないとダメ。
>呼ばれるタイミングなども一定ではありません
関数のなかで関数よんだところで、一定にはならんよ。
>もっと大きな機能を受け持っているので・・・
こんな初歩的なところでつまずくようなヤツに、
そんな大きなプログラムを扱わせるのかw
952 :
デフォルトの名無しさん :2005/06/22(水) 08:36:10
3文字の文字列keyからハッシュ関数で整数値に変換したいのですが、 printf文を追加してみると、tが妙な数字になってました。なぜですか。 int hash(char *key, int sz) { unsigned char *t = key; int h; for(h = 0; *t; t++) { printf("%d ", t); h = ( 128 * h + *t ) % sz; } return h; }
煽りじゃなく比較的意味不明
955 :
デフォルトの名無しさん :2005/06/22(水) 09:04:17
ぐはっ 意味不明・・・ 例えばkey = "abc"のとき for文の中でtをインクリメントしたら t = aの整数値 → bの整数値→ cの整数値 になるんかと。
>>952 printf("%p : %c %d 0x%X", t, *t, *t, *t );
957 :
デフォルトの名無しさん :2005/06/22(水) 09:23:40
>>956 サンクス!
・・・じゃなくて問題はfor文の中で一文字ずつ
その整数値を加えて行くことなんです。スマソorz
958 :
956 :2005/06/22(水) 10:14:13
>>956 わかっているが、「0x」の「x」まで大文字になってしまうのが、
個人的に嫌なだけなんだ…。 orz
# まあ、趣味の問題な訳だが。
gcdのプログラムでifの部分は何をやってるんですか?
>>962 ありがとうございます。
あと、この部分はなくても正しい答えがでるっぽいんですけど
なんでですか?
デフォルトのWindows環境でCrypt関数ってついてないんですか?
/usr/lib/crt1.o: In function `_start': /usr/lib/crt1.o(.text+0x78): undefined reference to `main' コンパイルしたら↑のが出たんですけど、どこがおかしいのですか?
>>952 × printf("%d ", t);
○ printf("%d ", *t);
だと思う。
>>963 しらねーよ。
そもそも、どこの部分を言っているのかもわからないし、
Cの質問でもないだろ。
969 :
デフォルトの名無しさん :2005/06/22(水) 12:33:59
#include <stdio.h> #define NMAX 200 int main (void) { int i,n; int tmax=-1; int tmin=-1; double data[NMAX]; for( i = 0 ; i < NMAX ; i++ ){ printf( "%d 番目の点数は?\n", i ); scanf( "%lf", &data[i] ); if(data[i]==-1){ break;} if(tmax < data[i] ){ tmax=data[i];} if(tmin > data[i]){ tmin=data[i]; } } printf("最高点: %d\n",tmax ); printf("最低点: %d\n",tmin ); return(0); } 上記のプログラムは、テストの点数の最高点、最低点を表示するプログラムです。 最低点がきちんと表示されないのですが、どこをどう修正すればいいか教えてください
970 :
969 :2005/06/22(水) 12:35:53
int n,i; × int i; ○
971 :
デフォルトの名無しさん :2005/06/22(水) 12:37:24
初期値がすでにありえない最低点。
972 :
デフォルトの名無しさん :2005/06/22(水) 12:41:35
main関数のreturn は整数とある本にあります。別の本では正常に終了する場合はreturn 0 のように0と書いてあります。どちらが正しいのでしょうか。ここらへのことがよくわかりません。
973 :
969 :2005/06/22(水) 12:45:43
974 :
969 :2005/06/22(水) 12:51:06
あ、初期値をdata[0]にすればできました。 ありがとうございました。
>>969 入力は浮動小数点数なのに、
最大・最小は汎用整数とはこれ如何に?
とりあえず、「-3」とか入力してみろ。(w
>>939 まっとうな末尾再帰をサポートしている言語を使うことをおすすめします
#include <windows.h> #include <stdio.h> char *tp; const char* CutItemName(const char* ItemName) { char Arg[64]; lstrcpy(Arg,ItemName); tp = strtok(Arg,"#"); printf("tp = %s / pAddr = %d \n",tp,tp); tp = strtok( NULL,"#" ); printf("tp = %s / pAddr = %d \n",tp,tp); return tp; } void main() { printf("CutItemName = %s / %s /\n pAddr = %d / %d \n",CutItemName("78#なは"),CutItemName("12#とぅえるぶ"),CutItemName("11#ワンワン"),CutItemName("37#サンナナ")); printf("\t tpは = %s / Addr = %d \n",tp,tp); } #以降の文字を表示したいのですが、main内のprintfではアドレス値だけ表示されて、文字が表示されません CutItemName()内では確認できるのですが、何がおかしいのでしょうか・・アドバイスお願いします
>>977 関数を抜けた時点で
>char Arg[64];
こいつが破棄されるからじゃね?
>>977 Arg[64]のメモリ領域は、ポインタ経由でもCutItemName()の外で参照してはいけない。
980 :
977 :2005/06/22(水) 15:26:03
わ、ホントだ・・ アドレスだけ返すから文字列はどうでもいいと踏んでいたのが間違いだったようです。 978サンありがとうございましたー
あれなら static char Arg[64]; にしたらええ
(`・ω・´)ゞ すたてぃっくします! 978、979、981氏 ありがとう御座いましたー
staticにしても、CutItemName()を呼ぶたびに中身を書き換えられちゃうから、ダメよ。
984 :
972 :2005/06/22(水) 16:15:51
質問に誰も答えてくれない。誰か答えて・・・。
>>984 両方あってるのがわからないの?
とりあえず「1冊を」「理解するまで」
>>984 main() の戻り値の型を int にして、
return 0; 等の様に int 型の値を返していれば間違いない。
とりあえず、そう書いておけ。
だってパパあの子言っている事が変なんだもの お話をきちんと聞いてくれるかすらあやしいわ