C言語なら俺に聞け! Part 〈55〉

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限Googleで検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo!
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

コンパイラを探しているなら >>2-13 を。

上記を逸した場合の結果は激しく未定義だゴルァ!!

C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
---------------------------------------------------------------------------
}
return EXIT_SUCCESS;
}
なお、このスレはぬるぽ進行です。
メール欄に「ぬるぽ」と入れてください。
5デフォルトの名無しさん:03/04/28 20:36
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
6ぬるぽ:03/04/28 22:11
了解しました。
8過去ログ続き:03/04/28 22:49
10過去ログ:03/04/28 22:51
>>1 乙。ちょっとだけ訂正。

>>7
×【前スレ】C言語なら俺に聞け! Part 〈55〉
○【前スレ】C言語なら俺に聞け! Part 〈54〉
http://pc2.2ch.net/test/read.cgi/tech/1049968153/
127 (>>1ではないっす。):03/04/28 23:06
>>11
訂正サンクスです。

このスレのリンク貼ってどうする>>俺
しかも2重カキコになってるし。

すまそ。吊ってきます。>>all
C のインタープリタってどうですか? Ch ってのが至る所で宣伝してるけど、
これで C の勉強始めて良い物なのか・・・。

Ch -- an enbeddable C/C++ interpreter for script computing
  http://www.softintegration.com/
CINT
  http://root.cern.ch/root/Cint.html
EiC -- The enbeddable/extensible interactive, pointer-safe, bytecode
      C interpreter/compiler
  http://eic.sourceforge.net/
The ups debugger for C, C++ & Fortran ;; C interpreter included.
  http://ups.sourceforge.net/
Al Steven's Quincy C Interpreter
  http://www.ddj.com/ftp/packages/quincy/
>>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];
>>16
ありがとうございました
なんでこのスレッドには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
>>27
C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
スレ立てた時に言われてますよ〜
多分、読めって事ですよ〜
>>27
読み出し専用だけどね。
>>29
どちらも読みましたけど・・・
C99は別として、配列の要素数指定は定数式でなければならないのは知っています。

ただ、constつけたものを定数として扱えるかどうかということです。
定数と呼ぶことはできても、扱うことはできないんですね。
constつけたものを変数と呼んだら叩かれたけど。
>>31
規格の問題。
定数なら、配列の添え字に出切るよ。
しかし、const付けたって定数とは限らない。
だからconstつけたら配列の添え字にする事が許されないだけ。
いちいちコンパイラが判別してくれる分けがない。
100%定数とは為らないなら、許さないって事だ。
>>33
> 100%定数とは為らないなら、許さないって事だ。

やっぱりそうなんですね。
その例として>>25を出したんですけど、もっと一般的な例がありますね。
constつけた引数が・・・

とにかくありがとうございました。
3534:03/04/30 03:12
>>25は値が分からないだけで定まっていないわけじゃないか・・・
>>35
全然分ってなさげ。
値が分っていて、定まっていても出来ないの。
const int num = 10;
int arg[num];
これは不可。
つまり、値が分っていてもconst付けたら配列の添え字にはならないの。
規格の問題って書いてあるだろ。
>>36
定まっているとは限らないから規格でNGにしたんでしょ?

定まっているとは限らない = 定まっていることもある じゃないの?
>>37
> 定まっているとは限らない = 定まっていることもある じゃないの?
そうだが、だからどうした?
規格でNGにするにはそれなりの理由があるはずで、それが「定まっているとは限らない」ってことでしょ?
なんで「定まっていても・・・」なんて話をするわけ?
4039:03/04/30 04:48
言いたいことが伝わっていなかったのかも・・・まあいいか。
const は定数というよりリードオンリーの意味
たとえばプログラム実行時にその変数は
ROM 上にマップされてるとか
C++なら定数として添え字に使えるけどね
>>42
どうして他の言語の話が出るんだ
int const volatile port;
>>44
最適化禁止・・・組み込み系でつか?
定数じゃない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
1を1ULにしてみぃ。
>>56
ありがとうございます
5856:03/04/30 16:07
いやなんでもない。
>>55
そのまま試してみたらそうはならなかった
他に間違いがあるのでは?
結局>>56の方法で解決したの?
61デフォルトの名無しさん:03/04/30 16:41
>>59
55はintが16ビットの環境じゃないの?
62デフォルトの名無しさん:03/04/30 16:49
CでのAPIの使用ってどうやんの?
use_api( API_NAME );
>>62
関数名に()をつける。
>>62
WinのAPIならこうだ。

#include <windows.h>
int main() { MessageBox(NULL, "へろー。", "へろー。", MB_OK); }
#include <windows.h>
int main() { MessageBox("全てのファイルを削除していいですか?","確認",MB_OK); }
面白いッスね
>>66
(・∀・)エキサイティング!
どこがだよ・・・しょうもない
空ループは最適化によって削除されるべきですよね?
たとえそれが初心者の使うウェイトだとしても。
do{}while(0);
これならな
しなくていいと思うけど
削除されるべきは一度も実行されないループ
コンパイラに初心者かどうかは判断できないしねぇ。
Linuxではスライスの事をパーティションというのですか?
Linuxではスライスの事をパーティションというのですか?
だったら、パーティションの事はなんといったらいいのですか?
77デフォルトの名無しさん:03/04/30 19:03
#include <windows.h>このヘッダーファイルはVC++についてるの?
>>77
ついてるよ。
>>78
なんかエロいな
>>79
やっぱそう思う?エロいよな
>>75
BSDではパーティションのことをスライスといいます。
>>66
OK ボタンだけかよ !!
rand()%10ってやったら0から10の乱数がでるけど
10から20とかの乱数ってどうやって書いたらよいですか?
>>83
まず、自分が何を書いたのか見直せ。
話はそれからだ。
85デフォルトの名無しさん:03/04/30 23:31
なんでウィンドウ出すだけであんなに書かないといけないんだ!
window()こんなんでウィンドウ出すような関数ないんか!
rand()%11 で得られた結果に10を加える
>>85
今時そんなの書いてる奴いないって。
>>85
他の言語をお勧めします。
>>85
雛形作っとけ。
この前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
エラーと違うじゃん
あーごめん警告ね
で、なんで?
98C初心者:03/05/01 06:36
連休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 >無償のコンパイラの使い方だけで時間を・・・
僕もプログラムの勉強<プログラムまでの勉強でした。パソコン購入==プログラムの
勉強だったので、ファイル、フォルダもわからず。そこまでではないと思いますが。
がんばってください。
10199:03/05/01 07:47
・・・と知ったかぶって見たけど、間違っているかも。
>>101
正しい
>>98
それでいいよ。
10497:03/05/01 08:18
>>99
わかったような気がする。C Reference見ながら例題を試しにコンパイルしてみたら
警告がでたからなんでだろと思ってたけど、例題が間違ってたってことね。
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.13.html#qsort
警告を無視するのは確かにお勧めできないが、「間違ってた」とは言い切れない。
castすりゃいいじゃん
見苦しい
警告残す方が見苦しい・・
109デフォルトの名無しさん:03/05/01 17:43
おい。お前等。

Hello World表示させてるくらいでプログラミングは面白くてしかたなかった?
ここで面白さを感じられないやつは素質無し?

それともある程度山を越えてから病み付きになった?

教えてくれないの豚。
>>109
画面に文字表示させたところで一体何がおもしろいんだと。
・・・あ、楽しかったかも。

まぁ、ここはぐっと我慢してifとかwhileとかまで進んでみ?
111109:03/05/01 17:51
>110
いやさ。Hello Worldレベルは比喩なわけで。
一応入門書で関数のところまでいったんだけどおもしろみを感じない。
映画みたりネトゲしたほうがおもしろいとおもってさ・・・
>>111
ならやめればいいじゃないか
>>111
そりゃダメだわ。
>>111
Delphiならおもしろいよ。
>>109
エクセルのマクロでもエディタのマクロでも、
繰り返しや条件分岐を書き始めるとそこはもう、
プログラミングの世界だよ。
何もHelloWorldだけが入り口じゃない。

だから、スレ違いだしとっとと帰れ。
#error Hello world
117109:03/05/01 18:10
そういえば、経験上すげー楽しいことってある程度
山を越えてから楽しくなるや。俺の場合。がんばって続けてみまるくす。
>>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を配列に宣言してるので配列の先頭ポインタを渡している事になる。
128C初心者:03/05/01 21:55
まだコンソールプログラムしか作ってないけど楽しい。
参考本の1/3程度進んだとこで復習してみると
そのとおり書きたくない。これでいいじゃんって。
少しでも進歩したな・・と思うと楽しい。
やっぱデバッグだな。
130 :03/05/01 22:05
いちばん嫌な時だ
reset all
ここらでひとつ、プログラム(&デバッグ)ネタでHellsingコピペきぼん。
プログラム関数にデバッグのアドレスを・・・
134122:03/05/01 22:26
>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
平気
>>135
> VC使って簡単にウインドウ作っちゃってもいいのかな?

 → YES.

> それとも全部コード覚えたほうがいいのかな?

 → 意味不明。何のコードだ ?

> VCで作ってもwindowsアプリ作れるっていっても平気ですか?

 → 一般的には YES。
   暗黙に「私が」と言うのであれば、自分の腕と相談しろ。
140122:03/05/01 22:33
>136
そ、そうですね
>>136
別に変じゃないだろ。
なんか間違ってるか ?
間違っていなくても変なものは変。
char str[]={'a','b','c','\0'}と書いても間違いではないが、変だ。
> → 意味不明。何のコードだ ?

ってことは、WindowsSDKは全く知らんってことか?
>>143
ハァ ?
>>144
悪い。スレ違いだったな。
>>145
そういう問題ですらない。>>143が日本語が不自由なんじゃないかということだ。
>>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
当たり前ですな。
>>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は普通使わない。
170168:03/05/02 18:27
あとねぇ、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ろよ
177175:03/05/02 22:03
このプログラムが上手く動きません
何故動かないかも分かりません
どこに問題があるのか教えて下さい

表示結果はこうなりました
27 14 n=3 i=0 14 n=2 i=0 14 n=1 15 21 i=1 14 n=1 15 21 21 
178175:03/05/02 22:03
age
>>177
まてぃ!
どう動いてほしいのかも書かないでそれはないでしょ。
180175:03/05/02 22:09
>179
行列aの行列式を求めたいのです
3*3行列aを
a[9]={1,0,0,0,2,0,0,0,3};
と定義しました
行列かぁ。
高校三年の時は数学を取らなかったから全然わからん。
182175:03/05/02 22:17
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
自分で書いたソースがあるならうぷキボンヌ
184175:03/05/02 22:40
>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
190284:03/05/02 23:18
>>175
それから co 内のループだが、
a には 0 から n-1 までの二次元配列の中に値が入っていたわけだから、
b には 0 から n-2 までの中に代入しなければならないはずだよな。
191190:03/05/02 23:21
>284って誰だよ?? スマソ。
あと、ちょっと日本語が変だよなぁ俺……
>>189
m=det(&b,n-1); -> m=det(&b,n-1);
じゃなくて
m=det(&b,n-1); -> m=det(b,n-1);

>>190
coまでは見てないが何か勘違いしてない?
193175:03/05/02 23:36
>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なら消えなかったが。
195186:03/05/03 00:02
>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;}}
200190:03/05/03 02:21
>>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とバッファをラップするインタフェース作ってお茶濁すことにします。
ありがとうございました。
209206:03/05/03 05:06
最終手段として、文字列を実体とするデバイスドライバを書くって
方法も有るんだけどね。

そこまですんなら、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バイト書き込むとか。
213212:03/05/03 09:01
リターンしちゃまずいのなら、「rewindしてからバッファにfreadしfclose。」の部分をバッファに書き込む時だけ行うようにする。return以外の方法でね。
>>202

FUNOPEN(3)

BUGS
The funopen() function may not be portable to systems other than BSD.
C言語で正規表現を使うにはどうすればいいんでしょうか
・ライブラリを使う。
・(検索なら)grep、(置換なら)awkなどを呼んでしまう。
・諦める。
>>215
Windowsなら秀丸エディタのパッケージなどに含まれるJRE32.DLLがそれにあたるかな。
http://www.yamada-labs.com/software/spec/jre/
>>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が無限ループしてしまいます。
文字を入力してもちゃんと動作するにはどうしたらよいでしょうか?
220175:03/05/03 14:57
>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
ご冗談を
228227:03/05/03 17:57
無視ですか?
ファインマンさん?
新刊、「無視ですか?ファインマンさん」が誕生したわけだが。
>>219
scanf()の%d指定は、数字文字を変換する指定でしかない。
なので、数字以外の文字を入力しても変換すべき文字がないので
入力を処理することなく終了してしまう。
解決方法としては、
・%s指定にして数値への変換は自前で行う
・scanf()の戻り値をチェックする
・fgets()に読み込んでから上記に注意しつつsscanf()で変換する
などの方法がある。
まぁ、一番最後の方法が一番確実だね。
一番上が一番楽じゃない?
%sで読み込んでatoiで数字変換
>>219
1を入力してください。
じゃなくて
0を入力してください。
だろ?
1だと、終了しねぇ〜よ!
234219:03/05/03 18:54
できました。
1番上のでやりました。
ありがとうございます。
>>233
打ち間違いです
文字ってatoiで変換したら0になるんだな
それがなにか。
237デフォルトの名無しさん:03/05/03 19:46
bsearchはいいぞbsearchは。
>>219
書式指定に空白を入れときなさい。
scanf(" %d", &a)

書式指定子の空白は空白文字(スペース、タブ、改行コード)を読み飛ばす。
入門本よりマニュアルをよく読むべきだよ。

じゃないと>>231 >>232みたいに頓珍漢なこと言い出すやつが出てくるからね。
頓 珍 漢
平 子 太
どちらが頓珍漢なんだ(^_^;)
長生きするもんだな、頓珍漢に「頓珍漢なこと」といわれるとは思わなかった。
>>239
よしこちゃんの下の兄弟だっけか?
>>238
> 入門本よりマニュアルをよく読むべきだよ。

219をよく読むべきだよ。
X = X ^ c->P[i];
この「->」の意味を教えていただきたい。
>>244
構造体のポインタのメンバを参照するときのお約束。
>>245
thx!分からないんで調べてみます。
247デフォルトの名無しさん:03/05/03 22:04
データベースの使い方を教えてください
>>247
データベースのスレ逝け
249デフォルトの名無しさん:03/05/03 22:13
>>248
そうします。
250デフォルトの名無しさん:03/05/03 22:36
C言語って何?
G(o^-^o)gle < 検索しようね
252デフォルトの名無しさん:03/05/03 22:54
>>251
いやじゃ教えろ
253デフォルトの名無しさん:03/05/03 22:54
嘘ごめん
マウスが壊れるほどにサイト駆け巡ってきます
”C言語ってなに厨”
Microsoft社が開発した言語。
名称からも分かるようにBasicを元にしたようだが、大きく異なる。
C言語って抽象化しすぎ
>>256
どこがや・・・
2581:03/05/03 23:10
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をインクルードしていないから。
261259:03/05/04 00:19
>>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()にしろとあれほど・・・
268あふぉ:03/05/04 11:12
解の公式のプログラムで
 x^2+100.1x+1.234=0
のような場合でも出来るだけ桁落ちがなく正確に計算できるようにするには
どうしたらいいんですか?
269bloom:03/05/04 11:13
270262:03/05/04 12:59
いや、そのようなことはありません。
ソース

#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;だけです。
273262:03/05/04 13:10
exit関数を使おうかと思いましたがreturn 0;でも大丈夫かなと思ってそうしました。
else
275262:03/05/04 13:16
どこが間違ってるのか教えてくれませんか?
なんで二番目のifはelse ifじゃないんだろう。
>>270
その関数だけ出してそのようなことはありませんなんて言われても信用できないんだけど。
>>262
>どこが間違ってるのか教えてくれませんか?
あんたの態度。
短いなら(省略)の部分も書いてみれば見れば?
>>268
多倍長演算と浮動小数点演算
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は釣り師に5000織田信長
>>281
…よく分らないんだけど、普通さcoice関数を宣言してmainで呼ぶんじゃないの?
coice関数の戻り値は何に使うの?まさか、mainの戻り値と同じ扱いじゃないよね?
288鈴木健一郎 (NT4.0/2000/XP):03/05/04 14:09
printf みたいな可変長の引数を持つ関数を作っているんですが、
「引数の数がいくつ渡されたか」っていう情報は明示的に
教えてあげなくちゃいけないんでしょうか?

argc みたいな感じで va_list がどこかの構造体に格納されていないんですか?
>>288
そのために最低でもひとつは固定の引数が必要となる。
その固定引数が与えた引数の数を知るヒントになる。
290281:03/05/04 14:36
全体の動きを話すと、

ある任意の数をいれ、その階乗計算し、
その後もう一度計算するか選択してするならまた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
神!
299295:03/05/04 15:14
>>297
まったくで m(_ _)m
>>135
ゲーム脳
301293:03/05/04 15:23
>>297
ところが既存のソースなんだよね・・・
書き直すのかったるい

ってか>>295の方法できなかったぞーい

仕方ないから書き直します
>301
まともなコードなら書きなおす必要はないとおもうが・・・
・・・そうか、ベタ書きか・・・
>>281
それなら main() じゃなく exec(argv[0]) にしたら?
どうして初心者ってやたらと高次元な配列を作りたがるのですか?
しかも動的に。
305ヽ(´ー`)ノ:03/05/04 15:46
>>304
ロジックの整理ができんから、妙ちくりんなデータ構造になるんでない?
>>305
普通データ構造から作るだろ。ってのはオブジェクト指向に慣れすぎた者の発想なのだろうか。
>>306
構造化プログラミングでもデータ構造は重要。
308ヽ(´ー`)ノ:03/05/04 16:18
>>306
それができたら初心者じゃない…w
ヽ(´ー`)ノ <- この顔文字むかつく
何行くらいのソースが書けたら初心者じゃないと言えますか?
何行じゃなくて何ステップ、ですか?
行とステップはどう違いますか?
>>310
行数気にしてちゃだめでしょ
複雑な処理をいかに簡潔で高速に書けるかの方が重要な気がする
知ったかぶることができるようになったら中級者だよヽ(´ー`)ノ
313293:03/05/04 17:17
再び質問です
文字の移動、画面の消去は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];
>>322
intは何バイト?
・・・

char mojiretsu[] = "test";
int suuji;

suuji = *(int *)mojiretsu;
>>318
> 文字列が入った変数から、?byteだけ数値として取り出す方法とかmemcpy
> でできると思ってるんですがどうでしょう?

おお、そんなんできるんだ。
やり方の詳細キボン。

>>320
> 本職ではなくとも...仕事なわけですが・・、
プログラマーじゃないけど、仕事のためにプログラミングするってこと ?
(なんかの研究者で、数値解析とかが必要とかなのかなぁ...。)

> CマスターしたらC++習得は早いってわけでも無いのですか?
だいぶ、新しい概念が入ってるからね。
でも、ベースは C だから、C を覚えておくに越したことない。
>構造体使う奴は初心者。
>gotoの使い方に慣れたら中級者。
>列挙型とintとint*しか使わなくなったら上級者。
>charとchar*も使い分ければ達人。
誰も読めないソースを書けるようになったら、神と阿呆の紙一重(笑
どうせマシンパワーが余ってるんだから、最適化の必要の無い部分は徹底的に
可読性重視でいいと思うがし。
ただ、シミュレーションとかで最適化するべき部分に対しては、
自分以外読めないくらいでもかまわない。ただ、変数名のスコープだけは気をつけて。
>>326
ネタにマジレ...。
charとchar*も使い分ければ達人。
>>319
激しく同意
わかります。わかります。
>>326
手作業で最適化しないといけないコンパイラですか。
332317:03/05/04 19:19
>>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
無理です。
>>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
いや、わからん
こっちの方が一般的かなと
>>345
他にはないでしょ?
>>341
>>344
ありがとうございました!!!
できました!!
これからも精進します。
>>346
ものによるかなと
グローバル変数を使うとかさ
>>348
え、グローバル変数使ってどうやるの?
文字列からintにするにはatoiでいいけど
反対のintから文字列はどうすればいいですか?
int i=5671;
char buf[1024];
sprintf(buf,"%d",i);
>>350
itoa
353デフォルトの名無しさん:03/05/04 21:05
ウィザードリーオンライン2chで開発始まる(有能な人材求む
http://219.96.231.242/wizonline/player/world.html
>>349
恐らくこう言う意味。
int global_len = 10;
extern int global_len;

int main(void)
{
int arg[global_len];

return 0;
}
>>354
昔のCだと動かない罠。
356340:03/05/04 21:09
>>345
お前は誰だ
357デフォルトの名無しさん:03/05/04 21:09
>>355
規格としては昔でも、現役な気がする。
358320:03/05/04 21:09
>>325
遅レス
 研究者ではないが製品開発には関わることあります。
基本的には生産技術要員。
僕はどちらかというと大規模な設備なんかを買う方なんだけど
いまいちその、、プログラマーとの打ち合わせがウマク
いかないし理解できないんだな。それは漏れがアフォだから。
「いやぁ、ソレハ難しいですよ、予算がかかります」
といわれてもよくワカランし。。
「ソースコードは要りますか」と聞かれても貰ってもわからないし。
趣味も兼ねて勉強したいと思いました。
ちなみに今まで会社ではHP-BASICしか使ったこと無いです。
359340:03/05/04 21:10
>>354
ナニソレ?
つーか後は任せた
>>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
>>362
なんなんだ?
これって駄目なの??
default自体書きませぬ
今日は賑やかだな
367デフォルトの名無しさん:03/05/04 21:17
>>363
つける
ってかdefaultも意味が無くても必ずつける
sageろアホ
ごめんさない。
370デフォルトの名無しさん:03/05/04 21:21
>>367
>ってかdefaultも意味が無くても必ずつける

ifにもかならずelseを付けると言うことですね?
ドモ
>>371
当然です
>>371
当然だろ?
if(あれこれ) ;
else if(0) ;
else ;
ifだけの場合は、whenというマクロを使います
when(あれこれ) {
}
ifしか書かない人には注意力が欠けている人が多い。
>>363
一応つけてる
>>371
いやいや

default:
 値が変ですよ

みたいな感じで書くってこと
380358:03/05/04 21:25
>>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 に引っかからなかったら異常終了するようなコンパイルオプションが欲しい。
俺はコンパイラの最適化のジャマを、わざわざするようなことはしない
数々の嫌がらせを切り抜けて最適化するのがコンパイラの使命
コンパイラという仕事も大変ですね。
391318:03/05/04 21:49
>>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など
>>394
strncmp??
>>395
アホがいます。
>>396
strncmpでどうやって切り出すの?
strchrやstrstrもよくわからない・・・・
まったくだ
399392:03/05/04 22:07
文字列の先頭の数文字を切り落としたかったんですが
そういう便利関数は自分で用意するしか無いようですね。
ありがとうございました。
>>399
ポインタを動かすとかができないのなら、memmove
401394:03/05/04 22:08
>>397
直接は切り出せないけど比較して切り出すのに使えるかなと
ってかsubstrが何をやるものかよくわかってない俺
>>399
\0を挿入
>>402
後ろが切れるぞ。
切れ痔
>>400
おまえ何言ってんだ?
>>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を呼び出すのよ。
409407:03/05/04 22:38
>>408
あ、そうです。警告です。
そのmain関数を呼び出したい関数を書いてあるCソースファイルにmain関数の宣言を行えばいいのですね。

実はまだ初心者で、関数の使い方を勉強してるのです。
なので簡単なプログラムを関数で色々やってみたりしてるんです。
>>406
Cっぽくて素敵。
char bur[256];
の中身"inside"を
char *test;
に代入することはできますか?
頭イタイ
413デフォルトの名無しさん:03/05/04 23:10
>>411
test = bur;
test = &bur[0]
exit関数についてですが、これをmain関数以外の関数で使いたいのです。
その場合は、stdlib.hをインクルードするだけで使えるのでしょうか?

できたら、exit関数の使い方を教えて欲しいのですが・・・
どうかよろしくお願いします。
>>414
すばやいお答えありがとうございます。
>>415 man 3 exit
>>416
当たり前だが、そのままだとburの値が変わるとtestの値まで一緒に変わる
別にその後burを使わないなら問題ないけど。

>>415
exit(0);
419415:03/05/04 23:28
>>417
え・・・?どういうことでしょうか?
本当にすいません。
420415:03/05/04 23:30
>>418
それのコピペでできました。
本当にありがとうございました。
>>419
とりあえず、ググれ。
>>416
中身を代入なら、strcpyの方がいいんで内科医?
>>922お前はあふぉ、>>411もあふぉ
>>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となって世界へ羽ばたいていたりするんだな
>>432
UNIX系のフリーウエアは普通Cでしょ
ましてテトリスなら、いくらでも見つかると思うが・・

http://www.ibiblio.org/pub/Linux/games/arcade/tetris/!INDEX.html
とか
>>433
とりあえす入門書の一冊でも読んでから質問すれや。
初心者の素朴な疑問です。
C言語でベキ乗演算子が使えないのはどうしてですかね・・?
自分で作るとかは別として。根本の理由はなんなんでしょう。
ベキ乗をサポートするプロセッサが少ないからだとか。
powがあるし、自分で書いても難しくないからいいんじゃないの。
>>439
なるほど・・
3乗根やn乗根となると、目的の割りに”少しだけ”めんどうですね。
有難うございました。
complex.h tgmath.h を使える環境って
フリーでありますか?とりあえず cygwin/gcc-3.2 は
対応してないようですが。。
>>439-441
ていうか、ほとんど使わないからだろ。
>>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'は文字そのもの
452445:03/05/05 13:42
>>446-450
みなさんありがとうございます。"a"はaと\0の文字列で
449さんの場合はそのうちの先頭1文字を比較している
というわけですね。よくわかりました。ありがとうございます。
sageて質問・・・ネタ決定
454デフォルトの名無しさん:03/05/05 14:00
ageようがsageようが勝手でしょ
>>453がネタだろ。
>>453=sage覚えたて小心者
447 名前:デフォルトの名無しさん 投稿日:2003/05/05(月) 13:16
>>445
最初のうちは、文字列の比較はstrcmpを使うものだ、そういうものだ、
と納得しておこう。
後々理屈が自然にわかるから。
457 名前:デフォルトの名無しさん :03/05/05 15:00
447 名前:デフォルトの名無しさん 投稿日:2003/05/05(月) 13:16
>>445
最初のうちは、文字列の比較はstrcmpを使うものだ、そういうものだ、
と納得しておこう。
後々理屈が自然にわかるから。
吐き出したexeファイルにデータをドラッグ&ドロップして
そのデータのポインタやファイル場所を受け取りたいのですが
どのような関数が必要なのかわかりません。

どなたか、ご教授お願いします。
>>459
fsetpos
>>460
あの説明でよくわかったな。
462460:03/05/05 15:36
>>461
わかるわけない。
特にデータのポインタってところが。
463461:03/05/05 15:40
>>462
俺は最初の一行でお手上げだ。
464459:03/05/05 15:42
初心者でごめんなさい_| ̄|○
例で表すと・・・

解凍ツールで解凍するファイルの名前を
ドラッグ&ドロップで知りたかったのです。
465459:03/05/05 15:44
なんだか、自分で見てても混乱する文章だと理解してきました
深呼吸してから出直してきます。

>>460
苦しいところでのお答えありがとうございました。
466462:03/05/05 15:44
もしかして〜と思ってちょっとやってみた。
実行ファイルにドラッグ&ドロップしたファイルの名前はargv[1]に格納されるんだな。

>>464
mainをint main(int argc,char *argv[])として、argv[1]からファイル名を得る。
467462:03/05/05 15:45
>>465
>>460はネタ(にもならんが)
468459:03/05/05 15:49
>>462
わざわざ二度手間みたいですいません・・・早速やってみたいと思います。
ありがとうございます。
コンソールアプリなら466のやり方で大丈夫だな。
ちょっと補足すると、複数ファイルの場合はargv[1〜argc]に入ってるからargc-1回ループさせると。
既に起動してるWindowsアプリのウインドウに、、とかいうんだったらまた別だが
470462:03/05/05 15:51
正しくいえば、argv[1]からargv[argc-1]だね。
471459:03/05/05 16:10
>>469
今回はお察しのとおり(?)コンソールアプリケーションです。
複数ファイルの場合の時を考えてなかったので、助かります。
覚えておきたいと思います。

>>470
見事、成功しました〜。
長々とのおつきあい感謝です。

ト ン ベ ス ト ー ン
      〜宇宙からのメッセージ〜
atexit()って何に使うの?
C言語で、Concurrent Programmingはできますか?
>>473
正直使わない。
大体をしてグローバル変数かファイルスコープ変数しか
アクセスできないしな。
一回使ったことある。
>>473
OSによっては資源の解放に便利に使える。
但し、ここではスレ違いなので詳細は省略。
>>474
できる。
C言語で、Terrariumはできますか?
C言語で、Object Pascalはできますか?

すれ違いだったため、ここで質問します。
http://pc.2ch.net/test/read.cgi/unix/1052041659/l50


行列の演算をCで作っていていつも考える疑問です。

行列の表現は、どんなのが一番汎用な表現ですか?

ただし、
行列の成分は実数とします。

私はa[ROW][COL]みたいな2次元配列です。
分かりやすいけど、融通がきかないです。
引数渡しでa[][COL]とするので、大きさが変更できなくて
不便です。
>>481
引き数はdouble *pMatrixでいいと思うのだけど。
で、参照はpMatrix[i * col + j]って感じで。
それがいやなら i * col + j をマクロにしておくとか。
でも私ならC++でクラスにしちゃうけどね。
>>481
Cを使わない
c言語を始めようというソフトに対応しているコンパイラでゲームをつくれますか?
>484
マジレスだけど、そんなのよりC Machineというのを使った方がいいよ。
コンパイラさえあれば何でも出来る!
元気ですかー!!
>>484
ちょっと待て、対応しているのはコンパイラの側ではないぞ。
488481:03/05/05 21:58
>>482,483(?)ありがとう。

1次元ですね。なるほど。
私の手元の本は2次元なんですよ。
だからそうしたのです。
でも、かならずしも一般的ではないですよね。

482さん、
参考のためc++の方法を教えて下さい。
>>485
施寝よ。
作者も放置しているようなコンパイラなんか使えるわけねぇだろ。
>>488
C++のスレで聞け
>>488
行列 クラス でググってみれ
492481:03/05/05 22:33
>>491
thanx!

Cの行列計算方法
ttp://www5.airnet.ne.jp/tomy/cpro/sslib7.htm
では1次元配列を利用していました。

c++の〜
ttp://www.eng.kshosen.ac.jp/~i_asano/misc/matrix/matrix.html

がありました。
C++は全然知らないのですが、matlabみたいに
C = A *B 
という表記が可能になるんですね。

すれ違いなので、ここで終わります。
こういうことができないのは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
実装によるけど、変数の領域がブロック単位で確保されたり開放されたりって
ことは無い。
どこで宣言してもパフォーマンスは変わらないと思う。
(もしかすると変数のスコープを細かくしたほうが最適化で
レジスタの割り当てがうまくいって速くなるってことがあるかも
しれない)
ちゅーか、スタック
516512:03/05/06 10:37
>>513
見てみましたが、分かりませんでつ。

>>514
>515氏が書かれているように、私が勉強した時、確か自動変数はスタックを
利用して記録されると読んだ記憶があります。
そのまま解釈すれば、ループ毎にPUSH,POPしているのかなぁと思ってしまう
のでつ。
(さっきデバッガでアセンブルコードを見て追っかけて見ましたが、よく
分かりませんでつ・・・)

しかし>514氏の言う通り、うまく最適化されているような気もします。

もう一度、皆様のご意見を聞かせて下さいまし。
> 見てみましたが、分かりませんでつ。
それくらいの差だってこった。
>>516
int変数程度ならスタックフレームに変数領域を確保するだけだから
コンパイラがアドレスを決めて直接書き込めばPUSH/POP不要。
ループ抜けるまではPOPせんでいいだろー
ブロック単位で宣言すれば、むしろ局所性が高まり、
関数呼び出し時に確保されるローカル変数用スタックの
消費サイズも最小限になる可能性が高い。
>>520
スピードはどうなんですか?
スタックをpush、popすることで下がりますか?
実装によるんじゃねぇのか、SPいじるだけなら気にならんレベルだろー
523520:03/05/06 11:45
>>521
subとかaddみたいな加減算で直接spの値を操作するから、
ローカル変数側についてはpush/popが呼ばれることは無いよ。
結果的にメモリの局所化に繋がるから、
再帰関数とかのパフォーマンスは良くなる。
つーかアセンブラ出力読んだ方が早い。
524デフォルトの名無しさん:03/05/06 12:41
>>520
そんな賢いコンパイラはあんまり見かけないな
ブロック単位で宣言しておけば、コピペには便利だけど、
変数宣言するくらいの単位なら構造化して関数に昇格した方がいいと思うけどな
関数呼び出しまでするとコストがウヘ
そんな所のコストが心配ならアルゴリズムを検討した方がいい
一度や二度呼び出す場合ではなく、ループの中の話だろ?
inline展開されるんですか?
>>528 C++ ならね
>>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文の中でしか使えないのですか?
お願いします。
>>542
1を読め
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変数は変更したくないのですが。
>>547
無い
入力・・?文字列として?
ならその文字列を保存しておけば。数値に変換しないで。
#include <stdio.h>
int main(void){
float a = 45.1;
printf("%.1f\n", a);
return 0;
}
実数使う以上誤差がでるのは仕方ないだろう。
それを踏まえた上でfloatを使うべきではないのかい?
>>547
具体的にどういう処理をしたいの?
>>549 >>550
ありがとうございます。
参考にさせていただきます
>544
1万倍しておけばいいじゃない
C++とかDelphiに金銭型とかあるでしょ? あれも中身は浮動小数点を10のベキ乗倍してるだけの筈だよ。

例えば100倍にしておけば、1/100まで誤差が出ないからね。
556デフォルトの名無しさん:03/05/06 21:36
4*4/4
>>555
パピプッ
どうしてもわからないので聞いていい?
Linux 上でネットワーク通信するときに、C 言語からパケットロス率を取得するには
どのようにするのが常套手段なんでしょう。
ひょっとして、/proc の下を見るとかするとわかるんでしょうか。

わかる方、お願いします。

>>558
このスレで聞くのは間違ってる。
ここのスレ的な答えだと、「標準Cではできない」となる。
>>555
誤差無しで小数計算するときは
普通整数で固定小数点計算するだろー。
>>560
 整数で計算したら、こんどは少数点が出たら大きな誤差になってしまう
 誤差は出るものだけど、誤差が出るのを遅延させるのが金銭型方式だよ
128bitだか256bitだかの固定少数で計算するのが
C#のDe??????とか言う型じゃなかったっけ?  うろ覚えですけど
文字列のまま計算すりゃぁ
上下何桁でも誤差はでないよ
遅いかもしれんがね
564デフォルトの名無しさん:03/05/07 15:11
処理系依存が多すぎますよね!!
565bloom: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 *);
の使い方を教えてください
>>575
そんな関数知りません。
>>569
前者だろ。後者は見たことない。

>>575
なにそれ。
ググんない初心者が多いな最近。
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);
>>569
俺は下のほうが好き。
>>581
エラーは出ないのでは?
全角を直せ。
>>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;
}

}
=よりも==の方が優先順位が高い理由を教えてくたざい。
マルチに答えるな、と
>>587
仕様
#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
設計ミスだろ(プ
>>587
int i = 6, j=5;
bool t = i == j;
これで=の方が先に評価されたら困るから。
>>587
無能を早い段階で排除するためにそうなってます
>>594
無理矢理だな(稈
>>587
ほかの比較演算子との整合性をとるためだと思われ
== != > < とかとね

つまり、
bool hoge = i > j;
だったら>の方が上なわけで、とすると==も上になるわけで
結局は比較演算子の方が優先度が高いっていう仕様のせいだな
代入演算子は優先度が低い方がいいと思うが
600デフォルトの名無しさん:03/05/07 20:39
>>599
同意
コンマより低かったら困るけどな。。。
>>600
ちょっとワロタw
602600:03/05/07 20:42
>>601
あれ?間違った?
>>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;
}
}
606605:03/05/07 21:52
605のようにプログラムしても
コンパイルが通りません。
なぜですか?
>>606
処理系を正しく設定してないんだろ
>char i,j=0,k;

int i,j=0,k;
にするべし

原因はスタックが壊されてるから。
609608:03/05/07 22:00
って、コンパイルが成功しないって書いてるな。
コンパイルは成功したけど。
>>606
具体的にどういうエラーが出るんよ
>>605
とりあえず main は値を返すべきだと思うが
そもそもif文を使うべきだと思うが
よく見ていないけど、警告をエラーと勘違いしただけじゃないの。
>>604
Cの構文規則調べた事ある?

これって、Cの基礎知識だと思うのだが・・・
615鈴木健一郎 (NT4.0/2000/XP):03/05/07 22:22
随分変な質問なんですが、例えば、(名前, 住所, 体重, 性別 ...)みたいな
感じのデータをいっぱい入力させといて、
w3 = GetData("Yamazaki","weight")

こんな感じで取得するプログラムを作っています。
で、ここでマニアックな質問なんですが、このプログラム(クラス)に
カッコいい名前をつけてください。

名前が決まらないのでコンストラクタが作れないし、ファイルに保存が出来ない・・・。

周りに聞いたら IDMapper IDManager とかちょっとセンスのない名前しか挙がらない。
>>615
命名スレにゆけ
617デフォルトの名無しさん:03/05/07 22:30
SDKまたはDDKのAPIでも良いのですが、パーティションを作成できるようなコマンドはないでしょうか?
領域さえ確保出来れば、formatコマンド等でどうにかなりそうな気もするんですが。
618デフォルトの名無しさん:03/05/07 22:32
アンケートでVBからjavaやC#に移る傾向があるみたいよ!
C#ってなに?
C++とは違うの?そもそもオブジェクト指向なの?
最近時代に取り残される感じがする・・・
だれが簡単に説明してちょ!
>formatコマンド等でどうにかなりそうな気もするんですが。


・・・何が?
>>614以降、厨房の嵐が。
621デフォルトの名無しさん:03/05/07 22:33
>>618
激しくスレ違い。
>>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
その例はconstだからダメ。
>>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 を使って
シコシコやったんでいいかと。
637634:03/05/08 01:18
>>635
-fwritable-stringsは、過去のコードをコンパイルする時以外に使うんじゃねぇ!
新規にコード書く時には使うなよ。

それとコード例、随分乱暴すぎるぞ。
半角文字も考慮して書き直してみろや。
ここで発表しろとは言わんけど。
コンソールアプリケーションで文字の色を変更するとしたら、その部分は完全に機種・OS依存になるのでしょうか。
Win32で動作するコンソールアプリケーションで文字の色を変える場合にはコンソールAPIを利用するしかないということでしょうか?
wchar_tを使った場合半角と全角が混在してても問題無いの?
wchar_t *wc = "ち0こ";
wc[1] = 'ん';
wc[2] = 'げ';

ちんげになるの?'
>>638
ANSIシーケンスでぐぐる
>>638
普通にコンソールって言うと VT100 とかを思い浮かべますが。
642デフォルトの名無しさん:03/05/08 03:33
あの、すいません。C言語を学校で習い始めた超初心者なんですが、
家でC言語を動かせる環境ってどうやれば作れるんですか?
>>642
何から説明すりゃいいんだ?OSからか?
>>642
>>1-15あたりに書いてるのはもちろん読んでるんだろうな
645642:03/05/08 04:55
すいません過去ログ読んで疑問点を絞ってから出直します。
646デフォルトの名無しさん:03/05/08 05:16
cygwinを現在導入していて
xxgdbを使いたいのですが
インストールなどの操作は分りません。教えてください。gdbはすでにインストールし
ています。
(´-`).。oO(……)
648638:03/05/08 07:50
>>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のコンパイラを手に入れる。
>>655
ごめんdoubleやね。
658デフォルトの名無しさん:03/05/08 15:33
分子のx2乗とかの所がわかんないんですけど....
exp(x)
>>654
今書き込んでるPC使えよ。
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は要らないと思うのですが?

>>664
意味わからん。
>>662
staticをつけると他のファイルから呼べなくなる。
externはその逆。デフォルトだから普通はつけないと思う。。。
>>665
FAQの1.11に書いてあるよ。
669667:03/05/08 15:56
あ・・・定義じゃなくて宣言の話か・・・・・
試したことないから知らない。
>>665
> externは要らないと思うのですが?
なくてもいい。
671デフォルトの名無しさん:03/05/08 16:00
女性は無料で遊べる!逢える!恋愛出きる!
もう寂しい生活とは縁を切ろうね!
愛して 愛される そんな出会いがなきゃ
生きてる 意味がない!
http://www.sweet.st
672662:03/05/08 16:04
>>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がついていなければ)。
でも引数チェックやら何やらができなくなるからやめた方がいい。
674672:03/05/08 16:15
>>673
納得です。

関数のプロトタイプ宣言を、異なるソースファイル間
でおこなうわけですね。
これで、引数チェックが行われて、バグを作らなくなる
わけですね。

納得しました。

異なるソースファイルにある関数を使いたいときは
externで宣言しとけですね。

K&Rには載っていなかったですよ。。。
>>674
普通は宣言はヘッダーファイルに書いてそれを様々なソースファイルからインクルードする。
static関数(←呼び方おかしいかも)の場合は他のファイルから呼ばれることはないので(定義と同じ)ソースファイル内で宣言する。
676674:03/05/08 16:24
>>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
それって、コンパイルできるの?
>>677
int a = 2;
int main(void){
  int a = 1;
  return printf("%d\n", a);
}
と同じ、スコープが狭い方が有効になる。
K&Rにだってこの話は載ってるだろうに。
>>679
グローバル変数にアクセスするときはどうしたらいいの?
C++だと::aだけど。
>>681
仕様です。できません。
>>682
できないのか・・・・サンクス
ということは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;
}
>>677,679
externって出たよ
>>685
GCC だと、非 static と宣言した後に
本当は static だったということで警告が発せられる。
でも、一応 static が呼ばれる。

仕様ではどうなってるんだろ。
未定義?
689679:03/05/08 18:11
悪い、間違い。規格では「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
ネタか?
>>700
ほとんどというか、そういう構造をスタックと言うんだと思っていたけど。
キューはポニーテールではないのか、キューは
中国が嫌っている言葉だな
704686:03/05/08 18:48
どなたか教えてくれませんか・・・?
705デフォルトの名無しさん:03/05/08 18:56
約分できるか判定して表示しなかったらいいじゃん。
>>686
約分できる=素数でないので
素数の判定をして、素数だけ出力すればいい。

素数の判定方法は宿題とする
>>706
違うって。
708686:03/05/08 19:02
>>705
if文でできないか考えたのですが、
それだとすべてのピタゴラス数を書くようですよね?
なので、それ以外の方法が欲しいのです。
709686:03/05/08 19:03
>>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をエラトステネスのふるいにかけてからピタゴラス数を求める。
715685:03/05/08 19:19
>>714
あ、そうですね。
aをa^2=b^2+c^2が成り立ってて、かつ約分できない場合は
aが素数となるんですね。
どうもありがとうございました。

ただ、エラトステネスのソースは思いついてないので、
以前作った因数を調べる素数テスタで図ってみたいと思います。
本当にありがとうございました。
716685:03/05/08 19:23
いや、やっぱり長辺は素数になりません。
717デフォルトの名無しさん:03/05/08 19:27
どっちやねん。
すれ違いだ
719デフォルトの名無しさん:03/05/08 19:30
お前ら、Windowsの改行コードは0D 0Aだぞ。
文字列で表したら\r\nだ。
\nなんて書くんじゃねぇ。
大丈夫。変換してくれるから。
721デフォルトの名無しさん:03/05/08 19:34
変換してくれるとはかぎらねぇよ。
ファイルにリダイレクトして、
いろんなアプリで開いてみろ。
ぼけ。
722685:03/05/08 20:02
>>717
素数じゃありません。
>>718
このスレであってるはずです。

色々考えたんですが、3辺の比のうち、どれかが素数であればいいことがわかりました。
ソースに素数判定ソースを組んで見たいと思います
723638:03/05/08 20:02
>>649
そうなのですか…。やむを得ないので機種依存するという前提でプログラムを作ってみます。


MSXの改行はchr$(13)だから\rだけど文字コードとかDOS互換のはずだから\r\nだと思う…よーわからんが。
>>722
>>1を見ての発言か?
>>722
共通の約数を持ってるかどうかだから、ユークリッドの互助法が適当だろう
726デフォルトの名無しさん:03/05/08 21:39
即死
何もしないウインドウプログラムをC言語・HSPで作ったんですが
動きません。なぜでしょうか。なんだったら自分は
そのプログラムをここに書いても構いません。プログラマー目差してるのに早速挫折しそうです。
助けてください。
>>727
正直、向いてないので今からでもサッカー部に入ってJリーグ目指しなさい。
>>727
少なくとも動かないってのはどういうことなのかぐらい書けと。
コンパイルが通らないのか、実行しても何も起きないのか
>>729
ttp://www.vector.co.jp/soft/win95/prog/se080832.html
ここのソフト使って作ってるんですけど・・・
実行してもobjがないとかですぐウインドウ閉じちゃうんです。

>>728
消防時代サッカー選手を目差し少年団やってましたがあまりに下手で
試合に選ばれなかったので挫折しました。

本当に助けて下さい。このままではスポーツもだめ、パソコンも駄目の超駄目人間になってしまいます。
助けてください。
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];
>>732

ありがとう。やってみます。
>>735
HSPスレで聴いた方がいいんじゃない?
737730:03/05/08 22:09
ttp://www30.tok2.com/home/koro/taku/puroguram.html

UPしました。改行なくて滅茶苦茶ですが・・・

>>735

ここが一番親切に教えてくれると思うのでここに居させてもらいます(汗
>>730
> 本当に助けて下さい。このままではスポーツもだめ、パソコンも駄目の超駄目人間になってしまいます。
> 助けてください。
2chで教えて君してる時点で既に超々駄目人間。
WinXPでCを勉強してます。
9x時代には\nで改行できたのですが、XPではできなくなってしまいました。
どうすれば改行できるのでしょうか?
>>739
.................
既視感
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
>一応どっちでもうごくみたいですが、どっちが正しい書式なんでしょうか?
どっちもただしい
むしろ「ご質問」がヘン。
650から最新50で読めないのですみません。実験です。>>650-750
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 でも問題ない。
>>749
Cプログラマはif(c)と書く。
>>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'){
・・・
760754:03/05/09 00:02
>>758
ヤパーリ
>>756
>754
じゃぁ、128以上に行くと負の数になる。
二進数で考えなー補数にだ

こんなことがあるから
unsigned char
にするにだ
762759:03/05/09 00:03
あ、返事貰ってる・・・失礼しました
763754:03/05/09 00:04
>>759
引数がなければNULLにアクセスしてたぶんあぼーん
本当に引数をつけた?
764748:03/05/09 00:07
>>756
行き違いになってしまいました。
なるほど分かりました。
みなさんありがとうございました。
765759:03/05/09 00:08
>>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つめの整数を入力して下さい。

2つめの整数を入力して下さい。

和は 5

実行しても何も表示されないんです。それで2つの数字を入力してみると、
最後にprintfの文章がまとめて3行表示されるんです。
ほんの通りにやってるつもりなんですが…。どうしてでしょう??
すみません、教えて下さい!
768デフォルトの名無しさん:03/05/09 00:10
charで必ず表せる範囲・・・0〜127
signed charで必ず表せる範囲・・・-127〜127
unsigned charで必ず表せる範囲・・・0〜255

あっている?
769761:03/05/09 00:11
>748
char i = 129;
printf("%d",i);

こんな実験をやってみそ
>>767
flush
>>767
fflush(stdout);
>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);
}
>>773
それ752だろ。
2の補数マシンで char == signed char な環境なら
charで必ず表せる範囲・・・-128〜127
signed charで必ず表せる範囲・・・-128〜127
unsigned charで必ず表せる範囲・・・0〜255

じゃないか?


とにかく8ビット入るでええやん。
>>773
どううまく行かないのかくらい書けよ。変数の簡単な説明モナ。
>>759はちょっとソースを晒してみるよろし。
ANSIで保証されるのは>>768であっているのでは?
gdbってセグメンテーション違反が起きた場所を探すのに便利だよね。
ほかの使い方は知らない・・・
781デフォルトの名無しさん:03/05/09 00:23
chr型1バイトだろ。0〜127じゃ、残りの128はどうなるのよ
>>772
なんか、limits.h の SCHAR_MIN が -127 のやつがちらほらあるんだがなんで ?
>>781
「保証される」
>>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);
}
790759:03/05/09 00:31
>>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;
}
791759:03/05/09 00:31
char rmv(char c){
if(isalpha(c) == 0)
return '\0';
else
return c;
}
>>789
nが0かどうかチェックしていないところ。
>>789
絶句。
794792:03/05/09 00:32
つーか再帰の終了条件がないじゃん。
*(alp + j) = ss;
これはなに?
796759:03/05/09 00:34
あ、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
>>815
 short より短そう...
なんかもう標準でtypedefして欲しい
って本末転倒か
C99ってやたらと整数型多くなかったっけか。
long long = 256, long = 128, int = 64, short = 32, short short = 16
こんな感じでたのむ。
>>819
大却下
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
【ウィザードオンライン開発中in 2ch】
http://game3.2ch.net/test/read.cgi/mmominor/1050889293/l50
http://219.96.231.242/wizonline/

あっ、誤爆
838835:03/05/09 06:40
>>836
ありがとうございます。
そういわれればそうですね。
tree *findnode
で宣言してたのでポインタ扱ってるはずなのになぁ(´-`).。oO
とつまってました。
もう一度!ありがとうございましたヽ( ´ー`)ノ
ctime関数で時刻表示した後改行したくないぃぃーッ!
って時はどうしたらよいですか?
840デフォルトの名無しさん:03/05/09 10:23
33188のような8ビット数字列を
-rw-r--r--のようにファイルモードと許可ビットの文字列に
変換するにはどう処理を書けば良いでしょうか。
宜しくお願いします。
時刻表示する ctime の実装なんてあるの?
>>839
改行削ってから表示。
>>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
えっ、どうやるんですか??
>>844
Backspace
>>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でよかったか。
850844:03/05/09 11:52
ありがとうございましたー!どうもー
シフトすればいいんじゃない?
852175:03/05/09 13:19
#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");}
}}}
853175:03/05/09 13:19
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;}
まじでそんな見づらいコード書いているの!?
855175:03/05/09 13:25
>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}
となってしまうんです。

もう泣きそうです、助けてください!
>>852-853
吐き気を催しました。
857デフォルトの名無しさん:03/05/09 13:37
if(NULL==(a=(int *)malloc(n*n)))

==を=と書いてしまった時にエラーがでるようにするためらしいけど、激しく違和感があるね。
858175:03/05/09 13:45
>857
それはメモリが確保できなかった時に終了するルーチンです
持ってる教科書にこんな感じの例が載ってたので・・・
>>858
並び順のことを言っているんだけど。
860859:03/05/09 13:50
つーかこの場合はNULLを後にしてもエラーでるじゃん・・・
861175:03/05/09 13:50
>859
並び順も教科書そのままなんです
「実習C言語」っていうのに書いてありました
862859:03/05/09 13:51
×NULLを後にして
○NULLを後にして==を=にして
863175:03/05/09 13:57
>>856-857 >>859-860 >>862
分かんねえなら、いちいちレスすんなカス共
どうせ数学はリア厨以下なんだろ? 知ったかクン?
バカの癖して、しょうもねえとこばっかツッコミ入れやがってこの能なし共が!!!

おまえらみたいなカス共に期待した俺が浅はかだった
もういい、こんなとこ二度と来ねえよ

んじゃなカス共
864175:03/05/09 13:58
>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バイトじゃねー処理系が多いぞ。
868175:03/05/09 14:10
>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];
  }
 }
}
870175:03/05/09 14:38
>869
有難うございます
参考になります
>>870
いや、それ以前に >>867 は理解したのか ?
872175:03/05/09 14:45
>871
いえ
さっぱり
(・∀・)
874175:03/05/09 14:55
分かりました!
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バイトになるまでは時間は十分あるし、今時少々メモリーを取り過ぎたってどうてことないから。
878175:03/05/09 15:07
>875
有難うございます
sizeof(int)でint型が何バイトかを取得できるのですね
これを使えば、環境に依存しない形で書けるみたいですね

>876
VB使える環境ないです・・・
C++ですか、勉強してみます
>>878
いや、それ以前に >>877 は理解したのか ?
880175:03/05/09 15:13
>879
int型が何バイトになるかは環境によって違うということですよね?
881175:03/05/09 15:16
if(NULL==(a=(int *)malloc(n*n*sizeof(int)))){printf("No memories!");return 0;}

つまり、これでint型のn*n行列を確保できる、と
882175:03/05/09 15:23
874では
n*n*sizeof(int)
とすべき所を
n*n*sizeof(int)*sizeof(int)
にしてたんですね・・・
>175K&Rを買いませう
884175:03/05/09 15:31
皆さん有難うございます!
mallocの部分を直したら正しい結果(>>866さんの書いた結果)が出るように成りました!
885175:03/05/09 15:41
>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
当然です。配列とポインタは全く異なるものだからです。
定義したとおりに宣言しなくてはなりません。
896894:03/05/09 23:39
これだけでは何なので。

ポインタ変数=データの位置情報(ポインタ)を入れる変数
配列=データの羅列

であり、根本的に両者は異なる。
ポインタ変数の場合はデータの位置(ポインタ)を使って
間接的にデータにアクセスするが、
配列の場合はデータに直接アクセスする。

上の例の
const char g_str[] = "this is test.";
は配列である。
すなわち、文字列がそのままデータとして置かれている。
これを
extern const char* g_str;
で参照しようとしても、
「置かれたデータのどこにもポインタが存在しない」のである。
この状態では g_str の先頭数バイトに入っているデータをポインタとして無理矢理認識し、
そのポインタを使ってデータを参照しようとする。
しかし、そんなポインタが正常に働くわけも無く、Segmentation Fault になるのである。
897895:03/05/09 23:41
>>896
おれも補足。つーてもURLはるだけ(w
http://www.catnet.ne.jp/kouno/c_faq/c6.html
これをじっくり読むよろし。
898893:03/05/09 23:59
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はなんかよくわからん。
もしオススメのサイトあったらキボンヌ
905903:03/05/10 03:21
>>904
ヘタレでスマンが、waveletは担当してないから、ようしらん。
会社行けばCのソース有るが・・・

ttp://www.amazon.co.jp/exec/obidos/ASIN/4627075111/ref=pd_bxgy_text_2/250-1439864-3561046
ところでこの本を見てくれ。こいつをどう思う?
DSPでやるかパソコンでやるか。
お金とか、でいろいろ。
>>905
「こいつ」というのは、本のことか、著者のことか?
908デフォルトの名無しさん:03/05/10 11:46
if(a)みたいに条件式が無いやつはどういう意味ですか?
>>908
aが非0だったら、という意味
a は立派な「式」だぞ。
普通の人は式だと思わない。
これは正常。
>>909
>>910
ありがとうございました。はじめたばかりで不親切な教本買っちゃったもので
>>912
大丈夫だ。99%の本は不親切だ。
初心者向けに薦められる本などない。
>>912
始めたばかりの癖に
「不適切な教本」という評価を下せる
お前に乾杯!
真って非0だったっけ。
>>915
un
917915:03/05/10 12:26
ごめ。非0で条件分岐したわ。1だけっていう勘違いでした。

if(5)
  printf("true\n");
918デフォルトの名無しさん:03/05/10 12:57
おい、画像の表示方法おしえろ。
本とかネットで探してもあんまりそういうの見当たらないんだ。
どういう風に表示するんだ?
画像処理の関数とかがあんのか?
919デフォルトの名無しさん:03/05/10 13:04
>>918
VBなら楽だよ。VB使いなよ。
>>918
OS などの環境に依存する。
921デフォルトの名無しさん:03/05/10 13:09
graph.h後から入れるのはやめたほうがいいのか。
入ってるコンパイラってどんなのがありますか?
922デフォルトの名無しさん:03/05/10 13:10
おい、文字列の代入方法おしえろ。
本とかネットで探してもあんまりそういうの見当たらないんだ。
どういう風に代入するんだ?
文字列代入の関数とかがあんのか?
>>922 は俺じゃねぇぞ

真似すんな低脳。
そんなレベルのことならネットで調べろ。

OSに依存するんだな。
OSはWINだ。
画像処理系は難度が高いのか?

それともわざわざ解説書作っても需要が無いからなのか?
お前みたいな頭の沸いたヤシはJavaでも使ってろ
*pointer="文字列";
>>923
環境に依存するかどうかわからないやつに低脳などと言われたくないよ。
ふーん(;´Д`)ハァハァ
>>922 は俺じゃねぇぞ

わざわざ言うほどのことか?
>>925
サンクス。うまくゆきました。
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
俺は質問しに来ただけだ、
うせろ、雑魚が。

プログラムを動かすには
コンピューターの総合的な知識が必要だってこと、
プログラムいじってみて分かった。

お前等ホント、パソコン好きだな。
俺も中学生くらいからパソコンいじっておけば良かった。

今の子供はパソコンが一家に一台の時代だから羨ましいぜ。
>>943
ネタですか?
一家に三台ですが。
> 一度納入するとバグがなければ壊れるまでだからこれが一番手を抜いたわ!
なんで手を抜くんだ
Java厨しつこい
>>938>>941>>946
お前ら、ヨソでやれ。
948デフォルトの名無しさん:03/05/10 13:28
プログラマーとは如何に手を抜くかを考えるものよ・・・
効率、信頼性なんて二の次よ!
次スレヨロ↓
950デフォルトの名無しさん:03/05/10 13:31
うし
次スレは
【プログラマは如何に手を抜くか?】
かい
>>948
Java厨らしい無責任さだな(w
953950:03/05/10 13:33
たててくる
GUIをちょこと調べたが、画像を表示するだけでいいんだ。
俺が求めてる知識は多分GUIじゃないと思う。
bmp png gif そういう画像ファイルを表示したいだけなんだ。

それでだな、ゲームを作ってるHPなんだが、
http://www.game2channel.com/semi/programing/gpnyumon/06/index.html
ちらちらとこのHPを見てたんだが、グラフィック表示例の一行目、

#include"gmsub.h"

と、ある。この関数はHPからダウンロードして使ってくださいと書いてある。
こういうグラフィックの自作関数を作るのには相当なスキルが必要なのか?

もう頭ん中がパンパンだぜ。
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!
961病的:03/05/10 13:43
>>954
相当なスキルが必要です
C04では標準になるらしいが、今はまだ非標準。
>>961 おだいじに。
964デフォルトの名無しさん:03/05/10 13:45
CでC++を使う方法を教えてけろ
965病的:03/05/10 13:46
>>963
もまえもな
int C;
C++;
>>964
ありません
#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で動くリンカーを教えてください。
>>969
MS-DOSで動きますか?
…本気でJAVA厨がウザくなってきた
次スレまだぁ〜?チンチーン
>>970
プリプロセッサはさがさんで良いのか?
>>972
さっきから訊こうと思ってたんだが。
何故そこまでJAVAを嫌う。
<img src="image.jpg">
JAVAが嫌いなわけじゃない、スレ違いなネタを続ける奴が嫌いなだけ
>>975
押し付けてくるから
979デフォルトの名無しさん:03/05/10 13:56
キーボードから入力された文字列を、配列に格納する際の質問です。

char str[10];
fgets(str, 10, stdin);

こう記述されいると、strに格納されるのは9文字(+ヌル)ですよね。
もしキーボードから入力されたデータが15文字くらいあった場合、
文字数が多すぎて配列に入り切らないという旨のエラーを表示させたいんですが、
文字数はどうやって判断したらいいのでしょうか?

最初は改行文字が格納されているかどうかで判断しようと思っていたのですが、
9文字丁度の文字列が入力された場合の処理がよく分からなかったので。
なにかいい方法はありますか?
980デフォルトの名無しさん:03/05/10 13:57
test
981950:03/05/10 14:00
http://pc2.2ch.net/test/read.cgi/tech/1052542761/

たてたよ。串探すのにてまどった
>>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);
>>983
ネタやるんならキエロ
>>979
多めに取得して strlen() で判定。
>>979
getchar() で一文字ずつ判定。
988デフォルトの名無しさん:03/05/10 15:30
>>987
本当に長さが分からないなら>>987も手ではなかろうか。てかそれしか
ないような。Cを使う理由が無いなら C++ を使う。
>>986でいいだろ。
>>988
どうせお前は プ しか書けないんだから、でてくんな。
うめうめ。
昔はfgetcの関数呼び出しのオーバーヘッドも無視できなかったなぁ
たてたて
995
996
997996:03/05/10 16:03
1000
998999:03/05/10 16:03
1000!!
999999:03/05/10 16:04
1000?
10001000:03/05/10 16:04
うひゃうひゃうひゃ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。