1 :
デフォルトの名無しさん :
2005/10/12(水) 00:07:44 ・ココは他のスレでは煽られてスルーされるような質問をするスレです。 ・最低でもC言語が何か分かってる人でお願いします。 ・質問者は自分の環境をわかる範囲で書きましょう。 優しい方々が答えてくれることを期待してます。
またか・・・
うんこー
4 :
デフォルトの名無しさん :2005/10/12(水) 00:21:13
環境:WINDOWS SEXP 64BIT EDITIONE コンパイラ(ぷよぷよ):VISUAL STDIO 20003 #include<studio.h> int main(void) { printf(”hello,work”);
C言語の標準ライブラリをJavadocのような形式で読みたいんですけど、doxygenみたいなソフトウェアを使えばできるんですか?
_━━━━━━_ _━━━━━━_ _━ ━_ _━ ━_ _━ ━_ _━ ━_ ━ ○ ━ ━ ○ ━  ̄━ ━ ̄  ̄━ ━ ̄  ̄━ ━ ̄  ̄━ ━ ̄  ̄━━━━━━ ̄  ̄━━━━━━ ̄ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ━ ━━ __ __ ━━  ̄━ ━━__ __━━ ━ ̄  ̄━ ━__ __━ ━ ̄  ̄━ ━━━━━━ ━ ̄  ̄━ ━ ̄  ̄━_ _━ ̄  ̄━_ _━ ̄  ̄━━━ ̄
7 :
デフォルトの名無しさん :2005/10/12(水) 21:27:13
あのー。。。ネットで知り合って友達になったひとにC言語始めようと思ってると言ったら
なんかこんなファイルくれました。その人がいうにはそれあればほとんどのものがつくれるとか。
でも使おうにも意味不なもんなのでコレがなにか誰か教えてください。コンバイルっていってたかも・・?
http://www4.pf-x.net/~what/
8 :
デフォルトの名無しさん :2005/10/12(水) 22:12:06
>>7 Microsoft Visual C++ 6.0 Professional Edition (Japanese)
今日、C言語の試験があった 絶望を感じた・・・
10 :
デフォルトの名無しさん :2005/10/12(水) 23:33:45
戻り値と引数がよくわかりません!
11 :
デフォルトの名無しさん :2005/10/13(木) 00:06:27
>>8 マジデスカ; 使い方っていうかコレ開いて使うものなのかコマンドプロントとかでアレをするのか分かんないんですが;
誰か教えてください orz
ちょっとなんかヤバそうなので一旦7のを外しときます
12 :
デフォルトの名無しさん :2005/10/13(木) 10:07:27
複数の任意の文字数の単語を出力として辞書順に並べるプログラミングを教えてください。
13 :
デフォルトの名無しさん :2005/10/13(木) 10:09:54
まずは単語の定義から
14 :
デフォルトの名無しさん :2005/10/13(木) 17:33:12
すいません,文字列とポインタについて教えてください. char word[32] = "hello, world!"; char *ptr; ptr = word; printf("%s\n", word); printf("%s\n", &ptr); printfの上はふつうに表示されるのに下は文字化けします. 数値(%d),一つの文字(%c)では正常に表示されます. 文字列の場合は単純に先頭のアドレスをprintfに渡してもダメならば どう扱うべきなのでしょうか?
>>14 ptrはポインタだから、printf("%s\n", ptr);でいい。
16 :
14 :2005/10/13(木) 18:21:49
>>15 あ,できました!
ありがとうございました.
>>12 int main(){
set<string> in(istream_iterator<string>(cin), istream_iterator<string>());
copy(in.begin(), in.end(), ostream_iterator<string>(cout));
}
18 :
17 :2005/10/13(木) 18:44:22
しまったC++スレじゃなかったスマソ
19 :
デフォルトの名無しさん :2005/10/13(木) 23:16:27
C言語を基礎の本を買って勉強したのですが、計算ツールくらいしか作れません。 なにをどう勉強すればよいのでしょうか? だれか教えてください。
一生計算ツール作ってろよ
ひでぇ・・・!
23 :
デフォルトの名無しさん :2005/10/18(火) 23:39:14
すいません。質問です。 ある駐車場があって、そこでは一時間駐車すると500円とられ それから30分ごとに料金が200円追加される。 分単位で時間を入力したときにそのときの料金を表示させる。 このようなプログラムを作りたいのですが、どのようにすればいいか考え付きません。 めっちゃ基礎の範囲ですが、どなたか教えてください。
#include <stdio.h> int Ryokin(int hun){ if(hun <= 60) return 500; else return ((hun - 31) / 30) * 200 + 500; } int main(void){ int n; printf("時間を入力してください(分)\n"); scanf("%d",&n); printf("%d円になります。\n",Ryokin(n)); return 0; } どちらかというと良心的な駐車場
26 :
デフォルトの名無しさん :2005/10/19(水) 00:36:01
プログラムを実行したら、起動中のテキストやワードなどに、指定しおいた文字や数字を 入力するプログラムを作りたいのですが、できますか?
29 :
851 :2005/10/19(水) 01:39:52
30 :
デフォルトの名無しさん :2005/10/19(水) 15:04:10
超初心者ですいません。 大学のプログラミングの授業でC言語をならいはじめたんですが、講義形式の授業なのでさっぱりわけがわかりません。 自分でプログラム打って動かしたら理解ができそうなんですけど、 C言語をプログラミングできるソフトってネット上で手にはいりますか?
現実世界では面と向かって人間と会話できない駄目人間なんだよきっと
33 :
デフォルトの名無しさん :2005/10/19(水) 15:17:09
役たたね
たちたくもない(君の役には)
小学生でも予習復習ぐらいするぞ
それがどうした?
38 :
デフォルトの名無しさん :2005/10/19(水) 20:26:15
学校の宿題なんですけどまったくわかりませんorz どなたか教えてくださいm( __ __ )m @円柱の体積を求めるプログラムを作りなさい ただし半径と高さはキーボードから入力する(変数の型をfloatにする) A時速(km/時)をキーボードから入力し、時速(m/秒)に変換して出力するプログラム作りなさい (変数の型をfloatにする) 以上の2問でつ お願いします
39 :
デフォルトの名無しさん :2005/10/19(水) 20:35:25
40 :
Ω :2005/10/19(水) 20:54:25
program cal_vol real r,h,v write(6,*) 'radius?' read(5,*) r write(6,*) 'hight?' read(5,*) h v=3.14159264*r*r*h write(6,*) 'Volume=',v stop end program convert_from_km/h_to_m/s real s1,s2 write(6,*) 'speed? [km/s]' read(5,*) s1 s2=s1/3.6 write(6,*) s2,'[km/h=',s,'[m/s]' stop end
ぁ,ミスってらww
後はこれをC言語に変えるだけwww
>>38
42 :
38 :2005/10/19(水) 21:17:08
そりゃそうだFortranなんか教えているところが残っているのかどうかw
44 :
38 :2005/10/19(水) 22:29:53
Fortran? 聞いたことがないでつorz 上の2個の問題はなんとか自分で解けました
いまでもスパコンはFORTRANだろ まああれをFORTRANと呼ぶのが正しいのかどうかは疑問だが
47 :
デフォルトの名無しさん :2005/10/20(木) 00:05:53
すみません、本気で誰か助けてください…。 「0〜1の擬似乱数を30000個ずつ3行発生させるプログラム」がどうしてもできません…。 誰か教えてください…。 「1〜100の擬似乱数を10個ずつ10行」はできたのですが、それを変えてもうまくいきません。 一応、これがそのプログラムです #include <stdlib.h> #include <stdio.h> #include <time.h> int main(void) { int i,j; /* 乱数系列の変更 */ srand((unsigned) time(NULL)); /* 1〜100の擬似乱数を10個ずつ10行発生 */ for (i=1; i<=10; i++) { for (j=0; j<10; j++) { printf("%3d ",rand()%100+1); } printf("\n"); } return 0; } どうかよろしくオナガイシマス……。 ちなみに富士通Fortranを使っています。
しかし面白く無いネタだなぁ。
>>47 何がどう駄目なのか、それを書かないと誰も回答できんよ?
50 :
47 :2005/10/20(木) 01:29:47
いきなりの質問ですいませんでしたm(_ _)m゛
私は
>>47 に書いた「1〜100の擬似乱数を10個ずつ10行発生」のプログラムを書き換えたら、「0〜1の擬似乱数を30000個ずつ3行発生」もできるような気がしてるんですが…
どこをどう書き換えたらうまくいくのかわかりません…。
それとも、書き換えるだけでは駄目ですか??
すみません、よろしくお願いします…。
>>50 そもそも
>>47 のプログラムを理解してないんじゃない?
なんかの丸写しだろ?
それじゃあ教えようすらないよ
しっかし面白く無いネタだよなぁ。
富士通FortranってCもできるの?
Fortran&Cってのがある
>>47 2つの問題の違いを見ていけば、自然と答えが出るのでは。
「10」個を「30000」個に、「10」行を「3」行に、「「1〜100」を「0〜1」にっていう部分しか違わないじゃない。
プログラム中に出てくる数字も限られてるんだし、どこを書き換えればいいかはわかるでしょう。
for文とrand、srandがわかってないなら入門サイトなり授業だか研修だかで使ってる本なりを見れば
載ってるかと。
ちなみに rand()%5 の%は剰余(割ったあまり)を計算するものだから、0〜4の値になります。
>>55 実は整数値でなくなるので若干の質的な変更も必要な罠。
57 :
デフォルトの名無しさん :2005/10/22(土) 17:08:17
質問です。。 どうしても大文字に変換したものと小文字に変換したものが表示されません。 data.inというファイルがあるというものとして教えてください。 分割して書き込みます #include<stdio.h> #include<stdlib.h> #include<string.h> int capital(int); int small(int); int main(void) { int i; FILE *inp,*outp; /*入力ファイルのオープン*/ if((inp=fopen("data.in","r"))==NULL) { printf("can't open -- data.in\n"); exit(EXIT_FAILURE); } /*出力ファイルのオープン*/ if((outp=fopen("prog02.out","w"))==NULL) { printf("can't open -- prog02.out"); exit(EXIT_FAILURE); }
58 :
デフォルトの名無しさん :2005/10/22(土) 17:09:03
/*ファイルへ出力*/ fprintf(outp,"通常データ\n"); while((i=fgetc(inp))!=EOF) { putc(i,outp); } fprintf(outp,"\n大文字に変換\n"); while((i=fgetc(inp))!=EOF) { putc(capital(i),outp); } fprintf(outp,"\n小文字に変換\n"); while((i=fgetc(inp))!=EOF) { putc(small(i),outp); } /*ファイルのクローズ*/ if(fclose(inp)) { printf("\nfailed to close a file\n"); } if(fclose(outp)) { printf("\nfailed to close a file\n"); } return EXIT_FAILURE; }
59 :
デフォルトの名無しさん :2005/10/22(土) 17:12:06
/* 小文字 → 大文字 */ int capital(int moji) { int diff,i; diff='a'-'A'; if('a'<=moji && moji<='z') { return moji-diff; } return moji; } /* 大文字 → 小文字 */ int small(int moji) { int diff; diff='a'-'A'; if('A'<=moji && moji<='Z') { return moji+diff; } return moji; }
60 :
デフォルトの名無しさん :2005/10/22(土) 17:22:33
以上です。 宜しくお願いします。
>>57 最初の「通常データ」のループで入力ファイルを終端まで読み込んでいるので、
その後巻き戻さない限りもう読めるものがないという状況になっているだけ。
いや寧ろ、素直に巻き戻し(rewind())
もちっと親切に書くと a. クローズして再オープンする or b. fseek()を調べろ
>64 rewind()の立場は?
66 :
57 :2005/10/22(土) 17:36:53
色々ありがとうございます!! 巻き戻しの作業について調べたいと思います!
67 :
57 :2005/10/22(土) 17:52:28
>>57 です!
今コンパイルして実行してみたら、ちゃんと思い通りに動いてくれました!!
本当にありがうございました!!
物凄い悩んでいたから本当にうれしい。
68 :
デフォルトの名無しさん :2005/10/22(土) 19:32:52
すいません質問です。 nを入力させて 1+3=4=2^2 1+3+5=9=3^2 …というようにn番目の奇数までを足していって 上のように表示させるのって出来ますか?forかwhileで
>>68 //sum = 0 ;
for (i = 1; i <= n ; i ++)
{
// sum += 1 + 2 * (i - 1) ;
printf ("%d", 1 + 2 * (i - 1)) ;
(i != n) ? putchar ('+') : putchar ('=') ;
}
printf ("%d^2\n", n) ;
これでどうです?
70 :
68 :2005/10/22(土) 20:00:26
>>69 さんどうもです。実行したところ
nを4として
1+3+5+7=4^2とでました。
しかし自分はn=4としたら
1=1^2
1+3=2^2
1+3+5=3^2
1+3+5+7=4^2
というように設定したnより小さかった場合も
表示したいのですがこういうのはできませんかね?
>>70 そのぐらい自分で書けないでどうしますか。
方針:
・>69を関数にする。
・1からnまでのループを作り、その中で上記関数を呼ぶ。
72 :
デフォルトの名無しさん :2005/10/22(土) 20:19:11
>>71 関数つかわないでやるのはむりですか?基本的にforとwhileだけで。
>>72 んじゃ、関数化しないで変数名が競合しないように気をつけて書きな。
// m = 4 for(n = 1; n <= m; n++){ for (i = 1; i <= n ; i ++) { printf ("%d", 1 + 2 * (i - 1)) ; (i != n) ? putchar ('+') : putchar ('=') ; } printf ("%d^2\n", n) ; }
まあ、スレッドがスレッドだし.....。
76 :
72 :2005/10/22(土) 20:58:59
>>74 すいません。実行してみたんですがエラーメッセージでないのになにも動かなかったです。
もう一回やってみます。
//m=4ていうのはmが4までやるってことですよね?
>>76 単に変数名変えるのがめんどうだっただけ
#include <stdio.h>
int main(void){
int i,n,m = 4;
for(n = 1; n <= m; n++){
for (i = 1; i <= n ; i ++)
{
printf ("%d", 1 + 2 * (i - 1)) ;
(i != n) ? putchar ('+') : putchar ('=') ;
}
printf ("%d^2\n", n) ;
}
return 0;
}
78 :
76 :2005/10/22(土) 23:33:55
出来ました!皆さん有難うございました。 今後はもっとちゃんと勉強します。
すいません、かなり低レベルな質問なんですが、よろしくお願いしますm(_ _)m #include<stdio.h> int GetBekijyou(int, int); void main(void) { int number1, number2; int kekka; number1=5; number2=3; kekka=GetBekijyou(number1,number2); printf("%d no %d jyo=%d\n", number1, number2, kekka); } int GetBekijyou(int x, int y) { int z; if(y==1) return(x); z = x*GetBekijyou(x, y-1); return(z); } 結果:5 no 3 jyo=125
80 :
79 :2005/10/23(日) 12:57:45
続きです これの再帰呼び出しの部分がよく分かりません・・・ xに関数GetBekijyouを掛けてるのかな、とか色々考えたんですが、それじゃおかしくなってしまって・・・ 因みに、自分は中学、高校とも全くと言っていいほど数学が出来なかったんですが これじゃC言語を学ぶのは厳しいでしょうか?orz
>>80 > xに関数GetBekijyouを掛けてるのかな
そのとおりだけど何か。
82 :
79 :2005/10/23(日) 15:24:25
>>81 やっぱそうですか。でもその後、return(x); で125をどこに返してるのか
分からないです・・・
質問です。 配列に文字列を入力から受け取ってそれを別の 配列にコピーするプログラムなんですが、配列 から配列に代入する部分でエラーが出ます。 どなたか原因がわかるかたがいらっしゃいましたら お願いしますm(..)m 環境はredhatlinuxの8です。 ----------ソース---------- 1 #include <stdio.h> 2 3 int main(){ 4 char name1[100]; 5 char name2[100]; 6 7 printf("input your name\n"); 8 scanf("%s",name1); 9 printf("name1=%s\n",name1); 10 11 name2 = name1; 12 printf("name2=%s\n",name2); 13 14 return 0; 15 } ----------結果---------- # gcc test1.c test1.c: 関数 `main' 内: test1.c:11: 代入 に互換性のない型
>>83 Cには文字列型は存在しない。
アドレスをアドレスには代入できない。
文字列のコピーには、strcpyを使う。
ってなところでどう?
>>83 Cでは配列を配列に代入することはできません。素直にstrcpy()でも使ってください。
86 :
83 :2005/10/23(日) 21:52:13
84さん85さんありがとうございました。 strcpyで解決しました!
c言語の勉強を始めて2ヶ月ぐらいのド素人です。 プログラムとは直接関係ありませんが、 コンソールアプリケーションで作った実行ファイルのアイコンを変換する方法 もしくはツールを知ってる方いたら、教えてもらえないでしょうか?
>>87 ショートカットを作ってプロパティダイアログでアイコンの変更。
>>87 リソースをくっつければEXEのアイコンを指定できる。
83で質問させていただいた者です。 たびたびすいません、もうひとつ質問よろしいでしょうか。 次のソースなんですが、関数に構造体のアドレスを渡して scanfで入力した値を構造体のメンバに入れて、その値をmain で表示するというプログラムです。 コンパイルは通ったのですが、実行すると落ちることがあります。 具体的にはscanfで入力する文字が半角英字で3文字までなら ちゃんと表示してくれるのですが、4文字以上入れると表示せずに "セグメンテーション違反です"とでます。 ちなみに、9,10行目を struct Seito seito1; startup(&seito1); とした場合は4文字以上入れてもちゃんと表示してくれます。 どこがおかしいかわかる方いらっしゃいましたらよろしくお願いします。 環境はRedHatLinux8です。
91 :
デフォルトの名無しさん :2005/10/24(月) 00:22:23
これがソースです #include <stdio.h> #include <string.h> struct Seito{ char name[100]; }; int main(){ struct Seito * seito1; startup(seito1); return 0; } int startup(struct Seito * seito1); int startup(struct Seito * seito1){ char name[100]; /* get name */ printf("input your name\n"); scanf("%s",name); /* set struct player status */ strcpy(seito1->name,name); printf("seito1 name is %s\n",seito1->name); return 0; }
>>91 struct Seitoのメモリが確保されていない。
というわけでこうしてみな。
int main() {
struct Seito seito1;
startup(&seito1);
return 0;
}
>>92 ありがとうございます。
92さんのやり方だとうまくいきます。
構造体変数をいきなりポインタ型で宣言しても領域は確保して
くれないんですね。(て認識であってますよね?)
理由がわかって助かりましたー。
問.二分木を使ったソートの特徴を述べよ。 という課題が出ました、200字程度で書けって言われたけど全然分かりません どのように答えれば良いのか教えてください
計算量がO(logn)で安定 また、あまりデータの偏りによらず、性能が劣化しない
あれ、でもお馬鹿な二分探索木は、データが初めからソートされてるとO(N)になっちゃうんじゃ・・・ 全てのノードが左方向だけ(or右方向だけ)につながって、それって線形リストと一緒やん状態
97 :
デフォルトの名無しさん :2005/10/24(月) 10:01:52
要素数がnoであるint型の配列vcの並びを逆順にする関数 void rev_intary(int vc[],int no) {/*・・・*/} を作成しなさい。 このプログラムの作成方法がまったく分かりません・・・。const型修飾子と関係あるんですか? よろしければ、教えてください。お願いします。
関係ないね!
99 :
デフォルトの名無しさん :2005/10/24(月) 10:08:40
>>98 関係ないんですか・・・。このプログラムはどう作成すればいいんでしょうか・・?
>>99 安直に
void rev_intary(int vc[], int no)
{
int i, t;
for (i=0; i<no/2; i++) {
t = vc[i]; vc[i] = vc[no-i-1]; vc[no-i-1] = t;
}
}
101 :
デフォルトの名無しさん :2005/10/24(月) 10:18:07
>>100 ありがとうございます。しかしこのプログラムで翻訳するとエラーになるんですが・・・。
全角スペースを半角スペースに置き換えれ
>>101 エラーが起きたときはエラーメッセージを貼りましょう。
104 :
デフォルトの名無しさん :2005/10/24(月) 10:35:04
すいません。解決しました。ありがとうございました。 もう1つよろしいでしょうか? 一応自分でプログラム作ったのですが(2行3列の行列と3行2列の行列の積) エラーが出てしまいます。 エラー:不適合なポインタが指定されています。 エラーが出るのはmul(ma,mb,mc);の所です。
105 :
デフォルトの名無しさん :2005/10/24(月) 10:35:34
プログラム: #include <stdio.h> void mul(const int ma[2][3],const int mb[3][2],int mc[2][2]) { int i,j; for(i=0;j<2;i++) for(j=0;j<2;j++) mc[i][j]=ma[i][j]*mb[i][j]; } int main(void) { int i,j; int ma[2][3]={{1,2,3},{4,5,6}}; int mb[3][2]={{5,6},{8,2},{1,3}}; int mc[2][2]={0}; mul(ma,mb,mc); for(i=0;i<2;i++){ for(j=0;j<2;j++) printf("%3d",mc[i][j]); putchar('\n'); } return(0); }
107 :
デフォルトの名無しさん :2005/10/24(月) 10:42:24
>>106 はずしていいんですか?一応問題文と例題(類題)ではconstを使用するようにと書いてあるんですが、、。
>>105 別にエラー出ないけど。どうしてもエラー出るならmainの中のmaとmbにもconstつけてみたら?
ちなみにmulの中てきとーすぎw
どっちが行でどっちが列か知らないが勘でやるとこんな感じか
for(i=0; i<2; i++)
for(j=0; j<3; j++)
for(k=0; k<2; k++)
mc[i][k] += ma[i][j] * mb[j][k];
109 :
デフォルトの名無しさん :2005/10/24(月) 11:04:49
>>108 エラー出て、いろいろいじったんですが結局計算結果が0になってしまいました。
一応、このプログラムは本の類題を自分で打ったんですけどおかしいんですか、、、orz
110 :
デフォルトの名無しさん :2005/10/24(月) 11:07:52
111 :
デフォルトの名無しさん :2005/10/24(月) 11:11:12
類題では2行3列の行列の和になってて、ここではmulの部分が mat_add(ma,mb,mc);になってるんですよ。そして解説のはma,mbの和をmcに格納と書いてあります。
>for(i=0;j<2;i++) ←IじゃなくてJになってるぞ それに行列の積は各要素をかけたものじゃないわけだが・・・
113 :
デフォルトの名無しさん :2005/10/24(月) 11:22:55
何度やってもエラーになってしまいます、、、、。 もうわけわからない・・・・。
どういうエラーが出るのよ
115 :
デフォルトの名無しさん :2005/10/24(月) 11:28:04
警告:実引数渡し:不適合なポインタが指定されています。const int(*)[3]とint(*)[3]の指定です。:第1引数 mul
>>105 もしかして、それって柴田望洋先生の本じゃない?
117 :
デフォルトの名無しさん :2005/10/24(月) 11:32:57
119 :
デフォルトの名無しさん :2005/10/24(月) 11:46:25
環境っていうことは、開発ソフトのことですか? 開発マネージャというのを使っています。OSはXPです。 みなさん、質問に答えていただきありがとうございました。もう1回自分で考えてみます。 また不明な点があったら質問したいと思いますのでその時はど素人ですがよろしくお願いします。
> 開発マネージャ ものすごい気になる。何だそれ。
>>119 #include <stdio.h>
void mul(const int ma[2][3],const int mb[3][2],int mc[2][2]){
int i,j,k;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
for(k=0;k<3;k++)
mc[i][j]+=ma[i][k]*mb[k][j];
}
int main(void){
int i,j;
int ma[2][3]={{1,2,3},{4,5,6}};
int mb[3][2]={{5,6},{8,2},{1,3}};
int mc[2][2]={0};
mul(ma,mb,mc);
for(i=0;i<2;i++){
for(j=0;j<2;j++)
printf("%3d",mc[i][j]);
putchar('\n');
}
return(0);
}
一応こんなじゃだめかな
>開発マネージャ Fujitsu Fortran&Cか
123 :
デフォルトの名無しさん :2005/10/24(月) 11:57:33
拡散方程式を陰解法で解いたソースが入手できるサイト知りませんか?
>>121 いちおう細かいことつっこんでおくと、mulの中の
for(j=0;j<3;j++)
のところ、3じゃなくて2じゃね?
すみません、次のようなソースを理解したいのですが、 その為に有用な本やサイトはありますか? 手元にある入門書には載ってなくて、さっぱり分からないんです。 #include <stdio.h> #include <stdlib.h> #include <math.h> #include "tdc.hh" int main(int argc, char **argv){ class TDC tdc; if(argc != 3){ fprintf(stderr,"Invalid argument\n"); fprintf(stderr,"Usage: tdcana <target name (data file)> <destination name (root file)>\n"); exit(1); } tdc.Init(argv[1],argv[2]); tdc.Analyze(); tdc.End(); return 0; }
>>126 classというのはC++のもの。
だからまずはC++の勉強をしてみな。
128 :
デフォルトの名無しさん :2005/10/24(月) 17:28:31
質問です。
ビットマップを入出力するため、下のサイトからソースを借りて使っているのですが、
2枚画像を読み込むと2枚目が正常に入力できていないようなのです。
メモリを確保できていないためかと思い、malloc関数などを調べましたがよく分かりませんでした。
具体的にはimage[480][640][3]のように三次元の配列での使い方がわかりませんでした。
それとも原因は別にあるんでしょうか?よろしくお願いします。
ttp://www.fit.ac.jp/elec/7_online/lu/tanosigazou.htm
>>128 そのサイトを書いたらしい三国人に聞けばいいだろう。
>>127 ずっとCだと思ってました……
ありがとうございます
なんでネタで立てたスレがこんなに伸びてるんだ
132 :
デフォルトの名無しさん :2005/10/24(月) 22:22:22
133 :
help me :2005/10/24(月) 23:01:21
/* 曜日構造体 */ typdef struct{ char weekend[7]; char week[7]; }WEEK; という構造体のchar week[7];に、“月火水木金土”をコピーします。 (あるソースファイルで) 他の出力専用のソースファイルで、for文でprintfの%cを使って出力します。 すると、途中までしか表示されません。 何故?? ちなみにOSはUNIX。
>>133 月火水木金土だけのファイルをエディタで作ってファイルサイズを見て味噌。
"月 "を1バイトで表現する文字エンコーディングは有りません。 wchar week[7]として%wcを使うか、char week[14]にして%c%cで2文字づつ出すかのどっちかが簡単
>>135 この世のどこかにはcharにUTF-16を使うリッチな環境があるかもしれないw。
>>136 UnicodeじゃないけどTRONとかな
そういえばMSXかPC-98の1バイトコードには「年月日」みたいな漢字も 入ってたな
MSXはグラフィックコードといって年月日と曜日の漢字は2バイトだったはず。
140 :
デフォルトの名無しさん :2005/10/24(月) 23:46:29
void AAA(){ } void *func; func = AAA; このfuncからAAA関数の実行の仕方を教えてください。
>>140 void *funcで受けたらダメだろ
void (*func)()で受けないと
func(); じゃないの?
144 :
デフォルトの名無しさん :2005/10/24(月) 23:50:49
C言語の.exe実行ファイルを自分の書いたアイコンに変更したいですが どうすればいいのですか?
147 :
デフォルトの名無しさん :2005/10/25(火) 00:25:59
int work; scanf( "%d",work ); で、間違って"8a"を入力したら、無限ループになりました。
4で割り切れるか割り切れないかの判断プログラムを教えてください
イ`
またすいません・・・ int m, n; printf( "整数は?" ); scanf("%d,&n); scanf("%d,&m); printf( "%d %d は", n, m ); if(m=1 || n>0 ); { printf( "真 " ); } else { printf( "偽 "); } 是どこか変ですか?
>>150 おまえの頭
エラーが出たのか思い通りの出力が出ないのか
ああもう何でもいいから何をしたらどうなったか書いてくれ
>>150 とりあえず
× if(m=1 || n>0 );
○ if(m=1 || n>0 )
>>150 おまえの頭
仮にC言語だとしても (m=1||n>0)なんて、代入式とで何を判定したいんだか…
154 :
デフォルトの名無しさん :2005/10/25(火) 17:41:59
VisualC++6.0使ってます。 double d[1000][1000]のように大きな配列を宣言するとプログラムが落ちます。 double d[100][100]くらいなら問題無いのですが・・・ メモリは512MBなので十分のはずなのですが、なにか設定があるのでしょうか?
あるよ
>>140 void AAA(){
}
void *func;
func = AAA;
((void *())AAA)();
仕事が無いんです。能力は十分のはずなのですが、なにか問題があるのでしょうか?
あるよ
>>157 どんだけの能力持ってるのか知らんが,いまどきCだけ出来てもな・・・
>>157 人間性に問題があるのでは?
と、釣られてみるテスト
161 :
デフォルトの名無しさん :2005/10/25(火) 18:44:05
営業力が足りない
プログラム(実行ファイル)の絶対パスを取得するにはどうすればいいですか?
165 :
162 :2005/10/25(火) 18:56:48
取得したいんだよ。 カレントディレクトリにないファイルを実行するときとか困るんだよ
167 :
デフォルトの名無しさん :2005/10/25(火) 18:59:04
質問です。以下のプログラムのコメントを添えた所で止まってしまいます。 なぜでしょうか(C++のコンパイラを使っているから?)。 #include <stdio.h> int main ( void ) { char *w[] = { "sun", "mon", "tue", "wed", "thu", "fri", "sat", }; int k; printf(" %s ", w[1] ); printf(" %s ", *(w+1) ); printf(" %s ", w[1][0] );/*これは、うまく”m”が出ない。プログラムが止まる*/ printf(" %s ", *(w[1]+1) );/*これも、うまく”o”が出ない。プログラムが止まる*/ return 0; }
>167 コンパイラを疑う前に、自分で書いたソース疑えよ。
>>167 下二つのprintfの%sを%cにしてみそ
170 :
162 :2005/10/25(火) 19:35:09
取得できないんでしょうか? argv[0]はコンパイラによってちがうし
カンキョウイゾン
windows2000, VisualStudio6Pro の環境です。 SJIS<->Ucs2の相互変換をするにはどうしたらいいでしょうか。
>>172 MultiByteToWideChar
>>172 C標準ライブラリの範囲ではmbstowcs()。
予めsetlocale(LC_ALL, "Japanese");を行うと入力元がShift JISとして扱われるようになる。
175 :
デフォルトの名無しさん :2005/10/25(火) 22:41:49
ちょっと便乗して質問です。 私も以前、実行ファイルの絶対パスを知る方法を聞いたとき、設計を見直せといわれました。 では、それを知ることなく外部ファイルのデータを読み込むにはどうすればいいんでしょうか。 例えば、Windows 上で動作するプログラム hoge.exe は、 同じディレクトリにある aaa.txt からデータを読み込み、表示するとします。 このとき、ファイルのオープンを fopen("aaa.txt", "r") などとします。 ところが、例えば Windows 上で hoge.exe を、外部ファイルの D&D で起動したときなど、 カレントディレクトリの位置が環境依存で変更されてしまうことがあります。 (XP の場合、C:\Document and Setting\(ユーザ名)\ になります) このとき、上記の fopen は、aaa.txt を見つけられず失敗します。 これを防ぐには、実行ファイルの絶対パスを取得し、 実行ファイルのあるディレクトリをカレントディレクトリにする以外の方法が見つかりません。 ご教授よろしくお願いします。
環境変数って無いの?
>>175 ウィンドウアプリだったらファイル選択ダイアログ
コマンドラインだったらパラメータでパス指定
ってとこ。
>>175 別に実行ファイルの絶対パスを知ってどうにかすること自体はそんなに変なことではない。
標準Cだけを扱うスレではスレ違いだというだけのこと。
Win32APIスレにでもいけばいい。
>>175 アプリケーションと常に対に存在する必要のあるデータなら、インストール時に確定すればいい。
設定ファイルのようにプログラム中で書き込むような場合は各ユーザのホームにでも書けばいい。
いずれにしろ、アプリケーションのある場所を動的に確保するような設計は望ましくない。
180 :
175 :2005/10/26(水) 02:07:50
>>177-179 ありがとうございます。
インストール時に決定するというのは目から鱗でした。
また、確かにデータを My Documents や Common Files に書き込むアプリもありますね。
スレ違いにもかかわらず、ありがとうございました。
>>180 むしろ、ユーザ毎の「Application Data」に入れる方がいいんでない?
182 :
デフォルトの名無しさん :2005/10/26(水) 15:17:40
c言語って累乗計算はpow関数ですよね。 BASICの2^1.5みたいに簡単な表現ってできないんですか?
184 :
風来坊 :2005/10/26(水) 16:34:37
openglでは光源の数が限られてると聞いたんですが実際何個くらいなんでしょうか?? GLで線光源と面光源を実現したいんですけど・・・
186 :
風来坊 :2005/10/26(水) 16:38:00
ありがとうございますた!! てことは二つとも難しいですかねぇ・・・
187 :
風来坊 :2005/10/26(水) 16:40:24
あ、板間違ってました・・・申し訳m(__)m
188 :
デフォルトの名無しさん :2005/10/26(水) 16:50:20
2〜100までの数字で素数を表示するプログラムを授業の課題でC言語を作るように言われたんですが、 ヒントをベースにして次まで作って見たんですが… #include<stdio.h> #include<math.h> main() { int a,i,flag; for(a=2 ; a<=100 ;a++){ flag=0; for(i=2 ;i<=a-1;i++){ if( (a%i) == 0 ){; flag=1; break; } } } if(flag){ printf("%d is a prime number.\n",a); 最後から二行目の if(flag〜)の〜に何か付け加えないと うまくプログラムが働いてくれないのですが… 何を入れればよいか全く分かりません…。 教えてください。
190 :
デフォルトの名無しさん :2005/10/26(水) 16:56:33
すみません。了解しました
191 :
172 :2005/10/26(水) 19:54:19
192 :
デフォルトの名無しさん :2005/10/26(水) 23:09:52
インクルードファイル stdio.hをオープンできない。 警告 W8065 sample.c 5 :プロトタイプ宣言のない関数 printf の呼び出し(関数 main) と出てきたのですが、どうすればなおるかわかる方いませんか?
>>192 Bccを使っているのならおそらくbcc32.cfgが適切な内容でない。
あるいは<stdio.h>のインクルードが正しく書かれていない。
195 :
デフォルトの名無しさん :2005/10/26(水) 23:47:05
>>193 まじ感謝!!!
俺あほだからすんげぇ時間かかって最後の難関だった。
ほんとありがとう!
すいません、お助け下さい… LinuxでC言語を扱ってます。ソケットを使ってプロセス間通信を行っているのですが、 タイムアウトの設定方法が解りません。 ファイルディスクリプタを使用してRead・Writeを行っているのですが、 サーバ側でWriteの必要が無い間、クライアントがReadでブロックしない様にする為に タイムアウトを設定したいのです。 ネット上を探しても今一ぴんと来るものが無かったもので… どうぞご助力下さいませ…
198 :
デフォルトの名無しさん :2005/10/27(木) 13:03:23
要素の個数が不定である配列を読み込んで、 その中から最大の要素と最小の要素を発見する場合、どうすればいいんでしょうか。 もし個数が決まっていれば、forとかでその個数までで考えればできるというのはわかるのですが、 個数が不定の場合、どうやって存在する個数までで打ち切るかがわかりません。
>>198 何がわかっていないかをわかっていない事を如実に示した質問だな。
まず「存在する個数を取得する方法」の有無を示してもらわないと回答不能だ
201 :
デフォルトの名無しさん :2005/10/27(木) 13:32:16
存在する個数を取得する方法は、私にはわかりません。
その配列の末端の要素が常に一致(例えば-1になる)するとかいうわけでもなく、常にバラバラです。
おまけに個数もバラバラなので、どうも無理なんじゃないかと勝手に結論付けつつあるのですが、
何分まだ知識が少ないものではっきりとは判断しかねます…。
>>200 ぐぐってみましたが、番兵とは上に書いたような手法で判断する方法ってことで大体良いでしょうか。
そうでない場合においては、要素の個数の取得は不可能なのでしょうか。
202 :
デフォルトの名無しさん :2005/10/27(木) 13:35:26
>>201 配列と言うがそのデータはどこにあるのか?
配列はいつもみんなの心の中にあります!^^
204 :
200 :2005/10/27(木) 13:53:55
>>201 番兵についてはそうだよ。
要素の個数が不定である配列ってのをちょっとCで書いてみ。
配列やめてリンクリスト使えばいい。
>>198 個数を貰うか、終端を判断できるI/Fを設け、
個数が判る様にしなければ無理。
207 :
まだ見てるかな? :2005/10/27(木) 14:48:55
>>167 ヒント:変数wへのアクセスが十分に理解できていない。
【問題1】 printf(" %s ", w[1][0] );/*これは、うまく”m”が出ない。プログラムが止まる*/
このソースでw[1][0]は、char* w[1]("mon")の[0]なので、char型の'm'を指している。
この'm'の値(文字コード値)をそのままprintf関数へ渡しているので、アウト!
※ printf( " %s ", 'm'の文字コード ); と解釈されてしまうため
"mon"を表示させたく、w[1][0]を指すポインタ値としてアドレスを渡すには、
printf(" %s ", &(w[1][0]) ); と記述する。
【問題2】 printf(" %s ", *(w[1]+1) );/*これも、うまく”o”が出ない。プログラムが止まる*/
これもchar型の'o'をそのまま文字コード値としてprintf関数へ渡しているので、アウト!
"on"を表示させたく、アドレスを渡すには、printf(" %s ", w[1]+1 ); と記述すればOK。
P.S.
あとwを初期化する部分の"sat"の後ろのカンマは念のため消しておきましょう。
208 :
196 :2005/10/27(木) 15:39:56
>>197 返信ありがとうございます。
やはりそこでしたか…一度目を通したのですが、少々理解に苦しみまして(汗)
int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
恐らくこれを使うのだとは思います。頂いたURLを見る限り、
「s」にはソケットのディスクリプタを、「level」は指示された通りSOL_SOCKETを。
「optname」にはSO_RCVTIMEOを入れるのは解るのですが、後ろ2つが解りません。
感覚的にはvalにこの場合タイムアウト長を設定した変数アドレスかな?
と思うのですが、一番最後は本当に何を入れたら良いのか…
試してみるにも見当自体つけられない有様でして、面目ないです。
もし宜しければ、簡単にでも教えて頂けませんか?
2つの整数m、nについてのプログラミングで m>nならばmとnを交換する m←m-n m=0であればアルゴリズムを終了する このときnが最大公約数であるみたいなプログラム組んでもらえませんか?
>>209 それは質問ではなく課題やってくれってことだろ
スレ違い
211 :
デフォルトの名無しさん :2005/10/27(木) 16:05:25
C言語を1から始めようと思っています。 プログラミングに関しては全くの素人です。 これからC言語を始める初心者にお勧めの本がありましたら、 是非教えて下さい。 よろしくお願いします。
>>211 最近のはよく知らないけど、入門C言語あたりかな。
古いK&R本は勘違いなまま覚える危険がある。
どこかWebで良い参考書がダウンロードできてたんだが、失念。
213 :
197 :2005/10/27(木) 17:00:24
>>208 struct timeval tv;
tv.tv_sec = 10; // 10sec
tv.tv_usec = 0; // 0μsec
// タイムアウトを10秒に設定
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
これで分かるよね?
>>211 「明解C言語 入門編」がオススメ。
初心者向けで凄く分かりやすい。
踏み台としては最適じゃなかろうか。
柴田望洋か
何か恨みでも?
C++で質問です。 引数つきのコンストラクタを持つクラス class A { A(int); }; を、別のクラスのメンバ変数として持つとき、 class B { A a; }; 引数はどのようにして渡せばいいのでしょうか?
>>218 Bのコンストラクタで初期化リストを使う。
B(int n) : a(n)
なんにせよスレ違い
221 :
218 :2005/10/27(木) 19:15:08
>>219 ありがとうございました
>>220 質問だったのでここでよいと思ったのですが…
失礼しました。
CとC++の区別もつかんとは
223 :
196 :2005/10/28(金) 09:18:51
>>197 日付を挟みまして報告です。
当然ですが、動きました〜ありがとうございます!
条件分岐でReadの返り値が-1の時はソケット読みをbreakする様にしたので解決です。
ありがとうございます、助かりました。これからtimevalの中覗いて来ようと思います。
>>211 参考書を買う前に、サイトで学ぶ手もある気もします(本は有った方が当然良いですが。
○でもわかるプログラミング、ってサイト様があるんですが…言って良いのかな?(; ̄- ̄)
224 :
デフォルトの名無しさん :2005/10/28(金) 13:09:53
>>223 書いても良いけど、サイトで見て理解できる奴はすでにぐぐって見つけてると思う
ようするにこういうところで「初心者です。本教えてください」ってのは本のような紙媒体から始めないとしっくり来ない奴ら
すいません、malloc()ってどういう場面で使うんでしょうか? 初心者なんですが、メモリを確保しても使うような場面が見当たりません
>>226 必要な場面がくるまで使わなくていいですよ
>>226 固定の配列だけでは"にっちもさっちも"いかなくなったら使う羽目になるよ。
ある時はbuf[20]、ある時はbuf[2048]、そしてある時はbuf[????]のように
実行時にbufサイズを決めないといけない場合に使う。
>>229 たとえば要素数Nが変化する配列が欲しくなったら
buf = (char *) malloc(sizeof(char)*N)
のようにするってことでしょうか?
>>230 どうでもいいが、sizeof(char)と書くのは不条理。
>>230 そんな感じ。
あと固定でも巨大配列が一時的に必要な場合、スタック領域からでなくヒープ領域
から確保する場合にも使うね。
int func_1( void )
{
int buf[1024][1024]; // スタック領域やばす!の判定がアプリでは原則ムリ orz
・
・
・
return OK;
}
int func_2( void )
{
int **buf; // ヒープ領域から確保するYO。ワクワク
buf = (int**)malloc( sizeof(int) * 1024 * 1024 );
if ( buf == NULL )
return ERR; // ヒープ領域やばす!
・ // 大丈夫ダッタ (・∀・)
・
・
free( buf );
return OK;
}
233 :
デフォルトの名無しさん :2005/10/31(月) 00:39:09
なんつーか、C言語の練習してる風景がわかんない。 例えば、エディタ(ひでまる)とVisual C++でC言語練習しようと してるけど。 秀丸でソース書いて、VisualC++で開いてコンパイル→実行でやっとソースを動かせるんでしょ。 もっと簡単にできるやりかたあったよね。たしか。 エディタはVisualC++にもあるけど、秀丸の方が使いやすいんだっけな?
234 :
デフォルトの名無しさん :2005/10/31(月) 00:42:02
Visual C++は背景を簡単に黒にできないから、目痛いし。(背景黒にできるが文字の色もいっぺんにかわらない) 26才になろうとしてるけど、今からC言語でも覚えようとしてるよ。一般教養に。そのうち使えれば便利だと思って。
235 :
デフォルトの名無しさん :2005/10/31(月) 00:45:41
プロの人とかってどういう環境でプログラミングしてるのかな。ウィンドウとか。配色とか。フォントとか。 ってか、プログラミング以前の問題ですけど。。
>copy con hoge.c
237 :
デフォルトの名無しさん :2005/10/31(月) 01:43:35
>>235 俺がプロでやってた頃、UNIXではターミナルでviかemacsだけ。
DOS環境ではFILMTNやFDにVZエディタ、コンパイルツールを組み合わせて
擬似IDE(統合開発環境)化していた。そしてWindowsNT3.1ではVCが今一つで
Borland C/C++ 4.0が便利に使えるレベルだったな。エディタだけは秀丸。
そのころのエディタの設定は、背景色:紺、文字色:白or黄、タブ:4文字。
ただVZエディタは行数の多いソースを書き出すと、テキストの一部を欠損する
致命傷があった。以降はずーっとWindowsで秀丸ユーザです。
>>235 > ウィンドウとか。配色とか。フォントとか。
そんなもの、個人の趣味の領域でプロ/アマ関係ないだろ。
そもそも、それはプログラミングの環境じゃないし。
VZエディタの使いやすさは革命的だったな・・・ Windows環境に移行してからもしばらくはVZ使ってたよ。
240 :
点・点・点」 :2005/10/31(月) 14:20:05
JAVAにはJADといわれる逆コンパイラがありますが、 Cにはありますでしょうか?
いくつか存在はしますが、実用的な物はありません。
242 :
点・点・点」 :2005/10/31(月) 14:30:44
ありがとうございます。 例えばどのようなものでしょうか。 日本語対応版はありますでしょうか。
243 :
点・点・点 :2005/10/31(月) 15:45:30
244 :
点・点・点 :2005/10/31(月) 16:09:43
245 :
デフォルトの名無しさん :2005/10/31(月) 17:54:43
ポインタとアドレスの違いがわからない
246 :
点・点・点 :2005/10/31(月) 18:17:16
stdbool.hの中身は下記です。 #ifndef _STDBOOL_H #define _STDBOOL_H #ifndef __cplusplus #define bool_Bool #define true1 #define false0 #else /* __cplusplus */ /* Supporting <stdbool.h> in C++ is a GCC extension. */ #define _Boolbool #define boolbool #define falsefalse #define truetrue #endif /* __cplusplus */ /* Signal that all the definitions are present. */ #define __bool_true_false_are_defined1 #endif/* stdbool.h */
247 :
デフォルトの名無しさん :2005/10/31(月) 18:39:21
プリプロセッサでコンパイル範囲を限定させたいのですが、 *.cファイル中ではプリプロセッサは効かないんでしょうか? そうだとしたら*.hに実装も含めなくてはいけないんでしょうか? よろしくです。
248 :
247 :2005/10/31(月) 18:40:20
続き... #pragma message(">>test.c\n")の部分が出力されません…。 // main.c #define DEFINED #include "test.h" int main(void) { return 0; }
249 :
247 :2005/10/31(月) 18:40:55
続き... // test.h #ifndef __DEFINE_TEST_H__ #define __DEFINE_TEST_H__ #ifdef DEFINED #pragma message(">>test.h\n") #endif #endif // test.c #include "test.h" #ifdef DEFINED #pragma message(">>test.c\n") #endif
「ヘッダー」の意味を調べてこいや
zip32j.dllを使用して圧縮するだけのちょっとしたプログラムを書いているのですが 圧縮するファイル名に[]が含まれているとき圧縮に失敗してしまいます よろしければ回避方法をご教授ください
252 :
247 :2005/10/31(月) 19:03:33
>>250 ファイル間で共有される定義や宣言を記述するファイルですよね?
まだ他に重要な意味があるんでしょうがまだ初めて間もないので
もしよかったら今回の質問に関係する所だけでも教えてもらえませんか?
>>244 #define bool _Bool
をtypedef char _Bool;か何かに書き換えてみろ。
BorlandはC99非対応だから_Bool型は存在しない。
そもそも拡張子cppでコンパイルすればstdbool.hなんて要らないよ。
254 :
233 :2005/10/31(月) 23:45:26
秀丸とVC++だとどうやって連携するのだか。 まえできたけど、今ググッてもわからないんだよね。 気軽にプログラム書ける環境教えてください。
>>254 cygwin+xyzzy
或いは
linux+mule
あ?mule?
257 :
点・点・点 :2005/11/01(火) 10:04:28
>>253 ありがとうございました。
出来ました。
あ、Meadow
259 :
点・点・点 :2005/11/01(火) 15:27:59
突然ですが、ボリュームシリアルを書き換える方法はありますでしょうか。
261 :
点・点・点 :2005/11/01(火) 16:10:03
>>260 フォーマットされたディスクに自動的に付加される番号です。
>>261 それは書き換えられるかもしれませんし書き換えられないかもしれません。
少なくとも、ボリュームシリアルと言う概念のないOSでは書き換えられません。
263 :
点・点・点 :2005/11/01(火) 16:46:24
MS-DOS Ver.4 以降のOSになります。 Windowsでもフォーマットされたドライブには付加されます。
BCPadを利用してCを学んでいるのですが、ちょっと躓いてしまったところが出てきたので、教えてください。 二次元配列を用意し、それをソートするだけのプログラムなんですが、 なんかうまいこと動作しません。 /* -- ソース -- */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXDATA 3 #define MAXSTR 256 int cmp(const char * , const char *); int main(void){ char (*data)[MAXSTR]; int i; data = malloc(sizeof(*data) * MAXDATA); for(i = 0 ; i < MAXDATA ; i++) printf("%d人目の名前 -> " , i + 1); scanf("%s" , data[i]); qsort(data , MAXDATA , sizeof(char *) , (int(*)(const void * , const void *))cmp); for(i = 0 ; i < MAXDATA ; i++)printf("%s\n" , data[i]); return 0; } int cmp(const char *s1 , const char *s2){ return strcmp(s2 , s1); }
>>263 MS-DOS/Windowsの話なら、MSDNを「ボリューム シリアル」で検索すればすむ話だとは思いませんか?
>>264 それは二次元配列ではなく、ポインタの配列にしかなっていませんね。
また、qsort()呼び出し時にキャストするのではなく、関数の型はqsort()の仕様にあわせ、
関数内でポインタをキャストした方が毎回キャストしないですむので適当だと思われます。
267 :
点・点・点 :2005/11/01(火) 17:10:35
>>265 しらべたのですが、
VC++にはボリュームラベルを書き換える関数しかありませんでした。
Cで出来るようですが、やり方が分かりません。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXDATA 3 #define MAXSTR 256 int cmp(const void * , const void *); int main(void){ char data[MAXDATA][MAXSTR]; int i; for(i = 0 ; i < MAXDATA ; i++) printf("%d人目の名前 -> " , i + 1); scanf("%s" , data[i]); qsort(data , MAXDATA , sizeof(char *) , (int(*)(const void * , const void *))cmp); for(i = 0 ; i < MAXDATA ; i++)printf("%s\n" , data[i]); return 0; } int cmp(const void *s1 , const void *s2){ return strcmp(*(char **)s2 , *(char **)s1); } このように変更してみましたが、やっぱりうまく動きません・・・。 qsortの比較関数を最初のままにし、二次元配列の宣言をこの状態にしたときには、 なぜかdata[0]の中身が変化してしまいました・・・。
>>268 だからqsort()の呼び出してキャストするなって。
で、配列の配列とポインタの配列の区別がついていないようだからその辺りを勉強汁。
構造体は判るのかな?
それなら、struct foo {char data[MAXSTR];} data[MAXDATA];とでもしてソートしたら?
270 :
デフォルトの名無しさん :2005/11/01(火) 18:06:28
>>245 > ポインタとアドレスの違いがわからない
ポインタ = アドレス(ポイント)を指すという意味
ポインタ変数 = (他の変数などの)アドレスを指す変数
アドレス = メモリ上にある変数の場所を示す番地のこと
char ch; // これはchar型変数のch。変数chのアドレスは&chで表す。
char* pch; // 他のchar型変数のアドレスを指すポインタ変数pch。
// これに他のchar型変数のアドレスを代入してから使う。
// 例
// pch = &ch;
//
// アドレス代入後にポインタ先の値を*pchとして参照する。
// 例
// *pch = '\n';
//
// あとは*pchをchar型変数chのように扱える。
//
int val; // int型変数のval。変数valのアドレスは&valで表す。
int* pval; // 他のint型変数のアドレスを指すポインタ変数pval。
// これに他のint型変数のアドレスを代入してから使う。
// 例
// pval = &val;
//
// アドレス代入後にポインタ先の値を*pvalとして参照する。
// 例
// *pval = 65535;
//
// あとは*pvalをint型変数valのように扱える。
//
271 :
デフォルトの名無しさん :2005/11/01(火) 18:45:04
本当に初心者なんですけど、VC++.NETのMFC使ってますが構築コードを追加って何をすればいいんですか?
あなたのしたいことを書けばよいのです。
>>264 cmp関数は要らんと思う
ポインタ無しでforでグルグル回せばソートできると思うが
>>268 せめて期待する動作くらい書こうな。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXDATA 3
#define MAXSTR 256
int cmp(const void * , const void *);
int main(void){
char data[MAXDATA][MAXSTR];
int i;
for(i = 0 ; i < MAXDATA ; i++) {
printf("%d人目の名前 -> " , i + 1);
scanf("%s" , data[i]);
}
qsort(data, MAXDATA, MAXSTR, cmp);
for(i = 0 ; i < MAXDATA ; i++) printf("%s\n" , data[i]);
return 0;
}
int cmp(const void *s1 , const void *s2)
{
return strcmp((char *)s2, (char *)s1);
}
275 :
デフォルトの名無しさん :2005/11/01(火) 21:58:58
>>270 > ポインタ = アドレス(ポイント)を指すという意味
> ポインタ変数 = (他の変数などの)アドレスを指す変数
> アドレス = メモリ上にある変数の場所を示す番地のこと
いい加減な事言うな。
ポインタ:プログラム上で使用するオブジェクト(変数など)を指し示す値
ポインタ変数:ポインタ値を格納する為のオブジェクト
メモリアドレス:記憶領域上の位置を示す値
# ちなみに、ポインタ値=アドレス値ではない
ポインタとポインタ変数とポインタ値とアドレスってごっちゃだよね 概念さえわかってればそんなにいきりたって区別するほどのもんでもないと思うけど
この流れに便乗して聞いてみる。 いまいちqsort関数の引数があやふやなんだ。 第三引数に指定するのは、sizeofで求めるやつじゃないのか? 配列の型によって様々な表記をしてるから、理解するのが難しい・・・
280 :
デフォルトの名無しさん :2005/11/02(水) 14:31:14
>>277 そこまできたら何で直接ポインタと間接ポインタの説明をしないのか?
ついでにハンドルなんかも教えてやりゃ良いのに
main.exe - C:\DOCUME~1\*****\LOCALS~1\Temp\run.bat NTVDM CPU は不正命令を検出しました。 とコンパイルしようとすると出ます。誰かげんいんがわかるかたいますか?
282 :
270 :2005/11/02(水) 15:31:14
>>277 > いい加減な事言うな。
それ、ほぼ同じことを言い換えてるだけにしか思えないが、変数とオブジェクトってどう違うの?
ポインタ = アドレス(ポイント)を指すという意味 = プログラム上で使用するオブジェクト(変数など)を指し示す値
ポインタ変数 = (他の変数などの)アドレスを指す変数 = ポインタ値を格納する為のオブジェクト
アドレス = メモリ上にある変数の場所を示す番地のこと = 記憶領域上の位置を示す値
> # ちなみに、ポインタ値=アドレス値ではない
ポインタ=アドレス ではないが、C言語ではポインタが持つ値としてアドレス値に限定ではないか?
>>280 それじゃ277に代わって・・・
ハンドルは、平たく言うと特定の処理システム内で規定されたルールによって割り
振られた値でして、それをプログラム内で識別や参照に用いる方法ですな。
だからハンドルの値そのものは、ただユニークに割り振られた番号だったり、或る
ハッシュ値そのものだったり、ポインタのようにアドレス値だったりもする。
ポインタのように言語仕様の規定で決められているのではなく、多くはライブラリの
仕様として決められているのが違いかな。
>>282 > ほぼ同じことを言い換えてるだけにしか思えないが
明らかに違うだろ。
> C言語ではポインタが持つ値としてアドレス値に限定ではないか?
オフセットの場合もあるし、Windowsだと仮想アドレスだったりする。
> オフセットの場合もあるし、Windowsだと仮想アドレスだったりする。 それがアドレスでそ? アドレスという言葉の意味をすごーく狭く解釈していない?
こういう人は定義がだーい好きなんだよ >Windowsだと仮想アドレスだったりする。 (´・∀・`)ヘー
286 :
デフォルトの名無しさん :2005/11/02(水) 17:37:22
Win32アプリならフラットメモリモデルを使っているので仮想アドレスでなく、セグメント内での仮想メモリの位置を表すオフセットアドレス あとそもそもx86アーキテクチャにおいてレジスタ1本で物理アドレスを指定ことは出来ない
WindowsでC言語使ってどれぐらいの範囲のアドレスにアクセスできるの? そのプログラム内で確保したメモリだけ?
windowsというより、むしろ、x86プロセッサ自体が、 リアルモードからプロテクトモードに移るとリアルモードには戻れない。 これが何を意味するかというと、windows上で動くプログラムのアドレスは、 基本的に、論理アドレスだということ。 基本的に、というのは、抜け道もあるということ、デバイスドライバとか
>287 Windowsがメモリ管理しているから、積んでるメモリで決まると思うんだけど。 足りなければ、Windowsが仮想メモリ使ってくれるか、マが仮想メモリを確保もできるでしょう。 ただ、Lattice-CとかのDOSプログラミングだと1M制限に掛かると思うけど、現在、仮想86モードがどうなっているのか知らない。
>>278 じゃなく概念わかって無い奴ほど区別つけられないままなのが間違いの元で…
せっかくオブジェクトという概念で説明できる(してある)のに、
わざわざアドレスとか混同する必要も無いわな。
(オブジェクトと変数も混同するなよな)
object: region of data storage in the execution environment,
the contents of which can represenvalues
>C言語ではポインタが持つ値としてアドレス値に限定ではないか?
古のワードマシン(?ワード境界にないバイト境界からはアクセスできない)
での実装で word境界のポインタ値 2Nの次の値が 2N+1じゃなかったりするのも
あったなあ。例外が発生するような特殊な印(?tag)付だったか、
まあそんなものまでアドレスと強弁してもしょうがなかろうし。
>>288 x86でもプロテクトモードからリアルモードへ戻れますよ。(戻れないのは286だけ)
292 :
デフォルトの名無しさん :2005/11/02(水) 21:25:34
286はリセット回路使うんだっけ?
293 :
デフォルトの名無しさん :2005/11/02(水) 21:31:06
>>292 それ、良く覚えてたねw
リセットして切り替えるから、コンテキストも外部で自己管理という・・・
無駄にコストの掛かる方法だったな。
ってアーキテクチャはスレ違いだ。
>291 特権レベルによってWINDOWSがメモリ管理してるから、 プロテクトモードからリアルモードにするドライバの中でOS落としてやらないと無理(OSが正常に動かない)と思うんですけど、違ってたらごめんなさい あと、特権命令については、ぶつかるかどうかの要因としては、関係ないと思います
>>294 Windowsの中からリアルモードに行こうと考えているとは思わなかった。
俺はDOSへ戻る16bit Windowsの終了とかを考えていた。
>295 なるほど。 それなら、一昔前(いや二、三昔)のパソコンなら普通に使ってましたね。 たしかにw
ポインタ値ってなに?
intでキャストとかすればintになんのかな。試すか。
FreeBSD5.4のccまたはgccで コンパイルすると ○ printf("aiueo"); × printf("あいうえお"); なんですけど どうしたら日本語もできるようになりますか?
お前は俺を怒らせた
#include <stdio.h> int main(void){ int i; double d; i=1; //平気 i=&i; //怒られる d=i; //平気 return 0; } なぜ?
K&Rなら誰も怒れない
>>302 ポインタ値と整数値は相互代入可能でないから、キャストで無理やり変えるか何かしないとダメ
関数strcpyの定義例を読んでいて不思議に思ったのですが、 なぜコピー先の位置を保存しなければならないんでしょうか。 // strcpy int strcpy(const char *s1 , const char *s2){ char *p = s1; // 位置保存 while(*p++ = *s2++); return *s1; } ちょっとうろ覚えなので、あってるかどうかは自信がないですけど・・・
>>305 最後にreturn s1;としている。
strcpy()は最初の引数を返すと定められている。
307 :
デフォルトの名無しさん :2005/11/03(木) 10:20:22
>>305 保存といいながらpを使ってs1を使ってないから、温存というよね?
でもって返すのはchar *
C言語で文字列処理を極めようと勉強するのと、とっととC++に移行するのは どちらがオススメですか?
>>308 フランス語とドイツ語を比べるようなものだ
>>308 極めるとまでは行かなくとも、
人並みにポインタを使いこなせるようになるくらいはCをやった方がいいと思う。
ポインタがNULLか否か調べる際、 NULLをポインタの型に合わせてキャストするべきですか? つまりこんな風に char *buf; buf = (char *)malloc(num); → if (buf == (char *)NULL) return; また、returnでNULLを返す場合はどうすべきですか?
前者 すべきでない。 後者 素直にNULLを返せ。
314 :
312 :2005/11/04(金) 02:02:47
>>313 分かりました。即レスありがとうございます。
315 :
デフォルトの名無しさん :2005/11/04(金) 02:04:12
コンパイルは出来たのに、実行したら何も表示されないのはどのような原因が考えられるでしょうか? ○○が原因で、○○.exe にエラーが生じましたとなるのですが。 3次元問題を差分法で解くために、時間と含めて4次元配列をつくりましたが、メモリのことも考慮して、時間の配列要素は2つにしました。 つまり3次元分の必要メモリ数*2だけのメモリが必要なのですが。。。
317 :
デフォルトの名無しさん :2005/11/04(金) 02:25:32
>>316 すみません。ただ、何か少しでもいい方法がないかと思いまして。。
幾分若輩者でして...
一つのスレで質問してるなら答えたのに。
>>315 メモリ不足なんじゃない?
アロケートをWindowsAPIでやったら?
320 :
点・点・点 :2005/11/04(金) 11:02:11
コンパイルすると、 外部シンボル 'absread(int, int, int, unsigned char)' が未解決 が出てしまいます。どうしてでしょう。 #include <dos.h>は記述してあります。 ちなみに-Wでコンパイルすると、 WinMainが未解決になります。 コンパイラはborland C++ 5.5です。
321 :
デフォルトの名無しさん :2005/11/04(金) 11:57:27
>>320 コンパイルじゃなくて未解決ならリンク時だろ
コンパイルとリンクの違いを勉強して来い
そして、absreadが入っているライブラリファイル(〜.libって名前のファイル)をリンクしろ
322 :
点・点・点 :2005/11/04(金) 14:31:17
abswrite、absread という関数はどのようなものでしょうか。
情報検定2級おちますた。 何か良い勉強方法ありませんか・・・? 問題用紙下のほうのでかい問題の考え方が いまいちわからないのですが・・・。
324 :
点・点・点 :2005/11/04(金) 15:41:04
関数が、Borland C++ Version 3.1 にあって、 borland C++ 5.5でなくなる、 ことってありますか?
325 :
点・点・点 :2005/11/04(金) 15:50:47
例えば、abswrite、absreadという関数。
>>324-325 そりゃありえる。
Borland C++ 5.5はWindowsで動くプログラムを作るからDOS用の関数はなくなって当然。
>>315 リンカの設定でスタックサイズを大きくしてみたらどうだ。
328 :
点・点・点 :2005/11/04(金) 16:18:45
329 :
点・点・点 :2005/11/04(金) 17:23:52
330 :
点・点・点 :2005/11/04(金) 18:36:16
しかし、解凍をしてファイルを見ることは出来たのですが、 先ほどから、インストールが出来ません。 installとタイプするように書いてありますが、 うまくいきません。 だいたい、DOSでカレントをどこにおいていいのやら、、。
331 :
デフォルトの名無しさん :2005/11/04(金) 18:40:14
BC++3.1ならDOSかWin3.1上で動かせや というか、absreadを入れたアプリ使って何するつもりだ?Win95ですら動かないAPIを使って
332 :
yu :2005/11/04(金) 23:03:10
typedef struct t_list { struct t_list** g_ptr ; struct t_list* next_list ; } T_LIST; typedef struct c_table { struct t_list*compressible_t ; struct c_table*another_t ; } C_TABLE ; と、宣言をした構造体を使っています。 T_LIST型の構造体AからC_TABLE型の構造体へポインタを指定して、 そこから異なる構造体Bを指すように設計しているのですが、 うまく値を参照できません。 g_ptrの型はT_LISTなのでしょうか?? いろいろ調べたんですが、上手くできません。 どなたか、教えて下さい。お願いします
>>332 そのg_ptrは何に使おうと思ってるの?
334 :
yu :2005/11/04(金) 23:28:48
>>333 さん
レスありがとうございます!
g_ptrが指す対象がいくつあるかわからないので、C_TABLE型のリストを
動的につくって、そこからつなげたいんです。
g_ptrは同じ型の(自分とは違う)構造体を指させたいんです。
>>334 どう説明すると判ってもらえるかが難しいんだが、値自体の型とか構造体ってのを別に考えた方が良いな
手っ取り早くやるならvoid *g_ptr;にしてしまうとか
Windowsで使えるフリーのプロファイラってないですか?
337 :
yu :2005/11/04(金) 23:44:25
>>335 さん
値自体の型とか構造体を別に・・・・・ですか?
でも void *g_ptr だと指定する先がvoid型の物になってしませんか??
>>337 vod *は特別で、指している先がどんな型か問われない(== どんなものでも指せる)ポインタ型ということになっている。
339 :
yu :2005/11/04(金) 23:49:32
>>338 さん
そんなんあるんですか?!
初めて知りました・・・・・。
ありがとうございます! これから試してみます
340 :
yu :2005/11/04(金) 23:55:15
>>338 さん
'$S1' と 'void' の記述が不正です
(';' で区切られていない可能性があります)。
と出てエラーになってしまいました・・・・。
構造体ではポインタのポインタなので
指定する先の型をT_LISTとしていますが、
直接指定しているのはC_TABLEなので
そこは修正すべきなんでしょうか??
341 :
デフォルトの名無しさん :2005/11/05(土) 02:55:16
質問です! stdio.h や stdlib.h をインクルードしていなくても rand() で呼び出せるこの rand() 関数はどこで定義されているんですか?
>>341 Cでは(プロトタイプ)宣言無しでも関数を呼び出すコードは書ける。
後はその関数の実体をリンクすればいい。
勿論、一部を除いて標準関数は暗黙的にリンクさせる。
割れ鍋にとじぶた
344 :
デフォルトの名無しさん :2005/11/05(土) 18:23:52
マイク入力から音階、音量読み取って画像をそれに連動させろって言われても… 教授のぶぉけ(;o;)))))))))
FFTのライブラリをどこぞから持ってくればすぐ作れるぞ
while (scanf("%d", &int1) != 1) { hoge... } こんな感じで有効な入力がなされるまで受けるようにしたいんですが 最初になされた無効な入力がstdinに残っているため無限ループに陥ってしまいます fflush(stdin)やrewind(stdin)で自分なりにやっては見たのですが上手くいきません どなたかご教示願います
>>346 たとえばscanf("%*s");で次の空白類文字まで読み捨てられる。
ほかにはscanf("%*[^\n]%*c");で改行文字までを読み捨てられる。
>>347-348 レスどうもです
読み飛ばしはすっかり失念してました・・・_| ̄|○
fgets+sscanfも良さそうですね。参考にしてやってみます
350 :
デフォルトの名無しさん :2005/11/06(日) 00:34:17
Webサーバ上で動くCGIをC言語で製作しております。 そこで、サーバ上にあるテキストァイルの中身全部を、ブラウザへ出力したいのですが、どの関数を使うべきなのか判断出来ません。 fgets・fputsか、fread・fwriteのどちらかを使おうと思っているのですが、どちらが良いのでしょうか。 また、fgetc・fputc関数での1文字ずつの入出力ではアクセス速度が低下するのでしょうか。
>>350 出力をまとめられる fwrite でいいんでは?
まとめられないなら fputc でも fputs でも使えば?
354 :
デフォルトの名無しさん :2005/11/06(日) 01:14:00
charのポインタ配列について教えてください。 char name[5][30];と宣言したものを ポインタの配列で別の関数に渡したいとき p[0] = name[0]; p[1] = name[1]; p[n] = name[n]; のようにポインタの配列に ひとつずつ代入して、pを渡す? もっとスマートな方法がありそうな…。
void func(char *pname[]); char name[5][30]; func(name); こういうこと?
356 :
354 :2005/11/06(日) 01:32:36
あれ?そうやって書いてもいいの? 質問の意図はまさにその通りです。 以前その方法でコンパイラに怒られた記憶があったので だめなのかと思っていました。 もう一度試してみます。
1000の2乗とか3乗とかの作り方が分かりません。 (1000)^2とか(1000)^3で実行しても1002とか1003となってしまう。。。 誰か教えてくださいまし。
pow()
359 :
354 :2005/11/06(日) 02:55:26
やっぱりよくわかりません;; もしかしてfunc内ではnameの各要素の先頭アドレスは わからないということですか?
>>359 >>355 ではないが
char func(char arg[][30])
{
...
}
じゃダメ?
わかるわけがない エスパーじゃないんだから
362 :
354 :2005/11/06(日) 03:12:38
皆様レスありがとうございます。 どうしてもポインタの配列がほしかったら、どっかで pname[0] = name[0]; pname[1] = name[1]; pname[n] = name[n]; とかやるの?
まず配列の要素数を渡す、ということを導入してみろ
364 :
354 :2005/11/06(日) 03:29:02
>>363 func(char *[], int);
のような関数にする、という意味ですか?
オウム返しに質問するな!
>>362 あー、必要ならやるとも。
でもそういうコードになったら負けかな、と思っている
C言語で外部コマンドを実行して、その結果を文字列で受け取るってどんな方法でやるのいいんですか? 例えば、"ls" とか "dir" を実行して、その結果を文字列で得たいんです。
369 :
367 :2005/11/06(日) 12:40:00
>>368 Linux でプログラミングしているので、まさにこの方法でできそうです。
ありがとうございました。
Bisonで構築する構文解析器において 標準入力から入力を待ち受けるのではなく 直接文字列を渡すテクニックの概要を教えてください
371 :
デフォルトの名無しさん :2005/11/06(日) 21:31:16
質問です。 負の数に対しても、除算に対する商と余りを正確に出す簡単な方法はないでしょうか。 C言語: -3 / 10 == 0、-3 % 10 == -3 数学: -3 / 10 = -1、-3 % 10 = 7 つまり、数学において除算の余り r は、割る数を x として、 必ず 0 <= r < x となります。 よろしくお願いします。
スレの質くらい選べよ
373 :
371 :2005/11/06(日) 21:36:42
えと、C の標準関数か何かでそういったものが何かないかな、と思って聞きました。
スレの質くらい選べよ
376 :
デフォルトの名無しさん :2005/11/06(日) 22:26:45
>>371 0は0
-1は0
-3は111
7は111
2進法に直せばおのずとどうすれば良いかわかるだろ(俺は2進法のアルゴ知らんが)
割られる数が正のとき〜負のとき〜とすれば良いんじゃないかな
>>371 先を越されたが、C99規格(ISO/IEC 9899:1999)には
When integers are divided, the result of the / operator is the algebraic
quotient with any fractional part discarded. 87)
-----------------------------------------------------------
87) This is often called “truncation toward zero”.
とある(
>>375 の仰る通り)。と言う事だから、次のようにするのが分かりやすい
かも知れない。高速かどうかは別にすれば。
#include <math.h>
int math_quotient(int a, int b) {return floor((double)a / b);}
int math_mod(int a, int b) {return a - b * math_quotient(a, b);}
余談だが、C++規格(ISO/IEC 14882:1998)ではオペランドが共に非負数で
あるとき以外はimplementation-definedになっている。
378 :
デフォルトの名無しさん :2005/11/06(日) 23:11:38
cはじめたんですが コンパイラは何を使えばいいのでしょうか? +初心者講座のHPも知りたい
379 :
367 :2005/11/06(日) 23:20:43
380 :
379 :2005/11/06(日) 23:21:50
以前、質問させてもらった時のレス番が残ってしまった・・・。
thx
cでオンラインゲーム作りたいんですが ネットワークプラグインとかってあるんですか?
追加 c言語ではプラグインの事をライブラリって言うんですか?
>>382 「プラグイン」という概念はC言語のものではなく、「プラグイン」と
「ライブラリ」は異なる。
君には無理だからあきらめましょう
あきらめました
>>386 好きなライブラリ使ってもいいし、自前で書いてもいいし。
三次元の配列で、各要素の数が100の計算をしたいのですが、各配列要素の数を50より大きくすると、実行時にエラーが表示されます。 おそらくメモリの関係だと思うのですが、三次元の配列で100*100*100の計算ってメモリが限界に達するほど大きな計算でしょうか? 何か効率よくする方法があれば教えてください。 ちなみに、配列の型はdoubleです。
>>390 doubleが4バイトの環境だと仮定しても高々4MB
>>391 自分でもそんなに大した量の計算ではないと思っているのに、どの計算機で試してもエラーが帰ってきます。
試しにソースアップするのでどこが悪いか見ていただけませんか?
394 :
392 :2005/11/07(月) 19:43:30
#include <stdio.h> #define N 50 /*立方体である3次元の系のそれぞれの辺の長さに値する*/ int main(void) { int t,tmax,j,k,l; float T0[N][N][N],T1[N][N][N]; FILE *output; output=fopen("output.data","w"); /*時間的にどれくらい経過させるかを最大繰り返し回数として入力。*/ printf("最大繰り返し回数を入力。\n"); scanf("%d",&tmax); /*初期条件として全体の温度100*/ for(j=0;j<N;j++) { for(k=0;k<N;k++){ for(l=0;l<N;l++){ T0[j][k][l]=100.0; } } }
395 :
392 :2005/11/07(月) 19:44:12
上の続き for(t=0;t<tmax;t++) { /*境界条件として回りの温度0*/ for(j=0;j<N;j++) { T0[j][j][0]=0.0; T0[j][j][N-1]=0.0; T0[0][j][j]=0.0; T0[N-1][j][j]=0.0; T0[j][0][j]=0.0; T0[j][N-1][j]=0.0; } for(j=1;j<N-1;j++) { for(k=1;k<N-1;k++){ for(l=1;l<N-1;l++) { T1[j][k][l]=T0[j][k][l]+0.25*(T0[j+1][k][l]+T0[j-1][k][l]+T0[j][k+1][l]+T0[j][k-1][l] +T0[j][k][l+1]+T0[j][k][l-1]-6.0*T0[j][k][l]); } } }
396 :
392 :2005/11/07(月) 19:45:25
上の続き(最後) for(t=0;t<tmax;t++) { /*境界条件として回りの温度0*/ for(j=0;j<N;j++) { T0[j][j][0]=0.0; T0[j][j][N-1]=0.0; T0[0][j][j]=0.0; T0[N-1][j][j]=0.0; T0[j][0][j]=0.0; T0[j][N-1][j]=0.0; } for(j=1;j<N-1;j++) { for(k=1;k<N-1;k++){ for(l=1;l<N-1;l++) { T1[j][k][l]=T0[j][k][l]+0.25*(T0[j+1][k][l]+T0[j-1][k][l]+T0[j][k+1][l]+T0[j][k-1][l] +T0[j][k][l+1]+T0[j][k][l-1]-6.0*T0[j][k][l]); } } }
397 :
392 :2005/11/07(月) 19:48:39
>>396 は間違えました。正しくは↓です。
for(k=1;k<N-1;k++) {
/*時間的に過去の情報は破棄するためと、この時間的forループの計算のために配列Tのデータ処理*/
for(j=1;j<N-1;j++) {
for(l=1;l<N-1;l++){
T0[j][k][l]=T1[j][k][l];
}
}
}
}
398 :
392 :2005/11/07(月) 19:49:31
続き(ラスと) /*最終結果には境界条件である温度0の情報がはいってないため、ここで計算する。*/ for(j=0;j<N;j++) { T1[j][j][0]=0.0; T1[j][j][N-1]=0.0; T1[0][j][j]=0.0; T1[N-1][j][j]=0.0; T1[j][0][j]=0.0; T1[j][N-1][j]=0.0; } for(j=0;j<N;j++) { for(k=0;k<N;k++) { for(l=0;l<N;l++){ fprintf(output,"%d %d %d %f\n",j,k,l,T1[j][k][l]); } } } fprintf(output,"\n"); return 0; }
とりあえず繰り返し回数に10を入れてみたが 0 0 0 0.000000 0 0 1 0.000000 0 0 2 0.000000 (中略) 43 47 41 -81.906128 43 47 42 329.925537 こんな感じのファイルが出力されて正常終了したぞ
400 :
392 :2005/11/07(月) 19:57:33
>>399 はい、その通りなのですが、Nの値を51以上にすると、実行時にエラーが出てくるのですが...
>float T0[N][N][N],T1[N][N][N]; とりあえずstatic floatにしてみたら?
402 :
392 :2005/11/07(月) 20:01:09
>>401 出来ました!! staticは、関数内の情報が保存されるくらいの知識しかなくて、このmain関数内には別の関数を用意していないのに、staticを加えただけで実行できたのはなぜでしょうか!?
この手の問題はコンパイラスイッチでスタックサイズを指定するか、 動的確保(malloc)に帰結する。
404 :
392 :2005/11/07(月) 20:04:30
>>403 ただ、後になってメモリの解放を忘れていますとのメッセージが表示されたのですが、
static関数を用いる以外に何かプログラムに書き込む必要があるのでしょうか?
mallocしたらfree関数を忘れない。 staticな変数は静的データ領域に、そうでない変数はスタックに蓄えられる。
ちなみに動的確保した変数はヒープ領域
407 :
392 :2005/11/07(月) 20:19:14
>>406 >>401 のようにただ単にstaticを加えるだけでは駄目なのでしょうか?
メモリの解放という操作が必要なのでしょうか?
>>407 メモリの解放は動的メモリに対して必要。
staticは静的という意味でメモリの解放とは無縁。
410 :
392 :2005/11/07(月) 21:11:42
>>409 本当に何回もすみません。
では、main関数内でstatic変数を指定すると(上の例でいうと、static float...)、メモリが解放されないから、
結局staticを使わない場合と変わらないような気もするんですが、実際にはstaticを加えることにより、Nの値を大きくして計算が出来るようになったのはなぜでしょうか?
>>410 静的変数はローカル変数が使うスタックとは別領域に置かれる。
だからスタックの大きさとは無縁になれる。
>>410 そしてstatic変数の寿命は、プロセスと一緒だからプログラム上で
管理しなくていい。
mallocの寿命もプログラムと一緒だから 管理しなくていい。
>>415 まぁいまどきのたいていのOSではそのとおりではある
だからといって管理しなくていいかどうかは別問題なのだが(そしてフレーム合戦へ)
知らぬ間に裏でリソースを食い潰していくdaemonなんて大嫌いです
freeするかしないかの私的判断基準。 コードレビューあり→する 次回リリースも付き合う→する 今回でサヨナラ→しない
419 :
デフォルトの名無しさん :2005/11/09(水) 12:26:27
すみません char a[]="abcdef"; char b[10]; void cpy(char *a,char *b) { while(*a != 0x00){ *b=*a; a++; b++; } *b=0x00; } ポインタを使ってBにAをコピーするのですが bcdefと(a[1])からb(b[0])にコピーするにはどうすればいいでしょうか (*a)++ではなく
cpy( a+1, b ); で
422 :
デフォルトの名無しさん :2005/11/09(水) 12:57:38
二つの実数をキーボードから入力し、二つの実数が 等しくなければ、 z = x(x+y) / y(x-y) の値を計算し、二つの実数が等しければ、 z = y / x(x+y) を計算するようなプログラムを書きなさい。 と言う宿題がでてとりかかったんですが、なんどやってもエラーが起きます。 どなたか添削お願いします。 #include <stdio.h> main() { int x,y,z; printf("x=> "); scanf("%d",&x); printf("y=> "); scanf("%d",&y); if (x != y){ z = x*(x+y) / y*(x-y); printf("z= %d\n",z); } else{ z = y / x*(x+y); printf("z= %d\n",z); } return(0); }
zをdouble?
>二つの実数をキーボードから入力
>>423 >なんどやってもエラーが起きます。
エラー名くらいかいてください。
>x*(x+y) / y*(x-y)
→x*(x+y) / (y*(x-y))
>424 >425 >426 無事解決しました。ありがとうございます。
多次元配列のメリットはなんですか? 共用体の存在価値は?
>>428 いつかわかるときがくる。
そのときにでも思い出せばいい。
>>429 しかし共用体の存在価値はどうしても知りたい
>>430 バカとハサミは使いよう。
そう思ってる限り、藻前にとって役に立つ事はない。
A[x][y]の値を2次元のマトリクス形式で出力するにはprintfの部分をどのようにすればよいでしょうか? 因みにx,yはint型で、要素数は、A[5][5]です。
1 2 3 4 5 6 7 8 略 こんな感じか?それなら↓ for (int i=0;i<5;i++) printf("%d %d %d %d %d\n", a[i][0], a[i][1], 略, a[i][4]); 要C99、ANSI-Cなら何処かでカウンタを宣言してくれ
for(x=0;x<5;x++){ for(y=0;y<5;y++){ printf("%2d ",A[x][y]); } printf("\n"); }
435 :
デフォルトの名無しさん :2005/11/11(金) 17:55:10
>>428 多次元配列:モデル化した結果が多次元行列だった場合に1:1に実装できる
共用体:あるアルゴリズムではA、別のアルゴリズムではBと言う様に用途によって変わるデータ構造を実現する場合につかう。
メモリにマッピングして使うようなI/Oデバイスの場合、モードによって制御レジスタの構成が変わる時がある。そういう状態をそのまま実装できる。
他の言語と違い、自由にポインタが扱え、またキャストで比較的別の型への行き来が楽なC言語ではあまりメリットは感じないが、そうでない言語は共用体が無いとそういうデータ構造を実現できない。
参考書には載ってなかったんですが 自作関数の中で自作関数を作ることはできますか?
>>436 できない。
他のファイルから見えないstatic関数で我慢しろ。
バイナリファイルを読み込んで改造するにはどうすればいいですか?
BorlandのBCC Developerでファイル入力でEOFを入れるにはどうしたらいいですか? UnixだとCtrl+Dですが・・・
441 :
デフォルトの名無しさん :2005/11/11(金) 22:43:11
C言語で配列じゃなくてリスト構造を使ってシェルソートするプログラムって難しい?
>>441 別に難しくはないけど、無駄に時間がかかるだろ。
数個先の要素にすぐにアクセスとかできないし。
443 :
デフォルトの名無しさん :2005/11/11(金) 23:59:08
じゃあ配列で作ったのほうがいいのか?
444 :
デフォルトの名無しさん :2005/11/12(土) 00:08:51
↓OSでこんな課題でました。C言語もってないのでだれかやって 無限に走り続けるプログラムtest.c というものを作り, 実行可能なプログラムにtest という名前をつけ,これをバックグ ラウンドで走らせ,そのプロセスを殺すこと.必ず,実行結果を 書くこと.プログラムを示すことは必要でない.
445 :
京子 :2005/11/12(土) 00:34:32
チェックボックスのチェックされたの数によって、 ジャンプするページを変えるには、 どのようなプログラムを組めば良いのでしょうか? 例えば、 チェックが0〜5個だと、Aページへジャンプ。 チェックが、6〜10個だと、Bページへジャンプとか、 そういう感じです
VC?
447 :
441 :2005/11/12(土) 05:13:02
ゴメン聞き方が悪かったかな 普通はシェルソートって配列を使ってつくるもの?
>>447 シェルソートは番号で指定された要素へ参照する際のコストがO(1)なのを前提とした場合にO(n^2)にしてる
要素への参照がO(n)だとするとO((2n)^2)になるって考え方で合ってるかな?
450 :
デフォルトの名無しさん :2005/11/12(土) 19:51:34
自作の掲示板を作りたいんですが 知識とかまったくないんです。 なにかまずこの本で基本勉強しろ!ってのあったら教えてください
>>450 cgiをCでならここでもいいかもしれない。
掲示板を設置なら板違い。
ネット関係 web制作管理
cgi全般なら
ネット関係 webプログラミング
以上知らない単語があればググレ
コマンドプロンプト開いて とりあえず command prompt って入力してみたら なんかヘンになった。 だいじょぶかこりゃ。
C言語のライブラリ関数を Javadoc みたいに見れるサイトってありますか?
トランプとかのシャッフルに関する質問なんですが、 乱数を使って配列の中身を交換して上から引いていく 乱数で一枚選んできて、使用済みならもう一回乱数を使う この二つに違いはあるんでしょうか
>>455 速度とか無視して乱数のみに関する話なら、違いは無い
>>455 C言語的に考えると、上はカードの配列かindexの配列をソートする事になりカード枚数分の記憶領域が必要だが、下の場合はビット演算を使う事で必要な記憶領域を減らす事が出来る。
制限のある環境で作成する場合はそういうやり方もあると知っていると役に立つ事もある。
質問なんですけど、 #include<stdio.h> void main(){ int i; for(i=0;i<10;i++){ printf("%d",i); } } と #include<stdio.h> void main(){ int i; for(i=0;i<10; ){ printf("%d",i); i++; } } ってぇのはどー違うんですか? 何で下のプログラムはi++が外に出てるのでしょうか? お願いします(ペコリ
>>459 特に違いはない
ただ「普通は上の書き方だけど、下の書き方もできるよ」程度
>>459 for(i=0;i<10;i++){
printf("%d",i);
}
は、
i = 0;
for (; i < 10;) {
printf("%d", i);
++i;
}
と同じ。
#余計混乱してもしらね。
すいません、またお聞きします。 最初のトコに #include<stdio.h> void main(){ って書いてある場合と #include<stdio.h> int main(void){ って書いてある場合がありますが、これも同じような意味なんでしょうか? 本にはコンパイラが云々って書いてあったんですけどよくわからなくて。。 宜しくお願いします。
>>464 後者は規格で定められた形式の1つなので、
他のコンパイラでも動くという保障がある。
つまり移植性がある。
というわけでint main(void)の方が一般的。
画面に文字を表示させるだけの簡単なプログラムを作ろうとしてコンパイラまでは出来たのですが、 exeファイルを実行すると一瞬だけ画面に現れて消えてしまいます。何が原因でしょうか?
>>466 コマンドプロンプトの中で動かすプログラムだから。
スタートメニューの中のコマンドプロンプトを起動して、
その中でEXEを呼び出せ。
>>467 ありがとうございます!おかげで解決しました。
>>465 成る程、ありがとうございます!!!(*´∀`)
470 :
デフォルトの名無しさん :2005/11/15(火) 10:53:12
C言語で無料のものってボーランドから出ていませんでしたっけ?
さぁ?C++ならあったような気がするが
turbo c? 確かまだ配布してたような
473 :
デフォルトの名無しさん :2005/11/15(火) 12:21:24
visual C ってC言語なの?
>>473 コンパイラです。つーか寧ろ、IDEです。
IDEってケーブルのこと?
ハードディスクとかにつけるケーブルってIDEじゃなかった?
>>477 それはケーブルの名前ではありません。ハードディスクを制御するための規格の名前です。
でvisual Cはその規格なの?
んなこたーない。
IDEってなんですか? 教えて! 検索してもハードディスクのことしか出てこない。。。
統合開発環境 IDE でググれ
なるほど、でvisual CはC言語でいいんですよね? C言語の勉強に買おうと思っているんですけど。
ボーランド+Cパッドで良いんじゃね
それはいくらくらいでしょうか?
>>486 回りくどくてすいません。
でも優しく応対してくれて感謝しています。
今日この板初めてきたもので助かります。
ありがとうございます。、
インストール完了しました。 ありがとうございました。
[問題4/中級]文字列 MOJI に代入されている文字の中から、数字(0から9)だけ を取り出して、それを小さい順に表示するプログラムを作りなさい。 例えば、MOJI[]="9B2C3ADC31" ならば 12339 と表示する。 と 「問題6/上級]次の問題の中から、どれか1つを選び、プログラムを作成して答えを 求めなさい。 (問題6−1)太郎君が9歳になるまで,花子さんの年齢が太郎君の年齢の整数倍にな る年がちょうど7回ある。このとき、太郎君と花子さんの年齢差はいくつか? 解答ヨロシクお願いします。自分お手上げです(泣
>>490 問4) ctype.hとstdlib.h使え
またマルチか
問6)太郎:2歳 花子:2歳
途中で死んだら計算狂うじゃないか うるう年に生まれてたら年齢は普通の人の1/4になるし
>>494 >うるう年に生まれてたら年齢は普通の人の1/4になるし
ネタ乙。
うるう年に生まれてる人間が1/4になるわけないだろ。 2月29日生まれの人が普通の人の1/4しか年を取らない。
2/29生まれは、うるう年以外は2/28と3/1の境目で年を取る、と 何かで定めていなかったっけ。 某ゲームじゃ、2/30が誕生日のやつとかいるし。
日本の法律では、誕生日の前の日の24時に歳をとることになっている。 従って、2/29生まれは2/28の24時に歳をとることになる。 このため、4/1生まれは3/31に就学年齢に達することになるので、早生まれとなる。
ネタ乙。
504 :
502 :2005/11/16(水) 00:59:55
>>503 そうだったんですか。なんとなく終了させたいときにexit使ってましたが関数なのですね。
でも、他のexit含んだプログラムではこんなエラーがでないんですがなぜなのでしょうか?
そのソースは見てないけどINCLUDEしてないだけちゃうん?
506 :
デフォルトの名無しさん :2005/11/16(水) 01:02:28
stdlib.hはインクルードしたか?
>>505 ,506
お二方の言うとおり、#include<stdlib.h>のし忘れだったようです。無事コンパイルできました。
後はコマンドプロンプトで起動するようなので、そちらの使い方を学んでから使ってみます。
ありがとうございましたm(_ _"m)
508 :
デフォルトの名無しさん :2005/11/16(水) 08:54:33
某C言語学習本に 引用開始 float型の変数に値を代入する時 float a; a = 1.5; とすると、コンパイラが警告を発します。 これは、単に「1.5」と書くとdouble型の1.5であると解釈されるからです。 float型の変数よりも大きなサイズのdouble型の数値を代入しようとしているとコンパイラが判断して 「おい、おい、危ないぞ!」と警告を発しているのです。 引用ここまで の記述があるのですが、 float a; a = 1.5; のどこに問題があるのか理解できません。 わかりやすく教えてください。
>float型の変数よりも大きなサイズのdouble型の数値を代入しようとしているとコンパイラが判断して >「おい、おい、危ないぞ!」と警告を発しているのです。 って書いてあるじゃん こちとら、そんなの分かってて代入するんだい! という場合は、 a = (float)1.5; a = 1.5f;
ヘッダファイルとソースファイルを分けて書くときって インクルードするヘッダはどっちに書くべきなんでしょうか?
511 :
デフォルトの名無しさん :2005/11/16(水) 10:42:06
後10分後にテストです。誰か助けてくださいーー^^
ヘッダに置かんでいいものはヘッダには置かない。
>>510 includeの動作から勉強し直せ。
Cソースをincludeすることも可能だぞ。
>>511 ハハ、私は来週の月曜にテスト
C言語難しいよ〜
516 :
デフォルトの名無しさん :2005/11/16(水) 15:25:03
VC++ .Netで構造体の配列作って、 値を入れようとするとエラーになります。 なぜでしょうか? __gc struct ts{ int num; }*pTs[]; pTs = new ts*[64]; pTs[0]->num=1;
518 :
デフォルトの名無しさん :2005/11/16(水) 15:36:33
>517 文法がおかしいの? コンパイラではエラーでないけど・・・orz デバッグでみるとpTs[0]->numは存在しませんになる。 確保できてないのか?
Cを勉強したんだが、次に何をすればいいのか全くわからん・・・・。 一応アルゴリズムの本は読んでるんだが・・・。
自分が組む分野の学習。 他人の書いたプログラムを読んでみる。 設計法を学ぶ(仕様書)
一応WindowsではなくてLinuxとかUnixでプログラミングを組んでみたいとは思ってるんだが
Unix/Linuxのフリーソフトは大概Cで書いてあるのが多いから。それ読め。
ITRONでマルチタスクの設計、開発。 C言語でプログラミングという課題を預かってますが、どうしたらよいのかさっぱりわかりません。 開発環境はWindowsなんですけど・・・
524 :
初心者C :2005/11/16(水) 17:54:08
関数 A() 関数 B() があり、内容はほとんど同じです。 なので、#ifdef等でコンパイル時に切り分けをして、ソースを共通にできればよいなと考えたのですが どうにもうまいやり方がわかりません。 ソースを別ファイルにして、#include すればできそうですが、それだと可視性がわるくなるので気が進みません。 以下のような感じで、記述する方法はあるでしょうか。 void A(){ ? } void B(){ ? } 共通のソース { #ifdef AAA ・・・ #endif #ifdef BBB ・・・ #endif }
>>524 手続きを見直して可能な限り共通の処理を1か所にまとめ、
別関数に切り分ける。
getchar()が挙動不振です・・・
>>518 516のコードではポインタの配列を確保してpTsへ代入しているだけ。
pTs[0]〜pTs[63]までの個々の要素はどこも指していない。
単にts型の配列を作りたいだけなら、
ts *pTs;
pTs = new ts[64];
pTs[0].num = 1;
本当にポインタの配列が欲しいのなら、
ts *pTs[] = new ts*[64];
pTs[0] = new ts;
pTs[0]->num = 1;
(こっちだとC#でいうジャグ配列を再現できる)
質問です fflush()を使うようなプログラムは望ましいものではないと思うんですが そうでしょうか?
んなこたぁない
>fflush()を使うようなプログラムは望ましいものではないと思うんですが 根拠を書け。 #まぁ、反駁するだけだが。
fflushではなくてfflush(stdin)です 処理系に依存するので移植性がないのではないでしょうか?
最初からそう書けよ
うるせーはげ師ね
もう絶対教えてやんね
おまえには死んでも教えてもらわない
getchar getc fgetc などで文字が入力バッファにたまってしまって、 fflush(stdin)でもフラッシュできないときってどうしたらいいんでしょうか?
>>536 前に俺が何処かのスレで似たようなこと聞いたときに教えて貰った方法だが
scanf("%*[^\n]");で次の改行文字直前まで捨てる
scanf("%*c");で改行文字を含めて1文字捨てる
もしくは適当なバッファ確保してfgetsで放り込む
書き忘れたが入力バッファに対するfflushは処理系依存 使うべきではない
読み捨てれば?
printf("_gadad ←下だけ読め"); C言語超ムズい。いやだいやだ。
>>537-538 ども。配列とかでバッファを確保しないやり方だと、scanfと代入抑止文字使うしかないんですね。d
while(getchar()!='\n'); 別にこれでもいいと思うが・・・
>>542 whileの中だったのでwhile使うことまで思いつきませんでしたd
そして途中でEOFが来て死亡っと
while(!feof(stdin) && getchar()!='\n'); こうしなきゃダメか
不定形のボクセルデータの表面抽出の仕方を教えてください><
547 :
デフォルトの名無しさん :2005/11/17(木) 17:31:32
関数のstatic変数ってどのタイミングでメモリに確保されるのですか?
>>547 プログラムがロードされた辺りじゃないかな?
549 :
デフォルトの名無しさん :2005/11/17(木) 18:32:02
OSはwindouwsXPで、DOSで時計を表示するプログラムでエスケープシーケンスが動きません。 「device=%SystemRoot%\system32\ANSI.SYS」をconfig.NTに追加して、 system32の方のプロンプトに直接エスケープシーケンスを書き込んで機能させるところまでできたのですが・・・。 #include<stdio.h> #include<time.h> #include<conio.h> main() { time_t timee; struct tm *timee2; char *timee3; while(!kbhit()){ time(&timee); timee2 = localtime(&timee); timee3 = asctime(timee2); printf("\x1b[4;1H"); printf("現在時刻:%s", timee3); } return 0; } ESC部分は、¥0x1b、¥x1b、で試しました。 よろしくお願いします。
>>549 config.ntは16bit DOSプログラム用。
32bit プログラムではconfig.ntは使われない。
代わりにWinAPIでやるしかない。
551 :
デフォルトの名無しさん :2005/11/17(木) 19:26:45
質問です。 rand関数って同一値が生成されることってあるんですか?
うん。
553 :
549 :2005/11/17(木) 19:33:50
即レスありがとうございます。 winAPIについて少し調べたのですが、これはDOSではなくWINDOWSプログラミングですか? まだDOSプログラムもロクにできませんが、 WINDOWSプログラムの勉強に切り替えても大丈夫ですか? 知識のレベルは、基本情報取得程度で、 Cについては猫サイトを40まで読み、簡単な用語を理解している程度です。
>>553 Win32APIはCとは全くの別物と考えた方がいい
とりあえず推薦図書スレ見てこい
555 :
549 :2005/11/17(木) 19:46:57
Cとは別物なんですか・・・? けど、Cを勉強する上で必要な知識なんですよね? ありがとうございました! 早速見てきます。
>>555 いや、そういうわけではない。
単にWindows固有のことを行いたければWinAPIが必要というだけ。
猫でもを読んでいるのなら、エスケープシーケンスの章は飛ばしてしまえ。
どうせエスケープシーケンスもDOS固有のものであってCとは全く関係ない。
#ちなみに猫では後の章でWinAPIで文字色を変える方法が出てくるから、待っていろ。
557 :
549 :2005/11/17(木) 21:36:57
>556 レスありがとうございます。 迷走してきました。 正直よくわからなかったんですけど、 日本人の本より洋書の翻訳版のほうがいいみたいですね。 立ち読みしてて、読みづらかったんで却下してましたよ・・・。 原書が存在してる以上、英語も覚えないといけないんでしょうね・・・。 マジメに勉強しておけばよかった・・・。 猫にあるんですか? それならそれを今からやってから、明日本屋にいくことにします。 推薦に出てたやつを中心にして、2時間ほど嫌がらせを。 ジュンク堂なんで、誰も文句言いませんけど。
558 :
549 :2005/11/17(木) 22:09:25
猫のwinAPIの章っていうのは、コンソールAPIのことでよかったんでしょうか? 見たことのあるDOSで使ってた関数とwindouwsで使うはずの謎のtypedefされたデータ型がならんでますね・・・。 今自分がなんのプログラミングしてるのかわからなくなりそうですよ・・・。 SDKっていうのも必要みたいですし・・・。 けど、調べるべきことは絞れました。 本屋にはいい感じで行けそうです。 ありがとうございました!できたら報告しにきます。
>>558 そうそう、それそれ。
そこらへんまでくると、もはやC言語編というのは名前だけで、
実態は単なるWinAPI編(ウィンドウなどが絡まないもの)となっている。
>>558 ちなみにSDKというのはVC++(製品版)やBCB/BCC(無料版)などなら付属しているので、改めて入手する必要はない。
グローバル変数は少なく!というのは通説ですが、このグローバル変数というのは 1.いわゆるファイルスコープを持つ変数 2.1に加えてヘッダファイルにextern宣言し、ファイルをまたいで使える変数 のどちらでしょうか。 私は多分1のことだと思うのですが(つまり2はさらに罪が深い)、グローバル 変数を使わないようにする方法がわからないのです。 ソースファイル分割をまとまった機能ごとに行う場合、機能として保持する必要のある 情報はどうしてもグローバルにせざるを得ないと思うのですが。 例えば、通信で受け取った受信フレームの内容や機能のステータスなどです。 まあ2については、extern関数でラップして受け渡せばいいので完全になくせる とは思いますけど。
またいつもの奴懲りずにきた
憧れではないかもしれんが、「プログラマ」ならCやC++が必要になるがな。 程度にもよるけど。
>>562 グローバル変数は通常後者。
前者は、関数外でstatic指定された変数だろ。
> ソースファイル分割をまとまった機能ごとに行う場合、機能として保持する必要のある
> 情報はどうしてもグローバルにせざるを得ないと思うのですが。
> 例えば、通信で受け取った受信フレームの内容や機能のステータスなどです。
そんなことはない。
568 :
デフォルトの名無しさん :2005/11/18(金) 15:59:13
たとえば共通インクルードファイルcommon.hがあったとします。 そのcommon.hを50本のCソース(それぞれ個別実行プログラム)が参照しています。 今までcommon.h内にあるシンボル(define固定値)を共通で利用していたのですが このシンボルでdefineにより決まっていた固定値が、今後変動する値を扱うようになります。 そこで一番影響が少なくテスト本数を最小限にとどめる事を目的として 修正ファイル、リコンパイルソースも極力少なく対応したいと考えます。 どのような方法が有効でしょうか?今考えているのは一つの実行プログラムを追加して 一番最初に動くように作りこみ ヘッダーに持っているシンボルを自由自在な値に塗り替えるように作成すれば 可能な気がしますが、考え方としてはどうでしょうか?
>>568 結論:ダメ。
何故ならば、defineシンボルはコンパイル時に使用されるだけだから。
実行モジュール中には、最適化の影響もあるから影も形も残ってないと思う。
あー、そのdefine定数が文字列ならば、バイナリパッチと言う手も無くは無いけど。 #例えば端末名やユーザ名が固定で埋まっている蛸なプログラムをバイナリパッチで救出したことはある。
C言語のことで質問なんですけど 正整数を二つ入力して、それらの公約数を小さい順に表示してください って問題やってるんですが 公約数を小さい順に表示ってどうやるんでしょうか?
572 :
デフォルトの名無しさん :2005/11/18(金) 16:15:21
分かりやすいご指摘ありがとうございます。 defineはコンパイル時のみに使用されてるのですね。勉強になりました。 50本のソースに対して極力少ない影響範囲の修正ということで define定義をグローバル変数(char型)に変えるとまた違う問題点など出てきますでしょうか? おっしゃる通り、ユーザー名とかそのあたりのchar型の値を取り扱っています。 バイナリパッチという方法もあるのですね、初めて聞くキーワードです。 ちょっとぐぐってまいります。
>>571 qsort
公約数の求め方が分からないという質問なら氏ね
>>571 公約数を小さい順に求めて表示して行けば、
必然的に小さい方から表示されるだろ。
>>572 横から細かいこと言うと、コンパイル時っていうよりはプリコンパイル時な
リテラル以外でdefineに一致するのが全て置き換えられる
/* defineって#defineの事だよな? */
>>575 > プリコンパイル
プリプロセスの方が一般的だね。
プリコンパイルだとプリコンパイルヘッダを連想してしまう…orz
577 :
569 :2005/11/18(金) 16:47:50
>>576 面倒だから説明を端折った。別に後悔していない。
>>572 ユーザー名なら文字列リテラルだろ?
50本ものモジュールの文字列をバイナリパッチするのは保守上、著しい問題があるので激しくお勧めできない。
#漏れの場合は一本だけだったし手作業だからできたわけで。
まぁ、文字列リテラルへのポインタを返す関数を用意するのがましかな。
どっちみち、50本の修正は避けられないけど。
578 :
569 :2005/11/18(金) 16:53:17
念のため補足。 ・グローバルな文字配列をもつ方法 common.h内で、 extern const char * UserName; common.cなどのソース内で、 const char * UserName = "名無しの名"; ・静的な文字配列をもつ方法 common.h内で、 static const char * UserName = "名無しの名"; ・ポインタを返す関数を使う方法 common.h内で、 const char * GetUserName(void); common.cなどのソース内で、 const char * GetUserName(void) {return "名無しの名";}
579 :
デフォルトの名無しさん :2005/11/18(金) 17:09:47
>>569 さま
親身なご指導ありがとうございます。非常に分かりやすかい説明です。
>>578 であげていただいたように、対応する事にします。
他のみなさまもありがとうございました。非常に勉強になりました。
x86 CPUのキャッシュに入っているデータを 直接読む方法はありますか? 例えば、キャッシュの0番地から100番地までを 読み出すとか。
あるよ。
582 :
デフォルトの名無しさん :2005/11/18(金) 20:25:01
現在高一です。 今日初めてC言語を勉強しました。 授業で「二つの整数a=45,b=1の和と差を求めるプログラム」として次の文章をノートに書きました。 /*例題6-1和と差を求める2005.11.18 高校名1年名前*/ #include<stdio.h> int main(void) { int a,b,wa,sa; a=45; b=1; wa=a+b; sa=a-b; printf("a+b=%d\n",wa); printf("a-b=%d\n",sa); } これを実行すると画面上に a+b=46 a-b=44 と出力されるそうです。 ファイル.cをコンパイルしないといけないと言われたのですが、どう言う事でしょうか?
583 :
デフォルトの名無しさん :2005/11/18(金) 20:33:21
こんなところで質問しても役に立ちそうな意見なんて出てきやしないから質問するの止めとこう。
ある二つの数の最大公倍数と最小公約数を求めるプログラムを教えてください
>最大公倍数と最小公約数 最大公約数と最小公倍数だろプ
587 :
585 :2005/11/18(金) 20:47:38
標準入力から下限と上限を入力して素数を求めるプログラムを作っています。 main関数で下限から上限まで数値を動かして別関数に値を渡して素数か調べ、素数だった場合別関数内にて printfしています。 これを1行に5個ずつ出力させ桁も揃えたいのですが、やりかたがわかりません。教えて下さい。
>>589 漠然としすぎてどうしようもないが
frintf("%3d %3d %3d %3d %3d\n", num[i],num[i+1], num{i+2],num{i+3],num[i+4]);
i+=5
これをforかなんかで回せ
591 :
デフォルトの名無しさん :2005/11/18(金) 21:22:46
ある二つの数の最大公約数と最小公倍数を求めるプログラムを教えてください
592 :
591 :2005/11/18(金) 21:30:01
急ぎです 早く
593 :
591 :2005/11/18(金) 21:36:45
遅いよ
594 :
デフォルトの名無しさん :2005/11/18(金) 21:41:11
595 :
デフォルトの名無しさん :2005/11/18(金) 21:47:50
マクロで #define SCORE_CUL(x, y) ( ( (x) / (y) ) * 100 ) を作って、 int score_A = (int)SCORE_CUL(correct, count) //correct と count はintで変数 これでデバッグで score_Aの値みたら 異常な値になっちゃったけどなんで? なんかマイナス8億くらいなんだけどw
#defineの所を(double)(x) / (y)にしてみたら、と初心者が言ってみる
当然コレクトとカウントはスコアAの前に定義してるよな
599 :
591 :2005/11/18(金) 22:01:49
自決しました
600 :
595 :2005/11/18(金) 22:07:53
報告
>>596 countが0のときはSCORE_CUL()の前にアラート出すようにチェックしてあるよw
>>597 とりあえずやってみたけど変わらず。 マクロでdoubleにキャストするなら それをまた(int)でキャストするのは無駄じゃね?
いや、俺もよくわかんないんだけどもね
>>598 correct と count は定義済みです。
ちなみに 表示させてみたのは
correct = 1 , count = 1 の時 score_A = 100
correct = 2 , count = 2 の時 score_A = 100
correct = 2 , count = 3 の時 score_A = 0 ('A`)
>>600 当たり前
2 / 3 = 0
(((double)(x) / (y)) * 100)
掛算(*100)を割算の前に汁
604 :
600 :2005/11/18(金) 22:19:02
>>601 解決しました。 そうでした。 そもそもint だから 2 / 3 = 0 でつね。。。。
>>597 合ってました。ごめんなさい。
分子がdouble なら分母はdoubleにキャストしなくても、それは自動でやってくれるんですか?
606 :
600 :2005/11/18(金) 22:30:41
>>605 どうもありがとうございます。 よく分かりました。 4番にやろうとしたことがそのまま書いてありましたね。
607 :
589 :2005/11/18(金) 22:32:49
ある二つの数の最小公約数と最大公倍数を求めるプログラムを教えてください
609 :
607 :2005/11/18(金) 22:58:42
解決しました
610 :
608 :2005/11/18(金) 23:45:55
解決しました。もう来ません。お騒がせしました
611 :
611 :2005/11/19(土) 02:26:07
解決しました
612 :
デフォルトの名無しさん :2005/11/19(土) 04:48:21
static struct nmlist member[] = { //構造体変数が配列
{"田中一朗", 'M', 20}, //このような配列の初期化は
{"田中次郎", 'M', 16}, //staticで
{"田中花子", 'F', 18}
};
ただの構造体の初期化なんですが、サンプルプログラムには
”このような配列の初期化はstaticで” とそうするのがあたりまえのように書いてあるんですが、
この理由はなんでなんですか?
[引用元] 猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/intro/no_28.htm
これでfatal error が返されてしまうのですが なぜでしょうか? 激初心者です つД`)・゚・。・゚゚・*:.。 #include <iostream> using namespace std; int main() { cout << " bool:" sizeof( bool) << '\n'; getchar(); return 0; }
614 :
613 :2005/11/19(土) 06:51:58
警告は eh.h is only for C++! です。
>612 {;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; autoの構造体は初期化できない ヾ;;;ハ ノ .::!lリ;;r゙ `Z;i 〈.,_..,. ノ;;;;;;;;> そんなふうに考えていた時期が ,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f 俺にもありました ANSI C以前の時期だか
>>613 cout << " bool:" << sizeof( bool) << '\n';
617 :
613 :2005/11/19(土) 07:51:10
<<615様 <<616様 ご解答ありがとうございます! 少し前進しました^^ でも依然としてeh.h is only for C++! のエラーが一つ出てしまい実行出来ません。 ググってみますとiostreamのところに問題があるようなのですが… どなたかお願いします。m(_ _)m
618 :
613 :2005/11/19(土) 07:53:31
上の617で <<615様はミスでした。 すみません
getcharってiostreamだったっけ?
620 :
613 :2005/11/19(土) 07:59:02
<<619様 出力画面保持のため使用してるのですが…
>>617 そもそも613のソースファイルの拡張子はcppなどになっているか?
>>620 getchar()を使うには<cstdio>のインクルードが必要。
<iostream>だけで行いたいのならcin.get()が代替になる。
623 :
613 :2005/11/19(土) 10:08:15
>>621 様
ありがとうございます!
言われた通りにしたらエラーが消えました!
cppになってませんでした。cでやってました。
ほんとうに感謝です!
実行してみたのですが画面出力が真っ黒で
何も出力されていません。
たまに出力される時もあるのですが…
原因わかる方いらっしゃいますか?
自分でも鬱陶しいなって思ってます。
すみません。
624 :
613 :2005/11/19(土) 10:12:35
環境はvisual C++ 6.0 OSはwin98です つД`)・゚・。・゚゚・*:.。
625 :
デフォルトの名無しさん :2005/11/19(土) 11:02:05
C言語勉強するならこの本買っとけ! って言う本ありますか?
K&Rで検索
627 :
デフォルトの名無しさん :2005/11/19(土) 11:09:05
K&R と C言語逆引き大全500の極意 では、どちらがオススメですか?
K&R
何故でしょうか?
まあ、よみくらべてみ・・・
>>613 ここはC言語激初心者スレ、C++はスレ違い。
>>612 autoの配列は、初期化処理が入るため無駄が多い。
但し、その場合はstatic struct nmlistではなくstatic const struct nmlistにするべきかもしれない。
633 :
613 :2005/11/19(土) 13:18:53
>>632 様
すみません。
そっちのスレに逝きます。
ある二つの数の最小公約数と最大公倍数を求めるプログラムを教えてください
635 :
デフォルトの名無しさん :2005/11/19(土) 15:38:34
Linuxでenterのコードってなにになりますか?
636 :
デフォルトの名無しさん :2005/11/19(土) 15:45:19
>>636 そのコマンドを打って何かメッセージは出るだろ。それを書き写せ。
638 :
636 :2005/11/19(土) 16:10:21
bcc32 -W -eRelease\win01.exe win01.cppを打ち込んだ後↓ Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland エラー E2075: コマンドライン オプションの間違い : -W -eRelease\win01.exe
639 :
デフォルトの名無しさん :2005/11/19(土) 16:16:38
>>634 ヒント
while (tmp = (x % y)) {
x = y;
y = tmp;
}
return y;
641 :
636 :2005/11/19(土) 16:52:36
>>640 出来ました。
本当にありがとうございました。
とある事情から、有効桁数が30桁である拡張倍精度実数型を使いたいのですが、 long double型の使用方法で大変困窮しております。 変数に小数点の値を代入して%.30lfで表示させても-0.000(以下略 と表示されてしまうのです。 また、long doubleがdouble型と同等の有効桁数しか扱わないという話も聞きます。 C言語における確実な有効桁数30桁レベルの拡張倍制度実数型を使う方法をご教示下さい。
>>642 少なくとも型の大きさは処理系定義,つまりコンパイラ次第。
たとえばVC++でのlong doubleとdoubleは同一の大きさ(64bit倍精度)という場合もある。
現在使用しているのはボーランドのc++ 5.5です。 doubleは確実に15桁程度なので、もしlong doubleが15桁程度であるのなら、 確実に30桁ある拡張倍精度実数型を使用する方法をご教示いただきたく思います。
>>644 こういった浮動小数点数型の情報は<float.h>を見ればある程度はわかる。
仮数部の桁数はXXX_DIGの定義を見ればわかる。(XXXにはFLT/DBL/LDBLを当てはめる)
俺もBCCを持っているので見てみると、こうなっている。
#define DBL_DIG 15
#define FLT_DIG 6
#define LDBL_DIG 18
……。はい残念でした。ちなみにBorlandのlong doubleは80bit。
x86の浮動小数点数のメモリ読み書きの命令は32, 64, 80bitを受け付けて、レジスタ上では全て80bitで保持している。
(だからほとんどのx86用の処理系ではfloat/double/long doubleの大きさは32/64/80bitになっている)
つまりCPUに頼らず自分でどうにかするしかない。
ご教示いただき有難う御座いました。 自分なりの解決方法を模索してみます。
647 :
636 :2005/11/19(土) 17:59:40
648 :
636 :2005/11/19(土) 18:50:27
ex1は落ちないのにex2で落ちます。bCC32です。gccなんかだと落ちません。 トレースするとreturn d;で落ちてるようです。 原因が分かりません。 NANやINFだとしても、returnで落ちることは無いと思うんですが。 #include <stdio.h> #include <stdlib.h> #include <math.h> double ex1(void) { return pow(3.4, 567) * pow(10, 10); } double ex2(void) { double a, b, c, d; a = 3.4; b = 567; c = pow(a, b); d = c * pow(10, 10); return d; } int main(void) { printf("ex1:\n"); ex1(); printf("ex2:\n"); ex2(); return EXIT_SUCCESS; }
整数の引数を文字列に変えてくれるCの標準関数はありませんか? atoi()の逆のことがやりたいのです。 fprintf()の最初の引数が FILE* でなくて char* になってるようなのを 探しているのですが。
sprintf
>>634 それって1と無限大を返せばいいんじゃねぇの?
scanf の format部分についてなんですけど、 scanf("%d%d",&a,&b); としたときに入力をホワイトスペースで区切らなきゃいけないのはなんで? 感覚的にはそうじゃなきゃ入力から代入できないなとは思うんだけど、 scanf("%d%c%d",&a,c,&b); ではホワイトスペースで区切らなくても代入できる。 これはformatで変換指定で%cとされてるから次に来るのが文字と 内部的に判断されてるからなんですかね?
returnはシステムに値を返すだけだッ
scanf("%d%c%d",&a,c,&b); →scanf("%d%c%d",&a,&c,&b)でした
>>656 %c(とたしか%[]系)は空白類文字も読み込む仕様。
その他の書式指定は空白類文字を読み飛ばす仕様。
int test(int a,int b) { int c=1; while (c) { c=a%b; a=b;b=c; } このプログラムなんですが。while(c)とはどういう意味ですか?
>>658 c
という式が真(0以外)か偽(0)を評価して、
真ならば{}内を実行、偽ならば実行しない。
この場合cに1が代入されてるから実行する。
661 :
デフォルトの名無しさん :2005/11/19(土) 23:07:35
//暗号キーの入力 printf("暗号キーを入力してください>"); scanf("%s",key); keylen=strlen(key); //原文ファイル(入力ファイル)オープン fp=fopen(filename,"rb"); if(!fp){ printf("エラー1ファイルオープンエラー\n"); exit(1); } printf("原文ファイルオープン完了\n");
662 :
デフォルトの名無しさん :2005/11/19(土) 23:09:02
//暗号化ファイル(出力ファイル)オープン strcpy(outfilename,filename); strcat(outfilename,"_"); if(!wfp){ printf("エラー2ファイルオープンエラー\n"); exit(1); } printf("暗号化ファイルオープン完了\n"); //暗号化 while (fread(&ch,sizeof(char),1,fp)==1){ printf("ステップ1完了\n"); ch=ch+key[i++]; printf("ステップ2完了\n"); if(i>=keylen){i=0;} printf("ステップ3完了\n"); fwrite(&ch,sizeof(char),1,wfp); } printf("暗号化完了\n"); fclose(wfp); printf("wfpクローズ完了\n"); fclose(fp); printf("ファイル%sを暗号化しました\n",filename); printf("作成ファイル:%s\n",outfilename); return 0; } ステップ3完了のところでエラーがでるので fwrite(&ch,sizeof(char),1,wfp);が悪さをしているのはわかったのですがそこからがわかりません。 よろしくおねがいします。
663 :
誤爆してしまましたこれが一番上にきます :2005/11/19(土) 23:09:50
ファイルを暗号化するプログラムを書いているんですがコンパイルして実行してみると 問題が発生したためとの趣旨で終了させられます。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<dir.h> main(int argc,char*argv[]){ char ch; FILE *fp; FILE *wfp; char filename[256]; char outfilename[256]; char key[128]; int keylen; int i=0; //原文ファイル名の決定 if(argc > 1){ strcpy(filename,argv[1]); }else{ printf("ファイル名を入力してください>"); scanf("%s",filename); }
wfpにfopenしてなくないか?
してます
どこで?
if(!wfp){ printf("エラー2ファイルオープンエラー\n"); exit(1); }
なんだネタか
fopenはどこ? てか、誤爆した挙句ネタなのかよ
670 :
デフォルトの名無しさん :2005/11/20(日) 09:42:25
>>664 ありがとうございます。
strcpy(outfilename,filename);
strcat(outfilename,"_");
wfp=fopen(outfilename,"wb");
if(!wfp){
でおkみたいです。fopenし忘れる初歩的なミスでスレを汚してしまいました。
すいませんでした。
671 :
デフォルトの名無しさん :2005/11/20(日) 20:17:53
printf( "\\ is escape letter\n"); などと書いた場合に、エスケープシーケンスの部分\\の解釈 はプリプロセッサが行うのでしょうか?
いいえ
ビルゲイツが行います
674 :
671 :2005/11/20(日) 20:21:53
コンパイラが行うのでしょうか?
はい
いいえ
677 :
デフォルトの名無しさん :2005/11/20(日) 20:26:04
ウインドウを表示するプログラムをコンパイルしたのですが、 外部シンボル ’_main’が未解決 (C:\borand\bcc55\lib\cox32.obj が参照) っていうエラーがでます。 どういう意味ですか?
WinMain()がスタートアップだったら、コンパイラオプションでなんか指定してやらんといかんかったはず。 当該スレへ。
679 :
677 :2005/11/20(日) 20:32:33
難しいですね・・・。 とりあえずCスレではないのですね。ありがとうございました。 それでは逝ってきます。
680 :
デフォルトの名無しさん :2005/11/20(日) 21:06:09
すみません。ある文字列を配列に入力してenterキーが入力されたらそこに! をいれて表示するっていうプログラムを関数つかって作ったんですけどSegmentation faultってでてしまうんです。ちなみにLinuxです。 悪いところを教えてください。 #include <stdio.h> char ho(char ho[20]) { int i; while(ho[i]=11) { ho[i]=33; } return ho[20]; } int main() { int i; char na[20],s[20]; for(i=0;i<20;i++) { na[i]=0; } printf("文字列を入力->"); scanf("%s",na); s[20]=ho(na); printf("%s",&s); }
まあ・・・きちんと本を読むのがいいぞ。うん。
20文字確保したら、インデックスは0-19しか使えないよ。
なんか日曜の夜に激しい釣りを見ているキガス。 とりあえず、return ho[20]は何のために書いた? s[20]=ho(na)も。
684 :
680 :2005/11/20(日) 21:18:12
Linuxでenterキーのアスキーコードは72でいいんですよね? Segmentation faultってことは メインと関数の間で受け渡しがうまくいってないってことですか?
ホント釣り名人だね680は Segmentation fault の直接の原因は ho関数先頭の int i の初期化忘れ。
686 :
680 :2005/11/20(日) 21:35:08
s[20]=ho(na)ってのはna配列についてho関数を使うってことで return ho[20]ってのはho関数の結果として返してるってことですよね? あと初期化したら入力の時点で回り続けるようになりました。
s[20]=ho(na)ってのはna配列についてho関数を使うってことで return ho[20]ってのはho関数の結果として返してるってことですよね? s[20]=ho(na)ってのは20要素確保されたsの21番目にhoの返り血を代入するってことで return ho[20]ってのは引数hoの21番目の要素を返すってことです。 >入力の時点で回り続けるようになりました。 要するに無限ループに陥ったと。= と == の違いについて調べたまへ。
688 :
デフォルトの名無しさん :2005/11/20(日) 22:05:50
16進数を2進数に変換して文字列として格納するんですが、 0x12341234 => 00010010 00110100 00010010 00110100 のようにバイトに区切って1バイト毎に格納するプログラムを作りたいんです。 単純に2進数に変換するだけならできるんだけど区切る方法が思いつかなくて・・・お願いします
このスレの激初心者は飾りか? 激初心者を誘っといて釣り呼ばわりしてストレス解消とはたちの悪い奴らだな。
690 :
680 :2005/11/20(日) 22:10:34
配列として受け取るにはchar ho(char ho[])ってすればいいんですか? でもそうするとreturnがわかりません。あとメイン側もs=ho(na);に してみましたがこれでよいのでしょうか?
変換したい数をxとして、 単純に1バイトを2進文字列にする関数を引数(x >> 24) & 0xffで呼ぶ 末尾に空白を追加 単純に1バイトを2進文字列にする関数を引数(x >> 16) & 0xffで呼ぶ 末尾に空白を追加 単純に1バイトを2進文字列にする関数を引数(x >> 8) & 0xffで呼ぶ 末尾に空白を追加 単純に1バイトを2進文字列にする関数を引数x & 0xffで呼ぶ
>>690 とりあえず言っておくと、配列を返すことは出来ない
693 :
688 :2005/11/20(日) 22:14:33
配列を引数で受け取ることもできない。 引数で渡しているのは、配列先頭を指すポインタ。
695 :
680 :2005/11/20(日) 22:24:09
>>692 じゃあ配列の中身を返すのを回すのですか?
あとho関数の最初のiの初期化ですがi=1を加えると無限ループになってしまうのですがこれはまちがっているんですか?
別の配列に入れたいんなら、その配列も一緒に渡すようにすれば? ho(na, s)って言う感じに
>>689 680みたいなコード見ると昔の自分を思い出して恥ず〜で「釣り」って書いちゃうんだよ
サポートはサポートでやってるんだからそう怒るんって。
>>695 C言語では配列は0から始まる。char na[20]; と宣言したなら、
na[0] から na[19] までが有効な範囲だ。
while(ho[i]=11) というのは ho[i] に 11 を代入した上で
ho[i] がゼロであるかどうかを判別しているので無限ループになる
以前は ho[i] が例えば ho[-38234] とかになってたせいで
Segmentation fault になってたわけだわな。
698 :
688 :2005/11/20(日) 22:51:38
すまん、いざ作ってみようと思ったが全然ダメだった・・・ 軽くでいいからヒントお願いします・・orz
699 :
680 :2005/11/20(日) 22:57:14
もうなにがなんだかわかんなくなったので具体的にどうすりゃいいか 答えおしえてください。ごめんなさい
あきらめろ。
>680 まあ、誉められた方法ではないが。 int main(void) {char buf[100]; while (gets(buf)) printf("%s!\n", buf); return 0;}
702 :
680 :2005/11/20(日) 23:11:35
Linuxとg++だとgetsでエラーがでます。 配列と関数では無理ってことですか
>>702 getsはバッファオーバーランなどの危険が伴うから。
fgets使え。
あー。エラーちゅうか警告な。メンドイんで、書いてしまった。 int main(void) {char buf[100]; while (fgets(buf, 100, stdin)) printf("%s!\n", buf); return 0;}
705 :
680 :2005/11/20(日) 23:18:11
せっかく教えてもらったのにあれだけど
>>680 をなおしてもらえませんか?
706 :
680 :2005/11/20(日) 23:44:30
Linuxのenterってアスキーコードでなにですか?
>>706 LF
ただしCではどんな環境でも改行文字は'\n'と定められている。
(たとえばWindowsでは入出力時に\r\nと\nの変換が行われている)
バッファオーバーランってなんですか? 具体的にそれがどういうことをされると、どういった危険が伴うんですか?
まずはぐぐれ
>>708 バッファオーバーランとは本来実行するコードやそこへのアドレスが書かれたメモリにデータが書き込まれてしまうこと。
華麗に悪用されるとクラッカーにプログラムの実行を乗っ取られてしまう。
ウィルスを仕込んだり機密データを読み取ったりその気になれば自由自在。
説明が逆だな。間違っちゃいないけど。
2つの文字列が同じなら〜を実行っていうプログラムを書きたいんですが char str1[] = "aaa"; char str2[] = "aaa"; if(str1 == str2){ ・・・・ } ではうまくいきません どうすればいいんでしょう
>>712 入門書でも読めば?
そんなレベルの質問をずっと続けるつもりですか?
ごめんなさい
そして誰も来なくなった
ここは激初心者にやさしくないスレですね。
>>712 char str1[ ] = {aaa};
以下同様に...
>>717 ありがとうございます。
一文字ずつ比べてたorz
720 :
デフォルトの名無しさん :2005/11/21(月) 22:24:20
文字列の入力でEOF文字が入力されると処理を終了するってのを作りたいんだけど、 判定文って scanf("%s" , str ) == EOF じゃだめなの?
scanf は引数の解析がワヤなねんの意味でEOFを返すんで 終了させたかったら CTRL+Z なり CTRL+D なり打ってってね、 という了解の上ならそれで良いんじゃないの。
止めた方がいいと思うなぁ。
#defineで定義するマクロに、配列を引数として使うにはどうしたらいいんですか?
先ずは初心者らしく、やりたいことを具体的に書きなさい。
725 :
デフォルトの名無しさん :2005/11/22(火) 14:02:46
先生方すいません、質問です。 計算結果を出力しようとしたら 1.#QNANO って出るんですが↑ってどうゆうことですか?
先ずは初心者らしく、問題のプログラムを貼りなさい。
printf("1.#QNANO\n");
728 :
デフォルトの名無しさん :2005/11/22(火) 14:21:47
すいません。 プログラムがかなり長いので‥w printf("%3f %f\n",s,ins[i]); ↑でsの値とins[i]に格納した値を出力しようとしたら 0.001000 1.#QNANO と出力されてしまいましたw
>>728 恐らく、ins[i]がfloat型かdouble型じゃないか、配列の中身が壊れているんジャマイカ。
直前にins[i] = 0;すれば0が出力されるはずだ。
或いは、ins[i] + ins[i]を出力しようとしてみても何かわかるかも知らん。
730 :
728 :2005/11/22(火) 15:25:24
>>729 レスありがとうございます!
ins[i]はdouble型です。
ins[i]=0;を直前にいれると
0.001000 0.0000000
と出力しました。
ins[i]+ins[i]を出力しようとすると
0.001000 1.#QNANO
と出力されてしまいました。。
>>730 そうなると、配列の中身が壊れている。
壊れている原因はこんなもんかな。
・0割り算した結果が格納された
・初期化されていない
・他の配列操作か何かで上書きされた
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #define LINE_BUF 80 #define LOG_ARRAY 1000 using std::cin; using std::cout; using std::endl; int space(char*src){ int n; if(src==NULL){ return 0; } for(n=0;n<strlen(src);n++){ if(src[n]==' '){ return n+1; } else if(src[n]=='\t'){ return n+1; } } return 0; } int comp(const void *p1, const void *p2){ return( *(int *)p1 - *(int *)p2 ); }
int main(){ char src[LINE_BUF]; int line,z,n; FILE* fp=fopen("AHO.txt","r"); n=sizeof(src)/sizeof(src[0]); if(!fp){ printf("File open error\n"); return 0; } for(line=0;fgets(src,sizeof src,fp)!=NULL;line++){ z = space(src); qsort(z,81,sizeof(src[0]),comp); cout << z <<endl; } fclose(fp); return 0; } このプログラムをコンパイルしようとすると,test.cpp:44: error: invalid conversion from `int' to `void*'というエラーが出ます。 どこを手直しすればよろしいのでしょうか?よろしくお願いします。
>>733 >どこを手直しすればよろしいのでしょうか
該当個所だけでなく、あちらこちら。
配列について勉強しなおせ。
735 :
デフォルトの名無しさん :2005/11/22(火) 16:56:38
printf()のような可変個数の引数をとる関数のラッパー関数の 作り方を教えてください。例えば Wprintf()というものを int Wprintf(int a, const char *format,...) { if(a < 0) return -1; /* もし第1引数が負ならば即終了 */ else printf(format,...); /* ここで第2引数以下全てをprintf()に渡したい */ return 0; } な感じにしたいんですが printfにどうやって第2引数以下全ての引数を渡せばいいんでしょうか。
>>733 第1パラメータ。
なんだけど、どうやら数値と文字列の区別がついてない模様。
738 :
728 :2005/11/22(火) 17:19:39
>>731 台形公式を使った定積分の数値計算なので
式のどこかで0で割ってしまっているかもしれません。
初期化、上書きは問題ないようなので
もう一度式を洗い直してみます。
ご教授ありがとうございました!
IPを収得する方法がわかりません どなたか教えてください
>>739 MSDOSでnslookupと打てばわかる。もしくは、教えてくれるサーバに行く。
マジレスすると、DNSサーバに問い合わせる。
ポート番号は・・・・。
>>741 すみません言葉不足でした。
自PCのIPアドレスを収得したいのですが?
前回のリターン入力から今回のリターン入力までの経過時間を測定したいのですが リターンをそれぞれ読み込むにはどのようにすればいいでしょうか。
>>742 必ず127.0.0.1と決まっています。
745 :
739 :2005/11/22(火) 19:27:01
解決しました、 本当にありがとうございました
>>743 getchar 使うのが一番わかりやすいかな?
int c;
while ((c = getchar()) != EOF) {
if (c == '\n') {
/* ここで時間を計る */
}
}
>>739 Cプログラムでないなら、板違い。質問すれをすすめます。
127.0.0.1も間違ってはないが
>>739 はなんで知りたかったんだろう。
748 :
デフォルトの名無しさん :2005/11/22(火) 21:28:39
728さんは納得して去っていったみたいだけど・・・ QNANDって "Quiet Not A Number Division" 例外のことで合ってますよね?
2次元配列で文字列を出力したいのですが printfで確かめてる最中、変な事が起きました #include <stdio.h> #include <string.h> int main(void) { int i; char s1[999][999]; for( i = 0; i < 10;i++ ) { scanf("%s\n",s1[i]); printf("%s\n",s1[i]); } return(0); } これで実行してみると、最初に文字列を入力しても出力しないで、次の文字列を入力すると 一個前の文字列が出力されてしまいます。 scanfをgetsに変えたら順次出力されたのですが、これはなんででしょうか
>>749 ・scanf()の仕様をよく読んでください。
#改行コードは何のためにつけているのですか?
・gets()は使ってはいけません。
#代わりにfgets()が使えます。
・配列の要素数が999個というのは何のメリットもありません。
#判りやすく1000個としてみては如何でしょうか。
751 :
デフォルトの名無しさん :2005/11/22(火) 23:49:44
>・scanf()の仕様をよく読んでください ごめんなさい、よくわかりません >・gets()は使ってはいけません。 今のところ学校でscanfとgetsしか習ってないもので >・配列の要素数が999個というのは何のメリットもありません。 解りました、1000にしてみます
>>751 scanf( 書式指定文字列 , アドレス);
>751は天然なのか、意図的に>750の#行を読み飛ばしているかのようだ。
scanfって仕様が難しいのによく最初に教えるもんだな
755 :
デフォルトの名無しさん :2005/11/23(水) 15:01:19
CとC++って何か違うのですか? Borland C++ Compiler というのでCのコンパイルはできますか?
756 :
デフォルトの名無しさん :2005/11/23(水) 15:14:15
WindowsXPでバックスラッシュの半角がだせません。誰か教えてくれませんか?
\
758 :
デフォルトの名無しさん :2005/11/23(水) 16:11:06
たとえばn=4と入力した時に * ** *** **** ↑このように出力するプログラムはどうやって作ればいいんでしょう。どなたか教えてください('A`)
>>758 それを他人に図を使わずに説明しようと試みてください。
ほぼそれがプログラムになります。
760 :
758 :2005/11/23(水) 16:31:01
>>759 自己解決しました。ありがとうございます。
fgets(buf, 256, stdin); sscanf(buf, "%d %d %d %d %d %d", &a[0],&a[1],&a[2],&a[3],&a[4],&a[5]); こんな風にfgetsで1行取り込んだあとbufから多くの数字を取り出したいときに配列の添え字を直接数字でなく for(i=0;i<MAX; i++) func(buf, "%d ", &a[i]); のような形で取り出す方法あります? 上記func部をsscanfにしてみてもbufの最初の数字を何回も配列に放り込んでいくだけにしかならないんですが。
>>761 strtok でトークンを切り出して atoi で変換というのが方法の一つですね。
それから質問は揚げていきましょう。
>>761 sscanfだと無理なんじゃないかな。
数値のみならstrtolでループ回せば出来る。
>>761 int a[20];
int idx;
int cnt;
char buf[100];
char * str;
str = fgets(buf, sizeof(buf), stdin);
do {
cnt = sscanf(str, "%d%n", & a[ic], & idx);
if (cnt > 0) {
++ic;
}
str += idx;
} while (cnt > 0);
初心者相手だからって、随分程度低いのが多いなぁ。
766 :
761 :2005/11/23(水) 17:20:55
757に補足すると日本語フォントでは半角バックスラッシュの位置に半角円記号が搭載されているから\で良いということになる。
>>755 できる。拡張子cだとCとしてコンパイルされて、拡張子がcppなどだとC++としてコンパイルされる。
けれどCの勉強をするのであっても基本的には拡張子cppにしてC++コンパイルにするほうが良い。
なぜならC++のほうがエラーチェックが厳しくなっているから。
#include <stdio.h> main [] { printf["c programming"]; return 0; } ↑これを実行すると Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland sample.c: エラー E2141 sample.c 3: 宣言の構文エラー *** 1 errors in Compile *** とエラーがでます どうすればいいのでしょうか?
770 :
デフォルトの名無しさん :2005/11/23(水) 21:22:44
下のようなプログラムを作りました。 #include<stdio.h> #include<math.h> #define N 100 void main() { int i,n; double s,ss,average,variance,sigma,w; double a[N+1]; /*データの個数の入力*/ printf("データの個数を入力してください\n"); printf("n="); scanf("%d",&n); /*安全装置*/ if (n>N) exit(1); /*データの入力*/ for (i=1; i<=n; ++i) { printf("a[%d]=",i); scanf("%lf",&a[i]); } s=0.0;
772 :
デフォルトの名無しさん :2005/11/23(水) 21:23:18
コンパイルの仕方がわからん?
773 :
770 :2005/11/23(水) 21:23:23
(770の続き) /*データの和の計算*/ for (i=1; i<=n; ++i) s+=a[i]; average=s/n; printf("平均値 %lf \n",average); for (i=1; i<=n; ++i) { w=a[i]-average; ss+=w*w; } variance=ss/n; printf("分散 %lf \n",variance); sigma=sqrt(variance); printf("標準偏差 %lf \n",sigma); }
774 :
770 :2005/11/23(水) 21:26:04
実行すると、分散と標準偏差が+NANと表示されてしまいます。 何かプログラムに問題があると思うんですが・・・どなたかご指摘よろしくお願いします。
>>774 多分入力時の改行コードの問題。
配列をクリアもしてないからわけわからん値での計算になる。
>>771 できました、ありがとうございます
半角入力の時に()を打つときはどうすばいいのでしょうか?
さっきはコピペで済ませましたが・・・
>>776 IMEをOFFにしてShift+8や9でできるだろ。全角と何か違いがある?
>>777 8と9に()があるのに気づきませんでした('A`)
全角括弧にしたらエラーがでたので
どうもありがとうございます
ソースファイル自動整形ツールでいいのありませんか?
781 :
デフォルトの名無しさん :2005/11/23(水) 23:13:15
すみません。急遽仕事でC++をやることになって最近勉強を開始した 初心者です。いくつか疑問点に教えていただけないでしょうか。 派生クラスのメソッドが基本クラスのメソッドを呼び出せるのは分かるのですが 逆はできるのでしょうか? あるメソッド内で宣言されたオブジェクトはそのメソッドを抜けたら自動的に消えるのですか? 消えるとしたらオブジェクトのメンバのデータも一緒に消失するのですか? あるメソッド内でnewで動的に取得された構造体配列を他のメソッドから参照できるようにすることは 可能ですか? 以上、どうか宜しくお願いいたします。
>>781 virtualメソッドでオーバーライドすればいい。
ローカル定義は消える、ヒープだと消えない。
クラスの定義次第だが、普通デストラクタで消す。
可能。っつーか、できなきゃ何のためにクラス変数があるのかわからん。
>>781 (1)限られた状況で可能。
(2)(3)オブジェクトは関数などのスコープを抜けると、クラスで
あればデストラクタが呼び出されて、そのオブジェクトによって
静的に確保された領域が開放される。
(4)あるメソッド内で動的に確保された領域へのポインタを保存して
おけば、できる。ただし、デストラクタでの開放を忘れないように。
スレ違い。
784 :
デフォルトの名無しさん :2005/11/23(水) 23:33:44
>>782 すばやいお返事ありがとうございました。調べてみたいと思います。
最後の質問についてなんですが、クラス変数に構造体配列を設定できる
ということでしょうか。
その場合配列の大きさはメソッドから動的に定められるのですか?
定められるとしたらキーワードだけでもいいので方法を教えて
いただけないでしょうか。
この点だけお願いいたします。
>>783 時間差でレスしていただいたんですね。
ありがとうございました。調べてみます。
>>784 配列の大きさは配列の大きさを持つ変数を別途用意する。
787 :
デフォルトの名無しさん :2005/11/24(木) 03:49:32
788 :
デフォルトの名無しさん :2005/11/24(木) 16:03:33
すいません、質問です。 PDFファイルを開いて、VC++で作った画面に表示をさせたいのです。 そのためには、Acrobat SDKを使用すれば可能でしょうか? それとも、Acrobat SDKを使用しないでAPIみたいのがあるのでしょうか?
そもそもAcrobat SDKには何が入っているかは知らないけど、 少なくともPDFはオートメーションサーバになっているはずだから、 その気になればVC++付属のPratform SDKだけでもできる。
790 :
デフォルトの名無しさん :2005/11/24(木) 17:28:56
>>788 まず、PDFのファイル構造を理解しているのか?と問いたい。
# 後、自力で解析すればどうにでもなる。
791 :
デフォルトの名無しさん :2005/11/24(木) 18:24:43
scanfを使って数字を代入すると勝手に改行してしまうんですけど 改行させない方法があれば誰か教えてください。
int *p = NULL; p = new int[0]; とするとpはどうなるんでしょうか
>>792 要素のない配列が割り付けられる。By X 3014:2003 (ISO/IEC 14882 :2003)
だからC++はスレ違いっだってば!
二次元配列で new[5000][5000]くらいのでっかいの作りたいのですが、どうもうまくいきません intやdoubleで宣言して どうやったら大きな配列が確保できるでしょうか
リンカオプションでスタックサイズを変えるか、 malloc等で動的確保。
#include <stdio.h> int main(void){ char c; int i; long l; float f; double d; char ac[5000][5000];/* Array of Char */ int ai[100][200];/* Array of Int */ double ad[120][200];/* Array of Double */ printf("# Basic Type\n"); printf("char:\t%d\n",sizeof(c)); printf("int:\t%d\n",sizeof(i)); printf("long:\t%d\n",sizeof(l)); printf("float:\t%d\n",sizeof(f)); printf("double:\t%d\n",sizeof(d)); printf("# Array\n"); printf("char array:\t%d\n",sizeof(ac)); printf("int array:\t%d\n",sizeof(ai)); printf("double array:\t%d\n",sizeof(ad)); printf("# Array Number\n"); printf("char array #:\t%d\n",sizeof(ac)/sizeof(char)); printf("int array #:\t%d\n",sizeof(ai)/sizeof(int)); printf("double array #:\t%d\n",sizeof(ad)/sizeof(double)); } こういうので仮に2次元配列の容量を見ようとしたらとまって ↓
↑ だから、でかすぎるんだよ
#include <stdio.h> #include <stdlib.h> #define SIZE (100) int main(void) { int a[1000][1000]; int i; int *k; k=(int *)malloc(SIZE*sizeof(a)); if(a==NULL) exit(-1); for(i=0;i<SIZE;i++){ printf("[%2d]%d\n",i,k[i]); if(i%10==9) printf("\n"); } free(k); } これだと落ちます どうにかしてでかい配列扱いたいのですが
>>796 関数内で宣言した変数のために使えるメモリは意外と小さい。(通常1MiBytes程度)
動的確保するのが理想だが,とりあえずは796の配列変数を全て静的変数にしてみろ。
char ac[5000][5000];→static char ac[5000][5000];
>>798 > int a[1000][1000];
どうしてこれ残してるんだよ。
>>799 できたできたー
今まで悩んでいたのがウソのようだ
助かりました、ありがとぅ〜
ありがとありがとありがと
802 :
デフォルトの名無しさん :2005/11/25(金) 03:54:44
C言語は 独学で学べますか? 独学では限界がありますか? よく本屋にいろいろありますが 読んでもあまりよく分かんないです やっぱり独学は難しいですかね
お前には無理だ
坊やだからさ。 Aはふつう教えてないけど、でも学校で教えるのはBまでさ。 Cは自分でしなさい。Dは・・・・。っと ここにもゆとーり教育の成果物が出てるな。 自分でしねえ、できねえヤシができるようになるわけねぇだろが。バカwww そのコメントは「独学じゃあ無理ですよね!」って言いたげだな、ヲイ。 貴様が理解できない理由は 独 学 の せい じゃ な い。 あまり分からないだって?実際はまったく分からないんだろう。 学校とかで教えている内容のほうが屑だぞ。 まあ、勉強でも何でもして視野を広げられるようにしたほうがいいよ。
805 :
デフォルトの名無しさん :2005/11/25(金) 13:28:49
どこが 激初心者スレ なんだよ 結局叩くやつしかいないじゃん 典型2ちゃんって感じ
>>802 無理ですから、専門学校に行って下さいね。
>>805 勉強することは自信が持てたり、視野が広がったり、
多くのものを得られるのは事実だろう。
しかし、だからこそ教えてやらねばならんのだが扱いが
>>802 のように
難しいリアル厨などがいる。
彼らは勉強の方法すらその前にして自分も世界も若さゆえに知らんのだ。
2chとて礼節を弁え、スレを尊ばんとする者も居る。
さりとて、住人もリアルに生きているし、
>>802 のような若人には
厳しさも肝要。知らずにマルチもするだろう。
君も何れ大人になれば分かるときがくる。
808 :
デフォルトの名無しさん :2005/11/25(金) 16:50:18
>>802 独学でも出来る
とりあえず、Linuxとかgnuのソースでも持ってきて何か一つ解析してみれば?
それが終ったら自分でそれのコピーを自分で書いてみる
これが出来れば大丈夫
こらこら,みんな大げさすぎる。
810 :
半人前 :2005/11/25(金) 23:37:49
初めてのCとかCの絵本とか買え。 とりあえず初心者向け。 それと解らないのは読んでるからだ。 プログラムなんかやったことないやつが読んで理解できるわけないだろ。 ある程度基礎積んでるから他の言語の本読んでもわかる人いるけど まるっきり初心者なら本買ってきて実際ににやりなさい。 ただ気をつけてほしいのは本に書いてるのをやると実際動く。 それで理解した気にならないでほしい。本のは正解、動いて当然。 それよりもどこがどうなって動いたのか、読み解けるようになれ。 まぁ、それが解析と言うやつだ。それが出来るようになったら、別の本を買え。 君がどこまでマスターしたいのか知らんがC言語における一般的なマスターと言うのは プログラミング言語C ANSI規格準拠 第2版 を読み解けることだと私は思っている。 最後に二言、美しいプログラムを書け。 見てごちゃごちゃしてるプログラムは動くかどうかもわからない。 デバックもしにくい。 そして、コメントを書け。 自分だけでなく他の人が読んでも解るようにな。 コメントを書けば自分でも理解しながら書ける。 健闘を祈る。
自分じゃできないことを他人に薦める人が多いな 俺は除いて
嘘つけ
813 :
半人前 :2005/11/25(金) 23:51:17
うぃ、まだ私は読みきれない。
814 :
デフォルトの名無しさん :2005/11/26(土) 06:38:19
とある5次方程式の解の一つを求めたいのですが、接線がべたーっとx軸に水平に なってしまうため、ニュートン法などが使えません。ちなみに関数の形は y=x*((x+0.01214)^2)*((0.98786-x)^2)*(0.0000000000667*1.0123)-((0.98786-x)^2)*0.0000000000667*1+((0.01214+x)^2)*0.0000000000667*0.0123 というものです(ラグランジュポイントのL1を求める式です)。 y=0となるxを求めるために、何か良い方法は無いでしょうか。
815 :
デフォルトの名無しさん :2005/11/26(土) 08:56:51
>>814 y2 = y*2.0e-10/3.0 なる y2 の解を求めればええんじゃないの?
>>814 ニュートン法が使えないって事はないが、二分法で。
#include <stdio.h>
#include <math.h>
double fn(double x){
return x*pow(x+0.01214,2)*pow(0.98786-x,2)*(0.0000000000667*1.0123)\
- pow(0.98786-x,2)*0.0000000000667*1 \
+ pow(0.01214+x,2)*0.0000000000667*0.0123;
}
int main(){
double x1=0.5, x3=1.0, x2,y;
double eps=0.000000000000001;
for(;;){
x2=(x1+x3)/2.0;
y=fn(x2);
if ((y==0) || fabs(x1-x3)<eps)
break;
else if (y < 0)
x1 = x2;
else
x3 = x2;
}
printf("%.15f\n",x2);
return 0;
}
818 :
814 :2005/11/26(土) 11:26:34
>>816 すみません、どうしてそれを求めればよいのかが分かりません・・・。
教えていただけないでしょうか。
>>817 ありがとうございます、完璧に出ました!
自分でプログラムした時にはそこまで小さなepsにするとエラーが出てしまったのですが、
このプログラムだと華麗に動きますね。感動しました、ありがとうございます。
819 :
814 :2005/11/26(土) 11:59:29
>>817 プログラムを参考にさせていただいた結果、ニュートン法でも結果を得ることができました。
本当にありがとうございました。勉強になりました。
820 :
816 :2005/11/26(土) 13:53:26
>>818 すでに解決済みのようだが意図としては右辺全項に 0.0000000000667 が掛かってるんで
これを消去した式で解を求めれば速度と精度と両方向上するよねってことですた。
y と y2 が逆だな。ちゃんと確認しろよ >>俺
821 :
814 :2005/11/26(土) 14:52:07
>>820 仰る通りですね(^^;
そんな単純なことに今まで気が付きませんでした・・・。
的確なご指摘、ありがとうございます。
822 :
デフォルトの名無しさん :2005/11/26(土) 16:50:40
>三つの整数35,88,154を変数a,b,cにそれぞれ代入して、 >a+b+cおよびa-b-cを計算するプログラムを作りなさい。 出力結果は a+b+c=277 a-b-c=-207 にしたいのですが、どうすればいいでしょうか?
a = 35; b = 88; c = 154; printf("a+b+c=%d\n", a+b+c); printf("a-b-c=%d\n", a-b-c);
824 :
822 :2005/11/26(土) 17:07:04
>>823 これでいいのでしょうか?
#include<stdio.h>
int main(void)
{
int a,b,c,a+b+c,a-b-c;
a=35;
b=88;
c=154;
a+b+c=a+b+c;
a-b-c=a-b-c;
printf("a+b+c=%d\n",wa);
printf("a-b-c=%d\n",sa);
return 0;
}
826 :
822 :2005/11/26(土) 17:15:15
1.a+b+cおよびa-b-cという変数は宣言できない 2.waとsaと言う変数が宣言されていないし値の代入が行われていない
828 :
822 :2005/11/26(土) 18:10:19
>>827 2.は分りましたが、1.はどう宣言すれば良いのでしょうか?
830 :
デフォルトの名無しさん :2005/11/26(土) 18:20:50
すみません、質問させてください。 sscanfとfgetsを使って、例えば「I am student.」 と入力したとき、 I → word[0]に1 am → word[1]に2 student→ word[2]に6 と配列に文字数を格納するにはどう 書けばいいのでしょうか・・。
831 :
822 :2005/11/26(土) 18:22:28
こうですか? #include<stdio.h> int main(void) { int a,b,c; a=35; b=88; c=154; printf("a+b+c=%d\n",a+b+c); printf("a-b-c=%d\n",a-b-c); return 0; }
832 :
830 :2005/11/26(土) 18:38:34
すみません、sscanf内では%sの使用は一度で済ませたいのです。 %s%s%s・・・というのはやはり美しくないので
833 :
デフォルトの名無しさん :2005/11/26(土) 18:39:30
>>830 #include<string.h>
char s[64];
printf("%s",strlen(fgets(s,64,stdin));
834 :
830 :2005/11/26(土) 18:54:14
>>833 様のをもとに書いてみたのですが
#include<stdio.h>
#include<string.h>
char s[64];
int word[];
int main(void){
fgets(s,64,stdin);
sscanf(s,"%d",&word[]);
printf("%s",strlen(word[]));
return 0;
}
うまくいきません、配列の使い方がおかしいのでしょうか?
#include <stdio.h> #include <string.h> int main() { int i, j; char buf[1024]; char *word[256] = {0}; if( ! fgets(buf, sizeof(buf), stdin)) return 1; if( ! (word[0] = strtok(buf, " "))) return 2; for(i = 1; i < sizeof(word)/sizeof(word[0]); ++i) word[i] = strtok(NULL, " "); for(j = 0; j < i; ++j) puts(word[j]); return 0; }
836 :
830 :2005/11/26(土) 19:19:53
>>835 strokの使い方は大体わかりました。
whileで回せば区切りは出来そうです。
sizeof()という関数は別に設定する必要は
ありますか?そのままだとデバックエラーに
なってしまいますので・・・。
837 :
830 :2005/11/26(土) 19:21:05
sscanfでは出来ないのでしょうか?
>>830 例外処理は考慮してない。
#include<stdio.h>
#include<string.h>
char s[64];
int word[64];
int main(void){
char tmp[64];
int i, offset;
fgets(s,64,stdin);
for(i = offset = 0; sscanf(s+offset,"%[^ .\n]%*c",tmp) == 1; i++) {
word[i] = strlen(tmp);
offset += word[i] + 1;
}
return 0;
}
839 :
830 :2005/11/26(土) 19:46:51
>>838 様。
ありがとうございました!
最後に一つだけ教えてください。scanf中の
sは配列、offsetはint型関数でsscanfの第一引数は
配列型の指定が必要ですが、これは配列のアドレス
に+offsetしているのですか?
このsscanfは戻り値を返す判定のみでの使用ですよね?
荒れる前に、去れ。 お前に必要なのは、とりあえず入門書だ。
昨日からウェブを回りながら独学でC言語のことを勉強し始めたのですが、 初心者におすすめのC言語入門書というのはないでしょうか? まだfor if辺りまでしか読んでません
ローカルルールも読めない人にすすめられる本は知らんよ
ビューア使ってるんでローカルとか読んでなかった 明日帰りによさそうなの適当に買ってみる
どうぞご自由に無駄金使って自己満足してください。
何で無駄に煽るかな
心が狭いから
848 :
デフォルトの名無しさん :2005/11/28(月) 00:14:55
やさしいC Cの絵本 プログラミング言語C ANSI規格準拠 第2版(読めるならな)
Visual Studio theSpoke Premium ver.2003って今でも買い? 2003って古い気がしてならないんだけど
>>849 2005Proがタダでもらえます(要登録
なんでこのスレで聞くんだろうな
852 :
デフォルトの名無しさん :2005/11/28(月) 18:13:22
作成したプログラムの計算量を比較したいのですが、 ループの回数がマチマチで単純にオーダーを取ることでは比較しづらい という現状です。 コンパイラのコマンドやソフトウェアで計算量を測れませんか?
>>852 測れる環境があるデバッガはありますよ。
854 :
852 :2005/11/28(月) 18:34:13
>>853 すみませんが、そのデバッガは何処で手に入るか、
もしくは名称を教えていただけませんか?
>>854 あなたの環境もわからないのに教えても無意味ですよ。
856 :
デフォルトの名無しさん :2005/11/28(月) 18:58:40
普通はプロファイラを使うと思うんだが? デバッガでそんな事出来るのあるのか?
858 :
852 :2005/11/28(月) 20:28:10
お二方共コメントありがとうございます。 無知で申し訳ありません。 どちらにせよcygwinにプラグインする形をとることはできるのでしょうか?
859 :
デフォルトの名無しさん :2005/11/28(月) 21:39:05
どなたかエロイ人、お足得手下さい。 中一のがきんちょがゲームばかりやって、テストで2点とか 超パープリンな点数をとってきます。 で、ピアノが弾けるので芸無関係の業界へ進ませようと思ってます。 そこでCなんですが、VISUAL以外のただのCって売っているんで しょうか?何処で買えば?それともVisualCが主流なんですか? また、厨房向けの入門書もいいのがあったらご教授下さいませ。
>> 858
「cygwin gcc gprof」でぐぐれ
>>859 質問するときは奇を衒わず真っ当な文章を書こうな。
とりあえず ピアノが弾ける→ゲーム関係 ってのが意味不明。
>>859 ピアノが弾けるのならピアニストになれよ。
>>859 自己紹介"己"。
低脳人間を設定することで別の人間に仕立て上げる。
最低ではないが最悪だ。
言の端、普く全ての尽くが裏目に出る。
864 :
859 :2005/11/28(月) 22:07:42
>>860 >とりあえず ピアノが弾ける→ゲーム関係 ってのが意味不明。
ゲーム音楽の作曲アレンジとかをやればと思って。
>>861 >>862 いじめちゃいやん。
あふんばかん。
狂言はダメですらい。
・・・ゴクリ
もちろん普通にデジタル作曲・編集はできるだろ?
>>864 いや、だからゲーム音楽と絞っているか理解できない。なんの作曲家でも演奏家でもいいだろうに。
それはともかく音楽とプログラミング言語Cにはなんの関係もない。
料理人とレストラン経営の違いと同じぐらいの違いがある。
while Q≠0 do はQが0でないとき繰り返すんですよね? では、Q≠0から一度Q=0になり、再びQ≠0になったとき 終了させるにはどうすればいいですか?
>>868 while (Q != 0) {
if (Q == 0) {
while (Q == 0) {
hoge;
}
break;
}
}
これでどうよ
ってかwhile ~ doってpascalの構文じゃね?
>>859 876の言う通りゲーム業界に作曲系で入りたいのならCの知識は不要。
が、音屋さんの仕事って最初はループ再生用のカットとかノイズ低減とかで、
作曲アレンジなんておいしい仕事がくることは下手すると一生ないぞ。
音大くずれのゲーオタ連中と張り合っていける自信があるならどうぞいらっしゃいな。
871 :
870 :2005/11/28(月) 23:39:34
*おおっと* 未来の876さん失礼いたしました。867さんの間違いでしゅ。
バブルソートの計算量を削減するプログラムらしいのですが、★に何が入るか分かりません。 ご教授お願いします。 for(i=n-1;i>=2;i--){ sentinel=0; for(j=0;j<i;j++) if(a[j]<a[j+1]){ swap(&a[j],&a[j+1]); sentinel=1; } if(★) break; }
for(i=n-1;i>=1;i--){ sentinel=0; for(j=0;j<i;j++) if(a[j]<a[j+1]){ swap(&a[j],&a[j+1]); sentinel=1; } if(★) break; } でした;
>>869 ありがとうございます。明日先生に見せてきます!
hogeって何ですか?すいません。これってpascalなんですか?!
はてなダイアリーより hoge 日本の情報処理技術者が替え玉記号のように利用することが多い文字列。情報処理の技術ではメタ構文変数(Metasyntactic variable)とも呼ばれる。 つまり「hoge」と書いてあったら「必要なほにゃらかに置き換えて使ってください」というちょめちょめになる。
>>873 sentinel == 0 じゃねーの。
877 :
デフォルトの名無しさん :2005/11/29(火) 15:23:42
∧_∧ (´・∀・`) ハーイ ( ⊃┳⊃ ..(_)/⌒ヽ ⊂二二二( ^ω^)二⊃ | / ブーン ( ヽノ ノ>ノ 三 レレ
アンケートみたいに質問の答えをまた質問にする方法教えてください! 激初心者ですみません
>>873 そういうのはsentinelとは言わないと思うのだが、その問題出したのはどこのどいつだ。
linuxでプログラミングを勉強しようと思ってるのですが、 CとC++どちらにすれば良いか迷っております。 どなたかアドバイス下さい。
883 :
デフォルトの名無しさん :2005/11/30(水) 13:31:08
質問します。 ブルートフォースクラックとかプログラムはどういう仕組みで動いてるのか勉強したくて質問しました。 たとえば パスワードが34ieの四文字英数字だったとします。 1から順に4文字を生成してるのはどういう仕組みなんでしょうか? ただ単にそのまま四個のfor文でくるくる回してるんでしょうか? 具体例とかあったらうれしかです。
スタックのLIFOとFILOってのは同じですか?
スタックですらないのかよ!
オブジェクト指向って何? クラスって何? メソッドって何? ↑調べるとなんかループするし・・・orz
>>889 C言語のスレよりふさわしい所で聞けやボケ
891 :
デフォルトの名無しさん :2005/11/30(水) 18:40:45
出力結果をテキストファイルに保存する方法を教えてください。 よろしくお願いします。
>>891 その出力が標準出力ならばリダイレクトでできる。
その出力がGUI上ならばコピペでできるかもしれない。
いずれにしろ、環境がわからなくては詳しくはかけない。
尚、ファイルに出力したいならばfopen()、fprintf()、fclose()などを調べよ。
894 :
デフォルトの名無しさん :2005/11/30(水) 20:39:28
>>892 >>893 解答ありがとうございます。
コマンドプロンプトに標準出力しています。
リダイレクトで調べてみます。
895 :
デフォルトの名無しさん :2005/11/30(水) 21:02:17
キーボードから文字列を受け取り、改行のみが入力された場合に、 ループを抜けるようにプログラムしたいのですがうまくいきません。 buffer[20]; while(buffer[0]!='\n) { scanf("%s",buffer); } このようなプログラムを作ってみましたが、 これではscanfが改行だけの入力だけでは、受け付けてくれないですし、 getche()とforループの組み合わせでもよい方法が浮かびません。 何かよい方法があれば教えてください。よろしくお願いします。
>>894 リダイレクトは大抵のOSで "> ファイル名"と書く。
つまり、"プログラム名 > ファイル名"と書けばいい。
OSによっては'%'だったり'|'だったりする希ガス。
>>895 fgets()で入力し、sscanf()で変換するのが常套手段。
#あ、その例ではsscanf()するまでもないや。
899 :
デフォルトの名無しさん :2005/11/30(水) 21:32:04
>>895 返答ありがとうございます。
恐縮なんですが、fgets()で入力し、sscanf()で変換するというのがいまいちわかりません^^;
fgets()は、ファイルから1行呼び出してくる関数だったと思うんですが、
詳しく教えてもらえないでしょうか・・・。
900 :
デフォルトの名無しさん :2005/11/30(水) 21:39:22
>>898 だからそういうOSがあるんだってばさ。
>>899 fgets()でもstdinを指定すれば標準入力から読める。
>>899 while(scanf("%s",buf)!=1);で十分だろ
903 :
デフォルトの名無しさん :2005/11/30(水) 22:31:47
>>896 出力結果を保存することができました。
ありがとうございました。
904 :
デフォルトの名無しさん :2005/11/30(水) 23:40:58
883ですが ジョンザリッパーがどんな感じか聞いているんです。
バックスラッシュの出し方、教えてください。
\\
908 :
デフォルトの名無しさん :2005/12/01(木) 00:17:06
正の整数を入力し、その個数だけ*を連続して横に並べて出力するプログラムを作成せよ。 ただしwhile文を用いること。 というプログラムはどうやって作ればいいのでしょうか。。。
おみくじなら
>>910 フォントを欧州のやつに変えてみれ。
日本語の\はバックスラッシュと同じ文字コード。
>>908 入力された整数の分だけ、While回せ
ループの中でprintf("*");
913 :
デフォルトの名無しさん :2005/12/01(木) 00:35:15
srand()で初期乱数を時間から持っていた数字で決めて、 rand()で初期乱数から乱数を引っ張る っていう結構一般的な 乱数発生関数を作ったんですが、もっと 散り散りになる乱数の作り方って ないでしょうか?
>>913 つ[Mersenne Twister]
915 :
デフォルトの名無しさん :2005/12/01(木) 00:37:49
>>905 初心者スレじゃないんかよ!! ったくわからないならわからんって言えよww
>>912 ありがとうございます!!なんとなくできました!!
917 :
デフォルトの名無しさん :2005/12/01(木) 00:44:42
>>883 >>904 >>915 (ここはジョンザリッパーの初心者スレじゃないですよ。
ブルートのアルゴリズム解析スレでもないですよ。
質問者の態度っていうものもあると思いますよ。
回答者が出てくれるまで、気長に待ったほうが得策だと思いますよ。
それが待てないのならば、)ソースを読め
>>914 おぉ なかなか面白そうな。
ヒントありがとうございます。
919 :
デフォルトの名無しさん :2005/12/01(木) 02:11:44
なんとか空白で文字幅を調節して 掲示板に書き込む時に見栄えを良くしたいのですが そのようなアルゴリズム(プログラム)はありますか? 左側の文字列は共に9文字で単純に6文字の空白を 入れただけでは次のようになってしまいます・・・ 【例】 あっいaIU++幅 ここに書く tkahuanたl ここに書く
921 :
デフォルトの名無しさん :2005/12/01(木) 02:22:43
>>919 固定長フォントで全角のみを使うwww
まあ実際、文字の位置あわせというのは簡単なようで、結構難しい。
922 :
919 :2005/12/01(木) 03:03:50
>>920 いや例えばこの掲示板に書き込むだけなら同じフォントですよね?
>>921 そうですか・・・
左側の列は予め決まった単語ではないので
どうしても計算してだす必要があるんです・・・
923 :
デフォルトの名無しさん :2005/12/01(木) 03:33:34
924 :
919 :2005/12/01(木) 03:59:30
AA関連のサイトにでも行って、定番フォントの幅を調べて文字ごとの画素数のテーブルを作り、 それを使って計算すればやってできないことはない。 が、かなり面倒だとは思う。
926 :
919 :2005/12/01(木) 04:23:18
>>925 やっぱりそこまでしないとできないものですか・・・
ヤフーで検索してもそれらしきものがでてこないし・・・
あ 1
あ11
↑今気づいたけど、半角スペースと半角数字の1の幅が違うんですよね・・・
正直これには参った・・・
やっぱり完璧にするのは無理かなぁ
927 :
デフォルトの名無しさん :2005/12/01(木) 04:33:18
>>926 プロポーショナルフォントは、すべての文字の文字幅は異なると思ったほうがよい。
だから計算できたとしても、ぴったりではなくて近似なんだよね。
WinAPIのGetCharacterPlacementやGetTextExtentPoint32という関数で文字列の幅の計算が
できるようです。HDCを渡さなくてはいけないんですけど。
しかも、 があったりね。
>>922 フォントはブラウザの設定で変し、
掲示板で書き込みできるのは文字情報のみで、
表示されるフォントの情報など存在しない。
そんなに位置合わせをしたいなら、
タグ入力可能な掲示板でtableタグで合わせろ。
夢がねぇ香具師だなぁ。 つーか、AAを否定されてもねw
932 :
デフォルトの名無しさん :2005/12/01(木) 11:25:54
Z1=2.5+3.2i Z2=1.3+0.4i この和と積を求めて、結果を打ち出すプログラムはどうなりますか? 自分でやってみたんですが、うまくいきません。 誰かわかる方教えてください。
934 :
デフォルトの名無しさん :2005/12/01(木) 15:19:43
mallocが理解できないのでお聞きします。 char *z; int a; z = (char *)malloc(a * 2 + 1); の様に使うみたいですが (char *)の部分がわかりません。(a * 2 + 1)の部分はa×2+1バイト用意するってことですか?
>>936 mallocはvoid*型の値を返すから、char*型にキャストしてからzに入れないと
コンパイラに怒られる。
そんでもって(a * 2 + 1)バイト確保してる
>>937 イマイチわかりませんが、取りあえず書いておけということですね
>>936 (型名)式
は式を指定した型に変換します。
この場合はchar*型(charへのポインタ型)に変換しているわけですね。
mallocはvoid*型を返し、void*型は代入時に自動的に(左辺のポインタ型に)型変換されるのでこのようなキャストは必要ありません。
可読性や安全性を考えると、むしろやめておいた方がいいでしょう
>>937 の2行目と3行目はC++の仕様です
>>934 その際とのどこにDISWINとやらがあるのか教えてくれ。
941 :
934 :2005/12/01(木) 17:50:18
ttp://hp.vector.co.jp/authors/VA018359/ ごめんなさいページのURL貼ったんですがTOPが表示されるっぽいですね
お手数ですが
下のタブの解析・考察(Hacking)→キーディスクチェック解析
→上から10行目の改造講座→初級05の「逆アンセブラを使ってみる2」です
めちゃくちゃ面倒くさいですね・・・すいませんorz
そこにあるAPIリストの作成なんですがXPではどこを指定したらいいのやら・・・
>>941 2kもXPも同じNT系。
だけどXPのデフォルトのインストールフォルダはC:\WINDOWS。
ということでC:\WINDOWS\SYSTEM32
943 :
デフォルトの名無しさん :2005/12/01(木) 18:15:42
質問です。 コンパイルをすると下のようなエラーメッセージが出てきます。 どうしたらいいのでしょうか? ―――――――エラーメッセージ――――――― Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland hello.c: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Fatal: ファイル C0X32.OBJ が開けません ―――――――――――――――――――――― と出てきます。
>>941 スレ違いになるけど、そういうフレームを使ったページは目的の場所で右クリックメニューから
プロパティを出すと中身のアドレスが得られるよ。
で、XPは知らんけどWin2Kと同じなんで内科医?
まぁ、どうなっても私ゃ知らんが。
946 :
934 :2005/12/01(木) 18:47:01
>>941 ありがとうございます!出来ました!
>>944 そんな方法あったんですね。次からそうします!
あとはdd拍子にいけるはずです。わざわざありがとうございましたm(_ _)m
魑魅魍魎
948 :
↑ :2005/12/01(木) 18:48:49
//演習3.6 #include<stdio.h> void main() { intmonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; intyy,mm,dd; intmonc,con=0; printf("Please input date (yyyy.mm.dd) ==> "); scanf("%d.%d.%d",&yy,&mm,&yy); if(mm > 0 && mm < 13) if((month[mm-1]+1)>dd){ for(monc=1;monc!=mm;monc++){ //printf("%d\n",con); con+=month[monc-1]; } con+=dd; } else printf("ERROR\n"); else printf("ERROR\n"); printf("Total %d days",con); } で//printf("%d\n",con);行のコメントをはずすと正常に動作するのですが、 コメントにしたり行を消したりすると正常に動作しません。 超初歩的な質問かも知れませんがよろしくお願いします。 開発環境はBorland C++ 5.5です。
//演習3.6 #include<stdio.h> void main() { int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int yy,mm,dd; int monc,con=0; printf("Please input date (yyyy.mm.dd) ==> "); scanf("%d.%d.%d",&yy,&mm,&yy); if(mm > 0 && mm < 13) if((month[mm-1]+1)>dd){ for(monc=1;monc!=mm;monc++){ //printf("%d\n",con); con+=month[monc-1]; } con+=dd; } else printf("ERROR\n"); else printf("ERROR\n"); printf("Total %d days",con); } 見にくくてすみません。
よく見てないけど >scanf("%d.%d.%d",&yy,&mm,&yy); yy がふたつ。
ああああああぁぁぁぁぁぁ.....orz やってしまった・・・見落とし・・。orz 次からは注意します。
で、そのプログラムは結局なにがしたいのさ 年数を入力する必要はないし、仮に元日からの日数を求めるんであれば、 1月31日を指定したら62日と帰ってきそうなんだが。
//演習3.6 #include<stdio.h> void main() { int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int yy,mm,dd; int monc,con=0; printf("Please input date (yyyy.mm.dd) ==> "); scanf("%d.%d.%d",&yy,&mm,&dd); if(mm > 0 && mm < 13) if((month[mm-1]+1)>dd){ if(yy%4==0 && yy%100!=0) month[1]=29; for(monc=1;monc!=mm;monc++){ con+=month[monc-1]; } con+=dd; } else printf("ERROR\n"); else printf("ERROR\n"); printf("Total %d days",con); } 完成しました。 入力した年月日を入力し、元日からの日数を求めるプログラムです。 年を入力する必要があったのは閏年の判定をする為です。
>>954 100年判定入れるなら400年判定入れないと2000年がおかしくなる。
細かいけどこうね if(yy%400==0 || (yy%4==0 && yy%100!=0))
957 :
956 :2005/12/02(金) 09:27:52
かぶった・・・
if(mm > 0 && mm < 13){ if(yy%400==0 || (yy%4==0 && yy%100!=0)) month[1]=29; if((month[mm-1]+1)>dd){ for(monc=1;monc!=mm;monc++){ con+=month[monc-1]; } con+=dd; } } お早いレスありがとうございます。判定の位置もおかしかったので修正 しました。これからも精進します。
>>959 長い未来を見据えず、mktime()で算出するのはいかが?(w
961 :
デフォルトの名無しさん :2005/12/03(土) 10:44:15
FreeBSDで下の式のグラフを書いて表示させたい。どうすりゃいいんだ f(x) = x*x ( x=-4, -3, ..., 0, 1, ..., 4)
gnuplot
ありがとう
964 :
国士 :2005/12/03(土) 14:18:55
僕もどしろうとなんですけど代入演算子ってなにかわかりますか?
もちろんだ
char a = '+' とかやったときのaが代入演算子。ようするに演算子を代入するもののことだ
任意の関数f(x)の x=n における微分係数を求めるにはどのような方法がありますか f(x),g(x),h(x)とあれば、diff_fx(float x),diff_gx( float x),diff_hx( float x)みたいに3つ作るくらいしか考えられませんでした diff_fx( float x) の内容は、手計算でf(x)の導関数を求めて、それを書き込んでというどうしようもない状態です(ノд`)
>>968 あらかじめ関数が決まっているなら精度的にはそれが一番いい方法。
>>968 関数決まってないなら
f'(c) = lim[h→0]{(f(h+c) - f(c))/h}
を使って、h=0.000000001とでもしてやるしかないんじゃまいか?
>>969 確かにこれでも問題なく動くのですが、汎用性が全くないなぁと思いまして
関数変える度に、導関数も求め直すのも結構手間ですし
>>970 定義に従って微分していくということですか
試してみます
ありがとうございました
>>970 それは小さすぎ。普通の多項式でもひどい誤差になる。
中心差分でも10の-5乗くらいが限度かと。
近似式ってもんを知らない馬鹿しかいないんだな
これがCの質問だと思ってる奴の脳味噌じゃその程度か。
977 :
デフォルトの名無しさん :2005/12/04(日) 15:45:41
キーボードから「c」を入力した時に「OK!」、それ以外の時には「NG!」と出力するプログラムはどう書けばいいですか?
if( キーボードから入力された文字 == 'c' ) puts("OK!"); else puts("NG!");
979 :
977 :2005/12/04(日) 16:17:46
else if文でお願いしますorz 自分ではこう書きましたがダメでした。 #include<stdio.h> int main(void) { int x; scanf("%c",&x); if(x=='c'){ printf("OK!\n"); } else{ printf("NG!\n"); } return 0; }
980 :
デフォルトの名無しさん :2005/12/04(日) 16:38:07
>>979 intで宣言して%cで受けるのはおかしいだろがッ
とりあえずchar xに汁
981 :
977 :2005/12/04(日) 16:58:59
>>980 出来ました。
でも、「cc」でも「OK!」と出てしまいます。
>>981 ・・・・scanfが何してるか考えてるか?
983 :
977 :2005/12/04(日) 17:30:52
>>982 キーボードから数値を取り込む関数?
すみません。激初心者ですorz
985 :
977 :2005/12/04(日) 17:42:37
char x; scanf("%c",&x); if(a=='c') この辺が間違ってる様な希ガス
986 :
977 :2005/12/04(日) 17:47:33
char x; scanf("%c",&x); if(x=='c') こうか
char型は文字一文字が入るサイズのデータ型です。所謂1バイト。これは全処理系共通です。 scanfの%cは文字一文字を受け取ることを示します。 つまり char c; scanf("%c",&c); は標準入力からcに一文字入れるということです。
989 :
977 :2005/12/04(日) 17:55:26
#include<stdio.h> int main(void) { char x; scanf("%c",&x); if(x=='c'){ printf("OK!\n"); } else{ printf("NG!\n"); } return 0; } ccと入力してもON!にするにはどうしたら?
990 :
977 :2005/12/04(日) 17:56:16
↑NG!ですorz
#include <stdio.h> #include <string.h> int main(void){ char c[3]; fgets(c,sizeof(c),stdin); if(c[strlen(c)-1]=='\n') c[strlen(c)-1]='\0'; else{ puts("NG"); return 0; } if(!strcmp(c,"c")) puts("OK"); else puts("NG"); return 0; } 冗長だと思ったら改行文字除去削って比較文字列に改行文字加えれ
993 :
977 :2005/12/04(日) 18:40:46
>>991-992 すいません。そこまで習っていません。
習ったのは
printf関数
scanf関数
if文
else if文
for文
等です。
これらで
>>977 は出来るはずなんだけどなぁ
>>993 配列は習った?
習っていないなら2文字以上の入力は考えなくてもいいはずだ
995 :
977 :2005/12/04(日) 19:17:21
>>987 乙
でも,そしたら993のような香具師はスルーされるかもな
初心者は2chじゃなくて,K&R読んで勉強汁ってことか
>>993 これでおk
#include<stdio.h>
int main(void)
{
char x,y;
if((scanf("%c%[^\n]%*c",&x,&y)==1)&&(x=='c'){
printf("OK!\n");
}
else{
printf("NG!\n");
}
return 0;
}
1000 :
デフォルトの名無しさん :2005/12/04(日) 19:28:04
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。