「作ってわかるCプログラミング」を書店で見て、
それでも買ってしまうようなら、Cの才能はないと思え。
3 :
デフォルトの名無しさん:01/12/28 09:42
どうすればできますか?
教えてください。
4 :
デフォルトの名無しさん:01/12/28 09:46
char cData;
sscanf(pData, "%c", &cData);//pDataは文字列のポインタ
このコードが不安定なんです。
コンパイルできません。どうしたらいいですか?
OSは Sun0S4.1.3 です。
>>3 何を?
>>4 不安定って具体的にどういうこと?
>>5 どんなメッセージが出てるの?
コンパイラの種類は?
# SunOSにはデフォルトでccはついてないような気がする
>6
ありがとう!とりあえず cc をインストールしてみる事にします!
In article
>>1, スーパーハッカー 日下部陽一/1 <
[email protected]> wrote:
> おれは42才、24年間プログラムを一生懸命作ってきた。
それってかなりおちこぼれでは? :)
In article
>>2, デフォルトの名無しさん/sage/2 wrote:
> 「作ってわかるCプログラミング」を書店で見て、
> それでも買ってしまうようなら、Cの才能はない
「ということにしたい」:) ?
10 :
デフォルトの名無しさん:01/12/28 14:21
>>8 長い間プログラムを作ってると落ちこぼれなのかよ。
あんただって、まだJavaとかやってるんだろ?
>>9 さーね、5年後くらいにはっきり結果がでるんじゃない。
三田本みたいにいわれないといいけどね(反語表現
お前ら。
臭がりすぎ〜
In article
>>10, デフォルトの名無しさん/10 wrote:
> 長い間プログラムを作ってると落ちこぼれなのかよ。
っていうか、そんなことしかしてないようじゃおちこぼれでしょう。
> あんただって、まだJavaとかやってるんだろ?
Javaをさわるとおちこぼれなんですか? :)
In article
>>11, デフォルトの名無しさん/sage/11 wrote:
> さーね、5年後くらいにはっきり結果がでるんじゃない。
でしょうね。
> 三田本みたいにいわれないといいけどね
そうですね。(さすがにあそこまでひどい本はないでしょうけど)
ほんと、よく結婚できたよな。
16 :
デフォルトの名無しさん:01/12/28 19:30
しつも〜ん
string,float,float
string,float,float
という形のCSV形式のファイルから1レコードを読み込むにはどうすりゃいいのさ?
fgets()
あ・・・すいません質問間違ってました
string,float,float
このレコードを読み込んでから、各フィールドごと変数に入れるには
どうすればよいのですか?
In article
>>18, 16//18 wrote:
>string,float,float
>このレコードを読み込んでから、各フィールドごと変数に入れるには
>どうすればよいのですか?
strtok()でフィールド分割してatof()で変換すればいいのでは?
312ペイジと314ペイジに書いてありますね。
K&R2版の:)
In article
>>19, Kusakabe Youichi /sage/19 wrote:
>312ペイジと314ペイジに書いてありますね。
>K&R2版の:)
314ペイジと316ペイジでは?
K&R2版の:)
sageクサあらわる
In article
>>21, デフォルトの名無しさん/sage/21 wrote:
> sageクサあらわる
すなおにアヒル本を読めばいいのにね:)
>>13 >そんなことしかしてないようじゃ
べつに1は、それしかしてないとは言ってないだろ。
質問です
BMP画像からRGB値を取りだしたいのですが、
どうすればいいのでしょうか。
手もとの参考書には基礎的な事しか書いてなく、
どう考えても分かりませんでした。
>>23 もともと、自分の同類を卑下した書き込みなんだからいいっしょ。
そこまで問い詰めなくても。
障害者が障害者を馬鹿にした発言をするのと同じ思考。
26 :
デフォルトの名無しさん:01/12/28 22:44
>24 簡単な方法は 画面に表示してから ビクセルを読み出すとか
In article
>>24, あべだす//24 wrote:
>BMP画像からRGB値を取りだしたいのですが、
>どうすればいいのでしょうか。
Windowsで一般的に扱われる拡張子BMPの画像はDIBと呼ばれます。
DIBのRGB表現は色深度によってインデクスドカラーとマスクドカラーに分けられます。
16色や256色と呼ばれるのが前者、ハイカラー、フルカラーと呼ばれるのは後者です。
この両者は色データの表現方法が違うので、RGB値を取り出す方法も違ってきます。
まずはDIBのファイルヘッダ情報を解析するところからはじめてはどうでしょうか?
>>28 いや、RLE圧縮とかもあるし、オフスクリーンに展開するというのは普通の方
法じゃないか? たぶん1ピクセルだけ取り出して終りってわけでもないだろう
し。
>>30 「オフスクリーンに展開するというのは普通」だね。
In article
>>32, 28/sage/32 wrote:
>「オフスクリーンに展開するというのは普通」だね。
言葉尻をとった無意味な書き込みはやめたほうがいいのでは?
もっと内容のある情報を共有しましょう:)
>>33 >言葉尻をとった無意味な書き込みはやめたほうがいいのでは?
話の流れを読まずに無意味な書き込みはやめたほうがいいのでは?
>>27「画面に表示してから」に対して
>>30「オフスクリーンに展開するというのは普通」
と書いたから、
>>32「だね。」と同意したまで。
よく読め。
#つーか、その名前やめれや。
実際、Cで開発してるときassertを使うことってあるんでしょうか?
林晴比古の本は良くないって本当なの?
assert使うよ。
37 :
デフォルトの名無しさん:01/12/29 02:42
mainが700行近くあるプログラムを見たんだけど、みんなそんなもん?
腐れプログラムはそんなもんだ。
じゃあ、普通はどんなくらいで済むのかと聞きたい。
逆に isSuccess とか何気ない名前で
1000行位かましたった方が効果的
42 :
デフォルトの名無しさん:01/12/29 03:04
林晴比古最高だよ。
日下部って人が
「作ってわかるC〜」だったかの著者だったとは・・・
あんなんでも本が出せるのか
林破留非故は最悪です。
まもなく降臨
>>40 漏れは現場経験ないし、自分で書く時は多くても100行ぐらいだから
700行なんて異常だと思ったんだけど…。
現場じゃ当たり前なのかな?
世の中には常軌を逸したソースというのが結構あるのだ。
48 :
デフォルトの名無しさん:01/12/29 03:51
>>46 世の中にはさ、なんつーか常識じゃ考えられないソースを
書く人もいるわけよ
>>43 本物はもう少し偏屈で根性の曲がった性悪で卑屈な人です。
In article
>>22, Kusakabe Youichi/22 <
[email protected]> wrote:
> In article
>>21, デフォルトの名無しさん/sage/21 wrote:
> > sageクサあらわる
> すなおにアヒル本を読めばいいのにね:)
それはどんな本ですか?
In article
>>29, Kusakabe Youichi /sage/29 wrote:
> まずはDIBのファイルヘッダ情報を解析するところからはじめてはどうでしょうか?
ダウト
In article
>>33, Kusakabe Youichi/sage/33 wrote:
> >「オフスクリーンに展開するというのは普通」だね。
>
> 言葉尻をとった無意味な書き込みはやめたほうがいいのでは?
> もっと内容のある情報を共有しましょう:)
「共有」してどうする:)
( ´・ω・)ショボーン
糞壁!
文句ばっか言ってないでヤホーの掲示板で
困ってる初心者に教えにいってやれよ
クッサカベさん。奥さんは未だマゾですか?
>>50 >> すなおにアヒル本を読めばいいのにね:)
>
>それはどんな本ですか?
ログくらい読めよ。>日下部
人には本買えとか読めとか言ってるくせに。
実際のプログラムで、assertの使い時とは?
58 :
デフォルトの名無しさん:01/12/29 12:21
>>57 引数で、範囲外の値だとかNULLは処理しないのにNULLが渡されたときとか。
配列の値がソートされているはずなのにされてないとか、プログラム内部の
データがおかしいとき。
ファイルとか、キー入力のような外部からのデータにはassert()は使わない。
59 :
デフォルトの名無しさん:01/12/29 13:33
今、3年ぶりぐらいにassert()の存在を思い出した……。
そういえばそんなのも有ったな。
活用した事が無い漏れって、DQN?
うーん assertで引っ掛けるのはデバック完了迄でしょう
必ずしもDQNとはいわないが、知っとくべきだろうな。
マクロ切ってデバッグビルド時にだけ有効にしとくのが常道。
In article
>>43, デフォルトの名無しさん/sage/43 wrote:
> 日下部って人が
> 「作ってわかるC〜」だったかの著者だったとは・・・
> あんなんでも本が出せるのか
買ってみればいいのに。
In article
>>54, デフォルトの名無しさん/sage/54 wrote:
> 文句ばっか言ってないでヤホーの掲示板で
> 困ってる初心者に教えにいってやれよ
ヤホー?
65 :
デフォルトの名無しさん:01/12/29 13:56
>>62 >マクロ切ってデバッグビルド時にだけ有効にしとくのが常道。
オレもそう思ってたけど、このまえ読んだ「達人プログラマ」には
リリースバージョンでも残しとけって書いてあった。
(ま、好き好きだと思うけど)
coreを取ることができない場合には助けになることがあるな。
ちょっとスレの志向と違うかもしれませんが、
最近公開されたQuake2のソースとか読みたいんですけど
膨大な数のソースファイル、関数を読むのを支援してくれるツールとかってなんかないでしょうか?
68 :
デフォルトの名無しさん:01/12/29 19:21
69 :
デフォルトの名無しさん:01/12/29 19:21
すまんっす。VC++です。linuxでも可です
>>71 それは構造体のメンバだから?
それとも普通の配列宣言でもマクロはだめ?
>>73 マクロ使うのはOK。
struct a {
int namelen;
char namestr[10];
};
struct b {
int namelen;
char namestr[20];
};
のとき、offsetof(struct a, namestr) == offsetof(struct b, namestr)である
保証がないということ。C99では配列の長さを変数にした場合や省略した場合、
struct c {
int namelen;
char namestr[namelen + 1];
};
struct d {
int namelen;
char namestr[];
};
において、offsetof(struct c, namestr) == offsetof(struct d, namestr)となる
ことが保証されてる。
In article
>>70, デフォルトの名無しさん/sage/70 wrote:
>
http://www.catnet.ne.jp/kouno/c_faq/c2.html#0 > ↑の2.6のAで書かれている
> struct name {
> int namelen;
> char namestr[MAXSIZE];
> };
> が「規格の厳密な解釈によると許されない」というのが
> わかりません。構造体のメンバに配列はだめってこと?
その構造体自体は何も問題ないですね。
そうではなく、[1]の一番小さいのだけとって「かぶせて」使うのと同じように、
mallocとかでその構造体のsizeof分だけとるのではなくて、それより小さくとった
ものに「かぶせて」(もちろんnamestrに書くときにははみ出さないように気をつけて)
使うことが問題あるということでは?
>>74 古い規格では構造体内の配列のサイズが違うと、構造体内でのアドレスのオフセット
が同じである保証が無いということですね。
>>75 凄く解りやすい。納得。
本物ですか?(藁
激しく良スレ化 age
>>77 > 古い規格では構造体内の配列のサイズが違うと、構造体内でのアドレスのオフセット
> が同じである保証が無いということですね。
C99でも配列のサイズが定数の場合は保証されません。
保証されるのは、新しく導入された可変長配列を使った場合だけ。
>>79 保障されないことによって不具合が生じるコードは
例えばどんなものですか?
>>79 どもです。
オフセットが保証されないってことは、仮想的に宣言した配列でかぶせるという
行為自体が危険ですね。
標準規格の変遷にちょっと興味が出てしまいました。
詳しいサイトとか無いでしょうかね。
できれば日本語(^^;
>>80 こういう使い方がマズイということじゃないかな。
struct a{
int namelen;
char namestr[10];
};
struct a{
int namelen;
char namestr[20];
};
foo()
{
struct a *pa;
struct b *pb;
pa = malloc(sizeof(struct a));
/* pa->namestr[] に値をセット*/
pb = (struct b)pa;
/* pb->namestr[] の値を参照*/
}
>>82 訂正です
誤)pb = (struct b)pa;
正)pb = (struct b*)pa;
>>80 下のようなコードを書く際、bar()を呼んでもhogeと表示される保証がないという
こと。俺はhogeと表示されない処理系は見たこと無いし、
struct sockaddr_in sin; して bind(s, (struct sockaddr *)&sin...)すら
規格では保証されないことなるのであまりこだわってもしょうがないとも思う。
#define MAXSIZE 1024
struct name {
int namelen;
char namestr[MAXSIZE];
};
void foo(struct name *np)
{
printf("%s\n", np->namestr);
}
void bar()
{
struct my_name {
int namelen;
char namestr[5]; /* 5で充分 */
} n = { 4, "hoge" };
foo(&n);
}
そういえば、昔参加したプロジェクトでデータを
こんな感じに宣言してたことがあった。(変数名は適当)
#define DATA_HEAD \
int id; \
void *next; \
void *prev; \
int size; \
typedef struct {
DATA_HEAD
data[DATASIZE1];
} DATA1;
typedef struct {
DATA_HEAD
data[DATASIZE2];
} DATA2;
今おもうとC言語で「継承」を実装しようと考えられた結果
なんだろうけど、ANSI的には保証外のコードということにな
りますね。
もちろんそのプロジェクトのプログラムは問題なく動いて
いましたが(^^;
あ、でも。ちゃんとキャストを適切に行っていれば
>>85のコードも
規格上問題ないコードか。
87 :
デフォルトの名無しさん:01/12/29 21:30
手続き型の言語って要するになにが特徴なのでしょうか。教えてください。
ローカル変数
| ___________ |
| | _________. | |
| | | 故・糞壁を斬る! | | |
| |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | 1.マ板 ∧ ∧ .,, < 粘着にかけては世界一だった!
| | 2.ム板 (,, ゚Д゚)/ビシッ \__________________
| |. :__(__つ__ | |
| | | ギコ猫大助教授 | || オオー
|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | サスガ!
|_____________|
| ___________ |
| | _________. | |
| | | 故・糞壁を斬る! | | |
| |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | 1.マ板 ∧ ∧ .,, < 粘着にかけては世界一だった!
| | 2.ム板 (,, ゚Д゚)/ビシッ \__________________
| |. :__(__つ__ | |
| | | ギコ猫大助教授 | || オオー
|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | サスガ!
|_____________|
↑ コイツ何必死になってるの? (^_^;
94 :
デフォルトの名無しさん:01/12/30 07:22
相変わらず薄っぺらい人だね
お料理板ってマターリしててほんと2chの中でもかなりいい板だったのに、、、、ご愁傷様。
In article
>>93, デフォルトの名無しさん/sage/93 wrote:
> ↑ コイツ何必死になってるの?
何か「必死になっている」ことにしたいらしい:)
In article
>>94, デフォルトの名無しさん/94 wrote:
> 相変わらず薄っぺらい人だ
「ということにしたい」
宣伝とか客とかわけわからん。
これがホンモノのデンパってやつ?
99 :
デフォルトの名無しさん:01/12/30 07:40
おこってるおこってる :-)
>96 名前:Kusakabe Youichi :01/12/30 07:30
>In article
>>93, デフォルトの名無しさん/sage/93 wrote:
>> ↑ コイツ何必死になってるの?
>何か「必死になっている」ことにしたいらしい:)
>97 名前:Kusakabe Youichi :01/12/30 07:30
>In article
>>94, デフォルトの名無しさん/94 wrote:
>> 相変わらず薄っぺらい人だ
>「ということにしたい」
馬鹿?
In article
>>98, デフォルトの名無しさん/sage/98 wrote:
> 宣伝とか客とかわけわからん。
> これがホンモノの(I筑殃澆辰討笋ト?
ってことにすればごまかせるとも思ってるのかな? :)
In article
>>99, デフォルトの名無しさん/99 wrote:
> おこってるおこってる :-)
「っていうことにしたい」? :)
In article
>>100, デフォルトの名無しさん/sage/100 wrote:
> >96 名前:Kusakabe Youichi :01/12/30 07:30
> >In article
>>93, デフォルトの名無しさん/sage/93 wrote:
>
> >> ↑ コイツ何必死になってるの?
>
> >何か「必死になっている」ことにしたいらしい:)
>
>
> >97 名前:Kusakabe Youichi :01/12/30 07:30
> >In article
>>94, デフォルトの名無しさん/94 wrote:
>
> >> 相変わらず薄っぺらい人だ
>
> >「ということにしたい」
>
> 馬鹿?
ということにしたい?
In article
>>100, デフォルトの名無しさん/sage/100 wrote:
>馬鹿?
ようやく気づきましたか :)
>103 名前:Kusakabe Youichi :01/12/30 07:50
>In article
>>100, デフォルトの名無しさん/sage/100 wrote:
>> >96 名前:Kusakabe Youichi :01/12/30 07:30
>> >In article
>>93, デフォルトの名無しさん/sage/93 wrote:
>>
>> >> ↑ コイツ何必死になってるの?
>>
>> >何か「必死になっている」ことにしたいらしい:)
>>
>>
>> >97 名前:Kusakabe Youichi :01/12/30 07:30
>> >In article
>>94, デフォルトの名無しさん/94 wrote:
>>
>> >> 相変わらず薄っぺらい人だ
>>
>> >「ということにしたい」
>>
>> 馬鹿?
>ということにしたい?
>104 名前:Kusakabe Youichi :01/12/30 07:50
>In article
>>100, デフォルトの名無しさん/sage/100 wrote:
>>馬鹿?
>ようやく気づきましたか :)
へ?
108 :
デフォルトの名無しさん:01/12/30 08:01
うんうん
In article
>>104, Kusakabe Youichi/sage/104 <
[email protected]> wrote:
> In article
>>100, デフォルトの名無しさん/sage/100 wrote:
>
> >馬鹿?
>
> ようやく気づきましたか :)
意味不明ですね。
In article
>>105, デフォルトの名無しさん/sage/105 wrote:
> >>Kusakabe Youichi
> ↓の板であなたのことが話題になってますよ。
そうやって
ここで宣伝するとお客さんが来るとでも思ってるのですか? :)
111 :
デフォルトの名無しさん:01/12/30 08:08
思ってるのですかと思ってるのですか? :-)
112 :
デフォルトの名無しさん:01/12/30 08:09
>意味不明ですね。
いみふみょう??
>ここで宣伝するとお客さんが来るとでも思ってるのですか? :)
こる?>来る
> ここで宣伝するとお客さんが来るとでも思ってるのですか? :)
うん。
115 :
デフォルトの名無しさん:01/12/30 19:20
C99
D51
先生方、質問です!
今、本に書いてあるプログラムを打ってビルドしてみたのですが
上手くいきません。
平均値を算出するプログラムなんです。
で、好きな数数字を入力した後「^D」と打つと平均値を算出するようなのですが
なぜか「^D」を打った時点で永遠にループしてしまうんです。
ソース載せますので原因を教えていただきたいのです・・・
開発環境はWin98,VisualC++6.0です。
#include"stdio.h"
main()
{
double ave;
int data;
int num=0;
double sum=0;
printf("to terminate input ^D\n");
printf("data=");
while(scanf("%d",&data) !=EOF)
{
sum+=data;
num++;
printf("data=");
}
if(num==0)
printf("can't calculate the average\n");
else
{
ave=sum/num;
printf("the average of %d data is %f\n",num,ave);
}
}
>>117 > なぜか「^D」を打った時点で永遠にループしてしまうんです。
> 開発環境はWin98,VisualC++6.0です。
WindowsではキーボードからのEOFは^Zだから。
scanf()が^Dを変換できなくて0を返すので、ループする。
sfanf() != 0にしてみ。
出来ました!!!!!!!!!!!!!!!!!!!!!!
ありがとうございます♪
迅速にお答えいただき大変ありがとうございました。
>119先生
In article
>>117, なぜ?/117 wrote:
> 先生方、質問です!
> 今、本に書いてあるプログラムを打ってビルドしてみたのですが
> 上手くいきません。
> 平均値を算出するプログラムなんです。
> で、好きな数数字を入力した後「^D」と打つと平均値を算出するようなのですが
> なぜか「^D」を打った時点で永遠にループしてしまうんです。
それは本がだめなのでしょう。
In article
>>119, デフォルトの名無しさん/sage/119 wrote:
>
>>117 > > なぜか「^D」を打った時点で永遠にループしてしまうんです。
> > 開発環境はWin98,VisualC++6.0です。
> WindowsではキーボードからのEOFは^Zだから。
^Z + 直後の改行では?
(あ、改行の直後の+Zである必要もあるか)
> scanf()が^Dを変換できなくて0を返すので、ループする。
っていうかscanf()つかってる教科書って...。
>>118 stdio.hは ""じゃなく <> で囲んどけ。
また嘘つきが現れたね
In article
>>123, デフォルトの名無しさん/sage/123 wrote:
>
>>118 > stdio.hは ""じゃなく <> で囲んどけ。
それに、なんで空白あけないんだろう。
なんか悪い本の影響らしいが。
>なんか悪い本の影響らしいが。
ああ あの本ですねきっと (笑
>ああ あの本ですねきっと (笑
ア○ル本?
納得。
なんでスペース入れることにこだわるのかが前から疑問。
「○○っ□□わかる○○ロ△ラミング」
>>128 見やすさにはとことん拘れ ====終了====
>>129 日下っ部もわかるCプログラミング
In article
>>128, デフォルトの名無しさん/sage/128 wrote:
> なんでスペース入れることにこだわるのかが前から疑問
っていうかなぜ抜くのか疑問。
>なんか悪い本の影響らしいが。
うんうん納得。あの本で勉強してもダメでしょ。
もっといい本を買いましょう。
In article
>>132, デフォルトの名無しさん/sage/132 wrote:
> > なんか悪い本の影響らしいが。
> うんうん納得。あの本で勉強してもダメでしょ。
でしょうね > #inlucdeのあと空けない本
大学で使っている教科書なんですが・・・
ダメダメでしょうか?アヒル本じゃないんですが・・・
一応この本には<>でくくってあるんですが
なんか友達に""でくくった方がカコイイって言われててw
#include での <> と "" は意味が違う。カコイイ・カコワルイの問題じゃない。
136 :
デフォルトの名無しさん:01/12/31 16:41
137 :
デフォルトの名無しさん:01/12/31 16:47
>>134 自分で用意したファイルだけ""を使え。
#include "./itteyoshi.h" こんな感じに
>>137 > #include "./itteyoshi.h" こんな感じに
./ は付けない方がよくないか?
139 :
デフォルトの名無しさん:01/12/31 16:52
>>138 念のためつけてみたが、やっぱりないほうがいいか。
意味が違うんですか!?知らなかった・・・
早速調べてみます。
とりあえずは自分が用意したファイルだけ
""でくくっておけば問題ないわけですね。
なるほど。
もう一つ質問したいのですが、
n=0
と
n==0
とでは何が違うんでしょうか?
イマイチわからないんですが・・・
おまえなぁ・・・・
ちょっと本読み直せよ
誰か答えてくれるだろから俺は書かないぞ
142 :
デフォルトの名無しさん:01/12/31 17:15
>>140 n=0 これはnに0を代入
n==0 これはnの値が0と等しいかどうかの比較
すいませんでした。読み直してみたんですが
ある時から突然使われていたのでどう違うのかなと思ってたんです。
includeについては調べて何となく理解できました。
2重に括るとどうなるかの部分がイマイチ理解できませんでしたが・・・
n==0は比較なんですか・・・
だとすると
if(n=0)
といった構文はおかしいんですね。
くだらない質問にお答えいただいてありがとうございます。
本当に助かりました。
144 :
デフォルトの名無しさん:01/12/31 17:27
>>143 おかしくない。条件式の中で代入することはよくやることだ。
といっても、if(n=0)じゃ絶対に偽になるけどな。
ああぁ、、、
なるほど。そうすると
if(n=0)
は必ず偽になるので判別としての意味は無いということですよね?
そう、でif(0==n)と書く癖を付けるといいかも、
と言うお話な
でも自分でも調べろゴルァ〜ん
何度も何度もお答えいただきありがとうございました。
頑張ってみます♪
本当にありがとうございました。
Cの道はまだまだ険しい
In article
>>134, できた!/134 wrote:
> 大学で使っている教科書なんですが・・・
> ダメダメでしょうか?
タイトルは何でしょうか?
できれば大学名も。
> 一応この本には<>でくくってあるんですが
> なんか友達に""でくくった方が
そのへんの説明は270ペイジに書いてあります。
In article
>>140, できた!/140 wrote:
> 意味が違うんですか!?知らなかった・・・
それさえ書いてない教科書なんですかー
なんて言う本だろうか?
> もう一つ質問したいのですが、
> n=0
> と
> n==0
> とでは何が違うんでしょうか?
かなり意味がちがいますね。
どんな本を使っているのだろう?
>>152 アヒル本つかってます。
クソの役にもたちません。
In article
>>153, できた!/153 wrote:
> アヒル本つかってます。
> クソの役にもたちません。
と、いうことにしてみたいが、実際には買っていないので、
こじつけができない :)
# こわらがずに買えばいいのにー:)
こわいから買いません。
153は偽者です
ばれたか。
すまん >156
うっせ!!氏ね!!
また真似るしw
止めれ
160 :
デフォルトの名無しさん:01/12/31 22:37
linux,gccでのfork()関数は、windowsのVCでは何の関数にあたるのでしょうか?
161 :
デフォルトの名無しさん:01/12/31 23:02
CreateProcess
162 :
デフォルトの名無しさん:01/12/31 23:48
void *(vector_alloc)(size_t size, long nl, long nh)
{
void *v = malloc(size*(nh-nl+1+NR_COMPATIBLE));
if (!v)
return NULL;
else
return v - size*(nl-NR_COMPATIBLE);
}
これさっぱりわからないんです。具体的にこれの返り値ってなに?
あとvoidって返り値無しってことじゃないの?
163 :
デフォルトの名無しさん:01/12/31 23:51
>>162 void *は型の決まっていない汎用ポインタ
汎用ポインタだから型変換せず何にでも入れられる
165 :
デフォルトの名無しさん:02/01/01 00:00
2002年か・・・
166 :
デフォルトの名無しさん:02/01/01 00:01
ありがとう、知らなかった。
void 辞書で引いたら空虚って事だった
なぜ空虚なものへのポインタが型の決まってないものへの
ポインタなのか考えるとミラクルなので
考えない事にします。
167 :
デフォルトの名無しさん:02/01/01 00:01
みんなおめでとー
新年だよー(・∀・)ノ
float a(int a){}
の関数はreturnで値を返すと
最初の無名float型の変数に代入されて
呼び出し側で使われる、、
らしい。
In article
>>155, デフォルトの名無しさん/sage/155 wrote:
> こわいから買いません。
こわがりすぎー
In article
>>162, デフォルトの名無しさん/162 wrote:
> これさっぱりわからないんです。具体的にこれの返り値ってなに?
> あとvoidって返り値無しってことじゃないの?
「かえりち」って読むんですか? :)
そう返り血だ。
>そう返り血だ
ということにしたい?
草、こわいょぅ>(;´д`)⊃ (^-^;)<こわがりすぎー
In article
>>172, Kusakabe Youichi /sage/172 wrote:
> >そう返り血だ
>
> ということにしたい?
引用の仕方がちがうって。
In article
>>173, デフォルトの名無しさん/sage/173 wrote:
> 草、こわいょぅ > (;´д`)⊃ (^-^;)<こわがりすぎー
元来のこわがりすぎ体質なんですか?
おい、糞壁1月1日だぞ
お年玉よこせやゴルァ!
パパ、お願い(はぁと)
177 :
テレホマン:02/01/01 06:08
C系のスレが欲しいテレホタイムこのごろです。
char *(testc)(void){
char *c=malloc(sizeof(char)*5);
return ++c;
}
void *(testv)(void){
void *v=malloc(sizeof(char)*5);
return ++v;
}
void *(testcv)(void){
void *v=malloc(sizeof(char)*5);
return ++((char*)v);
}
gccとbcc32でコンパイルしてみたら、gccでは全部問題ないのに
bccでは真中のは
エラー E2453 pointerinc.c 12: 'void' 型のサイズは未知あるいはゼロ(関数 testv )になるのは何でだろ
bccでは一番下のと入れ替えてもだいたい意味は一緒ですか?
void型はサイズを求める事が出来ないのでポインタ演算も出来ない
void * に対して演算ができるのはgccの拡張仕様
void *p;
p++;
の結果はどうなるの?
181 :
デフォルトの名無しさん:02/01/01 14:02
Size of the type 'void' is unknown or zero
サイズがわかんねーのにどうやって進めるってんだよ
gccだと sizeof(void)は1だけど、オプションでエラーに出来たかも。
183 :
デフォルトの名無しさん:02/01/01 20:58
以前、fj.comp.lang.cあたりを読んでいたら、
「C言語を勉強しているのですが、ポインタがよくわかりません。教えてください」
みたいなポストがあって、ま、fjみたいな場所に、こんな書き込みをする方もする方だと思いますけれどもそれは取り敢えず置いとくとして、それに対するフォローアップが、
「コンピュータのメモリとアドレスの概念について勉強するのがいいですよ」
とか、
「先にアセンブラを勉強したらどうでしょうか」
みたいな調子だったのを見て、ちょっと暗澹たる気持ちになりました。
In article
>>183, デフォルトの名無しさん/183 wrote:
> 「コンピュータのメモリとアドレスの概念について勉強するのがいいですよ」
> とか、
>
> 「先にアセンブラを勉強したらどうでしょうか」
> みたいな調子だったのを見て、ちょっと暗澹たる気持ちになりました。
ごくふつうの反応では?
前橋対日下部?
In article
>>185, じゃあ/185 wrote:
> 前橋対日下部?
それはだれですか?
>>182 -Wpointer-arithですかね
前橋和弥?
189 :
デフォルトの名無しさん:02/01/02 03:59
ansiでmktempやgetenvで帰ってきたポインタってfree()する必要あるんですか?
それともしちゃいけないんですか?
190 :
デフォルトの名無しさん:02/01/02 04:09
お前はfreeに付いて何も分かって無い
kusakabe先生に教えてもらえ w
191 :
デフォルトの名無しさん:02/01/02 04:14
Cプログラムを書くのにお勧めのエディタってありますか?
メモ帳だといくらなんでもキツイので。
できればフリーのエディタがいいです。
192 :
デフォルトの名無しさん:02/01/02 04:22
この下の「書き込む」って言う所で開発してるよ
超おすすめ
In article
>>190, デフォルトの名無しさん/190 wrote:
> お前はfreeに付いて何も分かって無い
> kusakabe先生に教えてもらえ
とかけばそう思うひとがいるかもしれないという効果を狙って書いたのでしょうか? :)
# 無駄なような。
In article
>>191, デフォルトの名無しさん/191 wrote:
> Cプログラムを書くのにお勧めのエディタってありますか?
viは?
> メモ帳だといくらなんでもキツイので
エディターのせいにしないように
んで、結局どうなの?
理論OR演算子が表示できません
どうすりゃいいんですか?
|||||||||||||||||||||||||||||||||||||||
>>197 どう?
In article
>>197, デフォルトの名無しさん/197 wrote:
> 理論OR演算子が表示できません
> どうすりゃいいんですか?
どんな環境を使っているんだろう。
202 :
デフォルトの名無しさん:02/01/02 05:29
シフトキーを押しながら\キーを押せば出るよ。
ゴミはお前だし
普通じゃないのはお前の出た大学だけどね ぷ
In article
>>204, デフォルトの名無しさん/sage/204 wrote:
> ゴミはお前だし
とか意味のない反応してみたところでも無駄でしょう :)
すくなくとも
http://homepage1.nifty.com/kentake/ これはゴミでしょうね。そんなので無駄な時間使う暇があるなら、
ふつうのコンパイラーでも無料なのはいくらでもあるんだから、
それを使えばいいのでは?
たまにはまともな事も言うみたいだね
YahooBBSで教えてもらったのかな?
/⌒彡
/冫、 )
/ ` ∩
(つ 丿
( ヽノ
し(_)
age
213 :
デフォルトの名無しさん:02/01/02 20:20
質問です。
char a[] = { 65, 10, 0};
と
char a[] = { 65, 10, '\0');
は同じと考えてよいのでしょうか。バイナリのdiffを取ると同じになったのですが・・・
(下段の閉じ括弧を除いて)
1.「プログラムを実行したときに」ディスプレイ上に自分の 学生証番号、氏名、住所 を表示するプログラムのソースを作成すること。
2.キーボードから入力された学生証番号、氏名、住所をディスプレイに表示するプログラム(このとき実行した人がキーボードから入力した学生証番号などが表示されるようにする)
3.ディスプレイに 整数nを入力するように表示し、0 からキーボードから入力された n 以下の偶数の和を求めその結果をディスプレイに表示するプログラム(2づつ数を増やすには +=2 を用いる)
4.ディスプレイに和を求める 番号 n を入力するように表示し、1,6,11...のような 5飛びの数の1から入力された番号nまでの和を求めてディスプレイに表示するプログラム(注意。k番目の数は 1+5*(k-1) で与えられる。)
5.10人の身長のデーターをキーボードから入力して、その平均をディスプレイに表示するプログラム(繰り返し文を使用すればよい)
6.ディスプレイに二つの 実数を入力するように表示して、キーボードから入力された二つの実数の 和、差、積、商(始めに入力された数割る二番目に入力された数)をそれぞれディスプレイに表示するプログラム
7.優、良、可にする最低点を実行時初めに設定できるようにし、その後キーボードから入力された学生の点数によって成績を優、良、可に振り分けるプログラム
8.キーボードから二つの実数を入力するように表示し、入力された二つの数を大きい順に並べて表示するプログラム
9.個人情報として、 氏名、年齢、住所、電話番号、趣味 を含んだ構造体を用いて、個人情報を入力できるプログラム
10.乱数を用いて 丁半 を表示するプログラム
解ける人は全て解いてみてください。…というよりお願いします(涙)
220 :
デフォルトの名無しさん:02/01/02 23:30
stat("foo", & statbuf);
chmod("foo", (statbuf.st_mode & S_IXGRP) | S_ISGID);
とあった時S_ISGIDビットがオンになりS_IXGRPがオフになると
詳細UNIXプログラミングのP82に書いてあるのですが
これではS_ISGIDビットだけが立つのではないのですか?
要するに
chmod("foo",S_ISGID);と同じ意味なのではないでしょうか?
間違っているのでしょうか?お願いします。
だよねぇ。
こんなバイブルと呼ばれている本にも誤植があるのかしら?
223 :
デフォルトの名無しさん:02/01/03 01:20
そりゃあります。どんな本にも間違いはあります。
読者から指摘を受けて、ちょっとづつ修正しながら10年くらいかけて100%に近づいていくのです。
たまに絶対に間違いを認めない人もいますが。
224 :
デフォルトの名無しさん:02/01/03 05:38
>>222 K&Rの第二版なら303ページに明らかな間違いが(笑)
226 :
長くてすみません・・・。:02/01/03 07:16
CreateProcess() 関数をつかって、子プロセスで実行されたプログラムへ
親プロセスからそのプログラムの標準入力へ文字を送り、その文字を加工して標準出力へ
文字を送ってそれを親プロセスから取得するプログラムを作成中なのですが、
うまくいきません・・・。 子プロセスに gets(buffer); printf("TEST[%s]",buffer);と
あるのですが、getsを待たずに、printfへ飛んでしまいます・・・。 親プロセスから得られる出力は、
TEST[] となってしまいます・・・。 どうやったら、子プロセスで実行されるプログラムのgets関数は、
標準入力に親プロセスから送られてくる文字を待ってくれるのでしょうか?
それぞれのコードは、次のメッセージにコピペします。
227 :
長くてすみません・・・。:02/01/03 07:38
In article
>>224, デフォルトの名無しさん/224 wrote:
> K&Rの第二版なら303ページに明らかな間違いが
あの訳本なら誤植・誤訳だらけなのは有名ですが、
原書の話ですか? > 303
#include<stdio.h>
int main(void)
{
int u=0;
int x;
int y;
int z;
printf("足したい整数の数を入力して下さい:");
scanf("%d",&x);
for(y=1;y<=x;y++)
{
printf("No.%d:",y);
scanf("%d",&z);
u+=z;
}
printf("%d\n",u);
return(0);
}
これでいんだよね?
でも参考書には
#include<stdio.h>
int main(void)
{
int u=0;
int x;
int y;
int z;
printf("足したい整数の数を入力して下さい:");
scanf("%d",&x);
for(y=1;y<=x;y++)
{
printf("No.%d:",y+1);
scanf("%d",&z);
u+=z;
}
printf("%d\n",u);
return(0);
}
とか書いてあるからわけわからん??
230 :
デフォルトの名無しさん:02/01/04 00:35
>>230 今度からまとめることにします
初期化はまとめとめない方がいいよね?
int x,y,z,u=0;
とか
>>231 まとめたって別にいいじゃん?
漏れは、この例みたいな一文字変数ならば
>>231みたいにまとめちゃう。
視認性が気になるならば一文字変数はなるべく使わない。
234 :
デフォルトの名無しさん:02/01/04 10:32
Windowsで
画面に複数コントロールを置いたとして
C++などではクラス型にしてサブクラス化すればいいんだろうけれど
Cの場合はどうすればよいんですか?
例えばstatictextの背景色変えたりするのは
設計時に一つ一つのコントロールのwndprocを全部記述しないといけない?
うまい方法があれば教えてください。
最悪の方法はIf文でhandle比較だろうけれど
だとすれば、
一番簡単なのは
1)SetWindowLongで GWL_USERDATA に背景色を埋め込む
2)WM_CTLCOLORSTATIC でコントロールハンドルから
GetWindowLongして もう判るよね
事で、背景色だけじゃないなら構造体のポインタを渡してやればいいんじゃないの?
237 :
デフォルトの名無しさん:02/01/04 19:04
>>235 >>235 SetWindowLonf & GetWindowLongですね、
ようはsetwindowLongでHandleに構造体のポインターを読ませるということですね。
大体見えてきました。ありがとうございます。
非常にアホな質問だけど、 返り値ってintとbool(BOOL)どっち使うべきなの?
intはエラー値が返せるつーのはあるんだろうけど、mfcはBOOLだよねぇ
統一できねぇ〜〜
boolの存在意味がわからん。エラー値不要の部分に使うにしてもtrue/falseが逆で混乱の元
一体なんに使うの?
>>238 統一しなくていいから、
関数の前に引数と戻り値の説明を
コメントでつけとけ。
>boolの存在意味がわからん。
1bitで表現できるから、メモリの節約になるんだよ。
(と言ってる人がいたら要注意)
241 :
デフォルトの名無しさん:02/01/06 17:54
>>1 Cで書いたプログラムの一部を、アセンブリ言語で書く方法を
教えろよ。
243 :
デフォルトの名無しさん:02/01/06 18:51
>>242 なんで? おしえてよ、知りたいんだよ。
>>241 unsigned char asmcode[]にアセンブラコードぶち込んで
そこめがけてジャンプすりゃいいんだよ。
246 :
デフォルトの名無しさん:02/01/06 18:59
>>241 例えば、DOSのCの関数をASMで書くときは、その関数の名前の先頭に
アンダーラインを足した名前のプロシージャを書くだろ? そして、関数を
呼び出すと、関数の引数が右から順にスタックに積まれて、関数の実体
である、ASMで書いたコードがcall命令で呼び出されるって寸法じゃん。
けど、これって、Windowsでも通用するやり方なんかな。
>241
貴方の命題は自己矛盾しており実現不可能です
お使いのコンパイラをご指示頂ければ回答可能な質問としては
1)Cのソースがあり、コンパイル出力の一部をアセンブリソース形式で出力したい
2)Cのソースの一部をアセンブリ言語で書き直したい
3)Cのソースの一部にアセンブリ言語を埋め込みたい
があります。
>>247 けっこう難しい日本語だね。 2と3の違いがけっこう微妙で分かりに
くいよ。 まあ、要は、cの関数をアセンブラのコードで直接書くって
やり方だよ。
>>241 ホントにむかつく態度だな。
Cの関数内にアセンブラコードを埋め込む(インラインアセンブラ)のと
アセンブラで書いてアセンブルしたオブジェクトをリンクするのでは
やり方が違う。
おまえは前者でもやってろよ。
たぶん
>>241はチョンブラなんだよ。
暴力的なことが男らしいと痛い勘違いをしてるんだよ。
>>250 まあ、まあ、そんなにプンスカすんなよ。又ー利いこうよ、又ー利と
インラインアセンブラ使ったら、擬似命令つかえねーじゃん。
オレが言ってるのは、それぞれ別々に、コンパイルとアセンブルして
オブジェクトを結合するやり方なんだよ。
ひょっとしてリンカの使い方が分からんのか。
>>253 ばかにスンナよな. リンかぐらい使えるってよ。 けど、オレが出来る
のは、DOSまでであって、Windowsの場合を知りたいんだYO!
Windowsの、内部をあんまし知らないし、下手にアセンブラでコードィ
ングしたら、一般保護例外が出ちゃうし。 そもそも、下手にレジスタと
かイジるコードとか書いてもいいのかなっと思っただけ。
具体例が無いから解らん。
まずはWindowsの勉強でもしろ。
お使いのコンパイラをご指示頂けなかったので C++Builderと仮定して話しを進めます
1、拡張子がpasのファイルを作成して下さい
2、アセンブラ関数は
function 関数名(引数):返り値;
asm
アセンブラによるコード
end;
とすれば、アセンブラによりC++から呼び出される関数が作成出来ます
なお、C++BuilderでもVC++の場合と同じく
拡張子 .ASM のファイルを作成し、TASMを呼び出す方法もありますが
上記方法がお手軽です
258 :
デフォルトの名無しさん:02/01/06 20:39
>>256 それってPascalじゃん。
C++でも単独でインラインアセンブラは使えるよ。
それに書いている内容は単にアセンブラの関数をPASCALのインラインで書いているだけだ
アセンブラだろうとPASCALだろうとhファイルで明示的に示してあるものは
call文で呼べるのでは?
>>254 ばかというより無知なんだからもう少しアセンブラとCについて調査すべきでは?
いまの無知のレベルは1日か2日で解消できるレベルだ。
リンカの使い方はわかってないぞ。
MP3関連のソースとプロジェクトファイルを探してソースをみれば
MASMやNASMとVC++やGCCになっているはずだから
その辺(特にmake)をじっくりみることだ。
大体アセンブラで組んで高速化が期待できないものは無理にアセンブラを使うべきではない。
ループ演算とか独立した関数とかに特化するか
CとかPASCALで書いてから展開すべきだ
C単独やC++でのWin programingをやってから出直せ
BCB使いでインラインアセンブラに興味のある人は
割と見つけやすいサンプルとして3DNOW関連のヘッダーを探すといいかも
>下手にアセンブラでコードィングしたら、一般保護例外が出ちゃうし
そりゃ下手だ
261 :
デフォルトの名無しさん:02/01/06 23:25
malloc系関数でいつも何も考えず
p = (char *)malloc(sizeof(char) * mojisuu);
if(p == NULL) return;
みたくやってます。でもよく考えると何故mallocが失敗するんでしょうか?
ヒープを使い切ったとか?mallocが失敗する理由って主に何があるの?
unixかwindowsでお願いします。
以前
if((p = (char *)malloc(sizeof(char) * mojisuu))==NULL)
p = (char *)malloc(sizeof(char) * mojisuu);
見たく、一度失敗したらもう一回繰り返しているのみたことあるけど
こういうやり方って意味あるんでしょうか?
>>261 意味ある
ふつー、ないと思われ。
そんなモノが通る処理系があるか、よく知らない。
>261 しぱいする原因は、メモリがホントに不足する以外に
メモリが断片化して連続して領域を取れない場合がある
後の問題は、たぶん意味はな。
でももしかしてマルチスレッドで動いているなら
その間に他のスレッドでヒープが空くかもしれないけど、時間を
置いてないので確率はゼロに近い
なるほど。
どうやらmallocミスったら潔くあきらめるのが良さそうですね。
それかwhileでとれるまで回すとか(w
>264 Cの場合、
先にある程度の大きな領域を非常用にダミーでmallocしておいて
メモリ不足になったらこの領域を開放して再度 mallocしてみる という自作アロケート関数を用意
で、メインループのどこかで この非常用ダミー領域が使われた場合に警告を出して安全に
終了するよう全力を尽くすと
いう方法が常套手段かと
タイムアウト処理とかするのか〜 >> 264
うーん。やっぱ皿とフォークがそろってから
食事にとりかかるのが美しいでしょうね。
なければやらない。
そうじゃないと奪い合いしているようで。
>>265-266 つまり一番最初にガバッととっちゃうんですか?
自分はいつも必要なときにmalloc。とれなきゃ処理を終わらせちゃいます。
あちこちでmallocするのでいちいち失敗の処理とか書いてます。
そうすると異常系のデバッグが大変だけどね。
>267 そうですよ〜 ガバっとって程じゃなくて
これは非常用だから文字列用とかファイルバッファとかが収まる程度の大きさね
すると、文字列用とかファイルバッファ用ではあんまり厳密にチェックしなくて済むでしょ?
大きな領域とか取る前だけチェックすればいいでしょ?
異常処理がだいぶ楽になるでしょ?
C++なら例外使えばいいんだけどね
ははぁ。なるほど。つまり
@最初に予備のメモリをある程度取る
Amyallocでアロケート。戻り値はチェックしない。
Bmyallocはアロケートできなければ予備を解放してアロケート
予備を使ったというフラグもたてる。
Cどこかでフラグをみてメモリがやばそうだから終了処理に移行
というかんじですか?
270 :
デフォルトの名無しさん:02/01/07 17:30
あのぅ、C言語プログラムのmainを呼び出すまでの起動ルーティンってなんですか?
教えてください。よろしくお願いします。
なんですか?っつわれても困りますぅ
「スタートアップルーティン」とかで検索しろやゴルァなのですぅ
272 :
デフォルトの名無しさん:02/01/07 17:37
ありがとうなのですぅ。
解からなかったら又質問させてもらいます。
273 :
デフォルトの名無しさん:02/01/07 20:37
gccでjpegとかgifの画像を表示させる
関数とかライブラリを教えてください
>>273 libjpeg, libgifで検索してみ
275 :
デフォルトの名無しさん:02/01/07 20:45
変数をヘッダーファイルで宣言するのとソースファイルで宣言するのは意味が違うのでしょうか?
またデータセグメントの変数とスタックの変数はどう違うのでしょうか?
>274
助かりました。どうも
277 :
デフォルトの名無しさん:02/01/07 21:47
int a;
a = 10;
と
int a = 10;
は意味が違うのですか?
やってることは同じ。
279 :
デフォルトの名無しさん:02/01/07 22:13
質問です。
それぞれテキスト領域、初期化データ領域、bss領域、スタック領域のどれに格納されるのでしょうか。
1.外部変数
2.関数内でstatic int hoge = 1;
3.関数内でstatic int hoge;
4.関数外でstatic int hoge = 1;
4.関数外でstatic int hoge;
また、初期化データ領域、bss領域が違う必然性はゼロ初期化するか否かだけなのでしょうか。
>>279 普通は初期化されてなければbss、一部でも初期化されてればdata
bssは実行ファイルを小さくする意味がある
静的持続時間の変数の格納場所にスタックは使えない
281 :
デフォルトの名無しさん:02/01/08 00:04
HTTPのプロトコルの中で、レスポンスでDate: Fri, 04 Jan 2002 05:00:00 GMTみたいなの
が表示されるのですが、このGMTっていうのは、C言語で何の関数を使えばよいのでしょうか?
>>279 関数内というのを何らかのブロック内と判断すると---
1と、ひとつめの4とふたつめの4は、スコープをファイル中に
制限するかどうかの違いのみ。
すべて静的なので、初期化データ領域かbss領域に割り当てられる。
データかbssかは、初期化されているかどうかで決まる。
bssは実行ファイル中にはその変数のサイズのみ保持していて
ロード時に実際の領域の分だけメモリを確保する(で、そのあと
ゼロクリアされる)。どこかで、bssはBetter Save Spaceとかって読んだ気が。
ほんとかな??
いいかげんな言い方をすると、「静的」という言葉は、
コードの実行開始時に確定している、といった意味で
使われている様子。Cに関して言えば、staticというのが
一般的な静的という意味の指定と、スコープの限定の両方に
使われるため混乱しがちかも。
UNIXが使える環境があるならば、大きな配列を作って、
初期化したりしなかったり、staticにしたりautoにしたり
してみて、各実行ファイルについて、sizeコマンドを
実行するといいかも。Winなら、DLLやEXEをクイックビューアで
みれば、ある程度のことはわかります。そこまでしなくても
静的であることがわかっているならば、実行ファイルの
ファイルサイズでデータかbssかはなんとなくわかるかも。
>>281 GMTの文字列を作成したいの?
それとも解析してtime_tとかに変換したいの?
せめてそれくらいは教えてちょん。
280さん282さんありがとうございました。
とても解かりやすかったです。
285 :
デフォルトの名無しさん:02/01/08 02:08
>>283 GMTの文字列を作成したいのです・・・。
1 gettimeofdate()
2 localtime() あるいはlocaltime_r()
3 sprintf()で出力。でもlocaltime()はその名のとおり時差が
入っているので、修正しとくこと。
gmtime()でなくてlocaltime()なのは、サーバ上のファイルをGMTで管理
する奴はまずいないと思われるので。
まぁ好きにしてくれ。
strftime使えよ
K&Rってライオネルリッチーの略ですか?
しかも、"GMT"なのにlocaltime()とか言ってるし
291 :
デフォルトの名無しさん:02/01/08 03:39
>289
カンキチ・リョウツの略です。
なぜ真ん中が&なのかについては諸説あります。
292 :
デフォルトの名無しさん:02/01/08 03:51
カニチャーハンこと蟹飯じゃなかったのか?
293 :
デフォルトの名無しさん:02/01/08 03:58
その相方のリョウツさんですが、ちょっと悪人面じゃありませんか?
Kuririn&Rice
汎用性のないラッパー関数を持ち出して煽りか?
time_tを与えたら直接文字列を生成してくれるなら重宝するが。
汎用性がないなら素直にsprintf使ったほうが便利と思われ。
つーか、使いたくなるだろうな。
で、gettimeofdateじゃなくてgettimeofdayだろうな。
296 :
デフォルトの名無しさん:02/01/08 05:02
read.cgiのソース
int get_lastmod_str(char *buf, time_t lastmod)
{
strftime(buf, 1024, "%a, %d %b %Y %H:%M:%S GMT",
gmtime(&lastmod));
return (1);
}
297 :
デフォルトの名無しさん:02/01/08 05:07
本当にstrftimeを知らないのかな。ANSIにもPOSIXにもあるのに。
それとも、localtimeで日付を管理と言う位だから
MS-DOSをサーバーOSとして採用しているのかな。
汎用性のないラッパー関数ってlocaltime_r()のことか。
俺もそんなに詳しくはないけど、
strftime()のフォーマットの細部に差があるのは知ってるよ。
だけど、RFC822形式の出力に使う程度なら問題ないはずだけどね。
少なくとも、OSがファイルの日時をローカル時間で管理しているとは思わないし、
time()やstat()/fstat()のtime値がTZに依存しない事も知っている。
だから、「timeをGMTで出力」にgmtime()でなくlocaltime()を使おうなどとは
考えた事もない。
cosとsinの値を出力したんですが値が変です。90といれると両方とも
0になったりします。何がおかしいのか教えててください
#include<stdio.h>
#include<math.h>
int main(void)
{
double s,c,g;
scanf("%d",&g);
s = sin(g);
c = cos(g);
printf("sin= %f\n",s);
printf("cos= %f\n",c);
return 0;
}
つか、degreeでなくradianで入れろよ。
302 :
デフォルトの名無しさん:02/01/09 21:00
doubleをscanfで取るのに%dは止めた方がいいような。
303 :
デフォルトの名無しさん:02/01/09 21:56
関数に文字列を渡す時、(char[100])
先頭のポインタだけを渡すのが一般的なのでしょうか??(&char[0])
そうですね。
char[100]を構造体でくるんだり、文字列の
末尾ポインタだけを渡すようなことは、
あまり一般的ではないと思いますよ。
char[100]???
306 :
デフォルトの名無しさん:02/01/09 23:44
こんばんは。質問します。
・ヒープ領域って具体的にどんなのですか?
絶対アドレスのココからココまで、みたく決まってるんですか?
・ヒープってプロセス事に非干渉なんですか?ほかのプロセスに壊されることはないの?
・ローカルやグローバルにもっている静的な配列や変数はヒープに作成されるの?
いろいろ教えてください。とりあえず、unix&winで。m(_ _)mペコリ
char *buff
char* buff
下側のように書きたいです。
以 上
308 :
デフォルトの名無しさん:02/01/10 13:48
Cのソース読んでるとたまに
1Uとか0Uとか
でてくるんだけど、これって何?
サーバラックの高さ。だから、int i=5U;とかくと、5Uの高さがcmで与えられる。
なお、単位を変更するには、setlocale(LC_LUCK, "ISO")などと
すればよい。類似のものに、int k=2B;などがある。
>1Uとか0Uとか
>でてくるんだけど、これって何?
ここで聞くなとは言わないけど、
こういうどんなダメな解説書にも必ず説明があるような
事を聞く人って、本を買わないのか?
>>308 たとえば、10uはunsigned int型の10のことですよ。
他には、lがついてればlong型、fがついてればfloat型です。
>>309 > setlocale(LC_LUCK, "ISO")
好運量もISO規格化されてたのか。
313 :
デフォルトの名無しさん:02/01/10 15:42
こんにちは、質問させてください。
私は現在C言語を勉強しているものですが
二次元配列の引数の渡し方がわかりません。
どうか教えてください。
>>306 とりあえず俺が答えられるのは
> ・ヒープってプロセス事に非干渉なんですか?ほかのプロセスに壊されることはないの?
1. ヒープはプロセス空間の一部です。
2. *まともな*メモリ保護を持っているOSの場合、
自分のプロセス空間以外の空間を破壊することはありません。
よって、*まともな*メモリ保護を持っているOSの場合、
ヒープを他プロセスが破壊することはありません。
ちなみにメモリ保護自体持っていないOSとしてMS-DOSがあります
# MS-DOSはOSかどうかを議論するつもりはないです
>>313 /*test*/
#include <stdio.h>
void foo(char (*p)[10]){
printf("%s\n", p);
printf("%s\n", p+1);
}
int main(int argc, char *argv[]){
char str[][10] = {"january", "february"};
foo(str);
}
わたしもビギナーですが、確かCプログラミング専門課程という本に詳しくのってますよ。
316 :
デフォルトの名無しさん:02/01/10 16:33
よく、浮動小数点は誤差があるので、金銭の計算には
使ってはいけないという話をききます。
こんど小数部が二桁の計算を行うので、どのくらい
誤差が出るかとおもい、ためしにVC++で下のような
処理を書いて試してみました。
しかし、どうも誤差はでないようです。
扱う値が小さい場合は、誤差はでないのでしょうか?
{
srand(time(0));
const int loop_num = 10000;
int total = 0;
double real_total = 0;
for (int i = 0; i < loop_num; i++) {
int n1 = rand() % 1000; // 整数部
int n2 = rand() % 100; // 小数部
total += n1 * 100 + n2; // 整数計算
double d = (double)n1 + (double)n2 / 100; // 実数計算
real_total += d;
}
TRACE("%f\n", (double)total/loop_num/100); // 整数での計算結果
TRACE("%f\n", real_total/loop_num); // 実数での計算結果
}
317 :
デフォルトの名無しさん:02/01/10 16:37
>ちなみにメモリ保護自体持っていないOSとしてMS-DOSがあります
Xの付かないMacOSモナー
>>316 乱数つかってるところ
int n1 = 0 ;
int n2 = 3
にでもして、最後に
if(total/100.0==real_total) TRACE("hogehoge\n") ;
でもしてみそ
そこそこ大きいソース(20000〜)を読む時コツってありますか?
>>319 モジュール構成図を書け
グローバル変数の一覧表や構造体の一覧表を作れ
まともな関数名を付けている場合、これだけで処理の概要はわかる
まともなソースでない場合、あきらめろ
例)ローカル変数がない、
1000行以上ある関数が何個もある
今tagとviとgrep使って追ってるんですがやっぱりそこまでする必要ありますかね?
日本語化の類いなんですけど.
後諦めきれない場合は自分で書いた方が早いですか?
人のソース見るのって大変だ.
なぜ、どの本もファイルのオープン、クローズまでしか載ってないのですか?
Cでビジュアル的な部分の作り方を書いてある本を見たこと無いのですが。
RPGの作り方や、シューティングの作りかたとか
>>322 RPGやシューティングでもファイル操作は必要だろうよ。
“ビジュアル的”ってのが何を指しとるのかしらんが、
例えばWindowsならDirect Xとかか?
そういったライブラリは“Cの本”の範疇外だろうよ。
Cの本ではなく、画像処理系の本を買って読め。
>>322 Cの入門書とかにそういう話が出ないのは、「ビジュアル的な部分」は
Cの仕様の範囲外で、OS依存の部分だから。
「Windowsで」のようにOSを限定した本なら、探せばあるでしょう。
でもそれは「Cの本」じゃないよね。
あ、画像処理のアルゴリズムとかの話だったら、OS依存じゃないか。
でもどっちにしてもCの本ではないな。
>>307 それ、C++の作法よ。
C言語だと char *buff の方が普通。
>>313 出来ないこともないけど、面倒だからやめとけ。
2次元配列やめて、C++とSTL勉強してstd::vectorを2重にして使え。
std::vector<std::vector<Type> >
関数に渡すときには参照渡しな。
>>325 結局、表示部分で機種依存な本ばっかりだけどな。
327 :
デフォルトの名無しさん:02/01/11 00:06
関数で計算した内容が反映されない(通らない)のはどうしてでしょうか?
void hen(float ab,float b,float c);
for(i=0;i<N;i++){
hen(ab[i],b[0],b[i]);
printf("%4.1f\n",ab[i]);
}
void hen(float ab,float b,float c){ /*関数*/
if(ab>1){
ab=b*c/10;
}
328 :
デフォルトの名無しさん:02/01/11 00:12
皆さんに質問です。
C言語などで文字リテラルってありますよね。
一般的には処理系依存と言うことになっているけど、ASCIIに関しては
ほとんどの文字コードでは下位7bit以下がASCII互換だと思います。
と言うことは英数字のみに限定すればASCIIの16進コードで
処理してしまってよろしいのでしょうか?
それともASCII互換ではない文字コードを標準文字セットとして使う
OSやコンパイラがあるのでしょうか。
知っている方教えて下さい。
>>327 何故と問われても、“引数”という物を理解してくださいとしか…
float hen(float ab,float b,float c){
if(ab>1){
return b*c/10;
} else {
return ab;
}
}
for(i=0;i<N;i++){
ab[i]=hen(ab[i],b[0],b[i]);
printf("%4.1f\n",ab[i]);
}
330 :
2月発表なド素人君:02/01/11 00:21
課題研究で2月にじゃんけんゲームを発表しなければならなくて、
間に合う気がしなく、高校卒業不可能の危機におちいってる者です。
C言語がここまで難しいものだったとは、今頃後悔している所です。
ただ後悔してももぅ仕方ないのでなんとかして完成させようと思っています・
今日は質問させてもらいます。
WindowsでSDLを使って、グーとチョキとパーの絵を画面に出し、
選択したら、相手のランダムの手で勝ち負けの結果を出し、
続けるか続けないか尋ねるという形で
最終的に結果を表示できるような物にしたいです。
結果の数字や、じゃんけんの手、それから背景画面すべて
用意したbmpファイルを載せる形にしたいと思っています。
家では、Cマシーン
ttp://homepage1.nifty.com/kentake/ を利用させていただいており、
学校ではTurbo C++を利用しています。
もちろん発表は学校で行われるのですが、
どうも分からない事だらけで助言をお願いしたい。
SDLをヘッダファイルとして利用できるようにする方法
(新たなヘッダファイルを加える方法)が分からないのですが、
分かる方、助言お願いいたします。
皆さん回答ありがとうございます。 早速ですがもうひとつ
質問させてもらいます。 Cの基楚本をクリアーした後、
皆さんどのような道を歩んだんですか? 教えてください。
Loveマシーンみたいだな。
ungetch(in curses.h)ってどういう時に使うんですか?
>>334 見ちゃいけない物を見ちゃったときに、こっそりもとに戻しておくときに使え也
>>331 そこまでいったら自分の好きなものを作ればいいのでは?
「ビジュアル的(Visual的?)」な本も読めるようになっているはず。
というか、中上級の「Cの本」は初級に比べて非常に少ないし。。
あと、ひまをみて、アルゴリズムの勉強をしといたほうがいいかと。
ほかには、とりあえず一般論程度でいいのでOSやアーキテクチャの話も
おさえておくとなおよし(2種でも勉強して受けるのが手っ取り早いか?)。
要は、自分の興味・必要性を中心に、幅広く、ね。
「クリアー」といっても練習問題がとける「技量が身についている」
ことが必要で、一通りやったからといってクリアーとはいえない
かもしれないのでご注意あれ。やればわかるってのは確かにあるけど、
やってもわからない場合は基礎が身についていない可能性が高いので。
>>334 getch()ないしgetche()とペアにして、「先読みしたいとき」と
暗記しておけば、先読みしたくなったときに幸せになれるかも。
338 :
デフォルトの名無しさん:02/01/11 06:33
プログラミングの勉強したいんですが、
C系は必ず弄ったほうがいいの?
とりあえず
とりあえず現在はsed -> awk -> Perlまで弄ってます。
C -> C++ -> Delphiと習得ビジョンを立ててるんですが。
(基礎から固めた方がやり易いと思って)
ありがとうございます。
341 :
デフォルトの名無しさん:02/01/11 06:50
>>334 curses.h? stdio.hじゃなくて?
342 :
デフォルトの名無しさん:02/01/11 06:52
>>338 Perlの次にC・・・・
今まで当たり前だと思っていたことがそう簡単にはできないよ。
>>342 perlは忘れて
cに打ち込む事にします。
>>328 >それともASCII互換ではない文字コードを標準文字セットとして使う
>OSやコンパイラがあるのでしょうか。
EBCDICがあるよ。
>>313 >>326のレスを見て気付いたんですが
2次元配列を丸々渡すのであれば、たしか構造体のメンバーにすればよかったと思います。
/*↓参考*/
#include <stdio.h>
typedef struct{
int test[2][3];
} FUCK;
void unko(FUCK fuk){
for(int i=0; i<2; ++i){
for(int j=0; j<3; ++j){
printf("array[%d][%d]=%d\n", i, j, fuk.test[i][j]);
}
}
}
int main(){
FUCK fuk;
for(int i=0; i<2; ++i){
for(int j=0; j<3; ++j){
fuk.test[i][j] = i+j;
}
}
unko(fuk);
return 0;
}
>>341 stdio.hにあるのは標準ライブラリ関数のungetc()。
ungetch()はDOS系ならconio.h。UNIX系にはconio.hは多分ない。
ので、ungetch()を使うなら多分cursesライブラリに頼ることになる。
ので、curses.hで(も)よいのでは?
(ところでDOS/Winのgccだとどうなるんでしょ?やっぱりcurses??)
>>345 そりゃ固定長のときはそれでいいけどな。
それやるんだったら
void func(int array[][2]) // ←2次元目は固定長
{
}
ってやれば配列を引数に出来るし。
まあ、これやると参照渡しになっちゃうけど、普通こんなでかいデータを値渡ししないし。
>347
いや、それと同じ事は既に
>>315に(345が)書いてるし。
ハクといます。
C言語初心者で、現在、圧縮法の勉強をしている者です。
早速質問なのですが、
C言語で書かれたプログラムで、実際に圧縮プログラムを体験してみたくて、
先日、Cで書かれた圧縮プログラムを手に入れたのですが、実行ファイル
(ファイル名.exe)しかないので、動作はMS-DOSプロンプトから確認できるのですが、プログラムソースが見れません。
どうしても、ソースを見てどのようなプログラムになっているのか知りたいと思
うのですが、実行ファイルのソースの見方が分かりません、どなたか教えて頂けないでしょうか?
ちなみに、VC++6.0を日ごろC言語の学習に使用しています。
それでは、どうぞよろしくお願いいたします。
>>349 逆コンパイルをしたいの?
難しいと思うけどなぁ。最適化されているだろうし。
>349
実行ファイル-->逆アセンブル-->逆コンパイル な話題になると不毛だから、
単純に作者にソースコードもらった方が良い。
もしくはソースコードを公開しているHPを検索する。
>>349 実行ファイルからソースを見ることは面倒です止めておいた方がいいです。
どーしても圧縮法の勉強をしたいなら
http://www.gzip.org/ にgzipのソースがあります
くだらん蘊蓄をたれるとgzipはLZ77の圧縮法を使っています。
早速の回答ありがとうございました。^^
やはり、難しいですか・・・。
そうですね。ソースコードを公開しているHPを探してみます。
ありがとうございました。
>345
その渡し方、俺はCを初めた頃猿の様に使ってたんだけど(sizeofしたい時とか便利だった)
何故か学校のせんせに「構造体の使い方が正しくない」とか言われて
減点された事あるぞ (笑)
宣言が面倒なんですぐ辞めたけど、あれは理不尽だったなぁ・・・・
配列を値渡ししたいなら
正しいと思うけど・・・
>>354 メモリーの無駄遣い
sizeofしたいのならしかたがないけど。
実行時にサイズが変わる配列には、使えないしね。
358 :
かじりたてフォートラン:02/01/11 21:27
フォートランに関して是非御教授してもらいたいことがあります。
ユニックス・フォートランー>PCフォートランにコンバート作業中なのですが、
ユニックス上で組まれているフォートラン・プログラムの
各ソースプログラムからのサブルーチン経路がわかるようなモノ(ツリー)を
出力することは可能でしょうか? お願い致します。
>358
いつからFORTRUNはCになったんだろう。
>>354 それは先生もDQNな気がするな。
でも、配列を値渡ししたいそれなりの理由無しに
>>345の方法使うのもどうかと思うけど。
あの渡し方は裏技みたいなもんだし。
>>360 バイナリフォーマットが ELF になった頃からかなぁ、シンボル名の先頭に _ がつかなくなったのは(違
リターンバリューを変数に代入せずにただアロケートだけした場合そのメモリはどうなるんですか?
int main(void) {malloc(100);}
代入されてない場合freeのしようが無いですよね.
こんな場合は?
char *a = "hoge";
printf("%s", strdup(a));
やはりメモリの無駄使いになるんでしょうか.
365 :
デフォルトの名無しさん:02/01/12 16:14
グラフィック関数(OpenGLなど)を使わずに
三次元画像を表示したいんです。
どんな方法があるんでしょうか?
>>364 無駄使いというか・・。
ネタは余所でやってください
>>367 まじめに回答して欲しいのか? まずは OS の仮想記憶とプロセスサブシステムに関して概要だけでいいから
把握した上で、代表的な malloc, free の実装を 2, 3 当たれ。その上で C の規格書を読み直せば、言わんとす
るところが分かるようになる。
369 :
デフォルトの名無しさん:02/01/12 18:50
とりあえずlcc-win32というコンパイラをダウンロードしたんですが
アプリケーションの作成はどうすればいいんでしょうか?
そういった本を探してみたりしましたが売ってませんでした。
>>370 じゃあ解説してやれよ。
俺は、さんざん fj やマ板の malloc/free スレで繰り返された話を、噛み砕いて解説する気はない。
(あの話、まじめに追おうとすると OS の実装にまで踏み込まんと理解できんと思うけど)
プログラミングを大学で初めてやるのですが
周りが男ばっかで聞けません。
最初はC言語からでも大丈夫ですか?
それといずれJavaも使ってみたいですがはじめはどちらからやればいいですか?
それと参考書を教えてください
>>372 大学で、って事なら授業ではないのか?
使用言語は指定されていないのでしょうか。
データ解析とかやるのかな。
> 周りが男ばっかで聞けません。
そんなの言い訳にならんよ、甘えるな。
> それと参考書を教えてください
K&R
PascalとC言語をやるそうなんですが
科目はプログラミング基礎です
>>YUU
周りが男だらけなら、きかなくても教えてくれるかも(プ
最初は何からはじめても苦労すると思われ。
C言語はすべての基礎になるから、教養として必須。
Pascalやるなら一緒にDelphiおぼえるほうがいいかも。
>>372 大学生にもなって
> 周りが男ばっかで聞けません。
っつーのは、やはりネタなんだろうか。そうでなければ、人生やり直したほうが言いと思うぞ。
インストールしてみたけど、こんなのあったんだね。
projectをcreateして、WizerdつかえばすぐにWinアプリのスケルトンできるよ。
これはいいカモ。
>>376 おそらく「周りが」と「男ばっかで・・・」の間に
本来入るはずの形容詞を入れ忘れただけだと思われ。
>>379 どれだろう?
1) 周りが「C 言語なんか朝飯前、いちいち聞くなよバカ、というレベルの」男ばっかで
2) 周りが「女性と見ると緊張してまともに口もきけない」男ばっかで
3) 周りが「語尾に *にょ* をつける」男ばっかで
個人的には 3 を推したい。
早稲田大学理工学部情報学科なんですけど
友達がYahooで2ちゃんねると入れてみるといろいろな
掲示板があるのでそこで聞いてみろと言われたので
書き込みしました。
インターネットぐらいしかやったこと無いので
プログラミングは初めてです。
よろしくお願いします
周りが下男ばっかで、とか。
ネタ風味120%だけど。
ココに書き込んでいるのも大半が男ばっかじゃないのかな。
グダグダ逝ってないでその友達なり周りの人間、先輩方に聞きなさい。
>>YUU
2ch初心者?メール欄が意味不明だが、ここは匿名なので個人情報はあまり公開しないように。
インターネットつかえるならば、2ch頼る前に「〜入門」とか「〜講座」とかで
webサーチしてみようね。
384さん
その2ちゃんねるを教えてくれた友達がE-mail欄に
適当に文字を入れるとIDが消えると教えてくれたので
適当に入れました。
そこにメール送っても届きません。
入門見てからまた来ます。ありがとうございました。
つまり説明するのは難しいから聞くなって事.
粘着してんなよウゼェ
お前が説明してやれよ、懇切丁寧簡潔明瞭にな
389 :
デフォルトの名無しさん:02/01/12 23:12
atof()とstrtod()ってどういう関係なの?
競合してない?
>>389 それを言ったら重箱の角をつつく例はいくらでもあるよ
>>389 atofは互換性のためだけに存在しています。
>>389 元の文字列に "hoge" とか入ってると、atof() じゃチェックしきれなくない?
atof()のほうがstrtod()よりも処理が簡単そうで高速かも、
という理由で、エラーがおこらない事がわかってるときは
atof()という使い分けをしていました。が、
>>391を読んで、
ホント!?と思い、atof()がstrtod()のマクロで実現されているかと
勝手に判断し、ヘッダを調べたところそんなことはありません
でした(BCCとLSIC)。もちろんだからといって
>>391が違う
ということにはぜんぜんなりませんけど。
あ、でもよく考えたら、整数系とちがって基数指定がないから
機能差による速度差はほとんどないか。。
で、それってホント!?
>>391
395 :
デフォルトの名無しさん:02/01/13 00:34
卒研でCをつかって数値計算をしているのですが、
いつも、いいところまでいくと
数値の値が = nan0x7fffffff
というエラーメッセージなのか、限りなく大きな値を示しているのかわからないメッセージが表示され
それから先の計算ができなくなってしまいます。
他サイトでしらべてみると、
入力データのデータ型がデータを格納する変数のデータ型と一致していないと、
期待した動作をしてくれません。
とあるので、int型とdouble型の計算を何度も見直したのですが、
特に、間違ってはいないようです。
nan0x7fffffffが何を意味しているのかと、
その対処法などありましたら教えていただきたいのですが?
>>395 NaN は 0/0 みたいな「意味のない」計算をした結果として格納される数値。IEEE 754 で検索。
> その対処法などありましたら教えていただきたいのですが?
どこかで、無意味な計算をしてるんだろうね。環境によるけど、その場合に NaN を格納せずに例外を
送出できることもあるんで、それとデバッガを組み合わせて場所を特定してみたら?
>396
ありがとうございます。
私もおそらくどこかで変な計算をしているのではと思います。
原因としては、配列の中身が途中で変な値に化けてしまったのではと考えてます。
データが壊れて欲しくないものは、
static int b1[180],b2[180],b3[180],b4[180];
static double g1[30],x1[15][30],x2[15][30];
と、staticを使っています。
デバッカは使ったことがないのですが、これから検索してみます。
>>394 変換できなかったとき未定義になるa系は基本的に使うべきでないが、
歴史的にはa系のほうが先にあるし、a系が簡単なのも確かだから
なくせないだけ、と認識していますが。
C/C++300の技 オールラウンドプログラミング〈Vol.3〉
は旧二種程度の知識しかもっていない人間でも楽しめる本ですか?
>>398 予想通りのレスが返ってきちゃいましたか。。
やっぱ推奨されていないものは使っちゃだめなのかな。。。
文字列を渡したいときは、ポインタを渡す?
402 :
デフォルトの名無しさん:02/01/13 11:11
タブってどう表すんでしたっけ?
403 :
デフォルトの名無しさん:02/01/13 11:12
\・・・
うーん。
\t
これかー!
\t
406 :
デフォルトの名無しさん:02/01/13 11:20
>400
予測のつく要らないレスなら、はじめからつかんようにモノ訊け。
見てて腹立たしい。
407 :
デフォルトの名無しさん:02/01/13 12:09
>>401 その方が効率がいいからね。
構造体のメンバーにすれば配列をそっくりそのまま渡せるけど。
>>407 Thx!
でも下側が、よくわからず。。。
>>408 typedef struct _T {
char s[255];
} T;
void foo(T o) {
puts(o.s);
}
void main(void){
T o;
strcpy(o.s,"HOGE");
foo(o);
}
411 :
デフォルトの名無しさん:02/01/13 14:10
構造体名はtypedefした方がいい?
いつもわざとtypedefしないで、その構造体を使って変数を宣言するたびにstructを書いているんだけど。
標準ライブラリにあるtmなんかはしていないからしない方がいいのかなと思って。
412 :
デフォルトの名無しさん:02/01/13 16:43
CとJava、最初にやるならどっちですか?
In article
>>412, デフォルトの名無しさん/412 wrote:
> CとJava、最初にやるならどっちですか?
どちらでもいいですよ。
2つ同時にやってもいいです。
----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
JAVAの方がとっつきやすいかもね。
漏れの周りには Java→C という順におぼえたっていう人間がいないから、
そういう人がどんなCのコードを書くのか想像できない。
413,414さんご返信ありがとうございます
Javaの謎+落とし穴徹底解明という本を立ち読みしたのですが
著者ははじめはJavaをおすすめしないと書いてありました。
やはりCから始めた方がいいのでしょうか?
それとCからなら作ってわかるCプログラミングを購入しようと考えています
私は趣味でShadeでCGを作っていますいずれプラグインなどを作ってみたいです
スクリプトはtcl、jscript、vbscript
プラグインはVC++を使用してのC++
と言われたのですがどうゆうことなのでしょうか
In article
>>414, デフォルトの名無しさん/sage/414 wrote:
> 漏れの周りには Java→C という順におぼえたっていう人間がいないから、
大学の授業や企業の新人研修でJavaを使っているところが増えている
らしいですから、若い人はJavaから入る人も多いと思いますよ。
----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
>>411 僕はいつもtypedefしてるよ。
structってつけるのめんどくさい。
僕はアマチュアだからプロの人がどうしてるかは知らないけど。
>>416 Javaは無料で環境構築できるから、興味があるならJDKをインストール
しとけばいいんじゃない?
初心者の人は、いきなりたくさんは覚えられないから、どの言語から始
めるか教えて欲しい、というのかも知れないけどそんなことは気にせず。
今時のPCならC/C++、Java、Delphi(Pascal)の処理系を全部入れたって
余裕だし、タダで全部そろうんだから、とりあえず全部入れといて、気が
向いた時にすきなの起動できるようにしとくのがいいと思う。
プログラミングの上達のためには、いつでも思い立ったときに開発環境が
使えるってうのは大事なことです。
いざというときのために、いろいろ入れときましょう。
>>411 趣味の問題だと思うが。なんとなく UNIX 系のプログラムを書いてると struct つけて、Win32 系のプログラム
書いてると struct つけないことが多いな。(そもそも Win32 だと C++ 使うことが圧倒的に多いからだが)
>>417 どうでもいいが、シグネチャは邪魔だから止めてくれ。
419さん
全部ただでそろうんですか?
ビジュアルC++6.0のアカデミックパックを買おうかと思っていました
>>421 少なくとも、勉強のための環境なら揃います。
423 :
デフォルトの名無しさん:02/01/13 20:19
>>421 どんな言語でもただで使えるというわけではないけどね。
例えばVisual Basicはただでは使えないと思う。
サブセット版のVBScriptならIE上で実行できるけど。
言語を使えるというのは、その言語で書かれたものを実行できるという意味ね。
その言語を使ってソースを書くのは自由だから(言語自体には著作権は存在しない)。
VBScriptやJScriptは今時の環境なら開発環境のインストールすらいらないね。
MsgBox("(・∀・)イイ!!")
っていうテキストを拡張子.vbsで保存して、そのファイルをダブルクリック
すればダイアログでるっしょ。
427 :
デフォルトの名無しさん:02/01/14 01:12
EOFを入力しようとctrl+zを押すと
プログラム自体が終了してしまいます。
vc++の環境?のせいらしいんですが、
ctrl+z以外でEOFを入力する方法は無いんでしょうか?
>>428 ctrl+dですか?
ctrl+dだと」みたいなのが出るだけでうまくいきません。。
Win9xだとなぜかCtrl+Zでプログラムが強制終了させられちゃうね
回避方法は知らん
そうですか・・・。
じゃ、あきらめることにします。
428さん、430さん深夜にありがとうございました。
432 :
デフォルトの名無しさん:02/01/14 02:37
Cygwin gcc と bcc32 両方入れてる人います?
make.exeはどうしてます?
リネームすれば?
Cygwinとbcc32の環境を別ユーザにするとか。
別ユーザはめんどくないですか?
リネームは私も考えたけど、アリなんですかね。邪道かとおもいました。
両方入れてる人は普通どうしているのかと、経験談をきいてみたかったです。
とりあえず手っ取り早いのはリネームですかね。bmake.exeにでもします。
SetFilePointer関数で行単位で移動させるには
どうすればいいんですか?
行番号->ファイルインデックスのテーブルが
ないと無理かと思われ。
>>416 C# がお勧め (とか書くとスレが荒れる)。
>>420 そういう問題じゃないと思われ。
C言語だと、struct 付けないとエラーになるし。
>>411 が聞いてるのは。
typedef struct Type
{
// .....
} type_t;
↑こういう構造体の変数を宣言するときに、
struct Type t;
ってするか、
type_t t;
ってするかだろ。
普通、typedefしない?
440 :
デフォルトの名無しさん:02/01/14 16:48
C言語のstring library中の関数がクラッシュする場合ってどんな時ですか?
たとえば、
char str[10]="hello";
strcpy(str, str);
など。
>>440 そりゃ、
char *p; // 初期化しない
strcpy(p, "aaaa");
とか、
char s1[3];
s1[0] = 'a';
s1[0] = 'b';
s1[0] = 'c'; // 文字列の終わりにヌル文字を入れない
char s2[3];
strcpy(s2, s2);
とか。
>>441 言いたい事はわかるけど、あんまりおおちゃくしないでね、あいては初心者なんだから…
>>439 420はまさにそのtypedefするか否か、について
主にCでプログラムする際にはtypedefしている、
C++を使うことが多いWin32では、typedefしなくてもコンパイル通るんで
結果としてtypedefは使わない、と逝っているのでは?
> 普通、typedefしない?
趣味が入るだろうなぁ…
structがあれば構造体であると一目で分かるし、
その例でいえばTypeとtype_tという2つの識別子
(一方はおそらく使用されない)が出来るし。
typedefした方が同じ型のデータを作る場合には楽だと思う。
typedef struct tree{
int key;
char data[256];
} treebox;
とやれば、
treebox box1;
とやればいいだけだし。
445 :
デフォルトの名無しさん:02/01/14 18:04
以下のコードが strcpyのところでcore dumpになるのはなぜですか?
char *str;
str = "Hello";
strcpy(str, "World!");
printf("%s\n", str);
>445
おまえにCは早すぎた
447 :
混乱してる初心者:02/01/14 18:10
str="Hello"; は
strが文字列リテラルを指してるから、書き換えられない処理系はいろいろある。
"Hello" と "World!"では後者の方が長いから、どっか壊してる。
どっちっが本当の原因かわかんなけけど、たぶんどっちか。
鼻から悪魔だから
>>445 あなたの書いたスンバラシイコードがcore dumpを起こしたからですよ。
あと"Hello World!"としたいのなら、
strcmp()ではなくstrcat()を使いましょう(゚∀゚)アヒャヒャ
>>445 > char *str;
> str = "Hello";
配列を初期化するなら、
char str[] = "Hello";
> strcpy(str, "World!");
strcpy()の第一引数には、第二引数に渡す文字列の大きさ(字数+1)
以上の大きさを持つメモリ領域が必要。
char str[255];/* 255は便宜上の値 */
strcpy(str2, "World!");
…
char str2[255];/* 255は便宜上の値 */
strcpy(str2, "World!");
っす。
445っす。
このプログラムでは、別にHello Worldって出力したいわけではなくで、
str="****"ってした後に、strcpy(str,"%%%%")とすると、
どういう理由でcore dumpになるのかが知りたいんです。
447サンのレスが一番求めているものに近そうですが、
どなたかもっとわかりやすく説明していただけませんか?
まともな本読めよ
つーか糞本でも100%書いてるし
ここは解説サイトじゃないぞ
>>453 一つ質問だけど、要するに
>>447に対して
文字列って何ですか?
リテラルって何ですか?
何故書き換えられないんですか?
処理系って何ですか?
壊してるって何ですか?
こう言う事を知りたいんですか
456 :
デフォルトの名無しさん:02/01/14 18:59
>>453 1 規格上、文字列リテラルを書き換えたときの動作は「未定義」
未定義というのは、何事も無く動くかもしれないし、コアダンプするかもしれないし、コンピュータが火を噴く
かもしれないし、鼻から悪魔が出てくるかもしれない、と言うこと。鼻から悪魔が出てきても C 言語の規格
上は問題ない。
2 キミが使ってる実装では、文字列リテラルを変更した場合にコアダンプするよう、処理系が、書込み禁止
属性をつけたメモリ領域に文字列データを配置した。
っつーことだろ。良かったな、鼻から悪魔を出すように処理系が実装されてなくて。
>>453 > 447サンのレスが一番求めているものに近そうですが、
> どなたかもっとわかりやすく説明していただけませんか?
アフォな上に失礼なヤツですね。
> char *str;
> str = "Hello";
これは文字列リテラル"Hello"が格納された領域を指すアドレスを、
ポインタ変数strへ代入している。
447さんが書かれたように、文字列定数領域を書き換えることはあまりお勧めできない。
仮に文字列定数領域の書き換えに目を瞑っても、
> strcpy(str, "World!");
この時点で"Hello"が指す領域に"World!"を複写しようとしている。
"Hello"の大きさは6バイト(5文字+NULL終端)
"World!"の大きさは7バイト(6文字+NULL終端)
で、451に書いたように、
> strcpy()の第一引数には、第二引数に渡す文字列の大きさ(字数+1)
> 以上の大きさを持つメモリ領域が必要。
なので、ここでアボーンする。
質問をする事は恥ではない。
しかし与えられた回答を吟味しようともせず同じ質問を繰り返すのは、
己の無能をさらけ出すだけでなく、回答者を馬鹿にする行為。
お前が職業プログラマにならない事を祈る。
>>455 447さんの説明は正しいのですか?
ちなみに後者のほう(World!)をHelloより短くしても
core dumpとなりました。
459 :
デフォルトの名無しさん:02/01/14 19:01
>>432 DOS時代でも強制終了なんかしなかったぞ?
NT系はまともに動く。
DOSアプリやDOSエクステンダアプリとして作った場合も。
Win9x上のWin32アプリだけがCtrl+Zに対して
わけわからん反応を示す。
>458
質問だけど、どういう環境で勉強すると
そう言う状態になるの?
>>458 文字列リテラルの書き換えは処理系依存だから、こうという回答は出せない。
処理系とコンパイラのバージョンを特定するのを先にしなさい。
>>462 処理系依存ではなく未定義と思われ。細かい突込みだが。
char *str;
str = "Hello";
とすると、Helloの入ったメモリ領域の先頭アドレスの値がstrに入る。
で、仮にその後に
str = "World!";
と入れると、World!を指す先頭アドレスがstrになる。
ただし、strは配列構造ではないので、strcpyでは書き換えは
できない。
配列の各要素はその1文字ずつに初期化子があるため、strcpyで
取り扱える。
ポインタは先頭アドレスで初期化されるため、その先のデータに
初期化子が与えられない。
>>464 いや、あの、
その書き方だとまるでstrcpy()はポインタを扱えない様に読めます。
各要素の初期化子(構築子の事?)が存在する事は関係なく、
受け側に必要な大きさのメモリ領域さえあれば良いかと。
>受け側に必要な大きさのメモリ領域さえあれば良いかと
そのメモリ領域に書き込めることも大事かと。
>>465 初期化子がなければ書き込めないということ。
読み込みはできるけど。
このあと、どう展開するのか、期待してるぞ
>>467
470 :
デフォルトの名無しさん:02/01/15 08:45
syncとfflushってどこが違うのでしょうか?お願いします。
>>470 sync(2)はシステム全体のバッファフラッシュをスケジューリングするシステ
ムコール。戻った時点で必ずしもすべて書き出されている保証はない。
fflush(3)はプロセス内のバッファをフラッシュする関数。
ついでにfsync(2)というのもあって、これは指定されたファイルディスクリプ
タに関連するファイルのデータをフラッシュする。
fflush()->fsync()->fclose()とすればシステムクラッシュしてもデータが無
事な可能性は他界。
472 :
デフォルトの名無しさん:02/01/15 14:31
2次元配列のコピー?でちと困ってしまったので相談に来ました。
for( X = 0 ; X < iWidth ; X++){
memcpy( &DstArray[X + iLeft][iTop],
*(SrcArray + X),
sizeof(int) * iHeight);
}
図で説明しますと
□□□ // SrcArray
□□□
■■■■■■ // DstArray
■■■■■■
■■■■■■
■■■■■■
■■■■■■
↓
■■■■■■
■■■■■■
■□□□■■
■□□□■■
■■■■■■
こんな感じに出来るのですが、
これだとBitBltのSRCCOPYですよね(笑。
ようは、BitBltのSRCPAINTがやりたいのです。
for( X = 0 ; X < iWidth ; X++){
for( Y = 0 ; Y < iHeight ; Y++){
DstArray[X + iLeft][Y + iTop] |= (*(*(SrcArray + X) + Y));
}
}
この様に書けば出来るんですけど少し遅い気がするので
ぜひ御力を・・・(長々とすみません)
>少し遅い気がするので
はかってみた?
>>458 > 447さんの説明は正しいのですか?
> ちなみに後者のほう(World!)をHelloより短くしても
> core dumpとなりました。
447さんの説明が正しいから core dump したんでしょ?
これ以上、何を求めているんだか…
>>464 > 配列の各要素はその1文字ずつに初期化子があるため、strcpyで
> 取り扱える。
配列変数を宣言しただけでは要素の初期化は行われないと思うのだが?
char str[6] = "Hello";
とかならともかく、
char str[6];
では、各要素の初期値は不定でしょ?
> ポインタは先頭アドレスで初期化されるため、その先のデータに
> 初期化子が与えられない。
割と意味不明だけど“ポインタ変数へアドレス値を代入しても、
その事でアドレス値が指す領域が書き換わる事はない”、と言いたい?
> ただし、strは配列構造ではないので、strcpyでは書き換えは
> できない。
書き換え可能なメモリ=“配列構造”という意味で使っているのかな。
“strは配列構造ではない…”というか、
“例示のコードにおいてstrが指すのは書き換え可能なメモリではない…”
とでも言えば良いのでは?
475 :
デフォルトの名無しさん:02/01/16 14:43
よく関数呼び出しはオーバーヘッドが凄いと聞きますが具体的に何が手間取っているのでしょうか?教えてください
全然凄くないから気にすんな
場合によると思うけど
・必要ならレジスタの内容を保存
・パラメータをスタックに積む
・ジャンプする
ってところかね
>>475 スタックの操作でした
が、今ではスタックはレジスタ並のCPUもありますしね
double CHoge::getData(){ return MyData;};
みたいなコードでない限り、
ヘタにインライン化してコードサイズが増えるより適切に関数化した方が
良い結果がえられますよ
>>475 > 関数呼び出しはオーバーヘッドが凄いと
場合による。きわめて単純な関数だと呼び出しオーバーヘッドが効いて来るが、中身が複雑になったら
無視できる程度。実際に、アセンブラコードを読んでみるのがいいと思うけど。
関数呼び出しの場合には、詳細はプロセッサのアーキテクチャによるんだが
1 関数呼び出しを通じて破壊される可能性があるレジスタの退避/復元
2 引数をレジスタに設定したりスタックに積む手間
3 分岐命令の実行 * 2 (関数へ分岐するときと、関数から戻るとき)
4 スタックフレームの作成、後始末
5 レジスタウィンドウの保存
なんかが必要になる。最適化をかけると 4 は消せる場合もあるけど。
みなさんレスありがとうございました。
とても解かりやすかったです。
みなさんのような人がいるから2chは辞められません。
私の周りの人間ときたら・・・・
よく会社が成立しているものだと感心させられます。
>>474 >>447さんの例を実際にやってみて、デバッグしてみればわかる。
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[]){
char *a = "abcdefg";
strcpy(a,"abc");
return(1);
};
>“strは配列構造ではない…”というか、
>“例示のコードにおいてstrが指すのは書き換え可能なメモリではない…”
>とでも言えば良いのでは?
面倒なのでどうとらえても結構。
483 :
デフォルトの名無しさん:02/01/16 22:15
>>481は、文字列リテラルが書き換え不可のメモリ領域へ配置されていることが、理解できてないらしい。
「配列構造ではない」は、あきらかに間違い。
>>483 「構造」っていう日本語ちゃんとわかってる?
ポインタは確かに、配置のされ方は配列に似てるよ。
初期化のされ方が違うと言っただけだ。
だから、ポインタも[]演算子でアクセスできる。
メモリの領域についてはふれた覚えはない。
>面倒なのでどうとらえても結構。
と言ったのはつっかかってきてうざいという意味です。
「配列構造」なんていうオレ語を持ち出すから…
>>484 > >面倒なのでどうとらえても結構。
> と言ったのはつっかかってきてうざいという意味です。
それはつまり474の書いている事が間違っているといいたい?
中途半端な理解で書いているのか俺言語で書いているのか、
はっきりいってあなたの配列とポインタに関する説明は意味不明。
>>486 間違ってるとは言わない。
探究心があっていいと思うよ。
自分自身もわかってるとは思ってない。
人の揚げ足を取るような発言をするので、
>>面倒なのでどうとらえても結構。
>と言ったのはつっかかってきてうざいという意味です。
と言っただけ。
>>気分を悪くした人へ
ごめんなさい。
なかなかたのしいです。
つづきが読みたいです。
誤解がある書き込みをした自分にも問題があるので、ちゃんとまとめます。
○strcpyで落ちるのは記憶域の長さが問題ではない
○配列とポインタの違いは
char abc[2]で、
abc[0]
abc[1]
それぞれが値を変えられるのに対し、
char *abc = "ab"
だと変えられるのはポインタ変数のabcのみ。
と言いたかっただけ。ただ、記憶領域がオペレーティングシステムの
書き込み不可領域に割り当てられるかはわからない。
自分も
>>474さんの発言の意味を十分理解していなかったと思います。
「strcpyで落ちるのは記憶域の長さが問題である」
と
>>474さんが言いたいのかと勝手に勘違いしてしまいました。
>>474さんには謝ります。すみませんでした。
490 :
デフォルトの名無しさん:02/01/17 01:46
>>489 しつもんしていいですか?
char a[10];
char *p="abc" ;
p=a;
の場合、
strcpy(p,"def");
は、出来ないって事ですか?
492 :
デフォルトの名無しさん:02/01/17 01:50
最近勉強してるとひどい頭痛がすんだけど
初心者ってみんなけいけんすんの?
俺がお馬鹿なだけ?
>>490 strcpy(長さ2,長さ3)
のようなケースは落ちるけど、
strcpy(長さ4,長さ2)
の場合は落ちない。
494 :
デフォルトの名無しさん:02/01/17 01:54
490
>>493 じゃぁ、
char a[10];
char *p="ab" ;
p=a;
strcpy(p,"123456789");
は、落ちますか?
>>490文字配列のアドレス入れてるからできるよ
p=a;なくてもウチのコンパイラならとおりそう。
497 :
デフォルトの名無しさん:02/01/17 02:00
490
>>496 でも
>>489 >char *abc = "ab"
>だと変えられるのはポインタ変数のabcのみ。
って書いてありますよ。
ポインタは配列のアドレス入れると、配列構造になるっていうことですか?
>>497 >>494の例でいうと、
pのアドレスの値がaのアドレスの値と同じになって、
a[10]のメモリ領域にアクセスできるようになるからだよ。
499 :
デフォルトの名無しさん:02/01/17 02:03
497
>>498 じゃあやっぱり、書きこめるアドレスと、書きこめないアドレスがあるんですね。
>>499 コンパイラについて詳しくないからわからないけど、
そういうことになるね。。
501 :
デフォルトの名無しさん:02/01/17 02:14
499
>>500 そうか、じゃやっぱり、
>>474さんの
>例示のコードにおいてstrが指すのは書き換え可能なメモリではない
っていう方が正解なんですね。
ありがとうございました。
>>497 配列構造なんて謎の単語は忘れたほうがいい。
>>502 画像ファイルを読みこんでメモリ内のイメージに展開して下さい。
>>501 >>書き換え可能なメモリではない
そこはOS,コンパイラに詳しい人に聞いた方がいいと思うよ。
さわやかなのか、粘着なのか、よーわからん展開だな、、、
506 :
デフォルトの名無しさん:02/01/17 02:32
細かい質問なのですが書かせてください
double d[10];
int i;
for(i=0;i<10;i++){
scanf("%f",&d[i]);
printf("%f",d[i]);
}
として入力すると なんかとんでもない数が表示されるのですが
フォーマット指定子のところを%lfにかえると 正常に表示されるんです
馬鹿でかい数を入力してるわけでもありません
これはローカル変数でやってるんですが
グローバル変数にすると 全部0.00000...と表示されてしまいます。
いろいろ実験したり サイトまわったりして調べたのですが
どうしてもわかりません なぜとんでもない数が入力されてしまうのか
ぜひご教授ください・・・
今日のテレホタイムのシメはこのすれにしとくか・・・
C言語、(・∀・)イイ!
508 :
デフォルトの名無しさん:02/01/17 02:41
printfは%f=%lfなだけで、scanfでは、doubleを %f
で受けてはいけません。
Cの可変長引数では、floatはdoubleに格上げされますが、
float *はdouble*にはなりえないからです。
>>506 scanf()のフォーマット指定子%fのところを小一時間読め。
510 :
デフォルトの名無しさん:02/01/17 02:52
>>508 詳しい説明ありがとうございます
なんとなくわかりました
>>小2時間くらい読みます 納得できないとなんか気分悪いですから。
丸く収まったところで漏れは寝る。
>>506 悪い事はいわん。
入門本を買ったらscanfの書いてあるページは破り捨てろ。
scanfは初心者潰し関数だ。
>>512 なかなか逝けると思うが?
%[]なんてどうよ。
514 :
デフォルトの名無しさん:02/01/17 04:28
CのライブラリでPerlの連想配列のようなものをサポートしてるものを探しています。
どっかにないでしょうか?
C++にMapってのがあるんですが、C++は使いたくないのでよろしくお願いします。
どうしてもコンパイルできないです。
ちなみにコンパイルにかけると、
「:\Windows\デスクトップ\Vcant\FrameWork\StaGrpDlg.cpp(59)
: error C2447: グローバルスコープで中カッコ ({) が見つかりましたが、
対応する関数ヘッダーがありません。」
となってしまいます。んー??
グローバルスコープってなに??
関数ヘッダーってなに??
ちなみにソースはこんな感じ
LRESULT StaGrpDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
if ( message == UWM_DRAWFITNESS )
{
DrawState();
}
return CDialog::WindowProc(message, wParam, lParam);
}
BOOL StaGrpDlg::OnInitDialog();
{ ←ここ???がおかしいらしいです
CDialog::OnInitDialog();
m_State.GetClientRect( &rectState );
m_OKBtn.GetClientRect( &rectOKBtn );
return TRUE;
}
void StaGrpDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
RECT rc;
if ( cx != 0 )
{ rectState.right = cx - 2;
rectState.bottom = cy - 62;
}
m_State.MoveWindow( &rectState,FALSE );
OrgX = 0; OrgY = 0;
cWidth = rectState.right - rectState.left;
cHeight = rectState.bottom - rectState.top;
int dw = rectOKBtn.right - rectOKBtn.left;
int dh = rectOKBtn.bottom - rectOKBtn.top;
rc.left = rectState.right - dw; rc.top = rectState.bottom + 5;
rc.right = rc.left + dw; rc.bottom = rc.top + dh;
m_OKBtn.MoveWindow( &rc,FALSE );
Invalidate();
}
>>514C++だから簡単に連想配列ライクなコンテナを使えるんだよ。
C言語だと、似たようなこと出来ても操作とかむちゃくちゃ面倒になるぞ。
それでもやりたいならハッシュとか探索木とかで調べろ。
521 :
デフォルトの名無しさん:02/01/17 13:05
sprintf などで、strncpy みたいにバッファの最大長を
指定するにはどうすればよいでしょうか。マニュアル見ても
英語が分からないので具体的にどう書けばいいか想像できません。
よろしくお願いします。
use snprintf.
524 :
デフォルトの名無しさん:02/01/17 13:48
>>523snprintfってC99に入ってなかったっけ?
とか言ってみる。
525 :
デフォルトの名無しさん:02/01/17 14:11
> sprintf などで、strncpy みたいにバッファの最大長を
話はそれるけど、strncpy()って半端な関数だよな。
バッファ長をこえてると、最後に0がつかないから、
使うときは結局strlen()なんかで、長さをチェックしなければいけない。
strncat()なんかはしっかり最後に0を付けてくれるのに。
526 :
デフォルトの名無しさん:02/01/17 15:15
>>525 それは使い方が間違っている。
strncpy()の想定するコピー先は、文字配列であり、
'\0'終端文字列では*ない*。
バイナリフォーマット上の固定長バッファに字面
を埋め込むような場合に使う。
最大n文字を、'\0'終端文字列としてコピーしたい場合は、
*d = '\0'; strncat(d, s, n); としとけ。
527 :
デフォルトの名無しさん:02/01/17 15:29
>>526> strncpy()の想定するコピー先は、文字配列であり、
> '\0'終端文字列では*ない*。
どうして?
strncpy()の振る舞いって、コピー元の終端か指定したサイズで
変わるでしょ。
コピー先がどうとかって関係ないんじゃない?
>>527526 の意図はよく分からんが strncpy() は、
末尾に '\0' を 1 バイトつける
関数じゃなくて、
もとのデータをコピーして
残りをすべて '\0' で埋める
関数なのは確かだ。文字列じゃなくて固定長のバイナリデータって気がする。
記憶・通信のコストが高かった昔は
8文字分の領域に7文字しか詰め込まないはとても勿体無い事だったのだ
str系は総じて使いにくいから、自分で書いたのを使ってたなぁ・・・
でもそれすると余計に標準の使うときに困ると言う悪循環
char buf[64+1]={0};
ってしといてから strncpyは1個分少なくすればOKだよ
>>532そんなことするぐらいなら、素直に
buf[0] = 0; strncat(buf, s, sizeof(buf)-1);
でいいだろ?
>>523がーん。素直に strn* を使うことにします。
'A' はどの環境でも 0x41 に等しいんでしょうか?
環境によって変わる?
>>535環境によって変わりますけど、変わる環境はあまりないと思われ。
怖かったら'A'の部分を#defineなりで一括変換できるソースを書けばよい。
可変引数について質問です。
void my_printf(char *,...);
void my_printf(char *src,...)
{
va_list ap;
char *param;
va_start(ap,src);
while((param=va_arg(ap,char *)!=NULL))
{
ここに必要な処理
}
va_end(ap);
}
my_printf("%s %s","param1","pram2",NULL);
みたいな関数を書いたとして、可変引数の終了条件はNULLです。
標準のprintfのように最後のNULLをつけなくてよくする方法はありますか?
可変引数の個数を引数として渡す方法以外で。
単純に%の数だけ変数を読む。
>>538コロンブスの卵的な発想ですね、ちょっと感動した。
もしかして、これって常識・・・?
>>535> 'A' はどの環境でも 0x41 に等しいんでしょうか?
> 環境によって変わる?
EBCDICでは'A' == 0xC1だが何か?
>>535>>536ごめん、自己スレ・・・
#defineで定義するより'A'をそのまま書いたほうがいいね。
char a='A';
if(a == 0x41)
↓
if(a == 'A')
みたく、でも
int numric = '5' - '0';
みたいのは、やっぱり環境依存。
>>537自作printfを作りたいんだったら
vprintf, vsprintf, vfprintfあたりを調べてみ
>>538"%% %s"の場合、破綻しないか?
>>541> int numric = '5' - '0';
> みたいのは、やっぱり環境依存。
数値の場合は規格で規定されてます。
上記の場合、numric == 5は必ず真になることが保証されてます。
ただし、アルファベットの場合
'A' <= c && c <= 'Z' と isupper(c)
の結果が一致することは保証されてないし、
EBCDICコードの処理系の場合は多分一致しない。
>536, 535, 543
おお、アリガトウございます。
環境の変化に耐えられるようにコード書いてるんだけど、
もしかして無駄な努力なのだろうかと思ったもので。
勉強になりました。
↑ 536, 540, 543の間違いでした
>>542>vprintf, vsprintf, vfprintfあたりを調べてみ
調べてみました、goto文とかやたら長い関数で大変でしたけど、
>>538さんの言うとおり%の数を調べてますね、%%を別条件ではねてます。
for (;;)
{
/* This code is arranged to give in-line flow to the most frequent
* case, literal transcription from *formP to *outP.
*/
if ((fc = *formP++) == _TEXT('\0'))
goto respond; /* end of format string */
if (fc == _TEXT('%')) /* '%' char begins a conversion */
{
if ((fc = *formP) == _TEXT('%'))
formP++; /* but "%%" is just a literal '%'. */
else
break;
}
PutToS(fc,&put); /* copy literal character */
}
勉強になりました。
547 :
デフォルトの名無しさん :02/01/17 21:14
関数fの中で配列のサイズを動的に確保したいのですが、
↓であってますでしょうか?いちおう自分が期待する通りに動いてくれたのですが…
void f(int **a, int n)
{
*a = (int *)malloc(n * sizeof(int));
}
main()
{
int *a;
f(&a, 10);
}
正解。
>>547あってます。
int *f(int n)
{
return((int *)malloc(n * sizeof int));
}
main()
{
int *a;
a = f(10);
}
というやり方もあるけど
550 :
デフォルトの名無しさん:02/01/17 21:18
>>547間違いではない
けど私の主観ではキモイ
int* f(int n)
{
return (int*)malloc(n * sizeof(int));
}
main()
{
int *a;
a = f(&a, 10);
}
>>550ゲゲン…
main()
{
int *a;
a = f(10);
}
>>552 __
―=三 \も \
―=三 \う \
―=三 \来 \
―=三 \ね.\
―=三 \え \
―=三 \よ.\
. .―=三 \ !!.\ ナニシテンダヨ
. ゚ 。 ゚ 。  ̄ ̄\ ウワアァァァン!!
―=三 ヽ(`Д´)ノ ヽ(`Д´)ノ (`Д´)ノ
―=三 | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─- カレイナ コーナーリング!!
―=三  ̄◎ ̄ . ̄◎ ̄  ̄◎ ̄ (`Д´)-,
( ,/。ヽ ))
'”ヽ゚ ,、
 ̄ヾ_、
笑ったぞー >553
僕も>549派です
わーい。だんだん分かってきたー。ような気がするー。
この調子で関数いっぱい作ろうっと♪
556 :
デフォルトの名無しさん:02/01/17 23:51
あの私、簡単なC言語の本を一通り読んである程度は理解したぐらいの
レベルなのですが、今度買う参考書はどのようなものがいいのか迷って
おります。私ぐらいのレベルに合う良い参考書があったら教えてください。
>>556あなたがこれから使うも処理系によって、次に買うべき本が違う可能性があります。
たぶん、処理系のリテラシーの本でしょうけど。
>>559
ブラクラ
ここまで豪快に○投げするやつもめずらしい。
>559 「10号館のLinux環境でコンパイル」って、どーすんのよ(w
2ちゃんで○投げクンに頼まれました、って言えば、つかわしてくれるのかな??
そうですよね。。。
すいませんでした。
うっかりしておりました。
もうしわけありません。。。
>>55910号館でコンパイルしてあげてもいいけど、
京都までの旅費くらい、だしてくれるよね?
漏れ、千葉に住んでるんだけどさ。
>>563それ(・∀・)イイ
みなで管理者に問い合わせメール投げるが吉(w
もう一度自力でやってみます。
みなさんお手数おかけして申し訳ありませんでした。
忘れてやってください。
関係ないが、
> movl 12(%ebp),%ebx
> movl (%esi,%ecx,4),%edx
こういう形式、あんましすきじゃないな。
>>568mov ebx, dword ptr [ebp + 12]
の方が好みだ、という話?
まったくもって、その通り。
571 :
デフォルトの名無しさん:02/01/18 11:55
289デフォルトの名無しさん 02/01/17 20:39char* f(void)
{
char *a="abcdefg";
return a;
}
int main(void)
{
printf("%s\n",f());
return 0;
}
これなんですが
コンパイラはエラーにならず通りました。
局所変数のアドレスを返すのはまずいと知っているんですが
定数は大丈夫なんでしょうか?
290デフォルトの名無しさん sage 02/01/17 20:41
>>289 問題ない。
char a[]="abcdefg";
return a;
だとまずいが。
ただ、文字列定数はconst char*にした方が良いと思われ。
const char* f(void)
{
const char *a="abcdefg";
return a;
}
294デフォルトの名無しさん sage 02/01/17 20:55>char a[]="abcdefg";
>return a;
>だとまずいが。
何故ですか?
295デフォルトの名無しさん sage 02/01/17 20:59ぞくにいう
宙ぶらりんのポインタ
296デフォルトの名無しさん sage 02/01/17 20:59
>>294 次からは
C言語なら、俺に聞け! <11>
http://pc.2ch.net/test/read.cgi/tech/1009499565/ で聞け
それは ブロック内だけ有効な実体である aのアドレスをブロック外に返してるからだ
297デフォルトの名無しさん sage 02/01/17 21:00
>>294それだと、局所変数のアドレスを返すから。
>>289は局所変数ではなく、文字列リテラルのアドレスを返してるから大丈夫。
572 :
デフォルトの名無しさん:02/01/18 11:56
>>571文字列リテラルだとブロック外から参照してもよいのですか?
それはCの規格でそう決まっているのですか?それとも実装依存なのでしょうか?
573 :
デフォルトの名無しさん:02/01/18 13:02
C言語でシンプソン則を使って5次の多項式 f(x)の各係数と、
積分範囲の最初 a と最後 b、積分の分割数 n を入力して、
定積分値∫f(x)dxをあらわすプログラムを作りたいんですけど、
まったくわかりません。本当によろしくお願いします。
俺はお前さんの
いってることがわからん・・・・
575 :
デフォルトの名無しさん:02/01/18 13:11
>>572 その場合、局所変数じゃないから大丈夫。
文字列リテラルは定数の仲間、整数定数を返すのと同じく安全。
int f(void)
{
int a = 123;
return a;
}
576 :
デフォルトの名無しさん:02/01/18 13:16
>>572局所的な自動変数のアドレスでなければ返しても大丈夫だと思うけど。
return "ITTEYOSHI";
こんなことしても大丈夫だし。
577 :
デフォルトの名無しさん:02/01/18 13:17
578 :
デフォルトの名無しさん:02/01/18 14:50
int *f(void)
{
static int a = 123;
return &a;
}
正直気持ちのいい物ではないね。
struct Singleton* getInstance()
{
static struct Singleton obj;
return &obj;
}
とか…Cでは普通やらないか。
>>578昔は、そういう実装の関数/システムコールも結構あった。スレッドセーフにならないので、最近は
廃れてるけど。
582 :
デフォルトの名無しさん:02/01/19 13:34
優香age!
583 :
Voidさま萌え:02/01/19 16:21
奥さん綺麗
584 :
デフォルトの名無しさん:02/01/19 16:43
if ( memcmp( "\x070", "\x080", 1 ) < 0 )
ここで、"\x070", "\x080"は何を表しているのでしょうか?
In article
>>584, デフォルト名無しさん/584 wrote:
文字コードを16進数で表記したもの。
たとえば下の二つは同じ文字列になる(ASCIIの場合)
"\x041"
"A"
文字列リテラルなどで検索してみましょう。
----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
586 :
作ってもわからない:02/01/21 06:13
日下部先生へ
作ってわかる〜 の52ページにあるmain(int argc, char *argv[])
のargvのとらえ方はp53,p72,p73付近でなんとなく理解できましたが、いつの間にかこのフレーズが
main(int argc, char **argv) になっていて困ってます。
「*」が二つもついていると理解に苦しいのですが、今の段階では覚えるだけでいいのでしょうか?
初心者ですいません。
プログラム実行中に
Enterを押さない限り次のprintfの内容が
表示されないようにするにはどうしたらよいのでしょうか?
fgetsあたりで。
589 :
デフォルトの名無しさん:02/01/21 08:37
char型の配列を数値(int)に変換する関数はありますか?
事故レス
$man 3 atoi
atoi, atol, atoll, atoq - 文字列を整数型に変換する
スマソ
In article
>>590, デフォルト名無しさん/sage/590 wrote:
> atoi, atol, atoll, atoq - 文字列を整数型に変換する
ato*系の関数でもいいですけど、エラーチェックをやりたいときには
strto*系のほうが便利ですよ。
----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
>>591 ありがとうございます。
ジョブ図2世からあなたがこんどこのスレを
まかなっていくことになったのですね。
よろしくお願いします。
>>591今LinuxでCの勉強をしているのですが、
$man strto*
と万個マンドにアスタリスクが使えるんですね。
初めて知りました。これでライブラリ関数を調べる
効率がぐんと上がりそうです。ありがとうございました。
>>593 漏れなんか、manコマンドで標準関数の説明まで見られるなんて今まで知らなかったぞ(愚)
596 :
デフォルトの名無しさん:02/01/22 17:09
age
597 :
デフォルトの名無しさん:02/01/22 19:00
あんた! ちょっと質問いい? 手間取らせないから、だまって聞いてなよ。
質問ってのは、main関数の引数についてなんだけどな。 これについて教えて
くんないいかな。 自分の理解では、main関数の引数は、コマンドラインのオプ
ション解析の為にあるらしいんだけどな。
なんか課題(゚〇゚)マルー投げが多いな、試験の季節ですか。
>>597 > コマンドラインのオプション解析の為にあるらしいんだけどな。
そうですか、良かったですね。
600 :
デフォルトの名無しさん:02/01/22 19:21
自分で書いたものと、コンパイルエラー表示は以下です。
=================================
#include <stdio.h>
#include <stdlib.h>
int main(void){
FILE *fp;
int da[i];
double hi[i];
double lo[i];
int i, j, max, min;
if ((fp = fopen("Temp.dat","r"))==NULL) {
printf("file open error!!\n");
exit(1);
}
fscanf(fp)"%d %lf %lf",&d, &f, &g";
for (i = 0; i < (n-1); ++i) {
x = data[i];
max = i;
for (j = i + 1; j < n; j++) {
if (data[max] < data[j]) {
max = j;
}
}
printf("最高気温, 日付=%d\n, %d\n" hi[max], max);
for (i = 0; i < (n-1); ++i) {
x = data[i];
min = i;
for (j = i + 1; j < n; j++) {
if (data[min] > data[j]) {
min = j;
}
}
printf("最低気温, 日付=%d\n, %d\n" low[min], min);
fclose(fp);
}
9-1.c:40:35: missing terminating " character
9-1.c:17:34: possible start of unterminated string literal
9-1.c:36:35: missing terminating " character
9-1.c:13:34: possible start of unterminated string literal
>fscanf(fp)"%d %lf %lf",&d, &f, &g";
逝ってよし
>>600 マルチポストウザイ
というか宿題スレの誤爆か
603 :
デフォルトの名無しさん:02/01/22 19:34
>>598 しらねーのかよ、ばーか。 んじゃあ、レスすんなって、、、
>>603 597の文章って、質問になってないじゃん(笑
何が聞きたいの?
あと、課題なら
>>599さが誘導してくれたスレにね。
C言語勉強するとどんなことできるようになるの?
>>605 E-mail欄にsageと書けるようになります。
あと、初心者を虐めることも出来るようです。
自分専用のJpegViewerを作って、最高のオナニーができるようになります。
608 :
デフォルトの名無しさん:02/01/23 02:40
プログラムが不正終了したときにはreturn -1と返すのとexit(0)とかで返すのは
どのような違いがありますか?
また、普通どちらを使うものなんですか?
>プログラムが不正終了した
なら、もう死んでるってことだろ。
どうにもできないと思うが。
確かに。
勝手に core を吐くのと、明示的に exit(EXIT_FAILURE); するのとは別物だな。
>>608 こうでは?
s/プログラムが不正終了したとき/プログラムをエラー終了させるとき/
安直にエラー終了させたい/するしかない状況なら、exit。
エラーハンドラをどうこうできる/しないといけないなら、longjmpとか、return。
612 :
デフォルトの名無しさん:02/01/23 03:17
>>609 エラー処理させるとき、です。たとえばfopen()がNULLを返したときとか。
自分でどうしようもないときはexitで、どうにかできそうなときはreturnなんですか?
main の return 値と exit の引数の値は同じ扱いでは。
>>612 場合によるなぁ。
エディタだったら fopen() で NULL が返ってくるたびに終了するようじゃ使い物にならん。むしろ
存在しないファイル名で fopen() したら
「指定されたファイルは存在しません。新規作成しますか」
とか、パーミッションの関係などで書き込みができないなら、その旨を表示して処理を続けるべき。
フィルタの類なら perror() & exit() でも良いと思う。
>>614 エディタじゃなくて、あるデータをあらかじめファイルに保存しておいて、
中身を表示するときにファイルを展開するんです。
だからもしなんらかの原因でファイルがないとどうしようもなくて。
616 :
sprit:02/01/23 04:28
1,23,456を,で区切って配列に格納するソースを教えてください
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main()
{
char* aszCmds[] ={
int n;
for(n = 0; n < INT_MAX; n++){
FILE* fp = tmpfile();
printf("%5d ", n);
if(n%10 == 0)
printf("\n");
fclose(fp);
}
return 0;
}
一時ファイルを作っては消し、作っては消しするプログラムです。
これを実行すると、どうしても32600回くらいで止まってしまいます。
なぜなんでしょう。。。
っていうか、皆さんの環境ではどうなるか
教えて欲しいです。
ミス。。。
char* aszCmds[] ={
この行は無しです。
620 :
デフォルトの名無しさん:02/01/23 05:15
>>618 ネタ?
あなたの環境でのintの限界です。
621 :
デフォルトの名無しさん:02/01/23 05:16
VC6++ Sp5でやってみた。たしかに、32767の次で、
tmpfileがNULLを返すね。つか、チェックしろよ>618。
>>618 ファイルシステムの制限じゃないのか? ディレクトリの中に入れられる
ファイル数に制限があるとか。
VC6++でトレースしたら、tmpfile.cのgenfname()って関数のなかで、
32767個以上のテンポラリファイル名作れないようになってたよ。
仕様つことで。
624 :
◆0jAJSEXI :02/01/23 06:48
C/C++言語
unix systemにおいて
inputというファイルから文字列(日本語)を読み込んで、
それと同じ文字列を入力して同じならば…というような
タイピングゲームを作りたいのですがsystem("kinput2&")を
実行するとうまくいきません。どうしてですか?
void num2(){
int n=100,i;
FILE *fp1;
char honbun[100],type_moji[100];
fp1=fopen("input","r");
if(fp1==NULL)
exit(-1);
do{
printf("%s", fgets(honbun,n,fp1));
system("kinput2&");
fgets(type_moji,n,stdin);
}
while(!strcmp(honbun,type_moji));
fclose(fp1);
}
>>625 「うまくいきません」とはどういうことが。
Warning: XimpProtocol: SelectionClear event received
Warning: KinputProtocol: SelectionClear event received
のがでます。
ただの警告じゃん。
system("kinput2 2>/dev/null&");
とでもしろ。
つーか、kinput2なんて普通.xinitrcとか.xsessionから動かさんか?
ちなみに板違いなのでUnix板あたりに逝け。
>>628 system("kinput2 2>/dev/null&");
としたら警告でなくなりました。どうしてなのか?
でも入力した文字がリターンをおすと化けます。
どうしてなのですか?
「リダイレクト」や「/dev/null」で検索してみれ
>>630 わかりました。
下のプログラムなんですがファイルからとってきたのと
同じものをタイプしても配列の長さが違います。
つまりi,jの長さが違うんです、
どうしてですか?
void num2(){
int n=100,i,j;
FILE *fp1,*fp2;
char honbun[100],type_moji[100];
fp1=fopen("input","r");
if(fp1==NULL)
exit(-1);
system("kinput2 2>/dev/null&");
do{
printf("%s", fgets(honbun,n,fp1));
fgets(type_moji,n,stdin);
i=strlen(honbun);
j=strlen(type_moji);
printf("%d %d",i,j);
}
while(!strcmp(honbun,type_moji));
fclose(fp1);
}
>>631 (´o`).。oO( 「ファイルからとってきたの」 「同じもの」って夫々なんだろう? )
>>631 デバッガ使うか、printfで適当に表示してみて、変数の中身確認してみそ。
> system("kinput2 2>/dev/null&");
(´o`).。oO(pipeにもつながないで、こいつはなにをやっているの?
unixは詳しくないんだけど、kinput2ってこういう使い方するの?)
635 :
デフォルトの名無しさん:02/01/23 17:23
Illegal character 'character' (0x'value') コンパイラメッセージ
不正な文字 'character' (0x'value')
入力ファイルの中に無効な文字がありました。
その文字の 16 進値が出力されます。
これは,関数マクロに余分な引数が渡されたことが原因であることもあります。
・・・というエラーが出るのですが原因が全くわかりません。
配列の[]の中の文字に対するエラーなのですが、他の文字に
変えても同じエラーが出ます。
「関数マクロに余分な引数が・・・」このあたりが原因でしょうか。
なにか心当たりがある人いたら教えてください。お願いします。
>0x'value'
で、このvalueはいくつなわけよ?
>>635 エラーが出てるあたりのコードを見せるのが手っ取り早いと思われ
>>635 もしかして、コードの中に全角のスペースとか入ってない?
639 :
デフォルトの名無しさん:02/01/23 17:30
>>636 Illegal character ' ' (0x8140)
と出てくるのですがド素人なので何のことやらさっぱりわかりません。
641 :
デフォルトの名無しさん:02/01/23 17:37
>>640 文字を変えていろいろ試してもだめだったのでそれはないと思います。
でも、もう一度確認してみます。
642 :
デフォルトの名無しさん:02/01/23 17:39
>>637 全く見当がつかないんです。全部載せるのもちょっと・・・
643 :
デフォルトの名無しさん:02/01/23 17:40
>>641 0x8140はSJISで全角スペース。
>634
2>dev/nullはエラー出力を標準出力からNULLデバイス行きにするってことでし。
当然エラーは画面に出力されないようになりますw
645 :
デフォルトの名無しさん:02/01/23 17:44
>>643 マジっすか?それは全角スペースが入ってると考えて間違いない
と言うことですか?
>645
聞く前に動け。
ソースを全角スペースで検索しろ
>>642 コンパイラは何使ってるの?
普通、エラーがでたら「このファイルの何行目」っていう情報はついてるよ。
っていうか、どんなコンパイラでもついてる、ついてなきゃおかしい。
でも、しつこいけど絶対、全角スペースが入ってると思うよ。
ためしに全てのソースで、全角スペースを半角に置換してみ。
648 :
デフォルトの名無しさん:02/01/23 17:56
>>646 全角スペースありました!初歩的なミスってやつですね。
全然かんけいないところにありました。
>>647 定義文の直後あたりに全角スペースが入ってたので、その文字が
使われてる場所全てにエラーが出てたようです。
考えてくださったみなさん本当にありがとうございました。
ん?待てよ・・・
なんで定義文のところにエラーが出ず、正しい文字のほうに
エラーが出たんだろう?
解決したからいいんだけどちょっと気になる・・・まいっかぁ
>620-623
レスどうもです。
>621
NULL返すのはなんでかなーってことでした。説明不足スマソです。
>623
仕様でしたか。。ありがとうございます。
初心者なので、そんな質問するなって思うかもしれませんが聞いてやってもらえますか?
"123.4"といった任意の数値の文字列(数値で4桁)があり、小数点前を1000倍(123 * 1000)、
小数点後を1000倍(0.4 * 1000)して数値(long型?)にするのはどうしたら良いのでしょうか?
(123000 + 400 = 123400という値を作りたいのですが・・・。)
ただ、これをfloat型を使わないでなんてできますか?
>>652 strchrなんかで '.'を検索せよ。
んで、そこで文字列を分割、その後に数値化。
本とか見てじっくりやればきっとできるぞ。
653さん、聞いてくれてありがとうございます。
やっぱり本、買わないとダメですね。
"123.4"(数値の文字列)から1000倍して、400(数値型)を作る方法がいまいち解らないんです。
>654
double d;
d = atof("123.4");
printf("%d, %d", (int)d * 1000, (int)((d-(int)d) * 10 * 100));
"w+b"モードで開かれてるファイルの
中身をカラにするにはどうすればいいですか?
655さん>
小数点という考えを無くしてできますか?
>>657 お勧めしないが
int i, j ;
printf("In>") ;
scanf("%d.%d", &i, &j) ;
printf("Out>%d\n", i*1000+j*100) ;
>658
それだと、微妙にバグ有ると思う。
int power(int base, int r)
{
int ret=1;
while( r-- > 0)
ret *= base;
return ret;
}
main ()
{
const char *p="123.40";
char *pe;
const char *pr = strchr(p, '.');
long first = strtol(p,NULL,10) *1000;
long second=0;
if( pr )
{
pr++;
second = strtol(pr,&pe,10)*1000;
second /= power(10,pe - pr) ;
}
printf("%d %d",first, second);
}
>658
ありがとうございます。
"123.4"という文字列に対して使いたいんです。
>660
sscanfくらい知っとけ。
>>656 一度クローズして、"w+b"でオープンし直すのが一番お手軽かも。
>>659 >それだと、微妙にバグ有ると思う。
うむ、だからお勧めしない。
>>660 int i, j ;
sscanf("123.4","%d.%d", &i, &j) ;
printf("%d\n", i*1000+j*100) ;
>662
レスどうもです。
てことは、ファイル名がいりますね。
他に思いつかないし、
ヤパーリファイル名を記憶するようにした方がいいかな。
freopen使うってのはどうかね?
>>665 freopen()ってやっぱりファイル名がいるのでは?
>>664 Cの標準関数じゃなくなっちゃうけど、UNIXだと
rewind(fp); ftruncate(fileno(fp), 0);
てな感じでできそうな気がする。
まあ、ファイル名を覚えとけばいい話なので、ものぐさしないで
そうした方がいいかも。
素直にファイル名覚えとくようにします。
ありがとう。
>>654 #include <ctype.h>
#include <stdlib.h>
#include <string.h>
struct fixed {
long n;
unsigned long f;
};
struct fixed
parse_fixed(const char* s)
{
struct fixed x;
x.n = strtol(s, (char **)&s, 10);
if (*s++ == '.' && isdigit(*s)) {
char tmp[4];
int i = 0;
do {tmp[i++] = *s++;} while (isdigit(*s) && i < 3);
while (i < 3) tmp[i++] = '0';
tmp[3] = 0;
x.f = strtoul(tmp, NULL, 10);
}
else {
x.f = 0;
}
return x;
}
int main()
{
struct fixed x = parse_fixed("123.45");
printf("%ld, %ld\n", x.n, x.f);
return 0;
}
しかしstrtol()を使うならstrchr()はいらないし、isdigit()を使わないと
"123. 40"みたいのも通ってしまうと思われ。
それにsecondはstrtoul()でないとまずくなかろうか。
というか、
>>659はオーバーフローする可能性がないか。
671 :
日下部陽一:02/01/24 09:06
age
>>648 遅れてすまんが…
全角スペースなどの特殊な文字は
ソースの画面では色付き記号で表示されるよう、
エディタの設定をキチンとしておけゴルァ
あと、(半角スペースを書きたかったのかな?)
印字しても見えない文字はマクロで
#define HALF_WIDTH_SPACE 0x20
なんて定義して使うのもいいんじゃなかろうか。
>#define HALF_WIDTH_SPACE 0x20
俺の部下がやったら、殴るとおもうな…
674 :
デフォルトの名無しさん:02/01/25 09:07
age
675 :
デフォルトの名無しさん:02/01/25 13:40
#ifndef _RMXFTMPL_H_
#define _RMXFTMPL_H_
/////D3DRM_XTEMPLATES[]の定義
#ifndef
で定義されたヘッダファイルを2つの(drawx.h,Cobj.h)ヘッダファイルでインクルード
すると次のようなエラーが出てリンクエラーになります。1つだと大丈夫なのですが、
その場合どちらかのヘッダ&ソースファイルをプロジェクトから外さないとできません。
2つとも必要なんです。
>drawx.obj : error LNK2005:
>"unsigned char * D3DRM_XTEMPLATES" (?D3DRM_XTEMPLATES@@3PAEA) は
>すでに Cobj.obj で定義されています
ソースファイルのほうで定義しても同じでした。
どちらかのヘッダだけでこれをインクルードしてそのヘッダを別の方でインクルード
してもダメでした。た、助けて。何かリンクエラーの説明を詳しくやっているHPがあったら
教えて下さい・・・。
externを付けるべし。
実体はどっかの.cppで確保すること。
>>675 ヘッダでは「宣言」だけを行い、ソースで「定義」を行え。
>>676 このヘッダを書き換えるんでしょうか?
このヘッダファイルはDirectXRMの中の定義ファイルなんです。
できたら書き換えないようにしておきたいのですがそれ以外に
何か方法はないんでしょうか?
.cppでの確保ですが、配列の内容が既にこのヘッダファイルで初期化代入
されてるんですけどそれがメチャメチャ長いんです。
>>678 > .cppでの確保ですが、配列の内容が既にこのヘッダファイルで初期化代入
> されてるんですけどそれがメチャメチャ長いんです。
そのヘッダ書いた奴馬鹿杉
>>676>>677 すいません。ヘッダでextern使うだけで解決できました。
ありがとうございます!
681 :
デフォルトの名無しさん:02/01/25 15:40
いろいろ調べたのですが どうしてもわからないところがあるので
教えていただけないでしょうか
バイナリファイルのコピーとテキストファイルのコピーの違いなんですが
ファイルをコピーするとき
バイナリ・テキストファイル両方コピーできるようにするならば
FILE *filename,filename2
char ch;
from=fopen(filename,"r");
to=fopen(filename2,"w");
while(!feof(from)){
ch=fgetc(from);
fputc(ch,to);
}
fclose(from);
fclose(to);
で出来ると思うのですが、なぜchar型に代入しているのにもかかわらず
バイナリがコピーできるかがわからないんです
確かchar型は-127〜127までの数しか扱えないとおもうのですが
バイナリは日本語を含めると255くらいまでの数がでてくるはずだとおもうのですが
この理由がさっぱりわかりません
お分かりになるかた教えてはいただけないでしょうか
>>681 バイナリでファイルを扱うなら、バイナリモードでオープンしないと。
fopen(file,"rb")
fopen(file,"wb")
683 :
デフォルトの名無しさん:02/01/25 15:50
>>681 char型が符号無しかありかは処理系依存。
不安ならunsigned charにすればいいだろ。
684 :
デフォルトの名無しさん:02/01/25 15:56
>>682 すいません 書きミスってしまいました うっかりでした
ご指摘ありがとうございます
>>683 つまり処理系によっては これでコピーできないこともある ということですよね?
要するに unsigned charにして255まで扱えるようにすればいい ということですよね
685 :
デフォルトの名無しさん:02/01/25 15:57
signedだろうがunsignedだろうがビットの並びは同じだと思う。
計算さえしなければどうでもよい。
↑厨房意見
しかし char型の数をprintf("%d",ch)をループして表示したものと
int型でも両方表示してみたんですが 数が違うのにコピーは出来てる・・・
いったいなぜなんでしょうか・・・
687 :
デフォルトの名無しさん:02/01/25 16:00
>>はっ そういえばそうですね!盲点でした・・・ありがとうございます
>>684 元気に試すのは進歩の素。ガンガレ!
しかし
「確かchar型は-127〜127までの数しか扱えないとおもうのですが」って
-128〜127 なんじゃないかな?
ふつうは2の補数表現だからね。
あと、あなたが試していた例だと
unsigned char の 511 と signed char の -128 は同じビット並びで
内部表現されているわけです。
今回の最大の問題は、あなたがデータ型の修飾語を
明示的に使っていないことです。
>>686 「int型でも両方表示してみたんですが」って言ってるけど、
それも unsigned/signed を しっかり明示的に書いて試さないと、
なかなか理解できないぞ!
横着しちゃだめだぞ!
>>689 了解です!!ありがとうございます
これからは明示的にしっかり書いていくことにします!
まだC言語初めて 10日くらいしかたっていないのですが
みなさんに暖かくされるとやる気がでてきます
ありがとうございました
>>681 > char ch;
int ch;の方が好きだな
while((ch=fgetc(from)) != EOF){
fputc(ch,to);
}
の方がすっきりしてる。
fgetcをcharで受けるのは厨房
>>689 (俺)
「unsigned char の 511 」 ×
「unsigned char の 255 」 ○
回線切って首吊って帰宅して転生します。お休みなさい
(・∀・∀・)ヌッヘッホー
変数の数を出力する
スコープの数を出力する
スコープの深さを出力する
コマンドラインツールありませんか?
695 :
デフォルトの:02/01/25 19:36
httpサーバを書いています。
***.cgiファイルをリクエストされたときに
Perlにそのファイルを処理させて結果をブラウザに返すようにしたいのですが、
C言語から多言語に処理を渡す方法はどうしたらいいのでしょう?
パイプ とだけ言っておこう。
名前付きパイプでゴー
698 :
デフォルトの名無しさん:02/01/26 15:14
age
>>681 ちょい考えてみたんですが その式でいくと
ファイルの終端でEOFが帰ってきたのか エラーで帰ってきたのか
わからなくなっちゃわないでしょうか?
あと int型2バイトでやるよりchar型1バイトのが 処理が早くなるような
気がするんですが・・ 厨房なんでこんなことしか考えられないのですが
違ってますか?
700 :
デフォルトの名無しさん:02/01/26 15:43
>>699 処理の速さを改善するのだったら、read(), write()
で数Kバイト一気に読み書きしたほうがいい。
読み込み中のエラーを考慮するのならば、あらかじめ
ファイルの大きさを調べておけばいい。
701 :
デフォルトの:02/01/26 16:01
>696,697
OS画ウインドウズなんですけど、そのまま出来るんでしょうか?
system("C:\perl\bin\perl test.cgi")ってのも考えたんですが、
これだと戻り値をソケットに流し込むことができないんですよね。
>>700 なるほど 参考にさせていただきます 実験して試してみますね
703 :
デフォルトの名無しさん:02/01/26 17:58
>>699 > ファイルの終端でEOFが帰ってきたのか エラーで帰ってきたのか
エラーのチェックはしてないように見えるが。
> int型2バイトでやるよりchar型1バイトのが
気にする程違いがあるわけじゃないよ。処理系にもよるけど。
それよか、1バイトだと (unsigned char)255 と (int)-1 の区別が
つかないぞ。
charがunsignedなら、無限ループになるのでは。
705 :
デフォルトの名無しさん:02/01/26 20:03
先日から、C言語の勉強を始めました。
現在for文の例題をやっているのですが、もなかなか綺麗に書けません。
諸兄方に添削をお願いできますと有難いです。
内容:
dataというint型配列に、正数のデータがあり、エラー(-1)が混ざっています。
それを除外対象として、s番目の値を出力するプログラムを書いています。
(s=0 結果=1, s=1 結果=2, s=5 結果=6, s=7 結果=8)
----------------------私の書いたプログラム----------------------
#include <stdio.h>
int data[] = {-1, 1, 2, 3, 4, -1, 5, -1, -1, 6, 7, 8, 9};
int s=7; /*簡単に考えるため、dataの添え字が無効にならない範囲と仮定*/
main()
{
int i, j;
for (i=j=0; i<=s; ++i, ++j) {
while (data[j] == -1) {
j++;
}
}
j--;
printf("result = %d\n", data[j]);
}
--------------------------------------------------------------
無い知恵絞ったのですが、ループ内で完結せずに j-- が外に出ています。
ソートなどの難しい問題をやる場合には、ループ内での比較処理はよく使われると
思うのですが、このプログラムももっとシンプルになりませんでしょうか?
定石のような書き方がありましたら、教えて下さい。よろしくお願い致します。
配列もう一つ用意してエラーでない要素を全部そちらに代入。
その後に新しい配列のn番目にアクセスすればOK。
とか。
707 :
デフォルトの名無しさん:02/01/26 20:08
>>705 i を使わなきゃもっとシンプルになるだろうに。
ごめん。勘違い。
>>705 for (i=0,j=-1; i<=s; ++i) {
++j;
while (data[j] == -1) {
++j;
}
}
//or
// for( i=0, j=-1; i<=s; ++i )
// while( data[++j]==-1 );
とか。しかしfor文の例題ということなら仕方ないが、
この場合 do〜while で書いた方がスッキリするような。
早速のアドバイス、ありがとうございます。
>>706 書き換えてみました。
data2という配列を用意して、
for (i=j=0; i<(sizeof(data) / sizeof(int)); ++i) {
if (data[i] != -1) {
data2[j++] = data[i];
}
}
printf("result = %d\n", data2[s]);
とすると、一重のループで書けるんですね。
>>707 私こそ、汚いプログラムで、すみません。
forのカッコ内には、いっぱい書かない方がスッキリするんでしょうね。
どうもありがとうございます。
>>709 j(添え字)に、0未満の値を入れておくなんて、思いつきませんでした。
whileよりも先にj++しておけば、ループ内で完結しますね!
プログラム技術板の方々は、さすがスゴイですね。
#まだ制御文はif,for,whileだけで、do〜whileには至ってません。
そこまでいけましたら、復習でdo〜whileを使って書き換えてみます。
2次元以上の配列のポインタを関数に渡すにはどうしたらいいの?
独習Cを端から端まで読んでも書いてない
ネットで調べてものってない なんなんだこりゃぁ・・・
たとえばローカル配列変数
char str[100][2][30];
で100のリストに2つづつ入る文字列テーブルを作って
それのポインタを関数に送って その関数ないで strの中身まとめてを書き換える
というのが どうしてもわかりません
グローバル変数でやってしまえばポインタを仮引数にして送る必要もないんですが
どうしてもそれじゃ納得できないんです・・・
>>712 foo(char (*strp)[100][2][30])
{
...
}
foo(&str);
ではだめか?
715 :
デフォルトの名無しさん:02/01/26 22:18
2次元の配列のポインタの初期化は
p[i] = &a[i][0];
とかでやる。
717 :
デフォルトの名無しさん:02/01/26 22:23
それ一個おおいやろ>716
>>713 foo(char (*strp)[2][30]){;}
foo(str);
でいいんじゃない?
>グローバル変数でやってしまえばポインタを仮引数にして送る必要もないんですが
無理に次元増やさなくても。
>>716 >>714
>>717 >たとえばローカル配列変数
>char str[100][2][30];
720 :
デフォルトの名無しさん:02/01/26 22:24
ポインタにいれて、ポインタで取る!
721 :
デフォルトの名無しさん:02/01/26 22:25
それをポインタに入れて関数側でポインタでうけとるのが一番>720
722 :
デフォルトの名無しさん:02/01/26 22:26
配列もポインタやからな〜、配列のままわたせや
>>713-718 ありがとうございました まだ なんだか頭の中でごちゃごちゃしてますが
どんどんやっていって 覚えていこうと思います
725 :
デフォルトの名無しさん:02/01/26 22:28
偏見ちゃうぞ、、配列はポインタとして扱われる、、>724
>>724 確かにそうだがその認識は間違っている。ANSI読んでね。
727 :
デフォルトの名無しさん:02/01/26 22:29
ANSIが間違ってるって知ってた?
728 :
デフォルトの名無しさん:02/01/26 22:32
配列は宣言するときに同じ型の変数をまとめたもので、
内部的にはポインタ扱い
729 :
デフォルトの名無しさん:02/01/26 22:33
ANSIが正しいってわけでもない
>>725 int n[1];
int *p;
printf("%d", n[0]);
printf("%d", p[0]);
最適化をきってコンパイルしてアセンブラ出力を見てみ。配列は間接参照せずに、
直接アドレスを出してるはずだから。
>>728 「内部」とか、自分にしか通じない用語を使うなよ。
「配列は右辺値として評価したときにはポインタに縮退する」であって、左辺値と
しての扱いは全く異なるし、一般にはメモリ配置もポインタを使う場合と配列を使
う場合で違う。
>>712 #include <stdio.h>
int tech(char (*strp)[2][16])
{
int a, b;
for (a=0; a<10; a++)
for (b=0; b<2; b++) {
printf("str[%d][%d]@%p = \"%s\"\n", a, b, *(strp+a)+b, *(*(strp+a)+b));
printf("str[%d][%d]@%p = \"%s\"\n", a, b, &strp[a][b], strp[a][b]);
}
return 0;
}
main()
{
int a,b,c;
char str[10][2][16];
for (a=0; a<10; a++)
for (b=0; b<2; b++) {
str[a][b][0] = '0'+a;
str[a][b][1] = '-';
str[a][b][2] = '0'+b;
str[a][b][3] = '\0';
}
tech(str);
return 0;
}
要素数小さくしてあるよ。
733 :
デフォルトの名無しさん:02/01/26 22:51
間違ってるぞ〜、豆腐の角に頭ぶつけて死ね>732
縮退ってどういう意味?
735 :
デフォルトの名無しさん:02/01/26 22:53
文句があるなら日本電子の小菅に言え!
ところで、配列の[]って演算子なの?
ぼく何もわかんないでしゅ
なるべく3次元以上にならないように
するのがいいと思うんだが
配列を関数に渡して、配列で受け取ったらアドレス渡しなの?
関数の仮引数においては
配列とポインタはまったくおなじである。
[]は演算子です。
>733
煽ってるじゃねえよ!
お前! 間違ってるんなら、教えて下さい。
>739
関数で、配列は渡せません。
配列名だけを記述すると、先頭要素へのポインタとなります。ポインタを渡しています。
740も書いているけど、関数の仮引数として[]を記述しても、ポインタの意味です。
foo(int x[]) でも foo(int x[256]) でも foo(int *x) でも同じです。
可読性のためです。厳密には、一次元の配列しか存在しません。
foo(int x[4][10]) と foo(int x[][10]) と foo(int (*x)[10])
どちらも、大きさ10のint型配列へのポインタを仮引数として受け取ります。
foo(int **x) は、int型へのポインタへのポインタを仮引数として受け取ります。
だから、712の問題では func(***a) と書くのは文法的に間違い。
配列の名前とポインタ、sizeofの動作も違うね。
(742の補足)
>foo(int x[4][10]) と foo(int x[][10]) と foo(int (*x)[10])
演算子の優先度 () = [] > * なので、3番目の記述では()が必要。
じゃあ、それぞれの先頭アドレスをポインタにいれて、そのポインタを
ポインタのポインタで関数側で受けるということでしょうか?
do〜whileわかりました。THX!
う〜ん、配列名を配列で関数側で受け取ったあと、関数内での配列の操作は
元の配列にも影響しているのは、アドレスをコピーしてるからですか?
ところで、 リンクリストってどう使うの?
(゚Д゚)ハァ?
typedef struct list{
int data;
struct list *next;
struct list *prev;
}LIST;
ってどうなってるの?
だれか教えてください
構造体のなかで構造体へのポインタを宣言するのはなぜなんですか?
わかんねーうちは、使うな。
説明してもらえればありがたいんですが
リンク先みましたが、 参考書に書いてる内容と同じです。
教えてくださいよ
> 757
…それ読んで駄目ならお前プログラマ辞めろ。
つーか、本当に読んだのか?
理解する気あんのか?
プログラマじゃないです。
でもハッシュ探索わからないと、テストやばいっす
お願いします。
あなたも説明してくればいいじゃないですか
>>761 短時間にいくつも書き込むなよ。邪魔だ。
> でもハッシュ探索わからないと、テストやばいっす
理解できないなら、単位を取得できないのは妥当だと思われ。他の科目で
頑張るか、己の才能のなさと友人の少なさを恨みつつ留年しなよ。
>あなたも説明してくればいいじゃないですか
悪いが俺は、猿に微積を教えるような真似はしたくない。
前後の構造体のアドレスを入れてるのはわかりました。でもなぜ
宣言が再帰的なんですか?
教えられないだけなんですか?
>>762 この掲示板では、だれもあなたに説明する義務はありません。学生なら
先生捕まえて質問しろ。そのために学費払ってるんだろ?
> 教えられないだけなんですか?
そうです、この板には残念ながら“あなたに”教えられる人はいません。
あきらめて他所へ逝ってください。
かしこ
高校生です、、独学なんで。
って結局わからないだけなんじゃないですか!
Moran!
771 :
デフォルトの名無しさん:02/01/27 00:45
>>770 そんな古典的な煽りをいれたって教えてはくれないって。
でも、わからない、、
ほかの人たちには教えてるのに、、、教えてもらえない(涙)
>>772 何がどう分からないんだよ。
このスレの住人はそれが分からないんじゃなくて君へのうまい教え方が分からないんだろ。
無理もないよ。
猫や猿に算術を仕込むのは難しいんだよ。真っ当な人と違って。
そんなことのできる香具師がこの板にいるとおもうか?
誰かほかの方でもいいです、、。なぜ、構造体のなかで構造体へのポインタなのか、、
ネタか?
> でもハッシュ探索わからないと、テストやばいっす
> 高校生です、、独学なんで。
学校のテストに出る事を勉強してて独学って何?
つーか、お前が何がわからんのかが分からんわ。
高校生です、、でも基本情報うけるんです
「宣言が再帰的」なんて難しく表現するほどのことじゃないですよ。
prevやnextがポイントする対象がstruct listだからそう書いてるだ
けのことです。
>>776 真・技術系メーリングリスト「FAQ」ね。
4月に、、受けるんです、、未熟でごめんなさい。
あまり怒らないでください
ああ、そうなんですか。わかりました
>780
もう遅いです〜
>784
デフォルトの名無しさんは同一人物なんですか?
訳わからなくなります
>デフォルトの名無しさんは同一人物なんですか?
だとしたら、分裂症か多重人格で病院送りだな(ワラ。
>>786 > デフォルトの名無しさんは同一人物なんですか?
そうだよ、暇で暇でしかたないんだよ(w
>むふふ
リストを理解できているならばその書式の必要性は分かるだろう。
必要だから構文として認められている。
分裂症なんですか、お大事に
>>786 ネタじゃないと仮定して、
2ch初心者なのね・・・
頑張って理解できるようになります
初心者です。 未熟でごめんなさい
もう怒らないでください、あたしっだて頑張ってるんです
偽物がまざっている予感・・・
>あたし
(゚д゚)♀!?
(;´Д`)ハァハァ。
偽物なんてまっざてません
もういいです。 (涙)
親切に教えてくださった方、感謝します。
もう二度ときません、、。
>>795 あなたが頑張ってるかどうかはどうでも良いですが、私は迷惑してます。
(せめて sage ろ)
多重人格、精神分裂症、、おだいじに
多重人格、精神分裂症、、おだいじに
>>802 なんで逆切れするかなあ?
とりあえず名前欄に何も入れずに書き込んで見ろ。
ただし沈んでいるスレでsageてな。
「おれは42才、24年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことならぜんてわかるから、疑問な点があったらオレに聞け。」
って書いてたのに、、(涙)
イジワル〜!
補足、sageというのは"E-mail (省略可)"の欄に"sage"と書くこと。
「二度ときません」と言いながら、いつまでも帰れない罠。
自分で書いたことぐらい責任を持って実行しろよ。さっさと (・∀・) カエレ!
…いや、もう違う人間が遊んでるだけだろ?
>Cのことならぜんて
こんなネタが‥‥キヅカナカッタ
誰だってはじめは初心者だと思うのです。
なのに、言いすぎじゃないですか!
>812
うーん。初心者のパターン通りで少々詰まらぬな。
ネタ職人は、もっと努力するように。3点。
人生や質問の初心者は、まず、身近なところで練習してから来てね(はあと)
>>796 713=722=725=…=733=749=むふふ(一部) と見た!
一人で遊んでたのしい?
やってられね〜な
スーパーハッカーってあんたかい
(´-`).。oO( もうわけわからんわ… )
In article
>>751,751 wrote:
>ってどうなってるの?
1312ペイジと1314ペイジに書いてありますね。
えええええええ
(´-`).。oO( もうわけわからんわ… )
(´-`).。oO( もうわけわからんわ… )
(´-`).。oO( もうわけわからんわ…)
教えられないだけなんですか?
(´-`).。oO( もうわけわからんわ… )
829 :
デフォルトの名無しさん:02/01/27 01:27
(´-`).。oO( もうわけわからんわ…)
(´-`).。oO( もうわけわからんわ… )
| | | ________________________________________________
| | |_____ΦΦΦΦΦΦΦΦΦΦΦ||ΦΦΦ
| | | ̄ ̄ ̄ /| ||
| | | / /|TTTTTT TTTTTTTTTT||TTTTT
| /\ | /|/|/|^^^^^^ |三三| ^^^^^^^^^^^||^^^^^^^
| / / |// / /|
| / / |_|/|/|/|/|
| / / |文|/ // /
|/ /. _.| ̄|/|/|/ ∧_∧
/|\/ / / |/ / (___)
/| / / /ヽ /〔 祭 〕〕つ
| | ̄| | |ヽ/l `/二二ヽ
| | |/| |__|/ ∧_∧ / /(_)
| |/| |/ ( ´∀`) (_) ∧_∧
| | |/ // / ^ ̄]゚ (` )
| |/ ゚/ ̄ ̄_ヽ ⊂〔〔 祭 〕
| / /_ノ(_) ┌|___|
|/ (__) (_ノ ヽ ヽ
/ (_)
… )
なんの祭りだよ! ヽ(`Д´)ノ
(´-`).。oO( もうわけわからんわ… )
In article
>>827,むふふ wrote:
>教えられないだけなんですか?
ということにしたい?
(´-`).。oO( もうけ…)
| | | ________________________________________________
| | |_____ΦΦΦΦΦΦΦΦΦΦΦ||ΦΦΦ
| | | ̄ ̄ ̄ /| ||
| | | / /|TTTTTT TTTTTTTTTT||TTTTT
| /\ | /|/|/|^^^^^^ |三三| ^^^^^^^^^^^||^^^^^^^
| / / |// / /|
| / / |_|/|/|/|/|
| / / |文|/ // /
|/ /. _.| ̄|/|/|/ ∧_∧
/|\/ / / |/ / (___)
/| / / /ヽ /〔 祭 〕〕つ
| | ̄| | |ヽ/l `/二二ヽ
| | |/| |__|/ ∧_∧ / /(_)
| |/| |/ ( ´∀`) (_) ∧_∧
| | |/ // / ^ ̄]゚ (` )
| |/ ゚/ ̄ ̄_ヽ ⊂〔〔 祭 〕
| / /_ノ(_) ┌|___|
|/ (__) (_ノ ヽ ヽ
/ (_)
(´-`).。oO(バスジャックだけはするなよ…)
>>836 二回目は、たんなるコピペ荒らしだ。ネタは時宜を心得てな。
| | | ________________________________________________
| | |_____ΦΦΦΦΦΦΦΦΦΦΦ||ΦΦΦ
| | | ̄ ̄ ̄ /| ||
| | | / /|TTTTTT TTTTTTTTTT||TTTTT
| /\ | /|/|/|^^^^^^ |三三| ^^^^^^^^^^^||^^^^^^^
| / / |// / /|
| / / |_|/|/|/|/|
| / / |文|/ // /
|/ /. _.| ̄|/|/|/ ∧_∧
/|\/ / / |/ / (___)
/| / / /ヽ /〔 祭 〕〕つ
| | ̄| | |ヽ/l `/二二ヽ
| | |/| |__|/ ∧_∧ / /(_)
| |/| |/ ( ´∀`) (_) ∧_∧
| | |/ // / ^ ̄]゚ (` )
| |/ ゚/ ̄ ̄_ヽ ⊂〔〔 祭 〕
| / /_ノ(_) ┌|___|
|/ (__) (_ノ ヽ ヽ
/ (_ )
次スレの予感…
るる
ところで、、Moranってなんだ?
(´-`).。oO(バスジャックだけはするなよ…)
(´-`).。oO( もうMoranわ… )
(´-`).。oO( もうけ…)
(´-`).。oO( Moranは英語みたいだ…)
(´-`).。oO( そうなのか…)
(´-`).。oO( マンコチンコ大好き…)
(´-`).。oO( マンコ好きチンコは自分のだけ大好き…)
(´-`).。oO( おわりなのかよ…)
(´-`).。oO( 次のスレ立てれ…)
(´-`).。oO( 久々にブラウザから書きこみ…)
(´-`).。oO( もうみんなsageようよ… )
(´-`).。oO( もうみんなsageようよ… )
ヴァジャイナ、ピーヌス
856 :
超おそレス:02/01/27 05:27
>>705 バカなことをやってみました。
Cは長い間つかってないので、これで動くか知らん。テストしてない。
#いや、末尾再帰は最適化されるので良いんです(笑
#include <stdio.h>
#define ERROR -1
int data[] = {-1, 1, 2, 3, 4, -1, 5, -1, -1, 6, 7, 8, 9};
int main()
{
int tmp;
tmp = lambda( data , s , sizeof(data) / sizeof(int))
if (tmp != ERROR) { printf("result = %d\n", tmp ); } else { printf "Not Found !\n") }
return 0;
}
lambda(int *dat, int count, int limit)
{
return limit == 0 ? ERROR :
*data == ERROR ? lambda(dat + 1, count, limit-1 ) :
count == 1 ? *data : lambda(dat + 1, count-1, limit-1);
}
857 :
自称電気科の先生:02/01/27 14:04
Q.5の階乗を求めるプログラムをつくりなさい。
858 :
自称電気科の先生:02/01/27 14:06
付け加えです。for文を使用してください。
859 :
オイラー法なんですけど、エラーが出るんです:02/01/27 14:11
#include<stdio.h>
#include<math.h>
double F70(double x,double y);
void EULER(double h,int n,double x0,double y1[],double yy[]);
int main(void)
{
double n,i;
double x0,y0,y1[50],yy[50];
double h,xn;
printf("\n x0=");
scanf("%lf",&x0);
printf(" y0=");
scanf("%lf",&y0);
printf(" xn=");
scanf("%lf",&xn);
printf("n=");
scanf("%d",&n);
h=(xn-x0)/n; y1[0]=yy[0]=y0;
EULER(h,n,x0,y1,yy);
printf("\n");
for(i=0;i<=n;i++)
{
printf("x=%8.5f y=%9.5f ",x0+h*i,y1[i]);
}
return(0);
}
double F70(double x,double y)
{
return(-100*y+100);
}
void EULER(double h,int n,double x0,double y1[],double yy[])
{
int i;
for(i=0; i<=n; i++)
{
y1[i+1]=y1[i]+h*F70(x0+h*i,y1[i]);
yy[i]=exp(x0+h*i)-(x0+h*i)-1;
}
}
861 :
自称電気科の先生:02/01/27 14:19
>860
参考になります。この資料で考えてみます。
862 :
自称電気科の先生:02/01/27 14:25
難しい・・・
基本的なことなんだけど、調べても書いてないのでお聞きします。
main関数と他の関数を別のファイルに分けた場合(それぞれファイル1、ファイル2とする)、
ファイル1で定義したグローバル変数を、ファイル2に書かれた関数で使うことって
できなんですか? エラーが出るもので。
ファイル2にも同じグローバル変数を定義するとコンパイルは通るのですが、
これって二度定義してるようでなんか気持ち悪い…。
>>863 extern 使って「宣言」すればいい。
ふつーは
file1.c
file1.h
file2.c
file2.h
とファイルを作って file1.h, file2.h には file1.c, file2.c のうち公開関数やグローバル
変数に関する「宣言」をまとめて書いておく。で、file1.c, file2.c では file1.h, file2.h
を #include する。
>863
extern を使う。
参照側で extern TYPE VAR;
>>864-866 わ!早い!
exturn ですか。初めて聞いたので調べてみます。ありがとう。
あ、スペルミス。externだった。
870 :
デフォルトの名無しさん:02/01/27 15:59
より効率的なプログラムを書く参考にするために、コンパイラに アセンブリ言語のコードを出力させ、
プログラマがそれを読んで 分析することがある。
この手法の長所と短所を考察せよ。
この問題を教えていただけないでしょうか?
871 :
デフォルトの名無しさん:02/01/27 16:05
長所 暇つぶしになる
短所 面倒くさい
873 :
デフォルトの名無しさん:02/01/27 16:11
70 72 69 6E 74 66 28 22 68 65 6C 6C 6F 2C 77 6F 72 6C 64 21 22 29 3B
asciiでprintf("hello,world!");
を16進数で書くのに1時間もかかった俺って一体・・(;´д`)
>>874 機械語は16進数じゃなくて2進数だろ。
>>874 おいおい
char *p ;
for(p="printf(\"hello, world!\")";*p!='\0';p++)
printf("%X ",*p) ;
ポインタ覚えたての初心者なものですみません。
>>876 の、p="printf(\"hello, world!\")"; のとこって、
勝手にメモリ確保されるんですか?
やってみたらやっぱりちゃんと動きましたが。
>>879 > 勝手にメモリ確保されるんですか?
確保っつーか、文字列リテラルはプログラム起動時からメモリ中に
存在するはず。
>>880 なるほど…そうなんだ。最初に作ってしまってるわけですか。へぇ〜。
882 :
デフォルトの名無しさん:02/01/27 18:26
884 :
デフォルトの名無しさん:02/01/27 19:09
標準入出力のバッファが置かれてるのはカーネル内という認識でよろしいのでしょうか?
また、それはforkで複製されますがプロセスのアドレス空間以外も複製されるという事なのでしょうか?
お願いします。
>>884 否
CのストリームI/O(stdio)を理解せよ。
>>882 よくみると、けっこう俺の好みのタイプかも…
887 :
デフォルトの名無しさん:02/01/27 20:07
/ ̄ ̄ ̄ \
/ / o △o \丶
ノ//ノノハ))))\| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
| | 川 σ σ 川 || < ナス入れてもイイよ
| / 丶 ー ノ \| \_________/
/⌒ - - ⌒\
/⌒\ ・ ・ /⌒\
/ _____\ /____ \
/\/ 、____⊇((゚))⊆_____\/\
/ / \_)*(_/ \ \
|_/ \_
889 :
自称電気科の先生:02/01/27 21:29
>882
ほわかんがぁぁあ!!!(謎
危なそうなのでウィンドウ消しました
何だあれ??ヘンな文字・・・・・
890 :
デフォルトの名無しさん:02/01/27 22:54
>>885 >標準入出力のバッファが置かれてるのはカーネル内という認識でよろしいのでしょうか?
ここが否なのでしょうか?
それならば標準入出力用のバッファもプロセスのアドレス空間内に取られているのでしょうか?
ヒープ領域にでも取られているのでしょうか?
教えてください。それかどの書籍を調べれば良いのか教えてください。お願いします。
キャプチャーして、とりあえず口から垂れてる血を消して。
あと、白目をちゃんと書いて、肌色にして…
あ、やっぱブスだわ、ごめん。
>>890 ルーク、ソースを使え
一般的には
- カーネルに直接アクセスする (read, write システムコール)
- ユーザ空間でキャッシュする (FILE 構造体を使う)
という実装が多いはず。とりあえずデバッガで fread() あたりにブレークポイントをかけて
そのごの挙動を追ってみ。
> ルーク、ソースを使え
ワラタ
ソースの暗黒面は何だろう…
gotoとか処理系依存のコードか?
ちょいとお聞きします。
fopenとかで読み込んだファイルのサイズを調べることってできますか?
fseekで末尾まで跳んで、ftell。
>>895 long が 32bit の環境で 2GB 以上のファイルだとマズー。
897 :
デフォルトの名無しさん:02/01/28 05:38
ある数字を標準入力から入力させて、その要素番号の配列の中身を表示させたいんですが、
文字配列buf[64]を用意してfgets(temp)してからsscanf(temp,"%d", i)として
ある配列sample[i]を表示させようとするとうまくいきません。
これは多分fgetsしたときにint型としてbuf[]に入っていないからだと思うのですが、
よい対策方法はありませんか?
また、このような数字を取得する方法についてもっとよいものがあったら教えてください。
>897
sscanf(temp,"%d", &i)ではないのか?
>896
_filenoをつかって、_lseeki64と_ltelli64で、かえ?
>>898 ああ、&iにしてませんでした。。なんと初歩的なミスを。逝ってきます。
というかバッファ名がtempとbufでごちゃまぜになってますね。どっちかで統一してください(汗)
…鬱だ。
900 :
デフォルトの名無しさん:02/01/28 15:41
char arr[]="foo"
とした時、
(arr == &arr[0]) && (arr == &arr)
が成り立ちます(VC6Pro, Cygwinで確認)。
前者の比較が真と評価されるのは当然ですが
後者のが真になる(それ以前にコンパイルが通る)理由がわかりません。
&arrは文法的にどう解釈されるのでしょう?
配列の先頭、って意味じゃ、ないのかな?
オブジェクトって言葉は使い慣れないんだけど、
配列arrは一つのオブジェクト、arr[0]は一文字の
オブジェクト、とかそーゆー感じじゃないのかな。
ちょっと言葉足らずかな。
>>900 > &arrは文法的にどう解釈されるのでしょう?
このポインターはarrへのポインターで配列の最初の要素を指す。
要するに&arr == &arr[0] == arr
>>894 通常は
>>895の方法で十分だろうね。
<sys/stat.h>と<sys/types.h>があればstat()を使った方がいいかも。
904 :
デフォルトの名無しさん:02/01/28 18:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HSIZE 10
/* slist構造体とSLISTを定義する */
typedef struct slist{
char *pkey;
char *pchar;
struct slist *next;
}SLIST;
/* ハッシュテーブル */
SLIST *htable[HSIZE];
/* ハッシュ関数 */
unsigned long Hash(char *pch)
{
/* 種としてアドレス値を与える */
srand((unsigned int)pch);
/* rand()を使って擬似乱数を生成する */
return (unsigned long)(rand() % HSIZE);
}
/* ハッシュテーブルを作成する関数 */
void RegisterHashTable(char *pch1, char *pch2)
{
SLIST *lpnew, *lptemp;l
unsigned long h = Hash(pch1);
/* 新しいリスト要素を生成する */
lpnew = (SLIST *)malloc(sizeof(SLIST));
if(lpnew == NULL){
/* stderrにエラー文字列を出力する */
fprintf(stderr, "メモリエラー\n");
/* exit()関数を使って実行を終了する */
exit(1);
}
/* 新しい要素に値を代入する */
lpnew->pkey = pch1;
lpnew->pchar = pch2;
/* 自分自身とする */
lpnew->next = lpnew;
/* 未登録のケース */
if(htable[h] == NULL)
/* ハッシュテーブルに登録する */
htable[h] = lpnew;
else
{
lptemp = htable[h];
while(lptemp->next != lptemp)<--------------ここはどういううこと?
lptemp = lptemp->next;
/* リンクする */
lptemp->next = lpnew;
}
}
>>904 > while(lptemp->next != lptemp)<--------------ここはどういううこと?
リストの最後まで繰りかえす。
8行ほど前で
> /* 自分自身とする */
> lpnew->next = lpnew;
とデータの最後を自分自身と定義しているので、これが終わりの印となる。
もっと詳しい情報が知りたい場合、
「循環リスト」を検索キーワードとすると良い
906 :
デフォルトの名無しさん:02/01/28 18:19
>904 *nextが自分自身ってことは、そこでリンクが終わってるんだろ。
そのnextがnextじゃないのはリンクされてるからだ。
だからリンクをたどってて、最後のnextにmallocで確保したのをリンクしてるんだろ。
907 :
デフォルトの名無しさん:02/01/28 18:21
906のは正しい?
>>907は質問者か?
マルチポストした上に“正しい?”ってのは随分な態度ですね?
>905
それのどのあたりが循環リスト?
単に終端子がNULLでなく、thisなだけやないかと。
>>907 正しい。めっちゃめちゃ正しいですが、何か?
>>909 あ、そういえば、たしかに hoge->next == NULL で お尻なのではない
(自分自身を指すと お尻である、と定義する) リストの実装って
ほとんど見たことがなかったよ…。
912 :
デフォルトの名無しさん:02/01/28 18:40
循環してないぞ! 単方向リストですやん
>>909 スマン、間違えた
以下の認識で合ってる?
循環リスト
□→□→□→□→□→□→□
↑ │
└───────────┘
終端子がthis(904のリスト構造)
# ところでこれって何かメリットあるの?
□→□→□→□→□→□→□─┐
↑ │
└─┘
914 :
デフォルトの名無しさん:02/01/28 18:47
ん?俺はリスト構造なんか勉強したことないけど
知らない間にほげ->next=NULLが終わりだとして
「これがリスト構造ってやつだな」って思ってつかってたぞ。
オブジェクト指向も言葉の意味がちんぷんかんぷんだったけど、
今では何気にオブジェクト使ってるぞ。クラスの使い方も
わかったぞ!最初はグローバル変数で管理してたけどな!
ごるぁーーー
915 :
デフォルトの名無しさん:02/01/28 18:48
HSIZEが10やのに、hをlongで確保するんかい!
無限ループに陥るといやだから循環リストは使わない。
メリットっていったってどっちもどっちでしょ?
あぁ、思いっきりズレてる...
ちょっとモナ板に逝って練習してくる。
完全にズレは消せていないけど...
1)循環リスト
□→□→□→□→□→□→□
↑ │
└───────────┘
2)終端子がthis
□→□→□→□→□→□→□─┐
.↑ │
.└─┘
3)終端子がNULL
□→□→□→□→□→□→□→NULL
普通は単方向リストの場合、3)が使われると思うけど、
2)を使う理由が知りたいです。
1)と2), 3)の違いは
>>916で理解しました。
アクセス違反を起こさないようにするためとかですか?
(見物人)
>>918 違いなんてあるの?
終端を識別するのにNULLポインタ(無効なアドレス値)を使用するか、
自分自身(意味的に無効な値)を使用するか、趣味の問題では?
# 積極的な理由があるのなら、私も知りたいデス…
最後がNULLだと、a->b->…のbを削除するとき、a.next=b.next; free(b);で済むのに、
2)だと判定が1こ必要になるなぁ、なにかメリットあるんだろうか…
0にするかNULLにするか、はたまたNULにするか'\0'にするか、悩まなくて済む(w
>アクセス違反を起こさないようにするためとかですか?
NULLでアクセス違反を起こすようなコードは、
むしろ、さっさと起こして貰った方が健全かと。
924 :
デフォルトの名無しさん:02/01/28 22:10
>>902 &arrと&arr[0]では、型が違うんではないの。
925 :
デフォルトの名無しさん:02/01/28 22:17
arrと&arr[0]はいっしょだけどね
配列についてはarrと&arrは同じ値をかえす。
arrはポインタと書式を一致させるために付け加えられた文法
>>925 ちがう。arrはchar[4]、&arr[0]はchar*。値を評価するときにchar[4]がchar*
にpromoteされるというだけ。
sizeof 使ってみれば違うのが解かるよ。
929 :
デフォルトの名無しさん:02/01/29 01:42
ポインタに代入されるアドレスは一緒じゃないの?
arrと&arr[0]って、、、本には書いてあったのに??
柏原正三に ゆーてんか!
930 :
デフォルトの名無しさん:02/01/29 01:46
sizeofって、、配列の型によってかわるやないけ〜
arrは
・sizeof と 単項& のオペランドになるときは、char[4]
・それ以外は char* const
として扱われるんだった気がする。
もう一通りくらい配列扱いになる場合があったかも。
VC(C++)だとこうなった
void foo()
{
char arr[4];
struct{int n;}n;
n = arr;
n = &arr;
n = &arr[0];
}
コンパイル中...
test.cpp
c:\test\test.cpp(6) : error C2679: 二項演算子 '=' : 型 'char [4]' の右オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照)
c:\test\test.cpp(7) : error C2679: 二項演算子 '=' : 型 'char (*)[4]' の右オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照)
c:\test\test.cpp(8) : error C2679: 二項演算子 '=' : 型 'char *' の右オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照)
cl.exe の実行エラー
エラーだしてコンパイラに型を教えてもらうのか。
それ、もらった。
char *hogehoge="hogehoge";
char *hugahuga=malloc(sizeof(char)*24);
strcpy(hugahuga,"hugahuga");
で
hogehoge と hugahugaの違いはなんだ?
なんでhogehogeはfreeしなくていいの?
malloc()したもんじゃないから。
違いはなんだ
malloc()したものかどうか
"hogehoge"は文字列定数、プロセスが起動して終了するまでの間ReadOnlyなメモリ空間に存在する。
malloc()が返すポインタはヒープ領域に確保されたメモリブロックの先頭アドレス。
free()にこのポインタを渡す事でメモリブロックは解放され、以降プロセス内で再利用できる。
少し本やマニュアル読めば分かる事聞いてんなよ、バァーカ。
おめぇはプログラムの前に日本語を学べ、バァーカ。
違いは、指している領域の種類。
free()すべきなのは動的に確保した領域のみ。
ちなみに malloc() して strcpy()、なんてダルイことをせずに、
strdup() または _strdup() を使え。
>>937 細かいことは気にすんな。
いつか分かるよ。
どうしても気になるなら、アセンブラでもやってみ。
>>941 いや、アセンブラやるよりもライブラリのソース読むほうが。
>"hogehoge"は文字列定数、プロセスが起動して終了するまでの間ReadOnlyなメモリ空間に存在する。
そうとは限らん
ReadOnlyである必要はないって? まあそれはそうだが書き込み可能であること
を期待すべきではないっつーのは確かだろ。
それはOS次第だな。言語仕様的にはまずいが
なんてーか、主語をハッキリさせず独断的な言葉を繋ぐ口調から
日下部某を連想するのは私だけでしょうか?
>>940 C99ではstrdupが標準関数に追加されていますか?
inline char* strdup(const char* p){ return strcpy(malloc(strlen(p)+1),p); }
mallocがNULL返すとコア吐くのは仕様ですか?
C99 に strdup は無い。「または _strdup()」これ重要。
主要な処理系(組み込み除く)のライブラリは strdup/_strdup を
用意しているので、現実には困らん。
なくても実装は簡単だしね。
>>950 んー。でも、そーすると1行で書けなくなるんよね・・・
malloc は NULL を返さないという前提の元でよろしく。富豪的プログラミング万歳。
>>953 それは富豪的プログラミングではなく、単なる手抜きだ。
ありがとう、おかげでレポートの間に合いました。
956 :
ウルトラハッカー 日下部陽一:02/01/30 09:03
上げちゃった。ミスだ。