2
5 :
デフォルトの名無しさん :03/03/30 12:40
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>1 ,5,6
激しくスレ立て失敗の予感 俺の計算で言うと同じ質問量でもいつもの約2倍の速度でスレが消費されていく感じ
9 :
デフォルトの名無しさん :03/03/30 12:53
>>8 あ〜あ、「ぬるぽに聞け」なんて書くから・・・
調子にのんな!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>1
ダメだこりゃっ
14 :
デフォルトの名無しさん :03/03/30 15:58
>>1 > まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
> 質問する前には最低限Googleで検索を。
> GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo!
> ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
> コンパイラを探しているなら
>>2-13 を。
> 上記を逸した場合の結果は激しく未定義だゴルァ!!
条件つけすぎなんだよ!ぬるぽざけんな
ぬるぽだこりゃっ
ぬるぽに聞けってなんだよ! 失敗スレですか?
保守派が怒っている・・・
次スレはまだですか?
式だろ?
なんだよこのスレタイは
22 :
デフォルトの名無しさん :03/03/30 16:42
そんなことより、引数ってなんて読むの?「いんすう」でいいの。 辞書で調べてものってないよ
23 :
デフォルトの名無しさん :03/03/30 16:44
main()関数はプロトタイプ宣言じゃないよね??
int main(void)っていうのは 関数プロトタイプ宣言じゃないよね??
int main(int,char **); ↑ユーザー定義関数からmain関数を呼び出すことはないからいらないと思う・・・ int main(int argc,char **argv) { return 0; }
C言語ははこのスレと共に終了ぬるぽってことで
30 :
C言語3日目 :03/03/30 17:18
プログラミングって面白いですね。
31 :
デフォルトの名無しさん :03/03/30 17:52
さっさと挫折しろ!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>30
33 :
デフォルトの名無しさん :03/03/30 19:02
>>1 にある、プログラミング言語C(通称K&R)の問題ほとんどとけました
同じレベルか、勉強になるようなスレを紹介してもらえませんか
35 :
デフォルトの名無しさん :03/03/30 19:07
>>33 もう「C言語」はいいと思うので、
「ぬるぽ開発 〜UNIXユーザの為の実践ぬるぽ講座〜」
をお勧めします。
にゅりゅぽ
ぬるぴょ
TCP/IP絡みの本でも読んでみれば?
ここはぬるぽスレですか? 塗る歩スレはもういりまん
また、ぬるぽかぁ…
>>40 ぬるぽにであってから、その名前に良く出会うようになった気がする。
>>22 ウチのPC(ATOK)だと「ひきすう」だと引数に変換されるけど
「いんすう」だと変換されない。
よって「いんすう」だと思われ。
44 :
デフォルトの名無しさん :03/03/30 21:58
読み方なんてどうでもいいじゃん。 どうせ、戻り値も引数も無いくせに、 「ファンクション」を訳して「関数」とか言ってるバカ訳なワケだし。
というわけで、引数と書いてargumentsと読む。これ最(略)
function は函数だろうに。
戻り値がないのは、ファンクションとは呼べるが、関数とは呼べない。 だからファンクションの正確な訳語を希望する。
functionの訳語がファンクション。 で、ファンクション⊃関数。
挨拶と開会宣言、閉会式がないのは進行表とは呼べるがプログラムとは呼べない。 だからプログラムの正確な訳語を希望する。
GPLに感染してしまいました。 どうしたらいいですか?
52 :
デフォルトの名無しさん :03/03/30 22:45
>>48 Pascal の用語で行こう!
返値が ない ものは「procedure = 手続き」
返値が ある ものは「function = 関数」
>>54 戻り値を返しても、副作用があるとそれは関数じゃないから、厳密には違うらしい
っつか、呼び方なんてどうでもいいような
戻り値があってもなくても、functionでいいや。 関数といわずにfunction。
最近のCだとvoid型の関数の戻り値受けれるんですが
あまりのネタスレっぷりにワラタ
60 :
デフォルトの名無しさん :03/03/30 23:51
return 0 とはどういう意味でつか??
program -> 式次第
C言語が絶滅するかは知らんが このスレはこのままでは絶滅危惧種に指定されますよ?
にるぽ なるぽ ってのは どうよ?
*ってのは「X」に「-」なのか「X」に「|」なのか?
>>65 66-67 のが一般的っぽいが、どちらでもいいらしい。
こんな風に線が 5 本しかないものもある。
↓
^
* <- けつの穴 つーか、Cのスレではないのかよ?
asteriskなんてどの向きでもいいんじゃ無いか?星であれば
* アメリカではstarといいます、よろしくね
星=starじゃん と、つぶやいてみる。
( ´∀`)<ぬるぽ
なぁ、すごくどうでもいいことなんだが ->ってみんな何て呼んでる? やっぱりアローが一般的なのか?
(・*・)アナルー
>>75 アロー演算子を再定義しよう、とか言わない?
ここはCか、スマヌュ
マイナスダイナリに決まっとる
tinko->analの中身にアクセスしたいとき tinko->*anal と *(tinko->anal)どっちが正しいの?
>>81 ->* はC++のメンバポインタ演算子だ。
また *tinko->anal というようにカッコは不要です。
なんかデサシテルってゲームとかの 必殺技でありそうでかっこいいな。
出さしてる
85 :
デフォルトの名無しさん :03/03/31 04:57
Cでは$に特別な意味って無いよね? てことは、識別子の名前に使える?
英字(_を含む)と数字のみで構成され、先頭は英字でなければならない。 また、Cの予約語と同じ名前はつけられない。 確か処理系によっては$が使えたような・・・
Cの関数定義ってByRef使える?
>>87 参照渡し?
参照渡しならできないよ。C++ならできるけど。
ポインタ使うのはだめなの?
あれキモイよね。 func(a, b); って書いてaやbが書き替えられるなんて。
>>89 きもいよね。
Stroustrup自身もそういう使い方はするなって言っているし。
91 :
デフォルトの名無しさん :03/03/31 08:31
巨大なデータブロック(全て連続している)をゼロクリアする、一番はやい方法は?
memset
mmap
96 :
デフォルトの名無しさん :03/03/31 11:28
bcopyってなに?
97 :
デフォルトの名無しさん :03/03/31 11:32
98 :
デフォルトの名無しさん :03/03/31 11:56
前進?
94 宛てですた 100 get
電圧かかってないから0
>>101 回路中でたくさん電気が蓄積されてる罠。
結構、何分かは完全に消えない罠。
103 :
デフォルトの名無しさん :03/03/31 13:41
便乗になっちゃうんですが 前スレの922に出てきた unsigned short int GetLength(unsigned char data[]){ return (data[0] << 8) + data[1]; } この関数の動きがよくわかりません。 どのような動きをしているのか ご解説いただけないでしょうか? お願い致します。
>>103 先頭の二バイトに文字列の長さを入れてるってことじゃねーの? 前スレ見てないけど
105 :
デフォルトの名無しさん :03/03/31 14:01
>>103 data[0]とdata[1]の合成。
前スレの922は単なる煽りだが・・・
>>103 答えは 105 の通りだが、使われている演算子の機能をひとつひとつ落ち着いて
考えれば自明だ。
普通+じゃなくて|を使わない? |だと問題があるんだっけ?
みなさんありがとうございます。 この仕様で文字列の長さと char型の配列を返せるんですね!? 皆様のアドヴァイスを下に 演算子を丁寧に見てみます。
+ だと桁上がりがあり得るわけだが・・・
>>108 この場合は正直、どうでもよろしい。
>>109 > char型の配列を返せるんですね!?
否。
105 をどう解釈したらそのようになる?
正解は仕様が不明なので何とも言えないが、おそらくは先頭 2 バイトに文字列長
を記録している方式の文字列だろう。
>>110 定数 8 を使っているところに不安は残るが、それを考えなければあり得ない。
あり得るあり得ないの問題じゃなくて意味的にビット単位の論理和を 使用するべきだろう。
>>113 この場合は、ビット単位の論理和を使用するべきではない。
>>113 あんたは 16 進数からバイナリを得る場合も論理和を使うのか?
例が悪いな。 10 進数とか。
既に数値になっているものを渡すんだろ?
基数なんか関係ないんじゃ?
つーかさ、エンディアンも考慮されてないコードにそんなにムキになんなよ、パゲ
>>!11サソ ご指摘ありがとうございます。 動きはなんとなくわかったのですが 前スレ922では char date[1];を int Resultに代入していますが int型にchar の配列を代入できるのでしょうか?
>>120 それは「配列を代入」しているのではなく、
「配列の1番目の要素を代入」しているのではないのか?
122 :
デフォルトの名無しさん :03/03/31 15:18
printfの%sにNULLを渡すと(null)などと表示されるのは勝手な拡張?
ガッ
(´∪`)にるぽ
パスカル?
パスカルにポインタなんぞない! ……かもしれない
(´∀`)。oO○なるぽ
なるぽど
129 :
デフォルトの名無しさん :03/03/31 16:39
object poscalは ^p あれp^だっけ忘れたぽ
>>129 ^pですな。
object付かないのも同じだったと思うけど、TurboPascalの方言かも。
int main() { struct sockaddr_in dst; ... ... ... ... ... ... do_connect(dst); ... ... ... } void do_connect(struct sockaddr_in dst) { connect(socket_fd, (struct sockaddr_in *)&dst, sizeof(dst)); ... ... } こういうコードで、connect文で passing arg 2 of `connect' from incompatible pointer type が出てしまいます。何故でしょう。。。 connectへの他の引数は正しいとします。 mainの方で、dstも適切に設定されているとします。 構造体ってこういう感じで引数として渡せないんですか?
わたせない
すみません。キャストする型を間違っていました。 >struct sockaddr_in * struct sockaddr * でした。ありがとうございましt。
connect の第二引数は const struct sockaddr *
先に解決されてしまたっか
>>130 MPW Pascalもそうだった。
p^な。
138 :
デフォルトの名無しさん :03/03/31 19:23
char hoge[8]に文字列"hogehoge"を コピーしたいと思い、 strcpy()を使いました。 そうするとstrcpy()は使わないほうがいいよと 忠告してくれた人がいるんですが なぜなのかがわかりません。 strcpy()の問題点と代替関数があれば 御教授いただきたく思います。 厨房で申し訳ございませんが よろすくおながいいたします。
使わない方がいい
それ以前に文字列の取り扱いを勉強したほうがいいと思われ
memcpy()
>>138 "hogehoge" は9文字ある (hogehoge + \0)
char hoge[8] は8文字しか入れられない
あとは考えてくれ
>>138 strcpyの問題点というと、コピー先のサイズがあふれるかどうか感知できない点かな。
こういうこと;
char baka[2];
char hoge[] = "hogehoge";
strcpy(baka, hoge);
bakaには2バイトしか大きさがないのに、9バイトコピーされてしまい、
結果バッファオーバーフローがおきる。
けどこういうのはstrlenを使うなりすれば前もって検知することは可能なんで、
strcpyを絶対に使うなという話にはならない。
ちなみに標準関数にはstrncpyという一見コピー先のサイズに合わせてくれるような
関数があるけど、こいつの仕様はヘンなので使わないほうがよい。
自前でサイズを見る関数を作るとかするといいよ。
>>144 末尾に'\0'を付加しない場合があるというのは別に変ではないと思うけど、
コピー元が指定したバイト数よりも短い場合は0で埋めるってのは変な仕様だよなぁ。
ミナサン ご教授アリガdです 終端文字が溢れてしまうわけですか。。。 なるほど、勉強になります。 とりあえずstrcpy(hoge, "hogehoge");と ベタ書きしていたのですが hogehogeを変数に代入してから memcpy()するのが安全?なんでしょうか? 文字列の扱いはなんか制約が多いイメージが 強くてコワヒ・・・ (((((゚д゚;)))))ガクガクブルブルブルブル
147 :
デフォルトの名無しさん :03/03/31 20:24
>>146 Cは何するにも制約が多いです。
Javaを使いましょう。
>>147 "制約"はJavaの方が多い
C++だ
>>147 Javaは何するにも重いです。
Cを使いましょう。
直接マシンと会話ができる 機械語をおすすめします。
C++だと struct Foo; と書けばFoo構造体の宣言ができるけど、 Cだとどう書くの? 下の関数の宣言だと void func(Foo *f); 構造体の宣言だけで済む (コンパイラ依存が減る)ので これをCでやるにはどうするのか、という質問です
152 :
デフォルトの名無しさん :03/03/31 20:49
CもC++も同じだが。 違いといえばC++の場合はtypedefしなくてもタグ名が型名になるということか。
struct Foo { ...... }; ←構造体定義 struct Foo a; ←構造体宣言 void func( struct Foo *f ); ←関数の引数に使う場合 ただ、構造体定義のとこで typedef struct Foo { ...... }; ってやっちゃうことが良くあるんでないかな。そうすれば、宣言や引数のときに「struct」を省略できる。
154 :
デフォルトの名無しさん :03/03/31 20:55
>>153 > typedef struct Foo { ...... };
typedef struct { ...... } Foo;だろ。
155 :
制御屋さん見習中 :03/03/31 20:57
教えてください。 F[0][0]= -1.301309e-06 こんな数があったとき、10^(-6) のみ取り出す良い方法あり ませんか? お願いします。
>>155 浮動小数点数に対して==を使ったらうまくゆかなかったってやつか?
157 :
制御屋さん見習中 :03/03/31 21:00
>>156 ええっと、純粋に10の何乗のオーダーかっていうのが
知りたいのです。
> typedef struct { ...... } Foo;だろ。 そうです、これの形でよくやります。 こうやってtypedefしてたら、どうやって宣言するのでしょう? 関数の引数でも戻り値でも、「構造体へのポインタ」しか つかってないときには…
>>158 新しい型を定義したんだからint等と全く同じように使える。
ということは、ヘッダで、途中でいきなり void func(Foo *f); という関数宣言がでてきても、Cコンパイラから 未知の型:Foo とかおこられないで、大丈夫なの? C++なら struct Foo; void func(Foo *f); とFooについて宣言する必要があるけど…
>>157 log()とか使って計算するしかないのでは?
>>155 sprintfでも使ってeの後だけ切り出す手もあるねぇ
164 :
制御屋さん見習中 :03/03/31 21:12
>>161 ありがとう!
それは思いつきませんでした。
>>160 なんでその宣言の前にtypedefを書こうと思わないわけ?
>>160 に補足
なんと聞けばいいのかな…
extern typedef Foo;
とかできるの?
つまり、型定義の宣言(?)みたいな
>>166 typedef struct{
int a;
char *b;
} Foo;
void func(Foo *);
こうだよこう。
>>167 これだと、Fooについての実体をかいてますよね?
つまり、Fooの実体を変えるた場合、コンパイルを
やり直す必要がある(コンパイル依存が生じる)。
必要なのは「(構造体への)ポインタ」だけなのに…
ポインタであることさえわかれば、構造体の実体が
どうなっていても、ポインタのサイズは一定値なので
不要なコンパイル依存性を除去できるのですが…
169 :
デフォルトの名無しさん :03/03/31 21:20
int (*fns[])(struct gmstat*) = {gmmain, gmrank, gment, }; を誰か説明してください。お願いします。わけわからんです。
>>151 とりあえずやってみろよ。
話はそれからだ。
>>168 の補足
C++だとヘッダファイルは以下ですむ
#ifndef FOO_FUNC_H
#define FOO_FUNC_H
struct Foo;
void func(Foo *f);
#endif
Fooの実体については何も書いていないので
コンパイラ依存がない。
つまり、Fooが定義されているfoo.hが変更されても
foo_func.hは関与しない
>>168 ヘッダーファイルに関数の宣言を書くということは、他のファイルからもその関数を呼び出すんだろ?
>>168 ポインタのサイズは一定でも、「なにの」ポインタかはコンパイラが意識する必要があると思え。
一度stdio.hでも見てみればいいのに。
>>169 順番に型宣言でもして分解すればわかるだろう?
>int (*fns[])(struct gmstat*) = {gmmain, gmrank, gment, };
intを返す、struct gmstat*を唯一の引き数とする、関数へのポインタの配列fns、
それをgmmain, gmrank, gmentの3つの要素で初期化する。
つまり、
struct gmstat foo;
int rtn = fns[0](&foo);
と
int rtn = gmmain(&foo);
が等価なわけだな。
で、どうせなら
static int (*const fns[])(struct gmstat*) = {gmmain, gmrank, gment, };
にしておけ。
> ポインタのサイズは一定でも、「なにの」ポインタかはコンパイラが意識する必要があると思え。 それは、実際に必要な時まで、コンパイラが意識するタイミングを 送らせる(プログラマが調整させる)ことができますよね? 「Effective C++」の34項 「コンパイルするファイル間の依存性はできるだけ減らそう」 の話をしているつもりです… これのC版のsttructはどうするのかなぁ、と。 やっぱりタグ名を使って冗長(?)に extern struct Foo_tag; void func(struct Foo_tag *f); とでもするのでしょうか?
C++でできるならC++でやればいいのに。
> C++でできるならC++でやればいいのに。 それはそうなのですが…(^^; Cでやるにはどうするのかな、と。 すみません、マルチポストっぽくって申し訳ないのですが これからC++のスレでも質問させてもらいます…
>>168 要するに、構造体のメンバを隠蔽したいということか?
だったら、構造体を不完全型として宣言すればいい。
構造体へのポインタ「だけ」が必要な関数には、
typedef struct foo foo;
という宣言だけを見せて、メンバへのアクセスが必要な関数には、
struct foo { ... };
という宣言を見せればいい。
関数を使う側が構造体の中身や大きさを全く知る必用のない関数といえば・・・・fopenを初めとするファイル操作関数か? それはそれで構造体の構造を変更しても、関数を使う側のファイルはコンパイルし直さなくても良いような気がする。
>>179 > これからC++のスレでも質問させてもらいます…
C++での方法を知っているのになぜ質問する。
内部を隠蔽したいならC++を使うのが正解だと思う。
>>180 の言うようにCでもできるがダブルスタンダードになって
保守性が落ちるだけのような気がして気持ち悪い。
「C++でできることがCではどうなるか」疑問に思うのはいいが、
違う言語なのだから必ずしも同じように使わなくてもいいと思うのだが。
#名前空間の所為で、Cだとtypedef struct foo {int foo;} foo;なんてできるのだし。
ぬるぽに相応しいスレになってきたな
えと、興味本位で聞いているわけでなく、 実際にCでかいていまして…
Cの構造体でプライベートメンバを書くにはどう書くの? という質問が次は来るに 2,000ヌルポ
CでできることはC++でもできるんじゃないの?ならまだしも、C++でできるのならCでもできるんじゃないの?と思うのはおかしい。
189 :
デフォルトの名無しさん :03/03/31 22:26
コンパイルし直さなくてはならなくなるとまずいの? コンパイル時間がもったいないとか?
151からはJava厨の臭いがする
Javaはさわったことがないです… やってみたいと思っているんだけど… しいていうならC++厨です C++スレで質問したのですが、CならCの流儀にしたがえ とアドバイスをうけました。 ですので、タグ名をつかってみることにします (typedefをせずに) 荒らす気はなかったのですが、みなさんに迷惑を かけてしまいました。 どうもすみませんでした。
C++スレに答え出てるぞ。 がんがれ
194 :
デフォルトの名無しさん :03/03/31 22:42
C言語の型の概念について教えてください。 もしくは説明されてるサイト教えてください
198 :
タマちゃん :03/03/31 23:42
#include "stdio.h" main() { func1(); } func1() { printf("a"); } をコンパイルしようとすると、 5: Warning: function 'func1' undefine -- assumed to be int って返ってきてしまいます。 どこが間違ってると思います?
>>198 解1)
#include "stdio.h"
func1()
{
printf("a");
}
main()
{
func1();
}
解2)
#include "stdio.h"
void func();
main()
{
func1();
}
void func1()
{
printf("a");
}
200 :
タマちゃん :03/03/31 23:49
解説するとCはコンパイル時に前方参照しない。 mainの中でfunc1が出てきたときにはコンパイラはfunc1のプロトタイプは知らない。 知らないから、ファイルを読み進んでその先にあるかもしれないfunc1の プロトタイプを知ろうとはしない。これが前方参照をしないの意味だ。 で、プロトタイプがわからない関数にぶち当たったときコンパイラは intを返す関数だと仮定して処理を進める。これはCの規約でもある。 コンパイラがだしてるwarningはそのことを言ってる。 そのwarningを意訳すると、 「funcなんてしらねえよボケ、intを返すと見なすからそのつもりでいろや」 と言ってる。 んで、解1の方は前もってfuncの定義をしておくもので、 解2はコンパイラにfuncのプロトタイプを与えるというものだ。
202 :
デフォルトの名無しさん :03/04/01 01:02
intとint long intの違いってなんですか??
sizeof(long int) >= sizeof(int) intは処理系にとってもっとも自然な整数型。 同じサイズの処理系もあるし、違うサイズの処理系があってもよい。 たぶんおまいのさわれるコンパイラはサイズが同じなので違いはない
204 :
デフォルトの名無しさん :03/04/01 02:15
仮引数をポインタとして定義することによって、 実引数にも影響を及ぼすことができるサンプルプログラミングですが 本に書いてあるとおりにやって何度も確認してるのですが どこが間違えてるか分かりません。おしえてください。 #include <stdio.h> void swap(int *pX,int *pY); int main(void) {int num1=5; int num2=10; printf("変数num1の値は%dです。\n",num1); printf("変数num2の値は%dです。\n",num2); printf("変数num1とnum2の値を交換します。\n"); swap(num1,num2); printf("変数num1の値は%dです。\n",num1); printf("変数num2の値は%dです。\n",num2); return 0; } void swap(int *pX,int *pY) {int tmp; tmp=*pX; *pX=*pY; *pY=tmp;}
>>204 >swap(num1,num2);
swap(&num1,&num2);
&がない。よく本見てみ
swap(&num1,&num2);
207 :
デフォルトの名無しさん :03/04/01 02:32
>>205 >>206 ありがとうございます!!正常な数値がでました。
ところで何故こうなるのでしょうか??
void swap(int *px,int *py);で宣言するときに
*pxおよび*pyは数値ですよね?
で、呼び出すときは swap(&num1,&num2);
と &num1および&num2はアドレスですよね?
つまり、&num(アドレス)を*px(数値)に代入することなんてできるんでしょうか?
int a=10; int *ap; ap=&a; これをやってるのと同じ。
可変長配列を管理する構造体? struct name { int namelen; char namestr[1]; }; ってのが,C FAQ に載っていますが, この使用に関して危険性は無いのでしょうか? 素人目には,かなり恐い感じがするのですが. namestr[xx] のアドレスが危険な領域である可能性は無いのでしょうか?
210 :
デフォルトの名無しさん :03/04/01 02:41
>>207 関数内でint *px; を宣言して
引数のアドレスがコピーされるようなもの。
>>209 超ある。
ってかnamelenを何に使うのか説明してくれ。
212 :
デフォルトの名無しさん :03/04/01 02:45
>>209 ていうか
mallocとかであらかじめメモリーを確保するから大丈夫
struct name *pname; pname=malloc( sizeof(struct name) +9 ); としたら pname->namestr[9] まで問題ない。しかしそれ以降は危険。
214 :
デフォルトの名無しさん :03/04/01 03:13
僕は、VisialC++6.0のコンパイラを使っています。 すごく初心者の友達がプログラムを覚えたいらしく、教えてあげることになり ました。(僕もそんなに知識はありませんが)。使える言語が少ないのでC言語を 教えることにしました。ただ、友達はただがいいらしいのでそれを探したところ、 Borland等があるみたいですね。教えるために僕もBorland等をインストール しようと思っているのですが、VC++が有るパソコンにそれを入れるとどうなりますか。 ぶつかって動作がおかしくなったりしませんか。教えてください。長文ですいません。
自分で実験しろ! あと結果報告も書いてね。
>>211-213 わかりました.
この場合 namelen はプログラマが陽に管理することになるんですね?
pname=malloc( sizeof(struct name) +9 ); のとき
pname->namestr[9] までOKなので,例えば
pname->namelen = 10; と設定してやるとか.
struct name {
int namelen;
char * namestr;
};
とすれば
struct neme namae; のとき
namae.namestr = xx;
namae->namestr = (char*)malloc(xx);
と出来ますよね?こっちのほうがいいような.freeしにくいのか?
この構造体のメリットは配列長情報を格納できることなのでしょうか?
いまいちピンとこないのですが,有効な利用法などはあるのですか?
Win のビットマップファイルのフォーマットにこんな感じの構造体使ってなかったっけ。
http://www.catnet.ne.jp/kouno/c_faq/c2.html 209はCFAQでもダメだって書いてる。
どうやって
"配列namestrが複数の要素を持つように振る舞わせる"んだろ
char namestr[1];みたいな場合
namestr=ポインタ;
みたいな表現は許されないような気がした
217の方の使い方はいろいろあります。
最初にxxの大きさで割り当てた後
もっと大きいサイズが途中で必要になったりしたときとか長さが無いと困るし
そういうことをする関数を作った場合引数がごちゃごちゃしないとかかなあ
220 :
デフォルトの名無しさん :03/04/01 06:36
>A: この技巧は人気がある。ただしDennis Ritchieは「Cの実装への根拠 のない馴れ馴れしさ」と呼んだ。 >公式な解釈によると上の技巧は Cの 規格に厳密には準拠していないと考えられる。 >(この技法が正しいか どうかを取り巻く議論を尽くすことは、このFAQの守備範囲を越えて いる。) >しかし世の中に知られている全てのコンパイラの実装で、こ の方法は移植性が高いようである >(配列の境界を注意深くチェックす るコンパイラは警告を出すかもしれない)。 >別のやり方としては、可変長の要素の大きさを、小さく取るより、非 常に大きく取ることが考えられる。上の例でいえば、 >char namestr[MAXSIZE]; >ここでMAXSIZEは配列namestrに保存されうるどんな名前よりも大きい。 しかしながらこの技法も、規格の厳密な解釈によると許されないよう だ。 駄目とは書いてないような・・
>>219 今読み直したら厳密な解釈では駄目ってことか。 汚してスマン。
>>217 ファイルフォーマットに可変長データ部分がある場合
ヘッダを一気に読んでこういう構造体にあてはめると効率が良いよ。
コンパイラの特性に依存してるから、移植性はほとんどないけど。
>>221 しかし、C99 では認められている気配。
LSI-Cの試食版でないコンパイラを使っている人はどれくらいいるんだろう・・・
それくらい。
>>224 そういえば、
>>9 のコンパイラ一覧にLSI-Cの試食版は入ってないな。
俺も昔はお世話になったが、やはりintが2byteはもう過去の遺物だろう。
でも、LSI-Cの試食版使いやすいよな。 俺がC始めたときは環境変数とか全然分からなかったから、 自動でパス通してくれるのは本当にありがたかったよ。
>>198 #include "stdio.h"
ビクビクガタガタ
ところで、純粋にC言語の勉強をするだけなら、gcc(cygwin)がお勧め。
ネットにさえ繋がればインストールは難しくないし、無料。
ただし、グラフィック関連は難しいので、あくまでも「C言語だけ」の世界だが。
cygwinなんて歪なもん勧めんなよ。
まったくだ
純粋にC言語の勉強がしたいならcygwinに対応しているOSは糞
割と意味不明だな
cがchar nがint型として c=n;とすれば良い所を可読性を良くする為、あえて c=(char)n;としても遅くなったりしませんか(ループ内とかで)? 内部的な動作は良く知らないので教えてください。
>>234 うほっ、そりゃまずいっす。 情報サンクス!
>>233 よく知らないけど
ハンガリアン表記すりゃあ、そんな必要無くなる罠。
>>233 > cがchar nがint型として
> c=n;とすれば良い所を可読性を良くする為、あえて
> c=(char)n;としても遅くなったりしませんか
処理系依存なのでアセンブラに落として同じコードになるか確かめろ。
まあたいていは、全く同じになるので遅くならない。
それだけなら、まあ変わらないだろうけど、int a, b; char c; c=(char)(a+b); c=(char)a+(char)b; みたいなのだと、結果は同じでも速度は変わる。
教えてください。 以下のようなプログラムを実行します。 int main() { int i, j, n_1, n_2; double K[M][N]; n_1 = 4; n_2 = 2; printf(" n_1 =%d\n", n_1); printf(" n_2 =%d\n", n_2); func( A, B, P, G, n_1,n_2,K); printf(" n_1 =%d\n", n_1); printf(" n_2 =%d\n", n_2); return EXIT_SUCCESS; } すると、n_1とn_2の値が、func()の後で どちらも0になります。 func()内部で、n_1、n_2は値を参照しているだけです。 (for文のループに使用) 何故変わるのか理解できません。 宜しくお願いします。
funcが分からん これだけの情報で分かったら神 引数を値を代入するような用途に使うのはいかがなものかと
> 引数を値を代入するような用途に使うのはいかがなものかと 正規の方法では、ポインタを使わない限り、それは意図しようが無い。 唯一 K がポインタ渡しになっていると思われるので、その扱いを間違えた func() の バグだろう。
>>244 >funcがスタック内容を壊してるから
これってどう言う意味ですか?
唯一でもないか・・・A, B, P, G の正体もわからん。
(´-`).。oO( func晒せばいいのに
>>248 長いのですが、、、
int func( double a[N][N], double b[N][M], double p[L][N], double g[M][N],
int Ncol,int Nrow,double K[M][N])
{
int i,j,k;
double InvF[N][N],s,tmp[10][10];
for (Pole_Count = 0; Pole_Count < Ncol; Pole_Count ++){
if(p[1][Pole_Count] == 0){
if(Pole_RealCal( a, b, p, g, Ncol) == 0){
/* エラー処理 */
return 0;
}
}else{
if(Pole_ImgCal( a, b, p, g, Ncol) == 0){
/* エラー処理 */
return 0;
}
}
}
for (i = 0; i < N; i++)
for (j = 0; j < M; j++) K[i][j] = 0.0;
return 1;
}
>>249 自己レスです。
バグが分かりました。
K[][]の初期化を誤っていました。
(NとMが逆)
for (i = 0; i < N; i++)
for (j = 0; j < M; j++) K[i][j] = 0.0;
大変失礼しました。
当方win98 +Cygwin +gcc -Wall でコンパイルしています。
この様なバグは、見つけるのが難しいと思います。
皆さんはどのようにして、発見しているのですか?
NだのMだのわかり辛い変数名は使わない
配列の範囲外まで弄ったのか。
>>244 の予想どうりでワロタ
・二次元配列は使わない。 ・ループ制御変数であっても一文字は避ける。 ・ループの中身が一文だけであってもブロック化する。 ・変数名を大文字で始めない。 ・配列全体の初期化はmemset()を使う。
>>251 、253
ありがとうです。
行列を扱いたいので、2次元配列を使いたいです。
・ループ制御変数であっても一文字は避ける。
これは、どういう意味ですか? i、jはやめろということですか?
・ループの中身が一文だけであってもブロック化する。
{}を付けろということですね。
・変数名を大文字で始めない。
了解です。
・配列全体の初期化はmemset()を使う。
これは知りませんでした。情報ありがとうございます。
>>248 私ならば、こうすると言う話だが。
Cの二次元配列は一次元目を固定サイズにしないといけないので使い難いと思わないか?
だから二次元配列の代わりに一次元配列で済ませるのが習慣になっている。
例えば配列全体の平均値を返す関数にするならこんな感じだ。
double CalcAverage(double const *pArray, size_t width, size_t height)
{
double sum = 0;
int iy;
for (iy = 0; iy < height; iy++) {
int ix;
for (ix = 0; ix < width; ix++) {
sum += pArray[ix + iy * width];
}
}
return sum / (width * height);
}
もしix + iy * widthが鬱陶しいなら、
#define pos(x, y, w) ((x) + (y) * (w))
とでもすればいい。そうすればpArray[pos(ix, iy, width)]と書ける。
最大値がsize_tでループ変数がintってのはどういうもんかとチャチャ入れ
あ、間違えた(w
コピペしたもんだからそういうことに。
指摘THX
>>256
いったいどこが間違ってるんですか? #include <stdio.h> int main(int c, char **v) { c--; if(c<0)return 0; printf("%s ", v[c]); return main(c, v); }
変数の値と、その変数名を表示する関数。 void hogeprint( int, char * ); を作成しました。 #define STR(x) #x int main() { int value = 100; ... hogeprint( value, STR(value)); ... } としたとき、"value"の示す文字列の生存範囲は関数内のみになるのですか? それとも、main 関数が終わるまでになるのでしょうか?
return main(c, v);
>>260 261
そこが間違っているのですか?
なにが違うのでしょうか?
>>258 エラー E2120 test.c 13: プログラムの中からは main を呼び出せな・・(ry
Cの main って再帰できないんだっけか
>>254 meschachはどうでしょ
俺は使ったこと無いですけどヘッダを見る限り
新たに配列を作ったり配列の大きさを変更したり
コピーしたり簡単な演算をしたり
と言うことは簡単にできそうです。
行列MATは行数、列数と2次元配列のように見せかけるポインタ
を持つ構造体みたいに宣言されてます
>>264 は嘘 C++はできないけどCなら出来るよん。
>>258 プログラム名の表示がおかしいってこと?
>>258 ていうか、どんな風に問題があるのか書かないと
どうしようもない。
>>269 その文字列リテラルの生存期間が分かりません.
>>259 の場合はどうなるのでしょうか?
>>271 一般的にはプログラムの動作開始から終了まで。
>>169 > int (*fns[])(struct gmstat*) = {gmmain, gmrank, gment, };
int (*gmmain)(struct gmstat *);
int (*gmrank)(struct gmstat *);
int (*gment)(struct gmstat *);
これを配列にして、その配列の名前を fns と付けた。
どんどん分からなくなってきました.
>>272 >>273 レスありがとうございます.
if
>>272 char str[] = "abc";
char * str = "abc";
前者:ただの char型の配列(自動変数)
後者:文字列リテラル "abc" の先頭アドレスを格納するポインタ str 自身は自動変数だけど,
宣言・初期化が,どこで行われようとも "abc" という文字列はプログラムの実行中
常にどこぞかのメモリ領域を占有することになる.
if
>>273 後者の宣言・初期化を行ったとき,ブロック内処理を終えると同時に,
文字列も姿を消し利用可能なメモリ領域となる.
う〜ん,所で
>>273 のようであるとしたら,結局
#define STR(x) #x
hogeprint( value, STR(value));
のときの "value" は,関数(hogeprint)内でのみ存在するのでしょうか?
逆に,
>>272 であるとすれば,
printf("hogehoge %d\n", value); を行うプログラムでは
実行中ずっと "hogehoge %d\n" という文字列リテラルを,
どこぞかのメモリ領域に有していることになる???
>>274 何を今頃とち狂ったレスをつけてるんだ?
俺もやってみたい struct gmstat *型の引数でint を返す関数のポインタ を保持する配列fnsを3個用意してそこに gmmain, gmrank, gmentを代入してるってことですか int *(fns[])(struct gmstat*)の場合はfnsは struct gmstat* 型の引数 をもちint *を返す関数の配列であってますか? int *fns[5](struct gmstat*) のばやい "int * を5個保持する配列"を返す関数fns?
>>277 最初の解釈、「要素数3の配列fns」だ。
それから、関数は配列にできない。できるのは関数のポインタだ。
280 :
デフォルトの名無しさん :03/04/01 18:58
文字列とポインタについて char *str="hello"; printf("文字列は%sです。\n",str); return 0;} っていうコードなんですが *strっていうのは、数値のことで strっていううのは、アドレスのことですよね?? それなのに printf("文字列は%sです。\n",str); これだと文字列が格納されている変数のアドレスが表示されそうなのですが きちんと文字列が表示されるのは何故でしょうか??
>>279 かなり考えたのになかなか分からなかったのに
わずか5分で間違いを指摘されるとは。
うーん考えてみると関数のポインタのサイズは知ることができても
関数のサイズってあまりピンとこないし、配列にできないのは
不思議では無い気がしてきました
>>280 printf()が、%sに対応した処理としてそう表示するように実装されているから。
>>280 %s の場合はアドレスを貰って
'\0'まで表示させるように定義されているから。
>>281 あぁ、書くの忘れてた。
配列を返す関数も定義できないのでその積もりで。
それと、型が複雑になりそうならtypedefを使うといい。
/* int要素5個の配列の型定義 */
typedef int (int5_t)[5];
/* int5_tへのポインタを返す、intを引き数とする関数の一例 */
int5_t *func(int foo)
{
static int5_t sArr; /* static int sArr[5];でもいい */
return &sArr;
}
/* intを返す、intを引き数とする関数の型定義 */
typedef int fnInt_t(int);
/* fnInt_t型の関数のプロトタイプ */
fnInt_t foo;
int bar(int);
/* fnInt_t型の関数へのポインタの配列 */
static fnInt_t *const fns[] = {foo, bar,};
285 :
デフォルトの名無しさん :03/04/01 20:15
#include <stdio.h> #include <stdlib.h> int main(void){ char *str; int num,i; printf("何文字のaを用意しますか?\n"); scanf("%d",&num); str=(char *)malloc(sizeof(char)*(num+1)); if(!str){ printf("メモリが確保できませんでした。\n"); return 1;} for(i=0;i<num;i++){*(str+i)='a';} *(a+num)='\0'; printf("%sを用意しました。\n",str); free(str); return 0;} このコードに間違いあるでしょうか??
どうしてもエラーが出るよ〜ヽ(`Д´)ノウワァァン!!
> *(a+num)='\0'; *(str+num)='\0'; じゃないの?
関数のポインタで盛り上がっているようですので、ついでにもひとつ教えて下さい。 わたしの理解では、関数のポインタは、別の型の関数のポインタとのみ変換して、 また、元に戻すことができるはずです。 しかるに、とある Linux のライブラリ関数に、次のようなものがあるのですが、 こいつの結果を関数のポインタにキャストするとやはり具合が悪いんでしょうか。 void *dlsym(void *handle, const char *symbol);
voidポインタのサイズと関数ポインタのサイズが同じなら、とりあえず動くのかな
strに変更してもエラーでちゃいますヽ(`Д´)ノウワァァン!! ソース書けばボタンひとつでコンパイル&実行してくれるソフトウェア使ってるんだけど そのソフトウェアがおかしいのかなぁ
> そのソフトウェアがおかしいのかなぁ 一つ忠告してやる、自分の無能を棚上げして開発環境にあたる根性をどうにかしろ
そのソフトウェアが C Machine なら、かなりの確率でソフトウェアがおかしい。
C Machineだったらお答えできません。 理由:絶対にインストールしたくないから。
その気持ち悪いコーディングスタイルを何とかするのが先決だ。
#include <stdio.h> #include <stdlib.h> int main (void) { char *str; int num, i; printf ("何文字のaを用意しますか?\n"); scanf ("%d", &num); str = (char *) malloc (sizeof (char) * (num + 1)); if (!str) { printf ("メモリが確保できませんでした。\n"); return 1; } for (i = 0; i < num; i++) { *(str + i) = 'a'; } *(str + num) = '\0'; printf ("%sを用意しました。\n", str); free (str); return 0; } /* indentコマンドはじめて使ったよ */
??? func(void) { return func; } これが成立する型名(???の部分)がどうしてもわかりません、誰か教えて下さい。
>>299 void *
すべてのポインタは暗黙で void * に変換できたはず。
c machineですた。(泣 まだC言語初めてまだ4日だからきちんとしたコードが書けないよ、 ヽ(`Д´)ノウワァァン!! 綺麗なコーディングスタイルってどういうのでつか?? やっぱり関数と関数の間に一行開けたりとかでつか?
302 :
デフォルトの名無しさん :03/04/01 22:16
今度、会社でCをまったく知らないハードの先輩にCを教える事になりました。 ただ、私自身学生時代に触っただけで、2年のブランクがあります。 で、教えてもらいたい事は、以下の2つです。 1.この様な状態の2人にあったCのテキスト 2.Cでの学習環境を作る上でのフリーソフト この2つがよく分かりません。 教えてください。
>>301 C Machineを窓から投げ捨てろ。
そしてBCCを入れろ。
話はそれからだ。
>>299 適当なこと書いてしまった……。
すべてのポインタ→すべての型へのポインタ
void * が関数へのポインタを保持できる大きさを持ってなきゃ駄目だ……。
とりあえず VC++6.0 では問題なくコンパイルできるが、厳密にはどうすんだろう?
>>305 >void * が関数へのポインタを保持できる大きさを持ってなきゃ駄目だ……。
一律32bitじゃないの?Windows95以降のポインタって
push argv push argc call main add esp, $8
C Machineってそんなに悪評高いソフトなんだ、、、。 よろしかったら、その訳を聞かせてください
310 :
デフォルトの名無しさん :03/04/01 23:15
あの〜defineって #define ABC 100 みたいに使うんですよね 参考書には #ifndef ANYHEADER_H #define ANYHEADER_H ・ ・ ・ #endif って書いてるんですけど、なんだかdefineの 使い方がわかんなくなってきました。教えてください
>>305 その場合
void (*)(); とかint (*)(); とかを汎用関数ポインタの代わりとして使う。
当然キャストは必要。void *を使うという解は移植性に乏しい。
>>310 #define ABC 100
int a=ABC; /* int a=100; */
#define ABC
int a=ABC; /* int a=; */
314 :
デフォルトの名無しさん :03/04/01 23:45
>311 ありがとう、なんだかわかってきました。 #ifndef ANYHEADER_H #define ANYHEADER_H ・ ・ ・ この例文で、ANYHEADER_Hが2回目のインクルードでは定義されると あったんですが、どういう意味なんですか? #define ABC 100 の定義とは全然意味違うんですよね。すみません、 ほんと初心者なもので
>>314 違う、ANYHEADER_Hは一度しか定義されず、最初にこの定義に
出会った時のみ#endifまでの間をコンパイルするという使い方。
2回目以降は既にANYHEADER_Hが定義されているので、
スキップされる。
ヘッダファイルのある部分が二重にコンパイルされてエラーが
出るのを防ぐ常套手段。
316 :
デフォルトの名無しさん :03/04/02 00:00
ということは #ifndef ANYHEADER_H #define ANYHEADER_H の順番が大事なんですか? 仮に #define ANYHEADER_H #ifndef ANYHEADER_H としてしまうと、すでにANYHEADER_Hが 定義されているから、一度もインクルードされないってなるんですか? 間違ってたらすごく恥ずかしい質問になってしまったような・・・
>>316 そうです。というかコンパイラによっては、#undefせずに複数回#define
しようとすると警告が出るものもあります。
319 :
デフォルトの名無しさん :03/04/02 00:08
>313 #define ABC int a=ABC; /* int a=; */ 上の例でABCは未定義なんですか?それとも宣言してるから定義している ってことになるんですか?
>>319 マクロは定義されるけど置換え対象が空だというだけ
そうなるかもなー cpp test.c とかやってみるとプリプロセッサがどう動くか分かる ただしstdio.hとかをinclude すると出力たくさんですぎるので 全部外して遊んでみたら?
322 :
デフォルトの名無しさん :03/04/02 00:12
教えてくださったみなさん、ほんとにありがとうございます! なんだか数日間の悩みが晴れました。すぐに復習ノートに 書き込まなきゃ
#include <stdio.h> void *(*)(void) func(void) { printf("プ"); return func; } int main() { (*(*(void ((*)(void))((*)(void)))(*(func()))())())(); return 0; } これでよろしいのでしょうか?
>>323 typedef int (*fun_t)(); /*汎用関数ポインタ*/
typedef fun_t (ptrfun_t)()/*汎用関数ポインタを返す関数へのポインタ*/
fun_t func()
{
return (fun_t)func;
}
main()
{
ptrfun_t state;
while(1)
state=(ptrfun_t)(*state)()
}
こうしなさい
>typedef fun_t (ptrfun_t)()/*汎用関数ポインタを返す関数へのポインタ*/ typedef fun_t (*ptrfun_t)();/*汎用関数ポインタを返す関数へのポインタ*/ 失礼
ptrfun_t state=func; も忘れてた。 もしくは別解凍として struct fun_t { struct fun_t (*fun)(); }; fun_t func() { struct fun_t ret={func}; return ret; } main() { struct fun_t state={func}; while(1) state=(*state.fun)(); }
328 :
デフォルトの名無しさん :03/04/02 01:07
#include <stdio.h> int main(void) { int a,b; puts("2つの整数を入力して下さい。"); puts("整数A:"); scanf("%d",&a); puts("整数B:"); scanf("%d",&b); printf("Aの値はBの値の%fです。\n",(double)a/b*100); } このファイルをコンパイルしたら実行ファイルはできるのですが次のような 警告がでます。どうすればいいのでしょうか? 2.a.c:17:2: warning: no newline at end of file
no newline at end of file いくらなんでもこれは分らなきゃだめだろ?
ワラタ
>329フャイルの最後に新しい行がないってことですか? >330 それが分からないのです。なぜだかわかりませんが コンパイルするのに5分以上かかりました。
333 :
デフォルトの名無しさん :03/04/02 01:26
今日はじめてCを始めた初心者なんですが とりあえずhello worldを表示させる #include<stdio.h> main() { printf("helloworld\n"); } を打ち込んでコンパイル、実行できたのですが 何も表示されませんでした。 何が問題なのかどなたか教えてください。
何か表示されたはずだが、
>>333 がとろすぎるので
表示を読む前にウィンドウがとじてしまっただけ。
目を鍛えろ。
パチスロとかお勧め。
で、擦るだけ擦ったらVCスレで聞きなおせ。
>>333 本当にコンパイルして実行ファイルできたの?
(333 のよそー) $ make test $ test $
gcc 2.95 です。
Linuxです。
>>337 違います。
gcc -o test test.c
です。
339 :
デフォルトの名無しさん :03/04/02 02:11
>>338 testだとtestという用意されたコマンドが実行されるだろう。
./testと入力して実行する。
いや、大抵はシェルの組み込みコマンドか>test
やっぱり関数ポインタはキモイ
int func(void); これがfunctionポインタの宣言だとしたら綺麗だけど、プロトタイプとかぶるからねぇ。 それか、ぜんぶ (*printf)("hello"); みたいにするとか。
ねえねえ functionって ファンクシャンか ファンクションの どっちで読んでる? 漏れの周りでは前者なんだけど、 後者って人は居る??
345 :
デフォルトの名無しさん :03/04/02 03:07
ファンクション
>>343 int func(void);じゃどこにも*がないからポインタに見えないYO!
ファックション
俺はフャンクションと呼んでいる。 鼻から息を抜くように発音するのがミソ。
ファンクトイオン
フヌクシオンヌ
へーちょ
いいかも♪とマジレスしてみる。
352 :
デフォルトの名無しさん :03/04/02 03:20
object pascal だと関数型があって var hoge: function (i:integer):integer; みたいな感じだっけ?? あまり使う人居なさそう。
俺はNull Pointer Exceptionをぬるぽと読む。
( ・∀・) | |
と ) <| | | ザシュッ
Y /ノ .・・人 ∴:・
// ) ・ < >__Λ∩
//し' //. V`Д´)/
(/彡 / ←
>>352-353
355 :
デフォルトの名無しさん :03/04/02 03:27
ライブラリの使い方を
すみません、超初心者ですが質問させてください。 mpg321 という純粋に mp3 などを再生するだけのプログラム を利用し、front end みたいな物を作りたいのですが 例えば player というプログラム名とし、player をバックグラウンドで 起動しておき、 > player -back などと引数付きでコマンドを打つと、 既に起動しているほうの player に引数を渡して、新しい方は すぐに終了するようにしたいのですが、どうすればいいか見当が付きません。 どんな感じになるか教えていただけないでしょうか。よろしくお願いします。
>>314 <この例文で、ANYHEADER_Hが2回目のインクルードでは定義されると
を、
>この例文で、ANYHEADER_Hが2回目のインクルードでは定義されていると
とすれば、自然だと思う。誤植なのか、もしかしたら、そのテキストの
著者は日本語が不自由なのではないでしょうか。
for関数のセパレーターが';'なのってキモくない? 他の関数みたいに for(i=0, i<n, i++); の方が良くない?
添付ファイルを作る関数があるけど、それって変じゃない? 後から作ったらそれは添付ファイルとは言えなくない?
>>360 for(i=0, k=0, i<n, i++);となれば区別つかないから却下。
>>362 for((i=0,k=0),i<n,i++)とやればよい。
・forは構文であって関数ではない。 ・,は演算子であってただのセパレータではない。 以上
こういう仕様だったらよかったのにという話なのに、なんで今の仕様を持ち出してくるんだろう。
詰めの甘い仕様を持ち出すから叩いただけなんじゃない?
for の後に条件反射的に( ; ; )書くクセがあるので 今の構文じゃないと困る。
そんなぁ( ; ; )
>>360 エープリルフールも終わったんだからネタはやめろ。
Cではforはあくまでも「文」であって「関数」じゃねーぞ。
> エープリルフールも終わったんだからネタはやめろ。 2chで言うなよ。
じゃあ、関数でforとかifって作れる? void my_for(???) { } void my_if(bool b) { return; } みたいに。
>>356 取り敢えず、ファイルで受け渡しするようにしてみたら?
プロセス間通信はそれからでもいいと思うが。
>>371 正直マクロで十分だろう。
嫌われるけど
int型の2とか4を 1ビットbool型にキャストすると falseになるの?
375 :
デフォルトの名無しさん :03/04/02 14:36
>>374 bool型って何?_Boolのことか?
>>373 そもそも、forを関数とか言い出した
>>360 が阿呆なわけで。
>>374 Cにはbool型なんてない。
処で質問。
malloc()よりはalloca()の方が安全だと思うのだがansi標準にはない。
使うべきか否か。
mallocよりもallocaの方が安全ってどういうこと?
自動で解放されるんだっけ?
自動で解放されないと危険なの?
alloca()にはfree()は不要。つーかfree()してもいいのか? 試しにfree()してみたらエラーはでないが。
ヒープじゃないんだからfreeなんてするなよ!
>>376 > malloc()よりはalloca()の方が安全だと思うのだがansi標準にはない。
C99の可変長配列ならばalloca()と同等の処理をするはず。
結論:C99を使う
>>383 free()したポインタを再びfree()しても
俺の処理系ではエラーにはなりませんでしたが何か?
# ま た 未 定 義 か
>>385 判った。gccの拡張機能でお茶を濁すとするよ。
借りすぎに注意しましょう。ご利用は計画的に。
alloca 関数は、機種とコンパイラに依存する。 多くのシステムでは実装にバグがあるので、この関数の使用は推奨されない。 多くのシステムにおいて、関数コールの引き数のリスト内では alloca が使えない。 これは、 alloca によって予約されるスタック領域が、 関数引き数に使われるスタック領域の中に現れてしまうためである。 ということらしい。使わないでおけ。
391 :
デフォルトの名無しさん :03/04/02 19:11
Cのコンパイルを実行しようとして 参考書とかにコマンドプロンプトで gcc aaa.c で実行するとありますが これで実行すると 内部コマンドとして認識されていませんと出て実行されません。 何が環境設定みたいなものをしなければならないのでしょうか? 参考書やホームページなどにはその辺の記述は全くないのですが 教えてください
393 :
デフォルトの名無しさん :03/04/02 19:19
>>392 インストール・・・?
そんなのあるの?
参考書だとコマンドプロンプトに記述のみしか載ってないが・・・?
>>393 そもそも環境はなんだよ。コマンドプロンプトと書いてることからするとWindows NT系か?
cygwinを使おうとしてるのか?
395 :
デフォルトの名無しさん :03/04/02 19:30
>>394 Windows2000
ソースは普通に秀丸で
それを拡張子をCにしてCドライブに保存
プロンプトでCドライブ配下に移動して
gcc aaa.cを実行
>>395 Win2000そのままだったらgccなんて入ってないよ。
397 :
デフォルトの名無しさん :03/04/02 19:38
>>396 すいませんどうするれば2000やxpに
gccという奴を入れることができるのですか?
それとも
コンパイルするのに他のやり方とかありますか?
400 :
デフォルトの名無しさん :03/04/02 20:14
教えてください。 マ板で見たんだけど、以下の様なソースね。 int foo( void ) { char a{4], b[4]; // bを消すと落ちる ...明らかに a から b へのオーバーライド } Unix系なら明らかにスタックを破壊するので理解できるが、Win系だと 下から上に積まれるので『落ちはしない』様な気がするのですけど・・・ 詳しい人お願いします。
>>400 コンパイルすらできません。
というか、Unix系とかWin系とか関係ないし。
意味がわからん上にすてきな感じのインターネットですね a{4]
403 :
デフォルトの名無しさん :03/04/02 20:24
<<401 そのレベルの人には聞いていません。 <<402 目良いですね。気がつきませんでした。
彼の超越したレベルには誰もついて行けてないと思われ
てか、その402と401はどこに出力してるのかわからんな。
406 :
デフォルトの名無しさん :03/04/02 20:34
<<404 あなたのレベルが低いだけです。
<<406 そうですかごめんなさい 僕の頭もオーバーロードして落ちそうです
括弧の内側にスペース入れちゃう人は嫌いです。int foo( void )←これ
∧_∧ ( ´∀`)< ち○ぽ
>400 WinでもIAなCPUではスタックは上から下だけど。
return( "1" );
このチンカス!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>409
413 :
デフォルトの名無しさん :03/04/02 21:03
return ( ( void * ) atoi( "0" ) );
415 :
デフォルトの名無しさん :03/04/02 21:11
return((void*)atoi("0"));怒
416 :
デフォルトの名無しさん :03/04/02 21:19
ライブラリに頼るのは恥ずかしいことなの?
>>416 何を使うかの状況判断ができない人のほうが恥ずかしい。
418 :
デフォルトの名無しさん :03/04/02 21:54
400です。すいませんマシンがトラぶってレス遅れました。 私の質問は、以下の様なコードにおいて #include<stdio.h> voidfoo(void ) { inti; chara[4]; for( i = 0; i < ???; i++ ) a[i] = 0x00; } voidmain(void ) { foo(); printf( "I'm safe\n" ); } ???が4を超えた場合、必ず飛ぶかどうかという質問です。 Unix系の場合、スタックは上位から下位へ積まれますので、???が5になれば リターンアドレスを書き換えて飛びそうな気がします。 しかし、Win系の場合、スタックは下位から上位に積まれるので、飛びはしない のではという事です。 言葉が足りなくてすいません。
ま た 未 定 義 か
>>418 大丈夫、Win系でもスタックは高位アドレスから低位アドレスに向かって積まれるので
予定通りきちんとリターンアドレスを破壊してくれる。
一応念のために、LSI-CでもVC++でもそのようにコードを吐くことを確認したから間違いないだろう。
421 :
デフォルトの名無しさん :03/04/02 22:10
質問です。 10秒単位で時間を表示するプログラムを作ってみたのですが、 時間が10秒単位になった瞬間、for文を使っているので何回も表示されてしまいます。 これを10秒単位で1回だけ表示にしたいのですが、解決策はあるでしょうか? 口頭で言ってもうまく説明出来ないので、ソースを晒します。 #include <stdio.h> #include <time.h> void everytime(void); int main(void) { everytime(); return 0; } void everytime(void) { char *s; time_t t; for(;;) { time(&t); if((t%10)==0) { s=ctime(&t); printf("%s\n",s); } }
422 :
デフォルトの名無しさん :03/04/02 22:11
れ、bccでは通ったよ。 タブがつぶされてるのはかんべんね。 まさか voidfoo とか chara[] とか見て気づかない香具師はいないよね。
>>421 最後に実行した時間覚えておけばいいんじゃん?
424 :
デフォルトの名無しさん :03/04/02 22:13
>>418 Intel 系 CPU のスタックは
アドレスの大きい方から小さい方へ確保される
(関数抜けた時に add esp, * でスタッククリアだし)。
だから、オーバーしたらリターンアドレスが書き換えられる可能性がある。
もしくは、その前に i の値が書きかわって
変なことになることもあるかもな。
今回の場合は i を 0 にリセットして無限ループか。
>>419 一応バグの振る舞いを知っておくのも必要だと思うが。
>>421 適切なsleepを挟んでCPU資源を解放しろ。
>>422 それをつっこむと、そのレベルの人には聞いていません。と言われるもので。
428 :
デフォルトの名無しさん :03/04/02 22:15
>>420 初めてのまともなレスありがとうございます。
そっか勘違いかね?昔のMS-DOSとかでもスタック方向は高位ー>下位
だっけ?
知ってたら教えてね。
>>424 最適化を掛けるとiはレジスタ実装になるので問題は出ない。
それどころか、ループ回数が10数回程度ならループさえ消えてしまう可能性が高い。
仮にそうでなかったとしても、iの方が低位アドレスに配置されるのではないだろうか。
433 :
デフォルトの名無しさん :03/04/02 22:22
>>424 どうも。私の勘違いですね。
お騒がせしました。
>>429 スレ違いですか?
このスレはC言語の話でしょ。
アセンブラレベルの話は少しスレ違いですが、せめてスタックの
話くらいはさせて欲しいです。
春だなぁ。
desune
436 :
デフォルトの名無しさん :03/04/02 22:29
C言語にはかわりないんだから、環境依存の話くらいさせてほしいです。
実験してみれば済むことを、それをできるスキルの人間が聞くのはスレ違い。
ビタミンCの話題じゃなかろうに。
440 :
デフォルトの名無しさん :03/04/02 22:46
400です。 もひとつ質問!! socket IO において recv(), send() を実行中に、signal を受けると、 エラーが生じます。(errno=EINTR=23 だっけか?) この場合、socket buffer に中途半端なデータが残ることは無いので しょうか? 私は sigprocmask() で来そうな signal をはじいてますが、EINTR の場合 差し戻すような処理でも問題ないでしょうか?
どこが破壊されるか わかったところでなにか役に立つんですかね?
442 :
デフォルトの名無しさん :03/04/02 22:47
応援しているぞ400!
444 :
デフォルトの名無しさん :03/04/02 22:50
>>441 全然役に立たないです。
疑問を感じただけです。
>>443 ググレって事ですか?
板の趣旨からは外れてないつもりですが・・・
446 :
デフォルトの名無しさん :03/04/02 22:54
<<443 低レベルな人は黙っていてください。
447 :
デフォルトの名無しさん :03/04/02 22:55
あまり盛り上がらないので、寝落ちします。 お騒がせしました。
>>444 未定義、不定の挙動を把握することはデバッグ時に大いに役立つぞ。
いや、変に盛り上がってると言えなくも無い
つか、
>>418 の
> Unix系の場合
こーゆー寝ぼけた発言に対して誰か突っ込んでやれよ。
>>451 むしかえすと、また低レベルな人は黙っていてくださいと言われますよ?
>>334 一応実行後一時停止するようになってるのですが・・・
>>335 はい。コンパイルOKという表示がでています。
>>336 windowsでLSI-86試食版3.3
に「C言語を始めよう」というソフトを
組み合わせて使っています。
始めはフォントが黒いせいで見えないのかと思ったのですが
選択範囲を指定して選択してみても反転しない
のでどうも表示されていないようです。
どうか教えてください。
>>447 さん
どうもサンプル拾ってきました。
差し戻さずリトライすれば良いようですね。
こんなこと自宅でテストすれば良いのですが、環境がありませんので
皆さんのお知恵を拝借させていただきました。ありがとうございます。
>>451 さん
何が寝ぼけているのか解りません。
論点を説明願います。
OSではなく石レベルの話だと言いたいのでしょうか?
もういい、もういい、この手の話は 糸冬
>>418 char a[5] がリターンアドレスに重なっており、
なおかつ、リターンアドレスの上位8bitがたまたま0だったとする。
Intel 系のCPUでは、a[5]の所は下位8ビットなのでそこに0を書くと
はまるが、Motorola 系のCPUでは、そこは上位8ビットなので、
0x00 を書いても運良く助かるってこと。
Intel系やMotorola系以外のバイトオーダーを使うCPUもあるので、
環境に激しく依存する。
<a[5] >a[4]
>>454 確実に表示はされているはず。
printfの後にfor文で無限ループすれば?
>>421 こんなのはどうですか。
#include <stdio.h>
#include <time.h>
int WaitTime(time_t*timeAdd,time_t waitTime)
{
time_t nowTime;
time(&nowTime);
if(*timeAdd+waitTime<=nowTime){time(&(*timeAdd));return 1;}
return 0;
}
int main(void)
{
time_t wait10,wait100;
time(&wait10);time(&wait100);
for(;;)
{
if(WaitTime(&wait10,1))printf("%s",ctime(&wait10));
if(WaitTime(&wait100,10))break;
}
return 0;
}
463 :
デフォルトの名無しさん :03/04/03 04:14
sleepってlinuxしかつかえないの? #include <stdio.h> #include <time.h> /* 時間がnow+10になるまで待ってnow+10を返す */ time_t mysleep10sec(time_t now){ time_t t; while ((t = time(&t)) < now + 10){ } return t; } int main(void) { time_t t; char *s; s=calloc(1,256); /* 10の倍数秒になるまで待つ */ for (time(&t); t%10!=0; time(&t)){ } s = ctime(&t); printf("%s\n", s); for(;;){ t = mysleep10sec(t); s = ctime(&t); printf("%s\n", s); } return 0; }
>>463 FreeBSDにもあるよ。
以下、FreeBSDのman 3 sleepから抜粋
>STANDARDS
> The sleep() function conforms to ISO/IEC 9945-1:1990 (``POSIX.1'').
標準関数じゃないね。
Cygwinのmanに無かったからちょっとびっくりした $ man 3 sleep No entry for sleep in section 3 of the manual
>>463 WindowsにはSleepってのがある。
>>465 nanosleep(セクション2)は?
>>467 とりあえず無限ループ+最後にifならdo{}while使えば?
指定した時間待つ関数と表示する関数は分けた方がいいと思う。
>>467 time(&(*timeAdd)); が意味不明、間違えじゃないけど
time(timeAdd); でいいのでは?
とりあえずビジーループするクソなソースを貼るのはやめろ。
(int main, int argc, char **argv) { (printf, "hello C"); return 0; } こういう言語仕様だったら見た目がもっとカッコイイソースが書けたのにね。
forの構文がどうたら言ったたヤツか? いい加減にスレ違い、板違いなんで消えろ
>>473 どうせならこうしろ
((int main) ((int argc) (char **argv))
(printf "hello C")
(retrun 0))
>>475 イイ!!
そういう感じのコンパイラ作ってみるよ。
(((int) (main)) (((int) (argc)) ((char) (*)(*)(argv))) ((printf) ("hello C")) ((retrun) (0)))
>>473 lispで我慢してろ。Cに手を出すな。
#define BEGIN { #define END } 並に、氏んでいいよ。
括弧が多いとlispかよ(プ
>>466 cygwinでは
manは無いけどsleep()は何故かあった。
しかもなにもインクルードしないのに使えてしまって不思議
sleep(1)は1秒止まるし
>>477 (((( ;゚Д゚))) ガクガクブルブル
483 :
デフォルトの名無しさん :03/04/03 12:20
非常にスレ違いかもしれんが、基本教えて・・ MS-DOSプロンプトの話なんだが、Cを実行した後の大量のデータがほしぃ場合、 スクロールしてしまって、始めの方のデータ見れない・・ これどうやってみるんだろ?
>>483 出力をファイルにリダイレクトして、後から見れ。
ケコーン(w
リダイ・・・やめた
foo.exe > a.txt で、画面に出力する内容をa.txtに保存する。 foo.exe >>a.txt で、a.txtにどんどん追加する。 がんがり。
489 :
デフォルトの名無しさん :03/04/03 12:31
>>484 ,485
詳しくやり方を教えてください・・・スマソ
> hoge | more で1ページずつみれるよ。
>>483 ×:Cを実行した後の大量のデータがほしぃ場合
○:コンパイルエラーの最初の方のエラーを見たい場合
493 :
デフォルトの名無しさん :03/04/03 13:33
>488 できました。ありがとうございます!
494 :
デフォルトの名無しさん :03/04/03 13:46
Cの書籍としてよくでてくるK&RはCを勉強する過程で買っておいたほうがいいんですか??
>494 人によります。 漏れはおすすめしない。
496 :
デフォルトの名無しさん :03/04/03 14:00
まあ損はないだろうが俺は不要だった。
今まで読んだことがないです。 むしろ、アルゴリズムとデータ構造の本を読んだほうが幸せになれることも……
498 :
デフォルトの名無しさん :03/04/03 14:16
>495 お勧めはなんですか?
>>498 どっちかて言うとA定食の方が美味しいよ。安いしね。
>>481 printfだってstrcpyだって(ヘッダーファイルを)インクルードしなくても使えるだろ。C++じゃあるまいし。
今日ってまだ4/1だっけか?
>>502 もしかして宣言しないと関数を呼び出せないと思っている?
(・∀・)キュンキュン
くらえ!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>504
506 :
デフォルトの名無しさん :03/04/03 17:46
16進数の44を10進数の44と変換したいんですが いかようにすればよろしいのでしょうか? 何分厨房ではございますがご教授のほど おながいいたします。
意味不明
508 :
デフォルトの名無しさん :03/04/03 17:55
>>506 16進数の44を10進数に変換したいの?
509 :
デフォルトの名無しさん :03/04/03 18:06
>>508 サソ
16進の44を10進数に変換といことではなくて
16進の44を10進で44としたいのです。
16進で55があったら10進では85ですよね?
そうではなくて例え、16進で44というデータが
あっても、それを強引に10新の44と
プログラムに思いこませたいのです。
わかりづらい説明ですが、おながいいたします。。。
int func(int val) { return ((val & 0xf0) >> 4) * 10 + (val & 0xf); }
じゃあ0xfeとかだとどう変換したいんだろう? ナゾ。
512 :
デフォルトの名無しさん :03/04/03 18:28
>>510 サソ
アリガトンゴザイマス
カンゲキ・・・
シフトかぁ。。。
>>511 サソ
なんかしんねぇけど
A-Fは入ってこないというナゾの仕様なんです。
もう寝るね(=^-^)/~~
はえーよ
BCDのことではないのか
>>512 プログラムは何を根拠に入って来るデータを16進だと判断するの?
しらねぇ奴、知恵のねぇ奴に限ってあれこれ騒がしいな。
あれこれあれこれ
>>516 サソ
ダンプファイルがありまして、
それを関数に渡すんですが
その関数が10進で来ることを予期しており
ヘキサじゃダメというだけの理由でございます。
動的なメモリで作った配列があり、 中身を保持したまま配列の数を5000から5005などに増やしたいときは いったん別に仮配列を用意してコピーしてから元配列を開放、 また新たに元配列にメモリを確保して仮配列からコピー という方法しかないのでしょうか?
なぜ、仮配列を新配列にしないの? char *foo = malloc( 5000 ) ; ... { char *neon = malloc( 5005 ); memcpy( neon, foo, foolength ); free (foo); foo = neon; }
単に、新しい動的メモリを作って、そこにコピーすれば? 配列確保→新しい配列のポインタ取得 古い配列 → 新しい配列 にデータ転送 古い配列解放 古い配列のポインタを指す変数=新しい配列のポインタ または、manpage realloc
なぜ realloc を
キャ……
reallocでダメなのかな
こういう感じじゃないの? www9.plala.or.jp/sgwr-t/lib/realloc.html
529 :
デフォルトの名無しさん :03/04/03 23:42
Cのソースとか見るとたまにputsを使ってるのを見かけますが puts関数の存在意義って何ですか? Printfで全て間に合うような気がしますが・・・
Printfは絶対に無(ry爆
532 :
デフォルトの名無しさん :03/04/03 23:55
>>531 printfね・・・
>>532 タイプの速度ってだいたい
一個なら1秒も変わらんし
複数ある場合はほとんどコピペじゃないのか?
で、実行速度は?
puts(s); printf("%s\n", s); だったら puts を使うなあ。
>>534 putsの方が速い。
でも処理速度が問題にならなくて、別の箇所でprintf使ってるなら
俺ならprintfで統一する。
537 :
デフォルトの名無しさん :03/04/04 00:14
529君検証して答えるべし。速度は? 530==534は、本質に切り込む問いかけしているぞ。 ま、なんだ。 勘のイイ奴なら何をどう調べればよいか分かるもんだが。
大は小を兼ねると言ってもそれは機能面だけの話で、 多機能さを実現するためのコスト(printfの場合は書式の 解決処理ね)が、無駄というか、邪魔になる場合がある。 でもって、printfは処理が遅くて、putsは早い。 数百回の処理じゃ違いは体感できないが、何十万回も 繰り返し処理する場合は、その差が顕著になる場合があるよ。
何十万回もputs呼ぶなら、 コンソールのスクロールの方が 圧倒的に遅くなると思ふ。
コンソールのスクロール? とつっこんでみる。
> /dev/nullと書こうと思ったがおまいには > NUL がお似合いだ
コンソールに大量にログ文字列出力しといて、性能遅いとか ほざく技術者がいっぱいいるのですが、あんたら馬鹿ですか? トオモウ事が多いです…
質問です。 1行目にデータ件数を書いて、2行目以降にデータを記述したファイルから、 乱数で出した数字番目の行のデータを取り出して表示させたいのですが、 fgetやfscanfを使って繰り返し読み込ませて目的の行まで進める、 という方法以外に何かいい方法ないですか?
>544 ・一気に全部読んで、改行をキーにして探す。 ・一行のデータ量が固定なら、計算で長さを出す。で、ファイルポインタを移動させる。 ・データ構造を工夫する。 ・その他。(他のレス待ち含む)
・最初に全部読んでファイルポインタだけ配列に記録しておく。 取り出すときは乱数で行数を添え字にしてポインタを取り出しfseekのあとfgets ここから下は余談 高速化のためにこの配列をファイルに記録しておき、 次からはテキストファイルと配列を収めたファイルのタイムスタンプを見て、 テキストファイルの方が新しければ配列に取り込み、それをファイルに記録、とかやる。 # おれはわりとよくこういうことをやる
最初に全部メモリ上に読んで乗せとく データ数が少ないならこれが速い
メモリマップトファイル
>>548 アレって一回ファイルをメモリ上に展開するのか?
#define hoge(__p) \ hoge_##__typeof__(__p)(__p) として、__p の型に応じて後始末をしてくれるマクロを作ろうとしてるんですが、 うまくいきません(hoge___typeof__ は未定義だと言われる)。 どうすればうまくいきますか?
551 :
デフォルトの名無しさん :03/04/04 12:08
ソートする対象の要素が膨大な時は、やっぱファイルを利用するのが一番なのか? r+bモードで開いて、ファイルポインタを走査させて比較するみたいに・・
>>551 いいえ、DBを使ってSQL発行した方が楽でしょう。
>>546 の余談でやってるのって要するにインデックスだし...
>>549 アクセスされるまでロードしない。
仮想メモリに似た方式。
レス遅れてスマソ 色々な方法があるんですね。試してみます。ありがd
>>550 __typeof__(__p) なんてのは聞いたことがないので
これがプリプロセッサで処理されるのか
コンパイラで処理されるのかは分からないが、
前者であったにしろ、それが展開される前に
トークンが結合されてることは確かだろう。
よって、直接 hoge_int(p) とか呼ぶのが吉。
C++ が使えるならデストラクタだの
オーバーロードだのテンプレートだの利用できてええんだがな...。
>>557 分かりました、ありがとうございます。
gcc のヘッダで使っていたんですが、拡張機能だと思います。
スレ違い、スミマセンでした。
>>550 __typeof__()が通常のマクロと同じように扱えるのなら、
#define dcat(a, b) a##b
#define cat(a, b) dcat(a, b)
#define hoge(__p) cat(hoge_, __typeof__(__p)) (__p)
>>559 ありがとうございます。でもダメでした。
cpp してみたら hoge___typeof__() に展開されていたので、
プリプロセッサではなくコンパイラで扱っているみたいです。
561 :
デフォルトの名無しさん :03/04/05 00:09
memcpyについて教えてください。 int num = 0x11223344 char a[sizeof(int)]; memcpy(a,&num,sizeof(a)); といった例文なんですが、参考書によるとnumが16進数だから 11223344からは2行ずつ数値をコピーすると書いてます。 なんで2行で4バイトもコピーされちゃうんですか? すみません、超初心者なもので
2行ではなく2桁では?
563 :
デフォルトの名無しさん :03/04/05 00:16
あ、そうでした・・・でもわかりません
>>561 >なんで2桁で4バイトもコピーされちゃうんですか?
いいえ、1バイトです。
void *memcpy(void *dest, const void *src, size_t n); memcpy()はメモリ領域srcの先頭nバイトをメモリ領域destにコピーする。コピー元の領域とコピー先の領域 が重なってはならない。重なっている場合はmemmove(3)を使うこと。 memcpyと、2桁づつコピーされることは関係ない。 16進数では、2桁で0から255までの数値を表現できるが、 それがたまたま1バイト(8ビット)で表現できる数値の範囲と一致するだけ。
566 :
デフォルトの名無しさん :03/04/05 00:29
参考書をそのまま写すと numに与えられた数値の先頭の0xから16進数であることが わかるので、11223344からは2桁ずつ「16*2=32(ビット)=4( バイト)」、数値がコピーされます とあるのですが、わたしが根本的に勘違いしているのかも
16bits*2 ? 8bits *4=32bits=4bytes なら分かるが。
燃やそう
その本、タイトルに「C言語」って入ってない?
570 :
デフォルトの名無しさん :03/04/05 00:39
>そうなんです。8bits *4=32bits=4bytes なら納得できるんですが 16*2=32はよくわかりません。char型に2桁ずついれるプログラム なので、やっぱり8ビットずつですよね・・・たぶん
571 :
デフォルトの名無しさん :03/04/05 00:41
>569はいってますよ
int num = 0x11223344; int は最近の環境では4バイトなのが普通です。 char a[sizeof(int)]; sizeof(int) は int のサイズを与えます。 つまり、4です。 char は1バイトですので、 ここでは1バイト×4=4バイトの領域を占める配列が作られます。 memcpy(a, &num, sizeof(a)); これは、&num の指す領域から a の指す領域へ sizeof(a) バイトだけコピーします。 a のサイズは4バイトなので、 要するに num から a へと情報をコピーします。 memcpy が内部でどういう方法でコピーしているか、 ということは特に規定されていません。 実質的に一般的に使われてるアルゴリズムはあるでしょうが、 昔の環境ならいざ知らず、int が4バイトの環境では それを考慮しても2バイトずつというのはないですよね。 char a[2 + sizeof(int)]; memcpy(a + 2, &num, sizeof(int)); なら2バイトずつになるかもしれませんが...。 マジックナンバーを使わないようにしたり、 サイズが同じでも敢えてデスティネーションのサイズを指定したりと 結構行儀のいいことしてるのに、何でなんでしょ。
>>571 某氏によればそれは悪本だそうです(’’
このすれも悪スレか?
575 :
デフォルトの名無しさん :03/04/05 01:26
>572わかりました。ていねいな解説本当にありがとうございます。 >573そう思います。初心者向けの本のはずなのに、関数の例文に いろんなこと突っ込んで、もう最悪です。ほかの本やネット講座のわかりやすさ にびっくりします
576 :
デフォルトの名無しさん :03/04/05 03:51
ポインタのポインタって実務では具体的にどんな事に使われるのですか?
mainの引数とかな。
578 :
デフォルトの名無しさん :03/04/05 03:56
それからポインタのポインタは使用頻度は高いですか?
ポインタ配列を利用するぐらいの頻度かな・・
580 :
デフォルトの名無しさん :03/04/05 05:51
こんにちわ。この板は算数がとくいな人がおおいときいてきました。 10-10-10のこたえを教えてください。よろしくおねがいします。宿題なんです。 まじめです。
1+1=田 1-1=日 10-10-10=? わかった! マソコマークかな?
ちょっと不安になったもので質問 memcpy とか memmove, memset などは malloc などで取得した領域が物理的に連続でなくても きちんと取得した領域について処理してくれるんですよね?
>>583 そんなOSがこっそりやってる処理まで気にしたら禿げます。
mallocは連続した領域を確保できなかった場合、NULLが返ります。
587 :
デフォルトの名無しさん :03/04/05 06:53
putc('\a',stdout); とやってもピカピカ光だけで音が出ません。 何ででしょうかね? バグ?
端末の設定がビジュアルベルになってるのかと。
>588 すげえ。
591 :
デフォルトの名無しさん :03/04/05 08:02
数列の100項目が知りたいんですけど いったいどこがまちがってるかわかりません。 Help! (初項 1) #include<stdio.h> intk; intA[101]; A[1] = 1; voidmain() { for( k = 2 ; k == 100 ; k++ ) { A[k] = 2 * A[k-1] + 3; } printf("%d",A[100]); }
あ・・・ タブって2chじゃ認識されないのね・・・・・
>>591 > for( k = 2 ; k == 100 ; k++ )
これじゃ一度もループしないね。
k < 101
>>593 さん
>>594 さん
ありがとう!
だいたい解決しました。
intをlongにかえても29項目までしか計算できませんね・・・・
# cat a.h static int a(void); # cat a.c #include "a.h" static int a(void) { return 'a'; } # cat main.c #include "a.h" int main(void) { printf("a→%c", a()); return 0; } 一体どこがマズイのですかね?
なめてんのか・・・
∧_∧ ( ´∀`)< もうねアホかと馬鹿かと
staticイラネ
system() や popen() でプログラムをバックグラウンドで起動させた時、 そのプログラムのプロセスIDを得る方法はありますでしょうか?
>>601 そちらで聞いてみます。どうもありがとうございます。
号
>>595 k < 101
は(マジックナンバーが気に食わないけど、せめて)
k <= 100
の方が意味はわかりやすいかと。
> int k;
> int A[101];
>
> A[1] = 1;
>
この辺りも(せめて)main文の中に入れる、できれば等比級数を求める別に関数を作って
やればもっといいと思われです。
>intをlongにかえても29項目までしか計算できませんね・・・・
多倍長 でぐぐるか?
>>1 こんなふざけたスレッド名ならここに質問書く気にならないじゃないか。
質問しなくていいよ、カエレ
>マジックナンバーが気に食わないけど はぁ? 質問に k == 100 ってあったからマジックナンバー使っただけ。 まあ、k <= 100のほうが分かり易いのは確かだが。
糞質問ばっかじゃねえかボケ!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>1
今に始まったことじゃないだろ!
( `Д´) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V・∀・)/
(_フ彡 / ←
>>608
誰かおしえて…
612 :
デフォルトの名無しさん :03/04/05 18:54
#include <stdio.h> int main(void) { int i, ch; while((ch = getchar()) != EOF) putchar(ch); for(i=0; i<10; i++) printf("ぬるぽ ", i); return(0); } 実行すると"ぬるぽ "が3回しか表示されなくて困っています。 なぜなのか教えて下さい。
答えは 10-10-10 == (10-10)-10 演算子の優先順位とか結合方向とかで調べるだ
>>614 それは本質的な問題ではない。変ではあるが、間違いではない。
>>612 普通に10回出力されるぞ。
取り敢えず
出力をリダイレクトしてみるとか
改行してみるとか
明示的にフラッシュしてみたらどうだ?
616 :
デフォルトの名無しさん :03/04/06 00:25
>>612 >printf("ぬるぽ ", i);
",i"消したら?いらないよ。
レスどうもです。,iは恥ずかしいミスです。 ファイルにリダイレクトすると正常に出力されていました。 また、前に改行を1つ入れると問題無くなります。 しかし、その改行はどこへ消えたのか気になるような… フラッシュは効果が無い様です。
環境はwin95, vc++5.0です。 XPで実行してみると問題ありませんでした。
putcharは改行されないから、それに関係あるんじゃない? 詳しいことはわからないけど
構造体のコピーなんですけど struct hoge{ int a,b }; main(){ struct hoge h1,h2; h1.a=3;h1.b=4; h2=h1; } みたいなのはコンパイル通りますか? memcpyした方がいいんでしょうか?
心配ない、同じ型なら一括代入(コピー)される。
>>621 通りません。memcpyしたらスタックが破壊されます。
ども代入使えると便利です struct hoge{ int a,b; }; main(){ struct hoge h1,h2; h1.a=3;h1.b=4; h2=h1; if (h2==h1){ printf("hello"); } } 比較演算子はさすがにダメみたいですた
>>623 memcpy (&h1,&h2);がダメってこと?
やっぱり
代入はgcc では通ったけど
copyhoge(hoge dest, hoge src){
dest.a=src.a;
dest.b=src.b;
}
とするのが正しいんでしょうか
memcpy (&h1,&h2,sizeof (struct hoge)); だった
>>625 ふつー代入します。その方が見やすいでしょ?
#include<stdio.h> int main() {printf("ぽ",printf("る",printf("ぬ")));}
630 :
デフォルトの名無しさん :03/04/06 12:40
Cの勉強を初めて間もない者なのですが、 int ch; while((ch=getchar())!=EOF) putchar(ch); って、while文から抜けるにはどうしたらよいのですが? どこかでEOFは普通-1だと聞いたので、-1と入力してみても抜けられません。 ご教授お願いします。
>>630 UNIXならCtrl+D、WindowsならCtrl+Zで抜けられるんじゃない?
>>631 ご回答ありがとうございます。
でもそれだと
>>612 さんみたいに、抜けたあとに何か出力したい場合は働きませんよね?
それがちゃんと出力されるように抜けたいのですが・・・。
>>634 それはMS-DOSプロンプトのせいでしょ・・・・
main関数の最後にfflush(stdout);を追加しても表示されないならあきらめて。
アチョーー
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>629
そうなのですか。 fflush(stdout);を追加してもダメでした。 あきらめるしかないですね。ありがとうございました。
>抜けたあとに何か出力したい場合は働きませんよね? 働きませんよね?ってなにが?
#include <stdio.h> #include <stdlib.h> void nu(void); void ll(void); void po(void); int main() { atexit(po); atexit(ll); atexit(nu); return 0; } void nu(){printf("ぬ");} void ll(){printf("る");} void po(){printf("ぽ\n");}
#include <stdio.h> #define p (*printf) #define i if #define a && #define o || #define f (int(*)(int)) int main(){ i(p("ぬ","る")o p("ぬ")){i(p("る","の"),0){i(p("ポ")o p("ン")o p("酢","飲んだ")); }}return (*(f)NULL)(p("もう駄目ぽ"+8));}
getchar()に対して、キーボードなどから「-1」と入力しても getchar()の戻り値は'-'にしかならない。 EOFを戻らせるためには、入力ストリームをクローズするしかない。 #unixならCtrl-D、DOS系ならCtrl-Zと言うのはクローズするためのキーコード。 で、何故か入力をクローズするとDOS系の場合出力バッファの更新がおかしくなるようだ。 なので対策としては、 ・リダイレクトする。 ・改行('\n')を挟んでみる。 辺りを試してみてはどうだろう。 それでだめなら、EOFを入力終了の判断に使用せず、 特定のキーコードの組み合わせを終了の判断に使うようにするなどの 仕様の見直しが必要だろう。
643 :
デフォルトの名無しさん :03/04/06 14:45
gccでコンパイルしているのですが 参考書通りにソースを書いてもコンパイル時に warning: no newline at end of fileという警告が出ます。 これは一体なぜなのでしょうか?
みなさん色々なご意見ありがとうございます。 とりあえず自分で作ってみました。 #include <stdio.h> int main(void){ int ch; char p; while(1){ if((p=(char)ch=getchar())!='c') putchar(ch); else break; } printf("Hello World.\n"); return 0; } このコーティングってマズイでしょうか?
>>643 Cの規格ではソースは改行で終わってなくてはならないから。
・・・だと思う。
int main()
{
>>639 ::main()
abort();
}
647 :
デフォルトの名無しさん :03/04/06 16:29
∧_∧ ( ´∀`)< ぬるぽ
648 :
デフォルトの名無しさん :03/04/06 17:36
長い文を出力させようとすると 最後のほうしか表示されないのはなんでですか?
>>644 >if((p=(char)ch=getchar())!='c') putchar(ch);
なにがしたいんだかよくわからんのだが、
char pの意味ってあるわけ?
俺ならこう書くな。
while((ch =getchar()) != 'c')
putchar(ch);
ちなみに、関数がcharを返す時は、自動的にintに変換されるので、
型キャストする必要はないはずです。
>>648 前の方のは流れていくから見えないんでしょ?
パイプすりゃよかんべ。
program | more
でよし。
651 :
デフォルトの名無しさん :03/04/06 17:48
>長い文を出力させようとすると >最後のほうしか表示されないのはなんでですか? ↑これ教えて下さい・・・。
>>649 すみません。
勝手に''で囲まれた文字はchar型でないと代入出来ないと思っていたので。
自分がしたかったのはwhile文のgetcharからCtrl+zしないで抜けることです。
Hello World.はプログラムを終了せずに抜けたかを確認するためのデバッグライトとしてつけました。
'c'ってCではint型じゃなかった?
654 :
デフォルトの名無しさん :03/04/06 18:03
>>長い文を出力させようとすると >>最後のほうしか表示されないのはなんでですか? >↑これ教えて下さい・・・。 お願いします。。
>>653 いや、確かchar型だったような・・・。
そう言われると断言は出来ませんが。
printf("halo, %s", 2["ABC"]); printf("halo, %s", "ABC"[2]); どちらの書き方が一般的ですか?
657 :
デフォルトの名無しさん :03/04/06 18:10
>>>長い文を出力させようとすると >>>最後のほうしか表示されないのはなんでですか? >>↑これ教えて下さい・・・。 >お願いします。。 無視しないでおせーてw
>>657 DOS窓で
>実行したいファイル名 | more
ってやればよろし。
660 :
デフォルトの名無しさん :03/04/06 18:26
>>658 最後に「-- 続く --」
ってなるだけで全部は表示されないけど・・・。
これはしかたのないことなんですか??
661 :
デフォルトの名無しさん :03/04/06 18:29
>>656 一般的なのはコレ。
printf("halo, C");
>>660 全部を表示するだけの広い表示領域が無かった場合に、どうなれば満足なの?
664 :
デフォルトの名無しさん :03/04/06 18:34
665 :
デフォルトの名無しさん :03/04/06 18:36
>>656 printf("halo,""2[ABC]");
printf("halo, %s", "ABC");
printf("halo, %s", ABC);
printf("halo, %c", ABC[2]);
などではだめ?
>>650 でずばり正解教えてもらってるのに無視しつつ粘着しまくる厨房度に感服
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>647
永遠に縦に長いディスプレイを買う。
671 :
デフォルトの名無しさん :03/04/06 20:01
>>643 さん、解決した?
一番最後の行を改行すればいいんだよ。
main(){
/*hogehoge*/
}/*ここで改行*/
>>670 あの後楽園とかにあるようなどんどん上がっていって一気に下がるやつ。
ああいうので見れるくらい長いのがいいね。
速すぎて読めないってのはナシで。
>>671 わざわざ心配していただいてありがとうございます。
まだ解決してないんですよー。
プログラムによってその警告が出たり出なかったりなのですが。
改行ってprintf("\n");のことですよね?
>>671 あ、解決しましたー。
ブロック抜けたあとも空行を1行作れってことだったんですね。
出力関係で改行するのかと思ってました。
どうもありがとうございました。
このスレも落ちたもんだな・・・ボケが!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>1
677 :
デフォルトの名無しさん :03/04/07 06:14
long double って宣言するとどうなるの? doubleとおなじ?
>>677 違う環境もありうる。
double <= long double
679 :
デフォルトの名無しさん :03/04/07 07:24
struct CharaData//0 { char Name[17];int HP;int MP;//1 } Chara[8];//2 0は構造体タグ。1はメンバー。2はなんと呼ぶのですか?ある本には構造体名と 書いてあったのですが。2がメンバーのほうが正しい気もしますが。
インスタンス?
なんとなく 2はメンバーではないだろう struct SMAP { int inagaki; }; たぶん struct CharaData//0 { char Name[17];int HP;int MP;//1 }; struct CharaData Chara[8];//2 となるところをいっぺんに書いたんじゃね?
メンバーではないことは確か。 構造体名になるのはtypedef がある場合と思う。
すまん、型名だった。
684 :
デフォルトの名無しさん :03/04/07 08:28
空のソース突っ込むとエラー返すコンパイラがあるんだが、 そういうもんだっけ?
言い忘れた。 リンクエラーじゃなくて、コンパイルエラーになる。 「ソースが空です」ってメッセージがでる。
686 :
AGENT-GC :03/04/07 10:58
下らない質問しますが、 現在のMicrosoftの最新のC++コンパイラはなんっすか?
687 :
デフォルトの名無しさん :03/04/07 11:01
スレ違い。っつうかC言語とC++はちゃうんかYO!?
C言語のスレだから、という事もあるけど、 MSの製品の事はMS関連のスレなり、MSのサイト覗けYo
691 :
デフォルトの名無しさん :03/04/07 12:46
すみません。どうしてもわからないので御願いします。 C言語にはクラスの概念がないのですが、どうしてですか?
Cだからです。
天然でその質問してるのだとしたら、びびるな。 なぁネタだろ?
VBにもクラスがあるのに。 C言語はVB以下?
Cにもちゃんとクリスはいます。クリスはコーダです。
>>694 クラスの有無が言語の優劣だとでも?
まぁ、まともなプログラミングもできない奴なら言語の優劣を測りたがるのも無理ないか。
ネタはマ板でな
>>694 一応レスしとくと、C いうのはアセンブラの代替としてのシステム記述用に、
簡易・高速・軽量を極めて作られた言語。
その当時にはオブジェクト思考という概念などなく、そしてそのまま仕様が
ANSI でほぼ確定されたわけだ。
微調整した C99 なんてのもあるけど、骨格は昔の C と変わらない。
VB は Microsoft の独自言語で、ANSI 規格と違って拡張しようと思ったらすぐ
拡張できる状況にあったので、新技術を手当たり次第詰めこむ形で成長し、クラス
をも取り入れるに至ったわけだ。
・・・成功してるかどうかは知らないけどね。
クラスも導入したいが C の簡易・高速・軽量性も捨てがたい、と C を袂を分けて
派生したのが C++。
しかし、C++ がこれまたあまりにも節操のない新技術追加が為され、古い機能の廃止
もほとんどしなかったため、とんでもなくややこしい言語になってしまった。
これをもっと簡潔にしよう、というわけでできたのが Java や C#。
今は D も策定中。
Objective-C は無視ですかそうですか。
>>699 マジレスすると、燃焼系アミノ式。
つーか、漏れが知らないから解説できない。
>>702 リリースも何も、digitalmarsが勝手にやっている事だろう。
他のコンパイラメーカは見向きもしない。
705 :
デフォルトの名無しさん :03/04/07 13:57
char *str="hoge=12"; char conf[10], opt[20]; sscanf(str, "%s=%s\n", conf, opt); で、configファイルを読みたいんですが、 この場合、conf[10]="hoge" で\0が語尾につかないわけですが、 適切な場所に\0をいれるにはどうすればいいですか?
要するにD言語はC#/Javaのネイティブコード版。C++から多重継承と マクロを取り除いた。それだけ。
>>705 scanfの書式指定は空白文字を区切りと認識するので、
"%s=%s"で"hoge=12"を読むと最初の%sで文字列を全部読んでしまうのでは?
"%s = %s"とか"%[a-z]=%[0-9]"みたいにするか。
何故"%[^=]=%d"じゃないんだろ。
なるほど。
参考になりました。
>>708 みたいな正規表現も使えるんですね。
ちょっと色々実験してみますね。
正規表現…
すんません。 今、K&R読み直しました。 別に正規表現というわけじゃないんすね。 質問しておいてなんですが、sscanfはなんか汎用性に欠けるっていうか、 perlみたいな文字列リテラルの扱い方法があるといいんだけど。
Cにそんなもの要求するなよ…。
perl使えC++で文字列クラス使え自前で便利で汎用的な文字列操作関数群を用意しろ禿
はひ。。。 いま、新しいライブラリ作ってまふ・・・
C言語で多態を実現したいんですけど、どういう風にすればいいでしょうか…。
vtbl もどきを自前で実装する
>>717 「貴様ら!オブジェクト指向を教えろ!! 」に帰れ
lpInterface->lpVtbl->Release(lpInterface);
∧_∧ ( ´∀`)< ぬるぽ
ホワタァ!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>721
∧_∧ ( ´∀`)< ぬるぽに聞け!
ハイィィイィ!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>723
アターーーーーー!!!!!!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>1
>>717 X Toolkit Intrinsics 読め。
∧_∧ ( ´∀`)< アルセーヌ・ルポンに聞いてちょ
728 :
デフォルトの名無しさん :03/04/07 23:14
windows2000 LSI C-86試食版(C-PAD使用) を使っています。 ----------------------------------------------------------- #include <stdio.h> /*stdio.hファイル宣言*/ int main() { short x1,x2; /*符号付きのshort*/ unsigned short y1,y2; /*符号無しのshort*/ x1=-32768; x2=32767; printf("x1=%d x2=%d \n",x1,x2); y1=1; y2=65535; printf("y1=%d y2=%d \n",y1,y2); } ----------------------------------------------------------- x1= -32768 x2= 32767 y1= 0 y2= 65000 と表示させたいのですが。 x1= -32768 x2= 32767 y1= 1 y2= -1 となってしまいます。 short以外を使ったほうがいいのでしょうか、longを使用したら違う結果が出ました。 レベル低くて申し訳ありませんが、ヒントを頂ければと思います。
>>728 printf("y1=%d y2=%d \n",y1-1,y2-535);
>>728 int を使え。
-1になったのは、桁溢れしたため。
LSI-Cの試食版のintは16bitだったか・・・ じゃあprintf("y1=%d y2=%u \n",y1-1,y2-535); これで。
hashテーブルを返す関数で int hash(char *key,int sz){ unsigned char *t=key; int h; for(h=0;*t;t++){ h=(128*h+*t)%sz; } return 0; } というものがあります。 この関数のunsigned char *t=keyというのは、 keyが格納する実引数のアドレスをtに渡しているということなのでしょうか? また、tをポインタのポインタとして宣言して、この文を記述した場合は 仮引数であるkeyのアドレスを格納を格納出来るのでしょうか? ご教授お願いします。
すみません。途中で日本語がめちゃめちゃな箇所がありますが、勘弁してください。
734 :
デフォルトの名無しさん :03/04/07 23:49
外部変数ってプログラム実行中にアドレス変化する? 内部変数は変わるよな・・・ 性的変数は変わらない・・・ ということは外部変数も変わらないのか??
>>732 keyの中身をtに入れているだけ。
別の変数に待避しているんだよ。
性的変数ワラタ
>>732 よく考えればわかるぞ。
keyは、アドレス。
*keyは、文字列。
t=key は、アドレスの代入。
つまり、*tは、文字列。
文字列はそれぞれコードを持っている。
例えば、
printf("%d \n", 'a');
とかやってごらん。
>>734 スタックについて考えてみろ。
その前に、まずデバッグして実際に目で追って見ろ!
>>730 様
6行目を
unsigned int y1,y2; /*符号無しのint*/
に変更しましたが、結果が一緒でした。
>>729 様
ありがとうございます、目指す形に出来ました。
y1= 0 y2= 65000 の65000は何故かshortを使うと65000になるみたいな書き方が本にされていたので書いたのですが。
汎用的に使えるようにしたかったためこうなりました。
%uは16bitの数字を表示する書式指定文字列と考えていいのでしょうか。
x1,x2は%dで上手くいっているのは何故でしょうか、あまり気にしなくていいのでしょうか。
-----------------------------------------------------------
#include <stdio.h> /*stdio.hファイル宣言*/
int main()
{
int x1,x2; /*符号付きのint*/
unsigned int y1,y2; /*符号無しのint*/
x1=-32768;
x2=32767;
printf("x1=%d x2=%d \n",x1,x2);
y1=0;
y2=65535;
printf("y1=%u y2=%u \n",y1,y2);
}
-----------------------------------------------------------
「よくわかる最新C言語の基本と仕組み」という本のP74あたりを参考にしているのですが、書いてある通りに書いてもちゃんと動いてないような気がします。
少し古いのでそのせいかもしれませんが・・。
65000は考えられない・・・・
その本もやはり「C言語」か。
スタックって何の関係があるの? 形しか思い浮かばない・・・ そかデバッグっていう方法があったな!ペコリ~(o_ _)o))
keyはアドレスでいいけど、 *keyを文字列だとは思わない方がいい
>>734 自動変数はスタックに積まれる。
もしくは、レジスタに格納される。
>>740 やはり誤植っぽいですね。
ありがとうございます、shortって変数なので切り捨てて短くするのかもなんて思っていました・・。
>>739 > %uは16bitの数字を表示する書式指定文字列と考えていいのでしょうか。
違う。符号なし整数(unsigned int)として十進数字列に変換。
なるほど〜!! デバッグしてみたら外部変数のアドレス変わらなかったです。 使うときにスタックの↑から取り出すんだ・・・? なら後に入れればいれるほど早い??ということになるっけ・・ というか・・・ブラウザが変ってなんやねん!
748 :
デフォルトの名無しさん :03/04/08 00:17
o( 〃゜O゜〃)ゝオォーイ!!
後からスタックに積むほうが早いとかじゃなくて、 後から積めば、その関数の仕事が終われば、後に入ったものから順におろされる。 まぁ、メモリを食わないって事になるのかのぉ。
>>739 様、詳しくありがとうございます。 <(_ _)>
751 :
ERROR:ブラウザ変ですよん。ってなに? :03/04/08 00:29
なるほど〜。 結構Cやってきたけど、あまり内部的なこと考えてなかったです。 考えないといけないですね〜
>>737 ,743
なるほどー。
ってことは(128*h+*t)%szの*tってのは、
tに格納されている変数の先頭アドレスが指し示す文字をコードで表し、
それをハッシュテーブル生成に使っているということなのですよね?
それと、コードは本の裏とかに載ってるANSI(ASCll)コード表ってやつが規格なのでしょうか?
windows2000 LSI C-86試食版(C-PAD使用) を使っています。 ----------------------------------------------- #include <stdio.h> /*stdio.hファイル宣言*/ int main() { char x; char moji1='C'; char moji2='言'; char moji3='語'; x='a'; printf("変数xの中身は %c\n",x); printf("変数moji1からmoji3を表示します %c",moji1); printf("%c",moji2); printf("%c",moji3); } ----------------------------------------------- で ----------------------------------------------- 変数xの中身は a 変数moji1からmoji3を表示します C言語 ----------------------------------------------- と表示されるはずが ----------------------------------------------- 変数xの中身は a 変数moji1からmoji3を表示します Cセ ----------------------------------------------- と表示されています。 日本語(2バイト)には何か特別な事が必要なのでしょうか。
754 :
ERROR:ブラウザ変ですよん。ってなに? :03/04/08 01:47
言 って漢字だから2Byteじゃん。charは1Byteなんだから 宣言の時は char moji2[2]="言" char moji3[2]="語" ってするべきじゃん? 教え方へたくそでごめん
755 :
デフォルトの名無しさん :03/04/08 01:47
質問です。 ポインタ型で宣言された変数などは必ずmallocとかを使って領域確保しなければいけないのでしょうか? char *s="Hello World."; という記述をよく見かけますが、領域確保しなくて大丈夫なのですか? 構造体へのポインタとかだとちゃんと領域確保している場合が多いような気がするのですが。
756 :
ERROR:ブラウザ変ですよん。ってなに? :03/04/08 01:50
へんなもじがあらわれるのは、 "言"を'言'としたために 2Byteから1Byteに減ったためだよ。 2Byte文字をアスキーコードに直したら 0xff 0x12 (適当)のようなもんだから0x12が消えたんかな・・?
757 :
デフォルトの名無しさん :03/04/08 01:53
>755 char *s="Hello World" は char s[]="Hello World" みたいなもんで 勝手に領域確保してくれる...らしい。 だからプログラム中で領域解放してないでしょ・・・?
>>757 確かにそうですね。
でも、そうしたら構造体の領域確保はやっぱり疑問が残りますよね。
ノード構造とかしてるプログラムは絶対領域確保してるし・・・。
>>755 "Hello World"と、char *sは分けて考えれ。
・"Hello World"の文字列が確保される。
・*sは、"Hello World"のポインタとして初期化される。
mallocを用いて領域確保(+α)する関数をつくりました 関数に領域を操作するためのポインタを渡しているのですが 初期化されていないポインタを渡すな ゴルァ!! と 怒られます こういった場合 ポインタの宣言の時にNULLで初期化するのが普通なのでしょうか?
----------------------------------------------- #include <stdio.h> /*stdio.hファイル宣言*/ int main() { char x; char moji1='C'; char moji2[2]="言"; char moji3[2]="語"; x='a'; printf("変数xの中身は %c\n",x); printf("変数moji1からmoji3を表示します %c",moji1); printf("%c",moji2); printf("%c",moji3); } ----------------------------------------------- としてみましたが ----------------------------------------------- 変数xの中身は a 変数moji1からmoji3を表示します Cxv ----------------------------------------------- と表示されます・・。 何がいけないのでしょうか。
>>759 あ、なんとなく分かりました。
文字列リテラルの場合は"Hello World"だけで実体としてメモり確保されるんですね。
でも、構造体の場合はどうなのでしょうか?
理解力がなくて申し訳ないです。
763 :
デフォルトの名無しさん :03/04/08 02:08
char *p; char *my_malloc(); p=my_malloc(); ってすればいいのでは? これなら怒られない。
765 :
デフォルトの名無しさん :03/04/08 02:09
%cは1Byte表示 2Byte以上なんで%sをつかいましょー printf("%s",moji2);
>char moji2[2]="言"; danger
767 :
デフォルトの名無しさん :03/04/08 02:12
NULL文字入るんだったね だからchar moji[3]="言" というかchar moji[]="言" がいいかも。コンパイラに任せちゃえ
>>764 構造体でも実体があれば領域確保しないでよいのですか?
具体的にどういう場合に領域確保をするのかを説明して下さると嬉しいです。
769 :
デフォルトの名無しさん :03/04/08 02:18
764のとおりに、charとかintとして考えればいいじゃん。 charとかintが集まったのが構造体だから。
>>768 リンクリストとか何とかツリーとか、基礎的なアルゴリズムを
解説してある本を読むと、ああ、なるほどと思うかも。
なるほど。 じゃあ必要に応じて拡張していきたい場合は領域確保というような理解でよいのでしょうか? 何度も何度もすみません。
皆様ありがとうございます。 ----------------------------------------------- #include <stdio.h> /*stdio.hファイル宣言*/ int main() { char x; char moji1='C'; char moji2[3]="言"; char moji3[3]="語"; x='a'; printf("変数xの中身は %c\n",x); printf("変数moji1からmoji3を表示します %c",moji1); printf("%s",moji2); printf("%s",moji3); } ----------------------------------------------- で出来ました。 char moji2="言"; でも大丈夫ですね。 下手に指定しない方が失敗が少ないのでしょうか。 char moji2[3]="言"; の場合はnull分余計に一つ確保しておかないといけないんですね。
>>774 そうですか。どうもありがとうございました。
まだまだ未熟なので、もう1回本を読みあさってみたいと思います。
>>663 自分には思いつかないアイデアでした
勉強になります
>>773 別にそれでもいいけどさ
char moji[N] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
だった場合、文字数(N)数えるの面倒じゃねえ?
778 :
デフォルトの名無しさん :03/04/08 03:18
char moji2="言";
>>777 一応下の方に
char moji2="言";
と書いてありますです。
char moji2[]="言";
のほうが無難なのでしょうか、あまり変わらないのかな・・。
たしかに
char moji2[3]="言";
は汎用性が無いので避けていた方が良さそうですね。
wchar wc='ぬ'; で、ちゃんと2ハイ゙ト分保存さるるの?
>char moji2="言"; 大丈夫じゃありません。
782 :
デフォルトの名無しさん :03/04/08 07:48
速度が問題にならない場合でも、 関数の引数や戻り値には構造体を使わない方がいいですか? struct D func(struct D); よりも、 struct *D func(struct *D); の方がいいですか?
>>782 速度が問題にならないのであれば別にいいんじゃない?
でも、構造体は大抵ポインタで渡すのが普通。
戻り値に構造体のポインタを返すには
その構造体の実体はグローバル変数か、static変数である必要があるので普通はしない
ワイド文字を使うには、まずはロカールを正しく設定しないといけないんじゃない?
ロカール…
んでは、"locale"を“ろかーる”を呼ぶスレを立ててきまつ
ローカレ
(ろけーる + ろーかる) / 2
>>790 いや、単にscaleをスカルと読む人なんだと思うぞ。
>>782 適材適所。
昔のCと違って、構造体を値渡しすること自体に問題はない。
ポインタ渡しでは内容を破壊できるが、それが気になるならconstにすればいい。
793 :
デフォルトの名無しさん :03/04/08 11:48
char str[3]; このstrには"0x123456"が入っています。 このstrに0x123456が入っていると 〜な処理をする。という風にするには if ((strcmp(str, "0x123456") == 0) { というにすればよろしいのでしょうか? それとも、 if ((strcmp(str, "123456") == 0) { とするものなのでしょうか? 何分初心者で分かり辛い質問かと思いますが ご教授お願いします。
>>793 >このstrには"0x123456"が入っています。
本当なら確保したメモリからはみ出てます。
よって両者とも間違い。
単に3バイトの整数を比較したいのなら1バイトずつ調べるか4バイトの整数型にキャストしてビット演算とかした方が良いと思う。
795 :
デフォルトの名無しさん :03/04/08 11:53
796 :
デフォルトの名無しさん :03/04/08 12:28
MS-DOSプロンプトがアクセサリに無いときは どうしたら良いんでしょう?OSはMEです。
if (str[0] == 0x12 && str[1] == 0x34 && str[2] == 0x56) { 〜な処理; }
>4バイトの整数型にキャストしてビット演算とかした方が良いと思う。 頭が腐っているのか? ・整数型に直接castすることはできない。 ・4バイトアクセスが安全にできる保証はない。 ・エンディアン依存になる。 なので、どう考えても1バイトずつ比較するべきだろう。
>>799 3バイトを比較する段階でエンディアン云々所の騒ぎではないと思う。
みなみなさまアリガdございます。 勉強になりますた。 色々ぐぐってみまっす。
黙るな。
>>1 のおかげですっかりネタスレになってしまった伝統スレはここですか?
どうせお前らすぐに Cを捨てて(使いこなせてもいないくせに) C++>>>C とか Java>>>C とか言うんだろ?
C>>>Ruby>>>>>>>>>>>C++>>>>>>>>>>>>>>>Java
>>811 それだと parse error before `>' でした。
int C,Ruby,Java;
C>Ruby>C++>Java;
だとコンパイルできますた
#include <stdio.h> #include <stdlib.h> typedef struct { char ch0; char ch1; char ch2; }INT; int main(void) { int *p; INT in; p = malloc(sizeof(char*) * 3); if ( p == NULL ) { printf("Memory Error\n"); } printf("%p\n", &in.ch0); printf("%p\n", &in.ch1); printf("%p\n", &in.ch2); p[0] = (int)&in.ch0; p[1] = (int)&in.ch1; p[2] = (int)&in.ch2; printf("%p\n", p[0]); printf("%p\n", p[1]); printf("%p\n", p[2]); free(p); return 0; }
815 :
デフォルトの名無しさん :03/04/08 19:53
突然なんだなんだ?
816 :
デフォルトの名無しさん :03/04/08 19:54
Memory Errorって出力するだけかYO!
mallocで確保した領域をアドレス変数の配列として扱いたいのですが、 確保した領域はアドレス変数じゃないみたいなんですけど、 うまいやり方ありますか。
818 :
デフォルトの名無しさん :03/04/08 19:56
p[0] = (int)&in.ch0; p[1] = (int)&in.ch1; p[2] = (int)&in.ch2; なんでint型にキャストしているんだ?int *の間違いか?
アドレス変数へのポインタにキャストしてアドレス変数を代入しなさい
それだとpはint *じゃまずいね。int **だね。 int **p;
821 :
デフォルトの名無しさん :03/04/08 20:04
訂正 typedef struct { int ch0; int ch1; int ch2; }INT; p[0] = &in.ch0; p[1] = &in.ch1; p[2] = &in.ch2; (22) : warning C4047: '=' : 間接参照のレベルが 'int ' と 'int *' で異なっています。 確保した領域がアドレス変数として確保されればいいんだけど たんなる変数として確保されているんだよね。 warningなしでスマートにいきたいんですが
>>821 pがint *だからいけないの。int **にする。
#include <stdio.h> #include <stdlib.h> int main(void) { float a,b; a=2.1; b=3.2; printf("%f",a%b); return EXIT_SUCCESS; } これもともと整数型だったのをfloatに変えてみたら動かないんですけど、なぜですか?
実数にモジュロ演算子って使えたっけ?
ありがとう、わかった。 感謝、感謝。
使えない
>>824 深い意味は無く、
単純に実数だとモジュロ演算はできないって覚えておけばいいのですか?
とりあえず、2.1%3.24はどういう結果に成るべきなんだ?
>>828 う・・・確かにそうだったw
答えが出せない。
納得しました。アリガト
int** ってポインタのポインタだよね? なんか意味あるの?
答えが出せないって事は、fmod みたいのを知りたかったわけじゃないのか。
intだとあまりおいしくないけど、構造体のポインタのポインタは、 構造体をポインタだけで高速にソートしたいときとかに普通に 使われるよ。 どうしてもっていうならポインタを更新したりするパターンで int realloc_int_array(size_t sz, int **pp) { int *p = (int *)realloc(*pp, sizeof(int) * sz); if (p != NULL) { *pp = p; return 0; /* success */ } return -1; /* fail */ }
int */*****************************/*p;
835 :
デフォルトの名無しさん :03/04/08 23:48
質問があります。 C言語でFANの回転数を取得するアプリを作りたいのですが、 そもそも、FANの回転数をアプリ側から知ることはできますか? できるならばその方法をご教示ください。 マザーのI/Oのアドレスにアクセスするのでしょうか? それともOS自体がFANの回転数の情報を保持してたりするのでしょうか? よろしくお願いします。
あぼーん
837 :
デフォルトの名無しさん :03/04/08 23:57
FANにエンコーダつけて、カウンターボードのアドレスを読む FANの回転数など正確にソフトで読むことは不可能だが、 モーター仕様を調べて電圧をADボードから読めば ある程度の回転数は解るかも。 1分間で何周回ったか数えてC言語のソフトに入力するのがベストかな
すみません、教えてください。
行列(最大10×10)の固有値を
Cのプログラムで求めたいです。
世には色々な方法がありますが、
ソースが手に入って、精度も良いお勧めの方法を教えてください。
希望をいえば、matlabのeigと同じ精度(欲張ってすみません)
行列要素は、実数です。ただし、対称行列ではありません。
C言語によるアルゴリズム辞典
http://www.matsusaka-u.ac.jp/~okumura/algo/ では、全部実対称行列が対象だった。(泣)
よろしくお願いします。
>>837 マザーには、温度情報が伝わっているものが多いと思うのですが、
それを読むことはできないでしょうか?
レジスタかなんかのアドレスさえ判ればなんとかなりそうなのですが。
int n; printf("FANが回った数を入力してください: "); if (scanf(" %d", &n) == 1) printf("FANが%d回、回りました\n", n);
>>843 さん
CLAPACKってCのソースも手に入るのですか?
>>841 すみません、恐らく
標準Cではできない事の質問は使用している開発環境のスレへGo!
で、指摘されていると思うのですが、
標準Cでできると思いますので。。
おそらくioctlかなんかで、レジスタアドレスにアクセスするのですが、
どなたか経験者がいないかと思ったまでです。
全然FANに関係ないのですが、
マルチスレッドプログラムで、共有する外部変数へアクセスするとき、
あるスレッドが外部変数へ書き込みする場合はロックするべきですが、
書き込みが行われない外部変数もロックするべきですか?
(つまり各スレッドから読み出ししか行われない外部変数)
>>839 固有値だけでいいのなら
NUMERICAL RECIPES in C(日本語版アリ)に載ってるよ。
固有ベクトルについては載ってないけど。
849 :
デフォルトの名無しさん :03/04/09 00:29
>>840 FA用PCには温度管理できるマザーもありますが
温度から回転数を計算するためには
回転数とPC内温度と室内温度のグラフを作ってから
推論する必要がありそうですね。(膨大なサンプリングが必要)
どちらにしても、C言語だけでは無理なのです。
>>843 CLAPACK って、FORTRAN の LAPACK を
f2c にかけただけだったような...。
>>849 そうですか。回転数はやはりアプリからは取得できないっぽいですね。
ありがとうございました。
>>852 非対称行列に使えるのはQR法だけだから気をつけてね。
>>850 その通り。
ソースをどう使うか書いてなかったから、一番手っ取り早い回答しただけ。
実際、俺も同じようにC言語で固有値求めて、DSPに移植した事有ったから、
CLAPACKじゃないソースは持ってんだけど。
さすがにコレは無断で出せないしなぁ
855 :
デフォルトの名無しさん :03/04/09 00:45
>>855 会社のマシンに入ってるから、今日は無理。
手元には持ってきとくから、他の方法で解決出来なかったら後日質問して。
>>853 SPECIAL THANX!
そういうことですか!!
危ないところでした。
非対称行列の固有値を求める
場合の方が需要が多いと思うのだけど、
C言語によるアルゴリズム辞典 には対称行列に限定して
話を進めているんですよね。。。
テスト中に、どうしてもmatlabと値が一致しないので、
俺のバグだよなーって全部チェックしたよ。
>>857 特に固有値の場合、MATLABと結果が一致する事にばかり目を向けないように。
実用上、問題無い場合もある。
最終段階まで演算してみて、グラフとかで確認すべし。
>>857 そこのリンクにある「ダブルQR法」というのにかければ解けます。
お試しあれ。
数学きちんと勉強しなかったから行列って何?って感じなんだよね。 ・・・・・(;_;)
>>857 対称行列に限定したのは多分簡単なヤコビ法を使っているからだろう。
固有値を求めるのは単なる繰り返しによるものだから、キャッシュが
大きいCPUの方が速く求まる。
>>858 、859、861さんどうも有難うです。
固有値を任意に移動するルーチンを作ったので、
確認のために、固有値を表示させようという意図で
作っていたんです。だから、なるべく、matlabと同じでないと
説得力がないんですよ〜。
「ダブルQR法」ためしてみますね。
しゅ、収束しない(泣) A={ 5 8 3 6 ; 2 9 4 1 9 9 8 3 ; 6 2 1 5] だめだぁ。
>>862 MATLABと同じ結果が欲しいならCLAPACK。
CLAPACKは、LAPACK(FORTRANで作られた物)をC言語に変換したもの。
MATLABで採用されているのはLAPACK。
FORTRANから変換されたものなので、使い方に癖は有るけど。
854さん、今clapack.tgzを落としています。 これってソースが参照できるのですか? 当方 ダイアルアップ。30分は掛かりそう。
>>865 ソースは当然入っています。 大 量 に 。
がんばって、ぐぐって下さい。
846 のような阿呆が出てこないように、もうちっとテンプレ練った方がいいな
テンプレ変えれば解決すると思える誰かさんは双頭な低脳だな
854さん ありがとう! やってみます。 アドバイスありがとうです!
>>867 846が阿呆ってのは禿同だが、上級者なら適切に理由述べて、適切に誘導すべし。
テンプレ見て理解出来るなら、このスレにゃ書かねーわな。
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>871 ,872
あぼーん
876 :
デフォルトの名無しさん :03/04/09 18:17
#define begin { #define end } ってやっておいて使うと、 ソースの見た目がスマートになっていいんだけど、 なんでみんな嫌うの?
とりあえず生き埋めだな
かえって煩わしいよ。 {}はシンプルにして直感的だしタイピングも楽だ。
Cに慣れていればbegin-endブロックがスマートとは思えないんですが
880 :
デフォルトの名無しさん :03/04/09 18:33
>>876 if(a) begin
...
}
if(a) {
...
end
でもコンパイルエラーが出ませんし、
エディタの自動字下げ機能が働かなくなりますが、何か?
ちゅーか、C言語スレでナニイッテンノ?
C++ のテンプレートライブラリみたいに、マクロガリガリで組んだ ライブラリなんてないんだろうか。 まぁそれはおいといて、言語の文法を弄ってしまうようなマクロは 避けた方がいいんじゃないだろうか。
#define unless(b) if(!(b)) #define until(b) while(!(b)) とかもだめ?
駄目なものはダメ。 Perl等でもunlessなんか使うなよ。
>>886 いつもそう言われるので俺は使っちゃいないが、
unless と until を使わない納得いく理由は未だに聞いたこと無い。
有名な言語で実装されてるのに、そこまで敬遠する理由は何?
884に大体同意かな >文法云々 それにif/unless、while/untilなど、真・偽の動作が逆転した表記が混在するのは鬱陶しいと思う。
確かに2通りの書き方の両方で同じ動作をするというのも 紛らわしいことがあるのかもしれないな。 if を選んだか、unless を選んだかに意味が持たせられるが、 意味を考えずに書いたりしたコードでは混乱する原因にもなるか。 オーケイ。これからも使わないよ。
そんなコードのデバッグがまわってきたら、何が何でも探し出して 小一時間問い詰めたい。 エディタの色分けもきかんし(設定かえろというのか?)。
>>887 俺は単純に、C 言語では同じ方法を実現するものは一つであるほうがイイと思う。
単純に可読性が落ちるし。初心者がポインタと配列を混同するのがイイ例だ。
単純に入門書が糞なものが多いというのもあるが。
Perl はうろ覚えなんだが、たしか if (a != b) も unless (a == b) も同じだよな?
unless(a == b): a と b は等し…くない
if (a != b): a と b は等しくない(キッパリ
…の方がイイと思うな。少なくとも俺はコードから脳内妄想に変換する時に楽だ。
Perl は一つの事をするのにいくつかの方法を差し出すのが言語の思想だろう。
unless や until があるのもそのせいかと。
文法の特徴にも言語の思想は出ると思うよ。begin/end にしても、実用性重視の
C がブレースを選択したのは至極当然だろう。だってタイプが面倒だもん。
…こんなもんでどうだい。俺の解釈だけど。
あぁ、他人と喋りながら文章書いたから、なんだかタケーシな内容になってるな…。 適当に文法を修正して読んでくれ。
perlだとif、unlessすらあまり使わず済ますんで a == b and &foo; a != b or &bar; とか、もう書いてる時点でも何だか分からなくなる(w
>>890 VCのユーザ定義キーワードは便利だぞ。
>>891 「ちょっと長めの条件の否定」を使う場合に、
ネストが減って見やすいというのはありますえ。
あと、unless(isdigit(ch)) とか。
>>894 > VCのユーザ定義キーワードは便利だぞ。
む…こんな機能あったのか。ていうか、何のために使うんだ?まさか M$ の人間は
>>876 みたいな事を?…中の人も大変だな。
> 「ちょっと長めの条件の否定」を使う場合に、
むぅ、これは盲点。たしかにそうかもしれんが…否定演算子があるのに文法まで
いじる必要はあるんだろうか、とも思う。
まぁぶっちゃけ好みの問題だろ。
size_tとかをキーワードにするんじゃねーの?
マクロが華の LISPer はどういう意見を持ってるのか気になるところだ。
>>895 >ユーザ定義キーワード
特定のトークンに色を付けられる機能。
VC の exe と同じところに USERTYPE.DAT というファイルを作り、
その中にキーワードを列挙するだけという適当な実装方法が泣けるが、
まぁ設定のバックアップがとりやすいのは良い。
色はオプションで変えられる。
小文字の標準マクロ(offsetof など)とか、
WORD, size_t みたいな基本型みたいなもんでよく使うのに
typedef してるがために色のつかない型とか、
ちょっと強調したいのに色を付けるのに使える。
マクロのインテリセンスの無い VC6 での
スペルチェックにもなるかも。
一応普通のキーワードとは色を変えとくが吉。
>>897 > VC の exe と同じところに USERTYPE.DAT というファイルを作り、
そのファイルをつくるためのフォームはないんですか?(泣
.NET ではどうなったんだろうねぇ。 ユーザ定義キーワード。 使いやすくなってんのかな。 まだ試したこと無いや。
おーできたできた。 msdev.exe(Developer Studio)と同じところに置くのね。
902 :
デフォルトの名無しさん :03/04/09 21:06
2次元配列を引数で渡す方法について教えてください a() { char data[10][10]; ・ ・ b(data); ・ ・ } b(char get[10][10]) { ・・ x=get[2][2]; ・・ } これで合ってますか? もし、合ってるとしたら、これは a側で作られたエリアを参照していることになるのでしょうか? どうかごきょーじゅよろしくお願いします。
□□■Ω■□□ □□■■■□□ □□□ □□□ □□ □□□ ゜ ━
909 :
デフォルトの名無しさん :03/04/10 04:37
CでマザーボードのBIOSの種類やバージョンを 調べることが出来るでしょうか?
911 :
デフォルトの名無しさん :03/04/10 06:19
戻り値をchar*にしようとすると、「ローカル変数またはテンポラリのアドレスを返します。」 と警告が出ます。ポインタを返すにはどうすればいいですか。
http://www.saitama.gasuki.com/kaorin/ こんなのございま−す♪
 ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜oノハヽo〜
,.-''"¨ ̄●`' ‐(^▽^)
(,,●i,,,i,,,,,,,,i,,,,●),,)⊂ )
) ( || |
( ^▽^) (_(__)
~~~~~  ̄ ̄ ~~~~~ ~~~~~
あぼーん
______
/_ |
/. \ ̄ ̄ ̄ ̄|
/ / ― ― |
| / - - |
||| (5 > |
| | | ┏━┓| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | | ┃─┃| < こんなサイトを見つけた
|| | | | \ ┃ ┃/ \ 正直、スマンカッタ
| || | |  ̄ \_________
http://saitama.gasuki.com/kensuke/
>>911 そのエラー内容だとなんか
自動変数のアドレスを返しているみたいだが?
>>916 ?。コードはこんな感じなのですが。
char*CountTime(long miriByou)
{
long mB=miriByou;char s[11];int a;
sprintf(s,"%1d~%2d'%2d\"%2d",mB/3600000,mB%3600000/60000,mB%60000/1000,mB%1000/10);
for(a=0;a<=9;a++)if(s[a]==' ')s[a]='0';
return s;
}
>>917 char s[11]の存在は関数CountTime内のみ保証する一時的なもの。
だからそんなオブジェクトへのポインタを戻り値にして
使用すべきではない、という警告
君はCの基礎学習が必要や
>>917 とりあえず static char s[11];
としてみ。
sprintfの中の人も大変だな。
>>917 普通はそのような目的ではchar*を戻り値にしない。
#include <stdio.h> void CountTime(long miriByou, char s[11]); int main( void ) { char str[11]; CountTime(1500, str); printf("%s\n",str); return 0; } void CountTime(long miriByou, char s[11]) { long mB=miriByou; int a; sprintf(s,"%1d~%2d'%2d\"%2d",mB/3600000,mB%3600000/60000,mB%60000/1000,mB%1000/10); for(a=0;a<=9;a++)if(s[a]==' ')s[a]='0'; } バッファの先頭アドレスを渡す
>>909 標準Cでも出来るけど、かえって面倒だよ。
>>921 まあ同じことだが
void CountTime(long miriByou, char s[]); の方がいい。
C99-IIはこういう仕様にしようよ。 #include <stdio.h> int main() begin (*printf)("hello, C99-II"); end
またオマエか…
>>925 要望スレじゃないYO、質問してください。
マ板に「C99-IIを作ろう」スレでも立てて引きこもってろ
929 :
デフォルトの名無しさん :03/04/10 10:21
ちょっと質問。 仮引数でのchar s[] は char *sと同じになるってことでいい?
>>930 >どのような時に使うのですか
受け取ったバッファの特定のアドレスを教えたい時とか・・
>>930 一文で書けると確かにいいだろうけど
他の関数が軒並み戻り値ではなく引数にchar*を受け取るのはなぜかを考えてくれ。
> for(;pro<=36000000&&cnt<=60;) while使えばいいのに。
規約でwhileとdoとswitchは禁止されていますです。
>sprintf(s,"%1d~%2d'%2d\"%2d",mB/3600000,mB%3600000/60000,mB%60000/1000,mB%1000/10); >for(a=0;a<=9;a++)if(s[a]==' ')s[a]='0'; sprintf(s, "%1d~%02d'%02d\"%02d", // 以下略
>警告無しにできましたが、以下のソースでは失敗してしまいます。 どう失敗したかくらいは書こう。 で、staticの意味くらい調べよう。 staticで確保した領域はただ一つしかないから、二度目の呼び出しで 上書きされてしまう。そのソースの使い方なら、呼び出し元で 別領域にコピーしておく必要がある。
一文で書けるぞ。 #include <stdio.h> char *CountTime(long miriByou, char s[]); int main(int argc, char **argv) { char tmpBuf1[11], tmpBuf2[11]; printf("%s, %s\n", CountTime(1000, tmpBuf1), countTime(1500, tmpBuf2)); return 0; } char *CountTime(long miriByou, char s[]) { long mB=miriByou; sprintf(s,"%1d~%02d'%02d\"%02d",mB/3600000,mB%3600000/60000,mB%60000/1000,mB%1000/10); return s; }
939 :
デフォルトの名無しさん :03/04/10 11:44
>>938 の
char *CountTime(long miriByou, char s[])
これを
char *CountTime(long miriByou, char *s)
これにしても一緒?
>>938 の
char *CountTime(long miriByou, char s[])
これを
char *CountTime(long int miriByou, char s[])
これにしても一緒?
お答えありがとうございました。
>>936 初めて知りました。
>>937 時間を表示する所に ・E と表示されました。
>>938 できますね。戻り値を使用するのは警告のと同じですが、
戻り値用のアドレスを指定しているので、しっかり動くのですか?
>>943 =917
関数の戻り値であるポインタは、呼び出し元が確保した配列を指している。
なので、問題がない。
最初のように、呼び出された関数内で定義された自動配列は
呼び出し元に戻るときに破棄されるので参照してはいけない。
staticな自動配列を使った場合は、その配列自体は保証されるが
呼出しごとに破壊されるので呼び出し元での取り扱いに注意が必要。
946 :
デフォルトの名無しさん :03/04/10 14:52
ぬるぽって0なの?
ヒミツヲバラシタナ…!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>946
>>944 分かりました。ありがとうございました。
呼出しごとに破壊されるってどうゆうこと?
>>949 呼び出すたびに別の値で上書きされるってこと
951 :
デフォルトの名無しさん :03/04/10 18:37
double形の一桁目を抜き出すにはどうしたらいいですか? int形だったら int i = 2147483647; return i % 10; って出来たのですが double d = 4294967295; return d % 10; だと(error C2296: '%' : 不正な左オペランドです。)がでるんです。
952 :
デフォルトの名無しさん :03/04/10 18:39
intにキャストして10で割った余りを得る。
0.001234 の一桁目を同扱えばよいのか言ってみろゴラア
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>953-954
キサマトイウヤシハ
ショウコリモナク
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>956
>>952 ダメ。桁数が大きい場合にワヤになる。
fmod で余りを求めてから fabs で絶対値をとって
floor で小数点以下を切り捨てる。
>>958 やっぱりつっこまれたよー ウワァァァン`Д´)/
960 :
デフォルトの名無しさん :03/04/10 20:02
>>958 long doubleだった場合もそれでいけますか?
floor とか fmod って double を引数に取るみたいなので
long double ではまた別の方法を使う必要があります?
961 :
デフォルトの名無しさん :03/04/10 20:05
なぁ doubleとかって表現できる桁数<<<<有効桁数だから 一桁目が何の意味も成さないことが多いんじゃないのか?
逆やねん 表現できる桁数>>>>有効桁数
チョト違った 表現できる桁数>>><有効桁数
965 :
デフォルトの名無しさん :03/04/10 22:56
2つの6000行9列のファイルを読み込み、それぞれの要素を 割って比を求め、その値をファイルに出力させるプログラムを 書いてみて&教えてください。
scanf や fgets くらいは知っているのだろうか
>>968 それ知ってたら、あとはループと、小学校レベルの四則演算だけだと思うが・・・
970 :
デフォルトの名無しさん :03/04/10 23:36
データ数だけ配列準備?
エクセル使ったら一発じゃねーの?
データを配列に読み込ませるところで苦労してるんじゃない?
そんな単純計算はCを使わないほうが簡単そうだ。 今回は awk とか perl がうさげ?
データ区切りについて何も書いてないけど、965は問題理解してないってこと?
965大人気だな。
for文で挫折しました。 countってナンだよ!!
C言語って覚えてナンの意味があるんですか? なんかCは終わりとか言われてますけど。
覚えられなかった人が言うんだよ。
>>977 習得の意義が思いつかないなら
別に覚えなくてもいいんじゃないか
とりあえず間に合ってるってことだろう
意味があると思うことをやればいい
10列でスペース区切りのデータファイルを配列に 読み込ませたいのですが、どうすればいいの?
>>980 fgetsで1行読みこむ
strtok(デリミターをスペース), atoi やらで
strtokがNULLを返すまで配列に格納する
これを10回繰り返す。
>>977 にとって意味があろうと無かろうと
知ったこっちゃないが、必要になったら習得すれば?
ちょっとスレ違いですが 最近割り算のコストが、結構高いことに気付きました。 そこで もし double a,b; で for(〜) a=a/b; と言うのを b=1/b; for(〜) a=a*b; としたらいいじゃんと思ったのですが 問題はありますかね?
>>983 実測して速度と結果を見るしかないんじゃない?
vc++ std でためしたら大体6〜7割の時間で処理しています stdなのであまり最適化されないせいかも知れませんが。 でもやはり扱う数の大小によっては結果の精度に問題が生じますね。 そんだけです。なんか変な質問ですみませんでした。
986 :
デフォルトの名無しさん :03/04/11 18:44
川 ‘〜‘)||<ぬるぬる 川〃‘〜‘)||<ぽっ
速度稼ぐのなら、浮動小数点使わずにすます方向も考えてみる
>>983 コンパイラによってはそういう最適化をすることもある。
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>986
990 :
デフォルトの名無しさん :03/04/11 20:10
∧_∧ char* pbuf = (char*)malloc(SIZEOF_MY_ARRAY); ( ´∀`)< if(pbuf == ぬるぽ) { ( ・∀・) | | ガッ と ) | | Y /ノ 人 / ) < >__Λ∩ _/し' //. V`Д´)/ < return だめぽ; (_フ彡 / }
ぬ
る
やめた
995 :
デフォルトの名無しさん :03/04/11 23:06
ノノノハヽ (●´ー`)ハハヽゞ デヘヘ ノ つ⊂(´▽`∬∬、 (__´⌒)⌒)、,,, U)つ
┌┬┬┬┬┬┬┬┐ ├┼┼┼┼┼┼┼┤ ├┼┼●┼┼┼┼┤ ●〜┐ ├┼┼┼┼┼┼┼┤ ● ├●┼┼┼┼○┼┤ ○〜〜〜〜○ ├┼┼┼┼●┼┼┤ ├┼┼┼┼┼┼┼┤ ├┼┼┼┼┼┼┼┤ └┴┴┴┴┴┴┴┘ ○ ●○ | ○┐ ●〜〜┘ ●
| M ヽ |从 リ)〉 |゚ ヮ゚ノ| キタ… ⊂)} i ! |_/ヽ|」 |'
┏ ┓ ぬる
>>1 ∧_∧ / ̄ ̄ ̄ ̄
 ̄ ̄\ ( ´∀`)
( ) ぽ
| | | / ̄ ̄ ̄ ̄ ̄
(__)_)
┗ ┛
999 :
デフォルトの名無しさん :03/04/11 23:10
999
1000?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。