C言語なら俺に聞け(入門篇) Part 26
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/03/22(土) 23:36:40・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/
0002デフォルトの名無しさん
2008/03/22(土) 23:37:35Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/
Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
0003デフォルトの名無しさん
2008/03/22(土) 23:39:08Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/
Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/
Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/
Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/
Part 20 ttp://pc11.2ch.net/test/read.cgi/tech/1192455273/
Part 21 ttp://pc11.2ch.net/test/read.cgi/tech/1194384258/
Part 22 ttp://pc11.2ch.net/test/read.cgi/tech/1196489491/
Part 23 ttp://pc11.2ch.net/test/read.cgi/tech/1198295362/
Part 24 ttp://pc11.2ch.net/test/read.cgi/tech/1201083176/
0004デフォルトの名無しさん
2008/03/23(日) 00:07:160005デフォルトの名無しさん
2008/03/23(日) 00:19:070006デフォルトの名無しさん
2008/03/23(日) 00:48:330007デフォルトの名無しさん
2008/03/23(日) 00:53:160008デフォルトの名無しさん
2008/03/23(日) 01:37:06不要に思う奴はスルーすればいい
0009デフォルトの名無しさん
2008/03/23(日) 15:27:35main () {
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)というのがどのような条件なのかもよくわからないです
よろしくお願いします
0010デフォルトの名無しさん
2008/03/23(日) 15:32:58入力が無い場合は EOF が返される。
数値が入力されなかった場合は 0 が返される。
数値が入力されていていた場合は player にその数値が入れられ 1 が返される。
0012デフォルトの名無しさん
2008/03/23(日) 16:33:561行ずつテキストファイルを読み込んで、条件により文字列の置換を
行うプログラムを作っているのですが、fgetsの基本的なところがわか
ってないもので上手く処理できずに困っています。
悩んでいる処理が
while(fgets(buf,512,fin)!= NULL){
....置換処理
fputs(buf,fout) //・・・処理しない行
という処理なのですが、出力結果をバイナリエディタで見ると改行"0D0A"
の前に"0D"が入ってしまいます。
fgetsでbufに読み込んだ終端に"0D"が挿入されるから当然の動作
なのでしょうが、それを上手く削除する方法がわかりません。
それで、しかたなく今は、
fseek(fout,-3,SEEK_CUR);
fprintf(fout,"\n");
なんてことをしています・・・(汗
いいやり方があれば教えて下さい。。。。
0013デフォルトの名無しさん
2008/03/23(日) 16:46:45finをテキストモードでオープンすれば、改行は\nにならない?
0014デフォルトの名無しさん
2008/03/23(日) 16:51:05:
:
p = strstr(buf, "\r\n");
if (p != NULL) strcpy(p, "\n");
0015デフォルトの名無しさん
2008/03/23(日) 19:35:07int myStrlen(const char* str) {
return strlen(str);
}
って関数があったとき、
int myStrlen(const char* str);
これがプロトタイプ宣言だよね。
ANSI以前のプロトタイプ宣言が無いときは
int myStrlen();
こう書いていたんだっけ?
プロトタイプ宣言が無いときに、相互に呼び出される関数を
どう実現していたのかが気になった。
0016デフォルトの名無しさん
2008/03/23(日) 19:44:47型チェックなしだから、空き放題に呼び出せたのでは?
0017デフォルトの名無しさん
2008/03/23(日) 19:46:15それと同じような感じで使われてたんじゃないかな。
0019デフォルトの名無しさん
2008/03/24(月) 23:28:06関数を呼び出す側が正しい引数を渡すものとしていた
引数について型変換が行われないのでキャストも必要だった
例として
sqrt(2);
の時
プロトタイプ宣言があれば 2 → 2.0 に変換して渡してくれるが
プロトタイプ宣言が無い場合 2 (整数)のままで渡されるので期待した返値が得られない
可変長引数関数は今でも型チェックができないので同じ問題がある
(標準関数についてだけは警告を出してくれるコンパイラもある)
printf("%f\n", 2);
printf("%f\n", 2.0);
0020デフォルトの名無しさん
2008/03/25(火) 01:30:20プロトタイプ宣言なしのコーディングなんて暫くしてなかったから、どんなものか忘れてた。
これで、新人とかに質問されてもちゃんと答えられるぜ。
0021デフォルトの名無しさん
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;}
何がまずいのでしょうか?
0022デフォルトの名無しさん
2008/03/25(火) 20:06:25char 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の中身を変更しないで
この関数を使いたいんだけど、どうしたらいいんでしょう?
0023デフォルトの名無しさん
2008/03/25(火) 20:19:09なぜ中身が変更されていると思ったのでしょう?
0024デフォルトの名無しさん
2008/03/25(火) 20:21:14は
*dest = *string;
dest++;
string++;
とほぼ同じ動作。
string の中身は変わらないっつーか、
変わってたら string は const だからエラー出る。
0025デフォルトの名無しさん
2008/03/25(火) 20:26:39ありがとうございます。
>>23
なぜ中身が変更されているかは、*string++をしているからですよね
>>24
*string++で中身が変わってしまい、constでエラーが出ることは理解できるのですが、
応用として、変数を増やすことなく、この関数を使用できないでしょうか?
0026デフォルトの名無しさん
2008/03/25(火) 20:27:26中身は変更されないので確認してねって事です
0027デフォルトの名無しさん
2008/03/25(火) 20:28:25・ 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 を逐次呼ぶ実装にした方がすっきりする。
変数の説明も無いし読みづらいしで
とりあえずすっきりさせてからということで。
0028デフォルトの名無しさん
2008/03/25(火) 20:29:24>*string++で中身が変わってしまい、constでエラーが出ることは理解できるのですが、
だから変わらないっつーの。
0029デフォルトの名無しさん
2008/03/25(火) 20:29:31ポインタを返してもらうならvoid *add_line()だろ。
0030デフォルトの名無しさん
2008/03/25(火) 20:54:59中身は変わらないです。ごめんなさい。
>>28
「中身を変えようとして」エラーが出ているって認識で大丈夫ですかね?
すいません。もうちょっとがんばってみます。
ありがとう。
003121
2008/03/25(火) 20:55:53とりあえず、ソースをあげてみました。
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
えっと、名前の部分は戻り値ありの場合の指定ではないのですか??
0032デフォルトの名無しさん
2008/03/25(火) 21:20:17>構造体に内容を追加して、追加後のポインタを返してもらいたい
と書いてあるけど違うの?内容を追加するだけならvoidのままでいいけど。
0033デフォルトの名無しさん
2008/03/25(火) 21:32:17あ、もちろん構造体に中身を追加して、その追加した部分のポインタを返してもらいたいです。
それをポインタのポインタを渡して、それに追加した部分のポインタの内容を代入して返すようにしたいです。
mainに現在の構造体のポインタの位置を表すポインタ「now」有。
nowのアドレスをポインタのポインタたるcurrentに入れてadd_lineに渡す。
add_lineの中でcurrentにそこで関数内でつくった構造体のポインタPを代入する。
呼び出す時は何行目に行を追加するかを表すnumと構造体のポインタのポインタ二つを渡して
add_line(num,now);//nowはmain中の構造体のアドレス
のようにしようと思っていました。
now=add_line(num,now);という様に関数の戻り値を使う場合のみ型を指定するのではないのでしょうか?
0034デフォルトの名無しさん
2008/03/25(火) 21:45:52<X> [a][b][c][d][e] ここに追加されて欲しいのか
[a] <X> [b][c][d][e] ここに追加されて欲しいのか
どっちなんだろう。
前者はこのリストの仕様だと面倒臭いよね。
特にリストの末尾に追加する際。
0035デフォルトの名無しさん
2008/03/25(火) 21:50:18003621
2008/03/25(火) 22:24:05学校の課題で、特定の行の後に追加する関数と、前に追加する関数が求められていて、
この関数は後に追加のほうなので、[a] <X> [b][c][d][e]に追加したいです。
もし0行目の後に追加(一番最初に追加)の場合は特定の行の前に文章を追加する関数に
移るようにします。
>>35
リングにしてしまうと最初の行が分からなくなってしまう気がします。
その場合は構造体の中に行番号を入れるしか思いつきませんでした。
ただX行からY行をZ行の後に移動などの処理の時に困る気がするのですが・・・
0037デフォルトの名無しさん
2008/03/25(火) 22:29:48ダミーのノードを1つ用意する。
ダミーノードの次のノードが最初のノードで、
ダミーノードの前のノードが最後のノード。
最初のノードの前のノードがダミーノードで、
最後のノードの次のノードがダミーノード。
ダミーノードがあると、
「〜の次に追加」 という関数にダミーノードを渡すと先頭に追加になり、
「〜の前に追加」 という関数にダミーノードを渡すと末尾に追加になる。
そして、一切の NULL チェックが不要になる(assert くらいはした方がいいと思うけど)。
003821
2008/03/25(火) 22:42:57おぉ!なるほど!
確かに大量にあるNULLチェックが必要なくなります!
ダミーノードはmainのコマンドの入力→該当関数の動作というループが始まる前に
mainの中で用意しておけばいいんですよね?
その場合ダミーノードかどうかの判別は保持しておいたアドレスを使って
最初に戻るのなら
while(c = ダミーのアドレス){
c=c->prev;};
とすれば出来ますよね?
あと、構造体のポインタへのポインタの使い方は
0039デフォルトの名無しさん
2008/03/25(火) 22:50:37自由度が高くてよい。
004021
2008/03/25(火) 23:07:17えと、X行からN行を入力テキストに置き換える、という関数の中で
X行とN行のアドレス、それを取り出すときに使ったX行からN行の
実際の行数のintを返す関数を用意したいと思っているのですが、
やはりそれは戻り値を一つに出来るよう更に小型化するしかないのでしょうか?
0041デフォルトの名無しさん
2008/03/25(火) 23:27:37値を返す用の引数を別個に用意するのが普通かな。
今の add_line の仕様だと、
struct lines * 型の戻り値を current に渡す、とかできないっしょ。
まあとりあえず、
>>21 のポインタへのポインタの使い方自体は間違ってないので、
変なのだとしたら他の所がおかしいんだと思うよ。
004221
2008/03/25(火) 23:38:34色々教えていただいてありがとうございます!
とりあえず、
struct lines *add_line(int num,struct lines *current){
この様に戻り値を使って値を返すことにしました!
ただ、やはりポインタのポインタが疑問でして、
自分が書いたとおりであってるとすると、その前は
mainでポインタのポインタたる**pに*p=0、
構造体のアドレスはNULLということをしてるだけなのですが
この書き方がマズイのでしょうか?
あと、もう一つなのですが・・・値を返す用のの引数とは
関数の動作に必要な引数の他に、値をもらう用のポインタ変数を
用意するということでしょうか??
0043デフォルトの名無しさん
2008/03/25(火) 23:45:41main 側はまだ見てなかったわ。
main 側では struct lines *p; として
add_line(num, &p); という形にすることになるはず。
>あと、もう一つなのですが・・・値を返す用のの引数とは
>関数の動作に必要な引数の他に、値をもらう用のポインタ変数を
>用意するということでしょうか??
そうなる。
004421
2008/03/26(水) 00:31:31スイマセン、ソースは自動で消えてしまったみたいです・・・
main側では**pの様なものは宣言せずに、渡す時に&を使うのですね。
勉強になりました!ありがとうございました!
0045デフォルトの名無しさん
2008/03/26(水) 07:47:20typedef 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; /* 割り込み終了位置を返す */
}
004645
2008/03/26(水) 07:49:39numの使い道が分からんかったのでやや違うかもしれんけど、
やりたいのは大体こんな感じ?(関数名はinsertとかの方が適切っぽい)
ソース見てないから断言できんけど、呼び出し元が渡すのはポインタでよさげ。
割り込み開始位置は呼び出し元の current->next を見る。
NULLで呼び出してる時は linesGetFirst(p) で。
ちなみに自分なら1つの独立した構造体を作る関数を別に作って
土台のリストと新しく作ったのを追加用関数に渡す形にするかな。
その方がどこに加えたいかの指定が楽になるし、
構造体に手を加えても作成用関数だけいじれば大体事足りるようになるので。
『ポインタのポインタ』はポインタをtypedefして独立した1つの型として見ると理解し易いかも。
0047デフォルトの名無しさん
2008/03/26(水) 15:22:26気になったので書き直してみた (処理速度的には不利だけど)
char MyStrMid( char buff[], const char string[], int pos, int len )
{
for(;pos>0 && *string;pos--,string++);
sprintf(buff, "%.*s", len, string);
return buff;
}
0048デフォルトの名無しさん
2008/03/26(水) 18:58:320049デフォルトの名無しさん
2008/03/26(水) 19:38:27例えば常に真を返す関数tがあったとしたら、次のコードは常にtを出力する側へ分岐する。
if (t())
{
putchar('t');
}
else
{
putchar('f');
}
0050デフォルトの名無しさん
2008/03/26(水) 19:39:51man コマンドとかマニュアル、ヘルプの読み方が分からないって事か?
0051デフォルトの名無しさん
2008/03/26(水) 21:35:01偽=いいえ
で覚えとけ
0052デフォルトの名無しさん
2008/03/27(木) 22:18:490053デフォルトの名無しさん
2008/03/27(木) 22:22:24for(i=0;i<srcsize;i++){
dest[i]=0;
for(j=0;j<fltsize && i+j<srcsize;j++){
dest[i]+=src[i+j]*flt[j];
}
}
0054デフォルトの名無しさん
2008/03/27(木) 22:30:18コンボリューション演算をすればよろしい
0055デフォルトの名無しさん
2008/03/27(木) 22:39:26// 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);
0056デフォルトの名無しさん
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;
}
}
0057デフォルトの名無しさん
2008/03/27(木) 22:48:13それではコンパイルすらできませんが
0058デフォルトの名無しさん
2008/03/27(木) 23:45:440059デフォルトの名無しさん
2008/03/27(木) 23:50:230060デフォルトの名無しさん
2008/03/28(金) 00:45:01#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;
}
}
0061デフォルトの名無しさん
2008/03/28(金) 00:52:32あなたが手を加える前のプログラムに戻してみては?
0062デフォルトの名無しさん
2008/03/28(金) 01:08:24それだとできないことはないんですけど
別で作ってみたいなと思いまして・・・・
0063デフォルトの名無しさん
2008/03/28(金) 01:11:37まずはインデントをしっかりそろえてみ?
forがおかしなネストをしててループ変数iが破壊されてるぞ
0064デフォルトの名無しさん
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);
0065デフォルトの名無しさん
2008/03/28(金) 01:24:48printf("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);
0066デフォルトの名無しさん
2008/03/28(金) 01:25:19if (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;}
0067デフォルトの名無しさん
2008/03/28(金) 01:59:43>fgets(input_line,513,fp);
なんで513なんだ?
0068デフォルトの名無しさん
2008/03/28(金) 02:02:39代入でいいのか?
>};
関係ないけど、なんですべてのスコープの後ろにセミコロンが?
なんか他にもつっこみたくなる要素が満載だぞw
006964
2008/03/28(金) 02:19:59すいません、そこは「==」でした・・・
あとスコープの外側にはセミコロンはいらないんですね・・・
>>67
説明が足りなくて申し訳ございません・・・。
まず513ですが、一行の行数の最大値が512なので、NULL文字の分も入れて513にしてみました
問題点なのですが、「//リストの連結」という部分のすぐ下で読み込んだ構造体をつないでいきます。
その段階では構造体の現在のアドレスと現在の構造体の->prevのアドレスは正しく表示されるのですが、
ループを抜けた後、構造体のアドレスを一番最初に戻すために、
while(p->prev != 0){
p=p->prev;
}
を実行しています。その途中でprevのアドレスがずれて、セグメント例外になってしまいます。
0070デフォルトの名無しさん
2008/03/28(金) 04:18:050071デフォルトの名無しさん
2008/03/28(金) 04:21:55ならinput_line[512]も513にしたら?
007264
2008/03/28(金) 07:31:11あ、確かに。ありがとうございます。
>>70
pは関数が始まる時に0に初期化していて、
一列終わるごとにそのその構造体のアドレスがbufferf_preに
入るので間違っては居ない気がするのですが・・・
0073デフォルトの名無しさん
2008/03/28(金) 07:40:31見直してみましたがよくわかりません
どこのfor文なのでしょうか?
0074デフォルトの名無しさん
2008/03/28(金) 07:44:24>70
0075デフォルトの名無しさん
2008/03/28(金) 07:46:28あんたの節穴で見直すのではなく、インデントを揃えてみろ。
できればエディタで。
0076デフォルトの名無しさん
2008/03/28(金) 07:48:08/*閏年の判定*/
for(i = 1; i < year; i++){
/*前月までの日数*/
for (i =0; i < months-1; i++) {
どっちもi使ってるだろ?後者で上書きされてるだろう?
0077デフォルトの名無しさん
2008/03/28(金) 10:01:09>70で問題点が理解できないようじゃ、プログラムに向いてないだろ。
無意味で無駄な部分多すぎるし。
0078デフォルトの名無しさん
2008/03/28(金) 14:01:520079デフォルトの名無しさん
2008/03/28(金) 20:20:18『間違っては居ない気がする』とかいってないで
デバッガでブレークポイント置いてステップ実行するなり
assert()とかprintf()とか入れて変数の状態を確認しようよ
見直すって眺めるのと違うんだけど
0080デフォルトの名無しさん
2008/03/28(金) 22:44:23void 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だと思うんですがなにか間違えてますか?
0081デフォルトの名無しさん
2008/03/28(金) 22:45:30count の値を表示してみればいい
0082デフォルトの名無しさん
2008/03/28(金) 22:54:43forで5のprintfが実行されなくてもカウントは5になってるんですね
ありがとうございました
0083デフォルトの名無しさん
2008/03/28(金) 23:06:040084デフォルトの名無しさん
2008/03/28(金) 23:18:13つーか、5になったからループを抜けたんだよ。
0085デフォルトの名無しさん
2008/03/29(土) 11:28:37main(){
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がどうなっているのか教えてください。
0086デフォルトの名無しさん
2008/03/29(土) 11:46:371行ずつ追っていって、結果を紙に書いていくんだ
そうすればどこの行が分からないのかが分かる
0087デフォルトの名無しさん
2008/03/29(土) 11:48:09008885
2008/03/29(土) 11:55:520089デフォルトの名無しさん
2008/03/29(土) 11:58:130090デフォルトの名無しさん
2008/03/29(土) 11:59:101になったらそれ以降増えない
whileにprint分入れて*nを出力したりとかして自力で知らべられるようにした方がいいよ
デバッガというものもあるし
0091デフォルトの名無しさん
2008/03/29(土) 12:01:51aに入った文字列を一文字づつ取り出してbに格納、
既出の文字は無視、格納した文字の総数をnに入れてく関数だよ。
0092デフォルトの名無しさん
2008/03/29(土) 12:06:21馬鹿?
009385
2008/03/29(土) 12:11:59まずfor(i=0;i<*n;i++)の*nは最初は0なんですよね?
だと繰り返さないような気がしてなりません。
0094デフォルトの名無しさん
2008/03/29(土) 12:13:290095デフォルトの名無しさん
2008/03/29(土) 12:14:47そうです繰り返しません
そして次のif文はi が0 , *nが0なので真となり中身が実行されますが
その結果*n が1となりwhile(*s)の次の回では実行されません
そのままなにもしないままwhile文が回り続けて終了です
0096デフォルトの名無しさん
2008/03/29(土) 12:16:18でたらめ書く前に実行してみたら?
0097デフォルトの名無しさん
2008/03/29(土) 12:19:18お前がやれよアホ
0098デフォルトの名無しさん
2008/03/29(土) 12:30:41nはb[]の文字数になる。
009985
2008/03/29(土) 12:36:35for文は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に移る。
見たいな感じでいいんですか?
0100デフォルトの名無しさん
2008/03/29(土) 12:41:02010185
2008/03/29(土) 12:43:11みなさんありがとうございます。
0102デフォルトの名無しさん
2008/03/29(土) 12:43:54forは文字(*s)がtの中で既出かどうか探している。
次のifは、既出でない場合に条件が成立し、
tに文字(*s)を追加。
*nはtに格納した文字数だよ。
0103デフォルトの名無しさん
2008/03/29(土) 12:46:570104デフォルトの名無しさん
2008/03/29(土) 12:49:40nは文字数なんですね。
あとnは*nとする必要もないですよね?
0105デフォルトの名無しさん
2008/03/29(土) 12:51:20できれば違う変数名にした方が混同しなくていいと思うけど。
0106デフォルトの名無しさん
2008/03/29(土) 12:58:19main関数内のfor文のnはca関数内の*nの値が入るのですよね。
0107デフォルトの名無しさん
2008/03/29(土) 12:58:45>あとnは*nとする必要もないですよね?
必要ないと思うならそう書き換えてコンパイルしてごらん。
0108デフォルトの名無しさん
2008/03/29(土) 12:59:410109デフォルトの名無しさん
2008/03/29(土) 13:05:09文字がでなくなった。
なんかもう頭がこんがらがってきた。
ポインタって難しいんですね・
0110デフォルトの名無しさん
2008/03/29(土) 13:15:01難しいといわれてるが一度理解するとそうでもなく、
プログラミングする上でこの上なく便利な機能だ。
めげずに落ち着いて頑張るといいよ
0111デフォルトの名無しさん
2008/03/29(土) 13:19:280112デフォルトの名無しさん
2008/03/29(土) 13:19:390113デフォルトの名無しさん
2008/03/29(土) 13:22:01caの中のnは、mainの中のnを指して(ポイントして)いる。
caの中の*nという表記は、mainの中のnを読んだり書き換えたりしている。
0114デフォルトの名無しさん
2008/03/29(土) 13:22:53int 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)ってすればまだ分かりやすいのに。
0115デフォルトの名無しさん
2008/03/29(土) 13:31:58日本語書くときはなんか辞書とか見ながら書いてますか?
という質問と同じに聞こえる。
0116デフォルトの名無しさん
2008/03/29(土) 13:56:40なるほど、わかりました。
なんとなくですが>>
>>114
たしかにそのほうがわかりやすそうです。
0117デフォルトの名無しさん
2008/03/29(土) 15:08:02言い得て妙 だな
0118デフォルトの名無しさん
2008/03/29(土) 15:19:06でも、ちょっとまじめな文章を書くときには、国語辞典を引きます。
0119デフォルトの名無しさん
2008/03/29(土) 15:35:24英語だとしっくりくる
0120デフォルトの名無しさん
2008/03/29(土) 17:17:22日本語しかわからないあなたがフランス語を書くときに辞書無しで書けますか?
0121デフォルトの名無しさん
2008/03/29(土) 19:29:42時々リファレンスみる程度。初心者でなければコピペとかないから。
そう意味できいてるなら真面目に勉強してください。
0122デフォルトの名無しさん
2008/03/29(土) 22:47:33整数型とint ポイント型の違いがわかりづらいのですが
ポイント型はアドレスを格納できて整数型はアドレスを出力するだけですか?
0123デフォルトの名無しさん
2008/03/29(土) 22:57:35そんなもんだろ。だいたいは頭に入ってるから空で書ける。
細かい仕様(引数の順番とか関数の戻り値とか)が必要になったらネットなり書籍なりで確認して書く。
0124デフォルトの名無しさん
2008/03/29(土) 23:09:18変数からアドレスを求めるのはアドレス演算子&。
整数型はアドレスを出力するだけというのはなんか変だ。
0125デフォルトの名無しさん
2008/03/29(土) 23:09:35int*はint型の変数のアドレスを格納する変数
int x=50;
int *xp = &x;
この時、printf("%d",*xp) と printf("%d",x) は50を表示し、
printf("%p",xp) と printf("%p",&x) はxのアドレスを表示する
0126デフォルトの名無しさん
2008/03/29(土) 23:46:54アドレスを変数に格納せず&で出力ができるという感じですか?
>>125
printf("%d",*xp)が50を表示するというのが難しく感じるところです
*xpという箱は整数型で宣言されそこには&xというアドレスが代入される
となるとprintf("%d",*xp)ではアドレスが出力されると考えてしまいます。
0127デフォルトの名無しさん
2008/03/29(土) 23:50:000128デフォルトの名無しさん
2008/03/29(土) 23:59:29*xpはアドレスを格納する変数
だからprintf("%d",xp)だとそのままアドレスを出力
printf("%d",*xp)はわざわざ*をつけてるから逆にデータのほうを表示する
0129デフォルトの名無しさん
2008/03/30(日) 00:26:120130デフォルトの名無しさん
2008/03/30(日) 09:26:320131デフォルトの名無しさん
2008/03/30(日) 10:37:35これと
printf("%d", *xp);
これの「*」の意味が違うことに>>128は多分気付いていない。
同じ文字を逆の意味の2つの演算子に使うという、C言語の糞仕様のおかげだな。
「ポインタ宣言子」と「間接参照演算子」の違いね。
そもそも初心者に教えるときに、
int *xp = &x;
では混乱が起きる。
int *xp;
xp = &x;
上のように書いてやらないと
int *xp = &x;
↑
意味的にはここで切れていることに、初心者は気がつかない。
0132デフォルトの名無しさん
2008/03/30(日) 11:40:43「int* xp」と書いた方がわかりやすいかな。
「int*」が変数の型(intへのポインタ型)、xpが変数名。
0133デフォルトの名無しさん
2008/03/30(日) 11:56:250134デフォルトの名無しさん
2008/03/30(日) 12:05:48C言語のダメなところだよね。「int *」が型なのに、宣言は個別に「*」を付けなきゃいけないなんて。
複数の変数を1行で宣言できることがそんなに重要なんだろうか。
0135デフォルトの名無しさん
2008/03/30(日) 12:17:500136122
2008/03/30(日) 15:44:32まだそれは勉強してませんでしたがおかげでわかりました
ポインタの練習用プログラムを見てどう出力されるかはわかるようになってきました
ありがとうございました
0137デフォルトの名無しさん
2008/03/30(日) 19:28:11{
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
になってました。
0138デフォルトの名無しさん
2008/03/30(日) 19:38:53そのとおり。
DATA*とPDATAが同じ。
char*とPCHARが同じ。
0140デフォルトの名無しさん
2008/03/31(月) 04:46:11if(REAB() < 0) //Aの時
となるのは何故なんですか?
0141デフォルトの名無しさん
2008/03/31(月) 04:48:39あとはぐぐればすぐ分かる
0142デフォルトの名無しさん
2008/03/31(月) 04:53:28ありがとうございました
0143デフォルトの名無しさん
2008/03/31(月) 12:22:07Cの規格上は必ずしもそうなると言う保証はない点に注意。
そもそも、「最上位ビット」に意味があるのだからきちんと最上位ビットをチェックするロジックを書くべき。
# 処理速度などを睨んで改変するのは二の次三の次。
0144デフォルトの名無しさん
2008/03/31(月) 19:31:48符号つきで最上位ビットが 1 の場合は負ってのは規格で保証されてなかったっけ?
その制限の中でどういう負数表現をとるかは環境依存だけど。
0145デフォルトの名無しさん
2008/04/01(火) 02:35:47REAB()の戻り値がsignedなんて、どこにも書かれていませんよ。
0146デフォルトの名無しさん
2008/04/01(火) 03:03:58だとすると、signedのときは正しく動いてunsignedのときは(エラーも起こさず)正しく動かないことになる。
>143ではないが、先ずはそれに頼らないコードを書いた方がいいとは思う。
0147デフォルトの名無しさん
2008/04/01(火) 07:32:19結局規格ではどうなってるんだ?
0148デフォルトの名無しさん
2008/04/01(火) 08:40:35規格で決まってるのは、符号ビットが1ビットあることだけじゃなかったっけ?
0149デフォルトの名無しさん
2008/04/01(火) 12:29:56したいのですが、普通係数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 */
}
0150デフォルトの名無しさん
2008/04/01(火) 12:34:30コンパイラによるけど long long を使うとかは?
0151デフォルトの名無しさん
2008/04/01(火) 12:55:46・long long intを使う
・素直にfloatを使う
例えばx86でSSE2が使えるなら、巧く書けばベクタ化できるから下手すりゃ整数で小細工するより速いよ。
0152デフォルトの名無しさん
2008/04/01(火) 13:53:13[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に置き換えてファイル生成したいんですが、
どうすれば出来ますか?
0153デフォルトの名無しさん
2008/04/01(火) 14:25:420154デフォルトの名無しさん
2008/04/01(火) 14:40:13test
hello
と言うテキストを
String[ ][ ]
の様な2次元配列で読み込みたい場合、
Stringの確保はどのようにすればよいのでしょうか?
0155デフォルトの名無しさん
2008/04/01(火) 14:57:03ここはCのスレだけど、C++かC#かJavaか何かと間違ってやしませんか?
0156デフォルトの名無しさん
2008/04/01(火) 15:13:53>>154
文字列長に制限があってよければ、例えば
char String[][10] = {"apple", "test", "hello", };
可変長にしたいとか、そもそも文字列も可変個数だと言うのなら、ポインタのポインタを使うことになる。
まぁ、入門サイトでも探してくれ。それで判らなければ出直してくれて構わんから。
0157デフォルトの名無しさん
2008/04/01(火) 15:23:36済みませんでした。
>>156
ありがとうございました。
0158デフォルトの名無しさん
2008/04/01(火) 15:45:25それは何ですか?
0159デフォルトの名無しさん
2008/04/01(火) 19:53:370160デフォルトの名無しさん
2008/04/01(火) 20:12:44俺は文字列変数名にstrやsを使う
>>159
sedプログラムに3つの引数-eと's/fg/ajko/g'とdest.txt を渡して呼び出す
sedプログラムが標準出力したメッセージはfooというファイルに書き込む
かな?
sedの質問があれば正規表現スレでどうぞ
0161デフォルトの名無しさん
2008/04/01(火) 20:45:25私Windowsです。
0162デフォルトの名無しさん
2008/04/01(火) 21:00:440163デフォルトの名無しさん
2008/04/01(火) 21:12:580164デフォルトの名無しさん
2008/04/01(火) 21:15:01ttp://www.vector.co.jp/soft/win95/util/se015016.html
スレチだが
0165デフォルトの名無しさん
2008/04/02(水) 18:36:45picをはんだして、モーターとリモコンに繋げなければなりません。
そういった用途のc言語プログラムというのはどこで拾えばよいのでしょうか?
0166デフォルトの名無しさん
2008/04/02(水) 19:40:130167デフォルトの名無しさん
2008/04/02(水) 20:52:03自分の文章を読み直してみろ
その文章で何を言ってるか理解できるか?
0168デフォルトの名無しさん
2008/04/02(水) 20:55:38きっとロボット制御して半田付けするってことだ
で、ロボット制御するためのc言語プログラムというのを探している
0169デフォルトの名無しさん
2008/04/02(水) 20:57:00導線と半田を用意して、こてで溶着すればいいんじゃない?
0170デフォルトの名無しさん
2008/04/02(水) 21:05:380171デフォルトの名無しさん
2008/04/02(水) 23:09:200172デフォルトの名無しさん
2008/04/03(木) 00:20:250173fxで裁判中。教えて
2008/04/03(木) 08:28:12裁判の内容をここに記してみました
システム障害等でくわしいかた、是非とも情報をお待ちしております。よろしくお願いします。
http://members3.jcom.home.ne.jp/chaochu/
0174デフォルトの名無しさん
2008/04/03(木) 10:49:25ZDNet 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
0175デフォルトの名無しさん
2008/04/03(木) 11:20:59そういやこの筆者と似たようなことぬかしてたヤツが宿題スレでボコボコにされてたな。
0176デフォルトの名無しさん
2008/04/03(木) 15:25:560177デフォルトの名無しさん
2008/04/03(木) 17:55:05C言語をマスターするにはどれくらいの時間がかかりますか?
0178デフォルトの名無しさん
2008/04/03(木) 17:58:15物覚えの良い人ならそれだけ早いだろうし
やる気によっても左右される
マスターがどれくらいの事を言ってるのかもわからない
0179デフォルトの名無しさん
2008/04/03(木) 18:10:47C言語の試験とか資格ってのはあるんですか?
0180デフォルトの名無しさん
2008/04/03(木) 18:19:43著名なプログラマが資格を持っているなんて話、聞いたことがない。
0181デフォルトの名無しさん
2008/04/03(木) 20:58:04Fizz-Buzz みたいにw
使えないやつが暗記してくるのは見破れないけど
暗記すらできないやつなら落とすことができる
使えるやつは暗記する必要もない、と
0182デフォルトの名無しさん
2008/04/03(木) 21:02:560183デフォルトの名無しさん
2008/04/03(木) 22:36:16参考書と問題集何冊か買って受験勉強並みに真剣に勉強すれば3ヶ月くらいで
1000行程度のフリーソフトが作れるくらいにはなる。マスターとは程遠いけどね…
0184デフォルトの名無しさん
2008/04/03(木) 23:50:20作業要員に換算できるレベルに1〜3か月ってとこかな?
PCに慣れているかどうかでかなり変わるとは思うが。
0185デフォルトの名無しさん
2008/04/04(金) 17:44:31例えばtest.cppをVC++でコンパイルするとして
cl.exe D:/test.cpp
と実行してもコンパイルは出来るのですが、
どこにプログラムが作られているのかわかりません。
プログラムの保存先はどのように指定すればよいのでしょうか?
0186デフォルトの名無しさん
2008/04/04(金) 17:55:02と実行すれば、指定できるオプションの一覧が出る
0187デフォルトの名無しさん
2008/04/04(金) 19:21:06カレントディレクトリに実行ファイルができているんじゃないかな。
0188デフォルトの名無しさん
2008/04/04(金) 22:45:35int main(void)
{
char str[2];
scanf("%s",str);
printf("%c %c\n",str[0],str[1]);
return 0;
}
これをVC++で実行しました。
EOSを考慮して01という2桁の入力をすると結果は0 1と正常な結果なんですが
なぜかデバックエラーがでてしまいます。
なにが問題なんでしょうか
0189デフォルトの名無しさん
2008/04/04(金) 22:48:490190デフォルトの名無しさん
2008/04/04(金) 22:49:34\0 が入る余地がない
0191188
2008/04/04(金) 22:57:330192デフォルトの名無しさん
2008/04/04(金) 22:59:12これだと二文字分の領域しか確保した事にならない
[0] = '0';
[1] = '1';
[2] = '\0';
の3Byte必要
0193デフォルトの名無しさん
2008/04/04(金) 23:00:24str[2]を使うなら、char str[3];で定義しないとダメ。
0194デフォルトの名無しさん
2008/04/04(金) 23:03:32char str[0];
と書いても1文字分確保されるわけじゃない
0195188
2008/04/04(金) 23:13:06なるほど、てことはchar str[1];だと1文字が入るサイズってなわけですね。
皆さまありがとうございました。
0196デフォルトの名無しさん
2008/04/04(金) 23:32:33慣れてしまえば、なんでもないことなんだが。
Cの初心者が最初につまずく問題であることは確か。
1.文字列を格納する文字配列は、文字列の最後の\0分も含めて確保しなければならない。
2.配列を定義するときの添え字(char str[3]の3)は、配列要素の数であり、どこまで使うかではない。
0197デフォルトの名無しさん
2008/04/04(金) 23:34:243.Cの配列の添え字は0オリジンである。
0198デフォルトの名無しさん
2008/04/05(土) 00:13:30「JmEditor2」を使用していて下パネルで
『cファイルをコンパイルして作ったexe』を実行したときに
[scanf]などの入力を必要とする操作部分が実行できません
解決策を知っている方がいればお願いします
コマンドプロンプトから同じexeファイルを実行したところ問題なく動きました
0199デフォルトの名無しさん
2008/04/05(土) 00:32:38それと若干じゃなくて大幅にスレ違いです。
0200デフォルトの名無しさん
2008/04/05(土) 02:37:460201デフォルトの名無しさん
2008/04/05(土) 06:19:59「ツール」メニューの「コマンド実行」を使う。
下パネルから実行したとき、子プロセスの標準出力がうまく表示されない。
プロセスが終了するまで、子プロセスの標準出力の内容が表示されないようになっている。
0202デフォルトの名無しさん
2008/04/05(土) 15:08:330203デフォルトの名無しさん
2008/04/05(土) 21:37:05ありがとうございます。
>>他
すみませんね、住人さん。自治会お疲れ様です。
0204デフォルトの名無しさん
2008/04/06(日) 01:47:50main()
{
char ss[80];
gets(ss);
puts(ss);
}
文字を80文字以上入力しても、全ての文字が表示されるんですか
何故80文字以上gets()で読み込んでputs()で表示する事ができるのでしょうか
0205デフォルトの名無しさん
2008/04/06(日) 01:51:04メモリを破壊してどんどん文字を保存していってしまう。
非常に危険。
gets は使っちゃダメ。代わりに fgets を使うべし。
0206デフォルトの名無しさん
2008/04/06(日) 01:51:050207204
2008/04/06(日) 02:01:05ありがとうございます。
0208デフォルトの名無しさん
2008/04/07(月) 10:07:03一回のダウンロードごとにメモリ使用量が5〜30KBずつ増えていきます。
動的な確保は行っておらず、
何故増えていくのかがわかりません。
この場合の考えられる原因を教えて頂きたいです。
0209デフォルトの名無しさん
2008/04/07(月) 12:21:080210デフォルトの名無しさん
2008/04/07(月) 12:29:590211デフォルトの名無しさん
2008/04/07(月) 15:08:26もう一つお伺いしたいのですが、
グローバル変数はあまり使わないほうがいい、
という事を聞いたので
URL名
SERVER名
PATH名
ディレクトリパス
を保つ構造体をmain内で宣言したのですが、
自作関数の引数をあちこち増やさなければいけなくなりまして…
これってまずいですか?
一般的に言われる汎用な関数とはどんな関数なのですか?
0212デフォルトの名無しさん
2008/04/07(月) 15:12:18その構造体というかメンバ変数を持つクラスで管理すればいいんじゃないの?
0213デフォルトの名無しさん
2008/04/07(月) 15:20:040214デフォルトの名無しさん
2008/04/07(月) 16:16:500215デフォルトの名無しさん
2008/04/07(月) 16:18:59プログラムの性質も作りも判らないからなんともいえないけれど、main()から構造体のポインタを順次下請け関数に渡すだけでしょ。
最下層にまで届ける必要はないはずだし、普通はあんまり問題にならないと思うけど。
0216デフォルトの名無しさん
2008/04/07(月) 16:25:50main内で構造体を宣言することって
よくあることなんですかね?
0217デフォルトの名無しさん
2008/04/07(月) 16:30:34何も問題はないよ。
0218デフォルトの名無しさん
2008/04/07(月) 16:33:13多用しなければグローバル変数にした方が色々と便利&バグを生まない事もあるよ
その構造体1つだけとかならグローバルにしちゃうのがいいと思う
0219デフォルトの名無しさん
2008/04/07(月) 17:51:09OKだよ。
構造体のポインタをがんがん渡していけばいい。
複雑になったら、そのとき単純にする方法を悩めばいい勉強になる。
0220デフォルトの名無しさん
2008/04/07(月) 18:58:34Global.totalとか、Global.countとか一目瞭然で便利。
って、物の本に書いてあった。一理あると思った。
0221デフォルトの名無しさん
2008/04/07(月) 19:01:01接頭句を「g_」にするより分かりやすいな
0222デフォルトの名無しさん
2008/04/07(月) 19:38:52カテゴリー別に分けて構造体にして、わかりやすい名前をつければ尚良い。
グローバル変数依存からの脱却の第一歩だ。
0223デフォルトの名無しさん
2008/04/07(月) 20:20:030224デフォルトの名無しさん
2008/04/07(月) 20:20:440225デフォルトの名無しさん
2008/04/07(月) 20:30:38cygwin とgcc
visualstudio
bcc
好きなのを選べ
おすすめはしないが
LSI Cというのもある
0226デフォルトの名無しさん
2008/04/07(月) 20:30:47Visual 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とか。
0227デフォルトの名無しさん
2008/04/07(月) 21:24:45読み直してみろ
「C言語をつくれて」
これおかしいだろ
C言語という言語をつくるのか?
人にまともな説明すらできないやつはプログラム組むの無理だからあきらめろ
0228デフォルトの名無しさん
2008/04/07(月) 21:27:09そこまで攻撃する意図がわからんよ
0229デフォルトの名無しさん
2008/04/07(月) 22:38:23このくらいエスパーできないやつはここで教えるの無理だからあきらめろ
とも言える
0230デフォルトの名無しさん
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
0231デフォルトの名無しさん
2008/04/07(月) 23:36:11b[a[i]] = a[i];
0232デフォルトの名無しさん
2008/04/07(月) 23:36:160233231
2008/04/07(月) 23:37:500234デフォルトの名無しさん
2008/04/07(月) 23:38:22の全部の例を書いてみてくれ
0235230
2008/04/07(月) 23:49:03a[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
に同じ番号のところに転送するにはどうするかという意味です
0236デフォルトの名無しさん
2008/04/07(月) 23:49:15やっぱり言っている意味がわからん。
>例でいうとaの0番目にある3をbの3に入れるということです
b[3] = a[0];
ということだよね?と考えると、一瞬 >>231 (不等号を逆にして)でいい気がするが、
a[3] はどうするの?
0237デフォルトの名無しさん
2008/04/07(月) 23:51:26結局は
b[i]=i;
になるんじゃないの?
0238デフォルトの名無しさん
2008/04/07(月) 23:52:35「転送する」の意味がわからん。
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
と変わらないよ?
0239230
2008/04/08(火) 00:01:45aの0にある数字3をbの同じ3番目に当てはめる?
にはどうするかってことです。
同じくaの1にある数字4をbの4に当てはめるってことです
あの聞いといてなんですけど意味不だったらスルーしてください
0240デフォルトの名無しさん
2008/04/08(火) 00:09:331回自分で全部代入してみてbの中身全部表示してみると分かると思うけど
b[0] = 0 b[1] = 1 b[2] = 2... となるだけ
0241デフォルトの名無しさん
2008/04/08(火) 00:10:35暗号化がしたいのかな?
0242デフォルトの名無しさん
2008/04/08(火) 00:15:32結局>>231や>>237でいいような気がするが。
あと>>235が「配列bの添字の順番を換えたい」と言っているように思えるので、
一応、それは無理だと言っておく。
そもそも添字というのは「i番目」というような順番を示すものなので、
変更は不可能だ。
わかってるってんだったら、失礼。
0243デフォルトの名無しさん
2008/04/08(火) 00:33:18とあったものを、
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の添字にした時、正しい文字が現れるようにしたい、みたいな。
0244デフォルトの名無しさん
2008/04/08(火) 09:38:29代入は上書きコピーのこと。転送とまちがえてはいけない。
0245デフォルトの名無しさん
2008/04/08(火) 12:33:58何が目的なのかも書き込んだほうがいいんじゃない?
あんたのコード例から目的が推察できないのでみんな
首ひねってるんだと思うよ。
0246デフォルトの名無しさん
2008/04/08(火) 16:51:01int 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%です。」
となってしまいます;;
何故でしょうか?
0247デフォルトの名無しさん
2008/04/08(火) 16:52:090248デフォルトの名無しさん
2008/04/08(火) 17:05:410*100 = 0
0249デフォルトの名無しさん
2008/04/08(火) 18:38:07整数型の計算は、コンピュータでは1より小さい結果になると
答えがゼロになるんだよ。なぜかといわれても、そういうもの
だと思ってくれ。
回避する方法は色々あるが、とりあえず
per = n1 * 100 / n2;
にしたらいい。理由は自分で考えてね。
0250デフォルトの名無しさん
2008/04/08(火) 19:45:39char *buf = FileRead(file_path);
↓
Kaiseki(buf);
free(buf);
または
Kaiseki(file_path);
にするか悩んでいます。
FileRead関数内で動的にメモリを確保して
確保した領域をKaiseki関数に渡し解析するか、
Kaiseki関数内にファイルへのパスを渡して
読み込み、解析をKaiseki関数内で行うか、
どちらが良いと思われますか?
0251デフォルトの名無しさん
2008/04/08(火) 20:13:45マジレスすると場合によるからどっちともいえない
0252デフォルトの名無しさん
2008/04/08(火) 20:21:43どのような場合があるのですか?
0253デフォルトの名無しさん
2008/04/08(火) 20:42:23順列の総数を求めるプログラムを教えてください
考えすぎて頭が痛くナリマスタ
よろしくオナガイシマス
0254デフォルトの名無しさん
2008/04/08(火) 21:09:060255デフォルトの名無しさん
2008/04/08(火) 21:12:34オーバーフローとか一切考えなければ
5!を3!で割るだけじゃんww
なにが分からないの?w
0256デフォルトの名無しさん
2008/04/08(火) 22:20:03ほらよ。
#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;
}
0259デフォルトの名無しさん
2008/04/08(火) 22:32:530260デフォルトの名無しさん
2008/04/08(火) 22:34:25おいw
0261デフォルトの名無しさん
2008/04/08(火) 22:48:020262デフォルトの名無しさん
2008/04/08(火) 23:08:45そのままコンパイルすると
error C3861: 'tgamma': 識別子が見つかりませんでした
なのですが?
0263デフォルトの名無しさん
2008/04/08(火) 23:50:070264デフォルトの名無しさん
2008/04/09(水) 19:31:35一旦階乗求めるよりh(ry
0265デフォルトの名無しさん
2008/04/09(水) 21:23:090266デフォルトの名無しさん
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;
}
0267デフォルトの名無しさん
2008/04/09(水) 21:42:27#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 ***
と、何度試行を繰り返してもなります;
このエラーをどう訂正していいのかわからない超初心者です。
設定などもチャート通り何度もやり直しましたが、上手くいきません。
よろしくお願いします。
0268デフォルトの名無しさん
2008/04/09(水) 21:47:430269デフォルトの名無しさん
2008/04/09(水) 21:48:540270デフォルトの名無しさん
2008/04/09(水) 21:48:550271デフォルトの名無しさん
2008/04/09(水) 21:49:170272デフォルトの名無しさん
2008/04/09(水) 22:03:37DWORD gdw2;
gdw1 = timeGetTime();
//処理
gdw2 = (timeGetTime()-gdw1);
printf("%d",gdw1);
としても毎回計測するごとに処理時間が増えているのですが、
何故なのでしょうか?
0273デフォルトの名無しさん
2008/04/09(水) 22:07:55purintfにgdw2を渡すべきなんじゃない?
0274デフォルトの名無しさん
2008/04/09(水) 22:08:490275デフォルトの名無しさん
2008/04/09(水) 22:20:14現在、下記のような感じでプログラムを作ってるのですが、
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6212.txt
2つ問題があり、
�@入力していくと次の配列まで入力されてしまう。
�A2つ目のエラー仕様をどこでどう記述していいのか。
初歩的なことで、無駄な文が多いかもしれませんがよろしくお願いします。
また、こうすればもっと判りやすくできるなどあったら教えて欲しいです;
0276デフォルトの名無しさん
2008/04/09(水) 22:54:48「次の配列」が何を指しているのか判りませんが、一文字ずつ入力してチェックするのは標準入力では無理があるかと。
普通に1行入力してから、解析する方がたぶんましです。
0277デフォルトの名無しさん
2008/04/09(水) 22:55:24....
break;
}
}
if((cnt <= 0) && ((c == '-') || (c == '\n'))) {
printf("エラーメッセージ");
exit(1);
}
if(x == 1){
.....
0278デフォルトの名無しさん
2008/04/09(水) 23:10:17>また、こうすればもっと判りやすくできるなどあったら教えて欲しいです;
うまく関数化しよう。
#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;
}
0279デフォルトの名無しさん
2008/04/09(水) 23:41:13char 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;
}
0280275
2008/04/09(水) 23:49:48a[0],a[1]でa[0]の入力をすると、a[0]の上限をこえたとき(cnt以上)に、
そのままa[1]の中身まで入力されてしまうってことですね;
>>277様
break;のとこもexit(1);にし、int exit(int);を入れてみたところ、
そこはかとなく�Aの部分はできました。ありがとうございますー。
0281281
2008/04/10(木) 14:58:40ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6215.txt
よろしくお願いします。
0282デフォルトの名無しさん
2008/04/10(木) 15:01:380283デフォルトの名無しさん
2008/04/10(木) 15:13:06課題の言葉の意味もわかってなさそうだ
0284デフォルトの名無しさん
2008/04/10(木) 16:17:51社会に出れば、問題を解決する方法論を持っていればそれが能力と
みなされる。
たとえその方法論が丸無げであってもな。
0285デフォルトの名無しさん
2008/04/10(木) 16:29:120286デフォルトの名無しさん
2008/04/10(木) 16:30:45C言語ならおk
0287デフォルトの名無しさん
2008/04/10(木) 18:57:280288デフォルトの名無しさん
2008/04/10(木) 19:36:170289デフォルトの名無しさん
2008/04/10(木) 23:47:00それはアセンブラでもきびしいだろw
0290デフォルトの名無しさん
2008/04/10(木) 23:54:530291デフォルトの名無しさん
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を入れ替えて大文字→小文字のモノを作ろうとしましたが
さらに日本語がおかしくなりました
まだ入門書を半分も読んでいない初心者が思いつきでやったので
色々突っ込みどころはあるかと思いますがよろしくお願いします
0292デフォルトの名無しさん
2008/04/11(金) 12:45:21漢字コードでググルのだ。
0293デフォルトの名無しさん
2008/04/11(金) 13:07:06当方で確認した環境は 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章
0294デフォルトの名無しさん
2008/04/11(金) 13:13:56突っ込みどころ満載だな。
・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で普通に扱う文字コードでは漢字コードの一部が英小文字に一致してしまう。
真面目に対処すると意外に面倒だから、他の問題を全てクリアしてから改めて挑戦しろ。
0295デフォルトの名無しさん
2008/04/11(金) 13:17:08その本はゴミだ。いや、作者がゴミそのものだ。
>>291
>293を見て気付いた点をもう一つ追加。
・小文字と判断したら、forからは脱出しておけ。
・gets()は使うな。fgets(filename, sizeof(filename), stdin)にしておけばいい。
0296293
2008/04/11(金) 13:29:55まあまあ、せっかくソースをさらして質問している(質問作法としては最上です。)のだから、
まずい点をことさらに列挙するのはどうでしょうか。
それはそうと、
fgets() の第一引数はファイル名ではなくて、バッファなんですけど。
> その本はゴミだ。いや、作者がゴミそのものだ。
netnews の時代からいろいろいわれていたようですけど、
具体的にどこが悪いんでしょうか。おしえていただけるとうれしいです。
0297デフォルトの名無しさん
2008/04/11(金) 13:36:34漢字というか多バイトコードが何なのかによって変わっちゃうから
0298291
2008/04/11(金) 13:36:57今からお二人のアドバイスを参考にやってみます!
0299デフォルトの名無しさん
2008/04/11(金) 13:37:550300295
2008/04/11(金) 13:39:07もうかなり前だから何を以ってゴミと判断したかは忘れたが、
当時本人にも直接メールして本の不備を詳細に指摘したことがある。
言い訳だけが返ってきた。
それはそうと。
>fgets() の第一引数はファイル名ではなくて、バッファなんですけど。
もとのソースを見たか?
> gets(filename);
これ以上必要もない恥の上塗りはやめておけ。
>まずい点をことさらに列挙するのはどうでしょうか。
真摯に聞く態度を示す質問者だからこそ、列挙した。
つーか、「まずい」と認識しつつ指摘しない方が不親切だろ。
0301291
2008/04/11(金) 13:41:58やっぱり初心者がやるにはちょっと面倒なモノだったようですね
皆さんの言ってることがある程度理解出来たら自己満足したいと思いますw
0303293
2008/04/11(金) 13:47:03そうですね。gets() はまずいですね。
提示されたプログラムでは、128 文字以上入力されるとおかしくなってしまいます。
> 真摯に聞く態度を示す質問者だからこそ、列挙した。
> つーか、「まずい」と認識しつつ指摘しない方が不親切だろ。
たしかに。
0304デフォルトの名無しさん
2008/04/11(金) 13:49:090305295
2008/04/11(金) 14:03:04入門の域を超えるから自分で調べてくれ。
と、それでは不親切なので、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に戻さないといけないなど制約が多いので、内部コードとして使うことはお勧めできない。
0306293
2008/04/11(金) 14:08:01補足。
>>293 ではシフトJIS(MS漢字コード)の古い時代のものを仮定しています。
>>293 で作成・検証に使用したコンパイラは、まさにシフトJIS には対応していない
ので、提示されたプログラムにある日本語メッセージは、なくなく削除しました。
0307デフォルトの名無しさん
2008/04/11(金) 14:18:05cygwinなら、gccのオプションに--input-charset=cp932 --exec-charset=cp932を書くといいかも。
応用で、EUCで書かれたソースをcygwin用にコンパイルすることもできますぜ。
0308デフォルトの名無しさん
2008/04/11(金) 16:45:27感謝です。gnu の libiconv/iconv_open() の指定方法でいけばいいんですね。
またひとつ賢くなりました。
0309デフォルトの名無しさん
2008/04/11(金) 20:16:02Aどころか女と付き合ったこともないお前が言うと笑えるw
0310デフォルトの名無しさん
2008/04/11(金) 20:34:220311デフォルトの名無しさん
2008/04/11(金) 21:18:17C#ってなに?
0312デフォルトの名無しさん
2008/04/11(金) 21:20:080313デフォルトの名無しさん
2008/04/11(金) 22:40:220314デフォルトの名無しさん
2008/04/11(金) 22:40:400315デフォルトの名無しさん
2008/04/11(金) 22:45:33プログラムを記述するのに使う言語も色々ある。
その1つがC#。もちろんCも1つの言語だ。
0316デフォルトの名無しさん
2008/04/12(土) 00:00:10まぁC#とか触ったこともないけどなw
0317デフォルトの名無しさん
2008/04/12(土) 00:28:350318デフォルトの名無しさん
2008/04/12(土) 01:04:350319デフォルトの名無しさん
2008/04/12(土) 12:44:080320デフォルトの名無しさん
2008/04/12(土) 12:52:04実装されている、出来ることを知ることの方が重要。
あとは、用意されているライブラリをきちっと使えれば、どの言語だろうと関係ねぇ
限定した言語でしか通用しないような奴は、どこへ行っても使い物にならない。
とりあえず、コンピュータの仕組みを知ることが出来たんで、大学に通っておいて正解だったぜ。
0321デフォルトの名無しさん
2008/04/12(土) 14:10:500322デフォルトの名無しさん
2008/04/12(土) 14:15:56それをチャット上などで動作させることはできないのですか?
コマンドプロンプトの中でしか出力できないのですが
0323デフォルトの名無しさん
2008/04/12(土) 14:17:00そう。
0324デフォルトの名無しさん
2008/04/12(土) 14:34:24チャット上に文字出力するプログラム作ればいいじゃん
0325デフォルトの名無しさん
2008/04/12(土) 14:36:31出力先をコマンドプロンプトじゃなくて、チャット上にするやり方が分からない
本にもそういうの載ってないんだが
すべてが独学だから聞く人もいないし・・
0326デフォルトの名無しさん
2008/04/12(土) 14:38:40そのチャットソフトが外部プログラムを呼び出すようにできていれば、可能かもしれない。
# まぁ無理だ。
0327デフォルトの名無しさん
2008/04/12(土) 14:40:46そうなんですか?teacupチャットだけど
ホットコーヒーのやつでは出来てたような。。。
とりあえず外部プログラムを呼び出すようにできてるかも分からないので、もちと勉強してきます!
ありがとうございました!
0328デフォルトの名無しさん
2008/04/12(土) 21:26:46または2チャンネルのスレッドでそういうスレがあったらきぼん。
0329デフォルトの名無しさん
2008/04/12(土) 21:27:35大学へGO!
やっぱり基礎が大事だから
0330デフォルトの名無しさん
2008/04/13(日) 07:30:38そして極め付けが、君が日ごろ見ている文字、絵、動画、音声、それらはすべて
ある法則に則って記録された数値データ、その数値データを人間で言う動物細胞
物質の原子レベルまで追求して話をすると、0と1の組み合わせ、すなわちバイナリーデータとは
0と1、あるかないか、磁石で言う+と-、電気信号でそれらを管理、制御しているのさ。
ほら、いつもニヤニヤしながら見ているエロ画像、それがだんだん・・・ただの色の集まり、
その色は0と1の組み合わせで構成されているデータに見えてきただろ?
PCに色や文字、音声が人間が解釈できる形で表現できる機能が実装されているから
その0と1の無機質なデータがエロ画像に見えるのさ。グロだろうと。
0331デフォルトの名無しさん
2008/04/13(日) 09:52:55という話と同等のどうでもいい話
0332デフォルトの名無しさん
2008/04/13(日) 10:06:34可能な範囲内で様々なことが出来るようになる。だから基本に戻れと。
ただ・・・人間も、いくら美人だろうとイケメソだろうが、所詮最後は朽ち果てて
この世から存在すらなくなってしまうのさ。ほら、躊躇してねーで、とっとと
好きなプログラムを作れ。そしてエロ画像で好きなだけはぁはぁしてろ、な?
0333デフォルトの名無しさん
2008/04/13(日) 10:08:37生きた証をどう残すかだな。子孫か、グレートコードか。
0334デフォルトの名無しさん
2008/04/13(日) 10:10:29両方ゲットせいよ
0335デフォルトの名無しさん
2008/04/13(日) 10:11:390336デフォルトの名無しさん
2008/04/13(日) 10:13:580337デフォルトの名無しさん
2008/04/13(日) 10:20:13遺伝子レベルでのことになるが。
0338デフォルトの名無しさん
2008/04/13(日) 14:32:55詳しくかつ解りやすく教えてください
0339デフォルトの名無しさん
2008/04/13(日) 14:43:450340デフォルトの名無しさん
2008/04/13(日) 15:17:190341デフォルトの名無しさん
2008/04/13(日) 15:21:39{
return teihen * takasa / 2;
}
int main()
{
printf("%d", sankaku(10, 50));
return 0;
}
0342デフォルトの名無しさん
2008/04/14(月) 18:18:42ヘッダファイル(Macの方はこれがないと実行できません)http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6243.txt
内容は1〜9の数字を表示して、中に入っていない数字(3が表示されていないなら3)を入力する簡単なゲームです
このままだと最高記録と、最後に終了した時刻を書き込むだけなのですが
いままでの記録のベスト10と、それぞれに対応した終了時刻を扱えるに変更したいです
最初にfread,fwrite関数で記録の要素数を計ってプログラムを組んだのですが
正常に読み取り、書き取りができませんでした
その時のコードを載せればいいのですが、そのままだといくつか変更しないとエラーが出るので正常に動くソースをさらしました
できるだけ簡単に記録のベスト10と、それぞれに対応した終了時刻を扱える方法を教えてください
0343デフォルトの名無しさん
2008/04/14(月) 21:33:40間引く方法で悩んでいます。
割合を%で指定された場合に、データ処理時に以下のようにしたのですが
int a = (clock() % 100) + 1;
if(a > DROPRATE) { ; }
これだと50%を指定したときに(0がFALSEで1がTRUEだとして)
000000111111000000111111
という感じに並んでしまい、
010101010101....
とはなってくれません。
出来るだけきれいに固まりが出来ないように間引くのには、通常どんな方法を
とればよいのでしょうか?
0344デフォルトの名無しさん
2008/04/14(月) 21:33:41先ず、get_data()を改修してみよう。
fscanf()の使い方はそのままで、そこで得たbest, yearなどを格納できるように構造体配列を用意するのを忘れずに。
それができたら、テキストエディタで現在のkiroku.txtを編集してダミーデータを作ってそれを喰わせてみよう。
ここまでできれば、後はput_data()を改修して、記録の取り扱いのロジックを書けばいい。
要は、1件扱うのも10件扱うのも同じこと。
fscanf()とfprintf()で作っているのなら別途fread(), fwrite()が必要になるなんてことはない。
0345デフォルトの名無しさん
2008/04/14(月) 21:41:57なんで clock なんか使ってるの?
rand 使えば?
0346デフォルトの名無しさん
2008/04/14(月) 21:44:43きれいにならぶ規則性がほしいな、と思っているのですが・・・
三角関数とか使うのは嫌だし・・・
0347デフォルトの名無しさん
2008/04/14(月) 21:45:11clock() に DROPRATE を掛ければ委員ジャマイカ?
0348デフォルトの名無しさん
2008/04/14(月) 21:48:25バケツ変数みたいなものを用意して、毎回通過時にDROPRATEずつバケツに足していくとか。
勿論、バケツが一杯になったら空にすればいい。
Ex.
static unsigned bucket = 0;
bucket += DROPRATE;
if (bucket >= 100) {
bucket = 0;
flag = true;
} else {
flag = false;
}
0349デフォルトの名無しさん
2008/04/14(月) 21:51:05こうか?
a = (a+DROPRATE) % 100;
if(a > DROPRATE) { ; }
0350デフォルトの名無しさん
2008/04/14(月) 21:57:400351デフォルトの名無しさん
2008/04/14(月) 22:05:02なるほど。規則的にしたいのか。
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");
}
とかどうよ。
0352デフォルトの名無しさん
2008/04/14(月) 22:06:05>>347
すみません。良くわかりません。
>>349
なるほど、これだと確かに固まりが分散しそうですね。やってみます。
0353デフォルトの名無しさん
2008/04/14(月) 22:07:45規則的でよければブレゼンハムのアルゴリズムが使えるよ
乱数要素を混ぜるならバッファ付のディザリングみたいの使えばおk
0354デフォルトの名無しさん
2008/04/14(月) 22:08:24ありがとうございます。やってみます。
0355353
2008/04/14(月) 23:02:19いまさらだけど…
>>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");
}
0356デフォルトの名無しさん
2008/04/14(月) 23:52:21ありがとうございます。参考になります。
皆さんへ
結局、>>351さんのループ部分をばらした関数を作って使いました。
どうもありがとうございました。
0357デフォルトの名無しさん
2008/04/15(火) 00:24:57347=349だけど参考になった。
ブレゼンハムのアルゴリズムっていうのか。
0358353
2008/04/15(火) 14:25:42参考にするなら訂正しておくよ 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");
}
0359デフォルトの名無しさん
2008/04/15(火) 23:37:51ここでいろいろ参考にして、一応作ってみました。
結果は問題ないと出るのですが、イマイチ無駄な処理が多いかなと自信なくて、
修正できるとこがあれば、自分が判りそうな範囲で修正して教えてくださいー;
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6246.txt
0360デフォルトの名無しさん
2008/04/15(火) 23:38:590361278
2008/04/16(水) 00:14:15だから関数化しようって。
無駄な処理を言うなら、フラグを駆使してまでmainだけで頑張ることが無駄。
278のをgetchar使うように修正しといたから。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6247.txt
0363デフォルトの名無しさん
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]に代入されて正解なのですが、どうしても気になったので質問させていただきました。分かりづらい説明かもしれませんがどうかお願いします。
0364デフォルトの名無しさん
2008/04/16(水) 00:59:37日本語でおk
c++ は cの値を取り出して使った後で、 cの値が+1 となる
つまり上記のy[c++]=bは c=0であれば y[0]にbを代入した後に、c=1 となる
おk?
0365デフォルトの名無しさん
2008/04/16(水) 01:00:47x[c]=a;
y[c++]=b;
これの前中後それぞれに、cの値を表示するprintf文入れりゃわかるよ。
0366デフォルトの名無しさん
2008/04/16(水) 01:08:38y[++c] = b だと cを1加算した後に y[c]←b つまり y[1] == b
0367デフォルトの名無しさん
2008/04/16(水) 01:08:52前後じゃわからんだろう
0368363
2008/04/16(水) 01:21:50++の位置で1を加算するタイミングが変わるのですね。
理解することが出来ました。ありがとうございます。
0369デフォルトの名無しさん
2008/04/16(水) 02:47:52すでに指摘されていますが、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> 全般がわからなくてスルーしちゃったのかも。
0370デフォルトの名無しさん
2008/04/16(水) 03:17:340371369
2008/04/16(水) 03:40:150372デフォルトの名無しさん
2008/04/16(水) 14:10:53変数のみの行を記述してもコンパイルエラーにならないようですが、
・文法上、なぜOK?
・どんな動きをする(最適化等で消されて何もしない?)
void main(void)
{
int a;
a; <- この行
}
0373デフォルトの名無しさん
2008/04/16(水) 14:13:08BorlandC++ 5.5
Renesas C Compiler 9 for SH
でコンパイルOKでした。
0374デフォルトの名無しさん
2008/04/16(水) 14:17:33・何もしない
0375デフォルトの名無しさん
2008/04/16(水) 14:26:21あとから先頭の方に#define f(arg) (arg)と書けば
関数呼び出しが無かったことにできます
プリプロセスの都合上必要なだけです
0376デフォルトの名無しさん
2008/04/16(水) 14:26:250377デフォルトの名無しさん
2008/04/16(水) 14:41:50エラーにならない理由を聞かれて規則でそう決まってるじゃ答えになりません
エラーがでない理由はエラーにしない方がよいと言語の設計者が考えたからであって
文法規則はその結果でしかないです
0378デフォルトの名無しさん
2008/04/16(水) 15:09:080379デフォルトの名無しさん
2008/04/16(水) 15:28:470380デフォルトの名無しさん
2008/04/16(水) 15:41:28ついでに鏡を見てごらん。そう、何かこう、プギャー!な面が映し出されているだろ?
それが何だか分かるかい?そう、自分の顔さ。見事な面だろ?
人前に出た君を、周りはその顔の人だと見ているのさ。
それはさておき、a;がなぜおkかって?単項でも数式と言えるからさ。
こんなの、数学でも初歩的だよ?w
0381デフォルトの名無しさん
2008/04/16(水) 17:12:49コンパイラ(構文解析か?)が仕様としたものが分かりました。ありがとうございます。
>>375 確かに。目にしていたはず。
>>380 "単項でも数式と言える"なるほど。 最後のwが興ざめですが。
0382デフォルトの名無しさん
2008/04/16(水) 19:45:59男は黙ってぇ〜 炭坑に入れ
0383デフォルトの名無しさん
2008/04/16(水) 21:04:190384デフォルトの名無しさん
2008/04/16(水) 21:16:38七対子、対々和、三暗刻くらいは狙おうぜ?そして僕イケメン。
0385デフォルトの名無しさん
2008/04/16(水) 21:19:49国士無双、四暗刻のダブル役満なみにねーよwww
0386デフォルトの名無しさん
2008/04/16(水) 21:20:200387デフォルトの名無しさん
2008/04/16(水) 22:09:44コンパイラとして無料で手に入るものもいくつかあがってました。
市販の処理系というのは、いずれ必要になるものなのでしょうか?
それとも、無料のもので長くやっていけるもの?
0388デフォルトの名無しさん
2008/04/16(水) 22:22:22慣れて詳しくなってからでも、有料を選ぶのは遅くないだろうしな。
0389359
2008/04/16(水) 23:54:58ありがとうございます、参考にさせていただきます。
あと、結果についてなのですが、case1のときのエラー判定が少し違ってて、
1aならエラー1、aaならエラー2、aならエラー2のように
ちょっと間違ってたようですー。
0390デフォルトの名無しさん
2008/04/17(木) 00:54:310391デフォルトの名無しさん
2008/04/17(木) 03:09:46GUIを持っているわけではなく、特殊なライブラリーもないから動くでしょう。
俺はもっぱらVisualC++2008 ExpressEditionを使っている。
0392デフォルトの名無しさん
2008/04/17(木) 07:16:23あるアプリで競艇のデータを作っています。掛け金を掛け方に応じ変えています。
■2連複=2000■3連単=3000
また投資額は(掛け方*レース数)です。
アプリ上で掛け方を入れたら自動的に投資額がでるようなのですが、式が分かりません。
自分で色々試し
■IF(方式=2連複,((レース数*2000,((レース数*3000)みたいなのを作りましたが、これだとダメでした。
宜しくお願いします。
0393デフォルトの名無しさん
2008/04/17(木) 08:11:47「++」が何のことか判りませんが、Cの質問ではないようですので
お使いのアプリ名でスレタイ検索してみてはいかがでしょうか。
0394デフォルトの名無しさん
2008/04/17(木) 08:36:04やはりそうですか。
ありがとうございました。
0395デフォルトの名無しさん
2008/04/17(木) 08:42:22それはすみません。今時間がないので、本日遅くに修正いたします。
0396デフォルトの名無しさん
2008/04/17(木) 15:18:29登録を済ませてからダウンロードボタンを押しても
「Internet Exploler ではこのページは表示できません」
と出ます。どうしてでしょう・・・
0397デフォルトの名無しさん
2008/04/17(木) 16:00:03http://pc11.2ch.net/test/read.cgi/tech/1206951221/
実はオワテないです、ちゃんとダウソしてくり
0398デフォルトの名無しさん
2008/04/17(木) 16:06:25http://www.codegear.com/jp/downloads/free
↑のC++ BuilderもしくはTurbo C++を落とすべし。
0399デフォルトの名無しさん
2008/04/17(木) 16:31:06出たーーーーーーーーーーーーーーー
これまでに要した時間3時間。
先が思いやられる
0400デフォルトの名無しさん
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");
}
}
0401デフォルトの名無しさん
2008/04/17(木) 18:17:090402デフォルトの名無しさん
2008/04/17(木) 18:17:44!==
0403デフォルトの名無しさん
2008/04/17(木) 18:24:11if(a == 20 || b == 30)
だとコンパイルされます。他の値も調べてみたんですが、
ifに続く条件が3つになるとコンパイルできないことがわかりました。
2つまでだとコンパイルできます。
Borland C++Compilerの無料のCコンパイラを使用しているんですが
これに問題があるのでしょうか?
0404デフォルトの名無しさん
2008/04/17(木) 18:25:42ありがとうございます。
一度やってみます。
0405デフォルトの名無しさん
2008/04/17(木) 18:25:480406デフォルトの名無しさん
2008/04/17(木) 18:26:33>>402さんでした
ご指摘ありがとうございます
0407デフォルトの名無しさん
2008/04/17(木) 18:42:17if (a== 20 || b== 30 || a!== 10)をif (a== 20 || b== 30 || a!= 10)
と打ちなおしても if構文に ) がない、関数main
とエラーが出てしまいます。
うーん、やっぱり駄目なのかな
0408デフォルトの名無しさん
2008/04/17(木) 18:44:260409デフォルトの名無しさん
2008/04/17(木) 19:13:260で割るのをやめる以外で、エラーを回避する方法はありますか?
0410デフォルトの名無しさん
2008/04/17(木) 19:36:580で割るのをやめる。
純粋に疑問なんだが、0で割ってエラーにならないとしたらどういう結果
になるのが自然だと思うんだろう。
0411デフォルトの名無しさん
2008/04/17(木) 19:47:4016を4で割るということは16を4つのグループに分けるということ
どんな数字も0個のグループに分けることはできないんだから
0412デフォルトの名無しさん
2008/04/17(木) 19:52:18そのほうが便利だと感じます。
0413デフォルトの名無しさん
2008/04/17(木) 19:53:260414デフォルトの名無しさん
2008/04/17(木) 20:06:51int a
int b
の宣言文にセミコロン。
0415デフォルトの名無しさん
2008/04/17(木) 20:14:270/0で割るのは0/0をかけるのと同じだから、0で割るのは0をかけるのと同じで0になっていい。
コンピューターだとビット演算の仕様でそういうことにはできないのかな。
0416デフォルトの名無しさん
2008/04/17(木) 20:15:07黙ってソース全体をコピペするなりどこかに上げるなりしろ
0417デフォルトの名無しさん
2008/04/17(木) 20:15:54目をさませ
あるいは寝ろ
0418デフォルトの名無しさん
2008/04/17(木) 20:23:350 でないある数 a に対して、a × b = 1 となるような数 b を a の逆数 (ぎゃくすう) といい、
0419デフォルトの名無しさん
2008/04/17(木) 20:24:140420デフォルトの名無しさん
2008/04/17(木) 21:08:37それは違う。それが成り立ってしまうと、数学的帰納法で全ての数が等価になってしまう。
0421デフォルトの名無しさん
2008/04/17(木) 21:15:480422デフォルトの名無しさん
2008/04/17(木) 21:24:01セミコロンをつけましたがやはりダメでした
0423デフォルトの名無しさん
2008/04/17(木) 21:26:220424デフォルトの名無しさん
2008/04/17(木) 21:44:040425デフォルトの名無しさん
2008/04/17(木) 22:04:46#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が発生するんだけどどうして?
0426デフォルトの名無しさん
2008/04/17(木) 22:20:360427デフォルトの名無しさん
2008/04/17(木) 22:28:17sqrt(1.0-(n/i)*(n/i))が怪しい
1.0-(n/i)*(n/i)の計算結果が-0.0になることがあるんじゃないの?
sqrt(fabs(1.0-(n/i)*(n/i)))にしてみるとか
0428デフォルトの名無しさん
2008/04/17(木) 22:31:15これがまずい。
nがiのとき0で割ることになる
>>426
そこもおかしいが、domain errorとは関係ない
0429デフォルトの名無しさん
2008/04/17(木) 22:35:29#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;
}
やっぱりできない
0430デフォルトの名無しさん
2008/04/17(木) 22:36:38doubkeを
> for(i=10;i<=1000000000;i*=10){
のように計算するのは好ましくない。誤差が出てしまう。
0431デフォルトの名無しさん
2008/04/17(木) 22:41:011 / 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に近づけると-∞になるから
こういう極限は存在しなかった。
0432デフォルトの名無しさん
2008/04/17(木) 22:58:13でないだろ普通・・・
お前の環境doubleが何byteなんだよw
0433デフォルトの名無しさん
2008/04/17(木) 23:05:300434デフォルトの名無しさん
2008/04/17(木) 23:17:46わかりました。
if (a== 20 || b== 30 || a!= 10)
↑を !a にしたらコンパイルできました。
考えてくれてありがとうございました。
0435デフォルトの名無しさん
2008/04/17(木) 23:28:37いや、ちゃんとコンパイルできますよ。
これをコンパイルしてみてください。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6267.txt
当方で確認した環境はWindowsXP, 処理系はcygwin(gcc3.4.4) です。
うまくいかない場合は、実行環境/コンパイラの種類を教えてください。
手に入るものなら私でも試してみます。
0436423
2008/04/17(木) 23:29:30402,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;
}
0437デフォルトの名無しさん
2008/04/17(木) 23:37:21お使いの環境に matherr() 関数はありませんか?
0438デフォルトの名無しさん
2008/04/17(木) 23:40:33>>436
考えてもらってありがとう。なんとかコンパイルできたので
また何かエラーが出たら教えてください。
0439デフォルトの名無しさん
2008/04/17(木) 23:44:25順序を変えました。inputInt() の該当部分を、次のようにしました。
if (err == 1)
return 1;
if (cnt == 0)
return 2;
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6268.txt
0440デフォルトの名無しさん
2008/04/17(木) 23:49:08算数の教科書をみなおしてみましょう。
わり算はかけ算の逆であると決めれば、わる数が 0 である場合は
「答えになることのできる数はない」
のです。
0441デフォルトの名無しさん
2008/04/18(金) 00:45:34設定をしていたんですが、なぜか、PATHの設定が失敗してしまいます。
何がいけないんでしょうか?
0442デフォルトの名無しさん
2008/04/18(金) 00:46:31スレ違い、失せろ
0443デフォルトの名無しさん
2008/04/18(金) 00:47:56お前が失せろ
0444デフォルトの名無しさん
2008/04/18(金) 00:49:320445デフォルトの名無しさん
2008/04/18(金) 00:58:080447デフォルトの名無しさん
2008/04/18(金) 00:59:31どうぞどうぞ
0448デフォルトの名無しさん
2008/04/18(金) 01:00:04あっ どうぞ、どうぞw
0449448
2008/04/18(金) 01:01:500450デフォルトの名無しさん
2008/04/18(金) 01:03:10早漏乙
0451デフォルトの名無しさん
2008/04/18(金) 01:27:18BCC Developper
http://pc11.2ch.net/test/read.cgi/tech/1155549904/
ここで聞くのがいいんだろうけど、問題はとんでもない過疎スレで、
質問してもレスがつくという保障はない。
とりあえず、ここでいいんじゃないの?
0452デフォルトの名無しさん
2008/04/18(金) 09:36:52>何がいけないんでしょうか?
あんたの頭。
0453デフォルトの名無しさん
2008/04/18(金) 13:53:50大きくわけて#defineを使うのとenumを使うのがあるようですが、
どのように使い分ければいいのでしょうか?
それとも好みの問題?
0454デフォルトの名無しさん
2008/04/18(金) 14:03:01整数値でないならdefine、
後はプロジェクトごとの規定による。
0455デフォルトの名無しさん
2008/04/18(金) 14:26:08最初からじっくり読んでエスパー目指します。
0456デフォルトの名無しさん
2008/04/18(金) 16:30:54って書き方は間違いですか?
直すとしたら、
>sprintf("%.2f", 1.1)
といった感じでしょうか?
0457デフォルトの名無しさん
2008/04/18(金) 16:33:33直すとしたら
sprintf(buffer, "%0.2f", 1.1);
じゃないかと思った
ゼロフラグが有っても別に間違いということはないと思う
0458456
2008/04/18(金) 16:37:440459nito
2008/04/18(金) 16:39:40featall[i*featnum[i]+p].descr = n[p].descr;
とすると
main.c(143) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
というエラーがでます。
どうしてでしょうか。
ちなみにdescrは[128]です。
0460デフォルトの名無しさん
2008/04/18(金) 16:51:23int a[10]; で
a = 5; とかできない。
ってのと同じ。
0461デフォルトの名無しさん
2008/04/18(金) 16:56:51配列をまるっとコピーしたいならmemcpyかmemmoveを使え
0462デフォルトの名無しさん
2008/04/18(金) 17:05:17おかしいといえばおかしいが、おかしくないといえばおかしくない。
なぜなら配列は特定の場合を除いてポインタ値(ポインタ変数ではない。つまり右辺値)に成り下がるから。
まあどうでもいいか。
0463nito
2008/04/18(金) 17:24:42言われてみれば確かに…
>461
おkす。やってみます。
みなさんありがとうございます。
何分Cは初めたばかりでしてちょくちょくつっかかってまして
また使わせていただきます(滝汗
0464nito
2008/04/18(金) 18:07:26memcpy(featall[i*featnum[i]+p].descr,n[p].descr,sizeof());
と書くことにしました。
この場合、sizeofには
int[128]
と入れれば
128個の配列分確保されるんでしょうか。
0465デフォルトの名無しさん
2008/04/18(金) 18:25:29yes
0466465
2008/04/18(金) 18:33:49memcpy は移動元と異動先が被るような場合はうまくいかない。
bcopy (from, to, len); // memcpy(to, from, len) と引数順が違う
というのもある。
0467デフォルトの名無しさん
2008/04/18(金) 19:29:52が標準出力に文字「A」を出すという保証はないですよね?
「文字定数=>int」「int=>char」「char=>%cで出てくる文字」は全く別の変換であって、
そこらの処理系ではたまたま合ってるだけですよね
規格を読む限り
0468デフォルトの名無しさん
2008/04/18(金) 20:02:49何故そこでmemmove()を薦めない。
0469デフォルトの名無しさん
2008/04/18(金) 20:36:25bcopy は sun os に付属のコンパイラで使ったことがありますが、どこにでもあるのでしょうか....。
やっぱり memmove() ですか。
0470デフォルトの名無しさん
2008/04/18(金) 20:51:50***
-**
--*
といった具合(後ろで桁合わせ、-は空白)に出力されるプログラムを組みたいと思います。
#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で終わってしまったり、無限ループしてしまうといった状態でどう改善させれば良いのか分かりません。
宜しくお願い致します。
0471デフォルトの名無しさん
2008/04/18(金) 20:58:09+for(j=num; i<=j; j--)
0472デフォルトの名無しさん
2008/04/18(金) 21:10:45int main()
{
int num;
scanf("%d", & num);
for (i = 0; i < num; ++i) {
printf("%*s%.*s\n", i, "", num - i, "**********");
}
return 0;
}
0473デフォルトの名無しさん
2008/04/18(金) 22:37:09実はこれに2時間以上つっかかってました・・・(恥
これで安心して寝れます。ありがとうございました。
0474デフォルトの名無しさん
2008/04/18(金) 22:38:540476デフォルトの名無しさん
2008/04/19(土) 02:01:40#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;
0477デフォルトの名無しさん
2008/04/19(土) 02:07:39case3:/*3人の時*/
price=8000
break;
}
room=price*person;/*1部屋あたりの宿泊料を計算*/
printf("宿泊人数%d人の時、",person);
printf("1人あたりの宿泊料は%d円です。\n",price);
printf("1部屋あたりの宿泊料は%dです。\n",room);
}
0478デフォルトの名無しさん
2008/04/19(土) 02:07:53あと
× void main() { ... }
○ int main() { ... return 0; }
0479デフォルトの名無しさん
2008/04/19(土) 02:09:18以降ってことは 4 とか入れた場合のことか?
そりゃ price に何も値代入してないから無茶苦茶になるぜ。
0480デフォルトの名無しさん
2008/04/19(土) 02:10:45それでcase2までにすると、どんな値をいれても正確に計算されるんですが
3つ以上になるとおかしくなるんです。
0481デフォルトの名無しさん
2008/04/19(土) 02:14:15ありがとうございます。
明日、起きたら試してみます。
いま使っているパソコンとプログラミングしているパソコンは
別にあるので夜遅く申し訳ありません。
0482デフォルトの名無しさん
2008/04/19(土) 02:16:170483デフォルトの名無しさん
2008/04/19(土) 02:16:37どう読んだか知りませんが、間違ってます。
0484デフォルトの名無しさん
2008/04/19(土) 07:57:59>482が指摘したとおり、caseの後に空白がないのではないか?
他の構文ミスと違い、caseの後の空白がないこと自体は文法違反にならないからエラーにはならない。
0485デフォルトの名無しさん
2008/04/19(土) 10:28:290486デフォルトの名無しさん
2008/04/19(土) 10:31:35if (person == 3) goto case3;
0487デフォルトの名無しさん
2008/04/19(土) 12:24:23「十日で覚えるC言語入門教室」のどちらを買おうか悩んでいるんですが、
経験者の方から見てどちらが使いやすいんでしょうか?」
アマゾンはいまいち頼りにならなくて・・・・
0488デフォルトの名無しさん
2008/04/19(土) 12:39:11以下のプログラムをコンパイルして実行しても、数字を入力させるだけで何も起こりません。
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;
}
0489デフォルトの名無しさん
2008/04/19(土) 12:43:41>>478
>>479
>>484
>>486さんのいう通り試してみましたが、case3以降の計算がやはり間違えてしまいます。
もう一度、プログラムを書きなおしてみても同じ結果でした。
コンパイルになにか不具合があるのでは?と疑っています。
とりあえずcase2までは計算できるので、エラーは置いといて先のプログラムに進んでみよう
と思います。
0490デフォルトの名無しさん
2008/04/19(土) 12:50:55やめろバカ
一足飛びに習得できるほどCはヌルい言語じゃないぞ
とりあえずコンパイルしたソースをそのまま貼るんだ
0491デフォルトの名無しさん
2008/04/19(土) 12:55:30・ prime[0]=prime[1]=0; はループの外に出せ
・ 二つ目のループが何をやっているのかもう一度考えなおせ
ifに条件が足りないはず
0492デフォルトの名無しさん
2008/04/19(土) 13:14:29person=3なので、>>477のcase3の値がテキスト上では計算されることになってます。
実際のコンパイルの結果は
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
宿泊人数3人の時
1人あたりの宿泊料は 2147348480 円です
1部屋あたりの宿泊料は 2147078144 円です
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
となります。(21億4千7百34万8千480円)と(21億4千7百7万8千144円)
0493デフォルトの名無しさん
2008/04/19(土) 13:18:13>person=3なので、>>477のcase3の値がテキスト上では計算されることになってます。
いいえ。理由は>484。
0494488
2008/04/19(土) 13:19:21言う通りにしたら正常に動作しました。ありがとうございました。
あと、このプログラムだと入力値が10000をこえると正しく動かないと思うんですが、
入力値までprimeを定義するにはどうすればいいんでしょう?
0495デフォルトの名無しさん
2008/04/19(土) 13:20:440496デフォルトの名無しさん
2008/04/19(土) 13:26:31書いたプログラムを確かめたところ、ご指摘のとおり
case 3: と空白を開ければ、指示通り正しい計算ができました。
初歩的なミスでお騒がせしてすいませんでした。
またよろしくお願いします。
0497デフォルトの名無しさん
2008/04/19(土) 14:20:411行に含まれるデータの数は各行でまちまちです。
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);
}
0498デフォルトの名無しさん
2008/04/19(土) 14:43:410499497
2008/04/19(土) 14:57:05レスありがとうございます。一つ書き忘れたのですが、行を行として読み込むことが
要件としてあります。つまり、1行と2行目は別の要素として読み込みたいと考えてます。
要件漏れすいませんでした。
fscanfは考えたのですが、改行文字も空白と同様データの区切りとして読み込むと
のことでしたので、1行をバッファに読み込んでから処理をしています。1行ずつ別途に
処理する方法があれば教えてください。
0500デフォルトの名無しさん
2008/04/19(土) 15:31:22fgets(), sscanf()
0501デフォルトの名無しさん
2008/04/19(土) 15:37:440502デフォルトの名無しさん
2008/04/19(土) 15:46:07”型名 *ポインタ変数(引数)”と、するとどうしてダメなのでしょう?
お願いします。
0503デフォルトの名無しさん
2008/04/19(土) 15:49:110504デフォルトの名無しさん
2008/04/19(土) 15:56:26よく分からないのですが、int *kansu()はint形のポインタを返す関数の
プロトタイプ宣言と解釈されるのですか?
0505デフォルトの名無しさん
2008/04/19(土) 16:01:46int* p;
p = kansu();
0506デフォルトの名無しさん
2008/04/19(土) 16:06:59ありがとございました。
0507デフォルトの名無しさん
2008/04/19(土) 16:08:55kansu_t* kansu = &foo;
int n = kansu();
typedef は偉大だと本気で思う。
0508デフォルトの名無しさん
2008/04/19(土) 17:30:27データ管理のプログラムを作る時、各々のデータ(文字列)の配列のサイズは、
malloc()関数で決めるのが一般的なのでしょうか?
0509デフォルトの名無しさん
2008/04/19(土) 17:32:18mallocのほか、calloc()やrealloc()でも可。
0510デフォルトの名無しさん
2008/04/19(土) 17:38:25いずれにしろ、ある程度の規模になればmalloc()は必須になるから慣れておいたほうがいい。
0511デフォルトの名無しさん
2008/04/19(土) 17:43:250512デフォルトの名無しさん
2008/04/19(土) 17:52:55ありがとうございます。
「ある程度の規模」というのがわからないのですが、
たとえば、500個くらいのデータの各々に「メモ」配列をつける場合、
200文字までと固定してしまって、実際にはメモのない場合がほとんどだったら?
0513デフォルトの名無しさん
2008/04/19(土) 17:53:58固定で十分なら固定にすればいい。
0514デフォルトの名無しさん
2008/04/19(土) 17:54:400515デフォルトの名無しさん
2008/04/19(土) 17:54:590516デフォルトの名無しさん
2008/04/19(土) 17:57:250517デフォルトの名無しさん
2008/04/19(土) 18:01:37「スタック」でぐぐってみるとよし。
スタックは小さいから、そこに収まらない規模の配列は必然的にmalloc()を使うことになる。
0518デフォルトの名無しさん
2008/04/19(土) 18:03:440519512
2008/04/19(土) 18:09:29さしあたって、Cを勉強しているのですが、
stringが簡単そうですね。
C++も視野に入れて勉強していこうと思います。
0520デフォルトの名無しさん
2008/04/19(土) 18:13:37a=a+"えお";
などと自動でサイズ変更してくれる。
初心者はstring
0521デフォルトの名無しさん
2008/04/19(土) 18:19:10a+="えお"; だろ。
コスト考えれ。
0522デフォルトの名無しさん
2008/04/19(土) 18:24:080523デフォルトの名無しさん
2008/04/19(土) 19:37:510524デフォルトの名無しさん
2008/04/19(土) 19:53:31最初に配列の要素を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
ここから、字種の出現頻度を求めるために一体どうすればいいのか分かりません…。
何かヒントを頂けないでしょうか。
0525デフォルトの名無しさん
2008/04/19(土) 20:01:06文字に応じて対応したカウンタをインクリメントしていき、終了時に頻度を出力。
0526デフォルトの名無しさん
2008/04/19(土) 20:01:080527デフォルトの名無しさん
2008/04/19(土) 20:13:04やっとCの入門書を読み終えたのだが、
フリーソフトとかで転がってるウィンドウズのプログラムとか
まだぜーんぜん無理な気がする。
だいたいそもそウィンドウの一文字も出てこないんだが、、、
コマンドプロンプトでさ、計算とかさ、文字列とかさ、
先がながーーーーーーーーーーーーい
みなさんいっぱしのプログラムが作れるようになるまで
どんくらいかかりました・・・?
0528デフォルトの名無しさん
2008/04/19(土) 20:21:44読むだけじゃダメなんだぜ?
理解し実践して身に付けなければ次へ進むことはできない。
0529デフォルトの名無しさん
2008/04/19(土) 20:22:53初めてリリースしたのが14歳でvimのパッチ。
自分のオリジナルソースは某3Dライブラリで19の時。
お遊びで始めたsocket通信利用のP2P対戦ゲームを作成したのが20の時。
採用された企業で売れる商品に携われたのが23歳の時。
14年ぐらいかな
0530デフォルトの名無しさん
2008/04/19(土) 20:26:200531デフォルトの名無しさん
2008/04/19(土) 20:32:22特定しました
0532デフォルトの名無しさん
2008/04/19(土) 21:16:05たとおりの動作しません。良い方法が有れば教えてください。出来
れば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
======
0533デフォルトの名無しさん
2008/04/19(土) 21:18:21前回読み出した位置からの相対位置を取得するものではない。
0534側近中の側近 ◆0351148456
2008/04/19(土) 21:22:03(っ´▽`)っ
%nは、sscanf関数の呼出しでこれまでに読み取った文字数を、その整数に書き込む。
つまり、
a・・・1文字
a\nab・・・4文字
a\nab\nabc・・・8文字
a\nab\nabc\nabcd・・・13文字
ということになる。
0535532
2008/04/19(土) 21:28:43早速の回答ありがとうございます。
どうさ結果からしてそうらしいとは思っていました。残念。
strlen呼ぶしか無いのかなぁ
0536デフォルトの名無しさん
2008/04/19(土) 21:37:30%n だけじゃ難しいね。
strlen の方が簡単だと思う。
0537デフォルトの名無しさん
2008/04/19(土) 22:11:470538532
2008/04/19(土) 22:15:32改めて突っ込まれると特に理由は有りません(汗)
強いて言うならあまり美しくないと思ったくらい。
0539デフォルトの名無しさん
2008/04/19(土) 22:44:39ptr=str_src;
for(i=0;i<5;i++){
sscanf(ptr, "%s%n", str_dst[i], &tmp);
n[i]=strlen(str_dst[i];
ptr+=tmp;
}
0540デフォルトの名無しさん
2008/04/19(土) 23:44:51if(isupper(i))
a[i-'A']++;
else
other++;
0541デフォルトの名無しさん
2008/04/19(土) 23:51:090542デフォルトの名無しさん
2008/04/20(日) 00:50:120543デフォルトの名無しさん
2008/04/20(日) 01:20:11>>507
int n = (*kansu)();
でないと、偉大さがあいまいになる気がします‥‥‥。
0544デフォルトの名無しさん
2008/04/20(日) 13:57:17一覧表示するプログラムを作りたいのですが、
何かヒントをください!!
0545デフォルトの名無しさん
2008/04/20(日) 13:59:50strstrを使う
0546デフォルトの名無しさん
2008/04/20(日) 14:30:220547デフォルトの名無しさん
2008/04/20(日) 14:33:57# 寧ろsedか
0548デフォルトの名無しさん
2008/04/20(日) 21:06:28現在、BorlandC++ Compiler 5.5(コンパイラ)とCPad(エディタ)の組み合わせで使っていますが
この環境でのDXライブラリを使う方法がいまいちわかりません
DXライブラリの公式サイトではBCC Developerというエディタで説明を進めているのですが、CPadでは使えないのでしょうか?
0549デフォルトの名無しさん
2008/04/20(日) 21:19:380550デフォルトの名無しさん
2008/04/20(日) 21:26:08そうですか!
しかし使い方がわかりません
どこを設定すればいいでしょうか?
0551デフォルトの名無しさん
2008/04/20(日) 21:36:120553デフォルトの名無しさん
2008/04/20(日) 22:00:520554デフォルトの名無しさん
2008/04/20(日) 22:02:41ある値が出たら終了するようにするには、どうやるべきでしょうか?
0555デフォルトの名無しさん
2008/04/20(日) 22:04:48do{x=動作;}while(x==ある値);
0558デフォルトの名無しさん
2008/04/20(日) 22:09:25do{x=動作;}while(x!=ある値);
だな
0559デフォルトの名無しさん
2008/04/20(日) 22:10:59コンパイラから見える場所において置けよ
0560デフォルトの名無しさん
2008/04/20(日) 22:11:35よく分からん
BorlandC++ Compiler 5.5のスレかDXライブラリのスレいったほうがいい
0561デフォルトの名無しさん
2008/04/20(日) 22:13:06bcc32.cfg
ilink32.cfg
の中身を見てみることを勧める?
0562デフォルトの名無しさん
2008/04/20(日) 22:19:33なんで疑問系?>オレ
0563548
2008/04/20(日) 22:26:56.hや.libのフォルダが複数あってわかりません。。
>>561
パス追加するとインクルードはできてるようなのですがエラーも大量に出てきました。。
0564デフォルトの名無しさん
2008/04/21(月) 11:41:20#define test1 "hogeA"
#define test2 "hogeB"
...
#define test10 "hogeJ"
と定義した場合、Nを変数としてtestNを呼び出すにはどうすれば良いでしょうか。
イメージとしては配列の場合のtest[N]のようにです。
0565デフォルトの名無しさん
2008/04/21(月) 12:12:54プログラムではどういう設定をしたらいいんでしょうか?
0566デフォルトの名無しさん
2008/04/21(月) 12:31:23OSの資料を読みましょう。
0567デフォルトの名無しさん
2008/04/21(月) 12:57:15const char* test[] = { "hogeA", "hogeB", ... };
0569デフォルトの名無しさん
2008/04/21(月) 14:53:45とするとコピーがなされません。どうしてでしょうか。
なお、
struct feature* featall;
struct feature* feattest;
struct feature
{
double x;
double y;
double a;
double b;
double c;
}
としています。
0570デフォルトの名無しさん
2008/04/21(月) 15:02:40featall, feattest が指す先はどこ?
0571デフォルトの名無しさん
2008/04/21(月) 15:04:040572デフォルトの名無しさん
2008/04/21(月) 15:08:32どうでもいいけど、構造体のコピーなら=を使えよ。
0573デフォルトの名無しさん
2008/04/21(月) 17:40:46struct 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
って参照する事は出来ないんですか??
0574573
2008/04/21(月) 17:43:42main関数内で宣言しています。
0575デフォルトの名無しさん
2008/04/21(月) 17:46:16こういうことをしたいのか?
0576デフォルトの名無しさん
2008/04/21(月) 17:47:300577デフォルトの名無しさん
2008/04/21(月) 17:48:22コンパイルエラーならエラーメッセージを貼るべし
0578573
2008/04/21(月) 17:52:47そういう事をしたいです。
>>576
実際はforループの中に入ってるんですが、
プログラムがゴッチャゴチャになっているのでかなり抜粋しています。
多重間接参照の方法が知りたいと思いまして…
>>577
コンパイルは通ります。でも値が上手く入っていないようで常に0を返してきます。。
多重間接参照の部分は合っていますか?変に回りくどく聞いて申し訳ございません。。
0579デフォルトの名無しさん
2008/04/21(月) 18:01:070580デフォルトの名無しさん
2008/04/21(月) 18:14:540581573
2008/04/21(月) 18:27:07表示させてみた所、値がおかしいです。・・・常にfalse。。
>>580
はい。そこも伝わりづらくすみません。
質問投げっぱなしで申し訳ないのですが、
>>579さんの感じでやってみた所、原因は(計算略)の部分にありそうです。
ここに数百行詰まっていて助けを借りるのも憚られるので、自力でなんとかしてみます。
気にかけて頂きありがとうございました。。
0582デフォルトの名無しさん
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です。
0583デフォルトの名無しさん
2008/04/21(月) 19:45:20init(&a, &p);
の上にあればおkってことね。
0584初心者
2008/04/21(月) 19:46:27問題があるんだけどう答えていいかわからない…教えてください
使う用語
亀(turtle)
コムソート(comb sort)
0585デフォルトの名無しさん
2008/04/21(月) 19:50:40http://www.google.co.jp/search?hl=ja&client=firefox&rls=org.mozilla%3Aja%3Aofficial&hs=VJE&q=comb+sort%E3%80%80%E4%BA%80&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja
0586デフォルトの名無しさん
2008/04/21(月) 21:47:010587デフォルトの名無しさん
2008/04/21(月) 22:02:130588デフォルトの名無しさん
2008/04/21(月) 22:07:100589デフォルトの名無しさん
2008/04/21(月) 22:08:54その5つの値の平均(double)を
だすプログラムを作成
せよ.
その時、5つの引数を受け取り,平
均を返す関数を呼び出し,返された平均値をmain関数
で画面出力すること
0590デフォルトの名無しさん
2008/04/21(月) 22:25:230591デフォルトの名無しさん
2008/04/21(月) 22:35:58どこからどうやって読み込むのかが不明なのでなんとも言えない
0592デフォルトの名無しさん
2008/04/21(月) 22:50:00double 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;
}
0593デフォルトの名無しさん
2008/04/21(月) 22:53:37処理を作りたいのですが、上手くいきません
お手数かと思いますが、どなたか教えて下さい
0594デフォルトの名無しさん
2008/04/21(月) 22:57:43環境依存の技を使う必要がある
実際にstdioライブラリで読み取ることのできるデータ数が問題なら
実際に読んでその数を数えるしかない
0595デフォルトの名無しさん
2008/04/21(月) 22:59:38オフセット値で調べる
0596さなぎさん
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コマンドがうまく使えません。
どなたかご教授くださいな
0597デフォルトの名無しさん
2008/04/21(月) 23:03:221. stat(filename, &stat);
2. fp=fopen(filename,"wb");fseek(fp,0L,SEEK_END);ftell(fp);fclose(fp);
0598デフォルトの名無しさん
2008/04/21(月) 23:06:24#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;
}
0599デフォルトの名無しさん
2008/04/21(月) 23:08:08sscanf(p, "%2d", &num);
p+=2;
printf("%3.0d", num);
0600デフォルトの名無しさん
2008/04/21(月) 23:14:55{
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 : " ");
}
//... 月の表示とかは適当にどそ
0601デフォルトの名無しさん
2008/04/21(月) 23:40:23レスありがとうございます
>>598さんのソースを使って実行してみたところ、取得できました
が、ファイルサイズの取得でした
無知で申し訳ありませんがファイルサイズ=データ長という認識でいいのでしょうか?
0602デフォルトの名無しさん
2008/04/21(月) 23:42:41どういうつもりでデータ長と書いたんだよ
0603デフォルトの名無しさん
2008/04/21(月) 23:47:10すみません、気分を損ねるようなつもりは全くありませんでした
例えばstrlenを使うようなイメージでした
ファイルサイズを取得する処理はできていたのですが、データ長を取得する処理だと言われ
こちらにお邪魔した次第です。ファイルサイズとデータ長の違いがわからないのです
教えて頂いたのに本当にすみません
0604デフォルトの名無しさん
2008/04/21(月) 23:52:33データ長てのはファイルに何かしらの形式でデータが入ってて、
その長さとかそういう事なの?
0605デフォルトの名無しさん
2008/04/22(火) 00:03:49実際にやりたかったのは指定したファイル(形式は一定でない)のデータ長を取得して
既に出来上がっている関数に飛ばすと言った処理をやりたかったのです
データ長と書いたのは恥ずかしい話なのですが関数の引数コメントに
「ファイルデータ長」と書いてあったからで、何故データ長を使用するのかわかりません
自分なりに調べてファイルサイズを取得、関数に引き渡す処理を作成したのですが
口頭で説明したところ「ファイルサイズじゃなくてデータ長」と言われ、違いがわからなかったのです
1バイト文字、2バイト文字を混ぜたようなテキストファイルを作成した時のバイト数(目算)と
単純なファイルサイズに違いがないので、何がどう違うのかすらわからなくて・・・
それでここにお邪魔したのですが、調べ方が足りなかったように思えます
自分が甘かったです。本当にすみませんでした
0606デフォルトの名無しさん
2008/04/22(火) 00:05:440607582
2008/04/22(火) 00:14:48スタイルの違いってことなんですね。
はじめて見た形だったので
関数のスコープが変わるのかな、なんて勘違いしそうでした。
どうもありがとうございました。
0608デフォルトの名無しさん
2008/04/22(火) 00:16:031レコード固定長で可変長文字列データを複数レコード格納する場合、
ファイルサイズ != データ長 となるかもしれんね
0609デフォルトの名無しさん
2008/04/22(火) 00:18:44本人に聞け
わかるまで聞け
要件を徹底的に具体化するのはプログラマの基本だ
0610デフォルトの名無しさん
2008/04/22(火) 00:24:05メモリに展開しろって意味だ、多分
0611デフォルトの名無しさん
2008/04/22(火) 00:26:12プロトタイプ宣言以前の時代から使っているロートルに多い。
あいつらは放っておくとこんなソースを書きかねない。
main()
{
double sqrt();
printf("%g\n", sqrt(.1));
}
0612デフォルトの名無しさん
2008/04/22(火) 00:28:19まっとうなロートルは
sqrt(1.0);
または
sqrt((double)1);
と書く
0613デフォルトの名無しさん
2008/04/22(火) 00:30:21それも立派なプロトタイプ宣言なのだが
0614デフォルトの名無しさん
2008/04/22(火) 00:34:220.1であることに注意。
>>613
一般的に、引き数リストがないものはそう呼ばないのでは?
いずれにしても「その頃からやってるロートル」なので、一応C99も「知っている」らしいよ。
0615デフォルトの名無しさん
2008/04/22(火) 00:46:50引数リストのないプロトタイプ宣言はAnsi-C以前のもの
いわゆるK&RのC
そのころからやっている超ロートル
0616デフォルトの名無しさん
2008/04/22(火) 01:51:12今からC言語を勉強しようと思ってるんだが
windowsとLinuxどっちでやったほうがいいの?
0617デフォルトの名無しさん
2008/04/22(火) 01:54:530618デフォルトの名無しさん
2008/04/22(火) 01:58:58理由は?
0619デフォルトの名無しさん
2008/04/22(火) 01:59:080620デフォルトの名無しさん
2008/04/22(火) 02:02:15趣味なら自分のマシンに合わせればいい
職業にしようと思ってるんならまずWindowsをやり余裕があればUnix/Linux
0621デフォルトの名無しさん
2008/04/22(火) 02:04:05UNIXは派生が多いし普及がいまいち
0622デフォルトの名無しさん
2008/04/22(火) 02:05:460623デフォルトの名無しさん
2008/04/22(火) 07:02:18だよな。コンソールアプリしか作れんが。
標準を覚えたいならVCなんかは却って邪魔かも知れん。
ただし、将来Windowsアプリの仕事をしたい、
と思うなら「Cを覚える」というより「VC++を覚える」、という感覚のほうがいい。
0624デフォルトの名無しさん
2008/04/22(火) 14:14:29スレチだったらスマソ
0625デフォルトの名無しさん
2008/04/22(火) 14:15:39独習C
ダイテルのC言語プログラミング
CFAQ
0626デフォルトの名無しさん
2008/04/22(火) 15:08:04MKRLIKKSAIGMFAFFVVAASGPVFAAVGDQGVDWSKYNGTYGNFGYAHDKFAFSQIGGT
YGGTFVDQATYETQVASAIAQGKRAHTYIWYQVGGSQEVAKAALDRYLPKIQTPKNSIVA
LDYEGGASGNKQANTDAILYGMRRVKAAGYTPMYYSYKPYTLANVNYKQIIKEFPKSLWI
AAYPNYEVTPVPNYSFFPSMDGISVFQFTSTYVAGGLDGNVDLTGITGNGYGKQKGQEVK
PNTATPAIENGKEANEVKGNDVEVGMTVKVNFGAKNYATGETIPQWVKGQPHKIIQKNGD
TVLLDGIMSWLSVHDVETIDASTSQPTTPAKSYIVKQGDTLSGIASNLGTNWQELARQNS
LSNPNMIYSGQVISLTGGQSGATARTYTVQSGDNLSSIARRLGTTVQSLVSMNGISNPNL
IYAGQTLNY
が格納されているファイルを読み込み各文字が何%あるかを出力ファイルに書き出すプログラムをつくって
0627デフォルトの名無しさん
2008/04/22(火) 15:31:42とりあえず、作って・・・
捨てちゃった。
total 437
A : 8.92448513% ( 39)
B : 0.00000000% ( 0)
(中略)
Y : 6.63615561% ( 29)
Z : 0.22883295% ( 1)
0628デフォルトの名無しさん
2008/04/22(火) 15:38:57#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);
}
0629デフォルトの名無しさん
2008/04/22(火) 17:43:36おぬしもワルよのう( ̄ー ̄)
0630デフォルトの名無しさん
2008/04/22(火) 17:46:43日本語が理解できない人かw
0631デフォルトの名無しさん
2008/04/22(火) 18:22:540632デフォルトの名無しさん
2008/04/22(火) 18:24:530633デフォルトの名無しさん
2008/04/22(火) 18:38:31安定なソートですから、それなりに有用な場合があるのかもしれません。<バブルソートの高速化
0634デフォルトの名無しさん
2008/04/22(火) 18:38:460635デフォルトの名無しさん
2008/04/22(火) 18:48:22効率の悪いバブルソートが用いられるのはよくあることだ。
そうやって、アルゴリズムを改良すると、処理時間、計算量が減って
効率が良くなるという勉強をするのさ、そういった分野の学校では。
0636582
2008/04/22(火) 18:55:24Cしかできない俺が最近はやりのJavaScriptに劣等感を抱いているんだが、
バカにしたもんじゃないなって嬉しくなった
0637デフォルトの名無しさん
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って他のソースファイルで定義してるからここでは宣言のみ、
# ですよってことだったと認識していたのですが
0638デフォルトの名無しさん
2008/04/22(火) 19:11:550639デフォルトの名無しさん
2008/04/22(火) 19:36:46リンカがエラー出してない?
シンボルが重複してますよって
0640デフォルトの名無しさん
2008/04/22(火) 19:55:48出ていません。
コンパイラはgccで、文法チェックが一番厳しいオプションをつけてコンパイルしても次の警告が出るだけです。
src1.c: In function 'main':
src1.c:6: 警告: implicit declaration of function 'sub'
# >>637のソースはちょっと編集していますので、6行目ではなくて実際は4行目ですが。(重要なことではありませんでしたね)
いかがでしょうか。
0641デフォルトの名無しさん
2008/04/22(火) 20:05:16古いとそういう挙動を示す。
ANSIではエラーにならなければならないが。
0642デフォルトの名無しさん
2008/04/22(火) 20:10:112007年1月5日にリリースされているみたいなので、古くはないとは思うのですが
何かバグでもあるのでしょうか...
0643デフォルトの名無しさん
2008/04/22(火) 20:12:08が詳細です。連レスすみません。
0644デフォルトの名無しさん
2008/04/22(火) 20:20:26--allow-multiple-definitionあたりが渡ってないか?
0645デフォルトの名無しさん
2008/04/22(火) 20:41:56{
int *retest = malloc(sizeof(int)*size);
return retest;
}
int main()
{
int *test;
test = TEST(5);
.....
free(test);
return 0;
}
こういうことをするつもりなのですが、関数TEST内でmallocしたものはfree(test)で開放できてるのでしょうか?
0646デフォルトの名無しさん
2008/04/22(火) 21:11:370647645
2008/04/22(火) 21:22:440648デフォルトの名無しさん
2008/04/22(火) 21:37:15それにしても、なにか怖い構造だね。
0649デフォルトの名無しさん
2008/04/22(火) 22:06:29差が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;
}
0650デフォルトの名無しさん
2008/04/22(火) 22:07:280651デフォルトの名無しさん
2008/04/22(火) 22:08:12>>648
0652デフォルトの名無しさん
2008/04/22(火) 22:15:30if(n1<n2-10 || n2+10<n1){
;
else
;
まあどのみちオーバーフロー対策してないがね
0653デフォルトの名無しさん
2008/04/22(火) 22:19:22こうかな?
#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;
}
0654デフォルトの名無しさん
2008/04/22(火) 22:19:39sa = n1 - n2;
if(sa < -10 || sa > 10)
puts("...以上です。");
else
puts("...以下です。");
何かの宿題?
>>651 気を悪くしたら許してくれ。
malloc() free() の関係はできるだけ見通しがいいようにという余計な話をした。
作り手の趣向だから非難してるんではないよ。
0655デフォルトの名無しさん
2008/04/22(火) 22:21:17ども。リロードしてなくて私も送ってしまった。。
0656649
2008/04/22(火) 22:27:01大変参考になりました。
現在C言語の入門書を買って独習している段階でして、
本の中の演習問題が>>649で論理OR演算子を使えという指示でした。
ちょっと解答が思いつかなかったので自分で作れる範囲で作ってみたのですが、
やはり問題文を無視しては解答にはならんだろうw、と質問させて頂きました。
0657デフォルトの名無しさん
2008/04/22(火) 22:33:12独学・・なるほど。ま、がんがんソース書きまくれ。
0658デフォルトの名無しさん
2008/04/22(火) 23:01:56( sa = n1 - n2 ) >= 0 || ( sa = n2 - n1 );
だったりしてw
0659デフォルトの名無しさん
2008/04/22(火) 23:26:35> >>651 気を悪くしたら許してくれ。
> malloc() free() の関係はできるだけ見通しがいいようにという余計な話をした。
> 作り手の趣向だから非難してるんではないよ。
確かにあまりいい設計ではないね。
やむを得ずそうなっちゃうこともあるけど。
0660デフォルトの名無しさん
2008/04/22(火) 23:38:16・関数名にallocなどのキーワードを含めるようにして確保も行なっていることを明示する。
・(freeするだけになってしまうかもしれないが)解放用の関数も用意し、使ってもらう。
0661デフォルトの名無しさん
2008/04/23(水) 00:21:580662デフォルトの名無しさん
2008/04/23(水) 11:44:35わたしは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は同じアドレスのようです。
あとどこを調べてみたらいいでしょう...よろしくお願いします。
長文失礼しました。
0663デフォルトの名無しさん
2008/04/23(水) 12:57:13-fno-common オプションをつけるといいらしい
0664デフォルトの名無しさん
2008/04/23(水) 13:02:31他のソースに実体があることを示したいならexternをつけなさい
そのファイル内でしか使わないことを確実にしたいならstaticをつけなさい
0665デフォルトの名無しさん
2008/04/23(水) 14:39:16$ gcc -fno-common src?.c
/tmp/ccuJF0uA.o:(.bss+0x0): multiple definition of `a'
/tmp/ccU9yxgD.o:(.bss+0x0): first defined here
でました。
このフラグが通常で立ってないということは、
bss領域に割り当てられる変数は、コンパイラ任せにしないでね、
ってことなんでしょうね。
プログラマが管理できてない部分にエラーメッセージもなしっていうのはちょっと怖いですね。
面白かったです。
ldで多重定義をチェックするやりかたも調べてみたいと思います。
ありがとうございました。
0666デフォルトの名無しさん
2008/04/23(水) 16:04:05このオタク野郎
ぼけ
あほ
かす
ニート
日本の恥
0667デフォルトの名無しさん
2008/04/23(水) 16:09:280668デフォルトの名無しさん
2008/04/23(水) 16:19:220669デフォルトの名無しさん
2008/04/23(水) 22:32:13printf("ファイルパス:\n");
fgets(cRet, 512, stdin);
こんな感じで画面上に入力された文字(ファイルパスを想定)を取得した後に
fopenでファイルを開こうと思っているのですが、何度やっても開けずにエラーになります
ファイル自体はちゃんと存在しているファイルなのですが、何が悪いのでしょうか?
0670デフォルトの名無しさん
2008/04/23(水) 22:35:03馬鹿か?それだけだされてわかるわけねーだろwwww
0671デフォルトの名無しさん
2008/04/23(水) 22:38:48errnoを調べる
0672デフォルトの名無しさん
2008/04/23(水) 22:42:24受け付けたcRetには入力したファイル名+改行コードが入ってんじゃね?
0673デフォルトの名無しさん
2008/04/23(水) 22:43:49ttp://oshiete1.goo.ne.jp/qa3311194.html
この辺だろ、多分
0674デフォルトの名無しさん
2008/04/23(水) 22:46:220675デフォルトの名無しさん
2008/04/23(水) 22:47:52末尾の \n を削除しれ
0676デフォルトの名無しさん
2008/04/23(水) 22:49:320677デフォルトの名無しさん
2008/04/23(水) 22:50:100678デフォルトの名無しさん
2008/04/23(水) 22:50:59ありがとうございます
ググったらやり方が載ってたので試してみます
0679デフォルトの名無しさん
2008/04/23(水) 22:51:15むりぽなら別のライブラリで入力を受付ちゃいな。
0680デフォルトの名無しさん
2008/04/23(水) 22:54:280681デフォルトの名無しさん
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);
}
つづく
0682デフォルトの名無しさん
2008/04/24(木) 00:05:05int 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 です。
0683デフォルトの名無しさん
2008/04/24(木) 00:10:140684デフォルトの名無しさん
2008/04/24(木) 00:12:34関数は使用(呼び出し)に先立って宣言する必要があります。
0685682
2008/04/24(木) 00:21:49ググってみたので、
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・・・ とりあえずエラーナンバーでググってきます
0686デフォルトの名無しさん
2008/04/24(木) 00:22:11規格スレで聞いたところ
http://pc11.2ch.net/test/read.cgi/tech/1201153965/133-139
ということだそうです
0687デフォルトの名無しさん
2008/04/24(木) 00:28:45使っている処理系の標準ライブラリーにheapsort関数etcがあるんじゃないですか?
名前を変えてみるとか
0688デフォルトの名無しさん
2008/04/24(木) 00:35:18これはheapsortの使い方がよろしくないし。
>int deletemax(int *A, int n){
>void deletemax(int *A, int n);
プロトタイプと実体は一致してないし。
コンパイラが文句言うのも当然というか。
0689682かつ685
2008/04/24(木) 00:37:28heapsortを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);
}
です。
0691デフォルトの名無しさん
2008/04/24(木) 00:42:46> 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型にして値を戻すように修正する。
0692デフォルトの名無しさん
2008/04/24(木) 00:44:31たぶん結果って言っているわけだから、heapsortはfor文の前段で仕掛けて、
for分の中はA[i]の表示だけで良いような気がするわけ。
0693691
2008/04/24(木) 00:44:54渡すのは
heapsorts(A, i)
とかでよろしく
0694682
2008/04/24(木) 00:52:371番目と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で申し訳ない・・・
0695デフォルトの名無しさん
2008/04/24(木) 01:21:140696デフォルトの名無しさん
2008/04/24(木) 02:04:170697デフォルトの名無しさん
2008/04/24(木) 08:08:30いえ、fclose() されるわけではないので、大丈夫です。
0698デフォルトの名無しさん
2008/04/24(木) 08:28:26行の途中では^zや^dは利かないんじゃないか?
逆に、利いたとしたらストリームが閉じられているわけだから
二度と入力できなくなるぞ。
0699デフォルトの名無しさん
2008/04/24(木) 09:19:29> 改行文字を読み取ったとき、またはファイルの終わりを検出したときに、
> 文字の読取りは終了し、
改行コードまで取り込む性質があるわけだから、入力>改行で終わらせたら
当然改行コードは含まれてしまう。そこで、それを排除して取り込めばおk。
まぁ、やはり手段としてはEOFを入力するのもありだが、別のライブラリを用いては?
0700デフォルトの名無しさん
2008/04/24(木) 09:24:270701デフォルトの名無しさん
2008/04/24(木) 09:43:19ファイル名を渡して処理しチャイナと。
0702デフォルトの名無しさん
2008/04/24(木) 13:32:34わざわざ質問してくださってありがとうございます。
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領域に確保されることを確認しました。
グローバル変数は普通、明示的に初期化して使うものなんでしょうね。
グローバル変数を使う機会が多くないもので知りませんでした。
ありがとうございました。
0703デフォルトの名無しさん
2008/04/24(木) 17:25:19検索してたらこんなん見つけたんだけど
引用元: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がおかしくてできなかった
0704デフォルトの名無しさん
2008/04/24(木) 17:40:45FindWindowExを使えば良いじゃない。
0705デフォルトの名無しさん
2008/04/24(木) 17:44:48「FindWindowがおかしい」
キャプションかクラス名の指定がウンコなんじゃねーの。
0706デフォルトの名無しさん
2008/04/24(木) 18:00:48使い方解説もなにも、
そのEnumProc関数をどこかに作っておいて
>EnumWindows(EnumProc, (LPARAM)pi.dwProcessId);
を実行するだけじゃない?
0707703
2008/04/24(木) 18:08:43hWnd = FindWindow("sample", NULL);
sample.exeはSleep(1000)で無限ループさせてる
hWndが0になってしまうorz
0708デフォルトの名無しさん
2008/04/24(木) 18:21:16プロセスを作ってすぐにFindWindowしても、sample.exeの方はまだCreateWindowを呼ぶ前かもしれないし
WaitForInputIdleとか試してみたらどう
0709デフォルトの名無しさん
2008/04/24(木) 18:24:41sample.exeのキャプションに"sample"が無いんじゃねーの。
Spy++でも使って調べてクラス名でやってみれ。
0710デフォルトの名無しさん
2008/04/24(木) 18:26:590711デフォルトの名無しさん
2008/04/24(木) 18:41:57int *A;
scanf("%d", A[0]); // この時点ば終わっている
貴方はポインターの使い方を全く理解していない。
int iValueBody[256];
int* A = iValueBody;
A の実体が無いのに、そこに値を放り込むなんてダメだよ。
なのでそれ以降はナンセンス。
0712デフォルトの名無しさん
2008/04/24(木) 18:55:130713デフォルトの名無しさん
2008/04/24(木) 19:09:51ありがとう、後でやってみる
>>708
sampleはコンソールアプリなんだ
0714デフォルトの名無しさん
2008/04/24(木) 19:28:00Win32API質問箱 Build65
http://pc11.2ch.net/test/read.cgi/tech/1208847084/
0715デフォルトの名無しさん
2008/04/24(木) 19:36:39そっち行ってみます
0716デフォルトの名無しさん
2008/04/24(木) 19:51:36むむむ。彼の書き込みをみると、n には程よい値が入っていてくれて A はどこかちゃんとしたメモリー空間を示していてくれる・・という、とてつもない期待をしてるんだろうなぁ。(遠い目)
人工知能の C++MiKu とかだったら、希望通りにしてくれるのかもしれない(今は無くとも将来はまんざらでないかも)
0717デフォルトの名無しさん
2008/04/24(木) 19:59:590718デフォルトの名無しさん
2008/04/24(木) 20:50:32引数の渡し方がわからなくてあれだけ書いてるんだから
なんかサンプルみながらやってるんじゃない?
0719デフォルトの名無しさん
2008/04/24(木) 21:58:27(人数は一番最初に入力)
この場合、変数は、int型のweight height の他何が必要でしょうか?
0720デフォルトの名無しさん
2008/04/24(木) 21:59:46プログラムの書き方次第でどうにでもなるから答えようがない。
0721デフォルトの名無しさん
2008/04/24(木) 22:01:41がんばればint型一個でできるよ
0722デフォルトの名無しさん
2008/04/24(木) 22:06:100723デフォルトの名無しさん
2008/04/24(木) 22:06:54置かれるメモリプールとかライフタイムとか
どうであるのが正しいんでしょうか?
例えば以下のコードはありですか?
const char * func()
{
return "AAA";
}
0724デフォルトの名無しさん
2008/04/24(木) 22:08:070725デフォルトの名無しさん
2008/04/24(木) 22:08:28普通にありです。
0726デフォルトの名無しさん
2008/04/24(木) 22:25:05回答ありがとうございました。
実装依存とかだと困るなーと思ってたんですが
そうじゃないんですね。
0727デフォルトの名無しさん
2008/04/24(木) 22:59:24ファイルパスの途中にスペース(C:\Program Filesみたいな)があるとダブルクォーテーションで
括られると思うのですが、これを削る方法はあるのでしょうか?
0728側近中の側近 ◆0351148456
2008/04/24(木) 23:05:22(っ´▽`)っ こういう感じ。
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;
}
0729719
2008/04/24(木) 23:09:08件数分の身長、体重を集計・・・するんですが、
どういう計算処理をすればいいんでしょうか?
0730デフォルトの名無しさん
2008/04/24(木) 23:12:110731デフォルトの名無しさん
2008/04/24(木) 23:15:54VB厨の私ですが感動しました
探して早速明日組んでみます(゚▽゚)
0732デフォルトの名無しさん
2008/04/24(木) 23:15:580733デフォルトの名無しさん
2008/04/24(木) 23:20:080734デフォルトの名無しさん
2008/04/24(木) 23:30:11そういうのを考える事が初めの段階だと思うけど・・
アルゴリズムの本でも買ったらどうだろう
>>730のとおり算数と同じ処理をしてあげればいい
0735デフォルトの名無しさん
2008/04/24(木) 23:33:49[入力用]
int型 人数、1人の身長、1人の体重
[ほか]
int型 身長の合計、体重の合計、ループ用変数
こんなもん
0736デフォルトの名無しさん
2008/04/24(木) 23:39:02ループ{
身長体重入力
ついでに人数カウント
}
合計・平均計算
〜略〜
0737デフォルトの名無しさん
2008/04/24(木) 23:46:08そのEnumWindows()を使う手法はもちろんウィンドウを持つプロセスに対
してしか使えない。
コンソールアプリだとふつうはメッセージを受けとらないから、
TerminateProcess() するしかないんじゃないかな。
0738デフォルトの名無しさん
2008/04/24(木) 23:53:50家にある環境でやってみたらできました(゚▽゚)
if(c2[strlen(c2) - 1] = '"')
c2[strlen(c2) - 1] = '\0';
↓
if(c2[strlen(c2) - 2] = '"')
c2[strlen(c2) - 2] = '\0';
改行コード?分があるようだったので-2にしてみたら綺麗に取れました
ありがとうございますー
0740デフォルトの名無しさん
2008/04/25(金) 00:26:19int 人数、1人の身長、1人の体重
int 身長の合計、体重の合計、ループ用変数
人数 = 入力()
ループ {
1人の身長 = 入力()
1人の体重 = 入力()
身長の合計 += 1人の身長
体重の合計 += 1人の体重
} (ループ用変数が人数になるまで)
結局平均が欲しいのかよくしらないけど、とにかく集計の計算
〜略〜
まとめてみた。できそうじゃないか!
0741デフォルトの名無しさん
2008/04/25(金) 00:51:03c = fgets(data, 200, stdin);
if(c != NULL && data[0] != '\n')
というのを、
char data[200];
if((fgets(data, 200, stdin) != NULL) && data[0] != '\n')
と書いても大丈夫でしょうか。
0742デフォルトの名無しさん
2008/04/25(金) 00:53:370743デフォルトの名無しさん
2008/04/25(金) 00:55:19大きな壁があるけどな
0744TT
2008/04/25(金) 01:37:26内容が「60点以上を合格とし、合格者の平均点を出力する」です
誰かソースを教えて下さいm(_ _)m
0745デフォルトの名無しさん
2008/04/25(金) 01:39:31宿題スレへどうぞ。
いや、どちらかと言えば半年ROMってから出直すことをお勧めしますが。
0746デフォルトの名無しさん
2008/04/25(金) 01:40:48ソースを教えろといわれても、個人の成績のデータの入力仕様がわからないから教えられないだろ。
0747TT
2008/04/25(金) 02:03:320748デフォルトの名無しさん
2008/04/25(金) 02:04:540749デフォルトの名無しさん
2008/04/25(金) 13:40:24どういう型ですか?おもに何に使うのでしょうか?
たぶん数字を代入できると思うのですが・・・
「int」の高度版のような奴でしょうか?
0750デフォルトの名無しさん
2008/04/25(金) 14:16:000751デフォルトの名無しさん
2008/04/25(金) 14:16:27uint8 おそらく8ビット符号なし整数
おもに16ビット/8ビット符号なし整数として使う。
数字を入れてもいいけど、普通は数値を入れるだろうな。
0752デフォルトの名無しさん
2008/04/25(金) 14:48:55人数入力
人数回ループ {
点数入力
60以上なら合計変数へ加算し合格人数+1
60未満ならcontinue
}
合格者合計点÷合格人数を表示
0753デフォルトの名無しさん
2008/04/25(金) 21:06:03resultに入れ、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
これ出来る人いますか?
0754デフォルトの名無しさん
2008/04/25(金) 21:08:06はい、そこらじゅうにあふれています
0755デフォルトの名無しさん
2008/04/25(金) 21:19:02main()
{
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は初めてなので初歩的な勘違いかもしれませんが、解説おねがいします。
0756753
2008/04/25(金) 21:20:060757デフォルトの名無しさん
2008/04/25(金) 21:20:08小数も2進数で表されるんだが、そのときに誤差が出る場合がある。
丸め誤差とかで調べてみ。
0758デフォルトの名無しさん
2008/04/25(金) 21:21:18> 解説おねがいします。
0759デフォルトの名無しさん
2008/04/25(金) 21:24:02宿題スレへいけ
0760デフォルトの名無しさん
2008/04/25(金) 21:27:58十進法と二進法でわずかな誤差が出てるんですね
前者を使うことにします、ありがとうございました。
0761デフォルトの名無しさん
2008/04/25(金) 21:29:03よしちょっとまってろ
0762デフォルトの名無しさん
2008/04/25(金) 21:29:070763デフォルトの名無しさん
2008/04/25(金) 21:29:44> 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)
とかやるんじゃないの?
0764デフォルトの名無しさん
2008/04/25(金) 21:31:51確かに計算結果としてその値ちょうどになることを期待してはいけないけど、
フラグ値として0.0とか-1.0とか仕込むことはありうるわけで
0765デフォルトの名無しさん
2008/04/25(金) 21:33:28カンマとピリオドはともかくとしてや ら ね え よ
ふつうforカウンタに浮動小数点数は使わない
0766デフォルトの名無しさん
2008/04/25(金) 21:37:02for(r=0.1; r<1.0; r+=0.1)
だな
配列の添字などが0スタートなこともあるので、
Cでのループは i=0; i<n; i++ ってな風に書く癖をつけといたほうがいい
0767755
2008/04/25(金) 21:39:52みなさん返答ありがとうございました。
ループ内で、rを式に使いたかったのですが、ループ変数は
整数を使うことにします
0768デフォルトの名無しさん
2008/04/25(金) 21:40:22for文の中身をシンプルにしたほうが読みやすいコードになるし、バグも少なくなる。
0769デフォルトの名無しさん
2008/04/25(金) 21:42:06できたよー
#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;
}
0770デフォルトの名無しさん
2008/04/25(金) 21:49:500771デフォルトの名無しさん
2008/04/25(金) 21:53:10#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;
}
0772756
2008/04/25(金) 21:57:55マジデありがとう!!感謝!!!
0773デフォルトの名無しさん
2008/04/25(金) 22:03:340774デフォルトの名無しさん
2008/04/25(金) 22:07:06わざとか?
0775デフォルトの名無しさん
2008/04/25(金) 22:07:44行末に \ が入るエディタ使うてますな?自分もかつて大学生時代に使ってますたが
東大、京大卒の教授の下で受けていた授業で
0776デフォルトの名無しさん
2008/04/25(金) 22:09:00なんで?理由を求む。自分はそうしないとか、そういうのはという 主観 では
世の人間は理解しないよ。速度を出しすぎても、事故らなきゃ問題のないという
人はいくらでもこの世にいるように。しかし、そんな奴でも目の前に障害物があれば
当然それに応じて回避するなり速度を落とす、さ?
0777デフォルトの名無しさん
2008/04/25(金) 22:09:37756>先生宿題やってきました!
先生>なんだこのソースは。君、解説できるのかね
756>・・・・・・・・・・・・
先生>またどこかで拾ってきたソースだろう。減点だ、減点。
0778デフォルトの名無しさん
2008/04/25(金) 22:17:05お前は一体何をw
0779デフォルトの名無しさん
2008/04/25(金) 22:20:29コーディングスタイルというのは共有化された主観だからな
違和感をもたれた時点で好ましくない
0780デフォルトの名無しさん
2008/04/25(金) 22:25:300781デフォルトの名無しさん
2008/04/25(金) 22:30:59これが見えない人に何言ってもムダw
0782デフォルトの名無しさん
2008/04/25(金) 22:43:02> 違和感をもたれた時点で好ましくない
はい、でました、それがお前の 主観 に過ぎないってことだよ。
お前、この世に自分以外の人間が何人いるとでも?
渦中の国民でも世界の人口の6分の1、10億人だよ?
世界全体で60億人。お前はその中の 1人 に過ぎない。
そのくせ、主観で否定して良いとでも思ってんのか?
全員が通している コンパイラ様 が良いつってんのに?w
0783デフォルトの名無しさん
2008/04/25(金) 22:44:20それもわざとなんじゃないか?
0784デフォルトの名無しさん
2008/04/25(金) 22:45:44コンピュータの基本的な仕組みは共通でも、そのシステムは
基本構造を人間が都合よく定義や規定(標準化)を決めて作っているわけだ。
その定義や規定に則って、俺らはコードを書いてプログラミングをしているわけだ。
そのコンパイル様に、これでええか?ええのんか?なぁ、もっとこうしたらええか?
それはあかんか?なんていちいちご機嫌を伺うのか?良いなら良い、ダメならダメ
そうとしか言ってくれませんよ、脳みそこねこねコンパイルは。
0785デフォルトの名無しさん
2008/04/25(金) 22:46:51ループ {
}
ループ
{
}
ループ { }
いろんな人でてくるだろ
人が書いたコードを読んで理解する力も必要だと思うけどな
0786デフォルトの名無しさん
2008/04/25(金) 22:56:40違和感は良いとして、それが否定できるものではなかろう。
そんなこといったら、貧乏人は一生金持ちから理解されないだろうね。
だから共通した ルール に基づいて通れば良いんだよ。
ホリ○モンみたく、小賢しいけど誤魔化しで通そうとすると、後で
まともに動作しないプログラムが出来て、多くの人から理解されないだろうけどなw
0787デフォルトの名無しさん
2008/04/25(金) 22:59:39頭おかしいだろw
0788デフォルトの名無しさん
2008/04/25(金) 23:02:30思想や人種、生活スタイルは様々でも同じコンパイラ、プログラム言語にて
通用するものであればなんら問題はないわけだ。所詮自分なんてこの世の
一人に過ぎない。この世は自分一人だけの都合や、一人の力では
成り立ってもいなければ動いてはいませんよ、よほどのVIPでない限り。
たとえVIPでも、地球の運命までは変えられんよ。より多くの人の行動によって
社会、歴史は動いてきたのだから。戦争にしても、ね。
0789デフォルトの名無しさん
2008/04/25(金) 23:03:260790デフォルトの名無しさん
2008/04/25(金) 23:04:460791デフォルトの名無しさん
2008/04/25(金) 23:10:31常識のない人間に関わるのは時間の無駄だ
0792デフォルトの名無しさん
2008/04/25(金) 23:22:04成績を見せてから言えよw
0793デフォルトの名無しさん
2008/04/25(金) 23:23:490794デフォルトの名無しさん
2008/04/25(金) 23:29:20わかった気になっているお前の方が知ったかぶりってことだw
0795デフォルトの名無しさん
2008/04/25(金) 23:30:49意味不明。お前が説明しろ。ちなみに、マクロを改行して記述した場合どうなるか?
お前が分かってないみたいだな。
0796デフォルトの名無しさん
2008/04/25(金) 23:33:40>>756が減点サレルノダヨ
0797デフォルトの名無しさん
2008/04/25(金) 23:33:410798デフォルトの名無しさん
2008/04/25(金) 23:38:09793 名前:デフォルトの名無しさん 投稿日:2008/04/25(金) 23:23:49
マクロ内での\の意味すらわかってないヤツがなに言ってもな……
↑分かった振りをして誤魔化す馬鹿。あれは改行していないのに
あるエディタにて、あのように行末に表示されるものがあるんだよ
それをコピペしたというのは、使っている人なら普通に分かる。
0799デフォルトの名無しさん
2008/04/25(金) 23:39:36>>775
お前は一体何をw
↑ほらな、茶化すだけで 説明 すらしない。知ったかぶりってのはこういうことを言うんだよ。
知っている人は普通に知っている。こいつはあのマクロを特殊だと思ったんだろうねw
マクロの中に \ あのように入る意味があると思っているんだろうねw
0800デフォルトの名無しさん
2008/04/25(金) 23:41:52エディタの種類とか関係ない。
0801デフォルトの名無しさん
2008/04/25(金) 23:43:22自分がだめだしした 理由 を述べない卑怯者。
こんな奴は、一生他人から理解されないまま干されて孤立するだろうね。
一方、理由が分かっている人は、理屈や現実的な話をして
相手を理解させることが出来る。だいたい、事実無根か真実かは
本人が体験すれば一番分かることだから。
0802デフォルトの名無しさん
2008/04/25(金) 23:49:160803デフォルトの名無しさん
2008/04/25(金) 23:50:07とりあえず、これをコンパイルしてみろ。話はそれからだ。
gdgdそんなのはと、主観しか言わない奴は論外。
お前が作ったコンパイラでもC言語でもないだろw
0804デフォルトの名無しさん
2008/04/25(金) 23:50:280805デフォルトの名無しさん
2008/04/26(土) 00:01:39必死に粗探しをするかのごとく始め、勝手な自分基準で相手が分かってないということにして
相手のすべてを否定しようとする姑息な手段をとる
卑怯者の常套手段だな。そんなの、一定以上の人生経験を積み重ねた人に
通用するわけねーだろ、JK
0806デフォルトの名無しさん
2008/04/26(土) 00:01:49おいそこのお前コテハン付けろよ
0807デフォルトの名無しさん
2008/04/26(土) 00:03:280808側近中の側近 ◆0351148456
2008/04/26(土) 00:04:21マクロの中の\は意味があると思うよ。
改行コード\nを無効化しないといけない。
っていうか、釣られてますな・・・
0809デフォルトの名無しさん
2008/04/26(土) 00:04:30大学で卒業までにC++でオリジナルカードゲームを作ろうと思っています(複雑さはUNOぐらいです)。
特徴は、
・見た目は、Windowsに入っているソリティアの様な感じ
・CPU戦ではなく、一対一でオンライン対戦
・マッチングは考えず、とにかく二つのPCで対戦出来れば良い
といった感じです。
そこで、これを作るのに必要だと思われる開発環境を教えて頂けないでしょうか?
現在あるのはCのコンパイラとCPADのみです。
オンラインや見た目の部分で他にも色々と必要だと思うのですが・・・。
ちなみにプログラムの腕は黒い画面で○×ゲームが作れるぐらいです(現在大学2年)。
0810デフォルトの名無しさん
2008/04/26(土) 00:06:170811デフォルトの名無しさん
2008/04/26(土) 00:07:46マクロの \ に何の意味があるんだ?その前に改行したのをコンパイルしてみろよ?
0812側近中の側近 ◆0351148456
2008/04/26(土) 00:09:49(っ´▽`)っ
コンパイルエラー出ると思うよ・・・
ねとすた見るから後でな
0813デフォルトの名無しさん
2008/04/26(土) 00:12:440814デフォルトの名無しさん
2008/04/26(土) 00:13:25>マクロの \ にry
先生!この人おかしいです!
0815デフォルトの名無しさん
2008/04/26(土) 00:15:29マクロで改行する場合は末尾に \ がいる
これでいいか?顔真っ赤な人久しぶりに見たわ
0816デフォルトの名無しさん
2008/04/26(土) 00:25:17ここまでいくと、重症だよな。絶対にこいつは説明が出来ないよ。
コンパイラを無視して主張しても無駄ってことだから。
0817デフォルトの名無しさん
2008/04/26(土) 00:27:040818デフォルトの名無しさん
2008/04/26(土) 00:27:39あくまでも コンパイラが通す かどうか、だぞ。
処理結果の内容については話は別。言っただろ?
ルールに基づいていれば良いと。しかし、それがどういう結果を招くか?は
そいつ次第。
0819デフォルトの名無しさん
2008/04/26(土) 00:31:060820デフォルトの名無しさん
2008/04/26(土) 00:34:39あの、自信過剰で人生うまくいくと思いますか・・・
>マクロの \ に何の意味があるんだ?その前に改行したのをコンパイルしてみろよ?
>あくまでも コンパイラが通す かどうか、だぞ。
通さないから\がいる
頭痛ぇ〜コイツ
0821デフォルトの名無しさん
2008/04/26(土) 00:38:18ちっとも成長しないからな……
0822デフォルトの名無しさん
2008/04/26(土) 00:42:03って空気読まずに書いてみる。
0823デフォルトの名無しさん
2008/04/26(土) 00:44:440824デフォルトの名無しさん
2008/04/26(土) 00:57:26ぷっ コンパイルしてからモノを言え、基地外
0825デフォルトの名無しさん
2008/04/26(土) 00:59:31おもしろいゲームにするためのルールを考える方が先だ
その他のものは後からどうにでもなる
0826デフォルトの名無しさん
2008/04/26(土) 01:01:480827デフォルトの名無しさん
2008/04/26(土) 01:03:180828デフォルトの名無しさん
2008/04/26(土) 01:06:530829デフォルトの名無しさん
2008/04/26(土) 01:24:35おまえら暇ですね
0830デフォルトの名無しさん
2008/04/26(土) 01:43:26スレ違いだけどグローバルなマクロに見えるからここらに書いてくれた方が読みやすいと思った
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;
0831デフォルトの名無しさん
2008/04/26(土) 01:50:09コンパイラの次元で十進数扱いは COBOL 位しか思い浮かばない。
C++ とかなら BCD パッケージで十進演算を取り入れられるけど・・・
そんなことより整数なら十進数と二進数に誤差は無いのだからその特性を使うのがいいのでは。
二進数の少数は 1 -> 0.5 -> 0.25 -> 0.125 -> 0.0625 ...
というのを組み合わせて 0.75 = (0.5 + 0.25) ぴったしみたい以外もあるわけだから気をつけないとね。
0832デフォルトの名無しさん
2008/04/26(土) 02:31:56WindowsアプリをつくりたいのならVisualStudioかさもなきゃC++Builderを買っとくのが普通
もちろんAPI/SDKを駆使してできないわけじゃないけどそこまで苦労する意味はあんまりないからな
0833デフォルトの名無しさん
2008/04/26(土) 02:45:14その課題、問題がなんで出たか?って話では?
そういうコードを見せて、何でこうなるのか?理由を考察せよとか。
説明されているように、2進法では2^-nを用いて、小数点以下は
精度の範囲内で表されていると。
0834デフォルトの名無しさん
2008/04/26(土) 03:26:510835デフォルトの名無しさん
2008/04/26(土) 05:02:05宿題スレから消えたと思ったら、こんどはここですか?
0836デフォルトの名無しさん
2008/04/26(土) 07:16:34どっかのヘッダファイルに
typedef unsigned short uint16;
typedef unsigned char uint8;
と書いてあると思う。
つまり、unsigned short/unsigned charと同じだが、
作成者は>>751のような意味を持たせてると思う。
0837デフォルトの名無しさん
2008/04/26(土) 09:21:27宿題スレから消えたと思ったら、こんどはここですか?
0838デフォルトの名無しさん
2008/04/26(土) 09:23:08っつか、誰かと勘違いしてんだろ、お前。自ら粘着基地外って
自己紹介、アピールしなくて良いから、下らない主張をしてないで黙ってろよ
0839デフォルトの名無しさん
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;
}
オーバーフロー起こしたりしているので、正常では無いにしろ計算部分に飛んではいると思うのですが、
どこに問題があるのでしょうか?ご教示願います。
0840デフォルトの名無しさん
2008/04/26(土) 09:40:06rate の初期化
0841デフォルトの名無しさん
2008/04/26(土) 09:40:38特に必要がない限り、float型を使うのはやめましょう。
そして、scanf()のフォーマットは"%lf"にすべき。
"%lg"でもいいけれど、"%g"は間違い。
0842デフォルトの名無しさん
2008/04/26(土) 10:21:47言い負けした粘着乙。そんなに東大、京大卒の教授の下で指導を受けた元生徒のことが
妬ましくて、言い負けして悔しいのぅ悔しいのぅ?
0843側近中の側近 ◆0351148456
2008/04/26(土) 11:10:140844デフォルトの名無しさん
2008/04/26(土) 11:33:340845デフォルトの名無しさん
2008/04/26(土) 11:46:00マイクロソフトのホームページからダウンロードできると聞いたのですが、
どうすればいいですか?
0846デフォルトの名無しさん
2008/04/26(土) 11:52:010847デフォルトの名無しさん
2008/04/26(土) 11:56:12http://www.microsoft.com/japan/msdn/vstudio/express/
0848デフォルトの名無しさん
2008/04/26(土) 12:49:28ありがとうございます。
家に帰ったらすぐやってみます。
0849デフォルトの名無しさん
2008/04/26(土) 13:35:51以下は自分で考えたコード
float d = 0;
*(int*)(&d) |= 0x80000000;
if((*(int*)(&d)) & 0x80000000)
{
printf("-");
}
*(int*)(&d) &= ~(0x80000000);
printf("%.4f\n", d);
0850デフォルトの名無しさん
2008/04/26(土) 13:40:48それは、おもいっきり環境依存の書き方だと思われ。
0851デフォルトの名無しさん
2008/04/26(土) 13:41:46どこが環境依存なのかくわしく教えてください
0852デフォルトの名無しさん
2008/04/26(土) 13:45:09だいぶ説明不足みたいなんで補足します。
浮動小数点少数型の表現はIEEE 754に限定します。
環境に依存したくないのは
printf("%.4f\n", d);
の部分だけです。すいません。
-0.0000のときに0.0000と表示されるのを避ける方法を教えてください。
0853デフォルトの名無しさん
2008/04/26(土) 13:45:26おいちゃんがきんもぉ〜★なソースで示しちゃうYO!
printf("%.4f\n", d*-1);
0854デフォルトの名無しさん
2008/04/26(土) 13:47:14それだと
0.0000 -> 0.0000
-0.0000 -> 0.0000
と表示されてしまいます。
必要なのは
0.0000 -> 0.0000
-0.0000 -> -0.0000
と表示する方法です。
0855デフォルトの名無しさん
2008/04/26(土) 13:48:180856デフォルトの名無しさん
2008/04/26(土) 13:50:46おいちゃんが詰まらんことをするYO!
0857デフォルトの名無しさん
2008/04/26(土) 13:50:54C99なら、変数でも指定できるらしいよ。
0858デフォルトの名無しさん
2008/04/26(土) 13:51:410859デフォルトの名無しさん
2008/04/26(土) 13:51:48コンパイル時に解決できる式でもおk
0860デフォルトの名無しさん
2008/04/26(土) 13:57:35ありがと。
でもMSのVC++はC99対応じゃないんだね。
0861デフォルトの名無しさん
2008/04/26(土) 13:57:38ちょっと綺麗になったけど、まだ何とかなりそうな気がします。
>>849
float d = -0.0;
if((*(int*)(&d)) & 0x80000000)
{
printf("-");
}
printf("%.4f\n", fabs(d));
さらにエレガントな方法を教えてください
0862デフォルトの名無しさん
2008/04/26(土) 13:59:450863デフォルトの名無しさん
2008/04/26(土) 14:01:50sprintfしたあとその条件を使って頭に-つけるかつけないか操作すればいいんじゃない
0864デフォルトの名無しさん
2008/04/26(土) 14:01:54VC++なら、vectorとか使えばいいのに。
0865デフォルトの名無しさん
2008/04/26(土) 14:03:02-0.000001を%.4fで出力した場合、出力結果が-0.0000になるものと
0.0000になるものがあります。
0867デフォルトの名無しさん
2008/04/26(土) 14:04:460868デフォルトの名無しさん
2008/04/26(土) 14:09:56それって、表示云々よりも環境によって本来は0以下の値だったものが
情報が失われて0と等価にされてしまった場合によるものだろうし
環境によると言えばよるけど、変数には0として値が入っているわけだから
気にしてもしゃーないべ。より厳密にというなら、doubleで、doubleでも
精度によるけどさ、floatよりはってことで。
0869デフォルトの名無しさん
2008/04/26(土) 14:16:30説明不足ですまそ。
入力文字列"-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()を何度も呼び出す余裕もない。
0870デフォルトの名無しさん
2008/04/26(土) 14:37:40printfをラップするのがスマートかな
0871デフォルトの名無しさん
2008/04/26(土) 14:45:500872デフォルトの名無しさん
2008/04/26(土) 14:47:56cygwinだと-0.0
mingwだと0.0
atof()の仕様と矛盾してるmingw側がおかしいとおもわれ
0873デフォルトの名無しさん
2008/04/26(土) 16:05:07調べてみるけど、他の文字列化関数探した方が良いかもな
0874デフォルトの名無しさん
2008/04/26(土) 16:12:08>>872
> atof()の仕様と矛盾してるmingw側がおかしいとおもわれ
規格のどこにそんな仕様が書いてある?
JIS の atof 見ると strtod を見ろと書いてあって, strtod の脚注には
以下の記述がある.
「浮動小数点傘寿値が符合付き0をサポートしている場合, 関数は0の符合を
正しく処理することができる」
要するに mingw が符合付き0をサポートしてないだけじゃないのか?
0875デフォルトの名無しさん
2008/04/26(土) 16:17:280876デフォルトの名無しさん
2008/04/26(土) 16:31:57ただ, 規格的には無問題だろうと言いたかっただけ
0877デフォルトの名無しさん
2008/04/26(土) 16:32:06const intだろうと怒られなかった?c89規格
0878デフォルトの名無しさん
2008/04/26(土) 16:35:320879デフォルトの名無しさん
2008/04/26(土) 16:36:30int a[1 + 3]; とかいう意味だろ
0880デフォルトの名無しさん
2008/04/26(土) 16:37:390881デフォルトの名無しさん
2008/04/26(土) 16:41:35int main(int argc, char* argv[])
{
char sz[argc];
printf("sizeof(sz) = %lu¥n", sizeof(sz));
return 0;
}
これが gcc -std=c89 -Wallで警告なしでビルドできて、結果もvariableなんだけどそんなもん?
0882デフォルトの名無しさん
2008/04/26(土) 16:48:20{
double b = 3.345;
printf("%lf", b);
return 0;
}
みたいなもんなんだろう
0883デフォルトの名無しさん
2008/04/26(土) 16:52:43bccじゃ無理
0884デフォルトの名無しさん
2008/04/26(土) 16:55:31gcc 4.0.1 だが
main.c: In function ‘main’:
main.c:4: warning: ISO C90 forbids variable-size array ‘sz’
とか出てきたけど?
バージョンはいくらだ?
0885デフォルトの名無しさん
2008/04/26(土) 16:56:32-pedantic ないと警告出ないのね。
0886881
2008/04/26(土) 16:58:09bccは厳密なのかもね。
>>884
gcc version 4.0.1 (Apple Inc. build 5478)
ちなみに-pedantic付けたら同じ警告が出た。
まあでも警告レベルってことは、gccはvariable-size arrayに関してISO C90 compliantじゃないってことなのかな。
0887881
2008/04/26(土) 16:58:510888デフォルトの名無しさん
2008/04/26(土) 17:08:45そもそも可変長配列が規格に入ったのはISO C99。
BCCはC99に対応していないからエラーになるのだし、
gcc -pedanticでエラーになるのもC90モードだから。
gcc -std=c99 -pedanticならエラーなくコンパイル・実行できる。
0889881
2008/04/26(土) 17:13:32>>886はC99がどうとかじゃなくて、>>886はgccのISO C90への準拠度について
。
gcc -std=c89 -pedanticではエラーじゃなくて「警告」が出るんだよ。
ISO C90モードならエラーにならないとおかしいから、>>886って書いた。
0890デフォルトの名無しさん
2008/04/26(土) 17:17:28そういうことか、すまん。
エラーにしたければ-pedantic-errors使えばいい。
0891デフォルトの名無しさん
2008/04/26(土) 20:28:11mingwでもatof()は-0.0を正しく処理できる
atof()が-0.0を認識するのにprintf()では-0.0を認識しないのに納得いかないんだ
仕様という言葉を使ったのは軽率だったかと思う
規格には関係なく、-0.0を出力する方法を知りたい。
0892デフォルトの名無しさん
2008/04/26(土) 20:50:57仕様 ということに しよう
0893デフォルトの名無しさん
2008/04/26(土) 21:00:46いや、値はちゃんと-0.0として格納されてんだよ。
ソフトの仕様も-0.0を出力で納得できる。
なのになんでオレの処理系は0.0を出力しやがるんだ、このアホ処理系め〜!
0894デフォルトの名無しさん
2008/04/26(土) 21:03:470895デフォルトの名無しさん
2008/04/26(土) 21:05:04そう考えれば-0を0と出力する処理系があるのも仕方ない気がする。
0896デフォルトの名無しさん
2008/04/26(土) 21:07:01-0の妥当性なんてどうでもいいんだ。
とにかく、入力(メタセコとか言うソフトらしい)の書式にあわせた出力をしなけりゃならん
0897デフォルトの名無しさん
2008/04/26(土) 21:10:170898デフォルトの名無しさん
2008/04/26(土) 21:11:53それじゃ、符号なんてどうでも良いじゃんwwwww
第一、0より大きいか小さいか、そういう値ではなく単純に0なんだから。
そういう表示がされるからって、いちいち気にするような神経質だと
早く禿げるぞ。もっと気楽にいけや、な?
君は、年中気温が熱い土地で、北極や南極のような極寒を求めるのかい?
0899デフォルトの名無しさん
2008/04/26(土) 21:23:37例えば-1e-10を"%f"で出力するときに-0.000000"にしたいってことか?
mingwのprintf()はAPI由来なのかな?
それが嫌ならcygwinのprintf()を使えばいいじゃん。
0900デフォルトの名無しさん
2008/04/26(土) 21:26:020901デフォルトの名無しさん
2008/04/26(土) 21:27:02>>861で自己解決してるじゃねーか、
printfの問題はサポートにでもメールを出せ。
0902900
2008/04/26(土) 21:27:500903デフォルトの名無しさん
2008/04/26(土) 21:36:420904デフォルトの名無しさん
2008/04/26(土) 21:39:080905デフォルトの名無しさん
2008/04/26(土) 23:56:580906デフォルトの名無しさん
2008/04/27(日) 00:15:420907デフォルトの名無しさん
2008/04/27(日) 08:59:360908デフォルトの名無しさん
2008/04/27(日) 10:45:140909デフォルトの名無しさん
2008/04/27(日) 12:30:01int *pi;
pi = (int *)calloc(5, sizeof(int));
と
pi = (int *)malloc(sizeof(int) * 5);
で、それぞれ確保された領域に値を代入すると双方とも
*(pi + 0),*(pi + 1),*(pi + 2),*(pi + 3)・・・・
で参照できると思うんですが
callocもmallocも同じように使っても問題ないんですか?
まだ勉強始めたばかりなので間違った認識をしているのかもしれませんが
どういうときに使い分けるのか良く分かりません。
0910デフォルトの名無しさん
2008/04/27(日) 12:41:44勝手にゼロクリアする分の処理がまるまる無駄になることも少なくないし。
0911デフォルトの名無しさん
2008/04/27(日) 13:10:22malloc → ゼロクリアが必要でないときに使う
特にゼロクリアが必要なくても
その処理が邪魔じゃなければ calloc 使っても別に構わない。
0912デフォルトの名無しさん
2008/04/27(日) 13:16:560913デフォルトの名無しさん
2008/04/27(日) 13:38:46float d = -0.0;
printf("%.*s%.4f\n", (((*(int*)(&d)) & 0x80000000) ? 1 : 0), "-", fabs(d));
これでどうだ?
0914デフォルトの名無しさん
2008/04/27(日) 14:14:18出来ればBorlandCの解説サイトがありがたいです
0915デフォルトの名無しさん
2008/04/27(日) 14:18:17まあ気にしない事にしておこう。
0916デフォルトの名無しさん
2008/04/27(日) 14:22:53大学の講義で推奨されたのでBorlandCをインストールしようと思ったのですが
0917デフォルトの名無しさん
2008/04/27(日) 14:27:060918デフォルトの名無しさん
2008/04/27(日) 14:38:17そのコンパイラ特有の癖を知る事は出来るが、
それ以上得る所は無いどころか
間違ったものを C++ 仕様だと勘違いしてしまう恐れがある。
仕事でずっと Borland C を使うつもりなら別にそれもいいかもしれないが、
まずそんな職場は無い。
0919デフォルトの名無しさん
2008/04/27(日) 14:45:35将来役立てるためにVC++ Express Editionをインストールします
ありがとうございました
0920デフォルトの名無しさん
2008/04/27(日) 14:51:360921デフォルトの名無しさん
2008/04/27(日) 14:56:05規格票読んで分かって使えば無問題
レトロかつマイナーなCPUに至っては未だにK&R敷かない場合もある
0922デフォルトの名無しさん
2008/04/27(日) 15:01:520923デフォルトの名無しさん
2008/04/27(日) 15:18:000924デフォルトの名無しさん
2008/04/27(日) 15:18:50あとはそのうち C++ やりたいと思った時とか。
0925デフォルトの名無しさん
2008/04/27(日) 15:31:480926デフォルトの名無しさん
2008/04/27(日) 15:33:51Microsoft Visual C 2008 Express Editionみたいなんはないの?
C++はまだやってないからCで使いたいんだ
0927デフォルトの名無しさん
2008/04/27(日) 15:37:20Microsoft Visual C++ 2008 Express EditionはC/C++が使える
0928デフォルトの名無しさん
2008/04/27(日) 15:41:18無料の奴じゃないならいいけど
無料の奴は古い
0929デフォルトの名無しさん
2008/04/27(日) 15:44:592003 年より前に出た奴は古いと思っていい。
0930デフォルトの名無しさん
2008/04/27(日) 19:13:19だと┌┐┘└って表示できるのに
char kigou1 ;
kigou1 ='┌';
printf(kigou1);
だとτとか・みたいなのが表示されるのはどうしてですか?
変数を通して┌┐┘└こういう文字を表示させるにはどうすればいいの?
0931デフォルトの名無しさん
2008/04/27(日) 19:14:10文字列使う。
0932デフォルトの名無しさん
2008/04/27(日) 19:17:18str = "┌";
printf(str);
0933デフォルトの名無しさん
2008/04/27(日) 19:17:270934デフォルトの名無しさん
2008/04/27(日) 19:19:00これはひどい・・・
0935デフォルトの名無しさん
2008/04/27(日) 19:21:320936デフォルトの名無しさん
2008/04/27(日) 19:21:47おまえは多分勘違いしてるな・・・
0937デフォルトの名無しさん
2008/04/27(日) 19:23:110938デフォルトの名無しさん
2008/04/27(日) 19:27:520939デフォルトの名無しさん
2008/04/27(日) 19:28:160940デフォルトの名無しさん
2008/04/27(日) 19:28:260941デフォルトの名無しさん
2008/04/27(日) 19:29:340942デフォルトの名無しさん
2008/04/27(日) 19:30:550943デフォルトの名無しさん
2008/04/27(日) 19:32:00・ 文字列へのポインタを直接 printf に入れるのは、
その文字列が % を含んでるかもしれないので危険。
必ず %s を使って表示する。
とりあえずこの辺は気になった。
0944デフォルトの名無しさん
2008/04/27(日) 19:38:240945デフォルトの名無しさん
2008/04/27(日) 19:46:28static const char const *str = "┌"
printf("%s", str);
0946デフォルトの名無しさん
2008/04/27(日) 19:48:570947デフォルトの名無しさん
2008/04/27(日) 19:49:080948デフォルトの名無しさん
2008/04/27(日) 20:18:07だな
0949デフォルトの名無しさん
2008/04/27(日) 21:02:070950デフォルトの名無しさん
2008/04/28(月) 02:13:56「#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のトコに戻るようにしたいんですが
どうやったらいいか皆目見当つきません、助けてください
0951デフォルトの名無しさん
2008/04/28(月) 02:17:17scanf("%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);
0952デフォルトの名無しさん
2008/04/28(月) 02:31:03scanf("%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;
}
0953デフォルトの名無しさん
2008/04/28(月) 02:32:08>>952
d の初期化が必要だよ
0954951
2008/04/28(月) 02:34:16do {
scanf("%d",&a);
↓
do {
d = 0;
scanf("%d",&a);
0956デフォルトの名無しさん
2008/04/28(月) 09:50:24幅2ドットと幅8ドットの線分を描け!
三角形、四角形、5角形のポリゴンを描け!
この質問ってこのスレでいいの?
0957デフォルトの名無しさん
2008/04/28(月) 09:57:00マルチ
0958デフォルトの名無しさん
2008/04/28(月) 10:11:27vfwscanfかこの関数と同等の機能を持つ関数を使いたいんですが、どうすれば使えるようになりますか?
開発環境は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;
}
0959デフォルトの名無しさん
2008/04/28(月) 13:29:15?には6000が入ります
このプログラムはどう書けばいいですか?
C言語なのでこっちで質問します。お願いします
0960デフォルトの名無しさん
2008/04/28(月) 14:08:300961デフォルトの名無しさん
2008/04/28(月) 14:09:166000が抜きたいなら数値なら剰余でもいいし
文字列ならそのまま抜いて数値にすればいい
そもそも6000/2って余りないよな・・・
0962デフォルトの名無しさん
2008/04/28(月) 17:02:21printfとかでファイルにデータを書き込んだ場合、printf命令が戻った地点で
ファイルの書き込みは完了していると考えていいんでしょうか?
後ろでOSがゆっくり書いてたりするのかな…と。
スレチだったらすみません。
0963デフォルトの名無しさん
2008/04/28(月) 17:02:410964デフォルトの名無しさん
2008/04/28(月) 17:07:31fprintf()から戻った時点では、バッファに書かれているだけでファイルに書きに行ってないかもしれません。
確実に書き込むには、バッファをフラッシュする必要があります。
# 尤も、その段階で本当にファイルに出力されているかどうかはOSやデバイスに依存します。
0965デフォルトの名無しさん
2008/04/28(月) 17:18:250966デフォルトの名無しさん
2008/04/28(月) 17:27:19いえ、何も。
0967デフォルトの名無しさん
2008/04/28(月) 18:24:10この中のどれをダウンロードすればいいですか?
0968デフォルトの名無しさん
2008/04/28(月) 18:24:39好きなのを選ぶが良い
0969デフォルトの名無しさん
2008/04/28(月) 18:27:41どうやって使えばいいかよくわかりません。
0970デフォルトの名無しさん
2008/04/28(月) 18:31:19仮想CD/DVDドライブにぶちこむか、DVD-Rにでも焼いて使うが良い
0971デフォルトの名無しさん
2008/04/28(月) 19:57:39無料で作れて実行できるフリーのソフトはないでしょうか?
できたらVB等も教えてください
0972デフォルトの名無しさん
2008/04/28(月) 20:01:23Microsoft Visual Basic Express Edition
0973デフォルトの名無しさん
2008/04/28(月) 20:02:580974デフォルトの名無しさん
2008/04/28(月) 23:08:31C言語の入門者向け解説スレです。
・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/
0975デフォルトの名無しさん
2008/04/28(月) 23:35:01fflush( FILE* );
0976デフォルトの名無しさん
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;
}
0977デフォルトの名無しさん
2008/04/29(火) 00:00:26i = 2;
while(i <= no){
printf("%d ", i);
i *= 2;
}
でどうだろうか。intでは値の範囲が狭すぎるかもしれないが。
0978デフォルトの名無しさん
2008/04/29(火) 00:03:37for(i=2;i<=no;i*=2) printf("%d", i);
0979デフォルトの名無しさん
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
0980デフォルトの名無しさん
2008/04/29(火) 00:07:54ありがとうございます。
今日読んだインクリメントに固執しすぎました。
同じ結果を出すのにも色々な書き方があって大変参考になります。
後、intでは範囲が狭いとの事ですが
今のところ参考書がそこまでたどり着いていないので、
とりあえずはソースを書いて慣れることを目標としています。
0981979
2008/04/29(火) 00:11:07分からない。ブロック内でvalue2に40を代入したのでブロック内の
実行結果が40になるのはわかるけど。
ブロック外まで代入された40は引き継がれるのでしょうか?
グローバル変数ではないですよね。
最後のvalue2が20なら納得できるのですが。
教えてください
0982デフォルトの名無しさん
2008/04/29(火) 00:12:320983デフォルトの名無しさん
2008/04/29(火) 00:15:21#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;
}
0984デフォルトの名無しさん
2008/04/29(火) 00:19:40ああ、そうですか。宣言しなければ、ブロックの垣根を越えて
持ち越されるのですね。
さっきブロック内で新たにvalue2を宣言したら、持ち越されませんでした。
ありがとうございました
0985デフォルトの名無しさん
2008/04/29(火) 02:33:54と同じような動作する関数って何ですか?
0986デフォルトの名無しさん
2008/04/29(火) 02:34:57標準関数にはないよ。
0987デフォルトの名無しさん
2008/04/29(火) 02:43:51ありがとう、APIスレにでも行ってみます
0988デフォルトの名無しさん
2008/04/29(火) 16:30:07http://pc11.2ch.net/test/read.cgi/tech/1209429897/
0989デフォルトの名無しさん
2008/04/29(火) 23:58:26int 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を使わずにスマートに書き換えられますか?
0990デフォルトの名無しさん
2008/04/30(水) 00:01:300991デフォルトの名無しさん
2008/04/30(水) 00:04:18C++ なら setfill でうまいことできるんだがなあ。
0992デフォルトの名無しさん
2008/04/30(水) 00:06:57puts( str + strlen( str ) - ln );
あんま考えずに書いたけど、イメージはこんな感じで。
大きな入力きたらOUTだけど・・・
0993デフォルトの名無しさん
2008/04/30(水) 00:09:16for(j=i; j<=ln; j++)
0994デフォルトの名無しさん
2008/04/30(水) 00:09:28for(j=1;j<=i;j++){
putchar('*');
}
putchar('\n');
}
0995デフォルトの名無しさん
2008/04/30(水) 00:11:52{
for( ; ln > 0; ln--)
{
for(k = 0; k < ln; k++)
putchar('*');
putchar('¥n');
}
}
0996デフォルトの名無しさん
2008/04/30(水) 00:12:21for(i = 1; n; i++){ printf("*"); if(i % n == 0){ printf("\n"), n--; i = 0; } }
こんな感じでどう?
0997デフォルトの名無しさん
2008/04/30(水) 00:14:42質問主は何が知りたいのか判らんが・・・
0998デフォルトの名無しさん
2008/04/30(水) 00:21:12自分の基本的な数学の力の無さが浮き彫りになるっつーか、
閃きが出来ないっつーか…
>>997
やっぱりソースは出来るだけ簡素な方がいいのかと思いまして質問しました。
0999デフォルトの名無しさん
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:0510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。