[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/10 00:57 / Filesize : 199 KB / Number-of Response : 749
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 26



1 名前:デフォルトの名無しさん [2008/03/22(土) 23:36:40 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 25
pc11.2ch.net/test/read.cgi/tech/1203343907/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 104代目
pc11.2ch.net/test/read.cgi/tech/1202135539/

2 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 23:37:35 ]
Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/
Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/

3 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 23:39:08 ]
Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/
Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/
Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/
Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/
Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/
Part 20 ttp://pc11.2ch.net/test/read.cgi/tech/1192455273/
Part 21 ttp://pc11.2ch.net/test/read.cgi/tech/1194384258/
Part 22 ttp://pc11.2ch.net/test/read.cgi/tech/1196489491/
Part 23 ttp://pc11.2ch.net/test/read.cgi/tech/1198295362/
Part 24 ttp://pc11.2ch.net/test/read.cgi/tech/1201083176/

4 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 00:07:16 ]
過去スレ貼るのって、なんか意味あるの?

5 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 00:19:07 ]
>>4さんがこの世に存在してるのと同じくらい意味があります!!

6 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 00:48:33 ]
あんまり意味なさそうだな。

7 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 00:53:16 ]
じゃ意味もなく貼ってるってことで。

8 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 01:37:06 ]
過去スレ見たい奴が居るからそういう人向けにはあった方が便利
不要に思う奴はスルーすればいい

9 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 15:27:35 ]
#include <stdio.h>

main () {
int player;
int i;
int r;

for(i = 0; i < 5; i++) {
r = scanf("%d", &player);
while (getchar() != '\n') {}
printf("%d 回目 ", i+1);
if(r) { printf("%d\n", player); }

else { printf("入力エラー\n"); }
}
return 0;
}


r = scanf("%d", &player);でrにはどのような値が入るのですか?
playerと全く同じ値が入るのでしょうか?
if(r)というのがどのような条件なのかもよくわからないです
よろしくお願いします

10 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 15:32:58 ]
正しく入力を解析できた数、あるいは EOF が帰ってくる。

入力が無い場合は EOF が返される。
数値が入力されなかった場合は 0 が返される。
数値が入力されていていた場合は player にその数値が入れられ 1 が返される。



11 名前:9 mailto:sage [2008/03/23(日) 15:56:30 ]
>>10
教えて頂いた事を元に調べ直したら理解出来ました
ありがとうございます

12 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 16:33:56 ]
windows上でBCCを使っています。
1行ずつテキストファイルを読み込んで、条件により文字列の置換を
行うプログラムを作っているのですが、fgetsの基本的なところがわか
ってないもので上手く処理できずに困っています。

悩んでいる処理が

while(fgets(buf,512,fin)!= NULL){
....置換処理
fputs(buf,fout) //・・・処理しない行

という処理なのですが、出力結果をバイナリエディタで見ると改行"0D0A"
の前に"0D"が入ってしまいます。
fgetsでbufに読み込んだ終端に"0D"が挿入されるから当然の動作
なのでしょうが、それを上手く削除する方法がわかりません。
それで、しかたなく今は、

fseek(fout,-3,SEEK_CUR);
fprintf(fout,"\n");

なんてことをしています・・・(汗
いいやり方があれば教えて下さい。。。。

13 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 16:46:45 ]
>>12
finをテキストモードでオープンすれば、改行は\nにならない?

14 名前:デフォルトの名無しさん [2008/03/23(日) 16:51:05 ]
char *p;
:
:
p = strstr(buf, "\r\n");
if (p != NULL) strcpy(p, "\n");



15 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 19:35:07 ]
プロトタイプ宣言について教えて。
int myStrlen(const char* str) {
 return strlen(str);
}
って関数があったとき、
int myStrlen(const char* str);
これがプロトタイプ宣言だよね。
ANSI以前のプロトタイプ宣言が無いときは
int myStrlen();
こう書いていたんだっけ?
プロトタイプ宣言が無いときに、相互に呼び出される関数を
どう実現していたのかが気になった。


16 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 19:44:47 ]
>>15
型チェックなしだから、空き放題に呼び出せたのでは?

17 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 19:46:15 ]
現在 int myStrlen(); が int myStrlen(...); の時とほぼ同じような感じで使えるから、
それと同じような感じで使われてたんじゃないかな。

18 名前:12 mailto:sage [2008/03/23(日) 20:56:44 ]
>>13さん
ありがとうございます!あっさり解決しました〜

19 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 23:28:06 ]
>>15
関数を呼び出す側が正しい引数を渡すものとしていた
引数について型変換が行われないのでキャストも必要だった

例として
sqrt(2);
の時
プロトタイプ宣言があれば 2 → 2.0 に変換して渡してくれるが
プロトタイプ宣言が無い場合 2 (整数)のままで渡されるので期待した返値が得られない

可変長引数関数は今でも型チェックができないので同じ問題がある
(標準関数についてだけは警告を出してくれるコンパイラもある)
printf("%f\n", 2);
printf("%f\n", 2.0);

20 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 01:30:20 ]
色々とありがとう。
プロトタイプ宣言なしのコーディングなんて暫くしてなかったから、どんなものか忘れてた。
これで、新人とかに質問されてもちゃんと答えられるぜ。




21 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 19:56:30 ]
ポインタのポインタについて困ってます。
メインから構造体のポインタを渡し、構造体に内容を追加して、
追加後のポインタを返してもらいたいのですがうまくいきません。
void add_line(int num,struct lines **current){
char input_line[512];struct lines *buffer_pre,*buffer_fow;int length,i; struct lines *p;
p=*current;
do{
gets(input_line);
if((*input_line != '.')&&(*(input_line+1) != '\0')){
buffer_pre=p;
//構造体の前後のポインタ取得の処理は省きました
//構造体とテキストの領域をMALLOCで確保します
if (buffer_pre == 0){       //リストの連結
p->next=0;
p->prev=0;
}else if((buffer_pre != 0)&&(buffer_fow == 0)){
p->next=0;
p->prev=buffer_pre;
buffer_pre->next=p;
else if((buffer_pre != 0)&&(buffer_fow != 0)){
p->next=buffer_fow;
p->prev=buffer_pre;
buffer_pre->next=p;
buffer_fow->prev=p;
};
};
}while((*input_line != '.')&&(*(input_line+1) != '\0'));
*current=p;
return;}
何がまずいのでしょうか?

22 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 20:06:25 ]
教えて

char MyStrMid( char buff[], const char string[], int pos, int len )
{
 char *dest = buff;
 
 if ( pos < strlen(string) ){
  for ( string += pos ; len > 0 ; len-- ){
   if ( *string == '\0' ){
    break;
   }
   *dest++ = *string++;
  }
 }
 *dest = '\0';
 return( buff );
}

っていうプログラムを教えてGooで見つけました。
MIDができる関数なんだけど、
const char stringで宣言しているのに
*string++ しているので、stringの中身を変更しないで
この関数を使いたいんだけど、どうしたらいいんでしょう?

23 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 20:19:09 ]
>>22
なぜ中身が変更されていると思ったのでしょう?

24 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 20:21:14 ]
*dest++ = *string++;

*dest = *string;
dest++;
string++;
とほぼ同じ動作。
string の中身は変わらないっつーか、
変わってたら string は const だからエラー出る。

25 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 20:26:39 ]
>>23,>>24
ありがとうございます。

>>23
なぜ中身が変更されているかは、*string++をしているからですよね

>>24
*string++で中身が変わってしまい、constでエラーが出ることは理解できるのですが、
応用として、変数を増やすことなく、この関数を使用できないでしょうか?

26 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 20:27:26 ]
>>25
中身は変更されないので確認してねって事です

27 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 20:28:25 ]
>>21
・ gets より fgets を使う。
・ input_line[0] == '\0' の時に最初の条件式ではマズい。
 そもそも意図通りの条件なのかも怪しい。
・ *(input_line+1) とか読みにくい。input_line[1] にしてくれ。
・ 省略するより、省略なしでアップローダーにうpしてくれ。
・ 同じ条件式を二度も書くのは無駄。
 無限ループにして if(! (条件)) { break; } した方がすっきりする。
・ 双方向リストはリングリストの形で実装すると、途中の if-else チェインが不要になる。
・ add_line は本当に1行追加の関数にして、
 add_input_lines っての作ってそこで add_line を逐次呼ぶ実装にした方がすっきりする。

変数の説明も無いし読みづらいしで
とりあえずすっきりさせてからということで。

28 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 20:29:24 ]
>>25
>*string++で中身が変わってしまい、constでエラーが出ることは理解できるのですが、
だから変わらないっつーの。

29 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 20:29:31 ]
>>21
ポインタを返してもらうならvoid *add_line()だろ。

30 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 20:54:59 ]
>>26
中身は変わらないです。ごめんなさい。

>>28
「中身を変えようとして」エラーが出ているって認識で大丈夫ですかね?

すいません。もうちょっとがんばってみます。
ありがとう。



31 名前:21 mailto:sage [2008/03/25(火) 20:55:53 ]
>>27
とりあえず、ソースをあげてみました。
www.uploda.org/uporg1328399.txt.html
まだご指摘いただいた点直してない部分がありますが、一度見ていただけないでしょうか?
入力を終了する条件式は「.」のみが入力された場合です。
構造体の中身は
struct lines{
char *word;
struct lines *next;
struct lines *prev;
};
で、テキストエディタのようなものですので、リングにしてしまうと一行目が分からなくなるかなと?
と思っったのでリング型にはしませんでした。
変数は
char input_line[512];//文字を一時的に入れる配列
struct lines *buffer_pre,*buffer_fow;//挿入部分の前後のポインタを入れておくところ
int length,i;//文字列の長さを入れるlinegth、ループ様のi
struct lines *p;/mainから受け取った構造体のアドレスを保存するとところ
です。
>>29
えっと、名前の部分は戻り値ありの場合の指定ではないのですか??

32 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 21:20:17 ]
>>31
>構造体に内容を追加して、追加後のポインタを返してもらいたい
と書いてあるけど違うの?内容を追加するだけならvoidのままでいいけど。

33 名前:デフォルトの名無しさん [2008/03/25(火) 21:32:17 ]
>>32
あ、もちろん構造体に中身を追加して、その追加した部分のポインタを返してもらいたいです。
それをポインタのポインタを渡して、それに追加した部分のポインタの内容を代入して返すようにしたいです。

mainに現在の構造体のポインタの位置を表すポインタ「now」有。
nowのアドレスをポインタのポインタたるcurrentに入れてadd_lineに渡す。
add_lineの中でcurrentにそこで関数内でつくった構造体のポインタPを代入する。

呼び出す時は何行目に行を追加するかを表すnumと構造体のポインタのポインタ二つを渡して
add_line(num,now);//nowはmain中の構造体のアドレス
のようにしようと思っていました。
now=add_line(num,now);という様に関数の戻り値を使う場合のみ型を指定するのではないのでしょうか?

34 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 21:45:52 ]
[a][b][c][d][e] ってあった場合、num を 1 にした際には
<X> [a][b][c][d][e] ここに追加されて欲しいのか
[a] <X> [b][c][d][e] ここに追加されて欲しいのか
どっちなんだろう。

前者はこのリストの仕様だと面倒臭いよね。
特にリストの末尾に追加する際。

35 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 21:50:18 ]
空のリストに追加する際は常にこの面倒くさい状態になるから・・・

36 名前:21 mailto:sage [2008/03/25(火) 22:24:05 ]
>>34
学校の課題で、特定の行の後に追加する関数と、前に追加する関数が求められていて、
この関数は後に追加のほうなので、[a] <X> [b][c][d][e]に追加したいです。
もし0行目の後に追加(一番最初に追加)の場合は特定の行の前に文章を追加する関数に
移るようにします。
>>35
リングにしてしまうと最初の行が分からなくなってしまう気がします。
その場合は構造体の中に行番号を入れるしか思いつきませんでした。
ただX行からY行をZ行の後に移動などの処理の時に困る気がするのですが・・・

37 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 22:29:48 ]
>>36
ダミーのノードを1つ用意する。

ダミーノードの次のノードが最初のノードで、
ダミーノードの前のノードが最後のノード。

最初のノードの前のノードがダミーノードで、
最後のノードの次のノードがダミーノード。

ダミーノードがあると、
「〜の次に追加」 という関数にダミーノードを渡すと先頭に追加になり、
「〜の前に追加」 という関数にダミーノードを渡すと末尾に追加になる。

そして、一切の NULL チェックが不要になる(assert くらいはした方がいいと思うけど)。

38 名前:21 mailto:sage [2008/03/25(火) 22:42:57 ]
>>37
おぉ!なるほど!
確かに大量にあるNULLチェックが必要なくなります!
ダミーノードはmainのコマンドの入力→該当関数の動作というループが始まる前に
mainの中で用意しておけばいいんですよね?
その場合ダミーノードかどうかの判別は保持しておいたアドレスを使って
最初に戻るのなら
while(c = ダミーのアドレス){
    c=c->prev;};
とすれば出来ますよね?

あと、構造体のポインタへのポインタの使い方は

39 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 22:50:37 ]
引数に直接返すより戻り値から返した方が
自由度が高くてよい。

40 名前:21 mailto:sage [2008/03/25(火) 23:07:17 ]
>39
えと、X行からN行を入力テキストに置き換える、という関数の中で
X行とN行のアドレス、それを取り出すときに使ったX行からN行の
実際の行数のintを返す関数を用意したいと思っているのですが、
やはりそれは戻り値を一つに出来るよう更に小型化するしかないのでしょうか?



41 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 23:27:37 ]
複数の値を返さないといけない場合は、
値を返す用の引数を別個に用意するのが普通かな。

今の add_line の仕様だと、
struct lines * 型の戻り値を current に渡す、とかできないっしょ。

まあとりあえず、
>>21 のポインタへのポインタの使い方自体は間違ってないので、
変なのだとしたら他の所がおかしいんだと思うよ。

42 名前:21 mailto:sage [2008/03/25(火) 23:38:34 ]
>>41
色々教えていただいてありがとうございます!

とりあえず、
struct lines *add_line(int num,struct lines *current){
この様に戻り値を使って値を返すことにしました!

ただ、やはりポインタのポインタが疑問でして、
自分が書いたとおりであってるとすると、その前は
mainでポインタのポインタたる**pに*p=0、
構造体のアドレスはNULLということをしてるだけなのですが
この書き方がマズイのでしょうか?

あと、もう一つなのですが・・・値を返す用のの引数とは
関数の動作に必要な引数の他に、値をもらう用のポインタ変数を
用意するということでしょうか??

43 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 23:45:41 ]
ああ、もうソースが消えてるわ。
main 側はまだ見てなかったわ。

main 側では struct lines *p; として
add_line(num, &p); という形にすることになるはず。

>あと、もう一つなのですが・・・値を返す用のの引数とは
>関数の動作に必要な引数の他に、値をもらう用のポインタ変数を
>用意するということでしょうか??
そうなる。

44 名前:21 mailto:sage [2008/03/26(水) 00:31:31 ]
>>43
スイマセン、ソースは自動で消えてしまったみたいです・・・

main側では**pの様なものは宣言せずに、渡す時に&を使うのですね。

勉強になりました!ありがとうございました!

45 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 07:47:20 ]
struct Lines; /* typedefのための前方宣言 */
typedef struct Lines Lines;
typedef Lines * LinesPtr;
struct Lines { char *word; LinesPtr next, prev; };
LinePtr linesGetLast(LinePtr p) { if(p){ while(p && p->next) p = p->next; } return p; }
LinePtr linesGetFirst(LinePtr p) { if(p){ while(p && p->prev) p = p->prev; } return p; }
LinesPtr add_line(int num, LinesPtr current)
{
char input_line[512];
LinesPtr temp_lines = NULL;
while(fgets(input_line, sizeof(input_line), stdin) != NULL){
if(input_line[0] == '.' || input_line[0] == '\0') break;
temp_lines = malloc(sizeof(Lines)); /* エラーチェック省略 */
temp_lines->prev = NULL; temp_lines->next = NULL;
temp_lines->word = malloc(sizeof(char) * strlen(input_line) + 1);
strcpy(temp_lines->word, input_line);
if(current != NULL){
temp_lines->next = current->next; current->next = temp_lines;
temp_lines->prev = current;
if(temp_lines->next != NULL) temp_lines->next->prev = temp_lines;
}
current = temp_lines;
}
return temp_lines; /* 割り込み終了位置を返す */
}

46 名前:45 mailto:sage [2008/03/26(水) 07:49:39 ]
改行大杉長過ぎで二度怒られたわw >>45の続き、ってかコメント。

numの使い道が分からんかったのでやや違うかもしれんけど、
やりたいのは大体こんな感じ?(関数名はinsertとかの方が適切っぽい)
ソース見てないから断言できんけど、呼び出し元が渡すのはポインタでよさげ。
割り込み開始位置は呼び出し元の current->next を見る。
NULLで呼び出してる時は linesGetFirst(p) で。

ちなみに自分なら1つの独立した構造体を作る関数を別に作って
土台のリストと新しく作ったのを追加用関数に渡す形にするかな。
その方がどこに加えたいかの指定が楽になるし、
構造体に手を加えても作成用関数だけいじれば大体事足りるようになるので。

『ポインタのポインタ』はポインタをtypedefして独立した1つの型として見ると理解し易いかも。


47 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 15:22:26 ]
>>22
気になったので書き直してみた (処理速度的には不利だけど)
char MyStrMid( char buff[], const char string[], int pos, int len )
{
for(;pos>0 && *string;pos--,string++);
sprintf(buff, "%.*s", len, string);
return buff;
}

48 名前:デフォルトの名無しさん [2008/03/26(水) 18:58:32 ]
〜なら真を返すと、どういう意味かわかりません

49 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 19:38:27 ]
0以外の値。
例えば常に真を返す関数tがあったとしたら、次のコードは常にtを出力する側へ分岐する。
if (t())
{
putchar('t');
}
else
{
putchar('f');
}

50 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 19:39:51 ]
>>48
man コマンドとかマニュアル、ヘルプの読み方が分からないって事か?



51 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 21:35:01 ]
真=はい
偽=いいえ

で覚えとけ

52 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:18:49 ]
FIRフィルタをCで書くとどんなになりますかね?

53 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:22:24 ]
>>52
for(i=0;i<srcsize;i++){
dest[i]=0;
for(j=0;j<fltsize && i+j<srcsize;j++){
dest[i]+=src[i+j]*flt[j];
}
}

54 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:30:18 ]
>>52
コンボリューション演算をすればよろしい

55 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:39:26 ]
>>52
// srcsize == fltsize == destsize (==2^x)
src_freq=fft(src, srcsize);
flt_freq=fft(flt, fltsize);
for(i=0;i<srcsize;i++) dest_freq[i]=src_freq[i]*flt_freq[i];
dest=fft(dest_freq, destsize);

56 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:42:53 ]
入力した日は何曜日かを出したいのですが
どうしても曜日がずれて一日ずれて表示されてしまいます
どごが悪いのでしょう?
#include<stdio.h>

int main() {
int iyear,imonths,iday;
int sum,i;
int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char*cweek[7] = {"日","月","火","水","木","金","土"};
sum =0;
printf ("input (e.g. ****/**/**)\n>>");
scanf ("%d/%d/%d",&iyear,&imonths,&iday);
/*閏年の判定*/
for(i=1;i<year;i++){
if((year%4==0)&&((year%100!=0))||(year%400==0)){
sum++;
i++;
}
year--;
/*前月までの日数*/
for (i =0; i < imonths-1; i++) {
sum += m_array[i];
}
year++;
sum=sum+day;
//曜日の出力
printf("%s曜日",cweek[sum%7]);
return 0;
}
}


57 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:48:13 ]
>>56
それではコンパイルすらできませんが

58 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 23:45:44 ]
読んでないけど演算結果が0==月曜日とかってことないよね?

59 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 23:50:23 ]
ヒント:グレゴリオ暦で遡って行った場合、西暦1年1月1日は月曜日

60 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:45:01 ]
>>57
#include<stdio.h>
int main() {
int year,months,day;
int sum,i;
int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char*cweek[7] = {"日","月","火","水","木","金","土"};
sum =0;
printf ("input (e.g. ****/**/**)\n>>");
scanf ("%d/%d/%d",&year,&months,&day);

/*閏年の判定*/
for(i=1;i<year;i++){
if((year%4==0)&&((year%100!=0))||(year%400==0)){
sum++;
i++;
}
year--;

/*前月までの日数*/
for (i =0; i < months-1; i++) {
sum += m_array[i];
}

year++;

sum=sum+day;
//曜日の出力
printf("%s曜日",cweek[sum%7]);
return 0;
}
}



61 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:52:32 ]
>>60
あなたが手を加える前のプログラムに戻してみては?

62 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:08:24 ]
>>61
それだとできないことはないんですけど
別で作ってみたいなと思いまして・・・・

63 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:11:37 ]
>>62
まずはインデントをしっかりそろえてみ?
forがおかしなネストをしててループ変数iが破壊されてるぞ

64 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:23:55 ]
ファイルを読み込んで、構造体に入れて、それを表示させたいのですが何故か上手くいきません。
どこを直したらいいのでしょうか?
struct lines{
char *word;
struct lines *next;
struct lines *prev;
};
void main(){
char input_line[512],file_name[100];
struct lines *buffer_pre,*buffer_fow;
int length,i;
struct lines *p;
FILE *fp;
printf("*");
gets(file_name);


65 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:24:48 ]
if((FILE *)NULL==(fp=fopen(file_name,"r"))){
printf("can not open\n");
};
i=0;
while(i=0){
fgets(input_line,513,fp);
  if(feof(fp)){
break;
    };
  if(ferror(fp)){
break;
};
//前後のポインタの取得
buffer_pre=p;
if (buffer_pre == 0){
buffer_fow=0;
}else{
buffer_fow=0;
}
//領域の確保
p=(struct lines *)malloc(sizeof(struct lines));
length=strlen(input_line);
p->word=(char*)malloc(length+1);
strcpy(p->word,input_line);



66 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:25:19 ]
//リストの連結
if (buffer_pre == 0){
p->next=0;
p->prev=0;
}else if((buffer_pre != 0)&&(buffer_fow == 0)){
p->next=0;
p->prev=buffer_pre;
buffer_pre->next=p;
};
};
fclose(fp);
       while(p->prev != 0){
p=p->prev;
};
while(p != 0){
printf("%s\n",p->word);
p=p->next;
};
return;}

67 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:59:43 ]
何がどうなってどう上手くいかないのかくらい書いてくれ。
>fgets(input_line,513,fp);
なんで513なんだ?

68 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 02:02:39 ]
>while(i=0){
代入でいいのか?

>};
関係ないけど、なんですべてのスコープの後ろにセミコロンが?

なんか他にもつっこみたくなる要素が満載だぞw

69 名前:64 mailto:sage [2008/03/28(金) 02:19:59 ]
>>68
すいません、そこは「==」でした・・・
あとスコープの外側にはセミコロンはいらないんですね・・・

>>67
説明が足りなくて申し訳ございません・・・。

まず513ですが、一行の行数の最大値が512なので、NULL文字の分も入れて513にしてみました

問題点なのですが、「//リストの連結」という部分のすぐ下で読み込んだ構造体をつないでいきます。
その段階では構造体の現在のアドレスと現在の構造体の->prevのアドレスは正しく表示されるのですが、
ループを抜けた後、構造体のアドレスを一番最初に戻すために、       
while(p->prev != 0){
p=p->prev;
}
を実行しています。その途中でprevのアドレスがずれて、セグメント例外になってしまいます。


70 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 04:18:05 ]
>buffer_pre=p;



71 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 04:21:55 ]
>>69
ならinput_line[512]も513にしたら?

72 名前:64 mailto:sage [2008/03/28(金) 07:31:11 ]
>>71
あ、確かに。ありがとうございます。

>>70
pは関数が始まる時に0に初期化していて、
一列終わるごとにそのその構造体のアドレスがbufferf_preに
入るので間違っては居ない気がするのですが・・・


73 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:40:31 ]
>>63
見直してみましたがよくわかりません
どこのfor文なのでしょうか?


74 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:44:24 ]
>>72
>70

75 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:46:28 ]
>>73
あんたの節穴で見直すのではなく、インデントを揃えてみろ。
できればエディタで。

76 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:48:08 ]
>>73
/*閏年の判定*/
for(i = 1; i < year; i++){

/*前月までの日数*/
for (i =0; i < months-1; i++) {

どっちもi使ってるだろ?後者で上書きされてるだろう?


77 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 10:01:09 ]
>>72
>70で問題点が理解できないようじゃ、プログラムに向いてないだろ。
無意味で無駄な部分多すぎるし。

78 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 14:01:52 ]
p == NULLで初期化してwhile(i==0)にしたら動いたけど

79 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 20:20:18 ]
>>72,73
『間違っては居ない気がする』とかいってないで
デバッガでブレークポイント置いてステップ実行するなり
assert()とかprintf()とか入れて変数の状態を確認しようよ
見直すって眺めるのと違うんだけど

80 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 22:44:23 ]
#include <stdio.h>
void main()
{
int count;

for (count = 0; count < 5; count++) {
printf( "countは今%dです\n", count );
}
if(count==4){printf("正解です%dです\n",count);}
else{printf("残念");}

}

VC++2008でデバックしましたがなぜかこれが"残念"のほうが出力されます。
countは4だと思うんですがなにか間違えてますか?



81 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 22:45:30 ]
>>80
count の値を表示してみればいい

82 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 22:54:43 ]
>>81
forで5のprintfが実行されなくてもカウントは5になってるんですね
ありがとうございました

83 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 23:06:04 ]
count++のあとcount < 5を判断する

84 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 23:18:13 ]
>>82
つーか、5になったからループを抜けたんだよ。

85 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 11:28:37 ]
#include<stdio.h>
main(){
char a[80],b[32];
int ca(char *,char [],int *),i,n;
while(1){
printf("文字\n");
scanf("%s",a);
n=0;
ca(a,b,&n);
for(i=0;i<n;i++){
printf("%c ",b[i]);
}
printf("\n\n");
}
}
int ca(char *s,char t[],int *n){

int i;
while(*s){
for(i=0;i<*n;i++) if(*s==t[i]) break;
if(i>=*n){
t[i]=*s;
(*n)++;
}
s++;
}
}

nがどのようになっているのか理解不能です。
*n と nがどうなっているのか教えてください。

86 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 11:46:37 ]
どこが分からないのか言ってくれないとどうしようもない

1行ずつ追っていって、結果を紙に書いていくんだ
そうすればどこの行が分からないのかが分かる


87 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 11:48:09 ]
*nとn[0]が同じだってことは判っているのだろうか。

88 名前:85 mailto:sage [2008/03/29(土) 11:55:52 ]
8行目でn=0となっていて、20行目の*nの値はどうなるのでしょうか?


89 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 11:58:13 ]
最初は0だよもちろん。

90 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 11:59:10 ]
>>88
1になったらそれ以降増えない
whileにprint分入れて*nを出力したりとかして自力で知らべられるようにした方がいいよ

デバッガというものもあるし



91 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:01:51 ]
増えるだろw
aに入った文字列を一文字づつ取り出してbに格納、
既出の文字は無視、格納した文字の総数をnに入れてく関数だよ。

92 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:06:21 ]
>>91
馬鹿?

93 名前:85 mailto:sage [2008/03/29(土) 12:11:59 ]
ごめんなさい。理解できないみたいです。
まずfor(i=0;i<*n;i++)の*nは最初は0なんですよね?
だと繰り返さないような気がしてなりません。

94 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:13:29 ]
バカは>>90だろw

95 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:14:47 ]
>>93
そうです繰り返しません
そして次のif文はi が0 , *nが0なので真となり中身が実行されますが
その結果*n が1となりwhile(*s)の次の回では実行されません
そのままなにもしないままwhile文が回り続けて終了です

96 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:16:18 ]
>>90=95?
でたらめ書く前に実行してみたら?

97 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:19:18 ]
>>96
お前がやれよアホ

98 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:30:41 ]
a[]は入力した文字列、b[]はその文字列から重複した文字を抜いた文字列、
nはb[]の文字数になる。

99 名前:85 mailto:sage [2008/03/29(土) 12:36:35 ]
aaaと入力したときを考えると
for文はi=0,*n=0だから繰り返さないで次のif文にいき
実行されてt[0]にaが代入され、*nの中身がプラス1されて*n=1となって、2番目のaに移る。

for文はi=0,*n=1だから一回繰り返されてif文で*s=t[0]ならbreakで打ち切りされて
次のif文でi=0,*n=1だからだめで3番目のaに移る。

見たいな感じでいいんですか?

100 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:41:02 ]
そうだね。



101 名前:85 mailto:sage [2008/03/29(土) 12:43:11 ]
すみません。ちょっとだけ理解できたようです。
みなさんありがとうございます。

102 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:43:54 ]
要するに、
forは文字(*s)がtの中で既出かどうか探している。
次のifは、既出でない場合に条件が成立し、
tに文字(*s)を追加。
*nはtに格納した文字数だよ。

103 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:46:57 ]
春になると90みたいなキチガイが湧くんだなw

104 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:49:40 ]
>>102
nは文字数なんですね。
あとnは*nとする必要もないですよね?

105 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:51:20 ]
main関数内のnとca関数内の*nは別物。
できれば違う変数名にした方が混同しなくていいと思うけど。

106 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:58:19 ]
>>105
main関数内のfor文のnはca関数内の*nの値が入るのですよね。

107 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:58:45 ]
>>104
>あとnは*nとする必要もないですよね?
必要ないと思うならそう書き換えてコンパイルしてごらん。

108 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:59:41 ]
yes

109 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 13:05:09 ]
>>107
文字がでなくなった。
なんかもう頭がこんがらがってきた。
ポインタって難しいんですね・

110 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 13:15:01 ]
>>109
難しいといわれてるが一度理解するとそうでもなく、
プログラミングする上でこの上なく便利な機能だ。
めげずに落ち着いて頑張るといいよ



111 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 13:19:28 ]
プログラム書くときはなんか本とか見ながら書いてますか?

112 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 13:19:39 ]
この場合型が違うのに変数名を同じnにしてるのが混乱のもとじゃね?

113 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 13:22:01 ]
>>109
caの中のnは、mainの中のnを指して(ポイントして)いる。
caの中の*nという表記は、mainの中のnを読んだり書き換えたりしている。

114 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 13:22:53 ]
無理に引数で渡さなくても
int ca(char *s, char t[])
{
int i, n = 0;
while(*s) {
for(i=0; i<n; i++) if(*s==t[i]) break;
if(i==n) {
t[i] = *s;
n++;
}
s++;
}
return n;
}
にしてmain内でn = ca(a, b)ってすればまだ分かりやすいのに。

115 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 13:31:58 ]
>>111
日本語書くときはなんか辞書とか見ながら書いてますか?
という質問と同じに聞こえる。

116 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 13:56:40 ]
>>113
なるほど、わかりました。
なんとなくですが>>

>>114
たしかにそのほうがわかりやすそうです。

117 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 15:08:02 ]
>>115
言い得て妙 だな

118 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 15:19:06 ]
2chの書き込みくらいでは辞書なんて引きません。
でも、ちょっとまじめな文章を書くときには、国語辞典を引きます。

119 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 15:35:24 ]
日本語に例えるのは上手くないような・・
英語だとしっくりくる

120 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 17:17:22 ]
正解はこれな
日本語しかわからないあなたがフランス語を書くときに辞書無しで書けますか?



121 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 19:29:42 ]
>>111
時々リファレンスみる程度。初心者でなければコピペとかないから。
そう意味できいてるなら真面目に勉強してください。

122 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 22:47:33 ]
ポインタについて質問です
整数型とint ポイント型の違いがわかりづらいのですが
ポイント型はアドレスを格納できて整数型はアドレスを出力するだけですか?

123 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 22:57:35 ]
>>118
そんなもんだろ。だいたいは頭に入ってるから空で書ける。
細かい仕様(引数の順番とか関数の戻り値とか)が必要になったらネットなり書籍なりで確認して書く。

124 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 23:09:18 ]
>>122
変数からアドレスを求めるのはアドレス演算子&。
整数型はアドレスを出力するだけというのはなんか変だ。


125 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 23:09:35 ]
>>122
int*はint型の変数のアドレスを格納する変数

int x=50;
int *xp = &x;

この時、printf("%d",*xp) と printf("%d",x) は50を表示し、
printf("%p",xp) と printf("%p",&x) はxのアドレスを表示する

126 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 23:46:54 ]
>>124
アドレスを変数に格納せず&で出力ができるという感じですか?
>>125
printf("%d",*xp)が50を表示するというのが難しく感じるところです
*xpという箱は整数型で宣言されそこには&xというアドレスが代入される
となるとprintf("%d",*xp)ではアドレスが出力されると考えてしまいます。

127 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 23:50:00 ]
変数はあくまでxp

128 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 23:59:29 ]
なんとなくわかりました
*xpはアドレスを格納する変数
だからprintf("%d",xp)だとそのままアドレスを出力
printf("%d",*xp)はわざわざ*をつけてるから逆にデータのほうを表示する

129 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 00:26:12 ]
2行目の「*xp」は「xp」ね。それ以外は大体その認識でOK

130 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 09:26:32 ]
そうかな、なんか危ういきがす



131 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 10:37:35 ]
int *xp = &x;
これと
printf("%d", *xp);
これの「*」の意味が違うことに>>128は多分気付いていない。
同じ文字を逆の意味の2つの演算子に使うという、C言語の糞仕様のおかげだな。
「ポインタ宣言子」と「間接参照演算子」の違いね。

そもそも初心者に教えるときに、
int *xp = &x;
では混乱が起きる。

int *xp;
xp = &x;
上のように書いてやらないと
int *xp = &x;
  ↑
意味的にはここで切れていることに、初心者は気がつかない。

132 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 11:40:43 ]
>>131
「int* xp」と書いた方がわかりやすいかな。
「int*」が変数の型(intへのポインタ型)、xpが変数名。

133 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 11:56:25 ]
int* xp, x

134 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 12:05:48 ]
>>133
C言語のダメなところだよね。「int *」が型なのに、宣言は個別に「*」を付けなきゃいけないなんて。
複数の変数を1行で宣言できることがそんなに重要なんだろうか。

135 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 12:17:50 ]
int i, *p, (*f)();

136 名前:122 mailto:sage [2008/03/30(日) 15:44:32 ]
printf("%d",*xp)というのは間接参照演算子というポインタ変数の機能なんですね
まだそれは勉強してませんでしたがおかげでわかりました

ポインタの練習用プログラムを見てどう出力されるかはわかるようになってきました
ありがとうございました

137 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 19:28:11 ]
typedef struct
{
int Number;
}DATA , *PDATA;
int main()
{
DATA data;
PDATA pdata;
data.Number = 10;
pdata = &data;
printf("%d",pdata->Numer
}
*PDATAはポインタ型を作っているという解釈でよろしいんでしょうか?
ちなみに
typedef char *PCHAR;を書くと
sizeof(char) == 1
sizeof(PCHAR) == 4
になってました。


138 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 19:38:53 ]
>>137
そのとおり。
DATA*とPDATAが同じ。
char*とPCHARが同じ。

139 名前:137 mailto:sage [2008/03/30(日) 20:06:28 ]
>>138
ありがとうございます。

140 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 04:46:11 ]
戻り値の最上位ビットが 1 のときはAを、0 のときはBを示す関数、REABがあるのですが、
if(REAB() < 0) //Aの時
となるのは何故なんですか?



141 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 04:48:39 ]
2の補数の場合はそうなる
あとはぐぐればすぐ分かる

142 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 04:53:28 ]
最上位ビットが1なら負の数になるんですね
ありがとうございました

143 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 12:22:07 ]
>>142
Cの規格上は必ずしもそうなると言う保証はない点に注意。
そもそも、「最上位ビット」に意味があるのだからきちんと最上位ビットをチェックするロジックを書くべき。
# 処理速度などを睨んで改変するのは二の次三の次。

144 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 19:31:48 ]
>>143
符号つきで最上位ビットが 1 の場合は負ってのは規格で保証されてなかったっけ?
その制限の中でどういう負数表現をとるかは環境依存だけど。

145 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 02:35:47 ]
>>144
REAB()の戻り値がsignedなんて、どこにも書かれていませんよ。


146 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 03:03:58 ]
例えば極端な話、戻り値がcharだったらコンパイルオプションでsignedかunsignedか切り換えられるかも知れない。
だとすると、signedのときは正しく動いてunsignedのときは(エラーも起こさず)正しく動かないことになる。
>143ではないが、先ずはそれに頼らないコードを書いた方がいいとは思う。

147 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 07:32:19 ]
やらない方がいい事は確かだけど、
結局規格ではどうなってるんだ?

148 名前:デフォルトの名無しさん [2008/04/01(火) 08:40:35 ]
>>144
規格で決まってるのは、符号ビットが1ビットあることだけじゃなかったっけ?

149 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 12:29:56 ]
FIRフィルタのプログラムで浮動小数点演算を使わずに実装
したいのですが、普通係数hnは浮動小数点ですよね。
入力のadは24ビットで係数hnを32768倍して固定小数点にして
最後に32768で割ろうとしたのですが、hn[k] * xn[k]の部分で
オーバーフローの可能性がでてきます。
回避するよいやり方はないでしょうか?

#define ORDER_2 50
static double xn[ORDER+1];
long firFilter(long ad)
{
long yn, acc;
int k;

xn[0] = ad;

acc = 0.0;
for (k = 0; k <= ORDER; k++) /* multiply and accumulate */
acc = acc + hn[k] * xn[k];
yn = acc;
for (k = ORDER; k > 0; k--) /* shift input samples */
xn[k] = xn[k-1];
return yn; /* output */
}

150 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 12:34:30 ]
>>149
コンパイラによるけど long long を使うとかは?



151 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 12:55:46 ]
・32768倍をやめて1024倍とか256倍とかで妥協する
・long long intを使う
・素直にfloatを使う

例えばx86でSSE2が使えるなら、巧く書けばベクタ化できるから下手すりゃ整数で小細工するより速いよ。

152 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 13:53:13 ]
dest.txtの内容
[abcdefgabcdefg]
HANDLE hFile;
BOOL bVal;
DWORD numOFRead;

hFile = CreateFile("dest.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,0,0);
DWORD dwSize = GetFileSize(hFile,NULL);
char *file_buffer = (char *)calloc(dwSize+1,sizeof(char));
if(file_buffer == NULL){
return -1;
}

bVal = ReadFile(hFile,file_buffer,dwSize,&numOFRead,0);
if(bVal == 0){
return -1;
}
CloseHandle(hFile);
dest.txtの中のfgという文字列をajkoに置き換えてファイル生成したいんですが、
どうすれば出来ますか?

153 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 14:25:42 ]
system("sed -e 's/fg/ajko/g' dest.txt > foo")

154 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 14:40:13 ]
apple
test
hello

と言うテキストを
String[ ][ ]

の様な2次元配列で読み込みたい場合、
Stringの確保はどのようにすればよいのでしょうか?

155 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 14:57:03 ]
Stringって何よ?
ここはCのスレだけど、C++かC#かJavaか何かと間違ってやしませんか?

156 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 15:13:53 ]
char String[][]の積もりだろ。

>>154
文字列長に制限があってよければ、例えば
char String[][10] = {"apple", "test", "hello", };

可変長にしたいとか、そもそも文字列も可変個数だと言うのなら、ポインタのポインタを使うことになる。
まぁ、入門サイトでも探してくれ。それで判らなければ出直してくれて構わんから。

157 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 15:23:36 ]
>>155
済みませんでした。

>>156
ありがとうございました。

158 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 15:45:25 ]
>>153
それは何ですか?

159 名前:デフォルトの名無しさん [2008/04/01(火) 19:53:37 ]
>>153について誰か教えて下さい。

160 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 20:12:44 ]
Stringは型の名前にあるからねえ
俺は文字列変数名にstrやsを使う

>>159
sedプログラムに3つの引数-eと's/fg/ajko/g'とdest.txt を渡して呼び出す
sedプログラムが標準出力したメッセージはfooというファイルに書き込む
かな?
sedの質問があれば正規表現スレでどうぞ



161 名前:デフォルトの名無しさん [2008/04/01(火) 20:45:25 ]
すみません。
私Windowsです。

162 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 21:00:44 ]
私はIRIXです

163 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 21:12:58 ]
Windows でも Cygwin とかある

164 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 21:15:01 ]
これを愛用している
ttp://www.vector.co.jp/soft/win95/util/se015016.html

スレチだが

165 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 18:36:45 ]
曖昧な質問で悪いのですが、

picをはんだして、モーターとリモコンに繋げなければなりません。

そういった用途のc言語プログラムというのはどこで拾えばよいのでしょうか?

166 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 19:40:13 ]
宿題なら先生、仕事なら先輩。

167 名前:デフォルトの名無しさん [2008/04/02(水) 20:52:03 ]
>165
自分の文章を読み直してみろ
その文章で何を言ってるか理解できるか?



168 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 20:55:38 ]
>>167
きっとロボット制御して半田付けするってことだ
で、ロボット制御するためのc言語プログラムというのを探している


169 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 20:57:00 ]
>>165
導線と半田を用意して、こてで溶着すればいいんじゃない?

170 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 21:05:38 ]
位置独立コードの事かと思ったよ。



171 名前:デフォルトの名無しさん [2008/04/02(水) 23:09:20 ]
Cである一定のstate数ループさせる方法ってあるんけ?


172 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:20:25 ]
state数って何よ、asm("NOP") * nってこと?

173 名前:fxで裁判中。教えて [2008/04/03(木) 08:28:12 ]
外国為替証拠金取引会社のアトランティックトレードと裁判になりました。

裁判の内容をここに記してみました
システム障害等でくわしいかた、是非とも情報をお待ちしております。よろしくお願いします。
members3.jcom.home.ne.jp/chaochu/


174 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 10:49:25 ]
なかなかの魚拓が取れたみたいなので、ここに置いておきますね。
ZDNet Japan builder「C/C++のポインタの機能--参照渡しののような処理」
s03.megalodon.jp/2008-0328-1911-56/builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255,00.htm

オリジナルは
builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255,00.htm


175 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 11:20:59 ]
すげえバカだw
そういやこの筆者と似たようなことぬかしてたヤツが宿題スレでボコボコにされてたな。

176 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 15:25:56 ]
あちこち同じリンク張るな。いい加減うっとおしい。

177 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 17:55:05 ]
全く無知な人間が
C言語をマスターするにはどれくらいの時間がかかりますか?

178 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 17:58:15 ]
>>177
物覚えの良い人ならそれだけ早いだろうし
やる気によっても左右される
マスターがどれくらいの事を言ってるのかもわからない

179 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 18:10:47 ]
僕もマスターしたという基準がよく分からないのですが
C言語の試験とか資格ってのはあるんですか?

180 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 18:19:43 ]
聞いたことないし、あったとしても役立たないものであることは確かだな。
著名なプログラマが資格を持っているなんて話、聞いたことがない。



181 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 20:58:04 ]
最低限の足切くらいはできるんじゃないか?
Fizz-Buzz みたいにw

使えないやつが暗記してくるのは見破れないけど
暗記すらできないやつなら落とすことができる
使えるやつは暗記する必要もない、と

182 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 21:02:56 ]
そのレベルのcの資格なら存在しているな

183 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 22:36:16 ]
>>177
参考書と問題集何冊か買って受験勉強並みに真剣に勉強すれば3ヶ月くらいで
1000行程度のフリーソフトが作れるくらいにはなる。マスターとは程遠いけどね…


184 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 23:50:20 ]
うちは1プロジェクト数万行レベルの組み込みCなんだが、全く無知の人間がきたとして
作業要員に換算できるレベルに1〜3か月ってとこかな?
PCに慣れているかどうかでかなり変わるとは思うが。

185 名前:デフォルトの名無しさん [2008/04/04(金) 17:44:31 ]
コンパイラの使い方がわかりません。
例えばtest.cppをVC++でコンパイルするとして
cl.exe D:/test.cpp
と実行してもコンパイルは出来るのですが、
どこにプログラムが作られているのかわかりません。
プログラムの保存先はどのように指定すればよいのでしょうか?

186 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 17:55:02 ]
cl.exe /help
と実行すれば、指定できるオプションの一覧が出る

187 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 19:21:06 ]
>>185
カレントディレクトリに実行ファイルができているんじゃないかな。


188 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 22:45:35 ]
#include <stdio.h>
int main(void)
{
char str[2];
scanf("%s",str);
printf("%c %c\n",str[0],str[1]);
return 0;
}

これをVC++で実行しました。
EOSを考慮して01という2桁の入力をすると結果は0 1と正常な結果なんですが
なぜかデバックエラーがでてしまいます。
なにが問題なんでしょうか

189 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 22:48:49 ]
char str[3];

190 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 22:49:34 ]
>>188
\0 が入る余地がない



191 名前:188 mailto:sage [2008/04/04(金) 22:57:33 ]
0から始まるから[0]と[1]に文字が入って[2]に\0が入るんじゃないんですか?

192 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 22:59:12 ]
char str[2];
これだと二文字分の領域しか確保した事にならない

[0] = '0';
[1] = '1';
[2] = '\0';

の3Byte必要

193 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 23:00:24 ]
>>191
str[2]を使うなら、char str[3];で定義しないとダメ。

194 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 23:03:32 ]
添え字が0から始まる事と、配列の要素数は別

char str[0];

と書いても1文字分確保されるわけじゃない

195 名前:188 mailto:sage [2008/04/04(金) 23:13:06 ]
今char str[0];で宣言してみたらサイズが0の宣言は無効とでました。
なるほど、てことはchar str[1];だと1文字が入るサイズってなわけですね。
皆さまありがとうございました。

196 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 23:32:33 ]
>.188
慣れてしまえば、なんでもないことなんだが。
Cの初心者が最初につまずく問題であることは確か。

1.文字列を格納する文字配列は、文字列の最後の\0分も含めて確保しなければならない。
2.配列を定義するときの添え字(char str[3]の3)は、配列要素の数であり、どこまで使うかではない。

197 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 23:34:24 ]
追加
3.Cの配列の添え字は0オリジンである。

198 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 00:13:30 ]
すみませんCの質問とは若干異なるかもしれませんが
「JmEditor2」を使用していて下パネルで
『cファイルをコンパイルして作ったexe』を実行したときに
[scanf]などの入力を必要とする操作部分が実行できません
解決策を知っている方がいればお願いします

コマンドプロンプトから同じexeファイルを実行したところ問題なく動きました

199 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 00:32:38 ]
JmEditor2のヘルプには入力できるって書いてあるんですか?
それと若干じゃなくて大幅にスレ違いです。

200 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 02:37:46 ]
いいえ、スレ違いではありません。鼬害です。



201 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 06:19:59 ]
>>198
「ツール」メニューの「コマンド実行」を使う。

下パネルから実行したとき、子プロセスの標準出力がうまく表示されない。
プロセスが終了するまで、子プロセスの標準出力の内容が表示されないようになっている。

202 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 15:08:33 ]
そして板違いの指摘の後にレスする馬鹿。

203 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:37:05 ]
>>201
ありがとうございます。

>>他
すみませんね、住人さん。自治会お疲れ様です。

204 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 01:47:50 ]
#include <stdio.h>

main()
{
char ss[80];

gets(ss);
puts(ss);
}

文字を80文字以上入力しても、全ての文字が表示されるんですか
何故80文字以上gets()で読み込んでputs()で表示する事ができるのでしょうか

205 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 01:51:04 ]
ss のサイズが 80 までなんて gets は全く知らないから
メモリを破壊してどんどん文字を保存していってしまう。
非常に危険。
gets は使っちゃダメ。代わりに fgets を使うべし。

206 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 01:51:05 ]
オーバーフローした場合の動作は未定義だから。

207 名前:204 mailto:sage [2008/04/06(日) 02:01:05 ]
なるほど!理解できました
ありがとうございます。

208 名前:デフォルトの名無しさん [2008/04/07(月) 10:07:03 ]
任意のURLからファイルをダウンロードしてくるプログラムを作ったのですが、(マルチスレッド+Winsock)
一回のダウンロードごとにメモリ使用量が5〜30KBずつ増えていきます。
動的な確保は行っておらず、
何故増えていくのかがわかりません。
この場合の考えられる原因を教えて頂きたいです。

209 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 12:21:08 ]
動的な確保を行っているから。mallocだけが動的確保じゃない。APIの呼び出しも動的確保になる場合がある。

210 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 12:29:59 ]
Release〜しないといけない所を忘れてるとか。



211 名前:デフォルトの名無しさん [2008/04/07(月) 15:08:26 ]
なるほど…盲点でした。
もう一つお伺いしたいのですが、
グローバル変数はあまり使わないほうがいい、
という事を聞いたので
URL名
SERVER名
PATH名
ディレクトリパス
を保つ構造体をmain内で宣言したのですが、
自作関数の引数をあちこち増やさなければいけなくなりまして…
これってまずいですか?
一般的に言われる汎用な関数とはどんな関数なのですか?

212 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 15:12:18 ]
よくわからないけど通りすがりにレスすると
その構造体というかメンバ変数を持つクラスで管理すればいいんじゃないの?

213 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 15:20:04 ]
C++じゃなくてCだから困ってるんじゃ

214 名前:デフォルトの名無しさん [2008/04/07(月) 16:16:50 ]
はい。Cです。

215 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 16:18:59 ]
>>211
プログラムの性質も作りも判らないからなんともいえないけれど、main()から構造体のポインタを順次下請け関数に渡すだけでしょ。
最下層にまで届ける必要はないはずだし、普通はあんまり問題にならないと思うけど。

216 名前:デフォルトの名無しさん [2008/04/07(月) 16:25:50 ]
>>215
main内で構造体を宣言することって
よくあることなんですかね?

217 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 16:30:34 ]
>>216
何も問題はないよ。


218 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 16:33:13 ]
あ、Cのスレだった・・・すまん
多用しなければグローバル変数にした方が色々と便利&バグを生まない事もあるよ
その構造体1つだけとかならグローバルにしちゃうのがいいと思う

219 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 17:51:09 ]
>>216
OKだよ。
構造体のポインタをがんがん渡していけばいい。
複雑になったら、そのとき単純にする方法を悩めばいい勉強になる。

220 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 18:58:34 ]
全てのグローバル変数を、実体名"Global"で構造体にまとめると、
Global.totalとか、Global.countとか一目瞭然で便利。
って、物の本に書いてあった。一理あると思った。



221 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 19:01:01 ]
そんな方法があったか

接頭句を「g_」にするより分かりやすいな

222 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 19:38:52 ]
>>220
カテゴリー別に分けて構造体にして、わかりやすい名前をつければ尚良い。
グローバル変数依存からの脱却の第一歩だ。



223 名前:デフォルトの名無しさん [2008/04/07(月) 20:20:03 ]
C言語を作れて表示できる無料のソフトはないですか?

224 名前:デフォルトの名無しさん [2008/04/07(月) 20:20:44 ]
C言語を作るとな?

225 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:30:38 ]
>>223
cygwin とgcc
visualstudio
bcc
好きなのを選べ
おすすめはしないが
LSI Cというのもある

226 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:30:47 ]
Windows上で動く無償のCコンパイラ、とエスパーしてみると、いくつかある。

Visual C++ 2008 Express Edition
www.microsoft.com/japan/msdn/vstudio/express/

C++Builder
www.codegear.com/jp/downloads/free/cppbuilder

「C++」と書いてあるが、C言語のソースのコンパイルもできる。
他にcygwinとか。


227 名前:デフォルトの名無しさん [2008/04/07(月) 21:24:45 ]
>223
読み直してみろ
「C言語をつくれて」
これおかしいだろ

C言語という言語をつくるのか?

人にまともな説明すらできないやつはプログラム組むの無理だからあきらめろ




228 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 21:27:09 ]
入門編なんだから大目にみてやれよ

そこまで攻撃する意図がわからんよ

229 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 22:38:23 ]
逆に、
このくらいエスパーできないやつはここで教えるの無理だからあきらめろ
とも言える

230 名前:デフォルトの名無しさん [2008/04/07(月) 23:33:14 ]
初心者です。意味がわからないかも知れませんが質問させてください。
配列なんですがaの添字に代入されてる数字をそれぞれbに該当するところに
転送する場合どうなりなすか?
例でいうとaの0番目にある3をbの3に入れるということです

a[0]=3 b[0]=0
a[1]=4 b[1]=1
a[2]=0 b[2]=2
a[3]=5 b[3]=3
a[4]=1 b[4]=5



231 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 23:36:11 ]
for(i = 0; i > MAX; i++)
b[a[i]] = a[i];

232 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 23:36:16 ]
mixiに、タブは機種依存文字と言い張る基地外が現れる。


233 名前:231 mailto:sage [2008/04/07(月) 23:37:50 ]
不等号逆だった

234 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 23:38:22 ]
a[0]〜a[4]とb[0]〜b[4]
の全部の例を書いてみてくれ

235 名前:230 mailto:sage [2008/04/07(月) 23:49:03 ]
すいません訂正です。
a[0]=3 b[0]=0
a[1]=4 b[1]=1
a[2]=0 b[2]=2
a[3]=2 b[3]=3
a[4]=1 b[4]=4

a[0]=3→b[3]=3
a[1]=4→b[4]=4
a[2]=0→b[0]=0
a[3]=2→b[2]=2
a[4]=1→b[1]=1
に同じ番号のところに転送するにはどうするかという意味です

236 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 23:49:15 ]
>>230

やっぱり言っている意味がわからん。

>例でいうとaの0番目にある3をbの3に入れるということです

b[3] = a[0];
ということだよね?と考えると、一瞬 >>231 (不等号を逆にして)でいい気がするが、
a[3] はどうするの?


237 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 23:51:26 ]
>>235
結局は
b[i]=i;
になるんじゃないの?

238 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 23:52:35 ]
>>235

「転送する」の意味がわからん。
b[0]〜b[4]には元々値が入ってるんでしょ?
並びを
b[3]=3
b[4]=4
b[0]=0
b[2]=2
b[1]=1
としたって、配列の中身は
b[0]=0
b[1]=1
b[2]=2
b[3]=3
b[4]=4
と変わらないよ?


239 名前:230 mailto:sage [2008/04/08(火) 00:01:45 ]
ん〜なんと説明していいか…如何せん素人なもんで
aの0にある数字3をbの同じ3番目に当てはめる?
にはどうするかってことです。
同じくaの1にある数字4をbの4に当てはめるってことです

あの聞いといてなんですけど意味不だったらスルーしてください

240 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:09:33 ]
素人とかの問題じゃないんだけどな
1回自分で全部代入してみてbの中身全部表示してみると分かると思うけど
b[0] = 0 b[1] = 1 b[2] = 2... となるだけ



241 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:10:35 ]
>>239
暗号化がしたいのかな?

242 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:15:32 ]
>>239
結局>>231>>237でいいような気がするが。

あと>>235が「配列bの添字の順番を換えたい」と言っているように思えるので、
一応、それは無理だと言っておく。
そもそも添字というのは「i番目」というような順番を示すものなので、
変更は不可能だ。

わかってるってんだったら、失礼。

243 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:33:18 ]
b[0] = A, b[1] = B, b[2] = C
とあったものを、
a[0] = 1, b[1] = A
a[1] = 2, b[2] = B
a[2] = 0, b[0] = C
== b[0] = C, b[1] = A, b[2] = B
にしたいってことかしらん?
aの中身をbの添字にした時、正しい文字が現れるようにしたい、みたいな。


244 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 09:38:29 ]
>>230
代入は上書きコピーのこと。転送とまちがえてはいけない。

245 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 12:33:58 ]
>>230
何が目的なのかも書き込んだほうがいいんじゃない?
あんたのコード例から目的が推察できないのでみんな
首ひねってるんだと思うよ。

246 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 16:51:01 ]
#include <stdio.h>

int main(void)
{
int n1, n2;
int per;

puts("二つの整数を入力してください。");

printf("整数 A:"); scanf("%d",&n1);
printf("整数 B:"); scanf("%d",&n2);

per = n1 / n2 * 100;

printf("Aの値はBの%d%%です。\n",per);

return (0);
}


実行結果を
2つの整数を入力してください。
整数A:50
整数B:100
Aの値はBの50%です。

と、したいのですが↑のプログラムじゃ動いてくれません;;
「Aの値はB の0%です。」
となってしまいます;;

何故でしょうか?

247 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 16:52:09 ]
intは整数型だよ

248 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 17:05:41 ]
50/100 = 0
0*100 = 0

249 名前:デフォルトの名無しさん [2008/04/08(火) 18:38:07 ]
>>246
整数型の計算は、コンピュータでは1より小さい結果になると
答えがゼロになるんだよ。なぜかといわれても、そういうもの
だと思ってくれ。

回避する方法は色々あるが、とりあえず

per = n1 * 100 / n2;

にしたらいい。理由は自分で考えてね。

250 名前:デフォルトの名無しさん [2008/04/08(火) 19:45:39 ]
ファイルを読み込み解析したいのですが、

char *buf = FileRead(file_path);

Kaiseki(buf);
free(buf);
または
Kaiseki(file_path);
にするか悩んでいます。
FileRead関数内で動的にメモリを確保して
確保した領域をKaiseki関数に渡し解析するか、
Kaiseki関数内にファイルへのパスを渡して
読み込み、解析をKaiseki関数内で行うか、
どちらが良いと思われますか?



251 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 20:13:45 ]
inspect関数かinvestigation関数でやるのがいいと思うよ
マジレスすると場合によるからどっちともいえない

252 名前:デフォルトの名無しさん [2008/04/08(火) 20:21:43 ]
>>251
どのような場合があるのですか?

253 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 20:42:23 ]
5P3
順列の総数を求めるプログラムを教えてください
考えすぎて頭が痛くナリマスタ
よろしくオナガイシマス

254 名前:デフォルトの名無しさん [2008/04/08(火) 21:09:06 ]
>>250

255 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 21:12:34 ]
>>253
オーバーフローとか一切考えなければ
5!を3!で割るだけじゃんww
なにが分からないの?w

256 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 22:20:03 ]
>>253
ほらよ。
#include <stdio.h>
#include <math.h>

double npm(int n, int m) {return tgamma(n + 1) / tgamma(n - m + 1);}

int main(int argc, char ** argv)
{
printf("%g\n", npm(5, 3));
return 0;
}

257 名前:246 mailto:sage [2008/04/08(火) 22:30:13 ]
>>247-249
ありがとうございます。

258 名前:デフォルトの名無しさん [2008/04/08(火) 22:31:58 ]
>>252
>>252
>>252
>>252
>>252
>>252

259 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 22:32:53 ]
T lPr(T l,T r){T r=1;for( T i=r+1; i<l; i++){ r *= i; } return r;}

260 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 22:34:25 ]
>>259
おいw



261 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 22:48:02 ]
バグがあるな。

262 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 23:08:45 ]
>>256
そのままコンパイルすると
error C3861: 'tgamma': 識別子が見つかりませんでした
なのですが?

263 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 23:50:07 ]
まともなCコンパイラを使ってください。

264 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:31:35 ]
5! / 3! って結局 5 * 4 だろ?
一旦階乗求めるよりh(ry

265 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 21:23:09 ]
hの続きは何だよ

266 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 21:26:20 ]
// オーバーフローしにくいように書いてみた
#include <stdio.h>
#include <stdlib.h>
int gcd(int a, int b){
int c;
while((c=a%b)) a=b, b=c;
return b;
}
int mPn(int m, int n){
int t, u=1, l=1;
if(m<1 || n<1 || m<n) return 0;
if(m-n<n) n=m-n;
for(;n>0;n--,m--){
l*=n;
t=gcd(u, l);
l/=t;u/=t;
t=gcd(m, l);
l/=t;u*=m/t;
// printf("m=%d n=%d [%d / %d]\n", m, n, u, l);
}
return u/l;
}
int main(int argc, char *argv[]){
int m, n;
if(argc!=3) return 1;
m=atoi(argv[1]);
n=atoi(argv[2]);
printf("%dP%d=%d\n", m, n, mPn(m, n));
return 0;
}

267 名前:デフォルトの名無しさん [2008/04/09(水) 21:42:27 ]
定番のhello worldがなぜか実行されない。。。

#include <studio.h>

int main(void)
{
printf("hello, world\n");

return 0;
}

エラーE2209 sample.c 2: インクルードファイル 'studio.h'をオープンできない
警告 W8065 sample.c 6: プロトタイプ宣言のない関数 'printf'の呼び出し(関数 main)
*** 1 errors in Compile ***

と、何度試行を繰り返してもなります;
このエラーをどう訂正していいのかわからない超初心者です。
設定などもチャート通り何度もやり直しましたが、上手くいきません。
よろしくお願いします。

268 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 21:47:43 ]
studio......

269 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 21:48:54 ]
standard I/Oな

270 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 21:48:55 ]
エラーで気付や



271 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 21:49:17 ]
あるあるww

272 名前:デフォルトの名無しさん [2008/04/09(水) 22:03:37 ]
DWORD gdw1;
DWORD gdw2;

gdw1 = timeGetTime();
//処理
gdw2 = (timeGetTime()-gdw1);
printf("%d",gdw1);
としても毎回計測するごとに処理時間が増えているのですが、
何故なのでしょうか?

273 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 22:07:55 ]
質問の意味がよく分からんが
purintfにgdw2を渡すべきなんじゃない?

274 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 22:08:49 ]
gdw2を表示したいんじゃないの?

275 名前:デフォルトの名無しさん mailto:age [2008/04/09(水) 22:20:14 ]
Cのみだったのでこちらで質問させていただきます。
現在、下記のような感じでプログラムを作ってるのですが、
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6212.txt
2つ問題があり、
@入力していくと次の配列まで入力されてしまう。
A2つ目のエラー仕様をどこでどう記述していいのか。
初歩的なことで、無駄な文が多いかもしれませんがよろしくお願いします。
また、こうすればもっと判りやすくできるなどあったら教えて欲しいです;

276 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 22:54:48 ]
>>275
「次の配列」が何を指しているのか判りませんが、一文字ずつ入力してチェックするのは標準入力では無理があるかと。
普通に1行入力してから、解析する方がたぶんましです。

277 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 22:55:24 ]
>>275 A
....
break;
}
}
if((cnt <= 0) && ((c == '-') || (c == '\n'))) {
printf("エラーメッセージ");
exit(1);
}

if(x == 1){
.....


278 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:10:17 ]
>>275
>また、こうすればもっと判りやすくできるなどあったら教えて欲しいです;
うまく関数化しよう。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int absolute(int n1, int n2) { return n1>n2 ? n1-n2 : n2-n1; }
void check(const char* s)
{
    int i;
    for(i=0; s[i]; i++) {
        if( !isdigit(s[i]) && s[i]!='-' ) { puts("不正な文字"); exit(EXIT_FAILURE); }
    }
    if(!s[0] || strcmp(s, "-")==0) { puts("数値ではない"); exit(EXIT_FAILURE); }
}
int input(void)
{
    char str[100];
    scanf("%99s", str); check(str); str[ str[0]=='-' ? 9 : 8 ] = 0; return atoi(str);
}
int main(void)
{
    int a, b;
    printf("数値a="); a=input();
    printf("数値b="); b=input();
    printf("%dと%dの差の絶対値は%d\n", a, b, absolute(a,b));
    return 0;
}

279 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:41:13 ]
int input(int *p){
char str[100], *pstr=str;
int value, index=0, sign=1;

if(scanf("%99s", pstr)!=1){
puts("入力エラー");
return 0;
}
if(sscanf(pstr, "%d%n", &value, &index)>=1 && pstr[index]=='\0'){
if(*pstr=='-') sign=-1,pstr++;
sscanf(pstr, "%8d", &value);
if(p) *p=sign*value;
return 1;
}
printf("不正な文字 %s\n", &pstr[index]);
return 0;
}

280 名前:275 mailto:sage [2008/04/09(水) 23:49:48 ]
>>276
a[0],a[1]でa[0]の入力をすると、a[0]の上限をこえたとき(cnt以上)に、
そのままa[1]の中身まで入力されてしまうってことですね;

>>277
break;のとこもexit(1);にし、int exit(int);を入れてみたところ、
そこはかとなくAの部分はできました。ありがとうございますー。



281 名前:281 [2008/04/10(木) 14:58:40 ]
わからないので教えていただけないでしょうか
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6215.txt
よろしくお願いします。

282 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 15:01:38 ]
史上稀に見る課題の丸投げ具合ですね

283 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 15:13:06 ]
自分でわかろうと努力をするつもりはないわけか
課題の言葉の意味もわかってなさそうだ

284 名前:デフォルトの名無しさん [2008/04/10(木) 16:17:51 ]
>>283
社会に出れば、問題を解決する方法論を持っていればそれが能力と
みなされる。
たとえその方法論が丸無げであってもな。

285 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 16:29:12 ]
その友達に聞け

286 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 16:30:45 ]
AもBもやったことない俺に、Cなんて聞くんじゃねぇ〜ぞゴルァ!
C言語ならおk

287 名前:デフォルトの名無しさん [2008/04/10(木) 18:57:28 ]
Cとかまだやってんのwだっさw

288 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 19:36:17 ]
スタックが32バイトしか取れないからしょうがないのだ。

289 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 23:47:00 ]
>>288
それはアセンブラでもきびしいだろw

290 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 23:54:53 ]
簡単なリモコン作る程度なら多いくらいだ



291 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 11:43:11 ]
ファイル名を入力して、そのファイルの小文字を大文字に置換した結果を
別のファイルに出力するプログラムです

ソース
arhp.hp.infoseek.co.jp/omoji.txt

出力されたモノ
arhp.hp.infoseek.co.jp/h_omoji.txt

見ての通り日本語が化けてしまいます
どうすれば正しく表示されるでしょうか?
もっと簡単に出来るやり方があればそれも教えて欲しいです

ちなみに
if(ch == komoji[a]) {
fputc(omoji[a],outfp);
のkomojiとomojiを入れ替えて大文字→小文字のモノを作ろうとしましたが
さらに日本語がおかしくなりました

まだ入門書を半分も読んでいない初心者が思いつきでやったので
色々突っ込みどころはあるかと思いますがよろしくお願いします

292 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 12:45:21 ]
漢字は2バイト以上で表現しているのだゾ。
漢字コードでググルのだ。


293 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:07:06 ]
>>291
当方で確認した環境は WindowsXP, 使用した処理系は cygwin(gcc 3.4.4) です。
以下のプログラムで問題が発生するかどうか、確認してみてください。
問題が発生しなければ、これが解決方法です。
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6217.txt

古いし、問題もあるようですが、参考にした書籍をあげておきます。
応用C言語, 三田 典玄, アスキー 1988, ISBN4-7561-0056-2
第3章

294 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:13:56 ]
>>291
突っ込みどころ満載だな。
・komoji, omojiは配列にする必要がない。const char * komoji = "abcde...z"でいい。
・bについては、要素数を固定値で持つな。ましてそれを変数に代入するな。
・forの条件もおかしい。このまま直すならa < bではなくa <= bだが、そもそもここはkomoji[a] != '\0'にすべきだ。
・strcpy(), strcat()を並べて使うくらいならsprintf()でも使え。この場合、sprintf(newfilename, "h_%s", filename)でいい。
・fgetc()の戻り値をcharで受けてはいけない。fgetc()の仕様を確認すればわかるが、intで受けるべきだ。
・cも要らない。小文字と判断したときにfputc()するのではなく、その場はchを書き換えておくだけでいい。
・>292も書いているが、Windowsで普通に扱う文字コードでは漢字コードの一部が英小文字に一致してしまう。
 真面目に対処すると意外に面倒だから、他の問題を全てクリアしてから改めて挑戦しろ。

295 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:17:08 ]
>>293
その本はゴミだ。いや、作者がゴミそのものだ。

>>291
>293を見て気付いた点をもう一つ追加。
・小文字と判断したら、forからは脱出しておけ。
・gets()は使うな。fgets(filename, sizeof(filename), stdin)にしておけばいい。

296 名前:293 mailto:sage [2008/04/11(金) 13:29:55 ]
>>295
まあまあ、せっかくソースをさらして質問している(質問作法としては最上です。)のだから、
まずい点をことさらに列挙するのはどうでしょうか。

それはそうと、
fgets() の第一引数はファイル名ではなくて、バッファなんですけど。

> その本はゴミだ。いや、作者がゴミそのものだ。
netnews の時代からいろいろいわれていたようですけど、
具体的にどこが悪いんでしょうか。おしえていただけるとうれしいです。


297 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:36:34 ]
まあ環境依存だよな
漢字というか多バイトコードが何なのかによって変わっちゃうから

298 名前:291 mailto:sage [2008/04/11(金) 13:36:57 ]
いえいえ、具体的に間違いをあげて頂きとても助かりました!
今からお二人のアドバイスを参考にやってみます!

299 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:37:55 ]
入門で作るプログラムとしてはASCII以外を考慮するのはハードル高すぎると思うよ

300 名前:295 mailto:sage [2008/04/11(金) 13:39:07 ]
>>296
もうかなり前だから何を以ってゴミと判断したかは忘れたが、
当時本人にも直接メールして本の不備を詳細に指摘したことがある。
言い訳だけが返ってきた。

それはそうと。
>fgets() の第一引数はファイル名ではなくて、バッファなんですけど。
もとのソースを見たか?
> gets(filename);
これ以上必要もない恥の上塗りはやめておけ。

>まずい点をことさらに列挙するのはどうでしょうか。
真摯に聞く態度を示す質問者だからこそ、列挙した。
つーか、「まずい」と認識しつつ指摘しない方が不親切だろ。



301 名前:291 mailto:sage [2008/04/11(金) 13:41:58 ]
環境依存ですかー
やっぱり初心者がやるにはちょっと面倒なモノだったようですね
皆さんの言ってることがある程度理解出来たら自己満足したいと思いますw

302 名前:293 mailto:sage [2008/04/11(金) 13:43:00 ]
>>296
あっ失礼、filename というのは、提示されたプログラムの変数をさしていたんですね。
もうしわけない。

303 名前:293 mailto:sage [2008/04/11(金) 13:47:03 ]
>>300
そうですね。gets() はまずいですね。
提示されたプログラムでは、128 文字以上入力されるとおかしくなってしまいます。

> 真摯に聞く態度を示す質問者だからこそ、列挙した。
> つーか、「まずい」と認識しつつ指摘しない方が不親切だろ。
たしかに。


304 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:49:09 ]
EUCだと3バイトとかあったっけ?

305 名前:295 mailto:sage [2008/04/11(金) 14:03:04 ]
>>304
入門の域を超えるから自分で調べてくれ。

と、それでは不親切なので、Asciiと共存できる文字コードを簡単に。
# つーか詳しくないので間違っていたら失敬。

・シフトJIS、SJIS、CP932、MS漢字など
Windowを中心に広く使われる。基本的に漢字などは2バイトで表現できるが、
2バイト目のコードがAscii文字の領域に重なるために何かと厄介。
特に、大文字小文字変換やディレクトリの区切り(\)のためにバグが出た商品も多々ある。

・(狭義の)EUC、EUC-JP
一部のUnixなどで使われる。狭義のEUCでは基本的に漢字は2バイトだが、
(所謂)半角カナも2バイトになってしまう罠。広義のEUCはEUC-KRなどの日本以外のものも含む。

・UTF-8、(狭義の)Unicode
最近のLinuxやMac(これも実はUnix系)などで一句使われる。基本的に漢字などは3バイトになる。
厳密に解釈しだすと切りがないので省略。UTF-8以外のUnicodeとは表現方法が随分異なる。

・ISO-2022-JP、(狭義の)JIS
メールなど、7ビット通信環境でも使えることを前提とした環境で使われる。
漢字などはasciiと同じような範囲を使うので単純にチェックすることは不可能。
asciiとの境界にEsc符号列を用いることで状態を切り替えるので、手間さえ掛ければ勿論チェック可能。
但し、改行前後でAsciiに戻さないといけないなど制約が多いので、内部コードとして使うことはお勧めできない。

306 名前:293 mailto:sage [2008/04/11(金) 14:08:01 ]
>>305
補足。
>>293 ではシフトJIS(MS漢字コード)の古い時代のものを仮定しています。
>>293 で作成・検証に使用したコンパイラは、まさにシフトJIS には対応していない
ので、提示されたプログラムにある日本語メッセージは、なくなく削除しました。

307 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 14:18:05 ]
>>306
cygwinなら、gccのオプションに--input-charset=cp932 --exec-charset=cp932を書くといいかも。
応用で、EUCで書かれたソースをcygwin用にコンパイルすることもできますぜ。

308 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 16:45:27 ]
>>307
感謝です。gnu の libiconv/iconv_open() の指定方法でいけばいいんですね。
またひとつ賢くなりました。

309 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 20:16:02 ]
>>287
Aどころか女と付き合ったこともないお前が言うと笑えるw

310 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 20:34:22 ]
ワシのCは108手までまであるぞ



311 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 21:18:17 ]
本当に初歩的な事ですみません…
C#ってなに?

312 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 21:20:08 ]
プログラム言語

313 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 22:40:22 ]
そのプログラムの中のたとえばどのようなものか教えていただけたらありがたい。

314 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 22:40:40 ]
日本語でおk

315 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 22:45:33 ]
自然言語に日本語、英語、フランス語と色々あるように、
プログラムを記述するのに使う言語も色々ある。
その1つがC#。もちろんCも1つの言語だ。

316 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 00:00:10 ]
Cよりはjavaに近い言語ってよく言われてるね
まぁC#とか触ったこともないけどなw

317 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 00:28:35 ]
JAVAっぽいC++

318 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 01:04:35 ]
マイクロソフトのマイクロソフトによるマイクロソフトのために作られた言語


319 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 12:44:08 ]
J++の焼き直し言語がC#

320 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 12:52:04 ]
どの言語だろうと、基本的な部分は共通しているし
実装されている、出来ることを知ることの方が重要。
あとは、用意されているライブラリをきちっと使えれば、どの言語だろうと関係ねぇ
限定した言語でしか通用しないような奴は、どこへ行っても使い物にならない。
とりあえず、コンピュータの仕組みを知ることが出来たんで、大学に通っておいて正解だったぜ。



321 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 14:10:50 ]
と、突然どうした。。。

322 名前:デフォルトの名無しさん [2008/04/12(土) 14:15:56 ]
簡単な文字出力のプログラムを作ったとして、
それをチャット上などで動作させることはできないのですか?
コマンドプロンプトの中でしか出力できないのですが

323 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 14:17:00 ]
>>322
そう。

324 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 14:34:24 ]
>>322
チャット上に文字出力するプログラム作ればいいじゃん

325 名前:デフォルトの名無しさん [2008/04/12(土) 14:36:31 ]
>>324
出力先をコマンドプロンプトじゃなくて、チャット上にするやり方が分からない
本にもそういうの載ってないんだが
すべてが独学だから聞く人もいないし・・

326 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 14:38:40 ]
>>322
そのチャットソフトが外部プログラムを呼び出すようにできていれば、可能かもしれない。
# まぁ無理だ。

327 名前:デフォルトの名無しさん [2008/04/12(土) 14:40:46 ]
>>326
そうなんですか?teacupチャットだけど
ホットコーヒーのやつでは出来てたような。。。
とりあえず外部プログラムを呼び出すようにできてるかも分からないので、もちと勉強してきます!
ありがとうございました!

328 名前:デフォルトの名無しさん [2008/04/12(土) 21:26:46 ]
名古屋近辺の専門学校でC言語学びたいと思うんだけど、どこがあるか紹介して。
または2チャンネルのスレッドでそういうスレがあったらきぼん。

329 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 21:27:35 ]
>>328
大学へGO!
やっぱり基礎が大事だから

330 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 07:30:38 ]
C言語で操っている、操作させている、制御しているコンピュータの基本的な仕組み
そして極め付けが、君が日ごろ見ている文字、絵、動画、音声、それらはすべて
ある法則に則って記録された数値データ、その数値データを人間で言う動物細胞
物質の原子レベルまで追求して話をすると、0と1の組み合わせ、すなわちバイナリーデータとは
0と1、あるかないか、磁石で言う+と-、電気信号でそれらを管理、制御しているのさ。
ほら、いつもニヤニヤしながら見ているエロ画像、それがだんだん・・・ただの色の集まり、
その色は0と1の組み合わせで構成されているデータに見えてきただろ?
PCに色や文字、音声が人間が解釈できる形で表現できる機能が実装されているから
その0と1の無機質なデータがエロ画像に見えるのさ。グロだろうと。



331 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 09:52:55 ]
人間なんて所詮炭素と水なのさ

という話と同等のどうでもいい話

332 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 10:06:34 ]
その通り、しかし、それを理解してそれに対して適切に制御、操作できれば
可能な範囲内で様々なことが出来るようになる。だから基本に戻れと。
ただ・・・人間も、いくら美人だろうとイケメソだろうが、所詮最後は朽ち果てて
この世から存在すらなくなってしまうのさ。ほら、躊躇してねーで、とっとと
好きなプログラムを作れ。そしてエロ画像で好きなだけはぁはぁしてろ、な?

333 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 10:08:37 ]
>>332
生きた証をどう残すかだな。子孫か、グレートコードか。

334 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 10:10:29 ]
なんで択一なんだよ
両方ゲットせいよ

335 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 10:11:39 ]
もちろん両方残せるのが一番良い。

336 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 10:13:58 ]
おまえら何の話してるんだよ

337 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 10:20:13 ]
自分も可能な範囲で子供を作れるのさ、作られるものは
遺伝子レベルでのことになるが。

338 名前:デフォルトの名無しさん [2008/04/13(日) 14:32:55 ]
returnとか戻り値とかどういうときにどう使うんですか?
詳しくかつ解りやすく教えてください

339 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 14:43:45 ]
自作した関数は式の中で使えるんだよ。

340 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 15:17:19 ]
int main()



341 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 15:21:39 ]
int sankaku(int teihen, int tkasa)
{
return teihen * takasa / 2;
}

int main()
{
printf("%d", sankaku(10, 50));
return 0;
}

342 名前:デフォルトの名無しさん [2008/04/14(月) 18:18:42 ]
ソースkansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6242.txt
ヘッダファイル(Macの方はこれがないと実行できません)kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6243.txt

内容は1〜9の数字を表示して、中に入っていない数字(3が表示されていないなら3)を入力する簡単なゲームです
このままだと最高記録と、最後に終了した時刻を書き込むだけなのですが
いままでの記録のベスト10と、それぞれに対応した終了時刻を扱えるに変更したいです

最初にfread,fwrite関数で記録の要素数を計ってプログラムを組んだのですが
正常に読み取り、書き取りができませんでした
その時のコードを載せればいいのですが、そのままだといくつか変更しないとエラーが出るので正常に動くソースをさらしました
できるだけ簡単に記録のベスト10と、それぞれに対応した終了時刻を扱える方法を教えてください

343 名前:デフォルトの名無しさん [2008/04/14(月) 21:33:40 ]
どんどん流れてくるデータ列を、指定された割合で「バランスよく」
間引く方法で悩んでいます。

割合を%で指定された場合に、データ処理時に以下のようにしたのですが
int a = (clock() % 100) + 1;
if(a > DROPRATE) { ; }

これだと50%を指定したときに(0がFALSEで1がTRUEだとして)
000000111111000000111111
という感じに並んでしまい、
010101010101....
とはなってくれません。

出来るだけきれいに固まりが出来ないように間引くのには、通常どんな方法を
とればよいのでしょうか?

344 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:33:41 ]
>>342
先ず、get_data()を改修してみよう。
fscanf()の使い方はそのままで、そこで得たbest, yearなどを格納できるように構造体配列を用意するのを忘れずに。
それができたら、テキストエディタで現在のkiroku.txtを編集してダミーデータを作ってそれを喰わせてみよう。
ここまでできれば、後はput_data()を改修して、記録の取り扱いのロジックを書けばいい。

要は、1件扱うのも10件扱うのも同じこと。
fscanf()とfprintf()で作っているのなら別途fread(), fwrite()が必要になるなんてことはない。

345 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:41:57 ]
>>343
なんで clock なんか使ってるの?
rand 使えば?

346 名前:デフォルトの名無しさん [2008/04/14(月) 21:44:43 ]
いえ、randomで書いて、やっぱり固まり部分が出きるので
きれいにならぶ規則性がほしいな、と思っているのですが・・・
三角関数とか使うのは嫌だし・・・

347 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:45:11 ]
>>343
clock() に DROPRATE を掛ければ委員ジャマイカ?

348 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:48:25 ]
>>346
バケツ変数みたいなものを用意して、毎回通過時にDROPRATEずつバケツに足していくとか。
勿論、バケツが一杯になったら空にすればいい。
Ex.

static unsigned bucket = 0;
bucket += DROPRATE;
if (bucket >= 100) {
bucket = 0;
flag = true;
} else {
flag = false;
}

349 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:51:05 ]
データ列の速度が1じゃないとだめか。
こうか?
a = (a+DROPRATE) % 100;
if(a > DROPRATE) { ; }

350 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:57:40 ]
リサンプルにおけるエイリアシング現象じゃないの。



351 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:05:02 ]
>>346
なるほど。規則的にしたいのか。
a 中に b 個 1 が規則的に出てきて欲しいのであれば、

void ab(int a, int b) {
for (int i = 0; i < a * b; i += b) {
printf("%d", (i % a < b));
}
printf("\n");
}

とかどうよ。

352 名前:デフォルトの名無しさん [2008/04/14(月) 22:06:05 ]
コメントありがとうございます。
>>347
 すみません。良くわかりません。
>>349
 なるほど、これだと確かに固まりが分散しそうですね。やってみます。

353 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:07:45 ]
>>343
規則的でよければブレゼンハムのアルゴリズムが使えるよ
乱数要素を混ぜるならバッファ付のディザリングみたいの使えばおk

354 名前:デフォルトの名無しさん [2008/04/14(月) 22:08:24 ]
>>351
 ありがとうございます。やってみます。

355 名前:353 mailto:sage [2008/04/14(月) 23:02:19 ]
>>343
いまさらだけど…
>>351 と同じインターフェイスで

void ab_(int a, int b){ // ブレゼンハム
int i, x;

for(i=0,x=a/2;i<a;i++,x+=b+1){
printf("%d", (x>=a));
if(x>=a) x-=a;
}
printf("\n");
}

double uniform_rand(void){return (double)rand()/(RAND_MAX+1);}
void ab__(int a, int b){ // 乱数ディザリング
int i, d;

for(i=0;i<a;i++){
d=0;
if(uniform_rand()*(a-i)<b) d=1,b--;
printf("%d", d);
}
printf("\n");
}

356 名前:デフォルトの名無しさん [2008/04/14(月) 23:52:21 ]
>>355
 ありがとうございます。参考になります。

皆さんへ
 結局、>>351さんのループ部分をばらした関数を作って使いました。
 どうもありがとうございました。

357 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 00:24:57 ]
>>353
347=349だけど参考になった。
ブレゼンハムのアルゴリズムっていうのか。

358 名前:353 mailto:sage [2008/04/15(火) 14:25:42 ]
>>357
参考にするなら訂正しておくよ orz
void ab_(int a, int b){ // ブレゼンハム
int i, x;

for(i=0,x=(a+b)/2;i<a;i++,x+=b){
printf("%d", (x>=a));
if(x>=a) x-=a;
}
printf("\n");
}

359 名前:デフォルトの名無しさん mailto:age [2008/04/15(火) 23:37:51 ]
getchar()を使用し、絶対値を返すプログラムを作れ、ということで
ここでいろいろ参考にして、一応作ってみました。
結果は問題ないと出るのですが、イマイチ無駄な処理が多いかなと自信なくて、
修正できるとこがあれば、自分が判りそうな範囲で修正して教えてくださいー;
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6246.txt

360 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:38:59 ]
宿題スレ池



361 名前:278 mailto:sage [2008/04/16(水) 00:14:15 ]
>>359
だから関数化しようって。
無駄な処理を言うなら、フラグを駆使してまでmainだけで頑張ることが無駄。
278のをgetchar使うように修正しといたから。
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6247.txt

362 名前:359 mailto:sage [2008/04/16(水) 00:21:36 ]
>>361
すみません、わざわざありがとうございます;

363 名前:デフォルトの名無しさん [2008/04/16(水) 00:55:50 ]
質問お願いします。
#include <stdio.h>

int main(void)
{
  int x[80],y[80];
  int a=-400,b=-400,lp,c=0;
 
  for(lp=0;lp<40;lp++){
     x[c]=a;y[c++]=b;
     x[c]=a;y[c++]=-b;
     a+=20;
     }  
  for(lp=0;lp<80;lp++){
     printf("x[%d]=%d y[%d]=%d\n",lp,x[lp],lp,y[lp]);
     }
  system("PAUSE");
  return 0;
}
上のプログラムで、ループを使って配列変数に値を代入する部分で、
最初のループでyに値を代入する時、y[c++]にbの値を代入するようになってますが、この時cに+1されているはずなのになぜy[0]の部分にbが代入されるのでしょうか?
一応、線を引くための座標を代入させるのが目的なので、y[0]に代入されて正解なのですが、どうしても気になったので質問させていただきました。分かりづらい説明かもしれませんがどうかお願いします。

364 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:59:37 ]
>質問お願いします。
日本語でおk

c++ は cの値を取り出して使った後で、 cの値が+1 となる
つまり上記のy[c++]=bは c=0であれば y[0]にbを代入した後に、c=1 となる
おk?

365 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 01:00:47 ]
>>363
x[c]=a;
y[c++]=b;

これの前中後それぞれに、cの値を表示するprintf文入れりゃわかるよ。

366 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 01:08:38 ]
y[c++] = b だと y[c]←b の後に cを1加算  つまり y[0] == b
y[++c] = b だと cを1加算した後に y[c]←b つまり y[1] == b

367 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 01:08:52 ]
>>365
前後じゃわからんだろう

368 名前:363 [2008/04/16(水) 01:21:50 ]
>>364-366
++の位置で1を加算するタイミングが変わるのですね。
理解することが出来ました。ありがとうございます。

369 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:47:52 ]
>>359
すでに指摘されていますが、absolute() とするのならば、input() なども作るのはどうでしょう。
桁数切り取りの場合わけに苦労しているようですが、「数字部分で8桁」と考えればいいかと想います。エラー1, エラー2 の検出も簡単に記述できると思います。min, cnt, err が絡み合わないように整理したほうがいいでしょう。
9桁目以降で数字以外の文字が入力された場合は、題意としてはエラーにしたほうがいいかも?(これは仕様の読みの問題ですが。)

些細なことですが、
getchar() ( -> fgetc() ) の返り値は int です。
main の返り値は int がお約束です。

提示されたソースの手法に従うのなら、こんなのはいかが?
(確認環境 WindowsXP, 処理系 cygwin(gcc 3.4.4))
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6248.txt

>>361
きれい‥‥。でも質問者は <string.h> 全般がわからなくてスルーしちゃったのかも。

370 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 03:17:34 ]
エラーを数値でやるより列挙子使おうぜと言おうと思ったがまだ習ってないか。



371 名前:369 mailto:sage [2008/04/16(水) 03:40:15 ]
#define のかわりに列挙子を使う人もいますね。最近知りました。

372 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 14:10:53 ]
質問です。
変数のみの行を記述してもコンパイルエラーにならないようですが、
・文法上、なぜOK?
・どんな動きをする(最適化等で消されて何もしない?)

void main(void)
{
 int a;

 a;       <- この行
}


373 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 14:13:08 ]

BorlandC++ 5.5
Renesas C Compiler 9 for SH
でコンパイルOKでした。

374 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 14:17:33 ]
・あらゆる式は;を付ければ式文として文になるから
・何もしない

375 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 14:26:21 ]
例えばf(i);のように書いてあるとして、
あとから先頭の方に#define f(arg) (arg)と書けば
関数呼び出しが無かったことにできます
プリプロセスの都合上必要なだけです

376 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 14:26:25 ]
Cでは関数を呼ぶのも代入も式の内なので、式文が許されないとプログラム書けない。

377 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 14:41:50 ]
>>376
エラーにならない理由を聞かれて規則でそう決まってるじゃ答えになりません
エラーがでない理由はエラーにしない方がよいと言語の設計者が考えたからであって
文法規則はその結果でしかないです

378 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 15:09:08 ]
訊かれてるのは「文法上、なぜOK?」であって、言語設計者がどう考えたかではないし

379 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 15:28:47 ]
関係ないけどmainの戻り値はintにしとけ

380 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 15:41:28 ]
ちっちっち、てんで説明になってないぜ、坊や達?一度、顔を洗って出直しな。
ついでに鏡を見てごらん。そう、何かこう、プギャー!な面が映し出されているだろ?
それが何だか分かるかい?そう、自分の顔さ。見事な面だろ?
人前に出た君を、周りはその顔の人だと見ているのさ。

それはさておき、a;がなぜおkかって?単項でも数式と言えるからさ。
こんなの、数学でも初歩的だよ?w



381 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 17:12:49 ]
>>374-380
コンパイラ(構文解析か?)が仕様としたものが分かりました。ありがとうございます。

>>375 確かに。目にしていたはず。
>>380 "単項でも数式と言える"なるほど。 最後のwが興ざめですが。

382 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 19:45:59 ]
なぁ〜〜にぃ〜〜!やっちまったな!
男は黙ってぇ〜 炭坑に入れ

383 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:04:19 ]
しばらく平和だったのに頭おかしいのが戻ってきちまったな

384 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:16:38 ]
平和ばっかりじゃつまらないだろ?たまにはリーチ、一発、タンヤオ、イーペーコー
七対子、対々和、三暗刻くらいは狙おうぜ?そして僕イケメン。

385 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:19:49 ]
>>384
国士無双、四暗刻のダブル役満なみにねーよwww

386 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:20:20 ]
国士のwktk感は異常

387 名前:デフォルトの名無しさん [2008/04/16(水) 22:09:44 ]
C言語の入門書を本屋で立ち読みしたのですが、
コンパイラとして無料で手に入るものもいくつかあがってました。
市販の処理系というのは、いずれ必要になるものなのでしょうか?
それとも、無料のもので長くやっていけるもの?

388 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:22:22 ]
無理に市販のも使わなくてもいいよ。 無料で十分。
慣れて詳しくなってからでも、有料を選ぶのは遅くないだろうしな。

389 名前:359 mailto:age [2008/04/16(水) 23:54:58 ]
>>369
ありがとうございます、参考にさせていただきます。
あと、結果についてなのですが、case1のときのエラー判定が少し違ってて、
1aならエラー1、aaならエラー2、aならエラー2のように
ちょっと間違ってたようですー。

390 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 00:54:31 ]
borlamd C++ compiler 5.5って、windows Vista でも動きますか?



391 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 03:09:46 ]
>>390
GUIを持っているわけではなく、特殊なライブラリーもないから動くでしょう。
俺はもっぱらVisualC++2008 ExpressEditionを使っている。

392 名前:デフォルトの名無しさん [2008/04/17(木) 07:16:23 ]
まず自分の質問が++なのかさえ分からないものですが宜しくお願いします。
あるアプリで競艇のデータを作っています。掛け金を掛け方に応じ変えています。
■2連複=2000■3連単=3000
また投資額は(掛け方*レース数)です。
アプリ上で掛け方を入れたら自動的に投資額がでるようなのですが、式が分かりません。
自分で色々試し
■IF(方式=2連複,((レース数*2000,((レース数*3000)みたいなのを作りましたが、これだとダメでした。
宜しくお願いします。

393 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 08:11:47 ]
>まず自分の質問が++なのかさえ分からないものですが宜しくお願いします。
「++」が何のことか判りませんが、Cの質問ではないようですので
お使いのアプリ名でスレタイ検索してみてはいかがでしょうか。

394 名前:デフォルトの名無しさん [2008/04/17(木) 08:36:04 ]
>>393
やはりそうですか。
ありがとうございました。

395 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 08:42:22 ]
>>389
それはすみません。今時間がないので、本日遅くに修正いたします。

396 名前:デフォルトの名無しさん [2008/04/17(木) 15:18:29 ]
Borland C++Compiler をダウンロードしようとしてもうまくいきません。
登録を済ませてからダウンロードボタンを押しても
「Internet Exploler ではこのページは表示できません」
と出ます。どうしてでしょう・・・

397 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 16:00:03 ]
Borland C++ Compiler オ ワ タ
pc11.2ch.net/test/read.cgi/tech/1206951221/

実はオワテないです、ちゃんとダウソしてくり

398 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 16:06:25 ]
>>396
www.codegear.com/jp/downloads/free

↑のC++ BuilderもしくはTurbo C++を落とすべし。

399 名前:デフォルトの名無しさん [2008/04/17(木) 16:31:06 ]
hello, world.

出たーーーーーーーーーーーーーーー
これまでに要した時間3時間。
先が思いやられる


400 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 18:17:05 ]
質問です。いま入門書をみてテキストのプログラムを打ちこんでいるのですが、
以下の内容だとコンパイルできません。エラーはif構文に ) がないと表示さ
れてしまいます。


int a = 10
int b =20

~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
printf("aが20 またはbが30 またはaが10でない");
if (a== 20 || b== 30 || a!== 10)
{
printf("条件に当てはまりました。\n");
}
else
{
printf("条件に当てはまりません。\n");
}
}






401 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 18:17:09 ]
ここはあなたの日記帳ではありません

402 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 18:17:44 ]
>>400
!==

403 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 18:24:11 ]
それで、ひとつひとつ調べたところ

if(a == 20 || b == 30)

だとコンパイルされます。他の値も調べてみたんですが、
ifに続く条件が3つになるとコンパイルできないことがわかりました。
2つまでだとコンパイルできます。

Borland C++Compilerの無料のCコンパイラを使用しているんですが
これに問題があるのでしょうか?


404 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 18:25:42 ]
>>400

ありがとうございます。
一度やってみます。

405 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 18:25:48 ]
それで、じゃねーよw


406 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 18:26:33 ]
すいません
>>402さんでした
ご指摘ありがとうございます



407 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 18:42:17 ]
やっぱり
if (a== 20 || b== 30 || a!== 10)をif (a== 20 || b== 30 || a!= 10)
と打ちなおしても if構文に ) がない、関数main
とエラーが出てしまいます。

うーん、やっぱり駄目なのかな


408 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 18:44:26 ]
そういう慌てん坊さんは、格好悪くて括弧がつかないって中学校の数学の教師が言ってた

409 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 19:13:26 ]
0で割る(除算する)と「問題が発生したため...」となって強制終了されるのですが、
0で割るのをやめる以外で、エラーを回避する方法はありますか?

410 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 19:36:58 ]
>>409
0で割るのをやめる。

純粋に疑問なんだが、0で割ってエラーにならないとしたらどういう結果
になるのが自然だと思うんだろう。





411 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 19:47:40 ]
なぜ0で割れないのか不思議だったが考えてみれば簡単で当然だった
16を4で割るということは16を4つのグループに分けるということ
どんな数字も0個のグループに分けることはできないんだから

412 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 19:52:18 ]
0で割ったら0にしてほしいと思っています。
そのほうが便利だと感じます。

413 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 19:53:26 ]
浮動小数点数でおk

414 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 20:06:51 ]
>>400
int a
int b
の宣言文にセミコロン。

415 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 20:14:27 ]
0をかけるってことは0の逆数で割るってことで、0/0で割ること。
0/0で割るのは0/0をかけるのと同じだから、0で割るのは0をかけるのと同じで0になっていい。
コンピューターだとビット演算の仕様でそういうことにはできないのかな。

416 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 20:15:07 ]
>>407
黙ってソース全体をコピペするなりどこかに上げるなりしろ

417 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 20:15:54 ]
>415
目をさませ
あるいは寝ろ

418 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 20:23:35 ]
逆数

0 でないある数 a に対して、a × b = 1 となるような数 b を a の逆数 (ぎゃくすう) といい、

419 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 20:24:14 ]
なるほど、1=2という結論ですね。

420 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 21:08:37 ]
>>419
それは違う。それが成り立ってしまうと、数学的帰納法で全ての数が等価になってしまう。



421 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 21:15:48 ]
なにか問題が?

422 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 21:24:01 ]
>>414
セミコロンをつけましたがやはりダメでした

423 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 21:26:22 ]
>>400>>402,414以外の間違いは見当たらないんだが。

424 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 21:44:04 ]
エラーメッセージ貼れよ

425 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 22:04:46 ]
#include<stdio.h>
#include<math.h>

int main(void)
{
double i,n,S;

for(i=10;i<=1000000000;i*=10){
S=0.0;
for(n=1;n<=i;n++){
S+=asin(n/i) /sqrt(1.0-(n/i)*(n/i)) /i;
}
printf("分割点%10d: %lf\n",i,S);
}
return 0;
}
domain errorが発生するんだけどどうして?

426 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 22:20:36 ]
%dにdouble突っ込みゃそりゃどうなるか分からん罠。

427 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 22:28:17 ]
>>425
sqrt(1.0-(n/i)*(n/i))が怪しい
1.0-(n/i)*(n/i)の計算結果が-0.0になることがあるんじゃないの?
sqrt(fabs(1.0-(n/i)*(n/i)))にしてみるとか


428 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 22:31:15 ]
>/sqrt(1.0-(n/i)*(n/i))
これがまずい。
nがiのとき0で割ることになる

>>426
そこもおかしいが、domain errorとは関係ない

429 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 22:35:29 ]
#include<stdio.h>
#include<math.h>

int main(void)
{
double i,n,S;

for(i=10;i<=1000000000;i*=10){
S=0.0;
for(n=1;n<=i;n++){
S+=asin(n/i) /sqrt(fabs(1.0-n/i*n/i)) /i;
}
printf("分割点%10d: %lf\n",i,S);
}
return 0;
}
やっぱりできない

430 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 22:36:38 ]
i, nをintにして、(n/i)の計算を((double)n/i)にするとか

doubkeを
> for(i=10;i<=1000000000;i*=10){
のように計算するのは好ましくない。誤差が出てしまう。



431 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 22:41:01 ]
>>415
1 / 1 = 1
1 / 0.1 = 10
1 / 0.01 = 100
1 / 0.000...001 = 100...000
1 / (10 ^ -n) = 10 ^ n
こうやって被除数を限りなく0に近づけて
1 / 0 = ∞
という考えもできる。俺が厨房のときはこれだと思っていた。

ところがこれ、負のほうから0に近づけると-∞になるから
こういう極限は存在しなかった。

432 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 22:58:13 ]
>>430
でないだろ普通・・・
お前の環境doubleが何byteなんだよw

433 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 23:05:30 ]
どうすれば誤差が出るのか理解せずにdoubleだと誤差が出るって覚えこんだんだろうな。

434 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 23:17:46 ]
>>423
わかりました。

if (a== 20 || b== 30 || a!= 10)
               ↑を !a にしたらコンパイルできました。

考えてくれてありがとうございました。



435 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 23:28:37 ]
>>434
いや、ちゃんとコンパイルできますよ。
これをコンパイルしてみてください。
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6267.txt
当方で確認した環境はWindowsXP, 処理系はcygwin(gcc3.4.4) です。

うまくいかない場合は、実行環境/コンパイラの種類を教えてください。
手に入るものなら私でも試してみます。

436 名前:423 mailto:sage [2008/04/17(木) 23:29:30 ]
>>434
402,414の2つのレス分直したらコンパイル通ったぞ
どこか違うところ間違ってないか

#include<stdio.h>
int main(void)
{
int a = 10;
int b = 20;

printf("aが20 またはbが30 またはaが10でない");
if (a== 20 || b== 30 || a != 10)
{
printf("条件に当てはまりました。\n");
}
else
{
printf("条件に当てはまりません。\n");
}
return 0;
}


437 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 23:37:21 ]
>>409
お使いの環境に matherr() 関数はありませんか?

438 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 23:40:33 ]
>>435
>>436
考えてもらってありがとう。なんとかコンパイルできたので
また何かエラーが出たら教えてください。


439 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 23:44:25 ]
>>389
順序を変えました。inputInt() の該当部分を、次のようにしました。
if (err == 1)
return 1;
if (cnt == 0)
return 2;
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6268.txt

440 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 23:49:08 ]
>>412
算数の教科書をみなおしてみましょう。
わり算はかけ算の逆であると決めれば、わる数が 0 である場合は
「答えになることのできる数はない」
のです。



441 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 00:45:34 ]
borland C++ compiler 5.5で、setbccを使って、環境変数と設定ファイルの
設定をしていたんですが、なぜか、PATHの設定が失敗してしまいます。
何がいけないんでしょうか?

442 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 00:46:31 ]
>>441
スレ違い、失せろ

443 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 00:47:56 ]
>>442
お前が失せろ

444 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 00:49:32 ]
じゃあ俺が失せるよ!

445 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 00:58:08 ]
いやいや、ここは俺が

446 名前:441 mailto:sage [2008/04/18(金) 00:58:28 ]
>>442
スレ違いで、失礼いたしました。
このような質問は、どのスレッドで聞くべきなんでしょうか? 
すみませんが、教えてください。

447 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 00:59:31 ]
>>446
どうぞどうぞ

448 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:00:04 ]
>>445
あっ どうぞ、どうぞw

449 名前:448 mailto:sage [2008/04/18(金) 01:01:50 ]
33秒差で負けた・・・

450 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:03:10 ]
>>447-449
早漏乙



451 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:27:18 ]
>>446
BCC Developper
pc11.2ch.net/test/read.cgi/tech/1155549904/

ここで聞くのがいいんだろうけど、問題はとんでもない過疎スレで、
質問してもレスがつくという保障はない。

とりあえず、ここでいいんじゃないの?

452 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 09:36:52 ]
>>441
>何がいけないんでしょうか?
あんたの頭。

453 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 13:53:50 ]
シンボリックな定数を扱う場合、
大きくわけて#defineを使うのとenumを使うのがあるようですが、
どのように使い分ければいいのでしょうか?
それとも好みの問題?

454 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 14:03:01 ]
複数の定数にまとまった意味があるならenum、
整数値でないならdefine、
後はプロジェクトごとの規定による。

455 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 14:26:08 ]
来週から新人研修でC言語担当になったので来てみました。
最初からじっくり読んでエスパー目指します。

456 名前:デフォルトの名無しさん [2008/04/18(金) 16:30:54 ]
>sprintf("%0.2f", 1.1)
って書き方は間違いですか?

直すとしたら、
>sprintf("%.2f", 1.1)
といった感じでしょうか?


457 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 16:33:33 ]
>>456
直すとしたら
sprintf(buffer, "%0.2f", 1.1);
じゃないかと思った

ゼロフラグが有っても別に間違いということはないと思う

458 名前:456 mailto:sage [2008/04/18(金) 16:37:44 ]
了解。どうも有難う。

459 名前:nito mailto:sage [2008/04/18(金) 16:39:40 ]
vs2005で
featall[i*featnum[i]+p].descr = n[p].descr;
とすると
main.c(143) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
というエラーがでます。
どうしてでしょうか。
ちなみにdescrは[128]です。

460 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 16:51:23 ]
>>459
int a[10]; で
a = 5; とかできない。
ってのと同じ。



461 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 16:56:51 ]
そのエラーメッセージもおかしくて、正確には「変更可能な左辺値」だけどな…
配列をまるっとコピーしたいならmemcpyかmemmoveを使え

462 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 17:05:17 ]
>>461
おかしいといえばおかしいが、おかしくないといえばおかしくない。
なぜなら配列は特定の場合を除いてポインタ値(ポインタ変数ではない。つまり右辺値)に成り下がるから。
まあどうでもいいか。

463 名前:nito mailto:sage [2008/04/18(金) 17:24:42 ]
>460
言われてみれば確かに…

>461
おkす。やってみます。

みなさんありがとうございます。
何分Cは初めたばかりでしてちょくちょくつっかかってまして
また使わせていただきます(滝汗

464 名前:nito mailto:sage [2008/04/18(金) 18:07:26 ]
続きになるんですが
memcpy(featall[i*featnum[i]+p].descr,n[p].descr,sizeof());
と書くことにしました。
この場合、sizeofには
int[128]
と入れれば
128個の配列分確保されるんでしょうか。

465 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 18:25:29 ]
>>464
yes

466 名前:465 mailto:sage [2008/04/18(金) 18:33:49 ]
老婆心ながら
memcpy は移動元と異動先が被るような場合はうまくいかない。
bcopy (from, to, len); // memcpy(to, from, len) と引数順が違う
というのもある。

467 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 19:29:52 ]
printf( "%c" , 'A' );
が標準出力に文字「A」を出すという保証はないですよね?
「文字定数=>int」「int=>char」「char=>%cで出てくる文字」は全く別の変換であって、
そこらの処理系ではたまたま合ってるだけですよね
規格を読む限り

468 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 20:02:49 ]
>>466
何故そこでmemmove()を薦めない。

469 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 20:36:25 ]
>>466
bcopy は sun os に付属のコンパイラで使ったことがありますが、どこにでもあるのでしょうか....。
やっぱり memmove() ですか。

470 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 20:51:50 ]
入力された値が3だったら、
***
-**
--*
といった具合(後ろで桁合わせ、-は空白)に出力されるプログラムを組みたいと思います。
#include <stdio.h>
int main(void)
{
int num,i,j,k;
scanf("%d",&num);
for(i=1; i<=num; i++)
{
for(j=num; 0<j; j--)
{
printf("*");
}
printf("\n");
for(k=1; k<=i; k++)
{
printf(" ");
}
}
return 0;
}
の様に組んだのですが、実行すると
***
-***
--***
となってしまいます。
*を出力する部分がうまく動いていないのだと思い、色々いじくってみたのですが、
3,2で終わってしまったり、無限ループしてしまうといった状態でどう改善させれば良いのか分かりません。
宜しくお願い致します。



471 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 20:58:09 ]
-for(j=num; 0<j; j--)
+for(j=num; i<=j; j--)


472 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 21:10:45 ]
#include <stdio.h>
int main()
{
int num;
scanf("%d", & num);
for (i = 0; i < num; ++i) {
printf("%*s%.*s\n", i, "", num - i, "**********");
}
return 0;
}

473 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:37:09 ]
>>471,>>472
実はこれに2時間以上つっかかってました・・・(恥
これで安心して寝れます。ありがとうございました。

474 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:38:54 ]
空白のループは*のループの前に持ってきたほうがいい

475 名前:472 mailto:sage [2008/04/18(金) 23:11:15 ]
>>473
感謝するなら理解してからにしてくれ。

476 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 02:01:40 ]
case3以降の計算が滅茶苦茶になるんですが

#include<stdio.h>
void main()
{
int person;/*宿泊者の人数*/
int price; /*1人あたりの宿泊費*/
int room; /*1部屋あたりの宿泊費*/

person=3;

switch(person)
{
case1:/*1人の時*/
price=18000;
break;
case2:/*2人の時*/
price=10000
break;


477 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 02:07:39 ]
476のつづき

case3:/*3人の時*/
price=8000
break;
  }
room=price*person;/*1部屋あたりの宿泊料を計算*/

printf("宿泊人数%d人の時、",person);
printf("1人あたりの宿泊料は%d円です。\n",price);
printf("1部屋あたりの宿泊料は%dです。\n",room);
}
  

478 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 02:07:53 ]
続きは?
あと
× void main() { ... }
○ int main() { ... return 0; }

479 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 02:09:18 ]
すれ違ってしまった・・・。

以降ってことは 4 とか入れた場合のことか?
そりゃ price に何も値代入してないから無茶苦茶になるぜ。

480 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 02:10:45 ]
コンパイルするとcase3以降の計算が間違ってしまいます。

それでcase2までにすると、どんな値をいれても正確に計算されるんですが
3つ以上になるとおかしくなるんです。



481 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 02:14:15 ]
>>478、479
ありがとうございます。
明日、起きたら試してみます。
いま使っているパソコンとプログラミングしているパソコンは
別にあるので夜遅く申し訳ありません。

482 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 02:16:17 ]
case と数値の間にスペースがないのはコピペミスか?

483 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 02:16:37 ]
>467
どう読んだか知りませんが、間違ってます。

484 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 07:57:59 ]
>>481
>482が指摘したとおり、caseの後に空白がないのではないか?
他の構文ミスと違い、caseの後の空白がないこと自体は文法違反にならないからエラーにはならない。

485 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 10:28:29 ]
ただのラベルになっちゃうからねぇ

486 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 10:31:35 ]
default:
 if (person == 3) goto case3;

487 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 12:24:23 ]
学習教材として、「猫でもわかるC言語プログラミング」か
「十日で覚えるC言語入門教室」のどちらを買おうか悩んでいるんですが、
経験者の方から見てどちらが使いやすいんでしょうか?」
アマゾンはいまいち頼りにならなくて・・・・

488 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 12:39:11 ]
エラトステネスの篩をCで書いているんですが、
以下のプログラムをコンパイルして実行しても、数字を入力させるだけで何も起こりません。
prime[ ]が変であるのはわかるんですがどう直せばいいかわからなくて…
ご教授よろしくお願いします。

#include <stdio.h>
int main(void)
{
int i,j,num,prime[10000+1];
printf("Please input the number : ");
scanf("%d",&num);
for(i=2;i<=num;i++){
prime[0]=prime[1]=0;
prime[i]=1;
}
for(i=0;i<=num;i++){
if(prime[i]){
for(j=2;(j*i)<=num;j++)
prime[j*i]=0;
}
}
for(i=0;i<=num;i++){
if (prime[i]){
printf("%d",i);
}
}
printf("\n");
return 0;
}

489 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 12:43:41 ]
476ですが、
>>478
>>479
>>484
>>486さんのいう通り試してみましたが、case3以降の計算がやはり間違えてしまいます。

もう一度、プログラムを書きなおしてみても同じ結果でした。
コンパイルになにか不具合があるのでは?と疑っています。

とりあえずcase2までは計算できるので、エラーは置いといて先のプログラムに進んでみよう
と思います。


490 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 12:50:55 ]
>エラーは置いといて先のプログラムに進んでみようと思います。
やめろバカ
一足飛びに習得できるほどCはヌルい言語じゃないぞ

とりあえずコンパイルしたソースをそのまま貼るんだ



491 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 12:55:30 ]
>>488
・ prime[0]=prime[1]=0; はループの外に出せ
・ 二つ目のループが何をやっているのかもう一度考えなおせ
 ifに条件が足りないはず

492 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 13:14:29 ]
>>476>>477のプログラムをコンパイルすると
person=3なので、>>477のcase3の値がテキスト上では計算されることになってます。

実際のコンパイルの結果は

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

宿泊人数3人の時

1人あたりの宿泊料は 2147348480 円です

1部屋あたりの宿泊料は 2147078144 円です

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

となります。(21億4千7百34万8千480円)と(21億4千7百7万8千144円)



493 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 13:18:13 ]
>>492
>person=3なので、>>477のcase3の値がテキスト上では計算されることになってます。
いいえ。理由は>484。

494 名前:488 mailto:sage [2008/04/19(土) 13:19:21 ]
>>491
言う通りにしたら正常に動作しました。ありがとうございました。

あと、このプログラムだと入力値が10000をこえると正しく動かないと思うんですが、
入力値までprimeを定義するにはどうすればいいんでしょう?

495 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 13:20:44 ]
primeをmallocで確保

496 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 13:26:31 ]
>>493

書いたプログラムを確かめたところ、ご指摘のとおり
case 3: と空白を開ければ、指示通り正しい計算ができました。

初歩的なミスでお騒がせしてすいませんでした。
またよろしくお願いします。



497 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 14:20:41 ]
ファイル中に1行ずつ下記の様なデータが入っているとします。
1行に含まれるデータの数は各行でまちまちです。

element1 element2 element3 ・・・ elementL
element1 element2 element3 ・・・ elmenetM
   ・
   ・
element1 element2 element3 ・・・ elementN

このときに各elementを1つずつ、読み込むにはどの様にすればよいでしょうか?
現在、下記の様に変数を多めに取って解決しているのですが、もっとよいやり方
はありますでしょうか?

while(fgets(buf, sizeof(buf), fp)!=NULL){
scan_num = sscanf(buf, "%s %s %s %s %s", element1, element2, element3, element4, element5);
}



498 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 14:43:41 ]
つfscanf

499 名前:497 mailto:sage [2008/04/19(土) 14:57:05 ]
>498
レスありがとうございます。一つ書き忘れたのですが、行を行として読み込むことが
要件としてあります。つまり、1行と2行目は別の要素として読み込みたいと考えてます。
要件漏れすいませんでした。

fscanfは考えたのですが、改行文字も空白と同様データの区切りとして読み込むと
のことでしたので、1行をバッファに読み込んでから処理をしています。1行ずつ別途に
処理する方法があれば教えてください。


500 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:31:22 ]
>>499
fgets(), sscanf()



501 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:37:44 ]
fgetcで改行まで読む

502 名前:デフォルトの名無しさん [2008/04/19(土) 15:46:07 ]
関数へのポインタの定義で”型名 (*ポインタ変数)(引数)”とするところを
”型名 *ポインタ変数(引数)”と、するとどうしてダメなのでしょう?
お願いします。


503 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:49:11 ]
int *kansu() は int型のポインタを返す関数と解釈される

504 名前:デフォルトの名無しさん [2008/04/19(土) 15:56:26 ]
>>503
よく分からないのですが、int *kansu()はint形のポインタを返す関数の
プロトタイプ宣言と解釈されるのですか?

505 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 16:01:46 ]
そういうこと
int* p;
p = kansu();

506 名前:デフォルトの名無しさん [2008/04/19(土) 16:06:59 ]
>>503
ありがとございました。

507 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 16:08:55 ]
typedef int kansu_t(void);
kansu_t* kansu = &foo;
int n = kansu();

typedef は偉大だと本気で思う。

508 名前:デフォルトの名無しさん [2008/04/19(土) 17:30:27 ]
C言語勉強中の者です。
データ管理のプログラムを作る時、各々のデータ(文字列)の配列のサイズは、
malloc()関数で決めるのが一般的なのでしょうか?


509 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 17:32:18 ]
可変長の場合はね。
mallocのほか、calloc()やrealloc()でも可。

510 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 17:38:25 ]
最初のうちは、#defineで最大サイズを容易に変更できるようにした固定長配列でもいいと思うけどな。
いずれにしろ、ある程度の規模になればmalloc()は必須になるから慣れておいたほうがいい。



511 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 17:43:25 ]
free 忘れは大変だしな。

512 名前:デフォルトの名無しさん [2008/04/19(土) 17:52:55 ]
>>509,510,511

ありがとうございます。
「ある程度の規模」というのがわからないのですが、
たとえば、500個くらいのデータの各々に「メモ」配列をつける場合、
200文字までと固定してしまって、実際にはメモのない場合がほとんどだったら?



513 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 17:53:58 ]
長さを固定にしたくなければ動的に確保すればいいし、
固定で十分なら固定にすればいい。

514 名前:デフォルトの名無しさん [2008/04/19(土) 17:54:40 ]
初心者はstring

515 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 17:54:59 ]
C スレで何言ってんの?

516 名前:デフォルトの名無しさん [2008/04/19(土) 17:57:25 ]
mallocやfreeは上級者しか無理 stringをかなり進める

517 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:01:37 ]
>>512
「スタック」でぐぐってみるとよし。
スタックは小さいから、そこに収まらない規模の配列は必然的にmalloc()を使うことになる。

518 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:03:44 ]
C≠C++

519 名前:512 [2008/04/19(土) 18:09:29 ]
みなさん、ありがとうございます。
さしあたって、Cを勉強しているのですが、
stringが簡単そうですね。
C++も視野に入れて勉強していこうと思います。


520 名前:デフォルトの名無しさん [2008/04/19(土) 18:13:37 ]
string a="あいう";

a=a+"えお";

などと自動でサイズ変更してくれる。
初心者はstring



521 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:19:10 ]
a=a+"えお"; とか書くなよ・・・。
a+="えお"; だろ。
コスト考えれ。

522 名前:デフォルトの名無しさん [2008/04/19(土) 18:24:08 ]
後ろに空きがあったら、メモリを解放せずに増やす方法ありますか? 普通に牌列としてアクセスできてです。

523 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 19:37:51 ]
realloc

524 名前:デフォルトの名無しさん [2008/04/19(土) 19:53:31 ]
「キーボードより英大文字(A-Z)の文字列を変数cに入力し、それぞれの字種の出現頻度を表示するプログラムを作成せよ。
最初に配列の要素を0で初期化し、英大文字の入力はctrl+zにより終了するようにせよ。
ただし、英大文字以外が入力されたら、その文字数を変数othersでカウントして表示する事。」
という問題について考えていますが、今ここまで出来ました。

#include <stdio.h>
int main(void)
{
int other,i,a[26]; /*変数other、制御用変数i、配列a[26]を宣言*/
for(i=0;i<26;i++)
a[i]=0; /*forループで配列aの全要素初期化*/
puts("Input A-Z, end:ctrl+z");
while((i=getchar())!=EOF)
if

ここから、字種の出現頻度を求めるために一体どうすればいいのか分かりません…。
何かヒントを頂けないでしょうか。

525 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 20:01:06 ]
A-Zの出現個数をカウントする変数(たぶん配列になるね)を作成する。
文字に応じて対応したカウンタをインクリメントしていき、終了時に頻度を出力。

526 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 20:01:08 ]
宿題スレで聞けば

527 名前:デフォルトの名無しさん [2008/04/19(土) 20:13:04 ]
うおおおおおお
やっとCの入門書を読み終えたのだが、
フリーソフトとかで転がってるウィンドウズのプログラムとか
まだぜーんぜん無理な気がする。
だいたいそもそウィンドウの一文字も出てこないんだが、、、
コマンドプロンプトでさ、計算とかさ、文字列とかさ、
先がながーーーーーーーーーーーーい

みなさんいっぱしのプログラムが作れるようになるまで
どんくらいかかりました・・・?

528 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 20:21:44 ]
>>527
読むだけじゃダメなんだぜ?
理解し実践して身に付けなければ次へ進むことはできない。

529 名前:デフォルトの名無しさん [2008/04/19(土) 20:22:53 ]
9歳ぐらいからコード書き始めて
初めてリリースしたのが14歳でvimのパッチ。
自分のオリジナルソースは某3Dライブラリで19の時。
お遊びで始めたsocket通信利用のP2P対戦ゲームを作成したのが20の時。
採用された企業で売れる商品に携われたのが23歳の時。

14年ぐらいかな

530 名前:デフォルトの名無しさん [2008/04/19(土) 20:26:20 ]
経験歴と実力は関係ない 駄目なやつは20年でも無理



531 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 20:32:22 ]
>>529
特定しました

532 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 21:16:05 ]
sscanfの %n 指定子を使って文字数を取得したいのですが、意図し
たとおりの動作しません。良い方法が有れば教えてください。出来
ればstrlenは使いたくない。他におかしいところが有ったら教えて
貰えるとありがたい。
======
const char *str_src = "a\nab\nabc\nabcd";

res = sscanf(str_src, "%s%n%s%n%s%n%s%n%s%n",
str_dst[0], &n[0], str_dst[1], &n[1],
str_dst[2], &n[2], str_dst[3], &n[3],
str_dst[4], &n[4]);

for (i = 0; i < res; i++) {
printf("(%2d): %s\n", n[i], str_dst[i]);
}
======

結果(意図する結果は1,2,3,4)
======
( 1): a
( 4): ab
( 8): abc
(13): abcd
======

533 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 21:18:21 ]
%n は先頭からの位置であって、
前回読み出した位置からの相対位置を取得するものではない。

534 名前:側近中の側近 ◆0351148456 [2008/04/19(土) 21:22:03 ]
>>532
(っ´▽`)っ
%nは、sscanf関数の呼出しでこれまでに読み取った文字数を、その整数に書き込む。
つまり、
a・・・1文字
a\nab・・・4文字
a\nab\nabc・・・8文字
a\nab\nabc\nabcd・・・13文字
ということになる。

535 名前:532 mailto:sage [2008/04/19(土) 21:28:43 ]
>533 >534

早速の回答ありがとうございます。
どうさ結果からしてそうらしいとは思っていました。残念。
strlen呼ぶしか無いのかなぁ

536 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 21:37:30 ]
scanf は空白読み飛ばしたりするし、
%n だけじゃ難しいね。
strlen の方が簡単だと思う。

537 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 22:11:47 ]
strlenを使いたくない理由は?

538 名前:532 mailto:sage [2008/04/19(土) 22:15:32 ]
>537
改めて突っ込まれると特に理由は有りません(汗)
強いて言うならあまり美しくないと思ったくらい。

539 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 22:44:39 ]
>>532
ptr=str_src;
for(i=0;i<5;i++){
sscanf(ptr, "%s%n", str_dst[i], &tmp);
n[i]=strlen(str_dst[i];
ptr+=tmp;
}

540 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 23:44:51 ]
>>524

if(isupper(i))
a[i-'A']++;
else
other++;




541 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 23:51:09 ]
('A')

542 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 00:50:12 ]
while ('A') { ... }

543 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 01:20:11 ]
>>507
>>507
int n = (*kansu)();
でないと、偉大さがあいまいになる気がします‥‥‥。

544 名前:デフォルトの名無しさん [2008/04/20(日) 13:57:17 ]
テキストファイルから、特定の文字列に挟まれている文字列を抽出して、
一覧表示するプログラムを作りたいのですが、
何かヒントをください!!


545 名前:デフォルトの名無しさん [2008/04/20(日) 13:59:50 ]
>>544
strstrを使う

546 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 14:30:22 ]
あとは strncpy

547 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 14:33:57 ]
popen("grep 'keyWord.*keyWord' fileName", "r")
# 寧ろsedか

548 名前:デフォルトの名無しさん [2008/04/20(日) 21:06:28 ]
DXライブラリを使ったゲーム作成に入りたいです
現在、BorlandC++ Compiler 5.5(コンパイラ)とCPad(エディタ)の組み合わせで使っていますが
この環境でのDXライブラリを使う方法がいまいちわかりません
DXライブラリの公式サイトではBCC Developerというエディタで説明を進めているのですが、CPadでは使えないのでしょうか?

549 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 21:19:38 ]
使える

550 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 21:26:08 ]
>>549
そうですか!
しかし使い方がわかりません
どこを設定すればいいでしょうか?




551 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 21:36:12 ]
Cpadで書いてBCC Developerでコンパイルすればいいだけ

552 名前:548 mailto:sage [2008/04/20(日) 21:59:01 ]
>>551
そのまま使える方法はないですかね?

553 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 22:00:52 ]
質問の意味が分からない

554 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 22:02:41 ]
ある値が出るまでずっと同じ動作を繰り返して、
ある値が出たら終了するようにするには、どうやるべきでしょうか?

555 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 22:04:48 ]
>>554
do{x=動作;}while(x==ある値);

556 名前:548 mailto:sage [2008/04/20(日) 22:05:04 ]
>>553
中のファイルをどこに置けばインクルードされるのかがわからないんです・・・

557 名前:554 mailto:sage [2008/04/20(日) 22:07:37 ]
>>555
do whileの存在を忘れてました!試してみます
ありがとうございました!

558 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 22:09:25 ]
>>555
do{x=動作;}while(x!=ある値);
だな

559 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 22:10:59 ]
>>556
コンパイラから見える場所において置けよ

560 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 22:11:35 ]
>>556
よく分からん
BorlandC++ Compiler 5.5のスレかDXライブラリのスレいったほうがいい



561 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 22:13:06 ]
>>548
bcc32.cfg
ilink32.cfg
の中身を見てみることを勧める?

562 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 22:19:33 ]
>>561
なんで疑問系?>オレ

563 名前:548 mailto:sage [2008/04/20(日) 22:26:56 ]
>>559
.hや.libのフォルダが複数あってわかりません。。

>>561
パス追加するとインクルードはできてるようなのですがエラーも大量に出てきました。。


564 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 11:41:20 ]
文字列を#defineで通し番号を付けて
#define test1 "hogeA"
#define test2 "hogeB"
...
#define test10 "hogeJ"
と定義した場合、Nを変数としてtestNを呼び出すにはどうすれば良いでしょうか。
イメージとしては配列の場合のtest[N]のようにです。

565 名前:デフォルトの名無しさん [2008/04/21(月) 12:12:54 ]
C言語でシリアル通信するとき、

プログラムではどういう設定をしたらいいんでしょうか?

566 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 12:31:23 ]
>>565
OSの資料を読みましょう。

567 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 12:57:15 ]
const char*の配列にすればお望みの事ができるよ。

const char* test[] = { "hogeA", "hogeB", ... };

568 名前:564 mailto:sage [2008/04/21(月) 13:07:25 ]
>>567
完璧に思った通り動きました!!
的確な回答有難うございます。感謝します。

569 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 14:53:45 ]
memmove(&feattest[0],&featall[0], struct feature);
とするとコピーがなされません。どうしてでしょうか。

なお、
struct feature* featall;
struct feature* feattest;
struct feature
{

double x;
double y;
double a;
double b;
double c;
}
としています。


570 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 15:02:40 ]
>>569
featall, feattest が指す先はどこ?



571 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 15:04:04 ]
セミコロン書き忘れてるみたいだし、sizeofも単なる書き忘れ?

572 名前:デフォルトの名無しさん [2008/04/21(月) 15:08:32 ]
>>569
どうでもいいけど、構造体のコピーなら=を使えよ。

573 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 17:40:46 ]
構造体の多重間接参照が出来なくて困っています・・・。
struct set{
bool range;
int x;
int y;
bool ans;
};
main(){
struct set setA[5];
struct set setB[5];
(計算略)
ans=Judg(A,B);
}
bool Judg(struct set *setA,struct set *setB){
if((setA+((setB+i)->range))->range==true){/*問題発生っぽい箇所*/
return true;
}
return false;
}
みたいな感じなのですが、
(setA+((setB+i)->range))->range==true
って参照する事は出来ないんですか??

574 名前:573 mailto:sage [2008/04/21(月) 17:43:42 ]
すみません bool ansの位置が間違っていました。。
main関数内で宣言しています。

575 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 17:46:16 ]
setA[setB[i].range].range==true
こういうことをしたいのか?

576 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 17:47:30 ]
そもそもiはどこから出てきたんだろう

577 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 17:48:22 ]
>>573
コンパイルエラーならエラーメッセージを貼るべし

578 名前:573 mailto:sage [2008/04/21(月) 17:52:47 ]
>>575
そういう事をしたいです。

>>576
実際はforループの中に入ってるんですが、
プログラムがゴッチャゴチャになっているのでかなり抜粋しています。
多重間接参照の方法が知りたいと思いまして…

>>577
コンパイルは通ります。でも値が上手く入っていないようで常に0を返してきます。。
多重間接参照の部分は合っていますか?変に回りくどく聞いて申し訳ございません。。

579 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 18:01:07 ]
とりあえずmainの中でsetA[0].rangeとsetA[1].rangeの値を確認してみるべきだと思う

580 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 18:14:54 ]
(setA+bool型)だけどそういうプログラムなのかな?



581 名前:573 mailto:sage [2008/04/21(月) 18:27:07 ]
>>579
表示させてみた所、値がおかしいです。・・・常にfalse。。

>>580
はい。そこも伝わりづらくすみません。

質問投げっぱなしで申し訳ないのですが、
>>579さんの感じでやってみた所、原因は(計算略)の部分にありそうです。
ここに数百行詰まっていて助けを借りるのも憚られるので、自力でなんとかしてみます。
気にかけて頂きありがとうございました。。

582 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 18:55:44 ]
プロトタイプ宣言についての質問です。

/* 1つめのソース */
void init(int *a, int **p);   // ここに書く
int main() {
  int a = 0, *p = NULL;
  init(&a, &p);
  printf("%d\n", *p);
  return 0;
}
void init(int *a, int **p) {
  *p = a;
}

/* 2つめのソース */
int main() {
  void init(int *a, int **p);   // ここに書く
  int a = 0, *p = NULL;
  init(&a, &p);
  printf("%d\n", *p);
  return 0;
}
void init(int *a, int **p) {
  *p = a;
}

この2つはどちらも実行可能なのですが、どのように違うのでしょうか。
プロトタイプ宣言にローカルとかグローバルとかあるものなんでしょうか。
ちなみにコンパイラはgcc4.1.1です。

583 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 19:45:20 ]
ぶっちゃけ、どこにあろうと原則として、上にあればおk。それに関しては
  init(&a, &p);
の上にあればおkってことね。

584 名前:初心者 [2008/04/21(月) 19:46:27 ]
バブルソートの高速化手法について以下の用語を調べ説明せよって
問題があるんだけどう答えていいかわからない…教えてください

使う用語
亀(turtle)
コムソート(comb sort)

585 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 19:50:40 ]
>>584
www.google.co.jp/search?hl=ja&client=firefox&rls=org.mozilla%3Aja%3Aofficial&hs=VJE&q=comb+sort%E3%80%80%E4%BA%80&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja

586 名前:デフォルトの名無しさん [2008/04/21(月) 21:47:01 ]
バブルソートを高速化ってアホだな。

587 名前:デフォルトの名無しさん [2008/04/21(月) 22:02:13 ]
結局、ポインタを理解できなかった。

588 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:07:10 ]
俺はボインタッチが(y

589 名前:デフォルトの名無しさん [2008/04/21(月) 22:08:54 ]
Main関数で5つの整数を読み込み,
その5つの値の平均(double)を
だすプログラムを作成
せよ.
その時、5つの引数を受け取り,平
均を返す関数を呼び出し,返された平均値をmain関数
で画面出力すること


590 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:25:23 ]
宿題スレ行け



591 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:35:58 ]
>>589
どこからどうやって読み込むのかが不明なのでなんとも言えない

592 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:50:00 ]

double average(double a, double b, double c, double d, double e)
{
  return (a+b+c+d+e)/5.0;
}

int main()
{
 printf("%g¥n", average( 2, 3, 4, 5, 6));
 return 0;
}


593 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:53:37 ]
コマンドライン引数に指定したファイルのデータ長を取得するような
処理を作りたいのですが、上手くいきません

お手数かと思いますが、どなたか教えて下さい


594 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:57:43 ]
Cではファイルのサイズを取得する汎用なライブラリは存在しないので
環境依存の技を使う必要がある
実際にstdioライブラリで読み取ることのできるデータ数が問題なら
実際に読んでその数を数えるしかない

595 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:59:38 ]
つ ファイルを開いたらEOFまでポインタを進めて、ファイルの先頭からの
オフセット値で調べる

596 名前:さなぎさん [2008/04/21(月) 23:02:30 ]
カレンダー表示プログラムがうまくできません。
日付データを生成するプログラムは完成しました。そして
次のステップを目指していましたらとある問題に出会いました。
2009
000000000102030405060708091011121314151617181920212223242526272829303100000000000000
010203040506070809101112131415161718192021222324252627280000000000000000000000000000
010203040506070809101112131415161718192021222324252627282930310000000000000000000000
000000010203040506070809101112131415161718192021222324252627282930000000000000000000
000000000001020304050607080910111213141516171819202122232425262728293031000000000000
000102030405060708091011121314151617181920212223242526272829300000000000000000000000
000000010203040506070809101112131415161718192021222324252627282930310000000000000000
000000000000010203040506070809101112131415161718192021222324252627282930310000000000
000001020304050607080910111213141516171819202122232425262728293000000000000000000000
000000000102030405060708091011121314151617181920212223242526272829303100000000000000
010203040506070809101112131415161718192021222324252627282930000000000000000000000000
000001020304050607080910111213141516171819202122232425262728293031000000000000000000
2文字づつ読み込みまして
"00"の時は全角スペースを入れます。
完成イメージとしましては
2009年カレンダー

1月   2月    3月

4月   5月    6月

7月   8月    9月

10月  11月   12月

というように表示させたいのですが、fgetsコマンドがうまく使えません。
どなたかご教授くださいな

597 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 23:03:22 ]
>>593
1. stat(filename, &stat);
2. fp=fopen(filename,"wb");fseek(fp,0L,SEEK_END);ftell(fp);fclose(fp);

598 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 23:06:24 ]
>>593

#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char* argv[])
{
 struct stat buf;
 for(int i = 1; i < argc; i++)
 {
  stat(argv[i], &buf);
  printf("%5ld bytes <%s>¥n", buf.st_size, argv[i]);
 }
 return 0;
}

599 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 23:08:08 ]
>>596
sscanf(p, "%2d", &num);
p+=2;
printf("%3.0d", num);

600 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 23:14:55 ]
>>596

{
 char rdbuf[256];
 char numb[4];

 fgets(rdbuf, 256, stdin);
 int year = atoi(rdbuf);

 numb[2] = 0;
 for(int i = 1; i < 12; i++)
 {
  fgets(rdbuf, 256, stdin);
  for(int j = 0; j < 31; j++)
  {
   numb[0] = rdbuf[j*2];
   numb[1] = rdbuf[j*2+1];
   printf("%s", atoi(numb) ? numb : " ");
  }
//... 月の表示とかは適当にどそ



601 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 23:40:23 ]
>>594-595>>597-598
レスありがとうございます
>>598さんのソースを使って実行してみたところ、取得できました
が、ファイルサイズの取得でした
無知で申し訳ありませんがファイルサイズ=データ長という認識でいいのでしょうか?



602 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 23:42:41 ]
自分で書いたんだろ
どういうつもりでデータ長と書いたんだよ

603 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 23:47:10 ]
>>602
すみません、気分を損ねるようなつもりは全くありませんでした
例えばstrlenを使うようなイメージでした
ファイルサイズを取得する処理はできていたのですが、データ長を取得する処理だと言われ
こちらにお邪魔した次第です。ファイルサイズとデータ長の違いがわからないのです

教えて頂いたのに本当にすみません




604 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 23:52:33 ]
いや別に怒ってはいなくてさ

データ長てのはファイルに何かしらの形式でデータが入ってて、
その長さとかそういう事なの?

605 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:03:49 ]
>>604
実際にやりたかったのは指定したファイル(形式は一定でない)のデータ長を取得して
既に出来上がっている関数に飛ばすと言った処理をやりたかったのです
データ長と書いたのは恥ずかしい話なのですが関数の引数コメントに
「ファイルデータ長」と書いてあったからで、何故データ長を使用するのかわかりません

自分なりに調べてファイルサイズを取得、関数に引き渡す処理を作成したのですが
口頭で説明したところ「ファイルサイズじゃなくてデータ長」と言われ、違いがわからなかったのです
1バイト文字、2バイト文字を混ぜたようなテキストファイルを作成した時のバイト数(目算)と
単純なファイルサイズに違いがないので、何がどう違うのかすらわからなくて・・・

それでここにお邪魔したのですが、調べ方が足りなかったように思えます
自分が甘かったです。本当にすみませんでした


606 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:05:44 ]
そいつに違いを聞けよ

607 名前:582 mailto:sage [2008/04/22(火) 00:14:48 ]
>>583
スタイルの違いってことなんですね。
はじめて見た形だったので
関数のスコープが変わるのかな、なんて勘違いしそうでした。

どうもありがとうございました。

608 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:16:03 ]
あーエスパーで答えると
1レコード固定長で可変長文字列データを複数レコード格納する場合、
ファイルサイズ != データ長 となるかもしれんね

609 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:18:44 ]
>>605
本人に聞け
わかるまで聞け
要件を徹底的に具体化するのはプログラマの基本だ

610 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:24:05 ]
>>605
メモリに展開しろって意味だ、多分



611 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:26:12 ]
>>607
プロトタイプ宣言以前の時代から使っているロートルに多い。
あいつらは放っておくとこんなソースを書きかねない。
main()
{
double sqrt();
printf("%g\n", sqrt(.1));
}

612 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:28:19 ]
>>611
まっとうなロートルは
sqrt(1.0);
または
sqrt((double)1);
と書く

613 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:30:21 ]
>>611
それも立派なプロトタイプ宣言なのだが

614 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:34:22 ]
>>612
0.1であることに注意。

>>613
一般的に、引き数リストがないものはそう呼ばないのでは?
いずれにしても「その頃からやってるロートル」なので、一応C99も「知っている」らしいよ。

615 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:46:50 ]
>>614
引数リストのないプロトタイプ宣言はAnsi-C以前のもの
いわゆるK&RのC

そのころからやっている超ロートル


616 名前:デフォルトの名無しさん [2008/04/22(火) 01:51:12 ]
スレ違いだったらスマソ
今からC言語を勉強しようと思ってるんだが
windowsとLinuxどっちでやったほうがいいの?

617 名前:デフォルトの名無しさん [2008/04/22(火) 01:54:53 ]
windows

618 名前:デフォルトの名無しさん [2008/04/22(火) 01:58:58 ]
>>617
理由は?

619 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 01:59:08 ]
今使ってるパソコンでやればいいだろ。

620 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 02:02:15 ]
なんのためにCを勉強したいかによる
趣味なら自分のマシンに合わせればいい
職業にしようと思ってるんならまずWindowsをやり余裕があればUnix/Linux



621 名前:デフォルトの名無しさん [2008/04/22(火) 02:04:05 ]
windowsのほうが普及しているし統一されているから
UNIXは派生が多いし普及がいまいち

622 名前:デフォルトの名無しさん [2008/04/22(火) 02:05:46 ]
いずれにしても標準のC/C++を勉強するなら変わりない

623 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 07:02:18 ]
>>622

だよな。コンソールアプリしか作れんが。
標準を覚えたいならVCなんかは却って邪魔かも知れん。
ただし、将来Windowsアプリの仕事をしたい、
と思うなら「Cを覚える」というより「VC++を覚える」、という感覚のほうがいい。


624 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 14:14:29 ]
C言語、全くわからないのでこれから勉強しようと思うのだが参考になる書物とかある?
スレチだったらスマソ

625 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 14:15:39 ]
K&R
独習C
ダイテルのC言語プログラミング
CFAQ

626 名前:デフォルトの名無しさん [2008/04/22(火) 15:08:04 ]
>LYSOZYME
MKRLIKKSAIGMFAFFVVAASGPVFAAVGDQGVDWSKYNGTYGNFGYAHDKFAFSQIGGT
YGGTFVDQATYETQVASAIAQGKRAHTYIWYQVGGSQEVAKAALDRYLPKIQTPKNSIVA
LDYEGGASGNKQANTDAILYGMRRVKAAGYTPMYYSYKPYTLANVNYKQIIKEFPKSLWI
AAYPNYEVTPVPNYSFFPSMDGISVFQFTSTYVAGGLDGNVDLTGITGNGYGKQKGQEVK
PNTATPAIENGKEANEVKGNDVEVGMTVKVNFGAKNYATGETIPQWVKGQPHKIIQKNGD
TVLLDGIMSWLSVHDVETIDASTSQPTTPAKSYIVKQGDTLSGIASNLGTNWQELARQNS
LSNPNMIYSGQVISLTGGQSGATARTYTVQSGDNLSSIARRLGTTVQSLVSMNGISNPNL
IYAGQTLNY


が格納されているファイルを読み込み各文字が何%あるかを出力ファイルに書き出すプログラムをつくって

627 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 15:31:42 ]
作って・・・からどうすればいいんだろう?
とりあえず、作って・・・
捨てちゃった。

total 437
A : 8.92448513% ( 39)
B : 0.00000000% ( 0)
(中略)
Y : 6.63615561% ( 29)
Z : 0.22883295% ( 1)


628 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 15:38:57 ]
>>626
#include <stdio.h>
#include <string.h>

char* hoge = "LYSOZYMEMKRLIKKSAIG・・・ 〜(省略)

void main(void)
{
    int slen = strlen(hoge), count[26] = {0}, ic = 0;
    for (ic = 0; ic < slen; ic++){
        if (hoge[ic] >= 'A' && hoge[ic] <= 'Z')
            count[hoge[ic] - 'A']++;
    }
    for (ic = 0; ic < 26; ic++)
        printf("[%c] = %.1f%%\n", 'A' + ic, count[ic] * 100.0 / slen);  
}

629 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 17:43:36 ]
>>628
おぬしもワルよのう( ̄ー ̄)

630 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 17:46:43 ]
>ファイルを読み込み
日本語が理解できない人かw



631 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:22:54 ]
標準入力からEOFが入力出来ないって本当ですか!?

632 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:24:53 ]
うそです

633 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:38:31 ]
>>586
安定なソートですから、それなりに有用な場合があるのかもしれません。<バブルソートの高速化

634 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:38:46 ]
宿題スレの隔離から出てこないで下さい><

635 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:48:22 ]
バブルソートをどうにかしようって考えるよりも、ソートを高速化する過程に
効率の悪いバブルソートが用いられるのはよくあることだ。
そうやって、アルゴリズムを改良すると、処理時間、計算量が減って
効率が良くなるという勉強をするのさ、そういった分野の学校では。

636 名前:582 mailto:sage [2008/04/22(火) 18:55:24 ]
このスレ結構にぎわってるんですね。
Cしかできない俺が最近はやりのJavaScriptに劣等感を抱いているんだが、
バカにしたもんじゃないなって嬉しくなった

637 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 19:10:25 ]
うわー、名前でちゃった...
...ついでに質問なんですが、
/* src1.c */
int a;              // グローバル変数
int main() {
 int x;
  x = sub(a);
  printf("x: %d\n", x);
  printf("a: %p\n", &a);
  return 0;
}
/* src2.c */
int a;              // グローバル変数
int sub(int n) {
  printf(" sub::a: %d\n", a);
  printf(" sub::a: %p\n", &a);
  return n+1;
}

2つソースファイルで定義してるグローバル変数aは
それぞれでメモリの割付が行われると思うのですが、
同じアドレスのもののようなんです。
ということは、extern記述子は冗長な表現ってことになってしまうんでしょうか?
# externって他のソースファイルで定義してるからここでは宣言のみ、
# ですよってことだったと認識していたのですが

638 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 19:11:55 ]
おいっ、ナンバーサインを全角で書くな・・・NG登録してんのにw

639 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 19:36:46 ]
>>637
リンカがエラー出してない?
シンボルが重複してますよって

640 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 19:55:48 ]
>>639
出ていません。
コンパイラはgccで、文法チェックが一番厳しいオプションをつけてコンパイルしても次の警告が出るだけです。
src1.c: In function 'main':
src1.c:6: 警告: implicit declaration of function 'sub'

# >>637のソースはちょっと編集していますので、6行目ではなくて実際は4行目ですが。(重要なことではありませんでしたね)
いかがでしょうか。



641 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 20:05:16 ]
GCCのバージョンは?
古いとそういう挙動を示す。
ANSIではエラーにならなければならないが。

642 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 20:10:11 ]
gcc-4.1.1です。
2007年1月5日にリリースされているみたいなので、古くはないとは思うのですが
何かバグでもあるのでしょうか...

643 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 20:12:08 ]
gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-51)
が詳細です。連レスすみません。

644 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 20:20:26 ]
シンボルの重複はリンカの担当だから、ldの問題。
--allow-multiple-definitionあたりが渡ってないか?

645 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 20:41:56 ]
int* TEST(int size)
{
int *retest = malloc(sizeof(int)*size);

return retest;
}

int main()
{

int *test;

test = TEST(5);

.....

free(test);

return 0;
}

こういうことをするつもりなのですが、関数TEST内でmallocしたものはfree(test)で開放できてるのでしょうか?

646 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:11:37 ]
できるよ

647 名前:645 mailto:sage [2008/04/22(火) 21:22:44 ]
ありがとう

648 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:37:15 ]
>>645
それにしても、なにか怖い構造だね。

649 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:06:29 ]
二つの整数値を読み込んでその差が10以下なら「差は10以下です。」、
差が11以上なら「差は11以上です。」と表示するプログラムを作りました。
論理OR演算子を使うとするとどのようにすればよいのでしょうか?

#include <stdio.h>
int main (void)
{
int n1, n2, sa;

puts("二つの整数を入力してください。");
printf("整数1:"); scanf("%d", &n1);
printf("整数2:"); scanf("%d", &n2);

sa = (n1 > n2) ? n1 - n2 : n2 - n1;

if( sa >= 11)
puts("それらの差は11以上です。");
else
puts("それらの差は10以下です。");

return 0;
}

650 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:07:28 ]
至って普通だと思うけど何で?



651 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:08:12 ]
>>650
>>648


652 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:15:30 ]
>>649

if(n1<n2-10 || n2+10<n1){
  ;
else
  ;

まあどのみちオーバーフロー対策してないがね

653 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:19:22 ]
>>649

こうかな?

#include <stdio.h>
int main (void)
{
int n1, n2, sa;

puts("二つの整数を入力してください。");
printf("整数1:");
scanf("%d", &n1);
printf("整数2:");
scanf("%d", &n2);

sa = n1 - n2;

if ((sa >= 11) || (sa <= -11)) {
  puts("それらの差は11以上です。");
} else {
  puts("それらの差は10以下です。");
}

return 0;
}

654 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:19:39 ]
>>649
sa = n1 - n2;
 if(sa < -10 || sa > 10)
  puts("...以上です。");
 else
  puts("...以下です。");
何かの宿題?

>>651 気を悪くしたら許してくれ。
malloc() free() の関係はできるだけ見通しがいいようにという余計な話をした。
作り手の趣向だから非難してるんではないよ。

655 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:21:17 ]
>>653
ども。リロードしてなくて私も送ってしまった。。

656 名前:649 mailto:sage [2008/04/22(火) 22:27:01 ]
皆様ありがとうございます。
大変参考になりました。

現在C言語の入門書を買って独習している段階でして、
本の中の演習問題が>>649で論理OR演算子を使えという指示でした。
ちょっと解答が思いつかなかったので自分で作れる範囲で作ってみたのですが、
やはり問題文を無視しては解答にはならんだろうw、と質問させて頂きました。

657 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:33:12 ]
>>656
独学・・なるほど。ま、がんがんソース書きまくれ。

658 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:01:56 ]
まさかとは思うけど
( sa = n1 - n2 ) >= 0 || ( sa = n2 - n1 );
だったりしてw

659 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:26:35 ]
>>654

> >>651 気を悪くしたら許してくれ。
> malloc() free() の関係はできるだけ見通しがいいようにという余計な話をした。
> 作り手の趣向だから非難してるんではないよ。

確かにあまりいい設計ではないね。
やむを得ずそうなっちゃうこともあるけど。


660 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:38:16 ]
メモリアロケートを関数で行なわなければならないなら、こんな戦略かな。
・関数名にallocなどのキーワードを含めるようにして確保も行なっていることを明示する。
・(freeするだけになってしまうかもしれないが)解放用の関数も用意し、使ってもらう。



661 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 00:21:58 ]
ついでにログを仕込んだり、アロケート回数を管理したりとかね

662 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:44:35 ]
>>644
わたしはldについて理解が浅いので、調べていたらレスに時間が掛かってしまいました。
ごめんなさい。

$ gcc -c src?.c
でコンパイル直前まで終わらせて、-vオプションをつけて何をしているか調べてみました。
$ gcc -v src?.o -o a.out
Using built-in specs.
Target: i386-redhat-linux
コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared
 --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
 --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi
 --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux
スレッドモデル: posix
gcc バージョン 4.1.1 20070105 (Red Hat 4.1.1-51)
/usr/libexec/gcc/i386-redhat-linux/4.1.1/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2
 -o a.out /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crt1.o /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crti.o
 /usr/lib/gcc/i386-redhat-linux/4.1.1/crtbegin.o -L/usr/lib/gcc/i386-redhat-linux/4.1.1
 -L/usr/lib/gcc/i386-redhat-linux/4.1.1 -L/usr/lib/gcc/i386-redhat-linux/4.1.1/../../.. src1.o src2.o -lgcc --as-needed
 -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i386-redhat-linux/4.1.1/crtend.o
 /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crtn.o

どうやら--allow-multiple-definitionオプションは入っていないようです。
これをコピペして、敢えて--allow-multiple-definitionをつけてリンクしてみましたが、
どちらにしても、>>637で言ったようにグローバル変数aは同じアドレスのようです。

あとどこを調べてみたらいいでしょう...よろしくお願いします。
長文失礼しました。

663 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 12:57:13 ]
>>662
-fno-common オプションをつけるといいらしい

664 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:02:31 ]
コンパイラの動作なんか気にする前に素直に
他のソースに実体があることを示したいならexternをつけなさい
そのファイル内でしか使わないことを確実にしたいならstaticをつけなさい

665 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 14:39:16 ]
>>663
$ gcc -fno-common src?.c
/tmp/ccuJF0uA.o:(.bss+0x0): multiple definition of `a'
/tmp/ccU9yxgD.o:(.bss+0x0): first defined here

でました。
このフラグが通常で立ってないということは、
bss領域に割り当てられる変数は、コンパイラ任せにしないでね、
ってことなんでしょうね。
プログラマが管理できてない部分にエラーメッセージもなしっていうのはちょっと怖いですね。

面白かったです。
ldで多重定義をチェックするやりかたも調べてみたいと思います。

ありがとうございました。

666 名前:デフォルトの名無しさん [2008/04/23(水) 16:04:05 ]
おまえらはよ作れや!!!!!!!!!!!!!!

このオタク野郎

ぼけ

あほ

かす

ニート

日本の恥



667 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:09:28 ]
>>666 自己紹介乙。

668 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:19:22 ]
まあ>664でFAだがな

669 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:32:13 ]
char cRet[512];

printf("ファイルパス:\n");
fgets(cRet, 512, stdin);

こんな感じで画面上に入力された文字(ファイルパスを想定)を取得した後に
fopenでファイルを開こうと思っているのですが、何度やっても開けずにエラーになります
ファイル自体はちゃんと存在しているファイルなのですが、何が悪いのでしょうか?


670 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:35:03 ]
>>669
馬鹿か?それだけだされてわかるわけねーだろwwww



671 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:38:48 ]
>>669
errnoを調べる

672 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:42:24 ]
>>669
受け付けたcRetには入力したファイル名+改行コードが入ってんじゃね?

673 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:43:49 ]
>>669
ttp://oshiete1.goo.ne.jp/qa3311194.html

この辺だろ、多分

674 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:46:22 ]
ゲッツと言えば、今日放送されたクイズヘキサゴン2に出演してたなぁ。

675 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:47:52 ]
>>669
末尾の \n を削除しれ

676 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:49:32 ]
すいません\nを削除するにはどうしたらいいんでしょうか

677 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:50:10 ]
ちょっとは頭使え

678 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:50:59 ]
>>672>>673>>675
ありがとうございます
ググったらやり方が載ってたので試してみます


679 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:51:15 ]
嫌なら環境にもよるが、EOFを入力しちゃいな。Ctrl+Zとか+Dとか。
むりぽなら別のライブラリで入力を受付ちゃいな。

680 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:54:28 ]
二度と入力できなくなるじゃないか・・・



681 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:02:20 ]
突然すまん

#include <stdio.h>
main(){
int *A, n, i;
printf("数字を入力してください\n");
for(i=0; i<n; i++)
scanf("%d", &A[i]);
printf("ヒープソートの結果\n");
for(i=0; i<n; i++)
printf("%d", heapsort(A[i]));
}
void heapsort(int *A, int n){
int i;
heapify(A, n);
for(i=n-1; i>0; i--)
A[i] = deletemax(A, i+1);
}
void heapify(int *A, int n){
int i;
for(i=n/2-1; i>=0; i--) downmax(i, A, n);
}

つづく

682 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:05:05 ]
void downmax(int i, int *A, int n){
int j;
j = 2*1+1;
if(j >= n) return;
if(j+1<n && A[j]<A[j+1])
j = j+1;
if(A[j] > A[i])
{
swap (i, j, A);
ownmax(j, A, n);
}
return;
}
int deletemax(int *A, int n){
int max;
max = A[0]; A[0] = A[n-1];
downmax(0, A, n-1);
return(max);
}
void swap(int i, int j, int *A){
int temp;
temp = A[i]; A[i] = A[j]; A[j] = temp;
return;
}

コンパイル使用とすると
error C2371 heapsort が再定義されています
同様にheapify downmax swap が再定義されてるといわれる。
Microsoft.NET Framework SDK で C です。

683 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:10:14 ]
関数プロトタイプ書け。

684 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:12:34 ]
>>682
関数は使用(呼び出し)に先立って宣言する必要があります。

685 名前:682 mailto:sage [2008/04/24(木) 00:21:49 ]
>>683,684

ググってみたので、

void heapsort(int *A, int n);
void heapify(int *A, int n);
void downmax(int i, int *A, int n);
void deletemax(int *A, int n);
void swap(int i, int j, int *A);
を追記したのですが
heapsort.c(17) : warning C4047: '関数' : 間接参照のレベルが 'int *' と 'int' で
異なっています。
heapsort.c(17) : error C2198: 'heapsort' : 実引数が少なすぎます。
heapsort.c(17) : error C2095: 'printf' : void 型引数を関数に渡そうとしました。2
番目の引数にエラーがあります。
heapsort.c(26) : error C2120: void 型がほかの型と同時に使われました。
heapsort.c(51) : error C2371: 'deletemax' : 再定義されています。異なる基本型です

heapsort.c(6) : 'deletemax' の宣言を確認してください。

orz・・・ とりあえずエラーナンバーでググってきます

686 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:22:11 ]
>>637
規格スレで聞いたところ
pc11.2ch.net/test/read.cgi/tech/1201153965/133-139
ということだそうです

687 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:28:45 ]
>>685
使っている処理系の標準ライブラリーにheapsort関数etcがあるんじゃないですか?
名前を変えてみるとか

688 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:35:18 ]
>printf("%d", heapsort(A[i]));
これはheapsortの使い方がよろしくないし。
>int deletemax(int *A, int n){
>void deletemax(int *A, int n);

プロトタイプと実体は一致してないし。

コンパイラが文句言うのも当然というか。

689 名前:682かつ685 mailto:sage [2008/04/24(木) 00:37:28 ]
>>687
heapsortをheapsortsに変えてやってみたのですが、
変化なし・・・

一応凡ミス :→;、 void→intとかを修正したところ

以下のエラーが。

heapsort.c(17) : warning C4047: '関数' : 間接参照のレベルが 'int *' と 'int' で
異なっています。
heapsort.c(17) : error C2198: 'heapsorts' : 実引数が少なすぎます。
heapsort.c(17) : error C2095: 'printf' : void 型引数を関数に渡そうとしました。2
番目の引数にエラーがあります。

17行目周辺は

scanf("%d", &A[i]);
printf("ヒープソートの結果\n");
for(i=0; i<n; i++)
printf("%d", heapsorts(A[i])); //17行目
}


void heapsorts(int *A, int n)
{
int i;
heapify(A, n);
for(i=n-1; i>0; i--)
A[i] = deletemax(A, i+1);
}
です。

690 名前:682 mailto:sage [2008/04/24(木) 00:39:51 ]
>>682
後者は修正しました。
タイミングずれたけど689のように。

heapsortの使い方・・・調べてみます。



691 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:42:46 ]
>>689
> heapsort.c(17) : warning C4047: '関数' : 間接参照のレベルが 'int *' と 'int' で
heapsortsの第一引数(int *A)がアドレス参照してない。
17行目でheapsorts(&A[i])とする

> heapsort.c(17) : error C2198: 'heapsorts' : 実引数が少なすぎます。
関数の引数は2個あるのに渡してるのは1個だけ。
これiでも渡すの?

> heapsort.c(17) : error C2095: 'printf' : void 型引数を関数に渡そうとしました。2
heapsortsの戻り値がvoid型だから。
戻り値をint型にして値を戻すように修正する。

692 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:44:31 ]
まあ、Aが未確保というオチはあるし。
たぶん結果って言っているわけだから、heapsortはfor文の前段で仕掛けて、
for分の中はA[i]の表示だけで良いような気がするわけ。

693 名前:691 mailto:sage [2008/04/24(木) 00:44:54 ]
あーごめん。配列渡してるのか
渡すのは
heapsorts(A, i)
とかでよろしく

694 名前:682 mailto:sage [2008/04/24(木) 00:52:37 ]
>>691 どうもです。
1番目と3番目を修正ました。

ただその2番目、
692,693の言ってる部分がまだ理解できてないす・・・

現状
for(i=0; i<n; i++)
printf("%d", heapsort(&A[i]));
}
int heapsort(int *A, int n)
{
int i;
heapify(A, n);

エラー
heapsort.c(17) : error C2198: 'heapsort' : 実引数が少なすぎます。

printf("%d", heapsort(&A[i]));を
printf("%d", heapsort(A, i));??

無知fで申し訳ない・・・

695 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:21:14 ]
無知と言うよりも、基礎を学ばずにいきなりヒープソートだなんて、一体全体何考えているんだか。

696 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 02:04:17 ]
引数の意味すらわかってないようにも見えるしな

697 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 08:08:30 ]
>>680
いえ、fclose() されるわけではないので、大丈夫です。

698 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 08:28:26 ]
>>697
行の途中では^zや^dは利かないんじゃないか?
逆に、利いたとしたらストリームが閉じられているわけだから
二度と入力できなくなるぞ。

699 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 09:19:29 ]
ttp://www.bohyoh.com/CandCPP/C/Library/fgets.html
> 改行文字を読み取ったとき、またはファイルの終わりを検出したときに、
> 文字の読取りは終了し、
改行コードまで取り込む性質があるわけだから、入力>改行で終わらせたら
当然改行コードは含まれてしまう。そこで、それを排除して取り込めばおk。
まぁ、やはり手段としてはEOFを入力するのもありだが、別のライブラリを用いては?

700 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 09:24:27 ]
そこで、gets関数



701 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 09:43:19 ]
っツーか、面倒くせぇ〜からmainへの引数として、実行する際にパラメーターに
ファイル名を渡して処理しチャイナと。

702 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 13:32:34 ]
>>686
わざわざ質問してくださってありがとうございます。
pc11.2ch.net/test/read.cgi/tech/1201153965/139
の後半で述べられてることについて、こちらでも確認しました。

片方のみ初期化すると、その初期値で定義され、両方初期化すると
$ gcc src?.c
/tmp/cc4a7Yre.o:(.data+0x0): multiple definition of `a'
/tmp/ccwrP69I.o:(.bss+0x0): first defined here
collect2: ld はステータス 1 で終了しました
と望むエラーメッセージが表示されました。

ちなみにわたしはグローバル変数について勘違いしていたようです。
グローバル変数の宣言は、0での初期化が同時に行われると思っていたのですが、
実際は実行時に0で初期化される.bss領域ということを失念しておりました。

一応nmでシンボルのフラグをチェックしてみたところ、>>637は.bss領域にあり、
片方だけ明示的に初期化してもう片方にexternを使用すると.data領域に確保されることを確認しました。


グローバル変数は普通、明示的に初期化して使うものなんでしょうね。
グローバル変数を使う機会が多くないもので知りませんでした。

ありがとうございました。

703 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 17:25:19 ]
CreateProcessで起動したプログラムをSendMessageで終了させるにはどうしたらいい?
検索してたらこんなん見つけたんだけど

引用元:homepage2.nifty.com/DSS/VCPP/API/ProcessEnd.htm
BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
DWORD dwThreadId, dwProcessId;

dwThreadId = GetWindowThreadProcessId(hwnd, &dwProcessId);
if (dwProcessId == (DWORD)lParam) {
PostMessage(hwnd, WM_CLOSE, 0, 0);
}

return TRUE;
}
// pi は CreateProcess() したときの PROCESS_INFORMATION
EnumWindows(EnumProc, (LPARAM)pi.dwProcessId);

この使い方解説誰かお願い

CreateProcess
→FindWindow
→SendMessage

これだとFindWindowがおかしくてできなかった

704 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 17:40:45 ]
FindWindowが駄目なら
FindWindowExを使えば良いじゃない。

705 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 17:44:48 ]
Exは子ウィンドウのときだろ。

「FindWindowがおかしい」
キャプションかクラス名の指定がウンコなんじゃねーの。

706 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 18:00:48 ]
>>703
使い方解説もなにも、
そのEnumProc関数をどこかに作っておいて

>EnumWindows(EnumProc, (LPARAM)pi.dwProcessId); 

を実行するだけじゃない?

707 名前:703 mailto:sage [2008/04/24(木) 18:08:43 ]
CreateProcess(NULL, "sample.exe", NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
hWnd = FindWindow("sample", NULL);

sample.exeはSleep(1000)で無限ループさせてる

hWndが0になってしまうorz

708 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 18:21:16 ]
>>707
プロセスを作ってすぐにFindWindowしても、sample.exeの方はまだCreateWindowを呼ぶ前かもしれないし
WaitForInputIdleとか試してみたらどう

709 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 18:24:41 ]
sleepで無限ループさせてるなら、なぁ。

sample.exeのキャプションに"sample"が無いんじゃねーの。
Spy++でも使って調べてクラス名でやってみれ。

710 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 18:26:59 ]
いつまでスレチにかまってんだよ



711 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 18:41:57 ]
>>681

 int *A;
 scanf("%d", A[0]); // この時点ば終わっている

貴方はポインターの使い方を全く理解していない。

 int iValueBody[256];
 int* A = iValueBody;

A の実体が無いのに、そこに値を放り込むなんてダメだよ。
なのでそれ以降はナンセンス。

712 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 18:55:13 ]
nに値が入ってないのにループ回してるほうが先だろw

713 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:09:51 ]
>>706,>>709
ありがとう、後でやってみる

>>708
sampleはコンソールアプリなんだ

714 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:28:00 ]
>>713
Win32API質問箱 Build65
pc11.2ch.net/test/read.cgi/tech/1208847084/

715 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:36:39 ]
>>714
そっち行ってみます

716 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:51:36 ]
>>712
むむむ。彼の書き込みをみると、n には程よい値が入っていてくれて A はどこかちゃんとしたメモリー空間を示していてくれる・・という、とてつもない期待をしてるんだろうなぁ。(遠い目)
人工知能の C++MiKu とかだったら、希望通りにしてくれるのかもしれない(今は無くとも将来はまんざらでないかも)

717 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:59:59 ]
少なくともソートとかに手を出すレベルじゃないのは確かだな

718 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:50:32 ]
>>716同感です。

引数の渡し方がわからなくてあれだけ書いてるんだから
なんかサンプルみながらやってるんじゃない?

719 名前:デフォルトの名無しさん [2008/04/24(木) 21:58:27 ]
自分で入力したデータの件数分の平均身長、平均体重を出したいです。
(人数は一番最初に入力)

この場合、変数は、int型のweight height の他何が必要でしょうか?

720 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:59:46 ]
10人に聞けば10通りの答えが返ってくる。
プログラムの書き方次第でどうにでもなるから答えようがない。



721 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:01:41 ]
>>719
がんばればint型一個でできるよ

722 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:06:10 ]
人数受け取ってmalloc

723 名前:デフォルトの名無しさん [2008/04/24(木) 22:06:54 ]
C言語におけるリテラル文字列の取り扱いですが、
置かれるメモリプールとかライフタイムとか
どうであるのが正しいんでしょうか?

例えば以下のコードはありですか?

const char * func()
{
return "AAA";
}


724 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:08:07 ]
リテラル文字列は静的な領域に置かれる。

725 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:08:28 ]
>>723
普通にありです。

726 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:25:05 ]
>>724-725
回答ありがとうございました。
実装依存とかだと困るなーと思ってたんですが
そうじゃないんですね。

727 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:59:24 ]
ファイルパス文字列(という言い方をしますが)の左右のダブルクォーテーションを削りたいです
ファイルパスの途中にスペース(C:\Program Filesみたいな)があるとダブルクォーテーションで
括られると思うのですが、これを削る方法はあるのでしょうか?



728 名前:側近中の側近 ◆0351148456 [2008/04/24(木) 23:05:22 ]
>>727
(っ´▽`)っ こういう感じ。
void deleteDoubleQuotation(
  char *c1,
  char *c2
){
  if(c1[0] = '"'){
    strcpy(c2, &c1[1]);
  }
  else{
    strcpy(c2, c1);
  }
  if(c2[strlen(c2) - 1] = '"'){
    c2[strlen(c2) - 1] = '\0';
  }
  return;
}

729 名前:719 [2008/04/24(木) 23:09:08 ]
質問変えます。
件数分の身長、体重を集計・・・するんですが、
どういう計算処理をすればいいんでしょうか?

730 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:12:11 ]
合計して人数で割る



731 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:15:54 ]
>>728
VB厨の私ですが感動しました
探して早速明日組んでみます(゚▽゚)

732 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:15:58 ]
>>729 つか, 算術的にはどういう計算をするかを考えないのか?


733 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:20:08 ]
もしダブルクォーテーションならスキップ

734 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:30:11 ]
>>729
そういうのを考える事が初めの段階だと思うけど・・
アルゴリズムの本でも買ったらどうだろう
>>730のとおり算数と同じ処理をしてあげればいい


735 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:33:49 ]
単純に考えた場合
[入力用]
int型 人数、1人の身長、1人の体重
[ほか]
int型 身長の合計、体重の合計、ループ用変数

こんなもん

736 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:39:02 ]
〜略〜

ループ{
 身長体重入力
 ついでに人数カウント


合計・平均計算

〜略〜


737 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:46:08 ]
>>713
そのEnumWindows()を使う手法はもちろんウィンドウを持つプロセスに対
してしか使えない。
コンソールアプリだとふつうはメッセージを受けとらないから、
TerminateProcess() するしかないんじゃないかな。


738 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:53:50 ]
>>728
家にある環境でやってみたらできました(゚▽゚)

if(c2[strlen(c2) - 1] = '"')
c2[strlen(c2) - 1] = '\0';

if(c2[strlen(c2) - 2] = '"')
c2[strlen(c2) - 2] = '\0';

改行コード?分があるようだったので-2にしてみたら綺麗に取れました
ありがとうございますー

739 名前:737 mailto:sage [2008/04/24(木) 23:55:49 ]
>>737
他のスレで話が進んでいた。とても虚しい気分になった…


740 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 00:26:19 ]
〜略〜
int 人数、1人の身長、1人の体重
int 身長の合計、体重の合計、ループ用変数

人数 = 入力()

ループ {
 1人の身長 = 入力()
 1人の体重 = 入力()
 身長の合計 += 1人の身長
 体重の合計 += 1人の体重
} (ループ用変数が人数になるまで)

結局平均が欲しいのかよくしらないけど、とにかく集計の計算
〜略〜

まとめてみた。できそうじゃないか!



741 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 00:51:03 ]
char *c, data[200];
c = fgets(data, 200, stdin);
if(c != NULL && data[0] != '\n')

というのを、
char data[200];
if((fgets(data, 200, stdin) != NULL) && data[0] != '\n')
と書いても大丈夫でしょうか。

742 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 00:53:37 ]
>>741 おk

743 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 00:55:19 ]
大丈夫なのと書いた方がいいのとの間には
大きな壁があるけどな

744 名前:TT mailto:s_040095@hotmail.co.jp [2008/04/25(金) 01:37:26 ]
「Continue文」を使った宿題が出ました
内容が「60点以上を合格とし、合格者の平均点を出力する」です
誰かソースを教えて下さいm(_ _)m

745 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 01:39:31 ]
>>744
宿題スレへどうぞ。
いや、どちらかと言えば半年ROMってから出直すことをお勧めしますが。

746 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 01:40:48 ]
>>744
ソースを教えろといわれても、個人の成績のデータの入力仕様がわからないから教えられないだろ。

747 名前:TT mailto:s_040095@hotmail.co.jp [2008/04/25(金) 02:03:32 ]
「個人の成績のデータの入力仕様」は適当な数値で・・・

748 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 02:04:54 ]
宿題スレ行け






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<199KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef