07/08/18 23:36:04
>>88
84が初心者(というか、自称初級者)で87が悪意のある(というか、臍曲がりの)上級者かと。
90:デフォルトの名無しさん
07/08/18 23:36:13
#include <stdio.h>
#include <string.h>
int main(){
char a[]="ABCDEFG";
char b[10];
/* 3文字目から5文字目こぴー */
strncpy(b, a+2 ,3);
b[3]='\0';
/*確認*/
printf("%s.%s\n", a, b);
return 0;
}
91:デフォルトの名無しさん
07/08/18 23:43:04
>>73
realloc()の返り値は、渡した引数と必ずしも一致していない。
必要なら、別の領域を探してきてそちらに移す。
というか、
>>これじゃメモリを別アプリから覗き見放題じゃないですか。
物理アドレスと論理アドレスの違いを勉強してくれ。
92:デフォルトの名無しさん
07/08/18 23:49:34
>>79
90が普通の書き方だけど、Windows環境なら、windows.hをインクルードして、
lstrcpyn()を使う方法も。
93:87
07/08/18 23:57:12
一部訂正。
--
- if (from - 1 >= length || from < to) return false;
+ if (to - 1 >= length || from < to) return false;
--
toで制限しておけばfromは必然的に制限の必要がないのを逆にしてしまった。
toで制限するなら、%*.*sも冗長と言えば冗長か。%.*sにすれば引数のlengthが一つですむ。
>>88>>89
何さ。
>>90>>92
strncpy()の仕様を覚えるくらいならsprintf()を使いこなした方が潰しが利きそうな気がするが。
94:90
07/08/19 00:07:12
>>93
>strncpy()の仕様を覚えるくらいならsprintf()を使いこなした方が
両方覚えるのが良いかと思います。後回しにするのならまだしも、
少なくともこの時点で切り捨てる必要は無いでしょう。
両方知れば、使い分ける事ができますから...
95:デフォルトの名無しさん
07/08/19 00:07:46
>>93
覚えるのは「strcpy()の長さ制限のあるバージョンがあったな」ってくらいでいいでしょ。
使うときは、仕様を確認すればいい。
96:デフォルトの名無しさん
07/08/19 00:15:29
strncpyはstrcpyに比べて異常終了しにくいので、まあともかく早く
動かしたいときには、よさそうな気もするけど、データの異常に気づかない
可能性があるのでおすすめではないです。
sprintは普通に重い処理だからスピードとか気にするところでは
避けたいですが、まぁ使いやすいっちゃ使いやすいですね。
memsetで初期化するのも褒められたやり方じゃないよな。
97:デフォルトの名無しさん
07/08/19 00:20:53
>>96
strncpy()でデータ異常に気づかないって、どういうケースで?
98:デフォルトの名無しさん
07/08/19 00:22:24
sprintfは「書式を指定する」てところに、特徴があるので、
その様な状況ではsprintfが適切でしょ。
対して,strcpy,strncpyは文字列のコピーが目的の関数ってことで、
>>79の様なケースでは、関数本来の目的にあってるかと思う。
99:デフォルトの名無しさん
07/08/19 00:26:17
strncpy()は、コピー先の後ろを0で埋めるという仕様があるので、
strncat()を使ったほうが速度的には有利だけど、書き方が直感的ではなくなる。
dst[0] = '\0';
strncat(dst, src, n);
100:デフォルトの名無しさん
07/08/19 00:26:50
>>97
文字列終端の'\0'を忘れるケースがありますね。
101:デフォルトの名無しさん
07/08/19 00:29:28
>>100
コピー元の文字列が、0がついてないような場合でも、長さ制限があるから無事に処理ができてしまうということ?
それは(この文脈では)sprintf()でも同じことでは?
102:100
07/08/19 00:49:40
>>101
送り側の文字列に0が無ければそうですが、送り側に0があった場合でも、
strncpyの場合、送り側が受け側の長さ(与えた長さ制限)以上の場合、付きません。
対して、sprintfならば0は自動的につきます。受け側に起きる問題ですね。
ちなみに >>100 != >>96 ですので、
>>96さんのいう異常が同じ事を言ってるのかは、わかりませんが。
103:デフォルトの名無しさん
07/08/19 00:50:34
指定した長さでコピーがカットされた時、
\0終端してくれないってことだろ
104:デフォルトの名無しさん
07/08/19 01:14:06
char s[] = "12345678", d[4];
strncpy(d, s, sizeof(d));
ってやったときにdは0終端されないっす。
こういう挙動なのでとっても使いづらいっす。
使いどころはないこともないんだけど、
まず使うことはないですね。
105:デフォルトの名無しさん
07/08/19 01:34:21
フリーの統合開発環境でいいのありますか
106:デフォルトの名無しさん
07/08/19 01:35:46
Visual Studio
107:デフォルトの名無しさん
07/08/19 01:39:40
>>104
strncpyの返り値が d じゃなくて、コピー後の末尾だったら良かった。
と思ったことがある。そうすれば、次々に連結する処理が楽かなーと。
まあ、それくらいなら自作出来るけど。
108:デフォルトの名無しさん
07/08/19 02:01:33
>>105
いいのかどうか分からないけど
少し重いが
同じツールでJavaも開発できるエクリプスなんかどうでしょう?
コマンドプロンプトしかありませんが
109:デフォルトの名無しさん
07/08/19 04:40:42
学生なら迷わずVS 2005 academic
110:デフォルトの名無しさん
07/08/19 14:05:01
学生で今はちょっとCをやった所だけど、やっぱりCよりC++の方がすごいソフトができるの?
なでしことかドリトルでは限界があるの?プログラマーは生涯にたくさんの言語を使うらしいけど
DとかJavaとかいろいろありすぎてどれをやればいいのか分からない、とりあえずCからやってるけど
111:デフォルトの名無しさん
07/08/19 14:08:05
初めはJavaかC#からやるのがいいんじゃないかな
Cはその次がいいと思うよ
112:デフォルトの名無しさん
07/08/19 14:20:16
マジで? ちょっとVisual C# Express Edition落としてきます
113:デフォルトの名無しさん
07/08/19 14:24:36
Cからやるべきだろ
114:デフォルトの名無しさん
07/08/19 14:27:17
俺もCからがいいと思うよ
115:デフォルトの名無しさん
07/08/19 14:33:57
C#かJavaあたりだろうね。
116:デフォルトの名無しさん
07/08/19 14:38:28
俺も初めはバグを作りにくく直しやすい言語がいいと思うからC#やJavaをすすめる。
Cより型付けが強いし何かあれば例外投げて原因に気づきやすい。
あとGCがあるからメモリ周りは比較的無頓着にできる。
もちろんその後もCはやらないでいいって言ってるわけじゃないよ。
117:デフォルトの名無しさん
07/08/19 16:23:01
strncpy みたいな使いにくい関数じゃなくて、
strlcpy が標準になればいいのに。
118:デフォルトの名無しさん
07/08/19 16:34:54
NULLターミネイト位やっといてくれよとは思う
結局ラッパー関数書くハメになるし
119:デフォルトの名無しさん
07/08/19 18:11:09
void PhysicsDraw(){
for(int x=40; x<640; x=x+40) DrawLine(x,0,x,480,GetColor(64,64,64));
for(int y=40; y<480; y=y+40) DrawLine(0,y,640,y,GetColor(64,64,64));
DrawCircle(320,240,30, GetColor(255,0,0),TRUE);
}
ていうプログラムが本に載ってたんですがそのままやっても
> C:\borland\bcc55\Bin\make.exe -fDebug\dxtest.mak TARGET
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -L..\DxLib -DDEBUG -nDebug -I..\DxLib;C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib -c C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp:
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 3: 未定義の関数 'DrawLine' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 3: 未定義の関数 'GetColor' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 未定義の関数 'GetColor' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 未定義の関数 'DrawLine' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 未定義の関数 'DrawCircle' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 未定義の関数 'GetColor' を呼び出した(関数 PhysicsDraw() )
エラー E2451 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 未定義のシンボル TRUE(関数 PhysicsDraw() )
*** 7 errors in Compile ***
** error 1 ** deleting Debug\dxtest.obj
Make End !! (Elapsed time 0:00.296)
ってエラーが出るんです。どうしてでしょうか?
ちなみに今日プログラム始めたばかりです。
120:デフォルトの名無しさん
07/08/19 18:40:01
>>119
それはコードの一部だからコンパイルできないよ。
どっかにコードの全部が掲載してあるんじゃね。
もしくはCDに入ってるか。
つか、本文も読めばいいのに。
121:名無しさん@お腹いっぱい
07/08/20 02:31:35
質問なのですが家でc言語使えるようにしようと思って
microsoft.net Framework version 2.0 再頒布可能パッケージ
microsoft.net Framework version 2.0 SDK 日本語版
をダウンロードしたのですが友達の話によると
microsoft.net Framework version 2.0 日本語版 language pack
が必要らしいのですがmicrosoftの公式サイトに行っても見つからないのですが
どうやったら手に入るのでしょうか?
すごい初歩的な質問ですいません
122:デフォルトの名無しさん
07/08/20 02:38:44
>>121
悪いことは言わんから Visual C++ 2005 Express Edition 使っとけ。
123:デフォルトの名無しさん
07/08/20 10:45:33
C言語で.NET?
124:デフォルトの名無しさん
07/08/20 10:47:25
.NETが必要なら導入すべきだが、C言語ってだけだと別に必要ってわけでもないガナ
125:デフォルトの名無しさん
07/08/20 11:10:49
>>107
あー、それ俺も思った。
strncpy(d, s, sizeof(d))[sizeof(d)] = '\0';
↑ ↑
ここがなんかクドイ
126:デフォルトの名無しさん
07/08/20 11:39:29
>>125
くどいかどうか以前に、いろんな意味で間違いすぎ。
127:51
07/08/20 12:41:28
低レベルな質問なのですが・・
こないだ友人と話してたのですが(どちらも現場経験なし)、
if文に{}っていりますか?
ifのあと文が1つなら{}は省略してよし、と書いてあるので友人はいらないといいます。
けど私は読みやすいから{}つけたい人間です。
こんな感じです。
if(ia==0){
printf("HelloWorld\n");
}
{}はつけないほうがいいのでしょうか?
128:デフォルトの名無しさん
07/08/20 12:48:48
>>127
宗教論だな。正直どっちでもいい。
いろいろな人がソースコードを編集するなら
インデントとか括弧とかはツールで一括変換するようにすればおk
GreatCode とか
129:デフォルトの名無しさん
07/08/20 12:53:52
if(foo)
if(boo) zoo=0;
else // !fooのつもり
zoo=1;
みたいなのをやらかしそうなら、付けといた方がいいかな、程度のもんだと思う。
130:デフォルトの名無しさん
07/08/20 12:58:20
私のところのコーディングガイドでは、1行に収める場合のみ省略化としている。
つまり、
if (foo) bar();
はOKだけど
if (foo)
bar();
はダメ。
勿論、
if (foo) {bar();}
も
if (foo) {
bar();
}
もOK。
131:デフォルトの名無しさん
07/08/20 12:58:51
>>127
>if文に{}っていりますか?
つけてもつけなくても文法上間違いではない。
>{}はつけないほうがいいのでしょうか?
つけたほうがいい。
132:デフォルトの名無しさん
07/08/20 13:07:31
>>126
>いろんな意味
kwsk
133:132
07/08/20 13:10:15
あ、ありえないミス…
× sizeof(d)
○ sizeof(d)-1
134:デフォルトの名無しさん
07/08/20 13:11:37
俺は逆にカンマ演算子を使ってまで中括弧は使わないようにしてる
えへへ
135:51
07/08/20 13:11:45
>>128~>>131
回答ありがとうございます。
どちらでもいいし、つけたほうがいいっぽいですね^^
やはりつけるようにします。
136:デフォルトの名無しさん
07/08/20 13:18:09
>>125
dが配列だと思っていいのかな?
だったら
sprintf(d, "%.*s", sizeof(d) - 1, s)
でいいじゃん。
137:デフォルトの名無しさん
07/08/20 13:25:54
>>136
0終端の為だけに態々そんな余計な文字列パースさせるの?
138:デフォルトの名無しさん
07/08/20 13:31:17
>>137
余計なメンテナンスに時間取られるくらいならありじゃね?
パフォーマンスが問題になるようなら入れ替えればいいことだし。
# まさかMS-DOSの時代みたいにprintf()系をリンクしないでサイズ節約なんて考えないだろうし。
139:デフォルトの名無しさん
07/08/20 18:58:08
>>135
文がひとつのケースでも括弧をつけたほうがミスがなくなる。
140:デフォルトの名無しさん
07/08/20 20:58:52
宗教論争になるからそろそろやめようぜ。
141:デフォルトの名無しさん
07/08/20 21:18:10
という指摘は既に >>128 でなされているわけですが
どーしても自分語りがしたい阿呆が多くてなかなか収束しません。
142:デフォルトの名無しさん
07/08/20 21:19:17
なに仕切ってんのコイツ
143:デフォルトの名無しさん
07/08/20 21:35:48
ヽ○ 小学校のころから、学級委員してました♪
|>
((
〇∧〃
/ > でもそんなの関係ねぇ!
< \ そんなの関係ねぇ!
〇/ はい!
/| オッパッピー!!
/>
チントンシャンテントン♪
チントンシャンテントン♪
144:デフォルトの名無しさん
07/08/20 22:10:27
いろんな意味で終わったネタを引っ張るなよ
145:デフォルトの名無しさん
07/08/20 22:57:39
>>135
一行のときは{}は無いほうがいいよ。
10年に一度もしないようなミスのために、読みやすさを損なうことはない。
コードを大量に書いてる人は、省略する派が多いし。
146:デフォルトの名無しさん
07/08/20 23:21:38
笑わせてくれるぜ
147:デフォルトの名無しさん
07/08/20 23:39:51
>>145
コードを大量に書いてる人ってだれ?
148:デフォルトの名無しさん
07/08/20 23:54:27
読みやすさを考えたらコードを大量に書くとか・・・
149:デフォルトの名無しさん
07/08/20 23:56:52
>>147
linux書いてる人とか、apache書いてる人とか、postgres書いてる人とか、その他いろいろ。
150:デフォルトの名無しさん
07/08/21 00:01:02
「一行でも{}をつけた方が良いか」とかの、
くだらない事を質問するような奴なら、つけた方が良いと思う。
俺はつけないが
151:デフォルトの名無しさん
07/08/21 00:42:31
>>149
その人たちは本当に読みやすさのために省略してるのか?
152:デフォルトの名無しさん
07/08/21 00:44:55
そもそも「コードを大量に書く人」のソースをlinuxやapache書いてる人として
その人たちの中じゃこっち派が多いよってのは無理があるだろう。
そこらへんのプログラマだって大量にコードは書いてる。
153:デフォルトの名無しさん
07/08/21 00:45:55
うぅ、日本語が変だ・・・orz
154:デフォルトの名無しさん
07/08/21 05:56:54
「if」って打ったらエディタが
if () {
}
って勝手に出してくる(ように設定している)ので、
消すのが面倒だし害はないし後々の面倒を予防できるのでそのまんまにしてまーす。
155:デフォルトの名無しさん
07/08/21 06:49:28
そういうのって()の中にカーソル移動すんの面倒じゃないの?
156:デフォルトの名無しさん
07/08/21 07:51:06
>>135 つけたほうがいいっぽいですね^^
質問内容は釣ネタに見えますがまだレスが流れている様ですので
プログラムは評価を受けるとかレビューとかされる場合があり
必ず中括弧'{}'で括るケースでも例えば1行しかないのに何でわざわざ中括弧で括るの?と質問された時
何と答えるかです
自分なりに定性的定量的な論旨展開で結論を出すか
ご存知かと思いますが世の中にあるコード標準とか規約とかを引用するかですね
例えば以下リンクが良く纏まっていますのでお勧めですが
URLリンク(www.literateprogramming.com)
次レスに続く
157:wolf ◆8VH3XAqjlU
07/08/21 07:51:49
>>135 つけたほうがいいっぽいですね^^
続き
中括弧で括るケースについての記述は
2.C++ Coding Standard
└─Usage Of The Implementation Language
└─Control Structures
└─Branching
└─if ... else statement
に有りますが中括弧だけでなくインデントや比較代入記号に関しても検討して下さい
if(ia==0){
printf("HelloWorld\n");
}
僕ならこう書きます
if(0==ia)
{
printf("HelloWorld\n");
}
158:デフォルトの名無しさん
07/08/21 07:54:31
定量的な論旨展開ってなんだ?
159:デフォルトの名無しさん
07/08/21 08:08:03
いきなり書き込まれてしまいまして訂正かねて
>>135 つけたほうがいいっぽいですね^^
続き
if(ia==0){
printf("HelloWorld\n");
}
僕ならこう書きます
if(0==ia)
{
printf("HelloWorld\n"); <---- 訂正
}
>>158 定量的な論旨展開ってなんだ?
あまり即答はしないほうですがたまにはソフトウエア工学的な
意見展開もいいかもしれませんので
例えば
ひと纏まりしたコードは1画面内に収まったほうがreadabilityが良いですから
160:デフォルトの名無しさん
07/08/21 08:12:00
日本語おかしい
161:デフォルトの名無しさん
07/08/21 08:19:17
「たとえば」がなにとたとえてるのかさっぱりわかりませんが。
162:デフォルトの名無しさん
07/08/21 08:23:40
比較で定数を左にもってくるというテクニックも、警告が出ないよう
にコーディングするって当たり前のことをしてれば必要ないですね。
変に技巧にはしるようなことはやめて、素直に書きましょう。
163:デフォルトの名無しさん
07/08/21 08:24:48
定量的といいつつ、定量的なことは一切書いてない件。
164:デフォルトの名無しさん
07/08/21 08:26:06
そもそも論旨は展開するようなもんじゃない
165:デフォルトの名無しさん
07/08/21 08:27:25
本当に釣りネタに見えるなぁ・・・
166:デフォルトの名無しさん
07/08/21 08:58:16
インデント論争に発展するのだけはやめような
167:デフォルトの名無しさん
07/08/21 10:24:11
>>145
どこが
> 読みやすさを損なう
のかさっぱり。やっぱ、主観的なことしかいえないだろ?
だからやめろつってんのにw
コンパイルが通ればどっちでも良いんだよ。
むしろ必要性について知らない方がダメ
168:デフォルトの名無しさん
07/08/21 10:25:24
>>151
そういう人たちは複雑になるんで、やはり規則性を持った記述をしているため
書いたり書かなかったりみたいな、ことはしてないはず。
169:デフォルトの名無しさん
07/08/21 10:41:52
>>168
書いたり書かなかったりしていますが何か。
// 書かないケース
if (foo) bar();
// 書くケース
if (foo) {
bar();
}
170:デフォルトの名無しさん
07/08/21 10:47:34
scanfだと入力後エンター押す必要がありますが
画面に入力した瞬間から反映される関数ってありますか?
171:デフォルトの名無しさん
07/08/21 10:50:15
>>170
標準ではありません。環境依存になりますが、例えばcursesなどのライブラリを使えばできないわけではありません。
172:デフォルトの名無しさん
07/08/21 10:51:10
あるいは、{ } が不要な1文のみの場合、
if() の後ろにそのまま続けてifと同じ行に書いていたり。
だから読みづらいだの主観的な意見はナンセンス。
自分が思うとおりに動作するように記述できて、コンパイルが通れば良し。
173:デフォルトの名無しさん
07/08/21 11:04:53
読みづらさをないがしろにする意見はナンセンス
174:デフォルトの名無しさん
07/08/21 11:08:07
読みづらいなんてのは主観なんだから放っておけばいいさ。
読みにくいという指摘なら、話を聞かないでもないが。
175:デフォルトの名無しさん
07/08/21 11:12:10
読みにくさは主観じゃないの?
176:デフォルトの名無しさん
07/08/21 11:14:40
客観的立場に立とうとした表現だね。定量的ではないが。
177:デフォルトの名無しさん
07/08/21 11:14:52
誘導
コーディングトラブルの約70%はif文などでの{}省略
スレリンク(tech板)
178:デフォルトの名無しさん
07/08/21 11:16:12
>>173
だからその読みづらいって主観が個人的なものでナンセンスだって言っているんだが?
人それぞれで、括弧があれば読みづらい、なければ読みづらいとか言われても
んじゃどっちだよ?って争いになるから、括弧の必要性を理解した上で
自分が思う通りに処理するソースがコンパイラに通ればそれで良いだっつってんだよ、バカかてめぇはw
179:デフォルトの名無しさん
07/08/21 11:22:53
括弧がなくても通るからって理由でつけるつけないをわざわざ
一個人の読みやすさという客観的ではない曖昧な基準で話を進められても困るだろ。
とりあえず、オープンソースのように、他者と交互にやりとりしている人たちのソースを見て
参考にするのも良いだろ。自分だけが編集するソースならどっちをとろうが個人の自由。
180:デフォルトの名無しさん
07/08/21 11:24:39
どっちでもいいけどソース内で統一されてれば読みやすい
181:デフォルトの名無しさん
07/08/21 12:05:16
>>171さん
例を教えてください
お願いします
182:デフォルトの名無しさん
07/08/21 12:28:52
>>181
例としてcursesライブラリを挙げていますが。
183:デフォルトの名無しさん
07/08/21 12:58:43
ifの括弧についてもれがまとめるからもうこの話題はおわろうぜ。
[結論]
ifに括弧はつけなさい。
[理由]
つけてもつけなくてもいい文法が問題だけど
このスレだけでも大半の人間がどちらでもよい、又はつけたほうがいい
というんだからつけなさいYO!
可読性なんてものは人それぞれ違うんだから議論自体が無意味。
もし{}つけたら効率が落ちるんなら
あんたのプログラムif文使いすぎ。作り直しなさい
{}つけるのにそんな面倒か?
なんでそんなにつけるのに反発するんだ?
YOU!つけちゃいなYO
以上まとめでした
184:デフォルトの名無しさん
07/08/21 13:08:18
if(bFlag) i++;
これとか括弧付けるだけ無駄だろ
185:デフォルトの名無しさん
07/08/21 13:11:48
んじゃ、1行纏め。
・迷ったらつけとけ。つけないなら理論武装しておけ。
186:デフォルトの名無しさん
07/08/21 13:15:49
>>185
先生ノ >>184に「なんで無駄な{}つけてんだ!」ってからまれたら
どういう理論武装しておけばいいですか?
187:デフォルトの名無しさん
07/08/21 13:35:18
>>186
日本語読めますか? >185には「つけないなら」と書いてあるのですが。
188:デフォルトの名無しさん
07/08/21 13:37:10
>>187
じゃあ「つけないなら」どういう理論武装しておけばいいですか?
189:デフォルトの名無しさん
07/08/21 13:38:48
俺は括弧もゴムも付けない派
190:デフォルトの名無しさん
07/08/21 13:39:34
武装できるような理論があればそもそも論争は起きん
191:デフォルトの名無しさん
07/08/21 13:43:31
理論武装しないならつけとけw
192:デフォルトの名無しさん
07/08/21 13:44:57
なぜ?
193:デフォルトの名無しさん
07/08/21 14:16:00
>>184 誰がそういうのにも必ず付けろって言った?だからそういう議論は
相手を罵倒したり屁理屈が横行するからやめろつってんのに、うざっ
所詮夏厨か
194:デフォルトの名無しさん
07/08/21 14:35:00
>>182さん
ぐぐったら理解できました
ありがとうございました
195:デフォルトの名無しさん
07/08/21 14:42:11
なんで>181は自分の環境を書こうとしないのだろう……
196:デフォルトの名無しさん
07/08/21 16:20:33
>>195
国家機密なんです(><)
197:デフォルトの名無しさん
07/08/21 17:42:35
Windows XPのGUIのプログラムをc言語で作りたいのですがどうすればいいですか?
198:デフォルトの名無しさん
07/08/21 17:44:55
>>197
教えたいのはやまやまですが国家機密なんです。
199:デフォルトの名無しさん
07/08/21 17:45:06
>>197
どう、とは?
環境の話なのか、前提知識の話なのか、
それともそれらはクリアしてて、コーディングの話なのか。
200:デフォルトの名無しさん
07/08/21 18:15:47
>>197
まず、Windows NT系の入ったパソコンを用意します。
201:デフォルトの名無しさん
07/08/21 18:42:03
次に、VCを違法コピーします。
202:デフォルトの名無しさん
07/08/21 18:43:43
>>155
もちろんエディタが()の中にカーソルを勝手に移動させまーす。
あと、そこに加えて{}の中にマークをつけるので、
()と{}の中にキー一発で飛べるようにしてまーす。
203:197
07/08/21 18:52:30
>>198
え、そうなんですか?私は国家には忠誠を誓っているものですから安心しておしえてください。
>>199
あ、すいません、前提知識ですね。
APIとかをOSの仕組みなどを勉強すればいいのでしょうか?
APIの実装方法やアルゴリズムなどの実装がなんか漠然としてしまって理解できません、
>>200
パソコンは、Windows XPなのでNT系だと思うので多分大丈夫だと思います。
>>201
VC2003なんとかというコンパイラとボーランドの無料のコンパイラをインストールしてあります。
204:デフォルトの名無しさん
07/08/21 19:00:54
猫でもわかるでも読んどけ
205:デフォルトの名無しさん
07/08/21 19:06:18
>>203
VC2003なんとかというコンパイラを使います。
ひとりでGUIを勉強するときは、チュートリアルがないと無理。
サンプルのたくさん載った参考書が必要。
Windowsアプリの作成は理解するというより慣れるです。
理解しようとすると挫折します。サンプルを入力、コンパイルして慣れてください。
206:デフォルトの名無しさん
07/08/21 19:10:37
>>203
まさかノってくれるとは思わなんだ。
つかGUIプログラミングはせめてC++とMFCでする気は無いか?
もっと簡単にするならC#という言語を使う手もある。
C言語でやるのは面倒だが、何か理由があっての事か?
207:デフォルトの名無しさん
07/08/21 19:31:01
>>203
・Visual C++ 2005 Express Edition と Microsoft Platform SDK を一緒に使う
URLリンク(www.microsoft.com)
・Win32 API入門
URLリンク(wisdom.sakura.ne.jp)
208:デフォルトの名無しさん
07/08/21 21:03:04
>>179
コーディングスタイルって、経験が足らないヤツが頭で考えたっていびつになるんだよな。
実際コードをたくさん書いて、世間で実際に評価されてる人のを参考にしたほうがいいよね。
209:デフォルトの名無しさん
07/08/21 22:55:29
括弧があってもなくても、可読性に影響がでないくらいシンプルな記述を希望します。
COBOLを連想させるような200行以上もある関数はヤメレ
210:デフォルトの名無しさん
07/08/21 23:13:44
じゃあ俺はFORTRANを連想させるようなgoto使いまくりの関数にするぜ。
211:デフォルトの名無しさん
07/08/21 23:15:33
>>209
同感です。if文だけに着目するよりも、前後の文を含めて、
そして全体を通してシンプルであることが望ましいですね。
適当に空行を入れるだけでも、それなりに変わりますからね。
212:デフォルトの名無しさん
07/08/21 23:24:05
正直、こんな書き方はやめて欲しい。
--
double sum = func(
sx[ox]
,cx[ox]
,sy[oy]
,cy[oy]
,xDim
,yDim
,wr
,wi
);
213:デフォルトの名無しさん
07/08/21 23:33:15
>>212
1行にしてみました。どうでしょう?
double sum = func(sx[ox], cx[ox], sy[oy], cy[oy], xDim, yDim, wr, wi);
それとも構造体にまとめて、ポインタ渡しが良いですか?
具体的に希望があればどうぞ。
214:212
07/08/21 23:38:29
>>213
いやまぁ、とっくに整形済みだけどね。
215:デフォルトの名無しさん
07/08/21 23:52:40
>>213
全部グローバル変数で渡して引数はなしの方向で
216:デフォルトの名無しさん
07/08/22 00:04:31
手動インライン展開で
217:デフォルトの名無しさん
07/08/22 12:45:29
>>212
コーディング規約でそのスタイルを規定しているところもある。
これだと、引数一つ一つにコメントがつけられるという利点がある。
コーディングスタイルはそれぞれ良いところもあれば、悪いところもあるのが普通で、
プロジェクトあるいは会社でコーディングスタイルが統一されていることが大事。
218:デフォルトの名無しさん
07/08/22 12:56:14
>>217
カンマを行頭に持っていくのは規約以前の問題。
英語圏の人が見たら発狂するぞ。
219:デフォルトの名無しさん
07/08/22 13:16:24
>>215
悪質にも程があるわ
220:デフォルトの名無しさん
07/08/22 13:58:01
カンマ行頭はSQLじゃよくやるけどな
221:デフォルトの名無しさん
07/08/22 14:19:32
gets関数やscanf関数は想定外の入力をされて変な挙動をする可能性があるので使わない方がいいと
聞いたのですが、ではどういう風にすればいいのでしょうか、実際のプログラムではどうしているか教えてください。
222:デフォルトの名無しさん
07/08/22 14:23:44
>>221
>>52参照。
getsは問題がないだろう。
223:221
07/08/22 14:29:44
>>222
gets関数はバッファオーバーランの危険性がありませんか?
例えば、char buffer[1024] と宣言した場合に1024バイトであるという情報を
gets関数に伝える手段がないと思うのですが、、、
224:デフォルトの名無しさん
07/08/22 14:40:39
test
225:デフォルトの名無しさん
07/08/22 14:41:42
>>223
fgets
226:デフォルトの名無しさん
07/08/22 14:51:24
>>222 みたいなのがいるところをみると、やはり日ごろ来ていない夏厨なんだなぁ~って思う
227:デフォルトの名無しさん
07/08/22 14:53:32
ずっと居る奴も痛いがな
228:デフォルトの名無しさん
07/08/22 15:11:44
gets なんて捨てプログラムでしか使えねえ
229:デフォルトの名無しさん
07/08/22 15:13:18
捨てプログラムでは使う
230:デフォルトの名無しさん
07/08/22 15:14:00
>>223
入力可能な最大文字数を超えるサイズののバッファを確保しておけばいいだけじゃん。
231:デフォルトの名無しさん
07/08/22 15:21:56
>>230 みたいなのがいるところをみると、やはり日ごろ来ていない夏厨なんだなぁ~って思う
232:デフォルトの名無しさん
07/08/22 15:27:17
>>231 getsに関する君の考えは?
233:デフォルトの名無しさん
07/08/22 15:30:33
>>232
getsに対する俺の考えなんてどーでも良い。存在そのものが問題視されているのは
とっくの昔に知れ渡っていること。それに関する文献を自分で調べな。この板に
一定の期間来て色々と議論を見てきた人なら、まず知っているよ。そう、そんなのは使わないのが鉄則。
234:デフォルトの名無しさん
07/08/22 15:31:31
>>233 だから、それをここで君の言葉でいいなさいよ。
235:デフォルト名無しさん
07/08/22 15:37:29
「DOS窓を開く」を説明してください。
236:デフォルトの名無しさん
07/08/22 15:38:14
>>233
知らないならレスしないでください!
237:デフォルトの名無しさん
07/08/22 15:40:18
セキュリティに関しても問題とされるバッファオーバーラン、固有の環境とか仕様で
対処すりゃみたいなことを言わず、プログラム側でしっかり対処すること。
とにかく、getsだけはありえん。
238:デフォルトの名無しさん
07/08/22 15:41:37
>>235
これくらいは理解してみて
URLリンク(ykr414.com)
239:デフォルトの名無しさん
07/08/22 15:42:40
234 名前:デフォルトの名無しさん 投稿日:2007/08/22(水) 15:31:31
>>233 だから、それをここで君の言葉でいいなさいよ。
236 名前:デフォルトの名無しさん 投稿日:2007/08/22(水) 15:38:14
>>233
知らないならレスしないでください!
↑なんだこいつ?うざすぎ。説明してもらえなきゃ相手が理解していないってことになるなら
そう思ってろ。すでに説明は済んでいるのにな。痛すぎ。お前みたいな奴が質問に答えるのも
問題があるだろ。とっとと失せな、夏厨。
240:デフォルトの名無しさん
07/08/22 15:44:14
>>239
知らないならレスしないでください!
241:デフォルトの名無しさん
07/08/22 15:44:55
入力は何もプログラムを起動してユーザがキーボードで文字を入力する以外にも
ファイルからリダイレクトってのもあるし、データを受ける側が用意した記憶領域を
超えて入力を受け付けてしまうことなんて考えたらキリがないが、そういうのも含めて
getsだけはありえん。使った時点でアホだと思われるぞ。
242:234
07/08/22 15:48:10
gets関数は>>223のいうとおりバッファオーバーランの危険性がある。
fgets関数と違ってgets関数の引数にはバッファのサイズの引数がないからだ。
でも、それは>>230のいうとおりで、想定最大入力文字数のバッファを用意しておけば
それですむはずだ。
プログラムを作るときは、入力データの種類やサイズの範囲、誤動作の許容レベル
というものがあるはずで、自分または身内が使う簡単なテストプログラム程度のもの
であればコンソール入力のバッファをchar buf[1000];ととってもなんら問題がないと思われる。
243:デフォルトの名無しさん
07/08/22 15:50:08
URLリンク(ja.wikipedia.org)
問題点のヒントを出しても調べようとしないのか。頼む、お前みたいな無知が
生半可な浅はかな知識でいい加減な回答をするのは迷惑なんで黙っていてくれ
244:デフォルトの名無しさん
07/08/22 15:54:19
>>243
知らないならレスしないでください!
245:デフォルトの名無しさん
07/08/22 15:56:45
gets を使うことでバッファオーバフローのサンプルコードを出せる
反面教師のようなところが利点
#include<stdio.h>
int main(void){
int a=3;
char buf[8];
int b=5;
int diffa, diffb, diff=-1;
int i;
diffa=(char*)&a-buf;
diffb=(char*)&b-buf;
if(diffa>0 && diffa<50) diff=diffa;
if(diff>diffb && diffb>0 && diffb<50) diff=diffb;
if(diff<0) return 0;
printf("a=%d b=%d\n", a, b);
printf("Input next string\n");
for(i=0;i<diff;i++) putchar('*');
printf("x\n");
gets(buf);
printf("a=%d b=%d\n", a, b);
return 0;
}
246:デフォルトの名無しさん
07/08/22 16:07:32
getsでOKかNGかは作成するアプリのバッファオーバーランの例外処理の要求レベルによるだろう。
業務で使用するものなら、getsは使わないほうが望ましい。fgetsを使う。
テストプログラムや身内で使うものならgetsも可。
ただし、その場合でもバッファは「十分なサイズ」のものを用意しておくこと。
ということかな?
247:デフォルトの名無しさん
07/08/22 16:08:42
うん
248:デフォルトの名無しさん
07/08/22 17:19:09
バッファオーバーフローを利用したコードインジェクションの例を書こうと思ったが、
>>245 みたいに広い範囲で使えるソースを書くのって難しいね
249:デフォルト名無しさん
07/08/22 17:43:25
>238 arigato mucho obrigado
250:デフォルトの名無しさん
07/08/22 18:10:52
相変わらずおまいら gets 好きだね。
飽きないね。
251:デフォルトの名無しさん
07/08/22 18:35:48
gcc@linuxなのですが、
a というプログラム(プロセス)から b を必要に応じて起動し
(aはbを起動した後引き続き起動し続ける)ようにしたいのですが、
どうやるのが正しいのでしょうか?
今は、
a側で
pid = fork();
if (pid==0) execv(b);
のようにしているのですが、このやり方であってます?
252:デフォルトの名無しさん
07/08/22 20:06:36
>>244
Linux Programmer's Manualには「gets()は絶対に使用してはならない。」と書かれている
253:デフォルトの名無しさん
07/08/22 20:07:03
教科書を終わったばかりでscanf()とか使いまくりなんだけど、
そういうやらないほうがいいマナーがまとまってる解説サイトはないですか
254:デフォルトの名無しさん
07/08/22 20:15:25
少し古い気もするけど、C FAQ。
URLリンク(www.kouno.jp)
255:デフォルトの名無しさん
07/08/22 20:18:37
>>246 みたいなのがいるところをみると、やはり日ごろ来ていない夏厨なんだなぁ~って思う
256:デフォルトの名無しさん
07/08/22 20:38:43
>>252
捨てプログラムくらいならいいだろー
257:デフォルトの名無しさん
07/08/22 20:38:50
お前きもいよ
258:デフォルトの名無しさん
07/08/22 21:09:06
>>256
そういう話をしたらキリがないだろ。だったら話に入ってくるなよ。
なんでお前の個人的な都合を受け付ける話題になってんだ?
頼むからお前みたいな自分勝手なことしかいえない奴は大勢とやりとりする
場での議論には入ってこないでくれ。それからお前は二度とここで質問に回答するな。
259:デフォルトの名無しさん
07/08/22 21:10:12
>>256 こいつダメだ。「何が問題」とされているのか分かってないのか?
そう思うなら自分だけが扱うソースでは使えば良いだろ。正式なものに書き換えるときに
わざわざgetsの部分を探して仕様を変更して書き直してたらそれこそ手間が掛かるだろ。
260:デフォルトの名無しさん
07/08/22 21:12:11
>>256
確かにお前みたいな奴が作るプログラムなんて、他の人に使わせないだろうから良いけどさ。
getsを使った入力を受け付けるプログラムが、予期せぬ状況下でバッファオーバーランをして
OSの動作にまで何かトラブルを起こすようなら話にならんのだよ。そういうことも考えて
より精巧なプログラムを作れないようなら、お前はプログラミングには向いてない。
今すぐ将来の進路を変更した方が良いよ。
261:デフォルトの名無しさん
07/08/22 21:13:01
>>256
いいですよ^^
262:デフォルトの名無しさん
07/08/22 21:15:45
お前らきもいよ
263:デフォルトの名無しさん
07/08/22 21:29:42
>>258-260
同じ人ですか?
264:デフォルトの名無しさん
07/08/22 21:32:43
>>256 は今、布団の中で泣きながらダンディ坂野が24時間テレビでやっていた
ゲッツ1万回チャレンジを思い出しているに違いない。
265:デフォルトの名無しさん
07/08/22 21:45:13
捨てプログラムのはずなだったのに、
なぜか他人が使っているという不思議な事態も想定すべき。
266:デフォルトの名無しさん
07/08/22 21:46:38
盲目的に使っちゃいけない、と思い込む方が楽だからな
自分で判断しないから
信号も赤なら渡らない、と決め込んで
青なら安全確認もろくにしないで事故に会うタイプだな
267:デフォルトの名無しさん
07/08/22 21:56:23
>>264
余計泣けるじゃないか
虚しさに
268:デフォルトの名無しさん
07/08/22 22:01:58
>>265
> なぜか他人が使っている
ないない、お前日本語が理解できないアホだろ。だから議論に入ってくるなっつってんだが?
言葉以前に現状すら理解できんだろ。よく読め、アホ。
>>260
> 他の人に使わせないだろうから良いけどさ。
だから捨てなんだろ?getsを使ったプログラムを他人に使わせるなんて当然迷惑だ。
269:デフォルトの名無しさん
07/08/22 22:15:12
>>268
何をそんなに興奮してるんですか?
270:デフォルトの名無しさん
07/08/22 22:16:24
自分も意見が言える話題になって嬉しいんだよ
271:デフォルトの名無しさん
07/08/22 22:26:26
こんなの拾った
167 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/21(火) 10:24:11
>>145
どこが
> 読みやすさを損なう
のかさっぱり。やっぱ、主観的なことしかいえないだろ?
だからやめろつってんのにw
コンパイルが通ればどっちでも良いんだよ。
むしろ必要性について知らない方がダメ
272:デフォルトの名無しさん
07/08/22 22:29:37
拾うな
捨てとけ
273:デフォルトの名無しさん
07/08/22 22:33:11
#define mygets(s) fgets((s), sizeof (s), stdin)
sが配列型でなかったら死亡。
C++ならもっと頑張れるが、std::string使えという罠。
274:デフォルトの名無しさん
07/08/22 22:38:26
>>167
> むしろ必要性について知らない方がダメ
もっともらしい理屈がいくつが挙がってるけど、そのスタイルを採用してないプロダクツでも
世間で評価されてるような実績をあげてるってことは、それらは机上の空論ってことだろ。
センスも見識もない人間が頭の中だけで考えたスタイルなんて、そういうことになりがち。
と遅レスしてみる。
275:デフォルトの名無しさん
07/08/22 22:50:02
個人的な主観や特定の条件を述べられても結論が出ないんで、話を根本に戻すと
>>221 の質問は
> ではどういう風にすればいいのでしょうか
これに対して十分な領域を確保しとけってのは不適切。
なぜなら、確保した領域を 超えて受け付けることが出来る仕様 になっている以上
getsを使ってたら対処にならないんだよ。
その問題点の解決の対処をすることが >>221 に対して適切な回答になる。
getsに問題があるけど、問題が起こらないように使いましょうって
だからgetsを使うからセキュリティーホールなるものが出来てんだろって報告も無視するし。
276:デフォルトの名無しさん
07/08/22 22:52:05
堂々巡りいいよ堂々巡り
277:デフォルトの名無しさん
07/08/22 22:52:07
>>274
お前のバカじゃね?理解してなさすぎ。個人的な主観による 読みやすさ っていう基準が
無意味だって話だろ。自分が思う通りに処理が出来るソースがコンパイルに通れば
どういうスタンスやスタイルをとろうが自由だろ。あんたの言う世間で評価って言うのは
括弧を付ける付けないが評価の対象じゃないだろ?アホ杉・・・
278:デフォルトの名無しさん
07/08/22 22:53:43
そんな危険な関数が何で備わっているんですか?
279:デフォルトの名無しさん
07/08/22 22:54:22
>>274
んじゃ世間で評価されるプログラムのソースに1文のみで括弧が必要ない部分にも
括弧があったらどーすんだよ?くだらねぇ
280:デフォルトの名無しさん
07/08/22 22:54:22
それはもちろん使って欲しいから
281:デフォルトの名無しさん
07/08/22 22:56:14
>>277
だから「必要性」ってなんの話だよ。
それに理解できてないのはおまえのほうだろ。
括弧つけてるつけてないが評価されてるなんてどこにかいてる?
282:デフォルトの名無しさん
07/08/22 22:59:28
>>279
だから、上のほうで挙がってる括弧のをつける理由ってのは机上の空論ってことだよ。
283:デフォルトの名無しさん
07/08/22 23:14:49
×煽り合いスレ
284:デフォルトの名無しさん
07/08/23 07:56:31
読んでてふと疑問に思ったんだけど、
今時捨てプログラム以外でCUIで書くことってあるの?
getsなんぞそもそも使う場面が思いつかない
285:デフォルトの名無しさん
07/08/23 08:02:28
>>284
君はサーバプログラムを知らないようだ。
他にもシェル上から使えるちょっとしたフィルタプログラムは便利だ。
まあ君には必要のないことなのかもしれないがな。
286:デフォルトの名無しさん
07/08/23 09:39:29
>シェル上から使えるちょっとしたフィルタプログラム
はスクリプトで書くからなー
287:286
07/08/23 09:40:16
あ、でもオレもCUIでCのプログラムは結構書くよ
288:デフォルトの名無しさん
07/08/23 09:50:46
CUIエディタ使ってる奴なんかいないと思ってた…
289:デフォルトの名無しさん
07/08/23 09:53:35
最近はGUIの定義が変わってきているから
vi みたいなスクリーンエディタもCUIエディタと呼ぶのかも
290:デフォルトの名無しさん
07/08/23 09:53:51
vi 使うべ。
291:デフォルトの名無しさん
07/08/23 09:55:06
まあ揚げ足はともかく、ApacheやRubyのモジュールをCで書いたりするしな。
292:デフォルト名無しさん
07/08/23 11:15:37
CMAGAZINEのガイドに従ってBorland C++ Compiler 5.5.1の「コンパイルの
実行手順」まで来ました。Hello, World!というソースプログラムを用例通り
に作ってc:\に「cppprog」フォルダを作成しました。
コマンドプロンプトの\system32\cmd.exeの画面で
C:\Documents and Settings>の後にcd \cppprogを入力しenterキーを押すと
「指定されたパスが見つかりません。」と表示されます。なぜか教えてください。
保存の状態は、C:→Documents and Settings → 大野→ My Documents →
cppprogフォルダです。 よろしくお願いします。
293:デフォルトの名無しさん
07/08/23 11:31:47
cd "C:\Documents and Settings\大野\My Documents\cppprog"
294:デフォルトの名無しさん
07/08/23 11:32:42
ユーザーアカウント名?Oh no!
295:デフォルトの名無しさん
07/08/23 11:51:34
cd \cppprog
だと、
C:\cppprog
になる
cd cppprog
なら、現在の場所からの相対位置になる
296:デフォルトの名無しさん
07/08/23 12:02:09
C言語についてじゃないな、却下。
297:デフォルトの名無しさん
07/08/23 12:10:49
最近この手のプログラミング以前の質問多いよな
298:デフォルト名無しさん
07/08/23 12:14:18
>293, 204, 295ありがとう。
漢字を打ち込む方法を教えてください。
299:デフォルトの名無しさん
07/08/23 12:18:02
>>298
ショートカットの作業フォルダに指定するべし
300:デフォルトの名無しさん
07/08/23 12:19:07
>>298
Alt+半角/全角
301:デフォルトの名無しさん
07/08/23 12:33:59
まあ漢字めんどうならTABキー連打で
302:デフォルト名無しさん
07/08/23 13:06:34
>301 TABキーで
C:\Documents and Settings\All Users>まで進みました。
この後ろへcd \My Documentsを入力しエンターキーを押すと、
「指定されたパスが見つかりません。」が出ました。
対策を教えてください。
303:デフォルトの名無しさん
07/08/23 13:24:33
>>302
>>295
304:デフォルトの名無しさん
07/08/23 13:25:06
サーバやモジュールはgetsを使える場面があるのか…
標準入力もまだまだ捨てたものじゃないってことだな
やったことないから勉強になった
305:デフォルト名無しさん
07/08/23 13:34:04
>303
Documents and Settings\All Users>cd cppprogでエンターキーでも
「指定されたパスは見つかりません。」が出ます。
306:デフォルトの名無しさん
07/08/23 13:39:53
All Usersじゃなくて、自分のログインネームで
一個上に行くのは、 cd .. な
307:デフォルトの名無しさん
07/08/23 13:48:19
コマンドライン初めてなら、それなりのとこ見ながらやったほうがいいよ
そこからコンパイルまでいくのは大変だし、ここはスレ違いになるから
みんな相手してられなくなるぞ
308:デフォルトの名無しさん
07/08/23 13:51:00
ルート直下でやればいいじゃん
309:デフォルト名無しさん
07/08/23 14:04:48
>306 当たり前ですが、Borlandに対するログインネームでしょうね。
「一個上に行く」というのは,>cd ○○○○(ログインネーム)と
置くことを指しているのでしょうね。
310:デフォルトの名無しさん
07/08/23 14:10:13
>>309
これ見て勉強して
URLリンク(ykr414.com)
311:デフォルトの名無しさん
07/08/23 14:29:10
OS :Borland
312:311
07/08/23 14:31:45
ちょっと質問なんですけど、たとえば
key=value という文字列をsscanfをつかって'='で分解したいんですが
char text[256] = "key=value";
char *key,*value;
sscanf(text,"%s=%s",key,value);
という感じで打ってもできませんでした。だれかご教授おねがいします
313:デフォルトの名無しさん
07/08/23 14:34:45
BorlandっていうOSは知らないなぁ
314:デフォルトの名無しさん
07/08/23 14:46:44
だーかーらー
カレントディレクトリが C:\Documents and Settings\All Users なんだったら、
その状態で cd cppprog ってやったら
C:\Documents and Settings\All Users\cppprog
へ移動することになるし、cd 大野 ってやったら
C:\Documents and Settings\All Users\大野
へ移動することになる。もちろんそんなディレクトリは存在しないから、エラーが出るわな。
君が移動したいのは C:\Documents and Settings\大野\My Documents\cppprog だろ?
だったら1つ上のディレクトリ(つまり C:\Documents and Settings)に戻ってから、
大野 → My Documents → cppprog へと移動すればいい。
具体的には
cd ..
cd 大野
cd "My Documents"
cd cppprog
と順に移動していけばいい。
だいたいなんでCマガの書いてあるようにやらないんだよ。
315:デフォルトの名無しさん
07/08/23 14:46:59
>>312
strtokでも使え
316:デフォルトの名無しさん
07/08/23 14:49:51
>>312
OSはおいといて、key と value の領域確保の問題が一つ。
もう一つは、keyが"="まで読み込んでしまうこと。
"%[^=]=%s"とかでどうか
317:デフォルト名無しさん
07/08/23 15:40:26
>314 問題は、漢字のフォルダ名をコマンドプロンプトへ
打ち込めないことです。フォルダ名をローマ字に変えようと
してもできません。よろしく。
318:デフォルトの名無しさん
07/08/23 15:46:12
>>317
コンパイラ起動できるようになるまで、Win板で聞いたら?
とりあえず>>300-301
ちなみに、
C:\Documents and Settings\大野\My Documents
は、エクスプローラーの「マイ ドキュメント」のことだって知ってたか?
319:デフォルトの名無しさん
07/08/23 15:57:57
せっかく答えてもらったのに礼は言わない、
それどころかレスをまともに読んですらいない、
救いようがないなこりゃ
320:デフォルトの名無しさん
07/08/23 15:59:00
さすがに釣りだろwww
321:デフォルトの名無しさん
07/08/23 16:05:44
おじゃまします。質問です。
typedef struct{
char a[2];
char b[3];
char c[4];
}AA;
typedef struct{
char e[16];
}BB;
AA aa;
BB bb;
…こんなんで、aaに代入された値をbbに一発で書き込んで、
しかもスペースで埋めてくれる関数とかありませんか?
VBからCに書き直してたら、LSetで一発だったので。。
322:デフォルトの名無しさん
07/08/23 16:13:02
関数使わんでもできるけど、一発(スペース埋めるなら2発か)でやるなら
memcpy() と memset() でどうか
323:デフォルト名無しさん
07/08/23 16:18:12
>319 ありがとうございました。cd 大野といわれても漢字をコマンド
プロンプトに打ち込めないみじめさ。嬉しさも中ぐらいなり、秋の風。
324:デフォルトの名無しさん
07/08/23 16:21:37
どうしても無理ならマウス使ってコピペ
右クリックかシステムメニューでできる
325:デフォルトの名無しさん
07/08/23 16:31:15
Alt+半角/全角 で入力できるぜ
326:321
07/08/23 16:35:43
>322
できました。ありがとうございます!
327:デフォルトの名無しさん
07/08/23 16:49:57
>>322,326
構造体のパディングは大丈夫なのか?
文字列の連結ではないのか?
いやできたならいいんだけど。
328:デフォルトの名無しさん
07/08/23 17:09:58
同じ型が続いてるなら多分パディングはないんじゃないかなあ。
329:デフォルトの名無しさん
07/08/23 17:13:26
パディングはcharが並んでるだけだったからあえて書かなかったが
LSetの仕様を考慮しないとね。どっちにしても一発は厳しい
330:デフォルトの名無しさん
07/08/23 19:09:03
char *func_b( char *str, char ch )
{
char *p;
for( p = str; *p != '\0'; p++ )
if( *p == ch ) return p;
return 0;
}
これと同等の処理を行う標準ライブラリ関数を教えてください お願いします
331:デフォルトの名無しさん
07/08/23 19:18:28
strchr?
332:デフォルトの名無しさん
07/08/23 19:18:52
strchrかな
333:デフォルト名無しさん
07/08/23 20:06:37
Borland
334:デフォルトの名無しさん
07/08/23 20:23:42
>>331-333
ありがとうございます
strcharだと
char *func_b( char *str, char ch )
じゃなくて
char *func_b( char *str, int c)
になるんじゃないかと迷ってました
335:デフォルト名無しさん
07/08/23 20:26:41
プログラム実行できました。今日中にできるとは思いませんでした。
Borland C++ Compiler のつぎはTurbo Debuggerです。
ありがとう!ありがとう! >293,294,295,314,318,
325さんAlt + 半角/全角や漢字のコピペが可能だとは驚きでした。
まだいろいろ教えていただくこともあろうと思います。
336:デフォルトの名無しさん
07/08/23 20:26:46
>>321
memset(&bb, ' ', sizeof(bb));
bb = aa;
これでいいような気がするんだが、
構造体の要素って順番に並んでるとは規定されてないけどね。
337:デフォルトの名無しさん
07/08/23 20:29:48
>>334
char *strchr (const char *s, int c) だよ
338:312
07/08/23 20:38:42
レス遅くなってすいません。
>>316の[^=]を使う方法を試したのですがうまくできなかったです。。。
strtokを使うしかないって事ですかね
339:デフォルトの名無しさん
07/08/23 20:39:29
URLリンク(www.bohyoh.com)
340:デフォルトの名無しさん
07/08/23 20:40:21
>>336
>構造体の要素って順番に並んでるとは規定されてないけどね。
またいい加減なことを…ここは入門者が答えるスレ?
341:デフォルトの名無しさん
07/08/23 20:41:54
>>336
だからgets肯定派のダンディ坂野は回答しなくて良いよって言っただろ?
ったく、これだから夏厨は・・・
342:デフォルトの名無しさん
07/08/23 21:18:41
>bb = aa;
343:デフォルトの名無しさん
07/08/23 21:30:38
>>336
規定されてるよ
344:336
07/08/23 22:11:17
>>340
>>336
お、ずっと勘違いしてた。やべ
ははははh
345:デフォルトの名無しさん
07/08/23 22:29:21
パディングが挟まってる可能性はあるが、順番はそのまま。
346:デフォルトの名無しさん
07/08/23 23:08:32
全くの初心者です。質問ですが、
#include <stdio.h>
main()
{
printf("Hello World\n");
}
を、Cygwinでコンパイルしたいのですが、うまくいきません。
何故でしょうか。
347:デフォルトの名無しさん
07/08/23 23:10:40
エラーメッセージを読め
348:デフォルトの名無しさん
07/08/23 23:30:46
gcc インストールし忘れているに 100 ガバス
349:デフォルトの名無しさん
07/08/24 10:08:44
>>338
どううまくできなかったのか。
ちゃんと
*key は key[128]
*value は value[128]
とかにしたか?
350:デフォルトの名無しさん
07/08/24 17:50:23
ヘッダーファイルについて質問なのですが、自作ヘッダーにsleepという関数を
作るとします。実際この関数を使おうと#includeしようとしたら同じく#includeした
time.hライブラリーにも同じ関数がある事に気づきました。
同じ名前の関数がある場合、関数の使用優先度って何で決まるんですか?
351:デフォルトの名無しさん
07/08/24 17:52:15
>>350
多分リンクした順だけど、普通はリンク時にエラーがでると思うよ
352:デフォルトの名無しさん
07/08/24 17:56:37
先にldが見つけたほうではないかな?
ふつうは自作の関数の名前を変えると思うんだが
353:デフォルトの名無しさん
07/08/24 17:57:20
そうなんですか。eclipse,CDTで開発してるんですが、予想通りでした。
ありがとうございました。
354:デフォルトの名無しさん
07/08/25 00:37:04
>>351
エラーは出ないんじゃないかな。
関数の戻り値なり引数なりの型が違うなら、
コンパイル時にエラーになると思う。
警告かも知れない。
355:デフォルトの名無しさん
07/08/25 01:27:57
Japan 1 0 2
Spain 2 0 1
Egypt 1 2 0
のように入力して、数字を左から 3点 0点 1点分と数えて点数の高い順に並べ
Spain, 7
Japan, 5
Egypt, 3
のように出力したい場合二次元配列使うと思うんだけど、データの型はどうすればいい?
全部intで出力のときだけ %s,%d で合ってますか?
356:デフォルトの名無しさん
07/08/25 01:44:14
>>355
おれだったら、構造体の一次元配列で処理する。
357:デフォルトの名無しさん
07/08/25 11:58:03
struct hoge
{
char name[1024];
int mark;
}
358:デフォルトの名無しさん
07/08/25 12:24:47
生のデータを持つために、
struct {
char name[1024];
int mark[3];
}
359:デフォルトの名無しさん
07/08/25 17:58:54
a = (struct A *)buf;
b = (struct B *)buf+20;
Bの構造体にbufの20バイト後から取り出したいんだけど
この記述はできない?
360:デフォルトの名無しさん
07/08/25 18:07:15
>>359 の記述のままでもおk
でも、>>359 は何か根本的なことが分かっていない気がする
361:デフォルトの名無しさん
07/08/25 18:07:53
>>359
bufがchar *などであるなら、
struct B b=*(struct B*)(buf+20)
362:デフォルトの名無しさん
07/08/25 18:09:37
>>360
すっとこどっこい。
363:デフォルトの名無しさん
07/08/25 18:17:56
offsetとか使いたいのではないのかなあ
364:359
07/08/25 22:23:25
一応できた.
でもあんまり理解してないorz
365:デフォルトの名無しさん
07/08/26 00:57:24
システムコールってC言語ですか?
366:デフォルトの名無しさん
07/08/26 07:15:28
共用体(union)の中で構造体使うと
うまく領域を確保できなくてデータが変になる現象が起きてます。
今は使わない文字配列を共用体の中に書いて
無理やり余裕を持たせて領域確保してるんですが
共用体で使うメモリ領域をうまく確保する方法はありますか?
ちなみに環境はVineLinux4.1でgcc3.3.6コンパイラ使ってます。
367:デフォルトの名無しさん
07/08/26 07:24:22
うまくいかないソースと現象の詳細を示せ
368:366
07/08/26 08:00:38
説明しにくいんですけど
2Dのrobocup用ライブラリlibsclientをいじってて
http://www.koders.com/c/fidD6E7EBDD071F6F9579D1CAF12EF2FC434F5F7074.aspx
292~295行目
typedef struct _Ppos {
WhichTeam team ; // enum(WhichTeam=int)
int unum ;
} PlayerInfo ;
に「int type;」というのを追加してライブラリとプレイヤーを再コンパイルして
実際にサーバーに接続してみたら動作が明らかに変になるんです。
312~317行目
union {
PlayerInfo player ;// 292~295行目の構造体
Side side ; // enum(Side=int)
FlagPos fpos ; // enum(FlagPos=int)
LinePos lpos ; // enum(LinePos=int)
} id ;
ここに「char hoge[30];」を追加すると問題なく動作するようになるんで
共用体で構造体の大きさの領域が確保できてないという結論に至ったわけです。
369:デフォルトの名無しさん
07/08/26 11:14:49
結論に至る前に sizeof で大きさを調べてみろ
370:デフォルトの名無しさん
07/08/26 13:08:10
make cleanしてないんじゃねーの?
371:デフォルトの名無しさん
07/08/26 13:27:06
>>365
システムコールはC言語でもサポートされていますが
システムコールはC言語ではありません
372:366
07/08/26 13:49:54
>>370
それでしたorz
ライブラリとプレイヤ自体はmake cleanしてたんですが
ライブラリを読み込んでるプレイヤ共通の関数をまとめたやつをし忘れてました。
>>367,>>369,>>370こんな僕にレスしてくれてありがと
373:デフォルトの名無しさん
07/08/26 21:34:06
相談なんですが,ファイルに以下のように保存されていて,
a[1]=AAA
a[2]=BBB
a[4]=DDD
これを以下のように新規で追加,削除,変更などしたい場合,
a[1]=AAA
a[2]=ABC
a[3]=DEF
一回全部読み込んでbufなどに保存し,それから一気に全部ファイルへ書き込む方法が
あると思いますが,それ以外に方法ありますか?
374:デフォルトの名無しさん
07/08/26 21:43:43
>>373
固定長レコードもファイルならfseekで該当レコードのところにファイルポインタを
位置決めしてfwriteでレコードを上書き。
375:デフォルトの名無しさん
07/08/26 21:53:28
>>373
データをファイルの最後尾に書き込みして
読み込み時、重複する場合は「もっとも後ろにあるデータ」を有効とするとか
たとえば
a[1]=AAA
a[2]=BBB
a[4]=DDD
↓
a[1]=AAA
a[2]=BBB
a[4]=DDD
a[3]=DEF
a[2]=ABC
a[4]=
読み込み時にデータ(a[2]=BBB)をデータ(a[2]=ABC)で上書きする感じ
a[3] は新規追加、a[2]は変更、a[4]は値なしなので削除
376:デフォルトの名無しさん
07/08/26 22:01:50
>>374
その標準関数を使ったことないんで調べてみます
>>375
その方法も考えたんですが,何回も書き込みを行うとデータが多くなり
読み込むのに時間がかかりそうなんで,有効データだけ残す方法をとりたいですね
お二人様サンクスです!検討してみます
377:デフォルトの名無しさん
07/08/27 17:11:43
超初心者ですみません。
2の0乗+2の1乗+2の2乗+2の3乗+2の4乗+・・・
というプログラムはどのようにしたらよいのでしょうか?
いろいろ調べてかいてみたのですができませんでした><
どなたかアドバイスお願いしますm(__)m
378:デフォルトの名無しさん
07/08/27 17:19:53
1 + 2 + 2 * 2 + 2 * 2 * 2 + 2 * 2 * 2 * 2 + ...
379:デフォルトの名無しさん
07/08/27 17:40:04
for(n=1, sum=0;;n*=2) sum+=n;
380:デフォルトの名無しさん
07/08/27 17:47:15
>>377
しょぼくて申し訳ないが、
int hoge(int count){
int result = 1;
if(count <= 0)
return 1;
for(int i=1;i<count;i++){
result += 2*i;
}
return result + hoge(count-1);
}
381:デフォルトの名無しさん
07/08/27 18:12:29
二進法で結果を出力するプログラムならこれでいいよ。
#include <stdio.h>
int main(void)
{
for (;;)
putchar('1');
}
382:デフォルトの名無しさん
07/08/27 18:14:02
// ウンコード
int func(size_t n) {
int ret = 1;
size_t i;
for (i = 1; i < n+1; ++i)
ret += 1<<i;
return ret;
}
383:デフォルトの名無しさん
07/08/27 18:15:40
ウンコードなんて、クソースのパクリみたいだな、¢50徴収するぞ?
384:デフォルトの名無しさん
07/08/27 19:00:13
>>377
pow(2, n+1) - 1
385:デフォルトの名無しさん
07/08/27 19:40:33
>>377
~(~0<<n)
386:デフォルトの名無しさん
07/08/27 20:01:40
ビット演算凄いです^o^
387:デフォルトの名無しさん
07/08/27 21:15:03
Javaで言うところの「equals」ってC言語だと何ですか?
388:デフォルトの名無しさん
07/08/27 21:17:00
Javaの何のクラスのequals?
389:デフォルトの名無しさん
07/08/27 21:17:59
>>387
==
390:デフォルトの名無しさん
07/08/27 21:18:36
>>387
C言語には対応するものはないかな?
C++なら、状況応じて==をequals風に定義しなおすことになる。文字列とか。
Javaのように==とequalsを明確に区別することはできない。
391:デフォルトの名無しさん
07/08/27 21:25:34
Stringクラスのequalsならstrcmp関数だろ
あくまで、文字列比較という意味でね
もっとも、equalsメソッドはオブジェクトのデータの比較だから
そういう意味なら、オブジェクト指向でないCにはそれに該当するものはない
392:デフォルトの名無しさん
07/08/27 21:31:41
memcmp (^^;
393:デフォルトの名無しさん
07/08/27 22:11:53
Cの場合、
構造体だと、専用の比較関数作らなきゃならんね。
394:デフォルトの名無しさん
07/08/27 22:18:11
Object.equalsだったら、ポインタに対する==演算子が最も当てはまる存在だな。
395:デフォルトの名無しさん
07/08/27 22:27:05
387です
失礼しました、説明が足りなかったようで・・・
Javaでは、([変数].equals("○○○")) と書くところを
C言語だとどのように書くのかという意味です
396:デフォルトの名無しさん
07/08/27 22:31:16
>>395
何も読んでないのか?
クラスによってequalsの挙動は違うだろうが。
397:デフォルトの名無しさん
07/08/27 22:31:47
>>395
[変数]の型は何?
派生クラスでオーバーライドできるから、
クラスによって挙動が違い、Cで対応するものも異なる。
なお、Stringなら>>391。
398:デフォルトの名無しさん
07/08/27 22:48:56
ファイルのプロパティの概要で表示されるタイトルに
そのファイルの拡張子を除いたファイル名を設定するプログラムを作成したいのですが
どのようにすればタイトルに書き込めるのでしょうか?
399:デフォルトの名無しさん
07/08/27 22:53:24
>>395
if (strcmp(変数, "○○○”) == 0) ・・・
400:デフォルトの名無しさん
07/08/27 22:55:30
>>398
プロパティ窓を取得、拡張子まで削ってSetWindowText
401:398
07/08/27 23:11:00
>>400
プロパティ窓はどのようにして取得するのでしょうか?
402:デフォルトの名無しさん
07/08/27 23:17:33
>>398
IPropertyStorageでググればいろいろ見付かる。
ただし、Cでやるのは面倒。少なくともC++は欲しい。
なお、この情報は、NTFSの副次ストリームに保管される。
あるいは、OLE構造化ストレージ(2003までWord/Excelファイルなど)なら
ファイル自身に保管される(このため構造化ストレージならNTFSでなくても可能)。
403:398
07/08/27 23:20:09
>>402
Cでは厳しいですか・・
調べてみます
ありがとうございました
404:デフォルトの名無しさん
07/08/28 22:01:37
t
405:デフォルトの名無しさん
07/08/29 03:30:57
>>404
ありがとうございました
406:デフォルトの名無しさん
07/08/29 11:41:07
377です。
みなさんありがとうございます><
407:デフォルトの名無しさん
07/08/29 20:34:19
* 引数 :char *data : 追加したい文字列
* : int index : 追加したい位置
* : element *new_data : 新しく追加するリスト
* 戻り値:成功1,失敗-1
*/
int add_data(char *data, int index, ELEMENT *new_data){
ELEMENT *tmp;
int cnt = 0;
if(data == NULL || index < 0 || index > element_cnt || new_data == NULL){
return -1;
}
new_data->data = data;
/* インデックスの位置の直前に移動 */
for(tmp = head;cnt != index;cnt++,tmp = tmp->next);
new_data->next = tmp->next;
tmp->next = new_data;
printf("help\n");
return 1;
}
こんな感じでリスト構造にデータを入れる関数を作ったんですが、
Borlandでは正しく動くのにVisual Studioでは呼び出しもとに返らず終了してしまいます
helpというプリント文は表示されます。どなたか、解決策を教えてもらえませんか?
↓がリストの構造体です
typedef struct element {
char *data;
struct element *next;
} ELEMENT;
408:デフォルトの名無しさん
07/08/29 21:11:45
>>407
そのソースだけだとわかんないなぁ
引数の「char *data」はその都度領域確保されているの?
それから「element_cnt」って要素数だよね?いつインクリメントしてる?
409:デフォルトの名無しさん
07/08/29 21:14:25
>>407
デバッガでも使って確かめろ位しか
410:デフォルトの名無しさん
07/08/29 21:20:40
>>408
そうですよね。>>409さんのデバッガを調べてみます
「char *data」はただダブルコーテーションで文字列を渡すだけしてます
「element_cnt」については処理を書き込み忘れました
411:408
07/08/29 21:31:46
>>407
それから追加するインデックスを0にした場合は
実際に追加されるのはインデックス1の場所にならない?
0の場合headを書き換えないとおかしくなるんじゃない?
まぁあと/* インデックスの位置の直前に移動 */ といっているけど
cnt!=index ってことはindex の位置で止まる
で
>new_data->next = tmp->next;
index+1の要素を新要素の次の要素にする
>tmp->next = new_data;
indexの次の要素を新要素にする
結局追加される場所はindex+1の場所にならない?
412:407
07/08/29 21:50:13
>>411
すいません!書き忘れてましたけど、headはstatic変数で今回ダミーとして扱います
ちなみにheadはhead->next = NULLで初期化してあります。
for文の初期化でtmp = head;とあるので、head->nextでダミーではない値をもつリストに入るときにはcntは1になっています
なのでcnt == indexはひとつ前になるんじゃないかな~と考えてます。間違えてたらすいません
413:408
07/08/29 21:54:23
>>412
つまり head->next が最初の要素ってことですね
なら納得です
だとすると、やはりこのソースからだと分かりませんね
私はここまでです
414:407
07/08/29 22:11:13
>>413
そうですか、ありがとうございました。
原因はこれだけのソースではわからないと思うので、ななし.orgに全部のソースをアップしました
見てくれるなら見てほしいです。んでVisualStudioで実行してほしいです
まだ途中なんでできたらツッコミとかよろしくおねがいします
415:408
07/08/29 22:33:26
>>414
そういうときはURLも貼ってくれないと
ななし.orgってどこですか?
416:407
07/08/29 22:43:24
すいません。。ここです
URLリンク(77c.org)
417:408
07/08/29 23:02:01
>>416
まずここかな
void init_list(void){
ELEMENT top;
head = ⊤
element_cnt = 0;
head->next = NULL;printf("\(^o^)/");
}
ELEMENT top; は関数のローカル変数
head = ⊤
top の実体は関数抜けたら無効になる
にも関わらず 関数外でhead(top) にアクセスしてる
418:407
07/08/29 23:12:46
>>417
ああ~!そうですねw普通におかしいですね
419:408
07/08/29 23:16:02
>>418
一応こちらの環境(BCC5.5)では>>417を改善することで動作はします
(もう少し動作チェックしてみますが)
それから余談ですが、ポインタ配列使うなら ELEMENT next いらないんじゃないですか?
せっかくポインタ繋ぎしてるんですから add_data() 内で new_data=(ELEMENT *)malloc(sizeof(ELEMENT)) してみては?
いまは動作チェックが目的でこうしているというならゴメンナサイね
それから最後にfree()も忘れずに
420:407
07/08/29 23:24:18
改善しました!>>408さん、ありがとうございました!
関数内でmallocはしなくて良い、と言う問題だったので、main側で確保したんです。
自分も関数内で確保した方がいいと思うのですが・・・
421:408
07/08/29 23:52:07
>>420
そういうことですか
分かりました
それらが題意であるならしょうがないですね
余計なことかもしれませんが、
remove_element() は要素を削除するんですよね?
この方法(配列上で行う連結リスト)だと要素を削除した後、その後追加する際に、
空いている要素と空いていない(使われている)要素の区別がつかないので
その点も考慮していく方がよろしいかと思います
422:421
07/08/29 23:53:29
#include <stdio.h>
main()
{
static int a[5]={15,8,48,50,27}
int sum,heikin,i;
sum=0;
for(i=0;i<5;i++){
sum=sum+a[i];
}
heikin=sum/5;
printf("goukei=%d\n",sum);
printf("heikin=%d\n",heikin);
}
これにあと配列中の奇数と偶数の数を出力するのを追加したいんですが
どうすればいいんでしょうか?
423:407
07/08/30 00:02:53
>>421
確かにそうですね。mainの考慮をしてみます!
424:408
07/08/30 00:05:50
>>422
こんなんでどうですか?
配列中の値を2で割ってあまりが出るかでないかで奇数、偶数を判断
#include <stdio.h>
main()
{
static int a[5]={15,8,48,50,27}
int sum,heikin,i;
int kisu=0,gusu=0;
sum=0;
for(i=0;i<5;i++){
sum=sum+a[i];
if(a[i]%2) kisu++;
else gusu+++
}
heikin=sum/5;
printf("goukei=%d\n",sum);
printf("heikin=%d\n",heikin);
printf("奇数 %d個 / 偶数 %d個",kisu,gusu);
}
425:408
07/08/30 00:08:32
>>422
ところでなんで 421 なんですかね?
>printf("奇数 %d個 / 偶数 %d個",kisu,gusu);
改行忘れたので入れといてください
printf("奇数 %d個 / 偶数 %d個\n",kisu,gusu);
426:デフォルトの名無しさん
07/08/30 00:09:46
おまえも、関係ないなら名前の所の番号外せ
427:422
07/08/30 00:15:18
>>425
ありがとうございます。
名前はミスして書いてしまったようです。すいません^^;
428:デフォルトの名無しさん
07/08/30 00:26:43
怒られちった
429:デフォルトの名無しさん
07/08/30 21:19:36
質問です。
例えば、データの処理(検索など)を行いながら、
同時に秒単位で経過時間を標準出力するといったようなことってできますか?
できるのであれば教えていただきたいのですが。
430:デフォルトの名無しさん
07/08/30 21:44:54
>>429
検索のループ中に時間表示機能入れるなり、スレッド作るなり、signal使うなり
まぁ状況次第でなんなりとどーぞ。
431:デフォルトの名無しさん
07/08/30 23:14:55
奇数偶数なら
if(a[i] & 1)
//奇数
else
//偶数
では?
432:デフォルトの名無しさん
07/08/30 23:18:54
>>431
% 2 でなにか不都合なことがあるの?
433:デフォルトの名無しさん
07/08/30 23:22:31
>>431
負数が2の補数表現で無い環境の場合はうまくいかないんじゃない?
(そんな環境があるかどうかは知らないが…)
434:デフォルトの名無しさん
07/08/30 23:38:35
問題の中に負数がないからどっちでもいいよ
435:デフォルトの名無しさん
07/08/30 23:58:46
>>432
もちろん論理的な不都合はないです。
ただ除算は一般に非効率なので、高速化を狙った提案。ですが、、
>>433
たしかに、そうですね。
使用可能かどうかの確認は必要だと思います。
436:デフォルトの名無しさん
07/08/31 01:46:43
>>435
大丈夫、まともなコンパイラなら%2を割り算では実装しないから。
437:435
07/08/31 02:43:21
>>436
gcc -S で試したら、確かに論理命令が生成されてました。
しかもunsigned だと n % 1 と n & 1 は完全に同じコードに。
勉強になりました。流れ止めて失礼しました。
438:デフォルトの名無しさん
07/08/31 09:54:01
> n % 1 と n & 1 は完全に同じコードに
バグじゃね?
439:デフォルトの名無しさん
07/08/31 09:57:08
バグだな
440:デフォルトの名無しさん
07/08/31 10:08:56
n%2の間違いだろ、突っ込んでやるなよw
441:デフォルトの名無しさん
07/08/31 15:31:29
実数で計算した結果の小数点以下を切り捨ててて
整数のところだけを別の計算に使いたいのです。
どのようにすればできるのかでしょうか。
442:デフォルトの名無しさん
07/08/31 15:37:22
>>441
一度 int にキャストする (正数のときのみ)、あるいは floor()。
入門以前のレベル。本くらい買え。
443:デフォルトの名無しさん
07/08/31 15:40:06
472 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/31(金) 14:55:28
浮動小数点の小数点以下を簡単に取る方法ってないですか?
473 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/31(金) 15:13:39
f - floor(f)
444:デフォルトの名無しさん
07/08/31 18:40:31
文字列とfor文についての質問です。
--出力結果--
sample01.txt
sample02.txt
sample03.txt
sample04.txt
sample05.txt
------------
上のように出力し、かつそれぞれを格納したいのですが、
数字の部分に繰り返し文を使ってうまくやる方法がわかりません。
おしえてくらはい><
445:デフォルトの名無しさん
07/08/31 18:52:51
sprintf(fname, "sample%02d.txt", i);
446:デフォルトの名無しさん
07/08/31 19:08:26
あまりの入門レベルにワロタwww
447:デフォルトの名無しさん
07/08/31 19:17:16
入門篇だからいいんじゃね?
448:デフォルトの名無しさん
07/08/31 22:00:31
でも入門書くらい読めよ、てのが少なくない。
449:デフォルトの名無しさん
07/08/31 22:41:01
>>445
うまくいきそうです!ありがとうございました!!
450:デフォルトの名無しさん
07/09/01 00:38:58
>>429
できなくはないが、C言語入門の範疇じゃないな。
OS関連のプログラミングを勉強しないと無理。
451:デフォルトの名無しさん
07/09/01 01:05:03
>>444
char filename[5][100];
for (i = 0; i < 5; i++) {
sprintf(filename[i], "sample%02d.txt", i + 1);
printf("%s\n", filename[i]);
}
452:デフォルトの名無しさん
07/09/01 23:22:05
uintptr_t とかsize_t型ってなんなんですか
これもwindowsプログラミング特有の、#defineした型なんでしょうか?
453:デフォルトの名無しさん
07/09/01 23:23:29
#defineはしてないと思うよ^^
454:デフォルトの名無しさん
07/09/01 23:35:05
>>452
size_tは標準の型。
unsigned intとかunsigned longあたりのtypedef。
strlen()のリターン値とかで使われてる。
uintptr_tは知らんけど、
URLリンク(docs.sun.com)
これを見ると、導入が予定されてるのかな?
455:デフォルトの名無しさん
07/09/02 00:12:21
size_tは標準Cに入っている記憶域の大きさを表す型、
sizeof演算子の結果の型と定められている。
uintptr_tはC99から導入された<stdint.h>で宣言されている型の1つで、
ポインタをキャストしても表現を失わないと規定されている符号無し整数型。
VC++でも最近はuintptr_t/intptr_tだけ<stdlib.h>で宣言されている。
<stdint.h>ごと入れればいいものを。
Windowsプログラムなら、uintptr_tよりUINT_PTRのほうが良く見かけるな。
こっちはWindows APIの型とされているし、
VC++にuintptr_tが入るよりも前から存在していたから。
456:デフォルトの名無しさん
07/09/02 00:43:43
一週間ほど前にプログラミングをCから始めまして現在、
URLリンク(homepage3.nifty.com)
まで勉強しました。そこで、もっといいサイトがあるよ~
っていうのがあれば教えてくださいm(_ _)m
できれば書籍等も・・・・
教えて君で失礼しますた(´・ω・`)
457:452
07/09/02 00:48:08
>>453-455
ありがとうございます。
なるほど、typedefでしたか・・・・。
458:デフォルトの名無しさん
07/09/02 00:49:16
>>456
とりあえずこのサイト全部終わらせればいいんでない
459:デフォルトの名無しさん
07/09/02 01:12:37
Cで正規表現を自前で実装しようと思っていますが速度面で微妙
アセンブラのほうがいいですかね?
460:デフォルトの名無しさん
07/09/02 01:14:35
Cで速度でないなら、アセンブラでやっても大差ないと思う
461:デフォルトの名無しさん
07/09/02 01:14:41
>>459
アルゴリズムの問題だと思われ。
462:デフォルトの名無しさん
07/09/02 01:15:54
>>459
grepか何かのソース読んでみるのはどーか
463:デフォルトの名無しさん
07/09/02 01:23:43
なにの正規表現と比べて遅いと思ったのか分からないけど、
その比較した正規表現の処理系も、おそらくCで書かれてると思われ。
464:デフォルトの名無しさん
07/09/02 01:28:48
Cってメモリと文字列処理がだるいよな
465:デフォルトの名無しさん
07/09/02 01:35:56
何をいまさら
って初心者ですか
そうですね
466:デフォルトの名無しさん
07/09/02 05:17:20
>>456
俺としては、今はもう読むこと無いけど
「C言語入門本物志向が身に付く本」;入門
「ポインタ完全制覇」:ポインタ関連
「文字列操作+ファイル入出力完全制覇」:文字通りの内容
全部「科学技術評論社」
あとは、一応K&R。入門本じゃないけど。
まぁサイトでいえばwisdomsoftかな。
他にも色々あるけど。まぁ、がんばってね
それにつけても、俺が今のレベルまでどうやって勉強してきたのか
さっぱりわからん。学びはじめの頃は
[putchar()//一文字出力する関数]なんてコメントを書きながら
ソース書いてたな。
467:デフォルトの名無しさん
07/09/02 06:45:53
今更Cなんてやっても・・・
CでOSや組み込み系のドライバをサクサク書けるようになるには10年はかかる
やっと使えるなって感じた頃は全く需要がない恐れがある
468:デフォルトの名無しさん
07/09/02 07:10:17
>>467
10年もかからないよ
それに、C言語とOS、ドライバーは関係がない
469:デフォルトの名無しさん
07/09/02 07:12:09
ドライバをCで書くなんてえらい時代になったもんだな
ってアセンブラ厨の老人が沸いてくるよ
470:デフォルトの名無しさん
07/09/02 08:05:57
tuhsなんか読んでるとUnixはversion 6の時代(1974)にすでにデヴァイス
ドライヴァはCで書かれている。
むしろmkdirだのpasswdとかのユーザープログラムがアセンブラで書かれて
たりして笑える。
471:デフォルトの名無しさん
07/09/02 08:06:54
version 6じゃなくてversion 5だった
472:456
07/09/02 08:46:32
>>458,466
レス((ヾ(。・ω・)ノ☆゚+.ァリガトゥ
とりあえず今のサイト最後までがんばってみて、
終わったら466さんの紹介してくださった書籍
よんでみます^^
473:デフォルトの名無しさん
07/09/02 11:27:38
>>464
個人的には文字列操作はダルいけど、メモリ操作は楽。
474:デフォルトの名無しさん
07/09/02 13:44:29
>>469
C て高級アセンブラだよね
こんな言語で業務アプリ書くアホいないよな
って感じてた老人ならここにいますが...
475:デフォルトの名無しさん
07/09/02 14:22:06
>>468
あんたアフォですか?
OSを作成するためにCが作成されたのに・・・
476:デフォルトの名無しさん
07/09/02 14:26:53
もはや関係がないってことだろう
477:デフォルトの名無しさん
07/09/02 15:22:49
1000から9999までの4桁の数字で、各桁を足した数で自分を割りきれる数がいくつあるか調べるプログラムを作りました。
今回は1325という正しい答えを知っていたのでエラーに気づきましたが、答えがわからない場合はどんな風にデバッグしていますか?
478:デフォルトの名無しさん
07/09/02 15:26:44
全部出力して、検算する。
479:デフォルトの名無しさん
07/09/02 15:30:12
各桁の合計を求める部分、割り切れるかどうかを判定する部分、個数を数える部分を
それぞれ個別にテストしてみる。
480:デフォルトの名無しさん
07/09/02 15:34:28
別のアルゴリズムで解いてみる。
481:デフォルトの名無しさん
07/09/02 15:36:56
>>477
そのようなプログラムをCで書かなきゃいけないか?w
excelで十分だろ
482:デフォルトの名無しさん
07/09/02 15:40:25
答えを知ってるってことは課題かなんかだろう
それで>>477みたいな疑問を持ったんだからやる価値があったってことだろう
483:デフォルトの名無しさん
07/09/02 16:52:58
cat.cより抜粋
/* Buffer for line numbers.
An 11 digit counter may overflow within an hour on a P2/466,
an 18 digit counter needs about 1000y */
#define LINE_COUNTER_BUF_LEN 20
static char line_buf[LINE_COUNTER_BUF_LEN] =
{
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0',
'\t', '\0'
};
/* Position in `line_buf' where printing starts. This will not change
unless the number of lines is larger than 999999. */
static char *line_num_print = line_buf + LINE_COUNTER_BUF_LEN - 8;
/* Position of the first digit in `line_buf'. */
static char *line_num_start = line_buf + LINE_COUNTER_BUF_LEN - 3;
/* Position of the last digit in `line_buf'. */
static char *line_num_end = line_buf + LINE_COUNTER_BUF_LEN - 3;
484:デフォルトの名無しさん
07/09/02 16:55:36
>>483の続き
/* Compute the next line number. */
static void
next_line_num (void)
{
char *endp = line_num_end;
do
{
if ((*endp)++ < '9')
return;
*endp-- = '0';
}
while (endp >= line_num_start);
if (line_num_start > line_buf)
*--line_num_start = '1';
else
*line_buf = '>';
if (line_num_start < line_num_print)
line_num_print--;
}
Cの基本的なことを勉強して、cat.cのソースを読んでいますが
この行を計算する関数の処理が何が言いたいのかわかりません。
line_bufを参照しながらカウントしているように見えますが、いまひとつわかりません。
どなたかご教授お願いします。
485:デフォルトの名無しさん
07/09/02 17:16:14
URLリンク(www.google.co.jp)
>何が言いたいのかわかりません
何を聞きたいのかわかりません
486:デフォルトの名無しさん
07/09/02 17:37:21
行番号を表す文字列をポインタ使って変更してるんじゃない?
"399" → "400"みたいに。
487:468
07/09/02 18:25:16
>>475
OSを作成するためにCを勉強しているわけではないだろ
そう意味で関係ない
488:デフォルトの名無しさん
07/09/02 18:37:35
じゃぁ、なん為にやってるの?
文字列を逆順に表示したりするプログラムを書くためですか?hw
489:デフォルトの名無しさん
07/09/02 18:41:38
普通はアプリケーションを作成するためにC言語を勉強するんじゃない?
490:デフォルトの名無しさん
07/09/02 18:42:26
この先必要となる基礎としての勉強じゃないんですか?>>488
491:デフォルトの名無しさん
07/09/02 18:43:35
英語を習うときに、目的を持つかどうかの違い棚。
492:デフォルトの名無しさん
07/09/02 19:06:28
失礼します。
変数Aに一秒ごとに1を追加していくようにしたいのですが、どうしたらいいのでしょうか。
493:デフォルトの名無しさん
07/09/02 19:07:30
どうしてそんなことをする必要があるのかってところから考えたほうがいいよ。
494:デフォルトの名無しさん
07/09/02 19:09:41
>>493
いや、タイマーに使いたいのですが。
495:デフォルトの名無しさん
07/09/02 19:14:44
>>492
main()
{
int A = 0;
while (1) {
sleep(1);
A++;
}
}
496:デフォルトの名無しさん
07/09/02 19:16:24
>>492
つ time.h
使った事無いけど…orz
497:デフォルトの名無しさん
07/09/02 19:21:45
CでMMOのBOT作れるんでしょうか?
498:デフォルトの名無しさん
07/09/02 19:22:16
いいえ
499:デフォルトの名無しさん
07/09/02 19:29:53
タイマーの値が必要なときに、現在時刻を取得すればいいんじゃない?
時刻の取得の仕方は環境依存
500:デフォルトの名無しさん
07/09/02 19:35:31
>>495-496
ありがとうございます
試してきます
501:487
07/09/02 20:03:34
>>488
> 文字列を逆順に表示したりするプログラムを書くためですか?hw
なかなかよいポイントをついているね
プログラミングの本質はデータの加工と入出力
世の中のすべてのプログラムは「文字列を逆順に表示したりするプログラム」
データーベースのアプリだって通信モジュールだって高度な科学技術計算のプログラムだって
みーんな本質的には「文字列を逆順に表示したりするプログラム」だ
OSもね
502:デフォルトの名無しさん
07/09/03 05:33:18
もっと軽い言語がたくさんありますよ今は
503:デフォルトの名無しさん
07/09/03 20:21:34
例えば何?
504:デフォルトの名無しさん
07/09/03 23:10:59
おい、五輪実況(男)で看板とか名無しとかLRとか決めるからおちょくりに来いよ
ヒント:なんかVIPの同盟国とかほざいてるから
スレリンク(ootoko板)
505:デフォルトの名無しさん
07/09/04 16:12:59
>>503
スクリプト系の言語のことをいってんじゃないの?
506:デフォルトの名無しさん
07/09/04 16:17:54
スクリプト系はゲロ重だろ
507:デフォルトの名無しさん
07/09/04 18:12:15
int main(void)
{
do {
switch (getnum("番号を入力してください\n")) {
case 1:
question(1);
break;
}
} while (0);
return 0;
}
int getnum(const char *msg)
{
int n;
for (printf(msg); scanf("%d", &n) != 1;) {
while (getchar() != '\n');
}
return n;
}
ここで使われているgetnumがいまいち理解できません。
何をしてるいるのか教えてください。
508:デフォルトの名無しさん
07/09/04 18:18:44
printf(msg) は msg を表示
scanf("%d", &n) は数字を入力
!= 1 は scanf で数字が正しく入力されたか確認
while (getchar() != '\n'); は改行が来るまで入力を読み飛ばす
return n; は入力された数字を返す
これでおk?
509:507
07/09/04 18:40:35
>>508さん
よくわかりました。
ありがとうございます。
510:デフォルトの名無しさん
07/09/05 16:50:33
URLリンク(kansai2channeler.hp.infoseek.co.jp)
質問させてください。
+と-と|を使って升目を出力するプログラムです。
第一に40行目のところのコメントをはずすと最初のループはなぜ止まるのですか?
第二に40行目の部分のコメントをはずしたときに
47行目を切り取り、49行目の後に記述すると結果が変わるのはなぜですか?
いろいろ試すうちに2つ目の問題もでてきて分からなくなりました。
よろしくおねがいします。
511:デフォルトの名無しさん
07/09/05 16:54:42
意味がわからない変数名はやめろ
512:デフォルトの名無しさん
07/09/05 17:09:32
continueやめてbreakにすれば?
513:デフォルトの名無しさん
07/09/05 17:45:26
>>510
> 第二に40行目の部分のコメントをはずしたときに
> 47行目を切り取り、49行目の後に記述すると結果が変わるのはなぜですか?
コンパイラのバグだと思われる。
514:デフォルトの名無しさん
07/09/05 18:09:57
>>510
>>512も言っているけどswitch内のcontinueやめてbreakにするとこうなる
+---+
| |
+---+
| |
+---+
515:デフォルトの名無しさん
07/09/05 18:14:27
>>510
確認してないけどたぶんあれね
continueにしちゃっているから44行目からwhile()の式評価にとんじゃっているんだと思う
実際には47~49行目は実行されていない
本来は47行目に行かなきゃ行けないのでbreakにする
516:デフォルトの名無しさん
07/09/05 18:20:35
32行目を下のように変更するだけで動作が変わるから、バグでしょ
while (d < e){
↓
while (d < e){printf("");
517:デフォルトの名無しさん
07/09/05 18:26:23
gcc は期待したとおりの動作になったが
bcc だと >>516 の変更前後で出力内容が変化した
変更前
+---+
変更後
+---+
| |
+---+
| |
+---+
518:デフォルトの名無しさん
07/09/05 18:28:46
あっwhile (d < e)があったの気づかんかった
とりあえず>>515は忘れて
>>514は目的の動作が分からんので保留かな
519:510
07/09/05 18:42:26
皆さん見ていただきありがとうございました。
continueで戻ることばかり考えていてbreakを忘れていました、
while文の中にあるのでcontinueを使わずとも繰り返しになるのですね、
whileとbreakとcontinueの使い方を再確認します。
変数名も以後気をつけます。
コンパイラのバグということで
他のコンパイラを試してみようと思っていたのですが
>>517さん試していただきありがとうございました。