1 :
デフォルトの名無しさん :
2006/01/08(日) 22:17:59
3
環境依存OK 宿題OK ただしスルーされます
|m | __,,, -= と´⌒)=- __  ̄ _.ィ⌒ヽ "T :|´^ / }=Yゝヽ、")=- __ ∠.イミ' ^ソ ) :|´^ {_ ハf彡{ l ")=- __ _,,../ /ミ>^ノ | :|´^ ( _fミ|-/-' )ノ ⌒)=- __ | }ヾ' K ノ:T´|| T :|´^ F/ {__,}::| || :'=' _ノ {. |||{._」-l:l = 彡' ノ|{ ̄ {_メ
6 :
デフォルトの名無しさん :2006/01/08(日) 23:10:46
関数をカードに書いて、並べて最後に線で結ぶと凄く判りやすい。 いや〜。発明してしまいましたよ
8 :
1 :2006/01/08(日) 23:19:46
流れをぶった切って立てようとしたら新スレ立て何とかに引っ掛かった から、ケータイから立てたw
9 :
デフォルトの名無しさん :2006/01/08(日) 23:32:38
CとVisualC#.NETとはどう違うの? 教えてください。
>>9 全く別です。
“C”はプログラミング言語Cのことであり、言語の名称です。
“Visual C# .net”は、Microsoftが販売(または配布)しているソフトウェアの
名称です。
>>10 悪かったな。
>>11 MSの言語ソフトのスレに行けということですね。
道が開けました。有難うございます。
13 :
デフォルトの名無しさん :2006/01/09(月) 00:23:42
さてさて、宿題を追い返されて恨みを持っている厨房は ほっといてこのスレを続けようぜ
VC2005で警告が出るようになった、セキュアな関数ってのは いつごろ標準として取り入れられるんだろう。
fopenとかでオプションに"r"と"rb"の違いはありますか?
>>16 ある。
前者はテキストモードで後者はバイナリモード。
典型的にはWin系ではテキストモードのとき、入力時に改行コードが\r\nから\nへ変換される。
質問です。 int型配列の要素の個数を知りたいのですが、どうすればいいでしょうか。 strlenも試したのですが、うまくいきません。 warning C4133: '関数' : 'int [11]' と 'const char *' の間で型に互換性がありません。 と出てしまいます。 分かる方、ご教授お願いします。
sizeof(a)/sizeof(a[0])
>>18 sizeof(array)/sizeof(int)
21 :
デフォルトの名無しさん :2006/01/09(月) 15:35:04
真に受けて「うまくいかないじゃないですか!!」って怒りだすぞ
sizeof は関数じゃなくてえんz(ry
23 :
デフォルトの名無しさん :2006/01/09(月) 15:41:20
えんずいぎr
マクロならカッコつきは問題ないといいたいところだが、 演算子の優先順位の問題が出るようなものを入れること自体 このマクロでは問題になるから(大抵配列でなくポインタになる)、 むしろカッコを付けない方が安全。
break;
コードを書く奴がどう間違おうと自由なんだよ
31 :
デフォルトの名無しさん :2006/01/09(月) 18:49:17
(~~~ ゚ ∀~)~~~ ゚ メダマ ボーン
なんかこのスレ、ワイワイ楽しいなw
break;
int main(void)と int main() の違いを教えてください。 () != (void)と聞いたこともあるような…
>>37 前者は引数がないことを表し、後者は引数が不定(引数に関する情報がない)ということを表す。
ただこれは関数の宣言のときだけで、
関数の定義の時にはどうやら両者ともに引数がないことを表すらしく、違いはないようだ。
39 :
デフォルトの名無しさん :2006/01/09(月) 22:59:52
意味的にはint main(void)とint main()は同じ。引数が無いと言うこと。 ANSI-C以前のK&Rではint main()でよかった。 ANSI-Cでは引数が無いことを「明示的」に示すためにint main(void)となってる。 ANSI-Cの方針の一つとして、文法とコンパイル時でのチェック機能を強化して、 ケアレスミスを未然に防ごうという意図がある。その一環の一つ。つまり 無いときは省略でなく無い(void)とプログラマに指定るようにした。
ちなみにC++ではいつでもint main()とint main(void)は後者の意味で統一されている。 (void)はキモいし、()が引数を取らないという意味でないというのは直感的でないなど言う理由からだったと思う。
(void)が制定されたのは古い前方宣言との互換性を保つため。 C++では前方参照をサポートする必要が無いからvoidが除かれても問題が無い。
43 :
デフォルトの名無しさん :2006/01/10(火) 05:19:34
C言語で書かれたコンピュータ同士が対戦するオセロのプログラム例はないですか?
リバーシなら。
45 :
43 :2006/01/10(火) 05:25:01
リバーシのプログラム例でもいいです。
>>45 せっかく色々情報出してやろうかと思ったのに、マルチなので教えません。
IOS
51 :
sinnki :2006/01/11(水) 01:51:59
鮮鋭化のプログラムを教えてください。。
エフェクティブC++によると、main(void)のvoidは冗長だから、C++ではmain()でよいと書いてあった。
54 :
デフォルトの名無しさん :2006/01/11(水) 11:14:53
CでRPG作りたいんですが、正直難しいと思います。 でもやりたいんです!!僕はHSPでブロック崩し(アルカノイド) ぐらいなら作ったことあります。 今のところ、オープニングまで作ったのですが、どなたか僕に Cの基礎からすべてを叩き込んでくれませんか?? お願いします。
はいはい、ゆとりゆとり。
>>54 何につまづいているのかわからないのでアドバイスできない。
そんな事より、オマイラ昨日の晩飯なに?
>>54 三回回って 「ぬるぽ」 と叫んでみましょう。
おにぎり
おむすび
にぎりめし
1月2日は らいすぼうる
CのRPGならNetHackがあるよ さんこうにすれば
66 :
デフォルトの名無しさん :2006/01/11(水) 23:08:36
>>54 オープニングが作れる程度の知識があるなら WIZ1 もどきでも作ってみたら?
俺思うにあなたに「難しい」のはCよりも世界観=システム設計だ
>>54 プログラミング言語 RPG を作りたいのか
ゲームの RPG を作りたいのか
はっきりしる。
68 :
デフォルトの名無しさん :2006/01/11(水) 23:15:26
この問題を誰か代わりに解いてもらえませんか? ヒントでもいいです。お願いしますm(__)m まず、整数を任意に10個入力させa[0]からa[9]に格納する。 次にこれを小さ順に並べ替え、画面に表示させよ。 選択ソート方式を用いよ。 (1) a[0]とa[1]を比べ、a[0]のほうが大きかったらa[0]とa[1]を入れ替える。 次に新しいa[0]とa[2]で行い、その次は新a[0]とa[3]で行い、以下a[9]まで行う。 (2) a[1]とa[2]を比べ、(1)と同じようにa[9]まで行う。 (3) 以下、a[2]、a[3]、とa[8]まで行う。
\ │ / / ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ─( ゚ ∀ ゚ )< さいたま! さいたま! \_/ \___________ / │ \ ∩ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< さいたま! さいたま! さいたま〜〜〜! >( ゚∀゚ )/ | / \__________ ________/ | 〈 | | / /\_」 / /\」  ̄ / / \ │ / / ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ─( ゚ ∀ ゚ )< さいたま! さいたま! \_/ \___________ / │ \ ∩ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< さいたま! さいたま! さいたま〜〜〜! >( ゚∀゚ )/ | / \__________ ________/ | 〈 | | / /\_」 / /\」  ̄ / /
うわ、懐かし。
2GB(2^31B)以上のファイルサイズの取得方法とディレクトリ内のファイルの数と名前を求める方法を教えてください。 開発環境はVISUAL C++ .NET 2003です。
丸投げ氏ね
>>71 GetFileAttributesEx()
あと氏ね。
>>71 忘れてた。
FindFirstFile()
FindNextFile()
あと氏ね。
>>74 >>75 言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
このスレ的には、「出来ない」or
>>73 が正しい回答だな。
79 :
デフォルトの名無しさん :2006/01/12(木) 13:39:08
>>79 スレ違い。
宿題、丸投げは宿題スレへ。
そうでないなら初心者スレにでも。
>>79 > 期日が明日までなんですよ。
そんなこと知ったこっちゃない。
それがルールを破っていい理由にはならないよ。
回線切って首吊ってろ。
画面の消去方は?
>>82 環境依存。よって、環境依存OKスレなどへどうぞ。
キーボードのキーの割り当てを変えたいのですが・・・どうプログラミングすればいいでしょうか?
そのようにプログラムすればよい。 はい、次。
環境依存。よって、環境依存OKスレなどへどうぞ。
87 :
デフォルトの名無しさん :2006/01/12(木) 20:19:13
このスレの存在意義を教えてください
何も出来ないな! C言語は!
>>87 標準Cの話をするスレだという事が
>>1 を見ても解らないようだとヤバイ。
90 :
デフォルトの名無しさん :2006/01/12(木) 21:14:46
>>84 あれ、実は一つ一つ取り外せるから。
並び替えればいいだけだよ。
キートップを物理的に入れ替えるのかw
>>90 ふにゃふにゃキーボードを使ってるのですが・・・
すげー、インク代減らして25k円w
#include "stdafx.h" #include <stdio.h> #define KEISEN "==========================================================\n" int main(int argc, char* argv[]) ;{ FILE *fp; int a[5],f=0,i; char name[30]; fp=fopen("c:seiseki.dat","r"); printf("***********************成績一覧表************************\n"); printf(KEISEN); printf("氏名 生物 化学 物理 数学 英語 平均 最高点\n"); while((fscanf(fp,"%s%d%d%d%d%d",name,&a[0],&a[1],&a[2],&a[3],&a[4]))!=EOF){ f=a[0];
for(i=1;i<5;i++){ if(a[i]>f){ f=a[i]; } } printf("%-20s%5d%5d%5d%5d%5d%5d%5d\n",name,a[0],a[1],a[2],a[3],a[4],(a[0]+a[1]+a[2]+a[3]+a[4])/5,f); } fclose(fp); return(0); } このプログラム C:\Program Files\Microsoft Visual Studio\MyProjects\11−1\11−1.cpp(7) : error C2143: 構文エラー : ';' が 'string' の前に必要です。 C:\Program Files\Microsoft Visual Studio\MyProjects\11−1\11−1.cpp(10) : error C2447: グローバルスコープで中カッコ ({) が見つかりましたが、対応する関数ヘッダーがありません。 このようなエラーが起きてしまうのですが、どうしても解決出来ません。 お願いします。
int main(int argc, char* argv[]) ;{ ↑ このセミコロンは?
102 :
98 :2006/01/13(金) 00:22:36
>>100 書き込むスレ間違えました?
(;´Д`)間違えてたらすみません。
>>101 そこにセミコロン入れないと
C:\Program Files\Microsoft Visual Studio\MyProjects\11−1\11−1.cpp(10) : error C2143: 構文エラー : ';' が '{' の前に必要です。
というエラーがあったので取り合えず入れてみました。
>取り合えず入れてみました。 >取り合えず入れてみました。 >取り合えず入れてみました。 >取り合えず入れてみました。
>>102 せいせいせいせい
取り合えずで入れるなよw
(´д)ヒソ(´д`)ヒソ(д`)
>>102 ようようようよう
取り合えずで入れるなよw
取り合えず、一行で書かなければいけないところを二行にするな!
108 :
98 :2006/01/13(金) 00:29:39
(;´Д`)すみません、初心者質問した方がよかった気が・・・OTL
>>104 ,106
大学の授業でプログラムの意味とかほとんど理解出来てなくって
エラー文でたら従ってみれば何とかなるかなみたいな感じでやってて・・・・・
>>107 ありがとうございます、やってみます。
質問する前に基礎くらい勉強しろよ・・・ って、大学生なのかよ、ハァ
printf(KEISEN) キタ━━━ヽ(∀゚ )人(゚∀゚)人( ゚∀)人(∀゚ )人(゚∀゚)人( ゚∀)ノ━━━ !!!
確かにきてるな。
113 :
デフォルトの名無しさん :2006/01/13(金) 16:14:47
5個の整数データ a[5]={4,2,6,5,1}を 入力し、最大値 MA を求めるプログラムをポインタを用いて 作成してください。
115 :
デフォルトの名無しさん :2006/01/13(金) 23:13:15
>エラー文でたら従ってみれば何とかなるかなみたいな感じでやってて・・・・・ これは正しい あてずっぽうじゃなく調査結果から次の試みを計画するのは工学者の基本 2ch よりダーティでない情報源は当然あたっておろうな? >大学の授業でプログラムの意味とかほとんど理解出来てなくって 理解できない授業の単位は間違ってももらってはならない なぜ理解できないのかを分析し、次の試みを計画するのは工学者の基本 教員の終電は無視するのが学生の基本
116 :
デフォルトの名無しさん :2006/01/13(金) 23:56:51
最近の学生は、教授室に押しかけて質問する奴とかいないのかな。
教授室=談話室
「邪魔だから出て行け」といわれるぐらい入り浸っていたなあ、、、
配属まで研究室に一度も入ったことのない奴が結構増えたよ。 飲みをサークルと同じ雰囲気でやろうとする奴までいやがるし。
>>116 そういう仕事の邪魔をするストーキング学生はつまみ出されます。
アンケートの集計作業のために対話的なプログラムを作ったら驚くほど早く終わりました。 便利ですね、C。 まあ、プログラミングの方が長くかかったわけですが。
>>121 まぁそのようとだったら文字列処理が強力なPerl/PHP/Rubyといった
スクリプト言語に任せた方が早いけどな
123 :
デフォルトの名無しさん :2006/01/14(土) 15:58:44
#include <stdio.h> main(void) { int a; long l; double d; char str[]="computer"; a=67; printf("10進:%d\n",a); printf("16進:%x\n",a); printf("文字:%c\n",a); l=987654321; printf("10進:%ld\n",l); d=1234.567; printf("浮動小数点数:%f\n",d); printf("指数形式:%e\n",d); printf("文字列:%s\n",str); return 0; } で何故 文字=C になるのかわからん 教えてください
'C'のASCIIコード=0x43(10進数で67)
126 :
デフォルトの名無しさん :2006/01/14(土) 16:08:41
127 :
デフォルトの名無しさん :2006/01/14(土) 17:10:07
次のようなswitch文を使った計算するプログラムを作ったんですが、 ここからsin,cos,tanを求めるプログラムをどう作ればいいんでしょう。教えてください。 #include<stdio.h> int main(void) {float a; int i,k; char d; printf("aを入力\n"); scanf("%f",&a); scanf("%c",&d); printf("計算方法を入力(!)"); scanf("%c",&d); switch(d) { case'!': if(a==0) { printf("0!=1\n"); }else{ k=a; for(i=(a-1);i>0;i--){ k=k*i; }printf("aの階乗は%d",k); } break; default: printf("入力し直してください"); break; } }
#include <stdio.h> #include <math.h> int main(void) { float a; printf("aをラディアンで入力\n"); scanf("%f",&a); printf("sin(a)は%f",sin(a)); printf("cos(a)は%f",cos(a)); printf("tan(a)は%f",tan(a)); return 0; }
129 :
デフォルトの名無しさん :2006/01/14(土) 18:56:59
hoge1()と言う関数内で呼び出される sub_hoge1()〜sub_hoge200()と言う感じの複数の関数が呼び出されるんですが その呼び出される関数内でstatic宣言された変数が使われています。 で、そのstaticな変数を必要に応じて有る時期に一斉に再初期化したいのです。 しかも、外部から・・・ なぜならそれぞれの関数が呼び出される時期はバラバラで 外部にグローバルなフラグを作って、staticな変数をそのフラグの状態に応じて初期化する方法にしたとしても どのタイミングで全ての関数内のstaticな変数が初期化されるかわからないので、グローバルなフラグの状態をいつ戻せば良いか分からないからです。 このような場合、どうすれば解決するのでしょうか? 設計を変えるにしても、ちょっと時間がないので・・・ あと、数が多すぎて無理です。 よろしくお願いします。
>>129 グローバルなフラグを配列で持っておき、それぞれの要素を関数と対応づける。
関数に入ったところで、自分自身のフラグを参照して初期化。
ま、設計が悪いですけどね。
function staticな変数をグローバルなポインタ変数へ放り込むコードを、 その関数に書いとく。 グローバルなリセット関数では、ポインタが有効なら、リセットする。 NULLなら放置しとく、とかではどうか。
132 :
デフォルトの名無しさん :2006/01/14(土) 21:33:15
ファイルデスクリプタを FILE* にする方法は無いですか? TCPコネクションがあるんだけど、それに大して fprintf とか fgets が使いたいんです。
FILE *fdopen(int fildes, const char *mode);
環境依存。 UNIXならfdopenでいける。WINSOCKはもう二手間くらいかかる。
135 :
132 :2006/01/14(土) 23:28:05
>>133 ,134
おー、便利なものがあるんだね。
ありがとう。
ちなみに Linux です。
質問です。 #include<stdio.h> #include<string.h> #define N 32 void sorting(char*,char*); main(int argc,char *argv[]){ char read[N*N],Memory[N][N],CASL[N][N][N]; sorting(CASL,read); } void sorting(char *CASL,char *read){ int i=0,j=0,k=0,z=0,I,J; while(1){ I=i*(N*N);J=j*N; if(*(read+z) == '\0') break; else if(*(read+z) == ' '){ *(CASL+I+J+k) = '\0'; j++;k=0; } else if(*(read+z) == '\n'){ *(CASL+I+J+k) = '\0'; i++;j=0;k=0; } else{ *(CASL+I+J+k) = *(read+z); k++; }z++;}} 上記のプログラムでコンパイルするとwarning: passing arg 1 of `sorting' from incompatible pointer type のエラーメッセージがでてしまいます。関数間での受け渡しで発生しているエラーだと思うのですが、どこを直せばいいのでしょうか?教えてください。
137 :
デフォルトの名無しさん :2006/01/15(日) 11:16:49
CASL[N][N][N]; void sorting(char *CASL,char *read){ 当たり前だ
とりあえずここを変えてみれ。 char read[N*N],Memory[N][N],CASL[N][N][N]; ↓ char read[N*N],Memory[N*N],CASL[N*N*N]; Memoryが使われてないような気がするが。 しかしお前の書いたアプリケーションは漏れは絶対使おうとは思わない。
さきほどのプログラムは部分抽出したものです。 mainの下のほうでMemoryは使われています。 できれば、配列は3次元で行いたいのですがどうすればいいですか?
140 :
デフォルトの名無しさん :2006/01/15(日) 11:46:55
void sorting(char (*)CASL[N][N],char *read){
main(int argc,char *argv[]){ char read[N*N],Memory[N][N],CASL[N][N][N]; sorting(CASL,read); } void sorting(char CASL[N][N][N],char *read){ int i=0,j=0,k=0,z=0,I,J; while(1){ I=i*(N*N);J=j*N; if(*(read+z) == '\0') break; else if(*(read+z) == ' '){ CASL[i][j][k] = '\0'; j++;k=0; } else if(*(read+z) == '\n'){ CASL[i][j][k] = '\0'; i++;j=0;k=0; } else{ CASL[i][j][k] = *(read+z); k++; }z++;}}
144 :
デフォルトの名無しさん :2006/01/15(日) 12:56:47
char型に入ってる文字列を表示するとき、長すぎる文字は削って、先頭から4文字程度のみの表示にしたいんですが、 %4fって記述してもそうなりません。正しくはどうなんでしょうか?
str[4]='\0';
>>145 printf( "%c%c%c%c", str[0], str[1], str[2], str[3] );
>>148 表示する中身は構造体の中に入ってるんですが・・・・
printfなら精度指定すればいいだろ。 printf("%.4s", str);
できました。ありがとうございます
152 :
デフォルトの名無しさん :2006/01/15(日) 17:27:37
int main(int argc, int *argv[]){ int i,j,k,n,N; int s=0; FILE *fp; char dataFile[20]; double **array1,**array2,**array3,*array4; char line[256]; puts("input filename"); fgets(dataFile, sizeof dataFile, stdin); dataFile[strlen(dataFile)-1]='\0'; printf("%s\n", dataFile); fp = fopen(dataFile, "r"); if (fp == NULL) { fputs("File read error\n", stderr); return 1; } fgets(line,sizeof(line),fp); sscanf(line,"%d",&N); printf("N=%d\n",N); array1=initialize(array1,N); array2=initialize(array2,N); array3=initialize(array3,N); array4=(double*)calloc(N,sizeof(double));
153 :
152 :2006/01/15(日) 17:28:57
for(i=0; i<n; i++){ for(j=0; j<n+1; j++){ if(j == n){ fscanf(fp,"%lf",&array4[i]); }else{ fscanf(fp,"%lf",&array1[i][j]); } } } で、AとBに値が格納されません。どこがおかしいのかサッパリです。 ご教授お願いします
「AとB」とは何かが明記されていません。何を意図しているのかサッパリです。 お引取り願います。
155 :
152 :2006/01/15(日) 18:37:25
申し訳ありませんでした。失念していました。 それぞれ配列のarray1とarray4の事です。 よろしくお願いします
nが初期化されていないから まともにforループ回らないだろ。 >fscanf(fp,"%lf",&array1[i][j]); これでコンパイル通るとは思えんのだが。
157 :
152 :2006/01/15(日) 18:52:53
ありがとうございます。 単純な事でした…修行しなおします。
158 :
デフォルトの名無しさん :2006/01/15(日) 18:59:34
>これでコンパイル通るとは思えんのだが。 ここは C のスレなんで、該当スレへ行ってくれ
char型の配列で格納している2byte文字1文字を10進数で表現するにはどうしたらいいでしょうか?
質問の意味がわかりません 何をどーしたいのかが分かりません
char moji[2]; /* LITTLE endian の場合 */ unsigned int jusinsu = moji[0] << 8 | moji[1]; /* BIG endian の場合*/ unsigned int jusinsu = moji[1] << 8 | moji[0];
そういやインテルのCPUでもcharの文字列はBIGendianなんだよな どうして?
charの文字列 と endian は何か関係ありますの?
>>162 そんなもん文字コードとOSによるんじゃないの
エンディアンを(・ε・)キニシナイ!!コーディングにすればおk
166 :
デフォルトの名無しさん :2006/01/15(日) 21:07:28
>>161 のLITTLEとBIGが逆な件について
逆っつーか 単に間違ってるだけだろ しったかぶりの蛇足
うほっ
XPでスケープシーケンスを使えるようにする方法を わかりやすく教えてもらえないでしょうか?
char moji[2]; /* LITTLE endian の場合 */ unsigned int jusinsu = moji[0] << 8 | moji[1]; /* BIG endian の場合*/ unsigned int jusinsu = moji[1] << 8 | moji[0];
char型の文字列をpritnfで表示したいのですが、7文字以降の文字は削って表示したいのですが、 %.6sにすると3文字のデータは3文字分しかスペースが使われません。データが3文字だったら余分に3個スペースをいれて 必ず6文字にしたいんですがどうしたらいいですか?
ググったサイトじゃわかりませんでしたTT
176 :
デフォルトの名無しさん :2006/01/15(日) 23:09:30
>>175 奴なりの「すみません、わかりません」なんだよ
これ以上、恥をかかせないでやれ
177 :
デフォルトの名無しさん :2006/01/16(月) 00:15:50
サイズの変わる2次元配列を動的に確保したいんですが、 処理を繰り返すとfreeに失敗します。 数回 "free(): invalid pointer"というメッセージがでて、セグメンテーション違反で終了します。 以下のソースの何がおかしいんでしょう。 int **array; array = (int **)malloc( size_y * sizeof(int *)); for(i = 0; i < size_y; i++){ array[i] = (int *)malloc(size_x * sizeof(int)); } ... for(i = 0; i < size_y; i++){ free(array[i]); } free(array);
...の部分が原因じゃあ?
180 :
177 :2006/01/16(月) 00:23:31
あ、質問の仕方がマズかったですかね さっきのコードの、前半部のようなメモリの確保をしたばあいに 後半部の方法でfreeするのは、問題がありますでしょうか? この解放の方法が問題無い場合は、間の部分が問題なんですよね。
中身#if0とかしてみて、それだけ動かしてみればいいじゃん
>>177 内部でポインタをインクリメントとかしてないよね。
185 :
177 :2006/01/16(月) 00:37:44
>>180 ありがとうございました
・・・あー、じゃーどこだろw
187 :
177 :2006/01/16(月) 00:45:01
188 :
デフォルトの名無しさん :2006/01/16(月) 01:32:47
すいません。質問です。 VC++.NETでコンパイルすると必ずといっていいほど、 「MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。 F:\Program\CG\test\Debug\test.exe : fatal error LNK1120: 外部参照 1 が未解決です。」 と、表示されて何もできません。 何か、ミスをしているのかと思い、「helloworld」を表示するだけのを作っても同じ結果になりました。 どなたか助けてください。お願いします。
>>188 プロジェクトを作るときに「コンソールアプリケーション」じゃなくて「Win32アプリケーション」にしてるだろ。
コンソールアプリでプロジェクトを作り直すか、プロジェクトの設定を変える。
あとスレ違い。
190 :
デフォルトの名無しさん :2006/01/16(月) 01:43:50
>>185 メモリ不足でmalloc失敗してないかい?
>>177 それは二次元配列じゃなくてポインタの配列だ。
んで、「...」の部分でそのポインタを壊している。
192 :
デフォルトの名無しさん :2006/01/16(月) 02:03:55
Cで書かれたプログラムからperlプログラムに文字列を与えて 結果を元のCで書かれたプログラムで受け取りたいのですが、 どのような実現方法があるでしょうか?
193 :
188 :2006/01/16(月) 02:09:59
できました。 どうもありがとうございす。 板違いは注意したいと思います。 すみませんでした。
構造体でいろんな名前を入力したいんですが、 struct meibo{ name[20] }; main(){ fgets(), sscanf(); ←ココ } の()の中をどんな風にしたらいいですか?
>>192 環境依存、WindowsもしくはUNIXもしくはPerlプログラミングのスレに行け
197 :
デフォルトの名無しさん :2006/01/16(月) 02:56:28
ファイルポインタを fp として fseek でアドレス移動を行う。 fp を出力(printfで)してみると全部同じモノが出る。 これは何故なんでしょう?移動してるのだから出力は全て別になるはずでは? ファイル本体を一つのアドレスとして認識して、その中身のアドレスを移動している という考えで良いのか不思議に思います。 ご回答お願いします。
>>197 fpはただのポインタだから。
> ファイル本体を一つのアドレスとして認識して、その中身のアドレスを移動している
それはメモリマップドファイル。
標準ストリーム(FILE)とは全く別の機構。
>>197 かなり乱暴な説明だけど、FILEはただの構造体だと思ってしまえば理解しやすいかも
struct FILE {
int pos; // ファイル内の位置が格納される
// その他メンバ色々
};
FILE *fp = fopen(...);
fseek(fp, 10, SEEK_CUR); // fp->pos += 10; と同じ。fp自体は変化しない
実際のFILEがどういう構造になっているかは処理系依存だから
普段プログラマが意識する必要はない
ファイル内の位置が欲しければ素直にftellを使うべき
>>192 標準Cの範囲でやるならファイルを介してやればいい。
Unix系やそれに類似したOSではpopen()があると思う。
>>197 > ファイルポインタを fp として fseek でアドレス移動を行う。
fseek()ではアドレスは移動しないわけだが。
# かなり勘違いしてそうな悪寒
みなさん。教えてください。 プログラムの終了条件で while(eps>dx){ } と書くことが多いですが、EPSは何の略か分かりますでしょうか? お教え下さい。
epsilon
それはCの質問なのか
epsilonとは、ギリシャ文字のεでしょうか?
ありがとうございました。 機械エプシロンってことを、初めて知りました。^^;; 勉強になりました。
>>202 > プログラムの終了条件で
> while(eps>dx){
> と書くことが多いですが、EPSは何の略か分かりますでしょうか?
> while(eps>dx){
は、whileループであって、プログラムの終了条件ではない。
つまり、プログラムの終了条件として、
上記の様に書くことが多いなどと言う事はあり得ない。
また、Cの予約語に「eps」と言う単語はない。
つまり、そのプログラムを書いた人物が考えた識別子であって、
「eps」が何を意味するかなど、その人物にしか分からない。
まことにそのとおりです^^;;
ランダムで名前が生成されるフォルダ内にあるファイル(←こちらは自分で命名できる) から内容を読み込むことってC言語でできますか? fopen("*/aaa","r"); ↑ではさっぱりでした。識者の皆様ご教授おながいします。
ふざけた奴には教えません
(°д ゚)ハァ?
できないならいいです。どうも。 ノシ
214 :
デフォルトの名無しさん :2006/01/16(月) 16:09:29
馬鹿ばっかりだな
>>210 ファイル名を列挙する関数なりWin32APIを当たってみたら?
>>215 Linux(fedora core3)で行っているので、
findfirstfileやfindNextDirは試してみたら使えませんでした。
windowsならすぐできそうだとは踏んでいるんですが、linuxで行いたいのです。
opendirは?
スレ違い
環境依存スレか犬糞スレor板へ
>>217 これは盲点でした。どうもです。
スレ違いなようなので以上で失礼します。
ノシ
Cではメタキャラクタの展開は行わない
>>221 C 以外だと、シェルのコマンドライン展開を 「 言語仕様 」 として備えている
言語があるのか?
シェルはプログラミング言語でないような言いようだな...
スレ違い
>>223 シェルがプログラミング言語であると思ってるような文章だな。
構造体を使った入力の仕方を教えてくださいませ。(fgets と sscanf で)
>>226 その構造体の変数を作り、
sscanfの可変個引数の部分にその変数の各メンバを指定する。
>>225 記述や考え方はそう変わらんよ。人間が命令して機械が従う。
同じことだ。
人間が命令をして機械がそれを実行するのはプログラムであってプログラム"言語"ではないと思う
細かいな。対話式のBASICだと思えば似たようなもん
しぇるすくりぷと。
シェルスクリプトはプログラム書くのと変わらんし、 シェルの操作は対話式のインタープリタ環境と何も変わらん
233 :
デフォルトの名無しさん :2006/01/16(月) 21:41:26
>>225 インタープリタがプログラミング言語ではないなら
機種によっては機械語もプログラミング言語ではないな
234 :
デフォルトの名無しさん :2006/01/16(月) 21:46:53
C言語インタープリタというのもある
235 :
222 :2006/01/16(月) 22:26:55
ゴメソ
>>222 でつ。
シェルがプログラム言語じゃない ってな主旨ではないの。
>>221 の 「 Cではメタキャラクタの展開は行わない 」 って表現は、
「 メタキャラクタの展開は、シェルの仕事だ 」 としたほうが適切ではないか、って
主旨だったの。
みんな、私のために喧嘩するのはやめてぇぇぇぇ。
♪わたしぃのためぇに、あらそわなぃぃでぇ もうこれいじょう〜
DOSのバッチファイルはメタキャラクタの展開はしないけどな
237 :
デフォルトの名無しさん :2006/01/17(火) 00:38:09
くだらない質問ですが、関数内の static な変数のというのは プログラムが実行された時に領域確保されるのか、 その関数が初めて実行されたときに領域確保されるのか、 どっちでしょうか。
>>237 特に定められてはいないが,ほとんどは前者のほうだろうな。
239 :
デフォルトの名無しさん :2006/01/17(火) 00:46:11
つーか、関数内かどうかって関係あるのか?
C++のbcc32でコンパイルしようとしたらOBJ開けなくてシンボルテーブルと実行可能ファイルが 出ないんですけどどうすればコンパイルできますか?
241 :
デフォルトの名無しさん :2006/01/17(火) 00:53:09
OBJ 開くってどういうこと? V字サービスか?
bcc32.cfg ilink32.cfg path
>>239 でもそもそも関数外の static について
>>237 のような疑問は
起こらないと思う
コマンドプロント起動してカレントフォルダ設定してbcc32 ファイル名 打ったらOBJ開けません出てきた
246 :
デフォルトの名無しさん :2006/01/17(火) 01:01:06
そしてスレ違い
読んでもわかりません汗
248 :
デフォルトの名無しさん :2006/01/17(火) 01:06:46
領域って言葉で何を意味しているのかによるけど。 メモリーアドレスという意味なら、コンパイルかリンクされたとき。但し、 共有ライブラリーはプログラムをロードしたときにリンクされるから、 プログラムをロードしたときと言えなくもない。 仮想メモリー(スワップ領域)は、普通はプログラムをロードしたときに 確保されるが、足りなくても見込みで突っ走ってしまうシステムもあった ような気がする。 物理メモリーは、実際に変数がアクセスされるまでには確保されるが、 いつになるかはシステムの気まぐれで分からない。その関数が初めて 実行されたときというのも有りうる。
249 :
デフォルトの名無しさん :2006/01/17(火) 01:07:47
コマンドプロンプトでsetと打って見ろ。 PATHにc:borland\bcc32\binとか無かったらパスが通ってない。 そしてすれ違い
250 :
デフォルトの名無しさん :2006/01/17(火) 01:08:36
251 :
デフォルトの名無しさん :2006/01/17(火) 01:10:31
>>248 スレ違いな答え方だな
いつの時点からアクセスが保証されるのかを
規格から引用すれば1行で済むことだ
bcc32.cfg ilink32.cfg 両方ともちゃんと入ってるし path も通ってます。三日くらいテンプレ見ててわからないのできたんですが・・
>>248 > メモリーアドレス
……
関数内のstatic変数から出てくる単語じゃないよね?
例えば、64ビットのデータを8ビットづつ読み込むと八回読み込むことになります。 そこで、8ビットづつ読み込んでその8ビットをある7ビットに変換します。 7ビットに変換してもそれを1バイトとすることで計8バイトになると思うのですが 1バイト区切りではなく、7ビットを8回ということで計56ビットで7バイトにするということは 可能なのでしょうか? また、普通ならば7ビットに変換してもそれを1バイトとすることで計8バイトにするような 実装を行うのでしょうか? どうぞよろしくお願いします
日本語でおk
>>254 > 1バイト区切りではなく、7ビットを8回ということで計56ビットで7バイトにするということは可能なのでしょうか?
そのようにプログラムを作れば可能だけど、ビットシフトやビットマスクを駆使することになるから、効率は落ちるし面倒くさい。
> また、普通ならば7ビットに変換してもそれを1バイトとすることで計8バイトにするような実装を行うのでしょうか?
よほどスペースがシビアでなければ、そう実装するのが一番分かりやすいし高速だと思う。
配列やポインタを使って情報を取り出したければ、最低でも1バイト区切りでしか移動できないから、
そう実装するのが一番現実的。
>>256 ありがとうございました。大変わかりやすくて助かりました。
254です。もう一つ質問させてください。 254に書いたある内容に付け加えです。 254ではある変換を用いて8ビット→7ビットにしましたが、 今度はある変換の逆をして7ビットづつ読み込んで7ビット→8ビットにしたとすると 7バイトを8バイトになりますがこちらも実装として可能でしょうか? 1」バイトずつ読み込むというのは知ってるのですがどうかお願いいたします
計56ビットという事なので、intが64ビットなら、ビットフィールド使える
もしかして……base128を作ろうという話か? ミ ゚ 仝゚ミ
long long 使えばいいんじゃない? まあ、 64ビットとは限らないが、 だいたいのPC環境のコンパイラなら多分64ビットだろう。 (環境によって違うのが嫌なら Java で long 使え)。
long long ago;
263 :
デフォルトの名無しさん :2006/01/17(火) 17:58:42
演算子の結合性に右や左とありますが、これはどういう意味なんでしょうか?
a * b * c;とあった場合 (a * b) * c;と左側から解釈されるか a * (b * c);と右側から解釈されるかの違い
>>263 たとえば、
i = j = a + b + c + d + e;
便宜的に括弧を付けると、
加算演算子(+)は、左から右に結合するので、
( ( ( ( a + b ) + c ) + d ) + e )
となる。
代入演算子(=)は、右から左に結合するので、
( i = ( j = ( ( ( ( a + b ) + c ) + d ) + e ) ) )
となる。
267 :
デフォルトの名無しさん :2006/01/17(火) 23:52:26
”ヘッダーファイルを直接的にインクルードしてはいけない” と書いてあるページを見たんですがこれは何のためでしょうか? // define.h typedef int* IntPtr; // test.h void Test() { IntPtr p; } // main.c #include "define.h" // test.hではなくこっちでinclude #include "test.h" Test();
void fuga(unsigned int test){ /* 何かの処理 */ } main() { int a = 0xff; fuga((unsigned)a); } の a についてなんですが、キャストすべきですか? ビットパターンは同じだから キャストはいらないとかたまに考えたりしてます
269 :
デフォルトの名無しさん :2006/01/17(火) 23:55:03
lunuxでconio.hってインクルードできるのでしょうか? ゲームを作りたくて、kbhitを使いたいのですが コンパイルするとconio.hというファイルは、ないという エラーがでてしまいます。下手な説明でわかりにくいかもしれませんが どなたかわかる人教えてください。
>>269 コンパイラに無いと言われたなら無いんだろ
他の方法使え
>>267 それはおかしい。
そのサイトを晒してくれ。
272 :
271 :2006/01/18(水) 00:07:14
あ、ページって本か何かかorz
>>267 test.hがdefine.hを必要とするならば
どう考えてもtest.hでもインクルードすべきだろう
インクルードガードさえしてれば問題ないんだし
fprintfを使ってトレース処理を作ろうとしたらコンパイルできんかった。 どうすりゃいいんだ。
>>268 コンパイラの出力アセンブリを見てみると分かる。
276 :
267 :2006/01/18(水) 00:29:29
>>271 webサイトなんですがやめときます。
>>273 #ifndefなどで2重インクルード防止をしていない場合はtest.hで
includeするとエラーが出る場合があるからダメって事ですかね。
277 :
268 :2006/01/18(水) 01:07:10
>>275 なにやら難しそうですが、ご回答ありがとうございました
難しいとわかってよかったです
>267 ヘッダの依存関係を明示させるためとか言う説を聞いたことがある。
ヘッダ内でincludeすると、インクルードガードがついてても、 同じファイルが何度も読み込まれてコンパイル時間に影響を 及ぼす、みたいな話はきいたことある。
280 :
デフォルトの名無しさん :2006/01/18(水) 06:47:50
すいません。質問です #define ON 1 #define BLKSZ 24 typedef struct { int flg;int st; } mbox; main(){ if( mg[4/BLKSZ][8/BLKSZ].flg == ON ) この配列の要素4/BLKSZと8/BLKSZは、どこの数字を指すのでしょうか?
281 :
訂正 :2006/01/18(水) 06:52:47
#define ON 1 #define BLKSZ 24 #define CMAX 16 typedef struct { int flg;int st; } mbox; main(){ mbox mg[CMAX][CMAX]; if( mg[4/BLKSZ][8/BLKSZ].flg == ON ) 配列の要素[4/BLKSZ]と[8/BLKSZ]の値が分数になります。 配列の要素は整数しか扱ったことがないので、これはどういう領域を指しているのでしょうか?教えて下さい
ためしてみりゃええやん。
[300/BLKSZ][201/BLKSZ].flgだったらどうなるのでしょうか 小数点は切捨てで良いのでしょうか?
285 :
284 :2006/01/18(水) 07:32:47
286 :
284 :2006/01/18(水) 07:36:21
>>282 =285
偽者乙。
死ねばええやん。
age
287 :
デフォルトの名無しさん :2006/01/18(水) 07:38:50
↓ 以下 282 285の自作自演が続きます。しばしお楽しみください。どうぞw ↓
なんか必死すぎてワロス
289 :
デフォルトの名無しさん :2006/01/18(水) 07:46:01
>>282 名前: デフォルトの名無しさん [sage] 投稿日: 2006/01/18(水) 07:08:12
ためしてみりゃええやん。
>>285 名前: 284 [sage] 投稿日: 2006/01/18(水) 07:32:47
×
>>282 ○
>>283 だったorz
コイツ テライタスwwキショスギ
さらしage
本を読んで勉強中なのですが、 if文で真の整数を入力したのに、実行して10を入力しても{}の中の文がスルーされてしまいます。 #include <stdio.h> int main() { int res; printf("整数を入力汁。\n"); scanf("d",&res); if (res == 10){ printf("10が入力されますた。\n"); printf("10が選択されますた。\n"); } printf("処理を終了します。\n"); return 0; } なぜだか分かりません。 どこか間違えてるのでしょうか?
入力した値を表示させてみるとか、デバッガで覗くとかで確認汁
292 :
290 :2006/01/18(水) 09:14:37
自己解決しました。 ただ、scanf("d",&res); の%が抜けてただけでした。 おさわがせしました。
293 :
290 :2006/01/18(水) 09:15:58
>>291 すみませんでした。
ありがとうございます。
>>283 多分整数の割り算だと小数点は切り捨てされる
>>267 > ”ヘッダーファイルを直接的にインクルードしてはいけない”
> と書いてあるページを見たんですがこれは何のためでしょうか?
> // define.h
> typedef int* IntPtr;
> // test.h
> void Test() { IntPtr p; }
> // main.c
> #include "define.h" // test.hではなくこっちでinclude
> #include "test.h"
よくわからんが、作りが変だからジャネーの?
test.hのTest()は明らかにdefine.hのIntPtrを必要としている。
つまり、test.hはdefine.hに依存しているのにそれが明示されていない
test.hはdefine.hを#includeすべき
# ヘッダ中でincludeすべきないという馬鹿は標準関数のヘッダを見てから物を言おうな
この作りだと例えば
// main.c
#include "test.h"
#include "define.h"
とヘッダの#includeの順番を変化させただけでコンパイルができなくなる
上記の例に限って言えば作りがアホすぎる
ヘッダの依存関係なんてgccなら-M使え
296 :
デフォルトの名無しさん :2006/01/18(水) 15:51:00
質問です。 Cで任意のファイルの任意の位置に、 任意のデータを挿入したい場合はどうすればよいのでしょうか? 挿入したい位置までreadでファイルを読み込んで、 writeでそこに書き込もうとしたところ、 挿入されず上書きされてしまいました。 上書きではなく挿入にするモードがあったりしますか? あればかなり楽なのですが・・・
ありません
298 :
296 :2006/01/18(水) 16:33:54
>>297 そうですか・・・残念です。
では具体的にはどうすればよいのでしょうか?
もし宜しければお願いします。
は?
>>296 1.メモリ上で挿入処理し、ファイルに上書き
2.別ファイルにさも挿入した様に書き込み、元ファイル削除+別ファイルをリネーム
お好みでどうぞ。
302 :
296 :2006/01/18(水) 17:18:07
>>301 ありがとうございます。
出来るだけ高速に処理したいので、
1.のメモリ上で処理してファイルに書き込むという方法でやってみようと思うのですが、
その場合、ファイル全体の大きさと同じだけのバッファ領域を用意する必要があるのでしょうか?
>>302 同じだけ確保できないなら細切れにして読み込めばいいだけじゃ?
思考が停止してる奴ばかりだな。
>>302 好きなように汁。
因みにファイルを上書きすると、もし途中でエラーになった場合は
元のファイルが壊れた状態で残るわけだが、それはおk?
306 :
296 :2006/01/18(水) 17:45:27
>>303 >>305 ありがとうございます。
エラーの場合の元のファイルの状態については大丈夫です。
挿入したいデータは一つではないので、
元ファイル読み込み→バッファA→新ファイル書き込み
を細かい単位で繰り返していき、
挿入したいデータの場所にきたら
挿入したいデータを格納しているバッファ→新ファイル書き込み
という流れでやってみようと思います。
ただこれだと今度は挿入したいデータを格納するバッファ領域を
挿入したいデータの総サイズと同じサイズだけ用意しなくてはならないと思うので、
ファイル全体と同じだけ確保するのに比べれば大分少ないとは思いますが、
メモリの消費量がちょっと心配です・・・。
int num[] = {25,58,30,77,69,56,100,5,13,44,'\0'}; の配列要素の平均値を表示させるプログラムを 条件:変数aveを使用、平均値のみ小数点第1位まで表示で解く 問題をやっているのですが、答えまでの道筋が全く見えません。 答えじゃなく、どなたかヒント下さい・・・。
numのデータをループで読み出しaveに足していく(取り敢えず合計を求める) データが'\0'ならループ終了 aveを要素数('\0'を除く)で割る(ここで、四捨五入等の処理を)
'\0' はデータか? それともター峰ータ? (ター峰ータって、回文ダタノカ 打ってみてビクーリ)
脊髄反射で質問乙
'\0'はゼロだよね。とすると、ちょっとおかしいな
>>307 平均も判らないなら、消防からやり直した方がいいよ。
>>307 てかマジでやめた方がいいよ。算数レベルじゃん・・・。
絶対挫折するから
314 :
デフォルトの名無しさん :2006/01/18(水) 21:02:04
intに'\0'を入れる頭の悪い子の所にはなまはげが行きます。
番兵なら普通は-1とかだよな
316 :
デフォルトの名無しさん :2006/01/18(水) 21:36:26
EUCコードでひらがな「あ」は(164,162)の2バイトです。 文字→EUCコード数値への変換プログラムはできたのですが、 逆(EUCコード数値→文字)ができません・・・ つまり (164,162) を入力して「あ」に変換するにはどうすればいいのでしょうか? お願いします。
(164) << 8 | (162)
線形リストを実装したくてウズウズしてるんですけど、概念を教えて下さい。 ノードの作成。先頭&終端を指す奴。次のノードへのポインタ。 これで実装できますか?
おまいら!水10なんか見なくていいから俺の質問を見れ。 もういいです。何回か挫折した後聞きに来ますから、 その時は優しくお願いします。
321 :
デフォルトの名無しさん :2006/01/18(水) 22:32:28
実行中にスタックトレースを取得したくて調べたところ、 マネージ拡張をONにして、StackTraceクラスを使えば 取得出来たのですが、処理効率が悪く、使い物にならない状況です。 その他の方法で、スタックトレース(又は呼び出し元関数,ファイル等) を取得出来ないでしょうか? ちなみに環境は、 Visual C++.NET2003 です。
323 :
デフォルトの名無しさん :2006/01/18(水) 23:18:56
適正スレがわかんなくてここで聞く奴と 誘導先へのアンカー貼れない奴は同レベル 底辺同士いがみあってろ 俺らには関係ない
>>316 元々、変換など必要ない。
数値として表示すると「(164,162)の2バイト」となり、
EUC文字列として表示すると「あ」と表示されるだけ。
>>318 単方向なら先頭ノードへのポインタ、ノードには次のノードへのポインタを。
双方向ならノードには前のノードへのポインタも必要。終端のポインタはお好みで。
質問です。 \0とか\nみたいな特殊文字に対応していない(印字できない)アスキーコードの文字を memcpy(buf, "・・・・・" , n); みたいな具合でメモリに一括で格納したいのですが、可能でしょうか? それとも str[0] = 0x0; str[1] = 0x1; str[2] = 0x2; ・・・ みたいに個別に代入しなくてはならないのでしょうか。 (わかりにくい質問ですみません)
char str[3] = {0x00, 0x01, 0x02}; じゃだめ?
くだらない質問ですみませんが、 LPSTR loadStr[256][256]; BOOL LoadFile(char *strFile , LPSTR **sysStr) { : } if(!LoadFile(TEXT("map\\map.txt") , &loadStr)) return FALSE; 2次元配列をLoadFile関数で使用したいのですが、 どこが間違っていますか? 教えてください。
スレ違い。
>327 やっと意味が判った。 '\000'(0の部分は八進数文字)か '\xHH'(Hの部分は十六進文字)で、任意の文字定数を文字列に埋め込める。 桁に制限はないから、実は'\0'もその一種。 ってあれ、この表記の後に、桁に対応する文字を置きたい時はどうすれば良いんだ? 対応する文字じゃなくなるまで文字コード表記し続けるしかない?
>329 char [] ≒ char * char [][] ≠ char ** char [][N] ≒ char *[N] 変数を定義する時は優先順位の関係でかっこが必要。
間違えた。いつでもかっこが要るや。 char [][N] ≒ char (*)[N]
#include <stdio.h> int main(void) { double tmp1, tmp2, tmp; tmp1 = 0.004004004; tmp2 = tmp1 * tmp1; tmp = tmp2 - tmp1 * tmp1; if(tmp >= 0) printf("tmpは0以上の値: %e\n", tmp); else printf("tmpは負の値: %e\n", tmp); return 0; } このソースをコンパイルしてプログラムを実行すると、最終的にtmpには0が格納されて、 標準出力には「tmpは0以上の値: 0〜」と出力されて欲しいところですが、 実際に実行するとなぜかtmpには非常に小さい負の値が格納されていて、 「tmpは負の値〜」と出力されてしまいます。これは何が間違っているのでしょうか。 tmpは0以上の値〜と表示させるにはどこをどのように修正すればよいのでしょうか。 環境は Redhat Linux 9 + gcc-3.2.2-5 です。
ごさ
336 :
デフォルトの名無しさん :2006/01/19(木) 15:47:36
kbhit以外にキー入力をしたか判定するコマンドってありますか?
>>336 君はMS-DOSの話をしているのかな?
>>336 スレ違い。
環境に合ったスレへドゾー
>>334 丸め誤差の関係だと思うが、最適化オプション付けてコンパイルすると
最適化によって意図した通りになるかも知れない。gcc では -O 付けたら
できたから。
>>335 334ですが、誤差とは10進数で表現された小数の中には
2進数でそれを正確に表現できないものがある、という
その時の誤差のことでしょうか?
>>340 334ですが連投すいません。
確かに私の環境でも -O をつけて最適化すると
意図した通りになりました。gccが中で一体
どんな最適化をやったのかは知りませんが不思議です。
>>342 あ〜、確かにそれもあるかもしれませんね。
本人に解明しようとする気が全く無いのが笑える。
345 :
デフォルトの名無しさん :2006/01/19(木) 18:48:10
#include<stdio.h> int main(void) { int n,a,b; printf("数値1:"); scanf("%d",&a); printf("数値2:"); scanf("%d",&b); n=1; while(n<=(a||b)){ if(a%n==0 && b%n==0); ++n; } printf("%dと%dの最大公約数は%dです",a,b,n); return 0; } 最大公約数を計算させなければいけないんですができません… 条件はwhileを使ってaかbの小さい方になるまで繰り返すこと、 nがaとbを割り切ることが出来るかどうかを剰余の演算子(%)を使ってifの条件にすることです。 while(n<=(a||b)) こんな書き方アリですか? if(a%n==0 && b%n==0) コードは効果を持たない という警告が出ます。 超初心者なんでお願いします。
(a || b)だと、aかbどちらかが非0のとき真になる やるなら while(n <= a || n <= b)
347 :
345 :2006/01/19(木) 18:58:03
ありがとうございます。 if(a%n==0 && b%n==0)は相変わらず警告なんですがどうしたら有効になりますか?
ヒント:へんなとこにセミコロン付いてないか
>>347 変数mを一個宣言して
m=a; n=b;
while(m != n){
if(m > n)
m=m-n;
else
n=n-m;
}
printf("最大公約数=%d\n",m);
}
差が大きい場合は剰余を使った方がいい。
350 :
345 :2006/01/19(木) 19:42:19
ありがとうございます!警告は出なくなりました。 349>剰余を使わなければいけないみたいなんです… 今のところ #include<stdio.h> int main(void) { int n,a,b; printf("数値1:"); scanf("%d",&a); printf("数値2:"); scanf("%d",&b); n=1; while(n <= a || n <= b){ if(a%n==0 && b%n==0) ++n; } printf("%dと%dの最大公約数は%dです",a,b,n); return 0; } 正常にコンパイルされているように見えるのですが、実行すると、 数値2を入力した後にまた点滅(?)が出てきます… もう入力するものはないはずなんですが…
C++とVC++とか どうちがうんですk
ぺーぺーですみません。質問させてください。 問題: 符号なし整数nを16進数の文字列s[]に変換する関数ItoH(n,s)を作りなさい。 ヒント: 文字列を逆に入れ換えるライブラリ関数strrevを使うこと。 実行例: 符号なし整数n:165 16進数 :A5 これ、意味が分からなくて沈んでます・・・ 出来れば何かヒントを下さい・・・誰か・・・(´;ω;`)
>>351 VC++ は Windows 用の C++ のコンパイラと Windows 用プログラムを
作るためのツールが一体になったソフトです。
>>352 #define ItoH(n,s) sprintf((s),"%x",(n))
355 :
345 :2006/01/19(木) 20:04:36
#include<stdio.h> int main(void) { int n,a,b; printf("数値1:"); scanf("%d",&a); printf("数値2:"); scanf("%d",&b); n=1; while(n <= a || n <= b){ if(a%n==0 && b%n==0) printf("%dと%dの最大公約数は%dです\n",a,b,n); ++n; } return 0; } にしてみました。数値を100と90にした場合、 100と90の最大公約数は1です。 100と90の最大公約数は2です。 100と90の最大公約数は5です。 100と90の最大公約数は10です。 と全ての公約数が表示されます。最大公約数を求めることには成功してますが、 最後の文章だけを表示させるにはどうしたいいのでしょう?
356 :
351 :2006/01/19(木) 20:04:40
えーと プログラマの自己紹介みたいなところに VC++が出来るって書いてるんですけど
ナニコノスレ
>>350 はまずそのエラーが直っても最大公約数を求められない。
もう一度考え直してみてわ?
>>354 即レスdです!
あの・・・良かったらもうちょっと詳しく・・・とかなりませんか?
嫌ならスルーで結構ですので・・・_| ̄|〇
>>360 問題文のわからない語句すべてをググることから始めるといいと思う
>>361 また即レスdです!
そうですね。自分も聞いてばっかじゃなく調べてみます。
ありがとうございました(´∀`)
363 :
デフォルトの名無しさん :2006/01/19(木) 21:04:35
#include <stdio.h> int main(void) { double d; int i=0; for(d = 0.0; d != 1.0; d += 0.1){ printf("%d\n",i++); } return 0; } **************** 上記を実行するとループを抜けないのですが なぜなんでしょうか。。。?
>>363 コンピュータは浮動小数点数を二進法で表している。
十進法の0.1は2進法で正確に表せないので誤差が生じ、10回足しても1.0丁度にならない。
同じネタばかり・・・ 釣りなのか?
366 :
デフォルトの名無しさん :2006/01/19(木) 21:15:25
>>363 浮動小数点は 所 詮 は 近 似 値 、誤差とのつきあい方を憶えないと不毛な堂々巡りが死ぬまで続く
367 :
デフォルトの名無しさん :2006/01/19(木) 21:43:35
>>327 memcpyなら可能じゃないかな?
strcpyとかならNULLで切られちゃうからそれ以降の値はコピーされないけど
368 :
デフォルトの名無しさん :2006/01/19(木) 21:45:49
スレ更新しなかったからスゴイ遅いレスになってしまった(´・ω・`)ショボーン
どんだけ更新してないんだよ
370 :
デフォルトの名無しさん :2006/01/19(木) 21:58:26
文字列処理で困ってます。 AAAAA 8 // 909090 SSSSS 6 //676767 TTTT 3 // 21e 90382082 //EEEE 8 // efegeeg のようなテキストデータがあって 先頭の文字列を取得して2番目の数値を記憶したんですが 上に書いたとおり//でコメントも打たれてる場合があったりスペースが間に 混じってる時もあります。fscanfで読み込んだ場合は1行目のデータは fscanfで4つの文字列で取れるので//が取れたときは次の文字列を保存しない 流れでデータを保存できるんですが//とコメントがスペースやTABなどが入ってない 場合次の行の保存した文字列がとれなくなります。 どういった方法でうまくとれますでしょうか?
371 :
デフォルトの名無しさん :2006/01/19(木) 22:11:06
>>370 ヘッダかなんかに宣言されてる値だけ取りたいみたいな処理なんですかね?
だったら一行取ってきて、"//"を検索してあったらそれ以降はもうコメントなので見なければ良いんじゃない?
なんかよく読んでないからテキトーでスマソ
>>370 とりあえず俺がCでやるのなら、まずfgetsで行単位に切り出す。
373 :
363 :2006/01/19(木) 22:19:24
374 :
sage :2006/01/19(木) 22:27:17
#include <stdio.h> #define C CCC #define D DDD int main(void) { #if B==C printf("1"); #else printf("2"); #endif return 0; } -------------------- 1が出力されるのですが・・・ どうしてでしょうか。
くだすれに成り果ててるな
376 :
デフォルトの名無しさん :2006/01/19(木) 22:58:26
336ですが、MS-DOSではありません。 linuxでやっているのですが、コンパイラに conio.hがないと言われるので、kbhitと同じような キー入力を判定するものはないですか?
377 :
デフォルトの名無しさん :2006/01/19(木) 23:00:04
>>376 vi ってどうやって作ってるんだろうね
ioctl とか調べてみた?
ttyをraw modeにして、selectで待つ手。
380 :
デフォルトの名無しさん :2006/01/19(木) 23:38:10
>>374 > #define C CCC
> #define D DDD
CCC、DDDってなんだとおもう?
数値に変えればご希望の動作になると思うけど
381 :
デフォルトの名無しさん :2006/01/19(木) 23:51:49
>>377 ioctlとはんでしょうか・・・
ぐぐってみたのですが意味がよくわかりませんでした_| ̄|○
382 :
デフォルトの名無しさん :2006/01/20(金) 00:00:23
383 :
デフォルトの名無しさん :2006/01/20(金) 00:01:43
上の行で指定した試行に戻るには、何を使えばいいんですか? プログラムを実行して結果が出てから、最初の方に戻るかどうか選択できるようにしたいんですが。 質問わかりにくくてすいません。
キーワードくらい本かなんかで、自分で覚えようよ・・・
385 :
デフォルトの名無しさん :2006/01/20(金) 00:09:14
doしちゃいたいんだろ?
>>383 while(1){
...
判定して break;
}
388 :
383 :2006/01/20(金) 00:23:29
ありがとうございます。 がんばってみます。
return "ABC"; みたいに文字列リテラルを返すのってありなんですか?
あり。
>>389 ありだが普通はバッファへのポインタを引数で渡して
そこに格納するか、若しくは受け取った側がきちんと
管理するという前提の下で、関数内で動的確保した
領域にセットしてそこへのポインタ返すかだろうな
要はsnprintfとstrdupだろ。
393 :
389 :2006/01/20(金) 00:50:09
ありがとうございます。 文字列リテラルはプログラムのある領域に埋め込まれるということですが、 普通は使うべきではないですか? バッファを引数で渡したり、動的確保は処理が冗長になるかなと思ったので
394 :
デフォルトの名無しさん :2006/01/20(金) 00:52:18
>>391 関数内よりその関数のコール元でバッファは用意すべき
使ってる例も多々あるし、受け手側でconst性を外して書き換える みたいなアフォなことをやらなければ大丈夫
396 :
デフォルトの名無しさん :2006/01/20(金) 00:55:26
プログラムの計算結果をCADに図で出力したいんですけど どうやって書けばいいのでしょうか?
397 :
327 :2006/01/20(金) 00:57:04
>>331 おくれましたがありがとうございました
ヌル文字もそういう意味だったとは・・
398 :
389 :2006/01/20(金) 00:59:20
>>395 ありがとうございます。それは気をつけます
void babo(int *arr,int num) { int temp=0; if(num==1) return; for(int i=num-1;i>0;i--) if(arr[i]<arr[i-1]){ temp=arr[i]; arr[i]=arr[i-1]; arr[i-1]=temp; } babo(&arr[1],num-1); return; } 上記の関数は独自に実装したバブルソートのコードでして arrにソートする配列へのアドレス、numに配列の個数となっています。 それはともかくとして、適当な数が代入された100,000個のint型(符号付き32bit)を上記の関数でソートしますと なぜか制御が戻ってこないままプログラムが終了してしまいます。(10,000個とかだとソートされるのですが・・) 処理系はBCC5.5.1で、OSはXP(32bit)sp2を使用しています。CPUも32bitです。 原因がわかる方はいますでしょうか・・・
BCCってデバッガー無いの? 無いならないでprintfで表示させるとか考えない?普通。
ですから babo(arr,num) fflush(stdin); printf("ソートが完了しました"); getch(); などしてもbaboから制御が返ってこないまま終了していまうんですってば
10,000個以上だとどこまでOKなの?
2^16個ですともう制御が返ってきません 2^15個では制御が返ってきます。 2^15個+1、2^15+100個でも制御は返ってきました
たぶんint型配列の宣言ですでに強制終了してると思われ
>>400 さんがpirntf使えって言ってるでしょ
>>401 お前馬鹿だろ。
baboの中でprintfで終了条件のチェックとかしないでどうすんだよ。
わかんないなら黙ってて
char *strとかにstr++しながら文字入力していって strを先頭に戻したい時って strからずらした分引くしか方法ないですか?
>>409 char *startでも作って文字入力する前に入れておけ
それくらいだったらunsignd ic = 0; str[ic++] = ...;とでもすればいいと思うが。
getCH();とputch();を用いて キーボードから打ち込んだ一文字一文字を 判定した上でコンソール上で表示しているわけですが コンソール画面上に表示されている文字をchar型配列に保存したく思っております 何かよい方法があればご教示下さい
415 :
デフォルトの名無しさん :2006/01/20(金) 15:57:51
C言語の開発環境でJavaのEclipseのような感じの使いやすいものはありますか? 今までJavaで仕事をしていたのですが、新しい案件でどうやらCも使うそうなので、 短期間ではありますが勉強したいと思っています。 個人的なお勧めで良いので教えて下さい。 Eclipse+CDTも考えたのですが、C環境ならではの良いフリーソフトがあるのではないかと思いまして。 宜しくお願いいたします。
BCC+bcpad
417 :
デフォルトの名無しさん :2006/01/20(金) 16:01:14
>>416 素早い返信ありがとうございます。
使ってみます。
418 :
デフォルトの名無しさん :2006/01/20(金) 17:28:25
早速BCC+bcpadの環境で勉強し始めたのですが、開発環境によるものなのか、 自分自身の間違いなのかわかりませんが、以下のプログラムが思うように動作しません。 #include <stdio.h> void main(){ int n; char ch; printf("数字入力>"); scanf("%d", &n); printf("文字入力>"); scanf("%c", &ch); printf("\n"); printf("入力された数値 = %d\n",n); printf("入力された文字 = %c\n",ch); } [実行結果] 数字入力> 10 [return] 文字入力> a [return] 入力された数字 = 10 入力された文字 = a
1時間27分11秒でギブ
420 :
デフォルトの名無しさん :2006/01/20(金) 17:33:29
>>418 の結果になる予定だったのですが、数値を入力し、ENTERキーを押した時点で
数字入力> 10
文字入力>
入力された数字 = 10
入力された文字 =
このような形で出てきてしまいます。
例題の載っていたサイトのものをそのままC&Pしても同様の結果になりました。
原因のわかる方、教えて下さい。宜しくお願いします。
421 :
デフォルトの名無しさん :2006/01/20(金) 17:37:16
>>419 すみません。
原因が自分にあるために間違っているのであればやりようがあるのですが、
問題のサイトの例題を使っても同様の結果になったので、
例題のサイトが間違っているのか、もしくは環境が影響することはあるのかな?と思い、質問させて頂きました。
雄山:馬鹿にscanf()を使わせるな!
初心者だからどっかのサイトを見ながら勉強進めてるんだろうからそこに書いてある事をそのままやるだろうし、 scanf()がどうとかわからないの当たり前だろうに。ひでぇ住人だ。 これくらいのこと答えてやってもいいんじゃねーの?俺?答えねーよwwww
425 :
デフォルトの名無しさん :2006/01/20(金) 17:50:52
ここはC言語の質問スレではなかったんですね。すみません。 自分で他のところから進めたら、いずれ分かるかもしれないので しばらく進めていってみます。ありがとうございました。
もうね、C 0x では scanf とかね、廃止して欲しいわけよ。
>>426 VC8.0では、既にscanf_s()を推奨している。
>>418 のどこが間違ってるのか全然分かりません。
429 :
428 :2006/01/20(金) 18:32:25
教えてください。本当にお願いします。気になって更新ボタンが 手放せません。なぜあのプログラムがいけないのかという事をお願いします
浮動小数点とscanfの質問禁止!
432 :
428 :2006/01/20(金) 18:36:31
>>430 教えて頂きありがとうございます。改行コードを検索してきます。
>>428-429 > scanf("%d", &n);
> scanf("%c", &ch);
scanf(" %d", &n);
scanf(" %c", &ch);
で期待通りの動きはするだろうが、
scanfの数値チェックでまた嵌りそうな気がする...
%dの時はいらんだろ
ntpdate
440 :
435 :2006/01/20(金) 20:35:56
そんなに名称があったんですか・・・。やって見せて下さい!!
>>399 ネタ認定されてるけど、いちおう。INT_MAX ULONG_MAX 辺りで調べてみて。
>>442 計算量の話だろ、バブルソートだぜ2乗増えるんだから返ってこなくてあたりめーじゃん
CでDOS窓に文字や計算を表示させる事ぐらいしかできませんが コンソール・windwsアプリケーション共にどのくらいのプログラムを作成する事が出来るんですか? dosとwinと別で見本とかないでしょうか?
できればオープンソースのやつがいいです・・。 全くプログラミングは無知識なんでどういった風に出来るのかが知りたいのでご存知の方がいらっしゃいましたらお願いします。
>>445 例えばC標準では文字を出力するならprintfだろ
WindowsアプリケーションではMicroSoftが提供している関数郡(API)を使用して
1.ウィンドウの作成 CreateWindow関数
2.メッセージの処理 GetMessage関数
3.文字の出力 TextOut関数
4.終了処理 PostQuitMessage関数
をしなければ成らない
更に言うとWindowsアプリケーションを組む事においてC言語というフィールドはたんなる土壌に過ぎない
447 :
デフォルトの名無しさん :2006/01/21(土) 10:22:47
>>444 #include <windows.h>
main()
{
HDC hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
Ellipse(hDC, 0, 0, 640, 480);
DeleteDC(hDC);
}
if(( num != 2) && ( num !=3) && ( num !=4) ) のように○か▲か■か・・以外なら〜というような条件を付ける場合 もうちょっと短く書けないもんでしょうか? numならいいんですけど変数名が長いと横に長くなっちゃって・・・
>>448 そういう複雑な条件には,何らかの意味があるはず。
ソケットにまだヘッダが到達していないとか
ユーザー名,住所,パスワードのどれかが記入されていないとか
ネコミミがついていないとか
そういう判定の関数を作って,適切な名前をつけてやればどうよ?
if (! isAvailableNekomimiHeader(state))
みたいな。
なるほど、関数にしちゃうんですね。 基本的な事なんだと思いますがそこらへん盲点でした。ありがとうございます。 ビット演算とか使ったりするといいのかなーと思ったんですが、 わかりやすい方がいいですね。
Switch(dwCurrentStatus){ case 1: case 5: case 7: return true; default: return false; } のような感じでしょうか? Switch使えば本体部分も関数も短くなりますね。 というか全然当たり前っぽいことできてないみたいで・・・
453 :
デフォルトの名無しさん :2006/01/21(土) 11:43:47
return (0142 >> dwCurrentStatus) & 1;
それCじゃないから
>>454 どれがCじゃないと?
>>453 そういうのを書き出すと2進定数表現が欲しくなるね。
>>448 C99なら関数をstatic inlineにしておくと最適化によって、
条件判断を長々と書くのと変わらない効率が期待できる。
fp = fopen("C:\\Documents and Settings\\ta\\デスクトップ\\data.txt", "r"); スペースの場所でエラーが出てるみたいなんですけど こうゆうときのパスはどう書けばいいんでしょうか?
>>456 それで開けると思うけど、ダメならショートネームを使うとかなんとか。
詳しいことは、環境依存OKスレででも聞いてくれ。
>>455 > どれがCじゃないと?
おそらく、
>>452 のことでは内科医? Switch は C の予約語ではない。
>>456 > スペースの場所でエラーが
それ、ほんとか? 家のPCには開発環境がないので確かめられないが、ちょっと考えられないな。
>>456 うちでは通るよ(VC++6.0・Win2000)
ユーザtaがいないとか、実行ユーザにtaのファイルを見る権限がないとか?
>>459 に追加
windows のロングファイル名に対応していない 標準ライブラリ使ってるとか?
某試食版の予感
464 :
デフォルトの名無しさん :2006/01/21(土) 15:45:58
長さの違う文字列と数値を画面にインデントを合わせて表示したいです。 例えば AAAAA 10 AAAAAAAAA 20 BBBB 30 なふうにです。 文字列と数値は別々に変数に持ってるんですが sprintf( a, "%-20s %d", b)でうまくいかないんですが他に何を足せばいいですか?
printf("%s %*d",s,n,20-strlen(s));
466 :
デフォルトの名無しさん :2006/01/21(土) 16:09:24
質問 #include <stdio.h> int main(void) { int data1[10]; int data2[] = { 1, 2, 3, 4, 5 }; double data4[5] = { 1.1, 2.2, 3.3, 4.4}; double data5[5] = { 1.1, 2.2, 3.3 }; return 0; } どこがおかしいのかわからない。
>どこがおかしいのかわからない。 ???printf("");?
468 :
デフォルトの名無しさん :2006/01/21(土) 16:13:49
あそうか。値を使ってないもんな失礼
質問なんですけど、というより宿題で 「C言語を使って実行すると特定のレジストリを書き換えるプログラムを作れ」 というのが出題されたのですが、どうしたらいいのでしょうか?
int registry;
473 :
デフォルトの名無しさん :2006/01/21(土) 16:51:44
暇なんだろ、教えろや!
早くしろ、バカ!
476 :
デフォルトの名無しさん :2006/01/21(土) 16:54:51
464です。 文字列と数値を別々の変数でもっててそれを一旦文字列に変換して その文字列を表示させたいのでprintfじゃなくて一度scanfを通して文字列を 作ってから作りたいです。
>>476 こういうことか?
int n = 10;
char *s = "abc";
char buf[30];
sprintf(buf, "%-20s %d", s, n);
そうでないなら(そうでなくても)日本語がおかしいからコードで書いて味噌。
478 :
デフォルトの名無しさん :2006/01/21(土) 18:41:19
そういうことなんですが sprintf(buf, "%-20s %d", s, n); でわたしもうまくいくと思ったんですがうまくいかないんですよ
>>399 >401を読む限り、printfの入れ方が判らんのかもな
void babo(int *arr,int num)
{
int temp=0; ←コレ不要な
if(num==1) return;
for(int i=num-1;i>0;i--)
中略
}
if(num%5000) printf("num %d\n",num); ←コレを入れてやれ(再帰5000回に1回報告するから)
babo(&arr[1],num-1);
return;
}
mod5000ぐらいで見てれば帰ってくる感じが判るだろ、しかしバブルソートで100万も潜ってくってのもすごいなぁ
今50万でやてみて飽きた。
480 :
デフォルトの名無しさん :2006/01/21(土) 22:02:31
3行3列の行列の双分解についてのプログラム A(0 1 2 1 0 2 2 0 2 ) はどう書きますか?
482 :
デフォルトの名無しさん :2006/01/21(土) 22:08:33
わかりませ? 分かりません? 分かりまっせ?
>>478 何がどう巧くいかないのか書けないなら鼬害だな。
484 :
デフォルトの名無しさん :2006/01/21(土) 23:05:43
>483 結果的には AAA 1 AAAA 2 この文字列と数値があったとしたら文字列のあとに20個の空白が設定された あとに数値が文字列としてセットされます。
>>484 他人に自分の意図を正しく伝えられない人が、
コンピュータに正しく処理を伝えられない。
と言ういい見本だな。
>>476 > 一度scanfを通して文字列を作ってから作りたいです。
これだけで、日本語に不自由していることがよく解るな。
487 :
デフォルトの名無しさん :2006/01/22(日) 00:41:11
理解力のない低脳猿が集うスレだなw
int型の配列 a[100] に、1〜9999までの任意の値が入っています。 すべての a[i] (i=0,1,2,...,99)について、a[i]を引数に持つ共通処理を行いたいのです。 ただし、特殊な条件があって、 a[i]==1234の場合は、「前処理A⇒共通処理」を500回、 a[i]==5678の場合は、「前処理B⇒共通処理」を1000回、 繰り返すとします。 そこで、二つのパターンを考えました。 ---------------------------------------- // パターンA int b[10000];// すべて 1 に初期化済みとする b[1234] = 500; b[5678] = 1000; for ( i=0; i<100; i++ ) { for ( j=0; j<b[a[i]]; j++ ) { switch ( a[i] ) { case 1234: 前処理A; break; case 5678: 前処理B; break; } 共通処理( a[i] ); } }
490 :
490 :2006/01/22(日) 00:54:39
---------------------------------------- // パターンB for ( i=0; i<100; i++ ) { switch (a[i]) { case 1234: for ( j=0; j<500; j++ ) { 前処理A; 共通処理( a[i] ); } break; case 5678: for ( j=0; j<1000; j++ ) { 前処理B; 共通処理( a[i] ); } break; default: 共通処理( a[i] ); } } ---------------------------------------- パターンAは、ソースはすっきりしていますが、 繰り返す数を保持するためだけの配列 b が、無駄かつ莫大なメモリを使用しています。 また、「1234」「5678」という直値が二箇所ずつ埋まっているのもいけません。 パターンBは、共通処理の部分が複数箇所存在するため見た目も悪いですし、 ここを変更しようとすると、すべての箇所を書き換えなければなりません。 どうか、良い方法があればご教授ください。 目指しているのは、1に省メモリ、2に高速化です。
時期尚早な最適化はしない メモリがどうならパターンBだし、実行時間は自分で実行して計ればいいのでは? 漏れならb[10000]などせずに実行回数を返す簡単なinline関数なりを作るかな
>>489-490 パターン1の配列Bをループ回数を入れるint型変数に変えて、
それぞれのパターンでループ回数を入れればいいんジャマイカ?
# どうして先ず配列にしたのか、理解に苦しむ。
そもそもパターンAとパターンBで挙動が違う
>>490 まず、これではなぜダメなのかを知りたい。
for (i = 0; i < 100; i++) {
switch (a[i]) {
case 1234:
for (j = 0; j < 500; j++) preprocess_A();
break;
case 5678:
for (j = 0; j < 1000; j++) preprocess_B();
break;
}
common_process(a[i]);
}
パターンBでいいじゃんか どこが「見た目が悪い」んだ?
void func(void); typedef struct { void (*pf)(void); int data; } HOGE; HOGE hoge[] = { { func, 1 }, ... }; int main(void) { hoge[0].pf(); return 0; } のように関数ポインタを構造体メンバとして使うと、mainのところで 「プロトタイプ宣言のない関数の呼び出し」という警告が出ます(BCC5.5.1) この警告が出るのは何故でしょうか?
>>494 1234の時は「前処理Aと共通処理を500回、
5678の時は「前処理Bと共通処理を1000回、
それ以外の時は「共通処理」を1回だろ?
498 :
497 :2006/01/22(日) 01:19:47
>>497 ×1234の時は「前処理Aと共通処理を500回、
5678の時は「前処理Bと共通処理を1000回、
○1234の時は「前処理Aと共通処理」を500回、
5678の時は「前処理Bと共通処理」を1000回、
閉じ忘れた…orz
>>496 > hoge[0].pf();
優先順位を考えると
(hoge[0].pf)();
じゃね?
>>499 (hoge[0].pf)(); としても
(*hoge[0].pf)(); としても警告は消えませんでした
まあコンパイルは通るので実行はできるのですが、気になったもので
>>496 って言うか、ほぼそのソースで警告でないが?
# ちなみに環境はBCB5
>>501 ちゃんと見てみたら関数ポインタの引数のvoidが消えてました…
おさわがせしましたorz
503 :
494 :2006/01/22(日) 01:49:59
>>497 thanks, 問題読み違えてた。
>>489 それならパターン2だろ。共通の処理を関数に切り分けていれば、
共通処理の内容が変更になっても問題ないはず。
504 :
490 :2006/01/22(日) 02:20:50
>>491 なるほど、その通りかもしれません。
パターンAで回数を返す部分をインラインにすれば、ソースはすっきりしますし、保守性も良いですね。
>>492 ということは、jのループの前に、ループ回数を決めるための条件判断が必要ですよね?
さらに、Jのループ内でも前処理を決定するための条件判断がいるわけで、無駄じゃないですか?
bを配列にしたのは、ループ内での条件判断を一回にするためです。
>>493 …すみません、気づきませんでしたが、どう違うんでしょうか?
>>495 ソース内に、同じ処理を行う部分が複数箇所存在するのは、可能な限り避けるべきだと思います。
「共通処理」というのが単一の関数ならまだ良いですが、もしこの処理が数十行に渡るものだったりすると大変なことになります。
変更する場合にはすべての箇所に変更が必要ですし、保守性も悪すぎるので…。
>>498 その通りです^^
>>494 上で書いた
>>495 さんへの回答で指摘した問題点は「パターンBで【共通処理】を関数に切り分ける」
ということで、確かに解決するのですが…。
その共通処理が重い(処理速度ではなく、重要度が)場合や、後始末が必要になる場合
(例えば、メモリをアロケートしたり、スタックを操作したり、ファイルアクセスをしたり)、
複数箇所に存在させるのがどうかなーと思っています。
例えば、application_main() とか screen_draw() とか、check_keyboard() とか wait_vsync() とか、
ソース中に何箇所も書きたくない関数ってあると思うんですけど、
「共通処理」は、結構それに近いものがあったりするので…。
>>504 共通処理が数十行にまたがるなら、これもまた更に別関数に分けるべき。
どーでもいいから抽象的な想像に具体的な根拠をつけろ。 これじゃ単なる言葉遊びじゃないか
では、こう言おう。 次の選択肢からどれか1つのみ重要視するものを選べ。 1. 省メモリ 2. 実行スピード 3. コードの保守性 4. コードの見た目 5. その他
509 :
490 :2006/01/22(日) 02:35:59
>>507 3⇒1⇒2⇒4 でしょうか。
現状、条件が追加されたり、ソースの変更が頻繁に行われているため、そのような順位にしました。
ただし、極端に大量のメモリを使うのは、いくら保守性が良くてもNGです。(
>>489 パターンAも厳しいです)
また、保守性が良いコードは、それほど見た目も悪くないと思うので、3がよければ4は特に意識しなくても良いかと。
>>509 だったらやはり
>>505 のようにcommon_processに共通処理を「全部」移した上で
次のようにするのが良いのではないだろうか。少なくとも保守性の観点から言えば。
for (i = 0; i < 100; i++) {
switch (a[i]) {
case 1234:
for (j = 0; j < 500; j++) {
preprocess_A();
common_process(a[i]);
}
break;
case 5678:
for (j = 0; j < 1000; j++) {
preprocess_B();
common_process(a[i]);
}
break;
default:
common_process(a[i]);
}
}
512 :
490 :2006/01/22(日) 03:27:55
皆さんの意見を参考にしつつ、自分でも考えてみました。 ---------------------------------------- // プリプロセス void preprocess_A(); void preprocess_B(); typedef void (*ppfunc)(); // プリプロセス関数型 int preprocess( int a, ppfunc *p ) { int lp; // ループ回数 switch ( a ) { case 1234: *p = preprocess_A; lp = 500; break; case 5678: *p = preprocess_B; lp = 1000; break; default: *p = NULL; lp = 1; } return lp; } // 続く↓
513 :
490 :2006/01/22(日) 03:28:41
// メイン main() { int i,j,loop; ppfunc p; // プリプロセス関数ポインタ for ( i=0; i<100; i++ ) { int loop = preprocess( a[i], &p ); for ( j=0; j<loop; j++ ) { if ( p ) p(); // プリプロセスが必要な場合のみ common_process( a[i] ); } } } ---------------------------------------- 保守性を高め、common_process を一箇所にして、無駄なメモリをなるべく使わずに書いてみました。 処理速度の低下も最低限に抑えたつもりですが、いかがでしょうか。
くだらないこだわりがあって保守性を高めている つもりになっているようだが、可読性を著しく 落としてるな。 言語レベルで十分な道具が用意されているオブジェクト 指向言語でやるのならともかく、C言語でそこに こだわっても高確率で良い結果にはならない。 どうしても気になるならC以外で実装したほうがいい。
この程度で可読性が著しく低いとな?w
サンプルプログラムしか見たことがないのかい?w
>>514 preprocess と common_process を完全に分けたり、
main() では細かい条件判断をしないのは、少しでもプログラムをかじった人間なら当然だな。
この設計ならば、条件や仕様が追加されても、main()は一切変更の必要がないし、
preproを書く人間とcommonを書く人間が別人でも関係ない。
ただ、速度を重視するなら、a[i] はポインタでアクセスしたほうが良い。
配列→ポインタくらいはコンパイラさんが最適化してくれるんじゃないの?
#include<stdio.h> int main(void) { int na,nb; puts("二つの整数を入力してください。"); printf("整数A:");scanf("%d",na); printf("整数B:");scanf("%d",nb); printf("それらの平均は%fです。\n",(na+nb)/2.0); return(0); } 上記を実行して、整数二つ目を入力した後、エンターキーを押すと >問題が発生したため、exeを終了します。ご不便おかけして申し訳ありません。 と出てきます。何が原因なんでしょうか? Borland C++ Compiler、Cpad for Borland C++ compiler、 勉強に使っている本 のどれが原因かわかりません。
頭。
「やるき、こんき、えのき」が、足りないのが原因
えのきよりまつたけがいい
ソフトか環境が原因で間違いない
>>517 ・宣言したてのint型の値に使えるアドレスを設定してくれていないコンパイラ
・明らかに勘違いしている部分を強調表示してくれないエディタ
・自分は正しいと信じて止まないバカにも分かりやすいように記述されていない本
どれでもお好きなものをお選びください
523 :
517 :2006/01/22(日) 07:16:50
プログラムは本の丸写しです。 #include<stdio.h> int main(void) { int na,nb; puts("二つの整数を入力してください"); printf("整数A:");scanf("%d",&na); printf("整数B:");scanf("%d",&nb); printf("それらの平均は%fです。\n",(double)(na+nb)/2); return(0); } これなら実行できました。
釣り?
525 :
517 :2006/01/22(日) 08:00:34
うるさい。わからんなら黙っとけ
526 :
17 :2006/01/22(日) 08:07:41
わかんないんです(><;)
527 :
517 :2006/01/22(日) 08:16:43
釣りでした。すいません
配列よりポインタでアクセスしたほうがいいという アドバイスはあまりにも時代遅れで頭が悪いと思う
>>512 for(i=0;i<100;i++){
switch(a[i]){
case 1234:
cnt=500,fnc=pre1();
break;
case 5678:
cnt=1000,fnc=pre2();
break;
defualt:
cnt=1,fnc=none;
break;
}
/* 以下略 */
こんな雰囲気でどう?
fncは関数ポインタ型で、デフォルト時に何もしない関数を入れておけばifも不要になる。
530 :
490 :2006/01/22(日) 14:18:03
>>529 なるほどー。確かにメインはかなりすっきりしますねー。
ただ、処理速度の面では、
空の関数を呼ぶよりも、関数ポインタのヌルチェックをするほうが、
おそらく数倍速いのではないかと。
ヌルチェックが空の関数より数倍速いとか寒すぎる・・・ 手段に没頭して目的が達成できない、 絶対一緒に仕事したくないタイプ
>>530 どう考えても、「ポインタのNULLチェックして前処理関数を呼ぶ」ロジックを500回や1000回繰り返すより、
「何もしない関数を呼んで戻ってくる」処理1回の方が頻度低くね?
根拠は?
>fncは関数ポインタ型で、デフォルト時に何もしない関数を入れておけばifも不要になる。 が分かっていないのでは?
>>534 500回や1000回も無駄なif文を呼ぶ処理時間より、
if文1回と関数コール1回の速度差の方が小さいだろ?
「ポインタのNULLチェックして前処理関数を呼ぶ」はともかく、 「ロジックを500回や1000回繰り返す」とは言っていないような。
>>537 なんだ、過去レスもまともに読めないだけか…
なんだ、コードもまともに読めないだけか…
C/C++の宿題を片付けます 58代目のスレ 205レス目で質問した者です。
宿題以来では無いのでこちらに書き込みます。
そこで依頼した内容は
1,2,3,4,5,6,7,8,9を一つずつ使ってできる9桁の数(例えば294618375など)をyとする。
また、xを正の整数とする。
そこで、y=x*x が成り立つyとxの値をそれぞれ求め、
y=????????? x=?????
y=????????? x=?????
y=????????? x=?????
上記のような形式で値を出力するプログラムを書け。
です。
そしてその時そのスレの209さんにお答えしてもらった内容を
http://www.uploda.org/uporg292766.txt.html ここにアップしました。
自分で考えてみたのですが、どのように処理を行っているのかよく分かりませんでした。
先生に内容の事で質問をされた時に困らないよう理解しておきたいので、どなたか解説していただけないでしょうか?
C言語はほとんど初心者のような者です。
どうかよろしくお願いいたします。
いろいろやっても大して変わらないと思う
どうみても宿題です、本当にありがとうございました。
>>541 他人に宿題を頼む様な人には、
どんな説明をされても理解出来ないから安心汁!
>>541 main の中では
whileループの中で
1)x=1から始めてxの値を1つづつ増やしつつ xの2乗を次々に作り出している
2)その値を取りあえずyに入れて、条件に合致しているかどうか checkしてんだよ
>>545 単なる茶々なんだけど....
> 1)x=1から始めて
なんでそんな無駄なことをしているのであろう?
(int)sqrt(123456789) <= x <= (int)sqrt(987654321) のレンジだけ調べれば
良い話ではないのかい?
効率よいったって、省略できるのは 全探索領域の1/10だけどね。
>>546 545です、あのソース読んだけど、さほど無駄ではないぞ
sqrtなど使う必要なしな点でも、546氏のよりあのソースの方を俺は好むね
今のPCでは知らんが昔ならsqrtなど使うより全然速いよインクリメントと整数乗算だけだから。
(547の指摘どおりで1/10だけの効率化のために無駄なコードと関数呼び出しはダサイとおも)
>>548 > sqrtなど使う必要なしな点でも
> 546 が言ってるのはこんなんでええんちゃうのか?
int
main(void){
int y, x, f, i, r, t;
for (x = 11111;/* sqrt(123456789) > 11111 */
x < 31623; /* sqrt(1000014129); eg 31622*31622 = 999950884 */
++x) {
t = y = x * x;
f = 0;
for (i = 0; i < 9; ++i) {
r = t % 10;
t /= 10;
if (r == 0 || (f & (1 << r)))
break;
f |= (1 << r);
}
if (t == 0)
printf("y=%d x=%d\n", y, x);
}
return 0;
}
>>541 そんなの普通に「小町平方数」でググればすぐ判るだろ?
一体何が判らないんだ?
551 :
541 :2006/01/22(日) 21:32:37
541です。 545さんのお答えと自分で調べてみたので大体は理解できました。 ですが2つ気になる点があるのですが質問よろしいでしょうか? while文についてなんですが、ソース内22行目 while(1) とありますが、この(1)はどういった働きをするのでしょうか? while文の()の中は継続条件式を入れる、と習ったので不思議に思いました。 また、もう1つの質問は、ソース内15行目 z /= 10 の部分です。 /= とはどのような処理なのでしょうか? 色々と申し訳ございません。
>>551 勉強しなおせ
while(1)は継続条件式が常時「1」即ち「真」よって永久ループ
/=は代入演算子の一種で、右辺で左辺を割った結果を左辺の変数に代入する
正直俺は
>>551 の作るプログラムは絶対に使いたくない。
今は当然、今後も一切。
教えてください。 c:\documents and settings\miki\デスクトップ\e03g0009\donotmodify\StdAfx.h(17): fatal error C1083: include ファイルを開けません。 'd3dx9.h': No such file or directory このエラーはどういう意味でしょうか?
>>555 'd3dx9.h'なんてファイルは無い
>>551 > while文の()の中は継続条件式を入れる、と習ったので不思議に思いました。
1 も立派な条件式 (式の定義に関しては, JIS とか ANSI とかの定義参照)
C は式の結果が 0 か 0 でないかで条件判定をする
> z /= 10
z = z / 10 の短縮表現.
他の伝統的な言語とか関数型言語では副作用として忌嫌われる演算子
558 :
551 :2006/01/22(日) 21:54:07
551です。 お答えいただい方、有難うございます。 そして数々の初心者発言、申し訳ございませんでした。 皆様にご迷惑にならないよう後の事は自分で考えます。
解らないことがあるのは、まあ当然だろうし、それを聞くなとも言わないけど、 少しは脳みそ使って考えろよ。
BCC Developerのメイクとコンパイルの違いって何ですか?
コンパイルはmakファイル作るだけ、メイクはexeファイルまで作る。 BCC Devしか使った事ないけどDOSコマンドも覚えてたほうがいいかな?
コンパイルしたプログラムをネット上で公開した時、そのファイルを分解してソースまで復元する事は可能? またそれをできなくするようなコンパイル時に暗号化みたいな事が出来るのかな
563 :
デフォルトの名無しさん :2006/01/22(日) 23:44:46
main() { _562_is_afo(); } _552_is_afo() {}
>>562 アセンブリコードにまでは可能だが、C言語までは完璧には絶対出来ない。
出来るソースは可読性ゼロだしな
>>564 resTHX
そうですか、じゃあ安心して公開しまくれますね
って、盗まれるような技術持ってないか
>>562 手作業でCのソースに落とす人をも含めての話ならば、不可能。
567 :
566 :2006/01/22(日) 23:49:05
「防止が」不可能、のつもりだった。
防止が不可能と言う事はやろうと思えば出来るということ?
解読が↑
完全なソースの復元は不可能に近いが、どういう処理をやっているかは解析されうる。
なるほど。
>>568 元に戻すことは出来ない。何をしているかを正確に知ることは可能。
それすらも防止することは、OSがそのような機能をサポートしていない
限り不可能。
そうなんですか まぁ技術は盗むものって言いますしね
パッチ当ての人とかいるもんね
575 :
デフォルトの名無しさん :2006/01/23(月) 00:26:49
ソースの最後にはreturn 0は必要ですか? 解説書籍によってはあるものやないものがあるのですが0を返さない事によって不都合が起こるのですか?
ソースの最後ってmain関数の最後ってことかな? C言語には必要 C++ならば不要 というのが一般的な解答になるけど
あ、そういうことでしたか CとC++での違いだったんですね、すっきりしました ありがとうございました
Cのコーディングスタイルについて質問なんですが、 関数に構造体を引数で渡すとき、親構造体と その親構造体の下の階層の変数なり構造体なり を一緒に渡すのってどうなんでしょうか。 表現が冗長になってしまうんですけど、深い階層の メンバを頻繁に使う場合、記述が長くなってしまうの が嫌なのでやってしまうのですが。 例えば次のようなプログラムです。 内容はかなり適当ですが。
#include <stdio.h> struct Struct3{ int var2; }; struct Struct2{ struct Struct3 struct3; }; struct Struct1{ int var1; struct Struct2 struct2; }; void foo(struct Struct1 *,struct Struct3 *,int); int main(){ struct Struct1 struct1; struct1.struct2.struct3.var2 = 3; foo(&struct1,&struct1.struct2.struct3,10); printf("var1 = %d\n",struct1.var1); return 0; } void foo(struct Struct1 * s1,struct Struct3 * s3,int num){ s1->var1 = s3->var2 * num; return; }
>>575 とりあえず、main関数の始まりがvoid mainになっていたら、省略可。
int mainとかだと書かなければならない。
それと、MSのVS.NETやVC++.NETを使ってコンパイルする時に、voidもintも付けずに、ただのmainで始めた場合も不要。
俺は、最初はvoid mainで書いていたけど、最近はint mainで書いてる。
わかり辛くってスマソ。
>>582 馬鹿?
>>579 何が不満なのか判らんが、
foo()にs3のポインタを渡すのがいやならこうすれば?
void foo(struct Struct1 * s1,int num){
struct Struct3 * s3 = & s1->struct2.struct3;
s1->var1 = s3->var2 * num;
return;
}
584 :
デフォルトの名無しさん :2006/01/23(月) 06:11:04
>>578 本当に必要性がなくてそういうことをするんだと
たぶん関数化が甘いせいだな
585 :
582 :2006/01/23(月) 08:07:36
>>583 馬鹿?
>>579 何が不満なのかよく判ります。
foo()にs3のポインタを渡すのがいやならこうすれば?
void foo(struct Struct1 * s1, int num){
#defineS3_VAR2(s1->struct2.struct3.var2)
s1->var1 =S3_VAR2 * num;
return;
}
586 :
582 :2006/01/23(月) 09:12:20
587 :
582 :2006/01/23(月) 14:15:59
ウイルス注意
randとsrand関数っていまいちよく分からないのですが とりあえずsrandを0で初期化してrandから乱数をもらってるんですが、それだけの使い方を知っていれば大丈夫ですか? srandの「種値」ってのが良く分からない・・。 1で初期化したら0より上の乱数を呼び出すということですか?
592 :
575 :2006/01/23(月) 16:53:38
main() main()+return 0 int main()+return 0 main(void) main(void)+return 0 int main(void)+return 0 調べてみたらこれだけのmain文と戻り値の組み合わせがあったんですが、一般的に多く使われているのはどれでしょうか? 私は今までmain()だけでやっていましたが戻り値が必要と知ってmain()+return 0を使うようになったけど(void)とかまた意味不明なものが・・。
一番最初に読んだ入門書に倣っておけば間違いない
>>590 rand の乱数は、ある漸化式の値をちょっと変えて返している。
その漸化式の初項を与えるのが srand だ。
>>592 int main(void) + return 0;
が一番良い。
>>594 この瞬間から最初に目があった奴と100回Cして視ね
>>595 この瞬間から最初に目があった奴と100回Cして視ね
>>592 C99対応のコンパイラなら堂々とint main(void)を使っても良い。
仮引数のvoidはその関数が引数を取らないことを表す。
プロトタイプ宣言時に仮引数が空()のときには引数の情報がないことを表す。(つまり適当に引数を与えてその関数を呼べる)
ただ規格を見ると関数定義時に仮引数が空()のときは(void)と同じ扱いと読める。
C99 なんてあってないような規格はどうでもいい。
>>592 int main( int argc, char **argv, char **env )
+
return
>>598 なるほど・・。
なんかまだ良く分からない言葉とかでてますがとりあえずint main(void)+return 0でやってみたいと思います。
603 :
デフォルトの名無しさん :2006/01/23(月) 19:01:03
int A; /* static A; */ void fun(void) { int a; a = A; } グローバル変数Aは、初期化されていないですが、 A は staticを付加すれば、初期化されることにな るでしょうか?
何か知らんがvoid mainってあんまりみないよな 参考書でこれ使ってるのは結構あるけど
605 :
デフォルトの名無しさん :2006/01/23(月) 19:22:48
>>604 おまえさん、参考書以外で main をそんなに見かけるのか?
>>604 void main は処理系独自に許容されてるプロトタイプだからな。
まあ、これ使えない処理系知らないけど。
どの処理系でも使える事が保証されてるのは
int main(int, char**) と int main() だっけ?
でも、処理系独自の拡張は仕様で許容されてたと思う。
処理系独自のプロトタイプを使っても
警告だのエラーだのを出さなくても仕様には背いてないってことだと思う。
例えば環境変数用の引数を入れるとか、void main とか。
ただ、そのコードがどの処理系でも通るという保証は無い。
>>605 このスレとか。
じゃんけんゲーム(1,2,3をグー・チョキ・パーで表す) scanfで1,2,3以外の数字を入力するとエラーを吐いて入力時に戻る設定 数字以外の文字を入力するとエラー文章が永久的にリピート こういう文字を阻止させる場合はどうやればいいの? ちなみにエラーの判断基準は if(p==1||p==2||p==3)でok elseでエラー *pはプレイヤーの手を入力
なんか、scanfの質問ばかりなのだが、同じ人なのか?
609 :
デフォルトの名無しさん :2006/01/23(月) 19:41:25
>>606 おまえさん、「処理系定義: implementation defined」という用語の存在とその意味の社会的な位置づけをしっかり憶えたほうがいい
scanfの他の質問てどれ
昔からscanfを制するものはCを制すといわれているからな。
そういうことか、勉強を進めていたらプログラマはscanfを使わなくなるとあった ってことは607みたいにscanfで文字列を入力したらおかしくなるのは仕方ないことになるのか・・?
誰がほざいたそれ
あぁgetか・・thxφ(゜▽゜*) put,getはprintf,scanfが使えれればいいかと流しておいたらこんなところで使う時が。
getsだったら何の解決にもならないがな
scanf>>>>>>>>>>>>>gets
fgets&sscanfタッグ最強伝説
620 :
607 :2006/01/23(月) 21:20:29
>>616 getsでもだめでした。
printf("グー=1 チョキ=2 パー=3\n");
scanf("%d",&p);
if(p==1||p==2||p==3)
{
中略
}
else
{
printf("エラー\n1〜3を入力してください。\n");
}
とやってるけど文字を入力したらエラー文章のリピートになってしまう。。
621 :
デフォルトの名無しさん :2006/01/23(月) 21:28:34
(おっしゃるとおり)getsでもだめでした。
ある文字列が数値かどうかを結構厳密に判断したいです。 本当の目的は、文字列→数値の変換です。しかしいきなりatofやstrtodだと、 意味不明文字列、例えば"1.u2" "hoge"なんかを 1 や 0 と解釈されてしまいます。 これがイヤなのです。 まず「数値として解釈できる文字列」か「そうではない」かを判断しようと思ってます。 自作できないこともないでしょうが、正直とても面倒です。 便利な既存ルーチンなど無いでしょうか?
625 :
デフォルトの名無しさん :2006/01/23(月) 21:45:50
>自作できないこともないでしょうが、正直とても面倒です。 始まる前に終わってる
>>624 strが「(double型の)数値として解釈できる文字列」のとき、そしてそのときにのみ
sscanf(str, "%lg %c", &dest, &dummy)
は1を返す。destはdouble型, dummyはchar型。
>>624 strtodの2番目の引数を使えばよい。
ここには変換に使われなかった部分の先頭へのポインタがセットされる。
そいつが'\0'を指していなければ文字列の全てが
数値への変換に使われなかったということでアウトにすればよい。
char s[];
char *p;
double d;
d = strtod(s, &p);
if (*p != '\0')
//アウト
629 :
デフォルトの名無しさん :2006/01/23(月) 21:57:10
sscanf("1000000000000000000000000000000000000000000000000000000000000000000000000000000", "%ld", &lUnko);
630 :
624 :2006/01/23(月) 22:06:46
皆様、即レス本当にありがとうございます。
>>627 感動しました。こういうdummyの技は思ってもみませんでした。
>>628 なるほどです、2番目の引数はこういう使い方をするんですね。
入力で必要なのはfgetc()だけ あとは結局自分で書く羽目になる 役立たずの標準ライブラリめ
時代が違うんだから役に立たなくなるのは当たり前だろ馬鹿め。
君に理解できるの判断基準は何ですか?
>>220 scanf("%d%*[^\n]%*c",a)
意味ないだろそれ
639 :
620 :2006/01/24(火) 00:07:37
もう次のステップに移る事にします。レスくれた人ありがとでした。 じゃんけんゲームの次はどんなプログラム作ってみるべきだと思いますか? Cでどこまでのプログラムが出来るかも分からないけどフリーソフトでローグっていうダンジョン型RPGのソースみたら目が点になった。。 ソースファイル.cが10数個あるし、cファイルっていっぱい繋げて使うもんなんだね。。
スーパー○リオもC言語でできますか?
結局じゃんけんゲームはできたのか?
>>640 いっきにレベルアップした感がありますが
目標をそこにしていろいろ勉強してみる。
>>643 >>620 の問題は残ったけどじゃんけんゲーム自体は出来ましたよ。
とは言ってもDOS窓でprintf・scanf・if・whileを組み合わせただけの誰にでも出来る奴ですが。。
オセロにはほぼ遠いレベル。
647 :
デフォルトの名無しさん :2006/01/24(火) 02:00:18
1000番目の素数を求めるにはどのような アルゴリズムを取ればいいですか?
さようなら。
1から順番に素数を求めていき出た素数をカウントするそして100カウントになった時点の素数を表示する。
650 :
デフォルトの名無しさん :2006/01/24(火) 02:18:10
>>649 それ答えになってないじゃん
そのアルゴリズムを聞いてるんだけど
素数を求める方は自分で考えてね。
2からどんどん割れない数を格納してって1000まで格納すればいいよ
時間が無いんだから 早く教えてください
654 :
デフォルトの名無しさん :2006/01/24(火) 03:07:57
初めて質問させていただきます。 2次元の数値データを読み込むときに while (fscanf(fd, "%s %s", a, b) != EOF){ data1[i] = atoi(a); data2[i] = atoi(b); i++; } ってやって読み込ませるようにできたんですけど、データがカンマ区切り でもatoi()するとカンマは外されるんですね。便利だなぁって思うのです けど、この方法で何か問題はあるでしょうか?C言語始めたばかりでちょ っと自信がないのでよろしくお願いします。
int a[10000]; 全部0に初期化して while i=1,i<=10000,i++ ____while j=1,j<=10000,j++ ________a[j*i]=1 んでa[1〜10000]=falseが素数(あと1も) それをfalseになるやつだけ別の配列にいれなおせばいい気がする 質問 別のプロセス上メモリのアドレスを指定して読み込むにはどうしたらいいですか? (ぶっちゃけCじゃなくてもいいんだけど) 今はすぺしゃるねこまんまでダンプしているんですが100万ファイルとかできるとフリーズしまくり
スレ違い
>>656 他のプロセスって、そりゃOS依存だろう。
>>654 たとえば a が char a[10]; と宣言されていたとして、
そこに10文字の空白なしの塊が来たら死亡。
死ぬのは文字列入った後ろのメモリじゃないの
scanf()とかfscanf()とかはお勉強のための関数であって リアルで使うな
>>660 後ろのメモリに入っているものが問題だ。
運よくすき間が空いていればいいが、変数だったら内容が破壊される。
場所がスタックならリターンアドレスを破壊するかも知れない。
10文字丁度ではなく11文字以上だと何が起こるかわからない。
gets()と同様にセキュリティーホールになりうる。
664 :
デフォルトの名無しさん :2006/01/24(火) 10:35:44
>>661 なんでダメなのかご教授を・・・
よくわからないけどgetsとかもダメなんだよね?
>>663 大体一緒に文字列何個か宣言してるとお亡くなりになるよねw
667 :
664 :2006/01/24(火) 10:52:43
盤面の出し方がわからないんです。すみません
コンソールなら表示の関数だけつくったげる API叩け言うならやらない どっちにしろ宿題スレにテンプレに従って書き込まないとやらない
669 :
デフォルトの名無しさん :2006/01/24(火) 11:34:03
>>665 661 みたいな感情的な毛嫌いを見習う必要は全くない
仕事では、【ダメかどうか判断できないものを使うな】
売った物に責任を持つことがプロとアマのはっきりした違いだが
今のおまえさんにとって、仕事で使えそうなものはあるか?
>>664 宿題が自分で出来ないなら、
留年するかやめてしまえ。
>>664 オセロ ゲーム盤の表示だけ、教えてやる。 これで 「 可 」 は get。
#include <stdio.h>
int main()
{
int i;
for(i =0 ; i < 8 ; i++) printf("口口口口口口口口\n");
return 0;
}
673 :
デフォルトの名無しさん :2006/01/24(火) 12:27:52
>>670 コケたら自分にごめんで済む場面では
使っちゃいかんものなど1つもない
大学って、他人に丸投げして、それを提出するだけで卒業できる所なの?
そうだよ
679 :
デフォルトの名無しさん :2006/01/24(火) 13:02:21
>>675 少なくとも論理的ないしは科学的には見えないよな
どんな立場から、観測・考察を経て「使うな」という結論を導いたのかを示していない
B言語を教えてください
681 :
デフォルトの名無しさん :2006/01/24(火) 13:50:32
>>947 昨日C言語始めたばっかりなんで、やり方がしょぼかったらごめんね。
#include <stdio.h>
void main(void){
int a[1000];
a[0]=2;
for(int i=3,count=1;count<1000;i=i+2){
for(int j=count-1;;j--){
if(i%a[j]==0){
break;
}
else if(j==0){
a[count]=i;
count++;
break;
}
}
}
printf("1000番目は[ %d ]\n",a[999]);
}
教えたがりうぜー
宿題スレでやれっつの
B言語教えてくださ〜い><
, -‐- 、 ♪ /,ィ形斗‐''' ´  ̄`''‐- 、 フン♪ //ミ/ ヽ ♪ , - 、!({ミ/ ヽ / 、ヽ⊂!´/ '''''' '''''' 「i「i}i、 フン♪ /冫┐ i'´.l (●), 、(●) ,{ ノ  ̄ l l l ,,ノ(、_, )ヽ、,, ーゝ 'ヽ、 ♪ ! l ', `ヒェェェイ ' /ヽ \ l ヾ,、 `ニニ´ / -‐、‐ヽ > t /` ー- 、___,ォュ'´ ヽ、 / ` ー-! 、`ーi 「´ , -‐'´
ガッハガハガハ(・∀・)ガッハガハガハ
まだ素数を解きたいなら我が解く。
>>681 のでは無駄な計算がある。さあ俺に頼むんだ
690 :
デフォルトの名無しさん :2006/01/24(火) 15:40:28
奇数に+2してるから2で割る必要がないことはわかってるよ。 最初に3まで入れてからやれば楽だったんだけどね。
スレ違いの質問する奴も回答する奴も氏ね
昨日じゃんけん終わってオセロを作るために勉強し始めた奴ですが 単刀直入に、CUIでできるんですか? マスを表示したりすることまではなんとかできそうなんですが 例えばこのコマを選択とかいうのはCUI画面内で表示されている縦横の枡の中からこれというコマを選択することは可能なんですか? それともオセロゲーム作成ってCOMvsCOMのを作成ってことなのかな
入力> 46で4,6に置くとかでいいじゃん
別にCUIでもカーソル十字キーで操作してでそこ!って選ばせるようにすることできるけどね
>>693 なるほど・・時間かかりそうなオセロになりそうですね;
>>694 あるんですか、調べてみます。
そもそもオセロはCUIよりGUI向きとか関係ないですか?
あるんですか・・つか宿題程度でそれは考えないほうがいいと思うよ 面倒だし そりゃユーザはGUIのがやりやすいけどさ 中身は関係ないよ
697 :
654 :2006/01/24(火) 17:28:42
>>661 >scanf()とかfscanf()とかはお勉強のための関数であって
>リアルで使うな
まだ学生です。自分のデータだけ処理しているのなら大丈夫
ですよね。配列は実際のデータの10倍くらいにしてます。
a[500], b[500], data1[5000], data2[5000];
仕事用だと、大量のデータに対処するための処理をする必要
があるんですね。
宿題というか、独学でやってるもんで本で基礎知識ばっかしやってても進展しないのでいろいろ書いてみようかなーってのが始まりです。 まだCUIで文字表示、文字入力、計算、じゃんけんまでしか作れてませんが。。
そっからオセロは飛びすぎな気がするな CPUの思考考えるの大変じゃないか・・ ○×ゲームくらいにしてみては?
あ、やっぱ飛びすぎですか まぁ目標ということで頑張ろうと思ってますが○×はよさそうですね・・。 CPUの思考ってのもありますし、先にこっちやってみます。
昔、7行スレでリバーシのプログラム(思考ルーチン付き)があったなぁ... アレには素直に感動した。 弱い思考ルーチンはそんなに難しくない。挟める場所を挟めば良いだけだから。 それを、角をとった方が有利とかの判断や、数手後を先読みさせると面倒になる。
702 :
947 :2006/01/24(火) 19:02:14
703 :
デフォルトの名無しさん :2006/01/24(火) 19:26:37
初心者です 実は簡単なゲーム(オセロとかそういったの)を作成したいのですが、 C++じゃないと作れないのでしょうか?
ナニコノスレ
705 :
デフォルトの名無しさん :2006/01/24(火) 19:42:09
>>703 作れないのかと聞かれたから、作れる、と答える。
ただし、C言語の標準関数だけでは、作れない、と思ったほうがいい。
そうとうの勉強を積むか、ライブラリを捜してやるようになる。
>>701 そのログを見てみたいのですが、どこかで手に入りますか?
707 :
デフォルトの名無しさん :2006/01/24(火) 19:46:07
>>703 盤面を画面に表示するなら GUI か ESC シーケンスあたりを憶える必要があるけど
「先手2九歩」みたいに棋譜を入力/表示するだけなら ISO9899 の標準関数だけで十分
>703 厚紙とペン、それに鋏があれば作れます。
>>705 C++の標準関数だけでもCと同じでは?
表示部分を簡単に作っていいのならどちらも簡単。
表示で懲りたいならいっそのこと CGI にしちゃって表示はブラウザに
任せてそれでネットワーク対戦できるように作れば思考ルーチンが
要らなくて楽だ。
今、病気療養中で、失業中で、せめて次就職活動 するときのために、C言語を勉強してるのですが どれくらいのレベルまで勉強しとくべきなのでしょうか? それとも、資格を目指して勉強して行った方が良いの でしょうか。 最近、勉強してて、勉強すればするほど、どこまで勉強 すれば良いのか、ライブラリに用意されてる関数についても その関数がどんな処理をしてるかを覚えても、その関数 はどういう構造で成り立ってるかまで覚える必要があるのか とか、それとも理解できていて、わすれたら辞書引きすれば 良いのかとか、わかんなくなってきました。
>>712 就職のために資格試験は有効
というのはプログラマには当てはまらない
自作のプログラムを資格代わりに提出する方が効果的
プログラマは身体が資本だが大丈夫か?
あと、人生相談はスレ違いな!
実務で使えるのは自分で何かアプリケーションを作ったことがあるレベルだな そもそもCに資格なんかあったっけ?
>>712 どんな物事でも知れば知るほど分からないことも増えるものだ。
これは葉っぱを食べている虫のようなもので、食べれば食べる
ほど穴が広がって行くのと同じだ。
もしそう感じることができず、自分は全てを知ったと感じた時は
要注意。それは表面の一部をなめただけの時に起こる錯覚だ。
716 :
デフォルトの名無しさん :2006/01/24(火) 20:41:44
>>712 マ板か就職板で聞いた方がよさそう
スキルは上下となりのレイヤーがわかってないと孤立する
例えば C でどんな分野のソフトを開発するにも、
実際にデモできるような成果物を作るときに色々でてくるのが上のレイヤーで、
C のすぐ下のレイヤーというと OS、アセンブラ、デジタル回路とかね
自助努力はもちろん必要不可欠だけど、個人でできる範囲にも限界はあって研修や OJT で憶えることもある
金と時間にもよるけど、例えばおいらみたいに働きながら夜学でじっくり臥薪嘗胆とかもありだよ
717 :
デフォルトの名無しさん :2006/01/24(火) 22:20:55
>>705 そうすか
とりあえずオセロを作るにはまずはCの基礎を分かっとかないとダメですよね?
釣りだよな・・頼む釣りだといってくれ・・・
719 :
デフォルトの名無しさん :2006/01/24(火) 22:37:01
c言語でMFCのCStringクラスを使いたいですが 使えるならどうしたらいいでしょうか?
721 :
デフォルトの名無しさん :2006/01/24(火) 22:42:15
>720 そんな板あったんだ。そんなとこ知ってる喪前が電波 じゃね?
722 :
デフォルトの名無しさん :2006/01/24(火) 23:01:15
Microsoftに入社してCString使わせてください!とお願いする。 これ完璧じゃね?
>>719 クラスはC++の機能だからどうしようもない。
C++を使え。でもC++だからと言って自分もクラスを作ってOOPにする必要はどこにもない。
>>719 DLLにでもして呼び出したらいんじゃね?
>>712 こんなことまで人に聞くようなやつが職場にきたら大迷惑なので
そのまま療養し続けてください
>>717 Cだけでも余裕で作れる
全部理解する必要すらない
728 :
デフォルトの名無しさん :2006/01/25(水) 00:22:57
[至急] 質問です。 (char*)Str->data と(char*)(Str->data) は同じですか、違いますか?
729 :
デフォルトの名無しさん :2006/01/25(水) 00:33:59
同じ
731 :
デフォルトの名無しさん :2006/01/25(水) 00:35:32
729さん、730さんdクス!
二人プレイのオセロなら余裕で作れるだろう。
別に
>>703 はvsCOMとは言ってないし。
トランプと違って二人用で同じ画面でやっても全く問題ないゲームだしね。
733 :
デフォルトの名無しさん :2006/01/25(水) 11:07:32
double d =2.96e-57; printf("%le\n", d); とすると、 2.96e-57 fedora core3のgcc 2.96e-057 VS.Net となったのですが、printfで指数部の桁数を自分で指定することはできますか? 例えば 2.96e-000057 こんな風に出す方法はありますか? よろしく
>>733 マンページやinfo、MSDNをとくと眺めてなければ諦めろ。
つーか、それだけならsprintf()で変換した結果を加工するとか。
735 :
デフォルトの名無しさん :2006/01/25(水) 20:33:53
ちょっと質問です mallocで確保したメモリ領域を、pthread_createで作った別のスレッド(同一プロセス内)で解放(free)するのは 問題でしょうか? ちなみに、Linux+gccの環境で考えているんですが、環境依存の場合は、該当するスレを教えて欲しいです。 (UNIXスレとかで大丈夫ですか?)
問題無。
ここは わからない関数つくってくれたりするんでしょうか? さっき 別のところで ことわられたので。
宿題はお断りします。
質問です。 十二指腸は何のためにあるのですか?
質問です。 void *型の3×3の2次元配列の領域を確保してデータのアドレスを格納したくて下のような コードを書いたんですけど動きません。 こういう場合は、どうすればいいのでしょうか? void *** arg; arg = (void***)malloc(sizeof(void*)*3*3); arg[0][0] = ptr;
742 :
デフォルトの名無しさん :2006/01/25(水) 21:49:22
質問ですが30000の符号無しバイトデータをテキストに 書き込みたいのですが、実際やってみると30000にならない ので、困ってしまいます。(3万バイトから数十バイトほど多くなる) 原因はなんでしょうか? #include <stdio.h> #include <io.h> main(void) { FILE *fp; //ファイルポインター int i; unsigned char data[30001];//0〜255のデータがランダムに入ってます。 fp = fopen( "data.txt", "w" );//開く for(i = 0; i < 30000;i++) fprintf(fp,"%1.1c",data[i]);//書き込み fclose( fp );//閉じる }
"w"を"wb"にしなさい。
テキストモードだから、0x0A(\n)が0x0D 0x0A(\r\n)に変換されてしまうから。
ありがとうございます。今日は時間がないので明日やってみます。
スレ違いかもしれませんが、文字列の順番(strcmpで並ぶ順番)に固有の名前ってありますか?
>>741 size_t m = 3;
size_t n = 3;
void **arg;
arg = malloc(sizeof(void *) * m * n);
arg[0 * m + 0] = ptr;
すみません、ちょっとお聞きしたいのですが C言語で数を連結して数字として認識させることは できるでしょうか? 具体的には1、1,0,1を一文字づつ入力して連結、 (1011)=11として扱えるような連結演算子は ないのでしょうか?
749 :
デフォルトの名無しさん :2006/01/25(水) 22:19:10
>>748 1×10^3 +
0×10^2 +
1×10^1 +
1×10^0
char buf[256]={0};int index=sizeof(buf)-2:int ch; while( ch= fgetc(stdin), ch!=EOF){ buf[index--] = ch; } printf("%d\n", strtol( &buf[index+1], 0, 2 ) ); というような話かい?
>>749 すみません、べき乗を使わずに数をつなげて数字として認識させることは
できないのでしょうか?
752 :
デフォルトの名無しさん :2006/01/25(水) 22:39:02
>>752 申し訳ありませんがそのための演算子などを
教えていただけないでしょうか?
>>753 ビットシフト演算子などがある。
しかし750の方法で問題がある?
755 :
デフォルトの名無しさん :2006/01/25(水) 22:43:37
つ 【atoi】
>>754 ビットシフト!それがあった!
簡単なことに気づきませんでした・・・
ありがとうございました!
>>750 の方法では「内容が難しすぎて理解できない」という理由で却下の模様。
「数」を連結して「数字」 ではなくて 「数字」を連結して「数」 じゃね?
条件が有るなら先に書けと。
761 :
デフォルトの名無しさん :2006/01/25(水) 23:56:40
>>741 おまえさんの身近に二次元配列が ** だなどという毒電波をまき散らす高レベル放射性廃棄物の存在が強く予見される
まずは宇宙服とガイガーカウンターが必要だ
sizeof(void*)*3*3 はもしかして、 voidポイント型のサイズを3×3して、 9個分のサイズを作ろうとしているのか? だとしたら、重症だなぁ…
>762 そこまでは問題ないのでは。
764 :
デフォルトの名無しさん :2006/01/26(木) 01:23:17
rand関数を使う場合 最初にsrand(0);で初期化?しないといけないんでしょうか? srandを消しても動くには動くのですが・・。 またたまにsrand(time(NULL))とありますがどういう意味なんですか?
質問する前には最低限検索を。
766 :
デフォルトの名無しさん :2006/01/26(木) 01:28:33
main関数の前に定義する時ヘッダーとマクロ以外でint関数とかを宣言するのは何故?
767 :
デフォルトの名無しさん :2006/01/26(木) 01:32:22
void *** arg; int i; arg = (void***)malloc(sizeof(void***)*3); for(i=0;i<3;i++) arg[i] = (void**)malloc(sizeof(void**)*3); arg[0][0] = ptr; これでOKだよな?実際に動かしてないのでこれでOKと言い切れないヘタレですまん
srandを呼ばない場合、srand(1)の状態になってる。 srand(time(NULL))は srand(0)やsrand(1)だと、何度実行しても同じ結果になるので、 不確定要素の時間で初期化して、同じ結果にならないようにしてる。
>735 マルチスレッドスレで質問するといい。
>>768 レスどうもです。
前レスで調べろと言われたので調べてみたんですが全くそのとおりでした。
rand関数は実行毎に同じ乱数を出力するのでsrandでseed値を設定してやって毎回違う乱数を出させるようにすると言う事ですね。
それで実行毎に違ったsrandのseed値を与えるために現在時刻を使うtime(NULL)を指定するのが一般的だということですね。
そしてtime(NULL)の意味は暦時刻から年月日を除いた時間だけを返すということですね。
>>770 > そしてtime(NULL)の意味は暦時刻から年月日を除いた時間だけを返すということですね。
1970年1月1日00:00:00から何秒目かを返す。
ここは便利なリファレンスですね。
あら・・言い切ってしまってた・・。
774 :
デフォルトの名無しさん :2006/01/26(木) 02:21:13
C言語(プログラミング言語)のことで質問です 「unsigned char」ってどんな役割を果たすんでしょうか?
じゃんけんゲームからマルバツゲームに取り掛かったものです。 マルバツゲーム難しすぎる・・。 マップは表示できたけど、printfで表示しただけだからあとでマルやバツに書き換えできなかった・・。 もっと初歩的なものを探して出直します・・。
盤面表示の関数くらいつくれ
>>774 主に文字列じゃくてバイナリデータを1バイト単位で扱いたい時に使います。
void map() { int x,y; printf(" a b c\n"); for(x=0;x<3;++x){ printf("%d ",x+1); for(y=0;y<3;++y){ printf("- "); } printf("\n"); } } こうやったけどただの絵
>>778 盤面を周りの壁を含め5*5の配列で定義した場合
void show(int board[][5]){
char str[3][3]={"・","○","×"};
char num[3][3]={"1","2","3"};
int i,j;
puts(" 123");
for(i=1;i<4;i++){
printf("%s",num[i-1]);
for(j=1;j<4;j++)
printf("%s",str[board[i][j]]);
puts("");
}
}
mainでboard[5][5]を宣言
0が何もない1が○2が×でshow(board);
>>778 5行目
puts(" ABC");
に変えとけ
>>779 ふむふむ・・。
charの右側の{}の代入とかの配列の使い方がまだまだ分からない事だらけですね・・。
やっぱしまだ勉強不足のようです。
FEとれてもプログラミングはまったくですな・・
>>780 printfよりputsを今度使えって事ですか?
今度=今後
文字だけの場合はputs
>>781 あれはn番目の文字列を表示しろってだけ
str[0]には"・"という文字列が入ってる
putsは改行つきの文字列出力
puts("あああ");はprintf("あああ\n");と同じ
ただしprintf("%d",i);みたいなことはできない文字列を出力するだけ
>>784 あぁなるほど・・。
str[4]にはヌル文字ですね。
str[0][0]には「・」が入るとしてstr[0][1]とstr[1][0]の場合ではどうなるんですか?
putsは分かりました。
文字列だけの表示のや改行時はputs使う事にします。
あぁ文字列じゃないからヌル文字じゃないか・・。
>>785 str[4]には何もハイってねーよ
str[0]に"・"が入ってんの
str[0][0]は"・"って文字列の1文字目が入ってる・が全角だから何が入ってるんだか知らないけど
str[0][0]とstr[0][1]で・になってstr[0][2]には'\0'が入ってるの
str[4]じゃなくてstr[3]でした どっちにしろヌル文字じゃないですね それでなるほど・・ そういう風に全角文字を代入できるんですね。
コンパイラによっては最適化で char * foo = "bar"; printf("%s\n", foo); が puts("bar"); になるから神経質にならなくてもいいんでね?
>>790 どう言う最適化をすると、そう言う風になるんだ?
あんた文盲?
どんなコンパイラ?
ふつうのCコンパイラですよ。
gccはprintf("%s\n", ***);のputsへの置き換えがデフォルトの最適化になってたかと。 VC++はどうだったかな…
>>767 sizeof (void**) に sizeof (void*) だろ。
てか今ってmallocキャストする必要あったけ?
C++のサブセットのCはキャストは必要 純粋なCとしては不要
C++ってvoid*型万能じゃないの?
>>795 VC++はCRTのソースを読めば printfもputsも _output()になってるのが判るとおもう
gccは本当にputsなんかにするの?
確かにずっと前にgccでは
>>790 のようになるって言ってた香具師がいたよ
>>790 はそれを受けて「コンパイラによっては」って適当なこといっただけかと
>>800 -O0と-O2で調べてみたけど-O2だとputsになってる。
バージョンは、
gcc (GCC) 3.3 20030304 (Apple Computer, Inc. build 1640)
803 :
802 :2006/01/26(木) 18:09:04
あと最適化オプションつけなかったらprintfになってた。
gcc version 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125) で-Oオプションを付けると_putsになるぞ Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland は-Oオプションを付けても_printfのままだね 少なくともgcc3.xは期待しても良いんじゃないか?
初めて質問します。 C言語(ANSI)で、現在時刻をmsecまで取得する方法を教えて頂けますでしょうか。
>>805 ナイッショ、msecの分解能の標準関数なんて
標準関数でないならgettimeofdayとかあるんだけどな GetTickCount、timeGetTime?何それ、俺はそんなAPIは知らないよ
今LinuxでCプログラムを書いているんだが… printf("\t\n"); とやるとタブではなく空白に展開されてしまうのはどうすればいいんだろう? タブコードを出力してほしいんだけど… gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-53) っす。
>>810 コード?
数字を出すなら%d
空白が8つ程出てるのをタブ1つに変えたいんだったらシェルとかコンソールとかの問題だからスレ違い
htonlがマクロで #define htonl(x) (x) って定義されてるんですけどこれじゃ何も起きないですよね? 意味あるんですか?
>>813 環境が変わってエンディアンが変わってしまった時(例えばx86からPowerPC)にも、
そのマクロを一箇所書き換えるだけで対応できるようにしてるんだろ。
移植性の問題かと。
どうしてAppleの人がでてくるんだ
>>816 Macのヘッダファイル見てたからです。
Appleの中の人が本当に賢かったらWinはこんなに普及してないよ あと、今のMacOSはUnixのパクリだから とスレどころか板違いな発言をしてみる
じゃんけんゲームで質問したいのですが、 gcc32のコンパイラでは文字'・'は使えないのですか? エラー表示で不正な文字と出てコンパイルできないのですが、 対処法があるのでしたら、教えていただけませんか?お願いします。
int i,a[5]; for(i=0;i<5;i++){ scanf("%d",a[i]); printf("a[%d]=%d\n",i,a[i]); } これをコンパイルして配列を数字入力しても出力時に入力した数字が出ないのはなぜだと考えられますか?
配列に↑
配列名以外の場合は&が必要。
>>823 ,824
あぁ・・とんだ勘違いしてました、ありがとです。
826 :
819 :2006/01/26(木) 21:17:35
ですが何が言いたいのかと言いますと、 ボードの代用を作成したいんですが、↓のように 123 1・・・ 2・・・ 3・・・ 2次元配列のboard[5][5]として、[1][1]〜[1][3]、[2][1]〜[2][3] [3][1]〜[3][3]に・を代入したいのですが、 グローバル変数、str[3][3]={"・","○","×"};と宣言し、 void PrintBoard(char board[][5]){ int i,j; for(i=1;i <= 3; i++){ for(j=1;j <= 3;j++){ board[i][j] = str[0]; //ここでエラー printf("%s",board[i][j]); } } } とするとエラーの場所で@不正な文字''A移植性の無いポインタ変換 とでますが、・の文字は使えないんですか? コンパイラはgcc32です。
それ昨日私が教えてもらった奴に似てるけど・・ じゃんけんゲームでボードが必要なのか・・
828 :
819 :2006/01/26(木) 21:22:26
>>827 そうなんですよね。暇なので自分もチャレンジしようと思ったんですよ。
ボードがあった方が分かりやすいので作りたいのですが・・・。
>>828 そうなんですか、私は知識不足だったためゲームは一時断念してもっと簡単なプログラム演習さがしてやってます・・。
int i; char a[10]; for(i=0;i<5;i++){ scanf("%c",&a[i]); printf("a[%d]=%c\n",i,a[i]); } さっきの文字verになるんですがこれで「a」2回目に「b」として入力すると a[0]=a a[1]= a[2]=b a[3]= と出力されるんですがscanfの%cを%sにすると a[0]=a a[1]=b とちゃんと一文字づつ格納されるのですが何が違うのでしょうか?
833 :
819 :2006/01/26(木) 21:35:25
>>832 いいえ
%cは文字、%sは文字列だと思うけど・・それ以上それ以下だす
>>830 %cは空白文字も読み込む。
空白文字には改行文字も含まれる。
たとえば%1sとすれば1文字だけ読み込み、なおかつ空白文字は読み込まれない。
" %c" でいいのでは?
>>836 ,836
確かに" %c"にすると大丈夫なんですが、意味が理解できない;
a[0]でaの入力の時にエンターを押したのが空白文字としてa[1]に出力されたということでいいのかな
そして" %c"は空白文字をscanfで読み込まないようにする設定ということで
>>837 リファレンス読んでも理解できなかったと?
初心者なので教えて下さい 何でここ最近、基本的な質問が多いのですか?(特にscanfとか) もう冬休みは終わったはずですよね?
>>839 scanfは基本的なようでかなり奥が深い。
それでいて使いこなせるようになるべきかというとそうでもなかったりする正直結構厄介な存在。
>>839 とりあえず、「何に使うのこの関数」的存在。
fgets(buff, sizeof(buff), stdin); n = atoi(buff); これでなんか問題ある?
多少の入力チェックは欲しいものだ
>>844 数値でない文字列が入力されたときと0が入力されたときの判断が付かない
入力がない場合、不定のbuffをatoiしている。(fgetsの戻り値を見ていない)
1234.567と入力されたときにnに1234と入力されるのは仕様として良いのか?
buffのサイズと型、nの型は妥当か?(これは言いがかりか)
どう見ても問題だらけのコードです。ありがとうございました。
>>810 > printf("\t\n");
> とやるとタブではなく空白に展開
するのは, termios(4) で printf とは何の関係もない.
% stty raw
とか, やっても space になるか?
% ./a.out | od
とか, やってみそ.
849 :
デフォルトの名無しさん :2006/01/27(金) 02:11:08
整数 P, X (1 < X < P で, P, X は互いに素) を与えて, X × Y を P で割った余りが 1 になる もっとも小さな正整数 Y を求めるプログラムを書いてください。 たとえば, P=55, X=31 なら 31×16 を 55 で割った余りは 1 ですから,Y=16 となりま す。 (1) Y を求める方法をユークリッドの互除法をもちいてプログラミングせよ 大学1年生です。わからないので教えて下さい。よろしくお願いします。
850 :
デフォルトの名無しさん :2006/01/27(金) 02:17:09
質問なんですが LSI C-86 ver 3.30 試食版 ていうコンパイラをとったんですが 説明通りにしても「`lcc`は、内部コマンドまたは外部(ry」と表示されて いっこうにコンパイルしてくれません。 同じ事をこれで三回くりかえしているんですが出来ません。 もちろん再起動もしました。でもやっぱりこの表示がでるので困っています 以前このような状況になった人はいませんか?いるのならご教授願いますm(__)m
あとsage忘れすいません
852 :
デフォルトの名無しさん :2006/01/27(金) 02:21:14
>>849 宿題くらい自分でやれよ。
#include <stdio.h>
#include <mathex.h>
void main(void)
{
int P = 55;
int X = 31;
int Y = 16;
int ret;
ret = euclid(P, 1, &X, &Y);
printf("Y=%d\n", Y);
}
853 :
デフォルトの名無しさん :2006/01/27(金) 02:24:13
>>850 「ご教授」じゃなくて「ご教示」だろ。C言語以前に日本語
の勉強をしてから出直してくるように。
>850 フリー版のVisual C++使った方がラクやでぇ
>>849 euclid関数の存在を知らないとは何者?専門学生?大学生?
(´・ω・`)知らんがな
857 :
デフォルトの名無しさん :2006/01/27(金) 03:21:58
>>849 サン
ここはC言語の質問をするスレです。まず確認しておきたいことは、あなたが
ユークリッドの互除法について知っているか否かです。これはC言語とは関係
ないものなので、ここでお答えするものではありません。
質問の仕方としてはユークリッドの互除法のアルゴリズムをあなた自身が提示
し、それをCではどう実装するのかということになると思いますよ。
858 :
デフォルトの名無しさん :2006/01/27(金) 03:45:10
849のような大学の宿題でって言う人は情報学部? 理系の学部でもプログラミングはやらないって棒板で言ってるけど
別に講義自身はどこの学部でも受けれるしなぁ… 卒業単位に関係ないだけで まぁそんなヤツはこんなところに丸投げはしながな
860 :
デフォルトの名無しさん :2006/01/27(金) 07:30:41
>理系の学部でもプログラミングはやらないって棒板で言ってるけど 化学科や数学科のことでも言っているのかな? それぞれ専攻ごとに実践的な基礎体験はするべきでしょう 電算機が専門のくせにアセンブラや同期式回路がわかんねえ奴を排出したきゃ別だけど
>>850 LSICは捨てるべき。
ましてあんたのレベルならプログラミング以前から始める方がよさそうだが。
>>860 W大の化学科はFortran必修だよ。
>>852 >宿題くらい自分でやれよ。
とか言いながら得意げに答えるなよ。
>>1 すら読まない莫迦が冗長するだろうが。
たぶん
>>849 の問題でeuclid関数使っちゃ駄目だろ
867 :
デフォルトの名無しさん :2006/01/27(金) 13:26:18
6、4、3、8、1という数字を昇順に並びかえよ。と言う問題が分かりません。 SWAPという並び替えの関数とバブルソートの関数をつかってプログラミングをつくる のが条件です。あとwhile文は使わずにfor文だけをつかいたいです。 どなたかこの問題を解いて下さいませんか?宜しくお願いします。
宿題スレ池
例えば FILE *in = fopen("hogehoge.dat","rb"); でバイナリ読み込みモードで開くとします (環境はリトルエンディアンです) このdatファイルには 64 10 00 33 23 10 と6バイトで構成されているとします。 例えばfscanf関数で現在位置から3バイトだけを読み込みたいとする場合、 フォーマットはどの様に指定すればいいでしょうか? Win32APIの場合はReadFile関数に読み込むバイト数が指定できるので便利なのですが、、、
fread使えばいい話じゃ?
871 :
デフォルトの名無しさん :2006/01/27(金) 14:39:57
アッカーマン関数を再帰的に求めるプログラミングを教えてください。
あー、このような関数が提供されていたのですね ありがとうございます、すみませんでした
>>871 int Ack(int x, int y)
{
if (!x) return y+1;
if (!y) return Ack(x-1, 1);
return Ack(x-1, Ack(x, y-1));
}
こんなんだっけ?うろ覚えだけど
初歩的な質問で大変申し訳ないのですが、 Cygwinで実行したプログラムの出力結果をファイルに保存するにはどうしたらいいでしょうか?
fopen関数でwモードで任意のファイルを作成したら、Cygwin内の任意のパスにそのファイル保存されてるんじゃない?
配列の列番号(?)をint(若しくはunsigned int)の変数に代入するにはどのような方法がありますか? 例えば、 int nullpo[6][7][8]; で int j; に nullpo[4][3][1] ↑この3をjに代入する。といった形です。
j=3;
2次元配列以上の仕組みを理解してないと見える int hoge[4][3][2]と宣言された変数において hoge[4][0] hoge[4][1] hoge[4][2] はint型の要素を二つもつ配列への先頭アドレス hoge[0] hoge[1] hoge[2] hoge[3] はint型のポインタの要素が3個の配列への先頭アドレス 多分
あるディレクトリに既に存在するファイルの名前を取得するにはどうすればいいですか?
>>878 そういう意味じゃないです;
>>879 理解するのがちょっと難しいので質問変えますね。
int hoge[10][10];
を宣言して、
int hoge[x][y]
の時のxを求めるにはどうすれば良いのでしょうか?
その時のXの数字は既知だと思うけど
>>880 APIでしかそういうのは扱えないかと。
>>883 標準のCじゃダメですか
どうもありがとうございました
>>882 そのレス見たら自己解決しました。
本当にありがとうございました。
Windowsのフォルダって所謂ファイルを記録するためのファイルだよね パーミッションの都合で俺の知識だけじゃアクセスできないけど
突然失礼します。大学でプログラムを学んでいます。 そこで課題が与えられたのですが、非常に難しく(私にとって)困惑しております。そこで、皆様にご指導を仰ぎたいと思い、おじゃました次第です。 課題の内容は、
#include <stdio.h> #include <string.h> #define NameLength 6 #define NumberLength 13 #define PrefixLength 5 #define MaxLine 8 void get_prefix(char number[], char prefix[]) { int i; for (i = 0; i < PrefixLength; i++) prefix[i] = number[i]; } main(){ static char name[MaxLine][NameLength + 1], number[MaxLine][NumberLength + 1]; char prefix[PrefixLength]; FILE *fp; int k; if((fp = fopen("telbook","r")) == NULL){ /*ファイルが存在するか*/ printf("Cant open the telbook\n"); exit(1);} for(k = 0; k< MaxLine; k++){ fscanf(fp, "%s %s", &name[k], &number[k]);} fclose(fp); for (k = 0; k < MaxLine; k++){ get_prefix(number[k],prefix); if (strncmp(prefix, "(011)",PrefixLength) == 0) printf("No.%d %s (TEL: %s)\n", k, name[k], number[k]);}}
の、プログラムを改良して、 @名前を六文字以外にも対応できるようにする。 A市外局番を三桁以外でも対応できるようにする。 です。 データ元のファイルの内容は、 kimura (055)321-5600 ishida (011)777-6511 tanaka (025)111-3456 fujita (011)661-1234 sasaki (099)123-8888 yasuda (055)333-3456 fukuda (011)661-1111 suzuki (033)456-5555 大変申し訳ないのですが、お教え頂ければ幸いです。 よろしくお願いいたします。
宿題は宿題スレへ。
ああ、3レスにわたってしまった。 ゴメス
>>887 @名前を六文字以外にも対応できるようにする。
#define NameLength 6
の6を増やす。10とか
A市外局番を三桁以外でも対応できるようにする。
#define PrefixLength 5
の5を増やす。10とか。
void get_prefix(char number[], char prefix[])
{
int i;
for (i = 0; i < PrefixLength; i++) {
prefix[i] = number[i];
if ( prefix[i] == ')') break;
}
prefix[i+1] = '\0';
}
途中の1行を
if (strcmp(prefix, "(011)") == 0)
もしくは
if (strcmp(prefix, "(0111)等3桁以外の番号") == 0)
B次から宿題スレに書き込むようにする。
defineの数を増やすだけかと思ったらやっぱりまだいじるところあるのか 他人の見るだけでも勉強になるなぁ
>>893 増やすだけ、と思ったけど
3桁以外も対応しなきゃならんのでいろいろ弊害がでるっぽいね。
電話帳の全部の桁が一緒ならstrncmpでもいいんだろうけど、、、。
895 :
デフォルトの名無しさん :2006/01/27(金) 19:38:21
freeしたポインタに対してreallocをした場合の動作は定義されてないのでしょうか。 マニュアルにはfreeしたポインタに対して再びfreeをした場合の動作は定義されてないと書いてありますが、 reallocについては書いてないので…。
えーっと、「やっちゃダメ」です。あ、NULLだったら大丈夫です。
>>895 http://www.linux.or.jp/JM/html/LDP_man-pages/man3/realloc.3.html > ptr が NULL の場合には malloc(size) と等価である。
> size が 0 の場合には free(ptr) と等価である。
> NULL 以外の場合、 ptr は以前に呼び出された malloc(), calloc(), realloc() の
> いずれかが返した値でなければならない。
つまり、freeされたポインタをreallocで使用するのは未定義動作
p = realloc(NULL, 0); // 合法:malloc(0)と同じ
p = realloc(NULL, size); // 合法:malloc(size)と同じ
p = realloc(ptr, 0); // 未定義動作:free(ptr)と同じ
p = realloc(ptr, size); // 未定義動作
for文以降どうしてもC言語が分からなくなった。 getcharとかputcharとかも怪しい。
分からない、分からない、と言ってる奴は、 実際にコードを書いてどういう挙動なのかを 研究してみる気すらないんだよな。 問題解決能力なさ杉。
900 :
デフォルトの名無しさん :2006/01/27(金) 20:41:03
C言語で組んだソフトを実行したら、バグってた。 でもそのバグから宇宙が生まれた。
901 :
デフォルトの名無しさん :2006/01/27(金) 20:51:21
お前は両親がミスって生まれたんだよ。
お前は両親がバグって生まれたんだよ。
905 :
デフォルトの名無しさん :2006/01/27(金) 21:04:30
p = realloc(ptr, 0); // 未定義動作:free(ptr)と同じ p = realloc(ptr, 0); // 未定義動作:free(ptr)と同じ p = realloc(ptr, 0); // 未定義動作:free(ptr)と同じ
なんつーかMSDNライブラリ様々だな 選択してF1でヘルプ即表示って便利杉
それすら使わずに質問する奴がいるんだから・・・
908 :
895 :2006/01/27(金) 21:53:10
909 :
デフォルトの名無しさん :2006/01/27(金) 23:30:46
C言語についてなのですがご存知の方がおられたらご返答お願いします。 C言語で、 main関数内で、int da[10][10]を定義します。 kansuという関数をつくり、その中でda[10][10]を読み込みたいのですが、 int main(void){ int da[2][2]={{1,2,3}, {1,2,3}, {1,2,3}}; kansu(da); return(0); } int kansu(int da[][]){ printf("%d",da[2][2]); return(0); } とすると、print文の所でエラーが起きてしまいます。理由がわかる方おられたら知恵を貸してください。お願いします。
その前に初期化ぐちゃぐちゃ 引数を配列にする場合要素数かかなくても許されるのは1次元だけ
>>909 > print文の所でエラーが起きてしまいます。
嘘 付 く な ! ボ ケ !
>>909 > main関数内で、int da[10][10]を定義します。
定義してないし。
>>909 色いろ間違っているが、肝だけ。
int kansu(int da[][]) は無理。
やるならint kansu(int da[][10]) 。
2次元配列てポインタのポインタで渡したらダメだっけ?
916 :
デフォルトの名無しさん :2006/01/27(金) 23:46:00
int kansu(int *da)
>>917 うんダメだった
つ〜か今実験して初めて知った
2次元配列ってポインタだとこうゆう扱いになってたのか・・・って考えてみりゃあたりまえか
>>915 (*arryr)[] と **arryr は別物
920 :
デフォルトの名無しさん :2006/01/27(金) 23:50:33
909の訂正です。すいません。 実際のプログラムは int main(void){ int data[9][9]={{1,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9}}; kakunin(data); return(0); } int kakunin(int data[][]){ int i,j; for(i=0;i<9;i++){ for(j=0;j<9;j++){ printf("%d",data[i][j]); } return(0); } return(0); } といったようなプログラムでprint文でエラーが起きてしまいます・・・。
レス全部無視かよw
922 :
デフォルトの名無しさん :2006/01/27(金) 23:52:13
int main(void){ int da[3][3]={ {1,2,3}, {1,2,3}, {1,2,3} }; kansu(da); return(0); } int kansu(int *da){ printf("%d",da[2][2]); return(0); }
てゆーか2次元配列1次元配列として扱えるやん・・・さすがにこれは危険かw
925 :
デフォルトの名無しさん :2006/01/27(金) 23:54:39
>>920 int main(void){
int data[9][9]={
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9}
};
kakunin(data);
return(0);
}
int kakunin(int *data){
int i,j;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
printf("%d",data[i][j]);
}
> return(0);
> }
> return(0);
> }
> といったようなプログラムでprint文でエラーが起きてしまいます・・・。
>>923 理解してやる分には問題無。
間違って覚えてやるのは大問題。
>>915 受け側は916の通り。
呼び出し側はkansu(&da[0][0]);とでも。
実引数がda[3][3]で仮引数の方をpとすると、
p[0]==da[0][0]、p[1]==da[0][1]、p[2]==da[0][2]、p[3]==da[1][0]、…
2次元目の数は、1次元目の±1がintで3個分ずれるというだけの話。
kansu(int p*, int len)とでもすれば、[x][y]はp[x*len+y]でアクセスできる。
>>925 ポインタずらしながら出力でもすればぁ?
>>926 あ、いいの?
連続したアドレスに入るのはもしかしたらたまたまなのかもとか思った
てかポインタで渡したらda[i][j]みたいな使い方できないのは気のせい?
>>920 そもそも、引数で配列を『直接』渡すことは出来ない。
>>927 int p* ってなんや、オレ。
int* pな。
>>927 どうもなるほど
今まで2次元以上は引数配列のままでだったから知りませんでした
これもゆとり教育の・・・
>>928 > てかポインタで渡したらda[i][j]みたいな使い方できないのは気のせい?
気のせいじゃない。
>>932 そっかよかった
ヤベ・・ポインタ勉強しようかな
このまま企業の勉強会突入するの不安になってきた
>>933 ポインタなんて難しいものじゃない。
単にプログラム上で使用するオブジェクトを指し示す値だ。
問題は、
何 を 指 し て い る か ?
だ。
938 :
デフォルトの名無しさん :2006/01/28(土) 00:07:20
agsqdl;rasfd
>>936 確かに・・・
>>937 関数宣言の時に2次元以上の配列引数にしたいとき
fanc(float mat[][MAX]);
とかの方法でしかやったことなかったってだけです
fanc(float *mat);
とかはなかったな〜と
>>939 > fanc(float mat[][MAX]);
は
fanc(float (*mat)[MAX]);
のシンタックスシュガー。
配列へのポインタが正しい。
941 :
デフォルトの名無しさん :2006/01/28(土) 00:13:35
942 :
デフォルトの名無しさん :2006/01/28(土) 00:14:37
返事遅くなりました。 windowsをダウンしてlinuxでコンパイルしていました。 どうもみなさんありがとうございました。 結局、kakunin(int data[][2]) としたらコンパイルできました。 実際は、9×9のナンプレ(数独)をとくプログラムの一部分でして、 今のヒントを参考にしてまたプログラムを練り直します。 ありがとうございました。
>>942 > kakunin(int data[][2])
kakunin(int data[][9])
だろ?
945 :
デフォルトの名無しさん :2006/01/28(土) 00:18:18
>>943 そうです。汗 打ち間違えました↓
>>946 hoge[n]
が
*(hoge+n)
のシンタックスシュガーだって事も知らないクチかい?
n[hoge]
>>946 つまり、分かりやすさを上げるといった目的で
本来の書き方とは違った書き方をする構文のこと
1["0123456789"] "0123456789"[1] *("0123456789"+1)
951 :
デフォルトの名無しさん :2006/01/28(土) 00:28:44
まぁ、そこで自分で調べるか、そんなん聞いたことネーで済ますかが差なんだろう
こうぶんとう。
953 :
デフォルトの名無しさん :2006/01/28(土) 00:34:45
あまーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーい
>>947 それなら
>>940 の
fanc(float (*mat)[MAX]);
は
fanc(float *((*mat)+MAX));
とも書けるっていうこと?
957 :
デフォルトの名無しさん :2006/01/28(土) 00:47:28
959 :
デフォルトの名無しさん :2006/01/28(土) 00:52:16
euclidなんて関数ねーよ
なんでhogeってよく使うの?
>>955 :デフォルトの名無しさん :2006/01/28(土) 00:46:10
> fanc(float (*mat)[MAX]);
の引数の宣言の「float (*mat)[MAX]」は、
「float (*)[MAX]」型の「mat」と名称の仮引数の宣言となる。
型名には演算子は入らない。
965 :
デフォルトの名無しさん :2006/01/28(土) 01:39:50
これからプログラミングの練習をしようと思うのですが、どのソフトがよいのかよくわかりません。 学校でC言語の基礎程度は教わりました。 今「Microsoft Visual C++ .NET Standard Version 2003」か「Borland C++Builder 6 Personal」にしようと思っているのですが大丈夫そうでしょうか。 教えてください。
わざわざ買うの?
何を作りたいかによる。 作りたい分野の資料を読んで、VCかBCBどちらでかかれているかで決める。
968 :
sage :2006/01/28(土) 01:42:41
そのつもりです。
正直Cだけの知識でこれら買うのもったいなくね?
とりあえずタダで使えるVC2005Expressでいいんじゃね? 不足を感じたら、有料版を買うなりBCBに乗り換えるなりすればいいかと。
アドバイスありがとうございます。 もう一度ちゃんと資料を調べなおして考えてみることにします。 sageミスってすいません。
972 :
デフォルトの名無しさん :2006/01/28(土) 02:10:06
gccかbccでいーじゃん
でも学生なら今のうちにMS製品のライセンスを持っておくのも良いかも。
974 :
デフォルトの名無しさん :2006/01/28(土) 02:22:12
>>965 日立の陶業開発環境HEWを薦める。VC++6.0クリソツだし。
976 :
デフォルトの名無しさん :2006/01/28(土) 05:15:37
本を読んだだけでは上達しないとききます。 上達するには実際にプログラミングしたほうがいいと思うのですが、どういったことをやればいいんですか? どういったことができるかも分からないから printf("hello!\n");とか計算とかぐらいしか思い浮かばない。 結果、同じことの繰り返しで上達しない。 レベル別にプログラミングの演習ができるようなサイトとかないですか?
なんで、プログラミングなんかやろうと思ったのか不思議でならない。
978 :
デフォルトの名無しさん :
2006/01/28(土) 06:58:27 >>976 じゃあ、なんか作れ。
手始めに指定したフォルダの中のファイル一覧を
リストウィンドウで表示して、保存ボタンで一覧をファイルに保存できるツールを作るんだ。