C言語なら俺に聞け(入門篇) Part 15at TECH
C言語なら俺に聞け(入門篇) Part 15 - 暇つぶし2ch2:デフォルトの名無しさん
07/06/25 06:32:36
過去スレ

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板)

3:デフォルトの名無しさん
07/06/25 06:55:44
└0^0┘ < これをグラディウスの後姿と書いた君!素晴らしい、そういう想像力はぼくちん好きだお♪
そういわれたら、なんかメガネじゃなくて後姿にしか見えなくなってきた。これが脳を刺激する
アハッ体験なんだね、良い勉強になった。

4:デフォルトの名無しさん
07/06/25 07:03:17
ビッ○バイパーだろ

5:デフォルトの名無しさん
07/06/25 07:06:55
URLリンク(ja.wikipedia.org)(%E3%82%B2%E3%83%BC%E3%83%A0)
URLリンク(ja.wikipedia.org)
さすが、メガネデヴピッツァヲタは詳しいぜ、参ったぜベイベー。

6:デフォルトの名無しさん
07/06/25 09:48:17
C言語なんですが
文字列の中の文字数を調べるstrlen()のように
ファイルの中の文字数を調べる関数ってありますか?


7:デフォルトの名無しさん
07/06/25 10:00:22
最後まで読もう
スレリンク(tech板:585-番)

8:デフォルトの名無しさん
07/06/25 10:44:15

OS:Linux
言語:c言語(posix準拠のC言語)

socketについて質問です。
socketを生成して、
bindせずにrecvfrom(ブロッキング)した場合、
終了方法(recvfromのブロックを解除する方法)はどのような方法がありますか?



9:デフォルトの名無しさん
07/06/25 14:10:34
bmpファイルを読み書きするライブラリってありませんか?

URLリンク(coconut.sys.eng.shizuoka.ac.jp)

ここのプログラムでは、なぜか画像が真ん中で切れて左右で入れ替わってしまいました。


AB→ABになってほしいところを、
AB→BAになってしまいました。

10:デフォルトの名無しさん
07/06/25 14:23:28
読み初めの位置が半分ずれてるんじゃない?

11:デフォルトの名無しさん
07/06/25 16:21:55
>>6
こんな感じかな
unsigned NumLen()
{
unsigned c = 0,num=0;
FILE *fp = fopen("text.txt","r");
while( (c = fgetc(fp)) != EOF)
num++;
return num;
}


12:デフォルトの名無しさん
07/06/25 17:36:25
wcコマンドのソース見てそっからパクりゃいいんでねぇべか?

13:デフォルトの名無しさん
07/06/25 20:30:33
conio.hがないといわれました。
debian:~$ gcc ch05-04.c
ch05-04.c:2:19: error: conio.h: そのようなファイルやディレクトリはありません
はじめてconio.hというのを見ました。ちなみにconio.h というのは必要ですか?
独習cに下みたいなのがあったのですけど、これってgetchar でできますよね?
#include <stdio.h>
#include <conio.h>
int main(void)
{
char mess[80];
int i;
printf("input message (less than 80 letters)\n");
for(i=0; i<80; i++){
mess [i] = getche();
if(mess[i] == '\r')break;
}
printf("\n");

for(i=0;mess[i] != '\r' ;i++) printf("%c",mess[i] + 1);
return 0;
}

14:デフォルトの名無しさん
07/06/25 20:35:41
あ、できた。
conio.hの存在意義を教えてください。

15:デフォルトの名無しさん
07/06/25 20:41:00
コンソールI/Oはもっと色々できるのじゃよ

16:デフォルトの名無しさん
07/06/25 21:28:00
登録後、即出会えた出会い系サイトのみを紹介するブログ始めました。
2chと併用して使える、良質な即日系サイトのみを薦めております。
↓↓↓
【ブログ】URLリンク(deaiload.blog109.fc2.com)

17:デフォルトの名無しさん
07/06/25 22:07:12
>>14
文字色変えたりとかもconio.hで出来るよ。8色しかなかったっけ?
別にconio.hでなくてもできるのあるだろうけど。標準ではもちろん無理。

18:デフォルトの名無しさん
07/06/26 00:34:43
URLリンク(kansai2channeler.hp.infoseek.co.jp)

上のプログラムは、オセロを作ってるんですが
関数test2でswichの中のcase5がうまく実行されません

そこで、どこまで実行できてるのか確かめるため
printfを途中に入れてみたところ、何故かうまく実行できるようになってしまいましたw
もちろん、printfをのけると、うまく実行してくれません。。。

一応動くので問題ないんですが、何故なんでしょうか?

19:デフォルトの名無しさん
07/06/26 00:46:41
ソースを見ずに回答すると、たぶんスタックを壊してる

20:デフォルトの名無しさん
07/06/26 01:30:28
>>18
test()で、x, yに対してノーチェックでx - 1などとしているので配列外を参照してしまっている。
ところで、いつからオセロは10x10になったんだ?

21:デフォルトの名無しさん
07/06/26 01:47:56
>>19
スタックの意味が分からないので調べ中。。
thx!

>>20
thx
関数testを次のように改変しました。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

が、やっぱり実行してくれません><
作ってる時に確か10×10ぐらいかな~と思ったのでw


22:18
07/06/26 02:03:26
スタックというのは変数のエラーなんだろうか
(違ったらスマソ)

確かに多次元配列を全ての関数に渡したりしてるけど
printfを入れると解消する問題なので、原因は別かなと思います

23:デフォルトの名無しさん
07/06/26 02:09:03
>>22
スタックという変数を格納する場所の破壊

24:18
07/06/26 02:36:57
>>23
thx。。
どの部分がスタックを破壊しているのか教えて頂けませんか?
もしくはスタックが破壊される原因を教えて下さい

25:デフォルトの名無しさん
07/06/26 03:38:40
スタックっていうか、そこかしこで配列外の領域にアクセスしてる気がするが。
とりあえず落ちるときの入力パターンぷりーず。

26:デフォルトの名無しさん
07/06/26 04:38:17
>>24
取り敢えずロジックをとばし読みして疑問に思ったところ

関数testの中で
> if(array[x-1][y]==2){ //上
ってやってるところがあるけど、xは0になる可能性があるよね。
てことは配列の領域外を参照していることになるけど、これは大丈夫?
配列の添え字にy-1を与えているところも同様。

次に関数test2の中で
> for(;y<=9;n++){
ってやってるところがある。でもyの初期値が設定されていないような気がする。
これだと(yに割り当てられた)スタックにたまたま積まれていた値の違いで動作が変わる可能性がある。
この辺の初期化してない変数なんかは言ってる問題が起きる典型的なパターンなんだけど。

27:デフォルトの名無しさん
07/06/26 04:39:54
あと質問には関係ない小さい点

void ai (int array[][10])
{
srand(time(NULL));
array[rand() % 10][rand() % 10] = 2;
}

srandはここでやるべきではないと思う。mainの先頭で一度やれば十分というか、そうすべき。

28:デフォルトの名無しさん
07/06/26 05:21:22
ソース丸ごと投げて見てもらうと自分のダメなとこ突っ込んでもらえるんだな。
オレも今度投げてみよう。

29:デフォルトの名無しさん
07/06/26 05:29:13
ソースも出さない、エラーメッセージも正確に書かないよりは答えてもらえる確率は高くて当然だろ。

30:デフォルトの名無しさん
07/06/26 06:27:16
{1,2,3,....,n}の中から要素数がl以下になる組み合わせをすべて求めよ
例えばn=3,l=2のときは{0,1}{0,2}{0,3}{1,2}{1,3}{2,3}{1}{2}{3}となるようなものです

お願いします

31:デフォルトの名無しさん
07/06/26 06:27:18
阿部さんに○×を出すともれなく△□を突っ込んでもらえますよ?

32:デフォルトの名無しさん
07/06/26 06:35:12
>>30
課題は自分でやれ。な?

33:デフォルトの名無しさん
07/06/26 06:44:06
>>28
暇つぶししたいくらい暇なときには突っ込んであげるよ。

34:デフォルトの名無しさん
07/06/26 06:47:01
いやいやmainでsrandなんてしたら関数aiを知らない人は意味分からんじゃん
やっぱり関数ai内に入れておくべき

35:デフォルトの名無しさん
07/06/26 06:47:27
>>34
妄言はそこまでにしとけ。

36:デフォルトの名無しさん
07/06/26 06:50:50
>>34
time(NULL) が返す値が、前回呼び出されたときと同じになるような、1秒以内に
連続して呼び出されるときは rand()が返すパターンが同じになるぞ。

37:デフォルトの名無しさん
07/06/26 06:52:38
>>36
フラグを入れるんだよ
static int flag;
 if(flag==0){
 srand(time(NULL));
 flag = 1;
}

これでおk

38:デフォルトの名無しさん
07/06/26 06:53:25
>>37
先に言え、後だしで自分の落ち度を補って逃げるのは卑怯だぞ

39:デフォルトの名無しさん
07/06/26 06:56:31
ごめん

40:デフォルトの名無しさん
07/06/26 06:58:58
>>37
flagの最初の値は?呼び出されるたびに if(flag==0) を評価するの?無駄が多い。
mainで一度やっとけ。

41:デフォルトの名無しさん
07/06/26 06:59:26
>37
関数呼び出すたびに無駄なチェック入れんの?

42:デフォルトの名無しさん
07/06/26 07:03:35
>>37
他の関数でも同じことやるの?
有り得ないよね。

43:デフォルトの名無しさん
07/06/26 07:06:31
乱数ってのは何度も初期化されないから乱数なんだよ。
初期化は一度のみ。
それを保証するには main で初期化するのが一番。

44:18
07/06/26 08:44:31
寝てしまった。。
答えてくれた方、申し訳ない&thx!

そ し て
問題点分かりました!
>>26の言うとおり、配列の要素が-になるのを回避、x,yを0で初期化したら
直りました!初期化しておかないと駄目なんだな!

あと、srandはとりあえずmainでやっておきます!


45:デフォルトの名無しさん
07/06/26 08:54:36
既に>20で指摘されている罠。

46:18
07/06/26 09:44:16
そこは、>>20で変更したんですが、(case8が出来てないけど)
問題は、x,yの初期化という事です。


47:デフォルトの名無しさん
07/06/26 09:56:00
VisualC++ExpressEditionを使ってるんですが、
#include <stdio.h>

main()
{
    printf("私の名前は、山本一郎です\n");
}
(名前はrei1_2)というプログラムをビルドすると、
------ ビルド開始: プロジェクト: START_C, 構成: Debug Win32 ------
コンパイルしています...
rei1_2.c
リンクしています...
rei1_2.obj : error LNK2005: _main は既に rei1_1.obj で定義されています。
C:\Users\tokimaru\Documents\Visual Studio 2005\Projects\C\START_C\Debug\START_C.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
ビルドログは "file://c:\Users\tokimaru\Documents\Visual Studio 2005\Projects\C\START_C\START_C\Debug\BuildLog.htm" に保存されました。
START_C - エラー 2、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
というエラーが出てしまいます。
何所がおかしいのかよくわかりません。
教えてください。お願いします。

48:デフォルトの名無しさん
07/06/26 10:01:52
>>47
> _main は既に rei1_1.obj で定義されています
そりゃだめだ。リンクさせないで別物のソースとしてコンパイルせい

49:デフォルトの名無しさん
07/06/26 10:05:32
rei1_1.c をどっか別の所に移動するか、
新しくプロジェクトを作るか。

50:デフォルトの名無しさん
07/06/26 10:15:37
1を消さないんだったら同じソリューションで別プロジェクト作るのがいいかな

51:47
07/06/26 10:17:04
C:\Users\tokimaru\Documents\
って貼っちゃいましたけど、この情報から個人情報が割れたり、PCに侵入されたりしませんよね?

52:デフォルトの名無しさん
07/06/26 10:28:02
IP 分かんないから侵入とかは大丈夫だとは思うけど、あまり貼るべきではないな。

53:デフォルトの名無しさん
07/06/26 10:34:14
>>52よかった~(汗)
ところで、48さん、49さん、50さんの言うようなやり方以外の方法ありますかね?
僕は初心者なのでよくわかりません。

54:デフォルトの名無しさん
07/06/26 10:39:48
>>53
だから他と被らない関数名にすりゃええやろ。

55:デフォルトの名無しさん
07/06/26 10:45:34
>>53
じゃあいったんプロジェクトから1を外せ
選択してDELキーで消える
ファイルそのものは残るから、あとで既存の追加で戻せる

56:デフォルトの名無しさん
07/06/26 10:49:36
>>54さん、>>55さんありがとうございました。

57:デフォルトの名無しさん
07/06/26 11:18:18
typedef struct node* link;
struct node { int item; link next; };
typedef link Node;

link deleteNext(link x){
link t = x->next; x->next = t->next;
return t; }


link t=x->next;
新たなlink tを作り、tにxの指し示すリンクと同じitem,リンク先を持たせている

x->next = t->next;
xのリンク先はtが指し示すリンク先にする

で合ってますか?
だとしたらreturnでtだけ返すのだからx->nextを指定しても何の意味もないと思うのですが、何か記号の意味を履き違えている気がします

58:デフォルトの名無しさん
07/06/26 11:36:45
malloc も free もないんだが。
恐ろしいコードに見える。

59:デフォルトの名無しさん
07/06/26 11:46:36
>>57
関数の動きはこんな感じ。

・xの指す先をtにコピー。xの指す先をtの指す先に変更。tを戻す。

つまり、リンクリストからxの指す先を外し、それを返している。

>>58
削除関数だからmalloc()は要らないわけだし、tを返すのは呼び出し元でfree()するためだろ。


60:デフォルトの名無しさん
07/06/26 11:48:24
>>57
link はポインタだから作るわけじゃないよ、アドレスを保存してるだけ。

A→B→C
の状態を
A→C
に変えてる
Bは宙に浮いてる状態で返してる。消すためだろう。

61:デフォルトの名無しさん
07/06/26 11:49:27
書き換えるとこうなるのか。
--
link t = x->next; // 削除対象(へのポインタ)を一旦保存
x->next = x->next->next; // 削除対象を迂回するように接続しなおし
return t; // 削除対象を返却

62:デフォルトの名無しさん
07/06/26 13:03:00
feof()はファイルの終わりをどこで判定してるんでしょうか?

例、ファイルの中身が
This is a pen

の場合は、nに達した時点で0を返すのか、EOFで0を返すのか


63:デフォルトの名無しさん
07/06/26 13:05:15
やれば分かる。

64:デフォルトの名無しさん
07/06/26 13:10:09
確かにこの程度なら実際に試してみるのが一番かもしれない

65:デフォルトの名無しさん
07/06/26 13:17:26
l = 0;
while(!feof(fp)){
ch = fgetc(fp);
printf("%c : %d \n",ch,ch);
if(ferror(fp)){
printf("ファイルの読み込みエラー\n");
exit(1);
}
l++;
}

を実行してみたら-1も出力したのでEOFの次でループ終了ですかね


66:デフォルトの名無しさん
07/06/26 13:27:09
おいおい

67:デフォルトの名無しさん
07/06/26 13:28:43
「EOF」 という言葉はどこを意図して使ってる?

68:デフォルトの名無しさん
07/06/26 13:29:31
-1じゃないんですか?


69:デフォルトの名無しさん
07/06/26 13:30:58
EOF を読み込んだら終了、だよね?

70:デフォルトの名無しさん
07/06/26 13:32:01
意図しようとしてるのは同じことなんだろうか?
ならいいんだけど。

71:デフォルトの名無しさん
07/06/26 13:32:23
EOFを読み込んだら終了ならEOFが出力されるのはおかしい


72:デフォルトの名無しさん
07/06/26 13:34:28
EOF を読み込んだら feof が真を返すようになるんだっしょ?

73:デフォルトの名無しさん
07/06/26 13:45:05
while(!feof(fp)) だからEOFに達した時点でループ終了してないとダメなんじゃないの?


74:デフォルトの名無しさん
07/06/26 13:46:16
EOF に達しはしたけど、読み込んではないよね?

75:デフォルトの名無しさん
07/06/26 13:46:58
何か二人で同じことを言おうとしてる気がしてならない。

76:デフォルトの名無しさん
07/06/26 13:47:06
実行すると-1返って来るよね
読み込んでるってことじゃないの?


77:デフォルトの名無しさん
07/06/26 13:48:29
とりあえずこんな感じだ。

#include <stdio.h>
#include <ctype.h>

int main() {
    int ch, b;
    FILE *fp = fopen("hoge.txt", "r");
    if(fp == NULL) {
        return 1;
    }
    do {
        ch = fgetc(fp);
        b = feof(fp);
        printf("%c : %02X / %d\n", ch, ch, b);
    } while(!b);
}

T : 54 / 0
h : 68 / 0
i : 69 / 0
s : 73 / 0
  : 20 / 0
i : 69 / 0
s : 73 / 0
  : 20 / 0
a : 61 / 0
  : 20 / 0
p : 70 / 0
e : 65 / 0
n : 6E / 0  ← n が読み込まれて、ファイルポインタは EOF に達しはしているが、まだ読み込んでないためそこが EOF かどうか分からないでいる
? : FFFFFFFF / 1  ← EOF が読み込まれたため、EOF に達した事が判明し、feof が真を返すようになる

78:デフォルトの名無しさん
07/06/26 13:50:58
>>76
-1 が返って来るのは、当然読み込んでるということ。
でも、その後にそれを表示してから、
その後にようやく feof をチェックしてるでしょ。
そっちのプログラムは。
で、そこでループが終了してる。
つまり、-1 が読み込まれた後に feof を実行すると
真を返すようになっている、ということだ。

79:デフォルトの名無しさん
07/06/26 14:01:32
fgetc()は、エラーとかファイルが終わってるとかで、読んだ文字がない時にEOFを返す。
「EOFを読み込んでいる」のではない。

80:デフォルトの名無しさん
07/06/26 14:03:01
「0 個のりんごがある」 と 「りんごが 1 個もない」 程度の話だよ、それは。

81:デフォルトの名無しさん
07/06/26 14:10:27
feofはファイルの末端に来ました
fgetcは読んだ文字がないので-1を返しました
feofは真を返しました

って話?


82:デフォルトの名無しさん
07/06/26 14:14:36
ファイルポインタは初めてファイルの末端に来ました
feofは偽を返しました
fgetcはもう読み込める文字がないので-1を返しました
feofは真を返しました

こうだな。

83:デフォルトの名無しさん
07/06/26 14:15:49
初めて、は余計か。

ファイルポインタはファイルの末端に移動してきました
feofは偽を返しました
fgetcはもう読み込める文字がないので -1 を返しました
feofは真を返しました

こうか?

84:デフォルトの名無しさん
07/06/26 14:20:15
while(fgetc(fp) != EOF)
の方がいいんじゃないの?


85:デフォルトの名無しさん
07/06/26 14:26:53
feof の挙動を調べたいみたいだよ。

86:デフォルトの名無しさん
07/06/26 14:27:59
1文字ずつ読んだ場合に加えて、いっぺんに読んだときどうなるかも調べてみては

87:デフォルトの名無しさん
07/06/26 14:30:54
>>84
それは趣旨が違うと思った
>feof()はファイルの終わりをどこで判定してるんでしょうか?

88:デフォルトの名無しさん
07/06/26 15:04:57
pthreadでデタッチスレッドを生成し、スレッドが終了した後に
仮想メモリが増えてしまいます。

#include <pthread.h>
#define THREAD_COUNT 50

void *thread_func(void *arg);

int main()
{
char command[128];
int i;
pthread_t thread[THREAD_COUNT];

sprintf(command, "grep VmSize /proc/%d/status", getpid());
for (i = 0; i < 3; i++) {
sleep(1);
system(command);
}
for (i = 0; i < THREAD_COUNT; i++) {
pthread_create(&thread[i], NULL, thread_func, &i);
pthread_detach(thread[i]);
}
for (i = 0; i < 10; i++) {
sleep(1);
system(command);
}
return 0;
}

89:88続き
07/06/26 15:06:07
void *thread_func(void *arg)
{
sleep(3);
}

が動かしたソースで、実行結果が↓こんな感じです。

VmSize: 1392 kB
VmSize: 1392 kB
VmSize: 1392 kB
VmSize: 410996 kB
VmSize: 410996 kB
VmSize: 42356 kB
VmSize: 42356 kB
VmSize: 42356 kB
VmSize: 42356 kB
VmSize: 42356 kB
VmSize: 42356 kB
VmSize: 42356 kB
VmSize: 42356 kB

90:88続き
07/06/26 15:10:54
色々調べたところ

410996kBは大体1392+8192kB×50(スレッド数)
42356kBは大体1392+8192kB×5

ぐらいになっているようでした。
8192kBはスタックサイズから来ているようで、スタックサイズを
変更してみたら仮想メモリサイズは変わりましたが、数式的には
上記と同じでした。

また、スレッド数を変えると410996kBのところがスレッド数に
応じた数に変わるのですが、最終的に落ち着く42356kBは
変わりませんでした。

増え続けることはないのでメモリリークとは違うと思うのですが
気にすることはないでしょうか。×5がどこから来ているのかとか
どうも気になってしまって・・・

何か分かりましたら教えてください。

91:88続き
07/06/26 15:11:47
すいません。ちなみに開発環境はRedHat 9.0、gcc 3.2.2です。

92:デフォルトの名無しさん
07/06/26 15:36:15
時間をずらして detach していった場合に
42356kB で止まるのだとしたら、
内部でいくつかの領域を確保したままにしてるのかも?
次にまた使うときのためにとか。

MacOSX 10.4.10 gcc 4.0.1 だと、
スレッド1つ分のサイズが残るみたいだ。

93:デフォルトの名無しさん
07/06/26 15:36:17
>>91
仮想メモリサイズの制限を越えたための拡張とかは?

94:88続き
07/06/26 15:49:52
>>92
色々観察してみると、同時に実行されるスレッド数が1つの場合、
1392kB+8192kB×1くらいになって、スレッドが終了しても
減りませんが、何度スレッドを起動してもこれ以上増えることは
ありません。

同時に実行されるスレッド数が5までの場合もこの傾向は同じ。
6を超えるとスレッド実行中の仮想メモリは増えるけど、スレッドが
終了すると5スレッド分の仮想メモリ量までは戻る、という
感じです。

5スレッド分は次回使いまわすために確保するようになってる
んでしょうかね。

>>93
ulimit -a で見たら、仮想メモリはunlimitedに設定されて
いました。

95:デフォルトの名無しさん
07/06/27 00:41:18
この脆弱性は文字列長の確認を適切に行わない strcpy()の呼び出しが原因
URLリンク(headlines.yahoo.co.jp)

96:デフォルトの名無しさん
07/06/27 00:50:55
>>95
あらら。

97:デフォルトの名無しさん
07/06/27 01:29:45
strcpyなんて使うなよ・・・

98:デフォルトの名無しさん
07/06/27 01:32:39
あっ、やっぱ問題があった、だから 使うなよ って後から言うのは卑怯。
さも知っていたかのようなことをいうやつに限って、そいつ自身が
ありきたりのタブーをやらかしていることがある。

99:デフォルトの名無しさん
07/06/27 01:34:17
いやいやせめてstrncpy使うだろ
昔から問題は指摘されてたんだしさ

100:デフォルトの名無しさん
07/06/27 01:39:42
単に文字列の整形ならsprintf()の方がいいと思う

101:デフォルトの名無しさん
07/06/27 02:10:14
ブラックジャック先生なら整形に失敗しないYO!

102:デフォルトの名無しさん
07/06/27 02:57:33
おいっ、おまいら、はよ1進数について議論せいや?どんな推論が出るかにゃ~~ ♥

103:デフォルトの名無しさん
07/06/27 03:11:34
wktk

104:デフォルトの名無しさん
07/06/27 03:12:03
実質0しか表現できないっしょ
数え始めた瞬間に桁上がりの無限ループ

105:デフォルトの名無しさん
07/06/27 04:07:08
>>104 それ、問題提起した俺が最初に提唱したぞな。それじゃ詰まらないからぁ
ここであらぬ妄想をぶっこく香具師らに推論させたいのよ ♠

106:デフォルトの名無しさん
07/06/27 04:14:33
おまいの提唱なんぞ知らんがな
>>102見てぱっと思ったから書いただけじゃ

107:デフォルトの名無しさん
07/06/27 04:15:34
>>106
スレリンク(tech板:966番)

108:デフォルトの名無しさん
07/06/27 08:26:21
Wikipediaに答があることをいつまでぐだぐだと……

109:デフォルトの名無しさん
07/06/27 08:29:36
それ以前にスレ違い。

110:デフォルトの名無しさん
07/06/27 09:41:24
気を使うのは外からの入力に対してであって
自分で作って自分で使うバッファは好きなの使えばいいと思う

111:デフォルトの名無しさん
07/06/27 10:00:38
>>98
>さも知っていたかのようなことをいう
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。

>>110
勿論。

112:デフォルトの名無しさん
07/06/27 10:12:48
>>111
> 君が無知だっただけ。
???>>98のどこをどう読んだら無知になるんだろうか?

113:デフォルトの名無しさん
07/06/27 10:22:34
>>108
URLリンク(ja.wikipedia.org)

114:デフォルトの名無しさん
07/06/27 10:52:54
>>98 なんて恥ずかしいセリフを言える時点で頭おかしい。

115:デフォルトの名無しさん
07/06/27 11:00:28
いや、恥ずかしいのは無知だとかありえない勘違いをしたこいつ↓
111 名前:デフォルトの名無しさん 投稿日:2007/06/27(水) 10:00:38
>>98
>さも知っていたかのようなことをいう
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。

116:デフォルトの名無しさん
07/06/27 11:02:10
技術者としては知ってて当然。  技術者としては知ってて当然。  技術者としては知ってて当然。  
技術者としては知ってて当然。  技術者としては知ってて当然。  技術者としては知ってて当然。  
技術者としては知ってて当然。  技術者としては知ってて当然。  技術者としては知ってて当然。  

strcpyの問題点を知っているだけで技術者気取りになれる新米プログラマに失笑です ><;
ちなみに、そんなこと俺も当然知ってたけど、なんで俺が無知になるわけ?w
Lhacaにそれが使われていたなんて、俺は知らなかったけど、strcpyくらい当然知ってましたよ ( ^ー^)b

117:デフォルトの名無しさん
07/06/27 11:03:56
キチガイはすぐ暴れるから困る。

118:デフォルトの名無しさん
07/06/27 11:04:24
111 名前:デフォルトの名無しさん 投稿日:2007/06/27(水) 10:00:38

>>110
勿論。

↑おいおい、すでに問題としてあげられたのに、何知ったかぶっこいて同意してんの?(苦笑)
>>111 ←こいつ最高に知ったかのアホだな。恥ずかしい。プログラマなんてやめた方が良いぞ?
人生の大半を無駄にして終わるぞ?

119:デフォルトの名無しさん
07/06/27 11:17:59
勘違い野郎こそ知ったかぶるから困る。何これ?痛すぎ、必死すぎ
>>97 = >>99 = >>111 < こういう奴が三流プログラマになって世にあらぬ
欠陥品を流通させちゃうんだよね。で、後でアップデートパッチでサポート。
サポートしてんだからちゃんと仕事してますよって間違ったアピールをして
ユーザが離れていって廃れるソフトウェア会社勤務乙。

120:デフォルトの名無しさん
07/06/27 11:35:03
>>119
>痛すぎ、必死すぎ

121:デフォルトの名無しさん
07/06/27 11:50:47
URLエンコードってどうやるんですか?

122:デフォルトの名無しさん
07/06/27 12:10:24
C勉強したいと先輩に言ったらC♯勉強しろと言われたんですが、
CとC++とC#ってどんな違いがあるんでしょうか?

123:デフォルトの名無しさん
07/06/27 12:28:23
なんでその時に先輩に直接聞かなかったの?

124:デフォルトの名無しさん
07/06/27 12:29:22
>>121
仕様を聞いてるのかコーディングを聞いてるのか

125:デフォルトの名無しさん
07/06/27 13:37:21
コーディングです、入力した文字をGoogleで検索させたいのですが

126:デフォルトの名無しさん
07/06/27 13:41:57
エンコードの必要な文字コードかどうか判定して、
必要ならエンコードすればいい。

127:デフォルトの名無しさん
07/06/27 13:47:55
>>125
まずUTF-8に変換して、1バイトずつ見て非ASCIIを変換。

128:デフォルトの名無しさん
07/06/27 13:59:30
仕様はわかってるらしいから、そういう説明じゃ足りないんじゃないのかな
数値を16進文字列にするやりかたがわからないとかじゃないの?

129:デフォルトの名無しさん
07/06/27 14:13:40
unsigned char にキャストして sprintf で %%%02X すりゃいいと思うけど、
sprintf を使う場合はバッファオーバーフローに注意だな。
別にこの程度なら自前で変換してもいいんだけどね。

130:デフォルトの名無しさん
07/06/27 14:32:11
>>126-129
ありがとうございます、>>128さんの言うとおりでした
>>129さんを参考にしてやってみます

131:デフォルトの名無しさん
07/06/27 14:47:25
質問です。
C言語って色々命令作れる前に、最初からhファイルを読み込んで使える、
いわばインストール時に標準搭載されている命令ってあるじゃないですか。studio.hのprintfやmath.hのsqrtとか
ああいう命令を分かりやすくどんな用法で使えばいいのかが全て網羅してある
本またはサイトはありますか?

132:デフォルトの名無しさん
07/06/27 14:49:28
>>131
標準ライブラリ関数でぐぐれ

133:デフォルトの名無しさん
07/06/27 14:53:42
>>131
JIS

134:デフォルトの名無しさん
07/06/27 15:15:53
>>131
命令て。
まず入門書くらい買え。

135:デフォルトの名無しさん
07/06/27 15:16:24
ああ、「本または」って書いてあるね。すまんすまん。
じゃ、「作ってわか(ry

136:デフォルトの名無しさん
07/06/27 17:01:07
>>132-135
ありがとうございます。参考になりました

137:デフォルトの名無しさん
07/06/27 20:05:46
文字列の数字を消したいプログラム(例えばAB1C9をABC)をつくりたいんですけど
下のソースではうまく消えません。もしよければどのようにすればいいか指導お願いします。
#include <stdio.h>

void kesi(char *str){
char c;

while(*str!='\0') {
c=*str;
if(c<'0'||c>'9'){ //数字でないならば
*str=c;
}
str++;
}
}
int main(void){
char str[100];

scanf("%s",str);

kesi(str);
printf("%s",str);

return 0;
}

138:デフォルトの名無しさん
07/06/27 20:12:34
消した分だけ後ろの文字列を前に詰めないといけない。
void kesi(char *str) {
  char *to = str;
  while (*str != '\0') {
    char c =*str;
    if (!isdigit(c)) {
      *to = c;
      to++;
    }
    str++;
  }
  *to = '\0';
}

139:デフォルトの名無しさん
07/06/27 20:23:48
138さん返信ありがとうございます。 char *toとしてますが、
またポインタ宣言しなければ、ダメなんでしょうか??
あと初心者なのでisdigitとかまだよくわからないです…。もしよければアドバイスおねがいします

140:デフォルトの名無しさん
07/06/27 20:27:42
宣言しなきゃコンパイルできないし、isdigitはググれば山ほど出てくる

141:デフォルトの名無しさん
07/06/27 20:30:57
137のソースではただのchar c; としてポインタで宣言しないでも
コンパイルは通ったんですけど…なぜポインタを使うのかよくわからなくて…。

142:デフォルトの名無しさん
07/06/27 20:32:55
138では、詰める前の文字を指すのにstrを使い、
詰めた後の文字を指すのにtoを使っている。

143:デフォルトの名無しさん
07/06/27 20:39:59
ポインタを使わないと、どこに文字をいれていいかわからないから

144:デフォルトの名無しさん
07/06/27 20:42:04
>>142さん、わかりやすかったです!ポインタの理由が理解できました!

145:デフォルトの名無しさん
07/06/27 21:15:37
>>98
でも有名な話ですよね。

146:デフォルトの名無しさん
07/06/28 00:02:40
キューのプログラムで
#define QUEUE 5
static int i = 0;
i = (i+1)%QUEUE;
で次の添字が得られる
とか書いてあるんですが、よくわかりません。
常にiは0である気がするんですが、どこが間違っています?

147:デフォルトの名無しさん
07/06/28 00:13:33
(0+1) % 5 == 1
(1+1) % 5 == 2
(2+1) % 5 == 3
(3+1) % 5 == 4
(4+1) % 5 == 0
(0+1) % 5 == 1

148:デフォルトの名無しさん
07/06/28 00:16:59
初期化とキーボード入力以外で文字列を一回で代入する場合はstrcat()しかないですよね?


149:デフォルトの名無しさん
07/06/28 00:21:51
そんなことないよ

150:デフォルトの名無しさん
07/06/28 00:22:37
>>147
ありがとうございます。
ですがもう少し。
a%bってあったら「aをbで割った余り」ですよね?
だとすると、
(0+1)%5 = 1%5 = 0?
ではないのですか?

151:デフォルトの名無しさん
07/06/28 00:23:13
>>149
何がありますか?
教えてください


152:デフォルトの名無しさん
07/06/28 00:23:30
って書いたらわかりました。
スレ汚しごめんなさい。

153:デフォルトの名無しさん
07/06/28 00:23:51
1÷5
1は5で割り切れないので終了。余り 1

154:デフォルトの名無しさん
07/06/28 00:24:31
strcpyとか

155:デフォルトの名無しさん
07/06/28 00:27:32
>>151
strncat,strcpy,ctrncpy,sprintf,sscanf
ざっと思いつくのでこの程度。
あと、可変個引数使うときにある、printfのやつ。
あんま使ったこと無いから忘れたけど、vsprintfだっけ?

156:デフォルトの名無しさん
07/06/28 00:28:03
>>152
どちらさまですか?

157:デフォルトの名無しさん
07/06/28 00:28:28
>>150
おぬしは間違いなくstaticについて理解していない。
なぜstaticが付いているのかを考えるのじゃ

158:デフォルトの名無しさん
07/06/28 01:02:20
質問です。
BASICのgotoみたいな命令はないのでしょうか?

159:デフォルトの名無しさん
07/06/28 01:02:33
Cで書いてコンパイルしたファイルを人に送ってもその人は実行できないんですか?
というかできなかったのです。一瞬だけ実行されてすぐ消えてしまいます。
どうすればいいかわかりますか?

160:デフォルトの名無しさん
07/06/28 01:05:29
>>158
gotoというそのまんまの命令がある
loop:
printf("test");
goto loop;
みたいに使う

>>159
コマンドプロンプト経由で使えばおk

161:デフォルトの名無しさん
07/06/28 01:06:30
あ、ちなみにif文で条件を満たしていなかったらmainの一番上まで戻るというのがやりたいのですが・・・・

162:デフォルトの名無しさん
07/06/28 01:10:52
>>160
そのファイル名のみを相手のコマンドプロントでコマンドさせるってことですか?

163:デフォルトの名無しさん
07/06/28 01:12:28
構造体とポインタはどちらのほうが理解するのが難しい?

164:デフォルトの名無しさん
07/06/28 01:13:18
>>161
int main(void){
start:
~いろいろな処理~
if(条件を満たしていない) goto start;


多分普通の人であれば
int main(void){
do{
~いろいろな処理~
}while(条件を満たしていない);

165:デフォルトの名無しさん
07/06/28 01:13:31
おつむのレベルによる。

166:デフォルトの名無しさん
07/06/28 01:14:04
>>162
渡したファイルはexe?
コマンドプロントで、exeのあるディレクトリに移動して実行すればオケ。

167:デフォルトの名無しさん
07/06/28 01:15:06
>>163
一般的にはポインタが難しいと言われる。

168:デフォルトの名無しさん
07/06/28 01:16:06
>>162
1.コマンドプロンプトを起動してもらう
2.コマンドプロンプトにexeファイルをドラッグアンドドロップしてもらう
3.Enterキーを押してもらう

これが一番手軽だと思う

169:デフォルトの名無しさん
07/06/28 01:17:32
>>167
ポインタって何に便利なの?

170:デフォルトの名無しさん
07/06/28 01:18:24
何に便利とか言い出すから一向に理解できないんだろ。

171:デフォルトの名無しさん
07/06/28 01:19:15
>>166
>>168
ありがとうございました

172:デフォルトの名無しさん
07/06/28 01:20:43
>>169
必要にならないと分かりにくいと思う

173:デフォルトの名無しさん
07/06/28 01:24:36
>>169
Nバイトの構造体配列をソートして並び替えることを考える。
このとき、Nバイトのコピーが頻繁に発生することになる。
構造体に対するポインタの配列として保存していた場合、ポインタのソートで済むことになる。
例えばポインタが4バイト、構造体が100バイト超とかで配列が1000超とかだとすれば
どちらが効率的かはわかるよね?

174:デフォルトの名無しさん
07/06/28 01:24:45
Cpad for Borland...ってやつで書いてるんですけどexeファイルがありません。
どうすればいいですか?
171と同一人物です

175:デフォルトの名無しさん
07/06/28 01:29:33
>>170
お前がその便利さを知らない、説明できないだけだろ?えせプログラマは
こんなところで質問者をたぶらかしてないで、へちょいプログラマで満足してろよ?

176:デフォルトの名無しさん
07/06/28 01:29:34
>>174
ファイルを保存している場所と同じ場所にexeファイルがあると思われ

177:デフォルトの名無しさん
07/06/28 01:30:55
>>175
へちょくないあなたがへちょい>>170の代わりに答えてあげてください

178:デフォルトの名無しさん
07/06/28 01:34:22
>>176
あるにはあるのですが、ドラッグアンドドロップはできませんし、
そのディレクトリに移動して ~.exe と打っても実行されません

179:デフォルトの名無しさん
07/06/28 01:40:02
>>178
コマンドプロンプトって何かわかってるか?

180:デフォルトの名無しさん
07/06/28 01:42:45
なんか全体的に黒いやつですよね?
わかってるつもりです

181:デフォルトの名無しさん
07/06/28 01:43:02
URLリンク(ja.wikipedia.org)

182:デフォルトの名無しさん
07/06/28 01:45:17
>>180
「notepad」って打ってメモ帳が起動するか?
ドラッグアンドドロップでフルパスが表示されて、エンター押して実行できると思ったんだけどなぁ

183:デフォルトの名無しさん
07/06/28 01:48:14
>>182
メモ帳はでてきます。
でもファイルをドロップしようとすると○の中に×が入ってるようなのが出てきて
できません

184:デフォルトの名無しさん
07/06/28 01:49:57
もしかしてvistaか?

185:デフォルトの名無しさん
07/06/28 01:50:51
>>183 ちょっwwwwwww伏字エロいwwwwwwwww
ティ○ポの中にオ×コが入ってるようなので とか妄想しちゃうぞwwwww

186:デフォルトの名無しさん
07/06/28 01:51:04
>>183
xpとかだとドラッグアンドドロップできないようになってるのかな?
じゃぁあきらめてフルパス(c:\cpad\test.exeみたいなやつ)を打って実行するべし
入力面倒だけど。

187:デフォルトの名無しさん
07/06/28 01:54:18
>>186
Vistaですよ。
かなりめんどいってことですね~~…
ありがとうございました

188:デフォルトの名無しさん
07/06/28 01:55:23
VistaはD&Dできないのか・・・ ひとつ勉強になった。

189:デフォルトの名無しさん
07/06/28 01:56:12
セキュリティ云々でできなくなったそうだ

190:デフォルトの名無しさん
07/06/28 01:57:04
なぁ~~に、こうすりゃええがな。XPを仮想PCにインストール。仮想PCでプログラミング
あっ武勇伝、武勇伝、武勇でんでんででんでんっ♪

191:デフォルトの名無しさん
07/06/28 02:41:46
ポインタが無かったらprintfすら・・・

192:デフォルトの名無しさん
07/06/28 02:43:50
ファイル操作も出来ないね

193:デフォルトの名無しさん
07/06/28 03:03:13
そもそもポインタって何?実体は?それが理解できていないとダメ。
URLリンク(ja.wikipedia.org)

194:デフォルトの名無しさん
07/06/28 07:10:08
2つの文字列を指すポインタ(例えばs1はABC、s2はABを指してる)で
下のソースコードだと2つの文字列が改行にいくまで繰り返すって言う意味ですかね?
while((*s1 != '\n') || (*s2 != '\n'))
{~~
s1++;
s2++}

195:デフォルトの名無しさん
07/06/28 07:12:03
(;^ω^)恐ろしいコード

196:デフォルトの名無しさん
07/06/28 07:18:58
すいません、ちょっと適当に書き込んだんで…。
ホワイルの中身の意味が知りたくて。

197:デフォルトの名無しさん
07/06/28 07:21:18
>>194
そのロジックだと、s1、s2の改行文字の位置が揃っていないと誤動作しそうだが。
#つーか、>194自身が挙げたサンプルで死亡確定だな。

198:デフォルトの名無しさん
07/06/28 07:57:55
>>194
s1にもs2にも改行コードないからプログラム起動して即吹っ飛ぶ。
s1がABC\n、s2がAB\nだったとしても一致しないのでやっぱり吹っ飛ぶ。
そのコードはs1とs2の改行コード位置が一致した場合にループ抜ける。

199:デフォルトの名無しさん
07/06/28 08:00:03
~~の中にきっとbreakが含まれてるんだ

200:デフォルトの名無しさん
07/06/28 08:45:23
C言語の精度って小数点以下いくつなんでしょうか??

201:デフォルトの名無しさん
07/06/28 08:49:39
そういう精度の決まり方じゃない。
これの IEEE 方式。
URLリンク(ja.wikipedia.org)

202:デフォルトの名無しさん
07/06/28 08:50:57
言葉が足りなかった。
IEEE 方式のマシンが多い、と。
別にエクセス 64 のマシンでも C は使える。

C かどうかで決まるものではなく、
CPU が何かによって決まるもの。

203:デフォルトの名無しさん
07/06/28 10:07:58
うん、それで、小数点以下いくつなんでしょうか??

204:デフォルトの名無しさん
07/06/28 11:11:40
>>203
>>201に書いてあるだろ

205:デフォルトの名無しさん
07/06/28 11:14:24
>>203
だから小数点以下いくつという形の精度じゃないと。
「浮動」小数点ってのは、そういう事だ。

206:デフォルトの名無しさん
07/06/28 12:07:34
有効桁数って、確か中学で習うよな…?

207:デフォルトの名無しさん
07/06/28 14:02:25
10進数だとIEEEの64ビット浮動小数点は小数点以下15桁ぐらいかな。
但しそれに掛ける10のn乗という指数が付くわけだが。


208:デフォルトの名無しさん
07/06/28 14:16:16
有効桁数15~16桁あたりだな。
本当は2進数で考えないといけないんだけど。

209:207
07/06/28 14:21:03
#include <stdio.h>
#include <values.h>

int main(void)
{
printf("%d, %Lg, %Lg\n", sizeof(long double), LDBL_MAX, LDBL_MIN);
printf("%d, %g, %g\n", sizeof(double), DBL_MAX, DBL_MIN);
printf("%d, %g, %g\n", sizeof(float), FLT_MAX, FLT_MIN);

return 0;
}

gcc 4.1.1 (i386-redhat-linux) で上記のソースをコンパイルして
動かすと結果はこう出る。

12, 1.18973e+4932, 3.3621e-4932
8, 1.79769e+308, 2.22507e-308
4, 3.40282e+38, 1.17549e-38

e から後ろの部分が指数で「掛ける10のn乗」を表す。
3.3621e-4932 は 3.3621 掛ける10の -4932 乗だ。

但し上記の結果は環境依存で、同じ gcc でもコンパイルオプションに
よっては変わってしまう。だから全てについてこうであるという保証は
できない。(values.h も gcc 独自のヘッダかも知れない)。ただ大雑把に
言えることは float よりは double、また double よりは long double
の方が多くの範囲をカバーできるかも知れないというだけだ。
(コンパイラによっては long double はないかも知れないが)。


210:デフォルトの名無しさん
07/06/28 17:00:08
ISO準拠の処理系ならlong doubleは必ずある。
209が使っている定数は<float.h>で提供されている。

211:デフォルトの名無しさん
07/06/28 17:01:51
long double は必ずある。
しかし、double と同じサイズのこともある。

212:デフォルトの名無しさん
07/06/28 17:10:52
putchar関数の意味がよくわかりません。
質問が抽象的すぎてごめんなさい

213:デフォルトの名無しさん
07/06/28 17:12:06
標準出力に文字(char)を一文字出力(put)する

214:デフォルトの名無しさん
07/06/28 17:42:10
…?
putchar('\n')
ってのはどういうことですか?

215:デフォルトの名無しさん
07/06/28 17:48:00
標準出力はわかるか?
 通常は画面だと思っていい。
\n はわかるか?
 改行コードをあらわすエスケープシーケンスだ

つまり、画面上で改行する、ということ

216:デフォルトの名無しさん
07/06/28 17:50:19
それは
printf("\n")
とは違うんですか?

217:デフォルトの名無しさん
07/06/28 18:07:45
printf は文字列を扱う
たまたまprintfで1文字出力するなら、putchar と同じ様になるな。
でも、printf の第一引数の文字列は % とか入ると違ってくるけどな。

218:デフォルトの名無しさん
07/06/28 18:08:09
"\n" は文字列
'\n' は文字


219:デフォルトの名無しさん
07/06/28 18:31:55
でもこの場合では意味することは同じなんですよね?
というか、putcharでできることはprintfでもできるんですか?


220:デフォルトの名無しさん
07/06/28 18:32:55
できるけど、効率は悪い。

221:デフォルトの名無しさん
07/06/28 18:35:29
それは打つ文字数が多くなるとかいうレベルの話ですか?
プログラムの内容には関係ないですよね?

222:デフォルトの名無しさん
07/06/28 18:36:12
あります。

223:デフォルトの名無しさん
07/06/28 18:40:48
printf は文字列を解析して
% が出てきたらどうするかとかいう処理を行ってる。
ま、出力自体のコストに比べりゃ微々たる差だがね。

224:デフォルトの名無しさん
07/06/28 18:41:45
適材適所だ
printfで全部まかなうのもいいし、使い分けるのもいい。
同じことができるなら、片方はまったく無駄だと思ってるなら
それはキミが初心者だから。

225:デフォルトの名無しさん
07/06/28 18:42:18
最近のコンパイラは賢いから、>>216なんかはputchar('\n');に最適化されるけどな。

226:デフォルトの名無しさん
07/06/28 18:43:47
そこまでするのか! っていう最適化が
意外とされてるんだなあ。

227:デフォルトの名無しさん
07/06/28 18:48:02
gccは printf("%s\n", "hoge"); を puts にしてくれたりするよね。

228:デフォルトの名無しさん
07/06/28 18:52:36
>>227
こういうのってどうやって知るんですか?
○は□に最適化されるとか

229:デフォルトの名無しさん
07/06/28 18:55:28
逆アセンブルしてもいいし、
両方のパターンを書いてコンパイルして
バイナリ比較して等しくなるかどうか確認したのでも。

230:デフォルトの名無しさん
07/06/28 18:57:45
すごい!

231:デフォルトの名無しさん
07/06/28 19:08:41
普通に gcc -S

232:デフォルトの名無しさん
07/06/28 19:31:12
特徴的なものは宣伝していたりマニュアルに書いてあったりもする。

233:デフォルトの名無しさん
07/06/28 20:31:57
スーパーハカーは自分で逆アセして知る。
一般人は掲示板で知る。

234:デフォルトの名無しさん
07/06/28 21:16:58
確かに。
普通のハッカーなら掲示板でヒントを読んで自分で試して知るだろうな。

235:ぴっころ
07/06/28 21:32:59
突然お邪魔致します。ぴっころです。
2進数で表した時、2の倍数は最下位ビットが0になる事が分かりました。
では3の倍数は何かこのような決まりはあるのでしょうか?

236:デフォルトの名無しさん
07/06/28 21:33:54
3進数で3の倍数は最下位ビットが0

237:ぴっころ
07/06/28 21:36:37
言葉足らずで申し訳ありません。
2進法で表した時です。

238:デフォルトの名無しさん
07/06/28 21:37:00
ぴっころって誰だよ。

239:デフォルトの名無しさん
07/06/28 21:38:42
>>235
ヒント1 : 2の倍数とは偶数のこと
ヒント2 : 3の倍数を並べてみよう

240:デフォルトの名無しさん
07/06/28 21:45:18
2 進法では別に 3 (11) の倍数に特徴はないなあ。
3 (11) で割ったら余りが 0 になるということくらいだな。

241:デフォルトの名無しさん
07/06/28 21:45:44
>>235
数学の問題だなあ。

3で割ると余り0

なんてのはあまり意味ないか・・・。

10進数で表した時に各桁を足して3の倍数ならそれは3の倍数
(123は1+2+3=6なので3の倍数)なんてのもあるが、関係ないね。


242:デフォルトの名無しさん
07/06/28 21:51:23
3の倍数を2進法で表したものは、正規表現/(0|1(00)*1)*/にマッチする。

243:ぴっころ
07/06/28 21:51:33
>>238 ドラゴンボールのぴっころから取らせて頂きました。
>>239
   11
  110
 1101
 1100
 1111
10101
11000
11011
繰り返しもあるような無いような・・・。
ちょっと僕のキャパでは厳しいです・・・。

244:デフォルトの名無しさん
07/06/28 21:53:59
>>243
18はどこへ消えた

245:デフォルトの名無しさん
07/06/28 21:54:19
>>242
発想はいいがちょっと惜しいな。

1000000001の間に11を入れて1011000001も3の倍数だ。

246:デフォルトの名無しさん
07/06/28 21:55:49
>>243
うそだ!
NHKのじゃじゃまる、ぴっころ、ぽろりのぴっころだろ?

247:デフォルトの名無しさん
07/06/28 22:06:53
bccってのをXPで使ってたんですが、vistaに変えたんですが環境設定ソフトでPATHの設定が出来ませんってのが出るんですが・・・・
vista出使える環境設定ソフトかPATHの設定方法を教えてください。

248:ぴっころ
07/06/28 22:08:04
   11
  110
 1101
 1100
 1111
10010
10101
11000
11011
11110
11→10→01→00
・・・。
ちょっときついです。
教えてもらえると助かります。

249:デフォルトの名無しさん
07/06/28 22:09:42
1101のどこが3の倍数なんだよ。

250:デフォルトの名無しさん
07/06/28 22:11:40
 1101
 1100

数が減ってるな
まぁ1001の書き間違いだろうからそれくらい勘弁してやれ

251:デフォルトの名無しさん
07/06/28 22:12:59
>>247
マイコンピュータのプロパティの中にない?
XP/2003まではそこにあるんだけど。

252:デフォルトの名無しさん
07/06/28 22:23:37
6bitでカルノー図書いてみたんだが一切簡単化できねーから周期性は無い臭い

253:デフォルトの名無しさん
07/06/28 22:30:16
>>251
システムのプロパティの中に環境変数でpathってのは見つけましたが違います?
マイコンピュータでプロパティやるとシステムのプロパティかCドライブのプロパティあたりしか出てきません。

254:デフォルトの名無しさん
07/06/28 22:31:30
3の倍数で偶数に該当するものをリストアップしてやんよ
6 000000110
12 000001100
18 000010010
24 000011000
30 000011110
36 000100100
42 000101010
48 000110000
54 000110110
60 000111100
66 001000010
72 001001000
78 001001110
84 001010100
90 001011010
96 001100000

255:デフォルトの名無しさん
07/06/28 22:32:08
>>253
たぶんそれでおk。

256:デフォルトの名無しさん
07/06/28 22:35:43
>>255
それをどうすればいいかわかります?

257:デフォルトの名無しさん
07/06/28 22:39:43
すみません、学校の電卓プログラム問題で、わからない事があるので教えてください。

char *get_int(char *b, char *i)
{
int sign, num = 0;
if(*b == '-')
{
sign = -1;
b++;
}
else sign = 1;

/*初期値*/
*i = 0;
/*スペーススキップ*/
SKIP(b);
/*十進数文字である間繰り返し*/
while (isdigit(*b)) {
num++;
/*これまでに得た整数の位取りアップ*/
*i *= 10;
*i += (*b - '0');
b++;
}
/*十進数文字がなければエラーリターン*/
if (num == 0) b = NULL;
return b;
}

上記は自分がわかる範囲でマイナス演算子を付け加えたのですが、
これからどうしていいのかわからないので、
どなたか教えてください。よろしくお願いします。

258:デフォルトの名無しさん
07/06/28 22:42:35
> これからどうしていいのかわからない
だったら、それはお前のわかる範囲ではない。

259:デフォルトの名無しさん
07/06/28 22:43:02
>>257
その一部じゃさっぱり。うpロダ使って全体をうpせい。それから実行結果の例も書いてくださいな

260:デフォルトの名無しさん
07/06/28 22:44:16
(*b == '-')

かわいい

     ∧∧
~(*b == '-') <ニャー
  >>  >>

261:デフォルトの名無しさん
07/06/28 22:46:19
>>248
全ての3の倍数は、その数を3で割っても最下位ビットは変わらない。

262:デフォルトの名無しさん
07/06/28 22:46:26
x = ( 'A'); やる気ねぇ~顔

263:ぴっころ
07/06/28 22:47:09
>>254
なるほど。
6 00 00001 10
12 00 00011 00
18 00 00100 10
24 00 00110 00
30 00 00111 10
36 00 01001 00
42 00 01010 10
48 00 01100 00
54 00 01101 10
60 00 01111 00
66 00 10000 10
72 00 10010 00
78 00 10011 10
84 00 10101 00
90 00 10110 10
96 00 11000 00
下二桁 00→10の繰り返し、
下二桁より上 1ずつ増えているのは分かりました。 
ですが、これで1000000001の間に11を入れて1011000001も3の倍数だ。
が何故言えるのでしょう?あと、3の倍数に偶数が入ってくる理由も・・・。

264:デフォルトの名無しさん
07/06/28 22:47:21
+= (*b - '0'); < 私を置いていくにゃ~

265:デフォルトの名無しさん
07/06/28 22:48:53
>>263
それは3の倍数じゃなくて6の倍数でわ?

3の倍数 かつ 偶数 = 6の倍数ですよ

266:デフォルトの名無しさん
07/06/28 22:49:05
ファイルを指定した場所へ移動するにはどうしたらいいですか?

267:デフォルトの名無しさん
07/06/28 22:49:48
>>256
BCCをインストールしたディレクトリのBinディレクトリとかのフルパスをPATHとかに追記する(セミコロンでつなげる)

268:デフォルトの名無しさん
07/06/28 22:51:18
>>263
それ6の倍数並べてるだけじゃん

269:デフォルトの名無しさん
07/06/28 22:53:36
>>263
単にそれは、例えば10進法で、15の倍数を並べたら一の位に0と5が交互に現れる、

ってことを言ってるのと同じだよ

270:デフォルトの名無しさん
07/06/28 22:54:11
>>267
どもです。
やってみます。

271:デフォルトの名無しさん
07/06/28 22:57:07
3の倍数、偶数抜き。何か法則がある?
3 000011
9 001001
15 001111
21 010101
27 011011
33 100001
39 100111

272:デフォルトの名無しさん
07/06/28 22:59:31
A(n) = A(n-1) + 6

273:デフォルトの名無しさん
07/06/28 23:13:28
>>235
3の倍数は、奇数ビット目の1の数と、偶数ビット目の1の数の差が、3の倍数になる。
ただし、差が3の倍数といっても数が小さいうちはずっと0。

例:39
100111、奇数ビット目=2、偶数ビット目=2、差=0

274:デフォルトの名無しさん
07/06/28 23:25:45
分からないなら、10進数で同じコトを考えてみればいいよ

10進数だと、10の倍数は1の位が0だということが分かりました。
では11の倍数は、何か特徴があるのですか?

11
22
33


1の位が1ずつ増えていくことが分かりました!


…この結果で何か得られることはあると思うか?

275:デフォルトの名無しさん
07/06/28 23:49:23
unsigned char型の配列にbmpの画素の値を読みます。
これをソートするんですが、
ソートする関数の引数のところを
void quicksort(char *array,int lower, int upper)
とするとソートが正しくないことがあります。
void quicksort(unsigned char *array,int lower, int upper)にするとうまくいくようなきがするんですが、
あってますか?

276:デフォルトの名無しさん
07/06/28 23:51:59
とりあえず関数のシグネチャをプロトタイプにちゃんとあわせなさい

277:デフォルトの名無しさん
07/06/28 23:54:41
すいません。よくわからないです。
学校の課題なんですが、unsigned char型は問題ですでにつくられていて、
それを改造してるんです

278:デフォルトの名無しさん
07/06/28 23:59:43
それはきっとcharが符号付だからということなのだろう。

279:デフォルトの名無しさん
07/06/29 00:03:08
なるほど。
void quicksort(unsigned char *array,int lower, int upper)にすれば
ソートはちゃんとうごいてますか?

一応実際の画像のソート状況を確認したら平気っぽかったですが

280:ぴっころ
07/06/29 00:40:39
ぴっころです。答えて下さった方々ありがとうございました。
失礼します。

281:デフォルトの名無しさん
07/06/29 00:44:19
3の倍数は1が常に偶数個

282:デフォルトの名無しさん
07/06/29 01:02:45
定数はdefine, const, enumのどれで指定するのが定跡でしょうか?


283:デフォルトの名無しさん
07/06/29 01:08:23
定数じゃないのばっかじゃん

284:デフォルトの名無しさん
07/06/29 01:09:18
?

285:デフォルトの名無しさん
07/06/29 01:12:54
て・・・定石なんてないのさ

286:デフォルトの名無しさん
07/06/29 01:23:21
テキストファイルをよみこんでたとえばファイルに
cccchaa
というのがかいてあったら下のような感じで画面に表示したいんですけど
どんなソースコードですかね?アルゴリズムがピンとこないのでお願いします。
c→4 h→1 a→2

#include <stdio.h>

int main(void){
FILE *fp,*fut;
char sfn[80];
char yomi[256],mawasi[256];
int i;

scanf("%s",sfn);

if((fin=fopen(sfn,"r"))==NULL)return -1;
fout=fopen("comp","w");
i=0;
while((yomi[i]=fgetc(sfn))!='\0'){

i++;
}
fclose(fp);
fclose(fut);
return 0;
}

287:デフォルトの名無しさん
07/06/29 01:29:15

・読んだ文字が前回と異なっていたら
カウンタをリセット(0にする)。読んだ文字を覚えておき、カウンタをインクリメント
・読んだ文字が前回と同じならそのままカウンタをインクリメント

288:デフォルトの名無しさん
07/06/29 02:33:50
>>281
10101 (10進数で21)の時点で既に違うんだが。

一般的には、>>273が正解
もうこの話題終わってるけどね

289:デフォルトの名無しさん
07/06/29 03:16:46
構造体のint型の要素と、構造体外のchar型の変数とstrcmpで比較したいのですが
int型の要素をどうchar型に変換するのかわかりません。
何か良い方法はありますか?変換は逆でも構いません。

290:デフォルトの名無しさん
07/06/29 03:18:17
atoi とか sprintf とか

291:デフォルトの名無しさん
07/06/29 03:24:59
先日C言語の勉強をしていたら以下のプログラムがありました。
なんで、プログラムを実行して、この結果が出てくるのか全く
わかりません。プログラムの結果がなぜそうなるのか内容を出
来るだけ詳しく教えてください。初心者なのでなるべく丁寧に
お願いします。もし、プログラムのタイプミスがあったらすい
ません。

#include<stdio.h>
#include<string.h>
main(){
char c[3];
char s1[]="abcdefghijklmnopqrstuvwxyz"
char s2 [100];
s2[0]='\0';
printf("s1 inital value:\"%s\"\n",s1)
printf("s2 inital value:\"%s\"\n",s2)
if cstrcmp(s1,s2)==0){
printf("s1==s2\n");}
else{printf("s!=s2\n");}
printf("Push ENTER to proceed.");
fgets(c,2,stdin);
strcpy(s2,s1);
printf("s1 current value:\"%s\"\n",s1);
printf("s2 current value:\"%s\"\n",s2);
if(strcmp(s1,s2)==0)
{
printf("s1==s2\n");}
else{prinf("s1!=s2\n");}
}




292:デフォルトの名無しさん
07/06/29 03:48:27
この結果ってどの結果

293:デフォルトの名無しさん
07/06/29 05:51:18
「この」結果

294:デフォルトの名無しさん
07/06/29 06:07:23
sayonara

295:デフォルトの名無しさん
07/06/29 07:43:16
さよならbyebye~元気でいてね
年に二回くらいのクソレスならキャッチするよ~

296:デフォルトの名無しさん
07/06/29 09:46:49
2の倍数はある数を2倍したもの
2倍するとは、2進数だと左に1ビットシフトしたもの
ゆえに、一番下のビットは必ず0になる。

3の倍数もこれに習ってやってみ。

297:デフォルトの名無しさん
07/06/29 10:40:10
291です
なんでENTERを押すと次の実行結果が表示されるのな何でですか?

↑のも質問ですがこのような感じの内容を教えてください

298:デフォルトの名無しさん
07/06/29 10:56:41
>>297
s1 inital value:"abcdefghijklmnopqrstuvwxyz"
s2 inital value:""
s!=s2
Push ENTER to proceed.
s1 current value:"abcdefghijklmnopqrstuvwxyz"
s2 current value:"abcdefghijklmnopqrstuvwxyz"
s1==s2

これのどこがわからないの

299:デフォルトの名無しさん
07/06/29 11:56:31
>>291
stdio.h には、C標準ライブラリのコンソール出力関数のプロトタイプ宣言があり、
そこで宣言されているprintfを使っているから、結果が出力されるんです。

300:デフォルトの名無しさん
07/06/29 12:32:32
>>291
学生?俺もだけど
何の関数を使うためにstring.hをインクルードしているか?
strcmp(),strcpy関数はどういう関数か?
fgetsはどういう関数か?

を調べればたぶんわかると思うよ。
if構文とか'\0'とかprintf()とかエスケープ文字とか
文の終わりに;をつけるとか(付け忘れが多すぎたからあえて指摘)
くらいは知っているだろうし、人にきくほど難しいものではないとおもう。

301:デフォルトの名無しさん
07/06/29 12:43:42
>>291
>char c[3];
>fgets(c,2,stdin);
こんな阿呆なコード、誰が書いたんだ?

302:デフォルトの名無しさん
07/06/29 12:46:17
本質的じゃないトコにつっこむのもなんだかなー

303:デフォルトの名無しさん
07/06/29 13:11:38
だって、阿呆なんですもの

304:デフォルトの名無しさん
07/06/29 14:09:38
その程度のことを見つけてアホアホ得意気になる香具師は痛々しい。

305:デフォルトの名無しさん
07/06/29 14:21:40
まあ、fgets のサイズ指定は
ヌルターミネータ込みのバッファサイズを指定することくらいは
ちゃんと知っておいた方がいいとは思う。

306:デフォルトの名無しさん
07/06/29 14:32:10
しぜおf使おうぜ?

307:デフォルトの名無しさん
07/06/29 17:55:27
#include <stdio.h>
int main(void)
{
int x,y,z,s;
printf("何cmから:"); scanf("%d",&x);
printf("何cmまで:"); scanf("%d",&y);
printf("何cmごと:"); scanf("%d",&z);
s = (x - 100)*0.9;
x = x + z;
for (; x <= y; s)
printf("%dcm %.2fkg\n",x ,(double)s);
return 0;
}

これだと x+5 についての場合のみ永久にブァーッと出てきます。
x~yの範囲内にするにはどうしたらいいですか?

308:デフォルトの名無しさん
07/06/29 18:02:10
for (; x <= y; x += z) {
double s = (x - 100) * 0.9;
printf("%d cm %.2f kg\n", x, s);
}

309:デフォルトの名無しさん
07/06/29 18:12:13
>>308
ありがとうございました。
この場合繰り返しが行われてる式は
x += z と double s =(x - 100)*0.9 と printf("%dcm %.2fkg\n",x,s)
の3つですよね?繰り返したい式が2つ以上あるときは
forの()の中に1つ書いて、()を閉じてから残りの繰り返したい式を書くということでいいんですか?



310:デフォルトの名無しさん
07/06/29 18:14:42
procedure a: Integer
var
int C;
beigin
a := 0;
end;
がうまくイカなんだがなんだろ

311:デフォルトの名無しさん
07/06/29 18:22:01
beigin → begin
つーかこれPASCAL・・・

312:デフォルトの名無しさん
07/06/29 18:44:38
Pascal って人間は考える葦とかいっていた人か?

313:デフォルトの名無しさん
07/06/29 18:47:07
さつま芋とか水で洗って食う動物じゃね?

314:デフォルトの名無しさん
07/06/29 18:52:22
int* p; /*ポインタのデータ*/

int a = b/*p; /*b÷(pの先のデータ)→a*/;

割り算ができね

315:デフォルトの名無しさん
07/06/29 18:53:22
アライグマパスカル、うが

316:デフォルトの名無しさん
07/06/29 18:53:39
/ と * の間に空白開ければいいじゃん。

317:デフォルトの名無しさん
07/06/29 18:55:18
今でも、糞つまんないCPUのロジックは大方割り算なのは確かだw

318:デフォルトの名無しさん
07/06/29 19:24:53
今までで、プログラムって訳に起つよな(^^って思えたのは
perlとrubyとMLとエクセルで使うVBAくらい。
C++とかJavaは嫌な思いしかさせてくれない。

319:デフォルトの名無しさん
07/06/29 19:32:41
で、Cはどこ?

320:デフォルトの名無しさん
07/06/29 19:34:11
here

321:デフォルトの名無しさん
07/06/29 19:38:48
Cは昔のアセンブラみたいなもん。
良いも悪いもない

322:デフォルトの名無しさん
07/06/29 20:28:23
ガウシアンフィルタを作りたいんですが、質問させてください

フィルタをかけたい画素を中心に3×3のマスクをつくるとします。

URLリンク(teo.sourceforge.jp)
みたいなガウシアンフィルタを作って、この行列の各要素の数値を
マスクの行列の同じ場所の画素値にかけて、
その合計で中心画素の値を割ればいいんですか?

マスクがとしたら
1 3 3
4 6 2
1 2 3

1×0.07 + 3×0.12+・・・+3×0.07=SUM

6/SUMがフィルタをかけた後の値ですか?


323:デフォルトの名無しさん
07/06/29 20:32:30
>>321
アセンブラに昔も今もあるのかよ

324:デフォルトの名無しさん
07/06/29 20:38:06
>>323
Cの話でしょ?w

325:デフォルトの名無しさん
07/06/29 21:52:45
>>322
そうだと思うけど、まずはやってみればいいんでね?

326:デフォルトの名無しさん
07/06/29 22:33:26
>>322
そのコーディング方法が分からないんで無ければ
画像処理スレかどっかで聞いた方がいいんでね?

327:デフォルトの名無しさん
07/06/30 00:14:23
最近ちょっとさわり始めたのですが、
memcpyのように引数にvoid*をとるとき、どうやってvoid*の中の物を
取り出すんですか?普通に配列のように[0]とかってやってもエラーになるし…

328:デフォルトの名無しさん
07/06/30 00:14:47
適当なポインタ型にキャストすればいい。

329:デフォルトの名無しさん
07/06/30 00:48:34
>>328
その場合、中身が構造体などの場合にはどうしたらいいんでしょうか?
char*などにキャストした後から戻せるのでしょうか?

330:デフォルトの名無しさん
07/06/30 00:54:00
構造体でキャストすればいいんじゃ

331:デフォルトの名無しさん
07/06/30 00:57:58
>>330
該当する構造体でキャストすればいいのはわかるのですが、
memcpyのようになんでもコピーできるようにするにはどうしたら
いいのかなと思ったのですが、これはあまりmemcpyを
使わない方がいいと言われるのと何か関係があるのでしょうか?

332:デフォルトの名無しさん
07/06/30 01:01:30
そんなもんchar*にキャストして1バイトずつ読み書きしているだけと思っていればいい。
実際には高速化するため複数バイトずつ読み書きするなど工夫しているいるけど。

333:デフォルトの名無しさん
07/06/30 01:51:53
>>332
参考になりました!
ありがとうございます。

334:デフォルトの名無しさん
07/06/30 02:08:51
まぁ、間違っても構造体のコピーにmemcpy()なんて使うなよ。

335:デフォルトの名無しさん
07/06/30 02:09:15
表示した画像を消すときはどんな関数を使いますか?

336:デフォルトの名無しさん
07/06/30 02:11:56
CLS 3

337:デフォルトの名無しさん
07/06/30 02:15:50
>>336
それってBASICじゃないですかw

338:デフォルトの名無しさん
07/06/30 02:18:01
あ、Cで表示した画像を消すときはどんな関数を使いますか?

339:デフォルトの名無しさん
07/06/30 02:20:43
画像を表示するのにどんな関数使ってますか?

340:デフォルトの名無しさん
07/06/30 02:21:15
>>338
真っ白な画像を用意して、消したい画像の代わりに表示してはいかがでしょう。

341:デフォルトの名無しさん
07/06/30 02:35:45
もはやCのスレではなくなったな

342:デフォルトの名無しさん
07/06/30 03:05:44
exit(1);

343:デフォルトの名無しさん
07/06/30 03:36:59
goto >>343;

344:デフォルトの名無しさん
07/06/30 07:38:21
教えてください。
main関数から、ある関数に引数を渡す場合は、次のような
感じで渡してもOKですか?ダメみたいなんすが、その理由が
わからないです。
もちろん、実行する場合は引数を指定します。 a.out A.txt のように。

extern int p(char *filename)

int main(int argc, char*argv[])
{

p(argv[1]);

}


345:デフォルトの名無しさん
07/06/30 07:41:09
&argv[1]
argv

346:デフォルトの名無しさん
07/06/30 07:51:38
>>344
どうダメなの? それでいけると思うのだけど。

>>345
プロトタイプ宣言と型が合いません。

347:デフォルトの名無しさん
07/06/30 07:52:44
単にダメって言うんじゃなくて具体的にどんなエラーがでたとかさ・・・

348:デフォルトの名無しさん
07/06/30 07:58:13
パス指定なしのファイル名だけ書いていて、起動ディレクトリと違うところにあって見つからないとか。

349:デフォルトの名無しさん
07/06/30 08:04:09
申し訳ないです。
セグメンテンションフォルトです。

350:デフォルトの名無しさん
07/06/30 08:09:50
問題があるのはp()の方だろ

351:デフォルトの名無しさん
07/06/30 08:13:32
>>350
なるほど、呼び出す先のp関数がわるのかなぁ。
引数でわたってきたファイル名をfopen()を呼んでいるだけなんですが。

352:デフォルトの名無しさん
07/06/30 08:19:35
微妙に日本語がおかしいのが気になる

353:デフォルトの名無しさん
07/06/30 08:21:27
どうもあがとうございました。
呼び出す先のp関数が悪いみたいです。
if (f=fopen(filename,"f"))

"f" -> "r" ですね。すいませんでした。

このようなif文で代入はOKなのかなぁ?

354:デフォルトの名無しさん
07/06/30 09:05:16
>>353
間違ってはいないがお勧めしない。
Cのエキスパートを自称するロートルは、しばしば「代入と比較を一行で書けるのがCらしさだ」とのたまうが、
バグの混入の原因になりかねないし、第一必ずしも読み易くない。

355:デフォルトの名無しさん
07/06/30 10:55:48
ifの中で代入すると大抵警告が表示されるしな。
if ((f = fopen()) != NULL)とするやつもいるが俺は好きになれない。

356:デフォルトの名無しさん
07/06/30 11:02:07
80カラムに収まるならついやっちゃうな・・・

f=NULL;
f=fopen("ようじょ", "w");
if(f==NULL){
 puts("ひゃぅん?");
}
ここまでするとクドイ感じもするが・・・

357:デフォルトの名無しさん
07/06/30 11:03:31
fopenって失敗したらNULL返すんだからf=NULL;は要らなくね?

358:デフォルトの名無しさん
07/06/30 11:14:05
我が家ではこうしてますね・・・
基本的に使う前と使った後はクドクドと初期化

359:デフォルトの名無しさん
07/06/30 11:17:27
よくこういうふうにやる
FILE* fp = fopen();
if (f)

360:デフォルトの名無しさん
07/06/30 11:20:07
FILE* fp;
FILE *fp;

この二つの違いって何かあるの?
単なるコーディング流儀の違い?

361:デフォルトの名無しさん
07/06/30 11:22:46
流儀の違い

362:デフォルトの名無しさん
07/06/30 11:22:50
そう、流儀の違い。
構文上は、FILE*fp;もFILE * fp;も可能。

363:デフォルトの名無しさん
07/06/30 11:23:41
FILE
*
fp
;
だっていいZE

364:デフォルトの名無しさん
07/06/30 11:23:58
>>360
前者はC++使いに多く、後者はC使いに多い。
両方使う私は、だからと言うわけではないがFILE * fp = fopen(...);と書く。

365:デフォルトの名無しさん
07/06/30 11:33:59
for文とwhile文の明確な違いって何ですか?
たとえばfor文ではできるけどwhile文ではできないこととか・・・。

366:デフォルトの名無しさん
07/06/30 11:38:13
continue 時にも for(A;B;C) の C が実行されるってのが
while だと実現が面倒。

367:デフォルトの名無しさん
07/06/30 11:41:46
バッファの割当の数とか数字を#defineしてしまうのは、なぜですか?マジックナンバーを使いたくないのはわかるのですが、
その都度malloc、もしくはreallocしてはいけないのですか?

または、そのバッファの割当の数はどうやって決まるのですか?

どうもCを書いていると全部mallocしたくなるのですが、C言語のハッカーさん教えてください。

368:デフォルトの名無しさん
07/06/30 11:41:58
for文の括弧内の式はどれも省略可能。
while文の括弧内の式は省略不可能。

369:デフォルトの名無しさん
07/06/30 11:42:12
forは式を省略できるがwhileは省略できない。
なので、無限ループはwhile (1) {...;}ではなくfor (;;) {...;}を使う。

370:デフォルトの名無しさん
07/06/30 11:47:09
もうしわけないです、コーディングは以下の理解でよいでしょうか。

だめ:×
if (f=fopen(filename,"r"))

よい:○
f=fopen(filename,"r");
if(f!=NULL)


371:デフォルトの名無しさん
07/06/30 11:47:14
>>367
malloc したら free しないとダメじゃん。
管理の手間が増えるからなるべくやりたくない。
必要な時はするがね。

ガベコレのある言語と一緒に考えない方がいいよ。

372:デフォルトの名無しさん
07/06/30 11:48:39
>>370
「だめ」ではなくて、「好ましくない」程度で。
他人が書いたものを読むときに、「だめ」と思わずに許容してあげましょう。

373:デフォルトの名無しさん
07/06/30 11:48:56
>>370
文法上の問題はないが推奨されない:△
if (f=fopen(filename,"r"))

よい:○
f=fopen(filename,"r");
if(f!=NULL)

374:デフォルトの名無しさん
07/06/30 11:50:26
whileでは無限ループはできないんですか?

375:367
07/06/30 11:54:14
>371

どもです。なるほど。確かにガベコレある言語でしかマジメに開発したことがないので、納得できていませんでした。
別物ですね。別物。

でも、その際に使用するMAX_BUF_NUMとかは一般的に1024とか使用されているのですが、何ゆえその数字が決まるのですか?
質問ばかりですいません。

376:デフォルトの名無しさん
07/06/30 12:07:15
1KB程度でいいんじゃねって感じじゃね?

377:367
07/06/30 12:15:56
> 376
サンクス

しかし、1KBにするか4KBにするかといったことに悩むんですよね。
作りたいアプリの仕様が1KB程度だから、ここは1KBにするか、と考えるのは普通のような気もするのですが、
アプリを作りたいのではなくて、自分用の便利ライブラリを作成する際にどの数字を採用するか、
と考えるのが非常につらい。

つか、こんな考え方の俺ってガベコレ言語を使いすぎですか。

378:デフォルトの名無しさん
07/06/30 12:20:37
ライブラリならバッファの大きさなんてユーザから指定を受け付けるものに決まっているだろ。

379:デフォルトの名無しさん
07/06/30 12:23:07
C が嫌なら C++ で string とか vector とか使えばいいよ。

380:デフォルトの名無しさん
07/06/30 12:23:59
>>369
for(;;) は可読性が乏しいから while(1) の方が好きだな。

381:デフォルトの名無しさん
07/06/30 12:25:18
>>372 373
ありがとうございました。

382:デフォルトの名無しさん
07/06/30 12:33:22
>>377
Cでライブラリ作るときは内部でバッファを抱えない。
(char *buf, size_t bufsize)
で受けるのがお約束。
高級にやりたいならmalloc, freeでやってバッファがあふれたらreallocで拡張。
手を抜きたいなら#defineで固定バッファであふれたらASSERTでとめるか放置してバッファオーバーフロー。
大体この三種類だな。重要度とパフォーマンスを秤にかけて好きにしとけ。
1kbと4kbのどっちが妥当かなんて答えようがない。

383:367
07/06/30 12:45:56
>> 382, 379, 378
どうもありがとうございました。

後は、自分で考えることができそうです。

ついでにもう一つ聞いてもいいですか?
文字列の配列を作るときに、
ダブルポインタを採用するのがいいか、リンクリストを採用するのがいいか迷っています。

どちらがお勧めですか?

384:デフォルトの名無しさん
07/06/30 12:48:35
それは定数か? それとも実行中に作りたいのか?

385:デフォルトの名無しさん
07/06/30 12:50:49
>>383
使い方によるだろ
よくわからないならダブルポインタの方が扱いやすいかな?

386:デフォルトの名無しさん
07/06/30 12:55:20
リストなんて糞なもん使わずにchar**な配列作っとけ

387:367
07/06/30 13:02:55
>>385, 384

ありがとうございます。

構造体でどちらで定義しようかな、と考えていました。
typedef struct {
char *dstr;
int dlen;
} DATUM;

typedef struct {
DATUM *ptr;
int size;
} DATUMLIST;
とするか、

typedef struct _DATUMLIST {
char *dstr;
char dlen;
struct _DATUMLIST *next;
} DATUMLIST;

とするか迷っていたのです。まぁ、迷わずに実装してしまえば、どちらでもいいような気がしますが。


388:367
07/06/30 13:06:07
>>386
それも考えました。
無駄に考えるのがよくないのですかね。
この際、char**な配列の方が楽のような気がしてきた。

389:デフォルトの名無しさん
07/06/30 14:08:33
int型を指すポインタ int* p;
一次元ポインタ配列 int** p;
二次元ポインタ配列 int*** p;
三次元ポインタ配列 int**** p;

って風にスターを増やしていってもいいの?

390:デフォルトの名無しさん
07/06/30 14:09:42
#include <stdio.h>
int multiple(int, int);

main()
{

}
int multiple(int x, int y)
{
if(y%x == 0)
return 1;
else
return 0;
}

multiple関数を使って二つの整数を比較し
二つ目の整数が一つ目の整数なら1(真)、
それ以外なら2(偽)を返すというプログラムを作りたいのですが
main関数をどうすればいいのかわかりません

391:デフォルトの名無しさん
07/06/30 14:11:44
>>389
int** p; は int* 型を指すポインタだ。
それが必要になれば使う。普通に使う。

392:デフォルトの名無しさん
07/06/30 14:12:34
>>390
main 関数で何がしたいのか分からないので
こちらにもどうすればいいのか分かりません。

393:デフォルトの名無しさん
07/06/30 14:14:28
>>389
スターじゃなくてアスタリスクじゃね?

394:デフォルトの名無しさん
07/06/30 14:16:08
普通にどちらも使う。
フォントによっては実際に星型なってることもあるし。

395:デフォルトの名無しさん
07/06/30 14:16:22
>>391
ありがとう

>>390
if(y%x == 0)
ってyに0が入ってきたらy%xは必ず0になって比較にならないんじゃね?

396:デフォルトの名無しさん
07/06/30 14:20:45
>>395
0 はあらゆる数の倍数(0 倍)だから動作的に問題ない。

397:デフォルトの名無しさん
07/06/30 14:23:12
xが0の時のほうがまずいよな。

398:デフォルトの名無しさん
07/06/30 14:30:47
まあ、どこまでエラー処理するかは状況次第だな。
assert するだけにしておくか、
それともエラー時に何か特別な処理をしてエラー復帰するか。

399:390
07/06/30 15:24:33
main関数では、変数を二つスキャンして
それをmultiple関数に渡し、multipleでの結果を
main関数に返してプリント
というふうにしたいです

400:デフォルトの名無しさん
07/06/30 15:27:56
そう書けばいいんじゃないかな。

401:390
07/06/30 16:26:43
その書き方がわからなくて困ってます

402:デフォルトの名無しさん
07/06/30 16:30:21
そうですか。

403:デフォルトの名無しさん
07/06/30 16:30:50
エラー出てもいいからとりあえず書いてみれ。
それでも分からなければ、
自分でどうやってみたかをここにコピペしてみれ。

404:390
07/06/30 17:12:58
どうしてこんなにお願いしているのに教えてくれないんですか。
もったいぶらないで今すぐに教えてください。

405:デフォルトの名無しさん
07/06/30 17:20:13
#include <stdio.h>
int multiple(int, int);

int main(void)
{
int x, y;
scanf("%d %d",&x,&y);
if(x == 0) return 1;
printf("%d\n",multiple(x,y));
return 0;
}
int multiple(int x, int y)
{
return (y%x!=0)+1;
}
二つ目の整数が一つ目の倍数なら1 と解釈してやってみた
つかここ宿題スレだっけ?

406:デフォルトの名無しさん
07/06/30 17:20:22
うわ・・・

407:390
07/06/30 17:21:03
#include <stdio.h>
int multiple(int, int);
main()
{
int a,b;
scanf("%d%d\n", &a, &b);
printf("%d\n", multiple(a,b));

return 0;
}
int multiple(int x, int y)
{
if(y%x == 0)
return 1;
else
return 0;
}

このプログラムだと一応実行できるのですが
整数を二つ入力しても動かず、もう一つてきとうに整数を入れると
最初の二つの整数について判断します。
例えば

4←ここで4は2の倍数なので1が返ってくる
  はずなのですがそこでは処理がされず
5←さらに適当に整数を入力する
1←すると結果が返ってくる
と、こんな感じです
整数を二つ入力した時点で処理結果を返したいのですが
いいでしょうか?

408:デフォルトの名無しさん
07/06/30 17:22:14
>>404
>main関数をどうすればいいのかわかりません
>というふうにしたいです
>その書き方がわからなくて困ってます

一度もお願いなんかされてないんだが。

409:デフォルトの名無しさん
07/06/30 17:25:25
>>408
行間も読めないんですか? とか言われそうだなw

>>407
scanf()とprintf()のフォーマット文字列は互換性がないと思ったほうがいい。
あんたのコードは明らかにscanf()のフォーマット文字列が間違っているぞ。

410:デフォルトの名無しさん
07/06/30 17:26:28
>>409
お前こそ行間が読めてないなw

411:409
07/06/30 17:30:06
>>410
大丈夫、初めから読もうとしてないから。

412:デフォルトの名無しさん
07/06/30 17:37:36
これはひどい

413:390
07/06/30 17:43:19
>>409
助言ありがとうございます

それと404は私ではないのであしからず

414:390
07/06/30 17:57:37
main()
{
int a,b;
printf("整数1:"); scanf("%d", &a);
printf("整数2:"); scanf("%d", &b);
printf("%d\n", multiple(a,b));

return 0;
}

407のmain部分を上のようにしたら理想通りに実行されたのですが
なぜ上手くいったのかがよくわかりません。
誰かその理由を説明してください。

415:デフォルトの名無しさん
07/06/30 17:59:15
>>414
>>409の最後の行

416:390
07/06/30 18:02:29
間違っていることはわかりましたが
407のscanf()はどういけないんですか?

417:デフォルトの名無しさん
07/06/30 18:02:51
\n

418:デフォルトの名無しさん
07/06/30 18:03:23
>>416
\n

419:デフォルトの名無しさん
07/06/30 21:07:21
もし A、B、C、Dのいずれかを満たしたら、、、と出力
それ以外なら。。。と出力

とするにはどうやればいいですかね?

420:デフォルトの名無しさん
07/06/30 21:20:02
>>419ですけど自己解決しますたー

421:デフォルトの名無しさん
07/06/30 23:23:30
#include<stdio.h>
#include<string.h>
main(){
char c[3];
char s1[]="abcdefghijklmnopqrstuvwxyz"
char s2 [100];
s2[0]='\0';
printf("s1 inital value:\"%s\"\n",s1)
printf("s2 inital value:\"%s\"\n",s2)
if cstrcmp(s1,s2)==0){
printf("s1==s2\n");}
else{printf("s!=s2\n");}
printf("Push ENTER to proceed.");
fgets(c,2,stdin);
strcpy(s2,s1);
printf("s1 current value:\"%s\"\n",s1);
printf("s2 current value:\"%s\"\n",s2);
if(strcmp(s1,s2)==0)
{
printf("s1==s2\n");}
else{prinf("s1!=s2\n");}
}
のプログラムのfgets(c,2,stdin); ってなんですか?なんの役割ですか?

422:デフォルトの名無しさん
07/06/30 23:29:26
>>421
どうでもいいけどそれ、そろそろtypo直そうな

× if cstrcmp(s1,s2)==0){
○ if (strcmp(s1,s2)==0){

423:デフォルトの名無しさん
07/06/30 23:29:57
スレリンク(tech板:607-644番)
解決したんじゃなかったのか

424:デフォルトの名無しさん
07/06/30 23:34:01
fgets(c,2,stdin); がわかないんですよ

タイプミスはすいません

425:デフォルトの名無しさん
07/06/30 23:37:27
>>421
stdinからcに1文字読み込む。

426:デフォルトの名無しさん
07/06/30 23:38:03
流れも他スレも読まずに回答。

>>421
>のプログラムのfgets(c,2,stdin); ってなんですか?なんの役割ですか?
入力処理。改行を入力させるために使っているわけだ。

427:デフォルトの名無しさん
07/06/30 23:41:15
>>424
Push ENTER to proceed を表示したところで止まるだろう
エンターキーを押すと次に進む
ようはポーズさせているんだろう

428:デフォルトの名無しさん
07/06/30 23:42:16
>>428
なんでENTERを押すと次が表示されるんでしょうか?

429:デフォルトの名無しさん
07/06/30 23:44:23
>>428
自己レスかよ

fgets(c,2,stdin);
で標準入力からの入力待ちで止まっている
エンターキーで入力されたので次に進むだけ
cのデータ自体はいらないもの

430:デフォルトの名無しさん
07/06/30 23:51:30
わかりました。ありがとうございます

431:デフォルトの名無しさん
07/07/01 00:54:39
プログラムとか全くなんにもやった事ないんですけど、最初になにを用意したらいいものなんでしょう?
ここのサイトをまず読めとか入門にいい本とかってありませんかね?
仕事では2D/3Dのデザイン系やってるんですけど、プログラムにもちょっと興味があるんで、
まずはCから勉強していこうと思っているんですが。

432:デフォルトの名無しさん
07/07/01 00:55:43
まず、コンパイラとリンカを用意します

433:デフォルトの名無しさん
07/07/01 00:57:21
最初に用意すべきものは、
何を用意すればいいかを自力で探せる能力だな
とマジレス

いや、マジでプログラマにとって最重要な能力は、情報収集力だよ

434:デフォルトの名無しさん
07/07/01 01:00:07
もうちょい広範囲に言うと「自己解決能力」

435:デフォルトの名無しさん
07/07/01 01:02:58
応用力。>>428なんかは将来心配

436:デフォルトの名無しさん
07/07/01 01:10:50
俺も>>431に何かレスしようと思ったが
>>433-434に全て持っていかれた

437:デフォルトの名無しさん
07/07/01 01:11:17
やる気。

438:デフォルトの名無しさん
07/07/01 01:12:20
やる気は大切だが、やる気だけの子も困ったり。

439:デフォルトの名無しさん
07/07/01 01:13:12
叩かれても泣かない。むしろ悦ぶ方向で。

440:デフォルトの名無しさん
07/07/01 01:15:15
四大欲求をフルに使いこなせる体力。

441:431
07/07/01 01:16:58
そうっすねぇまずは色々情報探してみます。

入門出来たらまた相手にしてください。

442:デフォルトの名無しさん
07/07/01 01:56:16
#include <stdio.h>
int main(void)
{
int min,max,x,y,i,j;
puts("長方形を作りましょう");
printf("一辺(その1)"); scanf("%d",x);
printf("一辺(その2)"); scanf("%d",y);
min = x;
if (y < x)
min = y;
max = y;
if (y < x)
max = x;
for (i=1; i<=max; i++) {
for (j=1; j<=min; j++)
putchar('*');
putchar('\n');
}
return 0;
}


何がおかしいスかねぇ
*が表示されないんですよねぇ

443:デフォルトの名無しさん
07/07/01 01:59:59
>>442
printf("一辺(その1)"); scanf("%d",&x); < & が抜けてるよ
printf("一辺(その2)"); scanf("%d",&y);

444:デフォルトの名無しさん
07/07/01 02:04:09

なんということ…ありがとうございます

445:デフォルトの名無しさん
07/07/01 02:08:54
ちなみにこのプログラムは順番的には
for (i=1; i<=min; i++)→for (j=1; j<=max; j++)→putchar('*')
→for (j=1; j<=max; j++)→putchar('*')→for (j=1; j<=max; j++)→putchar('*')
…→putchar('\n')→for (i=1; i<=min; i++)→…
みたいな感じで実行されてるのですか?

446:デフォルトの名無しさん
07/07/01 02:20:10
>>445
それであってるよ。実行して確認してみればいい。

447:デフォルトの名無しさん
07/07/01 13:00:50
>>446
ありがとうございました

448:デフォルトの名無しさん
07/07/01 14:37:35
四大欲求とは三大欲求に知的探究心を加えたものか

449:デフォルトの名無しさん
07/07/01 14:45:08
ノッてくれ~Ha~Ha~♪

450:449
07/07/01 14:45:40
素で誤爆しました
すみません

451:デフォルトの名無しさん
07/07/01 14:51:42
Gnuplotを扱うC言語用のライブラリとか無いでしょうか?

popen()関数を使って自分で作る事は出来るのですが
もし優れたライブラリがあるならそっちを使いたいです
C++では駄目でCでおながいします

452:デフォルトの名無しさん
07/07/01 19:06:59
例えば

foo(cahr*p)
{
char *my_ptr = MyGetInnerParameter("内部パラメータを文字列で返す関数");
strcpy(p,my_ptr);
}

var()
{
char *ptr;
foo(ptr);
}

こうすると、落ちるんだけど、どうして?


453:デフォルトの名無しさん
07/07/01 19:09:22
foo(char** p)
にしないと

454:デフォルトの名無しさん
07/07/01 19:15:07
いやそれ以前のはなしか

455:デフォルトの名無しさん
07/07/01 19:21:54
どこ指してるかわからないpにstrcpyしちゃだめだろ

456:デフォルトの名無しさん
07/07/01 19:23:24
char* a[8]をlongに直すにはどうしたらいいでしょうか?
>>で1つずつやっていくしかないですかね?

457:デフォルトの名無しさん
07/07/01 19:25:03
じゃあ

foo(cahr*p)
{
char *my_ptr = MyGetInnerParameter("内部パラメータを文字列で返す関数");
strcpy(p,my_ptr);
}

var()
{
char ptr[8];
foo(ptr);
}

こうしてみたんだけど、やっぱりダメだった。
どうして?

458:デフォルトの名無しさん
07/07/01 19:25:29
cahr

459:デフォルトの名無しさん
07/07/01 19:28:38
>>458
そういうケアレスミスは置いといて^^

460:デフォルトの名無しさん
07/07/01 19:30:00
コードを見る限り問題はなさそうな気がする。
MyGet(ryの戻り値がおかしいんじゃないのか。
戻り値になるバッファをスタックに取ってるとか。

461:デフォルトの名無しさん
07/07/01 19:31:06
コピーされる文字数が1024バイトだったとかってオチだろ。

462:デフォルトの名無しさん
07/07/01 19:37:26
デバッグとしてmy_ptr表示させてみたりとか、自分でしないの?

463:デフォルトの名無しさん
07/07/01 19:41:43
そもそも、呼ぶ側で領域確保が必要な関数の場合、
最初に用意する容量を問い合わせてから領域を確保して初めて呼び出せるんだろうに。
領域サイズの確認関数が無いなら、十分なサイズを用意してあげないとダメ。
そして、サイズに満たない領域にコピーしちゃダメ。



464:デフォルトの名無しさん
07/07/01 21:38:52
bregexp.dllのラッパーライブラリ内ですか?

465:デフォルトの名無しさん
07/07/01 22:45:56
サブ関数内でmalloc()でメモリ確保した領域ってメイン関数に帰るときに解放されないの?

466:デフォルトの名無しさん
07/07/01 22:46:46
>>465
free()かrealloc()で解放しない限り、されません。

467:デフォルトの名無しさん
07/07/01 22:50:23
>>465
解放されると困らないかい?

malloc() ~ free() の作法としては、使う人が確保と解放の責任を持つって暗黙のルールなんだけど、サービス関数の中には、確保だけして解放は使う側でやってね。なんてローカルルールもあるしな。

解放されると思い込むくらいなら、仕様確認をした方がいいよ。


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