C言語なら俺に聞け! Part 112

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

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 111
http://pc8.2ch.net/test/read.cgi/tech/1121657911/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:2005/08/08(月) 02:07:25
>>1 乙
3デフォルトの名無しさん:2005/08/08(月) 03:30:15
スレタイと微妙に異なるんですが、
計算量がもっとも少ない双方向リストのソートアルゴリズムは何か
教えてもらえないでしょうか。

よろしくお願いします。
4デフォルトの名無しさん:2005/08/08(月) 03:35:45
双方向のリストでそのままソートすんなよ
いったんmallocで配列作ってそれを、qsort
そのあとリストを作り直す
大きさにもよるが速度と汎用性でピカイチだこれ
5デフォルトの名無しさん:2005/08/08(月) 09:36:29
C言語をはじめたばかりであまりわからないのですが、 
6デフォルトの名無しさん:2005/08/08(月) 09:37:46
>>5
あまりわからないのか。そうかそうか。
7デフォルトの名無しさん:2005/08/08(月) 09:52:11
>>5
ここは標準C言語のスレです。
書籍、宿題、コンパイラなどの使い方などはそれぞれ該当スレへ、
初心者丸出しの質問は初心者歓迎の質問スレへ、
その他、他言語の質問、日記などは適宜移動してください。
http://pc8.2ch.net/test/read.cgi/tech/1118072681/
8デフォルトの名無しさん:2005/08/08(月) 12:48:51
char *hoge;

scanf()で取得した文字列をhogeに入れ、atoi()したいのですが、
この場合、atoiに失敗した(数値に直せない)場合も、atoiに成功して戻り値が0の場合も、どっちも0が返ってきてしまいます。
今はstrcmpでマッチ文字列を0、00、000(ryとforでループさせて調べるようにしていますが、
もっと簡単な方法があれば教えてください。

VS.NET、gccを使っています。
9デフォルトの名無しさん:2005/08/08(月) 12:56:41
>>8
ここは標準C言語のスレです。
書籍、宿題、コンパイラなどの使い方などはそれぞれ該当スレへ、
初心者丸出しの質問は初心者歓迎の質問スレへ、
その他、他言語の質問、日記などは適宜移動してください。
http://pc8.2ch.net/test/read.cgi/tech/1118072681/
10デフォルトの名無しさん:2005/08/08(月) 13:09:59
>>8
strtol
11デフォルトの名無しさん:2005/08/08(月) 13:16:06
即答ありがとうございました。
12デフォルトの名無しさん:2005/08/08(月) 13:39:25
>>8
ポインタ変数には文字列は入らない訳だが。
文字列が入っている領域へのポインタ値を入れるべきだ。
13おれ ◆dHe9wXXwgk :2005/08/08(月) 13:57:59
>>8
文字列の取得にscanf()は辞めたほうがいいと思われ

というのは古いのか?

それと、>>12にもあるが
*hogeの宣言でだけでなく、mallocなりでメモリをアロケートしなくちゃむりぽ
小規模コードなら、配列で世伊部?
14デフォルトの名無しさん:2005/08/08(月) 16:15:52
>>12
実はJava/Perl/C#から移転してきて、ポインタについてよく分かっていませんでした。
このサイトを参考にもうちょっと考えます。
ttp://www9.plala.or.jp/sgwr-t/lib/strtol.html
>>13
そうだったんですか…知りませんでした。
ttp://f1.aaa.livedoor.jp/~pointc/log70.html
こう書けば良いようですね。fgets(buf, sizeof(BUF_SIZE), stdin);
メモリの動的確保についてですが、ググっでもすでにchar str[256]するようなソースしか見つからず
入力ストリームの文字数は代入するまで取得できないようですね。。
趣味レベルなので、今はstrの末端に\0を代入することにして、正しい取得方法は引き続き調べようと思います。
15デフォルトの名無しさん:2005/08/08(月) 16:18:08
>>4
エーッ、マジっすか?
てっきり横着者の手法だと。。。


回答ありがとうございますm(_ _)m
16デフォルトの名無しさん:2005/08/08(月) 16:22:32 BE:119816238-
リンクリストでもクイックソートできるけど、ま、配列に入れてqsort()を呼ぶのが楽だな。
17デフォルトの名無しさん:2005/08/08(月) 18:10:46
char* hoge;
char *hoge;
はどう違うのでしょうか?
18デフォルトの名無しさん:2005/08/08(月) 18:14:00
違わない。好みの問題。
19デフォルトの名無しさん:2005/08/08(月) 18:14:08
書き方
2017:2005/08/08(月) 18:14:38
ありがとうございました
21デフォルトの名無しさん:2005/08/08(月) 18:28:09
>>17
自分は
char* hoge;
が好き。
その上で、
char* hoge, *fugo;
は書かず、必ず
char* hoge;
char* fugo;
と書くようにしてる。
22デフォルトの名無しさん:2005/08/08(月) 18:32:39
>>21
で?
2317:2005/08/08(月) 18:33:37
char* hoge, geho;
ってかけないんだ しらなかった
24デフォルトの名無しさん:2005/08/08(月) 18:48:53
int i;
int j;
int k;
だるー
25デフォルトの名無しさん:2005/08/08(月) 18:49:55
>>23
書けるけど、
char *hoge;
char geho;
と同意になる。
char* hoge, geho; だと、どっちもポインタに見えて厄介でしょ。
2623:2005/08/08(月) 18:53:13
ごめん、俺17じゃない

char* って、キャラ型のポインタ宣言じゃなかったんだ
いつも char *hogeでやってて使ったこと無いからしらんかったよ
27デフォルトの名無しさん:2005/08/08(月) 18:53:18
>>24
そのいい加減な変数名もだるー
28デフォルトの名無しさん:2005/08/08(月) 18:59:30
int a, b, c, d, e, ,i ,j;
29デフォルトの名無しさん:2005/08/08(月) 19:00:39
ひいぃぃ。やめてやめて
30デフォルトの名無しさん:2005/08/08(月) 19:11:06
よく一文字変数にiってみるんだけど
なんか理由あるの?
31デフォルトの名無しさん:2005/08/08(月) 19:13:57
>>30
fortranはIからNで始まる変数名は整数型と決まっていた。
その頃からの流れで、Iterationの頭文字でもあることから
basicやCでも未だにi一文字の変数名が幅を利かせている。
32デフォルトの名無しさん:2005/08/08(月) 19:14:36
iterator の i だったり int の i だったり、習慣や慣れだったり。
33デフォルトの名無しさん:2005/08/08(月) 19:25:07
iterator では it 派の漏れ
3434:2005/08/08(月) 19:50:47
質問です。
ファイル読み込みの時に1行ずつファイル名を書いて読み込ませるのが、とても面倒臭く苦しんでおります。
ファイル名に数字を入れてループ文を使い一気に読み込ませる方法があると聞きましたが詳しいやり方がわかりません。
すみませんが、教えてください。
35デフォルトの名無しさん:2005/08/08(月) 19:53:35
>>34
書いてるまんま
36デフォルトの名無しさん:2005/08/08(月) 19:53:57 BE:124808055-
>>34
そのファイルの命名に、規則性があれば、いくらでもやりようがあるけど。
3734:2005/08/08(月) 19:57:51
自分の考えではファイル名をa*.txtという風にして*を0からの数字にしようと思っているのですが、

for(int i=0;i<10;i++)
{
ファイル読み込み("a"+i+".txt");
}
のようにやってみたのですがうまく行きません。
まいりました・・。
38デフォルトの名無しさん:2005/08/08(月) 19:58:46
sprintf()って知ってる?
39デフォルトの名無しさん:2005/08/08(月) 19:58:52
>>37
君は阿呆なのか?
40デフォルトの名無しさん:2005/08/08(月) 19:59:08
>>38
知ってるけど?それで?
41デフォルトの名無しさん:2005/08/08(月) 19:59:47
ファイル名をsprintf()で作れよw
42デフォルトの名無しさん:2005/08/08(月) 19:59:53
+i+ってなに?
始めてみた
43デフォルトの名無しさん:2005/08/08(月) 20:00:19
初めて・・・ orz
44デフォルトの名無しさん:2005/08/08(月) 20:00:27
>>37
しかもfor-statementで変数宣言ですか
45デフォルトの名無しさん:2005/08/08(月) 20:00:55
>42
ベーシックとかスクリプト系ではよくみかけるな
46デフォルトの名無しさん:2005/08/08(月) 20:01:10
>>44
それは別に問題ないだろ
47デフォルトの名無しさん:2005/08/08(月) 20:01:19 BE:139785247-
>>37
とりあえず、入門書の一冊でも読んでください。
48デフォルトの名無しさん:2005/08/08(月) 20:01:36
49デフォルトの名無しさん:2005/08/08(月) 20:01:45
>>45
どういう意味なの?
50デフォルトの名無しさん:2005/08/08(月) 20:02:31
>49
文字列編集だよ
51デフォルトの名無しさん:2005/08/08(月) 20:02:45
forの中で宣言したらforの中のローカル変数になるんだっけ?
5234:2005/08/08(月) 20:02:57
すみません。知りません。
そのsprintfについて少し調べてみます。
53デフォルトの名無しさん:2005/08/08(月) 20:05:53
>>46
処理系によってスコープ範囲が違うからあまり使わないようにしてます。

>>51
初期のころはfor-statementが出てきたところのスコープの末尾まで。
改定された規格ではforの中だけ。
未だにこれ引きずってる処理系はあります。
54デフォルトの名無しさん:2005/08/08(月) 20:10:33
>53
>初期

for(int i=0;i<10;i++)
{
...
}
for(int i=0;i<10;i++)
{
...
}

これがエラーになるのはどう考えてもバグだろw
改定だぁ? はぁ?
55デフォルトの名無しさん:2005/08/08(月) 20:10:55
>>53
そうです
5634:2005/08/08(月) 20:14:32
やはり、どうすれば良いのかわかりません。
皆さんの討論にすらついて行けません・・・。
とにかく"a0.txt"と"a1.txt"と"a2.txt"をループ文で一気に読み込めればよいのです。
一番簡単な方法を教えてください。

くだらないと思った人は無視してください。
身勝手な申し出ですみません。
57デフォルトの名無しさん:2005/08/08(月) 20:16:01
だからsprintf()でファイル名を編集汁!
そのファイル名を使う!
58デフォルトの名無しさん:2005/08/08(月) 20:16:12
>>56
sprintfだっていわれてるだろ
59デフォルトの名無しさん:2005/08/08(月) 20:18:53
FILE *fp;
char filename[256];
for(int i = 0; i < 10; ++i)
{
  sprintf(filename, "a%d.txt",i);
  fp = fopen(filename, "r");
    ;
  fclose(fp);
}
60デフォルトの名無しさん:2005/08/08(月) 20:21:14 BE:119815946-
>>53
改定されたのってC++の話でしょ。
61デフォルトの名無しさん:2005/08/08(月) 20:25:49
C99規格で,変数の宣言の位置に関してはC++風になりました.
6234:2005/08/08(月) 20:26:01
>>59
ありがとうございます。
自分の知らないプログラムを見ると、そんな手があったか〜と毎度思ってしまうほど鮮やかです。
毎度と言えるほどプログラムを書いた事はありませぬが。
本当にありがとうございました!!
63デフォルトの名無しさん:2005/08/08(月) 21:18:23
+i+って・・・ここはJavaScriptのスレじゃないんだが・・・
64デフォルトの名無しさん:2005/08/08(月) 21:29:31
65デフォルトの名無しさん:2005/08/08(月) 21:30:37
そこはJavaって言ってあげるとこだろ
66デフォルトの名無しさん:2005/08/08(月) 21:34:44
お馬鹿
67デフォルトの名無しさん:2005/08/08(月) 22:23:19
HTMLのなかからリンクだけを取り出す関数というかライブラリはありますか?
68デフォルトの名無しさん:2005/08/08(月) 22:35:54
regex
69デフォルトの名無しさん:2005/08/08(月) 22:55:24
>>67
ありました
70デフォルトの名無しさん:2005/08/08(月) 22:57:41
>>68
正規表現でどうしろっていうの?
自分で抜けって事?

>>69
過去形なのはどういう意味?
71デフォルトの名無しさん:2005/08/08(月) 23:03:41
>>67
char* path = (ファイルパス)
char html[MAX_HTML];
char url[MAX_URL]
char *link_begin, *link_end;
FILE* fp;

fp = fopen(path, "r");
fread(html, sizeof(char), MAX_SIZE-1, fp);
fclose(fp);
link_begin = html;
while((link_begin = strstr(link_begin, "href=\"") != NULL) {
  link_begin += 6;
  link_end = strchr(link_begin, '\"');
  *link_end = 0;
  strcpy(url, link_begin);
  *link_end = '\"';
  }
  (目的の処理)
  link_begin = link_end+1;
}

適当に書いてみた。
7271:2005/08/08(月) 23:05:30
while((link_begin = strstr(link_begin, "href=\"") != NULL) {
ミス。括弧が足りなかった。
while((link_begin = strstr(link_begin, "href=\"")) != NULL) {
73デフォルトの名無しさん:2005/08/08(月) 23:09:21
いろいろと問題有だな
74デフォルトの名無しさん:2005/08/08(月) 23:14:57
最後の中括弧はなんだ?
7571:2005/08/08(月) 23:16:46
余計な中括弧が残ってたかorz
恥かくだけだからもうやめるわ
76デフォルトの名無しさん:2005/08/08(月) 23:42:28
>>71
うちも書いて欲しいから
めっちゃ応援してる
頑張って書いてくれ
77デフォルトの名無しさん:2005/08/09(火) 00:08:48
じゃ、変わって失恋プログラマがいきます。
/*ノーワーニング、ノーエラーなら彼女がよりを戻しに来る*/
//"href=\""があるか調べる
char *ishref(char *str)
{
int len[2], i, cmp;
char *ret;
len[0] = strlen("href=\"");len[1]=strlen(str);
cmp = -1;
for(i=0;i+len[0]<len[1]&&cmp!=0;i++){
cmp = strcmp("href=\"", str);
if(cmp==0){
ret = str+i+len[0];
}else{
ret = NULL;
}
return ret;
}

void folink(FILE *fo, FILE *fhtml)
{
char ss[256];
char *p[2];
while(fgets(ss, 256-1, fhtml) != NULL){
if((p[0]=ishref(ss))!=NULL){
p[1]=p[0];
while(*p[1]!='\"')p[1]++;
*p[1]='\0';
fprintf(fo, p[0]);
}
}
}
78デフォルトの名無しさん:2005/08/09(火) 00:11:45
cmp = strcmp("href=\"", &str[i]);
だった・・・
もう駄目だな。。
79デフォルトの名無しさん:2005/08/09(火) 00:19:42
これどうなってんの?
80デフォルトの名無しさん:2005/08/09(火) 00:21:03
>>79
読むと失恋する
81デフォルトの名無しさん:2005/08/09(火) 00:23:11
失恋したorz
82デフォルトの名無しさん:2005/08/09(火) 00:40:19
ねえマスター、作ってやってよ
涙忘れるソース
83デフォルトの名無しさん:2005/08/09(火) 00:42:20
ねえマスター、
ねえマスター、
ねえマスター、はやくぅ
84デフォルトの名無しさん:2005/08/09(火) 00:49:28
誰もがhref="と空白を空けずに書くと想定するのは如何な最中と。
85デフォルトの名無しさん:2005/08/09(火) 00:53:24
MSHTMLでも使えってことですね
86デフォルトの名無しさん:2005/08/09(火) 02:06:31
>>77
void main(void) {
printf("ガンガレ!\n");
}
87デフォルトの名無しさん:2005/08/09(火) 02:19:01
88デフォルトの名無しさん:2005/08/09(火) 04:11:10
htmlcxx ってC++じゃなかったか?
89デフォルトの名無しさん:2005/08/09(火) 07:14:03
char *ishref(char *str)
{
  char target[] = "href=\"";
  char *ret;
  int targetlen = strlen(target);
  int len = strlen(str);
  int i, j, k;
  j=0;
for(k=0;k+targetlen<len;){
  for(i=0;i<targetlen;){
   while(isspace(str[j])){j++;k++;}
   if(str[j]==target[i]){
    i++;
   }else{
    break;
   }
  }
}
  if(i==targetlen){
   ret = str + j + 1;
  }else{
   ret = NULL;
  }
}

こうかー
90デフォルトの名無しさん:2005/08/09(火) 08:57:16
完全な初心者です。
C言語を覚えたいのですが、環境を整える段階で早くも詰まっています。
Visual C++、gcc、LSI C-68等のコンパイラでオススメの物を教えて下さい。
当方、windousXPです。
91デフォルトの名無しさん:2005/08/09(火) 09:11:38
>>90
スレ違い。VCでもgccでもいいけど、整備の仕方が判らないなら該当スレへどうぞ。
LSI-Cは無条件に薦めない。
9290:2005/08/09(火) 09:30:58
>>91
ここかと思っていました、すみません。
スレ違いなのに答えてくださってありがとうございます。
93デフォルトの名無しさん:2005/08/09(火) 20:06:26
質問です。
int unko(int a, int* b, int c) {
 return a+*b+c;
}

int (*ok)(int a, void* b, int c);
ok = unko;

としてもコンパイルエラーにはならないのですが、(gccだとデフォで警告orz)
これは一般的なテクニックとして利用しても大丈夫なのでしょうか?
94デフォルトの名無しさん:2005/08/09(火) 20:08:29
すみません、void* をプロトタイプに持つ関数のポインタに、
その位置にvoid* 以外の型のポインタ変数を持つ場合でも、
コンパイルエラーにならないってことです。
95デフォルトの名無しさん:2005/08/09(火) 20:11:19
一般的なテクニックだあぁ?
おまえのオナニーテクニックだろ
unkoの型をvoid*に合わせて演算するところでintにキャストせぇよ
なにがやりたいんだかわからん
96デフォルトの名無しさん:2005/08/09(火) 20:15:59
いや、何がやりたいかは別に分かってもらわなくても良いのですが、
この様な使い方(プロトタイプに合ってない関数をキャストなしで代入)は
すべきじゃないかを問いかけただけです。

>unkoの型をvoid*に合わせて演算するところでintにキャストせぇよ
すみません。例が意味不明でした^^
これはあくまで単なる例なので、気にしないでください。
97デフォルトの名無しさん:2005/08/09(火) 20:16:59
for(〜〜){
  if(〜〜){
    if(〜〜){
      break;
    }
  }
  hoge++;
}

これでbreakが実行されるとforから抜けることになるんですか?
それとも外側のifを抜けてforのhoge++が実行されるのでしょうか?
98デフォルトの名無しさん:2005/08/09(火) 20:19:34
errnoでセットされた値はプログラマが明示的に
クリヤーする必要があるんですか?
99デフォルトの名無しさん:2005/08/09(火) 20:23:07
>>97
まずはおまえ自身でやってみろよ
なんだかもう・・・
100デフォルトの名無しさん:2005/08/09(火) 20:25:11
すいません。友人の家でふと疑問に思ったのです。
書き込みも友人のPCなのでコンパイラをインストできないんです。
今日は泊まりなので家にも帰れませんし。。
101デフォルトの名無しさん:2005/08/09(火) 20:26:25
>>100=>>97です
102デフォルトの名無しさん:2005/08/09(火) 20:28:50
べつに急ぎじゃないんだろ?
帰ってから思う存分やれ
103デフォルトの名無しさん:2005/08/09(火) 20:31:10
>>98
1.errnoは、エラーになったときだけセットされる
2.errnoは、エラーになったときだけ参照する

1.2.より、通常は明示的にクリアする必要は無い
104デフォルトの名無しさん:2005/08/09(火) 20:33:27
>>101
調べると「ループやスイッチ」が対象みたいなのでforから抜けるみたいですね。
どうもでした
105デフォルトの名無しさん:2005/08/09(火) 20:37:20
ところでさ、なんで break の対象は ループや「スイッチ」 なんだろうね。
switch文を抜けるのまで 同じ「break」 である必要はあったのかね・・・
sbreak とか、別ものにして欲しかったと思うことは無いか?

答えろ! >>107
106デフォルトの名無しさん:2005/08/09(火) 20:39:42
>105
厨房は黙ってろよ
107デフォルトの名無しさん:2005/08/09(火) 21:05:27
>>105
黙ってろ
108デフォルトの名無しさん:2005/08/09(火) 21:09:33
>別ものにして欲しかったと思うことは
ないな。以上
109デフォルトの名無しさん:2005/08/09(火) 21:14:51
>>105
ない。あとおまえは黙ってろ
110デフォルトの名無しさん:2005/08/09(火) 21:16:40
breakじゃなくてgotoにしてほしかった。
111デフォルトの名無しさん:2005/08/09(火) 21:18:34
>>93
一般的なテクニックではないな。
Cはそういうところのチェックが甘いし。
112デフォルトの名無しさん:2005/08/09(火) 21:23:21
>>107
ひどいじゃん
113デフォルトの名無しさん:2005/08/09(火) 21:24:24
>>106
forやwhileの中で、switch文の中からbreakしたくなったことは
一度も無いのか?
114デフォルトの名無しさん:2005/08/09(火) 21:25:41
goto
115デフォルトの名無しさん:2005/08/09(火) 21:26:20
>>93
テクニックというには、使いどころが無さ杉な気がする。
116デフォルトの名無しさん:2005/08/09(火) 21:26:47
breakなんswitch以外で使わなければいい
俺は全部gotoにしてる
117デフォルトの名無しさん:2005/08/09(火) 21:27:54
で、うじうじそんなことを考えてどうするつもりかね。
118デフォルトの名無しさん:2005/08/09(火) 21:30:39
>>111
やはりそうですか。ありがとうございました。

>>115
ポインタをコールバックで渡すとき、
呼ばれた側だけが型の情報を知っている場合に、
別の変数にキャストしなくてもいいので便利かな、と思いまして。
119デフォルトの名無しさん:2005/08/09(火) 21:32:33
>>117
ストールマンとコンパやって、やつが酔っ払ってる隙に
gccのソースを直す。
120デフォルトの名無しさん:2005/08/09(火) 21:35:38
>>116
俺は極力goto使わないようにしてる
「gotoレスプログラミング」っていうぐらいだし
121デフォルトの名無しさん:2005/08/09(火) 21:41:11
俺は極力 後藤 使わないようにしてる
「後藤カスプログラミング」っていうぐらいだし
122デフォルトの名無しさん:2005/08/09(火) 21:48:59
でも多重breakしたいときには仕方がないから使う。
123デフォルトの名無しさん:2005/08/09(火) 22:02:24
gotoレスくらい、ほとんどの人が分かり切ったこととしてるはずじゃないのかいな。

多重ループを脱出するときは、「仕方がない」という意識ではなく、ここぞ使う場面だ
と思って使うが。
124122:2005/08/09(火) 22:11:06
>>123
JavaとかDにはラベル付breakなるものがあるらしい。これなら多重breakにgotoを使う必要がなくなる。
これがないCでは「仕方なく」gotoを使うことになる。もちろんラベル付breakをCに導入しろとは全然思っていない。
俺はJavaもDも使ったことがないけど。
125デフォルトの名無しさん:2005/08/09(火) 22:11:47
>>123
そういう場面になったら俺の場合、gotoを使わなくてすむようにロジック組みなおす。
まあ仕事でやってる人はそういうわけにもいかないんだろうけど
126デフォルトの名無しさん:2005/08/09(火) 22:29:02
いや、ほんとくだらねぇんですけど。

「引数」と「値を返す」
の基本的な二つの語句の意味がいまいち理解しきれません。
イメージとしては掴みかけているような感じはするんですけど。。。
127デフォルトの名無しさん:2005/08/09(火) 22:30:01
>>124
>もちろんラベル付breakをCに導入しろとは全然思っていない
俺はぜひ導入してほすぃと思うが。害はないだろ?
128デフォルトの名無しさん:2005/08/09(火) 22:32:00
イメージとしては

       ↓引数
   ← foo(a)
値を返す
129デフォルトの名無しさん:2005/08/09(火) 22:33:41
故後藤先生は、なぜgotoが不当に迫害されなればならないのかと悩んでおられた。
130デフォルトの名無しさん:2005/08/09(火) 22:34:46
gotoを使う奴は強盗
131デフォルトの名無しさん:2005/08/09(火) 22:35:17
近藤さんは毎晩悩んでおられた。
132デフォルトの名無しさん:2005/08/09(火) 22:35:48
>>129
s/悩んで/悲しんで/
133デフォルトの名無しさん:2005/08/09(火) 22:37:59
おまえら本当は、
「gotoを使っちゃダメ」ってエライ学者さんが言ったから使ってはいけない、
程度にしか理解してないのだろ?
134デフォルトの名無しさん:2005/08/09(火) 22:38:57
ごめんなさい先輩風吹かしたいだけです
135デフォルトの名無しさん:2005/08/09(火) 23:02:23
ダイクストラがgoto(゚д゚)マズーって言ったころには、
まだC言語もおまえらも存在していなかったわけだがな。
ttp://www.acm.org/classics/oct95/
136デフォルトの名無しさん:2005/08/09(火) 23:11:15
>>127
反対する気はないが、今さら導入したところで、あまり意味がないよな。
137デフォルトの名無しさん:2005/08/09(火) 23:17:03
>>126
学校でy=f(x)とか習ったかい?
138デフォルトの名無しさん:2005/08/09(火) 23:20:11
gotoを使わないことが自己目的化して関数分割しすぎて
可読性損ねる馬鹿プログラマには参る
139デフォルトの名無しさん:2005/08/09(火) 23:37:24
ダイクストラは、羮に懲りて膾を吹くという感じでgotoを全面否定することはないだろうにな。
140デフォルトの名無しさん:2005/08/09(火) 23:40:00
>137
習いました
141デフォルトの名無しさん:2005/08/09(火) 23:41:29
>羮に懲りて膾を吹く
読み方プリーズ
しつけにこりてろをふく?
142デフォルトの名無しさん:2005/08/09(火) 23:44:10
>>141
あつ‐もの【▼羹】〘名〙
野菜や魚肉を熱く煮立てた汁物料理。◇「熱いもの」の意。
羹(あつもの)に懲こりて膾(なます)を吹く失敗にこりて、必要以上に用心深くなる。◇熱かった羹にこりて膾のような冷たい料理も吹いて冷ます意からいう。
143デフォルトの名無しさん:2005/08/09(火) 23:44:52
あつものにこりてなますをふく

熱いものをはふはふして食べたあとに、冷たい副菜を思わずふーふーしてしまう様から、
ひどい目にあって、同じ目を二度と見ないように、過剰な反応をするの意。
144デフォルトの名無しさん:2005/08/09(火) 23:51:55
あつものにしこりてなますをふく
145デフォルトの名無しさん:2005/08/10(水) 00:01:00
>>140
お前見込みないわ…コミュニケーション能力が…
146デフォルトの名無しさん:2005/08/10(水) 00:03:49
習ったけど、理解はしてないよ
ということでしょう
147デフォルトの名無しさん:2005/08/10(水) 00:04:54
どっちにせよ見込みないわ
148デフォルトの名無しさん:2005/08/10(水) 00:10:57
142を直す
>羹(あつもの)に懲こりて膾(なます)を吹く失敗にこりて、必要以上に用心深くなる。
羹(あつもの)に懲(こ)りて膾(なます)を吹く 失敗にこりて、必要以上に用心深くなる。

>>144
ネタか?
149デフォルトの名無しさん:2005/08/10(水) 00:54:51
にしこり
150データボックス:2005/08/10(水) 01:11:28
できるだけ配列をポインタ扱いでコーディングするように努めてるが、構造体へのポインタの
2次元配列を、それぞれの次元のインデックスや、1次元目の要素数からアドレス計算をしながら
ポインタ扱いして、更にchar * のメンバ変数で文字列を扱ったり、関数の引数にアドレスを渡し
て、関数の中では、もう一段階進んだポインタを扱うことになったりして、苦心惨憺してしまうのお。
関数ポインタの配列も必要だし。
そういうことで悩んでしまうが、どうしようかいな。
151デフォルトの名無しさん:2005/08/10(水) 01:16:38
っ[C++]
152デフォルトの名無しさん:2005/08/10(水) 01:17:57 BE:104838473-
>>150
変に工夫しないで素直に組めば?
153デフォルトの名無しさん:2005/08/10(水) 01:37:30
そういうことで悩むならC++使った方がマシ
154デフォルトの名無しさん:2005/08/10(水) 01:40:09
だからC++が使えない開発環境なんだよ!
155データボックス:2005/08/10(水) 01:44:21
いや、今はC++ BuilderでWindowsプログラムのイベントハンドラにC言語のコードを差し込んでるんだけどな。
156デフォルトの名無しさん:2005/08/10(水) 01:59:06
>>できるだけ配列をポインタ扱いでコーディングするように努めてるが
(バッサリ略)
センスの悪い奴がわかってるつもりでへんに頭をひねったつもりになっても、
ちぃ〜ともなぁ〜んの解決にもならん、というだけの話かと。
157デフォルトの名無しさん:2005/08/10(水) 02:16:53
>>156
何だ、半人前のCプログラマの分際で何を言ってるんだ。
158デフォルトの名無しさん:2005/08/10(水) 02:30:46
コピペしてはりまくってください。
9/11選挙では 最高裁裁判官の国民審査もあります。下記2人にはご注意を。
「外国人参政権反対」という主張の人は下の二人(賛成派)を落とすべきです。

[裁判官 滝井繁男の反対意見]
・外国人の地方選挙権を付与することを禁止しているものではないのである(スゲー!)
・日本人に限られるのは地方公共団体の長だけでいい。(スゲー!)

[裁判官 泉コ治の反対意見]
・地方公共団体は,国が日本における在留を認めた外国人について,当該地方公共団体内における活動
を自由に制限できるものではない。(スゲー!)
・特別永住者が地方公共団体の職員になることを禁止する法はない。
・地方公共団体でトップ、警察、消防、以外なら、外国人を任用してもいい。(スゲー!)
159デフォルトの名無しさん:2005/08/10(水) 09:13:00
可読性を高めるのに配列形式の方が良いとなれば
当然そうするし、ポインタの方が良いとなれば当然
160デフォルトの名無しさん:2005/08/10(水) 09:36:17
>>159
どちらが可読性が高いのか
を決めるは当然、開発担当者?
161デフォルトの名無しさん:2005/08/10(水) 11:15:38
>>156
お前は何の応用力もなく、進歩できないからといって負け惜しみを言ってるだけだよな。
>ちぃ〜ともなぁ〜んの解決にもならん、というだけの話かと。
お前よりは多くの問題解決の実績があるはずだな。
162デフォルトの名無しさん:2005/08/10(水) 13:15:41 BE:174731257-
>>150 がどういう状況でどういうコードを書いているか分からんし。
163データボックス:2005/08/10(水) 13:40:38
そうか、Cを完璧にしないうちにC++に進んでもいいのかいな。
164デフォルトの名無しさん:2005/08/10(水) 14:27:00
>>163
Cを完璧?
完璧の定義は?
負け惜しみにもほどがあるな
165デフォルトの名無しさん:2005/08/10(水) 14:33:13
>>164
粘着乙
166デフォルトの名無しさん:2005/08/10(水) 14:52:02
>>165
キモイヨおまえ
167デフォルトの名無しさん:2005/08/10(水) 15:35:53
「C も使えん香具師にはC++は無理」
「藻前に Cは無理、C++でも使っとけ」

どちらの発言にも一面の真理が含まれている。
168データボックス:2005/08/10(水) 15:56:02
高級アセンブリ言語Cを究めなくてどうするんだろうな。
169デフォルトの名無しさん:2005/08/10(水) 15:58:06
究めてから言えや
170デフォルトの名無しさん:2005/08/10(水) 19:12:47
こんばんは、よろしくお願いします。
char 型の配列を一度初期化して、
もう一度値を入れて生きたいのですが、
どうすればよいのでしょうか。
char a[100];
a = "ああ";
a = NULL;のようなこと死体のですが、これではむりです。
a = "いいいい";
171デフォルトの名無しさん:2005/08/10(水) 19:16:21
>>170
入門書くらいは読んでください。
172デフォルトの名無しさん:2005/08/10(水) 19:25:25
char *a;
a = "ああ";
a = NULL;
a = "いいいい";
173デフォルトの名無しさん:2005/08/10(水) 19:56:00
>>171
そうですねすみませんでした。
>>172
ありがとうございます。
できました。
174データボックス:2005/08/10(水) 20:07:00
>>173
char a[100];
strcpy(a, "ああ"); /* #include <string.h> */
*a = '\0';
strcpy(a, "いいいい");
175デフォルトの名無しさん:2005/08/10(水) 20:59:12
関数の引数に hoge(&a)
みたいにアドレスを渡す時って、関数の仮引数に int hoge(*aa)
と書くことが多いだろ?
本で読んだときからずっとハテナだったが、a=10 で &a=FFFFFF(仮に)
だったとき明らかに値がずれてないか?そういう約束なのか?
176デフォルトの名無しさん:2005/08/10(水) 21:02:17
char *a;
a = "ああ";
a = NULL;
a = "いいいい";
strcpy(a, "うううう");
177デフォルトの名無しさん:2005/08/10(水) 21:02:56
>>175
質問は日本語で書いてください
178デフォルトの名無しさん:2005/08/10(水) 21:04:05
>>175
悪いことは言わない。
ポインタのない言語に乗り換えてくれ。
179デフォルトの名無しさん:2005/08/10(水) 21:07:23
>>175
なぜa=10 で &a=FFFFFFだと値がずれるんだ?
180デフォルトの名無しさん:2005/08/10(水) 21:11:02
>>173
別に 172が間違いなわけじゃないが、あきらかに勉強不足なんだから、
文字の配列と文字列定数へのポインタとを混同すんじゃないよ。
174の strcpy()等も調べとく。
181データボックス:2005/08/10(水) 21:12:06
>>176
strcpyはネタだよな。
182156はこれと156だけ:2005/08/10(水) 21:52:49
>>150 って、163,168 同様、厨ネタにしかならんのよ。
そんな不細工なソースを人に受け渡しするなら殴ってもいい。
(C++以前にデータや論理の抽象化云々…)
実際、157,160,161 あたりが、
>>できるだけ配列をポインタ扱いでコーディングするように努めてるが、
に何の意味があるか解説すると、もっと面白くなるかもしれないが。
183デフォルトの名無しさん:2005/08/10(水) 21:56:05
>>181
考えが浅いな
184デフォルトの名無しさん:2005/08/10(水) 22:34:16
156が何言ってるのかわからないのは俺だけですか
185デフォルトの名無しさん:2005/08/10(水) 22:52:26
>>183
詳しく
186デフォルトの名無しさん:2005/08/10(水) 23:12:15
187デフォルトの名無しさん:2005/08/10(水) 23:14:03
>>186
ウザス
188デフォルトの名無しさん:2005/08/10(水) 23:15:12
>>186
氏ね世
189デフォルトの名無しさん:2005/08/11(木) 01:09:39
コマンドプロンプトで、コマンドライン引数を使ってプログラムを動かす
のですが、コマンドライン引数の最大長はどのくらいまでですか?
引数の文字列を5000byteくらい使いたいのですが、そんな長さでも正常に
プログラムに引数が渡りますか?
試したら渡ったようなのですが、毎回渡りますか?
190デフォルトの名無しさん:2005/08/11(木) 01:11:16
環境依存
191デフォルトの名無しさん:2005/08/11(木) 01:12:20
int i;
char c;
c = 0xff;
i = c << 24;

これ、gcc3でコンパイルするとi==0xff000000になりますが、
この結果は規格で保証されてますか?
192デフォルトの名無しさん:2005/08/11(木) 01:14:00
>>190
環境依存とはどういうことですか?
193デフォルトの名無しさん:2005/08/11(木) 01:14:11
保証されてないんじゃないの?
194デフォルトの名無しさん:2005/08/11(木) 01:17:27
>>193
windows のコマンドプロンプトでしてますが、それ以外だとできないかも
ということですか。
195デフォルトの名無しさん:2005/08/11(木) 01:23:50
日本語書いてるんだから
日本語を読んで理解できるだろ?

> 環境依存
環境に依存

わかる?
196デフォルトの名無しさん:2005/08/11(木) 01:29:59
たとえばスタック容量不足で変数が消えるとか。賢くないコンパイラではへんなことになる。
197デフォルトの名無しさん:2005/08/11(木) 01:31:16
>>194
Microsoftが仕様として明文化していなければ、同じマシンでも動いたり
動かなかったりするかもしれない。
Posixでは4096バイトまでは大丈夫なはずだが、コマンドプロンプトが
Posixに準拠しているかどうかは知らない。
198デフォルトの名無しさん:2005/08/11(木) 01:31:37
>>191
int型が32ビットとは限らないんじゃないか?
199デフォルトの名無しさん:2005/08/11(木) 01:32:18
>>195
コミュニケーション能力ありますか?
200デフォルトの名無しさん:2005/08/11(木) 01:33:21
>>195が一番適切なレスだと思うんだが
201デフォルトの名無しさん:2005/08/11(木) 01:35:22
>>200
自演か以前自分がそういう感じで答えられて腹立ってんでしょ
202デフォルトの名無しさん:2005/08/11(木) 01:37:24
>>197
レスありがとうです。
さっきwindows 98で試してみましたが、116文字まででした。
windows xpだと4096バイトで試してもうまくいきました。
203デフォルトの名無しさん:2005/08/11(木) 01:39:06
心配するくらいならファイルに記録したものを読み込ませればいいのに。
リダイレクトやパイプが使えるのならそれ使ってもいいし。
204デフォルトの名無しさん:2005/08/11(木) 01:40:28
>>203
ファイルに記録してそれから読ませるようにしてみます。
205デフォルトの名無しさん:2005/08/11(木) 01:44:14
Win98だと116文字か…MAX_PATH以下ってどうなんだろ…
206デフォルトの名無しさん:2005/08/11(木) 01:44:17
>>198
すみません、こうでした。

long l;
char c;
c = 0xff;
l = c << 24;

<< 演算子の左オペランド c は char ですが、
この場合演算前に c が long に promote されることが
保証されているか、が気になっています。
207デフォルトの名無しさん:2005/08/11(木) 01:44:25
staticしる
208デフォルトの名無しさん:2005/08/11(木) 01:50:27
規格上保障されるかどうかより、現実の実装で確実性の高い手法を使うべし。

もちろん後から読んだときに誰でもわかるように、明示的にキャストしてやったほうがいい。
209デフォルトの名無しさん:2005/08/11(木) 02:05:59
>>206
int型以下のサイズの整数演算は、すべてint型で行われる
「格上げ」あたりのキーワードでぐぐるといいかも

intのサイズは処理系依存。
intのビット幅以上のビットシフトの結果も処理系依存。
210デフォルトの名無しさん:2005/08/11(木) 02:22:31
>>205
'FILENAME.EXT' (8 + 1 + 3 = 12)
116 + 12 = 128
211デフォルトの名無しさん:2005/08/11(木) 02:33:14
PSPの制限が由来だな。
doskeyか何かとconfig.sysの設定で
2倍程度までは増やせた気もするが。
212デフォルトの名無しさん:2005/08/11(木) 03:13:39
>>209
なるほど。この場合、intが16bitだとcharの24bit shift結果は
規格上ロストする可能性があるということになりますね。
>>208
そうですね。キャストすることにします。
213デフォルトの名無しさん:2005/08/11(木) 11:05:42
>>182
何がどう厨ネタなのかわからんのだが。
心配するな、お前には受け渡ししないから。
そして、仕事しなくていいから。
>そんな不細工なソースを人に受け渡しするなら殴ってもいい。
それは自分自身のことにならないように気をつけることだな。
214デフォルトの名無しさん:2005/08/11(木) 11:51:07
>に何の意味があるか解説すると、もっと面白くなるかもしれないが。
それを言うなら、何がどう厨ネタなのか「解説すると、もっと面白くなるかもしれないが。」
215デフォルトの名無しさん:2005/08/11(木) 12:10:34
>>208
>規格上保障されるかどうかより、現実の実装で確実性の高い手法を使うべし。
規格上保証されているわけではないが、現実の実装で確実性が高いからその手法でも
まあいい、というのはわかるが、規格が保証されているものよりもあえて、規格は保証
されないが、現実の実装で確実性が高いものを推奨するという意味なのかな。
216デフォルトの名無しさん:2005/08/11(木) 14:17:24
こんにちは

Win32には、::IsDBCSLeadByte(char byte)という、マルチバイト文字かどうかを確かめるAPIがあるのですが、
ANSIライブラリにこのAPIと同様の機能をするものがありますか?
Googleで調べたのですが、どうもHitしませんでした。

教えていただけると助かります。

よろしくお願いします。
217デフォルトの名無しさん:2005/08/11(木) 14:47:35
ありません。
218デフォルトの名無しさん:2005/08/11(木) 16:14:52
linux板の方がいいのかな。

gccなんですが、/usr/include/linuxの下のヘッダではなくて、
/home/hoge/work/include/linuxの下にあるヘッダを読ませたい
んですけど、どうすればいいんでしょう。C_INCLUDE_PATHを

/home/hoge/work/include:/usr/include

と設定してるんだけど、どうしても標準インクルードの方が
優先されちゃうみたいで。
219デフォルトの名無しさん:2005/08/11(木) 16:20:41
素直に -I 使えよ
検索順序としては
-I > C_INCLUDE_PATHのような環境変数 > 標準ヘッダ
220デフォルトの名無しさん:2005/08/11(木) 16:34:30
> 素直に -I 使えよ

-Iは複雑なMakefileの中なんで。環境変数指定の方が優先
されると俺も思ってるんだけどなあ。/usr/includeとかの
クリティカルなパスは特別扱いされてるとか。その辺の事情
知らない?


221sage:2005/08/11(木) 16:41:54
>219
モノを頼んで悪いんだけどさ、今手元に環境あるんなら、

/home/hoge/work/include/linux/config.h:
#error "local"

main.c:
#include <linux/config.h>
main(){}

C_INCLUDE_PATH=/home/hoge/work/include gcc -c main.c

って試してみてくんない?
俺が阿呆なのかgccのblack magicに引っかかってるのか
切り分けたいんで。
222デフォルトの名無しさん:2005/08/11(木) 16:47:35
お前らスレ違い過ぎですよ。
処で、-Iは複数指定できるんでないかい?
223デフォルトの名無しさん:2005/08/11(木) 16:51:51
#include "lunix/config.h"
224デフォルトの名無しさん:2005/08/11(木) 16:53:18
-nostdinc してみるとか
225sage:2005/08/11(木) 17:37:02
やっぱスレ違いかの。だって「俺に聞け」って言うからさ。
ム板はめったに来ないので勝手が分からんでの。

> -nostdinc

なるほど、と試してみた。明示的に標準パスを付加してるはず
なんだけどなーんか微妙にエラーが出るんだよなー・・




ん?てことは/home/.../includeの方を読んでるってことかー?
てことは、阿呆なのはgccではなくやはり俺だったということかー?
226デフォルトの名無しさん:2005/08/11(木) 17:40:16
ていうかよく見たらあげてるな、俺。
227デフォルトの名無しさん:2005/08/11(木) 17:42:04
このスレでは、C言語自体の話題をするのであって、
Cコンパイラの実装の話は他のスレでやってくれ的なんだ
228デフォルトの名無しさん:2005/08/11(木) 17:45:23
Cursesとかで現在カーソルのある座標を取得する関数とかありませんか?調べていますがなかなか見つからない
229デフォルトの名無しさん:2005/08/11(木) 17:51:55
/home/の下読んでた。阿呆なのは俺だった。お騒がせ。
230デフォルトの名無しさん:2005/08/11(木) 17:52:18
>>228
あんたもスレ違いですから。
cursesは専用スレがないから環境依存OKスレかUnixプログラミングスレ辺りかな。
231デフォルトの名無しさん:2005/08/11(木) 17:58:52
>>230
スマソ、スレ違いでした。
CursesにはこだわっていないのですがC言語の標準関数では無理なんでしょうか?
232デフォルトの名無しさん:2005/08/11(木) 18:00:41
>>231
しつこいぞボケ
233デフォルトの名無しさん:2005/08/11(木) 18:04:58
>>231
誘導したんだから……
標準関数に座標を云々する関数がないことくらいすぐ判るだろ。
234デフォルトの名無しさん:2005/08/11(木) 18:12:32
>>213,214
ふうむ、スレ違い相当の低脳厨がはりついてるのだけはよくわかった。
235デフォルトの名無しさん:2005/08/11(木) 20:16:06
はいはい埋め埋め
236デフォルトの名無しさん:2005/08/11(木) 22:10:54
C言語に限らないんだけど質問させて

テストの時、トレースするのめんどいからprintf文で値確かめようとしたら
ソースが汚くなるからやめろっていわれた。テスト終わったら消すっていったんだけど
めんどくさがらないでトレースしろ、といわれたんだけどこれって普通?

知りたい値が最初から決まってるんだからprintfでいいと思ったんだけど
わざわざデバッガでトレースするのめんどくせーし
237デフォルトの名無しさん:2005/08/11(木) 22:18:36
>>236
GUIプログラムとかprintfで出力する先がないときもあるし。
238デフォルトの名無しさん:2005/08/11(木) 22:23:13
>>236
たんなるprintfじゃ、確かに見難くなるかもな。
デバッグ出力用の専用ライブラリを使うなり作るなりしろ。
DBG_PRINT() とか DBG_MSG() みたいな用途がハッキリ分かるマクロなら、そんなに可読性を損なうこともない。
リリース時にはマクロでブランクに置換。
239デフォルトの名無しさん:2005/08/11(木) 22:27:24
デバッガ用のマクロ/スクリプトを書くのが良い方法
と思ったが、その種の機能は使っているデバッガに有りや無しや
240データボックス:2005/08/12(金) 00:25:34
 int n1;

 n1 = 1 //* */ 2
  ;
 
 if (n1)
 printf("何で 0 にならないんだ?\n");
241デフォルトの名無しさん:2005/08/12(金) 00:33:47
>>240
最近のCコンパイラはC++ コメントを理解するから //
以降がコメントとされて消えたと思われ。
242デフォルトの名無しさん:2005/08/12(金) 00:35:22
なんでマジレス?
243デフォルトの名無しさん:2005/08/12(金) 00:58:36
>>236
そもそも、テストの時始めからデバッガ使うなんて横着。
244デフォルトの名無しさん:2005/08/12(金) 01:03:33
全関数全分岐、ステップ実行で目視確認するのかね。
近寄りたくないチームだ。
245デフォルトの名無しさん:2005/08/12(金) 01:16:04
>>236
debugはマクロ使うな。
テスト後にデバック用printfの削除だと
消し忘れが発生するかもしれない。

出荷やソースコードのcvs管理等をやってない、
どーでも良いプログラムならprintfでも有りだけど。
246デフォルトの名無しさん:2005/08/12(金) 01:19:32
マクロの消し忘れと、cvsの関係が分からん。
247デフォルトの名無しさん:2005/08/12(金) 01:21:04
単に最初の一行はその後の文章と何の関係もない文章なのか?
下手だな。日本語。
248デフォルトの名無しさん:2005/08/12(金) 01:24:07
消すのはもったいないなぁ。
起動パラメタなどでデバッグレベル調節できるようにすればリリースバージョンでも
デバッグメッセージ消さなくても済む。
249デフォルトの名無しさん:2005/08/12(金) 01:31:43
まぁ、ASSERTとかTRACEとかのマクロ使うよな、大抵。
250デフォルトの名無しさん:2005/08/12(金) 01:37:05
>debugはマクロ使うな。
この文は「俺はマクロを使うよ。」、「お前らはマクロを使ったらダメだ。」のどちらにも取れる。
>>245は、前者の意味で書いたと思うが、>>246- は、後者の意味で読んでいると思われ。

>>247の2行目に同意。
251デフォルトの名無しさん:2005/08/12(金) 16:02:12
えーと、いまソケット通信を行うプログラムを作っています。
送受信ともにselect()を使って待機させているんですが、
CPU使用率が99%とかいってしまいます。

OSはRedHat9 2.4.20-6です。
252デフォルトの名無しさん:2005/08/12(金) 16:09:21
で?
253デフォルトの名無しさん:2005/08/12(金) 16:09:27
>>251
独り言ですか。邪魔です。
254デフォルトの名無しさん:2005/08/12(金) 16:12:25
>>251
タイムアウト時間をきちんと設定してください。迷惑です。
255デフォルトの名無しさん:2005/08/12(金) 16:15:54
selectの使い方を間違ってるんじゃないの?
selectから読み書き可能だと通知されたファイルを放置してるとか。
256256:2005/08/12(金) 16:21:04
 
257デフォルトの名無しさん:2005/08/12(金) 16:22:31
>>256
なるほど・・・そういう考えもありか
258251:2005/08/12(金) 16:23:30
肝心の質問かいてないおれアホッス

CPU負荷率が高いのはselect()使ってたら、しょうがないんですか?
(タイムアウトなしです)
下がられるなら下げたいので、その方法もお願いします。

で、もしかして答えは>>254だったり?
259デフォルトの名無しさん:2005/08/12(金) 16:26:54
マニュアルよんだのか?
読んでないのなら読め
読んだのなら理解できてないからもっかい読め
260デフォルトの名無しさん:2005/08/12(金) 16:33:51
あと、man select_tutの内容もチェックな。
261デフォルトの名無しさん:2005/08/12(金) 16:42:19
つーか、スレ違いだがね。
262デフォルトの名無しさん:2005/08/12(金) 16:55:02
>>260
解決しました、ありがとう。

ちなみに原因↓

SELECT の掟
10. タイムアウトの値は select を呼ぶたびに初期化すべきである。 OS に
よっ て は timeout 構造体を変更する場合があるからである。ただし
pselect は、自分の timeout 構造体を変更することはない。
263デフォルトの名無しさん:2005/08/12(金) 18:47:56
日本語のマニュアルをよんでる時点で
こいつの程度が分かるな
264デフォルトの名無しさん:2005/08/12(金) 18:50:46
>>263
その程度の事しか見ていないお前の程度も解かるよ。
265デフォルトの名無しさん:2005/08/12(金) 19:01:44
>>263
Linuxユーザは基本的に日本語マニュアル読んでるな

266デフォルトの名無しさん:2005/08/12(金) 19:03:10
MIKO GNYOユーザーの俺が来ましたよ
267デフォルトの名無しさん:2005/08/12(金) 19:13:31
>>265
読んでないんじゃなくて読めないんだと思う
イベントとかいったら、たまにLinux使ってる人と話すことがあるけど
そのときになんか聞いたりすると、マニュアル見て英語だったら一瞬で閉じて
googleで日本語サイト限定にして検索する
めっちゃ古いのとか、gnuのじゃなかったりしてもお構い無しにそれを読んでた
268デフォルトの名無しさん:2005/08/12(金) 19:20:53
ここで英語のマニュアル引用しても、読める奴がいないしな。
269デフォルトの名無しさん:2005/08/12(金) 21:25:35
2chは日本人用の掲示板ですから
英語にかぶれた非国民は出て行け!
270デフォルトの名無しさん:2005/08/12(金) 21:32:05
プ
271デフォルトの名無しさん:2005/08/12(金) 21:52:38
正直、K&Rの「5.12 複雑な宣言」が理解できなかった。

char (*(*x[3])())[5];

ってなんだよ?こんな変態じみた宣言を普通に使ってるのか、おまえら?
俺は、宣言の意味さえ分からん・・・
272デフォルトの名無しさん:2005/08/12(金) 21:55:37
必要だからそう宣言するだけ
意味が分かればそれが分かると思う

意味が分からないということは
それが必要でないって事
必要でなければ知る必要もないでしょ
273デフォルトの名無しさん:2005/08/12(金) 21:55:57
そういうのはtypedefで分解してやるとわかりやすいかも
274デフォルトの名無しさん:2005/08/12(金) 21:58:57
char を返す関数ポインタの配列の配列へのポインタ?

なんか戻り地の書き方が変なような。
275デフォルトの名無しさん:2005/08/12(金) 21:59:36
お前ら真面で分からないのか・・・
276デフォルトの名無しさん:2005/08/12(金) 22:00:23
ただの配列じゃん
何が分からないのか分からん
277デフォルトの名無しさん:2005/08/12(金) 22:00:42
関数ポインタの配列と理解した
278デフォルトの名無しさん:2005/08/12(金) 22:04:09
複雑すぎる宣言は使いみちはあまりない。
>>273 みたいなのは、、二段のディスパッチテーブルに分解したほうが使いかってがいい。
279デフォルトの名無しさん:2005/08/12(金) 22:04:28
>>271
http://kmaebashi.com/programmer/pointer.html
x is array[3] of pointer to function() returning pointer to array[5] of char.
つまりxはcharの配列[5]へのポインタを返す関数へのポインタの配列[3]。
280デフォルトの名無しさん:2005/08/12(金) 22:06:27
いや見ただけで分かるだろ
281デフォルトの名無しさん:2005/08/12(金) 22:09:25
こう言うの、一瞬見ただけで分からないと、Cプログラマーを名乗ってはいけないのか?
282デフォルトの名無しさん:2005/08/12(金) 22:10:29
むしろ解るやつはPerler
283274:2005/08/12(金) 22:11:18
「配列へのポインタを返す」ってとこが分からんかった。
つか今でもピント来ないな。

char (*)[]

配列へのポインタだろ。これを返す関数は。どういうプロトタイプになるんだ?

char (*)f()[]

char (*f)()[]

うーん。
284デフォルトの名無しさん:2005/08/12(金) 22:11:24
いけなくは無いと思うけど
charとキャストとポインタが分かってたら分かるだろ
それらを理解してたつもりで上を読んで理解できなかったのなら
理解できてなかった証拠でしょ
285デフォルトの名無しさん:2005/08/12(金) 22:14:41
>>271を読み解くのは問題ないけど、
typedef どう使うのかわからん。
286デフォルトの名無しさん:2005/08/12(金) 22:22:04
>>283
char (*)[]を返す関数はchar ((*)[])()。全体を括弧でくくって右に関数の括弧を付ける。
287デフォルトの名無しさん:2005/08/12(金) 22:22:19
>>285
俺ならこうやる(型名が糞とか抜きね)

typedef char FIXEDSTRING5[5];
typedef FIXEDSTRING5 *LPFIXEDSTRING5;

以下略
288デフォルトの名無しさん:2005/08/12(金) 22:23:54
>>285
つまり自分で書くソースにあんな宣言が必要になったら>>287みたいにtypedefを使うということ。
既存のものを読み解くのに使えるわけではない。
289デフォルトの名無しさん:2005/08/12(金) 22:35:31
>>285
typedef char (*Type_X)[5];//char型配列[5]のポインタ
typedef Type_X (*Type_FuncX)();//Type_Xを返す関数のポインタ

//検証用 これでコンパイラ通れば正解。
char (*(*x[3])())[5];
Type_FuncX lp = NULL;
x[0] = lp;

290デフォルトの名無しさん:2005/08/13(土) 06:32:25
なんで、
char*[5] (*f[3])();
じゃないの?演算子の優先順位の問題?
291デフォルトの名無しさん:2005/08/13(土) 06:36:24
ああそうか。悪い、スルーしてン。
292デフォルトの名無しさん:2005/08/13(土) 13:53:41
関数ポインタが入った段階で typedef しちゃうへたれだけど、とりあえず
ttp://www.kouno.jp/home/c_faq/c1.html#21

char (*(*x[3])())[5]; を typedef 分解するとこんな感じだろうか。

typedef char A[5]; /* A = (*(*x[3])()) -> A *(*x[3])(); */
typedef A *B; /* B = (*x[3])() -> B (*x[3])(); */
typedef B C(); /* C = (*x[3]) -> C *x[3]; */
typedef C *D; /* D = x[3] -> D x[3]; */
D x[3];

あるいは
typedef A x[3]; /* typedef char (*(*A)())[5]; */
typedef B *A; /* typedef char (*B())[5]; */
typedef C B(); /* typedef char (*C)[5]; */
typedef D *C;
typedef char D[5];

>286
それだと、char 型を返す関数の配列へのポインタにならない?
char (*f())[5] じゃないか?関数ポインタの型だと char (*(*)())[5] かな。
293デフォルトの名無しさん:2005/08/13(土) 22:11:48
コマンドラインからもらったargv[]がファイルなのかディレクトリなのか
判断するにはどうすればいいですか?
294293:2005/08/13(土) 22:12:31
すいませんWinXPです。
295デフォルトの名無しさん:2005/08/13(土) 22:27:14
296デフォルトの名無しさん:2005/08/13(土) 22:42:50
>>293
argv[]は単なる文字列へのポインタ。
その文字列が、ファイル名かディレクトリ名か、
あるいは、その他の意味を持つ文字列かは、
コマンドラインで実行した本人以外は誰もわからん。

その文字列と同じ名前のファイルやディレクトリが
存在するか確認する方法はOS依存。

まあ、拡張子が付いていたらファイル、それ以外はディレクトリ、
ファイル名、ディレクトリ名に使用できない文字があったらエラーとか、
ファイルをオープンしにいって、成功したらファイル、それ以外はディレクトリとか、
そんな安易な実装でいいんだったら、純粋なCでも可能だけど。
297デフォルトの名無しさん:2005/08/13(土) 23:04:40
>>296
そんな安易な実装について聞いているんだろ
OS依存といってもPOSIX準拠な方法があるんだから
もうstatでいいじゃん。面倒くさい。
298デフォルトの名無しさん:2005/08/13(土) 23:10:16
やれやれだぜ
299293:2005/08/13(土) 23:42:56
>>297
statをmsdnで調べて出来ました!
ありがとうございました。

>>296
決して安易という訳ではないんですが、
こういうシステム依存の部分て調べ辛くて…
文法とかアルゴリズムは良く見つかるんですけどね。

>>295
言いたいことはよく分かるのですが、
正直、1のリンクからは見つけられませんでした。
300デフォルトの名無しさん:2005/08/13(土) 23:55:13
>>295みたいなのはマジであほというか、ナンセンス
>>296みたいなのは長々と書いてるだけで何の情報も無い
長文結構だが、その中にこっそり情報混ぜてやれよ

こういう>>293みたいなやつにはヒントをあげるだけでいいんだよ。
問題はそのヒントのセンス。
301デフォルトの名無しさん:2005/08/14(日) 00:13:28
ナンセンスとかヒントとか使う奴増えたなー
302デフォルトの名無しさん:2005/08/14(日) 03:45:39
ヒントが増えたことは認めるがナンセンスは認めない
303デフォルトの名無しさん:2005/08/14(日) 04:25:25
>296はダメダメだな。例えばa.txtなるディレクトリがあるやもしれん。
304デフォルトの名無しさん:2005/08/14(日) 05:51:39
ううむ、夏の補講で残されてる数人だけが
俺だって勉強してると言わんばかりに
とくいげに無駄話ばかり続ける状態。
305デフォルトの名無しさん:2005/08/14(日) 12:03:39
ファイルの内容を%x使わないで16進数に表示させたいのですが、どうやったらいいんでしょうか?
306デフォルトの名無しさん:2005/08/14(日) 12:06:27
宿題は宿題スレへ
307デフォルトの名無しさん:2005/08/14(日) 12:06:43
>>305
%x使うのが一番楽。
308デフォルトの名無しさん:2005/08/14(日) 12:11:28
宿題スレにいきます
309デフォルトの名無しさん:2005/08/14(日) 12:12:16
猫でもわかるC言語プログラミングという本を見ながら
勉強しようとしたんですが、わからない事があります。
Microsoft Visual C++ .NET にて

/*hello.c*/
#include <stdio.h>
int main()
{
printf(
"Hello ""World\n");
return 0;
}

というのをビルドしたんですが
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 _WinMainCRTStartup で参照されました。
fatal error LNK1120: 外部参照 1 が未解決です。

と、エラーが二つでます。 どうしたらいいのでしょうか?
設定があるのですか? それともソースを変えなきゃ行けないのでしょうか? 
310デフォルトの名無しさん:2005/08/14(日) 12:15:28
まず>>1をよく読む
311デフォルトの名無しさん:2005/08/14(日) 13:50:55
わかってないと思うけど、>>309のしつもんは環境依存なんですよ
Windowsプログラミングのスレで聞いてくださいね
312デフォルトの名無しさん:2005/08/14(日) 14:05:22
>>305
16で割った余りを調べて10-15をa-fに変換して配列に入れる
商が0になるまで続ける
配列を%sで出力
313デフォルトの名無しさん:2005/08/14(日) 14:09:22
その本の作者のサイトがここにある
ttp://www.kumei.ne.jp/c_lang/
そしてここを見て設定しなおせ
ttp://www.kumei.ne.jp/c_lang/net/index.html
314デフォルトの名無しさん:2005/08/14(日) 14:10:05
>>313
>>309
315305:2005/08/14(日) 16:00:43
>>312
ありがとうございます。

ファイルからデータ読み込む方法はfgetcを使用してるんですが、
漢字が上手く取り込めません。16進数表示部が文字化けしてしまいます。
316デフォルトの名無しさん:2005/08/14(日) 16:07:41
>>315
宿題スレでコードで解答もらってんじゃん
317デフォルトの名無しさん:2005/08/14(日) 16:11:55
>>315
文字化け…?
fgetcの戻り値はただの整数だから化けることはないと思うけど。
言い忘れたけど配列の最後には必ずNULLを入れること。
318デフォルトの名無しさん:2005/08/14(日) 19:09:32
rand関数によって出てくる数列ってOSに依存するんですか?
319デフォルトの名無しさん:2005/08/14(日) 19:18:27
>>318
ライブラリに依存する
320デフォルトの名無しさん:2005/08/14(日) 19:18:42
>OS
じゃなくてコンパイラ付属のライブラリ
(あれ?winな環境だとAPIとかでOSなのか?)
321デフォルトの名無しさん:2005/08/14(日) 19:34:12
>>320
ないない。
UNIX系なら仮想ファイルで乱数取得が可能かも知れんけど
322デフォルトの名無しさん:2005/08/14(日) 20:36:23
「「自分と同じシグネチャを持つ関数へのポインタ」を返す関数」へのポインタ型って定義できるんでしょうか?

typedef func_t (*func_t)(obj_t *obj);
func_t func1(obj_t *obj);
func_t func2(obj_t *obj);
func_t func3(obj_t *obj);

のように。(実際にはこうは書けない)

typedef void *(*func_t)(obj_t *obj);
void *func1(obj_t *obj);
...

こんな感じに書いて、あとは必要に応じてキャストすれば済むには済むんですが、気になったもので……。
323デフォルトの名無しさん:2005/08/14(日) 21:03:59
>>322
できませんC++でtemplate使いなさい
324デフォルトの名無しさん:2005/08/14(日) 22:53:04
交換・選択・挿入のソートプログラムを作って、試しに50000個の乱数をソートさせてみたのですが、
挿入ソートが他の2つよりも3倍以上早かったんですがそんなものなんでしょうか?
3つともO(n^2)とどこかでみたのですが
325324:2005/08/14(日) 22:53:35
すいません。よく考えたらスレ違いですね
326デフォルトの名無しさん:2005/08/14(日) 22:55:27
ある程度並んでいる状態での挿入ソートは
実は効率よく終わるように考慮されているロジックであれば一番速かったりする
327デフォルトの名無しさん:2005/08/14(日) 22:59:20
>>326
こんな感じなのですが、これが基本形ですよね?
void bubble(int *d,int n)
{
  int i,j;
  for(i=0;i<n-1;i++){
    for(j=n-1;j>i;j--)
      if(d[j]<d[j-1]) swap(d[j],d[j-1]);
  }
}

void insert(int *d,int n)
{
  int i,j;
  for(i=1;i<n;i++){
    int temp=d[i];
    for(j=i;j>0 && d[j-1]>temp;j--)
      d[j]=d[j-1];
    d[j]=temp;
  }
}
328デフォルトの名無しさん:2005/08/14(日) 23:36:37
なんでスレ違いに得意げに無意味なレスだけ増やすやつらが沸いて出るんだ?
329デフォルトの名無しさん:2005/08/14(日) 23:41:02
>>324
Oは問題の大きさに対して計算量がどう増加するかを表わすもので、
計算量そのものを表わすものじゃないし。
330デフォルトの名無しさん:2005/08/14(日) 23:42:58
>324
たとえば昇順にソートしたいとき、降順にソート済みの入力でためしとけ
331デフォルトの名無しさん:2005/08/15(月) 04:17:31
つーか、順次生成したデータをソートするケースなら挿入ソートが速いのは自明だ罠。
332デフォルトの名無しさん:2005/08/15(月) 09:18:14
Cってもう時代遅れでC++・C#の方が良いって聞いたんですが本当ですか?
333デフォルトの名無しさん:2005/08/15(月) 09:43:50
>>332
ウソです。
334デフォルトの名無しさん:2005/08/15(月) 09:56:35
>333
そうですか
レス乙です
ヤッパリ老舗のCが良いんですか?
335デフォルトの名無しさん:2005/08/15(月) 10:00:07
Cωが一番良いです。
336デフォルトの名無しさん:2005/08/15(月) 10:03:39
ネタレス止めてくれぃ
337デフォルトの名無しさん:2005/08/15(月) 10:06:28
スミマセン
ググったらマジで有りましたオメガですか・・・
338デフォルトの名無しさん:2005/08/15(月) 10:08:44
もう、しょうがないなぁ、337は
339デフォルトの名無しさん:2005/08/15(月) 10:14:30
でCが安定してて良いんですか?
340デフォルトの名無しさん:2005/08/15(月) 10:24:52
安定させるのはプログラマ次第です。
341デフォルトの名無しさん:2005/08/15(月) 10:25:00
プログラマの技量による
頼むからJavaに移ってくれ…という香具師もいる
342デフォルトの名無しさん:2005/08/15(月) 10:33:25
Cが時代後れということはないのだが、PC 関係のプログラムを
なんでもかんでもCで作る時代は MS-DOS の時代に終った。
343デフォルトの名無しさん:2005/08/15(月) 10:41:16
MS-DOS の時代の後半はメモリの上限が 640KB だった。EMSメモリを
付けてバンク切り替えで記憶容量は増やすことが出来たがそれでも数M
だった。CPUクロックも 16MHz, 33MHz, 66MHz など、MHz 単位で
3桁に満たなかった。そのような状態だったので当時あらゆる開発に
C言語を使うことは現実的な選択だったのだ。C言語であれば容量が小さく
高速なプログラムがアセンブラで組むよりはるかに楽に作れたからだ。
344デフォルトの名無しさん:2005/08/15(月) 10:54:48
ミナサマ、レスありがとうございます
初心者はC++・C#よりCから始めた方が良いのでしょうか
345デフォルトの名無しさん:2005/08/15(月) 11:45:50
ふつーC++。つーかそれ以前にスレ違い。
なんでも質問すれとか初心者歓迎C/C++スレとかあるだろ。
346デフォルトの名無しさん:2005/08/15(月) 11:53:28
失礼
でも答えてくれて、あんがと
347デフォルトの名無しさん:2005/08/15(月) 12:13:44
なんかこぉバァァァーみたいな
348デフォルトの名無しさん:2005/08/15(月) 14:45:42
>>343
DOSでCが使われるようになったってのも、90年代に入ってからで、
それ以前はアセンブラが多かったとおもう。
349デフォルトの名無しさん:2005/08/15(月) 14:53:41
>>348
TURBO PASCAL がかなり使われてた。その後はLattice C。
MSCが使われだしたのはWindows3.x以降、コンパイラがDPMIなしじゃまともに動かなかった。
350デフォルトの名無しさん:2005/08/15(月) 15:00:49
でも、一太郎V3やLotus123、Mifesみたいなメジャーどころは皆MSCだったような覚えが。
VZがasmだったのは確かだけど。
351デフォルトの名無しさん:2005/08/15(月) 18:00:57
日本じゃTurboPascalはブームになる前にしぼんだような。
すぐにTurboCをはじめ低価格Cコンパイラで、Cブームに。
352デフォルトの名無しさん:2005/08/15(月) 18:44:40
>>351
TURBO PASCALが一番使われてたのはCP/MからMS-DOS2.11あたりの時代。
フロッピーディスクベースでエディタ+高速コンパイルが売りだった。
まだN88DISK-BASICと張り合ってた。
MS-DOS3,1まではMicrosoftもDOSの外部コマンドの作成などにLattice-Cを使ってた。
MS-Cが登場し、TurboCなどの低価格Cブームが来るのはこの後。
353デフォルトの名無しさん:2005/08/15(月) 19:06:57
うるせえよじじいども
354デフォルトの名無しさん:2005/08/15(月) 19:23:36
>>353
盂蘭盆会で地獄の釜が開いてるんだ、今日は大目に見てくれ。
355デフォルトの名無しさん:2005/08/15(月) 19:50:43
じじいだろうと、厨はウザイ、スレ違いだ。
Cの初心者、宿題系に、軒並みバカがはりついてるみたいだからそこに帰れ。
356デフォルトの名無しさん:2005/08/15(月) 21:00:56
#include <stdio.h>
int main(void)
{
float fbuff,ftmp;
int i;
for (i = 5;i <= 8;i++){
ftmp = 0;
switch(i){
case 5:
ftmp = 10 * i;
break;
case 6:
ftmp = 1 * i;
break;
case 7:
ftmp = 0.1 * i;
break;
case 8:
ftmp = 0.01 * i;
break;
}
if (i == 0){
fbuff = 0;
}
fbuff = fbuff + ftmp;
printf("ftmp = %f\n",ftmp);
printf("fbuff = %f ftmp = %f\n",fbuff,ftmp);
}
return 0;
}
実行結果が下記になる理由を教えて下さい。どうして「0.000003」多くなるのでしょうか?
fbuff = 56.780003 ftmp = 0.080000
357デフォルトの名無しさん:2005/08/15(月) 21:09:23
ふ、ふろーと
358デフォルトの名無しさん:2005/08/15(月) 21:20:44
>>356
一般的にfloatの精度は23ビット、即ち高々7桁しかない。
従って、有効なのはは56.78000までが関の山。
%fの代わりに%gを使うことで、誤差を余り見ないで済むかもしれない。
尤も、素直にdoubleを使っとけと言う話になるが。
359356:2005/08/15(月) 21:22:01
>>358
ありがとうございました。
360デフォルトの名無しさん:2005/08/16(火) 10:54:11
お邪魔します。

ファイル内のバイナリの数字の羅列に対して、CSV処理するコマンドを作りたいです。
コマンドの引数として、別のファイルの定数一覧からCSVの区切り文字数を受け取って
処理させるものを作りたいと思っていますが、どう作っていけばいいのか分かりません。

どんな感じで作る物なのか、ヒントかもしくは
参考にしやすいサンプルソースを見れるサイトがあったら教えていただきたいです。
361デフォルトの名無しさん:2005/08/16(火) 12:12:25
>>360
>ファイル内のバイナリの数字の羅列に対して、CSV処理するコマンドを作りたいです。
具体例をあげて何がしたいのか説明して。
362デフォルトの名無しさん:2005/08/16(火) 12:16:53
エラトステネスのふるいのプログラムがわからないので質問させて下さい。

#include <stdio.h>

#defineN 1000 /* Nまでの素数を求める*/
#defineTRUE 1 /* 真:素数である */
#defineFALSE 0 /* 偽:素数でない */
charis_prime[ N+1 ]; /* 結果を格納する配列*/

int main( void )
{
int i, j;

/* 配列を初期化 */
for( i = 1; i <= N; i++ )
{
is_prime[ i ] = TRUE; /* 最初はすべて「素数」とする */
}
is_prime[ 1 ] = FALSE;

/* エラトステネスのふるい */
for( i = 2; i*i <= N; i++ )
if ( is_prime[ i ] )
for( j = i*2; j <= N; j += i )
is_prime[ j ] = FALSE; /* この倍数は「素数」でない */
/* 結果の出力 */
printf( "%dまでの素数は、\n", N );
for( i = 1; i <= N; i++ )
if ( is_prime[ i ] )
printf( "%d ", i );
return 0;
}
363デフォルトの名無しさん:2005/08/16(火) 12:19:48
>>360
>>1読め。ここは「C言語」自身に関して、だから
プログラムの組み方、等は激しくスレ違い。
364デフォルトの名無しさん:2005/08/16(火) 12:22:16
このソースのエラトステネスのふるいのfor文if文がわかりません。
最初のfor文のi*iの意味、次のif文に論理演算子がないこと、次のfor文のi*2の意味
がわかりません。

そこがわからないので結果の出力のfor文とif文もわからないです。

ネットでも調べたり本でも調べたんですけど、他のソースは別の書き方をしていて
そのやり方なら理解できるのですが、このソースはちょっとわからないのでよろしくお願いします。
365デフォルトの名無しさん:2005/08/16(火) 12:42:25
>>362

>最初の for の i*i の意味
ある数の約数の片方は必ず平方根以下であるから。
逆に考えると、約数( = i )の2乗が合成数以下。

>次の if 文に論理演算子がない
C の条件判断は、0 以外で真。
つまり、#define された TRUE が入ってれば真になる。
そもそも C には本当の意味での bool 型がないから整数で代用してる。

>その次の for の i*2 の意味
さらにその次の行のコメントのとおり、
素数の *2 *3 *4 …を約数でないとするため、
i*2 i*3 i*4…の数列を作るための for 文。

こんな感じでどうよ?
366デフォルトの名無しさん:2005/08/16(火) 13:14:29
>最初の for の i*i の意味
ある数の約数の片方は必ず平方根以下であるから。
逆に考えると、約数( = i )の2乗が合成数以下。

これはわかりました。

>、#define された TRUE が入ってれば真になる。
そもそも C には本当の意味での bool 型がないから整数で代用してる。
if文のis_prime[i]が整数で代用してるってことですか?ここら辺がちょっとわからないんですけど。
s_prime[i]は確かに整数・・・ああ、なんとなくわかってきた気がします。
s_prime[i]の要素の整数とif文の条件判断で使う1,0の整数と整数は二つありますね。
1,0の整数のことですね。ただif ( is_prime[ i ] ) の括弧の中がis_prime[ i ] !=0とかとなっていないのがわからないです。
何かの省略なんでしょうか?

>素数の *2 *3 *4 …を約数でないとするため、
i*2 i*3 i*4…の数列を作るための for 文。
i*2の2がわからないです。jがカウントアップしていきますよね。
そのときに2が変数でカウントアップしていかないと常に2の倍数になってしまうと思うのですが、

すぐ答えていただきありがとうございます。できればもうちょっとだけ上記のヒントを下さい。

367デフォルトの名無しさん:2005/08/16(火) 13:50:06
>if ( is_prime[ i ] ) の括弧の中がis_prime[ i ] !=0とかとなっていないのがわからないです。
つ[if文の定義]
368365:2005/08/16(火) 14:14:47
>>366

>if ( is_prime[ i ] ) の括弧の中がis_prime[ i ] !=0とかとなっていないのがわからないです。

if 文は 真/偽 を判断する、と考えてるとそういう思考に陥ります。
まず定義として if 文は、条件として与えるものは整数で、「0 か否か」を「偽 or 真」として判断します。

そして、!= とか == などの演算子は、0 かそれ以外の値をとる整数値になります。
よって、 たとえば (12 == 13) という条件文は「偽」ではなく 0 という "整数" をとります。

>そのときに2が変数でカウントアップしていかないと常に2の倍数になってしまうと思う

2が変数ってどういうことでしょうか?

for( j = i*2; j <= N; j += i )

i*2 は最初の j の値で、二週目以降 i ずつ増えます。
つまり、i*2、i*2+i、i*2+i+i、…となるわけで、i*2 i*3 i*4…となるわけです。
369デフォルトの名無しさん:2005/08/16(火) 15:27:07
唐突なんですが、構造体のポインタを返す関数があったらそのポインタの指すメモリ領域は
いつ開放されるのでしょうか。

関数の中で新たにヒープに割り当てて、そのアドレスを返したりしているのだったら、
あとでfreeなどで開放してやらないとマズイと思うのですが、
標準関数のlocaltimeなんかはそんなことしませんし。
その辺の解説してもらえるとありがたいです。
370デフォルトの名無しさん:2005/08/16(火) 15:48:41
ヒープに割り当ててないから。
371デフォルトの名無しさん:2005/08/16(火) 15:53:48
>>369
libc の localtime は、static な構造体へのポインタを返したり、
内部で自動確保&終了時に自動破棄しています。
そのため、受け取ったポインタを明示的に破棄する必要はありません。

ただし、前者はマルチスレッドの時に問題を引き起こす可能性がある
( 排他処理すればいいけどね ) ので、あまりおすすめはされない手法です。

そんなわけで生存期間は実装依存になるため、
あまり離れると移植性の点で問題になるかもしれません。
すぐに手元のローカル変数などにコピーするのがベターです。

ちなみに自分で関数を書く場合には、
struct tm *localtime_r(const time_t *timep, struct tm *result);
この result 引数のように、バッファを渡してもらう形にすると
余計なことを考えなくて済むのでベストです。
372369:2005/08/16(火) 16:09:02
>>370
回答ありがとう。
書き方が悪くてすみません。
localtimeは開放しない関数の例として挙げました。
一般に内部しようの分からない関数だったり、自分で作ったりしたときの当該問題における
寿命についての質問です。
373369:2005/08/16(火) 16:16:29
>>371
あらたな回答ありがと。

localtimeの仕様は了解しました。
さっきの質問、書き方が悪かったのですが、自分で作った関数内でメモリを割り当てて
そのポインタを返した場合はどうのようにするのが、適切なんでしょうか。

例えば、調べてて、見つけたのですが下記のようなプログラムは非常にマズイと思います。
ttp://c-production.com/contents/c/sec11.html#15

374デフォルトの名無しさん:2005/08/16(火) 16:30:49
>>373
その例がマズイと思えるなら特に言及する必要はなさそうね。

>>371 の最後に書いてあるように、特に何か事情がない限りは
バッファは呼び出し側が用意するのが一番いいかな。
new で確保して free() で解放するようなバグをなくすためにも。

どうしても関数内でメモリを確保しなきゃならないときは、
malloc で確保したら free、new で確保したら delete・・・
というルールを忠実に守ればOK。
375デフォルトの名無しさん:2005/08/16(火) 16:31:14
>>373
fopen()とfclose()みたいに、リソースを確保する関数と開放する関数を作って、
必ず両方呼び出してくださいとすればいいと思う。
(直接「free()を呼び出して下さい」でもいいと思うけど)

そのリンク先は、引数は値渡しなんだから、リターンも値で返せばいいのにな。
376デフォルトの名無しさん:2005/08/16(火) 16:41:01
>>374-375

よくわかりました。
そのルールを徹底します。
丁寧な解説ありがとうございました。
377デフォルトの名無しさん:2005/08/16(火) 16:52:11
>>373の例・・・なんでマズイんか教えてください。。
夏厨で申し訳ないんですが・・・orz
378デフォルトの名無しさん:2005/08/16(火) 16:57:37
>>377
変数 st のスコープが関数 p_output() 内に限られてるため、
st のメモリ領域は関数を抜けた時点で無効になる。
だから main() でこのポインタの先にアクセスしちゃだめ。
379デフォルトの名無しさん:2005/08/16(火) 17:00:22
例はたまたまうまく逝くだけ。以下のように変えると良く分かるかも。


#include<stdio.h>
struct st_samp{
int x;
int y;
int z;
};
struct st_samp *p_output(struct st_samp st);

int main()
{

struct st_samp s1={2,3,0}, s2={4,5,0};
struct st_samp *p_st;

p_st = p_output(s1);
p_output(s2);

printf("%d * %d = %d\n",p_st->x,p_st->y,p_st->z);
return 0;
}

struct st_samp *p_output(struct st_samp st)
{
st.z = st.x * st.y;
return &st;
}
380デフォルトの名無しさん:2005/08/16(火) 19:01:35
C++スレで質問してしまったので、こちらへ移動させて下さい
a_positionの位置から、配列の後>前へとhoge処理を行いたいのですが
これをfor文だけで綺麗に記述することは可能でしょうか

if( a_position == 0 )
 hoge( *array );
else
 for( int i = a_position; i >= 0; --i ) hoge( array[i] );
381デフォルトの名無しさん:2005/08/16(火) 19:02:45
for( int i = a_position; i >= 0; --i ) hoge( array[i] ); 
これで何が問題?
382デフォルトの名無しさん:2005/08/16(火) 19:09:30
381の回答がすぐ出ないC++スレの連中は一体
383380:2005/08/16(火) 19:13:05
>>381
申し訳ないです、仰るとおりっす
これと間違えていました…

if( a_position == 0 )
 hoge( *array );
else
 for( unsigned long i = a_position; i >= 0; --i ) hoge( array[i] );
384380:2005/08/16(火) 19:19:55
すいません、>>383もバグありです
要するに符号無しでの綺麗なループの話だったのですが、ぐだぐだなので出直してきます
385デフォルトの名無しさん:2005/08/16(火) 19:21:06
添え字にunsignedを使いたいなら
for( unsigned long i = a_position+1;i--;)hoge( array[i] );
386380:2005/08/16(火) 19:27:45
これで解決できました…こんな事でスレ汚しすいません

unsigned long a_position = 0;
do{
 hoge( array[i] );
}while( array_pos-- != 0 );

と、思ったら>>385さんのスマートなレスが!
やっぱり聞いて良かった、ありがとうございました。
ループは前置って刷り込みが駄目でした orz
387デフォルトの名無しさん:2005/08/16(火) 19:29:42
unsigned long a_position = 0;
do{
 hoge( array[a_position] );
}while( a_position-- != 0 );

もう寝よう…
388デフォルトの名無しさん:2005/08/16(火) 20:48:18
ほんとうに(なんで) unsigned long の範囲じゃないといけないのか?
含めて意味ないしすべてスレ違いだと思う。
>>385 境界条件 a_position = ULONG_MAX のふるまいは無視なのか?
389360:2005/08/16(火) 21:01:21
>>361
具体的に言うとファイル内に
「1234567890」
等の数字(バイナリ)が入っていて、
また別のファイルに
「3,4,3」
のように数字が入っていて、
これを
「123,4567,890」
に変える処理でう。


>>Cでプログラムを作るのですが、
 Cの仕様に関する質問じゃないとダメでしょうか?
390360:2005/08/16(火) 21:02:30
↑すみません抜けてました。
下段のは「>>363」です。
391385:2005/08/16(火) 21:08:29
>>388
a_position = ULONG_MAX のときは、
array の配列長が ULONG_MAX より大きいということになるから無視ということで。
無視してもそんな馬鹿でかい配列は滅多に無いですし、実用上は問題ないでしょう。
一応それも回避するなら >>386(の間違いを直したやつ)で
unsigned long i = a_position;
do hoge(array[i]);while(i-- != 0);
392デフォルトの名無しさん:2005/08/16(火) 21:09:02
>>360
バイナリを連呼しているが、「バイナリ」と「区切り文字数」という二つの単語は矛盾しているよ。
ファイルには単に十進数字文字が入っているだけだろ
393360:2005/08/16(火) 21:11:58
>>392
すみません、ちょっと抜けてました。

元のファイルはバイナリで、
それをテキストファイルに、特定の箇所に「,」を入れて出力する感じになります。
394デフォルトの名無しさん:2005/08/16(火) 21:13:01
>>393
そのバイナリファイルには何が入ってるんだ?入ってるのは文字では
ないわけだからカンマ区切りも何もないわけだが。
395デフォルトの名無しさん:2005/08/16(火) 21:18:23
>>383
このスレって黙ってC99前提?
396デフォルトの名無しさん:2005/08/16(火) 21:19:23
>>395
どっちでもいいんじゃね?
397360=389=393:2005/08/16(火) 21:21:28
>>394
見づらくなってしまって申し訳ありません。

書き込みが>>360>>389>>393とに分かれてしまっています。
>>389の書き込みで返事になるでしょうか?
398デフォルトの名無しさん:2005/08/16(火) 21:23:12
>>397
なってない。数"字"とバイナリデータを一緒にするな。
399デフォルトの名無しさん:2005/08/16(火) 21:24:51
>>389,360
ソース丸投げだか初心者向きかに逝け、と言われとるんだよ。
質問さえきちんとできてないだろ? ヒント程度では手も足も出ないだろ?
>>394 マヌケは質問者の補助にもならないから黙ってろ。
400360=389=393:2005/08/16(火) 21:28:37
了解しました。

初心者向き、もしくはソース丸投げスレを探してみます。
お騒がせして申し訳ありませんでした。
401デフォルトの名無しさん:2005/08/16(火) 21:58:23
>>360の言いたいのは
要するにバイナリダンプだろ。単にスペースがカンマになっただけで
[offset]: +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
----------------------------------------------------------------------------
00000000: 4D,5A,90,00,03,00,00,00,04,00,00,00,FF,FF,00,00 MZ・........��..
00000010: B8,00,00,00,00,00,00,00,40,00,00,00,00,00,00,00 ク.......@.......
00000020: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 ................
402360:2005/08/16(火) 22:55:23
>>401
フォローしていただいてありがたい所ですが、自分でもよく分かりません。

先日見た設定書では、
ファイルの中の先頭から**バイトにAの情報、次の**バイトにBの情報、・・・
というようなことが書かれていたと記憶しています。
また、「ダンプ」という言葉もチラッと耳にした覚えがあります。

教えを請うには色々と情報が足りなかったようです。
403デフォルトの名無しさん:2005/08/16(火) 23:04:48
>>368
>そして、!= とか == などの演算子は、0 かそれ以外の値をとる整数値になります。
>よって、 たとえば (12 == 13) という条件文は「偽」ではなく 0 という "整数" をとります。

比較演算子は0か1を返してくるよ。
a = ( x > 0 ) ? ( 1 ) : ( 0 );

a = x > 0;
と同じ。
見辛いからあまりお勧めはしないけど。
404デフォルトの名無しさん:2005/08/16(火) 23:17:29
>>403
...
405デフォルトの名無しさん:2005/08/16(火) 23:19:19
>>403は何が言いたいのか
406デフォルトの名無しさん:2005/08/16(火) 23:26:15
>>404,405

比較演算子は0か1しか返さないって言いたいだけだよ。
0かそれ以外の整数を返すって>>368に書いてあるじゃん。
407デフォルトの名無しさん:2005/08/16(火) 23:39:34
>>406
ならば次の順序で書くべきだな。

a = x > 0;

a = ( x > 0 ) ? ( 1 ) : ( 0 );
と同じ。
408デフォルトの名無しさん:2005/08/16(火) 23:43:19
>>404==405==407?
結局何が言いたいの?
409デフォルトの名無しさん:2005/08/16(火) 23:43:40
初歩的な質問で申し訳ないのですが

変数の初期化について質問です

unsigned int x=0;

x++;

こんなプログラムを書いたとすると

延々 xが0になっちゃいますよね

一回だけ初期化して 二回目は無視みたいなことは簡単にできないのでしょうか?
410デフォルトの名無しさん:2005/08/16(火) 23:46:39
>>409
unsigned int x=0;
x++;
こんなプログラムを書くとx==1になるが?
411デフォルトの名無しさん:2005/08/16(火) 23:46:45
static unsigned int x=0;
しかしわかりにくい日本語と情報量だな、>>409糞ガキ
412デフォルトの名無しさん:2005/08/16(火) 23:57:57
比較演算子の演算結果って真偽じゃないの?
0と-1の可能性もあると思ったけど
413デフォルトの名無しさん:2005/08/16(火) 23:59:48
>>409
つ[static]
414デフォルトの名無しさん:2005/08/17(水) 00:00:48
>>402,360
>フォローしていただいてありがたい所ですが、自分でもよく分かりません。
まともに質問できないどころか、設計、仕様さえ理解してなかったわけね。
いいかげん腹たってくるな。ここでそんな告白しないで、挨拶して誘導して、
あっちでちゃんととりさげるのが筋じゃあるまいか? (あやまれとまで言わんが)
ttp://pc8.2ch.net/test/read.cgi/tech/1121644782/433
>教えを請うには色々と情報が足りなかったようです。
まあ、仕事がらみなら会社ん中でちゃんと解決しろよ。
もともとほんとにこの程度の話なら、基礎応用に過ぎないので、
解説やらヒントも何も、アドバイスしようが無いほどなので。
415デフォルトの名無しさん:2005/08/17(水) 00:06:54
>>412
ISO/IEC 9899:1999の6.5.8 -6と6.5.9 -3によれば、Relational operatorsも
Equality operatorsも共に結果は0と1で、その型はintだそうな。
416デフォルトの名無しさん:2005/08/17(水) 00:35:53
C言語の本 買ったは良いけれど
他に アルゴリズムの本買えば
C言語のプログラムは作れる様になるの?
417デフォルトの名無しさん:2005/08/17(水) 00:37:34
>>411 413

それでやったけど 延々1のままです
418デフォルトの名無しさん:2005/08/17(水) 00:42:05
日本語が使えないなら該当コード晒せよ
419デフォルトの名無しさん:2005/08/17(水) 00:45:38
もうグローバル変数でも使ってください。
420デフォルトの名無しさん:2005/08/17(水) 00:47:43
int main(int aaa char* aaa[])
{
static unsigned int c=0;
c++;
Printf("%d",c);
}

省略するとこんな感じですかね
421デフォルトの名無しさん:2005/08/17(水) 00:52:13
>>420
まさか起動する度に数字を変化させたいのか?
だったらファイルに書き出すしかない。
422デフォルトの名無しさん:2005/08/17(水) 00:53:04
市ね>>420
市ね>>420
市ね>>420
市ね>>420
氏ね!>420
423デフォルトの名無しさん:2005/08/17(水) 00:53:26
爆笑スマソ
424デフォルトの名無しさん:2005/08/17(水) 00:56:15
>>420
何がしたいのかハッキリ書かんと
どうしようもないよ
425デフォルトの名無しさん:2005/08/17(水) 00:58:03
おそらく>>421の書いたとおりのことじゃないのか
426デフォルトの名無しさん:2005/08/17(水) 00:58:05
>>424

あ いけました
427デフォルトの名無しさん:2005/08/17(水) 01:02:04
そうか、いけたんか。
なんか、もやもやする。
428デフォルトの名無しさん:2005/08/17(水) 01:13:28
>>427

と思ったらいけてないかもorz

pspの自作プログラムのソースをいじってるところなんです
429デフォルトの名無しさん:2005/08/17(水) 01:37:21
int main(int aaa char* aaa[])
{
static unsigned int c=0;
c++;
Printf("%d",c);
main(aaa,aaa)
}
430デフォルトの名無しさん:2005/08/17(水) 01:45:21
>>429
えぇっと、何がしたいんですかぇ?

先ず、何でもいいからC言語の本買ってきて
読みましょう。
431デフォルトの名無しさん:2005/08/17(水) 01:48:18
あっ、ついでに言うと
メチャクチャです。
432420:2005/08/17(水) 02:00:05
ありゃ ここ IDでないのか

>>430


429は僕じゃないです
433デフォルトの名無しさん:2005/08/17(水) 02:01:11
じゃあ再帰でどうよ?みたいなネタでしょ。
>>409が再帰を理解しているとは思えんし。
434デフォルトの名無しさん:2005/08/17(水) 02:03:33
>>432
そっそうですか。
でも、先ず本読んでください。
435デフォルトの名無しさん:2005/08/17(水) 03:24:42
(笑) >>1嫁。>>420含めておまえらみんな出て逝け(怒)
436ぼるじょあ ◆yBEncckFOU :2005/08/17(水) 09:20:26
(・3・)
437ぼるじょあ ◆yBEncckFOU :2005/08/17(水) 10:35:54
>>436
(・3・)エェー ちみも出て行けYO!
438377:2005/08/17(水) 14:02:29
>>378-379さん
遅レスになりましたがわかりました、どうもありがとうございます!!
439デフォルトの名無しさん:2005/08/17(水) 18:00:21
初歩的な質問ですが、

固定文字列をソースの中に持たせる時、
1) #define FIXED_STRING "hogehoge"
2) static const char* FIXED_STRING[] = "hogehoge";
と2種類の方法がありますが、両者に違いはあるのでしょうか?
違うのだとしたら、どういう場合で使い分ければよいのでしょうか?

「こういうときはこうする」、「俺はこうしてる」等
意見があったら教えてください。
440デフォルトの名無しさん:2005/08/17(水) 18:07:53
>>439
前者は後者より古い流儀。
後者は前者よりプログラムサイズが小さくなるけど、
それ以外の違いは開発時に感じた事はないな。
441デフォルトの名無しさん:2005/08/17(水) 18:09:48
>>439
static const char* FIXED_STRING[] = "hogehoge";

これは構文ネラーになるはず
442デフォルトの名無しさん:2005/08/17(水) 18:22:15
>>439
static const char FIXED_STRING[] = "hogehoge";

static const char* FIXED_STRING = "hogehoge";
ですね。一般的にマクロはデバッグしにくくなりますね。今回の場合は
関係ないかもしれませんが。
443デフォルトの名無しさん:2005/08/17(水) 18:31:16
>442の前者は配列なので長さをsizeof(FIXED_STRING)-1で得られる代わりに、
複数の関数内で利用すると実体が複数作られる。
後者は長さが得られないが実体は複数作られない(かもしれない)。
Cの場合、マクロで充分な気もするのだが。
444デフォルトの名無しさん:2005/08/17(水) 19:54:15
const 変数て、Cだと定数扱いにならないんじゃなかたっけ?
配列サイズの指定で使えない。
445デフォルトの名無しさん:2005/08/17(水) 21:20:29
char[]だとコンパイル時に連結できない
マクロならできる
446デフォルトの名無しさん:2005/08/17(水) 21:26:39
>>445
イヤな使い方だw
447デフォルトの名無しさん:2005/08/17(水) 21:46:32 BE:149769465-
>>440
staticにしてるってことは、インクルードファイルにでも書いておいて、
それぞれのファイルで、インクルードするような使い方を想定してるっぽいから、
ファイルサイズは小さくはならないと思う。
448デフォルトの名無しさん:2005/08/17(水) 22:30:54
グローバル変数にすればいい
449デフォルトの名無しさん:2005/08/17(水) 22:37:13
(^^)
450デフォルトの名無しさん:2005/08/18(木) 00:16:18
>>445>>446
#define INI_FILE_DIR "../config"
#define INI_FILE_NAME "foo.ini"

fopen(INI_FILE_DIR "/" INI_FILE_NAME, "r");
とか?
別にいいじゃん。
451デフォルトの名無しさん:2005/08/18(木) 00:36:05
>>450
お前は俺か!>>445じゃないけど
452デフォルトの名無しさん:2005/08/18(木) 00:54:11
マクロなら#ifdefできる。
453デフォルトの名無しさん:2005/08/18(木) 00:55:53
>>452
使えても便利と思ったことはない
454デフォルトの名無しさん:2005/08/18(木) 01:10:45
正直、マクロは結構見辛い。
ただ、セミコロンを打たなくていいのは結構うれしい。
455デフォルトの名無しさん:2005/08/18(木) 01:25:33
セミコロンうたないとオートインデントがおかしくなるんですよ。
456デフォルトの名無しさん:2005/08/18(木) 03:10:20
10人の身長デ−タ(data)を背の高い順に並べ換えた後打ち出すプログラムです。正しく動くように虫を取って下さい。
#include<stdio.h>
#define num=10;
int i;
double data[num]={ 173.8,168.2,180.3,166.0,189.7,167.4,159.8,170.5,167.5,167.4};
int main(void)
{
 for(i=1;i<=num;i++){
  int j,max=i;
  for(j=i+1;j<=num;j++) /*最大の要素の場所を捜す*/
   if (data[max]<data[j]) max=j;
  data[i]=data[max];
  data[max]=data[i]; /*入れ換え*/
 }
 for(i=1;i<=num;i++) printf("%7.1f ",data[i]);
 return 0;
}
457デフォルトの名無しさん:2005/08/18(木) 03:22:04
int main(void)
{
 int i,j,l;
 for(i=0;i<num;i++){
  for(j=i+1;j<num;j++){
   if(data[i]<data[j]){
    l=data[i];data[i]=data[j];data[j]=l;
   }
  }
 }
 for(i=0;i<num;i++) printf("%7.1f ",data[i]);
 return 0;
}
458デフォルトの名無しさん:2005/08/18(木) 03:51:36
>>456
スレ違い。
宿題なら宿題スレへ、そうでないなら初心者スレ辺りへ。
459デフォルトの名無しさん:2005/08/19(金) 01:51:21
defineとconst話じゃねのか? >458
460458:2005/08/19(金) 08:41:12
>>459
defineの文法までここで教える必要はないと思うが。
461デフォルトの名無しさん:2005/08/19(金) 09:54:30
二つの構造体の宣言が別々のインクルードファイルに書かれてて、
それぞれの構造体がもう一方の構造体を要素として持ちたい時、
どうやればいいんでしょう?下のだとニワトリと卵になってしまうし・・。

----- aaa.h -----
#include "bbb.h"
typedef struct {
BBB *b;
}AAA;

---- bbb.h ----
#include "aaa.h"
typedef struct {
AAA *a;
}BBB;
462デフォルトの名無しさん:2005/08/19(金) 10:00:40
typedef struct A A;
typedef struct B B;

struct A { B* b; };
struct B { A* a; };
463デフォルトの名無しさん:2005/08/19(金) 10:06:07
>>462
別々のファイルで宣言すること自体がおかしいってこと?
464デフォルトの名無しさん:2005/08/19(金) 10:53:56
>>461
-----t0.h
#ifndef t0_h
#define t0_h
#include "t1.h"
struct a {
struct b *b;
};
typedef struct a a;
#endif
-----t1.h
#ifndef t1_h
#define t1_h
#include "t0.h"
struct b {
struct a *a;
};
typedef struct b b;
#endif
465デフォルトの名無しさん:2005/08/19(金) 12:28:37
scanf関数を使用し、コマンドラインからの数字を10回入力し、
入力の中でもっとも大きな数字を表示しなさい。
※入力桁数のエラーについて対処する事

という課題が出されたのですが、入力桁数のエラーがよく分かりません。
誰か教えていただけないでしょうか?
466デフォルトの名無しさん:2005/08/19(金) 12:46:52
>>465
どういうエラーなのかが分からないとなんとも。
467デフォルトの名無しさん:2005/08/19(金) 12:53:11
>>464
ありがとん。できました。
468465:2005/08/19(金) 12:55:12
>>466
先ほどのが課題文の全文なので私にもよく分かっていないのですが、
おそらくは型が扱う数字を超えて入力した場合、
たとえば、int型なら32,767より大きい数字を入力した場合に認識されないことについて対処する
ということだと思います。
469デフォルトの名無しさん:2005/08/19(金) 13:26:10
>>468
そう考えた、ということでコード組めばいいんじゃない?

あと、intの場合は環境によってサイズが違うので注意。
 ・sizeofでバイト数をチェックして上限を計算
 ・今の環境に合わせて、とりあえず決め打ち
など、方法はいろいろあるので試してみ。

(独り言)
学校の課題ってのは結果をただ提出するだけじゃないんだよ。
不明点、疑問点があったら提出前に質問しに行ってもいいんだし。
全く分からない、何がわからないのかわからない」ってのは論外だけど。

470465:2005/08/19(金) 13:37:53
>>469
助かりました。ありがとうございます
471デフォルトの名無しさん:2005/08/19(金) 13:40:16
つーか、宿題スレがあるんだからそっちでやれよ。
472デフォルトの名無しさん:2005/08/19(金) 13:57:42
>>472
まあ、宿題○投げじゃないから
いいんでないの?
473465:2005/08/19(金) 14:00:55
えっと、これ学校の宿題とは違うのですよ。
ですから、宿題スレで質問するのも気が引けてしまいまして(苦笑)
474デフォルトの名無しさん:2005/08/19(金) 14:15:39
int a,b;
double c;
a = 10;
b = 1000;
c = a / b ;
printf("c = %f",c);

結果 c = 0.000000となってしまうのはなぜでしょうか?

475デフォルトの名無しさん:2005/08/19(金) 14:18:49
c = (double)a / (double)b ;
476デフォルトの名無しさん:2005/08/19(金) 14:30:09
>>475
ありがとうございました。

もうひとつすみません。
int a,b,d;
double c;
a = 5
b = 5;
d = 1000;
c = (a + b) /d ;
printf("c = %f",c);
この結果がc = 0.000000となりますが
int a,b,d;
double c;
a = 5
b = 5;
d = 1000;
c = a + b ;
c = c / d;
printf("c = %f",c);
この結果がc = 0.01となるのはどうしてでしょうか?
すみませんが教えてください。
477デフォルトの名無しさん:2005/08/19(金) 14:30:53 BE:199692858-
>>469
> ・sizeofでバイト数をチェックして上限を計算

これってintの最大値のことを言ってるの?
だったらINT_MAXを使うのが定跡だと思うけど。
478デフォルトの名無しさん:2005/08/19(金) 14:31:05
質問です。

Cでファイルからデータを読み出すとき、「1行(次の\nまで)を読み込む」ってどうしてます?
fgetc で1文字ずつ読み込んで \n かどうか判定して・・・ってやるしかないでしょうか。
まさか fscanf とか使うのもあれだし。
スクリプトファイルを読み込むときなどに使います。
479デフォルトの名無しさん:2005/08/19(金) 14:33:58
>>478
fgets関数っていうのがありますよ。
480デフォルトの名無しさん:2005/08/19(金) 14:35:18
>>478
fgets()
481デフォルトの名無しさん:2005/08/19(金) 14:36:18
>>479
fgets 調べてみました
・・・今までの苦労は・・・orz ありがとございました。
482デフォルトの名無しさん:2005/08/19(金) 14:36:51 BE:314515297-
>>478
一行はかならず*Kバイト以下とか、そういう仕様で割り切れば、fgets()で簡単に書けると思う。
483デフォルトの名無しさん:2005/08/19(金) 14:37:28
>>476
>c = (a+b)/d;
(a+b)もdもint型だから、int型の(a+b)/dがdouble型に型変換されてcに代入される。

>c = c / d;
cがdouble型だからdがdouble型に暗黙的に型変換されてdouble型のc/dが計算される。
その結果がcに代入される。

もう少し型について勉強しとけ。
484デフォルトの名無しさん:2005/08/19(金) 14:38:18
>>483
ありがとうございました。
485デフォルトの名無しさん:2005/08/19(金) 14:38:26
>476
前者の場合、
c = (a + b) /d の右辺はすべて整数値

後者の場合、
c = a + b ;
の時点だと右辺は整数値だが
c = c / d;
ではcがdoubleのため実数値となる

前者の場合でも、aかbをdoubleでキャストすれば
後者と同じ結果になる
486デフォルトの名無しさん:2005/08/19(金) 14:40:44
>>485
本当にすいません。ありがとうございました。
487デフォルトの名無しさん:2005/08/19(金) 20:08:24
FILE型の変数(ポインタ)からint型の整数(ファイルデスクリプタ?)
を得るのってどうすればいいのですか?
488デフォルトの名無しさん:2005/08/19(金) 20:13:49
>>487
VC なら _fileno 関数が。非標準ね。
stdio.h を読んで構造体メンバから引張ってくるとか。
互換性に問題あるけど。
489デフォルトの名無しさん:2005/08/19(金) 20:39:40
>>487
Unix 系なら int fileno(FILE *stream) てなものが...
490デフォルトの名無しさん:2005/08/19(金) 22:14:49
strcpy、sprintfとか使って、char型にしてから、
atoiとかstrgetvalue()とか使えないもんかな
491デフォルトの名無しさん:2005/08/19(金) 23:04:42
>>490
一体全体何を言っているのやら。
492デフォルトの名無しさん:2005/08/19(金) 23:24:55
UNIX系C言語のコンパイルで汎用で使えるMAKEFILEを作りたいんだけど、
何か良い参考書とか
サンプル(オプションなどのコメントアウト付)とかないですかね?
493デフォルトの名無しさん:2005/08/19(金) 23:28:27
494デフォルトの名無しさん:2005/08/19(金) 23:28:58
>>492
スレ違い。
Unixプログラミングスレ、makeスレ、書籍スレなどへどうぞ。
495464:2005/08/20(土) 01:40:36
>>461==467
あんたに宿題
>>464 のコードから #include 行を削除しても問題がない事を確認し,
なぜ #include 行がなくても問題ないのか述べよ.
496デフォルトの名無しさん:2005/08/20(土) 03:05:41
----- aaa.h -----
typedef struct AAA_{
struct BBB_ *b;
}AAA;

---- bbb.h ----
typedef struct BBB_{
struct AAA_ *a;
}BBB


ってかんじ?
ちなみにstructはtypedefしない方がぱっと見分かりやすいぞ
497デフォルトの名無しさん:2005/08/20(土) 10:58:01
>491
(w)sprintfてのは、int→char変換の為に、て意味でも存在してるぞ
char a;
int b;
(w)sprintf(&a,"%d",b);
498デフォルトの名無しさん:2005/08/20(土) 11:01:14
>>497
'\0'の分を用意していないからだめだろ。snprintf/swprintf
499デフォルトの名無しさん:2005/08/20(土) 15:41:34
/* 約数があるかどうか調べる */
is_prime = 1
for(i=2; i<=num/2; i=i+1)
if((num%i)==0) is_prime = 0;

これはどうゆう計算が行われてますか?
教えて下さい。。。
500デフォルトの名無しさん:2005/08/20(土) 15:56:24
>>499
約数があるかどうか調べてる
501デフォルトの名無しさん:2005/08/20(土) 16:18:12
>>499
誰が書いたんだ?
i=i+1じゃなくてi++でいいのに
502デフォルトの名無しさん:2005/08/20(土) 16:32:49
>>499
is_primeがフラグになってる。('0'なら非素数、'1'なら素数)

2<=i<=num/2の範囲でiをインクリメントして、逐次numをiで割り切れるか調べる。
ちなみに、
 ・iの初期値が2なのは、1で割るのを避けるため。
 ・ループ継続条件がi<=num/2なのは、余計なループをさせないため
まあ一回でも割り切れたらis_primeに'1'が入るから、
約数を調べたいだけなら
 if((num%i)==0) {
   is_prime = 0;
   break;
 }
の方がいいと思う
503デフォルトの名無しさん:2005/08/20(土) 17:28:33
今どきのコンパイラは for の条件に i<=num/2 とか書いても速いのかな・・・。
昔々 for (i = 0; i < strlen(s); i++) というのを書いたやつが居て衝撃を受けたことのある俺だが。
504デフォルトの名無しさん:2005/08/20(土) 17:35:42
>>503
独り言なら公園の便所の中でやってくれ
505デフォルトの名無しさん:2005/08/20(土) 18:25:23
公園の便所には阿部さんがいて危険だから自宅のトイレでいいじゃん
506デフォルトの名無しさん:2005/08/20(土) 18:33:12 BE:74884853-
>>503
VS2003のVC++で確認したら、ループの外で num / 2の処理をしてるみたい。
507499:2005/08/20(土) 18:54:22
>>502
ありがとう!なかなか理解できなくて困ってた。
508デフォルトの名無しさん:2005/08/21(日) 00:23:54
すみません。教えてください。
本当に基本的なことなのですが。

staticで関数外に構造体などの領域を宣言しても
いきなりその構造体が使える(=メモリが割り当てられる)
わけではないのでしょうか?

そこにアクセスしようとすると、
アクセスバイオレーションが発生します。。。。
509デフォルトの名無しさん:2005/08/21(日) 00:30:37
>>508
いいえ、使えます
510デフォルトの名無しさん:2005/08/21(日) 00:42:51
>>508
正しいコードなら>>509のとおりなのであなたのコードに問題があるとしか考えられません。
というわけでソースコードを晒してみて下さい。
511508:2005/08/21(日) 00:44:02
すみません。言葉不足でした。

例えば、staticで構造体を宣言します。

typedef struct aa
{
int i;
char *p;
}AA;

static宣言された領域は0初期化されてしまいますので、
pももちろん0になっています。

pはアドレスしか保存されませんよね。
ということは、
どこかにpの実体用メモリ領域が必要になってくるってことなんでしょうか?
512508:2005/08/21(日) 00:53:23
すみません。ソース晒した方がよさそうですね。
typedef struct a{
unsigned long aa;
int bb;
}addr;

typedef struct info{
int id;
a *addr;
char *host;
}table_info;

#define MAX_SIZE 2
static table_info table[MAX_SIZE];

int main(int argc, char* argv[])
{int i;
for(i=0;i<MAX_SIZE;i++)
{
table[i].id=-1;
table[i].addr->aa=0;←ここでエラー
table[i].host=NULL;
}
return 0;
}
staticで0クリアされてるので、0番地にアクセスしようとして
エラーになってるのはわかったのですが
これを回避する方法がわかりません。。。。
よろしくおねがいいたします!
513デフォルトの名無しさん:2005/08/21(日) 00:55:52
回避する方法というか、addrは何のための変数?
514508:2005/08/21(日) 00:59:52
あ。変な宣言になってますね。
上の構造体のtypedefしたaddrは必要ありません。

2番目の構造体で、構造体のアドレスを使いたいのです。
515デフォルトの名無しさん:2005/08/21(日) 00:59:57
typedef struct info{
int id;
a addr;
char *host;
}table_info;
516デフォルトの名無しさん:2005/08/21(日) 01:01:43
>>514
その構造体は何の構造体? struct infoとライフサイクルに違いはある?
何対何の関係?
517508:2005/08/21(日) 01:11:19
>>516

上の構造体は、本来なら既に別ファイルで定義されているものなのです。
それを呼び出す形で、2番目の構造体で使いたいとおもっています。
518デフォルトの名無しさん:2005/08/21(日) 01:12:04
そんなことは聞いてない。
519デフォルトの名無しさん:2005/08/21(日) 01:13:35
>>515
でいいじゃん。何が不満よ。
520デフォルトの名無しさん:2005/08/21(日) 01:14:47
ポインタを理解していない模様
521デフォルトの名無しさん:2005/08/21(日) 01:20:11
構造体以前の問題だな
522508:2005/08/21(日) 01:20:34
>>515の宣言で、呼び出しができるのですか?

そうですね。ポインタを理解してないのが敗因のようです。
勉強してきます。
大変ありがとうございました!
523515:2005/08/21(日) 01:21:19
typedef struct info{
int id;
addr a;
char *host;
}table_info;

こうだな。
524デフォルトの名無しさん:2005/08/21(日) 01:25:49
終わったところで恐縮だけど、「呼び出す形」とか「呼び出しができる」とか
どういう意味なんだろ???
525デフォルトの名無しさん:2005/08/21(日) 01:29:42
ほかで定義しているものを使うってだけだろな。
ただこいつの理解レベルじゃ、定義と宣言のつかいわけも怪しいから、よくわからん。
526デフォルトの名無しさん:2005/08/21(日) 01:57:51
下記のようにバイナリモードで開いたファイルのサイズ(Byte)を得ようとしたのですが、うまくいきません。
fp++がマズいのでしょうか?

for(i=0;feof(fp)==0;i++){
  fp++;
}
527デフォルトの名無しさん:2005/08/21(日) 01:58:34
>>526
そうです。FILE*をインクリメントしてどうする。
528デフォルトの名無しさん:2005/08/21(日) 02:00:02
>>527
あ、考えてみるとポインタだったんですね。
つまり*fp++とすればいいのですか?
529デフォルトの名無しさん:2005/08/21(日) 02:01:43
>>528
そうです。
530デフォルトの名無しさん:2005/08/21(日) 02:02:26
fp はファイル内の位置そのものではない。
ファイル内の位置は、FILE構造体のメンバに隠されている。

移動させたかったら、FILE*を引数に取る、目的に見合ったを関数を使え
531デフォルトの名無しさん:2005/08/21(日) 02:05:17
>>530
さらに構造体だったんですね。。。勉強になりました。
こんな感じですか?
fseek(fp,1,SEEK_CUR)
532531:2005/08/21(日) 02:13:37
第二引数がlong型ということで1Lに修正してみましたが、正常に動作しませんでしたorz
533デフォルトの名無しさん:2005/08/21(日) 02:14:03
おしいな・・・
534デフォルトの名無しさん:2005/08/21(日) 02:14:29
>>532
それ以前にファイルサイズの取得は標準の範囲内では出来ない。
環境依存の方法を使うしかない。
535デフォルトの名無しさん:2005/08/21(日) 02:15:11
ケツに移動させてみい
536531:2005/08/21(日) 02:20:54
>>535さんの言うようにしても正常に動作しなかったので、
ループ内にprintf("%d ",i);と入れて確認しましたが、無限ループになってるようです。

環境依存だったんですね。。スレ違いすいませんでした。。。
代替策とかないですかね?
537デフォルトの名無しさん:2005/08/21(日) 02:24:39
こんな感じでどうよ。

#include <stdio.h>
int filelen(const char *filename, const char *mode)
{
  int len = 0;
  FILE *fp = fopen(filename, mode);
  if( fp == NULL ) return -1;
  while(fgetc(fp) != EOF ) ++len;
  return len;
}

ちなみに>>531が思い通りにうごかないのは環境依存云々ではなく、fseekの意味を取り違えている。
538デフォルトの名無しさん:2005/08/21(日) 02:30:32
>>537
ありがとうございます。
ですが上手く動作せず、デタラメな数字がでてしまいます。
バイナリモードだからでしょうか?
それとも私の組み込み方が悪いのかもしれませんが。。。

>fseekの意味を取り違えている。
教えていただけませんか?
539デフォルトの名無しさん:2005/08/21(日) 02:34:19
ほんとにケツに移動したのか?
feek(fp, 0L, SEEK_END);
size=ftell(fp);
いや、おれはいつもstatで取得するけど
540531:2005/08/21(日) 02:48:52
>>539
おお、こんな方法があるんですね。
ありがとうございます。
541デフォルトの名無しさん:2005/08/21(日) 07:31:13
今まで一つのファイルでプログラミングを行って来たのですが
複数のファイルにコードを書く場合はどのようなことをするのですか?

また、リンクとはどういったいみなのでしょうか?
542デフォルトの名無しさん:2005/08/21(日) 07:32:56
>>541
まず本嫁
543デフォルトの名無しさん:2005/08/21(日) 07:38:11
普通の入門書には書いてないだろ
544デフォルトの名無しさん:2005/08/21(日) 07:40:41
ぜんぜん読んでないけどタイトル的にここ(藁)
ってかくぐれよそんぐらいorz
ttp://okuyama.mt.tama.hosei.ac.jp/unix/C/slide79-1.html
545デフォルトの名無しさん:2005/08/21(日) 07:43:38
main.cに
#include "sub1.c"
#include "sub2.c"
とか書けばOK
546デフォルトの名無しさん:2005/08/21(日) 08:30:17
>>543
俺は普通の入門書読んだが、一通りは書いてあったぞ
まぁ今読んでるK&Rに書いてあるのには及ばないが
547デフォルトの名無しさん:2005/08/21(日) 13:05:33
>>545
モジュール化した方がいいと思うが・・・
548デフォルトの名無しさん:2005/08/21(日) 13:08:35
>>545
pthread-winのソースみたいになっとるな
549デフォルトの名無しさん:2005/08/21(日) 13:10:17
>>545
.c を include するのはあまりおすすめな方法じゃないな。
それでも可能だけど一つのファイルを修正しただけでも
全てのコンパイルをしなければならなくなって効率が悪い。

普通は型やプロトタイプ宣言や#defineをヘッダファイルに
まとめておいてそれを使うソースでincludeする。
550データボックス:2005/08/21(日) 15:36:21
複数のソースファイルをコンパイル・リンクするだけなんじゃないか。
551デフォルトの名無しさん:2005/08/21(日) 16:35:21
>>550
多分ヘッダファイルを書けないんだろう。
552デフォルトの名無しさん:2005/08/21(日) 16:42:08
リンクってどうするの?
553デフォルトの名無しさん:2005/08/21(日) 16:44:44
負けファイル作んないと。
554データボックス:2005/08/21(日) 17:25:00
D:\databox>bcc32 main_kansu_file.c sonota_cfile.c kison_objfile.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
main_kansu_file.c:
sonota_cfile.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
555デフォルトの名無しさん :2005/08/21(日) 17:37:13
1 + x/1! + x^2/2! + x^3/3! +・・・・+x^r/r!
をとくプログラム
xとrをきくかたち
教えてください(>Д<)
556デフォルトの名無しさん:2005/08/21(日) 17:41:21
嫌。
557デフォルトの名無しさん:2005/08/21(日) 17:48:46
>>555
それはまず式を簡単にしてからやれよ
そのまま計算するバカはいないよ
プログラミングより先に数学を勉強しなさい
558デフォルトの名無しさん:2005/08/21(日) 18:05:20
x^r/r! = x^(r-1)/(r-1)! * ???????
559デフォルトの名無しさん:2005/08/21(日) 19:34:27
ソースをダウンロードしたら
.o, .lo, .la, .am, .in
というファイルがあるのですがこれはなんでしょうか?
560デフォルトの名無しさん:2005/08/21(日) 19:38:17
質問者は >>1 を理解して、(おそらくほとんどの場合)初心者系や宿題系へどうぞ。
ここではプログラムの組み方を質問するのには不適当です。
やたらレスしたがって >>1を理解したくない、駄弁るだけ、などのかたがたは、
http://pc8.2ch.net/test/read.cgi/tech/1124511889/
へ移動されるのが適当だと思われます。
561デフォルトの名無しさん:2005/08/21(日) 19:50:11
ではまず駄弁るだけの>>560さんが移動してください
562デフォルトの名無しさん:2005/08/21(日) 19:53:14
563デフォルトの名無しさん:2005/08/21(日) 20:00:55
階乗と累乗教えてください
564デフォルトの名無しさん:2005/08/21(日) 20:04:26
>>563
階乗は自分で書け
累乗はpow
565デフォルトの名無しさん:2005/08/21(日) 20:09:14
新しめのC規格で、オーバーロードってできるのですか?
566デフォルトの名無しさん:2005/08/21(日) 20:23:17
>>555
脳内コンパイル注意
#include <stdio.h>
#include <math.h>
int fact(int n)
{
 int ret=1,i;
 for(i=2;i<=n;i++)ret*=i;
 return ret;
}
double func(double x,int r)
{
 double ret=1.f,t;
 int i;
 for(i=1;i<=r;i++)
 {
  t=pow(x,i);
  t/=(double)fact(i);
  ret+=t;
 }
 return ret;
}
int main()
{
 double x;
 int r;
 printf("x,r= ");
 scanf("%lf,%d",&x,&r);
 printf("Ans= %lf",func(x,r));
 return 0;
}
567デフォルトの名無しさん:2005/08/21(日) 20:27:32
char *hoge = NULL;
int *hogo = 0;
となっているのですが、
NULLと0は何が違うのですか?
568デフォルトの名無しさん:2005/08/21(日) 20:33:18
FAQ参照。
569デフォルトの名無しさん:2005/08/21(日) 20:40:17
はぁ?
書き込むんなら答えをかけよ糞が
570デフォルトの名無しさん:2005/08/21(日) 20:41:25
#define NULL 0
571デフォルトの名無しさん:2005/08/21(日) 20:42:56
mallocでメモリを確保してそれを全て0にしたいのですが
forで回す以外の方法は無いのでしょうか?
572デフォルトの名無しさん:2005/08/21(日) 20:46:25
calloc
memset
573デフォルトの名無しさん:2005/08/21(日) 20:47:01
forで回すのなんて本当にやってるやついるの?
574デフォルトの名無しさん:2005/08/21(日) 20:51:42
なんで、mallocはゴミつめたままで、callocはZeroFillなんだろうな?
575デフォルトの名無しさん:2005/08/21(日) 20:51:50
566さん
ありがとう!!!! 
576デフォルトの名無しさん:2005/08/21(日) 20:54:45
>>>574
絶対にする必要は無いからだろ
577デフォルトの名無しさん:2005/08/21(日) 20:56:02
>>574
常にZeroFillする必要は無いけど、
必要な時には効率よくZerofillしたいからじゃない?
578デフォルトの名無しさん:2005/08/21(日) 20:56:36
mallocは絶対にゼロで埋める必要がないといいたいのだろうか。情報少なすぎて意味分からん。
少なくとも>>571には必要なようだが。
579デフォルトの名無しさん:2005/08/21(日) 20:57:09
>>577
だとしたら、何故callocは?
580579:2005/08/21(日) 20:57:49
あ、その使い分けが出来るように、変えてあるということか。
581デフォルトの名無しさん:2005/08/21(日) 20:59:15
>>579
自前でfor回したり、後でmemsetするよりも効率よくZerofillすることが
可能かもしれない。
582579:2005/08/21(日) 21:00:37
でも、calocとmallocは本来目的が違う関数なのに、そういう設計はなんだかな。
だったらmallocにZeroFillフラグつけるとか、mallocZとかいう別関数で用意するほうが分かりやすいのに。
583 ◆fZOaF4CQP6 :2005/08/21(日) 21:10:15
ここは阿呆連中ばっかりか?
そんなもん、なんで"printf"があるのに"puts"があるのですか
っていってるようなもん
584デフォルトの名無しさん:2005/08/21(日) 21:11:40
そりゃそうだな
ごめん
585デフォルトの名無しさん:2005/08/21(日) 21:42:16
1 + 1/r^2 + 1/r^2 +・・・・+1/r^n
rとnを聞いて
と求めるプログラム
586デフォルトの名無しさん:2005/08/21(日) 21:43:33
>>585
C/C++の宿題を片づけます 49代目
http://pc8.2ch.net/test/read.cgi/tech/1123661447/l50
587デフォルトの名無しさん:2005/08/21(日) 21:58:59
>>583
おまえ、その二つは用途が完全に違うだろ。
588デフォルトの名無しさん:2005/08/21(日) 22:01:34
だからなに?
用途が違うのに一緒のように使おうとするっていう例では丁度いいじゃん
589デフォルトの名無しさん:2005/08/21(日) 22:15:01
int this_option_optind = optind ? optind : 1;
と言うのがあるのですが = の後ろからの意味が分かりません
どのような意味なのでしょうか?
590デフォルトの名無しさん:2005/08/21(日) 22:16:54
自分で調べろ
591デフォルトの名無しさん:2005/08/21(日) 22:17:20
ヒント:三項演算子
592デフォルトの名無しさん:2005/08/21(日) 22:18:33
>>590
答えなかったら?
593デフォルトの名無しさん:2005/08/21(日) 22:23:27
煽りすらまともに出来ないのかよ。
それだけじゃ、何言ってるのかわからん。
594デフォルトの名無しさん:2005/08/21(日) 22:37:54
static struct hoge hoge_hoge[] =
{
{"hoge1", 1, 0, 'a'},
{"hoge2", 1, 0, 'a'},
{"hoge3", 1, 0, 'a'}
};

のようなコードがあるのですが、
なぜhogeとhoge_hogeを二つの変数を宣言しているのですか?
595デフォルトの名無しさん:2005/08/21(日) 22:43:32
>>569
お前生意気帰れ二度と来るな
596デフォルトの名無しさん:2005/08/21(日) 22:47:18
>>594
hoge は変数じゃない
597569:2005/08/21(日) 22:48:44
>>595
帰れって言われてもここは自宅ですよ?
あなたが現実とネット上の世界の区別が付かないといわれている人ですか?
598!=595:2005/08/21(日) 22:50:47
>>597は無視でいきましょう。
599デフォルトの名無しさん:2005/08/21(日) 22:52:05
>>594
「struct hoge」型の変数hoge_hogeの宣言。
600デフォルトの名無しさん:2005/08/21(日) 22:52:27
>>598 = >>595だな
601デフォルトの名無しさん:2005/08/21(日) 22:53:21
それが何か?
602デフォルトの名無しさん:2005/08/21(日) 22:54:11
必死だな
603デフォルトの名無しさん:2005/08/21(日) 22:55:33
>>589
条件演算子
そのコードの意味としてはこんな感じ。

int this_option_optind;
if (optind != 0)
    this_option_optind = optind;
else
    this_option_optind = 1;
604デフォルトの名無しさん:2005/08/21(日) 22:56:31
static hogeをループで回したときは、なぜ多重宣言にならないんですか?
605デフォルトの名無しさん:2005/08/21(日) 22:58:47
>>597
見苦しいぞ
606デフォルトの名無しさん:2005/08/21(日) 22:59:20
>>604
たとえ何回ループされようとソースコード上ではたった1箇所でしか定義がなされていないから。
607デフォルトの名無しさん:2005/08/21(日) 22:59:28
見苦しいのは595だと思う
608デフォルトの名無しさん:2005/08/21(日) 23:00:40
>>606
一度目のループで宣言され
二度目のループで2回目は宣言されないのですか?
609デフォルトの名無しさん:2005/08/21(日) 23:02:54
>>604
悪いが言ってる意味が分からん
具体例を挙げてくれ
610デフォルトの名無しさん:2005/08/21(日) 23:06:01
>>608
だから1回目とか2回目と考えるのがナンセンス。
プログラムの実行するとき、ソース上でstatic変数の宣言している箇所を通ったらその変数が用意されるというわけではない。
コンパイル時にコンパイラがstatic変数を見つけたらその時点で領域を確保しておく。
実行時にはただ確保された箇所をstatic変数として使うだけ。実行時には宣言なんてどこにも残っていない。
611デフォルトの名無しさん:2005/08/21(日) 23:06:53
while(1){
static int hoge = 0;
hoge++;
}

これだと何度もhogeが宣言されると思うのですが
612デフォルトの名無しさん:2005/08/21(日) 23:08:48
>>611
なんで?
613デフォルトの名無しさん:2005/08/21(日) 23:08:54
>>611
static の意味調べてね

べーた臭がする・・・
614デフォルトの名無しさん:2005/08/21(日) 23:09:21
>>611
プログラムの実行時に静的変数の宣言は実行されるものではない。
予め場所だけ用意しておき、静的変数を参照するときにはいつでもそこを見に行くだけ。
615デフォルトの名無しさん:2005/08/21(日) 23:10:43
while(1){
static int hoge = 0;
hoge++;
}

static int hoge = 0;
void foo()
{
while(1){
hoge++;
}
}
とほぼ同じ。違いはブロックの外からは直接参照できないこと。
616デフォルトの名無しさん:2005/08/21(日) 23:12:49
>>597
お前友達いるのか?
617597:2005/08/21(日) 23:17:00
>>598
なんであなたは自分の意見を共有したがるのですか?
自分で意見があるのなら他人まで巻き込まないで自分で実行しましょうよ

>>616
いますよ
そんなこと聞いてどうするんですか?
私の経験から行くと、「友達いるのか?」って聞く人のほうが
友達がいないような気がするんですけど
618デフォルトの名無しさん:2005/08/21(日) 23:19:49
いい加減C言語と関係ないこと書き込むのやめれば?
619デフォルトの名無しさん:2005/08/21(日) 23:21:34
>>618
お前らがやめろ
それで終わる
620デフォルトの名無しさん:2005/08/21(日) 23:22:15
構って君を構うやつが一番悪い。
621デフォルトの名無しさん:2005/08/21(日) 23:26:14
>>617
そうか、いるのか。
ふーん。では、ここではそういう現実とネット上の世界の区別を付けてるわけか。
622デフォルトの名無しさん:2005/08/21(日) 23:28:13
>>621は 宣言子でいうと auto あたりかな
623デフォルトの名無しさん:2005/08/21(日) 23:40:46
>>617
>なんであなたは自分の意見を共有したがるのですか?
あなたも >>569 の意見を共有できるものならしてみたらどうですか?
624デフォルトの名無しさん:2005/08/21(日) 23:45:33
>>567
NULL = ヌルポインタ
プロセスが0ということだ
int *a =0

int* a;
a = 0;
でポインタaにプロセス0を渡してる
625デフォルトの名無しさん:2005/08/22(月) 00:00:55
>>619
お前らって・・・
俺書き込んでなかったんだけど。
まあいいけどさ。
626デフォルトの名無しさん:2005/08/22(月) 00:03:36
>>625
お前も同類だバカ
627社長:2005/08/22(月) 00:45:47
"\x35\x39\x37"
解雇
628デフォルトの名無しさん:2005/08/22(月) 00:58:23
>>624
プロセスって…
629デフォルトの名無しさん:2005/08/22(月) 01:15:51
>>567
そもそもchar型ポインタにNULLのファイルポインタを代入している時点で
ファイルはクラッシュします.
NULLは0ではありません.
630デフォルトの名無しさん:2005/08/22(月) 01:24:35
>>567
ここを最初から最後まで読め。
ttp://www.kouno.jp/home/c_faq/c5.html
631人事部:2005/08/22(月) 02:22:37
社員番号 0x255の方、あなたに解雇処分が決定しました。
632デフォルトの名無しさん:2005/08/22(月) 02:26:36
>>629
あれ? そうだったっけ? それは保障されてなかったっけ?
633デフォルトの名無しさん:2005/08/22(月) 02:32:06
>>629
ポインタへの 0 の代入は NULL の代入になる。
http://www.kouno.jp/home/c_faq/c5.html#2
634629:2005/08/22(月) 02:52:43
ごめんなさい,根本的なところを間違えていました.
fopen()で(FILE *)を返すのでFILEという構造体を返すものだと勘違いをしていました......
635デフォルトの名無しさん:2005/08/22(月) 05:11:11
スレ違いとアホ大杉…… orz
629 はてっきり冗談(悪意の)だと思ってたが…
ttp://pc8.2ch.net/test/read.cgi/tech/1124511889/
636デフォルトの名無しさん:2005/08/22(月) 07:28:15
>>566
>>558 を読んでやりなおし。
637デフォルトの名無しさん:2005/08/22(月) 08:45:21
友達はいても会社クビになる見苦しい人、何で恥の上塗りしてるんですか?
638デフォルトの名無しさん:2005/08/22(月) 13:46:07
>>631
>あなたに解雇処分が決定しました
日本語で話してください。
639デフォルトの名無しさん:2005/08/22(月) 14:28:55
>>638
あなたを、解雇です。
640デフォルトの名無しさん:2005/08/22(月) 14:40:09
お部屋をお連れします
641デフォルトの名無しさん:2005/08/22(月) 14:40:34
>>639
あなたに、解雇です。
642デフォルトの名無しさん:2005/08/22(月) 15:54:32
あなたは、可愛い子です
643デフォルトの名無しさん:2005/08/22(月) 17:26:50
いきなり大きなコピペでごめんなさい.
次の共用体を使ってshort型で入れた整数を
long型に変換するように作ったのですがどうしてもコメント行のような結果になりません.
どこかまずかったのかどなたかご指摘をお願いします....

/* int型をlong型に変換するプログラム */
#include <stdio.h>

union int_long {
 short i;
 long j;
} itl;

int main(void)
{
 itl.j = 0L;
 itl.i = 1024;

 printf("%ld", itl.j);
 // 00000100 00000000 00000000 00000000 = 67108864
 return 0;
}
644デフォルトの名無しさん:2005/08/22(月) 17:35:32
>>643
なにがまずいわけ?
645デフォルトの名無しさん:2005/08/22(月) 17:36:26
>>643
Windowsの話なら
union int_long {
 short i[2];
 long j;
} itl;
にして、
 itl.i[1] = 1024;
とすることでコメント行の結果になる。
キーワードはhighとlow
646デフォルトの名無しさん:2005/08/22(月) 18:08:30
>>643
内部で Big endian (上位桁が下位アドレスに入る形式) で数値を扱っている
マシンならお望み通りになる。Little endian (下位桁が下位アドレスに入る
形式) のマシンの場合は正の整数の値の場合 short を long に入れても値に
変化はない。図にするとこうだ。

上位addr         下位addr
00000000 00000000 00000100 00000000
|-------------- long -------------|
         |------short-----|

ずれているかも知れないが脳内で修正しろ。
647デフォルトの名無しさん:2005/08/22(月) 18:10:21
そんなエサに俺様が
648デフォルトの名無しさん:2005/08/22(月) 18:10:54
ずれまくりw
649デフォルトの名無しさん:2005/08/22(月) 19:04:02
紛らわしい書き方だなぁ。
実際にメモリに置いた状態との対比とかしないと。
650643:2005/08/22(月) 19:18:10
お返事ありがとうございます.
>>645,>>646
さんの通りにやったら思ったとおりの値が出ました.
あと,混乱するようなソースを作ってしまったのでこれも出来ればお願いします.
pak    |-[7]   [6]   .......    [2]  [1]  [0]----|
double  |---------------d---------------------|のように捉えたのですが考え方は間違ってますか?
union {
 double d;
 char pak[sizeof(double)];
} _ddat;

 int i;
 FILE *fp;
 _ddat.d = 1283648236.434532;

 if((fp = fopen("double", "wb+")) == NULL) {
  printf("ファイル展開に失敗.");
  exit(1);
 }

 for(i=sizeof(double); i; i--)
  fwrite(&_ddat.pak[i-1], sizeof(char), 1, fp);
 fclose(fp);
 _ddat.d = 0.0;

 if((fp = fopen("double", "rb")) == NULL) {
  printf("ファイル展開に失敗.");
  exit(1);
 }
 fread(&_ddat.d, sizeof(double), 1, fp);
 fclose(fp);
651デフォルトの名無しさん:2005/08/22(月) 19:28:48
なんか中庭ででけえ音楽鳴らして車に乗ってるカスがいるな
652デフォルトの名無しさん:2005/08/22(月) 19:29:39
雰囲気を感じ取ってもらえれば良いのですが、
#define OUTPUTNum1(fname,id1) \
{\
test = fopen( "unko.txt", "w" );\
fprintf( test, "%d" ,id1 );\
fclose( test );\
}
#define OUTPUTNum2(fname,id1,id2) \
{\
test = fopen( "unko.txt", "w" );\
fprintf( test, "%d %d" ,id1, id2 );\
fclose( test );\
}

#define OUTPUTNum3(fname,id1, id2, id3) \
{\
test = fopen( "unko.txt", "w" );\
fprintf( test, "%d %d %d" ,id1, id2, id3 );\
fclose( test );\
}
こんな感じの、可変長の引数にうまく対応するマクロ、
もっと簡潔にかけませんか?
653デフォルトの名無しさん:2005/08/22(月) 19:29:50
広い中庭ですね。
654651:2005/08/22(月) 19:30:02
スレッドミス.....orz
スレ違いスマソ
655デフォルトの名無しさん:2005/08/22(月) 20:33:44
>>652
用途は違うかもしれないが、参考までに。
-- hoge.h --
#define _OUTPUT_FLAG

#ifdef _OUTPUT_FLAG
extern void _OutputNum( const char *format, ...);
 #define OUTPUT_NUM(...) _OutputNum(__VA_ARGS__)
#else
 #define OUTPUT_NUM(...) ((void)0)
#endif //_OUTPUT_FLAG

-- hoge.c --
#include "hoge.h"

#ifdef _OUTPUT_FLAG
 #include <stdio.h>
 #include <stdarg.h>
 void _OutputNum( const char *format, ...)
 {
  va_list args;
  char buf[256];
  FILE* fp = fopen( "unko.txt", "w" );
  
  va_start(args, format);
  vfprintf(fp, format, args);
  va_end(args);
  
  fclose(fp);
 }
#endif //_OUTPUT_FLAG
656652:2005/08/22(月) 20:38:08
↑のように書くことで、OUTPUT_NUMマクロはprintfと同じ書式で
unko.txtに出力できるようになる。

また、_OUTPUT_FLAGの定義をコメントアウトすることで、
ソース中のOUTPUT_NUM()があっても出力を抑止できる。
657デフォルトの名無しさん:2005/08/22(月) 20:43:47
まさかこれほどすばらしい答えが得られるとは、
正直思っとりませんでした
さすが2ちゃん・・・
>>656さま本当にありがとうございました
658656:2005/08/22(月) 20:48:46
今更ながら>>656の名前間違えてたorz
>>656 = >>655
なんで質問者になってるんだよ俺www

ちなみに、↑のはVCのTRACEマクロと同じやり方ね。
659650:2005/08/22(月) 21:42:05
すみません.よく考えてみたのですが
union {
 short sht;
 char ch[4];
 long lng;
} test;
でポインタのアドレスを求めたら,
|--sht--|
|------lng------|
|--ch[0].......ch[3]--|
のようなアドレス分布になったのですが,このshtとlngを考えたら
どう考えてもlngの左端のビットにshtを介して1は入らないと思うのですが,実際は入ります.
>>646さんのように
      |--sht--|
|------lng------|
|--ch[3].......ch[0]--|
と考えるのでしょうか?double型のデータを一旦,共用体の配列メンバchから適当なファイルに保存して,double dとして読み込むと考えると以下のように
考えれば読み込めば正常な値が得られるのですが,
|------------------------double d--------------------------|
|-----ch[0]-----ch[1]---.............................----------------ch[7]----|
ひとたび,
|------------------------double d--------------------------|
|-----ch[7]-----ch[6]---.............................----------------ch[0]----|
と考えてやるとdouble dの値は意味のない値となってしまいます.
かなり混乱してしまって何がどうなっているのかよく,掴めません.どうか,お願いします.(´・ω・`)
660デフォルトの名無しさん:2005/08/22(月) 21:52:51
>>659
ビックエンディアンとリトルエンディアンは調べた?
661デフォルトの名無しさん:2005/08/22(月) 21:57:26
どう考えても...入るんじゃないのか?
662デフォルトの名無しさん:2005/08/22(月) 22:05:28
ググッたら IntelのCPUなのでリトルエンディアンを採用しているようです.
下位ビットから転送されるということは例えば,
ch[0] の値が100,ch[1] の値が120 としたとき二進数表記がそれぞれ 01100100,01111000
となっているとしたらメモリのビットの並びは
00100110 || 00011110
となっているということでしょうか?
663デフォルトの名無しさん:2005/08/22(月) 22:05:57
>>659
#include <stdio.h>
void dump(void *data, int size)
{
  unsigned char *p = data;
  int i;
  for(i = 0; i < size; ++i) printf("%02X ", p[i]);
  putchar('\n');
}

union { 
  short sht; 
  char ch[4]; 
  long lng;
} u_test;

int main()
{
  printf("ofset: 00 01 02 03\n------------------\n");
  u_test.sht = 0x1234;
  printf("sht  : "); dump(&u_test, sizeof(u_test));
  u_test.lng = 0x12345678;
  printf("lng  : "); dump(&u_test, sizeof(u_test));
  return 0;
}
664659:2005/08/22(月) 22:12:39
すみません,コテ忘れました...>>662 == >>659です.
665デフォルトの名無しさん:2005/08/22(月) 22:17:23
なんか、バイナリ入出力だ endianだ、似たようなバカ
なこと聞いてくるのが沸いて出るなあ。
>>643,650
>>共用体を使ってshort型で入れた整数をlong型に変換
そもそも bit操作を(言われてもendianも理解しないで)
こういう方法でやるのが間違い。
というか、スレ違いは相手にするなと。
初心者系かなあ。少なくとも実用プログラムじゃないよなあ。
(もともとその処理自体意味無いんじゃね? 会社の、とか言い出したりして……)
666デフォルトの名無しさん:2005/08/22(月) 22:26:24
某所より


#include <stdio.h>

int sum(int,int);/* プロトタイプ宣言 */

int main(void)
{
int value;
value = sum(50,100);
printf("%d\n",value);
return 0;
}

int sum(int min,int max)
{
int num;
num = (min + max) * (max - min + 1) / 2;
return num;
}

return numはどこに返り?
return numでなくreturn 0ではだめなんですか?
667デフォルトの名無しさん:2005/08/22(月) 22:28:18
>>666
いいよ
668デフォルトの名無しさん:2005/08/22(月) 22:29:30
659,662 のあほさ加減は、ネタなんだよな!?
669デフォルトの名無しさん:2005/08/22(月) 22:31:07
>>666
return 0でもいいけど、それじゃ何のためにsum()呼んでるの?
670デフォルトの名無しさん:2005/08/22(月) 22:31:37
>>665
質問者と回答者の双方が学生さん
671デフォルトの名無しさん:2005/08/22(月) 22:32:15
いや、わかりません。。

解説おねがいできますか?
672659:2005/08/22(月) 22:33:19
ネタではないです......
独習C の練習問題でどうしても解答のやっていることが理解できなくて質問させていただきました.
スレ違い,失礼いたしました.
673デフォルトの名無しさん:2005/08/22(月) 22:41:33
>>672
ちょっと待って。それこそ初心者系じゃないか、とか、
endianとかは他の書籍も参考にきちんと調べろよ、とか
は置いといて…
その「独習C の練習問題」というのは一般の書籍のことなのか?
スレ違いだがいちおう最後に晒してくれ。
(書籍にきちんと解説があるはずの場合もあるし、例題、書籍自体が
トンデモナイ場合があるので…)
674デフォルトの名無しさん:2005/08/22(月) 22:44:33
そもそも

return numとreturn 0

の違いが分かりません。。
厨質すんません。。
675デフォルトの名無しさん:2005/08/22(月) 22:45:02
そういうのは先生に聞いてくれ
676デフォルトの名無しさん:2005/08/22(月) 22:50:23
>>673
「独習C 第三版・Herbert Schildt著・翔泳社」です.
すでに改訂版が出ているようですが.....
事前に代入処理の型変換についての解説はありました.
677デフォルトの名無しさん:2005/08/22(月) 22:53:39
>>674
厨質にもほどがある。
まずはまともに本で自習してくれないか。
678デフォルトの名無しさん:2005/08/22(月) 22:54:41
今日からC言語を勉強し始めたばかりのものです。
ぶっちゃけ、
int a=1;
・・・・
とかからどうやってドラクエとか作るんでしょうか?めちゃめちゃ不思議です。
679デフォルトの名無しさん:2005/08/22(月) 22:54:47
>>677
いや、ネタだろういくらなんでも・・・
とりあえず676が本気でやる気あるのなら、
トリップつけて(自分でくぐれよ)初心者スレへどうぞ...
680デフォルトの名無しさん:2005/08/22(月) 22:56:45
681デフォルトの名無しさん:2005/08/22(月) 22:59:05
>>678
戦闘のダメージとかはただの計算式だし
表示は画面を構成する二次元の点々に色付けるだけだし。
まずはマルバツでも作ってみたら。
ユーザーの入力、計算、画面の出力という意味でドラクエと変わらんw
682デフォルトの名無しさん:2005/08/22(月) 23:06:00
俺にはプログラムでドラクエが動くことよりも、ドット絵師の技術の方が不思議に見える。
683デフォルトの名無しさん:2005/08/22(月) 23:06:24
>>682
漏れも。
684人事部:2005/08/22(月) 23:20:22
社員番号:0x0255の方、次の職探しで大変ですね。
受けた会社から聞き合わせの電話が来たら、しっかりとあなたの問題行動を伝えておきますので。
685デフォルトの名無しさん:2005/08/22(月) 23:21:17
ヒットアンドブローはお手軽に作れてそれなりに遊べて、
プログラムの練習に超おすすめ。
686デフォルトの名無しさん:2005/08/22(月) 23:24:47
聞き合わせ?
687デフォルトの名無しさん:2005/08/23(火) 06:18:47
>>676
お手数です。続けるべきじゃないですがチト引っかかるので…
「代入処理の型変換」って「代入文での型変換」ということですよね。
そもそも、
>>643 >>共用体を使ってshort型で入れた整数をlong型に変換
にある例を、いわゆる"型変換"と呼ぶ(考える)のは誤解のもと
でしょうから注意。(強いて言えば byte(or bit)列の操作かなあ?)
その本も見たこと無いんで十分な説明があるのか良否はわかりませんが、
入門者に誤解を与えかねないのは危険かも。
どちらにせよ学習者が1冊だけを参考にするのは不備でしょう。

688デフォルトの名無しさん:2005/08/23(火) 09:43:34
プログラムの一部を//や/**/等でコメントにすることをなんと言いますか?
689デフォルトの名無しさん:2005/08/23(火) 09:44:51
コメントアウト
690デフォルトの名無しさん:2005/08/23(火) 09:45:07
>>688
コメントアウト
691デフォルトの名無しさん:2005/08/23(火) 09:46:09
>>689-690
ありがとう

では、コメントアウトした部分をもとに戻すことはなんと言いますか?
692デフォルトの名無しさん:2005/08/23(火) 09:56:50
あまり使わないような気もするけど
encomment/decomment
693デフォルトの名無しさん:2005/08/23(火) 13:05:45
コメントアウトを戻す
694デフォルトの名無しさん:2005/08/23(火) 17:19:15
コメントイン
695デフォルトの名無しさん:2005/08/23(火) 17:34:20
お前マジ頭いいな
696デフォルトの名無しさん:2005/08/23(火) 23:18:29
普通だって。
# なんだ、この流れは。
697デフォルトの名無しさん:2005/08/23(火) 23:21:52
>>691
uncomment out

オプションを設定するヘッダーファイルのなかでこんなの良く見るよ。

/* uncomment out the following line to enable XXX */

/* #define OPTION_XXX_ENABLED 1 */
698デフォルトの名無しさん:2005/08/23(火) 23:43:39
リストへの挿入がまったくワカラン

だれか分かり易く教えてくれない?
699デフォルトの名無しさん:2005/08/23(火) 23:55:10
>>698
リストって線形リストか?
とりあえず新たに挿入するノードようの領域をmallocなりcallocなりで確保して
こいつへのポインタをnewにでも放り込んでおく
んで、挿入位置の直前にあるノード(A)の次のノードへのポインタをnewの次へのポインタに複写
その後、Aの次へのポインタをnewへのポインタに書き換えて終了
700デフォルトの名無しさん:2005/08/23(火) 23:55:25
>>698
A→Cの間にBを挿入するなら、BにCをつないで(B→C)、AにBを
つなげば(A→B)いい。
具体的にstruct list {struct list *next;};みたいな単純な線形リストなら、
CへのポインタをBのnextに入れて、BへのポインタをAのnextに代入する。
701デフォルトの名無しさん:2005/08/24(水) 00:06:57
口−−→■⇒

 ◆を挿入

口→◆♂■⇒
702698:2005/08/24(水) 00:25:47
簡単な挿入をおこなってるプログラム書いてほしいって言ったら…駄目?

よんでもいまいちワカランのよ
703デフォルトの名無しさん:2005/08/24(水) 00:26:59
今読んでるの葬ってソースの載ってる本探せよ。
704デフォルトの名無しさん:2005/08/24(水) 00:31:15
持ってる本はリスト関連がのってなくて…
705デフォルトの名無しさん:2005/08/24(水) 00:31:56
>>704
線形リストでググれ
706デフォルトの名無しさん:2005/08/24(水) 03:25:26
単方向リスト?
双方向リスト?
707デフォルトの名無しさん:2005/08/24(水) 03:35:59
>>698の態度が気に入らない
708デフォルトの名無しさん:2005/08/24(水) 03:37:56
すいません、質問です

char * GetStr ()
{
 char _szTemp[128];
 strcpy(_szTemp, "abc");
 return _szTemp;
}

int main ()
{
 cout << GetStr() << endl;
 return 0;
}

GetStr()関数で char 型に入ってる文字列を返したいのですが、
どうすればいいんでしょうか。

void GetStr(char *_szTemp)

みたいに引数に入れて返すのではなく、
戻り値で返したいんです。
どなたかお願いします m(__)m
709デフォルトの名無しさん:2005/08/24(水) 03:40:50
char * GetStr (char *_szTemp)
{
 strcpy(_szTemp, "abc");
 return _szTemp;
}
710708:2005/08/24(水) 03:45:23
>>709
にゃるほど。それで行けますね。
どうもありがとうございます。 m(__)m

GetStr()で宣言した文字列を返したほうがスマートになるような
気がするんですが、それは無理ですか?
711デフォルトの名無しさん:2005/08/24(水) 03:45:52
>>710
std::string GetStr() 
{
  std::string str("abc");
  return str; 
}
712デフォルトの名無しさん:2005/08/24(水) 03:49:27
/* 俺も暇だなぁ */
typedef struct ulist ulist;
struct ulist {
 int value;
 ulist *next;
};

ulist *ulist_create() {
 ulist *res = malloc(sizeof (ulist));
 res->value = 0;
 res->next = NULL;
}

void ulist_insert_next(ulist *prev, ulist *node) {
 node->next = prev->next;
 prev->next = node;
}

void ulist_remove_next(ulist *node) {
 ulist *next = node->next;
 if(next == NULL) { return; }
 node->next = next->next;
 free(next);
}

void ulist_free(ulist *node) {
 ulist *next;
 if(node == NULL) { return; }
 next = node->next;
 free(node);
 ulist_free(next);
}
713デフォルトの名無しさん:2005/08/24(水) 03:51:32
>>710
char *GetStr()
{
return "abc";
}

714デフォルトの名無しさん:2005/08/24(水) 03:53:55
>>710
動的に確保していいんなら

char *GetStr() {
 return strdup("abc");
}

きちんと後で free すること。


あと、静的なデータならそのまま return できる。

char *GetStr() {
 return "abc";
}

char *GetStr() {
 static char _szTemp[128];
 strcpy(_szTemp, "abc");
 return _szTemp;
}

ただ、静的なので当然データは同時に1つしか存在できない。
呼び出すたびに違うのを返したい場合には使えない。


ただまあ、普通は >>709 の形にするんじゃない?
715708:2005/08/24(水) 04:00:55
全然スマートじゃないんですが、

char * GetStr ()
{
 char *_szTemp = "wertyuytrewruyreertyurertyuiitrertyuytre";
 strcpy(_szTemp, "abc");
 return _szTemp;
}

↑がいけるかと思ったら無理でしたww

>>711 >>713 >>714
std::stringはまだわからないので、
>>709か、できたら>>713で行って見ます。
皆様、どうもありがとうございます。
716デフォルトの名無しさん:2005/08/24(水) 04:04:03
>>715
Cの初歩の初歩で学ぶ禁じ手をやっている。
一冊Cのテキストを読むことをお勧めする。
そんな調子じゃ、まともなものは作れない。
717デフォルトの名無しさん:2005/08/24(水) 04:05:37
>>715
そもそも文字定数って書き換え不可じゃなかったっけ?
718デフォルトの名無しさん:2005/08/24(水) 04:06:13
>>716 >>717
うはwwごめんなさい。
つい必死で。
719デフォルトの名無しさん:2005/08/24(水) 05:34:46
>>1 だから、無能厨が初心者と雑談するスレじゃないちゅうに。
720デフォルトの名無しさん:2005/08/24(水) 06:22:18
アロー演算子が a->pnext->pnext とか2つ以上続いちゃうと
なんとなく不安になるんですが、考えられるまずい要素とかありますか?
721デフォルトの名無しさん:2005/08/24(水) 07:43:46
>>720
>考えられるまずい要素とかありますか
あんたの頭。
722デフォルトの名無しさん:2005/08/24(水) 07:50:13
あんたのあたま
723デフォルトの名無しさん:2005/08/24(水) 09:55:08
>>720
演算子の優先順位をあたまにたたきこんでくだちい
724デフォルトの名無しさん:2005/08/24(水) 10:00:01
a->pnext が何度も出てくる場合は効率悪いってくらいか。
最適化効くかもしれんけど。
725デフォルトの名無しさん:2005/08/24(水) 10:00:55
>>723
優先順位じゃなくて結合規則だ。
726デフォルトの名無しさん:2005/08/24(水) 10:20:47
>>725
そうだ、それをいいたかったんだよ
727デフォルトの名無しさん:2005/08/24(水) 12:46:28
>>720
tmp = a->pnext;
tmp->pnext
でいいだろ。
まずいというか、ポインタ参照は出来るだけ深くしないように習慣づけた方が良い。
****pとか論外。
簡単な事を複雑に見せてるだけでハッタリと変わらん。
728デフォルトの名無しさん:2005/08/24(水) 13:04:23
リストの二つ先を拾うだけなら別にa->pnext->pnextでいいじゃん。
流石に五つも先ならa->pnext->pnext->pnext->pnext->pnextはやりすぎだと思うけど。
729デフォルトの名無しさん:2005/08/24(水) 13:25:53
>>720
途中のポインタが NULL になっていた時に落ちる。
730デフォルトの名無しさん:2005/08/24(水) 14:19:25
void abc( void ) {
int in;
printf( "kyoumoiitennki\n" );
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void def( void ) {
int in;
printf( "kyoumoiitennki\n" );
printf( "sentakumonowohosou\n" );// point!
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
例えが少し悪いかもしれませんが、このように、ほとんど同じ関数なのに、
中途半端な位置で、一部だけ違うという場合にたまに遭遇します。
マクロ化して省略すると見づらくなりますし、どう回避すべきでしょうか
気にせず違う関数として2つ定義しておくのが、やはり一番の正解ですか?
731デフォルトの名無しさん:2005/08/24(水) 14:27:27
void f( int mode ) {
 int in;
 printf( "kyoumoiitennki\n" );
 if(mode==1)printf( "sentakumonowohosou\n" );
 scanf( "%d" ,&in );
 printf( "rakki-number %d" ,in );
}
void abc()
{
 f(0);
}
void def()
{
 f(1);
}
732デフォルトの名無しさん:2005/08/24(水) 14:28:32
>>730
コピペしてちょっと変えるだけの手抜きは決して許してはならない。
俺がそういう関数が数百ある他人の書いたプログラムのデバッグで
どれだけ苦労していると思ってるんだ。ふざけるな。
733デフォルトの名無しさん:2005/08/24(水) 14:38:19
は?
734デフォルトの名無しさん:2005/08/24(水) 14:40:42
>>731のを横から勝手に改造。

enum action {
 NO_ACTION;
 SOUJI;
 HOSU;
 NERU;
};

void f( action mode ) {
 int in;
 printf( "kyoumoiitennki\n" );
 if(mode==HOSU)printf( "sentakumonowohosou\n" );
 scanf( "%d" ,&in );
 printf( "rakki-number %d" ,in );
}
void abc()
{
 f(NO_ACTION);
}
void def()
{
 f(HOSU);
}
735デフォルトの名無しさん:2005/08/24(水) 14:42:00
文字列を直接渡す方がマシ
void f( char *prompt ) {
 int in;
 printf( "kyoumoiitennki\n" );
 if ( prompt[0] ) printf( prompt );
 scanf( "%d" ,&in );
 printf( "rakki-number %d" ,in );
}
void abc()
{
 f( "sentakumonowohosou\n" );
}
void def()
{
 f( "" );
}
736デフォルトの名無しさん:2005/08/24(水) 14:48:29
トリッキーな解としては関数ポインタを渡すとか。
void f( void(*callback)() )
{
int in;
printf( "kyoumoiitennki\n" );
if( callback ) callback();
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void abc( void ) {
f(NULL);
}
void def( void ) {
struct SFunc {
static void Callback() {
printf( "sentakumonowohosou\n" );
}
};
f(SFunc::Callback);
}
737デフォルトの名無しさん:2005/08/24(水) 15:53:08
こう言う場合一行追加される if 文を気にしていた
自分が阿呆であると知ったいい機会でした
皆様レスありがとう!
738デフォルトの名無しさん:2005/08/24(水) 16:10:54
>>735
>if ( prompt[0] ) printf( prompt );
こういうコードはやめて欲しい。
せめて
if ( prompt != NULL )
とかにしてくれ。
ぬるぽが来たらどうすんだ。
739デフォルトの名無しさん:2005/08/24(水) 16:18:03 BE:199692858-##
>>735 の場合は、ifを省略して、

printf( prompt ); だけでいいような気が。

740デフォルトの名無しさん:2005/08/24(水) 16:36:36
ダメすぎ。NULLはprintf()に使えない。
厳密にやるなら、
if (prompt) {printf("%s", prompt);}
でないと%を含む文字列を表示できない。。
741デフォルトの名無しさん:2005/08/24(水) 16:37:59
話が完全に反れてるな
742デフォルトの名無しさん:2005/08/24(水) 17:07:48
>>735と同じスタンスだが
個人的には文字列は1つにまとめた方が好き。

#define HARE "kyoumoiitennki\n"
#define HOSU "sentakumonowohosou\n"

void f(char* msg)
{
 int in;
 if(msg)
  printf( "%s", msg );
 scanf( "%d" ,&in );
 printf( "rakki-number %d" ,in );
}

void abc( void ) {
 f(HARE);
}

void def( void ) {
 f(HARE HOSU);
}
743デフォルトの名無しさん:2005/08/24(水) 17:26:59
>>742
printf( RAKKI "%d" ,in );
とはしないの?w
744デフォルトの名無しさん:2005/08/24(水) 17:53:27 BE:124808055-##
>>740
プロンプトがなしの場合、NULLを渡すか、長さが0の文字列を
渡すかって仕様の問題じゃん。
NULLを渡さないって仕様ならifはいらないって話。
745デフォルトの名無しさん:2005/08/24(水) 22:27:48
うーん、こういう質問てここでいいのかな。より適切なスレがあれば誘導よろしこ。

Cで自作アプリを書き始めたのですが、(1)「できるだけ小さく」
(2)「他のライブラリに依存しない」を目指したら、標準Cがあまりにも
プリミティブ過ぎて、再発明した(しかも出来の良くない)「車輪」が量産
されつつあります。(メモリ管理とか文字列とかリストとかマップとか)

さすがにやってられないので、(2)はあきらめて、できあいの「車輪」を
使おうとしてるのですが、皆さんこういうとき何を使ってますか?

とりあえずライセンスのぬるいaprを使おうかと思ってるのですが……。

ちなみに、C++には宗教上の理由で近付きたくないです(ぉ
# いや、単に挫折しただけなんですが(^^;
746デフォルトの名無しさん:2005/08/24(水) 22:30:04
ちいさくする意味がわからん
747デフォルトの名無しさん:2005/08/24(水) 22:40:49
C++ を better C として使えばいい。
748デフォルトの名無しさん:2005/08/24(水) 22:51:46
あとSTLも必要だな。

大丈夫、STLはオブジェクト指向じゃないから。
749デフォルトの名無しさん:2005/08/24(水) 22:58:45
>>746
初めてC++をさわったとき、Hello worldのバイナリが数MBになったのが未だにトラウマだったりしまつ。
>>747 >>748
オブジェクト指向に挫折したんじゃなくて、C++に挫折しました。JavaやRubyには挫折しなかったんですが……。
750デフォルトの名無しさん:2005/08/24(水) 23:04:16
>>749
今、VC7.1で試してみたけど、Hello, worldに目いっぱいの最適化をかけて48KiBになったよ。

しかしSTLを使わないのは惜しいな。
お前が例に挙げた文字列とかリストとかマップとかはみな含まれている。
751デフォルトの名無しさん:2005/08/24(水) 23:05:26
ここはアンチ野郎がC++を使ってくれるように説得してあげるスレじゃありませんから。
752デフォルトの名無しさん:2005/08/24(水) 23:06:57
それもそうだな。
そっとしておこうか。
753デフォルトの名無しさん:2005/08/24(水) 23:27:13
ttp://axts10.web.infoseek.co.jp/bitmap_text.gif
↑このように、ビットマップファイルを輝度値の行列にしたいのですが、
方針としては、

ヘッダー情報読み取り
 ↓
ピクセルデータを24bitずつ読み出しては先頭の8bitを10進数で出力
 ↓
出力した輝度値が1行分の数になったら改行を出力
 ↓
以下繰り返し

こんなかんじでできるでしょうか?
754ESP:2005/08/24(水) 23:30:00
それでいいだろ。何を求めてるんだよ。
755デフォルトの名無しさん:2005/08/24(水) 23:56:53
ビットマップは絵の一番下のデータが一番最初にくるという逆転構造になってるから、
そこだけ注意な。
756753:2005/08/24(水) 23:59:08
>>754
>>755
ありがとうございます。
C言語プログラムは初めてなのですごく緊張してます・・・
またお世話になるかもしれませんので、そのときはよろしくお願いしますm(_ _)m
757デフォルトの名無しさん:2005/08/25(木) 00:05:52
あと、グレースケールならパレットになってるかもな。
758デフォルトの名無しさん:2005/08/25(木) 00:10:24
>>753
画像編集ツールでxpmとかpgmを出力できるのを探してこい。
例えばIrfanView(プラグインも必要かな)でもいい。
bmpファイルをそのツールで開き、pgmの場合はOptionでAsciiに設定の上、
保存すればほぼ目的に到達できるぞ。
#自分でプログラミングする場合でも一度見ておくといいと思う。
759753:2005/08/25(木) 00:22:32
>>757
いちおうカラー画像として保存してるんですが、
確認するようにします。
>>758
あ・・・ できちゃいましたw
まぁ、練習ということで組めそうならがんばってみます。
ありがとうございました。
760デフォルトの名無しさん:2005/08/25(木) 01:37:48
>>745
過去に作ったプログラムから使えそうなものを拾って繋ぐ。
761デフォルトの名無しさん:2005/08/25(木) 01:55:35
質問です!
printf();でバイナリをそのまま出力させたいんですがどう指定すればいいんですか?

あえてASCIIに変換したくないんですが・・・
print("%c",0xff);とすると、Dosプロンプトに出力された時のメモリ上にffと格納されるんでしょうか?
おねがいします。
762デフォルトの名無しさん:2005/08/25(木) 01:57:44
>>761
バイナリをそのままってどういうことだ?
バイナリエディタで表示されるような感じのを出したいのか?
763デフォルトの名無しさん:2005/08/25(木) 01:57:53
まずは、入門書から読み直せ
764デフォルトの名無しさん:2005/08/25(木) 01:58:05
「そのまま」の定義がよー分からんが、
%02X みたいなことを意味しているんだろうか。
765デフォルトの名無しさん:2005/08/25(木) 02:04:54
>>761
一つの方法としては
char ch=0xff;
int i;
for(i=128; i>0; i/=2)
if(i & ch) printf("1 ");
else printf("0 ");
他にはビットフィールドと共用体を利用する等
でいいのかな
766デフォルトの名無しさん:2005/08/25(木) 02:07:41
レスありがとうです。
なんというか、バイナリをprintfで出力する必要があって・・・
0xffなら0x66,0x66ではなく0xffのまま出力させたいんです。
どうすればいいんでしょう?

ひょっとして
char a[2];
a[0]=0xff;
a[1]=0;
printf("%s",a);
とかでいいんでしょうか・・・
767デフォルトの名無しさん:2005/08/25(木) 02:11:01
「バイナリ」が何なのか、
printf がどういう関数なのか、
全く分かってないように思われる。
768デフォルトの名無しさん:2005/08/25(木) 02:13:05
>>766
それだと文字列が表示されると思いますが。
しかも妙な。
769デフォルトの名無しさん:2005/08/25(木) 02:17:13
こいつには>>763のレスで十分だろ
770デフォルトの名無しさん:2005/08/25(木) 02:18:00
printfに拘る必要がわからない。
fwriteでいいのではないか。
771デフォルトの名無しさん:2005/08/25(木) 02:20:15
print "\xff\xff"
これで普通にできるが・・・
こいつは何を言ってるんだ?
772デフォルトの名無しさん:2005/08/25(木) 02:20:59
>>766
言いたいことは
printf("0x%x", 0xff);
ですか?
773デフォルトの名無しさん:2005/08/25(木) 02:21:04
リダイレクトしてファイルにしたときに、
0xff(文字ではなく数値)で埋められたバイナリファイルができてほしいってことか?
774デフォルトの名無しさん:2005/08/25(木) 02:22:04
深まる謎
775デフォルトの名無しさん:2005/08/25(木) 02:22:58
>>772
%#xでいいじゃん
776デフォルトの名無しさん:2005/08/25(木) 02:26:47
で、肝心の>>766さん、いかがですか?
777デフォルトの名無しさん:2005/08/25(木) 02:26:57
>>771
それは、%sとかのパターンが入ったときに嫌な予感。
778766:2005/08/25(木) 02:27:19
>770
対象がファイルじゃないんです・・
>771
perlですか?参考にします!
>772
ASCIIじゃだめなんです
>773
そうです。
何故かprintfを介さないと相手は受け取ってくれなくて・・
ASCII文字では無く数値そのままを渡したいんですが・・


うう・・入門書から出直してきます・・orz
779デフォルトの名無しさん:2005/08/25(木) 02:28:25
ここまで阿呆だとカポーンだな
780デフォルトの名無しさん:2005/08/25(木) 02:29:20
>>778
> 対象がファイルじゃないんです・・
stdoutファイルへ出力すれば?
781デフォルトの名無しさん:2005/08/25(木) 02:32:27
リダイレクトなんかしないでFILEポインタ宣言して素直にfputc()かfwrite()を使ったらどうですか?
fprintf()もprintf()も最終的にテキストになるから無理ですよ。
782デフォルトの名無しさん:2005/08/25(木) 02:37:26
>>766
例えば、0x41を出力したときどんな風に表示させたいのかね?
"A"?それとも"0x41"?
783デフォルトの名無しさん:2005/08/25(木) 02:39:09
用語の統一が大切だって良く分かった。
784デフォルトの名無しさん:2005/08/25(木) 02:42:15
つまり、最初の %c でいいんじゃないのか?
putchar でもいいと思うが。
785デフォルトの名無しさん:2005/08/25(木) 02:59:07
>>784
それだと文字に変換されたのが出るんじゃなかったっけ?

まぁどっちにしろ766の言ってることはいろいろとおかしいが
786デフォルトの名無しさん:2005/08/25(木) 03:08:37
>>785
単に1バイトそのまま出力するだけなんだが?
ディスプレイに出力すれば文字として表示されるだけであって。
787デフォルトの名無しさん:2005/08/25(木) 03:10:40
それは分かってても言わない約束よ
788デフォルトの名無しさん:2005/08/25(木) 03:12:03
言わなきゃいけないことだよ馬鹿
789デフォルトの名無しさん:2005/08/25(木) 03:18:28
ど、どーぶる。
790デフォルトの名無しさん:2005/08/25(木) 05:54:33
質問はともかくスレ違いなアホなレスする奴はどっか逝け。
>Dosプロンプトに出力された時「のメモリ上に」ffと格納されるんでしょうか?
>何故かprintfを介さないと相手は受け取ってくれなくて・・
あたりで、意思の疎通が無理なのは自明。
791デフォルトの名無しさん:2005/08/25(木) 10:59:11
かなりスレ違いな気もするがどこで聞いたらいいか分からないので
dx/dt = -10*x + 10*y
dy/dt = 28*x - y - x*z
dz/dt = -8/3*z + xy
をオイラー法で解く場合の式って以下でいいのでしょうか?

for(i=0; i<last; i++){
x[i+1] = x[i] + h * dxdt(x[i], y[i]);
y[i+1] = y[i] + h * dydt(x[i], y[i], z[i]);
z[i+1] = z[i] + h * dzdt(x[i], y[i], z[i]);
}
//x、y、zは解を入れる配列(0番目は初期値)、hは刻み幅、dxdt、dydt、dzdtは上述の式
792デフォルトの名無しさん:2005/08/25(木) 11:06:20
すみません、自己解決しました
刻み幅が十分で無かったため、発散してました
793デフォルトの名無しさん:2005/08/25(木) 14:53:38
猫でも分かるプログラミングってほとんど初心者の自分でも分かりますか?
いくつか種類があるみたいなので初心者でも分かる本のタイトルを教えてください。
前見たような記憶では付属のCDがあったんですがそれにはコンパイラが入ってるんでしょうか?
794デフォルトの名無しさん:2005/08/25(木) 15:16:18 BE:269585069-##
>>793
本は見たことないけど、サイトのほうを見るとあまりよくないと思う。
(本はゴーストライターが書いていて、悪くはないって話もあるけど)
795デフォルトの名無しさん:2005/08/25(木) 15:28:02
>>793
過去ログサイトから 2ch books を見ていろんな本の書評を見てみたら?
796デフォルトの名無しさん:2005/08/25(木) 15:29:40
>>793
猫だとは基本的な概念とか文法についての説明が不足しているので
他にちゃんとしたC言語の入門書 (サイトでもいいけど) がほしいところ。

あと、付属のCDにはコンパイラとサンプルソースが入ってた気がする。
797デフォルトの名無しさん:2005/08/25(木) 15:33:45
お答えどうもありがとうございました。
では、他の本で分かりやすいおすすめのはないでしょうか?
798デフォルトの名無しさん:2005/08/25(木) 15:37:49
void
799デフォルトの名無しさん:2005/08/25(木) 15:45:15
>>795
そういうページがあるのを初めて知ったw
過去ログにまとまってるリンクも便利だね。
>>793ではないが、ありがトン
800デフォルトの名無しさん:2005/08/25(木) 16:03:04
>>797
>>795読んでますか?
801デフォルトの名無しさん:2005/08/25(木) 17:13:51
>>793
>>795+推薦図書スレ行ってこい
そこのお勧め本使ってそれなりに勉強してる最中の俺ガイル
802デフォルトの名無しさん:2005/08/25(木) 20:13:14
個人的には日下部先生の本がお薦め
803793:2005/08/25(木) 21:19:12
すいません、なぜか795飛ばしてましたorz
柴田望洋氏の本を図書館で借りてみました
過去ログも見てみます
804デフォルトの名無しさん:2005/08/25(木) 22:05:18
>>802はネタ
805デフォルトの名無しさん:2005/08/25(木) 23:14:37
漢字とか2バイト文字ってどう実現させればいいんでしょうか
806デフォルトの名無しさん:2005/08/25(木) 23:15:27
メモリに2バイト格納すればいいと思うよ。
807デフォルトの名無しさん:2005/08/25(木) 23:19:03
DOSだとアルファベットをscanfとかで配列や動的に確保した変数に代入できますが、
漢字とかひらがなとか入力できないんでどうすればできるのかなぁと
808デフォルトの名無しさん:2005/08/25(木) 23:28:17
できますがなにか。
809デフォルトの名無しさん:2005/08/25(木) 23:50:27
コマンドプロンプトの設定を替えればできるのかな。
810デフォルトの名無しさん:2005/08/25(木) 23:53:29
全角/半角じゃ入力が切り替わらないって問題?
811デフォルトの名無しさん:2005/08/25(木) 23:54:28
Alt+全角
どいつもこいつも小出しにしやがって
812デフォルトの名無しさん:2005/08/25(木) 23:54:52
そうです。すみません説明不足で
813デフォルトの名無しさん:2005/08/26(金) 00:33:18
重複してたらすいません、コンパイルするさいに
エラーE2209 インクルードファイルをオープンできない、といわれました
borland c++ 5.5 ってコンパイラーを使ってます。

誰か教えていただけませんか?
814デフォルトの名無しさん:2005/08/26(金) 00:34:36
セットアップを死ぬほどやれ
815813:2005/08/26(金) 00:43:13
w やっぱそうですよね、
cの本についてるCDと同じ名前だったのでc++の本についていた付録CDをつかったんですけど、
それは関係ありませんよね?

コンパイルするとき bcc32 ***.c ってやってるんですけど
cのときとc++のときってコンパイルの仕方が違ったりするのですか?

超初心者ですいません、あと環境設定ってのはなんですか?
816デフォルトの名無しさん:2005/08/26(金) 00:44:26
ググれ。
817813:2005/08/26(金) 00:45:41
らじゃ
818デフォルトの名無しさん:2005/08/26(金) 00:46:56
readme嫁
819813:2005/08/26(金) 00:50:33
そのreadmeがcにも適応してるのかどうかわかんなくて
cをコンパイルするときでもbcc32でいいんですか?
c++のコンパイラでもcはコンパイルできるって書いてあったのでやってたんですけど
820デフォルトの名無しさん:2005/08/26(金) 00:51:43
とりあえず全てのマニュアルを嫁
821813:2005/08/26(金) 00:52:36
了解
822デフォルトの名無しさん:2005/08/26(金) 00:52:45
いっとくけど、マニュアルも読まない
自分では調べない
自分で解決しようとせずになんでも人に聞く

こんなやつには、プログラミングはできない
823813:2005/08/26(金) 00:58:00
そーですね、甘えてました。
自分でなんとかします
824デフォルトの名無しさん:2005/08/26(金) 01:27:30
つーか、スレ違いだって気づけ。
825デフォルトの名無しさん:2005/08/26(金) 04:11:02
すみません。
どこのスレに書き込んでいいのか分からなかったので
とりあえずここに書かせてください。

試験なんかに使うマークリーダー用のデータ読み取りプログラムというのは
どういった言語で構築するのでしょうか?
ちなみに、仕様はCSVファイルのデータをマークリーダー(読み取り機)で
読み込んで正否などを打ち出すらしいのですが...
826デフォルトの名無しさん:2005/08/26(金) 04:16:31
>>825
とりあえずはすれたてるまでもない質問スレでやれ
CSVにはどんなデータが入っていてリーダーはどの機種で
OSや予算や使える言語も最低限書くこと
827デフォルトの名無しさん:2005/08/26(金) 04:28:55
即レス感謝します。
でも、どんな言語で作るのかを聞きたいのに
使える言語も最低限書くことと言うのは、どういう意味ですか?

因みに
OS Win
予算 数100万
CSVの中には 試験に必要な「個人情報」と答案用フォームに書き込まれた「解答番号」です。
リーダーの機種名は 不明です。
828デフォルトの名無しさん:2005/08/26(金) 04:32:47
>>827
頼むからここを荒らすな。
スレ違いつーか、鼬害なんだから。
829デフォルトの名無しさん:2005/08/26(金) 04:41:39
そうですか。
失礼しました。

830デフォルトの名無しさん:2005/08/26(金) 04:48:59
ループの展開をするマクロを書きたいのですが,どのように書けば良いのでしょうか?

例えば,

c = a[i][j + 0] + b[i][j + 0];
c = a[i][j + 1] + b[i][j + 1];
c = a[i][j + 2] + b[i][j + 2];
c = a[i][j + 3] + b[i][j + 3];

見たいに書く代わりに,

LOOP_4(c = ....);

みたいにかける LOOP_4 のような物が欲しいです.

こういうのって割と需要ありそうなんですが,検索してもなかなか見つかりま
せん.識者の方,アドバイスお願いします.
831デフォルトの名無しさん:2005/08/26(金) 04:52:30
>>830
ループじゃいかんのけ?
832デフォルトの名無しさん:2005/08/26(金) 05:19:12
インライン?行数稼ぎ?
833デフォルトの名無しさん:2005/08/26(金) 05:40:28
boost preprocessor を使うのはどうだろ。

#include<boost/preprocessor.hpp>

#define GEN(z,k,_)  c = a[i][j + k] + b[i][j + k]; 
BOOST_PP_REPEAT(4,GEN,_)

こんな感じ
834デフォルトの名無しさん:2005/08/26(金) 05:47:38
>>830
普通にfor文のループで書くしかない
わけのわからんマクロ作ったらタコ殴りの刑
835デフォルトの名無しさん:2005/08/26(金) 05:55:13
訳あって明示的にインライン化したいんです.

>>833
ありがとうございます.できれば C でやりたいんですが,やっぱり無理なんでしょうか.
836デフォルトの名無しさん:2005/08/26(金) 05:56:35
無理
837デフォルトの名無しさん:2005/08/26(金) 05:57:02
ループのアンロールでしょ?
高速化の随分と最後の方にやるモノではあるのだが、
使わないこともない技術だ。
838833:2005/08/26(金) 05:57:52
preprocessorしか使ってないはずだからCでも使えると思いますよ
一応手元のgcc,vc,dmcでは問題無かったです。
839デフォルトの名無しさん:2005/08/26(金) 06:03:13
>>838
おお.

Boost == C++ ってイメージがあったので試さずに書いてしまいました.
ありがとうございました.
840デフォルトの名無しさん:2005/08/26(金) 08:18:55
つーか、ループアンロールならコンパイラにやらせればいいじゃん。
841デフォルトの名無しさん:2005/08/26(金) 11:51:19
/*10個の英字を読み取り、その中からアルファベット順に並べたとき
  一番最初にくる文字を表示するプログラム*/
#include <stdio.h>

int main(void)
{
int i;
char ch1, ch2;

printf("英字を10個入力してください\n");
ch1 = getchar();

for(i = 0; i < 10; i++){
printf("%d", i); /*動作確認のため*/
ch2 = getchar();
if(ch1 > ch2){ch1 = ch2;}
}

printf("%c", ch1);

return 0;
}

ループの中で1つ文字を読み込むときにi++が2回行われているようなんですが
どうしてでしょうか?
842デフォルトの名無しさん:2005/08/26(金) 11:59:29
>>841
改行コードでも入力されたんだろ。
詳しく知りたいなら初心者スレにでも行ってくれ。
843デフォルトの名無しさん
>>841
英字10って言ってるけど、それだと11個入力しないといけないんじゃない。