1 :
デフォルトの名無しさん :
03/04/28 20:13
}
return EXIT_SUCCESS; }
なお、このスレはぬるぽ進行です。 メール欄に「ぬるぽ」と入れてください。
5 :
デフォルトの名無しさん :03/04/28 20:36
了解しました。
>>11 訂正サンクスです。
このスレのリンク貼ってどうする>>俺
しかも2重カキコになってるし。
すまそ。吊ってきます。>>all
>>13 C のお勉強するなら cygwin インストールして gdb なんかがお手軽だと思うけど。
ステップ実行とかも visual にできるから、試す価値アリだと思うですよ。
15 :
デフォルトの名無しさん :03/04/29 17:07
ポインタ変数「p」 に、char型2次元(5*10)の形を定義して、 p に後からアドレスを代入して p[3][5]=3 という様なアクセスをしたいのですが、 最初のpの定義の仕方がわかりません教えてください。
char (*p)[10];
なんでこのスレッドには2次元配列を動的確保したがる 奴が多いんだろう…。
そういう課題があちこちで出されたんだろうよ
ウワァァン おいらの学校では動的確保すら教えてもらえなかったよぉ。
ゲームでマップ作れと言われたとか・・・
/:::::::::::::::::::::/ \::::::::::::::::::::::::: /::::::::::::::::::::/ \::::::::::::::::::::::: /:::::::::::::::::::/ \:::::::::::::::::::: /::::::::::::::::::/ ,,,,-―''`\:::::::::::::::::: |:::::::::::::::::/,,,,,, '' _ ヽ::::::::::::::::: . |::::::::::::::::/ ヽ ∠'-' ` \::::::::::::: |:::::::::::::::/ ,-、-、 l ヽ |::::::::::::::: . |::::::::::::::| `´ | |:::::::::::::::: ヽ,-―_| | __,- ) |:::::::::::_/ // ̄ヽ /⌒ リ \ |:::::::/ ̄\ / /:::糸工::\ _ _ ) /::::::/ / >'つ:::::::イ::::::::ヽ ヽ/,ー―-ヽ /::::/ / ( < \:::モ::/~~\(::::::::::_/ / ̄ / ) ̄ ̄ヽ:::/:::::::::::::::\⌒ / / \ ̄ ̄\ ググラないとしちゃうぞ♥
スカラー波が
>14 ども。どうせたいしたコードは書けないので、gcc で頑張ってみます。 gdb も勉強します(使ってみたけどよく分からんかったです・・・)。
25 :
デフォルトの名無しさん :03/04/30 02:23
const定数が配列の要素数指定に使えないのは、const定数は外部参照でき、コンパイル時には値が分からないことがあるからですか?
>>25 配列の要素は、定数じゃないと駄目。
constは読み出し専用って修飾子だから定数では無い。
27 :
デフォルトの名無しさん :03/04/30 02:36
>>26 constつけても変数は変数という理解でいいですか?
二次元配列の動的確保。 二次元配列のメモリの並びはリニアになってる。 つまり、arg[3][5];なんて arg[15];と同じ。 具体的には arg[0][0]→arg[0][4]→arg[1][0]→arg[1][4]→arg[2][0]→arg[2][4] と並んでいる。 二次元配列の動的確保なんて馬鹿な事言ってるなよ。 因みに、ポインタの配列で、そのポインタでまた動的確保だと二次元配列とは全く別物。 メモリがリニアに並んで確保されないから。
29 :
デフォルトの名無しさん :03/04/30 02:48
>>29 どちらも読みましたけど・・・
C99は別として、配列の要素数指定は定数式でなければならないのは知っています。
ただ、constつけたものを定数として扱えるかどうかということです。
定数と呼ぶことはできても、扱うことはできないんですね。
constつけたものを変数と呼んだら叩かれたけど。
>>31 規格の問題。
定数なら、配列の添え字に出切るよ。
しかし、const付けたって定数とは限らない。
だからconstつけたら配列の添え字にする事が許されないだけ。
いちいちコンパイラが判別してくれる分けがない。
100%定数とは為らないなら、許さないって事だ。
>>33 > 100%定数とは為らないなら、許さないって事だ。
やっぱりそうなんですね。
その例として
>>25 を出したんですけど、もっと一般的な例がありますね。
constつけた引数が・・・
とにかくありがとうございました。
>>25 は値が分からないだけで定まっていないわけじゃないか・・・
>>35 全然分ってなさげ。
値が分っていて、定まっていても出来ないの。
const int num = 10;
int arg[num];
これは不可。
つまり、値が分っていてもconst付けたら配列の添え字にはならないの。
規格の問題って書いてあるだろ。
>>36 定まっているとは限らないから規格でNGにしたんでしょ?
定まっているとは限らない = 定まっていることもある じゃないの?
>>37 > 定まっているとは限らない = 定まっていることもある じゃないの?
そうだが、だからどうした?
規格でNGにするにはそれなりの理由があるはずで、それが「定まっているとは限らない」ってことでしょ? なんで「定まっていても・・・」なんて話をするわけ?
言いたいことが伝わっていなかったのかも・・・まあいいか。
const は定数というよりリードオンリーの意味 たとえばプログラム実行時にその変数は ROM 上にマップされてるとか
C++なら定数として添え字に使えるけどね
int const volatile port;
定数じゃないconstの例かな。 実際に使うときはアドレス指定しなきゃいけないからポインタ変数になるだろうけど。
>>45 memory mapped I/Oの例だろうな。
>>46 リンカが解決するという方法もある。
>36 あれ?C99では、できるんでないの?
配列サイズとかcaseラベルは迷わずenumにするけどな
50 :
デフォルトの名無しさん :03/04/30 14:43
この間、書店でCでPCI32bitをなんかするみたいなものありましたが、 RC232cの標準出力をCで作るとか一番最初のページで挫折しました。 見たこともないプリプロセッサや回路図を作ってそれに合わせて 出力する等々みたいなことなんですがわかりますか?
>>50 わかりません。(涙
ただ、UNIXのほとんどはCで書かれているらしい。
だから、それくらいの許容量は持ち合わせているっぽい。
>>50 ワケの分かってない奴の説明で何か分かる奴は非常に珍しい。
>>50 標準Cの話題ではないからな。
制御系のスレかで聞いたほうがスレ違いにはならないかと。
(PCIのスレあったっけ?)
確かに何を言いたいのかわからん System-C とかのことなら多分スレ違い
55 :
デフォルトの名無しさん :03/04/30 15:56
long型の変数xに x=1<<31 とすると、xに0x80000000 が入るのですが、 x=~(1<<31)とすると、 0xffffffff が入ってしまいます。 本当だったら0x7fffffff が入ると思うのですが、理由が解りません。 コンパイラ固有の問題なのでしょうか? よろしくお願いします。
いやなんでもない。
>>55 そのまま試してみたらそうはならなかった
他に間違いがあるのでは?
61 :
デフォルトの名無しさん :03/04/30 16:41
>>59 55はintが16ビットの環境じゃないの?
62 :
デフォルトの名無しさん :03/04/30 16:49
CでのAPIの使用ってどうやんの?
use_api( API_NAME );
>>62 WinのAPIならこうだ。
#include <windows.h>
int main() { MessageBox(NULL, "へろー。", "へろー。", MB_OK); }
#include <windows.h> int main() { MessageBox("全てのファイルを削除していいですか?","確認",MB_OK); }
面白いッスね
どこがだよ・・・しょうもない
空ループは最適化によって削除されるべきですよね? たとえそれが初心者の使うウェイトだとしても。
do{}while(0); これならな
しなくていいと思うけど
削除されるべきは一度も実行されないループ
コンパイラに初心者かどうかは判断できないしねぇ。
Linuxではスライスの事をパーティションというのですか?
Linuxではスライスの事をパーティションというのですか? だったら、パーティションの事はなんといったらいいのですか?
77 :
デフォルトの名無しさん :03/04/30 19:03
#include <windows.h>このヘッダーファイルはVC++についてるの?
>>75 BSDではパーティションのことをスライスといいます。
rand()%10ってやったら0から10の乱数がでるけど 10から20とかの乱数ってどうやって書いたらよいですか?
>>83 まず、自分が何を書いたのか見直せ。
話はそれからだ。
85 :
デフォルトの名無しさん :03/04/30 23:31
なんでウィンドウ出すだけであんなに書かないといけないんだ! window()こんなんでウィンドウ出すような関数ないんか!
rand()%11 で得られた結果に10を加える
この前VC使ってプログラム書いたけど、ウインドウを出すための処理なんて書いた覚えないなぁ。 文句を言いたくなるほど書けるんだ?
>>90 そのプログラムは、このスレに従って「C言語」で書きましたか?
しらね、少なくとも私が書いたのはCのコードだけだから。
>>90 MFCでも使ったんちゃう?
SDKベースで作るとガリガリ書く必要あるけど
RegisterClassがうざったいよね。 その後もCreateWindow、WM_CREATE 3段も初期化が必要。
95 :
デフォルトの名無しさん :03/05/01 05:15
qsort(string_array,10,50,strcmp); をgccでコンパイルすると次のエラーが出るんだけどなんで? ex.c:18: warning: passing arg 4 of `qsort' from incompatible pointer type
エラーと違うじゃん
あーごめん警告ね で、なんで?
連休2日目からC言語独習始めた・・・ 参考書の1/4も進んでない・・ とりあえず無償コンパイラの使い方だけで時間を 使い果たし・・配列をシコシコ書いてます。。 もうダメポ・・・・ こんなもんでつか??
>>97 void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
qsortに渡す関数(のポインタ)は引数の型が二つともconst void *だから。
int compare(int *v1,int *v2){...}などという形だと警告が出る。
int compare(const void *v1,const void *v2){...}という感じで作ればその警告は出ない。
ただし、void *だとそのままでは参照できないので、比較する際には適切な型へのポインタにキャストするなどして参照できるようにする。
>>98 >無償のコンパイラの使い方だけで時間を・・・
僕もプログラムの勉強<プログラムまでの勉強でした。パソコン購入==プログラムの
勉強だったので、ファイル、フォルダもわからず。そこまでではないと思いますが。
がんばってください。
・・・と知ったかぶって見たけど、間違っているかも。
警告を無視するのは確かにお勧めできないが、「間違ってた」とは言い切れない。
castすりゃいいじゃん
見苦しい
警告残す方が見苦しい・・
109 :
デフォルトの名無しさん :03/05/01 17:43
おい。お前等。 Hello World表示させてるくらいでプログラミングは面白くてしかたなかった? ここで面白さを感じられないやつは素質無し? それともある程度山を越えてから病み付きになった? 教えてくれないの豚。
>>109 画面に文字表示させたところで一体何がおもしろいんだと。
・・・あ、楽しかったかも。
まぁ、ここはぐっと我慢してifとかwhileとかまで進んでみ?
>110 いやさ。Hello Worldレベルは比喩なわけで。 一応入門書で関数のところまでいったんだけどおもしろみを感じない。 映画みたりネトゲしたほうがおもしろいとおもってさ・・・
>>109 エクセルのマクロでもエディタのマクロでも、
繰り返しや条件分岐を書き始めるとそこはもう、
プログラミングの世界だよ。
何もHelloWorldだけが入り口じゃない。
だから、スレ違いだしとっとと帰れ。
#error Hello world
そういえば、経験上すげー楽しいことってある程度 山を越えてから楽しくなるや。俺の場合。がんばって続けてみまるくす。
>>117 Delphiならすぐに楽しくなるよ。
VBでもいいけど
VBでもいいならExcelVBAで充分じゃん。
俺は関数の再帰とリスト構造を知るまでは楽しくなかったな。
俺、INT86()でDOSのAPI叩いてたときが一番楽しかったなぁ・・・。
int func(int a[3]){ int i,j=0; for(i=0;i<=2;i++)j=j+a[i]; return j;} void main(){ int t[3]={1,2,3}; int q; q=func(t[3]); printf("%d",q);} これをコンパイルしたら下のようなエラーが出てきました 配列を関数に渡すにはどうすればいいのでしょうか? パラメータ 'a' は int ( *)[3] 型として定義されているので int は渡せない(関数 main )
q=func(t);
オレは紙テープに穴を空けてた頃が・・・ ・・・・Fortranスレじゃないのか
>123 上手くいきました、有難うございます!
漏れはキーボードで文字を打ってるのが既に楽しいよ
>>122 多分123の意味分ってないんだろうな。
配列は式の中ではポインタに置き換わる。
int func(int a[3])なんて普通はやらない
int func(int *a)とやる。
それと、プログラマのコード以外でコンパイラは配列長なんて分らない物だから
(つまり、int func(int a[3])の3は意味をなさない、int a[]でもint *aでも同じ)
int func(int *a, int a_num)と先頭のポインタ(配列の先頭)と配列の要素数を渡す。
固定の配列長やループなんて危険すぎる。効率悪い。
将来、配列の長さを変えた時に関数の中も書き換えなきゃいけないだろ。
因みにq = func(t)はtを配列に宣言してるので配列の先頭ポインタを渡している事になる。
まだコンソールプログラムしか作ってないけど楽しい。 参考本の1/3程度進んだとこで復習してみると そのとおり書きたくない。これでいいじゃんって。 少しでも進歩したな・・と思うと楽しい。
やっぱデバッグだな。
いちばん嫌な時だ
reset all
ここらでひとつ、プログラム(&デバッグ)ネタでHellsingコピペきぼん。
プログラム関数にデバッグのアドレスを・・・
>127 詳しい解説有難うございます int func(int *a,int a_num){ int i,j=0; for(i=0;i<=a_num-1;i++)j=j+a[i]; return j;} とすればいいという事ですね
135 :
デフォルトの名無しさん :03/05/01 22:27
cでwindowsアプリ作ろうと思うのですけど、VC使って簡単にウインドウ作っちゃっても いいのかな?それとも全部コード覚えたほうがいいのかな? VCで作ってもwindowsアプリ作れるっていっても平気ですか?
>>134 i<=a_num-1
これ、変だとおもわんか?i<a_numでいいだろ。
ほとんどのWindowsアプリはVC製だろう。
>>135 > VC使って簡単にウインドウ作っちゃってもいいのかな?
→ YES.
> それとも全部コード覚えたほうがいいのかな?
→ 意味不明。何のコードだ ?
> VCで作ってもwindowsアプリ作れるっていっても平気ですか?
→ 一般的には YES。
暗黙に「私が」と言うのであれば、自分の腕と相談しろ。
>136 そ、そうですね
>>136 別に変じゃないだろ。
なんか間違ってるか ?
間違っていなくても変なものは変。 char str[]={'a','b','c','\0'}と書いても間違いではないが、変だ。
> → 意味不明。何のコードだ ? ってことは、WindowsSDKは全く知らんってことか?
>>146 143=145=俺だけど。
「それとも全部コード覚えたほうが」 の全部のコードってのは、
あの長ったらしい印象のあるソース(コード)のことだと思ってたんだが。
>>147 「あの長ったらしい印象のあるソース(コード)」ってのが何をさしてるのか、が不明なんだが。
>>147 空域読めてるか?
ちなみに俺は読めてないからな
>>135 のいっていることはよく分からんのだが。
多分、MFCアップウィザードで
スケルトン作っちゃってもいいのかな?ってことでしょ?
そしたらCの範疇からはずれるよね。
それともSDKで雛型コピペしてもいいか?って事をいってんのか?
どちらにしても135の日本語なんか変。
151 :
デフォルトの名無しさん :03/05/02 06:34
可変個の引数を取る関数では、サイズがint以下の整数引数はintに格上げされ、 サイズがdouble以下の浮動小数点数引数はdoubleに格上げされるんですよね? ということは、va_argの第二引数にはcharやshort、それにfloatを与えることはないということでOKですか?
読んでないけどOKにしとく。
わかった、QuickWin のことか!!
ok
>>148 WindowsSDKって言った時点で気づけよ。
156 :
デフォルトの名無しさん :03/05/02 15:51
だれかC言語の逆コンパイラ知りませんか?知ってたら教えてください。
逆アセンブラ使え。
>>156 実行形式をC言語に直すってこと?
だとしたらアナトマイザーとか?
でもぶっちゃけそんなの使うより逆アセンブラで見た方が楽
159 :
デフォルトの名無しさん :03/05/02 16:48
すみません。初心者なんですが、PGになろうと思ったらコード 丸暗記してなければいけないのでしょうか?例:現在の時間を得るソースとか
>>159 どっちかというと瞬時に閃く感じ。
結局、日本語で文章を書くのと要領は同じ。
161 :
デフォルトの名無しさん :03/05/02 16:54
>>160 ということは、ソースを完全に理解してないとダメだということですね?
>>161 当然、APIとかの知識は必要だけど、その辺はやってりゃ自然と覚えるし
色々作ってれば、
>>160 が言うように感覚的にこんな感じかな〜っていうのが思い浮かぶようになる
164 :
デフォルトの名無しさん :03/05/02 17:01
ありがとです。
>>164 興味持って書き込んでいけば自然とできるようになる。がんばれ。
日常でコードを話すようにしていれば、自然とできるようになる。 英語と同じだな。がんばれ。
練習で以下のような関数を作ってみますた。 ファイルをコピーする関数です。 int filecopy(const char * strfile, const char * dstfile){ FILE *strfp, *dstfp; if(NULL == (strfp = fopen(strfile, "r"))){ return -1; } if(NULL == (dstfp = fopen(dstfile, "w+"))){ return -1; } char c; while(!feof(strfp)){ c = fgetc(strfp); fputc(c, dstfp); } fclose(strfp); fclose(dstfp); return 0; } これでテキストファイルをコピーした際に、最後の行に化けたような文字が入ってしまいます 何が問題でしょうか?
168 :
デフォルトの名無しさん :03/05/02 18:21
>>167 while(!feof(strfp)){
c = fgetc(strfp);
fputc(c, dstfp);
}
一度だけcにEOFが入ってしまうから。
while((c=fgetc(strfp))!=EOF)
fputc(c,dstfp);
と書こう。
dstfileのみオープンに失敗した場合はstrfileがプログラム終了まで開かれたままになっちゃうよ。
feofは普通使わない。
あとねぇ、cはchar型じゃなくてint型にして。
K&R読めよってかんじだが int c; /* 普通はintで受け取る。EOFもらうためね */ while((c = fgetc(strfp)) != EOF){ /* Cの定石だから覚えとけ */ fputc(c, dstfp); }
free(NULL);は問題ないそうですが、 fclose(NULL);も問題ないのですか?
>>172 大丈夫とはどこにも書いていないし、俺の環境だとセグメンテーション違反が起きた。
だからきちんとチェックした方がいいよ。いや、すべき。
#define Fclose(fp) ((fp)?fclose(fp):0) 引数を二回評価するけど、まあいいでしょ。
#include <stdio.h> void co(int *a,int n,int i,int j,int *b){ int k,l; for(k=0;k<=n-1;k++){ for(l=0;l<=n-1;l++){ if(k<i&&l<j){b[k*(n-1)+l]=a[k*n+l];} else if(k<i&&l>=j){b[k*(n-1)+l]=a[k*n+l+1];} else if(k>=i&&l<j){b[k*(n-1)+l]=a[(k+1)*n+l];} else {b[k*(n-1)+l]=a[(k+1)*n+l+1];}}}} int det(int *a,int n){ int d=0;int b;int i;int m; printf("14 ");printf("n=%d ",n); if(n==1){d=a[0];printf("15 ");} else {for(i=0;i<=n-1;i++){ printf("i=%d ",i); co(a,n,1,i,&b); m=det(&b,n-1); d=d+((i%2)*(-2)+1)*m;}} printf("21 "); return d;} int main(){ int a[9]={1,0,0,0,2,0,0,0,3};int n=3;int d; printf("27 "); d=det(a,n);printf("28 "); printf("deta=%d",d); return 0;}
176 :
デフォルトの名無しさん :03/05/02 22:00
ageろよ
このプログラムが上手く動きません 何故動かないかも分かりません どこに問題があるのか教えて下さい 表示結果はこうなりました 27 14 n=3 i=0 14 n=2 i=0 14 n=1 15 21 i=1 14 n=1 15 21 21
age
>>177 まてぃ!
どう動いてほしいのかも書かないでそれはないでしょ。
>179 行列aの行列式を求めたいのです 3*3行列aを a[9]={1,0,0,0,2,0,0,0,3}; と定義しました
行列かぁ。 高校三年の時は数学を取らなかったから全然わからん。
det(int *a,int n)関数はn*n行列aの行列式を求める関数で void co(int *a,int n,int i,int j,int *b)関数は n*n行列aから,ij成分を覗いた(n-1)*(n-1)行列bを作る関数です
>>175 自分で書いたソースがあるならうぷキボンヌ
>183
「自分で書いたソース」の意味が分かりません・・・
>>175 の事ではないのですか?
まずdetのint bはおかしいだろ。
186 :
デフォルトの名無しさん :03/05/02 23:04
・ ・ int c; printf("[ ]に調べたい文字を入力してください [ "); c=getchar(); printf(" ]"); ・ ・ てな感じでつくって [ ]に調べたい文字を入力してください [ ] みたいな感じで[]のなかに1文字だけ入力できるようにしたいのですが、 最後の[ ]だけうまく表示できません。『]』 が改行されてしまいます。 どうにかうまくできる方法はありませんでしょうか?
>>186 標準 C の範疇では無理 (≡ 実行環境を書け)
OSは MAC OS ] です
>>175 detを
int b; -> int b[1000];
co(a,n,1,i,&b); -> co(a,n,1,i,b);
m=det(&b,n-1); -> m=det(&b,n-1);
にして幸せになろう。
27 14 n=3 i=0 14 n=2 i=0 14 n=1 15 21
i=1 14 n=1 15 21 21 i=1 14 n=2 i=0 14
n=1 15 21 i=1 14 n=1 15 21 21 i=2 14
n=2 i=0 14 n=1 15 21 i=1 14 n=1 15 21
21 21 28 deta=0
>>175 それから co 内のループだが、
a には 0 から n-1 までの二次元配列の中に値が入っていたわけだから、
b には 0 から n-2 までの中に代入しなければならないはずだよな。
>284って誰だよ?? スマソ。 あと、ちょっと日本語が変だよなぁ俺……
>>189 m=det(&b,n-1); -> m=det(&b,n-1);
じゃなくて
m=det(&b,n-1); -> m=det(b,n-1);
>>190 coまでは見てないが何か勘違いしてない?
>190 レス有難うございます co(a,n,1,i,&b); の部分はn*n行列aに対して(n-1)*(n-1)行列bを返すようにしているのですが ここで co(a,n,1,i,b); としてしまうと、bの値が変化しないので、 上手くいかないような気がします 最終的に deta=6 になって欲しいのですが・・・
>>186 確かに187が言うように実行環境依存になるかもしれんが、一応VCを使ってANSIC準拠で作るとするなら
printf("文字を入力:[ ]");
printf("\b\b");
c = getchar();
だな。
環境によっては\bで文字が消えるかもしれん、、
VCなら消えなかったが。
>194 できました!。ありがとうございました。
196 :
にゃんkp :03/05/03 00:54
そろそろマクロ関係の勉強もしようと思ってるんですけど どこ通いサイトなんか無いでしょうか?
>>196 基本的な使い方判ってるなら、C-FAQのプリプロセッサの項読めば十分。
マクロで覚えるべき事なんて多くないから。
>>190 n-2までにしなきゃいけないね。
void co(int *a,int n,int i,int j,int *b) {
int k,l;
for(k=0;k<=n-2;k++)
for(l=0;l<=n-2;l++)
b[k*(n-1)+l] = a[(k<i?k:k+1)*n+(l<j?l:l+1)];
}
>>193 bを配列にしたので問題無い。アドレスが渡されるから。
co(a,n,1,i,b);だと
行列の一番上のところの数字だけで行列式が決まってしまうんだが・・・。
>>193 3次の行列式を調べるとこうだと思う。
co(a,n,0,i,b);
m=det(b,n-1);
d=d+a[i]*((i%2)*(-2)+1)*m;}}
>>199 正解。すげぇ。
行列ひさびさに見た。線形代の教科書見てみたんだが、サパーリ (/・ω・;)
余因子展開ですか。。へぇ〜。。
行列か… わざわざ配列にしてループ回してる意味が分らん。 構造体にすれば直感的なループで済むのに? struct MATRIX { float A11, A12, A13, A14; float A21, A22, A23, A24; float A32, A32, A33, A34; float A41, A42, A43, A44; }; まあ、mallocかけて可変長の正方n次行列にしたいのか? どの道、ij成分の入力があるんだから構造体で扱いやすくした方が良いと思うが… …行列式なんて逆行列を求める時程度しか使ってないな… 3DPG野郎ですた。
FILE*の入出力系関数に、文字列ストリームを関連付ける方法ってないですか? ファイルに書き出す必要はなくて、 fgetcとかfprintfをバッファに対して使いたいんですが。 sscanfやsprintf使えという回答は不要です。
203 :
デフォルトの名無しさん :03/05/03 04:33
age
>>202 なんでsprintfとかじゃだめなの?
205 :
デフォルトの名無しさん :03/05/03 04:46
>>204 既存のファイルへの入出力をバッファへも行う必要が出てきたので。
一旦完成してるソースなので、あんまり変更したくないんです。
関連付け不能ならsprintfに切り替えるつもりですが。
>>202 無いと思う。 OSによっては有るかもしれないけど・・・
文字列がfopenで開けなければアウト。
つまりデバイスとして用意されている必要が有るかと。
逆に、テンポラリファイル作って、そこに文字列当てはめるのは
mmapで出来るだろうけど。
RAMディスクとか使えそうな環境なら、これに割り当てるって手段は?
>>202 イレギュラーな方法になるけど、
fprintfを無理矢理再宣言してオーバーライドしちゃうって手もあるけど
そこまでするならsprintf使った方がいいだろうね
208 :
デフォルトの名無しさん :03/05/03 05:00
>>206 ずっとMSDN眺めてましたが、該当する機能は無さそうですね。
setvbufはそういう用途と違うみたいですし。
FILEとバッファをラップするインタフェース作ってお茶濁すことにします。
ありがとうございました。
最終手段として、文字列を実体とするデバイスドライバを書くって 方法も有るんだけどね。 そこまですんなら、sprintf使った方が激しく早いが。
バッファに対しての出力を求めているコンテキストでは、 書き込むファイルをtmpfileでつくったものとする。 そこに通常と同じように書き込み、rewindしてからバッファにfreadしfclose。 ファイルへの出力の時はrewindの前にリターン。
>rewindの前にリターン ってなんだ?
>>210 rewindしてからバッファにfreadしfclose。の前に関数を抜けると。
void func(const char *s,FILE *fp,char *buf,size_t size)
こんな関数じゃないの?fpがNULLならばbufにsizeバイト書き込むとか。
リターンしちゃまずいのなら、「rewindしてからバッファにfreadしfclose。」の部分をバッファに書き込む時だけ行うようにする。return以外の方法でね。
>>202 FUNOPEN(3)
BUGS
The funopen() function may not be portable to systems other than BSD.
C言語で正規表現を使うにはどうすればいいんでしょうか
・ライブラリを使う。 ・(検索なら)grep、(置換なら)awkなどを呼んでしまう。 ・諦める。
>>216-217 なるほど。ソースつきのライブラリを探して
改造しようと思います。ありがとうございました。
219 :
デフォルトの名無しさん :03/05/03 14:26
while(1) { scanf("%d",&a); if(a==0){ break; } else{ printf("1を入力してください\n"); } } 数字の1以外だとelseの処理をしてまたscanfで数字を入力できるのですが、 文字を入力してしまうとprintfが無限ループしてしまいます。 文字を入力してもちゃんと動作するにはどうしたらよいでしょうか?
>198-199 有難うございます ちゃんとdeta=6に成りました
↓知らなかった
http://seclan.dll.jp/c99d/c99d05.htm#dt19990607 整数の除算に何か問題があるの?そう思う人も多いでしょう。しかし現在の C 言語では、整数の除算に関しては移植性がありませ
ん。どういう場合に移植性がないのかといえば、整数を割るときのどちらかのオペランドが負であった場合です。
現在の C 言語の規格では両方のオペランドが正の数の場合、商は小数点以下を捨てた数になることになっています。例えば、1/2の
場合、正しい値は、0.5 ですが、小数点以下を捨てるので商は 0、余りは 1になります。余りは、(a/b)*b + a%b == a を満たす値となりま
す。
しかし、どちらか一方の数が負の場合、その結果は実装依存になっています。例えば、-1/2 の正しい結果は、-0.5 ですが、環境によ
って商0余り-1になったり、商-1余り1になったりします。
今回の新しい C 言語では、割り算の結果はすべて 0 方向に切り捨てることになりました。例えば、-1/2 では結果が、-0.5 ですが、
0 方向に切り捨てるので、商は 0 になります。すると余りは、-1 ということになります。これがすべての環境で保証されることになりまし
た。
Windows98で動くお勧めのコンパイラは何ですか? フリーじゃなくても構いまません。
Delphi
ここはC言語のスレでつ
>222 インテルC/C++コムパイラ
C MACHINE
ご冗談を
無視ですか?
ファインマンさん?
新刊、「無視ですか?ファインマンさん」が誕生したわけだが。
>>219 scanf()の%d指定は、数字文字を変換する指定でしかない。
なので、数字以外の文字を入力しても変換すべき文字がないので
入力を処理することなく終了してしまう。
解決方法としては、
・%s指定にして数値への変換は自前で行う
・scanf()の戻り値をチェックする
・fgets()に読み込んでから上記に注意しつつsscanf()で変換する
などの方法がある。
まぁ、一番最後の方法が一番確実だね。
一番上が一番楽じゃない? %sで読み込んでatoiで数字変換
>>219 1を入力してください。
じゃなくて
0を入力してください。
だろ?
1だと、終了しねぇ〜よ!
できました。
1番上のでやりました。
ありがとうございます。
>>233 打ち間違いです
文字ってatoiで変換したら0になるんだな
それがなにか。
237 :
デフォルトの名無しさん :03/05/03 19:46
bsearchはいいぞbsearchは。
>>219 書式指定に空白を入れときなさい。
scanf(" %d", &a)
書式指定子の空白は空白文字(スペース、タブ、改行コード)を読み飛ばす。
入門本よりマニュアルをよく読むべきだよ。
じゃないと
>>231 >>232 みたいに頓珍漢なこと言い出すやつが出てくるからね。
頓 珍 漢 平 子 太
どちらが頓珍漢なんだ(^_^;)
長生きするもんだな、頓珍漢に「頓珍漢なこと」といわれるとは思わなかった。
>>238 > 入門本よりマニュアルをよく読むべきだよ。
219をよく読むべきだよ。
X = X ^ c->P[i]; この「->」の意味を教えていただきたい。
>>244 構造体のポインタのメンバを参照するときのお約束。
247 :
デフォルトの名無しさん :03/05/03 22:04
データベースの使い方を教えてください
249 :
デフォルトの名無しさん :03/05/03 22:13
250 :
デフォルトの名無しさん :03/05/03 22:36
C言語って何?
G(o^-^o)gle < 検索しようね
252 :
デフォルトの名無しさん :03/05/03 22:54
253 :
デフォルトの名無しさん :03/05/03 22:54
嘘ごめん マウスが壊れるほどにサイト駆け巡ってきます
”C言語ってなに厨”
Microsoft社が開発した言語。 名称からも分かるようにBasicを元にしたようだが、大きく異なる。
C言語って抽象化しすぎ
256匹か・・・・
259 :
デフォルトの名無しさん :03/05/04 00:14
初心者の質問ですいませんが、どなたか教えてください。 当方、C言語の独学中で、任意の数字の階乗を計算するプログラムを作ってます。 それで、main関数の他に、実際に階乗を計算するkaijou関数を作成しました。 main.c、kaijou.c、kaijou.hがあります。 それで、kaijou.cにprintf()やscanf()等を使ってるのですが、コンパイル時に 「関数 'printf' は定義されていません。int 型の値を返す外部関数と見なします。」 「関数 'scanf' は定義されていません。int 型の値を返す外部関数と見なします。」 と出てしまいます。 今まではprintf等をつかっててもこんなことは言われなかったのですが、なぜこのようなエラーが起きたのでしょうか? どなたか、わかる方教えていただけ無いでしょうか? よろしくお願いします。
260 :
デフォルトの名無しさん :03/05/04 00:15
>>259 stdio.hをインクルードしていないから。
>>260 速レスありがとうございます。
私のkaijou.cにはstdio.hをインクルードしてませんでした。
早速インクルードさせてコンパイルしたところエラーがでませんでした。
初歩的な質問に答えていただいて、本当にありがとうございました。
とある関数で、 char choice; choice = getchar(); という表記をしたところ、コンパイル時に choice = getchar();の時にintからcharに変換しました。データが失われてるかもしれません。 と警告が出ます。 で、実行するとその処理が飛ばされてしまい、ちゃんと動作しません。 なぜこのような事が起きるのでしょうか?
getchar() の戻り値は int だヴォケ
あはは
>262 >その処理がとばされてしまい int→charとは違う部分でも間違ってる、に2000$++
>>262 おそらく改行文字よりひとつ前まで読む処理が上にあって、その時読まれなかった改行文字がgetcharに拾われているんじゃないかな。
例えば、scanf("%d",&n);とやって数字列+改行文字を入力すると改行文字は読まれずに残っちゃうよ。
だからfgets()+sscanf()にしろとあれほど・・・
解の公式のプログラムで x^2+100.1x+1.234=0 のような場合でも出来るだけ桁落ちがなく正確に計算できるようにするには どうしたらいいんですか?
269 :
bloom :03/05/04 11:13
いや、そのようなことはありません。 ソース #include <stdio.h> int coice() { char choice; printf("Yesの場合はY、Noの場合はNを入力してください。\n"); choice = getchar(); if(choice=='Y') { (省略 } if(choice=='N') { (省略) } else {printf("YかNを入力してください。\n");} return 0; } 間違ってるんですか?
2番目のifを
二番目のifの中身はreturn 0;だけです。
exit関数を使おうかと思いましたがreturn 0;でも大丈夫かなと思ってそうしました。
else
どこが間違ってるのか教えてくれませんか?
なんで二番目のifはelse ifじゃないんだろう。
>>270 その関数だけ出してそのようなことはありませんなんて言われても信用できないんだけど。
>>262 >どこが間違ってるのか教えてくれませんか?
あんたの態度。
短いなら(省略)の部分も書いてみれば見れば?
281 :
デフォルトの名無しさん :03/05/04 13:35
最初のifはmain関数呼び出し、 { main(); } 次のifはreturn 0;です。 ただ、これだけだったらコンパイル時にエラーが出たのでヘッダファイルにmain関数の宣言を書きました。
ていうか、とばされるって言ってただけで具体的にどうなったかも聞いてないよ。 せめて、どうなってほしいのか、どうなってしまったかが分からないと答えようがない
>>281 ループさせたいんだったらループ用の終了フラグ作ってwhileとかそういうことやらんのかね。
はぁ? main関数呼び出しって……いったいどんなプログラムやねん! ついでに、そういうときはswitch文を使うのが定石かつ他人にソースを見せる時、理解を助ける。 main関数 -menu関数 --処理関数 で、menu関数で int flag=true; do{ getchar等 switch(){ case 'y': 処理する関数;break; case 'n': flag=false;break default : エラーじゃごら } }while(flag); みたいに書くなぁー
をいをい、書きかけだよ(;;) main関数からmenu関数を呼び出して、そのmenu関数から処理関数を呼び出す、ね。
>>281 …よく分らないんだけど、普通さcoice関数を宣言してmainで呼ぶんじゃないの?
coice関数の戻り値は何に使うの?まさか、mainの戻り値と同じ扱いじゃないよね?
288 :
鈴木健一郎 (NT4.0/2000/XP) :03/05/04 14:09
printf みたいな可変長の引数を持つ関数を作っているんですが、 「引数の数がいくつ渡されたか」っていう情報は明示的に 教えてあげなくちゃいけないんでしょうか? argc みたいな感じで va_list がどこかの構造体に格納されていないんですか?
>>288 そのために最低でもひとつは固定の引数が必要となる。
その固定引数が与えた引数の数を知るヒントになる。
全体の動きを話すと、 ある任意の数をいれ、その階乗計算し、 その後もう一度計算するか選択してするならまたmain関数に戻るというものです。 なのでmain関数の中身はkaijou();とchoice();、return 0;しか書いてません。 大体理解していただけましたでしょうか?
>>290 構造化プログラミングについて勉強しましょう。
292 :
デフォルトの名無しさん :03/05/04 14:48
いただけませんね。
293 :
デフォルトの名無しさん :03/05/04 14:59
Cの話しか微妙なんだけど質問 当方、WinXP+BolandC5.5+CPadでプログラムつくってるんだけど エスケープシーケンスが使えないという現象に遭遇してます 多分XPがいけないんだと思うけど、この問題の回避策ってある? OS変えないとだめ??
choiceからmainを呼び出す意味なし。 while文かdo〜while文を。
296 :
デフォルトの名無しさん :03/05/04 15:06
>>295 ググったけど見つからなかったんだよー
thxです、ってかこれって有名だったのね 汗
>>293 ボーランドーのヤツなら、ライブラリに
問題のないlocate()とかが用意されてるから
conio.hを読んで使ったら?
>>297 ところが既存のソースなんだよね・・・
書き直すのかったるい
ってか
>>295 の方法できなかったぞーい
仕方ないから書き直します
>301 まともなコードなら書きなおす必要はないとおもうが・・・ ・・・そうか、ベタ書きか・・・
>>281 それなら main() じゃなく exec(argv[0]) にしたら?
どうして初心者ってやたらと高次元な配列を作りたがるのですか? しかも動的に。
>>304 ロジックの整理ができんから、妙ちくりんなデータ構造になるんでない?
>>305 普通データ構造から作るだろ。ってのはオブジェクト指向に慣れすぎた者の発想なのだろうか。
>>306 構造化プログラミングでもデータ構造は重要。
ヽ(´ー`)ノ <- この顔文字むかつく
何行くらいのソースが書けたら初心者じゃないと言えますか? 何行じゃなくて何ステップ、ですか? 行とステップはどう違いますか?
>>310 行数気にしてちゃだめでしょ
複雑な処理をいかに簡潔で高速に書けるかの方が重要な気がする
知ったかぶることができるようになったら中級者だよヽ(´ー`)ノ
再び質問です 文字の移動、画面の消去はconio.h使って出来たんだけど 文字色が変えられない・・・ textcolorって使えないの? 誰か教えてくれー うーむ、XP恐るべし
エスケープシーケンス使え、って書こうとしたら、XPでは使えないんだねー。 初めて知った。
おまいら、自分で脱初心者だと思えるまでにどれくらいかかった? モレまだ10日も勉強してないけど、全然進んでない気がしてな。 今から配列勉強・・ヽ(´ー`)ノ
>>315 がんばれよ。後、先輩に対する口の利き方位勉強しとかんと無職ダメ板住人みたくなるぞ。
>>315 プログラミング初心者から抜け出せたと思うまでには5-6年掛かったな。
Cはそれから使ったから初心者だったのはおよそ一週間だ。
それから10年以上Cをメインに使ってきて、一ヶ月前にC++を本格的に
使い始めたが、C++は未だ初心者の気分だな。
memset,memcpyの使い方がいまいち分からないんですが。 文字列が入った変数から、?byteだけ数値として取り出す方法とかmemcpy でできると思ってるんですがどうでしょう?
構造体使う奴は初心者。 gotoの使い方に慣れたら中級者。 列挙型とintとint*しか使わなくなったら上級者。 charとchar*も使い分ければ達人。
>>316 スミマセンついつい・・・。結構年だしね(;´Д`A ```
しかしここはプログラムの先輩ばかりなわけだ。。
気をつけます。
>>317 やはりそんなにかかりますか。。
本職ではなくとも私も用途は趣味と仕事なわけですが・・、
CマスターしたらC++習得は早いってわけでも無いのですか?
>>318 普通はもっと大量のデータをコピー、セットするのに使うんじゃないかな。
例えば画像データをVRAMにコピーするとか。
>文字列が入った変数から、?byteだけ数値として取り出す方法 char mojiretsu[] = "test"; int suuji; suuji = (int)mojiretsu[0];
・・・ char mojiretsu[] = "test"; int suuji; suuji = *(int *)mojiretsu;
>>318 > 文字列が入った変数から、?byteだけ数値として取り出す方法とかmemcpy
> でできると思ってるんですがどうでしょう?
おお、そんなんできるんだ。
やり方の詳細キボン。
>>320 > 本職ではなくとも...仕事なわけですが・・、
プログラマーじゃないけど、仕事のためにプログラミングするってこと ?
(なんかの研究者で、数値解析とかが必要とかなのかなぁ...。)
> CマスターしたらC++習得は早いってわけでも無いのですか?
だいぶ、新しい概念が入ってるからね。
でも、ベースは C だから、C を覚えておくに越したことない。
>構造体使う奴は初心者。 >gotoの使い方に慣れたら中級者。 >列挙型とintとint*しか使わなくなったら上級者。 >charとchar*も使い分ければ達人。 誰も読めないソースを書けるようになったら、神と阿呆の紙一重(笑 どうせマシンパワーが余ってるんだから、最適化の必要の無い部分は徹底的に 可読性重視でいいと思うがし。 ただ、シミュレーションとかで最適化するべき部分に対しては、 自分以外読めないくらいでもかまわない。ただ、変数名のスコープだけは気をつけて。
charとchar*も使い分ければ達人。
わかります。わかります。
>>326 手作業で最適化しないといけないコンパイラですか。
>>320 学生の頃だからね<5-6年
しかも習ったわけじゃないし。
で、C++は取り敢えずクラスの利用と演算子オーバーロードの辺りで止まっている。
テンプレートは使いこなしたとは言いきれないし、継承に至っては結構怪しい。
会社のC++マスターに、「それだけできれば充分でしょう」とのお墨付きはもらったがね。
キャスト使う奴は初心者
>>332 > 「それだけできれば充分でしょう」
その言葉は見込みのない人に対しても使うよね(笑) 「もうやめろ」という意味で(笑)
335 :
デフォルトの名無しさん :03/05/04 19:54
int main(void) { char *ten; char *one; ten = ntof(15); printf("%s\n", ten); one = ntof(15); printf("%s\n", one); strcat(ten,one); printf("%s\n", ten); return 0; } char *ntof(int org) { char *answer; switch (org) { case 15: answer = "f"; break; } return answer; }
336 :
デフォルトの名無しさん :03/05/04 19:55
上のプログラムをを実行すると Segmentation fault と異常終了してしまいます・・・ f f ff という結果がほしいのですが、どうしたら良いか教えてもらえないでしょうか? strcatのところが悪いと思うのですが・・・ 今日の半をこれでつぶしてます。 どなたかお願いします!!
しーません配列の要素数てどうやって取得するんですか? myAry.Lengthみたいなのやりたいです
>char *ten; >char *one; >ten = ntof(15); >printf("%s\n", ten); ぬるぽ
>>337 sizeof(a)/sizeof(a[0])
341 :
デフォルトの名無しさん :03/05/04 20:16
>>335 #include <stdio.h>
#include <string.h>
void ntof(int org, char *str)
{
switch (org) {
case 15: strcpy(str, "f");
break;
}
}
int main(void)
{
char ten[128], one[128];
ntof(15, ten);
printf("%s\n", ten);
ntof(15, one);
printf("%s\n", one);
strcat(ten, one);
printf("%s\n", ten);
return 0;
}
これじゃ駄目なの?
>>340 なるほろ。。そうするしかないのれすか・・さんくすこ
switch (org) { case 15: strcpy(str, "f"); break; }
>>336 文字列リテラルは書き換えられない。
書き換えられないはずの文字列リテラルにstrcatで書き込んでいるから
セクメンテーションフォールトが起きる。
345 :
デフォルトの名無しさん :03/05/04 20:30
>>342 いや、わからん
こっちの方が一般的かなと
>>346 ものによるかなと
グローバル変数を使うとかさ
文字列からintにするにはatoiでいいけど 反対のintから文字列はどうすればいいですか?
int i=5671; char buf[1024]; sprintf(buf,"%d",i);
353 :
デフォルトの名無しさん :03/05/04 21:05
>>349 恐らくこう言う意味。
int global_len = 10;
extern int global_len;
int main(void)
{
int arg[global_len];
return 0;
}
357 :
デフォルトの名無しさん :03/05/04 21:09
>>325 遅レス
研究者ではないが製品開発には関わることあります。
基本的には生産技術要員。
僕はどちらかというと大規模な設備なんかを買う方なんだけど
いまいちその、、プログラマーとの打ち合わせがウマク
いかないし理解できないんだな。それは漏れがアフォだから。
「いやぁ、ソレハ難しいですよ、予算がかかります」
といわれてもよくワカランし。。
「ソースコードは要りますか」と聞かれても貰ってもわからないし。
趣味も兼ねて勉強したいと思いました。
ちなみに今まで会社ではHP-BASICしか使ったこと無いです。
>>358 あー、つまり奴らに騙されて大金払わせられないように知恵つけたいってわけか。
361 :
デフォルトの名無しさん :03/05/04 21:11
>>349 #include <stdio.h>
#include <string.h>
char buf[128];
void ntof(int org)
{
switch (org) {
case 15: strcpy(buf, "f");
break;
}
}
int main(void)
{
char str[256];
str[0] = '\0';
ntof(15);
strcat(str, buf);
printf("%s\n", buf);
ntof(15);
strcat(str, buf);
printf("%s\n", buf);
printf("%s\n", str);
return 0;
}
とかかな?あまり好ましくはないけど
switch (org) { case 15: strcpy(buf, "f"); break; }
363 :
デフォルトの名無しさん :03/05/04 21:15
おいおまえら、最後のcase(or default)文にbreakつけますか?
364 :
デフォルトの名無しさん :03/05/04 21:16
default自体書きませぬ
今日は賑やかだな
367 :
デフォルトの名無しさん :03/05/04 21:17
>>363 つける
ってかdefaultも意味が無くても必ずつける
sageろアホ
ごめんさない。
370 :
デフォルトの名無しさん :03/05/04 21:21
>>367 >ってかdefaultも意味が無くても必ずつける
ifにもかならずelseを付けると言うことですね?
ドモ
>>371 当然だろ?
if(あれこれ) ;
else if(0) ;
else ;
ifだけの場合は、whenというマクロを使います
when(あれこれ) { }
ifしか書かない人には注意力が欠けている人が多い。
>>371 いやいや
default:
値が変ですよ
みたいな感じで書くってこと
>>360 それもある・・。実際だまされてる事もあるしね多分。
Cわかる人間なんて他部署にしかいないし。
ワカラン仕事をするほどツマラン事はない・・。
あっそ
>>358 > 僕はどちらかというと大規模な設備なんかを買う方なんだけど
ああなるほど、昔の俺と同じような立場なわけね。
ハード/ソフトは自社開発だったけど、筐体とかメカの部分を外部にお願いしていた。
確かに俺もメカの部分でいろいろ言われても、ちんぷんかんぷんだったよ...。
> ちなみに今まで会社ではHP-BASICしか使ったこと無いです。
HP-BASIC はそこそこ使える ? その実行環境は今もある ?
とりあえず、1つの言語でプログラム組めるようになれば、他の言語の勉強も楽だよ。
case内でreturnした場合もbreakつけますが何か。
結構忘れるクセがあるからcase書いたら中にreturnとか書こうがなんだろうが 最初にbreakだけかいてまう。
>>383 お節介コンパイラさんから到達できませんと怒られますよ。
警告やエラーは/dev/nullに送って黙らせる
>>379 俺は、大体そうする。環境によるけど、
default:
abort();
とか。
UCSD Pascal みたいに、switch() 文で default: 節が無い場合は、case に引っかからなかったら異常終了するようなコンパイルオプションが欲しい。
俺はコンパイラの最適化のジャマを、わざわざするようなことはしない
数々の嫌がらせを切り抜けて最適化するのがコンパイラの使命
コンパイラという仕事も大変ですね。
>>321-324 なんつーか、peek,pokeのような、、、感じで0xFFFFFFくらいも文字列のある(適当)部分から読み出す
とか書きこむとか、memcpy,memsetでできるんではと思ったんで。
memcpyいまいち分からないし探してもほとんど良いのなかったです。
>>325 C言語→暗号化アルゴリズム の方になっちゃうんですが
ブロック暗号てのである部分ごとに(ブロック)暗号化するんで、ソースコードもちょっとあったからできるんじゃないかと思ってます。
ソースコードの理解がまだまだだし、それに関することも無いわけで書いてみました。
すいませんちょっと質問なんですが、substrのような 文字列を切り出す方法はsprintfしか無いのでしょうか。
>>392 俺ならstrncpyを使うが。
char s1[234],*s2="string";
strncpy(s1,s2+2,3);
s1[3]='\0';
>>392 strncpy, strncat, strncmp, strchr, strstrなど
>>396 strncmpでどうやって切り出すの?
strchrやstrstrもよくわからない・・・・
まったくだ
文字列の先頭の数文字を切り落としたかったんですが そういう便利関数は自分で用意するしか無いようですね。 ありがとうございました。
>>399 ポインタを動かすとかができないのなら、memmove
>>397 直接は切り出せないけど比較して切り出すのに使えるかなと
ってかsubstrが何をやるものかよくわかってない俺
切れ痔
>>405 char str[]="abcdefg";
char *p;
先頭の2文字(ab)を切り捨てたいなら、
p=str+2;とするか、memmove(str,str+2,6);
コンソールアプリで、main関数でない関数からのmain関数呼び出しは どうやればいいのでしょうか? ただソース中にmain();と書いてもエラーがでます。 どなたか、どうすればいいのか教えていただけ無いでしょうか? よろしくお願いします。
エラーじゃなくて警告でしょ。C++でなければ。 ソースの先頭にでもint main(void);かint main(int,char **);と書く(mainの引数にあわせて)。 でもなんでまたmainを呼び出すのよ。
>>408 あ、そうです。警告です。
そのmain関数を呼び出したい関数を書いてあるCソースファイルにmain関数の宣言を行えばいいのですね。
実はまだ初心者で、関数の使い方を勉強してるのです。
なので簡単なプログラムを関数で色々やってみたりしてるんです。
char bur[256]; の中身"inside"を char *test; に代入することはできますか?
頭イタイ
413 :
デフォルトの名無しさん :03/05/04 23:10
test = &bur[0]
exit関数についてですが、これをmain関数以外の関数で使いたいのです。 その場合は、stdlib.hをインクルードするだけで使えるのでしょうか? できたら、exit関数の使い方を教えて欲しいのですが・・・ どうかよろしくお願いします。
>>416 当たり前だが、そのままだとburの値が変わるとtestの値まで一緒に変わる
別にその後burを使わないなら問題ないけど。
>>415 exit(0);
>>417 え・・・?どういうことでしょうか?
本当にすいません。
>>418 それのコピペでできました。
本当にありがとうございました。
>>416 中身を代入なら、strcpyの方がいいんで内科医?
>>423 未来にレスしてるお前が、一番アフォだろ。
>>424 いや案外ものすごい才能のもちぬしかもしれない。
426 :
デフォルトの名無しさん :03/05/05 01:13
C言語を勉強して最終的にはC言語を使用してテトリスと作ろうと思ってるのですが テトリスはC言語で記述可能でしょううか? やはりVisualCなどでないと無理でしょうか?
はい。 いいえ。
Cでも書けるよ。 っていうか、書いたし。 問題は言語じゃなくて、どんなライブラリを使うかじゃないの?
って、いうか言語と処理系の区別ついてないし。
430 :
デフォルトの名無しさん :03/05/05 01:22
>>427 サンクス
>>428 自分でライブラリまで作るってのは時間的に難しいですかね?
そんなこったものでなくてただぶろっくが落ちてきて
それをこっちが操作して横が揃ったら消える程度でいいんですが
>>430 Cで書かれたテトリスのソースは探せばあるから参考にしては?
432 :
デフォルトの名無しさん :03/05/05 01:34
>>431 え?ありますかね?
結構捜したつもりなんですが見つかりませんでした
外国のHPかな?英語はちょっと苦手で・・
char typed[256]; に入れた8文字をそれぞれ別々の 変数8個に代入する方法を教えてください お願いします。
>>433 まずは、それぞれ別々の変数8個に代入してみるのだ。
>>433 こういうヤツが10年後、
エリートSEとなって世界へ羽ばたいていたりするんだな
>>433 とりあえす入門書の一冊でも読んでから質問すれや。
初心者の素朴な疑問です。 C言語でベキ乗演算子が使えないのはどうしてですかね・・? 自分で作るとかは別として。根本の理由はなんなんでしょう。
ベキ乗をサポートするプロセッサが少ないからだとか。 powがあるし、自分で書いても難しくないからいいんじゃないの。
>>439 なるほど・・
3乗根やn乗根となると、目的の割りに”少しだけ”めんどうですね。
有難うございました。
complex.h tgmath.h を使える環境って フリーでありますか?とりあえず cygwin/gcc-3.2 は 対応してないようですが。。
>>442 gcc用のcomplex.hは寡聞にして存じ上げませんが、
g++用でしたらg++-includeに含まれていたかと。
ポインタを使った文字の比較なんですが if("a" == *p) というのがだめで if(0x61 == *p) と if('a' == *p) がOKというのはなぜなんでしょうか。
>>445 それは多分""で囲まれた部分が文字列リテラルへのポインタになってるからだと思う
>>445 最初のうちは、文字列の比較はstrcmpを使うものだ、そういうものだ、
と納得しておこう。
後々理屈が自然にわかるから。
モジはintだから ダヨ
if(*"a" == *p) はオッケー ダヨ
"a" は 'a' と '\0' の2文字からなる文字列へのポインタ *p は 'a' そのもの。意味が全く違う。
>*p は 'a' そのもの。 'a'は文字そのもの
>>446-450 みなさんありがとうございます。"a"はaと\0の文字列で
449さんの場合はそのうちの先頭1文字を比較している
というわけですね。よくわかりました。ありがとうございます。
sageて質問・・・ネタ決定
454 :
デフォルトの名無しさん :03/05/05 14:00
ageようがsageようが勝手でしょ
447 名前:デフォルトの名無しさん 投稿日:2003/05/05(月) 13:16
>>445 最初のうちは、文字列の比較はstrcmpを使うものだ、そういうものだ、
と納得しておこう。
後々理屈が自然にわかるから。
457 名前:デフォルトの名無しさん :03/05/05 15:00
447 名前:デフォルトの名無しさん 投稿日:2003/05/05(月) 13:16
>>445 最初のうちは、文字列の比較はstrcmpを使うものだ、そういうものだ、
と納得しておこう。
後々理屈が自然にわかるから。
吐き出したexeファイルにデータをドラッグ&ドロップして そのデータのポインタやファイル場所を受け取りたいのですが どのような関数が必要なのかわかりません。 どなたか、ご教授お願いします。
>>461 わかるわけない。
特にデータのポインタってところが。
初心者でごめんなさい_| ̄|○ 例で表すと・・・ 解凍ツールで解凍するファイルの名前を ドラッグ&ドロップで知りたかったのです。
なんだか、自分で見てても混乱する文章だと理解してきました
深呼吸してから出直してきます。
>>460 氏
苦しいところでのお答えありがとうございました。
もしかして〜と思ってちょっとやってみた。
実行ファイルにドラッグ&ドロップしたファイルの名前はargv[1]に格納されるんだな。
>>464 mainをint main(int argc,char *argv[])として、argv[1]からファイル名を得る。
>>462 氏
わざわざ二度手間みたいですいません・・・早速やってみたいと思います。
ありがとうございます。
コンソールアプリなら466のやり方で大丈夫だな。 ちょっと補足すると、複数ファイルの場合はargv[1〜argc]に入ってるからargc-1回ループさせると。 既に起動してるWindowsアプリのウインドウに、、とかいうんだったらまた別だが
正しくいえば、argv[1]からargv[argc-1]だね。
>>469 氏
今回はお察しのとおり(?)コンソールアプリケーションです。
複数ファイルの場合の時を考えてなかったので、助かります。
覚えておきたいと思います。
>>470 氏
見事、成功しました〜。
長々とのおつきあい感謝です。
ト ン ベ ス ト ー ン 〜宇宙からのメッセージ〜
atexit()って何に使うの?
C言語で、Concurrent Programmingはできますか?
>>473 正直使わない。
大体をしてグローバル変数かファイルスコープ変数しか
アクセスできないしな。
一回使ったことある。
>>473 OSによっては資源の解放に便利に使える。
但し、ここではスレ違いなので詳細は省略。
C言語で、Terrariumはできますか?
C言語で、Object Pascalはできますか?
>>481 引き数はdouble *pMatrixでいいと思うのだけど。
で、参照はpMatrix[i * col + j]って感じで。
それがいやなら i * col + j をマクロにしておくとか。
でも私ならC++でクラスにしちゃうけどね。
c言語を始めようというソフトに対応しているコンパイラでゲームをつくれますか?
>484 マジレスだけど、そんなのよりC Machineというのを使った方がいいよ。
コンパイラさえあれば何でも出来る! 元気ですかー!!
>>484 ちょっと待て、対応しているのはコンパイラの側ではないぞ。
>>482 ,483(?)ありがとう。
1次元ですね。なるほど。
私の手元の本は2次元なんですよ。
だからそうしたのです。
でも、かならずしも一般的ではないですよね。
482さん、
参考のためc++の方法を教えて下さい。
>>485 施寝よ。
作者も放置しているようなコンパイラなんか使えるわけねぇだろ。
こういうことができないのはCの仕様?
麻雀のアルゴリズムを自分の力だけで開発しました! この達成感はすばらしいものです。 聞いてばかりではなく、自分の力だけでやってみるのも おもしろいですよ。
他人に聞けば一発ってこともあるよ。
かなりがんがって作ったのに他人に教えたら「それ当たり前」とか言われるとちょっとヘコむ
気持ちはわかるが無駄な努力はしない方がみんなのためだ。
無駄な努力と決めつけて努力しない香具師は、もっと役に立たないがな。
なんか色々反響あるみたいだけど、
>>494 の言うことには同意。
同じ経験あり
500 :
デフォルトの名無しさん :03/05/06 00:42
糞スレで500ゲット
いろいろあるけど、
>>496 に同意
というか、たいてい言う側
当たり前のことばかりやってんなぁ(藁
503 :
デフォルトの名無しさん :03/05/06 03:13
gdbを使ってデバッグしたいのですがソースを表示しながらデバッグをしたい のです。Mule、nemacsじゃないと駄目ですか?秀丸じゃ無理なのですか?
禿丸なら可能です
enum Bool{ True; False; }; ↑何か変なのでしょうか? これで何も問題は起きてないのですが。
普通、falseは0です。
セミコロンじゃありません
俺はenum 宣言を生で使うことはしないな。名無しで定数をまとめる為とか。 Cではかえって読みづらいと思うが、あえて似たようなことをしようと するならば、 typedef enum{ TRUE = 0, FALSE = 1 } Bool_t; Bool_t flag; みたいに書くだろう。あくまで型定義の仕方としてな。
execするときにmallocで確保した領域は解放されませんよね? 開いたファイルもそのまま?
0と非0でいいと思うけど。
普通enum {FALSE, TRUE};
512 :
デフォルトの名無しさん :03/05/06 10:04
ループ内で新たに変数が必要になった時、どこで宣言するのがよいでつか? 変数は必要な時に宣言するって精神に則ると for (xxxxx) { int hensu; : } こうかなぁと思うのでつが、なんかデバッガで追ってるとhensu変数が ループが1回回るたびに作成されたり削除されたりしているように 見えるんでつ。 なんか動作パフォーマンスが悪いように見えるんでつが、実際の所 どうなんでしょう? ループ外で宣言する方が良いでつか?
アセンブラの出力見てみろ
>>512 実装によるけど、変数の領域がブロック単位で確保されたり開放されたりって
ことは無い。
どこで宣言してもパフォーマンスは変わらないと思う。
(もしかすると変数のスコープを細かくしたほうが最適化で
レジスタの割り当てがうまくいって速くなるってことがあるかも
しれない)
ちゅーか、スタック
>>513 見てみましたが、分かりませんでつ。
>>514 >515氏が書かれているように、私が勉強した時、確か自動変数はスタックを
利用して記録されると読んだ記憶があります。
そのまま解釈すれば、ループ毎にPUSH,POPしているのかなぁと思ってしまう
のでつ。
(さっきデバッガでアセンブルコードを見て追っかけて見ましたが、よく
分かりませんでつ・・・)
しかし>514氏の言う通り、うまく最適化されているような気もします。
もう一度、皆様のご意見を聞かせて下さいまし。
> 見てみましたが、分かりませんでつ。 それくらいの差だってこった。
>>516 int変数程度ならスタックフレームに変数領域を確保するだけだから
コンパイラがアドレスを決めて直接書き込めばPUSH/POP不要。
ループ抜けるまではPOPせんでいいだろー
ブロック単位で宣言すれば、むしろ局所性が高まり、 関数呼び出し時に確保されるローカル変数用スタックの 消費サイズも最小限になる可能性が高い。
>>520 スピードはどうなんですか?
スタックをpush、popすることで下がりますか?
実装によるんじゃねぇのか、SPいじるだけなら気にならんレベルだろー
>>521 subとかaddみたいな加減算で直接spの値を操作するから、
ローカル変数側についてはpush/popが呼ばれることは無いよ。
結果的にメモリの局所化に繋がるから、
再帰関数とかのパフォーマンスは良くなる。
つーかアセンブラ出力読んだ方が早い。
524 :
デフォルトの名無しさん :03/05/06 12:41
>>520 そんな賢いコンパイラはあんまり見かけないな
ブロック単位で宣言しておけば、コピペには便利だけど、
変数宣言するくらいの単位なら構造化して関数に昇格した方がいいと思うけどな
関数呼び出しまでするとコストがウヘ
そんな所のコストが心配ならアルゴリズムを検討した方がいい
一度や二度呼び出す場合ではなく、ループの中の話だろ?
inline展開されるんですか?
>>527 ループの中でも、最近のCPUだと関数の呼び出し程度は実行サイクルに隠れてしまう事が多いよ
パフォーマンスを恐れて構造化しないのは愚かだと思う。
構造化しておいて、パフォーマンスチェックにひっかった後でインラインに戻せばいい
逆に構造化しておかないと、パフォーマンスチェックで問題個所を特定する事さえ難しくなる。
age
今は構造化の話なんてしてない
うーん。 pascal だと関数内関数が書けるけど、C だとそれが出来ないから こういう場合関数呼び出しにすると、 そのブロックのスコープ外ローカル変数にアクセスするために無駄に引数が 必要になるわけで、しかもポインタ渡しにしなければならなくなるとかさ、 だから、C のスタイルだと、ブロック化が構造化というふうに捉えるべきだと思う
>>529 VCならoptionによって勝手にinline-expandされる。
どうでもいいんじゃネーノ?(`ー´)
どうでもいいならスルーしろよ>536
>>535 VCの最適化は凄いよね。
inline展開や
>>520 ぐらいの事は当たり前の様にやってるよ。
その代わり、exeのサイズえらい事になるガナー>538
ほほう
無関係なオプションも混じってるけど、 VC cl /O2 /GB /Og /GA /Ob2 /nologo /MT /W3 /GX /YX /FD /Gz ... mingw gcc -O9 ... いつもこれで大体同じか、gccが少し遅いという結果になる。 両方とも勝手にinline展開などを行い、 実行ファイルのサイズはかなり増大する。
C言語でCGの勉強でをしています。 glutKeyboardFunc(OurKeyboard); ってのはmain文の中でしか使えないのですか? お願いします。
544 :
デフォルトの名無しさん :03/05/06 20:40
float 型の変数aに a=45.1 と代入すると 実際は 45.099998 が入ってしまいます。 45.1 丁度を入力する方法ってないでしょうか? よろしくお願いします
ありません。
>544 勉強が足らんな。二進数での浮動小数点表示げたばき式を勉強して来い
547 :
デフォルトの名無しさん :03/05/06 20:47
>>545 そうなんですか。
今作っているプログラムで、
人が入力した数字(例:45.1)をfloat 変数にしまっておいて、
後からその入力した数字を再度、45.1として取り出したいのですが、
何かいい方法はありませんか?
処理の関係上、float変数は変更したくないのですが。
入力・・?文字列として? ならその文字列を保存しておけば。数値に変換しないで。
#include <stdio.h> int main(void){ float a = 45.1; printf("%.1f\n", a); return 0; }
実数使う以上誤差がでるのは仕方ないだろう。 それを踏まえた上でfloatを使うべきではないのかい?
>544 1万倍しておけばいいじゃない
C++とかDelphiに金銭型とかあるでしょ? あれも中身は浮動小数点を10のベキ乗倍してるだけの筈だよ。 例えば100倍にしておけば、1/100まで誤差が出ないからね。
556 :
デフォルトの名無しさん :03/05/06 21:36
4*4/4
どうしてもわからないので聞いていい? Linux 上でネットワーク通信するときに、C 言語からパケットロス率を取得するには どのようにするのが常套手段なんでしょう。 ひょっとして、/proc の下を見るとかするとわかるんでしょうか。 わかる方、お願いします。
>>558 このスレで聞くのは間違ってる。
ここのスレ的な答えだと、「標準Cではできない」となる。
>>555 誤差無しで小数計算するときは
普通整数で固定小数点計算するだろー。
>>560 整数で計算したら、こんどは少数点が出たら大きな誤差になってしまう
誤差は出るものだけど、誤差が出るのを遅延させるのが金銭型方式だよ
128bitだか256bitだかの固定少数で計算するのが C#のDe??????とか言う型じゃなかったっけ? うろ覚えですけど
文字列のまま計算すりゃぁ 上下何桁でも誤差はでないよ 遅いかもしれんがね
564 :
デフォルトの名無しさん :03/05/07 15:11
処理系依存が多すぎますよね!!
565 :
bloom :03/05/07 15:13
566 :
デフォルトの名無しさん :03/05/07 15:13
stdoutがどこに接続されているかを調べるにはどうしたらいいですかね?
UNIXかつ端末に結びつけられているかどうか知りたいのならistty(1);
どこに接続されているのか調べる方法は知らない。つーか
>>1
>>563 10で割れなきゃダメだろそれ・・・ 3.33333333 どうするだ?
と言われて 分数型を作ったら、今度は√2どうするんだ? といわれてるだろうな。
汎用を求めちゃいけないよ。
金銭を扱う一番簡単で信頼性のある方法は、単に入力時に1万倍して扱う方法だ。
1.23 これには誤差がある だから1万倍してその時に丸めて持つ。
まあ、金利が1.23% のように少数点以下2桁しかないという全体での1万倍なんだけどね
while((c=fgetc(stdin)) != EOF){} while(c=fgetc(stdin), c != KOF){} どっちの書き方がスマートですか?
上
KOF…
KOFって何?
'94と'95はやってた
99まで落とした
FILE *frand(char *, char *); の使い方を教えてください
ググんない初心者が多いな最近。
579 :
デフォルトの名無しさん :03/05/07 19:05
#include <stdio.h> void main(void) { int a,b,c,d,e,f,g; printf("==============================================="); printf("いまから四則演算をする数値2つ入れなさい"); printf("==============================================="); printf("1つ目"); scanf("%d",&a); printf("二つ目"); scanf("%d",&b); c=a + b; d=a - b; e=a * b; f=a / b; g=a % b; printf("演算結果"); printf("%d + %d=%d\n",a,b,c); printf("%d - %d=%d\n",a,b,d); printf("%d * %d=%d\n",a,b,e); printf("%d / %d=%d\n",a,b,f); printf("%d % %d=%d\n",a,b,g); printf("\n"); printf("\n"); printf(" 以上\n"); } エラーが11もでた。誰か教えて。
ちょっと笑ってしまった。
printf("%d % %d=%d\n",a,b,g);
全角を直せ。
>>579 おいおい、まさかこれ、このままコンパイラ通したんじゃないだろうな?
ってか、全角スペースとか、最後の‘}’とかさ、書き込むときに間違っただけだよな?
あと個人的に main() を void にすんなと思った。
#include <stdio.h>
int main(void) {
int a,b;
printf("===============================================\n");
printf("いまから四則演算をする数値2つ入れなさい\n");
printf("===============================================\n");
printf("1つ目\n");
scanf("%d",&a);
printf("二つ目\n");
scanf("%d",&b);
printf("\n演算結果\n");
printf("%d + %d=%d\n",a,b,a+b);
printf("%d - %d=%d\n",a,b,a-b);
printf("%d * %d=%d\n",a,b,a*b);
printf("%d / %d=%d\n",a,b,a/b);
printf("%d %% %d=%d\n",a,b,a%b);
printf("以上\n");
return 0;
}
} }
=よりも==の方が優先順位が高い理由を教えてくたざい。
マルチに答えるな、と
#include <stdlib.h> #define begin { #define end } #define Result return int main() begin Result(0); end
>>590 最大の謎はなぜstdlib.hをインクルードしているかだな。
592 :
デフォルトの名無しさん :03/05/07 20:03
ありがと
>>587 int i = 6, j=5;
bool t = i == j;
これで=の方が先に評価されたら困るから。
>>587 無能を早い段階で排除するためにそうなってます
>>587 ほかの比較演算子との整合性をとるためだと思われ
== != > < とかとね
つまり、
bool hoge = i > j;
だったら>の方が上なわけで、とすると==も上になるわけで
結局は比較演算子の方が優先度が高いっていう仕様のせいだな
代入演算子は優先度が低い方がいいと思うが
600 :
デフォルトの名無しさん :03/05/07 20:39
>>599 同意
コンマより低かったら困るけどな。。。
>>587 日本の自動車が左側通行なのと同じ程度の理由だと思われ。
>>594 初期化構文中の = 記号は "演算子" では無い筈だが・・・
ネタ?
"代入演算子"ではないというだけでは。
605 :
デフォルトの名無しさん :03/05/07 21:51
#include<stdio.h> main() { char i,j=0,k; printf("please input num(maz 15)=>"); scanf("%d",&j); for(;j<16;) { for(i=0;i<j;i++) { for(k=0;k<=i;k++) printf("*"); printf("\n"); } j=16; } }
605のようにプログラムしても コンパイルが通りません。 なぜですか?
>char i,j=0,k; を int i,j=0,k; にするべし 原因はスタックが壊されてるから。
って、コンパイルが成功しないって書いてるな。 コンパイルは成功したけど。
>>605 とりあえず main は値を返すべきだと思うが
そもそもif文を使うべきだと思うが
よく見ていないけど、警告をエラーと勘違いしただけじゃないの。
>>604 Cの構文規則調べた事ある?
これって、Cの基礎知識だと思うのだが・・・
615 :
鈴木健一郎 (NT4.0/2000/XP) :03/05/07 22:22
随分変な質問なんですが、例えば、(名前, 住所, 体重, 性別 ...)みたいな 感じのデータをいっぱい入力させといて、 w3 = GetData("Yamazaki","weight") こんな感じで取得するプログラムを作っています。 で、ここでマニアックな質問なんですが、このプログラム(クラス)に カッコいい名前をつけてください。 名前が決まらないのでコンストラクタが作れないし、ファイルに保存が出来ない・・・。 周りに聞いたら IDMapper IDManager とかちょっとセンスのない名前しか挙がらない。
617 :
デフォルトの名無しさん :03/05/07 22:30
SDKまたはDDKのAPIでも良いのですが、パーティションを作成できるようなコマンドはないでしょうか? 領域さえ確保出来れば、formatコマンド等でどうにかなりそうな気もするんですが。
618 :
デフォルトの名無しさん :03/05/07 22:32
アンケートでVBからjavaやC#に移る傾向があるみたいよ! C#ってなに? C++とは違うの?そもそもオブジェクト指向なの? 最近時代に取り残される感じがする・・・ だれが簡単に説明してちょ!
>formatコマンド等でどうにかなりそうな気もするんですが。 ・・・何が?
621 :
デフォルトの名無しさん :03/05/07 22:33
>>616 ああ、そんなスレがあったんですね。知りませんでした。
ではそちらに行ってきます。
623 :
デフォルトの名無しさん :03/05/07 23:48
#include<stdio.h> int main(void){ int i; do{ i=getchar(); if(i==EOF){ printf("入力時エラー"); break;} if(putchar('.')==EOF){ printf("出力時エラー"); break;} }while((char)i!='n'); return 0;} 入出力時のエラーをチェックするらしいのですが、 どのような値を与えてやるとエラーになるのか分かりません。 教えて下さい。
>>623 基本的にはエラーは起きないと思うが・・・
エラー時はEOFって定義されてるからだと覚えておくだけでいいかも
・・・だめですか?
>>623 入力時エラー)
ファイルにリダイレクトしてる場合はファイルの最後。
してない場合は Ctrl+D 。
出力時エラー)
ファイルにリダイレクトしてる場合はディスクフルか、
場合によってはディスクに書き込む許可が無い場合にもあるかも。
(読み込み専用のファイルにリダイレクトが不可能な環境でも、
起動したと同時に別のプログラムでファイルへの書き込みが禁止されたら
putchar が失敗しうる)
それ以外では普通出ないと思う。
入出力を FD 上のファイルに割り当てといて、実行中に FD 抜く。 入出力をネットワーク上のファイルに割り当てといて、実行中に LAN ケーブルを抜く。 いくらでも考え付くが。
0、1をランダムに並べて行く生成プログラムが必要なんですが、 どこかに参考になるソースはないでしょうか?
rand()&1じゃだめ?
>>628 それはあんまり良くないな M系列の方がマシだと思うぞ
やっぱここは MT 法で。
#include<stdio.h> int main(void){ for(;;){ printf("%d",rand/0.5); } return 0; }
632 :
デフォルトの名無しさん :03/05/08 00:24
>>624-626 ありがとうございます。本にも「普通は戻り値がEOFかどうかチェックしない」と
書いてありましたし、エラーの場合はEOFが戻り値として返ってくるんだな。と
覚えておきます。
全角文字にアクセスするにはどうしたらよかとですか。具体的には char* hoge = "かわうそくんひどいや"; のような文字列の各文字を任意の文字に変更したいんです。
634 :
デフォルトの名無しさん :03/05/08 00:41
>>633 wcharを使うのが良いのかもしれない
あるいは、漢字コードを意識して複数バイトで処理する、ぐらいか
char *geho = "砂男がいますあべしたわば";
while(1)
{
x = lrand48() % ( strlen(hoge) / 2 );
y = lrand48() % ( strlen(geho) / 2 );
memcpy(hoge+x*2, geho+y*2, 2);
printf("%s\n", hoge);
}
>>634 -fwritable-strings とかなんとかするんじゃない?
>>635 全部2バイト文字ならな。
細かい操作を何度もする場合は
UNICODE が確かに扱いやすいけど、
読むだけとかだったら isleadbyte を使って
シコシコやったんでいいかと。
>>635 -fwritable-stringsは、過去のコードをコンパイルする時以外に使うんじゃねぇ!
新規にコード書く時には使うなよ。
それとコード例、随分乱暴すぎるぞ。
半角文字も考慮して書き直してみろや。
ここで発表しろとは言わんけど。
コンソールアプリケーションで文字の色を変更するとしたら、その部分は完全に機種・OS依存になるのでしょうか。 Win32で動作するコンソールアプリケーションで文字の色を変える場合にはコンソールAPIを利用するしかないということでしょうか?
wchar_tを使った場合半角と全角が混在してても問題無いの? wchar_t *wc = "ち0こ"; wc[1] = 'ん'; wc[2] = 'げ'; で ちんげになるの?'
>>638 普通にコンソールって言うと VT100 とかを思い浮かべますが。
642 :
デフォルトの名無しさん :03/05/08 03:33
あの、すいません。C言語を学校で習い始めた超初心者なんですが、 家でC言語を動かせる環境ってどうやれば作れるんですか?
>>642 何から説明すりゃいいんだ?OSからか?
すいません過去ログ読んで疑問点を絞ってから出直します。
646 :
デフォルトの名無しさん :03/05/08 05:16
cygwinを現在導入していて xxgdbを使いたいのですが インストールなどの操作は分りません。教えてください。gdbはすでにインストールし ています。
(´-`).。oO(……)
>>640 NT系OSだとANSI.SYSを組み込まないといけなかったりするみたいですね。
試してみたんですが正しく表示されなかった…。難しいなぁ。
>>648 スレ違いだが、NTではansi.sysは動かんというのが定説。
>>646 cygwinならUNIX板とWindows板(?)に専用スレがあるのでそっちへGO!
telnetサーバ(Win2000Proじゃ入っていない?)立ち上げてTeraTerm
まずcygwinをアンインストールしろ 話はそれからだ
653 :
デフォルトの名無しさん :03/05/08 15:23
S=1+x/1!+xの2乗/2!+xの3乗/3!+・・・・+xのn乗/n! を解くプログラムがわかんないんですけど教えてください。
>>643 家にはPC-9801FA2があります。
CPUがi486SX16MHz、メモリは1.6MB、HDDは20Mで5インチのFDDが2つついています。
起動するといきなりN88-BASICが立ち上がりますが、これでC言語をやりたいのです。
まず何をすればいいのでしょうか?
計算するんだったら int s = 1, a = 1; for (i=1; i<=n; i++) { a *= x/i; s += a; }
>>654 MS-DOSを手に入れる。
Cのコンパイラを手に入れる。
658 :
デフォルトの名無しさん :03/05/08 15:33
分子のx2乗とかの所がわかんないんですけど....
exp(x)
661 :
デフォルトの名無しさん :03/05/08 15:46
前提 socket通信で、こちらがクライアント 質問 自ホストの接続ポート番号を指定するにはどうすりゃいいの?
変数のextern宣言は、わかります。 しかし、関数のextern宣言とは何のためにするのですか? 例 int func_C( int n ) { extern int func_A( int n ); } 関数は何処からでも参照できると、思うのですが、、、?
prototypeのため。あるいはint以外の関数を使うため。
664 :
デフォルトの名無しさん :03/05/08 15:50
まだ大学1年生で初歩的なことしかやってないのでそれでも作れるプログラムじゃできませんか?
>>663 ありがとう。
でも
プロトタイプ宣言?
関数int func_A( int n ); を使うために行うのですか?
externは要らないと思うのですが?
>>662 staticをつけると他のファイルから呼べなくなる。
externはその逆。デフォルトだから普通はつけないと思う。。。
あ・・・定義じゃなくて宣言の話か・・・・・ 試したことないから知らない。
>>665 > externは要らないと思うのですが?
なくてもいい。
671 :
デフォルトの名無しさん :03/05/08 16:00
>>667 ,668,669,670
ありがとう。
でも、いまいち分からないなあ。
C FAQ 日本語訳 より抜粋
1.11:
関数宣言についたexternは何を意味するのか。
A:
こういう書き方をすることで、関数の定義がたぶん別のソースファイ ル
にあるということを、ほのめかすことができる。
externは書かなくてもいいみたいですね。
追加質問です。
int func_C( int n )
{
/*extern int func_A( int n );*/
}
func_Aが、別ファイルにある場合、
このようにすると、func_Aは使えなくなると解釈してよいですか?
>>672 Cでは別にプロトタイプ宣言がなくても呼べる(定義でstaticがついていなければ)。
でも引数チェックやら何やらができなくなるからやめた方がいい。
>>673 納得です。
関数のプロトタイプ宣言を、異なるソースファイル間
でおこなうわけですね。
これで、引数チェックが行われて、バグを作らなくなる
わけですね。
納得しました。
異なるソースファイルにある関数を使いたいときは
externで宣言しとけですね。
K&Rには載っていなかったですよ。。。
>>674 普通は宣言はヘッダーファイルに書いてそれを様々なソースファイルからインクルードする。
static関数(←呼び方おかしいかも)の場合は他のファイルから呼ばれることはないので(定義と同じ)ソースファイル内で宣言する。
>>675 了解です。
そうですね、私はそうしています。
他人が作ったプログラムに、上記のような記述が
あったので、何でだろうと思ってました。
その人はヘッダーに書くより、作成中の関数に、
externとして宣言するほうが管理しやすいと考えたんだろう
と思います。
他人の作った関数を利用するには良い方法だと
考えます。
677 :
デフォルトの名無しさん :03/05/08 16:44
−−ab.c int ab(void){return printf("extern");} −−main.c extern int ab(void); int main(){return ab();} static int ab(void){return printf("static");} どっちが表示されますか?
>>677 int a = 2;
int main(void){
int a = 1;
return printf("%d\n", a);
}
と同じ、スコープが狭い方が有効になる。
K&Rにだってこの話は載ってるだろうに。
>>679 グローバル変数にアクセスするときはどうしたらいいの?
C++だと::aだけど。
ということはint errno;とかやったらエラー番号を参照できなくなるのか そんなあほなことしないけど^^;
>>679 その例だと、ローカルな方は参照される前にちゃんと宣言されてる。
プロトタイプはab.cにあるab()を指してるし、呼び出した時点ではコンパイラはstaticのab()を知らないわけで、
それでもstaticの方なの?
試した?
686 :
デフォルトの名無しさん :03/05/08 17:42
ピタゴラス数列挙プログラムなんですけど、以前のもので約分できるものは 表示しないようにしたいのですがどうすればよいのでしょうか? 例えば、3:4:5が表示されたら、6:8:10は表示しないようにしたいのです。 #include <stdio.h> int main() { int a,b,c; for(a=2; a<1000; a++){ for(b=2; b<1000; b++){ for(c=1; c<1000; c++){ if(a*a==(b*b)+(c*c)){ printf("%d:%d:%d\n",a,b,c); }}}} return 0; }
>>685 GCC だと、非 static と宣言した後に
本当は static だったということで警告が発せられる。
でも、一応 static が呼ばれる。
仕様ではどうなってるんだろ。
未定義?
悪い、間違い。規格では「6.1.2.2 識別子の結合」の最後の段落 翻訳単位の中で同じ識別子が内部結合と外部結合の両方で現れた場合,その動作は未定義とする。 とあった。 ちなみにgccでは警告が出るが、コンパイルは成功し、"static"が出力される。 bcc32では無警告でコンパイルは成功し、"static"が出力される。
プロトタイプは嘘でもいいの? int a(int n); int main() {return a(1);} static int a(int x, int y){return x+y;} これは問題なくても WindowsAPIみたいに引き数がパスカル形式の関数呼びを騙したら落ちるじゃん
>>690 int()
が全てと思えばよい。
今から30年前のPDP8のコンパイラを考えれば
少しは、自分の恵まれた環境を考えろよ。
>>690 嘘つけるならプロトタイプの意味がないじゃん
>>690 そらエラーやろ。
昔のことは知らんが。
PDP-11は、どこで買えますか?
Cのそういうところが気持ち悪い
リンク時にエラーにならんか? Cだと通ってしまうのか
>>696 なんのこと?
>>690 ならコンパイルの段階でエラーだと思うけど。定義も宣言も同じファイルなんだから。
先入れ先出しのスタック構造を作りたいんですが、 どのような感じに作ったらいいでしょうか?
>>698 それスタックなのか・・・?キューじゃなくて?
殆どのスタックが後入れ先出しになってるので、 そうじゃないスタックも作ってみたいと思ったわけです。 そんなに難しいのでしょうか?
>>700 ほとんどというか、そういう構造をスタックと言うんだと思っていたけど。
キューはポニーテールではないのか、キューは 中国が嫌っている言葉だな
どなたか教えてくれませんか・・・?
705 :
デフォルトの名無しさん :03/05/08 18:56
約分できるか判定して表示しなかったらいいじゃん。
>>686 約分できる=素数でないので
素数の判定をして、素数だけ出力すればいい。
素数の判定方法は宿題とする
>>705 if文でできないか考えたのですが、
それだとすべてのピタゴラス数を書くようですよね?
なので、それ以外の方法が欲しいのです。
>>706 それだと例えば3:4:5は4が素数ではないのでおかしくなってしまうのでは?
素数判定プログラムは以前作ったのですが。
例えば for(i=2; i<=a; i++) if (a%i==0 && b%i==0 c%i==0) return 0; return 1; みたいな関数書けばいいんちゃうの?
俺が教えるのは えらはりとねすのふるいだな。 でも結構面白い、みんながんばれだな。
ガンガンいこうぜ
他人にまかせろ
変数aをエラトステネスのふるいにかけてからピタゴラス数を求める。
>>714 あ、そうですね。
aをa^2=b^2+c^2が成り立ってて、かつ約分できない場合は
aが素数となるんですね。
どうもありがとうございました。
ただ、エラトステネスのソースは思いついてないので、
以前作った因数を調べる素数テスタで図ってみたいと思います。
本当にありがとうございました。
いや、やっぱり長辺は素数になりません。
717 :
デフォルトの名無しさん :03/05/08 19:27
どっちやねん。
すれ違いだ
719 :
デフォルトの名無しさん :03/05/08 19:30
お前ら、Windowsの改行コードは0D 0Aだぞ。 文字列で表したら\r\nだ。 \nなんて書くんじゃねぇ。
大丈夫。変換してくれるから。
721 :
デフォルトの名無しさん :03/05/08 19:34
変換してくれるとはかぎらねぇよ。 ファイルにリダイレクトして、 いろんなアプリで開いてみろ。 ぼけ。
>>717 素数じゃありません。
>>718 このスレであってるはずです。
色々考えたんですが、3辺の比のうち、どれかが素数であればいいことがわかりました。
ソースに素数判定ソースを組んで見たいと思います
>>649 そうなのですか…。やむを得ないので機種依存するという前提でプログラムを作ってみます。
MSXの改行はchr$(13)だから\rだけど文字コードとかDOS互換のはずだから\r\nだと思う…よーわからんが。
>>722 共通の約数を持ってるかどうかだから、ユークリッドの互助法が適当だろう
726 :
デフォルトの名無しさん :03/05/08 21:39
即死
何もしないウインドウプログラムをC言語・HSPで作ったんですが 動きません。なぜでしょうか。なんだったら自分は そのプログラムをここに書いても構いません。プログラマー目差してるのに早速挫折しそうです。 助けてください。
>>727 正直、向いてないので今からでもサッカー部に入ってJリーグ目指しなさい。
>>727 少なくとも動かないってのはどういうことなのかぐらい書けと。
コンパイルが通らないのか、実行しても何も起きないのか
731 :
デフォルトの名無しさん :03/05/08 21:50
かなり初歩的な質問ですみません。 % a.out abcdeのように コマンドライン引数に"abcde"のような文字列を指定し、 main(int argc, char *argv[])で受け取ると 例えば3文字目の'c'を参照する場合はどうすれば良いでしょうか?
あのな。ちょっとづつ、動くかどうか確認して作ればいいでしょ。
argv[1][2]
>>731 char c = argv[1][2];
>>735 HSPスレで聴いた方がいいんじゃない?
>>730 > 本当に助けて下さい。このままではスポーツもだめ、パソコンも駄目の超駄目人間になってしまいます。
> 助けてください。
2chで教えて君してる時点で既に超々駄目人間。
WinXPでCを勉強してます。 9x時代には\nで改行できたのですが、XPではできなくなってしまいました。 どうすれば改行できるのでしょうか?
既視感
742 :
デフォルトの名無しさん :03/05/08 22:28
>>739 Windowsは\r\nだと言ってるだろ ぼけぇぇぇ
関数テーブルでご質問。 私はいつもこんな感じで関数テーブルを作ってます。 static u_char* (* const fncTbl[])( int a ) = { …… …… }; で、実際の呼び出しは (*fncTbl[2])( param ); って感じです。 が、知人曰く、 1・宣言時に、const って変じゃない? 2・呼び出しはもっとシンプルに fncTbl[2]( param ); だそうです。 1.は別にあっても良いような気がしますが、(書き換えないだろうし) 2.は結構驚きでした。 一応どっちでもうごくみたいですが、どっちが正しい書式なんでしょうか? 無知な私に答えうぉ〜
>>743 > 1・宣言時に、const って変じゃない?
変じゃない。
> 2・呼び出しはもっとシンプルに
> fncTbl[2]( param );
すごく古い処理系では通らないことがある。
>>743 >一応どっちでもうごくみたいですが、どっちが正しい書式なんでしょうか?
どっちもただしい
むしろ「ご質問」がヘン。
char型の変数は -128〜127 しか入れられないと習ったのですが char a[9] = "風林火山"; printf("%s",a); がちゃんと表示されるのは何故なのですか? windowsは日本語の表示に S-JIS を使っていて 127以上の数値も使われていると思うのですが
すみません、ある文字がnull文字かどうかを判定したいんですが この条件式のような比較は許されないんでしょうか? どうやってもsegmentation faultが出るんですが・・・ char c = 'a'; if(c != '\0'){ ・・・ }
>>748 一文字に2バイト使ってるから。
>>749 デバッガを使ってどこで落ちているか確かめてくれ。
きっとポインタの使い方がおかしい。
>748 勉強しなおしたまえ。 2Byteでひとつの文字をあらわしてるんだよ。 "風"とかは二つに分けられてメモリ上に入れられる
752 :
名無し@沢村 :03/05/08 23:54
データを読み込んで、そのデータに応じた画像を横一列に表示するプログラムをつくっています。 横に長くなるので、スクロールバーをつかって表示を切り替えるようにしています。 また画像をクリックしたらその画像の上に縦線を描画するようにしました。 でも画面をスクロールしたときに一番左端にくる画像をクリックした場合、うまく縦線が描画されません。 これがその部分のソースですが、どこが悪いのでしょうか? つまり//マウスをクリックしたX座標が50以下のとき という部分です。ご指導お願いします。 void DrawRline( HDC MemDC) { int i;//editpos スクロールバーの位置 for(i=1;i<=_Index[T];i++) {if(i==1)//_Indexが1のとき { if((mousex>i_x[T][i-1]-(editpos*256)-20) && (mousex<=i_x[T][i]-(editpos*256))) {_Pointa[T]=i_x[T][i]+3-_x_width[T][i]-(editpos*256); break;} } else if(i>1)//_Indexが2以上のとき {if(mousex<50)//マウスをクリックしたX座標が50以下のとき {if((mousex>0) && (mousex<=i_x[T][i]-(editpos*256)))// {_Pointa[T]=i_x[T][i]+3-_x_width[T][i]-(editpos*256); break;} } else//マウスをクリックしたX座標が50以上のとき { if((mousex>i_x[T][i-1]-(editpos*256)) && (mousex<=i_x[T][i]-(editpos*256))) {_Pointa[T]=i_x[T][i]+3-_x_width[T][i]-(editpos*256); break;}}}} SelectObject(MemDC,hPen); MoveToEx(MemDC,_Pointa[T],112,NULL); LineTo(MemDC,_Pointa[T],338); }
>>744-745 即答ありがとうございます。
プログラムってシンプルな疑問ほどサーチエンジン検索で探しにくいので
助かりました。
>>746 確かに(w
慌てすぎ>俺
>>748 が言いたいのはバイト数の問題じゃなくて、SJISは(1バイトずつ分解しても)128以上の数を使うから-128〜127の間に収まらないってことじゃない?
>>749 そのif文自体に問題は無い
cが配列だった場合は
c[i] != '\0'とか
*c != '\0'とか
*(c+i) != '\0'とか。
>>748 > char型の変数は -128〜127 しか入れられないと習ったのですが
これがそもそも間違い。char が符号付がどうかは処理系/コンパイルオプションによる。
また、
>>748 のプログラムでは、符号拡張とかしないので unsigned char でも signed char でも問題ない。
>>750 ,
>>751 すみません。2バイトは分かっているのですが、例えば
「風」は 0x9597 ですよね。16進で95ということは
10進で149…127より大きいんじゃないでしょうか
何か根本的なところが間違っているのでしょうか
759 :
デフォルトの名無しさん :03/05/09 00:02
>>750 コマンドライン引数として受け取った"hoge"とかの文字列を比較してようと
してたんですが、以下のようにmainの一番上に条件式を置いてみたところ
やはりエラーが出ます。どこか間違っているでしょうかか?
int main (int argc, char *argv[]){
int i = 0;
if(argv[1][i] != '\0'){
・・・
>754 じゃぁ、128以上に行くと負の数になる。 二進数で考えなー補数にだ こんなことがあるから unsigned char にするにだ
あ、返事貰ってる・・・失礼しました
>>759 引数がなければNULLにアクセスしてたぶんあぼーん
本当に引数をつけた?
>>756 行き違いになってしまいました。
なるほど分かりました。
みなさんありがとうございました。
>>763 はい。引数ないときはエラー出るようにしてますし、
printf("%c"argv[1][i]);とかで出力しようとすると
ちゃんと'h'とか表示されます。なぜかあの比較式が出たとたん
segmentation faultが・・・
>>759 って言うか、なんで argc 確認しないで if(argv[1][i] != '\0'){ なんて書くんだ ?
767 :
デフォルトの名無しさん :03/05/09 00:09
すいません、初歩的すぎることなんですが… 次のプログラムで足し算をしたいんですけど、 main() { int integer1, integer2, sum; printf("1つめの整数を入力して下さい。\n"); scanf("%d", &integer1); printf("2つめの整数を入力して下さい。\n"); scanf("%d", &integer2); sum = integer1 + integer2; printf("和は %d\n", sum); return 0; } 出力は以下のようになるかと思ったんですけど、 1つめの整数を入力して下さい。 1 2つめの整数を入力して下さい。 4 和は 5 実行しても何も表示されないんです。それで2つの数字を入力してみると、 最後にprintfの文章がまとめて3行表示されるんです。 ほんの通りにやってるつもりなんですが…。どうしてでしょう?? すみません、教えて下さい!
768 :
デフォルトの名無しさん :03/05/09 00:10
charで必ず表せる範囲・・・0〜127 signed charで必ず表せる範囲・・・-127〜127 unsigned charで必ず表せる範囲・・・0〜255 あっている?
>748 char i = 129; printf("%d",i); こんな実験をやってみそ
>768 > signed charで必ず表せる範囲・・・-127〜127 -128〜127
773 :
名無し@沢村 :03/05/09 00:14
データを読み込んで、そのデータに応じた画像を横一列に表示するプログラムをつくっています。 横に長くなるので、スクロールバーをつかって表示を切り替えるようにしています。 また画像をクリックしたらその画像の上に縦線を描画するようにしました。 でも画面をスクロールしたときに一番左端にくる画像をクリックした場合、うまく縦線が描画されません。 これがその部分のソースですが、どこが悪いのでしょうか? つまり//マウスをクリックしたX座標が50以下のとき という部分です。ご指導お願いします。 void DrawRline( HDC MemDC) { int i;//editpos スクロールバーの位置 for(i=1;i<=_Index[T];i++) {if(i==1)//_Indexが1のとき { if((mousex>i_x[T][i-1]-(editpos*256)-20) && (mousex<=i_x[T][i]-(editpos*256))) {_Pointa[T]=i_x[T][i]+3-_x_width[T][i]-(editpos*256); break;} } else if(i>1)//_Indexが2以上のとき {if(mousex<50)//マウスをクリックしたX座標が50以下のとき {if((mousex>0) && (mousex<=i_x[T][i]-(editpos*256)))// {_Pointa[T]=i_x[T][i]+3-_x_width[T][i]-(editpos*256); break;}} else//マウスをクリックしたX座標が50以上のとき { if((mousex>i_x[T][i-1]-(editpos*256)) && (mousex<=i_x[T][i]-(editpos*256))) {_Pointa[T]=i_x[T][i]+3-_x_width[T][i]-(editpos*256); break;}}}} SelectObject(MemDC,hPen); MoveToEx(MemDC,_Pointa[T],112,NULL); LineTo(MemDC,_Pointa[T],338); }
2の補数マシンで char == signed char な環境なら charで必ず表せる範囲・・・-128〜127 signed charで必ず表せる範囲・・・-128〜127 unsigned charで必ず表せる範囲・・・0〜255 じゃないか?
とにかく8ビット入るでええやん。
>>773 どううまく行かないのかくらい書けよ。変数の簡単な説明モナ。
ANSIで保証されるのは
>>768 であっているのでは?
gdbってセグメンテーション違反が起きた場所を探すのに便利だよね。 ほかの使い方は知らない・・・
781 :
デフォルトの名無しさん :03/05/09 00:23
chr型1バイトだろ。0〜127じゃ、残りの128はどうなるのよ
>>772 なんか、limits.h の SCHAR_MIN が -127 のやつがちらほらあるんだがなんで ?
>>781 signed charとunsigned charの重なり合う部分。
符号あり/なしは処理系依存だから。
こんなのも動かないのか? #include <stdio.h> int main(int argc, char *argv[]) { if (argc < 2) return 0; if (argv[1][0] != '\0') puts("hoge"); return 0; }
>>782 2の補数表現を使うとは限らないからでは
>>782 if(0 == ~0) /* 真になっちゃう? */
処理系依存が多すぎでうざいよね
最大公約数を求めるプログラムを作っているんですけど、 下のプログラムでは何がだめなんですかね。 #include <stdio.h> int gcd(int m, int n){ int r = m%n; return gcd(n, r); }
>>778 入力した文字列の英字の部分以外を除外して出力する、という
ガッコの課題です・・・while文の比較式でセグが出ます。
#include <stdio.h>
#include <ctype.h>
char rmv(char);
int main (int argc, char *argv[]){
int i = 0;
int j = 0;
char ss;
char *alp;
if(argv[1] == NULL){
printf("errer!\n");
exit(0);
}
while(argv[1][i] != '\0'){
buf = rmv(argv[1][i]);
if(ss != '\0'){
*(alp + j) = ss;
j++;
}
i++;
}
printf("%s",alp);
return 0;
}
char rmv(char c){ if(isalpha(c) == 0) return '\0'; else return c; }
>>789 nが0かどうかチェックしていないところ。
つーか再帰の終了条件がないじゃん。
*(alp + j) = ss; これはなに?
あ、bufってなってるとこはssの間違いです。。
*(alp + j) = ss; alpはどこを指しているの?
int main (int argc, char *argv[]){ char *alp; if(argv[1] == NULL){ printf("errer!\n"); exit(0); } for (alp=argv[1]; *alp; alp++){ if (isalpha(*alp)) putchar(*alp); } return 0; }
ポインタって主に何に使うの?
アドレスの格納、配列のカウンタ。
配列のカウンタはint変数だろ
>>790 そのコードだけだとしたらalpに実体がないのがアウトだね
char alp[512];
とかしないと。
もう759はほっとけばいいよ。
804 :
デフォルトの名無しさん :03/05/09 00:50
64bitマシンだとintはおそらく64bitになるわけですよね?効率重視で shortやlongはどうなっちゃいましょう? そりゃ規格の許す範囲ならなんでもいいんでしょうけど
shortもlongも今と同じで良いじゃん
longは64bitにして、shortとintはそれぞれ16bit、32bitのままでいい。
>>804 intが64bitになるとは限らない。
32bitのままが主流と思われ。
longやlong longが64bitに割り当てられる場合が多いんでないかな。
intが64bitにならないと言う訳では無いので、過信しないように。
>>807 int==32bitと決めつけているソースがあまりにも多いからしかたなく・・・となんかの記事で読んだ覚えがある。
int32,int64が主流になる。
コンパイルオプションでなんとでもなる
LP64とLLP64でも調べれ
int を 64 ビットにしたら、 16/32 ビットのどちらかしか使えなくなるよね。 char = 8 ビット short ∈ [8, 64] ビット int = 64 ビット long ≧ 64 ビット というか、こういうダサイ仕様はどうにかして欲しい。
>>808 そうなのか!!
int=64bit にすると 32bit 整数が無くなるからだと思ってた。
別に決まっていないのだが… Win64の話か?
short short とか作ればいいかも(w
なんかもう標準でtypedefして欲しい って本末転倒か
C99ってやたらと整数型多くなかったっけか。
long long = 256, long = 128, int = 64, short = 32, short short = 16 こんな感じでたのむ。
256って果てしないな それでも星の数は表せないだろうけど(自信なし)
64bit って13エクサまで表せるんだっけ? もう東京ドーム何個分だよ
int8, int16, int32, int64, int128, int256 で済む話なんだがなぁ。
int8_t uint8_t int_least8_t uint_least8_t int_fast8_t uint_fast8_t はあ
>>757 俺も俺も。
あと、if ( c == 0 ) は、 if ( ! c ) だな
つーか、もはや LP64 がデフォルトだろ
if(c) if(!c) は悪。
真偽値以外は使わないよう心がけてます
読みやすいじゃん p = (char *) malloc( 1024 ); if(! p) { とか
p は何よ、みたいな。
宗教論争になりそうだが… 真偽値が int だったり bool値(true, false)だったり仕舞いには void* だったり、条件式中で使い分けるのが面倒だから ! 派
>>829 if(!(p=(char *)malloc(1024)))
switch(1) case 比較式or非定数式: みたいなことができればいいのに。
>>833 多くの場合ジャンプテーブルに展開されるから、今からそれやるのは無理。
有ればいいとは思うのだが。
2分木探索プログラムなのですが 以下のような関数を作成しました。 int search(int key , tree *node , tree *findnode){ if(node->key == key){ findnode = node;//error 戻った時にfindnodeがNULLポインターになってる。 return 1; } if(node->key < key){ if(node->left != NULL){ if(search(key , node->left , findnode) == 1){ return 1; } } }else{ if(node->right != NULL){ if(search(key , node->right , findnode) == 1){ return 1; } } } return 2; } findnodeに見つかったノードのアドレスをコピーして戻るということをしているはずなのですが return 1;で戻った直後findnodeがNULLポインタに戻ってしまいます。 どこが間違っているのでしょう(^^;よろしくお願いしますm(_ _)m
>>835 そりゃ当然だと思うが…
void f(int a) {
a = 1;
}
b = 0;
f(b); /* bは1になるか?(ならない) */
と同じだよ。
*findnode = *node;
にすれば実体が代入されて幸せになれる(かもしれない)。
どうしてもポインタがほしいというのならば、パラメータfindnodeは
tree **findnode
と宣言して、
*findnode=node;
とやるしかないだろね。
837 :
デフォルトの名無しさん :03/05/09 03:58
>>836 ありがとうございます。
そういわれればそうですね。
tree *findnode
で宣言してたのでポインタ扱ってるはずなのになぁ(´-`).。oO
とつまってました。
もう一度!ありがとうございましたヽ( ´ー`)ノ
ctime関数で時刻表示した後改行したくないぃぃーッ! って時はどうしたらよいですか?
840 :
デフォルトの名無しさん :03/05/09 10:23
33188のような8ビット数字列を -rw-r--r--のようにファイルモードと許可ビットの文字列に 変換するにはどう処理を書けば良いでしょうか。 宜しくお願いします。
時刻表示する ctime の実装なんてあるの?
>>840 33188は8bitでは表せないと思うが
int mode = 33188;
char buf[12];
sprintf(buf, "%c%c%c%c%c%c%c%c%c%c",
S_ISDIR(mode) ? 'd' : S_ISFIFO(mode) ? 'p' : S_ISLNK(mode) ? 'l' : 中略 '-',
mode & 0400 ? 'r' : '-',
mode & 0200 ? 'w' : '-',
mode & S_ISUID ? mode & 0100 ? 's' : 'S' : mode & 0100 ? 'x' : '-',
mode & 0040 ? 'r' : '-',
mode & 0020 ? 'w' : '-',
mode & S_ISGID ? mode & 0010 ? 's' : 'S' : mode & 0010 ? 'x' : '-',
mode & 0004 ? 'r' : '-',
mode & 0002 ? 'w' : '-',
mode & S_ISVTX ? mode & 0001 ? 't' : 'T' : mode & 0001 ? 'x' : '-');
>842 えっ、どうやるんですか??
>>843 わざわざありがとうございます。
これほど面倒な処理だとは・・・
>>839 ctime() だけでは表示しないと思うがこんな幹事か?
const char *p=ctime(&t);
printf("%.*s", strlen(p)-1, p);
>>844 >>845 は無視するとして、ctime()の戻してきた文字列から改行コードを探し出して消してしまえばいい。
str = ctime(...);
strchr(str, '\n')[0] = '\0';
ctime()の戻す文字列は、最後が改行なのが保証されているからこれで充分。
補足
ctime()の戻す領域は使い回されるので早めに他の文字列に引き取るか
表示しないといけないので要注意。
つーか、表示するだけなら
>>847 でよかったか。
ありがとうございましたー!どうもー
シフトすればいいんじゃない?
#include <stdio.h> #include <stdlib.h> void cofactor(int *a,int n,int i,int j,int *b){ int k,m; for(k=0;k<=n-2;k++){ for(m=0;m<=n-2;m++){ if(k<i&&m<j){b[k*(n-1)+m]=a[k*n+m];} else if(k<i&&m>=j){b[k*(n-1)+m]=a[k*n+(m+1)];} else if(k>=i&&m<j){b[k*(n-1)+m]=a[(k+1)*n+m];} else if(k>=i&&m>=j){b[k*(n-1)+m]=a[(k+1)*n+(m+1)];} else {printf("error\n");} }}}
int main(){ int *a;int *b;int i,j,n; printf("n*n行列aの余因子を求めます!\n");printf("n=");scanf("%d",&n); if(NULL==(a=(int *)malloc(n*n))){printf("No memories!");return 0;} if(NULL==(b=(int *)malloc((n-1)*(n-1)))){printf("No memories!");return 0;} printf("aの要素をa00からa(n-1)(n-1)迄順番に入力して下さい\n"); for(i=0;i<=n-1;i++){ for(j=0;j<=n-1;j++){ printf("a%d %d =",i,j);scanf("%d",&a[i*n+j]);}} printf("aの入力が終わりました\n"); for(i=0;i<=n-1;i++){ for(j=0;j<=n-1;j++){printf("a%d %d = %d ",i,j,a[i*n+j]);} printf("\n");} printf("i,j成分に関する余因子bを求めます\n"); printf("i=");scanf("%d",&i);printf("j=");scanf("%d",&j); cofactor(a,n,i,j,b); for(i=0;i<=n-2;i++){ for(j=0;j<=n-2;j++){printf("b%d %d =%d ",i,j,b[i*(n-1)+j]);} printf("\n");} return 0;}
まじでそんな見づらいコード書いているの!?
>852-853はn*n行列aから、余因子を求めるプログラムなのですが 上手くいきません。 エラーもなくコンパイルできるのですが、 間違った値がでてくるんです。 例えばaを a[]={1,2,3,4,5,6,7,8,9} という3*3行列にして i=0;j=2; とした時に、本来は b[]={4,5,7,8} とならないとおかしいのですが b[]={4,4,7,8} となってしまうんです。 もう泣きそうです、助けてください!
857 :
デフォルトの名無しさん :03/05/09 13:37
if(NULL==(a=(int *)malloc(n*n))) ==を=と書いてしまった時にエラーがでるようにするためらしいけど、激しく違和感があるね。
>857 それはメモリが確保できなかった時に終了するルーチンです 持ってる教科書にこんな感じの例が載ってたので・・・
つーかこの場合はNULLを後にしてもエラーでるじゃん・・・
>859 並び順も教科書そのままなんです 「実習C言語」っていうのに書いてありました
×NULLを後にして ○NULLを後にして==を=にして
>>856-857 >>859-860 >>862 分かんねえなら、いちいちレスすんなカス共
どうせ数学はリア厨以下なんだろ? 知ったかクン?
バカの癖して、しょうもねえとこばっかツッコミ入れやがってこの能なし共が!!!
おまえらみたいなカス共に期待した俺が浅はかだった
もういい、こんなとこ二度と来ねえよ
んじゃなカス共
>863 偽者死ね
"a"はアドレス、*"a"はそのアドレスの中身ってことで良いですか?
b0 0 =4 b0 1 =5 b1 0 =7 b1 1 =8 だそうだが?
>>853 > if(NULL==(a=(int *)malloc(n*n))){printf("No memories!");return 0;}
> if(NULL==(b=(int *)malloc((n-1)*(n-1)))){printf("No memories!");return 0;}
おいおい、int のサイズは1バイトじゃねー処理系が多いぞ。
>866 え? 本当ですか? 私の環境では b0 0 =4 b0 1 =4 b1 0 =7 b1 1 =8 になってしまいます。 私のPCが故障しているのでしょうか・・・
あと、cofactor() 内の if 分は 行/列で分けて考えればもっとすっきりする。 また変数を全て一文字にするのはわかりにくく間違えやすい。 void cofactor(int a[], int n, int xi, int xj, int b[]){ int i, j; int si, sj; for(i = 0; i <= n - 2; i++){ si = i < xi ? i : i + 1; for(j = 0; j <= n - 2; j++){ sj = j < xj ? j : j + 1; b[i * (n - 1) + j] = a[si * n + sj]; } } }
>869 有難うございます 参考になります
>871 いえ さっぱり
(・∀・)
分かりました! int型はCPUによって違うけれど大体2or4バイトになっている。 故にn*nのint型を確保したいなら 4n*4nの領域を確保していれば良い。 よってこう書き換えればよい。 if(NULL==(a=(int *)malloc((4*n)*(4*n)))){printf("No memories!");return 0;} if(NULL==(b=(int *)malloc(4*(n-1)*4*(n-1)))){printf("No memories!");return 0;} ということですね
sizeof
>>872 C言語ができるぞと威張りたいとかなら別だが、Cなんかやめて VB とかにした方がいいよ。
せめて、C++ にでもしろ。malloc() は、お前には早すぎる。
>>874 もういいよ、int が 16バイトになるまでは時間は十分あるし、今時少々メモリーを取り過ぎたってどうてことないから。
>875 有難うございます sizeof(int)でint型が何バイトかを取得できるのですね これを使えば、環境に依存しない形で書けるみたいですね >876 VB使える環境ないです・・・ C++ですか、勉強してみます
>879 int型が何バイトになるかは環境によって違うということですよね?
if(NULL==(a=(int *)malloc(n*n*sizeof(int)))){printf("No memories!");return 0;} つまり、これでint型のn*n行列を確保できる、と
874では n*n*sizeof(int) とすべき所を n*n*sizeof(int)*sizeof(int) にしてたんですね・・・
>175K&Rを買いませう
皆さん有難うございます!
mallocの部分を直したら正しい結果(
>>866 さんの書いた結果)が出るように成りました!
>883 有難うございます 今度さがしてみます
886 :
デフォルトの名無しさん :03/05/09 18:16
graph.hファイルはどのようにして入手すればいいのでしょうか?
>>886 TurboCとかDOS用のコンパイラのソースを動かそうとしてるの?
いま持ってるコンパイラに付属してなかったらあきらめたほうがいいよ。
888 :
デフォルトの名無しさん :03/05/09 18:32
memcpyてどうやって使うの?
貴方には無理。
GPUそのものの開発や、関連の開発に携わると、 int が 128bit でもいいかな、いや、256でも イイ! と思ってしまう...
typedef で勝手に定義しる
memcpy(dst,src,size);
893 :
デフォルトの名無しさん :03/05/09 23:25
すみません、教えて頂けないでしょうか。 gccで (test1.c) #include <stdio.h> #ifdef PTR_G_STR extern char *g_str; #else extern char g_str[]; #endif int main(void) { return printf("%s\n",g_str); } (test2.c) char const g_str[] = "this is test."; とすると、 -DPTR_G_STRしない=>正常動作 -DPTR_G_STRする=>Segmentation Fault になってしまいます。 K&Rにはchar a[] => アドレス固定;char *a =>アドレス不定 のような事が書いてあったのですが、いまいち釈然としません・・ 上の場合、test1.c内での g_strのアドレスはどのようにして決められるのでしょうか?
>>893 char const g_str[] = "this is test.";
の g_str は配列であってポインタではない。
また、const である。
従って
extern char const g_str[];
が正しい。
すなわち、貴方のコードは 2 つとも誤っている。
>>893 当然です。配列とポインタは全く異なるものだからです。
定義したとおりに宣言しなくてはなりません。
これだけでは何なので。 ポインタ変数=データの位置情報(ポインタ)を入れる変数 配列=データの羅列 であり、根本的に両者は異なる。 ポインタ変数の場合はデータの位置(ポインタ)を使って 間接的にデータにアクセスするが、 配列の場合はデータに直接アクセスする。 上の例の const char g_str[] = "this is test."; は配列である。 すなわち、文字列がそのままデータとして置かれている。 これを extern const char* g_str; で参照しようとしても、 「置かれたデータのどこにもポインタが存在しない」のである。 この状態では g_str の先頭数バイトに入っているデータをポインタとして無理矢理認識し、 そのポインタを使ってデータを参照しようとする。 しかし、そんなポインタが正常に働くわけも無く、Segmentation Fault になるのである。
FAQだったんですね・・軽く吊ってきます ありがとうございました >894,895
>「実習C言語」っていうのに書いてありました もう大分昔に出た悪書ですな。 入門C言語とか応用C言語とかと3部作になってた気がする。 大体、三田某の書いていること信じたら駄目になるってば。
みたぼん【三田本】(mi・ta・bon)
901 :
デフォルトの名無しさん :03/05/10 00:32
フーリエ変換だとかウェーブレット変換だとか ああいう波形解析のプログラムってどうやって 書いてんの? とりあえず俺はCしか知らないから ここで聞いてみたわけだけど。
902 :
デフォルトの名無しさん :03/05/10 00:36
http://www1.neweb.ne.jp/wb/prof/ 平成15年度 自作板PC環境調査 最新結果(一部抜粋)
◆4月分の結果が出ました。現在は5月分に移行しています。◆
平均年齢 25.4歳
ネット(2ch含) 78.7%
ゲーム 59.0%
Windows XP Family 46.9%
Windows 2000 Family 34.4%
Athlon 45.3%
Pentium 4 29.7%
平均RAM搭載容量 780MB
平均HDD搭載容量 166GB
nVIDIA 49.2%
ATI 28.9%
DVD-R/RW/マルチ 20.4%
CD-R/RW 75.9%
光ファイバー 8.3%
ADSL/xDSL 64.5%
CRT 74.6%
LCD 25.4%
>>901 どうやって、ってどういう意味で?
アルゴリズムならぐぐれ。
言語はどれででも書ける。
FFTは、C、FORTRAN、アセンブラで書かれた物が多い。
904 :
デフォルトの名無しさん :03/05/10 01:37
>>903 アルゴリズム。
FFTはなんとなくわかりそうだけど
DWTはなんかよくわからん。
もしオススメのサイトあったらキボンヌ
DSPでやるかパソコンでやるか。 お金とか、でいろいろ。
>>905 「こいつ」というのは、本のことか、著者のことか?
908 :
デフォルトの名無しさん :03/05/10 11:46
if(a)みたいに条件式が無いやつはどういう意味ですか?
a は立派な「式」だぞ。
普通の人は式だと思わない。 これは正常。
>>912 大丈夫だ。99%の本は不親切だ。
初心者向けに薦められる本などない。
>>912 始めたばかりの癖に
「不適切な教本」という評価を下せる
お前に乾杯!
真って非0だったっけ。
ごめ。非0で条件分岐したわ。1だけっていう勘違いでした。 if(5) printf("true\n");
918 :
デフォルトの名無しさん :03/05/10 12:57
おい、画像の表示方法おしえろ。 本とかネットで探してもあんまりそういうの見当たらないんだ。 どういう風に表示するんだ? 画像処理の関数とかがあんのか?
919 :
デフォルトの名無しさん :03/05/10 13:04
921 :
デフォルトの名無しさん :03/05/10 13:09
graph.h後から入れるのはやめたほうがいいのか。 入ってるコンパイラってどんなのがありますか?
922 :
デフォルトの名無しさん :03/05/10 13:10
おい、文字列の代入方法おしえろ。 本とかネットで探してもあんまりそういうの見当たらないんだ。 どういう風に代入するんだ? 文字列代入の関数とかがあんのか?
>>922 は俺じゃねぇぞ
真似すんな低脳。
そんなレベルのことならネットで調べろ。
OSに依存するんだな。
OSはWINだ。
画像処理系は難度が高いのか?
それともわざわざ解説書作っても需要が無いからなのか?
お前みたいな頭の沸いたヤシはJavaでも使ってろ
*pointer="文字列";
>>923 環境に依存するかどうかわからないやつに低脳などと言われたくないよ。
ふーん(;´Д`)ハァハァ
>
>>922 は俺じゃねぇぞ
わざわざ言うほどのことか?
930 :
デフォルトの名無しさん :03/05/10 13:16
VBか。VBはちょっと触ったことがあるんだが、 VBじゃ駄目なんだ。Cをやりたいんだ。 でも初心者なんだからVBからやりなよ、 なんておせっかいはまっぴらごめんだぜ。 C++でも比較的簡単に表示できるみたいだが、 C言語では難しいのか? C言語のグラフィック処理の資料が見当たらないのだが。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo!
932 :
デフォルトの名無しさん :03/05/10 13:18
お前等な、スキルあるから調子に乗りやがってなまいきだな。 俺も早くそれくらいのレベルになりたいな。 おい、グラフィックどうやって表示するんだ? 簡単な例を示せ。
933 :
デフォルトの名無しさん :03/05/10 13:18
>>918 私、Cでは制御系しか作ったことないわよ。画像なんて聞いたことないわ。
自動販売機、エレベーター、パチンコの看板、ETCとか作ったけどね。
画像をいじりたいならJavaで決まり。サウンド系弱いけど画像は結構できる。
VBなんてレベルの低い人しか使わないよ。
看板?
デモンストレーション?
>>931 なるほど、お前なかなかの切れ者だな。
GUIか、言葉だけ知ってて内容知らんから、とりあえず、
C言語で何ができるかどうか調べてみる必要がありそうだな。
質問はやめておいてしばらく「GUI」というものについて調べてみる。
また理解できてきたら質問しに来るからな。
また答えろよ。
グラフィカルウザーインターフェース
Java厨もVB厨もウセロ、ここはC言語スレだ
>>936 またのお越しを心よりお待ちもうしあげております。
やはり休日は釣り人が多いな。
>>938 VBはともかく、JAVAに導くのは妥当だと思うが。
942 :
デフォルトの名無しさん :03/05/10 13:23
ピカピカくるくる電飾が動いてるでしょ。 それよ! 配列で電球全てを制御して最後はちょっとやばいことになったけど 一度納入するとバグがなければ壊れるまでだからこれが一番手を抜いたわ!
943 :
デフォルトの名無しさん :03/05/10 13:24
俺は質問しに来ただけだ、 うせろ、雑魚が。 プログラムを動かすには コンピューターの総合的な知識が必要だってこと、 プログラムいじってみて分かった。 お前等ホント、パソコン好きだな。 俺も中学生くらいからパソコンいじっておけば良かった。 今の子供はパソコンが一家に一台の時代だから羨ましいぜ。
> 一度納入するとバグがなければ壊れるまでだからこれが一番手を抜いたわ! なんで手を抜くんだ
Java厨しつこい
948 :
デフォルトの名無しさん :03/05/10 13:28
プログラマーとは如何に手を抜くかを考えるものよ・・・ 効率、信頼性なんて二の次よ!
次スレヨロ↓
950 :
デフォルトの名無しさん :03/05/10 13:31
うし
次スレは 【プログラマは如何に手を抜くか?】 かい
たててくる
955 :
デフォルトの名無しさん :03/05/10 13:36
なんてこと言うの! プログラムなんてあってないようなもの製品がきちんと動けば どう書こうが関係ないわ””どうせ見れないし。 社長が来てこのコードおかしいなんていうわけがない。 go to文Javaではbreak point:を使おうが関係ないないのよ。 でも今まで使った人見たことないけど。やっぱり会社で禁止されてんのかな?
バカはどっか逝け
957 :
デフォルトの名無しさん :03/05/10 13:40
おい、病的にお人よしでおせっかいな奴いねぇのか? とっとと教えてくれ。
958 :
デフォルトの名無しさん :03/05/10 13:41
病的折衷がらくた言語
959 :
デフォルトの名無しさん :03/05/10 13:42
ShowImage(b,i);
GUI “など” の “標準Cではできない事” の質問は使用している “開発環境のスレ” へGo!
C04では標準になるらしいが、今はまだ非標準。
964 :
デフォルトの名無しさん :03/05/10 13:45
CでC++を使う方法を教えてけろ
int C; C++;
#include <C++>
969 :
デフォルトの名無しさん :03/05/10 13:47
だからCで画像うんぬんは無理があるのよ。 Javaにしなさい。パッケージawtのGraphicsクラスのメソッド g.drawImage(im,50,50);で一発で出るのよ。(imはImageで初期画済みね!gもGraphicsで) コード全部で10行いかないわよ。
970 :
デフォルトの名無しさん :03/05/10 13:48
コンパイラを落としてインストールしたんですけど、ネットで調べたらリンカーというものも必要だと知りました。 Windows2000で動くリンカーを教えてください。
…本気でJAVA厨がウザくなってきた
次スレまだぁ〜?チンチーン
>>972 さっきから訊こうと思ってたんだが。
何故そこまでJAVAを嫌う。
<img src="image.jpg">
JAVAが嫌いなわけじゃない、スレ違いなネタを続ける奴が嫌いなだけ
979 :
デフォルトの名無しさん :03/05/10 13:56
キーボードから入力された文字列を、配列に格納する際の質問です。 char str[10]; fgets(str, 10, stdin); こう記述されいると、strに格納されるのは9文字(+ヌル)ですよね。 もしキーボードから入力されたデータが15文字くらいあった場合、 文字数が多すぎて配列に入り切らないという旨のエラーを表示させたいんですが、 文字数はどうやって判断したらいいのでしょうか? 最初は改行文字が格納されているかどうかで判断しようと思っていたのですが、 9文字丁度の文字列が入力された場合の処理がよく分からなかったので。 なにかいい方法はありますか?
980 :
デフォルトの名無しさん :03/05/10 13:57
test
>>979 入力を促す時点で、制限バイト数を提示してはどうかね。
983 :
デフォルトの名無しさん :03/05/10 14:10
あんたなに言ってのよ! fgetsはファイルから1行読み込むのよ。 char *str; int flag=0; do{ if(flag==1) printf("もう一度入力しろアホ"); gets(str); if(10<(strlen(str))) break; flag=1; }while(1); まったくJava嫌いの人はどっかいっちゃったの?
>>979 fgets(str, 11, stdin);
>>979 多めに取得して strlen() で判定。
>>979 getchar() で一文字ずつ判定。
988 :
デフォルトの名無しさん :03/05/10 15:30
本当に長さが分からないなら
>>987 も手ではなかろうか。てかそれしか
ないような。Cを使う理由が無いなら C++ を使う。
>>988 どうせお前は プ しか書けないんだから、でてくんな。
うめうめ。
昔はfgetcの関数呼び出しのオーバーヘッドも無視できなかったなぁ
たてたて
995
996
1000
1000!!
1000?
うひゃうひゃうひゃ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。