ずるしてらくしてかれいに2げっとかしらかしら〜
鮮やかに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 といった具合です。
宿題は、
宿題は?
英語で書け
#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; }
>>8 ありがとうございます!
一つのループで何とかしようと思ってました・・・
10 :
デフォルトの名無しさん :2006/10/14(土) 03:05:19
これをファイルの中の一行として abc........hogehoge........kirakira........parapara\n(改行) +-------------++--・・・-++-------------++------- この図で最初+-------------++までがlength値; 225 で次の+-------------++までがlength値; 225 最後の-------が7 この数値を足していけばトータルの文字数が取得できる。 全て読み終わった後にトータル文字数が幾つだったか出力します。 と入門書には書いてあります。 この図解をどう解釈すればいいのでしょうか? 図を見てもわかりませんので、アドバイス御願いします。
よくわからんのだが、そのまんまの意味でいいのと違うのか?
12 :
デフォルトの名無しさん :2006/10/14(土) 03:27:57
>>11 えええ??
この図解では納得ができません
13 :
デフォルトの名無しさん :2006/10/14(土) 03:37:02
=! この意味がわかりません 偽りでしょうか?
いいえ、誤りです。
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 ***
17 :
15 :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
>括弧の数は足りているはずです。 足りている、じゃなくて帳尻を合わせるために無理矢理足したんとちゃうんか。 なんかそんな臭いがプンプンする。 2chには行数制限があるし半角スペースもしくはTabのインデントは表示されないのは わかるけど、もうちょっと丁寧に書くように心がけてくれ。これじゃ読みにくくてカナワン。 見通しの悪いソースはバグの温床にもなりやすいから、まずはコードを綺麗に書き直すという 基本的なところからやり直し。 一つだけヒント。main関数はどこだ?見当たらないぞ。
20 :
デフォルトの名無しさん :2006/10/14(土) 04:35:17
21 :
18 :2006/10/14(土) 04:43:19
>>20 むしゃくしゃしてやった
今は反省している
22 :
15 :2006/10/14(土) 04:43:48
>>18 できました!!!感謝感激です!
よくきづきますね。すごい。
>>19 はい、すみません・・・。
もっと綺麗に見やすくしたいと思います。
しかし、実行結果が
C:\source>5-4
ファイル名を入力して下さい > 5-4.c
検索文字列 > include
出現回数 0
三回にならない・・・・
23 :
デフォルトの名無しさん :2006/10/14(土) 08:28:38
もうなんだか、C言語入門なんて以前に、幼稚園辺りから人の言うことをきちんと聞く勉強をしなおすべきだな。
そうか?
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
>>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 が参照) というエラーです☆
一瞬荒らしかとオモタ
もしかして、そのサンプルソースを単独でコンパイルしてる?
31 :
デフォルトの名無しさん :2006/10/14(土) 19:38:33
はい。。 何か技があるんですか??
32 :
デフォルトの名無しさん :2006/10/14(土) 23:52:47
>>18 すげぇ!
オラもいつか
>>18 みたいになるどー!
(昨日入門書買ってきただ)
C++に慣れるとCはきついものがあるな
34 :
デフォルトの名無しさん :2006/10/15(日) 01:33:08
C言語を勉強してるのですが、 『宣言が正しく終了していない』 と言ったエラーが出て困りました。 ググッて調べてみましたが、いまいち解決策が みつかりません。 宜しくお願いします。
セミコロンが欠けているなどといった単純な誤りだと思う。
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;
>36 最後の行return 0;の次にブロックの終わり } はないのか?
39 :
デフォルトの名無しさん :2006/10/15(日) 01:56:33
>>37 }は、あります。カキコする時には、コピーし損なったようですorz。
コンパイルが通りませ(T_T)。
何箇所マルチしてんだこのバカは
41 :
デフォルトの名無しさん :2006/10/15(日) 02:00:51
43 :
デフォルトの名無しさん :2006/10/15(日) 02:13:58
44 :
デフォルトの名無しさん :2006/10/15(日) 16:34:00
26の藻のですが、回答はありませんか?w
45 :
デフォルトの名無しさん :2006/10/15(日) 16:37:40
ちなみに、コンパイルコマンドはbcc32 sample.c でやっていまーす。
GLPKはよく知らんけど、それ関係のライブラリをインストールして、リンクしないと実行ファイルはできないよ。
bcc32 -o sample.o sample.c
gcc -O2 -s -osample.a sample.c だったか?
49 :
デフォルトの名無しさん :2006/10/15(日) 16:48:00
>>46 ライブラリはインストール済みで、リンクをしていないのかもしれません。。
>>47 やってみたんですが、sample.o が見つかりませんでした。
>>48 gccをbcc32に置き換えてやってみたんですが、やはり、外部シンボルが未解決がでてしまいます。。
bcc32 sample.c でいいはず、
51 :
デフォルトの名無しさん :2006/10/15(日) 16:52:07
>>50 それでやると、上の荒しみたいなエラーがでますw
>ライブラリはインストール済みで、リンクをしていないのかもしれません。。 いいから自分でこの方法を調べなされ。
53 :
デフォルトの名無しさん :2006/10/15(日) 16:55:54
リンクをするというのはヘッダファイルをinclude"glpk.h "みたいなことでいいんでしょうか??
秋田
56 :
デフォルトの名無しさん :2006/10/15(日) 17:09:32
家庭教師?? 雇っているんですか?自分は雇ってませんが。
思考停止。。。
誰が回答しているのかわからんな
だれかC FAQに案内してやれよ
60 :
デフォルトの名無しさん :2006/10/15(日) 18:58:43
質問なんですが scanfで秒数を入力して、それを「○時○分○秒」と出力するプログラムを 作ります。このとき、四則演算の%(余をだす)をつかわずに作るにはどうしたら いいでしょうか。 自分でも書いてみましたが、シンプルなプログラムにならないのです。
62 :
60 :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; }
ldiv()を使ってみるとか。
64 :
デフォルトの名無しさん :2006/10/15(日) 20:04:45
eが定義されてないところがネタくさくていい
宿題は自分でやれよ
シンプルだね。 エラーは出るけど。
動的に配列を確保した際のメモリ量が知りたいんですが どうやって調べたらいいんでしょうか? 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; }
73 :
72 :2006/10/16(月) 02:00:49
上のプログラムで myalloc関数内の *p1=malloc(20); の部分で p1=malloc(20); でダメなのはなんででしょうか?? p1に*p1の値(アドレス)が入ってるのでアスタリスクをつける意味を 考えて混乱してきました。 よろしくお願いします。
------------------------- 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*を間接参照している)
>>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);
78 :
77 :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 ; }
79 :
77 :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 *** とエラーが出てしまいます。 長文なので、誤りがなかなか発見できませんので ご指摘、お願い致します。
80 :
77 :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 *** ここまでが、限界です・・・
82 :
77 :2006/10/16(月) 04:04:30
>>81 何かおかしいのでしょうか?
参考書の通りにやると、自分が見難いので
自分が見易いように書いています。
何卒、ご指摘を
だいたいはその参考書の通りに読み書きしている俺らから見れば、お前のコードはとてつもなく見難い。 中括弧の対応関係とか→('A`)
85 :
77 :2006/10/16(月) 04:41:22
>>84 ありがとうございます。
どうしても、
>>50 行目のifに対応する}else{が58行目と60行目の2つあるな。
最後の}が2つばかし足りないな
これがわかりません、何とか
>>77-78 のソースで
ご指摘願えないでしょうか?
今回限りで、こういう書き方は止めます。
>>77 >79を読んでも理解できないなら、人間止めちまえ。
>警告 W8065 5-5.c 29: プロトタイプ宣言のない関数 'sacnf' の呼び出し(関数 mai
これ見てなんにも疑問に感じないのか?
>scanf("%s",filename);
>sacnf("%s",key);
こうやって並べたらどうだ?
87 :
77 :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
>>84 のソースでもう一度コンパイルすればいいだけじゃん。
そんな事に気付かないなんて本物の馬鹿なんだなぁ。
参考書と見比べるんじゃなくて、 自分で { } の対を順に確認していきなよ
{ } は目立つ一に書いてくれないと ウォーリーを探せじゃないんだから。 今回みたいにエラーが出た時わかりにくいだろ?
91 :
77 :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の位置が違うとは、どうなればいいのでしょうか?
お前は{}の位置を縦に揃えろ。 struct hoge { /* ... */ }; void hoge() { const char *arr[] = { "foo", "bar", }; /* ... */ while () { for () { if () { /* ... */ } else { /* ... */ } } } }
93 :
77 :2006/10/16(月) 17:13:36
>>92 ご返答、ありがとうございます。
その、何故縦に揃えなければいけにかと言う理由が
わからないんです。
それは決まりなのでしょうか?それとも単に見易いか否かと言う
だけなのでしょうか?
95 :
77 :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の位置だと誤りが出るのか等
法則的なものや理由が知りたいです。
でなければ納得ができません。
色々調べていますが、その理由が載っていません。
こら等の問題さえ解決できれば、先に進めます。
とても疑問です。
96 :
77 :2006/10/16(月) 17:25:33
>>94 すみません・・・・
やはり気にせず、先に進む様にします
ご迷惑かけて、すみませんでした。
ではノシ
97 :
デフォルトの名無しさん :2006/10/16(月) 17:32:04
>>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);
}
}
--
どうみてもおかしいのだが、前者ではそれが判別しにくかろ。
99 :
95 :2006/10/16(月) 17:41:50
>>97 わかりました・・・
>>98 たしかに、こうやって見ると見難いです。
以後、参考書に沿ってやってみたいと思います。
>>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);
}
}
>>95 >たしかに、こうやって見ると見難いです。
で、どこが間違っているのかわかったのか?そのレスだとわかってないっぽいが。
つーか同じ内容が
>>84 にあるわけだが。見てないんだな。
102 :
デフォルトの名無しさん :2006/10/16(月) 17:53:28
俺としてはそんなインデントをきっちりつけたソースよりも、ある程度フレキシブル
なソースの方が温かみを感じる。
>>95 には是非とも、スペース、タブ、改行を禁止する方向で成長していって欲しい。
今日は5千行もプログラム書いたよ。とかより今日は5万桁プログラムを書いたよ。
とかそういう話を是非
>>95 にはして欲しい。
しかし温かみよりも、事務的にきっちりとしてあるソースのほうが無難ではある。
>>102 想像してちょっと和んじゃったじゃないか
106 :
デフォルトの名無しさん :2006/10/16(月) 19:13:50
ここの
>>95 を見てたら疑問に思えない事を疑問に思えるようになった。
のは俺だけか?そーいう書き方もあったのかと感じた。
参考書とかだと、そんな書き方載せてねーなw
人間がやってるかぎり、きっちりだろうがぐちゃぐちゃだろうがクソ 機械(プリティプリンタ)で整えられる形が最良
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) 以上のお答えお願いします
宿題丸投げは別にスレなかったっけ。
110 :
友達の友達の名無しさん :2006 :2006/10/16(月) 22:12:04
予習ですけど
112 :
デフォルトの名無しさん :2006/10/16(月) 22:27:11
ネットワーク構築や自宅鯖をやりたいんですが、先ずCからやった方が 良いと言われたのですが如何なんでしょうか? 応用が効くし覚えて損はないという事らしいです、基礎やイメージを つかんでおく程度で良いから、まずはCとの事です
>>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;
}
116 :
112 :2006/10/17(火) 00:13:40
サンクス
Cの勉強を始めて半年、毎日少しずつ勉強しているけど いまだなんのプログラムを組めばいいか分からない でも、毎日どこかのプログラムを見ないと頭が気持ち悪い(´・ω・`)
#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; } このコードコンパイルして実行するとエラーが出ます。 なぜなんでしょうか?
>>118 そのfileopen()で得られたfpはmain()のfpとは異なる。
従って、main()のfpは不定値のままとなる。
他に戻り値もないようだし、FILE * fileopen(char * filename, char * mode);としてはどうか。
120 :
118 :2006/10/17(火) 17:16:57
>>119 レスありがとう。理解できました。
はじめ参照渡ししてるはずなのになんでだろって思ってたんだけど、
fpenによってfpに格納されてるアドレスが変わってるからだめなんだね
納得納得。ありがとうね。
fpen...
122 :
デフォルトの名無しさん :2006/10/18(水) 00:47:00
課題3 入力した文字列の中に数字文字、アルファベット大文字、小文字がそれぞれ何個あるか表示するプログラムを作りなさい。 例) AB123cdを受け取ったら数字3、大文字2、小文字2 ↑の答えお願いしますm(_ _)m
宿題スレ行け。マルチするな。
#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
ありがとうございます!!!!
#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を使うのがむりなのだろうか? 詳しい方教えてください。
それはテキストエディタで表示したときに文字化けするという意味で 「内容がおかしくなる」のか?それはたぶん正常に動作しているのでは。 もともとfwrite()はテキストではなくバイナリとしてファイルに出力するから テキストファイルとして開いてもうまく表示できない。(データの種類にもよるが)
>>126 構造体をバイナリで保存してはいけない理由がよく分かりました。
いや、そういう理由ではないのだが…。 コンパイルオプション一つでメンバーのオフセットが 容易の変ってしまうことがひとつ。 エンディアンの違うプロセッサに持っていったら 正常に読めない(かもしれない)ことがひとつ。 わかってさえいればこの辺は回避ができるんだけど、 初心者には無理だろうね。
この場合、どう見ても ポインタメンバを持っているせいだと思うが
まぁ、初心者は素直にfprintf()で出力しとけってこった。
>>129 エンディアンの違うCPUでうまく読めないのは構造体だろうが単純型だろうが一緒。
そのためにデータ様式の規約があるわけで。
>>130 はずれ。構造体変数の初期化に限って例外的に文字配列のコピーが認められる。
だから構造体は文字列へのポインタではなく文字列そのものを内部に保持する。
>>131 それをやるとファイル入力で苦労しそうな悪寒w
もしfscanfで読み込んでいたら、うまいことファイルを改竄すると
セキュリティホールになりかねん。
>>132 >それをやるとファイル入力で苦労しそうな悪寒w
初心者レベルなら、fgets()+sscanf()で充分だろ。
>セキュリティホールになりかねん。
バイナリにすれば塞がるというなら兎も角、そんなところでコストを掛けるのは無駄。
もし仮に、初心者の教習ではなく実務というならこんなところで聞くわけがないし、
そうであるなら仕様は上流で確定しているはず。
それさえ決まっていないのなら、セキュリティホール云々以前の問題だ。
>fgets()+sscanf() fscanfと変わりないじゃん。 >バイナリにすれば塞がる いや、そういう意味ではなく。scanf系の%sは潜在的にある種の穴を持っているからね。 それを知らないまま危険なコードを量産という状態は避けなければならない。 それにトークン解釈や変換のコストはバイナリ入力に比べて気にならない程度の物でもない。 それ以降の部分については、特に異論はないです。
>>135 なにソレ?と思って調べてみた(と言ってもGoogleではそれをキーワードにできない)。
それ以外にも回避法はいろいろあるみたいね。
でもそういう小技を知っていて何になるの?素直にバイナリ化すればいいだけの話じゃん。
>>136 テキストで出力しておけば、デバッグが楽になるジャマイカ。相手は初心者なんだから。
>>138 まあまあ「素直にバイナリ化」と言ってるんだから、
素朴な人だと察してあげましょうよ。
140 :
126 :2006/10/19(木) 18:58:24
たくさんの方からレスを頂きありがとうございます。
>>127 自分が間違いだと思っていたのは、バイナリファイルをテキストファイルとして開いていたからで、
str1.iとstr1.dbに格納されていた部分が文字化けして表示されていました。
127さんのおっしゃるとおりfwrite()は正常に動作しているみたいです。
(freadで正常に取り込むことが出来ました)
自分が勘違いしていたのは、fwriteを使った場合でもテキストファイルとして開けば文字化けせずに
表示されると思っていたことです。
データの保存/読み込みのみにファイルを使う場合は、fread、fwriteで問題ないが、ファイルをテキストで
閲覧する可能性がある場合はfread、fwriteは使えないことがわかりました。ありがとうございました。
>>129 メンバーのオフセットというのは、メンバーの構造型のポインタからのバイト数っていうことでしょうか?
僕の解釈では、コンパイラごとにオフセットが変わってしまうのを、fwriteの引数の2つ目の部分で
sizeof関数を使用することで吸収していると思っていたのですが違うのでしょうか?
エンディアンという言葉は知らなかったのでググってみたら複数のバイトを処理する際の方法のことみたいですね。
上位バイトから処理するか下位バイトから処理するか。ネットワークでファイル交換する際とかに影響がでるって
書いてあったからこれは今回は関係ないのかな?
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]; }
四でないけどそのコードを見る限りそれしか利点はなさそうだな
143 :
141 :2006/10/19(木) 20:06:17
>>142 よかったですか、他に前後の節と深い関わりがあるようにも見えないので
いまいち理想的と言うほどである理由が分からなかったんですが、
小さなところからコツコツやっていけということなんですかね
>>140 > メンバーのオフセットというのは、メンバーの構造型のポインタからのバイト数っていうことでしょうか?
まあそういうことです。「構造体 パディング アラインメント」
あたりでぐぐってみるとわかると思います。
sizeof (こいつは関数じゃなくて演算子です) で取れるサイズは、
オフセットとはさほど関係はありません。
エンディアンについては、確かにネットワークでは問題になることが多いです。
が、バイナリのファイルをエンディアンの違うマシンに持っていったときにも
同様の問題が発生します。
どなたかが指摘してくださったようにこの問題は別に構造体固有の問題ではなくて、
バイナリをファイルに書いたときには問題になります。
>>141 メリットかどうかではなくて、staticの理想的な使いどころってことだけど?
ところで、書き込むのは全部読み終わってからでも良かっただろうに。
>>142 nameが外から参照できないってのは利点じゃないの?
数値を入力させて、例えば 526を入力したら526th 383を入力したら383rd 811を入力したら811st このように出力させるにはどうすればいいでしょうか?
526 % 10 で余り6
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | ここで笑って !! | |_________| ∧∧ || ( ゚д゚)|| / づΦ
∧..∧ . (´・ω・`) < 383を入力したら383rd 811を入力したら811st cく_>ycく__) (___,,_,,___,,_) ∬ 彡※※※※ミ 旦  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ \ どっ!! / \ ワハハ! / \ / \ ∞ l|||||||||||||| ∩,,∩ ∩,,∩ ∩,,∩ ミ∩ハ∩彡 (, )(,, ) ,,)( )( )
浮動小数点数をまんまファイル出力したい場合って (擬似)バイナリ出力しかないのかな? ※ Base64エンコでテキスト化したものをファイルに書き出すのも、結局バイナリ保存していることになるし…
>>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]);
}
153 :
141 :2006/10/20(金) 09:02:07
>>145 staticはローカル変数の中でも配列の内容を静敵領域に抑えておく使い方が理想的ってことでしょうか?
文字列定数は静敵領域に確保されると他の本で読んだので、そんなに変わらないように思えたんです
一応もうちょっと先まで進んでるんですが、未だに飲み込めない箇所で…
そのstaticの使い方は、静的領域確保とスコープ制限(その関数内のみアクセス)
の2つの意味を兼ねているけど、これを同じに考えてごっちゃにしてないか?
>>153 のそれも理想的な使い方の一つ。
>>141 初期化しなくても済むってのも同じく使い方の一つ(これは
初期値が代入する規約からの副次効果に過ぎないけど、応用例ではある)。
char *ptr="abc"
char arr[]="abc"
記憶領域確保からすればまったく別物だけど、
これも曖昧ならK&R読むのはまだ早いんじゃないか?
構造体のところは辛いぞ。
155 :
141 :2006/10/20(金) 10:15:06
>>154 あ、すみませんnameがポインタの配列だってことを忘れていました…
>>141 だと文字列長がバラバラで配列で定義すると冗長な部分が出来るから
それぞれへのポインタを配列に格納した方がよくて、その領域を留めるためのstatic、ということですか
>>155 文字列長とか配列定義とかは、staticと関係ないな。
K&RはCの理解が曖昧だと難しいから、
それよりも初心者本を読み返すのがいいだろう。
もしくは、C FAQでstatic, array, pointer の違いを理解してみろ。
考えるのは、それからでも遅くはないだろう。
>>152 なら、ポインタの配列にしないで配列の配列にしたほうがメモリ効率はよさそうだが。
#どうせ
む、抜けたか? >157の最後の行をもう一度。 #どうせ、長くなることもないし。
>>157 メモリ効率って何のこと?
知ったかぶりじゃないよね。
160 :
141 :2006/10/20(金) 13:18:05
>>156 理想的という表現が引っ掛かってましたが確かに有効だと思えてきました
もう一度他で復習し直してみます、ありがとうございました
素直でよろしい
>>159 単純にポインタの配列だとポインタの分だけ余計にメモリを食うという話。
どっちみち、文字列分のメモリは消費するのだから。
長さが変わる(この場合より長くなる)場合は、隙間ができるから微妙になるけど。
まぢれすごくろう。
164 :
デフォルトの名無しさん :2006/10/21(土) 20:31:48
質問なのですが、置換されたファイルなどは ようするに書き出しとかでできた、ファイル(aaa.c→aaa.c_) これで "_" と言うのが付いたファイルができました 参考書に依ると開いて確認しましょうとなっているのですが 開けません・・・・
拡張子をtxtなりなんなり適当に直せ
166 :
デフォルトの名無しさん :2006/10/21(土) 21:05:27
>>165 ありがとうございます、
自分で直せばいいのですね!!!
このスレはいつからWindows操作質問スレ(初心者編)になりやがりましたか?
>>167 このスレができる前から、「入門以前」の書き込みは
しばしば見られたからなぁww
「C言語なら俺に聞け(エディタすら使えない人篇)」とか作るか?
もはやC言語でもなんでもないが・・・
169 :
デフォルトの名無しさん :2006/10/22(日) 03:16:36
ぜひお願いします
それやる位なら初心者板にあるみたいな超初心者向けエスパースレの方が隔離スレとしてはいい気がする ム板にどれくらいエスパーがいるのか知らんが
171 :
デフォルトの名無しさん :2006/10/22(日) 10:34:34
プログラム「燃えよドラゴンズ」 最初に打者8人分の名前を入力して置いて、 それから燃えよドラゴンズの歌詞につなげたい。 例: 荒木、井端、立浪・・・・(以下略)と入力すると、 表示される内容: 1番荒木が塁に出て 2番井端がヒットエンドラン 3番立浪タイムリー ・・・・(以下略) このような場合はstrcatを使うべきか・・・・ それとも普通のニ次元配列で・・
>>171 正直、そういうのはスクリプト言語でやるのが手っ取り早い。
つーか、そこでstrcat()云々なんて言い出すようじゃ、到底無理。
>>173 スレタイくらい承知の上で敢えて、「無理」と言っている。
現にあんただって(質問が悪すぎて)まともに回答できないじゃないか。
はて、俺には
>>173 が的確な回答に見えてしょうがないんだが。
二次元配列とstrcat()は排他なのか?
二次元配列で処理するって、どう使うつもりなんだろ?
>>171 printf( "1番%sが塁に出て", name[0] );
これの繰り返しで良いんじゃないか?
printf("%d番%sが塁に出て", i, name[i]); これの繰り返しで良いんじゃないか?
ノリのいいツッコミありがとう
みんな塁に出てなにが悪いというのだ
歌の通りだったらよかったのにねぇ……
>>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] );
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]);
つ改行
name[0]〜name[7]に改行いれときゃいいんじゃね?
#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; }
[8][2][25]
190 :
デフォルトの名無しさん :2006/10/23(月) 20:55:35
出力ファイルとは「._」が付くやつでしょうか? 出力したのに中身は変わっていませんがいいのですかね?
192 :
190 :2006/10/23(月) 22:50:39
出力ファイルの意味がわからないんです、コピーされてできたのが そうなんでしょうか?
>>192 大まかにいうとプログラムから出てきたのが出力ファイル。
.xxx(拡張子)が付いてようがいまいが、ファイルには違いない。
194 :
192 :2006/10/23(月) 23:11:32
ありがとうございます。 入門書を読んでも出力ファイルは何に使うのか?理解しがたいです 単なるコピー?なんですかね。入門書に依れば移動するファイルとの 事です。
Cを覚える為にはアセンブラは必須と言われました。 マジ?
196 :
デフォルトの名無しさん :2006/10/23(月) 23:40:49
必須か?と聞かれれば いいえと答える
197 :
デフォルトの名無しさん :2006/10/23(月) 23:43:07
Cでオブジェクト指向は出来ないの?
>>194 プログラムを FAX に例えよう。
ファイルというのは紙のことだ。
出力ファイルというのは、FAX から送信されて出てきた紙のことだ。
つまり、貴方の質問はこういうことになる。
「家のFAXから紙が出てきました。これは何に使うんですか?」
こちらとしては、どこから届いたのか、紙に何が書かれているか、すらわからないのに答えられるわけが無い。
>>195 必須ではないが知識があればすんなりと理解できるところがある。
知識がないと苦労ことがあるらしい。
>>197 言語仕様がオブジェクト指向プログラミングをするためにできていないというだけで、できないわけではない。
201 :
デフォルトの名無しさん :2006/10/24(火) 01:04:22
質問させてください プログラム内でchar型の変数にint型の変数を代入させるにはどうしたらいいのでしょうか (char)hennsuu1.[data ] = (int)value; strcpyを使ってhennsuu1に値を入れることはできるのですが int型の変数を入れることが何故かできないのです。。。 どなたか教えてください
char a; int b; a=b;
よくわからんが、整数を文字列にしたいのなら itoa
まぁ、sprintf()を使え。
、-.、._ .__ `ヽ、"''ー、._ _,、-‐'" ̄/ \ ~''ー--、__ ,,、-―''"~"~ / ヽ、 , ヾ'ヽ、__ ./'i~ ̄ ./ \ |! 丶、\"ーェ''7 / / _..,,ノ `ヽ|`ー-、___"''ゝー<''~ ,,、-'"~i-ー''"~ ,,.-‐''""""'''ー-.、 ,ィ" \ / `、 ,i ,-っ hennsuu i /⌒ヽ'_ー-/ _).ィ‐‐-,,_ __| | r,i \\//-l;l : : : `l-r'"メ、 ヾ、 \/ `ー‐'": i!_,l_ノ` まだまだだな | ,:(,..、 ;:|/. | ,,,..;:;:;:;,/ \ `::;;. '"`ニ二ソ\_二つ \ ゙゙:`-、;:;:;;;:;:;:;;/ / /~\ \ / / > ) / ノ / / / / . / ./ / ./ ( ヽ、 ( _) \__つ
itoa() は標準じゃないから気をつけろ
それ系の関数の読み方というか関数名の意味がわからず苦労した atoiアトイ?fabsファブス?とかw
スタジオドットエッチ
209 :
デフォルトの名無しさん :2006/10/24(火) 12:34:36
POINT pt[300]; この場合、&pt[n](nは任意の整数0<300な)ってどういう意味だっけ?
pt+n
211 :
デフォルトの名無しさん :2006/10/24(火) 13:56:02
ヘッダファイルでグローバル変数を宣言しようとしてるのですが、うまくいきません。 単純化したものを作ってみたのですが、それでも失敗してしまいました。 何が間違ってるのかご指導をお願いします。 /*********/ /* 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; } 改行が多いと怒られたので次へつづく
213 :
212の続き :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 の両方に定義されている となってしまいます。 よろしくお願いします。
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 /***************/ ・ ・ ・ といったように生成していきたいのですが、 何かよい方法はありますでしょうか?
>>212 >bcc32 main.c func.c
ってやったときにmain.cでMYHEAD_INCLUDEDが#defineされるから、
次のfunc.cでは#elseが有効になると思ってる?
残念ながらならないよ。
プリプロセッサはそれぞれの.cファイルで独立して起動されるから、
どっちもMYHEAD_INCLUDEDが#defineされてない状態で起動される。
216 :
212 :2006/10/24(火) 17:07:05
>>215 レスありがとうございます。
…という事は、私が望む動作は
・ヘッダファイルでは extern int x;
・main.cかfunc.cにグローバル変数として int x;
とするしかない(ほかにあったとしても回りくどい方法だけ)
という認識でOKでしょうか?
>>216 あるいは
/*********/
/* main.c */
/*********/
#define MYHEAD_INCLUDED /* 追加。名前はもっといいの考えて */
#include "myhead.h"
のようにすればよい。名前にINCLUDEDなんてついていたら
わけがわからんので、その辺は適当に。
あ、これじゃあちょっと駄目か。 myhead.hの#ifndefを#ifdefにした方がいいね。 これでmain.cでのみ確実にxが定義されて、 他では宣言になる。
しかしそんな技巧は今時流行らない。
ヘッダは宣言に使うものであって定義に使うものではありません
char s[10]; char* p = s; @ p + 100; A p += 100; B p += 100; *p; どの時点で未定義ですか? それともすべて未定義?
222 :
221 :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 になるのは何がすごいのでしょうか・・・ 何かこれに感激しないといけないらしいのですが^^;
感激したが、すごくはないぞ。
なくなって初めて気付くありがたみってやつですよ
センベイって美味いか?
228 :
デフォルトの名無しさん :2006/10/25(水) 23:16:33
これらの違いがわかりませんので 助言、お願い致します。 char str[] = "Hello!" と char key[128] = "abc" 一見、同じ意味に見えてしまうのですが、何が違うのでしょうか? char keyだと一列が一個だけ、このように"abc" char strだと一列を複数入れられるのでしょうか?char str[] = {"abc","def","ghi"} なのでしょうか?
char str[] = "Hello!" と書くと char str[7] = "Hello!" とコンパイラが判断してくれる それだけ
230 :
デフォルトの名無しさん :2006/10/25(水) 23:27:50
違わないでしょ
232 :
デフォルトの名無しさん :2006/10/25(水) 23:31:46
>>231 とう言うと同じなのでしょうか?
混乱してしまいます。
char keyだと一列が一個だけ、このように"abc"
char strだと一列を複数入れられるのでしょうか?char str[] = {"abc","def","ghi"}
の差ではないのでしょうか?
char str[] = {"abc","def","ghi"} ↑ コンパイル通らんよ char* str[] = {"abc","def","ghi"} と勘違いしてない?
>>228 前者は H e l l o ! ヌル の7文字分確保される。
後者は128文字分確保した上で、先頭から a b c ヌル の4文字が入れられる。
それだけのこと。
>>232 のような差ではない。
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'};
236 :
232 :2006/10/25(水) 23:48:03
ぐは〜考えれば考えるほど混乱します・・・・ 一旦、整理してから出直してきます。 ありがとうございました。
237 :
232 :2006/10/25(水) 23:54:15
>>233 そのようでした、では char str[] = {"abc","def","ghi"} いう形は
存在しないんですね
>>234 そうですか、わかりました。
>>235 となると、
>>234 で書かれた事と同じ、[]内の確保数の
問題で意味は同じと考えて宜しいんですね?
俺10枚も書けるかなあ 関連研究9枚でいいですか?
Windowsプログラムの質問ここでいいですか? BCB5ラーニング使用してるんですが Windows XP標準の圧縮(ZIP)ありますよね プログラム側から制御する方法ってありますか?
>>240 おおおおっ!!
ありがとうございます
がんばってみます
お世話になりました
242 :
デフォルトの名無しさん :2006/10/26(木) 13:22:20
>>242 学校の環境と自宅の環境は一緒なの?
うちはBCC developer じゃないんだけど
ちなみに関数内の関数宣言は通らないので
外に出したらコンパイル通ったよ
244 :
デフォルトの名無しさん :2006/10/26(木) 14:21:22
>>243 学校の環境と自宅の環境は違います。学校のはよくわかりません。
関数を外にだしても動作は変わりませんか?
>>244 関数 bfs が 関数 breadth_first のデータにアクセスしてるから
それを解決すればおk
俺は bfs の引数に
int *parent, int *blabel, int *queue を追加した
あと出来るならテストデータも示してみて欲しい
正常な動作か判断できないので
コンパイラによっては関数内の関数宣言を許してないからそれが原因かもね
(俺の場合むしろ逆で関数内で関数宣言するコンパイラを知らない)
246 :
デフォルトの名無しさん :2006/10/26(木) 14:40:09
248 :
デフォルトの名無しさん :2006/10/26(木) 15:08:08
>>248 ごめん
main(void) の scanf("%d", &directed); は消してね
俺の環境だとウィンドウすぐに閉じちゃうから入れといただけ
意味は無いから
252 :
デフォルトの名無しさん :2006/10/26(木) 15:53:03
>>250 合ってます!まじでありがとうございます。
元のプログラムはプログラムとしてダメだってことですよね?
>>252 プログラムとしてって考えると微妙だな
どちらともいえない
まぁ自分だけの環境ならいいけど
いろいろな環境でコンパイルされるコードを考えるなら
関数内に関数宣言入れたのはどうかと思う
ましてや教授って大学でしょ?ならコンパイラに依存する処理はするべきじゃないと思うよ
とはいえ関数を外に出しただけだからアルゴリズムはあってるって事
254 :
デフォルトの名無しさん :2006/10/26(木) 16:00:21
環境はVC++6です fgetsで文字列を無制限に取る場合はどうしたら良いですか? よろしくお願いします。
255 :
デフォルトの名無しさん :2006/10/26(木) 16:04:10
最低限どういうプログラムなのかくらいコメント入れろよ…
257 :
デフォルトの名無しさん :2006/10/26(木) 16:21:41
先ほどのは入力グラフに対して幅優先探索 今のは深さ優先探索を行うものです! すいません
259 :
デフォルトの名無しさん :2006/10/26(木) 16:30:29
>>258 正しく動作しました。何のプログラムかも述べないのに、対応してくださって、感謝します
void main()とか書くのが教授やっていいのか…
262 :
デフォルトの名無しさん :2006/10/26(木) 16:38:25
>>260 画像まで丁寧にどうも。本当に助かりました
問:既知の要素数の一次元配列を大きい順に並べ替える方法を考えなさい。(ただし、なるべく速く、変数を多く使わないもの) 0からnまでの各項についてその項以降の最大値と交換 みたいな感じであってる?
>>261 俺は勉強中でやっと初心者と呼んでもいいレベルかな?ってくらいの人間なんだけど、
教授クラスだったら「void main()」の部分はどうあるべきなの?
正常か異常かステータスくらいは返すべきって?
引数をとらないんだったらmain(void)って書くべきって?
それとももっと深い?
>>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 にしなくていいんですよね
すまん正確にはvoid main(void)だったな
>>264 ANSI Cでmainはintを返すと規定されてる、ただそれだけ
270 :
263 :2006/10/26(木) 18:15:42
なるほど、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
それはpがどこも指し示していない状態のまま使われているという警告。 ポインタではなく、配列を使え。 ついでに言うとgetsでは無く、fgets使え。
274 :
272 :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()は使えないのでしょうか?
理解できてねえぞカス
それはname,jyusyo,telがどこも指し示していない状態のまま使われているというバグ。 ポインタではなく、配列を使え。 ついでに言うと配列ではなく、malloc使え。
つべこべ言う前に辞書引けよと思うのが俺だけだったら寂しい
>>274 君さ、不動産屋でアパートを下見に行くとき住所も地図も書いてない紙を渡されたとして、
何の疑問も持たずその紙を頼りに下見に行こうとするかね。どこに行けばいいか混乱するか、
不動産屋に文句を言うだろう。
ポインタは住所を書く紙に当たっていて、初期化のしてないポインタは
まだ住所が書かれてない紙切れにすぎない。
ポインタはどっかの場所を指し示すものだ。だが、初期化してないポインタは
どこを指しているかわからない。
どこを指しているかもわからないところを指定して氏名を入力させたら混乱が起きる。
それはたとえば風呂場と書いてあるラベルが道路の真ん中にあって、
そこで服を脱いで湯船に浸かろうとする行為と似ている。
ちゃんと風呂場の場所をおしえてやらないといかんぞ。
ポインタを要求する関数で 本当にポインタを渡すのは file系(FILE* fp の fp) ぐらいで あとは、実体(配列の先頭 or 変数の & 付き) を求めている と考えたほうが始めのうちは楽ちん。
>>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);
てかFILE *系だってfopenで初期化しないと駄目じゃないか。 ポインタを渡す関数で初期化してないポインタなんか渡されても、 何にもしようがないと思うぞ。
282 :
280 :2006/10/26(木) 20:30:52
>>281 まぁね。
FILE* 系をポインタと認識しない考え方でも良いんじゃないか? ってところで…
fp を剥がす(実体参照する)ことはない
オブジェクト指向してる
で、ちょっと特異な部類じゃね?
# FILE f; fopen(&f, <name>, <mode>); ってなってたら、どうだったのだろうか・・・
285 :
272 :2006/10/26(木) 21:26:47
たくさんレスをいただきありがとうございます。 何とか分かりました…どこも指してないポインタをfgets()に 渡したところでどこに文字列を入れていいか分からないってことですね… char ch[5];としたときの ch と char *ch;としたときの ch の違いをよく考えれば 分かることでしたね…お手数をおかけしました。 本当にありがとうございます!
>>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回前後なのに
↑この処理に問題ありそう
もう少し調べてみる
なんとなくだけど NUM が 3 だと怪しくね?
288 :
284 :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
s=0, e=2 等の 3個区画で無比較/無交換のまま抜けるけど… 最終的にsort される?
291 :
284 :2006/10/26(木) 23:14:04
>>290 3個の場合でも基準値nを作った後でs--とe++しているため、
比較・交換はされているようです。
>>291 あ。 ごめん s++ e-- と読み間違えた orz
293 :
284 :2006/10/26(木) 23:24:13
>>292 こちらこそお手数をおかけしてすみませんでした。
色々とご検証いただきありがとうございました。
>>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関数で最終更新日や 曜日などは出来たのですが、もうわかりません。
>>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()は実行されるの?
されない
301 :
どんずまり :2006/10/27(金) 00:12:30
system(ls-l)のリダイレクト? 実行したモジュールがなんやらかんやら・・・ ってわかりますか?
凄い初歩的なことで申し訳ないんですが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がファイル作成者のユーザ名
305 :
どんずまり :2006/10/27(金) 00:31:00
getpwuid()関数で()の中にstat関数で取得したアカウントを入れれば ユーザー名がでませんか?
306 :
303 :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がユーザー名 */
308 :
どんずまり :2006/10/27(金) 01:03:50
>>303 さん
Linuxです、Viエディタを使っています。
私も今さっきまでgoogleで調べていましたが多分303さんのやり方で出来ると思います、
自分の家に環境が整っていませんので明日試してみます。
これで今夜は安心して布団に入れます。
どうもありがとう御座いました。
センベイって美味いか?
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 *** と表示されてしまいます、何処が違うのか、ご指摘お願い致します。
>>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 )
>>313 Cpad for Borlandって処理系はよくしらんのだが、
popenて関数はライブラリにあるのか?
これは規格にある標準関数じゃないぞ。
unix方面でよく使われている関数だ。
315 :
デフォルトの名無しさん :2006/10/27(金) 05:43:07
>>312 ごめんなさい、見てもきづきませんでした(;_;)
ありがとうごさいました、これで先に勧めます
316 :
デフォルトの名無しさん :2006/10/27(金) 05:49:04
>>313 _popen(), _pclose()じゃない?
>>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です。
君じゃ、まだrubyをハッキングするのは早いんじゃないか?
321 :
デフォルトの名無しさん :2006/10/27(金) 23:00:08
現在大学の1年で、後期からC言語の勉強をしているのですが、おすすめの 参考書とかありますか?友達は「やさしいC」というのを買ったらしい のですが、正直迷ってます。
趣味グラマ程度になるレベルでいいのなら林晴比古
323 :
デフォルトの名無しさん :2006/10/27(金) 23:14:33
>>321 言語の勉強も大事だけど・・・
アドレスとか数値や文字の表現方法とかOSとかの
コンピュータの動作原理を勉強するとC言語もよくわかる
>>321 ひとつだけじゃなくていくつか読んだほうがいい
参考書とかって書く人によって考え方や捕らえ方が違うから
325 :
デフォルトの名無しさん :2006/10/27(金) 23:19:16
大学一回生なんだけどC言語の初心者向けのお勧めのサイトってないですか? よく理解してないのに聞きながら課題とか無理矢理終わらせてて そろそろ限界かなと思うので
>>320 すみません言葉足らずで、
キーボードから数値を入力をしないで直接合計を求めたいのです。
327 :
デフォルトの名無しさん :2006/10/27(金) 23:43:39
>>325 勉強するならネットより本を読んだほうがいい
>>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;
}
330 :
328 :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関連の書籍を読むのがよい
>>331 本には期待が強いけど、結局ゴミとなる本が多い・・
ネットはたまに良いのがあるが・・
こと流行りの・流行った言語に関してはクズ本が溢れ返るからねえ…。 Cもそのひとつだし。 最近は教えることもないので入門書の類は立ち読みさえしてないんだけど、 なんかいいのありますかいね。
つLanguageC FAQ いや、マジでオススメっすよ。
やっぱり K&R ?
あれは古文書だからなー。 役に立たんと言うつもりは毛頭ないが、明らかに古いプロトタイプ宣言の作法とか、 正直時代に即してるとは言いがたいかと思われ。 そもそも入門向きでもないしな。
古文書w 確かに入り口にするには敷居が高いか。
>>325 学生なら図書館あさってみたら?
ゴミ本つかむかもしれないけど、それも勉強のうちw
>>330 夜遅くにわざわざありがとうございました。
339 :
デフォルトの名無しさん :2006/10/28(土) 05:52:04
C言語はどうやれば覚えられますかね? 難しいです。
>>334 ありがとう。でもそれ知ってたw
>>335 K&Rはもう要らないんじゃないかと思う。現代版として改訂したらわからないけど。
以前はK&Rくらいしかまともな本がなかったからみんなこれで勉強したけど。
今では比較的まともな本の部類にしかならないんじゃないかと思う。
他にあったのは三田本くらいかw こいつは本当に害毒だったw
>>339 どんな言語(自然言語でもプログラミング言語でも)読み書きするのが基本。
たくさん読んでたくさん書く。
入門書をざっと読んであたりをつけたら、既存のソースを読みまくって、
改造しまくるのが勉強になるんじゃないかな。
ただいい入門書というのがなかなかお目にかかれないんだけれども。
Cで言えることはメモリのイメージを常に頭に置いてプログラムすることかなあ。
多分言語仕様とかその辺はすぐにマスターできると思うんだ。
forとかwhileとか関数とかその辺はあんまり難しくないでしょ?
実際のビットパターンまではイメージしなくてもいいけど、
変数がどこに存在するかとか、ポインタが指している先は何かとか、
その辺具体的なメモリのイメージを常に意識するのが上達のコツみたいな気がする。
あくまで気がする程度w けどCでプログラム組んでいるときに意識するのは常にここだ。
342 :
デフォルトの名無しさん :2006/10/28(土) 07:54:28
>>318 RUBY_DATA_FUNCはvoid*を引数にとり、返り値がvoidの
関数へのポインタ。
>>341 に便乗するかもしれませんが、
サンプルソースがたくさん置いてあって、
見て勉強になるようなサイトは無いでしょうか?
入門書はほぼマスターして、コンソロールゲームくらいは作れますが、
それ以上には、なかなか抜け出せなくて、手詰まり状態です。
>>343 Gnuの適当なツールのソースでも眺めてみたら?
Unix系のフリーのソフトは多くがソースを簡単に入手できるから、その気になれば宝の山だ。
#玉石混交という話もなくはないが。
>>343 リストとかハッシュとかソートとか、アルゴリズムの基本的なところは勉強した?
まだなら、それ方面の本とかサイトとか読んでみたら?
346 :
デフォルトの名無しさん :2006/10/28(土) 09:50:38
C++でコンパイルして実行速度を限界まで上げたいんですが 最適化:-O3(-O4?) -Os -march=i686 以外に何か無いでしょうか
馬鹿?
348 :
デフォルトの名無しさん :2006/10/28(土) 10:11:54
死ぬほどグイングインageたいね!
>>346 まず、どこに時間がかかっているか調べろ。
それが判明したらそこを重点的に高速化する。
アルゴリズムを速いものに変えたり、その処理をなるべく使わないようにしたり、
腕に自信があればアセンブラで書いたりするなど。
Cの入門書は本屋で読んでみて良さそうなのをハズレ覚悟で買え 難しいのは応用であり、ポインタなんかも理論は簡単 主に使うのは参照渡しくらいで、*つければいいんだろ?程度で十分 あとは本で完全理解しようとせず、実際に書きながら覚えるしかない 一通り理解したら、一気にwindowsアプリに走れ。HSPと同じでグラフィカルだと楽しい。オブジェクト指向は書いてれば身につく
一生身につかない奴もいるけどな
>>352 オブジェクト指向とか構造化とか、書いてれば自然に身に付くってもんじゃないよな。
>>353 たしかに構造化は自然には身につかないが、身につかないわけではないな
OOP な他言語を使った経験がある奴は C でも OOP 的なコードを書ける、これは当たり前 しかし、全く OOP を知らない奴が独自に C 上の OOP を再発明できたとしたら そいつはたぶん Stroustrup になれる
OOの言語使っていても、OOPできないやつとかいっぱいいるし、 構造化言語使っていても、構造化プログラミングできてないやついっぱいいる。
>>350 38行目のscanf()のフォーマット指定が間違っているから。
ついでに言えば、文字を扱う場合以外にcharは使わないほうがいい。
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)
>>358 VAR_TO_FPOSマクロじゃなくて、FPOS_TO_VARマクロの定義を張ってみてくれ。
360 :
358 :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でも全く同様のエラーが発生します。
プログラムの中で環境変数(例えばLANG=Cして英語環境にする)を決めうちにしたいのですが どうすればいいのでしょうか?
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);
ではダメ?
質問です。 ネットで拾った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() )
こういったエラーがでてしまうんですが・・。
367 :
365 :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
370 :
364 :2006/10/29(日) 00:01:40
>>366 あっごめん
今アク禁で携帯からで
int a;
a=(int*)malloc(1000);だね
371 :
364 :2006/10/29(日) 00:03:17
>>366 解決しちゃったのか・・
訂正
int *a;
a=(int*)malloc(1000);
>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次元目へのポインタの配列
とする必要がある。
>>365 Windowsはリトルエンディアンだが、Unixがリトルエンディアンでないとは限らない。
CPUがx86/x64だったりすればたとえUnixでもWindowsと同じリトルエンディアン。
エンディアンを決めるのはOSではなく、CPU周りのアーキテクチャ。
375 :
364 :2006/10/29(日) 00:43:55
>>372 そうだったのか
まぁいいや
どうせこのコード失敗作だし
これじゃ多次元配列構成できないじゃん
って気付け俺・・・・
>>367 >>368 で正解だね
携帯めんどくセー
誰だ俺と同じホストで悪さした奴は・・・・
376 :
364 :2006/10/29(日) 00:49:45
>>373 レス見れなかった
書き込んでるうちに新しいレスがついてる
訂正ありがと
あぁほぼ全ホストに規制が・・・・
Cはまだまだこれからな初心者なんですが、勉強するのに何かオススメの本とかはありますか?
>>377 他言語での経験も書いとけよ
書籍スレでは
380 :
350 :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
配列のメリットって何?
添字が繰り返しで使いやすい
384 :
側近中の側近 ◆0351148456 :2006/10/29(日) 10:27:29
>>382 (っ´▽`)っ
配列とリストを比較すると・・・
配列は連続した領域を確保する。
そのため、リストとは違い、アクセスが容易。
アドレスの単純なインクリメントだけで済む。(添字だけで済む。)
リストの場合、メンバを最初から順に追っていかなければならない。
さらに、領域が連続してるから初期化も楽。
memset(a, 0, sizeof(a));で一発。
>>381 >(っ´▽`)っ
>そもそもfreeをかけなければずっと確保し続けるというのが
>C言語の仕様なのではなかろうか?
当然 これが正解
>>381 もういっかいポインタの概念をきちんと学習した方がいいのでは?
なんかあんまりポインタのことがわかってないように聞こえるぜ
387 :
側近中の側近 ◆0351148456 :2006/10/29(日) 10:51:46
388 :
デフォルトの名無しさん :2006/10/29(日) 12:58:26
計算の答えを小数点以下7桁まで表示するにはどうすればいいですか? %fのところを少し変えればいいと思うのですが。
389 :
側近中の側近 ◆0351148456 :2006/10/29(日) 13:29:25
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
>>390 >void giko(void);
getch の呼び出しは getch() ってことが分かってるなら
giko の呼び出しも単純に giko() だとは思わんか?
393 :
デフォルトの名無しさん :2006/10/29(日) 14:05:12
配列とカウントを使った自作関数を作りたいのですが int kansuu (int count, int x[count]) { 処理 } こんな感じでやったのですがcountが未定義になってしまいます。 int* x[count]も試したのですができませんでした。 どうすればよいのでしょうか?
>>394 int kansuu(int count, int x[])
{
}
397 :
デフォルトの名無しさん :2006/10/29(日) 16:22:45
return 0 ってどういう意味ですか?
0を返すって意味
399 :
デフォルトの名無しさん :2006/10/29(日) 16:30:04
>>398 return 0 は、付ける場合と付けない場合でどう違ってくるんですか?
>>399 main関数ならシステムに0を返すってだけ
ぶっちゃけほとんど意味はないらしいけど一応
今256×256(24bit)のビットマップ弄ってて3次元配列に入れてるんですが 上下反転させようとしたとき行の順番以外は変化しないのに 2重ループor3重ループさせるのってなんか馬鹿っぽくないでしょうか? ポインタ弄ればもっと簡単になるような気がするんですが、('A`)むー
402 :
デフォルトの名無しさん :2006/10/29(日) 16:37:20
>>401 馬鹿っぽいんじゃない。本当に馬鹿なんだ。
return 0 はちゃんと命令が終了しましたよ って意味だぞ。
406 :
デフォルトの名無しさん :2006/10/29(日) 17:30:06
戻り値がvoid型の関数で returnを付ける派?付けない派? 私は付ける派。
>>403 ,404
馬鹿認定thx
頭悪いと自覚してなかったら質問なんて出来ませんだぜ(´・ω・`)
出来れば理由とかも教えていただけると参考になります。
408 :
デフォルトの名無しさん :2006/10/29(日) 17:50:01
%o,%pの意味をそれぞれ教えてください
>>408 ぱーせんとおー、ぱーせんとぴーという以上の意味があるようには見えないのだが。
#特定のシチュエーションにおけるそれらrの意味を問いたいのならそのシチュエーションを書きたまえ。
>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を返すようにコード変えてるかもしれないなぁ
413 :
411 :2006/10/29(日) 19:01:29
414 :
デフォルトの名無しさん :2006/10/29(日) 19:18:40
ビットって、どんなときに使用するの?
>412 なぜ逆アセしない?
416 :
411 :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のための値。
418 :
417 :2006/10/29(日) 20:02:14
補足。 ビットでフラグを管理するのは、関数のインタフェースとしてだけではなく、 処理の状態を管理するのにも使える。 ある状態になったらこのビットをONにして、このビットがONのときはあの処理をして…。 複数のフラグをまとめて一つの変数で管理するのは、それらが関連する場合だけにしたほうがいい。 たとえば、先に例にあげたopen()関数でのオープン方法の指定のように。 もともと関連の無い概念なら、別の変数にしてBOOL値として管理したほうがいい。
419 :
411 :2006/10/29(日) 20:17:01
つーか開始終了処理は当然するよな トレースしてみる
>>416 VC 2005で試してみたらvoid main() {}でもint main() {}でも
xor eax, eaxをやっていて、0を返すようになっていた。
C++でもvoid main() {}はおそらく0を返すのだろう。int main() {}は規格に従って0を返すのは確認済み。
421 :
411 :2006/10/29(日) 20:40:35
>>420 >int main(){}は規格に〜
↑ここ詳しく
でもmain復帰後すぐeaxをpushしてるでしょ
最終的にこの値をどうしてるかが問題じゃない?こっちはBCB5でデバッグ中の状態からしかアセンブラコード見れないけどそっちも同じ?
>>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言語というか数学の問題っぽくてすまんとです・・)
>>423 #include <math.h>
sqrt(x)
で、よろしいか?
426 :
デフォルトの名無しさん :2006/10/29(日) 21:01:43
main関数の戻り値はプログラムの終了ステータス shellで実行後にシェル変数$?に格納されるもの 別に0が正常終了というわけではない だから、void main()で何を返そうがそれはどうでもよいことでは? プログラムの終了ステータスとして不定値を返すということで
>>426 mainが終わると、その戻り値を引数にしてexitを呼ぶことになっている。
シェルとかを抜きにして、Cではexitの引数が0またはEXIT_SUCCESSの場合成功終了と定められている。
428 :
デフォルトの名無しさん :2006/10/29(日) 21:07:49
>>424 、425
ありがとうございます!
すんません。基本的な事過ぎました・・
>>378 if文を適当に削ると一応コンパイルできました。
これからテストしてきます…
430 :
411 :2006/10/29(日) 21:53:43
>>422 コマンドコンパイラ初めてだけど頑張ってみる
ぁぁ俺のホストのアク禁いつ解除されるんだろう
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);
とりあえずはint型で受けろ。 EOFでないと判明したらchar型にしてもよい。
434 :
デフォルトの名無しさん :2006/10/30(月) 01:07:28
>>EOFでないと判明したらchar型にしてもよい なるほど!なんとなく定数が絡んでいるのかなーと理解しました。 int型で受けて処理します。 ありがとうございますー
>>422 C++は知ってたが、C99もそうなのか。勉強になりました。
チラシの裏ですまん。
436 :
デフォルトの名無しさん :2006/10/30(月) 04:20:09
関数の中で static POINT pt[][300] こうした場合、ptの要素数ってあとからどうやって指定するんでしたっけ? 忘れでしまってorz mallocで領域確保する必要あり?
>>436 関数の仮引数の事?
それは呼び出した側で渡した配列の大きさによる。
関数内でそれよりも大きな行数を指定した場合の動作は未定義
それとも、本当にそのように自動変数を定義したのなら static POINT (*pt)[300]; と同じだから、malloc()かもしくは同じ列数を持つ配列のアドレスを ptに代入
static は自動変数じゃないだろ
添字がねえぞ馬鹿 というエラーメッセージが出ると予想
もしかして中学英語くらいわからないとC言語勉強するの無理?
中学英語くらいできないと、所謂ホワイトカラー職は無理かと。
中学英語自体は分かってなくても、趣味程度で勉強することはできるだろうが 中学英語すら分からない頭で理解するのは無理だな
444 :
436 :2006/10/30(月) 08:51:21
点をつなげて線を描画するプログラムを作っているんですが、線の本数が分かった時点で 配列を動的に定義できないのかなぁと・・・ たとえばVB(VBA)では Dim iNum[] と宣言しておいて Redim iNum[6] というように あとから配列の要素数を決められたように思うんですが(昔のことなんで記憶が定かではないのですが) こういうことをcでやるにはどうしたらいいのかな、と 最初に十分おおきな配列を準備するという方法でもいいのですが 何分スマートさにかけるような気がして(笑
>>444 このスレ的には邪道だが、C++に移行してstd::vector使え。
>>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はなるべく避けたほうがいいのでしょうか…。よろしくお願いします。
450 :
デフォルトの名無しさん :2006/10/30(月) 11:59:34
>>448 Error : cannot implicitly convert
暗黙の変換ができません
WindowPtr が整数に変換できないんだろ
(long)WindowPtrにでもしてみたら
>>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の嵐だし。
>>453 const を薦める理由も書いてましたよね?
型を指定したいからですね。
昔のCには const は無かったですけど、最近なら
#define ではなく const int などにするのが
安全でしょう。
>>452 enum に型なんて要らないんだから、
#define IN_FRONT -1L
でいいじゃん。
使うときにキャストすれ
456 :
デフォルトの名無しさん :2006/10/30(月) 13:42:34
>>454 そうですよね。
>>455 #define IN_FRONT -1L
では、WindowPtrはどうするんでしょうか?
キャストの方法だけでも教えてください。
整数値(10桁以下)を入力させ、数字の出現回数を表示するプログラム がわかんないんですけど教えてください。
457早く教えてください。 困ってるんです。
あなたが困れば困るほど、見ている方は大喜びです。
>>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 とかのほうが全然いいと思うが。
const での定数定義って厄介だよな。 #define A 1 #define B (A + 1) が表現できないんだもん。 const int A = 1; const int B = A + 1; ←ここでエラー
constで定数を扱いたいお前らは全員C++使え。
特に意味もなくコードの模様替えをしたくなる病気というのは色々あるが define を const に置き換えるのは最悪の部類だろう 定数式が要求されるところ全てでエラーが出るぞ
464 :
デフォルトの名無しさん :2006/10/30(月) 18:08:19
FreeBSDでやってみようかな…
>>457 >整数値(10桁以下)を入力させ、数字の出現回数を表示するプログラム
入力値を文字列に変えて一桁ずつ判定、数字0〜9の配列にでもカウントさせる
で、その配列を表示
%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)してその内容を 出力するプログラムなのですが なぜか出力されるのは指定したファイルの一行目のみっという 結果になってます。全ての行を出力するためには どのように変更すればいいでしょうか?
>>467 fgets(str,256,fp)を1回しかやらないからそうなる。ファイルが終わるまで繰り返せばいい。
if(fp == NULL)はfopen()した直後(fgets()する前)にみるべき。
>>466 わけわからん。メモリリークって、解放すべきメモリを解放しないことですよ。
デジカメ撮影の .movから、 .jpgを1枚1枚全部取り出すっつぅプログラムを作りたいんだが、 やはりmov全体を読み込むほど、メモリを確保しないといかん?? 処理としては、 jpegファイル(not jpeg2000)の開始(ffd8)から終了(ffd9)までを、 延々とファイル末尾まで調べて、適当に連番で出力させられればいいんだが。。
その.movってのは、jpegが並んで入ってるだけのフォーマットなのか?
>>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; } これの意味です、何をどうインクリットメントするかです。
>>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;
}
>>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++];
のあたり、あまりよろしくない。
Cで2バイト文字を扱う方法を詳しく解説しているサイトってありませんか?
480 :
474 :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++];
等は、何故宜しくないのでしょうか?
参考書の著者のソースです。
>>480 日本語の勉強をしなおした方がよくないか?
>>いつもなら、0で返しますが、今回初めて1で返す事になっています。
>自分もよくわかりません・・・。
「いつも」とはなにか。自分自身しかわからないことは、きちんと相手に伝える努力をすること。
>>読み込みが成功したら(fread関数の戻り値が1)
>の戻り値が1とは厳密には、どういう事でしょうか?
厳密も何も、マニュアルページに書いてある通り、fread()は読み込みに成功したエレメントの個数を返す。
従って第3パラメータが1ならば、成功時は1個読めているので1が戻るのは自明。
>fread(&ch, sizeof(char), 1, fp)
>ch = ch - key[i++];
これはfread()を使うよりもfgetc()を使うべきシチュエーションだな。
>478がその意図で書いたかどうかは判らんが。
482 :
478 :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文字でもコード量を減らしたかった時代ならともかく)
system(); の中に変数を使用してmkdirのディレクトリ名を変数で指定して ディレクトリを作成するにはどうしたらいいですか
484 :
デフォルトの名無しさん :2006/10/31(火) 02:24:00
誰か助けてください。 N 人の宣教師と N 人の人食い人種が定員 k 人(k < N)の船で川を渡る。 ただし、どちらの岸でも人食い人種のほうが宣教師より多くなると、 宣教師は食べられてしまう。 というのをプログラムにしろという課題ができません。 3人ずつで定員2人の場合のコードはいろんなサイトに載っているんですが。
それをそれぞれの定数に当てはめれば終わりだろ
>>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人にすればよろしかろ。
487 :
474 :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を表示させることは可能なのでしょうか?
>>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
これは酷い
何言ってるのかがよく分からんが、 テキストとバイナリの違いなんて、例えば改行コードの取り扱いとかだけで、 基本的には同じ
DOS/Windows だと \n ⇔ CRLF テキストモード \n ⇔ LF バイナリモード それ以外の文字は渡されたものを垂れ流す。 テキストエディタで化けるような isprint() でない文字を可視化するような気の効いた機能なんぞない
495 :
デフォルトの名無しさん :2006/10/31(火) 11:37:20
>>489 C言語の機能にはない
sleep関数でウェイトさせる
forを大量に繰り返すという依存しまくりの方法もあるぞ
リスト構造やツリー構造などのメモリ上の状態、つまりポインターによるノード間の つながりをファイルに保存して、そのファイルを読み込むとコンピュータ上で 前回のデータ構造を再現できる方法を探しています。 色々探したり考えたりしたのですが、いい方法が見つかりません。 C言語でそのようなことは可能なのでしょうか? ご存知の方がおられたら教えていただけないでしょうか?
大学でさらっとだけC言語勉強はしたのですが、また勉強し直したいので何か入門書的なお勧めの本てあるのでしょうか? 近くにまともな本屋がないのでアマゾンで購入しようと思うのですが一つアドバイスいただきたいです。
大学の図書館て割と名著の宝庫だと思うんです
K&R2 (本屋で買える) JIS X 3010:1993 (JISで買える) ANSI C の Rational (webから落とせる)
s/Rational/Rationale/
>>497 当然、可能ですよ。
個々のノードに一時的にID番号みたいなのを振って、ポインタの部分を
ID番号にしてファイル化するとか、ポインタの部分をファイル先頭から
のオフセットにするとか、イロイロ。
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のようにしたいです。
else{printf("%dコンピュターの番です\n",bin); bin--;}
整数を入力して下記のような表示をするプログラムを教えて頂けないでしょうか? 例えば4を入力したとき 4 1=1 2+1=3 3+2+1=6 4+3+2+1=10
510 :
504 :2006/10/31(火) 21:38:20
>>507 ご指摘、ありがとうございます。
入門書と比較しても誤りはないんですが・・・・。
>>else{printf("%dコンピュターの番です\n",bin); bin--;}
の何処がおかしいいのでしょうか?
>>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 );
}
}
>>510 元は %d がない。
>>506 の出力で "コンピュターの番です" となっているが
意図としては
23 プレイヤーの番です
22 コンピュターの番です
21 プレイヤーの番です
20 コンピュターの番です
となって欲しいコードだと思われるから。
515 :
504 :2006/10/31(火) 21:47:07
さんkす、できました!!! エラーがでなかったので、わかりませんでした!! ありがとうございました。
516 :
513 :2006/10/31(火) 21:49:17
>>514 こ、これは!!!
クライアントの時刻ってわけないよな…
ロックした時刻であって Write 完了時刻じゃない ってことなのか?
# 俺のレスのほうがトランザクション完了遅かった っとこと?
>>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) この二つの違いを教えていただきたいのですがお願いします。
1はn[i] が 0のとき 真 2はn[i] が 0じゃないとき 真
525 :
524 :2006/10/31(火) 23:15:00
間違った >1)if(N[i] != 0) n[i] が 0じゃないとき 真 >2)if(N[i] =! 0) これの場合 代入演算になるな 0の否定を N[i] に代入しなさいって
>>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
530 :
524 :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に代入ってこと
>>523 が、
>2)if(N[i] =! 0)
て書いてて、'=!'なんていう演算子あったっけ??と
びっくりしたが、何のことは無い、
2)if(N[i] = !0)
というふうにコンパイラ君は理解するんだな。びっくらこいた。
警告レベルをW4にして、納得した。
結局
2)if(N[i] =! 0)
の括弧の中身は必ず真になるからこのif文は無意味だね。
533 :
524 :2006/10/31(火) 23:25:35
>>531 警告でない?
BCBでこれやると「おそらく不正な代入」ってでる
>>533 VCをデフォルト設定で使っていて、警告レベルがW1だったから
最初は警告が出なかった、ただそれだけだがね。
すぐに気がついて警告レベルをW4(最高)に上げて警告を確認したよ。
「条件式の比較値は、代入の結果になっています。」ってね。
VCは警告レベルW3でもこの警告出ないんだよね。
535 :
524 :2006/10/31(火) 23:41:08
>>534 >>531 の
>警告レベルをW4にして、納得した。
これ見て納得した...警告出てたのね
>>523 にしてもそうだがよく読まずレスしてしまった
で見返してから気づく...ちげぇーじゃんって
スマソ
536 :
どんずまり :2006/10/31(火) 23:43:58
昨日はソースの提供ありがとう御座います、おかげさまで関数で配列のポインタの呼び方を覚えました。
537 :
475 :2006/10/31(火) 23:52:46
>>536 そうやってきちんとレスを返してくれると、
今度また質問に答えようかな、という気持ちになるんだよね。
なにもレスがないとさびしさで死んじゃうよ。
538 :
側近中の側近 ◆0351148456 :2006/10/31(火) 23:56:24
>>537 (っ´▽`)っ さびしいなら私が抱きしめてあげるよ☆(抱
539 :
401 :2006/10/31(火) 23:59:08
ああ、スルーされてる・・・ ヘルプミー!!
540 :
デフォルトの名無しさん :2006/11/01(水) 00:02:24
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); }}
542 :
401 :2006/11/01(水) 00:07:49
>>540 ピクセルのRGB値です。
例えば
color[100][100][0]なら100行100列目のR値です。
>>541 それは無理に押し込めるより
テキストにしてうpにした方がいいだろ・・・・
544 :
401 :2006/11/01(水) 00:16:58
あー違った 101行と101列です
545 :
どんずまり :2006/11/01(水) 00:35:54
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 ごめん。本当に何が言いたいのか分からない。
画像の何をどのようにしたいのか教えて。
548 :
475 :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以内の要素しか持てないようにするといった具合です
550 :
401 :2006/11/01(水) 00:58:01
>>547 三次元配列に格納されている
画像のデータを上下反転させたいです。
551 :
475 :2006/11/01(水) 01:17:09
552 :
どんずまり :2006/11/01(水) 01:18:07
>>546 さん
ありがとう御座います。
明日すぐに試して報告します。
>>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" この場合はエラー表示する みたいに分解したいんですけれど、どういう方法でやればよいでしょうか?
分解して、必要ならエラー処理するしかないだろなー。 strtok、strstrあたりでググリなされ。
556 :
デフォルトの名無しさん :2006/11/01(水) 02:15:42
>555 ありがとうございます。 その分解の方法で悩んでいるのですが、数字とアルファベットの境で 分解するには、どういう方法が良いでしょうか?境に必ずしも空白が入っている とは限らないので。
557 :
475 :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
うんちー
>>554 strtol()でもいいね。
Ex.
char * unitName;
char * test = "10cm";
long value = strtol(test, & unitName, 0);
printf("%ld[%s]\n", value, unitName);
floatやdoubleなど、小数を扱える変数が、 2や3ぴったりになっているのを確認するにはどうしたら良いでしょうか? 現在、「intにキャストして、元の変数と比較してイコールならぴったり」 という処理を考えているのですが、別の方法はありますでしょうか?
intだと仮想部足りないから一部の数字でうまく動かない。 x==floor(x)とかでいんじゃね。
おお、値を切り捨ててくれる関数があったんですね! 恥ずかしいですが、初めて知りました。 レスありがとうございました。
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 といった具合にもとめた答えを 次の時間に反映させるにはどうしたらいいのですか。 またひとつの時間毎にノートなどの テキストファイルに出力するにはどうしたらいいでしょうか
>>550 これでいいんじゃないの?
int y;
for(y=0; y<(高さ); y++) {
// y 行目と (高さ-y-1) 行目をひっくり返す
}
配列はビットが並んでることが保証されてるから、
入れ替えはこの際 memcpy で、幅×色数×深度 分コピー
>>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進めて
次の計算に使うようなことをしたいです
またノートなどにそれを毎回保存させていくにはどうしたらいいでしょうか
文章が下手ですいません;
超絶エスパーのオレが解析 Iとjというペアになっている値を大量に求める処理を複数回実行したい(時間をΔt進める)のだが、結果を再利用する方法がわからない また、計算結果のログを取りたいのだがファイルの入出力も分からない
570 :
デフォルトの名無しさん :2006/11/01(水) 09:17:43
>>569 ありがとうございます
まさにそのとおりです・・・
とりあえず温度を配列[31][31]にする。(上の図だと0,0が無いので) 温度の計算をI、J、時間が引数の関数にする。結果をテキストで出力。 で、微分方程式って何?
#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型になっているのかがわかりません。 なぜこのようになるかどなたか教えてください。お願いします。
式中に複数の型があり、上位の型であるdouble型にキャストされている
質問です 円の領域内に入っているかどうかでif文を使いたいのですが 以下のような形で二乗をあらわしてもいいのでしょうか? if((x[i]-x[po])^2+(y[i]-y[po])^2<=(z[i]-z[po])^2){ 〜〜〜
>>574 ^ は XOR 演算子だ
乗数が欲しいなら pow() を使うか (x[i]-x[po]) * (x[i]-x[po]) って書け
576 :
デフォルトの名無しさん :2006/11/01(水) 12:26:48
>557 >560 ありがとうございました。この方法を採用させていただこうかなあと 思っているのですが、こういう処理を汎用的にこなせる、より一般的な 方法とかアルゴリズムみたいなのはありますか?正規表現とか使うと いいのでしょうか?
>>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 ありがとうございます。
差分方程式化やってみます!
>>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
すみません、記号「≒」の意味はどういう意味なんでしょうか?
大体同じ
「近似」な。
583 :
デフォルトの名無しさん :2006/11/01(水) 17:08:14
ポインタって 変数の場所を指定したら そこの関数でも使えるって感じですか?
>>583 あくまで、場所を教えただけで、その中身がどうなろうと知らないよ。って感じ
def = って何ですか?(大体こんな感じの記号なんですが・。)
ソフトバンク
通話料ナル文字
C と何の関係があるか知らんが 左辺を右辺で定義する
589 :
デフォルトの名無しさん :2006/11/01(水) 21:34:27
>>579 ありがとうございます!
今日図書館で数値解析の本も借りてきてみたので
これから試してみようと思います。
590 :
401 :2006/11/01(水) 22:04:44
>>564 マルチポストはあんまり良くない事はわかってんだけど
海の向こうの方々に聞いてみたらあっさり解決しました。
書いたことあんまり変えてなかったんだけどなぁ
これがいろんな意味での差なのだろうか・・・
>>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?見たいな感じで奇数が出力されずこんな結果になります。
>>592 桁あふれかも。
(signed)intの最大は2147483647(10桁)。
1) 入力した数値文字の列が、int で扱える範囲を超えた 2) 呼び出し元側の ch[] の配列の大きさがそもそも 11個未満 # while 内で入力が配列突破する可能性あるんだけど… # ch[]の器を越えて数値をタイプした後 [Enter] したらアウトじゃん
↑ あ。スマン。 漏れの環境(BCC5.5)だと。
>>592 何してるかさっぱりわからんが、nm は配列じゃないのに nm[d] って何だ
>>596 俺はUSキーなので確定で定かではないが、
宣言部で int :nm となってる。 脳内で int *nm と補完した
オーバーフローは最大ギリギリで判断してエラー出す。 大量のタイプはユーザーが悪いってことにするために あらかじめ注意メッセージを出しておくか、キーの入力を取って処理する
>>597 なるほど、それじゃ
×>printf("数字配列%dを出力しています\n",nm);
○>printf("数字配列%dを出力しています\n",nm[d]);
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
関数から配列に結果だけうけとって入力された値が奇数だったら画面に 出力する処理です。 桁数オーバーなんでしょうか?
>>601 >>594 も言ってるが
while((cd[c]=getchar())!='\n'){c++;}
これ ch[] の配列サイズのチェックしたほうがいいよな
>>602 32ビット signed int だと 範囲は -2147483648〜2147483647 まで
605 :
どんずまり :2006/11/01(水) 23:30:00
>>600 さんへ
541に書いてあるソースの関数部分だけ変更しました。
>>605 おまいは質問の仕方が下手っぴー だな。
>>541 からは
printf() の出力が変なんだけどなんで?
しか読み取れんのよ。
その後の奇数がどーたら部分については皆目見当がつかんから答えようがない。
あと、「関数部分だけ変更しました」だけじゃ何がどーなったのか全然わからんがな。
せめて 入力どおり表示されるようになったのか
まだ入力と(その関数で表示している) printf() 出力がこーなってる とか
もう少しなんとか出来ないのか?
607 :
606 :2006/11/01(水) 23:38:21
まあ添え字オーバーうんぬんはおいといて、とりあえず
>>599
609 :
603 :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;
}
}
610 :
603 :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; 改行規制のため続く↓
613 :
612 :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; }
ひとつのプログラムでプロセスを多発させるような サンプルを考えています。よい方法はないでしょうか。 たとえば、(無限ループはよろしくないかと思いますが) void main() { while(1) { fork(); printf("A\n"); } } fork()の使い方は、これでよいでしょうか。
指摘したことがことごとくスルーされ、
かつ同じことが別人によって指摘されてちょっとへこみ中。
自己主張してみる。
>>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ちゃんねるは向いていない。
unsigned longで扱える最大値が2^32だとして、その変数に格納しようとする式の値が 計算の途中や計算結果で2^32より大きな値になる場合、どの段階で値は狂っているんでしょうか?
617 :
603 :2006/11/02(木) 00:27:18
>>616 越えた時点でオーバーフロー
普通はエラーが出たり
618 :
616 :2006/11/02(木) 00:35:27
>>617 計算できる値の最大値 == 格納できる値の最大値 ということですか
CPUとかのハードウェアの計算能力の限界とは別問題(型と一緒だから処理系依存?)なんですね
即レスありがとうございました
619 :
557 :2006/11/02(木) 00:49:22
620 :
603 :2006/11/02(木) 01:06:41
>>618 >計算できる値の最大値 == 格納できる値の最大値 ということですか
たとえばchar 同士の演算の場合内部で拡張されint として扱われていたりする...(そのほうが処理しやすいからね)
これだとcharのサイズを超えても計算の段階ではintなので問題ないがそれをcharに入れるとオーバーフローを起こす
int同士の加算だと拡張のしようが無いのでオーバーフロー起こす
その後はコンパイラによってエラー処理をどうするか分かれる
普通はあふれ桁を無視すると思う
>CPUとかのハードウェアの計算能力の限界とは別問題(型と一緒だから処理系依存?)なんですね
そうだね、基本的にコンパイラに依存するね
通常は「CPUとかのハードウェアの計算能力」に応じてコンパイラがコード生成するから
度、ラジアン、2sin,2cosの関数表を一次元配列でつくれ! 計算する角度は0から360で30ずつ増えていく ってプログラムなんですけどわかりますか? for を使うってのは分かるんですけどさっぱりでして
624 :
616 :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);
626 :
625 :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");
627 :
625 :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; }
628 :
625 :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 *** とエラーが出てしまいます、訂正したつもりですが、どうちがうのかわかりません ご指摘お願いします。
>>628 >警告 W8065 bintori.c 55: プロトタイプ宣言のない関数 'sleep' の呼び出し(関数 main )
プロトタイプ宣言がないと言われている。sleep関数のプロトタイプ宣言が書かれた
ヘッダファイルをインクルードすればいい。どのファイルかはMSDNあたりで自分で探して。
>エラー E2206 bintori.c 62: 不正な文字 '(' (0x8169)(関数 main )
エラーメッセージに書いてある通り。全角の「(」が不正な箇所に使われている。
これを直せば62行目に関して出ている他のエラーも消えるはず。
631 :
612 :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
633 :
612 :2006/11/02(木) 02:49:49
さらに自己解決しました。 if ( i < j ){ workswap(workarg, i, j); i++; j--; } を if ( i < j ){ workswap(workarg, i, j); i++; } に書き換えたら正しいソート結果が出るようになりました。
>>632 for(i=0; i<(sizeof(a)/sizeof(a[0])) ;i++) s[i & 1]+=a[i];
細かい点は適当に直して
unsigned にオーバーフローなんてものは無いんだけどな
636 :
632 :2006/11/02(木) 03:12:25
637 :
625 :2006/11/02(木) 03:48:06
>>630 質問してからずーっと、試行錯誤して考えていますが
>警告 W8065 bintori.c 55: プロトタイプ宣言のない関数 'sleep' の呼び出し(関数 main )
プロトタイプ宣言がないと言われている。sleep関数のプロトタイプ宣言が書かれた
ヘッダファイルをインクルードすればいい。どのファイルかはMSDNあたりで自分で探して。
これが解決しませんので、ご助言お願い致します。
638 :
625 :2006/11/02(木) 03:52:19
しかも、訂正したのを実行すると 【瓶取りゲーム】 交互に1〜3本の瓶を取ります。最後の一本を取った人が負けです。 瓶の本数:23 先攻[1] / 後攻[0] : 0 ==========あなたの後攻スタート!========== これだけでとまってしまいます。
640 :
625 :2006/11/02(木) 03:59:49
>>639 ありがとうございました。
是非、やってみます。
641 :
625 :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 ====================ゲーム終了===================== あなたの勝ち! ようになりますが、
642 :
625 :2006/11/02(木) 04:15:02
自分の書いたソースだと 【瓶取りゲーム】 交互に1〜3本の瓶を取ります。最後の一本を取った人が負けです。 瓶の本数:23 先攻[1] / 後攻[0] : 0 ==========あなたの後攻スタート!========== コンピューター>3 本取ったぞ! 何本取りますか?1 コンピューター>3 本取ったぞ! 何本取りますか?2 コンピューター>2 本取ったぞ! 何本取りますか?3 コンピューター>1 本取ったぞ! 何本取りますか?1 コンピューター>1 本取ったぞ! 何本取りますか?2 コンピューター>3 本取ったぞ! ==========ゲーム終了========== あなたの負け!又、挑戦してね! こうにしかなりません、エラーや警告は解決したはずなのに・・・・。 何処の何が違うのか検討すらつきません。
643 :
625 :2006/11/02(木) 04:15:44
□■ らが表示されません。
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); } ↑ここはこれでいいのか?
646 :
625 :2006/11/02(木) 04:34:18
>>644 >>645 ありがとうございました。
参考書にはそれについては載っていないのでデバッガでググッテみます。
デバッガが使えるのと使えないのでは生産性に恐ろしいほどの差が出る。 早めに勉強して覚えちゃうのが吉だ。 ただ、デバッガの使い方はググるよりVSのマニュアル読んだ方が早いぞ。
648 :
デフォルトの名無しさん :2006/11/02(木) 04:48:13
何から何まで、ありがとうございますm(__)m
このスレで度々 void main() 表記がいけない様に言われていますが、 大学の講義や一部のC言語解説サイトにはvoid main()で記述されているのを見かけます。 void main()はどういった点でおかしいのか教えていただけますか?
>>649 単純に言えばポータビリティがない。
void main()はCでは処理系依存の方法に該当する。
int main(void)やint main(int,char**)はCで規格で明確に定められた書式。
なもんでその処理系にどっぷり依存して糞ったれなコードを書きたいのならvoid main()でもいいよ。
>>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とか、あるいは、世の中の常識的には そちらが良いでしょうか?
おまえがやってるのはC++
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++ 知らんかった。。。 _| ̄|○ サンキュウ!
enum タグ名 {} 変数名 基本的にenumは「enum タグ名」型の変数を定義する。(タグ名、変数名のどちらかは省略可) この変数は普通はint型でint型の他の変数と取りうる値域は変わらない。 型名は「enum タグ名」なのでenumを省略するのはあまり良くない。
typedefも教えてやれよ
658 :
デフォルトの名無しさん :2006/11/02(木) 14:54:06
Cでwebページ自動作成するプログラム書きたいのだけど できますかね?
659 :
デフォルトの名無しさん :2006/11/02(木) 15:23:09
>657 教えてけろ。たのむ。
>>658 できますよ
>>659 typedef 定義済みの型名 新しく定義する型名
新しい型名を定義する。定義後は型名が追加されるだけで、定義済みのと置き換えるわけではない。
長い型名を省略、自己を説明するような型名、short付加による32ビットと16ビットとの互換など
もちろん、enum型、struct型も定義可能
661 :
658 :2006/11/02(木) 15:53:04
どのようにすればよいのでしょうか? 当方超ド素人です・・
>包丁で料理したいんだけどできますかね? →できますよ >どのようにすればよいのでしょうか? お前が言ってるのはこういう事だ 俺らはエスパーじゃねえ
>>661 662も言ってるように質問が漠然として答えようがないよ。
まずは661が書いたソースを見せて、どこがどういう風におかしいと思うか具体的に書かないとレスもらえないよ。
>Cでwebページ自動作成するプログラム これを仕様とするならば、ランダムにタグを組み合わせれば出来る。 が、場所の確保やら画像やらを含めるとなると
#include <stdio.h> int main() printf("<html></html>\n"); }
この分野に限ってはこういうスレにいるほとんどの奴はエスパーだろ。 ただそういった要望に応えるには世の中払うもん払ってもらわにゃやってられんというわけだ。 与えられた時間は誰にとっても有限なのだ。
ID無いと不便だよな
あ。 Cだったか。 1行なのに大間違い × int main() { printf("<html></html>\n"); } ○ int main(void) { printf("<html></html>\n"); return 0; }
669 :
デフォルトの名無しさん :2006/11/02(木) 21:21:52
こういう{}の付け方なんか好きになれない
671 :
669 :2006/11/02(木) 21:30:44
>>669 >>671 かなり時間がかかってしまって申し訳ないが、
if(n==1)
data2[0] = data1[0];
の2行をmerge_sortに追加すればおkのような
673 :
669 :2006/11/02(木) 22:10:49
>>672 マジありがとうございました、できました。
674 :
デフォルトの名無しさん :2006/11/03(金) 00:17:08
ftellで 2,147,483,647byte 超えるファイルの 終端のポイントを取得した場合どうなるの?
鼻から悪魔が出る。 多分。
677 :
デフォルトの名無しさん :2006/11/03(金) 00:56:19
こんなのがあるのか さんくす!
680 :
デフォルトの名無しさん :2006/11/03(金) 01:16:54
WindowsならWin32関数を使おう
このスレが本当に一番簡単なCのスレなのか・・・・
684 :
デフォルトの名無しさん :2006/11/03(金) 11:05:13
テキストファイルを読み込んで構造体配列に格納するにはどうすれば良いでしょうか? txtファイルには1行につき1件のデータが書き込まれており、そのデータはカンマで区切って5つ程の詳細データに別けられています。
1行ずつ読み込んで、5個のデータに分割して格納すればいいと思うよ。
>>684 それだけ書式がしっかり出来てるなら簡単。行ごとに読み込んでカンマ単位で取り出し格納
687 :
684 :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言語難しい(´・ω・`)
>>687 strtok(line,",")の結果をどっかにコピーしないと、次のループでデータが上書きされるよ。
ニホンノフユハサムイノ??
すまそ、誤爆した。。
scanfはエンターが押されるまで、ずっと待ち状態であって、 俺が求めてるのは、キーを押せばすぐその反応が返ってくる奴。 fgetsとsscanf使えとか言われたけど、その使い方がさっぱり分かりません 認識は一文字でかまわないので、その方法を教えていただきたい。 例えば終了コマンドで、 1 を入力すれば終了。 2 で続行。 それ以外なら、エンター待ちではなく、すぐ判断して、 また「入力してください」というのが、読み込まるような奴です。 言葉不足かもしれませんが、よろしくお願いします。
switch文かIf文使えばいいんじゃん?
693 :
625 :2006/11/03(金) 14:55:32
質問があります i = 0で if(i < bin_max - bin){printf("□");} この意味は、0より瓶の総本数の残りが大きければ □を出力と言う事でしょうか?
>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()がない環境ではどうやるのか 私も知りたいのだが。
getchでは無く _getch は ISO C++ 準拠みたい ほとんどの環境で動くんで内科医
それも非標準。 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; } このプログラムを四角を描くたびに色を変えるには どうすればいいんでしょうか??わかる人教えて下さい
>>697 そのGWなんちゃらというものが何者か知らないが、
二重のfor文ループの中(GWsrectがある位置)で色を変える処理をすればいい。
そのライブラリでどうやって色を変えるかはC言語の問題じゃないので、
マニュアル見るなり他で調べるなりしてくるべし。
699 :
デフォルトの名無しさん :2006/11/03(金) 22:42:25
12という数値をprintfで012と出力したいのですがどうしたらいいでしょうか
printf("%03d", 12);
702 :
デフォルトの名無しさん :2006/11/04(土) 01:22:01
>>700 printf("%03d", 12);
704 :
デフォルトの名無しさん :2006/11/04(土) 02:21:16
ソケット通信でsendとrecvのデータのやり取りを「char buf[256]」で行っているのですが、 例えば送る側が「int AAA」と「float BBB」を送り、受け取る側がこれらを受け取るにはどのようにすればいいのでしょうか。 なんでこんな初歩で躓いているのか自分が情けなく感じるorz
706 :
デフォルトの名無しさん :2006/11/04(土) 02:40:47
>>704 sprintf関数でテキストに変換して送るのが一番簡単。
floatの場合は精度という問題があるけど、有効な桁というのがあるはずだから
それで編集する。
ソケット通信で一番の肝は電文フォーマットの設計。
詳しくは「ネットワークプログラミング相談室」のスレで
DOS窓で動作するCプログラムを作成しているのですが、 a.exeを実行すると 例えば・・そうだなぁ #include <stdio.h> main() { printf("hello"); } とかでコンパイルして実行するとDOS窓が一瞬開いて一瞬で閉じちゃいますよね。 helloってメッセージを見る間もなく。 これを、Enterキーを押したらその窓を閉じる、と言うようにしたいのですが それをなるべく簡単に実現する方法はありませんか? 私の思いつく方法だと printf(" 0を入力するとプログラムを終了します。"); scanf("%d",&a); while(a) } といった3行にもなってしまうもので、コレを手軽に1行でもっと短い命令で出来ないかなと。
708 :
707 :2006/11/04(土) 04:39:50
間違ったwww >printf(" 0を入力するとプログラムを終了します。"); >scanf("%d",&a); >while(a) >} scanfとwhileの場所入れ替え。
system("pause");
710 :
707 :2006/11/04(土) 05:01:34
711 :
デフォルトの名無しさん :2006/11/04(土) 05:25:13
DOS窓のコマンドラインからa.exeと入力すればいいんだけどね 面倒がらずに
IDEの利点をわざわざ殺すのもどうかと思う。 開発効率の面から言えば、しなくてすむ操作はしないに越したことはない。
IDE ならデバッガ使えるってことになるが… CRT のソースあるなら _atexit にでもブレ-クポイントおいといたら? # main() の末尾でも良いけどね
>>711 パイプになるような奴のチェックだとDOS窓から駆動したほうが良いよね。
DOS窓でターゲットまで移動するのが面倒なだけだw
ドライブまたがなければ、 cd [space] とタイプ後にフォルダを DOS窓へ D&D すりゃ
多少改善されるな。
俺は窓の手でフォルダ右クリックメニューのコマンドプロンプトで楽チン
IDEなんて使わないだろ。常識的に考えて。
Idee?
718 :
デフォルトの名無しさん :2006/11/04(土) 18:13:19
Microsoft Visual C++ 2005のコンソールアプリケーションで、 それまでPrintfで出力したものをいったん全部消したい場合、 どうすればいいんでしょうか? printf("\x1b[41m"); では削除されずに、 「[41m」 と出力されてしまうんです・・。
>>718 それ使ってるんだったらwindowsアプリにすればいいんだぜ?
720 :
デフォルトの名無しさん :2006/11/04(土) 18:53:11
719>> いや、なんとかコンソールでやりたいのです・・m(_ _)m
config.sys でansi.sysを読み込めば エスケープシーケンスが有効になる。 それからクリアスクリーンはESC[21J。
ansi.sysを使わなくても、なにか方法がありそうな気もするが。。。
system("cls");
>>723 そうそう。
ansi.sysがない環境でも、clsは画面クリアできてるんだから、
なにがしかの方法があるはずなんだけど。
clrscr();
728 :
728 :2006/11/04(土) 20:39:15
メンバ関数に配列を持つ、構造体配列を、関数に渡すには どのようにすればよいのでしょうか? struct AAA { int BBB[10]; }; AAA CCC[100]; 上のような定義だと、 たとえば、CCC[50].BBB[5]が参照できません。 よろしくお願いします。
(´-`).。oO(意味がわからん・・・)
できなくないよ。
void function(struct AAA p[]) { : } function(CCC)ってすれば、function()内で p[xx].BBB[x] が山椒できるんじゃねの?
732 :
728 :2006/11/04(土) 20:48:15
void DDD(AAA *CCC) { int box; box = CCC[50].BBB[5]; } ↑のようにしては、うまく渡せてないみたいなので どうすればよいのか、わかりません。 どうすればよいのでしょうか?? すいません。うまく説明できなくて。。。
(´-`).。oO(その渡し方だとtypedefしないとダメなんじゃ・・・)
間違いはない。値は渡る。
(´-`).。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; }
736 :
728 :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)で渡してます。 何か、根本的に間違っているのかもしれません。う〜ん。
(´-`).。oO(それコンパイルエラーだろ・・・)
(´-`).。oO(void DDD(struct AAA *CCC)・・・)
CなのかC++なのかくらいハッキリしろ
740 :
728 :2006/11/04(土) 21:06:19
ごめんなさい。C++です。 あまり、かわらないくらいにおもってました。ごめんなさい
742 :
728 :2006/11/04(土) 21:11:35
ご迷惑かけてすいません。 出直してきます。 ありがとうございました。
スレタイ嫁カス
(´-`).。oO(俺は
>>740 を許さない・・・)
>>740 オマエにはこのくらいがちょうど良い
どうせあまりかわらないしな
template <std::size_t N>
void DDD(AAA (&CCC)[N])
{
int box:
box = CCC[50].BBB[5];
}
まぁ落ち着こうぜwww
748 :
デフォルトの名無しさん :2006/11/04(土) 22:57:17
718 です。
>>721 〜727
system("cls");
で目的は達成できそうです。
どうもありがとうございます!!
> system("cls"); winのコンソールは、これでOKなのか。 DOSの時代は、内部コマンドは直接呼べなかったのに。
>>749 OKだお( ^ω^)
DOSってなんだお( ^ω^)
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;
}
ってもう解決したかな・・・・
1-3の間でランダムな数を実行時ごとに毎回異なるように生成して 変数aに格納したいのですが、それをなるべく簡単に実現する方法はありませんか? C言語素人なもので、Web上に載っているコードが長くてちょいと覚えられそうに無くて なるべく簡単なのをお願いしたいのですが・・・。 #include <stdio.h> main() { int a; a = 「ランダムな1〜3の数」; ってな感じに・・・。で、起動時に毎回異なる値(必ず異ならなくてもいいけど(偶然同じ値になった っていうこともあるだろうし)、なるべく異なるようにしたいのですが・・・ ちょっと調べた限りだと時間(Time)を絡めると毎回違う値に出来るみたいですが コードがどうしても長くなりますかねぇ?簡単に書けないでしょうか?よろしくお願いします。
自転車乗るのに自転車の細かい構造まで覚えたのか?
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; } これで、どうよ?
1から3までっつってんのに、 日本語読めねぇのかこのクズは?
と真性クズが申しております
メンドくせえことしてんなよ。 time(NULL) % 3 + 1 で充分だろ。
いやそりゃまたなんつーかその、なんだ。
761 :
756 :2006/11/05(日) 11:42:46
#define LOW 0
↓
#define LOW 1
にすれば1〜3の乱数がとれる。
>>753 さんこれでどうですか?
#define LOW 1 でもだめなんじゃね?
>>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言語とかそういうのはさっぱり分からないんで、どこをどうすれば 良いのか教えて頂ければ幸いです。
767 :
753 :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; じゃダメなんですかねぇ?
>>767 覚えるのはrand()で乱数が得られるということだけだろ…
猫でも分かるプログラミングを読みながら、最初のハローワールドのプログラムを作ってみたんですが、 /* hello */ #include <studio.h> int main() { printf("Hello World!\n"); return 0; } これを、テキストファイルを拡張子をcに変えたものにMicro soft visual C++で打ち込んでビルドしてみたんですが、インクルードファイルが読み込めませんと出てビルドすることが出来ません。どうすればよいのでしょうか?
>>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 が含まれる)
>>770 初心者にありがちなミスだな。studio、スタジオでもステュディオでもなくstdio
stdioってStandard I/Oだよな?
>>749 デマを流さないように。
DOS時代もちゃんと環境変数COMSPECを見て、シェルにコマンドを渡してたよ。
>>773 俺は今でもストディオと頭の中で唱えながら打ってる。ストは無声音stであってsutoではないが。
instructionをなんと読む?そう、インストラクションだ。日本語表記だと無声音が表現できないので少しつらい。
radioをなんと読む?そう、レィディオだ。日本語表記ではラジオだが。
stdioをなんと読む?そう、ストディオだ。
間違ってるか?
>>775 無声音を夢精音って脳内変換した。
あとはそうだな、日本人として正しい流れだとは思う。
オレはスタンダードアイオーヘッダーって読んでるけどな。
StandardInputOutput
スタッドアイオー
stdio stdlib stddef stdarg
えすてーでーあいおー
俺は えすてぃーでぃお だなぁ
stdioとしか読めない
784 :
デフォルトの名無しさん :2006/11/05(日) 21:48:11
into main{ }と into_ tmain(int argc, _TCHAR* argv[ ]{ } の違いがわかりません。 誰か教えてください。お願いします。
ネタとしか思えない
とりあえず、うpれカス
>>784 いみうんこなんだけどオレがおかしいのか?
いや、俺にも意味わかんない
>>787 実はそう
だったらどうしようとか思わないのか。
背中にさっと冷たいものが落ちてくるような突然の孤独感、湧き上がる恐怖。
それを感じたが最後二度と彼らの世界に戻ることは出来ないのだ。
ま、どんなに長くても寿命が尽きるまでの辛抱だ。
インベーダーゲームのようなもので、それを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になるのはなぜですか? 無知ですみません。
x が32ビットだから。
793 :
デフォルトの名無しさん :2006/11/06(月) 11:12:13
>>792 すみません。なぜ32ビットなんでしょうか?
藻前の環境では int型が32ビットだからだ。
変数 x の中身 1回目:00000000000000000000000000000001 2回目:00000000000000000000000000000010 3回目:00000000000000000000000000000100 ・ ・ ・ 32回目:10000000000000000000000000000000 33回目:00000000000000000000000000000000
796 :
デフォルトの名無しさん :2006/11/06(月) 11:23:59
グローバル変数について質問です。 ファイル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; }
訊く前に試せばいいだろ ぼけ
>>784 int main{}
int _tmain(int argc, TCHAR* argv[] {}
おそらくこう書きたかったんだろうな。
他にこれもある
int main(int argc, char* argv[] {}
1番目と3番目は標準の書き方で、違いは引数のありなしだけ。
2番目と3番目の違いは第2引数の型。TCHAR型はWindowsプログラミングで使う。
で合ってる?正直C言語暦1ヵ月で自信がない
1番目は標準から逸脱してるだろ。 2番目と3番目は引数だけでなくエントリーポイントも違う。
俺には全部コンパイルエラーに見えるな。
フリーのいいコンパイラない? Borland C Compilerはごちゃごちゃして使いにくいし LSI C Compiler試食版はバグあるし制限ありまくりだしコンパイラとしては最悪だし 今の所Cygwinのgccが最高なのですが・・・。 エディタはlcpad( CPad ? 試食版と一緒に使う奴)がかなり使いやすいですが もっといいのあったら・・・。 Cygwinのコンソールでviを使って書くのは辛すぎる。 色分けもしてくれないし・・・
VC++2005Express というレスを今年で10回位書いた気がする
>>802 vim入れたら?
色分けなんてイラネけど。
Virtual PC + Emacs + gcc
>>805 あ、忘れた
Virtual PC + Linux + Emacs + gcc
gcc以上のコンパイラは(多分)ない
>>802 フリーのエディタなんて探せばいくらでもあるだろ。
それはさておき、LSICのバグってなんだ? 一応元関係者みたいなもんだから聞いておきたいのだが。
#つーか、とうとう最悪にされちゃったか。
CGIで使った時BCCやVCだと正常なのに、LSICだけエラーになったり。バグなのか何なのかよくわかんないけど。 それよりデフォのスタック小さすぎ。
>>802 MS Visual C++ Toolkit
設問 入力された単語の長さを横棒グラフにして表示するプログラムを作成せよ。 横棒グラフは単語の長さだけ'*'を表示する。ctrl + Z が入力されると処理を終了する。
とりあえず、ctrl+Zが終了なのは何故なんだぜ?
>>802 BCCのどこがごこちゃごちゃ?
gccとかわらんだろ
コマンドライン好きならVCExpressをIDE無しで使うとか
>>812 MS-Windows の EOF だから
Linux なら Ctrl-D かな
設問 入力された単語の長さを横棒グラフにして表示するプログラムを作成せよ。 横棒グラフは単語の長さだけ'*'を表示する。ctrl + Z が入力されると処理を終了する。 なお、『ctrl + Z』はEOFとみなすものとする。
>>802 BCC のコンパイラが吐くメッセージは分かりやすいので初心者におすすめ。
変なファイルができるのが嫌いだが・・・
>>809 LSICはよく知らないし別に擁護するわけでもないけど、
バグかどうか分からないのにコンパイラのせいにするのはやめたほうがいいよ。
自分のプログラムに未定義動作または処理系依存の処理があって、他のコンパイラでは
たまたま動いていただけかも。
学生時代に、プログラムが自分の思ったとおりに動かないとすぐに
コンパイラのバグだとヒステリックに騒ぐ困ったちゃんがいたのを思い出した。
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桁以上入力したらエラーになる処理です
826 :
どんずまり :2006/11/06(月) 23:50:01
すいません、質問の仕方が非常に悪かったです。 1桁+1桁を行い合計値を求めると言う問題です。 ただし2桁以上入力したらエラーにしなくてはいけません。
いやだから、問題はわかったけど、質問はなんだ?
エスパーが必要か・・・ふぅ。 >while(st[c]=getchar())!='\n'{c++;} ここでバッファオーバーランが起きるのがまずいんじゃね? つーかここのとこ、いつまでたっても理解してくれないね、君。 475からずっとソース書いてるが・・・
厨臭い質問ですいません。 初めてプログラミングしたくなったので、C言語でもやろうかと思ってるんですが、 中学生の超初心者にも分かりやすい解説本をいくつか上げてくれませんか? 俺・・・プログラミング経験なし・コードすらみたことなし。厨房三年。 理解力はとぼしいので、私に向いてる御本をいくつか紹介お願いします。
オーバーラン以前にコンパイルエラーだろ
>>829 そんな甘い考えを持っているのなら、やらないほうがいい。
せいぜい学校の勉強をしっかりとやること。
なお英語をすらすら読めるようにしておくと便利。
>>826 あせらなくていいから、もう少し自分が書いた文章を見直して、
それを読んだ人に何が伝わるかを考え直したほうがいい。
コンピュータ言語と自然言語、まったく別のようだが、相手に何かを伝えるという目的は同じ。
自分はこういう"つもり"で言っている、こういう"つもり"で書いている、ではなくて
相手がどのように理解できるかが大事。
君が何を意図していようが、相手はそこに書いてあることしか理解できない。
細かい文法や技術的な知識を身につける必要もあるけど、
それ以前に文章の書き方にも意識を払うようにしたほうがいいよ。
セミコロンの書き忘れとか、正しく行番号指定してくれない時あって困ったことはあった<LSIC マニュアル読もうとしなかった自分もかなり悪いんだろうけど
>>829 はじめてのCでも読んでみたらどうだろう?
ただ
>>831 も言ってるように甘くはない
数学の知識と思考力は身につけておいたほうがいい
835 :
どんずまり :2006/11/07(火) 00:16:31
すいません。 while(st[c]=getchar())!='\n'{c++;}の処理はほぼ毎回使っています。 しかし今回の問題は475とは別の問題です。 画面から1桁入力して1桁だったら問題なし、2桁以上だったら "INPUTERROR"でもう一度入力しなおしで、 只単に1桁+1桁で関数を使い合計値を求める問題です。
scanfでいつも&を付け忘れるのは俺だけでいい
>>829 高校受験の勉強を真面目にした方がいいと思うんだが
分かった。 はじめてのCより数学3年らくらく基本問題集買ってくる。
>>836 最初に読んだ本のおかげか整数使う時はgetsとatoiつかってたよ
>>835 最後にもう一度だけ聞く。
「プログラムに、どんな不具合が起きているのか説明しろ!!!」
いいかげんにしろ。
841 :
どんずまり :2006/11/07(火) 00:26:32
不具合のことだったんですね、今わかりました。 申し訳ありません、今自宅で環境が無くちょっと説明できません。
>>835 おまいさんはプログラムの勉強をする前に、やるべきことがある。
・人の話をきく
・客観的に自分の言動を見る
・発言をする前に、自分が何を言おうとしているかを整理する。
などなど。
この件に限らず、実生活の中で「どうして自分の言っていることが、相手は分かってくれないのだろう?」
と感じることが多くないか?
>>829 プログラミング言語よりも自然言語(日本語など)を身に付けろ。
どんずまりのグダグダを見ていて思った。
844 :
デフォルトの名無しさん :2006/11/07(火) 00:28:16
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; } こんなんでどう? 文字数もメモリが許す限り何文字でも使える設定にしたかったけど自分の力じゃコレが限界。 コメント無しの汚いソースだけど少しでも参考になれば光栄です。
>>845 たぶん、以前自分がこのスレで教えてもらったことがあって
今度は自分が誰かの力になれたら、と思っていたんだろうけど、
>>816 はマルチポストしてる宿題丸投げの教えてチャンだから、
このスレではスルーするか適切なスレに誘導するほうがいいよ。
あと、816のためでなく845のために言うと、
getsはバッファオーバーフローの原因になるからfgetsを使うようにしたほうがいいよ。
ボキの童貞が卒業できないという不具合が起きているのですが(´・ω・`)
851 :
809 :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のバグの話がでたから昔気になったネタを投下しただけ。
何でSFUじゃなくてcygwinなんか使うの?
>852の最初のは、FreeBSD上のDOSエミュの問題かな。 3番目のは既知のバグだし。 >851と>852の2番目はXPで不安定と言うことなのかな。 まぁ、16ビット時代の遺物だからねぇ。
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]; }} }}
>>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
あんた馬鹿?
折角見落としていそうなところを並べ直して一目瞭然の状態にしているのに…… どうやら>856の目は節穴のようだ。
>>856 おまいさんは結果をどこに入れたいんだ?
最初のループで折角FFT_0からFFT_yにコピーしているのに、 次のループで再びFFT_1からFFT_yにコピーしようとしている。 しかも、FFT_yが32*32しかないからバッファオーバフローしてしまう。 恐らく、二番目の代入先はFFT_0のtypoじゃないのか?
863 :
デフォルトの名無しさん :2006/11/07(火) 03:55:23
ビジュアルベーシックとC言語は、どちらが難しいでしょうか? 初心者がやるなら、先ず初めにどちらが良いですかね?
言語としての敷居は明らかにVBのが低い。 つぶしの利きは明らかにCの方が高い。 VB持ってるならVBやれ。 特に環境の持ち合わせが無いならCやれ。
関数の引数が複数個あるときは、評価順は不定って言うのは理解できたんだけど、 評価のタイミングはいつになるんだろう? 今もってる参考書を調べてみたら 「引数への副作用はすべて関数が呼び出される前に効果を生ずると規定されている」(K&R P66) って書かれているんだけどこれは 例えばprintf("%d %d",a+b,c+d)ってあった場合printf関数が実行されるまえに、 順番は不定だけど引数a+b,c+dが評価されてその値が関数に渡されるって認識でおk?
OK
C言語で1000行1000列のような、巨大な行列を表現する方法って無いでしょうか? 二次元配列で bouble matrix[1000][1000]; といった風に表現しようとしても、プログラムの実行ができません。 (配列は連続した領域にメモリを確保する為、大きな行列だと確保できない?) このような大きい行列を表現したい場合、どのようにすればよろしいでしょうか?
>>867 スタックオーバーフローという。あまり巨大な領域はスタックには確保できない。
ヒープで確保せよ。つまり、malloc()を使え。ただし、多次元配列は自分で
シミュレーションすることになる。
「行列」と言ってるのに配列の話を始める>868は低能。
>>867 static を付けろ。
typedef int bouble;
static bouble a[1000][1000];
>>871 適当か? staticな変数もヒープに置かれると
思ってたが
>>872 コンパイラ & 環境次第。
ヒープ使うとは限らないよ。
未初期化か初期化されているか?でも微妙に領域違うし。 (@VC++)
874 :
デフォルトの名無しさん :2006/11/07(火) 12:47:32
staticをつけるとDATA領域に取られんじゃないか staticで解決することもあると思うが
875 :
874 :2006/11/07(火) 12:54:43
>>873 さんの指摘のとおり、コンパイラ & 環境次第
スタックサイズがでかい環境ならば実行できるだろう
サイズが1Mを超える配列はmallocでヒープを使ったほうが安全
876 :
デフォルトの名無しさん :2006/11/07(火) 12:58:53
入力した英文から単語を抜き出して表示するプログラムのソースはどのようになるでしょうか?
文字列確保してスペースで分けてったら?
印字するだけならスペースの代わりに改行打つだけでも いいかもしれないかもしれない
>>876 「抜き出す」ってどういうことだよ?
単語の集合である文をそのまま表示するのと
どういった違いがあれば良いんだ?
どのようになるかと聞かれてるだけなんだから、 これだけの設問でも答えることは可能だろ。
その後、二度と
>>880 がこのスレに現れることはなかった
と見せかけて実は882=880
その5「闘えないプログラマ」 「このプログラム、どうしてもうまく動いてくれないんですよ」 「それで?」 「自分としては、絶対に間違っているところは無いんですけど」 「だったら、動くはずだねぇ」 「でしょ? だから、これってコンパイラにバグがあるんじゃないか、と」 「(そんなこと言うやつに限って、自分のプログラムにバグがあるんだよな) じゃあ、試しにccじゃなくて、gccでコンパイルして見たら?」 「やってみたんですけど、やっぱり駄目なんです」 「じゃあ、やっぱり君のプログラムにバグがあるんだよ」 「そんなはず無いんですけどねぇ・・・動きがおかしいのは、たった数行の関数ですし」 「どれ、見せてみろよ。あー、この『if (s == "hogehoge")』って絶対、真にならんぞ」 「え、何でですか。sが"hogehoge"のときに真になるじゃないですか」 「お前なぁ、何年Cでプログラミングしているんじゃ。もいっかい、勉強し直せ!」 これが分からない。 どうして絶対真にならないの?s の中身がhogehogeの時に真になるんじゃ?
その文章だけでは絶対ならないとは言いきれないが、 プログラムによっては絶対にならないこともあるだろな。
本気で言ってるなら if ("hogehoge" == "hogehoge") これを「最適化無し」で試してみろ。
strcmpとか使わないとむりでない?
C++ならいけるだろうけど…
これでOK #define s 1 || ""
文字列プールが使えるコンパイラなら 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; } } }
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; } } }
プ
「どんずまり」は、もう宿題スレに行ったほうがいいんじゃなかろうか。 あとアップローダを使って欲しい。
素朴な疑問なんだが、なんで「どんづまり」じゃないんだ?
ドン・ズ・マリ
首領'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");
909 :
908 :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; }
910 :
908 :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行目の何処が違うか わからないので、ご指摘お願いします。
912 :
908 :2006/11/08(水) 01:09:21
変数rにtotal[draw_digit-1]を入れた。で、それっきりだ。 この値を何に使いたいんだい? 自分ではどういうことををしたつもりでこれを書いたの?
変数のスコープが理解できていないと思われる
915 :
908 :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になることはあるんでしょうか?
いいえ。真っ当なCならdoubleで演算が行なわれ、sumには150000000が代入されます。
>>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
a * b * (c * 0.01) └─┘ └──┘ int double └─────┘ double じゃねーの? 環境によってはa*bでオーバーフローするじゃん
オーバーフローしても0にはならんね。
そんな保証あったっけ?
923 :
デフォルトの名無しさん :2006/11/08(水) 10:10:58
一晩考えたんですけど、まだできないので質問します。 配列で初期化した配列要素の合計値を出したいのですが、 例 int a[5] = {1,2,3,4,5} ←この合計値を出したい! 僕だとa[1]+a[2]+a[3]... という式しか浮かばないのです。 もっとシンプルにできないものでしょうか?
int a[5] = {1,2,3,4,5}; int ic, sum = 0; for (ic = 0; ic < sizeof(a) / sizeof(int); ic++) sum += a[ic];
>>924 それのどこが『もっとシンプルに』なんだよ?
>>923 >例 int a[5] = {1,2,3,4,5} ←この合計値を出したい
int a[5] = {1,2,3,4,5};
int goukei = 15;
>僕だとa[1]+a[2]+a[3]... という式 これ見ると判るけど多分釣りだろうな。
>>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}の中を足すやり方があるん だろうか?ということです。。
>>929 それもまちがっとるぞ a[0]+a[1]+a[2]+a[3]+a[4] な。
(即値だけの要素を持つ)配列の初期化と同時に合計を(できれば即値で)得る か。
マクロでどうこうできるようなもんでもなさそうだな。
>>924 のように、素直にコード書くしかないんじゃね?
931 :
デフォルトの名無しさん :2006/11/08(水) 10:57:57
ごもっとも。a[5]はいりませんね、何してるんだろ 俺、、 for と sizeof か、もう少し考えて見ます。。
932 :
923 :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; }
正直926で噴いた
そりゃ定数なら普通は自分で計算するかコンパイラに計算させるよな。
Cスレなので範囲外だろうけど C++ のマクロ&テンプレートでもできないのかな?
Expression Template 使えばいけんじゃね?
938 :
デフォルトの名無しさん :2006/11/08(水) 17:21:52
現在、卒業研究で時系列分析を行っているのですがどーーーーーしても ARモデルとARMAモデルの式のプログラムが起動しません。 助けてください。
939 :
デフォルトの名無しさん :2006/11/08(水) 17:37:20
プログラムが起動しません!? 起動の仕方が悪いんじゃないか
おまいは制御専門なのか? ARモデルとかARMAモデルとか懐かしい響きだ。
が、起動しないだけじゃ
>>939 としか答えようがないな
941 :
923 :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とかは仮の数ですが・・ 上の文はエラーこそでないのですが、まともに出力できません。 続けて申し訳ないのですが、文としてどこかおかしいでしょうか?
942 :
923 :2006/11/08(水) 21:01:06
やろうとしていることは2つの引数を持つ関数を使って 関数の中で加算して結果を返し、さらにその関数を 呼び出して結果を表示することです。
>>942 まともに出力できないとはどういう意味だ?
それと num1,num2 の初期値入れないのはなぜ?
int num1,num2,sum; 変数の中身が初期化されてないので、確保したアドレスに入ってたものが表示されてる。 int num1=0 , num2=0 , sum=0; とかするか、scanfで入力させる この程度ならz要らないな。(あくまでこの程度の場合) 戻り値を関数内で表示ってのは個人的には汎用的でなくて嫌
system("pause") system("cls") みたいな、system("〜")は他に何かありますか?
OSによる
948 :
923 :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; } 参考にさせてもらいながらこうして見ました。 汎用的ですか、。それを考えられるレベルになれるように 頑張ります。
>>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;
}
printf("%d\n",z);をFuncにぶっこむなんてどうかしてる
>>947 system("echo ahoka")
952 :
923 :2006/11/08(水) 22:31:39
>949 なるほど、このほうがいいですね・・ ありがとうございました。
>>950 printfとscanf合わせて入力用関数とか作ったりしない?
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
>>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] …
という感じで、型の大きさ分ずつ番地が増えていく
959 :
955 :2006/11/08(水) 22:49:39
>>957 ご回答ありがとうございます。
ちなみに問題は配列データの計算時のキャッシュ-メモリ間の
ページフォルト回数を求めるようなもので、ハードウェアに関するものです。
「ブロックサイズは4語。intの大きさを1語とする」という一文だけあったのですが、
それではつまり具体的なサイズはともかくintの何倍かということは言えるのでしょうか?
>>959 問題文に明記がないならそうとらえていいと思うぞ
961 :
960 :2006/11/08(水) 23:05:03
>>959 >ブロックサイズは4語。intの大きさを1語とする
というか1ブロック4語
int 4つ分と明記されてるではないか
(intの4倍のサイズで1ブロック)
962 :
955 :2006/11/08(水) 23:14:02
963 :
960 :2006/11/08(水) 23:25:11
>>962 >ブロックは1度に扱う量であり
そういう意味だよ
つまり一度に扱う量が1ブロック(int 4つ分)ってこと
でメモリ領域は int a[n][n] なら n×n ×sizeof(int) の連続領域が割り当てられる
>>962 たぶん連続(4バイトならデータは連続だがアドレスは4刻み)
a[0][0]もa[n][m]も型が同じならサイズも同じ
つか、問題文イミフwwwwこんなんわかんねwwwww
965 :
960 :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 )、・・・・・ と続く
すいません。わからないので教えてください。 文字列に "(” と ")" は\のエスケープ文字は必要ないですよね。 以下の例は、正しいでしょうか。 例: char strings[] ="123(456)789";
さすがに試せってw
968 :
960 :2006/11/08(水) 23:41:20
>>966 正しいが試そうぜ
万が一って事もあるじゃんか
969 :
955 :2006/11/08(水) 23:42:12
>>963-965 なんかよく分かりました。そういやa[][]も今回はintですよねorz
というか適当に、intと同じサイズにしたれやと思って既に進めていたのでこれで安心しました。
ありがとうございました。
>>967 >>968 試したら、問題なく動作しています。どこかに書き物があれば教えていただきたかったです。
質問させていただきます。 今番号と名前を作成して、3件分データを入力したあとにデータ表示をするプログラムを作成しています。 その際、すでに入力された番号が入力された場合エラーとして再入力をさせたいのですが上手くいきません。 どなたか教えてくださいm(_ _)m
972 :
923 :2006/11/08(水) 23:56:33
>956 はい、funcという関数を作るという指定です。
聞く前に試せ。これ常識 オナる前に女児ぱんつ履く。これ異常
974 :
960 :2006/11/08(水) 23:57:11
>>970 書き物って何のこと?
>>971 >作成しています
で、自分の作ったヤツは?
なぜアップしない?
>>971 ソース晒せ
とりあえず、番号が特殊な書式ではない、ただの整数なら配列(-1とかで初期化)にでもいれて全部比較でもしろ
>>971 具体的に分からないのはどこ?アルゴリズムから?
どれぐらい形になってるの?
>>974 ソースを晒したいのですがPCが壊れてしまって携帯からの書き込みなんですm(_ _)m
明日学校で作成するので、番号の重複エラーの処理のヒントを教えていただけないでしょうか。
979 :
960 :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]などと 明示的に領域を確保したほうがよいのでしょうか?
>>977 一応番号が重複するエラー以外は完成しています。
同じ番号を入力した場合エラーを出す処理のイメージがなかなかわかなくて…
984 :
デフォルトの名無しさん :2006/11/09(木) 00:17:45
>>980 確保しないとメモリのどっかに上書きされると思うけど・・・
それが大事なデータだったり実行中のプログラムだったりしないことを祈る。
985 :
980 :2006/11/09(木) 00:17:59
>>982 ありがとうございます。
できれば理由も教えていただけませんでしょうか?
986 :
デフォルトの名無しさん :2006/11/09(木) 00:27:58
>>981 返答ありがとうございます。
PCを直してから出直してきますm(_ _)m
>>985 char *str;
int i=100;
sprintf(str,"%d",i);
printf("%d",i);
をやって味噌。
988 :
987 :2006/11/09(木) 00:31:21
違うわ。間違えた。
991 :
980 :2006/11/09(木) 00:42:39
>>984 >>990 なるほど〜
うまくいったのはたまたまだったんですね。あぶないあぶない
聞いてよかったです。ありがとうございました〜
よく構造体とか文字配列を宣言したときに memsetとかでヌル初期化してるけどあれってやったほうがいいんですか?
993 :
955 :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);
memsetは使ってないけどオレはやるようにしてる 特に意味不明なほどメンバが多い構造体とかバッファとか それでも人によると思う ところで、 HOGE hoge = {0}; みたいな初期化ってCでも使えたっけ? 使えるならこっちの方がいいと思うが
995 :
960 :2006/11/09(木) 00:55:49
>>992 好き好きで
「予期しない値」が困る場合に使えばいい
たとえばWinAPIのリターン用に構造体を渡すときなどは 0 で初期化する必要があったりする
>>992 用途による
初期化されてないのがポインタだと
別のところで使うときに
NULLとの比較ではじけないので
不正なデータにアクセスしそう
>>992 気持ちの問題。憂鬱なときは避ける。
デバッガで変数見るときに見栄えがいい。
冗談はさておいても、
メモリコピーでヌル文字を最後に付け加えておく記述をし忘れたときなんかのバグ抑止になる。
998 :
960 :2006/11/09(木) 00:58:37
最後の最後まで&抜けとは
1000なら再びC言語ブーム
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。