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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。

前スレ
C言語なら俺に聞け(入門篇) ぱぁと2〜
http://pc8.2ch.net/test/read.cgi/tech/1153818463/

過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/


関連スレ
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/
2デフォルトの名無しさん:2006/10/13(金) 05:02:54
ずるしてらくしてかれいに2げっとかしらかしら〜
3デフォルトの名無しさん:2006/10/13(金) 05:09:44
鮮やかに3げっと
4デフォルトの名無しさん:2006/10/13(金) 07:39:31
最初に配列に初期値を格納しておき、その値に達するまでの辞書式順序を守った配列の値を格納し、
順次表示していきたいのですがどうすればいいでしょうか。

例えば、
array[3] = {3, 4, 1};

ならば、実行結果として

0, 0, 0
0, 0, 1
0, 1, 0
  :
0, 4, 1
1, 0, 0
  :
3, 4, 1

といった具合です。
5デフォルトの名無しさん:2006/10/13(金) 08:10:14
宿題は、
6デフォルトの名無しさん:2006/10/13(金) 11:55:17
宿題は?
7デフォルトの名無しさん:2006/10/13(金) 14:44:52
英語で書け
8デフォルトの名無しさん:2006/10/13(金) 15:00:26
#include <stdio.h>
int main(void) {
int array[] = {3, 4, 1};
int i, j, k;
for (i = 0; i <= array[0]; i++) {
for (j = 0; j <= array[1]; j++) {
for (k = 0; k <= array[2]; k++) {
printf("%d, %d, %d\n", i, j, k);
}
}
}
return 0;
}
9デフォルトの名無しさん:2006/10/13(金) 17:01:41
>>8
ありがとうございます!
一つのループで何とかしようと思ってました・・・
10デフォルトの名無しさん:2006/10/14(土) 03:05:19
これをファイルの中の一行として

abc........hogehoge........kirakira........parapara\n(改行)

+-------------++--・・・-++-------------++-------


この図で最初+-------------++までがlength値; 225
で次の+-------------++までがlength値; 225
最後の-------が7

この数値を足していけばトータルの文字数が取得できる。
全て読み終わった後にトータル文字数が幾つだったか出力します。
と入門書には書いてあります。
この図解をどう解釈すればいいのでしょうか?
図を見てもわかりませんので、アドバイス御願いします。
11デフォルトの名無しさん:2006/10/14(土) 03:25:18
よくわからんのだが、そのまんまの意味でいいのと違うのか?
12デフォルトの名無しさん:2006/10/14(土) 03:27:57
>>11
えええ??
この図解では納得ができません
13デフォルトの名無しさん:2006/10/14(土) 03:37:02
=!
この意味がわかりません
偽りでしょうか?
14デフォルトの名無しさん:2006/10/14(土) 03:49:57
いいえ、誤りです。
15デフォルトの名無しさん:2006/10/14(土) 03:53:37
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FALSE 0
#define TRUE 1

//ファイル検索
FILE *fp; //ファイルポインタ
char filename[256]; //ファイル名
char key[128]; //検索文字列
char c;
int keylen; //検索文字列の長さ
int i = 0 //検索文字列の位置
int search = FALSE; //検索中フラグ
int count = 0; //検索文字列出現回数

//検索対象ファイル名と検索文字列を決定
printf("ファイル名を入力して下さい > ");
scanf("%s", filename);
printf("検索文字列 > ");
scanf("%s",key);
keylen = strlen(key);

16デフォルトの名無しさん:2006/10/14(土) 03:54:10
//ファイルオープン
if((fp = fopen(filename, "r")) == NULL)
{printf("ファイルオープンエラー\n"); exit(1);}

//ファイル読み込み
while((c = fgetc(fp) != EOF)
{if(search) {/*検索中*/ /*検索文字列に一致しない文字が現れた*/
if(c =! key[i]) {search = FALSE; i = 0;}
else{i++} }
else{/*検索中ではない*/ if(c == key[i]) {search = TURE; i++}}
//検索文字列と全て一致した場合
if(keylen == i) {count++; i = 0; search =FALSE;}}

fclose(fp);
printf("出現回数 %d\n", count);

return 0;
}

エラー
エラー E2141 5-4.c 15: 宣言の構文エラー
エラー E2293 5-4.c 19: ) が必要
エラー E2293 5-4.c 20: ) が必要
エラー E2293 5-4.c 21: ) が必要
エラー E2293 5-4.c 22: ) が必要
エラー E2303 5-4.c 23: 型名が必要
エラー E2040 5-4.c 26: 宣言が正しく終了していない
エラー E2293 5-4.c 39: ) が必要
エラー E2040 5-4.c 41: 宣言が正しく終了していない
エラー E2190 5-4.c 42: 不要な }
*** 10 errors in Compile ***
1715:2006/10/14(土) 03:55:29
これらの誤りが、どうしても正せませんので
ご指導お願いします。

括弧の数は足りているはずです。
18デフォルトの名無しさん:2006/10/14(土) 04:32:28
int main() {を7行目に挿入
int i = 0のあと;が抜けてる
fgetc(fp)と!=の間に)が必要
if(c=!key[i])で=!ではなく!=
i++のあとに;が抜けてる2箇所
search = TUREでTUREではなくTRUE

俺は何やってんだろorz
19デフォルトの名無しさん:2006/10/14(土) 04:34:01
>括弧の数は足りているはずです。
足りている、じゃなくて帳尻を合わせるために無理矢理足したんとちゃうんか。
なんかそんな臭いがプンプンする。

2chには行数制限があるし半角スペースもしくはTabのインデントは表示されないのは
わかるけど、もうちょっと丁寧に書くように心がけてくれ。これじゃ読みにくくてカナワン。
見通しの悪いソースはバグの温床にもなりやすいから、まずはコードを綺麗に書き直すという
基本的なところからやり直し。


一つだけヒント。main関数はどこだ?見当たらないぞ。
20デフォルトの名無しさん:2006/10/14(土) 04:35:17
>>18
お前の優しさに感涙
2118:2006/10/14(土) 04:43:19
>>20
むしゃくしゃしてやった
今は反省している
2215:2006/10/14(土) 04:43:48
>>18
できました!!!感謝感激です!
よくきづきますね。すごい。

>>19
はい、すみません・・・。
もっと綺麗に見やすくしたいと思います。

しかし、実行結果が
C:\source>5-4
ファイル名を入力して下さい > 5-4.c
検索文字列 > include
出現回数 0

三回にならない・・・・
23デフォルトの名無しさん:2006/10/14(土) 08:28:38
>>22
3になったよ
>>18の指摘通りの修正を行えば良し、修正ミス
24デフォルトの名無しさん:2006/10/14(土) 13:51:29
もうなんだか、C言語入門なんて以前に、幼稚園辺りから人の言うことをきちんと聞く勉強をしなおすべきだな。
25デフォルトの名無しさん:2006/10/14(土) 15:15:30
そうか?
26デフォルトの名無しさん:2006/10/14(土) 15:23:31
GLPKをC言語で活用したいと思っているんですが、なかなかうまくいきません。
ネットにあるGLPKをおいてあるサイトで落として、sample.cを実行しているんですが、
外部シンボルが解決できないとのエラーが出てしまいます。エディタはBorladnd Cを使っています。
http://www.sc.pse.tut.ac.jp/~wada/wiki/index.php?GLPK
このサイトにある、sample.cと、GLPK4.8というのを落としてやっています。
どなたかコンパイルができる方がいたら、ぜひ教えてください。
まだまだ初心者なので、説明もおぼつかないのをご容赦くださいw
27デフォルトの名無しさん:2006/10/14(土) 17:18:49
>>26
なんて言うシンボルが解決できないだって?
28デフォルトの名無しさん:2006/10/14(土) 18:44:38
Error: 外部シンボル '_glp_lpx_create_prob' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_set_prob_name' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_set_obj_dir' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_add_rows' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_set_row_name' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_set_row_bnds' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_add_cols' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_set_col_name' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_set_col_bnds' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_set_obj_coef' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_load_matrix' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_simplex' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_get_obj_val' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_get_col_prim' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
Error: 外部シンボル '_glp_lpx_delete_prob' が未解決(H:\DOCUMENTS AND SETTINGS\A603108\MY DOCUMENTS\GLPK\SAMPLE.OBJ が参照)
というエラーです☆
29デフォルトの名無しさん:2006/10/14(土) 18:45:13
一瞬荒らしかとオモタ
30デフォルトの名無しさん:2006/10/14(土) 18:47:00
もしかして、そのサンプルソースを単独でコンパイルしてる?
31デフォルトの名無しさん:2006/10/14(土) 19:38:33
はい。。
何か技があるんですか??
32デフォルトの名無しさん:2006/10/14(土) 23:52:47
>>18すげぇ!
オラもいつか>>18みたいになるどー!
(昨日入門書買ってきただ)
33デフォルトの名無しさん:2006/10/15(日) 01:22:05
C++に慣れるとCはきついものがあるな
34デフォルトの名無しさん:2006/10/15(日) 01:33:08
C言語を勉強してるのですが、
『宣言が正しく終了していない』
と言ったエラーが出て困りました。
ググッて調べてみましたが、いまいち解決策が
みつかりません。
宜しくお願いします。
35デフォルトの名無しさん:2006/10/15(日) 01:38:17
セミコロンが欠けているなどといった単純な誤りだと思う。
36デフォルトの名無しさん:2006/10/15(日) 01:46:56
>>35以下のソースなのですが、単純な誤りでしょうか?
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define SIZE 20
int Scores[SIZE]; /*グローバル変数宣言*/
int max(int a, int b)
{if(a<b) return b;
else return a;}
int min(int a, int b){
if(a<b) return b;
else return a;}
int main(void){
int i;
double ave,sum;
srand(894u);
for (i=0; i<SIZE; i++)
Scores[i] = (int)(rand()/(RAND_MAX+1.0)*301)-100;
for (i=0; i<SIZE; i++){
Scores[i]=min(Scores[i],0);
Scores[i]=max(Scores[i],100);}
for (i=0; i<SIZE; i++)
{sum += (double)Scores[i];}
ave =sum/SIZE;
printf("Answer is %6.2f.\n",ave);
return 0;
37デフォルトの名無しさん:2006/10/15(日) 01:50:53
>36
最後の行return 0;の次にブロックの終わり } はないのか?
38デフォルトの名無しさん:2006/10/15(日) 01:52:30
http://pc8.2ch.net/test/read.cgi/tech/1156145593/989
こっちではあるね。コピペミス?
39デフォルトの名無しさん:2006/10/15(日) 01:56:33
>>37 }は、あります。カキコする時には、コピーし損なったようですorz。
コンパイルが通りませ(T_T)。
40デフォルトの名無しさん:2006/10/15(日) 01:59:28
何箇所マルチしてんだこのバカは
41デフォルトの名無しさん:2006/10/15(日) 02:00:51
>>38 はい、そうでしたorz。
42デフォルトの名無しさん:2006/10/15(日) 02:04:57
>>38の先で答えでてるよ
そこの>>991の言うとおりにしたらいいよ
43デフォルトの名無しさん:2006/10/15(日) 02:13:58
>>42有難うございました。
44デフォルトの名無しさん:2006/10/15(日) 16:34:00
26の藻のですが、回答はありませんか?w
45デフォルトの名無しさん:2006/10/15(日) 16:37:40
ちなみに、コンパイルコマンドはbcc32 sample.c でやっていまーす。
46デフォルトの名無しさん:2006/10/15(日) 16:39:11 BE:179723849-2BP(204)
GLPKはよく知らんけど、それ関係のライブラリをインストールして、リンクしないと実行ファイルはできないよ。
47デフォルトの名無しさん:2006/10/15(日) 16:40:23
bcc32 -o sample.o sample.c
48デフォルトの名無しさん:2006/10/15(日) 16:41:46
gcc -O2 -s -osample.a sample.c

だったか?
49デフォルトの名無しさん:2006/10/15(日) 16:48:00
>>46
ライブラリはインストール済みで、リンクをしていないのかもしれません。。

>>47
やってみたんですが、sample.o が見つかりませんでした。

>>48
gccをbcc32に置き換えてやってみたんですが、やはり、外部シンボルが未解決がでてしまいます。。
50デフォルトの名無しさん:2006/10/15(日) 16:49:54
bcc32 sample.c
でいいはず、
51デフォルトの名無しさん:2006/10/15(日) 16:52:07
>>50
それでやると、上の荒しみたいなエラーがでますw
52デフォルトの名無しさん:2006/10/15(日) 16:53:38
>ライブラリはインストール済みで、リンクをしていないのかもしれません。。
いいから自分でこの方法を調べなされ。
53デフォルトの名無しさん:2006/10/15(日) 16:55:54
リンクをするというのはヘッダファイルをinclude"glpk.h "みたいなことでいいんでしょうか??
54デフォルトの名無しさん:2006/10/15(日) 16:56:29
秋田
55デフォルトの名無しさん:2006/10/15(日) 17:01:37
>>53 家庭教師を雇ってないの?
56デフォルトの名無しさん:2006/10/15(日) 17:09:32
家庭教師??
雇っているんですか?自分は雇ってませんが。
57デフォルトの名無しさん:2006/10/15(日) 17:11:51
思考停止。。。
58 ◆DMVtSSFzcg :2006/10/15(日) 17:13:25
誰が回答しているのかわからんな
59デフォルトの名無しさん:2006/10/15(日) 17:15:21
だれかC FAQに案内してやれよ
60デフォルトの名無しさん:2006/10/15(日) 18:58:43
質問なんですが
scanfで秒数を入力して、それを「○時○分○秒」と出力するプログラムを
作ります。このとき、四則演算の%(余をだす)をつかわずに作るにはどうしたら
いいでしょうか。
自分でも書いてみましたが、シンプルなプログラムにならないのです。
61デフォルトの名無しさん:2006/10/15(日) 19:07:34
>>60

まず、作ったのを貼ってみ
6260:2006/10/15(日) 19:24:20
#include<stdio.h>
int main(void)
{
int a,b,c,d;
printf("秒数=");
scanf("%d",&a);

b=a/3600;
c=a-(b*3600);
d=c/60;
e=c-(d*60);

printf(" %d 時 %d 分 %d 秒\n", b,d,e);

return 0;
}
63デフォルトの名無しさん:2006/10/15(日) 19:26:07 BE:134792093-2BP(204)
ldiv()を使ってみるとか。
64デフォルトの名無しさん:2006/10/15(日) 20:04:45
eが定義されてないところがネタくさくていい
65デフォルトの名無しさん:2006/10/15(日) 20:19:17
>>62
十分シンプルだと思うんだが
66デフォルトの名無しさん:2006/10/15(日) 20:21:58
宿題は自分でやれよ
67デフォルトの名無しさん:2006/10/15(日) 20:30:37
シンプルだね。

エラーは出るけど。
68デフォルトの名無しさん:2006/10/15(日) 21:47:10
動的に配列を確保した際のメモリ量が知りたいんですが
どうやって調べたらいいんでしょうか?

int *array;
array = (int *)malloc(sizeof(int) * 1000000);

とした場合、int型4byte×1000000=4Mbyteになると思ったのですが
cygwin上でtopコマンドを使って調べたところ6Mbyte程消費していました。

環境によってこの位変わるものなのでしょうか?
よろしくお願いします。

69デフォルトの名無しさん:2006/10/15(日) 23:31:49
>>68
メモリ管理の実装は処理系、OSによって異なる
要求されたサイズだけを切り取る方式もあるだろうし、
特定サイズのメモリブロックのプールを予め用意しておく方式もあるだろう
前者だと要求サイズ+管理情報分のメモリが消費され、
後者だと要求サイズを超えるメモリーブロックのうちの最小のメモリーブロック
のサイズが消費されるだろう

いずれにしても、nallocで4Mバイトを確保したからといって、4M分だけどメモリが消費されるわけではない
オーバーヘッドが必ずある
このオーバーヘッドのサイズは実装方式に依存する
70デフォルトの名無しさん:2006/10/15(日) 23:50:07
>>68
あと、topコマンドで出力されるプロセスの仮想記憶のサイズ(SIZE)でmallocで確保中
のメモリ量をみるのは注意しないといけないケースがある。
freeしてもプロセスの仮想記憶のサイズは減らないから。

mallocでメモリ確保−>仮想記憶のサイズは変わらない
確保したところに書き込む−>仮想記憶のサイズは増える
確保したメモリをfreeする−>仮想記憶のサイズは変わらない

某UNIXではこんなだったと記憶する。
71デフォルトの名無しさん:2006/10/16(月) 01:36:40
ウワワワワワーン!゚(ノД`)゚。
巡回セールスマン問題の解が実装できないよー
Cで、巡回セールスマン問題に詳しい書物を教えてください
お願いします!!!
72デフォルトの名無しさん:2006/10/16(月) 01:55:29
ポインタのポインタについていまいち解りません。

char *pc="abcdefg";
char **ppc=&pc;

これでpcのアドレスがppcに入るんですよね?

printf("*ppc=%s",*ppc);

で表示はabcdefgとなるのは解る気がするんです。
でも
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void myalloc(char **p1,char **p2)
{
*p1=malloc(20);
strcpy(*p1,"first string");
*p2=malloc(20);
strcpy(*p2,"second string");
}

int main(void)
{
char *p1;
char *p2;
myalloc(&p1,&p2);
printf("p1=%s p2=%s\n",p1,p2);
return 0;
}
7372:2006/10/16(月) 02:00:49
上のプログラムで
myalloc関数内の

*p1=malloc(20);

の部分で

p1=malloc(20);
でダメなのはなんででしょうか??

p1に*p1の値(アドレス)が入ってるのでアスタリスクをつける意味を
考えて混乱してきました。
よろしくお願いします。
74デフォルトの名無しさん:2006/10/16(月) 02:17:13
-------------------------
char **p1;
char **p2;

*p1=malloc(20);
strcpy(*p1,"first string");
*p2=malloc(20);
strcpy(*p2,"second string");
-------------------------
char *p1;
char *p2;

p1=malloc(20);
strcpy(p1,"first string");
p2=malloc(20);
strcpy(p2,"second string");
-------------------------

↑2つを見比べれて考えればおkかな?
75デフォルトの名無しさん:2006/10/16(月) 02:18:00
>>73
void myalloc(char **p1,char **p2)
関数へポインタのポインタをわたしているので
普通と違う書き方が必要。
普通の場合はmallocの左辺がchar*である必要がある。
char型のポインタ = malloc(20);

ところで上記関数内で
p1=malloc(20)は
char ** = malloc(20);と同じになり、変になる
そこで左辺を間接参照して左辺をchar*にしないといけない
したがって
char * =malloc(20)にするには*でp1を間接参照すればいいから
*p1=malloc(20)
でおけ(このとき、*p1はchar*を間接参照している)
76デフォルトの名無しさん:2006/10/16(月) 02:20:52
>>char*である必要が
事故レスねむ厳密にはvoid*である必要、かな?
77デフォルトの名無しさん:2006/10/16(月) 03:21:34
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FALSE 0
#define TRUE 1

//ファイル置換
main(){
FILE *fp; //入力ファイルのファイルポインタ
char filename[256];//入力ファイル名
FILE *outfp; //出力ファイルのファイルポインタ
char outfilename[256]; //出力ファイル名

char key[128]; //検索文字列
char str[128]; //置換文字列

char c;
int p; //検索文字列が一致しなかった場合に利用する変数
int keylen; //検索文字列の長さ
int i = 0;
int search = FALSE; //検索中フラグ
int count = 0; //置換を行った数

//ファイル名・検索文字列・置換文字列の決定
printf("ファイル名を入力して下さい > ");
scanf("%s",filename);
printf("検索文字列 > ");
sacnf("%s",key);
keylen = strlen(key);

printf("置換文字列 > ");
scanf("%s",str);
7877:2006/10/16(月) 03:22:49
//入力ファイルをオープンする
if((fp = fopen(filename, "r")) == NULL)
{printf("ファイルオープンエラー\n"); exit(1);}

//出力ファイルをオープンする
strcpy(outfilename, filename);
strcat(outfilename, "_");
if((outfp = fopen(outfilename,"W")) == NULL)
{printf("ファイルオープンエラー\n"); exit(1);

//文字列の置換
while((c = fgetc(fp)) != EOF)
{if(search){/*検索中*/ if(c != key[i]) {seach = FALSE;
/*今までの検索文字列の出力*/ for(p = 0; p<i; p++)
{fputc(key[p],outfp);} fputc(c,outfp); i = 0;}
else{i ++;}
else{/*検索中ではない*/ if(c ==key[i]) {search = TRUE; i++;}
else{fputc(c,outfp);}}

//検索文字列と全て一致した場合
if(keylen == i) {count++; fputs(str,outfp); //置換文字列の出力
search = FALSE; i = 0;} }

fclose(fp);
fclose(outfp);
printf("出現回数 %d\n",count);

return0 ;
}
7977:2006/10/16(月) 03:24:11
こうすると
警告 W8065 5-5.c 29: プロトタイプ宣言のない関数 'sacnf' の呼び出し(関数 mai
エラー E2451 5-5.c 47: 未定義のシンボル seach(関数 main )
エラー E2054 5-5.c 51: else の位置が誤っている(関数 main )
エラー E2451 5-5.c 62: 未定義のシンボル return0(関数 main )
エラー E2134 5-5.c 63: 複合文に } がない(関数 main )
エラー E2134 5-5.c 63: 複合文に } がない(関数 main )
警告 W8070 5-5.c 63: 関数は値を返すべき(関数 main )
*** 5 errors in Compile ***

とエラーが出てしまいます。
長文なので、誤りがなかなか発見できませんので
ご指摘、お願い致します。
8077:2006/10/16(月) 03:35:52
警告 W8065 5-5.c 29: プロトタイプ宣言のない関数 'sacnf' の呼び出し(関数 main )
エラー E2054 5-5.c 51: else の位置が誤っている(関数 main )
エラー E2134 5-5.c 63: 複合文に } がない(関数 main )
エラー E2134 5-5.c 63: 複合文に } がない(関数 main )
警告 W8070 5-5.c 63: 関数は値を返すべき(関数 main )
*** 3 errors in Compile ***

ここまでが、限界です・・・
81デフォルトの名無しさん:2006/10/16(月) 03:58:09
>>77-78
なんだこの変なインデントは。釣りか?
8277:2006/10/16(月) 04:04:30
>>81
何かおかしいのでしょうか?
参考書の通りにやると、自分が見難いので
自分が見易いように書いています。
何卒、ご指摘を
83デフォルトの名無しさん:2006/10/16(月) 04:13:34
だいたいはその参考書の通りに読み書きしている俺らから見れば、お前のコードはとてつもなく見難い。
中括弧の対応関係とか→('A`)
84デフォルトの名無しさん:2006/10/16(月) 04:18:26
ttp://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=28474
書き直してみた。
42行目のifが閉じてないな。
50行目のifに対応する}else{が58行目と60行目の2つあるな。
最後の}が2つばかし足りないな。
8577:2006/10/16(月) 04:41:22
>>84
ありがとうございます。
どうしても、>>50行目のifに対応する}else{が58行目と60行目の2つあるな。
最後の}が2つばかし足りないな

これがわかりません、何とか>>77-78 のソースで
ご指摘願えないでしょうか?
今回限りで、こういう書き方は止めます。
86デフォルトの名無しさん:2006/10/16(月) 04:42:04
>>77
>79を読んでも理解できないなら、人間止めちまえ。
>警告 W8065 5-5.c 29: プロトタイプ宣言のない関数 'sacnf' の呼び出し(関数 mai
これ見てなんにも疑問に感じないのか?
>scanf("%s",filename);
>sacnf("%s",key);
こうやって並べたらどうだ?
8777:2006/10/16(月) 04:46:07
>>86
それは修正してあります
エラー E2054 5-5.c 51: else の位置が誤っている(関数 main )
エラー E2134 5-5.c 63: 複合文に } がない(関数 main )
警告 W8070 5-5.c 63: 関数は値を返すべき(関数 main )
*** 2 errors in Compile ***

がどうしても、わkりません・・・orz
88デフォルトの名無しさん:2006/10/16(月) 04:51:22
>>84のソースでもう一度コンパイルすればいいだけじゃん。
そんな事に気付かないなんて本物の馬鹿なんだなぁ。
89デフォルトの名無しさん:2006/10/16(月) 08:24:24
参考書と見比べるんじゃなくて、
自分で { } の対を順に確認していきなよ
90デフォルトの名無しさん:2006/10/16(月) 16:13:24
 { } は目立つ一に書いてくれないと
ウォーリーを探せじゃないんだから。
今回みたいにエラーが出た時わかりにくいだろ?
9177:2006/10/16(月) 16:58:40
>>88
自分のやってるソース自体を直したくて
コピペで片づけるのがいやだったものでして・・・

>>89
なんとか、実行できましたが、ファイルオープンエラー起こして
しまいました。

>>90
 { } の位置やelseの位置についてが、いまいち理解できなのですが
例えば { } について

if((fp = fopen(filename, "r")) == NULL)
{printf("ファイルオープンエラー\n"); exit(1);}

書いたら何故いけなくて

if((fp = fopen(filename, "r")) == NULL){
printf("ファイルオープンエラー\n");
exit(1);
}

このように{ } の位置を if(){ で
               if()
                {}
ではいけないんですかね?
elseの位置が違うとは、どうなればいいのでしょうか?



92デフォルトの名無しさん:2006/10/16(月) 17:06:14
お前は{}の位置を縦に揃えろ。
struct hoge
{
    /* ... */
};

void hoge()
{
    const char *arr[] =
    {
        "foo",
        "bar",
    };
    /* ... */
    while ()
    {
        for ()
        {
            if ()
            {
                /* ... */
            }
            else
            {
                /* ... */
            }
        }
    }
}
9377:2006/10/16(月) 17:13:36
>>92
ご返答、ありがとうございます。
その、何故縦に揃えなければいけにかと言う理由が
わからないんです。
それは決まりなのでしょうか?それとも単に見易いか否かと言う
だけなのでしょうか?

94デフォルトの名無しさん:2006/10/16(月) 17:20:52
自分のバグの原因を棚に上げて「だけ」とか言ってるよ。
そういう発言は↓でしろよ。

最高にド低脳な発言してください in ム板(XIIII)
http://pc8.2ch.net/test/read.cgi/tech/1158275665/l50
9577:2006/10/16(月) 17:23:49
>>92
たしかに、このようにすれば解決しますが
以下のソースのようにやると
エラー E2054 5-5.c 47: else の位置が誤っている(関数 main )
エラー E2054 5-5.c 48: else の位置が誤っている(関数 main )
*** 2 errors in Compile ***

と出ます。

//文字列の置換
while((c = fgetc(fp)) != EOF) {if(search){ if(c != key[i]) {search = FALSE; for(p = 0; p<i; p++) {fputc(key[p],outfp);}
fputc(c,outfp); i = 0;}
else{i ++;}
else {if(c ==key[i]) {search = TRUE; i++;} }
else { fputc(c,outfp);}}


>>91にも書いた {} の付け方や
どのような場合のelseの位置だと誤りが出るのか等
法則的なものや理由が知りたいです。
でなければ納得ができません。
色々調べていますが、その理由が載っていません。
こら等の問題さえ解決できれば、先に進めます。
とても疑問です。
9677:2006/10/16(月) 17:25:33
>>94
すみません・・・・
やはり気にせず、先に進む様にします
ご迷惑かけて、すみませんでした。
ではノシ
97デフォルトの名無しさん:2006/10/16(月) 17:32:04
>>96
そんな事はきにするな
以上!!!
98デフォルトの名無しさん:2006/10/16(月) 17:35:57
>>95
>while((c = fgetc(fp)) != EOF) {if(search){ if(c != key[i]) {search = FALSE; for(p = 0; p<i; p++) {fputc(key[p],outfp);}
>fputc(c,outfp); i = 0;}
>else{i ++;}
>else {if(c ==key[i]) {search = TRUE; i++;} }
>else { fputc(c,outfp);}}
これをばらすとこうなる。
--
while((c = fgetc(fp)) != EOF){
 if(search){
  if(c != key[i]){
   search = FALSE;
   for(p = 0; p<i; p++){
    fputc(key[p],outfp);
   }
   fputc(c,outfp);
   i = 0;
  }else{
   i ++;
  }else{
   if(c ==key[i]){
    search = TRUE;
    i++;
   }
  }else{
   fputc(c,outfp);
  }
 }
--
どうみてもおかしいのだが、前者ではそれが判別しにくかろ。
9995:2006/10/16(月) 17:41:50
>>97
わかりました・・・

>>98
たしかに、こうやって見ると見難いです。
以後、参考書に沿ってやってみたいと思います。
100デフォルトの名無しさん:2006/10/16(月) 17:42:58
>>95 それを中括弧の位置を揃えてやるとこうなる。1つのifに対応するelseは1つまで。
while ((c = fgetc(fp)) != EOF)
{
  if (search)
  {
    if (c != key[i])
    {
      search = FALSE;
      for (p = 0; p < i; p++)
      {
        fputc(key[p],outfp);
      }
      fputc(c,outfp);
      i = 0;
    }
    else
    {
      i++;
    }
    else
    {
      if (c ==key[i])
      {
        search = TRUE;
        i++;
      }
    }
    else
    {
      fputc(c,outfp);
    }
  }
101デフォルトの名無しさん:2006/10/16(月) 17:52:36
>>95
>たしかに、こうやって見ると見難いです。
で、どこが間違っているのかわかったのか?そのレスだとわかってないっぽいが。
つーか同じ内容が>>84にあるわけだが。見てないんだな。
102デフォルトの名無しさん:2006/10/16(月) 17:53:28
俺としてはそんなインデントをきっちりつけたソースよりも、ある程度フレキシブル
なソースの方が温かみを感じる。
>>95には是非とも、スペース、タブ、改行を禁止する方向で成長していって欲しい。
今日は5千行もプログラム書いたよ。とかより今日は5万桁プログラムを書いたよ。
とかそういう話を是非>>95にはして欲しい。

103デフォルトの名無しさん:2006/10/16(月) 17:58:24
しかし温かみよりも、事務的にきっちりとしてあるソースのほうが無難ではある。
104デフォルトの名無しさん:2006/10/16(月) 18:17:03
>>102
想像してちょっと和んじゃったじゃないか
105デフォルトの名無しさん:2006/10/16(月) 18:49:01
>>102
君も同類なんだろうな…
せっかくだし>>95をハッカーの道に案内したら?
106デフォルトの名無しさん:2006/10/16(月) 19:13:50
ここの>>95を見てたら疑問に思えない事を疑問に思えるようになった。
のは俺だけか?そーいう書き方もあったのかと感じた。
参考書とかだと、そんな書き方載せてねーなw
107デフォルトの名無しさん:2006/10/16(月) 20:14:25
人間がやってるかぎり、きっちりだろうがぐちゃぐちゃだろうがクソ
機械(プリティプリンタ)で整えられる形が最良
108友達の友達の名無しさん :2006:2006/10/16(月) 20:15:56
明解C言語 入門編の
p197 演習8-5に以下の問題がありました。

整数nの階乗を返す関数
int fact(int n) {/ *・・・*/}
を再帰を用いずに定義せよ。

演習8-6

異なるn個の整数からr個の整数を取り出す組み合わせの数nCrを求める関数
int combination(int n,int r) {/*・・・*/}
を作成せよ。なおnCrは以下のように定義される。
nCr=n-1Cr-1 + n-1Cr (ただし、nCo=nCn=1,nC1=n)

以上のお答えお願いします
109デフォルトの名無しさん:2006/10/16(月) 20:29:00
宿題丸投げは別にスレなかったっけ。
110友達の友達の名無しさん :2006:2006/10/16(月) 22:12:04
予習ですけど
111デフォルトの名無しさん:2006/10/16(月) 22:13:31 BE:279569287-2BP(204)
>>108
mixiでも質問してなかったか?
112デフォルトの名無しさん:2006/10/16(月) 22:27:11
ネットワーク構築や自宅鯖をやりたいんですが、先ずCからやった方が
良いと言われたのですが如何なんでしょうか?
応用が効くし覚えて損はないという事らしいです、基礎やイメージを
つかんでおく程度で良いから、まずはCとの事です
113デフォルトの名無しさん:2006/10/16(月) 22:29:46 BE:224654459-2BP(204)
>>112
Cと自宅サバはあんまり関係ないぞ・・・
perlとかスクリプトをおぼえとくと便利なこともあるけど、
べつに知らなくたって、運営はできるしな。
114デフォルトの名無しさん:2006/10/16(月) 23:13:18
>>108
#include <stdio.h>

/*
* 階乗を求める
*/
int fact(int n)
{
  int i;
  int f = 1;

  for (i = 1; i <= n; i++) {
    f *= i;
  }

  return f;
}

/*
* 組み合わせnCrを求める
*/
int combination(int n, int r)
{
  return fact(n)/(fact(r)*fact(n-r));
}
115デフォルトの名無しさん:2006/10/16(月) 23:14:16
>>114のつづき
/*
* テストプログラム
*/
int main(void)
{
  int n, r, c;

  printf("nを入力してください> ");
  scanf("%d", &n);
  printf("rを入力してください> ");
  scanf("%d", &r);

  c = combination(n, r);
  printf("%dC%d=%d\n", n, r, c);

  return 0;
}
116112:2006/10/17(火) 00:13:40
サンクス
117デフォルトの名無しさん:2006/10/17(火) 05:55:12
Cの勉強を始めて半年、毎日少しずつ勉強しているけど
いまだなんのプログラムを組めばいいか分からない
でも、毎日どこかのプログラムを見ないと頭が気持ち悪い(´・ω・`)
118デフォルトの名無しさん:2006/10/17(火) 10:50:57
#include <stdio.h>
#include <stdlib.h>
void fileopen(FILE *fp,char filename[],char mode[]);
void fileclose(FILE *fp);
int main(void)
{
FILE *fp;
fileopen(fp,"adress.txt","w");
fprintf(fp,"test\n");
fileclose(fp);
return 0;
}

void fileopen(FILE *fp,char filename[],char mode[]){
if((fp=fopen(filename,mode))==NULL){
fprintf(stdout,"ファイルオープンエラー");
exit(1);
}
return;
}
void fileclose(FILE *fp){
if(fclose(fp)==EOF){
fprintf(stdout,"ファイルクローズエラー");
exit(1);
}
return;
}

このコードコンパイルして実行するとエラーが出ます。
なぜなんでしょうか?
119デフォルトの名無しさん:2006/10/17(火) 14:20:45
>>118
そのfileopen()で得られたfpはmain()のfpとは異なる。
従って、main()のfpは不定値のままとなる。
他に戻り値もないようだし、FILE * fileopen(char * filename, char * mode);としてはどうか。
120118:2006/10/17(火) 17:16:57
>>119
レスありがとう。理解できました。
はじめ参照渡ししてるはずなのになんでだろって思ってたんだけど、
fpenによってfpに格納されてるアドレスが変わってるからだめなんだね
納得納得。ありがとうね。
121デフォルトの名無しさん:2006/10/18(水) 00:01:34
fpen...
122デフォルトの名無しさん:2006/10/18(水) 00:47:00
課題3
入力した文字列の中に数字文字、アルファベット大文字、小文字がそれぞれ何個あるか表示するプログラムを作りなさい。
例) AB123cdを受け取ったら数字3、大文字2、小文字2

↑の答えお願いしますm(_ _)m

123デフォルトの名無しさん:2006/10/18(水) 00:55:46
宿題スレ行け。マルチするな。
124空気めない人:2006/10/18(水) 01:02:16
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char buff[] = "AB123cd";
int i, check;
int dai = 0;
int shou = 0;
int suuji = 0;
for (i = 0; i < sizeof(buff); i++){
check = isupper(buff[i]);
if (check != 0){
dai++;
}
check = islower(buff[i]);
if (check != 0){
shou++;
}
check = isdigit(buff[i]);
if (check != 0){
suuji++;
}
}
printf("大文字:%d, 小文字:%d, 数字:%d\n", dai, shou, suuji);
return 0;
}
125デフォルトの名無しさん:2006/10/18(水) 01:26:03
ありがとうございます!!!!
126デフォルトの名無しさん:2006/10/19(木) 03:59:53
#include <stdio.h>
#include <stdlib.h>
struct str{
char name[10],tel[10],time[10],pay[10];
int i;
double db;
};
int main(void){
FILE *fp;
struct str str1={"test","test2","test3","test4",10000,50.5};
if((fp=fopen("struct.txt","wb"))==NULL)exit(1);
fwrite(&str1,sizeof(struct str),1,fp);
fclose(fp);
return 0;
}
独習Cをやりながら勉強してます。
今構造体と共用体のところ勉強してるんだけど
このコードがうまくいきません。
構造体の中身をfwrite関数をつかってstruct.txtに落としたいんだけど
なぜかうまくいかない…(str1.iとstr1.dbの内容がおかしくなる)
そもそもfwriteを使うのがむりなのだろうか?
詳しい方教えてください。
127デフォルトの名無しさん:2006/10/19(木) 04:32:45
それはテキストエディタで表示したときに文字化けするという意味で
「内容がおかしくなる」のか?それはたぶん正常に動作しているのでは。
もともとfwrite()はテキストではなくバイナリとしてファイルに出力するから
テキストファイルとして開いてもうまく表示できない。(データの種類にもよるが)
128デフォルトの名無しさん:2006/10/19(木) 07:00:43
>>126
構造体をバイナリで保存してはいけない理由がよく分かりました。
129デフォルトの名無しさん:2006/10/19(木) 07:21:43
いや、そういう理由ではないのだが…。

コンパイルオプション一つでメンバーのオフセットが
容易の変ってしまうことがひとつ。

エンディアンの違うプロセッサに持っていったら
正常に読めない(かもしれない)ことがひとつ。

わかってさえいればこの辺は回避ができるんだけど、
初心者には無理だろうね。
130デフォルトの名無しさん:2006/10/19(木) 10:14:25
この場合、どう見ても
ポインタメンバを持っているせいだと思うが
131デフォルトの名無しさん:2006/10/19(木) 10:15:51
まぁ、初心者は素直にfprintf()で出力しとけってこった。
132デフォルトの名無しさん:2006/10/19(木) 11:17:22
>>129
エンディアンの違うCPUでうまく読めないのは構造体だろうが単純型だろうが一緒。
そのためにデータ様式の規約があるわけで。

>>130
はずれ。構造体変数の初期化に限って例外的に文字配列のコピーが認められる。
だから構造体は文字列へのポインタではなく文字列そのものを内部に保持する。

>>131
それをやるとファイル入力で苦労しそうな悪寒w
もしfscanfで読み込んでいたら、うまいことファイルを改竄すると
セキュリティホールになりかねん。
133デフォルトの名無しさん:2006/10/19(木) 11:30:03
>>132
>それをやるとファイル入力で苦労しそうな悪寒w
初心者レベルなら、fgets()+sscanf()で充分だろ。

>セキュリティホールになりかねん。
バイナリにすれば塞がるというなら兎も角、そんなところでコストを掛けるのは無駄。
もし仮に、初心者の教習ではなく実務というならこんなところで聞くわけがないし、
そうであるなら仕様は上流で確定しているはず。
それさえ決まっていないのなら、セキュリティホール云々以前の問題だ。
134デフォルトの名無しさん:2006/10/19(木) 11:44:27
>fgets()+sscanf()
fscanfと変わりないじゃん。

>バイナリにすれば塞がる
いや、そういう意味ではなく。scanf系の%sは潜在的にある種の穴を持っているからね。
それを知らないまま危険なコードを量産という状態は避けなければならない。
それにトークン解釈や変換のコストはバイナリ入力に比べて気にならない程度の物でもない。

それ以降の部分については、特に異論はないです。
135デフォルトの名無しさん:2006/10/19(木) 11:55:02
>>134
%[^\n]
136デフォルトの名無しさん:2006/10/19(木) 12:08:26
>>135
なにソレ?と思って調べてみた(と言ってもGoogleではそれをキーワードにできない)。
それ以外にも回避法はいろいろあるみたいね。
でもそういう小技を知っていて何になるの?素直にバイナリ化すればいいだけの話じゃん。
137デフォルトの名無しさん:2006/10/19(木) 12:22:12
>>135
%*[^\n]
138デフォルトの名無しさん:2006/10/19(木) 16:04:01
>>136
テキストで出力しておけば、デバッグが楽になるジャマイカ。相手は初心者なんだから。
139デフォルトの名無しさん:2006/10/19(木) 16:39:28
>>138
まあまあ「素直にバイナリ化」と言ってるんだから、
素朴な人だと察してあげましょうよ。
140126:2006/10/19(木) 18:58:24
たくさんの方からレスを頂きありがとうございます。
>>127
自分が間違いだと思っていたのは、バイナリファイルをテキストファイルとして開いていたからで、
str1.iとstr1.dbに格納されていた部分が文字化けして表示されていました。
127さんのおっしゃるとおりfwrite()は正常に動作しているみたいです。
(freadで正常に取り込むことが出来ました)
自分が勘違いしていたのは、fwriteを使った場合でもテキストファイルとして開けば文字化けせずに
表示されると思っていたことです。
データの保存/読み込みのみにファイルを使う場合は、fread、fwriteで問題ないが、ファイルをテキストで
閲覧する可能性がある場合はfread、fwriteは使えないことがわかりました。ありがとうございました。

>>129
メンバーのオフセットというのは、メンバーの構造型のポインタからのバイト数っていうことでしょうか?
僕の解釈では、コンパイラごとにオフセットが変わってしまうのを、fwriteの引数の2つ目の部分で
sizeof関数を使用することで吸収していると思っていたのですが違うのでしょうか?

エンディアンという言葉は知らなかったのでググってみたら複数のバイトを処理する際の方法のことみたいですね。
上位バイトから処理するか下位バイトから処理するか。ネットワークでファイル交換する際とかに影響がでるって
書いてあったからこれは今回は関係ないのかな?
141デフォルトの名無しさん:2006/10/19(木) 19:11:17
K&R第二版に以下のコードが内部的なstatic配列の理想的なの応用例である、とあるんですが
これはmonth_nameを呼び出すたびに配列nameを初期化しなくても済むからってことでしょうか?

char *month_name(int n)
{
static char *name[] = {
"Illigal month",
"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December"
};

return (n < 1 || n > 12) ? name[0] : name[n];
}
142デフォルトの名無しさん:2006/10/19(木) 19:45:46
四でないけどそのコードを見る限りそれしか利点はなさそうだな
143141:2006/10/19(木) 20:06:17
>>142
よかったですか、他に前後の節と深い関わりがあるようにも見えないので
いまいち理想的と言うほどである理由が分からなかったんですが、
小さなところからコツコツやっていけということなんですかね
144デフォルトの名無しさん:2006/10/19(木) 20:35:12
>>140
> メンバーのオフセットというのは、メンバーの構造型のポインタからのバイト数っていうことでしょうか?

まあそういうことです。「構造体 パディング アラインメント」
あたりでぐぐってみるとわかると思います。

sizeof (こいつは関数じゃなくて演算子です) で取れるサイズは、
オフセットとはさほど関係はありません。

エンディアンについては、確かにネットワークでは問題になることが多いです。
が、バイナリのファイルをエンディアンの違うマシンに持っていったときにも
同様の問題が発生します。

どなたかが指摘してくださったようにこの問題は別に構造体固有の問題ではなくて、
バイナリをファイルに書いたときには問題になります。
145デフォルトの名無しさん:2006/10/19(木) 21:20:16
>>141
メリットかどうかではなくて、staticの理想的な使いどころってことだけど?
ところで、書き込むのは全部読み終わってからでも良かっただろうに。
146デフォルトの名無しさん:2006/10/19(木) 21:22:12
>>142
nameが外から参照できないってのは利点じゃないの?
147デフォルトの名無しさん:2006/10/19(木) 23:34:57
数値を入力させて、例えば
526を入力したら526th
383を入力したら383rd
811を入力したら811st
このように出力させるにはどうすればいいでしょうか?
148デフォルトの名無しさん:2006/10/19(木) 23:46:54
526 % 10 で余り6
149デフォルトの名無しさん:2006/10/19(木) 23:47:06
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
| ここで笑って !! |
|_________|
    ∧∧ ||
    ( ゚д゚)||
    / づΦ
150デフォルトの名無しさん:2006/10/19(木) 23:55:35
             ∧..∧
           . (´・ω・`)  < 383を入力したら383rd 811を入力したら811st
           cく_>ycく__)
           (___,,_,,___,,_)  ∬
          彡※※※※ミ 旦
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   \ どっ!!  /   \ ワハハ! /
     \     /      \    ∞
 l|||||||||||||| ∩,,∩ ∩,,∩  ∩,,∩ ミ∩ハ∩彡
 (,    )(,,    )    ,,)(    )(    )
151デフォルトの名無しさん:2006/10/20(金) 00:22:15
浮動小数点数をまんまファイル出力したい場合って
(擬似)バイナリ出力しかないのかな?

※ Base64エンコでテキスト化したものをファイルに書き出すのも、結局バイナリ保存していることになるし…
152デフォルトの名無しさん:2006/10/20(金) 01:32:53
>>147
Ex.
// 但し、11-13を"th"にする処理は割愛
void printOrder(unsigned num)
{
static char const * const foo[] = {"th", "st", "nd", "rd"};
int order = num % 10;
if (order >= sizeof(foo) / sizeof(*foo)) order = 0;
printf("%d%s", num, foo[order]);
}
153141:2006/10/20(金) 09:02:07
>>145
staticはローカル変数の中でも配列の内容を静敵領域に抑えておく使い方が理想的ってことでしょうか?
文字列定数は静敵領域に確保されると他の本で読んだので、そんなに変わらないように思えたんです
一応もうちょっと先まで進んでるんですが、未だに飲み込めない箇所で…
154デフォルトの名無しさん:2006/10/20(金) 09:53:35
そのstaticの使い方は、静的領域確保とスコープ制限(その関数内のみアクセス)
の2つの意味を兼ねているけど、これを同じに考えてごっちゃにしてないか?
>>153のそれも理想的な使い方の一つ。
>>141 初期化しなくても済むってのも同じく使い方の一つ(これは
初期値が代入する規約からの副次効果に過ぎないけど、応用例ではある)。

char *ptr="abc"
char arr[]="abc"
記憶領域確保からすればまったく別物だけど、
これも曖昧ならK&R読むのはまだ早いんじゃないか?
構造体のところは辛いぞ。
155141:2006/10/20(金) 10:15:06
>>154
あ、すみませんnameがポインタの配列だってことを忘れていました…
>>141だと文字列長がバラバラで配列で定義すると冗長な部分が出来るから
それぞれへのポインタを配列に格納した方がよくて、その領域を留めるためのstatic、ということですか
156デフォルトの名無しさん:2006/10/20(金) 11:59:20
>>155
文字列長とか配列定義とかは、staticと関係ないな。
K&RはCの理解が曖昧だと難しいから、
それよりも初心者本を読み返すのがいいだろう。
もしくは、C FAQでstatic, array, pointer の違いを理解してみろ。
考えるのは、それからでも遅くはないだろう。
157デフォルトの名無しさん:2006/10/20(金) 12:29:38
>>152なら、ポインタの配列にしないで配列の配列にしたほうがメモリ効率はよさそうだが。
#どうせ
158デフォルトの名無しさん:2006/10/20(金) 12:33:37
む、抜けたか?

>157の最後の行をもう一度。
#どうせ、長くなることもないし。
159デフォルトの名無しさん:2006/10/20(金) 12:43:44
>>157
メモリ効率って何のこと?
知ったかぶりじゃないよね。
160141:2006/10/20(金) 13:18:05
>>156
理想的という表現が引っ掛かってましたが確かに有効だと思えてきました
もう一度他で復習し直してみます、ありがとうございました
161デフォルトの名無しさん:2006/10/20(金) 15:17:00
素直でよろしい
162157-158:2006/10/20(金) 15:38:19
>>159
単純にポインタの配列だとポインタの分だけ余計にメモリを食うという話。
どっちみち、文字列分のメモリは消費するのだから。
長さが変わる(この場合より長くなる)場合は、隙間ができるから微妙になるけど。
163デフォルトの名無しさん:2006/10/20(金) 18:06:18
まぢれすごくろう。
164デフォルトの名無しさん:2006/10/21(土) 20:31:48
質問なのですが、置換されたファイルなどは
ようするに書き出しとかでできた、ファイル(aaa.c→aaa.c_)
これで "_" と言うのが付いたファイルができました
参考書に依ると開いて確認しましょうとなっているのですが
開けません・・・・
165デフォルトの名無しさん:2006/10/21(土) 20:57:51
拡張子をtxtなりなんなり適当に直せ
166デフォルトの名無しさん:2006/10/21(土) 21:05:27
>>165
ありがとうございます、
自分で直せばいいのですね!!!
167デフォルトの名無しさん:2006/10/21(土) 22:45:15
このスレはいつからWindows操作質問スレ(初心者編)になりやがりましたか?
168デフォルトの名無しさん:2006/10/21(土) 23:16:07
>>167
 このスレができる前から、「入門以前」の書き込みは
しばしば見られたからなぁww

「C言語なら俺に聞け(エディタすら使えない人篇)」とか作るか?
もはやC言語でもなんでもないが・・・
169デフォルトの名無しさん:2006/10/22(日) 03:16:36
ぜひお願いします
170デフォルトの名無しさん:2006/10/22(日) 09:41:39
それやる位なら初心者板にあるみたいな超初心者向けエスパースレの方が隔離スレとしてはいい気がする
ム板にどれくらいエスパーがいるのか知らんが
171デフォルトの名無しさん:2006/10/22(日) 10:34:34
プログラム「燃えよドラゴンズ」

最初に打者8人分の名前を入力して置いて、
それから燃えよドラゴンズの歌詞につなげたい。

例:

荒木、井端、立浪・・・・(以下略)と入力すると、

表示される内容:

1番荒木が塁に出て
2番井端がヒットエンドラン
3番立浪タイムリー
・・・・(以下略)

このような場合はstrcatを使うべきか・・・・
それとも普通のニ次元配列で・・
172デフォルトの名無しさん:2006/10/22(日) 11:03:18
>>171
正直、そういうのはスクリプト言語でやるのが手っ取り早い。
つーか、そこでstrcat()云々なんて言い出すようじゃ、到底無理。
173デフォルトの名無しさん:2006/10/22(日) 13:37:12
>>172
スレタイ読め
>>171
それだけじゃどっちでもいいとしか言いようが無い
174デフォルトの名無しさん:2006/10/22(日) 13:56:17
>>173
スレタイくらい承知の上で敢えて、「無理」と言っている。
現にあんただって(質問が悪すぎて)まともに回答できないじゃないか。
175デフォルトの名無しさん:2006/10/22(日) 13:57:38
はて、俺には>>173が的確な回答に見えてしょうがないんだが。
176デフォルトの名無しさん:2006/10/22(日) 14:00:48
二次元配列とstrcat()は排他なのか?
177デフォルトの名無しさん:2006/10/22(日) 14:53:59 BE:69893227-2BP(204)
二次元配列で処理するって、どう使うつもりなんだろ?
178デフォルトの名無しさん:2006/10/22(日) 18:27:14
>>171
printf( "1番%sが塁に出て", name[0] );

これの繰り返しで良いんじゃないか?
179デフォルトの名無しさん:2006/10/23(月) 00:11:42
printf("%d番%sが塁に出て", i, name[i]);

これの繰り返しで良いんじゃないか?
180デフォルトの名無しさん:2006/10/23(月) 00:16:26
>>178>>179
2番以降は塁にでるって文章じゃねえ
181デフォルトの名無しさん:2006/10/23(月) 00:56:17
ノリのいいツッコミありがとう
182デフォルトの名無しさん:2006/10/23(月) 01:25:04
みんな塁に出てなにが悪いというのだ
183デフォルトの名無しさん:2006/10/23(月) 01:48:12
歌の通りだったらよかったのにねぇ……
184デフォルトの名無しさん:2006/10/23(月) 04:20:09
>>171
printf("一番 %sが塁に出て", name[0] );
printf("二番 %sが送りバント", name[1] );
printf("三番 %sタイムリー", name[2] );
printf("四番 %sホームラン", name[3] );
printf("五番 %sがクリーンヒット", name[4] );
printf("六番 %sが流し打ち", name[5] );
printf("七番 %sヒットエンドラン", name[6] );
printf("八番 %sがスクイズバント", name[7] );
185デフォルトの名無しさん:2006/10/23(月) 07:01:23
printf("一番 %sが塁に出て"
"二番 %sが送りバント"
"三番 %sタイムリー"
"四番 %sホームラン"
"五番 %sがクリーンヒット"
"六番 %sが流し打ち"
"七番 %sヒットエンドラン"
"八番 %sがスクイズバント",
name[0], name[1], name[2], name[3], name[4], name[5], name[6], name[7]);
186デフォルトの名無しさん:2006/10/23(月) 07:32:40
つ改行
187デフォルトの名無しさん:2006/10/23(月) 07:34:48
name[0]〜name[7]に改行いれときゃいいんじゃね?
188デフォルトの名無しさん:2006/10/23(月) 08:53:29
#include <stdio.h>
#include <string.h>
int main(void)
{
int i,l;
char dra[8][2][25]={
{"","一番が塁に出て"},
{"","二番がヒットエンドラン"},
{"","三番タイムリー"},
{"","四番ホームラン"},
{"","五番がクリーンヒット"},
{"","六番が流し打ち"},
{"","七番ヒットエンドラン"},
{"","八番がスクイズバント"}
};
for(i=l=0;i<8;i++){
printf("%d番の選手の名前を入力してください",i+1);
fgets(dra[i][0],25,stdin);
l=strlen(dra[i][0]);
if(dra[i][0][l-1]=='\n')dra[i][0][l-1]='\0';
}
for(i=0;i<8;i++)printf("%.4s %s%s\n",dra[i][1],dra[i][0],dra[i][1]+4);
return 0;
}
189デフォルトの名無しさん:2006/10/23(月) 14:38:09
[8][2][25]
190デフォルトの名無しさん:2006/10/23(月) 20:55:35
出力ファイルとは「._」が付くやつでしょうか?
出力したのに中身は変わっていませんがいいのですかね?
191デフォルトの名無しさん:2006/10/23(月) 21:54:31
>>190
日本語でおk
192190:2006/10/23(月) 22:50:39
出力ファイルの意味がわからないんです、コピーされてできたのが
そうなんでしょうか?
193デフォルトの名無しさん:2006/10/23(月) 23:04:07
>>192
大まかにいうとプログラムから出てきたのが出力ファイル。
.xxx(拡張子)が付いてようがいまいが、ファイルには違いない。
194192:2006/10/23(月) 23:11:32
ありがとうございます。
入門書を読んでも出力ファイルは何に使うのか?理解しがたいです
単なるコピー?なんですかね。入門書に依れば移動するファイルとの
事です。
195デフォルトの名無しさん:2006/10/23(月) 23:37:56
Cを覚える為にはアセンブラは必須と言われました。
マジ?
196デフォルトの名無しさん:2006/10/23(月) 23:40:49
必須か?と聞かれれば
いいえと答える
197デフォルトの名無しさん:2006/10/23(月) 23:43:07
Cでオブジェクト指向は出来ないの?
198デフォルトの名無しさん:2006/10/23(月) 23:49:06
>>194
プログラムを FAX に例えよう。
ファイルというのは紙のことだ。
出力ファイルというのは、FAX から送信されて出てきた紙のことだ。

つまり、貴方の質問はこういうことになる。

「家のFAXから紙が出てきました。これは何に使うんですか?」

こちらとしては、どこから届いたのか、紙に何が書かれているか、すらわからないのに答えられるわけが無い。
199デフォルトの名無しさん:2006/10/23(月) 23:51:03
>>195
必須ではないが知識があればすんなりと理解できるところがある。
知識がないと苦労ことがあるらしい。
200デフォルトの名無しさん:2006/10/23(月) 23:58:03
>>197
言語仕様がオブジェクト指向プログラミングをするためにできていないというだけで、できないわけではない。
201デフォルトの名無しさん:2006/10/24(火) 01:04:22
質問させてください
プログラム内でchar型の変数にint型の変数を代入させるにはどうしたらいいのでしょうか
(char)hennsuu1.[data ] = (int)value;
strcpyを使ってhennsuu1に値を入れることはできるのですが
int型の変数を入れることが何故かできないのです。。。
どなたか教えてください
202デフォルトの名無しさん:2006/10/24(火) 01:07:58
char a;
int b;

a=b;
203デフォルトの名無しさん:2006/10/24(火) 01:09:10
よくわからんが、整数を文字列にしたいのなら itoa
204デフォルトの名無しさん:2006/10/24(火) 03:32:03
まぁ、sprintf()を使え。
205デフォルトの名無しさん:2006/10/24(火) 07:00:08
  、-.、._                                .__
    `ヽ、"''ー、._                       _,、-‐'" ̄/
      \   ~''ー--、__           ,,、-―''"~"~   /
        ヽ、   ,    ヾ'ヽ、__    ./'i~ ̄         ./
         \  |!   丶、\"ーェ''7 /    /   _..,,ノ
           `ヽ|`ー-、___"''ゝー<''~ ,,、-'"~i-ー''"~
                 ,,.-‐''""""'''ー-.、     
                ,ィ"          \       
               /             `、
              ,i       ,-っ hennsuu i
             /⌒ヽ'_ー-/ _).ィ‐‐-,,_  __|
             | r,i \\//-l;l : : : `l-r'"メ、
             ヾ、  \/  `ー‐'": i!_,l_ノ`   まだまだだな
              |         ,:(,..、 ;:|/.     
              |        ,,,..;:;:;:;,/      
              \ `::;;.   '"`ニ二ソ\_二つ 
                \ ゙゙:`-、;:;:;;;:;:;:;;/   
                 /  /~\ \     
                 /  /   >  )   
               / ノ    / /      
              / /   .  / ./       
              / ./     ( ヽ、        
             (  _)      \__つ 
206デフォルトの名無しさん:2006/10/24(火) 08:08:40
itoa() は標準じゃないから気をつけろ
207デフォルトの名無しさん:2006/10/24(火) 08:31:48
それ系の関数の読み方というか関数名の意味がわからず苦労した
atoiアトイ?fabsファブス?とかw
208デフォルトの名無しさん:2006/10/24(火) 09:23:19
スタジオドットエッチ
209デフォルトの名無しさん:2006/10/24(火) 12:34:36
POINT pt[300];

この場合、&pt[n](nは任意の整数0<300な)ってどういう意味だっけ?
210デフォルトの名無しさん:2006/10/24(火) 12:42:49
pt+n
211デフォルトの名無しさん:2006/10/24(火) 13:56:02
>>210さん、どうもありがとう
212デフォルトの名無しさん:2006/10/24(火) 14:56:32
ヘッダファイルでグローバル変数を宣言しようとしてるのですが、うまくいきません。
単純化したものを作ってみたのですが、それでも失敗してしまいました。
何が間違ってるのかご指導をお願いします。

/*********/
/* main.c */
/*********/

#include "myhead.h"

int main(void){
 func();
 x = x+1;
 printf("%d\n",x);
 return 0;
}

/*********/
/* func.c */
/*********/

#include "myhead.h"

void func(void){
 x = 1;
}

改行が多いと怒られたので次へつづく
213212の続き:2006/10/24(火) 14:57:02

/***********/
/* myhead.h */
/***********/

#include <stdio.h>

void func(void);

#ifndef MYHEAD_INCLUDED
#define MYHEAD_INCLUDED
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN int x;

それで、実行結果は

>bcc32 main.c func.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
main.c:
func.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Warning: パブリックシンボル _x がモジュール C:\BORLAND\KADAI\07\DIVTEST\MAIN.OBJ と C:\BOR
LAND\KADAI\07\DIVTEST\FUNC.OBJ の両方に定義されている

となってしまいます。
よろしくお願いします。
214デフォルトの名無しさん:2006/10/24(火) 15:12:28
1 2 3
2 5 8
12 8 1
10 3 5
5 2 3

というようなデータファイルをfopenで読み込み、行ごとにテキストファイルに内容を以下のように書き換えて出力
したいと思ってます。
/***新しくdata1.txtを作り保存する***/
x1 = 1
x2 = 2
x3 = 3
/***************/

/***data2.txtも同様***/
x1 = 2
x2 = 5
x3 = 8
/***************/

/***data3.txt***/
x1 = 12
x2 = 8
x3 = 1
/***************/



といったように生成していきたいのですが、
何かよい方法はありますでしょうか?
215デフォルトの名無しさん:2006/10/24(火) 15:19:03
>>212
>bcc32 main.c func.c

ってやったときにmain.cでMYHEAD_INCLUDEDが#defineされるから、
次のfunc.cでは#elseが有効になると思ってる?
残念ながらならないよ。

プリプロセッサはそれぞれの.cファイルで独立して起動されるから、
どっちもMYHEAD_INCLUDEDが#defineされてない状態で起動される。
216212:2006/10/24(火) 17:07:05
>>215
レスありがとうございます。

…という事は、私が望む動作は
・ヘッダファイルでは extern int x;
・main.cかfunc.cにグローバル変数として int x;
とするしかない(ほかにあったとしても回りくどい方法だけ)
という認識でOKでしょうか?
217デフォルトの名無しさん:2006/10/24(火) 18:08:45
>>216
あるいは

/*********/
/* main.c */
/*********/

#define MYHEAD_INCLUDED /* 追加。名前はもっといいの考えて */
#include "myhead.h"


のようにすればよい。名前にINCLUDEDなんてついていたら
わけがわからんので、その辺は適当に。
218デフォルトの名無しさん:2006/10/24(火) 18:10:41
あ、これじゃあちょっと駄目か。
myhead.hの#ifndefを#ifdefにした方がいいね。
これでmain.cでのみ確実にxが定義されて、
他では宣言になる。
219デフォルトの名無しさん:2006/10/24(火) 18:14:22
しかしそんな技巧は今時流行らない。
220デフォルトの名無しさん:2006/10/25(水) 05:36:34
ヘッダは宣言に使うものであって定義に使うものではありません
221デフォルトの名無しさん:2006/10/25(水) 13:00:19
char s[10];
char* p = s;
@
p + 100;
A
p += 100;
B
p += 100;
*p;
どの時点で未定義ですか?
それともすべて未定義?
222221:2006/10/25(水) 13:00:50
スレ間違えました
無視してください
223デフォルトの名無しさん:2006/10/25(水) 20:15:09
impossible to open chinouglと出ますが、どうすればいいんですかね?お願いします。
224デフォルトの名無しさん:2006/10/25(水) 20:35:13
ビット論理演算子の(Aは同じ関数をとる)
A^A→0
になるのは何がすごいのでしょうか・・・
何かこれに感激しないといけないらしいのですが^^;
225デフォルトの名無しさん:2006/10/25(水) 20:45:42
感激したが、すごくはないぞ。
226デフォルトの名無しさん:2006/10/25(水) 20:48:10
なくなって初めて気付くありがたみってやつですよ
227デフォルトの名無しさん:2006/10/25(水) 22:52:00
センベイって美味いか?
228デフォルトの名無しさん:2006/10/25(水) 23:16:33
これらの違いがわかりませんので
助言、お願い致します。

char str[] = "Hello!" と char key[128] = "abc"
一見、同じ意味に見えてしまうのですが、何が違うのでしょうか?
char keyだと一列が一個だけ、このように"abc"
char strだと一列を複数入れられるのでしょうか?char str[] = {"abc","def","ghi"}
なのでしょうか?
229デフォルトの名無しさん:2006/10/25(水) 23:22:17
char str[] = "Hello!"
と書くと
char str[7] = "Hello!"
とコンパイラが判断してくれる
それだけ
230デフォルトの名無しさん:2006/10/25(水) 23:27:50
>>229
??? 何か違うのでしょうか?
231デフォルトの名無しさん:2006/10/25(水) 23:29:30
違わないでしょ
232デフォルトの名無しさん:2006/10/25(水) 23:31:46
>>231
とう言うと同じなのでしょうか?
混乱してしまいます。

char keyだと一列が一個だけ、このように"abc"
char strだと一列を複数入れられるのでしょうか?char str[] = {"abc","def","ghi"}

の差ではないのでしょうか?

233デフォルトの名無しさん:2006/10/25(水) 23:39:12
char str[] = {"abc","def","ghi"} 

コンパイル通らんよ

char* str[] = {"abc","def","ghi"} 
と勘違いしてない?
234デフォルトの名無しさん:2006/10/25(水) 23:41:26
>>228
前者は H e l l o ! ヌル の7文字分確保される。
後者は128文字分確保した上で、先頭から a b c ヌル の4文字が入れられる。
それだけのこと。

>>232のような差ではない。
235デフォルトの名無しさん:2006/10/25(水) 23:45:48
char str[] = "Hello!"
→ char str[7] = "Hello!"
→ char str[7] = {'H', 'e', 'l', 'l', 'o', '!', '\0'};

char key[128] = "abc"
→ char key[128] = {'a', 'b', 'c', '\0', '\0', ..., '\0'};
236232:2006/10/25(水) 23:48:03
ぐは〜考えれば考えるほど混乱します・・・・
一旦、整理してから出直してきます。
ありがとうございました。
237232:2006/10/25(水) 23:54:15
>>233
そのようでした、では char str[] = {"abc","def","ghi"} いう形は
存在しないんですね

>>234
そうですか、わかりました。

>>235
となると、>>234で書かれた事と同じ、[]内の確保数の
問題で意味は同じと考えて宜しいんですね?
238デフォルトの名無しさん:2006/10/26(木) 00:11:24
俺10枚も書けるかなあ
関連研究9枚でいいですか?
239デフォルトの名無しさん:2006/10/26(木) 00:18:16
Windowsプログラムの質問ここでいいですか?

BCB5ラーニング使用してるんですが
Windows XP標準の圧縮(ZIP)ありますよね
プログラム側から制御する方法ってありますか?
240デフォルトの名無しさん:2006/10/26(木) 00:26:08
>>239
シェルフォルダとして扱えるらしい。
http://forums.belution.com/ja/vc/000/368/03s.shtml
#importがBCBでも使えるかどうかは知らないが。
241デフォルトの名無しさん:2006/10/26(木) 00:38:32
>>240
おおおおっ!!
ありがとうございます
がんばってみます
お世話になりました
242デフォルトの名無しさん:2006/10/26(木) 13:22:20
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2819.txt
教授からもらったプログラムがコンパイルできません。学校ではエラーが出ますが、一応コンパイルは通りました。
家だとコンパイルさえ通りません。環境はBCC developer です。






コレをお願いします
243デフォルトの名無しさん:2006/10/26(木) 14:06:28
>>242
学校の環境と自宅の環境は一緒なの?

うちはBCC developer じゃないんだけど
ちなみに関数内の関数宣言は通らないので
外に出したらコンパイル通ったよ
244デフォルトの名無しさん:2006/10/26(木) 14:21:22
>>243
学校の環境と自宅の環境は違います。学校のはよくわかりません。
関数を外にだしても動作は変わりませんか?
245デフォルトの名無しさん:2006/10/26(木) 14:31:35
>>244
関数 bfs が 関数 breadth_first のデータにアクセスしてるから
それを解決すればおk
俺は bfs の引数に
int *parent, int *blabel, int *queue を追加した

あと出来るならテストデータも示してみて欲しい
正常な動作か判断できないので

コンパイラによっては関数内の関数宣言を許してないからそれが原因かもね
(俺の場合むしろ逆で関数内で関数宣言するコンパイラを知らない)
246デフォルトの名無しさん:2006/10/26(木) 14:40:09
>>245
ファイルアップしていただけませんか?
247デフォルトの名無しさん:2006/10/26(木) 14:53:16
>>246
アップローだ初めて使ったよぉ

http://sa-wiki.com/upload/src/up0052.txt

こんな感じになった
あくまで処理内容まで理解していないから
そちらの環境で正常動作するかは不明だよ
248デフォルトの名無しさん:2006/10/26(木) 15:08:08
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2822.txt
入力データはこんな感じなんですが、
アップして貰ったので実行するとバグってしまいます・・・・
教授がうざい・・・・
249デフォルトの名無しさん:2006/10/26(木) 15:17:51
>>248
今デバッグ中・・・ちょっと待ってて
250デフォルトの名無しさん:2006/10/26(木) 15:50:30
>>248
ゴメンね
デバッグやったらいくつかミスってた

テスト結果はアップしたテキストにあります
結果はあってますか?確認してください

http://sa-wiki.com/upload/src/up0053.txt

変更点
bfs関数の引数に int *k を追加しました
251デフォルトの名無しさん:2006/10/26(木) 15:52:58
>>248
ごめん
main(void) の scanf("%d", &directed); は消してね
俺の環境だとウィンドウすぐに閉じちゃうから入れといただけ
意味は無いから
252デフォルトの名無しさん:2006/10/26(木) 15:53:03
>>250
合ってます!まじでありがとうございます。
元のプログラムはプログラムとしてダメだってことですよね?
253デフォルトの名無しさん:2006/10/26(木) 15:59:25
>>252
プログラムとしてって考えると微妙だな
どちらともいえない
まぁ自分だけの環境ならいいけど
いろいろな環境でコンパイルされるコードを考えるなら
関数内に関数宣言入れたのはどうかと思う
ましてや教授って大学でしょ?ならコンパイラに依存する処理はするべきじゃないと思うよ
とはいえ関数を外に出しただけだからアルゴリズムはあってるって事

254デフォルトの名無しさん:2006/10/26(木) 16:00:21
環境はVC++6です

fgetsで文字列を無制限に取る場合はどうしたら良いですか?
よろしくお願いします。
255デフォルトの名無しさん:2006/10/26(木) 16:04:10
>>253
大学の教授ですよ・・・
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2823.txt
実はコレも同じような書き方されててさっきのを参考に直そうとしたんですが、うまくなおせません・・・・
256デフォルトの名無しさん:2006/10/26(木) 16:16:14
最低限どういうプログラムなのかくらいコメント入れろよ…
257デフォルトの名無しさん:2006/10/26(木) 16:21:41
先ほどのは入力グラフに対して幅優先探索
今のは深さ優先探索を行うものです!
すいません
258デフォルトの名無しさん:2006/10/26(木) 16:25:45
>>255
最初のソースなんだけど 最初の
bfs( v , parent , blabel , queue , &rear , &k );
の呼び出し削除してください
よく見たら要らないものだった

http://sa-wiki.com/upload/src/up0054.txt

で次のソースもアップします

http://sa-wiki.com/upload/src/up0055.txt
こちらも基本は同じです
関数を外に出すだけです

実行チェックしてみてください
259デフォルトの名無しさん:2006/10/26(木) 16:30:29
>>258
正しく動作しました。何のプログラムかも述べないのに、対応してくださって、感謝します
260デフォルトの名無しさん:2006/10/26(木) 16:32:19
>>257
先ほどのテストデータ入力した結果です
あってますかね?
http://sa-wiki.com/upload/src/up0056.jpg

>先ほどのは入力グラフに対して幅優先探索
>今のは深さ優先探索を行うものです!
そうだったんだ
何のプログラムかなぁとは思ってたんだけど
261デフォルトの名無しさん:2006/10/26(木) 16:37:42
void main()とか書くのが教授やっていいのか…
262デフォルトの名無しさん:2006/10/26(木) 16:38:25
>>260
画像まで丁寧にどうも。本当に助かりました
263デフォルトの名無しさん:2006/10/26(木) 16:45:19
問:既知の要素数の一次元配列を大きい順に並べ替える方法を考えなさい。(ただし、なるべく速く、変数を多く使わないもの)

0からnまでの各項についてその項以降の最大値と交換

みたいな感じであってる?
264デフォルトの名無しさん:2006/10/26(木) 16:54:26
>>261
俺は勉強中でやっと初心者と呼んでもいいレベルかな?ってくらいの人間なんだけど、
教授クラスだったら「void main()」の部分はどうあるべきなの?

正常か異常かステータスくらいは返すべきって?
引数をとらないんだったらmain(void)って書くべきって?
それとももっと深い?
265デフォルトの名無しさん:2006/10/26(木) 17:08:01
>>262
どういたしまして

>>263
比較回数は (n-1)!回
配列  + 変数 n + for分のネストで2つ

計算量で言えば

基本交換法,基本選択法,基本挿入法 N(N-1)/2 回
クイックソート,マージソート,ヒープソートが N log? N 回 ←こっちのほうが早い
266デフォルトの名無しさん:2006/10/26(木) 17:15:46 BE:175574944-2BP(5)
すんません質問です

変数 oppai と oppai2 の剰余算結果を10進数で出力するとき

printf("%d %% %d = %d",oppai,oppai2,oppai%oppai2); /*改行略*/

右の変数のところは oppai%%oppai2 にしなくていいんですよね
267デフォルトの名無しさん:2006/10/26(木) 17:17:43
>>266
必要ない
268デフォルトの名無しさん:2006/10/26(木) 17:18:20 BE:888845999-2BP(5)
>>267
ありがとう
269デフォルトの名無しさん:2006/10/26(木) 17:37:43
すまん正確にはvoid main(void)だったな
>>264
ANSI Cでmainはintを返すと規定されてる、ただそれだけ
270263:2006/10/26(木) 18:15:42
>>265
d
271デフォルトの名無しさん:2006/10/26(木) 19:04:56
なるほど、int mainでなければ駄目だって話ですか。
272デフォルトの名無しさん:2006/10/26(木) 19:22:42
次のコードで警告が出るのですがなぜでしょうか?
ちゃんとポインタを渡しているのに。。

#include<stdio.h>

main()
{
char * p;

gets(p);

printf(p);
}

エラーは次のとおりです

C:\Lsic86\MySrc>lcc test.c
test.c 8: Warning: 'p' used before set
lld @link.i
273デフォルトの名無しさん:2006/10/26(木) 19:24:45
それはpがどこも指し示していない状態のまま使われているという警告。

ポインタではなく、配列を使え。
ついでに言うとgetsでは無く、fgets使え。
274272:2006/10/26(木) 19:39:52
>273

ありがとうございます。何とか理解できました!しかし、また疑問が出てしまいました。。。

今度は次のプログラムを作ったのですがうまく、構造体の中のポインタにアドレスが
入ってくれないみたいで出力結果が(NULL)になってしまいます。

struct Jyusyoroku{
char *name;
char *jyusyo;
char *tel;
};

main()
{
struct Jyusyoroku one[5];

puts("氏名を入力して下さい");
fgets(one[0].name,20,stdin);

puts("住所を入力して下さい");
fgets(one[0].jyusyo,20,stdin);

puts("電話番号を入力して下さい");
fgets(one[0].tel,20,stdin);

printf("%s\n",one[0].name);
printf("%s\n",one[0].jyusyo);
printf("%s\n",one[0].tel);
}

構造体ではfgets()は使えないのでしょうか?
275デフォルトの名無しさん:2006/10/26(木) 19:45:48
理解できてねえぞカス
276デフォルトの名無しさん:2006/10/26(木) 20:01:25
それはname,jyusyo,telがどこも指し示していない状態のまま使われているというバグ。

ポインタではなく、配列を使え。
ついでに言うと配列ではなく、malloc使え。
277デフォルトの名無しさん:2006/10/26(木) 20:04:47
つべこべ言う前に辞書引けよと思うのが俺だけだったら寂しい
278デフォルトの名無しさん:2006/10/26(木) 20:04:51
>>274
君さ、不動産屋でアパートを下見に行くとき住所も地図も書いてない紙を渡されたとして、
何の疑問も持たずその紙を頼りに下見に行こうとするかね。どこに行けばいいか混乱するか、
不動産屋に文句を言うだろう。

ポインタは住所を書く紙に当たっていて、初期化のしてないポインタは
まだ住所が書かれてない紙切れにすぎない。
ポインタはどっかの場所を指し示すものだ。だが、初期化してないポインタは
どこを指しているかわからない。

どこを指しているかもわからないところを指定して氏名を入力させたら混乱が起きる。
それはたとえば風呂場と書いてあるラベルが道路の真ん中にあって、
そこで服を脱いで湯船に浸かろうとする行為と似ている。

ちゃんと風呂場の場所をおしえてやらないといかんぞ。
279デフォルトの名無しさん:2006/10/26(木) 20:07:54
ポインタを要求する関数で 本当にポインタを渡すのは file系(FILE* fp の fp) ぐらいで
あとは、実体(配列の先頭 or 変数の & 付き) を求めている

と考えたほうが始めのうちは楽ちん。
280デフォルトの名無しさん:2006/10/26(木) 20:21:42
>>274
せめてこうだな

struct Jyusyoroku{
char name[20];
char jyusyo[20];
char tel[20];
};

main()
{
struct Jyusyoroku one[5];

puts("氏名を入力して下さい");
fgets(one[0].name,20,stdin);

puts("住所を入力して下さい");
fgets(one[0].jyusyo,20,stdin);

puts("電話番号を入力して下さい");
fgets(one[0].tel,20,stdin);

printf("%s\n",one[0].name);
printf("%s\n",one[0].jyusyo);
printf("%s\n",one[0].tel);
281デフォルトの名無しさん:2006/10/26(木) 20:22:57
てかFILE *系だってfopenで初期化しないと駄目じゃないか。
ポインタを渡す関数で初期化してないポインタなんか渡されても、
何にもしようがないと思うぞ。
282280:2006/10/26(木) 20:30:52
>>281
いや stdin 指定してるからおk
283デフォルトの名無しさん:2006/10/26(木) 20:33:38
>>281
まぁね。
FILE* 系をポインタと認識しない考え方でも良いんじゃないか? ってところで…
 fp を剥がす(実体参照する)ことはない
 オブジェクト指向してる
で、ちょっと特異な部類じゃね?

# FILE f; fopen(&f, <name>, <mode>); ってなってたら、どうだったのだろうか・・・
284デフォルトの名無しさん:2006/10/26(木) 21:25:23
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2826.txt
int型の配列をクイックソートするプログラムなのですが、NUMの数を増やすと
(100位にすると)ものすごい時間がかかってしまいます。
どこがおかしいのかわかる方教えてください。お願いします。
285272:2006/10/26(木) 21:26:47
たくさんレスをいただきありがとうございます。

何とか分かりました…どこも指してないポインタをfgets()に
渡したところでどこに文字列を入れていいか分からないってことですね…

char ch[5];としたときの ch と
char *ch;としたときの ch の違いをよく考えれば
分かることでしたね…お手数をおかけしました。
本当にありがとうございます!
286デフォルトの名無しさん:2006/10/26(木) 22:24:28
>>284
今、調べてるんだけどさ

NUM = 80で

void quicksort(int *arr,int s,int e) 呼び出しが 3億4千万回

else if(s==e){
quicksort(arr,0,s-1);
quicksort(arr,s+1,b);
}
この処理に至っては1億回繰り返されてる

他の分岐は多くて100回前後なのに

↑この処理に問題ありそう

もう少し調べてみる



287デフォルトの名無しさん:2006/10/26(木) 22:37:02
なんとなくだけど NUM が 3 だと怪しくね?
288284:2006/10/26(木) 22:46:33
>>286>>287
レス&色々とお調べいただいてありがとうございます。
自分なりにない知恵を振り絞り考えてみたのですが、
>>286さんがおっしゃるとおり最後の再帰させる分岐が悪いようです。
quicksortのなかでint a=s;を宣言して最後の再帰の部分を以下のように
訂正するとうまくいきました。
(書き込みエラーが出るので他の部分端折ってます)

else if(s==e){
quicksort(arr,a,s-1);
quicksort(arr,s+1,b);
}
else{
quicksort(arr,a,e);
quicksort(arr,s,b);
}

色々とお騒がせして申し訳ありませんでした。
色々と試していただいた方本当にありがとうございます。
以降こういうことが内容精進します。
289デフォルトの名無しさん:2006/10/26(木) 22:48:14
すいません、学校の課題なんですが質問よろしいでしょうか?
nとint型オブジェクトを指すポインタpを引数として、ポインタpにより示されるint型配列の、n要素分の和を計算する関数sumintを作成しなさい。
そして、nを入力した後、int型配列dにn個の整数値を入力して、関数sumintにより配列dに収められてる値の和を計算して出力するようなmain関数も作成しなさい。
関数sumintの概要は以下の通り。
(1)関数名:sumint
(2)形式:int sumint(int n, int *p);
(3)機能:第2引数pで指示されたint型配列のn(第1引数)個分の和を計算して、その和を戻り値とする。
(4)戻り値;int方配列に納められたn個分の和,int型。
#include<studio.h>
int sumint(int , int *);
main()
{
int n, i, d[100];
printf("nを入力してください\n");
.
.
printf("合計: %d\n", sumint(n, d));)
}
int sumint(int n, int *p)
{
int i, sum = 0;
.
.
return sum;
}
実行例
nを入力してください
6
n個の整数を入力してください
129 3120 -495 23 780 -458
合計: 3099
290デフォルトの名無しさん:2006/10/26(木) 22:50:10
s=0, e=2 等の 3個区画で無比較/無交換のまま抜けるけど…
最終的にsort される?
291284:2006/10/26(木) 23:14:04
>>290
3個の場合でも基準値nを作った後でs--とe++しているため、
比較・交換はされているようです。
292デフォルトの名無しさん:2006/10/26(木) 23:17:24
>>291
あ。 ごめん s++ e-- と読み間違えた orz
293284:2006/10/26(木) 23:24:13
>>292
こちらこそお手数をおかけしてすみませんでした。
色々とご検証いただきありがとうございました。
294デフォルトの名無しさん:2006/10/26(木) 23:25:37
>>289
これでいいのかな

#include <stdio.h>
int sumint(int , int *);
int main()
{
int n, i, d[100];
printf("nを入力してください\n");
scanf("%d" , &n );
for( i=0 ; i<n ; i++ )
{
printf("%d個目の整数を入力してください\n", i+1);
scanf("%d" , &d[i] );
}
printf("合計: %d\n", sumint(n, d));
return 0;
}
int sumint(int n, int *p)
{
int i, sum = 0;
for( i=0 ; i<n ; i++ )
{
sum += p[i];
}
return sum;
}
295どんずまり:2006/10/26(木) 23:28:16
初めての投稿で質問なのですが、自分で作ったファイルの文字数や作成した日付を
出力するプログラムを作ったのですが、どうやってもファイルの作成者の名前が出せません、stat関数で最終更新日や
曜日などは出来たのですが、もうわかりません。
296デフォルトの名無しさん:2006/10/26(木) 23:31:58
>>295
よくわからんけど、ls -lしたときに出てくるログイン名のこと?
297どんずまり:2006/10/26(木) 23:44:06
ログイン名ではなくファイル作成者の名前が出力されれば正解なんですが・・・
298どんずまり:2006/10/26(木) 23:45:11
stat関数を使うみたいですがさっぱりです。
299デフォルトの名無しさん:2006/10/26(木) 23:47:21
if( i == 0 || f()){
}else{
}

i == 0のとき関数f()は実行されるの?

300デフォルトの名無しさん:2006/10/26(木) 23:47:51
されない
301どんずまり:2006/10/27(金) 00:12:30
system(ls-l)のリダイレクト?
実行したモジュールがなんやらかんやら・・・
ってわかりますか?
302デフォルトの名無しさん:2006/10/27(金) 00:22:03
凄い初歩的なことで申し訳ないんですがint sum(int a[], int n);を使って、
int num[10] = {34, 19, 44, 57, 79, 88, 12, 33, 11, 20};の
合計を求めるにはどうすればよいのでしょうか?
303デフォルトの名無しさん:2006/10/27(金) 00:22:10
> どんずまりさん
環境がわからないと誰も答えられないと思います
Linuxなら
stat関数でファイルのstat構造体を取得する
stat構造体のst_uidからgetpwuid関数でpasswd構造体のポインタを取得する
passwd構造体のpw_nameがファイル作成者のユーザ名
304デフォルトの名無しさん:2006/10/27(金) 00:24:21
>>302
その関数sumは与えられてるの?
305どんずまり:2006/10/27(金) 00:31:00
getpwuid()関数で()の中にstat関数で取得したアカウントを入れれば
ユーザー名がでませんか?
306303:2006/10/27(金) 00:42:19
>>305
出るはずですけど、出ませんか?

struct stat stat_buf;
struct passwd *pw_buf;

if (stat("ファイルパス", &stat_buf) != 0) {
  /* エラー */
}

if ((pw_buf = getpwuid(stat_buf.st_uid)) == NULL) {
  /* エラー */
}
/* pw_buf->pw_nameがユーザー名 */
307デフォルトの名無しさん:2006/10/27(金) 00:56:25
>>304
多分与えられてないと思います。
308どんずまり:2006/10/27(金) 01:03:50
>>303さん
Linuxです、Viエディタを使っています。
私も今さっきまでgoogleで調べていましたが多分303さんのやり方で出来ると思います、
自分の家に環境が整っていませんので明日試してみます。
これで今夜は安心して布団に入れます。
どうもありがとう御座いました。
309デフォルトの名無しさん:2006/10/27(金) 01:18:27
センベイって美味いか?
310デフォルトの名無しさん:2006/10/27(金) 05:05:45
#include <stdio.h>
#include <string.h>

main(){
char c;
char str[] = "Hello!";//暗号化する文字列
char key[128]; = "abc"; //暗号キー
int keylen;//文字列の長さ
int i = 0;//暗号キーの現在位置表す

int j = 0;//暗号化する文字列の現在位置を表す
char str_[256];//暗号した文字列を格納する変数

printf("文字列 \"%s\" をキー \"%s\" で暗号化\n",str,key);

//暗号化
keylen = strlen(key);
while(*(str+j) != '\0'){
c = *(str+j) + key[i++];
str_[j++] = c;
if(i >= keylen){i = 0;}
}

311デフォルトの名無しさん:2006/10/27(金) 05:06:40
str_[j] = '\0';
printf("暗号文字列 \"%s\" をキー \"%s\" で復号化\n",str_,key);

printf("原文:");

//復号化
j = 0;
i = 0;
while(*(str_+j)){
c = *(str_+j) - key[i++];
j++;
if(i >= keylen){i = 0;}
pritnf("%c",c);
}

return 0;
}


エラー E2188 eee11.c 7: 式の構文エラー(関数 main )
エラー E2140 eee11.c 8: ここでは宣言はできない(関数 main )
エラー E2140 eee11.c 9: ここでは宣言はできない(関数 main )
エラー E2140 eee11.c 11: ここでは宣言はできない(関数 main )
エラー E2140 eee11.c 12: ここでは宣言はできない(関数 main )
エラー E2206 eee11.c 33: 不正な文字 '(' (0x8169)(関数 main )
エラー E2379 eee11.c 33: ステートメントにセミコロン(;)がない(関数 main )
警告 W8065 eee11.c 36: プロトタイプ宣言のない関数 'pritnf' の呼び出し(関数 main
)
*** 7 errors in Compile ***

と表示されてしまいます、何処が違うのか、ご指摘お願い致します。
312デフォルトの名無しさん:2006/10/27(金) 05:28:06
>>310
7行目、=の前のセミコロンを取れ
35行目、括弧が全角
36行目、pritnf (綴り間違ってる)

てか、質問する前にエラーメッセージが出ている行を目を皿のようにして見るべし。
313デフォルトの名無しさん:2006/10/27(金) 05:28:46
Cpad for Borlandでgnuplotにグラフを出力させようとしてるんですが
popenに関して以下のようなエラーが出ます。
解決法がわかる方よろしくお願いします。
以下187行目〜
gp = popen(GNUPLOT_PATH, "w");
if(gp == NULL){
fprintf(stderr, "Oops, I can't find %s.", GNUPLOT_PATH);
exit(EXIT_FAILURE);
}
fprintf(gp, "plot '-' with lines\n");
for(n=0;n<=N-1;n=n+D){
fprintf(gp, "%f%f%f\n",x[n],y[n],z[n]);
}
fflush(gp); /* Don't forget to flush the buffer. */
getchar();
pclose(gp);


警告 W8065 simulate.c 187: プロトタイプ宣言のない関数 'popen' の呼び出し(関数 main )
警告 W8069 simulate.c 187: 移植性のないポインタ変換(関数 main )
警告 W8065 simulate.c 198: プロトタイプ宣言のない関数 'pclose' の呼び出し(関数 main )
314デフォルトの名無しさん:2006/10/27(金) 05:31:21
>>313
Cpad for Borlandって処理系はよくしらんのだが、
popenて関数はライブラリにあるのか?
これは規格にある標準関数じゃないぞ。
unix方面でよく使われている関数だ。
315デフォルトの名無しさん:2006/10/27(金) 05:43:07
>>312
ごめんなさい、見てもきづきませんでした(;_;)
ありがとうごさいました、これで先に勧めます
316デフォルトの名無しさん:2006/10/27(金) 05:49:04
>>313
_popen(), _pclose()じゃない?
317デフォルトの名無しさん:2006/10/27(金) 07:33:06
>>316
それはMSの環境でPOSIX由来の関数の先頭には_がつく例のアレではないかと思われ。
318デフォルトの名無しさん:2006/10/27(金) 10:40:19
typedef void (*RUBY_DATA_FUNC) _((void*));
これどういう意味ですか?

VALUE rb_data_object_alloc _((VALUE, void*, \
RUBY_DATA_FUNC, RUBY_DATA_FUNC));
これもわかりません。
ちなみに、VALUEはunsighned longです。
319デフォルトの名無しさん:2006/10/27(金) 14:57:22
君じゃ、まだrubyをハッキングするのは早いんじゃないか?
320デフォルトの名無しさん:2006/10/27(金) 19:57:33
>>302
>>294これじゃダメなのか?
(別の人だったらスマソ)
321デフォルトの名無しさん:2006/10/27(金) 23:00:08
現在大学の1年で、後期からC言語の勉強をしているのですが、おすすめの
参考書とかありますか?友達は「やさしいC」というのを買ったらしい
のですが、正直迷ってます。
322デフォルトの名無しさん:2006/10/27(金) 23:13:09
趣味グラマ程度になるレベルでいいのなら林晴比古
323デフォルトの名無しさん:2006/10/27(金) 23:14:33
>>321
言語の勉強も大事だけど・・・
アドレスとか数値や文字の表現方法とかOSとかの
コンピュータの動作原理を勉強するとC言語もよくわかる
324デフォルトの名無しさん:2006/10/27(金) 23:17:08
>>321
ひとつだけじゃなくていくつか読んだほうがいい
参考書とかって書く人によって考え方や捕らえ方が違うから
325デフォルトの名無しさん:2006/10/27(金) 23:19:16
大学一回生なんだけどC言語の初心者向けのお勧めのサイトってないですか?
よく理解してないのに聞きながら課題とか無理矢理終わらせてて
そろそろ限界かなと思うので
326デフォルトの名無しさん:2006/10/27(金) 23:37:13
>>320
すみません言葉足らずで、
キーボードから数値を入力をしないで直接合計を求めたいのです。
327デフォルトの名無しさん:2006/10/27(金) 23:43:39
>>325
勉強するならネットより本を読んだほうがいい
328デフォルトの名無しさん:2006/10/27(金) 23:53:22
>>326
これでどう?

#include <stdio.h>
int num[10] = {34, 19, 44, 57, 79, 88, 12, 33, 11, 20};
int sumint(int , int *);
int main()
{
int n, i;
printf("合計: %d\n", sumint(10, num));
return 0;
}
int sumint(int n, int *p)
{
int i, sum = 0;
for( i=0 ; i<n ; i++ )
{
sum += p[i];
}
return sum;
}
329デフォルトの名無しさん:2006/10/28(土) 00:05:38
>>327どうして?
330328:2006/10/28(土) 00:10:20
>>326
あっ引数が逆だ
しかも不要なコードが多かった

#include <stdio.h>
int num[10] = {34, 19, 44, 57, 79, 88, 12, 33, 11, 20};
int sum(int a[], int n);
int main()
{
printf("合計: %d\n", sum(num , 10 ));
return 0;
}
int sum(int a[], int n)
{
int i, s = 0;
for( i=0 ; i<n ; i++ )
{
s += a[i];
}
return s;
}
331デフォルトの名無しさん:2006/10/28(土) 00:12:18
>>329
ネット−>調べる
本−>勉強する

ネットはある程度基礎知識のある人が広く浅くいろいろな知識を得るのにはよい
基礎知識を学ぶならC関連の書籍を読むのがよい
332デフォルトの名無しさん:2006/10/28(土) 00:25:24
>>331
本には期待が強いけど、結局ゴミとなる本が多い・・
ネットはたまに良いのがあるが・・
333デフォルトの名無しさん:2006/10/28(土) 00:30:27
こと流行りの・流行った言語に関してはクズ本が溢れ返るからねえ…。
Cもそのひとつだし。

最近は教えることもないので入門書の類は立ち読みさえしてないんだけど、
なんかいいのありますかいね。
334デフォルトの名無しさん:2006/10/28(土) 01:03:46
つLanguageC FAQ

いや、マジでオススメっすよ。
335デフォルトの名無しさん:2006/10/28(土) 01:15:52
やっぱり K&R ?
336デフォルトの名無しさん:2006/10/28(土) 01:23:42
あれは古文書だからなー。
役に立たんと言うつもりは毛頭ないが、明らかに古いプロトタイプ宣言の作法とか、
正直時代に即してるとは言いがたいかと思われ。
そもそも入門向きでもないしな。
337デフォルトの名無しさん:2006/10/28(土) 01:30:15
古文書w 確かに入り口にするには敷居が高いか。
>>325 学生なら図書館あさってみたら?
ゴミ本つかむかもしれないけど、それも勉強のうちw
338デフォルトの名無しさん:2006/10/28(土) 01:32:39
>>330
夜遅くにわざわざありがとうございました。
339デフォルトの名無しさん:2006/10/28(土) 05:52:04
C言語はどうやれば覚えられますかね?
難しいです。
340デフォルトの名無しさん:2006/10/28(土) 06:44:45
>>334
ありがとう。でもそれ知ってたw

>>335
K&Rはもう要らないんじゃないかと思う。現代版として改訂したらわからないけど。
以前はK&Rくらいしかまともな本がなかったからみんなこれで勉強したけど。
今では比較的まともな本の部類にしかならないんじゃないかと思う。

他にあったのは三田本くらいかw こいつは本当に害毒だったw
341デフォルトの名無しさん:2006/10/28(土) 06:54:58
>>339
どんな言語(自然言語でもプログラミング言語でも)読み書きするのが基本。
たくさん読んでたくさん書く。

入門書をざっと読んであたりをつけたら、既存のソースを読みまくって、
改造しまくるのが勉強になるんじゃないかな。

ただいい入門書というのがなかなかお目にかかれないんだけれども。

Cで言えることはメモリのイメージを常に頭に置いてプログラムすることかなあ。
多分言語仕様とかその辺はすぐにマスターできると思うんだ。
forとかwhileとか関数とかその辺はあんまり難しくないでしょ?

実際のビットパターンまではイメージしなくてもいいけど、
変数がどこに存在するかとか、ポインタが指している先は何かとか、
その辺具体的なメモリのイメージを常に意識するのが上達のコツみたいな気がする。
あくまで気がする程度w けどCでプログラム組んでいるときに意識するのは常にここだ。
342デフォルトの名無しさん:2006/10/28(土) 07:54:28
>>318
RUBY_DATA_FUNCはvoid*を引数にとり、返り値がvoidの
関数へのポインタ。
343デフォルトの名無しさん:2006/10/28(土) 08:29:02
>>341に便乗するかもしれませんが、

サンプルソースがたくさん置いてあって、
見て勉強になるようなサイトは無いでしょうか?

入門書はほぼマスターして、コンソロールゲームくらいは作れますが、
それ以上には、なかなか抜け出せなくて、手詰まり状態です。
344デフォルトの名無しさん:2006/10/28(土) 08:53:36
>>343
Gnuの適当なツールのソースでも眺めてみたら?
Unix系のフリーのソフトは多くがソースを簡単に入手できるから、その気になれば宝の山だ。
#玉石混交という話もなくはないが。
345デフォルトの名無しさん:2006/10/28(土) 09:42:09 BE:89861663-2BP(204)
>>343
リストとかハッシュとかソートとか、アルゴリズムの基本的なところは勉強した?
まだなら、それ方面の本とかサイトとか読んでみたら?
346デフォルトの名無しさん:2006/10/28(土) 09:50:38
C++でコンパイルして実行速度を限界まで上げたいんですが
最適化:-O3(-O4?) -Os -march=i686
以外に何か無いでしょうか
347デフォルトの名無しさん:2006/10/28(土) 09:53:12
馬鹿?
348デフォルトの名無しさん:2006/10/28(土) 10:11:54
死ぬほどグイングインageたいね!
349デフォルトの名無しさん:2006/10/28(土) 10:25:46
>>346
まず、どこに時間がかかっているか調べろ。

それが判明したらそこを重点的に高速化する。
アルゴリズムを速いものに変えたり、その処理をなるべく使わないようにしたり、
腕に自信があればアセンブラで書いたりするなど。
350デフォルトの名無しさん:2006/10/28(土) 11:41:09
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2838.txt

二分探索木のデータの追加とデータの表示を行うプログラムです。
なぜかはじめのメニューを表示した後3.のプログラムを終了以外を選択すると
エラーが出ます。が、原因がさっぱりわかりません。
詳しい方教えてください。よろしくお願いします。
351デフォルトの名無しさん:2006/10/28(土) 11:44:39
Cの入門書は本屋で読んでみて良さそうなのをハズレ覚悟で買え
難しいのは応用であり、ポインタなんかも理論は簡単
主に使うのは参照渡しくらいで、*つければいいんだろ?程度で十分
あとは本で完全理解しようとせず、実際に書きながら覚えるしかない

一通り理解したら、一気にwindowsアプリに走れ。HSPと同じでグラフィカルだと楽しい。オブジェクト指向は書いてれば身につく
352デフォルトの名無しさん:2006/10/28(土) 12:03:46
一生身につかない奴もいるけどな
353デフォルトの名無しさん:2006/10/28(土) 12:07:30 BE:179723366-2BP(204)
>>352
オブジェクト指向とか構造化とか、書いてれば自然に身に付くってもんじゃないよな。
354デフォルトの名無しさん:2006/10/28(土) 12:21:32
>>353
たしかに構造化は自然には身につかないが、身につかないわけではないな
355デフォルトの名無しさん:2006/10/28(土) 12:33:00
OOP な他言語を使った経験がある奴は C でも OOP 的なコードを書ける、これは当たり前
しかし、全く OOP を知らない奴が独自に C 上の OOP を再発明できたとしたら
そいつはたぶん Stroustrup になれる
356デフォルトの名無しさん:2006/10/28(土) 12:39:37 BE:39938742-2BP(204)
OOの言語使っていても、OOPできないやつとかいっぱいいるし、
構造化言語使っていても、構造化プログラミングできてないやついっぱいいる。
357デフォルトの名無しさん:2006/10/28(土) 13:36:24
>>350
38行目のscanf()のフォーマット指定が間違っているから。
ついでに言えば、文字を扱う場合以外にcharは使わないほうがいい。
358デフォルトの名無しさん:2006/10/28(土) 17:26:53
MinGWでFAACというソフトをコンパイルしようとしているのですが、
mp4file_io.cpp: In member function `u_int64_t MP4File::GetPosition(FILE*)':
mp4file_io.cpp:39: error: request for member `hipart' in `fpos', which is of non-class type `fpos_t'
mp4file_io.cpp:39: error: request for member `lopart' in `fpos', which is of non-class type `fpos_t'
このようなエラーが発生して自己解決できません。これはいったい何を意味しているのでしょうか。
mp4file_io.cppの34行目〜
 fpos_t fpos;
 if (fgetpos(pFile, &fpos) < 0) {
 throw new MP4Error(errno, "MP4GetPosition");
 }
 uint64_t ret;
 FPOS_TO_VAR(fpos, uint64_t, ret);
 return ret;
また、別ファイル(mpeg4ip.h)で以下のように指定してありました。
 #define VAR_TO_FPOS(fpos, var) (fpos) = (var)
359デフォルトの名無しさん:2006/10/28(土) 18:01:22
>>358
VAR_TO_FPOSマクロじゃなくて、FPOS_TO_VARマクロの定義を張ってみてくれ。
360358:2006/10/28(土) 18:30:56
>>359
#if !__STDC__ && _INTEGRAL_MAX_BITS >= 64
#define VAR_TO_FPOS(fpos, var) (fpos) = (var)
#define FPOS_TO_VAR(fpos, typed, var) (var) = (typed)(_FPOSOFF(fpos))
#else
#define VAR_TO_FPOS(fpos, var) (fpos).lopart = ((var) & UINT_MAX); (fpos).hipart = ((var) >> 32)
#define FPOS_TO_VAR(fpos, typed, var) (var) = (typed)((uint64_t)((fpos).hipart ) << 32 | (fpos).lopart)
#endif
重要な部分をごっそり忘れていました…すみません。
ちなみに↑のエラーの後にVAR_TO_FPOSでも全く同様のエラーが発生します。
361デフォルトの名無しさん:2006/10/28(土) 19:03:20
プログラムの中で環境変数(例えばLANG=Cして英語環境にする)を決めうちにしたいのですが
どうすればいいのでしょうか?
362デフォルトの名無しさん:2006/10/28(土) 20:35:19
setenv("LANG=C");

setlocale("C");
363デフォルトの名無しさん:2006/10/28(土) 22:01:31
質問です。
3次元の配列を動的変数として宣言するにはどうしたらいいでしょうか?
364デフォルトの名無しさん:2006/10/28(土) 22:48:07
>>363
普通に
a[10][10][10]だとして
int *a;
a=malloc(10*10*10);
・・・
free(a);
ではダメ?
365デフォルトの名無しさん:2006/10/28(土) 23:14:54
質問です。
ネットで拾ったBMPファイルを読み込んでピクセルのRGBの値を参照するための関数が
Windowsでは使えていたのですがUNIXでは使えませんでした。
調べてみたところおそらくendianの違いなのではと考えました。
UNIXで使えるように修正するためには、

unsigned long hoge;
fread(&hoge, sizeof(unsigned long), 1, fp); // fpはファイルポインタ

この部分で hoge に格納されたバイトを逆順にする必要があると思うのですが
どうすれば良いでしょうか?
よろしくお願いします。
366デフォルトの名無しさん:2006/10/28(土) 23:40:31
>>364
'void *' 型は 'int *' 型に変換できない(関数 main() )
こういったエラーがでてしまうんですが・・。
367365:2006/10/28(土) 23:43:43
すいません。
ある程度自己解決しました。

>>363
int ***a; // a[x][y][z]としたい時,
a = (int ***)malloc(sizeof(int **) * x);
for (i = 0; i < x; i++) {
a[i] = (int **)malloc(sizeof(int *) * y);
for (j = 0; j < y; j++) {
a[i][j] = (int *)malloc(sizeof(int) * z);
}
}
という感じでいけるみたいです。
368側近中の側近 ◆0351148456 :2006/10/28(土) 23:49:45
>>367
(っ´▽`)っ
私も考えていたけど、それでいけると思う。
あと、freeは気をつけてね。
for (i = 0; i < x; i++) {
  for (j = 0; j < y; j++) {
    free(a[i][j]);
  }
  free(a[i]);
}
free(a);
というふうにしないとね。
あと、静的配列の初期化みたいに
memset(a, 0, sizeof(a));
は使えないから要注意や☆
369デフォルトの名無しさん:2006/10/28(土) 23:58:47
>>367 >>368
どうもありがとうございます。問題解決です。
助かりました^^。
370364:2006/10/29(日) 00:01:40
>>366
あっごめん
今アク禁で携帯からで
int a;
a=(int*)malloc(1000);だね
371364:2006/10/29(日) 00:03:17
>>366
解決しちゃったのか・・
訂正
int *a;
a=(int*)malloc(1000);
372デフォルトの名無しさん:2006/10/29(日) 00:15:22
>371
この質問者、マルチだけどね
373側近中の側近 ◆0351148456 :2006/10/29(日) 00:32:30
>>371
(っ´▽`)っ
それだと動的に配列サイズを変えることができるけど、
その度に設定値の再編成が必要になるね。
たとえば、
1次元目の配列サイズを50から100にすることで、
a[0][1][0]がa[0][0][50]になっちゃう。

設定値の再編成を不要にするには、
1次元目:実体配列
2次元目:1次元目へのポインタの配列
3次元目:2次元目へのポインタの配列
とする必要がある。
374デフォルトの名無しさん:2006/10/29(日) 00:32:37
>>365
Windowsはリトルエンディアンだが、Unixがリトルエンディアンでないとは限らない。
CPUがx86/x64だったりすればたとえUnixでもWindowsと同じリトルエンディアン。

エンディアンを決めるのはOSではなく、CPU周りのアーキテクチャ。
375364:2006/10/29(日) 00:43:55
>>372
そうだったのか
まぁいいや
どうせこのコード失敗作だし
これじゃ多次元配列構成できないじゃん
って気付け俺・・・・
>>367>>368で正解だね

携帯めんどくセー
誰だ俺と同じホストで悪さした奴は・・・・
376364:2006/10/29(日) 00:49:45
>>373
レス見れなかった
書き込んでるうちに新しいレスがついてる
訂正ありがと

あぁほぼ全ホストに規制が・・・・
377デフォルトの名無しさん:2006/10/29(日) 00:54:27
Cはまだまだこれからな初心者なんですが、勉強するのに何かオススメの本とかはありますか?
378デフォルトの名無しさん:2006/10/29(日) 00:59:29
>>360
そのマクロの辺りを調整してみたら?

>>377
書籍スレへどうぞ。
379デフォルトの名無しさん:2006/10/29(日) 05:05:06
>>377
他言語での経験も書いとけよ
書籍スレでは
380350:2006/10/29(日) 08:45:24
>>357
返事が遅くなってしまいましたがレスありがとうございました。
無事修正して雛形を作成することが出来ました。
ありがとうございました。またよろしくです。
381側近中の側近 ◆0351148456 :2006/10/29(日) 10:01:01
(っ´▽`)っ どうなの?

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/376
>>359
(っ´▽`)っ
関数Aの中のmallocで確保した領域が、
関数Bで定義されているポインタによって指されていれば
関数Bの中では確保されている状態です。
mallocがどこで行われようが、
問題はそれを指すポインタの有効範囲(スコープ)なんです。

(っ´▽`)っ
そもそもfreeをかけなければずっと確保し続けるというのが
C言語の仕様なのではなかろうか?

(っ´▽`)っ???
どうなんだろう?
ポインタのスコープを抜けると自動的にfreeをかけてくれる
ガーベジコレクションみたいな機能って
C言語のコンパイラにあるのかな?
382デフォルトの名無しさん:2006/10/29(日) 10:09:00
配列のメリットって何?
383デフォルトの名無しさん:2006/10/29(日) 10:11:39
添字が繰り返しで使いやすい
384側近中の側近 ◆0351148456 :2006/10/29(日) 10:27:29
>>382
(っ´▽`)っ
配列とリストを比較すると・・・

配列は連続した領域を確保する。
そのため、リストとは違い、アクセスが容易。
アドレスの単純なインクリメントだけで済む。(添字だけで済む。)
リストの場合、メンバを最初から順に追っていかなければならない。

さらに、領域が連続してるから初期化も楽。
memset(a, 0, sizeof(a));で一発。
385デフォルトの名無しさん:2006/10/29(日) 10:39:28
>>381
>(っ´▽`)っ
>そもそもfreeをかけなければずっと確保し続けるというのが
>C言語の仕様なのではなかろうか?

当然 これが正解
386デフォルトの名無しさん:2006/10/29(日) 10:47:26
>>381
もういっかいポインタの概念をきちんと学習した方がいいのでは?
なんかあんまりポインタのことがわかってないように聞こえるぜ
387側近中の側近 ◆0351148456 :2006/10/29(日) 10:51:46
>>385,386
(っ´▽`)ノシ どもども☆
388デフォルトの名無しさん:2006/10/29(日) 12:58:26
計算の答えを小数点以下7桁まで表示するにはどうすればいいですか?
%fのところを少し変えればいいと思うのですが。
389側近中の側近 ◆0351148456 :2006/10/29(日) 13:29:25
>>388
(っ´▽`)っ
%.7f
390デフォルトの名無しさん:2006/10/29(日) 13:39:42
飛ぶ処理は出来てると思うんですが…
正直自作関数の定義関係よくわからんのですが…

#include <stdio.h>

int main(void)
{
int i; //変数iを用意
scanf("%d", &i);//標準入力
if(i == 1)//iが1だったらgiko関数に飛ぶ
{
void giko(void);
}
getch();
return 0;
}

void giko(void)
{
printf("飛ぶわけねーだろ");

}
391デフォルトの名無しさん:2006/10/29(日) 13:56:18
>>389
ありがとうございます
392デフォルトの名無しさん:2006/10/29(日) 13:56:36
>>390

>void giko(void);
getch の呼び出しは getch() ってことが分かってるなら
giko の呼び出しも単純に giko() だとは思わんか?
393デフォルトの名無しさん:2006/10/29(日) 14:05:12
>>392
ありがとうございます
394デフォルトの名無しさん:2006/10/29(日) 15:21:53
配列とカウントを使った自作関数を作りたいのですが

int kansuu (int count, int x[count]) {
処理
}

こんな感じでやったのですがcountが未定義になってしまいます。
int* x[count]も試したのですができませんでした。
どうすればよいのでしょうか?
395デフォルトの名無しさん:2006/10/29(日) 15:25:45
>>394
int kansuu(int count, int x[])
{
}
396デフォルトの名無しさん:2006/10/29(日) 15:27:28
>>395
なるほど!
やってみます ありでした
397デフォルトの名無しさん:2006/10/29(日) 16:22:45
return 0
ってどういう意味ですか?
398デフォルトの名無しさん:2006/10/29(日) 16:25:11
0を返すって意味
399デフォルトの名無しさん:2006/10/29(日) 16:30:04
>>398
return 0 は、付ける場合と付けない場合でどう違ってくるんですか?
400デフォルトの名無しさん:2006/10/29(日) 16:32:36
>>399
main関数ならシステムに0を返すってだけ
ぶっちゃけほとんど意味はないらしいけど一応
401デフォルトの名無しさん:2006/10/29(日) 16:37:13
今256×256(24bit)のビットマップ弄ってて3次元配列に入れてるんですが
上下反転させようとしたとき行の順番以外は変化しないのに
2重ループor3重ループさせるのってなんか馬鹿っぽくないでしょうか?
ポインタ弄ればもっと簡単になるような気がするんですが、('A`)むー
402デフォルトの名無しさん:2006/10/29(日) 16:37:20
>>400
分かりました。ありがとうございます
403デフォルトの名無しさん:2006/10/29(日) 16:50:24
>>401 バカはおまえ。
404デフォルトの名無しさん:2006/10/29(日) 16:51:16
>>401
馬鹿っぽいんじゃない。本当に馬鹿なんだ。
405デフォルトの名無しさん:2006/10/29(日) 17:22:55
return 0 はちゃんと命令が終了しましたよ って意味だぞ。
406デフォルトの名無しさん:2006/10/29(日) 17:30:06
戻り値がvoid型の関数で
returnを付ける派?付けない派?
私は付ける派。
407デフォルトの名無しさん:2006/10/29(日) 17:33:45
>>403,404
馬鹿認定thx
頭悪いと自覚してなかったら質問なんて出来ませんだぜ(´・ω・`)

出来れば理由とかも教えていただけると参考になります。
408デフォルトの名無しさん:2006/10/29(日) 17:50:01
%o,%pの意味をそれぞれ教えてください
409デフォルトの名無しさん:2006/10/29(日) 18:03:39
>>408
ぱーせんとおー、ぱーせんとぴーという以上の意味があるようには見えないのだが。
#特定のシチュエーションにおけるそれらrの意味を問いたいのならそのシチュエーションを書きたまえ。
410デフォルトの名無しさん:2006/10/29(日) 18:09:18
>400,402,405
>>main関数ならシステムに0を返すってだけ
>>ぶっちゃけほとんど意味はないらしいけど一応
>return 0 はちゃんと命令が終了しましたよ って意味だぞ。

お前らww

main関数ならシステムに0を返す。
実行ファイルの実行終了時返却値になるんだから
意味はおおいにある。

普通は正常時に 0 を返し、異常時に 0 以外を返す。

ただ、それは決め事だから 0 だからって正常かどうかは
システム次第だけど。

main 以外なら、その関数の仕様次第。
411デフォルトの名無しさん:2006/10/29(日) 18:42:35
>>400
return 文で値を返さないとシステムなり呼び出し元に返る値は予期しない値になる
呼び出し元が戻り値を必要としないものなら問題は起きない.main関数が戻り値を返さなくても問題が起きないのはそのシステムが値を必要としていないから.
412デフォルトの名無しさん:2006/10/29(日) 18:59:34
>main関数が戻り値を返さなくても問題が起きないのはそのシステムが値を必要としていないから.
↑これは確信ないんだけどね.少なくともコマンドプロンプト上では・・・・
void main()の場合コンパイラが0を返すようにコード変えてるかもしれないなぁ
413411:2006/10/29(日) 19:01:29
あっ>>411=>>412
414デフォルトの名無しさん:2006/10/29(日) 19:18:40
ビットって、どんなときに使用するの?
415デフォルトの名無しさん:2006/10/29(日) 19:21:07
>412
なぜ逆アセしない?
416411:2006/10/29(日) 19:54:46
>>415
言われてみれば・・・
整数値の場合int戻しだとレジスタに返却値を格納してる.voidだとしてないね
システム的には終了直後にこの値を参照してるんじゃないかと思う
でもシステムからの呼び出しってmainが最初じゃないんだよね・・確か
417デフォルトの名無しさん:2006/10/29(日) 19:55:50
>>414
一番良くあるのは、フラグの組み合わせを表すときとか。
WindowsならCreateFile、UNIX系ならopen()関数とかを見るといいかも。

以下、自分で作るならこんな感じ。

// 各ビットにフラグを対応させる
#define FLAG_AAA 0x00000001
#define FLAG_BBB 0x00000002
...

void func_xxx(int flags) {
if (flags & FLAG_AAA) { フラグAAAに対応する処理 }
if (flags & FLAG_BBB) { フラグBBBに対応する処理 }
...
}

int main(int argc, char *argv[])
{
...

func_xxx(FLAG_AAA | FLAG_DDD); // フラグAAAとDDDを指定してある機能を実行させる。
...
}

他の使い方としては、一つの整数値の中に複数の数値を持たせるため。
例:4バイト整数のうち、上位2バイトがxxxを表し、下位2バイトがyyyのための値。
418417:2006/10/29(日) 20:02:14
補足。

ビットでフラグを管理するのは、関数のインタフェースとしてだけではなく、
処理の状態を管理するのにも使える。
ある状態になったらこのビットをONにして、このビットがONのときはあの処理をして…。

複数のフラグをまとめて一つの変数で管理するのは、それらが関連する場合だけにしたほうがいい。
たとえば、先に例にあげたopen()関数でのオープン方法の指定のように。
もともと関連の無い概念なら、別の変数にしてBOOL値として管理したほうがいい。
419411:2006/10/29(日) 20:17:01
つーか開始終了処理は当然するよな
トレースしてみる
420デフォルトの名無しさん:2006/10/29(日) 20:19:34
>>416
VC 2005で試してみたらvoid main() {}でもint main() {}でも
xor eax, eaxをやっていて、0を返すようになっていた。

C++でもvoid main() {}はおそらく0を返すのだろう。int main() {}は規格に従って0を返すのは確認済み。
421411:2006/10/29(日) 20:40:35
>>420
>int main(){}は規格に〜
↑ここ詳しく
でもmain復帰後すぐeaxをpushしてるでしょ
最終的にこの値をどうしてるかが問題じゃない?こっちはBCB5でデバッグ中の状態からしかアセンブラコード見れないけどそっちも同じ?
422デフォルトの名無しさん:2006/10/29(日) 20:51:30
>>421
/FAでasmファイルを出力させている。
Borlandもコマンドラインのコンパイラにはアセンブリを出力するオプションがあったはず。

int main()でreturnなく終わった場合はJIS X 3014:2003の3.6.1の5節目 (C++)や、
X 3010:20035.1.2.2.3 (C99)でreturn 0;を返すと定められている。
それ以前のCにはそのような規定はない。

書き忘れたが、420の1-2行目は拡張子cにしてCとしてコンパイルされるようにした。
423デフォルトの名無しさん:2006/10/29(日) 20:54:09
特定の値を引数にし、
「√(ルート)」で囲んだ数値を返す関数ってありますか?

例 2 を引数にすると、1.41421356..と返ってくる

(C言語というか数学の問題っぽくてすまんとです・・)
424デフォルトの名無しさん:2006/10/29(日) 20:59:14
>>423

#include <math.h>

sqrt(x)

で、よろしいか?
425デフォルトの名無しさん:2006/10/29(日) 20:59:26
>>423
<math.h>のsqrt
426デフォルトの名無しさん:2006/10/29(日) 21:01:43
main関数の戻り値はプログラムの終了ステータス
shellで実行後にシェル変数$?に格納されるもの
別に0が正常終了というわけではない

だから、void main()で何を返そうがそれはどうでもよいことでは?
プログラムの終了ステータスとして不定値を返すということで
427デフォルトの名無しさん:2006/10/29(日) 21:06:35
>>426
mainが終わると、その戻り値を引数にしてexitを呼ぶことになっている。
シェルとかを抜きにして、Cではexitの引数が0またはEXIT_SUCCESSの場合成功終了と定められている。
428デフォルトの名無しさん:2006/10/29(日) 21:07:49
>>424、425
ありがとうございます!
すんません。基本的な事過ぎました・・
429デフォルトの名無しさん:2006/10/29(日) 21:19:39
>>378
if文を適当に削ると一応コンパイルできました。
これからテストしてきます…
430411:2006/10/29(日) 21:53:43
>>422
コマンドコンパイラ初めてだけど頑張ってみる
ぁぁ俺のホストのアク禁いつ解除されるんだろう
431デフォルトの名無しさん:2006/10/29(日) 22:31:41
>>416
ttp://ukai.jp/debuan/2002w/elf.txt
を見たらいいんじゃまいか
432デフォルトの名無しさん:2006/10/30(月) 00:57:41
OS:Freebsd 6.01
getcの帰り値の取り扱い方法について質問です。
manしたら、プロトタイプが以下のようになっていて
int getc(FILE *stream);

これはgetcの帰り値を
intで受けて処理しちゃったほうがいいのでしょうか?
それともchar型にキャストして使ったほうがいいのでしょうか
↓こんな感じで?
char ch;
FILE fp;
ch = (char)getc(fp);
433デフォルトの名無しさん:2006/10/30(月) 01:00:03
とりあえずはint型で受けろ。
EOFでないと判明したらchar型にしてもよい。
434デフォルトの名無しさん:2006/10/30(月) 01:07:28
>>EOFでないと判明したらchar型にしてもよい
なるほど!なんとなく定数が絡んでいるのかなーと理解しました。
int型で受けて処理します。
ありがとうございますー
435デフォルトの名無しさん:2006/10/30(月) 02:16:54
>>422
C++は知ってたが、C99もそうなのか。勉強になりました。
チラシの裏ですまん。
436デフォルトの名無しさん:2006/10/30(月) 04:20:09
関数の中で
static POINT pt[][300]

こうした場合、ptの要素数ってあとからどうやって指定するんでしたっけ?
忘れでしまってorz
mallocで領域確保する必要あり?
437デフォルトの名無しさん:2006/10/30(月) 04:35:33
>>436
関数の仮引数の事?
それは呼び出した側で渡した配列の大きさによる。
関数内でそれよりも大きな行数を指定した場合の動作は未定義
438デフォルトの名無しさん:2006/10/30(月) 04:36:37
それとも、本当にそのように自動変数を定義したのなら

static POINT (*pt)[300];

と同じだから、malloc()かもしくは同じ列数を持つ配列のアドレスを
ptに代入
439デフォルトの名無しさん:2006/10/30(月) 05:54:58
static は自動変数じゃないだろ
440デフォルトの名無しさん:2006/10/30(月) 06:20:17
添字がねえぞ馬鹿

というエラーメッセージが出ると予想
441デフォルトの名無しさん:2006/10/30(月) 07:38:22
もしかして中学英語くらいわからないとC言語勉強するの無理?
442デフォルトの名無しさん:2006/10/30(月) 08:37:26
中学英語くらいできないと、所謂ホワイトカラー職は無理かと。
443デフォルトの名無しさん:2006/10/30(月) 08:43:41
中学英語自体は分かってなくても、趣味程度で勉強することはできるだろうが
中学英語すら分からない頭で理解するのは無理だな
444436:2006/10/30(月) 08:51:21
点をつなげて線を描画するプログラムを作っているんですが、線の本数が分かった時点で
配列を動的に定義できないのかなぁと・・・

たとえばVB(VBA)では
Dim iNum[] と宣言しておいて

Redim iNum[6] というように
あとから配列の要素数を決められたように思うんですが(昔のことなんで記憶が定かではないのですが)

こういうことをcでやるにはどうしたらいいのかな、と
最初に十分おおきな配列を準備するという方法でもいいのですが
何分スマートさにかけるような気がして(笑
445デフォルトの名無しさん:2006/10/30(月) 09:15:21
>>444
mallocを使え。
446デフォルトの名無しさん:2006/10/30(月) 09:21:00
>>444
このスレ的には邪道だが、C++に移行してstd::vector使え。
447デフォルトの名無しさん:2006/10/30(月) 10:05:58
>>445
realloc() でいいだろ
NULL 値指定してやれば malloc() と同じ動きするし
448デフォルトの名無しさん:2006/10/30(月) 11:28:17
enum
{
REMOVE_EVENTS = 0,
SLEEP_TICKS = 0L,
MOUSE_REGION = 0L,
WINDOW_ID = 128,
STR_ID = 128,
HELLO_STR_ID = 1
};

#define IN_FRONT (WindowPtr)-1L

上記コンパイルは通るのですが、IN_FRONTをenumに入れると
Error : cannot implicitly convert エラーとなりコンパイルが通りません。

処理系はPowerMac(75MHz)/64MB、コンパイラはApple MPWです。

カーニハン&パイクの「プログラミング作法」という本に魅せられて、
#defineをenumに置き換えようとしたのですが…。
あと、#defineはなるべく避けたほうがいいのでしょうか…。よろしくお願いします。
449デフォルトの名無しさん:2006/10/30(月) 11:44:30
>>448
WindowPtr の正体は?
450デフォルトの名無しさん:2006/10/30(月) 11:59:34
>>448
Error : cannot implicitly convert
暗黙の変換ができません

WindowPtr が整数に変換できないんだろ
(long)WindowPtrにでもしてみたら
451デフォルトの名無しさん:2006/10/30(月) 12:01:23
>>448
コンパイル時に値を決定できない変数を enum に指定できないってことじゃない?
勘ですまんが。
452デフォルトの名無しさん:2006/10/30(月) 12:05:23
>>449
WindowPtrは、Macの画面に表示されるウインドウリソースへの
ポインタです。

ヘッダファイル Quickdraw.hで定義されているようです。
(もちろんインクルードはしています)
typedef GrafPtr WindowPtr;
となっています。

ポインタをenumに入れるのが間違ってるんでしょうか。

enumじゃなく#define使う人が圧倒的に多いですが、
それに対する啓蒙書みたいなものでしょうか>プログラミング作法
453デフォルトの名無しさん:2006/10/30(月) 12:33:18
「C実践プログラミング第3版」では#defineよりconstを勧めてますね。

もう、どーなってんだか…。
一応#defineに戻しときました。

Appleの提供するヘッダ自体、#defineの嵐だし。
454デフォルトの名無しさん:2006/10/30(月) 13:36:00
>>453
const を薦める理由も書いてましたよね?
型を指定したいからですね。

昔のCには const は無かったですけど、最近なら
#define ではなく const int などにするのが
安全でしょう。
455デフォルトの名無しさん:2006/10/30(月) 13:37:33
>>452
enum に型なんて要らないんだから、
#define IN_FRONT -1L
でいいじゃん。
使うときにキャストすれ
456デフォルトの名無しさん:2006/10/30(月) 13:42:34
>>454
そうですよね。

>>455
#define IN_FRONT -1L
では、WindowPtrはどうするんでしょうか?

キャストの方法だけでも教えてください。
457デフォルトの名無しさん:2006/10/30(月) 13:43:14
整数値(10桁以下)を入力させ、数字の出現回数を表示するプログラム
がわかんないんですけど教えてください。
458デフォルトの名無しさん:2006/10/30(月) 13:48:09
457早く教えてください。
困ってるんです。
459デフォルトの名無しさん:2006/10/30(月) 14:24:09
あなたが困れば困るほど、見ている方は大喜びです。
460デフォルトの名無しさん:2006/10/30(月) 14:24:33
>>456
(WindowPtr) がキャスト

ていうか、

enum
{
REMOVE_EVENTS = 0,
SLEEP_TICKS = 0L,
MOUSE_REGION = 0L,
WINDOW_ID = 128,
STR_ID = 128,
HELLO_STR_ID = 1
};

こんな enum 意味なくね?
これなら全部 const long とかのほうが全然いいと思うが。
461デフォルトの名無しさん:2006/10/30(月) 14:29:05
const での定数定義って厄介だよな。

#define A 1
#define B (A + 1)

が表現できないんだもん。

const int A = 1;
const int B = A + 1; ←ここでエラー
462デフォルトの名無しさん:2006/10/30(月) 16:38:53
constで定数を扱いたいお前らは全員C++使え。
463デフォルトの名無しさん:2006/10/30(月) 17:07:51
特に意味もなくコードの模様替えをしたくなる病気というのは色々あるが
define を const に置き換えるのは最悪の部類だろう
定数式が要求されるところ全てでエラーが出るぞ
464デフォルトの名無しさん:2006/10/30(月) 18:08:19
FreeBSDでやってみようかな…
465デフォルトの名無しさん:2006/10/30(月) 20:29:17
>>457
>整数値(10桁以下)を入力させ、数字の出現回数を表示するプログラム

入力値を文字列に変えて一桁ずつ判定、数字0〜9の配列にでもカウントさせる
で、その配列を表示
466デフォルトの名無しさん:2006/10/30(月) 20:54:20
%dと%xを間違えて、アドレス入れちゃって
(すぐ止めたからよかったものの) 危うくメモリリーク・・


//jpeg画像だから尚更ヤバス..OTL
467デフォルトの名無しさん:2006/10/30(月) 21:10:12
intmain( int argc, char** argv )
{
FILE*fp;
charss[20],str[256];
printf("ファイル名を入力してください。\n");
gets(ss);
printf("ファイル名:%s",ss);
printf("\n\n");
fp = fopen( ss,"r" );
if(fgets(str,256,fp) != NULL) //ファイルが存在しない場合
{
puts(str);
}

else if(fp == NULL)
{
fprintf(stderr, "ファイルが存在しません、ファイル名を確認してください");
exit(-1);
}

else
{
}
fclose(fp);
}

っというファイル名を指定(主にtxt)してその内容を
出力するプログラムなのですが
なぜか出力されるのは指定したファイルの一行目のみっという
結果になってます。全ての行を出力するためには
どのように変更すればいいでしょうか?
468デフォルトの名無しさん:2006/10/30(月) 21:36:47
>>467
fgets(str,256,fp)を1回しかやらないからそうなる。ファイルが終わるまで繰り返せばいい。
if(fp == NULL)はfopen()した直後(fgets()する前)にみるべき。


>>466
わけわからん。メモリリークって、解放すべきメモリを解放しないことですよ。
469デフォルトの名無しさん:2006/10/30(月) 21:42:55
デジカメ撮影の .movから、
.jpgを1枚1枚全部取り出すっつぅプログラムを作りたいんだが、
 やはりmov全体を読み込むほど、メモリを確保しないといかん??

処理としては、
jpegファイル(not jpeg2000)の開始(ffd8)から終了(ffd9)までを、
延々とファイル末尾まで調べて、適当に連番で出力させられればいいんだが。。
470デフォルトの名無しさん:2006/10/30(月) 21:46:58 BE:159754548-2BP(204)
その.movってのは、jpegが並んで入ってるだけのフォーマットなのか?
471デフォルトの名無しさん:2006/10/30(月) 21:56:01
>>470すまん
別にwav音声はとりあえず要らないから、
まず画像をと思って。。

構造は結構バラつきがあるね、、秒間30コマで
jpegがまず1秒分、途中に空きがありつつ並んでいて、
 その後に1秒分のwav音声がくるみたい。
以後jpeg,wavの繰り返しをほぼ大半を占めてる。。


waveは、ffd8〜とかではないようだけど
よくわからん。。
472どんずまり:2006/10/30(月) 22:06:35
すいません、質問なのですが、

#include <stdio.h>
void func(char *ch);
int main (void){
int c;
char *ch

printf("名前を入力してください\n");
func(&ch);
printf("入力した名前は%sです\n",ch);
}

void func(char *ch){
int c;
char str[20];
ch = &str;

for(c=0;c<20;c++){
str[c]=getchar();
if(str[c]==0x0A){
str[c]=0x00;
}
}
}

こんな感じで画面から名前を入力して1文字ずつ読み込んで画面に出力したいのですが
メイン関数から関数にポインタを乗せて文字を1文字ずつ入力して出力したいのですがどうやったらうまくいきますでしょうか?
scanfは使わずにgetcharで使いたいです。
473デフォルトの名無しさん:2006/10/30(月) 22:41:08
void *malloc(size_t size);
mallocの左辺は、なんらかのポインタでなければならないが、
その関数内の
p1=mallocの実態は
char **p1 = mallocだから
char *p1 = mallocとなるように
間接参照して
*p1=mallocとする必要がある。
474デフォルトの名無しさん:2006/10/30(月) 23:42:14
char ch で
//復号化
while (fread(&ch, sizeof(char), 1, fp) == 1) {
ch = ch - key[i++];
if(i >= keylen) { i = 0; }
fwrite(&ch, sizeof(char), 1, wfp);

これの解説を宜しくお願い致します。
いつもなら、0で返しますが、今回初めて1で返す事になっています。
どういう事かわかりません、もう一つは

ch = ch - key[i++];
if(i >= keylen) { i = 0; }

これの意味です、何をどうインクリットメントするかです。
475デフォルトの名無しさん:2006/10/30(月) 23:45:08
>>472
こういうことがやりたいのか?
#include <stdio.h>
void func(char *ch, int max);
int main (void){
int c;
char ch[20 + 1];//20字+終端コード1バイト領域確保
printf("名前を入力してください\n");
func(ch, 20);
printf("入力した名前は%sです\n",ch);
}
//maxは最大入力文字数
void func(char *ch, int max){
int c;
for(c=0; c < max; c++){
ch[c] = getchar();
if(ch[c] == '\n'){
ch[c]='\0';
break;
}
}
ch[c] = '\0';
}
476どんずまり:2006/10/30(月) 23:51:36
今自宅には環境が無いので、明日試してみます。
結果は明日報告します。
どうもありがとう御座います。
477デフォルトの名無しさん:2006/10/31(火) 00:04:43
>>467さんベースで書き直してみたよ。
どうかな?

#include<stdio.h>
#include<stdlib.h>

int main( int argc, char** argv )
{
FILE *fp;
char ss[20],str[256];
printf("ファイル名を入力してください。\n");
gets(ss);
printf("ファイル名:%s\n\n",ss);

if((fp = fopen( ss,"r" )) == NULL){
fprintf(stderr, "ファイルが存在しません、ファイル名を確認してください\n");
exit(1);
}

while(fgets(str,256,fp) != NULL) //ファイルが存在しない場合
{
puts(str);
}
fclose(fp);
return 0;
}
478デフォルトの名無しさん:2006/10/31(火) 00:07:43
>>474
>いつもなら、0で返しますが、今回初めて1で返す事になっています。
 すまんが何を言っているのかわからん。返すってどこに?返すってreturnのこと??

 解説か。うーん、ストリームfpから1バイトずつ読みこみ(fread関数)、
読み込みが成功したら(fread関数の戻り値が1)、
読みこんだ1バイトをkey配列で復号する。
復号した1バイトをストリームwfpに書き込む・・・これでいいのか?
 復号に使うkey配列の中身は1文字ごとに違い、配列の終端まで行ったらまた最初に戻る。たぶんそういう意味だろう。だから、
key[26]= {'a', 'b', ...(中略)..., 'z'};だったら、復号に使うkey配列の中身が'a'から'z'に変化し、key[25]('z')の次はkey[0]('a')に戻る。

>ch = ch - key[i++];
>if(i >= keylen) { i = 0; }
>これの意味です、何をどうインクリットメントするかです
ch = ch - key[i++];
は、
ch = ch - key[i];
i++;

と同じだ、ととりあえず思っておけばいいだろ(key[++i]だと違う!)。
だれが書いたソースだかしらんが、
>fread(&ch, sizeof(char), 1, fp)
>ch = ch - key[i++];
のあたり、あまりよろしくない。
479デフォルトの名無しさん:2006/10/31(火) 01:31:31
Cで2バイト文字を扱う方法を詳しく解説しているサイトってありませんか?
480474:2006/10/31(火) 01:43:06
>>478
解り易いご返答、ありがとうございます。

>いつもなら、0で返しますが、今回初めて1で返す事になっています。
自分もよくわかりません・・・。

まだ、考えても理解しにくい部分があります
>読み込みが成功したら(fread関数の戻り値が1)
の戻り値が1とは厳密には、どういう事でしょうか?

もう一つは、ch = ch - key[i++];
は、
ch = ch - key[i];
i++;



>fread(&ch, sizeof(char), 1, fp)
>ch = ch - key[i++];


等は、何故宜しくないのでしょうか?
参考書の著者のソースです。


481デフォルトの名無しさん:2006/10/31(火) 01:50:44
>>480
日本語の勉強をしなおした方がよくないか?

>>いつもなら、0で返しますが、今回初めて1で返す事になっています。
>自分もよくわかりません・・・。
「いつも」とはなにか。自分自身しかわからないことは、きちんと相手に伝える努力をすること。

>>読み込みが成功したら(fread関数の戻り値が1)
>の戻り値が1とは厳密には、どういう事でしょうか?
厳密も何も、マニュアルページに書いてある通り、fread()は読み込みに成功したエレメントの個数を返す。
従って第3パラメータが1ならば、成功時は1個読めているので1が戻るのは自明。

>fread(&ch, sizeof(char), 1, fp)
>ch = ch - key[i++];
これはfread()を使うよりもfgetc()を使うべきシチュエーションだな。
>478がその意図で書いたかどうかは判らんが。
482478:2006/10/31(火) 02:01:19
>>読み込みが成功したら(fread関数の戻り値が1)
>の戻り値が1とは厳密には、どういう事でしょうか?
 厳密に、といわれてもどう答えていいか困るけど、
fread(&ch, sizeof(char), 1, fp)
と書いた場合、読み取りが成功すると第三引数の値、
つまりこの場合では1がfread関数から返ってくる。1以外だと読み取り失敗。

>>fread(&ch, sizeof(char), 1, fp)
>>ch = ch - key[i++];
>等は、何故宜しくないのでしょうか?
 上の方はよろしくない、はいいすぎだったかも。
ただね、ぱっとこのソースを見て、「chの型がcharじゃなく変更されたら
どうすんだろ」って思った。fread(&ch, sizeof(ch), 1, fp)
なら、chの型は比較的意識しなくていいでしょ。そう思っただけ。
 下の方はありえないと思うよ。だって
ch = ch - key[i];
i++;
とでも書けばいいのに、なんで
ch = ch - key[i++];
なんて読みにくい書き方するわけ。前者は読めても後者は読めない人は
結構いるだろうし、後者にする積極的理由は現代には無いと思う。
(リソースが乏しくて1文字でもコード量を減らしたかった時代ならともかく)
483デフォルトの名無しさん:2006/10/31(火) 02:08:03
system();
の中に変数を使用してmkdirのディレクトリ名を変数で指定して
ディレクトリを作成するにはどうしたらいいですか
484デフォルトの名無しさん:2006/10/31(火) 02:24:00
誰か助けてください。
N 人の宣教師と N 人の人食い人種が定員 k 人(k < N)の船で川を渡る。
ただし、どちらの岸でも人食い人種のほうが宣教師より多くなると、
宣教師は食べられてしまう。
というのをプログラムにしろという課題ができません。
3人ずつで定員2人の場合のコードはいろんなサイトに載っているんですが。
485デフォルトの名無しさん:2006/10/31(火) 02:48:19
それをそれぞれの定数に当てはめれば終わりだろ
486デフォルトの名無しさん:2006/10/31(火) 02:52:03
>>483
sprintf()でも使って組み立てればよろし。
Ex.
void mkdirByShell(const char * dir)
{
char * p = malloc(strlen(dir) + 7);
sprintf(p, "mkdir %s", dir);
system(p);
free(p);
}

>>484
3人ずつのところをN人に、2人のところをk人にすればよろしかろ。
487474:2006/10/31(火) 03:35:23
>>481->>482
ごめんなさい・・・
こんなに詳しく書いて頂いき、ありがとうございます。
やはり、難しいので完璧に理解するのに時間がかかりそうですが
プリントしたりして、読み返したいと思います。
参考書を過信しない方が良いようですね。
488デフォルトの名無しさん:2006/10/31(火) 05:34:16
バイナリ読み書き出し専用の"rb"や"wb"はテキストバイナリにも
対応しているのでしょうか?兼用でしょうか?
489デフォルトの名無しさん:2006/10/31(火) 05:37:27
C言語で遅延時間(?)を発生させることって出来るんでしょうか?
遅延時間というか、処理を数秒待つというか・・・。
例えば

printf("aaaaaa\n");
printf("bbbbbb\n");

を実行すると、aaaaaaとbbbbbbは同時に表示されてしまいますが、
aaaaaaを表示して2秒後にbbbbbbを表示させることは可能なのでしょうか?
490デフォルトの名無しさん:2006/10/31(火) 05:49:05
>>488
「テキストバイナリ」って、その「俺語」を先ず何とかしろ。

>>489
time()で秒単位の時刻は得られるから、無理矢理2秒待つだけなら標準関数でもできる。
しかし、大抵の環境にはその間処理を停止させるための待ち専用関数が用意されている。
もう一つ問題があって、printf()で出力される標準出力はバッファリングされる可能性がある。
従って、バッファをフラッシュしないといくら途中で待ちを入れても纏めて出力されかねない。
まぁ、Unix系ならこんな感じ。
printf("aaaaaa\n");
fflush(stdout);
sleep(2);
printf("bbbbbb\n");
491デフォルトの名無しさん:2006/10/31(火) 05:50:58
訂正
テキストエディッタとバイナリエデイッタでしたm(__)m
492デフォルトの名無しさん:2006/10/31(火) 08:24:17
これは酷い
493デフォルトの名無しさん:2006/10/31(火) 08:56:35
何言ってるのかがよく分からんが、
テキストとバイナリの違いなんて、例えば改行コードの取り扱いとかだけで、
基本的には同じ
494デフォルトの名無しさん:2006/10/31(火) 11:11:30
DOS/Windows だと
 \n ⇔ CRLF テキストモード
 \n ⇔ LF バイナリモード
それ以外の文字は渡されたものを垂れ流す。

テキストエディタで化けるような isprint() でない文字を可視化するような気の効いた機能なんぞない
495デフォルトの名無しさん:2006/10/31(火) 11:37:20
>>489
C言語の機能にはない
sleep関数でウェイトさせる
496デフォルトの名無しさん:2006/10/31(火) 12:01:04
forを大量に繰り返すという依存しまくりの方法もあるぞ
497デフォルトの名無しさん:2006/10/31(火) 15:31:13
リスト構造やツリー構造などのメモリ上の状態、つまりポインターによるノード間の
つながりをファイルに保存して、そのファイルを読み込むとコンピュータ上で
前回のデータ構造を再現できる方法を探しています。
色々探したり考えたりしたのですが、いい方法が見つかりません。
C言語でそのようなことは可能なのでしょうか?
ご存知の方がおられたら教えていただけないでしょうか?
498デフォルトの名無しさん:2006/10/31(火) 15:51:03
大学でさらっとだけC言語勉強はしたのですが、また勉強し直したいので何か入門書的なお勧めの本てあるのでしょうか?
近くにまともな本屋がないのでアマゾンで購入しようと思うのですが一つアドバイスいただきたいです。
499デフォルトの名無しさん:2006/10/31(火) 16:09:10
大学の図書館て割と名著の宝庫だと思うんです
500デフォルトの名無しさん:2006/10/31(火) 16:10:02
K&R2 (本屋で買える)
JIS X 3010:1993 (JISで買える)
ANSI C の Rational (webから落とせる)
501デフォルトの名無しさん:2006/10/31(火) 16:11:19
s/Rational/Rationale/
502デフォルトの名無しさん:2006/10/31(火) 16:14:16
>>497
当然、可能ですよ。
個々のノードに一時的にID番号みたいなのを振って、ポインタの部分を
ID番号にしてファイル化するとか、ポインタの部分をファイル先頭から
のオフセットにするとか、イロイロ。
503デフォルトの名無しさん:2006/10/31(火) 21:02:45
>>499
本を売る必要がないからな
504デフォルトの名無しさん:2006/10/31(火) 21:24:36
include <stdio.h>
#include <time.h>
#include <stdlib.h>

main(){
int bin_max;//瓶の総本数
int bin;//残り瓶の本数
int p_turn = 0;//プレイヤーのターンフラグ

srand(time(NULL));

//瓶の総本数を決める
bin_max = rand()%5 + 20;
bin = bin_max;

printf("【瓶取りゲーム】\n");
printf("交互に1〜3本の瓶を取ります。最後の一本を取った人が負けです。\n");
printf("瓶の本数:%d\n",bin_max);

505続き:2006/10/31(火) 21:25:12
//先攻後攻を決める
printf("先攻[1]/後攻[0] : ");
scanf("%d",&p_turn);
while(getchar() != '\n'){}

printf("==========プレイヤーの");
if(p_turn == 1){printf("先攻");}
else{
p_turn = 0;
printf("後攻");
}
printf("でスタート!==========\n");

//瓶を交互に取る
for(;bin > 1; p_turn = !p_turn){
if(p_turn){ printf("%d プレイヤーの番です\n",bin); bin--;}
else{printf("コンピュターの番です\n",bin); bin--;}
}

printf("==========ゲーム終了==========\n");

return 0;
}
506続き:2006/10/31(火) 21:27:02
【瓶取りゲーム】
交互に1〜3本の瓶を取ります。最後の一本を取った人が負けです。
瓶の本数:24
先攻[1]/後攻[0] : 0
==========プレイヤーの後攻でスタート!==========
コンピュターの番です
23 プレイヤーの番です
コンピュターの番です
21 プレイヤーの番です
コンピュターの番です
19 プレイヤーの番です
コンピュターの番です
17 プレイヤーの番です
コンピュターの番です
15 プレイヤーの番です
コンピュターの番です
13 プレイヤーの番です
コンピュターの番です
11 プレイヤーの番です
コンピュターの番です
9 プレイヤーの番です
コンピュターの番です
7 プレイヤーの番です
コンピュターの番です
5 プレイヤーの番です
コンピュターの番です
3 プレイヤーの番です
コンピュターの番です
==========ゲーム終了==========

何故か、23,21,19等に2桁づつ飛んでしまいます、ソースの
ご指摘お願いします。23,22,21,20のようにしたいです。
507デフォルトの名無しさん:2006/10/31(火) 21:31:01
else{printf("%dコンピュターの番です\n",bin); bin--;}
508デフォルトの名無しさん:2006/10/31(火) 21:31:58
整数を入力して下記のような表示をするプログラムを教えて頂けないでしょうか?
例えば4を入力したとき
4
1=1
2+1=3
3+2+1=6
4+3+2+1=10
509デフォルトの名無しさん:2006/10/31(火) 21:32:03
>>503
いや俺は>>498に大学通ってるんなら図書館へ行ってみろよってことを言いたくてですね
510504:2006/10/31(火) 21:38:20
>>507
ご指摘、ありがとうございます。
入門書と比較しても誤りはないんですが・・・・。

>>else{printf("%dコンピュターの番です\n",bin); bin--;}

の何処がおかしいいのでしょうか?
511デフォルトの名無しさん:2006/10/31(火) 21:40:04
>>508
#include <stdio.h>

void main(void)
{
int j,k,n,d;
printf("入力=");
scanf("%d" , &n );

for( j=0 ; j< n ; j++ )
{
d = 0;

for( k=j +1 ; 0 < k ; k-- )
{
d += k;
printf( "%d" , k );
if( 1 < k ) printf( "+" );
}
printf( "=%d\n" , d );
}
}
512デフォルトの名無しさん:2006/10/31(火) 21:42:45
>>510
>>504のソースは %d が、
コンピューターの番に抜けてるだけじゃないのか?
513デフォルトの名無しさん:2006/10/31(火) 21:42:43
>>510
元は %d がない。

>>506 の出力で "コンピュターの番です" となっているが
意図としては
 23 プレイヤーの番です
 22 コンピュターの番です
 21 プレイヤーの番です
 20 コンピュターの番です
となって欲しいコードだと思われるから。
514デフォルトの名無しさん:2006/10/31(火) 21:46:18
>>512-513
ちょwwwタイムトラベルが起きてるwwww
515504:2006/10/31(火) 21:47:07
さんkす、できました!!!
エラーがでなかったので、わかりませんでした!!
ありがとうございました。
516513:2006/10/31(火) 21:49:17
>>514
こ、これは!!!
クライアントの時刻ってわけないよな…
ロックした時刻であって Write 完了時刻じゃない ってことなのか?
# 俺のレスのほうがトランザクション完了遅かった っとこと?
517デフォルトの名無しさん:2006/10/31(火) 21:56:47
>>511
ありです!
518デフォルトの名無しさん:2006/10/31(火) 21:59:59
>>511
void mainはねえだろ。
519デフォルトの名無しさん:2006/10/31(火) 22:10:44
>>518
あっホントだ
>>517
int main(void)
に直しといて
520デフォルトの名無しさん:2006/10/31(火) 22:27:22
>>509
>>498は大学でCを勉強したとは書いているが、今現在大学に在学中とは書いてない。
勉強しなおすという表現は社会人が専ら使う表現だ。

>>503で言いたかったのは、本屋はもとより大衆本の著者・出版社も本を数売ることが目的だから、
それが名著であるかどうかより、今人気があるか、手にとってもらえるかを重要視せざるを得ない。
店頭にたくさん並ぶのはそういう本だ。金を出してハズレ本を掴んだ虚しさは忘れがたい。
図書館はそういう商業主義とは一線を隔した存在だから古い名著が本棚の片隅にいつまでも残っていたりする。
そういう本を今の時代は検索システムで簡単に発見できる。
だから>>499に同意だ、ということ。
521側近中の側近 ◆0351148456 :2006/10/31(火) 22:35:21
(っ´▽`)っ
蟹飯読もうよ。
522デフォルトの名無しさん:2006/10/31(火) 23:08:09
1)if(N[i]!=0)
2)if(N[i]=!0)
この二つの違いを教えていただきたいのですがお願いします。
523デフォルトの名無しさん:2006/10/31(火) 23:10:58
1)if(N[i] != 0)
2)if(N[i] =! 0)
この二つの違いを教えていただきたいのですがお願いします。
524デフォルトの名無しさん:2006/10/31(火) 23:11:43
1はn[i] が 0のとき 真
2はn[i] が 0じゃないとき 真
525524:2006/10/31(火) 23:15:00
間違った

>1)if(N[i] != 0)
n[i] が 0じゃないとき 真

>2)if(N[i] =! 0)
これの場合
代入演算になるな
0の否定を N[i] に代入しなさいって
526デフォルトの名無しさん:2006/10/31(火) 23:16:02
>>520
ああ、ちゃんと読んでなかったなすまん
近くに大学あるなら是非行ってみるべきだと思うな
目に見えてぼろぼろになってる本とか、そのまま評価になりうると思うよ
527側近中の側近 ◆0351148456 :2006/10/31(火) 23:17:06
(っ´▽`)っ
>2)if(N[i] =! 0)
0の否定=1
だから、常に真になるわけだね。
528デフォルトの名無しさん:2006/10/31(火) 23:17:24
>524
1と2は逆じゃないんですか?
まだよく分からないんですけど・・・
529デフォルトの名無しさん:2006/10/31(火) 23:18:32
>>525さんありがとうございますm(__)m
530524:2006/10/31(火) 23:19:28
書き忘れ

>>523
>2)if(N[i] =! 0)
0の否定を N[i] に代入
それを if が評価する
if( ! 0 ) と同じになり評価式の中で評価と代入を行ってる

例としては
if( S = ( A == 0 ) )
Aと0を評価してその結果をSに代入ってこと

531デフォルトの名無しさん:2006/10/31(火) 23:21:18
>>523 が、
>2)if(N[i] =! 0)
て書いてて、'=!'なんていう演算子あったっけ??と
びっくりしたが、何のことは無い、
2)if(N[i] = !0)
というふうにコンパイラ君は理解するんだな。びっくらこいた。
警告レベルをW4にして、納得した。
結局
2)if(N[i] =! 0)
の括弧の中身は必ず真になるからこのif文は無意味だね。
532デフォルトの名無しさん:2006/10/31(火) 23:22:26
>>523
これはいい質問だった
533524:2006/10/31(火) 23:25:35
>>531
警告でない?
BCBでこれやると「おそらく不正な代入」ってでる
534デフォルトの名無しさん:2006/10/31(火) 23:35:25
>>533
 VCをデフォルト設定で使っていて、警告レベルがW1だったから
最初は警告が出なかった、ただそれだけだがね。
すぐに気がついて警告レベルをW4(最高)に上げて警告を確認したよ。
「条件式の比較値は、代入の結果になっています。」ってね。
VCは警告レベルW3でもこの警告出ないんだよね。
535524:2006/10/31(火) 23:41:08
>>534
>>531
>警告レベルをW4にして、納得した。
これ見て納得した...警告出てたのね
>>523にしてもそうだがよく読まずレスしてしまった
で見返してから気づく...ちげぇーじゃんって
スマソ
536どんずまり:2006/10/31(火) 23:43:58
昨日はソースの提供ありがとう御座います、おかげさまで関数で配列のポインタの呼び方を覚えました。
537475:2006/10/31(火) 23:52:46
>>536
そうやってきちんとレスを返してくれると、
今度また質問に答えようかな、という気持ちになるんだよね。
なにもレスがないとさびしさで死んじゃうよ。
538側近中の側近 ◆0351148456 :2006/10/31(火) 23:56:24
>>537
(っ´▽`)っ さびしいなら私が抱きしめてあげるよ☆(抱
539401:2006/10/31(火) 23:59:08
ああ、スルーされてる・・・
ヘルプミー!!
540デフォルトの名無しさん:2006/11/01(水) 00:02:24
>>539
>>401で三次元配列に格納する値って何ですか?
541どんずまり:2006/11/01(水) 00:05:25
それでまた質問なのですが、問題が画面から1文字ずつ数字を配列に入力して
数字配列をatoiして数値配列にし、奇数のみ画面に出力したいのですがfor,for文だと
うまくいきますが、for,while文にするとセグメンテーションエラーになります、なぜでしょうか?
#include <stdio.h>#include <stdlib.h>//2行分です
void func(char *ch,int max,int *nm);
int main(void){
char str[10+1];
int num,number[10];
printf("数字を10個(10桁以内)入力してください\n");
func(str,10,number);
printf("入力された奇数のみ出力します\n");
for(num=0;num<10;num++){
printf("%d番目の配列の出力\n",num);
if(number[num]%2==1){
printf("%d\n",number[num]);
}}}
void func(char *ch, int max, int *nm){
int C=0,d;
for(d=0;d<max;d++){
//while((ch[c]=getchar())!='\n'){c++;}
for(c=0;c<max;c++){
ch[c]=getchar();
if(ch[c]=='\n'){
ch[c]='\0';
break;
}}
ch[c]='\0';
nm[d]=atoi(ch);
}}
542401:2006/11/01(水) 00:07:49
>>540
ピクセルのRGB値です。
例えば
color[100][100][0]なら100行100列目のR値です。
543デフォルトの名無しさん:2006/11/01(水) 00:09:50
>>541
それは無理に押し込めるより
テキストにしてうpにした方がいいだろ・・・・
544401:2006/11/01(水) 00:16:58
あー違った
101行と101列です
545どんずまり:2006/11/01(水) 00:35:54
>>543さん
どーゆうことですか?
546デフォルトの名無しさん:2006/11/01(水) 00:37:28
>>541
cは、どこで初期化してるの?
多分こうしたかったんでしょ?
どうかな?

void func(char *ch, int max, int *nm){
 int c=0,d;
 for(d=0;d<max;d++){
  while((ch[c]=getchar())!='\n'){c++;}
    ch[c]='\0';
    nm[d]=atoi(ch);
    c=0;
 }
}
547デフォルトの名無しさん:2006/11/01(水) 00:39:18
>>544
ごめん。本当に何が言いたいのか分からない。
画像の何をどのようにしたいのか教えて。
548475:2006/11/01(水) 00:48:08
>>546
 それで大体の問題は解決しますよね。
でも一回の入力で11文字以上入力するとやっぱり同じです。
無理して書くと、
while(((ch[c]=getchar())!='\n') && (c < 10)){
みたいな感じかな。もっともおすすめしないけれど。

要するに>>541だと、
ポインタchが指している領域を超えて入力が
行われる可能性があるのが問題。バッファオーバーランの類。
このソースの場合、10文字までしか文字を入力できないつもりで
書いているんだろうけど、実際には無限に無理やり書き込む
ことができるようになってるんだよね。でも領域は10文字分
しかないからセグメンテーションフォルトが起きる。
根本的に変えなきゃならない点がいくつか・・・
549質問:2006/11/01(水) 00:48:41
最初に構造体のサイズを指定して新たに要素を追加できないようにすることは可能ですか?
例えば、この構造体は50byteと決めると50byte以内の要素しか持てないようにするといった具合です
550401:2006/11/01(水) 00:58:01
>>547
三次元配列に格納されている
画像のデータを上下反転させたいです。
551475:2006/11/01(水) 01:17:09
>>541

>>543 が言ってたアップローダ使用。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2861.txt
二種類のソースを見比べてみてね。

眠いから帰るぽ。
552どんずまり:2006/11/01(水) 01:18:07
>>546さん
ありがとう御座います。
明日すぐに試して報告します。
553デフォルトの名無しさん:2006/11/01(水) 01:54:34
>>541
 10桁の数値だと、signed intの限界
2147483647を超えることがあるじゃん。
30億とか入力すると変なことが起きるぞ。
554デフォルトの名無しさん:2006/11/01(水) 02:02:49
長さをあらわす文字列が入力されたとき、
"10cm"   -> "10" "cm"
"5mm"    -> "5" "mm"
"1e2 km"  -> "100" "km"
"0.5xx"   -> "0.5" "xx" この場合はエラー表示する
みたいに分解したいんですけれど、どういう方法でやればよいでしょうか?
555デフォルトの名無しさん:2006/11/01(水) 02:08:54
分解して、必要ならエラー処理するしかないだろなー。
strtok、strstrあたりでググリなされ。
556デフォルトの名無しさん:2006/11/01(水) 02:15:42
>555
ありがとうございます。
その分解の方法で悩んでいるのですが、数字とアルファベットの境で
分解するには、どういう方法が良いでしょうか?境に必ずしも空白が入っている
とは限らないので。
557475:2006/11/01(水) 02:18:11
>>554 邪道。おすすめはしないよ。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[256];
char *error;
double d;
puts("数値と単位を入力せよ:");
fgets(str, sizeof(str), stdin);
str[strlen(str)] = '\0';//fgetsの改行文字を捨てる
d = strtod(str, &error);
if (error != NULL)
{
printf("%f\t%s\n", d, error);
}
return 0;
}
558デフォルトの名無しさん:2006/11/01(水) 02:39:37
>557
ありがとうございました。
大変参考になりました。
”邪道”と書かれていますが、どのあたりが邪道ですか?
いい感じだと思うのですが。
559デフォルトの名無しさん:2006/11/01(水) 05:11:25
うんちー
560デフォルトの名無しさん:2006/11/01(水) 06:01:42
>>554
strtol()でもいいね。
Ex.
char * unitName;
char * test = "10cm";
long value = strtol(test, & unitName, 0);
printf("%ld[%s]\n", value, unitName);
561デフォルトの名無しさん:2006/11/01(水) 06:25:40
floatやdoubleなど、小数を扱える変数が、
2や3ぴったりになっているのを確認するにはどうしたら良いでしょうか?
現在、「intにキャストして、元の変数と比較してイコールならぴったり」
という処理を考えているのですが、別の方法はありますでしょうか?
562デフォルトの名無しさん:2006/11/01(水) 06:27:36
intだと仮想部足りないから一部の数字でうまく動かない。
x==floor(x)とかでいんじゃね。
563デフォルトの名無しさん:2006/11/01(水) 06:37:03
おお、値を切り捨ててくれる関数があったんですね!
恥ずかしいですが、初めて知りました。
レスありがとうございました。
564デフォルトの名無しさん:2006/11/01(水) 06:46:04
>>550
だから画像のデータって何なのよ?
三次元配列って言っても型も何も提示しなければ分からないよ。

まずは、作ったものを提示してください。
そこから"どの様に動いて"、"どうしたいのか"を馬鹿にも分かるように伝えてください。
それが出来なければ多分これ以上、ここで助けを求めても無理だと思います。

565デフォルトの名無しさん:2006/11/01(水) 08:33:19
質問させてください
時間微分を含んだ微分方程式を
離散化して解こうとしているのですが

I=1,j=1
I=2,j=1
I=3,j=1.
.
.
I=30,j=1
I=1,j=2
I=2,j=2
.
.
I=30,j=30
といった具合にもとめた答えを
次の時間に反映させるにはどうしたらいいのですか。
またひとつの時間毎にノートなどの
テキストファイルに出力するにはどうしたらいいでしょうか
566デフォルトの名無しさん:2006/11/01(水) 08:33:37
>>550
これでいいんじゃないの?

int y;
for(y=0; y<(高さ); y++) {
 // y 行目と (高さ-y-1) 行目をひっくり返す
}

配列はビットが並んでることが保証されてるから、
入れ替えはこの際 memcpy で、幅×色数×深度 分コピー
567デフォルトの名無しさん:2006/11/01(水) 08:35:47
>>565
微分方程式とか考えれるだけの頭があるんなら、
やりたいことがその質問で本当に伝わるかどうかくらい考えられないか?

意味不明
568デフォルトの名無しさん:2006/11/01(水) 08:53:58
>>567
すいません、、、
伝熱の解析をやろうと思ってるんですが
 →j
↓i
┌ ┬ ┬ ┬      ┬ ┐
 1.1 1.2 1.3       1,30    
├ ┼ ┼ ┼      ┼ ┤
 2.1 2.2          2,30     
├ ┼ ┼ ┼      ┼ ┤
 3.1.....             
.
.

├ ┼ ┼ ┼      ┼ ┤
               29,30
├ ┼ ┼ ┼      ┼ ┤
            30,30
└ ┴ ┴ ┴      ┴ ┘
こういった感じに区切られた格子内の
それぞれの温度を数値で求めたいと思っています
そして全部もとまったら時間をΔt進めて
次の計算に使うようなことをしたいです
またノートなどにそれを毎回保存させていくにはどうしたらいいでしょうか
文章が下手ですいません;
569デフォルトの名無しさん:2006/11/01(水) 09:13:04
超絶エスパーのオレが解析

Iとjというペアになっている値を大量に求める処理を複数回実行したい(時間をΔt進める)のだが、結果を再利用する方法がわからない
また、計算結果のログを取りたいのだがファイルの入出力も分からない
570デフォルトの名無しさん:2006/11/01(水) 09:17:43
>>569
ありがとうございます
まさにそのとおりです・・・
571デフォルトの名無しさん:2006/11/01(水) 09:55:53
とりあえず温度を配列[31][31]にする。(上の図だと0,0が無いので)
温度の計算をI、J、時間が引数の関数にする。結果をテキストで出力。

で、微分方程式って何?
572デフォルトの名無しさん:2006/11/01(水) 10:09:26
#include <stdio.h>
int main(void)
{
int i=10;
double d=2.0;
printf("%d\n",i>0?i:d);
return 0;
}
iの値がうまく表示できません。printf内の変換仕様を%fに変えれば
10.00000と表示され、手持ちの参考書にもこのとおりになると書かれているのですが,
なぜdouble型になっているのかがわかりません。
なぜこのようになるかどなたか教えてください。お願いします。
573デフォルトの名無しさん:2006/11/01(水) 10:19:30
式中に複数の型があり、上位の型であるdouble型にキャストされている
574デフォルトの名無しさん:2006/11/01(水) 11:32:56
質問です
円の領域内に入っているかどうかでif文を使いたいのですが
以下のような形で二乗をあらわしてもいいのでしょうか?

if((x[i]-x[po])^2+(y[i]-y[po])^2<=(z[i]-z[po])^2){
〜〜〜
575デフォルトの名無しさん:2006/11/01(水) 11:49:13
>>574
^ は XOR 演算子だ
乗数が欲しいなら pow() を使うか (x[i]-x[po]) * (x[i]-x[po]) って書け
576デフォルトの名無しさん:2006/11/01(水) 12:26:48
>557
>560
ありがとうございました。この方法を採用させていただこうかなあと
思っているのですが、こういう処理を汎用的にこなせる、より一般的な
方法とかアルゴリズムみたいなのはありますか?正規表現とか使うと
いいのでしょうか?
577デフォルトの名無しさん:2006/11/01(水) 13:14:40
>>568
現在時刻 t における 要素の評価量を Q(i,j)|t とする

偏微分方程式を求める際、前回評価量を利用するような形にもっていく → 差分方程式化
 Q(i,j)|t+Δt  =  Function(Δt, Q(i,j)|t)
ここの部分を関数化してしまう。
@ diffeq(array, dt); // 渡された配列 array を初期値にし、dt 後の結果を array へ上書きする
             // 戻り値に <各要素での書き換え前後での差の絶対値>の最大値 を戻すと幸せになれるかも

array の中身をファイル出力なり、画面出力なりする関数を作る
A printout(array); // array の中身を可視化/ログ保存

あとは 時刻t=0 においての初期状態 を array に突っ込んで @A をぐるぐる回すだけ。
# @での書き換え量の最大差が一定量以下になったときが、ループの止め時
578デフォルトの名無しさん:2006/11/01(水) 14:04:02
>>577
ありがとうございます。
差分方程式化やってみます!
579デフォルトの名無しさん:2006/11/01(水) 15:54:21
>>578
時間微分を微分の定義通りにばらしていけば差分化は簡単だぞ。
dF/dt = limit|dt→0 { (F(t+dt) - F(t)) / dt }

dt がゴミとみなせるほど小さいと仮定して limit|dt→0 をひっぺがす
dF/dt ≒ (F(t+dt) - F(t)) / dt

あとは、方程式側をごにょごにょして F(t+dt) = F(t) たちの式 に変形できれば終了

C言語 っつーより解析学の問題だな
580デフォルトの名無しさん:2006/11/01(水) 16:24:51
すみません、記号「≒」の意味はどういう意味なんでしょうか?
581デフォルトの名無しさん:2006/11/01(水) 16:25:17
大体同じ
582デフォルトの名無しさん:2006/11/01(水) 16:26:25
「近似」な。
583デフォルトの名無しさん:2006/11/01(水) 17:08:14
ポインタって
変数の場所を指定したら
そこの関数でも使えるって感じですか?
584デフォルトの名無しさん:2006/11/01(水) 17:12:25
>>583
あくまで、場所を教えただけで、その中身がどうなろうと知らないよ。って感じ
585デフォルトの名無しさん:2006/11/01(水) 20:17:16
def
= って何ですか?(大体こんな感じの記号なんですが・。)
586デフォルトの名無しさん:2006/11/01(水) 20:28:14
ソフトバンク
587デフォルトの名無しさん:2006/11/01(水) 20:35:20
通話料ナル文字
588デフォルトの名無しさん:2006/11/01(水) 21:21:54
C と何の関係があるか知らんが

左辺を右辺で定義する
589デフォルトの名無しさん:2006/11/01(水) 21:34:27
>>579
ありがとうございます!
今日図書館で数値解析の本も借りてきてみたので
これから試してみようと思います。
590401:2006/11/01(水) 22:04:44
>>564
マルチポストはあんまり良くない事はわかってんだけど
海の向こうの方々に聞いてみたらあっさり解決しました。
書いたことあんまり変えてなかったんだけどなぁ
これがいろんな意味での差なのだろうか・・・
591デフォルトの名無しさん:2006/11/01(水) 22:13:00
>>589
そろそろスレ違いだけど、
有限要素法とか境界要素法の本が借りれれば目を通すと良いかもしれない。
運が良ければ、熱伝達のモデルがまんま出ているかもしれんぞ

# ほとんど流体か弾性体変形だろうけどね…
592どんずまり:2006/11/01(水) 22:44:52
昨日541でお世話になった、どんずまりです。
whileの初期化をしていないからエラーが起きるのはわかったのですが、

void func (char *ch,int max, int :nm){
int c,d;
for(d=0;d<max;d++){
c=0;
while((cd[c]=getchar())!='\n'){c++;}
if(c>10){
printf("10桁以上入力しています、入力しなおして下さい。\n");
c=0;
d--;
continue;
}
ch[c]='\0';
nm[d]=atoi(ch);
printf("数字配列%dを出力しています\n",nm);//実験するとここがおかしな出力です。
}
}


10回入力し終わるとおかしな結果になります、-21145627?見たいな感じで奇数が出力されずこんな結果になります。
593デフォルトの名無しさん:2006/11/01(水) 22:57:49
>>592
桁あふれかも。
(signed)intの最大は2147483647(10桁)。
594デフォルトの名無しさん:2006/11/01(水) 22:58:04
1) 入力した数値文字の列が、int で扱える範囲を超えた
2) 呼び出し元側の ch[] の配列の大きさがそもそも 11個未満

# while 内で入力が配列突破する可能性あるんだけど…
# ch[]の器を越えて数値をタイプした後 [Enter] したらアウトじゃん
595デフォルトの名無しさん:2006/11/01(水) 22:59:12

あ。スマン。
漏れの環境(BCC5.5)だと。
596デフォルトの名無しさん:2006/11/01(水) 22:59:58
>>592
何してるかさっぱりわからんが、nm は配列じゃないのに nm[d] って何だ

597デフォルトの名無しさん:2006/11/01(水) 23:02:02
>>596
俺はUSキーなので確定で定かではないが、
宣言部で int :nm となってる。 脳内で int *nm と補完した
598デフォルトの名無しさん:2006/11/01(水) 23:03:43
オーバーフローは最大ギリギリで判断してエラー出す。
大量のタイプはユーザーが悪いってことにするために
あらかじめ注意メッセージを出しておくか、キーの入力を取って処理する
599デフォルトの名無しさん:2006/11/01(水) 23:06:40
>>597
なるほど、それじゃ

×>printf("数字配列%dを出力しています\n",nm);
○>printf("数字配列%dを出力しています\n",nm[d]);
600デフォルトの名無しさん:2006/11/01(水) 23:08:47
nm が配列なら
 printf("数字配列%dを出力しています\n",nm[d]);
nm が 単体なら
 nm = atoi(ch);

どちらにしろ、最低限コンパイルが通るソース晒せ
601どんずまり:2006/11/01(水) 23:11:59
すいません
void func (char *ch,int max, int :nm)ではなく
void func (char *ch,int max, int *nm)でポインタです。
メイン関数に戻したらエラー的な感じです。
602どんずまり:2006/11/01(水) 23:16:19
関数から配列に結果だけうけとって入力された値が奇数だったら画面に
出力する処理です。
桁数オーバーなんでしょうか?
603デフォルトの名無しさん:2006/11/01(水) 23:16:31
>>601
>>594も言ってるが

while((cd[c]=getchar())!='\n'){c++;}
これ ch[] の配列サイズのチェックしたほうがいいよな
604デフォルトの名無しさん:2006/11/01(水) 23:19:05
>>602
32ビット signed int だと 範囲は -2147483648〜2147483647 まで
605どんずまり:2006/11/01(水) 23:30:00
>>600さんへ
541に書いてあるソースの関数部分だけ変更しました。
606デフォルトの名無しさん:2006/11/01(水) 23:36:12
>>605
おまいは質問の仕方が下手っぴー だな。

>>541 からは
 printf() の出力が変なんだけどなんで?
しか読み取れんのよ。

その後の奇数がどーたら部分については皆目見当がつかんから答えようがない。

あと、「関数部分だけ変更しました」だけじゃ何がどーなったのか全然わからんがな。
せめて 入力どおり表示されるようになったのか
まだ入力と(その関数で表示している) printf() 出力がこーなってる とか
もう少しなんとか出来ないのか?
607606:2006/11/01(水) 23:38:21
スマン >>541 がフルソースだったんだな…
608デフォルトの名無しさん:2006/11/01(水) 23:42:10
まあ添え字オーバーうんぬんはおいといて、とりあえず
>>599
609603:2006/11/01(水) 23:44:53
>>605
これでどうよ
ただし,割り当て領域のチェックとかしてない
intのオーバーフローと配列のサイズのチェックは自分で作れ

#include <stdio.h>#include <stdlib.h>
void func(char *ch,int max,int *nm);
int main(void){
char str[10+1];
int num,number[10];
printf("数字を10個(10桁以内)入力してください\n");

func(str,10,number);
printf("入力された奇数のみ出力します\n");

for(num=0;num<10;num++){
printf("%d番目の配列の出力\n",num);
if(number[num]%2==1){
printf("%d\n",number[num]);
}
}
return 0;
}
}
610603:2006/11/01(水) 23:46:03
改行規制で書き込めないので続き↓

void func (char *ch,int max, int *nm){
int c,d;
for(d=0;d<max;d++){
c=0;
while((ch[c]=getchar())!='\n'){c++;}
if(c>10){
printf("10桁以上入力しています、入力しなおして下さい。\n");
c=0;
d--;
continue;
}
ch[c]='\0';
nm[d]=atoi(ch);
printf("数字配列%dを出力しています\n",nm[d]);
}
611どんずまり:2006/11/01(水) 23:51:40
printf("数字配列%dを出力しています\n",nm[d]);
最後のprintf分のnu[d]だけの修正ですよね?
明日メイン関数から試してみます。
結果は明日報告します。
612デフォルトの名無しさん:2006/11/01(水) 23:57:08
構造体の配列を受け取り、avrという値をもとに
クイックソートをする関数を作ったはずなのですが、
コンパイルは出来るものの実行すると
Segmentation faultになってしまいます。
何がおかしいのでしょうか?ご指南お願いします。

/*workargをavrが大きい順にソートする関数*/
void worksort(Work *workarg, int head, int tail){
int i, j;
float pivot;

i = head;
j = tail;

if ( i == j )
return;

pivot = workarg[tail].avr;

改行規制のため続く↓
613612:2006/11/01(水) 23:57:51
続き↓

while (i <= j) {

while (workarg[i].avr > pivot)
i++;

while (pivot > workarg[j].avr)
j--;

if ( i < j )
workswap(workarg, i, j);
i++;
j++;
}

if (head <= i-1)
worksort(workarg, head, i-1);
if ( j+1 <= tail)
worksort(workarg, j+1, tail);
}

void workswap(Work *workarg, int x, int y){
Work worktmp;

worktmp = workarg[x];
workarg[x] = workarg[y];
workarg[y] = worktmp;
}
614デフォルトの名無しさん:2006/11/02(木) 00:03:25
ひとつのプログラムでプロセスを多発させるような
サンプルを考えています。よい方法はないでしょうか。
たとえば、(無限ループはよろしくないかと思いますが)
void main()
{
 while(1) {
  fork();
  printf("A\n");
 }
}
fork()の使い方は、これでよいでしょうか。
615475%さびしがりや:2006/11/02(木) 00:21:37
 指摘したことがことごとくスルーされ、
かつ同じことが別人によって指摘されてちょっとへこみ中。
自己主張してみる。

>>592
>10回入力し終わるとおかしな結果になります、-21145627?見たいな感じで奇数が出力されずこんな結果になります。
→ >>553

>>594
>2) 呼び出し元側の ch[] の配列の大きさがそもそも 11個未満
># while 内で入力が配列突破する可能性あるんだけど…
→ >>548

で、自分なりに書いた修正ソース(2種)が >>551
intのオーバーフローはチェックして無い。
#define STRMAX 9
に変更すれば桁数は減るがオーバーフローは回避できる。
とりあえず、void func (char *ch,int max, int *nm);
という宣言はありえないと思っている。


#さびしがりやに2ちゃんねるは向いていない。
616デフォルトの名無しさん:2006/11/02(木) 00:23:35
unsigned longで扱える最大値が2^32だとして、その変数に格納しようとする式の値が
計算の途中や計算結果で2^32より大きな値になる場合、どの段階で値は狂っているんでしょうか?
617603:2006/11/02(木) 00:27:18
>>616
越えた時点でオーバーフロー
普通はエラーが出たり
618616:2006/11/02(木) 00:35:27
>>617
計算できる値の最大値 == 格納できる値の最大値 ということですか
CPUとかのハードウェアの計算能力の限界とは別問題(型と一緒だから処理系依存?)なんですね
即レスありがとうございました
619557:2006/11/02(木) 00:49:22
>>558
 strtodもstrtolも、君のやりたい
「数値と単位を分割する」ために作られた関数ではないため、
他人が見たらソースの意図がわかりにくいし、
予想外の動きをするかもしれない。だからおすすめする気になれなかったの。

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtol.3.html
ここでも熟読して、問題は無いか良く考えてみてください。
620603:2006/11/02(木) 01:06:41
>>618
>計算できる値の最大値 == 格納できる値の最大値 ということですか
たとえばchar 同士の演算の場合内部で拡張されint として扱われていたりする...(そのほうが処理しやすいからね)
これだとcharのサイズを超えても計算の段階ではintなので問題ないがそれをcharに入れるとオーバーフローを起こす
int同士の加算だと拡張のしようが無いのでオーバーフロー起こす
その後はコンパイラによってエラー処理をどうするか分かれる
普通はあふれ桁を無視すると思う

>CPUとかのハードウェアの計算能力の限界とは別問題(型と一緒だから処理系依存?)なんですね
そうだね、基本的にコンパイラに依存するね
通常は「CPUとかのハードウェアの計算能力」に応じてコンパイラがコード生成するから
621デフォルトの名無しさん:2006/11/02(木) 01:30:10
度、ラジアン、2sin,2cosの関数表を一次元配列でつくれ! 計算する角度は0から360で30ずつ増えていく ってプログラムなんですけどわかりますか? for を使うってのは分かるんですけどさっぱりでして
622デフォルトの名無しさん:2006/11/02(木) 01:31:47
>>621
分かります
623デフォルトの名無しさん:2006/11/02(木) 01:35:02
>>622
本当ですか for()
624616:2006/11/02(木) 01:47:14
>>620
ちゃんとハードに合わせてるんですね
longは同じですが、lccとVC++でintの大きさが違った(2→4)ので適当というか
作る人が良いと思ったように決めているのかと思ってました
625デフォルトの名無しさん:2006/11/02(木) 02:01:59
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>

//瓶取りゲーム
main(){
int bin_max;//瓶の総本数
int bin;//残り瓶の本数
int max = 3;//一度に取れる瓶の最大数
int p_turn = 0;//プレイヤーターンフラグ
int p_get,m_get;//プレイヤー、コンピュウターのそれぞれの取った瓶の数

int i;

srand(time(NULL));

//瓶の総本数を決める
bin_max = rand()%5 + 20;
bin = bin_max;

printf("【瓶取りゲーム】\n");
printf("交互に1〜3本の瓶を取ります。最後の一本を取った人が負けです。\n");
printf("瓶の本数:%d\n",bin_max);

626625:2006/11/02(木) 02:03:02
//先攻後攻を決める
printf("先攻[1] / 後攻[0] : ");
scanf("%d", &p_turn);
while(getchar() != '\n'){}
printf("==========あなたの");
if(p_turn ==1){printf("先攻");}
else{
p_turn = 0;
printf("後攻");
}

printf("スタート!==========\n");

627625:2006/11/02(木) 02:04:01
//瓶を交互に取る
for(;bin > 1; p_turn = !p_turn){
if(p_turn){ //プレイヤーのターン
do{
p_get = 0;
printf("何本取りますか?");
scanf("%d",&p_get);
while(getchar() != '\n'){}
}
while((p_get < 1) || (p_get > max));
bin -= p_get;
if(bin <= 0){printf("0になっちゃったよ・・・\n");}
}
else{ //コンピュウターのそターン
if(bin <= max + 1){m_get = bin - 1;}
else{m_get = rand()%max + 1;}
sleep(1000);
printf("コンピューター>%d 本取ったぞ!\n",m_get);
bin -= m_get;
}

628625:2006/11/02(木) 02:05:27
//残りの本数の表示
if(bin < 1){
for(i = 0; i < bin_max; i ++){
if(i < bin_max - bin){printf("□");}

else{printf("■");}
}
printf(" あと %d 本!\n",bin);
}
}

printf("==========ゲーム終了==========\n");

//勝敗判定
if(!p_turn && (bin <= 0)){p_turn = !p_turn;}
if(p_turn){printf("あなたの負け!又、挑戦してね!\n");}
else{printf("あなたの勝ち!\n");}

return 0;
}

警告 W8065 bintori.c 55: プロトタイプ宣言のない関数 'sleep' の呼び出し(関数 main
)
エラー E2206 bintori.c 62: 不正な文字 '(' (0x8169)(関数 main )
エラー E2376 bintori.c 62: For文に ( がない(関数 main )
警告 W8019 bintori.c 62: コードは効果を持たない(関数 main )
エラー E2379 bintori.c 62: ステートメントにセミコロン(;)がない(関数 main )
*** 3 errors in Compile ***

とエラーが出てしまいます、訂正したつもりですが、どうちがうのかわかりません
ご指摘お願いします。
629デフォルトの名無しさん:2006/11/02(木) 02:07:51
>>622
教えていただきたいのですが 
630デフォルトの名無しさん:2006/11/02(木) 02:18:51
>>628
>警告 W8065 bintori.c 55: プロトタイプ宣言のない関数 'sleep' の呼び出し(関数 main )
プロトタイプ宣言がないと言われている。sleep関数のプロトタイプ宣言が書かれた
ヘッダファイルをインクルードすればいい。どのファイルかはMSDNあたりで自分で探して。

>エラー E2206 bintori.c 62: 不正な文字 '(' (0x8169)(関数 main )
エラーメッセージに書いてある通り。全角の「(」が不正な箇所に使われている。
これを直せば62行目に関して出ている他のエラーも消えるはず。
631612:2006/11/02(木) 02:22:13
自己解決しました。
>>613の、

if ( i < j )
workswap(workarg, i, j);
i++;
j++;

を、

if ( i < j ){
workswap(workarg, i, j);
i++;
j--;
}

に書き換えればOKでした。
ただ、こうしてもソート結果が一部間違っているという
バグに見舞われていますが…('A`)。
632デフォルトの名無しさん:2006/11/02(木) 02:46:44
添え字番号が偶数の配列の和
同じく奇数の和を求めるスマートな方法を教えて下さい。
m(_ _)m
633612:2006/11/02(木) 02:49:49
さらに自己解決しました。

if ( i < j ){
workswap(workarg, i, j);
i++;
j--;
}



if ( i < j ){
workswap(workarg, i, j);
i++;
}

に書き換えたら正しいソート結果が出るようになりました。
634デフォルトの名無しさん:2006/11/02(木) 03:04:26
>>632
for(i=0; i<(sizeof(a)/sizeof(a[0])) ;i++) s[i & 1]+=a[i];
細かい点は適当に直して
635デフォルトの名無しさん:2006/11/02(木) 03:05:11
unsigned にオーバーフローなんてものは無いんだけどな
636632:2006/11/02(木) 03:12:25
>>634
ありがとうございます。
637625:2006/11/02(木) 03:48:06
>>630
質問してからずーっと、試行錯誤して考えていますが

>警告 W8065 bintori.c 55: プロトタイプ宣言のない関数 'sleep' の呼び出し(関数 main )
プロトタイプ宣言がないと言われている。sleep関数のプロトタイプ宣言が書かれた
ヘッダファイルをインクルードすればいい。どのファイルかはMSDNあたりで自分で探して。

これが解決しませんので、ご助言お願い致します。
638625:2006/11/02(木) 03:52:19
しかも、訂正したのを実行すると

【瓶取りゲーム】
交互に1〜3本の瓶を取ります。最後の一本を取った人が負けです。
瓶の本数:23
先攻[1] / 後攻[0] : 0
==========あなたの後攻スタート!==========


これだけでとまってしまいます。
639デフォルトの名無しさん:2006/11/02(木) 03:57:29
まず、MSDNライブラリにアクセスしろ。
http://msdn.microsoft.com/library/ja/

ないしはHDDに入れろ。
http://www.microsoft.com/downloads/details.aspx?FamilyID=373930cb-a3d7-4ea5-b421-dd6818dc7c41&DisplayLang=ja

そしたらsleepで検索しろ。
ちなみにMSの環境にsleepは無い。
あるのはSleep。
640625:2006/11/02(木) 03:59:49
>>639
ありがとうございました。
是非、やってみます。
641625:2006/11/02(木) 04:13:59
おさわがせして、度々申し訳ありませんが
参考書の付属ソースの実行結果だと
【びんとりゲーム】
交互に1〜3本のびんを取ります。最後の1本を取った人が負けです。
びんの本数:22
先攻 [1] / 後攻 [0] : 0
=============あなたの後攻でスタート!==============
コンピュータ> 3 本取ったぞ!
□□□■■■■■■■■■■■■■■■■■■■ あと 19 本!
何本取りますか?1
□□□□■■■■■■■■■■■■■■■■■■ あと 18 本!
コンピュータ> 2 本取ったぞ!
□□□□□□■■■■■■■■■■■■■■■■ あと 16 本!
何本取りますか?2
□□□□□□□□■■■■■■■■■■■■■■ あと 14 本!
コンピュータ> 2 本取ったぞ!
□□□□□□□□□□■■■■■■■■■■■■ あと 12 本!
何本取りますか?3
□□□□□□□□□□□□□■■■■■■■■■ あと 9 本!
コンピュータ> 1 本取ったぞ!
□□□□□□□□□□□□□□■■■■■■■■ あと 8 本!
何本取りますか?1
□□□□□□□□□□□□□□□■■■■■■■ あと 7 本!
コンピュータ> 3 本取ったぞ!
□□□□□□□□□□□□□□□□□□■■■■ あと 4 本!
何本取りますか?3

====================ゲーム終了=====================
あなたの勝ち!

ようになりますが、
642625:2006/11/02(木) 04:15:02
自分の書いたソースだと
【瓶取りゲーム】
交互に1〜3本の瓶を取ります。最後の一本を取った人が負けです。
瓶の本数:23
先攻[1] / 後攻[0] : 0
==========あなたの後攻スタート!==========
コンピューター>3 本取ったぞ!
何本取りますか?1
コンピューター>3 本取ったぞ!
何本取りますか?2
コンピューター>2 本取ったぞ!
何本取りますか?3
コンピューター>1 本取ったぞ!
何本取りますか?1
コンピューター>1 本取ったぞ!
何本取りますか?2
コンピューター>3 本取ったぞ!
==========ゲーム終了==========
あなたの負け!又、挑戦してね!

こうにしかなりません、エラーや警告は解決したはずなのに・・・・。
何処の何が違うのか検討すらつきません。
643625:2006/11/02(木) 04:15:44
□■
らが表示されません。
644デフォルトの名無しさん:2006/11/02(木) 04:29:15
if(bin > 1){

< の向きが逆。
あとデバッガつかえ。
645デフォルトの名無しさん:2006/11/02(木) 04:30:09
if(bin < 1){
for(i = 0; i < bin_max; i ++){
if(i < bin_max - bin){printf("□");}

else{printf("■");}
}
printf(" あと %d 本!\n",bin);
}

↑ここはこれでいいのか?
646625:2006/11/02(木) 04:34:18
>>644
>>645
ありがとうございました。

参考書にはそれについては載っていないのでデバッガでググッテみます。
647デフォルトの名無しさん:2006/11/02(木) 04:42:13
デバッガが使えるのと使えないのでは生産性に恐ろしいほどの差が出る。
早めに勉強して覚えちゃうのが吉だ。
ただ、デバッガの使い方はググるよりVSのマニュアル読んだ方が早いぞ。
648デフォルトの名無しさん:2006/11/02(木) 04:48:13
何から何まで、ありがとうございますm(__)m
649デフォルトの名無しさん:2006/11/02(木) 09:47:20
このスレで度々 void main() 表記がいけない様に言われていますが、
大学の講義や一部のC言語解説サイトにはvoid main()で記述されているのを見かけます。

void main()はどういった点でおかしいのか教えていただけますか?
650デフォルトの名無しさん:2006/11/02(木) 09:50:49
>>649
単純に言えばポータビリティがない。

void main()はCでは処理系依存の方法に該当する。
int main(void)やint main(int,char**)はCで規格で明確に定められた書式。

なもんでその処理系にどっぷり依存して糞ったれなコードを書きたいのならvoid main()でもいいよ。
651デフォルトの名無しさん:2006/11/02(木) 10:16:50
>>650
なるほど。C言語しかやっていなかったのが認識不足の原因だったのですね。
Cをステップに他の言語も習得したいと思っているので勉強になりました。

ありがとうございます!
652デフォルトの名無しさん:2006/11/02(木) 13:03:30
教えてくれ。

 enum MyEnum {
   ・・・
   ・・・
 };

と定義して、

使うときに必ずenumを付ける場合

 enum MyEnum func1(){
 
   enum MyEnum a;
 
   return a;
 }

と、enumを付けない場合

 MyEnum func2(){
 
   MyEnum a;
 
   return a;
 }

とでは、VC.NETではどちらでもOKのようなのだが、ANSIとか、あるいは、世の中の常識的には
そちらが良いでしょうか?
653デフォルトの名無しさん:2006/11/02(木) 13:13:44
おまえがやってるのはC++
654デフォルトの名無しさん:2006/11/02(木) 13:24:53
struct Foo { /* 中身 */ };
Foo func1() { Foo dmy; return dmy; }

が C++ では許されるのと同じ理由で enum Bar {}; で定義し、Bar val; と宣言ができる。
Cでは struct/enum の省略は許されない
655デフォルトの名無しさん:2006/11/02(木) 13:29:34
>653
>おまえがやってるのはC++

知らんかった。。。 _| ̄|○
サンキュウ!
656デフォルトの名無しさん:2006/11/02(木) 13:30:37
enum タグ名 {} 変数名

基本的にenumは「enum タグ名」型の変数を定義する。(タグ名、変数名のどちらかは省略可)
この変数は普通はint型でint型の他の変数と取りうる値域は変わらない。
型名は「enum タグ名」なのでenumを省略するのはあまり良くない。
657デフォルトの名無しさん:2006/11/02(木) 13:49:24
typedefも教えてやれよ
658デフォルトの名無しさん:2006/11/02(木) 14:54:06
Cでwebページ自動作成するプログラム書きたいのだけど
できますかね?
659デフォルトの名無しさん:2006/11/02(木) 15:23:09
>657
教えてけろ。たのむ。
660デフォルトの名無しさん:2006/11/02(木) 15:47:02
>>658
できますよ

>>659
typedef 定義済みの型名 新しく定義する型名

新しい型名を定義する。定義後は型名が追加されるだけで、定義済みのと置き換えるわけではない。
長い型名を省略、自己を説明するような型名、short付加による32ビットと16ビットとの互換など

もちろん、enum型、struct型も定義可能
661658:2006/11/02(木) 15:53:04
どのようにすればよいのでしょうか?
当方超ド素人です・・
662デフォルトの名無しさん:2006/11/02(木) 15:59:58
>包丁で料理したいんだけどできますかね?
→できますよ

>どのようにすればよいのでしょうか?

お前が言ってるのはこういう事だ
俺らはエスパーじゃねえ
663デフォルトの名無しさん:2006/11/02(木) 16:03:46
>>661
662も言ってるように質問が漠然として答えようがないよ。
まずは661が書いたソースを見せて、どこがどういう風におかしいと思うか具体的に書かないとレスもらえないよ。
664デフォルトの名無しさん:2006/11/02(木) 17:19:34
>Cでwebページ自動作成するプログラム
これを仕様とするならば、ランダムにタグを組み合わせれば出来る。
が、場所の確保やら画像やらを含めるとなると
665デフォルトの名無しさん:2006/11/02(木) 20:43:03
#include <stdio.h>
int main() printf("<html></html>\n"); }
666デフォルトの名無しさん:2006/11/02(木) 20:45:06
この分野に限ってはこういうスレにいるほとんどの奴はエスパーだろ。
ただそういった要望に応えるには世の中払うもん払ってもらわにゃやってられんというわけだ。
与えられた時間は誰にとっても有限なのだ。
667デフォルトの名無しさん:2006/11/02(木) 20:49:02
ID無いと不便だよな
668デフォルトの名無しさん:2006/11/02(木) 20:51:30
あ。 Cだったか。 1行なのに大間違い
× int main() { printf("<html></html>\n"); }
○ int main(void) { printf("<html></html>\n"); return 0; }
669デフォルトの名無しさん:2006/11/02(木) 21:21:52
関数マージと再起的定義を使ってマージソートをするプログラムを作りたいんですが
マージするところで数字がおかしくなってしまいます
マージ関数は教授にもらったものなので正しいと思うんですが・・・
http://kossie.run.buttobi.net/cgi-bin/up/src/kos0135.txt
ちなみにborland C++ でコンパイルしました。
670デフォルトの名無しさん:2006/11/02(木) 21:26:15
こういう{}の付け方なんか好きになれない
671669:2006/11/02(木) 21:30:44
↑のだと、直リンできないっぽいんで別の所に上げてみました。
http://bebe.run.buttobi.net/up/src/be_5443.txt
672デフォルトの名無しさん:2006/11/02(木) 21:59:51
>>669
>>671
かなり時間がかかってしまって申し訳ないが、

if(n==1)
data2[0] = data1[0];

の2行をmerge_sortに追加すればおkのような
673669:2006/11/02(木) 22:10:49
>>672
マジありがとうございました、できました。
674デフォルトの名無しさん:2006/11/03(金) 00:17:08
ftellで 2,147,483,647byte 超えるファイルの
終端のポイントを取得した場合どうなるの?
675デフォルトの名無しさん:2006/11/03(金) 00:43:07
鼻から悪魔が出る。
多分。
676デフォルトの名無しさん:2006/11/03(金) 00:44:38
>>674 SEEKができなくて、「そもそも取得できない」だろう。
んで、-1Lを返してエラー発生を知らせる。
fgetposにも注目。
http://www.kouno.jp/home/c_faq/c12.html#25
677デフォルトの名無しさん:2006/11/03(金) 00:56:19
こんなのがあるのか
さんくす!
678デフォルトの名無しさん:2006/11/03(金) 01:00:21 BE:89861292-2BP(204)
>>676
fseek()はできるんじゃないか?
679デフォルトの名無しさん:2006/11/03(金) 01:15:06
>>669
お、コレはうちの大学のだな。
680デフォルトの名無しさん:2006/11/03(金) 01:16:54
>>674
ラージファイルアクセス用の関数を使う
681デフォルトの名無しさん:2006/11/03(金) 01:19:29
WindowsならWin32関数を使おう
682デフォルトの名無しさん:2006/11/03(金) 01:21:41
このスレが本当に一番簡単なCのスレなのか・・・・
683デフォルトの名無しさん:2006/11/03(金) 01:24:52
>>682
大丈夫、下には下がある。
684デフォルトの名無しさん:2006/11/03(金) 11:05:13
テキストファイルを読み込んで構造体配列に格納するにはどうすれば良いでしょうか?
txtファイルには1行につき1件のデータが書き込まれており、そのデータはカンマで区切って5つ程の詳細データに別けられています。
685デフォルトの名無しさん:2006/11/03(金) 11:12:22
1行ずつ読み込んで、5個のデータに分割して格納すればいいと思うよ。
686デフォルトの名無しさん:2006/11/03(金) 11:22:23
>>684
それだけ書式がしっかり出来てるなら簡単。行ごとに読み込んでカンマ単位で取り出し格納
687684:2006/11/03(金) 12:32:27
for ( i=0; i<データ数; i++){
 fgets(line,fp);
 data[i].A = strtok(line,",");
 data[i].B = strtok(line,",");
};

こんな感じでいいんでしょうか・・・
C言語難しい(´・ω・`)
688デフォルトの名無しさん:2006/11/03(金) 12:52:15 BE:79876782-2BP(204)
>>687
strtok(line,",")の結果をどっかにコピーしないと、次のループでデータが上書きされるよ。
689デフォルトの名無しさん:2006/11/03(金) 12:57:25
ニホンノフユハサムイノ??
690デフォルトの名無しさん:2006/11/03(金) 12:58:07
すまそ、誤爆した。。
691デフォルトの名無しさん:2006/11/03(金) 14:25:06
scanfはエンターが押されるまで、ずっと待ち状態であって、
俺が求めてるのは、キーを押せばすぐその反応が返ってくる奴。

fgetsとsscanf使えとか言われたけど、その使い方がさっぱり分かりません
認識は一文字でかまわないので、その方法を教えていただきたい。


例えば終了コマンドで、 1 を入力すれば終了。 2 で続行。
それ以外なら、エンター待ちではなく、すぐ判断して、
また「入力してください」というのが、読み込まるような奴です。
言葉不足かもしれませんが、よろしくお願いします。
692デフォルトの名無しさん:2006/11/03(金) 14:30:11
switch文かIf文使えばいいんじゃん?
693625:2006/11/03(金) 14:55:32
質問があります

i = 0で
if(i < bin_max - bin){printf("□");}

この意味は、0より瓶の総本数の残りが大きければ
□を出力と言う事でしょうか?


694デフォルトの名無しさん:2006/11/03(金) 15:17:12
>fgetsとsscanf使えとか言われたけど
その人は多分「scanfは危険だからfgetsとsscanfを代わりに使え」
と言っただけで、

>scanfはエンターが押されるまで、ずっと待ち状態であって、
>俺が求めてるのは、キーを押せばすぐその反応が返ってくる奴。
という目的には使えないと思う。
VCだったら
int c = 0;
for(;;) {
puts("入力せよ。1:終了、2:続行");
c = getch();
if (c == '1') {
exit(0);//中身は適当に考えてくれ
break;
}
else if(c == '2') {
break;
}
}
ってやるけどね。conio.hとgetch()がない環境ではどうやるのか
私も知りたいのだが。
695デフォルトの名無しさん:2006/11/03(金) 20:28:42
getchでは無く _getch は ISO C++ 準拠みたい
ほとんどの環境で動くんで内科医
696デフォルトの名無しさん:2006/11/03(金) 21:26:40
それも非標準。
ISO準拠とは、単に命名が準拠しているだけ。
(下線で始まる識別子は処理系予約)
697デフォルトの名無しさん:2006/11/03(金) 22:08:13
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "GrWin.h"

int main()
{
float x,y;
int z;

GWopen(0);
GWindow(0.0, 0.0, 200.0, 200.0);

z=0;
for(y=20.0; y<180.0; y=y+20){
for(x=10.0; x<170.0; x=x+20)
{
GWsrect(x, y, x+10.0, y+10.0, z);
}
printf("\n");

}
return 0;
}

このプログラムを四角を描くたびに色を変えるには
どうすればいいんでしょうか??わかる人教えて下さい
698デフォルトの名無しさん:2006/11/03(金) 22:19:43
>>697
そのGWなんちゃらというものが何者か知らないが、
二重のfor文ループの中(GWsrectがある位置)で色を変える処理をすればいい。
そのライブラリでどうやって色を変えるかはC言語の問題じゃないので、
マニュアル見るなり他で調べるなりしてくるべし。
699デフォルトの名無しさん:2006/11/03(金) 22:42:25
>>697
マニュアルをみたけど
http://spdg1.sci.shizuoka.ac.jp/grwinlib/man.html#GWcolor

赤で塗りつぶすなら
GWcolor(4, 13);
でいいんじゃないか?4はブラシ、13は赤

でも、>>698さんの指摘どおりスレ違い
700デフォルトの名無しさん:2006/11/04(土) 01:10:54
12という数値をprintfで012と出力したいのですがどうしたらいいでしょうか
701デフォルトの名無しさん:2006/11/04(土) 01:21:20
printf("%03d", 12);
702デフォルトの名無しさん:2006/11/04(土) 01:22:01
>>700
printf("%03d", 12);
703デフォルトの名無しさん:2006/11/04(土) 01:58:22
>>701-702
ありがとうございます
704デフォルトの名無しさん:2006/11/04(土) 02:21:16
ソケット通信でsendとrecvのデータのやり取りを「char buf[256]」で行っているのですが、
例えば送る側が「int AAA」と「float BBB」を送り、受け取る側がこれらを受け取るにはどのようにすればいいのでしょうか。
なんでこんな初歩で躓いているのか自分が情けなく感じるorz
705デフォルトの名無しさん:2006/11/04(土) 02:26:51
>>704
スレ違い
ネットワークプログラミング相談室 Port18
http://pc8.2ch.net/test/read.cgi/tech/1159692799/

自分の環境の int , float が必ずしも受け取り手の in , float とは同じとは限らない。
整数のほうは htonl() / ntohl() で変換して binray で送れば済む。
浮動小数点数は… よーわからんな
706デフォルトの名無しさん:2006/11/04(土) 02:40:47
>>704
sprintf関数でテキストに変換して送るのが一番簡単。
floatの場合は精度という問題があるけど、有効な桁というのがあるはずだから
それで編集する。

ソケット通信で一番の肝は電文フォーマットの設計。
詳しくは「ネットワークプログラミング相談室」のスレで
707デフォルトの名無しさん:2006/11/04(土) 04:38:07
DOS窓で動作するCプログラムを作成しているのですが、
a.exeを実行すると
例えば・・そうだなぁ
#include <stdio.h>
main()
{
printf("hello");
}
とかでコンパイルして実行するとDOS窓が一瞬開いて一瞬で閉じちゃいますよね。
helloってメッセージを見る間もなく。
これを、Enterキーを押したらその窓を閉じる、と言うようにしたいのですが
それをなるべく簡単に実現する方法はありませんか?
私の思いつく方法だと
printf(" 0を入力するとプログラムを終了します。");
scanf("%d",&a);
while(a)
}
といった3行にもなってしまうもので、コレを手軽に1行でもっと短い命令で出来ないかなと。
708707:2006/11/04(土) 04:39:50
間違ったwww
>printf(" 0を入力するとプログラムを終了します。");
>scanf("%d",&a);
>while(a)
>}

scanfとwhileの場所入れ替え。
709デフォルトの名無しさん:2006/11/04(土) 04:43:59
system("pause");
710707:2006/11/04(土) 05:01:34
>>709
ありがとうございます。助かります。
711デフォルトの名無しさん:2006/11/04(土) 05:25:13
DOS窓のコマンドラインからa.exeと入力すればいいんだけどね
面倒がらずに
712デフォルトの名無しさん:2006/11/04(土) 05:44:43
IDEの利点をわざわざ殺すのもどうかと思う。
開発効率の面から言えば、しなくてすむ操作はしないに越したことはない。
713デフォルトの名無しさん:2006/11/04(土) 08:35:51
IDE ならデバッガ使えるってことになるが…
CRT のソースあるなら _atexit にでもブレ-クポイントおいといたら?

# main() の末尾でも良いけどね
714デフォルトの名無しさん:2006/11/04(土) 08:50:04
>>711
パイプになるような奴のチェックだとDOS窓から駆動したほうが良いよね。

DOS窓でターゲットまで移動するのが面倒なだけだw
ドライブまたがなければ、 cd [space] とタイプ後にフォルダを DOS窓へ D&D すりゃ
多少改善されるな。

俺は窓の手でフォルダ右クリックメニューのコマンドプロンプトで楽チン
715デフォルトの名無しさん:2006/11/04(土) 09:48:35
IDEなんて使わないだろ。常識的に考えて。
716デフォルトの名無しさん:2006/11/04(土) 10:13:28
>>707
scanf("%*c");
717デフォルトの名無しさん:2006/11/04(土) 11:13:54
Idee?
718デフォルトの名無しさん:2006/11/04(土) 18:13:19
Microsoft Visual C++ 2005のコンソールアプリケーションで、
それまでPrintfで出力したものをいったん全部消したい場合、
どうすればいいんでしょうか?

printf("\x1b[41m");
では削除されずに、
「[41m」
と出力されてしまうんです・・。
719デフォルトの名無しさん:2006/11/04(土) 18:25:49
>>718
それ使ってるんだったらwindowsアプリにすればいいんだぜ?
720デフォルトの名無しさん:2006/11/04(土) 18:53:11
719>>
いや、なんとかコンソールでやりたいのです・・m(_ _)m
721デフォルトの名無しさん:2006/11/04(土) 18:54:01
config.sys でansi.sysを読み込めば
エスケープシーケンスが有効になる。
それからクリアスクリーンはESC[21J。
722デフォルトの名無しさん:2006/11/04(土) 18:57:26 BE:319507788-2BP(204)
ansi.sysを使わなくても、なにか方法がありそうな気もするが。。。
723デフォルトの名無しさん:2006/11/04(土) 19:08:05
system("cls");
724デフォルトの名無しさん:2006/11/04(土) 19:16:53 BE:319507788-2BP(204)
>>723
そうそう。
ansi.sysがない環境でも、clsは画面クリアできてるんだから、
なにがしかの方法があるはずなんだけど。
725デフォルトの名無しさん:2006/11/04(土) 19:25:37
>>722>>724
Windows API
>>720
コンソールを使うWindowsアプリケーションというものもあるんだよ。
726デフォルトの名無しさん:2006/11/04(土) 19:31:20 BE:269585069-2BP(204)
>>725
そりゃ、win apiだろよ。
727デフォルトの名無しさん:2006/11/04(土) 19:32:23
clrscr();
728728:2006/11/04(土) 20:39:15
メンバ関数に配列を持つ、構造体配列を、関数に渡すには
どのようにすればよいのでしょうか?

struct AAA {
int BBB[10];
};

AAA CCC[100];

上のような定義だと、
たとえば、CCC[50].BBB[5]が参照できません。

よろしくお願いします。
729デフォルトの名無しさん:2006/11/04(土) 20:44:01
(´-`).。oO(意味がわからん・・・)
730デフォルトの名無しさん:2006/11/04(土) 20:44:15
できなくないよ。
731デフォルトの名無しさが:2006/11/04(土) 20:47:26
void function(struct AAA p[])
{
:
}

function(CCC)ってすれば、function()内で p[xx].BBB[x] が山椒できるんじゃねの?
732728:2006/11/04(土) 20:48:15
void DDD(AAA *CCC)
{
int box;

box = CCC[50].BBB[5];
}
↑のようにしては、うまく渡せてないみたいなので
どうすればよいのか、わかりません。
どうすればよいのでしょうか??

すいません。うまく説明できなくて。。。
733デフォルトの名無しさん:2006/11/04(土) 20:52:40
(´-`).。oO(その渡し方だとtypedefしないとダメなんじゃ・・・)
734デフォルトの名無しさん:2006/11/04(土) 20:55:49
間違いはない。値は渡る。
735デフォルトの名無しさん:2006/11/04(土) 20:57:19
(´-`).。oO(これで7は表示されないかい・・・)

#include<stdio.h>

typedef struct{
int BBB[10];
}AAA;

void DDD(AAA *CCC){
printf("%d\n", CCC[50].BBB[5]);
}

int main(void){
AAA CCC[100];
CCC[50].BBB[5] = 7;
DDD(CCC);
return 0;
}
736728:2006/11/04(土) 20:59:47
う〜ん。うまくいかないです。。。

すいません。あまり、関係ないと思って省略したんですが、
ほんとうは

struct AAA {
int BBB[10],EEE[10];
};

struct AAA CCC[100];

void DDD(AAA *CCC)
{
int box;

box = CCC[50].BBB[5];
}

で、DDD(CCC)で渡してます。

何か、根本的に間違っているのかもしれません。う〜ん。
737デフォルトの名無しさん:2006/11/04(土) 21:03:06
(´-`).。oO(それコンパイルエラーだろ・・・)
738デフォルトの名無しさん:2006/11/04(土) 21:03:54
(´-`).。oO(void DDD(struct AAA *CCC)・・・)
739デフォルトの名無しさん:2006/11/04(土) 21:04:16
CなのかC++なのかくらいハッキリしろ
740728:2006/11/04(土) 21:06:19
ごめんなさい。C++です。
あまり、かわらないくらいにおもってました。ごめんなさい
741デフォルトの名無しさん:2006/11/04(土) 21:07:41
742728:2006/11/04(土) 21:11:35
ご迷惑かけてすいません。
出直してきます。

ありがとうございました。
743デフォルトの名無しさん:2006/11/04(土) 21:11:42
スレタイ嫁カス
744デフォルトの名無しさん:2006/11/04(土) 21:12:11
(´-`).。oO(俺は>>740を許さない・・・)
745デフォルトの名無しさん:2006/11/04(土) 21:12:19
>>740
オマエにはこのくらいがちょうど良い
どうせあまりかわらないしな
template <std::size_t N>
void DDD(AAA (&CCC)[N])
{
int box:

box = CCC[50].BBB[5];
}
746デフォルトの名無しさん:2006/11/04(土) 21:12:26
>>742
出直すな二度とくるな
747デフォルトの名無しさん:2006/11/04(土) 21:40:12
まぁ落ち着こうぜwww
748デフォルトの名無しさん:2006/11/04(土) 22:57:17
718 です。

>>721〜727
system("cls");
で目的は達成できそうです。
どうもありがとうございます!!
749デフォルトの名無しさん:2006/11/04(土) 23:10:32 BE:314515679-2BP(204)
> system("cls"); 
winのコンソールは、これでOKなのか。
DOSの時代は、内部コマンドは直接呼べなかったのに。
750デフォルトの名無しさん:2006/11/04(土) 23:11:35
>>749
OKだお( ^ω^)
DOSってなんだお( ^ω^)
751デフォルトの名無しさん:2006/11/04(土) 23:40:02
dance of sound
752デフォルトの名無しさん:2006/11/05(日) 00:54:31
>>728
#include<stdio.h>
#include <string.h>

typedef struct {
int BBB[100];
}AAA;

int main()
{
AAA CCC;
memset(&CCC,0,sizeof(AAA));
printf("%d\n",CCC.BBB[50]);

return 0;
}

ってもう解決したかな・・・・
753デフォルトの名無しさん:2006/11/05(日) 01:53:02
1-3の間でランダムな数を実行時ごとに毎回異なるように生成して
変数aに格納したいのですが、それをなるべく簡単に実現する方法はありませんか?
C言語素人なもので、Web上に載っているコードが長くてちょいと覚えられそうに無くて
なるべく簡単なのをお願いしたいのですが・・・。

#include <stdio.h>
main()
{
int a;
a = 「ランダムな1〜3の数」;

ってな感じに・・・。で、起動時に毎回異なる値(必ず異ならなくてもいいけど(偶然同じ値になった
っていうこともあるだろうし)、なるべく異なるようにしたいのですが・・・
ちょっと調べた限りだと時間(Time)を絡めると毎回違う値に出来るみたいですが
コードがどうしても長くなりますかねぇ?簡単に書けないでしょうか?よろしくお願いします。
754デフォルトの名無しさん:2006/11/05(日) 02:11:46
自転車乗るのに自転車の細かい構造まで覚えたのか?
755デフォルトの名無しさん:2006/11/05(日) 02:26:30
>>754
えっと、どういう意味でしょうか?
756デフォルトの名無しさん:2006/11/05(日) 02:40:28
#include <stdio.h>
#include <stdlib.h>
#include<time.h>

#define LOW 0
#define HIGH 3

main()
{
int a;
srand((unsigned int)time(0));
a = LOW + (int)(rand()*(HIGH-LOW+1.0)/(1.0+RAND_MAX));
printf("%d\n", a);

return 0;
}

これで、どうよ?
757デフォルトの名無しさん:2006/11/05(日) 09:40:45
1から3までっつってんのに、
日本語読めねぇのかこのクズは?
758デフォルトの名無しさん:2006/11/05(日) 10:16:03
と真性クズが申しております
759デフォルトの名無しさん:2006/11/05(日) 10:47:16
メンドくせえことしてんなよ。
time(NULL) % 3 + 1
で充分だろ。
760デフォルトの名無しさん:2006/11/05(日) 10:58:18
いやそりゃまたなんつーかその、なんだ。
761756:2006/11/05(日) 11:42:46

#define LOW 0

#define LOW 1

にすれば1〜3の乱数がとれる。
>>753さんこれでどうですか?
762デフォルトの名無しさん:2006/11/05(日) 11:55:15 BE:174730875-2BP(204)
#define LOW 1 でもだめなんじゃね?
763デフォルトの名無しさん:2006/11/05(日) 14:02:25
>>753
毎回違う数字って・・・・・・
1/3の確率で同じ数字になるのはいいのか?

#include <stdio.h>
#include <stdlib.h>
#include<time.h>

#define MAX 3
main()
{
int a;
srand((unsigned int)time(0));
a = rand() % MAX +1;
printf("%d\n", a);

return 0;
}

これでどう?
764デフォルトの名無しさん:2006/11/05(日) 14:25:10
どなたかSnUploaderにアップされたファイル名を任意の形にする方法を
教えて頂けないでしょうか?
MAQxxxxx.MP4(xxxxxの部分はアップされた順に00001,00002という感じに)と固定したいんです。
ちなみにC言語とかそういうのはさっぱり分からないんで、どこをどうすれば
良いのか教えて頂ければ幸いです。
765デフォルトの名無しさん:2006/11/05(日) 14:34:18 BE:39938742-2BP(204)
そのSnUploaderってのはコレのこと?
http://sugachan.dip.jp/download/uploader.php
perlって書いてあるよ。
766デフォルトの名無しさん:2006/11/05(日) 14:35:06
>>764
二度とくるな
767753:2006/11/05(日) 15:56:36
多数のレスありがとう御座います。
とりあえずこれで解決しました↓

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
int random;
srand((unsigned int)time(NULL)); /* 初期化(決まりごと) */
random = rand() % 3 + 1; /* ランダム値の生成 */

なんか難しく感じる。覚えるのが大変・・・。
えっと、
random = rand() % 3 + 1;

    random = rand() % 4;
じゃダメなんですかねぇ?
768デフォルトの名無しさん:2006/11/05(日) 15:59:41 BE:69892272-2BP(204)
>>767
それだと、0〜3になるじゃん。
769デフォルトの名無しさん:2006/11/05(日) 16:30:27
>>767
覚えるのはrand()で乱数が得られるということだけだろ…
770デフォルトの名無しさん:2006/11/05(日) 16:32:28
猫でも分かるプログラミングを読みながら、最初のハローワールドのプログラムを作ってみたんですが、


/* hello */

#include <studio.h>

int main()

{
printf("Hello World!\n");
return 0;
}



これを、テキストファイルを拡張子をcに変えたものにMicro soft visual C++で打ち込んでビルドしてみたんですが、インクルードファイルが読み込めませんと出てビルドすることが出来ません。どうすればよいのでしょうか?
771デフォルトの名無しさん:2006/11/05(日) 16:35:41
>>770
stdio.hだよおばかさん
772デフォルトの名無しさん:2006/11/05(日) 16:39:32
>>767
rand()は0〜RAND_MAX の間の整数値を返す
random = rand() % 3 + 1;
rand() % 3 だと rand() を 3 で割った余り、つまり 0〜2 を返す
それに+1だから 1〜3 が戻る

random = rand() % 4;
これだと rand() を 4で割った余り 0〜3が返る
命題は1〜3であり 上記の方法だと当てはまらない(不要な 0 が含まれる)
773デフォルトの名無しさん:2006/11/05(日) 17:47:06
>>770
初心者にありがちなミスだな。studio、スタジオでもステュディオでもなくstdio
stdioってStandard I/Oだよな?
774デフォルトの名無しさん:2006/11/05(日) 18:37:38
>>749
デマを流さないように。
DOS時代もちゃんと環境変数COMSPECを見て、シェルにコマンドを渡してたよ。
775デフォルトの名無しさん:2006/11/05(日) 18:54:41
>>773
俺は今でもストディオと頭の中で唱えながら打ってる。ストは無声音stであってsutoではないが。
instructionをなんと読む?そう、インストラクションだ。日本語表記だと無声音が表現できないので少しつらい。
radioをなんと読む?そう、レィディオだ。日本語表記ではラジオだが。
stdioをなんと読む?そう、ストディオだ。
間違ってるか?
776デフォルトの名無しさん:2006/11/05(日) 19:03:14
>>775
無声音を夢精音って脳内変換した。

あとはそうだな、日本人として正しい流れだとは思う。
オレはスタンダードアイオーヘッダーって読んでるけどな。
777デフォルトの名無しさん:2006/11/05(日) 19:36:10
StandardInputOutput
778デフォルトの名無しさん:2006/11/05(日) 19:37:10
>>775
俺はインストュルクシュンと読む
779デフォルトの名無しさん:2006/11/05(日) 19:38:06
スタッドアイオー
780デフォルトの名無しさん:2006/11/05(日) 19:55:30

stdio
stdlib
stddef
stdarg
781デフォルトの名無しさん:2006/11/05(日) 20:21:46
えすてーでーあいおー
782デフォルトの名無しさん:2006/11/05(日) 20:45:10
俺は
えすてぃーでぃお
だなぁ
783デフォルトの名無しさん:2006/11/05(日) 20:50:22
stdioとしか読めない
784デフォルトの名無しさん:2006/11/05(日) 21:48:11
into main{ }と
into_ tmain(int argc, _TCHAR* argv[ ]{ }
の違いがわかりません。
誰か教えてください。お願いします。
785デフォルトの名無しさん:2006/11/05(日) 21:54:30
ネタとしか思えない
786デフォルトの名無しさん:2006/11/05(日) 22:38:21
とりあえず、うpれカス
787デフォルトの名無しさん:2006/11/05(日) 22:54:55
>>784
いみうんこなんだけどオレがおかしいのか?
788デフォルトの名無しさん:2006/11/05(日) 23:14:23
いや、俺にも意味わかんない
789デフォルトの名無しさん:2006/11/05(日) 23:15:42
>>787
実はそう

だったらどうしようとか思わないのか。
背中にさっと冷たいものが落ちてくるような突然の孤独感、湧き上がる恐怖。
それを感じたが最後二度と彼らの世界に戻ることは出来ないのだ。

ま、どんなに長くても寿命が尽きるまでの辛抱だ。
790デフォルトの名無しさん:2006/11/06(月) 00:17:04
インベーダーゲームのようなもので、それを3次元に拡張しようとしてるのですが
とりあえずすべての点を迎撃可能かを確認し、この集合の場合得られる最高の点は
いくらですってプログラムを作りたいのですが、手助けお願いできませんでしょうか?
得点の部分(p)はわからなかったので途中でやめて、まだ未完成です
以下プログラムの一部
for(po=0;po<=n;po++){/*自機の位置*/
for(i=1;i<=n ;i++){/*自機の位置から各点(敵の点)について迎撃可能か調べる*/
if(i==po)
continue;
if((x[i]-x[po])*(x[i]-x[po])+(y[i]-y[po])*(y[i]-y[po])<=(z[i]-z[po])*(z[i]-z[po])){
p=p_old+1;
printf("%d個めに入れた敵の座標から見た場合 点(x%d y%d z%d)",po,x[i],y[i],z[i]);
printf("・・・迎撃可能\n途中迎撃点数%d\n" ,p);

}
else {
printf("%d個めに入れた敵の座標から見た場合 点(x%d y%d z%d)",po,x[i],y[i],z[i]);
printf("・・・迎撃不能orz\n");
}
p=p_old;
}
}
printf("\n");
printf("この集合の場合の最大得点は%dである。\n",p);
}
791デフォルトの名無しさん:2006/11/06(月) 10:45:02
#include <stdio.h>
main()
{
int i,x;
x=1;
for(i=1;i<=40;++i)
{
printf("i=%d x=%d\n",i,x);
x=( x<< 1 );
}
}

これを実行した結果、i=33〜40の時がx=0になるのはなぜですか?
無知ですみません。
792デフォルトの名無しさん:2006/11/06(月) 11:03:32
x が32ビットだから。
793デフォルトの名無しさん:2006/11/06(月) 11:12:13
>>792
すみません。なぜ32ビットなんでしょうか?
794デフォルトの名無しさん:2006/11/06(月) 11:18:16
藻前の環境では int型が32ビットだからだ。
795デフォルトの名無しさん:2006/11/06(月) 11:22:21
変数 x の中身
1回目:00000000000000000000000000000001
2回目:00000000000000000000000000000010
3回目:00000000000000000000000000000100



32回目:10000000000000000000000000000000
33回目:00000000000000000000000000000000
796デフォルトの名無しさん:2006/11/06(月) 11:23:59
>>794-795
なるほど、どうもありがとうございます
797デフォルトの名無しさん:2006/11/06(月) 16:05:53
グローバル変数について質問です。
ファイルAにてグローバル変数int a=10;を宣言しました。
ファイルBにてスタティックなグローバル変数static int a=5;を宣言しました。
ファイルB内の関数funca()内でextern int a;を宣言した場合、ファイルBにて宣言したa(今回の場合5)になりますよね?
この場合ファイルBのfunca()の中で、ファイルAで宣言したa(今回の場合10)を使用することは出来ないのでしょうか?

ファイルA
int a=10;
int main(void){
return 0;
}
ファイルB
static int a=5;
funca(){
extern int a;
}
798デフォルトの名無しさん:2006/11/06(月) 17:16:38
訊く前に試せばいいだろ ぼけ
799デフォルトの名無しさん:2006/11/06(月) 17:19:10
>>784
int main{}
int _tmain(int argc, TCHAR* argv[] {}
おそらくこう書きたかったんだろうな。
他にこれもある
int main(int argc, char* argv[] {}
1番目と3番目は標準の書き方で、違いは引数のありなしだけ。
2番目と3番目の違いは第2引数の型。TCHAR型はWindowsプログラミングで使う。

で合ってる?正直C言語暦1ヵ月で自信がない
800デフォルトの名無しさん:2006/11/06(月) 17:23:38
1番目は標準から逸脱してるだろ。
2番目と3番目は引数だけでなくエントリーポイントも違う。
801デフォルトの名無しさん:2006/11/06(月) 21:04:23
俺には全部コンパイルエラーに見えるな。
802デフォルトの名無しさん:2006/11/06(月) 21:18:41
フリーのいいコンパイラない?
Borland C Compilerはごちゃごちゃして使いにくいし
LSI C Compiler試食版はバグあるし制限ありまくりだしコンパイラとしては最悪だし
今の所Cygwinのgccが最高なのですが・・・。

エディタはlcpad( CPad ? 試食版と一緒に使う奴)がかなり使いやすいですが
もっといいのあったら・・・。
Cygwinのコンソールでviを使って書くのは辛すぎる。
色分けもしてくれないし・・・
803デフォルトの名無しさん:2006/11/06(月) 21:27:23
VC++2005Express
というレスを今年で10回位書いた気がする
804デフォルトの名無しさん:2006/11/06(月) 21:29:28 BE:224653695-2BP(204)
>>802
vim入れたら?
色分けなんてイラネけど。
805デフォルトの名無しさん:2006/11/06(月) 21:33:47
Virtual PC + Emacs + gcc
806デフォルトの名無しさん:2006/11/06(月) 21:34:37
>>805
あ、忘れた

Virtual PC + Linux + Emacs + gcc
807デフォルトの名無しさん:2006/11/06(月) 21:37:20
gcc以上のコンパイラは(多分)ない
808デフォルトの名無しさん:2006/11/06(月) 21:37:30
>>802
フリーのエディタなんて探せばいくらでもあるだろ。
それはさておき、LSICのバグってなんだ? 一応元関係者みたいなもんだから聞いておきたいのだが。
#つーか、とうとう最悪にされちゃったか。
809デフォルトの名無しさん:2006/11/06(月) 22:02:14
CGIで使った時BCCやVCだと正常なのに、LSICだけエラーになったり。バグなのか何なのかよくわかんないけど。

それよりデフォのスタック小さすぎ。
810デフォルトの名無しさん:2006/11/06(月) 22:02:43
>>802
MS Visual C++ Toolkit
811デフォルトの名無しさん:2006/11/06(月) 22:20:41
設問
入力された単語の長さを横棒グラフにして表示するプログラムを作成せよ。
横棒グラフは単語の長さだけ'*'を表示する。ctrl + Z が入力されると処理を終了する。
812デフォルトの名無しさん:2006/11/06(月) 22:30:04
とりあえず、ctrl+Zが終了なのは何故なんだぜ?
813デフォルトの名無しさん:2006/11/06(月) 22:30:42
>>811
マルチ
814デフォルトの名無しさん:2006/11/06(月) 22:33:16
>>802
BCCのどこがごこちゃごちゃ?
gccとかわらんだろ
コマンドライン好きならVCExpressをIDE無しで使うとか
815デフォルトの名無しさん:2006/11/06(月) 22:34:06
>>812
MS-Windows の EOF だから
Linux なら Ctrl-D かな
816デフォルトの名無しさん:2006/11/06(月) 22:35:36
設問
入力された単語の長さを横棒グラフにして表示するプログラムを作成せよ。
横棒グラフは単語の長さだけ'*'を表示する。ctrl + Z が入力されると処理を終了する。
なお、『ctrl + Z』はEOFとみなすものとする。
817デフォルトの名無しさん:2006/11/06(月) 22:35:55
>>802
BCC のコンパイラが吐くメッセージは分かりやすいので初心者におすすめ。
変なファイルができるのが嫌いだが・・・
818デフォルトの名無しさん:2006/11/06(月) 22:47:03
>>809
LSICはよく知らないし別に擁護するわけでもないけど、
バグかどうか分からないのにコンパイラのせいにするのはやめたほうがいいよ。
自分のプログラムに未定義動作または処理系依存の処理があって、他のコンパイラでは
たまたま動いていただけかも。

学生時代に、プログラムが自分の思ったとおりに動かないとすぐに
コンパイラのバグだとヒステリックに騒ぐ困ったちゃんがいたのを思い出した。
819デフォルトの名無しさん:2006/11/06(月) 23:06:42
>自分のプログラムに未定義動作または処理系依存の処理があって、
>他のコンパイラでは たまたま動いていただけかも。
 私もそう思う。
http://www.amy.hi-ho.ne.jp/~lepton/program/prog/prog36.html
これの5みたいな奴だろう。
820デフォルトの名無しさん:2006/11/06(月) 23:18:18
>>816
K&R ?
821デフォルトの名無しさん:2006/11/06(月) 23:21:43
>>816
単語は、いくつ入力できるの?
横棒グラフを表示するタイミングはいつ?
822どんずまり:2006/11/06(月) 23:37:41
もう少しで出来そうなソースなのですが、質問です。
#include<stdio.h>
#include<stdio.h>
int keta();
void func(char *st,int *nm);

int main(void){
int num1,num2,sum;
printf("1つめの数字を入力してください\n");
num1=keta();
printf("2つめの数字を入力してください\n");
num2=keta();

sum=num1+num2
printf("合計値は%dです。\n",sum);
}
823どんずまり:2006/11/06(月) 23:38:34
続きです
int keta(){
char str[10];
int number;

for(;;){
func(str,&number);

if(number>9){//numberが9より大きかったらもう一度func関数を呼びたい
printf("INPUTERROR\n");
continue;
}else{
break;
}
}
}

void func(char *st,int *nm){
int c=0;
while(st[c]=getchar())!='\n'{c++;}
st[c]='\0';
c=0;
*nm=atoi(st);
}
824どんずまり:2006/11/06(月) 23:40:06
すいません問題を言うの忘れてました。
1桁+1桁の処理で、2桁以上入力したらエラーになる処理です
825デフォルトの名無しさん:2006/11/06(月) 23:46:19
>>824
問題はわかったけど質問はなんだ?
826どんずまり:2006/11/06(月) 23:50:01
すいません、質問の仕方が非常に悪かったです。
1桁+1桁を行い合計値を求めると言う問題です。
ただし2桁以上入力したらエラーにしなくてはいけません。
827デフォルトの名無しさん:2006/11/06(月) 23:57:46
いやだから、問題はわかったけど、質問はなんだ?
828デフォルトの名無しさん:2006/11/07(火) 00:02:30
エスパーが必要か・・・ふぅ。

>while(st[c]=getchar())!='\n'{c++;}
ここでバッファオーバーランが起きるのがまずいんじゃね?
つーかここのとこ、いつまでたっても理解してくれないね、君。
475からずっとソース書いてるが・・・
829デフォルトの名無しさん:2006/11/07(火) 00:05:06
厨臭い質問ですいません。

初めてプログラミングしたくなったので、C言語でもやろうかと思ってるんですが、
中学生の超初心者にも分かりやすい解説本をいくつか上げてくれませんか?

俺・・・プログラミング経験なし・コードすらみたことなし。厨房三年。

理解力はとぼしいので、私に向いてる御本をいくつか紹介お願いします。
830デフォルトの名無しさん:2006/11/07(火) 00:05:26
オーバーラン以前にコンパイルエラーだろ
831デフォルトの名無しさん:2006/11/07(火) 00:10:28
>>829
そんな甘い考えを持っているのなら、やらないほうがいい。
せいぜい学校の勉強をしっかりとやること。
なお英語をすらすら読めるようにしておくと便利。
832デフォルトの名無しさん:2006/11/07(火) 00:10:31
>>826
あせらなくていいから、もう少し自分が書いた文章を見直して、
それを読んだ人に何が伝わるかを考え直したほうがいい。

コンピュータ言語と自然言語、まったく別のようだが、相手に何かを伝えるという目的は同じ。
自分はこういう"つもり"で言っている、こういう"つもり"で書いている、ではなくて
相手がどのように理解できるかが大事。
君が何を意図していようが、相手はそこに書いてあることしか理解できない。

細かい文法や技術的な知識を身につける必要もあるけど、
それ以前に文章の書き方にも意識を払うようにしたほうがいいよ。
833デフォルトの名無しさん:2006/11/07(火) 00:13:39
セミコロンの書き忘れとか、正しく行番号指定してくれない時あって困ったことはあった<LSIC
マニュアル読もうとしなかった自分もかなり悪いんだろうけど
834デフォルトの名無しさん:2006/11/07(火) 00:15:07
>>829
はじめてのCでも読んでみたらどうだろう?

ただ>>831も言ってるように甘くはない
数学の知識と思考力は身につけておいたほうがいい
835どんずまり:2006/11/07(火) 00:16:31
すいません。
while(st[c]=getchar())!='\n'{c++;}の処理はほぼ毎回使っています。
しかし今回の問題は475とは別の問題です。
画面から1桁入力して1桁だったら問題なし、2桁以上だったら
"INPUTERROR"でもう一度入力しなおしで、
只単に1桁+1桁で関数を使い合計値を求める問題です。

836デフォルトの名無しさん:2006/11/07(火) 00:16:38
scanfでいつも&を付け忘れるのは俺だけでいい
837デフォルトの名無しさん:2006/11/07(火) 00:17:52
>>829
高校受験の勉強を真面目にした方がいいと思うんだが
838デフォルトの名無しさん:2006/11/07(火) 00:19:18
分かった。

はじめてのCより数学3年らくらく基本問題集買ってくる。
839デフォルトの名無しさん:2006/11/07(火) 00:19:47
>>836
最初に読んだ本のおかげか整数使う時はgetsとatoiつかってたよ
840デフォルトの名無しさん:2006/11/07(火) 00:20:24
>>835
 最後にもう一度だけ聞く。

「プログラムに、どんな不具合が起きているのか説明しろ!!!」

いいかげんにしろ。
841どんずまり:2006/11/07(火) 00:26:32
不具合のことだったんですね、今わかりました。
申し訳ありません、今自宅で環境が無くちょっと説明できません。
842デフォルトの名無しさん:2006/11/07(火) 00:27:13
>>835
おまいさんはプログラムの勉強をする前に、やるべきことがある。
・人の話をきく
・客観的に自分の言動を見る
・発言をする前に、自分が何を言おうとしているかを整理する。
などなど。

この件に限らず、実生活の中で「どうして自分の言っていることが、相手は分かってくれないのだろう?」
と感じることが多くないか?
843デフォルトの名無しさん:2006/11/07(火) 00:28:15
>>829
プログラミング言語よりも自然言語(日本語など)を身に付けろ。

どんずまりのグダグダを見ていて思った。
844デフォルトの名無しさん:2006/11/07(火) 00:28:16
>>842
ツラレテヤガル。
845デフォルトの名無しさん:2006/11/07(火) 00:43:05
>>816
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX_STRLEN 250

typedef struct record{
char word_data[MAX_STRLEN];
struct record *next;
} WORD_RECORD;

int main(){
WORD_RECORD *data,*head_data;
int str_length;
head_data = data = calloc(1,sizeof(WORD_RECORD));
while(1){
if(gets(data->word_data) == NULL){
break;
}
data->next = calloc(1,sizeof(WORD_RECORD));
data = data->next;
}
846デフォルトの名無しさん:2006/11/07(火) 00:43:48
data = head_data;
while(data != NULL){
head_data = data->next;
str_length = strlen(data->word_data);
while(str_length--){
printf("*");
}
printf("\n");
free(data);
data = head_data;
}
return 0;
}
こんなんでどう?
文字数もメモリが許す限り何文字でも使える設定にしたかったけど自分の力じゃコレが限界。
コメント無しの汚いソースだけど少しでも参考になれば光栄です。
847デフォルトの名無しさん:2006/11/07(火) 01:16:28
>>841
>〜求める問題です。

>>825 は無視?
>>827 も無視?
848デフォルトの名無しさん:2006/11/07(火) 01:17:44
>>845
たぶん、以前自分がこのスレで教えてもらったことがあって
今度は自分が誰かの力になれたら、と思っていたんだろうけど、
>>816はマルチポストしてる宿題丸投げの教えてチャンだから、
このスレではスルーするか適切なスレに誘導するほうがいいよ。

あと、816のためでなく845のために言うと、
getsはバッファオーバーフローの原因になるからfgetsを使うようにしたほうがいいよ。
849デフォルトの名無しさん:2006/11/07(火) 01:38:20
ボキの童貞が卒業できないという不具合が起きているのですが(´・ω・`)
850デフォルトの名無しさん:2006/11/07(火) 01:47:38
>>849
仕様。
851809:2006/11/07(火) 02:05:10
>>118-119
#include <stdio.h>
int main(void) {
 printf("Content-Type: text/plain\n\nhoge");
 return 0;
}
これだけ。DOS窓では全く正常。
WinXP Pro + Apache2.0

VC++使いだし、別にLSICのせいにするつもりはないね。LSICのバグの話がでたから昔気になったネタを投下しただけ。
852デフォルトの名無しさん:2006/11/07(火) 02:27:35
853デフォルトの名無しさん:2006/11/07(火) 02:36:37
何でSFUじゃなくてcygwinなんか使うの?
854デフォルトの名無しさん:2006/11/07(火) 02:37:51
>852の最初のは、FreeBSD上のDOSエミュの問題かな。
3番目のは既知のバグだし。
>851と>852の2番目はXPで不安定と言うことなのかな。
まぁ、16ビット時代の遺物だからねぇ。
855デフォルトの名無しさん:2006/11/07(火) 02:41:54
>>802
Turbo C 2.01
Turbo C++ 1.01
好きな方を選べ。
前者は高速、後者はIDE完備。

ttp://bdn.borland.com/museum/
856デフォルトの名無しさん:2006/11/07(火) 02:43:26
FFT_0「128」「128」という配列に数字が入っていて32*32ずつ別の関数で変換してもとのところに戻そうと思ったんですが、
下のプログラムで動かしたら、なぜか左上の32*32にだけ値が入っていません。
どこが違っているのか教えてください。

for(i=0;i<128;i+=32){for(j=0;j<128;j+=32){
for(x=0;x<32;x++){for(y=0;y<32;y++){
 FFT_y[x][y]=FFT_0[x+i][y+j];
}}
FFT(FFT_y,FFT_1);
for(x=0;x<32;x++){for(y=0;y<32;y++){
 FFT_y[x+i][y+j]=FFT_1[x][y];
 }}
}}
857デフォルトの名無しさん:2006/11/07(火) 03:14:55
>>856
> FFT_y[x][y]=FFT_0[x+i][y+j];
> FFT_y[x+i][y+j]=FFT_1[x][y];
これ見て疑問に感じないか?
858デフォルトの名無しさん:2006/11/07(火) 03:21:28
>>857
すみません。どうしてもわかりません。
859デフォルトの名無しさん:2006/11/07(火) 03:22:47
あんた馬鹿?
860デフォルトの名無しさん:2006/11/07(火) 03:26:12
折角見落としていそうなところを並べ直して一目瞭然の状態にしているのに……
どうやら>856の目は節穴のようだ。
861デフォルトの名無しさん:2006/11/07(火) 03:47:07
>>856
おまいさんは結果をどこに入れたいんだ?
862デフォルトの名無しさん:2006/11/07(火) 03:51:19
最初のループで折角FFT_0からFFT_yにコピーしているのに、
次のループで再びFFT_1からFFT_yにコピーしようとしている。
しかも、FFT_yが32*32しかないからバッファオーバフローしてしまう。
恐らく、二番目の代入先はFFT_0のtypoじゃないのか?
863デフォルトの名無しさん:2006/11/07(火) 03:55:23
ビジュアルベーシックとC言語は、どちらが難しいでしょうか?
初心者がやるなら、先ず初めにどちらが良いですかね?
864デフォルトの名無しさん:2006/11/07(火) 04:38:14
言語としての敷居は明らかにVBのが低い。
つぶしの利きは明らかにCの方が高い。

VB持ってるならVBやれ。
特に環境の持ち合わせが無いならCやれ。
865デフォルトの名無しさん:2006/11/07(火) 06:43:48
関数の引数が複数個あるときは、評価順は不定って言うのは理解できたんだけど、
評価のタイミングはいつになるんだろう?
今もってる参考書を調べてみたら
「引数への副作用はすべて関数が呼び出される前に効果を生ずると規定されている」(K&R P66)
って書かれているんだけどこれは
例えばprintf("%d %d",a+b,c+d)ってあった場合printf関数が実行されるまえに、
順番は不定だけど引数a+b,c+dが評価されてその値が関数に渡されるって認識でおk?
866デフォルトの名無しさん:2006/11/07(火) 08:09:04
OK
867デフォルトの名無しさん:2006/11/07(火) 11:18:05
C言語で1000行1000列のような、巨大な行列を表現する方法って無いでしょうか?
二次元配列で

bouble matrix[1000][1000];

といった風に表現しようとしても、プログラムの実行ができません。
(配列は連続した領域にメモリを確保する為、大きな行列だと確保できない?)

このような大きい行列を表現したい場合、どのようにすればよろしいでしょうか?
868デフォルトの名無しさん:2006/11/07(火) 11:26:18
>>867
スタックオーバーフローという。あまり巨大な領域はスタックには確保できない。
ヒープで確保せよ。つまり、malloc()を使え。ただし、多次元配列は自分で
シミュレーションすることになる。
869デフォルトの名無しさん:2006/11/07(火) 11:47:14
「行列」と言ってるのに配列の話を始める>868は低能。
870デフォルトの名無しさん:2006/11/07(火) 11:50:05
>>867
static を付けろ。

typedef int bouble;
static bouble a[1000][1000];
871デフォルトの名無しさん:2006/11/07(火) 12:11:57
>>870
適当な事教えてんじゃねーよ猿
872デフォルトの名無しさん:2006/11/07(火) 12:34:19
>>871
適当か? staticな変数もヒープに置かれると
思ってたが
873デフォルトの名無しさん:2006/11/07(火) 12:37:46
>>872
コンパイラ & 環境次第。
ヒープ使うとは限らないよ。
未初期化か初期化されているか?でも微妙に領域違うし。 (@VC++)
874デフォルトの名無しさん:2006/11/07(火) 12:47:32
staticをつけるとDATA領域に取られんじゃないか
staticで解決することもあると思うが
875874:2006/11/07(火) 12:54:43
>>873さんの指摘のとおり、コンパイラ & 環境次第
スタックサイズがでかい環境ならば実行できるだろう
サイズが1Mを超える配列はmallocでヒープを使ったほうが安全
876デフォルトの名無しさん:2006/11/07(火) 12:58:53
入力した英文から単語を抜き出して表示するプログラムのソースはどのようになるでしょうか?
877デフォルトの名無しさん:2006/11/07(火) 13:19:08
文字列確保してスペースで分けてったら?
878デフォルトの名無しさん:2006/11/07(火) 14:01:52
印字するだけならスペースの代わりに改行打つだけでも
いいかもしれないかもしれない
879デフォルトの名無しさん:2006/11/07(火) 14:19:40
>>876
「抜き出す」ってどういうことだよ?
単語の集合である文をそのまま表示するのと
どういった違いがあれば良いんだ?
880デフォルトの名無しさん:2006/11/07(火) 14:34:30
どのようになるかと聞かれてるだけなんだから、
これだけの設問でも答えることは可能だろ。
881デフォルトの名無しさん:2006/11/07(火) 15:12:04
>>880
あなたがドゾー
882デフォルトの名無しさん:2006/11/07(火) 19:24:35
その後、二度と>>880がこのスレに現れることはなかった
883デフォルトの名無しさん:2006/11/07(火) 20:28:47
と見せかけて実は882=880
884デフォルトの名無しさん:2006/11/07(火) 21:59:40
885デフォルトの名無しさん:2006/11/07(火) 22:10:04
その5「闘えないプログラマ」
「このプログラム、どうしてもうまく動いてくれないんですよ」
「それで?」
「自分としては、絶対に間違っているところは無いんですけど」
「だったら、動くはずだねぇ」
「でしょ? だから、これってコンパイラにバグがあるんじゃないか、と」
「(そんなこと言うやつに限って、自分のプログラムにバグがあるんだよな) じゃあ、試しにccじゃなくて、gccでコンパイルして見たら?」
「やってみたんですけど、やっぱり駄目なんです」
「じゃあ、やっぱり君のプログラムにバグがあるんだよ」
「そんなはず無いんですけどねぇ・・・動きがおかしいのは、たった数行の関数ですし」
「どれ、見せてみろよ。あー、この『if (s == "hogehoge")』って絶対、真にならんぞ」
「え、何でですか。sが"hogehoge"のときに真になるじゃないですか」
「お前なぁ、何年Cでプログラミングしているんじゃ。もいっかい、勉強し直せ!」

これが分からない。
どうして絶対真にならないの?s の中身がhogehogeの時に真になるんじゃ?
886デフォルトの名無しさん:2006/11/07(火) 22:15:38
その文章だけでは絶対ならないとは言いきれないが、
プログラムによっては絶対にならないこともあるだろな。
887デフォルトの名無しさん:2006/11/07(火) 22:18:49
本気で言ってるなら
if ("hogehoge" == "hogehoge")
これを「最適化無し」で試してみろ。
888デフォルトの名無しさん:2006/11/07(火) 22:22:09
strcmpとか使わないとむりでない?
889デフォルトの名無しさん:2006/11/07(火) 22:24:46
C++ならいけるだろうけど…
890デフォルトの名無しさん:2006/11/07(火) 22:27:33
これでOK
#define s 1 || ""
891デフォルトの名無しさん:2006/11/07(火) 22:34:23
>>890
よう一休さん
892デフォルトの名無しさん:2006/11/07(火) 22:34:30
文字列プールが使えるコンパイラなら
char* s = "hogehoge";
if(s=="hogehoge")
で真になるかもしれないね。
alias gcc='icc -Gf'
とやっとけば完璧か。
893どんずまり:2006/11/07(火) 22:35:02
昨日は大変ご迷惑をかけました。
どんなエラーが出るかと言うと、1つ目の数字の入力でわざと20以上入力すると
配列の桁数オーバーで、セグメンテーションエラーと出力されます。配列の領域を
変更せずにセグメンテーションエラーが出ない方法は無いでしょうか?
ちなみにintの桁数オーバーは回避できました。
メイン関数は前回と一緒です。
2つの関数だけ変更しました。
894どんずまり:2006/11/07(火) 22:36:34
int keta(){
char str[20+1];
int number;

for(;;){
func(str,&number);

if(number>9){
printf("INPUTERROR\n");
printf("もう一度入力してください\n");
continue;
}else{
break;
}
}
}
895デフォルトの名無しさん:2006/11/07(火) 22:36:43
>>893
fprintfでぐぐれ
896どんずまり:2006/11/07(火) 22:37:54
int keta(){
char str[20+1];
int number;

for(;;){
func(str,&number);

if(number>9){
printf("INPUTERROR\n");
printf("もう一度入力してください\n");
continue;
}else{
break;
}
}
}
897どんずまり:2006/11/07(火) 22:39:18
int keta(){ 
char str[20+1]; 
int number; 

for(;;){ 
func(str,&number); 

if(number>9){ 
printf("INPUTERROR\n"); 
printf("もう一度入力してください\n"); 
continue; 
}else{ 
break; 


898デフォルトの名無しさん:2006/11/07(火) 22:42:23
>>892
いやそれは普通に真だろ。
899デフォルトの名無しさん:2006/11/07(火) 22:43:49
900デフォルトの名無しさん:2006/11/07(火) 22:46:58
「どんずまり」は、もう宿題スレに行ったほうがいいんじゃなかろうか。
あとアップローダを使って欲しい。
901デフォルトの名無しさん:2006/11/07(火) 23:09:51
>>898
......
902デフォルトの名無しさん:2006/11/07(火) 23:39:00
素朴な疑問なんだが、なんで「どんづまり」じゃないんだ?
903デフォルトの名無しさん:2006/11/07(火) 23:40:33
>>902
つまらないからさ
904デフォルトの名無しさん:2006/11/08(水) 00:00:52
>>902
鈍図マリ(ドジっ娘)
905デフォルトの名無しさん:2006/11/08(水) 00:11:05
ドン・ズ・マリ
906デフォルトの名無しさん:2006/11/08(水) 00:13:45
>>904
鈍頭 真理
907デフォルトの名無しさん:2006/11/08(水) 00:43:30
首領's 真理
908デフォルトの名無しさん:2006/11/08(水) 00:54:45
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

//カードの点数
char total[13] = {11,2,3,4,5,6,7,8,9,10,10,10,10};

//カードのマーク
char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K",};

//カードの数値
char *mark[4] = {"ハート"
"ダイヤ"
"スペード"
"クローバー"
};

int drawCard(int h);

main(){
int dealer; //ディーラーの引いたカードの合計
int player; //プレイヤーの引いたカードの合計

char y_n; //カードを引くか引かないかの答え

srand(time(NULL));
printf("【ブラックジャック】\n");


909908:2006/11/08(水) 00:56:30
//ディーラーの一枚目は今回省略

//プレイヤー
printf("プレイヤー一枚目:");
player = drawCard(1);
printf("プレイヤー二枚目:");
player += drawCard(1);

//ディーラーが引く
do{
dealer += drawCard(0);
} while(dealer <= 16);

//プレイヤーが引く
while(player < 21) {
printf("もう1枚引きますか?(y/n) > ");
scanf("%c" , &y_n);
while (getchar() != '\n') { }
if(y_n == 'y') {
player += drawCard(1);
} else if (y_n == 'n') { break; }
}

printf("\nディーラー:%d点 プレイヤー:%d点\n", dealer, player);

return 0;
}
910908:2006/11/08(水) 00:57:49
int drawCard(int h){
int draw_mark,draw_digit;//引いたカードのマークと数
int r;//引いたカードの点数

draw_mark = rand()%4 + 1;//マークを決定する
draw_digit = rand()%13 + 1; //数字を決定する

if(h){
printf("%sの%s\n",mark[draw_mark-1],digit[draw_digit-1]);
}

r = total[draw_digit-1];
return 0;
}

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
8-2.c:
警告 W8004 8-2.c 70: 'r' に代入した値は使われていない(関数 drawCard )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

と出てしまいます、70行目の何処が違うか
わからないので、ご指摘お願いします。
911デフォルトの名無しさん:2006/11/08(水) 01:04:45
>>910
'r' に代入した値は使われていない
912908:2006/11/08(水) 01:09:21
>>911
何処をどうすれば、宜しいでしょうか?
913デフォルトの名無しさん:2006/11/08(水) 01:13:21
変数rにtotal[draw_digit-1]を入れた。で、それっきりだ。
この値を何に使いたいんだい?
自分ではどういうことををしたつもりでこれを書いたの?
914デフォルトの名無しさん:2006/11/08(水) 01:17:42
変数のスコープが理解できていないと思われる
915908:2006/11/08(水) 01:20:40
>>913
ありがとうございます。

最後にrを返すつもりで書きました。
916デフォルトの名無しさん:2006/11/08(水) 05:20:46
いきなり質問です

C言語の演算で、

int a=2000
int b=150000
int c=50
int sum

とあった場合、

sum = a * b * (c * 0.01)

の結果が0になることはあるんでしょうか?
917デフォルトの名無しさん:2006/11/08(水) 05:50:13
いいえ。真っ当なCならdoubleで演算が行なわれ、sumには150000000が代入されます。
918デフォルトの名無しさん:2006/11/08(水) 05:56:11
>>916
この場合だとないよ。
最後の代入以外の演算ではそれぞれintがdoubleに型変換されて計算される。
最後の代入の際は左辺の型にあわせて代入されるため小数の部分の情報は失われることになる。
今回の場合はsumに代入する値が150000000.0になっているから0になることはない。
(ただしprintf("%d",sum);とした場合に、150000000と表示されるかはわからない。環境による。)

また、もし仮に
int a=2;
int b=1;
int c=5;
だとしたらsumに代入する値が0.1になるため0になる。
919デフォルトの名無しさん:2006/11/08(水) 06:17:22
>>917
>>918

ありがとうございました
920デフォルトの名無しさん:2006/11/08(水) 09:05:32
 a * b * (c * 0.01)
└─┘ └──┘
 int       double
 └─────┘
       double

じゃねーの?
環境によってはa*bでオーバーフローするじゃん
921デフォルトの名無しさん:2006/11/08(水) 09:12:08
オーバーフローしても0にはならんね。
922デフォルトの名無しさん:2006/11/08(水) 09:19:02
そんな保証あったっけ?
923デフォルトの名無しさん:2006/11/08(水) 10:10:58
一晩考えたんですけど、まだできないので質問します。
配列で初期化した配列要素の合計値を出したいのですが、
例 int a[5] = {1,2,3,4,5} ←この合計値を出したい!
僕だとa[1]+a[2]+a[3]... という式しか浮かばないのです。
もっとシンプルにできないものでしょうか?

924デフォルトの名無しさん:2006/11/08(水) 10:17:32
int a[5] = {1,2,3,4,5};
int ic, sum = 0;
for (ic = 0; ic < sizeof(a) / sizeof(int); ic++)
   sum += a[ic];
925デフォルトの名無しさん:2006/11/08(水) 10:21:31
>>924
それのどこが『もっとシンプルに』なんだよ?
926デフォルトの名無しさん:2006/11/08(水) 10:24:10
>>923
>例 int a[5] = {1,2,3,4,5} ←この合計値を出したい

int a[5] = {1,2,3,4,5};
int goukei = 15;
927デフォルトの名無しさん:2006/11/08(水) 10:26:22
>僕だとa[1]+a[2]+a[3]... という式

これ見ると判るけど多分釣りだろうな。
928デフォルトの名無しさん:2006/11/08(水) 10:33:50
>>924
ループカウンタごときに2文字も使うな。
ディスクの無駄。
929デフォルトの名無しさん:2006/11/08(水) 10:38:24
いえ、釣りではなく本気で考えこんでます。
確かにそこは間違いで、a[0]+a[1]+a[2]+a[3]+a[4]+a[5]
と書くつもりが、a[0]を抜かしてしまいました・・
このようにまだ初心者なのです。
一番知りたいのは{1,2,3,4,5}の中を足すやり方があるん
だろうか?ということです。。
930デフォルトの名無しさん:2006/11/08(水) 10:41:52
>>929
それもまちがっとるぞ a[0]+a[1]+a[2]+a[3]+a[4] な。

(即値だけの要素を持つ)配列の初期化と同時に合計を(できれば即値で)得る か。
マクロでどうこうできるようなもんでもなさそうだな。

>>924 のように、素直にコード書くしかないんじゃね?
931デフォルトの名無しさん:2006/11/08(水) 10:57:57
ごもっとも。a[5]はいりませんね、何してるんだろ 俺、、
for と sizeof か、もう少し考えて見ます。。
932923:2006/11/08(水) 11:45:58
こうしてみました。どうでしょう?
int main(void)
{
int a[5] = {1,2,3,4,5};
int b;
int sum = 0;
for(b=0; b<5; b++){
sum += a[b];
}
printf("%d\n",sum);
return 0;
}
933デフォルトの名無しさん:2006/11/08(水) 11:59:39
それで問題ないよ。
さらに汎用性を持たせたかったら>>924
一番良いのは>>926
934デフォルトの名無しさん:2006/11/08(水) 13:52:34
正直926で噴いた
935デフォルトの名無しさん:2006/11/08(水) 14:08:10
そりゃ定数なら普通は自分で計算するかコンパイラに計算させるよな。
936デフォルトの名無しさん:2006/11/08(水) 14:29:03
Cスレなので範囲外だろうけど C++ のマクロ&テンプレートでもできないのかな?
937デフォルトの名無しさん:2006/11/08(水) 17:17:09
Expression Template 使えばいけんじゃね?
938デフォルトの名無しさん:2006/11/08(水) 17:21:52
現在、卒業研究で時系列分析を行っているのですがどーーーーーしても
ARモデルとARMAモデルの式のプログラムが起動しません。
助けてください。
939デフォルトの名無しさん:2006/11/08(水) 17:37:20
プログラムが起動しません!?
起動の仕方が悪いんじゃないか
940デフォルトの名無しさん:2006/11/08(水) 18:12:24
おまいは制御専門なのか? ARモデルとかARMAモデルとか懐かしい響きだ。
が、起動しないだけじゃ >>939 としか答えようがないな
941923:2006/11/08(水) 20:57:36
int Func(int x, int y)
{
int z;

z = x+y;
printf("%d\n",z);
return z;
}
int main(void)
{
int num1,num2,sum;
sum = Func(num1, num2);

return 0;
}
先程はありがとうございました。一応、1,2,3とかは仮の数ですが・・
上の文はエラーこそでないのですが、まともに出力できません。
続けて申し訳ないのですが、文としてどこかおかしいでしょうか?
942923:2006/11/08(水) 21:01:06
やろうとしていることは2つの引数を持つ関数を使って
関数の中で加算して結果を返し、さらにその関数を
呼び出して結果を表示することです。
943デフォルトの名無しさん:2006/11/08(水) 21:10:40
>>942
まともに出力できないとはどういう意味だ?
それと num1,num2 の初期値入れないのはなぜ?
944デフォルトの名無しさん:2006/11/08(水) 21:11:40
int num1,num2,sum;
変数の中身が初期化されてないので、確保したアドレスに入ってたものが表示されてる。
int num1=0 , num2=0 , sum=0;
とかするか、scanfで入力させる

この程度ならz要らないな。(あくまでこの程度の場合)
戻り値を関数内で表示ってのは個人的には汎用的でなくて嫌
945デフォルトの名無しさん:2006/11/08(水) 21:46:28
system("pause")
system("cls")

みたいな、system("〜")は他に何かありますか?
946デフォルトの名無しさん:2006/11/08(水) 21:48:09
OSによる
947デフォルトの名無しさん:2006/11/08(水) 21:54:48
>>946
windowsでおねがいします
948923:2006/11/08(水) 21:55:48
int Func(int x, int y)
{
int z;

z = x+y;
printf("%d\n",z);
return z;
}
int main(void)
{
int num1,num2,sum;
num1=2;
num2=4;

sum = Func(num1, num2);

return 0;
}
参考にさせてもらいながらこうして見ました。
汎用的ですか、。それを考えられるレベルになれるように
頑張ります。
949デフォルトの名無しさん:2006/11/08(水) 21:59:05
>>948
このほうがいいって事
関数Func を使いまわせる

int Func(int x, int y)
{
return x+y;
}
int main(void)
{
int num1,num2,sum;
num1=2;
num2=4;

sum = Func(num1, num2);
printf("%d\n",sum);
return 0;
}


950デフォルトの名無しさん:2006/11/08(水) 22:03:17
printf("%d\n",z);をFuncにぶっこむなんてどうかしてる
951デフォルトの名無しさん:2006/11/08(水) 22:11:01
>>947
system("echo ahoka")
952923:2006/11/08(水) 22:31:39
>949 なるほど、このほうがいいですね・・
ありがとうございました。
953デフォルトの名無しさん:2006/11/08(水) 22:38:00
>>950
printfとscanf合わせて入力用関数とか作ったりしない?
954デフォルトの名無しさん:2006/11/08(水) 22:38:09
system("format c:");
955デフォルトの名無しさん:2006/11/08(水) 22:40:02
int及び2次元配列a[0][0]みたいなものは
それぞれいくらのメモリ領域を確保するのでしょうか?
sizeof関数で見れたような気がするのですが
現在C言語が動く環境にないのでお願いしたいと思いますorz
956デフォルトの名無しさん:2006/11/08(水) 22:41:13
>>952
このfuncって足すだけなら演算子でよいと思うけど
関数にしろっていうお題なの?
957デフォルトの名無しさん:2006/11/08(水) 22:41:44
>>955
環境による!
958デフォルトの名無しさん:2006/11/08(水) 22:49:20
>>956
だと思われ

>>955
俺の環境ではintが4バイト
配列のアドレスは
a[0][0] a[0][1] a[0][2] … a[0][n] a[1][0] a[1][1] … a[1][n] a[2][0] …
という感じで、型の大きさ分ずつ番地が増えていく
959955:2006/11/08(水) 22:49:39
>>957
ご回答ありがとうございます。
ちなみに問題は配列データの計算時のキャッシュ-メモリ間の
ページフォルト回数を求めるようなもので、ハードウェアに関するものです。
「ブロックサイズは4語。intの大きさを1語とする」という一文だけあったのですが、
それではつまり具体的なサイズはともかくintの何倍かということは言えるのでしょうか?
960デフォルトの名無しさん:2006/11/08(水) 22:58:54
>>959
問題文に明記がないならそうとらえていいと思うぞ
961960:2006/11/08(水) 23:05:03
>>959
>ブロックサイズは4語。intの大きさを1語とする
というか1ブロック4語
int 4つ分と明記されてるではないか
(intの4倍のサイズで1ブロック)
962955:2006/11/08(水) 23:14:02
>>958
番地が増えていくというのは連続的な位置に確保されるという意味ではなく
a[0][0]のサイズよりa[n][m]のサイズの方が大きくなるということでしょうか。
ほんとに環境によりますねorz

>>960
そういう意味だったのでしょうかorz
ブロックは1度に扱う量であり配列のサイズはまた別かと思ってました。

ちなみに全文です。
http://purelove.chu.jp/imgboard/img-box/img20061108231246.jpg
963960:2006/11/08(水) 23:25:11
>>962
>ブロックは1度に扱う量であり
そういう意味だよ
つまり一度に扱う量が1ブロック(int 4つ分)ってこと
でメモリ領域は int a[n][n] なら n×n ×sizeof(int) の連続領域が割り当てられる
964デフォルトの名無しさん:2006/11/08(水) 23:26:39
>>962
たぶん連続(4バイトならデータは連続だがアドレスは4刻み)
a[0][0]もa[n][m]も型が同じならサイズも同じ

つか、問題文イミフwwwwこんなんわかんねwwwww
965960:2006/11/08(水) 23:32:24
>>962
たぶん>>958が言いたいのは

a[0][0] a[0][1] a[0][2] … a[0][n] a[1][0] a[1][1] … a[1][n] a[2][0] …

連続した領域がこの順で割り当てられてるということ

先頭番地が a[0][0] (アドレス a + 4(intサイズ分)×0 ) ここで 次が a[0][1](アドレス a + 4×1 )、 a[0][2](アドレス a + 4×2 )、・・・・・ と続く
966デフォルトの名無しさん:2006/11/08(水) 23:35:46
すいません。わからないので教えてください。
文字列に "(” と ")" は\のエスケープ文字は必要ないですよね。
以下の例は、正しいでしょうか。
例:
char strings[] ="123(456)789";
967デフォルトの名無しさん:2006/11/08(水) 23:37:10
さすがに試せってw
968960:2006/11/08(水) 23:41:20
>>966
正しいが試そうぜ
万が一って事もあるじゃんか
969955:2006/11/08(水) 23:42:12
>>963-965
なんかよく分かりました。そういやa[][]も今回はintですよねorz
というか適当に、intと同じサイズにしたれやと思って既に進めていたのでこれで安心しました。
ありがとうございました。
970デフォルトの名無しさん:2006/11/08(水) 23:54:20
>>967
>>968
試したら、問題なく動作しています。どこかに書き物があれば教えていただきたかったです。
971デフォルトの名無しさん:2006/11/08(水) 23:55:26
質問させていただきます。
今番号と名前を作成して、3件分データを入力したあとにデータ表示をするプログラムを作成しています。
その際、すでに入力された番号が入力された場合エラーとして再入力をさせたいのですが上手くいきません。
どなたか教えてくださいm(_ _)m
972923:2006/11/08(水) 23:56:33
>956
はい、funcという関数を作るという指定です。
973デフォルトの名無しさん:2006/11/08(水) 23:56:53
聞く前に試せ。これ常識
オナる前に女児ぱんつ履く。これ異常
974960:2006/11/08(水) 23:57:11
>>970
書き物って何のこと?

>>971
>作成しています
で、自分の作ったヤツは?
なぜアップしない?
975デフォルトの名無しさん:2006/11/09(木) 00:00:00
>>971
ソース晒せ
とりあえず、番号が特殊な書式ではない、ただの整数なら配列(-1とかで初期化)にでもいれて全部比較でもしろ
976デフォルトの名無しさん:2006/11/09(木) 00:05:21
>>974
ドキュメントのことです。
977デフォルトの名無しさん:2006/11/09(木) 00:06:31
>>971
具体的に分からないのはどこ?アルゴリズムから?
どれぐらい形になってるの?
978デフォルトの名無しさん:2006/11/09(木) 00:08:14
>>974
ソースを晒したいのですがPCが壊れてしまって携帯からの書き込みなんですm(_ _)m

明日学校で作成するので、番号の重複エラーの処理のヒントを教えていただけないでしょうか。
979960:2006/11/09(木) 00:10:12
>>976
申し訳ないがそんな初歩のところから説明してるサイトは知らない
本屋さんへゴー!
980デフォルトの名無しさん:2006/11/09(木) 00:12:22
こんばんは 

char *str;
int i=100;

sprintf(str,"%d",i);

で実行したところstrには100という文字列が格納されました。
しかし、上記のstrはstr[100]などと
明示的に領域を確保したほうがよいのでしょうか?



981デフォルトの名無しさん:2006/11/09(木) 00:12:58
>>78
入力する番号の書式による
982デフォルトの名無しさん:2006/11/09(木) 00:16:40
>>980
確保するべき
983デフォルトの名無しさん:2006/11/09(木) 00:17:02
>>977
一応番号が重複するエラー以外は完成しています。
同じ番号を入力した場合エラーを出す処理のイメージがなかなかわかなくて…
984デフォルトの名無しさん:2006/11/09(木) 00:17:45
>>980
確保しないとメモリのどっかに上書きされると思うけど・・・
それが大事なデータだったり実行中のプログラムだったりしないことを祈る。
985980:2006/11/09(木) 00:17:59
>>982
ありがとうございます。
できれば理由も教えていただけませんでしょうか?
986デフォルトの名無しさん:2006/11/09(木) 00:27:58
>>981
返答ありがとうございます。
PCを直してから出直してきますm(_ _)m
987デフォルトの名無しさん:2006/11/09(木) 00:30:19
>>985
char *str;
int i=100;
sprintf(str,"%d",i);
printf("%d",i);

をやって味噌。
988987:2006/11/09(木) 00:31:21
違うわ。間違えた。
989デフォルトの名無しさん:2006/11/09(木) 00:31:59
次スレ立てた

C言語なら俺に聞け(入門篇) Part 4
http://pc8.2ch.net/test/read.cgi/tech/1162999861/
990デフォルトの名無しさん:2006/11/09(木) 00:34:05
>>985
>>984の言う通り
あと、ちょうどこんなレスも見つけた
http://pc8.2ch.net/test/read.cgi/tech/1162771475/213
上では単に他のバッファが上書きされているだけだけど、
もし、その場所に重要なデータがあったり、関数の戻り先とか実行するコードがあると、
それはもう大変な事に
いわゆる鼻から悪魔

>>983
番号と名前をペアにした構造体に入れて、
0で初期化した配列に先頭から順に格納
番号が入力されたら配列を先頭から順にチェック
ぬるぽを見つけたらそこに構造体を格納
991980:2006/11/09(木) 00:42:39
>>984
>>990
なるほど〜
うまくいったのはたまたまだったんですね。あぶないあぶない

聞いてよかったです。ありがとうございました〜
992デフォルトの名無しさん:2006/11/09(木) 00:44:59
よく構造体とか文字配列を宣言したときに
memsetとかでヌル初期化してるけどあれってやったほうがいいんですか?
993955:2006/11/09(木) 00:51:13
>>983
こんなんでどうだろ?
超ド素人が15分かけて作ったので動作の安全は保証しないw

int i = 0;
int j = 1;

do{scanf("%d",x);               //番号を入力
  for(;i <10;i++){              //とりあえず10件の適合まで対応
    if(nyuuryoku[i].number == x){      //番号は構造体に入ってると勝手に決めたw
      printf("既に番号がある\n");
      break;}               //合致してしまったらやり直し
    else if(i == 9)
         j = 0;             //最後まで合致しなかったらwhile文からの脱出キーj=0をプレゼント
  }
}while(j);
994デフォルトの名無しさん:2006/11/09(木) 00:55:30
memsetは使ってないけどオレはやるようにしてる
特に意味不明なほどメンバが多い構造体とかバッファとか
それでも人によると思う

ところで、
HOGE hoge = {0};
みたいな初期化ってCでも使えたっけ?
使えるならこっちの方がいいと思うが
995960:2006/11/09(木) 00:55:49
>>992
好き好きで
「予期しない値」が困る場合に使えばいい
たとえばWinAPIのリターン用に構造体を渡すときなどは 0 で初期化する必要があったりする
996デフォルトの名無しさん:2006/11/09(木) 00:56:33
>>992
用途による

初期化されてないのがポインタだと
別のところで使うときに
NULLとの比較ではじけないので
不正なデータにアクセスしそう
997デフォルトの名無しさん:2006/11/09(木) 00:57:27
>>992
気持ちの問題。憂鬱なときは避ける。
デバッガで変数見るときに見栄えがいい。

冗談はさておいても、
メモリコピーでヌル文字を最後に付け加えておく記述をし忘れたときなんかのバグ抑止になる。
998960:2006/11/09(木) 00:58:37
>>993
>scanf("%d",x);
&x
999デフォルトの名無しさん:2006/11/09(木) 00:59:13
最後の最後まで&抜けとは
1000デフォルトの名無しさん:2006/11/09(木) 00:59:42
1000なら再びC言語ブーム
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。