C言語なら俺に聞け! Part 125

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は専門の別スレッドがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
C言語なら俺に聞け! Part 124
http://pc8.2ch.net/test/read.cgi/tech/1142302804/
2デフォルトの名無しさん:2006/03/32(土) 23:27:23
>>1
死ね
3デフォルトの名無しさん:2006/03/32(土) 23:33:35
char* s1[3]={"東京","大阪","名古屋"};
としたとき

東京の”京”の字だけ出すにはどう配列を書いたら良いの?
4デフォルトの名無しさん:2006/03/32(土) 23:34:31
>>3
マルチ氏ね
5デフォルトの名無しさん:2006/03/32(土) 23:34:32
配列じゃない
ポインタだな

いじくりかたを教えて欲しい
6デフォルトの名無しさん:2006/03/32(土) 23:48:03
tokyoなら
*(s1[0]+1)

で移動できるんだけど
漢字では出来ないのだ
7デフォルトの名無しさん:2006/03/32(土) 23:55:37
wchar_t型の配列にmbstowcsでコピーっつか変換コピーしたあと2文字目を取り出すのだ
8デフォルトの名無しさん:2006/04/02(日) 03:46:34
printf("%s", s1[0] + 2);
9たろう:2006/04/02(日) 11:44:00
C言語ソースのステップカウンタ(Linux上で動くツール、またはコマンド)
ってありますか?
Windowsベースならたくさんあるんですけど、Linux(しかもフリー)って
なかなか見つからないのです。wcだと総ステップしか分からないし・・・
10デフォルトの名無しさん:2006/04/04(火) 05:07:36
#include <stdio.h>

main(){
int a;
a = 3;
a = !a;
printf("%d\n",a);
a = !a;
printf("%d",a);
return 0;
}
これで出力すると0と1が出ました
3の否定は0で0の否定は1ということなのでしょうか?
11デフォルトの名無しさん:2006/04/04(火) 05:30:04
>>10
Cで数値をBool値(True/False)として扱う場合は
0ならFalse、0以外ならTrueと定義されているだけで
別に0の否定、すなわちTrueが1だとは決まっていない
まぁ3の否定が0だというのは正しいが
12デフォルトの名無しさん:2006/04/04(火) 09:09:28
1に決まってたような気がしたけど
13デフォルトの名無しさん:2006/04/04(火) 09:12:04
>>10
論理値を返す演算子は、真の時に1を返す。
と言うだけのこと。
14デフォルトの名無しさん:2006/04/04(火) 12:53:05
>>12
詳しくは ISO/IEC 6.3.1.2 と 7.16 参照
15デフォルトの名無しさん:2006/04/04(火) 13:36:07
>>10
ご覧のとおり

あと 11 みたいのは
こういうコードを書くから気をつけたほうがいい

#define False 0
#define True (!False)
main()
{
int a = 3;
if(a == True) exit(1);
}
16デフォルトの名無しさん:2006/04/04(火) 13:55:08
>>15
何でちゃんと分かってる >>11 がそんなコード書くんだ?
17デフォルトの名無しさん:2006/04/04(火) 13:59:54
is 系関数が真の時 1 以外の値を返す実装になってるのはよくある話。
18デフォルトの名無しさん:2006/04/04(火) 14:01:15
>>16
なるほど、おまえも解ってないわけか
19デフォルトの名無しさん:2006/04/04(火) 14:03:19
> 0ならFalse、0以外ならTrueと定義

#define False 0
#define True (!False)
と理解したのか。
20デフォルトの名無しさん:2006/04/04(火) 14:04:29
まぁ、is系の関数にsinghed charを渡して-1以外の負数で
挙動不審になるのも良くある話
21デフォルトの名無しさん:2006/04/04(火) 14:05:32
>>19
単に英語で言っただけなのにね。
22デフォルトの名無しさん:2006/04/04(火) 14:07:00
>別に0の否定、すなわちTrueが1だとは決まっていない
    !0              ^^^^^^^^^^^^^^^^^^^^^^^^
23デフォルトの名無しさん:2006/04/04(火) 14:09:54
否定演算とは言ってないし。
24デフォルトの名無しさん:2006/04/04(火) 14:11:51
苦しいなw
25デフォルトの名無しさん:2006/04/04(火) 14:15:12
先輩、僕に答えを教えて下さい
26デフォルトの名無しさん:2006/04/04(火) 14:17:33
うるせえ
やきそばパンとファンタ買ってこい
27デフォルトの名無しさん:2006/04/04(火) 14:22:19
>>15
>>11 には 「数値をBool値(True/False)として扱う場合は」と書かれているので
そのコードはありえない。あるとすれば

#define False 0
#define True !False
main() {
int a = 3;
if (_Bool)a == True) exit(1);
}

だが、これは規格上正常に動作する。
28デフォルトの名無しさん:2006/04/04(火) 14:23:08
左括弧不足くらいは許せ
29デフォルトの名無しさん:2006/04/04(火) 14:24:01
許す
30デフォルトの名無しさん:2006/04/04(火) 14:25:43
$ gcc 27.c
27.c: In function `main':
27.c:5: error: parse error before "_Bool"

(・∀・)ニヤニヤ
31デフォルトの名無しさん:2006/04/04(火) 14:28:51
>>27
3の否定演算とも言ってないようだが
じゃあ奴は何が言いたかったんだ?
32デフォルトの名無しさん:2006/04/04(火) 14:34:49
>>30
コンパイラ古くね? _Bool は ISO/IEC 9899 できちんと定義されてる。参照箇所は >>14
33デフォルトの名無しさん:2006/04/04(火) 14:36:45
丁寧に頼んだのに焼きそばだと?ふざけんな。教えろ
34デフォルトの名無しさん:2006/04/04(火) 14:38:00
>>31
「Bool値(True/False)として扱う場合は0ならFalse、0以外ならTrueと定義されている」
だろ。どこにも誤読の余地はないと思うが。
35デフォルトの名無しさん:2006/04/04(火) 14:44:12
int a = 0;
なら
!a == 1 は真だがな
36デフォルトの名無しさん:2006/04/04(火) 14:46:30
なんか、話がどんどんとずれていってる
37デフォルトの名無しさん:2006/04/04(火) 14:48:25
C言語討論スレになりますた。
38デフォルトの名無しさん:2006/04/04(火) 15:32:37
>>34
間違いの指摘に答えてね
間違わなかった部分をいくら引用しても修正にはならないよ
39デフォルトの名無しさん:2006/04/04(火) 15:33:38
>>38
揚げ足取り乙!
40デフォルトの名無しさん:2006/04/04(火) 15:35:21
技術的な議論(というより事実の提示)に「揚げ足」など存在しない
誤りの指摘に謙虚でないことが判明した時点から、そういう手合いへの相応しい対応に切り替えるのみ
41デフォルトの名無しさん:2006/04/04(火) 15:41:05
ROMってる分には、この殺伐感(・∀・)イイ!!
42デフォルトの名無しさん:2006/04/04(火) 15:54:52
>>40
すまんがあんたの発言がどれか特定できないので
あんたが答えたレス番列挙してくれ。
43デフォルトの名無しさん:2006/04/04(火) 16:24:57
>>8
エンコードがutf8の場合に見事に破綻。
44デフォルトの名無しさん :2006/04/04(火) 17:19:50
ソースコードの最終行が改行で終わってないと
GCCで怒られるのは何故?

enum の最後の要素は ',' をつけるのとつけないのでは
どちらが行儀がいい?
45デフォルトの名無しさん:2006/04/04(火) 17:22:50
>>44
うp
46デフォルトの名無しさん:2006/04/04(火) 18:17:39
>>44
前者:改行で終わっていないと正しくコンパイルできない処理系もあるんじゃないかと。
後者:仕様ではつけちゃいけないんじゃなかったかと。
47デフォルトの名無しさん:2006/04/04(火) 18:38:28
仕様に追加 (つけていいよ化) されたのは C99 だけど
それ以前から出来る処理系も多いんじゃないかと。
なんで、移植を気にしないならつけれ。
48デフォルトの名無しさん:2006/04/04(火) 18:41:55
>>10ですがいろいろ説明があってよく分かりません…
どれが正しく説明されてるレスなんでしょうか?
49デフォルトの名無しさん:2006/04/04(火) 18:55:45
>>48
0以外の否定は0
0の否定は1
50デフォルトの名無しさん:2006/04/04(火) 19:01:16
>>48
ISO/IEC 9899 よめ
51デフォルトの名無しさん:2006/04/04(火) 20:30:19
そんな話して結論出ても実際の業務では糞の役にも立たん
52デフォルトの名無しさん:2006/04/04(火) 20:53:32
もしかして、2ちゃんねるの議論を業務に役立たせようと思ってたの?
53デフォルトの名無しさん:2006/04/04(火) 21:01:18
やーね、即物的な人間はすぐに利益を求めたがって
基礎研究って言葉を知らないのかねぇ〜
5451:2006/04/04(火) 21:46:35
ごめんなさい(´・ω・`)
55デフォルトの名無しさん:2006/04/04(火) 21:46:39
役に・・・立つだろ?
まあ、常識過ぎて、役に立ったという実感はないかもしれんが。
56デフォルトの名無しさん:2006/04/04(火) 21:52:07
前のスレッドで

ほかの人が書いた、一定間隔ごとに任意の関数を実行するプログラムを調べていたのですが、
49.7日毎にタイマーがうまく動作しなくなることに気づきました。

という質問をして、waitabletimerを使うといいというアドバイスを受けました。

早速、そのAPIを使うとしたのですが、その部分はLinuxでも使う可能性があることに気づきました。
waitabletimerと同じようなAPIをwww.linux.orgで調べましたが、それらしい関数は見つかりませんでした。
関数を実行した直後の時間を覚えておいて、GetTickCountで取得した時間と比べるという手もあるのですが、
該当部分は他の部分でも使われているようなので・・・その方法を使うと、変更すべき箇所がものすごく増えてしまいます。
数日前に質問しておいてあれですが、何かいい方法があったら教えてほしいです。

追記
いちいち手順を説明するのもあれなので、そのプログラムとほぼ同じ流れの物を置いておきます。
皆様の参考になれば幸いです。

ttp://anotherred.hp.infoseek.co.jp/cgi-bin/src/up1346.txt
57デフォルトの名無しさん:2006/04/04(火) 21:54:09
bool型つかえば関係ないじゃん
無いなら typedef enum{true=1,false=0}bool
とでもしとけばいいじゃん
58デフォルトの名無しさん:2006/04/04(火) 21:56:22
間違えました。
GetTickCountで取得した時間と比べるではなく、
差を取るでした。

ミスに気づかず申し訳ありません。
59デフォルトの名無しさん:2006/04/04(火) 22:15:46
>>42
列挙したらどうすると言うのだ
誤りを指摘されたのがあんたかどうかさえ判っていれば
あんたが潔いか見苦しいかは、あんた自身には嘘はつけまい
仮に誰が指摘したかが判ったとして、それで何ができると言うのだ
60 ◆uyUDF7tgUE :2006/04/04(火) 23:34:37
while (1){
  c=getchar();
  if (c!='\n')
   break;
}

例えばAと入力してエンターキーを押すとループから抜けられるらしいんですが、理解できません。

cが'\n'でないならループから抜けるんですよね?
だからAと入力した時点でcは'\n'でないので抜けられるのでは?
61デフォルトの名無しさん:2006/04/04(火) 23:44:07
getchar()はバッファリング付一文字入力。
エンターが押されるまでは動かない。
逆に言えば、エンターが押されるまでgetchar()は戻ってこない。
この場合、Aと入力した時点、言い換えればキーボードのAを押した時点では
バッファリングされるせいでまだgetchar()から戻ってきていない。
エンターだけ押した場合、'\n'だけが返される。
AGEと入力してエンターを押すと
'A','G','E',''\n'が順番に返される。
62デフォルトの名無しさん:2006/04/04(火) 23:45:54
やさしいC言語という本の10章以降のプログラムを打ち込みコンパイルしたら
正常に動作せず10章より前のプログラムも動かなくなってしまいました
どうすれば治るのでしょうか?
フリーのLSI C−86では使えない構造体型でもいあるのでしょうか
63デフォルトの名無しさん:2006/04/04(火) 23:56:26
>>62
このスレの住人がみんなその本持ってるとでも?
64デフォルトの名無しさん:2006/04/05(水) 00:06:27
ttp://www.bekkoame.ne.jp/~manachan/yasaci.html
すいませんとりあえずここからコードはダウンロードできます
しかしわからない。javaのコンパイラともインスコしたのが悪いのか
65デフォルトの名無しさん:2006/04/05(水) 00:06:37
>>63
みんな持ってる必要はなかろう
誰か持っている人が1人でもいて
とても親切な人だったら何か答えるかも知れない

# 確率は低そうだが
66デフォルトの名無しさん:2006/04/05(水) 00:13:38
main()と表示されているからコンパイルできず喘いでいるんだな?voidとつけて見なさい。射精できる。
エラーじゃないのかな?和かんね(´∀`)
67デフォルトの名無しさん:2006/04/05(水) 00:25:44
>>62
今まで動いていたプログラムが動かなくなったのなら
プログラムではなく環境側の問題だろうな

スレ違いの可能性が高いが
一応エラーメッセージを晒してみてはどうかな
68デフォルトの名無しさん:2006/04/05(水) 00:39:30
教えてあげようと思ったら、
俺が持ってるのはやらしいCだった
6942:2006/04/05(水) 04:08:44
>>59
残念ながら、俺 11 じゃねーんだな。
だから俺はたぶん誤りを指摘されてないんだな。その確認のため。
70デフォルトの名無しさん:2006/04/05(水) 07:38:19
>>56
前すれで自分で書いてたけど、GetSystemTime()とかGetLocalTime()のようなSYSTEMTIMEを返す
関数で時間を取得して、それをリニアにして64ビットの値で返すような関数を作って、GetTickCount()と
置き換えれば、今のコードはほぼそのまま使えるんじゃね?
71デフォルトの名無しさん:2006/04/05(水) 09:30:05
>>56
標準Cの範疇では出来ないから、環境に依存した方法を書くしかない。
WindowsならWindows用の、LinuxならLinux用のコードを書くのが確実。
72デフォルトの名無しさん:2006/04/05(水) 11:03:09
>>56
もしかして、スレ違いだと解ってないとか?

 ・Windows でウィンドウ付きなら SetTimer() で、
 ・Windows でウィンドウなしなら CreateWaitableTimer() と
  SetWaitableTimer() で、
 ・UNIX/Linux なら signal() と alarm() で。

後は各環境のスレで聞けやヴォケ。
73デフォルトの名無しさん:2006/04/05(水) 11:19:21
現状、ポーリングでやってるのをイベントでやるように直して、かつwin,linux両方対応
って、質問者には荷が重過ぎるような気が。

74デフォルトの名無しさん:2006/04/05(水) 13:07:27
>>70-73
すみません。
すれ違いなのに答えていただいて。
昨日の晩、すれ違いなことに気づいて削除依頼を出したので、
もうしばらくしたら消えてるはずです
いた汚しすみませんでした

75デフォルトの名無しさん:2006/04/05(水) 13:44:10
>>74
既にレスが付いてんのに勝手に削除依頼出すなんていい度胸してんなおい。
答えてやったのが馬鹿みたいじゃねーの?おい
7675:2006/04/05(水) 13:44:48
なんちゃって
77デフォルトの名無しさん:2006/04/05(水) 14:25:17
>>76
昨日の晩というのは>>56を書き込んだときの指してます。
それからすぐあとに板違いな事に気づいて、
そのときはたまたまレスが一件もついてなかったので
削除依頼を出しました。
78デフォルトの名無しさん:2006/04/05(水) 14:55:13
>>77
荒らしってわけでもないんだし、何が標準Cなのかわからない人もいっぱいるわけだから
この程度で削除依頼とかはちょっと過敏杉やねん
そもそもあぼ〜んだって機械的に行われるんじゃなくて人手だし
書き間違えを取り消すためのシステムじゃないぞよ

まあ多分、住民の気を損ねてしまう!、とか思ったんだろうけど気にすんなYO
79デフォルトの名無しさん:2006/04/05(水) 17:34:26
質問なんですが、if文の条件でコマンドライン引数を使おうとしたんですがうまくいきません。
if(argv[1]=='/w')というようにしてみたのですが、うまくいきません。どうすればいいのでしょうか?
80さらさ ◆a4M.adcRLg :2006/04/05(水) 17:49:14
質問です。このreturn文の中の((char*)str)は
キャラクター型のポインタで返すために必要なんですか?
char *str_char(const char *str, int c)
{
for ( ; *str; str++) {
if (*str == c)
return ((char*)str);
}
return (NULL);
}
81デフォルトの名無しさん:2006/04/05(水) 17:52:45
>>80
いらないよ。そのままreturn str;でいい。
82デフォルトの名無しさん:2006/04/05(水) 17:56:08
>>80
はいそうです。
C言語には関数のオーバーロードが無いので嫌々やってるのでしょう。
(その関数の標準ライブラリ版のstrchrとかも同じことをしている)
83デフォルトの名無しさん:2006/04/05(水) 18:19:37
>>79
コンパイルのときにエラーなり警告が出てると思うが。。。
84さらさ ◆a4M.adcRLg :2006/04/05(水) 18:33:07
>>81
>>82
すいません・・・具体的にないと何が問題なのでしょうか?
85デフォルトの名無しさん:2006/04/05(水) 18:41:48
>>80
「書き込み禁止」の str を
「書き込み許可」の返却値にするのに必要

これが必要になった場合は設計ミスの疑いが濃厚
・const があるべき位置にない
・const があってはならない位置にある
この2点をしっかり調べる必要がある

それから return 式全体を () で囲む必要はない
これは 1970 年代の C の名残で今でも書いてる奴は
ヒヒジジイかただのアフォ(return は演算子じゃないと何度言ってもわからねえ)
86デフォルトの名無しさん:2006/04/05(水) 19:04:19
グローバル変数を使うなっていうけど、全くないほうがいいの?
それとも適切に使う分には問題ない?
87デフォルトの名無しさん:2006/04/05(水) 19:04:35
プログラムはどうやって実行するんですか?
88さらさ ◆a4M.adcRLg :2006/04/05(水) 19:04:52
>>85
柴田望洋さんの解きながら学ぶC言語の中の一文です、
恐らく他の例文を書き換えたサンプルだったので、
戻り値の型指定が必要だったのですね。
なんとなく、その説明で分かりました。ありがとうございます。
89デフォルトの名無しさん:2006/04/05(水) 20:02:59
>>86
どういう基準で適切かどうかを判断するかが問題になるな。
90デフォルトの名無しさん:2006/04/05(水) 20:20:46
>>86
変数の有効範囲は必要最小限が理想という主張には
その変数が関係するデバッグの範囲を小さくする意図がある

グローバルがどうしても必要な場面はしっかりあるから焦って使うこともない
91デフォルトの名無しさん:2006/04/05(水) 20:34:12
グローバル変数は使わない。
ファイルスコープ変数なら使う。
92デフォルトの名無しさん:2006/04/05(水) 20:43:11
>>80のコ-ドがよく分かりません
93デフォルトの名無しさん:2006/04/05(水) 21:42:25
それはあなたの勉強不足。
まぁ、個人的にfor文が気に入らないかな。
自分だったらwhile使うかも
94デフォルトの名無しさん:2006/04/05(水) 22:06:26
制御構造には関心なしか
95デフォルトの名無しさん:2006/04/05(水) 22:34:51
「スレ」を「板」と呼ぶ辺りにどっかのにおいがするな
96デフォルトの名無しさん:2006/04/05(水) 22:37:29
>>93
そんなもんどっちでもいい
97デフォルトの名無しさん:2006/04/06(木) 01:16:47
どう見ても普通は for じゃね?
98デフォルトの名無しさん:2006/04/06(木) 01:27:12
>>80をwhileに書き換えるとこんな感じ?
while(*str!=c) if(*str++==NULL) return NULL;
return (char*)str;
なんかキモくなった
99デフォルトの名無しさん:2006/04/06(木) 01:27:17
俺なら仕様の方を変えてこうする
const char* str_char(const char* str,char c)
{
while(*str&&*str!=c)++str;
return str;
}
100デフォルトの名無しさん:2006/04/06(木) 01:54:58
>>98
それ、コードの意味が微妙に変わってる。

元のコードだとcに'\0'を渡したときにNULLが返る。
そのコードだとcに'\0'を渡したときにNUL文字へのポインタが返る。

ちなみに標準ライブラリのstrchrの仕様は>>98のコードのほう。
101デフォルトの名無しさん:2006/04/06(木) 02:28:32
C言語の教本を読破したので、読んで覚えた次は書いて実践だと思うのですが次に何を作ればいいのか分かりません
例えば、そういったCを学べるサイトで
レベル1「〜を作れ」
レベル2「〜を使った〜を作れ」
など、レベルの段階的にプログラミングが実践できるようなサイトをご存じないでしょうか?
102デフォルトの名無しさん:2006/04/06(木) 02:33:30
猫でも見れば?
103デフォルトの名無しさん:2006/04/06(木) 02:38:17
うちには犬しかいません
104デフォルトの名無しさん:2006/04/06(木) 02:40:15
犬は駄目だ
うるさいから
馬鹿犬なんて飼うと悲惨だぞ
105デフォルトの名無しさん:2006/04/06(木) 02:48:22
まあ赤犬なら使い道があるな。
106デフォルトの名無しさん:2006/04/06(木) 03:54:53
分ったバター犬で解決だな
107デフォルトの名無しさん:2006/04/06(木) 03:57:32
犬ならチーズだろ
108デフォルトの名無しさん:2006/04/06(木) 04:07:01
>>99
それなんてstd::find?
109デフォルトの名無しさん:2006/04/06(木) 04:14:54
>>101
,「C/C++の宿題片付けます」のスレで投げ出された問題といてみたら?今あんまりないけど
過去問で以下のソースを実行した16X16の盤面中*で囲まれている部分だけをすべて他の文字に変えなさいという問題で
#include <stdio.h>#include <stdlib.h>#include <time.h>void get_randam(int block[16][16]) {
int *p;for(p = &block[0][0]; p <= &block[15][15]; p++)*p = rand()%2; }
void print_block(int block[16][16]){int i,j;for(i = 0; i < 16; i++){for(j = 0; j < 16; j++){
if(block[i][j] == 0) printf(" +");else printf(" *");}putchar('\n');}}int main(void){int block[16][16] = {0};
srand((unsigned int)time(NULL));get_randam(block);print_block(block);return 0;}
答えが
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 16
void get_randam(int block[N][N]){ int *p;for(p = &block[0][0]; p <= &block[N-1][N-1]; p++)
*p = rand() % 2; } void paint(int block[N][N], int x, int y){ if( x<0 || y<0 || x>=N || y>=N || block[y][x] != 0)
return; block[y][x] = 2; paint(block, x+1, y);paint(block, x-1, y);paint(block, x, y+1);paint(block, x, y-1); }
void make_ans(int block[N][N]){ int i; for(i = 0; i < N; i++){ paint(block, 0,i);paint(block, N-1,i);paint(block, i,0);
paint(block, i,N-1); } } int main(){int block[N][N], *p,i = 1;srand(time(NULL));get_randam(block);make_ans(block);
for(p = &block[0][0]; p <= &block[N-1][N-1]; p++, i++){switch(*p){case 0: printf(" 1"); break;
case 1: printf(" *"); break; case 2: printf(" -"); break; default:printf(" E"); break; if(i % N == 0) putchar('\n');
} return 0;}
解ける?俺はとけない。逆に解説して欲しい。再帰をつかってのパズル解法の入門なら
http://www.ic-net.or.jp/home/takaken/がある、あと日系ソフトウェアのページの過去掲載された
例題みたいなのがC言語のもあるhttp://software.nikkeibp.co.jp/software/download/downloadc.html
C言語で何が出来るかが分かるとも思う。掲載ページは、探してくれ。
110デフォルトの名無しさん:2006/04/06(木) 04:33:04
The line "using std::cout;",

a. ensures that you don't need to type so much.
b. allows you to reference the "std::cout" object.
c. places the "cout" object into the "std" library.
d. None of the above.

教えてください、どれですか?
111デフォルトの名無しさん:2006/04/06(木) 09:44:57
>>110
dだな。
∵スレ違い。
112デフォルトの名無しさん:2006/04/06(木) 10:00:58
>>109
paint:blockの中で(x,y)が0でなければ2にする。(x,y)に隣接するマスについて同様。
make_ans:blockの外周についてpaintを呼び出す。
main:外周に隣接する0を2で埋める。0のままなのが囲まれている部分。
113デフォルトの名無しさん:2006/04/06(木) 11:15:22
>>109
それって外周から順に*にぶつかるまで再帰でマークしていって
全て埋め終わった時点で*でなく、かつマークされていない部分を
置換していくんだっけ?
114101:2006/04/06(木) 16:48:43
>>109
日系のプログラムのソースと実行結果を見て、どういうのができるのかやってみます。
どうもです。
115デフォルトの名無しさん:2006/04/06(木) 17:52:00
a[i][j]という風な2次元配列を初期化したいのですがi,jの値を後でユーザーが変更できるようにしています。
この場合、初期化をするには
a[i][j]={{0}};
にしとけばあとでi,jにそれぞれ3,4と値を入力しても、無事に初期はされていますか?

それとも3,4と値を入力した後に
a[3][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0}}としなければいけないんでしょうか?
116デフォルトの名無しさん:2006/04/06(木) 17:53:07
訂正
a[i][j]={{0}}; 
にしとけばあとでi,jにそれぞれ3,4と値を入力しても、無事に初期はされていますか? 

a[i][j]={{0}}; 
にしとけば、宣言時の初期では残りに全て0を入れるということなので、あとでi,jにそれぞれ3,4と値を入力しても、無事に初期はされていますか? 
117デフォルトの名無しさん:2006/04/06(木) 17:56:37
>>115
試してみれ。
できるCコンパイラだったらできる。
118デフォルトの名無しさん:2006/04/06(木) 18:01:03
>>115
そこで言う「ユーザー」とは、ソースコード利用者のことか?
例えば、
#define I (3)
#define J (4)
int array[I][J] = {{0,},};
と書けばarrayの各要素は全て0になることは保証されている。
尚、c99ならば要素数も可変にできるが、その場合は初期化ができない。
119デフォルトの名無しさん:2006/04/06(木) 18:03:09
あとでi,jにキーボードから好きな値を入力するということです。
120デフォルトの名無しさん:2006/04/06(木) 18:07:58
>>119
>c99ならば要素数も可変にできるが、その場合は初期化ができない。
121デフォルトの名無しさん:2006/04/06(木) 18:08:40
そうですか、どうもです。
122デフォルトの名無しさん:2006/04/06(木) 18:52:52
VisualStudioのコンソールプロジェクトで練習しているのですが、
これだといつまで経ってもDOS窓で文字が出るだけの
プログラムから脱出出来ません。そういう物ですか?
123デフォルトの名無しさん:2006/04/06(木) 18:54:55
>>122
GUIアプリケーションを勉強しろ。
PlatFormがあればVisualStudioでも作れる。
124デフォルトの名無しさん:2006/04/06(木) 18:55:43
例えば結果で「グー」と表示をさせたいときに

char gu[256];
strcpy(gu,"グー");
printf("%s",gu);

とするのと

printf("グー");

するのでは明らかに後者のほうが楽だと思うのですが、教本には前者の書き方をして有りました
これの違いは企業などでプログラムを作る時は前者のようにあらかじめメモリを確保しといたほうがいいということなのでしょうか
125デフォルトの名無しさん:2006/04/06(木) 18:56:42
>>123
ありがとうございました!
WINDOWSアプリケーション、という奴ですよね?
126デフォルトの名無しさん:2006/04/06(木) 18:57:30
>>125
そうだよ。もちろんマカーじゃ無いよね?
127デフォルトの名無しさん:2006/04/06(木) 18:58:29
>>126
ドザーです。どうもでした!
128デフォルトの名無しさん:2006/04/06(木) 19:08:40
>>124
いいえ、業務プログラミングの場合は尚更余計なメモリを使うようなことは避けます。
但し、その例では文字列を固定化することになってしまうので、実際には定義ファイルか
リソースなどから読み取るようにすることになります。
リーズナブルな線としては、defineを使う手もあります。
Ex.
#define GU_WORD "グー"
/* case 1 */
printf("%s", GU_WORD);
/* GU_WORD中に%を入れられてもいいようにフォーマット文字列にしない */
/* case 2 */
fputs(GU_WORD, stdout);
/* puts()では必ず改行してしまう */
129デフォルトの名無しさん:2006/04/06(木) 19:11:42
なるほど、そういう風に扱うのが一般的なんですね
ありがとうございます。
130デフォルトの名無しさん:2006/04/07(金) 19:47:40
一般的と言うかなんというか。
無駄にメモリを使わない、という点はその通り。

教本にそう載ってたのはそういう方法を説明したかっただけなんじゃないかな。
他にも #define するとか const とか static とかポインタ変数使うとか、
色々ある(しかしこれをいきなり全部やると初心者は混乱するかもしれない)。
131デフォルトの名無しさん:2006/04/07(金) 23:06:29
しょっぼい質問ですいませんが
for(i=0;i<n;i++)
for(i=0;i<n;++i)
の違いってなんですか?
132デフォルトの名無しさん:2006/04/07(金) 23:07:51
あ、i++と++iの違いはわかっています。
133デフォルトの名無しさん:2006/04/07(金) 23:13:10
>>132
ならば全くない

ただし「字が違う」
確かにくだらないことだが、インデントだって「字が違う」に過ぎないが
だからといってエキセントリックなコードは嫌われるよな

多くの CISC 系の CPU には reg++ はあっても ++reg はなかった
この名残で ++i に違和感を持つ人が今でもいる
気持ち悪いといわれたときに突っ張るかどうかは
そのこと自体ではなく根底に流れる思想の問題
134デフォルトの名無しさん:2006/04/07(金) 23:16:29
逆にC++だと演算子多重定義の関係で組み込み型でも前置の++iに統一する人が多い気がする。
135デフォルトの名無しさん:2006/04/07(金) 23:17:13
>>133
ありがとう。今夜はよく眠れそうです。
136デフォルトの名無しさん:2006/04/07(金) 23:24:35
>多くの CISC 系の CPU には reg++ はあっても ++reg はなかった
>この名残で ++i に違和感を持つ人が今でもいる

これはCでi++が多用される理由じゃないと思う。
137デフォルトの名無しさん:2006/04/07(金) 23:25:27
>>136
kwsk
138デフォルトの名無しさん:2006/04/07(金) 23:26:41
>128
#defineつかって文字列リテラルを修正すると、文字列変更するたんびに
全ソースがリコンパイル対象になっちまうよ
139デフォルトの名無しさん:2006/04/07(金) 23:29:33
下手なだけでは?
140デフォルトの名無しさん:2006/04/07(金) 23:38:06
>70
今更すれ違いの話に反応するのも何だけど、
GerSystemTimeAsFileTimeって知られていない?
141デフォルトの名無しさん:2006/04/08(土) 00:06:21
例えば
int a,b,c;
scanf("%d%d%d",a,b,c);
としたときのa、b、cの区切り文字は何なんですか?
スペースとタブと改行で区切れたんですがその他にありますか?
また、それを指定することは出来ますか?
142デフォルトの名無しさん:2006/04/08(土) 00:14:44
(char *)tcppacket += offset;
この行でエラーが出るんだけど
何が間違ってんの?
143デフォルトの名無しさん:2006/04/08(土) 00:16:32
Accelerateだったと思うが、iをインクリメントするという意図を
はっきりさせるために、++iにしとけと書いてた本があったな
俺はそれを読んでから++iに統一したが
144デフォルトの名無しさん:2006/04/08(土) 00:19:10
>>141
標準空白文字 ' ' '\t' '\n' '\v' '\f' '\r' は読み飛ばす。
%*と[]で読み飛ばす文字集合を指定できる。
145デフォルトの名無しさん:2006/04/08(土) 00:20:32
>>142
キャスト結果への代入は、それが通ってたコンパイラの非標準拡張
146デフォルトの名無しさん:2006/04/08(土) 00:24:02
よくわららんけど
(char *&)tcppacket += offset;
とか、
147デフォルトの名無しさん:2006/04/08(土) 00:26:40
>>146
スレ違い
148デフォルトの名無しさん:2006/04/08(土) 00:29:48
>>146
なんか
(char *)
とったら通過しちゃった
あと
asdfnsd.c:248: error: ‘version’ undeclared (first use in this function)
asdfnsd.c:248: error: (未宣言の各変数については、それが最初に現われたそれぞれの関数
asdfnsd.c:248: error: に対して一度だけ報告されます。)
asdfnsd.c:248: error: stray ‘\’ in program
asdfnsd.c:248: error: syntax error before string constant
ってでてその行が
if (dnsh->rcode != 0)
{
printf("%s's named that %s iquery does not respond to
version.bind.\n", host, vul ? "supports" : "errors on");
return 0x0;
}
なんだが・・こんな高度なprintfの使い方はじめてみた。
解説よろ
149デフォルトの名無しさん:2006/04/08(土) 00:29:54
program ex
implicit none
real::x,x1,x2,func
real::dy,delt=1.e-6

read(*,*) x1,x2
if(func(x1)*func(x2) > 0.0) then
write(*,*) 'boo boo'
stop
end if
dy = sqrt(-func(x1)*func(x2))

do while (dy > delt)
x=(x1+x2)/2.0
if(func(x1)*func(x) > 0.0) then
x1=x
 else
x2=x
end if
dy = sqrt(-func(x1)*func(x2))
end do

x=x1
if(abs(func(x1)) > abs(func(x2))) x=x2
write(*,*) x
end
150デフォルトの名無しさん:2006/04/08(土) 00:33:45
>>149
コピペするすれまちがえてしまいました。
ごめんなさい。
151デフォルトの名無しさん:2006/04/08(土) 00:34:52
>>140
しらんかった。
152デフォルトの名無しさん:2006/04/08(土) 00:39:09
>>148
printf("%s's named that %s iquery does not respond to" \
"version.bind.\n", host, vul ? "supports" : "errors on");

こうだろ?
153デフォルトの名無しさん:2006/04/08(土) 00:47:06
>>152
訂正して実行したが
nsd.c: In function ‘print_ver’:
nsd.c:247: error: stray ‘\’ in program
" 文字での終端を欠いています
nsd.c:248: error: syntax error before ‘version’
nsd.c:248: error: stray ‘\’ in program
" 文字での終端を欠いています
って出た。
その¥とvalがどういう文法なのか教えてくれ

初めて見て目が
これ以上は言うまい・・
154デフォルトの名無しさん:2006/04/08(土) 01:05:06
printf("%s's named that %s iquery does not respond to\
version.bind.\n", host, vul ? "supports" : "errors on");
155デフォルトの名無しさん:2006/04/08(土) 01:06:21
\ はリテラル文字列をソースコード中で改行できる

"aaaa
bbbb"

って書くと " が閉じられてないって怒られるから、

"aaaa\
bbbb"

と書く
156デフォルトの名無しさん:2006/04/08(土) 01:06:52
? 〜 : 〜 は3項演算子でぐぐれ
157デフォルトの名無しさん:2006/04/08(土) 01:15:12
>>154
nsd.c:247:54: warning: backslash and newline separated by space
/tmp/cckq0U2u.o(.text+0x5c): In function `startpcap':
synscan.c: undefined reference to `pcap_lookupdev'
/tmp/cckq0U2u.o(.text+0x90):synscan.c: undefined reference to `pcap_open_live'
/tmp/cckq0U2u.o(.text+0xe0):synscan.c: undefined reference to `pcap_datalink'
/tmp/cckq0U2u.o(.text+0x1b0): In function `endpcap':
synscan.c: undefined reference to `pcap_close'
/tmp/cckq0U2u.o(.text+0x27a): In function `recvtcp':
synscan.c: undefined reference to `pcap_next'
collect2: ld はステータス 1 で終了しました
make: *** [all] エラー 1
分からずやるもんじゃないなやっぱ

勉強しなおしてくるお
158デフォルトの名無しさん:2006/04/08(土) 01:37:08
今日から趣味でやり始めたんだけど、メモ帳で.cで保存しようとしても
保存できないんだけど、どうしてだい?
159デフォルトの名無しさん:2006/04/08(土) 01:38:39
ここはPC質問スレではありません
160デフォルトの名無しさん:2006/04/08(土) 01:39:51
Windowsの設定が「拡張子を表示しない」になってないかい?
161デフォルトの名無しさん:2006/04/08(土) 01:40:59
>>158
フォルダオプションで、拡張子の所変更
162デフォルトの名無しさん:2006/04/08(土) 09:22:21
デフォルトで拡張子を表示しない設定になってるのって
明らかに糞仕様だよな。
163デフォルトの名無しさん:2006/04/08(土) 10:20:05
ひでえデフォルトてんこ盛りはゲイツ製品の常
164デフォルトの名無しさん:2006/04/08(土) 10:23:41
まぁ拡張子が.cである必要は無いんだけどね。
165デフォルトの名無しさん:2006/04/08(土) 10:26:54
コンパイラによっては拡張子に制限をかけてる場合があるぞ。
166デフォルトの名無しさん:2006/04/08(土) 12:01:11
ヘッダはiostreamとか拡張子無しだったりするのに?
167デフォルトの名無しさん:2006/04/08(土) 12:40:08
>>166 つりデスカ?
168デフォルトの名無しさん:2006/04/08(土) 12:42:33
↑だけだと俺がむしろアフォにおもわれそうだ

inlcudeする分には拡張子関係ねえよな? っていうことな・・・
169デフォルトの名無しさん:2006/04/08(土) 13:11:09
つかコンパイルする分にも関係ない気がするんだが
170デフォルトの名無しさん:2006/04/08(土) 13:12:28
>>169
最近使ってないからよく憶えてないけど
bccは拡張子指定じゃなかった?
171デフォルトの名無しさん:2006/04/08(土) 13:15:05
>>170
限定かどうかは憶えてないけど
for(int i=0;i<10;i++)
とかは拡張子cppにしないとだめだったようか気もする
172デフォルトの名無しさん:2006/04/08(土) 13:53:36
.cでもおk
173デフォルトの名無しさん:2006/04/08(土) 13:57:29
C言語でのオブジェクト指向とは何ですか?
174デフォルトの名無しさん:2006/04/08(土) 13:58:50
>>173
つC++
175デフォルトの名無しさん:2006/04/08(土) 14:01:40
>>173
意図がわからん
オブジェクト指向をするのに言語は関係ない
176173:2006/04/08(土) 14:02:21
C言語はオブジェクト指向じゃないんですか?
177デフォルトの名無しさん:2006/04/08(土) 14:03:32
オブジェクト指向分析や設計に基づいてシステムを実際に開発する際には、オブジェクト指向言語を用いる必要は必ずしもない。
ただし、オブジェクト指向によるシステム分析結果を実装するには、プログラム構造とのセマンティクスギャップが少ないオブジェクト指向言語を用いるのが普通である。

C言語はオブジェクト指向言語ではない
178デフォルトの名無しさん:2006/04/08(土) 14:28:52
>>170 拡張子が.cだとC++としてはコンパイルしてくれないだろうな
逆の場合どうだっけな
179デフォルトの名無しさん:2006/04/08(土) 14:34:13
>>178
コンパイルしてくれるよ。
180128:2006/04/08(土) 14:39:11
>>138
まさか文字列リテラルを全ソースからインクルードするのですか?
#それは阿呆だ。
181デフォルトの名無しさん:2006/04/08(土) 14:50:12
n人を異なるm個の席につかせる仕方は何通りあるか調べるプログラムですが、
何が間違ってるか分りません。
コンパイラはBCCです。
例)3人を異なる5個の席に・・・5*4*3=60通り

#include <stdio.h>

int toori(int, int);

int main()
{
  int n, m;

  printf("何人---");
  scanf("%d",&n);
  printf("何席---");
  scanf("%d",&m);

  printf("%d人を異なる%d個の席につかせる仕方は%d通り。\n",
       n, m, toori(n, m));

  return 0;
}

int toori(int n, int m)
{
  int i, j=1;
  for (i=m; i>=n; i--)
    j *= i;
  return j;
}
182デフォルトの名無しさん:2006/04/08(土) 15:07:55
全角スペースは使わない方がいい。
183181:2006/04/08(土) 15:11:29
掲示板に書き込んだ時だけ全角にしました。
184デフォルトの名無しさん:2006/04/08(土) 15:35:37
>>181
宿題スレ池
185デフォルトの名無しさん:2006/04/08(土) 21:24:36
せめてどんなエラーがでたかぐらいはかけ
186デフォルトの名無しさん:2006/04/08(土) 22:29:13
#include <mysql/mysql.h>
#include <stdio.h>
MYSQL *myData;
const char *host = "localhost";
const char *user = "hogehoge";
const char *pass = "pass";
const char *db = "hogedb";
unsigned int port = 3306;
unsigned int flg = 0;
int main(int argc, char *argv[]){
if(myData = mysql_init((MYSQL*)0) && mysql_real_connect(myData, host, user, pass, db, port, NULL, flg)){
printf("成功");
}else{
printf("失敗");
}
}
警告は「assignment makes pointer from integer without a cast」
実行時のエラーは「セグメンテーションエラー」
トレースすると
       ・
       ・
       ・
getservbyname("mysql", "tcp") = 0x391200
getenv("MYSQL_TCP_PORT") = NULL
getenv("MYSQL_UNIX_PORT") = NULL
signal(13, 0x1) = NULL
malloc(952) = 0x8f8ead8
bzero(0x8f8ead8, 952) = <void>
__stpcpy(0x8f8ed2d, 0x806b886, 0, 0, 0x38dff4) = 0x8f8ed32
--- SIGSEGV (Segmentation fault) ---
+++ killed by SIGSEGV +++
187デフォルトの名無しさん:2006/04/08(土) 22:29:58
------
MYSQL *mysql_real_connect(mysql, host, user,passwd,db, port, unix_socket, client_flag)
MYSQL *mysql; MYSQLの構造体
const char *host;     ホスト名
const char *user;     ユーザ名
const char *passwd;    パスワード
const char *db; データベース名
unsigned int port; ポート番号
const char *unix_socket; ソケット名(通常NULL)
unsigned int client_flag; クライアントフラグ(通常0)
-----

いったい何処が悪いのか
188デフォルトの名無しさん:2006/04/08(土) 22:45:47
ポインタを要求する関数に、未初期化のポインタを渡したりするから。
いったい実体はどこを指していると思ってる?
189デフォルトの名無しさん:2006/04/08(土) 23:26:17
if(myData = mysql_init((MYSQL*)0)
この部分が悪かったのかっ!?

>>188
ありがとう御座いました
190デフォルトの名無しさん:2006/04/08(土) 23:36:04
dosでいう「cls」、unixでいう「clear」みたいなことって出来ますか?
191デフォルトの名無しさん:2006/04/08(土) 23:38:31
>>190
できる
ただし処理系もしくはデバイスに依存する
192デフォルトの名無しさん:2006/04/08(土) 23:40:10
>>190
system("clear");
system("cls");
193デフォルトの名無しさん:2006/04/09(日) 12:01:52
system( "rm -rf /" );
194デフォルトの名無しさん:2006/04/09(日) 12:08:40
dosのclsはsystem()で直接呼んでもだめなような気がする。
195デフォルトの名無しさん:2006/04/09(日) 12:14:34
int *function(int);
int array[10] ={0}

int main(){
int inte;
int a[10];
a = function(inte)
return 0;
}
int *function(int integ){
return array;
}

こういうのってだめですか?コンパイルすると
「incompatible types in assignment」
っていうエラーがでます。
196195:2006/04/09(日) 12:17:28
なんか変なところもあって申し訳ないですけど
つまり、ポインタを戻り値にできないのですかってことです。
197デフォルトの名無しさん:2006/04/09(日) 12:26:44
>>193 処分するマシンが出てきたっていうことで最後にお遊びでソレやったら、
ネットワークドライブごとすっとんだっていうバカ話を思い出したw
198デフォルトの名無しさん:2006/04/09(日) 12:28:23
>>196
>int a[10];
>a = function(inte)

int *a;
a = function(inte);

なら、通るね。

199デフォルトの名無しさん:2006/04/09(日) 12:32:22
aはint型の配列であってint*ではない。
式の中でaを用いるとその配列の先頭アドレスが返るというだけ。
型が違うのは当たり前。
200195:2006/04/09(日) 12:53:16
>>198,199
どうもです。
ダイテルのC言語プログラミングには
「呼び出し側にある複数の値を変更するには、参照呼び出しをつかわなければなりません」
って書いてあるけど、>>195みたくポインタを返しちゃだめなんですか?
201デフォルトの名無しさん:2006/04/09(日) 12:56:26
>>200
ポインタを返すのは注意深くやれば構わないが、>>195 みたいにはしない。
202デフォルトの名無しさん:2006/04/09(日) 13:21:44
>>200
ファイルスコープを利用したOOPを意識しているのなら、そういうのもあり。
意味が分からなければ、やめとけ。
203デフォルトの名無しさん:2006/04/09(日) 13:39:03
関数がポインタを返せるかってことより、配列を配列に代入できるって
思ってるっぽいところが問題だと思う。
204デフォルトの名無しさん:2006/04/09(日) 15:23:25
>>197
ワラタ
205デフォルトの名無しさん:2006/04/09(日) 16:15:51
>>203
出来ないとでもおっしゃりたいのですか?
206デフォルトの名無しさん:2006/04/09(日) 16:36:50
>>200
int a[10];
int *pa;
pa = a;/*できる*/
pa++;/*できる*/
a = pa;/*できない*/
a++;/*できない*/
207デフォルトの名無しさん:2006/04/09(日) 16:41:11
>>206
*pa = a[0]; は?
208デフォルトの名無しさん:2006/04/09(日) 16:49:36
>>206
なるほど。aはポインタではないのね。

>>207
出来るに1000円
209デフォルトの名無しさん:2006/04/09(日) 16:59:35
>>208
コンパイルは通るけどはたしてやってそのままいいのかな?
210208:2006/04/09(日) 17:17:08
(*pa) = a[0];

これが正解に2000円
211デフォルトの名無しさん:2006/04/09(日) 17:20:35
>>207
*pa は配列でもポインタでもないから
この話には何の関係もない
212デフォルトの名無しさん:2006/04/09(日) 17:26:04
>>206>>207をやると領域確保なしに代入だからまずいって言いたいんだと思うが
213デフォルトの名無しさん:2006/04/09(日) 17:35:15
>>212
リッチーが配列に代入できないことにした理由に領域が確保されている/いないは出てこない
214デフォルトの名無しさん:2006/04/09(日) 17:49:38
>>210
おいらもそれに20000万円
215デフォルトの名無しさん:2006/04/09(日) 17:53:24
別に括る必要はないだろ。
216208:2006/04/09(日) 17:55:58
>>215
もっと面白いツッコミを期待してましたよ
217デフォルトの名無しさん:2006/04/09(日) 17:58:09
>>215
寧ろ>>214に「一般表記で2億円でつか?」と訊いて欲しかった。
218デフォルトの名無しさん:2006/04/09(日) 17:59:31
age
219デフォルトの名無しさん:2006/04/09(日) 19:56:33
ポインタ意味わかんねーーー!
220デフォルトの名無しさん:2006/04/09(日) 20:46:09
ならばお前は使わなければいい
221デフォルトの名無しさん:2006/04/09(日) 20:49:10
C言語の資格試験ってありますか?
222デフォルトの名無しさん:2006/04/09(日) 21:01:50
あるよ
民間資格だけどしかも過去問取り寄せないと手に入らないけど
223デフォルトの名無しさん:2006/04/09(日) 21:09:16
エラストテネスの綴りを教えてください。
224デフォルトの名無しさん:2006/04/09(日) 21:10:47
Eratosthenes
225デフォルトの名無しさん:2006/04/09(日) 21:38:37
Aristoteles
226デフォルトの名無しさん:2006/04/10(月) 00:22:53
なんか配列変数をつくって、それに適当に計算した値を
代入して、テキストファイルに出力すると

1.#INF00

という意味不明な値がたまにまじっているのですが、これは
いったいなんなのでしょうか?教えてください
227デフォルトの名無しさん:2006/04/10(月) 00:41:17
>>226
無限大。どっかで計算がおかしいんでない?
228デフォルトの名無しさん:2006/04/10(月) 00:47:34
>>227
お返事ありがとうございます
ちなみに計算は以下の通りです
#define pi 3.14159
#define ns 4
double ro;double b,c,d,e,f,h[];int i,g;g=0;
for(i=-maxd;i<0;i++)
{
f=i*0.01;
ro=1;
d=4/pi;
c=cos(2*pi*f/ns);
e=16*f*f/(ns*ns);
d=1/(1-e);
h[g]=d*b*c;
g++;
}
for(i=0;i<maxd;i++)
{
f=i*0.01;
ro=1;
b=4/pi;
c=cos(2*pi*f/ns);
e=16*f*f/(ns*ns);
d=1/(1-e);
h[g]=d*b*c;
g++;
}

この過程で無限大になる部分があるとは思えないのですが、
どうなんでしょうか?
229デフォルトの名無しさん:2006/04/10(月) 01:02:11
数学的な∞と勘違いしてね?
オーバーフローとかゼロ除算かもよ
230デフォルトの名無しさん:2006/04/10(月) 01:05:34
たぶん e = 1 になってるんじゃまいか。
231デフォルトの名無しさん:2006/04/10(月) 01:11:00
行間にトレーサー入れてみる知恵すら出てこないのはゆとりか?
232デフォルトの名無しさん:2006/04/10(月) 01:11:45
>>229,230
あ!!!!!!確かに!!!forループさせるとfが1に
なる部分がでてきます!!!
ありがとうございました!!!助かりました
233デフォルトの名無しさん:2006/04/10(月) 01:55:31
というか変数名が気に食わない
234デフォルトの名無しさん:2006/04/10(月) 01:58:46
携帯電話でC言語は出来ますか?
235デフォルトの名無しさん:2006/04/10(月) 02:06:23
できる。
236デフォルトの名無しさん:2006/04/10(月) 02:12:19
できねーだろw
237デフォルトの名無しさん:2006/04/10(月) 02:14:10
>>234
つBREW API
238234:2006/04/10(月) 02:25:23
>>237
レスありがとうございます。
しかし当方ドコモでしたorz
239デフォルトの名無しさん:2006/04/10(月) 03:00:58
クロスコンパイラだろ
Windows上で開発してテストしてコンパイルしたプログラムを携帯にロードする
240234:2006/04/10(月) 04:36:48
>>239
ありがとうございます。
クロスコンパイラですか。検索してみます。
241234:2006/04/10(月) 04:47:35
どうやらザウルスというPDAが関係してるようです。
FOMAでは無理かorz
242デフォルトの名無しさん:2006/04/10(月) 06:56:24
携帯なら素直にJavaにしとけよう
243デフォルトの名無しさん:2006/04/10(月) 07:00:08
携帯のアプリ開発の環境はガチガチに決まっているはず
どれにするか選択の余地はないと思うけど

Javaを使うものでも、Javaのどの機能が使えてどの機能が使えないとか
244デフォルトの名無しさん:2006/04/10(月) 07:13:10
スレッドは使えますか?
245デフォルトの名無しさん:2006/04/10(月) 07:43:24
ペットショップにて

とある旅行者がシリコンヴァレーのペットショップをのぞいていると、別の客が入ってきて店員にこういった。
「Cモンキーを一匹お願いします」

店員はうなずくと、棚のかごから猿を一匹取り出した。店員は、首輪とひもを猿に付けると、お客に渡した。
「50万円です」
客は金を支払うと、猿を連れて出ていった。

びっくりした旅行者は、店員にたずねた。
「そりゃまたえらく値の張る猿ですねぇ。普通猿は数万円ぐらいのものでしょう。なぜそんなに高いのですか」

店員は答えた。
「あの猿は、C言語でコードが書けるんです。非常に早く、タイトでバグなしのをね。値段に見合うと思いますよ」

旅行者は、かごに入った猿をしみじみと見始めると、店員にこう言った。
「この猿は、さらに高いじゃないか。100万円!こいつは何ができるんだい」

店員は答えた。
「その猿は、C++モンキーです。オブジェクト指向プログラミングができて、C++やJavaまで使えます。かなり使えるやつですよ」

旅行者はさらに周りを見渡し、かごを一人占めしている3つめの猿を見つけた。その猿には、なんと500万円の値札が付いていた。

彼は、あえぎながら店員に聞いた。
「この猿は、他の猿を全部合わせたよりも高いじゃないか。こいつは、一体全体、何ができるんだい」

「えーとですね」

店員は答えた。
246デフォルトの名無しさん:2006/04/10(月) 07:47:41
ぐぐったら想像通りのオチだった
247デフォルトの名無しさん:2006/04/10(月) 10:15:33
ここに出ていた。なるほどなあ。
http://hp.vector.co.jp/authors/VA000092/jokes/
248デフォルトの名無しさん:2006/04/10(月) 11:36:24
落ちを読んでみた。んー、意味ワカンネつまんねー思った。
ふと意味が分かった。爆笑w
249デフォルトの名無しさん:2006/04/10(月) 12:05:34
翻訳が悪いな。そのまんま「マネージャー」の方がいいんじゃーねま?
250デフォルトの名無しさん:2006/04/10(月) 14:25:21
FTPで送られてきたファイルを読み込んで処理をするソフトを作成しました。
ここで問題が発生してます。
Linuxだと、FTPサーバがファイルを書き出している途中でも、
こちらがそのファイルを開けます。
(Windowsみたいに排他がかからない)
Openしてもファイルサイズが0だったり、完全ではないファイルだったりして
困っています。
そこで、FTPサーバのログファイルより、書き出されたファイルの情報を
取得してFTPサーバにあげられてきたファイルの読み込みを行おうと考えました。
(利点として、FTPにはかなりフォルダがありそれを全て短時間間隔で列挙している
ので、その分ファイルアクセスが減る)

ここで質問なのですが、こういったログ参照の場合Linuxではファイルに排他が
かからないため、ログファイルをオープンしっぱなしでログファイルのサイズの
変更があった場合にファイルを読み込むという感じでよろしいのでしょうか?
それとも、毎回オープンし、前回のファイルサイズ分ファイルポインタを
移動し読み込み、クローズすべきでしょうか?

また、他に何か良い手段はないものでしょうか?
251デフォルトの名無しさん:2006/04/10(月) 14:42:45
>>250
そんなややこしいことしないで送る側で別名(たとえば先頭に '_' を付けた
ファイル名)で送ったあとで本来のファイル名に rename するようにするか、
または 0 バイトの時と stat() して st_mtime が近い時間(たとえば1分以内)
なら読まないで無視するようにすればいいのでは? (fuser コマンドを使って
何かのプロセスがファイルを開いたままにしているかどうかを調べるという
方法もある)
252デフォルトの名無しさん:2006/04/10(月) 15:07:55
>>250
ftpにはget/put以外にもrenameやdeleteがあるんだからそれを使えばいいじゃん。
って、既に>251も書いているけど。
つーか、FTPサーバのログファイルはFTPしないと読めないと思うのだが。
#それともFTPサーバ側のプログラムの話なのか?

クライアントで、サーバから安全にファイルを取得するならこんなマクロでも組めばいい。
get targetFile tmp.targetFile
#delete receivedFile
rename tmp.targetFile receivedFile
253デフォルトの名無しさん:2006/04/10(月) 15:09:56
>>250
それはそうと、ログファイルをオープンしっぱなしでfgets()で待つなら兎も角、
毎回ファイルサイズの変更を別途検出するなら毎回開けばいいじゃん。
尤も、前者の場合はファイルを挿げ替えられたのが検出できないからどっちみち要注意で。
254デフォルトの名無しさん:2006/04/10(月) 15:11:10
桁落ちの勉強中なんですが、教科書の方では桁落ちの説明の為に
二次方程式の解の公式を二回にわけて計算しています。
でもこれを一度に計算するようにしてみたら変数がfloat型でも望ましい結果が出ました。

一度に計算する場合は適切に演算してくれるからあまり桁落ちとか情報落ちは
気にしなくてよいものなんでしょうか。
255デフォルトの名無しさん:2006/04/10(月) 15:16:56
二回だの一度だの俺専表現している暇があったら
さっさと指導教官に聞いて来い。
256デフォルトの名無しさん:2006/04/10(月) 15:29:40
あるテキストファイルからデータを読み込ませる処理を考えています。
このテキストファイルには何文字格納されているかというのは分かりません。

fgetsを使い、バッファサイズを大きくとれば問題は解決したのですが、
メモリの無駄のような気もします。となるとmalloc、realloc、fgetsを使い
必要な分だけのメモリを確保した領域に格納したいと考えているのですが
良い考えが浮かびません。後学の為にもやり方を教えて頂けないでしょうか。
257254:2006/04/10(月) 15:50:17
>>255
独学です。すみません。

では改めて。教科書では
----------------------------------
tmp = b*b - 4*a*c;
answer = (-b + sqrt(tmp)) / (2*a);
-----------------------------------
といった形になっています。これで桁落ち現象を説明しています。
試しに
answer = (-b + sqrt(b*b - 4*a*c)) / (2*a);
としてみたら桁落ちが確認できなくなりました。

以上の様に分けずに一度に計算させたら
適切な方法で演算してくれるんだろうかと思いまして、質問してみました。
258デフォルトの名無しさん:2006/04/10(月) 16:03:22
>>256
本当に事前にファイルサイズを得られないのなら、malloc(), realloc(), fread()でやるのが無難か。
size_t size = 0;
char * buffer = NULL;
char tmpBuf[適当なバッファサイズ];
do {
size_t len = fread(tmpBuf, 1, sizeof(tmpBuf), fp);
size += len;
buffer = realloc(buffer, size);
memcpy(buffer + size - len, tmpBuf, len);
} while (len < sizeof(tmpBuf));
こんなもんかな。文字列として扱いたいなら、最後にナル文字を附加するのを忘れずに。
259デフォルトの名無しさん:2006/04/10(月) 16:05:12
>>257
変数の定義からちゃんとコピペしてくれ。
恐らくは、tmpがfloatだと思うのだがsqrt()が返すのはdoubleなので、
tmpに代入した時点で精度が落ちている。
260250:2006/04/10(月) 16:18:57
>>250 です。
返答ありがとうございます。
FTPサーバ側の話で、複数のユーザから各々のフォルダにファイルが
書きもまれて、できるだけ早く、そのファイルに対して処理を行ないたい
というな背景があります。

その為、現在は全てのディレクトリ内のファイルを列挙し新しいファイルが
あれば読み込むというようにしているのですが、この状況でファイルの
中身がまだかかれてないというような現象が発生しています。

>>251 さんの案は良いアイデアなのですが、残念なことに
送ってくる側は不特定多数で、ファイル名の指定は
こちらでは行なえないのです。

>>253
>それはそうと、ログファイルをオープンしっぱなしでfgets()で待つなら兎も角、
こういう手もあるのですね。勉強になりました。ありがとうございます。

長文失礼致しました。
261254:2006/04/10(月) 16:21:11
>>259
>変数の定義からちゃんとコピペしてくれ。
>恐らくは、tmpがfloatだと思うのだが

あ、そうでした。はい。あえてfloat型となっています。

ありがとうございます。私の勘違いがわかりました。
一度で計算する方が問題ないのは最適に演算してくれているからでは
なかったと。馬鹿ですね。
262252-253:2006/04/10(月) 16:25:29
>>260
なるほど問題を整理すると、FTPサーバ側のFTPサーバではないプログラムで
FTPサーバが受信したファイルを監視したいということですな。

クライアントからアップロードするときに>252で書いたような一時ファイル名を使って送るように依頼できればいいが、
そうでないなら出力を監視するしかないわけだね。

処で、FTPサーバのログはファイル受信ごとに一回ずつ更新されることは保証されているのかな?
263デフォルトの名無しさん:2006/04/10(月) 16:40:05
>>260
>>251の「または」から先を読めよ。
264259:2006/04/10(月) 16:43:54
>>261
ゴメン、嘘吐いた。
float tmp = b * b - 4 * a * c;
で精度が落ちるのは事実だけれど、
(-b + sqrt(b * b - 4 * a * c)) / (2 * a);
と書いてもやはり処理系によっては精度が落ちる。
何故ならば、float a, b, c であるならば(b * b - 4 * a * c)の計算には
doubleへの格上げは「必要ではない」から。
試しに手元のgccでコンパイルしてみたら、どちらも同じ結果になった。
たまたま>261の使ったコンパイラが「暗黙にdoubleへの格上げを行なう」処理系だったのだろう。
#但し、sqrt(b * b - 4.0 * a * c)とすると4.0がdoubleなので間違いなくdoubleで計算される。
265デフォルトの名無しさん:2006/04/10(月) 16:50:41
>>256
1行づつ読みたいの? もしそうならglibcには getline() って
のがあるが、これは標準的なライブラリ関数ではない。glibcを
使いたくないとか使えない場合は同様な関数を自作する必要がある。

これはたとえば getc() で '\n' か EOF まで1文字づつ読み
ながら realloc() してバッファに追加するか、あるいは '\n'
か EOF が出現するまでのバイト数を getc() でカウント後に
malloc() でメモリ確保してその後 fseek() で戻してから
メモリ確保した所に fread() すればできる。

>>258
それだと全部読み込まれるんじゃないか? いいのか?
(ていうか、それでかいファイル指定されたら realloc() が
NULL 返すことあるんじゃないか?)
266258:2006/04/10(月) 16:55:34
>>265
どこかに行単位で処理をしたいと書いてあったか?
見た記憶がなかったので丸ごと取り込むロジックを書いてみた。
勿論、エラー処理は省略だ。
試してみれば判るが、最近のOSなら数百メガバイトだって確保できるからな。
#実用プログラムならエラー処理が必要なのは自明。
#完成品ソースを提供しているのではなく、ロジックの説明なのだから。
267250:2006/04/10(月) 16:55:41
>>262
まとめていただきありがとうございます。おっしゃる通りです。
>処で、FTPサーバのログはファイル受信ごとに一回ずつ更新されることは保証されているのかな?
更新されると思い込んでました。
大前提条件ですね。確認します。

>>263
>>251
たしかに、これならうまく取得できそうですね。
結構な数のユーザディレクトリがあるため、列挙するのに時間がかかるので
できれば、ログ解析で来たら菜と思っていました。
268254:2006/04/10(月) 17:02:02
>>264
うわー、勉強になります。
そんな風に実装の違いで結果が変わってくるんですね。
何が保証されてて何が未定義なのか意識するべきという事と、
検証不足の変な推測は危険という事が今回分かりました。

(分かったけど、今後も力一杯つまづきそうな感じ…。)
269254:2006/04/10(月) 17:06:33
(誤)つまづきそう
(正)つまずきそう
Cとは関係ないけど一応。すみません。
270デフォルトの名無しさん:2006/04/10(月) 17:41:28
めちゃ初歩的な質問すみません。
普通にint宣言したんですが、4÷9で0.4…にならんのはなぜですか?
floatっての使えばいいんですか?
271デフォルトの名無しさん:2006/04/10(月) 17:44:14
>>254
一点だけ。
「桁落ち」は有効桁数が減少する事をいうんだが
「二進化誤差」や「丸め誤差」と混同してない?
いやしてないならいいんだけど。
272デフォルトの名無しさん:2006/04/10(月) 17:46:11
>>270
びっくりした。
int : 整数
float : 精度7桁くらいの実数
double: 精度15桁くらいの実数
その程度、いちいち人に訊かず入門書読め。
273272:2006/04/10(月) 17:49:30
…あ、変数が実数型でも
a = 4/9; /* 整数同士の除算の結果は整数にしかならない */
a = 4./9; /* 4 を 4. にしてやらないといけない */
274デフォルトの名無しさん:2006/04/10(月) 17:50:25 BE:314511438-
srandってスコープ関係ありますか?

例えば
srand(1);
{
 srand(2);
}
rand();
の時に本来どっちが適応されるべきですか?それともコンパイラ依存ですか?
275デフォルトの名無しさん:2006/04/10(月) 17:52:02
>>274
スコープは関係なし。
最後に実行したsrandのseedが適用される。
276デフォルトの名無しさん:2006/04/10(月) 17:58:12 BE:196569353-
>>275
マルチスレッドで走らせた場合もsrand適応されますかね?

例えば
Mainスレッドでsrand()
Mainスレッドから走らせたAスレッドでrand()
この場合Mainスレッドのsrand()が適用されますか?
277デフォルトの名無しさん:2006/04/10(月) 18:04:23
処理系依存なので何とも。
278デフォルトの名無しさん:2006/04/10(月) 18:06:14
>>276
大抵の実装では、srand()内部で静的にseedを保存していると思われるので、
多分大丈夫。
#逆にいえばスレッドごとにsrand()しても意味はないということ。
279デフォルトの名無しさん:2006/04/10(月) 18:08:44
まぁ、rand()はスレッドセーフじゃないけどな
280デフォルトの名無しさん:2006/04/10(月) 18:17:51
>>272
ありがとうございます。すみません。
%fとかやって出力エラーが出たので違うのかと思っていました。
281デフォルトの名無しさん:2006/04/10(月) 18:18:34
「大抵の実装」でタカをくくり、自分とこの処理系のマニュアルで確認しない奴は痛杉
ISO/IEC9899 のライブラリの定義にスッドレが出てこない以上、
スッドレがらみの部分の可搬性は小手先のギミックではなく根底から考え方を見直すべき
282254:2006/04/10(月) 18:18:42
>>271
「桁落ち」と「丸め誤差」の違いは理解できていると思います。
floatの0.1とdoubleの0.1を比較するなというのは丸め誤差に基づく禁忌で、
同じくらいの大きさの実数を引き算するなというのは桁落ち現象に基づく禁忌であると
思っています。

「丸め誤差」は例えば10進の0.1を二進数では正確に表現できないことによるものなので
「二進化誤差」と「丸め誤差」は同じものと思われるのですが、
それで大丈夫ですか?
283デフォルトの名無しさん:2006/04/10(月) 18:22:52
でかい数と小さい数を加減算したりすると
doubleで表現できなくなることは考えないのか?
284デフォルトの名無しさん:2006/04/10(月) 18:29:51 BE:196569735-
>>277-279
以下のコードをVC++6でコンパイル、実行した結果常に同じ結果が返ってきました・・・
やっぱり処理系依存なんですねorz

void test(void *any){
const char *msgs[] = {
"A","B","C",
"D","E","F",
};
for(int i=0;i<100;i++){
printf("%s\n",msgs[rand()%(sizeof(msgs)/sizeof(msgs[0]))]);
}
}

int main(int argc, char* argv[])
{
srand(0xFFFF&timeGetTime());
::_beginthread(test,0,NULL);
getchar();
return 0;
}
285254:2006/04/10(月) 18:33:22
>>283
>>282で挙げた禁忌だけだとは思っていませんのでご心配なく。
286254:2006/04/10(月) 18:42:11
ごめんなさい。教わっている分際でかわいくない口ききました。
287デフォルトの名無しさん:2006/04/10(月) 21:29:58
C言語でネット対戦できる大富豪をCUIで作ってみたいんだけど、
参考になるサイトとか本とかありませんか?

ちなみに、環境はWinXP Home Edition SP2で
CPad for Borland C++ Compiler、BCC55ってとこです。
288デフォルトの名無しさん:2006/04/10(月) 22:39:24
>>287
何がわからないのかはっきり示せ
289287:2006/04/10(月) 22:46:14
えっと、ろくにわかってないんですが、
マルチアクセスサーバの作り方が
全くわからないです。
290デフォルトの名無しさん:2006/04/10(月) 22:51:28
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894712059/

WinSock2.0プログラミング
ttp://www.amazon.co.jp/exec/obidos/ASIN/4797306882/

平凡なのはこのへんか。
ネット対戦ゲームとなるとゲームプログラミングよりサーバープログラミングに近くなるからそっちも勉強したほうがいいよ。
291287:2006/04/10(月) 22:59:26
ありがとうございます
292デフォルトの名無しさん:2006/04/10(月) 23:02:26
>>287
ひょっとして 大賤民 ?
293287:2006/04/10(月) 23:14:09
>>292
その言い方は初めて聞きましたが
大富豪と同一のゲームですね。
294デフォルトの名無しさん:2006/04/11(火) 07:40:59
大富豪と大貧民は聞くけど、大賤民は聞いた事無いな。
295デフォルトの名無しさん:2006/04/11(火) 08:24:11
おれも大賤民は聞いたことない
どこの地方だ?
296デフォルトの名無しさん:2006/04/11(火) 10:30:18
大韓民
297デフォルトの名無しさん:2006/04/11(火) 12:05:02
>>287
これはどうか? UNIX 用だが、BCCには互換の関数あったよね。なので参考にはなると思う。

UNIXネットワークプログラミング入門
http://www.amazon.co.jp/exec/obidos/ASIN/4774117544/

たしかゲーム作るとかも載ってたと思った。
298デフォルトの名無しさん:2006/04/11(火) 21:26:50
コンパイルできないです。objファイルが出来てしまいます。
実行しようとすると固まります。
299デフォルトの名無しさん:2006/04/11(火) 21:32:55
ほほう
300デフォルトの名無しさん:2006/04/11(火) 21:40:19
#include <stdio.h>
int main(void)
{
int dat;

printf("値を入力してください ... ");
scanf("%d, &dat");

printf("変数datの値は %d です\n", dat);


return 0;
}
って作ったんですがなぜか
Segmentation fault (core dumped)
って出てしまいます…
どこかおかしいんでしょうか?
301デフォルトの名無しさん:2006/04/11(火) 21:44:38
>>300
>scanf("%d, &dat");
ここで問題です。これの実引数はいくつでしょう?
302デフォルトの名無しさん:2006/04/11(火) 21:45:05
> scanf("%d, &dat");
303デフォルトの名無しさん:2006/04/11(火) 21:47:00
エラーが最初コンパイルしたときでたんですがPCが固まり
次からコンパイルしても空欄が出て何も表示されませんし
プログラム実行できないです。
C言語のエラー一覧表とかどこかに無いですか?
304デフォルトの名無しさん:2006/04/11(火) 21:50:37
struct A {
int a;
struct A *next;
}
こんな構造体があって
mallocでどんどん確保していって
それを使ってるときになんか構造体のメンバにアクセスできなくてsegmentation faultで落ちるんですが
どういうことが考えられるでしょうか?
mallocの返り値はチェックしてます
なんか構造体のアドレスが変なことになってるんですが
305デフォルトの名無しさん:2006/04/11(火) 21:50:58
>>301
>>302

すいません。解決しました…
すっごく初歩的なものだったんですね…
ありがとうございます。
306デフォルトの名無しさん:2006/04/11(火) 21:53:46
>>304初期化されて無い(・∀・)ニヤニヤ
307デフォルトの名無しさん:2006/04/11(火) 22:44:27
>>303
てか、そのままエラーメッセージを読めばいいだけでは?
そんなに分かり辛いメッセージなのか?
308デフォルトの名無しさん:2006/04/11(火) 22:45:17
>>304
malloc() で確保した領域は中身が不定値です。
嫌なら calloc() 使えばいいけど、ようは 0 になってるだけです。
以上。
309デフォルトの名無しさん:2006/04/11(火) 22:49:51
>>307
エラーの変わりに空欄が出るだけで何も表示されないんですよ
310さらさ ◆SARAHxmkr. :2006/04/11(火) 23:10:18
一度、本で読んだことがある事なのですが、
本が手元にないので、本を見れば分かる事を質問するのは
ちょっと、うざいかもしれないけど、
ここで質問させてください。

マクロを書くときに
#define swap(type, x, y) type temp = x; x = y; y = temp;
これではエラーになって、
#define swap(type, x, y) do { type temp = x; x = y; y = temp; } while (0)
のように、一度だけ実行されるループにしなければ
いけないのでしたっけ?
311デフォルトの名無しさん:2006/04/12(水) 00:04:45
>>310
マクロ内で勝手に宣言する変数名tempの名前衝突を避けるためにそう書いてあるんじゃなかろうか。
312デフォルトの名無しさん:2006/04/12(水) 00:05:08
ブロックの先頭でしか変数宣言できない



とよく分からんが言ってみる。
313デフォルトの名無しさん:2006/04/12(水) 00:47:22
>>303
まずは日本語の勉強から始めた方がいいよ。
母国語も満足に使えないのに、プログラミング言語なんて出来る訳がない。
314デフォルトの名無しさん:2006/04/12(水) 00:48:21
いや自然言語はあいまいな部分が多いけどプログラミング言語はそういう部分が少ないからかえっていいかもしれん
315デフォルトの名無しさん:2006/04/12(水) 00:50:46
>>310
#defineは単純な文字列の置換である
と言う事が分かっていれば、何が問題か分かりそうなモノだがな。
316デフォルトの名無しさん:2006/04/12(水) 00:56:31
>>314
>>303の時点で、文法エラーなのにか?
自分の状況を正確、かつ詳細に話す事もままならないのにか?
317さらさ ◆SARAHxmkr. :2006/04/12(水) 05:28:43
>>311
>>312
名前が衝突していなくても、そのまま使用するとエラーになります。
構文エラーとかだったと思います。
318このスレはSPALM用になりました:2006/04/12(水) 05:42:11
┌─┐
┌──┘ └──┐
│この板は900i以│
│上対応のSPALM │
│専用板になりま│
│した。SPALMを語│
│らないと最悪命│
│を落とします │
└──┐┌───┘
└┘

SPALM協会
319デフォルトの名無しさん:2006/04/12(水) 08:08:31
>>310

ただのブロックじゃなくて、do while()にするのは、

#define swap(type, x, y) { type temp = x; x = y; y = temp; }

これだと、

if (...)
 swap(x,y);
else
 hoge();

みたいな書き方ができないから。
320デフォルトの名無しさん:2006/04/12(水) 09:00:54
>>319
それは引数が足りないだけ
321デフォルトの名無しさん:2006/04/12(水) 09:12:14
>>320
根本的に分かってないならレスしなくていいよ。
322デフォルトの名無しさん:2006/04/12(水) 09:39:53
>>320
do while(0)で囲むのはセミコロンを必須にするためだ。その点を
良く考えて>>319を良く吟味してみな。このテクニックはそれなり
に有名だよ。

swapにtypeを書いてないのは単に忘れただけじゃね?
一連の話の趣旨とは全然関係ない。
323デフォルトの名無しさん:2006/04/12(水) 09:50:00
>>309
ふーん。ところでそのコンパイラと、それを使っているOSは何?
324デフォルトの名無しさん :2006/04/12(水) 13:09:54
if(hoge, hoo <= 0){}

みたいな文法ってありますか?
このカンマはなんでしょうか?
325デフォルトの名無しさん:2006/04/12(水) 13:13:51
>>324
それはカンマ演算子だが、そんな使い方をしても意味はない。
326デフォルトの名無しさん:2006/04/12(水) 13:14:14
>>324
3行目:あります。間違ってさえいません。ただし、無意味ですが。
4行目:カンマ演算子です。
327デフォルトの名無しさん:2006/04/12(水) 13:23:33
hoge が副作用を持つ式なら意味があるな。

例えば if ( scanf("%d", &n), n <= 0 ) { ... } とか。
328デフォルトの名無しさん:2006/04/12(水) 13:29:56
順序演算子の記号はカンマだが
329デフォルトの名無しさん:2006/04/12(水) 13:33:50
構造体の配列で50個のgakuseiという配列を確保したいのですが、
色々ググって、下記の例を見付けました。

個々のメンバーへのアクセス方法は、次のようになる。



gets( gakusei[0].name );
gakusei[0].zenki = 80;
gakusei[0].kouki = 60;

この例では、最初の行で、gakusei[0] のメンバー name[] に
標準入力から読み込んだ文字列を代入し、次の 2 行では、
前期、後期のテストの点を代入している。

getsって使ってはいけない関数と違うサイトでみたので、
違う関数を使いたくて更にググったのですが、
gets→fgets が限界で上手く変換する方法がよく判りません。
どなたか教えて下さい。
330デフォルトの名無しさん:2006/04/12(水) 13:36:10
>>325>>326>>327>>328
カンマの演算子なんてあったんですか。
で、今見てるのは本のサンプルで、
条件は全部独立な、相互作用などはしないただの変数なんですが。
if(x+y, z <= 0.0f){}
みたいな。
意味あるんですかこれ?

謎です。
331デフォルトの名無しさん:2006/04/12(水) 13:49:57
>>329
変換て?
332デフォルトの名無しさん:2006/04/12(水) 13:51:17
>>331
反応有難うございます。
getsで書いてある部分をfgetsに変えるには
どうしたら良いのか。と言う事でした。
判り辛くて申し訳ないです;;
333デフォルトの名無しさん:2006/04/12(水) 13:54:05
fgets(gakusei[0].name, 配列の長さ, stdin)
334330:2006/04/12(水) 13:55:08
著者のHPに載ってました。
タイポだったらしい…
スマソ。
335デフォルトの名無しさん:2006/04/12(水) 13:55:48
それだと行末に改行が残るね
336デフォルトの名無しさん:2006/04/12(水) 13:55:55
>>333

あぁ!そのまま突っ込んで良いんですね!
助かりました!有難うございます!
337デフォルトの名無しさん:2006/04/12(水) 14:26:28
fgets(buf, sizeof(buf), stdin);
if (buf[0]) buf[strlen(buf) - 1] = '\0';
338デフォルトの名無しさん:2006/04/12(水) 14:34:02
必死で短くしようとする動機が痛い
339デフォルトの名無しさん:2006/04/12(水) 15:07:39
>>337
ヒント:終端文字の直前が改行文字である保証はない。
340デフォルトの名無しさん:2006/04/12(水) 15:15:19
しかも、OSにより、改行コードが異なっていたり、改行コードが2byteだったり...
プラットフォームに依存しない改行コードの取り除き方ってあるの?
341デフォルトの名無しさん:2006/04/12(水) 16:11:45
>>340
strchr()で'\n'さがして置き換えるとか
342デフォルトの名無しさん:2006/04/12(水) 16:16:16
まあしかし MS-DOS や Windows 用のライブラリだったとしても
テキストモードで fopen() してれば改行は '\n' の char 1つ分に
なるのが普通だと思うけどな。Mac については知らねえ。

>>339
あそうか。バッファ以上の長さの行か。
343デフォルトの名無しさん:2006/04/12(水) 16:22:17
>>342
リダイレクトで食わせた場合も終端直前が改行文字でない場合がある
344デフォルトの名無しさん:2006/04/12(水) 16:23:07
>>340
getc() して '\r' だったら次の文字を getc() で読んで '\n' だったらそこが改行。
違ったら ungetc() で戻して、'\r' の所が改行。
'\r' なしで '\n' がいきなり来たらそこが改行。

というようなことをすると '\r', '\n', "\r\n" の3種類のパターンに対応できる。
345デフォルトの名無しさん:2006/04/12(水) 16:26:39
>>344
それのどこがプラットフォームに依存しないコードなの?
346デフォルトの名無しさん:2006/04/12(水) 17:20:00
末尾から制御文字ニル埋めしてけばいんじゃね?
347デフォルトの名無しさん:2006/04/12(水) 18:05:40
>>344
>>342
テキストモードで開けばそんなことをする必要はない。
348デフォルトの名無しさん:2006/04/12(水) 18:11:00
#include <stdio.h>
int main(int argc, char *argv[]){
char *name = "ai";
char *p = name;
printf("%d\n", &p);
}
上記を実行して現れる数値は、pポインタのアドレスであってますでしょうか?
349デフォルトの名無しさん:2006/04/12(水) 18:11:11
>>346の方法でいい気がする…けど、全ての制御文字埋めてくのもばかっぽいな。
今回のケースだと、\r\nの二種類か?

>>347
テキストモードってfopenの"r"のことなら必要あるぞ。
350デフォルトの名無しさん:2006/04/12(水) 18:13:14
>>347
それも結局、処理系任せなんだけどな。

Windows はしかし、改行コードどころか
Unicode 環境でマルチバイト文字列の読み書きまで
出来るのはやりすぎではないかと。
351デフォルトの名無しさん:2006/04/12(水) 18:13:43
>>348
多分、pポインタのポインタのアドが表示されると思う。

printf("%x\n", p);
でpポインタ(="ai"の先頭アドレス)のアドが表示される
352デフォルトの名無しさん:2006/04/12(水) 18:25:35
こんなとこで聞くのは自己責任ってこったな。
353デフォルトの名無しさん:2006/04/12(水) 18:26:37
アドレスなら%p使っておけ
354さらさ ◆SARAHxmkr. :2006/04/12(水) 18:45:51
なるほど、説明ありがとうございます。
#defineで定義されたマクロは、ただ置き換えられるだけなので、
置き換え後のコード内で、突然、実行文に出会っても、
コンパイラが解釈できないので、do whileで囲って、
一度だけ実行するコードであることをコンパイラに伝える
みたいな感じですね。。。多分
355デフォルトの名無しさん:2006/04/12(水) 19:00:58 BE:196569735-
>>354
始めの2行以外違う。

試しに人力で展開してみれば分かるんじゃね?
356デフォルトの名無しさん:2006/04/12(水) 19:32:52
>>349
VC++とBCCも入力時に\r\nは\nに変換されるが。
357デフォルトの名無しさん:2006/04/12(水) 19:36:46
>>354
実行文とかコンパイラの解釈とか全然関係がない。

別に今わからなくても、Cでプログラム組んでればそのうち
「ああそっか」って思えるようになるよ。人間の頭はそうなる
ように出来てる。がんばって組みまくれ。
358デフォルトの名無しさん:2006/04/12(水) 20:03:52
C言語でBorlandのコンパイラをつかっているのですが全角文字が使えませんどうしたらよいのでしょうか?
359デフォルトの名無しさん:2006/04/12(水) 20:12:21
ダブルクォーテーション
360デフォルトの名無しさん:2006/04/12(水) 20:37:20
>>358
たとえばどういう所で?
361デフォルトの名無しさん:2006/04/12(水) 21:00:08
>>358
printf関数とかで使えないなら、異常だけどそれ以外なら普通
362デフォルトの名無しさん:2006/04/12(水) 21:21:32
>>351
ポインタのポインタのアドレスというのが有ったんですね・・・
勉強になりました。
363デフォルトの名無しさん:2006/04/12(水) 21:31:50
コマンドプロンプトの入力画面になんですけど、漢字とかひらがなとかが打てないんです
364デフォルトの名無しさん:2006/04/12(水) 21:32:43
>>363
Alt+半角/全角
365デフォルトの名無しさん:2006/04/12(水) 21:42:19
助かりました、ありがとうです!
366age:2006/04/12(水) 22:36:37
>>1
え〜と
とりあえず始めっから教えて下さい。
367デフォルトの名無しさん:2006/04/12(水) 23:00:39
すみません 初心者です
strncpy() の 末尾からn文字コピーする版 みたいな関数ってないんですかね?

そういう場合どうすればいいんですか・・
368デフォルトの名無しさん:2006/04/12(水) 23:03:02
strlen()で長さ計ってn文字引いた分先頭から進めてそこからstrcopy()でいいんじゃね
369デフォルトの名無しさん:2006/04/12(水) 23:07:40
進めるっていうのはどうすればいいんでしょう・・・
ゴメンナサイ・・・
370デフォルトの名無しさん:2006/04/12(水) 23:10:57
>>367
strcpy(dest, src + strlen(src) - n);
371デフォルトの名無しさん:2006/04/12(水) 23:12:52
strcpy(dest, strchr(src, '\0') - n);
372デフォルトの名無しさん:2006/04/12(水) 23:13:43
>>370
どうもありがとうございました!
厨ですみませんでした・・
373デフォルトの名無しさん:2006/04/12(水) 23:30:30
ASCII CODE変換のプログラムです
キーボードにアスキーコードを入力したら、対応する10進を返すというものですが、
while(buf == ascii[i]){
この部分が一回も実行されずに終了してしまいます、どこが悪いのだろう
教えください、エロイヒト
#include "stdio.h"
char *ascii[128] = {
"\^@",
"\^A",
"\^B",
"\^C",
中略
"DEL"
};
char buf[256];
int i = 0;
main()
{
printf("変換したいASCII CODEを入力してください","%s\n");
scanf("%s", buf);
while(buf == ascii[i]){
i++;
}
printf("%s\n", i);
return(0);
}
374デフォルトの名無しさん:2006/04/12(水) 23:32:27
× ==
○ !=
375デフォルトの名無しさん:2006/04/12(水) 23:33:22
それ以前の問題だろ・・・
376デフォルトの名無しさん:2006/04/12(水) 23:37:11
buf == ascii[i]

文字列の比較は==じゃできないよ。
377デフォルトの名無しさん:2006/04/12(水) 23:40:38
>>373
一言で言って、ひど過ぎる。二言で言って、ちょーひど過ぎる。
まずCで書く前に自分のやりたいことを日本語を使った擬似コードで記述してみろ。
378デフォルトの名無しさん:2006/04/12(水) 23:56:56
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/iconv.3.html

なぜ、ポインタのポインタのアドレスを渡すようにしてるか疑問です
普通にchar *inbufで良いと思うんですが利点があるんですか?
379デフォルトの名無しさん:2006/04/13(木) 00:02:51
>>376
サンクスですが、
#include <string.h>宣言して
strcmp関数で比較しても巧くいきませぬ(;^ω^)
main()
{
printf("変換したいASCII CODEを入力してください","%s\n");
scanf("%s", buf);
while(strcmp(ascii[i], buf) == 0){
i++;
}
printf("%d\n", i);
return(0);
}
380デフォルトの名無しさん:2006/04/13(木) 00:03:33
*inbufを書き換えるからでは?
381デフォルトの名無しさん:2006/04/13(木) 00:22:40
>>373
>>379ですが、どなたか教えてもらえませんか
(人∀・)タノム
382デフォルトの名無しさん:2006/04/13(木) 00:26:38
>>378
ポインタ変数そのものを、関数内で弄りたい時あるでしょ?
hoge(char** inbuf)
{
  *inbuf = (char*)malloc(5);

}
383382:2006/04/13(木) 00:30:05
あげちゃったよorz

>>379
while(strcmp(ascii[i], buf) == 0)だと、
ascii[i]とbufが等しい間、ループするけどいいの?
384デフォルトの名無しさん:2006/04/13(木) 00:37:15
これはひどい
385デフォルトの名無しさん:2006/04/13(木) 00:51:55
>>383
あ!そっか
♪♪♪ d(`Д´)b♪♪♪サンキュ
386デフォルトの名無しさん:2006/04/13(木) 01:02:58
>>382
ありがとう
ポインタをやっとわかってきたところなの頑張ってみます
387デフォルトの名無しさん:2006/04/13(木) 01:04:24
char** a
char **a
char* a[]
char *a[]

これらは、全て同じように解釈されますか?
388デフォルトの名無しさん:2006/04/13(木) 01:44:05
>>387
いいえ
特に * と [] の混同は癌
extern つけた瞬間にあぼーん
auto つけた瞬間にあぼーん
389デフォルトの名無しさん:2006/04/13(木) 01:44:27
関数の引数宣言という状況に限れば、すべて同じ。
390デフォルトの名無しさん:2006/04/13(木) 01:46:35
a[i]と*(a+i)は全く一緒じゃないの?
391デフォルトの名無しさん:2006/04/13(木) 01:55:40
int a[100];
int *(a + 100);
392デフォルトの名無しさん:2006/04/13(木) 01:57:42
あっ宣言部じゃないところで
393デフォルトの名無しさん:2006/04/13(木) 01:58:37
つまり元々ちがうものだ
394デフォルトの名無しさん:2006/04/13(木) 02:18:00
externやautoつけるとあぼーんなの?

例えば、
extern char** a;

extern char **a;
は同じ意味では?

その意味では、>>387
char** a
char **a
の両者は同じ

char* a[]
char *a[]
の両者は同じ

char** a

char* a[]
は配列へのポインタ、と、ポインタへのポインタ
の違いがある

って感じかな
395デフォルトの名無しさん:2006/04/13(木) 02:18:42
>配列へのポインタ、と、ポインタへのポインタ
順番逆…orz
396デフォルトの名無しさん:2006/04/13(木) 02:19:06
extern char *a[];
extern char **a;
397デフォルトの名無しさん:2006/04/13(木) 02:19:51
auto char *gera_gera[];
398デフォルトの名無しさん:2006/04/13(木) 02:38:52
>>395
「配列へのポインタ」じゃなく「ポインタの配列」
399デフォルトの名無しさん:2006/04/13(木) 09:30:09
char *a[] は char * の配列で char **a は char のポインタのポインタということだ。

400デフォルトの名無しさん:2006/04/13(木) 11:22:45
質問があります。

SYSTEMTIME構造体の startTime という変数があり、
そこには何かの処理の開始日時がセットされています。
DWORD型の lateSecという変数があって、
そこには処理にかかる予想時間が秒を単位としてセットされています。
その場合の処理の終了日時を求めたいのですが、
どのようなやりかたがスマートでしょうか?

lateSecを日、時、分、秒の各単位にしてstartTimeの各メンバ変数に足すだけでは、
秒や分の部分が59を超えたり、時の部分が23を超えたりしてしまいます。
日の部分も、その月ではありえない日になってしまうかもしれません。
この問題を考えていたら、解決方法が全然見えなくなってしまいました。

よろしくおながいします。
401デフォルトの名無しさん:2006/04/13(木) 11:33:42
>>400
補足します。簡単に言えば

void func(
OUT LPSYSTEMTIME lpEndDateTime, /* 終了予想日時 */
IN LPSYSTEMTIME lpStartDateTime, /* 開始日時 */
IN DWORD dwLateTime /* 処理予測時間[sec] */
);

のような関数をつくりたいということになります。
402デフォルトの名無しさん:2006/04/13(木) 11:46:48
>>400-401
【初心者歓迎】C/C++室 Ver.26【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1143601166/l50
403デフォルトの名無しさん:2006/04/13(木) 11:58:41
tm構造体だったらmktime()でUTCの経過秒数に変換してから
処理時間を足して、gmtime()でtm構造体に再変換を行えばいいんだけどね

SYSTEMTIME構造体なんて標準のCにはない
404デフォルトの名無しさん:2006/04/13(木) 12:00:39
>>402-403
ご指摘ありがとうございます。そっちのスレに行ってみます。
405デフォルトの名無しさん:2006/04/13(木) 19:34:47
>>394
どこかのヘッダでextern char **a;と宣言しておきながら、
定義はchar *a[];となっていたらアボーン。
406デフォルトの名無しさん:2006/04/13(木) 19:42:17
とりあえず>>394はエキスパートCプログラミングを読んだ方がいいと思う
407デフォルトの名無しさん:2006/04/13(木) 22:15:02
質問です。
scanf("%s", 〜); で文字を入力した後、scanf("%c", 〜); を行おうとすると
飛ばされちゃいます。
調べたところ、プログラム内の作業領域はエンターキーが入力されるとクリアさ
れるが、最後の改行文字は残り、直後に%c変換を行うと、改行コードが入力され
るから、だそうです。
ここまで合ってますでしょうか……?
ここからが疑問です。
scanf("%s", 〜); で文字を入力した後、scanf("%s", 〜); を行うと何も問題
ありません。二度目のバッファの最初には改行コードが入りません。
これは"%s"の仕様が'\0'くるまでの改行・空白を飛ばす、という仕様ということで
しょうか。

なんか、"%s"なんかの最後の\nが残ったままになってるのって、バグなんじゃ……
とか思ってしまう。
408デフォルトの名無しさん:2006/04/13(木) 22:18:59
C++/Java暦6年、C暦2日です。
ANSI Cで
hoge_init()で引数でいくつかのフラグとサイズを得てサイズ分のバッファを確保、
hoge_data()でhoge_init()で渡されたフラグから確保したバッファにデータを格納して返却、
hoge_end()で確保したバッファの解放、
といった動作を行おうとしてます。
C++なら、hogeクラスのメンバ変数にフラグやバッファを用意して、上記3つの関数で参照すればよかったのですが、
Cの場合、hoge_init()からhoge_data()、hoge_end()への情報の受け渡しはどのようにやるのでしょうか?
もしかしてグローバル変数ですか?

409デフォルトの名無しさん:2006/04/13(木) 22:23:15
>>408
thisポインタにあたるものを明示的に渡してやればいい。
410408:2006/04/13(木) 22:31:26
>>409
フラグやサイズを構造体などに設定して、hoge_init(), hoge_data(), hoge_end()の引数で引き渡す、
ということですか?
引数を使わない方法は、やはりグローバル変数だけですかね?
411デフォルトの名無しさん:2006/04/13(木) 22:32:06
>>407
> "%s"の仕様が'\0'くるまでの改行・空白を飛ばす、という仕様
そういうこと。
逆に%cは読み飛ばさずにどんな文字でも読み込む。
それが嫌なら、"%c"ではなく、たとえば" %c"にすればよい。
scanfの書式文字列での空白はそこにある空白類文字全てを読み飛ばすことを意味する。

>>408
Cでオブジェクト指向もどきをやるとしたら、
メンバ関数に相当する関数は、thisに相当するものを最初の引数にするのが常套手段。
412デフォルトの名無しさん:2006/04/13(木) 22:32:13
>scanf("%s", 〜); で文字を入力した後、scanf("%c", 〜); を行おうとすると
>飛ばされちゃいます。
どこにも飛びません。正しく処理しているだけだと思われます。

>調べたところ、プログラム内の作業領域はエンターキーが入力されるとクリアさ
>れるが、最後の改行文字は残り、直後に%c変換を行うと、改行コードが入力され
>るから、だそうです。
>ここまで合ってますでしょうか……?
いいえ。

>scanf("%s", 〜); で文字を入力した後、scanf("%s", 〜); を行うと何も問題
>ありません。二度目のバッファの最初には改行コードが入りません。
>これは"%s"の仕様が'\0'くるまでの改行・空白を飛ばす、という仕様ということで
>しょうか。
いいえ。
>なんか、"%s"なんかの最後の\nが残ったままになってるのって、バグなんじゃ……
>とか思ってしまう。
思うのは勝手ですが、自分が理解できないとは微塵も思わないあなたはプログラミングには向いていないと思います。
413デフォルトの名無しさん:2006/04/13(木) 22:33:25
>>411
>そういうこと。
いいえ。
414408:2006/04/13(木) 22:37:06
「C言語 オブジェクト指向」でぐぐったら、なんとなくわかりました。
ありがとう。>>409 >>411
415デフォルトの名無しさん:2006/04/13(木) 22:48:50
>>414
ストリームに空文字残したくなかったら
fgets()
sscanf()
を使おう
416デフォルトの名無しさん:2006/04/13(木) 23:05:47
空文字と一緒に捨てちゃいけないものをあんまり気にしない場合に限っての話だが

# つーか、パーサ作るだろふつー
417デフォルトの名無しさん:2006/04/14(金) 00:00:49
C言語のテキストで

int main(void)

の部分が

main()

と書かれているんですが、これは単に省略しているんですか?
418デフォルトの名無しさん:2006/04/14(金) 00:16:59
そう
1つの関数が最低2つ以上のシーケンスおよび境界要求を同時に持つなんて気持ち悪いものに対するゲロ
419デフォルトの名無しさん:2006/04/14(金) 01:41:36
日本語でおk
420デフォルトの名無しさん:2006/04/14(金) 03:27:25
バイナリファイルから特定の部分(例えばFF E3で始まり、04 0Fで終わるような区間)だけを、
1バイトずつint型の配列に入れていく方法をご教授願います。
421デフォルトの名無しさん:2006/04/14(金) 04:42:39
ご教授 ×
ご教示 ○
422デフォルトの名無しさん:2006/04/14(金) 04:45:53
>>421
訂正ありがとうございます。
というわけでどなたかご教示願います。
423デフォルトの名無しさん:2006/04/14(金) 05:08:44
>>422
使うOSとかメモリ量とか速度優先とかファイルの大きさとか出してもらいたいものだ
424デフォルトの名無しさん:2006/04/14(金) 05:59:27
OSはXPでメモリは1G、速度は気にせず、扱うファイルは10k前後です。
よろしくおねがいします。
425デフォルトの名無しさん:2006/04/14(金) 07:41:05
>>424
丸投げは宿題スレにでも。

>>423
スレ違いなんだから構うなや。
426デフォルトの名無しさん:2006/04/14(金) 10:04:42
>>417
違う。
int func(void) { /* ... */ }
は引数をとらずintを返す関数のプロトタイプ形式の定義
int func() { /* ... */ }
は引数をとらずintを返す関数のプロトタイプ形式でない定義
int func(void);
は引数をとらずintを返す関数のプロトタイプ形式の宣言
int func();
はintを返す関数の引数に関する情報を持たないプロトタイプ形式でない宣言
func() { /* ... */ }
は未定義動作を引き起こす危険な定義

だからそんな書き方はしちゃいけない
ついでに、プロトタイプ形式でない宣言/定義は廃止予定事項なので書かない方がいい
427デフォルトの名無しさん:2006/04/14(金) 10:17:49
>>426
こいつ ぼけ
main() {
extern func();
func();
func(1);
}
func(a, b) {}

どうやら undefined-behavior についてもうろ覚えらしいし
かなり痛い
428デフォルトの名無しさん:2006/04/14(金) 11:50:19
struct student
{
char *name; /* 名前 */
int grade; /* 学年 */
int class; /* クラス */
int tokuten[5]; /* 5教科の点数 */
}g_student; /* student構造体のグローバル変数を宣言 */

と言うような構造体の宣言をして
その構造体に入力された数値を入れたいのですが、どうしたら良いですか?

色々ググってみましたが、
最初から決まった値をメンバに代入する例ばかりで、
自分の思うようなソースが見当たりませんでした。
独学でC言語を始めたばかりの初心者ですが、
どなたか教えて頂ければ幸いです。
宜しく御願いします。
429デフォルトの名無しさん:2006/04/14(金) 11:52:19
言っている意味がよくわからないんだが
g_student.grade = 1;
とかこういうんじゃなくて?
430デフォルトの名無しさん:2006/04/14(金) 11:55:35
>>428
数値を入力するサンプルと、
数値をメンバに代入するサンプルを組み合わせればいいだけでは?
431デフォルトの名無しさん:2006/04/14(金) 11:57:34
int g;
scanf("%d", &g);
g_student.grade = g;
ってことか?
432デフォルトの名無しさん:2006/04/14(金) 12:48:53
配列の要素数についてなんですが、例えば、

 int a[5];

と宣言されていたら、配列aの要素数は

 sizeof(a)/sizeof(a[0])

で求めることができますよね。

配列の大きさをmallocで動的に確保した場合、例えば、

 int *a;
 a=malloc(5*sizeof(int));

とした場合に配列aの要素数を求めることってできますか?
(上の方法ではできませんでした。
sizeof(a)はポインタ変数の大きさを返してしまう様です。)
433デフォルトの名無しさん:2006/04/14(金) 12:57:14
できない
434デフォルトの名無しさん:2006/04/14(金) 12:58:03
環境依存でpのサイズ取れる関数あったな
435432:2006/04/14(金) 13:04:39
>>433
>>434

やっぱできないですか…
どうもありがとうございました。

その環境依存の関数ちょっと調べてみます。
436428:2006/04/14(金) 13:49:46
>>429
上手く説明出来なくて申し訳ないです;;
名前、学年、クラス、テストの点数をfgets等の入力関数とかで(?)
入れて、別の場所で参照するプログラムを書きたいのです。

>>430
>>431
scanfは思いつきまして、最初にやってみました。
私が質問した事でググっていたら、あるサイトで
scanfは使わない方が良い関数と書いてあったので、
他の方法があるのかと思ったのですが・・・・・
437デフォルトの名無しさん:2006/04/14(金) 14:00:46
scanfかfgets&sscanf使っとけ
438デフォルトの名無しさん:2006/04/14(金) 14:25:58
つーか、初心者スレに逝け。
439デフォルトの名無しさん:2006/04/14(金) 15:11:32
あっちで同じこと聞かれるのもめんどくさいんでとりあえず返事しとく
変数名めんどくせえから勝手にGに変えさせてもらった

char name[20];
int class;

scanf("%s", name);
G.name = name;

scanf("%d", &(G.grade));

scanf("%d", &class);
G.class = class;

こんなかんじでいったん中間変数にscanfしてから代入してもいいし、
直接やったもおk

scanfは、入力数オーバー等のチェックがなされないので、
例えば上の例だと21文字以上入力すると(WinXPとかの場合)不正終了する
ただ、学習の際使う分には手間が少ないのでこれでもOKではあると思う
ただ本格的なプログラム作る際にはヤメトケ、てお話


ということであとはこっちで・・・かな
【初心者歓迎】C/C++室 Ver.26【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1143601166/
440428:2006/04/14(金) 15:22:53
>>437
>>439
スレチなのに回答下さって有難う御座いました!
解決しました!本当に有難う御座いました!!
441デフォルトの名無しさん:2006/04/14(金) 15:42:03
「scanfは使わない方が良い」と書いてあって使うべき関数を書いてないサイトは見ん方がええと思うぞ
442デフォルトの名無しさん:2006/04/14(金) 16:23:12
「使うべき」関数なんて知れてるから書いてあっても五十歩百歩で
せいぜい使うだけの人しか育てられない安かろう悪かろうの只教材
443デフォルトの名無しさん:2006/04/14(金) 16:26:35
とりあえずstrcpy, strlenあたりを使ってる本は失格。
今すぐ捨てた方がいい。
444デフォルトの名無しさん:2006/04/14(金) 16:35:55
よっしゃ!K&R捨ててくる!
445デフォルトの名無しさん:2006/04/14(金) 16:37:19
strlen 使わないために while だの for だの書いてる奴は失格以前に評価対象外
さらにそれ以前の問題で、文章をせいぜい6文字くらいまでしかパースできない読者に C を教えるのはチンパンジーに因数分解を教えるより難しい
446デフォルトの名無しさん:2006/04/14(金) 17:00:17
strcpyはまぁ確かに気をつけないと脆弱性の元となるからわかるが
strlenのどこに問題があるんだ?
447デフォルトの名無しさん:2006/04/14(金) 17:08:16
strcpy の第2引数が未検証であることと
stlen の引数が未検証であることに大した違いはない

ロジックが組めない奴の主張はどこまでも同じ問題を引きずり続けるからな
448デフォルトの名無しさん:2006/04/14(金) 17:14:26
>>446
char *p;
p=malloc(sizeof(char));
p='a';
strlen(p);
ってやった場合とか問題あるんじゃね?ってことかと
449デフォルトの名無しさん:2006/04/14(金) 17:23:49
質問どうぞ。
450デフォルトの名無しさん:2006/04/14(金) 17:25:34
Cにgetsとかstrcpyとか入れちゃってる奴はアホだと思うんですがいかがでしょうか?
451デフォルトの名無しさん:2006/04/14(金) 17:26:12
strcpyとstrlenがダメとか言ってる厨は死んだ方がいいよな。
きちんと使えば何も問題は無い。

>>448それコンパイルできねーだろ
452デフォルトの名無しさん:2006/04/14(金) 17:27:56
getsやstrcpyを適切に使えないプログラマに問題あり。
適切に使えない、使うべきではない状況で使おうとするから問題が出てくる。
453デフォルトの名無しさん:2006/04/14(金) 17:28:06
>strcpyとstrlenがダメとか言ってる厨は死んだ方がいいよな。
>きちんと使えば何も問題は無い。
あなたアホですね?
454デフォルトの名無しさん:2006/04/14(金) 17:30:18
>>450おまえがアホだろ?
455デフォルトの名無しさん:2006/04/14(金) 17:31:48
>>451 俺がアフォでした(゚∀゚) *p='A';な、もちろん
456デフォルトの名無しさん:2006/04/14(金) 17:34:14
>p=malloc(sizeof(char));
この辺が池沼。
457デフォルトの名無しさん:2006/04/14(金) 17:36:50
注意して使ってもstrlenだめだとか言ってる奴どうやって文字列の長さ取得するんだ?
458デフォルトの名無しさん:2006/04/14(金) 17:39:54
>>457
それがマジ質問だったらやばすぎだね。
大至急回線切ったほうがいいよ。
459デフォルトの名無しさん:2006/04/14(金) 17:40:55
そもそも文字列は、終端にNULLが置かれていなくちゃならない筈だけど。
NULLが無いのはただのバイナリ。
460デフォルトの名無しさん:2006/04/14(金) 17:45:44
標準化作業中の strlen_s() をヨロシク!
461デフォルトの名無しさん:2006/04/14(金) 17:53:39
標準化の際はstrnlenでよろ
462デフォルトの名無しさん:2006/04/14(金) 17:53:59
>>443>>450今すぐ死んだ方がいいよwww
463デフォルトの名無しさん:2006/04/14(金) 17:54:27
リミット付きの関数に渡すリミットが正しいという保障と
文字列の適切な位置に終端標識があるという保障を
同一人物がやってるとしたら (プ
464デフォルトの名無しさん:2006/04/14(金) 17:57:08
>>456 すまん、マジでわからないorz
465デフォルトの名無しさん:2006/04/14(金) 17:57:32
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1146.pdf

strlen_s()からstrnlen()に名前変更されたんだね。
466デフォルトの名無しさん:2006/04/14(金) 17:59:19
バグを出さなきゃバグフリー。セキュリティホールを作らなきゃセキュアプログラミング。
程度の認識しかない方は今日覚えたキーワードをしっかり勉強しておいてくださいね。
でわまた来襲。
467デフォルトの名無しさん:2006/04/14(金) 17:59:39
まちがえた、「strlen_s()からstrnlen_s()に」
468デフォルトの名無しさん:2006/04/14(金) 18:05:17
VC2005使うとそこらへん警告してくれるな。
ありがたやありがたや。
469デフォルトの名無しさん:2006/04/14(金) 18:10:39
>>443>>441 からの流れだろうが
その辺りを読めない莫迦がいるな。
(>>450 は恐らく先天性なので別格として)

>>464
>>456 が何を言いたいのかは知らんが、少なくとも
sizeof char は、それが標準C ならばどう転んでも 1。
470デフォルトの名無しさん:2006/04/14(金) 18:15:01
>sizeof char
sizeof(char)だろ。
471デフォルトの名無しさん:2006/04/14(金) 18:18:01
>>470
えっ?
472デフォルトの名無しさん:2006/04/14(金) 18:18:46
>>471
えっ?

って何だよ。
473デフォルトの名無しさん:2006/04/14(金) 18:19:06
>>469 そりゃ1だろうけど直接1って書くよりはsizeof(char)のほうがよくありませんか
474!469:2006/04/14(金) 18:22:01
>>473
冗長って事だけで悪い事じゃない。
明示したいなら好きにすれば良い。
475469:2006/04/14(金) 18:59:18
>>470
済まん、ついうっかり。
  sizeof 単項式
  sizeof ( 型名 )
だな。
476デフォルトの名無しさん:2006/04/14(金) 19:20:26
**pってのは
どんな意味があるんですか?
ポインタですか?
477デフォルトの名無しさん:2006/04/14(金) 19:21:07
>>476
ポインタのポインタだな。
478デフォルトの名無しさん:2006/04/14(金) 19:22:10
>>476
ポインタは変数のアドレスを格納する。
その変数のアドレスを格納したポインタのアドレスを格納する変数がそれ。
479デフォルトの名無しさん:2006/04/14(金) 19:26:23
>>477
こいつ ぼけ
p が指す先が指す先
**p がポインタかどうかは p の型による
480デフォルトの名無しさん:2006/04/14(金) 19:28:29
>>479
>>478はあってるの?
481デフォルトの名無しさん:2006/04/14(金) 19:44:14
**pだけなら>>479だが、charとかが前に付いてるなら>>477-478
482デフォルトの名無しさん:2006/04/14(金) 19:47:30
>>481
(char) **p
483デフォルトの名無しさん:2006/04/14(金) 19:49:58
>>482
GJ!!
484デフォルトの名無しさん:2006/04/14(金) 19:52:59
int *p = &i;
int j = 3**p;
485デフォルトの名無しさん:2006/04/14(金) 19:54:58
>>480
ポインタ p は変数 a のアドレス &a を格納する。 p = &a;
その変数 a のアドレス &a を格納したポインタ p のアドレス &p を格納する変数がそれ **p。 ⇒ 間違い ∵ **p = &p;
486デフォルトの名無しさん:2006/04/14(金) 19:55:54
レベル低
487デフォルトの名無しさん:2006/04/14(金) 19:56:50
>>486
工房の俺がついていける時点でレベルが低い
488デフォルトの名無しさん:2006/04/14(金) 20:11:52
教える側のレベルが低いとは言わんが教え方のレベルは低い。
489デフォルトの名無しさん:2006/04/14(金) 20:34:49
文句だけは一丁前
490デフォルトの名無しさん:2006/04/14(金) 20:35:40
回答する側はせめてstrcpy_s, strlen_sくらいは知っておいてもらいたい物だな。
491デフォルトの名無しさん:2006/04/14(金) 20:36:50
strlen_sって都市伝説じゃね?
492デフォルトの名無しさん:2006/04/14(金) 20:43:25
strcpy_s の検索結果 約 730 件中 1 - 100 件目
strlen_s の検索結果 約 88 件中 1 - 46 件目
493デフォルトの名無しさん:2006/04/14(金) 20:45:45
これからは>>488が上手く回答してくれるらしいぞ。
見ものだな。
494デフォルトの名無しさん:2006/04/14(金) 20:46:47
>>493
やったよここの回答者は疲れるんだよな。回答したこと無いけど
495デフォルトの名無しさん:2006/04/14(金) 20:50:13
>>476には>>477みたいに答えとけばいいんだよ。
>>479とか>>482とか>>484みたいなことは余計。
496デフォルトの名無しさん:2006/04/14(金) 20:54:49
>>490
スレ違い
さすが低脳
497デフォルトの名無しさん:2006/04/14(金) 21:04:01
>>479
「空白あけろよ ぼけ」を思い出した。
498デフォルトの名無しさん:2006/04/14(金) 21:31:31
>>479
char *********************************************************************************p;
499デフォルトの名無しさん:2006/04/14(金) 21:35:09
問1. 以下のプログラムがコンパイルエラーとなる理由を述べよ。

#include <stdio.h>
int main()
{
int a = 5;
int *p = &a;
int c = 125/*p;
printf("%d\n", c);
return 0;
}
500デフォルトの名無しさん:2006/04/14(金) 21:36:48
で?質問なのかそれは?
501デフォルトの名無しさん:2006/04/14(金) 21:38:21
SYNTAX ERROR.

READY
502デフォルトの名無しさん:2006/04/14(金) 21:44:12
*/ / *p;
printf("%d\n", c);
return 0;
}

とすれば大丈夫。
503デフォルトの名無しさん:2006/04/14(金) 21:44:46
>>499
うちのgccでは'unterminated comment'wwwww
504デフォルトの名無しさん:2006/04/14(金) 22:28:18
>>499
面白かった!!
505デフォルトの名無しさん:2006/04/14(金) 23:00:21
>>500
ネタ、または釣り。
506デフォルトの名無しさん:2006/04/14(金) 23:24:55
exeファイルをウィンドウで表示したいんですけど、どうすればいいんですか?
初歩的な質問ですみません
507デフォルトの名無しさん:2006/04/14(金) 23:26:27
>>506
環境依存です。適切なスレを探してそちらへどうぞ。
508デフォルトの名無しさん:2006/04/15(土) 00:44:18
int main()
{

int a,b=1;
char str[32];

printf("拡張子の検索を行なうプログラムです\n拡張子は半角で入力してください。\n");
printf("また、面白半分で長い文字を入力するとバグが起きてパソコンが不安定になりますよ\n");

printf("では、入力してください---->\n");
gets(str);
switch (str[32]){

case 'ani' :
printf("アニメカーソルポインタです。\n");
printf("windowsフォルダの中に入っています\n");
printf("見てみたい人は見てください。インターネットからダウンロードして追加もできますよ\n");
break;
case 'exe':
printf("これは実行ファイルです\n");
printf("このファイルはwindowsの標準のプログラムで起動できます\n");
printf("しかし、ウィルスである可能性もあるので気をつけてください\n");
break;

509デフォルトの名無しさん:2006/04/15(土) 00:44:49
続き
default:
printf(" ゴメン…ない\n");
break;
}
return 0;
}

なぜできないのでしょうか?
510デフォルトの名無しさん:2006/04/15(土) 00:47:44
いろんな意味ですごいのを見てしまった気がするが・・・

とりあえずstr[32]は文字列strの33文字目の文字、とだけ言っておく('A`)
511デフォルトの名無しさん:2006/04/15(土) 00:47:51
>>509
コンパイルエラーだから
512デフォルトの名無しさん:2006/04/15(土) 00:55:03
>>510
513デフォルトの名無しさん:2006/04/15(土) 00:56:55
>>508-509
とりあえず適当な入門書2冊買ってきて載ってるコードは全部手打ちして実行確認して
もしあれば演習問題全部終わらせてから帰ってきてくれ。
どんなクソな入門書でも、今よりはマシになれる。
つーか、話にならなさ過ぎる。
514デフォルトの名無しさん:2006/04/15(土) 01:39:05
#include<stdio.h>
#include<string.h>
int main()
{

int a,b=1;
char s[100];

printf("拡張子の検索を行なうプログラムです\n拡張子は半角で入力してください。\n");
printf("また、面白半分で長い文字を入力するとバグが起きてパソコンが不安定になりますよ\n");

printf("では、入力してください---->\n");
scanf("%s",s);
if (strcmp(s,"ani") == 0){
printf("アニメーションカーソルポインタ\n");
}
else{
printf("(m´・ω・`)m ゴメン…ない\n");
}
return 0;
}
これじゃだめか?
515デフォルトの名無しさん:2006/04/15(土) 01:57:03
#include<stdio.h>
#include<string.h>
char*list[][2] ={
    {"ani","アニメカーソルポインタです。\n"
        "windowsフォルダの中に入っています\n"
        "見てみたい人は見てください。インターネットからダウンロードして追加もできますよ\n"
    },{"exe","これは実行ファイルです\n"
        "このファイルはwindowsの標準のプログラムで起動できます\n"
        "しかし、ウィルスである可能性もあるので気をつけてください\n"
    },{NULL,NULL}
};
int main(void){
    char s[100],*(*p)[2];
    printf("%s%s%s%s",
    "拡張子の検索を行なうプログラムです\n","拡張子は半角で入力してください。\n",
    "また、面白半分で長い文字を入力するとバグが起きてパソコンが不安定になりますよ\n",
    "では、入力してください---->\n");
    scanf("%99s",s);
    for(p=list;**p && strcmp(**p,s);++p){}
    printf("%s\n",p[0][0]?p[0][1]:" ゴメン…ない");
    return 0;
}
516デフォルトの名無しさん:2006/04/15(土) 02:31:50
> printf("%s%s%s%s",
> "拡張子の検索を行なうプログラムです\n","拡張子は半角で入力してください。\n",
> "また、面白半分で長い文字を入力するとバグが起きてパソコンが不安定になりますよ\n",
> "では、入力してください---->\n");
この辺阿呆すぎ。
別に
printf(
"拡張子の検索を行なうプログラムです\n" "拡張子は半角で入力してください。\n"
"また、面白半分で長い文字を入力するとバグが起きてパソコンが不安定になりますよ\n"
"では、入力してください---->\n");
で充分だろ。
つーか、
printf(
"拡張子の検索を行なうプログラムです\n拡張子は半角で入力してください。\n",
"また、面白半分で長い文字を入力するとバグが起きてパソコンが不安定になりますよ\n"
"では、入力してください---->\n");
でいいよ。
517デフォルトの名無しさん:2006/04/15(土) 02:35:17
>>515はアホだが、>>516は無能だな
518デフォルトの名無しさん:2006/04/15(土) 03:02:30
>>515
もうちょいプログラムとデータを分けようぜ。
<    },{NULL,NULL}
>    },{NULL," ゴメン…ない"}
<    printf("%s\n",p[0][0]?p[0][1]:" ゴメン…ない");
>    printf("%s\n",(*p)[1]);
519515:2006/04/15(土) 11:01:09
>>516
ああ、ごめん。その辺は適当に書いてたけど、確かにそのほうが良いな。
まぁその辺の重箱の隅にまで拘るなら、
printfなんて使わずにputsで書いたほうが良いと思うけどな。

>>518
あー確かにそのほうがコードの量も減るし、
データも一箇所に纏められるから優れてるな。ありがと
520デフォルトの名無しさん:2006/04/15(土) 12:20:52
>>427
こいつあほすぎ。
undefined-behaviorについてまるっきり理解できてないからコード示しただけで反論になると思ってるんだな。
521デフォルトの名無しさん:2006/04/15(土) 12:46:20
一文字ずつ出力する場合は、printf でなくputcとかputcharの方がいいの?
522デフォルトの名無しさん:2006/04/15(土) 12:55:08
その方が多少動作が速いかもな
523デフォルトの名無しさん:2006/04/15(土) 14:07:31
>func() { /* ... */ }
>は未定義動作を引き起こす危険な定義


晒しage
524デフォルトの名無しさん:2006/04/15(土) 15:22:15
>>523
kwsk
525デフォルトの名無しさん:2006/04/15(土) 16:02:13
制約違反は未定義動作とは違う、とでも言いたいんだろ
脚注(8)がある以上それは通らんが

「intを返す関数の正しい定義」とか思ってるんだとしたらかなり痛い
526デフォルトの名無しさん:2006/04/15(土) 16:29:45
動けばいいよ
527デフォルトの名無しさん:2006/04/15(土) 16:37:07
使い捨てならね
528デフォルトの名無しさん:2006/04/15(土) 17:01:37
ちょっとでもかすったのは発端の発言のみか・・・

# やっぱ偶然みたいだな
529デフォルトの名無しさん:2006/04/15(土) 19:04:04
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;


ってなにさVSとVC++って違うの???
530デフォルトの名無しさん:2006/04/15(土) 19:24:05
スレが違う。
531デフォルトの名無しさん:2006/04/15(土) 19:30:51
座布団没収
532デフォルトの名無しさん:2006/04/15(土) 20:58:11
pがポインタのとき
p=++pと
p=p++
は何が違うんですか?
もう一つ
int aとして
tmp[++a]と
tmp[a++]の違いも教えてください
お願いします
533デフォルトの名無しさん:2006/04/15(土) 21:00:06
>>532
特に違いは無い。
534デフォルトの名無しさん:2006/04/15(土) 21:02:48
>>533
基本情報の問題で全社だと正解で後者だと不正解なんですよ
どうしてかなぁと思って
教えてください
535デフォルトの名無しさん:2006/04/15(土) 21:04:17
>>534
どんな問題?
536デフォルトの名無しさん:2006/04/15(土) 21:05:22
>>535
プログラムの穴埋めです
537デフォルトの名無しさん:2006/04/15(土) 21:05:49
>>536
どんなプログラム?
538デフォルトの名無しさん:2006/04/15(土) 21:10:38
>>532
p=p++; ⇔ p=p; p++;
p=++p; ⇔ p++; p=p;

b=tmp[a++]; ⇔ b=tmp[a]; a++; → tmp[a]
b=tmp[++a]; ⇔ a++; b=tmp[a]; → tmp[a+1]
539デフォルトの名無しさん:2006/04/15(土) 21:12:15
>>537
お前意地悪だな
インクリメントしてから代入されるのか代入してからインクリメントされるかの違いだろ
540デフォルトの名無しさん:2006/04/15(土) 21:13:28
>>538
ありがとうございました
そういう違いなんですね
541デフォルトの名無しさん:2006/04/15(土) 21:18:52
542デフォルトの名無しさん:2006/04/15(土) 22:17:35
>>538
こいつ ぼけ
p = p++; は副作用完了点を隔てずに代入と増分があるから
評価順序が未規定となり、それゆえ結果は未定義
543デフォルトの名無しさん:2006/04/15(土) 22:19:11
>>529
それC#だろ。
544デフォルトの名無しさん:2006/04/15(土) 22:29:01
質問があるんですが、VC++とC++は違うんでしょうか?
いやですね、C++を学習するつもりで本を買ったのですがVC++を買ってました。
C++を学ぶならC++のやつを買いなおした方がいいでしょうか?
545デフォルトの名無しさん:2006/04/15(土) 22:33:49
>>544
VC++は数あるC++コンパイラの1つだけど、
書籍でVC++と銘打っているものは大体Win APIやMFC, ATL,  .Netなどのことを書いてある。
546デフォルトの名無しさん:2006/04/15(土) 22:39:28
>>545
早速の返信ありがとうございます
でも、VC++の本で勉強しても問題ないんでしょうかね?
前書きに「VC++はC++言語を利用して〜」って書いてあるんですけど、それは
C++をまず理解したうえでVC++をやるといった意味に聞こえるんですが
どうなんでしょう?
よろしくお願いしますm(__)m
547デフォルトの名無しさん:2006/04/15(土) 22:57:37
>>546
C++は言語
VC++は商品
548デフォルトの名無しさん:2006/04/15(土) 23:31:41
言語(C++)が分からんと小説(VC++)は書けないだろと言われました。
Cの知識はちっとだけあるのです。でもC++はからっきしです
なのでC++を覚えないとどうしようもないと考えられます
549デフォルトの名無しさん:2006/04/15(土) 23:40:30
コードが小説で、VC++は鉛筆なんじゃ
550デフォルトの名無しさん:2006/04/16(日) 00:33:38
VC++を持ってないならその本は推定ゴミ箱行き
持ってるなら、ちょいわきにのけといて、C++の入門書から入ったほうがいいかな
まぁその本がどういう本か分からんのでなんとも胃炎が
551デフォルトの名無しさん:2006/04/16(日) 00:51:00
exitで抜け出しても
ちゃんとclassの終了処理ってするの?
552デフォルトの名無しさん:2006/04/16(日) 00:59:23
553デフォルトの名無しさん:2006/04/16(日) 01:00:33
C++とVC++の違いも知らない奴がCの知識なんてあるわけがない
554デフォルトの名無しさん:2006/04/16(日) 01:02:21
いかにも学生だな
555デフォルトの名無しさん:2006/04/16(日) 01:25:15
>>521
gccなら最適化で同じになるからどっちでもいいよ。
556デフォルトの名無しさん:2006/04/16(日) 02:36:36
int ***********p;
の意味がわかりません。
教えてください。
557デフォルトの名有りさん :2006/04/16(日) 02:39:22
始めましてです。
Windowsアプリケーションを作ろうと思っています。
詳しい内容は端折りますがやりたいことは
「Buttonコントロールなどをマウスで移動出来るようにしたい」
です。
私の考えでは、Buttonの上でのマウスダウン、アップを受取るのだと思うのですが
やり方がわかりません。
ご教授願お願いしますm(__)m]

環境はXP ProでVisualStudio.NET
558デフォルトの名有りさん:2006/04/16(日) 02:46:10
すみません、明らかに書くとこ間違ってますね
退散します
559デフォルトの名無しさん:2006/04/16(日) 02:46:52
いってらっしゃいませ、ご主人様
560デフォルトの名無しさん:2006/04/16(日) 02:51:01
ただいまぁ〜
561デフォルトの名無しさん:2006/04/16(日) 02:53:02
>>556
確かにそんなコードが書いてあるプログラムは意味がわからんな。
562デフォルトの名無しさん:2006/04/16(日) 02:55:21
ていうか、そんなにポインタ使ってなにを作るのだ?
12次元配列とかの動的確保?
563デフォルトの名無しさん:2006/04/16(日) 02:56:01
>>556
> int ***********p;
ポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタを示す変数

564556:2006/04/16(日) 03:02:35
うーむ、この時間はレベルが低いのか?
答え:
>int ***********p;
int **********型変数へのポインタ

>>562
二次元配列へのポインタと ポインタへのポインタ の違いを理解してないな?

>>563
べたすぎ
565デフォルトの名無しさん:2006/04/16(日) 03:04:30
くそ、本人に答えだされた・・・
566デフォルトの名無しさん:2006/04/16(日) 07:33:48
>>556,564
マスぐらい1人でかけ
567デフォルトの名無しさん:2006/04/16(日) 16:16:23
10進数を引数にして2進数を返す関数のつもりなのですが
何を引数にしても0が返されてしまいます。
どこがおかしいでしょうか?
-------------------------------
int binary(int x){
int a[10] , i=-1, bin=0;
while(x == 0){
i++;
a[i]=x%2;
x=x/2;
}
for(; i>=0 ; i--)
bin+=a[i]*pow(10,i);
return bin;
}
568デフォルトの名無しさん:2006/04/16(日) 16:18:39
>>567
for(i = 31; i >=0; i--){
if( (1 << i ) & input) printf("1");
else printf("0");
}
で変換は出来ると思う
569デフォルトの名無しさん:2006/04/16(日) 16:20:21
int型を返すのがそもそもの間違い
570デフォルトの名無しさん:2006/04/16(日) 16:20:39
>>567
while(x!=0)じゃない?
571567:2006/04/16(日) 16:27:49
>>568
それだと0がたくさんプリントされてしまいます。

>>569
なぜですか?あんまり大きい数は扱えないから?

>>570
そでした。ども。
572デフォルトの名無しさん:2006/04/16(日) 16:36:51
intで保証される値は-32768〜32767だから8桁の整数値が扱えることは保証されない
long値を使うべき
573567:2006/04/16(日) 16:39:56
>>572
わかりやした。

もっと良いアルゴリズムありませんか?
今のは中学んときの教科書レベルだし。
574デフォルトの名無しさん:2006/04/16(日) 16:45:51
>>573
#include <stdio.h>
void main(void)
{
    int input;
    int i ,n;
    scanf("%d",&input);
    for(i = 31; i >=0; i--){
        if( (1 << i ) & input) printf("1");
        else printf("0");
    }
    printf('\n');
}
575デフォルトの名無しさん:2006/04/16(日) 16:49:01
>572
入力はint全般なんだから、最低10^16の整数値が扱えないとだめじゃない?

>573
int bit = 0;
for(i = 31; i >=0; i--){
if( (1 << i ) & input){ printf("1"); bit = 1; }
else if( bit ){ printf("0");}
}
576デフォルトの名無しさん:2006/04/16(日) 16:49:33
>>574
周りの見えないでしゃばり君は黙ってなさい。
577デフォルトの名無しさん:2006/04/16(日) 16:51:38
>>574
int n←これは何に使うの?
578デフォルトの名無しさん:2006/04/16(日) 16:58:34
>>577
>printf('\n');

ここで使ってんじゃねーの??ゲラ
579デフォルトの名無しさん:2006/04/16(日) 16:59:43
>>578
・・・
笑わなきゃだめかな?
580デフォルトの名無しさん:2006/04/16(日) 17:05:29
>>579=574
本人の登場ですな。
581577:2006/04/16(日) 17:07:29
>>580
>>579>>577だよ。
582デフォルトの名無しさん:2006/04/16(日) 17:11:57
つまり
>>574=577=579=581
583デフォルトの名無しさん:2006/04/16(日) 17:14:14
>>568,574-575
魔法使い発見。
584デフォルトの名無しさん:2006/04/16(日) 17:34:03
基礎がなってない奴は無理に答えずにROMってれば良いのに。
585デフォルトの名無しさん:2006/04/16(日) 17:47:19
>>584
それはお前だろ。って>>583が言ってました
586デフォルトの名無しさん:2006/04/16(日) 17:50:37
>>575
うん、ちょうど何となくファイルを二進数コンバートするプログラム書いてたからcharで考えてた。
ぶっちゃけ文字列にするかそのまま出力した方がいいね。
587デフォルトの名無しさん:2006/04/16(日) 17:56:38
質問ねえのかよ。
ヒキの俺様がズバっと答えてやるよ。
588デフォルトの名無しさん:2006/04/16(日) 18:23:17
>>587
九九票を出力したいですが、だめです。
どうぞよろしくお願いします。

void main()
{
int a,b;
for(a=1;a<9;a++)
{
for(b=1;b<9;B++)
{
???
}
}
589デフォルトの名無しさん:2006/04/16(日) 18:27:27
>>587
昨日バスで一緒になってチラチラとこっちを見る可愛い子が、なんと同じバス停で降りてその後は別の方向だけど振り向いたらその子もこっちチラチラと振り向きざま歩いていった女の子のメアドげっとする方法教えてください。
590デフォルトの名無しさん:2006/04/16(日) 18:57:38
もう1回社会の窓を開けて乗ってみたら。今度は声かけてくれるかもよ?

つーか、ここはCのスレなんだから、メアドで我慢してどうする。
591デフォルトの名無しさん:2006/04/16(日) 19:06:36
誰がうまいこと言えと。
592デフォルトの名無しさん:2006/04/16(日) 19:20:34
超初心者っす
C++ではなくCだけを使ってコンポーネントを使ってトランプゲーム
のようなものはWINの環境で可能なんすか?
593デフォルトの名無しさん:2006/04/16(日) 19:26:23
>>592
できる

※ 具体的な方法はスレ違いのため答えられない
594デフォルトの名無しさん:2006/04/16(日) 19:26:49
可能に決まってる
595デフォルトの名無しさん:2006/04/16(日) 19:31:16
>>588
「ねこわか」にのってるよ
596デフォルトの名無しさん:2006/04/16(日) 20:48:18
588
printf("1");
printf("2");
printf("3");
...
printf("81");
でおk
597デフォルトの名無しさん:2006/04/16(日) 23:42:24
>>596
空白も改行もないのに何が表かと
598デフォルトの名無しさん:2006/04/17(月) 12:54:05
>>592
> Cだけを使って
> コンポーネントを使って

この二つの条件は相反する物であり、同時に成り立たない。
よって、どの様な環境でも出来ない。
599デフォルトの名無しさん:2006/04/17(月) 13:09:54
int main(int argc, char *argv[])
{
char str[80];
strcpy(str,argv[1]);
printf("argc = %d\n", argc);
if(argc != 2 || argc == NULL)/* 2個の引数があるか確認 */
{
printf("使用方法: <ファイル名> <パスワード入力>\n");
exit(1);
}

この時ファイル名のみ実行すると問題発生エラーが出るんだけれど、
これを回避するにはどうすればいいのでしょうか。
600デフォルトの名無しさん:2006/04/17(月) 13:17:19
つまらないネタだな。
601559:2006/04/17(月) 13:21:27
もうわかった。スマソ。
602デフォルトの名無しさん:2006/04/17(月) 17:04:08
プロトタイプ宣言ってさ、コンパイル側でそれらしきものを自動でやってくれれば必要ないんじゃね?
dosだったらmain関数から、winだったらWinMainから、関数の構成ツリーを作って葉の方からプロトタイプ宣言っぽいのをしてくれればokなんじゃね?
あ、でも全体の構成が必ずしもツリーになるわけじゃないし、間接的再帰してたりするからダメか?
あれ?でもやっぱりできるんじゃね?あ、できない?
というよりさ、そもそもプロトタイプ宣言って本質的には何をするやつなのさ。俺全然わかんないんだけど。
603デフォルトの名無しさん:2006/04/17(月) 17:08:22
チームで開発してる時とか、
コンパイルする度に、全てのソースが必要になるじゃん
604デフォルトの名無しさん:2006/04/17(月) 17:09:20
引数を省略したときにうっかりintに解釈されないためさ
605デフォルトの名無しさん:2006/04/17(月) 17:11:24
呼び出し時にスタックに積む値の調整を解決するのに必要。
各型の実装サイズが異なるとき、
 呼び出し側の暗黙のキャストで渡した値のサイズと
 呼び出され側の受け取ろうとしている値のサイズとが食い違うと よろしくない

sizeof(int) != sizeof(double) な環境で
 foo(1); /* プロトタイプ宣言無しで foo 呼び出し */

 /* foo実装 */
void foo(double a)
{
 ....
}

だと、実行時にコケルんでないか?
606デフォルトの名無しさん:2006/04/17(月) 17:15:24
>>605
602が言いたいのは、そこをプロトタイプ宣言無しでも
foo(double(1))と解釈してくれっていう事じゃないの?
607606:2006/04/17(月) 17:17:18
まちがった。
×foo(double(1))
○foo((double)1)
608デフォルトの名無しさん:2006/04/17(月) 17:17:57
要するに、関数型言語でよくある型推量を使いたいのでは?
609605:2006/04/17(月) 17:21:00
>>606
602前半については、その通りだろうけど、main 以下の枝葉の全ソースが必要になるね
602後半について書いたつもり

# ところで 同一識別子で、型違い呼び出しは 最近のC規格内である?
610デフォルトの名無しさん:2006/04/17(月) 17:25:06
int test[5] = {0, 1, 2, 3, 4};
というようまとめて初期化できるのは理解できるのですが

int test[5]とした後で
別の所で配列の中身をまとめて代入することってできますか?
それともひとつずつ代入していくしかないのでしょうか
611デフォルトの名無しさん:2006/04/17(月) 17:28:53
初期化はできるが、代入は無理
612デフォルトの名無しさん:2006/04/17(月) 17:30:11
>>611
ありがとうございます
613デフォルトの名無しさん:2006/04/17(月) 17:58:25
ま、Javaみたいに全ソース or 全オブジェクトファイルがあれば可能だな
個人的には1ファイル内にあるなら関数宣言無しで勝手に解決して欲しいが...

規格書に「1パスコンパイラでなければならない」なんてどこにも書いてないぞ
614デフォルトの名無しさん:2006/04/17(月) 18:03:49
ここでCの仕様叩いたり変更の要求したがる奴らはアフォ
615デフォルトの名無しさん:2006/04/17(月) 18:13:34
Cの仕様が完璧だと思い込んで614みたいな発言する奴の方はバカストロフィー
616デフォルトの名無しさん:2006/04/17(月) 19:19:40
614はCの仕様が完璧だと思い込んでいると思い込んでいる615がアフォ
617デフォルトの名無しさん:2006/04/17(月) 19:25:51
人間なんてアフォな生き物なのさ・・・・
618デフォルトの名無しさん:2006/04/17(月) 19:27:57
俺は完全だがC言語は完全ではないということは定説。
619デフォルトの名無しさん:2006/04/17(月) 19:29:02
完全=成長の止まったアフォ
620デフォルトの名無しさん:2006/04/17(月) 20:01:36
人間なんてアフォな生き物→アフォが作った言語→アフォ言語
621デフォルトの名無しさん:2006/04/17(月) 20:04:09
ということにしたいのですね?:)
622デフォルトの名無しさん:2006/04/17(月) 21:41:13
そうさ、所詮俺らなんて、言語の不備はいくら叩く事はできても言語すら作れなかったりするのさ。
623デフォルトの名無しさん:2006/04/17(月) 22:05:48
普通の大学なら言語定義してコンパイラ作ったりとかするんでないの?
624デフォルトの名無しさん:2006/04/17(月) 22:09:08
で、ビットシフトはいつ使うのさ?
625デフォルトの名無しさん:2006/04/17(月) 22:23:04
ビットシフトは個人的にはフラグに使ってる。
他にどういった使い道があるの?
626デフォルトの名無しさん:2006/04/17(月) 22:35:36
>>625
まあ、今はもうやっても意味ないけど (ていうか最適化の
邪魔になりそうなのでこの用途では使わない方がいいと思う
けど) 昔は2で割るとか4で割るとか、2掛けるとか4掛ける
とか、そういう時に普通に計算式を書く代わりに使った。
昔の CPU はそういう小技を使わないと遅かった。

後は本当に純粋にビットシフトしたい時に使えるが、この
必要性ももうあまりないかな。たとえばデバイスドライバを
書くとして、パラレルの I/O から8ビットまとめて入力した
として、それのうちの下から 3 ビット目と 4 ビット目の
状態を見たいとき、 >> で 2 ビットシフトしてから & 3
するとかさ。
627デフォルトの名無しさん:2006/04/17(月) 22:49:35
>>626
やぱりそれぐらいしか使い道は無いのか・・・。
628デフォルトの名無しさん:2006/04/17(月) 22:52:14
>>618
俺は童貞だが巧いコードでヌケるということは定説。
629デフォルトの名無しさん:2006/04/17(月) 23:24:01
>>624
パズルなどの問題解決プログラムでは
例えば盤面をintひとつで表現すると演算効率とポータビリティの面で有利なわけだが、
そういうときに次盤面取得や既知検出などで用いたりする。
630デフォルトの名無しさん:2006/04/17(月) 23:29:24
基本情報処理に落ちてしまったので、これから3週間でプログラム作るので才能あるか判定してもらうぜ
631デフォルトの名無しさん:2006/04/17(月) 23:35:52
ないよ
632デフォルトの名無しさん:2006/04/17(月) 23:39:02
とりあえず完成品を見てからにして下ぱい
633デフォルトの名無しさん:2006/04/18(火) 01:57:48
>>632
こんなところでそんなこと言っている時点で才能ない。
634デフォルトの名無しさん:2006/04/18(火) 02:06:23
まぁゴミ溜めに蛆という諺もあることだし、3週間あればなにがしかは作れるもんでしょう。
待ってみましょうや。男子3日で剥けずんば割礼してみよとも言うしね。
635デフォルトの名無しさん:2006/04/18(火) 03:02:30
え?何つくんの?
636デフォルトの名無しさん:2006/04/18(火) 10:00:44
>>626
圧縮とか作ってるとき普通に使うぜ?
637デフォルトの名無しさん:2006/04/18(火) 10:49:58
圧縮作るのか。
638デフォルトの名無しさん:2006/04/18(火) 11:22:42
ええ。
639250:2006/04/18(火) 13:05:57
Linuxで時刻の取得ってどうするのでしょう?
たとえば、Windowsで言うなら
SYSTEMTIME syst;
::GetCurrentTime(&syst);
みたいな。
640デフォルトの名無しさん:2006/04/18(火) 13:14:36
>>639
このスレ的にはLinuxだろうがWindowsだろうが、time()一択。
641デフォルトの名無しさん:2006/04/18(火) 13:20:17
ミリ秒まで取得する必要があればgettimeofday()だな
642デフォルトの名無しさん:2006/04/18(火) 13:27:43
>>641
そんな関数標準Cにはありませんが何か。
643デフォルトの名無しさん:2006/04/18(火) 13:32:56
C言語によるH8マイコンのプログラミング
わかる?
644640:2006/04/18(火) 13:33:16
ありがとっ 感謝です。
time_t t;
t = time(0);
struct tm *val;
val = (struct tm *)localtime(&t);
if(val != 0)
{
printf("%d/%d/%d %d:%d:%d", val->tm_year + 1900, val->tm_mon, val->tm_mday, val->tm_hour, val->tm_min, val->tm_sec);
}
とりあえず、こんな感じでやってみたけど printfのとこで、error
ちょっと調べてみます。
645strftime:2006/04/18(火) 13:38:47
>>644
そんな目的でprintf()を使うのはナンセンス。標準関数くらい調べよう。
646デフォルトの名無しさん:2006/04/18(火) 13:40:07
strftime()を使わずに何をしているんだか...
647640:2006/04/18(火) 14:18:33
strftime() なんて便利なものがあったのですね。
勉強不足でした。ありがとうございます。
とりあえず、時間表示するだけの結果です。
char szTime[128];
time_t t;
struct tm *timetmp;

t = time(NULL);
timetmp = (struct tm *)localtime(&t);
if (timetmp == NULL) {
perror("localtime");
}
else
{
if (strftime(szTime, sizeof(szTime), "%H", timetmp) == 0)
{
perror("strftime");
}
else
{
printf("%s\n", szTime);
}
}

でも、さっきの val->tm_year でエラーが出るのがきになる・・・。
長文失礼。
648デフォルトの名無しさん:2006/04/18(火) 15:26:20
#define MAX 4 ←以上だとエラー

void main()
{
  int j;
  int *p;

  p=(int *)malloc(MAX+1);
  if(p==NULL){
    printf("メモリが確保されてません\n");
    exit(1);
  }
  
  for(j = 0; j < MAX; j++) {
    p[j]=rand()%100;
    printf("%d ",p[j]);
  }printf("\n");
}

これでMAXを4以上に設定すると
ポップアップでエラーが出てしまうんです。
どうしてなんでしょう?教えて下さい


「 
  Debug Erro!
  Proguram: C:\erogame\Debug\main.exe
  DAMAGE: after Normal block(#43) at 0x004300B0.
  
  (Press Retry to debug the application)
  [中止(A)] [再試行(R)] [無視(I)]   
                          」
649デフォルトの名無しさん:2006/04/18(火) 15:34:09
すいません 間違えました

free(p)が抜けてました

free(p)を入れないと通りましたが
入れると出てしまいます
なぜなんでしょうか?

ここの場合は最後ですが
途中で開放してはダメなんでしょうか?;
650デフォルトの名無しさん:2006/04/18(火) 15:36:38
p=(int *)malloc(sizeof(int)*(MAX+1));
かな
651デフォルトの名無しさん:2006/04/18(火) 15:38:37
>>650
ありがとうございます
通りました(^^@
652デフォルトの名無しさん:2006/04/18(火) 15:49:52
freeを入れると落ちるからと言う理由は論外だが、最後のfreeは不要と言ってみる。
653デフォルトの名無しさん:2006/04/18(火) 16:16:17
>>652
その理由は?
コンパイラ任せ?
654デフォルトの名無しさん:2006/04/18(火) 16:21:44
終了時にOSたんが勝手に開放してくれるからだと思う
655デフォルトの名無しさん:2006/04/18(火) 16:23:39
最後のfreeが不要なのはOSが面倒を見てくれることが保証されていること場合のみで、
そうでない実行環境が存在するということは過去に何度も出てきているにゃ。
656デフォルトの名無しさん:2006/04/18(火) 16:58:06
で?そんな糞開発環境が存在するのかね?
DOS、Win、Unix、MacなどのOSは問題ない。

組み込み系だとprintfすらも実装されているか怪しい
657デフォルトの名無しさん:2006/04/18(火) 16:58:24
float や double 型の変数のビット構造を2進表示する方法や、それらの論理和、論理積のやり方を知りませんか?
int型等だったら出来るのですが、上のような型だとエラーが出たりして簡単にいかないものですので
658デフォルトの名無しさん:2006/04/18(火) 17:08:04
>>657
まずはソース貼れ。
659デフォルトの名無しさん:2006/04/18(火) 17:17:47
文字配列にmemcpyでもすれば
660デフォルトの名無しさん:2006/04/18(火) 17:21:21 BE:52418922-
>>656
初心者も集まる場所でいうことではないと思う。>free不要

free使わない癖つけて、何回も確保開放する必要のあるプログラム書いたら「なんでエラー」なんてまぬけなことにもなりかねない。
661デフォルトの名無しさん:2006/04/18(火) 17:23:35
別スレ池
662デフォルトの名無しさん:2006/04/18(火) 17:24:32
要らんだろ、そんなもん。
要るようなレベルならやり方知らないはずないし。

ポインタ取って整数型へのポインタにキャストしろ。
663デフォルトの名無しさん:2006/04/18(火) 17:27:00
リロードしてなかった。
>>662>>657へ。
664デフォルトの名無しさん:2006/04/18(火) 17:28:00
txtファイルのデータが,で区切られてるヤツの読み込みはわかるんだけど
全部tabで区切られてるのってどういう指定すればいいんだかわからない。

あいうえお 1 2 3 4 かきくけこ
上のみたいになってて、
スペースの代わりにtabが入ってるのを読み込んで表示するらしいんだが。
665デフォルトの名無しさん:2006/04/18(火) 17:30:37
>>664
スペースもタブも改行も空白類文字
666デフォルトの名無しさん:2006/04/18(火) 17:31:08
>>664
\tを知らないって意味でおk?
667デフォルトの名無しさん:2006/04/18(火) 17:36:06
おk
\tで出来た
668デフォルトの名無しさん:2006/04/18(火) 17:38:06
質問内容から察するにおそらくscanf系使うんだろうが
あれは空白類文字(\n/\t/\s)を自動で読み飛ばす
669デフォルトの名無しさん:2006/04/18(火) 17:39:27
データにスペースが入っていると面倒だな...
入ってなければ簡単だが
670デフォルトの名無しさん:2006/04/18(火) 17:54:40
学校でC言語始めたばかりのものです。
まだどういうときにどの単語を使うなど
さっぱりわからないんですが・・
HTMLの要領で覚えたんでいいでしょうか?
とにかく不安です。
671デフォルトの名無しさん:2006/04/18(火) 18:05:25
C言語、GNU readline の質問です。
デフォルトで有効になっているカレントディレクトリのファイル名補完機能を無効にし、
コマンドラインからの入力なしの状態でTabキーを押したらa_func b_func func_c と表示させ、
aを入力した状態でTabキーを押したらa_funcと補完させるプログラムを作りたいです。
サンプルが欲しいです。
672デフォルトの名無しさん:2006/04/18(火) 18:31:00
.>>669
"^[^\t]"

>>670
教科書嫁。後スレ違い。初心者スレにでも逝け。

>>671
スレ違い。環境依存OKスレかGCCスレかUnixスレにでも逝け。
673デフォルトの名無しさん:2006/04/18(火) 18:58:28
>>657
その float だか double だかの変数のポインタを unsigned char * か何かに
キャストして先頭から sizeof(その変数) 分だけ進めりゃいいんじゃねえかな。
あるいは long か long long のような同じビット数の型の変数に memcpy()
してからやる。
674デフォルトの名無しさん:2006/04/18(火) 19:00:33
>>656
そういえば Windows 9x 系はリソースの開放が変ですぐにブルー画面になっていたなあ。
その 9x 系のサポートもついに終わる。めでたしめでたし。
675デフォルトの名無しさん:2006/04/18(火) 19:02:22
リトルインディアンの場合

#include <stdio.h>

int main() {
int i;
float a;
unsigned char *c;
unsigned char n;

c = (unsigned char*)&a;

a = 123.456

for (i=0; i<sizeof(a); i++)
printf("%02x",*(c+sizeof(a)-1-i));
}
}
676デフォルトの名無しさん:2006/04/18(火) 19:04:02
すまん、nは忘れてくれ
677デフォルトの名無しさん:2006/04/18(火) 20:45:03
C言語初心者です。「1.5」を表示するプログラムを作れと言われ作ったのですが、
1.5000000と表示されてしまいます。原因はどこにあるのでしょうか?

#include <stdio.h>

int main(void)
{
float a;

a = 1.5;
printf("a=%f\n",a);
return 0;
}
678デフォルトの名無しさん:2006/04/18(火) 20:47:19
#include <stdio.h>
main(){puts("1.5\n");}
679デフォルトの名無しさん:2006/04/18(火) 20:49:22
>>677
%f だからだ。
この % と f の間にほにゃらかを入れると先生がほめてくれると思う。
安易に %g を使うと70点だと思う。
680デフォルトの名無しさん:2006/04/18(火) 20:49:35
printfの仕様を読めばいいじゃない
ていうか宿題スレに行けばいいじゃない
681デフォルトの名無しさん:2006/04/18(火) 20:52:49
宿題スレに書置きしてからここに聞きに来るとは用意周到な奴だ。
682デフォルトの名無しさん:2006/04/18(火) 21:00:04
printf("%0.1f\n", 1.5f);
683675:2006/04/18(火) 21:03:45
>>657 結局表示だけだがw
#include <stdio.h>

void bit8tostr(unsigned char n, char s[]) {

int i;

for (i=0; i<8; i++) {
s[i] = '0' + (n>>7);
n <<= 1;
}
s[8] = '\0';
}
int main() {
int i; float a; unsigned char *c, n;
char s[9];

c = (unsigned char*)&a;

for (a=1; a<65536; a*=2) { // ここは適当に
printf("%5d: ", (int)a);
for (i=0; i<sizeof(a); i++) {
n = *(c + sizeof(a)-i-1);
bit8tostr(n, s);
printf("%s ", s);
}
puts("");
}
}
684デフォルトの名無しさん:2006/04/18(火) 21:10:01
%g使わなくともprintf("%0.1f\n", 1.5f);でうまくいきました。
ありがとうございます。
685デフォルトの名無しさん:2006/04/18(火) 22:28:27
人に聞く前に書式ぐらい自分で調べてくらさい ><;
686デフォルトの名無しさん:2006/04/18(火) 22:33:04
%1000.500f
687デフォルトの名無しさん:2006/04/18(火) 22:34:20
けちなこといってねえでもっとつけちまえ。

%.10000000000000000f
688さらさ ◆SARAHxmkr. :2006/04/19(水) 10:57:31
本でenum型の説明を読んでいて、気になった事があります。
enum型で使用した文字列はprintfで表示できないのでしょうか?
689デフォルトの名無しさん:2006/04/19(水) 11:08:22
出来ません。デバッグ目的ならこういうマクロ作っておくとたまに便利。

enum{ FOO, BAR, BAZ };
#define ENUM2STR(v) ((v==FOO)?"FOO":v==BAR?"BAR":v==BAZ?"BAZ":"UNKNOWN")
690デフォルトの名無しさん:2006/04/19(水) 11:10:51
すいません。教えて下さい。
整数を入力すると、九九の段が出るようにしたいんですが
例えば、5と入力すると
5の段:5 10 15 20 25 30 35 40 45
と出すようにしたいです。で
#include <stdio.h>
int main(void)

{
int dat;
int ans;
int i;

printf("整数を入力... ");
scanf("%d", &dat);

printf("%d の段:",dat);

for(i = 1; i <=9; i++)
{
ans = dat * i;
printf("%d", ans);
}
printf("\n");
return 0;
}
で間違ってるところありますか?
691デフォルトの名無しさん:2006/04/19(水) 11:14:31
その質問の仕方はないんじゃないの。
692デフォルトの名無しさん:2006/04/19(水) 11:16:04
>>690
君、凄い。
「よくわからないけどエラーになりました」っつって丸投げする奴はよくいるけど
自分で試しもせず「あってますか?」とか丸投げする奴は初めてだ。
いやほんと、君凄いわ。
693デフォルトの名無しさん:2006/04/19(水) 11:26:44
>>691
>>692
すいません。
質問の仕方が失礼でしたか…申し訳ございません。
一応、自分でもしてみたんですが、
例えば5を入れると
5の段:51015202530354045
となってしまって…
本のみの知識で同じようにやってるつもりなんですがどうしてもうまくいかなくて・・・
教えてもらえたら本当に助かります。
694デフォルトの名無しさん:2006/04/19(水) 11:31:46 BE:275196773-
>>693
printf("%d ", ans);
でいいんじゃない?
695デフォルトの名無しさん:2006/04/19(水) 11:42:12
>>688
printfデバッグではなく賢いデバッガを使え
696さらさ ◆SARAHxmkr. :2006/04/19(水) 11:54:06
>>689
>>695
なるほど。
697デフォルトの名無しさん:2006/04/19(水) 11:56:11
>>694
えっと…それはどこのことでしょうか?
698デフォルトの名無しさん:2006/04/19(水) 12:13:18
>>694
ありがとうございます。なんとか分りました。
dの後ろにスペースってことだったんですね…
本当にありがとうございます。
699デフォルトの名無しさん:2006/04/19(水) 13:09:07
「APIで画面の切り替えはどうやってやればいいでしょうか??」
例えば、認証画面を作って認証画面から確認釦を押した時に
情報表示画面に遷移するとか。。。
自分が考えているのは同じ大きさのWindowsを二つ用意して
片方のWindowsにかぶせて遷移することを考えていますが、
何方かいい方法を教えてくれませんか?
700デフォルトの名無しさん:2006/04/19(水) 13:13:01
標準CにGUIなどない
701デフォルトの名無しさん:2006/04/19(水) 13:13:34
>>699
別のCDialogの派生クラスでも作ったら?
702デフォルトの名無しさん:2006/04/19(水) 13:57:54
>>699
Windowsを2つ用意ねぇ…スレを移動すべき。
Win32API質問箱 Build42
http://pc8.2ch.net/test/read.cgi/tech/1144962549/
703デフォルトの名無しさん:2006/04/19(水) 14:47:18
>>699
スレ違い
704デフォルトの名無しさん:2006/04/19(水) 15:10:18
なんで50分も経ってから同じ事をいうのか
705デフォルトの名無しさん:2006/04/19(水) 15:40:53
>>699
なんだかよくわからんが、Windowに乗ってるコンポーネント非表示に
するとか削除して新しいのを乗っければいいんじゃないの?
706デフォルトの名無しさん:2006/04/19(水) 16:00:03
なんでスレ違いの質問に、しかも解らんくせに答えたがるのか
707デフォルトの名無しさん:2006/04/19(水) 20:52:25
数字を文字列としてchar型配列に入れるプログラムを
作りたいんですが、sprintf()等の関数は使わずにつくれますか?
708デフォルトの名無しさん:2006/04/19(水) 20:54:33
>>707
作れる。
もし作れなかったら、そのsprintf()はどうやって作ってあると思いますか?
709デフォルトの名無しさん:2006/04/19(水) 20:55:15
itoaなりsprintfと同等の関数作れよ。
"0123456789"[n]で一桁の数値を文字に直せるだろ。
710デフォルトの名無しさん:2006/04/19(水) 21:47:43
見てて気分の悪くなる書き方→ n["0123456789"]
711デフォルトの名無しさん:2006/04/19(水) 21:49:33
横からだけど標準関数使わずに出力を書くにはどうすればいいの?
712デフォルトの名無しさん:2006/04/19(水) 21:54:39
非標準関数を使う
713デフォルトの名無しさん:2006/04/19(水) 22:18:37
あえてアンカーつけないが
アセンブラ知らねー香具師ハケーン
714デフォルトの名無しさん:2006/04/19(水) 22:29:50
708 に対する皮肉でしょ
715あフォの707:2006/04/19(水) 22:40:24
void my_itoa((long)number,(char *)data){
int i;
char d[16];//最大16桁
for(i = 0; data > 0; i++ ){
d[i] = number%10;
number = number/10;
}

for(i=0;i<16;i++){
data[i] = d[15-i];
}
}

色々ググってみても関数の中どうなってるかわからないorz
716あフォの707:2006/04/19(水) 22:42:08
データはlong型じゃなくでdouble型でやりたいんです。
どなたか教えてください(;ω;)
717デフォルトの名無しさん:2006/04/19(水) 22:47:19
>>715
・・・それテストしてみた?
718あフォの707:2006/04/19(水) 22:48:48
すいません。してません。すいません。
してみます。
719デフォルトの名無しさん:2006/04/19(水) 23:09:36
longはともかく、doubleは面倒だな。
doubleのフォーマットって決ってたっけ?
720あフォの707:2006/04/19(水) 23:12:19
あげてました。すいません。
721デフォルトの名無しさん:2006/04/19(水) 23:30:13
printf("input a:");
scanf("%d", &a);
printf("input b:");
scanf("%d", &b);

mod2 = a % b;

printf("%d % %d = %d\n", a, b, mod2);
これ実行すると
50 % %dとかなってしまって
余りの演算子が使えないのですが
どうすればいいのでしょうか?
722デフォルトの名無しさん:2006/04/19(水) 23:30:53
>>720
ま、age るとどうなるのか
わからないアフォは sage ても同じだが
723デフォルトの名無しさん:2006/04/19(水) 23:31:40
>>721
%%
724デフォルトの名無しさん:2006/04/19(水) 23:34:48
mod1 = a * a / b - b;

printf("%d * %d / %d - %d = %d\n", a, b, mod1);
余りの演算子を使わない場合はどうすればいいのでしょうか?
725デフォルトの名無しさん:2006/04/19(水) 23:37:09
>>724
何がしたいのかはっきり書け。

printfで%を表示させたいのなら>>723
%演算子を使わずに剰余を求めたければ、たとえばdiv関数が使える。
726デフォルトの名無しさん:2006/04/19(水) 23:39:24
すみません。一般的な質問で、どこに質問したらよいのかわからな
かったので、ここに書かせていただきます。

shell上でプログラムの処理時間をあらかじめ計算するには、どう
すればよろしいのでしょうか?

time ./programfile をやってみたのですが、これですと実行しながら
計算しているように思うのですが....
727デフォルトの名無しさん:2006/04/19(水) 23:40:39
>>725
すいません。二つ解らないことがあって一つは
>>723で解決しました。
もう一つは%演算子を使わずに余りを求める方法です。
関数も使わないで
728デフォルトの名無しさん:2006/04/19(水) 23:44:45
>>726
実行が終わる前にいつ終わるか予言しろと?

>>727
これ?
a-a/b*b
729デフォルトの名無しさん:2006/04/19(水) 23:49:10
>>728
それだと思うんですが余りの演算子の答えと一緒にならないんですよ
mod1 = a * a / b - b;

printf("%d * %d / %d - %d = %d\n", a, b, mod1);
どっかおかしいんですかね?
730デフォルトの名無しさん:2006/04/19(水) 23:50:42
>>729
それコンパイル通ったの?
731デフォルトの名無しさん:2006/04/19(水) 23:52:07
>printf("%d * %d / %d - %d = %d\n", a, b, mod1);

%dと変数の数がちがうけど。
732デフォルトの名無しさん:2006/04/19(水) 23:53:31
while (a >= b)
    a -= b;
733デフォルトの名無しさん:2006/04/19(水) 23:55:40
printf("input a:");
scanf("%d", &a);
printf("input b:");
scanf("%d", &b);

mod1 = a - a / b * b;

printf("%d - %d / %d * %d = %d\n", a, b, mod1);
コンパイルは通りましたが数が変です・・・
734デフォルトの名無しさん:2006/04/20(木) 00:01:29
つ printf("%d - %d / %d * %d = %d\n", a, a, b, b, mod1);
735デフォルトの名無しさん:2006/04/20(木) 00:14:09
>>734
できました。どうもです。
736デフォルトの名無しさん:2006/04/20(木) 00:39:03
**ptrを使う用例がいっぱい載っている本を教えてください

自分はこんなことにしか使ってない気がする
struct hoge *ptr
func(&ptr);

func(struct hoge ** ptr){

}


737デフォルトの名無しさん:2006/04/20(木) 01:19:01
>>736
必要無いのに使うことはないだろう。
738デフォルトの名無しさん:2006/04/20(木) 01:36:11
int main( int argc,char **argv)

int size = argv[1];
としたら、
エラー E2349 mem.c 9: 移植性のないポインタ変換(関数 main )
といわれるのですが、何がいけないのでしょうか?
引数には10などの整数を与えています
739デフォルトの名無しさん:2006/04/20(木) 01:37:31
それで10が入るとでも思っているのかお前は。
740デフォルトの名無しさん:2006/04/20(木) 01:41:43
OSはLinuxで、ディレクトリパスだけ取得する簡単な方法はありますか?
例えば、/A/B/a.txt だったら、/A/B と
741デフォルトの名無しさん:2006/04/20(木) 01:42:14
う、途切れた
a.txt に分けたいんですが。
742デフォルトの名無しさん:2006/04/20(木) 01:44:45
ケツから'\\'検索してそこに'\0'突っ込む
743デフォルトの名無しさん:2006/04/20(木) 01:51:36
// >>736 例えばこんなのとか?
// まぁ、色々端折っているので要注意で。
const char ** getTextRows(const char * fileName)
{
if (fileName == NULL) return NULL;
unsigned textLines = getTextLines(fileName);
if (textLines == 0) return NULL;
const char ** rtn = malloc(sizeof(char *) * (textLines + 1));
if (rtn == NULL) return NULL;
FILE * fp = fopen(fileName, "r");
if (fp == NULL) {
free(rtn);
return NULL;
}
char buf[FileBufferLen];
unsigned ic = 0;
while (fgets(buf, sizeof(buf), fp) != NULL) {
rtn[ic++] = strdup(buf);
}
fclose(fp);
rtn[ic++] = NULL;
const char ** tmp = realloc(rtn, sizeof(char *) * ic);
if (tmp) {
rtn = tmp;
}
return rtn;
}
744デフォルトの名無しさん:2006/04/20(木) 01:52:08
OSはLinuxで
745デフォルトの名無しさん:2006/04/20(木) 01:53:50
>>742
そんな糞探したって見つからないって。つーか、文盲ですか?

>>741
つ[basename]
まぁ、strrchr(ptr, '/')だろうな。
746デフォルトの名無しさん:2006/04/20(木) 01:58:10
for(hoge; geho; hugu)
のhogeのところで二つの変数を初期化したいのですがそういことはできませんか?
747デフォルトの名無しさん:2006/04/20(木) 02:00:06
普通にできるよ
748デフォルトの名無しさん:2006/04/20(木) 02:09:58
>>740
dirname()という関数があるがスレ違い
749デフォルトの名無しさん:2006/04/20(木) 02:10:26
for(a=0, b=0;
750デフォルトの名無しさん:2006/04/20(木) 02:10:36
>>746
for (i=0, j=0; i<10; ++i)
751738:2006/04/20(木) 02:17:47
>>739
数字はいらないんですね・・。

で、数字に変換しようと思い
char , *tmp_p = argv[1];
short int tmp, tmp_up = 0, flag = 0;

for( tmp = *tmp_p; flag == 1;*tmp_p++ ){
if( tmp >= '0' && tmp <= '9'){
tmp_up = tmp + (tmp_up * 10) - 48;
}
if( (tmp = *tmp_p) != 0){
flag = 1;
}
}
のように書いたのですが、うまく動きません
どこが間違っているか指摘していただけないでしょうか?
752デフォルトの名無しさん:2006/04/20(木) 02:26:19
*tmp_p++
753デフォルトの名無しさん:2006/04/20(木) 02:27:32
>>751
flagなんて余計な変数を持ち出すからおかしなことになる。
そいつの初期値が0だから、ループに突入できないと言うのが根本原因。
で、直すのならその無駄な変数は無くしてしまえ。
以下列挙。
・forループの最後のtmpへの代入は、tmp_pが更新されていないので無意味。
・forループの終端条件は条件部に直接書く。書けない場合はforループそのものの必然性を疑うべき。
・tmpの更新は条件部に書けば充分。
・forループの更新部でtmp_pの中身を参照してないのだから素直に++tmp_pで充分。
・突然意味不明な48なんて数字(こういうのをマジックナンバーと言う)を持ち出さず、(tmp - '0')とすべき。
・必要がない限り、shortにしないで普通のintを使うべき。
754デフォルトの名無しさん:2006/04/20(木) 02:28:30
>752 もまえ意地悪だなw

初回 flag == 1 が成り立たないんじゃ?
755738:2006/04/20(木) 02:56:01
もうわかんない・・・
for( tmp = *tmp_p; *tmp_p != '\0'; tmp = *tmp_p++){
if( tmp >= '0' && tmp <= '9'){
tmp_up = tmp - '0' + tmp_up * 10;
}

}
何が悪いのか・・
756738:2006/04/20(木) 03:21:09
ふぅ・・・。
for( tmp = *tmp_p++; *tmp_p != '\0'; tmp = *tmp_p++){
if( tmp >= '0' && tmp <= '9'){
tmp_up = tmp - '0' + tmp_up * 10;
}

}
tmp_up = tmp - '0' + tmp_up * 10;
こうやったらできたのですが、forの中に全部入れることってできないですかね?
757デフォルトの名無しさん:2006/04/20(木) 03:23:08
> tmp = *tmp_p++
758デフォルトの名無しさん:2006/04/20(木) 03:23:37
>>756
atoi() とか strtol() とか使っちゃいけないわけ?
759七五三:2006/04/20(木) 09:06:15
>>756
for (tmp_p = 0; (tmp = *tmp_p) != '\0'; ++tmp_p) ...;
って発想はありませんかそうですか。長々と書くだけ無駄でしたね。
760デフォルトの名無しさん:2006/04/20(木) 09:28:09
qsort()に代入する要素数って200以上無理?
なんかハングするんだけど・・・
761デフォルトの名無しさん:2006/04/20(木) 09:30:05
んなわけない。
最小のサンプルコード書いて使い方を正確に理解しろ。
762デフォルトの名無しさん:2006/04/20(木) 09:40:14
>>760
藻前のソースが間違ってるだけだろ
763デフォルトの名無しさん:2006/04/20(木) 09:41:31
>>756
何故、sscanf()やstrtol()を使わないのか?と(ry
764デフォルトの名無しさん:2006/04/20(木) 09:52:03
でもまぁ、>>756は代入できると思ってたところから
そこまで行ったんだから上等だろ
765デフォルトの名無しさん:2006/04/20(木) 10:10:23
確かに。この調子でstrtol()もきちんと使えるようになったら大したもんだと思うよ。
766さらさ ◆SARAHxmkr. :2006/04/20(木) 12:45:14
#define  DEBUG
#ifdef   DEBUG
printf("test\n");
#else /* DEBGUG */
printf("Production version\n");
#endif /* DEBUG */

のようにして、DEBUGを定義した時だけ
実行されるコードを記述できるという記述を
本で見たのですが、自分の環境BorlandC++5.5コンパイラ
でコンパイルすると、「)が必要です」とエラが
実行される文の行で発生します。
回避ないでしょうか?
767デフォルトの名無しさん:2006/04/20(木) 12:57:24
>>766
前後のコードがないとなんとも言えない。
少なくとも、挙げられてるコードに明らかな問題はなさそう。

768デフォルトの名無しさん:2006/04/20(木) 13:06:55
>>766
> #else /* DEBGUG */

このコメントから想像すると、
その前後の記述に入力ミスがあるんでない?
769デフォルトの名無しさん:2006/04/20(木) 13:51:59
きっと関数呼び出しの記述中で使おうとしたんだよ。
func(
#ifdef DEBUG
...
#endif
parameter);
ってな感じで。
770さらさ ◆SARAHxmkr. :2006/04/20(木) 14:01:55
>>767
>>768
>>769
色々なご意見ありがとうございます。
#ifdefの宣言はプログラムの先頭で、#includeなどと一緒に行っています。
main関数にprintf文だけしか含まないプログラムにコピペして実行しても
同じエラーが出ました。また、#define DEBUGを外すとエラーは出ないので、
#ifdefは正常に機能してるようなのですが・・・。
やはり、コンパイラの環境の問題でしょうか。
771デフォルトの名無しさん:2006/04/20(木) 14:08:31
>>770
基本に立ち返って、エラーの出る最小限のソースを作ってここに貼れ。
772さらさ ◆SARAHxmkr. :2006/04/20(木) 14:09:54
あっ、すいません、勘違いしてました。
プログラムの先頭に記述するのが問題だったのですね。
main関数の中で使用すれば問題ありませんでした。
ご教授ありがとうございます。
773デフォルトの名無しさん:2006/04/20(木) 14:11:32
>>769 パターンか 単文(?用語 よくわからんな) if に使っちゃったとみた

 |if (hoge)
 | DEBUG
 | then-statement;
 |else
 | DEBUG
 | elese-statement;
774デフォルトの名無しさん:2006/04/20(木) 14:19:47
>>772
俺が >>766 見て真っ先に思いつき、瞬時に否定した説が
まさか現実のものとは…
あのな、も少し勉強してから来い。
コテ名乗る前にやることが沢山あるはずだ。
775さらさ ◆SARAHxmkr. :2006/04/20(木) 14:52:21
>>774
ですね。自分でも、なんでこんな事が分からなかったのか恥ずかしいです。
すいません。
776デフォルトの名無しさん:2006/04/20(木) 15:13:48
可変個引数をそのまま可変個引数の関数に渡したいのですが、

// 例
int myPrintf(const char * format, ...)
{
return printf(format, /*ここどうすんの?*/);
}

・va_list (とvprintf)を使う
・printf(format, __VA_ARGS__) でマクロとして実装
のどちらかしか方法はないのでしょうか?
777デフォルトの名無しさん:2006/04/20(木) 15:41:39
>>776
普通に考えて、vprintf()を使うのが無難だと思うが。
#コンパイラ依存の方法もないではないが、このスレ的にはないことになる。
778デフォルトの名無しさん:2006/04/20(木) 16:09:21
>>776
vprintf()使っとけ
779デフォルトの名無しさん:2006/04/20(木) 17:43:00
質問ですがCに累乗計算のための演算子が無いのは何か理由があるんですか?
780デフォルトの名無しさん:2006/04/20(木) 17:50:03
揚足: (整数の) 2のn乗 1/n乗はあるぞ
本論: 記号がたりないようなキブン
781デフォルトの名無しさん:2006/04/20(木) 17:51:16
CPUにそういう命令が存在しないから。
782デフォルトの名無しさん:2006/04/20(木) 17:53:32
^はビット演算しだし**はポインタと区別が付きにくいし...
# a /*a は?という意見は却下

どうすれば良いと思う?
783デフォルトの名無しさん:2006/04/20(木) 18:16:57
ローテートシフト演算子が無いのも、また謎
784デフォルトの名無しさん:2006/04/20(木) 18:19:38
なんで
long long int
long int
short int
なのに
int intはないんですか?
785デフォルトの名無しさん:2006/04/20(木) 18:23:00
>>783
Cが作られた当時のCPU(PDC-7だっけ?)にそんな命令が無かっただけじゃないのか?
786デフォルトの名無しさん:2006/04/20(木) 18:29:33
>>785
う、そうかもしれん。
それぐらいの世代から基本的に変わってないってのもすごいな・・・
787デフォルトの名無しさん:2006/04/20(木) 18:32:59
>>779
1のFAQに書いてある。
http://www.kouno.jp/home/c_faq/c14.html#7
> べき乗を組み込みの命令として持っているプロセッサーが少ないからである。
788デフォルトの名無しさん:2006/04/20(木) 18:38:58
>>784
大きい整数変数
小さい整数変数
はいいとして、
整数変数整数変数
は変だろ?
789デフォルトの名無しさん:2006/04/20(木) 18:41:27
上司が、Cでオブジェクト指向的発想を持ってプログラムを作れ!カプセル化を意識しろ!!
っていわれましたが、みさなん何を気をつけていますか?

790デフォルトの名無しさん:2006/04/20(木) 18:42:10
>>789
そもそもCでオブジェクト指向なんてあったっけ?
791デフォルトの名無しさん:2006/04/20(木) 18:47:27
>>790
設計法と実装法は別物だと思うが・・・
(簡易)カプセル化は stdio の FILE と f〜 関数群が、それっぽくない?

継承とかやりだすと厄介だな。 素直に C++ なり継承サポートしてる言語使えと。
# 関数へのポインタを構造体メンバに持つ (virtual) のと
# 関数へのポインタのテーブルを別途用意すれば、それなりの実装になるのか?
792776:2006/04/20(木) 18:55:08
>>777-778
なさそうですね。vprintf使います。
ありがとうございました。
793デフォルトの名無しさん:2006/04/20(木) 18:58:23
qsortはStrategy パターンを使っていると強弁してみる
794デフォルトの名無しさん:2006/04/20(木) 19:27:33
cpad以上に使いやすい学習用ツールってあるかい?
795789:2006/04/20(木) 19:40:47
ようは、オブジェクト「的」発想らしいのです。
どうやらそこまで複雑化しなくても、より、モジュールの独立性を高めるのが目的です。

というのも、現在仕事で組み込み系をやっております。
そして、ユーザごとに機能を変更したり、メカにあわせてプログラムを変更する際に
いかに、簡単に、かつ他人が見てもわかりやすい構造にしたいらしいのです。

正直組み込み系以外やっていないので他のプロジェクトがどのような
取り組みをしてるのかわかりませんが、言語はCでお願いします。

796デフォルトの名無しさん:2006/04/20(木) 19:57:10
FILEみたいに、構造体へのポインタをオブジェクトのインスタンス(的な扱い)として、
各処理はポインタを関数に渡して行う&構造体の中身は直接参照しないこと、
とするのは良く使われてる方法だと思います。
797デフォルトの名無しさん:2006/04/20(木) 20:12:41
FILEを処理する連中は、みんななるべくfpを最後に取りたいなー
とか思ってやがってなんだかむかつく。fprintfは先頭に置くしかないんだから、
全員先頭で統一しろよ。
798デフォルトの名無しさん:2006/04/20(木) 20:20:06
>>795
とりあえずモジュール分割でいいんじゃないか?
モジュールを差し替え可能なように設計するのは当然として。
799デフォルトの名無しさん:2006/04/20(木) 21:49:42
先に入力した値が後に入力された値の何%かを表示する計算式はどうやればいいんですか?
800デフォルトの名無しさん:2006/04/20(木) 21:58:38
float saki;
float ato;
saki = /* 入力 */
ato = /* 入力 */
printf("%f",saki/ato*100));
801デフォルトの名無しさん:2006/04/20(木) 22:02:37
今日初めてscanf使いました。
自分でキーボード入力するって知らなくてコンパイルしても
何も表示されなかったので一人でパニくってました(^ω^)
C言語楽しいですね。
802デフォルトの名無しさん:2006/04/20(木) 22:05:02
>>800
あーざーす
803デフォルトの名無しさん:2006/04/20(木) 22:05:50
でも果てしなすぎて仕事に使えるレベルにするのは大変だなぁっと素人ながらに思った
804デフォルトの名無しさん:2006/04/20(木) 22:23:31
文字列として整数と演算子を入力して、atoiで囲むと演算子まで整数型になってしまいますよね・・
整数だけ整数型に変換したいのですが、どうすればいいのでしょうか?

805デフォルトの名無しさん:2006/04/20(木) 22:27:09
>>804
演算子?

atoi("-10") みたいのを言ってるの?
806デフォルトの名無しさん:2006/04/20(木) 22:36:55
>>805

逆ポーランド記法で電卓をつくっているのですが
文字列で例えば"12+="と入力して"12"だけ整数型に変換したいんです。
807デフォルトの名無しさん:2006/04/20(木) 22:39:43
>>806
atoi()はたしか、そういう動作だったような。
808デフォルトの名無しさん:2006/04/20(木) 22:41:23
strtolなどを使えば"12+="から数値型の12と元の文字列のうち"+="の部分(を指すポインタ)を得られる。
809デフォルトの名無しさん:2006/04/21(金) 00:05:36
あらかじめ整数の範囲をisdigitかなんかを使って調査して
別領域にコピーしてから、atoiに渡すとか。
810デフォルトの名無しさん:2006/04/21(金) 01:27:43
まぁ、sscanf()かstrtol()を使えってこったな。
811デフォルトの名無しさん:2006/04/21(金) 02:49:22
こんどプログラミングの会社のアルバイトを受けて見ようと思うのですが
自分はC言語を少し触ったくらいで、あまりかけません
理解力が大事ということで、面接でちょっとしたコードを書く試験があるらしいのですが
自分がどれくらいできるかわからないので
ちょっとでも理解できてるかどうかを見るような問題ってありませんかね?
812デフォルトの名無しさん:2006/04/21(金) 03:08:35
その会社がどの程度求めているのかわからんとなんとも言えないが・・・

んじゃとりあえず
「HTMLファイルを読み込んで、各タグの出現頻度をカウントしろ」
みたいなのはどうでつか

俺もすぐには作れねえケドwwwwwwwwwww
813デフォルトの名無しさん:2006/04/21(金) 03:46:40
やねう企画の入社試験でも解いてみたら?ぐーぐればすぐ見つかるし。
814デフォルトの名無しさん:2006/04/21(金) 04:51:16
>>813
全くわからなんだが
無理かな?
815デフォルトの名無しさん:2006/04/21(金) 08:11:05
Joel on Softwareって本に載ってた、著者が面接でよく出す問題。

・文字列をその場で逆にする
・連結リストを逆にする
・バイトデータの中でビットの数を数える
・二分検索
・文字列の中で同じ文字が一番長く続くところを見つける
・atoi
・itoa

注意点 10分以上かかる問題をださない。手書きでエディタやコンパイラを使わずに
書くのは難しいから、その点は考慮すると伝えて、回答者を安心させる。
816デフォルトの名無しさん:2006/04/21(金) 08:43:59
>>814
やねうのは確か本人が、大学等で情報科学の教育を受けた人なら簡単な問題だといってたから
裏を返せばそうじゃない人には結構歯ごたえあると思われ

>>815
文字列をその場で逆にって、テンポラリ変数使わずにってこと?
それだったらXOR-swapの出番だがw
817デフォルトの名無しさん:2006/04/21(金) 09:00:27
バッファ全体をコピーせずにって事だろ
818デフォルトの名無しさん:2006/04/21(金) 09:07:16
作業領域を使わずに文字列を反転するCコードを書かせる。
っていう問題ならここで見た
http://japan.linux.com/enterprise/06/02/27/0719245.shtml

XOR-swapやそれに類するスワップアルゴリズムを問うてるわけじゃないと思うし
そんなの使わなくても解けるよ
819デフォルトの名無しさん:2006/04/21(金) 10:25:44
「その場」が何を意味する言葉なのかによって答えは変わる。

char s[] = "abc";
int i;
for (i = strlen(s) - 1; i >= 0; --i) putchar(s[i]);

こんなの作られたら正解にするかどうか悩まないか?w
820デフォルトの名無しさん:2006/04/21(金) 10:35:39
下らないから黙ってていいよ
821デフォルトの名無しさん:2006/04/21(金) 11:40:52
sprintfで、doubleの値を、
・少数点以下がなければ少数点自体なし
・少数点以下があれば第三位で四捨五入して二位まで
とやろうとしています。
%.3fで、例えば0.1235は0.124にすることはできたのですが、9500だと9500.000になってしまいます。
9500だと9500、0.1235だと0.124にしたいのですが、sprintfの書式指定だけじゃ無理ですか?
822デフォルトの名無しさん:2006/04/21(金) 11:42:51
>>677,682
823デフォルトの名無しさん:2006/04/21(金) 11:51:43
>>821
"%.*f"でフィールド幅を指定することが出来る

四捨五入はprintf系の書式指定にはない。
少し工夫が必要だな
824821:2006/04/21(金) 12:09:11
0.1235が0.124になってたのはたまたまだったんですね。
型指定だけでできないのが分かったので、素直に分岐して処理することにします。
825デフォルトの名無しさん:2006/04/21(金) 12:15:34
>>823
無知を晒さなくてもいいよ。
つーか、>821に四捨五入されている様子が書かれているのだから文盲かも知らんが。

>>821
両方を満たす書式指定はないだろうな。
そもそも、「小数点以下がない」ことの意味は判っているのかな?
例えば9500.0000000001はどうするんだ?
それとその例だと小数点以下3桁表示しているように見えるぞ。
小数点以下3桁と仮定して、こんな感じかな。
char buf[20];
sprintf(buf, "%.3f", value);
if (strcmp(strchr(buf, '.'), ".000") == 0) {strchr(buf, '.')[0] = '\0';
/* 但し、valueの値域には十分注意すること */
826825:2006/04/21(金) 12:17:23
あ、言葉が足りてない。

小数点以下3桁で、「小数点以下がない」を四捨五入した結果が.000と仮定してこんな感じかな。

に訂正。
827デフォルトの名無しさん:2006/04/21(金) 12:40:52
>>825
とりあえず、最後の「}」位は省略せずに書こうよ
828825:2006/04/21(金) 12:57:32
うぁはは、途中から1行野郎で書こうと気が変わって忘れてた。
829デフォルトの名無しさん:2006/04/21(金) 13:27:34
%gでいけないっけ?
830デフォルトの名無しさん:2006/04/21(金) 13:35:19
>>829
いけてた
831825:2006/04/21(金) 13:54:22
>>830
%gでどうやって小数点以下3桁にするのかね。
832デフォルトの名無しさん:2006/04/21(金) 13:57:45
>>831
sprintf(s, "%g", (int)(d * 1000 + 0.5) / 1000.0);
こんな感じ?
833デフォルトの名無しさん:2006/04/21(金) 14:02:47
%.3gでいけねえか?

っておもったら1.234のときは1.23になっちまうのな(´Д`)
834825:2006/04/21(金) 14:27:34
>>833
%.3gの3は有効桁数なのだから当然。
例えば9876.54を食わせたら9.88e+03になる。

>>832
例えば123.5は123.500にならないのだけど。
835デフォルトの名無しさん:2006/04/21(金) 19:21:47
長いな…。でもこれでいいはず。

x = round(x * 1000.0);
sprintf(buf, (x == 0.0 || fmod(x, 1000.0) != 0.0) ? "%g" : "%.3f", x / 1000.0);
836デフォルトの名無しさん:2006/04/21(金) 19:24:54
わー。間違えた。

すまん。脳内で変換してくれ。
837デフォルトの名無しさん:2006/04/21(金) 23:02:55
昨日無料コンパイラをインストールして、
ソースコードを作成してコンパイルしたら
uneble to open include file 'stdio.h'
ってエラーが出たんだがよくわからん。
stdio.hが開けないってどういうこと?
838デフォルトの名無しさん:2006/04/21(金) 23:09:13
>>837
インストール?
どうせ、ただファイルを展開しただけだろ。
839保守:2006/04/21(金) 23:11:11
840デフォルトの名無しさん:2006/04/21(金) 23:14:48
readme.txt を読んでいないに1000ペリカ
841デフォルトの名無しさん:2006/04/21(金) 23:18:23
製品1: 
製品2:
製品3: 
ってやりたいんですけど
製品1 製品1 製品1ってなるのはどうしてですか?
for(i=0; i<1; i++)
for(k=0; k<3; k++)
{

printf("製品%2d:",i+1);
scanf("%d",&ma[i][k]);
}
842デフォルトの名無しさん:2006/04/21(金) 23:19:21
>>838
いや、ちゃんと本読んで手順にそってインストールしたんだが
843デフォルトの名無しさん:2006/04/21(金) 23:20:37
>>842
コンパイラってなに?
844デフォルトの名無しさん:2006/04/21(金) 23:22:58
>>843
borland C++ Compiler 5.5です
845デフォルトの名無しさん:2006/04/21(金) 23:23:50
>>844
ビンゴか・・・ >readme.txt
846841:2006/04/21(金) 23:24:02
すみません板違いでした。 宿題スレ行ってきます
847デフォルトの名無しさん:2006/04/21(金) 23:29:12
>>845
ごめんなさい。readme.txtって何ですか?
848デフォルトの名無しさん:2006/04/21(金) 23:30:18
インストール先のフォルダん中がどうなったかくらい見ろよ
849デフォルトの名無しさん:2006/04/21(金) 23:38:12
マイドキュメントにインストールしたんですが、
いま見たが良く分かりません。
具体的にはどうすればいいんですか?
850デフォルトの名無しさん:2006/04/21(金) 23:39:41
>>849
回線切って首吊るといいよ
851デフォルトの名無しさん:2006/04/21(金) 23:48:07
852デフォルトの名無しさん:2006/04/22(土) 00:25:22
>>851
アリガト
853デフォルトの名無しさん:2006/04/22(土) 01:07:05
@echo off
cd > BCC_home.dat
copy BCC.set+BCC_home.dat BCC_start.bat
call BCC_start.bat
C:\borland\bcc55の直下に

bcc.batとbcc.setを作成し、
bcc.batに

set BCC_LIB=%BCC_HOME%\bin
set BCC_INC=%BCC_HOME%\include
set BCC_TMP=%BCC_HOME%
set path=%PATH%;%BCC_HOME%\bin;
cmd.exe

del BCC_start.bat
del BCC_home.dat

を、記述しbcc.setに
@echo off
set BCC_HOME=
を記述。
そして、bcc.batから起動するといいよ

注意:
@echo off
set BCC_HOME=
の際に、=の後ろはスペースも改行もつけてはだめ
854デフォルトの名無しさん:2006/04/22(土) 02:16:36
もっと懇切丁寧に教えてあげないとできないと思うよ
855デフォルトの名無しさん:2006/04/22(土) 03:21:18
>>854
じゃ、あんたに頼んだ。
856デフォルトの名無しさん:2006/04/22(土) 03:23:53
ぐぐれ
857デフォルトの名無しさん:2006/04/22(土) 05:45:13
カレー
858デフォルトの名無しさん:2006/04/22(土) 11:02:34
スレ違いなのでとっとと(・∀・)帰れ!
859デフォルトの名無しさん:2006/04/22(土) 14:20:25
C言語初心者で今本読んで勉強してるんですが、何度読んでも関数がよく理解できません
特に戻り値が良くわからいです。
本には”関数の呼び出し元に返す値”って説明だったんですが、何でそんな事が必要なんでしょうか?
860デフォルトの名無しさん:2006/04/22(土) 14:22:19
>>859
例えば2つの引数を受け取って、その和を計算する関数があったとする
もし返値が無かったら、その和は関数終了と共に破棄される
861デフォルトの名無しさん:2006/04/22(土) 14:22:34
sum(int a, int b){
return a + b;
}

c = sum(a, b);
862デフォルトの名無しさん:2006/04/22(土) 14:23:24
>>859
それは関数の使用目的を聞いてるみたいな質問だな。
簡単に言えば、
p=func();
というのがあるとすると関数func()の中のreturnされた値がpに代入されるんだよ。
863デフォルトの名無しさん:2006/04/22(土) 14:25:11
数学で関数とかつかうだろ?
sinとかcosといったものも返り値を使って値を得られたらすごく便利だろ
864デフォルトの名無しさん:2006/04/22(土) 14:45:38
きっと>>859は引数で与えたポインタで全ての結果を返すんだよ。
865デフォルトの名無しさん:2006/04/22(土) 14:46:35
>>864
違うよ。
全部グローバル変数だよ。
866デフォルトの名無しさん:2006/04/22(土) 14:47:28
>>865
何ですかその糞仕様は
ふざけないでください><
867デフォルトの名無しさん:2006/04/22(土) 14:48:37
プログラム教えた時、
戻り値が分からんと言われた事は俺もあるな。
数学とか考えたら、
むしろ戻り値がない方に違和感を感じて欲しいもんだが。
868デフォルトの名無しさん:2006/04/22(土) 14:49:18
>>1 にも FAQ がリンクされてるし、
FAQ にある質問も「>>1 くらい嫁」と言われるくらいなんだから
それ以前のレベルにある >>859 にはお引取り願っても構わない気がするんだが。
869デフォルトの名無しさん:2006/04/22(土) 14:58:12
#include <stdio.h>

/* f(x) = x + 2 */
int f(int x) {
 return x + 2;
}

int main() {
 int x;
 for(x = 0; x < 10; ++x) {
  printf("x = %d の時 f(x) = %dn", x, f(x));
 }
 return 0;
}
870デフォルトの名無しさん:2006/04/22(土) 15:25:39
誰か教えてください、コマンドラインからファイルをダンプするソースを書いたのですが
二つ目以降のファイル内容がひょうじされず、空文字だけが続いて表示されてるみたい
なんですが、どこがおかしいか教えてください。
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define BUF_SIZE 16/*一回に読み込むバイト数*/
int main(int argc, char* argv[])
{FILE *fp;int count = 1;unsigned char buf[BUF_SIZE];unsigned char c;int len;int i;len = BUF_SIZE;
while(count < argc){if((fp = fopen(argv[count],"rb")) == NULL){
fprintf(stderr,"%sが開けない",argv[count]);exit(1);}
while(len == BUF_SIZE){
len = fread(buf,1,BUF_SIZE,fp);
for(i = 0; i < len;i++){printf("%02x ",buf[i]);}
while(i < BUF_SIZE){
printf("-- ");
i++;
}
for(i=0; i<len; i++){
c = buf[i];
if(isspace(c)) c = ' ';
putchar(c);
}
putchar('\n');
}
putchar('\n');
fclose(fp);
count++;
}
return 0;
}
871デフォルトの名無しさん:2006/04/22(土) 15:43:29
>>870
ある変数が再初期化されていない所為で、二つ目のファイル以降の処理が巧く動けない。
→ファイル名を受け取りダンプする処理を関数に纏めて、main()ではその関数を順に呼ぶだけにするといいと思う。
872デフォルトの名無しさん:2006/04/22(土) 16:37:15
ファイルの入出力を頻繁に行うので、関数定義したのですが
エラー E2293 file_open.c 12: ) が必要
が出ます、Borland エラー E2293ググッテ見ましたが、分かりませんでした
お助け(;^ω^)

/* ファイル入出力 */
/* file_poファイルポインタ取得 */
/* file_nameファイル名 */
/* modeファイルオープンモード */
void func(char[] file_po, char[] file_name, char[] mode)
{
FILE *file_po;/* ファイルポインタの宣言 */
if ((file_po = fopen(file_name, mode)) == NULL) {
printf("file open error!!\n");
exit(1);/* エラーの場合は通常、異常終了する */
return 0;
}
}

int main(void)
{
char s[256];
char str_array[256][256];

/* ファイルの読み込み */

strcpy(file_po, "fp");
strcpy(file_name, "foo.txt");
strcpy(mode, "r");
func(file_po, file_name, mode);
}
873デフォルトの名無しさん:2006/04/22(土) 16:43:27
>>872
C の文法を勉強し直してきて下さい。
874デフォルトの名無しさん:2006/04/22(土) 16:49:17
intで定義して値を返さずvoidで定義して0を返すか。
しかしそんな細かなことはどうでもよくなってくるコードだなw
875デフォルトの名無しさん:2006/04/22(土) 16:52:20
これは何と言うプログラム言語なのか教えていただきたいですね
876872:2006/04/22(土) 16:54:46
そう言わずに教えてヽ( ゚д゚)ノクレヨ
877デフォルトの名無しさん:2006/04/22(土) 17:06:13
funcの戻り値がvoidと定義されているのに、return 0;というふうに値を返すコードになっている

さらにみんなに馬鹿にされまくってるほど致命的なのは
strcpy(file_po, "fp");
file_po = fopen(file_name, mode))
この部分

普通、fpという名前は
FILE *fp;
fp = fopen("abcde.txt", "r");
という例でつかわれる

fopenの引数は問題ないよ、たぶん
878デフォルトの名無しさん:2006/04/22(土) 17:08:24
どういう脳の構造をしていればそんなプログラムが組めるのか果てしなく謎だぞ

もしくはすさまじい嘘教え込まれてるとか
879デフォルトの名無しさん:2006/04/22(土) 17:29:50
>>876
※func()内
・文法上のエラー
FILEが未定義
char[]なんて表記はない
file_poが名前の重複
・文法上の警告
exit()が未宣言
void型関数で値を返している
・論理上の問題点
FILE*は適切に呼び出し元に引き渡さないといけない
main()以外でexit()するのはお勧めできない

※main()内
・文法上のエラー
file_poが未定義
file_nameが未定義
modeが未定義
・文法上の警告
strcpy()が未宣言
sが未使用
str_arrayが未使用
・論理上の問題点
"fp"なんて文字列を扱う必要があるようには見えない。
変数の宣言の仕方、関数の呼び出し方がまるで判っていない

※結論
最低限の勉強すらする気がないならプログラミングなんざやめてしまえ。
やる気があるなら、せめて初心者以下向けのスレがあるからそこにでも。
つーか、教えてくれなどと烏滸がましい事が言えるようなレベルじゃないな。
880デフォルトの名無しさん:2006/04/22(土) 17:56:43
>>876
> ファイルの入出力を頻繁に行うので、関数定義したのですが
ファイル操作の方法と関数定義をを知ったので興味本位でファイルオープン用関数を作った

が正解じゃ無いの?
少なくとも変数や配列、ポインタをまともに学んだとは思えない。
881870:2006/04/22(土) 18:18:59
>>871さん
おっしゃるとおり、別関数にしたら出来ました。
試しに、ws2_32.dllをダンプして、何かいてあるか見れるかなと思ったけど
まぁ、無理でした。ビープ音とかなってましたし。
ユニコードとANSI文字で書いたファイル二つ比較したら
半角英字がa b c dってなってた。
ところで、教えていただきたいんですが、どの変数が初期化されてなかった
んでしょう。
出来れば教えていただきたいです。
882デフォルトの名無しさん:2006/04/22(土) 18:57:21
質問ですがスタックってメモリの上位番地の方に伸びていくんですか?それとも下位番地の方に伸びていくんですか?
883デフォルトの名無しさん:2006/04/22(土) 19:28:03
>>882
それに興味を持つのは大変結構なことだが、一番重要な事は、
それがどちらの場合であったとしても対応できるような
プログラミングを常日頃から行うように心がけること。
884デフォルトの名無しさん:2006/04/22(土) 19:34:14
>>881
あ・ま・え・ん・な

力試しの積もりで自分で考えて味噌。
それと、iscntrl()もチェックして代替文字に置き換えたほうがいいよ。
そうすればピーピー鳴らんで済むし。
885デフォルトの名無しさん:2006/04/22(土) 19:51:58
>>883
わかりました。
886デフォルトの名無しさん:2006/04/22(土) 20:04:37
バイナリデータをテキスト変換したり戻したりする方法を
説明しているサイトってありますか?
よくある偽装ツールみたいなものなんですけど。
887デフォルトの名無しさん:2006/04/22(土) 20:06:40
return -1;

ってどういう意味ですか?
888デフォルトの名無しさん:2006/04/22(土) 20:11:35
>>886
ソフトの質問なら鼬害。
偽装方法の質問ならお門違い。
変換方法の質問ならスレ違い。
889デフォルトの名無しさん:2006/04/22(土) 20:19:49
アルゴリズムっぽかったですね。
失礼しました。
890デフォルトの名無しさん:2006/04/22(土) 20:20:37
>>887
-1と言う値を返す
891デフォルトの名無しさん:2006/04/22(土) 20:23:22
>>886
ついでに、テキストデータもバイナリな訳だが
892デフォルトの名無しさん:2006/04/22(土) 20:27:26
つまり、テキスト⊂バイナリということ。
893デフォルトの名無しさん:2006/04/22(土) 20:45:30
>>890
つまりどういう意味?
894デフォルトの名無しさん:2006/04/22(土) 20:54:08
>>893 つまり何を聞きたいんだ? 関数の戻り値が何か分からないのか?
895デフォルトの名無しさん:2006/04/22(土) 20:56:44
>>893
-1と言う値を返す
896デフォルトの名無しさん:2006/04/22(土) 20:58:13
>>893
どういう意味かわから無いってことは、
return 0;は正常終了だけの意味しかないと思ってるでしょ。
897デフォルトの名無しさん:2006/04/22(土) 20:59:51
2の補数で表現すると(11111111)2
つまり8個の条件のうちの8個を満たしている。
何もエラーがなく完璧な処理をしたという意味の戻り値です。
898デフォルトの名無しさん:2006/04/22(土) 21:01:36
>>897
でもそれは関数mainにおいてであって、ほかの関数が必ずしもそうとは限らない
899デフォルトの名無しさん:2006/04/22(土) 21:08:52
>>898
関数main()においても、8ビット値が返される訳ではない。

>>897
つーか、くだらないネタ書くなや。
900デフォルトの名無しさん:2006/04/22(土) 21:51:57
main の返却値は本質的に処理系依存
901デフォルトの名無しさん:2006/04/22(土) 22:06:07
>>900
本当に処理系依存だったら、
main の中で呼んだ main の戻り値も
処理系依存になってしまうと思うのだが?
902デフォルトの名無しさん:2006/04/22(土) 22:07:04
>883
>それに興味を持つのは大変結構なことだが、一番重要な事は、
>それがどちらの場合であったとしても対応できるような
>プログラミングを常日頃から行うように心がけること。

何を意識すればいいのですか?
ようはスタックをあまり使わないようなプログラムを作ること?

あと、スタックって普通初期設定で
スタックエンドポインタをセットし、上に積み上げるイメージがあるのだが・・・
ハードによって異なるの?
903デフォルトの名無しさん:2006/04/22(土) 22:13:39
Cって変数名に_Under barって使えなかったんだね(゚∀゚)アヒャ
904デフォルトの名無しさん:2006/04/22(土) 22:14:20
>何を意識すればいいのですか? 
スタックであることを意識しないプログラムを作ること。
auto の変数が、本当にスタックに詰まれるかどうかは
コンパイラ次第。

>ハードによって異なるの? 
勿論。
そもそもハードウエアスタックのないコンピュータだって
ありうる。
905デフォルトの名無しさん:2006/04/22(土) 22:14:31
>>901
さあ、わからんね
main の再帰なんて遊び以外でやったことないんで
センセイならご経験がおありのようで
906デフォルトの名無しさん:2006/04/22(土) 22:43:38
>>901
ならない。処理系依存なのは、何を返すべきかという点。
907デフォルトの名無しさん:2006/04/22(土) 22:45:17
>>901
それを考慮して、というわけでは絶対にないが、ちなみにC++ではmainをプログラムから呼ぶことはできない。
908デフォルトの名無しさん:2006/04/22(土) 22:45:19
スタックマシンならぬキューマシンってのもあるしな。
909881:2006/04/22(土) 23:44:43
>>884
甘えてました、兄貴。
ばっちし、わかったす。
変数lenがfreadの戻り値のままでした。
910871:2006/04/23(日) 00:44:14
どうでもいいけど私ゃ女だ。
911デフォルトの名無しさん:2006/04/23(日) 00:45:25
じゃあ、姐さんだな
912デフォルトの名無しさん:2006/04/23(日) 05:24:03
C言語の規格(C99)では、ローカル変数の定義は、関数の先頭でしなければならないのでしょうか?
913881:2006/04/23(日) 05:51:20
>>912
ブロックで囲めばどこでもいけるはず。
ただ、スコープはやはりブロック内だけ。
914デフォルトの名無しさん:2006/04/23(日) 07:17:52
んでは、ブロックの先頭のみ、ということですね
ありがとうございました
915デフォルトの名無しさん:2006/04/23(日) 07:22:19
ふと気になったんだけど、例えば
int a;
って、変数の定義っていうの?
変数の宣言だと思ってた

あれ? extern int a; みたいなのを宣言っていうのかな?
916デフォルトの名無しさん:2006/04/23(日) 08:04:33
C言語で、ディレクトリ内ファイル名をすべて取得したいのですが
そんな関数は準備されていないのでしょうか?(MS DOSのdirコマンドみたいなものです)
917デフォルトの名無しさん:2006/04/23(日) 08:26:10
>>912
C99ならブロックの先頭でなくても定義できる。
ブロック先頭限定はそれ以前のCだな。

>>916
標準Cにはない。POSIXにはあるから、「比較的一般的な方法」というのは存在する。
918デフォルトの名無しさん:2006/04/23(日) 08:56:50
>>915
それは定義であり宣言でもある。
919デフォルトの名無しさん:2006/04/23(日) 10:32:31
>>915
書いた位置による
ここは関数の外に書いた場合をきちんと説明できないアフォが多そうだが
920デフォルトの名無しさん:2006/04/23(日) 10:53:01
関数の外に書こうが中に書こうが定義兼宣言。
921デフォルトの名無しさん:2006/04/23(日) 10:54:33
さっそくアフォハケーン
922デフォルトの名無しさん:2006/04/23(日) 11:07:07
まず定義とはなにかを定義してからだな。
923デフォルトの名無しさん:2006/04/23(日) 13:01:50
>>919 >>921
おまえが阿保。

ISO/IEC 9899, 6.7-5
A definition of an identifier is a declaration for that identifier that:
- for an object, causes storage to be reserved for that object;
- ...
記憶容量が割り当てられるようなオブジェクトの declaration は definition。

特に関数の外に書いた場合
ISO/IEC 9899, 6.9
An external definition is an external declaration that is also a
definition of a function (other than an inline definition) or an object.
...
オブジェクトの外部での declaration は外部での definition。
924デフォルトの名無しさん:2006/04/23(日) 13:07:16
見てるとこ違うし

# 阿呆じゃないらしいな、この阿呆が言ってるのは
925デフォルトの名無しさん:2006/04/23(日) 13:19:14
>>924
違うというなら場所を指摘しようね
926デフォルトの名無しさん:2006/04/23(日) 13:23:04
教えてやんない

もともと無料サービスする筋合いないし
あまつさえ下劣な言葉で侮辱した者にお情けなどありえない
927デフォルトの名無しさん:2006/04/23(日) 13:26:11
毎日がゴールデンウィーク
928デフォルトの名無しさん:2006/04/23(日) 13:27:14
>>926
指摘できないのでムキになっておりますw
929デフォルトの名無しさん:2006/04/23(日) 13:28:11
煽っても無駄
そのままアフォやってろ
930デフォルトの名無しさん:2006/04/23(日) 13:32:27
なんで質問スレで、返答するかしないかでもめてるんだ・・・・?w
931デフォルトの名無しさん:2006/04/23(日) 13:42:43
低能だからだろ?www
932デフォルトの名無しさん:2006/04/23(日) 13:48:11
お前らもめるような精神的余裕があって羨ましいよ。
933デフォルトの名無しさん:2006/04/23(日) 13:52:19
とりあえず
宣言 ⊃ 定義

つまり、"定義"は、定義であり宣言であるが
"宣言"は、定義であるとは限らない

という感じでよろしいですか?
934デフォルトの名無しさん:2006/04/23(日) 13:54:17
>>933
一般の文脈ではそのとおり。

宣言であって定義でない代表的な例は typedef 。
935デフォルトの名無しさん:2006/04/23(日) 14:06:31
・データの取り出し元は単純な関数。
 簡略した例とすれば、GetData(int id)みたいな関数で、idだけが変化する。

・データの格納先は、ネストの深い構造体。
 格納するメンバの階層も名前も型も、てんでバラバラ。

・項目数は大量(1000の桁)

この条件で、取り出し元から格納先へのデータの移動を、
簡潔に書く方法ないですかね?



取り出しの方は定型的なので、idのデータだけ用意してループさせる
簡潔な処理に出来るけど、格納先がどうにも・・・・

構造体の各メンバのアドレスをデータとして持って、そこに格納する事も考えたけど、
型の違いの吸収が、かなり胡散臭くなってしまう。

構造体の全メンバに合わせてプログラム書くのも嫌だし、仮に
『格納プログラムを書くプログラム』を作って自動生成するにしても、
量がしゃれにならないし・・・・

かなり迷っています。
936デフォルトの名無しさん:2006/04/23(日) 14:10:06
追記

>構造体の各メンバのアドレスをデータとして持って、そこに格納する事も考えたけど、

と書くとおかしいね。

構造体の各メンバの、先頭からのアドレスオフセットをデータとして持って、
各メンバのアドレスを算出して格納する事も考えたけど、

とするべきですね。
937デフォルトの名無しさん:2006/04/23(日) 14:17:30
1000の桁って・・・1つ1バイトだとしても10^289テラバイトなんだが(゚д゚;)
938デフォルトの名無しさん:2006/04/23(日) 14:18:23
すまん、すさまじくボケた
なぜか2^1000を1024^3で割ってたorz
939デフォルトの名無しさん:2006/04/23(日) 15:02:38
プログラマになるために基本情報とかやっておいたほうがいいんですか?
940デフォルトの名無しさん:2006/04/23(日) 15:30:17
いい
941デフォルトの名無しさん:2006/04/23(日) 16:39:27
イイッ…基本情報イイイッ…
942デフォルトの名無しさん:2006/04/23(日) 17:28:17
こういう場合にerrnoの値は信用できますか?
信用できない場合エラーの正確な理由をみつけるには
最後にまとめずfprintfなどのエラーを毎回チェック
するしかないんでしょうか

FILE *f;
f = fopen(filename, "r");
...
...
if (ferorr(fp)) {
 // ここでerrnoの値は信用できる?
}
fclose(f);
943デフォルトの名無しさん:2006/04/23(日) 17:35:14
信用できる
944デフォルトの名無しさん:2006/04/23(日) 17:36:53
errnoの値は信用できるが、そのコードだけではエラーの検出が保証されない。
945デフォルトの名無しさん:2006/04/23(日) 17:44:11
>>944
え、何故ですか?
946デフォルトの名無しさん:2006/04/23(日) 17:58:41
その直前にclearerr(fp)があるかもしれない。
947デフォルトの名無しさん:2006/04/23(日) 17:59:43
fopenはferrorでは検出できないんだっけ??
948デフォルトの名無しさん:2006/04/23(日) 18:03:55
そもそもfとfpは違う変数かもしれない
949デフォルトの名無しさん:2006/04/23(日) 18:09:47
文字列の1部分だけ整数型にしたいんですが
a = atoi(str[i])なんてことはできないですよね・・・
どうすればいいでしょうか?
950デフォルトの名無しさん:2006/04/23(日) 18:10:46
>>949
普通にa = atoi(&str[i]);でできるだろ
951デフォルトの名無しさん:2006/04/23(日) 18:29:23
>>949
atoi()でできない(≒数字を切り出す必要がある)ならsscanf()を使えばいい。
952デフォルトの名無しさん:2006/04/23(日) 19:39:28
>>946
直前とは"..."と省略した部分に自分でclearerr()を
書いた場合ということでしょうか。

それとも既にエラーになったFILEポインタに対して
fprintf()やfputc()を呼ぶと、clearerr()される場合
があるということでしょうか。
953デフォルトの名無しさん:2006/04/23(日) 21:46:48
アスキーファイルからの読込み処理を構造体に代入することは出来ますか?

struct foo[4]
{
char hoge[2];
char hoge_1[2];
char hoge_3;
};
こんな感じで、変数を持ちたいのですが?
954デフォルトの名無しさん:2006/04/23(日) 21:49:49
>>953
できます。
ご自由にどうぞ。
955デフォルトの名無しさん:2006/04/23(日) 21:49:53
できますが。
956デフォルトの名無しさん:2006/04/23(日) 21:53:49
アライメントの問題はどうなんだろう。
charだと隙間はできない?
957デフォルトの名無しさん:2006/04/23(日) 21:55:13
横着しなけりゃいいじゃん。
958デフォルトの名無しさん:2006/04/23(日) 21:59:26
よくわからんがfread()の事を言ってるんだろうか
959デフォルトの名無しさん:2006/04/23(日) 22:10:22
みなさんどうもです
fread関数ってあったんですね(;^ω^)
てっきり、読込む場合は、読込むファイルをバイナリモードで開いて、
getc関数で一文字づつ読込むものかと思っていて、危うく変な質問するところでした

960デフォルトの名無しさん:2006/04/23(日) 22:17:58
>>956
実装依存。
961デフォルトの名無しさん:2006/04/23(日) 22:33:10
次のスレッド
C言語なら俺に聞け! Part 126
http://pc8.2ch.net/test/read.cgi/tech/1145799128/
962デフォルトの名無しさん:2006/04/24(月) 00:39:50
実数を2進数で表せますか?
963デフォルトの名無しさん:2006/04/24(月) 00:52:15
虚数を2進数で表すにはどうしたらいいのでしょうか?
964デフォルトの名無しさん:2006/04/24(月) 00:58:59
実数は、どういうものをもって実数というのかによるけど、
無理数を厳密に表現するのは(少なくとも現在メジャーに用いられている方法だと)ムリだと思われ
単に小数を表現できるのかどうか、っていう意味なら可能
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

虚数も同様にムリだと
実部・虚部を表現するような表現方式を考えた場合はしらんがw
965デフォルトの名無しさん:2006/04/24(月) 01:15:09
>>964
実部・虚部を持つのは複素数。
n=a+biに於いてa=0かつb≠0のときnを虚数と言う。

虚数って二進数じゃ表しようがないんじゃまいか。
プログラマが虚数と実数を分けて考えるしかないだろうな。
966デフォルトの名無しさん:2006/04/24(月) 01:39:52
>>965
それは純虚数だ
複素数=実数∩虚数
967デフォルトの名無しさん:2006/04/24(月) 02:41:47
本当に実数を表現したいんなら、分数として考えるべきじゃないの?だめ?
968デフォルトの名無しさん:2006/04/24(月) 02:48:58
世の中には分数では表現できない数もあるんです・・・
969デフォルトの名無しさん:2006/04/24(月) 02:49:42
>>967
君は有理数、無理数を理解してないだろ?
970デフォルトの名無しさん:2006/04/24(月) 03:06:29
あ、有理数が表現できるだけだったか・・・

死にたいorz
971デフォルトの名無しさん:2006/04/24(月) 05:45:50
ポインタ機能があるのはC言語だけですか?
972デフォルトの名無しさん:2006/04/24(月) 05:51:21
Javaにだってポインタはあるよ
973デフォルトの名無しさん:2006/04/24(月) 06:56:44
>>966
その記号はおかしい。
974デフォルトの名無しさん:2006/04/24(月) 08:07:09
>>952どなたかお答えいただけないでしょうか…
975デフォルトの名無しさん:2006/04/24(月) 08:22:50
>>974 前者
976デフォルトの名無しさん:2006/04/24(月) 10:57:06
>>965
>虚数って二進数じゃ表しようがないんじゃまいか。
十進で表せて二進で表せないわけないだろw
977デフォルトの名無しさん:2006/04/24(月) 11:30:34
>>971
C, C++, Pascal, PL/M
およびそれらの派生
978デフォルトの名無しさん:2006/04/24(月) 13:54:40
>>952
ていうか errno って色々な処理で書き換えられる可能性があるからな。
処理の直後以外で検査しても意味がないと思うぞ。

たとえばこんなのとか。
if ((fp = fopen("xxx","w")) == NULL) {
 // ここでは errno は変わってないが、
 printf("abc\n");
 // ここではもう errno が変わっている。(write()を使うため)
}
979あげあし鳥:2006/04/24(月) 14:14:01
>>976
>十進で表せて二進で表せないわけないだろw
0.1
980デフォルトの名無しさん:2006/04/24(月) 14:37:31
>>979
それができないとしたら浮動小数点演算はどうやって実現していると思っているんだ?
981デフォルトの名無しさん:2006/04/24(月) 14:42:16
浮動小数点では0.1を表現できないよ
「浮動小数点 誤差」で検索してみ?
982デフォルトの名無しさん:2006/04/24(月) 14:44:55
>>980
float型の0.1を100回くらい足してみれ
983デフォルトの名無しさん:2006/04/24(月) 15:08:00
「正確には」表現できない、だな
128ビットの複素数型を定義して、構造は64ビットずつ実部と虚部っつーアホなこと思いついたけど
普通に2つに分けたほうが絶対にいいよな・・・w
984デフォルトの名無しさん:2006/04/24(月) 15:27:46
つ[C99]
double _Complex 型
double _Imaginary 型
985デフォルトの名無しさん:2006/04/24(月) 15:32:04
// 数値を読み込む //
printf("数をいくつ入力しますか?");
scanf("%d",&count);
for(a=0;a<count;a++) scanf("%d",&item[a]); // count数に達するまで配列[a]に数値が格納される //

// バブルソートを使用して数値を整列させる //
for(a=1;a<count;++a)     ←ここから
for(b=count-1;b>=a;--b){
// 隣接する要素を比較する //
if(item[b-1]>item[b]){
// 要素を交換する //
t=item[b-1];
item[b-1]=item[b];
item[b]=t;   ←ここまで
}
}

// 整列後のリストを表示する //
for(t=0;t<count;t++) printf("%d",item[t]);

return 0;
}
986985:2006/04/24(月) 15:32:36
横から割って入ってすいません。
1次元配列のソートに関するところで、バブルソートの意味がわからないのですが・・

ごめんなさい丸投げで。
要素を[a]から[t]に変換して順序を揃える手順の内容がまったくわかりません。
ていうか b って何のための(何をしている)関数なのでしょうか。

たぶんCの基礎的な知識が欠落していると思うのですが、
どなたか教えていただけないでしょうか。
どうか、お願いします
987デフォルトの名無しさん:2006/04/24(月) 15:37:44
C以前にアルゴリズムを解析しようとする意欲が欠けてる。
ソート途中のリストを表示させて何やってるのか考えろ。
988デフォルトの名無しさん:2006/04/24(月) 15:45:19
>>986
トランプでも使ってやってみろよ。
C以前の問題じゃないのか。
989デフォルトの名無しさん:2006/04/24(月) 16:06:37
>>981
誤差の話か。いやあ、話の流れとしてさ…。
まあいいか。
990デフォルトの名無しさん:2006/04/24(月) 16:14:59
浮動小数点数の内部表現で仮数部が BCD なフォーマットってあるのかな?
991デフォルトの名無しさん:2006/04/24(月) 16:30:40
聞いたことないが作ろうと思えば作れるな。
992985:2006/04/24(月) 16:48:04
>>987,>>988
ありがとう。よくわかんないけどもう一度細かく考えてみます。
993デフォルトの名無しさん:2006/04/24(月) 17:16:51
>>990
あるよ。「汎用性を持たせようとしたバイナリデータ」という今となっては
果てしなく存在意義が薄いデータ用に定義されていた。
994デフォルトの名無しさん:2006/04/24(月) 17:32:17
>>979
1010分の1
995985:2006/04/24(月) 17:44:28
たびたびごめん。
要素を比較して前の要素の方が大きかったら要素を交換する、
ここまでは理解できた。
ただ

for(b=count-1;b>=a;--b)

この一行がわかりません。
初期設定部がcount-1で条件判定部がb>=aでデクリメントってどういう、
ていうか何をしている式なんでしょうか。
996デフォルトの名無しさん:2006/04/24(月) 17:50:37
頭悪いあげ
997デフォルトの名無しさん:2006/04/24(月) 17:58:03
>>995
You! C言語投げ捨てちゃいなYo!
998デフォルトの名無しさん:2006/04/24(月) 17:58:46
もうすぐ1000
999デフォルトの名無しさん:2006/04/24(月) 18:02:49
C1000タケダ
1000デフォルトの名無しさん:2006/04/24(月) 18:03:05
1000ゲット
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。