C言語なら俺に聞け(入門篇) Part 18at TECH
C言語なら俺に聞け(入門篇) Part 18 - 暇つぶし2ch2:デフォルトの名無しさん
07/08/16 06:40:23
Part 1 スレリンク(tech板)
Part 2 スレリンク(tech板)
Part 3 スレリンク(tech板)
Part 4 スレリンク(tech板)
Part 5 スレリンク(tech板)
Part 6 スレリンク(tech板)
Part 7 スレリンク(tech板)
Part 8 スレリンク(tech板)
Part 9 スレリンク(tech板)
Part 10 スレリンク(tech板)
Part 11 スレリンク(tech板)
Part 12 スレリンク(tech板)
Part 13 スレリンク(tech板)
Part 14 スレリンク(tech板)
Part 15 スレリンク(tech板)
Part 16 スレリンク(tech板)

3:デフォルトの名無しさん
07/08/16 06:41:08
3ゲト 1乙です

4:デフォルトの名無しさん
07/08/16 06:42:58
 〇∧〃 初心者からの質問?
 / >  でもそんなの関係ねぇ!
 < \  そんなの関係ねぇ!

  〇/ はい!
 /|    オッパッピー!!
 />

URLリンク(ja.wikipedia.org)
> 元々「オッパッピー」は卑猥な言葉の略語だったらしいが、他の芸人にダメ出しを受けて
> 「オーシャンパシフィックピース」に変更した。

5:997
07/08/16 06:43:47
すみません、名前変えるのわすれてました、前スレの997です
前スレの>>998さん返答ありがとうございます。その書き込み不可属性というのは
どうやったら解除できるんでしょうか?

6:デフォルトの名無しさん
07/08/16 06:46:19
>>5
ファイルを右クリックしてプロパティを開く
Windowsなら読み取り専用ってチェックボックスのがある

7:デフォルトの名無しさん
07/08/16 07:13:18
Cでリストとかキューとかの汎用ライブラリをガツガツ使いたかったら
C++使えってことですよね?
自分で書いても良いですけど効率悪いので...
皆さんはどうされてます?自分で全部かいてます?

8:デフォルトの名無しさん
07/08/16 07:14:28
C++使う

9:デフォルトの名無しさん
07/08/16 08:17:50
テンプレートがないと辛いね。
マクロでも実装はできるけど、エレガントとは言いがたい。

10:デフォルトの名無しさん
07/08/16 08:37:31
>>9
Linuxでデバイスドライバかいてると
マクロで実装した汎用リストがあったりするんですが
それ使えるのはもちろんLinuxカーネルだけだから
それの汎用バージョンみたいなのないのかなぁ...っと

11:デフォルトの名無しさん
07/08/16 08:45:30
そこだけ綺麗に描き直してフォークすればいいじゃん

12:デフォルトの名無しさん
07/08/16 08:47:22
>>10
こんなの見つけた
URLリンク(www5d.biglobe.ne.jp)

13:5
07/08/16 17:30:09
>>6 返答ありがとうございます。
また質問なのですが、Visual C++:2005 の設定を間違えて保存などした場合、
どうすれば初期設定にもどせるんでしょうか?

14:デフォルトの名無しさん
07/08/16 17:32:21
C言語のスレで前スレ最後の書き込みがオッパッピー解説ってどうよ

15:デフォルトの名無しさん
07/08/16 17:56:05
だが、それがいい

16:デフォルトの名無しさん
07/08/16 18:00:46
正直に言えやぁ、ほまは オッパッピー がむっちゃ好きなんやろ?
男なら絶対そうやろ?隠さんでええよ、バレとるからw

17:デフォルトの名無しさん
07/08/16 19:17:35
ツール → 設定のインポートとエクスポート → すべての設定をリセット

18:デフォルトの名無しさん
07/08/16 22:19:28
整数Aは整数Bの何%であるか表示するプログラムのソースを教えてください。

19:5
07/08/16 22:23:27
>>17 レスありがとう でも戻らないorz
なんかマイクロソフト公式HPに

Visual SourceSafe エクスプローラのプロジェクト ペインで削除されたファイルが所属していたプロジェクトを選択します。
[ファイル] メニューで [プロパティ] をクリックし、[削除された項目] タブをクリックします。
復元するファイルを選択します。
[復元] をクリックします。

って書いてあるけど、これどうやるんでしょうか?


20:デフォルトの名無しさん
07/08/16 22:52:50
>>19
再インスコ

21:デフォルトの名無しさん
07/08/16 23:02:08
>>19
それは Visual SourceSafe がインストールされてないとどうにもならない
Visual SourceSafe エクスプローラは Visual SourceSafe の本体の一部だしな

っつーか
その「書いてあるけど、」の部分は SourceSafe の中に格納したデータを削除した時に
SourceSafe の中の「ごみ箱」的な場所からデータを復元させるための手順なんだが

この際再インスコに同意しておく

22:デフォルトの名無しさん
07/08/17 10:59:14
ポインタと配列で質問なのですが、
int a[3][4];

int *p = a[0];
のように、int * 型のポインタ p を a[0] に初期化すれば、 a[i][j] は p[i*4+j]
と書いても同じことになります。ネットのポインタ説明よりコピペなのですが、
a[i][j] は p[i*4+j]この部分が良く分かりません。[i*4+j]の詳しい解説を
していただけませんか?


23:デフォルトの名無しさん
07/08/17 11:04:55
初期化の部分はint *p = a;の間違いだと思うが、

a[3][4]は、メモリ上(?)で
a[0][0]、a[0][1]、a[0][2]、a[0][3]、a[1][0]、a[1][1]、a[1][2]、・・・・
という順番になっているから。

24:デフォルトの名無しさん
07/08/17 11:11:51
int *p = a; のaはaの配列の先頭を指しているらしいですよ

25:デフォルトの名無しさん
07/08/17 11:16:54
>>23 じゃあどんな高次元配列(?)でも[i][j]をポインタで表すのに[i*4+j]
と共通してるんですか?なんか悩んでる内に[i*4+j]を覚えてしまった。
分からないのならまるおぼえしてしまおうかなw

26:デフォルトの名無しさん
07/08/17 11:27:40
まさか。その4はどこから出てきたと思ってるんだ

27:デフォルトの名無しさん
07/08/17 11:51:08
こんにちは。次の職場で使うため、C言語の勉強をしているものです。

入門書を一通り読み、簡単なアプリも幾つか作りましたが、
今ひとつ他人のソースを追うのが苦手です。
そこで、数読んで慣れようと考えました。
もしご存知でしたら、ソースを沢山読めるサイトを教えていただきたく。

28:デフォルトの名無しさん
07/08/17 11:55:24
URLリンク(www.google.com)

29:22
07/08/17 12:08:01
配列[i][j] とすると ポインタ[i * jの要素数 + j]ですよね。
考えてもさっぱりなんで公式として覚えてしまおうと思います。

30:27
07/08/17 12:17:12
>>28
ライブラリやフリーのソースについては、
コードリーディングという本で読んでみたのですが、
規模が大きすぎる&仕様がソースのみで、今ひとつでした。

31:22
07/08/17 12:23:57
[i * 型の使用バイト数 * j]かもしれませんね。

32:デフォルトの名無しさん
07/08/17 12:30:03
>>31
冗談だろwww

a[0][0]、a[0][1]、a[0][2]、a[0][3]、a[1][0]、a[1][1]、a[1][2]、・・・・
==a[0] 、==a[1] 、==a[2] 、==a[3] 、==a[4] 、==a[5] 、==a[6] 、・・・・
あとは分かるよな?

33:22
07/08/17 12:58:27
なるほど、そういうことっすか。ポインタに配列を代入した場合、
2次元配列をポインタでを表す場合、感覚で言うと繰り上げないでそのまま数を加算
するんですね。

34:デフォルトの名無しさん
07/08/17 13:08:14
>>23
int *p = a じゃ警告出るだろ。
a[0] か *a か (int*)a じゃないと。

35:22
07/08/17 13:10:17
日本語変だorzエスパー読みしてください

36:デフォルトの名無しさん
07/08/17 13:13:52
>>34
そうだな。スマン

37:19
07/08/17 14:03:38
サイスコして復活したのはいいけど、こんどはソースいじって上書きしようとしても
アクセス権限がありません、管理者に許可をもらってください。ってでる
どうしたらいい?

38:デフォルトの名無しさん
07/08/17 14:07:09
あー
ものすごくアレだ
もしかしてVista使ってて
VisualStudioにまだ公式Vista用パッチ当ててないか
ソースを\Program Files\の下に保存かけてしまってる
とか
なんか

39:19
07/08/17 14:32:53
>>38 それかぁああああ!!!
どうしたらいいかおしえて1おねがい!おしててうhw

40:デフォルトの名無しさん
07/08/17 14:55:58
C言語と関係ないし、内容も別スレで聞いたほうが早いと思うから
それ以上はVisualStudio関連スレでやって下さいな。

41:デフォルトの名無しさん
07/08/17 14:59:10
>>39
ラスト。これ以上は判らんスよ

MSのサイトで 2005 update SP1 vista で検索しとけば大概わかるっしょ
あとは別スレで

42:デフォルトの名無しさん
07/08/17 17:41:01
この質問してたヤシが30過ぎたおっさんだったら失笑してしまう。

43:デフォルトの名無しさん
07/08/17 23:10:09
>>42
30過ぎの女性だとしても苦笑もんだな。

44:デフォルトの名無しさん
07/08/17 23:51:08
>>22
配列は、大きな連続した領域として、メモリ上に確保されます。
a[3][4]とb[12]はメモリ上では同じ様に存在します。
仮に a == b(同じアドレス)だとしたら。
&a[0][0] == &b[0]
&a[0][1] == &b[1]
&a[0][2] == &b[2]
&a[1][0] == &b[4]
&a[2][0] == &b[8]
&a[2][3] == &b[11]
の様に対応します。
aの右側の添字が1増える毎に、bの添字が1増え、
aの左側の添字が1増える毎に、bの添字が4増えるのが分かるとおもいます。
お察しの通り、4は要素数です。
したがって a[i][j] は b[i*4+j] です。

2次元配列は1元配列を、ただ折り畳んだものと考えれば分かりやすいでしょうか?(下の例で同じ文字同士が対応していると思ってください)
1次元配列:a[12]
0123456789AB
2次元配列:a[3][4]
0123
4567
89AB


45:デフォルトの名無しさん
07/08/17 23:53:28
図に描いてみればすぐわかるんだけど、文章で説明するのは難しいね。

46:デフォルトの名無しさん
07/08/18 00:01:34
こんな俺におすすめのCの教科書を教えてくれまいか。

・Javaはそれなりにやってる。
・Cは「触ったことある」レベル。ポインタのポインタって頭破壊する気? マクロとか#defineぐらいしか知りませんが?
・内容は多少ハイレベルでも大丈夫、というかみっちりやってくれる本の方が嬉しい。
・演習がしっかりある奴がいい。むしろ多少重いぐらいで丁度良い。

お願いしますだ

47:デフォルトの名無しさん
07/08/18 00:52:41
>>46
規格書。
・プログラミング初心者向けではない。
・それを知るために読むのだろ。
・内容はハイレベルだが漏れもなければ間違いもない。
・世の中の全てが演習のテーマだ。

48:デフォルトの名無しさん
07/08/18 01:07:08
>>47 それ以外で何か頼むw 規格書もいつか読むんだろうけどさ・・・

49:デフォルトの名無しさん
07/08/18 01:55:23
>>46
C++だけど「独習C++」なら持ってる。演習付き。
これのC版はどうだろう?(俺は読んだことないけど)
書店で片っ端から開いてみたら?
ところで、ポインタのポインタで頭破壊なら、二次元配列でも頭破壊か?

50:デフォルトの名無しさん
07/08/18 03:29:35
>>49
独習Cは書店にあったなー。平積みだったし、定評ある本なんだろうなやっぱり。thx

2次元配列は大丈夫、かな? ポインタで要素にアクセスしようとするのは慣れないけど。
基本的に、ポインタ周りの使い方と理解が全くだめ。Javaにポインタがないからだねw
参照という意味ではJavaでも無意識で使ってるのは確かだけど、Cだときっちり意識して使わないと駄目な感じに見える・・・

51:デフォルトの名無しさん
07/08/18 04:15:36
今 C言語勉強中で一通り超基礎を終わらせたのですが教えてください><

int ia;

while(ia != -999){
scanf("%d",&ia);
}

これを実行させて入力時に「a」とかを入れると無限ループするのですが
なぜでしょうか?

もちろんchar型ではないのでこんなんしたらダメだと思うんですが
 a のアドレスが ia に代入されるんだったら-999じゃないから
無限ループにならずにまた入力になると思ったんですが・・

なんでだろぅ・・

52:デフォルトの名無しさん
07/08/18 04:24:30
URLリンク(www9.plala.or.jp)
> scanf()で読み込み不一致が起こる問題では、上記 「atoi()、atol()、atof()」を使って回避します。
> 読み込み不一致は、scanf()を for や while などのループの中で用いた場合、入力バッファに
> 残されたデータを永遠に受け付けないため無限ループになってしまい意外に深刻な問題となります。
> そのためデータを一旦、scanf("%s", ○)や gets()を用いて文字列として入力し、それから上記の
> 変換関数を用いて期待するデータ型に変換するのです。

int i = 0;
char a[20];

while(i != -1) {
printf("整数値を入力してください(終了条件:-1)\n");
scanf("%s", a);
i = atoi(a);
}





53:デフォルトの名無しさん
07/08/18 04:30:09
>>52
超すばやいお返事&回答ありがとうございます(@w@

なるほど・・これをすると入力を永久に受け付けなるのですね
しかもサイトまで教えていただいてありがとうございます!
このサイトいいですねw勉強してきます

54:デフォルトの名無しさん
07/08/18 06:22:06
乱数に関しての質問なのですが、教科書には

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)
{
int i;
srand((unsigned)time(NULL));

for(i = 0; i < 10; i++){
printf("%d\n", rand() % 100);
}

return 0;
}
でおkと書いてるんです。
コンパイルは通ったのですがこの部分の
printf("%d\n", rand() % 100);
これってもし 0 がきたら0割りで無限ループになるんでしょうか?
0がくることはないですか?
自分は
printf("%d\n", (rand() +1 % 100);
のほうがいいんじゃないかと思ったのですがどうなのでしょうか?




55:デフォルトの名無しさん
07/08/18 06:22:34
>>52
だからそのサイトは地雷だって。果てしなく間違いが見つかる。

56:デフォルトの名無しさん
07/08/18 06:25:29
>>54
馬鹿もん、0割る100は0だ。

57:51
07/08/18 06:28:18
すいません^^; >>54 は 51です。名前入れ忘れました。 

58:デフォルトの名無しさん
07/08/18 06:29:06
>>57
別に誰でもいいから自分宛のレスを読んでレスしてから言い訳しろ。

59:51
07/08/18 06:33:35
あぅ・・すいません。言い訳じゃなかったのですが つw;)
今 0/100やっても大丈夫でした^^;申し訳ありません。
学校でCOBOLとC、同時にやってるのでごっちゃになってしまいました。。
(COBOLは0を割ると無限ループになっちゃうので・・)
一回試してから聞くようにします^^;ごめんなさい

60:デフォルトの名無しさん
07/08/18 06:41:01
>COBOLは0を割ると無限ループ
そうだっけ? どうでもいいけど常識的には有り得ないんだけど。

61:51
07/08/18 06:42:56
>>60
あぅ、うちの学校のホストだけなのか´ω`;
GS-8200って富士通のホストです


62:デフォルトの名無しさん
07/08/18 06:46:09
うぁはは、COBOLってすげー。
--
COBOL アプリケーションプログラムを強制終了するには、2 通りの方法がありま
す。
方法 1
0 で 0 を割る COBOL アプリケーションプログラムを作成します。

63:デフォルトの名無しさん
07/08/18 06:46:36
例外ベクタの飛んだ先にHLTが埋め込まれてるんじゃないの。
古代の処理系ならありがちだよ。

64:デフォルトの名無しさん
07/08/18 06:50:28
ゼロで除算する事が問題になるのはよく聞くけど
ゼロを除算する事が問題になるなんて聞いたこと無いな

65:51
07/08/18 06:54:47
あ!ほんとだ
100/0にしたらコンパイルエラーになった。
完全に私の覚え間違いでした・・ちょっとROMって勉強しなおします・・

66:デフォルトの名無しさん
07/08/18 10:31:49
C言語を勉強する前に身につけておかなければならないことは?

67:デフォルトの名無しさん
07/08/18 10:35:22
>>66
そういう頭でっかちの考え方を捨てること

68:デフォルトの名無しさん
07/08/18 10:37:58
基本スペックは中卒+パソコンオタクです

69:デフォルトの名無しさん
07/08/18 10:46:27
なんだかんだ言っても、コンピュータの仕組みを知ることも重要だよね。
人によってはコード、文字列を入力しているようにしか思えないだろうけど
汎用電子計算機に処理してもらっていること、どのように処理されているのかとか。
そういうのを知ると、より適切なプログラミングが出来るようになる。

70:デフォルトの名無しさん
07/08/18 11:12:26
>>55
なんか、そのサイトの作者が自作自演で宣伝してるんじゃないかってかんぐりたくなるな。

71:デフォルトの名無しさん
07/08/18 11:19:22
だとしたらかなり高度な自演だなw

72:デフォルトの名無しさん
07/08/18 20:06:55
〇∧〃 初心者からの質問?
 / >  でもそんなの関係ねぇ!
 < \  そんなの関係ねぇ!

  〇/ はい!
 /|    オッパッピー!!
 />

全部わすれておっぱっぴー!

73:デフォルトの名無しさん
07/08/18 20:29:38
一つ質問があります。よろしくお願いします。

realloc()についてなんですが、このメモリ領域拡大縮小関数の
P186の定義を見てあきれたんですが、
新規にメモリを確保して、memcpy()で内容をコピーしてるんですが
領域を縮小するときはともかく、領域を拡大した場合、
元のメモリ領域の外までコピーしていますよね。
これってエラーにならないんですか?
確かに書き換えているわけではないので
問題ないのかもしれませんが、これじゃメモリを別アプリから覗き見放題じゃ
ないですか。本当のところどうなんでしょうか。単にわたしの資料が古いだけかな。

それと今、C++でrenew()みたいな関数作ろうと思ったんですが、
元のメモリ領域のサイズがわからないので難儀しています。
何かよい解決策がありましたらご教授ください。


74:デフォルトの名無しさん
07/08/18 20:31:22
P186って、なんのページ?

75:デフォルトの名無しさん
07/08/18 20:37:50
こっちが呆れた。

76:デフォルトの名無しさん
07/08/18 20:40:54
標準ライブラリって仕様は統一されてても実装は処理系依存じゃ?

77:デフォルトの名無しさん
07/08/18 20:58:29
>>76
標準の話じゃなくて、なにかの本のP186に載ってる実装例の話でしょ。

78:デフォルトの名無しさん
07/08/18 21:03:54
P-186号文書

79:デフォルトの名無しさん
07/08/18 21:04:23
文字列がABCDEFG・・・みたいに続いていて
2文字目だけコピーするまたは3文字目から5文字目をコピーするといった方法ありますか?
strcpy()だとできない・・・

80:デフォルトの名無しさん
07/08/18 21:07:36
memmove, memcpy, strncpyとか

81:デフォルトの名無しさん
07/08/18 21:11:28
>>74
ANCI C言語辞典です。
ちなみに、XPでBCCのC++でnew使って同様にmemcpyしてみましたがエラーにならないようですね。

char* p1;
char* p2;
p1 = new char[10];
memset(p1, 'A', sizeof(char)*10);
p2 = new char[1000000];
memcpy(p2, p1, sizeof(char)*1000000);
delete p1;
delete p2;


82:デフォルトの名無しさん
07/08/18 21:14:25
>>81
そりゃエラーにならんだろう
範囲外を書き換えているわけじゃないし

83:デフォルトの名無しさん
07/08/18 21:26:36
>>74
オッパッピーのピーだよ、きっと

84:デフォルトの名無しさん
07/08/18 21:27:46
>>79
こんなんでどうでしょう

const int siz = 3;
char s[] = "ABCDEFG";
char* p;

p = new char[siz];
memset(p, '\0', siz);
p[0] = s[1];
printf("2文字目:[%s]\n", p);
memset(p, '\0', siz);
memcpy(p, &s[2], sizeof(char)*3);
printf("3文字目から5文字目:[%s]\n", p);
memcpy(p, &s[2], &s[5] - &s[2]);
printf("3文字目から5文字目:[%s]\n", p);
delete p;


85:デフォルトの名無しさん
07/08/18 21:29:43
>>82
やっぱりそうですか。了解しました

86:79
07/08/18 22:00:39
>>84
サンクス!なんとかできた

87:デフォルトの名無しさん
07/08/18 23:18:53
>>86
間違っても>84を真似してはいけません。それはCではありません。
--
bool strExtract(char * dest, const char * str, unsigned from, unsigned to)
{
if (str == NULL || dest == NULL) return false;
unsigned length = strlen(str);
if (from - 1 >= length || from < to) return false;
length = to - from + 1;
sprintf(dest, "%*.*s", length, length, str + from - 1);
return true;
}

char buf[100];
char str[] = "ABCDEFG";

// 2文字目をコピーした文字列を得る
strExtract(buf, str, 2, 2);
// 3-5文字目をコピーした文字列を得る
strExtract(buf, str, 3, 5);

88:デフォルトの名無しさん
07/08/18 23:30:44
84、87は初心者か、悪意のある上級者だろうな。

89:デフォルトの名無しさん
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() は要素を削除するんですよね?
この方法(配列上で行う連結リスト)だと要素を削除した後、その後追加する際に、
空いている要素と空いていない(使われている)要素の区別がつかないので
その点も考慮していく方がよろしいかと思います


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch