2 :
2 :2005/09/17(土) 00:40:46
2
3 :
デフォルトの名無しさん :2005/09/17(土) 00:41:22
5 :
デフォルトの名無しさん :2005/09/17(土) 01:19:21
C++のSTLのListやMapといったものをCで書くとどういった風になりますか?
無理矢理書くなら、マクロでテンプレートっぽいのを実現できなくもない。
そういえば、昔のtemplateが無い頃のC++には generic.hというものがあったそうな。 今でもTurboC++を落とせば手にはいるでしょう。 Cで使えるかはわからんけど。
struct Node { struct Node* prev; struct Node* next; FooType val; }; って構造体を定義して、とか言うレベルの話でないの? Mapはただの2分探索木(VC++の奴の場合)だから1次元配列でも実現できるし
いや、set/mapは厳密に要件を満たすのは結構むずかしいよ。 単純な2分木だと、最悪条件ができる可能性があって、 STLのset/mapはそれを許さないから。 で、結局どの実装も赤黒木になってると思った。
10 :
デフォルトの名無しさん :2005/09/17(土) 09:29:09
C!!!!!!!!!!
>>9 べつにそれは、言語関係ないだろ。
Cで実現するためのテクニックの話じゃねーの?
struct ListNode_ { struct ListNode_* prev; struct ListNode_* next; char value[1]; /* 可変長 */ }; として、リストの関数内ではこれで扱ってるフリをし、 外では struct ListNodeInt { struct ListNodeInt* prev; struct ListNodeInt* next; int value; }; とかを使うってのもできないこともない。 ただ、色々と型チェックできないのが欠点。 俺は、多少気持悪くても、テンプレート紛いのマクロの方が好きかな。
前スレ1000は\nを入れ忘れ
puts 使えよ。
1000GET1001 名前: 1001 投稿日: Over 1000 Thread
へぇ、gcc で サイズ0の配列使えるのは知ってたが、これはしらんかった。
>>16 んなもん知っとるわ。
C89 も考慮して 1 を書いたんじゃ。
あと、そのページでは 1 引いてるけど、
offsetof(ListNode_, value) + sizeof (int) * num
のようにしたんでも構わない。
大阪人は死ね
20 :
デフォルトの名無しさん :2005/09/17(土) 17:00:37
>>16 んなもん知っとるわ。
C89 も考慮して 1 を書いたんじゃ。
あと、そのページでは 1 引いてるけど、
offsetof(ListNode_, value) + sizeof (int) * num
のようにしたんでも構わない。
21 :
デフォルトの名無しさん :2005/09/17(土) 17:11:23
しつこいようだが… 前スレの >981 >realloc(0, size); realloc(p, 0); とかって書いてる奴は馬鹿。 それって結局名前と固定観念の問題だろうよ? alloc(0,size);alloc(p,size);alloc(p,0); と普通に書いてて、敢えてmallocやfreeなんて 余分な関数を使う奴が居るかねぇ?
お前がめんどくさがりなのは分かったが、 reallocはreallocであってallocでは無い。 名前と固定観念と言うが、 文脈を考えたらそれぞれを利用するのは当然だろ。 とりあえず、お前の書いたソースは、 人に見せられるような物ではないことも分かったからいいや。
何をイチャついておる
俺こんな関数作った。 void god(void* info, void* res, ...); info に何をしたいかに関する情報を入れて、 第3引数以降はそれに対応する引数を書けば、 res に答えが返ってくるんだ。 この関数1つで何でもできるように作ってあるから、 常にこの関数を使えばいいよね! これ普通に使ってるから、 他の関数を使う奴なんていないよねぇ? ってのがナンセンスなのと同じようなことだな。
#include <stdio.h> #include <stdlib.h> #include <string.h> struct student { char number[20]; char name[20]; char shumi[20]; }; int main(int argc, char *argv[]){ int i, n=256, j=0, k=1; FILE *fp; char name[20]; char number[20]; char koumoku[20]; char s[201]; char word[200][200]; char *p1; char *p; struct student seito[100]; if(argc <= 1) return 1; if(strcmp(argv[1], "data")==0) printf("file name:%s\n", argv[2]); つづく。
終わり
fp = fopen(argv[2], "r"); if(fp==NULL) return(0); while(!(feof(fp))){ fgets(s, 20, fp); p=s; i=0; while(1){ p1=word[i]; while(!(*p==','||*p=='.')){ *p1=*p; p1++; p++; } i++; *p1='\0'; if(*p=='.') break; p++; } strcpy(seito[j].number, word[0]); strcpy(seito[j].name, word[1]); strcpy(seito[j].shumi, word[2]); j++; } fclose(fp); つづく。
uzeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
while(k > 0){ printf("調べたい項目を入力して下さい(number or name or shumi or end):"); scanf("%s",koumoku); if(strcmp(koumoku, "number")==0) while (k > 0) { printf("名前を入力して下さい。(終了はend入力)"); scanf("%s", name); k = strcmp(name, "end"); if (k != 0) { for (j = 0; j < n && k != 0; j++) { k = strcmp(name, seito[j].name); if (k == 0) printf("学籍番号は %s\n", seito[j].number); } if (k != 0) printf("見つかりません\n"); k = 1; } } else if(strcmp(koumoku, "name")==0) while (k > 0) { printf("学籍番号を入力して下さい。(終了はend入力)"); scanf("%s", number); k = strcmp(number, "end"); if (k != 0) { つづく。
本当に終わり
for (j = 0; j < n && k != 0; j++) { k = strcmp(number, seito[j].number); if (k == 0) printf("名前は %s\n", seito[j].name); } if (k != 0) printf("見つかりません\n"); k = 1; } } else if(strcmp(koumoku, "shumi")==0) while (k > 0) { printf("名前を入力して下さい。(終了はend入力)"); scanf("%s", name); k = strcmp(name, "end"); if (k != 0) { for (j = 0; j < n && k != 0; j++){ k = strcmp(name, seito[j].name); if (k == 0) printf("趣味は %s\n", seito[j].shumi); } if (k != 0) printf("見つかりません\n"); k = 1; } } else if(strcmp(koumoku, "end")==0) k = 0; }return 0; } これってどうなの?
>>31 で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?
で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?
で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?
で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?
で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?
>>24 極端に言えばそういうことだわな。
ってかオマエオモシロスwwwww
引数を初心者にわかりやすく説明できる人いる?
いらない。
37 :
デフォルトの名無しさん :2005/09/17(土) 19:02:57
>24 >俺こんな関数作った。 >void god(void* info, void* res, ...); reallocもmallocとfreeの関数ポインタを使って 定義可能だよね? そういった意味では高階関数かもしれない。 >22 >お前がめんどくさがりなのは分かったが Lazyじゃないとプログラマじゃないんだろう? >文脈を考えたらそれぞれを利用するのは当然だろ。 それが頭が固いって言っている訳です。 常に既存文脈自体を疑わないと言語は進歩しない。 そんな頭が固い人が、えてして 「おい!おい!alloc一つで済んでる文脈に なんでmallocとかfreeとかをわざわざ持ち込む 必要があるんだぁ???」 と叫ぶんじゃないでしょうか? つまり何が効率的か?ではなくて 既存の文脈から「しか」判断出来ないように なってはいないでしょうか?
>>37 > Lazyじゃないとプログラマじゃないんだろう?
楽をするための努力は惜しまないのがプログラマ。
あらゆる点で怠惰なだけなのはタダのバカ。
> 常に既存文脈自体を疑わないと言語は進歩しない。
言語を進歩させるためにプログラム書いてるんじゃない。
ちゃんと動作して、動くものを作り、
また、場合によってはそのソースを
他人に引き渡すことも考えてプログラムを書くものだ。
自分世界に引きこもって自分言語で書いていいのは日用プログラマだけ。
39 :
デフォルトの名無しさん :2005/09/17(土) 20:06:12
>>31 何がどうなんだよ
C勉強する前に日本語勉強してこい
>>37 天才が故に既存の文脈を疑いすぎて、
自分しか理解できないコードを書くタイプ。
言語の進化自体は、意思を対象に分かりやすく伝える方向で、
進化するもんじゃないのかねぇ。
まぁ本人は分かり易いと思ってるのかもしれないけど。
俺みたいな低脳プログラマは可読性の高い方を支持させてもらうよ。
test
42 :
デフォルトの名無しさん :2005/09/17(土) 21:04:58
演習1-10 各タブを\tに、各バックスペースを\bに、各バックスラッシュを\\に置き換えながら、 入力を出力に複写するプログラムを書け。 こうすれば、タブとバックスペースははっきり目に見えるようになる。 K&Rの問題ですけど、\bをgetchar()で入力確認って出来るんですか? もしかしてUNIXとかならOKってことですか?
\rが前についてたりするんじゃねぇの?
環境依存な悪寒。
>>1 そのK&Rの演習問題の回答は何処にありますか?
int c; while ( (c = getchar) != EOF ) { switch( c ) { case '\b': printf("\\b"); break; case '\t': printf("\\t"); break; default: putchar( c ); } } 実際の動作は別にして、騙し騙しコードを書く知恵も必要です。
>>31 コメントも無い、インデントも入ってない、処理の説明すらない
そんなソースを出されて、ただ一言「これってどうなの?」
質問の意味がわからんし、ソース読む気にもならんし。
お前の頭の方こそ「どうなの?」って聞き返したくなるわい
>>46 > 各バックスラッシュを\\に置き換えながら、
がないぞ。
int c; while ( (c = getchar) != EOF ) { switch( c ) { case '\b': printf("\\b"); break; case '\t': printf("\\t"); break; case '\\': printf("\\\\"); break; default: putchar( c ); } } すまそ
50 :
デフォルトの名無しさん :2005/09/17(土) 22:49:02
こういうコードを書くとメモリを無駄遣いした気になって幸せになります。 #include<stdio.h> #include<string.h> int main(){ int i; char t[256][3]; for(i=0;i<256;++i)sprintf(t[i],"%c",i); strcpy(t['\b'],"\\b"); strcpy(t['\t'],"\\t"); strcpy(t['\\'],"\\\\"); while((i=getchar())!= EOF) fputs(t[i],stdout); }
>>49 それ以前に、getchar って何もんだ?
>51 char が signed だと...
54 :
53 :2005/09/17(土) 22:55:10
...別にどうってことないか。
おいおい!!
>>52 ごめん、関数コールだったorz
Ruby厨だから違和感感じなかった
>>51 なんかかっこええ。
実用的じゃないとはいえそういうのも思いついときたいな。
58 :
51 :2005/09/17(土) 23:17:26
本当に細かいことだけど、nul文字の表示ができんかった。 ×fputs(t[i],stdout); ○fwrite(t[i],1,2-!t[i][1],stdout); ま、コンソールに出すのには問題ないから別に良いか
引数の具体的な例での説明などのあるサイト教えてください。 いろいろ回ったんですが、ぱっとしない内容ばかりで。。。 「プログラミング言語で関数やメソッドを呼び出す際に、その関数やメソッドを実行するために渡さなければならない値のこと。」 っていう答えばかり。
具体例だろ? んなら、 int main(int argc, char **argv) はい、具体例。
引数を渡す、返す、などのイメージがわかなくて困っています。
void func(int hikisuu) { printf("%d\n", hikisuu); } int main(void) { func(10); }
63 :
59 :2005/09/17(土) 23:36:13
>>62 なるほど、
int main(void) {
func(10);
っていうのが、引数を返すって事なんですか?
で、
引数を設定してるのが、
void func(int hikisuu) {
printf("%d\n", hikisuu);
}
って事ですかね。
設定なんて俺様用語使うなよ。
65 :
59 :2005/09/17(土) 23:45:13
あれ、逆かな。 混乱してきた。
引数を返すという言葉は少し語弊がありませんか。 function (arg1, arg2) ; などと呼び出していることが引数を渡していて、貴方方の言っている引数を返すという行為は 関数内部におけるreturn文の実行のことではないですか? int function { ... return [値] ; }
引数って言葉に騙されているだけだな。 関数に渡す変数の値、て覚えときゃ十分。 また、関数は通常は1つの値しか返せないので、2つ以上返す場合は ポインタ変数で渡す必要がある。 a = 4; b = 7; x = sum(a,b); // x = 7 int sum(int a,int b) { return a+b; } swap(&a,&b); // aとbの値を交換する。 void swap(int *p,int *q) { int tmp = *p; *p = *q; *q = tmp; } うえの2つの違いが分かったらポインタも同時にばっちしです。
68 :
デフォルトの名無しさん :2005/09/18(日) 00:00:04
#include <iostream> using namespace int main std; () [ cout<
69 :
デフォルトの名無しさん :2005/09/18(日) 00:00:44
ごめん まちがえた。すまそ。↑
70 :
59 :2005/09/18(日) 00:02:26
>>66 なるほど、確かにそうですね。
って事は、
void func(int hikisuu)
int main(void) {
func(10);
}
void func1(int hikisuu) {
printf("%d\n", hikisuu);
}
ってやると引数の関係がわかりやすいですね。
こうなると、なんで"hikisuu"が引数の意味になるんですかね?
なんとなく、"10"っていう数字が引数に見えちゃう。
「引数の関係」てなんだよ。 勝手な用語を作るなよ。
72 :
59 :2005/09/18(日) 00:07:12
>>67 値を返すっていうのはなぜ必要なのでしょうか?
返さないとなにか不都合が生じてしまうんですかね。
>>72 返さなきゃならないときにそういう方法をとるって意味だ、ボケ。
返さなくてもいいし、返さなきゃ不都合が起きるときに返すんだよ。アホか。
74 :
59 :2005/09/18(日) 00:09:42
75 :
59 :2005/09/18(日) 00:10:41
今日は変な粘着がいるので明日またおいで。 ちゃんと初心者の本でも読み返した後で、だけど。 言葉なんてどうでもいいから、自分で足し算ゲームでも作って見るのが 一番の上達の近道だ。
77 :
59 :2005/09/18(日) 00:15:32
>>76 まだまだ初心者だけど、今も本見ながら頑張ってるんで、よろしくお願いします。
もうすぐ、Cでコンパイラを開発しないといけないんですが、どんな事するんですかねー。
コンパイラとか開発された方いますか?
>>77 コンパイラ・スクリプトエンジンのスレを一度見れ。
79 :
引数とはこういうもの :2005/09/18(日) 01:10:42
*基本・・・関数(第1引数、第2引数、・・・・); 例・・・ strcmp( str, "aaa"); この場合第1引数がstr 第2引数が文字列"aaa" 戻り値・・・ return (戻り値); 例・・・ return (0); この場合戻り値は0 *実例 int main(void); //引数がvoidの場合は引数なしと同じ { char str[255]; int rc; //エラー判定用の変数 scanf("%s",str); //配列strに文字を入れる if ((rc = strcmp( str, "aaa")) == 0 ) { //配列strの値がaaaかどうかを判断して、戻り値をrcに格納 printf("aaaを入力しやがったなテメー!!!\n"); //↑の戻り値が0の場合はこの処理をする } else { printf("aaaを入力しろよボケ!!!\n"); } return 0; //returnは()を省略できる } strcmpは実際以下の処理をしている 渡された第1引数と第2引数の値を比べる 等しい場合はreturn 0;で戻り値を0で返す、すると↑のソースで rc に0が入ることになる 等しくない場合は大きさを見て0以外の負の値もしくは正の値をreturnで返している
returnは()を省略できる よくこうゆう嘘を見かけるんだが "(つけても意味がないが)つける事ができる" が正解
>80 そんな事より >引数がvoidの場合は引数なしと同じ どーよw
void *p ; void f (void) ; さんしゅるいのぼいどおー
83 :
デフォルトの名無しさん :2005/09/18(日) 01:23:49
>>80 >>81 returnに関しては初耳だな、てか今まで気にしてもいなかったが、考えてみると納得
まあ初心者に説明してるんだから、ざっくりでいいかなって
細かく説明しすぎるとまたこんがらがるし
84 :
デフォルトの名無しさん :2005/09/18(日) 01:25:37
Windosで共有されたフォルダに対してFindFirstFile()使ったら 時々「指定されたネットワーク名は利用できません」が出るんですが・・・ 一応エクスプローラーでは認識してるし、DirもOK。 (ネットワーク系のエラーは・・・多分無いはず) ただそのフォルダには10万以上のファイルが存在してるんだけど・・・ (ローカルだと問題なし) このファイル数が影響してるんですかね? OSはWin2000Serv同士です。 もし原因知ってる方がいましたら教えてください。
だったらウソ説明しないほうがマシだ
87 :
84 :2005/09/18(日) 01:28:16
いやC言語として使っているので・・・
88 :
デフォルトの名無しさん :2005/09/18(日) 01:28:56
>>85 では初心者にも分かりやすいように簡素に説明してくださいよ、お代官様
91 :
84 :2005/09/18(日) 01:30:57
>>89 知らないなら無理にレス付けなくてもいいよ。
92 :
デフォルトの名無しさん :2005/09/18(日) 01:31:06
>>90 まあいいや
つかvoidを引数として使う場合って引数なしと同じでいいんじゃん
void は引数としてつかえない。
急速にスレの質が低下してまいりました
>>79 すっごいわかりやすいです!
ありがとうございます、テキストファイルに保存しておきましたw
こうみると、引数って言葉をしらなくても、知らない間にプログラム組む時に
使ってるんですねー。
けど、これでよりプログラムを組みやすくなったと思います。
ありがとうございます。
>>80 なるほどって感じです。
鵜呑みにするな!!!
voidってのは引数として使ってるんじゃなくて、引数としては使えないんですよね? と言う事は、voidとすることの意味は何なんですか?
98 :
デフォルトの名無しさん :2005/09/18(日) 01:37:33
>>93 それこそウソじゃん?
使えんわけないじゃんか
※ 関数は一般に引数によって値を受け取り、returnで返却値を返すものですが、
中には引数が必要無い関数や返却値の無い関数も存在します。
そのような場合、「引数が無い」ことや「return値が無い」ことを
明示するために「void」は用いられます。
ぐぐったぞ
100 :
デフォルトの名無しさん :2005/09/18(日) 01:39:27
>>97 main(void) == main()
101 :
デフォルトの名無しさん :2005/09/18(日) 01:45:48
aaaaaaa 解釈の違いだ voidが引数として使えないって言ってるのって、 呼ばれたほうの関数に引数として渡らないってことだな? 俺は記述として引数と同じ記述のことを言ってたわ まあいいや どうでもいいよ 電池キレタ 送ってくれよ
103 :
デフォルトの名無しさん :2005/09/18(日) 01:50:19
>>102 別に気にしてない
プログラムはおまえのほうが上でも
俺のほうがイケメンだから気にしない
y = sin(x) 引数に 60゚ を入れると 1/2 が戻り値として返ってくる これでいいんじゃまいか 最初の理解は
「Cの掟」 っていう本すごいいいっすね。
(√3)/2 でした^^^^^^^^
だから、使うとかあいまいな言い方するから荒れるんだよ。 宣言とか定義とか、正しく用語は使え。
c言語ってどうやって作ればいいのでしょうか。。。。
もうできるから。 新規格の策定になら参加できるかもしれないけどな。
110 :
デフォルトの名無しさん :2005/09/18(日) 02:26:13
>>107 すんません伍長殿
自分独学っすから宣言と定義以外で正しい用語とか知りません
>>110 そういうやつは、他人に教えようとするな。
113 :
デフォルトの名無しさん :2005/09/18(日) 02:36:13
>>108 パソコンと2チャンを用意する
聞きたい事を2チャンに書く
返事を待つ
114 :
デフォルトの名無しさん :2005/09/18(日) 02:54:35
>>59 C言語の規格なんて長い時間かけてあちこち変更されて
きたものなので「何故どうして」を考えても無駄。
そういうものだと暗記しろ。
118 :
デフォルトの名無しさん :2005/09/18(日) 07:52:50
test
testだぁ? このスレッドで「test」って何だ、「test」って。 おいおいおいおいおい
D&Dしたファイルの名前を取得するにはどうしたらいいでしょうか?
123 :
デフォルトの名無しさん :2005/09/18(日) 10:03:03
初心者ですみません。 コンパイルしようとしたら can't open:stdio.h :No such file or directory とでます。 いままでコンパイルできたファイルもこれでできまくなりました。 もしかしたら環境変数を下手にいじくりまわしたせいなのでしょうか。 もしよかったら教えてください。
> もしかしたら環境変数を下手にいじくりまわしたせいなのでしょうか。
そうかもね。
>もしよかったら教えてください。
個々のコンパイラや開発環境の話はスレ違いです。
もちろん
>>120 などもスレ違いです。
125 :
120 :2005/09/18(日) 10:54:30
えっと、argv[1]での取得はディレクトリも含まれるんですけど、ファイル名だけってのは取得方法あるんでしょうか?
127 :
120 :2005/09/18(日) 11:09:09
"ディレクトリ名\あいうえお.txt" ってファイルをstrlenで文字数取得して、拡張子とピリオドの分減らして strlen(argv[1]) - 4 ってやったらファイル名が文字化けしちゃって・・ ドコが間違ってるのかわかんない
>>127 スレ違いと言われても尚居座っているお前が判らない。
初心者スレ辺りでコードを晒せば誰か答えてくれるんでない?
>>127 ポインタと変数が分かってないでしょ。
先頭アドレス(ポインタ)+文字列の長さ(拡張子分差し引き)
ってやってる?
>>127 この質問の仕方を見るに Windows 使いと判断する。
このスレ的には strcpy, strtok, strrchr, strncpy あたりを駆使としか言えないが、
環境依存でいいなら _splitpath という選択肢もある。
ただ、Windows で D&D して得られるファイル名は
短縮形(例えば あほばかまぬけ.txt → あほば~1.txt)な点に注意。
これ以上の話は自分で調べて、
分かんなかったら Win32API質問箱 スレで聞け。
133 :
120 :2005/09/18(日) 12:06:03
>>128 ごめん、慌ててログみたがスレ違いとは言われてないような・・いわれてたらすぐ去ってました(汗
とりあえず去ります、失礼しました
>>132 お前は相手にされなくても居座ってるようだけどなwww
135 :
120 :2005/09/18(日) 12:07:30
ぉ、いわれてた・・・orz
136 :
デフォルトの名無しさん :2005/09/18(日) 12:16:17
>>124 てめぇじゃわかんねーってことか。
わかんねーくせに下手にでしゃべってんじゃねぞぼけ
>>131 >ただ、Windows で D&D して得られるファイル名は短縮形
95、98はそうだったと思うけど、
NT、XPでは長いファイル名そのまま。
138 :
デフォルトの名無しさん :2005/09/18(日) 12:23:59
こんにちは、教えてください。 テキストファイルの1行だけを削除することは、できるのでしょうか。
できる
140 :
デフォルトの名無しさん :2005/09/18(日) 12:39:09
どうすれば
1.ファイル開く。 2.テンポラリファイルも開く。 3.ファイルから、テンポラリファイルへデータをコピーする。 4.削除したい行はコピーせずに飛ばす。 5.残りを全部コピーする。 6.両方ファイルをクローズ。 7.テンポラリから、元のファイルへ、ファイル全体を上書き。 おわり。
1.ファイル開く。 2.ファイルないデータを全部メモリ上へ読み込み。 3.ファイル閉じる。 4.同じファイルを上書きモードでオープン。 5.削除したい行以外を全部書き込む。 6.ファイル閉じる。 こうすればテンポラリいらんわ。
まあ乱暴ね。 メモリに全部読み込めないテキストファイルなんてない ならばそれでも良いのかしら
>>105 あー自分もそれで成績伸びたよー。良い本ですよね。
その後は先生が良書だって言ってたポインタ本で勉強してる。
いま猛勉強中なんですか?
頑張って下さい、お互い頑張りましょう。^^
145 :
デフォルトの名無しさん :2005/09/18(日) 13:13:38
C言語の成績・・・専門学校か???
147 :
デフォルトの名無しさん :2005/09/18(日) 13:22:34
構造体のリストを出力する関数を書くとします (1)最初はこう書いてた void get_foolist(int *count, struct foo **list); (2)なんか汚いなあと思い始めて、こうしてみた struct foolist { int nelem; struct foo **list; }; struct foolist *get_foolist(void); (3)しばらくして、あれ?これでいいんじゃないの?と思った struct foo get_foolist(void); 私の少ない経験では(3)の方法を使っているプログラムを 見たことがないのですが、何か致命的な欠点でも あるんでしょうか?
>>114 そうですね、そういう感じがします。
とりあえず、俺は興味のある事に対して、どうしてそうなるのかっていう
考えを必ずしてしますので、覚えるべき所とそうでない所を割り切って、
勉強してりこうと思います。
>>144 ですよねー、基本中の基本っていいながら、スルーされがちな所をしっ
かりおさえてるから、自分に足りなかったとこと補える感じでいいです。
ポインタの本というのは、「C言語ポインタ完全制覇 」ってやつですか?
俺もこれよさそうとおもってたんですが、内容はポインタの事だけなん
ですかね?
>>149 上書きでオープンするとサイズ0でしょ?
>>147 まず関数内でソースを開き、取得データも領域を準備しておかなければならなくなる。
3の戻りが関数内でアロケートしたメモリのアドレスを返すならそれでいけるが、
いろいろ制限がある。
すべて決めうちになるのは関数の再利用性がない。
もちろん、レジストリとか共通で利用するデータを使うならそれでいいが。
それかグローバル変数とかに格納すれば決めうちにはならなくなるが、
それだと関数の独立性がなくなり、複雑になると管理できなくなる。
>>151 ディスク使ってるのが自分だけと思うな
エラー出たから消えました、と、エラー出たから更新できませんでしたじゃあ
被害の度合いが全然違うだろ
誰だ俺のディスクを使ってるのは!
俺俺、俺だよ俺。
if文とかの条件式の型って、何でもいいの? よく本には「0が偽で、0以外が真」と説明されてるけど、 int型とか、unsined型とか、ポインタ型とか、float型とか、 特に変換とかかからず、個別の型ごとに判別されてるのですか? C++みたいに、bool型に変換されてから判別されるみたいな 感じとは違うの?
>>152 自分だけだとしても、途中でエラーになったら
トランザクションを復帰できない >142 は
危険ですな。
まあ
>>141 も、折角だから
7. 元ファイルを一時的な別の名前に変更
8. 新ファイルを元ファイルの名前に変更
9. 元ファイルを削除。
までやって欲しいところ。
(システムによっては unlink/link が適切か)
>>152 そうか。
ポインタだけ先頭に戻して、最後は消せばいいんだな。
消し方知らないけど。
>>156 そのやり方はファイルをロックしておかないと。
>>155 実際なんでもいい。
ただfloatはだめだろ。
>>147 戻り値はポインタじゃないと、リストの先頭部分が解放できなくなる。
あと、リストを作るなら、リストサイズも返して欲しいところ。
戻り値が0なら失敗、それ以外なら成功という感じで成否判定にも使えるし。
(ポインタがNULLかどうかを見てもいいんだけどね)
>>159 もしかして最初の一件を値で返し、2件目以降はそのつどメモリ割り当てなわけですか?
それだと最初の一件目は開放しなくていいわけですが、
そんな非効率なことするんですか?
そういうやり方するならC++でも使ったらどうかと思うんですがね。
メモリサイズが大きくなると、オーバーヘッドの大きい
Windowsのメモリアロケートを使うことになるからめちゃめちゃ遅いよ
ヒープだけで済む小さいのならC標準ので1件ずつアロケートしても使えるが、
そもそも開放がめちゃめちゃ大変だ。
データが壊されたらそっから先は開放できなくなるし。
161 :
どりーむ :2005/09/18(日) 15:08:39
今ファイルの読み込みを試みようとしようとしてるんですが、 うまい事いきません。 もし足りない所があれば助言よろしくおねがいします。 コード struct MovieItem{ long callNo; char title[50]; bool status; int frequency; MovieItem *next; };
162 :
どりーむ :2005/09/18(日) 15:09:58
すいません。 貼り付ける場所間違えました^−^; 当方はC++ですので。 ではw
163 :
デフォルトの名無しさん :2005/09/18(日) 16:06:04
>>138 です。
>>141 さん以下いろいろ教えてくださった皆様。
ありがとうございます。
実は、その場で、一行だけ削除する関数かなんかあればいい名と考えていましたが、
ないようで、
メモリを沢山食いそうで落ちてしまいそうな感じもあり、
テキストファイルの分割も考えに入れ、
教えていただいた方法で、やっていこうと思います。
ありがとうございました。
164 :
デフォルトの名無しさん :2005/09/18(日) 16:32:49
>38,40 いつまでも、こだわるようで申し訳ありませんが、 例えば下記プログラムなんかreallocだけでスッキリ と分かりやすい、と思われませんか? #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *jo; jo = realloc(NULL,30 ); strcpy( jo, "Nissyは馬鹿じゃない、" ); jo = realloc( jo, 60 ); strcat( jo, "しかし、頭が固い!\n" ); printf( jo ); realloc( jo,0 ); return 0; }
>>164 思わない。最初のNULLをタイプするだけ無駄。
>>164 jo=NULL;
とやってからループ内で1回だけ
jo = realloc( jo, size * i );
と書くんなら意味があるけどね。
size が0の時は開放のみなんだろうか?
167 :
デフォルトの名無しさん :2005/09/18(日) 16:48:26
>166 >size が0の時は開放のみなんだろうか? C言語辞典にはそう書いてありました。 別の本にもmallocやfreeの代わりに使える。 が、 それは好ましくない…とは。
領域確保にはmallocなりcallocといったのがあるし 解放にはその名の通りfreeがあるんだから それ使った方がすっきりするしわかりやすい
アロケートしたものを全部開放してくれるsuperfreeが欲しい。
170 :
デフォルトの名無しさん :2005/09/18(日) 16:54:07
>164 どう、こっちの方がもっとスッキリしない? #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *po; po = malloc( 30 ); strcpy( po, "確かに常識的ではない、" ); po = realloc( po, 60 ); strcat( po, "さらに、その上、馬鹿だ!\n" ); printf( po ); free( po ); return 0; }
struct vec { char *data, int capacity, int size }; void expand(struct vec *v, int n) { if (v->capacity < n) v->data = realloc(v->data, v->capacity = n); } みたいのがあって、expand()はv->dataが0の場合にも呼ばれ得る、 みたいなケースなら、わざわざif()で分けるよりは realloc()一本のほうがすっきりする、かも知れない。
>>164 お前ならそう言い出すと思ったから、
おまえは俺ら常人とは違い、天才だと教えてやったろう。
天才は天才の集まる所でやっててくれ。何時までもウザイから。
>>164 センスゼロ。
いいたい・やりたいことをいかにクリアに表現するか、そのためだけに
現在に至る言語の進歩があったと言っても過言じゃない。
「可能」「不可能」だけで言ったら、高水準言語なんてものはこの世に
いらなくなるんだよ。
「メモリを解放したい」んなら単にfree()と言え。それがそのものズバリ
であって、一番クリアだから。
realloc()は一般には「メモリを再確保する」するための関数だから、
そうしたいときに使え。realloc()をfree()やmalloc()の代わりに
使っているコードを見た人は、プログラマの真意をまず疑う必要が
出てくる。バグなのか、アホなのか、etc...
余計な手間がここで生じる。
>>166 や
>>171 のようなケースなら、そう書く人いるだろうね。
>>164 の場合は同じ関数使ってるから、
文字の関係で綺麗にかかれているように見える”のかもしれない”けど、
>>170 のソースの方が自然に理解できると思う。
>>164 のソースは正直コメント無しでぱっと見たら、一瞬???と思うよ。
天才は放置で。
176 :
デフォルトの名無しさん :2005/09/18(日) 17:41:17
>>164 ふつう、そういうのをしたかったら
そういう機能を持ったラッパー関数を作るんですよ
ライブラリの仕様変更にも追従できるし
>>97 ソースを見渡したときに引数がないことが明示されていてわかりやすい。
>>97 ANSI/ISO以前のいわゆるK&R Cにはプロトタイプが存在せず、
関数は
char *foo();
のように仮引数無しで宣言された。
ANSI規格においても、後方互換性の点からこのスタイルでの
宣言が認められ、その場合は(C++のように)「引数無し」
ではなく、古いC同様に「引数は任意であり型チェックはしない」
という意味とされた。そのため、「引数無し」を明示するために
別途voidが導入された訳だ。
>>164 の作るライブラリの関数プロトタイプって纏まってそうだなw
引数がこれの時はこうなって云々...
>>164 はgrep, tail, headなどのユーティリティを認めず
なんでもsedやawkでやる人。
で、
head -10よりsed 10qの方が美しくわかりやすいと信じて疑わない。
もしくは赤ん坊 全ての会話が"ダァ"で成り立つと理解している
1,2,3,ダァ!!!
兵卒だろ 「イエスサー」以外の言葉を話せないw
>>177 >>178 なるほどです!
わざわざ返事くれてありがとうございます。
今日は、「ポインタ完全制覇」っていう本がいい感じだったんで、
読んでますー。
・配列の中身を参照する時に、a[i]とかするけど、この[]は配列とは全く無関係だ。
・Cには多次元配列は存在しない。
この二つはなかなか知られてないみたいですね。
>>184 なんか、誤解を招く表現だな。
気をつけろよ。へんな理解の仕方すると、混乱するぞ。
>・配列の中身を参照する時に、a[i]とかするけど、この[]は配列とは全く無関係だ。 意味ワカンネ a[i]が*(a+i)のシンタックスシュガーである つうこと? >・Cには多次元配列は存在しない。 Cを書く人間なら全員知っているのでは? ・・・ああ。配列の配列を使ったことのない人もいるか
>>185 これに対する説明が書いてないんですが、これってどういう事なんですかね?
多次元配列は存在しないなら、
word[256][256]
とかは何なんでしょう・・・
配列の配列、だろが
>>187 説明もなくそんなわけわからん主張してるのか、その本?
結構有名だから、マトモな本かとおもっていたが、大丈夫かそれ?
ちなみに、俺は読んだことない。
>・配列の中身を参照する時に、a[i]とかするけど、この[]は配列とは全く無関係だ
無関係ってことはない。メモリ上の連続したエリアを配列として使用するときに[]を使う。
ちなみにこれは演算子です。
プログラミング言語には、同じものを表現するのに複数の異なる方法がある場合があり、
これをシンタックスシュガー(構文糖)という。
特に、Cでは、本来異なる概念である「ポインタ」と「配列」が、表現上同じように見えたり、
暗黙に変換されたりするシンタックスシュガーがある。
わかりやすいところでは、関数の引数で、
void foo(int a[])
こういう宣言方法があるが、これは配列を表していない。見た目は配列に似ているがこれは
void foo(int *a)
の別の記述法なだけ。
だからといって、a[] と *a が常に同じわけではないことに注意。
関数の引数の表現時にのみ発生するシンタックスシュガーがあり、いわばこれは特例だとい
うことをゆめゆめわするるべからず。
俺は、a[i]が、i[a]とも書ける、ってことを、「ポインタ完全制覇」を 読んで初めて知ったな。それ以外で驚いたことはなかった。
俺は、a+iが、i+aとも書ける、ってことを、「たしざん完全制覇」を 読んで初めて知ったな。それ以外で驚いたことはなかった。
>>191 それ、ちゃんと理由も書かれていたか?
かかれていなけりゃ、そりゃ糞本かもだな。
>>188 >>189 二次元配列以上のものを多次元配列っていうんじゃないんですか?
本によっては、「Cでは多次元配列を定義できる」ってなってるし
いまいち理解に困ります。
配列の配列ってのはわかりますが、それは多次元配列(2次元配列)
とはいわないんですかね?
>>190 すっごいわかりやすいです。
テキストファイルに保存しときますw
いやー、まじでこのスレ良すぎる。
すごい人達全員にカテキョしてもらってるみたいだ。
195 :
デフォルトの名無しさん :2005/09/18(日) 18:48:58
>166 どうなんでしょう? #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { //必ずポインタをNULLで初期化する安全第一のプログラマにとっては char *jo=NULL; jo = realloc(jo,30 );//と統一した書き方が出来る。 strcpy( jo, "Nissyは馬鹿じゃない、" ); //さらに、誤ってもう一度 jo = realloc(jo,30 ); //と、やっても悪影響はない。 //jo = malloc( 30 );と2回やると中味が消えてしまうけど。 jo = realloc( jo, 60 ); strcat( jo, "しかし、頭が固い!\n" ); printf( jo ); realloc( jo,0 ); //但し、これをもう一度やったらOUT!だけどね。freeも同じだけど。 return 0; }
先ず、「多次元配列」の定義を言ってくれ。
>>187 >・Cには多次元配列は存在しない。
ある意味では正しいが、ある意味では正しくない。
プログラミング言語(の実装)が多次元配列をどうあつかっているかは、いろいろあるが、
多次元配列の実装は2つに分類される。
(1)まとまったメモリエリアを一次元配列として確保し、それは次元の数だけ分割して多次元配列として使う。
Cはこの方法をとっていて、
int a[10][10];
int data = a[y][x];
は内部的には、
int a[100];
int data = a[ y * 10 + x]:
と実装されているかもしれないということ。
見方によってはこれはあくまでも一次元配列であり、「多次元配列は存在しない」といえるかもしれない。
(2)配列への配列をつかった表現。
int a[10], b[10];
int *p[2];
p[0] = &a[0]; p[1] = &b[0];
こうすることで、data = p[y][x] というアクセス方法が取れる。
この場合、a, と bは必ずしも、連続したメモリ上にある必要はなく、またサイズも同じである必要がない。
可変長配列をサポートする言語では、たいていこれに似た方法がとられている。
どっちも、結果的に多次元配列を扱うことはできている。
あとは何を基準に判断するかの問題。
Cには無いんだけど dat[a,b]といった表現をするのが2次元配列 dat[a][b]ってのが配列の配列 dat[a]ってだけで意味があるところ(使う事ができる)なのがミソ
201 :
199 :2005/09/18(日) 19:00:22
× それは次元の数だけ分割して多次元配列として使う。 ○ それを次元の数だけ等分割して多次元配列として使う。
>>195 コテハン名乗ってくれ。あぼーんするから。
>>199 また保存行きですw
なるほどー、Cでは(1)の方を使うから、解釈の仕方で両方の意味に考えられると。
で、(2)の方なんですが、これは確実の多次元配列として扱えてますよね?
これがCで使えるなら、多次元配列としていいような気がします。
>>200 呼び方の問題なんですかねー、多次元配列として扱う
>>199 の(2)のようにできるなら
多次元配列は存在するといってもいい気がしますが、dat[a,b]っていう書き方ができ
ない以上、多次元配列は存在しないと言わざるを得ないって事なのかな。
>>195 > realloc( jo,0 );
> //但し、これをもう一度やったらOUT!だけどね。freeも同じだけど。
freeの代わりに使うとしても、
jo = realloc( jo,0 );
と、常に戻り値を入れておけば事故もないんじゃないかな。
free したいのかどうかはコードなめないと分からないと思うけど。
>>200 FORTRAN77 は dat(a, b) とか書けるけど、
dat(1, b) というのを関数に渡して、
その関数内部では列行列であるかのように扱うことができるぞ。
今日夜バイトいったら、一週間くらいでかけるんで、しばらく書き込めないです。 けど、ノーパソと「Cの掟」と「ポインター完全制覇」もって、勉強はするんで、 質問したい事とかめっちゃたまるっぽいですが、そん時はよろしくお願いします。
てか、この掲示板て携帯からみれるんですか?
すいません、いけました。 おふぉな質問して申し訳ない。
ファイル入出力でつまずいてます。 なにかいい本ありますか? 初歩的なことからわからないんです。 できれば、ファイル入出力だけでなく、C全般についてのいい本もお願いします
Cの場合は、配列の配列(敢えて言うなら多重配列)を多次元配列のように扱えると解釈するべきではないかな。 >必ずポインタをNULLで初期化する安全第一のプログラマにとっては 安全第一というより、安直第一というべきだろう。 そういう、「0フィルしておけば安全」という間違った考えがバグを生みデバッグを困難にすることに繋がることも理解すべきだ。
すいません。C言語で立方体のさいころをつくりたいのですが これは、展開図に直して連結リストで作ってみると考えたのですがどうでしょうか?
>>212 > C言語で立方体のさいころをつくりたい
立方体さいころ組立工作機械の制御でもやるのかね?
>>212 それはCの質問なのか?
アルゴリズムの質問のように読めるのだが。
#そうだとしても、言葉足らずではあるが。
たぶん宿題だろ
>>213 以前就職活動で受けてた会社の入社テストに、さいころの展開図の問題があったんです。
内容はさいころをこの角度から見て(3面だけ見えてました)
展開図に直すと次のいずれになりますか?というものだったんですけども、、、。
それをC言語でつくってみようと思ったんです。
でプログラムでなにがどうなるのがつくりたいんだ?
219 :
212 :2005/09/18(日) 20:12:32
皆さんレスありがとうございます。すいません、言葉足らずでした。 今からアルゴリズムの本の「連結リスト」の部分をわからないなりに読んでみようと思います。 また、行き詰まったらすいませんが知恵を貸して下さい。
つーか、スレ違いを相手にするのは鬼違い。
「多次元配列がない」という言葉が意味したいことは、 int x[A][B]; の時に x[a][B-1] と x[a+1][0] のメモリが 連続してることが規格上保証されている、 ということを言いたいわけなのだろうか? 離してもいいものも作ろうと思えば作れるが、 言語的にパッと書けるものでもない、と。 もしくは、内部的には x[a][b] は (*x)[a * B + b] のように 一次元的なインデックスに直され、B という値が再利用されるので、 配列へのポインタで int(*)[B] のように サイズが必要になってしまうというようなことを言いたいのか。 x を int** へ代入できないよ、全くの別物だよ、 というようなことが言いたいのか。
Cでは単に配列の配列を多次元配列の替わりにしてるから サポートレベルが低いってことじゃまいか。 実際ただの(一次元)配列に比べて不便で扱いづらいでしょ、 例えばサイズの不定な多次元配列を扱ったりする場合に。
なるほどね。それが一番的確な回答に思える。
多次元配列って、普通サイズ固定じゃないのかな。 行列にしたって、行や列が可変サイズじゃ意味がないし。
>>224 サイズを問わない汎用的な関数を書きたい
というケースなら珍しくないでしょ?
どのみちCでは静的に確保しない限りサイズは知りようがないんだが
そのへん、C99ならある程度の可能性がある。 どこまでで限界が来るか、一度試してみたいな。
>>226 分かってて言ってるんだろうが
ただの1次元配列の場合は
void vector_fn(int array[], int size)
のようにすればよい。
2次元配列の場合は
void matrix_fn(int array[], int m, int n)
のようにして、キャストを使い1次元配列の「ふり」をして渡すしかない。
で、関数内では1次元配列上で明示的にオフセット計算をする羽目になる。
マクロを使えば多少は楽になるとは言え、これは醜いし、不便だろう。
少なくとも、Cが多次元配列に対して良きサポートを提供しているとは
お世辞にもいえない。
それは多次元というより、配列そのもののサポート状況じゃないか? 一次元配列でも、サイズ情報は別に渡さなきゃならないわけだし。
そういう時は動的に確保するか ポインタテーブル作れってことだけど、面倒っちいわな。 void foo(int array[][B]) のようなこともできはするけど、サイズ固定だしな。
231 :
デフォルトの名無しさん :2005/09/19(月) 01:24:25
初歩的な質問なんですが、 char buf[128]; と char *buffer = malloc(128); ってどっちがいいんですか?
232 :
デフォルトの名無しさん :2005/09/19(月) 01:28:29
用途を言え
234 :
デフォルトの名無しさん :2005/09/19(月) 01:30:47
>>231 普通は
・確保したバッファを呼び出し元の関数に返したい場合
・途中でバッファのサイズを拡張する可能性がある場合
・サイズが128ではなくてデカ過ぎる場合
はmallocを使う。それ以外なら上で良いでしょう。
>>232 デバッグ用にprintfっぽく使えるメッセージボックスを作ろうと思ったんですが・・・
しょっちゅう呼び出す関数は確保→開放ってやると遅くなるかと思って・・・
>>234 ありがとうございます。
>>235 デバッグでパフォーマンスは気にしない。
デバッグでなくても、 メッセージボックスの表示のオーバーヘッドで 全く気にならないはずだ。
>>211 メモリを保持してないポインタはNULLにしておくべきだろ
アロケート目的に使わないならfreeしないから関係ないけど。
>、「0フィルしておけば安全」という間違った考えがバグを生みデバッグを困難にする
それはどんな状況ですか?
そういう経験はしたことないんですけど。
×0フィルしておけば安全 ○NULL フィルしておけば、NULL フィルしないよりは安全 NULL フィルしたからといってバグがなくなるわけではないが、バグ検出に役に立つ。 NULL へのアクセスは大抵の環境で実行時エラーが出る。 NULL フィルしなかった場合は、偶然どこかの正常なアドレスを指してる可能性がある。 例えば、昔ポインタとして使われたスタック領域と同じところに そのポインタが割り当てられたときなどは、可能性としては十分あり得る。 代入が直後にある場合などは必要ないと思うかもしれないし、 実際入れなくても現時点では何も問題はないが、 後の拡張やコードの移動により問題が発生する可能性はある。 NULL フィルのオーバーヘッドが気になるような状況でもない限り、 NULL フィルしといた方が安全ってのは正しい。
わざわざデバッグビルドで固定値を突っ込んでくれるコンパイラもあるというのに……
0とNULLの区別がつかない人って、初心者に良くいるよね。
>>240 それはコンパイラに依存すると言うことですよね?
いちいちコンパイラの仕様を確認しなければならず、
違っていればやり方を変えなければならないと言うことですよね?
デバッグビルドとリリースビルドで動作が違ってくるって事ですよね?
デバッグビルドで取り除けるバグを、リリースビルドで見つけなければならないと言うことで、
デバッグが大変になりますよね?
阿呆はだまってろよ
でも、ぶっちゃけリリース版でしか再現しないバグってのがあるから困りもんだ。
>>245 自分の主張と、間違ってると思われる発言を書けよ
自分のアホは指摘されたくないってか?
>>240 もしかしてコンパイラに固定値突っ込ませてデバッグ後、
固定値突っ込むのをOFFにするオプションつけたデバッグビルドでもデバッグするのかな?
少しでもコードを取り除きたいならそれもいいかもね。
めんどくさ。
251 :
デフォルトの名無しさん :2005/09/19(月) 05:33:59
悔しかったらCYGWINの/usr/bin/share/docと/usr/bin/share/manを 間違って上書きしちゃったどうしようdocだけ最インストできそうだけど manはどうしようってなってる俺をどうにかしてみろよおめーら
252 :
251 :2005/09/19(月) 05:36:21
ワワワワワ 激しく誤爆しちまったじゃねえか ついでにすれ違い覚悟で聞いてみるけど どうしたら一番効率よくもどにもどせれる?
>>249 VC5のコンパイラのバグでlongdoubleの演算最適化ができなかった。
リリースビルドでしか再現しなかった。
MSにコード渡してチェックしてもらったけど、コーディングの問題はないと言われた。
プラグマでその部分の最適化を外して対応した。
>>250 実務未経験プログラマから見れば必死に見えるのか。
>>251 コピー元ファイル一覧をつくり、
delコマンドのバッチファイルにし、実行する。
あ、ユニックスだっけ? DOSでもいいけど ファイル一覧をパイプでdelコマンドに渡すのが一番早いかな。 でも僕は使い慣れてないからテストしてからじゃないと実行しない。 テストするならバッチに書いたほうが確実で早いと。 VZエディタからのキーボードマクロにはお世話になった。
100げと
華麗にスルー
アフィリエートの綴は、aferieitoじゃなくて、affiliate
>>249 私は一回ありましたよ。
詳細は忘れてしまいましたが法線を求めた時にデバッグビルドだと0、
リリースビルドだとINFになりました。
数学関数の挙動に違いがあったとかそんな感じです。
262 :
デフォルトの名無しさん :2005/09/19(月) 14:02:44
マクロについて質問です。 メモリリークを調べるため、 自作のアロケーターでmalloc関数群を隠そうと思います。 void *chk_malloc(size_t size, file, line) { } #define malloc(size) chk_malloc(size, __FILE__,__LINE__) こんな感じです。 この場合、 int (*f)() = malloc; の様に値として代入が発生した場合は関数マクロは効力が発揮できませんが、 この場合でもchk_mallocを代入するように細工する方法はないでしょうか。 #define malloc chk_malloc とすると fileとlineの情報が欠落してしまいます。
>>262 グローバル変数へパラメータを追い出してみるのはどうだろう
const char*chk_malloc_file;int chk_malloc_line;
void* chk_malloc_(size_t sz){
}
void*(*chk_malloc(const char*file,int line))(size_t){
chk_malloc_file = file;chk_malloc_line = line;
return chk_malloc_;
}
#define malloc chk_malloc(__FILE__,__LINE__)
まぁこの実装だと同時に2箇所以上で使うと破綻するけど
264 :
デフォルトの名無しさん :2005/09/19(月) 14:17:13
>>263 ありがとうございます。
面白いですね。
試してみます。
>>262 そりゃ、関数ポインタ自体に file と line 用の引数がない限り、どうしようもないわな。
#ifdef NDEBUG
typedef void* (*malloc_fp_t)(size_t size);
#define MALLOC_FP malloc
#define MALLOC_CALL(fp, size) fp(size)
#else
void* chk_malloc(size_t size, const char* file, int line);
typedef void* (*malloc_fp_t)(size_t size, const char* file, int line);
#define MALLOC_FP chk_malloc
#define MALLOC_CALL(fp, size) fp(size, __FILE__, __LINE__)
#define malloc(size) chk_malloc(size, __FILE__, __LINE)
#endif
malloc_fp_t fp = MALLOC_FP;
char* buf = MALLOC_CALL(fp, size);
こんなところだと思うが・・・。
266 :
263 :2005/09/19(月) 14:21:22
よく考えると2段の関数にしなくてもこれで充分だった const char*chk_malloc_file;int chk_malloc_line; void* chk_malloc(size_t sz){ return malloc(sz); } #define malloc (chk_malloc_file = __FILE__ , chk_malloc_line = __LINE__ , chk_malloc)
>>263 それだと、関数ポインタを使ったとき(メモリを確保したとき)の情報じゃなくて、
関数ポインタに代入したときの情報が表示されてしまうと思うのだが。
発想の面白さは買うけど。
268 :
デフォルトの名無しさん :2005/09/19(月) 14:28:37
#define MALLOC_CALL(fp, size) (fp)((size)) #define MALLOC_CALL(fp, size) (fp)((size), __FILE__, __LINE__) #define malloc(size) chk_malloc((size), __FILE__, __LINE) こうしといた方が安全か。
mallocなんてキチガイじみたものを使わないのが正解。
>>270 C++ならともかく、Cでmalloc無しってどうすればいいんだよ。(calloc realloc をつかえとか言うなよ)
は?
 ̄ ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ______ /:::::::::::::::::::::\ /::::::::::::::::::::::::::::::::\ |:::::::::::::::: | |::::::::::::::: ∪ \,, ,,/) |::( 6::ー──◎─◎| ノ::: (∵∴∪ ( ・ ・)) / ∵ 3 丿 ブフィ /\ U ___ノ / .\ ____ノ\ \______ノ .\
>>271 realloc じゃないか? 上のアレ。
過去スレに居たな malloc() なんて必要無いって言ってたの。 スタックに予め大きく取って分ければ良いとか言ってたっけな。 そいつもかなり鬱陶しかった。
スタックじゃなくてヒープだろw
0で初期化が必要って状況じゃない限りmalloc使うわな
それよりcallocの2つの引数の使い方が、謎。
>>279 お好きなように。プロジェクト単位で使い方のルールが統一されていると読み易くて宜しいかと。
calloc()とfread()はセンスねーなと思うな
fread は別に構わんと思う。 エラー時に、中途半端にデータが埋められるってのがないから。 でも、calloc はよく分からん。 何か、環境依存で問題があったりするんだろうか。
え、Linuxってそんなにも糞だったの?
Linux >>>>>>>>>> Windows Seriese
カーネルのバージョンが十分に最近のものであれば、 このメモリを割り当て過ぎる動作を以下のコマンドで無効にできる。 # echo 2 > /proc/sys/vm/overcommit_memory
>>286 だから、ソフトウェアが普通に組まれてても、
コマンド発行するまで危険な動作をする可能性があるということでしょ。
素人がLinux構築するとバグだしまくりなのは、
素人が使うことを前提としたWindowsとはやはり違うということで。
ま、Linux単体で使う人もあまりいないでしょうけど、
Linuxを盲目的に信奉すると危険てことですね。
そんなレベルの話じゃないような気がする。 はやくバグフィクスしろよ。
289 :
デフォルトの名無しさん :2005/09/19(月) 18:38:09
それってマニュアルのバージョンが古いだけちゃうんかと
古いとしても12年も更新されてないのか。 やる気0だなw
今更だが上の配列の方の話で…
今まで1次元配列の方が早いだろうと思って多次元配列を1次元で書いてたんだが、
>>199 見る限り速度的にそんなに差はないってこと?
>>291 あんま変なことしてると、
最適化がうまく効いてくれないかもしれないぞ。
>>291 んなことが気になるぐらいならasmのソースでも比較すりゃいいじゃねえか
僕の人生も最適化できたらなァ
>>294 人生が環境依存になりますがよろしいでしょうか?
296 :
デフォルトの名無しさん :2005/09/19(月) 19:54:15
配列へのポインターを返す関数を作りたいと思います int ReturnValue[5][5];と宣言して return ReturnValue;としたいのですが, 関数宣言の仕方が分かりません<m(__)m> int** ThisFunction();これではだめでした! このint**がエラーのようですが,正しくはどのように宣言するのでしょうか?
俺の人生、最適化の前の構文解析あたりでつまずく・・・
誰か人生をデバッグしてください。
>>296 一応型だけを見れば
int (*ThisFunction())[5];
か
typedef int ArrayType[5];
ArrayType* ThisFunction();
か
typedef int (*ReturnType)[5];
ReturnType ThisFunction();
で、int** がダメな理由は
>>221 。
ただ、配列を内部変数として取ってるのに
そうやって返すことはできないぜ。
300 :
デフォルトの名無しさん :2005/09/19(月) 20:40:52
>>299 int (*ThisFunction())[5];でできました!
ありがとうございます
全く予想付かない形でした
>>ただ、配列を内部変数として取ってるのに
>>そうやって返すことはできないぜ。
実際はクラスの中の変数を,Public関数から返します
C++ ジャン! まあ、C++ 関係ない話だったからいいけどさ。
302 :
デフォルトの名無しさん :2005/09/19(月) 21:25:13
memsetを使うとchar型の配列を高速で初期化できます ところでint型の配列を高速で初期化する方法はないのでしょうか? int BigArray[100][100]; for(int x=0;x<100;x++){ for(int y=0;y<100;y++) BigArray[x][y]=10; } ↑これを高速化したいのです!
304 :
デフォルトの名無しさん :2005/09/19(月) 21:39:05
memsetのほうが高速という保証はどこにも無いと思うんだが
>>302 for(int i = 0; i < 10000; i++) {
BigArray[0][i] = 10;
}
で少しくらいは速くならないかな?
>>302 =305
int もバイト単位でアクセスできますが?
int BigArray[100][100] = {0}; これがはやいんじゃねーの?
memsetの定義は void *memset(void *s, int c, size_t n); で。 速度云々は別としてmemsetで問題ないと思う。
>>311 てことは、逆にキャラ配列で10 padding するには、0x0a0a0a0a で生めにゃならんのか?
そういう使い方したことないから、気づかんかった。
>>311-312 何を言っとるんだw
c の型は int だけど、実際に使われるのは下位1バイトだけだぞ!
c の型が int なのは、標準関数の引数には char を使わないから(ポインタ除く)。
315 :
デフォルトの名無しさん :2005/09/19(月) 22:08:14
>>314 memsetは0で初期化する場合はintにも使えますが,10では無理です
>>315 だから、さっきからそう言ってるじゃないか。
初期化部で int BigArrayBuf[100][100]; for(int x=0;x<100;x++){ for(int y=0;y<100;y++) BigArrayBuf[x][y]=10; } ってしといて、使うとこで int BigArray[100][100]; memcpy(BigArray,BigArrayBif,sizeof(BigArray)); ってすりゃええやん
高速化したら幸せになるのか?
いつもの自己満足
大量のバッファ(メモリ)にアクセスするのと、代入していくのとだと、 代入の方が速い気がするけど、実測してみないと結論は出せぬ。
321 :
デフォルトの名無しさん :2005/09/19(月) 22:20:34
int BigArrayBuf[100][100] = {10,10,10....10}; でいいじゃん 10000個の要素はawkなりPerlなり前処理で 自動生成すればいい
memsetで初期化とか言わないでほすぃ 初期化は宣言と同時に行うものだよ うざがれそうだが…
プログラム中に初期化したい時もない?
文法における初期化とは別の話だぞ? 作業としての初期化だ。
混乱するから混同すんなって言ってんじゃないの?w
#include <emmintrin.h> void foo() { __declspec(align(16)) int BigArray[100][100]; int i; const __m128i v = { 10, 10, 10, 10 }; for ( i = 0; i < 100 * 100; i += 4 ) { _mm_store_si128( (__m128i*)&(BigArray[0][i]) , v); } }
>>321 約40KBバイナリファイルサイズが増えます
328 :
デフォルトの名無しさん :2005/09/20(火) 06:08:46
VC++6.0でやってます scanfで数値を一文で横に入力するようにするにはどのようにプログラムすればいいでしょうか? 100 200 300 と入力する感じにしたいのです よくわからなかったので scanf("%d %d %d",&a,&b,&c)みたいにやってみたのですが これだと縦に 100 200 300 と入力するようになってしまいます やりかた教えてください あと小数点つき123.45とか入力した場合 途中で終わってしまいます 小数点入り数値を入力しても大丈夫なやり方も教えてほしいです
>>328 VC++スレの人だな
変換指定子が%d %d %dなら、「100 200 300」だろうと
「100[ret]200 300」でも「100[ret]200[ret]300」でも読み込めた希ガス
小数の場合は放り込む変数をfloatなりdoubleで用意して
変換指定子を%f
>>329 ありがとうございます
とりあえず数値を入力して出力だけ出来るように今やってるんですが、現在こんな感じ
#include <stdio.h>
int main (void)
{
float a;
int b,c,d;
scanf("%f",&a);
scanf("%d %d %d",&b,&c,&d);
printf("%f %d %d %d",a,b,c,d);
return 0;
}
入力するのはa=123.45 b=100 c=200 d=300って感じです
出力すると123.45が123.449997になってしまいます
あと[ret]入れるのは数値を入力するときでしょうか?入れてみたらすごい数値がでちゃったり
できれば[ret]なしで横に入力させるようにしたいです
連投が返事がおそく(´・ω・`)
331 :
300 :2005/09/20(火) 06:56:06
あ、↑のなんか勘違いしまくってた 横に入力まではできてました あと残る問題は123.45を入れると123.49997って出るだけです そのまま123.45って出したい
"%.2f"
>>330 floatの精度はそんなもん。もっと精度が必要ならdoubleを使え。
335 :
デフォルトの名無しさん :2005/09/20(火) 07:58:32
プログラム始めるならCからと聞いたのでここにやってきたわけだが まず何を始めたらいいか、この俺様におまえら愚民ども、 丁寧かつ迅速に教えろや!
335ワラタ
関数の戻り値を設定したら、 必ず戻り値を受け取らなければならないのでしょうか。 例えば、int foo();という関数を定義した場合、 int test; test = foo(); のように使用しますが もし戻り値を受け取っていなかったら 不都合とかあるのでしょうか。
>不都合 ない
返値を受け取らない事そのものに不都合は無い その返値でエラー処理やリソース開放などが必要だとしても、 Cの知った事ではない
printfはintを返すが、戻り値は受け取ったことはないぞ。
は?
printfでの出力が成功したかどうかを確認する必要、意義があんま無いからでは
348 :
342 :2005/09/20(火) 14:54:09
printf 系の戻り値は全く使わんな。 scanf 系のは使うこともあるが。
×scanf()系のは使うこともある ○scanf()系の戻り値は見なきゃダメ
ヒント:書き捨てプログラム、デフォルト値
そもそも scanf が書き捨て
scanfの戻り値ってなんだっけ?
入力データの個数。
文字列の一部を取り出すのってどうやる? たとえば Hello World っていう文字列が変数に入っていて スペースまでを別の変数に取り出す
俺ならスペースまでを別の変数に取り出す。
特に状況や動作環境の指定、制約無いからstrtok使っとく
男は黙ってsscanf()
普通に1文字ずつ転写していって、スペースが出た時点でヌル終端つける けどstrtokって手もあったな
・元文字列を保存 ・元文字列が長いのでコピーしたくない という場合なら、strchr でスペース検索して、 そこまでを strncpy で抜き出してヌル終端付ける。
ポインタを動かしてスペースを探す 最初からそこまで取り出す
>>361 それどうやるの?
関数の使い方がわからん
態度でかいな、この馬鹿は
>>364 俺は態度でかいよ
strtokで出来たからもういいよ
つまり世の中の「初期化関数」はすべてうそつきだと。
C言語の勉強をしたいと思っています。 C++が大学の研究室にあるのですが、Cの本でも勉強できますか? C++というくらいですし、Cのプログラムは普通にできますよね?
>>369 一応C++のコンパイラがあればまともなCを動かすことは出来る。
ANSI以前の古いCやプロトタイプ宣言のないなどの変なCは動かない可能性はある。
372 :
369 :2005/09/20(火) 21:36:20
>>370 >>371 ありがとうございます。
Cの本は最近発売されたもので、初心者向けのやさしいものなので
大丈夫だと思います。
普通のCが使えないC++処理系ってあったっけ?ないよな。
374 :
369 :2005/09/20(火) 22:07:08
>>373 目標はポインタを理解することなので、大丈夫じゃないでしょうか?
組込みエンジニア目指してます!
「C++が大学の研究室にあるのですが」という斬新な表現に感動した
C++ is everywhere.
C のを C++ でコンパイルする際、若干仕様が違う点もある。 しかし、C++ コンパイラは同時に C コンパイラもついてることが多いから、 C のプログラムをそのまま C としてコンパイルできるはずだと思う。 C++ 専用のもあるだろうけど。
Cだと思ったら、たいていC++
C言語理解しない純粋のC++コンパイラなんて俺知らないぞ どっかにあんのか?
今となっては、純粋なCコンパイラを探すほうが難しい
>>380 いやだからC++コンパイラもくっついてるだろうけど
CとC++ではあくまで別モンだろ?
int main() { int class = 0; return class; }
はCソースとしては正当だがC++ソースとしては不当な訳で。
で、これを食えねえ純粋のC++コンパイラしかついてねーような
やつがあるかってこと。
あと、mainの再帰コールができないとか。
まあ、C言語として正当だがC++として不当な例なんぞいくらでもあるだろう K&Rスタイルを拒否るCコンパイラも、俺は見たことが無いぞ
いまどき組み込みやりたがる学生っているのな。たしかに需要過多ではあるが 地獄だぞ。 まあへたなオープン系SIよりはマシか。
385 :
369 :2005/09/21(水) 00:01:56
みなさん、ありがとうございます!
>>384 詳しくお願いします(汗)
あまりやりたがるヒトがいない、というのを聞いていて、
がんばれば将来食いっぱぐれることがないかなぁ、と思っているのですが・・・
地味というのは聞きましたが、地獄なんでしょうか??
携帯はしんどいので避けるつもりですが・・・
ハードとソフトの両方に接することができる組込みに魅力を感じています!
教えてください。 xが1〜9の整数の時、 #include <math.h> int sisu(int x) { return (int)pow(2, x-1); } と、 int sisu(int x) { switch (x){ case 1: return 1; case 2: return 2; case 3: return 4 case 4: return 8 case 5: return 16 case 6: return 32 case 7: return 64 case 8: return 128 case 9: return 256; } return 0; } とでは、どちらを使ったほうがイイのでしょうか?
>>386 俺ならこうする。
int sisu(int x)
{
return 1 << --x;
}
int t[]={1,1,2,4,8,16,32,64,128,256}; return t[x]; 書いてて一寸、馬鹿らしく(ry
質問です。 sscanf関数の戻り値をチェックする時って if(sscanf(何とかかんとか)!=1){ と書くのと if((sscanf(何とかかんとか))!=1){ と書くのとではどちらの方がいいんでしょうか。 別にsscanf関数に限らず、他の関数の戻り値のチェックの時もなんですけど……。
>>389 別にどうでもいいが、後者は冗長だろう
手前そんなにカッコが好きならカッコウとでも結婚してlisperでも産みやがれ!
ぐらいのことは言われるかもしれない
>>390 どうもありがとうございました。
超高速レスで助かりました。ふんとに。
いえいえどういたしまして。 ふんとに。
>>386 俺ならこうする。
#define SISU(n) (1u << ((n) - 1))
漏れならこうする #define SISU(puri) (1<<((puri)-1))
>>394 の場合、
Xの範囲を1〜12に拡張しないとコンパイルが通りません
と、お兄ちゃんが言ってました。
眞深派の場合はどうすればいいんですか?
>>385 忙しいときは土日出勤で家に帰れないこともあたりまえかな。
基本的に派遣に近い勤務形態になるからプロパーと仲良くしなきゃかなり気まずくなるし。
俺なんかは初っ端から同じ会社の人間一人もいないような状況で仕事することが
結構あったりして、軽く欝になりかけた。
今はWeb系に転向してASPとかServletとかやってる。これでもまだ20代前半だ。
俺もCは大学からはじめた。まあ頑張りたまえ。
あと、PGの話題は板違いになるのでマ板か情シスで。
>387 >388 >393 >394 ありがとうございました。
399 :
369 :2005/09/21(水) 07:22:39
>>397 ありがとうございます。
そんなにたいへんなんですか・・・
お勤めごくろうさまです。
よく調べますね・・・
制御系やりたいなら我が社へ是非。修飾フェアでお待ちしております。
401 :
369 :2005/09/21(水) 07:43:40
>>400 大手電機・精密またはその子会社を検討しているのですが、
御社のことも調べてみます。
著作権がからんでくるページで印刷や右クリックができない所があるのですが、 それらを印刷したり保存したりする方法はないでしょうか?
スレタイを読み直せばいいと思うよ
>>402 それをCで実装する方法が知りたいのか?
ならば環境依存だ。
上司って意外とって言うか滅茶苦茶丁寧に教えてくれるよな 大学の教授より教えるのうまいし
運が良かったな
407 :
デフォルトの名無しさん :2005/09/21(水) 19:31:30
今晩は,構造体について、教えてください。 struct S{ int a; int c; }; S *s; s->a = 2; s->b = 3; s++; で、 s->a = 4; s->b = 5; のように配列のようにできるのでしょうか。
激しく文法が違っています。
質問箇所以前で激しく間違ってます
>>407 変数などの宣言時にSと書けるのはC++。Cではできない。
sはポインタ型の変数を宣言しただけで、まだどこも指していないのに->でアクセスしている。
411 :
デフォルトの名無しさん :2005/09/21(水) 20:16:14
すみません、このようにしていますが、 間違っているのでしょうか struct Skakidasi { int member; int sasizu; }; 呼び出し側 Skakidasi skakidasi; visibe(&skakidasi); 関数 void visibe(Skakidasi *skakidasi){ skakidasi->member = 4; skakidasi->sasizu = 9; skakidasi++; skakidasi->mamber = 8; skakidasi->sasizu = 12; }
struct Skakidasi skakidasi ; にしてください。 ^^^^^^
413 :
412 :2005/09/21(水) 20:22:28
元の構造体が配列になってませんヨ
struct Skakidasi skakidasi[2]; visibe(skakidasi); こうだろ
415 :
デフォルトの名無しさん :2005/09/21(水) 20:33:44
>>412 さんありがとうございます。すべて直しました。
>>413 さん
配列数が決まっていないので、ポインタにしたいのですが、
どうすればよいのでしょう。
416 :
デフォルトの名無しさん :2005/09/21(水) 20:39:44
>>414 さんすみません。みていませんでした。
配列数が最初に分からないのです。
>>415 あのなー
ポインタにしたから配列の縛りが無くなったと思うのは間違い。
malloc/freeで適宜メモリを割り当ててやらないといけない。
その調子だと全然わかってなさそうだから、とりあえず配列を大きめにとって使ったら
どうですか?
417が書いてるようにmallocで割り当てて、途中で変更が必要なら reallocで増減するのがいいだろうな もしくは線形リストとか
419 :
デフォルトの名無しさん :2005/09/21(水) 20:46:28
>>417 さんありがとうございます。
そうです。つかったことないです。malloc/free
配列大きめにして使います。
すみませんでした。
420 :
デフォルトの名無しさん :2005/09/21(水) 20:48:55
>>418 さん。ありがとうございます。
そうですね、やはりメモリ管理ちゃんとして他方がいいのでしょうね。
その、malloc がんばって、勉強してみます。
線形リストですか、名前だけは聞いたことあります。
また、調べないと、思い出しそうもないです。
ありがとうございます。
realloc乱発はメモリが歯抜けだらけになるからあまりお勧めできない
422 :
デフォルトの名無しさん :2005/09/21(水) 21:16:21
>>405 俺の糞上司と交換してくれ
いらなかったら生ゴミの日に出すなりトイレに流すなり好きにしていいから
typedef struct S { int a; int b; } S[1]; void S_init(S s) { s->a = 0; s->b = 0; } S s; S_init(s); こういうテクニックもあるのぅ。
可読性を下げる悪習のことをテクニックと呼ばないでほしい
最強はif文の中に大量の条件を詰め込みまくる奴だろ カッコが30とかもう見る気も失せる 当然コメントなし
もうそんな怒らないでください
if (a) { if (b) { if (c) { hoge(); } } } if (a && b && c) { hoge(); } どっちがいい?
マゾな俺は上
if文のすぐ次にまたif文が来る場合は 中括弧略せないの?
全組み合わせごとに処理が違ったりするのが一番厄介だわな。 仕事じゃともかく趣味じゃこーやってる。 foo = (a ? 4 : 0) | (b? 2 : 0) | (c ? 1 : 0); switch ( foo ) { ・・・ }
elseがないなら上がいいな
if(hogehoge!=a || hogehoge!=b) こんな感じに書いて、何で常に実行されるんだぁああああああああああ!!! と悩んだ馬鹿な俺が来ましたよ
>>433 a==bが真なら実行されない場合あるじゃん
if(hogehoge!=a || hogehoge==a)
こう書く勇気がなかった
>>433 ?
436 :
369 :2005/09/22(木) 00:06:39
さっそく始めてみました!・・・が、早速詰まってしまいました・・・ エラー内容 エラー E2209 hello.c 1: インクルードファイル 'stdio.h' をオープンできない です。 stdio.hファイルはたしかにあるんですが・・・
つーか、スレ違いだがね。
440 :
369 :2005/09/22(木) 00:18:47
>>437 ディレクトリは絶対パス指定で、
dirコマンドでディレクトリを開き、対象ファイルを確認した上で行っているので、
大丈夫です。
>>438 すみません・・・
環境は
OS : WindowsXP SP2
エディタ : サクラエディタ
コンパイラ : Borland C++ Compiler 5.5
です。
>>440 >ディレクトリは絶対パス指定で、
>dirコマンドでディレクトリを開き、対象ファイルを確認した上で行っているので、
>大丈夫です。
言ってることの意味がよく分かりませんね。
環境設定でヘッダファイルの置き場所を・・・
まあデフォルトで入ってるとは思いますが。
あとはソースコードでどう指定したのか。
>>440 腐るほど出てる質問のはずだから過去スレ検索汁!
char *hoge(char*s char*t) { char *p; p=s; while(*s++); for(--s;*s++=*t++;); return p; } これによって文字列の結合が出来るのですが、for(--s;*s++=*t++;);この部分が どういった処理をしているのか判りませんご教授ください。
445 :
369 :2005/09/22(木) 00:37:21
>>441 >>443 解決しました!
本をよく読んでなくて、cfgファイルの作成をしていませんでした(汗)
ありがとうございました!
>>442 ご助言ありがとうございます!
>
>>444 > これによって文字列の結合が出来るのですが
出来ないだろ。
コンパイル位通せや
>>444 for文中に各ポインタの中身を見ればいいと思うよ
>>444 while(*s++); /* sのケツ探し
for(--s;*s++=*t++;); /* sのポインタをひとつ戻し('\0'の前)
*tを*sにコピー
sとtのポインタをそれぞれインクリメント
コピーしたものが0じゃなければループ */
>>446 この関数によって文字列の結合の処理を行うのですがと書いた方が良かったですね。
釣りかと思いました。
>>447 >>448 おかげさまで解決しました!本当にありがとうございます!!
>>449 引数の,が抜けてることを指摘してるのかと
451 :
デフォルトの名無しさん :2005/09/22(木) 01:32:08
452 :
デフォルトの名無しさん :2005/09/22(木) 05:49:52
配列に数値を8個入れていって 最後に合計をだすプログラム #include <stdio.h> int main (void) { int a=1,c=0; int dt[8]; for (a;a<=8;a++){ printf("数値?"); scanf("%d",&dt[a]); c = c + dt[a]; } printf("合計%d\n",c); return 0; } まったく違う答えが・・・ どこが間違ってるかわからなす(´・ω・`) 教えてください
453 :
デフォルトの名無しさん :2005/09/22(木) 05:59:56
> 452 6行目を for ( a = 0; a < 8; a++ ) { に変更すべし
455 :
デフォルトの名無しさん :2005/09/22(木) 06:32:27
また詰まってしまったので質問です さっきのちょっと進化した型なのですが 今度は合計のあとに [番号]”数値=”配列に入れた数値 その数値は全体のなん% って感じにしたいのです [番号]”数値=”配列に入れた数値 まではたぶんできたと思うのですが その後に入れる全体のなん%かと表示するやり方がわかりません しかも8桁にしないといけないらしくて10.000000%みたいな お願いします #include <stdio.h> int main (void) { int a,c=0; int dt[8]; for ( a = 0; a < 8; a++ ) { printf("数値?"); scanf("%d",&dt[a]); c = c + dt[a]; } d = c; printf("合計%d\n",c); for(a = 0; a < 8 ; a++){ printf("[%d]数値=%d\n",a+1,dt[a]); ←ここが不明(;´Д`) } return 0; }
>>455 printf("[%d]数値=%d これは全体の%.8f%%\n",a+1,dt[a], ((double)dt[a]/(double)c)*100.0)
寝ぼけてるからコンパイルが通らないor通ってもおかしいor不要なのがあるかも
458 :
デフォルトの名無しさん :2005/09/22(木) 09:27:50
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
>>458 NASAのコンピュータをハッキングするときに役立ちます。
>>458 パズルのようなプログラムを組むことができます。
ぬるぽするのに役立ちます。
463 :
ビタミンC初心者 :2005/09/22(木) 10:10:07
#include<stdio.h> void func(int *a){ (*a)++; } void func2(int a){ a++; } main( ){ int i; i = 5; printf("%d",i); func(&i); printf("\n%d\n", i ); func2(i); printf("%d",i); return 0; }
464 :
ビタミンC初心者 :2005/09/22(木) 10:11:57
463のプログラムをコンパイルしたら、aに代入した値は使われていない というエラーがでました。どこがおかしいんでしょうか? どなたかおしえてください。おねがいします。 (初心者なので、基本的なことですいません)
とりあえず、こっちのほうがみやすい。 #include<stdio.h> void func(int *a){ (*a)++; } void func2(int a){ a++; } int main() { int i = 5; printf("%d\n",i); func(&i); printf("%d\n",i); func2(i); printf("%d\n",i); return 0; }
>>464 本当にエラーか?ワーニングじゃなくて?
func2内のaは関数から出たら消滅するので、a++は意味がない
>>464 a に対して入力しかないんでしょ。
なんのために入れてるのかと。
エラーチェックならif文で使えと。
それか
return a;
とでもしろよと。
問題はこれだろ void func2(int a){ a++; } a を受け取って a++ してるが、関数が終了して捨てられる。
469 :
デフォルトの名無しさん :2005/09/22(木) 11:20:58
あのC言語はじめたばっかりで質問なんですが int *a = 5; のような式って意味ありますか?このとき右辺に なにを代入するんですか? おしえてください、よろしくです。
470 :
デフォルトの名無しさん :2005/09/22(木) 11:21:56
ちなみにint *a; a = &b;のような形ならわかります・・
>>469 charと同じ感覚で考えれば、5という数値が格納されたintの空間を参照するんじゃねーの?
どっちにしろそんなことする必要もないし、したこともないんで詳しいことはシラネ
>>471 んなわけねーだろ。
とにかくここ数日分の奴ら初心者スレに逝ってやれよ。sigh.
>>472 同一人物なんじゃないのか?
この短期間にバカが大増殖するなんて不自然だし
>>469 でもそれ、コンパイルエラーになると思うけど。
>>469 char str[] = "hello !";
char *p = str;
for ( ; *p; p++ )
{
}
strの文字をpで一文字ずつ操作
>>475 そんなのをエラーにしてたら、直接メモリ弄る時に不便なんじゃないか?
変数p ┌──┐ ┌───┐ │ │─→ │整数 │ └──┘ └───┘ この図に対するC言語コードってなんですか? structを使うらしいですがわかんないんです
質問です char a[1] = {0xff}; char *b; unsigned char c, d; b = a; c = *(unsigned char *)b; d = (unsigned char)*b; cとdはどちらも0xffになることが保証されているんでしょうか?
>>479 ドット演算子じゃなくて普通のプログラムです
>>481 保証されています。
というか、汚いです。
>>482 それから読み取れるのはドット演算子程度しかありません。どれも普通のプログラムです。
struct {
int i ;
} test ;
test.i = 2 ;
485 :
デフォルトの名無しさん :2005/09/22(木) 16:50:54
zをchar型の変数として定義して、 後の実行文で、scanf("%c",&zz); と書いているのはどういう命令になるでしょうか? Enterキーを押せという命令でしょうか?
一文字入力 て言うかscanfは暴走の申し子だから使わん方が
487 :
デフォルトの名無しさん :2005/09/22(木) 16:59:04
DWORD a; unsigned long a; これは両方とも同じ意味ですか?
>>487 DWORDは標準のキーワードではないから、環境によって答えが変わる。
インクルードしているファイルにも関係ある。
490 :
デフォルトの名無しさん :2005/09/22(木) 17:08:22
>>488 どうもです。
timeGetTime();の値を代入するので、unsigned long の方を使います。
493 :
デフォルトの名無しさん :2005/09/22(木) 17:27:02
scanfを暴走させるのはスキル不足 getsを使うのは知識不足 strtokでハマルのは理解力不足 よって、馬鹿はscanf, gets, strtokは使わない方が良い。
へー
業務でscanf()を正しく使って喜んでる奴は協調性不足
数字入力にscanf→文字入れて無限ループ 1度はこれで遊ぶ
>>494 scanfの暴走は作る側がどうにかできる物じゃねーだろ
相手を刺すと服が真っ赤っ赤になるあれか
>>499 3.整数データのキー入力
〜ちゃんと整数データを入力するまで繰り返す〜
scanfは取り込めたデータ数を返すから、
整数データが読み込まれたことをチェックし、
誤った入力なら再入力を要求すれば!...ところが...
/* scanf */
#include <stdio.h>
main()
{
charbuf[256];
inti;
do
{
printf("終了は Ctrl+C \n");
printf("Input number: ");
} while( scanf("%d", &i ) != 1 );
printf("%d\n", i );
}
/* scanfd1.c */
整数データを入力すれば大丈夫だが、
それ以外のデータを入力するとどうなる?!
scanfは空白文字までを目処に、整数とパターンマッチさせていく
それ以外の文字が入力されていると、パターンにマッチしないので、
マッチングの候補として残ったままになる→だから暴走する!
setbuf系列の関数でなんとかなった、希ガス
503 :
アホか :2005/09/22(木) 18:30:05
>>501 } while( scanf("%d", &i ) != 1 && (fgets(tmp), 1) );
504 :
訂正 :2005/09/22(木) 18:31:11
} while( scanf("%d", &i ) != 1 && (fgets(tmp, sizeof tmp, stdin), 1) );
そこまでするなら普通にscanf使わない方法で行った方がいいと思うがどうか
>>503 どこでそんな奥義を教えられたのかが気になる。
} while( scanf("%d", &i ) != 1 && (scanf("%*[\n]"), getchar(), 1) );
>>496 というより今時業務でコンソール入力とか有り得ない
>>506 scanfを使うと必ず改行か終端コード、拾い損ないの文字が入力バッファに残る。
だからscanf使用後にgetcharとかgets系使うと、scanfの成功可否に関わらず必ずゴミが入る。
scanf系で統一するならともかく(scanfは改行をただの区切り文字同様に読み飛ばす)、必ず後始末は必要。
俺はC言語見習い1年目で解決法を編み出した。大学の講義よりも2chを見ながら育った。
今は・・・廃人orz
>>508 scanfはコンソールから入力するなんて誰がそんな嘘を教えたんだ?
scanfは標準入力から入力するんだよ
昔、fj.comp.lang.cで安全なscanfの使い方のバトルをやっていたはずだが過去ログはどこに逝ったんだ? Queenがいつの間にか無くなってるし...
>>510 今話題になってるのは「scanf()からのエラー回復と再入力の方法」であって、
それはインタラクティブな利用が前提でしょ。
でもその前提そのものが有り得ない、と言ってるの。
>それはインタラクティブな利用が前提でしょ。 >それはインタラクティブな利用が前提でしょ。 >それはインタラクティブな利用が前提でしょ。 >それはインタラクティブな利用が前提でしょ。 >それはインタラクティブな利用が前提でしょ。 >それはインタラクティブな利用が前提でしょ。 >それはインタラクティブな利用が前提でしょ。
>>513 インタラクティブな利用以外で、「単に行末まで読み捨てて再入力を求める」
形式のエラー回復を求める例って何があるの?
そうか、電算機時代の人がいないのか・・・
>>515 今時カードとかテレタイプとかの話をしてもナンセンスでしょ
scanf()のインタラクティブな利用における典型的な問題を議論しても
これまたナンセンス。
(暗黙にインタラクティブな利用を前提とした)下らないエラー回復方法が
不要であれば、単に
while (scanf("%d", &n) == 1) {
/* do something */
}
if (ferror(stdin)) {
/* なんかエラーがあった */
}
のように書けばよいだけの話。
ひどい逆切れだ。みっともない。
都合の悪い事は無視か。みっともない。
>>519 誰のどのレスのどこが都合が悪いんだかちゃんと言えよ
馬鹿ですね。
要するに
>>512 >>514 >>516 に具体的に反論できる人間は居ないということだね
にもかかわらず前時代的で手垢のついたどころじゃない
scanf()のエラー回復と再入力の問題を未だにやってるという訳だ
バカばっかだな
なんだ?ホームラン級のバカの登場?
524 :
デフォルトの名無しさん :2005/09/22(木) 20:12:18
さらしあge
>>516 >カードとかテレタイプ
違うって。そのころはCそのものがまだなかったよ。
電算機を使える時間は限られてるし、プログラムは多くを使いまわしてたから、
自然とキーボードから入力するようにプログラムを組んで、実際に走らせる時は
リダイレクトを使ってファイルから読み込ませて結果を吐かせるわけで、
しかもそのファイルの一部にミスがあったとしてもある程度の結果がないと
飯が食えなくなるわけだから、そういう場合のエラー回避等々が非常に重要になってくる。
今帰った俺にも。とりあえず、scanfは標準入力からの入力だということはわかった。
>>525 テレタイプの時代にはあるでしょ。UNIXのttyはその名残なんだから。
そういう利用を行うテキストアプリケーション
(と呼ぶべきかどうかは微妙だが)
に対してユーザ入力をさせる、そういう「業務」形態はもう有り得ないでしょ?
と言ってるの。
で、「有る」としても、そのようなものを作る場合、エラー個所を示すために
普通は行番号が欲しいから、どのみちscanf()なんてものを使うことは
業務では絶対にありえないの。
だから、scanf()でインタラクティブな入力をさせてエラー回復を試みる、
といった想定そのものがナンセンスなの。
基地害がいらっしゃるようです
だから煽ってるだけの奴はちゃんと内容に対して反論してみせろってw
ナンセンスなのは確かだけど。 「業務であり得ない事は話題にして悪いのか否か」は決まっているの?
scanfなんかどうでもいいよ。 そんなくだらないことよりビットシフトの使い道を教えろよ。
基地害というか、場違いだな
ちなみに、CのCGIは、通常何を使って標準入力から読み込むの? fgets ?
>>530 単に
>>516 のような方法を教えればよい。「scanf()なんかを使う」ケースでは
事実上それで十分なんだから。
それ以上の議論は無駄でしかない。
>>527 > そういう利用を行うテキストアプリケーション
> (と呼ぶべきかどうかは微妙だが)
> に対してユーザ入力をさせる、そういう「業務」形態はもう有り得ないでしょ?
> 普通は行番号が欲しいから、どのみちscanf()なんてものを使うことは
> 業務では絶対にありえないの。
君の言う『業務』ならありえないだろうな。
研究職じゃまだあるよ。
欲しいのが行番号というのは扱うものの違いもあるだろうね。
修正は行番号で行うのは結構大変だよ?
正規表現でやった方がいいからマーカー挟めばいいんだし。
最近じゃ時間単位じゃなくて年契約だったり(並列処理ってすばらしい)、
プロジェクトの審査とかで割り当てられたりで状況はある程度変わってるけどね。
#しかしあのころのCをCだと主張してほしくなかったな。
>>535 > 修正は行番号で行うのは結構大変だよ?
viならnGで一発ですが。
行番号指定して移動できないエディタのがめずらしかろう。
>>533 んなもん色々だろ
Content-Length信じてガバっとmalloc()してfread()の場合もあるだろうし
>>536 つうか、もともとラインエディタをスクリーン表示に対応させただけの代物だから
行指定できないほうがおかしい罠。
漏れは禿丸でスクラッチしてFTPで転送したり、小物ならcatで垂れ流したりする罠。
>>536 あなたが想定するファイルは何行あるんです?
まさか一行一行移動して手で添削するんじゃないでしょうね?
それに数値解析系の入力データのミスは似たり寄ったりなものが多くて
正規表現で一括置き換えやんないと間に合いませんよ。
んーーー ここはやはりed
この不能め
すいませんvi使えません
>>539 無論「エラー情報をどう出すのが適切か」ってのは
扱うデータやプログラムの性質に依存するよ。んなの当たり前。
「行番号」はもっとも典型的で汎用的な伝達手段であるから
示したに過ぎない。コンパイラやインタプリタの類なども
普通はそれを示すしな。
あんたの言うケースのように、もっと別のもの(例えば正規表現
パターンとして利用可能なエラー行のリスト)のようなものが欲しい場合は、
エラー行そのものをstderrなどに流し、それをそのまま再利用する
のが一番単純で確実。
そして、いずれにせよそうするなら、行志向でないscanf()は
ふさわしくないわけだ。
俺もvi嫌いだ
このスレは我らemacs党が占領した。 大人しく降伏したまえ
なんかキモイ! キモイだめしですか?
Meadowなんか重くて使う気にならん。
Visual Studio.NEET
大学入学当初からMeadowを使わされました もうめろめろです
>>543 普通は普通はってそれしか言えないんですかね?
失礼。
なぜ行志向にこだわるんです?
キーボードから入力する時の利便性と、リダイレクトする時の整合性とを考えれば
行志向そのものがあまり重要ではなくなりませんか?
#エラー行そのものを吐いた時、そのデータ分の金は天引きですよ?
#と書いていてそろそろC言語そのものから遠ざかっているような気が
>>550 課金が五月蝿いメインフレームorスパコン系の人?
行志向に拘るのは、あんたの想定してるようなテキストアプリケーション
主体の環境において、それがもっとも自然な形態だから、だよ。
システムお仕着せのレコード区切りの無いUNIXのようなシステムでは
多くの場合行がレコードの代わりであって、
事実UNIXの多くのコマンドラインツールは行志向だ。
すまんがメインフレームやスパコンの話はよく知らん。
データセットからscanf()で読むのが自然か?といわれると
俺はうーむ、と思ってしまうが、まあよく知らんのでなんとも言えない。
viの存在意義がいまいち分からない このスレにいる奴らも頭いいのか悪いのか分かんない
>>552 viは現存するUNIXなら普通は入ってる。
emacsは入ってはいないものと思わなければならない。
>>552 真面目につっかかってきてくれる人が約一名いるけど
他にただ煽ってただけの奴等は、まあバカだな
まともに反論もできない、煽るしか能のない奴等だ
viは小さくて大抵の環境に入ってるからね。 Emacsはデカイからコンパクトなシステムには向かない。 telnetさえ使えればWindows上で好きなエディタを使うよ俺は。
>>555 ここまで読んだ。
お前が一番バカだと自覚してる?
>>556 telnetでファイル転送するのはつらくないか?
ssh, scpの間違いだろ?
>>557 反論できない以上、お前は煽るしか能の無い馬鹿
よくviしか入ってないような環境って言うけど 今までそんな切実な現場に立ち会ったことがないです
>>560 そーか?
仕事で使うUNIX鯖とか、いちいちemacs入れないぞ?
不要なものは入れない、これ基本
まあ、他でエディットしてファイル転送すりゃいいから、
困らないっちゃ困らないかもしれないけどな
>>562 だから、俺が何を無視してるんだか言ってみろって。
プログラムしてたら, error: tow types specified in one empty declaration というエラーが出てきたのですが,これの原因ってどんなことが考えられますか? また,簡単な事例はありませんか? よろしくお願いします
>>551 すみません。ようやく認識のずれが分かりましたよ。
>あんたの想定してるようなテキストアプリケーション
ここですね。自然と思うものが違うのだから言い合いになるのは当然でした。
私は君の言う『業務』なら(ryってところで伝わったと思い込んでましたしね。
私が想定しているのはテキストアプリケーションではなく、数値解析や有限要素法等の物理シミュです。
シミュレーションとかでモデルデータを叩き込む場合、自分の所の環境では手で小規模のを入力して試し、
課金が五月蝿い(w)メインフレームorスパコンで走らせる時にリコンパイルだけで済ます
ためにリダイレクトでそのままやるわけですが、質量分布の指定等を手入力する時に
行志向だと大勢くたばりますので。
ある意味好き勝手に入力できるscanfの方が使い勝手がいいんです。
よって、そのエラー回避が非常に重要になるわけです。
研究職と言う名の税金泥棒コレキタ ろくな研究やってないくせにww
ニートに税金泥棒って言われたらおしまいだな
質問です struct Chip { int m_nNumber; BYTE m_byImage; }; ↑の構造体を cout << sizeof(Chip) << endl; とやってみたらサイズは8と出たんですが、 int + BYTE = 5 ではないんでしょうか? どういう計算で8と出るのでしょうか どなたかお願いします m(__)m
575 :
デフォルトの名無しさん :2005/09/22(木) 22:05:35
>>574 感謝です!
コンパイラによって変わるのか orz
なあ、scanfがらみ周辺でよたってた君ら、今度からコテハンつけてくれ。 そのほうが少しは他の迷惑にならないから。sigh.
独学でC言語を1から勉強したいんですけど、 おすすめの書籍やサイト等を教えてほしいです。 よろしくお願いします。
>>579 おまえ、ここに来た時点で独学じゃない。
∧_∧ ( ´∀`) おまえ /, つ おちけつ (_(_, ) しし'
独学ってのはなぁ、俺みたいにヘルプを見るだけで試行錯誤して覚えるようなもんなんだよ。 本を読んだ時点で独学失格! でも、独学失格した方が絶対いい。
>>583 教えてもらえる人がいて
その人が素直に教えるかが問題
俺の場合は ヘソ曲がりだったので独学だった
つーか 他人アテにしたらなんにもミニつかん
効率はいいけどな 多分
アテにするだけは身につかんね。 やっぱり教えてもらうにしろ、 自分でいろいろ試行錯誤しないと身につかん。 ただ、全くの独学は効率悪すぎると感じた。
ほとんど2ちゃんねらが先生だな、俺・・・
2ちゃんが無くて、ネットも気軽に使えないような頃に学んだ俺は、 雑誌に連載されるC言語講座だったなぁ
588 :
デフォルトの名無しさん :2005/09/23(金) 05:06:15
有識者の人へ。 Windows上のC言語でお勧めの環境はどれですか? いろんな前提要件抜きでバシッとマジレス希望。 或いは、各々の特徴を述べ立てて比較検討希望。 よろしくお願いします。マジでお願いします。
純粋にC言語をやりたいなら、俺はあえてCygwin&GCCを推してみる。 CはUNIX系OSでやるものだ。 あとMacOS Xかな。
問題はエディタ
xyzzyとか。 学生なら禿丸使っとけ。タダだ。
はげ丸?
>>589 >CはUNIX系OSでやるものだ。
早朝から馬鹿はっけん!
594 :
デフォルトの名無しさん :2005/09/23(金) 05:59:50
#define Str(x) #x #define Xstr(x) Str(x) #define OP plus char *opname = Xstr(OP); main() { printf("%s\n", opname); } これで plus が出力される理屈を教えてください。 OP -> plusはいつ変換されるんですか?
>いつ んなもんはコンパイル時だろ
596 :
デフォルトの名無しさん :2005/09/23(金) 06:05:03
うわ、馬鹿がきた・・ 誰かお願いします
>>593 ごめんw 軽くボケてみた。
つか、Windowsだと、かえって実行環境整えるのが面倒だろ。
コマンドラインシェルとかフルセット揃ってる環境から入るのが一番いいかと。
文部科学省の方針で大学の情報系学科ではUNIX環境を使うことを推奨している
いちおうCygwinもその範疇に入っているはずだが。
knoppix2win
599 :
デフォルトの名無しさん :2005/09/23(金) 06:56:28
#define Str(x) #x #define Xstr(x) Str(x) #define OP plus #define plus minus char *opname = Xstr(OP); char *opname2 = Str(OP); main() { printf("%s %s\n", opname, opname2); } の結果は minus OP でした。 2つはどこで変わったのでしょうか
600 :
デフォルトの名無しさん :2005/09/23(金) 07:03:19
あ、もういいです それと 氏ね>595
ちょっとワロタ、というか和んだ。
>>594 ツリに見えるがマジレスしておくと、(unixの処理系に限った話かも知れないが)
コンパイル以前のプリプロセシングフェーズ(cpp)において
char *opname = Xstr(OP);
が
char *opname ="plus";
に変換される。
unix の処理系に限った話ではない。
builderの無償版があるときいたのですが拙いですか
スレ違いです。
610 :
588 :2005/09/23(金) 16:14:05
議論が発散してるのでもう一度、質問を書く。 『有識者の人へ。 Windows上のC言語でお勧めの環境はどれですか? いろんな前提要件抜きでバシッとマジレス希望。 或いは、各々の特徴を述べ立てて比較検討希望。 よろしくお願いします。マジでお願いします。 』
>610 前提要件抜きでバシッとマジレス LSI-C86 おまいには、これで十分。
>>610 んじゃ、マズレス。
Windows上で今更Cを使うメリットは皆無であり、せめてC++を使え。
以上。
613 :
篠 :2005/09/23(金) 17:10:54
>>610 有識者に意見を求めるのなら、分別ある言動をとってください。
3つのスレでその書き込みを確認しましたが、マルチと呼ばれる行為です。
荒らしにもなりかねず、嫌われる行為です。
議論が発散しているなんてことでは全然ないんですよ。
頭の悪さを露呈する言動は止めるべきです。出直しなさい。
「いい加減目覚めなさい」
”運が良ければ”誰かが教えてくれますよw
>>610 前提要件抜きで決められるわけないだろボケ
討論はスレ違いだボケ
ニートは黙ってろww
cygwinとかmingwだとぐちゃぐちゃになる のが嫌な場合、 SFUじゃないかな 無料版あるし コンパイラはgccと、cl(あれば)が使える
618 :
デフォルトの名無しさん :2005/09/23(金) 18:17:52
>613 結局のところ、オマイ自身は588に対してなんの回答もしてないくせに エラそうだな イバりたかったらまず回答しろ それでオマイの力量がわかるw
Windowsなんてクソ小汚い環境でプログラミングするなんてキチガイ
620 :
豆 :2005/09/23(金) 18:29:44
確かにWindowsのCの環境って、GUIとCLIの違いとか ライブラリの違いとか、正直何がいいかようわからん。
討論すると奴の思う壺だぞ。
基本的にコンパイラはどれ使っても出来ることに大差はない。 VC++ MinGW gcc Boland あたりがメジャーどころ。 差が出るのはコンパイラじゃなく開発環境の方。 VC++ は統合開発環境がついててとっつきやすいかも。 Boland にはフリーソフトで統合開発環境がある。 gcc と MinGW は純粋にコンパイラだけ。コンソールでコンパイル。 あと、boost と STLport は使っといて損はないと思う。 いじょ、マジレス。
623 :
豆 :2005/09/23(金) 18:36:00
連続カキコすまそ。 Windows用のものを開発するって決まっているんであれば、 なんだかんだVS.netがいいのか?それともBorlandとか? 評判も賛否両論だし、ようわからん。詳しいやついねーか? CLIだったらUnix系のCygwin+GCCあわせ技とかがいいのかなぁ。 UNIXに乗り換えも簡単そうだし。。 誰か結論をまとめてくれ。
さ ぁ 熱 く な っ て ま い り ま し た 。
SFUもCygwinもいらね。 ・LinuxとWindowsのデュアルブート。 ・LinuxでGCC+GDB。 ・WindowsでVS.net(有償の場合)、Borland(無償の場合)。 ・当然Windows上にはTeraterm、X必須(Win ClientからのUnix Server remote accessのため)。あとTeratermにSSH仕込むの忘れないで。 これでほとんどパーペキな環境。あとはプログラマのポテンシャルだなw
627 :
デフォルトの名無しさん :2005/09/23(金) 19:07:13
アドレス渡しを使った関数の利用で初歩的なんですが void in(int *a,int *b) { scanf("%d %d",a,b); } int main(void) { int a,b; in(&a,&b); printf("%d %d",a,b); } というのができますよね? これと同じことを構造体の場合でもやりたいのですがうまくいきません とりあえず今わかる知識でソースを書いて見ましたがエラーが出ます やりたいことは構造体のメンバreとimがあり、関数inで数値を入力しメイン関数で表示 したいんです struct comp{ int re,im; }; void in(int a.re,int a.im){ scanf("%d %d",a.re,a.im); } int main(void) { struct *a; in(a->re,a->im); printf("%d %d",a.re,a.im); }
>>627 struct comp {
int re, im;
};
void in(struct comp *c)
{
scanf("%d %d", &c->re, &c->im);
}
int main()
{
struct comp a;
in(&a);
printf("%d %d", a.re, a.im);
}
突っ込みどころ満載だな。 >struct *a; structだけじゃだめだろうに。 しかもこれだけじゃ実体がないじゃないか。 >void in(int a.re,int a.im){ 意味不明。関数にaは関係ない。 void in(int *re, int *im) か void in(struct comp *a) にしろ。 >in(a->re,a->im); これは値渡し
>>627 やりたいことは分かるが、まず宣言が違う
structだけじゃ意味がない。構造体変数の宣言はstruct タグ名 変数名;
それにポインタだけを宣言しても意味がない
mallocなりcalloc、allocで別途領域を作ってやる必要がある
それとin()の仮引数名もおかしい
>>626 ・・・で、VSとBorlandどっちがいいんだ?
または他のIDEとの差異(長短)は?
論点は「Windows上のC」だろ。そこが問題なのでは?
つまりあんな質問になに薦めても無駄なのでみなレスやめるよろし。
そもそもどの程度の規模のCを使うつもりなのか 勉強やそれに毛の生えた程度ならVSとかのIDE使うのは冗長 Cygwinが一番手っ取り早い+扱いやすい 逆に有る程度の規模のを作るならIDE必須 要は場合に依りけりだろ
>>628 の人のソースに加え・・・
#include <stdio.h>
#include <stdlib.h>
struct comp{
int re,im;
};
void in( int *re, int *im ) {
scanf("%d %d",re,im);
}
int main(void)
{
struct comp *a,b;
a = &b; // ミソ [a = (struct comp*)malloc(sizeof(struct comp));]でもいい
in( &a->re, &(*a).im ); // &a->re つまりは &b.re に同じ reのアドレスを渡す (*a).im もまた同様の解釈
printf("%d %d\n",a->re, b.im);
}
色々改造してポインタを理解するよろし
>>633 Cygwinってそんなに手軽か?
お絵かきソフトとかちょろっとしたCOMサーバ、
COMのホスティングとか簡単に出来る?
Windowsプログラミングの典型的な例だが
俺は何も考えずVisualStudio.NET推奨
BoostとATL/WTLで逝け
Cは使い物にならんから捨てろ
ただしVS.NET2003を「今」買うのはタイミング的にアレなのでやめとけ
個人的にゃ2005のインターフェースはアレだけどな
そういえばPlatformSDKにATL/MFCの(かなり古めの)ソースついてるけど あれってコンパイルして他環境で使えるの?
638 :
廃人 :2005/09/23(金) 20:26:05
>>635 俺もC覚えた手のときそう言われてMFCを嫌ってWTLからWindowsプログラミング始めますた
>>638 「わたしはコレで廃人になりますた」
とでも言いたいのか、チミは!
640 :
デフォルトの名無しさん :2005/09/23(金) 21:21:36
教えください if( 0==abc( x, y) ) みたいに、if文の条件を慣習的に書いてるのですが if( abc( x, y)==0 ) と書くよりも何か利点があったような覚えがあるのですが 忘れてしまいました。 ご存知の方、教えてください。
>>640 =を一個打ちそびれて
a = 1 これはコンパイル通る
1 = a これ書き間違えたらエラーとなるけど、これの場合は・・・
>>640 abc()がポインタを返す場合等、
if(abc(x,y)=0)と間違った場合、コンパイル時にエラーとして発見できない
>>640 それfjとかではヒンシュク買ってたテクだな
if (1 == x) とは書かないが if ("0".equals(str)) とは書くな、Javaとかで。strがnullでも大丈夫だから。
645 :
640 :2005/09/23(金) 21:32:17
>>641 ,642 dクス!!そうでしたね!!
もやもやが晴れますた。
社内にクソなmyコーディング規約を押し付ける厨がいるので
これで反論できます。
>>643 なぜ、ヒンシュクなんでしょう?
>>644 Javaは関係ないです
>>640 初心者っぽい書き方をしておけば、注意深くソースを見てもらえる。
>>645 反対派から言えば「直感的じゃない。」
それに最近のコンパイラは警告出してくれるしね
>>645 if 内で代入文書いたら、普通コンパイラが警告を吐く。
読みにくくなるだけで、大した効果はないオナニーテクだから。
全てのプロジェクトが最新のコンパイラを使ってるとは限らん。 改修なんか昔のだったりする。
= と == を打ち間違えるような、三流派遣プログラマのまねをすることはない。 自然に読めるように「if (abc(x, y) == 0)」と書きなさい。 日本語にすればわかるでしょ? 「もしゼロがabc(x,y)ならば」と「もしabc(x,y)がゼロならば」と どちらがわかりやすいか。 タイピングミスを怖がって、不細工なコーディングをするものではありません。
if (p = strchr(s, '\n')) *p = '\0'; のようなコードを良く書く俺にとっては 警告も余計なお世話なんだが、まあ広い目で見たら しょーがないやね
>>649 コードをチェックする方法として、コンパイラしか知らないってのは
プロとしてどうかと思う。
コンピュータ言語と日本語を同一化するのが信じられん。 普通英語で考えろよ。 おまえ、クソコーディング規約厨だろ。
不思議なのはそんなクソな理由さえわからずにそんなクソコードを 書いてる厨が、人をクソなmyコーディング規約が押し付けで反論の 余地と必要があると思っている点だなあ。どっちもクソ厨だからやめれ。
昔のCRTは性能が悪くて = と == の区別がし辛かったんだよ
>>654 英語でも同じだけどな。
if abc(x,y) equals to zero, ....
神経質な人がいっぱいですね
>>656 昔の端末なら80x24程度で24ポイントのフォントだったりするから
全然見づらくない気がするんだが
いずれにせよ気になるんならlintを使え、が昔のやり方。
昔のコンパイラは今ほど親切でもお節介でもなかったからな。
>>656 昔はソースリストを打ち出して、チーム全員で赤ペン持ちながらコードチェックだ。
>>656 昔は、プロポーショナルフォントでコーディングすることなんてなかったから、
= と == は、幅だけで十分に区別できます。
え?今でもプロポーショナルフォントではコーディングしないだろ? 少なくともC界隈では。 やってる奴がいるとしたら、信じられない
664 :
デフォルトの名無しさん :2005/09/23(金) 21:48:07
>>660 if (*abc(x,y) = 0) じゃないんだよ。 アンダスタン?
区別できるとか言ってる人は、現物見たこと無いんですねぇ。 年寄りの昔話スレじゃないのでこのへんでやめときますけど。
>>664 int* abc(x, y){
static int p;
return &p;
}
のつもりだったんだけど
おまえらどうでもいいことですぐムキに(ry
つーか0と比較するやつが馬鹿
falseと比較するやつは馬鹿と思うが、 0との比較は構わんと思う。
つーか、 全角と半角の区別ができないやつとか、 大文字と小文字の区別ができないやつとか ー と − の区別ができないやつとか = と == の区別ができないやつとか 注意力が不足しているやつはプログラムしなくていいよ。
0は例えだろ。 falseでも明示的にif文の条件に書けと規約厨は言う。
672 :
デフォルトの名無しさん :2005/09/23(金) 22:19:03
唐突ですが、実務家(金融系)はC++を使うらしいんですよ。 んで、Cはある程度知ってるんですがC++はまるで知らないわけでして 何で勉強するのがお勧めでしょう? 質問スレで推薦図書池言われましたが、にぎわってないみたいなんで、 できればよろしくお願いします
>>672 推薦図書池
大丈夫、あそこは質問を投げかければ自然と人が集まってくる。
スレ違いがわからないようなやつに、答える筋合いはない。
なんでプログラムするヒトは高圧的なヒトが多いんですか??
必死だな!www
677 :
デフォルトの名無しさん :2005/09/23(金) 22:25:54
679 :
675 :2005/09/23(金) 22:44:25
>>678 なるほど。
熱いヒトたちなんですね^^
これからもIT業界、電機業界を支えてくださいね!
経験やテクの無いやつが反対するんだよな 例のif文
三流派遣プログラマとしての経験かね?
>>675 プログラマの心理をまじめに分析すると、
普段プログラムで概ね思い通りの物を作ってるからじゃないかな。
うまくいかない事象に対面すると、どうしていいか判断できなくて、
癇癪を起こしたり、普段行っているプログラムを書くように
高圧的になったりする。
683 :
デフォルトの名無しさん :2005/09/23(金) 22:55:40
白熱しているところ、話の腰を折って申し訳ありませんが、 C言語をはじめたばかりであまりわからないのです。 ビットシフトはなんの役に立つのでしょうか?
定番のコピペを張るときにネタとして使う。
686 :
675 :2005/09/23(金) 22:59:46
>>682 なるほど・・・
純粋なかんじですねw
でも、気難しいヒトほど、プログラムやその他創作活動に優れているような印象を受けます。
環境に馴染むことでなく、創作対象によりエネルギーを注がれているからかもしれませんね。
プログラマの心理としては、普段のプログラムでうまくいってる事を、 現実にも写像したがる。 現実を眺める時間よりも、プログラムを読み書きしている時間の方が 長かったりするとこういった症状が出やすくなる。 つまりプログラマは人付き合いが下手糞なんだよね。
過度の反復による虚無感を伴った笑いを取れる可能性がある。 ツマンネェヨ
処方としては、やはり現実と向き合う時間を多くとる事かな。 例えば症状が重い人の場合プログラムを読み書きすること自体が 現実逃避の手段になってるわけだから、その人からパソコンを 取り上げてしまえば、自殺するかもしれないね。
プログラムかわいいよプログラム 犬なんかより、よっぽど忠実に働く
プログラムで動いてるAIBOはかわいくないけどな
692 :
select :2005/09/23(金) 23:10:58
select() システムコールで待機中のプログラムに対して gdb で attach したところ、select() の呼び出しフレームが __DTOR_END__ となってしまい、呼び出し元の関数名が取得できませんでした。 呼び出し元の関数名を取得するにはどうしたらよいのでしょうか? どなたかご教授願います。 (続く)
693 :
select :2005/09/23(金) 23:11:51
【attach 時の bt 出力】 ---------------------------------------------- (gdb) bt #0 0x400f5a92 in select () at regexec.c:1576 #1 0x40155968 in __DTOR_END__ () from /lib/i686/libc.so.6 #2 0x40034c1f in __libc_start_main (main=0x8048348 <main>, argc=1, ubp_av=0x0, init=0x80483b0 <__libc_csu_init>, fini=0x80483f8 <__libc_csu_fini>, rtld_fini=0, stack_end=0x0) at ../sysdeps/generic/libc-start.c:225 【環境】 ---------------------------------------------- OS : Vine Linux 3.1 kernel: kernel-2.4.27 libc : glibc-2.3.3 gcc : gcc-3.3.2 gdb : gdb-5.2.1 【ソース】 ---------------------------------------------- int main(void) { fd_set readfd; FD_ZERO(&readfd); FD_SET(0, &readfd); select(1, &readfd, NULL, NULL, NULL); return 0; }
>692 たぶんthunkが噛んでいるので、その一つ上(下?)が呼びだし関数。
695 :
select :2005/09/23(金) 23:23:05
ご回答ありがとうございます。> 694 thunk ですか・・。 ググッってみたのですが、thunk というものが何なのか分かりませんでした^^; もしよかったらお教え願います。 あと追加情報ですが、待ち状態に入る直前までは、次のように main() から select() が呼び出されていることが分かります。 ------------------------------------------------------------ #0 0x400f5a60 in select () at regexec.c:1576 #1 0x080483a2 in main () at a.c:11 #2 0x40034c1f in __libc_start_main (main=0x8048348 <main>, argc=1, ubp_av=0x1, init=0x80483b0 <__libc_csu_init>, fini=0x80483f8 <__libc_csu_fini>, rtld_fini=0x400144a0 <_rtld_local>, stack_end=0x0) at ../sysdeps/generic/libc-start.c:225
派遣のほうが社員より収入高いよ。 俺なんかフリーランス月収60マソ@26歳
>>696 フリーで1人月60って別に高くないような・・・。
目先の金しか見えない人だろ
699 :
デフォルトの名無しさん :2005/09/23(金) 23:39:29
26歳で月60も稼ぐんだ。すげえ
稼働時間にもよるな。
>>695 【名-2】 《コ》サンク◆16ビットのメモリアドレスを32ビットに変換すること。
またはその逆。転じて別アーキテクチャのコードを読み出すこと。
16ビットと32ビットのプログラムではメモリアドレスの振り方が異なるので、アドレスの変換をして呼び出す必要がある。
703 :
select :2005/09/23(金) 23:58:20
ありがとうございます。>695 thunk の意味はなんとなく理解できましたが、 この現象とどのように関わっているのかが正直分かりません。 難しいです・・・;;
関数名の最初が _(アンダーバー)で始まる名前を つけたがる人がいるんですけど これってどうよ。
見づらい そんだけ
>>706 カーネルやライブラリのコード追ってりゃ嫌でも慣れる罠
708 :
廃人 :2005/09/24(土) 00:56:38
C++で踏み台として使うprivateなメンバ関数に使うかな。
なぜC++の話が出てくる?
710 :
廃人 :2005/09/24(土) 01:04:50
逆にそれ以外じゃ自分で命名しない。 処理系依存でデフォで用意されてる関数に使うものだろ。
まだ日本語を勉強中だから
>>710 答えになってない
なぜC++の話がでてくるんだ?
まったく関係無い事を、さも正しいかのように語る、詐欺師の手法です。
borlandのフリーの統合何ちゃらって builderX personalでいいの? これって十分使えるの?
有償のbuilderと比べてどうなの
>>716 製品版との機能差ならBoland行って自分で調べて来い。
そんな事より、自分で試してみたらどうだ?
お前にとって使えるものかどうか。
初心者だから決めかねてるんだろが だいたい試すったって初心者にはよく分からんだろが いろいろ聞いてやってみるかどうか考えてんだろ だいたいこのスレはこういうことを聞くスレじゃないのかよ 自分で試したらどうだ?って・・・
>>718 >だいたいこのスレはこういうことを聞くスレじゃないのかよ
違う。
>>712 >>705-707 >>710 という流れじゃないのか?
正確に言うと、
(1) 下線に続き大文字か下線で始まる識別子は予約識別子である。
(2) 一般識別子とタグがファイル有効範囲で使われる場合については、
下線で始まる識別氏は予約識別子である。
つまりは、ファイルスコープでなければ、
下線に続き小文字か数字で始まる識別子は予約識別子ではない。
まあ、普通は使わないけど。
下線使いたければ、最後につけるべし。
>>721 いやだから、何故このスレでC++の話題が>708で出るかって話でしょ。
釣りでも何でもないじゃないか・・・。
名前欄やメール欄に「釣られてみる」とか書いてる奴は最強のヘタレ
それに反応してる香具師もなw
なんでこんなにムキになる人間が多いのか それもくだらんことで
師匠お慈悲を〜
>722の方は消し忘れ。
mallocしたあとfree忘れるようなやつだな 最低だ
>>730 だってreallocしたときにアドレス変わってたんだもん
とかいうやついるよね。
無条件に「自分で調べろ」って言うヤツは、要はソイツも知らないってコト これ以上自分の不得意分野での議論が始まることを避けたいという深層心理に よる言動ナリ ダセ
>>733 どこにいるのか分からない…
突然出てきた奴がウォーリーでつか?
昔はこんなのに一生懸命になってたんだよな。本まで買って。 ひさしぶりにやってみたけど、これほどつまんないものだとは思わなかった。
テキストファイルを一行ずつbufに読んで出力する処理なんだけど、 while (!fgets(buf, sizeof(buf), fp)) printf(buf); だと問題ないけど、 while (!feof(fp)) { fgets(buf, sizeof(buf), fp); printf(buf); } だと、最後の行が二度表示されるんだ。どうしてなんだ?
>>737 fgetsは最後まで読み取った段階でEOFをセットするわけじゃなく
最後まで読んで、なお読み込もうとした時にEOFをセットするから。
おまい、feof() の意味わかってんのか? "今eofかどうか"を調べんだぞ? fgets()とかしてからでないとeofに達しないじゃないか
>最後の行が二度表示 ちなみにこっちは、fgets()が失敗してもバッファクリアしないからたまたま表示されるんだな 気になるならfgets()する前にバッファクリアしとけ(多少は気にならなくなるだろw)
2分木のファイル書き込み、ファイル読み込みってどうやるの?
どうって? ツリー順に書き出し 読み込み時は読みながらツリーにしていく ってことでなくて?
アドレスのリンク張り直ししないといけないから、ただの読み出しじゃぁーできなくない?
744 :
737 :2005/09/24(土) 15:37:17
dowhileをつかえばいいっちゅうことだな。 ありがとよ。
>744 いきなりfgets()が失敗するケースにもちういしる!
746 :
737 :2005/09/24(土) 15:41:25
って、dowhileでうまくいくのは錯覚だった
というか意図的にループの中にfgetsを使う場合はifで結果をチェックしてbreakしる
while (!fgets(buf, sizeof(buf), fp)) printf(buf); だと問題ない ならそれでいいやん?
749 :
デフォルトの名無しさん :2005/09/24(土) 15:49:47
突然ですが、教えて下さい。 scanfはバッファに\nが残って時々悪さを しますよね? そこで下記マクロを考えてみました。 これで防げない不具合や何か問題あれば教えて下さい。 #define prl(x) (printf(x"\n"))//これはオマケ。 #define scanpoi(i) (prl("整数を入力しEnterを押す。"),\ scanf("%d",&i),\ rewind(stdin)) #define scanpos(s) (prl("文字列を入力しEnterを押す"),\ scanf("%s",s),\ rewind(stdin))
750 :
デフォルトの名無しさん :2005/09/24(土) 15:51:31
int mono=123; int situ=1.23; printf("mono1:%1d\n",mono); printf("mono2:%2d\n",mono); printf("mono3:%3d\n",mono); printf("situ1:%1d\n",situ); printf("situ2:%2d\n",situ); printf("situ3:%3d\n",situ); などのように%dの記述を変える意味を教えてください。 また、"%5.2lf ",a[i]; という記述の意味も教えてください
非seekable deviceに対するrewind()の挙動って保証されてたんだっけ?
753 :
750 :2005/09/24(土) 16:02:21
>>751 指定されたサイト見てもよく分からないのですが。
簡単に説明していただけませんか。すみません。。
>>753 簡単も何もそこに書いてあるのが全てだろ
つーか、あれが理解できないなら向いてない
それって2度読み法使うんじゃないよね
756 :
セェンロン ◆89nOjCFiLI :2005/09/24(土) 16:45:53
http://firepro.circle.ne.jp/ ここの作者がなかなか更新してくれないから、自分で同じようなの作ることにしたんだけど、、、
最初の画面の、エクセルっぽい(ぽくないかもw)一覧ってどうやって作るの?
ソートしてくれるのがすっごい便利で、是非使いたい。
リソースのダイアログの中にあるんかなぁ〜と思ってたら、無くて困ってます。
エロイ人教えてください。おねげーしますだ。
758 :
デフォルトの名無しさん :2005/09/24(土) 17:07:27
realloc Returns! 安全第一のプログラマ用にさらに進化した reallocです。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void){ char *jo=(char *)NULL;//処理系によってNULLにもキャスト。 if(jo==NULL) //初回判定 jo = realloc(jo,60 ); if(jo==NULL){ jo= realloc(jo,0); return 1; }//エラー処理、さすがにエラー処理のエラー処理はしない。 //誤って jo = realloc(jo,60); //とやっても全然問題はない。 strcpy( jo, "Nissyはどんな時でもサンダルを愛用する、" ); if(jo!=NULL)//2回目判定 jo = realloc( jo, 120 ); strcat( jo, "という事は、水虫じゃないか!\n" ); if(jo==NULL){ jo= realloc(jo,0); return 1; }//エラー処理。 printf( jo ); jo=realloc( jo,0 );//メモリーの始末 jo=realloc(jo,0); //2回やっても問題はない。 return 0; }
759 :
デフォルトの名無しさん :2005/09/24(土) 17:07:57
全ての構文がjo=realloc( jo,size )と条件文 if(jo==NULL)で統一されました。かつ安全性も極めて?高い。 但しこの統一性と安全性にはコストがともなう。 最後のjo=realloc( jo,0 );の左辺のjo(NULLポインタ?) はいつ消えるのであろうか?
760 :
デフォルトの名無しさん :2005/09/24(土) 17:08:48
ふと思ったけど最新Cドラフトのセキュアライブラリってどうよ
malloc,freeでいいじゃん
ASROC
763 :
セェンロン ◆89nOjCFiLI :2005/09/24(土) 17:23:53
>>762 ASROCでググったら、ListViewってのが出てきました。
これです!やりたかったのは。
ありがとー♪
工工工エエエエエエェェェ(゚Д゚;)ェェェエエエエエエ工工工
765 :
デフォルトの名無しさん :2005/09/24(土) 18:23:38
>751 >scanf("%d%*c", &i); >でいいやん %*cって…キモイやん。 rewindの方がまだマシでっせぇ。 >752 VC++では問題なく動いてます。 保証と言われても困るが…
つーかさ、scanfはエラー処理とか考えるならfgets+sscanfでそ?
某サイト、scanf対策を偉そうに書いときながら 配列より入力された文字の方が多かったときの事考えてなくてワロタ
scanf("%*[^\n]%*c");
正規表現使えるんだっけ?
768程度のものなら使える
>769 一回ぐらいは、きちんとprintfのマニュアルを読んだほうが良い。
772 :
デフォルトの名無しさん :2005/09/24(土) 19:02:05
s/printf/scanf/
773 :
デフォルトの名無しさん :2005/09/24(土) 19:11:15
つまり、みんなPerlを使え、ってこと?
いい加減スレ違いだがね。 最低限、マニュアルくらい読んでから書けよな。
cell cell ┌──┐┌──┐ ┌──┐┌──┐ │整数││ │─→ │整数││ │─→ ・・・ └──┘└──┘ └──┘└──┘ 欄名 data next data next この図はC言語の構造体cellの内部構造なんですけど cellの定義ってなんですか
struct cell{ int data; struct cell*next; }; 多分こんな感じ
>>775 宿題すれへ池。
と言ってもいいが答えておこう。
struct cell
{
int data
struct cell *next;
};
構造体の中に同じ構造体のポインタを配置するのってどんなところで有用なんでしょうか?
779 :
デフォルトの名無しさん :2005/09/24(土) 21:27:59
>>778 この場合のは(片方向の)リスト構造って言って頭から順に処理していくときに便利
780 :
デフォルトの名無しさん :2005/09/24(土) 21:32:36
演算子の?ってどういう意味ですか? 俺の持ってる本に載ってないうえに、あまりに短いキーワードで ぜんぜん検索にひっかからんです。
781 :
780 :2005/09/24(土) 21:33:52
ごめ、検索かかった
>>779 フォローどうもです。データ構造について勉強してみます。
C言語のプログラムの見本となるような、ソースが落ちている場所をご存じないでしょうか。
そりゃもうそこらじゅうに落ちてるよ。
787 :
784 :2005/09/24(土) 23:17:16
ありがとうございます 参考にさせていただきます
まぁ、今まで腐るほど仕事でCのプログラムを見てきたが、 感動して涙が出てくるようなマネしたくなるようなスゴイ ソースを見たことは、一度もないな。
789 :
廃人 :2005/09/24(土) 23:29:54
GNUスタイルの整形法は確かに吐き気がする。 あんまりコードは読んだことはないんだが、奴らネストの深い条件分岐やループ書きまくってんだろ。 Linuxのソースもインデントはタブだしな。なんとなくだが、いい仕事してるなってのはわかる。
まあ現実世界では 動くソース>>>>>>>>>>>>綺麗なソース なわけだが
ここだって現実ですよ
2chは、現実じゃない。 現実で、ぬるぽ、って言ったら殴られるか?
ガッって言われたことあるぞ。
てゆーか2chで言っても殴られてるAA貼られるだけで実際に殴られないし
>>795 精神を殴られてるんだよ。
ハートで感じろ。
以前も質問した者です。 あるソースがあり、main関数で int main( int argc, int **argv) と仮引数宣言されているとします。 また、このソースをコンパイルした実行ファイルをa.exeとします。 質問の意図がわかりにくいと思うのですが、 このとき下のような順番で処理されていると考えていいのでしょうか? 1.>a.exe b cと実行 2."a.exe","b","c"がそれぞれメモリのどこかの配置される 3."a","b","c"のアドレスを代入されたポインタがこの順でメモリのどこかに配置される 4.main関数に3.の"a"のアドレスを代入されたポインタのアドレスが渡される
>>797 その処理は半ばOSの仕事であり半ばスタートアップルーチンの仕事だ。
後者はコンパイラにソースがついているだろうからそれを読んでみるといい。
ここでは個別の実装については語れないので必要なら適宜該当スレへ。
>>798 ありがとうございます。C言語解説のサイト、テキストを見ても判然としないので困っていました。
少し調べてみたいと思います。
ぬるぽはスレ違いだろ
801 :
デフォルトの名無しさん :2005/09/25(日) 02:59:53
ぬるぽ
さぁ、どうしたものか・・・
803 :
デフォルトの名無しさん :2005/09/25(日) 03:27:58
nn
おいおい、古すぎるだろw
>>804 それに、専用スレがあるんだ。だから充分スレ違いだ。
年と月と日付から曜日を調べる方法ってないっすか? あったら教えて。
>>807 time.hの中にtime_tからstruct tmを生成する関数やその逆を行なう関数がある。
struct tmには曜日のメンバもあるので、struct tm → time_t → struct tmで曜日が得られる。
つ【Zellarの公式】
810 :
807 :2005/09/25(日) 10:36:21
自己解決しました。 int getwday(int y, int m, int d){ return y -= m < 3, (y + y / 4 - y / 100 + y / 400 + "032503514624"[m - 1] - '0' + d) % 7; }
ちょwwwまっwwwwww Zeller の公式まで教えてやったのにそれかw
今日からCを始めようと思って、Borland C++ 5.5 を導入してみたんんだけど、
ttp://www9.plala.or.jp/sgwr-t/detail/EnvSet.html (↑少し詳しい開発環境設定の説明のページです)
の「4」のコンパイルとリンクをコマンドプロンプトでやると以下のようになるんですけど何が悪いんですかね?
教えてください〜
C:\cwork>bcc32 hello.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
エラー E2209 hello.c 1: インクルードファイル 'stdio.h' をオープンできない
警告 W8065 hello.c 5: プロトタイプ宣言のない関数 'puts' の呼び出し(関数 main )
*** 1 errors in Compile ***
>>813 4.コンパイルオプションの設定のbcc32.cfgの設定が不味いな
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
↑の"c:\Borland\Bcc55\include"はちゃんと存在するフォルダを指してるか?
あと、bcc32.cfgはbcc32.exeがあるのと同じフォルダに保存しなきゃダメだぞ
>>814 ありがとうございます。
"c:\Borland\Bcc55\include"はちゃんと存在してました。
あと、bcc32.exeがC:\borland\bcc55\BinにあったのでC:\lsic330c\BINにあったbcc32.cfgを移しました。
ちょっともう一度試してみます。
C:\cwork>bcc32 sample.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland sample.c: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland がきました!! ご指摘とおりbcc32.cfgはbcc32.exeがあるのと同じフォルダに保存してなかったのが原因でした。 ありがとうございます!これからいろいろCやってみます。
なんかZellerの公式って1月か2月ができなんじゃなかった?
・1月、2月は前年の13月、14月として計算する
というのを間違って覚えたという感じだな。
まあ、月を扱う部分は配列使ってもいいとは思うけど。
それが
>>810 ではあるのだが、文字列を使わんでも int 配列でいいじゃん・・・。
820 :
デフォルトの名無しさん :2005/09/25(日) 17:17:45
C言語で、%dや、%lfと書く代わりに、 %1dや、%5.2lf と書く意味やメリットを教えてください。
いや、どんな本にも初登場のときに説明書いてあるだろ……
>メリット なんとなく指定の形に揃えたい場合に役立つ
まぁ、普通は%5.2fと書くがな。
lf は scanf 用 (double) printf は、可変個引数の引渡し時に float → double 変換が暗黙に行われるので f と lf で区別する必要がないので、f のみ。
俺は制限の強い方に合わせてる
改悪だよな
void SetDifference(Set *s1, const Set *s2, const Set *s3) { if (s2->set[i] = s3->set[j]) // ホニャララ } ==とするべきところを上のように間違えててもコンパイルエラーになりませんでした。 s2はconstで修飾されているけど正常なんですか? コンパイラはVC2003です。
>>828 代入されるだけだからコンパイルエラーなどになるはずはないだろ
set[i]がconst修飾型じゃなければ問題ない 言い換えるとsetがconst修飾されてない型へのポインタなら問題ない 問題があってもコンパイラにはエラーにする義務はない
>>828 set がポインタで、const 修飾されていなければ、正しい挙動。
set が配列ならおかしな挙動。
>>828 Setのメンバのsetはポインタ型だよな。
const Set *s2ってことはs2->set自体はconstだけど、s2->setの指す先まではconstにならない。
元の構造体の宣言時にsetがconstなポインタであるかそうでないかを見ている。
>>829-832 setはconstでないポインタです。
構造体をconstで宣言すれば各メンバもconstになると勘違いしてました。
どうもありがとうございました。
>>833 メンバはconstになるよ。
ただ、ポインタの指す先がconstにならないだけ。
>>834 きちんと読めばそう書いてましたね・・・
ポインタの理解がまだ甘いみたいなのでもうちょっと勉強してきます。
const char const *p;
const char*const p; の間違いじゃね?
838 :
デフォルトの名無しさん :2005/09/26(月) 03:21:45
しつもーんでーすっ!! C言語って標準でスタック用意してないの?
>>838 C標準ではコンテナは一切用意されてない。
用意されてるのは配列だけ。
あと、スレタイはちゃんと確かめてからレス投げような。
>>839 はい、ありがとうございます
これから気をつけます
842 :
デフォルトの名無しさん :2005/09/26(月) 14:04:22
2バイトのサンプルデータを格納したchar配列をshortのように2バイトで1単位のデータ配列に変換したいのですが、cast演算がうまくいきません。 言い方方ないですかね?
>>842 shortが2バイトでchar a[N];とすれば単にshort *p = (short *)a;でいけるはずだが、お前のコードはどうなっているのか?
初めからshortに格納しとくか shortの配列にmemcpyするとか...
845 :
デフォルトの名無しさん :2005/09/26(月) 14:09:10
C言語で、%dや、%lfと書く代わりに、 %1dや、%5.2lf と書く意味やメリットを教えてください。 コンパイル・実行してみて数値が変わるのは分かるのですが、いまいちどう変わっているのかよく分からなくて。。。 何故、5.2といって中途半端な数にするのでしょうか?
>>845 printfのマニュアル参照。
> 何故、5.2といって中途半端な数にするのでしょうか?
そういうフォーマットで出力したいからじゃないの?
848 :
デフォルトの名無しさん :2005/09/26(月) 14:24:10
849 :
デフォルトの名無しさん :2005/09/26(月) 14:24:46
b[1][1] = 1.0; b[n+1][n+1] = 1.0; for(i=2; i<=n; i++) { b[i][i-1] = 1.0; b[i][i] = -p; b[i][i+1] = 1.0; これの意味って、行列bの、b(1,1)と、b(n+1,n+1)には1を代入して、 b(i,i-1) に 1.0、 b(i,i)に -p、 b(i,i+1) に 1.0 を代入するってことですよね? 指定されてないところ(例えば、b(1,2)とか)には 0 が代入されるのでしょうか? 後、これはn+1 * n+1 のマトリクスですよね? 初心者質問ですみません。。。
> 指定されてないところ(例えば、b(1,2)とか)には 0 が代入されるのでしょうか? されない。
料理の本に、醤油や出汁と書く代わりに、 醤油小さじ1杯、出汁520mlと書く意味やメリットを教えてください。 作ってみて味が変わるのは分かるのですが、いまいちどう変わっているのかよく分からなくて。。。 何故、520mlといって中途半端な分量にするのでしょうか?
852 :
845 :2005/09/26(月) 14:30:12
>>851 キモいの! 人の質問バカにしたような言いかたすんなや!
おもんないし。
>>849 > これの意味って、行列bの、b(1,1)と、b(n+1,n+1)には1を代入して、
> b(i,i-1) に 1.0、 b(i,i)に -p、 b(i,i+1) に 1.0 を代入するってことですよね?
そうだけど、i は 2 から n までね。
何をするものか分からないから見当違いの質問になるかもしれんが、
b(1,2) と b(n+1,n) に入れないのは問題ないのね?
> 指定されてないところ(例えば、b(1,2)とか)には 0 が代入されるのでしょうか?
されない。
こういう場合は事前に 0 で埋めておけばいい。
> 後、これはn+1 * n+1 のマトリクスですよね?
n+1 * n+1 のマトリクスを表現しようとはしているだろうけど、
この配列自体のサイズは n+2 * n+2 以上のサイズな筈だ(でなかったら、バグ)。
C の配列の添え字は 1 ではなく 0 から始まるからな。
添え字の最大値は、配列のサイズ - 1 だ。
添え字を 1 から始めたいのだろうが、0 から始めないとメモリが無駄になる。
既にあるプログラムを利用するのであれば仕方がないが、
そういうプログラムと無関係に自分で新しく書くときは、
添え字を 0 から始める癖をつけた方がいい。
854 :
デフォルトの名無しさん :2005/09/26(月) 14:44:12
キモいの!
>>852 >>851 はあながちバカにしてるだけじゃないと思うぞ。
これはこれで十分な解答だと思うんだが。
あるファイルの先頭行に、文字列を挿入したいのですが どのようにすればいいのでしょうか? 単純に、ファイルポインタを先頭に、移動しfwriteで書き込めばいいのかと思いましたが 最終行に文字列が追加されてしまいました... 大変申し訳ありませんが、どなたかご教授願います。
>>857 fopen(..., "a")などでない限り、先頭に移動して書けば先頭に書かれると思うが。
いずれにしろ、挿入はされないから別ファイルに0から書き出してあとでファイル名変更などすることになる。
>>857 >>1 嫁、スレ違いだ。でも理解力無いだろうから、初心者スレ逝け。
それといいかげん、半可通の低脳厨が自己顕示欲レスつけるの、やめろ。
860 :
857 :2005/09/26(月) 15:49:56
>> 858
ありがとうございます。
ご指摘の通り(...,"a")で開いていました。
別ファイルに書き出して、リネームの方法でやる事にします。
>>859 誠に申し訳ありません。
今後、このような事を起こさないように気をつけます。
>>859 威張るだけのお前さんよりはどっちもマシだろうよ
862 :
デフォルトの名無しさん :2005/09/26(月) 16:31:33
>>851 キモいのっ! 人の質問バカにしたような言いかたしないでよん!
おねがいだから、無職なのだから
何がスレ違いなのか分からん。
わからない = スレ違い
>>859 =864
オウム返しなレスしかできない奴って哀れだな
868 :
866 :2005/09/26(月) 16:38:09
ありがとうございます。 ご指摘の通り 狂ってます^^
>>859 お前のレスが一番自己顕示欲に溢れてるよ。
俺だよ俺俺!!
>>869 は言語ひとつ覚えられない奴。必死すぎww
873 :
デフォルトの名無しさん :2005/09/26(月) 16:47:35
なんで859がここまで必死になるのか分からん 大体スレ違いじゃないだろ
>>866 さて^^ もうじき17:00です。無職が表を出歩ける時間はここまでですよw
デスクトップ違いなスレを甘受する度量が2ちゃんねるにあったとは驚きですね。
プログラマーがどんな生物か、良く分かるスレだな。
880 :
デフォルトの名無しさん :2005/09/26(月) 16:58:03
( ´,_ゝ`)プッ
ъ( ゚ー^) 気にするな、馬鹿の言うことは
そろそろ誰が誰を煽っているのかすら分からなくなって参りました
883 :
デフォルトの名無しさん :2005/09/26(月) 17:00:11
,,、. /ィ/ .._ .......、.__ /:/l!/ :~""''..) ゙゙"''─‐'''" (;;;,l ゙、'、::::::ノ ゙ヽ ``、/ \ / ゙ヽ ぷっ / ,,..._ ト─‐イ _,,, ,,/ ヽ,,. ヽ,_ノ ,,/ ヾ、,, ,/ /゙ " ヽ / i! (⌒i ヽ 〈 i / ,i γ´ ^゙ヽ. l l γ´ ^ ゙ヽ i i,__,,ノ ヽ_i, i ヽ,_,,ノ"~´ ̄``゙ヽ,_,,ノ
?
852 名前:845[] 投稿日:2005/09/26(月) 14:30:12
>>851 キモいの! 人の質問バカにしたような言いかたすんなや!
おもんないし。
852 名前:845[] 投稿日:2005/09/26(月) 14:30:12
>>851 キモいの! 人の質問バカにしたような言いかたすんなや!
おもんないし。
852 名前:845[] 投稿日:2005/09/26(月) 14:30:12
>>851 キモいの! 人の質問バカにしたような言いかたすんなや!
おもんないし。
852 名前:845[] 投稿日:2005/09/26(月) 14:30:12
>>851 キモいの! 人の質問バカにしたような言いかたすんなや!
おもんないし。
852 名前:845[] 投稿日:2005/09/26(月) 14:30:12
>>851 キモいの! 人の質問バカにしたような言いかたすんなや!
おもんないし。
852 名前:845[] 投稿日:2005/09/26(月) 14:30:12
>>851 キモいの! 人の質問バカにしたような言いかたすんなや!
おもんないし。
852 名前:845[] 投稿日:2005/09/26(月) 14:30:12
>>851 キモいの! 人の質問バカにしたような言いかたすんなや!
おもんないし。
852 名前:845[] 投稿日:2005/09/26(月) 14:30:12
>>851 キモいの! 人の質問バカにしたような言いかたすんなや!
おもんないし。
まぁいつもの関西人ってことで
ま た 大 阪 か
へーちょ
890 :
859 :2005/09/26(月) 17:10:43
( ´_ゝ`)
こんなにスレが荒れて、全く嵐の思う壷だな。
890 名前:859[sage] 投稿日:2005/09/26(月) 17:10:43
>>860-884 ……アホ過ぎ。ニヤニヤ。ここまで全部俺の自演だ。
( ´_ゝ`) ひとりで楽しそう
だって僕ひとりでしか遊んだことないから・・・
>>859 =894
( ´_ゝ`) ならもう満足したでしょ 哀れなおっさん
ィニ三≡ヽ /  ̄  ̄ \
/jj7 \ミt /、 ヽ はぁ?黙ってろデブ
彡jj_r==i_r=tiミ |・ |―-、 |
>>859 彡l.  ̄・・ ̄ ミ q -´ 二 ヽ |
_lt '=t /__ ノ_ ー | |
_, -t"lt__ j l ^゙''ー 、 \. ̄` | /
/ ヽ ̄ 丿7 \ O===== |
/ `-‐''゙ ヽ / |
ィニ三≡ヽ /  ̄  ̄ \ /jj7 \ミt あ?潰すぞ /、 ヽ ご、ごめんなさい 彡jj_r==i_r=tiミ |ヽ |―-、 | 彡l.  ̄・・ ̄ ミ q -´ 二 ヽ | _lt '=t /__ ノ_ ー | | _, -t"lt__ j l ^゙''ー 、 \. ̄` | / / ヽ ̄ 丿7 \ O===== | / `-‐''゙ ヽ / |
900 :
デフォルトの名無しさん :2005/09/26(月) 17:25:22
でももうちょっと遊んでもいい?
こんばんわよろしくお願いします #include<stdio.h> struct pai { int otl; char moji[5]; } main() { // エラー:main関数の構文がおかしい と出るのですが、何が原因と考えられるでしょうか?
まず死んだほうがいい
906 :
902 :2005/09/26(月) 17:38:29
ワラタ
実は「{」、「}」が全角
>>906 structって}の前にセミコロンがいるだろ。
911 :
859 :2005/09/26(月) 17:51:55
>>902-910 >>1 嫁。初心者スレにでも逝けよ。荒らしにしてもアホ過ぎ。
アホ回答者が居着くとこういうのばっか沸いてくるから…
912 :
デフォルトの名無しさん :2005/09/26(月) 17:57:08
>>911 え?また、君が偉っらそうに答えてやるんじゃないの?w
自作自演する香具師が言っても、説得力ない
>>902 structの書き方が C++か? セミコロンが無いのはともかくとして
香ばしきことこの上なし。
printfぐらいで馬鹿にするな
917 :
902 :2005/09/26(月) 18:20:11
レスありがとうございます。 構造体のメンバを一度もmain関数で呼び出してないの原因なのかなぁと、、、。
アホ回答者・アホ質問者>>>(人間の壁)>>>常に偉そう&自演しまくりの
>>911
>>917 既にこのスレ内に答えがあるんだから少しはレスを読め
921 :
902 :2005/09/26(月) 18:30:33
>>918 すいません。ちょっと、すみませんがソースを見て下さい
>>921 すいません。ちょっと、すみませんがレスを見て下さい
いやマジでもう答えてくれてる人いるからさ
まるまる一スレあるっスよ OTL 今100まで読みました
>>923 いやそうじゃなくって、お前に対するレスの中に答えがあるんだってば
何も上から全部読まなくても
926 :
デフォルトの名無しさん :2005/09/26(月) 18:44:13
>>925 とりあえずでているのは
>>907 それ以外にも
main関数の宣言自体がよろしくない
structの宣言の終端の;が抜けている
927 :
902 :2005/09/26(月) 18:45:11
structの後のセミコロンを直して、全角半角の確認をしてるのにエラーが出るので、 毎回main()の行で、エラーが出てます。 エラー E2141 stable9.c 92: 宣言の構文エラー 2ちゃんに書き写してるときにコロンを書き忘れてしまったんス ごめんなさい
main は 92 行目なの?
92行目って何が書いてあるんだよ
930 :
902 :2005/09/26(月) 18:49:23
>>926 main()の部分なんですけど、
main(){
/***省略***/
return 0;
}
とやってですね。mainの部分でエラーが出るんです
931 :
デフォルトの名無しさん :2005/09/26(月) 18:51:12
932 :
902 :2005/09/26(月) 18:52:47
>>928 >>929 そうっス。mainの前に、グローバル変数と関数が書いてあるんス。
main関数の外でstructを使い出してから、main()の部分でエラーが出てしまって、
先に進まなくて困ってしまっているんです
どうせstructの最後の}の後にセミコロンが抜けてるとかいうオチだろ
934 :
902 :2005/09/26(月) 18:54:34
>>931 大丈夫っス。
struct{
};
すいませんが、ちょっと助けて下さい
関係ないだろうがmainの宣言をちゃんとしてみろ つーか、もうどっかにソースうpしろ
936 :
デフォルトの名無しさん :2005/09/26(月) 18:56:12
とりあえずmainの前後5行を載せろ
>>934 ソースコードの天辺から「{」と「}」の数を検索して数えろ
そしてそのうちからコメントアウトされてる分を差し引いた数を教えろ
取り敢えずソースをうpするのが一番早いんジャマイカ? このままだと埒が明かんぞ
>935−937 };路線が消えてしまったからって、そんなにいきり立たなくてもいいだろう。 main(){ /***省略***/ return 0m(^^)プギャってされちゃうよ。 void mainで返り値0って・・・
940 :
902 :2005/09/26(月) 19:02:22
941 :
デフォルトの名無しさん :2005/09/26(月) 19:05:40
>>939 だって気になるじゃないか
このまま夜をむかえたら夢の中でデバッグしちゃうよ
このスレってギャグも詰まってるから面白い。
944 :
902 :2005/09/26(月) 19:34:49
945 :
859 :2005/09/26(月) 19:36:57
だからみんなはじめから初心者スレでやれよ。 不完全な質問にアホ回答者が答えたつもりになっても無駄なんだって。
>>944 char *kanji[34]={
...
} ←ここにセミコロンがない
947 :
902 :2005/09/26(月) 19:45:19
>>946 直りましたよ(^^)ノ
有難うございます。助かりました。
>>943 いや、そういうのじゃなくて大人げないやり取り自体がツボだと。
でもその後のstruct pai_sabaki{ は}; で閉じてるけど影響ないんだ?
すまん。オバーヘッドで本気でワロタ
>>949 はい、bccでは、エラーが何故かmain()のところでした。
デバックのやり方がわかりません^^;
952 :
デフォルトの名無しさん :2005/09/26(月) 19:56:08
やたらに伸びてると思いきや……一体この香ばしさはどういうことなんだ もとからか
そう本当は、人生はつまらないものなのだ
>>902 C言語のセンスは感じんが
ボケのセンスは神の領域と保障する
入門書のポインタ終わってやっと今構造体だよ
パソコン買ってもうじき一年だよ
Linux入れたら全部英語だよ
ポインタのポインタのポインタのポインタのポインタのポインタのポインタの ポインタのポインタのポインタテラウザス('A`) ppppppppppELEMENTってなんだよ氏ね
そういえば昔、ギター弾きの先輩で同じことを言う奴がいたな
香ばしい顔してたw
10次元配列を動的に確保するのならあり得るが、 そういう状況がありうるのかどうかは知らんな。
10次元配列を動的に確保ってこういうこと? #include<stdio.h> #include<stdlib.h> main(){ int i,j,ii,num,*p; num=3; p=(int *)malloc(sizeof(int)*10*10*num); for(ii=0;ii<num;ii++){ for(i=0;i<10;i++){ for(j=0;j<10;j++){ p[100*ii+i*10+j]=100*ii+i*10+j; } } } for(ii=0;ii<num;ii++){ for(i=0;i<10;i++){ for(j=0;j<10;j++){ printf("%d ",p[100*ii+i*10+j]); } printf("\n"); } printf("\n"); } free(p); return 0; }
ぬるぽってJAVAなんじゃないの
JAVAですか・・・ つか、ここはC言語スレだ。
973 :
廃人 :2005/09/26(月) 23:22:24
>>971 何言ってんだどう見ても一次元配列じゃないか
>>973 1次元配列で3次元配列をシミュレートしてるんだろ
エミュレートだろ
976 :
廃人 :2005/09/26(月) 23:57:53
n次元配列は全部1次元で賄えるなら pointer of pointer of ...... は不要だな 俺はリスト構造かなんかで非常にマズーなコード書いたんじゃないかとオモタ
(⊃д⊂)コンバン・・・∩・д・∩ ワァー★
978 :
デフォルトの名無しさん :2005/09/27(火) 00:17:51
なんだなんだ
そういや、10 次元配列を 10 階ポインタ使ってあれこれしようとすると、 ポインタテーブルだけでものっそい量になってしまうな。 アクセスしやすいというメリットが、 ポインタテーブルがかさばるというデメリットに 完全に押しつぶされるな。
981 :
デフォルトの名無しさん :2005/09/27(火) 01:07:24
>>979 で、10次元配列の各辺の長さはどれくらい?
巨大な配列とか、高次元の配列って、ほとんどの場合スパースなものになるから、 専用のアクセスルーチンつきで、解くべき問題に即した特別なデータ構造にする と思うのだが・・・ まさか、何も考えないで教科書どおりの2次元配列の作り方をそのまま借用して 10次元配列を宣言する?
983 :
廃人 :2005/09/27(火) 01:24:24
C++やJavaならともかく少なくともCじゃやらないな。 そもそも超多重配列が必要になるケースに遭遇したことが無い。 アルゴリズム見直したほうがいい。
突然の質問ですが、 printfの\f(改ページ)ってどういう時使うんですか?
986 :
廃人 :2005/09/27(火) 01:31:45
移植性の高い(似非)画面クリア。 UNIX/Linux前提ならsystem("clear")呼んだほうが綺麗だな。
987 :
廃人 :2005/09/27(火) 01:33:43
>>985 ソレダ!
紙が勿体無いからpsに吐いて実験してみるかな
>>982 問題は10次元配列をどう扱うかじゃなくて、
10重ポインタを使う状況とはいかなるものか、だ。
普通3次元までで事足りるよな。
990 :
デフォルトの名無しさん :2005/09/27(火) 13:14:25
>>989 場の3次元空間に対して時間変化をとるのに4次元必要
はいはいワロスワロス
(゚д゚)ウメー
(゚д゚)ウメー
(゚д゚)ウメー
(゚д゚)ウメー
(゚д゚)ウメー
(゚д゚)ウメー
(゚д゚)ウメー
(゚д゚)ハァ?
0x3e8なんてキリバンじゃないよな
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。