【ANSI-C】 C言語なら俺に聞け! Part 127
プログラミング経験なしなんですがCを学ぼうと思います まずなにをすればいいんですか? サイト見ても本屋行ってもなにすればいいかちんぷんかんぷんです
先ずは参考書とコンパイラと呼ばれるものをそろえる。 参考書はテンプレにあるスレを回ればいろいろ書いてある。 一冊で全て覚えようとするよりも、自分のレベルに有った物を段階的に探そう。 次にコンパイラ、簡単に言えば書いたプログラムを実行するためのもの。 無料・有料の物がある。 お金があれば使い勝手の良い物や、手間をいろいろ省いてくれるようなものが手に入る 「無料では作れない」ではなく、有料の物に比べて手間暇が掛かることがあるということ。 学習するだけなら最初は無料の物ですまし 慣れてきてから、他に良い物が無いか探した方が金銭的には優しいかと。
ありがとうございます! わかりました やってみます
6 :
デフォルトの名無しさん :2006/05/12(金) 12:54:03
#define ABS(x) (((x) < 0) ? -(x) : (x)) とあるのですが、 (((x) < 0) ? -(x) : (x)) を '?'や':'を使わずに表すとどういう意味になるんでしょうか?
>>6 (((x) < 0) * -(x) + (!((x) < 0)) * (x))
9 :
デフォルトの名無しさん :2006/05/12(金) 13:18:34
(x)が0より小さかったら-(x)、そうでなかったら(x)
>>10 お〜。そんな意味だったんですか!
if文に似てるということは知ってたんですが、詳しくは知らなかったのでどうもありがとうございます。
12 :
6 :2006/05/12(金) 13:34:52
もう一つお聞きしたいのですが、'?'や':'を用いたものは何と呼ばれているのでしょうか? ?文などで検索してもヒットしないので・・・
三項演算子
14 :
7 :2006/05/12(金) 13:45:18
三項演算子を使わずに(ほぼ)等価のコードを書いたのに無視された…_/ ̄|○ 他の言語だとif()とかiif()とかって関数だったりするね。
※覚えたての時はやたら使いたくなるので注意
※さっきの例でABS(x)のxに関数を代入したら、その関数は3回呼ばれるので注意
17 :
まなみ :2006/05/12(金) 13:58:39
はじめまして C言語の二次方程式のプログラムが わからなぃですぅ(><) だれかぉしぇてくださぃ
19 :
まなみ :2006/05/12(金) 14:02:39
ぁりがとぅござぃます
なんで、ポインタが高速と言われていたのか教えてくれないか? できれば、コンピュータがどのようにして処理をしているかも書いてくれたら凄く嬉しい。 低レベルでスマソ
>>20 あんたに「ポインタが高速」と言う知識を与えた資料に当たれ。
このスレ的には、「ポインタが高速」なんて概念はない。
strcpy
23 :
デフォルトの名無しさん :2006/05/12(金) 15:42:03
>>20 > なんで、ポインタが高速と言われていたのか教えてくれないか?
誰かがそう言っていたから。
> コンピュータがどのようにして処理をしているか
板違い
>>20 例えば strcpy を実装するのに
char* strcpy(char *p1, char *p2) {
char *ret = p1;
while((*p1++ = *p2++)) { }
return ret;
}
と
char* strcpy(char *p1, char *p2) {
int i;
for(i = 0; (p1[i] = p2[i]); ++i) { }
return p1;
}
の二通りの実装が考えられるが、
i とポインタの両方を使って参照するよりは、
ポインタを進めてポインタのみで参照した方が速い・・・
と言われてた時期があった。
今では下のコードも上のやつに最適化されるので
こういうことに気を回す必要はない。
細かいことはコンパイラに任せて、
直感的に分かりやすい下の方を使え。
25 :
デフォルトの名無しさん :2006/05/12(金) 18:56:31
質問です。 javaでは配列aの長さをa.lengthで得ることができますが、 cでは.lengthにあたるものはないんでしょうか。 コマンドラインから ./a.out 2 4 5 としたときにargv(mainの引数の配列)の長さ3を得たいのですが。
でも一般的に(静的に固定長じゃない)配列の長さを得る手段はCにはないね。
28 :
デフォルトの名無しさん :2006/05/12(金) 19:18:54
>>26 今までargcの意味をわかっていませんでした。ありがとうございます。
>>27 そうなんですか。javaは便利ですね。ありがとうございました。
ついでに言うと、argv[]はNULLターミネートもされている。 argv[0]は(どこぞにある)"./a.out"を指し、 argv[1]は(恐らくはargv[0]の近くにある)"2"を指し、 以下同様に argv[3]が"5"を指して、 argv[4]はNULLということ。
以下のような関数を作ったのですが どうしても不可解なことが起こるので 質問させてください。 下のものはある関数を作る途中で 不具合がおきて、それの検証を するために内容を減らしたものです。 関数としては意味の無いことを してますが、なにとぞよろしくお願いします。
32 :
31 :2006/05/12(金) 21:00:14
void *takeword(char *str){ char *p,*q; p=(char *)malloc(sizeof(str));/*pのメモリー確保*/ q=(char *)malloc(sizeof(str));/*qのメモリー確保*/ if(p==NULL||q==NULL){/*メモリ確保できないときのエラー*/ printf("メモリー確保失敗\n"); exit(1); } strcpy(p,str);/*入力strをpにコピー*/ printf("p=%s",p);/*pを画面出力*/ strcpy(q,p);/*pをqにコピー (ここがどうもおかしいです)*/ printf("q=%s",q);/*qを画面出力*/ } 結果としてqに正しくpの内容がコピーされません。 原因わかる方いましたらよろしくお願いします。 環境:winXP lsi C-86
33 :
31 :2006/05/12(金) 21:03:21
参考までにソース貼っておきます #include<stdio.h> #include<string.h> #include<stdlib.h> void *takeword(char *str,int num); main(){ char x[20]="abc efg\n",*y; takeword(x); } void *takeword(char *str){ char *p,*q; p=(char *)malloc(sizeof(str)); q=(char *)malloc(sizeof(str)); if(p==NULL||q==NULL){ printf("メモリー確保失敗\n"); exit(1); } strcpy(p,str); printf("p=%s",p); strcpy(q,p); printf("q=%s",q); }
sizeof(str) ↑ は str というポインタ変数のサイズ(4 バイト)になる。
35 :
31 :2006/05/12(金) 21:06:04
すません main内1行目*yがけし忘れ。 ソース5行目のtakewordの引数 int numがけし忘れです。 すません>< よろしくおねがいします
>>31 sizeof(str)で得られるのはchar型ポインタのサイズである4
37 :
31 :2006/05/12(金) 21:17:42
そこでしたかぁ><ありがとうございます! もし入力されたcha型ポインタが指す文字列が 十分入る文字列を確保したい場合は while(*str){ i++; } p=(char *)malloc(i*sizeof(char)) て感じですかね(@@) 丸投げですいません。ありがとうございます!
何で strlen を使わないんだろうか・・・
39 :
31 :2006/05/12(金) 21:33:55
問題解決しました! ありがとうございました〜☆
文字列終端のヌル文字用の 1 を足してない悪寒
それ以前に無茶苦茶じゃん
43 :
デフォルトの名無しさん :2006/05/12(金) 22:38:19
printfで floatの出力指定が%f、doubleは%lfだと信じてる人が多いのは 嘆かわしい限り。 scanfと同じだと思ってるんだろう。 特に大学の先生にもdoubleは%lfだと教える人がいる。 間違いの再生産だ。
少なくともmanに従えば、%lf@printfは未定義動作なんだよな だが実際には大して問題が起きないから困る
45 :
デフォルトの名無しさん :2006/05/12(金) 22:52:41
doubleもfloatも%fが正しいの? Linuxとかだと%lfで定義されてたりするんじゃね?
そもそも、可変個引数に小数を渡す際、 float は double に変換される。 こいつらを区別する手段が無い。
47 :
デフォルトの名無しさん :2006/05/12(金) 23:03:33
...に対応する引数にfloatを書いたらdoubleに昇進するからね。
大抵 %lf でも %f と同じように動作するんだけどね。 ただ、仕様で保証されてるわけじゃない。
C99から規格上でも %lf で double に対応するようになってなかったっけ?
C99 では、ね。
51 :
43 :2006/05/12(金) 23:46:50
>>49 >>50 C99では%lfもOKというのはホントですか!?
新ANSI C言語辞典の最新版にはそういう記述は無かった。
C99ではlong dobuleに%Lfという記述はよく見ますけど。
本来、「l」(小文字のエル)は整数型に対して使われるもの。
googleで調べましたが、C99ではlong doubleが%Lfというのばかりで、
doubleが%lfでもOkというのは見つけられなかった。
どこかにそういう記述のページはないでしょうか?
53 :
43 :2006/05/12(金) 23:54:36
>>53 基本的にはそのサイトがやったらと詳しいわけだけど、自分で調べる方法も身に付けたほうがいい
ここのページで
http://www.jisc.go.jp/ JIS検索 → JIS規格番号からJISを検索 "X3010" と入力 → プログラム言語C
とすれば、JISのC言語規格が見られる
日本語に訳されてるけど、C99と同内容
ちなみにポップアップを許可しないと見れないからそこんとこのブラウザ設定に注意
>>52 のサイトと、このJIS X3010ってテンプレに入れたほうがよくね?
55 :
43 :2006/05/13(土) 00:10:54
>>54 これまたどうも。
pdfファイルだけどスキャンしたものですね。文字情報が入ってないから
検索できない・・・
>>51 "新"ANSI C言語辞典 といっても1997年発行だからC99は載ってないよ
57 :
43 :2006/05/13(土) 00:33:54
X3010、確認しました。 fprintf関数の項目で、p.199に l(エル)は整数型がlongであることの指定だけれども、 %lfとした場合は、「何の効果もない」と書いてありました。 fについては「double型」というのが正しいのですね。 X3010には一言もfloat型とは書かれていない。 つまりfloatはdoubleに変換されるわけで、結局、fは double型用、ということなのでしょう。 C99以前は%lfは未定義だけど、大抵は%fとして動作。 C99では、%lfの「l」は何の効果がなく、%fと同じ動作。 だから、正しいのは「doubleは%f」。 doubleに%lfは、誤動作はしないけど%fとしての動作が保証される。
C89 では正しいのは %f のみ。 C99 では %f も %lf も両方正しい。 ただ、float と double を区別するわけじゃなく、 両方 double に対する書式になる。
59 :
43 :2006/05/13(土) 01:11:08
>>58 C99で%lfが正しいとX3010に書いてあるんですか?
fprintfの「l」のところには、%lfが正しいとは書いてありませんでした。
「l」が「f」の前に使われた場合には、何の効果もない、とは書いてあります。
fprintf (printf)の説明以外の箇所に、%lfが正しい、と書いてあるのかなぁ??
ここだけしか読んでないから確認出来ませんでしたが。
>>59 だから、「何も効果がない」と定義されてるっしょ?
%lfになんか恨みでもあんのか?親の仇か?
>>34 、
>>36 どうでもいいけどポインタのサイズは4と決まっているわけではない。
ex.. >31の使っているLSI-Cでは2バイトだ。
63 :
43 :2006/05/13(土) 08:07:38
>>60 つまり、X3010には、printfのdoubleの指定子は%fであり、
%lfとかいても、その「l」は何の効果もないだけであって、
%lfも正しいdoubleの指定子であるとは書かれてないのですね。
それが確認できればOKです。
>>61 scanfと同様にprintfでもfloatが%f、doubleが%lfだと
単純に信じて疑わない人が非常に多く、大学教員までもが
そのように授業で教えている事に問題を感じているわけです。
規格は規格。正しく理解していなければならない。
>>63 %lf は %f と等価な動作をすると
C99 の規格では決まってるんでしょ?
正しくないってのは、動作が未定義な場合。
この場合動作が定義されているんだから、
即ち、%lf は double に対する正しい指定子だ。
65 :
43 :2006/05/13(土) 08:51:24
>>64 X3010では、doubleの指定子は%fだと明記。%lfもOKだという記述はない。
X3010には、%lfと書いても「l」が無視される(効果なし)と書いてある。
以上が全て。
あとは日本語の表現の仕方の問題。
>>65 疲れるな・・・。
効果無しと定義されてるんだから、正しいだろ。
67 :
43 :2006/05/13(土) 08:54:11
>>65 修正。
X3010では、doubleの指定子は%fだと明記。指定子が%lfであるとの記述はない。
X3010には、%lfと書いても「l」が無視される(効果なし)と書いてある。
68 :
43 :2006/05/13(土) 08:55:03
>>66 これはもう日本語の解釈、表現方法の問題。
いや、違うだろw %lf の l が無視されるってことは、 %lf は %f と同じ効果を示す事が 「規格で保証されている」わけだ。 これで %lf が正しくないとしたら何なんだよ。
次のような配列の参照渡しでつまづいてます func(int*); int main() { int a[4], b[2][2]; func(a); func(b); これではbの参照渡しで警告が出てしまいますが &b[0][0]を使わずに回避する方法はないのでしょうか
>>70 a,bは型がちがうから、素直な方法では、回避できない。
funcを別々に作るしかないかな うまい方法あんのかね?俺は知らない
キャストすりゃいいじゃん
74 :
70 :2006/05/13(土) 12:02:02
確かに(int*)でキャストすれば警告されなくなりました
aとbの型の違いが理解できていませんでした
とりあえず多次元配列の型は別物なんだと考えておきます
>>71-73 thx
75 :
43 :2006/05/13(土) 13:16:54
>>69 X3010には、doubleの指定子は%fだとしか書かれていない。
double の指定子が%lfだとは「一言も」書かれていない。
したがって、doubleの指定子は、「%f」である。
%lfは、あくまでも%fと同じ動作をすると規格が保証しているだけ。
規格で「doubleの指定子が%fだ」と明記されているのとは意味が違う。
この時点で、X3010では%fと%lfが同等の扱いを受けていないことは明白。
ちなみに、C99では%lfが正しくない、とは、私は一度も発言したことはない。
この話はもう終わり。ループするだけ。
ひねくれ者の俺はこれからは%lfバンバン使うことにしますた
コンパイラが可変個数引数の関数のタイプチェックをする時代だからな。
>>75 > %lfは、あくまでも%fと同じ動作をすると規格が保証しているだけ。
これを同等の扱いと言わずして何と言う。
80 :
43 :2006/05/13(土) 15:27:06
>>79 %fは、doubleの指定子だと明記されている。
%lfは、doubleの指定子だと明記されていない。
%lfのlは、「効果がない」と書いてあるだけ。
どう考えても同等の「扱い」ではない(「機能」は同等であっても)。
「%lfも%fと同様にdoubleの指定子である」と
規格書に書いてあれば、それは同等と言える。
コンパイラのソースレベルで「効果がない」を実現していると思うのか? 誰がどう考えても等しく受理できるように書かれてるに決まってる
うぜぇよ、おまえ
「規格の解釈の違い」ではなくて 「日本語を理解できているか」の違い
すいません、彼らは何をモメているのでしょうか
たれてるおっぱい
アレだな %lf原理主義者だな どうでもいいな うん
どっちが推奨か、という点を鑑みれば、議論に意味もなくはないが。 まぁ、どう解釈しても機能は同等ということだな。 それはさておき、printf()系とscanf()系の指定子が同じと書かれた入門書には参るね。 %fだけでなく、%nや%c, %xでさえ同じといっては間違いだというのに。
おせっかいかもしれんが int a[4], b[2][2]; func(a); func(b[0]); func(b[1]); ってするんぢゃねの? func()の定義って func(int *p) もしくは func(int p[]) だろ?
%lfの l は f の指定で動く動作を拡張だろ? やれといわれて a)はぁ?あんた指示間違ってるよ、わけわけんねぇw と文句を言ってやらない b)指示に誤りがあったとしても分かる範囲でやっときます のどっちかという話であって、 >%fは、doubleの指定子だと明記されている >%lfのlは、「効果がない」と書いてある なら b) だってだけw
charとintとfloat以外使わなければ万事解決
>>89 128bit の浮動小数点とかの long double な環境だったりすると誤解を招かないかい?
92 :
デフォルトの名無しさん :2006/05/13(土) 22:17:06
Cのポインタって、どうしてあんな簡単に、入っちゃ行けない領域にポンポンアクセスしちゃうの?
プログラマーが、全てを把握した上でコードを書いてるという想定になってるから
94 :
デフォルトの名無しさん :2006/05/13(土) 22:24:31
やっぱスリル満点の言語だなぁ…Cは。
そこにシビれる憧れるぅ
>>88 二次元外列を配列の配列と思っているバカがいる
日本語でおk
98 :
デフォルトの名無しさん :2006/05/13(土) 22:58:40
皆さん、処理系は何使っている?
VC2005Expressで cpp1つだったのを cpp2つとh1つに分けたら 色々エラーが出てしまいました・・。 ほかのファイルに書いてある関数が認識されていない? 'CUSTOMVERTEX' : 定義されていない識別子です。 'vertices' : 定義されていない識別子です。 'g_pd3dDevice' : 定義されていない識別子です。 'D3DFVF_CUSTOMVERTEX' : 定義されていない識別子です。 というようなエラーが出ます。SDKのサンプル見ながら書いたので ほとんど同じソースです。
100 :
99 :2006/05/13(土) 23:15:46
C/C++のプログラムの知識があまりないです (C言語、C++言語の入門のページを途中までしか読んでいない)
>>101 上手い!
俺は
>>99 見たときになにか書きこんでやろうと思ったが、
なにも思い浮かばなかった。俺には文才が無い、他の人ならどんな書きこをするのだろう?
だから、俺はこのスレにいつか書きこむであろう
>>101 の存在を息を殺して待っていた。
すると、
>>101 のレスを発見!
おもしろい!
.hがインクルードされてないとか、プロジェクトにソースが二つとも追加されていないとか、 スペルミスしているとか、たまにあるけど、サンプルコードが間違ってるとか。 いろいろ原因があるのでなんともアドバイスできん。
104 :
99 :2006/05/13(土) 23:28:37
105 :
99 :2006/05/13(土) 23:31:20
>>103 !!!
sub.hインクルードしました
でもまだエラーが
>>99 もともと一つの cpp ファイルに書いてた処理を、別のファイルに追い出したときに
追い出された方では DirectX のヘッダファイルを入れてないんじゃないかな
どっちにしろ、このスレで訊くようなことではない気がする
107 :
99 :2006/05/13(土) 23:36:38
ほかのファイルに書いてある関数は実行できない??
.h に関数宣言かいとけば、staticじゃなきゃ実行できる。
109 :
99 :2006/05/13(土) 23:44:01
tonkusu 宣言しました。・・・ main.obj : error LNK2005: "struct IDirect3D9 * g_pD3D" (?g_pD3D@@3PAUIDirect3D9@@A) は既に logo.obj で定義されています。 main.obj : error LNK2005: "struct IDirect3DDevice9 * g_pd3dDevice" (?g_pd3dDevice@@3PAUIDirect3DDevice9@@A) は既に logo.obj で定義されています。 main.obj : error LNK2005: "struct IDirect3DVertexBuffer9 * g_pVB" (?g_pVB@@3PAUIDirect3DVertexBuffer9@@A) は既に logo.obj で定義されています。 main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl Bepp(void)" (?Bepp@@YAXXZ) が関数 _WinMain@16 で参照されました。
110 :
99 :2006/05/13(土) 23:47:04
今日は諦めて寝ます そのうちDirectXのスレいきます
まずはソース
main.cpp logo.cpp sub.h と3つあるけど、logo.cpp に記述されている関数が main.cpp に伝わってないじゃないか #include とか、関数宣言とか、extern とかインクルードガードとか調べてから、 30行くらいの短いプログラムでも書いて分割コンパイルについて勉強しなさい。 DirectX より先に C言語そのものの勉強をする方が先。
二重includeかな。 ヘッダファイルの先頭に #pragma once って書いてみたら?
115 :
デフォルトの名無しさん :2006/05/14(日) 05:06:41
#include <stdio.h> int main(void){ int i, j, n; char buf[80]; fgets(buf, 80, stdin), sscanf(buf, "%x %x", &i, &j); n = i * j; printf("%x\n", n); } このような16進数同士の掛け算を行い、その答えを16進数で表示するプログラムがあるんですが、 「feeddead f00dbeef」を実行するとオーバーフロー?で上手くいきません どこをどう変えればちゃんとした答えが出るようになるのか教えてくださいませ
ヒント:用意した変数の有効範囲
117 :
デフォルトの名無しさん :2006/05/14(日) 05:42:04
う・・・ヒントじゃなくて悪いところを訂正していただきたいのですが・・・ intをどう変えるべきなのかとか、%x自体もこのままでいいのか分からないので
char:文字
int :数字
という覚え方したのかな?
それぞれには、ここからここまでという扱える限界がある。
それを越えるとオーバーフロー(コップに水を注ぎすぎて溢れる様な状態)になり。
下手をするとシステムがいかれたりする。
char型 int型の説明を見直しておいて。
みた感じ、
>>115 のはソースそのまんまじゃなくて
関係有りそうなの切り貼りしたんじゃないか?
質問するときは、なるたけ全部はってくれ。
自分が思っていたところとは違うところが間違ってる事があるから。
本当に
>>115 の内容のままだとするとだと
fgets と sscanf についての宣言エラー
;構文のエラーが最低出るはず。
エラーかでたら処理を細かく区切って簡単なモノにして
一つずつチェックした方が原因追及が楽。
>>116 アホ?
引数の評価順序の問題だろ?
# たぶん、「;」を「,」とタイプミスしただけだろうが…
115のコードはオーバーフローを起こすこと以外は全く問題ないと思うのだが。
教本通りに下のプログラムを書いてVC++でビルドしたら警告みたいのが出ました。 ビルドは成功したのですが、この警告はどういうことでしょうか? /* 「A」を入力するプログラム */ #include <stdio.h> int main(void) { char c; int n; printf("AキーとEnterキーを押してください。>"); scanf("%c", &c); printf("入力データを10進表示:%d\n", c); printf("\nAキーとEnterキーを押してください。>"); scanf("%x", &n); printf("入力データを10進表示:%d\n", n); return 0; } g:\c\vc++\visual studio 2005\projects\3-7-1-1-1\3-7-1-1-1.c(10) : warning C4996: 'scanf' が古い形式として宣言されました。 g:\c\vc++\vc\include\stdio.h(295) : 'scanf' の宣言を確認してください。 メッセージ: 'This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
>>122 その警告は時宜どおりに解釈したらいいと思います。
その教本を使いつづけるのなら、その警告は無視するのが無難ですが。
>>123 古い形式ということは「scanf」はもう使われていないということですか?
すみません。 scanf_sを使えばよかったんですね。 ありがとうございました。
>>118 >下手をするとシステムがいかれたりする。
そんな酷い処理系があるんですか?
>fgets と sscanf についての宣言エラー
出ませんね。
>;構文のエラーが最低出るはず。
そんな個所はありませんね。
>>119 >引数の評価順序の問題だろ?
何処が?
問題ないと思うならそれでいいんじゃね 困るの俺らじゃないし
fgets() にしても sscanf() にしても、評価順序によって副作用のある
引数には見えませんが。
>>128 >困るの俺らじゃないし
間抜けな人がいると迷惑するんで。
>>129 ちゃんと分かってるんだったら別に迷惑しないだろ
低脳はほっとけよ
で、カンマ演算子は評価順序確定してたっけ? そもそもfgets()もsscanf()も関数の戻り値はチェックするべきなんだが。
>>131 >で、カンマ演算子は評価順序確定してたっけ?
それくらい知っておいた方がいい。
左オペランドを評価して(副作用完了点)、その結果を捨ててから
右オペランドを評価。
>そもそもfgets()もsscanf()も関数の戻り値はチェックするべきなんだが。
何が「そもそも」か知らないが、マトモなコードを書くつもりならその通り。
おおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお
135 :
115 :2006/05/14(日) 14:07:14
fgets(), sscanf(); でコンパイルできないのでしょうか?
学校の計算機でも、家のコンパイルでもこの方法でコンパイルはできますし・・・
私が言うのもなんですが、fgets(); sscanf(); にこだわってる方の考え方はおかしくないですか?
「;」の記号は宣言を終わらせる時に付けるものなんですよね?
>>115 において「;」を極力用いずに表現すれば、
#include <stdio.h>
int main(void){
int i, j, n;
char buf[80];
fgets(buf, 80, stdin), sscanf(buf, "%x %x", &i, &j), n = i * j, printf("%x\n", n);
}
これでいいんですよ。一体何にこだわってるのか教えていただきたいのですが・・・
一からやり直したほうがいいんじゃないですか?
136 :
115 :2006/05/14(日) 14:13:54
あ〜、なんとなく分かりました! fgets(); sscanf(); にこだわってる方って #include <stdio.h> がどういうものだかを分かってないんだよ それでよく私の質問に答えようと思いましたねw しかも、全く関係ないところをwww
> 「;」の記号は宣言を終わらせる時に付けるものなんですよね? え?
138 :
115 :2006/05/14(日) 14:44:04
すみません、こんな簡単なプログラムに高等な標準入出力ライブラリ関数のfgets()を用いた私が馬鹿なんですよね^^ では、改めて #include <stdio.h> int main(void){ int i, j, n; char buf[80]; scanf("%x %x", &i, &j); n = i * j; printf("%x\n", n); } 「feed beef」であれば、出力結果として正しい値「be21e543」を得ることができるが、 「feeddead f00dbeef」を入力すると、なぜオーバーフローが起きるのか? そしてどこをどう訂正すれば正しい値を出力するプログラムになるのかを教えてくださいませ
139 :
115 :2006/05/14(日) 14:45:20
char buf[80]; は消し忘れですのであしからず
なるほど、オーバーフローだと言う認識はあるんだ。 それじゃ、次はその16進値の積に必要なビット数を概算でいいから求めてみよう。
141 :
115 :2006/05/14(日) 14:56:22
やはりそうだと言うのか!?この桁の掛け算は計算機では不可能だと言いたいのか!!!
142 :
115 :2006/05/14(日) 15:00:49
32ビット×32ビットで繰り上がりがあるため答えは65ビットにはなりそうだねぇ 「double」,「unsigned」,「long」などを使っても無理だというのか!!!
一人で盛り上がってすみませんでした。不可能であれば不可能と返答をくださいませ
> 32ビット×32ビットで繰り上がりがあるため答えは65ビットにはなりそうだねぇ 違う
オ〜マイゴッド!そこにはあんまり突っ込まないで・・・ 32ビット×32ビットは最大で64ビットかなぁ?・・・
146 :
デフォルトの名無しさん :2006/05/14(日) 15:23:05
このスレッドはいつからネタスレになったんだ
無能がボケの質問に答えたときから
>>135 一つの文中に複数の関数呼び出しがある場合、
関数の呼び出し順序は未定義のため、君のソースは鼻から悪魔。
>>148 コンマ演算子は左項→右項の順番に実行される事が保証されている。
65bitだとしても多倍長演算はやろうと思えば出来る。
そ、そこを教えていただきたいのです!
32ビットの数×32ビットの数は64ビット以内に収まるだろ?
あの〜、どうしてどこをどう変えればいいのか教えていただけないのでしょうか? ちょっと変えるだけなら、そのプログラムを貼っていただくだけで十分理解できますから・・・
どうしてこちらが質問してるのに延々と質問で返してくるんですか? そんなことすら学校で習わなかったんですか? お前ら本当に理系かよ。左脳が腐ってんぞ
オマエモナーw
左脳かよw
M ビットの数と N ビットの数の積は (M+N-1) ビットか (M+N) ビットになる。 すなわち、32 ビットの数同士をかけても 65 ビットになんぞならん。 0x80000000 × 0x80000000 = 0x4000000000000000(63ビット) 0xFFFFFFFF × 0xFFFFFFFF = 0xFFFFFFFE00000001(64ビット)
>>154 見れば理解できるレベルなら、検索したほうが早いだろ。
>>153 intが64ビットある環境に移行すれば無問題
>>158 >>145 見ろや。ちゃうってゆわれて答えをちゃんとした方にすぐ変えてるやろが
1×1=1と9×9=81を考えて訂正しとるわ、とっくに
今の VC なら long が、 gcc なら long long が 64 ビットだな。
164 :
115 :2006/05/14(日) 20:31:56
紙に書いて筆算して、その確かめとしてプログラムを作成したいだけだったのでもう去ります どうも時間の無駄をありがとうございました
64 ビットの変数を使えばいいというのが見えんのか。
引数の評価順序は決まってないとかいいたかったんだろうか
if文などの条件式を使うよりも、シフト演算を使った方が実行時間(処理速度?)が速くなるのはなぜですか?
ちょっと待った。 if文とシフト演算がどう繋がるんだ?
BCCで各関数や変数の値を見るにはどうしたらいいですか?
printf
>>170 if(buf[i]<0) count++;
これをシフト演算で表せば、
count -= buf[i] >> 31;
このようにしてif文や三項演算子を使った文より実行速度が速くなるのはなぜですか?
って、1演算でもないか。 基本的に分岐は遅いってことだけ覚えとけ。 ただこの場合、Pentium Pro 以降用の最適化にすれば 大差ないかもしれないな。
考察で原因を書かなければならないのです・・・
>>176 ちゃんとした考察したいなら、アセンブリ言語勉強しろ。
とりゃーえず VC++ 使ってるなら、
デバッグ実行して混合モードでアセンブリ表示してみれ。
あとは CPU のマニュアル読んで、
各命令の速度や分岐予測ペナルティに関する記述を探せ。
>>176 スレ違い。
そもそも、本当に速くなるかどうかは実測しなければわからない。
179 :
デフォルトの名無しさん :2006/05/15(月) 12:26:57
>>173 条件が成立する確立が低ければ、if文の方を速くできないか?
条件が成立することが確立しているなら条件判断する必要ないと思うが。
いい加減スレ違いだ失せろ。
182 :
デフォルトの名無しさん :2006/05/15(月) 14:55:15
低水準入出力のread()を使用して文字列を読ませたいのですが 例えばLinuxのように連続した文字列はその通りに読んでくれるのですが Lin uxのように間にスペースを入れると前半のLinまでしか読んでくれません。 スペースも読ませるにはどうしたらいいでしょうか? アドバイスお願い致します
183 :
デフォルトの名無しさん :2006/05/15(月) 15:00:32
>>182 自己解決したみたいだからいいけど、
標準Cにはいわゆる高水準入出力しかないからな。
風紀委員うぜ
風紀委員メガネっ子(゚Д≡Д゚)ドコー!?
C++でのTemplateのようなものを実現したいと思い、次のようなものを考えたんですが 標準C的にはどうなんでしょうか?自分なりにJIS X3010:2003を読んだ限りでは大丈夫だと思うのですが。 --- hoge.c --- #define X_STR(a, b) a ## b #define STR(a, b) X_STR(a, b) TYPE STR(hoge, ID)(仮引数並び) { hoge(); } ・呼び出し側 #define TYPE int #define ID id1 #include "hoge.c" #undef TYPE #undef ID int na = hogeid1(hoge);
>>187 二カ所以上で同じ事したら二重定義エラー。
static を付ければ最も簡単に回避できるが、
回避法としては微妙。
俺ならこうする。
-- hoge.h (二重インクルードガードは省略)
/* プロトタイプ宣言 */
#define PROTO_HOGE(type, func, id) \
type func##id(仮引数並び)
/* 実装 */
#define IMPL_HOGE(type, func, id) \
PROTO_HOGE(type, func, id) \
{ \
func(); \
}
-- hoge.c
#include "hoge.h"
IMPL_HOGE(int, hoge, id1) /* int hogeid1 を実装 */
-- 呼び出し側
#include "hoge.h"
PROTO_HOGE(int, hoge, id1); /* int hogeid1 のプロトタイプ宣言 */
int na = hogeid1(hoge);
>>188 #includeの直後でundefしてますがそれでもダメなのでしょうか?
>>189 ダメ。マクロの二重定義の話じゃない。
関数の二重定義。
同じファイルで同じ TYPE, ID でやることはないかもしれないが、
別のファイルで同じ TYPE, ID でやることはあるかもしれない。
そうなると同じ関数が二カ所で定義されるのでリンクエラーになる。
static つければとりあえずそれぞれローカル関数になって
リンクエラーは回避できるけど、
同じ関数が何個もあって良くない。
>>190 なるほど、6.9の制約違反ですか?
一応、IDが重複しないように管理しつつ使うつもりなのでそこは問題ないと思います
とりあえず
>>188 を参考にしつつもうちょっと考えてみたいと思います
ありがとうございました。
>>191 そうけ。
まあ、それならそれで
-- hoge.h
(二重インクルードガードは省略)
#define STR(type, func, id) \
type func##id(仮引数並び) \
{ \
func(); \
}
#define HOGE(type, id) STR(type, hoge, id)
としておいて
#include "hoge.h"
HOGE(int, id1)
HOGE(char, id2)
みたいなのでいいと思う。
すみませんが、 >if(buf[i]<0) count++; >これをシフト演算で表せば、 >count -= buf[i] >> 31; >このようにしてif文や三項演算子を使った文より実行速度が速くなるのはなぜですか? これってbuf[i]<0が成立すると(つまりbuf[i]の最上位ビットが1)count++するのですよね? count -= buf[i] >> 31はcount = count - (buf[i] >> 31)ですよね。 つまりbuf[i]<0ならば、countはひとつ減ることになると思うのですが・・・
>>193 buf[i] が符号付き 32 ビット値なら、
右シフトした際に符号が保存され、
最終的に -1 になる環境が多い。
C の規格ではちゃんと決まってなかったと思うがな。
だから、count = count - (-1); になる。
C言語でについて色々ググって調べていたら混乱してしまいましたorz 超初心者な質問ですが答えてくださると有り難いっす ・参考書は必要か否か ・オヌヌメなサイトはどこか (猫でも〜がVC++1.5必要みたいで困ってます
恥ずかしいので訂正 × C言語でについて ○ C言語について
C言語を勉強してどこへ到達したいのかによる。 Windowsプログラミングが作りたいなら、ポトペタな開発環境で Windowsの仕組みと C の文法を並行して勉強した方がいいと思うし コンソールアプリでいいなら K & R でガツンと勉強した方がいいと俺は思うね。
>>197 レスどうも
C言語を覚えておけば得な気がすると思ったのがキッカケです
色んな情報が氾濫しまくってて何ができるのかイマイチ把握できてないので
一通りやってから徐々に詳しく学んでいこうと考えています
(ゲーム作れるとか作れないとか、サイトによってそれぞれ違うことが書かれていてorz)
そこで参考になるサイトや資料があれば教えてもらおうと書き込んだ次第であります
>>198 ゲームも作れない事もないが、ゲーム作るつもりならお勧め出来ない。
参考書は数冊買っておけ。
出来る限り多く読んだ方がいい。
最近C始めたんですが 学校のはLinuxでやりやすいんですけど Windowsでのやり方がどうにも・・・ とりあえずなんかよさそうな コンパイラありませんかね?フリーのやつで・・・
>>200 Linux使ってるならCygwinでいいんジャマイカ?
>>201 学校でやるだけじゃ不足なんでマンション帰ってからWindowsのPCで
やりたいんですよ
Cygwin は Windows ですよ。 Windowsに慣れてるなら、Linux臭くていやになるかもしれないが、 学校でLinuxがやりやすいと思ってるならなじめると思うよ。
>>203 あ、そうなんですか では早速使ってみます と思いきや
環境変数とかで手間取ってます(A´・ω・)フキフキ
>>199 まずは幅広く浅い知識を蓄えようと考えてます
現状ではゲーム作成がどのくらい難しいことなのか全く把握できていませんし
そこで最初の質問に戻るのですが
オヌヌメなサイトと参考書を教えてくださいorz
>>206 C言語を勉強して最終的にはゲームとか何でもプログラムできるようになればいいな
という願望でありまして、最初は基礎的なことを学びたいのであります
せっかくスレ探してくださったのに申し訳ありません
どうやら私はC言語の前に日本語を勉強したほうが良いのかもしれませんorz
>>207 レスどうも
リンク辿っていって推薦書籍集みつけました
とりあえず倉薫のC言語1&2を明日購入します(なければアマゾンでw
参考書はokっす
オヌヌメのサイトだけお願いします
ちょwww誰からのレスもないと不安になってくる(´・ω・`) もしかして倉薫のC言語1&2って古すぎる?
とりあえず早朝時間に余裕があったらスレ覗きますね みなさんレスありがとうございました お疲れ様っす
212 :
デフォルトの名無しさん :2006/05/16(火) 01:39:46
「C言語で何でもプログラムする」という無謀な目標に愕然
挫折するタイプの典型だな
寧ろ挫折していることに気づかないで悪足掻きするタイプと見た。
MSDOSでのコンパイラについてのスレがみつからないのですが。
216 :
デフォルトの名無しさん :2006/05/16(火) 07:14:00
>>212 それは、あれか?
プログラミングは全部アセンブラで書けってことか?
DOSのスレもあったべ
汎整数拡張って何のためにあるんですか?
>>214 いちいち人に訊かないと何も出来ない奴って何なんだろうと
以前から不思議に思ってたんですが、成る程、悪足掻きだったんですね。
p = bsearch(&ky,/* 探索値へのポインタ */ x, /* 配列 */ nx,/* 要素数 */ sizeof(int),/* 要素の大きさ */ (int (*)(const void *, const void *))int_cmp/* 比較関数 */ };
p = bsearch(&ky,/* 探索値へのポインタ */ x, /* 配列 */ nx,/* 要素数 */ sizeof(int),/* 要素の大きさ */ (int (*)(const void *, const void *))int_cmp/* 比較関数 */ }; bserchというソート済み配列から値を検索する関数に int_cmpという値を比較して結果を返す関数へのポインタを渡す時に (int (*)(const void *, const void *))int_cmpとして渡すそうなんですが、 どうして、単にint_cmpとして渡せないのでしょうか?
>>223 関数の型が適切ならば、キャストの必要はありません。
最後のカッコが}ではなく)です。すいません
だからキャストの必要はないって言ってんだろ、なんか言えよw
(int (*)(const void *, const void *))型の値を受け取るように bserchが設計されているという事までは理解できました。 でも、(int (*)(const void *, const void *))って何でしょう・・・ bserchのコードは見られるのですか?
すいません、bsearchはstdlibの中の関数です。
だからキャストだって言ってるじゃんよう(TT
すいません、 こんなに複雑なキャストは見たことないので いったい、何を何にキャストしてるのか、さっぱり分らなくて
(const void* と const void* を取って int の値を戻す関数) の ポインタ おおよそこの手引数を取る関数の中から 上記の const void* と const void* を取って int の値を戻す関数 が呼び出される。
>>231 なるほど、関数のポインタでキャストする時は
戻り値の型(*)(引数の型)という形でキャストするという
ふうに覚えればいいんですかね?
いや、キャストしないように関数を作るのがいい。
int int_cmp(const void* c1, const void* c2) { retrun (*(int *)c1) - (*(int *)c2); } とでも書けってこったな。 # return で ()多い? いつも迷って ((int *)c1)[0] とか書いちゃうけど…
キャストせずに利用できる関数をbsearchに渡したほうが 関数を書くのは面倒でも後々で楽って事ですかね。なるほど
>>236 いいえ。キャストは最後の手段とするべきです。
>>235 その比較関数はオーバーフローしない事が保証されてる場合のみの書き方だね。
分かって使う分には問題ないけど。
C++なら必要だが、Cならキャストは必要なくないか?
>>212 目標ちゃいますてwwwwww
>>208 に基礎的なことを学びたいって書いてありますやん(´・ω・`)
現実的に不可能な目標たてるわけありませんよ。小さなことからコツコツと逝くタイプっすから
>>213-214 >>220 ちょwwwww
漏れに関係ある書き込みには全レスしておきました
参考書(
>>210 )は書店に売ってなかったので尼損にて注文しました
サイトは書籍等を見ながら自分に合ったものを探します
てことで本が届いて挫折するまでこのスレには来ませんwwwww
お世話になりました。挫折したらよろしくお願いします<m(_ _)m>
追伸
タイトルが「C言語なら俺に聞け!」というわりには質問に答えてくれる人が少なくて(´;ω;`)テラカナシスでしたorz
int *d; *d = malloc(sizeof(int) * p); と int *d; d = (int *)malloc(sizeof(int) * p); どう違うのでしょうか?
>>242 上は指しているアドレスに確保しようとしているという意味になるのでしょうか?
数値型のintに数値型のポインタを代入してはいけない # ま、大概の実装はsizeof(int)== sizeof(int *)なんで、 # キャストを乱発すれば一応動いてしまうが厄介なんだが...
>>240 そもそもこのスレは、あくまでこんなことしたいor分からないんだが
標準C的にはどうなのよ?って時のためのスレであって
Cに絡むことならなんでもいいって訳じゃねーしな
>>1 ぐらい読んでから書けよ
>>241 ・釣りなら満足しただろうから帰っていいよ。
・初心者なら初心者スレに行った方がまともに答えてくれるよ。
・そうでなくても、「やりたいこと」を明示した方が問題解決の近道だよ。
>>243 d は int* 変数
*d は int 変数
と思っとけ。
int 変数に void* 値を入れてどうするよという話。
>>239 いや、Cでもキャストは要る。
むしろテンプレートを使ったstd::sortがあるのでC++ではキャストを使わずにできる。
日本語(SJIS)と対応する2バイトの16進コードを出力したいのですが できますか? [1] レポート [2] 日本語(SJIS)と対応する2バイトの16進コードを出力せよ 例:81AO □ こんな感じです [3] 環境 [3.1] OS: Windows XP SP2 [3.2] Visual Studio 2005 [3.3] 言語: C/C++ [4] 期限: できれば早く
252 :
250 :2006/05/16(火) 20:49:41
スマソ C/C++の宿題を片付けます に書く予定でした
254 :
デフォルトの名無しさん :2006/05/16(火) 22:21:23
printf関数でdouble値を表示させたいのですが、 有効数字のみを表示させることは出来ますか? 例えば、"0.000000"とか"12.123400"とかではなく "0", "12.1234"と表示するように。お願いします。
256 :
254 :2006/05/16(火) 22:39:35
できた。ありがとう
構造体の中身を指す .(ドット) ->(アロー) 同じ機能なのでしょうか? コードの中で好きに選んでいいのですか?
構造体に対して使うか、構造体のポインタに対して使うか。
構造体のポインタの要素に別の要素が含まれている場合は pointer->構造体.要素 という書きかたになるのでしょうか?
struct st_a{ int data; }; struct st_b{ struct st_a ms; struct st_a* ps; }; struct st_a A; struct st_a* B; struct st_b C; struct st_b* D; B = &A; C.ps = &A; D = &C; A.data = 1; B->data = 2; C.ms.data = 3; C.ps->data = 4; D->ms.data = 5; D->ps->data = 6;
a->b は (*a).b と全く同じ。 こういう事よくするから、書きやすくしただけ。
ループの中にいてもどこかの関数の中ににいてもプログラムを抜ける方法はありませんか?
exit
Cで構造体の中にあらかじめ関数の先頭アドレスを登録して使用することは可能ですか?
statを使わずにc99の標準ライブラリだけで ファイルの有無と、そのれがディレクトリでないかチェックしたいのですが どうかけばいいでしょうか?
すいません、上の人と似たような質問になるのですが FILE file_pointer; struct stat file_status; //ごにょごにょ if(stat(file_pointer, &file_status) != 0){ ココ } ココと指した所に行く時は、ファイルがなかったときになるのでしょうか?
>>267 アクセス権がないとかもありそうな気がする。
標準Cにはディレクトリの概念が無かった気がする
え?
>>267 の時ってディレクトリもはじかれるんじゃなかったっけ?
271 :
デフォルトの名無しさん :2006/05/18(木) 01:59:48
fprintf(stderr,); perror とか色々とエラー出力があるのですが 具体的にどういう場合はこれとかそういうのはないんですかね?
繰り返すけど、statは標準Cじゃない。 で、POSIXな環境なら、ディレクトリの場合も含めて 概ね同じ動作をすると思うが それ以外の環境も考慮する場合は ライブラリによって動作が違うから気をつけるべき。 例えば、stat("dirname/")の時とか、stat("filenam?")の時など。 また、S_ISDIRが定義されていない環境もある。
>>271 errnoが設定されるエラーならperrorでOK
それ以外のアプリ独自のエラーなら fprint(stderr
どうせそのうち自作のログ出力用ライブラリ使うことになる。
font_name = malloc( sizeof( "-gothic-medium-r-normal*16*")); font_name = "-gothic-medium-r-normal*16*"; これを一行で簡潔させることはできませんかね? 単に一行につなげるだけ以外で・・
>>274 そもそもそのコードは思いっきり間違っている。
const char *font_name = "-gothic-medium-r-normal*16*";
結婚式場ですっぽかされた新郎のようだ
278 :
274 :2006/05/18(木) 04:34:26
font_nameと言うのは本当は構造体の中にあります opt.file_name です。 なので const char *font_name = "-gothic-medium-r-normal*16*"; は できません。 すいませんが、正しいコードを教えていただけないでしょうか?
279 :
274 :2006/05/18(木) 04:35:01
いいわすれました。 ちなみに構造体の中では char *file_name; として宣言されています。
残念ながら無理です。 素直に2行でやりましょう。 文字列の代入は=ではなくstrcpyで。
sizeofで直接文字列見れるんだ、初めて知った。 てか+1しとかないとまずくないか?
まずくないよ
なんで?
strlenと違って末尾のNULLも入れたサイズを返すからだろ
NULLと'\0'の区別はつけような
どう違うの?
(char)NULLでようやく同じになるんじゃね?
>>274 正しいコードはこうなるだろう。
font_name = malloc( sizeof( "-gothic-medium-r-normal*16*"));
strcpy(font_name, "-gothic-medium-r-normal*16*");
どうしても1ステップで書きないならstrlen()のコストを問題にしないのであれば、関数でも書けばいい。
そうでないなら関数型マクロでやるしかないだろう。
#C++なら別の手段もあるが……
strdup() って ISO 標準じゃないんだよな、何故か。x
>>290 とあるプロジェクトで、共通関数としてstrdup()同様の関数を入れてみたのだが、
利用者が解放忘れを多発するので標準じゃなくて良かったと思わなくもない。
/*--- スタックにデータをプッシュ ---*/ int StackPush(Stack *s, void *x) { if (s->ptr >= s->max) return (-1); memcpy((char *)s->stk + s->ptr * s->sz, x, s->sz); s->ptr++; return (0); } スタック構造のプログラムで void 型のポインタである値stkに、任意の型の値xに入れるために、 stkをchar型にキャストしてますが、これは何のためですか?
すいませんstkに、xを入れるためにです
整数なのに「ptr」…
>>293 ポインタ演算するには、そのポインタが指すオブジェクトのサイズが
解っていなければならないが、void * はそのままだと演算できない。
そのコードの場合、バイト単位で計算するために char * にキャストしているんだろう。
>>295 定義がないのに整数と決めつける藻前もどうかと思うよ?
299 :
デフォルトの名無しさん :2006/05/18(木) 12:58:39
C言語のソースをhtmlに変換して 関数やら変数やらがリンクになって、そこをクリックすると その宣言やヘッダファイルに飛べるようなソフト(ソースブラウザ?)が オープンソースであったと思ったのですが、ソフト名を忘れてしまい 検索してもそれらしいソフトが見つからないので、知っているかたいたら 教えて下さい。
doxygen
>>300 レスありがとうございます。doxygenもおもしろそうですが
探していたのはgonzuiのことでした。やっと見つかりました。
>>296 あ〜なるほど。
そういう決まりがあるのですね。
この場合、memcpyでコピーするサイズを与えているので、
Void型からどんな型にキャストしても機能するのでしょうか?
>>302 例えば int が 4 バイトの環境で
(int *)s->stk + s->ptr * s->sz
としてしまうと、コピー先のアドレスが
「s->stk の値」+「int のサイズ」×「s->ptr * s->sz」
になるので拙い。
304 :
デフォルトの名無しさん :2006/05/18(木) 18:03:52
マルチスレッドなアプリケーションを作りたくて調べています。 「process.hをインクルードして_beginthread関数を使え」みたいなことがよく書いてあるんですが、 この「process.h」というのはC言語の標準ライブラリに含まれているのでしょうか? 私の持っている「プログラミング言語C」の標準ライブラリには載っていないのですが・・・。
含まれてない。
マルチスレッドという概念そのものが標準Cにない。
307 :
デフォルトの名無しさん :2006/05/18(木) 19:40:32
fstatシステムコールを用いて ファイルのサイズとか種類とか調べるにはどうしたらいいんですか? 調べてもでてこないのですが・・・
308 :
デフォルトの名無しさん :2006/05/18(木) 20:10:47
c言語でconstを用いた定数宣言がおススメできない理由って何ですか? 配列の境界値として利用できないからといわれたんですが,どういう 意味ですか?
>>307 プラットフォーム依存の話なので、他のスレへ。
>>308 const int array_size = 10;
char buffer[array_size];
とはできない、ということかと。そういう部分を我慢できるなら、
const定数でいいと思うけどね。
マクロは嫌、でもconstは使い物にならない。 そんなときには列挙がある。
>>305-306 そうですか・・・ありがとうございました
調べたところMicrosoftのランタイムライブラリというのにprocess.hが含まれる、
ということらしいのですが、UNIXのコンパイラなどでもprocess.hが使えるようです
何かの規格にそって作られたライブラリなのでしょうか?
313 :
デフォルトの名無しさん :2006/05/18(木) 20:35:29
>>308 ありがとうございます.ここでの境界値=配列の大きさということですね.
314 :
313 :2006/05/18(木) 20:36:34
無償コンパイラと市販コンパイラってやっぱり大きな差があったりするんですか?
あったりなかったり様々です。
コンパイラ自体よりも開発環境の差がでかいね。 コンパイラ自体にも最適化の性能の差があったりもするわけだけど。
319 :
デフォルトの名無しさん :2006/05/18(木) 23:16:20
自前でとか。
321 :
デフォルトの名無しさん :2006/05/18(木) 23:38:06
インライン関数よりもマクロのの法がいい!!!!!!! なぜかといえば淫乱関数は最適化されるかどうか不明だからだ!!!!!!!!!!
322 :
デフォルトの名無しさん :2006/05/18(木) 23:39:33
316 マイクロソフトのc++2005かインテルc++がいいよ。 どちらも無料。
323 :
デフォルトの名無しさん :2006/05/19(金) 00:29:51
Borland C++ 5.5.1で下記をコンパイルすると「問題のあるポインタ変換」という警告が出てしまいます。 atoiの部分が悪いようですが、改善方法が分かりませぬ。 教えていただけますでしょうか。 #include <stdio.h> #include <stdlib.h> int main(void) { char* hairetu[1][100];//文字列格納用配列 int suuti;//数値格納用 printf("数字を入力:"); scanf("%s",&hairetu[0]);//数字を配列に格納 printf("\n入れた数字は%s\n",hairetu[0]);//文字列として出力 suuti=atoi(hairetu[0]);//数字を数値に変換 printf("10を足すと%d\n",suuti+10);//数値として計算出力 return 0; }
>>323 × char* hairetu[1][100];
○ char hairetu[1][100];
325 :
デフォルトの名無しさん :2006/05/19(金) 00:40:32
#include <stdio.h> #include <stdlib.h> main() { char hairetu[100]; int suuti; printf("数字を入力:"); scanf("%s",hairetu); printf("\n入れた数字は%s\n",hairetu); suuti=atoi(hairetu); printf("10を足すと%d\n",suuti+10); }
326 :
デフォルトの名無しさん :2006/05/19(金) 00:40:37
横槍初心者の素朴な質問。scanf は一文字しか処理できないから hairetu[1][100] とか %s っておかしくないですか?
>>326 > scanf は一文字しか処理できないから
どこでそんな誤解を仕入れてきたんだ
1文字しか処理できなかったら数値の読み取りすら出来ないじゃまいか
328 :
これでもいけるぞ :2006/05/19(金) 00:44:52
#include <stdio.h> #include <stdlib.h> main() { char hairetu[100][100]; int suuti; printf("数字を入力:"); scanf("%s",&hairetu[50]); printf("\n入れた数字は%s\n",&hairetu[50]); suuti=atoi(&hairetu[50][0]); printf("10を足すと%d\n",suuti+10); }
329 :
325 :2006/05/19(金) 00:46:02
あら、scanfのhairetuの頭に付くアンパサンドが消えちゃった。 >326 上ので文字列も取得できますぞ?
331 :
325 :2006/05/19(金) 00:50:35
>328 ほんとだ、いけますね。 警告もでないし、違いを考えてみます。 ありがとう。
332 :
これでもいけるぞ :2006/05/19(金) 00:51:55
printf("数字を入力:"); scanf("%s",hairetu); suuti=atoi(&hairetu[0][0]);
333 :
デフォルトの名無しさん :2006/05/19(金) 00:52:54
初心者向けのスレで募集とはチャレンジャーだな
つまり、標準Cの範囲内だけで開発しろと
336 :
325 :2006/05/19(金) 01:10:10
atoiの引数配列が1次元だったから警告でたんですかね? 配列の宣言から間違えてましたか、、間違えたのでも希望通りの結果が出てしまってわけわかめ。 精進します。
337 :
319 :2006/05/19(金) 06:07:24
>>320 やっぱ自前で作るしかないんすね・・・
サンクスです。
>>337 >使用する場合は、以下の点に注意すること。
日本語読めますか?
>>333 まだやってたのかよ。
去年か一昨年くらいに2chでヲチされて盛り上がってたやつじゃないか。
>>338 その前の
>これらの関数は絶対に使用しないこと。
これが程よく狂ってるからなあ。
それに、「連続する区切り記号はまとめられる」のも
注意事項の一つに含めるべきだと思うんだが。
>>303 レス遅れましたけど
ありがとうございます
343 :
デフォルトの名無しさん :2006/05/19(金) 10:31:32
LinuxでソケットプログラムをCで書いてるのですが、 コネクトにタイムアウトの設定をするにはどうしたらいいでしょうか? cnt=3; while(1) { if((connect(fd,&addr,sizeof(addr))==0)break; else if(--cnt) { sleep(1); } else { エラー処理 } } こんな感じのタイムアウトも考えてみたのですが、もっとスマートな方法は無いでしょうか? アドバイスお願いします。
あるプログラムが毎回Segmentation faultで死んでいます。 gdbで調べると、どうもmain()関数起動時? に死んでる様子 main()にブレークポイント設定すると、ブレーク到達前に死にます。 main()実行前に以下の関数を呼び出しているらしく、 _alloca() probe() Program Received SIGSEGV, Segmentation fault. 0x00405493 in probe() と、probe()で死にます。 何か原因はあるのでしょうか? 同じオブジェクトをリンクした、宣言などは同じで内容は別の実行 ファイルを作ると、こちらは死なないのですが。
ですよね(´・ω・`)
それでした。 FAQに乗ってることなのに質問して申し訳ないです。 前にも同じことやって、同じFAQ読んだ記憶があるorz
350 :
デフォルトの名無しさん :2006/05/19(金) 15:10:28
ソース長くてすみません。 待ち行列シミュレーションのプログラムです。 エラーが出るのですが、わけがわからないのでお願いします。 【エラー】 エラー E2356 simulator.c 28: 'time' の再宣言で型が一致していない エラー E2344 c:\Borland\Bcc55\include\stdlib.h 348: 一つ前の 'time' の定義位置 エラー E2060 simulator.c 42: 浮動小数点の不正な使用(関数 main ) エラー E2060 simulator.c 51: 浮動小数点の不正な使用(関数 main ) エラー E2060 simulator.c 56: 浮動小数点の不正な使用(関数 main ) エラー E2060 simulator.c 58: 浮動小数点の不正な使用(関数 main ) エラー E2060 simulator.c 60: 浮動小数点の不正な使用(関数 main ) エラー E2060 simulator.c 104: 浮動小数点の不正な使用(関数 schedule ) 警告 W8004 simulator.c 122: 'interval' に代入した値は使われていない(関数 schedu e ) *** 8 errors in Compile ***
351 :
デフォルトの名無しさん :2006/05/19(金) 15:11:57
【ソース】1行目から #include <stdio.h> #include <stdlib.h> #include <math.h> #define Rand() ((double)rand()/RAND_MAX) #define ExRand(m) (-log(1.0-Rand())/m) #define END_TIME 1000.0 #define AR 0.1 #define SR 0.2 typedef enum{ ARRIVAL = 99, DEPARTURE }EVENT_TYPE; typedef struct event{ EVENT_TYPE type; double time; struct event *next; }EVENT;
352 :
デフォルトの名無しさん :2006/05/19(金) 15:13:30
【ソース】23行目から voidarrival(void); voiddeparture(void); voidschedule(EVENT_TYPE, double); /* グローバル変数 */ double time; double l_time; double total_time; int queue_length; int customer; EVENT top; int main(void) { EVENT *current; /* 初期化 */ time = 0.0; l_time = 0.0; queue_length = 0; total_time = 0.0; customer = 0; /* 最初の到着イベントを作成・登録 */ schedule(ARRIVAL, AR);
353 :
デフォルトの名無しさん :2006/05/19(金) 15:14:52
【ソース】51行目から while(time < END_TIME){ /* イベントリストの先頭イベントを取り出す */ current = top.next; top.next = current->next; l_time = time; /* 時刻を現在のイベント時刻まで進める */ time = current->time; total_time = (time - l_time) * queue_length; if(current->type == ARRIVAL){/* 到着イベント? */ arrival();/* 到着イベント */ }else if(current->type == DEPARTURE){/* サービス終了イベント? */ departure();/* サービス終了イベント */ } free(current); } printf("\t\t|シミュレーション値|\n"); printf("総到着客数\t\t%d\n", customer); printf("平均待ち時間\t\t%.3f\n", total_time/customer); return 0; }
354 :
デフォルトの名無しさん :2006/05/19(金) 15:15:39
【ソース】79行目から void arrival() { queue_length++; customer++; schedule(ARRIVAL, AR); if(queue_length== 1) schedule(DEPARTURE, SR); } void departure() { queue_length--; if(queue_length!= 0) schedule(DEPARTURE, SR); }
>>350 > エラー E2356 simulator.c 28: 'time' の再宣言で型が一致していない
> エラー E2344 c:\Borland\Bcc55\include\stdlib.h 348: 一つ前の 'time' の定義位置
まずはこれを直せよ。
簡単に言えば、「time」という名前を変数に使ってはダメ。
356 :
デフォルトの名無しさん :2006/05/19(金) 15:31:26
あ
357 :
デフォルトの名無しさん :2006/05/19(金) 15:31:49
【ソース】95行目から void schedule(EVENT_TYPE type, double rate) { EVENT *thisEvent, *tmp; EVENT *pre_tmp = (EVENT *)NULL; double interval = 1/rate; thisEvent = (EVENT *)malloc(sizeof(EVENT)); thisEvent->type = type; thisEvent->time = time + ExRand(interval); thisEvent->next = (EVENT *)NULL; tmp = top.next; pre_tmp = ⊤ while(1){ if(tmp == (EVENT *)NULL){ pre_tmp->next = thisEvent; break; }else if(thisEvent->time < tmp->time){ pre_tmp->next = thisEvent; thisEvent->next = tmp; break; } pre_tmp = tmp; tmp = tmp->next; } }
ほほう、「どこがおかしいですか」タイプの丸投げか。
359 :
デフォルトの名無しさん :2006/05/19(金) 15:54:07
>>355 timeを違う変数名に変更したらエラーが消えました。
もしかしたら、違うかもしれませんが。
すでにtimeは存在してて
それをdouble型で再定義したからいけないということなんですね。
ありがとうございました。
>>359 そういうこと。
<time.h>にtimeという関数がある。
そういう時はエラーの文でぐぐると解決しやすいかもよ。 「再宣言で型が一致していない」とか。
362 :
デフォルトの名無しさん :2006/05/20(土) 00:15:00
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
365 :
デフォルトの名無しさん :2006/05/20(土) 01:31:22
#pragma, packed関連で質問です。 MSVC++で以下のコードでは構造体s_1のビットフィールドと文字cの間がパックされません。どうしてでしょう?誰か教えてください。 #pragma pack(1) struct s_1 { unsigned a : 7; unsigned b : 1; char c; }; struct s_2 { char a8; charb8; }; union s_u { s_1bit; s_2any; }; s_utest; int main(int argc, char* argv[]) { s_u * p = &test; p->bit.a = 0xAA; p->bit.b = 1; p->bit.c = 0x55; char a8, b8; a8 = p->any.a8; b8 = p->any.b8; return 0; }
>>365 ビットフィールドの区域は必ず int のサイズの倍数になるんだったはず。
どうにかして欲しいけど、そういう仕様になっている。
368 :
デフォルトの名無しさん :2006/05/20(土) 02:00:41
369 :
デフォルトの名無しさん :2006/05/20(土) 11:29:01
C言語なら俺に聞けといって聞いたが難しくてわからなかったらしく 明確な答えを導き出してくれなかった。 そして初心者歓迎のほうのスレで聞いたら、ある人が答えを導き出してくれた・・・ ・・・C言語の簡単なものなら俺たちに聞けにスレ名変えたほうが
370 :
デフォルトの名無しさん :2006/05/20(土) 11:32:09
>>369 そうやって何でも人のせいにしてたらいつまでも
上達しないだろうねw
>>369 スレタイをよく見てみろ。
聞け!とは書いてあるが、答えを教えてやる!とは書いてない。
sscanfで入力文字列がフォーマットどおりかどうか調べるにはどうしたらいいのでしょう? 入力文字列1="tokyo23ku"; 入力文字列2="tokyo23kudakke?"; format="tokyo%dku"; の場合、入力文字列1はtrue、入力文字列2はfalseになるように・・・
char *str1="tokyo23ku"; char *str2="tokyo23kudakke?"; char *str3="tabuntokyo23ku"; char *format="tokyo%dku" "%s"; printf("%s = %d\n", str1, sscanf(str1, format, &d, buf)); printf("%s = %d\n", str2, sscanf(str2, format, &d, buf)); printf("%s = %d\n", str3, sscanf(str3, format, &d, buf));
#include<stdio.h> int main(void) { char *str1="tokyo23ku"; char *str2="tokyo23kudakke?"; char *str3="tabuntokyo23ku"; char *format="tokyo%dku" "%c"; int d; char buf; printf("%s = %d\n", str1, sscanf(str1, format, &d, &buf) == 1); printf("%s = %d\n", str2, sscanf(str2, format, &d, &buf) == 1); printf("%s = %d\n", str3, sscanf(str3, format, &d, &buf) == 1); return 0; } つまりこういうかんじに、 sscanfの戻り値が1かどうか判定したらいいのですね?
"%c"つけなくてはいけないけどね
376 :
billy :2006/05/20(土) 18:27:24
問題文(含コード&リンク): 第1引数のファイルに含まれる文字列をカンマを区切りとして 単語に分けた上で、第2引数と第3引数のフィールドを入れ替えて出力するプログラムを作成する。 ただし、入れ替えるように指定されたフィールドの一方もしくは両方が存在しなかった場合は 入れ替えを行わないようにする。 実行例: %cat source This,is,source. file,end. %gcc -o fieldswap kadai.c %./fieldswap source 2 3 -- Line 1 -- Field 1: This Field 2: source. Field 3: is -- Line 2 -- Field 1: file Field 2: end. 環境 OS:Linux コンパイラ名とバージョン:gcc 言語:C 期限: 5/25
巨大な"データ"をもつ配列をソートするときに、データではなくそれを指しているポインタを書き換えて データを直接コピーしないっていう方法って有った?
>>377 ポインタの配列にすればいいだけでないの。
ポインタを引数に取る比較関数を作り、比較関数の中ではポインタの参照するデータで比較する。
でその関数をqsortの引数に渡してやれば、実際のデータのコピーはすることなく
ポインタのコピーのみでソートが終わる。
SuffixArrayあたりで使われてる手法だけど。
関数型マクロで可変引数のものは作れませんよね?
変換ミスった。 ×括弧毎 ○括弧ごと
またもやC99・・・。 無償でBorladC++かVisualC++で出ないかな・・・
っVC2005ExpressEdition
とゆうかC99だけならgccでも普通に使えるが
VC2005ExpressEdition? なぬ? 無償だって? VCあったの・・・?
永久無償だな ATLやMFCは入ってないが まあスレ違い
DigitalMarsとか最近のOpenWatcomもC99に対応してるようだが。 どの辺まで使えるのかは知らんが。
gcc も 100% 準拠というわけではないんだけどね。
↓サイズ0や[ ]の配列宣言についてなのだがANSIでは標準?使っちゃやばい? struct ary_zero { int len; char d[0]; }; struct ary_ { int len; char d[ ]; };
>>389 [0]は知らないが、[]については少なくともC99には規定があった
C89については規格票持ってないので知らん
>>390 ,391
レスサンクス、規定あるのね。gcc3.4コンパイルの-Wallで警告でなかったんで大丈夫かなって思ったけど
VC2003でコンパイルしてみるとwarning C4200って出てあせっちゃった。
>>392 gcc -ansi -pedantic -Wall でコンパイルしてみそ。
>>393 cygwin上だけど[ ]のCでwarning: ISO C90 does not support flexible array members、、、C++でerror: ISO C++ forbids zero-size array `d' っか。。
移植性考えるなら -ansi -pedantic -Wall で 警告すら出ないくらいにすべし。
397 :
デフォルトの名無しさん :2006/05/21(日) 12:25:22
double型の2数a,bを入力してaをbで割った商の 小数点以下だけを表示させるプログラムの作り方を教えてください。 また、while構文を使ってa,bを入力させ続けるものとします。
>>397 ここは宿題スレでも初心者歓迎スレでもないのでヒントだけ。
結果の小数部を得るには、結果から結果を整数値に丸めたものを引く。
丸める関数にはC99ならそうでなければfloor()を使えばいい。
#但し、floor()の場合は負数に注意。
399 :
デフォルトの名無しさん :2006/05/21(日) 12:46:20
>>399 だからスレ違いだってば。
判らないんだったら初心者スレで聞けよ。
×全然わからない 〇全然考えてない だろ?
403 :
デフォルトの名無しさん :2006/05/21(日) 16:18:54
メモリ領域についてなんですが、ご教示いただきたくよろしく お願いします。 BSS領域は、初期値が与えられていないデータを格納 されるといわれていますが、Cのソースコードでは どのようなコードになるのでしょうか。 ローカル変数のことであっていますでしょうか。
>>403 いいえ。一般的にローカル変数はBSS領域に格納されることはありません。
そしてスレ違い。
すみません、スレ違いなのですが 家で課題をやるためにLinuxを無料でダウンロードしたいのですが、どういうものがあるのかサイト等を教えていただけませんか? Vine Linuxは有料みたいなので・・・
○ ο o ,, --──-- 、._ ,.-''"´ \ / ヽ、 とちょっと恥ずかしい妄想をしてしまったブーンであった。 / ヽ l \/ \/ l .| , , , | l (_人__) """l `、/⌒i /⌒⌒ヽ / / | | \ /
407 :
デフォルトの名無しさん :2006/05/21(日) 17:27:14
>> 404 ありがとうございました。 スレ違いでしたか、すいません。どのスレが適切かなぁ。
C/C++コンパイラならあるのですが、Cコンパイラが無償でダウンロードできるサイトを教えてください
C/C++コンパイラではCのコンパイルはできないのか
>>409 コンパイルはできるのですが、enumの定義を変えないとできなかったりしたので・・・
>>410 どうもありがとうございますm(_ _"m)ペコリ
そうです!保存するときになぜかcppになっちゃうんです
>>408-414 スレ違い。1レスで終わる程度ならいいが、そうでないなら誘導するなりしろって。
>>407-408 現在使っているコンパイラを明示の上、初心者スレか環境依存OKスレ辺りにどうぞ。
答えたいやつが答える。答えたくないなら無視しろよ。荒らしを呼ぶだけだぞw 2chやって何秒経つんだ?
417 :
デフォルトの名無しさん :2006/05/21(日) 19:47:55
別に答えたくないわけじゃなく、クソな質問には積極的に 煽りで答えたいわけで
性根が腐ってますねpgr
宜しくお願いします printf("foo = %.8x\n",foo); なんですが、fooの値を16進数・・・・(改行)で表す までしか分かりません、 "foo = %.8x\n" の解釈お願いします
>>420 ありがとう、ドットの後の数字(8)は精度を表すという解釈で
よろしいでしょうか、
fooの値を有効精度8桁の16進数で出力せよ
あってます?
幼児かお前は
いいえ、乳児です。
いいえ、ょぅι゛ょです
ここで聞いていいのはあくまでもCの仕様のみなんですか? 明らかにスレ違いのもありますが、そうでなさそうなのも 「スレ違い、氏ね」 なんていわれますが・・・
>>425 > ここで聞いていいのはあくまでもCの仕様のみなんですか?
そのとおり。
googleツールバーみたいなIEに付けるアプリつくりたいんだけど、 C/C++で作れる?IE APIみたいなのがあってそれをCで操作して 実装する感じになるのかな?
そのとおり。
>>431 「IE ツールバー 作成」なんかでググればそれなりに見つかる。
これ以上はすれ違い。
Java質問スレにも同じ質問が 496 デフォルトの名無しさん : 2006/05/21(日) 23:39:52 googleツールバーみたいなIEに付けるアプリつくりたいんだけど、 javaで作れる?IE APIみたいなのがあってそれをjavaで操作して 実装する感じになるのかな?
そのとおり。
初心者な質問で申し訳ありませんが ファイルを繰り返し読み込むことは可能なのでしょうか? 一度プログラムを作ってみたのですが 一度目はファイルを読み込みましたが、込二度目からは読み込めませんでした どなたか教えてもらえませんか?
どのようにすればいいのでしょうか? while文でファイル内の数字を読み返した後 再び同じことを実行したいのですが
439 :
437 :2006/05/22(月) 01:09:40
>>438 ありがとうございます
なるほどこんな便利なのがあるんですね
ふつーrewind
>430>434 おまいはアタッ〇25の司会でもやりたいのか
っていうか、自治厨うぜ。
果敢にアタックしていただきましたが、>411の人、残念。
444 :
デフォルトの名無しさん :2006/05/22(月) 09:15:28
質問っていうか、下らないグチだけど、聞いて下さい 大学の研究室で、C言語使ってます 以下に類似した処理を行う、二つソース例を出します int aaa(int x, int y) { int z; z = x + y; return z; } void bbb(int * x, int * y, int * z) { *z = *x + *y; } 勿論こんなつまんない関数じゃないけど、自分はaaa()じゃなくてbbb()みたいな書き方をすることが多い。 ただ、こういう書き方をすると、他の学生から分かりにくいソースだって言われる 人によっては、何だこれ?って反応する人がいる 先生は流石に理解できるけど、なんか変なことしてるなー...って目つきで俺のソースを見る 俺のソースのどこら辺が、良くないっていうか、変? 一応ちゃんと動く
>>444 可読性だの書き方の問題では無い
まったく別のコードだろ?それ
使い分けできていれば問題ないがね
>>444 動作は間違っちゃいないが、素直じゃないソースだなぁとは感じる
なぜ関数に戻り値というものがあるのか
ポインタ渡しはどういう場合に使うべきなのか
を考え直してみるよろし
>>444 必要がなければ後者のようには書かないよ。
実行時パフォーマンスが落ちるから。
>>444 こんなソース読まされたらお前だってぶちきれるだろ?
void add(int *a, int *b, int *c)
{
*b = *c + *a;
}
値をひとつ返す時は関数の戻り値で返すという習慣を無視しているからだよ。
それから値を関数に渡したい時は値渡し、変数自体を書き換えるときはポインタを渡すという習慣も無視している。
そういう習慣・常識を覆すようなソースは読んでいてものすごい疲れる。
お前が生まれる前からCは使われ続けているんだからそこらへん無視して好き勝手やっちゃ遺憾。
# さらに言えばそう書いちゃいけないという技術的な理由もちゃんとあるがここでは省略。ともかくお手本をまねろと。
void bbb(int x, int y, int* z) { *z = x + y; } なら、俺は許す
450 :
デフォルトの名無しさん :2006/05/22(月) 09:40:47
>>445-448 愚痴聞いて頂いてサンクスです
まあ、一つの戻り値を必要とする時は流石に自分もbbbで書くことはあんまりないけど、
自分が関数を作ると不思議と、戻したい値が二つ以上になってくれることが多いのですw
すると必然的に、bbbの形になり、いつの間にか戻り値は、大して役に立たないことに使われたり、
もう使う気がなくなってたり、なんてことがある訳です
可能な限り構造体にまとめる
>>450 >自分が関数を作ると不思議と、戻したい値が二つ以上になってくれることが多いのですw
それは単に設計が悪いだけなんじゃないか?
>>451 も書いてるが、そもそもある関数が返す値というものは
基本的には関連してる物なはずだから(そうじゃないなら設計が悪い)
それを構造体にまとめれば一つになるだろ
関連する値をバラバラに扱ってるのは読みづらいし、要らぬバグの温床になる
一つの関数に大量の処理が詰め込まれてるんじゃね? で結果も大量に出る、と
>>450 返したい値が複数あるときはポインタ使ってもいいと思うよ。
そういう時でも、入力するだけのintをポインタにするのは異常。
まぁなんだ、>450みたいな香具師はC++だと非const参照使い捲くりのコード書くんだろうな、と。 或いはVBでbyRefとか。 標準ライブラリ関数の仕様と自分の仕様を見比べて、どっちが使いやすいか考えてみたら?
FORTRAN から使うことのある関数なら int でも入力をポインタにしてるのも許すが、 そうでなければアウトだな。
こんな表現を見かけました。 typedef struct {int data;} *koko; koko a = 5; なんで kokoは構造体なのに、こんな表現が許されるのでしょうか?
>>457 それポインタに5を代入してないか?
意図したコードと違う気がするんだが、タイプミス?
459 :
デフォルトの名無しさん :2006/05/22(月) 11:51:43
コンパイラはBorlandのC++Builder2006の無料版を使ってるのだが 他に無料でイイコンパイラ無い??
スレ違い
main() {} の変数宣言が終わった時点で、684kbyte メモリ使用していたプログラムが return の時点では 740 kbyte のメモリを使用していることになっていたんだけど、 これってメモリがリークしているって考えていいのかな? それともよくあること? ちなみに、MSVC++ でデバッグモードで実行させてます。
>>461 malloc()で確保したメモリはfree()しても、システムには帰らないんじゃないの?
リーク検出ライブラリ使っとけ
464 :
デフォルトの名無しさん :2006/05/22(月) 15:25:00
>>457 環境がPCじゃないなら不可侵のメモリでもいけると思います。
おそらくマイコンとかじゃないですか?
465 :
デフォルトの名無しさん :2006/05/22(月) 15:43:06
1〜10までの整数を加算して表示するプログラムを、for文で作成せよ。
main(){for(;;){puts("55"); break;}}
>>465 int main(){ int n=10; s=n*(n+1)/2; for(;;){ printf("%i\n", s); }}
468 :
デフォルトの名無しさん :2006/05/22(月) 15:56:21
1〜10までの整数までの整数のうち、偶数のみを加算して表示する プログラムを、while文で作成せよ。
470 :
デフォルトの名無しさん :2006/05/22(月) 16:16:19
>>468 int main(void) {
int i,x;
x=0;
for (i = 2;i <= 10;i = i + 2)
x = x + i;
printf("%d¥", x);
return 0;
}
相当雑に書いてみたw
471 :
デフォルトの名無しさん :2006/05/22(月) 16:17:04
あ、whileか、 whileだったらループを逆にしないといかんな
472 :
デフォルトの名無しさん :2006/05/22(月) 16:21:31
int main(void) { int i,x; i=0;x=0; while(i<=10) { i=i+2; x=x+i; } printf("%d¥",x); return 0; } これでいいの...かな? whileを滅多に使わないから自信ナッシング スレ汚しごめん
474 :
デフォルトの名無しさん :2006/05/22(月) 17:30:37
>>472 まずいwこれだと最後に12が入ってしまうやんw
orz
うむ。苦しゅうない 下がってよいぞ
#include <stdio.h> //1..Nまでの整数のうち偶数だけを加算する関数 evenCal(int N){ int rtn=0, i=N; while(i>0){ rtn += (i%2) ? 0 : i ; i--; } return rtn; } C++だと怒られる
ふーん。 そうですか。
>>477 iの初期値を「N-(N%2)」、「i--」を「i-=2」にすれば、三項演算子も要らないのに、
何故奇数まで処理するのか?と小一時間(ry
>>479 3項演算したかったからさ。
N−N%2なんてださくて嫌、それに醜いから俺は死んでもそんなカコワルイコードは書けないなーw
3項演算は掛け算にするけどね、最初頭の中では rtn += rtn*(i%2) だったんだけどさ、?:にしてみた。
奇数まで処理するのはこれなら奇数版も?のとなりの入れ替えで書けるから気持ちよい。
初心者スレでやれ
共有メモリにデータ確保すると時ってみんなどうしてる? 可変長の構造体含む場合、mmapとかでバインドできないし 困ってる typdef struct d{ char * name; int num; }Data; typde struct s{ Data *data; int id; }
483 :
デフォルトの名無しさん :2006/05/23(火) 09:39:16
フルスクリーン(最大画面)で画像を出す方法が解りません 助けてください
485 :
デフォルトの名無しさん :2006/05/23(火) 10:31:54
なんでですか? Cでフルスクリーンできないのですか?
環境依存なんで使ってるプラットフォーム(Win/linux/unix/...)専用スレ池。
っていうか毎回やってないでテンプレで誘導しろ
>>1
等差数列の和をループで処理するようなバカなんか入社させるわけねえだろ。
複雑な数式書いて短くするよりも長くてもわかりやすいプログラムを書くべきと思うが
釣られるなよ
>>488 小学生だって理解できるような等差数列の和の数式が複雑だと思うくらいなら人間やめた方がいい。
数学できんが何で悪いとや
s/数学/算数/
数学できてたら今頃プログラマなんかやってねーよ
つか、数学だけで食っていけるの?
495 :
デフォルトの名無しさん :2006/05/23(火) 16:10:43
20ケタの整数を16進数に変えるプログラムを書けって言われたんだけど、 どうしたらいいかな。とりあえずそのままじゃ無理だから文字列として扱うって事くらいしかわからん 教えてエロイ人
紙の上で手作業で変換しようにもそのやり方がわからないのか やり方はわかるがCのコードとして表現できないのか その切り分けすら面倒なのでここに丸投げしているのか。
まず16を底とする対数をとる。話はそれからだ。
>>495 宿題ならスレ違い、仕事丸投げならお門違い。
丸投げだった模様。
501 :
デフォルトの名無しさん :2006/05/23(火) 20:34:58
カンマ区切りデータを読み込むことをしています データには抜けがある事があるのですが、 (入力データの例) 10,30,20 10,20,30 ,20, ,30,20 10,,20 ・・・ このデータを以下のようにsscanfで一行づつ読み込んでデータを取り込みたいのですが。 int x1, x2, x3; char line[32]; sscanf(line,"%d,%d,%d%[^\n]", &x1, &x2, &x3); if(x1 == NULL) x1 = 0; if(x2 == NULL) x2 = 0; if(x3 == NULL) x3 = 0; などとしたいのですが、 先頭データに抜けがある場合などに、抜けがないデータも含めてx1,x2,x3すべてNULLになってしまいます。(例えば例の3行目) 多分、%d指定で読み出すべきところに値が無いことが原因かなとは思いますが、回避策がわかりません。 何か回避方法ありますか?
とりあえずsscanfはやめて一行づつスキャンしていった方が早い
504 :
501 :2006/05/23(火) 22:16:49
とりあえずfgetcあたりを調べています。
putsとprintfの違いって何ですか?
名前が違う
とりあえず覚えてみた単語を使ってみたくて 0はなんでもかんでもNULLにしたがる人って居るよね。
>>505 putsは引数で渡された文字列に改行文字を末端に付加して、
標準出力(通常はディスプレイ)に出力する関数。
printfは第一引数で書式(printfのfは書式formatのf)を指定し、
文字列を作成して、標準出力(通常はディスプレイ)に出力する関数。
具体例
char s[] = "hoge";
puts(s); とprintf("%s\n", s);は同じく表示される。
printf(s);だと改行文字が出力されない。また、配列s内に変換指定文字%が
混じっていると不定の動作になります。
文字列リテラルを表示するだけならputsの方が速くていいかもしれません。
例:puts("こんにちは、世界");
printfだと書式指定によっていろんな文字列が
作れるので原則こちらを使うといいのだと思います。
例:printf("今日は%4d年%2d月%2d日です。\n", year, month, day);
スピードは環境によっては遅いかもしれませんが。
printf系ファミリーは、ディスプレイに文字を表示する関数群、じゃなくて
「書式を指定したらいろいろ文字列を作ってくれる関数群」と考える
べきではないかと。
510 :
デフォルトの名無しさん :2006/05/24(水) 01:18:50
>>507 そういうやついるな。
NULLがポインタだってわかってないから困る。
個人的には使いたくないんだけど, 可変長配列って推奨もんなのかね?
構造体の最後のやつの事なら、 確かにあんまり使いたくないね。 BMP の扱いで要求されたりすることはあるけど。
現状を規格が追認したって感じじゃね? 俺はデータ構造をフラットなメモリに展開したい場合に使ってた たとえばプロセス間通信でバイナリでまんま転送したい時とか (構造体にポインタを含むと渡せなくなるから) まんまファイルにシリアライズしたい時とか WindowsだとBITMAPなんちゃらで使ってたりしてた様な
514 :
困ってます :2006/05/24(水) 07:38:41
1. 指定された個数だけ整数を読み込んで、それらの合計、平均、分散、標準 偏差を表示するプログラムを作成せよ。for文を使うこと。 2. 14の段数をもつピラミッドを表示するプログラムを作成 せよ。 3. 9段の市松模様(以下の例を参考にせよ)を表示するプロ グラムを作成せよ. 段数は? 3 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *ここまで1段 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *ここまで2段 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *ここまで3段
>>514 マルチのスレ違いはお帰りください。
つーか、釣りか嵐の積もりですか?
>>514 > 困ってます
一 生 困 っ て ろ !
はぁぁ・・・ステキなステーキ・・・ ↑ これの解読お願いします。
>>517 ( ´∀`)つ[_gaキーテスなキテスdadぁぁは]
519 :
デフォルトの名無しさん :2006/05/25(木) 20:37:34
リスト構造について質問です 改行が多いので二回に分けて投稿させてください struct LIST { int data; void (*func)(); struct LIST *next; }; struct LIST top; ・ ・ ・
520 :
デフォルトの名無しさん :2006/05/25(木) 20:38:10
void listcnt(void) { struct LIST *p; for( p=top.next; p!=NULL; p=p->next ) { func(); } } void addlist(int val) { struct LIST *new; (略) new->func=hoge; } void hoge(void) { ここでdataをいじる } こんな感じのプログラムを書きたいのですが hoge関数内で生成されたリストの変数を操作するにはどうすればいいのですか
521 :
デフォルトの名無しさん :2006/05/25(木) 20:42:12
連投ですみませんが、最後の文章が誤解を招きそうなので一応訂正します。 何がしたいかというと、addlist関数で生成したリストのdataをhoge関数内で操作したいのです。
523 :
519 :2006/05/25(木) 20:48:33
できました。ありがとうございました
>>482 > 共有メモリにデータ確保すると時ってみんなどうしてる?
自前で共有メモリ用malloc関数書くしかないんじゃない。
前やったときは仕方なくそうした。少し面倒だったけど。
525 :
難問〜 :2006/05/26(金) 17:00:30
素因数分解の問題で、再帰を使って、和が一定となる自然数の列をすべて列挙するプログラムが わかりません〜。 そして再帰を用いずに素因数分解を行うプログラムもわかりません。 これできたらマジ天才ですよ!! 尊敬尊敬〜。
526 :
難問〜 :2006/05/26(金) 17:03:26
参考プロです!! #include<stdio.h> void abs_sum(int n,int w); int main(){ int w=2,n=3; abs_sum(n,w); return 0;} void abs_sum(int n,int w){ void in_abs_sum(int total_length,int n,int w); in_abs_sum(n,0,w);} void in_abs_sum(int total_length,int pos,int w){ int i,j,called=0; if(pos>=total_length){ putchar('\n'); return;} for(i=0;i<=w;++i){ if(called++){ for(j=0;j<pos;++j){ printf(" ");}} printf(" %2d",i); in_abs_sum(total_length,pos+1,w-i);}}
アンジーハァハァ
529 :
デフォルトの名無しさん :2006/05/26(金) 20:06:39
http://www.dotup.org/uploda/www.dotup.org1046.zip 現在、大学で卒研の課題出されてて、それの為のプログラムをANSI Cで書いています。
高域通過フィルタを作るプログラムです。
ところがなぜか、このプログラム、自分が使ってるマックと、学校にあるウインドウズで、異なる動作をするので困っています。
ANSI C以外の怪しい命令は使っていないつもりです。
マックで動作させると、ちゃんとフィルタとして作動するんですが、ウインドウズで動作させると、何が何やら訳が分からない波形が出力されます。
このプログラムを実行させると二つテキストファイルが出力されます
入力波形がx-i、出力波形がy-iです
一列目がX軸、二列目がY軸の値です
エクセルや、Sma4Winなどで開けると思います。
学校で使ってるコンピュータ(Win)のCコンパイラはVisual C++ 6.0
自分のマックのCコンパイラはXcode 2.2です。
コンパイルの時にはエラーも警告も出ていません
見た感じだと、y-iの出力の段階で既に、別物になってしまっています
ソースは使っていない関数(別の課題のを切り貼りした所もある)とかもあってゴチャゴチャで申し訳ありませんが、ちょっと見て頂けると助かります。
両方のコンピュータで正常に動くことを望んでおります。
>>528 適切なスレの選択も解ってないようですね。
>>529 全然みてないが、宿題スレに行くといいんじゃないかと
>>529 関数lpfの戻り値をよく追いかけろ。
俺はお前のデバッガじゃないからそれ以上は知らん。
>>529 int*lpf(){int c;return &c;}
>>529 それで、よく「ちゃんと動く」って宣えるね。
535 :
デフォルトの名無しさん :2006/05/26(金) 23:11:11
自動変数への参照は返しちゃダメよってママがよく言ってた
537 :
デフォルトの名無しさん :2006/05/26(金) 23:26:50
一つ怪しいところが見つかったのでちょっと訂正してみました 取りあえず今度学校に行った時に、窓機で再試験してみます ありがとうございました
ものすごくFAQかもしれないけど,ちょっと前までのC文法って compound-statement ::= "{" declaration-list statement-list "}" となってるけど, なんで宣言部分をブロックの先頭に書くことになってるのか理由が知りたい. 歴史的な理由とかあるんですか? 別に declarationを特別扱いしないでも良さそうなもんだよね. 好きなところで変数を宣言したいよ.(してるけど...gccばっか使うから)
単に歴史的な理由です
540 :
デフォルトの名無しさん :2006/05/27(土) 11:07:49
>>538 すきなところにブロックを作って変数宣言すればいい
ANSI-Cの規格内でOOPもどきをするための一般的なやり方みたいなものはないのでしょうか?
>>541 そこに労力を費やしても後で後悔することになるので
ほどほどにしておくのが一般的です
>>542 言われてみれば確かに似てますね。見てみることにします
>>543 それは分かってるのですが、OOPの方が綺麗に纏まりますし
C++は使ってはダメなのでどうにかできないかと思って・・・
とりあえずFILE周りを参考にやってみたいと思います。ありがとうございました。
質問です。これらのうちだとどれ選びますか? (ちゃんと動くか確認してないから間違ってるかも) int func(void)は最終的には0を必ず返すとして while(x=func()){... while((x=func())!=0){... while(x=func(),x){... #define While(x) while((x)!=0) 警告は無視 警告を無効に
>>545 一番上以外を選ぶ理由があるなら聞いてみたい
>>545 下の二つは今までお目にかかったことない
全部見たことあるけど、変数1つで引き回すときは1か2を使う 3,4は大体デスマ系でよくみるね(1000時間ぐらいのデスマ)
俺は1を使うのが好き。 でも糞コンパイラが=と==間違ってない?とか警告出して来てうざいので。 コンパイラに文句を言いながら2だな。
while (int x = func())って言おうと思ったら、C99でもここでは変数宣言できないことに気付いた。
for(;;){ x=func(); if(!x) break; }
ANSI-Cの標準ライブラリ関数の一覧が書いてあるサイトを教えて下さい。
"C 標準関数"くらいは検索してみようと思わないのかね
見つかりました。検索の仕方が下手だったようです。ありがとう。
「ANSI-C」とかきもい書き方すんなよ。
あんしーしー
558 :
デフォルトの名無しさん :2006/05/27(土) 18:54:39
お願いします。。。。 [1] 授業単元:訓練校のCの基礎 [2] 問題文(含コード&リンク): char data[3][11]={{"□□□□□"}, {"□□□□□"}, {"□□□□□"}}; この二次元配列のの真ん中(2行目の横から3つ)の 「□」に「人」を代入する方法を教えて欲しいです。お願いします。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン:ボーランド6.0 [3.3] 言語:たぶんC
>>555 批判するなら代案を出せ
批判するだけして代案出さないとか弱小野党と一緒だな
ISO-C
C-99
memcpy(&data[1][0] + 4, "人", 2);
オチはあるんだろうな
565 :
デフォルトの名無しさん :2006/05/27(土) 21:50:51
>>565 intじゃなくてcharの配列にしてみたら?
>>565 × for(j= i; i*j<N; j++) a[i*j]= 0;
○ for(j= 2; i*j<N; j++) a[i*j]= 0;
まぁ出来れば乗算じゃなくて加算で書いてほしいとこだけど。
あとintよりもcharの配列にするかbit単位に埋め込んだほうが良いと思う。
568 :
デフォルトの名無しさん :2006/05/27(土) 22:04:50
>>566 ,567
お答え、ありがとうございます。
charの配列にするということでやってみます。
>>568 あと最後のカウント用のループでi<=Nとなってるけどi<Nの間違い。
570 :
デフォルトの名無しさん :2006/05/27(土) 23:18:01
>>562 >>563 ありがとうございます。
563のほうはエラー吐きました。
memcpyをつかうと埋め込むことが出来ました。
あぼーん
他人の不幸程どうでも良い事は無いwwwwwwwwwましてや掲示板
574 :
デフォルトの名無しさん :2006/05/28(日) 01:13:47
本買いました。よくわかりません。 2000円はらいました。 よくわかりません。 でもすこしわかります。 ちょっとなら。
576 :
デフォルトの名無しさん :2006/05/28(日) 09:47:33
Download the seqFIO.cpp file. This file provides an example of how to use iostreams to perform sequential file I/O. Compile and run the code. It is best to use the Win32 Console template in Visual C++ Express to create the project for running this program--there is no GUI associated with this code; only cin, cout, cerr, and a file are utilized to perform I/O. After analyzing the code, and understanding how iostream file I/O is done, modify your Hangman game as follows. Use a file called
577 :
デフォルトの名無しさん :2006/05/28(日) 09:59:26
↑すいません、途中で切れてしまいました。
578 :
デフォルトの名無しさん :2006/05/28(日) 10:49:41
質問です。 #include <stdio.h> #include <string.h> #include
579 :
デフォルトの名無しさん :2006/05/28(日) 10:56:45
質問です。 #include <stdio.h> #include <string.h> #include "stdafx.h" int main(void) { char string[] = "abc,def,ghi,jkl"; char delimiter[] = ","; char *token; token = strtok( string, delimiter ); while( token != NULL ){ printf( "%s\n", token ); token = strtok( NULL, delimiter ); } return 0; } 文字列を分離するプログラムなんですが、 ビルドすると「error C3861: 'strtok': 識別子が見つかりませんでした」が出てきます。 何が原因なんでしょうか? ちなみに、VisualStudio2005を使ってます。
>>579 #include <string.h>
はstdafx.hに書く
それが嫌ならプリコンパイルドヘッダは無効にする
581 :
デフォルトの名無しさん :2006/05/28(日) 11:34:14
>>580 動きました。
ありがとうございました。
582 :
デフォルトの名無しさん :2006/05/28(日) 12:36:14
WinMainでstrtok関数を使うと、 「error LNK2019: 未解決の外部シンボル __imp__strtok が関数 _WinMain@16 で参照されました。」 が出てきます。 #include <string.h> はちゃんとつけてあります。
>>582 そういうことはVisual C++かなにかお前が使っているコンパイラのスレで聞いたほうが適切な回答が来やすい。
584 :
デフォルトの名無しさん :2006/05/29(月) 16:07:15
60点以上の点数が入力されるまで 再入力を繰り返すプログラムを作成せよ。 (ヒント:無限ループとbreak文を使用する) 実行例 1回目点数入力:30□ 不合格です。再試を受験してください。 2回目点数入力:70□ 合格です。 □はエンターキーを示す
│ │ ≡ ('('('('A` ) │≡ 〜( ( ( ( 〜) │ ≡ ノノノノ ノ ↓
│↑ └┘ おらっしゃあぁぁ!!! ∩∧ ∧ ヽ( ゚Д゚) \⊂\ O-、 )〜 ∪
>>584 int main(){int input,i=0;while(1){puts("('A`)ノ");scanf("%d",&input);if((0<=input)||(input<=(3*20-1)))puts("不合格");
else if(((6*10)<=input)||(input<=(10*10)))puts("合格");break;else puts("ERROR");}return 0;}
>>584 動作例を見ると、入力する数字は全角になっているけど大丈夫?
すいません、先生(;3;)
strstrで 第一、第2引数がchar* xで、 第1が文字列リテラルを
リテラルを?
scanf系の戻り値をチェックするのは当然のことと思ってますが printf系(特にfprintf)の戻り値もチェックするべきなのでしょうか?
>>593 現場の空気で、チェックしたりしなかったり。
>>590 ファイルに出力する場合などはチェックするべきではないかと。
#まぁ、業務でもなければ省略することもあるが。
591: (続き) リテラルをプログラム中に書いてて、 第2は文字列を指してるんだがリテラルは書いてない。 これが、strstrがNULL戻すので困ってるんです。 Mysqlのテーブルに検索したい文字列を入れといて つぎつぎに取得していって(その取得した文字列へのポインタが第2引数)、 つぎつぎに第1引数の文字列を strstrするというのが目的です。 char*じゃだめなんでしょうか? プログラム中に
”文字列リテラル”がないとだめなんでしょか? そうなら const char*じゃなくて char*で よいような strstrみたいな関数ありますか?
>>596 日本語でおk
お前は自分の書いた文章を自分で読んでみろ
はい。とりあえずねます。
ソース書け。ソース。
#define ORE TENSAI
fgetc()等の返値はintになってますが、charで受け取っても問題ないのでしょうか?
使い方による。
>>602 エラーが起きない(≒ファイル終端に達しない、入力を閉じられない)前提がない限りダメ。
>>603-604 レスありがとうございます。それはcharの符号の有無が処理系定義だからでしょうか?
それと質問ばかりですが、全ビットが1のビット列を得るための
確実な方法はあるのでしょうか?
>>605 文字 0xff を受け取ったとき、char に突っ込むと
EOF と区別が付かなくなる。
>>606 やはりそれでよかったのですか。
符号の表現方法として、1の補数、2の補数、符号と絶対値の3通りがあるので
どれかで破綻がでるのではないかと思っていました。
>>607 なるほど・・・それではなるべくint等で受け取るようにしたいと思います。
わざわざ回答してくださってありがとうございました。
自分のプログラムでオプションを取らせたいと思い 下の様にswitchのネストでオプションの処理をするのを考えてみたんですが こういう場合に決まったやり方のような物はあるのでしょうか? switch (argv[i][0]) { case '-': switch (argv[i][1]) { case 'h': 略} break; default: (オプションじゃ無いときの処理) break; }
610 :
デフォルトの名無しさん :2006/05/30(火) 23:31:52
すみません質問なんですがlibtiffを使った画像のG3→G4への変換をC言語 で作成したいのですがコレでは無理ですかね・・? 無理やり繋ぎ合わせた感じなのですが・・詳しいかたよろしくお願いします
標準C
612 :
デフォルトの名無しさん :2006/05/30(火) 23:57:12
よく読んでいませんでした・・ すみません・・
>>609 getoptのある処理系ならそれを使う。
無ければ…個人的にはswitchの中にswitchっていやだから、
-見つけたら-以降を解析する関数に飛ばすとか。
なんの工夫もなくif でやる。 if (strcmp(argv[i], "-h") == 0) { ... } else if (strcmp(argv[i], "-o") == 0) { ... } ... else { .. }
>>613 オプション専用の関数作るってことですか?
すっきり纏まりそうでいいですね。その方向でやってみたいと思います。
>>614 それだとオプション追加とかは楽なんですが、見た目が何となく嫌なので・・・
#include <stdio.h> char *p =
#include <stdio.h> char *p = "Hello, World\n"; main(){ char *pp; pp = p; while(*p!='\n') { printf(*p); p++; } } ポインタを用いて「Hello, World」と印字したいのですが、上手くいきません・・・ どこをどう変えれば正しく動くようになるのでしょうか? (while文をどうすればいいのかよく分かりません)
618 :
617 :2006/05/31(水) 01:50:29
すみません、事故解決しました
>>617 printfの引数はポインタなんで、printfの使い方がおかしい、printf("%s\n", p);だろ
という話は置いといて…一文字ずつ出したいのかな。
char *pp;
pp = p;
while (*pp != '\0') { /* '\n'まででもいいけど */
printf("%c", *pp);
pp++;
}
酔っ払って眠いから間違ってたらゴメン。
"ポインタを用いて「Hello, World」と印字したい"のなら printf(p); でイナフだ。
621 :
617 :2006/05/31(水) 02:03:25
>>619 どうもありがとうございます。
1文字ずつ印字するプログラムを考える必要があったのでとても助かりました。
だれかこのプログラミングを教えてもらえますでしょうか? x=x0 , x1 , x2 , ・・・ , x40 , x41 y=y0 , y1 , y2 , ・・・ , y40 , y41 近似式 y=ax^3+bx^2+cx+d 上の関数とデータで非線形最小自乗法を用いて近似した式を求めよ。 すみませんがよろしくお願いします。
教えて欲しいなら何がわからないのかくらい書け。 宿題丸投げならよそでやれ。
>>622 何が分からないのかわからんのだが、
1/2 Σ[n=0->41] {Yn - (aXn^3 + bXn^2 + cXn + d)}^2を偏微分して正規方程式を作って(ここまでは手作業)
そこにデータをつっこんで行列の計算するだけじゃまいか?
画面クリア行いながら,スペースキーの入力により一時停止,文字qの入力により終了するよう 図形を交互に表示するにはどのようなプログラムを組めばよいですか?
なにを言ってるんだお前は
>>625 「画面クリア」という動作は環境に依存した動作になるため標準的な方法は存在しない。
>>625 rewind(stdin)で100%おk
rewind(stdout)で120%おk
rewind(stderr)で200%おk
何が面白いんだ
そんなことも分からないのか
何が面白いんだ
よかろ〜もん
このスレでネタは兎も角釣りはやめてくれ。 つーか、質問も理解しないで正しくもない知識を振り翳さないでくれ。
スレ違いですね・゚・(ノД`;)・゚・ 移動します。
どこでも変数宣言ってc99じゃできなかったっけ?
>>641 C99以前はできない。C99はできる。
ちょっと教えてください ADDRESS 00 01 02 03 04 05 06 00000000 40 00 40 00 07 00 00 上のはヘキサエディタで開いた一部なんですけど 0x04-0x05にある07 00 を 整数として変数に格納するのに //fopen(rbモード) fcloseは省略 int buf; fpos_t fpos = 4; fsetpos(fp, &fpos); fread(&buf, 2, 1, fp); printf("変数buf -> %d", buf); としてもbufに10進数で7と入らずprintf文でなにやら分からない数字が出るんですが 間違っているところを教えてもらえないでしょうか
>>643 そういう数値で位置指定をしたいならfseekの方がよい。
また、お前のところのintは2バイトか?最近は4バイトであることの方が多いぞ。
あと、エンディアンも関係ないか?
インテル形式でsizeof int = 4なら buf = 0; fread(&buf, 2, 1, fp); とすれば良いはず(初期化しとかないと下位2byteにゴミが残る)
>>644 ,645,646
レスどもです
説明不足で申し訳ないです.ファイルの中身が
07 00 BE CC C0 CC C5 DB 36
といった感じで
後続文字byte数 文字列
みたいな形式になってるのでsizeof(int)で4byte1ブロックだと07 00 BE CCがbufに入ってしまいえらいことになるのです OTZ
もちろんsizeof(int)は4でした.
リトルエンディアンでfreadはたしか大丈夫だったと思います
そして.buf = 0;で初期化すると正しく7と表示されました.
ありがとうございます!
あとスレ違いになるかもしれないんですけどそのゴミとはなんでつくんでしょう?
初期化してないから。
>>643 1バイトづつ読めばいいのに。
buf = getc(fp) & 0xff;
buf <<= 8;
buf |= getc(fp) & 0xff;
>>647 fread 前に初期化していないと:
┏━┯━┯━┯━┓
buf ┃ワケの解らない値.┃
┗━━━━━━━┛
fread 後の状態:
┏━┯━┯━┯━┓
buf ┃07│00│ない値.┃
┗━┷━┷━━━┛
<------>
ここしか書き換えられない
charに入れた文字を1ビット毎に切り出したいのですが ビットフィールドを下位ビットから設定していく方法は無いのでしょうか?
>>650 なるほど
箱を用意しても掃除してからじゃないとだめということですか〜
AAまで作って説明してくれてありがとうございます
>>652 &でもいいのですが、もうちょっと楽に取り出せないかと思って・・・
>>654 やっぱりそうですか。わざわざありがとうございます
>>655 & 使えよ。
#define bit(x,y) ((x) & (1 << (y)))
>>657 #define BIT_TEST(x, y) (((x) >> (y)) & 1)
の方が 0 or 1 になって良さげ。
唐age
660 :
デフォルトの名無しさん :2006/06/06(火) 00:51:01
あるアドレスの中身をバイナリで見たいのですがどうすればいいですか?
「バイナリで見る」を具体的に定義してください
663 :
デフォルトの名無しさん :2006/06/06(火) 01:11:33
>661 float a = 2.5 と、されているときのメモリの中でこの値がどのように表現されているかが見たいんです。
union {float a; unsigned short b;} fs; fs.a=2.5;printf("%X",fs.b);
浮動小数の形式がIEEE754であることは intが32bitであることより nullポインタの全bitが0であることより 期待しても良いのではないかと思う。 もちろん、標準Cで規定されているわけではないが。
>>665 どれも期待したところで保証がないことに変わりは無い
>>664 何故short?
>>663 float a = 2.5;
unsigned char * p = (unsigned char *) & a;
for (int ic = 0; ic < sizeof(a); ++ic) printf("%02x ", p[ic]);
エンディアンは?
インディアン
嘘つかない
今日は死ぬにはいい日だ
今日自殺するので休みます。 ・・・あ、板まちがえた?
>>668 この場合エンディアンがどうなっていようともとにかくメモリ上にどう
入っているのかをそのまま見たいということではないのか?
まあどうでもいいか。
> メモリ上にどう入っているのかをそのまま でも結局、複数 bytes のデータを見るときはエンディアンを考慮しなきゃ いけないんじゃないか?
floatにエンディアンも糞もねーよ糞
そうだよ!floatは1byteに決まってんだろーが!
char *p = "hoge"; のとき、 p++; p++; p++; と p += 3; は同じ意味?
もちろんオナニー
*(p+3)とオナニー
>>680 ちょwwwwwおまwwwwwwwwwwww
目 ↓ 尻の穴→ *(p+3) ↑↑ 口(よだれ) 耳
>>677 sizeof(float) == 1 ?
そういうシステムがあると聞いたことはあるが。
684 :
デフォルトの名無しさん :2006/06/08(木) 02:35:26
じゃ、保守と。
テキストファイルの中に特定の文字列が存在するかどうか 検索したいのですが、fopenで検索対象ファイルを開いて、 配列に文字列を読み込んで、strstrで検索するのがよいでしょうか。 それとももっとよい方法があるでしょうか。
>>685 Unix系環境ならsystem("grep keyWord file")の戻り値で判断。
検索することに意義があるのでなければ、テストすべきロジックが増えるよりもよい。
Cを使わずにgrepでも使え
>>686-687 なるほど。systemでgrep呼び出して使う手がありましたね。
それを試してみます。
CGIプログラムで system() 使う場合は要注意。
質問です。
問題文:
ttp://pc8.2ch.net/test/read.cgi/tech/1147908265/152 の貯金プログラムを拡張して、額の表示の際に3桁ごとにコンマを入れる形式をとるようにせよ.下記例のようにどのような桁数でも桁数に応じてきちんと表示できるようにすること.
12円⇒12円
789012円⇒789,012円
1000001円⇒1,000,001円
1234567890円⇒1,234,567,890円
環境
OS: (Windows
コンパイラ名とバージョン: Visual Studio.NET2003
言語: C
その他の制限: まだ初期で、if,for,whileまで習いました。
どうか、よろしくお願いします。
文字列操作がまだだったらまだ早い気がする せめて柴田本を後ろまで読んだほうがいい
694 :
デフォルトの名無しさん :2006/06/08(木) 20:22:50
うむ
>>693 cgiの場合、そもそも/bin/shを開放していないかもしれないという点でsystem()が使えないかもしれない。
しかし、その辺りはWebProg板の領分になりそうなので詳細は割愛。
C言語って余計な括弧つけると、実行が遅くなったりする? 例えば i = a*b +1; と i = (a*b) + 1; で実行速度違ったりする?
そんなこと言ったらコンパイラによって(ry
>>696 できたプログラムの実行速度に変わりは生じないだろう。
コンパイル速度の変化は全く無いわけではないが、完全に無視できる。
気にせずに括弧をつけたければつけなさい。
>>696 それで実行速度が変わるようなコンパイラがあったらお目に掛かりたいよ。
コンパイル時間はかわるかもしれんな
int a[1][1][1][1][1][1]; a[0][0][0][0][0][0] = 1;
(*****puts)("hello");
質問です。 C言語ですが、forkしたあとwaitで待つプログラムをよく作ります。 これはビジーウエイトなのでしょうか??
fork シグナル でググると幸せに
そのどちらもスレ違い。
706 :
デフォルトの名無しさん :2006/06/09(金) 14:12:27
餅つけ
707 :
デフォルトの名無しさん :2006/06/09(金) 14:15:24
ポインタを理解するには…どうしたらいいでしょう?
理解しようとするな。 ただ感じるままに書くべし、読むべし、調べるべし
a = b == c これはどのような意味になるのでしょうか?
>>709 bとcが等しければ1が、bとcが等しくなければ0がaに代入される。
なるほど〜! どうもありがとうございます。
712 :
デフォルトの名無しさん :2006/06/09(金) 15:46:01
>>707 ポインタ(というかアドレス)でしかメモリや分岐先を指定できない言語を使ってみれば嫌でも覚える。
つまりはマクロなしアセンブラ、機械語。
C言語には、10進・16進・8進数表記がありますが、なぜ2進数表記が無いのでしょうか。 ずっと気になって仕方がありません。
仕様です
じゃあ しようがない
char *a; a = (char*)malloc(sizeof(char)); malloc関数を使うとaには桁数の多いアドレスが入るんですが、 malloc関数を使わなくてもaには1というアドレスが入ってますよね? どういう利点があるのでしょうか?・・・
bやcには何が入っていた?
文字列が入ってる感じですかね?・・・
>malloc関数を使わなくてもaには1というアドレスが入ってますよね? ???
>>707 経験かな
データ構造あたりを勉強するといいかも
お勧めとかないけどamazonあたりで”データ構造とアルゴリズム”か”アルゴリズムとデータ構造”で
>>716 そんな初期化はANSIで定義されてないと思うよ。
722 :
◆GREAT3AJss :2006/06/09(金) 22:29:24
OS:WindowsXP VC++7.1 foo.txt テキストファイル foo2.exe 標準入力を受け取るプログラム で以下のようにsystem()関数をコールしましたが、 system("type foo.txt | foo2.exe"); foo2.exeが戻り値で0以外の値を返しているのにsystem()関数が0を返します。 パイプでコールした場合はどうやって戻り値を取ればいいのでしょうか?
mallocしない場合には、aは初期化されてないから、わけのわからない値が 入ってることはある。 mallocせずに、*a にアクセスしようとすると、エラーになる。だって確保されてないんだし。 文字列とかあらかじめどれくらいメモリ確保すればいいかわからん場合は ポインタ型で定義して、mallocして、プログラム内のどこかで必ずfreeする。 これ、基本。
>>722 system()関数の中の仕様についてはスレ違い。
OS依存のプログラムを書いているのなら、OS依存の方法で取得するのが無難じゃない?
GUIってCで扱えないの? C++でGUIって扱える?
もともとGUIの無い環境では、GUIは扱えない。環境依存。 Windows環境なら、GUIプログラムは作れる。
727 :
デフォルトの名無しさん :2006/06/09(金) 23:32:25
>>725 扱えるも扱えないも、C・C++は言語自体の仕様として入出力を規定して無いだろ。
環境によってはライブラリが提供されてるかも、ってだけ。
>>725 お前がゼロからライブラリを書けばお前の好きなように出来る
>>724 すみません。
system("foo2.exe < foo.txt")
でやりたいことは解決しました。
お騒がせしました。
突っ込みいれようとしたけど気づいてくれたか・・・
731 :
デフォルトの名無しさん :2006/06/12(月) 10:38:08
C FAQで見つけた可変個の引数の関数を参考にして使っています。 参考というよりは、そのまま使っています。 VC++.net gcc version 3.4.4 20050721 (Red Hat 3.4.4-2) では問題なくコンパイル&実行できたのですが、 gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-53) では、コンパイルできましたが、以下のように呼び出すとSegmentation faultします。 error("%s\n", "エラーしました"); でも、以下のようにすると正常動作しました。 error("エラーしました\n"); いろいと試した結果、% があるとSegmentation faultするようです。 何か対策方法をご存知の方おられましたら、アドバイスよろしく御願いします。 #include <stdio.h> #include <stdarg.h> void error(char *fmt, ...) { va_list argp; fprintf(stderr, "error: "); va_start(argp, fmt); vfprintf(stderr, fmt, argp); va_end(argp); fprintf(stderr, "\n"); }
>>731 直接stderrに書き込まずに、vsprintfで一端バッファに書き込んでから
それをまとめてvfprintfで書き込んでみては如何でしょう
3.4.4だと問題ないな。3.2は無いから試せない。
int main (void); int main (int argc); int main (int argc, char **argv); int main (int argc, char **argv, char **envp);
>>734 最後はANSI Cで受け付けねばならないと明示されている形式ではないな。
>>735 どれも受け付けねばならないとは書いてないが...
各処理系がどのように定義するべきかとして以下が規定されてるだけ.
freestanding 環境の場合:
処理系定義
host 環境の場合:
int main(void)
または
int main(int argc, char *argv[])
または
int main(int argc, char *argv[]) と等価な物
または
処理系定義の物
int main(int argc) や int main (int argc, char **argv, char **envp)
は処理系定義の物として無問題.
つか, 処理系定義であればなんでもありあり.
でもまぁ、でふぁくとすたんだ〜ど、ってのもありますがな。
>>737 それをゆうだったら
int main (int argc, char **argv, char **envp)
は, Unix 互換環境ではある意味, でふぁくとすたんだ〜ど.
739 :
デフォルトの名無しさん :2006/06/12(月) 18:06:48
階乗(Factorial)計算を行うプログラムを作成する。一つの入力値に対して階乗計算を行い、結果を出力するプログラムを作成せよ。 ただし、次の仕様に基づいた関数を作成するものとし、main関数とfct関数は一つのファイル上に作成するものとする。 階乗とは?: 1からnまでの連続する自然数の積。n!で表される。(0の階乗は1) 計算式 : n! = n*(n-1)* ... *2*1 例)5! = 5*4*3*2*1 プロトタイプ宣言: int fct(int n); すまん、わけわからん 誰かお助け…
int fct(int n){ printf("%d!\n",n); return 0; }
int fct(int n) { return (n == 1)? 1 : n * fct(n-1); } とスタックの無駄遣いをしてみる。
int fct(int n) { int tmp=1; while(n != 0) { tmp*=n; n--; }
#include<math.h> int fact(int n){ return tgamma(n+1); }
main関数で、char型を宣言し、自作関数に渡して文字列を入力してもらい、 それをmain関数に返すにはどのように書けばいいのでしょうか?
>>746 「char」型に「文字列」は入りません。
# って言うか、マルナゲ反対!
すいません。char型の配列です。
>>746 まず自分の考えたとおりにやってみろ。
うまくいってもうまくいかなくても、とにかくやってみてからここへ来い。
何度もやってます。現在進行形で・・・ ポインタの配列を理解してないみたいだ・・・
>>750 「ポインタの配列」と言うと別なものになっちゃうよ。
配列をmain関数で用意し、その配列のポインタ(先頭アドレス)
を自作関数に渡す。自作関数で、そのポインタにscanf等で入力すれば、
mainで用意した配列に文字列が入力されたような感じになる。
void input(char *);
main(){
char str[256];
input(str);/* この関数内で入力する */
/*以下略*/
return 0;
}
input関数の中身を自分で書けるかどうか検討してみて。
>>751 さんありがとうございます。
結果から言いますと、配列の[]内の数字が小さくて、それでエラーが出てたんですが、
文法の方が悪いとばかり思ってエラーメッセージを読んでなくて行き詰まってました・・・
ホント、馬鹿ですよね・・・俺の3時間が・・・でも、もう二度とこんなヘマはしないと思います。
それとこのエラー、VS.NET2005ではプログラム動かした時に、エラーが出ましたが、
コマンドラインで動かした時はエラーは出ませんでした・・・
これで、気づいたんですけど・・・
753 :
デフォルトの名無しさん :2006/06/13(火) 22:07:45
すいません。ポインタについて質問なのですが、下記のような関数があるんですが Swap関数で数値が入れ替わるのはポインタでiDat1とiDat2のアドレスが引数で指し示されているから 戻り値(代入?)みたいになってiDat1・2に入れ替えられたものが代入されて5と8が入れ替わると言う風に理解しました。 それでわからないのがSwap2関数ですが、これはiDat1とiDat2が引数に入れられても Swap2に代入しただけでポインタで指し示されていないからSwap2関数の中で数字の入れ替えをしても、 iDat1、iDat2へ反映されておらず数字の入れ替えは起こらないと 理解すればいいのでしょうか。自分は戻り値という表現は正しくないと思います。 Swap1とSwap2の関数の違いが先生に聞いてもよくわからないんで どなたか、この二つの関数で何が起こっているのか、わかりやすいアドバイスお願いします。 int iDat1=5,iDat2=8; void Swap(int *p1,int *p2) { int iTemp; iTemp=*p1; *p1=*p2; *p2=iTemp; } void Swap2(int a,int b) { int iTemp; iTemp=a; a=b; b=iTemp; }
>>753 前者は「ポインタを渡すから、ポイント先のオブジェクトを入れ替えてね」とお願いしている。
後者は「値だけ渡すから、中で色々計算してね」とお願いしている。
つまり、後者の方は関数内のローカルな変数の値しかいじれない。
前者は、ポインタを元に、関数外部のオブジェクトにアクセス出来る。
Swap(int *p1,int *p2) では、int型の変数がメモリ上でどこに格納されているか っていう情報を引数に与えているので、そこのメモリを直接いじれるんだけど、 Swap2(int a,int b) では、a = xx; b = xx っていう風に値をコピーしてから a, b を弄っていることになるので、Swap2の呼び出し元では値の変更が得られないわけだ。
つーか、お前等初心者は初心者スレに誘導しろよ。
char *a; /* ポインタ */ char a[10]; /* 配列 */ char *a[10]; /* ポインタの配列 */ char (*a)[10]; /* 配列へのポインタ */
>>753 肝心のところが抜けてる。
int main(void)
{
int iDat1=5,iDat2=8;
Swap(&iDat1, &iDat2);
Swap2(iDat1, iDat2);
}
これが無いと、答える側が困る。
&iDat1はiDat1が格納されているアドレス。
iDatはiDat1の値そのもの。
んで、これを踏まえた上で、関数を見てみよう。
void Swap(int *p1,int *p2)
この関数では、*p1がiDat1のエイリアスになる。
なんか、飽きたので、途中だが終了。
759 :
デフォルトの名無しさん :2006/06/13(火) 23:59:51
早い回答ありがとうございます。753です。
>>754 >>755 >>758 前者のSwap1の*p1などがショートカットの役割をしてメモリにアクセスして、
後者はSwap2内だけでしか処理できないということですか。
>>756 えと、すいません。今度は初心者スレで聞いてみたいと思います。
>>757 ポインタと配列の関係は自分は習っていないようです。
(学校休んでいたのでやってないだけかもしれませんが。。。)
おいおい勉強していこうと思います。
沢山のアドバイスありがとうございました。
760 :
754 :2006/06/14(水) 00:19:53
>>759 > ショートカットの役割をして
…ショートカット……………
だいぶ、初心者向けに書いたつもりだったんだけどなぁ…orz
iDat1=5, iDat2=8 a=5, b=8 (Swap1 が呼び出された) iDat1=5, iDat2=8 a=8, b=5 (a と b の値が交換された) iDat1=5, iDat2=8 (main に戻った、iDat1, iDat2 の値は変わっていない) iDat1=5, iDat2=8 p1=↑ p2=↑ (Swap2 が呼び出された) iDat1=8, iDat2=5 p1=↑ p2=↑ (*p1 と *p2 の値が交換された) iDat1=8, iDat2=5 (main に戻った、iDat1, iDat2 の値が変わっている)
>>761 Swap1 と Swap2 が逆じゃね?
ショートカットの説明になっていない
だから初心者スレに任せろって。 ここの連中は融通利かないんだからw
765 :
デフォルトの名無しさん :2006/06/14(水) 21:13:10
766 :
デフォルトの名無しさん :2006/06/14(水) 22:55:42
構造体を2次元って宣言できますか? typedef struct st{ int num } ST a[3][3] みたいな感じで
むしろなぜ出来ないかもしれないと思ったのか
typedef が閉じられてない気がする。
770 :
デフォルトの名無しさん :2006/06/14(水) 23:10:04
2次元にした時の初期化の仕方が分からないんですが・・・
771 :
デフォルトの名無しさん :2006/06/14(水) 23:12:43
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
772 :
デフォルトの名無しさん :2006/06/14(水) 23:16:57
説明不足でした typedef struct a{ int b; char c; }A;
773 :
デフォルトの名無しさん :2006/06/14(水) 23:17:34
途中で書き込んでしまった・・・ それで 宣言時にchar型とint型を2次元で初期化したいんですが・・・
一次元でどう初期化したのか見てみたいぞ
775 :
デフォルトの名無しさん :2006/06/14(水) 23:22:43
A[3]={ {数字,"字"},{数字,"字"},{数字,"字"}, }
776 :
デフォルトの名無しさん :2006/06/14(水) 23:23:37
って感じでやってます これなら上手くいくんですけど・・・
>>776 そのまま二次元に拡張すりゃいいだろ
A[3][3]={
{数字,"字"},{数字,"字"},{数字,"字"},
{数字,"字"},{数字,"字"},{数字,"字"},
{数字,"字"},{数字,"字"},{数字,"字"}
}
memsetを使って0で初期化してみるとか。 ところでアラインメントに気をつけて、パディングを入れましょう。 sizeof(struct a)の結果は5になったり8になったりするから。 (まあ普通は8でしょうが)
バカばっかりだな
780 :
デフォルトの名無しさん :2006/06/14(水) 23:25:22
const int fun(){ return 1; } のconstってどういう効果があるの?
781 :
デフォルトの名無しさん :2006/06/14(水) 23:26:45
>>777 それでやると
初期化子が多すぎる
ってエラーが出るんですよ・・・
もうちょっと見直してみます
>>781 ごめんコピペミスった
A[3][3]={
{ {数字,"字"},{数字,"字"},{数字,"字"} },
{ {数字,"字"},{数字,"字"},{数字,"字"} },
{ {数字,"字"},{数字,"字"},{数字,"字"} }
}
ね
>>772 a A[2][3]={{{'A',1},{'B',2},{'C',3}},{{'X',4},{'Y',5},{'Z',6}}};
784 :
783 :2006/06/14(水) 23:30:50
おっと、intじゃなくてcharが先か。 しかも783だとコンパイル通っちゃうからタチが悪いw
786 :
デフォルトの名無しさん :2006/06/14(水) 23:32:01
>>782 できました!
さっきやったと思ってたけど多分打ち間違えてたんですね・・・
ありがとうございます
>>782 ""で字を囲むと文字じゃなくてポインタが渡されちゃうと思うんだけど…
788 :
780 :2006/06/14(水) 23:38:07
すまないがだれか教えてくれまいか?
左辺値にしたくないとか
もともと左辺値にならない罠
書いたのはもう卒業した先輩だから無理なんだ(´・ω・`)
793 :
780 :2006/06/14(水) 23:58:56
ちょっと確かめてみた。
int a=10;
const int* fun(){
return &a;
}
int main(){
*(fun())=11;
cout<<a<<endl;
}
だとコンパイルできなくて、
int a=10;
int* fun(){
return &a;
}
int main(){
*(fun())=11;
cout<<a<<endl;
}
だとコンパイルできたから、左辺値にならないであってるような気がする。
で、
>>780 の場合はもともと返す値が左辺値にはなり得ないから意味のないconst。
ということで合ってるかな?
組み込み型の引数・返値にconstを書いても、 書かないのと同じように扱われる。 つまり書く意味がない。
日ごろから組み込み型でない戻り値を多用していて、 整合性を取るために、左辺値になって欲しくない戻り値は全てconst指定にしてるのかもしれない。
処で亀レスだが一応指摘しておく。
>>778 その例でsizeof(struct a)が5や8かどうかは環境依存。
もしかしたら3かも4かもしれない。
で、何のためにアライメントに気をつけるのかの説明がないが、判っているのかな?
普通は、意識する必要がないわけだが。
>>796 ああ、そういえばintが2バイトのケースもあるわな。失念していた。
ただsizeof(struct a)が5や8になる、というのは例示にすぎないから、
別に必ずそうなるとか言いたかったわけじゃないよ。
>何のためにアライメントに気をつけるのか
アラインメントの設定が違う環境にも対応できるように、だな。
確かに、環境に変化無ければ、
>普通は、意識する必要がないわけだが
という指摘は正しいな。
>>797 つーか、どの環境だろうと、sizeof(struct a)に依存したコードを書かなきゃ大丈夫だろ。
バイナリイメージのままファイルに書くとか通信するとかは論外だけど。
>>797 いいから初心者スレへ逝け。
>アラインメントの設定が違う環境にも対応できるように、だな。
ワード境界にオブジェクトを配置できない or 効率が落ちる
システムの為だ。だいいち、エンディアンや内部表現が
違うシステム間でどう対応しようってんだ。
>確かに、環境に変化無ければ
普通は処理系が面倒を見るからだ。
そうしない処理系があるというなら例示してくれ。
ちと質問させて下さい。 void test(int *); int main(void) { int a[3][3]; test(a); } void test(int *x) { int i; for (i = 0; i<9; i++) *(x+i) = 1; } 上のコードはmainで宣言した2次元配列を他関数にアドレスを送って代入(?)していますが、 test関数で、 for(i =0;i<3;i++) { for(j=0;j<3;j++) { x[i][j]=1; } } のように、ポインタを使わずに2次元配列に代入するにはどのようにすればいいのでしょうか?
こういうので良いのか? void test(int (x)[3][3]) { int i, j; (略) x[i][j] = 1; } int main(void) { int a[3][3]; test(a); } # 間違いしたくないから struct のメンバに配列置いて、struct の ptr 渡ししちゃうけど…
802 :
800 :2006/06/15(木) 17:20:03
>>801 なるほど、test関数の引数も配列にすれば良かったんですか〜
知りませんでした・・・・ありがとうございますm(_ _)m
自分も扱う変数が多い時は良くサブルーチンへはstructでまとめてアドレスを送ってしまっているのですが、
こういうのって別に問題はないんですか?
あまりやらない方が良いとか、処理が遅くなるとか、メモリ余計に使うとか・・・
>>800-801 例の規則によって、仮引数ではint x[3][3]とint x[][3]と同じ。
int x[][3]はint (*x)[3]と同じ。
typedefを使うとこうなる。
typedef int int_array3[3];
void test(int_array3 *x); /* 或いはvoid test(int_array3 x[]); */
int main(void)
{
int_array3 a[3];
test(a);
}
804 :
800 :2006/06/15(木) 17:27:40
>>803 例の規則分をぶっとばしてた orz
>>802 struct 自体に意味を持たせたい場合なら、2次元配列1つであっても
あえて struct 化することはあるね。
3x3 マトリックス (データ的には [3][3]配列) と その操作関数群 とかさ。
805 :
800 :2006/06/15(木) 19:06:10
>>803-804 なんとなく分かりました。
いろいろ試してみようと思います。
ありがとうございましたm(_ _)m
806 :
デフォルトの名無しさん :2006/06/16(金) 09:20:54
質問です for (ic = 0; ic < 100; ic++) if (ic == b) break; a = ic + 1; これを実行すると、forループがa = ic + 1まで含まれてしまいます。 for文は次の1文しか実行しないと習ったのですが、 if文があるので、a = ic + 1;までが1文として扱われるという解釈でよろしいでしょうか? for (ic = 0; ic < 100; ic++){ if (ic == b) break; } a = ic + 1; ↑ こういう動きを期待してたのですが・・・
>>806 > これを実行すると、forループがa = ic + 1まで含まれてしまいます。
この結論に至った経緯は?
※ b = 100 のとき a が 101 になるから… とか言うなよ?
808 :
デフォルトの名無しさん :2006/06/16(金) 09:32:37
>>806 for文内で評価する式が一つなら
fo(;;) 式
for(;;)
式
となるが二つ以上評価したいなら
for(;;){
式1;
式2;
}
というようにしなきゃなんね
809 :
806 :2006/06/16(金) 09:38:08
すみません このような結論に至ってしまったのは、 VC7.1でデバッグ(ステップ実行)すると、 for文実行中カーソルがa = ic + 1; の行にいっていた為でした・・・ 実際には実行はされていませんでした。 お騒がせいたしました・・・m(_ _
>>809 そんな感じで混乱するのでよっぽど単純な場合以外は括弧つけましょう
scanfで数字のみを入力させたい場合はどのようにしたらいいですか
>>809 そういうこともあるので、括弧をつけないなら1行で書くことお勧め。
for (ic = 0; ic < 100; ++ic) if (ic == b) break; とか。
#逆に言えば、複数行にしたら必ず括弧をつけるってこと。
>>811 やりたいことを詳しく。
>>810 >806 のはよっぽど単純な場合だと思うが
それでも混乱するのは >806 の資質によるものだろう。
> for (ic = 0; ic < 100; ++ic) if (ic == b) break; とか。 ええ? こんなんだめだろ。
815 :
812 :2006/06/16(金) 18:35:00
>>814 >806と同じコードを書いた積もりなんだけど、なんでダメ?
#まさか改行に特殊な意味があるなんて妄想していないよね。
制御の及ぶ範囲を勘違いするから、一行にしてしまいましょうなんて アドバイスはマに受けないように。 ふつーにインデントしてたら大丈夫だから。
>816こういうのや、>814こういうのがいるからカッコつけとくのが無難だな。
あぼーん
あぼーん
#define ABC 1 #define DEF (1) カッコの有る無しで違いってありますか。
821 :
800 :2006/06/17(土) 01:21:02
やれば分かるだろ
違うスレの番号出たし・・
>>820 ない。
式を定義するときには () を付けないと拙い事があるが
#define ABC 1 + 3
#define DEF (1 + 3)
int i = ABC * 2 // 1 + 3 * 2 → 7
int j = DEF * 2 // (1 + 3) * 2 → 8
そうでなければ同じ。
825 :
820 :2006/06/17(土) 01:49:23
なるほどdクス
826 :
デフォルトの名無しさん :2006/06/17(土) 16:07:18
不定引数のしくみがどうなっているのか気になってカーネルを調べたら、以下のようにマクロされていた。 #define _AUPBND (sizeof (acpi_native_uint) - 1) #define _ADNBND (sizeof (acpi_native_uint) - 1) #define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd))) #define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND)))) #define va_end(ap) (void) 0 #define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))
827 :
デフォルトの名無しさん :2006/06/17(土) 16:21:43
CからDOSコマンドを実行するにはどうしたらいいですか?
>>826 >カーネルを調べたら
…ぉぃ。
>>827 system()
註: Windows 以外のシステムでは要エミュレータ。
Windows 系でも一部非互換。
>>826 一応言っておくが、それは数ある実装の1つに過ぎず、
世の中それが全てではないからな。
俺もlinuxの2.6のprintkとかを見てみたら、va_start()のマクロが
>>826 のようになっていた。
カーネル読んでるのか、えらいな。
C言語の中級者以上を対象とした本を探しています。 入門書はたくさんあるのに 。・゚・(ノД`)・゚・。ウエエェェン
あっそ
833 :
デフォルトの名無しさん :2006/06/17(土) 23:44:14
K&RとエキスパートCくらいだろうね。 Cの上級本って少ないよ。
834 :
デフォルトの名無しさん :2006/06/18(日) 00:25:00
rand()関数を使って推移確率行列を作るにはどうしたらいいでしょうか
>>830 > カーネル読んでるのか、えらいな。
どのへんが*えらい*のか教えて?
はいはい、えらくないえらくない、ワロスワロス
va系の動作なんてちょっと考えれば実装は想像つくだろ。 要はスタックのアドレスを取得して操作しているだけだ。
と、カーネルを読む気もないやつがほえています。
Cで、ファイルの基本的な入出力まで学習しました。 そこで質問なのですが、あるtxt形式のファイルから、 「ある行のみを読み込む」、あるいは「ある行から書き込む」ことが 出来なくて困っております。 全て読むには、for文とfscanf関数で回せばいいのは解るのですが・・
つPerl if($.==ある行){ 好きな操作; }
>>839 順番に一行ずつ読んでいくしかないだろ。
一行の長さが全部同じなら、fseek()で移動すればいいけど。
842 :
839 :2006/06/18(日) 01:43:43
>>840 1から勉強しなおすのもきついですorzっていうかスレタイw
>>841 それしかないですか・・・
一度全てオブジェクトに格納してから処理することにします。
>>840-
>>841 さんレスありがとうございました。
>>839 /* ある行のみを読み込む(=ある行まで全部読んである行だけ残す) */
for (行 = 1; 行 <= ある行; ++行) {
/* 同じバッファを使いまわす */
fgets();
}
/* 最後に残ったのはある行の内容 */
/* ある行から書き込む(=ある行の前まで全部コピーする) */
for (行 = 1; 行 < ある行; ++行) {
fgets();
fputs();
}
/* 後はお好きにどうぞ */
長い行が出てきたとき、バッファクラッシュする。 プロはfgetcを使う。
>>844 いや、プロなら長い行が出てきたときは行カウンタを調整すればいいだけだって気づけよ。
少なくとも、fgets()でバッファクラッシュさせるようなコードを書くのは素人以下だって。
プロが糞というのは定説ですよ。
va関係ってカーネルに依存するの? てっきりコンパイラに依存すると思っていたよ。 カーネルか・・・ITRONなら見たことあるけどな。ちょっぴり
>>847 どっちかというと実行環境のアーキテクチャに依存する。
引数がどうやって渡されるかということが、可変個引数の実装に最も直接的な影響を与える。
>>844 fgetc使ったって、状況はかわらんだろ。
プロならfgetcなんか使わない
素人が多いなw
ある行、というのは行番号ではなくて、なんかの文字列ではないのか? たとえば、** hogehoge という文字列を行の先頭に見つけたばあい、 その次の行殻の内容を別ファイルOUTPUTに書き込む。 次に** hogehoge が出てくると書き込み終了みたいな。 Perl使えば20ステップくらいで終わるな。
Rubyなら15ステップくらいだな
awkなら10ステップかな。
以降、-5くらいまで進む予定です。乞うご期待!
sedなら5ステップくらいだよ。
テキスト処理などPerlで十分だよ。 ってかすれ違い
ほっとけば0ステップだよ。
数値計算するときなどは、FortranとかCとか使わざるを得ないときもあるからね。
だけどプログラムを書くのがPGクォリティ
テキスト処理にC使うプロなんていねーぞw
物知らなさ杉
実行環境によるよ ...テキストファイルをデータベースとして使ったりorz
だいたいプログラムの単位でステップなんか使うなよ。
GP-IBの間違いでした
868 :
デフォルトの名無しさん :2006/06/20(火) 00:33:45
久々に覗いたらスレ番号がかなりズレてるんだが、何かあったのか?
869 :
800 :2006/06/20(火) 00:37:12
第2次勃起合戦がありますた
if(条件文) exit(-1); こんな風にexitがあったのですが、どういう意味なのでしょうか?
exit のヘルプを見れば?
man exit
>>864 ステップって使わないの?
何を使うのが標準?
878 :
デフォルトの名無しさん :2006/06/21(水) 00:52:16
質問です。 getc() で既成のファイルから1バイトずつ読み取り、 特定のビットパターンが来た時だけ char型配列に記録するプログラムを作っています。 同じようなファイルを通したとき、きちんと成功する場合もあれば エラーが出る場合もあって困ってたのですが、どうやら if( buff[ current ] == EOF ) { ......(終了処理) } と書いていた所がまずかったようで、ファイル中に 0xFF があったときに -1(EOF) と誤認してプログラムを終了していたのが原因だったようです 処理が中断するまでのバイト数を調べたところ該当番地に 0xFF があったので多分間違いないと思います。 しかしこの 0xFF をどうやって避けたらいいものか判りません。 ファイルサイズは固定ではないので、そのファイルの状態に応じて判別するしかないとは思うのですが・・・
>>878 getchar()、fgetc()の戻り値はintで受け取れ。
GP-IBの間違いでした
>>879 簡潔&的確な回答をありがとうございます。
お陰で2時間くらい悩んでたものがやっと解決しました
>>878 EOFはchar型じゃないってことをまず知ろうな。
>>883 stdio.hを開いて、EOFとgetchar()の定義をよく見てみよう。
#include <stdio.h> long foo(void){return EOF;} int bar(void){return EOF;} char dum(void){return EOF;} int main(void){ long l; int i; char c; l = foo (); i = bar (); c = dum (); return 0; } >883 EOFは何型ですか?(lol
887 :
886 :2006/06/21(水) 18:24:26
ごめんアンカ違った >885
lolって久しぶりに見た気がする
>>886 EOFはたしかint型の定数と定められていたと思う。
ISO/IECではEOFはint型の負の値と決まっている。
>>886 でエラーが出ないのはint→long int→charの暗黙の変換が認められているから。
なんだこの流れは。
>>891 困ったチャンの>886=883が無知を棚に上げて絡んでいるのを
周りが構ってあげてる流れ。
>>893 そんなよその物を使わず自分のコンパイラ付属の物を使え。
>ISO/IECではEOFはint型の負の値と決まっている。 int型のEOFを返す、というのは散見しますが、 EOFはint云々はどこにも書かれてないと思いますが。 もし良かったら書かれている場所を特定してください。
>>895 JIS X3010:2003の7.19.1の中にこんなことが書かれている。
> EOFは,型がintで,負の値を持つ整数定数式に展開する。
JISに書いてあればISO/IECにも書かれていないわけがなかろう。
7.19.1 > EOF > which expands to an integer constant expression, with type int and a negative value,
#define EOF (-1) /* End of file indicator */
>>899 おかしいから出したのではなく、
実際のコンパイラの定義例を出したので、当然。
>>885 で言われたことぐらい調べてから話せよと。
いやなんでそこでそれを出すのか理解できない
>>901 回線クソ重で流れに乗り遅れたんだよ。
仕方ないだろ。許せよ!
許す。
↓次でぼけること
(double) EOF
unsigned char aaa; aaa += 0;
#define PI oppai
908 :
デフォルトの名無しさん :2006/06/23(金) 01:25:11
ファイルから構造体の配列への読込と、書き込みがいまいち 分からないので、教えてください。
910 :
デフォルトの名無しさん :2006/06/23(金) 01:32:54
>>873 いや、ステップでもいいけど、COBOLとかBASICチックだなと思って。
>>873 使わないというか、1ステップを何に換算したらいいんだ?
Cで10行? 20行? 1関数? 10関数?
1ステップ1行だろ? ステップを使ってるところでは.
K&R スタイル, GNUスタイル etc.. で、文法的には同一コードでもステップ数は変わるのか…
>>914 ステップでコードの規模をはかるようなところは、大抵コーディング規約があるので、
そのようなことは問題にならない。
うちはステップ数は大雑把にしか把握しない。 はっきり言って飾りです。 お金は昔からの経験で算出しているらしい。 下っ端なもんだからお金のことはわからないが
>>917 たぶん君の知らないところでステップ数は使われてると思うよ
うちも見積もりは行数単位ではない。 かといってFPとか使ってるわけでもないけど。
うちのところはステップ使ってる。 このアプリは〜Kステップとか。 H製作所やF通はステップ使うんじゃない?
誰もステップでいいとは思ってないけど 他に計る方法がないので仕方なく・・って感じ
行でいいけどね。 先輩方がステップ使うから、なんかそれがうちの標準なんだと納得。
>>919 ん?見積もりは大体において、どこでも人月だろ?それ以外のとこ見たこと無いぞ。
どう言うのが 1 step なの?
>>921 FPとか使ってるところってないのかなぁ。
やっぱ机上の理論なのか。
>>923 昔、COBOLの仕事をやってたときは、ステップ数のようだったけど。
見積の±5%以上の誤差があるとまずいらしくて、ループを展開したりして
調整させられたことがある。
プログラムの規模の話をしてるやつと、見積もりの話をしてるやつと、開発工数の話をしている奴が いりみだれているようだな。 俺は全く関心ないがな。
>>926 その話は上司から聞いたことがある。ステップあたりいくらとかいう時代もあったようだ。
ヂェネレーションギャップという奴じゃ
ジェネレーションギャップという奴じゃ
もともとはアセンブリ言語の名残でそ
俺今アセンブリ勉強してるんだ。
機能から、ステップ数を予測して、プログラマの月にかけるステップ数で割って、 人月を出すって話なんじゃないか?
開発スピードが5K/monのやつもいれば1K/monのやつもいるのだが
>>934 ベテランがどのくらい、新人がどのくらいって適当な基準でやってた。
で、その、ステップやら人月やらというのは ISO/ANSIで標準化された、C言語の仕様なのですか?
んなわけないw
JISです。
「ANSI-C」です。
940 :
デフォルトの名無しさん :2006/06/24(土) 09:45:21
Nクイーンを配置する問題教えて
ぬるぽです。
>>940 N×Nの盤面上にN個のクイーンを配置せよ。
ただしどのクイーンも縦横斜めの線上に他のクイーンが無いように置くこと。
>>943 ねぇねぇ、それってなんでクイーンなの? プリンスじゃいけないの?
>>944 チェスにプリンスの駒はない。
面白いと思って書いてるんだろうが、浅薄。
>>945 チェスの駒と言う前提条件があるなら、>943の2行目は冗長だね。
曰く、「但し互いの利き筋に置かないこと」と。
>>946 >チェスの駒と言う前提条件があるなら
ではない、チェスの駒しかない。
わかりきった事をネタにしたのかと思ったが、「知らなかった」らしいな。
浅薄は取消す、代わりに「無知」を授けるので謹んで拝領したまえ。
Nクィーン問題も知らないのか。まぁ高卒じゃ無理もないかもな。
俺は高専だが知っているぞ。
高専だろうがどこだろうが底辺はこんなもんだろ。 使えないクズだらけだ。
なぜだれも>946の2行目に突っ込まないんだろう……
誰もチェスを知らないから。
>>955 古いスレのリンク張ってるのはわざとか?
レス数が950を超えています。1000を超えると表示できなくなるよ!
遅レスだが、ステップ数には言語や環境、システム形態に合わせた生産性って指標があってそれをかけると人月に変わる 正直な話、C言語のステップ数は金融機関と通信屋以外の仕事はまず無意味
意味不明
スレ違いどころか板違い。 こんな基本的なお約束すら守れないボケどもが コーディング規約とか片腹痛い。
セキュアなプログラムを思いついた int main_s() { return 0; }
ぬるぽ
がっ
ぬるぽ
ぱっ
ぬるぼ
梅
ぬるぽ
int test() { return 10; } int main() { test(); return 0; } 上のように戻り値がある関数を呼び出した時に、戻り値を受け取る変数をセットして無くても コンパイルは通るのですが、これは問題無いのでしょうか?
>>972 戻り値を必要としないのであれば、問題ありません。
例えば、引き数が間違っていない限りエラーを返さないfseek()の戻り値は大抵捨てられます。
974 :
972 :2006/07/02(日) 14:29:59
>>973 即レスありがとうございます。
上の例で言えば、test関数を何度か呼び出すプログラムなんですが、
場合によっては戻り値を受け取りたくなかったんです。
なので、こういう使い方大丈夫なのかと思い質問した次第です。
勉強になりますm(_ _)m
975 :
デフォルトの名無しさん :2006/07/02(日) 17:24:00
K&Rに書いてあります
>>974 scanfとかprintfだって戻り値を返しているんだぞ。
atoi(strncpy(openStr , "15" , 2)); MessageBoxでopenStrを表示したんですが、"15@"と表示されてしまいます。 なぜですか? 教えてチャソ。
>>977 × strncpy(openStr , "15" , 2)
○ strncpy(openStr , "15" , 3)
>>978 ありがとうございます。
すみません。まわりくどい質問だったかもしれません。
もし文字列が"15,15…"というのを格納した変数で後ろの"15"だけ2文字(NULL文字含む)
引っ張り出したいときはどうすればいいでしょうか?
strncpy(openStr, "15,15…", 2); openStr[2] = '\0';
>>980 ああありgふぁとうございます。
おいどんが馬鹿でしたああ。やっぱNULL文字は大事ですね。
sprintf(openStr,"%.*s",2,"15.55");
char s[] = "15,15..."; char openStr[3]; openStr[0] = s[0]; openStr[1] = s[1]; openStr[2] = '\0';
984 :
デフォルトの名無しさん :2006/07/03(月) 19:00:18
進数変換で 2進数0001.1111と0001.0010を8進数にするやり方教えてください。
ビットオーダーとバイトオーダーが云々
0001.1111 00.011.111 0.3.7 037 0001.0010 00.010.010 0.2.2 022
2進小数じゃないのか? つまり、1.74(8)と1.10(8)じゃね?
>>984 8進数は2進数を3桁ごとに区切ればできる。
で、その途中の '.' は何だ?
それがもし小数点なら3桁ごとの区切り目の起点がそこになる。
989 :
デフォルトの名無しさん :2006/07/04(火) 21:44:56
入門書に載ってた問題で 「条件式が常に真になるようなwhile文を記述してください。 また、その繰り返し処理の中で変数iをインクリメントし、 iが100よりも大きくなったら繰り返し処理を抜け出せるようにしてください。」 #include <stdio.h> int main() { int i = 0; while( 1 ){ i++; printf("i:%d\n",i); if( i>100 ){ break; } } } 上記のソースが問題の答え while( 1 ) のカッコの中の数字を100や1000に変えても問題なく処理され なぜ1なのかが解らないのですが これは、どんな理由からなのでしょうか?
990 :
デフォルトの名無しさん :2006/07/04(火) 21:49:06
whileが判定しているのは「0以外であること」だから。 別に1でなくても100でも1000でもいい。
991 :
デフォルトの名無しさん :2006/07/04(火) 21:49:51
バカですか? 偽は0 真は0以外 と知らないんですか?人間性を疑います。 貴方みたいな人はプログラムを止めてください。
>>991 人間性まで疑う必要は無いと思うが……。
993 :
989 :
2006/07/04(火) 22:05:06