1 :
デフォルトの名無しさん :
05/03/18 12:38:14
2 :
デフォルトの名無しさん :05/03/18 12:38:40
修正は次スレ移行お願いします
ねずみ,うし,とら という文字列を ねずみ うし とら の3つに分割するにはどうすればいいですか?
CSV 宿題っぽ
>>6 strtok を使う。但し、日本語文字列が入っている場合は誤分割する可能性もあるので注意。
>>7 ,8
説明が下手なので、自分なりに分かりやすく書いたら
宿題っぽくなってしまいました・・・すみません
ありがとうございました
>>12 私の環境では出来ませんでした。
【ソースプログラム】
/* separatebycomma.c */
#include <stdio.h>
int main(int argc, char** argv)
{
char* str = "ねずみ,うし,とら";
char s[3][7];
int i;
sscanf(str, "%s,%s,%s", s[0], s[1], s[2]);
for (i=0; i<3; i++)
printf("%s\n", s[i]);
return 0;
}
【実行結果】
>separatebycomma
ねずみ,うし,とら
うし,とら
ら
>
こんなでできた、けど、実装依存? #include <stdio.h> char s1[7], s2[5], s3[5]; /* '\0'が入らないのでここ */ main() { sscanf("ねずみ,うし,とら", "%6c,%4c,%4c", s1, s2, s3); printf("[%s|%s|%s]\n", s1, s2, s3); }
>>14 うし,ねずみ,とら に変更するにはソースを書き直さないといけないのか
汎用性のかけらも無いソースだ
>>13 sscanf(str, "%[^,],%[^,],%[^,]", s[0], s[1], s[2]);
>>14 仮名一文字が2バイトとは限らない。
>>16 実行結果は変わりませんでした。
全角文字の入った文字列に ','(コンマ)に該当する文字コードが含まれているか、
そうでなければ sscanf で文字列を区切り文字で分割すること自体が出来ないのでは?
後で Linux 環境でも試してみます。
strtok を使って、
#include <stdio.h>
#include <string.h>
/* 中略 */
char* str = "ねずみ,うし,とら";
char* ptr;
・・・・・・
ptr = strtok(str, ",");
while (ptr) {
printf("%s\n", ptr);
ptr = strtok(NULL, ",");
}
/* 以下略 */
とすれば問題なく出来ます。
Win2000 Borland C++ 5.5.1 普通に出たが。
しかし、なんでこんな初心者向けネタ引き摺ってるんだ?
>>17 >全角文字の入った文字列に ','(コンマ)に該当する文字コードが含まれているか
確認してから書け。
>sscanf で文字列を区切り文字で分割すること自体が出来ないのでは?
憶測を書くな。
>実行結果は変わりませんでした。
試したソースを貼ってみろ。
>>19 Please Use your head and skill , Show me your nice code.
もう出てると思うが・・・ あふれるからniceとは言わないけど。
22 :
415 :05/03/18 22:15:29
>>19 >>全角文字の入った文字列に ','(コンマ)に該当する文字コードが含まれているか
>確認してから書け。
確認したところ、少なくとも SJIS では「ねずみ」「うし」「とら」のいずれにもコンマに該当するコードがないことを確認しました。
>>sscanf で文字列を区切り文字で分割すること自体が出来ないのでは?
>憶測を書くな。
現に私の環境では出来なかったので、少なくとも C の標準的な仕様(ANSI等)では保証されていないことだけは確かです。
そうでなければ、私の持っている C コンパイラに欠陥(仕様に違反しているなど)があるのでしょう。
>>実行結果は変わりませんでした。
>試したソースを貼ってみろ。
すみません、コンマとピリオドを間違えていたので今訂正して再びコンパイル・実行しました。
(長くて1レスに入りきらなかったので、ソースコードと実行結果は次レスに書きます)
23 :
415 :05/03/18 22:19:21
続きです。 【ソースコード(separatebycomma2.c)】 #include <stdio.h> int main(int argc, char** argv) { char* str = "ねずみ,うし,とら"; char s[3][7]; int i; sscanf(str, "%[^,]%[^,]%[^,]", s[0], s[1], s[2]); for (i=0; i<3; i++) printf("%s\n", s[i]); return 0; } 【実行結果】 >separatebycomma2 ねずみ > 【以上】 実行結果は変わりましたが、期待通りの実行結果にはなりませんでした。 よって、C言語の仕様上 sscanf を使った文字列分割は保証されていないと言えます。 後で Linux 環境でも試してみますが、おそらく正常に実行されないでしょう。
sscanf(str, "%[^,],%[^,],%[^,]", s[0], s[1], s[2]); 糸冬了
人の意見も聞かず自分だけの世界に閉じこもって 仕様仕様って……
27 :
415 :05/03/18 22:51:47
>>24 どこがおかしいんですか?
>>25 少なくとも文法上は間違っていないはずです(コンパイラを通ったので)。
問題があるとすれば
s[0] -> &(s[0][0])
とかだと思いますが、この場合 s[0] と &(s[0][0]) は同じもの(アドレス)を指します。
>>26 人の意見をちゃんと聞いて、それに忠実に従ってプログラムを書いてコンパイル・実行した結果が
おかしいのですが・・・
もし私が人の意見を聞いていないというならば、具体的にどの意見を聞いていないかを
教えていただけますか?
もしどなたかの意見を聞いていなかったり何らかの間違いがあれば素直に認めます。
自分の正当性を意地でも主張するつもりはありません。
ただ、私の環境で
>>16 さんのコードなどを実行した結果正常に動作しなかったという事実を伝え、
その原因が
・
>>16 さんのコードが標準的なC言語の仕様で期待通りの動作が保証されていない(たとえ多くの場合問題がないとしても)
・当方の環境に問題がある(インストールしたCコンパイラ(フリー)のバグなど)
のいずれかであると考えている、と言っているだけです。
>>27 一 字 一 句 間 違 え ず に 打 て ! !
(・∀・)ニヤニヤ
31 :
デフォルトの名無しさん :05/03/18 23:04:13
printf("%p\n", (void *)0); これって仕様としては何が出力されるのが正しいのですか?
32 :
デフォルトの名無しさん :05/03/18 23:05:57
>>27 はわざと間違えて釣りを楽しんでるんだろ
暇なこった
>>29 すみません、sscanf の第2引数の文字列を写し間違えました。
コンマが多くて見づらかったので、つい間違えてしまいました。
コピペして再び試してみたら、正常に実行されました。
(自分で設定したフォントの環境で)見づらいプログラムをコピペしないで書き写してしまったのが
ミスの原因でした。すみません、お騒がせしましたm(_ _)m
>>31 %pの出力形式は処理系定義。「正しい出力」はコンパイラによって違う。
(出力するのが[ナ|ヌ]ルポインタかどうかには関係ない。)
>>31 0 だと思いますが・・・
当方の環境では「00000000」と表示されました。
ヌルポインタは、それを指しているポインタ変数に値を入力しない限り、
ただの 0 です。
FILE* fp;
if ((fp = fopen("something.txt", "rt")) == NULL) {
/* エラーメッセージを表示 */
exit(0);
}
とかで、fopen に失敗したら fp に NULL(= 0) が代入されることを考えれば、
ヌルポインタ の値(この場合は fp )は 0 で、それを指すもの(この場合は *fp )は存在しない、
という解釈でいいと思われます。
>>32 釣りではありません。(目が悪いから)小さな記号を見落として、それに気づかなかったんです。
36 :
デフォルトの名無しさん :05/03/18 23:38:16
>>27 が釣りでないのは信用しても良いが、
>>35 はどう見ても釣りにしか見えん。
あんま関係ないが、自分がよく使う環境の printf() は printf("%s", 0); とすると「(null)」なんて結果になるな。
>>37 試しにフォントを「MS Pゴシック 9pt」にして
>>16 の前半を読んでみて下さい。
どれだけ見づらいかが分かりますから。
40 :
デフォルトの名無しさん :05/03/19 00:31:31
言い訳スンナボケ
41 :
デフォルトの名無しさん :05/03/19 00:32:43
コンマではなくカンマだ ぼけ
0.01 レイコンマレイイチ(水泳とかで)
43 :
デフォルトの名無しさん :05/03/19 00:47:48
さかさまからよんでみろ!
自分のミスを正当化したいだけだろ
46 :
デフォルトの名無しさん :05/03/19 01:01:23
もう、コンマじゃなくてマンコって呼べばいいじゃん。
47 :
デフォルトの名無しさん :05/03/19 01:02:10
comma==カンマ null==ナル だ、それぐらい おぼとけ ぼけ
48 :
デフォルトの名無しさん :05/03/19 01:02:38
> NULL の正しい読みを「ナル」だと思っている人が多いけど実はドイツ語だから「ヌル」 いいえドイツ語じゃないです。
やっと帰れた。
>>39 自分が如何にプログラミングに向いていないか理解できたかね。
50 :
デフォルトの名無しさん :05/03/19 01:04:21
英語のnullは、フランス語もしくはラテン語のnullusが語源。 だから「ナル」が正解。ドイツ語はそれからの派生。 voidはフランス語が語源。
ウソをウソと・・・・
いい加減見苦しい。
53 :
デフォルトの名無しさん :05/03/19 01:40:44
おまえがな
>>45 ミスについては私が悪かった、その原因は文字が小さくて読みづらかったから、と言っているだけです。
「釣りではない」というのが「自分を正当化している」と解釈される方が不思議です。
>>47 >comma==カンマ
これは間違っていません。でも、「コンマ」も間違っていません。
>null==ナル
それは英語の発音です。書店で独和辞典を立ち読みして null を調べれば載っていますし、
発音が「ヌル」だと分かるはずです。ドイツ語は基本的にローマ字風に発音するので。
ドイツ語の null(ゼロの意味) → 英語圏に伝わって「ナル」と読まれる → 日本に伝わって、null は英語由来だと思われる
だから、null==ヌル が本当で、null==ナル は本来の読み方ではありません。
>>48 ドイツ語の授業で習ったので間違いありません。null は「ヌル」と発音し、意味は「0(ゼロ)」です。
>>49 プログラミングのスキルと視力は別問題です。
>>50 >英語のnullは、フランス語もしくはラテン語のnullusが語源。
>だから「ナル」が正解。ドイツ語はそれからの派生。
それは知りませんでした。調べてみます。
>voidはフランス語が語源。
それはうろ覚えですが聞いたことがあります。
ソースに書かれている意味を理解しようともせず、視力のせいか。 スキルも無いし、見苦しい。
56 :
デフォルトの名無しさん :05/03/19 01:48:59
> でも、「コンマ」も間違っていません。 いいえ。カンマです
57 :
デフォルトの名無しさん :05/03/19 01:49:49
> ドイツ語の null(ゼロの意味) → 英語圏に伝わって こういうデマを平気でいうのが ぼけ フランス語や英語が先。 ドイツ語があと
>>54 漢字コードについて、調べもしないで憶測で書く。
調べるとなったらコード全体について調べずに該当文字のみを調べる。
コードについて、コピペせずに自分で入力する。
巧く動かないとなったらコピペも試さず他人の指摘を間違いと思い込む。
挙句自説に拘泥する。
枚挙に暇がないが、どれもこれもプログラマ(というよりはモノ作り全般)に向かない資質だと思うがね。
59 :
デフォルトの名無しさん :05/03/19 01:53:34
> 向かない資質 こいつぼけ。向くのは「資質」だか、 向かないのは資質とは よばん。 おまえぼけすぎ
60 :
デフォルトの名無しさん :05/03/19 01:54:11
こんまつけだく
>向くのは「資質」だか ?
#include <stdio.h> #include <string.h> #include <stdlib.h> void hoge(char* str, char *foo[]); int main() { char foo[2][8]; char str[256] = "123,abc"; hoge(str, (char**)foo); printf("%s:%s\n", foo[0], foo[1]); return 0; } void hoge(char *str, char *foo[]) { char* temp; temp = strtok(str, ","); puts(temp); strcpy(foo[0], temp); temp = strtok(NULL, ","); puts(temp); strcpy(foo[1], temp); } writtenになることができないとエラーが出ます どうにかしてください
>>62 どうにもする気にはならんが、fooの関数への渡し方が間違い。
void hoge(char* str, char **foo); void hoge(char* str, char ***foo); どっち?
>>55 視力のせいにして自分を正当化してなんかいません。
見慣れないコードだったから読み間違えてしまったのです。
それに、私が悪かったと認めました。
言い訳ではなく、ミスしてしまった原因を書いただけです。
コピペすればミスを防げたのに、それをしなかった私に落ち度があることは認めました。
どうしてそこまで「言い訳」にこだわるのですか?
>>56 カンマも正しいですが、コンマも間違いではありません。
その証拠として、excite へのリンクを貼りました。
発音記号が読めればコンマも正しいことが分かるはずです。
>>57 >フランス語や英語が先。
フランス語はともかく、英語が先だとは思えません。
アメリカが出来たのは 1776 年で、ドイツはそれより以前から存在します。
英語が世界に広まったのは、アメリカが力を持つようになったからではないですか?
>>58 >漢字コードについて、調べもしないで憶測で書く。
漢字コードには主にJIS,SJIS,EUCの3種類が存在することや、それぞれの特徴も知っています。
コード変換のプログラムも作ったことがあります。
調べなかったのは、問題が発生する可能性が低く、あえて調べる必要がないと判断したからです。
>調べるとなったらコード全体について調べずに該当文字のみを調べる。
この問題については該当文字を調べれば必要十分だからです。
>コードについて、コピペせずに自分で入力する。
それは私の落ち度でした。
>>65 あなたは人を不快にする才能があるな
自分の書き込みを読みかえせ
ついでに、煽り耐性が低いことや言い訳がましいこともプログラマ向きじゃないね。 つーか、2ch向きじゃないというべきか。 >釣りではありません。(目が悪いから)小さな記号を見落として、それに気づかなかったんです。 >視力のせいにして自分を正当化してなんかいません。 何をかいわんや。
>>58 >巧く動かないとなったらコピペも試さず他人の指摘を間違いと思い込む。
指摘の意図が分からなかったからです。
>挙句自説に拘泥する。
確かにその傾向はあると自覚しています。それは私の悪い癖の一つですが、
高校の頃に数学の授業や問題集の解答に誤りが多く、それをよく指摘していたことがあったので、
その頃の癖を未だに引きずってしまっているのが原因だと思います。
でも、自分が間違っていることが納得できれば素直に認めます。
>枚挙に暇がないが、どれもこれもプログラマ(というよりはモノ作り全般)に向かない資質だと思うがね。
向かないも何も、現にプログラマをやっていますが。
うわー、頼むから漏れと同じプロジェクトで仕事しないでね。
他人の間違いを指摘する前に、自分に間違いがないか検証する習慣がなくてよく社会に適合でき・・・てないのか(プ
>>66 攻撃的なレスが多いからです。
>>67 >ついでに、煽り耐性が低いことや言い訳がましいこともプログラマ向きじゃないね。
現職のプログラマにプログラマ向きじゃないと言うのはおかしいと思いますが。
プログラマ向きじゃないのに、どうしてプログラマになれたんでしょうかね。
>つーか、2ch向きじゃないというべきか。
2chで煽りや荒らしがよくあるのは知っています。
煽りだと判断したレスは無視しています。
それとも、あなたも煽りですか?
雉も鳴かずば撃たれまいに・・・
犬も歩まざれば棒に当たるまいに・・・
>>69 ご心配なく。(おそらく)会社が違うから同じプロジェクトを担当することはまずないでしょう。
>>70 あなたに言われる筋合いはありません。
>>71 多くの場合、自説に間違いが無いかどうか十分に検証しています。
自説を検証して間違いが無いと判断し、かつ相手に誤りがあると確信したときに
初めて相手の誤りを指摘します。
それに、現に社会に適合しているから会社で何の問題も無く働いているのですが。
おー面白い奴が来ているからage
なんだ。終わったのかよ。 やだねえ、自尊心のかたまりは。
丸い卵も切りようで四角 ものも言いようで角が立つ
「自分は間違っていない」 「自分が間違えたのは○○のせいで、仕方がない。嘘だと思うなら試してみろ」 「自分は社会に適合している。周りに煙たがられてなどいない」
くそうぜーな、長文レスなんとかしてけろ・・・
>>31 >>35 >>38 C99の規格書はもってないので、
kandrから関係ありそうなところをしらべてみた。
APPENDIX A7.10
Equality operators
...
a pointer may be compared
to a constant integral expression with value 0, or
to a pointer to void.
APPENDIX A6.6
Pointers and Integers
...
An integral constant expression with value 0,
or such an expression cast to type void *,
may be converted,
by a cast, by assignment, or by comparision,
to a pointer of any type. This produces a null pointer...
APPENDIX A7.3.2 Function Calls
...
The order of evaluation of arguments is unspecified;
...
However, the arguments and function designator
are completely evaluated,
including all side effects,
before the function is entered.
あと、APPENDIX A7.17代入式, APPENDIX B 表B-1 Printf変換あたり。
NULL がオールゼロビットとは限らないなんて事 プロならみんな知ってるだろ
ですなぁ。
>>82 ANSI とかの規格では NULL をゼロと定めていないかもしれないけど、
世界の C コンパイラの99%は stdio.h とかで
#define NULL 0
と定義されているはず。
もし NULL != 0 というCコンパイラが実在したらソースよろ。
85 :
デフォルトの名無しさん :05/03/19 11:46:10
煽り耐性がないのはお前らもだろ。 自説に固執するのは、お前らもだろ。 なんて見苦しいスレだ。
コンピュータ内部表現のヌルポインタは0とは限らない しかしC言語でのNULLは0(または(void*)0)であり 処理系に応じたヌルポインタにしてくれる
いつまでもぬるぽなことやってんじゃないよ〜
92 :
デフォルトの名無しさん :05/03/19 14:33:22
配列a[ ]とb[ ]の値を交換するのに #include <stdio.h> #include <math.h> int main (void) { int a[100],b[100]; int *p=a,*q=b,*r; int i,j; for (i=0 ;i<=99 ; i++){ a[i]=i+1; b[i]=100-i; printf("a[%d]=%d,b[%d]=%d\n",i,a[i],i,b[i]); } a=q; b=p; for (i=0 ;i<=99 ; i++){ printf("a[%d]=%d,b[%d]=%d\n",i,a[i],i,b[i]); } } ではなぜ駄目なのでしょうか?
>>92 「中身の交換」という言葉のとおりに書いて味噌。
君は中身ではなく、入れ物だけ入れ替えて誤魔化そうとしている。
94 :
デフォルトの名無しさん :05/03/19 14:39:35
自分の胸に聞いてみろ。
95 :
デフォルトの名無しさん :05/03/19 14:45:08
> コンピュータ内部表現のヌルポインタは0とは限らない ナルだろ ぼけ
96 :
デフォルトの名無しさん :05/03/19 14:47:30
> ANSI とかの規格では NULL をゼロと定めていないかもしれないけど、 > 世界の C コンパイラの99%は stdio.h とかで > #define NULL 0 > と定義されているはず。 こいつおおぼけ。Kusakabe先生が「NULLが0なんじゃなくて0がNULLなんです」と 教えている通り、NULLのビットパターンは0じゃなくても、 ポインターに代入したり比較したりする文脈に書かれる「0」はNULLの意味になるという Cの基本的性質から、NULLのビットパターンに変換されるんだよ ぼけ だからNULLがたとえばFFFFというビットパターンのマシンでも、 定義は#define NULL 0 でいいんだよ ぼけ
97 :
デフォルトの名無しさん :05/03/19 14:49:24
> >フランス語や英語が先。 > フランス語はともかく、英語が先だとは思えません。 > アメリカが出来たのは 1776 年で、ドイツはそれより以前から存在します。 はあ? こいつはぼけ。英語はアメリカでできたんだと思ってるらしい。
98 :
デフォルトの名無しさん :05/03/19 14:50:59
> 漢字コードには主にJIS,SJIS,EUCの3種類が存在することや、それぞれの特徴も知っています。 ぼけ、主流はEUC-JP、ISO-2022-JP、UTF-8の3つだよぼけ。ShiftJISなんてのは主流ではない。
>>97 君は知識が有るねぇ。尊敬するよ。ここまで凄いと、僕・・・ハァハァ
またageぼけ厨が出たか
101 :
デフォルトの名無しさん :05/03/19 14:53:09
>>92 そんなことが可能だったら配列のメモリ開放はどうやるんだ?
102 :
デフォルトの名無しさん :05/03/19 14:55:36
> 開放は ぼけ
104 :
デフォルトの名無しさん :05/03/19 15:19:55
いや おまえがいちばんぼけ
102 :デフォルトの名無しさん :05/03/19 14:55:36 > 開放は ぼけ かならず出てくるね( ´_ゝ`)
iya- meiThreaddane
日下部いい加減にしろ(苦笑)
ーーまとめーー NULLは おそらくどこかのヘッダで定義されている怪しい定数で、 プリプロセッサがたいてい0か(void *)0に展開して、 その定数が、代入や初期化の式の 真中の代入演算子 = からみて 右側のオペランドの位置にあり、そのとき、 左側のオペランドが、都合よくポインタであると、 その式の評価の結果、ポインタの値にぬるぽが入って、 そのぬるぽがどんな表現なのかは、実装依存。
ごめん、条件反射
Λ_Λ \\
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >_Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>108
110 :
デフォルトの名無しさん :05/03/19 16:09:24
> その式の評価の結果、ポインタの値にぬるぽが入って、 ナルだろ ぼけ
111 :
デフォルトの名無しさん :05/03/19 16:10:50
> 日下部いい加減にしろ こわいものはぜんぶKusakabeにみえてしまう症候群 ;-)
NULLの話がでてきたのでちょっと質問。 これって誰が正しいの? 896 名前:風の谷の名無しさん@実況は実況板で[sage] 投稿日:05/03/19 00:19:48 ID:Jg/N2N2N NULLって0でもなく1でもなく、何も無い状態なんだがなぁ 897 名前:桃色頭脳 ◆C5EKtMD8/k [] 投稿日:05/03/19 00:26:11 ID:8D6ZP6Xt 何も無いじゃないんだな、これが 決まってない、なんだな 898 名前:風の谷の名無しさん@実況は実況板で[sage] 投稿日:05/03/19 00:26:23 ID:ZRcR+c9F >896 自分解釈乙。 英和辞書引け。
113 :
デフォルトの名無しさん :05/03/19 16:11:52
↑こわがりすぎー ってやつですね
114 :
デフォルトの名無しさん :05/03/19 16:12:24
> NULLの話がでてきたのでちょっと質問。 > これって誰が正しいの? わたしが正しい。
115 :
デフォルトの名無しさん :05/03/19 16:13:22
わたしが正論です。 --スリランカ首相ウィクラマシンハ
教えてくれない。・゚・(ノД`)・゚・。
117 :
デフォルトの名無しさん :05/03/19 16:16:36
わたしが正義です!! --ソフトバンク社長 孫
そんなの、想定の範囲内でしょう、どこがおかしいの?
119 :
デフォルトの名無しさん :05/03/19 16:24:55
> NULLって0でもなく1でもなく、何も無い状態なんだがなぁ ぼけ。NULLが0なんじゃなくて、0がNULLなんだよ ぼけめ
>>112 C言語の話をしているのなら3人とも間違ってる。
哲学的意味を語っているなら3人とも正しい。
英単語の辞書的意味が知りたいなら898の言うとおり。
堀江先生の言う事には、ルールに書いてなければどれでも正しいんじゃないの?
このスレはC言語スレです。 C++と混同してる馬鹿はお帰り下さい。
要は可読性の問題らしいよ。;)
124 :
デフォルトの名無しさん :05/03/19 16:31:06
> C言語の話をしているのなら3人とも間違ってる。 いや。わたしが規格的に正しい。 あとはまちがい
春なのか。
NULLって恐い…ぽ NULLは便利だけど、恐い…ぽ NULLつかうと実行時に型が違ったりして…ぽ NULL…ぽ
明示的なポインタって要らないね。
ポインタは要らないが、アドレスは必要。
ANSI準拠 ポータブル...なのか? ??=include<stdio.h> main() ??< char test??(??) = "a-tesutesu"; puts(test); ??> $ gcc -Wall -ansi test.c -o test test.c:1:1: 警告: トライグラフ ??= は # に変換されました test.c:3:1: 警告: トライグラフ ??< は { に変換されました test.c:3: 警告: return type defaults to 'int' test.c:4:11: 警告: トライグラフ ??( は [ に変換されました test.c:4:12: 警告: トライグラフ ??) は ] に変換されました test.c:6:1: 警告: トライグラフ ??> は } に変換されました test.c: In function 'main': test.c:6: 警告: control reaches end of non-void function
?
133 :
デフォルトの名無しさん :05/03/19 21:33:33
ださ... > -ansi
134 :
デフォルトの名無しさん :05/03/19 21:34:32
常識的に alias cc gcc -Wall -std=c99 -O3 だ。
135 :
デフォルトの名無しさん :05/03/19 21:35:25
> 明示的なポインタって要らないね。 そういう日本語はない > 明示的 英和辞典用語だ。
137 :
デフォルトの名無しさん :05/03/19 21:43:03
#も{もちゃんとあるlocaleで??=や??<をつかえばgccはウォーニング出すよ。 そんなのあたりまえじゃん。 おまえ馬鹿か?
そもそも辞書に載ってる、載ってないじゃないしな アホらし
では、日本語かどうかってどうやって判断しているの?
140 :
デフォルトの名無しさん :05/03/19 21:46:33
> そもそも辞書に載ってる、載ってないじゃないしな はあ? おまえぼけか。辞書には載ってるんだよ。だから「英和辞典用語」だろうが ぼけ あたまわるいなーこいつ
>>138 辞書に載っていない日本語もあれば、載っていない日本語もある、ということ?
× 載っていない日本語もあれば、 ○ 載っている日本語もあれば、
どっちみち載ってないのか。
誰にでもかぶりつくから恥かくんだよ、くそじじい
gccは知らないな。 俺は昔からVisualStudio なんで
ageぼけ厨イタ杉w
150 :
デフォルトの名無しさん :05/03/19 22:03:40
ボケ同士結構なことで
>>126 ネタか?一応マジレスするぞ
>NULLって恐い…ぽ
>NULLは便利だけど、恐い…ぽ
だったら0を使え
>NULLつかうと実行時に型が違ったりして…ぽ
実行時には型も何もないと思うぞ
コンパイル時の間違いか?
だとしても可変数引数の関数にNULLを渡すときぐらいにしか
NULLの型は問題にならんぞ
>NULL…ぽ
カ(r
153 :
デフォルトの名無しさん :05/03/19 22:19:09
> だとしても可変数引数の関数にNULLを渡すときぐらいにしか ぼけ。プロトタイプなしのときもだよ
>>152 インスタンスって何だ?
NULLの話だぞ
そもそもC言語か?
>>153 @ageぼけ厨
補足どうも
0だと通常の数値代入に思われるから、 NULLとわかりやすく明示するに決まってる。
ただの数値代入じゃん。
>決まってる。 こういう断定的な表現すると論争の元になるぞ 0っていう表記は整数の0と(C言語で)NULLを表す0だけじゃない 他の意味になる場合だってある とにかく0(とだけ書いた場合)は特殊なんだと C言語を使うものなら覚えておいた方がいいと思う 個人的にNULLを使わず0を使っているソースをみると こいつ分かってるなって思う (もちろん逆にも取れるけどw)
いや、ポインタが無効領域である、何も指してないという意味合いをわかりやすくするためにNULLと書いたほうがいいと思う。 ただ、0でも構わん。 これは見た目の美学に関わることだろ。 少しでも美しいソースを記述したいのはどのPGもそうだろうし。
>>158 そうだね
俺も自分でコーディングするときはNULLって書くよ
宿題スレだったらタイプめんどいから0にするかもw
NULLがintの0だと思って使っているのはCプログラマぐらいのものだね。
int c; for(c=NULL;c<256;c++){ }
他のMLとかLispとかetcの言語触った事あるんやろか…
その言語に応じたコーディングをすればええやん C言語はNULLとしたほうがええやん ぷれいやん
>>162 cppll ML読んでC++の勉強してますが何か?
Lispとかetcの言語っていうのは知らない
165 :
デフォルトの名無しさん :05/03/19 22:57:12
すみません、無効ポインタを記述するためにNULLの代わりに 0と書いた場合の利点がこれまでのカキコを読んでもよく わからないのですが、どなたかわかりやすい解説をして いただけないでしょうか。
>>164 ごめん、誤解されたかも。。ML=The Meta Language
>>165 見た目の問題
どっちが美しいって思うかは感性による
>>165 型付けがあいまいなC言語では人間が見て区別しないといけないから、NULLも同様に0と区別して
使わなければならない。
>>168 ログ読んでる?
NULLって書いても0って書いてもC言語では同じ
区別はない。よって人間が区別する必要はない
処理系が処理系に応じたヌルポインタにしてくれるの!!
>型付けがあいまいな
void * あたりではそう思う
C++では改善されてるけど
DWORDとかLPCTSTRとかを使うより、unsigned intやwchar_tを使ったほうが美しいと思う。
>>165 規格で関数へのポインタ型←→オブジェクトへのポインタ型(含void *)はキャスト演算子を使っても出来ない事になっている。
だからNULLが(void *)0となっているヘッダを使ったときに関数へのポインタへNULLを代入するとエラーになったり警告が出たりかもしれない。
>>170 同じものを指すのに別のラベルが付けられている言葉ってあるよね。
ほら、たとえば、
かたつむり でんでんむし まいまい
でも、これらって微妙に意味が違うんだよねー
>>171 DWORDとかLPCTSTR
これってVC特有のものなんじゃない?
なんでこんなもの定義してあるんだろう…移植性低いなぁ
>>172 このスレで勉強なったの2回目だ
あんたネ申だよ
177 :
デフォルトの名無しさん :05/03/19 23:33:09
WIN32プログラミング>>>>>>>>>その他マイナープログラミング
>>174 64Bitに移行しかけてるんだからマクロ使った方が移植性は上だ。
179 :
デフォルトの名無しさん :05/03/19 23:49:46
パケットモニタ作りたいんだけど、送信パケットってどうやって キャプチャするんですか? 使用OSはlinuxです
普通Cって言ったらUNIX系がメッカなんだが。
>>165 NULLが定義されていなくても使える。
>>183 このスレで勉強なったの3回目だ
あんたネ申だよ
>>183 自分で追加してくれ。
ポインタに0代入は気持ち悪くて出来ないな。
>>186 その場しのぎで勝手にdefineされる方が気持ち悪いが。
188 :
デフォルトの名無しさん :05/03/20 00:07:45
>>172 すると、たとえば構造体のメンバにコールバック関数が
あったとして、それを無効ポインタに初期化するときは
0を代入すべき?
struct foo {
int (*callback)(int arg);
};
foo.callback = 0;
>>186 ポインタは値だから0以前に何も代入で金
>>187 そこに突っ込むなよ…。
NULLが定義されてない事自体が変だろ。
独学してるんですが、コールバック関数というものがよくわかりません。 web検索しても、呼ばれる関数(つまりコールバック関数なんですが)の説明は WinAPI関連で出て来るのですが、呼び出す側の説明はあまりなく、よく理解できません。 想像の出来る範囲で書いたのが下記ですが、これってコールバック関数使ってることに なりますか? #include <stdio.h> void called(void) { printf("I am called\n"); } void call(void (*cald)(void)) { cald(); } int main(void) { call(called); return 0; }
NULLって標準で定義されていて当り前なんじゃないの???
>>193 それは単に関数のポインタを渡したに過ぎない。
コールバック関数そのものというよりも、イベントドリブンの考え方を理解している?
>>194 定義されている部分をincludeで取り込んだらね。
バリアント型追加きぼん
198 :
デフォルトの名無しさん :05/03/20 00:27:38
>>196 コンパイラが最初から定義しているという実装は反則?
>>193 大抵の場合、呼び出す側のことは考えなくてもいい。
>>195 GUIなら、マウスが押されたら、とかそういうやつですよね?
イベントドリブンという概念はわかっていると思いますが、
なぜイベントドリブンでコールバック関数なのか、というあたりが
理解できていないのかも知れません。
実際、GTK+のチュートリアルを見ていてコールバックに出会ったんです。
定義されている側を調べようとしたんですが、僕のレベルでは良くわからなかったんです。
201 :
デフォルトの名無しさん :05/03/20 01:01:43
>>193 それじゃ一般の「コールバック関数」にはならない。
というか、そういうふうにプログラムを数行書いて説明できるような
ことじゃない。
「コールバック関数」は「○○したときに××しろ」みたいな
プログラムを書くために用意されてるけど、OSに依存する概念だから、
まだANSI-Cをマスターしてないなら知らなくていい。
マスターしてるなら、WindowsAPIの勉強をすれば自然と出てくる。
202 :
デフォルトの名無しさん :05/03/20 01:03:16
コールバック関数は単に関数のポインタを渡してるにすぎないでしょ。 ウィンドウプロシージャもコールバック関数だし。 あるウィンドウのイベント処理を受け持つのがウィンドウプロシージャ。 ウィンドウを作る前に、ウィンドウクラスを作成して登録するだろ。 そのとき、イベント処理を行う関数を登録(その関数のポインタを渡す)
NULLの代わりに0を代入って、構造体の初期化でオール0にしたりする場合に有効なんじゃ無いの?
204 :
デフォルトの名無しさん :05/03/20 01:13:55
NULLは視覚上の問題でしょ。 あくまで0でも構わん。
亀レスで悪いが、strtokで良くないか? 漏れは正規表現厨なのでキャプチャをよく使うが
207 :
デフォルトの名無しさん :05/03/20 01:26:11
俺は独自に関数を作って処理。
>>200 なにかイベントが起きた時に、特定の処理を行いたい時に
「イベントが発生したらこの関数を呼んでね」
と登録する。
どうやってその関数が呼ばれるのかは知らなくていいこと。
209 :
デフォルトの名無しさん :05/03/20 01:56:58
WNDCLASSEX wcex; wcex.lpfnWndProc= (WNDPROC)WndProcA; ウィンドウA→WndProcA() ウィンドウB→WndProcB()
while true do match イベント with イベント1 -> イベント1が起きたら呼ぶ関数 | イベント2 -> イベント2が起きたら呼ぶ関数 | _ -> () done C流の関数へのポインタは本質的ではない。
211 :
デフォルトの名無しさん :05/03/20 02:04:43
C言語というかmmapに関する動作がいまいち理解できないので教えてください。 たとえば #define SIZE 536870912 int main() { void *map; int fd = open("tmp_file", O_RDWR); size_t size = (SIZE / getpagesize() + 1) * getpagesize(); map = mmap(0, size, PROT_READ | PROT_WRITE, MAP_FIXED, fd, 0); munmap(map, SIZE); return 0; } というプログラムを動かすとバスエラーになってしまいます。 また、変数sizeを使わずにSIZEを使うとセグメントエラーになります。 mmapはファイルをメモリに全部読み込まずに必要な分だけキャッシュする とmanに書いてあるように読めたのですが、間違いでしょうか。 環境はFreeBSD 5.3R, gcc 3.4.2です。メモリは512MBです。 tmp_fileは dd if=/dev/zero of=tmp_file bs=512 count=1048576 として作成しました。
>>205 strtok()はスレッドセーフではないので使用に注意が必要。
必然的にconst char * 渡せないしね。
214 :
デフォルトの名無しさん :05/03/20 02:17:57
区切りで分割した文字をリストで返してくれるものがいいね。 かってに区切り文字をNULLに置き換えられても困る場合ある。
すみません、確かに標準Cではありませんね。 別のスレで聞いてみます。ありがとうございました。
216 :
デフォルトの名無しさん :05/03/20 02:39:56
これで完璧 my @array = split(/,/, $string);
それC?
@!!a A!(!a) @番でもいいですか?
わかりました。
221 :
デフォルトの名無しさん :05/03/20 16:11:29
> NULLの代わりに0を代入って、構造体の初期化でオール0にしたりする場合に有効なんじゃ おまえはおおぼけ。たとえばmemsetで0クリアしたら、メンバーにはNULLじゃなくて all bit 0のパターンがはいるだけ。 0がNULLに変換されるのは、あくまでも代入や引数渡しの場面だけだ ぼけ
223 :
デフォルトの名無しさん :05/03/20 16:41:00
> かってに区切り文字をNULLに置き換えられても困る場合ある。 は? こいつぼけ。区切りがNULLなわけねーだろ ぼけ。 NULLはポインターにいれる値だ。
224 :
デフォルトの名無しさん :05/03/20 16:41:35
っていうか、文字化けしてる > 218 ぼけ
文字列をアイウエオ順にソートするアルゴリズム教えて
226 :
デフォルトの名無しさん :05/03/20 17:06:56
qsort一発!
227 :
デフォルトの名無しさん :05/03/20 17:09:46
比較関数の作り方のこつだけおしえておこう。 単純にコード順にならべると ハンバーガー バンズ パン の順になってしまうが、正しくアイウエオ順の場合は パン バンズ ハンバーガー の順にならねければならない。つまり濁点や半濁点はついていない状態で比較し、 それでもまったく同一だった場合だけつけてくらべるのである。
正しいあいうえお順ってなんだろね。 >227は所謂辞書順ではあるけど、そうでない順序も世の中にはあるわけで。
脳内辞書だろ
不可能は無い
STL勉強しなおせ、うましか。
固定小数点って、その処理系が演算としては 小数が扱えるから固定小数点が使えるんですよね? 変数に小数が使えないだけで、 演算は出来ないと小数が使えない。ということで。 初心者なんで、分かりません。 完全に小数が使えないと、固定小数使う意味無いということが言いたいのです。 間違ってますか?
↑C言語とは限らない質問ですみません。
>>232 Cでも固定小数点実数演算ライブラリを作ることはできる。
236 :
デフォルトの名無しさん :05/03/20 18:07:52
> そうでない順序も世の中にはあるわけで ありません
それを決めておくのが仕様だろう
>>234 演算自体を自分で管理するということですか。
頭混乱してきました。
一般的には
整数しか使えない場合、最終的には整数出力なので、
固定小数にした変数を独自整数キャストして使うのかな。
机上で語ってるのでサッパリです。
ありがとうございました。
>>239 こういうのはC++だと綺麗に実装できるが、
演算速度や外部I/Fの都合で固定小数点を扱うことは度々ある。
今や、実数演算が充分高速なので殆ど必要はなくなったが、
8ビットCPUの時代にはしばしば固定小数点演算を行なっていた。
いずれにしても、C++ならCAST演算子オーバーロード、Cならば変換や出力に用いる関数を用意すればいい。
勿論、必要に応じて四則演算関数も用意する必要があるが。
242 :
デフォルトの名無しさん :05/03/20 20:56:42
環境依存の質問なのでスレ違いかも知れませんが、他に適切なスレが見当たらなかったのでここに来ました。 OS は Windows XP で、コンパイラは mingw-jp の gcc です。 コマンドプロンプトのウインドウの現在の縦のサイズ(行数)を得るにはどうすればよろしいのでしょうか。 それとも、それは不可能なのでしょうか。 よろしくお願い致しますm(_ _)m
243 :
デフォルトの名無しさん :05/03/20 20:59:14
スレ違い 氏ね
244 :
242 :05/03/20 21:00:55
>>243 では、ご存知でしたら適切なスレに誘導して下さいm(_ _)m
>>245 ふざけないで下さい。
このスレでは適切なご回答を頂けそうにないので、
>>242 の質問はキャンセルさせて頂きます。
>>246 お前がふざけたまねをしてるんじゃないか
そりゃ自分が低脳だなんて、認めたくないだろうよ
客 ラーメンくれ 店 ここは寿司屋だ。ラーメンは無い。 客 じゃあラーメンがある店を教えろよ! 店 しらんがな 客 なんだと!!!ふざけやがって!!!
なんだと
251 :
デフォルトの名無しさん :05/03/20 23:11:10
<パターン1> 客:ラーメンください 店:ここは寿司屋です。ラーメン無いです。 客:じゃあ、ラーメンください。 店:そうかい、すまないね。 〜完〜 <パターン2> 客:ラーメンください 店:ここは寿司屋です。ラーメン無いです。 客:じゃあラーメンの店どこにありますか? 店:そこを右に曲がって...(略) 客:ありがとうございました。(いい店だね。また今度来てみようかな) 〜完〜 <パターン3> 客:ラーメンください。 店:ここは寿司屋です。ラーメンは無いです。 客:ラーメンください。 店:ラーメン無いよ。 客:ラーメンください。 店:無いって。 .....続く。
パターン1間違えた...
>>252 パターン2は、客が次に来たときも寿司を注文するとは限らないところに罠があるな。
ここは店や客の立場じゃ無いからな 優しくする義理も無いし、そやつが二度とこなくてもかまわないし。
freopen的にstdin, stdout, stderrをchar*に置き換えるにはどうすればよいでしょうか? とある巨大プログラムを自分のアプリに組み込もうとしているんですが、 ほとんどの出力を標準出力に返してるんでそれを拾って使いたいと思ってます。 パフォーマンスを超重視してるんでpopenとかはなしです。
質問者を客並みに扱えとのたまう弱者が いらっしゃるスレはここでしょうか?
誰か
>>257 の1行目を翻訳してくれないか。
>パフォーマンスを超重視してるんでpopenとかはなしです。
popen のパフォーマンスがどうだか知らんが
そーゆー話だと、スレ違いの予感。
プロセスって言語の外になるから微妙かもしれないですけど 実際問題として対象外なんでお願いします。
ことわる
>252 のパターン3の開始?
>>257 環境によるけど、メモリマップドファイルが使えるならfreopen()でいいじゃん。
264 :
デフォルトの名無しさん :05/03/21 00:59:04
>>257 オブジェクトとして組み込むんですか?
モジュールとしてですか?
265 :
デフォルトの名無しさん :05/03/21 01:07:39
>>257 stdioのショボサを語るのならこのスレでいいが、
環境依存の解決方法を求めるならスレ違い
#include<stdio.h> void card(int *a, char *n, char *o, char *q) { char card[] = {'0', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'}; char mark[] = {'0', 'D', 'H', 'S', 'C'}; //ダイヤ、ハート、スペード、クラブ if(*a == 1) *o = mark[1]; if(*a == 2) *o = mark[2]; if(*a == 3) *o = mark[3]; if(*a == 4) *o = mark[4]; if(*n == 1) *q = card[1]; if(*n == 2) *q = card[2]; if(*n == 3) *q = card[3]; if(*n == 4) *q = card[4]; if(*n == 5) *q = card[5]; if(*n == 6) *q = card[6]; if(*n == 7) *q = card[7]; if(*n == 8) *q = card[8]; if(*n == 9) *q = card[9]; if(*n == 10) *q = card[10]; if(*n == 11) *q = card[11]; if(*n == 12) *q = card[12]; if(*n == 13) *q = card[13]; } 初心者です。凄い無駄なことやってるかも知れませんが。 数字をトランプの記号に置き換えする関数ですが0が表示される場合があります… 別のとこでrandで13の余り+1してるから問題はなさそうなんですが。
267 :
デフォルトの名無しさん :05/03/21 01:23:34
"if"の前に"else"が抜けてるだけじゃないの
268 :
デフォルトの名無しさん :05/03/21 01:27:36
これでいいのか? void card(int a, char *n, char *o, char *q) { char card[] = "0A234567890JQK"; char mark[] = "0DHSC"; //ダイヤ、ハート、スペード、クラブ o[0] = mark[a]; q[0] = card[*n] if (q[0] == '0') { q[0] = '1'; q[1] = '0'; } }
aやnの範囲チェックが欲しい所だな
>>266 某診断室にありそうなプログラムだ・・・・。
みなさんありがとうございます。 これよくよく考えると無駄ありすぎですね。最悪for使えよとか… 配列の先頭に0いれる必要性も特にないですね…ちなみにnは間違いでint型でした。 一部分だけじゃ分かりにくかったですね。とりあえず範囲チェックしてみます。 ありがとうございました。
質問です。 #include<stdio.h> main() { int p, c; p = &c; printf("%d",p); return 0; } なんですけれども、 警告 W8069 050321-x.c 7: 移植性のないポインタ変換(関数 main ) というエラーが出てしまいます。 使い方がおかしいらしいのですが、いまいちポインタを上手く使えなくて困っています。
え”?
自己解決しました。 int *p, c; に訂正したら、治りました
お騒がせしました。照
>>263 検討中なんですがきちんと排他制御できるか心配っす。
>>264 オブジェクトです。具体的にいうと環境依存になりますので割愛。
>>265 標準Cで
>>257 を満たすならなんでも結構です。
# このスレでPOSIXは無し?
<パターン3> 客:ラーメンください。 店:ここは寿司屋です。ラーメンは無いです。 客:ラーメンください。 店:ラーメン無いよ。 客:ラーメンください。 店:無いって。 .....続く。
278 :
デフォルトの名無しさん :05/03/21 02:27:45
279 :
デフォルトの名無しさん :05/03/21 03:21:03
(void)strcpy(a, b); みたいなのをよくみかけます このキャストなんか意味あるんすか?
>279 たしかlint(文法チェッカー)で strcpyの戻り値を使ってないYO! という警告を抑制する意味があったはず。 最近はコンパイラ自体の文法チェックが強力になってきたんで コンパイラと独立した文法チェッカはあまり使わない希ガス
>>279 太古の昔のコンパイラでは、戻り値を使わないと警告が出たようなことを
聞いたことがあるような。
282 :
デフォルトの名無しさん :2005/03/21(月) 04:14:21
客:ラーメンください。 店:あげない EOF
283 :
デフォルトの名無しさん :2005/03/21(月) 04:15:10
客:ラーメンください。 店:ぼけ
284 :
デフォルトの名無しさん :2005/03/21(月) 04:18:42
>>281 ぼけ
むしろ逆。
むかしはそんなことぐらいでいちいち文句いうようなコンパイラーは1つもなかった。
void型が導入されてからだな。そういう警告をオプションで出せるようになったのは。
なのでごく最近(ここ15年ほど)だ。
へんな基準
,,,,,,,,,, ,,ii,,、 ,,,i,,、 .,lllllllll,,,,,,,,,,,,,,,,,,,,,,, ,iillllllllllii,, ,,,iillllllllii,,, iiiiiiiillllllllllllllllllllllllllllllllllllllll| ゙゙!lllllllllllllir .,,,iilllllllllllllll!゙゙′ .llllllllllllllllllllllllll!!!!!!!!!!!!!!!!!″ ゙゙!!ll!゙",,,iilllllllllllll!!゙゙゜ .゙゙゙゙゙゙”゛ llllllllllliiiiiiii,,,,,,,、 ,,,iillllllllllll!!゙゙゜ ___,,,,, ,,,iiillllllllllllllllllllllllllllllliii,, ,,,,,,,,,iiiiiiilllllllllllllllllllllllllllllllllllllllll .,,illlllllllllllllllllll゙゙゙゙゙゙!!llllllllllllli, .,,,,,iiiiiiiiiiiiiiiiiii,,,、 .llllllllllllllllllllllllllllllllllllllllllllllll!!!!!!l ,illllllllll!゙゙llllllllll| ,illlllllllllllllll, liilllllllllllllllllllllllllllllllli,, lllllllllll!!lllllllllllllll!!゙゙゙”` ,llllllllll゙ .lllllllllll .,,illlllllllllllllllllll、 ゙llllll!!゙゙゙’ ゚゙llllllllll ゙゙”`.,illllllllll!l゙’ : llllllllll° .llllllllllll,illllllllll!゙`lllllllllll .゙゙゜ ,llllllllll! ,llllllllllll° : llllllllll, lllllllllllllllllll!゙゜ ,lllllllllll ,,,illllllllll!゜ .llllllllllllli,_ ,,,,,,,,iiiiiii、 : 'lllllllllllliiilllllllllllllll!!゙’ ,lllllllllll° .,,,,iiillllllllllll!゙゜ ゙!llllllllllllllllliillllllllllllllllllllllll,、 .゙!!lllllllllllllllll!!!゙゙` .l!!llllllll° .゙!lllllll!!!゙° ゙゙!!llllllllllllllllllllllllllllll
>>287 だったらお前が答えて差し上げなさいませ。
やっと書き込めた。
int st,st2,i=0,j=0; char ss[]="C:\\美少女学園\\禁断\\個人データ\\画像\\110012.jpg"; char ss2[x]; st=strlen(ss); while(ss[st-i]!='\\') { i--; j++; } for(i=st-j;i=st';i++) { ss2[st2] = ss[i]; st2++: } 110012.jpg これをss2に入れたいんですが 出来ませんどうしたら良いでしょうか? printf("%d %d %d\n",i,j,st); こうすると文字数が出たらめになってるんですけど '\\'これを認識させる方法がダメなんでしょうか?
292 :
デフォルトの名無しさん :2005/03/21(月) 18:00:05
>>291 char *ptr;
char ss[]="C:\\美少女学園\\禁断\\個人データ\\画像\\110012.jpg";
char ss2[100];
ptr = strrchr(ss, '\\');
if (ptr) {
strcpy(ss2, ptr + 1);
printf("%s\n", ss2);
}
>>292 ありがとうございます
>ptr = strrchr(ss, '\\');
>if (ptr) {
>strcpy(ss2, ptr + 1);
これだと 始めの C:\\ が引っかかると思うのですが
なぜ最後の 110012.jpg が取得出来るんでしょうか?
どっかのスレで、 187 :デフォルトの名無しさん :05/01/24 01:53:05 キーボードから入力を受付けるときに、 「キー連打」と「一定時間以上キー押しっぱなし」 を区別したいのですが、どうすればよいでしょうか? 188 :デフォルトの名無しさん :05/01/24 08:02:34 押しっ放しはkbhitが反応しっ放し 連打はkbhitが反応しないことがある とあったのですが、なぜ連打は kbhit が反応しないことがあるのでしょう?
296 :
デフォルトの名無しさん :2005/03/21(月) 19:09:14
>>293 > >ptr = strrchr(ss, '\\');
> >if (ptr) {
> >strcpy(ss2, ptr + 1);
>
> これだと 始めの C:\\ が引っかかると思うのですが
いえ、それはあなたの勘違いです
主要な関数の使い方を覚えていないのなら手元に参考書を用意してください
>>296 そうなんですか
strstr()は
後ろから検索するんですね
知りませんでした
(参考書読んでませんが・・・)
ホントありがとうございました
298 :
デフォルトの名無しさん :2005/03/21(月) 19:25:10
strstr
300 :
作者 :2005/03/21(月) 19:33:28
目も頭も悪い
301 :
297 :2005/03/21(月) 20:32:58
やっちまった・・・ orz
302 :
デフォルトの名無しさん :2005/03/21(月) 21:40:05
あれ? なんで隔離スレの冠を外しちゃったの?
303 :
デフォルトの名無しさん :2005/03/21(月) 21:50:33
今まで大学でしかプログラミングしたことなかった俺が家のPCでもやろうと思うんだが、 まずコンパイラ何がいいか教えてくれ・・・・教えてください・・orz WindowsXPでできるやつでお願いします
305 :
デフォルトの名無しさん :2005/03/21(月) 22:05:24
> まずコンパイラ何がいいか教えてくれ gcc
>>303 Linux入れろ。
おそらくgccをインストールすることになるだろう。
エディタはemacs。
これで始めとけ。
>>303 windowsでカネを掛けないでイビツでない環境を作るのは不可能だから、
Linuxの方が勉強向きだ。
309 :
デフォルトの名無しさん :2005/03/21(月) 22:12:09
っていうかWindowsでもcygwinやSFUでふつうgccだ。常識だろ! で、gccより機能的にましなものおまえもってるか? gccより標準規格に準拠度が高いものおまえもってるか? gccの普及率というかシェアがどれだけか知ってるか? Webでgccに関する情報量がどれだけあるかしってるか? gccがサポートしているプラットフォームの多さを知っているか? さらに、 gccは無料だ。 で、おまえgcc以外に何か薦めるものがあるとでも思ってるのか? ぼけ さらには、 gccにはコンパイラーのソースもついている これ以上強力な「おすすめ」があるか?
310 :
デフォルトの名無しさん :2005/03/21(月) 22:16:13
普通にVC.NETのほうが良いと思うが
別に無料という制限は無いし、VS.netでも薦めてみる。 でも、IDEの使い方で迷いそうだな
>>309 プログラミング環境はコンパイラだけではなりたたないぞ。
(笑
>>303 まず大学で何を使っていたかを言えよ。
それと同じような環境を家で構築できるかどうか尋ねたほうがいいんじゃないか?
>>309 長々と書いた割にはつまらんな。
適切なスレで宜しく。
>>303 Visual Studioにしとけ
そしてWin32API+C言語が一番簡単
317 :
デフォルトの名無しさん :2005/03/21(月) 22:51:50
なわけねー > 316
VC++6.0が最強
319 :
デフォルトの名無しさん :2005/03/21(月) 22:53:04
> プログラミング環境はコンパイラだけではなりたたないぞ いや。成り立つ。 viもemacsもない環境でしょっちゅう開発してたからな。 % cat > foo.c で足りる。
XPにもEDLIN入ってるね。今でもEDLIN使える自分が怖いです。
321 :
デフォルトの名無しさん :2005/03/21(月) 23:18:14
XPにはもうはいってませんよ > edlin かなり以前に廃止になった。 DOSプロンプトなら COPY CON > foo.c です。常識! edlinなんて軟弱ものがつかうものだ!
322 :
デフォルトの名無しさん :2005/03/21(月) 23:18:54
> VC++6.0が最強 ふ。そんな厨房のつかうものを たいしたもんだと思い込んでいるやつはかなりのぼけ
ゴメン ゴメン VC++6.0は 厨房や消防、ニート、引きこもりには買えないんだったな
324 :
デフォルトの名無しさん :2005/03/21(月) 23:27:10
っていうか、そういうやつらしかつかわん。 ふつうgcc
>321 あれれ?俺US版XPだからかな?おまいEDLIN使いこなせるのか? で、細かくて悪いんだけど >COPY CON > foo.c のCONの後の'>'は要らないよ、まだまだ甘いね。 >322 C#が最強・・じゃなくて、VS.NETと.NET Frameworkが最強。 よくここまでWIN32をラップしたね。(チョット嫌味) VS.NETはアタッチしてるサービスをTMから強制終了すると再アタッチ時にお亡くなりになってしまう。 なぜなら、悪い事をした罰だから。この辺が俺の作品らしいだろ。
char ss[]="C:\\ラピュタ\\魔女\\トトロ\\move0202.mpg"; char ss2[255]; char ss3[255]; int st,i,j=0; st=strlen(ss);j=0; for( i = 0; i<st; i++) { if(ss[i] =='\\') {ss2[j]='\\'; j++; st++; ss2[j]='\\';} else ss2[j]=ss[i]; j++; } ss[] = C:\ラピュタ\魔女\\トトロ\move0202.mpg を ss2[] = C:\\ラピュタ\\魔女\\トトロ\\move0202.mpg に変更しているのですが こうすると ss3[](他の変数)に影響してしまうのですが なにが間違ってるのでしょうか?
328 :
デフォルトの名無しさん :2005/03/21(月) 23:51:11
>>326 > ss[] = C:\ラピュタ\魔女\\トトロ\move0202.mpg を
> ss2[] = C:\\ラピュタ\\魔女\\トトロ\\move0202.mpg に変更しているのですが
何がやりたいのかサッパリわからん
すいません、少し間違ってましたね char ss[]="C:\\ラピュタ\\魔女\\トトロ\\move0202.mpg"; こうするとデータ上 ss[] = C:\ラピュタ\魔女\トトロ\move0202.mpg こうなります それをデータ上で ss2[] = C:\\ラピュタ\\魔女\\トトロ\\move0202.mpg こう変更して いるんですが 変更はうまくいくんですが 他の変数値がおかしくなってしまうんです
330 :
デフォルトの名無しさん :2005/03/22(火) 00:01:21
これでいいのか? int i, j, st; char ss[]="C:\\ラピュタ\\魔女\\トトロ\\move0202.mpg"; char ss2[255]; st = strlen(ss); for(i=0, j=0; i<st; i++, j++) { if(ss[i] == '\\') { ss2[j++] = '\\'; } ss2[j] = ss[i]; } ss2[j] = '\0';
すいません、解決しました ss2[]={0}; ss3[]={0}; こう定義しちゃってました(^^;
>326 st++って何?関係無いからいじっちゃダメよ。 > ss[] = C:\ラピュタ\魔女\\トトロ\move0202.mpg を の\\はネタ?
333 ∈(・◎・)∋ 333
おいおい!解決が早すぎるだろ!(遅レスしちまっただろーが!) まーそれはいいとしても、st++について触れられてないがおまい本当に大丈夫か? ループカウンタはいじっちゃダメよ。これはプログラム界の常識だよ。
>>334 相変わらずだな、お前は…
ちったぁ進歩しろよ。
336 :
デフォルトの名無しさん :2005/03/22(火) 20:14:40
コンソールで他のEXEを実行させるプログラムを作りたいんだけど たとえば、1を入力するとエクセルが起動とか2を入力するとワードが 起動するとか。だれかわかる人起動のとこのソースだけ教えてください
337 :
デフォルトの名無しさん :2005/03/22(火) 20:17:23
C言語をこれから覚えようと思うのですが、解説サイトでお勧めのところはありますか?
338 :
デフォルトの名無しさん :2005/03/22(火) 20:20:45
早速ですが教えてください。 文字列“/TEMP/DIR/TEST/ABC.sh” があります。”ABC.sh”のみを抽出したいのですが 何方さまかご教授お願いいたします。
char* s = "TEMP/DIR/TEST/ABC.sh"; char* p = strrchr(s, '/') + 1; printf("%s", p);
340 :
デフォルトの名無しさん :2005/03/22(火) 20:43:24
>>339 非常にたすかりました。感謝いたします。
ありがとうございます!!
system Wisdom
342 :
デフォルトの名無しさん :2005/03/22(火) 21:18:18
tmpfile()で作成したファイル名を知りたいのですがどうしたらよいでしょうか。 または、プログラム中で、ファイルディスクリプタの番号しかわからない場合 にそのファイル名を知りたい場合はどうしたらよいでしょうか。
K&Rの日本語版って、数字の1をアルファベットのlで書いてある箇所が何箇所かあるんですが、 これは嫌がらせですか?
昔はフォントの節約のために、0とO、1とlは同じ字を使っていたんだよ。 と書いたものの、そういう話ではない気がした。 そう、たぶん、その現象の名は、誤植。
>>342 直接の回答ではないけど、tmpnamとfopenを組み合わせるとか
346 :
デフォルトの名無しさん :2005/03/23(水) 01:15:45
>>342 > tmpfile()で作成したファイル名を知りたいのですがどうしたらよいでしょうか。
そういう用途にはmkstemp()を使うのが良い
> または、プログラム中で、ファイルディスクリプタの番号しかわからない場合
> にそのファイル名を知りたい場合はどうしたらよいでしょうか。
無理
347 :
デフォルトの名無しさん :2005/03/23(水) 01:16:21
>>346 ゴメン・・・mkstemp()って標準Cじゃなかった・・・
int *a a = (int *)calloc(20,sizeof(int)); ってやった場合,あとあと配列aの要素数を調べる方法ってありませんか? int a[20]; なら sizeof で調べられるのは分かって感動したんですが・・・この場合は無理でした
たまに fopen( "aaa", "w" ) ; とかってやると、Documents and Settings 直下のフォルダに aaa が出来るんですけど、 これってどういう時なんですか? 普通にカレントディレクトリに作成される事もあるんです。
>>349 その場合の変数「a」は配列ではなくポインタ。
「a」が指している領域は配列としてアクセス可能である。
しかし、要素数を得ることは出来ない。
自分で覚えておくのが普通だ。
>>351 カレントディレクトリが
Documents and Settings 直下
になってたんだろ。
どうせコマンドプロンプトにファイルドラッグアンドドロップして
実行したとかそんなとこだろ
>>349 sizeofってのはコンパイル時に定数に置き換えるだけだよ。
>>354 >>349 の場合はそうだがC99では可変長の配列もある
その時sizeofは動的にサイズを計算して返してくれる
sizeofってすごーい\&heart;
ぎゃ♥
360 :
354 :2005/03/23(水) 18:26:03
>>357 正直すまんかった。
アセンブラコード見たとき定数だったから動的な計算は出来ないと思ってたよ。
>>356 ごめん。忘れてくれ…。
RHEL3でgccで環境変数を使うプログラムを書いているのですが この環境変数に書き込める値の限界が見えません。 今環境変数に書き込みしているテストプログラムが710万行(一行100byte)を超えました… top vmstat freeで見張っているのですが、メモリを使用しているように見えません。 このプロセスが使用している環境変数のメモリ量はどのように知ればいいのですか?
>>362 1つのプロセスにつき、使用できる環境変数は1つの値ということですか?
なんかnullっぽいです…
>>361 glibc がどうしてるかはソースを見ないとわからんが、UNIX 系なら
malloc() と変わらんのじゃないかな。
同じ名前の環境変数を次々とセットして「メモリ使用量が増えない」と
か言ってないよね?
>>364 Environmental Variableでも検索しているのですが、よく分からない。。。
>>365 ありがとうございます。
mallocだと親プロセスが使用しているメモリを子プロセスが引き継いでしまい、
データが重複してメモリを占有してしまうと、あんまりきれいじゃないと思うので、
避けてました。
>同じ名前の環境変数を次々とセットして「メモリ使用量が増えない」と
>か言ってないよね?
それはないです。すいません。
親プロセスがmallocで500MBを確保し、子を10個作成した(エラー表示なし)のですが、 topなどではほとんどメモリを使用しているように見えません。 500MB×10プロセス=5GB占有?
クラスタ上の話か…?
Cに「子プロセス」や「top」なんてあったっけ? という話は置いといて 書き込まれるまで、物理メモリは確保されないという実装も多いけど。 特に現状のfork等を使っているのなら。
>>368 copy-on-writeって言葉を知ってますか?
あとは、UNIX関連のスレでね。
372 :
デフォルトの名無しさん :2005/03/23(水) 20:10:37
switch文で文字列を評価したんだけどコンパイルは通るんだけど反映されない のは無理なんですか? char str[80] gets(str)ここでstrにBDって入力して switch(str){ case 'BD':・・・}って感じで評価したんだけど if文ではいけたんだけど、本見てもcaseの時は1とか数字で評価してるのしか のってないし。教えてください
373 :
デフォルトの名無しさん :2005/03/23(水) 20:29:08
switchの評価対象はchar型またはint型の変数に限られる。 char str[80]; switch(str){ case 'BD':・・・} 上記の場合、変数配列strのアドレスを評価してるね。 つまり、str[0]が128番地であった場合、str == 128 となる。 文字列は評価されないよ。 あと、シングルコーテーションは文字を囲むのに使用し、 文字列を囲むときにはダブルコーテーションを使用する。 もし評価したければ if (strcmp(str, "BD") == 0){・・・} というふうになるだろうね。 switchは万能じゃないから気をつけて。 これはC言語以外にも言える。switchは基本的に整数型のみ。 というか、'BD'でコンパイルエラーにならないのか・・・。 「if文ではいけた」らしいが怪しい・・・。
374 :
デフォルトの名無しさん :2005/03/23(水) 20:29:36
375 :
デフォルトの名無しさん :2005/03/23(水) 20:46:05
>>373 なるほど、具体的にはstrがアドレスになるのは知ってるけど
最初switch(*str)で、あとの”で評価したんだけどエラーでとおらなくて
シングルコーテションにしたらとおったから
ちなみif文では*strで評価したらうまいこと処理にいっったんですけど
同じ処理が続くんでswitchにしたんだけど、やっぱり無理みたいですね。
switchでは。ありがとうございました
'BD' って書くと値は処理系依存なので... それに、*str は最初の1文字だけの値だし...
> ちなみif文では*strで評価したらうまいこと処理にいっったんですけど これは偶々。
378 :
デフォルトの名無しさん :2005/03/23(水) 21:47:52
時刻を表すプログラム #include<time.h> #include<iostream> using namespace std; void main() { time_t localTime; time(&localTime); char* strTime = ctime(&localTime) cout << "今は、" << strTime << endl; }
>>378 せっかく書くなら
#include <time.h>
↓
#include <ctime>
380 :
側近中の側近 ◆0351148456 :2005/03/23(水) 22:59:51
(っ´▽`)っ 必ずコンパイルして実行するように! #include<stdio.h> int main(void){ char Res[20]; printf("(っ´▽`)っ 私ってかわいい?\n"); while(1){ fgets(Res, sizeof(Res), stdin); if(((Res[0] == 'Y') || (Res[0] == 'y')) && (Res[1] == '\n')){ printf("(っ´▽`)っ ありがと(抱)\n"); break; } else{ printf("(っ´▽`)っ もう一度聞くよ?私ってかわいい?\n"); } } return(0); }
381 :
デフォルトの名無しさん :2005/03/23(水) 23:39:15
文字コード変換はLinuxならnkfだっけ? Winならエディタ使うけど
>>382 スレ違い。
Linuxでもエディタで変換することもあれば、Winでもnkfを使うこともある。
386 :
デフォルトの名無しさん :2005/03/24(木) 14:42:56
こんにちは、NIDA といいます。 # Vine 3.1 の gcc 3.3.2 、nasm 0.98.38 です。 # 自作 PC です。 CUI のプログラムで、"Password :" と表示した後、 パスワードを入力してもらおうと思います。 その際、入力したキーを表示しないようにするには、 どうすればいいのでしょうか。 # "su" のような事がしたい。 よろしくおねがいします。 m(_ _)m
>>387 誰もそんなこと聞いてないんだよ。
お前社会性ないだろ?
>>390 そんなこと言ってるんじゃないんだよ^^
ヘッダーファイルの二重include防止に #ifndef〜を使え!とあるんですが、 そもそも二重includeされるような状況って どんな場合なんでしょう? あと、関数ポインタって何の役に立つんですか?
>>392 > そもそも二重includeされるような状況って
> どんな場合なんでしょう?
例えば、別々のファイルに書かれている関数をお互いに呼びあったりするプログラムだったら
無限にincludeしつづけるよね。
> あと、関数ポインタって何の役に立つんですか?
実行時に使いたい関数を選択できることです。
実行時にアルゴリズムを選択できる関数があれば汎用性が高まると思いませんか?
テストをする段階ではごく単純なアルゴリズムでテストしておいて、後で複雑なアルゴリズムを
作る、という事も簡単にできますね。
ファンクショナルプログラミングではもっと別の意味で使いますが…
可変個引数の関数を呼び出す時にオプション引数に2Byteの変数を指定し、 関数の中でva_argマクロで参照するとき1Byteで参照した時の戻り値は、 2byte変数の上位8bitが1度目の戻り値で、 次の参照時の参照位置が下位8bitを指しているって言う事であっていますか?
>>394 実装依存。
例えば32bit intのCコンパイラなら4byte境界に詰め込む。
つーか、intとして取り出せばOK。
396 :
394 :2005/03/24(木) 17:38:42
linuxで組んでますが、 シグナルハンドラの中にいるときに該当するシグナルが発生したら中断するんですか? セマフォとか使う必要がある?
398 :
397 :2005/03/24(木) 18:17:57
捕捉 自分の場合SIGCHLDについて気になってます。
>>397 そんなのテストコード書いて調べりゃいいじゃない
馬鹿じゃないの?
>>399 じゃおまえがテストコード書け。
俺がテストしてやるから。
402 :
デフォルトの名無しさん :2005/03/24(木) 18:33:17
すいません、教えてください mainで配列に値を入れ、関数testで合計と平均を求め、mainで表示する例題をやっているのですがえらーが出て出来ません #include <stdio.h> void test(float data[],float *p1,float *p2) { int i; float sum,ave; for(i=0;i<5;i++){ sum+=data[i]; } ave=sum/i; p1=∑ p2=&ave; } void main(void) { int i; float data[5],*p1,*p2; for(i=0;i<5;i++){ printf("data[%d]>>",i); scanf("%f",&data[i]); } test(data,p1,p2); printf("sum=%f\nave=%f",*p1,*p2); } これをやるとprintf("sum=%f\nave=%f",*p1,*p2);のところで「不正なアドレス参照」とエラーが出ます
p1=∑
引数**p1 **p2 にしたらダメ?
405 :
404 :2005/03/24(木) 18:40:37
ごめん 見当ちがいだった。
406 :
402 :2005/03/24(木) 18:41:09
>>403 それはp1=&sum;
です。勝手に変換されてしまたようです
>>404 void test(float data[],float **p1,float **p2)
ってことですよね?
エラーが増えました
また違ったらすまないですが、mainからtest()内の(スタック上の)sum,aveを参照していいの?
408 :
402 :2005/03/24(木) 18:53:23
すいません、そこまで高度なことはわかりません ただ、配列のやり取りと同じようなイメージでやっているだけなんで・・・
>>402 test()内の
p1=& sum;
p2=&ave;
を
*p1=sum;
*p2=ave;
に、
main()内の
float data[5],*p1,*p2;
を
float data[5],d1,d2,*p1=&d1,*p2=&d2;
にする。
410 :
402 :2005/03/24(木) 18:59:37
できました! 理解できるかどうかわかりませんがこうする目的をおしえてください
>>410 ローカル変数の寿命はスコープが閉じるまでだから
test関数を抜けた時点でaveとsumは参照してはいけない。
>>409 は、d1,d2という実体をあらかじめ作って、そちらにデータを入れているからOK。
別の解決策としては
float sum, ave;
を
static float sum, ave;
にするとか。
412 :
402 :2005/03/24(木) 19:12:37
んーなるほど 「家」だけポツンと用意するのではなく、きちんと「家と住所」を用意してやる といった感じでしょうか(^_^;)・・・
>>412 ローカル変数(家)は関数を抜けると取り壊されちゃうから、
住所を辿っていったら駐車場だった、なんて困るだろ。
414 :
402 :2005/03/24(木) 19:21:26
をを!わかりやすいっす なるほどなるほど
415 :
402 :2005/03/24(木) 19:29:35
ちなみにstatic変数を使った場合って
単純に
>>402 のソースで
float sum, ave;
を
static float sum, ave;
にするだけでいいんでしょうか?
これでやると不正終了してしまったんですが
>>415 うちの環境じゃ
test()が不要になった、main最後のprintf()の段階ではaveがNULLになってるみたいに見える。
コンパイラの最適の問題かな。
-O2指定したらエラーにならなかった。
もちろん、指定しないと
>>415 さんと同じにエラーになります。
419 :
402 :2005/03/24(木) 19:58:24
実体を用意するのは必須ですか?
スマートじゃないが… void test(float data[],float **p1,float **p2) { int i; static float sum=0, ave; for(i=0;i<5;i++){ sum+=data[i]; } ave=sum/i; *p1=∑ *p2=&ave; } void main(void) { int i; float data[5],*p1,*p2; for(i=0;i<5;i++){ printf("data[%d]>>",i); scanf("%f",&data[i]); } test(data,&p1,&p2); printf("sum=%f\nave=%f",*p1,*p2); }
void test(float data[],float **p1,float **p2) にして test(data,&p1,&p2); でよびだしたら出来た。
422 :
402 :2005/03/24(木) 20:06:49
なるほど
素直に
>>409 を使ったほうがよさそうですね
調べたらstatic変数はメモリの無駄遣いになりかねないとありますし
どうもありがとうございました
>>409 それなら、これでよくない?
void test(float data[],float *p1,float *p2)
{
int i;
float sum=0,ave=0;
for(i=0;i<5;i++){
sum += data[i];
}
ave=sum/i;
*p1=sum;
*p2=ave;
}
void main(void)
{
int i;
float data[5],d1,d2;
for(i=0;i<5;i++){
printf("data[%d]>>",i);
scanf("%f",&data[i]);
}
test(data,&d1,&d2);
printf("sum=%f\nave=%f",d1,d2);
getch();
}
424 :
デフォルトの名無しさん :2005/03/24(木) 20:48:10
if((fp==fopen("test.text","r")==NULL)) ってがあった場合testのところをscanfとかで入力した値にしたいんだけど たとえば123を入力したら123.textってなる感じで今日いろいろ試したんですけど うまくいきません教えてください
char str[256]; char suffix[] = ".text"; printf("ファイル名:"); fgets(str, sizeof(str)-sizeof(suffix), stdin); str[strlen(str)-1] = '\0'; strcat(str, suffix); if ((fp = fopen(str, "r")) == NULL)
426 :
デフォルトの名無しさん :2005/03/24(木) 22:10:06
427 :
デフォルトの名無しさん :2005/03/24(木) 22:38:56
strdup()がC99の仕様に載っていないんですが、 もしかして非標準なんですか?
430 :
デフォルトの名無しさん :2005/03/24(木) 22:54:24
こんにちは、NIDA といいます。
# Vine 3.1 の gcc 3.3.2 、nasm 0.98.38 です。
# 自作 PC です。
388 wrote:
>>やれやれ、Cには上のようなことをおこなう標準的な方法も移植性の 高い方法もない。
>>(C FAQ 19.1 より引用。)
>
ttp://www.kouno.jp/home/c_faq/c19.html#1 >
>Unix系スレで質問する事をお薦めする。
Windows 上で動くやつは、masm でキー入力の部分を書いて、
他を C で作っていたんですが、Linux 上で同じものを作る際に、
全部 C で書けなかったかなーと思いちょっと質問してみました。
今のやつは、Linux 上で動作すればいいので、getpass() で十分です。
ありがとうございました。 m(_ _)m
431 :
デフォルトの名無しさん :2005/03/24(木) 23:14:53
標準ライブラリ関数のソースコードを見たいのですが ネットで見れるとこないでしょうか?
BSDのソースとか、wikipediaにも一部載ってた気がする
どこにでもころがってる
434 :
デフォルトの名無しさん :2005/03/24(木) 23:18:04
GCCのソースコードを見ろ>431
435 :
デフォルトの名無しさん :2005/03/24(木) 23:21:58
436 :
431 :2005/03/24(木) 23:25:54
>>435 そのものズバリの直リンクありがとうございました!
こういうの探してました!
また甘やかして・・・本人のためにならんだろうね
438 :
デフォルトの名無しさん :2005/03/24(木) 23:36:28
char str[200]; char tuki[5]; char hinichi[5]; char text[20]; char kakutyou[]=".txt"; char suji[]="050"; ****************** printf("月を入力してください・・・"); gets(tuki); printf("日にちを入力してください・・・"); gets(hinichi); printf("[%s]月[%s]日\n",tuki,hinichi); tuki[strlen(tuki)-1] = '\0'; x=strlen(tuki); hinichi[strlen(hinichi)-1] = '\0'; strcat(suji,tuki); どうも連結がうまくいきません050で連結されませんどこがまずいんでしょうか? いろいろためしたんですけど
>>438 tuki[strlen(tuki)-1] = '\0';
hinichi[strlen(hinichi)-1] = '\0';
はそれぞれfgetsの'\n'も読み込まれることへの対処法。
だからgetsを使うときには不要……じゃなくてfgets使え。
そのうちgets_sになるんだろな
fsage()とか
>>438 suji配列の要素数は幾つでしょう。また、strcat()は何をする関数でしょう。
初心者スレに行って欲しいと思うよ。
つーか何で
>>425 はわざわざstrcatなんか使うのさ。
sprintfだけで充分じゃん。
strcatが使いたい。。。 そんな時期が私もありました。。。
バッファ領域二つ使いたくないとか
お前ら、本質とは違う妙なところに拘るのな。 なんで?strcatだろうとsprintfだろうと一緒じゃないか。
読んだ時の理解しやすさ=保守性が段違い
ま、分かる人はすぐ分かるし、分からない人には永遠に分からないってことで。
>>423 の最後にあるgetch();って何でつか。
手元の本には、getcとかgetcharしか載ってないんでつが。
457 :
423 :2005/03/25(金) 06:54:17
>>455 消し忘れた。
ただのキー入力待ちだから、気にしなくていいよ。
詳細はググってくれ。
>>456 ,
>>457 ありがとござますた。getchって習わなかったので・・・
消し忘れだったのですか?
失礼しました。 すれ立てる(rで質問しなおしてきます。 お騒がせいたしました。
fgets関数で、ファイルの終わりまで1行読み込み、というのはどうすればできるのでしょうか? fscanfの要領で while( fscanf(str, 100, fp) != EOF) { 〜 } とやってみましたができませんでした
>>460 > fgets関数は、成功するとsを返す。
> ファイルの終わりを検出し、かつ配列に1文字も読み取っていなかった場合、配列の内容を変化させずに残し、空ポインタを返す。
> 読取りエラーが発生した場合も空ポインタを返すが、この場合の配列の内容は不定である。
>>463 JIS X3010:2003 (ISO 9899/1999)
JIS Cではnull pointerを空ポインタと訳してる
ようはぬるぽ
ガッ!!!
ぬるぬる
167 :一見孤児 :05/01/23 09:05:40 局所変数の頭を大文字にするな。 マナーと互換性を気にするなら、stdlib.hはstdio.hより先に書き、sizeofの後は()で囲め。 とあったのですが、なぜ彼はなぜこのような事を書き込んだのだと思いますか? stdio.h の中で stdlib.h の中身がインクルードされていると言う事?? 未熟な僕には検討もつかないので、よかったら教えてください。
470 :
デフォルトの名無しさん :2005/03/25(金) 19:43:50
_get_osfhandle 。これ使って何が出来るんですか? 簡単なサンプルプログラム作れる凄腕のかたいらっしゃいます?
>>470 テンプレ嫁
> GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
472 :
デフォルトの名無しさん :2005/03/25(金) 20:02:02
失礼しました!
このスレっていったい何のためにあるのか、ほんと疑問。 Cの言語仕様についての質問のみ受け付けるってこと?? その他ライブラリについては受け付けないっていうことなのかな… でも標準ライブラリの使い方の質問には答えているよね…疑問。。。。。
>>473 標準C規格には標準ライブラリも含まれてますが?
475 :
デフォルトの名無しさん :2005/03/25(金) 21:46:43
>>473 どーしても厳密な基準を示せと言われると ISO/IEC9899 が言及している範囲と言わざるを得ないが、
個人的には K&R 1st や、ボツネタの話なんかもありにしたいな
環境依存・機種依存じゃなければいいんじゃね
環境依存→処理系依存 内容がダブってた orz
478 :
デフォルトの名無しさん :2005/03/25(金) 22:21:35
VC++はC99をなかった事にしたがってる気がするんですが
VC++2005で対応すると明記されてないもので
複合リテラルあたりも対応してるのはgccぐらいじゃないか? それでも明示的に指定しないと使えないし
485 :
デフォルトの名無しさん :2005/03/25(金) 23:19:19
CCレモン
通るコンパイラと通らないコンパイラがあるんだけど、どっちが正しい動作? #define REM /##/ REM ここはコメント int main(){ return 0; }
コンパイラによる。
>>487 そんな書き方をしないのが、
藻前が取るべき正しい動作だ。
【 質問 】 int a[] = { 1, 0, 1, 0 } ; この要素数4の2進数各桁が入った配列を、 10進数の10として取り出すいい方法ないですか?
int val = 0; int ic; for (ic = 0; ic < sizeof(a) / sizeof(*a); ++ic) { val = val << 1 | a[ic]; }
492 :
デフォルトの名無しさん :2005/03/26(土) 01:50:41
ほ、ほんとに出来た! ありがとうございました!
493 :
487 :2005/03/26(土) 01:50:48
>>488 Thanks. 処理系定義ってことですね。
>>489 うるさい、無知はレスするな。
ありがとう、よく判りました。
・・・どちらのレスが正しい動作ですか?
494 :
491 :2005/03/26(土) 01:56:31
>>492 一応注意。
配列aはもっと長くても正しく動くけど、valをintにしているのでINT_MAXを越えない範囲でのみ有効ということで。
unsigned int val = 0;にしておけば32ビットまで正しく変換できるからそうするべきなんだろうな。
495 :
デフォルトの名無しさん :2005/03/26(土) 02:03:55
sprintf()に二進表示(%bとか)相当は無いんですか?
499 :
デフォルトの名無しさん :2005/03/26(土) 03:33:32
ひらがなのソートはおまいらにできますか?
500 :
デフォルトの名無しさん :2005/03/26(土) 03:42:56
EUCだと下側のバイトだけひかくしていれかえるとたぶんできるから おまえやれよ
502 :
デフォルトの名無しさん :2005/03/26(土) 09:25:34
fopenとかでエクセルでつくったファイルを読み込んで txtに落すプログラムって作れるでしょうか? 普通によみこんでみたら文字化けしてました。
できるけど、面倒。
>>502 ExcelにCSVを出力させればいい。
まずは試して味噌。
CSVの読み込みについてはあちこちにサンプルがあると思う。
これ以上は該当スレで。
505 :
デフォルトの名無しさん :2005/03/26(土) 10:24:11
>>504 Excelフォーマットを読み書きしたいんだけど…。
OpenOfficeでも読むか…。
506 :
デフォルトの名無しさん :2005/03/26(土) 10:33:04
>>505 普通にActiveX使えばできるんだが。
508 :
デフォルトの名無しさん :2005/03/26(土) 10:47:47
COM は C でも使えるよ
↓スレ違い。
漏れには502≠505と思えてならない。
512 :
デフォルトの名無しさん :2005/03/26(土) 11:11:46
↑味噌っかす
513 :
505 ◆/8LpUMqVAk :2005/03/26(土) 12:09:34
Cならqsortだとして、比較関数を作るよな? 比較関数ってのは単純なやつはstrcmpとかだけど ようはひらがな文字コード同士でそーとの際の並び順の大小を決めるだけだろ? ナニが難しいんだ?ひらがなの並び順が分からないのか? 50音順ってわかる? あ<い<う<え<お...
ナニだから、あんたが先走る、分かるえらいよあんた、
>>514 拗音促音濁音の取り扱いも含めて、適当な仕様と実装を提示してくれ。
517 :
デフォルトの名無しさん :2005/03/26(土) 18:42:08
csvで取り込むプログラムは作成できましたが その一部を取り出すプログラムがどうしても作成できません たとえば、abc,deff,b,cccc v,abid.c,ddddddと言う感じでcsvがあったとすると txtにはdeff,b abid,cと言った感じで中だけを保存したいです こういう加工をする関数とかあるんでしょうか?
strtok?
Cはむずいなぁ じゅぎょうでもさっぱり
520 :
デフォルトの名無しさん :2005/03/26(土) 20:30:22
>>517 scanf の作者は、あんたよりは安定したコード書くぜ
521 :
名無しさん :2005/03/26(土) 20:31:27
C確かにむずい...
Cはゴミ。
なんでLispから始めないんだ、大学の授業。
「C言語」はなんと発音すればよいのですか? らーじしーげんご?
ツェーげんご
>>527 「しー」じゃなくて「ツェー」なのですか?
リッチーがどこの人なのかを考えればシー(or スィー)だろ。
>>529 アメリカ人は「言語」をどのように発音するのですか?
531 :
デフォルトの名無しさん :2005/03/26(土) 21:21:28
csvをよみこんでdatに書きこんでそれをよみこみ画面に表示してみると たとえば1 aaa cccとあったらその次に1 .cccとなんかついてきます。 行数をふやしてみても、その最後の行のあとに最後の行に.がついておばけ みたいなのがつきます。 feofでファイルポインタを終了しているし、csvにもそんなのないのですが 考えられる原因はなんでしょうか
しーらんぐえっじ
オロナミンC
534 :
デフォルトの名無しさん :2005/03/26(土) 21:43:32
どうもdatをみてみると、 1 aaa cccc .[EOF]になってます なぜこうなるのかわかりません
だれだおまえ
>>534 そういう時は od -hc xxx.dat
537 :
デフォルトの名無しさん :2005/03/26(土) 22:00:39
それはどこにかくんですか?
コマンドライン
539 :
デフォルトの名無しさん :2005/03/26(土) 22:03:59
コマンドラインとはなんですか?
ぬるぽ
541 :
デフォルトの名無しさん :2005/03/26(土) 22:34:26
192.167.3.4みたいなIPアドレス ってどういう型でとりこんだらいいの?
VC6++でC言語を触り始めたんですが、1コ下の階層を指定しようとすると \でも\\でも 「不要な箇所にエケープシーケンスが付いてます。」 と言われます。 助けてくださいエロい人達 ('Д`)人
544 :
デフォルトの名無しさん :2005/03/26(土) 22:52:14
すごい初歩的な質問なんですが、VCでunixで使うネットワーク関係 のライブラリって使えるんですか?
545 :
デフォルトの名無しさん :2005/03/26(土) 22:56:18
>>544 VCはでUNIX-LINUXのプログラムは作れなかった気がする。
ごめん、↑気にしないで。
ぽ
549 :
デフォルトの名無しさん :2005/03/26(土) 23:32:29
>>543 \ の代わりに / でもいいことになってる
>>531 現象の再現する最小のソースを作ってupしる。
>>541 char[16]でも、int[4]でも、お好みで。たぶん何かのライブラリを
使う事になると思うので、そのライブラリのスタイルに合わせるのが吉。
>>543 質問の意味が判らんが、fp=fopen(".\\test\\hoge.txt","r"); で
カレントディレクトリの1コ下の階層のファイルがオープンできる。
IDEの使い方を間違ってるような気もするので、それならVC++スレで訊け。
そのときは何をしたかを具体的に書く事。
>>544 使えるものと使えないものがある。使えるとしてもソースを入手して、
(必要な修正をした後)再コンパイルが必要なので、使えないと思ったほうが
気が楽かも
上の方のレスみて気になったんですが、 MicrosoftのVisualC++でLinuxの実行ファイルは作成できないんですか?
>>552 VCではできないと思うが・・・。
Linuxのバイナリ作るなら、素直にLinux上でコンパイルすれ。
>>552 出来ない。
いや、ライブラリを書き換えてスタートアップルーチンをゴニョゴニョすれば
出来るかもしれない。
でも、それだけ苦労してもメリットが在るだろうか?
だからやっぱり出来ない。
>>553-555 サンクス。スキルの無い僕には絶対出来ないですね・・・
お邪魔しました。
>514 Windowsは様々な比較に対応した関数 CompareString を提供しています。
558 :
デフォルトの名無しさん :2005/03/27(日) 06:36:02
VC はもともとそういうことを想定してないようだが gcc をちゃんとソースからインストールするときは 翻訳環境と実行環境の違う組み合わせもありだよな
559 :
デフォルトの名無しさん :2005/03/27(日) 13:34:10
ファイルをバイナリ扱いするにはどうしたらいいんですか?
fopen とかなら "バイナリ"モードで(win系)
561 :
デフォルトの名無しさん :2005/03/27(日) 13:42:23
UNIX系では?
UNIX系では区別が無い
563 :
デフォルトの名無しさん :2005/03/27(日) 13:47:23
564 :
デフォルトの名無しさん :2005/03/27(日) 14:05:25
MicroSoft系の OS では、テキストファイルの改行は '\r'(0x0d:復帰)と '\n'(0x0a:改行)の2つの コードで表されます。 そのため、テキストモードで改行コード '\n' をファイルに書き込もうとすると、 '\r' '\n' の2文字に変換して書き込みます。 逆に読み込みでファイルに '\r' '\n' の改行コードがあれば '\n' の 1文字に変換します。 また、テキストファイル終端の 0x1a を EOF(ファイルエンド)として扱います。 しかし、バイナリファイルには「0x1a」、「0x0d」、「0x0a」はデータとして存在する可能性があり、 それをテキストモードのように変換されては困ってしまいます。 そのため、MicroSoft系のC言語ではテキストモードとバイナリモードを区別します。 なお、UNIX系のC言語ではこれらの区別は不要です。
565 :
デフォルトの名無しさん :2005/03/27(日) 14:12:53
c言語を始めてそろそろ5ヶ月になります きわめたのでOSを作りたいんですが、手始めになにをしたらいいでしょうか
566 :
デフォルトの名無しさん :2005/03/27(日) 14:13:54
>>565 散弾銃を買ってきて、マイクロソフト本社に乗り込んで
「OS作らせロー」
って叫びならが散弾銃をぶっ放す。
MSDOSの昔ならいざ知らず、もういい加減テキストモードをなくして欲しいよなあ。 標準入力を読むフィルタプログラムにパイプでデータを流すときにいつも苦労する。
>>565 ターゲットとなるプロセッサを勉強しなさい。
大雑把な質問で申し訳ないが 基本的に配列を扱うとき a[i] って記述するより *( a + i ) ってやった方が速いの?
>>564 WinCE は更に UTF16←→SJIS 変換までしてる。
>>570 なるほど,コンパイラに優しいって感じかな
ありがとう
573 :
デフォルトの名無しさん :2005/03/27(日) 15:45:24
>572 速さは変わらんぞ
コンパイラにやさしくしてもねぇ…^^; コンパイラに厳しくして効率良くなるならそれにこした事はない。
>>574 C言語じゃなくいが、そう思ってテンプレートを多用すると悲惨な目に…
型推論の機構を組み込むべきだね。 Templateなんて歪なものは無いほうがいい。
>>2 のコンパイラのDL場所を詳しく教えてくれんか
30分間もの間行ったり来たり・・・
Cygwinダウンロードして、packageのgccにチェック入れて一緒にインス子
>>569 そういうのが気になるならアセンブルコードを吐き出して見てみれば?
自分で確認した方が勉強になるよ。
>>581 見てみた!
まったく同じだったよ,面白いねこれ
ありがとう
>>582 どうせ同じ物を吐くんだからa[i]の書き方をする方が一般的(だと俺は思っている)
584 :
デフォルトの名無しさん :2005/03/27(日) 20:28:22
Cの入門書ってさ、分割コンパイルとかDLLの作り方とかレジストリに 書き込む方法とかのってないよななぜなんだ たぶんこのへんがみんな知りたいはずなんだけどな 俺なんていまだくそ長いソースしかかけないぜ
はぁ?
> DLLの作り方とかレジストリに windowsプログラミングの入門書を読め
587 :
デフォルトの名無しさん :2005/03/27(日) 20:31:58
それはCだけどCじゃねーだろ あんなのおぼえれねえよ
>>584 >たぶんこのへんがみんな知りたいはずなんだけどな
お前だけだよ。
>>584 貴方の言ってる内容で入門書を作ると
中途半端で死ぬほど使えない本が出来て終了ですから。
590 :
デフォルトの名無しさん :2005/03/27(日) 20:42:45
世の中使えない入門書が多すぎるな
591 :
デフォルトの名無しさん :2005/03/27(日) 20:59:49
動的に変化するポート番号を使うサーバーアプリケーションにアクセスするには どうしたらいいんですか?
592 :
デフォルトの名無しさん :2005/03/27(日) 21:00:54
>>591 ネットワーク版で聞くべきかな。
スマソ、聞く板間違えた。
入門書を使えない奴が多すぎるな
Cの入門書を買うレベルの人が レジストリ弄るってのも危険な気がする。
俺なんか初心者の癖にデバドラ書いちゃうもんねー
やろうとしている事の複雑さが判らないからこそ入門レベルなんであって。
597 :
デフォルトの名無しさん :2005/03/27(日) 23:40:10
>>584 C言語はWindowsパソコンのためだけにあるわけじゃないから。
パソコンで使う人もいるし、ロボットの制御に使う人もいる。
だからCの入門書は純粋に言語だけ解説して、それ以外の部分は
各自が環境にあわせてヘルプ読むなり、別の本を読むなりする。
598 :
デフォルトの名無しさん :2005/03/27(日) 23:48:06
まぁでもDLLはともかく分割コンパイルは載せるべきかと じゃないとstaticとかexternの意味がわからんだろ
普通の入門書には載ってると思う
のってるね
>>591 まず、サーバとは何か?から勉強汁!
サーバは固定ポートで待ち受けするから意味がある。
tesuto
>>584 > 分割コンパイル
普通に書いてある。
> DLLの作り方
環境依存
> レジストリ
OSの問題でCの話じゃない。
結論:C云々の前に、コンピュータに関する一般知識を身に付ける事が先決。
606 :
デフォルトの名無しさん :2005/03/28(月) 01:27:27
スキルがなくて答えられないのを スレタイのせいにして誤魔化そうとする 可愛げのないクソガキども
と、スレタイも読めないクソガキが申しております。
609 :
デフォルトの名無しさん :2005/03/28(月) 01:50:06
と、スレタイも読めないクソガキが申しております。
610 :
デフォルトの名無しさん :2005/03/28(月) 02:44:16
goto 606;
error ラベル '606' は定義されていません。
612 :
デフォルトの名無しさん :2005/03/28(月) 05:35:58
>>602 そうじゃない場合はどうするのかを聞いてるんですが。
たとえばwinnyとかはポート番号は人によって違うでしょ?
あと、ネットゲームとか。
以上、 「ネットワークプログラミングについて何も知りません。調べる気もありません。」 という宣言でした。
>>612 ftp のような実装もあるが、どっちにしろ初回は
特定のポートを決めないと何も出来ん。
いいから適切なスレに移動しろ。
中途半端に答えるな
2ちゃん歴10年の俺としては こういう厨が沸いてくると、ようやく「春が来たんだなあ」と感じるね。
619 :
◆/8LpUMqVAk :2005/03/28(月) 08:37:32
とりあえず、順番につないでみて規定の応答が返ってくるか調べてみたら?
ポートスキャン奨励ですか。春ですね。
春ですね
グローバル変数の初期化の順番というのは未定義ですか? /* グローバル */ HMODULE handle = LoadLibrary("foo.dll"); int g_b = func(handle); このように書いた場合上から順に実行されないと困るのですが。
>>622 不定。
グローバル変数の初期化関数でも作ってmainの先頭で呼び出せば?
>>622 , - == ニニ、 ‐- 、
//‐ 、‐'´\‐- 、`ヽ、\
/ヽ∠-イ \ \ \ ヽ ヽ
/ / / |! ヽ \ \ \ヽ ヽ
// / / l l |l ヽ \ \ 、\ l
li l/l l |-、,,,,,,,,,,、 \ 、\ l
i ! !l _, , \ 、\ l ________
l l /●) (●> :| l lノ|、 ! /
l l l イ '- | .! l | ! /
l l 、l ,`-=-'\ l l|、 | !< そんな初期化はできません
l l ヽトェ-ェェ-:) -r'.! l | ! \
l l ヾ=-' / / .! l | ! \
l l ヽ::::... / ::::|.! l | !  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
l l| \ヽ、 _{´ ̄ ̄ 〃 .l /! l | l
l l| ヽ!、ソf{ / ,rノ ! il\ | l
//| ,. l l'´ ! ヽー==''´/ / j !. \|
//ノ/ l l |ヽ / / /ll __`ヽ、
.// jヽ\// ! ヽノ/ /./ ll /r'ニ‐rヽ
//./\ヽ//ニニヽ ∠ニニ//ニjj‐'´彡/ ̄`l l
/// l j7/ゝニニVニニニ//ニ〃ニ/| |
.// .| j ///  ̄n }.  ̄ ̄// 〃 .| |
// !ノ / l l Uノ / V/ { | |
同じ翻訳単位なら保証されるんじゃないの?
628 :
デフォルトの名無しさん :2005/03/28(月) 20:38:39
>>605 > 分割コンパイル
c系の入門者は大抵ふれてない
> DLLの作り方
環境依存だがプログラムを作るなら必須だろ
> レジストリ
おもいきりCの話だろ
結論:何もわかってないな
>>628 レジストリ操作がCの話題だとは知らなかったなw
630 :
デフォルトの名無しさん :2005/03/28(月) 20:48:41
>>629 性格にはC++ とC#ね
俺はこの三つをまとめてCと呼んでいる。
段々お笑いに走ってきたな・・・
C#とC++の話題はC言語スレでどうぞ。 CgもOKです。
昨日から始めたものです。カッコのつけかたで for{ printf } とか for { printf } とか、色々ありますけど 一般的に見やすいプログラムの書き方ってどう書くんですかね?
ども、たいしたことじゃないんですね また疑問が出てきたらお邪魔します
dup2の使い方が分かりません。 前略 char buf[10]; char *str = "abcd"; pipe(fpipe1); pid = fork(); if(pid == 0){ sleep(1); close(fpipe1[0]); write(fpipe1[1],str,strlen(str)); exit(1); } if(pid > 0){ sleep(2); close(fpipe1[1]); if((c = read(1,buf,4)) > 0) buf[c]='\0'; printf(buf); } とすると子プロセスでパイプに書き込んだものが親プロセスで読み出せました。 この親プロセスのreadの部分を fd = open("aaaa",O_WRONLY|O_CREAT,0600); dup2(fd,fpipe1[0]); としてファイルに書き込んだり dup2(1,fpipe1[0]); fflush(stdout); として標準出力に出したりしたいのですが、何も出力が無く終了します。 使い方が間違っていますでしょうか。 教えてほしい。
640 :
デフォルトの名無しさん :2005/03/28(月) 22:36:59
ファイル分割の単位は、どうやって決めてますか? 大きすぎれば読みづらいし、細分化しすぎてもインターフェイスばかりだし、 今一つちょうどよい目安がはっきりしません
>>641 それぐらい脳内で翻訳単位へ置き換えしろ。
>>640 でかくてうざくなったら切れ
切るのがかったるかったら放置しれ
>>640 C++ のクラスっぽくするためにモジュール単位で分ける
でっかいモジュールはヘッダ用意してさらに分割
あんまりでっかいと ファイルスコープの static の意味が無くなるぞ
モジュール化がうまくいけば、インタフェースもすっきりするもんだ。
647 :
645 :2005/03/28(月) 23:17:56
>>646 御意
static じゃない関数なんて両手で数えられるくらいしかないもんな
648 :
デフォルトの名無しさん :2005/03/28(月) 23:19:12
>> unix版へgo
>>633 この間、Linux内のソースコードを掘り返して調べてみたら
(といっても10個程ランダムに取り出しただけだが)、関数は
void func(void)
{
;
}
の形式、制御文は
for (;;){
;
}
の形式っていう組合せが多数派だったな。
K&Rスタイルね
>>649 ヘッダ作るとき一行コピーしてセミコロン打つだけだからそうしてる
>>640 あまり細かくするとグローバルだらけになるから気をつけろ
>>652 それは設計が悪い。
つーか、スレ違いだってばよ。
中途半端に答えるな
char *pHead,*p; pHead = (char*)malloc(sizeof(t_data)+16); if( ((UINT)pHead%16) ) { p = 16 - ((UINT)pHead%16) + pHead; } free(pHead); みたいにして、pHeadを解放したのにp使ってもいいんでしょうか? とあるサイトにこのようなプログラムを見たんですけど。
よくない。 アライメントのサンプルみたいだが、 本当に続きがあるのか?
>>657 vector = (ps2Samp0FVECTOR *)align;
...
free(head);
これって...のところで使っていると言う意味であって、free()の後で
使っていると言う意味は含まれていないと思われます。
ホントだ。よく読もう自分...。
ありがとうございました。
>>656 >> 659
661 :
デフォルトの名無しさん :2005/03/29(火) 07:50:29
>>640 >>652 どのみちローカルには持ってこられない変数は、
変数名の衝突を避けられればじゅうぶんなので、
モジュール名を頭につけておく
Cの文法でモジュールスコープがあればいいが、ない以上は自衛するしかない
void hoge( char a ) {} int main( void ) { int e = 1000 ; hoge( e ) ; } こういう場合、キャストのあるなしは、好みの問題なんでしょうか? srand( (unsigned)time(NULL) ) としてる人がいるもので気になりました。
>>662 intからcharに限っては、C++では好み
Cでは警告が出る
timeの返値のキャストは必要
ありがとうございます。
gccでハイパースレッディングをフルに使う計算を行いたいのですが どのように書けばいいのか、URLか本を教えてください 並列プログラミングっていうやつなのでしょうか??
666 乙
intからcharへの型キャストって、どうして失敗しても何も起こらないの?
失敗て…。
>>668 int->charって上位ビットが消えちゃうじゃん!
それって失敗じゃないの?
もし上位ビットに情報が入っていて、それが消えちゃったら、ボク…どうしよう…
失敗しているのに放っておくのって良くないと思います!
はい、自殺します
674 :
デフォルトの名無しさん :2005/03/29(火) 19:52:09 ID:
>>667 何も起こらないとも、起きるとも、どちらとも保証されていない
キャストも変換も元の値が新しい型で表現できない値の場合、結果は未定義だからだ
extern int i;
hoge()
{
char c;
c = i; //may cause undefined-behavior
c = i & 0x7f; // ok always
}
質問者を装うった厨が紛れてる様だな。
unsigned の場合未定義じゃなかったことね?
>>676 なんでもちゅうちゅう言ってんなよ、このすっとこどっこい。
まじめにこの疑問を解決しろ。
こまっちゃう
getcharの戻り値はなんでintなの?
intってなんなの?
俺はintをインテジャー(integer)って言ってるけど違うの?
>>680 ISO/IEC 9899:1999 6.4.4.4 Character constants -2, -10で、
'a'の型がintであると定められているからだよ。
それは違うだろ。 実際、C++では'a'はcharだけど、何の影響もないし。 getcharが返すのは、unsigned char型の値をintに拡張したもの又はEOF で、単純にEOFをunsigned charの取りうる範囲以外にするためだよ。 一般的な2の補数形式だと charがsignedな環境で'\xFF'に相当する値を返す時でも 返ってくるのは'\xFF'(==-1)ではなく、0xFFであり EOF(負の整数)と区別される。
>>684 >C++では
いちいちCスレでC++持ち出すな。
バカかこいつ。 反証のための例示だろ。
あ、685はgetcharがC++にもあることを知らないのか。
アラインメントについて、 #pragma pack(1) ってやると、バイト境界が1バイトになると本に書いて あったのですが、#pragma は処理系依存で移植性に欠けるともありました。 #pragma を使わずに、同じようなことをしたいのですが、なにか方法はありますか?
>>688 ない。
そもそもCPUによっては8バイト境界を跨いでdouble値にアクセスすること自体ができない。
環境依存が嫌ならテキストにするかバイト単位で管理するしかない。
やはり出来ませぬか。 ご解答どうもありがとうございました。
明示的にパディングを入れて境界調整すれば多少はマシになる
692 :
デフォルトの名無しさん :2005/03/30(水) 22:58:56
>>686 C++ に限ったことじゃねえぞ、"一般的" とか何かボロボロだぜ、こいつ
693 :
デフォルトの名無しさん :2005/03/30(水) 23:10:04
ボロボロはおまえ
694 :
デフォルトの名無しさん :2005/03/30(水) 23:12:11
Cって時代遅れ言語のなのにさ学校とかでは未だにCの授業多いよな C#とかを覚えるほうがいいだろ。なぜCにこだわるんだろうね 先生は、俺がC#の本読んでたら先にCをやりなさいっていってくるんだぜ オブジェクト指向時代にCやる価値あるのか?
C出来ないの?
一つだけしか出来ないの?
俺はいきなりC++やC#から初めてもいいと思うけどな。 ただし後からで言いからCもマスターするべき。
何やっても構わんが、授業受ける気があるなら先生の言うことくらいやろうや。 あるいは授業時間外にきっちり先生と話してもいいだろうな。その価値とやらを。 理由分からずに勉強するよりいいだろうし、論破できりゃ次からC♯だよ。
699 :
デフォルトの名無しさん :2005/03/30(水) 23:46:07
アプリケーションがUNICODE定義をしない状態で、ある特定のコントロール(エディットボックス等)だけにUNICODEを 入力・表示させたいと考えていますがなかなかうまくいきません。 (もちろんUNICODE定義すればうまくいきますが、諸事情によりこれを定義することができません) もしなにかいい方法がございましたらご教授ください。 環境WindowsXP(SP2) VC++6.0 条件:@ダイアログベースでそのダイアログ上にいくつかのコントロールを 設定。 Aプリプロセッサには_UNICODEは設定しないようにする。 →アプリケーションのUNICODE定義は行わない)
>>699 UNICODE定義の大半はマクロの切り替えだから
明示的にUNICODE用APIを呼び出せばいいんでは?
というかスレ違いの悪寒
中途半端に答えるな
char str[]="0"; char str[]=""; ↑どう違うんですか? 下でやると後から文字列を代入したときにエラーが出ます。
704 :
デフォルトの名無しさん :2005/03/31(木) 00:07:32
そりゃそうですね。 なぜ上だとエラーが出ず下だとエラーが出るんですか?
706 :
デフォルトの名無しさん :2005/03/31(木) 00:13:04
>>703 上は2バイト確保
下はメモリ確保されてないじゃん
どっちにしても2バイト以上確保しなけりゃ
文字列入れちゃだめだよ
スクリプト言語でアルゴリズムを考えてCに書き写そうとしてたのですが、 スクリプト言語ではmod演算で、 -18%16 → 14 となってたんですが、VC7だと、-2になります。どっちも正しいのはわかるんですが これが環境に依存する問題なのか気になってきました。。。C言語では どの環境でも同じ結果になるのでしょうか
708 :
デフォルトの名無しさん :2005/03/31(木) 00:14:07
環境に依存する問題
>>705 型を考えろ
char str[]="0"; としたとき str は char[2]型
char str[]=""; としたとき str は char[1]型だ
確保していないメモリにアクセスするなよ
>>706 は文字列を理解していない。信じないように。
712 :
デフォルトの名無しさん :2005/03/31(木) 00:19:10
上は0と終端のnull文字を表す。よって二文字だ。 str[0]とstr[1]がある状態。 下は終端のnull文字だけが入っている。よって一文字だ。 str[0]=0
>null文字 nul文字だね
>>707 以前は処理系依存だったが C99 で明確になった
C99 に対応してなければどっちになるか分からない
今は 余りは常に割る数より小さくなければならない と規格で決まってる
715 :
デフォルトの名無しさん :2005/03/31(木) 00:22:17
>>706 >>708 適当に回答するのはやめれ恥かくから
文字列は基本中の基本
厨房はせめて本なりネットなりで調べて回答せよ
716 :
デフォルトの名無しさん :2005/03/31(木) 00:22:19
> char str[]="0"; これは char str[2] = {'0','\0'}; と同じ > char str[]=""; これは char str[1] = {'\0'}; と同じ
>>714 まじっ酢か・・・C99の規格も調べてみたいと思います
どうもです!
ありがとうございます。
後から
char str[]="0";
の方に"abc"を入れてもエラーにならないのに
char str[]="";
に入れるとエラーになるのはどうしてですか?
上は"0"と"\0"の2バイトで
下は"\0"の1バイトだから
>>706 さんの言うように2バイト無いといけないのですか?
>>718 そもそも範囲を超える文字列を入れるな( ゚Д゚)ヴォケ!!
じゃあユーザーからの入力で文字列を得る場合にはどうしたらいいんですか? 適当に範囲を取っていってもそれより多く入力されると範囲を超えてしまうんですが・・・
722 :
デフォルトの名無しさん :2005/03/31(木) 00:31:45
>>719 それを知ってれば質問なんかせんわ( ゚Д゚)ヴォケ!!
せっかくFAQがあるのにねぇ・・・
>適当に範囲を取っていっても 動的確保
725 :
デフォルトの名無しさん :2005/03/31(木) 00:33:34
726 :
デフォルトの名無しさん :2005/03/31(木) 00:41:35
>>718 1文字なら塗る文字いれて2バイト
2文字なら塗る文字いれて3バイト
つまり入力文字数プラス塗る文字確保せよということ
動的確保をしたらいいんですかね? 調べなおしてきます。 ありがとうございました。
>>727 それだけじゃないんだが。
faq読めって。
なんか漫才やってるみたい ボケと突っ込みが絶妙
ボケが質問者だけじゃないという事がミソだな
>>717 ちなみにC99非対応コンパイラでもdiv/ldiv関数ならC99の除算と同じ結果になる。(処理系依存にならない)
div/ldivはC89に存在するから大抵のコンパイラで使えるはず。
>>718 >char str[]="0";
>の方に"abc"を入れてもエラーにならないのに
>char str[]="";
>に入れるとエラーになるのはどうしてですか?
上が何かの偶然でエラーになっていないだけ。
恐らく、別のところで確保された別の領域が偶然すぐ後ろに確保されていただけ。
エラーになるのは、確保されていない領域に書き込んだから。
>>718 どのように"abc"をstrに「入れ」てるのかワカラン
エラーになるもならないも偶然だ
未定義とはそういうことだ
組み込みマクロに __LINE__ ってあるだろ これ整数型なんだよ マクロでなんとか文字列リテラル化したいんだが なんか妙案無いか? #define MY_LINE(l) #l #define LINE MY_LINE(__LINE__) これだと LINE を展開したときに "__LINE__" になってしまう どうしたらいいんだ?
735 :
734 :皇紀2665/04/01(金) 00:29:18
age忘れ...
736 :
デフォルトの名無しさん :皇紀2665/04/01(金) 00:50:51
#define xMY_LINE(l) #l #define MY_LINE(l) xMY_LINE(l) #define LINE MY_LINE(__LINE__) main() { puts(LINE); } ~~~ こうすると $ cat hoge.c | cpp # 1 "<stdin>" # 1 "<built-in>" # 1 "<command line>" # 1 "<stdin>" main() { puts("6"); } こうなるけど、 正解なのかどうか、しらん。
738 :
デフォルトの名無しさん :皇紀2665/04/01(金) 12:48:19
数値計算をやっているものです。 FORTRANで今まで書いていたのですが 世の流れに乗ってC言語を勉強し始めました。 んで、びっくりしたのがC言語の関数の遅さ。 たとえば、 #include <stdio.h> #include <math.h> int main(void){ double x,y; int n,loop,max; max=100000000; x=2.00; for( loop=1;loop<=max;loop++ ) {y=sqrt(x);} printf("%f\n",y); } FORTRANなら計測できないほど瞬時に計算するんですけど これは、コンパイラのせい?それとも、こんなもんなんでしょうかね。
739 :
デフォルトの名無しさん :皇紀2665/04/01(金) 13:02:40
同じ内容のソースをFORTRANでかいてそれぞれ実行時間を計測しましたが、 FORTRAN 2.0s C 50.0s でした。25倍の差があります。この差はどこに起因するのでしょうか? ちなみに、FORTRANでのソースは real*8x,y integern,loop,max max=100000000 x=2.00 do loop=1,max y=dsqrt(x) end do write(*,*)y end
俺には分からんけど、計測できないほど瞬時って「2.0s」のこと?
>>738 registerつけて、最適化オプションでコンパイルしてみると、一瞬で終る。
743 :
デフォルトの名無しさん :皇紀2665/04/01(金) 13:32:59
>>740 そうです。瞬時にってのは言い過ぎました。
>>741 ゆくゆくは配列などで計算させます。register宣言は使えません・・・
>>742 してません。こんな程度のプログラムにも
最適化オプションつけないといけないんですか...orz
当方、Cygwinでgccでコンパイルしてるだけですので・・・
勝手に最適化されちゃうよりは、 書いたままを実行してくれる方がデバッグしやすいけどなぁ。
cygwinが使ってるライブラリが遅いだけじゃないの?
デバッグビルド 約3秒 リリースビルド 最適化はVC7.1デフォ 一瞬 スゲーこんなにも違うなんて!
>>743 どこの Fortran だか知らないが、そっちは
デフォルトでは最適化されていないとでも?
fortranは最適化の塊だからなぁ。
>>747 VC++はデバッグのときにできるだけ生のまま見えるように、デバッグビルドでは最適化は一切行なわない。
当たり前だ。インライン展開されて消えてしまった関数をデバッグすることは不可能なのだから。
>>743 自分の不勉強を棚に上げてよくぞまぁ、言語批判などできるものだね。
いっそ世の流れに乗って自殺でもしてくれ給え。
↑ えらそうに 何様?
普段は大人しい
そうか それは、失礼しやした
>> 745 O3を、つけたところ、コンパイル時にけいさんしてしまい、ました。 そりゃ、はやい、だろ。 80481b9: 75 fd jne 80481b8 <main+0x14> 80481bb: 50 push %eax 80481bc: 68 9e a0 f6 3f push $0x3ff6a09e 80481c1: 68 cd 3b 7f 66 push $0x667f3bcd 80481c6: 68 2d 85 05 08 push $0x805852d 80481cb: e8 d0 16 00 00 call 80498a0 <printf> ... unsigned long long int value = 0x3ff6a09e667f3bcd; printf("%f\n", *((double *)&value));
エンディアン嘘付かないの「エンディアン」とはどういう意味なのでしょうか
755 :
754 :皇紀2665/04/01(金) 17:05:48
バイトオーダーだそう。自己解決しました。
ま、数値計算ではFORTRAN>>>>越えられない壁>>>>C 配列の決め方に自由度がないのも頭にくる。 でもループ文は色々あって嬉しいかな。
Linuxのプロセス間通信で、一対特定多数(マルチキャスト)は可能ですか?
758 :
デフォルトの名無しさん :皇紀2665/04/01(金) 17:21:45
>>754 エイリアン!!ばかいや〜んの合成語です
JavaDoc や perldoc のような埋め込みドキュメントの定番みたいなのってありますか?
文字列の中に特定の言葉があるかどうか調べたいんですけど Cに正規表現みたいな関数ってありますか?
正規表現は無理だけどな
>>764-765 ありがとうございます。簡単な事になら十分使えそうですね。
簡単なことにはこれを使って、正規表現は自分で関数を作ってみます。
最近の処理系ってintとlongのサイズ一緒ですよね?たいてい4バイト。 これってlongの存在価値なしってこと?何か違うのか?
769 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 23:07:31
腕が悪いのを道具のせいにする奴ほど たかがあんなもので音を上げるのさ
>>767 確かにそうだな。
でも逆に一昔前はintとshortのサイズが同じなのが当たり前だった。
>>767 いや、そもそもintの存在価値がない。
4/1だからといって、そんなまぬけな事言わないでくれ
>>767 >>これってlongの存在価値なしってこと?
かならずしもそうとは言い切れない。
例えば、変数 x のバイト長が4バイトであることを利用する
ようなプログラムを書くときに、int 型のバイト長が
2バイトの環境では同じコードをコンパイルしても動かないかもしれない。
でも、long型を使えば、その環境でも動く可能性が高くなる。
ただ、char型以外の型のバイト長は不定なので、longを使えば必ず互換性が保障されるわけ
じゃない。intの方が互換性が高くなる場合もあるし。コードを流用する環境によりけり。
774 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 23:39:26
>>773 そんなときは<stdint.h>のint32_tの類い。
ふ〜ん。じゃあintとlongのサイズが同じ処理系で実行する分には 冗長と言えるけど、サイズが違う環境での実行を想定して プログラミングしとくみたいな感じ?桁数が欲しいところはlongとか。 それで思いだしたのだが、floatよりdoubleが速いってのは都市伝説?
778 :
773 :int 2ch =05/04/02(土) 00:59:48
>>776 例えばそういう使い方もあるってことね。
773にも書いたけど、コードを流用する環境はさまざまだから、
それにあわせて最適な型を使うのが理想。
int、longの書き分けを必ずつかえといってるわけじゃないよ。
(r<<16 | g<<8 | b)の場合、r<<16の方が上位って思ってるけど、 合ってますか??
優先順位どうだったっけ
気になったら括弧。
まぁ、あっているわけだがね。
784 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 11:00:13
3次元配列のメモリを確保する関数を作ったのですが、 何か間違っている部分、危険な部分などは無いでしょうか。 まだfreeは書いていませんが、ちゃんと入れます。 #include <stdio.h> void ***MallocThree(int size, int z, int y, int x) { int zz, yy; void ***data; if((data = malloc(sizeof(void **) * z)) == NULL) return NULL; for(zz=0; zz<z; zz++) if((data[zz] = malloc(sizeof(void *) * y)) == NULL) return NULL; for(zz=0; zz<z; zz++) for(yy=0; yy<y; yy++) if((data[zz][yy] = malloc(size * x)) == NULL) return NULL; return data; } int main(void) { char ***hoge; hoge = (char ***)MallocThree(sizeof(char), 2, 4, 8); return 0; }
良いんでねーの。後は、確保したのとは逆の手順でfreeしてったら完璧。
それでもいいがこうした方が解放が簡単。 #include <stdio.h> #include <stdlib.h> void ***MallocThree(size_t size, size_t z, size_t y, size_t x) { size_t i; void ***data_z = malloc(sizeof(void **) * z); void **data_y = malloc(sizeof(void *) * z * y); void *data_x = malloc(size * z * y * x); if (data_z && data_y && data_x) { for (i = 0; i < z; i++) { size_t j; data_z[i] = data_y + i; for (j = 0; j < y; j++) data_z[i][j] = (void *)((char *)data_x + size * (i * x + j)); } } return data_z; } int main(void) { char ***hoge = (char ***)MallocThree(sizeof(char), 2, 4, 8); free(**hoge); free(*hoge); free(hoge); return 0; }
787 :
784 :int 2ch =05/04/02(土) 13:21:00
ありがとうございます。
>>785 分かりました。
>>786 かっこいいです。それでやりたいと思います。
788 :
786 :int 2ch =05/04/02(土) 13:42:42
しまった。こうしたほうがいいな。 if (!data_z || !data_y || !data_x) { free(data_z); free(data_y); free(data_x); return NULL; } あと俺だったら#define FreeThree(p) (free(**p), free(*p), free(p))も作っておく。
789 :
784 :int 2ch =05/04/02(土) 13:59:13
>>788 いくつかは成功している場合もあるから、その分を開放するわけですね。
790 :
!786 :int 2ch =05/04/02(土) 14:12:15
malloc()に失敗してもNULLが入ってるから free()しても大丈夫だけどね。
791 :
デフォルトの名無しさん :int 2ch =5年,2005/04/02(土) 16:16:20
free(NULL)って未定義じゃないの?
>>791 何も起こらないことになっている。C++のdelete NULL;も同じ。
>>791 freeの中で
if(p == NULL)
return;
となってる。
俺は自分でもチェックしてるけど。
794 :
784 :int 2ch =5年,2005/04/02(土) 16:47:05
>>794 FreeFour1, 2, 3, 4 と関数を分けなくても、こうすると良いよ(動作未検証)。
void FreeFour(void ****data, int T, int Z, int Y)
{
int t, z, y;
for (t = 0; t < T; t++) {
for (z = 0; z < Z; z++) {
for (y = 0; y < Y; y++) {
free(data[t][z][y]);
}
free(data[t][z]);
}
free(data[t]);
}
}
796 :
784 :int 2ch =5年,2005/04/02(土) 17:05:05
>>795 ありがとうございます。
メモリを確保していなくても対処してくれる部分ですね。分かりました。
>メモリを確保していなくても対処してくれる部分
意味がよく分からないけど、
FreeFourOne(), ..., FreeFourFour() を結合したのが
>>795 ね。
char ****p = MallocFour(sizeof(char), 1, 2, 3);
FreeFour(p, 1, 2, 3);
で済むよ、って話。
ごめ、MallocThree(), FreeThree() だわ。ごめん。
関数のポインタってあんまり使わないものなんですか? 分かりにくくなるから使わないほうがいいって教わったんですが
>>799 Cでオブジェクト指向プログラミングをしようと思ったら、わりと良く使う。
でも、そうでなければほとんど使わない。
また、ある種の関数ではアルゴリズムを分割したいときに使うこともある。
801 :
デフォルトの名無しさん :2005/04/02(土) 17:54:01
>>799 おれ組み込み屋だけど、超のつく有力アイテム
見た目がアレだけど、それで拒否反応起こすような奴ぁお呼びじゃない
もっと物凄くアレなものがごろごろいるんで
個人的には関数のポインタ使うなら C++覚えてオーバーライド使った方がいい気がする。
>>799 WindowsのWndProcならよく使う。というより無いと話にならない。
コールバックに必須だし。 もちろん、標準ライブラリのqsortやbsearchにも。
だってここCスレでしょ C++は論外
C言語で「関数の先頭にローカル変数を書くルール」が意味するのは 関数の引数の分とローカル変数の分をまとめて(順番は追求しない) スタックに入れるのを明示的(分かりやすく)に表す為? C++ではどこで書いてもOKですが、処理的には同じ? 気になったので質問しました。
fgetsとは逆に、上の方へ向かってファイルを読み込むいい方法ってないですかね? fseekで順に戻っていこうかとも思ったんですが、無駄に重そうなので……。
>>807 コンパイラを複雑にしたくなかったんでしょ。
C++は動作がぜんぜん違う。
>>808 ない。
tail -r のソースでも見てみたらどうか。
寝言は寝てから言え
>>807 >スタックに入れるのを明示的(分かりやすく)に表す為?
コンパイラが楽、って理由じゃないかと。
C++ は宣言したときにコンストラクタが呼ばれるっつー事情もあって
(途中で関数抜ける場合にまで余計な処理をしないように)
使う直前で宣言すればいい事に。
C は宣言だけなら何もしないんだけど、でも使う直前で宣言できる方が
いいってんで C99 では出来るようになった。
>>807 最新のC99ではC++同様どこでも宣言が書けるようになった。
>>808 あまり巨大なファイルには無理だが一旦メモリに最初から最後へと読み込んでからメモリ上で並べ替えるようにしたらどう?
814 :
デフォルトの名無しさん :2005/04/02(土) 21:24:03
すみません、すごく基本的なことなのですが、 typedef char MOJI とかするとMOJIという型を宣言できますが、 typedef void sigfunc(int) という宣言はどういう意味なのでしょうか? とあるソースを見ていたらこんなのがあったので…
>>814 int型の引数を1つ取り戻り値の無い関数型sigfuncの宣言。
816 :
814 :2005/04/02(土) 21:41:27
>>815 ありがとうございます!!
恐縮ですが確認させてください。
ということは、
void (*sigfunc)(int);
と同じことでしょうか?
>>816 それは「int型の引数を1つ取り戻り値の無い関数へのポインタ型」
ただ、関数型を引数・戻り値に指定すると配列と同じように関数へのポインタ型へ変換されるから
引数・戻り値では両者が同じように扱われるのは事実。
818 :
816 :2005/04/02(土) 22:00:55
>>817 ありがとうございます。
まだピンとこないのですが、なんとなくわかりました。
実は、UNIX系ではsignal()という関数がありまよね。
これの宣言の意味が全然わからずこまっているところなのです。
void (*signal(int sig, void(*func)(int)))(int)
となっていますが
void (*signal)(int)
なら意味がわからないのでもないのですが、signalの後にある
引数達の意味が全然わからないのです…
DOSの実行ファイルをつくったのですが、explorerから実行すると 一瞬だけ表示されすぐに終了してしまい困っています。 どうすれば、この問題を解決できるのでしょうか??
.exeをクリックするだけで、動作するようにさせたいんですけども、、。
>>820 キー入力待ちで止めるとか。
後はスレ違いなので該当スレへ。
>>818 そこまで判っているなら、後は順番に解釈すればいい。
signal()の第一パラメータはint sig、第二パラメータはvoid(*func)(int)ということ。
そして戻り値はvoid (*)(int)、つまり第二パラメータと同じ型。
>>818 typedef void (*signal_handler_t)(int);
signal_handler_t signal(int sig, signal_handler_t func);
と同じ意味。
>>818 これなら解るかい?
/* 引数にintを取り、voidの戻り値を返す関数へのポインタ型に、Fという別名を付ける */
typedef void(*F)(int);
void f(int){}
/* 引数にint,Fを取り、F型の戻り値を返す関数signalの宣言 */
F signal(int, F);
>>818 >signalの後にある引数達の意味が全然わからないのです…
一番右側にある(int)は戻り値の型の一部なんだよお
827 :
816 :2005/04/02(土) 22:29:18
>>822 >>823 >>824 ありがとうございます!わかりました!
ただちょっと不思議なのは、
void (*signal)(int)
は
void (*signal(int))
と書くこともできるんでしょうか?
なんとなく
void (*signal(int sig, void(*func)(int)))(int)
は
void (*signal)(int sig, void(*func)(int))(int)
と書いてもよさそうな気がしてしまったので混乱してました。
void (*)()() って何だよ。
829 :
デフォルトの名無しさん :2005/04/02(土) 22:38:13
>>827 関数ポインタが *() ではなく (*)() という形をしている理由から考えればいい
理由とは、後置の () と単項の * の優先度を変更する括弧であることだ
830 :
816 :2005/04/02(土) 22:43:58
あ! みなさんありがとうございます。何となく気づきました。 void (*signal(int sig, void(*func)(int)))(int) を関数型の変数の宣言と勘違いしていたのかも知れません。 これはsignalという関数のプロトタイプですよね。 皆様すごく親切に教えて頂きほんとうにかんしゃです。
>>810 なるほど、見てみます。
>>813 んー……それも考えたんですけどね……やっぱり巨大なファイル厳しいとなると敬遠……
ども、参考になりますた
>>831 折衷案としてファイルの中身を丸ごと読み込まず、
数百KBなどずつ読み込んで引っくり返すようにするってのはどう?
hcreate()ってプログラムの中でひとつのハッシュ表しか使えないんですか? だとしてこれは役に立つことがあるんでしょうか?
834 :
807 :2005/04/02(土) 23:30:58
レスThanks どこでも宣言が有効になるのは何か複雑な気持ち...。 バージョンアップとか進むの速過ぎ...。 機能拡張とか不要なモノ(主観)まで増やさないで欲しい。 本当に必要なのか疑問に持つこともたまに。 なんか愚痴っぽくなってしまって、ゴメン
>>832 実際の所、すぐ前の行に目的が有るだろうから多分それが良さそうですね……。
「ありえないだろ」の部分までやっぱり作んないと駄目かなぁ……
>>834 宣言の場所が自由になったのは便利なことだと思うけど。
ま、可変長配列とかはたしかに要らないと思う。
>>808 読み込むメモリアドレスを逆にしてくとか。
839 :
838 :2005/04/02(土) 23:53:02
やっぱ忘れてくれ。
最初に各行のオフセットだけ全部記憶してfseekで手繰ってけば?
可変長配列は要るだろ これでもうalloca()を使わないで済む
842 :
784 :2005/04/03(日) 02:38:28
>>802 なるほど。それだと1回のmalloc、freeで済みますね。
ありがとうございます。
>>843 ホントだ。それも忘れてくれ...。一番深いの要素しか考えてなかった。
845 :
844 :2005/04/03(日) 06:26:10
>>843 と、思ったら確認ミスだった。
どこがやばそう?
C99が使えないのであればこう直せばいい。 char *p3, p4; printf("%p\n", &p3[k + j * x + i * x * y]); MallocTwoにはこういうときWin32APIだけどHeapCreateが便利。 途中で失敗してもメモリリークの心配が要らなくなる。
847 :
844 :2005/04/03(日) 08:53:14
ちょびちょび確保するよりかは、
やっぱり
>>786 みたいに一度にしていく方が良いね。
>>802 のは、ポインタで繋いでないから用途が限られてくるし。
malloc(size*x*y*z)じゃだめなん?
使い方による。
>>848 802もMallocTree/Fourはそうなっている。
char *cp; int hoge; sprintf (cp, "%d", hoge); 「値が割り当てられていないローカルな変数 'cp' に対して参照が行われました。」 と警告がでるのですが、このままじゃ何がまずいんでしょうか? char *cp = "\0"; とかするべきなんでしょうか。
>sprintf (cp, "%d", hoge); cp が指す場所に書き込むんだからさ、まず cp が指す場所を指定しないと。 こんな感じかなあ。 char buf[100] = "\0"; char *cp = buf; /* cp に buf を指させる */ int hoge; sprintf(cp, "%d", hoge);
853 :
851 :2005/04/03(日) 12:44:47
>>852 あ、なるほどポインタの指す先がまだ確定してないからなんですね。
もう少し突っ込んで聞きたいんですが、
char buf[100] = "\0";
char *cp = buf;
は、 cp はメモリのどこかに実態を持った buf のアドレスを指していて、
sprintf(cp, "%d", hoge); でその buf のアドレスに hoge を書き込んでるんですよね。
>>851 の sprintf (cp, "%d", hoge); は警告を無視すれば期待通り動いてくれているんですが、
このときメモリの中のイメージはどうなっているんでしょう?
>>853 適当なアドレスに書き込んでる。
動く場合もあれば、クラッシュする場合もある。
たのむからそんなアプリを外に出すなよ。
855 :
851 :2005/04/03(日) 13:03:10
>>854 はい、やはりそうなんですね。分かりました、すぐ直します!
相談してよかった。
>>856 そのページ、微妙に間違いが多いからリンクするの止めようよ。
それに、>851はポインタと配列を混同する以前の状態じゃないかと。
要素数9の配列ポインタへのポインタを宣言したつもりなのですが、 どうしてこれはエラーになるのでしょうか? #include<stdio.h> void hoge( char *(*)[9] ) ; main(){ char*(*test)[9]; hoge(test); } void hoge( char *(*a)[9] ){ char *p = (char*)0x11111111 ; *a[0] = p ; return ; }
1. test は char へのポインタを指すポインタの、要素数 9 の配列 だが、意図した通り? 2. test を初期化していないようだが。
VCでもgccでもエラーにならなかったけど?
要素数9の配列ポインタへのポインタは char (**)[9]
レス下さった皆さま、有難う御座いました。
じっくり読んでて、なんとか違いが見えてきました。
あと、
>>860 さんがおっしゃるとおり、エラーは出ませんでした。なにかでミスしてたみたいです。
口で説明しようとすると、だるい。 感じとしては↓のような... #include <stdio.h> void hoge(char *(*p)[9]); main() { char *test2[9]; hoge(&test2); printf("%p\n", test2[0]); printf("%s\n", test2[1]); } void hoge(char *(*a)[9]) { (*a)[0] = (char *)0x11111111; (*a)[1] = "あーてすてす"; }
864 :
デフォルトの名無しさん :2005/04/05(火) 13:02:04
初歩的なことで申し訳ありませんが、 VC++でC言語のコンパイルをしました。 内容はコマンドプロンプトからファイル名を入力して出力するプログラムです。 わからないのは、コマンドプロンプトでどのようにして実行すればよいのでしょうか? ソースは以下のとおりです。 #include <stdio.h> #include <stdlib.h> intmain(int argc, char *argv[]) { FILE*fp; charch; if(argc!=2){ printf("入力ミスです。\n"); exit(1); } if((fp = fopen(argv[1],"w"))==NULL){ printf("ファイルを開くことができません。\n"); exit(1); } printf("fdaf"); while((ch = fgetc(fp))!=EOF) putchar(ch); fclose(fp); return 0; }
866 :
デフォルトの名無しさん :2005/04/05(火) 13:28:12
>>864 char ch → int ch
fopen(argv[1], "w") →fopen(argv[1], "r")
とりあえず気が付いた間違いの指摘だけ。VC知らんし。
868 :
864 :2005/04/05(火) 14:58:13
>>865-867 質問の仕方がまずかったです。
VC上でC言語のプログラムを実行したのですが、
argcとargvへの入力の過程が無いまま実行が始まってしまいます。
どのようにすれば入力できるのでしょうか?
>>868 コマンドプロンプトから「プログラム名 コマンドライン引数」という具合に打つ。
>>868 出来上がったEXEファイルのあるフォルダを開いてそのEXEファイルへ何か他のファイルをドラッグアンドドロップするのでも出来る。
871 :
864 :2005/04/05(火) 15:43:44
>>869 そのように入力しても読み込んでくれませんでした。
VCの作業フォルダの、どのファイルを実行させて、
入力させたいファイルはどのフォルダに入れておけばよいのでしょうか?
>>870 思いつかなかったです・・・。
ちなみに複数個でこのようにする方法はありますか?
(argvの指定をする)
>>871 半角スペースを空けて指定する。
a.exe argv1 argv2 argv3 ... argvN
半角スペースが含まれる引数は、"" で囲んで指定する。
a.exe hello world "hello world"
argv1 = hello
argv2 = world
argv3 = hello world
いい加減うざいからVCスレに行くなりPC板に行くなりしてくれ。
874 :
864 :2005/04/05(火) 15:58:57
>>872 そこまでは分かるのですが、ファイルを入力させたい場合が分からないです。
exeファイルがあるフォルダにおいてもだめでした。
>>873 コンパイラはVCを使っていますが、
書いているコードはCの方なので・・・。
プログラムの起動引数の指定方法なんてCの範疇じゃないよね。
>>874 「だめでした」では何がだめなのかわからんよ。何をしたらどうなったのか書かないと。
>>864 他人の指摘に対して、反論する前に我が身を省みる習慣つけなさいよ。
あんたは何の質問をしているの。
Cのコードの質問している?
そうではないでしょ。
仮にそうだとしても、C言語ピュアな質問用のこのスレよりも初心者向けのスレの方が適切。
878 :
864 :2005/04/05(火) 16:10:18
>>876 プログラムは正常に終了したのですが、
ファイルを開くことができませんでした。
>>871 どっちも絶対パスで指定すればいい。
コマンドプロンプトの画面にドラッグアンドドロップすれば入力する手間は省ける。
>>878 開けなかったことはどのように確認した?
「コマンドプロンプト」の意味が分かってないヨカン
882 :
872 :2005/04/05(火) 16:23:40
>そこまでは分かるのですが、 分かってるのに訊いてたのかよ('A`)
まあまあ
>>878 「何をしたら」はなぜ書かない?
それから正常終了したって書いてるけど、ファイル開けないのなら正常終了じゃない
ように思うけど、具体的にどうなったの?
とにかく、答える人の負担を減らすことを考えて、できるだけ具体的に書くこと。
質問のしかたから勉強するべきだな。
親切なのが多いな今日は
やたーヽ(´ー`)ノ
しまった!!今気付いたよ 889ゲットー!!うれしくねー
890 :
889 :2005/04/05(火) 16:49:53
( ´_ゝ`)
「ハンガリアン記法」について、 よくナンセンスといわれていますが、グローバル変数に g_ とか つけるのは良いと感じました。だから、自分で作るプログラムにも、 それだけは使用していますが、やはりこれもナンセンスなんでしょうか?
あ、というか自分が一番聞きたいのはポインタ変数の頭に p とつけているのが無駄かどうかでした。どうかご指南、ご指摘ください。
Cならまだ分かる>ハンガリアン C++ならウザイし醜いだけだと思う。 大体pつけて意味あるの?スマートポインタにもつけるの? スコープを表す語をつけるのはいい心がけだと思う
いまどきCでばりばり書いてる香具師かこわるい
ありがとうございます。 p をつけるのはちょっと、どれがポインタかわからなくなった経験からでした。 無意味に感じてきたし、この機会にやめておこうと思います。
896 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/05(火) 23:00:29
近々C言語を使っての就職試験があります。 簡単な質問ばかりなのかもしれませんが、 助けてください。 現在独習C学習中・・・。
897 :
デフォルトの名無しさん :2005/04/05(火) 23:01:29
わかったフリする奴つかえねー
898 :
デフォルトの名無しさん :2005/04/05(火) 23:02:21
わからんことに問題意識ねえやつもダメ
899 :
デフォルトの名無しさん :2005/04/05(火) 23:12:04
ポインタ変数をpでプリフィクスするのは合理性があると思うけどな。
901 :
デフォルトの名無しさん :2005/04/06(水) 04:29:40
int *start, *end ; int a[] = { 1, 2, 3, 4, 5 } start = &a[0], end = &a[4] ; while( start < end ) //←● { ...略 } ここの条件式ってまずいですか? 素人なんで良くわからないですが、リトルエンディアンとかどーとか が関わってきたりして(?) 配列の &a[0] のアドレスが、&a[4] の アドレスより小さくなっているという、保障がないんじゃないかと、 心配になってきました。
start < end が真になる事は保証される。 エンディアンは関係ない。
903 :
デフォルトの名無しさん :2005/04/06(水) 06:21:04
1リトル、2リトル、3リトルエンディアン〜♪
while(true) これじゃいかんのか?
バカはすっ込んでてね
>>901 なんでわざわざそんなまどろっこしい事をする?
添え字でループすればいいだろ。
C++ならイタレータとして使うためと言えるが。
908 :
デフォルトの名無しさん :2005/04/06(水) 10:12:35
901 は例です。 エンディアンは関係ありませんでしたか。 それを聞けてやっと安心できました、どうもありがとうございました!
ぐぁ、早とちりしちゃったorz 真になる事が保証されるのは、わかってるつもりなのですが、 配列の先頭と後方のアドレスの値の大小関係が、必ず 『 先頭 < 後方 』 になっているか、他プラットフォームとかでもそれが保障されているのか が、不安なのです。連レスすみません。
そんな心配をするなんて、 もしかして右から左に日本語を書く人ですか?
そのぐらい馬鹿な質問でしたか・・・ よかった。
>>909 「配列とは何か?」を考えれば自ずと答えが見えてくるだろ。
( ´,_ゝ`)プッ C厨はこれだから困る
915 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 14:59:23
gets関数のことなのですが、 説明ではエンキーが押されるまで文字列を読み続けるとありますが、 プログラムを実行するとエンターキーを押していないのに次の命令を実行してしまいます。 どうしてでしょうか?
916 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 15:07:01
for(;count<100; count++){ if(count<100){ gets(code[count]); gets(data[count]); } }
917 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 15:07:46
上のようなコードです。
>>915 OS、コンパイラー依存だ、がんばってね
919 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 15:14:21
>>918 OSはXPで、コンパイラはVC++6.0です。
別のプログラムで実行すると普通に動作するのですが、
現在作成しているプログラムではすり抜けてしまいます。
何かおかしな命令を書いてる可能性があるのでしょうか?
入力バッファに改行コードが残っているとか
921 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 16:07:05
>>920 有難うございます、そのとおりでした。
main関数でscanfを使い、呼び出す関数を番号で選択して入力して、
問題の関数を呼び出していたからでした。
fgets使え
>>916 countは何時どこで初期化しているのか?
for文の処理をしていないという可能性は考えたのか?
デバッグには想像力と推理力が必要だぞ
>>921 scanf()もgets()も使うな。私の勤める会社なら、確実に減点されるぞ。
なに使こうたらええの?うち、わからへん…
大方、ページテーブル、セグメントとかワカランチンだからな。
927 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 16:29:19
>>924 そうなんですか?
では何を利用したら良いのでしょうか?
929 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 16:31:07
どうして使っちゃいけないんですか?
931 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 16:40:47
fgetsを試してみたのですが、どのようにしてキーボードから入力したらよいのですか?
>>930 大きさを指定できない。(scanfでは出来なくもないが書式文字列に直接埋め込むことになるので面倒)
char buf[16];
gets(buf);
もしこれで16文字以上入力されたら配列に入りきらない。
Cとしては配列の宣言時の要素数を超えてしまうとその結果は未定義になる。
場合によっては悪用されるとセキュリティーホールにもなりかねない。
いわゆるバッファオーバーランになる。
>>931 char buf[16];
fgets(buf, sizeof buf, stdin);
933 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 17:00:27
934 :
930 :2005/04/06(水) 17:11:08
935 :
デフォルトの名無しさん :2005/04/06(水) 17:45:37
小規模板でMMO作ってるみたいだよ。 期待だね。俺に参加するよっ!!
936 :
デフォルトの名無しさん :2005/04/06(水) 17:53:21
ローマ法王は異教徒です。異教徒は悪魔と同じです。異教徒を拝むなんてありえません。
939 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/07(木) 05:50:19
質問です。 コマンドプロンプトからargcと*argv[]を入力して、 ファイルを読み込もうとしているのですが、 コマンドプロンプトのメッセージが「数値を入力してください」となり、そこから先に進みません。 C言語とは関係ないのかもしれない上に、ものすごく初歩的なのかもしれませんが教えてください。
pl386.nas911.yamaguchi.nttpc.ne.jp(210.139.48.130)
>>939 環境によるが、コマンドプロンプトから
prog.exe param
などの様に打つと、
argcに「2」、argv[]に「prog.exe」「param」が格納される。
と言う環境がほとんどだ。
それ以前に、君は「コマンドプロンプトとはどのようなものか?」
から勉強すべきだろう。
943 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/07(木) 09:18:34
>>941-942 以下のようなプログラムです。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
char ch;
long l;
if(argc!=2) exit (1);
実際にdirで見ても表示されますし、プログラム的にも間違いは無いは無いと思うのですが、
何か原因があるのでしょうか?
プログラムが間違ってる。そのプログラムにはファイルを読み込む部分が無い。
945 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/07(木) 09:46:40
>>944 実際にはこの下にもプログラムが続いています。
しかし、printfでチェックしてみたのですが、上記のifにすらプログラムが進んでいませんでした。
なんだかよく分からないけど、 「数値を入力してください」 って表示する別のコマンド実行してるんじゃないの? 自分で作ったコマンドの名前は何なんじゃ?
情報を小出しする馬鹿につきあってると疲れるぜ?
これ以上環境やらIDEやらの質問が続くなら続くんなら他スレ行けよ。
プログラム名とコマンドが同じとか?
int main(int argc, char *argv[]) { <-これ に対応する } <-これ まで出てこないと、わかりません。
落ちたな
コマンドライン引数の事を聞く奴はこんなんばっかだな…。
結局解決したが、アホらしい原因だったので、説明するのが面倒で逃げたんだろうな。
956 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/07(木) 12:16:59
結局原因が分かりませんでした。 付録のサンプルコードをコンパイルしてみても駄目だったので、 コマンドラインの指定の仕方が不味かったみたいです。 ただ、他のソースは無事に実行できるので、 できなかったことはねじ伏せます。 いろいろ教えていただいたのにすみませんでした。 いよいよ構造体だ・・・。
>>956 他人の意見・質問をスルーするなら書き込むな。
958 :
950 :2005/04/07(木) 12:43:31
959 :
デフォルトの名無しさん :2005/04/07(木) 14:04:33
文字列を数値として大小比較できる関数はありませんか? 文字列"0000000000000000001234567890"と 文字列"1234567890"は等しいと判断させたいのです 桁数が大きいので数値に変換するのは無理っぽいです
先頭から続く0を無視すれば良いだけだろ
"0000000000000000001234567890"なら32bitのintに 変換できる筈だがな。 32bitに収まらない数も扱うなら、long long int型でも使えば?
まぁ、文字のままで比較するなら、 1.先頭の0を除く 2.文字数を比べる 3.文字数が同じなら、strcmpで比べる で出来る。
"9999999999999999999999999999"
>2.文字数を比べる この必要性が分からない。
965 :
デフォルトの名無しさん :2005/04/07(木) 14:44:36
>>964 大小比較だからじゃない?
ん?strcmp?しらね。
new BigDecimal("0000000000000000001234567890").equals(new BigDecimal("1234567890"))
こっちかな? new BigInteger("0000000000000000001234567890").compareTo(new BigInteger("1234567890"))
スレ違いになってきたぞ。
>>964 strcmp は辞書順だから、桁数が違うと
"1000"< "200" になる。
面倒くさいので動作テストはしてない。 数値以外の文字の混入は考慮無し。 int CmpNumStr (char *a, char *b) { int n; while (*a == '0') a++; while (*b == '0') b++; n = strlen(a) - strlen (b); if (n < 0) return -1; if (n > 0) return 1; return strcmp(a,b); }
よく考えたら、strcmpの帰り値は、 -1や1だという規定は無いから、 n<0 n>0 のままで返していいか・・・ int CmpNumStr (char *a, char *b) { int n; while (*a == '0') a++; while (*b == '0') b++; n = strlen(a) - strlen (b); return n ? n : strcmp(a,b); }
さぁ、いよいよ構造体だ・・・。
スペースは? カンマは?
読み飛ばせよ
976 :
デフォルトの名無しさん :2005/04/09(土) 07:44:28
小数点以下は? 記数法は?
(*(*hello)[5][5])[5] 一体、hello には何が入るのですか?
>977 そんな変数を宣言していること事態が間違いの始まり。 データ構造を見直した方が良いと思われ・・・
980 :
デフォルトの名無しさん :2005/04/09(土) 11:17:40
>>979 アフォか
見たこと/使ったことのない宣言が出てきただけで設計ミスであってたまるか
経験値低いぺーぺーがわかったつもりになってるとそんなことを言い出して無駄に流れを乱す
現在○%、みたいに処理の進行状況をprintfで表示したいんですけど %の部分はそのままで○の部分だけを上書きして表示していくにはどうすればいいんですか?
標準ライブラリではたぶんできない。
通常の端末なら、 for (ic = 0; ic <= 100; ++ic) { printf("%3d%%\r", ic); } で巧いこと表示できるかもしれない。
できる。
ncurses使うと楽だよ。
>>983 スゲー
今試してみたらできました!!
ありがとうございます
>>985 ウインドウズです
その他のレスくれた人もありがとう
>>977 世界地図を二次元座標表現し各地域での挨拶を表現する文字列の先頭4文字を座標上に配置したデータ全体へのポインタがhello。
これを惑星ごとに用意して切り替えることができる。
989 :
983 :2005/04/09(土) 12:33:54
あーちくしょう。 fprintf(stderr, ...)にしないとリダイレクトで喰われるし、フラッシュされないからダメって書きにきたら… ウィンドウズだったか(ヶ
みんな
>>988 みたいに理解できてるのかと思うと鬱だわ
頭のメモリが足りねえ・・・
ワロスww