C言語なら、俺に聞け! <30>

このエントリーをはてなブックマークに追加
1ロートルしょーえい
漏れは54才、30年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことなら全てわかるから、疑問な点があったら漏れに聞け。
今なら平成デフレ記念3割引奉仕中だ。

スケジュールは真っ白だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。あと、至急仕事をください。


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/
推薦図書/必読書のためのスレッド PART4
http://pc.2ch.net/tech/kako/1022/10229/1022961238.html

前スレ <29> http://pc3.2ch.net/test/read.cgi/tech/1029605182/

コンパイラ、過去ログなどのリンクは>>2-5 あたり
過去スレ

28 http://pc3.2ch.net/test/read.cgi/tech/1028495798/
27 http://pc3.2ch.net/test/read.cgi/tech/1027160374/
26 http://pc3.2ch.net/test/read.cgi/tech/1026048820/
25 http://pc.2ch.net/tech/kako/1024/10249/1024918442.html
24 http://pc.2ch.net/tech/kako/1024/10240/1024033400.html
23 http://pc.2ch.net/tech/kako/1023/10230/1023024817.html
22 http://pc.2ch.net/tech/kako/1022/10224/1022402165.html
21 http://pc.2ch.net/tech/kako/1022/10220/1022045622.html
20 http://pc.2ch.net/tech/kako/1021/10214/1021459016.html
19 http://pc.2ch.net/tech/kako/1021/10214/1021459016.html
18 http://pc.2ch.net/tech/kako/1020/10202/1020260813.html
17 http://pc.2ch.net/tech/kako/1019/10193/1019372139.html
16 http://pc.2ch.net/tech/kako/1018/10184/1018453690.html
15 http://pc.2ch.net/tech/kako/1018/10184/1018453690.html
14 http://pc.2ch.net/tech/kako/1015/10152/1015286974.html
13 http://pc.2ch.net/tech/kako/1015/10152/1015286974.html
12 http://pc.2ch.net/tech/kako/1012/10123/1012348974.html
11 http://pc.2ch.net/tech/kako/1009/10094/1009499565.html
10 http://pc.2ch.net/tech/kako/1009/10094/1009499565.html
9 http://pc.2ch.net/tech/kako/1007/10072/1007272267.html
8 http://pc.2ch.net/tech/kako/1007/10072/1007272267.html
7 http://pc.2ch.net/tech/kako/1003/10034/1003418249.html
6 http://piza2.2ch.net/tech/kako/999/999617524.html
5 http://piza2.2ch.net/tech/kako/994/994908590.html
4 http://piza.2ch.net/tech/kako/992/992357382.html
3 http://piza.2ch.net/tech/kako/989/989929288.html
2 http://piza.2ch.net/tech/kako/979/979529893.html
1 http://piza.2ch.net/tech/kako/967/967985026.html
3デフォルトの名無しさん:02/08/31 18:36
>>1

もう用済み、逝ってよし!
【コンパイラ】
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

【その他】
http://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/prog/progf.html
http://www.bloodshed.net/index.html

【注意】
Cmachineは一般的なCと挙動が違いすぎるので動作の保証はできません。
まともな処理系を使いましょう。
迷惑です。
「ロートルしょーえい」って何?
少し漠然とした質問だけどちょっと聞いて。

C言語でBMPとかJPGファイルを読み込んだときに
色情報とか解像度とかの情報はどこから取るのよ?

書籍でグラフィックを扱うものはすべて独自のインクルードファイルを
用意してるんだがもし自分で標準インクルードファイルだけで処理するなら
どうすればいいの?
>1にはBCCを入れろとあれほど・・・
Show-A情報は こちらをクリック!

おまえら先輩がんばってる!未来のおまえ
http://pc.2ch.net/test/read.cgi/prog/1030262495/
>>7
自分で構造体定義するとかアライメントが心配なら
配列にしてアクセス用のマクロを定義すればいいじゃん
で、ふつーそういうのは複数のソースから使いまわすから
独自のヘッダファイルを作成したくなる
誰だってそうする俺だってそうする
だが断る
12サンプル盛り沢山:02/08/31 20:15
オカズにするなら、有料より『無料』!!
そんな貴方のために、できました⇒無料サイト♪
近親相姦・SM・人妻あります!!
http://www.traffimagic.com/WIPE7MMLZCA/comein/JPMVS
>>8
BCCなら>>4にあるだろ
14デフォルトの名無しさん:02/08/31 20:25
質問です。
2ちゃんでのウイルスっぽいのを含んだ文章で
ノートンが警告を出しまくってやぱいんですけど
どうすれば良いんですか?
>>14
激しくスレ違い。逝ってよし!
1614:02/08/31 20:32
>>15
これってC言語じゃないんですか?
なぜc言語だと思ったのか理由を述べよ
1814:02/08/31 20:38
>>17
プログラムが関係していそうだからです!
19:02/08/31 20:40
>18
なにをえらそうにw
おまえが行くべきところは
初心者板だ。
さっさといけ。
>18
ここに行け。
http://pc.2ch.net/test/read.cgi/sec/1025872269/l10
そして二度と帰って来るな。
21デフォルトの名無しさん:02/08/31 20:44
本当の14は俺なんだけどさぁ

俺に聞け!!とか調子の良い事いって
ちょっとぐらい違う事聞いたって気前良く教えてくれたっていいじゃないか?
心の狭い人間は先生嫌いです。
2214:02/08/31 20:46
>>21
うるせースレ違いな質問は厳禁なんだよ!
氏ね!
23デフォルトの名無しさん:02/08/31 20:51
/* C言語に関係ない話はお断りです。 */
/* ノートンはC言語と関係ないやさかい、この辺でやめといてや */
いっそ/*
267:02/08/31 21:04
>>10
ということは書籍のインクルードファイルを参考にすればいいのですね。
返答ありがとう。
>>13
たしか>>1に書かないと目に触れないから書けという流れだったような
29デフォルトの名無しさん:02/08/31 22:26
ロートルしょーえいってなんだYO!
あれ?2重投稿しちゃったかな
>>32
どっちかは俺のだよ。
ということは照栄ファンがここに2人か
VC++ですけど、たとえばary[8][8]という配列の先頭アドレスを
常に8バイトにアラインメントできませんかね・・・
3635:02/09/01 03:34
書き忘れですけど、char ary[8][8]です
設定、c/c++、コード生成、で
構造体のアライメントを設定できるが、それではダメなのか?
3835:02/09/01 04:07
構造体メンバのアラインメント、でいいんですか?
既定で8バイトになってますね。
ありがとうございました
39デフォルトの名無しさん:02/09/01 14:53
ちょっとお聞きしたいんですけど、いや、本当になんとなくな上にスレ違いなんですが
main() 関数の中に、自分の定義する関数以外ほとんど何も書かないプログラムって問題あるのですか?
例えば、
main(){
int cou[100]; char buf[256], buf2[256], buf3[256];
------------変数定義---------------
buf=mykansuu(cou[1],cou[2],cou[3],cou[4],cou[5],cou[6]);
buf2=mykansuu1(cou[1],cou[2],cou[3],cou[4],cou[5],cou[6]);
buf3=mykansuu2(cou[1],cou[2],cou[3],cou[4],cou[5],cou[6]);
}
char mykansuu(int i, int ni, int san, int yon, int go){
----------処理-----------
}
みたいな大量に変数を引き渡すプログラムと、自分で作った関数の中に何でも定義してあるプログラム。 ↓
main(){
int i; char c;
i=mykansuu();
c=mykansuu2();
}
char mykansuu(){
int no,cou=0,chu[1000],chunum=0;
FILE *from3,*temp4,*to3;
char list1[256],moji[256]="",kan[256]="",sho[20][256][50],ALLOCheader=0,BIOSheader=0,CONIOheader=0,CTYPEheader=0,DIRheader=0,DOSheader=0,GRAPHICSheader=0,STRINGheader=0,MATHheader=0,MEMheader=0,PROCESSheader=0,STDIOheader=0,STDLIBheader=0,TIMEheader=0;
--------------処理--------------
}
私は再利用が楽だから後者の方を多用しているのですけど、如何せんプログラムの行数が長くて
あまり評判がよくありません。 ご意見お聞かせください。
40デフォルトの名無しさん:02/09/01 15:04
>>35
は??
>>39
ていうか関数の作り方が…
mykansuu関数の中では何だ、配列を使ってないのか?
ひょっとして
char mykansuu(int *hoge);
とかじゃなく
char mykansuu(int a, int b ,int c ,int d, int e, int f);
とかなのか?
4239:02/09/01 16:39
>>41
推測でいうな。
そんな馬鹿じゃないもん
>>42
でも、そんな引数の渡し方してるように俺にも見えるが?
44本物の39:02/09/01 16:59
>41
そのマサカ(・ω・;;)デース。
って、細かいところに突っ込まないでくれ。 ヘタレですから。

で、結局、どっちが良いんでしょうか?
45デフォルトの名無しさん:02/09/01 17:21
staticの使い方の質問です。

あるモジュールにモジュール内の他の関数へのポインタを返す関数があって、
このモジュール内の他の関数は、外部からは必ずこの関数を介して
使われるようになっています。
この時、ポインタとして返される関数はstaticで宣言してもいいんでしょうか?
>>45
それで、いいんでない?
逆にスタティックにしないと、外部から遠慮なく呼ばれちゃうし。
>>45
良い。
というか隠蔽が目的ならそうすべき。
48デフォルトの名無しさん:02/09/01 17:40
>>39
呼ぶ側の関数から引き渡されなくても、
呼ばれる関数の中で解決できるものは、
呼ばれる関数の中でのみ扱うべきです。
49本物の39:02/09/01 17:48
>48
やった〜〜。 私は正しかった。
毎回、関数を呼びたびに定義行が3行くらいあるせいで、評判は悪かったんですけど、
やっぱりこっちのほうがいいんですよね。 ありがとうございました。
50デフォルトの名無しさん:02/09/01 17:50
ショウエイたん、マンセー
5145:02/09/01 19:04
>>46, 47 ありがとうございます。
52(`・ω・´) b ビシッ!!:02/09/01 20:36
C言語だけで、ウィンドウズのアプリを作ってる神みたいな人が
いるって本当なんですか?

C++使わないで?

嘘でしょ?すごく面倒くさくないですか?
最近だと, GTK+ってのがCで書ける. 他にもCで書けるGUI libraryは結構あるよ.

>嘘でしょ?すごく面倒くさくないですか?
面倒ですw
#include <windows.h>
int APIENTRY WinMain(
 HINSTANCE hInstance,
 HINSTANCE hPrevInstance,
 LPSTR lpCmdLine,
 int nCmdShow)
{
 return MessageBox(NULL,"俺がWindowsアプリだ","sage",MB_OK);
}
55デフォルトの名無しさん:02/09/01 21:59
>>54
bccだと()の中を消さないと動いてくれない予感。
5654:02/09/01 22:21
>>55
なんで? 動くよ。

「パラメータが使われない」警告のことなら、
コンパイラが勝手に出す警告であって、動作には関係ない。
>>52
昔はいっぱいいたよ
58消したら動かんぞ:02/09/01 22:28
>>55

#include <windows.h>
int APIENTRY WinMain()
{
 return MessageBox();
}
>>58
型はいるでしょ
Windows 3.1時代はMessage処理をswitch caseで分岐させてWinAPI
使って書いてなかったか?
遠い記憶なんで忘れたんだが、C++じゃなかったと思うが。
今もそんな感じで書けるはず。
間違ってたら訂正してくれい。
>>49
疲れきって誰もツッコミたくないだけだと思うよ。

>呼ぶ側の関数から引き渡されなくても、
>呼ばれる関数の中で解決できるものは、
>呼ばれる関数の中でのみ扱うべきです。
これは合っているんだけど、何したい関数だかわからんし、
データのまとめ方とかねえ…
6254:02/09/01 22:49
>>58
多分、55が言っているのは WinMain の方だけでしょ。

ただ、WinMainはstdcallなんだから 55が言っている
ような、仮引数リストの省略はすべきではないと思う。
警告を消す方法なら他にもいくつかある。

ちなみに VC++では省略すると引数がないと見なされ、
渡された引数をクリアしないコードを生成する。
(それ以前に WinMainでは省略不可能みたい)

>>59
関数の宣言と定義を勘違いしてない?
63デフォルトの名無しさん:02/09/01 22:57
>>62
つーか、bccでも警告がでるとコンパイルできないの?
#持ってないからしらんw
警告レベルくらいいじれるよな、もちろnbccでも?
>>58warata
#include <windows.h>
int APIENTRY WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
return MessageBox(NULL,"俺がWindowsアプリだ","sage",MB_OK);}

でいいじゃん
6665:02/09/01 23:02
そうかこれはC++じゃないとできないのか
C、C++がごっちゃになってる
bccで試したが、そのままで動いたぞ
6954:02/09/01 23:15
>>63
もちろんコンパイルできるよ。

警告レベルの変更はできるかどうか知らんけど、
指定した警告を抑止するオプションとかならある。
(BCCは持ってるだけで実際に使うことがないので)
70初心者:02/09/01 23:31
>>65
Error: 外部シンボル '_main' が未解決(D:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)

ていう、エラーがでます。
オプション必要?
>>70
bcc32 -tW
-Wでもいいんだったかな
>>71
俺は単純に bcc32 -W ファイル名
としているぞ。
73初心者:02/09/02 00:06
>>71 >>72
両方ともでけました。ありがとうございますです。
74デフォルトの名無しさん:02/09/02 00:28
前スレの604です。
コンパイラ、BCCなんですけど、コンパイル時に警告が出ても、exeファイルが出来てるっちゅーことは、コンパイルできてるんですよね?
その実行ファイルを実行しようとしても、コマンドの構文が間違っていますって言われます。
コードはほとんど本の物と同じなので、間違ってないと思うのですが…。

#include <stdio.h>

void main(){
 char s[10] = "Happy!";
 char d[10];
 char *ps, *pd;
 int i;

 ps = s;
 pd = d;

 for(; *ps != '\0'; *ps++, *pd++){
  *ps = *pd;
 }
 *pd = '\0';

 printf("%s", s);
 printf("%s", d);
}
7574:02/09/02 00:30
あ、でもその本、ちょっとおかしいと思うところが・・・。
普通、main関数って、
void main(){
}
あるいは、
main(){
 return 0;
}
ですよね?
でもその本は後者でreturnがないんです。
警告されるはずなのに…。
76デフォルトの名無しさん:02/09/02 00:34
>>74
そのexeはなんという名前?
>void main(){
は正しくない。
> void main(){
 int main() {

> int i;
使われてない。

> for(; *ps != '\0'; *ps++, *pd++){
 for(; *ps != '\0'; ps++, pd++){

> *ps = *pd;
 *pd = *ps; /* こうしたいんじゃないの? */

> printf("%s", s);
> printf("%s", d);
改行は?

そして最後に return 0;
7974:02/09/02 00:58
>>76
copy.exeです。文字列のコピーなんで。

>>77
マジですか!?

>>78
>int main(){
int main(){が正しいんですか?
main関数は何も返さないから、voidが付くと思ってたんですが…。

>使われていない
違うことをやろうとした後の消し忘れです。^^;;;

>*pd = *ps
そうでした。どうもです。

>改行は?
入れておきます。^^;;;
>>79
> copy.exeです。文字列のコピーなんで。
その、なんだ、DOSのコマンドには既にcopyというものがあってだな。
…名前を変えるべし。

> main関数は何も返さないから、voidが付くと思ってたんですが…。
main関数は整数を返すので int が付くのが正しいヨ。
世の中にはOS無しの環境で動くC言語の存在を
知らない人間が多いな。
8274:02/09/02 01:08
>>80
あ…あぁ!!!ありましたね…。最近DOS使ってなかってないから、忘れてたYO!
…って、>>80さんも使ってないと思うけど、よく覚えてますね。(笑)

intを返してるんですか…。
じゃあ、int main(){…return 0;}とやるのが正しいわけですか。
void main(){}の方がいいのにぃぃぃ!
UNIX 開発用に作られたんだから、お願いです。
MS-DOG 上で、C を学ぼうとはしないでください。
>>81
それってAPIも無いってこと?
MS-DOG?
>>84
当然では?
そりゃあ、ゲイツの犬はまずいよな(藁
MEG-DOS
>>86
ヘビィな環境だね。ローダーとかはどう実装されてるの?
ある意味すでにゲイツの犬なわけだが
9174:02/09/02 01:19
#include <stdio.h>

int main(){
 char s[10] = "Happy!";
 char d[10];
 char *ps, *pd;

 ps = s;
 pd = d;

 for(; *ps != '\0'; *ps++, *pd++){
  *pd = *ps;
 }
 *pd = '\0';

 printf("%s\n", s);
 printf("%s\n", d);

 return 0;
}

forの行で出る、警告 W8019 copy_.c 11: コードは効果を持たない(関数 main )ってのはどうしてですか?
>>91

×for(; *ps != '\0'; *ps++, *pd++)
○for(; *ps != '\0'; ps++, pd++){
9374:02/09/02 01:25
>>92
ありがとー!!!
…今ポインタの勉強なんだけど、ここは致命的なミスだった…。
おぉーん!・゜・(ノД`)・゜・
>>89
自分がやった環境ではローダー無かったなぁ。
ベタなバイナリ書き出して終わり。

で、趣味でやってるOS作りではローダーってものが必要だと
知って慌てて勉強してるわけだが(w
がんがってるな
MS-DOG (・∀・)イイ!!
>>93

その件はすでに>>78で指摘されてるだろ。せっかく付けてもらったレスは、すみから
すみまでねめ回せ。
>>86
http://www.semicon.melco.co.jp/seminar2/course/b2_02.htm
http://www.besttechnology.co.jp/HowToV25/startup/startup.htm
まあ、スタートアップという初期化手順があってそこで
シンボリックリンクされたmain関数がはじめて呼ばれるわけだよ。
スタートアップの処理自体はアセンブラで書かれる。
よってそこでの宣言により戻り値を返すか、どうかが決まる。
>>93
早く次の課題出してよ。またMS-DOGでね。(ワクワク
厨房の83は最近Cの歴史を知って煽りを書いてみたんだが
MS-DOSを知らなかったようなだな(w
10189:02/09/02 01:36
>>98
ありがd
10274:02/09/02 01:36
>>97
ご指摘ありがとうございます。
>>78さん、すいませんでした。m(__)m

>>99
また本読み進めてみるよ。
それか、友達にまた問題もらったら、アドバイスお願いします。
つーか、友達の大学の宿題を貰ってるんだけどね。^^;;;
>>100
むしろMS-DOSを知らない若者を釣ろうとした
いただけないヴェテランの可能性も(藁
10474:02/09/02 01:38
MS-DOG = MicroSoft Disk Operating Gorila
このような展開を予想して態と間違えた可能性も(w
This section briefly describes the peculiarities of using Emacs under the MS-DOS "operating system" (also known as "MS-DOG").
10774:02/09/02 01:52
>>106
Pardon?
10974:02/09/02 01:59
で、MS-DOGと言ったときの Gは何の略なんだろう。
やっぱり Gorila?
Girl
11283:02/09/02 02:04
わかった人が一人でもいれば。独占的な企業は嫌いです。
おやすみ。Happy hacking!
11374:02/09/02 02:12
>>111
MicroSoft Dekkai Opa-i Girl

つか、文字列のコピーってポインタ使わなくてもこれでいいのでは…?w
#include <stdio.h>

int main(){
 char s[10] = "Happy!";
 char d[10];
 int i;

 for (i = 0; i < 11; i++){
  s[i] = d[i];
 }

 printf("%s\n", s);
 printf("%s\n", d);

 return 0;
}

(〃~∇~〃)zzz。o〇○
>>83
よかったなgoogleで見つかって(w
11554:02/09/02 02:13
また暇つぶしに。(VC++専用です)
#include <windows.h>
#define MSG1 "俺が main だ、文句あっか\n"

#ifdef _CONSOLE
void __cdecl mainCRTStartup(void)
{
  DWORD n;
  ExitProcess(!WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
        MSG1,sizeof(MSG1)-1,&n,NULL));
}
#else
void __cdecl WinMainCRTStartup(void)
{
  ExitProcess(MessageBox(NULL,MSG1,"sage",MB_OK));
}
#endif
>>114
いや、結構有名な呼び方だよ。
知らないほうが。。略
>>113
 for (i = 0; s[i] != '\0'; i++){
  d[i] = s[i];
 }

っていうか、ポインタの勉強なんだからあれでいいんだろ。意味も違うぞ。
そもそも上でやってる処理なんてstrcpyで一発なんだよ。
ちなみにポインタ使った方が高速だ。
>>113
それはmemcpyだと思うが。
しかもバッファオーバーランだし。

>>117
> ちなみにポインタ使った方が高速だ。
処理系によるでしょ。
俺の使ってるコンパイラはどっちも変わらん。

ちなみに俺的にはループのところが
 while(*ps) *pd++ = *ps++;
 *pd = '\0';
とか
 while(*pd++ = *ps++) ;
の方が読んでわかりやすい。でも人それぞれ。
規格ではスタンドアロン環境とホスト環境の区別もしてないし
処理系がOSに戻り値を返却しようがしまいがmainにreturnは
必要(規格準拠するつもりがあるならね)。
>>116
ガイシュツも知らないの?っていうくらい痛いな(ワラ
windows を windoze って言うようなもん?
>>120
釣れた。
if( b == func(a) )
{
}

は,おかしなやり方ですか?
if文の中の処理は行われない可能性がありますか?
>>123
なんで? 全然おかしくないじゃん。
どうしておかしいと思うの?
>>124
if文の中の値があってるはずなのに,if文の中が,実行されないから
どっかオレのプログラムミスがあるようだ
見直おしてみる
>>125
== と = を間違えてたりはしないよね?
>>126
さすがにそれはないです
なぁ、お前ら。
ちょっと関係ないんだけど、IEでこの板見てて、このスレをクリックして
Backで戻ると、IEのタイトルが文字化けしねぇか?

他の板ではそういうことないんだけどさ。
いいえ
インストールは,させられそうになりますが
130127:02/09/02 03:32
原因を見つけました
ご迷惑をかけました
>インストールは,させられそうになりますが
同意。Flash Playerだよね。
何とかならんかな。
132 :02/09/02 03:34
void func(void)
{
int i;
printf("整数を入力: ");
scanf("%d",i);
return i;
}
これって何が間違ってるんですか?
間違っている理由も教えてください。
133132:02/09/02 03:35
ネタでした。
void
135 :02/09/02 03:39
voidがなぜ違うのかおしえてくれませんか?
>>133

脳内コンパイラーでは通りましたが何か?
137136:02/09/02 03:41
ネタですた。
>>135
ネタ??だよね。
マ板に単発スレを立てたので無視。
>>139
ほんとだ。了解です。
>>132
scanfを使おうとする根性が間違っています。
142141:02/09/02 03:49
>>132
ところで、scanfの引数にはポインタを使わないといけませんがそれが何か。
int func(void)
{
int i;
printf("整数を入力: ");
scanf("%d",&i);
return 0;
}
144 :02/09/02 03:52
ありがとうごぜますーーーーーーーーーー
145142:02/09/02 03:55
不覚にも141を書いた時は引数の間違いに気づかず、
慌てて142で書き直しましたがそれが何か。
>>143 ,144
ネタ??だよね?
どいつもこいつもアヒル本から出直してこい。
単発スレを反省もしない>>132にいちいち付き合うお前ら人が良すぎだ。
甘やかすな。つけあがるだけだ。
ム板もすてたもんじゃねぇなぁ

いい奴が多いってことは幸せなことだ
アヒル本とかいう言い方やめてほしいよね。
通ぶってるだけで通じゃない人に通じない用語ってわからんのかね。
>>150
実は通にも通じていないという罠。
152デフォルトの名無しさん:02/09/02 08:02
今、エディタを勉強のつもりで作ってるのですが・・・
ファイルを読み込んで表示する部分で、
最初の一行目は問題ないのですが、
二行目以降、最初一文字目が削られて表示されてしまいます・・・。
もう、どこが悪いのか分らない状態です・・・(涙

http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/370.zip

ここに、ソースを上げさせてもらいました。
コンパイルは、BCC5.5でないと通らないかも・・・
GCC、VCでのコンパイルは試してないです。

どうか、お願いします。
>>152
読んでないけど、改行の処理、\r\n(DOS)と\n(UNIX)で
バグっているヨカン
154152:02/09/02 08:08
>>153
あれ?
改行の処理って、テキストモードでファイルオープンすれば、
適切な処理を自動でしてくれるんじゃないんですか?
かなり混乱気味です。
VC++を使っているのですが,プログラムを,コンパイル→実行するとdebugライブラリというダイアログが開いて,
BLOCK_TYPE_IS_VALIDという文字が出ています。
なんなんでしょうか?
>>154
for (i=0; i<=y; i++)
txt[i][YOKO] = '\0';

バグはこれだよ。安全のためにNULLをいれたんだろうが
配列の最後に入れるなら[YOKO-1]だ。

まじめに読んじまったい。
157152:02/09/02 08:20
>>156
あ、ありがとうございます!!
このバグを見つけるために、2時間泣きながらモニター眺めてました!
本当に嬉しいッス!

ここから、編集ができるよう改造していきます。
ありがとうございました!
>>155
Assertion failure
159デフォルトの名無しさん:02/09/02 09:42
>152
しっかし、読みやすいプログラムだな。
俺にはこうは書けない。 いつもグチャグチャだーよ。
>>159
はぁ?
>>159は神

>>160はアルカイダ兵
>>161
はぁ?
>>162
おまえ、しぶといな・・・。
おまえのようなのが居るからすぐ次スレ立てなくっちゃならねーようになるんだYO!
>>163
16574:02/09/02 14:22
(;´ρ`)イマオキタヨ

>>117
訂正さんきゅ!
ポインタ変数が他の変数のアドレスを保持して、間接的に他の変数を参照するためにあるんだったら、
ポインタ変数で行う処理って全てそれを使わなくてもできるんじゃないか?って思ったんです。
何のためにあるんだ?って。
ポインタ使った方が高速なのでしたら、納得です。

>>118
memcpy…調べました。
http://www.bohyoh.com/CandCPP/C/Library/memcpy.html
>void *memcpy(void *s1, const void *s2, size_t n);
s1とs2は、文字列の変数が直接入るのではなくて、それらを指すポインタ関数が入るんですよね?
それと、voidってことは、何も返さないんじゃないんですか?
s1の値を返すって書いてあるんですが…。^^;;;
166デフォルトの名無しさん:02/09/02 14:32
ファイルの追加モードで
対象ファイルの先頭に挿入ってできるでしょうか?

こんな感じで
[BOF]12345[EOF] → [BOF]6789012345[EOF]
>>166
できないと思っておいたほうがいいかと。
>>165
voidと void*は異なる。
後者は差し先がどんな型か不明な(=どんな型を差しててもいい)ポインタ。
>>165
> s1とs2は、文字列の変数が直接入るのではなくて、それらを指すポインタ関数が入るんですよね?
ポインタ「関数」は入らない

> それと、voidってことは、何も返さないんじゃないんですか?
「void」と「void *」は意味が違う。「void *」は汎用ポインタ

> s1の値を返すって書いてあるんですが…。^^;;;
その方が都合がいい場合があるから。普通は無視して構わない。
char *p;
printf("%4.4s\n", memcpy(p, "hoge");
こんな変なコードを書きたいのならば別だが...
170118:02/09/02 14:56
>>165
意味わかってると思うけど、一応、俺が言いたかったのは

最初の質問がstrcpy相当の文字列終端までのコピーなのに
113 のコードではmemcpy相当の処理に仕様が変わってるよ。
ってこと。単にそれだけ。

> ポインタ変数で行う処理って全てそれを使わなくてもできるんじゃないか?
> って思ったんです。
とんでもない。できないことだらけです。
171166:02/09/02 15:01
>167

やっぱダメですか。

んじゃ、一回ワークファイルで編集して移し代えですかねぇ・・・
メンドクチィ
>>170
> とんでもない。できないことだらけです。
少なくとも出力引数はグローバル変数を使えば可能
ループをgotoで代用するぐらい邪道な方法だけど
17374:02/09/02 15:21
>>169
>その方が都合がいい場合があるから。普通は無視して構わない。
なーる。
値を返して使うこともできるんですね。

>>170
意味わかってなかったです。w
確かに仕様が変わってますね、すいません。
でも、char配列の\0以降は何も入ってないわけだから、結果としては変わらないですよね。
strcpyは文字列終端(=\0)までのコピーでmemcpyはパラメータでサイズの指定ですか…覚えておこう。
17474:02/09/02 15:21
これで良いかと思いきや、エラーが出るんですが…。^^;;;
使い方、間違えてます?
#include <stdio.h>

int main(){
 char s[10] = "Happy!";
 char d[10];
 char *ps, *pd;

 ps = s;
 pd = d;

 memcpy(*pd, *ps, 10);

 printf("%s\n", s);
 printf("%s\n", s);

 return 0;
}

それと、memcpyってプロトタイプ宣言必要なんですか?
警告されるんですが…。
僕の勝手な認識としては、自分で作った関数はプロトタイプ宣言が必要で、
memcpyやprintfなどの関数は#include <stdio.h>で一括で宣言してるという様に解釈してたのですが…。
memcpyやstrcpyはstring.hをインクルードしる。
>>174
memcpyのプロトタイプは多分、string.hにあるのでそれをインクルード。
memcpyに渡すのはポインタ。
*pd とか *psは char型になるので、×。
まだ根本的なところが分かってないようだな。
17874:02/09/02 15:39
>>175-176
memcpyはヘッダがstdio.hじゃないんですね…。
見落としてました。(泣きぃ

>>176
できました。
形式が「void *memcpy(void *s1, const void *s2, size_t n); 」なので、惑わされてました。^^;;;
ありがとうございます。
>>174

>165 でせっかく調べたのに注意不足だね
http://www.bohyoh.com/CandCPP/C/Library/memcpy.html
文字列複写関数
memcpy
ヘッダ #include <string.h>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
他の人もいっているとおりmemcpyはstdio.hには含まれていない。
>>179
strcpyと勘違いしてない?
181デフォルトの名無しさん:02/09/02 15:49
char *string = "Hello";

この場合の、"Hello"の寿命について教えていただきたいのです。
自分では"Hello"が宣言された関数の中だけだと思うのですが、いかがでしょうか。

あと、"Hello"の内容は自由に変更してもいいのでしょうか?
>>181
俺が思うに宣言されたのはstringだと思われ。
UNIXなら「man 関数名」でリファレンスが出てきて便利だYO。
ちなみに「char *p」と「func(*p)」の「*p」は意味が違う。
前者は「ポインタ宣言」で、後者は「実体参照」を意味する。
>>181
定数だからプログラムが終了するまで生きてる。
>あと、"Hello"の内容は自由に変更してもいいのでしょうか?
これはだめん
>>181
Auto変数はブロック内でのみ有効。
malloc()等で動的に確保した領域はそのままreturnしても生きている。
strdup()(Win32なら_strdup())なんかはそれ。
>>181
処理系によるとは思うが、たいてい
・"Hello"はプログラムが起動して、終了するまで生きている。
・stringの寿命は関数内。
になるはず。

で、"Hello"の内容をプログラムの中から書き換えようとすると、
クラッシュすることもある。

C-FAQの
http://www.catnet.ne.jp/kouno/c_faq/c1.html#32
あたりを参照。
18774:02/09/02 16:01
>>177
ポインタは基礎はわかってきましたよ。
型名 *変数名; //○型を指すポインタ変数の宣言。
ポインタ変数名 = @○○; //○○のアドレスをポインタ変数に入れる。
*ポインタ変数名 = ○○; //ポインタ変数を介してそれが指す変数の値を変える。
*ポインタを参照すれば、ポインタの指したデータを参照。

って所でしょうか?

>>179
注意不足ですな。
小学校の時には通信簿の所見の欄に、いつもそう書かれていました。
もっとじっくり取り組む姿勢が必要です。
18874:02/09/02 16:02
訂正。^^;;;
四行目の右辺、「&○○」ですた。
189181:02/09/02 16:07
>>182
ずぼらかましました。stringです、許して下さい

>>184
なるほど、、定数だったんですね。よって変更もダメと。

>>185
strdup()は分からないので調べます。

>>186
リンクどもです。逝ってきます。

まとめてレスしてしまい申し訳ないです。済みません。
でも解決しました。本当に有難うございます。
190179:02/09/02 16:11
>>180
俺はしてない。ここの表現のとおりに書いた
http://www.bohyoh.com/CandCPP/C/Library/memcpy.html

# ちなみに柴田望洋氏講義の補助テキストらしいが...
191デフォルトの名無しさん:02/09/02 16:19
>>186
処理系によるの?
定数がプログラム終了前に消えたらまずくない?
>>191
使い方に依るだろ。
193デフォルトの名無しさん:02/09/02 16:22
>>192
????
194186:02/09/02 16:24
>>191
規格的にどうなってるのか調べるのが面倒だったのでああいう書き方
をしたのだが、まぁ終了前に消えることはないと思う。
定数というより(定数なんだが)文字列リテラルが静的記憶期間を
もつからプログラム終了まで生き続けるということですね。
196デフォルトの名無しさん:02/09/02 16:59
>>180
mem〜系も インクルードするヘッダは string.h

memcpy()を文字列複写関数と言ってる事に対してのstrcpy()だろ
19874:02/09/02 17:17
char配列の中に全角文字を入れる時は、要素数を2倍にすれば入るっていうことを確認したんですけど、
その中の特定の一文字を他の変数に代入するにはどうすればいいんですか?
僕がやってみたコードを一応載せます。
#include <stdio.h>

int main(){
 char s[11] = "あいうえお";
 char d[3];

 d[1] = s[1];
 d[2] = s[2];
 d[3] = '\0';
 printf("%s", d);

 return 0;
}

要素数を二倍にしなくてはならないということは、s[1]とs[2]に「あ」が、s[3]とs[4]に「い」が…という様に入っているのではないかと推測し、
以上の様に書いてみたのですが、実行すると文字化けしたような物が表示されます。
やり方、教えて下さい!
199デフォルトの名無しさん:02/09/02 17:18
>>198
wchar_t
>>198
Cの配列は0番から始まります。
VB厨?
添え字は0から
20274:02/09/02 17:26
>>199
???

>>200 >>201
VBもやってましたけどね。^^;;;
またやっちゃった…。
申し訳っ!
>>202
どうしてもcharでやりたかったらchar [2]にコピーしな。
>>200
あの・・・。VBもデフォルトは0から始まるんですけど。
知らないものを叩くのは良くないと思いますよ。
VBも添え字は0からだったような・・・
>>204

Option Base 0
207205:02/09/02 17:31
>>206
そうなのか。
じゃあデフォルトでそう設定されていただけか。
>>198
全然関係ないけど1つ忠告
配列を初期化する場合、要素数を省略しても
コンパイラが勝手にその大きさ分確保してくれる。

char s[] = "あいうえお"; こうすれば勝手に11個確保し、
int i[] = { 1, 2, 3, 4, 5, }; こうすれば勝手に5個確保する。
>>208
多分それエラー
>209
ならねーって。
211209:02/09/02 17:37
本当だ・・・
,の後に何もなくてもよいのか。
>>209
enumならば最後のカンマがあるとエラーだけど
配列や構造体メンバの初期化の最後のカンマは合法だよ。

# 夏は終わってないのか?
>>206
うん。省略時はそれ。スレ違いだがVBは添え字をマイナスから始めることもできる。
(-1,-1) (-1.0) (-1,1)
( 0,-1) ( 0.0) ( 0,1)
( 1,-1) ( 1.0) ( 1,1)
こんな感じにね。
でもなんで1, 2, 3, 4, 5,なんて書き方するんだろ。変な人。
>>214
intになってるのは気付いてる?
>>215
ハァ?
それがどうした。見当違いなレスするな。
>>214
変じゃない人ならどう書くと?
>>217
1, 2, 3, 4, 5
>218
int i[] = {
1,
2,
3,
4,
5
};
って書くの?へんなひと。







      バ カ 必 死 で す 。(藁







プライド持つのも良いが間違いは素直に認めるのが大人だぞ。
22174:02/09/02 17:47
>>208
勉強になりました。
>>213
それも初めて知りました。

Option Baseか…。そんなのもあったなぁ。
配列に0が入るのが嫌で、
Dim A(1 To 10) As Integerってやってたなぁ。
今もCでは、要素を一つ多く宣言して、0は使わないでやってます。^^;;;
面倒だから。w
>>218
あの書き方じゃわかりづらいけど、>>219のように
縦に書いたときとかに、最後の要素の次に付け加えるときとか
最後とその他を入れ替えるときとかに簡単なミスを防げるんだよ。
223デフォルトの名無しさん:02/09/02 17:48
>>212
enumでも問題なく通ったんだけど、これはコンパイラが規格に準拠していないってこと?
>>221
上手くいえないけど配列の位置を計算で出すときとかは
0から始まった方が計算しやすい。
計算しやすいかどうかというよりも、a[i]==*(a+i)だからだと思う。
>>223
厳密に言えばそういうことになるだろうけど、配列や構造体ならOKでenumは
ダメというのも変な仕様だよな。

gccで試してみると、-Wallにしても何の警告も出ない。-pedanticまでやって
ようやくwarningになった。
>>225
いや別にa[i]==*(a+i-1)という仕様でも良かったわけだし。
>>227
そんな仕様で良いのはおまえだけだ
229デフォルトの名無しさん:02/09/02 17:57







      バ カ 必 死 で す 。(藁







プライド持つのも良いが間違いは素直に認めるのが大人だぞ。
>>229
誰に言っているのか良くわからんのは荒らしと一緒だぞ。
231デフォルトの名無しさん:02/09/02 18:00
>>231
どの時点で何を間違いと認めればよかったのだ?
>>223
Cの言語仕様のバグ、C++では直っている
昔(C89以前)のCでは8進数に8を定義してもよい仕様だった。
a[i]==*(a+i-1) // -1?
>>232
でもなんで1, 2, 3, 4, 5,なんて書き方するんだろ。変な人。
>>233
どう直ったの?
enumでもOKと?
>>234
>>227を書いた後>>229で言われてるのに>>227の内容を
いつ間違いだと言えばいいんだよ。無茶言うな。
(´-`).。oO(粘着が複数名いる模様・・・)
>>237
焦るな。
添え字が1からなら、a[i]==*(a+i-1)でOKだろ。
240232:02/09/02 18:07
>>235
>>222で説明してある。ちなみにそのレスは見当違い。>>208は俺じゃない。
24174:02/09/02 18:07
void disp(){
 int i, j;
 char s = "123456789";
 char ss[3];

 printf(" ABCDEFGHI\n");
 for (i = 1; i <= 9; i++){
  for (j = 1; j <= 9; j++){
   if (j == 1){

    printf("%s", ss); //a
   }
   switch (masu[i][j]){
    case NULL:
     printf("□");
     break;
    case BLACK:
     printf("●");
     break;
    case WHITE:
     printf("○");
     break;
   }
  }
  printf("\n");
 }
}

この関数のaの部分で、sのi文字目を表示させたいのですが、その前の行ではどんなことを書けばいいですか?
242デフォルトの名無しさん:02/09/02 18:08
>>241
まずはchar sをchar s[]に。
24374:02/09/02 18:09
あ、すいません。
3行目、char c[] … でした。
24474:02/09/02 18:10
char s[]でした、鬱打氏脳
>>243
c??

ss[0]=s[0],ss[1]=s[1],ss[2]=0;
>>241
> その前の行ではどんなことを書けばいいですか?
> printf("%s", ss); //a
別に前に書く必要はないよ
printf("%2.2s", ss[2 * (i - 1)]);
247245:02/09/02 18:12
1文字目じゃなくてi文字目か。じゃあmemcpyで。
248デフォルトの名無しさん:02/09/02 18:13
マルチバイトかよ。めんどくせえな。
>>246
ssって初期化されていないでしょ・・・
マルチバイト使いにくいんだからCなんかやめろ。
251247:02/09/02 18:14
普通はstrncpyだよな・・
wchar_tの出番だな
>>252
それわからんらしい>>202
254246:02/09/02 18:16
上は間違い
printf("%2.2s", s[2 * (i - 1)]);
ssという変数は必要ない
次に宣言する変数名はsssですか?
25674:02/09/02 18:16
>>246
エラーが出るYO!・゜・(ノД`)・゜・
ssにsのi文字目を入れて、表示しようかなぁと思ってたんです。
>>249
ss[]じゃなくてs[]にしたかったんだと思われ。
それでも>>246
printf("%2.2s", &s[2 * (i - 1)]);
にしないと動かないと思うが。
if (j == 1){
...
}
ループの中にこういう判定をいれるのをやめろ。
一番気になる
25974:02/09/02 18:19
>>254
それでもエラーに…
俺の打ち間違いかな?
260246:02/09/02 18:20
>>257
指摘サンクス
やはりコンパイルもせずに適当に答えては駄目だと痛感した
次は「1バイト文字が混ざっている場合はうまくゆきませーん。」かな。
26274:02/09/02 18:22
>>258
ご忠告どうも。
厨丸出しですた。w

void disp(){
 int i, j;
 char s[] = "123456789";

 printf(" ABCDEFGHI\n");
 for (i = 1; i <= 9; i++){

  printf("%2.2s", s[2 * (i - 1)]); //a
  for (j = 1; j <= 9; j++){
   switch (masu[i][j]){
    case NULL:
     printf("□");
     break;
    case BLACK:
     printf("●");
     break;
    case WHITE:
     printf("○");
     break;
   }
  }
  printf("\n");
 }
}
26374:02/09/02 18:25
>>257さんのでデキタ━━━━━━(゚∀゚)━━━━━━!!
ありがとうございます♪♪♪
>>246さんも♪
26474:02/09/02 18:45
CPad落とした!(・∀・)イイ!!
質問です。
ポインタのポインタって、何か(・∀・)イイ!ことあるの?
ただ読み難くなっているだけだろ…。
どうせコソパイラが最適化してくれるんだから、ポインタなんて
使ったって無駄だぜ。配列で十分!
arrayマンセー!
>>265
配列でメモリの0x886番につながっているLEDを消灯させて下さい。なお、プルアップタイプです。
>>266
だだのポインタでいいんじゃないの?
>>265はネタですよね・・・。
ネタはネタとして配列でできることをポインタでやる必要はないだろうね。
>>265
> 配列で十分!
配列で間に合う程度のプログラムしか作ったことが無いんですね;)
>>270
配列さわる時に嫌でもポインタいじってるわけですが?
>>272
配列使ってればポインタ使ってるって言っていいんですか?
274デフォルトの名無しさん:02/09/02 19:24
おまえらカスか
>>274
お前よりましだ。
276272:02/09/02 19:28
>>273
str[i]は*(str + i)と解釈される
>>276
解釈されるだけでポインタ使ってるといわねーだろ。
>>276
i[str]でも、正しかったりするよな〜。
こんな使い方するヤツいないけど。
>>278嘘つくな、ゲイツ
>>279
・・・お前、ちゃんと入門書読みなおせ。
28174:02/09/02 19:34
変数を宣言した後に、全角の文字を入れるにはどうしたらいいんですか?
とりあえず、僕がやってみた物を…
今、オセロ作ってるんですよ。

void haichi(){
 char t[];

 if (turn == TBLACK){
  t[] = "黒";
 }
 if (turn == TWHITE){
  t[] = "白";
 }
 printf("%sの番です。\n", t);
 printf("置く場所を指定してください。\n");
}
282デフォルトの名無しさん:02/09/02 19:37
>>277
はげどう

>>281
strcpy
283282:02/09/02 19:38
>>281
その前にtのサイズをきちんと書けよ。
284手抜き:02/09/02 19:41
printf("%sの番です。\n", (turn == TBLACK) ? "黒" : "白");
printf("置く場所を指定してください。\n");
28574:02/09/02 19:46
>>282
こういう時にstrcpy使うんすか!
デキター!!!(´∀`)

>>284
おっ!?より前の条件が真だったら前者、偽だったら後者が返されるという構文ですね。
それが(・∀・)イイ!!!
>>281
void haichi(){
 char *t;

 if (turn == TBLACK){
  t = "黒";
 }
 if (turn == TWHITE){
  t = "白";
 }
 printf("%sの番です。\n", t);
 printf("置く場所を指定してください。\n");
}
287デフォルトの名無しさん:02/09/02 19:51
>74
なんでもすぐに質問すると覚えないよ。
自分で一日くらい悩んでから質問したほうが、いろいろわかると思う。
っていうか一通り本かなんかで勉強してからこいカス。
strにi足す、iにstr足すアドレスを返すことに
変わりは無いという解釈を内部ではしている。
str[i]
 =>
*(str+i)
 =>
*(i+str)
 =>
i[str]

#include <stdio.h>
main(){char str[]="0123456789";
for(int i=0; i<10; i++)
printf("%c",i[str]);
return 0; }
動くんだよ、これが・・・
29074:02/09/02 19:59
>>286
それでもできるんですかぁ。
勉強になりますな。
String型があればラクチンなのになぁ。。。

>>287
そうですか?
基本的な所は定石で固めておけば、あとでその知識の組み合わせればスムーズに行くかな?と思ったんですが。
じゃあ、ちょっぴり自分で試行錯誤して、できるところまでオセロをやってきます!!!

>>288
了解。
291デフォルトの名無しさん:02/09/02 19:59
>289
あははは、面白い。 動いた。 ネタに使えるね。
>289
>strにi足す、iにstr足すアドレスを返すことに
>変わりは無いという解釈を内部ではしている。
str[i] は自動的にコンパイラが *(str + i) に読み替えてるからじゃないの?
結果的に str[i] も i[str] も指してるアドレスが同じなだけで。
昔7行スレで見たオセロゲームのCソース
関数k()の宣言とかエラーチェックは無いけど
これを書いた奴は神。次元が違う、参考にはするな

#include <stdio.h>
int p,t,a,d,c,v,i,m[90]={0},s,r[]={-10,-9,-8,-1,1,8,9,10};void k(){if(m[p]==0)
for(i=0;i<8;i++){for(c=0,v=p+r[i];m[v]==3-t;v+=r[i])c++;if(c&&m[v]==t){a+=c;v=
p;if(d)do m[v]=t,v+=r[i];while(m[v]!=t);}}}char*h="・○●\n";int main(){for(i=
1,m[41]=m[49]=2;i<10;m[i++*9]=3)m[40]=m[50]=t=s=1;for(;;a=d=0){for(p=9;p<82;++
p)k(),printf("%.2s",&h[m[p]*2]);if(a)for(d=a=s=p=8;a==8;k())t-2?(scanf("%d %d"
,&p,&i),p+=i*9):++p;else if(s)s=0,printf("pass");else break;t=3-t;}return 0;}
>>293
そのプログラム、入力待ち状態になったら何を入力すればいいの?
とりあえずiってやったら落ちた(ToT)
char *colors[] = { "黒", "白", };
printf("%sの番でゲス\n", colors[turn != TBLACK]);
29674:02/09/02 20:06
>>293
僕も前に違うスレで見ました。w
http://game.2ch.net/test/read.cgi/gamedev/1025110939/137
参考にする気にもなりません。・゜・(ノД`)・゜・
>>293
すごいな…COMの思考ルーチン込みとは。ほんとに神レベルだなこりゃ。
>>294
自分は先攻で○ね。左上(1,1)右下(8,8)として、X Yの順で座標を入力。
とりあえず 6 4 とか入れてみれ。
>>297
スペースで区切って入れるのか・・・なるほど。
299298:02/09/02 20:22
区切るとか区切らないの問題じゃなくて、置けないところの座標を入力していたから進まなかったのか(^_^;)
30074:02/09/02 20:34
>>293を実行してみて勉強になったこと。

オセロのマスは8×8だった!泣
301デフォルトの名無しさん:02/09/02 20:34
>>300
逝ってよし!
302デフォルトの名無しさん:02/09/02 20:38
>>293
43対21で俺の勝ち。
どの辺が思考ルーチンのコードなのか見ても分からん(´д`;
304デフォルトの名無しさん:02/09/02 20:54
定数定義は#defineよりもconstの方がいいんですか?
30510000:02/09/02 20:57
いまC言語やり途中なんですが、すごく悩んでいることになりました!
そこでここに質問させてもらう事にしました・・。
あるDOSアプリでソフトを起動してからその起動したソフトからの
戻り値がほしいのですがCだとどういう関数を使えばいいんどえしょうか?
口下手でもうしわけありません・・ちょこっと
buff=system(age)こんな感じにしたいのです。が
systemの戻り値は起動させたソフトの戻り値は継承してないので・・。
おねがいします!
>>304
うん
>>304
constなんて 猫でも で教えてもらわなかったぞゴルァ(藁

本駆ってこようかなぁ。応用でスキルうpをはかり中...
>>293,297
本気?
コード自体は悪くないし、よくできていると思う。
でも別にごく普通のコード(可読性を犠牲にして短く見せてるだけ)だよ。
これを書ける人間が神ならほとんどが神。

思考ルーチンなんて入ってないよ。
置ける場所を順番に探索するだけ。

あと、よくできているだけに 1ヶ所だけ注文を付けたい。
>int main(){
>for(i=1,m[41]=m[49]=2;i<10;m[i++*9]=3)m[40]=m[50]=t=s=1;
ループ内で初期化を繰り返している。どうせなら
for(m[40]=m[50]=t=s=i=1,m[41]=m[49]=2;i<10;m[i++*9]=3);
とかにして欲しかった。
>>308
それ、7行で書くという制約がついているからだよ
for(p=9;p<82;++p)k(),〜〜
ここが思考ルーチンじゃないのかな
つまり
k()
の中になるけど
調べられるだけ調べてる
r[]の中は、左上〜右下の位置を表しているのでしょう。
3111:02/09/02 23:17
Cで連珠の作りかたが知りたいです。教えてください。
312デフォルトの名無しさん:02/09/02 23:20
すみません、かなり初歩的な質問なのですが・・・
文字列配列を、後から初期化するのってどうすればいいのでしょう?

たとえば、buf[1000]の配列を初期化するにはどうすればいいでしょうか?
memsetを使うとか
文字列なら、buf[0] = '\0'でいいんじゃない?
buf[0] = '\0' とか
>>314 >>315
式はいつですか?
317312:02/09/02 23:39
なるほど!
ありがとうございました。
318デフォルトの名無しさん:02/09/02 23:46
*(&(*(&(*(&(*(&buf[0]))))))) = '\0';
319デフォルトの名無しさん:02/09/02 23:48
正直、C極めた
>>319
幻想だ。寝てろ。
321デフォルトの名無しさん:02/09/02 23:50
var
str1 : String;
begin
str1 = '合計' + IntToStr(goukei);
ShowMessage(str1);
end;

goukeiはきちんと数字が入っています。
コンパイルエラーになるのですがなにが悪いのでしょうか。

↑誤爆?

↓誤爆?
右上の閉じるボタンとか最大化ボタンとかが文字化けしてます。
どうすればいいですか?
夏休み終わったんじゃないのか?
326:02/09/03 00:09
>324
俺はその答えを知ってるがあえて教えてやらない。
まずあなたがなぜ
「C言語なら、俺に聞け!」
板にその質問を書いたのか、
ウィンドウの文字化けと、
C言語の関連を説明する必要がある。
それが納得いく答えなら快く教えてあげようじゃないか。
327デフォルトの名無しさん:02/09/03 00:09


ひきこもりは年中夏休みという罠。

 
>>327
ヽ(`Д´)ノ
329デフォルトの名無しさん:02/09/03 00:16
>>328
喜びすぎ
322-324は自作自演だろ
>>321
 ' → " ???
:=とか??
java?pascal?
goukeiはInt?
どんなメッセージ?
332324:02/09/03 00:26
申し訳ない・・・
>>323のネタフリで、ネタを披露してみますた。
まぎらわしくてスマソ

ちなみに、>>323は俺じゃないです。
333Show-A:02/09/03 00:37

このスレに笑いはいらない。あと、至急仕事をください。
cygwinでgccとかccのコマンド使えないんですが、
なんででしょう?
335308:02/09/03 00:53
>>309
> それ、7行で書くという制約がついているからだよ
ありがとう。
その制約をわかってて書いたつもりだよ。
仮に制約がなければ「よくできてる」とは書けないし、
糞コードと言われてもおかしくないと思う。

>>310
> for(p=9;p<82;++p)k(),〜〜
> ここが思考ルーチンじゃないのかな

違うよ。
そこは、置けるマスが1ヶ所でも存在するかどうかを
チェックしているだけ。(passまたは終了の判定だけに使われる)
これはCOMの時もPLAYERの時も共通。
そこでまず置けるマスがあることを確認してから、

その次の
> if(a)
> for(d=a=s=p=8;a==8;k()) t-2 ? (scanf("%d %d",&p,&i),p+=i*9) : ++p;
で処理をしている。
(t - 2 != 0) なら つまり現在の順番がPLAYERなら scanfを繰り返し、
COMなら 先頭のマスから1個づつ順に調べていき、
置けるマスが現れた時点で、そこに置いてループを抜ける。
だから、単なる順次探索なのです。
>>335 仮に制約がなければ「よくできてる」とは書けないし

要するに7行としてはよくできてる止まりで、凄いわけじゃない、と。
だったらおまえが書いてみろ。
337335:02/09/03 03:53
>>336
> だったらおまえが書いてみろ。
いっぱしの口をきいたりプログラミングの話をする前に
まず、人様にものを頼む態度から勉強して出直してこい。
お前、中学生のうちはいいが、将来社会に出てから困るぞ。

お前から見ればよっぽど凄いコードなんだろうよ。
それだけの話。大人になればいずれわかる日が来るから
前向きに頑張れ。
こんな質問スレでえらぶってどうすんのよ。
7行スレでも出たよな、こんなの簡単だって口だけの奴。
340デフォルトの名無しさん:02/09/03 04:48
すみません・・・質問いいでしょうか?
いつぞやの、エディタ作ってるC言語初心者です。

今、文字入力処理の部分を作ってるのですが・・・
1バイト文字は、どうやら問題なく入力されるのですが、
どうしても、2バイト文字が化けてしまいます・・・。
もうこれも、どこが悪いのかさっぱりで・・・(涙

http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/372.zip

ここに、ソースを上げさせてもらいました。
かなり不器用な処理してて、読みにくいかも・・・(汗
bcc32以外でのコンパイルは試してません。

どうか、よろしくお願いします。
>>325
なんでも夏休みのせいにするお前が厨房という罠
>>340
また君か。
生活時間が似ているな(w
文字入力にgetch()を使っているがこいつは1文字入力用なので
FEPで書かれる2バイト文字系ではまともに動かん気がする。

じゃぁどうしろ、と言われると困るのだが・・・。
343340:02/09/03 05:05
また来ました(w
その節は、お世話になりました。

えっと、getch()関数は、1バイトだけを受け取る関数ですが、
2バイト文字の時、getch()関数を2回呼び出せば2バイト目を読めると本に書いてます。
で、自作関数insert()で、最初の1バイト目を見て漢字の1バイト目なら、
2バイト目をinsert()関数で読んでるつもりなのですが・・・
・・・これが、問題なのでしょうか?
>>343
fgetsでいいじゃん。
ところで、getchって少なくともMS-DOSでは単に入力待ちにするだけじゃなかった?
受け取れるのはgetcheだったような・・・
346340:02/09/03 05:16
>>344
すみません・・・
説明不足でした・・・。

入力処理の部分を作ってると言いましたが、
キーボードからの入力処理の部分を作ってます。
説明不足でした。すみません(汗
getsって言うと叩かれるからfgetsって言っただけ。>>346
348340:02/09/03 05:21
>>345
レス、ありがとうございます。
えっと、getch()関数は、エコーなしで受け取る関数です。
getche()関数は、エコーありで受け取る関数ですね。
受け取りは、どちらでもいいのですが・・・。
このエディタの画面表示方法は、変更があるたびに、
配列読み出して再描写するようにしてます。

なので、エコーバックがあるのは、ちょっと困るのです・・・(汗
349デフォルトの名無しさん:02/09/03 05:22
俺、74は嫌いだけど340は好きだ。
定期的に質問するなら、こういう人のほうが教えやすいし、頑張ってるのが伝わってくる。
あとはコテハンつかってくれ。 エディター作ってる人だとわかる名前がいいな。
350デフォルトの名無しさん:02/09/03 05:28
>>348
エディタってMS-DOSプロンプトで動くようなテキストエディタを作っているの?
351エディタ製作中@クソ初心者:02/09/03 05:29
>>347
あ、なるほど。(w

>>349
そう言っていただけると嬉しいッス。
いちよう、初心者なりに頑張ってはいるのですが・・・
エディタ作るのって、初心者には厳しいのでしょうか・・・。
なかなか、難しくって・・・(汗
>>348
うーん、キャストの問題もないし、一見問題なさそうに見えるね。
ch=getch()
も2バイト文字が入力されたときは2回連続でOSから呼ばれる
ようだし。

ただ、こちらの環境ではコンパイルできないので良く分からんが
例えば、起動して「あ」を入力すると「3バイト」ずれる。
「あ」の文字コードは0x82,0xa0だが、これが正しくtxtの配列に
読み込まれているか、一度printf()デバッグで確認してみるが吉。
ひょっとしてライブラリとかの違いで3バイト入力されているのかも
しれない。
353エディタ製作中@クソ初心者:02/09/03 05:31
>>350
はい。DOS上で動くエディタ作ってます。
あまり実用的な物じゃないかもしれませんが・・・
勉強のつもりで、作り始めました。

回復コンソールとかで動かせたら、このエディタが活躍できるかも・・・。
9x系の、起動ディスクとかのDOS上では動かないと思いますけど・・・。
354デフォルトの名無しさん:02/09/03 05:34
>>353
多分editってコマンドが入っていると思うけど、あんな感じに?


Alt+漢字で入力モードを切り替えるだけでgetchが反応しちゃうんだよな。
355エディタ製作中@クソ初心者:02/09/03 05:36
>>352
アドバイスありがとうございます!
3バイトずれてる・・・
なぜだろ・・・・???

う〜ん、ちょっとその辺を探ってみます。
ありがとうございます。
356エディタ製作中@クソ初心者:02/09/03 05:39
>>354
そうですね。 標準であるeditのようなのを作りたいと思ってます。
標準のeditは、結構高機能ですね〜。
「置き換え」とかもありますし・・・。
標準editを超えたいのですが、かなり無理っぽいです(苦笑

Alt+漢字でgetchが反応!?
・・・それが、3バイトずれる原因なのかな・・・?
う〜ん、調べてみます。
ありがとうございます。
357デフォルトの名無しさん:02/09/03 05:40
エディター君のソース見て
_gotoxy _clrscr について調べてる人、絶対いるだろ。
俺みたいに・・・・・
理由はわからんが2バイト文字列が逆に放り込まれているね。
chとch2を入れ替えて配列に入れればまとも表示されそうな気がする。
お!?
main関数が一番上に書かれているね。俺もそうなんだけどそうしている人は少ないらしい。
360357:02/09/03 05:49
と思ったら一番下のほうに_gotoxy _clrscr の補足が書いてあったよ。 スマソ。
361エディタ製作中@クソ初心者:02/09/03 06:35
う〜ん、ちょっと調べてみたのですが・・・
main関数でgetch()で受けたchの値が、1バイト目じゃなく、
2バイト目の値が入ってました・・・
どーいうことでしょう???
main関数でgetch()関数を2回呼ぶと、ちゃんと1回目には1バイト目。
2回目には2バイト目が入ります。
なので、mainで2バイト目を受けて処理してみたのですが・・・
やはり、それでもダメでした・・・(涙

>>358
アドバイス、ありがとうございます。
main関数で2回getch()関数で読む方法と、
main関数で1バイト目だけ読んで1バイト目調べて2回目読む方法と、
二つで試させてもらったのですが、ダメでした・・・(涙

>>359
あれ?そうなんですか?
こういう書き方は、もう癖で・・・
前は、Perlをいじってました(w

>>360
gotoxy関数や、clrscr関数は、たぶんbcc独自の関数だと思います。
VCやGCCは、調べてないのですが・・・。
フリーのコンパイラbcc5.5でもコンパイルできますので、お持ちでしたら試してみてください。
なぜかはしらんが
gotoxy(x, y);
while ( (ch = getch()) != CTRL_Z) {
/*追加*/fprintf(stderr, "%d ", ch );

すると、漢字のときに負の値がでてくるのだが。
getch()の呼び出しを下記のmygetchに変えたら直ったよん。

int mygetch()
{
int val = getch();
if( val == EOF ) return val;
return (unsigned char) val;
}
364エディタ製作中@クソ初心者:02/09/03 07:20
>>362
はい、この負の値が悪かったようですね・・・
>>363さんが、その辺を修正してくれました。
ありがとうございます!
ちゃんと日本語が入るようになりました!
まだまだ不都合が多いエディタで・・・
また、次のバグが見つかりました・・・。(汗
なんとか、まともにテキストが編集できるよう、がんばって改造して行きます!

みなさん、ありがとうございました。
>>362
んー、bccとvcでは型変換のされ方が違うのか?
VCでは下みたいなソースではマイナスなんざならんのだが。
int ch,ch2, i, j;
unsigned char str[100];

while (1) {
printf("--->\n");
ch = getch();
printf("%02x, ",ch);
printf("%c\n",ch);
ch2 = getch();
printf("%02x, ",ch2);
printf("%c\n",ch2);
str[0] = ch;
str[1] = ch2;
str[2] = 0;
printf("%s\n",str);
}
BCC5.51のお答え。
--->
ffffff8a, ・
ffffffb4, エ
思うに、getchの実装の問題かと
VCでのお答え。
--->
8a, ・
b4, エ

--->
うーむ・・・環境依存だったわけですな。
VCの実装が正しいんでない?
\xffが入力されたときEOF(-1)と比較したら真になっちゃうよ
getchってEOF返すん?
>>370
nullは返せども・・・。
>>365
> んー、bccとvcでは型変換のされ方が違うのか?
> VCでは下みたいなソースではマイナスなんざならんのだが。
型変換のされ方は両者とも同じ、printf()の出力結果が処理系依存なだけ

また、マルチバイト文字をchar型で扱う場合は注意が必要
Cの型変換規則はint以下の型の場合はintに変換されてしまう為、
#include<stdio.h>
int main(void) {
  char c = 0x90;
  int i = c;
  if(i >= 0x80) printf("if\n");
  else printf("else\n");
  return 0;
}
上記のソースを実行すると「else」が出力される
373デフォルトの名無しさん:02/09/03 12:23
このプログラムを実行した場合、何を入れればループを抜けれるんでしょうか?

#include<stdio.h>

main()
{
long nc;

nc = 0;
while(getchar() != EOF)
++nc;
printf("%1d\n", nc);
}
>>373
何入れてもダメだと思う。
>>373
とりあえず
Ctrl-Z か Ctrl-D
を試してみては?
376デフォルトの名無しさん:02/09/03 12:34
>>374-375
ありがとうございます。
一応、文字数を数えるプログラムということで本に載ってたんですが、失敗作ですか?
>>373
> printf("%1d\n", nc);
printf("%ld\n", nc);

# まぁ、コンパイルは通るけどね
>372
printfは別の話だろ。
いまの問題はintを返すはず(なので、漢字の1byte目も
問題ないはず)のgetchが、BCCでは負の値を返すってこと。
>>373
Ctrl押しながらZ
380デフォルトの名無しさん:02/09/03 12:47
>>377
そうしても無理ですよね。
しょうがないので、これは蟲して先に進みます。
ありがとうございました。
>>380
だから、Ctrl-Zだってばぁ〜〜!
>>378
> getchが、BCCでは負の値を返すってこと。
あっそう
ANSI-Cに定められてもいない、独自拡張の関数が
自分の思ったとおりに動かないのを騒いでるだけか
>>381
日本語読めない白痴はほっとけ
Ctrl-Z
↑これは日本語ではなさそう。どうでもいいけど。
38574:02/09/03 14:00
>>349
厨房でごめんね。
俺もがんがるよ。
思い出せません、教えてください
if(isalnum(c))

if(C == (('a'-'z')||('0'-'9')))
こんな感じの記述は出来たでしょうか?
要するにa〜z等の範囲をa-zのような形式で表せたと思ったのですが確信がもてなくて
出先で手元に資料もなく困っています
>>386
文法上は問題ないけど、君の思ったとおりの結果にはならない
if('a' <= c && c <= 'z' || '0' <= c && c <= '9')
# 何故素直にisalnum(c)を使わない?
>>386
できない(拡張仕様は知らないけど)。
てか、コンパイラも無いのか?
389386:02/09/03 16:23
>>387-388
ありがとう!
ああ、俺は何か他の言語とごちゃ混ぜにしてるかな・・・
いや使う使わないではなくてちょっと友達と「a-z」という記述があるかないかの話になってね
有ると言い張ってしまったわけだが・・・
>>387
isalnum使うと大文字も検査しちゃうでしょ。
isupperと組み合わせて使えばよいだけだけどね。
391390:02/09/03 16:30
よく見てみたら間違っているのは>>386の方か。
39260cm浮き上がるストレート:02/09/03 17:37
C言語で
dotting(y,x,red,green,blue);
みたいに書いて、簡単に点を打てるプログラム知りませんか?
(C++じゃなく、ウインドウもひとつ、めんどくさい制御文もいらない)
39360cm浮き上がるストレート:02/09/03 17:40
>>392
プログラムではなく関数
int main()
{
putc('.');
return 0;
}
>>392
PC-98x1だったら、C言語による最新・・・プログラム事典かアルゴリズム事典
を見れば、いくつかのグラフィック関連関数(プログラム)がある。
396デフォルトの名無しさん:02/09/03 17:46
>>392
os書いてないよ
WinならSetPixel()だね。
398デフォルトの名無しさん:02/09/03 17:53
#include <stdio.h>

int main()
{
    int a;
    while(1){
        printf("数字を入力してください\nただし100以下以上であること。");
        scanf("%d",&a);
        if(a <= 0 || a >= 100)
            printf("だめぽ");
        else break;
    }   
    return 0;
}

こうすると a とかを入力すると無限ループのため抜けれません。
数字以外を入力したか判別する方法を教えてください。
よければこのソースの問題点を教えてもらえるとうれしいれす。
399デフォルトの名無しさん:02/09/03 17:54
if( a <= 100 || a >= 0) break;
のほうがいいですか?
400d:02/09/03 17:55
-------変態・MTTどこでも-------
---●●●変態痴女を紹介致します。●●●---
例えば>欲求不満オマ●コヌレヌレ女・露出オナニー痴女・
フェラチオおしゃぶり女・ミニスカ・ノーパン娘・巨乳パイズリ娘・
アナルSEXおねだり娘・オマ〇コ弄られマン汁グチョグチョ女・
SM牝豚・緊縛・浣腸・スカトロ・等・・・刺激を求めています。
●●●学生・OL・主婦・モデル・牝豚・女王様・オカマ等・多数!●●●
 090-8002-8356番   
-----------------------------
  http://www.mttdocomo.jp/
-----女性アルバイト随時募集・高収入(日払い)月100万円可能-----
http://www.mttdocomo.jp/
Iモードはこちら→http://www.mttdocomo.jp/i


401デフォルトの名無しさん:02/09/03 17:55
誤: ただし100以下以上
正: ただし100以下 0以上
400広告うぜえぇええええ師ね。
403デフォルトの名無しさん:02/09/03 17:57
よろしくお願いします。
404デフォルトの名無しさん:02/09/03 17:59
>>399
||じゃなくて&&じゃないの?
あと、0や100が含まれるかどうかによって違う。
>>398
man fflush
もっともscanf使っているのが間違いかもしれぬ。
406デフォルトの名無しさん:02/09/03 18:07
>>405
fflushを何に使うの・・・?
40760cm浮き上がるストレート:02/09/03 18:08
>>396
WindowsMeです。
408デフォルトの名無しさん:02/09/03 18:13
>>407
SetPixel()でいいんじゃない?
ウィンドウを出せればの話だけど。

SetPixel
The SetPixel function sets the pixel at the specified coordinates to the specified color.

COLORREF SetPixel( HDC hdc,
// handle of device context
int X,
// x-coordinate of pixel
int Y,
// y-coordinate of pixel
COLORREF crColor
// pixel color
);
scanfでも戻り値を調べれば一応はまともに動くかな
>>409
ただ戻り値を調べただけじゃだめだね。
scanf()はフォーマット文字列に合致しない入力があると、その文字を
読まなかったことにするので、再度scanf()をやってもさっき読まなかった
文字がまた出てくることになる。無限ループになってしまうのはこれが原因。
これを避けるためには、入力フォーマットに合致しない文字を読み飛ばして
やる必要がある。

>>398 は、例えば非常にいい加減だが、
if (scanf("%d", &a) != 1) { getchar(); a = -9999; }
のようにでもしてやれば、一応無限ループは避けられる。

こういう使いづらい所があるから、ほんとは初心者はscanf()なんて
使うべきじゃないんだが。fgets()とsscanf()の組み合わせの方が好ましい。
411デフォルトの名無しさん:02/09/03 19:46
>>410
ありがとうございました。
「scanfは素人にはお勧めできない」とは、このことだったんですね。
>>404天然ボケですた。
>>405それは何をincludeしたらいいですか?
bccにはリファレンスがついていないので
サンプルきぼんぬ。
412デフォルトの名無しさん:02/09/03 19:48
>>410
あと、後学にもなるので fgets() と sscanf() のサンプルを
おながいします。

とりあえずgoogle言ってくるけど、
プログラム作る上でお勧めの検索エンジンってありますか?
413デフォルトの名無しさん:02/09/03 19:53
>>412
char buf[256];
int i;
do{
fgets(buf,sizeof buf,stdin);
}while(sscanf(buf,"%d",&i)!=1);
atoi()というものを使えればそれを使えば良いのでは?
isdigit()と組み合わせて・・・あまり意味無い?
if(0<=a && a<=100)の方が感覚的に「aが0以上100以下」とわかりやすいと思う。
if(a<0 || 100<a)これなら「aが0〜100を含まない」となる。
割りこみ失礼
>>414
if(0<=a && a<=100)の
盲点だったYO!!

猫でもも結構いいけど、なぜか漏れが改造すると bccが
)がありません
)がありません
}がありません
とか連発する罠。

つけてるし、うまくいくはず(脳内コンパイラ)なんだけどなぁ。
416デフォルトの名無しさん:02/09/03 20:00
突然ですが、
char *p=strchr("abcdefg",'d"');
printf(p);

で画面に
「efg」
と出力させるのは分かるのですが、
逆に
「abcd」
と出力させれる
「strchr」の代わりになるような関数って
ないですか?
>>416
eの地点に\0書きなさいな。
燃料投下
printf("%.*s", ...);
420410:02/09/03 20:14
>417
なるほど、言われてみれば当たり前ですね。
出直してきます。
>>416
ない。作れ

>>417
文字配列ならともかく、文字列定数の書き換えは未定義
422410:02/09/03 20:17
>>421
はいはい、クソレスしかしないなら出てくんなよ。
はいはい、真性厨房or騙りのDQNは出てくるな
糞レスか・・・・?
かなり重要な事柄だと思うが。
425421:02/09/03 20:47
>>422
> printf(p);
糞コードを書いてる奴にはクソレスにしか見えないみたいだね。

君ごときにはこんな糞コードで十分だろう。
ある条件以外の場合はまとも動くぞ
char *p = "abcdefg";
int i = strchr(p, 'd') - p + 1;
printf("%*.*s", i, i, p);
>>421
降参だ。その条件を教えてくれ。
>>426
strchr()で探す文字が見つからなかった場合に、NULLが返ってくるから
マズーってことではないの?
428デフォルトの名無しさん:02/09/03 21:33
>>427
この場合は絶対に見つかるじゃん。
430デフォルトの名無しさん:02/09/03 21:57
428はその場さえよければいい人間なのね
431410:02/09/03 22:12
すみません、私の質問の仕方が悪かったのかもしれません。
私の聞きたかった答えは
>417さんので満足です。

>421さんの言われてるのも確かですし、
(実際は文字列定数ではなく、char s[256]みたいに
使ってますので問題なし)

>428さんの言われてるのももっともです。
ちなみに実際はNULLを確認するようにしてます。

みなさん、そんなに深読みしてくれなくて結構ですよ。
私なんぞは\0で十分ですw
ではでは、お世話になりました。
pの内容が可変であるとは一言も書いてないじゃん
>399
それ以前に
  if(a < 0 || a > 100)
だと思われ。
個人的意見を押し付ければ
  if(a >= 1 && a <= 100)
のように判定するほうが好き。

永久ループになるのは、入力された値が%dに適合しないのでscanf()で取得されてないから。
安全に逝くならfgetsで数文字列かどうかを判定してからatoi()などで変換をかける。
scanf()にこだわるなら、戻り値を調べてEOFだったら対処する、などすれば平気かと。
>>431
気にしなくていい。>>421とか単に人を叩いて優越感に浸ってるだけだから。
どこが叩きなんだろうか。
43660cm浮き上がるストレート:02/09/03 22:18
>>397
>>408

今僕がプログラムで絵を書く場合はエスケプの色変えとカーソル移動を
使用して書いています。しかし最小単位が文字単位なので
荒い絵になってしまいます。

または外字エディタを使って行っています。
この方法はは絵を文字のように使用できて楽なのですが
色が1色、パソコンが変わるたびに登録しなおさなければならない
等の制約があります。
43760cm浮き上がるストレート:02/09/03 22:19
>>436の続き

エスケプを使用するやり方はこんな感じでやります。
setpixel()を使用する方法はどのように記述すればよいのでしょう?

void main(void)
{
int y=0,x=0;

char suraimu[9][9]=
{
"000040000",
"000040000",
"000444000",
"004040400",
"044444440",
"441444144",
"444111444",
"444444444",
"044444440",
};

for(y=0,x=0;y<=8;x!=8?x++:(x=0,y++) )
{
printf("\x1b[%d;%dH",y+1,x*2+1);
printf("\x1b[%dm ",suraimu[y][x]-8);
}
printf("\x1b[0m");
}
>>436
それはDOS?Windows?
コンパイラは何使ってるの?
439デフォルトの名無しさん:02/09/03 22:27
もちろん、Cコンパイラです
ttp://www.cmagazine.jp/
>[今週のProgramming Q]
>Q. C言語で表示する文字の色や大きさを変える
>「○○ちゃん。今度は文字に色つけて,おっきくして,亀の絵もいれてね。」
>確かC言語にはグラフィックス機能はないのでは……。

↑かなりワラタ。
誰か答えてあげて。
44160cm浮き上がるストレート:02/09/03 22:32
>>438

visual c++6.0を起動してCプログラムを書いてます。

プログラムの技術はそこそこあるとは思うのですが、
(今SRPG、将棋、野球ゲームを作ってます)
ただコンパイラとかOSとか違いとかほとんどわからないので、
コンパイラやOSが違うと使えないとかが全然わかりません。
ネタ…だよな?
>>441
野球ってベストプレープロ野球みたいなシミュレーションだよね?
ソースうpキボンヌ
444デフォルトの名無しさん:02/09/03 22:37
>>441
将棋って森田将棋みたいなのだよね?
ソースうpキボンヌ
>>441
SRPGってスーパーロボット対戦みたいなのだよね?
ソースうpキボンヌ
>>441
野球ってエポック社の野球盤みたいなシミュレーションだよね?
ソースうpキボンヌ
44760cm浮き上がるストレート:02/09/03 22:50
443>>

ピッチャーのボールの起動のリアルさを追及しています。
リリースポイント、初速、飛び出す角度、回転の角度、回転力を
1/100秒単位で計算して表示しています。
後は風力、気圧、縫い目の角度等を入れるともっとリアルになるのですが、
今の技術では難しいです。
パワプロはここの部分は雑なので
対抗するにはこういうクロート好みの要素も必要かと。
ゲームの分野は含みを持たせているので、まだ決まっていませんが、
スポーツかシミュレーションになると思います。
44860cm浮き上がるストレート:02/09/03 22:58
444>>

駒は外字エディタを使用して表示しています。
コンピューターとの対戦はまだできません。
棋譜の保存はできます。
今は自動詰め将棋生成機能を制作しています。
CONとの本将棋対戦ができるようになるのはいつのことか。
4492cm沈むストレート:02/09/03 23:02
446>>

ピッチャーのボールの転がるリアルさを追及しています。
リリースポイント、初速、飛び出す角度、回転の角度、回転力を
中央のツマミと左のツマミの磁石で調節しています。
後は人型の人形、ホームランの穴、消える魔球の穴を入れるともっとリアルになるのですが、
今の技術では難しいです。
45060cm浮き上がるストレート:02/09/03 23:05
445>>

これも含みを持たせるために、FE系、スパロボ系とかは
まだ決めていません。まずはSRPGツクールみたいなのを作り
どういうタイプにも対応できるようにして
それから決めようと思っています。
ただ一番の候補はFEとシレンを合わせたようなやつです。
FEの戦略性と、シレンのスピード性を併せ持つような感じです。
さらにこれが含意を与えるために、それらはFEシステムおよび
SUPAROBOシステムです。それはまだ決定していません。
それが第一にSRPG TSUKURUみたいであることは作ります。
それは任意のタイプにそれによって対応させることができます。
また、私は、配置の方法を思います。候補、1番は単にFEとSHIRENを
結合した仲間です。FEの戦略性質およびSHIRENの速度性質を
持っているのはタッチです。
>>447-450
ソースは?
アプするところが無いならここに全部貼れ
更に、それらはこれが含意を与えるためにFEシステムおよび
SUPAROBOシステムです。それはまだ決定されません。
それを見るために私が望むSRPG TSUKURU--最初に
(1番目)それは現われることができます、また、あるものは、
合意の中でそれによってそれを更に作る任意のタイプを
作ることができます、私は、配置の方法を考慮に入れます。
候補および1番はFEとSHIRENを単に組み合わせた友達です。
タッチは、FEの戦略特徴およびSHIRENの速度特徴を持っています。
>>440
DOSなら \x1b[〜とかで色をつけられなかった?
それプラス、亀のAAか・・・??(爆
455エディタ製作中@クソ初心者:02/09/04 06:49
すみません・・・ また、質問いいでしょうか・・・(汗
エディタ作ってるC言語初心者です。

えっと、今回は謎の文字出現&謎の文字化けのバグについて、
アドバイスいただきたくて来ました・・・(汗
だいたいのテキストは正常に読めるのですが、
まれに一部文字化けするテキストがあります。
その文字化けする文字が含まれてる別のテキストだと、
正常に読めたりするので、まったく原因不明です・・・(涙
それと、まれに謎の文字が出現するテキストがあります・・・
たとえば、俺自作エディタでエディタソースを読むと、「る */」という文字が
出現する所があります・・・
これも、さっぱり原因不明です・・・(涙

http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/375.zip

ここにソースを上げさせてもらいました。

助けてもらってばかりで申し訳ないですが・・・
どうか、よろしくお願いします。
>455
見てないからなんとも言えないけど、
デバッガで調べてみた?
っていうか、いきなりソース見ろって言われてもめんどくさいよ。
短い文で説明するのも力だと思うし、
それにさ、せめてzipとかじゃなくて、
問題ありそうなところの
.cとかで一枚にまとめるとかしてよー。
いわゆるソースまるなげ君は
うざいよ。
457エディタ製作中@クソ初心者:02/09/04 07:15
>>456
申し訳ないッス。
えっと、問題ありそうな部分という所すら
検討がつかない状態だったりします(汗
いろいろ自分なりに、見てみたのですがさっぱりで・・・(涙

もうしばらくソース眺めてます。
ありがとうございました。
つかこれ、どうやって正常終了すんの。。と思ったら^Zか
>>458
はい、Ctrl-Zで終了します。
今気づいたら、文字入力にバグがありますね・・・
さっき改造した時に新しいバグができてしまったようです・・・。
これも、修正しなくては・・・。
456みたいなわざわざ文句を言うだけのために2chを
見る変人もいるが余り気にするな 
基本的に、画面更新のバグじゃなさそうだから、
最初のファイル読み込みでコケてるんじゃない?
配列txtの内容をどっかに吐き出してみるとか
いちいち画面を再描画していたら
古いマシンではどんなパフォーマンスになるか分からんから
dellineとかinslineとか利用できるなら利用して
必要部分だけの描画にしたほうが
いいかもしれないようなどうでもいいような
あんま関係ないけど定数YOKOがキモイなあ。
一行の最大文字数と思わせておいて、'\0'を含むサイズだという
個人的にフリーカーソルは好きじゃないなあ
改行文字も明示がいいなあ
465エディタ製作中@クソ初心者:02/09/04 07:53
>>460
ありがとうございます。
でも、実際にソースまる投げで質問してるので・・・
やっぱり、うざいヤツだと思われても仕方ないです(汗
このスレには、親切な方が多いので、甘えてしまったりしてます(汗

>>461
アドバイスありがとうございます。
わかりました。
まだ、文字化けやらの問題が多いので
ファイル出力機能は実装してなかったのですが・・・
一度、デバッグ用のファイル出力処理を作ってみます。
ありがとうございます。

>>462
アドバイスありがとうございます。
実は、自分でも再描写する時、画面がうるさく感じて、
どうにかしてスムーズに再描写できない物かと考えてました。
delline関数やinsline関数ってのがあるんですね・・・。
どうやら、2つの関数が使える環境のようなので、
組み込んでみます。 ありがとうございます。
466462:02/09/04 07:57
利用できるならという意味はwin32環境では
conio.hの一部の関数がバグることがあるようだという意味ね
467エディタ製作中@クソ初心者:02/09/04 07:59
>>463
えっと、この辺の設定は・・・
自分が分れば良いや、的な所があります(w

>>464
カーソルの形状ですか・・・。
う〜ん、この辺は後々ということで・・・(汗
改行の明示は、がんばって組み込んでみます。
468エディタ製作中@クソ初心者:02/09/04 08:01
>>466
あれ?そうなんですか?
コンパイラは、bcc32です。
コンパイラは、もちろん32ビットコンパイラ。
コンパイルしたファイルも32ビットの実行ファイルですので、
そういう不都合は無いと思ってたのですが・・・(汗
>>464 フリーカーソル=カーソルが行末を越えて動き回れること、と思われ
>>468 WindowsのDOSエミュレーションが不完全かもしれないってことじゃない?
47060cm浮き上がるストレート:02/09/04 08:14
>>408

点はSetPixel()を使えば打てるとのことですが、
SetPixel()を使うためにその前に何を記述しなければならないのでしょう。

持ってる本に「Windowsプログラムを10倍簡単に作る」というのがあって、
そのなかにSetPixel()のことが乗っていたのですが、この本は
ヘッダの呼び出し→そのヘッダがまた呼び出す、がいっぱいあり
どれが必要かわかりません。
もし全部必要なら困ってしまいますが。(点をひとつ打ちたいだけなのに)
点を打つためには画面を初期化しなければいけないみたいなのですが
その初期化さえできれば点を打てるようになるのでしょうか。
>>469
おっと・・・
失礼しました。
改行部分からカーソルが飛び出さないように
ってことだったんですね(汗
わかりました。
組み込んでみます。

DOSのエミュレーションの問題ですか・・・。
その辺の不都合は、どうしようもないですね・・・(涙
わかりました。 不都合が出そうな関数は避けて使っていきます。
今の所、DOSが悪いと思うような不都合はない・・・と思いますが・・・
変な文字が出るのは、DOSの不都合なのでしょうか・・・。
とにかく、配列txtを書き出して見てみます。
ありがとうございます。
>>470
必要なヘッダはwinodws.h
必要なライブラリはgdi32.lib
あんた技術あるんだったらここから先は自分で出来るだろ

ついでに大サービスだ
http://www.microsoft.com/japan/developer/library/jpgdipf/_win32_setpixel.htm
あ、すみません。
ソース内に、カーソル移動をしていると、エディタが落ちる事があると書いてますが、
原因が分りました。
左右のカーソル移動は、2バイト文字に対応して
2バイト文字も一文字として進みますが、
上下のカーソル移動が2バイト文字に対応してないので、
上下にカーソルを移動して左右にカーソル移動させると、
エディタが落ちることがあります。

まったく、うっとうしいエディタで申し訳ないです(汗
なんかわかったような気がする。
strncpyって打ち切りの場合、ヌルターミネータ付けてくれないよね?
buf[80] = '\0';
が要るんじゃないか?

167行目〜
/* 画面にテキストを表示 */
textcolor(LIGHTGREEN);
clrscr();
for (i=0; i<=22; i++) {
 gotoxy(1, (i+1));
 strncpy(buf, txt[i], 80);
 cputs(buf);
}
474が正解だとすると、配列txt[][]の問題ではなさそうだな。スマソ
476デフォルトの名無しさん:02/09/04 08:48
決定的くさいのでage
477474:02/09/04 08:50
ちなみに俺もこれでハマった事がある
478474:02/09/04 09:02
http://www.catnet.ne.jp/kouno/c_faq/c13.html#2
13.2:
なぜstrncpy()はコピー先の文字列に、終端文字の'\0'を付けないことがあるのか。

A:

元々はstrncpy()は、今となっては時代遅れになってしまったデータ 構造、
すなわち固定長で必ずしも\0で終わるとは限らない"文字列"を 扱うために
設計された(strncpy()の関連する奇妙なところは、指定さ れた長さになる
まで\0を埋めることである)。確かにこの"文字列"以 外を扱うときは少し
間抜けである。しばしば目的の文字列に、自分で' \0'を追加しなければな
らない。この問題はstrncpy()のかわりに strncat()を使うことで回避する
ことができる。もしコピー先の文字 列が最初は空なら、strncat()が、
strncpy()がやってくれると思って いたことをやってくれる。他には
sprintf(dest, "%.*s", n, source) が考えられる。

(文字列ではなく)任意のバイトをコピーするときには、普通は memcpy()
のほうがstrncpy()よりも適切なルーチンである。
479エディタ製作中@クソ初心者:02/09/04 09:10
>>474-478
ありがとうございました!
謎な文字が表示されることなく、
テキストが表示されるようになりました!

ご迷惑おかけしました。
まともにテキストが編集できるよう、がんばって改良を加えていきます。
本当、ありがとうございました。
>>479
それにしても汚ねーソースだなー
もう少し綺麗に書けんのか
481デフォルトの名無しさん:02/09/04 10:25
> 指定された長さになるまで\0を埋めることである

ここが阿呆らしい。だれだこんな仕様にした奴は。
あとputsは改行するのにfputsは改行しないとか。
48260cm浮き上がるストレート:02/09/04 10:25
>>472

WINGDIAPI COLORREF WINAPI SetPixel
(HDC hdc,int X,int Y,COLORREF crColor);

の所に「構文エラー : ';' が 'type' の前に必要です。」
と出てエラーになるのですがどうすればよいのでしょう。
483デフォルトの名無しさん:02/09/04 10:30
';' を 'type' の前につければいいんじゃないの?
484デフォルトの名無しさん:02/09/04 10:40
>>482
MFCを使うなら、
CDC* pDC;
pDC = GetDC();
pDC->SetPixel(x, y, RGB(0, 0, 255));
ReleaseDC(pDC);

C++だけどさー。
48560cm浮き上がるストレート:02/09/04 11:18
SetPixelV
(
HDC hdc,←この行のエラー_)がtypeの前に必要、SetPixelVの実引数が少なすぎる
int x,
int y,
COLORREF crColor
);←この行のエラー:構文エラー_)

これら3つを解決するためにどう書き換えれば良いのでしょう。
486デフォルトの名無しさん:02/09/04 11:20
>>485
ところで、それどこに書いたの?
48760cm浮き上がるストレート:02/09/04 11:39
>>486

main()の中にです。
SetPixelVの前にウインドウを開き、最後に

void GEnd(void)
{
MSG msg;
EndPaint(SLS_hwnd,&hpaint);
while(GetMessage(&msg,NULL,0,0))
DispatchMessage(&msg);
}

を呼び出して終了します。
488デフォルトの名無しさん:02/09/04 11:50
どうみても>>485は関数のプロトタイプ宣言なんだが・・・・
実際に SetPixelV を呼出している個所を見せて
490デフォルトの名無しさん:02/09/04 11:53
>>487
実際のソースをかいてちょ。
491デフォルトの名無しさん:02/09/04 12:11
リンカーもC処理系に入るんですか?
>>491
どうだろう?C言語を直接処理するものだけかもね。
コンパイラは言語に依らない共通のオブジェクトファイルを生成し、リンカはそれらを実行可能ファイルに仕立てる。
49360cm浮き上がるストレート:02/09/04 12:26
489>>

#include <windows.h>

#include "GInt.h"
#include "GetMaxScreenY.h"
#include "GetMaxScreenX.h"

void main(void)
{
gint(640,400);

SetPixelV
(
HDC hdc,
int x,
int y,
COLORREF crColor
);

gend();
}

呼び出され元は少し長いので省略します。
SetPixelV();を書かないときはエラーにならないので
ここが問題だと思いますが
それは確かに文法上の誤りであるね。
495デフォルトの名無しさん:02/09/04 12:33
>>493
野球ゲーム作ったんだよな・・・。
ネタであってくれ。
要するに、全然意味判らずに、プロトタイプ宣言をそのまま
コピー&ペーストしたと。API云々以前に、文法を解っていないと。
49760cm浮き上がるストレート:02/09/04 12:38
>>494

どう直せばよいのでしょう。
>>497 勉強し直せばよいのでしょう。
私はパス。残念ながらお手伝いできないと思います。
500デフォルトの名無しさん:02/09/04 12:43
VBかJavaアプレットをお勧めする。
50160cm浮き上がるストレート:02/09/04 12:51
>>495

野球ゲームはグラフィックを外字エディタなどで作ったので。
こういうドット文法は初めてなのです。
グラフィックにこだわらないなら、
printf()、+-*/%、勝俣、getch()、条件文等を
工夫することによってどんなものでも作れますが、
グラフィックも覚えたいと思い質問しました。
50260cm浮き上がるストレート:02/09/04 12:54
>>496

まさにそのとおりです。

>>501 「ドット文法」がNGワードです。
>>501
まずは C言語を覚えましょう。
505デフォルトの名無しさん:02/09/04 12:57
>>501
Windowsでプログラミングをするにあたって、ウィンドウを出してグラフィックをするのは
C&Win32APIはかなり難解です。
C++&MFC(=VC++)とかの方が比較的易しいです。
C++&.NETも易しいかも。
>>493に、何処に何をどう描くか、という情報が一切盛られていないことに、
あなたはまるで疑問を持っていない様子ですね。
表現は悪いですが、正直な所、非常に不気味です・・・。
浮き上がりすぎ
50860cm浮き上がるストレート:02/09/04 13:07
>>500

確かにVBはグラフィック楽ですよね。
でも制作スピードは落ちてしまいます。
かなりゲームサイズが大きいので、
スピード、総合力ではCが一番だと思います。
ゲームの三要素である、システム、音楽、グラフィック
前の二つは得意なのですが。
>>508
Cでごにょごにょやるよりはよっぽど生産性はいいと思うが。
>>508
15年くらい前にあったようなテキストのゲームが作れたくらいで
得意とか言わないでくれ。
>>508
ネタにマジレスっぽいが、
C言語の初歩も理解してないのになぜ制作スピードがVBより早いと
言い切れるのか?
とにかく、こんなところでケチしないで何かサンプルの豊富な本でも買えばどう
C言語やってる奴は性格悪いとか言い出しそうなヨカン。
マジレス
Cだけでは無理。
51560cm浮き上がるストレート:02/09/04 13:18
>>506

確かにそうですね。
関数呼び出しの中でデータ型宣言するのはおかしいですし。
こういう特殊な文法なのだと思ってましたが。
SetPixelV(,640,400,色番号);
こういうにして指定の座標に指定の色の点を打つみたいに
使うのでしょうか。
その場合は実引数の一つ目はどういう風に使うのでしょう。
>>515
ウィンドウのハンドルとか取ったりしなきゃだめだよ。

それより、ウィンドウは出てるの?
誰か、いいサイトあったら紹介してあげて
518デフォルトの名無しさん:02/09/04 13:19
>>515

関数呼び出しというか・・・あれは関数のプロトタイプ宣言だろ・・・
戻り値の型が省略されている上に、関数内に書かれているからコンパイラは関数呼び出しと勘違いするだろうけど。
51960cm浮き上がるストレート:02/09/04 13:25
>>511

将棋をCとVBの両方作りました。
Cは外字エデッタで、VBはCの外字エディタのグラフィックと同じくらい
簡単なのを取り込みました。
将棋というグラフィックの量が少しでいいゲーム、
Cの方が使い慣れてるというのもあると思いますが、
テキスト内だけでほとんど作ってしまえるところが
速いところだと思います。
>>519
そう言う実装依存のところをさっさと抽象化できるかが開発の肝だと思われ。
変に使い慣れてしまったのね。
むしろ、どんなソースなのか見てみたいような、見たくないような・・
52360cm浮き上がるストレート:02/09/04 13:28
516>>

はい、出ています。
まずウィンドウをつくらないと。
この状態からCでつくるとなると溜め息が出るな。
確かにプログラミング言語というものは元来、慣れとカンでどんどん使えてしまう
ものでもあったのだけど、最近のモダンな言語は、それと比べて官僚的な
開発スタイルを要求するのかもしれない。
>>523
そのウィンドウはどうやって出しましたか?
>>524
そう?一回書いたらそれ半永久的に使い回せると思うけど。
マジですか?
ちょっとまって、"Gint.h" って何?何かツールキットを使っているの?
>>529
"〜.h"だから多分自作だと思うけど・・・
>>525
それは C言語というよりAPIやライブラリの問題。
53360cm浮き上がるストレート:02/09/04 13:36
>>522

でかいし、ホームページもないので全部は無理ですが、
よく使う作った関数を乗せます。
カーソル移動などに使います。

void ChangeYX(int *y,int *x,int yMin,int xMin,int yMax,int xMax,int loop,int keyEffect)
{
if(keyEffect==2)
if(*y+1<=yMax)*y+=1;
elseif(loop==1) *y=yMin;
if(keyEffect==4)
if(*x-1>=xMin)*x-=1;
elseif(loop==1) *x=xMax;
if(keyEffect==6)
if(*x+1<=xMax)*x+=1;
elseif(loop==1) *x=xMin;
if(keyEffect==8)
if(*y-1>=yMin)*y-=1;
elseif(loop==1) *y=yMax;
}
>>532
intってinitのことかしら?初期化とか言っているし。
Windowsプログラムを10倍簡単に作る
目次


第5章 描 画 …… 166
ウィンドウに点を打つ 点関数 pset
排他的論理和で点を打つ 論理差点関数 psetXOR
論理和で点を打つ 論理和点関数 psetOR


psetを使え(w
536デフォルトの名無しさん:02/09/04 13:38
elseとifがくっついとる(w
「10倍簡単に」は激しくお薦めできん。いや、漏れも持っているが。(w
猫見てこいよ
>>533
質問。

x = ((x = (x + 1) % xMax) <= xMin)?xMin:x;


とかではダメですか?
54060cm浮き上がるストレート:02/09/04 13:41
>>529-530

Windowsプログラムを10倍簡単に作るプログラムというのに乗っている
やつです。

発行所
http://www.kyoritsu-pub.co.jp/

http://www.hir-net.com/book/book14/
54160cm浮き上がるストレート:02/09/04 13:43
536>>

スペースが消えてしまったので。
>>539
それは没。
素直にif文にしろ。
10倍難しくなってないか?
しかし謎は解けたな
54660cm浮き上がるストレート:02/09/04 13:49
>>539

すぐには解りませんが、3項演算子を使ったやつですね。
MaxとMinをひとつの式に書いているんだとと思いますが。
ここでは使ってませんが、繰り返し分でyとxの2種類のカウンタがあるとき
等によく使います。
一回試してみます。
出血サービス。
SetPixelVでデスクトップに絵を描く例。
でもコンソールに直接描画したいなら使えないよ。

#include <windows.h>

int main(void)
{
  HDC hDC;
  int x, y;

  hDC = GetDC(NULL);
  if(hDC) {
    for(y = 0; y < 256; y++)
      for(x = 0; x < 256; x++)
        SetPixelV(hDC, x, y, RGB(x,y,y));
  }
  ReleaseDC(NULL, hDC);

  return 0;
}
なんか思い出してきた。この「10倍」っての読んだ記憶がある。
これって確か、ライブラリじゃなくて、関数のソースまるごと一本 #include
して使うんだよね?違ったっけ
549547:02/09/04 13:57
あ、ごめん、間違いがあった。
ReleaseDCの行を1行だけ上に移動してifブロックの中に入れてね。
>>545
謎も何も >>470 に書いてあるし。
>>550
ほんとだ。別の話題で気が付かなかった
55260cm浮き上がるストレート:02/09/04 14:00
>>535

ヘッダがまたヘッダがまたヘッダと呼び出していくのでどれを使えば
良いのか解りません。一応全部のファイルの使われ方を
エクセルにまとめてあるのですが、重複で呼び出されていたり
また、.cのどこの部分を使えばよいのかもわかりませんでした。
>>552
その本を持っていない人に聞いても、わからないね。
>>539
激しく未定義の動作だと思うが。
文書を読まずにソースを読む。これときどき最凶
本を持っていなければ
http://www.vector.jp/soft/win95/prog/se187820.html
をいじってみなきゃワカランということか
>>552
インクルードガードがあるはずだ。呼び出しが重複していても問題ない。
自分が使うものは全部インクルードしる!
>>556はサンプルコード集だった。とりあえずgrep結果:

gint_t2.cpp:8:#include "pset.fx" // 点関数
gint_t2.cpp:27: pset(CX+int(CX*cos(pi2*n1*t)),CY+int(CY*cos(pi2*n2*t)),1);
gwait_t1.cpp:10:#include "pset.fx" // 点関数
gwait_t1.cpp:51: pset(x+1,198,7); // 描画領域際に白い点
gwait_t1.cpp:70: pset(x,198,7); // 描画領域際に白い点
rrectangle_t2.cpp:10:#include "pset_mode_set.fx" // 描画モード設定関数
rrectangle_t2.cpp:81: pset_mode_set(1); // XOR指定

ここまでしかワカランが
いずれにしても、この本を使うと変な癖つきそうなので早めに止めといた
方がいいかと。
56060cm浮き上がるストレート:02/09/04 14:16
>>549

エラー、警告はありませんでしたが、止まってしまいました。
パソコンやOSの違いもあるのかもしれませんが。
でもhDC等の使い方が解りやすかったので、DOS画面に使うときにも
感覚的に応用できそうです。ありがとうございました。
どっ、D・・・
ちょっとしたグラフィックスを描いてみたいというのなら確かに
10倍くらい簡単にできるが、それを発展させようとしたら難しさは∞。
欲深い人は使っちゃ駄目だな、10倍の本は
俺も「Windows95プログラムを10倍強力に作る(C++版)」っていうのを
持ってる。中身も見ずにネット通販で買ったんだが。

#include "get_window_pos_x.fx" // ウィンドウX位置関数
#include "get_window_pos_y.fx" // ウィンドウY位置関数
#include "get_max_screen_x.fx" // 最大画面Xサイズ関数
#include "get_max_screen_y.fx" // 最大画面Yサイズ関数
#include "getwinx.fx" // ウィンドウXサイズ関数
#include "getwiny.fx" // ウィンドウYサイズ関数
       :
>487の
> void GEnd(void)
> {
> MSG msg;
> EndPaint(SLS_hwnd,&hpaint);
> while(GetMessage(&msg,NULL,0,0))
> DispatchMessage(&msg);
> }

これがそのライブラリの中身だとしたら、
EndPaintの使い方が間違ってるよ。
EndPaintはWM_PAINTメッセージに応答する時に使う。
>>560
単に描画してそのまま終了するプログラムで、
止まることは考えにくいと思うよ。
56760cm浮き上がるストレート:02/09/04 14:28
点が打てれば、後は>>437みたいに組んで絵も簡単にかけると思っていたのですが。
昔は簡単だったみたいなのですが。
(友達が持っていたのを見た。行番号ありの黒いテキスト画面)
今はその環境を作ることだけでも大変なんですね。
でもなぜそうなったのでしょう。逆に便利になったこともあるのでしょうか。
>>567
まずイベントドリブンという概念を理解しないといかんな。
10倍の本はその概念を無視しているわけだが。
>行番号ありの黒いテキスト画面

ってBASICのことか?
57060cm浮き上がるストレート:02/09/04 14:32
>>566

止まるというか画面が飛んでしまい、
黒いバックに青いウインドウがでて(VAIO独特?)
エラーが発生しましたとなりキー入力を受けつかなくなったので
強制終了しました。
57160cm浮き上がるストレート:02/09/04 14:37
569>>

多分そうだと思います。友達の友達が作ったらしいのですが、
レースゲーム、2×2の横見バレーボール、FFの格闘ゲーム
等やった覚えがあります。
>>571
10年以上前の話だろ?
57360cm浮き上がるストレート:02/09/04 14:43
>>572

7、8年前です。まだマウスがなく、フロッピードライブも2段ついていたような。
たしかに俺も1995年ごろはPC-386SE使ってた
漏れも大サービスしてやろう。
コンソールに直接描画する方法だ。描画ルーチンは >>547 をそのまま拝借。
イベントドリブン? 何それ(w

#include <windows.h>
BOOL IsWindows9x()
{
    return (GetVersion() >= 0x80000000);
}
int main(int argc, char *argv[])
{
    HWND hWnd;
    HDC hdc;
    char szOldText[80], szId[32], szTemp[32];
    int x, y;

    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);
    for(y = 0; y < 256; y++)
        for(x = 0; x < 256; x++)
            SetPixelV(hdc, x, y, RGB(x,y,y));
    ReleaseDC(hWnd, hdc);
    return 0;
}
DOSのTurboCとかなら簡単にグラフィックス使えたけどな。
その点最近はグラフィックスが・・・
Javaですかね?グラフィックスを多用するなら。
「10倍」は、#includeの羅列と、
その関数の行の多さを認識して萎えたね。
578デフォルトの名無しさん:02/09/04 14:56
>>567 >でもなぜそうなったのでしょう。逆に便利になったこともあるのでしょうか。

グラフィカルユーザーインターフェース(GUI)は
ユーザーに優しくてプログラマに厳しい。
従来のCUIはその逆。
そろばんと同じで慣れれば効率いいんだけどね

UNIX等ではいまだにCUIが幅をきかせてるけど
それはユーザ=プログラマだから。
>>575
> コンソールに直接描画する方法だ。
コンソールに描画したところで、再描画ができないんだから
意味がない。
580h:02/09/04 14:57
-------変態・MTTどこでも-------
---●●●変態痴女を紹介致します。●●●---
例えば>欲求不満オマ●コヌレヌレ女・露出オナニー痴女・
フェラチオおしゃぶり女・ミニスカ・ノーパン娘・巨乳パイズリ娘・
アナルSEXおねだり娘・オマ〇コ弄られマン汁グチョグチョ女・
SM牝豚・緊縛・浣腸・スカトロ・等・・・刺激を求めています。
●●●学生・OL・主婦・モデル・牝豚・女王様・オカマ等・多数!●●●
 090-8002-8356番   
-----------------------------
  http://www.mttdocomo.jp/
-----女性アルバイト随時募集・高収入(日払い)月100万円可能-----
http://www.mttdocomo.jp/
Iモードはこちら→http://www.mttdocomo.jp/i

58160cm浮き上がるストレート:02/09/04 15:02
575>>-576

すごい!!あんだけ短い文章で。きれいな背景が出てきました。
しかも同じウインドウだし。
ぜひ参考にさせていただきます。ありがとうございました。
>>579
細かいことは気にすんな(w
58360cm浮き上がるストレート:02/09/04 15:09
>>577

確かにTURBO_Cは簡単そうですね。
古本屋で、「自習TURBOCゲームで挑戦」という本を見つけ持ってますので、
少し知っています。ただ関数とか制御とか1分今では使われてないとかで
グラフィック使用はできませんでした。
ただゲームの作り方は結構この本で学びました。
>>583
で、何を聞いているんだっけ?
解決した?
>>577
OpenGL+GLUT だと初期化100行くらいでとりあえずグラフィックできる。
58660cm浮き上がるストレート:02/09/04 15:17
>>578

なるほど。誰にでも平均的に使いやすいように
変わってきたのですね。だから早い感覚を必要とする場合
その遠回りなところが逆に使いにくくなってしまうのですね。
58760cm浮き上がるストレート:02/09/04 15:22
>>584

質問内容は簡単に点を打つでした。
>>575-576の方に教えてもらったのでできそうです。
588デフォルトの名無しさん:02/09/04 15:34
めちゃくちゃパフォーマンスが悪い罠
58960cm浮き上がるストレート:02/09/04 15:43
>>539

ちょっと解りませんでした。3項演算子を使うときはこんな感じで
for(y=-9,x=-9;y<=9;x!=9?x++:(x=-9,y++) )
代入にはあまり使わないので。
僕の場合はカーソル移動に使うボタン分書かなければいけませんが
この場合は見てる感じそれをひとまとめにしてしまうのでしょうか。
もしそうならかなり便利ですね。この感覚を他にも適用できたら、
テキスト量を減らせそうです。
> 3項演算子を使うときはこんな感じで
> for(y=-9,x=-9;y<=9;x!=9?x++:(x=-9,y++) )

はあ?
for(y = -9; y <= 9; y++)
 for(x = -9; x <= 9; x++)
のように素直にネストすればいいじゃん。
そんなことしても効率が悪いだけだよ。
確かに効率が悪いな。
どうせメモリが遅いから大差ない
テキスト量ってソースコードの量か。そんなもん下手に減らしても仕様がないぞ
>>592
はあ?メモリ?
595デフォルトの名無しさん:02/09/04 16:59
Pro*Cで、varchar使うとき、いちいちlenとか入れるの面倒なんで、
varchar版のstrcpyを作ろうとしてるんですが(゚д゚)ウマーく行きませぬ

な ぜ で せ う?


/*-----------------------------------------------------------*/
#include <stdio.h>

vstrcpy(void *vchar, char str*);

int main(void)
{
struct { unsigned short len; unsigned char arr[40]; } username;
vstrcpy(username, "moe");
printf("str %s\n", username.arr);
printf("len %d\n", username.len);
}

vstrcpy(void *vchar, char str*)
{
strcpy(vchar->arr, str);
vchar->len = strlen(str);
}
/*-----------------------------------------------------------*/

こんな感じなんですが
596デフォルトの名無しさん:02/09/04 17:03
>>589
トリッキーなコード書いても
自己満足以外にえられる物はないよ。
むしろコンパイラの最適化を妨げになるかも。

それに脳みそ100%フル稼動させないと書けない、追えないようなコードには
バグも沢山いるもんだ。
void *vcharが悪い
598デフォルトの名無しさん:02/09/04 17:16
3項演算子の入れ子はやめて(;´д`)
599595:02/09/04 17:18
> 597

えと。。。 void * って使えないんですか?
どっかに、どんな型を指してもよいポインタとかあった記憶があるのですが
600デフォルトの名無しさん:02/09/04 17:19
600ですが、もっともっと質問カモ〜ン。
601デフォルトの名無しさん:02/09/04 17:23
>>599
コンパイル通る?
vcharの指すオブジェクトの大きさが不明だと思うんだけど。
602601:02/09/04 17:25
それだけじゃないね。
不明な構造体を使っているし。
>>599
vstrcpyの中で、vcharがusername構造体であることを明示してやらないと無理。
void* のまま使うのはマズー
void *はなんでも指せる分、実体を参照する時は何を指しているのか明示する必要がある。
606デフォルトの名無しさん:02/09/04 17:34
>>595
ところで、vstrcpyの呼び出しで第一引数として渡しているものはポインタじゃないよな。
607595:02/09/04 17:36
>600
>601

まったく通りません


>602
>603

やっぱりそうですか
しかし、プリコンパイラ自動生成の型の為こっちではダメなんですよ

>604
>605

わかりました・・・


【失敗】   λ..........トボトボ
>606
ポインタだろ。
>>608
usernameそのものに見えるけど。
>vstrcpy(username, "moe");
vstrcpy(&username, "moe");
ってことでしょ。それと関数の中で構造体を定義することって
できたっけ規格上。
>>610
できる。もちろんスコープは関数内のみ。
>>607
struct{ unsigned short len; unsigned char arr[1]; } vstr_dummy;
を定義して、vstrcpyの中で vcharを vstr_dummyのポインタにキャスト。

ただし、アライメントを合わせておかないとドツボにはまる可能性あるの
で注意。
>>611 あ、そうなのか。
C++のクラスは駄目なんだろうか。メンバ関数の定義をどこに
書くのかが分からない。
>613
struct vstr{ unsigned short len; unsigned char arr[1]; func(int l ) { len=l} } ;
でいいのでわ?
C言語になるにはどうしたらいいのですか?
616デフォルトの名無しさん:02/09/04 17:52
>>615
分かりません
ところで、60センチくんの技術力はどのレスで垣間見ることができますか?
C++独自のキーワードとかぶる変数名をつけたら怒られました(;´д`)
Cだからいいじゃんという問題ではないらしい(;´д`)
>>598
愛してる
>>614
ホントですね、ちょいと調べてみました。
>9.8 - Local class declarations [class.local]
>-1- A class can be defined within a function definition; such a class is called
>a local class. The name of a local class is local to its enclosing scope.
 (中略)
>Member functions of a local class shall be defined within their class
>definition, if they are defined at all.
微妙に板違いすまそ
>>620
微妙にスレ違いかも知れんが、板違いとは思えない罠。
622デフォルトの名無しさん:02/09/05 00:38
C言語で腹痛は治せますか?
>622
腹痛くらい気合で治しなさい。
下痢で腹が痛いのなら実を出せば治る。
それでも痛かったら食中毒か虫垂炎かもしれん。
漏れの知人は、C言語を始めて3日たったら
不思議なことに腹痛がピタリと治まったそうです。
その代わりに頭痛が
頭が割れるようにかゆい。
腹が頭痛です。
2つの自然数a,bの最大公約数を求めてくれ
>>628
数学板行け
>>628
「ユークリッドの互除法 C言語」でぐぐればすぐ見つかるぞ。
http://www.u-gakugei.ac.jp/~miyadera/LECTURE/ElecBook2/ptech11.htm
>>628
求めてあげるから2つの自然数をだせ
2つの自然数a,bの最大公約数キボンヌ(;´Д`)ハァハァ・・・
63360cm浮き上がるストレート:02/09/05 06:52
>>628

_はスペースです。

unsigned_int_CheckSaidaiKouyakusuu
(unsigned_int_numberA,unsigned_int_numberB)
{
__unsigned_int_a=0,saidai=0;
__for(a=1;a<=65535;a++);
____if(numberA%a==0_&&_numberB%a==0)
______saidai=a;
__return(saidai);
}
>>633は神
・・・誰かツッコんでやれよ・・・
字下げのアンダーバーが「す・て・き♪」
>>633
forの行の最後のセミコロンだけ取れば、いちおう動きそうだがな。
それでもゴミには変わりないが
>>633
じゃあ俺もついでに。
65535って書いてるけど、intが16ビットの処理系ではアウト。
#include@<stdio.h>
#include@<stdlib.h>

int@main(int@argc,@char@*argv[])
{
@@@@int@x,@y;@@@@@@@@@/*@引数を入れる@*/
@@@@int@i,@n;@@@@@@@@@/*@カウンタを回す@*/
@@@@int@answer;@@@@@@@/*@答えを入れる@*/

@@@@x@=@atoi(argv[1]);
@@@@y@=@atoi(argv[2]);

@@@@if(x@<=@y)@{
@@@@@@@@n@=@x;
@@@@}
@@@@else@{
@@@@@@@@n@=@y;
@@@@}

@@@@for(i=1;@i<=n;@i++)@{
@@@@@@@@if@((@x@%@i@==0)@&&@(y@%@i@==0))@{
@@@@@@@@@@@@answer@=@i;
@@@@@@@@}
@@@@}

@@@@printf("%d@と@%d@の最大公約数は@%d@です。\n",@x,@y,@answer);

@@@@return@0;
}
640639:02/09/05 09:11
>>633
基本は変えずに改良してみたYO!

追加
/*
使い方
<コマンド名>@<最初の数>@<二番目の数>
*/

ちなみに@は半角空欄です。
>>640
下手な文字化け化なんかですか?
Perlでもここまでひどくないyo!
>>639
>ちなみに@は半角空欄です。
Tabキーの一般的な使い方知ってるか?
#include<limits.h>して

for (i=0; i<INT_MAX; ++i)

とするのが良いのではないか?
>>642
Perlで書いてみて。
646639==640:02/09/05 09:33
>>643
Tabも消えるんじゃなかったっけ?
Tabのテスト
647639==640:02/09/05 09:34
>>643
やっぱり消えたよ。
どう使えば消えないのか知っていたら教えて欲しい。
つーか、  か、せめて全角スペース使おうよ。
649648:02/09/05 09:57
訂正
○ &nbsp;
>>638 なんかunsigned intらしいから。。
>>639 申し訳ないが、それでは荒らしと同じではないかと。。
?x09 実体参照なら残るカモ ↵
653639==640:02/09/05 10:06
#include@<stdio.h>
#include@<stdlib.h>

int@main(int@argc,@char@*argv[])
{
@@@@int@x,@y;
@@@@int@i,@n;
@@@@int@answer;

@@@@x@=@larger(atoi(argv[1]),@atoi(argv[2]));
@@@@y@=@smaller(atoi(argv[1]),@atoi(argv[2]));

@@@@i@=@x@%@y;

@@@@while(i@>@0)@{
@@@@@@@@x@=@y;
@@@@@@@@y@=@i;
@@@@@@@@i@=@x@%@y;
@@@@}

@@@@answer@=@y;

@@@@printf("%s@と@%s@の最大公約数は@%d@です。\n",@argv[1],@argv[2],@answer);


@@@@return@0;
}
654653:02/09/05 10:07
int@smaller(int@x,@int@y)
{
@@@@if(x@<=@y){
@@@@@@@@return@x;
@@@@}
@@@@else{
@@@@@@@@return@y;
@@@@}
}

int@larger(int@x,@int@y)
{
@@@@if(x@>=@y){
@@@@@@@@return@x;
@@@@}
@@@@else{
@@@@@@@@return@y;
@@@@}
}
655653:02/09/05 10:08
久しぶりにCを書いてみたら思ったより楽しかったので、
少し真面目に書き直してみました。
これだと先程のソースよりも速いと思います。

>>648
最初はそう思ったのですが、
それだと字下げ部分以外の半角スペースがうまく表現出来ないので。
どうせコピペ&置換するなら回数が少なくて済む方が良いと思い、
Tabも置換して半角スペースにしてしまいました。
int_gcd(int_x,int_y){
__if(y==0)_return_x;
__else_return_gcd(y,x%y);
}
>それだと字下げ部分以外の半角スペースがうまく表現出来ないので。

>int@larger(int@x,@int@y)
こーゆーのは、ちゃんと半角スペースで表現できるだろうが。
int larger(int x, int y)
658653:02/09/05 10:19
>>657
これは本当に知りませんでした。
スマソ。
マクロでいいやん
#define max(a,b) ((a) < (b) ? (b) : (a))
#define min(a,b) ((a) < (b) ? (a) : (b))
>>657
ネタにマジレス…じゃないの? ただ,こう何回もやられるとウザイね。放置しようや。
>>633の影響力が馬鹿にならなくなってきたな。みんなよんよんやんやんするなよ
>>656追加
#include_<stdio.h>
main(){
__int_i,j;
__scanf("%d%d",&i,&j);
__printf("%d",gcd(i,j));
__return_0;
}

_を半角スペースに置換してから実行。
>>650
unsigned かどうかを問題にしているのではないよ。
intが16ビットの環境では
for(a=1;a<=65535;a++)
このループが永遠に終わらない。
#include <values.h>
for(unsigned int a=1;a<=MAXINT;a++)
665650:02/09/05 13:12
>>663
ほんとだ。。a != 0 にでもしなきゃ止まんないな
完全にネタ掴まされたよーだ
>>664
なぜlimits.hをインクルードしてINT_MAXを使わない?
<=を<にしてはならないの?
&nbsp; 使え。_ や @ じゃ見にくくて仕方ない。
>667 上限いっぱいまで使いたいってんじゃないの。
このアルゴリズムは無視してくれろ〜〜〜〜
というか,_や@を使うくらいなら.を使った方がマシかと。
@はCの記号として出現しないが、
_や.はCの記号として出てくるので紛らわしい。
だが、半角スペースをわざわざ@と置換する手間があったら
全角スペースか&nbsp;に置換して欲しいと思う。
672デフォルトの名無しさん:02/09/05 16:41
>>663
for(a=1; a<=65535u; a++) 65535u とすれば、負数が 2 の補数表現で且つ ANSI C 準拠
の処理系なら止まるはずだけど、 定数が int のままだと止まらないよね
673663:02/09/05 16:56
>>672
マジレス? そろそろ勘弁してよ。
> for(a=1; a<=65535u; a++)
ループの終了条件である、 a > 65535u
が成り立つような aの値を16ビットで表現できるの?
ANSI Cはint型は最低16bit以上かつ、short型以上のサイズを要求している
よってsizeof(short) == sizeof(int)が真になる処理系が存在する

代表的な処理系はLSI-Cだ
カウンタを一つずつ回しながら毎回剰余をチェックするという事を前提に
カウンタの最大値を議論しているようだけど、628に対する解答としては
653, 654に書かれたユークリッドの互除法を利用したものが一番高速だろうね。
コピペ&一括置換しないと読み難いけどね。
larger/smallerの判定はいらなくない?
677デフォルトの名無しさん:02/09/05 19:17
(=^o^)<age
678 :02/09/05 19:20
C で正規表現を使いたい場合ってどうしてます?
regex? lex? regcmp?
>>678
system("grep");
680デフォルトの名無しさん:02/09/05 19:25

------------------------------------------

      ここまで読んでやった。
            俺様用のしおり

------------------------------------------
681shige:02/09/05 19:26
>>678
pcre
rx

glibcには<regex.h>ないか?
682 :02/09/05 20:00
>>679
まじっすか?

>>681
pcre って始めて聞きました。

lex 使っている人いませんかね。
#include@<stdio.h>

int@gcd(int@x,int@y){
@@if(y==0)@return@x;
@@else@return@gcd(y,x%y);
}

main(){
@@int@i,j;
@@scanf("%d%d",&i,&j);
@@printf("%d",gcd(i,j));
@@return@0;
}

これが一番高速、                              入力が。

ハットリ君がいっぱい・・・。
懲りない香具師だな。
685デフォルトの名無しさん:02/09/05 23:07
よろしくおねがいします

typedef struct{
int a;
} KOUZOU1;

で、関数内で構造体の内容を変更したくなければ以下のようにしますよね

void fun1(const KOUZOU1* k1){
k1->a = 5 // 不可
}

typedef struct{
KOUZOU1* kou1;
} KOUZOU2;

のとき

void fun2(const KOZOU2* k2){
k2->kou1->a = 1; // 可
}

としても、関数内で変更できますよね。
それを変更できないようにconstすることってできますか?
686デフォルトの名無しさん:02/09/05 23:07
さらに、

KOUZOU2* k2 = new KOUZOU2;
k2->kou1 = new KOUZOU1;

delete k2;

としたとき、k2->kou1のメモリはどうなってるんですか?開放されたのか、
やってしまっているのかどっちでしょう?
>>686
Cにはnewやdelete演算子はないが。
>>686
k2->kou1のメモリはリークしています。
k2->kou1のメモリはリークしています。
k2->kou1のメモリはリークしています。
k2->kou1のメモリはリークしています。
k2->kou1のメモリはリークしています。
k2->kou1のメモリはリークしています。
k2->kou1のメモリはリークしています。
>>686

struct KOUZOU2
{
KOUZOU2() { kou1 = new KOUZOU1; }
~KOUZOU2() { delete kou1; }
KOUZOU1* kou1;
};
690デフォルトの名無しさん:02/09/05 23:41
Cで多倍長演算はどうやってやるんですか?
>>690
自分で処理を書くしかないよ。
(どっかから拾ってきてもいいけど)
>>690
よく学習用に作るよね。
1万桁の演算とか。
そんなに難しくは無い。
693デフォルトの名無しさん:02/09/06 00:26
入力金額にカンマをつけたりするにはどうすりゃいい
んですか??
694デフォルトの名無しさん:02/09/06 00:28
>>693
ん?どういう意味?
もうちょっと詳しく。
695 :02/09/06 00:30
>>693
3桁ずつカンマ出力していけ。
696デフォルトの名無しさん:02/09/06 00:31
Cでは何ができるんですか?
圧縮プログラムとかつくれます?
厨房な質問ですいません
>>693
sprintfで数字を文字列に直し、文字列操作で","入れてやるのが一番簡単。
698デフォルトの名無しさん:02/09/06 00:32
>694
 例えば「1200」って入力します。
んでそれを関数に渡します。
 関数で¥1,200-と変換後main関数
で出力。
 というのを作りたいんですが・・・
>>696
圧縮ってデータ圧縮のこと?アルゴリズムさえわかればほとんど何でも
作れるよ。
700デフォルトの名無しさん:02/09/06 00:36
>>698
すごく簡単に出来そう。

最初に¥をつける。
桁数 % 3 をスキップ
あとは、終わりまで3桁ずつカンマをつける。
701デフォルトの名無しさん:02/09/06 00:39
文字列でたとえば、「4X + 5Y = 15 ; 12X + 3Y = 22」と入力すると
XとYの答えを表示するプログラムを作りたいのですがなにから手をつけていいかわかりません。
どなたか作ってください。
対象となる式は二字の二次方程式までです。
よろしくお願いします。
>>701
宿題の丸投げですか?
>>693
環境によっては
locale(の LC_NUMERIC)を "japanese"にして printfで
printf("%'f" 123456);
とかで可能かも(Windowsだと他の方法ありそうだが)。

詳細は
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/sprintf.3.html
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/setlocale.3.html
あたり。
(自分の環境だと LC_MONETARYの設定ではうまくいかなかった)
704703:02/09/06 00:50
追記:
"japanese"でどの環境でもうまくいくかはわからない。
(locale関連は良く知らないので)
706 :02/09/06 00:52
2次方程式はどう表現するのか書けよ。
>>706
「4X + 5Y = 15 ; 12X + 3Y = 22」
じゃないの?つまり、パースから考えてくれと。
5(x+4y)+2 = 2x
なんてのはあり?
>>707
それは1次のような気が・・・
710707:02/09/06 01:04
あう、鬱…。
>>708
解けませんが?
712デフォルトの名無しさん:02/09/06 01:09
>704
 ありがとうございます。がんばってみます。
掃き出し法?
求めるのは吐き出し法だな
ただ、初心者にはparseの方が大変だと思われ
71560cm浮き上がるストレート:02/09/06 04:02
>>701
今から書きます。
スペースは大文字のスペースですので、ビルドする前に書き直してください。
解、係数、右辺の値、全て整数でないとダメです。絶対値が大きすぎてもダメです。
いろんなパターンを試して大丈夫だったのですが、もしダメだったらごめんなさい。
(yの解は同じで、xの解が違うとかあるのかも)
71660cm浮き上がるストレート:02/09/06 04:03
>>715の続き
#include <stdio.h>
#include <stdlib.h>
void MakeInputAtai(int*,int*,int*,int*,int*,int*);
int CheckSaisyouKoubaisuu(int,int);
void ShowError(void);

void main(void)
{
int xKeisuu1=0,yKeisuu1=0,uhenn1=0,up1=0;
int xKeisuu2=0,yKeisuu2=0,uhenn2=0,up2=0;
int saiKou=0;
int chigauFugou=0;
int ySa=0;
int uhennSa=0;
int y=0,x=0;
71760cm浮き上がるストレート:02/09/06 04:05
716>>の続き
MakeInputAtai(&xKeisuu1,&yKeisuu1,&uhenn1,&xKeisuu2,&yKeisuu2,&uhenn2);
saiKou=CheckSaisyouKoubaisuu(xKeisuu1,xKeisuu2);
up1=saiKou/abs(xKeisuu1);
up2=saiKou/abs(xKeisuu2);
if((xKeisuu1>0 && xKeisuu2<0)||(xKeisuu1<0 && xKeisuu2>0))
chigauFugou=1;
if(chigauFugou==0)
{
ySa=yKeisuu1*up1-yKeisuu2*up2;
uhennSa=uhenn1*up1-uhenn2*up2;
}
else
{
ySa=yKeisuu1*up1+yKeisuu2*up2;
uhennSa=uhenn1*up1+uhenn2*up2;
}
71860cm浮き上がるストレート:02/09/06 04:06
717>>の続き
if(ySa==0)y=0;
else y=uhennSa/ySa;
if(uhennSa%ySa!=0)ShowError();
x=(uhenn1-yKeisuu1*y)/xKeisuu1;
printf("\n(x=%d,y=%d)",x,y);
}
71960cm浮き上がるストレート:02/09/06 04:07
718>>の続き
void MakeInputAtai(int *xKeisuu1,int *yKeisuu1,int *uhenn1,int *xKeisuu2,int *yKeisuu2,int *uhenn2)
{
printf("連立方程式の計算をするプログラムです\n");
printf("解が整数でない∨絶対値が大きすぎるとダメです\n\n");
printf("上の式のxの係数を入力してください ");
scanf("%d",*(&xKeisuu1));
printf("上の式のyの係数を入力してください ");
scanf("%d",*(&yKeisuu1));
printf("上の式の右辺の値を入力してください ");
scanf("%d",*(&uhenn1));
printf("下の式のxの係数を入力してください ");
scanf("%d",*(&xKeisuu2));
printf("下の式のyの係数を入力してください ");
scanf("%d",*(&yKeisuu2));
printf("下の式の右辺の値を入力してください ");
scanf("%d",*(&uhenn2));
}
72060cm浮き上がるストレート:02/09/06 04:09
719>>の続き
int CheckSaisyouKoubaisuu(int number1,int number2)
{
int a=0,b=0,c=0;
int absNum1=0,absNum2=0;
int nowNum1=0,nowNum2=0;
absNum1=abs(number1);
absNum2=abs(number2);
for(a=1;;a++)
{
if(absNum1*a>=32768)ShowError();
nowNum1=absNum1*a;
if(nowNum1<nowNum2)continue;
else if(nowNum1==nowNum2)return(nowNum1);
72160cm浮き上がるストレート:02/09/06 04:10
>>720の続き
else
{
for(b=2;;b++)
{
if(absNum2*b>=32768)ShowError();
nowNum2=absNum2*b;
if(nowNum2<nowNum1)continue;
else if(nowNum2==nowNum1)return(nowNum2);
else break;
}
}
}
ShowError();
return(-1);
}
72260cm浮き上がるストレート:02/09/06 04:11
>>721の続き
void ShowError(void)
{
printf("解が整数でないか、値が大きすぎます");
exit(1);
}

以上
実行してないから正常かわからないが、正常に動作したとしても20点だな、これじゃ。
いや、要件を満たしてないから0点だ。
>>701の入力に対応できない。
しかし、>>722ってここ1,2日でよく出ているようだけど、
ズッコケ系コテハンとして居座るつもりなのか?
72660cm浮き上がるストレート:02/09/06 05:10
>>724

確かにそうですね。よく見ていませんでした。
直す所は入力した式を文字列として格納し、
その文字列を数値、x、y、+、-、=に分けて
後は作ったやつみたいにすればいいんでしょうか。
>>726
とりあえずはそれで問題ないと思うよ。
キッチリ数式を解析しろって話も出てきそうだけど、
定型の入力以外は突っぱねればいいと思う。

どうせ宿題だしな。
72860cm浮き上がるストレート:02/09/06 05:22
>>726の続き

文字列の中にxを見つけた場合その前の数字文字(-含む)を数値に変換し
係数としてxKeisuuに格納する。yの場合はyKeisuu。
+,-,=は係数がない右辺の数字文字の区切りとして使用。
文字のない数値はuhenn。
=は左辺と右辺を区切るためにも使用。移項の時符号が変わるので。
いったい何のために半角スペースを全角スペースに変換したんだ?
インデントされてねーぞ、ボケ。
いい加減に &nbsp; の使い方ぐらい覚えろ。
730デフォルトの名無しさん:02/09/06 06:55
a->bはわかりにくいから(*a).bにしろと先輩に言われました。
そんなもんですか?
731正直者:02/09/06 06:59
>60cm浮き上がるストレート

君のコードは一貫して正視に堪えない。
頼むからもう少し品質を上げられるようになるまで
でしゃばらないで欲しい。
>>730
(*a).bはわかりにくいからa->bにしましょう。
>>730
[*pp]i はわかりにくいから (*pp)[i] にしろ、
というのなら理解できるが、それは必ずしも。。。
734デフォルトの名無しさん:02/09/06 07:20
Cは分かりにくいからVBにしろ.
わかりやすさではRubyが一番。
>>728
そんな入門用のプログラムはもういいから
早く野球ゲームを見せてよ。
ほらみろ、60cmがレベル下げるからネタに流れちゃうじゃんか
1個のモジュール内で

extern int a;
int a
int main() { 〜 }

ってOKなんですか?
>>738 やってみれば?意味わかんないけど
>>731 いよっ、正直者ぅ!!!
741晒し:02/09/06 09:11
ゲ製作技術板より
http://game.2ch.net/test/read.cgi/gamedev/1028625024/l50
プログラムできん奴はゲーム作成なんて語るな
253 :1m80cm落ちるフォーク :02/09/06 05:01 ID:iA1WBcre
>>252の続き

勉強の仕方としては、本を読む、人に聞く、インターネットで検索する等です。
検索する場合は、C言語とprintf()、C言語と変数
等2つ書き込めば見つかると思います。
またわからない用語が出てきたときも使えます。

あとこれはC言語の基本形なので覚えておくといいですよ。
#include <stdio.h>
void main(void)
{

}
スペースはここでは全角ですが、テキストの上では半角にしてください。
{と}の間にprintf()や演算子などを書いていくのです。
741をみて、「60cm浮き上がるストレート」が野球の話だと知った。
ストレートパンチで60cmも浮かすなんてちょっと無理があるとは
思っていたけれど。
どっちかっちゅーとアッパーだしな。
いや野球と断定するのはまだ早い
745デフォルトの名無しさん:02/09/06 10:17
初心者同士で教えあうのは一見、良さそうに思えるが、実は非常に危険である。
>>742
ワタクシ、髪型だと思ってました、マル
スピリタスのストレートなら
60cmくらい飛び上がるかもね。
>>719
> printf("解が整数でない∨絶対値が大きすぎるとダメです\n\n");

さりげなく選言(or)の論理結合子∨を使っている、インテリな60cm
74960cm浮き上がるストレート:02/09/06 11:21
>>729

&ndspの使い方を教えてください。
書きこするとき、半角スペースの部分に&ndspを書けば
表示されるときに自動的に半角スペースに変換されているとかでしょうか。

要はそれを知っている自分がインテリだと言いたい>>748
751エディタ製作中@クソ初心者:02/09/06 11:24
すみません、質問いいでしょうか・・・?
また来ました。 エディタ作ってるC言語初心者です(汗

今、いろいろ仕様を変えてエディタの改造をしていってるのですが・・・
また、表示でつまずいてしまってます・・・(涙
画面スクロール時の問題で、カーソルを一番右まで持っていくと、
左へ1バイト又は2バイトずらしてテキストを表示してるのですが、
2バイト文字は、問題ないのですが、
1バイト文字が、スクロース時に末尾の文字1文字を多く表示するのです・・・(涙

たとえば、「abcde」と文字列があったら、
スクロールするたびに、末尾「e」の字が残って「abcdeeeee」のようになってしまいます・・・。

原因と思われる所は、
右移動処理をする関数又は再描写する関数のどちらかだと思うのですが、
何度見直しても、自分では何処がおかしいのかわかりません・・・。

http://www.geocities.co.jp/SiliconValley-SanJose/9640/

ここにソースを上げました。
右移動処理関数のフローチャートも、いちよう置いてます。
かなり不器用な処理してるので、読みにくいと思います・・・(汗
コンパイルは、bcc32以外では無理だと思います。

本当にたびたびすみません・・・。
どうか、よろしくお願いします。
>>751
>スクロース
糖類
753エディタ製作中@クソ初心者:02/09/06 11:27
>>752
あ、すみません・・・
スクロールの間違いです(汗

意地になって、徹夜で原因を探ってたので・・・
ちょっと、目がしょぼしょぼします・・・(汗
>>749 ↓そういうのはこういうところで勉強してくれ
http://www.ne.jp/asahi/minazuki/bakera/html/reference/charref
755748:02/09/06 11:29
>>750
悟られた>>748
75660cm浮き上がるストレート:02/09/06 11:32
スペースの実験

&ndsp&ndsp1
&ndsp&ndsp 1
&ndsp &ndsp 1
75760cm浮き上がるストレート:02/09/06 11:36
???
? ? ?
75860cm浮き上がるストレート:02/09/06 11:39
??2つ
????4つ
??????6つ
でないか?
- - いっこ
-  - にこ
-   - サンコン
でるじゃん。&nbsp; だよ?間違えてない?
76160cm浮き上がるストレート:02/09/06 11:41
&ndsp;&ndsp;2つ
&ndsp;&ndsp;&ndsp;&ndsp;4つ
&ndsp;&ndsp;&ndsp;&ndsp;&ndsp;&ndsp;6つ
つーかここでやんなや!>俺も
&ndsp;&ndsp;2つ
&ndsp;&ndsp;&ndsp;&ndsp;4つ
&ndsp;&ndsp;&ndsp;&ndsp;&ndsp;&ndsp;6つ
76460cm浮き上がるストレート:02/09/06 11:43
&ndsp;&ndsp;2つ
&ndsp; &ndsp;&ndsp;&ndsp;4つ
&ndsp;&ndsp;&ndsp;&ndsp;&ndsp;&ndsp;6つ
そりゃ出ん罠。。。d じゃなくて b
マジで荒らしか?
スペースを&nbsp;に変換すると、datサイズが大きくなるからやだなー。
>>766
バカ必死だな。
76960cm浮き上がるストレート:02/09/06 11:47
&ndsp;の使い方は解りませんでしたが、
文字と文字の間の半角スペースはスペースとして表示されるみたいです。
左側半角スペース×5
あ 左側半角スペース×5
a left_space5
>>769 だから &ndsp; じゃなくて &nbsp; だって言ってるだろヴォケ
>>669
HTMLって知ってる?
77260cm浮き上がるストレート:02/09/06 11:51
>>767

あ、ほんとだ。   間違えてしまいました。
&ndsp;×→ ○
77360cm浮き上がるストレート :02/09/06 11:51
>>771
ホームページビルダーの保存形式
>>751
とりあえず、X座標が -1 とかになるのがおかしい。
navi2chでみると、実体参照がそのまま見えてしまう…。これはそういうモノなのだろうか…。
776エディタ製作中@クソ初心者:02/09/06 11:57
>>774
はい、すみません。
今の所、左スクロール、上下スクロールは、
なんの改造も施してません・・・(汗
古い表示仕様のままなのです。
右スクロールだけが、新しい仕様になってます。
なので、上下スクロール左スクロールは、正確に処理してくれません。
とにかく、右スクロールが正確にできれば、それの応用で他のスクロールができるので、
右スクロールばかりを必死で作ってました・・・(汗
X座標が-1とかになるバグを修正するのは、右スクロールが正確にできてからになると思います(汗
>>751
全体的に無駄な処理が多そうだが、それはさておき、re_depictが怪しい。
行末から画面の隅までを消去する(空白で埋める)ような手続きは、
一切ないように見える。なければ当然、ゴミが残るぞ。
778エディタ製作中@クソ初心者:02/09/06 12:12
>>777
はい、無駄な処理は、かなり多いと思います(汗
だんだんと、仕様が難しくなってきて、
どうしても頭の中だけでは整理ができず、
フローチャートを作って処理を作ってるのですが・・・
それでも、まだ無駄な処理が多いですよね(汗

えっと、文字列の終わりに\0を入れれば、
\0以降の文字列に、ゴミが残っていても表示されないのでは・・・???
\0は、うまく文字列最後に入ってると思うのですが・・・。
なんらかの理由で\0以降のゴミが表示されてるんでしょうか・・・
>>778
「表示されない」と「消してくれる」は違うぞ。よく考えてみろよ。

もうちょっとよく見てみたら、ほかの関数をみると、
最初に clrscr() で消してるように見えるが、cs_right では
やってないようだ
780エディタ製作中@クソ初心者:02/09/06 12:21
>>779
ああぁ!! すみません!
clrscr()関数で画面のクリア処理をしてませんでした!(涙
それが原因で、画面に前の画面の文字が残って、
変に表示されてた訳なんですね・・・

すみませんでした・・・
自分の、不注意でした。
アドバイスいただき、ありがとうございました。
clrscr()はre_depictの中で最初に実行したほうがいいと思う。
782エディタ製作中@クソ初心者:02/09/06 12:26
>>781
はい、アドバイスありがとうございます。
そうですね、画面クリア処理も再描写処理の一つなので、
re_depict関数で処理します。

今後、再描写処理はすべてre_bepict関数で行う予定ですので、
それの方が都合いいですよね。

ここから、上下、左スクロールを作り変えて行きます。
>>775 しらんけど、ここでリクするとかいろいろ
ttp://sourceforge.net/tracker/?atid=435775&group_id=39552&func=browse
ところで >>1 はどこに?
>>782
> ここから、上下、左スクロールを作り変えて行きます。
その前にリファクタリングした方がいいぞ。

・プログラム中のあちこちに散らばっている80とか22とかの
 マジックナンバーを消す。
・2バイト文字を判定する
 if(ch >= 0x81) && (ch <= 0x9f)|| (ch >= 0xe0) && (ch <= 0xfc)
 は関数かマクロにする。
・プロトタイプ宣言はbase.cとedit.cで2重管理行わず、
 ヘッダファイルを作ってincludeする。
・ファイルの内容を読み込んでタブをスペースにしてtxtに書き込む処理は
 別関数にした方がいい(特に引数なしで起動してもうまく動かしたいなら)
786エディタ製作中@クソ初心者:02/09/06 13:38
>>785
アドバイスありがとうございます!

>その前にリファクタリングした方がいいぞ。
リファクタリング・・・?
一度、ソース内を整理しろって意味でしょうか?

>・プログラム中のあちこちに散らばっている80とか22とかの
>マジックナンバーを消す。
マジックナンバー・・・?
数字だけでは意味が分りにくいからdefineなどで
意味のある文字にしろって意味でしょうか・・・?

>2バイト文字判定を関数にする
そうですね。
あまりに多用してますし、見にくいですしね・・・。
う〜ん、関数にして調べる文字を引数にして呼び出すようにしてみます。

>プロトタイプ宣言をヘッダーファイルにまとめる
はい、わかりました。
関数が増えてきました・・・。
これ以上増えると、ソースの行数もサイズも大きくなってしまいますし・・・
ヘッダファイルで、インクルードするようにします。

>タブをスペースに置き換える処理を関数にする
わかりました。
後々は、ファイルに出力する時に
スペースをタブに戻す処理とかするようにしたいと思ってます。
引数で、タブ→スペース、スペース→タブとか制御できたら便利ですね。
作ってみます。

沢山アドバイス、ありがとうございました。
>>786
> 意味のある文字にしろって意味でしょうか・・・?

そう。
#define使うなconst使えという人がいるけれど無視無視。
>>787
> マジックナンバー・・・?
> 数字だけでは意味が分りにくいからdefineなどで
> 意味のある文字にしろって意味でしょうか・・・?
その通り、ただdefineだとデバッガとかでうまく定数を表示できないことがあるので。無名enumとかを使う方法がお勧め。
enum {
 WINDOW_XSIZE = 80,
 WINDOW_YSIZE = 22
};
>>788
無名enumだと変数がintでもデバッガ側でビンゴな数字をenumとみなして表示してくれるの?
そんなデバッガ見たことない気がするんだけど気のせいかな。
>>788
enumって整数だけだよね?使い勝手が悪くない?
>>788
無名なんて横着なことするな!
>>791 XSIZEやらYSIZEだのを同じ型と見做すのは逆に不自然じゃないのか
793エディタ製作中@クソ初心者:02/09/06 14:54
う〜ん、なぜdefineよりconstの方が良いんでしょう?
俺的には、defineの方が処理がプリプロセッサだから、
余計な変数がなく、メモリの節約になると思うんですけど・・・
と、言っても、今の時代数百MBもメモリがあるんで、
100バイトや1000バイト、余分にメモリ使っても大丈夫でしょうけど・・・。

ちなみに、デバッガって物は使ったことがないです(汗
かなり便利な物のようですが、使い方がよく分らないんです・・・(涙
今度、デバッガの使い方を勉強しておきます。
>>793
分かっていると思うが定数もその分メモリーを消費するぞ。
>>788
糞なテクニックをひけらかすなよ。
そんな話はネタすれでやってくれ。

堂々define使ってよし。
>>793
暴乱怒(borland)のフリーコンパイラを使っているんだっけ?
それならまずはデバッガを手に入れないと。確かBorlandからフリーで配られていたはず・・・
>>793
Cではそうかわらんと思う。C++ではnamespaceの問題があるから

>>794
即値の間違い?
798788:02/09/06 15:09
>>789
> 無名enumだと変数がintでもデバッガ側でビンゴな数字をenumとみなして表示してくれるの?
少なくともgdbでは表示してくれない。変なこと言ってすいません。

>>790
一応、役に立たないマメ知識として記憶の隅にとどめといてください。

>>793
> う〜ん、なぜdefineよりconstの方が良いんでしょう?
絶対に変化しない定数であるならば、どっちでもいいでしょう。
しかし、将来カスタマイズしたいとき、例えば
TABを8ではなく4にするのをiniファイルで行いたいとか
DOS窓のサイズの変化に伴いエディタの表示領域も変えたい場合、
defineだと変更しにくいと思いませんか?
constを使ったからって、余計なメモリアクセスは発生しないと思うぞ。最適化で。
保存領域はどうかしらんが
800デフォルトの名無しさん:02/09/06 15:14
文字列以外の定数のアドレスを得るのは無理ですか?
というかそもそもメモリー上にはない?
え?得られないかな?const修飾つきのアドレスになるだけだと思うが、
違うかも。得てどうするかは知らないが
やってできなければ、できないんだろうけど
const int a = 123;
const int *p = &a;
やってみれば?
>>802
その場合は123の実体(?)はaという場所にあると考えてよいですか?
もしそうならいいんですけど。
aという場所って、、うーん
定数aのアドレスってのが得られるとすれば、&a じゃない?てことなんだが

俺は今たしかめられない環境にいたりする
>>804
変数名=メモリの一区画に付けた名前とした場合ということです。
やっぱり変数が必要か。
文字列定数だったらそのまま評価すればアドレスが得られるんだけど。
スレが見当違いの方向に流れたな。
くだらんレスをするからそうなるんだよ。
808デフォルトの名無しさん:02/09/06 15:29
>>798
iniファイルでやりたいのならconstつけちゃまずいと思うんだけど。
起動するたびに設定ファイルを読み込んで設定するということでしょ?
>>808
>>798はソースの修正のしやすさの事を言っているように思える。
しかし、#define と比べてどう違うのかはサッパリ
>>806
言ってる意味が。。&123 ができないとか、そういうことか?
>>800
一般的には無理だと思う。
アセンブラ吐かせて確認すればいいと思うが、大抵即値が使われるので。
812788:02/09/06 15:37
>>808
constだとconstをはずすだけでOKだが
...defineの場合も定数名を変数名に置換するだけか
ふーむ、なんかどっちでもいい気がしてきた。

# 個人の趣味として自分はconstを使うけど
#define だと問答無用で置きかえられる場合がありますな。
Cでは大して問題にならない?
なんのために定数を変数にするんだよ?
そんなのは設計が間違っているだろ。
全部大文字の変数、なんてのを気にしないなら結構だが、
人前には出さないでくれ。
>>798
それは、わざわざ constつけた変数を書き換えるってこと?
そんなことしたらバグの元になりやすいと思うのだが。

ついでに言うと、constつけた変数は書き込み禁止領域に置かれることもある
ので注意(書き換えようとするとプログラムが落ちることも)。
>>814
> 定数を変数に

誰もそんな事逝ってないぞ。ひょっとしてconst定数の事を変数と呼んでいるなら、
改めたほうがいい
817デフォルトの名無しさん:02/09/06 15:49
#defineとconstはスコープが違う.

スコープは狭いに越したことがない.
>>816
そのconstを外したら便利、と>>788が逝っている。
自分でやる分には構わんが初心者に押し付けるなよ。
>>818
それは、iniの設定を実行時に取得するって話じゃん。
変数以外にどうしろと
iniから読みこむなら最初から変数を使うわな。
当然プログラム中でも変更してiniに保存するわけで
そんなものは定数でも何でもない。
const定数使うのに反対する理由は特に無いと思うぞ。
だから、途中から設計変更して定数をやめる場合の話だと思ってたんだけど
他アプリにマウスの右クリックや左クリックを
押したと思わせるにはどうすればいいのでしょうか?
>>820
開発途中で、定数で持ってたのをプログラムの外部から読み込ませる
ようにしたくなったときに constは(#defineよりも)便利ということらしい。
で、それを全部大文字で定義するわけ?
それとも小文字?

複数ファイルで使う場合、ヘッダファイルに
extern const int
って全部書くのか?

んなのを推奨している本があったら見てみたいね。
>>821 俺もそう思う。10000個定数があれば、そりゃちょっと違ってくるかもだが
>>822
そんなインパクトの大きい設計変更するのなら、どっちでも手間は
変わらないんじゃないか?
>>823
OSは? Winならmouse_eventとかPostMessageとか。
>>825 多いとアレだが、少なければそれでもいけると思うぞ。
まあフツーはもっと関数とかで隠蔽するだろうが
>>828
OSはWindowsです。
PostMessage( hWND, WM_LBUTTONDOWN, MK_LBUTTON, 0 );
とやってみたのですが、全然反応しませんでした、間違ってますか?これ
831788:02/09/06 16:20
>>825
> 複数ファイルで使う場合、ヘッダファイルに
> extern const int
> って全部書くのか?
複数ファイルでdefineを使いたい場合はどうするのでしょうか?
手間は同じと思いますが
> extern const int
ライブラリに定数を持たせるときは、これを使うしかないな
>>832はバージョンが変わったときの話
>>831
当然#defineを並べるだろ。
誰でもやってることだ。
だが、
> extern const int
こんなものを並べるやつはいない。
いるとしたら
将来、変数にしてしまうかも・・・という設計開始時点での
曖昧さを許しているプログラマだ。

小さなプログラムならそれでも構わんだろうが巨大なシステムでは
そんなのがいくつもあったら破綻する。

大文字定数を変数にしたかったら全部書き換える。
それが正しいし、初心者に対して曖昧な方法を推薦するなよ。
定数を盲目的に全部 #define にしろってのは、逆に糞な方法だと思うが
836788:02/09/06 16:49
>>834
> 将来、変数にしてしまうかも・・・という設計開始時点での
> 曖昧さを許しているプログラマだ。
そうです、完全な設計は完全な人間ならば作成可能でしょうが、
私は残念ながら完全ではありません、設計を修正する羽目になることが良くあります。
間違えにくく、変更しやすく、デバッグしやすく、
見やすいプログラムを書きたいと願っている不完全なプログラマです。

> 大文字定数を変数にしたかったら全部書き換える。
定数を変数に変更するとき変数名を変えるのは当然です。
>>814
> defineの場合も定数名を変数名に置換するだけ
といってます。
>>834

ちゃんと統一されてればどうでも良いことでしょ。
別に曖昧でもないし。

#defineが並んでるヘッダに、
const int X=1234;
とかつっこむ奴は屑だけど。

ところで、上の方で勘違いしている人が入るけど、
const な変数は値を参照する分にはリソースを食わないよ。
#defineした場合と同じ。
ただし、アドレス参照した場合だけ、そのためだけにメモリが
確保される。

それからVCのデバッガはenumシンボルを表示する。
かえってうっとうしい事もあるけど。
> > defineの場合も定数名を変数名に置換するだけ
は問題ありだと思う。
>>836
君が理解しているのは分かったから#defineの代わりにconst intを
ここで初心者に薦めるのはやめてくれ。

>>837
おいおい・・・
統一されてればどうでもいい?本気で言っているのか?
お前さん、そんなソースを外に出してるのかい?
なんかだんだん自分がvoidみたいな気がしてきたな・・・。
書きすぎた。ごめん、消えます。
841788:02/09/06 17:26
>>839
> #defineの代わりにconst intをここで初心者に薦めるのはやめてくれ。
何故?
私はどっちでも良いと思っているけど、何か理由があるのなら聞きたい。
>>839

> 統一されてればどうでもいい?本気で言っているのか?
> お前さん、そんなソースを外に出してるのかい?

本当はどうでもよくなんかないよ。
ちゃんと型付けした方が便利なんだけど、使い方を統一するほうが優先されるっ
てだけ。

840は839?
いなくなる前に、一個で良いから#defineを使うメリットを書いたほうが
かっこいいよ。




>>842
しょうがねぇな・・・。
じゃ逆に聞くが
const int を使うメリットを教えてくれ。
const int X_MAX = 80;
とかするんだろ?
で、X_MAXを変更したくなったらconstを「外すだけ」で
X_MAX=70;
とかプログラム中で書くんだろ?

#defineを使う理由はただ一つ、それが正しい定数の使い方、だからだ。
K&Rでも読み直せ。
まあ、Cはネームスペースが無いから#defineでもconstでもどっちでも構わんのだろうけど、
C++で定数を#defineで定義してる椰子はダメだね。
Cだと
const int bufsize = 100;
void f()
{
int buffer[bufsize];
}
とかできないからな。
>>845
それは大きいな。
847788:02/09/06 18:06
>>845
なるほど、その場合はdefineでないと駄目だね。
ということで納得したので消えます。
#define FPS 1000/60
だと
if (timeGetTime()-prevTime >= FPS)
てしたときに
if (timeGetTime()-prevTime >= 1000/60)
になっちゃうので
const int FPS = 1000/60;
にしてる漏れは
根本的にわかってませんか?
>845
?フツーにできちゃった
Cygwin+gcc です
>>848
#define FPS (1000/60)

括弧でくくればいいよ。
つか、そういう式を#defineしていて、括弧でくくってなかったら、
へたくそと思われるよ。
>>848
計算式がつく場合は、
#define FPS (1000/60)
852851:02/09/06 18:13
>>850
ケコーンしよう。
>>849
gccは独自拡張使いまくり
それでなくてもC99ならint a[n];が自動変数でも使えたはず。
>>853
(#`Д´)<マヂデスカッ
int a[n][m];
とかは・・・できるわけないか。
>>854
出来ます。スタック使い尽くして死んでください
>>855
・・・。
int *p = a[5];
とかしたらどうなるのかなーっと。
大きさが分からないぞーっと。
>>856
それは今までのCにも言えること
>>857
配列の大きさは基本的に固定でわ?
配列や構造体の大きさが動的に変わればポインタの計算は
どうするんだろう・・・。
いちいち定義された値で再計算しなおす仕様になっているのかな?
gcc持ってる奴実行してみてくれ、可変配列ってこんなんも可能なの?

static int printArraySize(int n);
int main(void)
{
  printArraySize(100);
  printArraySize(50);
  printArraySize(0);
  printArraySize(-1);
  retrun 0;
}

static void printArraySize(int n)
{
  char a[n];
  print("n = %d, size = %d\n", n, sizeof a);
}
多分こういう事なんじゃないのかな?
const int n = 500;
int nr[n] // OK

int n = i;
int nr[n] // NG
>859
もうちょっとプログラム見なおしてから送信してください......

(コンパイル通るように変更した後)Cygwin+gccでの結果
n = 100, size = 100
n = 50, size = 50
n = 0, size = 0
Segmentation fault (core dumped)
>>861
2次元配列でも通る?
static void printArraySize(int n)
{
  char a[n][n];
  print("n = %d, size = %d,a[]=%d\n", n, sizeof(a),sizeof(a[0]));
}
863デフォルトの名無しさん:02/09/06 18:59
>>815
そもそもコンパイルできないから大丈夫です。
>>830
その後に
PostMessage(hWND, WM_LBUTTONUP, 0, 0);
も呼んでいるなら、その部分だけ見れば間違いではない。
でも、他の関連メッセージとの兼ね合いもあるので
それ以上は何とも言えない。
>862
print ってやめて......

n = 100, size = 10000,a[]=100
n = 50, size = 2500,a[]=50
n = 0, size = 0,a[]=0
n = -1, size = 1,a[]=536870911

Segmentation fault にならず......なんでだろ?
866デフォルトの名無しさん:02/09/06 19:04
>>860
少なくともVC++6.0やボーランドのフリーコンパイラじゃ通らないね。
>>830
mouse_event()を使うが吉

SetCursorPos(x,y);
mouse_event( MOUSEEVENTF_LEFTDOWN, 0,0, 0, 0);
Sleep(1000);
mouse_event( MOUSEEVENTF_LEFTUP , 0,0, 0, 0);
もちろんセミコロンの付け忘れのことじゃないよ。
constつけても定数式にしろゴルァ!と言われる。

定数じゃなくて定数式でないといけないってことかしら。
869868:02/09/06 19:06
868は866です。
>>865
げげげ!
動的な2次元配列なんかが作れるのか・・・。
>>865
そっか、sizeofだけでなくprintfもあったね。スマソ(w
872デフォルトの名無しさん:02/09/06 19:10
可変長配列ってことはsizeofは使えないのかな。
あれは確かコンパイル時にサイズが決まっていないといけないはずだから。
>>872
>>865の結果からはsizeofも通っているよ。
おそらくポインタの大きさも作成時に作られていると思われ。
これは仕様の改悪のような気がするが・・・。
>872
>861>865
sizeof 使えてるよ?ってか「可変長」ではないよね?
>>873
ポインタの大きさは同じでしょ・・・
まあsizeof(int *)とsizeof(char *)の大きさが違うという珍しい環境もあるらしいけど・・・
>>874
そうだ、、、可変長って自由に長さを変えられるってことだ(汗
動的というべきかな。
>>866
だから、C99っつってんだろゴルァ
>>875
スマソ、
スタックの構造体の中に配列があった場合とかも多分通るんだよね?
その場合に構造体のサイズとかも保持されていて、
p++;
で増加する内部の値も設定されている、てことでふ。
>>877
C99ならconst付けようが付けまいが通ると思うが・・・
880879:02/09/06 19:18
ん?よくみたら下の方は変数が初期化されていない・・・
紛らわしい書き方するなよ。
そもそも下はconst付いてない
>>881
だから紛らわしいって言っているんだよ。

ところで、gccで↓通る?

#include <stdio.h>
void a(int);
int main()
{
int i;
scanf("%d",&i);
a(i);
return 0;
}
void a(int n)
{
int c[n];
}
>882
同じこと考えてましたね
↓こんなの作ってました

#include <stdio.h>
int main( void ) {
  char buf[500];
  while ( fgets(buf, 500, stdin) ) {
    int i = atoi( buf );
    char s[i][i];
    printf( "i = %d, s = %d, s[] = %d\n", i, sizeof s, sizeof s[0] );
  }
  return 0;
}

結果(1、3、5行目は入力)
8
i = 8, s = 64, s[] = 8
0
i = 0, s = 0, s[] = 0
-4
i = -4, s = 16, s[] = 536870908

何でもアリってかんじですね......今まで1度も使ったことなかったけど......
>>882 変数が初期化されていない・・・
>>883
おおすげー(ワラ
>>884
ハァ?
>>878
ポインタの大きさじゃなくてポインタが指すオブジェクト(?)の大きさってこと?
変わるんだろうね。
いろいろ機能を追加してくれちゃってよー、
今更時代遅れなCの新しい仕様なんて策定するんじゃねーよ!
じゃぁどの言語がいいんだ?
JavaもC#も用途が違うしな。

まさか、パスカルとかいうんじゃねーだろうな
>>889
Cがいい♪
今更仕様を変えないでってこと。
891デフォルトの名無しさん:02/09/06 19:54
そういえばC99に対応したK&Rの第三版って出そうもないですね。
本人達も今更って思っているのかしら。
892デフォルトの名無しさん:02/09/06 21:06
#include <stdio.h>
void main(void)
{
printf("(^-^)\n");
}

動きません。なんでですか?
>>892
エラーメッセージ見せやがれぼけ。
>>892
コンパイラによるが、
void main(void)

int main()

としてみろ。
895デフォルトの名無しさん:02/09/06 21:12
>>893
有効なWin32アプリケーションではないとか言われます。

>>894
コンパイラ?なんですかそれは(^_^;)
>>895
あのさぁ、初心者板でよく言ってるんだけどさ。
拡張子変えるだけではファイル形式は変わらない。
897デフォルトの名無しさん:02/09/06 21:16
>>896
ごめんなさい。
今からコンパイラというものを調べてみます。
>>894
return 0;
>>894
return '\0';
質問だけど、

int hoge(void)のvoidって絶対つけないといけませんか?
int main(void)のvoidは同ですか?

このvoidっていうのは、ひきすうが何もいらないっていうことですよね?
901デフォルトの名無しさん:02/09/06 21:19
>>900getのついでにage.
厨な質問だけど、まじめです。
902デフォルトの名無しさん:02/09/06 21:19
>>900
プロトタイプ宣言では必要(でないと呼び出し時にどんな引数リストにしてもOKということになる)。
関数の実体を書くときは不要。
>>900
省いてみ。
904デフォルトの名無しさん:02/09/06 21:26
voidをつけたらbccが起こらなくなったので、
なにかあるのかな、と。

Thx.
905デフォルトの名無しさん:02/09/06 21:30
>>902
mainを最初に書く派なら
int hoge(void);
〜〜〜
int hoge()
{ 〜 〜 〜 }
と書いておくと。

mainを最後に書く派なら
int hoge(void)
{
〜 〜 〜
}
ですよね。
906デフォルトの名無しさん:02/09/06 21:33
特別に課題丸投げを許可してくれませんか?だめですか?
>>906
「宿題手伝いますよ¥^^¥」スレ
http://pc3.2ch.net/test/read.cgi/tech/1029422194/l50
■自主製作ゲーム:開発状況報告スレVer0.2■
http://game.2ch.net/test/read.cgi/gamedev/1028161173/86
キターーーーーーーーーー

なんか、本気で作ってるようです。
>>908=60cmくん
910 :02/09/06 22:23
質問です
すべてのswitch文はif文で書き換え可能ですか?
すべてのfor文とwhile文は互いに書き換え可能ですか?
>>908
本気で DOS 窓にグラフィックを描く気なんだろうか?
正規表現ってC言語で使いますか?
switchは ifで書き換え可能だと思うけど、breakせずに下に落ちて
行くの書くのは大変そうだ。
>>910
出来ないんじゃない?

swirch(i)
{
case 1:

i = 3;
case 2:

break;
}


if(i == 1)
{

i = 3;

if(i ==1 || i == 2)
>>914
goto汁
>>911
まぁ、DOS窓でもかなりいろいろできると思うけど。技術があれば。
正規表現ってC言語で使いますか?
>>917
探せばライブラリあるんじゃない?
919917:02/09/06 22:34
>>918
使えるかどうか聞いているんじゃねーよ。
使うかどうか聞いているんだボケ!
>>919
んなもん、作るアプリによるだろ。
>>919
再インストールもしました。
なんかおかしいというのはブラウザを開いてもせつぞくできないんです。
ルーターで接続しているのですが。(ルーターの設定がおかしいわけではないです

ローカルエリア接続と言うアイコンもないし・・・
C言語じゃつかわねーよ
C言語で作ったソフトで使うかも知れないがな
テンプレートってC言語で使いますか?
924917:02/09/06 22:40
前スレと同様,また偽者が出てきた・・・
鬱だ
TV見よう
>>923
使いたかったらC++使えばいいと思います。
926919:02/09/06 22:41
>>924
下らないネタ質問しておいて騙りが出たくらいで鬱になるな。
927デフォルトの名無しさん:02/09/06 22:41
なんで小数と言わないで実数と言うんですか?
92860cm浮き上がるストレート:02/09/06 22:42
>>911
さっそく、オーバースローのピッチャーのアニメーションを書きました。
前に配列組んでおいたものの使い回しで、影絵ですが。
char[16][64][64]サイズ。1つで2×2ピクセル。
文字との連携(重ねる)と消えたり消えなかったりしてしまいますが、
念願のグラフィックを堪能しています。
ボクセルですか?!
>>926
ネタのつもりはなかったんだが。
勉強する必要があるか判断したかったのだが。
正規表現の勉強ならCでやらなくてもよいと思うが。
>>927
意味が違うからです
933デフォルトの名無しさん:02/09/06 22:47
>>932
違うの!?
C言語をやっていく上で,正規表現は覚えなくてもイイですか?
>>934
覚えてて損することはない。覚えとけ。

って言うかさっさと入門書買ってこいボケ。
本を買うほどのものかい。
よく正規表現ひとつで厚い本を作れるものだ。
937934:02/09/06 22:53
938デフォルトの名無しさん:02/09/06 22:55
こりゃまさに「買うほどのものかい」!!!
returnって
return a;
return (a);
どっちにします?
941デフォルトの名無しさん:02/09/06 23:10
>>940
return (a);は逝ってよし。
>>941
(・ε・)え〜?なんで〜
>>942
カコワルイ
主観だよ。あー主観だよ。主観で何が悪い。
944デフォルトの名無しさん:02/09/06 23:12
return a;
>>943
ただのバカか。
えーとヒープ領域ってなに?
mallocってメモリに確保されるんじゃあないの?
>>945
おまえがな
>>947
必要に応じて自由に使うことのできる大量のメモリが与えられる

検索キーワードが違ったか

ありがとん
今日はすごい勢いで進行してるな(w
#define STRICT ?
この勢いならワンスレッド5日持たない・・・(汗。
1000!
>>960
次スレよろしく〜
このスレの最初の'2:'にある、リンク先の右側の番号見て思うけれど、
かなり重複してますよ。
8〜20あたり、大丈夫?
>>955
全然大丈夫じゃない。
新スレで訂正してね(はぁと
9571:02/09/07 01:21
>>955-956 スマソ。訂正しますた。

【過去ログ】
29 http://pc3.2ch.net/test/read.cgi/tech/1029605182/
28 http://pc3.2ch.net/test/read.cgi/tech/1028495798/
27 http://pc3.2ch.net/test/read.cgi/tech/1027160374/
26 http://pc3.2ch.net/test/read.cgi/tech/1026048820/
25 http://pc.2ch.net/tech/kako/1024/10249/1024918442.html
24 http://pc.2ch.net/tech/kako/1024/10240/1024033400.html
23 http://pc.2ch.net/tech/kako/1023/10230/1023024817.html
22 http://pc.2ch.net/tech/kako/1022/10224/1022402165.html
21 http://pc.2ch.net/tech/kako/1022/10220/1022045622.html
20 http://pc.2ch.net/tech/kako/1021/10214/1021459016.html
19 http://pc.2ch.net/tech/kako/1020/10207/1020756993.html
18 http://pc.2ch.net/tech/kako/1020/10202/1020260813.html
17 http://pc.2ch.net/tech/kako/1019/10193/1019372139.html
16 http://pc.2ch.net/tech/kako/1018/10184/1018453690.html
15 http://pc.2ch.net/tech/kako/1016/10165/1016519243.html
14 http://pc.2ch.net/tech/kako/1015/10152/1015286974.html
13 http://pc.2ch.net/tech/kako/1013/10139/1013990673.html
12 http://pc.2ch.net/tech/kako/1012/10123/1012348974.html
11 http://pc.2ch.net/tech/kako/1009/10094/1009499565.html
10 http://pc.2ch.net/tech/kako/1008/10083/1008300863.html
9 http://pc.2ch.net/tech/kako/1007/10072/1007272267.html
8 http://pc.2ch.net/tech/kako/1005/10058/1005811510.html
7 http://pc.2ch.net/tech/kako/1003/10034/1003418249.html
6 http://piza2.2ch.net/tech/kako/999/999617524.html
5 http://piza2.2ch.net/tech/kako/994/994908590.html
4 http://piza.2ch.net/tech/kako/992/992357382.html
3 http://piza.2ch.net/tech/kako/989/989929288.html
2 http://piza.2ch.net/tech/kako/979/979529893.html
1 http://piza.2ch.net/tech/kako/967/967985026.html
>>940
括弧で括る必要なんか全くないのに括ってるのは
自前の脳味噌使ってないんだろうな、とは思う。
個人的な趣味として >>1 はできるだけ短いほうがすきなので、FAQの英訳や
K&Rの話は >>2 以降するのはどうでしょう?

あとこれも更新。
Part4 -> Part5
推薦図書/必読書のためのスレッド PART 5
http://pc3.2ch.net/test/read.cgi/tech/1027593322/
>>958
俺はsizeofは括らないと気が済まないけど、やはり脳なし?
>>959
賛成!
sizeofは付けなければならない場合と付けても良い場合があるのでつけてる。
returnは要らないので付けない。
963デフォルトの名無しさん:02/09/07 04:03
新スレ立てます。
>>959で新スレ立てると、>>1には何を書けば?
過去ログは>>957をコピペします
推薦図書URLを>>959のURLに変更します。

スレ構造は・・・
>>1 何書く?
>>2 コンパイラリンク
>>3 推薦URLとかK&Rとか
>>4 過去ログリンク

こんなのでよろしいか?
他に変更などはある?
で、>>1に何書くの。
>>963
このスレッドの >>1を参考にして、適当にジョークかましとけば
いいんじゃない?
>>963
>>1
C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/
gcc
http://gcc.gnu.org/

推薦図書/必読書のためのスレッド PART 5
http://pc3.2ch.net/test/read.cgi/tech/1027593322/l50

前スレ <30> http://pc3.2ch.net/test/read.cgi/tech/1030786546/

コンパイラ、過去ログなどのリンクは>>2-5 あたり

>>2 以降は
>>2 コンパイラリンク
>>3 推薦URLとかK&Rとか
>>4 過去ログリンク
でOK.
>>963
タイトル:
C言語なら、俺に聞け! <31>

名前:
SHOW-A

本文:
漏れは54才、30年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことなら全てわかるから、疑問な点があったら漏れに聞け。
今なら平成デフレ記念3割引奉仕中だ。

スケジュールは真っ白だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。あと、至急仕事をください。
一応、新スレ立てた。

C言語なら、俺に聞け!<31>
http://pc3.2ch.net/test/read.cgi/tech/1031340950/
>>967
なかなかヨカッタよ!おつかれ。
970デフォルトの名無しさん:02/09/07 05:59
質問です。
>エラー内容
>「ハンドルされていない例外は test.exe にあります:
>0x0000005:AccessViolation」

これってどう言う意味ですか?
既出ならすんまそん。m(__)m
配列の範囲外を参照したとかポインタの初期化し忘れとか。
972デフォルトの名無しさん:02/09/07 08:57
C言語を覚えたいのですがなにからはじめたらいいでしょうか?
本屋で本を買ってきなさい。
K&Rは難しいので自分が理解できると思われるやつを。
974shige:02/09/07 09:17
オライリーの「C実践プログラミング」が良い。
975972:02/09/07 09:19
>>973 , 974
返答ありがとうございます。
今日早速書泉に行ってきます。
>>975
shigeの言うことを信じてはいけません。
>>976
いや、その本は良書だと思うが。
>>977
オライリーの本、初心者には読みにくいかも…。
オライリーは良書から糞本まで幅広く取りそろえております。
表紙は並べるだけでも幸せ。
980デフォルトの名無しさん:02/09/07 15:01
読解力の個人差とかあるから本は自分で選ばないと後悔することが多いよ
>>980
っていうか、自分で選べない奴はプログラマに限らず資料探しができない奴だと思うが。
>>981
激しく同意。日本の画一教育の弊害だね。
983981:02/09/07 16:27
仮に自分でイイ本が選べなかったとしても失敗の中から学べると思うんだよね。
人に聞いて本を選ぶのは簡単だしほぼ確実だけど、自分の探索能力を向上するチャンスを
失っているってコトは自覚しておいたほうがいい。
いや、・・・良書を見抜くのはかなり難しいぞ。
特に自分が知らない分野のことでは。

最初は超初心者的な本になってしまうだろうが、それでもいいと思うぞ。
1000!
986デフォルトの名無しさん:02/09/07 21:08
C言語なら、俺に聞け! <31>
http://pc3.2ch.net/test/read.cgi/tech/1031340950/-30
好い加減に千回!
988デフォルトの名無しさん:02/09/07 21:16
そろそろ新しいスレ建てたほうがよくねーか?
989>>988のバ〜カ:02/09/07 21:19
新スレがたっているのを知らずに
寝惚けた事を逝っている>>988を馬鹿にしつつ、1000!!!
990デフォルトの名無しさん:02/09/07 21:21
ネタにマジレスしている>>989を馬鹿にしつつ1000げっと!!!!



失敗
1000
992988:02/09/07 21:22
>>989
馬鹿はおまえだ。
早くたてねーとマニアわネーゾ
子いうときに限って馬鹿がスレ立てすぎて作れねー氏。
どーすんだよ。このスレ今回で終わっちまうぞ
1000!!!
994デフォルトの名無しさん:02/09/07 21:23
>>992
C言語なんて時代遅れだから別にいいや。
995デフォルトの名無しさん:02/09/07 21:25
たった今Cしてきますた。
>>994
そう、時代はアセンブラなのだ。(藁
そろそろか?
998デフォルトの名無しさん:02/09/07 21:26
お姉さま・・・・
999デフォルトの名無しさん:02/09/07 21:26
1000(^-^)v
1000getsasere
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。