C言語なら俺に聞け<35>

このエントリーをはてなブックマークに追加

マターリ未定義論争でもしましょうか。
もちろん質問も受け付けますよ。それがメインですし。
課題丸投げ?それは別スレでやってください。


・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART6
http://pc3.2ch.net/test/read.cgi/tech/1033207156/

・前スレ <34>
http://pc3.2ch.net/test/read.cgi/tech/1033240509/

コンパイラ、過去ログなどのリンクは>>2-5 あたり
2デフォルトの名無しさん:02/10/11 20:51
【コンパイラ】
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
3デフォルトの名無しさん:02/10/11 20:53
【その他】
http://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/prog/progf.html
http://www.bloodshed.net/index.html

【注意】
Cmachineは一般的なCと挙動が違いすぎるので動作の保証はできません。
まともな処理系を使いましょう。
4デフォルトの名無しさん:02/10/11 21:02
コンパイラについて詳しく教えていただけないでしょうか。

貧乏で本も買えないのでよろしくお願いします。
いい加減>>1からK&Rを消してくれよ
>>5
うるさいよ
>>4
>貧乏で本も買えないので

立ち読みはできるだろう?
俺が厨房の時は本屋に足繁く通って必要なところ暗記して帰ったもんだが。
>いい加減>>1からK&Rを消してくれよ
プッ
9デフォルトの名無しさん:02/10/11 21:07
実は近くに本屋もないのです。
電車に乗れないの?ガキですか?
>>4
> 貧乏で本も買えないので
まず、回線を切ってお金を貯めましょう。
1ヶ月ネットを我慢するだけで本の1冊や2冊簡単に買えます。
12デフォルトの名無しさん :02/10/11 21:14
>>9
【コンパイラ】
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/
13デフォルトの名無しさん:02/10/11 21:14
すみません。電車もないのです。
バスで往復するとバス代だけで本が買えてしまいます。
買え
15デフォルトの名無しさん:02/10/11 21:20
ネットには友達に借りているb-movileでつなげているのでただです。
パソコンも友達にもらったもです。どうか意地悪しないで教えてください.
ヒッチハイクだな
バスジャックだな
18デフォルトの名無しさん:02/10/11 21:25
>>15
お前何歳?
コンパイラについてって、コンパイラの何が知りたいんだ?
>>15
本も友達から借りるなり、もらったりすれば
>>4
仕方ないな。ここは一つ、俺のおすすめサイトを教えてやるよ。
ここさえ読めば誰よりもコンパイラについて詳しくなれる。

http://etlab.mis.ous.ac.jp/knowledge_e/032/menu.html
21デフォルトの名無しさん:02/10/11 21:33
C言語をはじめたいのでコンパイラについて知りたいのですが・・・
22デフォルトの名無しさん:02/10/11 21:44
>>21
http://www.stileproject.com/monkey_sugar.swf
このサイトをまず見ろ
スレ立て乙〜
2422:02/10/11 21:49
>>23
どういたしました
25デフォルトの名無しさん:02/10/11 22:03
コンパイラは Borland C++ 5.5.1 for Win32 を使用しています。

猫でもなんかで stdio.h の printf関数を覗いてみましょうとありますが、
Includeフォルダの中のstdio.hには
defineがいっぱい書かれているだけで
肝心の関数が見当たりません。

どこにありますか?
>>25
通常、C言語のヘッダファイルには宣言しか書いてないので見てもつまらないと思います。
27デフォルトの名無しさん:02/10/11 22:06
>>26
じゃぁ、*.cはどこにおいてあるの?
>>25
printf()関数のソースを見ることはできません。
関数の定義だけがヘッダには書いてあり、実態は
ライブラリ、というコンパイルされた後の関数の固まりで提供されています。
ソースは非公開
標準関数のソース落とせるところないです?
売ってるかもしれないが、ボーランドはどうだろう。
なんでもよければLINUXの奴みるとか。
3225=27:02/10/11 22:14
>>28
*.objとかそういうやつですか?

sprintf()の戻り値とか
覚えていないので、調べたいのですが
どうしたらいいですか?
このさい奮発してVS.NETの学割版かおうかなぁ。

#なんか俺一人ageてると寂しいけども
#新スレだしいいかw
3425=27:02/10/11 22:24
>>33
Thx!!
早速ブクマークしておきますた!
3625=27:02/10/11 22:33
>>33,>>35
Thax.

PCにダウンロードしてオフラインでマターリ見れるのが理想ですが
贅沢過ぎますねw

テンプレに追加してほしい無いようだ・・・
37manko_chinko ◆GLc2rpKRNM :02/10/11 22:33
>>25
light-cとかいうC処理系は購入したらライブラリのソースみれます。アセンブリの
3825=27:02/10/11 22:39
>>37
アセンブリの何なんですか?
気になって夜も眠れません。
さっきコーヒー飲んだばっかりなので、損した気分になってしまいます
市販されてる製品なら、標準関数のソースコードが同梱されてるのは結構あるよね。
VC++とかLSI-Cとか。

フリーで転がってるのにはまずないけど。
40manko_chinko ◆GLc2rpKRNM :02/10/11 22:41
>>38
コーヒーはカフェイン多いから、気になって眠れなくても同じことじゃないんですか?
>>39
gccにも無いの?
42manko_chinko ◆GLc2rpKRNM :02/10/11 22:43
>>39
なんだVCにもついてるのか。しらんかった
43デフォルトの名無しさん:02/10/11 22:47
VCにはついていない。MFCのソースならついているが。
>>43
ついてるはずだよ。
インストールオプションで指定してないんじゃなの?
VC++には少なくともver.4からC Runtimeのソースコードがついてますよ
46デフォルトの名無しさん:02/10/11 22:58
>>41
libcのソースコードはあるんじゃない?
gccにはついてこなくても。
glibcのソースならここにあるだろ。
http://ring.astem.or.jp/archives/GNU/glibc/
48デフォルトの名無しさん:02/10/12 05:36
>>32
戻り値を調べる程度ならhttp://www.linux.or.jp/JM/が便利だよ
セクション3がライブラリ関数。
ただし標準C向けではなく、Linux向けなので注意。
進行の速いスレですね。C言語マンセー
50デフォルトの名無しさん:02/10/12 08:07
Cとしてしか使わないのに何故VC++、Borland C++ Compilerを使うの?
CならCコンパイラ使えば?LSI-Cとかさ。
処理系選びも適材適所。
>>50
多分メモリの問題じゃないの?
52デフォルトの名無しさん:02/10/12 09:29
>>51
何言ってんの?
>>50
逆に聞くけど、Cとしてしか使わない時にLSI-Cが
VC++よりも(価格以外で)優れている点ってあるの?
LSI-Cって試食版のことではないよね?

俺がVC++を使う理由は、統合開発環境が便利
(GUIでの操作/API等のヘルプ/デバッガ/リソースエディタ等々)、
それと最適化が優秀だから。
54デフォルトの名無しさん:02/10/12 10:20
Cなんて時代遅れのキモイ仕様の言語はもう必要ないってことだな。
C用ではなくC++用処理系を使っている時点でそれを証明している。
C++によって生かしてもらっているだけ。跪いて感謝しろよ。
親が引退したら子が養うのは当然のことさ、あらためて感謝するようなことじゃない。
  ∧∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 (゚Θ゚)  < どうでもいいよ。
 (  U)  \________
 (__(_)))

もっと、コード教えて

>>52
LSI-Cって16ビットコンパイラじゃなかった?
int a[10000000];とかできるの?
>>50
つーかなんで32bit時代に16bitコンパイラなんて使わなきゃならないんだ。
きっと知らなかったんだよsage
>>53
組み込み関係の機能は、VC より LSIC-86 の方が優れてるっぽい。

>>57
そもそも、LSIC-86 は、8086 用だから、int a[10000000]; は無理だろう。(int が 16bit としても、20MB 必要だから。)
http://www.lsi-j.web.sh.cwidc.net/product/c86/

>>58
みんながみんな、Windows とか Linux とかやってるわけじゃないから。
俺も、DOS のために VC++ 1.5 とか未だに持ってるし。
VC++は、CコンパイラとC++コンパイラが別になってるというのを
知らないのか?
>>61
知らんけど、それがどうかしたのか ?
63デフォルトの名無しさん:02/10/12 16:55
超ド級の低レベルの質問でもうしわけないです。
今win95 C でプログラミングしてます
そこでsleep関数を使うとエラーがでてしまうのですが、使えないのでしょうか?
プイ一ハケソ
>>63
「どんなエラー」か書け。
6663:02/10/12 17:00
22.obj : error LNK2001: 外部シンボル "_sleep" は未解決です
Debug/22.exe : fatal error LNK1120: 外部参照 1 が未解決です。

でした
コマンドまたはファイル名が違います
>>66
Windows なら、Sleep() にしとけ。
ただし、引数は 1/1000秒単位だから、気をつけろ。
6963:02/10/12 17:07
#include <stdio.h>

void main(void)
{
Sleep(10);
}

22.obj : error LNK2001: 外部シンボル "_Sleep" は未解決です
Debug/22.exe : fatal error LNK1120: 外部参照 1 が未解決です。

てなりました。
使い方まちがってますか?
hedda
>>69
mainの戻り値はintにしろ。
>>69
#include <windows.h>
7363:02/10/12 17:18
いやだ!
7463:02/10/12 17:22
>>73
は偽者ですので

#include <stdio.h>
#include <windows.h>

int main(void)
{
Sleep(10);
return 1;
}



c:\program files\microsoft visual studio\vc98\include\ole2.h(348) : error C2032: '<Unknown>' : 関数は struct '_OLESTREAMVTBL' のメンバとして定義できません。
cl.exe の実行エラー

となったのですが
(7゚
7663:02/10/12 18:04
使用OSはwin2000でした。すいません
>>74
ん?何でだろ。
Borland-C++5.5.1やMinGWではちゃんとコンパイルできて動くのだが・・・
>>77
VC++ 6.0 でも、コンパイルできる。
もう1回プロジェクト最初から作ってみたら ? > >>74
7963:02/10/12 18:11
>>74
ためしてくれてありがとうございます。
いろいろやってみたのですがsleep関数はC++だったんですね、Cでやってたものでできませんでした;;;
>>79 ふーん。あっそ。面白くないよ。
8163:02/10/12 18:16
>>77>>78
ありがとうございます。
Cで開いてするとエラーがでて、C++で開いてするとうまくいきました。

C++でしたのを名前をCにしてみてもうまくいきました。
なぜなんだろう・・・

こんなことに付き合ってくれてありがとうございます
82初心者:02/10/12 23:35
Cを短期的に学習する方法って何かないものなのでしょうか?
やはりソースを見ながら学習するのが早い?

皆さんはどうやってCを学習しましたか?
小さいころの柔軟な頭で学習しました。
Cは・・・経験するしかないでしょう。
>>82
他の言語で本格的にプログラミングしたことあるの?
>>82
他の言語でプログラミング経験があるなら難しくない。
それまでの経験と勘のよさにもよるが
入門書片手に早ければ1〜3日もやればそれなりに使えるようになるだろう。
ポインタの概念で躓く人も多いが他のポインタ言語やアセンブリ言語の経験が
あれば難しくはない。

そうではなくまったくの未経験なら
語学や速記などの他の職業技能などと同じように地道にやるしかない。

好きでやっていていつのまにか習得できてしまったという人も少なくないが(俺もそうだが)
好きなやつが「短期的に」なんて言う訳がないしな。

http://www1.neweb.ne.jp/wa/yamdas/column/technique/21-daysj.html
87デフォルトの名無しさん:02/10/13 07:45
キーボードから二つの整数を変数に入力したのち,ポインタを使って
たがいの値を交換するプログラムをつくりなさい。

って問題があるんですがswapを使わずにつくれますか?
もしつくれたら値の交換でつくるんですか?
アドレスの交換でつくれるんですか?
それとも両方でつくれますか?

アホっぽい質問でごめんなさい
>>87

int x,y,*xp=&x,*yp=&y,t;

/* ここで入力 */

t=*xp,*xp=*yp,*yp=t;
89デフォルトの名無しさん:02/10/13 07:55
>>87
いろいろな意味でわからない。値の交換で
ポインターを持ち出す必要あるんだろうか?
例題の趣旨によるけど。ちょっと興味ある。
int* a = &a1;
a1 = b1;
b1 = *a; これは正しくないよ!!と教えるための例題?
90デフォルトの名無しさん:02/10/13 07:58
>>88
Q1 ポインターを使うメリットを教えてください
>>89
ポインタの勉強だと思う。
>>87
ポインタを使えってことは、swapを書けってことじゃないの?
9388:02/10/13 07:59
>>90
俺にきくんじゃねーよ!!
94デフォルトの名無しさん:02/10/13 08:04
>>88
わるいでもポインターの必然性があまりにも無くて
あなたのコードに
>>94
それは俺も分かっている。

ポインタが必要な場合といえば、文字列や型がきまっていない時くらいかな。
構造体も場合によってはポインタの方がいいかも。
96デフォルトの名無しさん:02/10/13 08:21
なるほど構造体の例なら完璧ですね.
ポインターを教えるのに
9787:02/10/13 08:31
>>88
それわからない
swap使わなくてもそれでできるんですか?
>>92
swap習ってないから
98デフォルトの名無しさん:02/10/13 08:34
>>87
swapを自作して解く問題じゃないの?
99デフォルトの名無しさん:02/10/13 08:35
swap(int *i, int *j) {
int tmp = *i;
*i = *j;
*j = tmp;
}

swap(&x, &y); ってやるだけ。
>>99
しかし、それもポインタ使うメリットがわからん・・・・
101デフォルトの名無しさん:02/10/13 08:38
swap使わないんなら、ポインタ使わずに
int x, y, z;
scanf("%d", &x);
scanf("%d", &y);
z = x; x = y; y = z;
ってやればいい。
というか、最初からxとy入れ替えればいい。
102100:02/10/13 08:38
おっと、かんすうか(汗
10387:02/10/13 08:38
swap簡単だなー
この際テストでもswap使うか・・・しょうがない
104デフォルトの名無しさん:02/10/13 08:40
CGIだけど何か質問ある?
105デフォルトの名無しさん:02/10/13 08:50
>>99>>101では、どちらが普通、またはお勧めなんでしょうか。
できれば、CPUにかかる負荷とかCPU時間の違いなんかを教えてもらえればありがたいです。
106デフォルトの名無しさん:02/10/13 08:52
>>87
もともと どんな例題なんだよ?
short a = 10
long b = 20
memcpy (&(b+sizeof (short)), &a, sizeof (short))
memcpy (&a, &b, sizeof(short))
b = b >> 16
うごくか?・・・・
107デフォルトの名無しさん:02/10/13 08:54
>>105
死ね
108デフォルトの名無しさん:02/10/13 08:55
>>87
っていうか >>105の反応を見ると初心者には
この程度の例題で十分なのか?
109デフォルトの名無しさん:02/10/13 08:56
>>107
マジ質してんのに死ねとは?おまえこそ氏ね
>>109
俺たちを試しているんだろ?
111デフォルトの名無しさん:02/10/13 09:01
マジ質 SWAPって内部的にはなにしてるんだろ?
アセンブラレベルで
Push&Pop?
112デフォルトの名無しさん:02/10/13 09:02
>>110
ちがうだす。やっとそこら辺自分で書けるくらいになった初心者だす。
じゃあ、先輩方は上のことをやるとき、ポインタを使うのと数値変数
そのまま使うのとどっちが普通ですか、って聞けば答えてもらえます?
11387:02/10/13 09:03
>>106
関数の作り方はいままで出てきたことなかったけど
教科書には>>87の問題は練習問題として出てる。そのまんま
>>108
十分かどうかはわからない
でも>>105みたいに細かいことは考えなくていいと思う学校では
11487:02/10/13 09:06
もうswap(っていうか自作関数)の作り方覚えたからそれでいいや
難しいこと考えなくても問題解ければ今はいいわけだし・・・

今までありがとうございました!
115デフォルトの名無しさん:02/10/13 09:09
>>87先輩方はこのレベルでは”適当”ですポインター関係なくです。
a^=b^=a^=b;?
未定義
int a, b;
int* p;
/* 入力 */
p = (int*) a;
a = b;
b = (int) p;
printf("input a");
scanf("%d",&a);
printf("input b");
scanf("%d",&b);
printf("a=%d,b=%d",b,a);
>>118
未定義
>>120
俺が定義した
>>121 >>1を読め
C言語でRPGを作っています。そこで質問です。
いろんな種類のアイテムの管理がうまくできないのですが
どうしたらよいのでしょう。
前にSRPGを作ったときはアイテムの効果の種類が少なかったので楽でした。
HPの増減とスキルに分け、HPの増減はローカル配列に入力、戻り値を利用し、
中身を変えることで、射程は長いが命中率は悪い武器や、
回復力は使用者の魔力によって増加し、相手の幸運によってさらに
増加する回復魔法等を簡単に作れるようにしました。
スキルは数が少なかったので単発で処理しました。
今回のRPGではHP増減以外に状態変化、ステータス増減、防具等も
配列にまとめたいのですが、うまくできません。
アイテムの種類によって使うものが違うので
(HP増減は威力、状態変化は状態の種類など)
全てのアイテムをひとつの配列にすると、使わないのがある分
配列の横方向が25ぐらいになってしまい、ごちゃごちゃしてしまいます。
アイテムごとに配列を分けると呼び出すまでの処理がごちゃごちゃしてしまいます。
グローバル変数を使用する少しは楽だったりするのですが、
メモリの量とかあるみたいですし。
データファイルに書いておく方法もあるみたいですが。
どこがわからないかもうまく説明できていないと思いますがお教えお願いします。
>>123
よくわからんが、とりあえず struct と union の勉強をしな。
>>123
質問はageで。

それくらい面倒がるなよ。
SRPGってなんだ?
Shooting RPG?
>>126
Simulation RPG
126 が新しい分野を拓いた
>>123
C++に移行してStrategyパターンとAdapterパターンを適用しろ
>128
君はC言語の前にゲハ板で頭脳戦艦ガルの勉強が必要。
130 に怒られた
132名無しさん@Emacs:02/10/13 20:47
質問。
void func()とstatic void fun()はどう違う?
staticつけるといいことあるのか?
char*(*(*(*(*(*a)[5])[4])[3])[2])[1];
名前の衝突がないんじゃないの
>>132
void func()はexternがついていると見なされるから他のファイルからも呼び出せる。
staticは呼び出せない。

本読め。
136デフォルトの名無しさん:02/10/13 22:45
このスレ、ピッチが早いですね。しらない間に もう35すか。
そんなみなさん、ここでひとつ教えてください。

ポインタについてです。
独習本などは、盛んにポインタについて説明してあります。
それらの本を読んで、書き方や使い方はわかりました。
が、どの本を見ても、ふだんこうする所をポインタを使うと
「ほらこんなに便利なのよ」と嬉しさを書いたものがほとんどありません。
ポインタの嬉しさがわかれば、超ナットクできると思うんですが、
いまいちその良さがわかりません。教えてやってください。
  ・ポインタを使うことで何が嬉しいのでしょうか。
     具体例を ぜひ拝見させてください。
     配列で処理しては だめなの?
     ポインタはどんな場面で使うべきですか?
関数の引数に使うときかな?
スタックに余裕がないときとか
アナルマークが好きだから
>>136
具体例:
 printf、gets、puts、scanf、fopen、fclose、…のソースでも見るべし

1:変数を渡してくれたらその値を書き換えてやるぞゴルァ、という関数を作るとき。
  具体例: scanf( "%d %d %d", &a, &b, &c );
 もちろん関数の返値としてデータを返すようにしてもよいのだが、
  a = scanf("%d")
 複数の値を返したいとき面倒だし、でかいデータだと遅いし。

2:でかい構造体を関数に渡すとき。
 もちろんその構造体を丸ごと関数に渡しても動くことは動くんだけど、遅い。
 それよりはポインタ渡しにして、「ここにデータが入ってるから見れ」と
 (場所≒ポインタ) だけ関数に渡せる設計にした方が速いプログラムになる、ことが多い。

> が、どの本を見ても、ふだんこうする所をポインタを使うと
3:ふだんポインタを使わないところは元々ポインタを使わないところ。
 使うべきところで使おう。

> 配列で処理しては だめなの?
ところで、ポインタのかわりに配列を使える場面なんて一つも思いつかないんだけど?
>>136
シムシティーをやっていればわかります。

┌──────────配列商業地区───────────┐
│┌───────┐┌───────┐┌───────┐│
││アドレス   ││アドレス   ││アドレス   ││
││ 0x03...0││ 0x03...1││ 0x03...2││
││       ││ "レンタル" ││ "Books"   ││
││ "7&&11" ││ "ぺろぺろ" ││ "忌の國屋" ||
│└───────┘└───────┘└───────┘│
└───────────────────────────┘
┌─Pt住宅地区────┐┌─Pt商業地区────┐┌Pt住宅地区┐
│ アドレス      ││ アドレス      ││アドレス  │
│  0x58...0   ││  0x58...1   ││0x58...1│
│           ││           ││      │
│ "高級住宅地"    ││ "スラム犯罪地区"  ││"中級住宅地"│
└───────────┘└───────────┘└──────┘

上のように建設していた時、
いっそ"スラム犯罪地区"を壊して好きなようにつかえますが、
配列地区の"レンタルショップ ペロペロ屋"を壊しても
その前の区域しか割り当てられず、
しかも同じ配列商業地区としてしかつかえません。

ので、発展させるのがむつかしいです。

...つかれた。
142デフォルトの名無しさん:02/10/14 01:52
>>141
ずれまくっていてよくわからん。出直してこい。
>>141
努力は認める。

実際のところポインタが一番重宝するのはでかい構造体を関数に
渡す場合(実体になるが)と、コンパイラがしてくれなさそうな
最適化を手動でがりがりできることかな。
後者についてはVC++とかは優秀なのでなんともいえんが。
144顔文字板住人:02/10/14 02:30
141じゃないけど修正してみた

┌──────────配列商業地区───────────┐
│┌───────┐┌───────┐┌───────┐│
││アドレス       ││アドレス       ││アドレス       ││
││ 0x03....0    ││ 0x03....1    ││ 0x03....2    ││
││              ││ "レンタル、"  ││ "books."    ││
││ "7&&11"    ││ "ぺろぺろ."  ││ "忌の國屋"   ||
│└───────┘└───────┘└───────┘│
└───────────────────────────┘
┌─ Pt住宅地区 ────┐┌─ Pt商業地区 ────┐┌ Pt住宅地区 ┐
│ アドレス              ││ アドレス              ││アドレス     │
│  0x58....0           ││  0x58....1           ││0x58....1    │
│                      ││                ││            │
│ "高級住宅地"         ││  "スラム犯罪地区"     ││"中級住宅地"│
└───────────┘└───────────┘└──────┘
メインソースで宣言した構造体を他のファイルから参照って可能でしょうか?
---main.h-------------------------
typedef struct {
intIntData;
} TEST;
TEST TestData;
----------------------------------
---main.cpp-----------------------
#include <windows.h>
#include "main.h"
#include "other.h"

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,LPSTR lpsCmdLine, int nCmdShow)
{

//何か処理
return 0;// END
}
----------------------------------
---other.h-------------------------
void TestVoid();

----------------------------------
---other.cpp-----------------------
#include <windows.h>

void TestVoid()
{
//ここでメインヘッダで作成した構造体を参照したい
return;// END
}
----------------------------------
構造体の「型」の定義は使うファイル全部で定義されていおく必要がある。
つまりmain.hを持ってくるか、構造体用のヘッダを新たに作る。
構造体用のヘッダを作って何とかできました。ありがとうございました。m(__)m
---test.h-------------------------
typedef struct {
char  Data;
} TEST;

---main.h-------------------------
なし
---main.cpp-----------------------
#include <windows.h>
#include "main.h"
#include "other.h"
#include "test.h"

TEST TestData;
void TestVoid(TEST*);

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,LPSTR lpsCmdLine, int nCmdShow){
lstrcpy(&TestData.Data,"てすと");
void TestVoid(&TestData);
return 0;// END
}
---other.h-------------------------
なし
---other.cpp-----------------------
#include <windows.h>

void TestVoid(TEST *pTestData){
MessageBox(NULL,&pTestData->Data,"TEST",MB_OK);
return;// END
}
148147:02/10/14 04:19
訂正
---other.cpp-----------------------
#include <windows.h>
#include "test.h"
void TestVoid(TEST *pTestData){
MessageBox(NULL,&pTestData->Data,"TEST",MB_OK);
return;// END
}

上の奴はコンパイルしてないでよく分からないですが、とりあえずこんな感じで来ました。
>>147
main.hないのにincludeしてませんか。
お答えありがとうございました。
いろんな種類のアイテムのデータはひとつの構造体、配列に書くことにして、
処理のとき変化をつけるようにしました。
まずアイテムの種類(HP増減、状態変化など)を調べて、
その種類にあった処理をするという風にです。
全アイテム共通に使用する値段、回数、重さなどは同じ列に書き、
アイテムの種類によって違うものは、
下のように違うもの用の列を作り、そこに書くことにしました。

種類      値段 回数 重さ 効果1      効果2

HP増減    値段 回数 重さ 威力       必殺率
状態変化    値段 回数 重さ 状態の種類    効果ターン数
ステータス増減 値段 回数 重さ ステータスの種類 増減率
151デフォルトの名無しさん:02/10/14 10:06
ちょっと質問

long data[20][13];

というローカル変数があり、この変数を別の関数に渡す際の書式なんですが、

渡し先関数 void func( long * ); で

1: &data[0]
2: &data[0][0]
3: data

この3つの記述は、全て同じ意味になるって先輩がいっていたのですが、
本当ですか? 僕は2のように書けと学校で習っていたのですが・・・
152デフォルトの名無しさん:02/10/14 10:09
>>151
void func(long (*)[13]);じゃないの?
153152:02/10/14 10:10
long *だと渡せるのは2番だけだな。
>>151
さっさとその先輩のことは忘れて他の先輩に付いてください
155デフォルトの名無しさん:02/10/14 10:27
151の救いはプロのプログラマーってわけじゃなくて、趣味でやっているってことだね。
>>151
ソース上での意味は違うけど、結局はほとんどの処理系で
どれも同じになるんじゃないの?
(キャストしないと警告は出るだろうけど)
>>155
脳内にお告げでもあったのですか?
158151:02/10/14 12:14
>>152=153
いや、関数の大元は別会社から指定されてて・・つまりライブラリね。
void func( long * ); 、long型のポインタで与えてくださいって言われています。

で、2番しか渡せないはずなのだが先輩曰く

「どちらもアドレスの先頭を渡すことになるだろ。
 data という変数の [0] 個目、 & でアドレス渡しだ。
 だから、&data[0] は data[0][0] のアドレスを渡す、という意味になるから
 &data[0] も &data[0][0] も同じ意味だ。確かにお前の &data[0][0] のほうが見る者にとっては
 親切な書式になるが、結果は同じだから特に気にすることはない。
 あと、C言語では 配列数を省略してかくとポインタになるのは知っているだろ?
 だから、data[0][0] を data だけで書いても、コンパイル結果はまったく同じになる。
 どうでもいいような知識かもしれないけど、知っておいて損はないぞ。」

という話なんですね。1の場合、確かに意味的には通りそうなんだけど、C言語の基本から考えると
違うような。1の場合、いったいどういった情報が渡っているのでしょうか?

>>154
今のプロジェクト、その先輩と同期3名だけなんです・・・

>>155
思い切り仕事です・・・
159デフォルトの名無しさん:02/10/14 12:15
ちょっと質問だけど関数ポインタで

struct st1{
int n
void (*func)(int n);
}ST1;

void func1(int n) {
.
.
return;
}

void func2(int n) {
ST1 st;

st.func = func1;
(func)(n);
return;
}

こういうのってありですか?
160デフォルトの名無しさん:02/10/14 12:48
>>159
(func)(n)のfuncはどこからもってきたんだ?
st.func(n)や(*st.func)(n)ならわかるが。
161デフォルトの名無しさん:02/10/14 12:54
>>158
data = &data[0] = &data[0][0] だ。
いずれにせよ、関数に渡るのはアドレスだけ。それ以上の情報は渡らない。

二次元配列を渡すときに 配列名だけを渡すのはそんなにおかしくは無いと思う。
>>158
long data[20][13];
long *p = &data[0][0]; // OK
long *q = data[0]; // OK
long *r = data; // 文法上ダメ。意味的にはOK
long *s = &data[0]; // 文法上ダメ。「data」と同じ。
data[0][0] = 123456789;
printf ("data[0][0]=%d *p=%d *q=%d *r=%d *s=%d\n", data[0][0], *p, *q, *r, *s);
163デフォルトの名無しさん:02/10/14 13:06
>>160
ああそっか。関数ポインタって言っても構造体のメンバだもんね。
ちなみに159のは構造体の定義をtypedefしている物として読んでください。
そしてまた新たな質問なんだけど(*st.func)(n)
ってのはどういう意味になるのですか?
メンバにセットしたアドレスの実態を現しているのですか?
>>158
二次元配列のサイズを変える気がないなら、
ちゃんと引数の型を適合させて long (*)[13] にすればいいし、
一次元配列に解釈しなおして渡すなら、
ちゃんと (long *)data とキャストすればいい。
165デフォルトの名無しさん:02/10/14 13:14
getopt()ってLinuxとかUnix特有の関数ですか?
標準関数ではないですよね?
>>163
st.func(n)と同じ。
>>165に便乗質問。

色んなソース見てると、大抵自作のgetopt.cが入ってるんだけど、何故?
>>165
google

>>167
標準関数ではない=他の環境でもコンパイル出来るように。
既存の(標準的な動作をする)実装とは違う動作を求めていたので。
glibcの実装がメジャーどころだけど、GPLは嫌なので。

思い当たるのはこんなところです。
169デフォルトの名無しさん:02/10/14 14:29
だれかたすけて・・・
#if defined(WIN32)
#include <windows.h>
#endif

#include <stdlib.h>/* @@@@ */

typedef struct _node Node;
int i=0;
/* セルの構造体 */
struct _node {
Node *next; /* 次の要素へのポインタ */
int value; /* 値 */
};

/*
セルの挿入関数
*/
void insert( Node *header, int a )
{
Node *p, *q, *new;

/* リストの最後のノードまで移動する */
p = header->next;
q = header;

170デフォルトの名無しさん:02/10/14 14:31
>>169
ハァ?
171デフォルトの名無しさん:02/10/14 14:33
void delete(Node *header ,int b)
{
Node *p ,*q;
p=header->next;

while ( p != NULL )
{
printf(":%d:",b);
printf("[%d]",p->value);
if (p->value==b)
{
header->next=p->next;

free(p);
//p の領域の解放;
printf("/%d/",b);
return;
}
p = p->next;
}
return;
}
172デフォルトの名無しさん:02/10/14 14:34
線形リストの
delete関数なんですけど
うまくいきません
どこがちがうのでしょう??
何をしたいのか、まず、図にしてみる。
バカに何を言っても
ムダ
175通りすがりの仕事中:02/10/14 15:23
>>169
ツッコミどころがイパーイあります。
176デフォルトの名無しさん:02/10/14 15:28
これは無視してください
177デフォルトの名無しさん:02/10/14 15:50
コードは読んでないけど、
ちゃんと「消したいノードの直前のノード」のポインタは保持してる?
>> 実は穴があくほどソースを読んだ、に1000clock
179177:02/10/14 16:07
>>178
よんでねぇっす。
つーか、listのdelete操作でのはまりポイントってそこしかないでしょ。

せめてインデントしてあれば、読んだんだがな。
180デフォルトの名無しさん:02/10/14 16:09
そうですたぶんそれです。
けしたノードのまえのノードが消えてるような気がするんです。
181デフォルトの名無しさん:02/10/14 16:11
std::list使え

182デフォルトの名無しさん:02/10/14 16:11
でも具体的に何をすればいいか・・・
183デフォルトの名無しさん:02/10/14 16:14
std::listですね
boost::graph使え
>header->next=p->next;
最初のほう全部消えないか?
186デフォルトの名無しさん:02/10/14 16:31
きえちゃいます。。。
187デフォルトの名無しさん:02/10/14 16:33
動作的にはvalueがbになるノードを一つ消したいの?
188デフォルトの名無しさん:02/10/14 16:34
そうです!!!
189デフォルトの名無しさん:02/10/14 16:35
わかった。今から書いてみる。
もう下らんバグを作れなくていいようにこつを教えてあげるよ。

君の目の前に君よりさらにできの悪いやつがいると思いなよ。
そいつに対して君のコードを1行1行何をどうしてどうやってるのか説明してやるんだ、
すんなり説明できなきゃそのコードはどこかおかしい。

# しかし、すんなり説明できないコードを書いてる時点でどこか頭おかしいんだが。
191デフォルトの名無しさん:02/10/14 16:38
わかりました。。
192デフォルトの名無しさん:02/10/14 16:42
こうかな。でもp=header->next;っておかしくない?
void delete(Node *header ,int b)
{
Node *p ,*q;
p=header->next;

while ( p != NULL )
{
printf(":%d:",b);
printf("[%d]",p->value);
q = p->next;
if (q != NULL && q->value==b)
{
p->next=p->next;

free(p);
//p の領域の解放;
printf("/%d/",b);
return;
}
p = p->next;
}
return;
}
p->next=p->next;は
p->next=q->next;で。
free(p);も
free(q);で。
195デフォルトの名無しさん:02/10/14 16:45
わかりました
ためしてみます。
196デフォルトの名無しさん:02/10/14 16:49
できました!!!!!

197デフォルトの名無しさん:02/10/14 16:50
ほんとにありがとうございます!!!

あのお聞きしたいのですが
あなたはプログラム暦
何年ぐらいなんですか??
ほんとに192でいいの?
一番目と2番目のノード消せる?
199デフォルトの名無しさん:02/10/14 16:58
はいこれで良いです。
valueがbのノードだけが消えているので
問題はありません。
あとp=headerでもよかったみたいです。
200通りすがりの仕事中:02/10/14 17:00
>>169
void delete(
Node **header, // ポインターのポインター!!(純カラになったときのため)
int b)
{
Node *p ,*q,
Node *nxtcel = NULL; // pの次のセル
Node *prvcel = NULL; // pの前に存在するセル
while ( p != NULL ) {
printf(":%d:",b);
printf("[%d]",p->value);

nxtcel = p->next; // 消去する前に次のセルをセット!!!

if( p->value == b ) {
if( p == *header ) { // 消したいセルが一番先頭のときの処理
*header = (*header)->next;
} else if( p->next == NULL ) { // 消したいセルが一番最後のときの処理
prvcel->next = NULL;
} else { // 中間のセル
prvcel->next = p->next;
}
free(p);
printf("/%d/",b); //p の領域の解放;
return;
}
prvcel = p;
p = p->next;
}
return;
}
201通りすがりの仕事中:02/10/14 17:03
んがっ!前のスペースが消えてもぉたー
202デフォルトの名無しさん:02/10/14 17:03
おおすごい
リスト処理か。何度書いたことだろう。。
204デフォルトの名無しさん:02/10/14 17:07
すごいです。
2chの人たちは。。。
ちょっと感動しました・・・
205通りすがりの仕事中:02/10/14 17:12
スレを汚してスンマソ、こっちでヨロ
void delete(
Node **header, // ポインターのポインター!!(純カラになったときのため)
int b )// 消したいナンバー
{
 Node *p;
 Node *nxtcel = NULL;// pの次のセル
 Node *prvcel = NULL;// pの前に存在するセル
 
 for( p = *header; p != NULL; p = nxtcel) {
  printf(":%d:",b);
  printf("[%d]",p->value);
  nxtcel = p->next; // 消去する前に次のセルをセット!!!

  if( p->value == b ) {
   if( p == *header ) { // 消したいセルが一番先頭のときの処理
    *header = (*header)->next;
   } else if( p->next == NULL ) { // 消したいセルが一番最後のときの処理
    prvcel->next = NULL;
   } else { // 中間のセル
prvcel->next = p->next;
 }

   free(p);
   printf("/%d/",b); //p の領域の解放;
   return;
  }
  prvcel = p;
}
 return;
}
206デフォルトの名無しさん:02/10/14 17:14
>>204
それは馬鹿にしているとしか思えない発言なのだが。

タテマエ:すごいです。
ホンネ:こんな誰でもわかることよく自慢げにかけるよな。
207デフォルトの名無しさん:02/10/14 17:16
・・・
そういうつもりでかいたわけじゃないのですが・・・
まあここ2ちゃんだし
素直じゃないね
>>206
ひねくれ屋さんだな。

素直に「お前の技術が低いだけだよ、2ちゃんだからじゃないんだよ」
と教育してやれよ
211デフォルトの名無しさん:02/10/14 18:54
あのー
ポインタに浮動小数点の値を持たせることはできるのですか?
212デフォルトの名無しさん:02/10/14 18:57
double x;
double *y;
y = &x;
ってことか?
>>211
もしかして 0.25 番目のアドレスを保持したいとかですか?
214デフォルトの名無しさん:02/10/14 19:20
そうじゃなくて
配列をポインタで実現したときに
小数を持たせることができるかということなんですが。
>>214
ネタは下げてくれ
ネタじゃないなら自分以外にもわかる言葉でお願い
>>214
意味不明だが、できないと言っておく
>>214
こうですね?
unsigned int a[2] = { 0, 0xFFFFFFFF }; /* int は 32bit と仮定する */
unsigned int b = *(a+0.5); /* b = 0xFFFF0000 のはず!! */
218デフォルトの名無しさん:02/10/14 19:37
ポインタに小数を足せるのか・・・・


いつの間にクッキー強制になったんだ。うぜーーー!!
質問です
int main(void)
{
int x = 10;
funcA(&x);
return 0;
}

void funcA(const int *a) //この関数では*aは変更しない、ということをconstで示したい
{
funcB((int *)a); //funcB()では変更するのでキャスト
}

vod funcB(int *b);
{
*b = 20;
}

というconstの使い方はアリですか?
220デフォルトの名無しさん:02/10/14 19:46
scanfで読みこんだ数字を大きい順に並び替えたりするのって
どうやればいいですか?
>>219
漏れ的にはダメ

>>220
配列に格納してソート
宿題なら宿題スレがあるけど。
223デフォルトの名無しさん:02/10/14 19:47
>>219
なんのためのconstだよ。

>>220
配列にいれてqsortライブラリ関数
>>219
全然駄目じゃん

> void funcA(const int *a) //この関数では*aは変更しない、ということをconstで示したい

とかいいながら

> funcB((int *)a); //funcB()では変更するのでキャスト

変更してるし・・・
225デフォルトの名無しさん:02/10/14 19:48
ソートソート!!

ソートソート!!
226220:02/10/14 19:48
>>221
その配列に格納するって言うのがわからないのですが。。
>>226

int array[5];

scanf("%d",array);
中略
scanf("%d",array+4);
228220:02/10/14 19:52
なるほど。a[20]とかは使ってましたが、ソートなんてのがあるのは
知りませんでした。ちょっと調べてきます。
C/C++の宿題なら俺にやらせろ!

http://pc3.2ch.net/test/read.cgi/tech/1021862587/l50
>>228
何か、ソートについて勘違いしてないか?
線形リストの操作は大学の1年生のときにやった。
プログラムなんて全く知らない奴らも理解できたくらいだから、
>>197の質問は「3ヶ月以上なら大抵出来る」だろ。
大学じゃなくても専門ドキュソの俺でもわかる。
大学どころか専門でもない俺でもわかる。
234manko_chinko ◆GLc2rpKRNM :02/10/14 20:13
中学生の俺でもわかる
235デフォルトの名無しさん:02/10/14 20:56
猫である我輩でもわかる
小学生のときに自力で実装した。
1の母ですが分かります。
自作して使ってたがこれが線形リストと呼ばれる代物だと
知ったのはつい最近のこと。高卒ですから。
239デフォルトの名無しさん:02/10/14 21:58
>>238
それを車輪の再発明と言う。
240デフォルトの名無しさん:02/10/14 21:58
再開発だろ。
>>238
よくあるよね。これ名前ついてるじゃん!とか言うの。

まぁ、名前知ってても実装できないライブラリ厨はいくらでもいるんで心配しなくてもいいかと。
むしろ、プログラムを作るという面ではあなたの方が強いと思われ。
242238:02/10/14 22:10
>>239
車輪の再発明という言葉を知ったのも
つい最近のことだったりする。
リストなんて再発明も何もかなり基本的な構造じゃん
たとえ名前知らなくても何気なく使うもんだと
>>243
逆に配列の限界に気づかないでPGやってる奴とかって恐ろしいな・・・
245238:02/10/14 22:16
>>241
ありがとう。

> よくあるよね。これ名前ついてるじゃん!とか言うの。
そうそう。たとえば文字列の比較など、ごく単純なものでも
立派なアルゴリズムの名前がついてるのを知って
ビックリした覚えがある。
> これ名前ついてるじゃん!
あるある。みんな経験あるんだな。
247220:02/10/14 22:36
220ですが
int a[10];
int i,j,k,m,l;

for(i=0;i<10;i++){
printf("a[%d]=",i);
scanf("%d",&a[i]);
}

for(j=0;j<10;j++){
for(k=j;k<10;k++){
m=a[j]-a[k];
if(m<0){
l=a[k];
a[k]=a[j];
a[j]=l;
}
}
}
みなさんのいっているソートっていうのは、
こーゆーのを、勝手にやってくれる言語があるっていうことですか?
>>247
勝手にと言うか結局はそう言う個としてると思われ。
単に誰かが汎用的に使えるように関数化なりクラス化なりしてくれてるだけで。
249デフォルトの名無しさん:02/10/14 22:37
>>247
言語じゃなくて関数(^_^;)
stdlib.hにqsortってのがあるでしょ。
あっても使いこなせない罠。
比較用の関数作んなきゃいけないし。
>>247
バブルソートか。
>>247
ちなみに、
ある一定の規則に従って、
並べ替えることをソートという
>>251
多分違うと思う。
隣のものと比べていないし、for文も変。
>>247
for(j=0;j<9;j++){
for(k=j+1;k<10;k++){
が普通じゃないか?
>>253
よく見ると恐ろしい動きをしていそうだ・・・。
2 1 4 3

1 2 4 3

1 2 4 3

1 2 4 3

あ、無限ループ
>>256
ちがうだろ

2 1 4 3

1 2 4 3

1 2 4 3

1 2 3 4


できるじゃん。なんだかんだで。
>>257
ソート済みのところと自分自身との比較が入るから無駄が多いだけか。
259デフォルトの名無しさん:02/10/14 22:52
>>247
データを並び替え作業をソートという。
で、そのやり方(=アルゴリズム)にはいろいろあって、バブルソートとか
クィックソートとかいう名前がついている。

さらに、適切なパラメタを渡せば自分で面倒なコード書か無くてもソート
してくれるライブラリ関数がある(代表的なのはqsort)。
260デフォルトの名無しさん:02/10/14 22:52
なんというか、、

m=a[j]-a[k];
if(m<0){

これが斬新だ・・・学校でCASLIIやらされたときはこんな感じだったが。
261デフォルトの名無しさん:02/10/14 22:54
if (a[j] < a[k]) {
だろうな。オーバーフローおこしかねんし。
262220:02/10/14 22:54
もはや、わけわからん。やめたい
250のいってる比較用関数っていうのはなんですか?
質問ばっかですいません。
宿題スレでやってもらってもいいんですが、
人にやってもらうと、結局どこかで行き詰ると思うんで。。
>>260
その局面では使わんけどたまにやってる気がするわ。その方法。
264デフォルトの名無しさん:02/10/14 22:56
>>262
qsort関数について調べてみればわかるが、qsortはどんな型でも扱えるように、
関数側ではどうしようもできない比較部分だけは、関数を使う側に用意させるの。
>>262
それがわからんなら毎回自力でソート書くのでいいとおもう。
ライブラリ関数なんてわかるようになったら使えばいいんだよ。
266デフォルトの名無しさん:02/10/14 22:57
ソートの宿題で qsort使うのもどうかと。
>>262
プログラミング基礎かなんかの宿題か。

簡単に言えば、


ある配列で一番小さい要素を探す。

それを別の配列の最後尾に書き出す。

ある配列の一番小さい要素を65535など安全で大きな数字に置き換える


とかでもいいと思われ。
>>264
関数ポインタでも要求するの?
269デフォルトの名無しさん:02/10/14 22:59
>>268
そこまで知っていてなぜソートも知らない。
270220:02/10/14 22:59
>260
それは、頭で考えたのをばーっと書いただけなんで、
普通は後で直します。。
いまはとりあえず、見てもらおうかなと思っただけです。。
271269:02/10/14 23:00
人が違ったようだ。ごめん。
>>268
そう。
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare)(const void *elem1, const void *elem2) );
↑はMSDNライブラリより・・・

273220:02/10/14 23:04
1 4 3 4 2とか適当な数字を
2 4 3 4 1みたいに書き換える関数もあります?もしかして。。
その関数があるとすると、宿題の意図がソートを使えるようにさせる
ところにありそうなんで、頑張っておぼえようとおもうのですが。。
>>273
かき回すの?
標準関数にはないけど、標準関数のrandを使えば比較的簡単にできそう。
>>273
わけわかんね
最初と最後を入れ替えんの?
んなもん関数にするバカいねぇよ
逆にならべるってこと?
>>274-275
スワップのことじゃない?

>>273
スワップの関数はなかったと思う。
278220:02/10/14 23:09
>274
かきまわすってどういう意味で?
一番最初と最後を入れ替えて。。っていう関数はありますか?
という意味なのですが。。
220はネタだろ。
わざとわかりにくい表現してるとしか思えん。
かき回すとか入れ替えるとか逆にするとかいくらでも言いようはあるだろうに
わざわざあんな書き方するか?ふつう。
ないよ。汎用性ないし
>>278
ないよ。自分で作っても簡単でしょ。
282デフォルトの名無しさん:02/10/14 23:10
>>278
型が決まっているなら関数にするまでもないでしょ(^_^;)
283220:02/10/14 23:11
じゃ、自分で作ります。
ありがとうございました。
どういたしまして
ユアウェルカム!
ノッタットール
ノラロー

よっしゃ、聞け!
289デフォルトの名無しさん:02/10/14 23:20
>>288
みてーぎでもいいですか?
void swap(void *a,void *b)

あってもおかしくないよなぁ。と一瞬思った。
まぁ、バグのスクツだけど。
291デフォルトの名無しさん:02/10/14 23:24
>>290
要素一つ分のサイズも渡さないと。
>>289
ガイシュツでなければドンと来い!
293厨房:02/10/14 23:29
memcmpって二つの配列が同じかどうかを判断することくらいにしか使えないね。
>>293
メモリマップドIOの場合・・・やめとこ。
>>293
いったいmemcmpに何を望んでるっすか
296厨房:02/10/14 23:36
>>295
なんかこう、グレートなこと。
なにか、こう、うっとりするようなことを期待してます。
298デフォルトの名無しさん:02/10/14 23:48
誰かstrlenをつくってください。
>>298

char *a = arg;

int i = 0;

while(a != \0)
{
i++;
a++;
}

return i;
>>299
*a != \0な
>>299
strlenの戻り値はsize_tですYO!
>>301
じゃあunsigned long iで。
俺ならこうかな。
size_t strlen(const char *str)
{
  const char *p = str;
  while(*p) p++;
  return p - str;
}
>>298
char *p = arg;
while (*p) p++;
return p - arg;
>>303
なる、配列のアドレスが連続していることを利用するのね。なるほど。
でも、wcharとかには応用できないね。と絡んでみる。
>>303
ケコーンを前提に(;´Д`)ハァハァ
さて、久しぶりにNULL == 0論争を始めようかw
>>305
何故そう思うのか小一時間問いつめてよいですか?
>>305
> でも、wcharとかには応用できないね。と絡んでみる。
なんで?
const char* を const wchar_t* に変えるだけだよ。
310デフォルトの名無しさん:02/10/15 00:00
void *v派です。void* vはなんか変です。
>>309
2バイトとかだと2倍された数字が帰ってこないの?
char=1Byteだから成立するんでは?
>>310
俺のチンコの定位置はちょっと右よりなので...
pascal文字列なら、

length = string[0];
314デフォルトの名無しさん:02/10/15 00:04
>>313
もしかして文字列の最大長は255文字だったりする?
>>314
Delphiでは短い文字列と呼ばれています。
>>311
end-start
はstartからendまでの要素数を返すよ
要素1つ1つのサイズがいくつでも
>>311
文字数を返すという前提で。
ちなみにポインタでなく添字をインクリメントする場合でも
同じことでしょ。
318デフォルトの名無しさん:02/10/15 00:05
void *void = (void*)aaa;

aaaはある文字列の配列の先頭です。エラーが出るのですが原因がわかりません。
>>314
お前何もわかっちゃいないな。そこで言うべきセリフは

 D e l 厨 逝 っ て よ し

だろ
予約語では?
321317:02/10/15 00:07
あ、311は要素数でなくバイト数が返ってくる
と誤解してるわけね。
>>319
ぶぶー。
マカーっす。
>>318

voidって予約語だし(^_^;)
ところで、void *にいれるならキャストは必要ないでしょ?

  マ カ ー 逝 っ て よ し
ああ、そっか、ポインタ同士の減算か。理解しました。ご迷惑おかけしました。
326318:02/10/15 00:10
>>323
ああ、気づかなかった。勢いで変数名までvoidにしてました。
すみません。
>>326
そういう間違いで、半日以上エラーが取れなかったりすることあるんだよな。
下手すりゃ3日。
この手の、エラーじゃないが、間違いやすい表現を検出する仕組みがあると
いいのになあ、と時々思う
フォーマットにうるさく口出してくるコンパイラもおもしろいなー
字下げしろゴルァ! 演算子と演算子の間に空白を入れろ見にくいだろヴォケ! ってな感じに。
330329:02/10/15 00:21
演算子と演算子の間じゃないな。まあいいか。
331デフォルトの名無しさん:02/10/15 00:21
>>329
FORTRAN
>>329
でもコンパイル時に文句付けるなら
入力時に自動整形しろよゴルァ!
って感じ。
333332:02/10/15 00:23
あ、普通のエディタ使ってたら無理だな。
>>332
ああ、エディタにそういう機能をつけた方がいいか。
>>329
そりはオートフォーマッタにかければいいわけで・・・

変数名に統一性がないとか、代入した変数が一度も使われてないとか、
ほかの関数ではreturnの値がintなのにこれだけvoidだとか、
ローカル変数がグローバル変数を覆い隠してるとか、
そういう指摘をしてくれるのがホスィ
最適化したつもりでいたら
つっこんでくるコンパイラ。
俺ならこう書くけどな。とサンプルコードを示してくれるコンパイラとか・・・
338デフォルトの名無しさん:02/10/15 00:40
test.c
#include <stdio.h>
int main(void)
{
  printf("Hello C World!\n");return 0;
}

コンパイル中・・・
エラー:test.c こんなプログラムで俺を呼び出すんじゃね-よボケ
ここに、半角スペースつけたいなら[& n b s p ;]の[]内の文字を空白を入れずに書く。
そうすればそれで半角一個分になる。ここ=掲示版のことね。

よし、何でも聞け!
341デフォルトの名無しさん:02/10/15 00:50
size_t って何ですか?
眠れないのですが、どうしたらいいですか?
343デフォルトの名無しさん:02/10/15 00:52
>>342
羊をint限界まで数える。
344342:02/10/15 00:53
intって、何ビットのintですか!!??
64ビットなんて言わないでよ!
345デフォルトの名無しさん:02/10/15 00:54
>>344
8bitでいいよ
>>344
環境依存。もまえのノウミソの(略
だめです。めんどうなのでPCに任せたんですが一瞬で数え終わってしまいました。
>>341
まずは入門書を読め
349デフォルトの名無しさん:02/10/15 00:57
>>348
読んだけど書いてない
ああ、小室とダウンタウンの浜田がやってた奴だろ
>>342
無理に眠らずに起きとけ。いつかは眠れる。
何でも聞けとは言っても 「C言語のことなら」何でも聞け。
>>350 それは(以下略
t、しかあってないじゃん
354デフォルトの名無しさん:02/10/15 01:02
なんでdiv_tはtypedefしているのにstruct tmはtypedefしていないの?
>>349
オブジェクトの大きさを表すための型。
stddef.hを見てみろ。
実際はunsigned int とか unsigned long とかになってるはずだ。
356再帰???:02/10/15 01:15
今、二分探索のプログラムを再帰で書こうとしている
んですが、どうしても上手くいきません。再帰を使わず
にはできたのですが・・・。 教えてください。
(再帰を使わない二分探索)
#include <stdio.h>
int binsearch(int x,int v[],int n){
int p,q,m;
p=0;
q=n-1;
while(p<=q){
m = (p+q)/2;
if(x<v[m])
q=m-1;
else if(x>v[m])
p=m+1;
else return m+1;}
return -1;}
main(){
int i,l,m;
int data[20];
int bin;
printf("input l >"); /* 配列の長さ */
scanf("%d",&l);
for(i = 0;i<l;i++){ /* データの入力 */
printf("data[%d] =",i+1);
scanf("%d",&data[i]);}
printf("input m >"); /* 探索キー */
scanf("%d",&m);
bin = binsearch(m,data,l);
printf("answer is data[%d].\n",bin);}
357再帰???:02/10/15 01:17
whileのところを再帰を使ってみたのですが・・・。

int binsearch(int x,int v[],int n){
int m;
int p=0;
int q=n-1;
if(p>q)
return -1;
m = (p+q)/2;
if(x<v[m])
binsearch(x,v[m],q);
else if(x>v[m])
binsearch(x,v[m],q);
else return m+1;}
358デフォルトの名無しさん:02/10/15 01:22
int binsearch(int x,int v[],int n){
int p,q,m;
p=0;
q=n-1;
while(p<=q){
m = (p+q)/2;
if(x<v[m])
return binsearch(x, v, m-1);
else if(x>v[m])
return binsearch(x, v+m+1, n-m-1)+m+1;
else return m+1;}
return -1;}
二分探索ってバイナリサーチだよね?再帰なんて使うまでもないと思うけど。

↓昔書いた二分探索。われながら汚い・・・
void *bsearch(const void *key,const void *base,size_t nmemb,size_t size,int (*compar)(const void *,const void *))
{
const unsigned char *left,*middle,*right;
int result;

left=(const unsigned char *)base;
right=left+(nmemb*size-size);

while(left<=right){
middle=left+((right-left)/size/2*size);
result=(*compar)(key,middle);
if(result==0)
return (void *)key;
else if(result<0)
right=middle-size;
else
left=middle+size;
}

return NULL;
}
360再帰???:02/10/15 01:25
>358さん

while(ループ)を使わずに書きたいのですが、すみません、書き忘れていました。
>>360
forに書き換えろ
362デフォルトの名無しさん:02/10/15 01:28
int binsearch(int x,int v[],int n){
int p,q,m;
p=0;
q=n-1;
if (p>q)return -1;
m = (p+q)/2;
if(x<v[m])
return binsearch(x, v, m-1);
else if(x>v[m])
return binsearch(x, v+m+1, n-m-1)+m+1;
else return m+1;}
363再帰???:02/10/15 01:29
>359

そういう風に課題が指定しているもので・・・。 ループを使わず再帰を使えと。
364デフォルトの名無しさん:02/10/15 01:29
>>360
しかしなんでどうしても再帰を使いたいの?
365364:02/10/15 01:30
課題か・・・
再帰ならクイックソートでも出してあげればいいのに。
すれ違い。スレ違いでなく。
367再帰???:02/10/15 01:31
>362さん

ありがとうございます。 解析してみます。
368デフォルトの名無しさん:02/10/15 01:32
int binsearch(int x, int v[], int n) {
int *m = (v+n-1)/2;
if (n < 0) return -1;
if (x < *m) return binsearch(x, v, v-m);
else if (x > *m) return binsearch(x, m+1, v-m-1);
else return v-m+1;
}
二分木探索なら再帰使うとうまくかけるんだけどな。
int binsearch(int x,int v[],int n){
int m = (n-1)/2;
if (n < 1)return -1;
if(x<v[m]) return binsearch(x, v, m-1);
else if(x==v[m]) return m+1;
else { int y = binsearch(x, &v[m+1], n-m-1);
if (y == -1) return -1;
else return m+1+y;
}}
371初心:02/10/15 02:22
double **a,*b;
b=new double [n*n];
a=new double *[n];
for(i=0;i<n;i++) a[i]=&b[i*n];

こんなふーに多次元配列を作っているのですが
どんな感じで解放したらいいですか?

372342:02/10/15 02:25
>>346
512ビットなので、未だ数え終わりまそん・・・・
int binsearch( int *v, int f, int l, int r)
{
if( l < r ) { int m = (l + r) / 2;
if( v[m] < f ) return binsearch( v, f, l, m);
else return binsearch( v, f, m+1, r);
} else {
if( v[l] == f ) return l; else return -1;
}
}
>371
c++ならstd::vectorでもツカッテロ
37619さん:02/10/15 03:39
int func(double **a,double * b,int n)
{
  if(n >= 1)
    return false;

  b=new double [n*n];
  a=new double *[n];
  for(i=0;i<n;i++) a[i]=&b[i*n];
  
  retrun true;
}

free(b);
free(a);
377376:02/10/15 03:42
>>376
>if(n >= 1) は、if(n > 1) でした。
ちなみに >>371でした。
newにfree?
37919さん:02/10/15 03:51
>>376
>new は、malloc(sizeof(double) * ...); でした。
380デフォルトの名無しさん:02/10/15 07:59
>>375
あほだとしか思えん。
クイックソートみたいに分割した両方を処理するならわかるけど、片方しか処理しない
二分探索でなんで再帰呼び出しを使うんだろう(>>356みたいに課題は除く)。

もしかして再帰呼び出しを使うのが一般的なの?俺はいつもループを使っているけど。
381デフォルトの名無しさん:02/10/15 08:04
Linux環境で、自プログラムが消費している(使用している)
メモリ量を取得できる関数なんてものはありませんか?
>>381
関数は知らんが、/proc/[プロセス番号]にあるファイルに、そのプロセスに関する情報が入ってる。
もし調べるとしたらそこだろうな。
カーネル付属のドキュメントか何かに/proc以下のファイルについてのFAQがあったと思うから調べてみたら?
JM Projectのページに和訳もあったと思う。

外してたらすまそ。
383382:02/10/15 11:33
s/JM/JF/
384デフォルトの名無しさん:02/10/15 13:27
>>341
>>349

> size_t って何ですか?

もう答えは >>355 が「オブジェクトの大きさを表すための型」とずばり答え
ちゃってるけど、使用例としての補足。
なんでわざわざ size_t なんてもんがあるかというと、これはsizeof演算子の
演算結果を意味するから。
逆を言えば、関数定義に size_t が書かれている場合はsizeof演算子を使って
オブジェクトのサイズを渡すべしってことになる。
たとえば void *memcpy( void *dest, const void *src, size_t count );
ならこんな感じ

char Buf1[256];
char Buf2[256];

/* Buf1の内容をBuf2に丸コピー */
memcpy( Buf2 , Buf1 , sizeof(Buf1) );
385デフォルトの名無しさん:02/10/15 14:45
while ( fgets ( str,256,fp ) != NULL ) {
printf ( "%s",str );
とやるとfgetsのせいで復改も読みこんでしまいますよね?
その復改文字だけはずして出力したいのですが
どうすればよろしいのでしょうか?
>>385
読み込んだ文字列の最後が改行だったらそれを'\0'で上書きすればいい。
387385:02/10/15 15:10
>>386サソ

アリがdございます。

ただファイルから読みこむのが毎行
文字数が異なるんです。
その場合固定文字数で上書きできないのが
コマールっていうかワカリマセソ・・・ヽ(`Д´)ノ
>>387
strlenあたりで文字数求めればいいだけでは?
389デフォルトの名無しさん:02/10/15 15:17
これって本当か?

↓ ↓ ↓
http://www.dream-express-web.com/space-trust.htm
>>387
len = strlen(str);
if (len && str[len - 1] == '\n') {
 str[len - 1] = '\0';
}
>>387
/* perlのchompもどき */
void chomp(char *s)
{
  char *p = strrchr(s, '\n');
  if(p != NULL)
    *p = '\0';
}
文字数えて最後の文字調べればよろし。
こんなかんじ。

void chomp(char *str)
{
 int len;
 if (str && ((len = strlen(str)) >= 1)) {
  if (str[len-1] == `\n`)
   str[len] = `\0`;
 }
}

あと、君のsourceだと一行256以上だと破綻するってのは判ってるよね?
393392:02/10/15 15:25
うひ。かぶりまくっとる(藁

文字列長が0だとスタック壊すよ >>390
>>393
ちゃんとlenのチェック入ってるよ
>>392
おい、それだと末尾の'\n'が消えないぞ(w

str[len] = `\0`; /* × */
str[len - 1] = `\0`; /* ○ */

な。
>>389
内容云々以前にそんな見にくいページデザインじゃ問題外だな
397390 じゃないけど。:02/10/15 15:35
>>393
> 文字列長が0だとスタック壊すよ >>390

なんで ?
>>396
踏んじゃったのね
ご愁傷様

いいかげんdream-express見飽きた・・・
399385:02/10/15 15:44
ミナサソ

ホントアリガdゴザイマス
カンドウシマスタ
精進シマス
400390だけど:02/10/15 15:45
>>397
文字列長(len)が0だと、
str[len - 1]というのは、str[-1]ということになる。

そこに書いたらスタック(かどうかはしらん。ヒープかもしらんし)の
変な領域に書いてしまうことになるから。
>>398
踏んじゃいました
これで直るWindows98の不安定とかいうサイトと同じものが流れてる気がしました
402397:02/10/15 16:41
>>400
if (len && str[len - 1] == '\n') {
  ^^^^^^^
>>402
400 名前:390だけど
~~~~~~~~~~~~~~~~~~
while (fgets(buf, sizeof(buf), stdin)) {
int len = strlen(buf)-1;
if (buf[len] == '\n')
buf[len] = '\0';

printf("%s", buf);
}
bufのサイズが2以上ならfgetsが文字をちゃんといれるので
この程度でいいんじゃない。
ん? 結局、390のコードは文字列長が0であっても
問題なしということでよろしいか。
よいでつよ
407390だけど:02/10/15 18:39
>>402
なんか今ごろなにを問うてたかわかった(w

「390でlenのチェックしてるにもかかわらず、
なぜ文字列長が0だと変なところが壊れるのだ」
と393に問うてたわけだ。

すまんすまん。飴やるから許してくれ。

>>403
というわけでボケてたのはおれ。
408デフォルトの名無しさん:02/10/15 18:42
aho.c
 int a[100];

baka.c
 extern int a[];    ←これと
 extern int a[100];  ←これって

違うんですか?
コンパイル後のバイナリは一緒なんですが...
何か使い分けなければならない場合があるとか?
>>408
違わん。というか外部変数の配列の大きさは無視される。
二次元以上だと行の数が無視される。
410408:02/10/15 18:54
>>409 なるほど。どもでした。
>>409
コンパイル後だと違わんかもしらん。
だが、コンパイル時にsizeofがとれるかとれないかの違いはある。

extern int a[];

と宣言したときにはsizeofがとれない(あたりまえ)。
gccでは

arrsize.c:6: sizeof applied to an incomplete type

といわれてコンパイルエラーになった。
>>392
1 行 256 バイト以上でどのように破綻するのかわからんから教えてくれ。
256 バイトとしか取ってないバッファで gets() を呼ぶならわかるが。
413 :02/10/15 22:22
mysqlへの繋ぎ方、誰か教えてくれませんか。
Borland C++Compilerで。
どうしてもリンクエラーがでる。
>>413
まず、何をやってどういうエラーがでたか書けよ。
>>414
mysqlに繋ごうとしてリンクエラーがでました。
416413:02/10/15 22:33
>>414
プログラムを作成して、コンパイルしました。
そうしたらリンクエラーがでました。
原因としては何が考えられるでしょうか?
417デフォルトの名無しさん:02/10/15 22:35
>>416
リンクってライブラリのリンクでいいの?
ライブラリが置かれているディレクトリへのパスを通した?
418デフォルトの名無しさん:02/10/15 22:35
必要な関数がない。
>>416
> 原因としては何が考えられるでしょうか?

リンクに失敗している
>>416
お前のプログラムのバグ。
421416:02/10/15 22:42
>>419 , 420
バグですか。具体的にどんなバグなのでしょうか?
どのように修正したらいいでしょうか・
>>421
ネタなら放置。
423デフォルトの名無しさん:02/10/15 22:44
まずエラーをここに書きなさい。
424デフォルトの名無しさん:02/10/15 22:45
>>423
リンクエラーになります。
425416:02/10/15 22:46
>>423
あのー
リンクエラーなのですが・・・・
426デフォルトの名無しさん:02/10/15 22:47
どの関数がリンクエラーになるの?
放置
428413:02/10/15 22:52
すんません。
リンクエラーでなかったです。

"stdlib.h:テンプレートおよびオーバーロードした演算子が C リンケージを持てない"
↑こんなの

mysql.hをインクルードすると出ます。
>>428
おまサイアクだよ
mysqlのマニュアル読め。
431413:02/10/15 23:08
・・・(´・ω・`)
432デフォルトの名無しさん:02/10/15 23:17
拡張子を変える。
なんか凄い奴が現れたな
こんな間の抜けた質問のしかたする奴初めて見たよ
>>412
彼はちょっと変な人なんだよ。
>>412
1行が256バイト以上だと、行の途中までしか読めない。
436412ではないよ:02/10/16 00:26
>>435
ん?それがなんで破綻に繋がるの?
(char *str)>256?
long = *str/str[0]
出来る?
>>412=435
あれだろ。

Cげんごのしょしんしゃむけのほん

に書いてある

char str[255];

を、「ああキャラ型の配列は255個が限界なんだ」と信じている香具師だろ
>>439
むかしのBASICの本見て
「文字列は256文字まで」
を盲信。
>>439
Macのtypedef Str255につられて何となく、とか
char = 0-255
>>442
なんでunsignedなの?
ascii
>>436
そのfgetsと(少なくとも)次のfgetsでは1行を正常に読み込めないんだけど?
問題はそれを破綻とみなすかどうかだと思うけどね。
>>445
彼はそれを「破綻」と呼んでるんだろうね。
>>446
意図しない結果ならそう呼んでもいいんじゃない?
バッファあふれだけを特別扱いする理由もないと思うし。
>>385だけ見て意図してるかどうかはちょっとなぁ。

単に破綻て言葉を使ってみたかっただけちゃうんかと
450436:02/10/16 01:45
>>445
> そのfgetsと(少なくとも)次のfgetsでは1行を正常に読み込めないんだけど?

ええ?なんで?
一度に読むか複数回にわけて読むかの違い
だけではないの?
451436:02/10/16 01:51
>>447
なんで意図しない結果になるの?
改行を取り除いてprintfで出力を繋ぐだけなら
1行の文字数は関係ないんじゃないの?

ひょっとして俺が大バカ?
452わ〜い:02/10/16 01:54
4並びゲト
>>385のprintfはデバッグ用と考えた方がよさげ。
確信なんてないけど。
そもそもどういう意味で破綻という言葉を使ったのか教えてください。>最初の人
あーでもただ出力したいって書いてるからやっぱ行を繋ぐだけなのかな
つか >>392 はも少し勉強しよう。
おいおまえら!>>385がはずしたいのは改行だけじゃなくて復改だ。
>>385が一文字ずつ処理すればこんなことにはならなかった訳だが
そもそも2chなんて無ければこんな時間にこんなことで悩むことなんてなかった
392の破綻っていうのが勘違いしてんじゃないの?

392は次の>>393でも
> 文字列長が0だとスタック壊すよ >>390
なんて的外れなこと書いてるしな。
>>392はちょっと変な人なんだよ。そっとしておこうよ・・・
今からこのスレは>>392を生暖かく見守るスレになりました。
今度のネタは 右皮糸定 か…
ヌルだとなんだのでスレを侵食したあの頃がなつかすぃ
>>462
いや、今度のネタは破綻の破の字に石じゃなくて右を使ったことだ。
K&Rの2ページに「Cにはヒープの機能は無い」とあるんですけど、
mallocはどうなっちゃうんでしょ?
これは「C自体にはI/O機能は無く、ライブラリ関数としてprintfがある」
ということと同じ関係ですか?
46563:02/10/16 03:12
#include <winsock.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <malloc.h>
#include <time.h>

の中でCでサポートしてないのありますか?
C++だとエラーでなくてCですると

c:\program files\microsoft visual studio\vc98\include\ole2.h(348) : error C2032: '<Unknown>' : 関数は struct '_OLESTREAMVTBL' のメンバとして定義できません。
cl.exe の実行エラー

とエラーがでてしまいます。
>>464
Cの文法だけが言語仕様だという立場に立てばないという見方もできるかもしれない。
しかし規格ではライブラリについても言及してるから、
ヒープの機能はないというのは間違いかもしれない。
ただし、mallocがヒープから取ってこなければならないという
決まりもないので、やっぱりその記述は合ってるかもしれない。

結論
漏れにはよくわからない。
467デフォルトの名無しさん:02/10/16 04:51
#include <memory.h>
#include <malloc.h>
は標準ヘッダじゃないな。
winsock.hもだろ。どう見てもwindows専用だ。
>>74 >>465
> c:\program files\microsoft visual studio\vc98\include\ole2.h(348) :
> error C2032: '<Unknown>' :
> 関数は struct '_OLESTREAMVTBL' のメンバとして定義できません。

ole2.h は、winsock.h を経由して windows.h から呼ばれてるな。

[OLE2.h]
 343: typedef struct _OLESTREAM FAR* LPOLESTREAM;
 344:
 345: typedef struct _OLESTREAMVTBL
 346: {
 347:   DWORD (CALLBACK* Get)(LPOLESTREAM, void FAR*, DWORD);
 348:   DWORD (CALLBACK* Put)(LPOLESTREAM, const void FAR*, DWORD);
 349: } OLESTREAMVTBL;
 350: typedef OLESTREAMVTBL FAR* LPOLESTREAMVTBL;
 351:
 352: typedef struct _OLESTREAM
 353: {
 354:   LPOLESTREAMVTBL lpstbl;
 355: } OLESTREAM;

348 行目の何でコケるのかわからん、347 行目ではエラー出てないし。
コンパイルオプションが狂ってるか、コンパイラが壊れたんじゃないのか?
>>464
>>466
> K&Rの2ページに「Cにはヒープの機能は無い」とあるんですけど、
> mallocはどうなっちゃうんでしょ?
mallocはメモリブロックを割り当てる関数で何処からメモリブロックを
取得してくるかは処理系に依存する。
多くの処理系はヒープからメモリブロックを切り出してmallocで割り当てを
行っているだけに過ぎない。
ヒープ以外の場所からメモリを割り当てても規格には違反しない。
471469:02/10/16 10:10
ついでに言えば、

>>79
> いろいろやってみたのですがsleep関数はC++だったんですね

違うぞ。
sleep() は UNIX システムコール、Sleep() は Windows API だ。
C/C++ が大文字小文字を区別することぐらいは知ってるよな?
ちゃんと書け。

どちらも C/C++ 標準の関数ではない。
sleep() は UNIX のコンパイラでしか呼べないし、
Sleep() は Windows のコンパイラでしか呼べない。

両関数とも、内部的には違うが、見かけ上は C からも C++ からも同じように
呼べる。
>>470
464 の質問に答えた事になってない。
つまり、「C にはヒープの機能は無い」 かどうかはわからないから、そう言い切って
しまうのは間違いだ、というのが結論だと解釈していいか?
>>467-468
464 は、C 標準ヘッダかどうかではなく、C から使って問題無いかを訊いたのではないですか?
まあ、そのような事を訊いているようでは修行が足りません。
茶々だが
>sleep() は UNIX システムコール、
システムコールじゃなくて単なる関数の場合が多いよ。
大抵内部でsignal使ってたりnanosleep(2)つかったりselect(2)つかったりしてる。
475デフォルトの名無しさん:02/10/16 10:56
> これは「C自体にはI/O機能は無く、ライブラリ関数としてprintfがある」
> ということと同じ関係ですか?
だと思うけど。つまり、言語的には動的メモリ取得なんて知らないと。
#実際、動的メモリ取得できない環境でも動くし。

もしくは、K&Rの時代には mallocが標準関数では無かったか。
>>475
> K&Rの時代には mallocが標準関数では無かったか。

違う違う、そもそも標準関数なんてものがなかった。
いや、標準がなかった。
47763:02/10/16 11:06
>>467-469
>>471
レスありがとうございます。

#include <winsock.h>
するとファイル名を.cppにするとうまくいって.cにするとエラーがでてしまいます。
みてみると
347: DWORD (CALLBACK* Get)(LPOLESTREAM, void FAR*, DWORD);
348: DWORD (CA........Put)(LPOLESTREAM, const void FAR*, DWORD);

と、なぜか348のところが......になってしまっているのがだめなのでしょうか?
これを書き換えても大丈夫なんでしょうか?

学校のパソコン、いえのパソコンともこうなっていたのですがプログラムが悪いのでしょうか?
478469:02/10/16 12:08
>>477
少なくとも漏れの PC のヘッダーとは異なっている事は確か。
元ファイルのバックアップを取った上で試しに 469 と同じようにしてみる
のには価値があるだろう。
しかし、C++ でコンパイルが通るのは解せないな・・・。

それにしても、学校と自宅の PC の両方とも同じ風になっているという事
は・・・割れ?
47963:02/10/16 12:26
>>477
いえ割れではないのですが・・もしかしたらプログラムで書き換えてしまっているってことあるのでしょうか?


うーん、一度コピーしてみます
480470:02/10/16 12:26
>>472
> つまり、「C にはヒープの機能は無い」 かどうかはわからないから、そう言い切って
> しまうのは間違いだ、というのが結論だと解釈していいか?
Cの規格ではヒープという概念や用語は出てこないので、Cにはヒープはない。
よってK&Rの言っていることは正しい。
しかし、多くの処理系はmallocなどのメモリを確保する関数は
ヒープに確保することはある。
POSIX関数をシステムコールっていうのはなんか違うのでは?
482デフォルトの名無しさん:02/10/16 12:53

ポインタでmallocした3次元配列を作りたいと思ってます。メモリがばらばらになるのはできるのですがメモリがばらばらにならないようなプログラムができないです。
2次元はわかったのですが、したに2次元のを書きます。

double **cube;
int i;
int M=1000;
int N=1000;

top = (double **)malloc(sizeof(double *) * M);

top[0] = (double *)malloc(sizeof(double) * M * N);

for (i = 1; i < M; i++)
top[i] = top[i-1] + N;

3次元ではどうかんれんずければいいのでしょう?
483デフォルトの名無しさん:02/10/16 12:53
上のプログラムtopのところはcubeのまちがいです。すいません
ところで、
1000*1000*1000*sizeof(double)
は8GByteになるのだが、大丈夫か?
485デフォルトの名無しさん:02/10/16 13:12
>>848
もうしわけないです;;
100*100*100*sizeof(double)
ぐらいでよろしくおねがいします。
つくってみようとしてるのですができなかったです。
もうしわけないです
double*** cube;
double** plane;
double* line;
int x, y;

cube = malloc(sizeof(double**)*N);
for(x = 0; x < N; x++){
plane = malloc(sizeof(double*)*N);
cube[x] = plane;
for(y = 0; y < N; y++){
line = malloc(sizeof(double)*N);
cube[x][y] = line;
}
}

もっとも、
cube = malloc(sizeof(double)*N*N*N);
でいいんちゃうかとはおもうが。アクセスは
cube[z*(N*N) +y*(N) +x]。
487482:02/10/16 13:47
>>486
つくってくれて本当にありがとうございます。

走らせてみたのですが、これだとメモリがばらばらになってないでしょうか?
cube[0][0][99]とcube[0][1][0]がはなれてるみたいです。
すべてひとつながりにしたいとおもってます。
つくっていただいたのに文句いってもうしわけないです。

>>487

486の一番下の方法を使いたまい
489482:02/10/16 14:03
>>488
今メモリがばらばらの方法でプログラムができてて、それをつかった計算もできてまして、それを
配列確保のところだけを変えてと上からいわれております;;;
つくっていただいたのにもうしわけないです。

検索してみたところメモリがひとつながりになっている2次元配列で以下のプログラムがありました。
int* __Data = ( int* )malloc( sizeof( int ) * M * N ); // ここで一括に取得する
int** _Data = ( int** )malloc( sizeof( int* ) * M ); // 各テーブルへ関連付けるテーブル
for( int i = 0; i < M; i++ ) _Data[ i ] = __Data + i * N; // ここで関連付ける

今やってみてるのですが、なかなかうまくいかずできないです。
double (*cube)[N][N];

cuble = (double (*)[N][N])malloc(sizeof(double) * N * N * N);
×cuble
○cube
492482:02/10/16 14:25
>>490
つくっていただきありがとうございます。
走らせて見たのですが100*100*100など正立方体などはできるのですが1000*100*100
などの場合メモリがつながってないみたいです。私の設定がまちがってるのでしょうか?
以下に書きます

#include <stdio.h>
#include <malloc.h>

void main()

{
int N=100;

double (*cube)[1000][100];

cube = (double (*)[1000][100])malloc(sizeof(double) * 100 * 100* 100);
printf("%d,%d,%d,%d",&cube[0][0][99],&cube[0][1][0],&cube[0][99][99],&cube[1][0][0]);
}

でみてみたところ
5505880,5505888,5585080,6305088となり
cube[0][99][99]とcube[1][0][0]がはなれてるみたいです。
まちがっていたら指摘していただきたいです。
493デフォルトの名無しさん:02/10/16 15:17
printf("%d", sizeof(double));
1000じゃなくて100でしょ。
495デフォルトの名無しさん:02/10/16 15:21
#include <stdio.h>
#include <malloc.h>

void main()

{
int N=100;

double (*cube)[1000][100];

cube = (double (*)[1000][100])malloc(sizeof(double) * 1000 * 100* 100);
printf("%d,%d,%d,%d,%d,%d",&cube[0][0][99],&cube[0][1][0],&cube[0][99][99],&cube[1][0][0],&cube[0][999][99],&cube[1][0][0]);
}
sizeof(double) * 100 * 100* 100 しか確保してない・・・
>>495
cube = (double (*)[1000][100])
         ~~~~~~~
          ↑×1000 ○100
498デフォルトの名無しさん:02/10/16 15:27
double (*cube)[1000][100];
ってしたらcube[][1000][100]で、
cube[1000][100][]じゃないってことかな。
>>492
配列 a[123]        へのポインタは *p
配列 a[123][456]    へのポインタは (*p)[456]
配列 a[123][456][789] へのポインタは (*p)[456][789]
常に一番最初の要素が消える。
どうしてそうなるのかはちゃんと考えとけ。
500デフォルトの名無しさん:02/10/16 15:29
cube++ってしたらdoubleで1000*100個先のアドレスを指すの。
501499:02/10/16 15:30
訂正。
×: へのポインタ、○: を操作するポインタ
502482:02/10/16 15:34
>>495
ありがとうございます。解決したもようです!!
cube[a][b][c]とあったら
cubeの宣言はb,cの範囲をしていしていて、mallocではaの範囲をとっているんですね。
ということは
cube[1000][100][10]としたかったら
double(*cube)[100][10]
として
cube = (double (*)[100][10])malloc(sizeof(double) * 1000 * 100* 10);
とすればいいんですね。ほんとたすかりました。

他の方々もアドバイスありがとうございました!
503482:02/10/16 15:36
うお!書き込んだらみんな同じこと書いてくれていた!
ほんとうにありがとうございます。
504デフォルトの名無しさん:02/10/16 15:49
配列確保のところだけ替えて動くもんなんかいな。
505482:02/10/16 15:49
すこししてみて疑問がでたのですが
cube[500][500][500]
としたいとき
double (*cube)[500][500];

cube = (double (*)[500][500])malloc(sizeof(double) * 500 * 500* 500);
だとおもうんですが
mallocのところを

malloc(sizeof(double) * 500 * 500* 500);
    ↓
malloc(sizeof(double) );

のようにしてもアドレスはうまくいってるようなんですがこれはやっぱだめなんでしょうか?

当たり前じゃヴォケ
507482:02/10/16 15:56
使えないことがわかりました;;くだらないことですいません;;
>>505
それが大丈夫なら
cube = (double (*)[500][500])(0x12345678);
も大丈夫なわけだが。
>>505
前の方の書き込みから見てると、
・・・・実戦・・・ですか?




・・・・(((;゜Д゜)))ガクガクガク
510482:02/10/16 16:05
>>508-509
時間がぜんぜんなくて、かなり強引にいってます;;;

アドレスだけみてたらうまくいってるようにみえたのですが、実際データをいれようとしたら無理でした。
511デフォルトの名無しさん:02/10/16 16:11
配列確保してるか関係なくアクセスできるからねえ。
512デフォルトの名無しさん:02/10/16 16:23
これ使う方でも
double (*hoge)[500][500];
って宣言しなきゃならないんだが大丈夫?
513482:02/10/16 16:38
>>512
宣言したあと
はhoge[][][]
でつかえるんですよね?それなら大丈夫だとおもいます。計算は変えるなっていってたのでそこいがいは変えていいみたいですので

じゃあ頑張って換えてね。
>>513
しかるべき領域確保が必要だと思われ。
516デフォルトの名無しさん:02/10/16 16:54
質問です。
ある値を代入先の変数名を変数で指定するようなことって、
どのようにして実現できますか?

例:
a という変数に hoge という値が入っていたら、
hoge という変数に ある値x を代入する。

a という変数に bar という値が入っていたら、
bar という変数に ある値x を代入する。

というような感じです。
ものすごいパターンがあるので、一つ一つ全てを、
If文で分けるという方法はなるべく無しでやりたいのです。

宜しくお願い致します。
>>516
とりあえずswitch
>>516
配列変数使いなー
519デフォルトの名無しさん:02/10/16 17:03
データ構造を変えた方がいいのでは。
例えば、変数名と値を構造体にして二分木なりハッシュにする。
>>519
この処理だけに最適化するのもどうかと。
>>516
素朴な質問。
a と hoge と x のどれが引き数ですか。
522516:02/10/16 17:14
>>517
switchを使うということは、enum型で全てのパターンのテーブルを作って、
場合分けするっていうような感じでしょうか?

>>518
配列変数を使うというのは、いまいちイメージが湧かないです・・・。
全てのパターン数分の配列を用意して、どうにかするって感じでしょうか?

>>519
どういう変数が用意されているか決まっていますが、
その変数にどういう値が入るかが決まっていないんですけど、
変数名が入る構造体と値が入る構造体を用意するっていう感じなんでしょうか?
あれ?自分でも訳わからなくなってきました・・・。
>>521
a だな。
すいません。
とりあえず。

if (strcmp(a, "hoge") == 0) {
  hoge = x;
} else if (strcmp(a, "bar") == 0) {
  bar = x;
} else if ...

  :
  :

これをifを使わずに作りたいってこと?
そういや、gperfの出力ってどういうライセンスになるかご存知ない?
ぐーぐるしたけど英語だとinfoばかりかかるしよく分からんかった。
526516:02/10/16 17:25
>>524
出来れば使いたくないって思っていたんですけど、
その方法が一番ですかね?
大体50パターンくらいあるんです。

何でこんなことをやろうとしているかというと、
CSV形式で用意されているデータが2種類あって、
片方には何番目が何なのかという項目だけのファイルで、
もう片方が、1行ごとにその項目ごとの値が入っているんです。

それを上手くプログラムの中で代入していきたくて・・・。
そもそもこの2つのCSVファイルを用いるやり方よりも、
良い方法があればいいんですけど・・・。
>>511
アドレスの計算は、対象のメモリ領域にはアクセスしたりしないぞ。
>>526
perlとかで処理できない内容なのか?
>>527
いや、だから領域確保せずに計算だけで求めた適当なアドレスにアクセス
することを言語レベルでは止められないってことでは?
>>526
変数名っつーのはプログラマが自由につけられるわけで、
"bar"だからbar、"hoge"だったらhogeって変数に入れなきゃいけないわけじゃない。

"bar"だったら、array[BAR]に、"hoge"だったらarray[HOGE]に入れればいいわけじゃない?
531516:02/10/16 17:33
>>528
その処理の部分はプログラム全体のほんの一部で、
他の部分はCでほぼ出来上がっちゃってるんです・・・。
あと、自分がPerlがわからないっていうオチも・・・。
すいません。
532デフォルトの名無しさん:02/10/16 17:35
面倒だったらマクロなりPerlなりでif文を出力したら。
533516:02/10/16 17:42
皆様いろいろとアドバイスをありがとうございます。

>>530
array[]ってCの仕様でありましたっけ?
それとも配列の変数の名前がarrayって感じですか?
無知ですみません。

>>532
全パターンを書くのが面倒というわけではないのですが、
プログラムとして「なんか力技っぽくない?」と、
素人ながらに思ってしまっただけなんです。
やっぱり普通にIf文で分けるべきですかね?
それかswitch文?
>>533
1つのデータファイルから読み込む同じ型のデータが、
別々の変数として管理されてるところに問題があると思うけどね。
>>533
かっこよく実装するのなら連想配列とかなんだろうけど、これくらい
なら if文ずらずら並べてもいいんじゃない? ただ、メンテのことを
考えると >>532が言っているプログラム自動生成をお勧めする。
>>533

char const* names[2] = { "bar", "hoge" };
int values[2];

#define bar values[0]
#define hoge values[1]

values[ names 内での a のインデックス ] = x;

/* a が "bar" なら、 values[0] すなわち bar が x に、
  "hoge" なら value[1] すなわち hoge が x に
*/
537デフォルトの名無しさん:02/10/16 17:55
どれにせよ、文字列"bar"と変数barの対応付けをしてやらんといかんな。
>>526
50パターンって、もしかして変数を50個用意しようとしてましたか。

…配列のほうがよくないですか。
539デフォルトの名無しさん:02/10/16 17:59
変数はもう他人が決めてしまったんだろ。
540536++:02/10/16 18:02
>>539
ならばこれでどうだ!!

char const* names[2] = { "bar", "hoge" };
int *values[2] = { &bar, &hoge };


*values[ names 内での a のインデックス ] = x;
541516:02/10/16 18:02
>>536
具体的にありがとうございます。
参考にさせていただきます。

>>538
構造体を作って、その中に50個の変数を用意しようとしていました。
全ての変数が同じ型ではないので・・・。
>>541
整数値と実数値が混じってるってことですか。
それとも、数値と文字列が混じってるってことですか。
型が違うならifかswitchにせざるを得ないと思うが、そもそもコードが共通にならないんだから。
544デフォルトの名無しさん:02/10/16 19:16
こんなんでどう?

struct variable_info {
 const char *name;
 int type;
 void *ptr;
};
#define TYPE_INT0
#define TYPE_DOUBLE1
/* 二分探索を行うために変数名でソートされた配列 */
static struct variable_info variables[] = {
 { "bar", TYPE_INT, &bar },
 { "hoge", TYPE_DOUBLE, &hoge },
 ...
};
static struct variable_info *
get_variable_info(const char *name) {
 /* 二分探索を実装 */
}
void set_variable_int(const char *name, int value) {
 struct variable_info *info = get_variable_info(name);
 if (info->type == TYPE_INT) {
  *((int *)info->ptr) = value;
 } else if (info->type == TYPE_DOUBLE) {
  *((double *)info->ptr) = value;
 }
}
545デフォルトの名無しさん:02/10/16 19:50
int value...
546デフォルトの名無しさん:02/10/16 19:55
while文を終わらせる方法を誰か教えてください
while((scanf("%s",data)>0))でキーボードから入力された文字がすべて読み込み終わったらwhile文を終わらせたいのですが
dataはchar型の配列です
>>546
> キーボードから入力された文字がすべて読み込み終わったらwhile文を終わらせたいのですが
この部分が曖昧。
LinuxだとCtrl-Dを入力するとscanf() > 0 が偽になる。
>>546
それよりまず先に scanf() やめて fgets() (必要があれば sscanf() も) にしる。

あと、「キーボードから入力された文字がすべて読み込み終わったら」 という条件が
漠然としていて処理を書きようが無い。
キーボードは叩けば叩くほど永遠に続き、プログラムを中断するまで終わる事は無い。
どんな処理を書きたいんだ?
549547:02/10/16 20:18
> LinuxだとCtrl-Dを入力するとscanf() > 0 が偽になる。
やっぱこれなしにしてくれ。
他の文字に続けて入力するとだめだ。
550デフォルトの名無しさん:02/10/16 20:19
入力の終了の仕方知ってる?
>>544
そんなの書くぐらいだったら素直に if 文 50 個並べた方がいいYO!!!
参照はどうするんだ、二分探索をまた実行するのかい?
ついでに、void *ptr; より char value[1]; の方がメモリ管理が楽と思われ。
ユーザ入力が scanf() ではじまってない入門書てなんかあるんかな。
あれば読んでみたい。
>>549
そうだな、そもそも Ctrl-D は C の仕様ではない。
>>552
そういう本はお目にかかった事無い、困ったものだ。
fgets() + sscanf() は入門用に使えない程難しいか?
555544:02/10/16 20:28
>>551
変数って他のどこかでグローバルに定義されてるんじゃないの?
char value[1]じゃ他で定義された変数を参照できないよ?

これなら他は一切変えずに、しかもifの分岐より*若干*速い(藁
さらに、変数増えようが、型が増えようが対処は簡単♪
>>552
scanfは手軽だしな。
fgetsやってトークン切り出して、
必要ならば変換かけて、
なんてやるより手軽に説明できるから。

ただ、scanfの落とし穴はものすごく深いんだけど
そういう説明はあんまりしてくれない。

入門書書くのなら、数の入力は後回しにして
徹底的に文字列処理と文字列の入出力をやってから、
atoiだのに進んでscanfは無視しちゃったほうがいいような気がするけど、
おれにはかけない。
だよなあ scanf() は分かってて使うぶんにはいいけど…
入門者にはまず fgets()、ついでに標準入出力概念の最低限の説明をして
その次に sscanf() にした方がむしろ親切と思うが
それって入門者には難しいのか?
文字列(というかポインタ)を教えること自体がかなり厄介
printfとscanfはどちらもそれを気にせず教えられるからね。

# 俺の大学の糞教本は、scanf の引数に & をつける理由を一言も説明していなかった。
# 案の定C初挑戦のやつらは全く理解できなかったけどね。
>>516
union配列使ったら?
ふとK&Rは何だったか開いてみたら getchar() だった。
倉薫(だっけ?)の本にはscanfがなかった気がする。
というよりユーザ入力がなかったような。
at first?
>>555
> 変数って他のどこかでグローバルに定義されてるんじゃないの?
構造体に入れてるとは言ってるが、グローバルかどうかはどうだっけ?
てか、“その他”の部分の都合を考えずにここだけぐちゃぐちゃいじっても
どうしようもないだろ。テクニック的には面白いのかもしれんが。
最初に入門的なprintfとscanfの入出力を簡単に説明して、
最後の方の章で
「実は第1章で使ったscanfという関数には落とし穴があります」
とか言ってfgets等も出せばいいのにね。
そこまで誌面をさけないかな。
565 :02/10/16 21:07
>>541
型が違うのか。C++がつかえるならtemplate & 署名フィールドなオブジェクト
を作るがスレ違いなレス。スマソ
>>525
どうなんだろうね。ちょっと探して見たけどよく分からない。

bisonだとGPLなコードがそのまま出力の一部として使用されるから出力されたコードも
GPLだ、なんてふうに書いてあるけど、gperfは書いてないような…
>>566 探してくれてさんくす
そうそうbisonは議論されてるんだけどgperfは全然見つからん
GPLには 0 の第2パラグラフにちょろっとしか書かれてないし判断できん
>>555
> 変数って他のどこかでグローバルに定義されてるんじゃないの?

(゚Д゚)ハァ?
↓よく見れ。

>>541
> 構造体を作って、その中に50個の変数を用意しようとしていました。

つまり、変数を洞宣言するか、まだ決まってないという事だろう?
もっと遡れば、

>>526
> CSV形式で用意されているデータが2種類あって、
> 片方には何番目が何なのかという項目だけのファイルで、
> もう片方が、1行ごとにその項目ごとの値が入っているんです。
>
> それを上手くプログラムの中で代入していきたくて・・・。
> そもそもこの2つのCSVファイルを用いるやり方よりも、
> 良い方法があればいいんですけど・・・。

結局、最終目的がわからないと何も言えないぞ。
>>516
enum?
570デフォルトの名無しさん:02/10/17 03:26
age

struct {
unsigned char *label;
unsigned char *string;
} variable;

 変数名label と 内容string を別々の文字列で保存して、
ソレが数字か文字かはプログラムで対処・・・ダメ?
>>526
リレーショナルデータベースで
1つめのCVSの2カラム目と、2つ目のCVSのレコードの通し番号とで
join して残りのカラムを select すれば、項目と値の対応が取れ
た CSV ファイルになる。これをよみこんだら宵のではないかね。

#データベースとしてはmysql, postgresql, msql などがある。

C でやるべきことと、他のツールでやるべきことを見極め、
適材適所すべし。

#それらのツールもCで書かれたりすることもあるだろうし、
#当然のようにCで同じことを行うプログラムを書くことはできる。
#しかし、大事なことは、ツールが独立した、高級な概念を与えてい
#るという見方をし、そこ概念をうまく利用すること。
#しかる後に、どうしてもスピードが足りなかったら、
#そのツールをCで置換することを検討すればよい。
変更する権限ないんでしょ。
提案する権限までもないのかな
生きる権限が
>>556
> scanfは手軽だしな。
> fgetsやってトークン切り出して、
> 必要ならば変換かけて、
> なんてやるより手軽に説明できるから。

そもそも標準入力が手軽にできるものと思って欲しくねー。
普通、標準出力よりも格段に難しいはずなんだが、書籍著者は標準入力を単に
標準出力とのセットとだけしす認識していないのだろうか。
入門書におけるscanf() は著者がサボる手段、並びに入門者の学習能力を勝手に
低く規定してなめくさる行為、としか考えられん。

>>564
> 「実は第1章で使ったscanfという関数には落とし穴があります」
> とか言ってfgets等も出せばいいのにね。
> そこまで誌面をさけないかな。

1、2 ページもあれば十分じゃないか?
  fgets(buf, sizeof(buf), stdin)
sizeof(buf) と stdin は、#include <stdio.h> と同じ 「おまじない」 で
いいじゃないか。
ただ 「おまじない」 も、本当の意味があるという事を示して、きちんと解説
するか、または後でそれを自分で考えるよう指示してくれないと困るが。
>>571のように
本当に、取り敢えず、型とデータを一緒にくくって
おいて後で振り分ければそれで良いと思う。

variable[50]かな?type,data,etc...
578デフォルトの名無しさん:02/10/17 10:25
ANCI で 特定ディレクトリ上のファイルを検索する方法を教えてください
おながいします
>>578
ないです。
580578:02/10/17 10:33
>579

さんくすこ






                                              (´・ω・`)ショボーン
>>578
ANSIには無かったような。
POSIXなら opendir。
582578:02/10/17 11:01
>581

キタ⌒Y⌒Y⌒Y⌒Y⌒Y⌒(。A。)!!

巧くいきますたさんくすこ
583デフォルトの名無しさん:02/10/17 11:21
VBをやっと卒業したのでCの本を読んでいます
でもさっぱりわかりません、ポインタって一体・・・
インクルードとかvoidとか・・・
こんなことも理解できない漏れは香具師ですか?
>>583
> こんなことも理解できない漏れは香具師ですか?

あなたはカグシですね。
*←ポインタ!!
>VBをやっと卒業した
気のせいです。
> voidとか・・・
呼びましたか :)
>>583
逝ってよし

ポインタを上手に例えてみよう
http://pc3.2ch.net/test/read.cgi/tech/1030901827/
インクルードほど単純な機能が理解できないのは人としてやばいだろ
インクルードしたヘッダの中でさらにインクルードが行われると理解できなくなる人は見たことある。
>>583
ポインタをうまく扱えるようになるとできることの幅が広がるので、
ぜひがんばって勉強しましょう。

このページとか参考になるでしょうかね。
ttp://www.ilovepet.net/dog/Dog.asp?Dog_ID=9
>>591
踏んじゃったじゃん。止めてよ、cの走ってるコンソール画面
以外の絵のあるページ嫌い。
普通そんなもんインクルードしねえよってもんを
インクルードしようとして困ってる人をみたことある
宣言と定義の区別がついてないのが原因みたいだったが
MIDIを再生したいんですけど,C言語での場合どのようにしたらいいのでしょうか?
>>593
ライブラリと言うものを知らなかった厨房の頃
自作共通関数ソースを平気でインクルードしていた、
2重インクルード防止のためインクルードガードも付けていた。

現在でも、ライブラリをリンクするほどでもない
テストプログラムではよくやってしまう。
>>594
環境書けや。
>>596
Win98
VC++6.0
です
>>594
環境に激しく依存するしいろいろあるから一口にいえない。
質問の仕方からして概念を理解してないぽいから
図書館にいってCマガのバックナンバーでもみてみた方がよいと思われ
何年か前に特集記事があった
Win32関数ですれとかいわれたことがあるんですが・・・
>>593
staticな関数のプロトタイプ宣言をヘッダーファイルに書く人も困り者。
プロトタイプ宣言だからってなんでもかんでもヘッダーファイルに書くなよ。。。
>>595
むしろテストこそリンクするんじゃないのか。makeとか使ってないの?
603600:02/10/17 15:23
いろいろ検索して,なんとか方法を見つけました
サンクス
>>602
makeを使ってるから、メイクファイルを作らない。
俺のtestディレクトリ配下にはAPIや標準関数の挙動を調べたりした
aaa.c bbb.c ccc.c hoge.c ...
とわけの分からんファイルがゴロゴロしている
これにメイクファイルなど付けてしまうと
aaa.c aaa.mk bbb.c bbb.mk hoge.c hoge.mk ...
ファイル数が2倍になり余計にわけがわからなくなってしまう
make aaa
とやれば、デフォルトルールで勝手にaaaが作られ、
わざわざメイクファイルなどを作らなくともよい。
>>604 ひとそれぞれだから別に文句はない。
漏れは単体テストのようなものを書いてmake test しながら進める。
make aaa のようにいちいち aaa を考えてうつ方が漏れにはめんどい。
API確認のような捨ててよいファイルは名前は a.hoge.c と決めてあるので、
clean ターゲットに rm -fr a.* を含めてある。
>>605
> 漏れは単体テストのようなものを書いてmake test しながら進める。
クライアントに提出するプログラムに関してはソースをインクルードする事は
絶対にしないし、単体テストもコンパイル時に行うような仕組みにしてる

> API確認のような捨ててよいファイルは名前は a.hoge.c と決めてあるので、
> clean ターゲットに rm -fr a.* を含めてある。
うーん、ここが君と俺との考え方の違いかなぁ、捨てて良いと思ってても捨てられない。
プロジェクト終了時にtar-gzして取っておく、1年たって使わなかったら消す。
まぁ、ひとそれぞれだけどね。
>>604-606
俺はAPI確認用のソースは、そもそもプロジェクトと同じディレクトリに置かないで、
自分の手元にディレクトリ分けたりとかでキチンと分類して置いておく。そのプロジェクトが
終わっても参照できるし。
>>607
ファイル名つけるのがめんどいので、必要ぽい分は
cat && cc && a.out の結果を会社の自分アドレスに subject: memo でメールしてる。
609607:02/10/17 18:26
>>608
それいいね。便利だから頂き。
610デフォルトの名無しさん:02/10/17 18:46
すごい馬鹿らしい質問なんですがGCCは
http://gcc.gnu.org/ のどこから手に入るんですか?
>>610
それが読みとれないうちは使わない方がよい
612610:02/10/17 18:50
>>611
あ、そうなんですか(笑
わかりましたぁ。
613デフォルトの名無しさん:02/10/17 19:18
typedef struct {
unsigned char *piyo;
int mona;
} HOGE;

というヘダー"hoge.h"があって

#include <stdio.h>
#include "hoge.h"

main ()
{
printf ( "size...%d¥n", sizeof ( ...... ) ) ;
printf ( "size...%d¥n", sizeof ( ...... ) ) ;
}

こんなプログラムがある。
*piyoとmonaと構造体のサイズを表示したいんすけど
どうすればよいのでしょうか?
614デフォルトの名無しさん:02/10/17 19:33
windowsにcygnusをインストールしたけどCコンパイラ使えないんですか?
gccコマンド使ってもcommand not foundってなります。
615デフォルトの名無しさん:02/10/17 19:40
unsigned char hoge='A';
printf( "%c\n",hoge );

まさか、これがバグだなんて夢にも思わなかったよ
ひとつ勉強しました
616デフォルトの名無しさん:02/10/17 19:41
HOGE hoge;
printf ( "size...%d\n", sizeof( HOGE ) ) ;
printf ( "size...%d\n", sizeof hoge ) ;
printf ( "size...%d\n", sizeof hoge.piyo ) ;
printf ( "size...%d\n", sizeof hoge.mona ) ;
>>615
そうなのか?
618615:02/10/17 19:46
>>617
そうなんだよ・・・びっくりした?
もうね、現場でオレ心臓止まりそうだった。
つーか多分コンパイルしながら半べそかいてたと思うよ。
>>616
俺は未だに sizeof で () で括る必要があるのと無いのとの区別が覚えられん…
>>615
It can compile.
>>618
つーか、ちゃんとコンパイル通って動くけど?
>>621
そうなんだよ、一見ちゃんと動くのが問題なんですよ奥さん。
マジでオレは3日悩んだ
623613:02/10/17 20:13
>>616サソありがとうございます

ヒトツ厨な質問させていただきたいのですが
なぜに
HOGE.piyoとできないのですか?
>>615
'A'がint型だから or printfがint型を取るから?
でもそれが問題になるとは思えないんだよなぁ。
sizeof char= sizeof intな環境とか、かなぁ
>>619
sizeof (型)
sizeof 式

# ただし、後者の場合 sizeof は優先順位が高いのでやっぱり括弧が必要に
# なることもあるので注意。
627624:02/10/17 20:34
'A'はintじゃなかった。鬱〜
>>622
ネタじゃなかったらどこがおかしいか書け
ビッグエンディアンなためバイト順が狂った…
わけないよな。
ネタ氏はprintfの引数の型が格上げされることを知らないと思われ
つまり >>625 ってことか。
>>631
intは16bit以上だったと思うけど、
charが16bitってあるのか?
大きい型にキャストされるとか
634追加:02/10/17 21:14
い[方の]型
>>662はちょっと変な人なんです。やさしく接してあげてください。
あまり知られていないが、'A'はintだ。
>>627'A'の型はintであってるよ。Cの場合。C++の場合はcharになる。
しかしASCIIコードは7ビット。
宴もたけなわなので景気付けにパァーっとNULL==0でも
プログラマ志望の26歳なのですが、C言語を勉強したいと思いました。
そこで無料で使えるコンパイラかインタプリタはどの様なものが有るのでしょうか?
ネットで検索したのですが見つかりませんでした。
Borland C++ Compiler(BCC)で頑張れ。
642manko_chinko ◆GLc2rpKRNM :02/10/17 21:48
gcc
643デフォルトの名無しさん:02/10/17 21:54
>>640
このスレの>>2を見てから出直して来い。
環境が EBCDIC とか...。

'A' → 0x00c3
unsigned char hoge → 0xc3
printf("%c\n", 0xffffffc3);

でも、おかしくなるかなぁ...。
645640:02/10/17 22:02
>>641
>>642
有難うございます。さっそくdownloadします。

>>643
市ねクソや労。テメエなんかに聞いてないんだよ。
>>645
ポカーン
>>640
>>643は2Chでの愛の鞭と思てな。
VC6 で '' の中に 2 バイト詰め込むと int 値になるのだが (漢字も可)、
それは C 的に OK なのか?

#include <stdio.h>
int main()
{
 int i;
 union { int i; unsigned char c[4]; } u;

 u.i = 'AA'; /**** ← こいつだ ****/

 for(i = 0; i < 4; i++)
  printf("%d: '%c' 0x%02X\n", i, u.c[i], u.c[i]);
 return 0;
}
>>648
やるなら L'AA' の方が移植性がある。
>>648
OKかどうかは知らんが、けっこう使うけど。
>>645
ネット検索して何も見つけられないような香具師に、>>643 が 市ねとか言われる
謂われは無いぞ? ん?

だいたい、>>643 は何か間違ったことを言ったか?
>>2 をちょっとでも見たか?
>>641-642 だけに礼を言ってるようだが、彼らの出した情報は既に >>2
載ってるんだぞ。
きちんと情報を提供している >>643 に向かってその暴言は無いだろう。
あんたはプログラマ云々以前に、人格的な問題がある。

>>643 に謝れ、さもなくばここに来るな。
(・∀・) クルナ!
>>626
サンクスコ
int a, b; a = sizeof b + 1;
なんてのは sizeof (b + 1) になっちゃうわけですね。
>>651
そんなに熱くなるなよ。分からないのは 640 だけさ
>>651
645は、2どころか1もまともに読んでいないな。
「コンパイラ、過去ログなどのリンクは>>2-5あたり」ってしっかり書いてある。
>>653
え゛?
sizeof(b) + 1 だろう?
>>651
気にするな
2を読まずに損してるのは645なんだからさ
んで、>>615=618=622の話は 結局どうなのかな?

彼としては ↓にすればOKと言いたいんだろうか?
printf("%c\n",(int)hoge);

俺的には今のままでも問題ないのではないかと思うんだけど。
>>658
俺も問題ないと思うのだけれど、
あるいはCmachineならそういうこともあるのかも?
>>656
そうですね。>>653は勘違いしたんですね。試してから書けばいいのに。馬鹿ですね。
昨日の俺ですが(´Д⊂

結局どういう場合に()が必要なのか良く分からないです…

↓sizeof b + 1 を試した後に横道にそれて書いたアホコード
#include <stdio.h>
int main (void) {
  char *m = { "?", "b", "w", "?", "l" };
  short x;

  printf ("x のサイズ = %s\n", sizeof x [m]);
  printf ("x のサイズ = %s\n", sizeof (x) [m]);
  return 0;
}
>>660
この辺見て理解するしかない
ttp://www-ccs.ucsd.edu/c/syntax.html
>>648
規格上はまったく合法。ただし、それがどのような値になるかは
処理系定義なので移植性は低い。その文字の並びがコンパイル時の
ロケールで一文字のマルチバイト文字を構成していない場合は、
L を付けても付けなくても移植性の観点から見れば同じ。
663デフォルトの名無しさん:02/10/18 02:26
.
664デフォルトの名無しさん:02/10/18 03:04
>>660
char *m[]=の間違いか?
665デフォルトの名無しさん:02/10/18 03:09
>>656
そういうときは、
(sizeof b) + 1
って書いた方がさらに明解.
がむばって括弧つけない意味ってなにかあるの?
sizeof ちんぽ
>>637 ANSI Cでもそうなの?手元にANSIがないからないからわからんのだが、
定数の値って型として定義してあるんだっけ。Standard C では int なのは調べた。
669デフォルトの名無しさん:02/10/18 05:36
char *m[]の意味がちょっと。
単に char m[]でいいんじゃないの?
standard C と ANSI C って別物なの?
671デフォルトの名無しさん:02/10/18 07:37
char *m1[] ポインタの配列。
char m2[] char型の配列。
m1[1] ポインタ
m2[1] char型の値
m1[1][2] char型の値
>>664
そうかも。
書き写す時に見落としたっぽい。
673デフォルトの名無しさん:02/10/18 09:40
>>671
初心者ですが、
m1[1][2] char型の値
ってのは、
char m1[];
ってやっといた時の、m1[2]ってことですよね。
で、両方使うには、両方宣言しとく必要があるってことですよね。
char *m1[];
char m1[];
って。
なんで、>>671さんは、配列の添え字をm1とm2に分けてるんですか。
よろしくお願いすます。

675( ○ ´ ー ` ○ ):02/10/18 10:07
while((n=fgetc(pfile))!=EOF){
/*上位4ビットを16進数文字に変換する*/
fputc(Halftohex((n&0xf0)>>4),stdout);
              /*下位4ビットを16進数文字に変換する*/
fputc(Halftohex(n&0x0f),stdout);

fputc(' ',stdout);

if(!(++count%24))

fputc('\n',stdout);
else if(!(count %8))
fputc(' ',stdout);
}
 Halftohexは、return str[x];をx&=0x0f;でマスクしています。
  色々な、ホームページを覗いたが4シフト(n&0xf0)>>4という
 意味がわからず。2進数の場合2^4という積を行うが16進数で
 表記されてた物をシフトするとどうなるのか・・・。 
676デフォルトの名無しさん:02/10/18 10:10
ビットのシフトなんだが。
二進数で 11110000 だったら
1111になる。2^4分の一
677( ○ ´ ー ` ○ ):02/10/18 10:16
 もし、(int)n='A';だったら上位4ビット、下位4ビットは
どうなりますか。
unsigned char Halftohex(int x)
{
static unsigned char str[]={
'0','1','2','3','4','5','6','7','8',
'9','A','B','C','D','E','F'};
x&=0x0f;
return str[x];
}
>>673
>>なんで、>>671さんは、配列の添え字をm1とm2に分けてるんですか。
m1、m2はそれぞれ配列名、添え字は[]の内側の数字
679デフォルトの名無しさん:02/10/18 10:22
文字コードによってちがうと思うが
int n = 'A';
printf("%X\n", n);
printf("%X\n", (n&0xf0)>>4);
printf("%X\n", n&0x0f);
4,1
680( ○ ´ ー ` ○ ):02/10/18 10:23
えってか・・・printf();できんのか
printf("%c\n", "0123456789ABCDEF"[n&0xf]);
でも1を返すけどね。
682!1:02/10/18 10:27
683( ○ ´ ー ` ○ ):02/10/18 10:29
ん?"0123456789ABCDEF"n[n&0xf]って何・・・!?
 んま・・文字リテラルを利用するともっと便利になるぞってことか!!
684デフォルトの名無しさん:02/10/18 10:32
n&0xf は0から15までの数になるわけ。
"0123456789ABCDEF"[x] は x+1番目の文字
xが3だったら'3'になる。
>>683
char hex[] = "0123456789ABCDEF";
printf("%c\n", hex[n&0xf]);

このコードから中間変数hexを取っ払うと上記のコードになる。
>>679
4,1は16進数の値だよね。
2進数だと0100,0001だよな。
687( ○ ´ ー ` ○ ):02/10/18 10:44
 A:0x41(16)=65=2^6+1=1000001
   2進数→10進数=16進数の上位4ビット
     4<<x
     ってことになりますね。
688デフォルトの名無しさん:02/10/18 10:48
printf("%X\n", n&0xff);
つーか、こんでええやん。
4<<xは0100をx分左にシフトさせるんだが、
x=4なら01000000
#include <stdio.h>

main(){
char n='A';
printf("%c","0123456789ABCDEF"[(n&0xf0)>>4]);
printf("%c","0123456789ABCDEF"[n&0x0f]);
return 0;
}
#include <stdio.h>

main(){
char n='A';
printf("%X",(n&0xf0)>>4);
printf("%X",n&0x0f);
return 0;
}
690もこれも出力結果は、
41
ね。
692デフォルトの名無しさん:02/10/18 11:01
どこまでわかったんだろうな。
/*上位4ビットを16進数文字に変換する*/
fputc(Halftohex((n&0xf0)>>4),stdout);
              /*下位4ビットを16進数文字に変換する*/
fputc(Halftohex(n&0x0f),stdout);

printf("%02X", n&0xff);
に置き換えられる。
>>614
> windowsにcygnusをインストールしたけどCコンパイラ使えないんですか?
> gccコマンド使ってもcommand not foundってなります。
cygnus setup.exeを使用していると仮定して話を進めると、
Defaultインストールだとgccはインストールされない
もう一度setup.exeを動かしてselect pacages画面で
Devel配下の真ん中あたりにgccがあるからそれをインストールしろ
ついでにgdb, makeもインストールするのをお勧めしておく
一個の整数を読み込んで(変数名はNとする)、小さいものから数えてN番目にある素数を出力するプログラムを誰か教えて下さい。
>>694
まず、素数を求める関数作らなきゃあな。
>>694
課題丸投げですか。
>>694
int sosu[SOSUMAX];
という配列を作って、その中に素数をあらかじめ入れておく。
そうしたら、あとは

printf("ソスウハ %d デス\n",sosu[N-1]);

とすればOK。
698デフォルトの名無しさん:02/10/18 11:17
for (i=2; ...; i++)
if (isprime(i) && !--n)
printf("%d\n", i);

int isprime(int n) {
int i = 2;
for (; i*i <= n; i++)
if (n % i) return 0;
return 1;
}
#define SISUMAX 20

int sosu[SOSUMAX]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};

printf("ソスウハ %d デス\n",sosu[N-1]);
>>698
if (n % i == 0) return 0;
>>699
ありがとうございました。
だいたいこれでよさそうなので
MAXのところ(素数の数?)を1000くらいまで
増やしてみようと思います。
多分1,000番目の素数を求める為のプログラムを作って、
結局それを組み込めば良いことになると思うが?
SISUMAX
SOSUMAX
違うし。
>>701
自己レス。
配列は使ってはいけないそうです。
>>698
良く見ると面白いプログラムだ。
isprime(i)が偽の時、--nが実行されない。うまくカウントできる。
int isprime(int n) {
int i = 2;
for (; i*i <= n; i++)
if (n % i == 0) return 0;
return 1;
}

void main() {
int N;
scanf("%d", &N);

for (i=2; ; i++)
if (isprime(i) && N-- == 1){
printf("%d\n", i);
break;
}
}
int N, i; だったな。
1000で7919になったが合ってる?
for (i=2; !isprime(i) || N-- != 1 ; i++)
;
printf("%d\n", i);
708( ○ ´ ー ` ○ ):02/10/18 11:47
 x>>4と(n&f0)>>4は、捕らえ方が町々っていうことでしたね。
  ちょっと、考えてました。 問題は、2進数のシフトとその
 イメージです。 いや、でも助かります。 
709( ○ ´ ー ` ○ ):02/10/18 11:58
 あの僕、ちょっと気付いたですけど2進数をx>>4すれば左シフト
することになるし16進数をx>>4すれば右シフトすることになる。
 自分の文脈にはそういった配慮がなされてない。
     どうでしょうか・・・!?
710デフォルトの名無しさん:02/10/18 11:59
x<<4が左シフト
x>>4が右シフト
711( ○ ´ ー ` ○ ):02/10/18 12:09
 それは、8進数を基準に16進数の場合逆になるっていうのは
ありえないのでしょうか。
8進数だろうが16進数だろうが
ビット列なんだから関係ないでしょう。
713( ○ ´ ー ` ○ ):02/10/18 12:13
 上位4ビット、下位4ビットに変換する詳しいホームページがあったら
 ぜひ教えてください。
( ○ ´ ー ` ○ )の言いたいことがさっぱりわからねぇ。

なんで基数を変える(数字の書き方を変える)だけで同じ操作が右シフトになったり左シフトになったりするんだよ
>>714
円ディアンについて勘違いしている方に>>713の魂を賭けよう
まずは2進数についてきちんと勉強すべき。
プログラミングの話はそれからだ。
頭の中ではringになってるんでしょ。
左から0が入るとかの知識が有れば・・・
(´-`).oO(みんなネタに飢えてたんだなぁ…)
おいお前ら!
配列を使わずに N 番目の素数を求める方法ってありますか?
漏れは無いような気がする。
>>719
なんで?
721デフォルトの名無しさん:02/10/18 15:33
>>719
配列に何入れるつもりなの?
>>721
エラトステネスのふるいを配列で実現するつもりなのでは?
>>720-721
N - 1 番目までの素数を保存しないで、どうやってその数字が素数であるかどうか
判定するんだ?
>>719
配列じゃなくて線形リスト使えば?
>>723
ベタでやればできるじゃん。
その数字と1以外で割り切れない数。
727デフォルトの名無しさん:02/10/18 15:40
>>723
>>705が読めないの?
728デフォルトの名無しさん:02/10/18 15:43
typedef struct {
unsigned char piyo;
short *zaku;
char *gundum;
short GM;
} HOGE;

こんな構造体をsizeofで返すと・・・
piyo=1
zaku=4
gundum=4
GM=2
HOGE=16
こうなりますよね?
なんで構造体自体のサイズは
メンバー×4なのでしょうか??

厨房でスイマセソ(´Д` )
729デフォルトの名無しさん:02/10/18 15:45
パディングっていって
ぴったりに入れないようにしてる。
>>728
C-FAQの第2章。
超FAQ
typedef struct {
unsigned char piyo;
short GM;
short *zaku;
char *gundum;
} HOGE;
だと縮まらない?
>>719
> 配列を使わずに N 番目の素数を求める方法ってありますか?
> 漏れは無いような気がする。
気のせいです。
int n;
if(n == 1) printf("ソスウハ 2 デス\n");
else if(n == 2) printf("ソスウハ 3 デス\n");
else if(n == 3) printf("ソスウハ 5 デス\n");
else if(n == 4) printf("ソスウハ 7 デス\n");
        :
else if(n == 1000) printf("ソスウハ 7919 デス\n");

後はこれを作るプログラムを>>699を参考にして作ればいい。
734デフォルトの名無しさん:02/10/18 15:48
>>733
せめてswitchにしろ。
735デフォルトの名無しさん:02/10/18 15:48
ミンナ(・∀・)イイ!!!
アリガd
C-FACKミテミマス!!
>>733
せめてswitchにしてほしかった。
結局のところ、719が実は
素数を算出するアルゴリズムだけ知っていて、
素数の定義を知らなった ということでつか?
738デフォルトの名無しさん:02/10/18 15:51
>>733
>>719
switch case を使う方法も有るよ。別解を示す
レポートには先生からおっきな花まるもらえるよ。
ほれ、ソースも作ってやったぞ
int main(void)
{
  int sosu[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
  int i;
  printf("\tswitch(n) {\n");
  for(i = 0; i < sizeof sosu / sizeof *sozu; i++)
    printf("\tcase %d: printf(\"ソスウハ %%d デス\\n\"); break;");
  printf("}\n");
  return 0;
}

sosuの配列の作り方は>>705を参考に作ればいい
740739:02/10/18 16:05
×:  printf("\tcase %d: printf(\"ソスウハ %%d デス\\n\"); break;");
○:  printf("\tcase %d: printf(\"ソスウハ %%d デス\\n\", sosu[i]); break;");
配列じゃなく、ポインタに詰めりゃ(・∀・)ノイイ!
printf("\tcase %d: printf(\"ソスウハ %%d デス\\n\"); break;", i);
printf("\tcase %d: printf(\"ソスウハ %d デス\\n\"); break;", i, sosu[i]);
744デフォルトの名無しさん:02/10/18 16:08
>>741
???
>>744
malloc & freeを使えってことでしょ
ワロタ
プログラムジェネレータかよ。
#include <stdio.h>
#include <stdlib.h>
int *p, next(int n);
int isprime(int n) {
int *q=p;
for (; *q && *q * *q <= n; q++)
if (n % *q == 0) return 0;
return 1;
}
int next(int n) {
do n++;
while (!isprime(n));
return n;
}
void main() {
int N, i;
scanf("%d", &N);

p = calloc(N, sizeof(int));
for (i=1, *p=2; i < N; i++)
p[i] = next(p[i-1]);
printf("%d\n", p[N-1]);
free(p);
}
>>747
配列禁止だっていっただろーが
なめてんのか?
749739:02/10/18 16:36
クソォ、ネタにデバッグしてしまった。動作確認済みだ。
#include <stdio.h>
int main(void)
{
    int sosu[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
    int i;
    printf("#include <stdio.h>\n");
    printf("int main(int argc, char **argv)\n");
    printf("{\n");
    printf("\tint n;\n");
    printf("\tif(argc != 1 && (n = atoi(argv[1])) == 0)\n");
    printf("\t\treturn 0;\n");
    printf("\tswitch(n) {\n");
    for(i = 0; i < sizeof sosu / sizeof *sosu; i++)
        printf("\tcase %3d: printf(\"ソスウハ %8d デス\\n\"); break;\n", i + 1, sosu[i]);
    printf("\t}\n");
    printf("\treturn 0;\n");
    printf("}\n");
    return 0;
}
>>748
どの辺りに配列が?
#include <stdio.h>
#include <stdlib.h>
int *p;
int isprime(int n) {
int *q=p;
for (; *q * *q <= n; q++)
if (n % *q == 0) return 0;
return 1;
}
void main() {
int N, *q;
scanf("%d", &N);
p = calloc(N, sizeof(int));
for (q=p, *q++=2; q < p+N; q++)
for(*q=*(q-1); !isprime(++*q);)
;
printf("%d\n", *--q);
free(p);
}
>>750
確かに厳密に言えば malloc() の返すメモリ領域と配列は違うけど、
それなら (・∀・)エラトステネスゥ!! で OK だろ。
#include <stdio.h>
#include <stdlib.h>
void main() {
int N, *p, *q, *r;
scanf("%d", &N);
p = calloc(N, sizeof(int));
for (q=p, *q=2; ++q < p+N;)
for(*q=*(q-1)+1, r=p; *r * *r <= *q;)
if (*q % *r++ == 0) ++*q, r=p;
printf("%d\n", *--q);
free(p);
}
配列じゃなく、動的に確保した使えという宿題じゃないのか?
>>705が配列も動的確保もなしにやってるよ。
今やってるのはネタなんじゃない。
char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,34,s,34);}
みたいなのってあるけど、AがBを産んでBがAを産むっていうのは作れる?
ちょっとは考えたけど作れなかった。
同様にn世代後が自身であるようなコードの生成法ってあるんかな。
プログラムではないが More Programming Pearl にあった方法。

% echo hoge | gcc -xc -
:2: syntax error at end of input
% echo hoge | gcc -xc - |& gcc -xc -
:1: syntax error before `:'
% echo hoge | gcc -xc - |& gcc -xc - |& gcc -xc -
:1: unterminated character constant
% echo hoge | gcc -xc - |& gcc -xc - |& gcc -xc - |& gcc -xc -
:1: syntax error before `:'
%
>>756
> AがBを産んでBがAを産む

のはわからないが、その知識がこれっぽっちも役に立たないのはわかる。
759デフォルトの名無しさん:02/10/18 23:09
>>758
#include <stdio.h>

main(){
fprintf("#include <stdio.h>\n\nmain(){}\nreturn 0;\n}");
return 0;
}
イメージとしては、こんなやつか。
コツが分かれば出来るってやつかもな。
スゲー大雑把。
760デフォルトの名無しさん:02/10/18 23:24
>>678
用語訂正ありがd。
14時間も答えをもらえずにいる可愛そうなわたす>>673
>>760
>>671>>673を良く見比べてみろ
俺も分からないけど、

>>758が哀れなのと
>>759があわて過ぎ

なのは分かった。以上。
763758:02/10/18 23:58
>>759
> fprintf("#include <stdio.h>\n\nmain(){}\nreturn 0;\n}");
warning C4133: 'function' : 'char [41]' と 'struct _iobuf *' の間で型に互換性がありません。
error C2198: 'fprintf' : 実引数が少なすぎます。

というのは茶々だけど。
漏れが訴えたいのは、実現できるかどうかではなくて、いかに役に立たないかだ。
764デフォルトの名無しさん:02/10/19 00:10
Cをはじめて10日ぐらいの初心者です。何度読んでも消えない疑問が
ありまして、どうか教えてください。参考書によるとintは整数の
-32768から32767までの値の範囲しか扱えないとなっているのですが、
試しに下のプログラムを実行すると100000000という数字も表示できて
しまいます。下のプログラムは数を表示するだけという簡単なものなの
ですが、なんで表示できるのですか? 初歩的な質問ですみません。
でも気になってしかたないです。

#include <stdio.h>
void outnum(int num);
int main(void)
{ outnum(100000000);
return 0;}
void outnum(int num)
{
printf("%d", num);
}
>>760
673 の質問にレスがつかんのは、何を訊いているのか全然わからんからだ。
678 の訂正をそのまま適用してもな。

それは、提示している前提条件 1 ↓

> m1[1][2] char型の値
> ってのは、
> char m1[];
> ってやっといた時の、m1[2]ってことですよね。

および前提条件 2 ↓

> で、両方使うには、両方宣言しとく必要があるってことですよね。
> char *m1[];
> char m1[];
> って。

がそもそも間違っているのと、その事柄が質問 ↓

> なんで、>>671さんは、配列名をm1とm2に分けてるんですか。

にどう繋がるのか不明だからだ。
ついでに言うと、

> 可愛そうな

字も間違っている。
>>764 まず、sizeof(int) が何バイトか調べよう
767デフォルトの名無しさん:02/10/19 00:13
#include <stdio.h>
#include <stdlib.h>
int
isprime(int n)
{
int i;
for (i=2; i < n; i++)
if (n % i == 0)
return 0;
return 1;
}
int
main()
{
int N, i, n;
scanf("%d", &N);

for (n=2, i=1; i<N; i++)
for (n++; !isprime(n); n++) ;
printf("%d\n", n);
return 0;
}
7682147483647:02/10/19 00:20
outnumでどこまで扱えるかやってみたら?
その限界を二進数表記にして考える。
マイナスの限界も同じように考える。
unsigned int でもやってみる。
参考書の初版日を見てみる。
>>764
intの表現できる範囲は環境に依存している。
ただし、規格では少なくとも16bitの大きさがなくてはならないとなっているので、
-32768〜32767までしか扱えないというのは、正しくなくもない。
移植性を考えたら、intを使うときはせいぜいその範囲までにしとけとは言える。

ただ、その参考書はそういうことを言いたいのかというとたぶん違うだろう(w
おそらくDOSの時代に書かれた物じゃないかな。
DOSはintが16bitだったので、DOSしか考えてないのならそういう表現になる。

windowsやPC-UNIX系だとintのサイズは大抵32bitなので、
100000000だってintで表現できる。
>>764
それは参考書が嘘つきです、すぐに燃やして別の参考書に変えてください。

int というデータ型は、使っているコンパイラによって扱える大きさが変わります。
int の大きさは、sizeof(int) の値を調べるとわかります。

#include <studio.h>
int main()
{
  printf("%d\n", sizeof(int));
  return 0;
}

sizeof 演算子はデータのサイズを導き出すので、これで int のバイト数が出ます。
1 バイトは大抵 8 ビットなので、これに 8 を掛ければビット数になります。
そのビット数で 2 のべき乗をとって 2 で割ると、int で扱える範囲がわかります。

例えば上記プログラムの結果が 4 だとすると、4 バイト × 8 = 32 ビット、
2 の 32 乗 = 4,294,967,296、これを半分にして 2,147,483,648。
この場合、int で -2,147,483,648 〜 2,147,483,647 を扱えます。
(上限の値は、さらに -1 します)

あなたの見た参考書は多分 sizeof(int) = 2 ど限定していますが、それは間違いです。
補足しておくと、負の値が2の補数表現なのか1の補数表現なのかで、
範囲は微妙に変わってくる。この辺は調べてみてほしい。
772770:02/10/19 00:33
>>771
ありがd、それを書き忘れた。
>>770
> 1 バイトは大抵 8 ビットなので、これに 8 を掛ければビット数になります。

limits.hをインクルードしてCHAR_BITSをかけるのが確実じゃない?
まあ8bitじゃない環境なんて滅多にお目にかかることはないと思うけど。
あとさ、扱える数もlimits.hのマクロを見ればいいと思う。


774764 :02/10/19 00:41
>766 >768 >769 >770 >771
ありがとうございます。みなさんのわかりやすい説明のおかげで
ほとんど理解できました。2進に直して計算してみました。
ああ、そうなのかと納得です。たんへん助かりました。
それと参考書とは間違ったことは書かないが完全な正解を書いている
とも限らないということを知れました。
>>774
> 間違ったことは書かないが

なこたーない。
さすがに言語の開発者が書いたものならないかもしれないけど。
1byteが8bitでなかったアーキテクチャって具体的にはなにがあるんでしょ?
googleしまくったけど、どういう語で引いたらいいのかわかんないです。
777765:02/10/19 01:16
>>673=>>760
それぞれメモリイメージ的に、

  m1       m1[0]   m1[1]   m1[2]   ...
┏━━━┓  ┏━━━┯━━━┯━━━┯━━━
┃char*[]┃→┃char * │char * │char * │・・・
┗━━━┛  ┗━━━┷━━━┷━━━┷━━━
            │   │   │  m1[2][0] m1[2][1] m1[2][2] ...
            │   │   │  ┏━━━┯━━━┯━━━┯━━━
            │   │   └→┃ char .│ char │ char .│・・・
            │   │      ┗━━━┷━━━┷━━━┷━━━
            │   │  m1[1][0] m1[1][1] m1[1][2] ...
            │   │  ┏━━━┯━━━┯━━━┯━━━
            │   └→┃ char .│ char │ char .│・・・
            │      ┗━━━┷━━━┷━━━┷━━━
            │  m1[0][0] m1[0][1] m1[0][2] ...
            │  ┏━━━┯━━━┯━━━┯━━━
            └→┃ char .│ char │ char .│・・・
               ┗━━━┷━━━┷━━━┷━━━

  m2       m2[0]   m2[2]   m2[2]   ...
┏━━━┓  ┏━━━┯━━━┯━━━┯━━━
┃ char[].┃→┃ char .│ char │ char .│・・・
┗━━━┛  ┗━━━┷━━━┷━━━┷━━━

となる。
778777続き:02/10/19 01:16
m1[1][2] と m2[2] が全く違う場所を指しているのがわかるか?
どうして同じだと思ったんだ?
まさか、「データ型が一緒だから」 なんて言わないよな?

もし m1[1] == m2 だったら m1[1][2] == m2[2] は成り立つのだが、>>671
そういう事を意図していないし、>>673 もそうだろう?


> で、両方使うには、両方宣言しとく必要があるってことですよね。

両方使うには、両方宣言しておく必要がある、それは正しい。
しかし、↓

> char *m1[];
> char m1[];
> って。
> なんで、>>671さんは、配列名をm1とm2に分けてるんですか。

どうしてそんな風に宣言させようとするんだ?
779778続き:02/10/19 01:17
ポインタ変数 *p と p[] は、全く同一だ (ただし [] 内に数字を指定した場合を除く)。
とすると、

  char *m1[];
  char m2[];



  char **m1;
  char *m2;

という意味だ。
見ての通り、それぞれ違う型になる。

で、あなたは、別々の型を説明する時も、同じ名前で説明するのか?
例えば、

  short m1;
  long m1;

みたいに書くのか?
それでは混乱するし、実際のソースコードにそのように並べて書けば当然ながら
コンパイルエラーになる。

一体、「両方使うには」 ってどんな使い方を想定したんだ?
ASCII マシンは 7-bit ワード。
781デフォルトの名無しさん:02/10/19 01:23
>>779
ちょっと待て、どんなコンパイラを使っているのかしらんが、char m2[];はコンパイルできないだろ。
セミコロンがついているから仮引数じゃないだろ?
>>781
K&R形式ならありえる。
# とか読まずに書いてみるテスト。
>>781
確か

extern char m2[];

みたいな形は出来るようなことが前のほうで書いてあったような気がしないでもない。
784デフォルトの名無しさん:02/10/19 01:39
>>782
確かに(笑)

>>783
それは俺も見た。
でもそれならexternをつけるだろ。
785779:02/10/19 01:42
>>781
ああ、ローカルでは書けないね。
仮引数とグローバルには書ける。
>>784
extern 要らんだろ。
787779:02/10/19 01:45
何かアフォな事を口走っているような。 < 漏れ
わ、まじだ。グローバルならint a[];とかってかける・・・
でもグローバル変数の場合はint a[]はint *aとは同じにならないみたい。
sizeofの結果が違うし・・
789788:02/10/19 01:49
基本がなっていないのかな・・・・
790788:02/10/19 01:51
int a[];と書いたらextern int a[];と書いたのと同じになるんですか?
>>790
ならない。不完全な型になる。要素数を1と仮定する処理系もある。
792デフォルトの名無しさん:02/10/19 02:08
>>777->>779さま、さまさま
感激です。泣けてくるほど。
この可s/愛/哀/想な>>673=>>760のために、こんなに詳しく
説明いただいて、何とお礼を言ったらいいのか。
>一体、「両方使うには」 ってどんな使い方を想定したんだ?
これなんですけど、自分でもしまったと思ったんです。
char m1[]; とやっといてから、すぐ、*m1とか使えちゃうので
すが(これは時々練習してます)、char *m1; とやっといてから、
m1[3]とかやれるのかなぁという疑問がわいて・・・
もう一度、いや保存して何度もご説明を読んで理解します。
その他の関連レスをいただいた皆様にもお礼。「レー」というキャラです:
   ∧_∧
  ( *゚ー゚ ) ヒーフー♪
  ι ⌒ヽ.
  (____.つ つ
age
794デフォルトの名無しさん:02/10/19 12:36
質問です。
キーボードから入力されたものが
整数であるかどうかを判別したいのですが
どうもうまくいきません。
はじめscanfを使っていてうまくいかなかったので
いろいろ調べたらscanfは使わずにfgetsとsscanfを使えと
書いてありました。
それらを使って文字を取得して、
isdigitで整数か判断しようと思ってたのですがうまくいきません。
どなたか入力されたものが整数かどうかを
判別するサンプルプログラムを見せてもらえませんか?
>>794
strtoint
検索しろよ
boost::lexical_cast
798デフォルトの名無しさん:02/10/19 12:50
for(i = 0; s[i]; ++i) if(!isdigit(s[i])) break;
if (s[i] == 0 ) puts("整数");
else puts("整数でない");
strtointってはじめて見たような・・・
atoi?
まだまだ足りないと思う。実数であるかどうか??
全角だと動かない罠
>>799
標準じゃない。strtolかstrtoulの間違いだろ。
802794:02/10/19 13:11
>>795さん
strtointでできるんですか?

>>798さん
ありがとうございます!
if (s[i] == 0 ) の条件式の意味がわかりませんが
もう少し調べて考えてみます。

>>799さん
atoiだとエラーチェックができないらしいので
今回の目的には使えない関数だと調べた結果思うのですが。
実数だと小数も入ってしまうので・・・。
803名無しのジョー:02/10/19 13:40
下らない質問でスンマソンですが、、

なんで"Math.h"のときだけコンパイルのときにリンク指定の
"-lm"オプションをいちいち付けなくてはいけないのですか?
>>803
libm の関数を使う場合に必要。-lhoge は libhoge をリンクしろという意味。
>>802
>>>798さん
>ありがとうございます!

fgets()で読み込んだ文字列には改行コードがついてるから、
それでチェックするときは、気をつけるようにな。
s[i] == 0 は文字列の終端かどうかの検査。つまりbreakしなかったことの検査。
for の終了条件も同様。>>794 に fgets() でとった文字列と書かれているので、
s が '\0' で終端していることが仮定されているのだろう。
>>797
このスレで boost は OK か?
うん
809794:02/10/19 14:56
>>805さん
改行コードですか。
わかりました!気をつけます。
>>806さん
あぁなるほど!\0でチェックしてるんですか。
よくわかりました!
810名無しのジョー:02/10/19 15:31
Cの計算結果を表示させてみたら"nan"という文字がでてきてしまうのですが、これって計算不能って結果なのでしょうか?(オーバーフロー等が原因で??)

それともなにか違うことを示している記号なのでしょうか??
812デフォルトの名無しさん:02/10/19 15:49
JAVAはCのサブセットだと授業で聞いたのでこちらで質問してもいいでしょうか?
JAVAで関数の引数でオブジェクトを渡すときすべて参照渡しになり、値が書き換えられる可能性があるのですが書き換えられないようにするにはどうすればいいのでしょうか?
Cのサブセット・・・その授業は話半分に聞いとけ。
>>812
> JAVAはCのサブセットだ
それが間違い。教官が嘘をついたか、あなたがきちんと話を聞いていないかのどちらか。
こっちで訊け→ http://pc3.2ch.net/test/read.cgi/tech/1034303501/
質問です。C言語でウエブファイルを取り込まず音楽を流したいのですが。
music( 楽器名 , 音の高さ , 音の長さ );とか
ヘルツを実引数にして音を出すような関数はあるのでしょうか。
どなたかお教えください。
あと、林晴比古著書の改訂新C言語入門応用編と言う本で
<conio.h>のoutp()とinp()でできると載ってたので使ってみましたが、
未解決らしいくダメでした。テキストに関数を記述するときは
仮引数のデータ型などが出てきて普通に使えそうな感じなのですが。
サウンドデバイスをバシバシ叩く
壊れました。
叩くってどういう意味っすか?
>>815
バーカそんなもんネーヨ。HSPでも使っと毛。
はげ同
>>815
Cには無い。
OSのAPIに用意されているかも。
WinAPIスレとかmacスレとか(あるのか?)で聞いてみ?
union
{
    void *ptr_value;
    int int_value;
} elem;
64bitマシンへの移植を考えたときにこのようなコードは
やっぱりダメなんですよね?
>>822
ポインタをファイルに保存するようなバカなことしない限りコンパイルし直しで解決しないの?
>>823
でもUNIXではintは32bitのままですよ?
>>824
不都合でもありますか?
826デフォルトの名無しさん:02/10/20 10:51
>>825
ptr_valueに代入してint_valueを使うときとか?
>>826
そんなもん、元々移植性がないぞ。
YYYYMMDD 形式の日付の足し算引き算をする場合ってどうします?
どっかに library とかありそうなんだけど探しても見つからない。
みなさん自前の library とか作ってますか?
C言語で画像を扱うにはどうしたらいいですか?
教えてください
830ふぅ〜 ◆H4WUd.B4JE :02/10/20 13:07
>>829
C言語は基本的にメモリー上のバイトデータをいじることに
専念する言語だからそういう個別の環境に左右される入出力
は、お前の環境のAPIスレに聞け!
831もまずにパピコ:02/10/20 13:23
>>828
difftime使えや〜
2038年問題あるけど
>>829
まずはfopenで画像ファイルを開け。
>>832
開いた後、どうすれば表示されるのか教えていただけませんか?
>>830
今APIについて調べています。レスありがとうございました
834デフォルトの名無しさん:02/10/20 13:52
即値ってなんですか?
 レジスタに定数を設定する時、その定数のこと。
例: 「AXに5を即値で入れる。」
836デフォルトの名無しさん:02/10/20 14:01
>>835
メモリーから読みとらないってことですか?
>>836
レジスタからも読み取らない。
簡単に言うと、実行時に値が変わることはまず無い数値。
>>836
プロミネンスはそこにはないが、
まぁ、その理解でもかまわない。
>>833
次はそのファイルをfcloseで閉じてみろ。
840デフォルトの名無しさん:02/10/20 16:13
めもり〜くり〜な〜のようにメモリを掃除するのってどうやるんですか?
あれはHSPだけど、C言語でもできますよね。
教えてください。よろしくお願いします。
嫌。ググったら簡単に答えが返ってくる。
char *p;
p=(char *)malloc(255*1024*1024);
if(p){
memset(p,34,255*1024*1024);
free(p);
}
>>842
何故に、34 なんだ ?
自分の年齢じゃないの?
>>842
普通 0xCC だろ? NT はそうだ。
それと malloc() + free() は駄目だ、プログラム終了まで確保したメモリーを
OS に返さない。

>>840
「メモリを掃除する」 ことはできない。
いきなり大容量のメモリを要求して、OS にメモリのデフラグメントをするように
誘いかけるぐらいしかできる事は無い。

BOOL CleanPhysicalMemory()
{
  MEMORYSTATUS MemoryStatus;
  HANDLE hHeap;
  LPBYTE lpByte;
  GlobalMemoryStatus(&MemoryStatus);
  hHeap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
  if(!hHeap)
    return FALSE;
  lpByte = (LPBYTE)HeapAlloc(hHeap, HEAP_NO_SERIALIZE, MemoryStatus.dwTotalPhys);
  if(!lpByte)
    return FALSE;
  FillMemory(lpByte, MemoryStatus.dwTotalPhys, 0xCC);
  HeapDestroy(hHeap);
  return TRUE;
}
>>845
AA55
>>846
16-bit 単位でパージするならそれのがいいけど・・・。
8-bit 単位なら 0xCC じゃない?
>>845
> それと malloc() + free() は駄目だ、プログラム終了まで確保したメモリーを
> OS に返さない。
75点。
>>829
3,4つ前の同じスレでどなたかに教えていただいたコードです。
ドス窓に壁画します。どれがどの効果か詳しくは解りませんが、参考にしてください。

#include   <windows.h>
#include   <stdio.h>
#include   <conio.h>

BOOL   IsWindows9x(void)
{
  return   (GetVersion()>=0x80000000);
}

int   main(void)
{
  HWND   hWnd;
  HDC   hdc;
  char   szOldText[80],szId[32],szTemp[32];
  int   x,y,X,Y,R,G,B;
  char   suraimu[][10]={"000010000","000010000","000010000","000111000",
  "001111100","011313110","112111211","111222111","011111110",};
>>849の続き

/*グラフィックを使うための初期処理?*/
  GetConsoleTitle(szOldText,sizeof(szOldText));
  wsprintf(szId,"grph%08X",GetTickCount());
  SetConsoleTitle(szId);
  do
  {
    Sleep(100);
    GetConsoleTitle(szTemp, sizeof(szTemp));
  }while(lstrcmp(szId,szTemp));
  if(IsWindows9x())
    hWnd=FindWindowEx(NULL,NULL,"tty",szId);
  else
    hWnd=FindWindowEx(NULL,NULL,"ConsoleWindowClass",szId);
  SetConsoleTitle(szOldText);
  if(IsWindows9x())
    hWnd=FindWindowEx(hWnd,NULL,"ttyGrab",NULL);
  hdc=GetDC(hWnd);
/*ここまで*/
>>850の続き

/*グラフィック表示*/
/*基本は SetPixelV() ( hdc 固定 , x座標 , y座標 , 色 )の点を打つ
色は RGB() の戻り値を使ってもいいし 0xFF00FF みたいにしてもよい
その場合は赤緑青の向き(見た目)が逆になる
あらかじめ配列に入力しておくと 絵を描けます*/
  for(Y=0;Y<=8;Y++)for(X=0;X<=8;X++)for(y=0;y<=8;y++)for(x=0;x<=8;x++)
  {
    switch(suraimu[Y][X])
    {
      case '0':R=0;G=0;B=0;break;
      case '1':R=0;G=0;B=255;break;
      case '2':R=255;G=0;B=0;break;
      case '3':R=127;G=127;B=127;break;
    }
    if(suraimu[y][x]=='1')
      SetPixelV(hdc,x+X*10+100,y+Y*10+100,RGB(R,G,B));
  }
/*ここまで*/

/*グラフィックの使用を終了するための処理?*/
  ReleaseDC(hWnd, hdc);
/*ここまで*/

  printf("何かボタンを押してください     終了します");
  getch();
  return 0;
}
>>848
あとの 25 点は何が足りない?
853デフォルトの名無しさん:02/10/20 20:47
日本情報処理教育普及協会主催C言語プログラミング能力検定試験1級
という資格は社会でどれくらい認められていますか?
就職有利になったりするもんでしょうか?
>>853
履歴書を埋めるのに使えるよ。
C言語だけは絶対使ない。
理由は大嫌いだから
C言語プログラミング能力検定試験でぐぐってみろ。
>>854
それはいいところに気がつきましたね
>>855
で、それがどうかしたのか。
使ない->使えない
>>855は日本語も使ないと。
お答えありがとうございました。

>>816
サウンドデバイスというのをキーワードに追加し検索してそこでゲットしたキーワードを
また追加して調べたところいくつか見つけることができました。
ただ、機種によってヘルツや音の長さが違うらしいものや
アセンブラが絡んでくるものなので、もう少し調べてみます。
あと追加の質問ですが、さっきのドス窓壁画みたいに始めにハンドル処理をやり
そのあとは簡単に使えるみたいなのがあるなら、どなたかお教えください。

>>819
HSPは確かによさそうですね。まだ音出力のところは見ていませんが、
カーソル移動や色変えなど簡単にできるようなのでおっしゃるとおり簡単にできそうな気がします。
ベーシックは見たことしかありませんでしたが、ベーシックの行番号無しみたいなやつかな。
テキスト実行位置の移動がgotoだし。テキストエディタのバックも黒いし。
環境や移植性などをめんどくさいと思い、ただプログラムでゲーム作ってる僕にぴったりなような気もします。
ちなみにHSPのアドレスはこちら。
http://www.onionsoft.net/hsp/ ダウンロードできます。フリーソフトです。
http://oyabunn.hp.infoseek.co.jp/index.html 講座が解りやすいです。
862もまずにパピコ:02/10/20 21:03
>>860
理由は大嫌いだから。
A garbage collector for C and C++
http://www.hpl.hp.com/personal/Hans_Boehm/gc/

w3mなどで使われているガーベッジコレクタですが、使っている人はいますか?
自分が本格的に利用する前に、他の人の感想など聞きたいです。
つまり、>>855は日本嫌いのチョンだと。
>>863
C/C++はガベコレが無いのが利点なのだから使うなよ。
866デフォルトの名無しさん:02/10/20 21:16
867デフォルトの名無しさん:02/10/20 21:27
>>865
激しく同意
>>865
激しく同意。
ガベコレを使う奴は堕落している
shared_ptr<>で十分。
GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞
GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞
GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞
GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞
GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞
GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞
GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞
GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞GCは糞
871デフォルトの名無しさん:02/10/20 21:48
w3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリ
w3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリ
w3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリ
w3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリ
w3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリ
w3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリ
w3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリ
w3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリ
w3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリw3mは糞アプリ
872デフォルトの名無しさん:02/10/20 21:53

                              /\
                            / 神 \── まつもとひろゆき
                          / ̄ ̄ ̄ ̄\
                        /   神官    \── るびきち
                      / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
                    /       貴族        \── その他Rubyハッカー
                  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
                /         平民         \── Rubyユーザ
              / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
            /             賤民            \── Ruby初心者
          / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
        /               奴隷              \── Ruby厨房
      / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
    /                  畜生                 \── プログラミング未経験者
  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
/                       糞尿                    \── 他言語(C,C++Perl,Python,Java,Delphi)などのユーザ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
>>872 まつもと「ゆきひろ」だろ。Ruby信者失格
まつもと"ひろゆき"(汗
875デフォルトの名無しさん:02/10/20 21:56
>>872
ちょっとー!
神聖なCをPerlやJava,Delphiなんかと一緒にしないでよー!
じゃあ、続きはマ板で。
>>849の「壁画します」って仲間うちで流行らせてもイイですか?
一つ確かなことがある。
GCのある言語は糞、ということだ!
じゃあCは糞か。
37 名前:デフォルトの名無しさん :02/10/12 11:52
アホばかりだ。
>>879
違うだろ。
「GCがあるからいいや」と適当なコードを記述するヤツが糞なだけだろ。
馬鹿が鋏持ったって使えないってことだ。
883829:02/10/20 22:22
>>849
ありがとうございます
先が見えてきたようでかなり嬉しいです

もう一つ質問させてもらいたいのですが
windows.hとconio.hについて解説されたページ、あるいは書籍などを教えていただけませんか
お願いします
>>883
http://www.google.co.jp/search?hl=ja&lr=lang_ja&q=window%2Eh
このあたりのページがお勧めだねぇ
>>882
禿同。Lisp は、まともな言語だ。
886デフォルトの名無しさん:02/10/20 22:42
Ruby >>>>> Lisp
>>886
スレ違い
888Zetton ◆2ioLXWs4uc :02/10/20 23:21
CプログラマになるにはK&Rは登竜門なんでしょうか?
個人的にはコーディングが好きじゃないし、結構難しい。
if(){
処理
}else{
処理
}
あとインドにはプログラマーが沢山いると聞いたことがあるんですが
どうなんでしょうか?
(キーボードが黄色く黄ばんでそう。)
>>888
コテハンで、コピペとは恐れ入ったよ。

***すれ立てるまでもない質問はここで 第23刷***
http://pc3.2ch.net/test/read.cgi/tech/1034088067/754
890manko_chinko ◆GLc2rpKRNM :02/10/20 23:24
>>888
> (キーボードが黄色く黄ばんでそう。)
やはりキーボード叩くときも左手は使わないんでしょうか。
891Zetton ◆2ioLXWs4uc :02/10/20 23:25
>>889
コピペじゃないし。
>>891
威張るな。
コピペだろうがそうでなかろうが、888 が痛い事に変わりは無く。
>>888
> あとインドにはプログラマーが沢山いると聞いたことがあるんですが
>>890
> やはりキーボード叩くときも左手は使わないんでしょうか。

スレ違い。
894Zetton ◆2ioLXWs4uc :02/10/20 23:31
>>889
ゴメンほんとだ。2重カキコしてた。
仰天するほど初歩的なことですが教えてください(涙

unix上でc言語を使っているんですが、
ユーザーからの入力受付のscanfを使うと
パスワードを入力したときに人に見られてしまいます。
簡単に*マークに変える方法はないでしょうか?
もしくは、人にばれないようにする方法はないでしょうか?
>>895
cursese
>>895
scanfを使わないところから始めよう
char *getpass(const char *prompt) <unistd.h>と書こうと思ったらobsoleteになってた。

cursesでnoecho()すr
>>895getpass
getch()
>>895 タブとか入力しないでください。Enterで終了、BackSpaceで戻る。
#include   <stdio.h>
#include   <conio.h>
int   main(void)
{
  char   buf[256];int   p,key;
  for(p=0;p<=255;p++)   buf[p]=0;
  printf("パスワードを入力してください\n");
  for(p=0;;)
  {
    if(kbhit()!=0)
    {
      key=getch();
      if(key==8&&p!=0)
      {
        p--;
        buf[p]=0;
        printf("\b \b");
      }
      else   if(key==13&&p!=0)   break;
      else   if(key!=8&&key!=13)
      {
        buf[p]=key;
        printf("*");
        p++;
      }
    }
  }
  printf("\n入力されていたパスワード\n%s\n何かボタンを押してください  終了します",buf);
  getch();
  return   0;
}
>>901
UNIXだっていってんだろうが。
それと8だとか13だとかわかりにくい数字を書くな。
> for(p=0;p<=255;p++) buf[p]=0;
memset(buf, 0x00, sizeof(buf)/sizeof(char))かな。
せめてbzero使え。
904デフォルトの名無しさん:02/10/21 01:13
>>903
sizeof(buf)/sizeof(char)

なにこれ?素直にsizeof bufでいいじゃない。
1で割っても割られる数は変わらない。
905903:02/10/21 01:14
しまった、
s%/sizeof(char)%%でよろ。
>>901
もちっとマシなコードを書け。
>>906
そういうあんたはどうなんだ?

と言いたいところだけど、実際この人うまいコード書くからなぁ・・・
908!903:02/10/21 01:23
>>904
>1で割っても割られる数は変わらない。
sizeof(char)って、1であることが保証されてるの?
>>903
祖父の遺言でbzeroは使えません
>>908
保証されている。
charが8bitであることは保証されていないが、1バイトであることは保証されている。
911908:02/10/21 01:29
>>910
ありがとん。

>>909
memset

>>903-905
訂正が間に合ってない903に、ややワロタ。
>>907 参考にしたいので、スレのアドレスなど希望
ありがとう
●持っていないので今は読めないが、覚えておくよ。
C言語でpop3クライアントを作りたいのですが
参考になるページはあるでしょうか?
>>915
このスレをpop3で検索してごらん?
>>916
>>915に来るぞ…。
>>917
しまった!
ごめん
俺が悪かった
http://x68000.startshop.co.jp/~68user/net/
919917:02/10/21 03:23
>>918
ワロタ
>>907
> と言いたいところだけど、実際この人うまいコード書くからなぁ・・・
どこでバレたんだ!?と思ったけど、

>>913
このハンドルは一人じゃないよ。

901は、マジックナンバーとかビジーループとか端末制御コード決めうちとか
同じ判定を二度繰り返すところとか、気に入らんところが多かったので。
浮き上がるストレートはネタ師だから相手にしちゃダメだよ・・・
最近ゲー作板にも出没してて突っ込みレスでスレが流されてる
>>920
> このハンドルは一人じゃないよ。
つまり、どこかの板のデフォルトハンドルってこと?
うに板の期間限定名無しハンドル
アフォルト?
a fault
アフォ
scanfは駄目だといわれるけど何故ですか?
お願いします教えてください
あと、駄目なところの解決方法もよければ教えてください
930デフォルトの名無しさん:02/10/21 21:53
C言語を使って円を書きたいのですが、どうすればいいですか?
Cだけでは不可能です。
>>930
#include <stdio.h>
int main()
{
 printf("○\n");
 return 0;
}
fprintf(fp,"円");
#include <stdio.h>

int main()
{
  printf("\\");
  return 0;
}
935デフォルトの名無しさん:02/10/21 22:03
>>934
バックスラッシュ?
>>930
わかったから、機種、OS書け。
937930:02/10/21 22:07
>>936
x10です
#include<stdio.h>
#define RADIUS (10)

int main(){
int x, y, dx, dy;

for(y = 0; y < RADIUS*2; y++){
dy = RADIUS-y;
for(x = 0; x/2 < RADIUS*2; x++){
dx = RADIUS-x/2;
if(dx*dx +dy*dy < RADIUS*RADIUS){
printf("*");
}else{
printf(" ");
}
}
printf("\n");
}

return 0;
}
939930:02/10/21 22:18
>>938
まじめに答える気がないのならレスしないでくださいよ。
>>939
> まじめに答える気がないのならレスしないでくださいよ。

>>938 が今までで一番まともだと思うが ?
x10ってwww.x.orgの?
942くの一:02/10/21 22:33
x10てAugas、CLUの?
x10ってAppleの?
x10て、X-GNUの親戚でつか?
x24はいいノートPCれす
うちは X11 です。
>>946
もしや外出? >>941
うちはX10Turboです。
10代目になります。
X11/Xlib.hですか?
950デフォルトの名無しさん:02/10/21 23:09
942〜949は一人の人による書き込みです。
ところで次スレは
952デフォルトの名無しさん:02/10/21 23:18
>>951
アタシが立ててくるわ
953デフォルトの名無しさん:02/10/21 23:20
もう建てなくていいよ。
長らく続いていたけどもう存在意義が無くなってきたので今回で終わりにしよう。
>>952
よろしく。
タイトル:既出ネタをループさせるためのスレ
ローカルルール:初心者お断り
957デフォルトの名無しさん:02/10/21 23:32
このスレの住人は質問するほうも答えるほうもみんな初心者だと思うが・・・
>>957
そうでもないと思うが。
初心者な質問しかこないというのはあるな。
そんなことはない! ROMっている漏れは上級者だ!
最上級者
962デフォルトの名無しさん:02/10/22 00:57
こんなことを聞くのもなんですが、getcharとかprintfとかを練習してて、
それで本格的なプログラミングができるまでに成長できるんですか?
>>962
それ使えば囲碁プログラムくらいなら作れるぞ。
printfの読み方はブリントフですが何か?
ずっとブリーフだと思ってました!
966うんもっこ:02/10/22 02:59
 1以上100以下の整数値を入力せよというメッセージを表示し、整数値nを読み、その値を添字とする
フィボナッチ数列の値、anを計算し、表示し、終了するプログラムを教えてください。
ただしa1=1、a2=1、an+2=an+1+anです。範囲以外の数値を読み込んだら、1以上100以下の整数値を
入力せよというメッセージを表示して、入力を待つ
967デフォルトの名無しさん:02/10/22 03:27
>>966
int fibonacii( int n ) {
int a = 1, b = 0;
while( n-- > 0 ) {
int t = a;
a += b;
b = t;
}
return b;
}

あとは自分で
>>967
やれやれ。
969920:02/10/22 11:18
>>924
> http://pc3.2ch.net/test/read.cgi/tech/1026793823/644 は 920 か?
ちゃうねん。
970 :02/10/22 11:54
ホーナー法により
  f(x)=1.1x^4+2.6x^3+0.5x^2-2.0x+1.0
のx=0.8のときの関数値f(0.8)を計算するプログラムを作ってください。
double x = 0.8;
printf("%f\n", 1.1*x*x*x*x + 2.6*x*x*x + 0.5*x*x - 2.0*x + 1.0);
972新スレ:02/10/22 15:52
C言語ならアタシに聞きなさい<36>
http://pc3.2ch.net/test/read.cgi/tech/1035211039/-4
973新スレ:02/10/22 15:52
C言語ならアタシに聞きなさい<36>
http://pc3.2ch.net/test/read.cgi/tech/1035211039/l50
974924:02/10/22 19:32
>>969
スマン、ネタだ
/*
* 755@「C/C++の宿題なら俺にやらせろ!」の解答例。
*/
#include <stdio.h>

unsigned long
powmod(unsigned long x, unsigned long y, unsigned long z)
{
  unsigned long r;
  for (r = 1; y; y >>= 1) {
    if (y & 1) r = r * x % z;
    x = x * x % z;
  }
  return r;
}

int main()
{
  printf("%lu\n", powmod(12345, 6789012, 34567));
  return 0;
}
>>975
何故ここに・・・
977デフォルトの名無しさん:02/10/23 20:11
新スレの方荒れてきたね
>>976
ちょっとしたいじわる。
つっても、もう少し単純な方法で満足しちゃったようだから意味ないけど。
(゚Д゚) A言語とかB言語とかあったのかな?
辞書ぐらい引け
982禿しくFuck:02/10/24 11:48
>>980
どっちもない。
B言語はあったが。

CPL(Combined Programming Language)->BCPL->B->C
983デフォルトの名無しさん:02/10/24 21:05
>>982

>どっちもない。
>B言語はあったが。

矛盾してるぞ。
全角のBは無いって言いたいんじゃないの(ほじほじ
プリントエフ or
プリントフォーマット
プリン豆腐
プリント不
A言語=アセンブラ
B言語=ベーシック

だろ。アホ誌ね >>982
5時言語とかは?
記念パピコV(^o^)V
American
992おいっす:02/10/25 00:19
C言語を学ぶために一番いい本はなんですか?
993デフォルトの名無しさん:02/10/25 00:21
自作関数ってなんだっけ…。
聖書
>>992
必読書スレは知ってるのに、ただ会話したいがために
質問するとは姑息な野郎だよ。
プログラミング言語 う足す足す 第三版
>>992
本の事なら ↓ に逝ってちょ
 推薦図書/必読書のためのスレッド PART 6
 http://pc3.2ch.net/test/read.cgi/tech/1033207156/l50

C の事なら ↓ に逝ってちょ
 C言語ならアタシに聞きなさい<36>
 http://pc3.2ch.net/test/read.cgi/tech/1035211039/l50



1001はもらった!


 
あれ?
10001001:02/10/25 00:24
面倒だから1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。