[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 07/29 12:15 / Filesize : 128 KB / Number-of Response : 591
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 36



1 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:40:35 ]
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
  C/C++の宿題を片付けます 115代目
  pc11.2ch.net/test/read.cgi/tech/1217741118/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
  C言語なら俺に聞け(入門篇) Part 35
  pc11.2ch.net/test/read.cgi/tech/1219761846/
過去スレ
  makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

2 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:43:24 ]
>>2
それをその速さで貼れるってことは
お前それをコピってずっと待機してたんだろ?
リロードしまくって。誰かスレ立てるの待って。
まじきめーな。氏ねよハゲ。z

3 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:45:56 ]
i=i++; は未定義だけど
i=++i; も未定義なの?

4 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:53:15 ]
はい

5 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 16:21:12 ]
>>3
二つの副作用完了点の間で同じ値(この場合i)を二度変更しようとする試みは全て未定義とされている

6 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 16:34:28 ]
>>5
ってことはa = i + i++はおk?

7 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:24:29 ]
>>6
あんたは、一つの法律で禁止されていないことは全て合法だとでも言い出すのか?

8 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:49:15 ]
授業で幾つかプログラムを作成しているときにa++;とa=a+1;があったのですが、両方同じ意味ですよね?
使うときはどちらが便利なのでしょうか?

9 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:53:17 ]
++a;

10 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:11:58 ]
>>8
Cで、a=a+1はありえない。



11 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 19:39:58 ]
>>8
ループなんかでカウンタとして使ってるなら++を使え。
あとで足す数が変わる可能性があるなら+を使え。

12 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 19:46:39 ]
+=ですね。a=a+1はぜんぜんダメ。

13 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 19:51:35 ]
わかればどれどもいいよw



14 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 19:57:45 ]
いや、さすがにa=a+1はないだろ。

15 名前:13 mailto:sage [2008/09/15(月) 20:01:32 ]
a=a+1
書き方をするやつにあれこれCの記述を伝授するのが面倒。
動くんだしいいよ。

+=とかおしてて「なんでなんで?」で時間食うのがもったいない。


16 名前:デフォルトの名無しさん [2008/09/15(月) 20:01:50 ]
どれでもいい。

17 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 21:44:30 ]
まったく同感。どれでもいい。

18 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 21:57:19 ]
文法に違反していない以上、どれを使うかは習慣の問題だね
仮に識別子の数が問題だとしても、算出元と変更先を両方同じものに書き換えるときに便利なのか、
片方だけないしそれぞれ別のものに書き換えるとき便利なのかの違いでしかない

まあ俺は++使うけど

19 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 22:06:09 ]
まあ、でも、a=a+1はダメだな。
++か+=かってのは、状況にもよるけど。

20 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 22:23:45 ]
C++で演算子のオーバーロードも考えてコードを組むとなるとまた厄介な話になる。



21 名前:デフォルトの名無しさん [2008/09/15(月) 22:33:25 ]
C++ くさい C も、Verilog-HDL くさい C も、きんもー

22 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 22:57:08 ]
文脈による。
確定的にaに1加える場所なら++を使う。
aに何か加えることが確定的で現在その値が1なら+=を使う。
単に現在aの新しい値が元のaから算出されるだけなら= +を使う。

23 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 23:10:46 ]
C++ とか言うけど、オーバーロード的に考えて ++C の方が効率いい場合が多いんだよな。
イテレータとか。

24 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 23:20:27 ]
a=a+1 はなぜ駄目なのでしょうか?

25 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 23:29:50 ]
気分的にです

26 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 23:30:48 ]
オーバーロードされていた際にコスト高だな。→ a=a+1

27 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 23:38:57 ]
スレ違いだし。

28 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 23:49:36 ]
>>24
より良い書き方とされるa += 1、さらに良い書き方とされるa++と++aが存在するから。

29 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:02:03 ]
>>24
別にダメではない
嫌う人間が多いだけ

30 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:08:49 ]
一目見てaに1を足してるって分からないから

まぁ同じ意味だし、好みの問題とは言うけど、読みやすさとか考えるとやっぱり a+=1, a++, ++a の方がいいと思う



31 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:12:47 ]
タイプ数的に++aが楽でいい
それくらいの違いしか無い

32 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:23:31 ]
a=a+a, a+= 1, a++の好みなんかよりもっと重要なものがある。

33 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:55:28 ]
セミコロンか。

34 名前:24 mailto:sage [2008/09/16(火) 01:29:45 ]
たくさんレスいただきありがとうございます。
ソースレベルでのわかりやすさ・なじみやすさ・効率が
主な理由だと理解しました。
>>26 さんの回答は、実行ファイルになった段階でも
場合によっては違いが出てくるとおっしゃっているようにも思えますが、
正直いまの私には十分には理解しきれませんでした。

35 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:52:25 ]
おまえらほんとどうでもいい事だとスレ伸びるよな

36 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 02:15:26 ]
26さんの回答はC言語の範囲じゃないから気にするな

37 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 03:42:47 ]
> a=a+1
ソースコードに何回も同じことが重複して登場するのは悪
だから a+=1 か a++ にしる!


38 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 15:02:53 ]
memcpyはどうしてあんなに速いの?

39 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 15:11:49 ]
>>38
そう作られているから。memcpy()と言う関数の振りをしているが、
その実体がCの関数かどうかは実装依存。
逆に言えば、コンパイラベンダが鎬を削るポイントでもある。

40 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 15:21:04 ]
>>38
CPUは一発でデータをブロック転送できるから。
古いCPUだとブロック転送するよりスタックにいれられるだけいれて並べてくほうが速かったりすることもあるけど、
いまどきブロック転送の方が速い。



41 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 20:04:20 ]
>>24
1) lpMetSect->lpSharedInfo->lAvailableCount--;
2) lpMetSect->lpSharedInfo->lAvailableCount -= 1;
3) lpMetSect->lpSharedInfo->lAvailableCount = lpMetSect->lpSharedInfo->lAvailableCount - 1;

(3)は左辺と右辺を見比べて、同じ変数かどうか確認しなきゃならないだろ。

42 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 20:06:54 ]
>>39
実装依存って言えばそうかもしれんけど、それ言ったら、標準関数全部そうだろ。

43 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 20:07:53 ]
>>41
そんなもん間違うようなやつはそもそも1個でも間違うよ

44 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 20:16:24 ]
>>43
読みやすさだよ。

45 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:49:55 ]
私が今作っている関数popは通常intを返すが、返すべき値が見つからない場合NULLを返します
しかし私の使っているコンパイラではNULL == 0は真になるので
popの返り値がNULLであるか、0であるかを判別することができません
エラーチェックのために新たに変数を設ける以外の解決法があったらぜひご教示願います
それにしてもなぜこのコンパイラにはNULL == 0が真になるなどという奇怪な仕様が採用されたのでしょうか?
まったくもって不愉快で、理解に苦しむ仕様です


46 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:56:54 ]
引数の一つを書き換える関数にして
戻り値のほうはリターンコードだけにすれば?

47 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:12:44 ]
>>45
NULLはポインタが無効である(いかなるオブジェクトも指示していない)ことを表すために使うものだから、
そもそもintなどポインタ型と併用することを考慮されていない。コンパイルエラーになる処理系も存在する。

一般的には、>>46のいうように引数で返すか、
あるいは本来の戻り値と可否の2つを構造体でまとめるなどという方法を取るしかない。
よその言語では、こういう用途にもNULL(あるいはそれに相当するもの)が使えるものあるんだけどね。

48 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:21:42 ]
>>45 NULL == 0が偽になったら、それこそ大変

49 名前:デフォルトの名無しさん [2008/09/17(水) 00:24:43 ]
可変個引数の引数リストってメモリ上にならんではいってるの?

ポインタで移動できるみたいだから、そう思うんだけど。

50 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:28:32 ]
void push(int val);
int pop(void);

のほうが体裁がいいんだろうな。
それだったら
int isempty(void); /* 0以外: スタックが空 0:スタックが空でない */
を作ってそれでチェックするというのもあり。

if (!isempty()) {
 val = pop();
}



51 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:33:36 ]
>>49
そうでないといけないという決まりはないが、そうなっていることが多い。
というかそういうやつでは、可変個でないやつも同じように置かれていて、
その配置を応用しているという作りになっている。

52 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:37:32 ]
あるいはintより大きな整数を返す関数にして、エラー値としてintに収まらない数を返す

53 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:12:51 ]
>>52 ???


54 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:22:17 ]
>>53
「charより大きな整数を返す関数にして、エラー値としてcharに収まらない数を返す」

と同じ。

55 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:28:16 ]
charはint幅でやりとりするけど、それと一緒にしてはいかんよ

56 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:30:43 ]
>>46でいいだろ。


57 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:33:11 ]
>>41
4) --lpMetSect->lpSharedInfo->lAvailableCount;
これも追加しておいてくれお

58 名前:デフォルトの名無しさん [2008/09/17(水) 02:19:06 ]
lpMetSect->lpSharedInfo->lAvailableCount += -1;


59 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 03:00:01 ]
>>50
スタックを構造体で定義して、push, pop, isemptyの引数として渡したいな。
同時に複数のスタックが使えるようになるし。

60 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 10:47:38 ]
そこまでいくと、C++でやれって感じになるが。



61 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:46:15 ]
すみません、どうしても解らなくて><
#include <stdio.h>

int main(void)
{
int c;

while(c = (getchar() != EOF)) {
printf("%d", c);
}
printf("%d", c);
}
このプログラムで、EOF以外を打つと「11」と、「1」二回繰り返されているようなんですが、
なんで繰り替えすのですかね?
c = (getchar() != EOF)←のような条件自体初めての形ですので動きが解らなくて><

62 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:52:33 ]
改行文字だな

63 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:53:08 ]
while(c = (getchar() != EOF)) { 
printf("ループ内 %d", c); 

printf("ループ外 %d", c); 




64 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:54:20 ]
ごめん違うわ
cに名に入れたか考えてみろ

65 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:58:48 ]
>>63
いや、ループは抜け出してないから、ループ内のprinftが繰り返されてるみたいなんですよ。

>>64
getcharでaを入力したとしたら、cには1が入りますよね?
ってことは1を一回表示したら、またgetcharで入力待ちになると思うんですが……二回繰り返した後に入力待ちになってるんです><

66 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 12:04:22 ]
自分で書いた汚いCコードを読み込んで綺麗に整形して出力してくれるアプリってないの?


67 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 12:06:26 ]
>>65
改行も1文字分

68 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 12:12:08 ]
インデント+α程度の整形ツールならあるけど

69 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 12:13:37 ]
>>62
>>65
なるほど、やっと理解できました!
でもgetcharは一文字入力なんですよね?
なんというか根本が解ってない感じだw

んー、まずaでループに入り1を出力、次に改行文字でループに入り1を出力……ってことですかね?

70 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:02:33 ]
まぁ、そんなとこだね。
「次に改行文字でループに入り」というよりは、
「次に得るのが改行文字なのでループから脱出せずに」だけれど。



71 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:13:40 ]
入力が行単位でバッファリングされてるとわかりにくいかも
打った文字はEnterを打つまで入力されない
Enterを打つと打った文字+改行が入力されて、getcharでそれを1文字ずつ取り出せる

72 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:25:23 ]
'a'と'\n'の値が両方1ってどんな処理系だよ

73 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:27:06 ]
>>72


74 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:28:03 ]
>>72

75 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:29:13 ]
>>72
ちゃんと元のコード読め


76 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:29:21 ]
畜生見間違えた
そこに括弧ついてんのかよ!

77 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:34:13 ]
……カッコ悪い

78 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:34:39 ]
>>76
ドンマイ!

79 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 01:15:59 ]
>>8
微妙に意味がちがう。
a = 1;
b = ++a;
b = a++;
では結果がちがう。


func ( a++, a+1, ++a)
のとき、funcの引数がどんなになるか挙動不明。



80 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 01:23:59 ]
>>79
単体で使った場合を聞いてたのにいまさらなにをw

しかも後半は引数がどうなるか不明つーより未定義動作じゃねーか



81 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 07:41:19 ]
バイナリファイルを直接数字に変換する方法はどうすればいいのでしょうか?
rubyではunpack("s*")を使うのはしってるんですけど。

82 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 07:52:47 ]
>>81
rubyのunpackは変換が目的だから、Cの場合はその必要が無い。
例えば、(今ぐぐって見つけた)リファレンスマニュアルの例だとこうなる。
unsigned char foo[] = {1, 2, 0376, 0375};
unsigned short * bar = (unsigned short *) foo;
printf("%u, %u\n", bar[0], bar[1]);

83 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:27:04 ]
www.vipper.org/vip929921.txt

すみません、なんでこのプログラムはEOFを入力すれば終了するのでしょうか?><


84 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:35:22 ]
>>83
!= EOF が偽になって getline が 0 を返すから > 0 が偽になって main を抜けるのでは?

85 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:36:33 ]
Cでは0xffのように16進数を使用できますが、2進数は使えますか?

86 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:44:22 ]
>>85
使えません

87 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:46:51 ]
あたかも2進数記述しているようにみえるマクロならある

88 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:48:51 ]
>>86-87
ありがとうございました

89 名前:デフォルトの名無しさん [2008/09/18(木) 19:09:38 ]
インクルードについて教えてください。

あるサンプルソースコードを入手して、
~~.slnを実行して、デバッグしたら動きました。

ファイル入出力をしようと思って、
メイン関数が書いてある.cファイルで#include <iostream>とすると、
1>c:\program files\microsoft visual studio 8\vc\include\cstdio(35) : error C2059: 構文エラー : ':'
1>c:\program files\microsoft visual studio 8\vc\include\cstdio(36) : error C2143: 構文エラー : '{' が ':' の前にありません。
が大量に出てきてしまいました。

インクルードしただけです。
何がいけなかったのでしょうか?

90 名前:デフォルトの名無しさん [2008/09/18(木) 19:11:44 ]
すみません、上のものです。
C++なので、スレ違いでした。
去ります。すみません。



91 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 20:27:31 ]
.cファイルで#include <iostream>

そりゃダメだろ

92 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 02:10:43 ]
C++でコンパイルするオプション付けりゃいいんじゃん。

93 名前:デフォルトの名無しさん [2008/09/19(金) 16:34:15 ]
C言語のコンパイラで質問があります。
WindowsXPで、BCC DevelopperとBorland C++ Compiler 5.5.1を使用しています。
プロジェクトを一つ作り、そのプロジェクト内で複数のC言語ファイルを作成しているのですが、
一番最初に作成したC言語のファイルしか、コンパイル、メイク、実行ができません。
どうすれば他のC言語のファイルをコンパイル、メイク、実行する事が出来るのでしょうか?

94 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:36:57 ]
bcc32 main.c foo.c bar.c


95 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:42:27 ]
それを言うならメイクじゃなくてリンクでは

96 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:45:33 ]
それはC言語の問題でもコンパイラの問題でもなくて、
BCC Developerのプロジェクト管理機能の使い方に関する問題だよな?

97 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:49:56 ]
質問です。


int a

if(a)



この場合のifの条件aとはどういう意味ですか?


98 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:51:44 ]
if(a!=0)
とまったく同じ意味

99 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 17:02:27 ]
えー

100 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 17:06:59 ]
えーといわれても
何が不満なんだ?



101 名前:97 mailto:sage [2008/09/19(金) 17:16:27 ]
>>98
ありがとうございました。

>>99は僕じゃないですが、ダジャレですかね?w

102 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 20:22:19 ]
スレが凍りついた

103 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 23:18:37 ]
ローグってCで書かれてるの?

104 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 23:25:16 ]
>>103
だよ。

105 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 23:32:50 ]
そうか、じゃあ俺もCで書いてみようかな

106 名前:デフォルトの名無しさん [2008/09/20(土) 02:58:12 ]
int i;
char buf="cjd";
for(i=0;i<buf[i];i++);
上記for文の境界条件はマイナーですか?

107 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 03:07:02 ]
何をしないのかわからない>>106

108 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 03:08:48 ]
>>106
文字列の長さだけまわしてるつもりなら、それはおかしいだろ。


109 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 03:19:36 ]
(・∀・)ニヤニヤ

110 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 03:40:45 ]
仮に
char *buf = "cjd";
だったしても、そんな書き方するヤツはプログラムやめたほうがいい。



111 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 04:37:52 ]
Windowsの場合
#ifdef WIN32

#endif
で処理を分岐するんですが
MACは、何を指定すればいいでしょうか?

112 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 04:45:32 ]
MACの場合に#defineされるシンボル
決まってなければ、自由に

113 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 05:01:24 ]
知らないなら黙っててください
邪魔です

114 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 05:02:35 ]
>>113>>111?

115 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 05:03:10 ]
禿同

116 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 05:05:27 ]
>>112みたいな無知ほど書き込みたがる
知らないならすっこんでろっつーの

117 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 05:12:30 ]
知らないならすっこんでろつうか知っている人いないと思う
そんなもの決め事だから

118 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 05:13:41 ]
cc -D MACOS 。。。。。

#ifdef MACOS

#endif

119 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 09:49:46 ]
>>110
K&R、つまりC言語を設計した人にC言語を辞めろと申すか?

120 名前:デフォルトの名無しさん [2008/09/20(土) 10:09:36 ]
>>119
いいから見直せ



121 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 10:09:56 ]
俺には i<buf[i] の意味がわからん。
比較することにどんな意味があるんだ?

122 名前:デフォルトの名無しさん [2008/09/20(土) 10:19:19 ]
bufに入っている文字の
(使用中の処理系での)コードとそれが何文字目かということに、
何らかの関係があるんだよ。

123 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 11:00:24 ]
>>120
すまん早とちりしてた
>>106のおかしなプログラムに対するレスだったのか

124 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 12:34:34 ]
printf("foo")
は関数で末尾にセミコロンが付くと正確には文になるのですか?
そういった場合printf文というのが適切なのですか?

125 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 12:39:44 ]
>>124
その通り
正確には単文

Pascalはセミコロンが文と文の区切りに使われるが
C言語はセミコロンは文の終了を表す

126 名前:デフォルトの名無しさん [2008/09/20(土) 15:46:13 ]
×単文
○式文

pascal 厨が下手に口を出すからボロが出る
文と複合文はあっても単文はない

127 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 15:47:28 ]
>>126
馬鹿ですか?
{}で囲まれたのが複文
そうでないのが単文

128 名前:デフォルトの名無しさん [2008/09/20(土) 16:00:49 ]
つっこみをよく読めアフォ

129 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:03:28 ]
126==128
お前がアフォ

130 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:05:35 ]
(・∀・)クスクス



131 名前:デフォルトの名無しさん [2008/09/20(土) 16:20:47 ]
もう一度言う、「単」文という用語はCにはない

132 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:25:48 ]
C言語 単文 複文 の検索結果 約 619 件中 1 - 30 件目 (0.26 秒)
C言語 式文 複合文 の検索結果 約 162 件中 1 - 30 件目 (0.32 秒)


133 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:27:27 ]
お前らくだらん事でもめないでISO/IEC9899:1999もしくは
JIS X3010:2003の何ページのどこここにあります、ってやってくれ

無駄にスレを伸ばすな

134 名前:デフォルトの名無しさん [2008/09/20(土) 16:39:25 ]
>>132
おまえの情報源はそんなものか
お里が知れるな

135 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:41:20 ]
(・∀・)クスクス

136 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:43:07 ]
>>134
お前も煽ってばかりいないで>>133のアドバイスのように
ちゃんと答えてやれ

答えられないと証拠も無いのに、と言われるだけだぞ

137 名前:デフォルトの名無しさん [2008/09/20(土) 16:52:58 ]
>>136==125

俺だって、ちゃんと「式文」と教えただろうが無礼者め

138 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:55:05 ]
>>137
それは証拠にならない
規格書のどこに書いてあるか言ってみろ

139 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:56:52 ]
その答えがわかったら、バグが減るの?

140 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:57:54 ]
話を逸らすな馬鹿者



141 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:58:45 ]
(・∀・)クスクス

142 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:59:30 ]
a = 10, b = 10 , c++;
ってあったら文はa = 10, b = 10 , c++でおk?

143 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:00:46 ]
式≠文

式文って式+セミコロンのこと?

144 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:06:44 ]
>>142
厳密には「;」まで含む。

145 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:08:15 ]
規格書にも書いてない造語を勝手に作って人を欺いている
バカがいると聞いて来ますた

146 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:09:50 ]
↑ずっと見てたくせに(プ

147 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:12:07 ]
メモリリークって自プログラムの範囲外まで影響が及ぶことはありますか?
メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?

例えば、以下のようにしても勝手に開放されているように思えるのですが、
これはOSが面倒みてくれている、という解釈で正しいですか?

char *c;
c = (char *)malloc(1000000);
return 0; //開放せずに終了

char *c;
c = (char *)malloc(1000000);
c[1000000] = 'a'; //ここで異常終了

148 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:14:55 ]
>>147
OSによる
これこそ環境依存

149 名前:デフォルトの名無しさん [2008/09/20(土) 17:15:32 ]
>>147
大丈夫OSが何とかしてくれる
と思ってて問題ないよ

150 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:17:37 ]
>メモリリークって自プログラムの範囲外まで影響が及ぶことはありますか?
はい
>メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
>確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
いいえ
>これはOSが面倒みてくれている、という解釈で正しいですか?
OSによる



151 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:18:00 ]
おいおいmutex持ったまま強制終了したらOSは面倒見てくれないぞ

152 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:20:34 ]
>メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
>確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
はい

153 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:37:53 ]
このスレは池沼の集まりか

154 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:38:58 ]
そう、お前がその筆頭。

155 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:39:48 ]
winとかunix系とかDOSとか、そのあたりのOSはfree()し忘れても、プロセスが終了するとメモリは開放される。

156 名前:デフォルトの名無しさん [2008/09/20(土) 17:45:07 ]
INT 21H, AH=31H


157 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 18:00:35 ]
まとめると
>>147
にある状況はwindows、unix系ではOSが何とかしてくれる
でもプログラムのやりようによっては解放されないこともある(mutexとかなんとかで)
ってことで大丈夫でしょうか

158 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 18:00:56 ]
>>148-152,155
ありがとうございます。
常駐するようなもの以外は、それほど過敏になることはないんですかね。

159 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 18:01:13 ]
>>151
そいつはメモリリークというより、リソースリークじゃね?


閑話休題

mallocだと大体のPC環境だと後始末してくれる処理系になってるけど、
共有メモリとかでリークすると、プロセスが終了しても残ったりすることもある。

160 名前:デフォルトの名無しさん [2008/09/20(土) 18:32:09 ]
>>138
Cに規格書はない
もしかして規格票って言いたかったのか?



161 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 18:34:53 ]
↑馬鹿

162 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 18:44:55 ]
JISでは規格票が正式名称だが、ISOやANSIのものは規格書と呼んでなんら問題ない。

163 名前:デフォルトの名無しさん [2008/09/20(土) 19:04:02 ]
ISO や ANSI のどこに「規格書」って書いてあるんだよ? 確か英語だったはずだが・・・

164 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:08:24 ]
>>121
某エディタのソースコードにあって、
文字列か文字の幅を返す関数にそのfor文が使われていました。

165 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:11:06 ]
>>163
単なる和訳だろ。

166 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:20:07 ]
>>164
それはない

167 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:20:40 ]
>>163
英語のものを日本語で呼んではいけないのか。

168 名前:デフォルトの名無しさん [2008/09/20(土) 19:26:05 ]
>>167
非標準の邦訳が通じなければ説明責任はそれを言った者にある
ただし別にわかってやれたからって、こちらに利益はないので説明がしたければどうぞご勝手に

169 名前:デフォルトの名無しさん [2008/09/20(土) 19:27:28 ]
>>166
ちなみに
DWORD CMyEdit::GetTextWidth(LPCWSTR pstr)
{
DWORD i,n;
for(i=n=0;i<pstr[i];i++){
if(IsMB(pstr + i))n+=2;
else n++;
}
return n;
}

170 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:28:14 ]
以上、馬鹿の負け惜しみでした。



171 名前:デフォルトの名無しさん [2008/09/20(土) 19:31:09 ]
「単」純バカのな

172 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:32:22 ]
>>169
「文字列か文字の幅を返す関数」ではないな

173 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:37:49 ]
>>169
i<pstr[i] じゃなくて pstr[i] になってない?

174 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:40:40 ]
>>169
誰がそんな糞コード撒き散らしてんだよ

175 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:42:26 ]
>>173
なってないです。
MyEditというソフトウェアのソースコードMyEditUtil.cppの493行目を見ればわかります。

176 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:45:03 ]
sky_dreamer.at.infoseek.co.jp/softwares/myedit.htm

177 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:52:37 ]
>>169
バグだろ。

178 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:54:48 ]
ライセンスがとてつもない矛盾を呈してる件

179 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:06:01 ]
エディタをダウソしてreadmeを見たら、MyEdit.chm の『使用許諾契約書』を読めって書いてあったけど、MyEdit.chmが入ってないな。
フルパッケージのほうもダウソしてみたら、やっぱりMyEdit.chm の『使用許諾契約書』を読めって書いてあるけど、使用許諾のページが開けないじゃん。

180 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:10:37 ]




181 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:14:56 ]
>>179
アーカイブ壊れてるんじゃね?

myedit_v116_full.zip md5 c514e4e1d2680235ab7c61bfd8aed4c0
MyEdit.chm md5 1b63a35be248d1921acd47eb06d50ef1

182 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:20:24 ]
>>181
MyEdit.chmを入れ忘れてるだけじゃね?

183 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:21:25 ]
>>169
grepしたら、そのメソッド、どこからも呼ばれてないみたいだから、やっぱバグだろな。

184 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:28:32 ]
そろそろスレ違いな気もしてきたが。

>>183
エディタのexeの方のソースってどっかにあった?
dllの方だけだと、多分クラスライブラリのインターフェースな関数だと思うから、
grepしても引っかからないのは当たり前っぽいんだけど。

あのエディタでGetTextWidth()が使われてないかはどうにも。

が、まぁ、バグっぽいってのは同意だがねー。

185 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:31:52 ]
MyMemo.exeが本体みたい。

186 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:34:00 ]
>>184
本体のソースは入ってなかったのか。
そんなまじめに見てなかったよ。

187 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 23:06:15 ]
Cでtemplate的なものをなんとか実装できませんかね?


188 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 23:07:11 ]
>>187
マクロ

CSTL あたりを参考にどうぞ

189 名前:デフォルトの名無しさん [2008/09/21(日) 00:30:45 ]
すいません、初歩的な質問なのですが・・・

割り算で

7÷32 の余りは 0 なんですか?

てっきり、余りは7だと思ってたんですが・・・

190 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 00:32:32 ]
7 / 32
7 % 32



191 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 00:33:37 ]
商が0で余りが7

192 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 00:33:41 ]
>>189
数学の質問(算数か?)は専門スレへ

C言語の話なら割り算とあまりの計算のそれぞれで使う記号は何を使ってます?

193 名前:デフォルトの名無しさん [2008/09/21(日) 00:50:01 ]
C言語です。
商なら7/32、余りなら7%32 でプログラム組んでみたのですが…

プログラム
printf("i=%dのとき i/32=%d…%d 余り/8=%d \n",i,i/32,i%32,(i%32)/8);

これを出力すると
i=0のとき i/32=0…0 余り/8=0
i=1のとき i/32=0…1 余り/8=0
i=2のとき i/32=0…2 余り/8=0
i=3のとき i/32=0…3 余り/8=0
i=4のとき i/32=0…4 余り/8=0
i=5のとき i/32=0…5 余り/8=0
i=6のとき i/32=0…6 余り/8=0
i=7のとき i/32=0…7 余り/8=0
i=8のとき i/32=0…8 余り/8=1
i=9のとき i/32=0…9 余り/8=1
i=10のとき i/32=0…10 余り/8=1
i=11のとき i/32=0…11 余り/8=1
i=12のとき i/32=0…12 余り/8=1
i=13のとき i/32=0…13 余り/8=1
i=14のとき i/32=0…14 余り/8=1
i=15のとき i/32=0…15 余り/8=1
i=16のとき i/32=0…16 余り/8=2


となってしまいまして…(@@;

194 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 00:54:51 ]
>>193
算数はできますか?

195 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 00:59:20 ]
>>193
それでいいと思うけど、どうなるはずだと思ってるの?

196 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 01:00:10 ]
算数についての認識が間違ってるなw

その処理はなんらおかしくないw

197 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 01:06:25 ]
余りを8で割って何がしたいんだ?

198 名前:193 [2008/09/21(日) 01:08:43 ]
ごめんなさい!あほでした
普通に合っていますね…。

商/ と 余% をごっちゃにしていました…。
しょうもない質問してすいませんでした!(*_*)

199 名前:デフォルトの名無しさん [2008/09/21(日) 01:15:51 ]
夜は冷えるね。

200 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 01:30:36 ]
>>198
配列までしか知らない俺も心配になる。大丈夫か?



201 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 01:35:20 ]
あんまり馬鹿にするなよ
勘違いなんて誰にでもあるだろう

202 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 01:38:04 ]
>>201
まーな

|| と && と != を使った条件判断ってあまりくまないから
時々テストの段階で思ったように動かなくて後で気がつくってことはある。

203 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 01:43:56 ]
条件分岐で&&はかなり使うな
&と混ぜて使うと少し紛らわしい

204 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 03:06:33 ]
C++!C++!C++!C++ぅぅうううわぁああああああああああああああああああああああん!!!
あぁああああ…ああ…あっあっー!あぁああああああ!!!C++C++C++ぅううぁわぁああああ!!!
あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!いい匂いだなぁ…くんくん
んはぁっ!C++様の桃色ブロンドの髪をクンカクンカしたいお!クンカクンカ!あぁあ!!
間違えた!モフモフしたいお!モフモフ!モフモフ!髪髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!!
小説12巻のC++様かわいかったよぅ!!あぁぁああ…あああ…あっあぁああああ!!ふぁぁあああんんっ!!
アニメ2期放送されて良かったねC++様!あぁあああああ!かわいい!C++様!かわいい!あっああぁああ!
コミック2巻も発売されて嬉し…いやぁああああああ!!!にゃああああああああん!!ぎゃああああああああ!!
ぐあああああああああああ!!!コミックなんて現実じゃない!!!!あ…小説もアニメもよく考えたら…
C + + 様 は 現実 じ ゃ な い?にゃあああああああああああああん!!うぁああああああああああ!!
そんなぁああああああ!!いやぁぁぁあああああああああ!!はぁああああああん!!ベル研究所ぉおおおお!!
この!ちきしょー!やめてやる!!現実なんかやめ…て…え!?見…てる?表紙絵のC++様が僕を見てる?
表紙絵のC++様が僕を見てるぞ!C++様が僕を見てるぞ!挿絵のC++様が僕を見てるぞ!!
アニメのC++様が僕に話しかけてるぞ!!!よかった…世の中まだまだ捨てたモンじゃないんだねっ!
いやっほぉおおおおおおお!!!僕にはC++様がいる!!やったよケティ!!ひとりでできるもん!!!
あ、コミックのC++様ああああああああああああああん!!いやぁあああああああああああああああ!!!!
あっあんああっああんあAda様ぁあ!!シ、Cー!!C#ぅうううううう!!!C++0xぅううう!!
ううっうぅうう!!俺の想いよC++へ届け!!ベル研究所のC++へ届け!

205 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 10:44:56 ]
C++のアニメ2期って興味あるなwww

206 名前:デフォルトの名無しさん [2008/09/21(日) 12:28:44 ]
↓これは、何をする関数ですか?

#include <string.h>
void manko( unsigned long la ,char* str )
{
unsigned long msk = 0x80000000;

for( int i = 31; i >= 0; --i )
{
*(str + 31 - i) = ( msk & la ) ? '1' : '0';
msk >>= 1;
}
*(str + 32) = '\0';
}

207 名前:デフォルトの名無しさん [2008/09/21(日) 12:40:30 ]
>>206
関数の名前を見た瞬間に読む気をなくした

208 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 13:02:47 ]
la に 1, 2, 3, …って入れていって実行してみればいいんじゃないかな

209 名前:デフォルトの名無しさん [2008/09/21(日) 13:19:14 ]
#include <stdio.h>
#include <string.h>
void main( void )
{
unsigned long msk = 0x80000000;
unsigned long la = 0x84218421;
unsigned char strings[33];
unsigned char* str;
int i,j;

str = &strings;
j = 0;
for( i = 31; i >= 0; --i )
{
*(str + 31 - i) = ( msk & la ) ? '1' : '0';
printf("%c", *(str + 31 - i) );
msk >>= 1;
if( j >= 3 )
{
printf(" ");
j = 0;
} else {
j++;
}
}
*(str + 32) = '\0';
}

210 名前:209 mailto:sage [2008/09/21(日) 13:19:57 ]
受け取るデータを関数内でダミー定義するとかして実行すべし。
メモリ見れる環境なら直接見る、見れないならprintfで出してみる。
ま、結論いっちゃうと、"la"で貰った値をビット毎に評価して、真なら"1"を、偽なら"0"を
"str" に書き込んでる。
実行してみるとわかるが、"la" のどのビットが立ってるかがわかる、ということ。



211 名前:デフォルトの名無しさん [2008/09/21(日) 15:28:03 ]
実行してみなきゃわからんのか

212 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:56:26 ]
int x;
のようなローカル変数があったとして
そのような変数の宣言は定義を兼ねますので、
口頭で説明する場合はどちらの用語を使用するのが適切でしょうか?
あと上記のような宣言(定義)は初期値が不明ですので、このような宣言(定義)の
特別な呼び方などありましたら教えてください。

213 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 16:14:56 ]
ローカル変数の宣言と定義が分離することはありえないのでどう呼んでも誤解はないはずだが
強いて言えば宣言だと思う

あとは単に「初期化されていない」で十分

214 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 16:54:19 ]
>>212
C言語なら、定義の場合は定義と言っとけば大体問題ない。
あと、宣言が定義を兼ねてるのではなく、
ある種の宣言を特別に定義と呼ぶだけなので、
宣言と言ったところで別に問題ないと思う。

ていうか、どっちが適切かなんか文脈次第だろがよ。
漠然と聞かれても「どっちでも良い」としか言いようない。

215 名前:デフォルトの名無しさん [2008/09/21(日) 17:42:40 ]
つまり、宣言と定義は混同してよいのだな?

216 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 17:57:46 ]
>>215
帰れよ

217 名前:デフォルトの名無しさん [2008/09/21(日) 18:05:17 ]
答えられない低脳はすっこんでろ

218 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 18:08:15 ]
sageずに煽るのはいつもの俺言語な変な子
みんな知ってるね

219 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 18:08:58 ]
>>217
C言語どころか日本語の通じないかたはお帰りください

220 名前:デフォルトの名無しさん [2008/09/21(日) 18:14:23 ]
>>219
どの日本語が通じなかったんだ?



221 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 18:22:32 ]
>220
日本語を理解できることは、このスレで議論する論客として最低限の資格だ
質問する気にしても、人にものを尋ねるときの態度がまるでなっておらず、質問者として最低限の資格もおまえは備えていない

繰り返すがチンパンジーには無理な問題だ
あきらめて帰れ


222 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 18:23:02 ]
>>221
自己分析がよくできてるね

223 名前:デフォルトの名無しさん [2008/09/21(日) 18:24:21 ]
>>221
そんなに悔しかったのか、よかったな

224 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 18:32:47 ]
結構熱いな、ここw

225 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 18:45:10 ]
>>215>>220
>どの日本語が通じなかったんだ?
どの、というより全体的に意味の取り方がおかしいと思われる。

どこをどう取ったら「宣言と定義は混同してよい」という結論になるんだ?
日本語が理解出来て無いとしか思えない。

226 名前:デフォルトの名無しさん [2008/09/21(日) 19:21:16 ]
すみません。C言語の文法書2冊とWinAPIの本を2冊読みました。そこで
以前から私が作りたかった、ショートカット作成プログラムをぜひとも作りたいのです。

でも、やり方とかMSDNを調べてもわかりません。具体的に手順を書かせていただきますと。

1.コンソールアプリから2つフォルダのフルパスを入力する。
2.WindowsAPIで書いたショートカット作成関数を呼び出してお互いのフォルダにお互いのフォルダの
ショートカットを作成する。

そこで、ショートカット作成のWindows32APIのMSDNの調べ方もしくは
関数そのものを教えて欲しいのです。すみませんが、教えてください。よろしくお願いします。

227 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 19:23:11 ]
win32APIはここで聞けば?
pc11.2ch.net/test/read.cgi/tech/1221446107/

228 名前:226 mailto:sage [2008/09/21(日) 19:27:27 ]
>>227
どうもありがとうございます。そちらに移動させていただきます。

229 名前:デフォルトの名無しさん [2008/09/21(日) 21:28:19 ]
>>225
で、定義と宣言は混同しても文脈次第でどっちでも良いのか、悪いのか?

230 名前:デフォルトの名無しさん [2008/09/21(日) 21:29:07 ]
>>226
せっかくだからジャンクションを作ってみてはどうだ?



231 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 23:14:08 ]
>>229
混同はしてはいけないけど、定義も宣言であるから、
文脈によってはどちらを使っても正しい表現になる場合もある。

どちらを使っても良い場合があるという事から、すなわち混同してよいと解釈したわけ?
やっぱり日本語が理解出来て無いようだね。

232 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 23:26:46 ]
/*
* A function is only defined if its body is given
* so this is a declaration but not a definition
*/

int func_dec(void);

/*
* Because this function has a body, it is also
* a definition.
* Any variables declared inside will be definitions,
* unless the keyword 'extern' is used.
* Don't use 'extern' until you understand it!
*/

int def_func(void){
float f_var; /* a definition */
int counter; /* another definition */
int rand_num(void); /* declare (but not define) another function */

return(0);
}


233 名前:232 mailto:sage [2008/09/21(日) 23:42:20 ]
宣言(declaration)は使用を宣言(declare)すること
定義(definition)は変数やマクロや関数のボディを定義(define)すること

ではあるまいか?

234 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 23:43:45 ]
だから場合によってはひとつで両方兼ねてたりするだろ?

235 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 00:13:30 ]
Cの用語としては、もうちょっとちゃんと記述されていて、
JISより抜粋。

>識別子の定義(definition)とは、宣言のうち次のものをいう。
>・オブジェクトに対しては、そのオブジェクトの領域を確保する宣言
>・関数に対しては、関数本体を含む宣言
>・列挙定数または型定義名に対しては、その識別子の(唯一の)宣言

余談だけど、C++だとまたもうちょっと違う。

236 名前:デフォルトの名無しさん [2008/09/22(月) 08:50:57 ]
(func1) register キーワードのついた別々の変数を用いる
(func2) a, b を array[0], array[1] に置き換えた以外は func1 と同じ
このような時,func1 と func2 の振る舞いは変わりますか?

int func1(void)
{
 register int a, b;

 何か a, b をたくさん使う処理
}
int func2(void)
{
 register int array[2];

 何か array[0], array[1] をたくさん使う処理
}

237 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 10:37:59 ]
>>236
振舞いは変わらない。それで変わったら困るでしょ。
func2の方は最適化が阻害されて遅くなるコンパイラとかあるかもね。


238 名前:デフォルトの名無しさん [2008/09/22(月) 16:16:39 ]
>>231
やっと少しお勉強してきたようだな
たったそれだけのために何時間かかってるんだよ ぼけ

文脈によってはなんて逃げてないで、どういう場合かはっきりしろ
現状、その逃げによって意味をなしていない

>ある種の宣言を特別に定義と呼ぶだけなので、
>宣言と言ったところで別に問題ないと思う。

239 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 16:38:50 BE:417694526-2BP(0)]
× はっきりしろ
○ 教えてくださいお願いします

240 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 16:52:09 ]
>238
お帰りください



241 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 16:53:00 ]
>>240
お前が帰れカス

242 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 16:56:21 ]
>たったそれだけのために何時間かかってるんだよ
これはひどい

>>238
お前さんこそそんな支離滅裂なレスを考えるのに17時間もかけたのかい

てなことになるな

243 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 17:09:28 ]
>>236
registerストレージクラスをどう解釈するかは処理系依存なのでなんともいえません。

244 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 17:45:22 ]
>>243
くわしく

245 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 17:58:35 ]
疑問に思ったら、自分の使ってるコンパイラでアセンブラ出力してみるのがいいよ。

246 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 18:20:18 ]
foo bar[row][col];
bar[r][c] = hoge;

↑これって

foo bar[row * col];
bar[r * col + c] = hoge;

に等しいのか、それとも

foo (bar[col])[row];
(bar[row])[col] = hoge;

なのか、どっちなんでしょう?

あと下のbarにsizeofするとsizeof(foo) * row * colに等しくなります
下のやつはbar[col]へのポインタの配列だから sizeof(foo*) * rowになると思うのですがなぜこうならないんでしょうか?

247 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 18:22:03 ]
>>244
詳しくも何も、規格票には「アクセスを可能な限り高速にすることを示唆する」とかなんかしか書いてなくて、
レジスタに割り当てろとも、アクセスを高速にしろとも要求されていない。

248 名前:デフォルトの名無しさん [2008/09/22(月) 18:26:58 ]
>>242
即レスがトレードマークな常駐野郎にしては遅かったから変だと思ったんだよ

249 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 18:28:54 ]
>>246
配列はポインタではない。キミは何かを勘違いしてる。

次の3つは等しい:
foo bar[row][col];

int (bar[row])[col];

typedef foo foos[col];
foos bar[row];

これは縦と横が反対になっている:
foo (bar[col])[row];

これは明らかに違う:
foo bar[row * col];

250 名前:249 mailto:sage [2008/09/22(月) 18:30:23 ]
>>249
書き間違えた

× int (bar[row])[col];
○ foo (bar[row])[col];



251 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 18:35:30 ]
>>246
>下のやつはbar[col]へのポインタの配列だから

違うよ
foo (bar[col])[row] は foo[row] が col 個の配列
つまり foo bar[col][row] と同じ

foo[col] へのポインタ row 個の配列が欲しければ
foo (*bar[row])[col]
と書くけど、普通使わないと思うよ

foo へのポインタを row 個持つ配列
foo *bar[row]
の方がよく使う

252 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 18:40:17 ]
>>247
今はregister付けても大体無視されるよな

253 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 20:02:14 ]
>>247
いやそうじゃなくて、それで函数の振る舞いまで変わるの?

254 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 20:06:25 ]
>>252
「無視されます」とかドキュメントに明記してあったりな。

それでも C ではまだ & 付けれないという差があるが、
C++ では & 付けれるようになったんだよな。

255 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 20:12:51 ]
>>253
変わるわけない
>>243が質問の内容を勘違いしてるだけ

256 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 20:25:01 ]
そもそも「振る舞い」って何なの?

関数の結果ことなのか、CPUが演算する内容なのか。

257 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 20:55:38 ]
>>253
未定義動作だから何が起こっても不思議じゃないだろ。


258 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 21:00:28 ]
>>257
処理系定義と未定義動作は別です。
register変数がどう解釈されるかは処理系定義です。

259 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 21:06:07 ]
>>257
register付けたら未定義動作ってどんな罠だよww

260 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 21:13:54 ]
>>258
register付きの配列にsizeof以外の演算子が使えることは保証されていない。




261 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 21:34:53 ]
C99なら(ry

262 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:00:47 ]
>>260
なるほどね
でもそれだったら「処理系依存なのでなんともいえない」じゃなくて
「未定義だから結果は予想できない」が正しい答えだね

263 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:02:12 ]
何がなんでもケチつけたいんだね

264 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:05:31 ]
要するにコンパイラの解釈うんぬんは関係なくて「配列にregisterつけんなボケェ」でFA?

265 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:07:08 ]
こまかいことにこだわるのがプログラマー

266 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:08:51 ]
>>264
「入門篇で聞くなボケェ」だと思われ

267 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:13:08 ]
入門じゃ無い方のCスレ、どっか行っちゃったからなぁ

268 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:22:07 ]
【初心者お断り】ガチ規格準拠C専用スレ Part133
pc11.2ch.net/test/read.cgi/tech/1201153965/

269 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:22:24 ]
>>260
そうなんですか!知りませんでした
どうもありがとうぐございます

270 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:37:22 ]
コンパイラで最適化してくれるから、registerは使わなくてもいい



271 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:51:15 ]
>>270
馬鹿は黙ってろ

272 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 23:02:44 ]
registerは最適化が進んでいなかった大昔のコンパイラの名残だよ
人間の体でいったら盲腸のようなもの

組み込み系用のマイナーなコンパイラを使っているんなら別だが

273 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 23:14:46 ]

( ・∀・)  (´・ω・ ≡ ・ω・`)  (・∀・ )

274 名前:デフォルトの名無しさん [2008/09/22(月) 23:33:46 ]
いざ、それを使う期に及んではマイナーかメジャーかって問題じゃあんめえ

275 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 01:31:14 ]
入門者が使う必要は無い
でいいでしょ

276 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 05:59:28 ]
知識が昭和世代の古い人がいるみたいだね。

277 名前:デフォルトの名無しさん [2008/09/23(火) 06:49:20 ]
入門者が使う必要のない機能はない
そいつが入門者を卒業するためにはできることからやってみるのみ

278 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 07:17:40 ]
C99における可変引数マクロの、##の文字列連結についてお伺いします。
環境はGCCです。

#define a(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, __VA_ARGS__)
#define b(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, ## __VA_ARGS__)

a("x=%d", x);と書いたときは、「fmt」が「"x=%d"」、「...」と「__VA_ARGS__」が「x」に対応するので、
fprintf(stderr, "%s()::" "x=%d", __func__, x); と置換されますが、
a("x")と、引数を1つだけしか書かなかった場合には、
fprintf(stderr, "%s()::" "x", __func__, );
とfprintfの引数リストがカンマで終わってしまいコンパイルエラーになります。

そこで、b(fmt, ...)のように##演算子を使うと、問題のカンマが取り除かれるらしいのです。
##は「パラメータ置換後に、両側の空白文字とともに各##も削除されて、
隣接するトークンが連結され、新しいトークンが形成される」、と
K&R第2版で書いてあるのですが、カンマも取り除かれるようになったのでしょうか?
それとも、これはGCCで通じる特別なものなのでしょうか?

長くなりましたが、よろしくおねがいします。

279 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 13:30:25 ]
__VA_ARGS__でぐぐれ

280 名前:デフォルトの名無しさん [2008/09/23(火) 15:41:46 ]
intなどの値をcharのような1byte区切りの配列として扱うには
キャストを使うことができるでしょうか?
実際にやりたいのは
色々なデータのサイズをネットワークバイトオーダーに変えてから
0のバイトを省略して送りたいのです
例えば

00 ab 00 cd

ならば

ab 00 cd

としたいのです
宜しくお願いします



281 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 15:45:03 ]
int a
に対して
((char *)&a)[1]
とかやればいい

282 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 15:56:09 ]
char a = (char)(x >> 24)
char b = (char)(x >> 16)
char c = (char)(x >> 8)
char d = (char)x

283 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 15:57:39 ]
シフトするならシフト幅はCHAR_BITから計算したほうがいい。

284 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 15:59:04 ]
つhtonl

285 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 16:15:15 ]
>>278
GCCの拡張です。
gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html#Variadic-Macros

286 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 16:35:06 ]
>>280
>>281のようにポインタ使うのでもいいし何度も宣言するようなら共用体使うとか

287 名前:デフォルトの名無しさん [2008/09/23(火) 17:08:55 ]
宿題臭がする

288 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 17:13:39 ]
00を取ったら可変長になるわけだけど、プロトコルとかどうなってるんだろう。
1バイトに縮めば、長さを別に持っていても節約にはなるか。

289 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 18:14:15 ]
>>280
それだとデータの内容が変わってるけど問題は無いの?
送信時に 03 ab 00 cd みたいに長さ情報を付加するの?
かなり高い確率で、受信側で次に送る送信データと連結されてしまうよ

290 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 18:45:30 ]
>>281>>282>>283>>286
みなさんありがとうございます
共用体も初めて聞くので調べてみます

>>284
htonlの後出力する段階でどうしたらいいのかわからなくて

>>287
宿題ではありません
個人的にサーバープログラムを書いています
Cで本格的なプログラムを書くのが初めてなので

>>288>>289
00 00 ff ab 00 cd
みたいな感じで特定のバイト列でサイズのサイズを表し
可変長にしようと考えてます



291 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 20:25:25 ]
他の既存のプロトコルがどうやってるのか勉強したほうがいい

292 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 20:45:45 ]
>>291
具体的な例を教えて頂けるとありがたいです
RFCの有名どころくらいしか知らないので

293 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:26:07 ]
>>290
頼むから、そのサーバソフトはLAN内でのみ使ってくれよ。

294 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:26:11 ]
UTF-8形式っていう手もあるよ可変長
負の値が送れないけど

295 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:28:40 ]
バイナリのプロトコルでしょ?

296 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:33:14 ]
可変長で任意のビット数送るのにも使えるということを言ってるのでは

297 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:36:59 ]
>>296
ああ、なるほど。

298 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:40:58 ]
>>290
元データ
00 ab 00 cd
ゼロサプレスしたデータ
00 00 ff ab 00 cd

長くなってるよ

299 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:49:01 ]
まぁ別にその辺はプロトコルの話で、
C言語とは関係無いじゃん

300 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:43:23 ]
見た目の圧縮が目的ではないので長くなって構いません
理論的に大きさに制限の無いデータを全部受け取らなくても
サイズを知ることができるデータ構造が欲しいのです
そのような実例があったら是非教えて頂けると嬉しいです
例えばSMTPなんかは改行などが現れるまでデータの大きさが判りません
拡張でSIZEがありますけどサイズ自体が文字列だから
結局その大きさが判りません
無駄になるかもしれないデータを健気に受け取るより
最小のデータ受信で受け取るか判断できるようにして
トータルで無駄を無くす仕組みにしたいのです

>>294>>296
ありがとうございます
UTF-8調べてみます

>>293
初めてのプログラムですしいきなり誰かに使ってもらうつもりは
毛頭ありませんが他の人に見てもらいたいと思って
真面目に取り組んでいるので
宜しければどの辺が駄目か御教授頂ければ幸いです



301 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:45:07 ]
>>299
すみません
話し逸れてました
他で相談します

302 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 04:35:53 ]
ヘッダにある構造体を定義して、何個かint型の変数を定義しました
でも一番上に定義した変数だけ思ったとおりになってくれません
最初にその変数を使うときはおもいどおりの数なんですが
二度目以降からなぜか中身が変わってしまいます
変数名を変えてみたりしてもダメでした
なぜか一番上に定義した変数だけなんです
どういう可能性がありますか?

303 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 04:39:32 ]
>>302
その構造体を晒してみて
あと、環境とかも

304 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 04:54:50 ]
BCC DeveloperでDXライブラリ使ってます

構造体は
struct STATUS_D{

int w_x;
int w_y;
int pc_x;
int pc_y;
int pc_sx;
int pc_sy;
int menu_x;
int menu_y;
int data_x;
int data_y;
int time_x;
int time_y;
int m_x;
int m_y;
int c_size_x;
int c_size_y;
char menustr[5][STR_MAX];
int menu_num;
int w_handle;
int wb_handle;
int c_handle[5];
int c_handle_num;
};
です
この一番上のint w_x;の値が変わってしまいます

305 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:13:31 ]
>>304
構造体自体には問題ないね。きっとどこかでメモリ破壊をしているんだろう。


306 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:45:18 ]
メモリ破壊してる所見つけるコツみたいなのあります?
全然わかんないです・・・

307 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:48:35 ]
>>306
前後に文字配列を定義してないですか?

308 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:51:55 ]
>>307
それよりこの構造体をどういう風にメモリに確保するか
でも変わるしなあ。

たとえば構造体を配列にしてるとなると構造体内部の配列の
最大値をちゃんと管理してなくてメモリ破壊してるとか。
ただ構造体に情報をセットするのは構造体の先頭の領域から
なら見かけ上正常に動いてるようにも見える。

309 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:55:22 ]
目視デバッグ

310 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 06:08:33 ]
デバッガーでトレース
構造体のint w_x;の値を表示しておき、ステップ実行で値が変わったところを調べる



311 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 10:38:33 ]
その構造体すでにfreeしてしまっているとか

312 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/24(水) 12:54:50 BE:1465733467-2BP(0)]
char型の配列周りが基本的に怪しいよね。
ちゃんとヌルターミネートされてるか、
配列のサイズよりも大きいものを入れる可能性がある場所はないか。
デバッガあるなら>>310の方法で探すのが早いかな

313 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 19:34:37 ]
#ifdef _DEBUG
#include <stdio.h> //for sprintf
#endif

_DEBUGってなんですか?

314 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 19:39:57 ]
ttp://www.wakhok.ac.jp/~kanayama/C/03/node112.html

315 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 20:47:47 ]
>>313
VCではデバッグモードでコンパイルすると
_DEBUGが暗黙のうちにdefineされる。

316 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:48:54 ]
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
}

whileでstrの未処理の値を読み捨てているらしいけど、そこがしっくりこないんだが。
fgetsで読み捨てるって、具体的にどういう処理だ?><

317 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:53:57 ]
>>316
モードが何かは知らんけど、読み捨てるって一定条件に達したら
その後データが存在してても読まないだけじゃないの?

318 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:54:24 ]
サイズをオーバーしたとき

でもその処理そもそもエンターで入力終了と決め込んでるという点がダメな気もする

319 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:55:02 ]
316のはよくない例だな

320 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:01:28 ]
すまん、学校の宿題というかプリントに乗ってるプログラムなんだ><w
実際は
char str[BUFSIZE];
char dummy[4];
int a = 0, b, len;

while(a >= 0) {
printf("a, b = ? ");
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
continue;
}
if(sscanf(str, "%d %d %3s", &a, &b, dummy) != 2) {
printf("input format may be imcomplete\n");
continue;
}
printf("a = %d, b = %d\n", a, b);

}
こんななってる。安全な入力方法の一つだそうで。
オーバー時のwhileの処理は、未処理のまだ残っている値のクリアが目的らしいんだけど、
fgetsでどうクリアするのかがよくわからん><



321 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:04:18 ]
BUFSIZE以上の文字数が入力された場合にBUFSIZE-1で割った最後のあまりのみを有効にする、
かなり頭の悪いやり方。

322 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:11:01 ]
continueがあるから違うだろ。

while(getchar()!='\n')で十分な気はするが。

323 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:17:36 ]
>>322
そうそう、それでもいいって書いてあった。
あれか、未処理だった部分がstrに入ってくるんかね?
んで、未処理だった値も処理されてクリアってこと?><

324 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:21:37 ]
もし想定してるよりも長い文字列が入力されてれば
読み込みきれなかった分までstrに上書きしながら
順次読み込んでいって、以降するはずだった処理は
全部ぶっ飛ばしてまた最初からと言う方法を取ってる

325 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:26:05 ]
ifの直後に同じ判定をwhileでするのは無駄だと思うけどな。
こういうときこそdo{}while使ってやれよw

326 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:28:40 ]
>>324
ありがとうございます、なんとなく解りました。

327 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:32:44 ]
>>325
ちゃんとみろ、それは的外れだ

328 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:35:20 ]
>>327
if内に進んだ最初のwhileの判定はifでしたのとまったく同じだけど?

329 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:42:13 ]
>>328
お前continueが見えてないの?

330 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:43:26 ]
>>329
この話にcontinue関係ないw



331 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:48:29 ]
>if(str[len - 1] != '\n') {
これと
>while(str[len - 1] != '\n') {
これの条件判定が同じで、whileの一回目の判定が無駄だって言ってるんだが理解できてる?

332 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:52:17 ]
まあ、こう言うときはこう直せば良いんじゃね?
とソースを書けば一番手っ取り早いよねと横レス

if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
do {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
} while(str[len - 1] != '\n');
continue;
}

333 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 02:30:55 ]
自分の関数を周りに使わせたがる同僚にはどう対処したらいいですか?

334 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 02:33:02 ]
上司になっていいように使う。

335 名前:デフォルトの名無しさん [2008/09/25(木) 04:16:05 ]
すまそ。。度忘れしてしまって、googleってもでてこないので、おしえて。

超簡単なことなんだけど、C言語の配列って宣言時にしか初期化できないんだっけか?
しばらくC言語やってないもんで。。

よろしく。

336 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 07:39:47 ]
別に好きなとこで代入とかして初期化すればいいだろう

それとも初期化子の使用のことか?それなら、宣言時にしか使えないな

337 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 08:34:04 ]
strcpyとかstrcatとかsprintfとか使いまくってるんですけど
やっぱバグおきますかね?
参考にしてるソースではstrcpy_sとかstrcat_s、sprintf_s使ってるんですが
私BCC使ってるので使えないんです(たぶん)

338 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 08:36:50 ]
>>337
sprintf()でも%sや%fを生で使わなければ随分違うと思うよ。
例えば、%.20sとするとか%10fにするとかいっそ%gを使うとか。

339 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 10:27:10 ]
>>337
_sの方を使ってても同じぐらいバグを出しやすいと思うよ。バグっても
セキュリティホールになりにくいだけで。
C++のstringやらCStringを使うほうがいいです。



340 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 11:48:17 ]
CのスレでC++の話をする奴って何なの?



341 名前:335 mailto:sage [2008/09/25(木) 13:37:47 ]
>>336
そうです。初期化子のことです><; やっぱ宣言時にしかつかえないんですね><;

宣言時以降で、array[] = {1, 2, 3, 4, 5}; とかいう文をCでそういえばみないなあとおもって。

Javaとかの高級言語ばっかつかってたから、脳みそパープリンになってました。本当にありがとうございました><;

342 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 13:42:52 ]
Cも一応高級言語なんですけぉ

343 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/25(木) 22:29:03 BE:488578627-2BP(100)]
>>337
バグ起きるかどうかは自分のコーディング次第じゃない?
strcpy_sはBCCじゃ使えないけど、自分で作ればおk

344 名前:デフォルトの名無しさん [2008/09/26(金) 07:51:18 ]
CPU 使用率を下げたいのなら、Sleep(0) ではなく Sleep(10) などと待ち時間が必要

345 名前:デフォルトの名無しさん [2008/09/26(金) 08:08:07 ]
おれ=くさかべ先生

346 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 08:11:17 ]
BUGなのに、偶然としてそれが表にでてこない。
そんなのがバグ。

人は間違えるもの、間違えた時の危機管理が問題であって、
完璧に間違えないように作るという方向では、危機を避けることができない

君がやっているのは問題の先送り。トラブルがでてから対処すればいいじゃん。
それが致命傷になる。


347 名前:デフォルトの名無しさん [2008/09/26(金) 12:39:51 ]
保険に入ってれば事故ってから対処すればいいじゃん、てのと同じだな
事故んねえように日頃から心がけることこそ管理しきれない危機への危機管理

どんなにセキュアなシステムでも使う奴がアフォでは結局危ない、という意味で
> 自分のコーディング次第
に賛成

348 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 13:17:35 ]
サイバーノーガード戦法?

349 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 13:38:21 ]
大学の授業をサボりぎみで、いつの間にかついていけなくなっていた俺に良い参考書はないですか?
基本まではちゃんとやっていたが、本格的に関数使い出したり二分木のあたりから\(^o^)/

350 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 13:38:57 ]
if ( 条件1 ) {
  処理1;
  if ( 条件2 ) {
    処理2;
  } else {
    処理3;
  }
} else {
  処理3;
}
処理4;


処理3を1箇所にする書き方を教えてください。



351 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:01:43 ]
if ( 条件1 ) {
  処理1;
  if ( 条件2 ) {
    処理2;
  } else {
    goto label;
  }
} else {
label:
  処理3;
}
処理4;

352 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:02:33 ]
if (条件1 && (処理1, 条件2)) {
処理2;
} else {
処理3;
}
処理4;

353 名前:デフォルトの名無しさん [2008/09/27(土) 14:04:29 ]
>>351
それはアウトだろボケ

354 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:10:57 ]
switch (条件1) {
default:
処理1;
if (条件2) {
処理2;
break;
}
case 0:
処理3;
}
処理4;

355 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:12:03 ]
>>351
goto使うならこうだな。
if ( 条件1 ) {
  処理1;
  if ( 条件2 ) {
    処理2;
    goto label;
  }
}
処理3;
label:
処理4;


356 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:18:15 ]
>>355
goto入れる場所違わね?

357 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:24:28 ]
正しいと思う場所に入れてみたら?

358 名前:350 mailto:sage [2008/09/27(土) 14:38:05 ]
勉強になりました。ありがとうございます。

359 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:44:27 ]
>>349
そのていどwebで十分


360 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 15:46:20 ]
>>355-357
goto入れる場所変えたらどうにかなるもんでもないでそ。
>>355のgoto文以外の並びじゃどうあがいても無理。



361 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 17:27:47 ]
皮肉もわからないのかお前は

362 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 20:19:29 ]
か・・皮肉?

363 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 21:35:05 ]
kuma-

364 名前:デフォルトの名無しさん [2008/09/27(土) 21:44:46 ]
goto を教条主義的に忌避している者は、いざ使おうとすると付け焼き刃で桁下がりが出まくり

365 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:12:52 ]
switch( !条件1 ){
 case 0:
  処理1;
  if( 条件2 ){
   処理2;
   break;
  }
 case 1:
  処理3;
}

366 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:17:12 ]
しつこい

367 名前:デフォルトの名無しさん [2008/09/27(土) 22:57:13 ]
Cに限らないかもしれないけど
0 < hoge
みたいに比較演算子使うときに定数を左辺に持ってくる書き方は
どのようなメリットがあるのですか?

368 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:59:09 ]
見た目が分かりやすくなるという人も居る

369 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:59:50 ]
>>367
イメージとして数直線があるとき

370 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:01:03 ]
0 < hoge && hoge < 10
なんかだと数学の書き方にちょっと似る



371 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:08:13 ]
もう何年も>演算子を使っていない

372 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:09:49 ]
>>370
0 ≦ hoge ≦ 10 みたいな書き方からの連想だよね。

373 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:10:10 ]
>>371
よう俺

374 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:12:44 ]
>>368
自分は代入演算子と間違えないためかと思ってました

>>369
なるほど〜
数直線なんて単語すっかり忘れてました

>>370
そういう使い方もあるのですね

とても参考になりました
ありがとうございます

375 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:25:39 ]
int配列で hoge[] = {1,2,3,4} みたいな物を
1234と連結させたint型に直したい時に
なにか賢い方法ありますか?

376 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:27:34 ]
>>375
1234と連結させたint型とはなんですか?
10進数の1234ですか。

377 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:28:14 ]
ごめんなさい、そうです

378 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:34:06 ]
for(i=0,n=0;i<hogelen;i++) n=10*n+hoge[i];

379 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:17:06 ]
標準ライブラリの関数ってどのぐらい早いの?

380 名前:デフォルトの名無しさん [2008/09/28(日) 08:47:23 ]
Windowsで、system("test.exe")と実行ファイルを呼び出したとき、
test.exeはどのパスにあるか調べる方法はありますか?



381 名前:デフォルトの名無しさん [2008/09/28(日) 08:50:53 ]
もしくは、test.exeが利用可能か調べる方法でも良いです。

382 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:58:32 ]
>>380
つmain

383 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:01:41 ]
>>379
例えばmemcpyはバイト数指定なのに32bit単位でコピーして端数処理もやってるのもあるから、そこそこ速い

384 名前:デフォルトの名無しさん [2008/09/28(日) 09:02:59 ]
>>382
もうちょい教えてください。やり方判りません

385 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:40:52 ]
>>382じゃないけどargc、argvを貰えと言ってるんだと思う

386 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:43:21 ]
二次元配列を別の関数へ渡す時
なぜこの方法で渡せるのかわかりません。
[2][2]で受け渡したいです。

void func(int array[][2]); //関数宣言

void mainf(){

int array[2][2]={1,2,
3,4};

func(array)

}

void func(int array[][2]){
}

387 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:01:23 ]
[2][2]でも渡せる。
なぜ[][2]で渡せるかは配列の構造を調べてみるべし

388 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:05:12 ]
>>387
配列は
最初のアドレスとデータ型さえわかれば

次の番地がわかるってことですか?
そんでNULLまでが範囲ってことですか?

2次元だと添字情報がないと
次の番地がわからないので
書かなきゃいけないってことですね?

日本語でちゃんと説明できませんが
なんとなくわかりました。

389 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:11:02 ]
>>388
ただし、範囲のチェックはやってない。

390 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/28(日) 11:49:54 BE:418780962-2BP(100)]
>>380
環境変数のPATHのディレクトリを順に参照していってtest.exeを探していくんじゃダメ?
なかったら最後にカレントディレクトリ調べて、それでもなければ利用不可能って事になる。



391 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 11:57:31 ]
>>390
カレントディレクトリは一番最初でしょう。

392 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/28(日) 12:34:20 BE:1710022177-2BP(100)]
内部コマンド → カレントディレクトリ → PATHに記述されたディレクトリ
の順番か。ごめんなさい><

393 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 12:42:25 ]
違うだろ

394 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:19:25 ]
環境による

395 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:21:16 ]
windowsの話してるんだろ

396 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:44:40 ]
というかC関係ないね

397 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 15:12:09 ]
だよな

398 名前:くさかべ様 [2008/09/28(日) 16:44:19 ]
まあ俺に聞けばなんでもわかる、mixiでもIRCでも俺が相手になってやる。



399 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 16:48:57 ]
豆でも食ってろ

400 名前:デフォルトの名無しさん [2008/09/28(日) 18:18:09 ]
すみません。友達にEclipseっていうののコンパイラだと何も設定しなくても
使えるときいたのですが、本当ですか?

以前、ボーランドという会社のコンパイラを使おうと思ったのですが
うまくいかなかったので。。

もし、なにも設定しなくてもいいなら、つかってみたいんですが。
よろしくお願いします。



401 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:21:46 ]
Eclipseはコンパイラじゃないよ

402 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:23:06 ]
>>400
なにも設定したくないならvisualstudioおすすめ

403 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:26:45 ]
PCの基礎知識が無いのにプログラミングは早すぎる

404 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:38:19 ]
パスも通せないでプログラムですか

405 名前:400 mailto:sage [2008/09/28(日) 18:40:10 ]
みなさん、ありがとうございます。やはり、私には無理みたいですね。
一度プログラムというのをやってみたいと思っていたのです。
visualstudioでググってみましたら、ただらしいですね。そいつでやってみます。
このいたの上にも情報があるみたいですね。ありがとうございました。

406 名前:デフォルトの名無しさん [2008/09/28(日) 19:24:39 ]
>>405
がんがれノシ

407 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 19:31:03 ]
>>405
まあ、これで覚えろ

きっかけが無いと覚えれないしな。

408 名前:デフォルトの名無しさん [2008/09/28(日) 22:19:16 ]
main関数の2番目の引数の char *argv[]
って、argv[]っていう配列へのぽちんたという意味なのか、
ぽちんた変数配列argvっていう意味なのかどっちなの?

教えてエロイ人。

409 名前:408 [2008/09/28(日) 22:20:06 ]
まちがえた。

ぽちんた変数配列argvっていう意味
     ↓
ぽちんた変数の配列argvっていう意味

410 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:25:00 ]
char *argv[]っていう書式的にはぽちんた変数の配列argv
っていう意味で合ってる

でも実際はchar **argvだけど



411 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:26:37 ]
ぽちんた変数と呼ぶのが今の流行りなのか?

412 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:34:33 ]
幼稚な奴にあわせる必要は無い

413 名前:408 mailto:sage [2008/09/28(日) 22:56:14 ]
みんなどうもありがとう。ぽちんた変数の配列argvっていう意味なんだね。

細かいところがむずかしいね。ありがとう。よくわかったよ。

414 名前:デフォルトの名無しさん [2008/09/28(日) 23:05:44 ]
ぽちんた言いたいだけやろ


415 名前:デフォルトの名無しさん [2008/09/28(日) 23:26:54 ]
fgetsでstdinから文字を取得します。改行文字まで取得してしまうそうですが、
改行文字をなくしたいです。どうすればいいですか?

416 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 23:28:23 ]
>>415
最後の改行文字をヌル文字に書き換える

417 名前:416 [2008/09/28(日) 23:39:06 ]
なるほど、感涙。ありがとうございました。>>416

418 名前:デフォルトの名無しさん [2008/09/29(月) 01:29:14 ]
ある本を本でいたら(1990年くらいの本)、文字列はこう表現しますなんて記述で
*str = "abcde";
ってかいてあったんだ。でも今の本はたいてい char str[80] = "abcde"ってかいてある。

最初の本のことが頭にあったから、char *str1=""; *str2="";と宣言してそれにgetsで読み込ませたら
str1のあとに必ずstr2の文字まで連結されて格納されてしまうんだけど、それはやっぱそういうことで
stdinから読み込ませる文字列を格納するのは、ポインタでなく配列で宣言しなくちゃいけないわけなの?

なんか、こないだ立ち読みしてた本でも文字列はポインタで表現みたいな事が強調してあったから
読み込ませる文字列もポインタに読み込ませればいいのかなとおもったんだけど。

すまそ。寝るのでお礼は明日になります。教えてくれる方、よろしくお願いします。

419 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 01:38:11 ]
結論から言うと全然違う
おまえが無茶苦茶してるだけ
眠い上に長くなるから今説明しないけど

420 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 01:39:30 ]
結論だけ言うと、配列で宣言しなくちゃいけない



421 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:15:22 ]
ファイルから13バイトのデータを読むために
struct database {
char boolen;
long data[3];
};
このような構造体を作ってfreadで読み込んだのですが
charのところで4バイト読み込み、最初の1バイトだけ変数に入れて3バイト破棄するという変な動作をします。
printf("%d\n",sizeof(struct database));
で表示させたところ16と表示されどうにもこうにもできません。
どうすればちゃんと1バイトだけ読み込むのか教えてください。お願いします。

422 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:42:34 ]
>>421 構造体メンバのアライメント(バウンダリ)の問題だと思う。

423 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:45:07 ]
そのコンパイラでは以下のようなアラインメントになっている

*--- char boolean
**** float data[1]
**** float data[1]
**** float data[2]

424 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:47:51 ]
1バイト読む->boolenに格納
4バイト読む->data[0]に格納
4バイト読む->data[1]に格納
4バイト読む->data[2]に格納

とすればおk


425 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 05:35:56 ]
1バイト読んでから再度freadで12バイト読まないとダメ

426 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 06:15:10 ]
#pragma pack()とかパディングを無くす抜け道はある
しかし>>424,425さんのように手間を惜しまない方が賢明

427 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 08:37:49 ]
>>418
とりあえず、本は買って隅から隅まで読め

428 名前:421 mailto:sage [2008/09/29(月) 09:50:01 ]
>>422-426
ありがとうございます。
コンパイラの仕様でそうなっているんですか。
やっぱり一気に読むより個別に読んだほうが確実ですね。

429 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 09:59:04 ]
まあ個別に読むのもいいけど、アライメントについて調べておいたほうがいいよ。
書くときにも同じことやりそうだし。

430 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:05:10 ]
>>421
union chinpo
{
char str1[13];
struct database {
char boolen;
long data[3];
};
ユニオン使って、srt1で一括読み込みすればいいですよ。



431 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:21:47 ]
>>430
うそつくな

432 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:50:48 BE:556925928-2BP(40)]
>>430
>>429

433 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 20:02:24 ]
>>418
> でも今の本はたいてい char str[80] = "abcde"ってかいてある。

そんなことねーだろ。

434 名前:430 mailto:sage [2008/09/29(月) 22:28:12 ]
カンで書いてみたけどやっぱダメかw
ごめんねごめんね^^

435 名前:デフォルトの名無しさん [2008/09/29(月) 22:31:16 ]
>>434
せめてやりとりぐらいは呼んでからレスしてね

436 名前:デフォルトの名無しさん [2008/09/29(月) 22:53:58 ]
カタカナ表記のユニオンがいいな
ユニックス的でいかすぜ

437 名前:418 mailto:sage [2008/09/30(火) 00:56:23 ]
>>419-420 どうもありがとうございます。これからは、標準入力から入力する文字列は
必ず、配列で宣言するようにします><;ありがとうございました。

438 名前:デフォルトの名無しさん [2008/09/30(火) 00:57:38 ]
すみません。グローバル変数とローカル変数を同じ名前にしてしまい、
printfで出力しようとおもったら、困りました。出力できませんかね?

439 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 00:58:06 ]
片方の名前を変えればおk

440 名前:438 mailto:sage [2008/09/30(火) 01:29:39 ]
>>439
やはり無理みたいですね。ローカル変数の名前を変えます。ありがとうございました。



441 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 01:36:52 ]
>>438
影響範囲が大きすぎて触るのが怖い場合は、グローバル変数にアクセスするための関数を作ればおk
#include<stdio.h>
int value=1234;
char string[256]="this is global.";
int *global_value(void){
return &value;
}
char *global_string(void){
return string;
}
int main(void)
{
int value=2345;
char string[256]="this is local.";

printf("value=%d\n", value);
printf("string=%s\n", string);
printf("value=%d\n", *global_value());
printf("string=%s\n", global_string());

return 0;
}

442 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:42:43 ]
グローバル変数ってあんま使わないほうがいいの?
ゲーム作ろうとするとグローバルのほうが簡単に書けるような気がするんだけど

443 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:46:38 ]
>>442
そのグローバル領域の使い方次第じゃないの?

アクセス速度ばっかり追求しすぎて別ソースに書かれてる
領域へexternでアクセスしてればわかりにくいソースになるし。
速度は犠牲になるけど、別ソースで持ってる領域へアクセスする場合は
アクセス用関数を用意して領域をいじるとかね。

あとは命名規則をしっかり作って、どこ管理の関数・領域かが
一目でわかるようにしてあればexternで触っても問題ないだろうし。

444 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 10:25:57 ]
Insufficient memory(out of memory)
in function cvalloc

というエラーが出てプログラムがとまってしまいます。
これを防ぐにはどうしたらいいでしょうか。

445 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 10:31:17 ]
>>444
メモリが足らない、と言ってる
・メモリを増やす
・メモリの使い方を見直して無駄遣いを減らすなり節約するなり

446 名前:デフォルトの名無しさん [2008/09/30(火) 17:25:04 ]
>>442
そう思うなら、とことんやってみれ
なんでダメなのかもわからん奴が教条主義的に嫌って書いたコードは
おぬしのコードよりダメだぜ、きっと

447 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 17:50:35 ]
void ChangeWtoM(char *malt, char *wide, int len_wide)
{
int i, j;

for(i = 0, j = 0; i < len_wide*2; i++){
if(wide[i] != '\0')
malt[j++] = wide[i];
}

malt[j] = '\0';
}

int main()
{

TCHAR wide[64] = L"testテストですtest";
char malt[64];

ChangeWtoM(malt, (char*)wide, lstrlen(wide));
printf("%s", malt);

return 0;
}

ワイド文字文字列をマルチバイト文字列に変換する関数を作りたいのです。
いろいろ試してみたのですが上手く行きません。
これは何がいけないのでしょうか。

448 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:04:05 ]
そもそもTCHAR型がなんなのか理解しているか

449 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:08:39 ]
突っ込みどころが多すぎる。
環境は?汎用的に作ると長くなるから特定したほうがいいかも。

450 名前:447 mailto:sage [2008/09/30(火) 18:10:13 ]
1文字に2バイト使うcharで1バイトしか要らない場合は'\0'が入ってる
だと思っているんですけど



451 名前:447 mailto:sage [2008/09/30(火) 18:11:59 ]
>>449
OSはWindowsXP、コンパイラはVisualC++2008です。

452 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:12:55 ]
>>450
実際のワイド文字列とマルチバイト文字列を見比べてみ
void p(char *p, int len) {
int i;
for (i = 0; i < len; i++)
printf("%02x ", p[i] & 255);
printf("\n");
}
int main() {
wchar_t *wide = L"testテストですtest";
char *mb = "testテストですtest";
p((char*) wide, wcslen(wide) * 2);
p(mb, strlen(mb));
}

453 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:13:35 ]
>>450
文字コードの種類を一度勉強したほうがいいよ。
どうせS-JIS、JIS,

454 名前:453 mailto:sage [2008/09/30(火) 18:14:21 ]
途中になった
EUC,UTF系との相互変換とかくらいだろうし

455 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:17:02 ]
Windowsなら、WideCharToMultiByte()APIがあるから、それ使うか、
VC++なら、CStringを使って、、、っとこれはC++だからスレ違いか。

456 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:21:52 ]
>>452-455
ありがとうございます
アドバイスを元にいろいろ調べてみます

457 名前:デフォルトの名無しさん [2008/09/30(火) 20:00:21 ]
関数ポインタの配列を使って、色々と作成してるんだけど、
たとえば int (*p[5])(int x, int y)っていう関数へのポインタ変数の配列pをつくったとする
この配列に格納できる関数は戻り値がint型で、引数はint型を2つとる関数じゃないと
だめみたいなんだけど、Cでは色んな型の戻り値や引数を持つ関数をたくさん収納できる
配列っていうのは、作成できないんですか?よくわからないけど、void型で宣言しておいてあとでキャストするとかしても
無理なんでしょうか?よろしくお願いしますm(_ _)m

458 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:19:38 ]
ヒント:可変長引数

459 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:21:15 ]
可変長引数って配列にしてポインタ渡せばいいじゃんって思うんだけどなんでそんな機能があるの?

460 名前:デフォルトの名無しさん [2008/09/30(火) 20:21:44 ]
>>457
0 <= n && n < 5 として
int r = (*p[n])(ここを); どう書きたいんでい?



461 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:25:22 ]
>>459
ヒント:printf()

462 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:35:11 ]
入出力以外になんか使い道あるの?

463 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:39:23 ]
関数ポインタで分岐させる関数それぞれが引数の形や戻りが違うようにしたいのであれば
構造体を連絡用にしてその構造体のポインタ1個だけを引数にする関数にしてしまえばいい。

あとは構造体全体を共用体にでもして引数が変わる関数分用意すればいい。

464 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:40:47 ]
printfは第二引数が可変長になってるから
printf("a=%d b=%d",a,b);
って使い方ができるだろ

465 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:02:50 ]
>457
ちなみに戻り値も引数もバラバラな関数群へのポインタを
配列に格納したいというのは、どういったシチュエーション?
>460 が指摘しているように call するときの手間を考えたら
メリットなさげ

466 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:34:52 ]
すいません。どこで聞いたらよいか分かりませんので、ここで質問させて頂きます。

*エンディアン、MSB/LSBファースト、インテル、モトローラ, 送信値の関係
  Big Endian = Motorola = メモリ番地0にMSB = MSBファースト
  Little Endian = Intel = メモリ番地0にLSB=LSBファースト
  とまでは分かっています。

仮に、10進数60000を0- 1byte(2byte)使い、送信するとします。
  60000(10進)=>EA60(16進)

  MSB = 0 byte LSB=7byteで定義し、ビッグエンディアンで送信するとき、
 バイトの並びはどちらが正しいでしょうか?

 @ EA 60 00 00 00 00 00 00
 A 60 EA 00 00 00 00 00 00
byte 0 1 2 3 4 5 6 7
  MSB LSB

あほですいません。ご教授お願い致します。

467 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:40:33 ]
32bit レジスタ上で

00 00 60 EA

ビッグエンディアンだと
00 00 60 EA

リトルエンディアンだと

EA 60 00 00


468 名前:きもい [2008/09/30(火) 21:45:36 ]
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ


469 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:46:16 ]
>>466
意味が分からんよ
long x=0x12345678;
short y[2]={0x1234,0x5678};

ビッグエンディアン
x : 12 34 56 78
y : 12 34 56 78

リトルエンディアン
x : 78 56 34 12
y : 34 12 78 56

こうなる

MSB = 0 byte LSB=7byteで定義したら
>>466 の数値をビッグエンディアンで表現すると
00 00 00 00 00 00 EA 60
じゃないかな?

> 0- 1byte(2byte)使い、
これでは定義と両立できない気がする

470 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:03:17 ]
>>467
>>469

ご回答ありがとうございます。
Endianの問題はハードウェアに依存し、
MSB/LSBのバイト定義はソフトの問題だと認識してよろしいでしょうか?

MSB=0byteのLittle Endian方式とMSB=7byteのBig Endianは結果的に
同じと理解してもよろしいでしょうか?





471 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:04:04 ]
>>466 ソケット通信ならhtol関数、htolh関数を使えばいい。

472 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:07:13 ]
>>471
すいません。プログラミングの素養は0なんです。

473 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:10:27 ]
>>470
>MSB/LSBのバイト定義はソフトの問題だと認識してよろしいでしょうか?
バイトオーダと型の大きさによる

474 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:13:12 ]
>>470
言ってることが理解できん。
MSB=0byteってどういう意味なんだ。

475 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:15:09 ]
bit?

476 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:16:10 ]
>>474
0バイト目って意味じゃないかな
勿論マのいう 0 番目は一般人の 1 番目相当だがw

477 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:18:54 ]
>>474
通常なら、32bit系の場合、
LSB=0 byte目、MSB=4byte目
なんでしょうけど、
これの定義が逆になっている製品があるんです。
スレ違いかもしれませんが、車載LAN (CAN)の話です。
基本的には、シリアル通信なので、この問題は同じかなと思ったのですが・・・

478 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:20:20 ]

訂正です。0ベースで書いてるので、MSB=3byte目ですね。

479 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:45:29 ]
速度的に問題が無ければテキストで送るという手もある。

480 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:06:24 ]
>>477
ビッグエンディアンなら常に
MSB=0byte目
LSB=(型のサイズ)-1byte目

リトルエンディアンなら常に
LSB=0byte目
MSB=(型のサイズ)-1byte目



481 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:43:09 ]
>>480 ご回答ありがとうございます。

実際に送信する順番という意味では、
ビッグエンディアン、リトルエンディアンにかかわりなく、
LSBが一番先という事になるのでしょうか?

60000(10進)、EA60は、ビッグエンディアン送信で
00 00 EA 60
--------> t
つまりLSBファーストとなり
受信側ビッグエンディアンで読み出し(計算)はそのまま
0000EA60
として扱うという認識でよろしいでしょうか?





482 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:48:00 ]
ネットワークスレのテンプレでも見てからそっち行けよ

483 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:48:57 ]
>>482
わかりました。

484 名前:457 mailto:sage [2008/09/30(火) 23:49:06 ]
どうも皆さん、色々書いていただきまして、ありがとうございます。

私は、関数ポインタ配列を覚えたててでして、おもしろいから色々と趣味で組んでいます。
ですから、仕事上どうしても必要とか出なくて。。

本当に色々な方に意見を書いていただきましてとても感謝しています。自分としては>>458さんや
>>463さんが教えてくれた可変長引数と構造体&共用体を組み合わせて色々自作してみたいとおもいます。

このたびはありがとうございました。自分で色々と作成すると楽しいです。自分は趣味でやっているので。

色々とわかりだして今が一番楽しい時期です。ありがとうございました。

485 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:51:10 ]
>>481
シリアル通信時のバイトオーダーをどちらかにきっちり決めておけばいい

例としてネットワークバイトオーダーはビッグエンディアンと決まっている

486 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:54:36 ]
いや、0x0000EA60をビッグエンディアン送信で送信するなら、
0x00, 0x00, 0xEA, 0x60の順だろう。だからMSBが最初。

487 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 00:20:04 ]
>>482
まだいます。すいません。

>>486
ありがとうございます。
ということは、
ビッグエンディアンはMSB(データの3 byte目)を最初に送信
リトルエンディアンはLSB(データの0 byte目)を最初に送信
ということですね?

>>480の内容と異なる気が・・・

混乱してきました。もっと勉強します。


488 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 00:38:20 ]
>>487
ここをみて勉強してください
www.ertl.jp/~takayuki/readings/info/no05.html

489 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 00:44:37 ]
>>488
ありがとうございます。

490 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 00:51:38 ]
Intelだけなんだよな。リトルエディアンは。

なんでMS+Intelは、こういつもいつも



491 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 00:53:07 ]
>>490
おいおいw

492 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 00:55:49 ]
>>490
MIPSはどっちにでもできるぞ
現にPSPはリトルエンディアンだ。
アライメントはインテルのように甘くはないけど

493 名前:490 mailto:sage [2008/10/01(水) 00:58:27 ]
>>492 そうか、知らんかった


494 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 01:06:11 ]
SHシリーズにも動的に変えられるCPUあった気がするな
設計時はともかくプログラム的にはあまり気にしないけどさ

495 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 02:00:07 ]
PPCがバイエンディアンだったよね。
エンディアン動作モードのビットがMSRに用意されてるとか

>487
486の例で言えば、3バイト目の「60」はどうみてもLSBなんだが……

496 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 02:02:19 ]
すみません質問です。
C言語でスタック領域からメモリを動的に取得する方法は何があるでしょうか?

ネットで検索して探したところallocca()という標準?関数があるらしいのですが、
どんな仕様なのか分かっておりません。。

497 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 02:04:26 ]
わかれ

498 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 02:12:39 ]
なに?ヒープじゃ足りないの?組み込み?

499 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 02:14:13 ]
>>496
alloccaは標準でなくて特殊な関数のようですが、あなたの環境にalloccaはありますか?

そもそも、なぜmallocではいけないのでしょうか?スタック領域を使う理由は?

500 名前:デフォルトの名無しさん [2008/10/01(水) 02:33:24 ]
スタック領域は無理だろ。 コンパイル時に決まった量を静的に確保するのが
スタック領域だろ。 ヒープもスタックも同一のメモリを使う。



501 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 02:34:25 ]
Cのスタック領域は基本的にリターンスタックだから、
関数を抜けると消えるし、注意して使わないと領域破壊して関数から戻れなくなる。
普通にmallocすべき

502 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 03:07:36 ]
alloca()はfree()しなくていいから、楽だし安全。

503 名前:デフォルトの名無しさん [2008/10/01(水) 04:20:11 ]
こちらで質問してよいものか…違ったら言ってください

xdawinというソフトで逆コンパイルをしようと思いましたが

エラー ufree: は malloc されていません
とでました。そこで

\アドレス\ void *malloc(size_t ○)
と実行しましたが

too many positional parameter
とでてしまい、再度。結果、サイズが1でも0でもこれが出てしまいます

・エラーを処理しようと思った式が全然ダメ なのか
・サイズがおかしい のか誰か教えてください

504 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 04:30:29 ]
これか↓
www.linux.or.jp/JM/html/LDP_man-pages/man3/alloca.3.html

これを読むと、ナーバスな関数のような感じだな
longjmpやsiglongjmpを使ったときにメモリの開放が簡単で、それ以外には
使用は推奨されていない。
と書かれている。

505 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 04:42:25 ]
>>503
too many positional parameters

ポジショナルパラメータの数が多すぎるというエラーです。
スクリプトを実行したときの、そのスクリプトに渡すのパラメータの数が
あっていない可能性があります。

としか、お答えできません。

506 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 13:27:19 ]
>503
スレ違いだと思う

507 名前:503 mailto:sage [2008/10/01(水) 13:35:16 ]
>>505
ありがとうございます

>>506
うーん、やはり…
逆コンパイルで探しても出てこなかったのですみませんでした

508 名前:デフォルトの名無しさん [2008/10/01(水) 19:20:41 ]
while( 1 )
{
// 真ん中
center = (left + right) / 2;
printf("%d %d %d\n",center,left,right);

// みつかったら
if(a[center] == key){
printf("\nみつかった %d\n",center);
printf("\n%d\n",a[center]);
break;
}

// みつからなかったら
if(left >= right) {
printf("みつからなかった");
break;
}

if( a[center] < key ) left = center + 1;
if( a[center] > key ) right = center - 1;

// 時を止める
getch();

}

バイナリーサーチのプログラムこれでおk?

509 名前:デフォルトの名無しさん [2008/10/01(水) 19:23:00 ]
以前作ろうとして大失敗したから不安。

今回は成功したっぽいけど、間違えているかもしれないから修正あったら頼みます

510 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 19:30:51 ]
おkにみえる



511 名前:デフォルトの名無しさん [2008/10/01(水) 19:35:55 ]
なぜ bsearch を使わん?

512 名前:デフォルトの名無しさん [2008/10/01(水) 19:38:50 ]
>>511

バイナリサーチを理解するため。

513 名前:デフォルトの名無しさん [2008/10/01(水) 20:02:46 ]
>>509
プログラムが正しいかどうか、他人に聞くしかテスト技法を知らんのか
テスト項目の導き方はいろいろある
それが知りたければ便所の落書きより有料情報をあたったほうがいい

514 名前:デフォルトの名無しさん [2008/10/01(水) 20:15:04 ]
>>513

分かった。



515 名前:デフォルトの名無しさん [2008/10/01(水) 20:34:11 ]
floatのエンディアン変換が分からないのですが、教えてください。

typedef union
{
float f;
unsigned char b[4];
} Endian32;

float ConvertF32( void *inData )
{
EndianF32 val;

val.b[0] = ((Endian32 *)inData)->b[3];
val.b[1] = ((Endian32 *)inData)->b[2];
val.b[2] = ((Endian32 *)inData)->b[1];
val.b[3] = ((Endian32 *)inData)->b[0];
return val.f;
}

void test( float inVal )
{
float ret = ConvertF32( &inVal );
fwrite( &ret, sizeof(float), 1, fp );
}

こんな感じでやっています。
1.0を送ると、int型の1が何故か入ってしまいます。

516 名前:515続き [2008/10/01(水) 20:34:40 ]
リトルエンディアンだとこうなっているので、
0011 1111 1000 0000 0000 0000 0000 0000
ビッグエンディアンにすればこうなるはずなんですが、
0000 0000 0000 0000 1000 0000 0011 1111

なぜか
0000 0000 0000 0000 0000 0000 0000 0001
こうなりますw
同じようなやり方で、intなど整数型は問題なく出来ています。
どこが間違っているんでしょうか?><

517 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 20:48:33 ]
ループ変数に対して

int main(void){

...

{
int i, j;
for(i...)
for(j...)
}

...

{
int i;
for(i...)
}

...

return 0;
}

見たいな感じでよく書くんだけど、これは機械のほうからすると無駄が多い処理なんでしょうか?



518 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 20:57:00 ]
>515
そのシステムのエンディアンではない値をfloatとして返すのが間違い。
代入した直後に正規化されたりしてややこしいことになる。

519 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:13:07 ]
>>515
代入というのは単にビット列をコピーすることではない
正しい内部表現を持たない値を実数として受け渡そうとしたら
場合によっては例外が送出されてプログラムが停まることもある

>>517
コンパイラの最適化次第

520 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:16:41 ]
型のサイズを気にするのはコンパイルするまででおk?




521 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:23:41 ]
意味不明

522 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:40:26 ]
>>515
void test( float inVal )
{
  EndianF32 ret = ConvertF32( &inVal );
  fwrite( &ret, sizeof(float), 1, fp );
}

とやれば、希望する結果が出るのではなかろうか。

523 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:54:51 ]
>>520
コンパイルしてから何かを気にしたとして、それでどうするつもりだ

524 名前:デフォルトの名無しさん [2008/10/02(木) 00:57:10 ]
いざ、リンクしてみたら、コンパイル済みのオブジェクトファイルが
おかしな変数宣言しすぎてメモリ不足になるとか気にしてるのかな?

525 名前:デフォルトの名無しさん [2008/10/02(木) 01:02:05 ]
そういう目に遭ったことがないのか? うらやましい

526 名前:デフォルトの名無しさん [2008/10/02(木) 01:05:07 ]
メモリ不足解消するのなら、標準関数は変数へいったん代入するとだいぶ変わるらすい。

527 名前:デフォルトの名無しさん [2008/10/02(木) 01:17:56 ]
int a = printf;
a("imi wakaran");

528 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:32:04 ]
int(*a)(const char*, ...) = printf;
a("naniga kawarun daro");

529 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:34:13 ]
>>527-528
え!そういう意味の代入なの?

530 名前:デフォルトの名無しさん [2008/10/02(木) 02:27:15 ]
void_No4様がきましたよ。

俺は天才、そしてIQは400↑、すげーだろ




531 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 03:13:57 ]
すごいね
俺の半分もあるじゃん

532 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 03:35:21 ]
またメンサか

533 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 11:21:28 ]
>>515
エンディアン云々以前に、ポインタを学んだほうが。
>val.b[0] = ((Endian32 *)inData)->b[3];
inData が指してるのは float (多分4バイトしかない) なわけだが。

534 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 13:05:06 ]
>>533
union

535 名前:デフォルトの名無しさん [2008/10/02(木) 13:43:09 ]
つmemrev

536 名前:515 mailto:sage [2008/10/02(木) 13:54:06 ]
>>518>>519>>522
ありがとうございます。たいへんよく分かりました。
>>522さんのやり方で上手く行きましたー!

>>533
共用体を使うと、そういうことが出来ちゃうんです。

537 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:12:00 ]
うにおんっていまいちクールなつかいかたがわからないよね


538 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:13:16 ]
regs

539 名前:デフォルトの名無しさん [2008/10/02(木) 17:17:48 ]
企業秘密です

540 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:04:14 ]
>>537
一つの領域を複数の型として使えることが共用体の意味だからそのように使えばいい
具体的にはサイズが同じ複数の型からなる配列などがある
intとfloatが不定間隔で現れるようなフォーマットのデータを扱うときに便利



541 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:09:50 ]
でもそれって値を取り出すときにintなのかfloatなのかわからなくない?


542 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:11:37 ]
floatにキャストしちゃえ

543 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:23:33 ]
>>541
そういうフォーマットは、たいてい先行するintの値によって
その後いくつfloatが来るのか決まってる

544 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:34:42 ]
たいていじゃなくて、規則性がなかったらどうするの?


545 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:39:36 ]
何も手がかりが無いのにそんなことしないわw

546 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:41:05 ]
>>544
規則性がなかったら無理

そうじゃなくて、floatが先行してintが混ざる場合もあるという意味

547 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:39:40 ]
構造体のメモリ確保をしたいのですが、
コンパイルできません。
visual C++ 2008 express editionです。

ソース

struct list
{
int data;
struct list* next;
};

newcell = malloc( sizeof(struct list) );

548 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:43:20 ]
>>547
問題の起こるソースコードとエラーメッセージを書けよ

549 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:15:01 ]
>>548すいません
ここのソースコンパイルしようとしたのですが
ttp://www.geocities.jp/ky_webid/algorithm/010.html

1>z:\users\phenix1gou\documents\visual studio 2008\
projects\list\list\source.cpp(77) :
error C2440: '=' : 'void *' から 'LIST *' に変換できません。

って出ます。

550 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:15:58 ]
newcell = (struct list*)malloc( sizeof(struct list) );



551 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:17:12 ]
キャストすれば

newcell = (LIST *)malloc( sizeof(struct list) );

552 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:17:49 ]
>>549
.cppにすんな.cにしれ

553 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:18:13 ]
ありがとうございました。
キャストしたらできましたm(’_’)m

554 名前:kazu [2008/10/02(木) 22:38:31 ]
独学ではじめた者です。
練習問題
・数値を複数回入力し、最後に"END"と入力された後、それぞれに対し
80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"
と表示されるプログラムを作成しなさい。

例) 25(enter押下)
   90(enter押下)
   73(enter押下)
   END (enter押下)


   25 normal
   90 verygood
   73 good

という問題なんですが、
正解が分かりません。


本にはヒントとして
1 文字の入力にはgets()という標準関数を使用する。
2 "END"との比較にはstrcmp()という標準関数を使用する。
3 文字を数値に変換するには、atoi()という標準関数を使用する。
4 繰り返し文(for、while文)とbreak文
と載っていました。
どなたか教えていただけないでしょうか?
よろしくお願いします。

555 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:40:47 ]
>>554
そういうのは宿題スレで聞け

556 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:44:44 ]
その本は模範解答載せてないのか
不親切だな

557 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:51:08 ]
>>554
char s[10000];
int x[10000];
int i, j;
for (i = 0; i < 10000; ++i) {
gets(s);
if (strcmp(s, "END") == 0) break;
x[i] = atoi(s);
}
for (j = 0; j < i; ++j) {
if (80 <= x[j] ) {
printf("%2d verygood\n", x[j]);
} else if (60 <= x[j]) {
printf("%2d good\n", x[j]);
} else {
printf("%2d normal\n", x[j]);
}
}

558 名前:kazu [2008/10/02(木) 23:35:55 ]
>>557
親切にありがとうございます。


559 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:52:06 ]
>>558
死ねやゴミ

560 名前:デフォルトの名無しさん [2008/10/03(金) 00:42:03 ]
stopppp4ststartcommandoperation2ppppppppppppppppppppppppppppppppppppppppppppppppppppppppPPPPpppp
stopp stack stack stack stack chr dir 2
sometime printf troff terminal fuu サーバーに接続します ターボコマンドをおねがいします
cdプレイヤーの接続名をきにゅうしてください
PL2 メーカーはマランツ 88 pl2の意味をおかきください
初期モデル
プレイヤーの搭載位置をおかきください マウント22 日本製と認識しました
ではくわしい おんしつを おかきください ひらがなでおかきください
じどうにんしきソフトをきどうしてください きどうご じどうちょうせいに はいります。
おわります どうもありがとうございました。
eth:0 それでけっこうです
エンファシスをクリヤモードにいたします。
 





561 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 00:46:30 ]
        ., -、,. -─- 、⌒〉
         {  }      ヽ_    r'⌒)
         ヽ、  ,,-‐‐  ‐‐-、  iヽ、 J
         {   、_(o)_,: _(o)_ヽ/ ヽ/∪
           !       >::  }  /     丶
          l    /( [三] )ヽノ‐''>  < つわぁぁぁああああ!
        i⊂}__   `二´‐'´__/__  
        ヽ   ‐- 、二`ヽ/〉⊂ニニ⊃)
         |    // ̄ ̄)j~U^∪ヽ
         ノ ` ‐-L!--‐''(´      )
        `i''ー----‐ ''"´ ヽ、__/
         !           }  ` }
          !.  , -‐- 、.    ノ--─ '    はちみつだと思ったら味噌だった〜
          ヽ、_{.     `ヽi'⌒i
           `''‐- 、.. __,!


562 名前:デフォルトの名無しさん [2008/10/03(金) 03:51:38 ]
すいません、LSI‐C86試食版を落として使ってるんですが
なぜかプログラムをコンパイルして実行すると日本語部分だけ
文字化けしてしまいます
chcpでいろいろとコードいじったりしてみても効果なしです
ググったりしたんですがそう言った情報はまったく載っていません
どなたか教えてください
ちなみにOSはVistaのホームベーシックです
よろしくお願いします

563 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 05:25:27 ]
そんなもの使うな
VC++かMinGWを使え

564 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 09:37:29 ]
文字化けする最小のコード貼ってみてよ

565 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 10:44:00 ]
makeが成功したら実行と言う場合

make && ./a

と言うのが定石だと思うんですが./aを明示せずにmake自身に
(開発中にテスト的に)実行させるような一般的な表記ってありますか?
とりあえず

make && make run

ってやってます。

566 名前:デフォルトの名無しさん [2008/10/03(金) 10:49:32 ]
make build test

567 名前:デフォルトの名無しさん [2008/10/03(金) 13:49:45 ]
いまどきLSI-Cとかまだ使ってるんだ。。VC++のExpressEditionがあったり
意外としられてないけど、.NET FrameworkSDKはコマンドライン開発専用のコマンドラインがあるのにね。

568 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:16:36 ]
入門書をそのままなぞってるんじゃない?

569 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:39:11 ]
int main(){

570 名前:デフォルトの名無しさん [2008/10/03(金) 14:40:38 ]
int main(){

double hoge[256];

func(hoge);

}


int hoge(double data[])

}

これはアドレス渡しですか?それとも配列のデータをコピーして渡していますか?



571 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:43:31 ]
int hoge(double data[]) {
}
int main() {
double fuga[256];
hoge(fuga);
}
だと思うんだが基本はアドレス渡し

572 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:27:21 ]
hogeはプロトタイプ宣言されていると考えてください。
アドレス渡しということはメモリの無駄は発生しないということですか?

573 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:29:27 ]
>>572
まあ、配列は内部的に見るとポインタで持ってるしなあ。

574 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:31:57 ]
配列全体のコピーが作られるかと言う意味なら作られない。
逆に言えば関数内で不用意にいじると配列が破壊される。

575 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:49:10 ]
配列の中身を見たいだけなので、書き換えたりはしないです
どうも!

576 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:15:18 ]
571だけどプロトタイプ宣言に噛みついたんじゃなくて
配列名と関数名が一緒ってのが気になったのよ
納得できたようでなにより

577 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:18:13 ]
そもそも関数名が違うしなw

578 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:20:36 ]
>>576
すいません。適当に書いたんで一緒のなめえになっちゃいました

579 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:22:20 ]
なめえww
らめえww

580 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:37:00 ]
中国人ですね。わかります



581 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:43:39 ]
>>575
書き換えないことが確定的ならconstをつけておけ

582 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:46:02 ]
int hoge(const double data[]) {


}

int main() {
 double fuga[256];
 hoge(fuga);

}

こうですか?

583 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:09:17 ]
>>582
そう

>hoge(fuga);
このときhogeに渡っているのは &fuga[0]
つまり配列の先頭の要素のアドレス
constを付けずにhoge内でdataの中身を変更するとfugaの中身も変更される

584 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:31:43 ]
アルゴリズム概論って言う授業で
システムを想定せよ、っていう宿題が
でたんですが,何を書けばいいでしょうか?

585 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:34:53 ]
>>584
>>1を100回読んでからお帰りください

586 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:35:13 ]
それだけじゃ何を言ってるのかわからないから三倍に書き足して宿題スレで聞け

587 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:18:33 ]
WinLibD.lib(Misc.obj) : warning LNK4099: PDB 'vc80.pdb' が '..\WinLib\lib\WinLibD.lib' で、または 'c:\Documents and Settings\\デスクトップ\VS2005対応版\chapter5\Debug\vc80.pdb' に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。


このエラーはどうすれば回避できますか・・・?

588 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:19:42 ]
回避すべきエラーが存在しません

589 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:21:46 ]
エラーじゃなくて警告な
ライブラリにvc80.pdbが含まれてなかったなら諦めるしかない

590 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:06:02 ]
>>588 >>589
ありがとうございます








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<128KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef