C言語なら俺に聞け(入門篇) Part 3
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/10/13(金) 04:55:50前スレ
C言語なら俺に聞け(入門篇) ぱぁと2〜
http://pc8.2ch.net/test/read.cgi/tech/1153818463/
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
関連スレ
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/
0002デフォルトの名無しさん
2006/10/13(金) 05:02:540003デフォルトの名無しさん
2006/10/13(金) 05:09:440004デフォルトの名無しさん
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
といった具合です。
0005デフォルトの名無しさん
2006/10/13(金) 08:10:140006デフォルトの名無しさん
2006/10/13(金) 11:55:170007デフォルトの名無しさん
2006/10/13(金) 14:44:520008デフォルトの名無しさん
2006/10/13(金) 15:00:26int 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;
}
0009デフォルトの名無しさん
2006/10/13(金) 17:01:41ありがとうございます!
一つのループで何とかしようと思ってました・・・
0010デフォルトの名無しさん
2006/10/14(土) 03:05:19abc........hogehoge........kirakira........parapara\n(改行)
+-------------++--・・・-++-------------++-------
この図で最初+-------------++までがlength値; 225
で次の+-------------++までがlength値; 225
最後の-------が7
この数値を足していけばトータルの文字数が取得できる。
全て読み終わった後にトータル文字数が幾つだったか出力します。
と入門書には書いてあります。
この図解をどう解釈すればいいのでしょうか?
図を見てもわかりませんので、アドバイス御願いします。
0011デフォルトの名無しさん
2006/10/14(土) 03:25:180012デフォルトの名無しさん
2006/10/14(土) 03:27:57えええ??
この図解では納得ができません
0013デフォルトの名無しさん
2006/10/14(土) 03:37:02この意味がわかりません
偽りでしょうか?
0014デフォルトの名無しさん
2006/10/14(土) 03:49:570015デフォルトの名無しさん
2006/10/14(土) 03:53:37#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);
0016デフォルトの名無しさん
2006/10/14(土) 03:54:10if((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 ***
001715
2006/10/14(土) 03:55:29ご指導お願いします。
括弧の数は足りているはずです。
0018デフォルトの名無しさん
2006/10/14(土) 04:32:28int i = 0のあと;が抜けてる
fgetc(fp)と!=の間に)が必要
if(c=!key[i])で=!ではなく!=
i++のあとに;が抜けてる2箇所
search = TUREでTUREではなくTRUE
俺は何やってんだろorz
0019デフォルトの名無しさん
2006/10/14(土) 04:34:01足りている、じゃなくて帳尻を合わせるために無理矢理足したんとちゃうんか。
なんかそんな臭いがプンプンする。
2chには行数制限があるし半角スペースもしくはTabのインデントは表示されないのは
わかるけど、もうちょっと丁寧に書くように心がけてくれ。これじゃ読みにくくてカナワン。
見通しの悪いソースはバグの温床にもなりやすいから、まずはコードを綺麗に書き直すという
基本的なところからやり直し。
一つだけヒント。main関数はどこだ?見当たらないぞ。
0020デフォルトの名無しさん
2006/10/14(土) 04:35:17お前の優しさに感涙
002118
2006/10/14(土) 04:43:19むしゃくしゃしてやった
今は反省している
002215
2006/10/14(土) 04:43:48できました!!!感謝感激です!
よくきづきますね。すごい。
>>19
はい、すみません・・・。
もっと綺麗に見やすくしたいと思います。
しかし、実行結果が
C:\source>5-4
ファイル名を入力して下さい > 5-4.c
検索文字列 > include
出現回数 0
三回にならない・・・・
0024デフォルトの名無しさん
2006/10/14(土) 13:51:290025デフォルトの名無しさん
2006/10/14(土) 15:15:300026デフォルトの名無しさん
2006/10/14(土) 15:23:31ネットにあるGLPKをおいてあるサイトで落として、sample.cを実行しているんですが、
外部シンボルが解決できないとのエラーが出てしまいます。エディタはBorladnd Cを使っています。
http://www.sc.pse.tut.ac.jp/~wada/wiki/index.php?GLPK
このサイトにある、sample.cと、GLPK4.8というのを落としてやっています。
どなたかコンパイルができる方がいたら、ぜひ教えてください。
まだまだ初心者なので、説明もおぼつかないのをご容赦くださいw
0027デフォルトの名無しさん
2006/10/14(土) 17:18:49なんて言うシンボルが解決できないだって?
0028デフォルトの名無しさん
2006/10/14(土) 18:44:38Error: 外部シンボル '_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 が参照)
というエラーです☆
0029デフォルトの名無しさん
2006/10/14(土) 18:45:130030デフォルトの名無しさん
2006/10/14(土) 18:47:000031デフォルトの名無しさん
2006/10/14(土) 19:38:33何か技があるんですか??
0033デフォルトの名無しさん
2006/10/15(日) 01:22:050034デフォルトの名無しさん
2006/10/15(日) 01:33:08『宣言が正しく終了していない』
と言ったエラーが出て困りました。
ググッて調べてみましたが、いまいち解決策が
みつかりません。
宜しくお願いします。
0035デフォルトの名無しさん
2006/10/15(日) 01:38:170036デフォルトの名無しさん
2006/10/15(日) 01:46:56#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;
0037デフォルトの名無しさん
2006/10/15(日) 01:50:53最後の行return 0;の次にブロックの終わり } はないのか?
0038デフォルトの名無しさん
2006/10/15(日) 01:52:30こっちではあるね。コピペミス?
0039デフォルトの名無しさん
2006/10/15(日) 01:56:33コンパイルが通りませ(T_T)。
0040デフォルトの名無しさん
2006/10/15(日) 01:59:280041デフォルトの名無しさん
2006/10/15(日) 02:00:510042デフォルトの名無しさん
2006/10/15(日) 02:04:57そこの>>991の言うとおりにしたらいいよ
0043デフォルトの名無しさん
2006/10/15(日) 02:13:580044デフォルトの名無しさん
2006/10/15(日) 16:34:000045デフォルトの名無しさん
2006/10/15(日) 16:37:400047デフォルトの名無しさん
2006/10/15(日) 16:40:230048デフォルトの名無しさん
2006/10/15(日) 16:41:46だったか?
0049デフォルトの名無しさん
2006/10/15(日) 16:48:00ライブラリはインストール済みで、リンクをしていないのかもしれません。。
>>47
やってみたんですが、sample.o が見つかりませんでした。
>>48
gccをbcc32に置き換えてやってみたんですが、やはり、外部シンボルが未解決がでてしまいます。。
0050デフォルトの名無しさん
2006/10/15(日) 16:49:54でいいはず、
0051デフォルトの名無しさん
2006/10/15(日) 16:52:07それでやると、上の荒しみたいなエラーがでますw
0052デフォルトの名無しさん
2006/10/15(日) 16:53:38いいから自分でこの方法を調べなされ。
0053デフォルトの名無しさん
2006/10/15(日) 16:55:540054デフォルトの名無しさん
2006/10/15(日) 16:56:290055デフォルトの名無しさん
2006/10/15(日) 17:01:370056デフォルトの名無しさん
2006/10/15(日) 17:09:32雇っているんですか?自分は雇ってませんが。
0057デフォルトの名無しさん
2006/10/15(日) 17:11:510059デフォルトの名無しさん
2006/10/15(日) 17:15:210060デフォルトの名無しさん
2006/10/15(日) 18:58:43scanfで秒数を入力して、それを「○時○分○秒」と出力するプログラムを
作ります。このとき、四則演算の%(余をだす)をつかわずに作るにはどうしたら
いいでしょうか。
自分でも書いてみましたが、シンプルなプログラムにならないのです。
0061デフォルトの名無しさん
2006/10/15(日) 19:07:34まず、作ったのを貼ってみ
006260
2006/10/15(日) 19:24:20int 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;
}
0064デフォルトの名無しさん
2006/10/15(日) 20:04:450065デフォルトの名無しさん
2006/10/15(日) 20:19:17十分シンプルだと思うんだが
0066デフォルトの名無しさん
2006/10/15(日) 20:21:580067デフォルトの名無しさん
2006/10/15(日) 20:30:37エラーは出るけど。
0068デフォルトの名無しさん
2006/10/15(日) 21:47:10どうやって調べたらいいんでしょうか?
int *array;
array = (int *)malloc(sizeof(int) * 1000000);
とした場合、int型4byte×1000000=4Mbyteになると思ったのですが
cygwin上でtopコマンドを使って調べたところ6Mbyte程消費していました。
環境によってこの位変わるものなのでしょうか?
よろしくお願いします。
0069デフォルトの名無しさん
2006/10/15(日) 23:31:49メモリ管理の実装は処理系、OSによって異なる
要求されたサイズだけを切り取る方式もあるだろうし、
特定サイズのメモリブロックのプールを予め用意しておく方式もあるだろう
前者だと要求サイズ+管理情報分のメモリが消費され、
後者だと要求サイズを超えるメモリーブロックのうちの最小のメモリーブロック
のサイズが消費されるだろう
いずれにしても、nallocで4Mバイトを確保したからといって、4M分だけどメモリが消費されるわけではない
オーバーヘッドが必ずある
このオーバーヘッドのサイズは実装方式に依存する
0070デフォルトの名無しさん
2006/10/15(日) 23:50:07あと、topコマンドで出力されるプロセスの仮想記憶のサイズ(SIZE)でmallocで確保中
のメモリ量をみるのは注意しないといけないケースがある。
freeしてもプロセスの仮想記憶のサイズは減らないから。
mallocでメモリ確保−>仮想記憶のサイズは変わらない
確保したところに書き込む−>仮想記憶のサイズは増える
確保したメモリをfreeする−>仮想記憶のサイズは変わらない
某UNIXではこんなだったと記憶する。
0071デフォルトの名無しさん
2006/10/16(月) 01:36:40巡回セールスマン問題の解が実装できないよー
Cで、巡回セールスマン問題に詳しい書物を教えてください
お願いします!!!
0072デフォルトの名無しさん
2006/10/16(月) 01:55:29char *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;
}
007372
2006/10/16(月) 02:00:49myalloc関数内の
*p1=malloc(20);
の部分で
p1=malloc(20);
でダメなのはなんででしょうか??
p1に*p1の値(アドレス)が入ってるのでアスタリスクをつける意味を
考えて混乱してきました。
よろしくお願いします。
0074デフォルトの名無しさん
2006/10/16(月) 02:17:13char **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かな?
0075デフォルトの名無しさん
2006/10/16(月) 02:18:00void 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*を間接参照している)
0076デフォルトの名無しさん
2006/10/16(月) 02:20:52事故レスねむ厳密にはvoid*である必要、かな?
0077デフォルトの名無しさん
2006/10/16(月) 03:21:34#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);
007877
2006/10/16(月) 03:22:49if((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 ;
}
007977
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 ***
とエラーが出てしまいます。
長文なので、誤りがなかなか発見できませんので
ご指摘、お願い致します。
008077
2006/10/16(月) 03:35:52エラー 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 ***
ここまでが、限界です・・・
0081デフォルトの名無しさん
2006/10/16(月) 03:58:09なんだこの変なインデントは。釣りか?
008277
2006/10/16(月) 04:04:30何かおかしいのでしょうか?
参考書の通りにやると、自分が見難いので
自分が見易いように書いています。
何卒、ご指摘を
0083デフォルトの名無しさん
2006/10/16(月) 04:13:34中括弧の対応関係とか→('A`)
0084デフォルトの名無しさん
2006/10/16(月) 04:18:26書き直してみた。
42行目のifが閉じてないな。
50行目のifに対応する}else{が58行目と60行目の2つあるな。
最後の}が2つばかし足りないな。
008577
2006/10/16(月) 04:41:22ありがとうございます。
どうしても、>>50行目のifに対応する}else{が58行目と60行目の2つあるな。
最後の}が2つばかし足りないな
これがわかりません、何とか>>77-78 のソースで
ご指摘願えないでしょうか?
今回限りで、こういう書き方は止めます。
0086デフォルトの名無しさん
2006/10/16(月) 04:42:04>79を読んでも理解できないなら、人間止めちまえ。
>警告 W8065 5-5.c 29: プロトタイプ宣言のない関数 'sacnf' の呼び出し(関数 mai
これ見てなんにも疑問に感じないのか?
>scanf("%s",filename);
>sacnf("%s",key);
こうやって並べたらどうだ?
008777
2006/10/16(月) 04:46:07それは修正してあります
エラー 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
0088デフォルトの名無しさん
2006/10/16(月) 04:51:22そんな事に気付かないなんて本物の馬鹿なんだなぁ。
0089デフォルトの名無しさん
2006/10/16(月) 08:24:24自分で { } の対を順に確認していきなよ
0090デフォルトの名無しさん
2006/10/16(月) 16:13:24ウォーリーを探せじゃないんだから。
今回みたいにエラーが出た時わかりにくいだろ?
009177
2006/10/16(月) 16:58:40自分のやってるソース自体を直したくて
コピペで片づけるのがいやだったものでして・・・
>>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の位置が違うとは、どうなればいいのでしょうか?
0092デフォルトの名無しさん
2006/10/16(月) 17:06:14struct hoge
{
/* ... */
};
void hoge()
{
const char *arr[] =
{
"foo",
"bar",
};
/* ... */
while ()
{
for ()
{
if ()
{
/* ... */
}
else
{
/* ... */
}
}
}
}
009377
2006/10/16(月) 17:13:36ご返答、ありがとうございます。
その、何故縦に揃えなければいけにかと言う理由が
わからないんです。
それは決まりなのでしょうか?それとも単に見易いか否かと言う
だけなのでしょうか?
0094デフォルトの名無しさん
2006/10/16(月) 17:20:52そういう発言は↓でしろよ。
最高にド低脳な発言してください in ム板(XIIII)
http://pc8.2ch.net/test/read.cgi/tech/1158275665/l50
009577
2006/10/16(月) 17:23:49たしかに、このようにすれば解決しますが
以下のソースのようにやると
エラー 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の位置だと誤りが出るのか等
法則的なものや理由が知りたいです。
でなければ納得ができません。
色々調べていますが、その理由が載っていません。
こら等の問題さえ解決できれば、先に進めます。
とても疑問です。
0097デフォルトの名無しさん
2006/10/16(月) 17:32:04そんな事はきにするな
以上!!!
0098デフォルトの名無しさん
2006/10/16(月) 17:35:57>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);
}
}
--
どうみてもおかしいのだが、前者ではそれが判別しにくかろ。
0100デフォルトの名無しさん
2006/10/16(月) 17:42:58while ((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);
}
}
0101デフォルトの名無しさん
2006/10/16(月) 17:52:36>たしかに、こうやって見ると見難いです。
で、どこが間違っているのかわかったのか?そのレスだとわかってないっぽいが。
つーか同じ内容が>>84にあるわけだが。見てないんだな。
0102デフォルトの名無しさん
2006/10/16(月) 17:53:28なソースの方が温かみを感じる。
>>95には是非とも、スペース、タブ、改行を禁止する方向で成長していって欲しい。
今日は5千行もプログラム書いたよ。とかより今日は5万桁プログラムを書いたよ。
とかそういう話を是非>>95にはして欲しい。
0103デフォルトの名無しさん
2006/10/16(月) 17:58:240104デフォルトの名無しさん
2006/10/16(月) 18:17:03想像してちょっと和んじゃったじゃないか
0105デフォルトの名無しさん
2006/10/16(月) 18:49:01君も同類なんだろうな…
せっかくだし>>95をハッカーの道に案内したら?
0106デフォルトの名無しさん
2006/10/16(月) 19:13:50のは俺だけか?そーいう書き方もあったのかと感じた。
参考書とかだと、そんな書き方載せてねーなw
0107デフォルトの名無しさん
2006/10/16(月) 20:14:25機械(プリティプリンタ)で整えられる形が最良
0108友達の友達の名無しさん :2006
2006/10/16(月) 20:15:56p197 演習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)
以上のお答えお願いします
0109デフォルトの名無しさん
2006/10/16(月) 20:29:000110友達の友達の名無しさん :2006
2006/10/16(月) 22:12:04mixiでも質問してなかったか?
0112デフォルトの名無しさん
2006/10/16(月) 22:27:11良いと言われたのですが如何なんでしょうか?
応用が効くし覚えて損はないという事らしいです、基礎やイメージを
つかんでおく程度で良いから、まずはCとの事です
Cと自宅サバはあんまり関係ないぞ・・・
perlとかスクリプトをおぼえとくと便利なこともあるけど、
べつに知らなくたって、運営はできるしな。
0114デフォルトの名無しさん
2006/10/16(月) 23:13:18#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));
}
0115デフォルトの名無しさん
2006/10/16(月) 23:14:16/*
* テストプログラム
*/
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;
}
0116112
2006/10/17(火) 00:13:400117デフォルトの名無しさん
2006/10/17(火) 05:55:12いまだなんのプログラムを組めばいいか分からない
でも、毎日どこかのプログラムを見ないと頭が気持ち悪い(´・ω・`)
0118デフォルトの名無しさん
2006/10/17(火) 10:50:57#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;
}
このコードコンパイルして実行するとエラーが出ます。
なぜなんでしょうか?
0119デフォルトの名無しさん
2006/10/17(火) 14:20:45そのfileopen()で得られたfpはmain()のfpとは異なる。
従って、main()のfpは不定値のままとなる。
他に戻り値もないようだし、FILE * fileopen(char * filename, char * mode);としてはどうか。
0120118
2006/10/17(火) 17:16:57レスありがとう。理解できました。
はじめ参照渡ししてるはずなのになんでだろって思ってたんだけど、
fpenによってfpに格納されてるアドレスが変わってるからだめなんだね
納得納得。ありがとうね。
0121デフォルトの名無しさん
2006/10/18(水) 00:01:340122デフォルトの名無しさん
2006/10/18(水) 00:47:00入力した文字列の中に数字文字、アルファベット大文字、小文字がそれぞれ何個あるか表示するプログラムを作りなさい。
例) AB123cdを受け取ったら数字3、大文字2、小文字2
↑の答えお願いしますm(_ _)m
0123デフォルトの名無しさん
2006/10/18(水) 00:55:460124空気めない人
2006/10/18(水) 01:02:16#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;
}
0125デフォルトの名無しさん
2006/10/18(水) 01:26:030126デフォルトの名無しさん
2006/10/19(木) 03:59:53#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を使うのがむりなのだろうか?
詳しい方教えてください。
0127デフォルトの名無しさん
2006/10/19(木) 04:32:45「内容がおかしくなる」のか?それはたぶん正常に動作しているのでは。
もともとfwrite()はテキストではなくバイナリとしてファイルに出力するから
テキストファイルとして開いてもうまく表示できない。(データの種類にもよるが)
0128デフォルトの名無しさん
2006/10/19(木) 07:00:43構造体をバイナリで保存してはいけない理由がよく分かりました。
0129デフォルトの名無しさん
2006/10/19(木) 07:21:43コンパイルオプション一つでメンバーのオフセットが
容易の変ってしまうことがひとつ。
エンディアンの違うプロセッサに持っていったら
正常に読めない(かもしれない)ことがひとつ。
わかってさえいればこの辺は回避ができるんだけど、
初心者には無理だろうね。
0130デフォルトの名無しさん
2006/10/19(木) 10:14:25ポインタメンバを持っているせいだと思うが
0131デフォルトの名無しさん
2006/10/19(木) 10:15:510132デフォルトの名無しさん
2006/10/19(木) 11:17:22エンディアンの違うCPUでうまく読めないのは構造体だろうが単純型だろうが一緒。
そのためにデータ様式の規約があるわけで。
>>130
はずれ。構造体変数の初期化に限って例外的に文字配列のコピーが認められる。
だから構造体は文字列へのポインタではなく文字列そのものを内部に保持する。
>>131
それをやるとファイル入力で苦労しそうな悪寒w
もしfscanfで読み込んでいたら、うまいことファイルを改竄すると
セキュリティホールになりかねん。
0133デフォルトの名無しさん
2006/10/19(木) 11:30:03>それをやるとファイル入力で苦労しそうな悪寒w
初心者レベルなら、fgets()+sscanf()で充分だろ。
>セキュリティホールになりかねん。
バイナリにすれば塞がるというなら兎も角、そんなところでコストを掛けるのは無駄。
もし仮に、初心者の教習ではなく実務というならこんなところで聞くわけがないし、
そうであるなら仕様は上流で確定しているはず。
それさえ決まっていないのなら、セキュリティホール云々以前の問題だ。
0134デフォルトの名無しさん
2006/10/19(木) 11:44:27fscanfと変わりないじゃん。
>バイナリにすれば塞がる
いや、そういう意味ではなく。scanf系の%sは潜在的にある種の穴を持っているからね。
それを知らないまま危険なコードを量産という状態は避けなければならない。
それにトークン解釈や変換のコストはバイナリ入力に比べて気にならない程度の物でもない。
それ以降の部分については、特に異論はないです。
0135デフォルトの名無しさん
2006/10/19(木) 11:55:02%[^\n]
0136デフォルトの名無しさん
2006/10/19(木) 12:08:26なにソレ?と思って調べてみた(と言ってもGoogleではそれをキーワードにできない)。
それ以外にも回避法はいろいろあるみたいね。
でもそういう小技を知っていて何になるの?素直にバイナリ化すればいいだけの話じゃん。
0137デフォルトの名無しさん
2006/10/19(木) 12:22:12%*[^\n]
0138デフォルトの名無しさん
2006/10/19(木) 16:04:01テキストで出力しておけば、デバッグが楽になるジャマイカ。相手は初心者なんだから。
0139デフォルトの名無しさん
2006/10/19(木) 16:39:28まあまあ「素直にバイナリ化」と言ってるんだから、
素朴な人だと察してあげましょうよ。
0140126
2006/10/19(木) 18:58:24>>127
自分が間違いだと思っていたのは、バイナリファイルをテキストファイルとして開いていたからで、
str1.iとstr1.dbに格納されていた部分が文字化けして表示されていました。
127さんのおっしゃるとおりfwrite()は正常に動作しているみたいです。
(freadで正常に取り込むことが出来ました)
自分が勘違いしていたのは、fwriteを使った場合でもテキストファイルとして開けば文字化けせずに
表示されると思っていたことです。
データの保存/読み込みのみにファイルを使う場合は、fread、fwriteで問題ないが、ファイルをテキストで
閲覧する可能性がある場合はfread、fwriteは使えないことがわかりました。ありがとうございました。
>>129
メンバーのオフセットというのは、メンバーの構造型のポインタからのバイト数っていうことでしょうか?
僕の解釈では、コンパイラごとにオフセットが変わってしまうのを、fwriteの引数の2つ目の部分で
sizeof関数を使用することで吸収していると思っていたのですが違うのでしょうか?
エンディアンという言葉は知らなかったのでググってみたら複数のバイトを処理する際の方法のことみたいですね。
上位バイトから処理するか下位バイトから処理するか。ネットワークでファイル交換する際とかに影響がでるって
書いてあったからこれは今回は関係ないのかな?
0141デフォルトの名無しさん
2006/10/19(木) 19:11:17これは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];
}
0142デフォルトの名無しさん
2006/10/19(木) 19:45:460143141
2006/10/19(木) 20:06:17よかったですか、他に前後の節と深い関わりがあるようにも見えないので
いまいち理想的と言うほどである理由が分からなかったんですが、
小さなところからコツコツやっていけということなんですかね
0144デフォルトの名無しさん
2006/10/19(木) 20:35:12> メンバーのオフセットというのは、メンバーの構造型のポインタからのバイト数っていうことでしょうか?
まあそういうことです。「構造体 パディング アラインメント」
あたりでぐぐってみるとわかると思います。
sizeof (こいつは関数じゃなくて演算子です) で取れるサイズは、
オフセットとはさほど関係はありません。
エンディアンについては、確かにネットワークでは問題になることが多いです。
が、バイナリのファイルをエンディアンの違うマシンに持っていったときにも
同様の問題が発生します。
どなたかが指摘してくださったようにこの問題は別に構造体固有の問題ではなくて、
バイナリをファイルに書いたときには問題になります。
0145デフォルトの名無しさん
2006/10/19(木) 21:20:16メリットかどうかではなくて、staticの理想的な使いどころってことだけど?
ところで、書き込むのは全部読み終わってからでも良かっただろうに。
0146デフォルトの名無しさん
2006/10/19(木) 21:22:12nameが外から参照できないってのは利点じゃないの?
0147デフォルトの名無しさん
2006/10/19(木) 23:34:57526を入力したら526th
383を入力したら383rd
811を入力したら811st
このように出力させるにはどうすればいいでしょうか?
0148デフォルトの名無しさん
2006/10/19(木) 23:46:540149デフォルトの名無しさん
2006/10/19(木) 23:47:06| ここで笑って !! |
|_________|
∧∧ ||
( ゚д゚)||
/ づΦ
0150デフォルトの名無しさん
2006/10/19(木) 23:55:35. (´・ω・`) < 383を入力したら383rd 811を入力したら811st
cく_>ycく__)
(___,,_,,___,,_) ∬
彡※※※※ミ 旦
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
\ どっ!! / \ ワハハ! /
\ / \ ∞
l|||||||||||||| ∩,,∩ ∩,,∩ ∩,,∩ ミ∩ハ∩彡
(, )(,, ) ,,)( )( )
0151デフォルトの名無しさん
2006/10/20(金) 00:22:15(擬似)バイナリ出力しかないのかな?
※ Base64エンコでテキスト化したものをファイルに書き出すのも、結局バイナリ保存していることになるし…
0152デフォルトの名無しさん
2006/10/20(金) 01:32:53Ex.
// 但し、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]);
}
0153141
2006/10/20(金) 09:02:07staticはローカル変数の中でも配列の内容を静敵領域に抑えておく使い方が理想的ってことでしょうか?
文字列定数は静敵領域に確保されると他の本で読んだので、そんなに変わらないように思えたんです
一応もうちょっと先まで進んでるんですが、未だに飲み込めない箇所で…
0154デフォルトの名無しさん
2006/10/20(金) 09:53:35の2つの意味を兼ねているけど、これを同じに考えてごっちゃにしてないか?
>>153のそれも理想的な使い方の一つ。
>>141 初期化しなくても済むってのも同じく使い方の一つ(これは
初期値が代入する規約からの副次効果に過ぎないけど、応用例ではある)。
char *ptr="abc"
char arr[]="abc"
記憶領域確保からすればまったく別物だけど、
これも曖昧ならK&R読むのはまだ早いんじゃないか?
構造体のところは辛いぞ。
0155141
2006/10/20(金) 10:15:06あ、すみませんnameがポインタの配列だってことを忘れていました…
>>141だと文字列長がバラバラで配列で定義すると冗長な部分が出来るから
それぞれへのポインタを配列に格納した方がよくて、その領域を留めるためのstatic、ということですか
0156デフォルトの名無しさん
2006/10/20(金) 11:59:20文字列長とか配列定義とかは、staticと関係ないな。
K&RはCの理解が曖昧だと難しいから、
それよりも初心者本を読み返すのがいいだろう。
もしくは、C FAQでstatic, array, pointer の違いを理解してみろ。
考えるのは、それからでも遅くはないだろう。
0157デフォルトの名無しさん
2006/10/20(金) 12:29:38#どうせ
0158デフォルトの名無しさん
2006/10/20(金) 12:33:37>157の最後の行をもう一度。
#どうせ、長くなることもないし。
0159デフォルトの名無しさん
2006/10/20(金) 12:43:44メモリ効率って何のこと?
知ったかぶりじゃないよね。
0161デフォルトの名無しさん
2006/10/20(金) 15:17:000162157-158
2006/10/20(金) 15:38:19単純にポインタの配列だとポインタの分だけ余計にメモリを食うという話。
どっちみち、文字列分のメモリは消費するのだから。
長さが変わる(この場合より長くなる)場合は、隙間ができるから微妙になるけど。
0163デフォルトの名無しさん
2006/10/20(金) 18:06:180164デフォルトの名無しさん
2006/10/21(土) 20:31:48ようするに書き出しとかでできた、ファイル(aaa.c→aaa.c_)
これで "_" と言うのが付いたファイルができました
参考書に依ると開いて確認しましょうとなっているのですが
開けません・・・・
0165デフォルトの名無しさん
2006/10/21(土) 20:57:510166デフォルトの名無しさん
2006/10/21(土) 21:05:27ありがとうございます、
自分で直せばいいのですね!!!
0167デフォルトの名無しさん
2006/10/21(土) 22:45:150168デフォルトの名無しさん
2006/10/21(土) 23:16:07このスレができる前から、「入門以前」の書き込みは
しばしば見られたからなぁww
「C言語なら俺に聞け(エディタすら使えない人篇)」とか作るか?
もはやC言語でもなんでもないが・・・
0169デフォルトの名無しさん
2006/10/22(日) 03:16:360170デフォルトの名無しさん
2006/10/22(日) 09:41:39ム板にどれくらいエスパーがいるのか知らんが
0171デフォルトの名無しさん
2006/10/22(日) 10:34:34最初に打者8人分の名前を入力して置いて、
それから燃えよドラゴンズの歌詞につなげたい。
例:
荒木、井端、立浪・・・・(以下略)と入力すると、
表示される内容:
1番荒木が塁に出て
2番井端がヒットエンドラン
3番立浪タイムリー
・・・・(以下略)
このような場合はstrcatを使うべきか・・・・
それとも普通のニ次元配列で・・
0172デフォルトの名無しさん
2006/10/22(日) 11:03:18正直、そういうのはスクリプト言語でやるのが手っ取り早い。
つーか、そこでstrcat()云々なんて言い出すようじゃ、到底無理。
0173デフォルトの名無しさん
2006/10/22(日) 13:37:12スレタイ読め
>>171
それだけじゃどっちでもいいとしか言いようが無い
0174デフォルトの名無しさん
2006/10/22(日) 13:56:17スレタイくらい承知の上で敢えて、「無理」と言っている。
現にあんただって(質問が悪すぎて)まともに回答できないじゃないか。
0175デフォルトの名無しさん
2006/10/22(日) 13:57:380176デフォルトの名無しさん
2006/10/22(日) 14:00:480178デフォルトの名無しさん
2006/10/22(日) 18:27:14printf( "1番%sが塁に出て", name[0] );
これの繰り返しで良いんじゃないか?
0179デフォルトの名無しさん
2006/10/23(月) 00:11:42これの繰り返しで良いんじゃないか?
0180デフォルトの名無しさん
2006/10/23(月) 00:16:262番以降は塁にでるって文章じゃねえ
0181デフォルトの名無しさん
2006/10/23(月) 00:56:170182デフォルトの名無しさん
2006/10/23(月) 01:25:040183デフォルトの名無しさん
2006/10/23(月) 01:48:120184デフォルトの名無しさん
2006/10/23(月) 04:20:09printf("一番 %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] );
0185デフォルトの名無しさん
2006/10/23(月) 07:01:23"二番 %sが送りバント"
"三番 %sタイムリー"
"四番 %sホームラン"
"五番 %sがクリーンヒット"
"六番 %sが流し打ち"
"七番 %sヒットエンドラン"
"八番 %sがスクイズバント",
name[0], name[1], name[2], name[3], name[4], name[5], name[6], name[7]);
0186デフォルトの名無しさん
2006/10/23(月) 07:32:400187デフォルトの名無しさん
2006/10/23(月) 07:34:480188デフォルトの名無しさん
2006/10/23(月) 08:53:29#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;
}
0189デフォルトの名無しさん
2006/10/23(月) 14:38:090190デフォルトの名無しさん
2006/10/23(月) 20:55:35出力したのに中身は変わっていませんがいいのですかね?
0191デフォルトの名無しさん
2006/10/23(月) 21:54:31日本語でおk
0192190
2006/10/23(月) 22:50:39そうなんでしょうか?
0193デフォルトの名無しさん
2006/10/23(月) 23:04:07大まかにいうとプログラムから出てきたのが出力ファイル。
.xxx(拡張子)が付いてようがいまいが、ファイルには違いない。
0194192
2006/10/23(月) 23:11:32入門書を読んでも出力ファイルは何に使うのか?理解しがたいです
単なるコピー?なんですかね。入門書に依れば移動するファイルとの
事です。
0195デフォルトの名無しさん
2006/10/23(月) 23:37:56マジ?
0196デフォルトの名無しさん
2006/10/23(月) 23:40:49いいえと答える
0197デフォルトの名無しさん
2006/10/23(月) 23:43:070198デフォルトの名無しさん
2006/10/23(月) 23:49:06プログラムを FAX に例えよう。
ファイルというのは紙のことだ。
出力ファイルというのは、FAX から送信されて出てきた紙のことだ。
つまり、貴方の質問はこういうことになる。
「家のFAXから紙が出てきました。これは何に使うんですか?」
こちらとしては、どこから届いたのか、紙に何が書かれているか、すらわからないのに答えられるわけが無い。
0199デフォルトの名無しさん
2006/10/23(月) 23:51:03必須ではないが知識があればすんなりと理解できるところがある。
知識がないと苦労ことがあるらしい。
0200デフォルトの名無しさん
2006/10/23(月) 23:58:03言語仕様がオブジェクト指向プログラミングをするためにできていないというだけで、できないわけではない。
0201デフォルトの名無しさん
2006/10/24(火) 01:04:22プログラム内でchar型の変数にint型の変数を代入させるにはどうしたらいいのでしょうか
(char)hennsuu1.[data ] = (int)value;
strcpyを使ってhennsuu1に値を入れることはできるのですが
int型の変数を入れることが何故かできないのです。。。
どなたか教えてください
0202デフォルトの名無しさん
2006/10/24(火) 01:07:58int b;
a=b;
0203デフォルトの名無しさん
2006/10/24(火) 01:09:100204デフォルトの名無しさん
2006/10/24(火) 03:32:030205デフォルトの名無しさん
2006/10/24(火) 07:00:08`ヽ、"''ー、._ _,、-‐'" ̄/
\ ~''ー--、__ ,,、-―''"~"~ /
ヽ、 , ヾ'ヽ、__ ./'i~ ̄ ./
\ |! 丶、\"ーェ''7 / / _..,,ノ
`ヽ|`ー-、___"''ゝー<''~ ,,、-'"~i-ー''"~
,,.-‐''""""'''ー-.、
,ィ" \
/ `、
,i ,-っ hennsuu i
/⌒ヽ'_ー-/ _).ィ‐‐-,,_ __|
| r,i \\//-l;l : : : `l-r'"メ、
ヾ、 \/ `ー‐'": i!_,l_ノ` まだまだだな
| ,:(,..、 ;:|/.
| ,,,..;:;:;:;,/
\ `::;;. '"`ニ二ソ\_二つ
\ ゙゙:`-、;:;:;;;:;:;:;;/
/ /~\ \
/ / > )
/ ノ / /
/ / . / ./
/ ./ ( ヽ、
( _) \__つ
0206デフォルトの名無しさん
2006/10/24(火) 08:08:400207デフォルトの名無しさん
2006/10/24(火) 08:31:48atoiアトイ?fabsファブス?とかw
0208デフォルトの名無しさん
2006/10/24(火) 09:23:190209デフォルトの名無しさん
2006/10/24(火) 12:34:36この場合、&pt[n](nは任意の整数0<300な)ってどういう意味だっけ?
0210デフォルトの名無しさん
2006/10/24(火) 12:42:490211デフォルトの名無しさん
2006/10/24(火) 13:56:020212デフォルトの名無しさん
2006/10/24(火) 14:56:32単純化したものを作ってみたのですが、それでも失敗してしまいました。
何が間違ってるのかご指導をお願いします。
/*********/
/* main.c */
/*********/
#include "myhead.h"
int main(void){
func();
x = x+1;
printf("%d\n",x);
return 0;
}
/*********/
/* func.c */
/*********/
#include "myhead.h"
void func(void){
x = 1;
}
改行が多いと怒られたので次へつづく
0213212の続き
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 の両方に定義されている
となってしまいます。
よろしくお願いします。
0214デフォルトの名無しさん
2006/10/24(火) 15:12:282 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
/***************/
・
・
・
といったように生成していきたいのですが、
何かよい方法はありますでしょうか?
0215デフォルトの名無しさん
2006/10/24(火) 15:19:03>bcc32 main.c func.c
ってやったときにmain.cでMYHEAD_INCLUDEDが#defineされるから、
次のfunc.cでは#elseが有効になると思ってる?
残念ながらならないよ。
プリプロセッサはそれぞれの.cファイルで独立して起動されるから、
どっちもMYHEAD_INCLUDEDが#defineされてない状態で起動される。
0216212
2006/10/24(火) 17:07:05レスありがとうございます。
…という事は、私が望む動作は
・ヘッダファイルでは extern int x;
・main.cかfunc.cにグローバル変数として int x;
とするしかない(ほかにあったとしても回りくどい方法だけ)
という認識でOKでしょうか?
0217デフォルトの名無しさん
2006/10/24(火) 18:08:45あるいは
/*********/
/* main.c */
/*********/
#define MYHEAD_INCLUDED /* 追加。名前はもっといいの考えて */
#include "myhead.h"
のようにすればよい。名前にINCLUDEDなんてついていたら
わけがわからんので、その辺は適当に。
0218デフォルトの名無しさん
2006/10/24(火) 18:10:41myhead.hの#ifndefを#ifdefにした方がいいね。
これでmain.cでのみ確実にxが定義されて、
他では宣言になる。
0219デフォルトの名無しさん
2006/10/24(火) 18:14:220220デフォルトの名無しさん
2006/10/25(水) 05:36:340221デフォルトの名無しさん
2006/10/25(水) 13:00:19char* p = s;
�@
p + 100;
�A
p += 100;
�B
p += 100;
*p;
どの時点で未定義ですか?
それともすべて未定義?
0222221
2006/10/25(水) 13:00:50無視してください
0223デフォルトの名無しさん
2006/10/25(水) 20:15:090224デフォルトの名無しさん
2006/10/25(水) 20:35:13A^A→0
になるのは何がすごいのでしょうか・・・
何かこれに感激しないといけないらしいのですが^^;
0225デフォルトの名無しさん
2006/10/25(水) 20:45:420226デフォルトの名無しさん
2006/10/25(水) 20:48:100227デフォルトの名無しさん
2006/10/25(水) 22:52:000228デフォルトの名無しさん
2006/10/25(水) 23:16:33助言、お願い致します。
char str[] = "Hello!" と char key[128] = "abc"
一見、同じ意味に見えてしまうのですが、何が違うのでしょうか?
char keyだと一列が一個だけ、このように"abc"
char strだと一列を複数入れられるのでしょうか?char str[] = {"abc","def","ghi"}
なのでしょうか?
0229デフォルトの名無しさん
2006/10/25(水) 23:22:17と書くと
char str[7] = "Hello!"
とコンパイラが判断してくれる
それだけ
0230デフォルトの名無しさん
2006/10/25(水) 23:27:50??? 何か違うのでしょうか?
0231デフォルトの名無しさん
2006/10/25(水) 23:29:300232デフォルトの名無しさん
2006/10/25(水) 23:31:46とう言うと同じなのでしょうか?
混乱してしまいます。
char keyだと一列が一個だけ、このように"abc"
char strだと一列を複数入れられるのでしょうか?char str[] = {"abc","def","ghi"}
の差ではないのでしょうか?
0233デフォルトの名無しさん
2006/10/25(水) 23:39:12↑
コンパイル通らんよ
char* str[] = {"abc","def","ghi"}
と勘違いしてない?
0234デフォルトの名無しさん
2006/10/25(水) 23:41:26前者は H e l l o ! ヌル の7文字分確保される。
後者は128文字分確保した上で、先頭から a b c ヌル の4文字が入れられる。
それだけのこと。
>>232のような差ではない。
0235デフォルトの名無しさん
2006/10/25(水) 23:45:48→ 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'};
0236232
2006/10/25(水) 23:48:03一旦、整理してから出直してきます。
ありがとうございました。
0237232
2006/10/25(水) 23:54:15そのようでした、では char str[] = {"abc","def","ghi"} いう形は
存在しないんですね
>>234
そうですか、わかりました。
>>235
となると、>>234で書かれた事と同じ、[]内の確保数の
問題で意味は同じと考えて宜しいんですね?
0238デフォルトの名無しさん
2006/10/26(木) 00:11:24関連研究9枚でいいですか?
0239デフォルトの名無しさん
2006/10/26(木) 00:18:16BCB5ラーニング使用してるんですが
Windows XP標準の圧縮(ZIP)ありますよね
プログラム側から制御する方法ってありますか?
0240デフォルトの名無しさん
2006/10/26(木) 00:26:08シェルフォルダとして扱えるらしい。
http://forums.belution.com/ja/vc/000/368/03s.shtml
#importがBCBでも使えるかどうかは知らないが。
0241デフォルトの名無しさん
2006/10/26(木) 00:38:32おおおおっ!!
ありがとうございます
がんばってみます
お世話になりました
0242デフォルトの名無しさん
2006/10/26(木) 13:22:20教授からもらったプログラムがコンパイルできません。学校ではエラーが出ますが、一応コンパイルは通りました。
家だとコンパイルさえ通りません。環境はBCC developer です。
コレをお願いします
0243デフォルトの名無しさん
2006/10/26(木) 14:06:28学校の環境と自宅の環境は一緒なの?
うちはBCC developer じゃないんだけど
ちなみに関数内の関数宣言は通らないので
外に出したらコンパイル通ったよ
0244デフォルトの名無しさん
2006/10/26(木) 14:21:22学校の環境と自宅の環境は違います。学校のはよくわかりません。
関数を外にだしても動作は変わりませんか?
0245デフォルトの名無しさん
2006/10/26(木) 14:31:35関数 bfs が 関数 breadth_first のデータにアクセスしてるから
それを解決すればおk
俺は bfs の引数に
int *parent, int *blabel, int *queue を追加した
あと出来るならテストデータも示してみて欲しい
正常な動作か判断できないので
コンパイラによっては関数内の関数宣言を許してないからそれが原因かもね
(俺の場合むしろ逆で関数内で関数宣言するコンパイラを知らない)
0246デフォルトの名無しさん
2006/10/26(木) 14:40:09ファイルアップしていただけませんか?
0247デフォルトの名無しさん
2006/10/26(木) 14:53:16アップローだ初めて使ったよぉ
http://sa-wiki.com/upload/src/up0052.txt
こんな感じになった
あくまで処理内容まで理解していないから
そちらの環境で正常動作するかは不明だよ
0248デフォルトの名無しさん
2006/10/26(木) 15:08:08入力データはこんな感じなんですが、
アップして貰ったので実行するとバグってしまいます・・・・
教授がうざい・・・・
0249デフォルトの名無しさん
2006/10/26(木) 15:17:51今デバッグ中・・・ちょっと待ってて
0250デフォルトの名無しさん
2006/10/26(木) 15:50:30ゴメンね
デバッグやったらいくつかミスってた
テスト結果はアップしたテキストにあります
結果はあってますか?確認してください
http://sa-wiki.com/upload/src/up0053.txt
変更点
bfs関数の引数に int *k を追加しました
0251デフォルトの名無しさん
2006/10/26(木) 15:52:58ごめん
main(void) の scanf("%d", &directed); は消してね
俺の環境だとウィンドウすぐに閉じちゃうから入れといただけ
意味は無いから
0252デフォルトの名無しさん
2006/10/26(木) 15:53:03合ってます!まじでありがとうございます。
元のプログラムはプログラムとしてダメだってことですよね?
0253デフォルトの名無しさん
2006/10/26(木) 15:59:25プログラムとしてって考えると微妙だな
どちらともいえない
まぁ自分だけの環境ならいいけど
いろいろな環境でコンパイルされるコードを考えるなら
関数内に関数宣言入れたのはどうかと思う
ましてや教授って大学でしょ?ならコンパイラに依存する処理はするべきじゃないと思うよ
とはいえ関数を外に出しただけだからアルゴリズムはあってるって事
0254デフォルトの名無しさん
2006/10/26(木) 16:00:21fgetsで文字列を無制限に取る場合はどうしたら良いですか?
よろしくお願いします。
0255デフォルトの名無しさん
2006/10/26(木) 16:04:10大学の教授ですよ・・・
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2823.txt
実はコレも同じような書き方されててさっきのを参考に直そうとしたんですが、うまくなおせません・・・・
0256デフォルトの名無しさん
2006/10/26(木) 16:16:140257デフォルトの名無しさん
2006/10/26(木) 16:21:41今のは深さ優先探索を行うものです!
すいません
0258デフォルトの名無しさん
2006/10/26(木) 16:25:45最初のソースなんだけど 最初の
bfs( v , parent , blabel , queue , &rear , &k );
の呼び出し削除してください
よく見たら要らないものだった
http://sa-wiki.com/upload/src/up0054.txt
で次のソースもアップします
http://sa-wiki.com/upload/src/up0055.txt
こちらも基本は同じです
関数を外に出すだけです
実行チェックしてみてください
0259デフォルトの名無しさん
2006/10/26(木) 16:30:29正しく動作しました。何のプログラムかも述べないのに、対応してくださって、感謝します
0260デフォルトの名無しさん
2006/10/26(木) 16:32:19先ほどのテストデータ入力した結果です
あってますかね?
http://sa-wiki.com/upload/src/up0056.jpg
>先ほどのは入力グラフに対して幅優先探索
>今のは深さ優先探索を行うものです!
そうだったんだ
何のプログラムかなぁとは思ってたんだけど
0261デフォルトの名無しさん
2006/10/26(木) 16:37:420262デフォルトの名無しさん
2006/10/26(木) 16:38:25画像まで丁寧にどうも。本当に助かりました
0263デフォルトの名無しさん
2006/10/26(木) 16:45:190からnまでの各項についてその項以降の最大値と交換
みたいな感じであってる?
0264デフォルトの名無しさん
2006/10/26(木) 16:54:26俺は勉強中でやっと初心者と呼んでもいいレベルかな?ってくらいの人間なんだけど、
教授クラスだったら「void main()」の部分はどうあるべきなの?
正常か異常かステータスくらいは返すべきって?
引数をとらないんだったらmain(void)って書くべきって?
それとももっと深い?
0265デフォルトの名無しさん
2006/10/26(木) 17:08:01どういたしまして
>>263
比較回数は (n-1)!回
配列 + 変数 n + for分のネストで2つ
計算量で言えば
基本交換法,基本選択法,基本挿入法 N(N-1)/2 回
クイックソート,マージソート,ヒープソートが N log? N 回 ←こっちのほうが早い
変数 oppai と oppai2 の剰余算結果を10進数で出力するとき
printf("%d %% %d = %d",oppai,oppai2,oppai%oppai2); /*改行略*/
右の変数のところは oppai%%oppai2 にしなくていいんですよね
0267デフォルトの名無しさん
2006/10/26(木) 17:17:43必要ない
ありがとう
0269デフォルトの名無しさん
2006/10/26(木) 17:37:43>>264
ANSI Cでmainはintを返すと規定されてる、ただそれだけ
0271デフォルトの名無しさん
2006/10/26(木) 19:04:560272デフォルトの名無しさん
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
0273デフォルトの名無しさん
2006/10/26(木) 19:24:45ポインタではなく、配列を使え。
ついでに言うとgetsでは無く、fgets使え。
0274272
2006/10/26(木) 19:39:52ありがとうございます。何とか理解できました!しかし、また疑問が出てしまいました。。。
今度は次のプログラムを作ったのですがうまく、構造体の中のポインタにアドレスが
入ってくれないみたいで出力結果が(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()は使えないのでしょうか?
0275デフォルトの名無しさん
2006/10/26(木) 19:45:480276デフォルトの名無しさん
2006/10/26(木) 20:01:25ポインタではなく、配列を使え。
ついでに言うと配列ではなく、malloc使え。
0277デフォルトの名無しさん
2006/10/26(木) 20:04:470278デフォルトの名無しさん
2006/10/26(木) 20:04:51君さ、不動産屋でアパートを下見に行くとき住所も地図も書いてない紙を渡されたとして、
何の疑問も持たずその紙を頼りに下見に行こうとするかね。どこに行けばいいか混乱するか、
不動産屋に文句を言うだろう。
ポインタは住所を書く紙に当たっていて、初期化のしてないポインタは
まだ住所が書かれてない紙切れにすぎない。
ポインタはどっかの場所を指し示すものだ。だが、初期化してないポインタは
どこを指しているかわからない。
どこを指しているかもわからないところを指定して氏名を入力させたら混乱が起きる。
それはたとえば風呂場と書いてあるラベルが道路の真ん中にあって、
そこで服を脱いで湯船に浸かろうとする行為と似ている。
ちゃんと風呂場の場所をおしえてやらないといかんぞ。
0279デフォルトの名無しさん
2006/10/26(木) 20:07:54あとは、実体(配列の先頭 or 変数の & 付き) を求めている
と考えたほうが始めのうちは楽ちん。
0280デフォルトの名無しさん
2006/10/26(木) 20:21:42せめてこうだな
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);
0281デフォルトの名無しさん
2006/10/26(木) 20:22:57ポインタを渡す関数で初期化してないポインタなんか渡されても、
何にもしようがないと思うぞ。
0283デフォルトの名無しさん
2006/10/26(木) 20:33:38まぁね。
FILE* 系をポインタと認識しない考え方でも良いんじゃないか? ってところで…
fp を剥がす(実体参照する)ことはない
オブジェクト指向してる
で、ちょっと特異な部類じゃね?
# FILE f; fopen(&f, <name>, <mode>); ってなってたら、どうだったのだろうか・・・
0284デフォルトの名無しさん
2006/10/26(木) 21:25:23int型の配列をクイックソートするプログラムなのですが、NUMの数を増やすと
(100位にすると)ものすごい時間がかかってしまいます。
どこがおかしいのかわかる方教えてください。お願いします。
0285272
2006/10/26(木) 21:26:47何とか分かりました…どこも指してないポインタをfgets()に
渡したところでどこに文字列を入れていいか分からないってことですね…
char ch[5];としたときの ch と
char *ch;としたときの ch の違いをよく考えれば
分かることでしたね…お手数をおかけしました。
本当にありがとうございます!
0286デフォルトの名無しさん
2006/10/26(木) 22:24:28今、調べてるんだけどさ
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回前後なのに
↑この処理に問題ありそう
もう少し調べてみる
0287デフォルトの名無しさん
2006/10/26(木) 22:37:020288284
2006/10/26(木) 22:46:33レス&色々とお調べいただいてありがとうございます。
自分なりにない知恵を振り絞り考えてみたのですが、
>>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);
}
色々とお騒がせして申し訳ありませんでした。
色々と試していただいた方本当にありがとうございます。
以降こういうことが内容精進します。
0289デフォルトの名無しさん
2006/10/26(木) 22:48:14nと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
0290デフォルトの名無しさん
2006/10/26(木) 22:50:10最終的にsort される?
0292デフォルトの名無しさん
2006/10/26(木) 23:17:24あ。 ごめん s++ e-- と読み間違えた orz
0294デフォルトの名無しさん
2006/10/26(木) 23:25:37これでいいのかな
#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;
}
0295どんずまり
2006/10/26(木) 23:28:16出力するプログラムを作ったのですが、どうやってもファイルの作成者の名前が出せません、stat関数で最終更新日や
曜日などは出来たのですが、もうわかりません。
0296デフォルトの名無しさん
2006/10/26(木) 23:31:58よくわからんけど、ls -lしたときに出てくるログイン名のこと?
0297どんずまり
2006/10/26(木) 23:44:060298どんずまり
2006/10/26(木) 23:45:110299デフォルトの名無しさん
2006/10/26(木) 23:47:21}else{
}
i == 0のとき関数f()は実行されるの?
0300デフォルトの名無しさん
2006/10/26(木) 23:47:510301どんずまり
2006/10/27(金) 00:12:30実行したモジュールがなんやらかんやら・・・
ってわかりますか?
0302デフォルトの名無しさん
2006/10/27(金) 00:22:03int num[10] = {34, 19, 44, 57, 79, 88, 12, 33, 11, 20};の
合計を求めるにはどうすればよいのでしょうか?
0303デフォルトの名無しさん
2006/10/27(金) 00:22:10環境がわからないと誰も答えられないと思います
Linuxなら
stat関数でファイルのstat構造体を取得する
stat構造体のst_uidからgetpwuid関数でpasswd構造体のポインタを取得する
passwd構造体のpw_nameがファイル作成者のユーザ名
0304デフォルトの名無しさん
2006/10/27(金) 00:24:21その関数sumは与えられてるの?
0305どんずまり
2006/10/27(金) 00:31:00ユーザー名がでませんか?
0306303
2006/10/27(金) 00:42:19出るはずですけど、出ませんか?
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がユーザー名 */
0307デフォルトの名無しさん
2006/10/27(金) 00:56:25多分与えられてないと思います。
0308どんずまり
2006/10/27(金) 01:03:50Linuxです、Viエディタを使っています。
私も今さっきまでgoogleで調べていましたが多分303さんのやり方で出来ると思います、
自分の家に環境が整っていませんので明日試してみます。
これで今夜は安心して布団に入れます。
どうもありがとう御座いました。
0309デフォルトの名無しさん
2006/10/27(金) 01:18:270310デフォルトの名無しさん
2006/10/27(金) 05:05:45#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;}
}
0311デフォルトの名無しさん
2006/10/27(金) 05:06:40printf("暗号文字列 \"%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 ***
と表示されてしまいます、何処が違うのか、ご指摘お願い致します。
0312デフォルトの名無しさん
2006/10/27(金) 05:28:067行目、=の前のセミコロンを取れ
35行目、括弧が全角
36行目、pritnf (綴り間違ってる)
てか、質問する前にエラーメッセージが出ている行を目を皿のようにして見るべし。
0313デフォルトの名無しさん
2006/10/27(金) 05:28:46popenに関して以下のようなエラーが出ます。
解決法がわかる方よろしくお願いします。
以下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 )
0314デフォルトの名無しさん
2006/10/27(金) 05:31:21Cpad for Borlandって処理系はよくしらんのだが、
popenて関数はライブラリにあるのか?
これは規格にある標準関数じゃないぞ。
unix方面でよく使われている関数だ。
0315デフォルトの名無しさん
2006/10/27(金) 05:43:07ごめんなさい、見てもきづきませんでした(;_;)
ありがとうごさいました、これで先に勧めます
0316デフォルトの名無しさん
2006/10/27(金) 05:49:04_popen(), _pclose()じゃない?
0317デフォルトの名無しさん
2006/10/27(金) 07:33:06それはMSの環境でPOSIX由来の関数の先頭には_がつく例のアレではないかと思われ。
0318デフォルトの名無しさん
2006/10/27(金) 10:40:19これどういう意味ですか?
VALUE rb_data_object_alloc _((VALUE, void*, \
RUBY_DATA_FUNC, RUBY_DATA_FUNC));
これもわかりません。
ちなみに、VALUEはunsighned longです。
0319デフォルトの名無しさん
2006/10/27(金) 14:57:220320デフォルトの名無しさん
2006/10/27(金) 19:57:33>>294これじゃダメなのか?
(別の人だったらスマソ)
0321デフォルトの名無しさん
2006/10/27(金) 23:00:08参考書とかありますか?友達は「やさしいC」というのを買ったらしい
のですが、正直迷ってます。
0322デフォルトの名無しさん
2006/10/27(金) 23:13:090323デフォルトの名無しさん
2006/10/27(金) 23:14:33言語の勉強も大事だけど・・・
アドレスとか数値や文字の表現方法とかOSとかの
コンピュータの動作原理を勉強するとC言語もよくわかる
0324デフォルトの名無しさん
2006/10/27(金) 23:17:08ひとつだけじゃなくていくつか読んだほうがいい
参考書とかって書く人によって考え方や捕らえ方が違うから
0325デフォルトの名無しさん
2006/10/27(金) 23:19:16よく理解してないのに聞きながら課題とか無理矢理終わらせてて
そろそろ限界かなと思うので
0326デフォルトの名無しさん
2006/10/27(金) 23:37:13すみません言葉足らずで、
キーボードから数値を入力をしないで直接合計を求めたいのです。
0327デフォルトの名無しさん
2006/10/27(金) 23:43:39勉強するならネットより本を読んだほうがいい
0328デフォルトの名無しさん
2006/10/27(金) 23:53:22これでどう?
#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;
}
0329デフォルトの名無しさん
2006/10/28(土) 00:05:380330328
2006/10/28(土) 00:10:20あっ引数が逆だ
しかも不要なコードが多かった
#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;
}
0331デフォルトの名無しさん
2006/10/28(土) 00:12:18ネット−>調べる
本−>勉強する
ネットはある程度基礎知識のある人が広く浅くいろいろな知識を得るのにはよい
基礎知識を学ぶならC関連の書籍を読むのがよい
0332デフォルトの名無しさん
2006/10/28(土) 00:25:24本には期待が強いけど、結局ゴミとなる本が多い・・
ネットはたまに良いのがあるが・・
0333デフォルトの名無しさん
2006/10/28(土) 00:30:27Cもそのひとつだし。
最近は教えることもないので入門書の類は立ち読みさえしてないんだけど、
なんかいいのありますかいね。
0334デフォルトの名無しさん
2006/10/28(土) 01:03:46いや、マジでオススメっすよ。
0335デフォルトの名無しさん
2006/10/28(土) 01:15:520336デフォルトの名無しさん
2006/10/28(土) 01:23:42役に立たんと言うつもりは毛頭ないが、明らかに古いプロトタイプ宣言の作法とか、
正直時代に即してるとは言いがたいかと思われ。
そもそも入門向きでもないしな。
0337デフォルトの名無しさん
2006/10/28(土) 01:30:15>>325 学生なら図書館あさってみたら?
ゴミ本つかむかもしれないけど、それも勉強のうちw
0338デフォルトの名無しさん
2006/10/28(土) 01:32:39夜遅くにわざわざありがとうございました。
0339デフォルトの名無しさん
2006/10/28(土) 05:52:04難しいです。
0340デフォルトの名無しさん
2006/10/28(土) 06:44:45ありがとう。でもそれ知ってたw
>>335
K&Rはもう要らないんじゃないかと思う。現代版として改訂したらわからないけど。
以前はK&Rくらいしかまともな本がなかったからみんなこれで勉強したけど。
今では比較的まともな本の部類にしかならないんじゃないかと思う。
他にあったのは三田本くらいかw こいつは本当に害毒だったw
0341デフォルトの名無しさん
2006/10/28(土) 06:54:58どんな言語(自然言語でもプログラミング言語でも)読み書きするのが基本。
たくさん読んでたくさん書く。
入門書をざっと読んであたりをつけたら、既存のソースを読みまくって、
改造しまくるのが勉強になるんじゃないかな。
ただいい入門書というのがなかなかお目にかかれないんだけれども。
Cで言えることはメモリのイメージを常に頭に置いてプログラムすることかなあ。
多分言語仕様とかその辺はすぐにマスターできると思うんだ。
forとかwhileとか関数とかその辺はあんまり難しくないでしょ?
実際のビットパターンまではイメージしなくてもいいけど、
変数がどこに存在するかとか、ポインタが指している先は何かとか、
その辺具体的なメモリのイメージを常に意識するのが上達のコツみたいな気がする。
あくまで気がする程度w けどCでプログラム組んでいるときに意識するのは常にここだ。
0342デフォルトの名無しさん
2006/10/28(土) 07:54:28RUBY_DATA_FUNCはvoid*を引数にとり、返り値がvoidの
関数へのポインタ。
0343デフォルトの名無しさん
2006/10/28(土) 08:29:02サンプルソースがたくさん置いてあって、
見て勉強になるようなサイトは無いでしょうか?
入門書はほぼマスターして、コンソロールゲームくらいは作れますが、
それ以上には、なかなか抜け出せなくて、手詰まり状態です。
0344デフォルトの名無しさん
2006/10/28(土) 08:53:36Gnuの適当なツールのソースでも眺めてみたら?
Unix系のフリーのソフトは多くがソースを簡単に入手できるから、その気になれば宝の山だ。
#玉石混交という話もなくはないが。
リストとかハッシュとかソートとか、アルゴリズムの基本的なところは勉強した?
まだなら、それ方面の本とかサイトとか読んでみたら?
0346デフォルトの名無しさん
2006/10/28(土) 09:50:38最適化:-O3(-O4?) -Os -march=i686
以外に何か無いでしょうか
0347デフォルトの名無しさん
2006/10/28(土) 09:53:120348デフォルトの名無しさん
2006/10/28(土) 10:11:540349デフォルトの名無しさん
2006/10/28(土) 10:25:46まず、どこに時間がかかっているか調べろ。
それが判明したらそこを重点的に高速化する。
アルゴリズムを速いものに変えたり、その処理をなるべく使わないようにしたり、
腕に自信があればアセンブラで書いたりするなど。
0350デフォルトの名無しさん
2006/10/28(土) 11:41:09二分探索木のデータの追加とデータの表示を行うプログラムです。
なぜかはじめのメニューを表示した後3.のプログラムを終了以外を選択すると
エラーが出ます。が、原因がさっぱりわかりません。
詳しい方教えてください。よろしくお願いします。
0351デフォルトの名無しさん
2006/10/28(土) 11:44:39難しいのは応用であり、ポインタなんかも理論は簡単
主に使うのは参照渡しくらいで、*つければいいんだろ?程度で十分
あとは本で完全理解しようとせず、実際に書きながら覚えるしかない
一通り理解したら、一気にwindowsアプリに走れ。HSPと同じでグラフィカルだと楽しい。オブジェクト指向は書いてれば身につく
0352デフォルトの名無しさん
2006/10/28(土) 12:03:46オブジェクト指向とか構造化とか、書いてれば自然に身に付くってもんじゃないよな。
0354デフォルトの名無しさん
2006/10/28(土) 12:21:32たしかに構造化は自然には身につかないが、身につかないわけではないな
0355デフォルトの名無しさん
2006/10/28(土) 12:33:00しかし、全く OOP を知らない奴が独自に C 上の OOP を再発明できたとしたら
そいつはたぶん Stroustrup になれる
構造化言語使っていても、構造化プログラミングできてないやついっぱいいる。
0357デフォルトの名無しさん
2006/10/28(土) 13:36:2438行目のscanf()のフォーマット指定が間違っているから。
ついでに言えば、文字を扱う場合以外にcharは使わないほうがいい。
0358デフォルトの名無しさん
2006/10/28(土) 17:26:53mp4file_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)
0359デフォルトの名無しさん
2006/10/28(土) 18:01:22VAR_TO_FPOSマクロじゃなくて、FPOS_TO_VARマクロの定義を張ってみてくれ。
0360358
2006/10/28(土) 18:30:56#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でも全く同様のエラーが発生します。
0361デフォルトの名無しさん
2006/10/28(土) 19:03:20どうすればいいのでしょうか?
0362デフォルトの名無しさん
2006/10/28(土) 20:35:19setlocale("C");
0363デフォルトの名無しさん
2006/10/28(土) 22:01:313次元の配列を動的変数として宣言するにはどうしたらいいでしょうか?
0364デフォルトの名無しさん
2006/10/28(土) 22:48:07普通に
a[10][10][10]だとして
int *a;
a=malloc(10*10*10);
・・・
free(a);
ではダメ?
0365デフォルトの名無しさん
2006/10/28(土) 23:14:54ネットで拾ったBMPファイルを読み込んでピクセルのRGBの値を参照するための関数が
Windowsでは使えていたのですがUNIXでは使えませんでした。
調べてみたところおそらくendianの違いなのではと考えました。
UNIXで使えるように修正するためには、
unsigned long hoge;
fread(&hoge, sizeof(unsigned long), 1, fp); // fpはファイルポインタ
この部分で hoge に格納されたバイトを逆順にする必要があると思うのですが
どうすれば良いでしょうか?
よろしくお願いします。
0366デフォルトの名無しさん
2006/10/28(土) 23:40:31'void *' 型は 'int *' 型に変換できない(関数 main() )
こういったエラーがでてしまうんですが・・。
0367365
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);
}
}
という感じでいけるみたいです。
0368側近中の側近 ◆0351148456
2006/10/28(土) 23:49:45(っ´▽`)っ
私も考えていたけど、それでいけると思う。
あと、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));
は使えないから要注意や☆
0370364
2006/10/29(日) 00:01:40あっごめん
今アク禁で携帯からで
int a;
a=(int*)malloc(1000);だね
0371364
2006/10/29(日) 00:03:17解決しちゃったのか・・
訂正
int *a;
a=(int*)malloc(1000);
0372デフォルトの名無しさん
2006/10/29(日) 00:15:22この質問者、マルチだけどね
0373側近中の側近 ◆0351148456
2006/10/29(日) 00:32:30(っ´▽`)っ
それだと動的に配列サイズを変えることができるけど、
その度に設定値の再編成が必要になるね。
たとえば、
1次元目の配列サイズを50から100にすることで、
a[0][1][0]がa[0][0][50]になっちゃう。
設定値の再編成を不要にするには、
1次元目:実体配列
2次元目:1次元目へのポインタの配列
3次元目:2次元目へのポインタの配列
とする必要がある。
0374デフォルトの名無しさん
2006/10/29(日) 00:32:37Windowsはリトルエンディアンだが、Unixがリトルエンディアンでないとは限らない。
CPUがx86/x64だったりすればたとえUnixでもWindowsと同じリトルエンディアン。
エンディアンを決めるのはOSではなく、CPU周りのアーキテクチャ。
0375364
2006/10/29(日) 00:43:55そうだったのか
まぁいいや
どうせこのコード失敗作だし
これじゃ多次元配列構成できないじゃん
って気付け俺・・・・
>>367>>368で正解だね
携帯めんどくセー
誰だ俺と同じホストで悪さした奴は・・・・
0376364
2006/10/29(日) 00:49:45レス見れなかった
書き込んでるうちに新しいレスがついてる
訂正ありがと
あぁほぼ全ホストに規制が・・・・
0377デフォルトの名無しさん
2006/10/29(日) 00:54:270378デフォルトの名無しさん
2006/10/29(日) 00:59:29そのマクロの辺りを調整してみたら?
>>377
書籍スレへどうぞ。
0379デフォルトの名無しさん
2006/10/29(日) 05:05:06他言語での経験も書いとけよ
書籍スレでは
0380350
2006/10/29(日) 08:45:24返事が遅くなってしまいましたがレスありがとうございました。
無事修正して雛形を作成することが出来ました。
ありがとうございました。またよろしくです。
0381側近中の側近 ◆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言語のコンパイラにあるのかな?
0382デフォルトの名無しさん
2006/10/29(日) 10:09:000383デフォルトの名無しさん
2006/10/29(日) 10:11:390384側近中の側近 ◆0351148456
2006/10/29(日) 10:27:29(っ´▽`)っ
配列とリストを比較すると・・・
配列は連続した領域を確保する。
そのため、リストとは違い、アクセスが容易。
アドレスの単純なインクリメントだけで済む。(添字だけで済む。)
リストの場合、メンバを最初から順に追っていかなければならない。
さらに、領域が連続してるから初期化も楽。
memset(a, 0, sizeof(a));で一発。
0385デフォルトの名無しさん
2006/10/29(日) 10:39:28>(っ´▽`)っ
>そもそもfreeをかけなければずっと確保し続けるというのが
>C言語の仕様なのではなかろうか?
当然 これが正解
0386デフォルトの名無しさん
2006/10/29(日) 10:47:26もういっかいポインタの概念をきちんと学習した方がいいのでは?
なんかあんまりポインタのことがわかってないように聞こえるぜ
0387側近中の側近 ◆0351148456
2006/10/29(日) 10:51:46(っ´▽`)ノシ どもども☆
0388デフォルトの名無しさん
2006/10/29(日) 12:58:26%fのところを少し変えればいいと思うのですが。
0389側近中の側近 ◆0351148456
2006/10/29(日) 13:29:25(っ´▽`)っ
%.7f
0390デフォルトの名無しさん
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("飛ぶわけねーだろ");
}
0391デフォルトの名無しさん
2006/10/29(日) 13:56:18ありがとうございます
0392デフォルトの名無しさん
2006/10/29(日) 13:56:36>void giko(void);
getch の呼び出しは getch() ってことが分かってるなら
giko の呼び出しも単純に giko() だとは思わんか?
0393デフォルトの名無しさん
2006/10/29(日) 14:05:12ありがとうございます
0394デフォルトの名無しさん
2006/10/29(日) 15:21:53int kansuu (int count, int x[count]) {
処理
}
こんな感じでやったのですがcountが未定義になってしまいます。
int* x[count]も試したのですができませんでした。
どうすればよいのでしょうか?
0395デフォルトの名無しさん
2006/10/29(日) 15:25:45int kansuu(int count, int x[])
{
}
0396デフォルトの名無しさん
2006/10/29(日) 15:27:28なるほど!
やってみます ありでした
0397デフォルトの名無しさん
2006/10/29(日) 16:22:45ってどういう意味ですか?
0398デフォルトの名無しさん
2006/10/29(日) 16:25:110399デフォルトの名無しさん
2006/10/29(日) 16:30:04return 0 は、付ける場合と付けない場合でどう違ってくるんですか?
0400デフォルトの名無しさん
2006/10/29(日) 16:32:36main関数ならシステムに0を返すってだけ
ぶっちゃけほとんど意味はないらしいけど一応
0401デフォルトの名無しさん
2006/10/29(日) 16:37:13上下反転させようとしたとき行の順番以外は変化しないのに
2重ループor3重ループさせるのってなんか馬鹿っぽくないでしょうか?
ポインタ弄ればもっと簡単になるような気がするんですが、('A`)むー
0402デフォルトの名無しさん
2006/10/29(日) 16:37:20分かりました。ありがとうございます
0403デフォルトの名無しさん
2006/10/29(日) 16:50:240404デフォルトの名無しさん
2006/10/29(日) 16:51:16馬鹿っぽいんじゃない。本当に馬鹿なんだ。
0405デフォルトの名無しさん
2006/10/29(日) 17:22:550406デフォルトの名無しさん
2006/10/29(日) 17:30:06returnを付ける派?付けない派?
私は付ける派。
0407デフォルトの名無しさん
2006/10/29(日) 17:33:45馬鹿認定thx
頭悪いと自覚してなかったら質問なんて出来ませんだぜ(´・ω・`)
出来れば理由とかも教えていただけると参考になります。
0408デフォルトの名無しさん
2006/10/29(日) 17:50:010409デフォルトの名無しさん
2006/10/29(日) 18:03:39ぱーせんとおー、ぱーせんとぴーという以上の意味があるようには見えないのだが。
#特定のシチュエーションにおけるそれらrの意味を問いたいのならそのシチュエーションを書きたまえ。
0410デフォルトの名無しさん
2006/10/29(日) 18:09:18>>main関数ならシステムに0を返すってだけ
>>ぶっちゃけほとんど意味はないらしいけど一応
>return 0 はちゃんと命令が終了しましたよ って意味だぞ。
お前らww
main関数ならシステムに0を返す。
実行ファイルの実行終了時返却値になるんだから
意味はおおいにある。
普通は正常時に 0 を返し、異常時に 0 以外を返す。
ただ、それは決め事だから 0 だからって正常かどうかは
システム次第だけど。
main 以外なら、その関数の仕様次第。
0411デフォルトの名無しさん
2006/10/29(日) 18:42:35return 文で値を返さないとシステムなり呼び出し元に返る値は予期しない値になる
呼び出し元が戻り値を必要としないものなら問題は起きない.main関数が戻り値を返さなくても問題が起きないのはそのシステムが値を必要としていないから.
0412デフォルトの名無しさん
2006/10/29(日) 18:59:34↑これは確信ないんだけどね.少なくともコマンドプロンプト上では・・・・
void main()の場合コンパイラが0を返すようにコード変えてるかもしれないなぁ
0414デフォルトの名無しさん
2006/10/29(日) 19:18:400415デフォルトの名無しさん
2006/10/29(日) 19:21:07なぜ逆アセしない?
0416411
2006/10/29(日) 19:54:46言われてみれば・・・
整数値の場合int戻しだとレジスタに返却値を格納してる.voidだとしてないね
システム的には終了直後にこの値を参照してるんじゃないかと思う
でもシステムからの呼び出しってmainが最初じゃないんだよね・・確か
0417デフォルトの名無しさん
2006/10/29(日) 19:55:50一番良くあるのは、フラグの組み合わせを表すときとか。
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のための値。
0418417
2006/10/29(日) 20:02:14ビットでフラグを管理するのは、関数のインタフェースとしてだけではなく、
処理の状態を管理するのにも使える。
ある状態になったらこのビットをONにして、このビットがONのときはあの処理をして…。
複数のフラグをまとめて一つの変数で管理するのは、それらが関連する場合だけにしたほうがいい。
たとえば、先に例にあげたopen()関数でのオープン方法の指定のように。
もともと関連の無い概念なら、別の変数にしてBOOL値として管理したほうがいい。
0419411
2006/10/29(日) 20:17:01トレースしてみる
0420デフォルトの名無しさん
2006/10/29(日) 20:19:34VC 2005で試してみたらvoid main() {}でもint main() {}でも
xor eax, eaxをやっていて、0を返すようになっていた。
C++でもvoid main() {}はおそらく0を返すのだろう。int main() {}は規格に従って0を返すのは確認済み。
0421411
2006/10/29(日) 20:40:35>int main(){}は規格に〜
↑ここ詳しく
でもmain復帰後すぐeaxをpushしてるでしょ
最終的にこの値をどうしてるかが問題じゃない?こっちはBCB5でデバッグ中の状態からしかアセンブラコード見れないけどそっちも同じ?
0422デフォルトの名無しさん
2006/10/29(日) 20:51:30/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としてコンパイルされるようにした。
0423デフォルトの名無しさん
2006/10/29(日) 20:54:09「√(ルート)」で囲んだ数値を返す関数ってありますか?
例 2 を引数にすると、1.41421356..と返ってくる
(C言語というか数学の問題っぽくてすまんとです・・)
0424デフォルトの名無しさん
2006/10/29(日) 20:59:14#include <math.h>
sqrt(x)
で、よろしいか?
0425デフォルトの名無しさん
2006/10/29(日) 20:59:26<math.h>のsqrt
0426デフォルトの名無しさん
2006/10/29(日) 21:01:43shellで実行後にシェル変数$?に格納されるもの
別に0が正常終了というわけではない
だから、void main()で何を返そうがそれはどうでもよいことでは?
プログラムの終了ステータスとして不定値を返すということで
0427デフォルトの名無しさん
2006/10/29(日) 21:06:35mainが終わると、その戻り値を引数にしてexitを呼ぶことになっている。
シェルとかを抜きにして、Cではexitの引数が0またはEXIT_SUCCESSの場合成功終了と定められている。
0428デフォルトの名無しさん
2006/10/29(日) 21:07:49ありがとうございます!
すんません。基本的な事過ぎました・・
0429デフォルトの名無しさん
2006/10/29(日) 21:19:39if文を適当に削ると一応コンパイルできました。
これからテストしてきます…
0430411
2006/10/29(日) 21:53:43コマンドコンパイラ初めてだけど頑張ってみる
ぁぁ俺のホストのアク禁いつ解除されるんだろう
0431デフォルトの名無しさん
2006/10/29(日) 22:31:41ttp://ukai.jp/debuan/2002w/elf.txt
を見たらいいんじゃまいか
0432デフォルトの名無しさん
2006/10/30(月) 00:57:41getcの帰り値の取り扱い方法について質問です。
manしたら、プロトタイプが以下のようになっていて
int getc(FILE *stream);
これはgetcの帰り値を
intで受けて処理しちゃったほうがいいのでしょうか?
それともchar型にキャストして使ったほうがいいのでしょうか
↓こんな感じで?
char ch;
FILE fp;
ch = (char)getc(fp);
0433デフォルトの名無しさん
2006/10/30(月) 01:00:03EOFでないと判明したらchar型にしてもよい。
0434デフォルトの名無しさん
2006/10/30(月) 01:07:28なるほど!なんとなく定数が絡んでいるのかなーと理解しました。
int型で受けて処理します。
ありがとうございますー
0435デフォルトの名無しさん
2006/10/30(月) 02:16:54C++は知ってたが、C99もそうなのか。勉強になりました。
チラシの裏ですまん。
0436デフォルトの名無しさん
2006/10/30(月) 04:20:09static POINT pt[][300]
こうした場合、ptの要素数ってあとからどうやって指定するんでしたっけ?
忘れでしまってorz
mallocで領域確保する必要あり?
0437デフォルトの名無しさん
2006/10/30(月) 04:35:33関数の仮引数の事?
それは呼び出した側で渡した配列の大きさによる。
関数内でそれよりも大きな行数を指定した場合の動作は未定義
0438デフォルトの名無しさん
2006/10/30(月) 04:36:37static POINT (*pt)[300];
と同じだから、malloc()かもしくは同じ列数を持つ配列のアドレスを
ptに代入
0439デフォルトの名無しさん
2006/10/30(月) 05:54:580440デフォルトの名無しさん
2006/10/30(月) 06:20:17というエラーメッセージが出ると予想
0441デフォルトの名無しさん
2006/10/30(月) 07:38:220442デフォルトの名無しさん
2006/10/30(月) 08:37:260443デフォルトの名無しさん
2006/10/30(月) 08:43:41中学英語すら分からない頭で理解するのは無理だな
0444436
2006/10/30(月) 08:51:21配列を動的に定義できないのかなぁと・・・
たとえばVB(VBA)では
Dim iNum[] と宣言しておいて
Redim iNum[6] というように
あとから配列の要素数を決められたように思うんですが(昔のことなんで記憶が定かではないのですが)
こういうことをcでやるにはどうしたらいいのかな、と
最初に十分おおきな配列を準備するという方法でもいいのですが
何分スマートさにかけるような気がして(笑
0445デフォルトの名無しさん
2006/10/30(月) 09:15:21mallocを使え。
0446デフォルトの名無しさん
2006/10/30(月) 09:21:00このスレ的には邪道だが、C++に移行してstd::vector使え。
0447デフォルトの名無しさん
2006/10/30(月) 10:05:58realloc() でいいだろ
NULL 値指定してやれば malloc() と同じ動きするし
0448デフォルトの名無しさん
2006/10/30(月) 11:28:17{
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はなるべく避けたほうがいいのでしょうか…。よろしくお願いします。
0449デフォルトの名無しさん
2006/10/30(月) 11:44:30WindowPtr の正体は?
0450デフォルトの名無しさん
2006/10/30(月) 11:59:34Error : cannot implicitly convert
暗黙の変換ができません
WindowPtr が整数に変換できないんだろ
(long)WindowPtrにでもしてみたら
0451デフォルトの名無しさん
2006/10/30(月) 12:01:23コンパイル時に値を決定できない変数を enum に指定できないってことじゃない?
勘ですまんが。
0452デフォルトの名無しさん
2006/10/30(月) 12:05:23WindowPtrは、Macの画面に表示されるウインドウリソースへの
ポインタです。
ヘッダファイル Quickdraw.hで定義されているようです。
(もちろんインクルードはしています)
typedef GrafPtr WindowPtr;
となっています。
ポインタをenumに入れるのが間違ってるんでしょうか。
enumじゃなく#define使う人が圧倒的に多いですが、
それに対する啓蒙書みたいなものでしょうか>プログラミング作法
0453デフォルトの名無しさん
2006/10/30(月) 12:33:18もう、どーなってんだか…。
一応#defineに戻しときました。
Appleの提供するヘッダ自体、#defineの嵐だし。
0454デフォルトの名無しさん
2006/10/30(月) 13:36:00const を薦める理由も書いてましたよね?
型を指定したいからですね。
昔のCには const は無かったですけど、最近なら
#define ではなく const int などにするのが
安全でしょう。
0455デフォルトの名無しさん
2006/10/30(月) 13:37:33enum に型なんて要らないんだから、
#define IN_FRONT -1L
でいいじゃん。
使うときにキャストすれ
0456デフォルトの名無しさん
2006/10/30(月) 13:42:34そうですよね。
>>455
#define IN_FRONT -1L
では、WindowPtrはどうするんでしょうか?
キャストの方法だけでも教えてください。
0457デフォルトの名無しさん
2006/10/30(月) 13:43:14がわかんないんですけど教えてください。
0458デフォルトの名無しさん
2006/10/30(月) 13:48:09困ってるんです。
0459デフォルトの名無しさん
2006/10/30(月) 14:24:090460デフォルトの名無しさん
2006/10/30(月) 14:24:33(WindowPtr) がキャスト
ていうか、
enum
{
REMOVE_EVENTS = 0,
SLEEP_TICKS = 0L,
MOUSE_REGION = 0L,
WINDOW_ID = 128,
STR_ID = 128,
HELLO_STR_ID = 1
};
こんな enum 意味なくね?
これなら全部 const long とかのほうが全然いいと思うが。
0461デフォルトの名無しさん
2006/10/30(月) 14:29:05#define A 1
#define B (A + 1)
が表現できないんだもん。
const int A = 1;
const int B = A + 1; ←ここでエラー
0462デフォルトの名無しさん
2006/10/30(月) 16:38:530463デフォルトの名無しさん
2006/10/30(月) 17:07:51define を const に置き換えるのは最悪の部類だろう
定数式が要求されるところ全てでエラーが出るぞ
0464デフォルトの名無しさん
2006/10/30(月) 18:08:190465デフォルトの名無しさん
2006/10/30(月) 20:29:17>整数値(10桁以下)を入力させ、数字の出現回数を表示するプログラム
入力値を文字列に変えて一桁ずつ判定、数字0〜9の配列にでもカウントさせる
で、その配列を表示
0466デフォルトの名無しさん
2006/10/30(月) 20:54:20(すぐ止めたからよかったものの) 危うくメモリリーク・・
//jpeg画像だから尚更ヤバス..OTL
0467デフォルトの名無しさん
2006/10/30(月) 21:10:12{
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)してその内容を
出力するプログラムなのですが
なぜか出力されるのは指定したファイルの一行目のみっという
結果になってます。全ての行を出力するためには
どのように変更すればいいでしょうか?
0468デフォルトの名無しさん
2006/10/30(月) 21:36:47fgets(str,256,fp)を1回しかやらないからそうなる。ファイルが終わるまで繰り返せばいい。
if(fp == NULL)はfopen()した直後(fgets()する前)にみるべき。
>>466
わけわからん。メモリリークって、解放すべきメモリを解放しないことですよ。
0469デフォルトの名無しさん
2006/10/30(月) 21:42:55.jpgを1枚1枚全部取り出すっつぅプログラムを作りたいんだが、
やはりmov全体を読み込むほど、メモリを確保しないといかん??
処理としては、
jpegファイル(not jpeg2000)の開始(ffd8)から終了(ffd9)までを、
延々とファイル末尾まで調べて、適当に連番で出力させられればいいんだが。。
0471デフォルトの名無しさん
2006/10/30(月) 21:56:01別にwav音声はとりあえず要らないから、
まず画像をと思って。。
構造は結構バラつきがあるね、、秒間30コマで
jpegがまず1秒分、途中に空きがありつつ並んでいて、
その後に1秒分のwav音声がくるみたい。
以後jpeg,wavの繰り返しをほぼ大半を占めてる。。
waveは、ffd8〜とかではないようだけど
よくわからん。。
0472どんずまり
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で使いたいです。
0473デフォルトの名無しさん
2006/10/30(月) 22:41:08mallocの左辺は、なんらかのポインタでなければならないが、
その関数内の
p1=mallocの実態は
char **p1 = mallocだから
char *p1 = mallocとなるように
間接参照して
*p1=mallocとする必要がある。
0474デフォルトの名無しさん
2006/10/30(月) 23:42:14//復号化
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; }
これの意味です、何をどうインクリットメントするかです。
0475デフォルトの名無しさん
2006/10/30(月) 23:45:08こういうことがやりたいのか?
#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';
}
0476どんずまり
2006/10/30(月) 23:51:36結果は明日報告します。
どうもありがとう御座います。
0477デフォルトの名無しさん
2006/10/31(火) 00:04:43どうかな?
#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;
}
0478デフォルトの名無しさん
2006/10/31(火) 00:07:43>いつもなら、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++];
のあたり、あまりよろしくない。
0479デフォルトの名無しさん
2006/10/31(火) 01:31:310480474
2006/10/31(火) 01:43:06解り易いご返答、ありがとうございます。
>いつもなら、0で返しますが、今回初めて1で返す事になっています。
自分もよくわかりません・・・。
まだ、考えても理解しにくい部分があります
>読み込みが成功したら(fread関数の戻り値が1)
の戻り値が1とは厳密には、どういう事でしょうか?
もう一つは、ch = ch - key[i++];
は、
ch = ch - key[i];
i++;
と
>fread(&ch, sizeof(char), 1, fp)
>ch = ch - key[i++];
等は、何故宜しくないのでしょうか?
参考書の著者のソースです。
0481デフォルトの名無しさん
2006/10/31(火) 01:50:44日本語の勉強をしなおした方がよくないか?
>>いつもなら、0で返しますが、今回初めて1で返す事になっています。
>自分もよくわかりません・・・。
「いつも」とはなにか。自分自身しかわからないことは、きちんと相手に伝える努力をすること。
>>読み込みが成功したら(fread関数の戻り値が1)
>の戻り値が1とは厳密には、どういう事でしょうか?
厳密も何も、マニュアルページに書いてある通り、fread()は読み込みに成功したエレメントの個数を返す。
従って第3パラメータが1ならば、成功時は1個読めているので1が戻るのは自明。
>fread(&ch, sizeof(char), 1, fp)
>ch = ch - key[i++];
これはfread()を使うよりもfgetc()を使うべきシチュエーションだな。
>478がその意図で書いたかどうかは判らんが。
0482478
2006/10/31(火) 02:01:19>の戻り値が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文字でもコード量を減らしたかった時代ならともかく)
0483デフォルトの名無しさん
2006/10/31(火) 02:08:03の中に変数を使用してmkdirのディレクトリ名を変数で指定して
ディレクトリを作成するにはどうしたらいいですか
0484デフォルトの名無しさん
2006/10/31(火) 02:24:00N 人の宣教師と N 人の人食い人種が定員 k 人(k < N)の船で川を渡る。
ただし、どちらの岸でも人食い人種のほうが宣教師より多くなると、
宣教師は食べられてしまう。
というのをプログラムにしろという課題ができません。
3人ずつで定員2人の場合のコードはいろんなサイトに載っているんですが。
0485デフォルトの名無しさん
2006/10/31(火) 02:48:190486デフォルトの名無しさん
2006/10/31(火) 02:52:03sprintf()でも使って組み立てればよろし。
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人にすればよろしかろ。
0487474
2006/10/31(火) 03:35:23ごめんなさい・・・
こんなに詳しく書いて頂いき、ありがとうございます。
やはり、難しいので完璧に理解するのに時間がかかりそうですが
プリントしたりして、読み返したいと思います。
参考書を過信しない方が良いようですね。
0488デフォルトの名無しさん
2006/10/31(火) 05:34:16対応しているのでしょうか?兼用でしょうか?
0489デフォルトの名無しさん
2006/10/31(火) 05:37:27遅延時間というか、処理を数秒待つというか・・・。
例えば
printf("aaaaaa\n");
printf("bbbbbb\n");
を実行すると、aaaaaaとbbbbbbは同時に表示されてしまいますが、
aaaaaaを表示して2秒後にbbbbbbを表示させることは可能なのでしょうか?
0490デフォルトの名無しさん
2006/10/31(火) 05:49:05「テキストバイナリ」って、その「俺語」を先ず何とかしろ。
>>489
time()で秒単位の時刻は得られるから、無理矢理2秒待つだけなら標準関数でもできる。
しかし、大抵の環境にはその間処理を停止させるための待ち専用関数が用意されている。
もう一つ問題があって、printf()で出力される標準出力はバッファリングされる可能性がある。
従って、バッファをフラッシュしないといくら途中で待ちを入れても纏めて出力されかねない。
まぁ、Unix系ならこんな感じ。
printf("aaaaaa\n");
fflush(stdout);
sleep(2);
printf("bbbbbb\n");
0491デフォルトの名無しさん
2006/10/31(火) 05:50:58テキストエディッタとバイナリエデイッタでしたm(__)m
0492デフォルトの名無しさん
2006/10/31(火) 08:24:170493デフォルトの名無しさん
2006/10/31(火) 08:56:35テキストとバイナリの違いなんて、例えば改行コードの取り扱いとかだけで、
基本的には同じ
0494デフォルトの名無しさん
2006/10/31(火) 11:11:30\n ⇔ CRLF テキストモード
\n ⇔ LF バイナリモード
それ以外の文字は渡されたものを垂れ流す。
テキストエディタで化けるような isprint() でない文字を可視化するような気の効いた機能なんぞない
0495デフォルトの名無しさん
2006/10/31(火) 11:37:20C言語の機能にはない
sleep関数でウェイトさせる
0496デフォルトの名無しさん
2006/10/31(火) 12:01:040497デフォルトの名無しさん
2006/10/31(火) 15:31:13つながりをファイルに保存して、そのファイルを読み込むとコンピュータ上で
前回のデータ構造を再現できる方法を探しています。
色々探したり考えたりしたのですが、いい方法が見つかりません。
C言語でそのようなことは可能なのでしょうか?
ご存知の方がおられたら教えていただけないでしょうか?
0498デフォルトの名無しさん
2006/10/31(火) 15:51:03近くにまともな本屋がないのでアマゾンで購入しようと思うのですが一つアドバイスいただきたいです。
0499デフォルトの名無しさん
2006/10/31(火) 16:09:100500デフォルトの名無しさん
2006/10/31(火) 16:10:02JIS X 3010:1993 (JISで買える)
ANSI C の Rational (webから落とせる)
0501デフォルトの名無しさん
2006/10/31(火) 16:11:190502デフォルトの名無しさん
2006/10/31(火) 16:14:16当然、可能ですよ。
個々のノードに一時的にID番号みたいなのを振って、ポインタの部分を
ID番号にしてファイル化するとか、ポインタの部分をファイル先頭から
のオフセットにするとか、イロイロ。
0503デフォルトの名無しさん
2006/10/31(火) 21:02:45本を売る必要がないからな
0504デフォルトの名無しさん
2006/10/31(火) 21:24:36#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);
0505続き
2006/10/31(火) 21:25:12printf("先攻[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;
}
0506続き
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のようにしたいです。
0507デフォルトの名無しさん
2006/10/31(火) 21:31:010508デフォルトの名無しさん
2006/10/31(火) 21:31:58例えば4を入力したとき
4
1=1
2+1=3
3+2+1=6
4+3+2+1=10
0509デフォルトの名無しさん
2006/10/31(火) 21:32:03いや俺は>>498に大学通ってるんなら図書館へ行ってみろよってことを言いたくてですね
0510504
2006/10/31(火) 21:38:20ご指摘、ありがとうございます。
入門書と比較しても誤りはないんですが・・・・。
>>else{printf("%dコンピュターの番です\n",bin); bin--;}
の何処がおかしいいのでしょうか?
0511デフォルトの名無しさん
2006/10/31(火) 21:40:04#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 );
}
}
0512デフォルトの名無しさん
2006/10/31(火) 21:42:45>>504のソースは %d が、
コンピューターの番に抜けてるだけじゃないのか?
0513デフォルトの名無しさん
2006/10/31(火) 21:42:43元は %d がない。
>>506 の出力で "コンピュターの番です" となっているが
意図としては
23 プレイヤーの番です
22 コンピュターの番です
21 プレイヤーの番です
20 コンピュターの番です
となって欲しいコードだと思われるから。
0514デフォルトの名無しさん
2006/10/31(火) 21:46:18ちょwwwタイムトラベルが起きてるwwww
0515504
2006/10/31(火) 21:47:07エラーがでなかったので、わかりませんでした!!
ありがとうございました。
0516513
2006/10/31(火) 21:49:17こ、これは!!!
クライアントの時刻ってわけないよな…
ロックした時刻であって Write 完了時刻じゃない ってことなのか?
# 俺のレスのほうがトランザクション完了遅かった っとこと?
0517デフォルトの名無しさん
2006/10/31(火) 21:56:47ありです!
0518デフォルトの名無しさん
2006/10/31(火) 21:59:59void mainはねえだろ。
0519デフォルトの名無しさん
2006/10/31(火) 22:10:44あっホントだ
>>517
int main(void)
に直しといて
0520デフォルトの名無しさん
2006/10/31(火) 22:27:22>>498は大学でCを勉強したとは書いているが、今現在大学に在学中とは書いてない。
勉強しなおすという表現は社会人が専ら使う表現だ。
>>503で言いたかったのは、本屋はもとより大衆本の著者・出版社も本を数売ることが目的だから、
それが名著であるかどうかより、今人気があるか、手にとってもらえるかを重要視せざるを得ない。
店頭にたくさん並ぶのはそういう本だ。金を出してハズレ本を掴んだ虚しさは忘れがたい。
図書館はそういう商業主義とは一線を隔した存在だから古い名著が本棚の片隅にいつまでも残っていたりする。
そういう本を今の時代は検索システムで簡単に発見できる。
だから>>499に同意だ、ということ。
0521側近中の側近 ◆0351148456
2006/10/31(火) 22:35:21蟹飯読もうよ。
0522デフォルトの名無しさん
2006/10/31(火) 23:08:092)if(N[i]=!0)
この二つの違いを教えていただきたいのですがお願いします。
0523デフォルトの名無しさん
2006/10/31(火) 23:10:582)if(N[i] =! 0)
この二つの違いを教えていただきたいのですがお願いします。
0524デフォルトの名無しさん
2006/10/31(火) 23:11:432はn[i] が 0じゃないとき 真
0525524
2006/10/31(火) 23:15:00>1)if(N[i] != 0)
n[i] が 0じゃないとき 真
>2)if(N[i] =! 0)
これの場合
代入演算になるな
0の否定を N[i] に代入しなさいって
0526デフォルトの名無しさん
2006/10/31(火) 23:16:02ああ、ちゃんと読んでなかったなすまん
近くに大学あるなら是非行ってみるべきだと思うな
目に見えてぼろぼろになってる本とか、そのまま評価になりうると思うよ
0527側近中の側近 ◆0351148456
2006/10/31(火) 23:17:06>2)if(N[i] =! 0)
0の否定=1
だから、常に真になるわけだね。
0528デフォルトの名無しさん
2006/10/31(火) 23:17:241と2は逆じゃないんですか?
まだよく分からないんですけど・・・
0529デフォルトの名無しさん
2006/10/31(火) 23:18:320530524
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に代入ってこと
0531デフォルトの名無しさん
2006/10/31(火) 23:21:18>2)if(N[i] =! 0)
て書いてて、'=!'なんていう演算子あったっけ??と
びっくりしたが、何のことは無い、
2)if(N[i] = !0)
というふうにコンパイラ君は理解するんだな。びっくらこいた。
警告レベルをW4にして、納得した。
結局
2)if(N[i] =! 0)
の括弧の中身は必ず真になるからこのif文は無意味だね。
0532デフォルトの名無しさん
2006/10/31(火) 23:22:26これはいい質問だった
0534デフォルトの名無しさん
2006/10/31(火) 23:35:25VCをデフォルト設定で使っていて、警告レベルがW1だったから
最初は警告が出なかった、ただそれだけだがね。
すぐに気がついて警告レベルをW4(最高)に上げて警告を確認したよ。
「条件式の比較値は、代入の結果になっています。」ってね。
VCは警告レベルW3でもこの警告出ないんだよね。
0535524
2006/10/31(火) 23:41:08>>531の
>警告レベルをW4にして、納得した。
これ見て納得した...警告出てたのね
>>523にしてもそうだがよく読まずレスしてしまった
で見返してから気づく...ちげぇーじゃんって
スマソ
0536どんずまり
2006/10/31(火) 23:43:580537475
2006/10/31(火) 23:52:46そうやってきちんとレスを返してくれると、
今度また質問に答えようかな、という気持ちになるんだよね。
なにもレスがないとさびしさで死んじゃうよ。
0538側近中の側近 ◆0351148456
2006/10/31(火) 23:56:24(っ´▽`)っ さびしいなら私が抱きしめてあげるよ☆(抱
0539401
2006/10/31(火) 23:59:08ヘルプミー!!
0541どんずまり
2006/11/01(水) 00:05:25数字配列を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);
}}
0543デフォルトの名無しさん
2006/11/01(水) 00:09:50それは無理に押し込めるより
テキストにしてうpにした方がいいだろ・・・・
0544401
2006/11/01(水) 00:16:58101行と101列です
0545どんずまり
2006/11/01(水) 00:35:54どーゆうことですか?
0546デフォルトの名無しさん
2006/11/01(水) 00:37:28cは、どこで初期化してるの?
多分こうしたかったんでしょ?
どうかな?
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;
}
}
0547デフォルトの名無しさん
2006/11/01(水) 00:39:18ごめん。本当に何が言いたいのか分からない。
画像の何をどのようにしたいのか教えて。
0548475
2006/11/01(水) 00:48:08それで大体の問題は解決しますよね。
でも一回の入力で11文字以上入力するとやっぱり同じです。
無理して書くと、
while(((ch[c]=getchar())!='\n') && (c < 10)){
みたいな感じかな。もっともおすすめしないけれど。
要するに>>541だと、
ポインタchが指している領域を超えて入力が
行われる可能性があるのが問題。バッファオーバーランの類。
このソースの場合、10文字までしか文字を入力できないつもりで
書いているんだろうけど、実際には無限に無理やり書き込む
ことができるようになってるんだよね。でも領域は10文字分
しかないからセグメンテーションフォルトが起きる。
根本的に変えなきゃならない点がいくつか・・・
0549質問
2006/11/01(水) 00:48:41例えば、この構造体は50byteと決めると50byte以内の要素しか持てないようにするといった具合です
0551475
2006/11/01(水) 01:17:09>>543 が言ってたアップローダ使用。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2861.txt
二種類のソースを見比べてみてね。
眠いから帰るぽ。
0552どんずまり
2006/11/01(水) 01:18:07ありがとう御座います。
明日すぐに試して報告します。
0553デフォルトの名無しさん
2006/11/01(水) 01:54:3410桁の数値だと、signed intの限界
2147483647を超えることがあるじゃん。
30億とか入力すると変なことが起きるぞ。
0554デフォルトの名無しさん
2006/11/01(水) 02:02:49"10cm" -> "10" "cm"
"5mm" -> "5" "mm"
"1e2 km" -> "100" "km"
"0.5xx" -> "0.5" "xx" この場合はエラー表示する
みたいに分解したいんですけれど、どういう方法でやればよいでしょうか?
0555デフォルトの名無しさん
2006/11/01(水) 02:08:54strtok、strstrあたりでググリなされ。
0556デフォルトの名無しさん
2006/11/01(水) 02:15:42ありがとうございます。
その分解の方法で悩んでいるのですが、数字とアルファベットの境で
分解するには、どういう方法が良いでしょうか?境に必ずしも空白が入っている
とは限らないので。
0557475
2006/11/01(水) 02:18:11#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;
}
0558デフォルトの名無しさん
2006/11/01(水) 02:39:37ありがとうございました。
大変参考になりました。
”邪道”と書かれていますが、どのあたりが邪道ですか?
いい感じだと思うのですが。
0559デフォルトの名無しさん
2006/11/01(水) 05:11:250560デフォルトの名無しさん
2006/11/01(水) 06:01:42strtol()でもいいね。
Ex.
char * unitName;
char * test = "10cm";
long value = strtol(test, & unitName, 0);
printf("%ld[%s]\n", value, unitName);
0561デフォルトの名無しさん
2006/11/01(水) 06:25:402や3ぴったりになっているのを確認するにはどうしたら良いでしょうか?
現在、「intにキャストして、元の変数と比較してイコールならぴったり」
という処理を考えているのですが、別の方法はありますでしょうか?
0562デフォルトの名無しさん
2006/11/01(水) 06:27:36x==floor(x)とかでいんじゃね。
0563デフォルトの名無しさん
2006/11/01(水) 06:37:03恥ずかしいですが、初めて知りました。
レスありがとうございました。
0564デフォルトの名無しさん
2006/11/01(水) 06:46:04だから画像のデータって何なのよ?
三次元配列って言っても型も何も提示しなければ分からないよ。
まずは、作ったものを提示してください。
そこから"どの様に動いて"、"どうしたいのか"を馬鹿にも分かるように伝えてください。
それが出来なければ多分これ以上、ここで助けを求めても無理だと思います。
0565デフォルトの名無しさん
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
といった具合にもとめた答えを
次の時間に反映させるにはどうしたらいいのですか。
またひとつの時間毎にノートなどの
テキストファイルに出力するにはどうしたらいいでしょうか
0566デフォルトの名無しさん
2006/11/01(水) 08:33:37これでいいんじゃないの?
int y;
for(y=0; y<(高さ); y++) {
// y 行目と (高さ-y-1) 行目をひっくり返す
}
配列はビットが並んでることが保証されてるから、
入れ替えはこの際 memcpy で、幅×色数×深度 分コピー
0567デフォルトの名無しさん
2006/11/01(水) 08:35:47微分方程式とか考えれるだけの頭があるんなら、
やりたいことがその質問で本当に伝わるかどうかくらい考えられないか?
意味不明
0568デフォルトの名無しさん
2006/11/01(水) 08:53:58すいません、、、
伝熱の解析をやろうと思ってるんですが
→j
↓i
┌ ┬ ┬ ┬ ┬ ┐
1.1 1.2 1.3 1,30
├ ┼ ┼ ┼ ┼ ┤
2.1 2.2 2,30
├ ┼ ┼ ┼ ┼ ┤
3.1.....
.
.
├ ┼ ┼ ┼ ┼ ┤
29,30
├ ┼ ┼ ┼ ┼ ┤
30,30
└ ┴ ┴ ┴ ┴ ┘
こういった感じに区切られた格子内の
それぞれの温度を数値で求めたいと思っています
そして全部もとまったら時間をΔt進めて
次の計算に使うようなことをしたいです
またノートなどにそれを毎回保存させていくにはどうしたらいいでしょうか
文章が下手ですいません;
0569デフォルトの名無しさん
2006/11/01(水) 09:13:04Iとjというペアになっている値を大量に求める処理を複数回実行したい(時間をΔt進める)のだが、結果を再利用する方法がわからない
また、計算結果のログを取りたいのだがファイルの入出力も分からない
0570デフォルトの名無しさん
2006/11/01(水) 09:17:43ありがとうございます
まさにそのとおりです・・・
0571デフォルトの名無しさん
2006/11/01(水) 09:55:53温度の計算をI、J、時間が引数の関数にする。結果をテキストで出力。
で、微分方程式って何?
0572デフォルトの名無しさん
2006/11/01(水) 10:09:26int main(void)
{
int i=10;
double d=2.0;
printf("%d\n",i>0?i:d);
return 0;
}
iの値がうまく表示できません。printf内の変換仕様を%fに変えれば
10.00000と表示され、手持ちの参考書にもこのとおりになると書かれているのですが,
なぜdouble型になっているのかがわかりません。
なぜこのようになるかどなたか教えてください。お願いします。
0573デフォルトの名無しさん
2006/11/01(水) 10:19:300574デフォルトの名無しさん
2006/11/01(水) 11:32:56円の領域内に入っているかどうかでif文を使いたいのですが
以下のような形で二乗をあらわしてもいいのでしょうか?
if((x[i]-x[po])^2+(y[i]-y[po])^2<=(z[i]-z[po])^2){
〜〜〜
0575デフォルトの名無しさん
2006/11/01(水) 11:49:13^ は XOR 演算子だ
乗数が欲しいなら pow() を使うか (x[i]-x[po]) * (x[i]-x[po]) って書け
0576デフォルトの名無しさん
2006/11/01(水) 12:26:48>560
ありがとうございました。この方法を採用させていただこうかなあと
思っているのですが、こういう処理を汎用的にこなせる、より一般的な
方法とかアルゴリズムみたいなのはありますか?正規表現とか使うと
いいのでしょうか?
0577デフォルトの名無しさん
2006/11/01(水) 13:14:40現在時刻 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 をぐるぐる回すだけ。
# �@での書き換え量の最大差が一定量以下になったときが、ループの止め時
0578デフォルトの名無しさん
2006/11/01(水) 14:04:02ありがとうございます。
差分方程式化やってみます!
0579デフォルトの名無しさん
2006/11/01(水) 15:54:21時間微分を微分の定義通りにばらしていけば差分化は簡単だぞ。
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言語 っつーより解析学の問題だな
0580デフォルトの名無しさん
2006/11/01(水) 16:24:510581デフォルトの名無しさん
2006/11/01(水) 16:25:170582デフォルトの名無しさん
2006/11/01(水) 16:26:250583デフォルトの名無しさん
2006/11/01(水) 17:08:14変数の場所を指定したら
そこの関数でも使えるって感じですか?
0584デフォルトの名無しさん
2006/11/01(水) 17:12:25あくまで、場所を教えただけで、その中身がどうなろうと知らないよ。って感じ
0585デフォルトの名無しさん
2006/11/01(水) 20:17:16= って何ですか?(大体こんな感じの記号なんですが・。)
0586デフォルトの名無しさん
2006/11/01(水) 20:28:140587デフォルトの名無しさん
2006/11/01(水) 20:35:200588デフォルトの名無しさん
2006/11/01(水) 21:21:54左辺を右辺で定義する
0589デフォルトの名無しさん
2006/11/01(水) 21:34:27ありがとうございます!
今日図書館で数値解析の本も借りてきてみたので
これから試してみようと思います。
0590401
2006/11/01(水) 22:04:44マルチポストはあんまり良くない事はわかってんだけど
海の向こうの方々に聞いてみたらあっさり解決しました。
書いたことあんまり変えてなかったんだけどなぁ
これがいろんな意味での差なのだろうか・・・
0591デフォルトの名無しさん
2006/11/01(水) 22:13:00そろそろスレ違いだけど、
有限要素法とか境界要素法の本が借りれれば目を通すと良いかもしれない。
運が良ければ、熱伝達のモデルがまんま出ているかもしれんぞ
# ほとんど流体か弾性体変形だろうけどね…
0592どんずまり
2006/11/01(水) 22:44:52whileの初期化をしていないからエラーが起きるのはわかったのですが、
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?見たいな感じで奇数が出力されずこんな結果になります。
0593デフォルトの名無しさん
2006/11/01(水) 22:57:49桁あふれかも。
(signed)intの最大は2147483647(10桁)。
0594デフォルトの名無しさん
2006/11/01(水) 22:58:042) 呼び出し元側の ch[] の配列の大きさがそもそも 11個未満
# while 内で入力が配列突破する可能性あるんだけど…
# ch[]の器を越えて数値をタイプした後 [Enter] したらアウトじゃん
0595デフォルトの名無しさん
2006/11/01(水) 22:59:12あ。スマン。
漏れの環境(BCC5.5)だと。
0596デフォルトの名無しさん
2006/11/01(水) 22:59:58何してるかさっぱりわからんが、nm は配列じゃないのに nm[d] って何だ
0597デフォルトの名無しさん
2006/11/01(水) 23:02:02俺はUSキーなので確定で定かではないが、
宣言部で int :nm となってる。 脳内で int *nm と補完した
0598デフォルトの名無しさん
2006/11/01(水) 23:03:43大量のタイプはユーザーが悪いってことにするために
あらかじめ注意メッセージを出しておくか、キーの入力を取って処理する
0599デフォルトの名無しさん
2006/11/01(水) 23:06:40なるほど、それじゃ
×>printf("数字配列%dを出力しています\n",nm);
○>printf("数字配列%dを出力しています\n",nm[d]);
0600デフォルトの名無しさん
2006/11/01(水) 23:08:47printf("数字配列%dを出力しています\n",nm[d]);
nm が 単体なら
nm = atoi(ch);
どちらにしろ、最低限コンパイルが通るソース晒せ
0601どんずまり
2006/11/01(水) 23:11:59void func (char *ch,int max, int :nm)ではなく
void func (char *ch,int max, int *nm)でポインタです。
メイン関数に戻したらエラー的な感じです。
0602どんずまり
2006/11/01(水) 23:16:19出力する処理です。
桁数オーバーなんでしょうか?
0603デフォルトの名無しさん
2006/11/01(水) 23:16:31>>594も言ってるが
while((cd[c]=getchar())!='\n'){c++;}
これ ch[] の配列サイズのチェックしたほうがいいよな
0604デフォルトの名無しさん
2006/11/01(水) 23:19:0532ビット signed int だと 範囲は -2147483648〜2147483647 まで
0605どんずまり
2006/11/01(水) 23:30:00541に書いてあるソースの関数部分だけ変更しました。
0606デフォルトの名無しさん
2006/11/01(水) 23:36:12おまいは質問の仕方が下手っぴー だな。
>>541 からは
printf() の出力が変なんだけどなんで?
しか読み取れんのよ。
その後の奇数がどーたら部分については皆目見当がつかんから答えようがない。
あと、「関数部分だけ変更しました」だけじゃ何がどーなったのか全然わからんがな。
せめて 入力どおり表示されるようになったのか
まだ入力と(その関数で表示している) printf() 出力がこーなってる とか
もう少しなんとか出来ないのか?
0608デフォルトの名無しさん
2006/11/01(水) 23:42:10>>599
0609603
2006/11/01(水) 23:44:53これでどうよ
ただし,割り当て領域のチェックとかしてない
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;
}
}
0610603
2006/11/01(水) 23:46:03void 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]);
}
0611どんずまり
2006/11/01(水) 23:51:40最後のprintf分のnu[d]だけの修正ですよね?
明日メイン関数から試してみます。
結果は明日報告します。
0612デフォルトの名無しさん
2006/11/01(水) 23:57:08クイックソートをする関数を作ったはずなのですが、
コンパイルは出来るものの実行すると
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;
改行規制のため続く↓
0613612
2006/11/01(水) 23:57:51while (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;
}
0614デフォルトの名無しさん
2006/11/02(木) 00:03:25サンプルを考えています。よい方法はないでしょうか。
たとえば、(無限ループはよろしくないかと思いますが)
void main()
{
while(1) {
fork();
printf("A\n");
}
}
fork()の使い方は、これでよいでしょうか。
0615475%さびしがりや
2006/11/02(木) 00:21:37かつ同じことが別人によって指摘されてちょっとへこみ中。
自己主張してみる。
>>592
>10回入力し終わるとおかしな結果になります、-21145627?見たいな感じで奇数が出力されずこんな結果になります。
→ >>553
>>594
>2) 呼び出し元側の ch[] の配列の大きさがそもそも 11個未満
># while 内で入力が配列突破する可能性あるんだけど…
→ >>548
で、自分なりに書いた修正ソース(2種)が >>551
intのオーバーフローはチェックして無い。
#define STRMAX 9
に変更すれば桁数は減るがオーバーフローは回避できる。
とりあえず、void func (char *ch,int max, int *nm);
という宣言はありえないと思っている。
#さびしがりやに2ちゃんねるは向いていない。
0616デフォルトの名無しさん
2006/11/02(木) 00:23:35計算の途中や計算結果で2^32より大きな値になる場合、どの段階で値は狂っているんでしょうか?
0618616
2006/11/02(木) 00:35:27計算できる値の最大値 == 格納できる値の最大値 ということですか
CPUとかのハードウェアの計算能力の限界とは別問題(型と一緒だから処理系依存?)なんですね
即レスありがとうございました
0619557
2006/11/02(木) 00:49:22strtodもstrtolも、君のやりたい
「数値と単位を分割する」ために作られた関数ではないため、
他人が見たらソースの意図がわかりにくいし、
予想外の動きをするかもしれない。だからおすすめする気になれなかったの。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtol.3.html
ここでも熟読して、問題は無いか良く考えてみてください。
0620603
2006/11/02(木) 01:06:41>計算できる値の最大値 == 格納できる値の最大値 ということですか
たとえばchar 同士の演算の場合内部で拡張されint として扱われていたりする...(そのほうが処理しやすいからね)
これだとcharのサイズを超えても計算の段階ではintなので問題ないがそれをcharに入れるとオーバーフローを起こす
int同士の加算だと拡張のしようが無いのでオーバーフロー起こす
その後はコンパイラによってエラー処理をどうするか分かれる
普通はあふれ桁を無視すると思う
>CPUとかのハードウェアの計算能力の限界とは別問題(型と一緒だから処理系依存?)なんですね
そうだね、基本的にコンパイラに依存するね
通常は「CPUとかのハードウェアの計算能力」に応じてコンパイラがコード生成するから
0621デフォルトの名無しさん
2006/11/02(木) 01:30:100622デフォルトの名無しさん
2006/11/02(木) 01:31:47分かります
0623デフォルトの名無しさん
2006/11/02(木) 01:35:02本当ですか for()
0624616
2006/11/02(木) 01:47:14ちゃんとハードに合わせてるんですね
longは同じですが、lccとVC++でintの大きさが違った(2→4)ので適当というか
作る人が良いと思ったように決めているのかと思ってました
0625デフォルトの名無しさん
2006/11/02(木) 02:01:59#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);
0626625
2006/11/02(木) 02:03:02printf("先攻[1] / 後攻[0] : ");
scanf("%d", &p_turn);
while(getchar() != '\n'){}
printf("==========あなたの");
if(p_turn ==1){printf("先攻");}
else{
p_turn = 0;
printf("後攻");
}
printf("スタート!==========\n");
0627625
2006/11/02(木) 02:04:01for(;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;
}
0628625
2006/11/02(木) 02:05:27if(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 ***
とエラーが出てしまいます、訂正したつもりですが、どうちがうのかわかりません
ご指摘お願いします。
0629デフォルトの名無しさん
2006/11/02(木) 02:07:51教えていただきたいのですが
0630デフォルトの名無しさん
2006/11/02(木) 02:18:51>警告 W8065 bintori.c 55: プロトタイプ宣言のない関数 'sleep' の呼び出し(関数 main )
プロトタイプ宣言がないと言われている。sleep関数のプロトタイプ宣言が書かれた
ヘッダファイルをインクルードすればいい。どのファイルかはMSDNあたりで自分で探して。
>エラー E2206 bintori.c 62: 不正な文字 '(' (0x8169)(関数 main )
エラーメッセージに書いてある通り。全角の「(」が不正な箇所に使われている。
これを直せば62行目に関して出ている他のエラーも消えるはず。
0631612
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`)。
0632デフォルトの名無しさん
2006/11/02(木) 02:46:44同じく奇数の和を求めるスマートな方法を教えて下さい。
m(_ _)m
0633612
2006/11/02(木) 02:49:49if ( i < j ){
workswap(workarg, i, j);
i++;
j--;
}
を
if ( i < j ){
workswap(workarg, i, j);
i++;
}
に書き換えたら正しいソート結果が出るようになりました。
0634デフォルトの名無しさん
2006/11/02(木) 03:04:26for(i=0; i<(sizeof(a)/sizeof(a[0])) ;i++) s[i & 1]+=a[i];
細かい点は適当に直して
0635デフォルトの名無しさん
2006/11/02(木) 03:05:110637625
2006/11/02(木) 03:48:06質問してからずーっと、試行錯誤して考えていますが
>警告 W8065 bintori.c 55: プロトタイプ宣言のない関数 'sleep' の呼び出し(関数 main )
プロトタイプ宣言がないと言われている。sleep関数のプロトタイプ宣言が書かれた
ヘッダファイルをインクルードすればいい。どのファイルかはMSDNあたりで自分で探して。
これが解決しませんので、ご助言お願い致します。
0638625
2006/11/02(木) 03:52:19【瓶取りゲーム】
交互に1〜3本の瓶を取ります。最後の一本を取った人が負けです。
瓶の本数:23
先攻[1] / 後攻[0] : 0
==========あなたの後攻スタート!==========
これだけでとまってしまいます。
0639デフォルトの名無しさん
2006/11/02(木) 03:57:29http://msdn.microsoft.com/library/ja/
ないしはHDDに入れろ。
http://www.microsoft.com/downloads/details.aspx?FamilyID=373930cb-a3d7-4ea5-b421-dd6818dc7c41&DisplayLang=ja
そしたらsleepで検索しろ。
ちなみにMSの環境にsleepは無い。
あるのはSleep。
0640625
2006/11/02(木) 03:59:49ありがとうございました。
是非、やってみます。
0641625
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
====================ゲーム終了=====================
あなたの勝ち!
ようになりますが、
0642625
2006/11/02(木) 04:15:02【瓶取りゲーム】
交互に1〜3本の瓶を取ります。最後の一本を取った人が負けです。
瓶の本数:23
先攻[1] / 後攻[0] : 0
==========あなたの後攻スタート!==========
コンピューター>3 本取ったぞ!
何本取りますか?1
コンピューター>3 本取ったぞ!
何本取りますか?2
コンピューター>2 本取ったぞ!
何本取りますか?3
コンピューター>1 本取ったぞ!
何本取りますか?1
コンピューター>1 本取ったぞ!
何本取りますか?2
コンピューター>3 本取ったぞ!
==========ゲーム終了==========
あなたの負け!又、挑戦してね!
こうにしかなりません、エラーや警告は解決したはずなのに・・・・。
何処の何が違うのか検討すらつきません。
0643625
2006/11/02(木) 04:15:44らが表示されません。
0644デフォルトの名無しさん
2006/11/02(木) 04:29:15< の向きが逆。
あとデバッガつかえ。
0645デフォルトの名無しさん
2006/11/02(木) 04:30:09for(i = 0; i < bin_max; i ++){
if(i < bin_max - bin){printf("□");}
else{printf("■");}
}
printf(" あと %d 本!\n",bin);
}
↑ここはこれでいいのか?
0647デフォルトの名無しさん
2006/11/02(木) 04:42:13早めに勉強して覚えちゃうのが吉だ。
ただ、デバッガの使い方はググるよりVSのマニュアル読んだ方が早いぞ。
0648デフォルトの名無しさん
2006/11/02(木) 04:48:130649デフォルトの名無しさん
2006/11/02(木) 09:47:20大学の講義や一部のC言語解説サイトにはvoid main()で記述されているのを見かけます。
void main()はどういった点でおかしいのか教えていただけますか?
0650デフォルトの名無しさん
2006/11/02(木) 09:50:49単純に言えばポータビリティがない。
void main()はCでは処理系依存の方法に該当する。
int main(void)やint main(int,char**)はCで規格で明確に定められた書式。
なもんでその処理系にどっぷり依存して糞ったれなコードを書きたいのならvoid main()でもいいよ。
0651デフォルトの名無しさん
2006/11/02(木) 10:16:50なるほど。C言語しかやっていなかったのが認識不足の原因だったのですね。
Cをステップに他の言語も習得したいと思っているので勉強になりました。
ありがとうございます!
0652デフォルトの名無しさん
2006/11/02(木) 13:03:30enum MyEnum {
・・・
・・・
};
と定義して、
使うときに必ずenumを付ける場合
enum MyEnum func1(){
enum MyEnum a;
return a;
}
と、enumを付けない場合
MyEnum func2(){
MyEnum a;
return a;
}
とでは、VC.NETではどちらでもOKのようなのだが、ANSIとか、あるいは、世の中の常識的には
そちらが良いでしょうか?
0653デフォルトの名無しさん
2006/11/02(木) 13:13:440654デフォルトの名無しさん
2006/11/02(木) 13:24:53Foo func1() { Foo dmy; return dmy; }
が C++ では許されるのと同じ理由で enum Bar {}; で定義し、Bar val; と宣言ができる。
Cでは struct/enum の省略は許されない
0655デフォルトの名無しさん
2006/11/02(木) 13:29:34>おまえがやってるのはC++
知らんかった。。。 _| ̄|○
サンキュウ!
0656デフォルトの名無しさん
2006/11/02(木) 13:30:37基本的にenumは「enum タグ名」型の変数を定義する。(タグ名、変数名のどちらかは省略可)
この変数は普通はint型でint型の他の変数と取りうる値域は変わらない。
型名は「enum タグ名」なのでenumを省略するのはあまり良くない。
0657デフォルトの名無しさん
2006/11/02(木) 13:49:240658デフォルトの名無しさん
2006/11/02(木) 14:54:06できますかね?
0659デフォルトの名無しさん
2006/11/02(木) 15:23:09教えてけろ。たのむ。
0660デフォルトの名無しさん
2006/11/02(木) 15:47:02できますよ
>>659
typedef 定義済みの型名 新しく定義する型名
新しい型名を定義する。定義後は型名が追加されるだけで、定義済みのと置き換えるわけではない。
長い型名を省略、自己を説明するような型名、short付加による32ビットと16ビットとの互換など
もちろん、enum型、struct型も定義可能
0661658
2006/11/02(木) 15:53:04当方超ド素人です・・
0662デフォルトの名無しさん
2006/11/02(木) 15:59:58→できますよ
>どのようにすればよいのでしょうか?
お前が言ってるのはこういう事だ
俺らはエスパーじゃねえ
0663デフォルトの名無しさん
2006/11/02(木) 16:03:46662も言ってるように質問が漠然として答えようがないよ。
まずは661が書いたソースを見せて、どこがどういう風におかしいと思うか具体的に書かないとレスもらえないよ。
0664デフォルトの名無しさん
2006/11/02(木) 17:19:34これを仕様とするならば、ランダムにタグを組み合わせれば出来る。
が、場所の確保やら画像やらを含めるとなると
0665デフォルトの名無しさん
2006/11/02(木) 20:43:03int main() printf("<html></html>\n"); }
0666デフォルトの名無しさん
2006/11/02(木) 20:45:06ただそういった要望に応えるには世の中払うもん払ってもらわにゃやってられんというわけだ。
与えられた時間は誰にとっても有限なのだ。
0667デフォルトの名無しさん
2006/11/02(木) 20:49:020668デフォルトの名無しさん
2006/11/02(木) 20:51:30× int main() { printf("<html></html>\n"); }
○ int main(void) { printf("<html></html>\n"); return 0; }
0669デフォルトの名無しさん
2006/11/02(木) 21:21:52マージするところで数字がおかしくなってしまいます
マージ関数は教授にもらったものなので正しいと思うんですが・・・
http://kossie.run.buttobi.net/cgi-bin/up/src/kos0135.txt
ちなみにborland C++ でコンパイルしました。
0670デフォルトの名無しさん
2006/11/02(木) 21:26:150671669
2006/11/02(木) 21:30:44http://bebe.run.buttobi.net/up/src/be_5443.txt
0672デフォルトの名無しさん
2006/11/02(木) 21:59:51>>671
かなり時間がかかってしまって申し訳ないが、
if(n==1)
data2[0] = data1[0];
の2行をmerge_sortに追加すればおkのような
0673669
2006/11/02(木) 22:10:49マジありがとうございました、できました。
0674デフォルトの名無しさん
2006/11/03(金) 00:17:08終端のポイントを取得した場合どうなるの?
0675デフォルトの名無しさん
2006/11/03(金) 00:43:07多分。
0676デフォルトの名無しさん
2006/11/03(金) 00:44:38んで、-1Lを返してエラー発生を知らせる。
fgetposにも注目。
http://www.kouno.jp/home/c_faq/c12.html#25
0677デフォルトの名無しさん
2006/11/03(金) 00:56:19さんくす!
fseek()はできるんじゃないか?
0679デフォルトの名無しさん
2006/11/03(金) 01:15:06お、コレはうちの大学のだな。
0680デフォルトの名無しさん
2006/11/03(金) 01:16:54ラージファイルアクセス用の関数を使う
0681デフォルトの名無しさん
2006/11/03(金) 01:19:290682デフォルトの名無しさん
2006/11/03(金) 01:21:410683デフォルトの名無しさん
2006/11/03(金) 01:24:52大丈夫、下には下がある。
0684デフォルトの名無しさん
2006/11/03(金) 11:05:13txtファイルには1行につき1件のデータが書き込まれており、そのデータはカンマで区切って5つ程の詳細データに別けられています。
0685デフォルトの名無しさん
2006/11/03(金) 11:12:220686デフォルトの名無しさん
2006/11/03(金) 11:22:23それだけ書式がしっかり出来てるなら簡単。行ごとに読み込んでカンマ単位で取り出し格納
0687684
2006/11/03(金) 12:32:27fgets(line,fp);
data[i].A = strtok(line,",");
data[i].B = strtok(line,",");
};
こんな感じでいいんでしょうか・・・
C言語難しい(´・ω・`)
strtok(line,",")の結果をどっかにコピーしないと、次のループでデータが上書きされるよ。
0689デフォルトの名無しさん
2006/11/03(金) 12:57:250690デフォルトの名無しさん
2006/11/03(金) 12:58:070691デフォルトの名無しさん
2006/11/03(金) 14:25:06俺が求めてるのは、キーを押せばすぐその反応が返ってくる奴。
fgetsとsscanf使えとか言われたけど、その使い方がさっぱり分かりません
認識は一文字でかまわないので、その方法を教えていただきたい。
例えば終了コマンドで、 1 を入力すれば終了。 2 で続行。
それ以外なら、エンター待ちではなく、すぐ判断して、
また「入力してください」というのが、読み込まるような奴です。
言葉不足かもしれませんが、よろしくお願いします。
0692デフォルトの名無しさん
2006/11/03(金) 14:30:110693625
2006/11/03(金) 14:55:32i = 0で
if(i < bin_max - bin){printf("□");}
この意味は、0より瓶の総本数の残りが大きければ
□を出力と言う事でしょうか?
0694デフォルトの名無しさん
2006/11/03(金) 15:17:12その人は多分「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()がない環境ではどうやるのか
私も知りたいのだが。
0695デフォルトの名無しさん
2006/11/03(金) 20:28:42ほとんどの環境で動くんで内科医
0696デフォルトの名無しさん
2006/11/03(金) 21:26:40ISO準拠とは、単に命名が準拠しているだけ。
(下線で始まる識別子は処理系予約)
0697デフォルトの名無しさん
2006/11/03(金) 22:08:13#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;
}
このプログラムを四角を描くたびに色を変えるには
どうすればいいんでしょうか??わかる人教えて下さい
0698デフォルトの名無しさん
2006/11/03(金) 22:19:43そのGWなんちゃらというものが何者か知らないが、
二重のfor文ループの中(GWsrectがある位置)で色を変える処理をすればいい。
そのライブラリでどうやって色を変えるかはC言語の問題じゃないので、
マニュアル見るなり他で調べるなりしてくるべし。
0699デフォルトの名無しさん
2006/11/03(金) 22:42:25マニュアルをみたけど
http://spdg1.sci.shizuoka.ac.jp/grwinlib/man.html#GWcolor
赤で塗りつぶすなら
GWcolor(4, 13);
でいいんじゃないか?4はブラシ、13は赤
でも、>>698さんの指摘どおりスレ違い
0700デフォルトの名無しさん
2006/11/04(土) 01:10:540701デフォルトの名無しさん
2006/11/04(土) 01:21:200702デフォルトの名無しさん
2006/11/04(土) 01:22:01printf("%03d", 12);
0703デフォルトの名無しさん
2006/11/04(土) 01:58:22ありがとうございます
0704デフォルトの名無しさん
2006/11/04(土) 02:21:16例えば送る側が「int AAA」と「float BBB」を送り、受け取る側がこれらを受け取るにはどのようにすればいいのでしょうか。
なんでこんな初歩で躓いているのか自分が情けなく感じるorz
0705デフォルトの名無しさん
2006/11/04(土) 02:26:51スレ違い
ネットワークプログラミング相談室 Port18
http://pc8.2ch.net/test/read.cgi/tech/1159692799/
自分の環境の int , float が必ずしも受け取り手の in , float とは同じとは限らない。
整数のほうは htonl() / ntohl() で変換して binray で送れば済む。
浮動小数点数は… よーわからんな
0706デフォルトの名無しさん
2006/11/04(土) 02:40:47sprintf関数でテキストに変換して送るのが一番簡単。
floatの場合は精度という問題があるけど、有効な桁というのがあるはずだから
それで編集する。
ソケット通信で一番の肝は電文フォーマットの設計。
詳しくは「ネットワークプログラミング相談室」のスレで
0707デフォルトの名無しさん
2006/11/04(土) 04:38:07a.exeを実行すると
例えば・・そうだなぁ
#include <stdio.h>
main()
{
printf("hello");
}
とかでコンパイルして実行するとDOS窓が一瞬開いて一瞬で閉じちゃいますよね。
helloってメッセージを見る間もなく。
これを、Enterキーを押したらその窓を閉じる、と言うようにしたいのですが
それをなるべく簡単に実現する方法はありませんか?
私の思いつく方法だと
printf(" 0を入力するとプログラムを終了します。");
scanf("%d",&a);
while(a)
}
といった3行にもなってしまうもので、コレを手軽に1行でもっと短い命令で出来ないかなと。
0708707
2006/11/04(土) 04:39:50>printf(" 0を入力するとプログラムを終了します。");
>scanf("%d",&a);
>while(a)
>}
scanfとwhileの場所入れ替え。
0709デフォルトの名無しさん
2006/11/04(土) 04:43:590711デフォルトの名無しさん
2006/11/04(土) 05:25:13面倒がらずに
0712デフォルトの名無しさん
2006/11/04(土) 05:44:43開発効率の面から言えば、しなくてすむ操作はしないに越したことはない。
0713デフォルトの名無しさん
2006/11/04(土) 08:35:51CRT のソースあるなら _atexit にでもブレ-クポイントおいといたら?
# main() の末尾でも良いけどね
0714デフォルトの名無しさん
2006/11/04(土) 08:50:04パイプになるような奴のチェックだとDOS窓から駆動したほうが良いよね。
DOS窓でターゲットまで移動するのが面倒なだけだw
ドライブまたがなければ、 cd [space] とタイプ後にフォルダを DOS窓へ D&D すりゃ
多少改善されるな。
俺は窓の手でフォルダ右クリックメニューのコマンドプロンプトで楽チン
0715デフォルトの名無しさん
2006/11/04(土) 09:48:350716デフォルトの名無しさん
2006/11/04(土) 10:13:28scanf("%*c");
0717デフォルトの名無しさん
2006/11/04(土) 11:13:540718デフォルトの名無しさん
2006/11/04(土) 18:13:19それまでPrintfで出力したものをいったん全部消したい場合、
どうすればいいんでしょうか?
printf("\x1b[41m");
では削除されずに、
「[41m」
と出力されてしまうんです・・。
0719デフォルトの名無しさん
2006/11/04(土) 18:25:49それ使ってるんだったらwindowsアプリにすればいいんだぜ?
0720デフォルトの名無しさん
2006/11/04(土) 18:53:11いや、なんとかコンソールでやりたいのです・・m(_ _)m
0721デフォルトの名無しさん
2006/11/04(土) 18:54:01エスケープシーケンスが有効になる。
それからクリアスクリーンはESC[21J。
0723デフォルトの名無しさん
2006/11/04(土) 19:08:05そうそう。
ansi.sysがない環境でも、clsは画面クリアできてるんだから、
なにがしかの方法があるはずなんだけど。
0725デフォルトの名無しさん
2006/11/04(土) 19:25:37Windows API
>>720
コンソールを使うWindowsアプリケーションというものもあるんだよ。
そりゃ、win apiだろよ。
0727デフォルトの名無しさん
2006/11/04(土) 19:32:230728728
2006/11/04(土) 20:39:15どのようにすればよいのでしょうか?
struct AAA {
int BBB[10];
};
AAA CCC[100];
上のような定義だと、
たとえば、CCC[50].BBB[5]が参照できません。
よろしくお願いします。
0729デフォルトの名無しさん
2006/11/04(土) 20:44:010730デフォルトの名無しさん
2006/11/04(土) 20:44:150731デフォルトの名無しさが
2006/11/04(土) 20:47:26{
:
}
function(CCC)ってすれば、function()内で p[xx].BBB[x] が山椒できるんじゃねの?
0732728
2006/11/04(土) 20:48:15{
int box;
box = CCC[50].BBB[5];
}
↑のようにしては、うまく渡せてないみたいなので
どうすればよいのか、わかりません。
どうすればよいのでしょうか??
すいません。うまく説明できなくて。。。
0733デフォルトの名無しさん
2006/11/04(土) 20:52:400734デフォルトの名無しさん
2006/11/04(土) 20:55:490735デフォルトの名無しさん
2006/11/04(土) 20:57:19#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;
}
0736728
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)で渡してます。
何か、根本的に間違っているのかもしれません。う〜ん。
0737デフォルトの名無しさん
2006/11/04(土) 21:03:060738デフォルトの名無しさん
2006/11/04(土) 21:03:540739デフォルトの名無しさん
2006/11/04(土) 21:04:160740728
2006/11/04(土) 21:06:19あまり、かわらないくらいにおもってました。ごめんなさい
0742728
2006/11/04(土) 21:11:35出直してきます。
ありがとうございました。
0743デフォルトの名無しさん
2006/11/04(土) 21:11:420744デフォルトの名無しさん
2006/11/04(土) 21:12:110745デフォルトの名無しさん
2006/11/04(土) 21:12:19オマエにはこのくらいがちょうど良い
どうせあまりかわらないしな
template <std::size_t N>
void DDD(AAA (&CCC)[N])
{
int box:
box = CCC[50].BBB[5];
}
0746デフォルトの名無しさん
2006/11/04(土) 21:12:26出直すな二度とくるな
0747デフォルトの名無しさん
2006/11/04(土) 21:40:120748デフォルトの名無しさん
2006/11/04(土) 22:57:17>>721〜727
system("cls");
で目的は達成できそうです。
どうもありがとうございます!!
winのコンソールは、これでOKなのか。
DOSの時代は、内部コマンドは直接呼べなかったのに。
0750デフォルトの名無しさん
2006/11/04(土) 23:11:35OKだお( ^ω^)
DOSってなんだお( ^ω^)
0751デフォルトの名無しさん
2006/11/04(土) 23:40:020752デフォルトの名無しさん
2006/11/05(日) 00:54:31#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;
}
ってもう解決したかな・・・・
0753デフォルトの名無しさん
2006/11/05(日) 01:53:02変数aに格納したいのですが、それをなるべく簡単に実現する方法はありませんか?
C言語素人なもので、Web上に載っているコードが長くてちょいと覚えられそうに無くて
なるべく簡単なのをお願いしたいのですが・・・。
#include <stdio.h>
main()
{
int a;
a = 「ランダムな1〜3の数」;
ってな感じに・・・。で、起動時に毎回異なる値(必ず異ならなくてもいいけど(偶然同じ値になった
っていうこともあるだろうし)、なるべく異なるようにしたいのですが・・・
ちょっと調べた限りだと時間(Time)を絡めると毎回違う値に出来るみたいですが
コードがどうしても長くなりますかねぇ?簡単に書けないでしょうか?よろしくお願いします。
0754デフォルトの名無しさん
2006/11/05(日) 02:11:460755デフォルトの名無しさん
2006/11/05(日) 02:26:30えっと、どういう意味でしょうか?
0756デフォルトの名無しさん
2006/11/05(日) 02:40:28#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;
}
これで、どうよ?
0757デフォルトの名無しさん
2006/11/05(日) 09:40:45日本語読めねぇのかこのクズは?
0758デフォルトの名無しさん
2006/11/05(日) 10:16:030759デフォルトの名無しさん
2006/11/05(日) 10:47:16time(NULL) % 3 + 1
で充分だろ。
0760デフォルトの名無しさん
2006/11/05(日) 10:58:180761756
2006/11/05(日) 11:42:46#define LOW 0
↓
#define LOW 1
にすれば1〜3の乱数がとれる。
>>753さんこれでどうですか?
0763デフォルトの名無しさん
2006/11/05(日) 14:02:25毎回違う数字って・・・・・・
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;
}
これでどう?
0764デフォルトの名無しさん
2006/11/05(日) 14:25:10教えて頂けないでしょうか?
MAQxxxxx.MP4(xxxxxの部分はアップされた順に00001,00002という感じに)と固定したいんです。
ちなみにC言語とかそういうのはさっぱり分からないんで、どこをどうすれば
良いのか教えて頂ければ幸いです。
http://sugachan.dip.jp/download/uploader.php
perlって書いてあるよ。
0766デフォルトの名無しさん
2006/11/05(日) 14:35:06二度とくるな
0767753
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;
じゃダメなんですかねぇ?
それだと、0〜3になるじゃん。
0769デフォルトの名無しさん
2006/11/05(日) 16:30:27覚えるのはrand()で乱数が得られるということだけだろ…
0770デフォルトの名無しさん
2006/11/05(日) 16:32:28/* hello */
#include <studio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
これを、テキストファイルを拡張子をcに変えたものにMicro soft visual C++で打ち込んでビルドしてみたんですが、インクルードファイルが読み込めませんと出てビルドすることが出来ません。どうすればよいのでしょうか?
0771デフォルトの名無しさん
2006/11/05(日) 16:35:41stdio.hだよおばかさん
0772デフォルトの名無しさん
2006/11/05(日) 16:39:32rand()は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 が含まれる)
0773デフォルトの名無しさん
2006/11/05(日) 17:47:06初心者にありがちなミスだな。studio、スタジオでもステュディオでもなくstdio
stdioってStandard I/Oだよな?
0774デフォルトの名無しさん
2006/11/05(日) 18:37:38デマを流さないように。
DOS時代もちゃんと環境変数COMSPECを見て、シェルにコマンドを渡してたよ。
0775デフォルトの名無しさん
2006/11/05(日) 18:54:41俺は今でもストディオと頭の中で唱えながら打ってる。ストは無声音stであってsutoではないが。
instructionをなんと読む?そう、インストラクションだ。日本語表記だと無声音が表現できないので少しつらい。
radioをなんと読む?そう、レィディオだ。日本語表記ではラジオだが。
stdioをなんと読む?そう、ストディオだ。
間違ってるか?
0776デフォルトの名無しさん
2006/11/05(日) 19:03:14無声音を夢精音って脳内変換した。
あとはそうだな、日本人として正しい流れだとは思う。
オレはスタンダードアイオーヘッダーって読んでるけどな。
0777デフォルトの名無しさん
2006/11/05(日) 19:36:100778デフォルトの名無しさん
2006/11/05(日) 19:37:10俺はインストュルクシュンと読む
0779デフォルトの名無しさん
2006/11/05(日) 19:38:060780デフォルトの名無しさん
2006/11/05(日) 19:55:30stdio
stdlib
stddef
stdarg
0781デフォルトの名無しさん
2006/11/05(日) 20:21:460782デフォルトの名無しさん
2006/11/05(日) 20:45:10えすてぃーでぃお
だなぁ
0783デフォルトの名無しさん
2006/11/05(日) 20:50:220784デフォルトの名無しさん
2006/11/05(日) 21:48:11into_ tmain(int argc, _TCHAR* argv[ ]{ }
の違いがわかりません。
誰か教えてください。お願いします。
0785デフォルトの名無しさん
2006/11/05(日) 21:54:300786デフォルトの名無しさん
2006/11/05(日) 22:38:210787デフォルトの名無しさん
2006/11/05(日) 22:54:55いみうんこなんだけどオレがおかしいのか?
0788デフォルトの名無しさん
2006/11/05(日) 23:14:230789デフォルトの名無しさん
2006/11/05(日) 23:15:42実はそう
だったらどうしようとか思わないのか。
背中にさっと冷たいものが落ちてくるような突然の孤独感、湧き上がる恐怖。
それを感じたが最後二度と彼らの世界に戻ることは出来ないのだ。
ま、どんなに長くても寿命が尽きるまでの辛抱だ。
0790デフォルトの名無しさん
2006/11/06(月) 00:17:04とりあえずすべての点を迎撃可能かを確認し、この集合の場合得られる最高の点は
いくらですってプログラムを作りたいのですが、手助けお願いできませんでしょうか?
得点の部分(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);
}
0791デフォルトの名無しさん
2006/11/06(月) 10:45:02main()
{
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になるのはなぜですか?
無知ですみません。
0792デフォルトの名無しさん
2006/11/06(月) 11:03:320793デフォルトの名無しさん
2006/11/06(月) 11:12:13すみません。なぜ32ビットなんでしょうか?
0794デフォルトの名無しさん
2006/11/06(月) 11:18:160795デフォルトの名無しさん
2006/11/06(月) 11:22:211回目:00000000000000000000000000000001
2回目:00000000000000000000000000000010
3回目:00000000000000000000000000000100
・
・
・
32回目:10000000000000000000000000000000
33回目:00000000000000000000000000000000
0796デフォルトの名無しさん
2006/11/06(月) 11:23:59なるほど、どうもありがとうございます
0797デフォルトの名無しさん
2006/11/06(月) 16:05:53ファイルAにてグローバル変数int a=10;を宣言しました。
ファイルBにてスタティックなグローバル変数static int a=5;を宣言しました。
ファイルB内の関数funca()内でextern int a;を宣言した場合、ファイルBにて宣言したa(今回の場合5)になりますよね?
この場合ファイルBのfunca()の中で、ファイルAで宣言したa(今回の場合10)を使用することは出来ないのでしょうか?
ファイルA
int a=10;
int main(void){
return 0;
}
ファイルB
static int a=5;
funca(){
extern int a;
}
0798デフォルトの名無しさん
2006/11/06(月) 17:16:380799デフォルトの名無しさん
2006/11/06(月) 17:19:10int main{}
int _tmain(int argc, TCHAR* argv[] {}
おそらくこう書きたかったんだろうな。
他にこれもある
int main(int argc, char* argv[] {}
1番目と3番目は標準の書き方で、違いは引数のありなしだけ。
2番目と3番目の違いは第2引数の型。TCHAR型はWindowsプログラミングで使う。
で合ってる?正直C言語暦1ヵ月で自信がない
0800デフォルトの名無しさん
2006/11/06(月) 17:23:382番目と3番目は引数だけでなくエントリーポイントも違う。
0801デフォルトの名無しさん
2006/11/06(月) 21:04:230802デフォルトの名無しさん
2006/11/06(月) 21:18:41Borland C Compilerはごちゃごちゃして使いにくいし
LSI C Compiler試食版はバグあるし制限ありまくりだしコンパイラとしては最悪だし
今の所Cygwinのgccが最高なのですが・・・。
エディタはlcpad( CPad ? 試食版と一緒に使う奴)がかなり使いやすいですが
もっといいのあったら・・・。
Cygwinのコンソールでviを使って書くのは辛すぎる。
色分けもしてくれないし・・・
0803デフォルトの名無しさん
2006/11/06(月) 21:27:23というレスを今年で10回位書いた気がする
vim入れたら?
色分けなんてイラネけど。
0805デフォルトの名無しさん
2006/11/06(月) 21:33:470806デフォルトの名無しさん
2006/11/06(月) 21:34:37あ、忘れた
Virtual PC + Linux + Emacs + gcc
0807デフォルトの名無しさん
2006/11/06(月) 21:37:200808デフォルトの名無しさん
2006/11/06(月) 21:37:30フリーのエディタなんて探せばいくらでもあるだろ。
それはさておき、LSICのバグってなんだ? 一応元関係者みたいなもんだから聞いておきたいのだが。
#つーか、とうとう最悪にされちゃったか。
0809デフォルトの名無しさん
2006/11/06(月) 22:02:14それよりデフォのスタック小さすぎ。
0810デフォルトの名無しさん
2006/11/06(月) 22:02:43MS Visual C++ Toolkit
0811デフォルトの名無しさん
2006/11/06(月) 22:20:41入力された単語の長さを横棒グラフにして表示するプログラムを作成せよ。
横棒グラフは単語の長さだけ'*'を表示する。ctrl + Z が入力されると処理を終了する。
0812デフォルトの名無しさん
2006/11/06(月) 22:30:040813デフォルトの名無しさん
2006/11/06(月) 22:30:42マルチ
0814デフォルトの名無しさん
2006/11/06(月) 22:33:16BCCのどこがごこちゃごちゃ?
gccとかわらんだろ
コマンドライン好きならVCExpressをIDE無しで使うとか
0815デフォルトの名無しさん
2006/11/06(月) 22:34:06MS-Windows の EOF だから
Linux なら Ctrl-D かな
0816デフォルトの名無しさん
2006/11/06(月) 22:35:36入力された単語の長さを横棒グラフにして表示するプログラムを作成せよ。
横棒グラフは単語の長さだけ'*'を表示する。ctrl + Z が入力されると処理を終了する。
なお、『ctrl + Z』はEOFとみなすものとする。
0817デフォルトの名無しさん
2006/11/06(月) 22:35:55BCC のコンパイラが吐くメッセージは分かりやすいので初心者におすすめ。
変なファイルができるのが嫌いだが・・・
0818デフォルトの名無しさん
2006/11/06(月) 22:47:03LSICはよく知らないし別に擁護するわけでもないけど、
バグかどうか分からないのにコンパイラのせいにするのはやめたほうがいいよ。
自分のプログラムに未定義動作または処理系依存の処理があって、他のコンパイラでは
たまたま動いていただけかも。
学生時代に、プログラムが自分の思ったとおりに動かないとすぐに
コンパイラのバグだとヒステリックに騒ぐ困ったちゃんがいたのを思い出した。
0819デフォルトの名無しさん
2006/11/06(月) 23:06:42>他のコンパイラでは たまたま動いていただけかも。
私もそう思う。
http://www.amy.hi-ho.ne.jp/~lepton/program/prog/prog36.html
これの5みたいな奴だろう。
0820デフォルトの名無しさん
2006/11/06(月) 23:18:18K&R ?
0821デフォルトの名無しさん
2006/11/06(月) 23:21:43単語は、いくつ入力できるの?
横棒グラフを表示するタイミングはいつ?
0822どんずまり
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);
}
0823どんずまり
2006/11/06(月) 23:38:34int 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);
}
0824どんずまり
2006/11/06(月) 23:40:061桁+1桁の処理で、2桁以上入力したらエラーになる処理です
0825デフォルトの名無しさん
2006/11/06(月) 23:46:19問題はわかったけど質問はなんだ?
0826どんずまり
2006/11/06(月) 23:50:011桁+1桁を行い合計値を求めると言う問題です。
ただし2桁以上入力したらエラーにしなくてはいけません。
0827デフォルトの名無しさん
2006/11/06(月) 23:57:460828デフォルトの名無しさん
2006/11/07(火) 00:02:30>while(st[c]=getchar())!='\n'{c++;}
ここでバッファオーバーランが起きるのがまずいんじゃね?
つーかここのとこ、いつまでたっても理解してくれないね、君。
475からずっとソース書いてるが・・・
0829デフォルトの名無しさん
2006/11/07(火) 00:05:06初めてプログラミングしたくなったので、C言語でもやろうかと思ってるんですが、
中学生の超初心者にも分かりやすい解説本をいくつか上げてくれませんか?
俺・・・プログラミング経験なし・コードすらみたことなし。厨房三年。
理解力はとぼしいので、私に向いてる御本をいくつか紹介お願いします。
0830デフォルトの名無しさん
2006/11/07(火) 00:05:260831デフォルトの名無しさん
2006/11/07(火) 00:10:28そんな甘い考えを持っているのなら、やらないほうがいい。
せいぜい学校の勉強をしっかりとやること。
なお英語をすらすら読めるようにしておくと便利。
0832デフォルトの名無しさん
2006/11/07(火) 00:10:31あせらなくていいから、もう少し自分が書いた文章を見直して、
それを読んだ人に何が伝わるかを考え直したほうがいい。
コンピュータ言語と自然言語、まったく別のようだが、相手に何かを伝えるという目的は同じ。
自分はこういう"つもり"で言っている、こういう"つもり"で書いている、ではなくて
相手がどのように理解できるかが大事。
君が何を意図していようが、相手はそこに書いてあることしか理解できない。
細かい文法や技術的な知識を身につける必要もあるけど、
それ以前に文章の書き方にも意識を払うようにしたほうがいいよ。
0833デフォルトの名無しさん
2006/11/07(火) 00:13:39マニュアル読もうとしなかった自分もかなり悪いんだろうけど
0834デフォルトの名無しさん
2006/11/07(火) 00:15:07はじめてのCでも読んでみたらどうだろう?
ただ>>831も言ってるように甘くはない
数学の知識と思考力は身につけておいたほうがいい
0835どんずまり
2006/11/07(火) 00:16:31while(st[c]=getchar())!='\n'{c++;}の処理はほぼ毎回使っています。
しかし今回の問題は475とは別の問題です。
画面から1桁入力して1桁だったら問題なし、2桁以上だったら
"INPUTERROR"でもう一度入力しなおしで、
只単に1桁+1桁で関数を使い合計値を求める問題です。
0836デフォルトの名無しさん
2006/11/07(火) 00:16:380837デフォルトの名無しさん
2006/11/07(火) 00:17:52高校受験の勉強を真面目にした方がいいと思うんだが
0838デフォルトの名無しさん
2006/11/07(火) 00:19:18はじめてのCより数学3年らくらく基本問題集買ってくる。
0839デフォルトの名無しさん
2006/11/07(火) 00:19:47最初に読んだ本のおかげか整数使う時はgetsとatoiつかってたよ
0840デフォルトの名無しさん
2006/11/07(火) 00:20:24最後にもう一度だけ聞く。
「プログラムに、どんな不具合が起きているのか説明しろ!!!」
いいかげんにしろ。
0841どんずまり
2006/11/07(火) 00:26:32申し訳ありません、今自宅で環境が無くちょっと説明できません。
0842デフォルトの名無しさん
2006/11/07(火) 00:27:13おまいさんはプログラムの勉強をする前に、やるべきことがある。
・人の話をきく
・客観的に自分の言動を見る
・発言をする前に、自分が何を言おうとしているかを整理する。
などなど。
この件に限らず、実生活の中で「どうして自分の言っていることが、相手は分かってくれないのだろう?」
と感じることが多くないか?
0843デフォルトの名無しさん
2006/11/07(火) 00:28:15プログラミング言語よりも自然言語(日本語など)を身に付けろ。
どんずまりのグダグダを見ていて思った。
0844デフォルトの名無しさん
2006/11/07(火) 00:28:16ツラレテヤガル。
0845デフォルトの名無しさん
2006/11/07(火) 00:43:05#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;
}
0846デフォルトの名無しさん
2006/11/07(火) 00:43:48while(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;
}
こんなんでどう?
文字数もメモリが許す限り何文字でも使える設定にしたかったけど自分の力じゃコレが限界。
コメント無しの汚いソースだけど少しでも参考になれば光栄です。
0847デフォルトの名無しさん
2006/11/07(火) 01:16:28>〜求める問題です。
>>825 は無視?
>>827 も無視?
0848デフォルトの名無しさん
2006/11/07(火) 01:17:44たぶん、以前自分がこのスレで教えてもらったことがあって
今度は自分が誰かの力になれたら、と思っていたんだろうけど、
>>816はマルチポストしてる宿題丸投げの教えてチャンだから、
このスレではスルーするか適切なスレに誘導するほうがいいよ。
あと、816のためでなく845のために言うと、
getsはバッファオーバーフローの原因になるからfgetsを使うようにしたほうがいいよ。
0849デフォルトの名無しさん
2006/11/07(火) 01:38:200850デフォルトの名無しさん
2006/11/07(火) 01:47:38仕様。
0851809
2006/11/07(火) 02:05:10#include <stdio.h>
int main(void) {
printf("Content-Type: text/plain\n\nhoge");
return 0;
}
これだけ。DOS窓では全く正常。
WinXP Pro + Apache2.0
VC++使いだし、別にLSICのせいにするつもりはないね。LSICのバグの話がでたから昔気になったネタを投下しただけ。
0852デフォルトの名無しさん
2006/11/07(火) 02:27:35ttp://www.tnlab.ice.uec.ac.jp/~cdr/misc/doscmd.html
ttp://hpcgi3.nifty.com/mmgames/patio/patio.cgi?mode=past&no=110
ttp://pc8.2ch.net/test/read.cgi/prog/1140086684/344-347
0853デフォルトの名無しさん
2006/11/07(火) 02:36:370854デフォルトの名無しさん
2006/11/07(火) 02:37:513番目のは既知のバグだし。
>851と>852の2番目はXPで不安定と言うことなのかな。
まぁ、16ビット時代の遺物だからねぇ。
0855デフォルトの名無しさん
2006/11/07(火) 02:41:54Turbo C 2.01
Turbo C++ 1.01
好きな方を選べ。
前者は高速、後者はIDE完備。
ttp://bdn.borland.com/museum/
0856デフォルトの名無しさん
2006/11/07(火) 02:43:26下のプログラムで動かしたら、なぜか左上の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];
}}
}}
0857デフォルトの名無しさん
2006/11/07(火) 03:14:55> FFT_y[x][y]=FFT_0[x+i][y+j];
> FFT_y[x+i][y+j]=FFT_1[x][y];
これ見て疑問に感じないか?
0858デフォルトの名無しさん
2006/11/07(火) 03:21:28すみません。どうしてもわかりません。
0859デフォルトの名無しさん
2006/11/07(火) 03:22:470860デフォルトの名無しさん
2006/11/07(火) 03:26:12どうやら>856の目は節穴のようだ。
0861デフォルトの名無しさん
2006/11/07(火) 03:47:07おまいさんは結果をどこに入れたいんだ?
0862デフォルトの名無しさん
2006/11/07(火) 03:51:19次のループで再びFFT_1からFFT_yにコピーしようとしている。
しかも、FFT_yが32*32しかないからバッファオーバフローしてしまう。
恐らく、二番目の代入先はFFT_0のtypoじゃないのか?
0863デフォルトの名無しさん
2006/11/07(火) 03:55:23初心者がやるなら、先ず初めにどちらが良いですかね?
0864デフォルトの名無しさん
2006/11/07(火) 04:38:14つぶしの利きは明らかにCの方が高い。
VB持ってるならVBやれ。
特に環境の持ち合わせが無いならCやれ。
0865デフォルトの名無しさん
2006/11/07(火) 06:43:48評価のタイミングはいつになるんだろう?
今もってる参考書を調べてみたら
「引数への副作用はすべて関数が呼び出される前に効果を生ずると規定されている」(K&R P66)
って書かれているんだけどこれは
例えばprintf("%d %d",a+b,c+d)ってあった場合printf関数が実行されるまえに、
順番は不定だけど引数a+b,c+dが評価されてその値が関数に渡されるって認識でおk?
0866デフォルトの名無しさん
2006/11/07(火) 08:09:040867デフォルトの名無しさん
2006/11/07(火) 11:18:05二次元配列で
bouble matrix[1000][1000];
といった風に表現しようとしても、プログラムの実行ができません。
(配列は連続した領域にメモリを確保する為、大きな行列だと確保できない?)
このような大きい行列を表現したい場合、どのようにすればよろしいでしょうか?
0868デフォルトの名無しさん
2006/11/07(火) 11:26:18スタックオーバーフローという。あまり巨大な領域はスタックには確保できない。
ヒープで確保せよ。つまり、malloc()を使え。ただし、多次元配列は自分で
シミュレーションすることになる。
0869デフォルトの名無しさん
2006/11/07(火) 11:47:140870デフォルトの名無しさん
2006/11/07(火) 11:50:05static を付けろ。
typedef int bouble;
static bouble a[1000][1000];
0871デフォルトの名無しさん
2006/11/07(火) 12:11:57適当な事教えてんじゃねーよ猿
0872デフォルトの名無しさん
2006/11/07(火) 12:34:19適当か? staticな変数もヒープに置かれると
思ってたが
0873デフォルトの名無しさん
2006/11/07(火) 12:37:46コンパイラ & 環境次第。
ヒープ使うとは限らないよ。
未初期化か初期化されているか?でも微妙に領域違うし。 (@VC++)
0874デフォルトの名無しさん
2006/11/07(火) 12:47:32staticで解決することもあると思うが
0875874
2006/11/07(火) 12:54:43スタックサイズがでかい環境ならば実行できるだろう
サイズが1Mを超える配列はmallocでヒープを使ったほうが安全
0876デフォルトの名無しさん
2006/11/07(火) 12:58:530877デフォルトの名無しさん
2006/11/07(火) 13:19:080878デフォルトの名無しさん
2006/11/07(火) 14:01:52いいかもしれないかもしれない
0879デフォルトの名無しさん
2006/11/07(火) 14:19:40「抜き出す」ってどういうことだよ?
単語の集合である文をそのまま表示するのと
どういった違いがあれば良いんだ?
0880デフォルトの名無しさん
2006/11/07(火) 14:34:30これだけの設問でも答えることは可能だろ。
0881デフォルトの名無しさん
2006/11/07(火) 15:12:04あなたがドゾー
0882デフォルトの名無しさん
2006/11/07(火) 19:24:350883デフォルトの名無しさん
2006/11/07(火) 20:28:470884デフォルトの名無しさん
2006/11/07(火) 21:59:40http://journal.mycom.co.jp/special/2004/sfu/007.html
Cygwinの方がいい
0885デフォルトの名無しさん
2006/11/07(火) 22:10:04「このプログラム、どうしてもうまく動いてくれないんですよ」
「それで?」
「自分としては、絶対に間違っているところは無いんですけど」
「だったら、動くはずだねぇ」
「でしょ? だから、これってコンパイラにバグがあるんじゃないか、と」
「(そんなこと言うやつに限って、自分のプログラムにバグがあるんだよな) じゃあ、試しにccじゃなくて、gccでコンパイルして見たら?」
「やってみたんですけど、やっぱり駄目なんです」
「じゃあ、やっぱり君のプログラムにバグがあるんだよ」
「そんなはず無いんですけどねぇ・・・動きがおかしいのは、たった数行の関数ですし」
「どれ、見せてみろよ。あー、この『if (s == "hogehoge")』って絶対、真にならんぞ」
「え、何でですか。sが"hogehoge"のときに真になるじゃないですか」
「お前なぁ、何年Cでプログラミングしているんじゃ。もいっかい、勉強し直せ!」
これが分からない。
どうして絶対真にならないの?s の中身がhogehogeの時に真になるんじゃ?
0886デフォルトの名無しさん
2006/11/07(火) 22:15:38プログラムによっては絶対にならないこともあるだろな。
0887デフォルトの名無しさん
2006/11/07(火) 22:18:49if ("hogehoge" == "hogehoge")
これを「最適化無し」で試してみろ。
0888デフォルトの名無しさん
2006/11/07(火) 22:22:090889デフォルトの名無しさん
2006/11/07(火) 22:24:460890デフォルトの名無しさん
2006/11/07(火) 22:27:33#define s 1 || ""
0891デフォルトの名無しさん
2006/11/07(火) 22:34:23よう一休さん
0892デフォルトの名無しさん
2006/11/07(火) 22:34:30char* s = "hogehoge";
if(s=="hogehoge")
で真になるかもしれないね。
alias gcc='icc -Gf'
とやっとけば完璧か。
0893どんずまり
2006/11/07(火) 22:35:02どんなエラーが出るかと言うと、1つ目の数字の入力でわざと20以上入力すると
配列の桁数オーバーで、セグメンテーションエラーと出力されます。配列の領域を
変更せずにセグメンテーションエラーが出ない方法は無いでしょうか?
ちなみにintの桁数オーバーは回避できました。
メイン関数は前回と一緒です。
2つの関数だけ変更しました。
0894どんずまり
2006/11/07(火) 22:36:34char str[20+1];
int number;
for(;;){
func(str,&number);
if(number>9){
printf("INPUTERROR\n");
printf("もう一度入力してください\n");
continue;
}else{
break;
}
}
}
0895デフォルトの名無しさん
2006/11/07(火) 22:36:43fprintfでぐぐれ
0896どんずまり
2006/11/07(火) 22:37:54char str[20+1];
int number;
for(;;){
func(str,&number);
if(number>9){
printf("INPUTERROR\n");
printf("もう一度入力してください\n");
continue;
}else{
break;
}
}
}
0897どんずまり
2006/11/07(火) 22:39:18char str[20+1];
int number;
for(;;){
func(str,&number);
if(number>9){
printf("INPUTERROR\n");
printf("もう一度入力してください\n");
continue;
}else{
break;
}
}
}
0898デフォルトの名無しさん
2006/11/07(火) 22:42:23いやそれは普通に真だろ。
0899デフォルトの名無しさん
2006/11/07(火) 22:43:490900デフォルトの名無しさん
2006/11/07(火) 22:46:58あとアップローダを使って欲しい。
0901デフォルトの名無しさん
2006/11/07(火) 23:09:51......
0902デフォルトの名無しさん
2006/11/07(火) 23:39:000903デフォルトの名無しさん
2006/11/07(火) 23:40:33つまらないからさ
0904デフォルトの名無しさん
2006/11/08(水) 00:00:52鈍図マリ(ドジっ娘)
0905デフォルトの名無しさん
2006/11/08(水) 00:11:050906デフォルトの名無しさん
2006/11/08(水) 00:13:45鈍頭 真理
0907デフォルトの名無しさん
2006/11/08(水) 00:43:300908デフォルトの名無しさん
2006/11/08(水) 00:54:45#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");
0909908
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;
}
0910908
2006/11/08(水) 00:57:49int 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行目の何処が違うか
わからないので、ご指摘お願いします。
0911デフォルトの名無しさん
2006/11/08(水) 01:04:45'r' に代入した値は使われていない
0912908
2006/11/08(水) 01:09:21何処をどうすれば、宜しいでしょうか?
0913デフォルトの名無しさん
2006/11/08(水) 01:13:21この値を何に使いたいんだい?
自分ではどういうことををしたつもりでこれを書いたの?
0914デフォルトの名無しさん
2006/11/08(水) 01:17:420915908
2006/11/08(水) 01:20:40ありがとうございます。
最後にrを返すつもりで書きました。
0916デフォルトの名無しさん
2006/11/08(水) 05:20:46C言語の演算で、
int a=2000
int b=150000
int c=50
int sum
とあった場合、
sum = a * b * (c * 0.01)
の結果が0になることはあるんでしょうか?
0917デフォルトの名無しさん
2006/11/08(水) 05:50:130918デフォルトの名無しさん
2006/11/08(水) 05:56:11この場合だとないよ。
最後の代入以外の演算ではそれぞれintがdoubleに型変換されて計算される。
最後の代入の際は左辺の型にあわせて代入されるため小数の部分の情報は失われることになる。
今回の場合はsumに代入する値が150000000.0になっているから0になることはない。
(ただしprintf("%d",sum);とした場合に、150000000と表示されるかはわからない。環境による。)
また、もし仮に
int a=2;
int b=1;
int c=5;
だとしたらsumに代入する値が0.1になるため0になる。
0920デフォルトの名無しさん
2006/11/08(水) 09:05:32└─┘ └──┘
int double
└─────┘
double
じゃねーの?
環境によってはa*bでオーバーフローするじゃん
0921デフォルトの名無しさん
2006/11/08(水) 09:12:080922デフォルトの名無しさん
2006/11/08(水) 09:19:020923デフォルトの名無しさん
2006/11/08(水) 10:10:58配列で初期化した配列要素の合計値を出したいのですが、
例 int a[5] = {1,2,3,4,5} ←この合計値を出したい!
僕だとa[1]+a[2]+a[3]... という式しか浮かばないのです。
もっとシンプルにできないものでしょうか?
0924デフォルトの名無しさん
2006/11/08(水) 10:17:32int ic, sum = 0;
for (ic = 0; ic < sizeof(a) / sizeof(int); ic++)
sum += a[ic];
0925デフォルトの名無しさん
2006/11/08(水) 10:21:31それのどこが『もっとシンプルに』なんだよ?
0926デフォルトの名無しさん
2006/11/08(水) 10:24:10>例 int a[5] = {1,2,3,4,5} ←この合計値を出したい
int a[5] = {1,2,3,4,5};
int goukei = 15;
0927デフォルトの名無しさん
2006/11/08(水) 10:26:22これ見ると判るけど多分釣りだろうな。
0928デフォルトの名無しさん
2006/11/08(水) 10:33:50ループカウンタごときに2文字も使うな。
ディスクの無駄。
0929デフォルトの名無しさん
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}の中を足すやり方があるん
だろうか?ということです。。
0930デフォルトの名無しさん
2006/11/08(水) 10:41:52それもまちがっとるぞ a[0]+a[1]+a[2]+a[3]+a[4] な。
(即値だけの要素を持つ)配列の初期化と同時に合計を(できれば即値で)得る か。
マクロでどうこうできるようなもんでもなさそうだな。
>>924 のように、素直にコード書くしかないんじゃね?
0931デフォルトの名無しさん
2006/11/08(水) 10:57:57for と sizeof か、もう少し考えて見ます。。
0932923
2006/11/08(水) 11:45:58int 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;
}
0933デフォルトの名無しさん
2006/11/08(水) 11:59:39さらに汎用性を持たせたかったら>>924
一番良いのは>>926
0934デフォルトの名無しさん
2006/11/08(水) 13:52:340935デフォルトの名無しさん
2006/11/08(水) 14:08:100936デフォルトの名無しさん
2006/11/08(水) 14:29:030937デフォルトの名無しさん
2006/11/08(水) 17:17:090938デフォルトの名無しさん
2006/11/08(水) 17:21:52ARモデルとARMAモデルの式のプログラムが起動しません。
助けてください。
0939デフォルトの名無しさん
2006/11/08(水) 17:37:20起動の仕方が悪いんじゃないか
0940デフォルトの名無しさん
2006/11/08(水) 18:12:24が、起動しないだけじゃ >>939 としか答えようがないな
0941923
2006/11/08(水) 20:57:36{
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とかは仮の数ですが・・
上の文はエラーこそでないのですが、まともに出力できません。
続けて申し訳ないのですが、文としてどこかおかしいでしょうか?
0942923
2006/11/08(水) 21:01:06関数の中で加算して結果を返し、さらにその関数を
呼び出して結果を表示することです。
0943デフォルトの名無しさん
2006/11/08(水) 21:10:40まともに出力できないとはどういう意味だ?
それと num1,num2 の初期値入れないのはなぜ?
0944デフォルトの名無しさん
2006/11/08(水) 21:11:40変数の中身が初期化されてないので、確保したアドレスに入ってたものが表示されてる。
int num1=0 , num2=0 , sum=0;
とかするか、scanfで入力させる
この程度ならz要らないな。(あくまでこの程度の場合)
戻り値を関数内で表示ってのは個人的には汎用的でなくて嫌
0945デフォルトの名無しさん
2006/11/08(水) 21:46:28system("cls")
みたいな、system("〜")は他に何かありますか?
0946デフォルトの名無しさん
2006/11/08(水) 21:48:090947デフォルトの名無しさん
2006/11/08(水) 21:54:48windowsでおねがいします
0948923
2006/11/08(水) 21:55:48{
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;
}
参考にさせてもらいながらこうして見ました。
汎用的ですか、。それを考えられるレベルになれるように
頑張ります。
0949デフォルトの名無しさん
2006/11/08(水) 21:59:05このほうがいいって事
関数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;
}
0950デフォルトの名無しさん
2006/11/08(水) 22:03:170951デフォルトの名無しさん
2006/11/08(水) 22:11:01system("echo ahoka")
0952923
2006/11/08(水) 22:31:39ありがとうございました。
0953デフォルトの名無しさん
2006/11/08(水) 22:38:00printfとscanf合わせて入力用関数とか作ったりしない?
0954デフォルトの名無しさん
2006/11/08(水) 22:38:090955デフォルトの名無しさん
2006/11/08(水) 22:40:02それぞれいくらのメモリ領域を確保するのでしょうか?
sizeof関数で見れたような気がするのですが
現在C言語が動く環境にないのでお願いしたいと思いますorz
0956デフォルトの名無しさん
2006/11/08(水) 22:41:13このfuncって足すだけなら演算子でよいと思うけど
関数にしろっていうお題なの?
0957デフォルトの名無しさん
2006/11/08(水) 22:41:44環境による!
0958デフォルトの名無しさん
2006/11/08(水) 22:49:20だと思われ
>>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] …
という感じで、型の大きさ分ずつ番地が増えていく
0959955
2006/11/08(水) 22:49:39ご回答ありがとうございます。
ちなみに問題は配列データの計算時のキャッシュ-メモリ間の
ページフォルト回数を求めるようなもので、ハードウェアに関するものです。
「ブロックサイズは4語。intの大きさを1語とする」という一文だけあったのですが、
それではつまり具体的なサイズはともかくintの何倍かということは言えるのでしょうか?
0960デフォルトの名無しさん
2006/11/08(水) 22:58:54問題文に明記がないならそうとらえていいと思うぞ
0961960
2006/11/08(水) 23:05:03>ブロックサイズは4語。intの大きさを1語とする
というか1ブロック4語
int 4つ分と明記されてるではないか
(intの4倍のサイズで1ブロック)
0962955
2006/11/08(水) 23:14:02番地が増えていくというのは連続的な位置に確保されるという意味ではなく
a[0][0]のサイズよりa[n][m]のサイズの方が大きくなるということでしょうか。
ほんとに環境によりますねorz
>>960
そういう意味だったのでしょうかorz
ブロックは1度に扱う量であり配列のサイズはまた別かと思ってました。
ちなみに全文です。
http://purelove.chu.jp/imgboard/img-box/img20061108231246.jpg
0963960
2006/11/08(水) 23:25:11>ブロックは1度に扱う量であり
そういう意味だよ
つまり一度に扱う量が1ブロック(int 4つ分)ってこと
でメモリ領域は int a[n][n] なら n×n ×sizeof(int) の連続領域が割り当てられる
0964デフォルトの名無しさん
2006/11/08(水) 23:26:39たぶん連続(4バイトならデータは連続だがアドレスは4刻み)
a[0][0]もa[n][m]も型が同じならサイズも同じ
つか、問題文イミフwwwwこんなんわかんねwwwww
0965960
2006/11/08(水) 23:32:24たぶん>>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 )、・・・・・ と続く
0966デフォルトの名無しさん
2006/11/08(水) 23:35:46文字列に "(” と ")" は\のエスケープ文字は必要ないですよね。
以下の例は、正しいでしょうか。
例:
char strings[] ="123(456)789";
0967デフォルトの名無しさん
2006/11/08(水) 23:37:100969955
2006/11/08(水) 23:42:12なんかよく分かりました。そういやa[][]も今回はintですよねorz
というか適当に、intと同じサイズにしたれやと思って既に進めていたのでこれで安心しました。
ありがとうございました。
0970デフォルトの名無しさん
2006/11/08(水) 23:54:20>>968
試したら、問題なく動作しています。どこかに書き物があれば教えていただきたかったです。
0971デフォルトの名無しさん
2006/11/08(水) 23:55:26今番号と名前を作成して、3件分データを入力したあとにデータ表示をするプログラムを作成しています。
その際、すでに入力された番号が入力された場合エラーとして再入力をさせたいのですが上手くいきません。
どなたか教えてくださいm(_ _)m
0972923
2006/11/08(水) 23:56:33はい、funcという関数を作るという指定です。
0973デフォルトの名無しさん
2006/11/08(水) 23:56:53オナる前に女児ぱんつ履く。これ異常
0975デフォルトの名無しさん
2006/11/09(木) 00:00:00ソース晒せ
とりあえず、番号が特殊な書式ではない、ただの整数なら配列(-1とかで初期化)にでもいれて全部比較でもしろ
0976デフォルトの名無しさん
2006/11/09(木) 00:05:21ドキュメントのことです。
0977デフォルトの名無しさん
2006/11/09(木) 00:06:31具体的に分からないのはどこ?アルゴリズムから?
どれぐらい形になってるの?
0978デフォルトの名無しさん
2006/11/09(木) 00:08:14ソースを晒したいのですがPCが壊れてしまって携帯からの書き込みなんですm(_ _)m
明日学校で作成するので、番号の重複エラーの処理のヒントを教えていただけないでしょうか。
0980デフォルトの名無しさん
2006/11/09(木) 00:12:22char *str;
int i=100;
sprintf(str,"%d",i);
で実行したところstrには100という文字列が格納されました。
しかし、上記のstrはstr[100]などと
明示的に領域を確保したほうがよいのでしょうか?
0981デフォルトの名無しさん
2006/11/09(木) 00:12:58入力する番号の書式による
0982デフォルトの名無しさん
2006/11/09(木) 00:16:40確保するべき
0983デフォルトの名無しさん
2006/11/09(木) 00:17:02一応番号が重複するエラー以外は完成しています。
同じ番号を入力した場合エラーを出す処理のイメージがなかなかわかなくて…
0984デフォルトの名無しさん
2006/11/09(木) 00:17:45確保しないとメモリのどっかに上書きされると思うけど・・・
それが大事なデータだったり実行中のプログラムだったりしないことを祈る。
0986デフォルトの名無しさん
2006/11/09(木) 00:27:58返答ありがとうございます。
PCを直してから出直してきますm(_ _)m
0987デフォルトの名無しさん
2006/11/09(木) 00:30:19char *str;
int i=100;
sprintf(str,"%d",i);
printf("%d",i);
をやって味噌。
0988987
2006/11/09(木) 00:31:210989デフォルトの名無しさん
2006/11/09(木) 00:31:59C言語なら俺に聞け(入門篇) Part 4
http://pc8.2ch.net/test/read.cgi/tech/1162999861/
0990デフォルトの名無しさん
2006/11/09(木) 00:34:05>>984の言う通り
あと、ちょうどこんなレスも見つけた
http://pc8.2ch.net/test/read.cgi/tech/1162771475/213
上では単に他のバッファが上書きされているだけだけど、
もし、その場所に重要なデータがあったり、関数の戻り先とか実行するコードがあると、
それはもう大変な事に
いわゆる鼻から悪魔
>>983
番号と名前をペアにした構造体に入れて、
0で初期化した配列に先頭から順に格納
番号が入力されたら配列を先頭から順にチェック
ぬるぽを見つけたらそこに構造体を格納
0992デフォルトの名無しさん
2006/11/09(木) 00:44:59memsetとかでヌル初期化してるけどあれってやったほうがいいんですか?
0993955
2006/11/09(木) 00:51:13こんなんでどうだろ?
超ド素人が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);
0994デフォルトの名無しさん
2006/11/09(木) 00:55:30特に意味不明なほどメンバが多い構造体とかバッファとか
それでも人によると思う
ところで、
HOGE hoge = {0};
みたいな初期化ってCでも使えたっけ?
使えるならこっちの方がいいと思うが
0995960
2006/11/09(木) 00:55:49好き好きで
「予期しない値」が困る場合に使えばいい
たとえばWinAPIのリターン用に構造体を渡すときなどは 0 で初期化する必要があったりする
0996デフォルトの名無しさん
2006/11/09(木) 00:56:33用途による
初期化されてないのがポインタだと
別のところで使うときに
NULLとの比較ではじけないので
不正なデータにアクセスしそう
0997デフォルトの名無しさん
2006/11/09(木) 00:57:27気持ちの問題。憂鬱なときは避ける。
デバッガで変数見るときに見栄えがいい。
冗談はさておいても、
メモリコピーでヌル文字を最後に付け加えておく記述をし忘れたときなんかのバグ抑止になる。
0999デフォルトの名無しさん
2006/11/09(木) 00:59:131000デフォルトの名無しさん
2006/11/09(木) 00:59:4210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。