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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

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

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 104代目
http://pc11.2ch.net/test/read.cgi/tech/1202135539/
2デフォルトの名無しさん:2008/03/22(土) 23:37:35
3デフォルトの名無しさん:2008/03/22(土) 23:39:08
4デフォルトの名無しさん:2008/03/23(日) 00:07:16
過去スレ貼るのって、なんか意味あるの?
5デフォルトの名無しさん:2008/03/23(日) 00:19:07
>>4さんがこの世に存在してるのと同じくらい意味があります!!
6デフォルトの名無しさん:2008/03/23(日) 00:48:33
あんまり意味なさそうだな。
7デフォルトの名無しさん:2008/03/23(日) 00:53:16
じゃ意味もなく貼ってるってことで。
8デフォルトの名無しさん:2008/03/23(日) 01:37:06
過去スレ見たい奴が居るからそういう人向けにはあった方が便利
不要に思う奴はスルーすればいい
9デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/23(日) 15:32:58
正しく入力を解析できた数、あるいは EOF が帰ってくる。

入力が無い場合は EOF が返される。
数値が入力されなかった場合は 0 が返される。
数値が入力されていていた場合は player にその数値が入れられ 1 が返される。
119:2008/03/23(日) 15:56:30
>>10
教えて頂いた事を元に調べ直したら理解出来ました
ありがとうございます
12デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/23(日) 19:35:07
プロトタイプ宣言について教えて。
int myStrlen(const char* str) {
 return strlen(str);
}
って関数があったとき、
int myStrlen(const char* str);
これがプロトタイプ宣言だよね。
ANSI以前のプロトタイプ宣言が無いときは
int myStrlen();
こう書いていたんだっけ?
プロトタイプ宣言が無いときに、相互に呼び出される関数を
どう実現していたのかが気になった。
16デフォルトの名無しさん:2008/03/23(日) 19:44:47
>>15
型チェックなしだから、空き放題に呼び出せたのでは?
17デフォルトの名無しさん:2008/03/23(日) 19:46:15
現在 int myStrlen(); が int myStrlen(...); の時とほぼ同じような感じで使えるから、
それと同じような感じで使われてたんじゃないかな。
1812:2008/03/23(日) 20:56:44
>>13さん
ありがとうございます!あっさり解決しました〜
19デフォルトの名無しさん:2008/03/24(月) 23:28:06
>>15
関数を呼び出す側が正しい引数を渡すものとしていた
引数について型変換が行われないのでキャストも必要だった

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

可変長引数関数は今でも型チェックができないので同じ問題がある
(標準関数についてだけは警告を出してくれるコンパイラもある)
printf("%f\n", 2);
printf("%f\n", 2.0);
20デフォルトの名無しさん:2008/03/25(火) 01:30:20
色々とありがとう。
プロトタイプ宣言なしのコーディングなんて暫くしてなかったから、どんなものか忘れてた。
これで、新人とかに質問されてもちゃんと答えられるぜ。
21デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/25(火) 20:19:09
>>22
なぜ中身が変更されていると思ったのでしょう?
24デフォルトの名無しさん:2008/03/25(火) 20:21:14
*dest++ = *string++;

*dest = *string;
dest++;
string++;
とほぼ同じ動作。
string の中身は変わらないっつーか、
変わってたら string は const だからエラー出る。
25デフォルトの名無しさん:2008/03/25(火) 20:26:39
>>23,>>24
ありがとうございます。

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

>>24
*string++で中身が変わってしまい、constでエラーが出ることは理解できるのですが、
応用として、変数を増やすことなく、この関数を使用できないでしょうか?
26デフォルトの名無しさん:2008/03/25(火) 20:27:26
>>25
中身は変更されないので確認してねって事です
27デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/25(火) 20:29:24
>>25
>*string++で中身が変わってしまい、constでエラーが出ることは理解できるのですが、
だから変わらないっつーの。
29デフォルトの名無しさん:2008/03/25(火) 20:29:31
>>21
ポインタを返してもらうならvoid *add_line()だろ。
30デフォルトの名無しさん:2008/03/25(火) 20:54:59
>>26
中身は変わらないです。ごめんなさい。

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

すいません。もうちょっとがんばってみます。
ありがとう。
3121:2008/03/25(火) 20:55:53
>>27
とりあえず、ソースをあげてみました。
http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/25(火) 21:50:18
空のリストに追加する際は常にこの面倒くさい状態になるから・・・
3621:2008/03/25(火) 22:24:05
>>34
学校の課題で、特定の行の後に追加する関数と、前に追加する関数が求められていて、
この関数は後に追加のほうなので、[a] <X> [b][c][d][e]に追加したいです。
もし0行目の後に追加(一番最初に追加)の場合は特定の行の前に文章を追加する関数に
移るようにします。
>>35
リングにしてしまうと最初の行が分からなくなってしまう気がします。
その場合は構造体の中に行番号を入れるしか思いつきませんでした。
ただX行からY行をZ行の後に移動などの処理の時に困る気がするのですが・・・
37デフォルトの名無しさん:2008/03/25(火) 22:29:48
>>36
ダミーのノードを1つ用意する。

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

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

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

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

あと、構造体のポインタへのポインタの使い方は
39デフォルトの名無しさん:2008/03/25(火) 22:50:37
引数に直接返すより戻り値から返した方が
自由度が高くてよい。
4021:2008/03/25(火) 23:07:17
>39
えと、X行からN行を入力テキストに置き換える、という関数の中で
X行とN行のアドレス、それを取り出すときに使ったX行からN行の
実際の行数のintを返す関数を用意したいと思っているのですが、
やはりそれは戻り値を一つに出来るよう更に小型化するしかないのでしょうか?
41デフォルトの名無しさん:2008/03/25(火) 23:27:37
複数の値を返さないといけない場合は、
値を返す用の引数を別個に用意するのが普通かな。

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

まあとりあえず、
>>21 のポインタへのポインタの使い方自体は間違ってないので、
変なのだとしたら他の所がおかしいんだと思うよ。
4221:2008/03/25(火) 23:38:34
>>41
色々教えていただいてありがとうございます!

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

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

あと、もう一つなのですが・・・値を返す用のの引数とは
関数の動作に必要な引数の他に、値をもらう用のポインタ変数を
用意するということでしょうか??
43デフォルトの名無しさん:2008/03/25(火) 23:45:41
ああ、もうソースが消えてるわ。
main 側はまだ見てなかったわ。

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

>あと、もう一つなのですが・・・値を返す用のの引数とは
>関数の動作に必要な引数の他に、値をもらう用のポインタ変数を
>用意するということでしょうか??
そうなる。
4421:2008/03/26(水) 00:31:31
>>43
スイマセン、ソースは自動で消えてしまったみたいです・・・

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

勉強になりました!ありがとうございました!
45デフォルトの名無しさん: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; /* 割り込み終了位置を返す */
}
4645:2008/03/26(水) 07:49:39
改行大杉長過ぎで二度怒られたわw >>45の続き、ってかコメント。

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

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

『ポインタのポインタ』はポインタをtypedefして独立した1つの型として見ると理解し易いかも。
47デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/26(水) 19:38:27
0以外の値。
例えば常に真を返す関数tがあったとしたら、次のコードは常にtを出力する側へ分岐する。
if (t())
{
putchar('t');
}
else
{
putchar('f');
}
50デフォルトの名無しさん:2008/03/26(水) 19:39:51
>>48
man コマンドとかマニュアル、ヘルプの読み方が分からないって事か?
51デフォルトの名無しさん:2008/03/26(水) 21:35:01
真=はい
偽=いいえ

で覚えとけ
52デフォルトの名無しさん:2008/03/27(木) 22:18:49
FIRフィルタをCで書くとどんなになりますかね?
53デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/27(木) 22:30:18
>>52
コンボリューション演算をすればよろしい
55デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/27(木) 22:48:13
>>56
それではコンパイルすらできませんが
58デフォルトの名無しさん:2008/03/27(木) 23:45:44
読んでないけど演算結果が0==月曜日とかってことないよね?
59デフォルトの名無しさん:2008/03/27(木) 23:50:23
ヒント:グレゴリオ暦で遡って行った場合、西暦1年1月1日は月曜日
60デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/28(金) 00:52:32
>>60
あなたが手を加える前のプログラムに戻してみては?
62デフォルトの名無しさん:2008/03/28(金) 01:08:24
>>61
それだとできないことはないんですけど
別で作ってみたいなと思いまして・・・・
63デフォルトの名無しさん:2008/03/28(金) 01:11:37
>>62
まずはインデントをしっかりそろえてみ?
forがおかしなネストをしててループ変数iが破壊されてるぞ
64デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/28(金) 01:59:43
何がどうなってどう上手くいかないのかくらい書いてくれ。
>fgets(input_line,513,fp);
なんで513なんだ?
68デフォルトの名無しさん:2008/03/28(金) 02:02:39
>while(i=0){
代入でいいのか?

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

なんか他にもつっこみたくなる要素が満載だぞw
6964:2008/03/28(金) 02:19:59
>>68
すいません、そこは「==」でした・・・
あとスコープの外側にはセミコロンはいらないんですね・・・

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

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

問題点なのですが、「//リストの連結」という部分のすぐ下で読み込んだ構造体をつないでいきます。
その段階では構造体の現在のアドレスと現在の構造体の->prevのアドレスは正しく表示されるのですが、
ループを抜けた後、構造体のアドレスを一番最初に戻すために、       
while(p->prev != 0){
p=p->prev;
}
を実行しています。その途中でprevのアドレスがずれて、セグメント例外になってしまいます。
70デフォルトの名無しさん:2008/03/28(金) 04:18:05
>buffer_pre=p;
71デフォルトの名無しさん:2008/03/28(金) 04:21:55
>>69
ならinput_line[512]も513にしたら?
7264:2008/03/28(金) 07:31:11
>>71
あ、確かに。ありがとうございます。

>>70
pは関数が始まる時に0に初期化していて、
一列終わるごとにそのその構造体のアドレスがbufferf_preに
入るので間違っては居ない気がするのですが・・・
73デフォルトの名無しさん:2008/03/28(金) 07:40:31
>>63
見直してみましたがよくわかりません
どこのfor文なのでしょうか?
74デフォルトの名無しさん:2008/03/28(金) 07:44:24
>>72
>70
75デフォルトの名無しさん:2008/03/28(金) 07:46:28
>>73
あんたの節穴で見直すのではなく、インデントを揃えてみろ。
できればエディタで。
76デフォルトの名無しさん:2008/03/28(金) 07:48:08
>>73
/*閏年の判定*/
for(i = 1; i < year; i++){

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

どっちもi使ってるだろ?後者で上書きされてるだろう?
77デフォルトの名無しさん:2008/03/28(金) 10:01:09
>>72
>70で問題点が理解できないようじゃ、プログラムに向いてないだろ。
無意味で無駄な部分多すぎるし。
78デフォルトの名無しさん:2008/03/28(金) 14:01:52
p == NULLで初期化してwhile(i==0)にしたら動いたけど
79デフォルトの名無しさん:2008/03/28(金) 20:20:18
>>72,73
『間違っては居ない気がする』とかいってないで
デバッガでブレークポイント置いてステップ実行するなり
assert()とかprintf()とか入れて変数の状態を確認しようよ
見直すって眺めるのと違うんだけど
80デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/28(金) 22:45:30
>>80
count の値を表示してみればいい
82デフォルトの名無しさん:2008/03/28(金) 22:54:43
>>81
forで5のprintfが実行されなくてもカウントは5になってるんですね
ありがとうございました
83デフォルトの名無しさん:2008/03/28(金) 23:06:04
count++のあとcount < 5を判断する
84デフォルトの名無しさん:2008/03/28(金) 23:18:13
>>82
つーか、5になったからループを抜けたんだよ。
85デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/29(土) 11:46:37
どこが分からないのか言ってくれないとどうしようもない

1行ずつ追っていって、結果を紙に書いていくんだ
そうすればどこの行が分からないのかが分かる
87デフォルトの名無しさん:2008/03/29(土) 11:48:09
*nとn[0]が同じだってことは判っているのだろうか。
8885:2008/03/29(土) 11:55:52
8行目でn=0となっていて、20行目の*nの値はどうなるのでしょうか?
89デフォルトの名無しさん:2008/03/29(土) 11:58:13
最初は0だよもちろん。
90デフォルトの名無しさん:2008/03/29(土) 11:59:10
>>88
1になったらそれ以降増えない
whileにprint分入れて*nを出力したりとかして自力で知らべられるようにした方がいいよ

デバッガというものもあるし
91デフォルトの名無しさん:2008/03/29(土) 12:01:51
増えるだろw
aに入った文字列を一文字づつ取り出してbに格納、
既出の文字は無視、格納した文字の総数をnに入れてく関数だよ。
92デフォルトの名無しさん:2008/03/29(土) 12:06:21
>>91
馬鹿?
9385:2008/03/29(土) 12:11:59
ごめんなさい。理解できないみたいです。
まずfor(i=0;i<*n;i++)の*nは最初は0なんですよね?
だと繰り返さないような気がしてなりません。
94デフォルトの名無しさん:2008/03/29(土) 12:13:29
バカは>>90だろw
95デフォルトの名無しさん:2008/03/29(土) 12:14:47
>>93
そうです繰り返しません
そして次のif文はi が0 , *nが0なので真となり中身が実行されますが
その結果*n が1となりwhile(*s)の次の回では実行されません
そのままなにもしないままwhile文が回り続けて終了です
96デフォルトの名無しさん:2008/03/29(土) 12:16:18
>>90=95?
でたらめ書く前に実行してみたら?
97デフォルトの名無しさん:2008/03/29(土) 12:19:18
>>96
お前がやれよアホ
98デフォルトの名無しさん:2008/03/29(土) 12:30:41
a[]は入力した文字列、b[]はその文字列から重複した文字を抜いた文字列、
nはb[]の文字数になる。
9985: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デフォルトの名無しさん:2008/03/29(土) 12:41:02
そうだね。
10185:2008/03/29(土) 12:43:11
すみません。ちょっとだけ理解できたようです。
みなさんありがとうございます。
102デフォルトの名無しさん:2008/03/29(土) 12:43:54
要するに、
forは文字(*s)がtの中で既出かどうか探している。
次のifは、既出でない場合に条件が成立し、
tに文字(*s)を追加。
*nはtに格納した文字数だよ。
103デフォルトの名無しさん:2008/03/29(土) 12:46:57
春になると90みたいなキチガイが湧くんだなw
104デフォルトの名無しさん:2008/03/29(土) 12:49:40
>>102
nは文字数なんですね。
あとnは*nとする必要もないですよね?
105デフォルトの名無しさん:2008/03/29(土) 12:51:20
main関数内のnとca関数内の*nは別物。
できれば違う変数名にした方が混同しなくていいと思うけど。
106デフォルトの名無しさん:2008/03/29(土) 12:58:19
>>105
main関数内のfor文のnはca関数内の*nの値が入るのですよね。
107デフォルトの名無しさん:2008/03/29(土) 12:58:45
>>104
>あとnは*nとする必要もないですよね?
必要ないと思うならそう書き換えてコンパイルしてごらん。
108デフォルトの名無しさん:2008/03/29(土) 12:59:41
yes
109デフォルトの名無しさん:2008/03/29(土) 13:05:09
>>107
文字がでなくなった。
なんかもう頭がこんがらがってきた。
ポインタって難しいんですね・
110デフォルトの名無しさん:2008/03/29(土) 13:15:01
>>109
難しいといわれてるが一度理解するとそうでもなく、
プログラミングする上でこの上なく便利な機能だ。
めげずに落ち着いて頑張るといいよ
111デフォルトの名無しさん:2008/03/29(土) 13:19:28
プログラム書くときはなんか本とか見ながら書いてますか?
112デフォルトの名無しさん:2008/03/29(土) 13:19:39
この場合型が違うのに変数名を同じnにしてるのが混乱のもとじゃね?
113デフォルトの名無しさん:2008/03/29(土) 13:22:01
>>109
caの中のnは、mainの中のnを指して(ポイントして)いる。
caの中の*nという表記は、mainの中のnを読んだり書き換えたりしている。
114デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/29(土) 13:31:58
>>111
日本語書くときはなんか辞書とか見ながら書いてますか?
という質問と同じに聞こえる。
116デフォルトの名無しさん:2008/03/29(土) 13:56:40
>>113
なるほど、わかりました。
なんとなくですが>>

>>114
たしかにそのほうがわかりやすそうです。
117デフォルトの名無しさん:2008/03/29(土) 15:08:02
>>115
言い得て妙 だな
118デフォルトの名無しさん:2008/03/29(土) 15:19:06
2chの書き込みくらいでは辞書なんて引きません。
でも、ちょっとまじめな文章を書くときには、国語辞典を引きます。
119デフォルトの名無しさん:2008/03/29(土) 15:35:24
日本語に例えるのは上手くないような・・
英語だとしっくりくる
120デフォルトの名無しさん:2008/03/29(土) 17:17:22
正解はこれな
日本語しかわからないあなたがフランス語を書くときに辞書無しで書けますか?
121デフォルトの名無しさん:2008/03/29(土) 19:29:42
>>111
時々リファレンスみる程度。初心者でなければコピペとかないから。
そう意味できいてるなら真面目に勉強してください。
122デフォルトの名無しさん:2008/03/29(土) 22:47:33
ポインタについて質問です
整数型とint ポイント型の違いがわかりづらいのですが
ポイント型はアドレスを格納できて整数型はアドレスを出力するだけですか?
123デフォルトの名無しさん:2008/03/29(土) 22:57:35
>>118
そんなもんだろ。だいたいは頭に入ってるから空で書ける。
細かい仕様(引数の順番とか関数の戻り値とか)が必要になったらネットなり書籍なりで確認して書く。
124デフォルトの名無しさん:2008/03/29(土) 23:09:18
>>122
変数からアドレスを求めるのはアドレス演算子&。
整数型はアドレスを出力するだけというのはなんか変だ。
125デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/29(土) 23:46:54
>>124
アドレスを変数に格納せず&で出力ができるという感じですか?
>>125
printf("%d",*xp)が50を表示するというのが難しく感じるところです
*xpという箱は整数型で宣言されそこには&xというアドレスが代入される
となるとprintf("%d",*xp)ではアドレスが出力されると考えてしまいます。
127デフォルトの名無しさん:2008/03/29(土) 23:50:00
変数はあくまでxp
128デフォルトの名無しさん:2008/03/29(土) 23:59:29
なんとなくわかりました
*xpはアドレスを格納する変数
だからprintf("%d",xp)だとそのままアドレスを出力
printf("%d",*xp)はわざわざ*をつけてるから逆にデータのほうを表示する
129デフォルトの名無しさん:2008/03/30(日) 00:26:12
2行目の「*xp」は「xp」ね。それ以外は大体その認識でOK
130デフォルトの名無しさん:2008/03/30(日) 09:26:32
そうかな、なんか危ういきがす
131デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/30(日) 11:40:43
>>131
「int* xp」と書いた方がわかりやすいかな。
「int*」が変数の型(intへのポインタ型)、xpが変数名。
133デフォルトの名無しさん:2008/03/30(日) 11:56:25
int* xp, x
134デフォルトの名無しさん:2008/03/30(日) 12:05:48
>>133
C言語のダメなところだよね。「int *」が型なのに、宣言は個別に「*」を付けなきゃいけないなんて。
複数の変数を1行で宣言できることがそんなに重要なんだろうか。
135デフォルトの名無しさん:2008/03/30(日) 12:17:50
int i, *p, (*f)();
136122:2008/03/30(日) 15:44:32
printf("%d",*xp)というのは間接参照演算子というポインタ変数の機能なんですね
まだそれは勉強してませんでしたがおかげでわかりました

ポインタの練習用プログラムを見てどう出力されるかはわかるようになってきました
ありがとうございました
137デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/30(日) 19:38:53
>>137
そのとおり。
DATA*とPDATAが同じ。
char*とPCHARが同じ。
139137:2008/03/30(日) 20:06:28
>>138
ありがとうございます。
140デフォルトの名無しさん:2008/03/31(月) 04:46:11
戻り値の最上位ビットが 1 のときはAを、0 のときはBを示す関数、REABがあるのですが、
if(REAB() < 0) //Aの時
となるのは何故なんですか?
141デフォルトの名無しさん:2008/03/31(月) 04:48:39
2の補数の場合はそうなる
あとはぐぐればすぐ分かる
142デフォルトの名無しさん:2008/03/31(月) 04:53:28
最上位ビットが1なら負の数になるんですね
ありがとうございました
143デフォルトの名無しさん:2008/03/31(月) 12:22:07
>>142
Cの規格上は必ずしもそうなると言う保証はない点に注意。
そもそも、「最上位ビット」に意味があるのだからきちんと最上位ビットをチェックするロジックを書くべき。
# 処理速度などを睨んで改変するのは二の次三の次。
144デフォルトの名無しさん:2008/03/31(月) 19:31:48
>>143
符号つきで最上位ビットが 1 の場合は負ってのは規格で保証されてなかったっけ?
その制限の中でどういう負数表現をとるかは環境依存だけど。
145デフォルトの名無しさん:2008/04/01(火) 02:35:47
>>144
REAB()の戻り値がsignedなんて、どこにも書かれていませんよ。
146デフォルトの名無しさん:2008/04/01(火) 03:03:58
例えば極端な話、戻り値がcharだったらコンパイルオプションでsignedかunsignedか切り換えられるかも知れない。
だとすると、signedのときは正しく動いてunsignedのときは(エラーも起こさず)正しく動かないことになる。
>143ではないが、先ずはそれに頼らないコードを書いた方がいいとは思う。
147デフォルトの名無しさん:2008/04/01(火) 07:32:19
やらない方がいい事は確かだけど、
結局規格ではどうなってるんだ?
148デフォルトの名無しさん:2008/04/01(火) 08:40:35
>>144
規格で決まってるのは、符号ビットが1ビットあることだけじゃなかったっけ?
149デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/01(火) 12:34:30
>>149
コンパイラによるけど long long を使うとかは?
151デフォルトの名無しさん:2008/04/01(火) 12:55:46
・32768倍をやめて1024倍とか256倍とかで妥協する
・long long intを使う
・素直にfloatを使う

例えばx86でSSE2が使えるなら、巧く書けばベクタ化できるから下手すりゃ整数で小細工するより速いよ。
152デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/01(火) 14:25:42
system("sed -e 's/fg/ajko/g' dest.txt > foo")
154デフォルトの名無しさん:2008/04/01(火) 14:40:13
apple
test
hello

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

の様な2次元配列で読み込みたい場合、
Stringの確保はどのようにすればよいのでしょうか?
155デフォルトの名無しさん:2008/04/01(火) 14:57:03
Stringって何よ?
ここはCのスレだけど、C++かC#かJavaか何かと間違ってやしませんか?
156デフォルトの名無しさん:2008/04/01(火) 15:13:53
char String[][]の積もりだろ。

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

可変長にしたいとか、そもそも文字列も可変個数だと言うのなら、ポインタのポインタを使うことになる。
まぁ、入門サイトでも探してくれ。それで判らなければ出直してくれて構わんから。
157デフォルトの名無しさん:2008/04/01(火) 15:23:36
>>155
済みませんでした。

>>156
ありがとうございました。
158デフォルトの名無しさん:2008/04/01(火) 15:45:25
>>153
それは何ですか?
159デフォルトの名無しさん:2008/04/01(火) 19:53:37
>>153について誰か教えて下さい。
160デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/01(火) 21:00:44
私はIRIXです
163デフォルトの名無しさん:2008/04/01(火) 21:12:58
Windows でも Cygwin とかある
164デフォルトの名無しさん:2008/04/01(火) 21:15:01
これを愛用している
ttp://www.vector.co.jp/soft/win95/util/se015016.html

スレチだが
165デフォルトの名無しさん:2008/04/02(水) 18:36:45
曖昧な質問で悪いのですが、

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

そういった用途のc言語プログラムというのはどこで拾えばよいのでしょうか?
166デフォルトの名無しさん:2008/04/02(水) 19:40:13
宿題なら先生、仕事なら先輩。
167デフォルトの名無しさん:2008/04/02(水) 20:52:03
>165
自分の文章を読み直してみろ
その文章で何を言ってるか理解できるか?

168デフォルトの名無しさん:2008/04/02(水) 20:55:38
>>167
きっとロボット制御して半田付けするってことだ
で、ロボット制御するためのc言語プログラムというのを探している
169デフォルトの名無しさん:2008/04/02(水) 20:57:00
>>165
導線と半田を用意して、こてで溶着すればいいんじゃない?
170デフォルトの名無しさん:2008/04/02(水) 21:05:38
位置独立コードの事かと思ったよ。
171デフォルトの名無しさん:2008/04/02(水) 23:09:20
Cである一定のstate数ループさせる方法ってあるんけ?
172デフォルトの名無しさん:2008/04/03(木) 00:20:25
state数って何よ、asm("NOP") * nってこと?
173fxで裁判中。教えて:2008/04/03(木) 08:28:12
外国為替証拠金取引会社のアトランティックトレードと裁判になりました。

裁判の内容をここに記してみました
システム障害等でくわしいかた、是非とも情報をお待ちしております。よろしくお願いします。
http://members3.jcom.home.ne.jp/chaochu/
174デフォルトの名無しさん:2008/04/03(木) 10:49:25
なかなかの魚拓が取れたみたいなので、ここに置いておきますね。
ZDNet Japan builder「C/C++のポインタの機能--参照渡しののような処理」
http://s03.megalodon.jp/2008-0328-1911-56/builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255,00.htm

オリジナルは
http://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255,00.htm
175デフォルトの名無しさん:2008/04/03(木) 11:20:59
すげえバカだw
そういやこの筆者と似たようなことぬかしてたヤツが宿題スレでボコボコにされてたな。
176デフォルトの名無しさん:2008/04/03(木) 15:25:56
あちこち同じリンク張るな。いい加減うっとおしい。
177デフォルトの名無しさん:2008/04/03(木) 17:55:05
全く無知な人間が
C言語をマスターするにはどれくらいの時間がかかりますか?
178デフォルトの名無しさん:2008/04/03(木) 17:58:15
>>177
物覚えの良い人ならそれだけ早いだろうし
やる気によっても左右される
マスターがどれくらいの事を言ってるのかもわからない
179デフォルトの名無しさん:2008/04/03(木) 18:10:47
僕もマスターしたという基準がよく分からないのですが
C言語の試験とか資格ってのはあるんですか?
180デフォルトの名無しさん:2008/04/03(木) 18:19:43
聞いたことないし、あったとしても役立たないものであることは確かだな。
著名なプログラマが資格を持っているなんて話、聞いたことがない。
181デフォルトの名無しさん:2008/04/03(木) 20:58:04
最低限の足切くらいはできるんじゃないか?
Fizz-Buzz みたいにw

使えないやつが暗記してくるのは見破れないけど
暗記すらできないやつなら落とすことができる
使えるやつは暗記する必要もない、と
182デフォルトの名無しさん:2008/04/03(木) 21:02:56
そのレベルのcの資格なら存在しているな
183デフォルトの名無しさん:2008/04/03(木) 22:36:16
>>177
参考書と問題集何冊か買って受験勉強並みに真剣に勉強すれば3ヶ月くらいで
1000行程度のフリーソフトが作れるくらいにはなる。マスターとは程遠いけどね…
184デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/04(金) 17:55:02
cl.exe /help
と実行すれば、指定できるオプションの一覧が出る
187デフォルトの名無しさん:2008/04/04(金) 19:21:06
>>185
カレントディレクトリに実行ファイルができているんじゃないかな。
188デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/04(金) 22:48:49
char str[3];
190デフォルトの名無しさん:2008/04/04(金) 22:49:34
>>188
\0 が入る余地がない
191188:2008/04/04(金) 22:57:33
0から始まるから[0]と[1]に文字が入って[2]に\0が入るんじゃないんですか?
192デフォルトの名無しさん:2008/04/04(金) 22:59:12
char str[2];
これだと二文字分の領域しか確保した事にならない

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

の3Byte必要
193デフォルトの名無しさん:2008/04/04(金) 23:00:24
>>191
str[2]を使うなら、char str[3];で定義しないとダメ。
194デフォルトの名無しさん:2008/04/04(金) 23:03:32
添え字が0から始まる事と、配列の要素数は別

char str[0];

と書いても1文字分確保されるわけじゃない
195188:2008/04/04(金) 23:13:06
今char str[0];で宣言してみたらサイズが0の宣言は無効とでました。
なるほど、てことはchar str[1];だと1文字が入るサイズってなわけですね。
皆さまありがとうございました。
196デフォルトの名無しさん:2008/04/04(金) 23:32:33
>.188
慣れてしまえば、なんでもないことなんだが。
Cの初心者が最初につまずく問題であることは確か。

1.文字列を格納する文字配列は、文字列の最後の\0分も含めて確保しなければならない。
2.配列を定義するときの添え字(char str[3]の3)は、配列要素の数であり、どこまで使うかではない。
197デフォルトの名無しさん:2008/04/04(金) 23:34:24
追加
3.Cの配列の添え字は0オリジンである。
198デフォルトの名無しさん:2008/04/05(土) 00:13:30
すみませんCの質問とは若干異なるかもしれませんが
「JmEditor2」を使用していて下パネルで
『cファイルをコンパイルして作ったexe』を実行したときに
[scanf]などの入力を必要とする操作部分が実行できません
解決策を知っている方がいればお願いします

コマンドプロンプトから同じexeファイルを実行したところ問題なく動きました
199デフォルトの名無しさん:2008/04/05(土) 00:32:38
JmEditor2のヘルプには入力できるって書いてあるんですか?
それと若干じゃなくて大幅にスレ違いです。
200デフォルトの名無しさん:2008/04/05(土) 02:37:46
いいえ、スレ違いではありません。鼬害です。
201デフォルトの名無しさん:2008/04/05(土) 06:19:59
>>198
「ツール」メニューの「コマンド実行」を使う。

下パネルから実行したとき、子プロセスの標準出力がうまく表示されない。
プロセスが終了するまで、子プロセスの標準出力の内容が表示されないようになっている。
202デフォルトの名無しさん:2008/04/05(土) 15:08:33
そして板違いの指摘の後にレスする馬鹿。
203デフォルトの名無しさん:2008/04/05(土) 21:37:05
>>201
ありがとうございます。

>>他
すみませんね、住人さん。自治会お疲れ様です。
204デフォルトの名無しさん:2008/04/06(日) 01:47:50
#include <stdio.h>

main()
{
char ss[80];

gets(ss);
puts(ss);
}

文字を80文字以上入力しても、全ての文字が表示されるんですか
何故80文字以上gets()で読み込んでputs()で表示する事ができるのでしょうか
205デフォルトの名無しさん:2008/04/06(日) 01:51:04
ss のサイズが 80 までなんて gets は全く知らないから
メモリを破壊してどんどん文字を保存していってしまう。
非常に危険。
gets は使っちゃダメ。代わりに fgets を使うべし。
206デフォルトの名無しさん:2008/04/06(日) 01:51:05
オーバーフローした場合の動作は未定義だから。
207204:2008/04/06(日) 02:01:05
なるほど!理解できました
ありがとうございます。
208デフォルトの名無しさん:2008/04/07(月) 10:07:03
任意のURLからファイルをダウンロードしてくるプログラムを作ったのですが、(マルチスレッド+Winsock)
一回のダウンロードごとにメモリ使用量が5〜30KBずつ増えていきます。
動的な確保は行っておらず、
何故増えていくのかがわかりません。
この場合の考えられる原因を教えて頂きたいです。
209デフォルトの名無しさん:2008/04/07(月) 12:21:08
動的な確保を行っているから。mallocだけが動的確保じゃない。APIの呼び出しも動的確保になる場合がある。
210デフォルトの名無しさん:2008/04/07(月) 12:29:59
Release〜しないといけない所を忘れてるとか。
211デフォルトの名無しさん:2008/04/07(月) 15:08:26
なるほど…盲点でした。
もう一つお伺いしたいのですが、
グローバル変数はあまり使わないほうがいい、
という事を聞いたので
URL名
SERVER名
PATH名
ディレクトリパス
を保つ構造体をmain内で宣言したのですが、
自作関数の引数をあちこち増やさなければいけなくなりまして…
これってまずいですか?
一般的に言われる汎用な関数とはどんな関数なのですか?
212デフォルトの名無しさん:2008/04/07(月) 15:12:18
よくわからないけど通りすがりにレスすると
その構造体というかメンバ変数を持つクラスで管理すればいいんじゃないの?
213デフォルトの名無しさん:2008/04/07(月) 15:20:04
C++じゃなくてCだから困ってるんじゃ
214デフォルトの名無しさん:2008/04/07(月) 16:16:50
はい。Cです。
215デフォルトの名無しさん:2008/04/07(月) 16:18:59
>>211
プログラムの性質も作りも判らないからなんともいえないけれど、main()から構造体のポインタを順次下請け関数に渡すだけでしょ。
最下層にまで届ける必要はないはずだし、普通はあんまり問題にならないと思うけど。
216デフォルトの名無しさん:2008/04/07(月) 16:25:50
>>215
main内で構造体を宣言することって
よくあることなんですかね?
217デフォルトの名無しさん:2008/04/07(月) 16:30:34
>>216
何も問題はないよ。
218デフォルトの名無しさん:2008/04/07(月) 16:33:13
あ、Cのスレだった・・・すまん
多用しなければグローバル変数にした方が色々と便利&バグを生まない事もあるよ
その構造体1つだけとかならグローバルにしちゃうのがいいと思う
219デフォルトの名無しさん:2008/04/07(月) 17:51:09
>>216
OKだよ。
構造体のポインタをがんがん渡していけばいい。
複雑になったら、そのとき単純にする方法を悩めばいい勉強になる。
220デフォルトの名無しさん:2008/04/07(月) 18:58:34
全てのグローバル変数を、実体名"Global"で構造体にまとめると、
Global.totalとか、Global.countとか一目瞭然で便利。
って、物の本に書いてあった。一理あると思った。
221デフォルトの名無しさん:2008/04/07(月) 19:01:01
そんな方法があったか

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

223デフォルトの名無しさん:2008/04/07(月) 20:20:03
C言語を作れて表示できる無料のソフトはないですか?
224デフォルトの名無しさん:2008/04/07(月) 20:20:44
C言語を作るとな?
225デフォルトの名無しさん:2008/04/07(月) 20:30:38
>>223
cygwin とgcc
visualstudio
bcc
好きなのを選べ
おすすめはしないが
LSI Cというのもある
226デフォルトの名無しさん:2008/04/07(月) 20:30:47
Windows上で動く無償のCコンパイラ、とエスパーしてみると、いくつかある。

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

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

「C++」と書いてあるが、C言語のソースのコンパイルもできる。
他にcygwinとか。
227デフォルトの名無しさん:2008/04/07(月) 21:24:45
>223
読み直してみろ
「C言語をつくれて」
これおかしいだろ

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

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


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

そこまで攻撃する意図がわからんよ
229デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/07(月) 23:36:11
for(i = 0; i > MAX; i++)
b[a[i]] = a[i];
232デフォルトの名無しさん:2008/04/07(月) 23:36:16
mixiに、タブは機種依存文字と言い張る基地外が現れる。
233231:2008/04/07(月) 23:37:50
不等号逆だった
234デフォルトの名無しさん:2008/04/07(月) 23:38:22
a[0]〜a[4]とb[0]〜b[4]
の全部の例を書いてみてくれ
235230: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デフォルトの名無しさん:2008/04/07(月) 23:49:15
>>230

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

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

b[3] = a[0];
ということだよね?と考えると、一瞬 >>231 (不等号を逆にして)でいい気がするが、
a[3] はどうするの?
237デフォルトの名無しさん:2008/04/07(月) 23:51:26
>>235
結局は
b[i]=i;
になるんじゃないの?
238デフォルトの名無しさん: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
と変わらないよ?
239230:2008/04/08(火) 00:01:45
ん〜なんと説明していいか…如何せん素人なもんで
aの0にある数字3をbの同じ3番目に当てはめる?
にはどうするかってことです。
同じくaの1にある数字4をbの4に当てはめるってことです

あの聞いといてなんですけど意味不だったらスルーしてください
240デフォルトの名無しさん:2008/04/08(火) 00:09:33
素人とかの問題じゃないんだけどな
1回自分で全部代入してみてbの中身全部表示してみると分かると思うけど
b[0] = 0 b[1] = 1 b[2] = 2... となるだけ
241デフォルトの名無しさん:2008/04/08(火) 00:10:35
>>239
暗号化がしたいのかな?
242デフォルトの名無しさん:2008/04/08(火) 00:15:32
>>239
結局>>231>>237でいいような気がするが。

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

わかってるってんだったら、失礼。
243デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/08(火) 09:38:29
>>230
代入は上書きコピーのこと。転送とまちがえてはいけない。
245デフォルトの名無しさん:2008/04/08(火) 12:33:58
>>230
何が目的なのかも書き込んだほうがいいんじゃない?
あんたのコード例から目的が推察できないのでみんな
首ひねってるんだと思うよ。
246デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/08(火) 16:52:09
intは整数型だよ
248デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/08(火) 20:13:45
inspect関数かinvestigation関数でやるのがいいと思うよ
マジレスすると場合によるからどっちともいえない
252デフォルトの名無しさん:2008/04/08(火) 20:21:43
>>251
どのような場合があるのですか?
253デフォルトの名無しさん:2008/04/08(火) 20:42:23
5P3
順列の総数を求めるプログラムを教えてください
考えすぎて頭が痛くナリマスタ
よろしくオナガイシマス
254デフォルトの名無しさん:2008/04/08(火) 21:09:06
255デフォルトの名無しさん:2008/04/08(火) 21:12:34
>>253
オーバーフローとか一切考えなければ
5!を3!で割るだけじゃんww
なにが分からないの?w
256デフォルトの名無しさん: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;
}
257246:2008/04/08(火) 22:30:13
>>247-249
ありがとうございます。
258デフォルトの名無しさん:2008/04/08(火) 22:31:58
259デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/08(火) 22:34:25
>>259
おいw
261デフォルトの名無しさん:2008/04/08(火) 22:48:02
バグがあるな。
262デフォルトの名無しさん:2008/04/08(火) 23:08:45
>>256
そのままコンパイルすると
error C3861: 'tgamma': 識別子が見つかりませんでした
なのですが?
263デフォルトの名無しさん:2008/04/08(火) 23:50:07
まともなCコンパイラを使ってください。
264デフォルトの名無しさん:2008/04/09(水) 19:31:35
5! / 3! って結局 5 * 4 だろ?
一旦階乗求めるよりh(ry
265デフォルトの名無しさん:2008/04/09(水) 21:23:09
hの続きは何だよ
266デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/09(水) 21:47:43
studio......
269デフォルトの名無しさん:2008/04/09(水) 21:48:54
standard I/Oな
270デフォルトの名無しさん:2008/04/09(水) 21:48:55
エラーで気付や
271デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/09(水) 22:07:55
質問の意味がよく分からんが
purintfにgdw2を渡すべきなんじゃない?
274デフォルトの名無しさん:2008/04/09(水) 22:08:49
gdw2を表示したいんじゃないの?
275デフォルトの名無しさん:2008/04/09(水) 22:20:14
Cのみだったのでこちらで質問させていただきます。
現在、下記のような感じでプログラムを作ってるのですが、
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6212.txt
2つ問題があり、
@入力していくと次の配列まで入力されてしまう。
A2つ目のエラー仕様をどこでどう記述していいのか。
初歩的なことで、無駄な文が多いかもしれませんがよろしくお願いします。
また、こうすればもっと判りやすくできるなどあったら教えて欲しいです;
276デフォルトの名無しさん:2008/04/09(水) 22:54:48
>>275
「次の配列」が何を指しているのか判りませんが、一文字ずつ入力してチェックするのは標準入力では無理があるかと。
普通に1行入力してから、解析する方がたぶんましです。
277デフォルトの名無しさん:2008/04/09(水) 22:55:24
>>275 A
....
break;
}
}
if((cnt <= 0) && ((c == '-') || (c == '\n'))) {
printf("エラーメッセージ");
exit(1);
}

if(x == 1){
.....
278デフォルトの名無しさん: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デフォルトの名無しさん: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;
}
280275: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の部分はできました。ありがとうございますー。
281281:2008/04/10(木) 14:58:40
わからないので教えていただけないでしょうか
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6215.txt
よろしくお願いします。
282デフォルトの名無しさん:2008/04/10(木) 15:01:38
史上稀に見る課題の丸投げ具合ですね
283デフォルトの名無しさん:2008/04/10(木) 15:13:06
自分でわかろうと努力をするつもりはないわけか
課題の言葉の意味もわかってなさそうだ
284デフォルトの名無しさん:2008/04/10(木) 16:17:51
>>283
社会に出れば、問題を解決する方法論を持っていればそれが能力と
みなされる。
たとえその方法論が丸無げであってもな。
285デフォルトの名無しさん:2008/04/10(木) 16:29:12
その友達に聞け
286デフォルトの名無しさん:2008/04/10(木) 16:30:45
AもBもやったことない俺に、Cなんて聞くんじゃねぇ〜ぞゴルァ!
C言語ならおk
287デフォルトの名無しさん:2008/04/10(木) 18:57:28
Cとかまだやってんのwだっさw
288デフォルトの名無しさん:2008/04/10(木) 19:36:17
スタックが32バイトしか取れないからしょうがないのだ。
289デフォルトの名無しさん:2008/04/10(木) 23:47:00
>>288
それはアセンブラでもきびしいだろw
290デフォルトの名無しさん:2008/04/10(木) 23:54:53
簡単なリモコン作る程度なら多いくらいだ
291デフォルトの名無しさん:2008/04/11(金) 11:43:11
ファイル名を入力して、そのファイルの小文字を大文字に置換した結果を
別のファイルに出力するプログラムです

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

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

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

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

まだ入門書を半分も読んでいない初心者が思いつきでやったので
色々突っ込みどころはあるかと思いますがよろしくお願いします
292デフォルトの名無しさん:2008/04/11(金) 12:45:21
漢字は2バイト以上で表現しているのだゾ。
漢字コードでググルのだ。
293デフォルトの名無しさん:2008/04/11(金) 13:07:06
>>291
当方で確認した環境は WindowsXP, 使用した処理系は cygwin(gcc 3.4.4) です。
以下のプログラムで問題が発生するかどうか、確認してみてください。
問題が発生しなければ、これが解決方法です。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6217.txt

古いし、問題もあるようですが、参考にした書籍をあげておきます。
応用C言語, 三田 典玄, アスキー 1988, ISBN4-7561-0056-2
第3章
294デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/11(金) 13:17:08
>>293
その本はゴミだ。いや、作者がゴミそのものだ。

>>291
>293を見て気付いた点をもう一つ追加。
・小文字と判断したら、forからは脱出しておけ。
・gets()は使うな。fgets(filename, sizeof(filename), stdin)にしておけばいい。
296293:2008/04/11(金) 13:29:55
>>295
まあまあ、せっかくソースをさらして質問している(質問作法としては最上です。)のだから、
まずい点をことさらに列挙するのはどうでしょうか。

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

> その本はゴミだ。いや、作者がゴミそのものだ。
netnews の時代からいろいろいわれていたようですけど、
具体的にどこが悪いんでしょうか。おしえていただけるとうれしいです。
297デフォルトの名無しさん:2008/04/11(金) 13:36:34
まあ環境依存だよな
漢字というか多バイトコードが何なのかによって変わっちゃうから
298291:2008/04/11(金) 13:36:57
いえいえ、具体的に間違いをあげて頂きとても助かりました!
今からお二人のアドバイスを参考にやってみます!
299デフォルトの名無しさん:2008/04/11(金) 13:37:55
入門で作るプログラムとしてはASCII以外を考慮するのはハードル高すぎると思うよ
300295:2008/04/11(金) 13:39:07
>>296
もうかなり前だから何を以ってゴミと判断したかは忘れたが、
当時本人にも直接メールして本の不備を詳細に指摘したことがある。
言い訳だけが返ってきた。

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

>まずい点をことさらに列挙するのはどうでしょうか。
真摯に聞く態度を示す質問者だからこそ、列挙した。
つーか、「まずい」と認識しつつ指摘しない方が不親切だろ。
301291:2008/04/11(金) 13:41:58
環境依存ですかー
やっぱり初心者がやるにはちょっと面倒なモノだったようですね
皆さんの言ってることがある程度理解出来たら自己満足したいと思いますw
302293:2008/04/11(金) 13:43:00
>>296
あっ失礼、filename というのは、提示されたプログラムの変数をさしていたんですね。
もうしわけない。
303293:2008/04/11(金) 13:47:03
>>300
そうですね。gets() はまずいですね。
提示されたプログラムでは、128 文字以上入力されるとおかしくなってしまいます。

> 真摯に聞く態度を示す質問者だからこそ、列挙した。
> つーか、「まずい」と認識しつつ指摘しない方が不親切だろ。
たしかに。
304デフォルトの名無しさん:2008/04/11(金) 13:49:09
EUCだと3バイトとかあったっけ?
305295: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に戻さないといけないなど制約が多いので、内部コードとして使うことはお勧めできない。
306293:2008/04/11(金) 14:08:01
>>305
補足。
>>293 ではシフトJIS(MS漢字コード)の古い時代のものを仮定しています。
>>293 で作成・検証に使用したコンパイラは、まさにシフトJIS には対応していない
ので、提示されたプログラムにある日本語メッセージは、なくなく削除しました。
307デフォルトの名無しさん:2008/04/11(金) 14:18:05
>>306
cygwinなら、gccのオプションに--input-charset=cp932 --exec-charset=cp932を書くといいかも。
応用で、EUCで書かれたソースをcygwin用にコンパイルすることもできますぜ。
308デフォルトの名無しさん:2008/04/11(金) 16:45:27
>>307
感謝です。gnu の libiconv/iconv_open() の指定方法でいけばいいんですね。
またひとつ賢くなりました。
309デフォルトの名無しさん:2008/04/11(金) 20:16:02
>>287
Aどころか女と付き合ったこともないお前が言うと笑えるw
310デフォルトの名無しさん:2008/04/11(金) 20:34:22
ワシのCは108手までまであるぞ
311デフォルトの名無しさん:2008/04/11(金) 21:18:17
本当に初歩的な事ですみません…
C#ってなに?
312デフォルトの名無しさん:2008/04/11(金) 21:20:08
プログラム言語
313デフォルトの名無しさん:2008/04/11(金) 22:40:22
そのプログラムの中のたとえばどのようなものか教えていただけたらありがたい。
314デフォルトの名無しさん:2008/04/11(金) 22:40:40
日本語でおk
315デフォルトの名無しさん:2008/04/11(金) 22:45:33
自然言語に日本語、英語、フランス語と色々あるように、
プログラムを記述するのに使う言語も色々ある。
その1つがC#。もちろんCも1つの言語だ。
316デフォルトの名無しさん:2008/04/12(土) 00:00:10
Cよりはjavaに近い言語ってよく言われてるね
まぁC#とか触ったこともないけどなw
317デフォルトの名無しさん:2008/04/12(土) 00:28:35
JAVAっぽいC++
318デフォルトの名無しさん:2008/04/12(土) 01:04:35
マイクロソフトのマイクロソフトによるマイクロソフトのために作られた言語
319デフォルトの名無しさん:2008/04/12(土) 12:44:08
J++の焼き直し言語がC#
320デフォルトの名無しさん:2008/04/12(土) 12:52:04
どの言語だろうと、基本的な部分は共通しているし
実装されている、出来ることを知ることの方が重要。
あとは、用意されているライブラリをきちっと使えれば、どの言語だろうと関係ねぇ
限定した言語でしか通用しないような奴は、どこへ行っても使い物にならない。
とりあえず、コンピュータの仕組みを知ることが出来たんで、大学に通っておいて正解だったぜ。
321デフォルトの名無しさん:2008/04/12(土) 14:10:50
と、突然どうした。。。
322デフォルトの名無しさん:2008/04/12(土) 14:15:56
簡単な文字出力のプログラムを作ったとして、
それをチャット上などで動作させることはできないのですか?
コマンドプロンプトの中でしか出力できないのですが
323デフォルトの名無しさん:2008/04/12(土) 14:17:00
>>322
そう。
324デフォルトの名無しさん:2008/04/12(土) 14:34:24
>>322
チャット上に文字出力するプログラム作ればいいじゃん
325デフォルトの名無しさん:2008/04/12(土) 14:36:31
>>324
出力先をコマンドプロンプトじゃなくて、チャット上にするやり方が分からない
本にもそういうの載ってないんだが
すべてが独学だから聞く人もいないし・・
326デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/12(土) 21:27:35
>>328
大学へGO!
やっぱり基礎が大事だから
330デフォルトの名無しさん:2008/04/13(日) 07:30:38
C言語で操っている、操作させている、制御しているコンピュータの基本的な仕組み
そして極め付けが、君が日ごろ見ている文字、絵、動画、音声、それらはすべて
ある法則に則って記録された数値データ、その数値データを人間で言う動物細胞
物質の原子レベルまで追求して話をすると、0と1の組み合わせ、すなわちバイナリーデータとは
0と1、あるかないか、磁石で言う+と-、電気信号でそれらを管理、制御しているのさ。
ほら、いつもニヤニヤしながら見ているエロ画像、それがだんだん・・・ただの色の集まり、
その色は0と1の組み合わせで構成されているデータに見えてきただろ?
PCに色や文字、音声が人間が解釈できる形で表現できる機能が実装されているから
その0と1の無機質なデータがエロ画像に見えるのさ。グロだろうと。
331デフォルトの名無しさん:2008/04/13(日) 09:52:55
人間なんて所詮炭素と水なのさ

という話と同等のどうでもいい話
332デフォルトの名無しさん:2008/04/13(日) 10:06:34
その通り、しかし、それを理解してそれに対して適切に制御、操作できれば
可能な範囲内で様々なことが出来るようになる。だから基本に戻れと。
ただ・・・人間も、いくら美人だろうとイケメソだろうが、所詮最後は朽ち果てて
この世から存在すらなくなってしまうのさ。ほら、躊躇してねーで、とっとと
好きなプログラムを作れ。そしてエロ画像で好きなだけはぁはぁしてろ、な?
333デフォルトの名無しさん:2008/04/13(日) 10:08:37
>>332
生きた証をどう残すかだな。子孫か、グレートコードか。
334デフォルトの名無しさん:2008/04/13(日) 10:10:29
なんで択一なんだよ
両方ゲットせいよ
335デフォルトの名無しさん:2008/04/13(日) 10:11:39
もちろん両方残せるのが一番良い。
336デフォルトの名無しさん:2008/04/13(日) 10:13:58
おまえら何の話してるんだよ
337デフォルトの名無しさん:2008/04/13(日) 10:20:13
自分も可能な範囲で子供を作れるのさ、作られるものは
遺伝子レベルでのことになるが。
338デフォルトの名無しさん:2008/04/13(日) 14:32:55
returnとか戻り値とかどういうときにどう使うんですか?
詳しくかつ解りやすく教えてください
339デフォルトの名無しさん:2008/04/13(日) 14:43:45
自作した関数は式の中で使えるんだよ。
340デフォルトの名無しさん:2008/04/13(日) 15:17:19
int main()
341デフォルトの名無しさん: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
ソースhttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6242.txt
ヘッダファイル(Macの方はこれがないと実行できません)http://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デフォルトの名無しさん:2008/04/14(月) 21:33:41
>>342
先ず、get_data()を改修してみよう。
fscanf()の使い方はそのままで、そこで得たbest, yearなどを格納できるように構造体配列を用意するのを忘れずに。
それができたら、テキストエディタで現在のkiroku.txtを編集してダミーデータを作ってそれを喰わせてみよう。
ここまでできれば、後はput_data()を改修して、記録の取り扱いのロジックを書けばいい。

要は、1件扱うのも10件扱うのも同じこと。
fscanf()とfprintf()で作っているのなら別途fread(), fwrite()が必要になるなんてことはない。
345デフォルトの名無しさん:2008/04/14(月) 21:41:57
>>343
なんで clock なんか使ってるの?
rand 使えば?
346デフォルトの名無しさん:2008/04/14(月) 21:44:43
いえ、randomで書いて、やっぱり固まり部分が出きるので
きれいにならぶ規則性がほしいな、と思っているのですが・・・
三角関数とか使うのは嫌だし・・・
347デフォルトの名無しさん:2008/04/14(月) 21:45:11
>>343
clock() に DROPRATE を掛ければ委員ジャマイカ?
348デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/14(月) 21:51:05
データ列の速度が1じゃないとだめか。
こうか?
a = (a+DROPRATE) % 100;
if(a > DROPRATE) { ; }
350デフォルトの名無しさん:2008/04/14(月) 21:57:40
リサンプルにおけるエイリアシング現象じゃないの。
351デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/14(月) 22:07:45
>>343
規則的でよければブレゼンハムのアルゴリズムが使えるよ
乱数要素を混ぜるならバッファ付のディザリングみたいの使えばおk
354デフォルトの名無しさん:2008/04/14(月) 22:08:24
>>351
 ありがとうございます。やってみます。
355353: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デフォルトの名無しさん:2008/04/15(火) 00:24:57
>>353
347=349だけど参考になった。
ブレゼンハムのアルゴリズムっていうのか。
358353: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デフォルトの名無しさん:2008/04/15(火) 23:37:51
getchar()を使用し、絶対値を返すプログラムを作れ、ということで
ここでいろいろ参考にして、一応作ってみました。
結果は問題ないと出るのですが、イマイチ無駄な処理が多いかなと自信なくて、
修正できるとこがあれば、自分が判りそうな範囲で修正して教えてくださいー;
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6246.txt
360デフォルトの名無しさん:2008/04/15(火) 23:38:59
宿題スレ池
361278:2008/04/16(水) 00:14:15
>>359
だから関数化しようって。
無駄な処理を言うなら、フラグを駆使してまでmainだけで頑張ることが無駄。
278のをgetchar使うように修正しといたから。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6247.txt
362359: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デフォルトの名無しさん:2008/04/16(水) 00:59:37
>質問お願いします。
日本語でおk

c++ は cの値を取り出して使った後で、 cの値が+1 となる
つまり上記のy[c++]=bは c=0であれば y[0]にbを代入した後に、c=1 となる
おk?
365デフォルトの名無しさん:2008/04/16(水) 01:00:47
>>363
x[c]=a;
y[c++]=b;

これの前中後それぞれに、cの値を表示するprintf文入れりゃわかるよ。
366デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/16(水) 01:08:52
>>365
前後じゃわからんだろう
368363:2008/04/16(水) 01:21:50
>>364-366
++の位置で1を加算するタイミングが変わるのですね。
理解することが出来ました。ありがとうございます。
369デフォルトの名無しさん: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))
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6248.txt

>>361
きれい‥‥。でも質問者は <string.h> 全般がわからなくてスルーしちゃったのかも。
370デフォルトの名無しさん:2008/04/16(水) 03:17:34
エラーを数値でやるより列挙子使おうぜと言おうと思ったがまだ習ってないか。
371369:2008/04/16(水) 03:40:15
#define のかわりに列挙子を使う人もいますね。最近知りました。
372デフォルトの名無しさん:2008/04/16(水) 14:10:53
質問です。
変数のみの行を記述してもコンパイルエラーにならないようですが、
・文法上、なぜOK?
・どんな動きをする(最適化等で消されて何もしない?)

void main(void)
{
 int a;

 a;       <- この行
}
373デフォルトの名無しさん:2008/04/16(水) 14:13:08

BorlandC++ 5.5
Renesas C Compiler 9 for SH
でコンパイルOKでした。
374デフォルトの名無しさん:2008/04/16(水) 14:17:33
・あらゆる式は;を付ければ式文として文になるから
・何もしない
375デフォルトの名無しさん:2008/04/16(水) 14:26:21
例えばf(i);のように書いてあるとして、
あとから先頭の方に#define f(arg) (arg)と書けば
関数呼び出しが無かったことにできます
プリプロセスの都合上必要なだけです
376デフォルトの名無しさん:2008/04/16(水) 14:26:25
Cでは関数を呼ぶのも代入も式の内なので、式文が許されないとプログラム書けない。
377デフォルトの名無しさん:2008/04/16(水) 14:41:50
>>376
エラーにならない理由を聞かれて規則でそう決まってるじゃ答えになりません
エラーがでない理由はエラーにしない方がよいと言語の設計者が考えたからであって
文法規則はその結果でしかないです
378デフォルトの名無しさん:2008/04/16(水) 15:09:08
訊かれてるのは「文法上、なぜOK?」であって、言語設計者がどう考えたかではないし
379デフォルトの名無しさん:2008/04/16(水) 15:28:47
関係ないけどmainの戻り値はintにしとけ
380デフォルトの名無しさん:2008/04/16(水) 15:41:28
ちっちっち、てんで説明になってないぜ、坊や達?一度、顔を洗って出直しな。
ついでに鏡を見てごらん。そう、何かこう、プギャー!な面が映し出されているだろ?
それが何だか分かるかい?そう、自分の顔さ。見事な面だろ?
人前に出た君を、周りはその顔の人だと見ているのさ。

それはさておき、a;がなぜおkかって?単項でも数式と言えるからさ。
こんなの、数学でも初歩的だよ?w
381デフォルトの名無しさん:2008/04/16(水) 17:12:49
>>374-380
コンパイラ(構文解析か?)が仕様としたものが分かりました。ありがとうございます。

>>375 確かに。目にしていたはず。
>>380 "単項でも数式と言える"なるほど。 最後のwが興ざめですが。
382デフォルトの名無しさん:2008/04/16(水) 19:45:59
なぁ〜〜にぃ〜〜!やっちまったな!
男は黙ってぇ〜 炭坑に入れ
383デフォルトの名無しさん:2008/04/16(水) 21:04:19
しばらく平和だったのに頭おかしいのが戻ってきちまったな
384デフォルトの名無しさん:2008/04/16(水) 21:16:38
平和ばっかりじゃつまらないだろ?たまにはリーチ、一発、タンヤオ、イーペーコー
七対子、対々和、三暗刻くらいは狙おうぜ?そして僕イケメン。
385デフォルトの名無しさん:2008/04/16(水) 21:19:49
>>384
国士無双、四暗刻のダブル役満なみにねーよwww
386デフォルトの名無しさん:2008/04/16(水) 21:20:20
国士のwktk感は異常
387デフォルトの名無しさん:2008/04/16(水) 22:09:44
C言語の入門書を本屋で立ち読みしたのですが、
コンパイラとして無料で手に入るものもいくつかあがってました。
市販の処理系というのは、いずれ必要になるものなのでしょうか?
それとも、無料のもので長くやっていけるもの?
388デフォルトの名無しさん:2008/04/16(水) 22:22:22
無理に市販のも使わなくてもいいよ。 無料で十分。
慣れて詳しくなってからでも、有料を選ぶのは遅くないだろうしな。
389359:2008/04/16(水) 23:54:58
>>369
ありがとうございます、参考にさせていただきます。
あと、結果についてなのですが、case1のときのエラー判定が少し違ってて、
1aならエラー1、aaならエラー2、aならエラー2のように
ちょっと間違ってたようですー。
390デフォルトの名無しさん:2008/04/17(木) 00:54:31
borlamd C++ compiler 5.5って、windows Vista でも動きますか?
391デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/17(木) 08:11:47
>まず自分の質問が++なのかさえ分からないものですが宜しくお願いします。
「++」が何のことか判りませんが、Cの質問ではないようですので
お使いのアプリ名でスレタイ検索してみてはいかがでしょうか。
394デフォルトの名無しさん:2008/04/17(木) 08:36:04
>>393
やはりそうですか。
ありがとうございました。
395デフォルトの名無しさん:2008/04/17(木) 08:42:22
>>389
それはすみません。今時間がないので、本日遅くに修正いたします。
396デフォルトの名無しさん:2008/04/17(木) 15:18:29
Borland C++Compiler をダウンロードしようとしてもうまくいきません。
登録を済ませてからダウンロードボタンを押しても
「Internet Exploler ではこのページは表示できません」
と出ます。どうしてでしょう・・・
397デフォルトの名無しさん:2008/04/17(木) 16:00:03
Borland C++ Compiler オ ワ タ
http://pc11.2ch.net/test/read.cgi/tech/1206951221/

実はオワテないです、ちゃんとダウソしてくり
398デフォルトの名無しさん:2008/04/17(木) 16:06:25
>>396
http://www.codegear.com/jp/downloads/free

↑のC++ BuilderもしくはTurbo C++を落とすべし。
399デフォルトの名無しさん:2008/04/17(木) 16:31:06
hello, world.

出たーーーーーーーーーーーーーーー
これまでに要した時間3時間。
先が思いやられる
400デフォルトの名無しさん :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デフォルトの名無しさん:2008/04/17(木) 18:17:09
ここはあなたの日記帳ではありません
402デフォルトの名無しさん:2008/04/17(木) 18:17:44
>>400
!==
403デフォルトの名無しさん :2008/04/17(木) 18:24:11
それで、ひとつひとつ調べたところ

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

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

Borland C++Compilerの無料のCコンパイラを使用しているんですが
これに問題があるのでしょうか?
404デフォルトの名無しさん :2008/04/17(木) 18:25:42
>>400

ありがとうございます。
一度やってみます。
405デフォルトの名無しさん:2008/04/17(木) 18:25:48
それで、じゃねーよw
406デフォルトの名無しさん :2008/04/17(木) 18:26:33
すいません
>>402さんでした
ご指摘ありがとうございます

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

うーん、やっぱり駄目なのかな
408デフォルトの名無しさん:2008/04/17(木) 18:44:26
そういう慌てん坊さんは、格好悪くて括弧がつかないって中学校の数学の教師が言ってた
409デフォルトの名無しさん:2008/04/17(木) 19:13:26
0で割る(除算する)と「問題が発生したため...」となって強制終了されるのですが、
0で割るのをやめる以外で、エラーを回避する方法はありますか?
410デフォルトの名無しさん:2008/04/17(木) 19:36:58
>>409
0で割るのをやめる。

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

411デフォルトの名無しさん:2008/04/17(木) 19:47:40
なぜ0で割れないのか不思議だったが考えてみれば簡単で当然だった
16を4で割るということは16を4つのグループに分けるということ
どんな数字も0個のグループに分けることはできないんだから
412デフォルトの名無しさん:2008/04/17(木) 19:52:18
0で割ったら0にしてほしいと思っています。
そのほうが便利だと感じます。
413デフォルトの名無しさん:2008/04/17(木) 19:53:26
浮動小数点数でおk
414デフォルトの名無しさん:2008/04/17(木) 20:06:51
>>400
int a
int b
の宣言文にセミコロン。
415デフォルトの名無しさん:2008/04/17(木) 20:14:27
0をかけるってことは0の逆数で割るってことで、0/0で割ること。
0/0で割るのは0/0をかけるのと同じだから、0で割るのは0をかけるのと同じで0になっていい。
コンピューターだとビット演算の仕様でそういうことにはできないのかな。
416デフォルトの名無しさん:2008/04/17(木) 20:15:07
>>407
黙ってソース全体をコピペするなりどこかに上げるなりしろ
417デフォルトの名無しさん:2008/04/17(木) 20:15:54
>415
目をさませ
あるいは寝ろ
418デフォルトの名無しさん:2008/04/17(木) 20:23:35
逆数

0 でないある数 a に対して、a × b = 1 となるような数 b を a の逆数 (ぎゃくすう) といい、
419デフォルトの名無しさん:2008/04/17(木) 20:24:14
なるほど、1=2という結論ですね。
420デフォルトの名無しさん:2008/04/17(木) 21:08:37
>>419
それは違う。それが成り立ってしまうと、数学的帰納法で全ての数が等価になってしまう。
421デフォルトの名無しさん:2008/04/17(木) 21:15:48
なにか問題が?
422デフォルトの名無しさん :2008/04/17(木) 21:24:01
>>414
セミコロンをつけましたがやはりダメでした
423デフォルトの名無しさん:2008/04/17(木) 21:26:22
>>400>>402,414以外の間違いは見当たらないんだが。
424デフォルトの名無しさん:2008/04/17(木) 21:44:04
エラーメッセージ貼れよ
425デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/17(木) 22:20:36
%dにdouble突っ込みゃそりゃどうなるか分からん罠。
427デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/17(木) 22:31:15
>/sqrt(1.0-(n/i)*(n/i))
これがまずい。
nがiのとき0で割ることになる

>>426
そこもおかしいが、domain errorとは関係ない
429デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/17(木) 22:36:38
i, nをintにして、(n/i)の計算を((double)n/i)にするとか

doubkeを
> for(i=10;i<=1000000000;i*=10){
のように計算するのは好ましくない。誤差が出てしまう。
431デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/17(木) 22:58:13
>>430
でないだろ普通・・・
お前の環境doubleが何byteなんだよw
433デフォルトの名無しさん:2008/04/17(木) 23:05:30
どうすれば誤差が出るのか理解せずにdoubleだと誤差が出るって覚えこんだんだろうな。
434デフォルトの名無しさん :2008/04/17(木) 23:17:46
>>423
わかりました。

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

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

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

うまくいかない場合は、実行環境/コンパイラの種類を教えてください。
手に入るものなら私でも試してみます。
436423: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デフォルトの名無しさん:2008/04/17(木) 23:37:21
>>409
お使いの環境に matherr() 関数はありませんか?
438デフォルトの名無しさん :2008/04/17(木) 23:40:33
>>435
>>436
考えてもらってありがとう。なんとかコンパイルできたので
また何かエラーが出たら教えてください。
439デフォルトの名無しさん:2008/04/17(木) 23:44:25
>>389
順序を変えました。inputInt() の該当部分を、次のようにしました。
if (err == 1)
return 1;
if (cnt == 0)
return 2;
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6268.txt
440デフォルトの名無しさん:2008/04/17(木) 23:49:08
>>412
算数の教科書をみなおしてみましょう。
わり算はかけ算の逆であると決めれば、わる数が 0 である場合は
「答えになることのできる数はない」
のです。
441デフォルトの名無しさん:2008/04/18(金) 00:45:34
borland C++ compiler 5.5で、setbccを使って、環境変数と設定ファイルの
設定をしていたんですが、なぜか、PATHの設定が失敗してしまいます。
何がいけないんでしょうか?
442デフォルトの名無しさん:2008/04/18(金) 00:46:31
>>441
スレ違い、失せろ
443デフォルトの名無しさん:2008/04/18(金) 00:47:56
>>442
お前が失せろ
444デフォルトの名無しさん:2008/04/18(金) 00:49:32
じゃあ俺が失せるよ!
445デフォルトの名無しさん:2008/04/18(金) 00:58:08
いやいや、ここは俺が
446441:2008/04/18(金) 00:58:28
>>442
スレ違いで、失礼いたしました。
このような質問は、どのスレッドで聞くべきなんでしょうか? 
すみませんが、教えてください。
447デフォルトの名無しさん:2008/04/18(金) 00:59:31
>>446
どうぞどうぞ
448デフォルトの名無しさん:2008/04/18(金) 01:00:04
>>445
あっ どうぞ、どうぞw
449448:2008/04/18(金) 01:01:50
33秒差で負けた・・・
450デフォルトの名無しさん:2008/04/18(金) 01:03:10
>>447-449
早漏乙
451デフォルトの名無しさん:2008/04/18(金) 01:27:18
>>446
BCC Developper
http://pc11.2ch.net/test/read.cgi/tech/1155549904/

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

とりあえず、ここでいいんじゃないの?
452デフォルトの名無しさん:2008/04/18(金) 09:36:52
>>441
>何がいけないんでしょうか?
あんたの頭。
453デフォルトの名無しさん:2008/04/18(金) 13:53:50
シンボリックな定数を扱う場合、
大きくわけて#defineを使うのとenumを使うのがあるようですが、
どのように使い分ければいいのでしょうか?
それとも好みの問題?
454デフォルトの名無しさん:2008/04/18(金) 14:03:01
複数の定数にまとまった意味があるならenum、
整数値でないならdefine、
後はプロジェクトごとの規定による。
455デフォルトの名無しさん:2008/04/18(金) 14:26:08
来週から新人研修でC言語担当になったので来てみました。
最初からじっくり読んでエスパー目指します。
456デフォルトの名無しさん:2008/04/18(金) 16:30:54
>sprintf("%0.2f", 1.1)
って書き方は間違いですか?

直すとしたら、
>sprintf("%.2f", 1.1)
といった感じでしょうか?
457デフォルトの名無しさん:2008/04/18(金) 16:33:33
>>456
直すとしたら
sprintf(buffer, "%0.2f", 1.1);
じゃないかと思った

ゼロフラグが有っても別に間違いということはないと思う
458456:2008/04/18(金) 16:37:44
了解。どうも有難う。
459nito:2008/04/18(金) 16:39:40
vs2005で
featall[i*featnum[i]+p].descr = n[p].descr;
とすると
main.c(143) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
というエラーがでます。
どうしてでしょうか。
ちなみにdescrは[128]です。
460デフォルトの名無しさん:2008/04/18(金) 16:51:23
>>459
int a[10]; で
a = 5; とかできない。
ってのと同じ。
461デフォルトの名無しさん:2008/04/18(金) 16:56:51
そのエラーメッセージもおかしくて、正確には「変更可能な左辺値」だけどな…
配列をまるっとコピーしたいならmemcpyかmemmoveを使え
462デフォルトの名無しさん:2008/04/18(金) 17:05:17
>>461
おかしいといえばおかしいが、おかしくないといえばおかしくない。
なぜなら配列は特定の場合を除いてポインタ値(ポインタ変数ではない。つまり右辺値)に成り下がるから。
まあどうでもいいか。
463nito:2008/04/18(金) 17:24:42
>460
言われてみれば確かに…

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

みなさんありがとうございます。
何分Cは初めたばかりでしてちょくちょくつっかかってまして
また使わせていただきます(滝汗
464nito:2008/04/18(金) 18:07:26
続きになるんですが
memcpy(featall[i*featnum[i]+p].descr,n[p].descr,sizeof());
と書くことにしました。
この場合、sizeofには
int[128]
と入れれば
128個の配列分確保されるんでしょうか。
465デフォルトの名無しさん:2008/04/18(金) 18:25:29
>>464
yes
466465:2008/04/18(金) 18:33:49
老婆心ながら
memcpy は移動元と異動先が被るような場合はうまくいかない。
bcopy (from, to, len); // memcpy(to, from, len) と引数順が違う
というのもある。
467デフォルトの名無しさん:2008/04/18(金) 19:29:52
printf( "%c" , 'A' );
が標準出力に文字「A」を出すという保証はないですよね?
「文字定数=>int」「int=>char」「char=>%cで出てくる文字」は全く別の変換であって、
そこらの処理系ではたまたま合ってるだけですよね
規格を読む限り
468デフォルトの名無しさん:2008/04/18(金) 20:02:49
>>466
何故そこでmemmove()を薦めない。
469デフォルトの名無しさん:2008/04/18(金) 20:36:25
>>466
bcopy は sun os に付属のコンパイラで使ったことがありますが、どこにでもあるのでしょうか....。
やっぱり memmove() ですか。
470デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/18(金) 20:58:09
-for(j=num; 0<j; j--)
+for(j=num; i<=j; j--)
472デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/18(金) 22:37:09
>>471,>>472
実はこれに2時間以上つっかかってました・・・(恥
これで安心して寝れます。ありがとうございました。
474デフォルトの名無しさん:2008/04/18(金) 22:38:54
空白のループは*のループの前に持ってきたほうがいい
475472:2008/04/18(金) 23:11:15
>>473
感謝するなら理解してからにしてくれ。
476デフォルトの名無しさん :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デフォルトの名無しさん :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デフォルトの名無しさん:2008/04/19(土) 02:07:53
続きは?
あと
× void main() { ... }
○ int main() { ... return 0; }
479デフォルトの名無しさん:2008/04/19(土) 02:09:18
すれ違ってしまった・・・。

以降ってことは 4 とか入れた場合のことか?
そりゃ price に何も値代入してないから無茶苦茶になるぜ。
480デフォルトの名無しさん :2008/04/19(土) 02:10:45
コンパイルするとcase3以降の計算が間違ってしまいます。

それでcase2までにすると、どんな値をいれても正確に計算されるんですが
3つ以上になるとおかしくなるんです。
481デフォルトの名無しさん :2008/04/19(土) 02:14:15
>>478、479
ありがとうございます。
明日、起きたら試してみます。
いま使っているパソコンとプログラミングしているパソコンは
別にあるので夜遅く申し訳ありません。
482デフォルトの名無しさん:2008/04/19(土) 02:16:17
case と数値の間にスペースがないのはコピペミスか?
483デフォルトの名無しさん:2008/04/19(土) 02:16:37
>467
どう読んだか知りませんが、間違ってます。
484デフォルトの名無しさん:2008/04/19(土) 07:57:59
>>481
>482が指摘したとおり、caseの後に空白がないのではないか?
他の構文ミスと違い、caseの後の空白がないこと自体は文法違反にならないからエラーにはならない。
485デフォルトの名無しさん:2008/04/19(土) 10:28:29
ただのラベルになっちゃうからねぇ
486デフォルトの名無しさん:2008/04/19(土) 10:31:35
default:
 if (person == 3) goto case3;
487デフォルトの名無しさん:2008/04/19(土) 12:24:23
学習教材として、「猫でもわかるC言語プログラミング」か
「十日で覚えるC言語入門教室」のどちらを買おうか悩んでいるんですが、
経験者の方から見てどちらが使いやすいんでしょうか?」
アマゾンはいまいち頼りにならなくて・・・・
488デフォルトの名無しさん: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デフォルトの名無しさん :2008/04/19(土) 12:43:41
476ですが、
>>478
>>479
>>484
>>486さんのいう通り試してみましたが、case3以降の計算がやはり間違えてしまいます。

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

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

とりあえずコンパイルしたソースをそのまま貼るんだ
491デフォルトの名無しさん:2008/04/19(土) 12:55:30
>>488
・ prime[0]=prime[1]=0; はループの外に出せ
・ 二つ目のループが何をやっているのかもう一度考えなおせ
 ifに条件が足りないはず
492デフォルトの名無しさん :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デフォルトの名無しさん:2008/04/19(土) 13:18:13
>>492
>person=3なので、>>477のcase3の値がテキスト上では計算されることになってます。
いいえ。理由は>484。
494488:2008/04/19(土) 13:19:21
>>491
言う通りにしたら正常に動作しました。ありがとうございました。

あと、このプログラムだと入力値が10000をこえると正しく動かないと思うんですが、
入力値までprimeを定義するにはどうすればいいんでしょう?
495デフォルトの名無しさん:2008/04/19(土) 13:20:44
primeをmallocで確保
496デフォルトの名無しさん :2008/04/19(土) 13:26:31
>>493

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

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

497デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/19(土) 14:43:41
つfscanf
499497:2008/04/19(土) 14:57:05
>498
レスありがとうございます。一つ書き忘れたのですが、行を行として読み込むことが
要件としてあります。つまり、1行と2行目は別の要素として読み込みたいと考えてます。
要件漏れすいませんでした。

fscanfは考えたのですが、改行文字も空白と同様データの区切りとして読み込むと
のことでしたので、1行をバッファに読み込んでから処理をしています。1行ずつ別途に
処理する方法があれば教えてください。
500デフォルトの名無しさん:2008/04/19(土) 15:31:22
>>499
fgets(), sscanf()
501デフォルトの名無しさん:2008/04/19(土) 15:37:44
fgetcで改行まで読む
502デフォルトの名無しさん:2008/04/19(土) 15:46:07
関数へのポインタの定義で”型名 (*ポインタ変数)(引数)”とするところを
”型名 *ポインタ変数(引数)”と、するとどうしてダメなのでしょう?
お願いします。
503デフォルトの名無しさん:2008/04/19(土) 15:49:11
int *kansu() は int型のポインタを返す関数と解釈される
504デフォルトの名無しさん:2008/04/19(土) 15:56:26
>>503
よく分からないのですが、int *kansu()はint形のポインタを返す関数の
プロトタイプ宣言と解釈されるのですか?
505デフォルトの名無しさん:2008/04/19(土) 16:01:46
そういうこと
int* p;
p = kansu();
506デフォルトの名無しさん:2008/04/19(土) 16:06:59
>>503
ありがとございました。
507デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/19(土) 17:32:18
可変長の場合はね。
mallocのほか、calloc()やrealloc()でも可。
510デフォルトの名無しさん:2008/04/19(土) 17:38:25
最初のうちは、#defineで最大サイズを容易に変更できるようにした固定長配列でもいいと思うけどな。
いずれにしろ、ある程度の規模になればmalloc()は必須になるから慣れておいたほうがいい。
511デフォルトの名無しさん:2008/04/19(土) 17:43:25
free 忘れは大変だしな。
512デフォルトの名無しさん:2008/04/19(土) 17:52:55
>>509,510,511

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

513デフォルトの名無しさん:2008/04/19(土) 17:53:58
長さを固定にしたくなければ動的に確保すればいいし、
固定で十分なら固定にすればいい。
514デフォルトの名無しさん:2008/04/19(土) 17:54:40
初心者はstring
515デフォルトの名無しさん:2008/04/19(土) 17:54:59
C スレで何言ってんの?
516デフォルトの名無しさん:2008/04/19(土) 17:57:25
mallocやfreeは上級者しか無理 stringをかなり進める
517デフォルトの名無しさん:2008/04/19(土) 18:01:37
>>512
「スタック」でぐぐってみるとよし。
スタックは小さいから、そこに収まらない規模の配列は必然的にmalloc()を使うことになる。
518デフォルトの名無しさん:2008/04/19(土) 18:03:44
C≠C++
519512:2008/04/19(土) 18:09:29
みなさん、ありがとうございます。
さしあたって、Cを勉強しているのですが、
stringが簡単そうですね。
C++も視野に入れて勉強していこうと思います。
520デフォルトの名無しさん:2008/04/19(土) 18:13:37
string a="あいう";

a=a+"えお";

などと自動でサイズ変更してくれる。
初心者はstring
521デフォルトの名無しさん:2008/04/19(土) 18:19:10
a=a+"えお"; とか書くなよ・・・。
a+="えお"; だろ。
コスト考えれ。
522デフォルトの名無しさん:2008/04/19(土) 18:24:08
後ろに空きがあったら、メモリを解放せずに増やす方法ありますか? 普通に牌列としてアクセスできてです。
523デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/19(土) 20:01:06
A-Zの出現個数をカウントする変数(たぶん配列になるね)を作成する。
文字に応じて対応したカウンタをインクリメントしていき、終了時に頻度を出力。
526デフォルトの名無しさん:2008/04/19(土) 20:01:08
宿題スレで聞けば
527デフォルトの名無しさん:2008/04/19(土) 20:13:04
うおおおおおお
やっとCの入門書を読み終えたのだが、
フリーソフトとかで転がってるウィンドウズのプログラムとか
まだぜーんぜん無理な気がする。
だいたいそもそウィンドウの一文字も出てこないんだが、、、
コマンドプロンプトでさ、計算とかさ、文字列とかさ、
先がながーーーーーーーーーーーーい

みなさんいっぱしのプログラムが作れるようになるまで
どんくらいかかりました・・・?
528デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/19(土) 20:32:22
>>529
特定しました
532デフォルトの名無しさん: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デフォルトの名無しさん: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文字
ということになる。
535532:2008/04/19(土) 21:28:43
>533 >534

早速の回答ありがとうございます。
どうさ結果からしてそうらしいとは思っていました。残念。
strlen呼ぶしか無いのかなぁ
536デフォルトの名無しさん:2008/04/19(土) 21:37:30
scanf は空白読み飛ばしたりするし、
%n だけじゃ難しいね。
strlen の方が簡単だと思う。
537デフォルトの名無しさん:2008/04/19(土) 22:11:47
strlenを使いたくない理由は?
538532:2008/04/19(土) 22:15:32
>537
改めて突っ込まれると特に理由は有りません(汗)
強いて言うならあまり美しくないと思ったくらい。
539デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/19(土) 23:44:51
>>524

if(isupper(i))
a[i-'A']++;
else
other++;
541デフォルトの名無しさん:2008/04/19(土) 23:51:09
('A')
542デフォルトの名無しさん:2008/04/20(日) 00:50:12
while ('A') { ... }
543デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/20(日) 14:30:22
あとは strncpy
547デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/20(日) 21:19:38
使える
550デフォルトの名無しさん:2008/04/20(日) 21:26:08
>>549
そうですか!
しかし使い方がわかりません
どこを設定すればいいでしょうか?
551デフォルトの名無しさん:2008/04/20(日) 21:36:12
Cpadで書いてBCC Developerでコンパイルすればいいだけ
552548:2008/04/20(日) 21:59:01
>>551
そのまま使える方法はないですかね?
553デフォルトの名無しさん:2008/04/20(日) 22:00:52
質問の意味が分からない
554デフォルトの名無しさん:2008/04/20(日) 22:02:41
ある値が出るまでずっと同じ動作を繰り返して、
ある値が出たら終了するようにするには、どうやるべきでしょうか?
555デフォルトの名無しさん:2008/04/20(日) 22:04:48
>>554
do{x=動作;}while(x==ある値);
556548:2008/04/20(日) 22:05:04
>>553
中のファイルをどこに置けばインクルードされるのかがわからないんです・・・
557554:2008/04/20(日) 22:07:37
>>555
do whileの存在を忘れてました!試してみます
ありがとうございました!
558デフォルトの名無しさん:2008/04/20(日) 22:09:25
>>555
do{x=動作;}while(x!=ある値);
だな
559デフォルトの名無しさん:2008/04/20(日) 22:10:59
>>556
コンパイラから見える場所において置けよ
560デフォルトの名無しさん:2008/04/20(日) 22:11:35
>>556
よく分からん
BorlandC++ Compiler 5.5のスレかDXライブラリのスレいったほうがいい
561デフォルトの名無しさん:2008/04/20(日) 22:13:06
>>548
bcc32.cfg
ilink32.cfg
の中身を見てみることを勧める?
562デフォルトの名無しさん:2008/04/20(日) 22:19:33
>>561
なんで疑問系?>オレ
563548:2008/04/20(日) 22:26:56
>>559
.hや.libのフォルダが複数あってわかりません。。

>>561
パス追加するとインクルードはできてるようなのですがエラーも大量に出てきました。。
564デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/21(月) 12:31:23
>>565
OSの資料を読みましょう。
567デフォルトの名無しさん:2008/04/21(月) 12:57:15
const char*の配列にすればお望みの事ができるよ。

const char* test[] = { "hogeA", "hogeB", ... };
568564:2008/04/21(月) 13:07:25
>>567
完璧に思った通り動きました!!
的確な回答有難うございます。感謝します。
569デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/21(月) 15:02:40
>>569
featall, feattest が指す先はどこ?
571デフォルトの名無しさん:2008/04/21(月) 15:04:04
セミコロン書き忘れてるみたいだし、sizeofも単なる書き忘れ?
572デフォルトの名無しさん:2008/04/21(月) 15:08:32
>>569
どうでもいいけど、構造体のコピーなら=を使えよ。
573デフォルトの名無しさん: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
って参照する事は出来ないんですか??
574573:2008/04/21(月) 17:43:42
すみません bool ansの位置が間違っていました。。
main関数内で宣言しています。
575デフォルトの名無しさん:2008/04/21(月) 17:46:16
setA[setB[i].range].range==true
こういうことをしたいのか?
576デフォルトの名無しさん:2008/04/21(月) 17:47:30
そもそもiはどこから出てきたんだろう
577デフォルトの名無しさん:2008/04/21(月) 17:48:22
>>573
コンパイルエラーならエラーメッセージを貼るべし
578573:2008/04/21(月) 17:52:47
>>575
そういう事をしたいです。

>>576
実際はforループの中に入ってるんですが、
プログラムがゴッチャゴチャになっているのでかなり抜粋しています。
多重間接参照の方法が知りたいと思いまして…

>>577
コンパイルは通ります。でも値が上手く入っていないようで常に0を返してきます。。
多重間接参照の部分は合っていますか?変に回りくどく聞いて申し訳ございません。。
579デフォルトの名無しさん:2008/04/21(月) 18:01:07
とりあえずmainの中でsetA[0].rangeとsetA[1].rangeの値を確認してみるべきだと思う
580デフォルトの名無しさん:2008/04/21(月) 18:14:54
(setA+bool型)だけどそういうプログラムなのかな?
581573:2008/04/21(月) 18:27:07
>>579
表示させてみた所、値がおかしいです。・・・常にfalse。。

>>580
はい。そこも伝わりづらくすみません。

質問投げっぱなしで申し訳ないのですが、
>>579さんの感じでやってみた所、原因は(計算略)の部分にありそうです。
ここに数百行詰まっていて助けを借りるのも憚られるので、自力でなんとかしてみます。
気にかけて頂きありがとうございました。。
582デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/21(月) 19:45:20
ぶっちゃけ、どこにあろうと原則として、上にあればおk。それに関しては
  init(&a, &p);
の上にあればおkってことね。
584初心者:2008/04/21(月) 19:46:27
バブルソートの高速化手法について以下の用語を調べ説明せよって
問題があるんだけどう答えていいかわからない…教えてください

使う用語
亀(turtle)
コムソート(comb sort)
585デフォルトの名無しさん:2008/04/21(月) 19:50:40
586デフォルトの名無しさん:2008/04/21(月) 21:47:01
バブルソートを高速化ってアホだな。
587デフォルトの名無しさん:2008/04/21(月) 22:02:13
結局、ポインタを理解できなかった。
588デフォルトの名無しさん:2008/04/21(月) 22:07:10
俺はボインタッチが(y
589デフォルトの名無しさん:2008/04/21(月) 22:08:54
Main関数で5つの整数を読み込み,
その5つの値の平均(double)を
だすプログラムを作成
せよ.
その時、5つの引数を受け取り,平
均を返す関数を呼び出し,返された平均値をmain関数
で画面出力すること
590デフォルトの名無しさん:2008/04/21(月) 22:25:23
宿題スレ行け
591デフォルトの名無しさん:2008/04/21(月) 22:35:58
>>589
どこからどうやって読み込むのかが不明なのでなんとも言えない
592デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/21(月) 22:53:37
コマンドライン引数に指定したファイルのデータ長を取得するような
処理を作りたいのですが、上手くいきません

お手数かと思いますが、どなたか教えて下さい
594デフォルトの名無しさん:2008/04/21(月) 22:57:43
Cではファイルのサイズを取得する汎用なライブラリは存在しないので
環境依存の技を使う必要がある
実際にstdioライブラリで読み取ることのできるデータ数が問題なら
実際に読んでその数を数えるしかない
595デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/21(月) 23:08:08
>>596
sscanf(p, "%2d", &num);
p+=2;
printf("%3.0d", num);
600デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/21(月) 23:40:23
>>594-595>>597-598
レスありがとうございます
>>598さんのソースを使って実行してみたところ、取得できました
が、ファイルサイズの取得でした
無知で申し訳ありませんがファイルサイズ=データ長という認識でいいのでしょうか?

602デフォルトの名無しさん:2008/04/21(月) 23:42:41
自分で書いたんだろ
どういうつもりでデータ長と書いたんだよ
603デフォルトの名無しさん:2008/04/21(月) 23:47:10
>>602
すみません、気分を損ねるようなつもりは全くありませんでした
例えばstrlenを使うようなイメージでした
ファイルサイズを取得する処理はできていたのですが、データ長を取得する処理だと言われ
こちらにお邪魔した次第です。ファイルサイズとデータ長の違いがわからないのです

教えて頂いたのに本当にすみません


604デフォルトの名無しさん:2008/04/21(月) 23:52:33
いや別に怒ってはいなくてさ

データ長てのはファイルに何かしらの形式でデータが入ってて、
その長さとかそういう事なの?
605デフォルトの名無しさん:2008/04/22(火) 00:03:49
>>604
実際にやりたかったのは指定したファイル(形式は一定でない)のデータ長を取得して
既に出来上がっている関数に飛ばすと言った処理をやりたかったのです
データ長と書いたのは恥ずかしい話なのですが関数の引数コメントに
「ファイルデータ長」と書いてあったからで、何故データ長を使用するのかわかりません

自分なりに調べてファイルサイズを取得、関数に引き渡す処理を作成したのですが
口頭で説明したところ「ファイルサイズじゃなくてデータ長」と言われ、違いがわからなかったのです
1バイト文字、2バイト文字を混ぜたようなテキストファイルを作成した時のバイト数(目算)と
単純なファイルサイズに違いがないので、何がどう違うのかすらわからなくて・・・

それでここにお邪魔したのですが、調べ方が足りなかったように思えます
自分が甘かったです。本当にすみませんでした
606デフォルトの名無しさん:2008/04/22(火) 00:05:44
そいつに違いを聞けよ
607582:2008/04/22(火) 00:14:48
>>583
スタイルの違いってことなんですね。
はじめて見た形だったので
関数のスコープが変わるのかな、なんて勘違いしそうでした。

どうもありがとうございました。
608デフォルトの名無しさん:2008/04/22(火) 00:16:03
あーエスパーで答えると
1レコード固定長で可変長文字列データを複数レコード格納する場合、
ファイルサイズ != データ長 となるかもしれんね
609デフォルトの名無しさん:2008/04/22(火) 00:18:44
>>605
本人に聞け
わかるまで聞け
要件を徹底的に具体化するのはプログラマの基本だ
610デフォルトの名無しさん:2008/04/22(火) 00:24:05
>>605
メモリに展開しろって意味だ、多分
611デフォルトの名無しさん:2008/04/22(火) 00:26:12
>>607
プロトタイプ宣言以前の時代から使っているロートルに多い。
あいつらは放っておくとこんなソースを書きかねない。
main()
{
double sqrt();
printf("%g\n", sqrt(.1));
}
612デフォルトの名無しさん:2008/04/22(火) 00:28:19
>>611
まっとうなロートルは
sqrt(1.0);
または
sqrt((double)1);
と書く
613デフォルトの名無しさん:2008/04/22(火) 00:30:21
>>611
それも立派なプロトタイプ宣言なのだが
614デフォルトの名無しさん:2008/04/22(火) 00:34:22
>>612
0.1であることに注意。

>>613
一般的に、引き数リストがないものはそう呼ばないのでは?
いずれにしても「その頃からやってるロートル」なので、一応C99も「知っている」らしいよ。
615デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/22(火) 01:59:08
今使ってるパソコンでやればいいだろ。
620デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/22(火) 07:02:18
>>622

だよな。コンソールアプリしか作れんが。
標準を覚えたいならVCなんかは却って邪魔かも知れん。
ただし、将来Windowsアプリの仕事をしたい、
と思うなら「Cを覚える」というより「VC++を覚える」、という感覚のほうがいい。
624デフォルトの名無しさん:2008/04/22(火) 14:14:29
C言語、全くわからないのでこれから勉強しようと思うのだが参考になる書物とかある?
スレチだったらスマソ
625デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/22(火) 17:43:36
>>628
おぬしもワルよのう( ̄ー ̄)
630デフォルトの名無しさん:2008/04/22(火) 17:46:43
>ファイルを読み込み
日本語が理解できない人かw
631デフォルトの名無しさん:2008/04/22(火) 18:22:54
標準入力からEOFが入力出来ないって本当ですか!?
632デフォルトの名無しさん:2008/04/22(火) 18:24:53
うそです
633デフォルトの名無しさん:2008/04/22(火) 18:38:31
>>586
安定なソートですから、それなりに有用な場合があるのかもしれません。<バブルソートの高速化
634デフォルトの名無しさん:2008/04/22(火) 18:38:46
宿題スレの隔離から出てこないで下さい><
635デフォルトの名無しさん:2008/04/22(火) 18:48:22
バブルソートをどうにかしようって考えるよりも、ソートを高速化する過程に
効率の悪いバブルソートが用いられるのはよくあることだ。
そうやって、アルゴリズムを改良すると、処理時間、計算量が減って
効率が良くなるという勉強をするのさ、そういった分野の学校では。
636582:2008/04/22(火) 18:55:24
このスレ結構にぎわってるんですね。
Cしかできない俺が最近はやりのJavaScriptに劣等感を抱いているんだが、
バカにしたもんじゃないなって嬉しくなった
637デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/22(火) 19:11:55
おいっ、ナンバーサインを全角で書くな・・・NG登録してんのにw
639デフォルトの名無しさん:2008/04/22(火) 19:36:46
>>637
リンカがエラー出してない?
シンボルが重複してますよって
640デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/22(火) 20:05:16
GCCのバージョンは?
古いとそういう挙動を示す。
ANSIではエラーにならなければならないが。
642デフォルトの名無しさん:2008/04/22(火) 20:10:11
gcc-4.1.1です。
2007年1月5日にリリースされているみたいなので、古くはないとは思うのですが
何かバグでもあるのでしょうか...
643デフォルトの名無しさん:2008/04/22(火) 20:12:08
gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-51)
が詳細です。連レスすみません。
644デフォルトの名無しさん:2008/04/22(火) 20:20:26
シンボルの重複はリンカの担当だから、ldの問題。
--allow-multiple-definitionあたりが渡ってないか?
645デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/22(火) 21:11:37
できるよ
647645:2008/04/22(火) 21:22:44
ありがとう
648デフォルトの名無しさん:2008/04/22(火) 21:37:15
>>645
それにしても、なにか怖い構造だね。
649デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/22(火) 22:07:28
至って普通だと思うけど何で?
651デフォルトの名無しさん:2008/04/22(火) 22:08:12
652デフォルトの名無しさん:2008/04/22(火) 22:15:30
>>649

if(n1<n2-10 || n2+10<n1){
  ;
else
  ;

まあどのみちオーバーフロー対策してないがね
653デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/22(火) 22:19:39
>>649
sa = n1 - n2;
 if(sa < -10 || sa > 10)
  puts("...以上です。");
 else
  puts("...以下です。");
何かの宿題?

>>651 気を悪くしたら許してくれ。
malloc() free() の関係はできるだけ見通しがいいようにという余計な話をした。
作り手の趣向だから非難してるんではないよ。
655デフォルトの名無しさん:2008/04/22(火) 22:21:17
>>653
ども。リロードしてなくて私も送ってしまった。。
656649:2008/04/22(火) 22:27:01
皆様ありがとうございます。
大変参考になりました。

現在C言語の入門書を買って独習している段階でして、
本の中の演習問題が>>649で論理OR演算子を使えという指示でした。
ちょっと解答が思いつかなかったので自分で作れる範囲で作ってみたのですが、
やはり問題文を無視しては解答にはならんだろうw、と質問させて頂きました。
657デフォルトの名無しさん:2008/04/22(火) 22:33:12
>>656
独学・・なるほど。ま、がんがんソース書きまくれ。
658デフォルトの名無しさん:2008/04/22(火) 23:01:56
まさかとは思うけど
( sa = n1 - n2 ) >= 0 || ( sa = n2 - n1 );
だったりしてw
659デフォルトの名無しさん:2008/04/22(火) 23:26:35
>>654

> >>651 気を悪くしたら許してくれ。
> malloc() free() の関係はできるだけ見通しがいいようにという余計な話をした。
> 作り手の趣向だから非難してるんではないよ。

確かにあまりいい設計ではないね。
やむを得ずそうなっちゃうこともあるけど。
660デフォルトの名無しさん:2008/04/22(火) 23:38:16
メモリアロケートを関数で行なわなければならないなら、こんな戦略かな。
・関数名にallocなどのキーワードを含めるようにして確保も行なっていることを明示する。
・(freeするだけになってしまうかもしれないが)解放用の関数も用意し、使ってもらう。
661デフォルトの名無しさん:2008/04/23(水) 00:21:58
ついでにログを仕込んだり、アロケート回数を管理したりとかね
662デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/23(水) 12:57:13
>>662
-fno-common オプションをつけるといいらしい
664デフォルトの名無しさん:2008/04/23(水) 13:02:31
コンパイラの動作なんか気にする前に素直に
他のソースに実体があることを示したいならexternをつけなさい
そのファイル内でしか使わないことを確実にしたいならstaticをつけなさい
665デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/23(水) 16:09:28
>>666 自己紹介乙。
668デフォルトの名無しさん:2008/04/23(水) 16:19:22
まあ>664でFAだがな
669デフォルトの名無しさん:2008/04/23(水) 22:32:13
char cRet[512];

printf("ファイルパス:\n");
fgets(cRet, 512, stdin);

こんな感じで画面上に入力された文字(ファイルパスを想定)を取得した後に
fopenでファイルを開こうと思っているのですが、何度やっても開けずにエラーになります
ファイル自体はちゃんと存在しているファイルなのですが、何が悪いのでしょうか?
670デフォルトの名無しさん:2008/04/23(水) 22:35:03
>>669
馬鹿か?それだけだされてわかるわけねーだろwwww
671デフォルトの名無しさん:2008/04/23(水) 22:38:48
>>669
errnoを調べる
672デフォルトの名無しさん:2008/04/23(水) 22:42:24
>>669
受け付けたcRetには入力したファイル名+改行コードが入ってんじゃね?
673デフォルトの名無しさん:2008/04/23(水) 22:43:49
674デフォルトの名無しさん:2008/04/23(水) 22:46:22
ゲッツと言えば、今日放送されたクイズヘキサゴン2に出演してたなぁ。
675デフォルトの名無しさん:2008/04/23(水) 22:47:52
>>669
末尾の \n を削除しれ
676デフォルトの名無しさん:2008/04/23(水) 22:49:32
すいません\nを削除するにはどうしたらいいんでしょうか
677デフォルトの名無しさん:2008/04/23(水) 22:50:10
ちょっとは頭使え
678デフォルトの名無しさん:2008/04/23(水) 22:50:59
>>672>>673>>675
ありがとうございます
ググったらやり方が載ってたので試してみます
679デフォルトの名無しさん:2008/04/23(水) 22:51:15
嫌なら環境にもよるが、EOFを入力しちゃいな。Ctrl+Zとか+Dとか。
むりぽなら別のライブラリで入力を受付ちゃいな。
680デフォルトの名無しさん:2008/04/23(水) 22:54:28
二度と入力できなくなるじゃないか・・・
681デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/24(木) 00:10:14
関数プロトタイプ書け。
684デフォルトの名無しさん:2008/04/24(木) 00:12:34
>>682
関数は使用(呼び出し)に先立って宣言する必要があります。
685682: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デフォルトの名無しさん:2008/04/24(木) 00:22:11
>>637
規格スレで聞いたところ
http://pc11.2ch.net/test/read.cgi/tech/1201153965/133-139
ということだそうです
687デフォルトの名無しさん:2008/04/24(木) 00:28:45
>>685
使っている処理系の標準ライブラリーにheapsort関数etcがあるんじゃないですか?
名前を変えてみるとか
688デフォルトの名無しさん:2008/04/24(木) 00:35:18
>printf("%d", heapsort(A[i]));
これはheapsortの使い方がよろしくないし。
>int deletemax(int *A, int n){
>void deletemax(int *A, int n);

プロトタイプと実体は一致してないし。

コンパイラが文句言うのも当然というか。
689682かつ685: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);
}
です。
690682:2008/04/24(木) 00:39:51
>>682
後者は修正しました。
タイミングずれたけど689のように。

heapsortの使い方・・・調べてみます。
691デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/24(木) 00:44:31
まあ、Aが未確保というオチはあるし。
たぶん結果って言っているわけだから、heapsortはfor文の前段で仕掛けて、
for分の中はA[i]の表示だけで良いような気がするわけ。
693691:2008/04/24(木) 00:44:54
あーごめん。配列渡してるのか
渡すのは
heapsorts(A, i)
とかでよろしく
694682: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デフォルトの名無しさん:2008/04/24(木) 01:21:14
無知と言うよりも、基礎を学ばずにいきなりヒープソートだなんて、一体全体何考えているんだか。
696デフォルトの名無しさん:2008/04/24(木) 02:04:17
引数の意味すらわかってないようにも見えるしな
697デフォルトの名無しさん:2008/04/24(木) 08:08:30
>>680
いえ、fclose() されるわけではないので、大丈夫です。
698デフォルトの名無しさん:2008/04/24(木) 08:28:26
>>697
行の途中では^zや^dは利かないんじゃないか?
逆に、利いたとしたらストリームが閉じられているわけだから
二度と入力できなくなるぞ。
699デフォルトの名無しさん:2008/04/24(木) 09:19:29
ttp://www.bohyoh.com/CandCPP/C/Library/fgets.html
> 改行文字を読み取ったとき、またはファイルの終わりを検出したときに、
> 文字の読取りは終了し、
改行コードまで取り込む性質があるわけだから、入力>改行で終わらせたら
当然改行コードは含まれてしまう。そこで、それを排除して取り込めばおk。
まぁ、やはり手段としてはEOFを入力するのもありだが、別のライブラリを用いては?
700デフォルトの名無しさん:2008/04/24(木) 09:24:27
そこで、gets関数
701デフォルトの名無しさん:2008/04/24(木) 09:43:19
っツーか、面倒くせぇ〜からmainへの引数として、実行する際にパラメーターに
ファイル名を渡して処理しチャイナと。
702デフォルトの名無しさん:2008/04/24(木) 13:32:34
>>686
わざわざ質問してくださってありがとうございます。
http://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デフォルトの名無しさん:2008/04/24(木) 17:25:19
CreateProcessで起動したプログラムをSendMessageで終了させるにはどうしたらいい?
検索してたらこんなん見つけたんだけど

引用元:http://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デフォルトの名無しさん:2008/04/24(木) 17:40:45
FindWindowが駄目なら
FindWindowExを使えば良いじゃない。
705デフォルトの名無しさん:2008/04/24(木) 17:44:48
Exは子ウィンドウのときだろ。

「FindWindowがおかしい」
キャプションかクラス名の指定がウンコなんじゃねーの。
706デフォルトの名無しさん:2008/04/24(木) 18:00:48
>>703
使い方解説もなにも、
そのEnumProc関数をどこかに作っておいて

>EnumWindows(EnumProc, (LPARAM)pi.dwProcessId); 

を実行するだけじゃない?
707703: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デフォルトの名無しさん:2008/04/24(木) 18:21:16
>>707
プロセスを作ってすぐにFindWindowしても、sample.exeの方はまだCreateWindowを呼ぶ前かもしれないし
WaitForInputIdleとか試してみたらどう
709デフォルトの名無しさん:2008/04/24(木) 18:24:41
sleepで無限ループさせてるなら、なぁ。

sample.exeのキャプションに"sample"が無いんじゃねーの。
Spy++でも使って調べてクラス名でやってみれ。
710デフォルトの名無しさん:2008/04/24(木) 18:26:59
いつまでスレチにかまってんだよ
711デフォルトの名無しさん:2008/04/24(木) 18:41:57
>>681

 int *A;
 scanf("%d", A[0]); // この時点ば終わっている

貴方はポインターの使い方を全く理解していない。

 int iValueBody[256];
 int* A = iValueBody;

A の実体が無いのに、そこに値を放り込むなんてダメだよ。
なのでそれ以降はナンセンス。
712デフォルトの名無しさん:2008/04/24(木) 18:55:13
nに値が入ってないのにループ回してるほうが先だろw
713デフォルトの名無しさん:2008/04/24(木) 19:09:51
>>706,>>709
ありがとう、後でやってみる

>>708
sampleはコンソールアプリなんだ
714デフォルトの名無しさん:2008/04/24(木) 19:28:00
715デフォルトの名無しさん:2008/04/24(木) 19:36:39
>>714
そっち行ってみます
716デフォルトの名無しさん:2008/04/24(木) 19:51:36
>>712
むむむ。彼の書き込みをみると、n には程よい値が入っていてくれて A はどこかちゃんとしたメモリー空間を示していてくれる・・という、とてつもない期待をしてるんだろうなぁ。(遠い目)
人工知能の C++MiKu とかだったら、希望通りにしてくれるのかもしれない(今は無くとも将来はまんざらでないかも)
717デフォルトの名無しさん:2008/04/24(木) 19:59:59
少なくともソートとかに手を出すレベルじゃないのは確かだな
718デフォルトの名無しさん:2008/04/24(木) 20:50:32
>>716同感です。

引数の渡し方がわからなくてあれだけ書いてるんだから
なんかサンプルみながらやってるんじゃない?
719デフォルトの名無しさん:2008/04/24(木) 21:58:27
自分で入力したデータの件数分の平均身長、平均体重を出したいです。
(人数は一番最初に入力)

この場合、変数は、int型のweight height の他何が必要でしょうか?
720デフォルトの名無しさん:2008/04/24(木) 21:59:46
10人に聞けば10通りの答えが返ってくる。
プログラムの書き方次第でどうにでもなるから答えようがない。
721デフォルトの名無しさん:2008/04/24(木) 22:01:41
>>719
がんばればint型一個でできるよ
722デフォルトの名無しさん:2008/04/24(木) 22:06:10
人数受け取ってmalloc
723デフォルトの名無しさん:2008/04/24(木) 22:06:54
C言語におけるリテラル文字列の取り扱いですが、
置かれるメモリプールとかライフタイムとか
どうであるのが正しいんでしょうか?

例えば以下のコードはありですか?

const char * func()
{
return "AAA";
}
724デフォルトの名無しさん:2008/04/24(木) 22:08:07
リテラル文字列は静的な領域に置かれる。
725デフォルトの名無しさん:2008/04/24(木) 22:08:28
>>723
普通にありです。
726デフォルトの名無しさん:2008/04/24(木) 22:25:05
>>724-725
回答ありがとうございました。
実装依存とかだと困るなーと思ってたんですが
そうじゃないんですね。
727デフォルトの名無しさん: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;
}
729719:2008/04/24(木) 23:09:08
質問変えます。
件数分の身長、体重を集計・・・するんですが、
どういう計算処理をすればいいんでしょうか?
730デフォルトの名無しさん:2008/04/24(木) 23:12:11
合計して人数で割る
731デフォルトの名無しさん:2008/04/24(木) 23:15:54
>>728
VB厨の私ですが感動しました
探して早速明日組んでみます(゚▽゚)
732デフォルトの名無しさん:2008/04/24(木) 23:15:58
>>729 つか, 算術的にはどういう計算をするかを考えないのか?
733デフォルトの名無しさん:2008/04/24(木) 23:20:08
もしダブルクォーテーションならスキップ
734デフォルトの名無しさん:2008/04/24(木) 23:30:11
>>729
そういうのを考える事が初めの段階だと思うけど・・
アルゴリズムの本でも買ったらどうだろう
>>730のとおり算数と同じ処理をしてあげればいい
735デフォルトの名無しさん:2008/04/24(木) 23:33:49
単純に考えた場合
[入力用]
int型 人数、1人の身長、1人の体重
[ほか]
int型 身長の合計、体重の合計、ループ用変数

こんなもん
736デフォルトの名無しさん:2008/04/24(木) 23:39:02
〜略〜

ループ{
 身長体重入力
 ついでに人数カウント


合計・平均計算

〜略〜
737デフォルトの名無しさん:2008/04/24(木) 23:46:08
>>713
そのEnumWindows()を使う手法はもちろんウィンドウを持つプロセスに対
してしか使えない。
コンソールアプリだとふつうはメッセージを受けとらないから、
TerminateProcess() するしかないんじゃないかな。
738デフォルトの名無しさん: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にしてみたら綺麗に取れました
ありがとうございますー
739737:2008/04/24(木) 23:55:49
>>737
他のスレで話が進んでいた。とても虚しい気分になった…
740デフォルトの名無しさん:2008/04/25(金) 00:26:19
〜略〜
int 人数、1人の身長、1人の体重
int 身長の合計、体重の合計、ループ用変数

人数 = 入力()

ループ {
 1人の身長 = 入力()
 1人の体重 = 入力()
 身長の合計 += 1人の身長
 体重の合計 += 1人の体重
} (ループ用変数が人数になるまで)

結局平均が欲しいのかよくしらないけど、とにかく集計の計算
〜略〜

まとめてみた。できそうじゃないか!
741デフォルトの名無しさん: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デフォルトの名無しさん:2008/04/25(金) 00:53:37
>>741 おk
743デフォルトの名無しさん:2008/04/25(金) 00:55:19
大丈夫なのと書いた方がいいのとの間には
大きな壁があるけどな
744TT:2008/04/25(金) 01:37:26
「Continue文」を使った宿題が出ました
内容が「60点以上を合格とし、合格者の平均点を出力する」です
誰かソースを教えて下さいm(_ _)m
745デフォルトの名無しさん:2008/04/25(金) 01:39:31
>>744
宿題スレへどうぞ。
いや、どちらかと言えば半年ROMってから出直すことをお勧めしますが。
746デフォルトの名無しさん:2008/04/25(金) 01:40:48
>>744
ソースを教えろといわれても、個人の成績のデータの入力仕様がわからないから教えられないだろ。
747TT:2008/04/25(金) 02:03:32
「個人の成績のデータの入力仕様」は適当な数値で・・・
748デフォルトの名無しさん:2008/04/25(金) 02:04:54
宿題スレ行け
749デフォルトの名無しさん:2008/04/25(金) 13:40:24
「uint16」「uint8」というのは、
どういう型ですか?おもに何に使うのでしょうか?

たぶん数字を代入できると思うのですが・・・
「int」の高度版のような奴でしょうか?

750デフォルトの名無しさん:2008/04/25(金) 14:16:00
num of bits
751デフォルトの名無しさん:2008/04/25(金) 14:16:27
uint16 おそらく16ビット符号なし整数
uint8 おそらく8ビット符号なし整数
おもに16ビット/8ビット符号なし整数として使う。

数字を入れてもいいけど、普通は数値を入れるだろうな。
752デフォルトの名無しさん:2008/04/25(金) 14:48:55
>>744

人数入力

人数回ループ {
点数入力
60以上なら合計変数へ加算し合格人数+1
60未満ならcontinue


合格者合計点÷合格人数を表示
753デフォルトの名無しさん:2008/04/25(金) 21:06:03
2次元配列変数sampleの中身を表示し、sampleの各値を1の位で四捨五入したものを
resultに入れ、resultの中身を表示するプログラムを作成せよ。
実行例
sample
13 36 18 54
25 62 19 78
41 93 87 21

result
10 40 20 50
30 60 20 80
40 90 90 20

これ出来る人いますか?
754デフォルトの名無しさん:2008/04/25(金) 21:08:06
>>753
はい、そこらじゅうにあふれています
755デフォルトの名無しさん:2008/04/25(金) 21:19:02
#include <stdio.h>
main()
{
float P,r ;
for (P = 1; P <= 9 ; P++)
{
r = P / 10 ;
printf("Hello! r=%f \n",r) ;
}
}

↑このとき「Hello!」は9回出ますが

#include <stdio.h>
main()
{
float r ;
for (r = 0.1; r <= 0.9 ; r=r+0.1)
{
printf("Hello! r=%f \n",r) ;
}
}
↑このときは「Hello!」が8回しか出ないのはなぜですか?
r=0.9のとき、なぜか出力がされません。
Cは初めてなので初歩的な勘違いかもしれませんが、解説おねがいします。
756753:2008/04/25(金) 21:20:06
誰かソースをお願い
757デフォルトの名無しさん:2008/04/25(金) 21:20:08
>>755
小数も2進数で表されるんだが、そのときに誤差が出る場合がある。
丸め誤差とかで調べてみ。
758デフォルトの名無しさん:2008/04/25(金) 21:21:18
>>757
> 解説おねがいします。
759デフォルトの名無しさん:2008/04/25(金) 21:24:02
>>756
宿題スレへいけ
760デフォルトの名無しさん:2008/04/25(金) 21:27:58
>>757
十進法と二進法でわずかな誤差が出てるんですね
前者を使うことにします、ありがとうございました。
761デフォルトの名無しさん:2008/04/25(金) 21:29:03
>>756
よしちょっとまってろ
762デフォルトの名無しさん:2008/04/25(金) 21:29:07
整数でまわすんならループ変数はintの方がいいよ。
763デフォルトの名無しさん:2008/04/25(金) 21:29:44
>>755
> for (r = 0.1; r <= 0.9 ; r=r+0.1)
r <= 0.9のイコールが問題
浮動小数点の場合イコールは厳禁

#define EPC 0,000001

for (r = 0.1; r <= 0.9+EPC ; r=r+0.1)

とかやるんじゃないの?
764デフォルトの名無しさん:2008/04/25(金) 21:31:51
厳禁ってほどでもないだろ
確かに計算結果としてその値ちょうどになることを期待してはいけないけど、
フラグ値として0.0とか-1.0とか仕込むことはありうるわけで
765デフォルトの名無しさん:2008/04/25(金) 21:33:28
>とかやるんじゃないの?
カンマとピリオドはともかくとしてや ら ね え よ
ふつうforカウンタに浮動小数点数は使わない
766デフォルトの名無しさん:2008/04/25(金) 21:37:02
どうしてもやりたいなら

for(r=0.1; r<1.0; r+=0.1)

だな

配列の添字などが0スタートなこともあるので、
Cでのループは i=0; i<n; i++ ってな風に書く癖をつけといたほうがいい
767755:2008/04/25(金) 21:39:52
なんという返事の速さ
みなさん返答ありがとうございました。
ループ内で、rを式に使いたかったのですが、ループ変数は
整数を使うことにします
768デフォルトの名無しさん:2008/04/25(金) 21:40:22
そうだね
for文の中身をシンプルにしたほうが読みやすいコードになるし、バグも少なくなる。
769デフォルトの名無しさん:2008/04/25(金) 21:42:06
>>756
できたよー
#include<stdio.h>
#define f(x) for (i = 0; i < sizeof(sample) / sizeof(int); ++i, ++p) { \
if ((i + 1) % 4) printf("%d ", *p); \
else printf("%d\n", *p); }
int main(void)
{
int sample[][4] = {{13, 36, 18, 54}, {25, 62, 19, 78}, {41, 93, 87, 21}};
int *p = (int *)sample, i;
puts("sample");
f(p);
p = (int *)sample;
for (i = 0; i < sizeof(sample) / sizeof(int); ++i, ++p)
*p = *p % 10 >= 5 ? (*p / 10 + 1) * 10 : *p / 10 * 10;
p = (int *)sample;
puts("result");
f(p);
return 0;
}
770デフォルトの名無しさん:2008/04/25(金) 21:49:50
*p = (*p + 5) / 10 * 10 でいいじゃん。
771デフォルトの名無しさん:2008/04/25(金) 21:53:10
>>755
#include <stdio.h>

int main(void)
{
float af,bf=0.1;
double ad,bd=0.1;
int cnt;

for(af=0.1,cnt=1; af<=0.9; af+=bf,cnt++) {
printf("%2d Hello\n",cnt);
}
printf("\n");
for(ad=0.1,cnt=1; ad<=0.9; ad+=bd,cnt++) {
printf("%2d Hello\n",cnt);
}
return 0;
}
772756:2008/04/25(金) 21:57:55
>>769
マジデありがとう!!感謝!!!
773デフォルトの名無しさん:2008/04/25(金) 22:03:34
これはひどい(笑
774デフォルトの名無しさん:2008/04/25(金) 22:07:06
他はともかくそのマクロの使い方はないだろう
わざとか?
775デフォルトの名無しさん:2008/04/25(金) 22:07:44
>>769
行末に \ が入るエディタ使うてますな?自分もかつて大学生時代に使ってますたが
東大、京大卒の教授の下で受けていた授業で
776デフォルトの名無しさん:2008/04/25(金) 22:09:00
>>774
なんで?理由を求む。自分はそうしないとか、そういうのはという 主観 では
世の人間は理解しないよ。速度を出しすぎても、事故らなきゃ問題のないという
人はいくらでもこの世にいるように。しかし、そんな奴でも目の前に障害物があれば
当然それに応じて回避するなり速度を落とす、さ?
777デフォルトの名無しさん:2008/04/25(金) 22:09:37
わざとって明らかだろ

756>先生宿題やってきました!
先生>なんだこのソースは。君、解説できるのかね
756>・・・・・・・・・・・・
先生>またどこかで拾ってきたソースだろう。減点だ、減点。
778デフォルトの名無しさん:2008/04/25(金) 22:17:05
>>775
お前は一体何をw
779デフォルトの名無しさん:2008/04/25(金) 22:20:29
>>776
コーディングスタイルというのは共有化された主観だからな
違和感をもたれた時点で好ましくない
780デフォルトの名無しさん:2008/04/25(金) 22:25:30
こんなコードでコーディングスタイル論争するなよww
781デフォルトの名無しさん:2008/04/25(金) 22:30:59
>resultに入れ
これが見えない人に何言ってもムダw
782デフォルトの名無しさん:2008/04/25(金) 22:43:02
>>779
> 違和感をもたれた時点で好ましくない
はい、でました、それがお前の 主観 に過ぎないってことだよ。
お前、この世に自分以外の人間が何人いるとでも?
渦中の国民でも世界の人口の6分の1、10億人だよ?
世界全体で60億人。お前はその中の 1人 に過ぎない。
そのくせ、主観で否定して良いとでも思ってんのか?
全員が通している コンパイラ様 が良いつってんのに?w
783デフォルトの名無しさん:2008/04/25(金) 22:44:20
>>781
それもわざとなんじゃないか?
784デフォルトの名無しさん:2008/04/25(金) 22:45:44
まぁ、世の中ってのは何かと 人間が決めたルール ってのがあって
コンピュータの基本的な仕組みは共通でも、そのシステムは
基本構造を人間が都合よく定義や規定(標準化)を決めて作っているわけだ。
その定義や規定に則って、俺らはコードを書いてプログラミングをしているわけだ。
そのコンパイル様に、これでええか?ええのんか?なぁ、もっとこうしたらええか?
それはあかんか?なんていちいちご機嫌を伺うのか?良いなら良い、ダメならダメ
そうとしか言ってくれませんよ、脳みそこねこねコンパイルは。
785デフォルトの名無しさん:2008/04/25(金) 22:46:51
人が書いたコードに違和感持つのは当たり前じゃないか?
ループ {

ループ


ループ { }
いろんな人でてくるだろ
人が書いたコードを読んで理解する力も必要だと思うけどな
786デフォルトの名無しさん:2008/04/25(金) 22:56:40
>>785
違和感は良いとして、それが否定できるものではなかろう。
そんなこといったら、貧乏人は一生金持ちから理解されないだろうね。
だから共通した ルール に基づいて通れば良いんだよ。
ホリ○モンみたく、小賢しいけど誤魔化しで通そうとすると、後で
まともに動作しないプログラムが出来て、多くの人から理解されないだろうけどなw
787デフォルトの名無しさん:2008/04/25(金) 22:59:39
関数型マクロなのに、xが意味なかったり、iとかsampleとかpなんて平気で使ったり、
頭おかしいだろw
788デフォルトの名無しさん:2008/04/25(金) 23:02:30
とにかく、基本部分は同じ汎用電子計算機のプログラムのコードを書く人の
思想や人種、生活スタイルは様々でも同じコンパイラ、プログラム言語にて
通用するものであればなんら問題はないわけだ。所詮自分なんてこの世の
一人に過ぎない。この世は自分一人だけの都合や、一人の力では
成り立ってもいなければ動いてはいませんよ、よほどのVIPでない限り。
たとえVIPでも、地球の運命までは変えられんよ。より多くの人の行動によって
社会、歴史は動いてきたのだから。戦争にしても、ね。
789デフォルトの名無しさん:2008/04/25(金) 23:03:26
あー 人に見せるんだから変数は最低限わかりやすくしないとな
790デフォルトの名無しさん:2008/04/25(金) 23:04:46
無限ループ突入しそうだから一旦break;しようぜ
791デフォルトの名無しさん:2008/04/25(金) 23:10:31
皆おちつけ
常識のない人間に関わるのは時間の無駄だ
792デフォルトの名無しさん:2008/04/25(金) 23:22:04
自分が常識人だと思う前に、常識人テストでも受けて
成績を見せてから言えよw
793デフォルトの名無しさん:2008/04/25(金) 23:23:49
マクロ内での\の意味すらわかってないヤツがなに言ってもな……
794デフォルトの名無しさん:2008/04/25(金) 23:29:20
>>793
わかった気になっているお前の方が知ったかぶりってことだw
795デフォルトの名無しさん:2008/04/25(金) 23:30:49
>>793
意味不明。お前が説明しろ。ちなみに、マクロを改行して記述した場合どうなるか?
お前が分かってないみたいだな。
796デフォルトの名無しさん:2008/04/25(金) 23:33:40
だからもうあれはわざとでFA

>>756が減点サレルノダヨ
797デフォルトの名無しさん:2008/04/25(金) 23:33:41
検索するのに少し時間かかったなw
798デフォルトの名無しさん:2008/04/25(金) 23:38:09
>>793
793 名前:デフォルトの名無しさん 投稿日:2008/04/25(金) 23:23:49
マクロ内での\の意味すらわかってないヤツがなに言ってもな……
↑分かった振りをして誤魔化す馬鹿。あれは改行していないのに
あるエディタにて、あのように行末に表示されるものがあるんだよ
それをコピペしたというのは、使っている人なら普通に分かる。
799デフォルトの名無しさん:2008/04/25(金) 23:39:36
778 名前:デフォルトの名無しさん 投稿日:2008/04/25(金) 22:17:05
>>775
お前は一体何をw

↑ほらな、茶化すだけで 説明 すらしない。知ったかぶりってのはこういうことを言うんだよ。
知っている人は普通に知っている。こいつはあのマクロを特殊だと思ったんだろうねw
マクロの中に \ あのように入る意味があると思っているんだろうねw
800デフォルトの名無しさん:2008/04/25(金) 23:41:52
改行が必要なほど長いマクロを書く場合は行末に\を置く必要がある。
エディタの種類とか関係ない。
801デフォルトの名無しさん:2008/04/25(金) 23:43:22
突っ込まれても、突っ込んだ人が分かってないと茶化すだけで
自分がだめだしした 理由 を述べない卑怯者。
こんな奴は、一生他人から理解されないまま干されて孤立するだろうね。
一方、理由が分かっている人は、理屈や現実的な話をして
相手を理解させることが出来る。だいたい、事実無根か真実かは
本人が体験すれば一番分かることだから。
802デフォルトの名無しさん:2008/04/25(金) 23:49:16
以下いつもの流れ
803デフォルトの名無しさん:2008/04/25(金) 23:50:07
>>769
とりあえず、これをコンパイルしてみろ。話はそれからだ。
gdgdそんなのはと、主観しか言わない奴は論外。
お前が作ったコンパイラでもC言語でもないだろw
804デフォルトの名無しさん:2008/04/25(金) 23:50:28
しばらく静かだったからどっかの精神病院に入院したか、親にPC取り上げられたかと思ってたのになぁ
805デフォルトの名無しさん:2008/04/26(土) 00:01:39
ヒント:筋の通った説明が出来ない奴ほど、誤魔化して相手が理解していないことを
必死に粗探しをするかのごとく始め、勝手な自分基準で相手が分かってないということにして
相手のすべてを否定しようとする姑息な手段をとる
卑怯者の常套手段だな。そんなの、一定以上の人生経験を積み重ねた人に
通用するわけねーだろ、JK
806デフォルトの名無しさん:2008/04/26(土) 00:01:49
ム板はIDないから不便だな
おいそこのお前コテハン付けろよ
807デフォルトの名無しさん:2008/04/26(土) 00:03:28
ここの住人は荒らし耐性0なんだな
808側近中の側近 ◆0351148456 :2008/04/26(土) 00:04:21
(っ´▽`)っ
マクロの中の\は意味があると思うよ。
改行コード\nを無効化しないといけない。

っていうか、釣られてますな・・・
809デフォルトの名無しさん:2008/04/26(土) 00:04:30
ちょいと質問です。
大学で卒業までにC++でオリジナルカードゲームを作ろうと思っています(複雑さはUNOぐらいです)。
特徴は、

・見た目は、Windowsに入っているソリティアの様な感じ
・CPU戦ではなく、一対一でオンライン対戦
・マッチングは考えず、とにかく二つのPCで対戦出来れば良い

といった感じです。
そこで、これを作るのに必要だと思われる開発環境を教えて頂けないでしょうか?
現在あるのはCのコンパイラとCPADのみです。
オンラインや見た目の部分で他にも色々と必要だと思うのですが・・・。
ちなみにプログラムの腕は黒い画面で○×ゲームが作れるぐらいです(現在大学2年)。
810デフォルトの名無しさん:2008/04/26(土) 00:06:17
Win API頑張ったらいいと思う
811デフォルトの名無しさん:2008/04/26(土) 00:07:46
言いたいことがあるなら筋の通った理論で反論しろや?
マクロの \ に何の意味があるんだ?その前に改行したのをコンパイルしてみろよ?
812側近中の側近 ◆0351148456 :2008/04/26(土) 00:09:49
>>811
(っ´▽`)っ
コンパイルエラー出ると思うよ・・・
ねとすた見るから後でな
813デフォルトの名無しさん:2008/04/26(土) 00:12:44
さて釣り宣言はいつごろになるのかな
814デフォルトの名無しさん:2008/04/26(土) 00:13:25
>>811
>マクロの \ にry
先生!この人おかしいです!
815デフォルトの名無しさん:2008/04/26(土) 00:15:29
>筋の通った理論で反論

マクロで改行する場合は末尾に \ がいる
これでいいか?顔真っ赤な人久しぶりに見たわ
816デフォルトの名無しさん:2008/04/26(土) 00:25:17
だめだ、知ったかの基地外が \ に意味があると思い込んでるよ・・・
ここまでいくと、重症だよな。絶対にこいつは説明が出来ないよ。
コンパイラを無視して主張しても無駄ってことだから。
817デフォルトの名無しさん:2008/04/26(土) 00:27:04
マクロの中で\なしで改行してもコンパイルできるコンパイラを教えてくれw
818デフォルトの名無しさん:2008/04/26(土) 00:27:39
あと、俺は別にあのマクロを問題がないとか良いとか言ってないから。
あくまでも コンパイラが通す かどうか、だぞ。
処理結果の内容については話は別。言っただろ?
ルールに基づいていれば良いと。しかし、それがどういう結果を招くか?は
そいつ次第。
819デフォルトの名無しさん:2008/04/26(土) 00:31:06
マクロから\抜いたらコンパイラ通らないってみんな言ってんだよw
820デフォルトの名無しさん:2008/04/26(土) 00:34:39
\無しじゃコンパイラ通さないしw

あの、自信過剰で人生うまくいくと思いますか・・・

>マクロの \ に何の意味があるんだ?その前に改行したのをコンパイルしてみろよ?
>あくまでも コンパイラが通す かどうか、だぞ。
通さないから\がいる

頭痛ぇ〜コイツ
821デフォルトの名無しさん:2008/04/26(土) 00:38:18
さんざん自信満々でかみついてそのたびにボコボコにされたことは数知れないのに、
ちっとも成長しないからな……
822デフォルトの名無しさん:2008/04/26(土) 00:42:03
そもそも、マクロを処理するのはプリプロセッサだから、コンパイラは通すもへったくれもないけどね。
って空気読まずに書いてみる。
823デフォルトの名無しさん:2008/04/26(土) 00:44:44
空気嫁
824デフォルトの名無しさん:2008/04/26(土) 00:57:26
>>815
ぷっ コンパイルしてからモノを言え、基地外
825デフォルトの名無しさん:2008/04/26(土) 00:59:31
>>809
おもしろいゲームにするためのルールを考える方が先だ
その他のものは後からどうにでもなる
826デフォルトの名無しさん:2008/04/26(土) 01:01:48
まぁ広義の方のコンパイラではあるわけですし
827デフォルトの名無しさん:2008/04/26(土) 01:03:18
一体化してるしな
828デフォルトの名無しさん:2008/04/26(土) 01:06:53
顔を真っ赤にして釣りえさに食いつくおまいらに脱帽、参ったw
829デフォルトの名無しさん:2008/04/26(土) 01:24:35
たまに伸びてたらコレかよ
おまえら暇ですね
830デフォルトの名無しさん:2008/04/26(土) 01:43:26
>>769
スレ違いだけどグローバルなマクロに見えるからここらに書いてくれた方が読みやすいと思った
int main(void)
{
#define f(x) for (i = 0; i < sizeof(sample) / sizeof(int); ++i, ++p) { \
if ((i + 1) % 4) printf("%d ", *p); \
else printf("%d\n", *p); }
int sample[][4] = {{13, 36, 18, 54}, {25, 62, 19, 78}, {41, 93, 87, 21}};
int *p = (int *)sample, i;
831デフォルトの名無しさん:2008/04/26(土) 01:50:09
>>760
コンパイラの次元で十進数扱いは COBOL 位しか思い浮かばない。
C++ とかなら BCD パッケージで十進演算を取り入れられるけど・・・
そんなことより整数なら十進数と二進数に誤差は無いのだからその特性を使うのがいいのでは。
二進数の少数は 1 -> 0.5 -> 0.25 -> 0.125 -> 0.0625 ...
というのを組み合わせて 0.75 = (0.5 + 0.25) ぴったしみたい以外もあるわけだから気をつけないとね。
832デフォルトの名無しさん:2008/04/26(土) 02:31:56
>>809
WindowsアプリをつくりたいのならVisualStudioかさもなきゃC++Builderを買っとくのが普通
もちろんAPI/SDKを駆使してできないわけじゃないけどそこまで苦労する意味はあんまりないからな
833デフォルトの名無しさん:2008/04/26(土) 02:45:14
>>831
その課題、問題がなんで出たか?って話では?
そういうコードを見せて、何でこうなるのか?理由を考察せよとか。
説明されているように、2進法では2^-nを用いて、小数点以下は
精度の範囲内で表されていると。
834デフォルトの名無しさん:2008/04/26(土) 03:26:51
C++Builder
835デフォルトの名無しさん:2008/04/26(土) 05:02:05
>>818
宿題スレから消えたと思ったら、こんどはここですか?
836デフォルトの名無しさん:2008/04/26(土) 07:16:34
>>749

どっかのヘッダファイルに

typedef unsigned short uint16;
typedef unsigned char uint8;

と書いてあると思う。
つまり、unsigned short/unsigned charと同じだが、
作成者は>>751のような意味を持たせてると思う。
837デフォルトの名無しさん:2008/04/26(土) 09:21:27
>>835
宿題スレから消えたと思ったら、こんどはここですか?
838デフォルトの名無しさん:2008/04/26(土) 09:23:08
>>835 = 目障りな入力はキーボードのみの知ったか似非講師
っつか、誰かと勘違いしてんだろ、お前。自ら粘着基地外って
自己紹介、アピールしなくて良いから、下らない主張をしてないで黙ってろよ
839デフォルトの名無しさん:2008/04/26(土) 09:33:29
最初に利率金額年数を入力すると、合計返済金額を計算し出力するプログラム
(但し、利率計算は関数を呼び出す)を作りたいのですが、計算部分がうまくいきません。

#include <stdio.h>
float interest(float r,int n);
int main(void)
{
double r;
int y,n,amo;
printf("利率(r): ");
scanf("%g",&r);
printf("金額(y): ");
scanf("%d",&y);
printf("期間(n):");
scanf("%d",&n);
amo = y * (float)interest(r,n);
printf("返済金額は%d円です\n",amo);
return 0;
}
float interest(float r,int n)
{
float rate;
int i;
for(i=1; i<=n; i++)
{
rate = rate * (1+r/100);
}
return rate;
}

オーバーフロー起こしたりしているので、正常では無いにしろ計算部分に飛んではいると思うのですが、
どこに問題があるのでしょうか?ご教示願います。
840デフォルトの名無しさん:2008/04/26(土) 09:40:06
>>839
rate の初期化
841デフォルトの名無しさん:2008/04/26(土) 09:40:38
>>839
特に必要がない限り、float型を使うのはやめましょう。
そして、scanf()のフォーマットは"%lf"にすべき。
"%lg"でもいいけれど、"%g"は間違い。
842デフォルトの名無しさん:2008/04/26(土) 10:21:47
>>835
言い負けした粘着乙。そんなに東大、京大卒の教授の下で指導を受けた元生徒のことが
妬ましくて、言い負けして悔しいのぅ悔しいのぅ?
843側近中の側近 ◆0351148456 :2008/04/26(土) 11:10:14
(っ´▽`)っ きめぇ
844デフォルトの名無しさん:2008/04/26(土) 11:33:34
どちらが粘着質かは自明だな。
845デフォルトの名無しさん:2008/04/26(土) 11:46:00
C言語の実行に必要なのを
マイクロソフトのホームページからダウンロードできると聞いたのですが、
どうすればいいですか?
846デフォルトの名無しさん:2008/04/26(土) 11:52:01
C言語は実行できません。
847デフォルトの名無しさん:2008/04/26(土) 11:56:12
848デフォルトの名無しさん:2008/04/26(土) 12:49:28
>>840>>841
ありがとうございます。
家に帰ったらすぐやってみます。
849デフォルトの名無しさん:2008/04/26(土) 13:35:51
浮動少数点型の-0.0000を環境によらずに"-0.0000"と表示するスマートな方法を教えてほしい

以下は自分で考えたコード

float d = 0;
*(int*)(&d) |= 0x80000000;

if((*(int*)(&d)) & 0x80000000)
{
printf("-");
}

*(int*)(&d) &= ~(0x80000000);

printf("%.4f\n", d);

850デフォルトの名無しさん:2008/04/26(土) 13:40:48
>>849
それは、おもいっきり環境依存の書き方だと思われ。
851デフォルトの名無しさん:2008/04/26(土) 13:41:46
>>850
どこが環境依存なのかくわしく教えてください
852デフォルトの名無しさん:2008/04/26(土) 13:45:09
>>849
だいぶ説明不足みたいなんで補足します。
浮動小数点少数型の表現はIEEE 754に限定します。
環境に依存したくないのは
printf("%.4f\n", d);
の部分だけです。すいません。
-0.0000のときに0.0000と表示されるのを避ける方法を教えてください。
853デフォルトの名無しさん:2008/04/26(土) 13:45:26
>>849
おいちゃんがきんもぉ〜★なソースで示しちゃうYO!
printf("%.4f\n", d*-1);
854デフォルトの名無しさん:2008/04/26(土) 13:47:14
>>853
それだと
0.0000 -> 0.0000
-0.0000 -> 0.0000
と表示されてしまいます。

必要なのは
0.0000 -> 0.0000
-0.0000 -> -0.0000
と表示する方法です。
855デフォルトの名無しさん:2008/04/26(土) 13:48:18
Cの配列って即値でしか大きさを指定できないの?
856デフォルトの名無しさん:2008/04/26(土) 13:50:46
float d = -0.0;
おいちゃんが詰まらんことをするYO!
857デフォルトの名無しさん:2008/04/26(土) 13:50:54
>>855
C99なら、変数でも指定できるらしいよ。
858デフォルトの名無しさん:2008/04/26(土) 13:51:41
C99ならそうでもありません。
859デフォルトの名無しさん:2008/04/26(土) 13:51:48
>>855
コンパイル時に解決できる式でもおk
860デフォルトの名無しさん:2008/04/26(土) 13:57:35
>>857-859
ありがと。
でもMSのVC++はC99対応じゃないんだね。
861デフォルトの名無しさん:2008/04/26(土) 13:57:38
>>856
ちょっと綺麗になったけど、まだ何とかなりそうな気がします。
>>849
float d = -0.0;
if((*(int*)(&d)) & 0x80000000)
{
printf("-");
}
printf("%.4f\n", fabs(d));

さらにエレガントな方法を教えてください
862デフォルトの名無しさん:2008/04/26(土) 13:59:45
何で、別に0.0に対して-なんて要らんでしょうに。
863デフォルトの名無しさん:2008/04/26(土) 14:01:50
-0.0<0.0という想像でものを言うけど
sprintfしたあとその条件を使って頭に-つけるかつけないか操作すればいいんじゃない
864デフォルトの名無しさん:2008/04/26(土) 14:01:54
>>860
VC++なら、vectorとか使えばいいのに。
865デフォルトの名無しさん:2008/04/26(土) 14:03:02
>>862
-0.000001を%.4fで出力した場合、出力結果が-0.0000になるものと
0.0000になるものがあります。
866デフォルトの名無しさん:2008/04/26(土) 14:04:12
867デフォルトの名無しさん:2008/04/26(土) 14:04:46
-0.0 == 0.0
868デフォルトの名無しさん:2008/04/26(土) 14:09:56
>>865
それって、表示云々よりも環境によって本来は0以下の値だったものが
情報が失われて0と等価にされてしまった場合によるものだろうし
環境によると言えばよるけど、変数には0として値が入っているわけだから
気にしてもしゃーないべ。より厳密にというなら、doubleで、doubleでも
精度によるけどさ、floatよりはってことで。
869デフォルトの名無しさん:2008/04/26(土) 14:16:30
>>868
説明不足ですまそ。

入力文字列"-0.000"を貰って、変数に格納して、それから出力するんだが、
入力と出力を一致させたいんだ。

float d = atof("-0.0000");
if((*(int*)(&d)) & 0x80000000)
{
printf("-");
}
printf("%.4f\n", fabs(d));


で、"-0.0000"ってのは好きで"-"を付けてるわけじゃなくて、
他人が作ったファイルに付いてるから、
こっちもそれに合わせないとしょうがないという状況です。

さらに
printf("%.4f %.4f %.4f", v1, v2, v3);
みたいに複数の数値を大量に出力する必要があるから、
printf()を何度も呼び出す余裕もない。
870デフォルトの名無しさん:2008/04/26(土) 14:37:40
うちの環境だと、-0.0は「-」がつく…

printfをラップするのがスマートかな
871デフォルトの名無しさん:2008/04/26(土) 14:45:50
俺のも-ついて表示されるな
872デフォルトの名無しさん:2008/04/26(土) 14:47:56
>>870
cygwinだと-0.0
mingwだと0.0
atof()の仕様と矛盾してるmingw側がおかしいとおもわれ
873デフォルトの名無しさん:2008/04/26(土) 16:05:07
なんかその手の入出力動作を制御する関数があった気がする…
調べてみるけど、他の文字列化関数探した方が良いかもな
874デフォルトの名無しさん:2008/04/26(土) 16:12:08
>>872
>>872
> atof()の仕様と矛盾してるmingw側がおかしいとおもわれ

規格のどこにそんな仕様が書いてある?

JIS の atof 見ると strtod を見ろと書いてあって, strtod の脚注には
以下の記述がある.

「浮動小数点傘寿値が符合付き0をサポートしている場合, 関数は0の符合を
正しく処理することができる」

要するに mingw が符合付き0をサポートしてないだけじゃないのか?
875デフォルトの名無しさん:2008/04/26(土) 16:17:28
mingwのatofのmanでその辺言及されてる?
876デフォルトの名無しさん:2008/04/26(土) 16:31:57
>>875 しらね. 使ったことないもん mingw なんて.
ただ, 規格的には無問題だろうと言いたかっただけ
877デフォルトの名無しさん:2008/04/26(土) 16:32:06
>>859
const intだろうと怒られなかった?c89規格
878デフォルトの名無しさん:2008/04/26(土) 16:35:32
全てのconst intがコンパイル時に解決できるとは限らないからねぇ。
879デフォルトの名無しさん:2008/04/26(土) 16:36:30
>>877
int a[1 + 3]; とかいう意味だろ
880デフォルトの名無しさん:2008/04/26(土) 16:37:39
なるほど!
881デフォルトの名無しさん:2008/04/26(土) 16:41:35
#include <stdio.h>
int main(int argc, char* argv[])
{
char sz[argc];
printf("sizeof(sz) = %lu¥n", sizeof(sz));
return 0;
}

これが gcc -std=c89 -Wallで警告なしでビルドできて、結果もvariableなんだけどそんなもん?
882デフォルトの名無しさん:2008/04/26(土) 16:48:20
int main()
{
double b = 3.345;
printf("%lf", b);
return 0;
}
みたいなもんなんだろう
883デフォルトの名無しさん:2008/04/26(土) 16:52:43
>>881
bccじゃ無理
884デフォルトの名無しさん:2008/04/26(土) 16:55:31
>>881
gcc 4.0.1 だが

main.c: In function ‘main’:
main.c:4: warning: ISO C90 forbids variable-size array ‘sz’

とか出てきたけど?
バージョンはいくらだ?
885デフォルトの名無しさん:2008/04/26(土) 16:56:32
と思ったら、癖で -pedantic 入れてたわ。
-pedantic ないと警告出ないのね。
886881:2008/04/26(土) 16:58:09
>>883
bccは厳密なのかもね。

>>884
gcc version 4.0.1 (Apple Inc. build 5478)

ちなみに-pedantic付けたら同じ警告が出た。
まあでも警告レベルってことは、gccはvariable-size arrayに関してISO C90 compliantじゃないってことなのかな。
887881:2008/04/26(土) 16:58:51
あ、遅かったorz
888デフォルトの名無しさん:2008/04/26(土) 17:08:45
>>886
そもそも可変長配列が規格に入ったのはISO C99。
BCCはC99に対応していないからエラーになるのだし、
gcc -pedanticでエラーになるのもC90モードだから。
gcc -std=c99 -pedanticならエラーなくコンパイル・実行できる。
889881:2008/04/26(土) 17:13:32
>>888
>>886はC99がどうとかじゃなくて、>>886はgccのISO C90への準拠度について

gcc -std=c89 -pedanticではエラーじゃなくて「警告」が出るんだよ。
ISO C90モードならエラーにならないとおかしいから、>>886って書いた。
890デフォルトの名無しさん:2008/04/26(土) 17:17:28
>>889
そういうことか、すまん。
エラーにしたければ-pedantic-errors使えばいい。
891デフォルトの名無しさん:2008/04/26(土) 20:28:11
>>874
mingwでもatof()は-0.0を正しく処理できる
atof()が-0.0を認識するのにprintf()では-0.0を認識しないのに納得いかないんだ

仕様という言葉を使ったのは軽率だったかと思う
規格には関係なく、-0.0を出力する方法を知りたい。

892デフォルトの名無しさん:2008/04/26(土) 20:50:57
だからさぁ、もう値としては0として格納されているんだから
仕様 ということに しよう
893デフォルトの名無しさん:2008/04/26(土) 21:00:46
>>892
いや、値はちゃんと-0.0として格納されてんだよ。
ソフトの仕様も-0.0を出力で納得できる。
なのになんでオレの処理系は0.0を出力しやがるんだ、このアホ処理系め〜!
894デフォルトの名無しさん:2008/04/26(土) 21:03:47
0と言う値に符号があること事態おかしいんだよ、ボーイ?
895デフォルトの名無しさん:2008/04/26(土) 21:05:04
IEEE 754的には-0 == 0のはず。
そう考えれば-0を0と出力する処理系があるのも仕方ない気がする。
896デフォルトの名無しさん:2008/04/26(土) 21:07:01
>>894
-0の妥当性なんてどうでもいいんだ。
とにかく、入力(メタセコとか言うソフトらしい)の書式にあわせた出力をしなけりゃならん
897デフォルトの名無しさん:2008/04/26(土) 21:10:17
解決しそうにないので、あきらめます
898デフォルトの名無しさん:2008/04/26(土) 21:11:53
>>895
それじゃ、符号なんてどうでも良いじゃんwwwww
第一、0より大きいか小さいか、そういう値ではなく単純に0なんだから。
そういう表示がされるからって、いちいち気にするような神経質だと
早く禿げるぞ。もっと気楽にいけや、な?

君は、年中気温が熱い土地で、北極や南極のような極寒を求めるのかい?
899デフォルトの名無しさん:2008/04/26(土) 21:23:37
よく判らんな。
例えば-1e-10を"%f"で出力するときに-0.000000"にしたいってことか?
mingwのprintf()はAPI由来なのかな?
それが嫌ならcygwinのprintf()を使えばいいじゃん。
900デフォルトの名無しさん:2008/04/26(土) 21:26:02
小数を文字列に変換する関数を自作するのが妥当?
901デフォルトの名無しさん:2008/04/26(土) 21:27:02
>>897
>>861で自己解決してるじゃねーか、
printfの問題はサポートにでもメールを出せ。
902900:2008/04/26(土) 21:27:50
頭に やっぱ がつくのな
903デフォルトの名無しさん:2008/04/26(土) 21:36:42
まぁ、力を抜いて前も抜いておけや、な?及川○央でもどぞ?
904デフォルトの名無しさん:2008/04/26(土) 21:39:08
905デフォルトの名無しさん:2008/04/26(土) 23:56:58
このスレを見ている人はこんなスレも見ています
906デフォルトの名無しさん:2008/04/27(日) 00:15:42
つまり何も見ていないという事か。
907デフォルトの名無しさん:2008/04/27(日) 08:59:36
このスレを見ている人はこんなスレを見捨てています
908デフォルトの名無しさん:2008/04/27(日) 10:45:14
つまんね〜質問だな!
909デフォルトの名無しさん:2008/04/27(日) 12:30:01
mllocとcallocについて質問です。

int *pi;
pi = (int *)calloc(5, sizeof(int));

pi = (int *)malloc(sizeof(int) * 5);
で、それぞれ確保された領域に値を代入すると双方とも

*(pi + 0),*(pi + 1),*(pi + 2),*(pi + 3)・・・・

で参照できると思うんですが
callocもmallocも同じように使っても問題ないんですか?
まだ勉強始めたばかりなので間違った認識をしているのかもしれませんが
どういうときに使い分けるのか良く分かりません。




910デフォルトの名無しさん:2008/04/27(日) 12:41:44
別にcallocは使えなくても死なない。
勝手にゼロクリアする分の処理がまるまる無駄になることも少なくないし。
911デフォルトの名無しさん:2008/04/27(日) 13:10:22
calloc → ゼロクリアが必要なときに使う
malloc → ゼロクリアが必要でないときに使う

特にゼロクリアが必要なくても
その処理が邪魔じゃなければ calloc 使っても別に構わない。
912デフォルトの名無しさん:2008/04/27(日) 13:16:56
俺はcallocなんて使ったこと無いな
913デフォルトの名無しさん:2008/04/27(日) 13:38:46
>>861
float d = -0.0;
printf("%.*s%.4f\n", (((*(int*)(&d)) & 0x80000000) ? 1 : 0), "-", fabs(d));
これでどうだ?
914デフォルトの名無しさん:2008/04/27(日) 14:14:18
パソコンにC言語のコンパイラをインストールしたいのですが、オススメのサイトはありませんか?
出来ればBorlandCの解説サイトがありがたいです
915デフォルトの名無しさん:2008/04/27(日) 14:18:17
今の時代 VC++ Express Edition のがいいと思うが、
まあ気にしない事にしておこう。
916デフォルトの名無しさん:2008/04/27(日) 14:22:53
そうなんですか
大学の講義で推奨されたのでBorlandCをインストールしようと思ったのですが
917デフォルトの名無しさん:2008/04/27(日) 14:27:06
別にCコンパイラなんか有名どころなら何使っても大差ないだろう
918デフォルトの名無しさん:2008/04/27(日) 14:38:17
規格準拠率の低いコンパイラ使っても、
そのコンパイラ特有の癖を知る事は出来るが、
それ以上得る所は無いどころか
間違ったものを C++ 仕様だと勘違いしてしまう恐れがある。

仕事でずっと Borland C を使うつもりなら別にそれもいいかもしれないが、
まずそんな職場は無い。
919デフォルトの名無しさん:2008/04/27(日) 14:45:35
そうですね
将来役立てるためにVC++ Express Editionをインストールします
ありがとうございました
920デフォルトの名無しさん:2008/04/27(日) 14:51:36
C++ じゃねえや、C だ。
921デフォルトの名無しさん:2008/04/27(日) 14:56:05
>>918
規格票読んで分かって使えば無問題
レトロかつマイナーなCPUに至っては未だにK&R敷かない場合もある
922デフォルトの名無しさん:2008/04/27(日) 15:01:52
そんなもの後から勉強すればいいだけだろう
923デフォルトの名無しさん:2008/04/27(日) 15:18:00
bccが規格に準拠してない部分ってたとえばどこ?
924デフォルトの名無しさん:2008/04/27(日) 15:18:50
switch で変な事あった気がする。
あとはそのうち C++ やりたいと思った時とか。
925デフォルトの名無しさん:2008/04/27(日) 15:31:48
Borland CでC++やってるけど何か問題あるの?
926デフォルトの名無しさん:2008/04/27(日) 15:33:51
Microsoft Visual C++ 2008 Express Editionはあるんだけど
Microsoft Visual C 2008 Express Editionみたいなんはないの?
C++はまだやってないからCで使いたいんだ
927デフォルトの名無しさん:2008/04/27(日) 15:37:20
>>926
Microsoft Visual C++ 2008 Express EditionはC/C++が使える
928デフォルトの名無しさん:2008/04/27(日) 15:41:18
>>925
無料の奴じゃないならいいけど
無料の奴は古い
929デフォルトの名無しさん:2008/04/27(日) 15:44:59
C++ の最新の仕様が 2003 年に出てるから
2003 年より前に出た奴は古いと思っていい。
930デフォルトの名無しさん:2008/04/27(日) 19:13:19
C言語でprintf(゙┌┐┘└゙);
だと┌┐┘└って表示できるのに
char kigou1 ;
kigou1 ='┌';
printf(kigou1);

だとτとか・みたいなのが表示されるのはどうしてですか?
変数を通して┌┐┘└こういう文字を表示させるにはどうすればいいの?
931デフォルトの名無しさん:2008/04/27(日) 19:14:10
'┌' が 1 バイトに収まらないから。
文字列使う。
932デフォルトの名無しさん:2008/04/27(日) 19:17:18
char *str;
str = "┌";
printf(str);
933デフォルトの名無しさん:2008/04/27(日) 19:17:27
wchar_tとwprintfを使うとか
934デフォルトの名無しさん:2008/04/27(日) 19:19:00
>>932
これはひどい・・・
935デフォルトの名無しさん:2008/04/27(日) 19:21:32
どこがよ?
936デフォルトの名無しさん:2008/04/27(日) 19:21:47
>>934
おまえは多分勘違いしてるな・・・
937デフォルトの名無しさん:2008/04/27(日) 19:23:11
いや、考えたら確かにひどくはあるなw
938デフォルトの名無しさん:2008/04/27(日) 19:27:52
全角文字は2バイト
939デフォルトの名無しさん:2008/04/27(日) 19:28:16
SJIS ならな。
940デフォルトの名無しさん:2008/04/27(日) 19:28:26
?_?
941デフォルトの名無しさん:2008/04/27(日) 19:29:34
未だにどこがひどいのか分からない俺
942デフォルトの名無しさん:2008/04/27(日) 19:30:55
誰か解説してくれ
943デフォルトの名無しさん:2008/04/27(日) 19:32:00
・ const がない。
・ 文字列へのポインタを直接 printf に入れるのは、
 その文字列が % を含んでるかもしれないので危険。
 必ず %s を使って表示する。

とりあえずこの辺は気になった。
944デフォルトの名無しさん:2008/04/27(日) 19:38:24
なるほど ありがとうございました
945デフォルトの名無しさん:2008/04/27(日) 19:46:28
こーしろってか?
static const char const *str = "┌"
printf("%s", str);
946デフォルトの名無しさん:2008/04/27(日) 19:48:57
2つ目の const 意味ねー
947デフォルトの名無しさん:2008/04/27(日) 19:49:08
やらなくていいとこまで突っ走ってる感が否めない
948デフォルトの名無しさん:2008/04/27(日) 20:18:07
const char * const str
だな
949デフォルトの名無しさん:2008/04/27(日) 21:02:07
fputs("┌", stdout)でいいじゃない
950デフォルトの名無しさん:2008/04/28(月) 02:13:56
c初めて1ヶ月ちょっとのド素人なんですが
「#include<stdio.h>
int main(void){
//カウント-ダウン
int a,b,c,d=0;
printf("数字どぞー\n");
scanf("%d",&a);
c=a;
while(c>0){
d++;
c=c/10;
};
//桁数確認:桁数はd
switch(d){
case 0:puts("0・・・をどうしろと・・・?") ;break;
case 1:puts("1桁とはまたナメられたものだな・・・!!") ;break;
case 2:puts("2桁・・・ちと数字が大きいかな・・・") ;break;
case 3:puts("3桁っておまww多すぎだろww\nとりあえずお前、後で〆るからなwww覚えてろよw") ;break;
default:puts("マテマテマテ、数字大きすぎ、エラーだよ!!\nダリーよ、やる気しねーよ、入力しなおせコノヤロー!!"); break;
}
b=a;
do{
b=b--;
printf("%d ",b);
}while(b>1);
puts("\nハィ0、 終了ォ──(・∀・)──!!");
return 0;}」
このプログラムで4桁上を入力された時にscanfのトコに戻るようにしたいんですが
どうやったらいいか皆目見当つきません、助けてください
951デフォルトの名無しさん:2008/04/28(月) 02:17:17
do {

scanf("%d",&a);
c=a;
while(c>0){
d++;
c=c/10;
};
//桁数確認:桁数はd
switch(d){
case 0:puts("0・・・をどうしろと・・・?") ;break;
case 1:puts("1桁とはまたナメられたものだな・・・!!") ;break;
case 2:puts("2桁・・・ちと数字が大きいかな・・・") ;break;
case 3:puts("3桁っておまww多すぎだろww\nとりあえずお前、後で〆るからなwww覚えてろよw") ;break;
default:puts("マテマテマテ、数字大きすぎ、エラーだよ!!\nダリーよ、やる気しねーよ、入力しなおせコノヤロー!!"); break;
}

} while (d > 3);
952デフォルトの名無しさん:2008/04/28(月) 02:31:03
input:
scanf("%d",&a);
c=a;
while(c>0){
d++;
c=c/10;
};
//桁数確認:桁数はd
switch(d){
case 0:puts("0・・・をどうしろと・・・?") ;break;
case 1:puts("1桁とはまたナメられたものだな・・・!!") ;break;
case 2:puts("2桁・・・ちと数字が大きいかな・・・") ;break;
case 3:puts("3桁っておまww多すぎだろww\nとりあえずお前、後で〆るからなwww覚えてろよw") ;break;
default:puts("マテマテマテ、数字大きすぎ、エラーだよ!!\nダリーよ、やる気しねーよ、入力しなおせコノヤロー!!"); goto input;
}
953デフォルトの名無しさん:2008/04/28(月) 02:32:08
>>951
>>952
d の初期化が必要だよ
954951:2008/04/28(月) 02:34:16
そーだった

do {

scanf("%d",&a);



do {
d = 0;
scanf("%d",&a);
955952:2008/04/28(月) 02:37:43
>>954のdo{をinput:に置き換えで
956デフォルトの名無しさん:2008/04/28(月) 09:50:24
図形の頂点ごとに赤、黄色、緑、青の色をつけろ!
幅2ドットと幅8ドットの線分を描け!
三角形、四角形、5角形のポリゴンを描け!
この質問ってこのスレでいいの?
957デフォルトの名無しさん:2008/04/28(月) 09:57:00
>>956
マルチ
958デフォルトの名無しさん:2008/04/28(月) 10:11:27
vfwprintfは使えたんですが、vfwscanfがヘッダファイルに無くて使えません。。
vfwscanfかこの関数と同等の機能を持つ関数を使いたいんですが、どうすれば使えるようになりますか?

開発環境はVisual Studio 2005で、
ソースは以下の文です。




int print(const wchar_t* format, ...)
{
va_list args;
int result;
va_start(args, format);
result = vfwprintf(format, args);
va_end(args);
return result;
}

int scan(const wchar_t* format, ...)
{
va_list args;
int result;
va_start(args, format);
result = vfwscanf(format, args);
return result;
}
959デフォルトの名無しさん:2008/04/28(月) 13:29:15
商品番号860????、6000÷2の余り+1番の問題
?には6000が入ります
このプログラムはどう書けばいいですか?
C言語なのでこっちで質問します。お願いします
960デフォルトの名無しさん:2008/04/28(月) 14:08:30
宿題スレ行け
961デフォルトの名無しさん:2008/04/28(月) 14:09:16
エスパーしろってか?
6000が抜きたいなら数値なら剰余でもいいし
文字列ならそのまま抜いて数値にすればいい

そもそも6000/2って余りないよな・・・
962デフォルトの名無しさん:2008/04/28(月) 17:02:21
すみません質問です。
printfとかでファイルにデータを書き込んだ場合、printf命令が戻った地点で
ファイルの書き込みは完了していると考えていいんでしょうか?
後ろでOSがゆっくり書いてたりするのかな…と。
スレチだったらすみません。
963デフォルトの名無しさん:2008/04/28(月) 17:02:41
fprintfですね^^;
964デフォルトの名無しさん:2008/04/28(月) 17:07:31
>>962
fprintf()から戻った時点では、バッファに書かれているだけでファイルに書きに行ってないかもしれません。
確実に書き込むには、バッファをフラッシュする必要があります。
# 尤も、その段階で本当にファイルに出力されているかどうかはOSやデバイスに依存します。
965デフォルトの名無しさん:2008/04/28(月) 17:18:25
俺はSだから sprintf が好きですが何か?
966デフォルトの名無しさん:2008/04/28(月) 17:27:19
>>965
いえ、何も。
967デフォルトの名無しさん:2008/04/28(月) 18:24:10
http://www.microsoft.com/japan/msdn/vstudio/express/
この中のどれをダウンロードすればいいですか?
968デフォルトの名無しさん:2008/04/28(月) 18:24:39
>>967
好きなのを選ぶが良い
969デフォルトの名無しさん:2008/04/28(月) 18:27:41
ダウンロードした後
どうやって使えばいいかよくわかりません。
970デフォルトの名無しさん:2008/04/28(月) 18:31:19
ttp://www.disc-tools.com/download/daemon347+md5sum
仮想CD/DVDドライブにぶちこむか、DVD-Rにでも焼いて使うが良い
971デフォルトの名無しさん:2008/04/28(月) 19:57:39
C言語の勉強がしたいのですが
無料で作れて実行できるフリーのソフトはないでしょうか?
できたらVB等も教えてください
972デフォルトの名無しさん:2008/04/28(月) 20:01:23
Microsoft Visual C++ Express Edition (C も可能)
Microsoft Visual Basic Express Edition
973デフォルトの名無しさん:2008/04/28(月) 20:02:58
>>972がインスコするだけで楽でいい
974デフォルトの名無しさん:2008/04/28(月) 23:08:31
誰か次スレ立てて


C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 26
http://pc11.2ch.net/test/read.cgi/tech/1206196600/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 105代目
http://pc11.2ch.net/test/read.cgi/tech/1208268461/
975デフォルトの名無しさん:2008/04/28(月) 23:35:01
>>962

fflush( FILE* );
976デフォルトの名無しさん:2008/04/28(月) 23:56:59
読み込む整数値以下の偶数を並べるソースを書いてみました。
偶数ではなく、2のべき乗を並べるにはどう書き換えるべきでしょうか?

#include <stdio.h>
int main (void)
{
int i, no;
printf("整数を入力してください:");
scanf("%d", &no);

i = 2;
if(no > 0){
while(i <= no){
printf("%d ", i++);
i++;
}
putchar('\n');
}
else
puts("正の数を入力してください。");
return 0;
}
977デフォルトの名無しさん:2008/04/29(火) 00:00:26
>>976
i = 2;
while(i <= no){
printf("%d ", i);
i *= 2;
}
でどうだろうか。intでは値の範囲が狭すぎるかもしれないが。
978デフォルトの名無しさん:2008/04/29(火) 00:03:37
>>976
for(i=2;i<=no;i*=2) printf("%d", i);
979デフォルトの名無しさん:2008/04/29(火) 00:05:42
連投します   

#include <stdio.h>

int main(void)
{
int value1 = 10;
int value2 = 20;
printf("1:value1 %d\n",value1);
printf("1:value2 %d\n",value2);
{
int value1;
value1 = 30;
value2 = 40;
printf("2:value1 %d\n",value1);
printf("2:value2 %d\n",value2);
}
printf("3:value1 %d\n",value1);
printf("3:value2 %d\n",value2);

return 0;
}

実行結果

  1:value1 10
  1:value2 20
  2:value1 30
  2:value2 40
  3:value1 10
  3:value2 40
980デフォルトの名無しさん:2008/04/29(火) 00:07:54
>>977>>978
ありがとうございます。
今日読んだインクリメントに固執しすぎました。
同じ結果を出すのにも色々な書き方があって大変参考になります。

後、intでは範囲が狭いとの事ですが
今のところ参考書がそこまでたどり着いていないので、
とりあえずはソースを書いて慣れることを目標としています。
981979:2008/04/29(火) 00:11:07
まったくの初心者です。最後のvalue2が40になるのが
分からない。ブロック内でvalue2に40を代入したのでブロック内の
実行結果が40になるのはわかるけど。
ブロック外まで代入された40は引き継がれるのでしょうか?
グローバル変数ではないですよね。
最後のvalue2が20なら納得できるのですが。
教えてください
982デフォルトの名無しさん:2008/04/29(火) 00:12:32
ブロック内で新たに value2 を宣言してないから
983デフォルトの名無しさん:2008/04/29(火) 00:15:21
>>980
#include<stdio.h>

int main(void)
{
int i=0, a[] = { 0x8A, 0xE6, 0x92, 0xA3, 0x82, 0xC1, 0x82, 0xC4, 0x82, 0xCB, 0x81, 0x49, '\0'};

while(a[i] != '\0') {printf("%c",a[i]); i++;}

getchar();

return 0;
}
984デフォルトの名無しさん:2008/04/29(火) 00:19:40
>>982
ああ、そうですか。宣言しなければ、ブロックの垣根を越えて
持ち越されるのですね。
さっきブロック内で新たにvalue2を宣言したら、持ち越されませんでした。
ありがとうございました
985デフォルトの名無しさん:2008/04/29(火) 02:33:54
system("cls");
と同じような動作する関数って何ですか?
986デフォルトの名無しさん:2008/04/29(火) 02:34:57
>>985
標準関数にはないよ。
987デフォルトの名無しさん:2008/04/29(火) 02:43:51
>>986
ありがとう、APIスレにでも行ってみます
988デフォルトの名無しさん:2008/04/29(火) 16:30:07
C言語なら俺に聞け(入門篇) Part 27
http://pc11.2ch.net/test/read.cgi/tech/1209429897/
989デフォルトの名無しさん:2008/04/29(火) 23:58:26
#include <stdio.h>
int main (void)
{
int i, j, ln, mn;

printf("何段ですか:");
scanf("%d", &ln);
mn = ln;

for(i = 1; i <= ln; i++){
for(j = 1; j <= mn; j++)
putchar('*');
putchar('\n');
mn--;
}
return 0;
}

実行結果(入力が5の場合)
*****
****
***
**
*

今回4つの変数を使ったんですけど、mnを使わずにスマートに書き換えられますか?
990デフォルトの名無しさん:2008/04/30(水) 00:01:30
printfの書式でうまいことできなかったかな?
991デフォルトの名無しさん:2008/04/30(水) 00:04:18
空白か 0 ならうまいことできるが・・・。
C++ なら setfill でうまいことできるんだがなあ。
992デフォルトの名無しさん:2008/04/30(水) 00:06:57
const char * str = "**********":
puts( str + strlen( str ) - ln );

あんま考えずに書いたけど、イメージはこんな感じで。
大きな入力きたらOUTだけど・・・
993デフォルトの名無しさん:2008/04/30(水) 00:09:16
for(i=1; i<=ln; i++) {
for(j=i; j<=ln; j++)
994デフォルトの名無しさん:2008/04/30(水) 00:09:28
for(i=ln;0<i;i--){
  for(j=1;j<=i;j++){
    putchar('*');
  }
  putchar('\n');
}
995デフォルトの名無しさん:2008/04/30(水) 00:11:52

{
 for( ; ln > 0; ln--)
 {
  for(k = 0; k < ln; k++)
   putchar('*');
  putchar('¥n');
 }
}
996デフォルトの名無しさん:2008/04/30(水) 00:12:21
n = 5;
for(i = 1; n; i++){ printf("*"); if(i % n == 0){ printf("\n"), n--; i = 0; } }
こんな感じでどう?
997デフォルトの名無しさん:2008/04/30(水) 00:14:42
この程度だと考えるところは似たり寄ったりになるな。
質問主は何が知りたいのか判らんが・・・
998デフォルトの名無しさん:2008/04/30(水) 00:21:12
みなさんありがとうございます。
自分の基本的な数学の力の無さが浮き彫りになるっつーか、
閃きが出来ないっつーか…

>>997
やっぱりソースは出来るだけ簡素な方がいいのかと思いまして質問しました。
999デフォルトの名無しさん:2008/04/30(水) 00:21:55
とりあえず俺ならこう書く。

#include <stdio.h>

int input_line(void) {
 int line;
 printf("何段ですか: ");
 fflush(stdout);
 scanf("%d", &line);
 return line;
}

void show_same(int ch, int repeat) {
 int i;
 for (i = 0; i < repeat; i++) {
  putchar(ch);
 }
}

void show_line(int line) {
 int i;
 for (i = line; i >= 1; i--) {
  show_same('*', i);
  putchar('\n');
 }
}

int main(void) {
 show_line(get_line());
 return 0;
}
1000デフォルトの名無しさん:2008/04/30(水) 00:32:05
え?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。