C言語なら俺に聞け! Part 114
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/09/17(土) 00:26:58質問する前には最低限検索を。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
C言語なら俺に聞け! Part 113
http://pc8.2ch.net/test/read.cgi/tech/1125136478/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
00022
2005/09/17(土) 00:40:460003デフォルトの名無しさん
2005/09/17(土) 00:41:22うんこの汁の部分
http://ex11.2ch.net/test/read.cgi/news4vip/1126884499/
0004デフォルトの名無しさん
2005/09/17(土) 00:51:06乙!
0005デフォルトの名無しさん
2005/09/17(土) 01:19:210006デフォルトの名無しさん
2005/09/17(土) 01:19:590007デフォルトの名無しさん
2005/09/17(土) 08:05:57generic.hというものがあったそうな。
今でもTurboC++を落とせば手にはいるでしょう。
Cで使えるかはわからんけど。
0008デフォルトの名無しさん
2005/09/17(土) 08:19:39struct Node* prev;
struct Node* next;
FooType val;
};
って構造体を定義して、とか言うレベルの話でないの?
Mapはただの2分探索木(VC++の奴の場合)だから1次元配列でも実現できるし
0009デフォルトの名無しさん
2005/09/17(土) 09:13:55単純な2分木だと、最悪条件ができる可能性があって、
STLのset/mapはそれを許さないから。
で、結局どの実装も赤黒木になってると思った。
0010デフォルトの名無しさん
2005/09/17(土) 09:29:090011デフォルトの名無しさん
2005/09/17(土) 10:36:40べつにそれは、言語関係ないだろ。
Cで実現するためのテクニックの話じゃねーの?
0012デフォルトの名無しさん
2005/09/17(土) 12:55:55struct ListNode_* prev;
struct ListNode_* next;
char value[1]; /* 可変長 */
};
として、リストの関数内ではこれで扱ってるフリをし、
外では
struct ListNodeInt {
struct ListNodeInt* prev;
struct ListNodeInt* next;
int value;
};
とかを使うってのもできないこともない。
ただ、色々と型チェックできないのが欠点。
俺は、多少気持悪くても、テンプレート紛いのマクロの方が好きかな。
0013デフォルトの名無しさん
2005/09/17(土) 13:03:520014デフォルトの名無しさん
2005/09/17(土) 13:12:270015デフォルトの名無しさん
2005/09/17(土) 13:14:310016デフォルトの名無しさん
2005/09/17(土) 14:34:35http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
0017デフォルトの名無しさん
2005/09/17(土) 14:37:080018デフォルトの名無しさん
2005/09/17(土) 15:57:24んなもん知っとるわ。
C89 も考慮して 1 を書いたんじゃ。
あと、そのページでは 1 引いてるけど、
offsetof(ListNode_, value) + sizeof (int) * num
のようにしたんでも構わない。
0019デフォルトの名無しさん
2005/09/17(土) 16:55:060020デフォルトの名無しさん
2005/09/17(土) 17:00:37んなもん知っとるわ。
C89 も考慮して 1 を書いたんじゃ。
あと、そのページでは 1 引いてるけど、
offsetof(ListNode_, value) + sizeof (int) * num
のようにしたんでも構わない。
0021デフォルトの名無しさん
2005/09/17(土) 17:11:23前スレの
>981
>realloc(0, size); realloc(p, 0); とかって書いてる奴は馬鹿。
それって結局名前と固定観念の問題だろうよ?
alloc(0,size);alloc(p,size);alloc(p,0);
と普通に書いてて、敢えてmallocやfreeなんて
余分な関数を使う奴が居るかねぇ?
0022デフォルトの名無しさん
2005/09/17(土) 17:26:15reallocはreallocであってallocでは無い。
名前と固定観念と言うが、
文脈を考えたらそれぞれを利用するのは当然だろ。
とりあえず、お前の書いたソースは、
人に見せられるような物ではないことも分かったからいいや。
0023デフォルトの名無しさん
2005/09/17(土) 17:28:250024デフォルトの名無しさん
2005/09/17(土) 17:52:49void god(void* info, void* res, ...);
info に何をしたいかに関する情報を入れて、
第3引数以降はそれに対応する引数を書けば、
res に答えが返ってくるんだ。
この関数1つで何でもできるように作ってあるから、
常にこの関数を使えばいいよね!
これ普通に使ってるから、
他の関数を使う奴なんていないよねぇ?
ってのがナンセンスなのと同じようなことだな。
0025デフォルトの名無しさん
2005/09/17(土) 18:19:27#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]);
つづく。
0026デフォルトの名無しさん
2005/09/17(土) 18:20:580027デフォルトの名無しさん
2005/09/17(土) 18:21:13if(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);
つづく。
0028デフォルトの名無しさん
2005/09/17(土) 18:21:560029デフォルトの名無しさん
2005/09/17(土) 18:22:26printf("調べたい項目を入力して下さい(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) {
つづく。
0030デフォルトの名無しさん
2005/09/17(土) 18:23:290031デフォルトの名無しさん
2005/09/17(土) 18:25:58k = 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;
}
これってどうなの?
0032デフォルトの名無しさん
2005/09/17(土) 18:28:41で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?
で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?
で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?
で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?
で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?で?
0033デフォルトの名無しさん
2005/09/17(土) 18:28:56極端に言えばそういうことだわな。
ってかオマエオモシロスwwwww
0034デフォルトの名無しさん
2005/09/17(土) 18:32:340035デフォルトの名無しさん
2005/09/17(土) 18:34:590036デフォルトの名無しさん
2005/09/17(土) 18:41:15どうなんでしょうね? 分かりません。
0037デフォルトの名無しさん
2005/09/17(土) 19:02:57>俺こんな関数作った。
>void god(void* info, void* res, ...);
reallocもmallocとfreeの関数ポインタを使って
定義可能だよね?
そういった意味では高階関数かもしれない。
>22
>お前がめんどくさがりなのは分かったが
Lazyじゃないとプログラマじゃないんだろう?
>文脈を考えたらそれぞれを利用するのは当然だろ。
それが頭が固いって言っている訳です。
常に既存文脈自体を疑わないと言語は進歩しない。
そんな頭が固い人が、えてして
「おい!おい!alloc一つで済んでる文脈に
なんでmallocとかfreeとかをわざわざ持ち込む
必要があるんだぁ???」
と叫ぶんじゃないでしょうか?
つまり何が効率的か?ではなくて
既存の文脈から「しか」判断出来ないように
なってはいないでしょうか?
0038デフォルトの名無しさん
2005/09/17(土) 19:15:29> Lazyじゃないとプログラマじゃないんだろう?
楽をするための努力は惜しまないのがプログラマ。
あらゆる点で怠惰なだけなのはタダのバカ。
> 常に既存文脈自体を疑わないと言語は進歩しない。
言語を進歩させるためにプログラム書いてるんじゃない。
ちゃんと動作して、動くものを作り、
また、場合によってはそのソースを
他人に引き渡すことも考えてプログラムを書くものだ。
自分世界に引きこもって自分言語で書いていいのは日用プログラマだけ。
0039デフォルトの名無しさん
2005/09/17(土) 20:06:12何がどうなんだよ
C勉強する前に日本語勉強してこい
0040デフォルトの名無しさん
2005/09/17(土) 20:20:01天才が故に既存の文脈を疑いすぎて、
自分しか理解できないコードを書くタイプ。
言語の進化自体は、意思を対象に分かりやすく伝える方向で、
進化するもんじゃないのかねぇ。
まぁ本人は分かり易いと思ってるのかもしれないけど。
俺みたいな低脳プログラマは可読性の高い方を支持させてもらうよ。
0042デフォルトの名無しさん
2005/09/17(土) 21:04:58各タブを\tに、各バックスペースを\bに、各バックスラッシュを\\に置き換えながら、
入力を出力に複写するプログラムを書け。
こうすれば、タブとバックスペースははっきり目に見えるようになる。
K&Rの問題ですけど、\bをgetchar()で入力確認って出来るんですか?
もしかしてUNIXとかならOKってことですか?
0043デフォルトの名無しさん
2005/09/17(土) 21:16:210044デフォルトの名無しさん
2005/09/17(土) 21:57:100045デフォルトの名無しさん
2005/09/17(土) 22:09:27そのK&Rの演習問題の回答は何処にありますか?
0046デフォルトの名無しさん
2005/09/17(土) 22:30:41while ( (c = getchar) != EOF ) {
switch( c ) {
case '\b': printf("\\b"); break;
case '\t': printf("\\t"); break;
default: putchar( c );
}
}
実際の動作は別にして、騙し騙しコードを書く知恵も必要です。
0047デフォルトの名無しさん
2005/09/17(土) 22:35:26コメントも無い、インデントも入ってない、処理の説明すらない
そんなソースを出されて、ただ一言「これってどうなの?」
質問の意味がわからんし、ソース読む気にもならんし。
お前の頭の方こそ「どうなの?」って聞き返したくなるわい
0048デフォルトの名無しさん
2005/09/17(土) 22:44:12> 各バックスラッシュを\\に置き換えながら、
がないぞ。
0049デフォルトの名無しさん
2005/09/17(土) 22:46:22while ( (c = getchar) != EOF ) {
switch( c ) {
case '\b': printf("\\b"); break;
case '\t': printf("\\t"); break;
case '\\': printf("\\\\"); break;
default: putchar( c );
}
}
すまそ
0050デフォルトの名無しさん
2005/09/17(土) 22:49:02『プログラミング言語Cアンサー・ブック』
ttp://www.amazon.co.jp/exec/obidos/ASIN/4320027485/
0051デフォルトの名無しさん
2005/09/17(土) 22:51:04#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);
}
0053デフォルトの名無しさん
2005/09/17(土) 22:53:31char が signed だと...
005453
2005/09/17(土) 22:55:100055デフォルトの名無しさん
2005/09/17(土) 22:58:070056デフォルトの名無しさん
2005/09/17(土) 23:04:07ごめん、関数コールだったorz
Ruby厨だから違和感感じなかった
0057デフォルトの名無しさん
2005/09/17(土) 23:06:55なんかかっこええ。
実用的じゃないとはいえそういうのも思いついときたいな。
005851
2005/09/17(土) 23:17:26×fputs(t[i],stdout);
○fwrite(t[i],1,2-!t[i][1],stdout);
ま、コンソールに出すのには問題ないから別に良いか
0059デフォルトの名無しさん
2005/09/17(土) 23:22:36いろいろ回ったんですが、ぱっとしない内容ばかりで。。。
「プログラミング言語で関数やメソッドを呼び出す際に、その関数やメソッドを実行するために渡さなければならない値のこと。」
っていう答えばかり。
0060デフォルトの名無しさん
2005/09/17(土) 23:23:41んなら、
int main(int argc, char **argv)
はい、具体例。
0061デフォルトの名無しさん
2005/09/17(土) 23:27:580062デフォルトの名無しさん
2005/09/17(土) 23:30:21printf("%d\n", hikisuu);
}
int main(void) {
func(10);
}
006359
2005/09/17(土) 23:36:13なるほど、
int main(void) {
func(10);
っていうのが、引数を返すって事なんですか?
で、
引数を設定してるのが、
void func(int hikisuu) {
printf("%d\n", hikisuu);
}
って事ですかね。
0064デフォルトの名無しさん
2005/09/17(土) 23:43:50006559
2005/09/17(土) 23:45:13混乱してきた。
0066デフォルトの名無しさん
2005/09/17(土) 23:46:48function (arg1, arg2) ;
などと呼び出していることが引数を渡していて、貴方方の言っている引数を返すという行為は
関数内部におけるreturn文の実行のことではないですか?
int function {
...
return [値] ;
}
0067デフォルトの名無しさん
2005/09/17(土) 23:53:53関数に渡す変数の値、て覚えときゃ十分。
また、関数は通常は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つの違いが分かったらポインタも同時にばっちしです。
0068デフォルトの名無しさん
2005/09/18(日) 00:00:04using namespace int main std;
()
[ cout<
0069デフォルトの名無しさん
2005/09/18(日) 00:00:44007059
2005/09/18(日) 00:02:26なるほど、確かにそうですね。
って事は、
void func(int hikisuu)
int main(void) {
func(10);
}
void func1(int hikisuu) {
printf("%d\n", hikisuu);
}
ってやると引数の関係がわかりやすいですね。
こうなると、なんで"hikisuu"が引数の意味になるんですかね?
なんとなく、"10"っていう数字が引数に見えちゃう。
0071デフォルトの名無しさん
2005/09/18(日) 00:04:16勝手な用語を作るなよ。
0073デフォルトの名無しさん
2005/09/18(日) 00:08:44返さなきゃならないときにそういう方法をとるって意味だ、ボケ。
返さなくてもいいし、返さなきゃ不都合が起きるときに返すんだよ。アホか。
0076デフォルトの名無しさん
2005/09/18(日) 00:11:54ちゃんと初心者の本でも読み返した後で、だけど。
言葉なんてどうでもいいから、自分で足し算ゲームでも作って見るのが
一番の上達の近道だ。
007759
2005/09/18(日) 00:15:32まだまだ初心者だけど、今も本見ながら頑張ってるんで、よろしくお願いします。
もうすぐ、Cでコンパイラを開発しないといけないんですが、どんな事するんですかねー。
コンパイラとか開発された方いますか?
0078デフォルトの名無しさん
2005/09/18(日) 00:27:28コンパイラ・スクリプトエンジンのスレを一度見れ。
0079引数とはこういうもの
2005/09/18(日) 01:10:42例・・・ 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で返している
0080デフォルトの名無しさん
2005/09/18(日) 01:14:56よくこうゆう嘘を見かけるんだが
"(つけても意味がないが)つける事ができる" が正解
0081デフォルトの名無しさん
2005/09/18(日) 01:16:46そんな事より
>引数がvoidの場合は引数なしと同じ
どーよw
0082デフォルトの名無しさん
2005/09/18(日) 01:22:14void f (void) ;
さんしゅるいのぼいどおー
0083デフォルトの名無しさん
2005/09/18(日) 01:23:49returnに関しては初耳だな、てか今まで気にしてもいなかったが、考えてみると納得
まあ初心者に説明してるんだから、ざっくりでいいかなって
細かく説明しすぎるとまたこんがらがるし
0084デフォルトの名無しさん
2005/09/18(日) 01:25:37時々「指定されたネットワーク名は利用できません」が出るんですが・・・
一応エクスプローラーでは認識してるし、DirもOK。
(ネットワーク系のエラーは・・・多分無いはず)
ただそのフォルダには10万以上のファイルが存在してるんだけど・・・
(ローカルだと問題なし)
このファイル数が影響してるんですかね?
OSはWin2000Serv同士です。
もし原因知ってる方がいましたら教えてください。
0085デフォルトの名無しさん
2005/09/18(日) 01:25:390086デフォルトの名無しさん
2005/09/18(日) 01:26:51原因はスレも選べぬお前の頭
008784
2005/09/18(日) 01:28:160088デフォルトの名無しさん
2005/09/18(日) 01:28:56では初心者にも分かりやすいように簡素に説明してくださいよ、お代官様
0089デフォルトの名無しさん
2005/09/18(日) 01:29:21馬鹿につける薬は無いな。去れ。
0090デフォルトの名無しさん
2005/09/18(日) 01:30:27何を?
009184
2005/09/18(日) 01:30:57知らないなら無理にレス付けなくてもいいよ。
0092デフォルトの名無しさん
2005/09/18(日) 01:31:06まあいいや
つかvoidを引数として使う場合って引数なしと同じでいいんじゃん
0093デフォルトの名無しさん
2005/09/18(日) 01:33:590094デフォルトの名無しさん
2005/09/18(日) 01:34:150095猛勉強中(59)
2005/09/18(日) 01:34:33すっごいわかりやすいです!
ありがとうございます、テキストファイルに保存しておきましたw
こうみると、引数って言葉をしらなくても、知らない間にプログラム組む時に
使ってるんですねー。
けど、これでよりプログラムを組みやすくなったと思います。
ありがとうございます。
>>80
なるほどって感じです。
0096デフォルトの名無しさん
2005/09/18(日) 01:35:380097猛勉強中(59)
2005/09/18(日) 01:37:18と言う事は、voidとすることの意味は何なんですか?
0098デフォルトの名無しさん
2005/09/18(日) 01:37:33それこそウソじゃん?
使えんわけないじゃんか
※ 関数は一般に引数によって値を受け取り、returnで返却値を返すものですが、
中には引数が必要無い関数や返却値の無い関数も存在します。
そのような場合、「引数が無い」ことや「return値が無い」ことを
明示するために「void」は用いられます。
ぐぐったぞ
0100デフォルトの名無しさん
2005/09/18(日) 01:39:27main(void) == main()
0101デフォルトの名無しさん
2005/09/18(日) 01:45:48解釈の違いだ
voidが引数として使えないって言ってるのって、
呼ばれたほうの関数に引数として渡らないってことだな?
俺は記述として引数と同じ記述のことを言ってたわ
まあいいや
どうでもいいよ
電池キレタ
送ってくれよ
■ このスレッドは過去ログ倉庫に格納されています