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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の*入門者*向け解説スレッドです。
初心者、初級者の方は他の質問スレのほうが良いかもしれません。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
 C/C++の宿題片付けます 122代目
 http://pc11.2ch.net/test/read.cgi/tech/1232029287/
もしくは
 C/C++の宿題片付けます 123代目
(現時点でまだ立っていません)

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

前スレ
C言語なら俺に聞け(入門篇) Part 45
http://pc11.2ch.net/test/read.cgi/tech/1235044065/

過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
2デフォルトの名無しさん:2009/03/02(月) 00:08:17
        人     うんこ体操の時間だよ!
       (__)
      (__)
    (( o(,,・∀・ )   うっ、うっ!
     丿  ノo ))
     (,/ヽ_)

        人
       (__)
      (__)
      (,,・∀・ )   うんこ〜♪
     ⊂  と丿
       ヽ__)-'

        人
      (__)
     (__)
     (,,・∀・ )    みんなで、みんなで!
   ((  ノ つ ⊃ ))
     (__ノヽ_)

        人
       (__)
      (__)
     ('( ・∀・,,)')   うんこ〜♪
        (    )
        U-U
3デフォルトの名無しさん:2009/03/02(月) 00:15:43
以下経験が云々の話題禁止
4デフォルトの名無しさん:2009/03/02(月) 00:33:22
janeの隠し機能

1.書き込みウィンドウを出し半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
5デフォルトの名無しさん:2009/03/02(月) 00:38:24
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

あなたのIPは219.134.234.342です。
送信しました
6デフォルトの名無しさん:2009/03/02(月) 00:39:15
大量のファイルを読み込むプログラムが必要な状況です。
boost::threadを使って,ファイル読み込みと処理の部分をマルチスレッド化しようと思っていますが,うまくいきません。

大量のファイルを読み込み,最初の一行をvectorに読み込む場合,下のようなプログラムになると思うのですが,何がだめなのでしょうか?


boost::mutex state_guard;


class FileOpener {
public:
FileOpener(std::string file_name, std::vector<std::string> *first_lines) : file_name(file_name), first_lines(first_lines) {
};
virtual ~FileOpener(){};
void run() {
boost::mutex::scoped_lock lk(state_guard);
std::fstream member_csv(file_name.c_str(), std::ios::in);
std::string str;
getline(member_csv, str);
first_lines->push_back(str);
member_csv.close();
}
private:
std::string file_name;
std::vector<std::string> *first_lines;

};
7デフォルトの名無しさん:2009/03/02(月) 00:42:19
スレタイが理解できない頭の悪さが問題です。
8デフォルトの名無しさん:2009/03/02(月) 01:22:58
>何がだめなのでしょうか?
このスレで質問したこと
9デフォルトの名無しさん:2009/03/02(月) 01:49:34
前にもどこかで見たけど、コピペと違うの?
10デフォルトの名無しさん:2009/03/02(月) 02:44:12
最近見たね
無視しとけばいいんじゃない
11476:2009/03/02(月) 11:28:48
#include <stdio.h>
int fact(int i);
int main(void)
{
printf("%d\n",fact(4));
return 0;
}
int fact(int i)
{
if(i==1) return 1;
else return i*fact(i-1);
}
これなんですが
int fact(int i)
{
if(i==1) return 1;
else return i*fact(i-1);
}の場所の if(i==1) return 1;なんですが
何で return 1なんですが?しかしreturn 1なのに1ではなく、ちゃんと階乗された値が表示されます
何故 return 1;で1と表示されずに ちゃんと表示される理由をおしえてください
12デフォルトの名無しさん:2009/03/02(月) 11:33:12
>>11
なぜ、return 1で1と表示されるんだよw

printf("%d\n",fact(4));

4くらいならメモ取りながら動きを追っかけてみるよろし。
最初は i == 0 に入らないよね? だからどうなる? 次は?
13476:2009/03/02(月) 11:36:46
ちがいます
何故if(i==1)return 1;なんですか?
fact(4)で 4=i 1回目はiが4なので elseのreturn i*fact(4-1);ですよね
それで 2回目もiが3になるので return i*fact(3-1);
ってわかってるんですが

何故その値を返すとき return 1;なのか知りたいです
return かけた分; 
では無く 何故 return 1;なのか
main関数のように正常終了は return 1ときまってるんでしょうか?
14デフォルトの名無しさん:2009/03/02(月) 11:38:34
fact() の仕様だもの
1*2*3* ... n を計算するのに、そう記述してるだけ
15476:2009/03/02(月) 11:41:59
ん〜よくわかりません
return 2;とやると24の倍の数がでますし
return 1;の意味がよくわからないです
if(i==1)break;とかでもいいかとおもってましたが
できませんでした

return i*fact(i-1);をやってあるので int fact();にいってるとおもったんですが
最後のreturn 1; これだと1って表示されるかとおもいますが
詳しく教えてください
16デフォルトの名無しさん:2009/03/02(月) 11:48:18
fact(4)
 fact(3)
  fact(2)
   fact(1) 引数1なので1を返す
  返った1と2をかけて結果の2を返す
 返った2と3をかけて結果の6を返す
返った6と4をかけて結果の24を返す
17476:2009/03/02(月) 11:48:46
一度関数に制御が移ると局所変数は作成されますが、
その関数を出るまでその局所変数は保存されます。
他の関数で同名の変数が作成されても、保護されます。
その関数自信が直接間接的に再度呼び出されても
値は保護されなければなりません。
(つまり多くのコンパイラはバグってますね。)
18476:2009/03/02(月) 11:57:16
再帰むずかしいですね
もしかしてポインタより難しいです
再帰の書いてある場所が少なかったんですが、再帰っておぼえるとどんなとき役にたつんですか?
19デフォルトの名無しさん:2009/03/02(月) 12:02:32
すべてのC処理系で再帰が使える事は保証されてないので
20デフォルトの名無しさん:2009/03/02(月) 12:06:51
再帰がどうとかじゃなくて算数の問題だよ
21デフォルトの名無しさん:2009/03/02(月) 12:08:35
>>18
漸化式をそのまま書ける
22デフォルトの名無しさん:2009/03/02(月) 12:10:27
幼稚園児と大学生の会話だなw
23デフォルトの名無しさん:2009/03/02(月) 12:30:57
構文解析も再帰使ったほうが書きやすいかな?
24デフォルトの名無しさん:2009/03/02(月) 12:35:00
>>23
モノにもよるだろ
だが再帰で書きやすい文法にしないと誰も覚えちゃくれないという
ことは言えてる。
25デフォルトの名無しさん:2009/03/02(月) 12:37:19
Visual C++を使ってCで作成したコンソールアプリをビルドし、Visual C++がインストールされていないPCで実行するとエラーが出て使えません。
msdn等を調べましたが、専門用語が多く理解しかねました。
やはり、ランタイム等をインストールしないと使えないのでしょうか?
また、フリーウェア等で配布されているものでコンソールアプリのみで動く物をよく見かけますがどうすれば単体で動くのでしょうか?
きっかけだけでも教えていただければ、後は調べますのでよろしくお願いします。
26デフォルトの名無しさん:2009/03/02(月) 12:39:31
デバッグ用でビルドしてるんじゃね?
27デフォルトの名無しさん:2009/03/02(月) 12:42:05
>>24
逆だろw
LISPが覚えやすいと感じるお前のセンスは病気に近いと思う
28デフォルトの名無しさん:2009/03/02(月) 12:43:55
DUMPBIN.EXE >>25
29デフォルトの名無しさん:2009/03/02(月) 14:07:10
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
あなたのIPは139.256.43.192です
送信しました
30デフォルトの名無しさん:2009/03/02(月) 21:06:17
>>25です。
>>26
Releaseでビルドしていると思いますが、一応確認してみます。
>>28
そのアプリが使用しているDLLファイル等を調べる事ができるんですね。
色々と読んでみます。

お二方ありがとうございました。
31デフォルトの名無しさん:2009/03/02(月) 21:09:59
>>30
ランタイムライブラリの設定を静的リンク (/MT)にすればいい。
32デフォルトの名無しさん:2009/03/02(月) 21:43:34
>>27
構文解析を再帰でかけるかどうかの話なのに何でLISPが出てくるんだ
33デフォルトの名無しさん:2009/03/02(月) 21:51:30
>>25です。
>>31
ご指摘のとおり設定しビルドしたところファイルサイズに変化が表れました。
現在、もう一台のPCが使用中なので明日、実行してみます。
ありがとうございました。
34デフォルトの名無しさん:2009/03/02(月) 22:37:06
>>29
つまらん事すんな。
35デフォルトの名無しさん:2009/03/03(火) 05:23:05
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
36476:2009/03/03(火) 12:37:21
サブルーチンって関数って意味であってますか?

37デフォルトの名無しさん:2009/03/03(火) 12:45:11
あってたとしたらどうなの?
間違ってたとしたらどうなの?
38デフォルトの名無しさん:2009/03/03(火) 13:21:52
どうなるか聞いてどうなるの?
39476:2009/03/03(火) 13:37:25
どうなるかはどうでもいいので、あってるか教えてください
40デフォルトの名無しさん:2009/03/03(火) 13:40:23
      ハ,,ハ
     ( ゚ω゚ )  お断りします
    /    \   ハ,,ハ お断りします
  ((⊂  )   ノ\つ))( ゚ω゚ )
     (_⌒ヽ((⊂ノ   ヽつ ))
      ヽ ヘ }  (_⌒ヽ
 ε≡Ξ ノノ `J   ノノ `J
41デフォルトの名無しさん:2009/03/03(火) 13:45:17
>>36
閉じたサブルーチンとしてよく使われるのが関数
開いたサブルーチンとしてよく使われるのがマクロ
42デフォルトの名無しさん:2009/03/03(火) 13:49:32
>>36
関数は式であって、値を返す
サブルーチンは処理の単純にまとめたもので値を返さない、ので式の一部にはなれない

程度の認識だな
C言語の場合でいうと、復帰値voidの場合サブルーチン的とか
ただ、Cでは厳密な定義はないのでどちらにしろあいまい、普通に検索したほうがはやそう
43デフォルトの名無しさん:2009/03/03(火) 13:49:43
メインルーチンも関数だけどね
44デフォルトの名無しさん:2009/03/03(火) 14:12:20
サブルーチンも結果を出力するやん、しばしば関数と同じ方法で
45デフォルトの名無しさん:2009/03/03(火) 14:12:23
何度呼び出しても返す値が変わらないものをfunction
と呼ぶのが正しいかって問いのほうが重要な気がする。
言語のfuncitonとかねw
46デフォルトの名無しさん:2009/03/03(火) 14:21:37
関数とサブルーチンの定義は言語によって違い、
Cの場合は関数はあるけどサブルーチンは定義されてないという認識
47デフォルトの名無しさん:2009/03/03(火) 14:41:24
3つの構造体をtypedefしたいのです。
typedef struct a{
int i;
A *part_a;
B *part_b;
C *part_c;
}A;

typedef struct b{
long l;
A *part_a;
B *part_b;
C *part_c;
}B;
typedef struct c{
long long ll;
A *part_a;
B *part_b;
C *part_c;
}C;
コンパイルが通りません。
どうやればいいんでしょうか?教えてください。
48デフォルトの名無しさん:2009/03/03(火) 14:52:40
typedef された型名を使わずに書くだけ

typedef struct a{
int i;
struct a *part_a;
struct b *part_b;
struct c *part_c;
}A;

typedef struct b{
long l;
struct a *part_a;
struct b *part_b;
struct c *part_c;
}B;

typedef struct c{
long long ll;
struct a *part_a;
struct b *part_b;
struct c *part_c;
}C;

かただかポインタなので、その構造体の内部配置が確定している必要はない
# んだが、非ポインタで要素をもつ構造体の巡回参照は定義できたっけか?
49デフォルトの名無しさん:2009/03/03(火) 14:53:13
typedef struct A{
int i;
struct A *part_a;
struct B *part_b;
struct C *part_c;
}A;

typedef struct B{
long l;
struct A *part_a;
struct B *part_b;
struct C *part_c;
}B;
typedef struct C{
long long ll;
struct A *part_a;
struct B *part_b;
struct C *part_c;
}C;
50デフォルトの名無しさん:2009/03/03(火) 14:56:47
できるけど教えてやんない

C を C++ っぽく使いたがる奴は
C を Pascal っぽく使いたがる奴と同質

そんなガイキチ増えて欲しくない
51デフォルトの名無しさん:2009/03/03(火) 14:58:05
typedef struct a A;
typedef struct b B;
typedef struct c C;
struct a{
int i;
A *part_a;
B *part_b;
C *part_c;
};
struct b{
long l;
A *part_a;
B *part_b;
C *part_c;
};
struct c{
long long ll;
A *part_a;
B *part_b;
C *part_c;
};
52デフォルトの名無しさん:2009/03/03(火) 14:59:03
>>48,49
ありがとうございました。両方ともコンパイルが通りました。
53デフォルトの名無しさん:2009/03/03(火) 15:26:56
>>50
が出来るけど教えてあげないことって
>>48,49,51
とは違うよね。やっぱり
54デフォルトの名無しさん:2009/03/03(火) 15:27:05
>そんなガイキチ増えて欲しくない
そうだね、>50だけで充分だ。
55476:2009/03/03(火) 15:43:01
ありがとうございました
サブルーチンは値を返さない実行っておぼえます
void fu(int x)
{
printf("%d",x);
}
これがサブルーチンで値を返す
int fu(int x)
{
return x;
}
とてもわかりやすかったですありがとうございました
42さん

56デフォルトの名無しさん:2009/03/03(火) 15:56:09
サブルーチンはFORTRAN/BASIC用語
Cではサブルーチンという表現はしないほうが良い。
57476:2009/03/03(火) 16:05:08
これがサブルーチンで値を返すではなく
これが関数で値を返すの間違えでした

独習Cにサブルーチンという表現が書いてありました
58デフォルトの名無しさん:2009/03/03(火) 16:15:23
Cのmain()って一応関数だよな。
となるとCはサブルーチンのみから構成されるから
サブルーチンという言い方を敢えてするのはおかしいわけ。
59デフォルトの名無しさん:2009/03/03(火) 16:22:14
まだこいつに釣られているのか
ヒマなことだ
60デフォルトの名無しさん:2009/03/03(火) 17:20:27
Visual C++ standard edition academic
SDKで組んでいます.

long型の変数 xdim の値を文字列に変えて,
設定用ダイアログボックスの Edit Controll に
入れる事をしたいです.

以下のように組んでいますが上手くいきません.

long xdim = 12;
char *long2char(long num);

LRESULT CALLBACK SetDlgProc(HWND hDlgWnd, UINT msg, .... ) {
switch(msg) {
case WM_INITDIALOG:
SetDlgItemText(hDlgWnd, IDC_EDIT_X, (LPCSTR)long2char(xdim));
break;
...
}

char *long2char(long num) {
char str[256];

sprintf(str, "%ld\n", num);
return str;
}

文字化け?した文字列が Edit Controll に入力されます.
(LPCSTR)"12" とすると,文字列 12 が入力されます.
ltoa 関数なども調べましたが,sprintf の方が良いと書かれていたのでこちらで書いています.
どのように修正したらよろしいでしょうか?よろしくお願いします.
61デフォルトの名無しさん:2009/03/03(火) 17:21:05
62デフォルトの名無しさん:2009/03/03(火) 17:36:37
>>60
>char str[256];
>return str;
このstrはlong2char()から抜けた時点で消滅する。
メモリ割り当てるか、静的に確保 (long xdim = 12 の下とか) しないと。
63デフォルトの名無しさん:2009/03/03(火) 17:43:53
バッファ自分でとって long2char に引数で渡瀬
64デフォルトの名無しさん:2009/03/03(火) 18:02:49
>>476
サブルーチンは何度も利用する複数の処理をまとめておいたもの
関数は値を与えて処理して値を返すもの

Cは全部関数と呼び、Perlは全部サブルーチン(または関数)と呼ぶ
VBは値を返すものが関数プロシージャ、返さないものをサブプロシージャ
HSPは値を返すものは関数、返さないものは命令、gosub+ラベルで呼び出すものは
サブルーチンというように使い分けている
65デフォルトの名無しさん:2009/03/03(火) 18:04:30
>>64
何処の誤爆だよ?
って言うか、用語ぐらいちゃんと調べろよ
66デフォルトの名無しさん:2009/03/03(火) 18:08:29
>>65
476と名乗っているコテが張り付いているんだよ。用語が滅茶苦茶なのには同意。
67デフォルトの名無しさん:2009/03/03(火) 18:31:19
結局476とやらは
「学びて思わざれば則ち罔し」
を地でいってるんだな
68デフォルトの名無しさん:2009/03/03(火) 18:32:25
>>66
ああ、まだいるのか。
NGNAMEにしてるから気づかなかった。
6960:2009/03/03(火) 20:38:23
>>62-63
ありがとうございます.
実現できました.
まだまだ勉強が足りないようです.
7064:2009/03/03(火) 21:56:44
一応、情報処理用語辞典で調べて書いたんだが解釈が間違っているみたいだな
あと476にもかまっちゃいけないルールなのね
いろいろすまん
71デフォルトの名無しさん:2009/03/03(火) 22:24:15
>>25です。
>>31さん
遅くなりましたが、本日試してみたところ無事実行されました。
ありがとうございました。
また、>>26さん、>>28さんもアドバイスありがとうございました。
72デフォルトの名無しさん:2009/03/04(水) 00:58:34
>>70
ルールってことはないだろ。
ただ、オレは見たくないから見ないだけ。
73デフォルトの名無しさん:2009/03/04(水) 11:24:30
はじめてのC
独習C
C言語入門(ビギナー編)
などいろいろありますが
どの本がお勧めですか?(上記3つ以外でも結構です)
74デフォルトの名無しさん:2009/03/04(水) 11:27:23
>>73
スレ違い
消えろ
75デフォルトの名無しさん:2009/03/04(水) 11:41:06
べつにスレ違いじゃねえだろうw

オライリーのC++実践プログラミング。
C++って書いてあるけど、前半はCについて書いてる。
プログラミング上の作法なども書いてくれていて役立つ。

C++ならC++ プライマー。
詳細に綿密に系統立てて網羅してある。
あいまいだったり説明不足だったりは無く、
とても心強い。高いけど。
76デフォルトの名無しさん:2009/03/04(水) 12:39:06
>>75
てめーもスレ違いだっつうの
77デフォルトの名無しさん:2009/03/04(水) 13:02:02
推薦図書/必読書のためのスレッド 45
http://pc11.2ch.net/test/read.cgi/tech/1234494641/
読んだ書籍の感想・紹介
http://pc11.2ch.net/test/read.cgi/tech/1064681919/
78デフォルトの名無しさん:2009/03/04(水) 14:46:03
Cに関係ないことないだろうww
79デフォルトの名無しさん:2009/03/04(水) 19:49:16
入門者に薦めたくないC言語関係の本ってある?
80デフォルトの名無しさん:2009/03/04(水) 20:34:36
>>79
上級者が読むような本
81デフォルトの名無しさん:2009/03/04(水) 20:37:16
ってどんな本?
82デフォルトの名無しさん:2009/03/04(水) 22:32:42
K&R
83デフォルトの名無しさん:2009/03/04(水) 23:13:39
K&R読めたら上級者
84デフォルトの名無しさん:2009/03/04(水) 23:14:12
ってか?
85デフォルトの名無しさん:2009/03/05(木) 00:27:16
25年前のC初心者は全員K&Rで始めたわけだが。
86デフォルトの名無しさん:2009/03/05(木) 00:57:36
翻訳者の石田晴久氏はK&Rでいくらもうけたのだろう?
87デフォルトの名無しさん:2009/03/05(木) 01:20:14
>>85
で、9割が脱落したと。
88デフォルトの名無しさん:2009/03/05(木) 01:28:10
VC++2005を使っています。ファイルオープンダイアログを用いて
ファイルパスを取得したいのですが、拡張子の指定が上手くいきません。

void GetFilePath( ..., char *ext) { // GetFilePath(..., "txt"); として使用しています
OPENFILENAME ofn;
char szFile[MAX_PATH] = "";
char strExt[64];

if (!strcmp(ext, "txt")) {
wsprintf(strExt, "Text file(*.%s)\0.%s\0All files(*.*)\0*.*\0\0", ext, ext);
}

ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(OPENFILENAME);
//ofn.lpstrFilter = "Text file(*.txt)\0.txt\0All files(*.*)\0*.*\0\0";
ofn.lpstrFilter = strExt;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrDefExt = ext;
ofn.Flags = OFN_FILEMUSTEXIST;

GetOpenFileName(&ofn);

上手くいかない点1:
ファイルオープンダイアログでのファイル選択時に Text file(*.txt) しか項目に表示されません。
コメントアウトした方の書き方なら、 All file(*.*) も表示されます。

上手くいかない点2:
Text file(*.txt) のばあいでも、拡張子が .txt のファイルが表示されません。
All file(*.*) なら、全てのファイルが問題なく表示されます。

どこに問題があるのでしょうか?よろしくおねがいします。
89デフォルトの名無しさん:2009/03/05(木) 01:41:48
wsprintfに渡した定数が \0 で文字列終了と認識されてる
\0 入りの文字列は標準Cライブラリでは処理できない
90デフォルトの名無しさん:2009/03/05(木) 01:43:28
ということを本当にチェックするのはどうればいいのか?
91デフォルトの名無しさん:2009/03/05(木) 01:45:10
|で区切るんじゃないの?
92デフォルトの名無しさん:2009/03/05(木) 01:45:29
>>87
25年前はC言語が日本に紹介されてすぐということで、
読者はプログラミング言語初心者でなくて、
他の言語を経験したC言語初心者が多かったはずだから
脱落者は少なかったのでは。

COBOLやOFRTRANからCは敷居が高かったけど
PL/Mとかシステム記述用言語からCはさくっといけたのでは
93デフォルトの名無しさん:2009/03/05(木) 01:48:55
>>90
wsprintf(strExt, "Text file(*.%s)\0.%s\0All files(*.*)\0*.*\0\0", ext, ext)
wprintf("%s",strext);
while(*strext++);
wprintf("%s",strext);
while(*strext++);
wprintf("%s",strext);
while(*strext++);
とでもして、本当に編集されているかどうかデバッグ出力してチェックする。
IDE開発している人ならstrextをデバッガでトレースして前後で変化がちゃんと起こってるか
確かめてから質問するだろな
9488:2009/03/05(木) 02:10:29
>>89
ありがとうございました。
別の方法を考える事にします。

一応ですが、>>90さんとは別人ですので。
95デフォルトの名無しさん:2009/03/05(木) 02:10:44
25年前のC初心者
と現代のC初心者
は、基本的な質が違う。
96デフォルトの名無しさん:2009/03/05(木) 02:13:41
>>95
どのように?
97デフォルトの名無しさん:2009/03/05(木) 02:16:56
ところで前の話掘り下げて盛って埋め直すけど
みんなが言ってた一週間は換算すると何時間なのだろう。
9888:2009/03/05(木) 02:18:56
すみません、>>88の「上手くいかない点2」も
よろしくお願いします。

拡張子が txt のファイルは確かにあるのですが、
ファイル選択フィールドは真っ白で
ファイルが1つも表示されません。
99デフォルトの名無しさん:2009/03/05(木) 02:28:10
>>98
.txt => *.txt とかじゃないの

ちなみに元の処理でよくあるやり方は、例えば>>91が書いてるみたいな '|' などの文字を
\0 の代わりに置いて sprintf などで整形したあとで '|' を '\0' に置換したりするとか
100デフォルトの名無しさん:2009/03/05(木) 02:34:40
>>99
ありがとうございます。
* を入力し忘れていたようです。

>>91さんの書いている事はそういう事でしたか。
試してみます。ありがとうございました。
101デフォルトの名無しさん:2009/03/05(木) 03:40:45
VC++2005でstrcpyを使うと警告が出ます。
代替関数としてstrcpy_sが用意されていますが、
返り値が(char *)である関数を使いたいのです。
何かあるでしょうか?
102デフォルトの名無しさん:2009/03/05(木) 03:45:04
>>101
2行に分けて書くか、strcpyを使うか。
103デフォルトの名無しさん:2009/03/05(木) 03:47:12
自分でつくるか
104デフォルトの名無しさん:2009/03/05(木) 04:12:13
>>101
lstrcpyn
105デフォルトの名無しさん:2009/03/05(木) 06:38:54
>>101
通常、strcpy()の戻り値を何かに利用するのは可読性を落とす原因になる。
この手の引き数をそのままスルーして返すタイプの関数全般に言えることではあるが。
それとstrcpy_s()は標準ではないから、警告をオプションで抑制するなどしてstrcpy()を使う方が一般的だろう。
106デフォルトの名無しさん:2009/03/05(木) 08:50:01
strlcpy はまだ標準じゃないんだっけ?
107デフォルトの名無しさん:2009/03/05(木) 10:46:05
size_tやんけ
108>>95 じゃないが:2009/03/05(木) 12:40:43
>>96
「パソコンとはBASIC {が使える | しか使えない} もの」
という時代にCをやろうなんて考える奴は
プログラミング経験者でかつそういうのが好きな物好きしかいない。
109デフォルトの名無しさん:2009/03/05(木) 12:45:58
マシン語つかってただろ
110デフォルトの名無しさん:2009/03/05(木) 12:49:16
コンパイラとか個人で趣味で買える様な代物じゃなかったしね
無料でコンパイラが使えるとか当時考えもしなかった
BASICかレポート用紙のアセンブラしかなかった
111デフォルトの名無しさん:2009/03/05(木) 12:53:09
ハンドアセンブルですね? 相対ジャンプを手計算しなければいけないという…
112デフォルトの名無しさん:2009/03/05(木) 14:41:22
>>97
埋めなおしてどうすんだよww
113デフォルトの名無しさん:2009/03/05(木) 14:54:39
>>97
8時間x5日=40時間?
114デフォルトの名無しさん:2009/03/05(木) 15:47:50
tp://www.pro.or.jp/~fuji/mybooks/cdiag/index.html#mokuji
ここで言われてることって今でも信頼出来る?
115デフォルトの名無しさん:2009/03/05(木) 15:57:58
>>114
スレ違い
死ね
116デフォルトの名無しさん:2009/03/05(木) 16:00:26
スレ違いじゃねえだろうよw

>>114
別に間違ったことは書いてなかったはず。
今ではもっといい方法があるかもしれないけど、
何がマズイか、は今も昔も同じだと思われ。
117デフォルトの名無しさん:2009/03/05(木) 16:02:18
おまえらって
C++に移行できなかった落ちこぼれだろ
今更Cで何してんだよ教えろよ
118デフォルトの名無しさん:2009/03/05(木) 16:46:38
今更C++に移行ってw
117はC++で何やってるの?
119デフォルトの名無しさん:2009/03/05(木) 17:45:53
今時Cを教えている大学って……
120デフォルトの名無しさん:2009/03/05(木) 17:49:54
いまどきはJavaだよな!
121デフォルトの名無しさん:2009/03/05(木) 18:14:09
goto でやってはいけないケースをスコープ外からスコープ内へのジャンプ以外にあれば教えてください
122デフォルトの名無しさん:2009/03/05(木) 18:14:19
>>117
最近C++に移行できた「つもり」になっているんですね。
分かります。
123デフォルトの名無しさん:2009/03/05(木) 18:36:24
>>117
ええ。C++を使わせてもらえるなら是非とも使いたいですよ。
124デフォルトの名無しさん:2009/03/05(木) 19:47:12
>>121
そもgoto自体使用厳禁なわけだが
125デフォルトの名無しさん:2009/03/05(木) 19:54:21
>>124
ラベルつきbreakとかないんだから、gotoは使う場合あるだろ。
126デフォルトの名無しさん:2009/03/05(木) 20:00:22
>>125
ねーよ
繰り返しで十二分に表現可能だしそもgoto自体ソース初見の際把握しにくいんだから使うべきではない
127デフォルトの名無しさん:2009/03/05(木) 20:03:22
それは理想だけど、
多重breakとか例外とかない、制御構造が貧弱なCでは無理だろ。
分かりづらさはコメントで補うとして。
128デフォルトの名無しさん:2009/03/05(木) 20:07:26
普通配列に添字演算子使うときって
配列の参照はその型の先頭オブジェクトへのポインタに成り下がるから
それに添字分加算してその参照を取るから要素(オブジェクト)の参照になるんだよな。。。
とか頭で考えて(意識して)ますか?
ときどきもっと簡単そうに考えてしまいそうで怖いんですが。
129デフォルトの名無しさん:2009/03/05(木) 20:08:52
17.10:
gotoは悪で絶対に使ってはならないという人がいる。ちょっとこれは行き過ぎではないか。

A:
プログラミングの作法は文章作法と同じで、ちょっとした技能でガチガチの規則で明文化することはできない。
ただし書き方についての議論はもっぱらそういう規則を中心に回るようである。
goto文については、gotoを好き勝手に使うとすぐに
スパゲッティのようにもつれた保守不能なコードになると昔からいわれている。
しかし、何も考えずに単にgoto文を使うことを禁止しても
すぐに美しいプログラミングに結び付くとは限らない。
体系立てて考えないプログラマーならgoto文をまったく使わなくても
同じように複雑怪奇にもつれたコードを書いてしまう
(たぶん代わりに妙に入れ子になったループやブール値の制御変数を使って)。

プログラムの書き方に関するたいていの意見や"規則"は規則としてよりは指針として考えたほうがうまくいく。
プログラマーが、この指針で何を成し遂げたいのか理解すればもっとうまくいく。
ある種の構文を無闇に敬遠したり、理解することなく規則に従うことは、
規則を使えば避けられることになっているのと同じくらい多くの問題を引き起こす可能性がある。

さらに、プログラムの書き方に関する見解は所詮見解にすぎない。
"書き方論争(style wars)"に引きずり込まれても、たいてい何も産み出さない。
一部の論点(質問9.2, 5.3, 5.9, 10.7で挙げたような)については
お互い相手の意見を認めたり、意見が違うことを認めたり、議論を打ち切ったりすることはないように見える。
130デフォルトの名無しさん:2009/03/05(木) 20:11:05
>>128
意識はしないよ
必要なのは蛇口をひねるとどうして水が出るのかを理解していることで、
蛇口をひねるたびにああこの水は水道管から圧力で押し出されてるんだなと考えることじゃない
131デフォルトの名無しさん:2009/03/05(木) 20:12:47
そうですか
ちょっと安心しました。
132デフォルトの名無しさん:2009/03/05(木) 20:14:49
まあ厳禁て訳でも無いけど、goto無しであらゆるプログラムが作れるんだから、
ここで聞くようなレベルなら、使わないほうがいいな。例外はgotoより難しいから
使わない方がいいよ。プログラマの上澄みだけ集めるgoogleでさえ、例外禁止してるじゃん

C++は昔より難易度下がった。20年前は一つの基底クラスから全部継承して作れって奴が、
いたもんな。
133デフォルトの名無しさん:2009/03/05(木) 20:19:24
goto避けるために無駄に同じエラー処理を複数書いたりエラーフラグをつけるより
gotoでエラーラベルに飛んだほうがわかりやすい時もある

134デフォルトの名無しさん:2009/03/05(木) 20:29:03
ほとんど無いけどね。
135デフォルトの名無しさん:2009/03/05(木) 20:29:22
>>132
Googleは例外が難しいから禁止しているわけではないだろ。
現に禁止なのはC++だけで、ほかの言語ではそんな決まりないはず。
136デフォルトの名無しさん:2009/03/05(木) 20:30:03
エラー検知→早々に エラーコードつけてreturn 上位の呼び出し側に○投げ
エラー検知→フラグ立てて→後で一括後始末エラー処理
エラー検知→goto で後始末へジャンプ→一括後始末エラー処理
137デフォルトの名無しさん:2009/03/05(木) 20:48:13
フラグの乱用もプログラム破綻の原因とされてるね。
138デフォルトの名無しさん:2009/03/05(木) 20:50:43
>>135
スレチだから短く書いたが、EHを使うことで発生する問題を回避する為に
googleでは禁止している。簡単に言えば難しいから。objective-c(c++)でも推奨してない。
139デフォルトの名無しさん:2009/03/05(木) 20:52:49
カーネルとかはgoto必須だけどな
140デフォルトの名無しさん:2009/03/05(木) 20:57:12
>>138
そういうことか。例外処理の概念を人間が理解することが難しいと言っているのかと思った。
141デフォルトの名無しさん:2009/03/05(木) 20:59:12
gotoが多いコードの信頼性が無いことが往々にしてあることは
良く知られているが、gotoなくすとフラグを使いたくなる。
フラグはその数が増えるとたちまち扱いが難しくなる。
フラグ多用なコードの信頼性も決して高くはない。
142デフォルトの名無しさん:2009/03/05(木) 20:59:49
>>138
>EHを使うことで発生する問題
例外ハンドラ内でさらに例外を投げてしまう可能性のある記述 とか?
143デフォルトの名無しさん:2009/03/05(木) 21:00:36
判っててヤル愉快犯が最狂な世界なら非推奨で片付く問題が
判らない理解しないDQNが呼びもしないのに混ざってくるから
「禁止」とか極端な話になるんだよ
144デフォルトの名無しさん:2009/03/05(木) 21:07:37
>>136
関数内でmallocやfopenしてたら呼び出し側に丸投げできないとかある
free、fcloseしてreturnを複数書くより最後にまとめておいたほうがいいと思うんだけどね
自分がgoto使うのはこの処理だけ
145デフォルトの名無しさん:2009/03/05(木) 21:11:18
>>144
malloc / free や fopen /fclose のペアを呼び出し元に追い出す
ってのは無し?

ま、malloc/free はテンポラリ的な使い方もあるので、気持ちは十分jわかるw
146デフォルトの名無しさん:2009/03/05(木) 21:31:56
変なのがいる

プログラミングやるぞ
http://takeshima.2ch.net/test/read.cgi/news4vip/1236254314/
147デフォルトの名無しさん:2009/03/05(木) 22:02:54
いちいち貼るなよ
ガキかてめーは
148デフォルトの名無しさん:2009/03/06(金) 00:01:36
scanf("%d",&u[i]);
と数字をうけるんですが
文字をいれるとクラッシュしてしまうんですが
対策はないですか?
149デフォルトの名無しさん:2009/03/06(金) 00:04:01
>>148
ある意味ない
150デフォルトの名無しさん:2009/03/06(金) 00:10:28
fgetsしてsscanfしろ
151デフォルトの名無しさん:2009/03/06(金) 02:38:35
enum型の変数にはそのenum定義の定数以外代入できないとあるのですが、
なぜかコンパイルが通ってしまうんですが何かおかしいのでしょうか?(環境はVC2005)
ご教授尾長いします。

#include <stdio.h>

typedef enum _E_TYPE {
  TYPE_A = 10U,
  TYPE_B = 20U,
  TYPE_C = 30U,
} E_TYPE;

void main( void )
{
  E_TYPE A;
  A = 1000U;      ★ここでエラーになると思っています。
}
152デフォルトの名無しさん:2009/03/06(金) 02:41:06
んなこともわかんねーのにプログラムなんてやんじゃねーよ
153デフォルトの名無しさん:2009/03/06(金) 02:45:09
>>151
コンパイラ依存らしい。
154151:2009/03/06(金) 03:05:46
>>153
ありがとうございます。

一応 VC2005、Eclipse(gcc)、H8系?(High-performance Embedded Workshop)でもやってみたんですが結果は同じでした。
ガードしたいんですが、こうなるとenumの意味があまりないような...
155デフォルトの名無しさん:2009/03/06(金) 03:10:39
VC2005はC++なら一応コンパイルエラーになるけどな
(ただしキャストすれば代入可能)
156デフォルトの名無しさん:2009/03/06(金) 03:11:07
enumの目的は定数をシンボル化することと別種のシンボルを混同しないようにすることであって
ある変数の値の取る範囲を制限することじゃない
要するに、そもそもenumにナマ値を入れるようなコードを書くな
157デフォルトの名無しさん:2009/03/06(金) 03:11:56
C++とCでは挙動が違うのでは?
158デフォルトの名無しさん:2009/03/06(金) 03:32:03
Cなら、たしかenumに任意の整数型を代入や初期化などしても、エラーが出ないが、
ただ、列挙体の定義時に書いてない値でそれをやって上手くいく保証はないはず。
現実的には、例えばE_TYPEの大きさが1バイトになって
1000が入らないなんてことが考えられる。
159デフォルトの名無しさん:2009/03/06(金) 03:33:59
enumはintだろ、jk
160121:2009/03/06(金) 03:34:44
すいません
作法的な話じゃなくて
やると未定義だとか未規定だとかになる例がほかにないか知りたかったんです
goto 禁止とかでぐぐっても、作法の話しかでてこなかったので

なんか宣言に関することであった気がするんですが思い出せないんです
161デフォルトの名無しさん:2009/03/06(金) 04:44:18
空class経由でenumをクラインの壺みたいにして使う タイプセーフ enum があるけど
そこまでするならカンマ式かなんかでassertを仕掛けた方が気が楽な様に思う。
162デフォルトの名無しさん:2009/03/06(金) 06:48:01
> goto 禁止とかでぐぐっても、作法の話しかでてこなかったので

www
163デフォルトの名無しさん:2009/03/06(金) 07:45:38
本文無しは甘え
164デフォルトの名無しさん:2009/03/06(金) 16:11:32
ポインタがNULLじゃないっていうときは
if(p)で十分っていうけどif(p != NULL)のほうが親切じゃないですか?
最適化されて同じになるなら後者のほうが優れてますよね?
165デフォルトの名無しさん:2009/03/06(金) 16:20:27
優れてません。それはただのオナニーです。簡素化出来るに越したことは無いのだからイチイチ余計なもの付け足すなよ
おめーみたいな自称「おれって気配り出来るヤツだなあ」なクズが増えているからいけない
166デフォルトの名無しさん:2009/03/06(金) 16:28:14
気配りありがとうございます
167デフォルトの名無しさん:2009/03/06(金) 16:31:59
168デフォルトの名無しさん:2009/03/06(金) 16:32:47
>>165がオナニーだろ
仕事でコード書くなら>>164にすべき
仕事で>>165みたいに言うやつがいたら普通に殴りたくなる
169デフォルトの名無しさん:2009/03/06(金) 16:37:14
可読性を重視するか簡潔さを重視するかのスタンスの違いであって
どちらが優れているとかどちらを使うべきとかいう問題ではない
強いて言えばプロジェクトグループ内でどちらを選ぶかの合意がありさえすればいい
170デフォルトの名無しさん:2009/03/06(金) 16:59:07
if(p != NULL)は無いわ。

俺も最初の数ヶ月くらいはやってた覚えあるけど、
今となっては冗長以外の何者でもないw
ポインタがNULLかどうかなんて結局、
山のようにチェックせにゃならんのだから。
171デフォルトの名無しさん:2009/03/06(金) 17:24:27
ヌルポチェックをアチコチに記述しなきゃいけない設計技量を
鍛えなおすべきだな。
172デフォルトの名無しさん:2009/03/06(金) 17:32:34
>>171
おまえはプログラマに向いてない
173デフォルトの名無しさん:2009/03/06(金) 17:33:09
スタイル議論はよそでやってください
174デフォルトの名無しさん:2009/03/06(金) 17:41:45
議論になってない、ただの罵り合いだ
175デフォルトの名無しさん:2009/03/06(金) 17:43:38
なんか抽象クラスをインスタンス化できないらしいのですがどうすればいいですか?
派生クラスは無いのですが
176デフォルトの名無しさん:2009/03/06(金) 17:45:30
>>175
????
釣り?
抽象クラスがインスタンス化出来ないのは、設計上当たり前だろ?
177デフォルトの名無しさん:2009/03/06(金) 17:46:13
>>175
まずは落ち着いてスレタイ嫁w
178デフォルトの名無しさん:2009/03/06(金) 17:50:19
その派生クラスの無い抽象クラスが型な引数をとる関数を使いたいのですが初期化?の方法がわかりません
179デフォルトの名無しさん:2009/03/06(金) 18:02:05
>>178
引数に抽象クラスが使われるのは、その抽象クラスの派生クラスなら
何でも使えるということを明示する意味だヨ
抽象クラスじゃなかったら、その派生クラスを引数に与えても
コンパイルは通っても実行時にクラッシュする可能性すらある。
180デフォルトの名無しさん:2009/03/06(金) 19:04:23
スレチの相手をする奴はスレチと同罪と、イギリスの元首相が言ってた
181デフォルトの名無しさん:2009/03/06(金) 19:47:29
>>178
【初心者歓迎】C/C++室 Ver.64【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1234193151/l50
182デフォルトの名無しさん:2009/03/06(金) 20:00:59
>>180
スレチでも答えてあげるのが優しさだと勘違いしてるのかもな
183デフォルトの名無しさん:2009/03/06(金) 20:08:57
>>183
スレチと突っぱねるのがカコイイと思ってるんだろな
184デフォルトの名無しさん:2009/03/06(金) 20:12:58
w
185デフォルトの名無しさん:2009/03/06(金) 20:53:57
>>183
おまえの人生と同じでつまらん
186デフォルトの名無しさん:2009/03/06(金) 22:19:04
C言語で ポインタって どういうメリットがあるのでしょうか?
187デフォルトの名無しさん:2009/03/06(金) 22:23:10
必要性を感じない人には「ない」
188デフォルトの名無しさん:2009/03/06(金) 22:26:44
どんなCプログラムでもポインタを一切使わずに(ライブラリ関数は
ラッパーを使う)書き直すことが出来るでしょうか?
189デフォルトの名無しさん:2009/03/06(金) 22:29:40
ポインタを一切使わないとputs()さえ使えないので、役に立つようなプログラムは殆ど書けません。
190デフォルトの名無しさん:2009/03/06(金) 22:30:37
できない。
ポインタを使わないというのは関数を呼べないというのと同義で、
つまりライブラリ関数すら呼べないしAPIも勿論使えない。
入力にも出力にもアクセスすることができない。
191デフォルトの名無しさん:2009/03/06(金) 22:36:50
C言語では配列をなるべく使わずポインタに統一して扱うほうが
良いのでしょうか?
192デフォルトの名無しさん:2009/03/06(金) 22:37:01
@Initialize {
CutIn(YOUMU, name, "", 0, 0, 0, 0);
SetLife(250000);
SetTimer(60);
SetScore(4000000);
LoadGraphic(imgBoss);
SetTexture(imgBoss);

TMain;
}

@MainLoop {
SetCollisionA(GetX, GetY, 32);
SetCollisionB(GetX, GetY, 16);

yield;
}

@DrawLoop {
DrawGraphic(GetX, GetY);
}

@Finalize {
DeleteGraphic(imgBoss);
}

// メインタスク
task TMain {
CreateShot01(GetX, GetY-150, 3, 90, AQUA32, 0);
yield;
setGraphicStop;
}
193デフォルトの名無しさん:2009/03/06(金) 22:39:03
>>191
初心者はとかくポインタを使いたがるけど、
配列の方がわかりやすい箇所は配列を使うべき
194デフォルトの名無しさん:2009/03/06(金) 22:41:13
東方弾幕風をやってるんですが、
↑のプログラムで

TMAINに飛ぶ → 括弧内の処理を終える → yieldに飛ぶ

となるのか。
TMAINに飛ぶ → 処理の途中でyieldに飛ぶ → MainLoop内の処理をする → Tmainの中のyieldの下からまた処理をする

となるのか、よくわかりません
どっちですか?
195デフォルトの名無しさん:2009/03/06(金) 22:43:40
スレタイよめ、アホが
196デフォルトの名無しさん:2009/03/06(金) 22:45:44
これってCじゃないんですかね?
197デフォルトの名無しさん:2009/03/06(金) 22:57:37
>>191
おそらく、おまえさんの言っている「配列」のほとんどがポインタだよ
198デフォルトの名無しさん:2009/03/07(土) 00:15:56
short型(16bit)のポインタをint型(32bit)のポインタに代入すると、場合によっては32bitで表すキリの良い値に丸め込まれるって本当でしょうか?
これまでは特に気にしていなかったんですが、CPUのアーキテクチャによる?
199デフォルトの名無しさん:2009/03/07(土) 00:17:09
下のコードで、コメントアウトした部分もその下の部分と同じ表示をしてくれると思っていたんですが、コメントアウトしたやつだと「timer2=0」と表示されてしまいます。これはコードが間違ってるんですか??
ちなみに私の環境はVC++2008、vistaです。(↓のコードはCです。include文は改行が多いと怒られたんで省略してます。)
void main()
{
int i = 1;
time_t t1, t2;
time(&t1); // t1に、表示前の秒数を格納
/* 適当に時間経過させる */
time(&t2); // t2に、表示後の秒数を格納
// printf("\ntime1=%ld time2=%ld\n",t1,t1);
printf("\ntime1=%ld ",t1);
printf("time2=%ld\n",t2);
printf("かかった時間は、%d秒です。\n", t2 - t1);
return;
}
200デフォルトの名無しさん:2009/03/07(土) 00:20:50
環境依存かもしれないけどcintという処理系っていい?
201デフォルトの名無しさん:2009/03/07(土) 00:21:23
>>198
バス関係でのアライメントの話をしているのか
near far huge ポインタの話をしているのか
どっち?
202デフォルトの名無しさん:2009/03/07(土) 00:27:42
>>199
%ldが何型へのポインタを要求しているか考え直すこと
203198:2009/03/07(土) 00:39:56
アライメントです。
そういえば、構造体のメンバーが意図的に4Byte単位でパディングされていたような気がします。
204デフォルトの名無しさん:2009/03/07(土) 00:42:04
>>199です。

>>202
time_tはunsigned long型なんで、%ldじゃないんですか?
これ自体は
ttp://www.kumei.ne.jp/c_lang/intro/no_13.htm
を写しているんですが。。。

あと、
printf("\ntime1=%ld time2=%ld\n",t1,t1);

printf("\ntime1=%ld time2=%ld\n",t1,t2);
の間違いです。すいません。
205デフォルトの名無しさん:2009/03/07(土) 00:45:13
>>202
×何型へのポインタ
○何型

Vistaのtime_tって本当にlongで32ビットか?
206デフォルトの名無しさん:2009/03/07(土) 00:54:03
time_tって普通signedじゃないのか?
あとvistaのtime_tは64ビットだったような
207デフォルトの名無しさん:2009/03/07(土) 00:58:06
time_tはCライブラリなのでOSでなくVCのバージョンによるね
VC2005から変更されてるはず
>_USE_32BIT_TIME_T が定義されている場合、time_t は長整数になります。定義されていない場合は、64 ビット整数になります。

%ld => %lld に直すのかな
208デフォルトの名無しさん:2009/03/07(土) 01:00:26
>>199

printf("\ntime1=%ld time2=%ld\n",t1,t2);

printf("\ntime1=%ld ",t1);
printf("time2=%ld\n",t2);
とでt2の表示値が違う。ということだよね。

下の表示ではtime2はそれらしい値が表示されるが、上の表示ではtime2=0となる。

printfの問題だろう。もう一度確認してみ。
209デフォルトの名無しさん:2009/03/07(土) 01:01:19
まあ何にせよ、ライブラリ定義型が何か特定のものであると
決めてかかってはいけないってこった
210デフォルトの名無しさん:2009/03/07(土) 01:03:35
time_tが64ビットだとすると
printf("\ntime1=%ld time2=%ld\n",t1,t2);
のtime2はt1の上位32ビット(=0)が表示されてしまう
ということか。
211デフォルトの名無しさん:2009/03/07(土) 01:04:08
time_t同士を引き算するのも厳密には保証されないんじゃなかったっけ?
212デフォルトの名無しさん:2009/03/07(土) 01:05:07
2027年より後を考えるのなら、こうするのが無難か。
printf("%lld\n", (long long) t1);
そうでないならこれでも事が足りる。
printf("%d\n", (int) t1);
213デフォルトの名無しさん:2009/03/07(土) 01:07:21
>>211
標準関数にdifftime()がある。こいつは戻り値がdoubleだ。つまり、こうなる。
printf("%g\n", difftime(t2, t1));
214デフォルトの名無しさん:2009/03/07(土) 01:08:10
猫はWinAPI32使いであって厳密にはC使いではないので
それ以外の環境では特に鵜呑みにしてはいけない
215198:2009/03/07(土) 01:10:39
アライメントをヒントに検索したら書いてありました。(使っているのはARMなので多分これです)
ポインタで検索していたので見つかりませんでした。
解決しました。ペコリ

http://www.yokogawa-digital.com/arm/support/faq/index.php?RDS-F-08

※一部抜粋
◆アライメントされていないポインタ◆

コンパイラがより効果的なコード展開を行うために、
ARMコンパイラは通常の'C'のポインタがメモリ中でアライメントされたワードをポイントしていると想定します。

例えば、もしポインタ'int *'が1ワードの読み出しを行うとき、ARMコンパイラは命令生成時にLDR命令を使用します。
アドレスが4の倍数(つまり、ワードバウンダリ)であるとき、これは期待通りに動作します。
しかしながらもしアドレスが4の倍数でない場合、LDRは通常のアライメントされていないワードのロードイメージではなく、ローテートされた結果を返します。
実際のローテートされた結果はシステムのオフセットとエンディアンに依存します。

例えば、ポインタのロード開始アドレスが 0x8006の場合、0x8006, 0x8007, 0x8008, 0x8009の中身が結果として期待されることが予想されます。
しかし、ARMにおいてはこのようなアクセスは 0x8004, 0x8005, 0x8006, 0x8007の内容をローテートさせた結果をロードします。


(怖いっス)
216199:2009/03/07(土) 01:12:36
>>205-207
本に書いてあったんでlongだとばかり思ってました。
sizeof関数とtime.hで調べたらunsignedの64bitでした。すいません。
そして64bit整数のときの表示の仕方もわからなかったんですごく助かりました。ありがとうございます!
217デフォルトの名無しさん:2009/03/07(土) 01:18:03
>>216
>212-213辺りにも注目。

>>215
int *へのshort *の代入についての問題では、バスエラーを起こす場合もあるので要注意。
要は、そんな代入はするなと言うことで。
218デフォルトの名無しさん:2009/03/07(土) 01:23:49
>>211
そのとおり
time_tは規格上は算術型(整数型とは限らない)と定義されているけど
time_t同士を直接演算した結果が時間表現として意味のあるものである保証はない

>>216
本当にunsigned?エラー値とかどーすんだろー
219デフォルトの名無しさん:2009/03/07(土) 01:26:21
-1をキャストして符号なし64ビットの最大値だろjk
220デフォルトの名無しさん:2009/03/07(土) 01:26:36
sizeofは関数ではない
221デフォルトの名無しさん:2009/03/07(土) 01:31:51
>>219
いちいちキャストつけなきゃならないのは面倒くさいがまあ規格に従うなら仕方ないか
222デフォルトの名無しさん:2009/03/07(土) 01:34:26
符号なしなら%lluにしなきゃならんな(まだ問題起きないだろうけど)
223199:2009/03/07(土) 02:19:11
質問ばかりですいません・・・。
fprintf(fp, "%s", '\n');
と書くべきところを
fprintf(fp, "&s", '\n');
とかいて実行してしまいました。
それに気づいて変更してもう一度実行してみたのですが、
エラーが出てしまいファイル書き込みが行えなくなってしまいました。
結構致命的なことをやってしまったんでしょうか?
Cはなにかと破壊してそうなイメージがあるんで怖いんですが。。。
わかる方お願いします。
224デフォルトの名無しさん:2009/03/07(土) 02:23:28
>>223
そのfprintf(fp, "&s", '\n')は問題のないコードだ。
寧ろ、fprintf(fp, "%s", '\n')は大問題だが。
225デフォルトの名無しさん:2009/03/07(土) 02:24:19
だからprintf書式指定子の意味くらいちゃんと調べろよ
226デフォルトの名無しさん:2009/03/07(土) 02:32:40
fprintfならまだいいが、コーディングは気を付けて行わないとそのうちディレクトリ配下のファイルを根こそぎヤってしまうぞ。
227デフォルトの名無しさん:2009/03/07(土) 02:36:52
>>223
> エラーが出てしまいファイル書き込みが行えなくなってしまいました。
エラーの詳細を教えてもらわないと答えようがない。
228199:2009/03/07(土) 02:46:59
>>224-225
ありがとうございます。
よくみたら%sじゃなくて%cですね。
C言語に怖いイメージがあるんで、ついエラーが出ると焦ってしまって。
しょうもないミスですいません。
229デフォルトの名無しさん:2009/03/07(土) 02:49:03
VC++2005でWAVEの扱いを勉強しています。
PCデバイスのマイクから録音したものを
そのままスピーカから再生する
というサンプルソースが置かれているサイトなどありませんでしょうか?

マイクからの録音 や waveファイルの再生
の個々について扱っているサイトはいくつか見つかったのですが、
複合となるとよく分からなくなってしまいます。
例えば waveIn*** 関数の引数である WAVEHDR と
waveOut*** 関数の引数である WAVEHDR は同じもので良いのか(もしくは同じでは駄目/なくては駄目)
など、分からない事が多く、上手く実装できない状態です。
よろしくお願いします。
230デフォルトの名無しさん:2009/03/07(土) 02:51:01
>>228
C言語は怖くないですよw最悪、プログラムが落ちることぐらいです。

ファイルを消したらアレだけど、ファイルを消すならVBでもできるし。
231デフォルトの名無しさん:2009/03/07(土) 02:51:43
>>229
なんどめだ
帰れ
232デフォルトの名無しさん:2009/03/07(土) 02:52:40
233229:2009/03/07(土) 02:55:01
>>231
先入観のみで語らないで下さい。恥ずかしい方ですね。
このスレには数ヶ月ぶりの書き込みで、内容で言えば初めてです。

>>232
誘導ありがとうございます。
234デフォルトの名無しさん:2009/03/07(土) 05:43:44
>>233
いいから二度とくんな
235デフォルトの名無しさん:2009/03/07(土) 05:50:36
>>234
死ね
ちなみに私は229ではありません
236デフォルトの名無しさん:2009/03/07(土) 05:56:57
>>234
そういう事しか書けないお前が来るなよ
237デフォルトの名無しさん:2009/03/07(土) 06:49:40
とりあえずほかの人が質問しにくくなるから、もちつけ
238デフォルトの名無しさん:2009/03/07(土) 07:50:21
>>235
人に死ねなんて言えるおまえが死ねよ。
どうせそんな時間に書き込んでるんだから、
誰も困らないぞ?
239デフォルトの名無しさん:2009/03/07(土) 08:10:20
今日もスレ違いと罵倒で埋まるのであった。
240デフォルトの名無しさん:2009/03/07(土) 09:52:27
flagという名前のflag変数を使うのってどう思うよ?
241デフォルトの名無しさん:2009/03/07(土) 10:00:39
頭悪いと思うよ
242デフォルトの名無しさん:2009/03/07(土) 10:04:17
>>240
最近某スレでそういうのを書いた覚えがある身としては
使い捨てコードなら別にいいんじゃないかと答えてみたり
243デフォルトの名無しさん:2009/03/07(土) 10:09:23
>>241
>>242
そうか。
ありがと。
244:2009/03/07(土) 10:23:41
悩んでいます。
初心者の初心者ですが、C言語を始めて5つ目の問題で早々につまづいてしまいました。
下記プログラムは教科書どおりに入力しているのですが(メモ帳使用)、
何度やってもコンパイルエラーが出てしまいます。
エラーは「W8065」が出てきます。
(使用コンパイラは、borland5.5、出力はコマンドプロンプトです)
基本的な入力方法が間違っているのか、手持ちの参考書やWebサイトで調べても間違いが
わかりません。
プログラムに熟練の皆様、何かご教授いただけると有難く思います。


↓↓↓↓↓↓↓ココカラ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

#include < stdio.h >

int main( void )

{

int no;

no = 75;

printf( "noの値は%dです。\n" , no );

return( 0 );

}

↑↑↑↑↑↑↑↑ココマデ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
245デフォルトの名無しさん:2009/03/07(土) 10:26:52
>>244
#include<>
の<>内はファイル名だから勝手にスペースを追加してはいけない
246デフォルトの名無しさん:2009/03/07(土) 10:28:16
>>244
そんなマイナーなコンパイラのエラーの番号なんて誰も覚えちゃいないから
エラー番号じゃなくてメッセージを貼れよ。
247デフォルトの名無しさん:2009/03/07(土) 10:52:32
本当にコンパイルエラーか?
どう判断した?
警告じゃないのか?
248デフォルトの名無しさん:2009/03/07(土) 10:52:45
stdio.h の前後に空白が入ってるね。 入れちゃ駄目
249デフォルトの名無しさん:2009/03/07(土) 10:53:33
入れたい
250:2009/03/07(土) 10:57:25
244です。

>245さん
ありがとうございます。
おっしゃるとおりでした。助かりました。
こんな間違いに気づかず悶々と悩んでた自分が恥ずかしいです。

>246さん
はっ!ご指摘ありがごうとざいます。失礼しました。
「W8065」のエラー内容は、
「プロタイプ宣言のない関数'printf'の呼び出し(関数 main)」
でした。
251デフォルトの名無しさん:2009/03/07(土) 12:34:26
>>245
へぇ*10
入れたことないので知らなかった
252デフォルトの名無しさん:2009/03/07(土) 14:02:50
ファイル名の空白を無視する某OSでは>244でもコンパイルできてしまう罠。
253デフォルトの名無しさん:2009/03/07(土) 14:13:46
ライブラリを使わずに平方根を求めるプログラムで
double root(int num, int deapth)
{
        double ret = 0.0;
        double unit = 1.0;
        int d;

        for(d = 0; d < deapth; ret += unit) {
                /* ぴったりですけど */
                if(num == SQPOW(ret)) break;
                /* 越えたんですけど */
                if(num <  SQPOW(ret)) {
                        ret -= unit;        /* 一個前なんですけど */
                        unit /= 10.0;        /* 位変えるんですけど */
                        d++;
                }
        }

        return ret;
}
を作りましたが、root(5, 100)とすると
フリーズしてしまいます。どうすればいいでしょうか?
254デフォルトの名無しさん:2009/03/07(土) 14:19:23
おっと忘れてました。SQPOW()は平方です。
#define SQPOW(n) n*nです。
255デフォルトの名無しさん:2009/03/07(土) 14:29:39
>>253
恐らく、ret*retがどんぴしゃで整数にならずに脱出できなくなっていると思われる。
あんたのコンパイラは、実数値の等値性に関する警告は出ないのか?
256デフォルトの名無しさん:2009/03/07(土) 14:42:13
つりだろ。
doubleで平方根を100桁調べようとか、ありえないから。
257デフォルトの名無しさん:2009/03/07(土) 14:49:53
doubleはせいぜい十進法で15桁分くらいの精度しかない(IEEE 754の倍精度として)。

実際に動かしてみたけど、ret = 2.2360679774997889, unit = 1e-016になって、
このとき、ret += unitしても、retの値が変化せず無限ループに陥っていた。
258デフォルトの名無しさん:2009/03/07(土) 15:18:13
アセンブラの人は、8bitで何桁でも計算しますよ
259デフォルトの名無しさん:2009/03/07(土) 15:21:30
>>258
C言語でも多倍長ライブラリとかあるよ
260デフォルトの名無しさん:2009/03/07(土) 17:59:45
精度に制限設けようと思って悩んでいたところ
>>257見てそれだと思い
                        ret -= unit;
                        limitter = temp = root;
                        unit *= 0.1;
                        limitter += unit;
                        if(limitter == temp) break;
ってやったらできました。ありがとうございました。
261260:2009/03/07(土) 18:00:19
rootじゃなくてretですね。
262デフォルトの名無しさん:2009/03/07(土) 19:21:53
雑学レベルの質問なんですが、char型のポインタ、int型のポインタ、DWORD型のポインタ、short型のポインタ、
いろんなポインタがありますが、サイズはみんな共通して32ビットって本当ですか?char型ポインタでもDWORD型ポインタもサイズ同じ?
263デフォルトの名無しさん:2009/03/07(土) 19:26:08
基本的にプラットフォーム/アーキテクチャに依存します。
32bit OSなら32bit、64bit OSなら64bitという具合です。
同一プラットフォーム/アーキテクチャなら同じと思っていいですが、関数ポインタだけは例外です。
264デフォルトの名無しさん:2009/03/07(土) 19:33:07
昔はnear, far, hugeポインタなる物があってな…
今16bitの開発はどうやってるんだろう
265デフォルトの名無しさん:2009/03/07(土) 19:37:16
> 同一プラットフォーム/アーキテクチャなら同じと思っていいですが、関数ポインタだけは例外です。

いまこれ書いてる俺の PC ではポインタが 32bit だったり 64bit だったりするし、
関数ポインタだけでなく const ポインタもビット数が違う環境もある
266デフォルトの名無しさん:2009/03/07(土) 19:43:10
const を別扱いするメリットが判らん
ROM化ならリテラル用のセクション構文用意すれば済む話じゃないか
267デフォルトの名無しさん:2009/03/07(土) 21:28:22
>>265のクソ環境に興味あるな
268デフォルトの名無しさん:2009/03/07(土) 23:02:48
C++ のconst変数に毒されてるのでイマイチ自信がないけど
配列変数もconstだよね
265 仕様で c言語って成り立たなくね?
269デフォルトの名無しさん:2009/03/07(土) 23:07:25
>配列変数もconstだよね
違います
270デフォルトの名無しさん:2009/03/07(土) 23:12:52
set_quoting_style (struct quoting_options *o, enum quoting_style s)
{
(o ? o : &default_quoting_options)->style = s;
}
この判定文の意味がわかりませぬ
271デフォルトの名無しさん:2009/03/07(土) 23:16:35
C言語では条件式が必要な場所では常に
0と比較した結果が等しくなければ条件成立で
そうでなければ不成立になる
ポインタを0と比較すると0がヌルポインタに変換されるため
条件式にポインタを与えるとポインタがヌルポインタでなければ条件成立で
そうでなければ不成立になる

?:演算子の意味がわからないなら教科書を読み直すこと
272デフォルトの名無しさん:2009/03/07(土) 23:24:40
日本語おかしくない?
273デフォルトの名無しさん:2009/03/07(土) 23:29:05
>>270
oがnullじゃなかったらo->styleにsを代入。
oがnullだったらdefault_quoting_options.styleにsを代入
274デフォルトの名無しさん:2009/03/08(日) 00:31:13
>>262
ワードマシンだとchar*/void*だけ大きさが違うとは聞く。
そもそもワードマシン自体、伝説と化しているけど。
275デフォルトの名無しさん:2009/03/08(日) 00:55:32
「宣言」ってなんすか?
276デフォルトの名無しさん:2009/03/08(日) 00:59:03
ギレン総帥のアレ
277デフォルトの名無しさん:2009/03/08(日) 01:03:59
C言語において0のポインタ値へのキャストは常にヌルポインタである
と規定されているでしょうか?
また(int)(void*)0!=(int)0となる処理系はあるでしょうか?
278デフォルトの名無しさん:2009/03/08(日) 01:06:58
>>277
>規定
意味が判らない
>となる
ないよ
元がどんな値でも(int)とキャストした時点でintのとりうる値に削られる
279デフォルトの名無しさん:2009/03/08(日) 01:15:55
http://www.youtube.com/watch?v=jp5pepDDoBU
qあwせdrftgyふじこlp;@:
280デフォルトの名無しさん:2009/03/08(日) 01:50:25
>>278
規定=規約だろ
281デフォルトの名無しさん:2009/03/08(日) 02:03:23
でっていう
282デフォルトの名無しさん:2009/03/08(日) 02:14:39
俺もおまいの質問の意図がイマイチ判らんが
たぶん、ここを3回くらい読み返せば解決するだろう。
http://www.kouno.jp/home/c_faq/c5.html
283デフォルトの名無しさん:2009/03/08(日) 02:25:36
>>277
規約されていない。(int*)0がフルアクセス可能なintポインタ値な
場合がありえる。
後半の質問については恐らく無いが、あっても問題無い。
参考:http://www.kouno.jp/home/c_faq/c5.html
284デフォルトの名無しさん:2009/03/08(日) 04:52:11
>>277
ポインタを整数にキャストできるのは、
整数の大きさがポインタよりも大きい場合に限らる。
しかし、空ポインタを整数にキャストしても0になるとは限らない。

整数をポインタにキャストできるのは、
1. 整数が定数の0である場合
2. ポインタを整数にキャストしたものを元に戻す場合
に限られる。
前者は空ポインタ定数を生成し、
後者では元と同じポインタに戻ることが保証されている。

これら以外の変換は定義されない。
285デフォルトの名無しさん:2009/03/08(日) 05:30:45
>>284
キャストと変換を混同すな
286デフォルトの名無しさん:2009/03/08(日) 05:35:32
どう違うの?
287デフォルトの名無しさん:2009/03/08(日) 05:46:24
void *p;
p = 0; /* 変換 */
p = (void *)0; /* キャスト */
288デフォルトの名無しさん:2009/03/08(日) 06:24:02
誰一人として正しいことを言っていない…

質問者は正解が欲しければ規格スレに行った方がいい
289デフォルトの名無しさん:2009/03/08(日) 06:24:56
>>288
正解頼む
290デフォルトの名無しさん:2009/03/08(日) 06:38:07
>>277
> C言語において0のポインタ値へのキャストは常にヌルポインタである
> と規定されているでしょうか?
整数定数0をポインタ型にキャストすればヌルポインタになる。
その他の場所から整数0を持ってきてキャストしてもヌルになる保証はないし、
そもそもキャストできる保証もない。

> また(int)(void*)0!=(int)0となる処理系はあるでしょうか?
(void*)から(int)にキャストできない場合があるし、
仮に出来たとしても0にならないかもしれない。

>>283
> 規約されていない。(int*)0がフルアクセス可能なintポインタ値な
> 場合がありえる。
(int*)0はヌルポインタ。

>>284
最後の行が間違ってる(>>285)。
291デフォルトの名無しさん:2009/03/08(日) 07:03:17
どう違うの?
292デフォルトの名無しさん:2009/03/08(日) 09:17:10
>>284 は無知にもほどがある
初歩から勉強しなおせ
293デフォルトの名無しさん:2009/03/08(日) 10:20:36
>>277
(void*)0はヌルポインターだけど、ヌルポインターをintにキャストしたものが
0になることは保証されていない(処理系定義)ということじゃないかな。
>>290さんの言いっていることが正しい。

> C言語において0のポインタ値へのキャストは常にヌルポインタである
> と規定されているでしょうか?

JISX3010 6.3.2.3 ポインタ から
値0をもつ整数定数式又はその定数式を型void *にキャストした式を、空ポインタ定数
(null pointer constant)と呼び、いかなるオブジェクト又は関数へのポインターと
比較しても等しくないことを保証する。

> また(int)(void*)0!=(int)0となる処理系はあるでしょうか?
JISX3010 6.3.2.3 ポインタ から
任意のポインタ型は整数型に型変換できる。これまでに規定されている場合を除き、
結果は処理系定義とする。結果が整数型で表現できなければ、その動作は未定義とする。
結果はなんらかの整数型の範囲に含まれているとは限らない。
294デフォルトの名無しさん:2009/03/08(日) 11:26:54
僕は15歳なのだが、向上心があればゆとり学力の僕でもC言語を勉強して理解できるかな?

まぁ・・・がんばってみるか。
295デフォルトの名無しさん:2009/03/08(日) 11:32:33
> 任意のポインタ型は整数型に型変換できる。これまでに規定されている場合を除き、
> 結果は処理系定義とする。結果が整数型で表現できなければ、その動作は未定義とする。
> 結果はなんらかの整数型の範囲に含まれているとは限らない。

勉強になるなぁ。
296デフォルトの名無しさん:2009/03/08(日) 12:54:43
>>294
向上心は大事な必要条件の一つ。
15歳で興味を持ったなら俺より素質あるよw
297デフォルトの名無しさん:2009/03/08(日) 13:20:41
15でCは早いだろ。まずはAぐらいにしときなさい
298デフォルトの名無しさん:2009/03/08(日) 13:34:55
つまんね…
299デフォルトの名無しさん:2009/03/08(日) 14:17:10
日にちを入力して、六日を金曜日とする月の曜日を出力したいのですが、
エラー E2291 youbi.c 11: } が必要(関数 main )
エラー E2141 youbi.c 11: 宣言の構文エラー(関数 main )
エラー E2139 youbi.c 11: 宣言に ; がない(関数 main )
警告 W8070 youbi.c 11: 関数は値を返すべき(関数 main )
警告 W8004 youbi.c 11: 'youc' に代入した値は使われていない(関数 main )
警告 W8004 youbi.c 11: 'youi' に代入した値は使われていない(関数 main )
警告 W8004 youbi.c 11: 'hiniti' に代入した値は使われていない(関数 main )
エラー E2190 youbi.c 11: 不要な }
エラー E2040 youbi.c 11: 宣言が正しく終了していない
エラー E2293 youbi.c 13: ) が必要
エラー E2293 youbi.c 14: ) が必要
エラー E2293 youbi.c 15: ) が必要
エラー E2303 youbi.c 16: 型名が必要
エラー E2451 youbi.c 16: 未定義のシンボル hiniti
エラー E2293 youbi.c 17: ) が必要
エラー E2040 youbi.c 18: 宣言が正しく終了していない
エラー E2190 youbi.c 19: 不要な }
*** 13 errors in Compile ***
↑のようなエラーが出ます。
どこを直せばよいでしょうか?
ソース↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8954.txt
300デフォルトの名無しさん:2009/03/08(日) 14:26:20
char *youc[]={"月", "火", "水", "木", "金", "土", "日"}, note[3]={0};
printf("%d日は%s曜日です。\n",hiniti,youc[youi]);
301299:2009/03/08(日) 14:33:00
>>300
ありがとうございます。
文字の間にあったスペースは余計だったのでしょうか?
302デフォルトの名無しさん:2009/03/08(日) 14:36:33
>>301
文字の間にあったスペース?
303299:2009/03/08(日) 14:39:40
>>302
char youc[]={"月",■"火",■"水",■"木",■"金",■"土",■"日"}, note[3]={,0};
はい、今黒い四角になっている部分です。
304デフォルトの名無しさん:2009/03/08(日) 14:41:51
スペースは関係ないよ、* と , だろ。
305デフォルトの名無しさん:2009/03/08(日) 14:42:48
まず、コンパイルには無関係。あってもなくてもいい。
コーディングスタイルとしては、個人的にはあったほうがいいと思う。

他のところでも、
#include■<stdio.h>
int main(void)■{
int hiniti■=■0, youi■=■0;
youi■=■hiniti■%■7;
fgets(note,■2,■stdin);
とする。個人的に。
306299:2009/03/08(日) 14:43:38
>>304
試してみたらそうでした。
ありがとうございます。
307299:2009/03/08(日) 15:01:29
最終的にこういうソースになりました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8955.txt
表示をいったん止めるために
fgetsを2段重ねて使っているのですが、
こういう使い方をしても大丈夫なのでしょうか?
308デフォルトの名無しさん:2009/03/08(日) 15:06:16
別に問題はないよ
あくまで習作としてならだけど
309デフォルトの名無しさん:2009/03/08(日) 15:07:10
>>307
Cの仕様上はまったく問題ない
インタフェースとしてはあまりスマートではないが、まだ君が気にする必要はない
310デフォルトの名無しさん:2009/03/08(日) 16:51:37
課題は自分でやれ
出来なくても、それが実力なんだからそのままにしとけ
311デフォルトの名無しさん:2009/03/08(日) 18:29:51
日曜の夕方からイライラしてないでサザエさんでも見てろ
312デフォルトの名無しさん:2009/03/08(日) 18:38:45
困ってます。教えてください。
1つはサウンドバッファ書き込み用のCALLBACK関数で、
もう一つはMAINスレッドにあるリードルーチン。
MAINスレッドにあるリードルーチンをある条件時に寝かせ、
CALLBACK関数側から寝てる状態を起こしたい処理なのですが、
何か良い方法ありますでしょうか?
sigwait()を使ってできそうなんだが、通常処理なので
signalは使いたくないのです。よろしくお願いします。




313デフォルトの名無しさん:2009/03/08(日) 18:55:57
>>312
標準 C にスレッドサポートはない
環境依存スレで聞いてはどうだ
314デフォルトの名無しさん:2009/03/08(日) 19:34:27
てかsignal使いたくないから別スレッドにしたんだろ?
315デフォルトの名無しさん:2009/03/09(月) 12:36:56
バイナリで 00 00 01 EB のデータを
16進数1EB→10進数491にして491を取得したいのですがどう記述すればよろしい
のでしょうか?

ご教授よろしくお願いします
316デフォルトの名無しさん:2009/03/09(月) 12:43:16
バイナリ?文字列じゃないのか?
もしバイナリなら、エンディアン気にして入れ替えるかキャストで。
socket.hの関数使ってもいいけど
317デフォルトの名無しさん:2009/03/09(月) 12:43:26
>>315
printf("%d\n", 1 * 0x100 + 0xeb);
318315:2009/03/09(月) 13:06:01
>>316-317
具体的にはこのようなことをしたいです
数値変換のほかに文字列への変換も行いたいです

バイナリ→数値の変換
byte hoge[] = {0x00,0x00,0x01,0xeb};
int temp;
〜処理〜
temp→491

UTF8のバイナリ→文字列への変換
byte hoge2[] = {0xE3,0x81,0x8A};
char temp3[1024];
〜処理〜
temp3→お

よろしくお願い致します
319デフォルトの名無しさん:2009/03/09(月) 13:26:42
>>318
temp = ((hoge[0] * 0x100 + hoge[1]) * 0x100 + hoge[2]) * 0x100 + hoge[3];
memcpy(temp3, hoge2, sizeof(hoge2));
temp3[sizeof(hoge2)] = '\0';
320デフォルトの名無しさん:2009/03/09(月) 13:41:57
ビッグエンディアンなら
temp = *(int*)hoge;
リトルエンディアンなら
temp = hoge[0] << 24 | hoge[1] << 16 | hoge[2] << 8 | hoge[3];

文字列ってのは具体的に文字コード何?
321デフォルトの名無しさん:2009/03/09(月) 13:43:30
>>320
CPUとhogeのアライメントによっては落ちる素敵コードですね。
322デフォルトの名無しさん:2009/03/09(月) 13:44:31
いいんだよ質問者が環境書いてないんだし
323デフォルトの名無しさん:2009/03/09(月) 13:51:13
よくねえよ
そういうときは環境に依存しないコードを書くもんだ
324デフォルトの名無しさん:2009/03/09(月) 14:09:05
質問者が何がわかってないかもわからないやつだったのか・・・
325315:2009/03/09(月) 17:26:36
ありがとうございました
>>319様の方法で期待通りの結果を得ることができました
326デフォルトの名無しさん:2009/03/10(火) 00:55:02
質問です
ポインタ同士の比較って使ってもよいのでしょうか?

ある位置(終了位置)を超えたら最初(開始位置)に戻るというのを考えています。

現在++;
if(現在 > 終了){
現在 = 開始;
}
327デフォルトの名無しさん:2009/03/10(火) 00:57:28
そのポインタ同士がある一つの連続した領域、
要するに配列とかmalloc()した領域を指しているなら、
比較しても問題ない
328デフォルトの名無しさん:2009/03/10(火) 01:10:42
即レスありがとうございます。
領域は開始位置(配列の頭)から終了位置(配列の最後)までで、
++またはーーして、この領域間を出たときの判定なのですが、
「領域を出たとき」というのはまずいでしょうか?
329デフォルトの名無しさん:2009/03/10(火) 01:47:29
>>328 問題ない
330デフォルトの名無しさん:2009/03/10(火) 01:51:49
それをやるために、一つ前と一つ後を指せることを保障してるんだっけ?
331デフォルトの名無しさん:2009/03/10(火) 02:09:57
一つ後は指せるけど、一つ前は指せない。
332デフォルトの名無しさん:2009/03/10(火) 03:03:12
#include <stdio.h>

struct pixels{
unsigned int record_number;
unsigned short record_length;
};

int main(void){
printf("unsigned int: %d unsigned short: %d\n",sizeof(unsigned int),sizeof(unsigned short));
printf("pixels size : %d\n",sizeof(struct pixels));
return 0;
}

構造体pixelのサイズが6バイトにならないのはなぜなんでしょう?
intが4バイト、shortが2バイトなのに・・・。

環境はXP(32bit)、VisualStudio2005です。
333デフォルトの名無しさん:2009/03/10(火) 03:05:51
>>332
構造体を二つ並べたときに、intが4byte境界にこなくなるから。
334デフォルトの名無しさん:2009/03/10(火) 03:06:09
>>332
境界調整とかアライメントで検索
335デフォルトの名無しさん:2009/03/10(火) 03:14:43
>>333-334

ありがとう、勉強してみます。
336デフォルトの名無しさん:2009/03/10(火) 03:17:53
struct pixels をタンスと思いねぇ
int が抽斗で中には 仕切り板でパンツ4ヶ入れれる様になってるんだ (32bit int仕様の抽斗な)
int の抽斗2個付いてるのが struct pixelsな訳だ

余ってる仕切り2個に詰め込んでタンスの設置面積を節約する事も出来るが
どこに入れたか都度2個ズラし云々で抽斗と仮想箪笥の対応を数えなきゃいけないのは面倒だろう?
337デフォルトの名無しさん:2009/03/10(火) 03:36:52
>>336

たしかに、32bitで探すのが得意な人が16bitずつ探すのは面倒かもしれません。
こいういった細かい仕様(?)も、もっと色んな参考書を読んで勉強してみます。
338デフォルトの名無しさん:2009/03/10(火) 03:58:34
仕様というかCPUの都合だなぁ
言語の本とかにはあまり載ってない気がする

WindowsならAdvanced Windowsにそこそこ詳しく書いてあるよ
339デフォルトの名無しさん:2009/03/10(火) 04:04:20
>>338

情報ありがと、書店でみてくるよ!
340デフォルトの名無しさん:2009/03/10(火) 05:20:02
メモリーのアライメントといえば
昔のモトローラのCPUは奇数番地をアクセスしただけでバスエラーがでたな。

int *p = (int *)1;
*p; <- ここでバスエラー
341デフォルトの名無しさん:2009/03/10(火) 10:40:18
つーか、x86はバスエラー起こさず単純に遅くなるから始末が悪い。
342デフォルトの名無しさん:2009/03/10(火) 12:45:26
Windowsでのデフォルトの挙動
x86: 例外が発生するがOSが握りつぶす
x64: 例外を発生させない
IPF: 例外が発生、アプリで処理しないと落ちる

http://msdn.microsoft.com/en-us/library/aa290049.aspx#ia64alignment_topic4
343デフォルトの名無しさん:2009/03/10(火) 13:39:42
いや、x86の場合もミスアラインメント例外もハードウェア処理でOSまで届かないよ
MSDNでも、the operating system does not make the alignment fault visible to the application.だし
疑うならパフォーマンスモニタのsystemにミスアラインメント例外をチェックするところあるから見てみな
344デフォルトの名無しさん:2009/03/10(火) 14:09:05
電卓あがりのバイトマシンだからな。
345デフォルトの名無しさん:2009/03/10(火) 14:09:55
申し訳ない、英語苦手なんで、まさに
>the operating system does not make the alignment fault visible to the application
の記述から、OS自身がアプリから隠蔽する、と読んでた
x64との記述の差異もあるように見えたので

パフォーマンスモニタは見てみる
346デフォルトの名無しさん:2009/03/10(火) 14:26:46
バイトマシンなのは電卓上がりだからではない
347デフォルトの名無しさん:2009/03/10(火) 16:02:20
すまん、文字列を文字コードに変換したいんだけどどうしたらいいかな?
具体的に言うと「A」を「'A'」にしたいんだが。
348デフォルトの名無しさん:2009/03/10(火) 16:11:04
日本語でおk
349デフォルトの名無しさん:2009/03/10(火) 16:12:14
char* str = "A";
なら、
str[0] が 'A'
350デフォルトの名無しさん:2009/03/10(火) 16:23:35
16ビット環境だとか32ビット環境というのは何のことですか?
351デフォルトの名無しさん:2009/03/10(火) 16:26:30
そのOSが動いているCPUの環境
352デフォルトの名無しさん:2009/03/10(火) 16:27:59
ビット幅
353デフォルトの名無しさん:2009/03/10(火) 16:43:38
このコンピュータのCPUは16ビットだけど、
あのコンピュータのCPUは32ビットだ。
といった感じですか?

メモリはよくそういう言い方しますけど、
CPUにもあったということですか?

例えば、僕のPCは
プロセッサ:Intel(R) Core(TM)2 Duo CPU E8300 @2.83GHz 2.83GHz
メモリ(RAM):4.00GB
システムの種類:32ビット オペレーティングシステム
となってますが、
CPUの単位はHzですよね?

それならなぜ
プロセッサ:32bit
メモリ:XXXXXbit
みたいに言わないんですか?
揃ってた方が分かり易いと思うんですけど・・・。
354デフォルトの名無しさん:2009/03/10(火) 16:45:31
スレ違いどころか板違いだ
355デフォルトの名無しさん:2009/03/10(火) 16:45:38
太陽まで距離と近所のコンビニまでの距離
356デフォルトの名無しさん:2009/03/10(火) 16:47:40
Hzは動作クロックだろ。
Core2Duoは動作モードで16bitにも32bitにも64bitbにもなる(OSがモードを決める)
って板違いだな
357デフォルトの名無しさん:2009/03/10(火) 16:51:15
>>356
ならねーよ
358デフォルトの名無しさん:2009/03/10(火) 16:57:42
すみません。
確かに板違いですね。

ともかく僕のPCでintを宣言すると32bitになるってことですよね?
359デフォルトの名無しさん:2009/03/10(火) 17:16:47
よほど変なコンパイラでもない限りは32bitだろうな
360デフォルトの名無しさん:2009/03/10(火) 18:09:54
そう思い込んでVB触ってインデックスオーバー起こして泣くがいいさ
361デフォルトの名無しさん:2009/03/11(水) 00:53:32
Visual C++2005

で、ヘッダファイルに以下のように記述したところ
コンパイルエラーが出ました。
記述しているのはファイルの10行目です。

typedef enum {FALSE, TRUE} Boolean;

エラー内容
sub.h(10) : error C2143: 構文エラー : '}' が '定数' の前にありません。
sub.h(10) : error C2143: 構文エラー : ';' が '}' の前にありません。
sub.h(10) : error C2059: 構文エラー : '}'

何が間違っているのでしょうか?
よろしくお願いします。
362デフォルトの名無しさん:2009/03/11(水) 00:58:56
>>361
たぶん、どっかに
#defnie FALSE 0
#defnie TRUE 1
と定義されている
363デフォルトの名無しさん:2009/03/11(水) 01:04:26
>>何が間違っているのでしょうか?
今更真偽値を自分で定義しようとしていること。
364361:2009/03/11(水) 01:38:47
>>362-363
大変よくわかりました
解決しました。ありがとうございます。
365デフォルトの名無しさん:2009/03/11(水) 08:25:12
float a=1.0f
などの変数の数値のあとにつける
’f’とか’e’ってなんていう意味があるんですか?
366デフォルトの名無しさん:2009/03/11(水) 08:29:10
>>365
float型
367デフォルトの名無しさん:2009/03/11(水) 08:55:03
今どきfloatなんて精度も速度も低い変数を使う男の人って・・・
368本日の名言:2009/03/11(水) 09:00:01
367 名前:デフォルトの名無しさん 投稿日:2009/03/11(水) 08:55:03
今どきfloatなんて精度も速度も低い変数を使う男の人って・・・
369デフォルトの名無しさん:2009/03/11(水) 09:29:16
368 本日の名言[] 2009/03/11(水) 09:00:01
367 名前:デフォルトの名無しさん 投稿日:2009/03/11(水) 08:55:03
今どきfloatなんて精度も速度も低い変数を使う男の人って・・・
370本日の名言 その2:2009/03/11(水) 10:00:45
369 名前:デフォルトの名無しさん 投稿日:2009/03/11(水) 09:29:16
368 本日の名言[] 2009/03/11(水) 09:00:01
367 名前:デフォルトの名無しさん 投稿日:2009/03/11(水) 08:55:03
今どきfloatなんて精度も速度も低い変数を使う男の人って・・・
371デフォルトの名無しさん:2009/03/11(水) 10:01:35
372デフォルトの名無しさん:2009/03/11(水) 10:11:43
本物のプログラマは浮動小数点など使わない。
整数型以上の精度がどうしても必要なときは固定小数点ライブラリを
自分で書いて使う
373デフォルトの名無しさん:2009/03/11(水) 10:17:08
floatでもdoubleでも、書いているプログラムが必要とする精度が保証されれば
それでいいんじゃない。
374デフォルトの名無しさん:2009/03/11(水) 10:26:09
float a=1.0f
ならまだいいが
double b=1.0f
とか書かれてると何がしたいんじゃゴルァ!
とは思う
375デフォルトの名無しさん:2009/03/11(水) 10:28:54
>>365
小数点のある数値リテラルは何もつかないとdouble型なのでf(F)をつけてfloat型にしている

DirectXでは普通にfloatを使うよ
376デフォルトの名無しさん:2009/03/11(水) 10:44:30
>>372
言いたいことは分かるが、あんたの言う本物のプログラマの意味が曖昧。
必要最低限の制度があれば、あるいは使い方を守っていれば問題なし。
それを言い出すと、この世に完璧なプログラムはないため、本物のプログラマ
そのものが、あんたの価値観、世界観では存在しない。
377デフォルトの名無しさん:2009/03/11(水) 10:46:07
378デフォルトの名無しさん:2009/03/11(水) 10:49:13
それで、物申しておきながら、それは駄目と否定するくせに、では
どれが適切か?について述べない卑怯者もいる。
>>372とか、本物のプログラマとか大きなことを言っておきながら
自分が本物のプログラマかどうかも示さないくせに。
どうせ、引きこもりだろ?
379デフォルトの名無しさん:2009/03/11(水) 11:12:47
だから、入門編で暴れるなって。醜いだけだよ。
380デフォルトの名無しさん:2009/03/11(水) 11:55:46
char c;
c = '漢';
printf("%c", c);

とすると、
実行するたびに
<何も表示されない>

と、交互に表示されるんですがどういうことですか?
381デフォルトの名無しさん:2009/03/11(水) 11:59:25
>>380
「漢」が多バイト文字なのに1バイトしか出力しないから、端末エミュレータが混乱している。
文字ではなく、文字列として扱えばよい。
382デフォルトの名無しさん:2009/03/11(水) 12:00:20
漢字は1byteじゃ入りきらないから
383デフォルトの名無しさん:2009/03/11(水) 12:03:15
''は文字を括るが、1バイトとは限らない。
だからと言ってint c = '漢';としたところで巧い使い途があるわけでもないが。
従って、const char * c = "漢";とした上でprintf("%s", c);とすればいい。
384デフォルトの名無しさん:2009/03/11(水) 12:16:02
javaは少しやってて
今Cやってるんですけど、
Cってややこしいですね。

単に漢字扱うだけなのに・・・。

今もこれが正しく動かず困ってます。

int main(void) {
int num;
int a;
printf("整数を入力してください:");
scanf("%d", num);
printf("何倍しますか?:");
scanf("%d", a);
printf("%d倍すると %d になります。", a, (a * num));

return 0;
}

表示

整数を入力してください:4
何倍しますか?:6
2147328000倍すると 271482880 になります。

初期化忘れかなと思って、最初に両方に0代入してやったら、
整数を入力してください:4
から操作不可能になった。

終わってる・・・・
385デフォルトの名無しさん:2009/03/11(水) 12:18:52
そのコードは動かんよw
漢字以前の問題
386デフォルトの名無しさん:2009/03/11(水) 12:20:06
>>384
scanf("%d", &a);

入門書はちゃんと読もうね
387デフォルトの名無しさん:2009/03/11(水) 12:22:20
#include <locale.h>

int main(void)
{
wchar_t c;
c = L'漢';

setlocale(LC_ALL, "japanese");
wprintf(L"%c", c);
}
こうすれば正しく動くんじゃないかな
388デフォルトの名無しさん:2009/03/11(水) 12:24:31
あ、本当だ。
何か変なのついてた。

こうなると&つけてないのに一応動いたのが不思議。
389デフォルトの名無しさん:2009/03/11(水) 12:40:10
>>388
format系の可変引数関数は型チェックできないから間違ってても一応動く
390デフォルトの名無しさん:2009/03/11(水) 12:40:43
>>388
動くがそのまま続けると大変な事になる可能性が高い
391デフォルトの名無しさん:2009/03/11(水) 12:55:47
Cの入力や文字列操作って鬱陶しいですよね…
scanfは使っちゃ駄目だったり
この辺のテクニックが良くまとまった本とかサイトとかないですか?
392デフォルトの名無しさん:2009/03/11(水) 13:03:49
393デフォルトの名無しさん:2009/03/11(水) 13:06:45
>>391
scanf()を使っちゃダメなんてことないよ。
エラー処理してくれないから数値入力のときに数字以外の文字を入れられたら厄介だとか、
型チェックしてくれないからプログラマが気をつけるか警告レベルを引き上げて参考にしないといけないとか、
文字列の場合はバッファオーバフローしないように文字数制限をしないといけないとか、
その辺りに気をつけて使えばいいだけだから。
394デフォルトの名無しさん:2009/03/11(水) 13:13:08
文字列をscanfで入力受付する場合、ちと問題がね・・・
395デフォルトの名無しさん:2009/03/11(水) 13:18:21
>>394
>393が指摘している以外にどんな問題が?
要は、これで充分使えると思うわけだが。
char buf[100];
scanf("%99s", buf);
空白も含めて入力したいのなら改行で分離するとしてこれでいいし。
scanf("%99[^\n]", buf);
まぁ、printf()みたいに%*sで文字数指定できたら(少しは)楽だったとは思うけどね。
396デフォルトの名無しさん:2009/03/11(水) 13:36:26
>>395
その通り、分かって使う人は問題ない
ときどき教科書丸暗記タイプの人がファビョるけど
あれは無視していい

初心者に使わせることは意見が別れるところか…
397デフォルトの名無しさん:2009/03/11(水) 13:37:01
>>395
半端な例だすなよカス
それじゃまだ問題があるだろ
398デフォルトの名無しさん:2009/03/11(水) 13:47:06
scanf()とかc=getchar(),getch()で文字入力しているプログラムは何がしたいのかさっぱり分からん
初心者って言葉を言い訳に使うな。プログラムを書く人間なら欠陥関数を使うな。以上。
399デフォルトの名無しさん:2009/03/11(水) 14:04:45
>>398
文字入力には何を使ってるの?
400デフォルトの名無しさん:2009/03/11(水) 14:07:14
getchar()の欠陥て?
401デフォルトの名無しさん:2009/03/11(水) 14:59:19
fgetsとsscanfでいいよ。
402デフォルトの名無しさん:2009/03/11(水) 15:38:59
getchar()は確かにガキ臭い
403デフォルトの名無しさん:2009/03/11(水) 15:47:57
>>398 お前みたいなのを、口先だけって言うんだよw
自分は出来るみたいな、思い上がり
404デフォルトの名無しさん:2009/03/11(水) 15:49:38
getch()はまた別の話になると思うんだが・・・何が言いたいんだ、こいつ?
知ったかぶりの意見ってのは、当てにならん。
405デフォルトの名無しさん:2009/03/11(水) 15:54:57
そろそろ顔真っ赤にして「釣れた釣れたww」言い出しそう
かわいそうだからこのへんにしとこうぜ
406デフォルトの名無しさん:2009/03/11(水) 15:56:24
>>401
それじゃ足りないよ、数値とかで
407デフォルトの名無しさん:2009/03/11(水) 16:03:57
どの辺が足りないんだか
改行を必要とする部分くらいだろう
408デフォルトの名無しさん:2009/03/11(水) 17:42:33
>>398>>401は同一人物じゃないだろw
じゃないとあまりにも馬鹿すぎる・・・
409デフォルトの名無しさん:2009/03/11(水) 17:44:22
>>408
お前が馬鹿なのはよく分かった
410デフォルトの名無しさん:2009/03/11(水) 17:45:19
マジで同一人物・・・?
411401:2009/03/11(水) 17:56:21
俺は398じゃねえよ。
今更別人物だと言っても証明のしようがないけど。
412デフォルトの名無しさん:2009/03/11(水) 18:00:30
んなわけねーだろ
413デフォルトの名無しさん:2009/03/11(水) 18:01:53
>>411
違うのなら問題ない
414401:2009/03/11(水) 18:14:08
あ、あれ……?俺が二人・・・・・・?
415デフォルトの名無しさん:2009/03/11(水) 18:18:48
さっき別のスレで俺の偽者も出たよ
416デフォルトの名無しさん:2009/03/11(水) 19:00:28
久しぶりにCを書くことになったんだが...
SRでなんでもかんでも初期化するな。と言われた...なんでだ?(´・ω・`)
少々古いマシンだがUNIX上で動かすプログラムなんで初期化処理が処理を重くする要因になるとは思えんのだが...
何か理由に心当たりがある人教えてくださいまし。
417デフォルトの名無しさん:2009/03/11(水) 19:08:39
>>416
SRって何?
418デフォルトの名無しさん:2009/03/11(水) 19:10:52
ソースレビューです。

あと、書き忘れたんですがオート変数の話です。
419デフォルトの名無しさん:2009/03/11(水) 19:22:56
まあ、無駄な初期化はいらないんじゃね?
カウンタや文字列を0で初期化してたり…
何か意図があるとき以外に初期化をすると、他に意味があるのかと思っちゃうし
420デフォルトの名無しさん:2009/03/11(水) 19:23:06
まあ不必要に何でもかんでも初期化する必要はないわな
421デフォルトの名無しさん:2009/03/11(水) 19:24:24
実機のCPUが豆キャッシュ
422デフォルトの名無しさん:2009/03/11(水) 19:25:25
char buf[256];
memset(buf, 0, 256); // 不必要な初期化
strcpy(buf, "hoge");
423デフォルトの名無しさん:2009/03/11(水) 19:28:30
>>422
まだこっちのほうがいい?
char buf[256] = {0};
424デフォルトの名無しさん:2009/03/11(水) 19:29:42
>>422
char buf[256]={0};
とかするとコンパイル後のコードでは memset になってたりするね

>>416
ごくわずかな可能性としてハードウェアに移植する可能性があるとか
FPGAとかだとお手軽だしw
425416:2009/03/11(水) 19:42:49
世の流れは不要な初期化は要らないって流れなんですね。(´・ω・`)

ちなみに言われたのは配列とかでなく、戻り値とかの
int rc = 0;
とかってのオート変数達です。

不定値は悪!という考えだったんで全部宣言と同時に初期化してました...
今から不要な初期化探して直すのか...めんどくせぇ。(ノД`)

貴重な意見ありがとうございました。

>424
いやぁ...そんな可能性微塵もありません。笑
426デフォルトの名無しさん:2009/03/11(水) 19:49:36
自動変数を全部初期化するようなソースは見たことないな
処理速度の低下はほとんどないだろうけど
可読性は多少落ちるかな
そんなソース見たら確かに「うぜっ」とは思うだろう
427416:2009/03/11(水) 20:04:39
>>426
組み込みやってた時に初期化初期化言われてて癖になったんですよ。
ポインタに限った話だったんかなぁ...
俺が書いたソース全オート変数宣言と同時に初期化してある。笑笑笑
428デフォルトの名無しさん:2009/03/11(水) 20:13:10
俺は逆だな
組み込みをやってから不必要な初期化がますます嫌いになった
429デフォルトの名無しさん:2009/03/11(水) 20:16:12
組み込みでもハードウェア寄りをやると不定値なんてくそ食らえだぜ
ハードウェアリセット後は一瞬でも存在して欲しくない
430デフォルトの名無しさん:2009/03/11(水) 20:18:13
defaultやelseパターン削って意味のある初期化にしてしまえばいいじゃん。

余計面倒くさいか
431デフォルトの名無しさん:2009/03/11(水) 20:24:56
静的変数は必ず初期化されるけど、明示的に書く場合もある
static char *p = NULL;
if (p) free(p);

動的変数は初期化しないと何のコードも追加されないけど
0で初期化すると

mov ebx, [addr]
xor eax
mov [ebx],eax

というようなコードが追加されるかもしらん
432デフォルトの名無しさん:2009/03/11(水) 20:29:30
>>429
リセット完了後がか?
433デフォルトの名無しさん:2009/03/11(水) 20:37:51
>>426
???
434デフォルトの名無しさん:2009/03/11(水) 20:47:07
試しにやってみたら
int rc=0;
とすると
mov dword ptr [ebp-4],0
c7 45 fc 00 00 00 00
という7バイトのコードが追加された
435デフォルトの名無しさん:2009/03/11(水) 21:11:07
>>434
最適化を有効にするともう少しましなコードになると思うよ。
0代入を0クリアしたり、不要な初期化と判断されれば消し去られたり。
436デフォルトの名無しさん:2009/03/11(水) 22:29:33
なんにせよ、宣言時初期化をするかどうかは必要性で語られるべきであって
世の中の流れなんて曖昧かつ恣意的に用いられる概念で語るべきではない
437デフォルトの名無しさん:2009/03/11(水) 23:30:38
必要性というよりコーディングスタイルかなあ
438デフォルトの名無しさん:2009/03/12(木) 00:07:31
んー、別にどっちでもいいけど、初期化してあるとwatchしやすいかなぁ
439デフォルトの名無しさん:2009/03/12(木) 00:58:16
初期化してあることによって、バグが顕在化しにくくなることもある。
440デフォルトの名無しさん:2009/03/12(木) 00:59:07
初期化してないことによって、バグが顕在化しにくくなることもある。
441デフォルトの名無しさん:2009/03/12(木) 01:07:31
とりあえず、無駄な初期化はだいたい警告で捕まえられると思う
442デフォルトの名無しさん:2009/03/12(木) 01:08:47
>>440
あるか?
バグの直接の原因になることはよくあるが
443デフォルトの名無しさん:2009/03/12(木) 01:13:18
バカだから相手しちゃダメw
444デフォルトの名無しさん:2009/03/12(木) 01:14:40
初期化されてない変数を参照するとコンパイラに怒られるしな
445デフォルトの名無しさん:2009/03/12(木) 01:18:40
・変数の初期化なんて、ハードウェアーじゃあるまいし不要なのでは?
・必要ない初期化を宣言部で初期化して、そのままリターン値になって
 抜けてくるコードなんて、見にくくてダメダメだと思うのだが?
446デフォルトの名無しさん:2009/03/12(木) 01:22:05
・そのままリターンで抜けてくるのなら必要な初期化だと思うのだが?
447デフォルトの名無しさん:2009/03/12(木) 01:26:03
そのまま向けるコードなんて書かないだろ?
機能を記述するのに、広範囲になりすぎると思うが、
つまり、宣言部の初期化なんぞ期待しないで、
ある特定の範囲で、代入や演算を記述すると思います。

448デフォルトの名無しさん:2009/03/12(木) 03:13:46
>>447
もうちょっとわかりやすい日本語を話せ
449デフォルトの名無しさん:2009/03/12(木) 03:47:30
無理言うなw
450デフォルトの名無しさん:2009/03/12(木) 08:03:11
>>442
初期化しない事によって、不定な文字列が表示されて、
bugに気が付くって話は、聞いた事ある。
しかし体験した事はないな。

>>447
一般的な長さの関数なら、宣言部で初期化しても、
十分見渡せるだろう。
451デフォルトの名無しさん:2009/03/12(木) 08:39:14
>>450
逆だぞw
452デフォルトの名無しさん:2009/03/12(木) 09:43:37
VisualC++でフフフフはしょっちゅう見るな
453デフォルトの名無しさん:2009/03/12(木) 10:19:08
VC++はDebugビルドするとフフフフで初期化されるんだっけ
454デフォルトの名無しさん:2009/03/12(木) 10:48:24
x86のINT 3 だから飛び込んでも止まるしな。
455デフォルトの名無しさん:2009/03/12(木) 11:15:53
大昔、RagnarokOnlineのモンスター名が8文字を越えると
フフフフがついたことがあったらしいけど
Releaseビルドでもフフフフで埋めるコンパイラがあるのかしらん
456デフォルトの名無しさん:2009/03/12(木) 12:26:42
ないと思うがスレ違い。
457デフォルトの名無しさん:2009/03/12(木) 12:47:25
多少話が横道にそれたくらいでスレ違いとか言う奴って何なの?死ぬの?
458デフォルトの名無しさん:2009/03/12(木) 14:04:55
多少どころか、どうみてもCのコンパイラの話をしているんだから、
スレ違いとか言ってる方は、レスろくに読んでないとおもわれ・・・
459デフォルトの名無しさん:2009/03/12(木) 14:33:15
ROはC++だがな。おまけに、ゲ製板というものもあってだな。ついでに、このスレはコンパイラの評価をするスレか?
伝聞で「あったらしい」なんて情報では掘り下げようがないぞ。
460デフォルトの名無しさん:2009/03/12(木) 15:12:55
普通にコンパイラの話をしているのにどこがすれ違いなんだか
461デフォルトの名無しさん:2009/03/12(木) 15:18:51
フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ
462デフォルトの名無しさん:2009/03/12(木) 15:23:28
スレの本筋からはそれている
Cは初期化されていない変数の中身になんか言及しないから

しかしそんなに長々引っ張ったわけでもないのにムキムキするほうもどうかしている
463デフォルトの名無しさん:2009/03/12(木) 15:41:21
ムキムキって…
464デフォルトの名無しさん:2009/03/12(木) 15:44:18
オラなんだかムキムキしてきたぞ!
465デフォルトの名無しさん:2009/03/12(木) 16:07:20
ムキムキマンのエンゼル体操を思い出して「ムキムキ体操」でググったら
全然違うものだった・・・
466デフォルトの名無しさん:2009/03/12(木) 17:32:56
会社でググると危険な気がする...(−ω−;)
467デフォルトの名無しさん:2009/03/12(木) 18:08:04
赤ん坊の皮を剥くってことですぜ。余りにそればかりヒットするんで呆れてしまった。
468デフォルトの名無しさん:2009/03/13(金) 01:51:42
マルチスレッドに関する質問です。
こちらのサイト
ttp://www.kumei.ne.jp/c_lang/sdk/sdk_87.htm
を参考にしてVC++2005、SDKで書いています。

リンク先では 親ウィンドウ 子ウィンドウ それぞれにおいて
_beginthread(*,*,*) でスレッドを起動していますが、
子ウィンドウを作った時点で親ウィンドウと動作は分離できているのではないのでしょうか?

例えば 子ウィンドウのプロシージャ関数内で無限ループを回していても
親ウィンドウは自由に操作可能(例えばメニューを開くとか)ではないのでしょうか?

よろしくお願いします。
469デフォルトの名無しさん:2009/03/13(金) 02:10:59
試してから訊けよ。
470デフォルトの名無しさん:2009/03/13(金) 02:19:47
試してから訊いています。
_beginthreadを除いて記述した場合
子ウィンドウの WM_CREATE にすら入りませんでした。
そういうものなのか、もしくは私がどこか間違えているのか判断したく
正確にはどういう動作をするべきなのかをお聞きしに来た次第です。

よろしくお願いします。
471デフォルトの名無しさん:2009/03/13(金) 02:33:45
>>468
サンプルの構造
メインスレッド 親ウィンドウ("猫でもわかるマルチスレッド)、子ウィンドウ("子")
サブスレッド 親ウィンドウ上での描画

子ウィンドウは親ウィンドウと同じメインスレッドで動作しますから、
子ウィンドウのプロシージャで無限ループをしたら、親と子のウィンドウの
メッセージループが走らなくなり、両ウィンドウはブロックされます。
472デフォルトの名無しさん:2009/03/13(金) 02:41:42
>>471
ありがとうございます。
現在、親スレッドにおいて メッセージ(msg) が大量に送られてくるアプリケーションを
作っておりまして、メッセージが送られて来る間は処理量が多く、
メニュー操作などができなくなってしまっています。

そこで、子ウィンドウを作って子ウィンドウ内でメッセージを受け、
親ウィンドウでメニュー操作をする、 と考えていたのですが
結局メインスレッド上でメッセージを受けて処理する事になるのですね。

何か良い策はありませんでしょうか?
473デフォルトの名無しさん:2009/03/13(金) 03:17:14
>>472
ウィンドウを持つサブスレッドを作って、そのサブスレッドが処理すればよいのでは。
メッセージ送信をサブスレッドのウィンドウ宛てにしてもよいし、
それができなければ、親が受け取ったメッセージをサブスレッドのウィンドウにPostMessage
してもいい。
いちばん簡単なのは、メッセージを受けとった時にサブスレッドを生成し、処理をサブスレッドに
任せるというもの。

実現方法はいろいろあります。
474デフォルトの名無しさん:2009/03/13(金) 03:29:38
>>473
試行錯誤して「メッセージを受け取った時にサブスレッドを生成し〜」
までたどり着けました。
が、他にもまだまだ方法はあるのですね。
現在の知識では「ウィンドウを持つサブスレッド」は見当が付かないので
最後に提示していただいた方法で実装してみます。

夜分にありがとうございました。
475デフォルトの名無しさん:2009/03/13(金) 04:53:41
シングルスレッドでやる方法をきいてるのかと思ったが。
476デフォルトの名無しさん:2009/03/13(金) 13:40:53
>>474
マルチスレッドプログラミングもあんたの見ていたサイトもWinAPIもC/C++初心者向けもスレがある。
あんたが書いているのがCなら必ずしもスレ違いではないが、ここで聞くのは余り適当とは言えないぞ。
477デフォルトの名無しさん:2009/03/13(金) 15:25:38
入門編向きではないな マルチスレッド
478デフォルトの名無しさん:2009/03/13(金) 15:44:38
マルチスレッドって「逃げ」だよな。
479デフォルトの名無しさん:2009/03/13(金) 16:04:10
どこが?
480デフォルトの名無しさん:2009/03/13(金) 16:36:09
通信系のプログラムなんぞシングルで書けと言われるとしんどいな
481デフォルトの名無しさん:2009/03/13(金) 17:02:52
通信系でも非ブロッキング使えばシングルで書けるし
マルチの煩雑さから開放されるメリットもある
482デフォルトの名無しさん:2009/03/13(金) 17:45:34
むしろマルチスレッドの方が楽だと思うがなあ。
>>478 もそういう感触なんじゃないか?
それに、避けようがない局面もあるし (特にDBや
外部とのI/Fが絡むとな)。
483デフォルトの名無しさん:2009/03/13(金) 17:53:21
せっかくシステムがスレッドやタスクを利用する反応を用意してくれてるのに
わざわざ自前スレッドでラップしたりシステムのスレッド避けたりするのは
「逃げ」って言うより「苦行」と観るが
484デフォルトの名無しさん:2009/03/13(金) 18:52:57
>>483
>スレッドやタスクを利用する反応
すまん。意味判らん。
>システムのスレッド避けたり
すまん。意味判らん。

つか、>>482 であげた「避けようがない局面」てのは
スレッドがブロックして全体のスループットが下がってしまう
状況を言ってるんだが。

…そろそろスレ違いだと怒られる予感。
485デフォルトの名無しさん:2009/03/13(金) 20:29:44
正規表現を覚えておくと、オラクルとかで役に立ちますか?
486デフォルトの名無しさん:2009/03/13(金) 20:43:18
>>485
失せろ
487デフォルトの名無しさん:2009/03/13(金) 21:02:57
>>486
矢せろ
488デフォルトの名無しさん:2009/03/13(金) 21:07:14
>>485
なぜここで聞く?
489デフォルトの名無しさん:2009/03/13(金) 21:17:55
マジレスするとCには正規表現はかんけーない
よってこのスレではまともな答えはかえってこない
C信者は意外と心が狭いから注意するように
490デフォルトの名無しさん:2009/03/13(金) 22:50:37
無知だな
Cだって正規表現ライブラリ関数が使えるし
exprみたいにそれ使ってるメジャーなコマンドもある
491デフォルトの名無しさん:2009/03/13(金) 22:52:51
>>490
標準ライブラリに含まれてなかったら使えるとは言えない
492デフォルトの名無しさん:2009/03/13(金) 23:36:57
憧れのアーキテクトに会いに行こうぜ
待ってる。
http://www.microsoft.com/japan/msdn/vstudio/events/agileseminar.aspx
493デフォルトの名無しさん:2009/03/14(土) 03:42:12
>>473さんが書いている
>ウィンドウを持つサブスレッド
というのは、子ウィンドウを作って WM_CREATE 時に _beginthread する
という事と同じでしょうか?

いや、それだと親ウィンドウと子ウィンドウは同じスレッド上で動くのですよね。
>>473さんの書き込み内容からすると
「親ウィンドウ」 と 「”ウィンドウを持つサブスレッド”のウィンドウ」
は別のスレッド上で動くという事だと思いますが、
その様に実装するにはどういう書き方をすれば良いのでしょうか?

ググったり書物を見たりしましたが、目的とするものは見つかりませんでした。
よろしくお願いします。
494デフォルトの名無しさん:2009/03/14(土) 03:57:39
>>493
Windowsのウィンドウはスレッドに属する。
ウィンドウプロシージャはウィンドウの属するスレッドで実行される。
さて、どのスレッドに属するかというと、CreateWindow(Ex)を呼んだスレッド。
495デフォルトの名無しさん:2009/03/14(土) 04:05:09
またそういうことを
496デフォルトの名無しさん:2009/03/14(土) 04:25:16
peekmessage でメッセージ取得に優先順位付けるだけじゃダメなのかい?
497493:2009/03/14(土) 04:25:42
>>494
親スレッドから起動した新スレッド内で
CreateWindow するという事でしょうか。
試してみましたが、 HWND chWnd;
chWnd = CreateWindow(...
でデバッグしたところ、 chWnd には値が入りませんでした。
CreateWindow の引数には WS_CHILD は入れず、WS_OVERLAPPEDWINDOW にし、
HWND の指定は NULL にした状態でのデバッグです。

仮に HWND の引数に、(親スレッドから新スレッドを起動する際に渡しておいた)
親ウィンドウのハンドルを指定したら、デバッグした途端にフリーズしてしまいました。


>>495
どういう事でしょうか?
498デフォルトの名無しさん:2009/03/14(土) 04:47:40
>>497
>476
499デフォルトの名無しさん:2009/03/14(土) 04:48:53
猫スレに逝けよ。
500デフォルトの名無しさん:2009/03/14(土) 04:50:51
はっきりと、スレ違いだ失せろって言われないと理解できないアホなんだろ
501497:2009/03/14(土) 04:52:24
すみません、メニューのIDに存在しないIDを入れていました。
NULLとしたらちゃんと子ウィンドウの WM_CREATE まで入りました。
が、この WM_CREATE 内で試しに無限ループさせてみたところ
アプリケーション起動時にフリーズしました。

WM_CREATE:
int i = 0; // デバッグでここにすら到達する前にフリーズしました
while (1)
i++;

別スレッドでウィンドウを作ったはずなのですが・・・
502デフォルトの名無しさん:2009/03/14(土) 04:53:07
>>501
>498-500
503デフォルトの名無しさん:2009/03/14(土) 04:54:50
>>498-500
マルチスレッドについて議論されていたので
このスレで訊かせていただきました。
答えていただいた方のみに感謝します。
504デフォルトの名無しさん:2009/03/14(土) 04:59:42
>>503
で、あなたは今時WinアプリをCde書いていたんですか?
505473:2009/03/14(土) 04:59:45
>>503
どこで質問するのがいいんですかね。
「Win32API質問箱」
「マルチスレッドプログラミング相談室」
あたりかなあ。
506隔離スレへどうぞ:2009/03/14(土) 05:00:47
507503:2009/03/14(土) 05:07:14
>>504
C++⊆C と捉えていました。
すみません。

>>505-506
ありがとうございます。
マルチスレッドプログラミングスレもあったのですか…
スレッド検索が足りませんでした。
猫を参考にして書いてもいますが、猫とは少し違う話だと
思われます。ご提示ありがとうございます。
508デフォルトの名無しさん:2009/03/14(土) 05:10:05
自分に都合のいいレスしか受け入れられないような奴はどんな分野でも伸びない。
509デフォルトの名無しさん:2009/03/14(土) 05:13:17
>>508
ちゃんとみんなにレスしてんじゃん
510デフォルトの名無しさん:2009/03/14(土) 12:14:04
すいません宿題手伝ってください。
要素数10個の整数配列を用意します。要素を入力し、バブルソートを用いて昇順にソートを行うプログラムを作成しなさい。
お願いします。
511デフォルトの名無しさん:2009/03/14(土) 12:51:05
「手伝う」の意味わかってんのか
512デフォルトの名無しさん:2009/03/14(土) 12:58:08
なんか「週末に適当なスレに丸投げするヤツ」って言葉遣いが似てるな。
ゆ○とり世代ってヤツ?
513デフォルトの名無しさん:2009/03/14(土) 13:16:16
>>512
○には何が入るの?
514デフォルトの名無しさん:2009/03/14(土) 13:28:35
>>510
>>1を読め
515デフォルトの名無しさん:2009/03/14(土) 13:30:52
   _,,....,,_  _人人人人人人人人人人人人人人人_
-''":::::::::::::`''>    ゆっとり世代ってね!!!   <
ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
 |::::::;ノ´ ̄\:::::::::::\_,. -‐ァ     __   _____   ______
 |::::ノ   ヽ、ヽr-r'"´  (.__    ,´ _,, '-´ ̄ ̄`-ゝ 、_ イ、
_,.!イ_  _,.ヘーァ'二ハ二ヽ、へ,_7   'r ´          ヽ、ン、
::::::rー''7コ-‐'"´    ;  ', `ヽ/`7 ,'==─-      -─==', i
r-'ァ'"´/  /! ハ  ハ  !  iヾ_ノ i イ iゝ、イ人レ/_ルヽイ i |
!イ´ ,' | /__,.!/ V 、!__ハ  ,' ,ゝ レリイi (ヒ_]     ヒ_ン ).| .|、i .||
`!  !/レi' (ヒ_]     ヒ_ン レ'i ノ   !Y!""  ,___,   "" 「 !ノ i |
,'  ノ   !'"    ,___,  "' i .レ'    L.',.   ヽ _ン    L」 ノ| .|
 (  ,ハ    ヽ _ン   人!      | ||ヽ、       ,イ| ||イ| /
,.ヘ,)、  )>,、 _____, ,.イ  ハ    レ ル` ー--─ ´ルレ レ´
516デフォルトの名無しさん:2009/03/14(土) 15:05:32
言ったでしょ? 丸投げ当然、ゆとり世代ってね
517デフォルトの名無しさん:2009/03/14(土) 15:14:27
>>513
U+200B
518デフォルトの名無しさん:2009/03/14(土) 16:15:30
>>510
バブルソートしてくれる関数を出力するプログラムでも。

#include <stdio.h>
#include <stdlib.h>
static void print_bsort(int n)
{
 int i,j;
 printf("void bsort%d(int *a)\n{\n int b;\n",n);
 for(i=0;i<n-1;++i){
  for(j=i+1;j<n;++j){
   printf(" a[%d]>a[%d]&&(b=a[%d],a[%d]=a[%d],a[%d]=b);\n",i,j,i,i,j,j);
  }
 }
 printf("}\n");
}
int main(int argc, char **argv)
{
 int n;
 if(argc!=2) return -1;
 n = atoi(argv[1]);
 print_bsort(n);
 return 0;
}
519デフォルトの名無しさん:2009/03/14(土) 16:16:55
ある参考書に載っていた以下のプログラムについての質問です。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8970.txt

この中の
while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
の箇所で、整数の 1000 ではなく、小数の 1000.0 を使うことに
何か意味はあるのでしょうか?

というのは、
1000.0 * (c2 - c1) / CLOCKS_PER_SEC の結果が小数になるとしても、
xは整数なので
1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x …(A:小数) の判定結果と
1000 * (c2 - c1) / CLOCKS_PER_SEC < x …(B:整数) の判定結果は
c2, c1, CLOCKS_PER_SECの値によらず変わらないと思うからです。
(ただし、(A:小数)の計算にかかる時間と
(B:整数)の計算にかかる時間は同じと仮定しています。)

またこれに付随して確認ですが、
(B:整数)に比べて(A:小数)の計算に極端に時間がかかる環境の場合、
(A:小数)の方がsleep関数の精度は劣りますよね?

(プログラムに関して、clock_t型はunsignedと同義の場合もあれば
signed long intと同義の場合もあると思いますが、処理系依存と考えてください。
CLOCKS_PER_SECも1000の場合もあれば
それ以外の場合もあると思いますが、処理系依存と考えてください。)
520デフォルトの名無しさん:2009/03/14(土) 16:33:23
>>518さんdクスです。
521デフォルトの名無しさん:2009/03/14(土) 16:40:33
>>518
ミスった。下ね。
 for(i=0;i<n;++i){
  for(j=1;j<n-i;++j){
   printf(" a[%d]>a[%d]&&(b=a[%d],a[%d]=a[%d],a[%d]=b);\n",j-1,j,j-1,j-1,j,j);

>>520 このプログラムを使って宿題出すと×食らうから使っちゃだめだよ。

>>519 必要ないと思うけど、オーバーフロー対策かも。
522デフォルトの名無しさん:2009/03/14(土) 16:46:28
私の学校の課題もやってください。
キューを利用して、プリンタのプリントキューを再現したプログラム(以下に要点を記載)を作成しなさい。
"1”を入力するとキューにデータが追加され"2"を入力するとキューからデータが取り出される
キューが満杯になったり、空になったりした際はその旨をメッセージで表示する。
また、以下の関数を作成し、使用しなさい。
vaio enqueue(int val)キューにデータを追加する
vaio dequeue() キューからデータを取り出す
vaio queue_print()キュー全内容を表示する
以上ですお願いします。


523デフォルトの名無しさん:2009/03/14(土) 16:47:13
宿題スレ行けよ
524デフォルトの名無しさん:2009/03/14(土) 16:53:54
いま宿題スレないんですよ
525デフォルトの名無しさん:2009/03/14(土) 16:55:47
526デフォルトの名無しさん:2009/03/14(土) 16:56:53
戻り値がvaioってちょっと面白かった。
527デフォルトの名無しさん:2009/03/14(土) 17:11:42
>>521さんdクスです。
528デフォルトの名無しさん:2009/03/14(土) 17:20:40
>>526
すみませんvaioではなくvoidでした。
529519:2009/03/14(土) 17:24:07
>>521
オーバーフロー対策について詳しく教えてもらいたいのですが。
小数の 1000.0 を使うことでオーバーフローが防げるのですか?
530デフォルトの名無しさん:2009/03/14(土) 17:29:42
doubleは整数より表現できる範囲が広いから
531デフォルトの名無しさん:2009/03/14(土) 17:58:18
>>519
CLOCKS_PER_SECが1000以上だと実数と整数じゃ、判定がちがってくるんじゃね?
532デフォルトの名無しさん:2009/03/14(土) 18:47:03
というよりほぼ100% 1000000だ
533デフォルトの名無しさん:2009/03/14(土) 19:12:37
>>532
MinGW gcc だと 1000
534デフォルトの名無しさん:2009/03/14(土) 19:27:22
最適化オプションなしでコンパイルしても移項してループ用の定数作るだろ
535デフォルトの名無しさん:2009/03/14(土) 19:33:43
>>534
何のための最適化オプションだよw
536デフォルトの名無しさん:2009/03/14(土) 20:08:21
今こそアジャイルを注目せよ
http://www.tech-arts.co.jp/news-and-topics/events/20081122.html
537デフォルトの名無しさん:2009/03/14(土) 21:09:13
538519:2009/03/14(土) 22:13:05
>>530
なるほど。わかりました。

ちなみに、1000.0 * (c2 - c1) / CLOCKS_PER_SEC における
1000.0 にはオーバーフロー対策以外の意味は
ないと考えてよいのでしょうか?

>>531
判定は変わらないと思います。
(間違っていたらどなたかご指摘ください)

【理由】
仮に CLOCKS_PER_SECが1000000、xが800とする。

このとき、プログラム実行後に
c1 = clock(); でc1に100000が代入されたとすると、
c2が899999以下の時までは
1000.0 * (c2 - c1) / CLOCKS_PER_SEC
1000 * (c2 - c1) / CLOCKS_PER_SEC
のどちらであってもwhile文の判定が成立するのでループが続く。

(なぜなら、c2が899999以下のとき
1000.0 * (c2 - c1) / CLOCKS_PER_SEC <= 799.999000 < x
1000 * (c2 - c1) / CLOCKS_PER_SEC <= 799 < x
であり、どちらもx==800より小さいので)

c2が9000000になると、どちらもwhile文の判定が不成立になる。
539デフォルトの名無しさん:2009/03/14(土) 22:50:30
質問です

JAVAには配列の大小を分別できるmax,minメソッドがあるけど
C言語にはそういう専門な関数はないんでしょうか?
540デフォルトの名無しさん:2009/03/14(土) 22:53:45
配列の大小?
文字列の比較ならstrcmpだが
541デフォルトの名無しさん:2009/03/14(土) 23:06:32
数値の大小を比較する関数です

C言語は文字列の比較の関数はみたことありますが、
数値の大小を比較する関数はみたことないので。

542デフォルトの名無しさん:2009/03/14(土) 23:14:56
○プログラム例
/* MINMAX.C: __max関数、__min関数を使用して、2 つの数値の大小を
* 求め、表示します。 */

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

void main( void )
{
int a = 10;
int b = 21;

printf( "%d と %d の大きい方は %d です。\n", a, b, __max( a, b ) );
printf( "%d と %d の小さい方は %d です。\n", a, b, __min( a, b ) );
}

○出力
10 と 21 の大きい方は 21 です。
10 と 21 の小さい方は 10 です。
543デフォルトの名無しさん:2009/03/14(土) 23:16:03
#define min(a, b) (((a) < (b)) ? (a) : (b))
544デフォルトの名無しさん:2009/03/14(土) 23:24:10
min(a++, b--)
545デフォルトの名無しさん:2009/03/15(日) 00:30:14
Perlの一番使いやすい開発環境を教えてください。
546デフォルトの名無しさん:2009/03/15(日) 00:53:50
スレ違い
547デフォルトの名無しさん:2009/03/15(日) 02:02:38
エアコンが効いてて静かな屋内。
548デフォルトの名無しさん:2009/03/15(日) 02:33:03
一番の開発環境は納期前日であること
549デフォルトの名無しさん:2009/03/15(日) 02:52:33
>>539
なければ作るのがCです
用意されたものを使うしか出来ない人間には向いていません
550デフォルトの名無しさん:2009/03/15(日) 12:25:10
> なければ作るのがCです

ないのを確認せずに作るのは問題だがな
551デフォルトの名無しさん:2009/03/15(日) 12:47:07
C言語プログラマカッコヨス
一々考え方がしっかりしていてまじ尊敬できる
俺も早くあなたたちみたいになる為に勉強しなくては
552デフォルトの名無しさん:2009/03/15(日) 13:09:43
ならないほうが人生をエンジョイできる
553デフォルトの名無しさん:2009/03/15(日) 13:30:47
>>551
それほどでもない
554デフォルトの名無しさん:2009/03/15(日) 13:46:52
素人には決して越える事の出来ない
ポインタの壁を乗り越えた勇者さまだからな
555デフォルトの名無しさん:2009/03/16(月) 13:51:24
>>551
C++プログラマも、ちゃんと極めている人はカッコイイよ。
Cプログラマーも、オブジェクト指向プログラミングがまともに理解出来ずC++が使えないバカじゃなくて、
その他の言語もばっちし使えるのにC言語を愛して使い続ける人がカッコイイ。
556デフォルトの名無しさん:2009/03/16(月) 14:46:21
質問です。今、gnuのcatのスクリプトを読んでいるのですが
main関数の中にあるinitialize_main関数が見付かりません。
cat.cでincludeされているヘッダーファイルしか読んでいませんので
更にヘッダーファイルのヘッダーファイルをたどっていけばたぶん見付かると思いますが
めんどくさくてそこまでやる気がしません。
皆さんはそのファイル内に関数が見付からないときどうやって探していますか?
またもしcat.cなど説明してくれているドキュメントがあれば教えていただきたいです。
557デフォルトの名無しさん:2009/03/16(月) 14:49:35
>>556
grep
558デフォルトの名無しさん:2009/03/16(月) 15:27:48
grepは一昔前の環境を使うなら必須ツールの一つだな
今はIDEが追跡してくれるけどそれでもよく使う
559デフォルトの名無しさん:2009/03/16(月) 17:17:35
g/Regular Expression/p
560デフォルトの名無しさん:2009/03/16(月) 17:58:13
Global Regular Expression Print
561デフォルトの名無しさん:2009/03/16(月) 17:59:45
>>556
> 質問です。今、gnuのcatのスクリプトを読んでいるのですが
                  ~~~~~~~~
> めんどくさくてそこまでやる気がしません。
562デフォルトの名無しさん:2009/03/16(月) 18:23:53
ためしにcoreutils持ってきて見たけど、src/system.hで
/* Redirection and wildcarding when done by the utility itself.
Generally a noop, but used in particular for native VMS. */
#ifndef initialize_main
# define initialize_main(ac, av)
#endif
だとさw
563デフォルトの名無しさん:2009/03/16(月) 18:25:20
つーかcat.cでもsystem.hはインクルードしてるのにな。
564デフォルトの名無しさん:2009/03/16(月) 18:27:50
まさかコマンドでファイルの中の文字を検索出来るとは思いませんでした。。
ありがとうございました。
565デフォルトの名無しさん:2009/03/16(月) 18:43:36
すみません。
正直、その行は見つけていました。書いておくべきでした。
(ac,av)の右側に処理も何も書いてないので
理解できなくて他のところに処理が書いてあるのだろうと思っていました。
cat.cの中でacとavにはアドレスを渡しているのですが
この場合、どうなるのでしょう。
566デフォルトの名無しさん:2009/03/16(月) 19:25:02
何も書いてないんだから
コンパイルの時にはプリプロセッサの段階で消える
567デフォルトの名無しさん:2009/03/16(月) 21:20:43
#ifndefはマクロ定義が行われていなければ#ifndef #endif内の処理をするんですよね。
だからこの場合はinitialize_mainがマクロ定義されていなければ
#define initialize_main(ac,av)を定義する。
うーん。一応coreutilsディレクトリ以下と/usr/includeディレクトリ以下は全部
確認したけど#define initialize_mainなんてなかったしなんで
#ifndef #define initialize_main(ac,av) #endifなんて処理するんだろう。
むずかしい。上記のディレクトリ以下以外にも読み込んでるファイルがあるんですかね
568デフォルトの名無しさん:2009/03/16(月) 22:36:01
コンパイルオプションでdefineを指定する場合もあるから要注意だぜ

-define initialize_main みたいにするコンパイラもある
569デフォルトの名無しさん:2009/03/16(月) 22:36:21
引数に関しての質問です
123/456 のような形式で入力を受け取り
それぞれを数字として解釈してから出力するコードを書きたかったのですが
以下のエラーが出てしまいます。
--
hoge.c:9: error: conflicting types for 'getnumto'
hoge.c:9: note: an argument type that has a default promotion can't match an empty parameter name list declaration
hoge.c:5: error: previous implicit declaration of 'getnumto' was here
--
「引数の型がマッチしない」と言われているので
自分がchar の型の使い方を間違えてるのだと思います。
でも、どう間違えてるかがわかりません。

char とは内部的には整数で表される 1byte の文字列だと理解してるのですが、間違えているのでしょか?
以下がエラーを起こすコードです。
#include <stdio.h>

main (){
int n1,n2;
n1 = getnumto('/');
n2 = getnumto('\n');
printf("%d/%d\n",n1,n2);
}
int getnumto(char s){
int n = 0;
char c;
while ((c=getchar())!= s){
n *= 10;
n += c-'0';
}
return n;
}
570デフォルトの名無しさん:2009/03/16(月) 22:39:47
>>569
プロトタイプを忘れてる
571デフォルトの名無しさん:2009/03/16(月) 22:40:33
>>569
言っていることはあっているけど、getcharはint型を返す。
なぜなら、charのどの値とも異なるEOFを返す可能性があるので、char型にできないため。
572デフォルトの名無しさん:2009/03/16(月) 22:41:00
int getnumto(char s);
二行目あたりに↑これ入れる。
573デフォルトの名無しさん:2009/03/16(月) 23:18:08
>>570-572
ありがとうございます。期待通りの動作をするようになりました。

プロトタイプ宣言の必須条件がわからなかったため
検索をかけて調べたところ
「関数の記述より前で使用されているなら宣言する必要がある」とありました。

ですが、今回書いたプログラムでは getnumto(char s) の下に
実際はもうひとつ最大公約数を求める gcd(int n1, int n2) を書き、
main() から呼び出していましたがエラーが出ませんでした。

http://ja.wikipedia.org/wiki/関数プロトタイプ
>左括弧付きで式の中に現われた場合、その関数は暗黙のうちに int を返すものと判断され、

これは上記のサイトの内容から判断するに
引数が int のみで構成される場合は
プロトタイプ宣言は必須ではないためエラーがでなかった、ということでしょうか?
574デフォルトの名無しさん:2009/03/16(月) 23:25:49
>>573
正しくないプログラムに対しては、エラーも警告も出る保証がない
エラーや警告が出ないプログラムが正しいとは限らないということだ
575デフォルトの名無しさん:2009/03/16(月) 23:36:26
>>574
なるほど、ありがとうございます。
常にプロトタイプを忘れないように気をつけることにします。
576デフォルトの名無しさん:2009/03/16(月) 23:40:02
>>573
関数宣言はかならずするようにしてるんで、プロトタイプなしで
関数をコールしたときの仕様って、よく憶えてないけど、
最初に

n1 = getnumto('/');

でコールしてるから、引数がintだと解釈されて、そのごに
(文字定数の型はcharじゃなくてint)

int getnumto(char s)

と定義してるから型がちがうってエラーになってるんじゃないの?
577デフォルトの名無しさん:2009/03/16(月) 23:50:02
> 引数がintだと解釈されて

ダウト
578デフォルトの名無しさん:2009/03/16(月) 23:54:06
じゃあ何?
579デフォルトの名無しさん:2009/03/16(月) 23:59:32
今日はもう寝るぞ
580デフォルトの名無しさん:2009/03/17(火) 00:01:03
クスッ
581デフォルトの名無しさん:2009/03/17(火) 00:01:14
整数は int として、浮動小数点数は double として、ポインタはそのままポインタとして
引数に渡る

sizeof(int) != sizeof(void*) の系で、かつ可変引数の部分に
NULL のつもりでリテラルの 0 を渡すとハマルぜ
# NULL の定義が不安な場合には (void*)0 と明示的にポインタ指示することもある
582デフォルトの名無しさん:2009/03/17(火) 00:01:28
事前にプロトタイプあるいは関数本体で「正しい」形式を与えていないかぎり、
いつも暗黙にintになる
583デフォルトの名無しさん:2009/03/17(火) 00:05:46
>>569 がエラーになるわけは?
584デフォルトの名無しさん:2009/03/17(火) 00:08:49
英語ぐらい読め
585デフォルトの名無しさん:2009/03/17(火) 00:41:47
教えてください。
新規ファイルへ書き込みを行ないたいのですが、fprintfで可能なのでしょうか?
586デフォルトの名無しさん:2009/03/17(火) 00:49:21
もちろん出来る。
つーか printf でも何でも OK.
587デフォルトの名無しさん:2009/03/17(火) 00:56:43
printfでもファイルへの書き込みが出来るんですか!?
勉強になります。
ありがとうございました。
588デフォルトの名無しさん:2009/03/17(火) 01:02:13
すいません。教えて下さい。
文字列からstrstrにて検索した文字の書換えを行ないたいのですが、
一般的にはどの様な方法をとるものなのでしょうか?
よろしくお願いします。
589デフォルトの名無しさん:2009/03/17(火) 01:17:51
memcpy3つ
590デフォルトの名無しさん:2009/03/17(火) 01:24:07
おーありがとうございます。
591デフォルトの名無しさん:2009/03/17(火) 01:47:42
>>568
コンパイラオプション初めて知りました。
#ifndef initialize_main
これって関数ではなくて変数ですよね。仮にこの変数が宣言されていたら
関数の宣言がされないからエラーでますよね。。。
ここはスルーした方がよさそうですね。
皆さんありがとうございました。
592デフォルトの名無しさん:2009/03/17(火) 02:06:58
変数だと…
593デフォルトの名無しさん:2009/03/17(火) 02:18:45
これはひどい
594デフォルトの名無しさん:2009/03/17(火) 02:20:29
すいません。変数といういい方はおかしいですね。
595デフォルトの名無しさん:2009/03/17(火) 02:24:05
そもそも「変数」って訳自体が不適切だからな。
596デフォルトの名無しさん:2009/03/17(火) 02:38:25
>>595
vaeiable=変数
適切だと思うが
597デフォルトの名無しさん:2009/03/17(火) 02:41:12
598デフォルトの名無しさん:2009/03/17(火) 02:46:59
だめだ、俺にc++は向いてないわ・・・
599デフォルトの名無しさん:2009/03/17(火) 02:52:51
>>598
STLを使うだけでも価値があるさ
600デフォルトの名無しさん:2009/03/17(火) 03:42:01
vaeiable の検索結果 約 119,000,000 件中 1 - 10 件目 (0.13 秒)

こんなにバカがいるのか。。。なさけないわ
601デフォルトの名無しさん:2009/03/17(火) 03:58:22
>>600
ただのタイプミスだろ
eとrはキーボードでとなり同士だから

それをわざわざgoogleで検索するバカもなさけない
602デフォルトの名無しさん:2009/03/17(火) 04:49:12
ルイズ・フランソワーズ・ル・ブラン・ド・ラ・vaeiable
603デフォルトの名無しさん:2009/03/17(火) 07:30:45
http://www.ncos.co.jp/products/cgi-bin/e000.cgi?405
にあるように

foo[10] = {0}

と配列を初期化してgccでコンパイルしたら
"variable-sized object may not be initialized"のエラーになっちゃったんですが

この初期化方法は今はダメなんでしょうか?
604デフォルトの名無しさん:2009/03/17(火) 07:35:50
本当にfoo[10]って書いたか?
605デフォルトの名無しさん:2009/03/17(火) 07:42:03
>>604
すいません…。
その部分だけのコードを書いたら通りました。
別の所が原因みたいです。
606デフォルトの名無しさん:2009/03/17(火) 07:45:18
可変長配列を初期化しようとしてんだろ
607603:2009/03/17(火) 07:45:45
>>604
この状態で出ました。
回避方法はありますか?
main (){
hoge(10);
}
int hoge(int n){
int foo[n] = {0};
}
608デフォルトの名無しさん:2009/03/17(火) 07:47:06
>>607
・諦める。
・C99を使う。
・malloc()の使い方を学ぶ。
・c++でnewを(r
609デフォルトの名無しさん:2009/03/17(火) 07:56:36
Cで動的配列だと・・・?

int *pi;
pi = (int *)calloc(n, sizeof(int));
free(pi);

が定石じゃね
610603:2009/03/17(火) 07:56:54
>>608
int *foo = malloc(n*sizeof(int));
としたら確保はできたようなんですが
この場合初期化の {0} が呼び出せず
どうすれば良いのかわかりません…。
611デフォルトの名無しさん:2009/03/17(火) 08:02:53
そこはcallocだろw
612デフォルトの名無しさん:2009/03/17(火) 08:24:22
ANSI準拠じゃないけど、その程度の動的配列なら_allocaが適してる
初期化は

memset(pi, 0, n * sizeof(int));
613デフォルトの名無しさん:2009/03/17(火) 10:08:30
>>610
半可通の俺が答えてやんよ!

{0}はリテラル。コンパイル時に静的な処理を行う。
左辺がサイズを指定した配列として宣言してなきゃ、
コンパイラが初期化することができない。

どうだ! つっこみどころまんさいだろう!
614デフォルトの名無しさん:2009/03/17(火) 10:11:24
>>591
もういないのかもしれんが、これは同じものを2回defineしないための処置
次の行のdefineでinitialize_main()の呼び出しそのものが消える
よってinitialize_main()関数はどこにもない。英語のコメントも読めよ。
615デフォルトの名無しさん:2009/03/17(火) 10:13:27
ってVMS知らないと読んでもわからんか
616デフォルトの名無しさん:2009/03/17(火) 10:51:03
>>614 >>615
ありがとうございます。いますよ。
消えるって言うのがよくわからんです。cat.cにあるinitialize_main(&wasu,&reta)
も消えるんですか?
コンパイル時に処理が書いてないから自動的に消してくれるということ?
まず消される運命なら書く必要ない気が(noopが関係してるのかな?)

もちろん英語の文だって翻訳しましたよ。でも
「リダイレクションとユーティリティ自体ですると、wildcardingします。
一般にnoopにもかかわらず、特にネイティブのVMSにおいて、使用されています。」
こんな翻訳され。しても意味がわかりません。
まあ冗談はおいといて上の行は単語の意味は知ってますが意味は理解できませんでした。
noop、VMSは知らなかったですね。
調べてnoopはなんとなくですがわかりましたがVMSはよくわかりませんでした。
どうやらもっとハードの方も勉強しなきゃいけないみたいです。
というわけで下の方もソースも読んでいってわからないところは無視するか
ソースを読むこと自体あきらめようと思います。

皆さんありがとうございました。
617デフォルトの名無しさん:2009/03/17(火) 11:16:56
/* Redirection and wildcarding when done by the utility itself.
Generally a noop, but used in particular for native VMS. */

ユーティリティ自身がリダイレクトやワイルドカードの処理をするための関数がinitialize_main()なんだろ。
通常は使わないが、VMSでは使うってこった。
618デフォルトの名無しさん:2009/03/17(火) 11:18:25
ハードなんかちっとも関係ないね。通常は要らない関数ってことでしょ。
619デフォルトの名無しさん:2009/03/17(火) 11:51:22
>>616
自分で訳すんだよ
この程度の英語が読めないようじゃだめだろう
620デフォルトの名無しさん:2009/03/17(火) 11:57:56
勉強始めたいんですが、
C言語の無料で使えるコンパイラで良いのないでしょうか?
入門書買ったけど覚えが悪いのでコンパイラに実際に書きながら練習したいです。
621デフォルトの名無しさん:2009/03/17(火) 11:58:15
英語の説明文ばかりだしやっぱり英語はやるべきですね。
学校の英会話教室行く&自分なりに勉強しようと思います。
こんな時間に返事をしてくれるということは皆さんニー・・・
学生ですよね?院生でなければ自分と同じか下なのに自分なんかより色々な知識を持っていて羨ましいです。
ハードはいらないとのことですが最近はハード関連の本読んでないしひさしぶりに読んでみようと思います。
622デフォルトの名無しさん:2009/03/17(火) 12:03:01
>>620
Windowsなら
VisualC++2008 ExpressEditionでいいんじゃない
623デフォルトの名無しさん:2009/03/17(火) 12:07:13
>>621
悪いが社会人だ。つーか、他人の詮索すんなや。
英会話教室に行くこと自体は止めないが、資料を読むのが目的なら殆ど役に立たないぞ。
大抵、英文法の教え方の研修も受けていない「英会話の専門家」が相手なんだから。

>>620
CUIが苦にならないならcygwin、独特の癖のあるGUIが苦にならないならVisualStudio2008。
624デフォルトの名無しさん:2009/03/17(火) 12:19:49
>>622
>>623
ありがとうございます!
パソコンWindowsで入力も苦手なので、
教えていただいた、
VisualC++2008 ExpressEditionかVisualStudio2008のどちらかにしようと思います。
625デフォルトの名無しさん:2009/03/17(火) 13:00:21
>>620
実際に打ちながら勉強するのは普通だよ
特に初めてプログラミングをするなら必須であるといってもいい
626デフォルトの名無しさん:2009/03/17(火) 14:40:48
>>624
StudioってのはC++やBASICやC#なんかのセットだからCやりたいのならC++だけでいいよ
627デフォルトの名無しさん:2009/03/17(火) 14:54:27
つーかexpressエディションないだろ
628デフォルトの名無しさん:2009/03/17(火) 15:00:27
629デフォルトの名無しさん:2009/03/17(火) 15:09:33
XPのプロンプトで渡した引数ってShiftJISですよね?
これをUnicodeに変換してwchar_tの配列に格納したんですけど、やり方がよくわかりません
630デフォルトの名無しさん:2009/03/17(火) 15:10:00
>>628
うん、無いよねw
631デフォルトの名無しさん:2009/03/17(火) 15:16:03
Unicodeを扱いたいならJavaオヌヌメ
632デフォルトの名無しさん:2009/03/17(火) 15:23:54
>>629
GetCommandLineW
CommandLineToArgvW
633デフォルトの名無しさん:2009/03/17(火) 15:24:33
Visual Studio 2008 発売 1 周年を記念して、Visual Studio 2008 Professional Edition のアップグレード対象に Visual Studio 2008 Express Edition が加わりました。この機会に是非上位エディションへの移行をご検討ください。(2009 年 2 月 2 日)
634デフォルトの名無しさん:2009/03/17(火) 15:37:09
>>629
int wmain(int argc, wchar_t* argv[])
635634:2009/03/17(火) 15:42:34
#include <windows.h>
が必要です
636デフォルトの名無しさん:2009/03/17(火) 15:57:15
>これをUnicodeに変換してwchar_tの配列に格納したんですけど、やり方がよくわかりません
変換もできて、格納もできて、なんの遣り方が判らないんだ?
637デフォルトの名無しさん:2009/03/17(火) 16:06:28
>>636
それはエスパー検定1級の問題です
638デフォルトの名無しさん:2009/03/17(火) 17:29:30
639デフォルトの名無しさん:2009/03/17(火) 19:15:25
>>635
wmainを使うだけならwindows.hは要らないぞ。
632ならともかく。
640デフォルトの名無しさん:2009/03/17(火) 19:33:35
>>637
この前ぐぐってたら、telephacy?なんとかって掲示板が引っ掛かって、
外国にもエスパースレあるのかと、勝手に解釈して和んだ。
641603:2009/03/17(火) 19:59:59
>>612-613
ありがとうございました。m(__)m
642デフォルトの名無しさん:2009/03/17(火) 21:40:30
locale設定がうまくいきません
setlocale(LC_ALL, "")
setlocale(LC_ALL, "japanese_japan.932")
はうまくいったんですが、ためしに文字コードをUTF-8に変えてみようと
setlocale(LC_ALL, "japanese_japan.65001")
にすると失敗します
なにがいけないんでしょうか?
643デフォルトの名無しさん:2009/03/17(火) 21:43:44
エラーコードとか取得できるだろ。
644デフォルトの名無しさん:2009/03/17(火) 22:51:41
お聞きしたいことがあるのですが、

共有メモリにアタッチした時に返ってくるアドレスが
プロセス毎に違うのはなぜなんでしょうか?
645デフォルトの名無しさん:2009/03/17(火) 23:03:18
プロセスごとに未使用メモリ空間が違うからだろう
646デフォルトの名無しさん:2009/03/17(火) 23:04:42
>>644
同じ場所に読み書きしてるはずなのに・・・・って言う点なら
C上で(というかOS上で)扱うのはメモリの実際の番地ではない仮想アドレスというものだから
647デフォルトの名無しさん:2009/03/17(火) 23:23:27
>>644
プロセスごとに仮想アドレスと物理アドレスの対応表を持っているからです。
648644:2009/03/17(火) 23:28:08
ありがとうございます。

作成した共有メモリ → 物理メモリアドレス空間
プロセス内でアタッチした共有メモリ → プロセス毎に割り当てられた仮想メモリアドレス空間
という認識でおk?

で、>>647の対応表を用いて書き換えてるわけですね。
649デフォルトの名無しさん:2009/03/17(火) 23:34:52
仮想記憶でggr
DOSの頃は物理アドレス叩けたんだけど・・・
650デフォルトの名無しさん:2009/03/17(火) 23:37:26
プロセスごとに仮想アドレスと仮想アドレスの対応表があって
さらに専用ハードウェアが仮想と物理アドレスを対応してるんじゃないの?
651デフォルトの名無しさん:2009/03/17(火) 23:54:20
>>648
どんな環境か知らないけど、共有メモリってのはいわゆるファイルマッピングのことでしょ。
ファイルマッピングで調べてみ。

>>650
専用ハードウェアっていうかCPUが変換を行っている。
また、実行中プロセスのページディレクトリの先頭アドレスはレジスタに格納されている。
652デフォルトの名無しさん:2009/03/18(水) 00:14:40
>>621
久々に見たらなんか失礼なことほざいているな。
自分がニート同然だから言ってるのか?
全く・・・。
653デフォルトの名無しさん:2009/03/18(水) 00:24:04
>>651
MMUってひょっとしてCPUの一部?
654デフォルトの名無しさん:2009/03/18(水) 00:29:55
>>653
詳しくないけどとりあえずそれは違う
普通にマザーに乗ってるからMMU
655デフォルトの名無しさん:2009/03/18(水) 00:45:49
内蔵していたCPUもあるがな。
656デフォルトの名無しさん:2009/03/18(水) 01:02:28
CPU内とは限らないだろうが
マザーに載ってるってのはそうそう無いだろ。
657デフォルトの名無しさん:2009/03/18(水) 01:05:04
だって、レジスタ経由でのアドレッシングで得たリニアアドレスを
即物理アドレスに変換しなきゃいけないんだぜ。
普通はCPUが持ってるだろうし
そうでなくてもCPUと直結のコプロセッサ的なものに含まれるだろ。
658デフォルトの名無しさん:2009/03/18(水) 01:10:13
CPUもマザーに載ってるから広義ではマザーに載ってると言えなくもない。
659デフォルトの名無しさん:2009/03/18(水) 01:15:48
C言語の勉強法でソースコードをひたすら100回とか書けば覚えますか?
660デフォルトの名無しさん:2009/03/18(水) 01:18:03
>>659
写して弄って理解する
ネットを巡ればソースコードはいくらでも手に入る
661デフォルトの名無しさん:2009/03/18(水) 01:30:27
for(i = 0; i < 100; i++)
puts(code);

662デフォルトの名無しさん:2009/03/18(水) 01:30:41
>>660
アドバイスありがとうございます
663デフォルトの名無しさん:2009/03/18(水) 01:33:29
>>662
人のコードを見る。Cの文法を勉強する。
この両面から攻めればヨロシ。
664デフォルトの名無しさん:2009/03/18(水) 01:34:31
>>663
ありがとうございます。
やさしい方が多くてなんかうれしいなぁ
665デフォルトの名無しさん:2009/03/18(水) 01:41:43
>>664
ポインタに触れる、何かが覚醒する。
それは自分の無能かC言語の可能性か。
666デフォルトの名無しさん:2009/03/18(水) 10:36:04
C言語で2つのfloat型の最大値を求めたいんですが、
ひょっとして標準ではそういう関数は用意されていないんでしょうか?
自分でMax関数作らないとダメでしょうか?
667デフォルトの名無しさん:2009/03/18(水) 10:37:33
max = a > b ? a : b;
668デフォルトの名無しさん:2009/03/18(水) 10:37:33
fMax = (f1 > f2) f1 : f2;
669デフォルトの名無しさん:2009/03/18(水) 10:42:28
666です
自己解決しました
math.hをつかえばできるみたいですね
670デフォルトの名無しさん:2009/03/18(水) 11:50:19
超初心者です。

borlandのCを使って、WindowsAPIをいじることはできますか?

どうしてもC言語で音をいじりたいんですが、borlandでは無理ですかねえ。

Visual Cならできるんですか?

671デフォルトの名無しさん:2009/03/18(水) 11:53:19
>>670
できるよ
672デフォルトの名無しさん:2009/03/18(水) 12:10:43
>>671
本当ですか!???
C++ではなくCから音をいじれるんですか?

673デフォルトの名無しさん:2009/03/18(水) 12:15:39
音に関するAPIなんてあったか?w
674634:2009/03/18(水) 12:20:32
>>672
bcc55でもDirectsoundが使える
675デフォルトの名無しさん:2009/03/18(水) 12:43:41
まあbcc付属のツールでdllからインポートライブラリ作れるから
それ使えば他の環境と変わらないやりかたで作れるよ
676デフォルトの名無しさん:2009/03/18(水) 12:52:29
というかどうしてbccだからAPIが使えないなんて思うんだ
APIがなんだかわかってるのか?
ああここで聞くなよ
APIスレ行け
677デフォルトの名無しさん:2009/03/18(水) 13:13:26
ありがとうございます。

>>676
入門篇なんだから仕方ないじゃないか。
678デフォルトの名無しさん:2009/03/18(水) 13:20:37
ここはCの入門スレであってプログラミング全般とかWIN32APIとかの入門スレじゃありませんよ。
679デフォルトの名無しさん:2009/03/18(水) 13:35:26
>>674
670のレベルだとwaveOutくらいで十分な気がする。
680デフォルトの名無しさん:2009/03/18(水) 13:41:01
低レベルAPIは上級者が使うもんだと思うんだが
681デフォルトの名無しさん:2009/03/18(水) 13:46:38
音を弄る、という時点で低レベルが必要では。
どの程度いじるのかにもよるが
682670:2009/03/18(水) 13:51:14
>>678
ですので、C言語超初心者の俺がC言語で音やグラフィックをいじるにはどうしたらいいかを教えてほしかったんです。

>>679
waveファイルを鳴らすやつですか?
そういうのじゃなく、加算合成で音色を作ったりするのがやりたいです。
Max/mspなんかよりもプログラミング言語で作ったほうが面白そうだから。

例えば一番単純な例だけど、ランダムでmidiの音を鳴らしたりするプログラムはどんなやり方で作れますか?
683デフォルトの名無しさん:2009/03/18(水) 13:53:44
>>682
乱数生成はプログラム言語C標準ライブラリのsrand,rand関数
MIDI音源からの出力はwin32 APIのmidiOut関数
684デフォルトの名無しさん:2009/03/18(水) 13:58:24
>>678
という区別が付くレベルの人ばかりじゃない、ってことさ。

>>682
http://pc11.2ch.net/test/read.cgi/tech/1212409946/56
と同じ人?

>waveファイルを鳴らすやつですか?
・ファイルから波形データを読んで鳴らす
・メモリ上で波形データを作って鳴らす
同じこと。

いいからAPIスレ池。
685デフォルトの名無しさん:2009/03/18(水) 14:37:40
>ですので、C言語超初心者の俺がC言語で音やグラフィックをいじるにはどうしたらいいかを教えてほしかったんです。
まず初心者を脱してください
話はそれからです
686デフォルトの名無しさん:2009/03/18(水) 14:43:57
自動車学校に来て交通情報を聞くようなものだな
687デフォルトの名無しさん:2009/03/18(水) 14:55:48
>>670
超初心者だったら無理。
言語仕様とかライブラリとかそう言う問題じゃなくて経験的に無理。
688デフォルトの名無しさん:2009/03/18(水) 14:57:13
そもそも初心者がCを選択する時点で

他の言語やってから来なさいw
689デフォルトの名無しさん:2009/03/18(水) 15:03:51
必要な環境は必要に応じて導入すること。要するに、Windows用の
プログラムを作りたいなら、あれこれ考えずにMS製の開発環境を
購入しなさい。他人に聞いても、その言葉の意味を理解するまでに
時間が掛かるでしょ?
690デフォルトの名無しさん:2009/03/18(水) 16:08:33
つーか、midiファイルを作るだけならAPIなんて要らないけどな。
691デフォルトの名無しさん:2009/03/18(水) 16:52:16
>>688
だってー
このスレちゃんと「入門篇」って書いてあるじゃんかあ。

Javaならいいの?かえって難しい様な気がするよ。
他のはN88basicしかやったことない。こんなの実用性ないし

とりあえず無料でできるやつで高機能なやつって考えたらCになった。

>>690
そうではなくて、アルゴリズムに基づいてmidiを鳴らしてみたいのだ実験的に。
たとえば、すごく簡単なのだと、演歌のスタイルをあらかじめプログラミングしておいて、そのスタイルに沿ったランダム音楽を鳴らすとか。
そうやってバッハ風のランダム音楽とか、シェーンベルク風のランダム音楽とかできるでしょ。
とりあえずそれで実験してみたいのだ。
Cを使って。
692デフォルトの名無しさん:2009/03/18(水) 16:56:44
免許もってないのにドリフトしてーとか言われても困る。
693デフォルトの名無しさん:2009/03/18(水) 17:00:24
昔そういうのやったなー
俺はC#からWin32APIを使ったよ
Cよりは簡単
694デフォルトの名無しさん:2009/03/18(水) 17:21:13
>>691
貴方のような人を「身の程知らず」といいます
695デフォルトの名無しさん:2009/03/18(水) 17:23:35
>>691
とりあえずmmlを経由すれば簡単
696デフォルトの名無しさん:2009/03/18(水) 17:42:49
>>691
だから、midiを鳴らすのは既存アプリでいいだろ。
免許のアナロジーで言うなら、宅配便の集配所まで原ちゃりで荷物を持っていくようなもんだ。
697デフォルトの名無しさん:2009/03/18(水) 18:47:48
MIDIが何か分かってて聞いてるのか、よく知らないで聞いてるのかで
答えが大きく変わるなw
698デフォルトの名無しさん:2009/03/18(水) 21:38:13
平日の昼間からageで無知な書き込みを連発してる時点で察してやれよ
699デフォルトの名無しさん:2009/03/18(水) 21:53:45
前半部分は不要。
700デフォルトの名無しさん:2009/03/19(木) 00:39:51
>>697
あげてるのはすべてつり。
WinAPIスレでも見かけたが、相手にされなくなって移動してきているんだろう。
701デフォルトの名無しさん:2009/03/19(木) 02:38:21
>>700
ああ、つまり重症ってことか。
702デフォルトの名無しさん:2009/03/19(木) 15:22:24
ポインタはどうやって学ぶべきか part2
http://pc11.2ch.net/test/read.cgi/tech/1217147291/
703デフォルトの名無しさん:2009/03/19(木) 20:09:31
size_tとかint32_tの_tってなんなの?
704デフォルトの名無しさん:2009/03/19(木) 20:12:16
typedef
705デフォルトの名無しさん:2009/03/19(木) 22:18:13
>>703
標準Cでは言及がないけどPOSIXでは言及があるらしい。
>>704の言うとおり。
706デフォルトの名無しさん:2009/03/20(金) 03:27:42
ただのtypeだと思ってたけど違うんだ
707デフォルトの名無しさん:2009/03/20(金) 04:11:31
typeに一票
708デフォルトの名無しさん:2009/03/20(金) 07:32:45
POSIX.1 (IEEE Std 1003.1)
709634:2009/03/20(金) 09:16:57
typedefで定義されていて本来の型は別にあるということか
710デフォルトの名無しさん:2009/03/20(金) 09:45:25
wchar_tがC++の予約語ってのは笑止の極み
711デフォルトの名無しさん:2009/03/20(金) 09:49:29
こんな記述もある(これが正確な情報とは限らないが)

ttp://www.wdic.org/w/TECH/wchar%EF%BC%BFt

この_tは、typedefであることの目印である。

_tが付いているが、C++においてはこれは組み込み型の予約語であり、typedefではない。
このような奇妙な名になったのは、Cの遺物といえる。
712デフォルトの名無しさん:2009/03/20(金) 10:08:03
なんで予約語にしちゃったカナ
713デフォルトの名無しさん:2009/03/20(金) 18:42:34
逆に、なんでCは予約語にしなかったかなと思っていた。

この前どこかで、long charとして入れようとしたけど期限がぎりぎりだからtypedefでお茶を濁したという話を見た。
714デフォルトの名無しさん:2009/03/20(金) 19:26:06
そろそろ入門を外れてきたので突っこんだ話はこちらで

【初心者お断り】ガチ規格準拠C専用スレ Part133
http://pc11.2ch.net/test/read.cgi/tech/1201153965/
規格スレ
http://pc11.2ch.net/test/read.cgi/tech/1235468462/
715デフォルトの名無しさん:2009/03/20(金) 19:32:44
ま、_tがtypedefされたものである印
の真偽はともかく
現状そう捉えて差し支えなさそう
716デフォルトの名無しさん:2009/03/21(土) 04:26:53
SDLでゲーム作成の勉強で参考になる本ってありますか?
717デフォルトの名無しさん:2009/03/21(土) 04:31:38
あんまりありません
718デフォルトの名無しさん:2009/03/21(土) 04:39:16
>>717
なにかいい勉強方法などありますか?
719デフォルトの名無しさん:2009/03/21(土) 04:42:18
自分で調べ、考えることが最高の勉強法です
720デフォルトの名無しさん:2009/03/21(土) 08:53:18
CとC++とJavaって並行で学習するのって有害?
721デフォルトの名無しさん:2009/03/21(土) 08:54:52
本人の能力次第
722デフォルトの名無しさん:2009/03/21(土) 08:56:55
>>720
それぞれの違いを意識しながらやれば問題ない
723デフォルトの名無しさん:2009/03/21(土) 08:59:36
>>720
既に習得しているプログラミング言語がない(プログラミング言語の学習自体が初めて)レベルならやめといたほうがいい。
724デフォルトの名無しさん:2009/03/21(土) 09:03:19
>>720
JavaScriptと(C/C++/Javaの何れか)を同時学習するのは
中級者になる迄は絶対に避けたほうがいい。期間を分けてそれぞれ
独立に学習する。(行きつ戻りつせざるを得ないだろうが)
理由は変数という考え方が全然違うから。
725デフォルトの名無しさん:2009/03/21(土) 09:03:46
どれか1本に絞らないと混乱するだろうな
そういう質問をするレベルならJavaから入ったほうがいい
726デフォルトの名無しさん:2009/03/21(土) 09:09:15
>>720
大丈夫
少なくともJavaと言われてJavaScriptを持ち出すようなアフォにはならんw
727デフォルトの名無しさん:2009/03/21(土) 10:51:52
>>724
誰もJavascriptのことなんざ(ry
728デフォルトの名無しさん:2009/03/21(土) 11:40:05
聞いとらん
といいたいんだろうが、コンソールでチャットみたいにパタパタやって
プログラムが出来ると考える奴はオカシイと考える人は
テキストエディタでJavaScriptでコード書いてブラウザで表示させる
ことでプログラミングやりだした世代以降確実に増加する予定
Win95発売当時高校生だった世代は既に30代に突入しとるw
729デフォルトの名無しさん:2009/03/21(土) 11:46:26
>>728
そんな必死に言い訳しなくてもいいよ
730デフォルトの名無しさん:2009/03/21(土) 17:01:41
こんばんは!
731476:2009/03/21(土) 20:35:04
if(!*name[i])
break;
この条件なんですが、gets(name[i])で入力した値があったらbreakで終了するんですか?
本にはエンターを押したら終了っていうかんじで答えの場所にありました
エンターを押したら終了ぜんぜんよくわかりませんが
if(!*name[i])
break;
野意味教えてください
732デフォルトの名無しさん:2009/03/21(土) 20:45:37
またお前か
733デフォルトの名無しさん:2009/03/21(土) 20:55:08
何かよく分からんがマジレス
if(!*name[i])

if(*name[i] == '\0')
if(name[i][0] == '\0')
と等価
gets(name[i])
でEnterのみ入力すると
name[i][0]に'\0'が代入される
734476:2009/03/21(土) 20:58:27
733さん
すごいわかりやすい返答ありがとうございます
\0が入るとは思ってませんでした
回答ありがとうございました
735476:2009/03/21(土) 21:30:21
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100
void input(void);
int menu(void);
int i=0;
char title[MAX][80];
char name[MAX][80];
char pubs[MAX][80];
int main(void)
{
switch(menu())
{
case 1:input();
break;
}
return 0;
}
int menu(void)
{
int a;
do{
printf("\n*******select*****\n");
printf("1,title\n");
printf("2,search\n");
printf("3,book search\n");
printf("input:");
736デフォルトの名無しさん:2009/03/21(土) 21:31:19
初めて触ったのは横浜BitinnのTK85?です
737476:2009/03/21(土) 21:36:07
scanf("%d",&a);
}while(a<1 || a>3);
return a;
}
void input(void)
{
int u;
for(u=i; u<=MAX; u++){
printf("\nname input (Enter quit):");
gets(name[u]);
if(*name[u]=='\0')
break;
printf("title:");
gets(title[u]);
printf("pubs:");
gets(pubs[u]);
u++;
}
i=u;
}
これなんですが
int menu(void) のscanf("%d",&a);で入力した
aをreturnで返して
その1 menu()でcase 1:input(); をやろうとするのですが
うまく次の入力 図書情報を入れる場所までいかずにおわってしまいます
gets(a);
本にはint u; u=atoi(a);とかいてあって
わざわざ文字列の1aなど1などをatoi(整数)して渡すとうまく1の動作ができ入力できるのですが
なぜか整数のintのuに値をいれて 1を渡すと 1の入力の場所がでて入力できずに終わってしまいます
何故終了してしまうのか教えてください
738デフォルトの名無しさん:2009/03/21(土) 22:55:44
main関数を読むと
menu関数を呼ぶ
もし戻り値が1ならinput関数を呼ぶ
終了

main関数の中でループさせたかったのだろうと想像
739デフォルトの名無しさん:2009/03/21(土) 23:08:59
scanfが改行文字をバッファに残してるからだろ

740デフォルトの名無しさん:2009/03/21(土) 23:52:03
>>わざわざ文字列の1aなど1などをatoi(整数)して渡すとうまく1の動作ができ入力できるのですが
>>なぜか整数のintのuに値をいれて 1を渡すと 1の入力の場所がでて入力できずに終わってしまいます

さすがにこれは日本語でおkだろう
741デフォルトの名無しさん:2009/03/22(日) 01:51:34
>>740
そんな御託より直接
C言語でおkだろう
742デフォルトの名無しさん:2009/03/22(日) 02:07:41
板がわかんなかったからここで聞かせてくれ!
C使ってゲーム作ってんだけどフリー素材が見つからない助けて!
743デフォルトの名無しさん:2009/03/22(日) 02:09:53
>>742
ヒント:C言語なら俺に聞け
744デフォルトの名無しさん:2009/03/22(日) 02:12:10
>>742
ggrks
745デフォルトの名無しさん:2009/03/22(日) 03:09:27
>>742
VIPでヤレ
746デフォルトの名無しさん:2009/03/22(日) 12:10:24
#include <time.h>
#include <stdio.h>

//xミリ秒経過するのを待つ
int sleep(unsigned long x)
{
clock_t c2, c1 = clock();

do {
if ((c2 = clock()) == (clock_t)-1);
return 0;
}while(1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
return 1;
}

int main(void)
{
printf("My name is Bohyou.");
fflush(stdout);

sleep(2000);
printf("\rHow do you do?");
fflush(stdout);

sleep(2000);
printf("\rThanks. ");

return 0;
}

2秒ごとに表示される文が変わっていくようなんだけど
Thanks.だけしか表示されないです。ぼすけて
747デフォルトの名無しさん:2009/03/22(日) 12:15:05
> ((c2 = clock()) == (clock_t)-1);
748デフォルトの名無しさん:2009/03/22(日) 13:06:55
ミスター墓標か
749デフォルトの名無しさん:2009/03/22(日) 13:12:29
できるだけif文は{}でくくるようにした方がいいかもしらん
今回のように思わぬバグを招きやすい

if (a == 0) b = 1;
if (a == 1) b = 5;

↑のようなのはまだいいけど

if (a ==0)
  return 0;

↑のようなのは間にセミコロンが入ったりw
命令を追加したときにバグりやすい
750デフォルトの名無しさん:2009/03/22(日) 13:21:36
if(a == 0);
{
return 0;
}

防げんやないかw
751デフォルトの名無しさん:2009/03/22(日) 13:57:24
俺はいつも

if(){

}

と書く少数派だが、おかげでそういう間違いは起きない
752デフォルトの名無しさん:2009/03/22(日) 14:04:26
2行以上なら>>751と同じ、1行なら改行せずにそのまま書く俺もそういう間違いはない。
753デフォルトの名無しさん:2009/03/22(日) 14:24:03
どう改行しようが、そんな間違いはしない
754デフォルトの名無しさん:2009/03/22(日) 14:26:15
俺も今は752派だけど
if ()
{

}
だとifだけコメントアウトできると知ってちょっと心が揺らいでいる
755デフォルトの名無しさん:2009/03/22(日) 14:44:08
>>746
> clock_t c2, c1 = clock();

これできるの?
756デフォルトの名無しさん:2009/03/22(日) 14:47:38
c2が初期化されないだけ。
757デフォルトの名無しさん:2009/03/22(日) 15:11:11
>>747
>>749
あっ、できました。何でifの後ろに;を打ったんだろう
それ以前に何でエラーにならないでコンパイルされたんだろう
758デフォルトの名無しさん:2009/03/22(日) 15:14:46
文法上エラーじゃないもの
論理バグではあるけど
759デフォルトの名無しさん:2009/03/22(日) 16:14:53
エラーは出んよな
警告レベル上げれば警告するコンパイラはあるけども
760デフォルトの名無しさん:2009/03/22(日) 16:31:45
>>755
定数以外での宣言時初期化っていつからできるようになったんだ?
761デフォルトの名無しさん:2009/03/22(日) 16:33:20
>>746
その内容で sleep() と名付けるセンスが許せない。
762デフォルトの名無しさん:2009/03/22(日) 16:37:31
そだな
sleep()は元々マルチタスク環境で他のCPUプロセスにCPU時間を
明け渡すって意味だもんな
763デフォルトの名無しさん:2009/03/22(日) 16:46:02
>>760
C ではできない。>>746 は C++ だろうな。
764デフォルトの名無しさん:2009/03/22(日) 16:53:35
ローカル変数ならできるだろ。C89でさえ。
765デフォルトの名無しさん:2009/03/22(日) 16:55:58
>>764
へぇ!そりゃ新説だ
766デフォルトの名無しさん:2009/03/22(日) 17:02:09
>>765
死ね
767デフォルトの名無しさん:2009/03/22(日) 17:08:27
>>763=765のゆとりバカ

試してみたかい?
768デフォルトの名無しさん:2009/03/22(日) 17:16:52
>>767
???
769デフォルトの名無しさん:2009/03/22(日) 17:21:29
>>767
確かに出来た
gcc -std=c89 a.c

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

int main(void){
int tmp=(srand(time(NULL)),0);
int i, data[]={rand(),rand(),rand(),rand(),rand()};

for(i=0;i<sizeof(data)/sizeof(data[0]);i++) printf("%d\n", data[i]);

return 0;
}
770デフォルトの名無しさん:2009/03/22(日) 17:32:06
>>768
さらしあげ
771デフォルトの名無しさん:2009/03/22(日) 18:03:48
>>769
そういうときは、-pedantic-errorsつけるべき。
772デフォルトの名無しさん:2009/03/22(日) 18:08:34
変数とか関数の名前ってコンパイルした後も実行ファイルのどこかに残るの?
773デフォルトの名無しさん:2009/03/22(日) 18:13:49
>>771
ということは c89 では本来初期化時に関数の返値で初期化できるべきではない?
774デフォルトの名無しさん:2009/03/22(日) 18:16:59
>>771
以下のコード、VC++でもBCCでも、
.cのままでコンパイル通りますけど?
gccの独自拡張は、配列要素の初期化だけでしょ。

int n0;
int func(int n);
int fnc(void) {
int n1 = func(1), n2 = func(2), n3 = 5;
return n1 * n2 + n3 * n0;
}

最初に提示された>>755のコードも、当然通りますね。
clock_t cx(void) {
clock_t c2, c1 = clock();
c2 = clock();
return c2 - c1;
}

当たり前ですけど。
775デフォルトの名無しさん:2009/03/22(日) 18:22:21
宣言ってブロックの最初でしかできないはずだろ。

int main()
{
 int a;
 a = func();
 int b; /*これは駄目*/
 
 return 0;
}
776デフォルトの名無しさん:2009/03/22(日) 18:23:52
>>771
付けたけど問題ないよ。
777デフォルトの名無しさん:2009/03/22(日) 18:25:03
>>776
そういう意味じゃなくて
-pedantic
もつけずに、できたとか言うんじゃないよ馬鹿って言う意味
778デフォルトの名無しさん:2009/03/22(日) 18:25:44
>>775
c89ではそうだね

で、突然なんでそんな話を?
779デフォルトの名無しさん:2009/03/22(日) 18:27:49
>>777
失礼。勘違いしてたよ。
780デフォルトの名無しさん:2009/03/22(日) 18:59:01
で、結局はC89でもローカル変数の初期化に関数つかっても問題ないでオーケー?
781デフォルトの名無しさん:2009/03/22(日) 19:02:36
オーケー
782デフォルトの名無しさん:2009/03/22(日) 19:02:38
おk
無知が騒いでただけだから
783デフォルトの名無しさん:2009/03/22(日) 19:57:17
単純なコンソールプログラムを一時停止させ、適当な入力(任意の入力)を受けて続行する関数を書きたいんだが、なんか良いのない?
#include <conio.h>
getch();
だと環境依存で、
getchar()
だとbcc5.5.1で死ぬ。
784783:2009/03/22(日) 19:58:41
上のは単にデバッグ用に便利だからって言う程度の考え。
(Cで無理ならC++限定でもおk。)
785デフォルトの名無しさん:2009/03/22(日) 20:01:15
で、結局はC89でもローカル変数の初期化にその所属関数つかっても問題ないでオーケー?
786デフォルトの名無しさん:2009/03/22(日) 20:11:03
>>785
無理じゃね?
制御文を前に置けないから無限再帰になるような
787デフォルトの名無しさん:2009/03/22(日) 20:11:51
所属関数ってなーに?
788デフォルトの名無しさん:2009/03/22(日) 20:16:14
>>785はスルー推奨
789デフォルトの名無しさん:2009/03/22(日) 20:16:57
>>788
死ね
790デフォルトの名無しさん:2009/03/22(日) 20:18:11
Cの猛者の皆さん、こんばんわ。
教えてください。お助け〜

Unix上でPro*Cのプログラムをdbxでデバッグしたいんですが、
ソースがずれてるみたいなんです。
stop in main、run、listとやっているのに、ぜんぜんへんな場所が表示されます。

おそらくCのソースのつもりでブレイクしてるけど、Pro*cのソースが表示されている、
みたいなずれ方だなぁ、と予想しています。

こういう場合どういうぐあいにやると良いのでしょうか?
791デフォルトの名無しさん:2009/03/22(日) 20:18:20
792デフォルトの名無しさん:2009/03/22(日) 20:19:05
>>783
なんでgetcharが使えないのかわからないけど、fgets あたりが
簡単でいいのでは
#define wait_enter { char buf[10]; fgets(buf, 10, stdin); }
とか
793デフォルトの名無しさん:2009/03/22(日) 20:20:35
>>785
これだと意味無いけどこういう奴のこと?

#include<stdio.h>

void countdown(int count){
int temp=count?(printf("%d\n", count),countdown(count-1),1):0;
}

int main(void){
countdown(10);
return 0;
}
794デフォルトの名無しさん:2009/03/22(日) 20:24:39
>>792
ありがとう!
これで大丈夫だ
795785:2009/03/22(日) 20:30:16
>>789
詩ね
>>791
氏ね
>>793
int f(int n){
return g(n)
}

int g(int n){
int x[]={f(0),f(1),f(2),....(略)};
return x[n];
}
でコンパイルとおるんだろうけど、倫理面
で問題があるような無いような
796デフォルトの名無しさん:2009/03/22(日) 20:32:00
>>795
どうみても通らねぇよwwwwwwwww
797デフォルトの名無しさん:2009/03/22(日) 20:33:38
で、「所属関数」って言葉は規格のどこにあるの?
798デフォルトの名無しさん:2009/03/22(日) 20:36:41
>>795
それが通るコンパイラの名前plz
799785:2009/03/22(日) 20:37:07
何故掲示板に質問する時でもC言語の規格に沿わなければならないの?
800デフォルトの名無しさん:2009/03/22(日) 20:40:14
自分ルールじゃ相手に通じない可能性があるから
801デフォルトの名無しさん:2009/03/22(日) 20:40:23
>>799
「所属関数」とは何かという問いに答えないから
答える必要がないという態度に取られたんだろ

それにおまえさんは C89 と言っていた
「問題ない」とは何に対して言ったんだ?
802デフォルトの名無しさん:2009/03/22(日) 20:45:08
>>799
えええええ??????
マジで言ってんの!?!?

803デフォルトの名無しさん:2009/03/22(日) 20:45:25
コンパイラですら、変数の初期化に関数を使っている場合、
その関数がその関数に依存していないか程度くらい解析して
親切にエラーを出してくれるんだろうけど
このスレの回答者ときたら、頭がどんな石で出来ているのか知りたい
もんだ...
804デフォルトの名無しさん:2009/03/22(日) 20:53:20
>>803
だから、どのコンパイラだよ?
具体的に言えってw
805デフォルトの名無しさん:2009/03/22(日) 20:56:18
所詮「所属関数と書くだけで誰でも理解してくれるだろう」と考える程度の
お花畑な脳みそを持ってる人の御言葉ですから。
806デフォルトの名無しさん:2009/03/22(日) 20:56:39
荒れてるな。
だからスルーしろと言ったのに…。
807デフォルトの名無しさん:2009/03/22(日) 21:04:48
>>805
所属関数=その識別子が所属している関数定義スコープ
という意味だろw
この程度でいちいち揚げ足取らなくてもいいってw
それよか、「問題無い?」って>>795の表現は
コンパイラ作成者にとってか、コンパイラ使用者にとってか
で意味が相当変わってくるだろうけど、
まさかこのスレの目的性から考えるとどう考えても
Cコンパイラ使用者だろ
答えは、「問題あり。処理系依存。コンパイルが通っても
正しく動作することは期待しないほうが良い」
808デフォルトの名無しさん:2009/03/22(日) 21:08:18
やっぱりお花畑だよ。どう見ても。
809デフォルトの名無しさん:2009/03/22(日) 21:09:11
揚げ足じゃなくて、理解してもらえると本気で思ってるのが不思議すぎる
810デフォルトの名無しさん:2009/03/22(日) 21:14:46
> 所属関数=その識別子が所属している関数定義スコープ

指示語は適切に使えよ
助け船のつもりか知らんがミイラ取りがミイラだ、それじゃw
811デフォルトの名無しさん:2009/03/22(日) 21:21:29
ヒント:ゆとり
812デフォルトの名無しさん:2009/03/22(日) 21:23:51
んじゃ>>785の意訳よろ
813デフォルトの名無しさん:2009/03/22(日) 21:54:56
私は初心者ですが、初心者向けじゃない話がずっと続いていて質問しにくいです。
スレ違いな話題だと思いますので、他で議論してください。
814デフォルトの名無しさん:2009/03/22(日) 22:08:10
>>813
聞きたいことがあるなら流れぶった切ってでも聞けばいいだろ
自分にできることもやらずに、人のせいにしてろよkz
815802:2009/03/22(日) 22:08:46
>>813
そうか初心者か。それはすまなかったね。

じゃあ初心者なら次のことをよく知っておけ。
>>799みたいな大人になっちゃダメだぞ。
816デフォルトの名無しさん:2009/03/22(日) 22:09:42
>>813
いいよ、聞いてくれ。
ここは2chだ。
817デフォルトの名無しさん:2009/03/22(日) 22:12:50
>>813
入門者向けの話題かどうか判断出来てる時点で
少なくとも初心者じゃないの、出来ればここで
議論してよその初心者スレにはいって迷惑
かけないで欲しいと思いまつ。

あとスレタイトル見ればわかるように
入門者向けスレなので、初心者に常に
適しているとは言えない話題も議論
されても良いと思いまつ。
818デフォルトの名無しさん:2009/03/23(月) 13:12:36
>>790
OracleとかのプリコンパイラのPro*Cのこと?
あれってSQL入った元ソースをCコードに
トランスレートする奴だよね。
デバッグ作業の時、元ソース見ても多分
ずれる。コンパイラはトランスレートされた
Cソース以外関知しないから。(関知したら
そのコンパイラはアヤシイ)
819デフォルトの名無しさん:2009/03/23(月) 13:23:57
>>790
ということで、トランスレートされたCソースをデバッグすればいいと思います。
820818:2009/03/23(月) 13:27:23
>>819が勝手に断定していますが、そう間違いでも無い感じ。
だけど後は>>819に聞いてください。>>790
821デフォルトの名無しさん:2009/03/23(月) 17:13:31
>>813は何が聞きたかったの?
822デフォルトの名無しさん:2009/03/23(月) 17:23:09
C言語がつまらないのですが、どうやったらC言語の勉強が楽しくなりますでしょうか?
823デフォルトの名無しさん:2009/03/23(月) 17:30:33
声を出して笑いながら勉強する
824822:2009/03/23(月) 17:33:52
>>823
そんな方法論があるとは驚きです!
早速今日からやってみます。
良きアドバイスをありがとうございました。
825デフォルトの名無しさん:2009/03/23(月) 19:37:23
やってみたらとっても楽しく勉強できました。どうやったらC言語の
勉強をつまらなくできるでしょうか?
826デフォルトの名無しさん:2009/03/23(月) 19:43:44
>>825
C言語に関する書籍の一文字一文字を丹念に読み解くとつまらなく勉強することができます
ためしてみてください
827825:2009/03/23(月) 19:49:18
>>826
ありがとうございます。けど
Java言語に関する書籍の一文字一文字を丹念に読み解いてもつまらなく
なりませんでしたが、C言語でも大丈夫でしょうか?
828デフォルトの名無しさん:2009/03/23(月) 19:52:07
>>827
それは丹念に読み解くということを本質的に理解していないからですよ
心を無にして、世間というしがらみを開放し、
大自然の恩恵を体に浴びる感じで読み解くことを体得することからはじめなくてはいけませんね
あと10年がんばってください
829デフォルトの名無しさん:2009/03/23(月) 20:03:47
void main(void){

}
はC89では認められていないそうですが本当でしょうか?
830デフォルトの名無しさん:2009/03/23(月) 20:13:20
多くの場合みとめられていません。
831デフォルトの名無しさん:2009/03/23(月) 21:00:01
Q 11.12:
mainをvoidとして宣言して「mainの戻り値がない」という警告を消すことができるか。
A:
できない。mainはintを戻り値とし、(適切な型の)0個か2個の引数を持つと
定義しなければならない。

Q 11.14:
void main()と宣言してうまくいかないわけがないと思う。なぜならmainからreturnする代わりに、
exit()を呼んでいるから。だいたい今使っているOSはプログラムのexit値/戻り値を無視する。
A:
mainからreturnで戻ってくるかどうかは関係ないし、そのステータスを見るかどうかも関係ない。
問題はmainの宣言がおかしいと、呼び出し側(実行時のスタートアップのコード)が
mainを正しく呼び出すことすらできないかもしれないことにある
(呼び出しの規約にあるかもしれない不統一による)。
void main()と宣言しても多くのシステムで動くようである。こう書くほうが好都合だと思っていて
移植性についてあまり気にしていないなら、誰も止めはしない。

Q 11.15:
それでは、どうして私の持っている本はmainをvoidと宣言しているのか。
A:
そういう本は間違っているか、void mainがたまたま動くシステム向けに
コードを書くことを想定しているかのどちらかである。
832デフォルトの名無しさん:2009/03/23(月) 21:40:52
>>829
もし処理系がmain関数をvoid(void)と定義していれば
それも規格に合致する。
833デフォルトの名無しさん:2009/03/23(月) 21:47:30
処理系がmain関数をvoid(void)と定義していなければ
それは規格に合致しないかどうかですね。
834デフォルトの名無しさん:2009/03/23(月) 22:26:33
mainの戻り値がintじゃない場合についても、標準に書かれているので間違いではないよ。
835デフォルトの名無しさん:2009/03/23(月) 22:35:22
標準ライブラリを極力使うように心がけることはやっぱり
間違いが少ないんでしょうか?
(仕様問題、設計問題、処理方式の問題、コーディングポカミスを除く)
836デフォルトの名無しさん:2009/03/23(月) 22:57:05
>>835
そのとおり。コードは短いほどいい。

> (仕様問題、設計問題、処理方式の問題、コーディングポカミスを除く)
これ以外にあるのかしら?
837デフォルトの名無しさん:2009/03/23(月) 23:03:15
標準ライブラリを使いさえすればコードが短くかけるんだって
838デフォルトの名無しさん:2009/03/23(月) 23:18:58
>>837
必要条件であって十分条件ではない。
839デフォルトの名無しさん:2009/03/23(月) 23:26:33
>>836
短ければ良いってもんじゃない
840デフォルトの名無しさん:2009/03/23(月) 23:30:02
長いのよりは短いのがいいだろ!
841デフォルトの名無しさん:2009/03/23(月) 23:31:13
短く書くのに便利なコードは標準ライブラリの仲間と考えることは
良いことですか?
842デフォルトの名無しさん:2009/03/23(月) 23:31:49
コーディングポカミスはコーディング量に比例するから
短いコードのほうがポカミスは少ない

ちがうか?
843デフォルトの名無しさん:2009/03/23(月) 23:32:56
>>841
悪いことです
844デフォルトの名無しさん:2009/03/23(月) 23:34:27
>>842
言葉を鵜呑みにする人には危険な言葉
845デフォルトの名無しさん:2009/03/23(月) 23:34:40
多機能で大規模なプログラムはポカミスだらけでとても作れませんね。
846デフォルトの名無しさん:2009/03/23(月) 23:44:57
>>845
おまい大丈夫か?

同じ多機能で大規模なプログラムを、だらだらと2万行で作るより、きちんと設計して
1万行で作ったものの方が、コーディングにかかるコスト、テスト&デバッグのコストが
小さくなるということだよ。
847デフォルトの名無しさん:2009/03/24(火) 00:35:35
3項演算子の真の戻り値に3項演算子が入っていて
更に偽の戻り値にも3項演算子が入っていて、さらにその3項演算子の中にも3項演算子あって

設計して行数を少なくしました、キリッ!
とか、目に浮かぶw
848デフォルトの名無しさん:2009/03/24(火) 01:23:21
最近全角で草生やす低能を良く見るけど春だから?
849デフォルトの名無しさん:2009/03/24(火) 04:41:30
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
850790:2009/03/24(火) 07:06:43
>>818
はい。そうです、オラクルのPro*Cです。
やっぱりずれるんですね。
トランスレートされた奴をソースとして指定すればよいのですね。
ありがとうございます。
ちょっとオプションが分からないので調べてやります。
分からなかったらまたお聞きするかも・・
ありがとうございました。
851790:2009/03/24(火) 07:07:52
あ、オプションっていうのは、dbxにソースファイルとして指定する方法のことです。
pathmapって奴なのかなぁ。。
分からなかったらまたここに聞きに来ます。
852デフォルトの名無しさん:2009/03/24(火) 07:35:58
819にお礼はしないの?
853デフォルトの名無しさん:2009/03/24(火) 08:08:24
べつに
854デフォルトの名無しさん:2009/03/24(火) 08:13:47
>>848
全角も半角も関係ない。草生やしてる段階で低能だろ。
855デフォルトの名無しさん:2009/03/24(火) 08:18:29
#include <stdio.h>
void main()
{
  while(1) printf("w");
}
856デフォルトの名無しさん:2009/03/24(火) 09:37:04
819は無視されたので怒ってしまいました、
857790:2009/03/24(火) 10:42:58
>>852
礼を言うほどの回答ではないのでしません
858デフォルトの名無しさん:2009/03/24(火) 10:51:30
ずばりベストな回答じゃあないかw
859デフォルトの名無しさん:2009/03/24(火) 11:03:24
無責任な傍観者的表現の818
の回答なんて無視無視.推測でしか書いてないだしょ
その点819の回答は潔い。余計な文は
一切無し。すっきりと短くコードしてる。
818が認めているように、偉いのは819。
礼を言うのは819にね。(もう今更求めないけど)
860デフォルトの名無しさん:2009/03/24(火) 11:32:57
また頭の悪いやつがわいたw
861デフォルトの名無しさん:2009/03/24(火) 12:15:50
strcmp( )の実装を調べてたんですが
http://www.bohyoh.com/CandCPP/C/Library/strcmp.html
/*--- strcmpの実現例 ---*/
int strcmp(const char *s1, const char *s2)
{
while (n && *s1 && *s2) {
if (*s1 != *s2) /* 等しくない */
return ((unsigned char)*s1 - (unsigned char)*s2);
s1++;
s2++;
n--;
}
if (!n) return (0);
if (*s1) return (1);
return (-1);
}
の変数 n が突然出てきているのがよくわかりません
これはなんでしょう
862デフォルトの名無しさん:2009/03/24(火) 12:18:50
>>790 がそもそもスレ違い気味と感じたのと、
>>819 は尤もな意見だってのと
俺自身 Pro*C は解るが dbx はあんまし知らないって理由で
スルーしたんだが、こんだけ引っ張られるとは思わなんだ。

>>818
>コンパイラはトランスレートされた
>Cソース以外関知しないから。
Pro*C のオプションに LINES=YES を指定すると
生成されたCコードに、プリプロセッサディレクティブ #lines が
追加され、変換前のソースファイル名と行番号がデバッグ情報に
取り込まれる。
…かも知れない。
(少なくとも MS Visual Studio ではそうなる)
863デフォルトの名無しさん:2009/03/24(火) 12:19:31
>>861
バグ。
864デフォルトの名無しさん:2009/03/24(火) 12:46:51
strncmpからコピペして消し忘れたとか、そんなとこだろうw
865デフォルトの名無しさん:2009/03/24(火) 12:47:34
ってstrncmpの方見たら・・・
866デフォルトの名無しさん:2009/03/24(火) 16:49:07
前にもこのやりとり見たなw
867デフォルトの名無しさん:2009/03/24(火) 17:03:53
ご意見しようと思ったが連絡先がないな
868790:2009/03/24(火) 21:51:11
すみません。。お礼しませんでした。。
>>819さん、大変失礼いたしました。
ありがとうございました。

>>862さん
ありがとうございます。
ためさせていただきます。

スレッド汚してしまってすみませんでした。
869デフォルトの名無しさん:2009/03/24(火) 23:38:37
今どきPro*Cとかどんだけー
Oracle Power Objects使えよ
870デフォルトの名無しさん:2009/03/25(水) 09:23:53
>>869
やあ、釣れますか?
871819:2009/03/25(水) 10:36:03
>>868
いえいえ、別に>818をおちょくりたかっただけですから。
872デフォルトの名無しさん:2009/03/25(水) 10:39:21
C言語での質問です。

以下のソースなのですが、
コンパイルは通るが、実行時にエラーがでます。

どなたか、エラー原因を教えていただけないでしょうか?
よろしくお願いします。

===============
#include<stdio.h>
#include<string.h>

int main()
{
int n = 0;
char *str;

sprintf(str,"ほげほげ");
printf("%d",n);

return 0;
}
===============

エラーは実数を出力する際にでているようなのですが・・・・
873デフォルトの名無しさん:2009/03/25(水) 10:41:18
char *str; ここでポインタを宣言してるが、このポインタがどこを指すのか書いてないから
sprintf(str,"ほげほげ"); ここででたらめな場所に"ほげほげ"を書き込んでいる。
874デフォルトの名無しさん:2009/03/25(水) 10:41:44
>>872
strが就職難民なので、得体の知れないところに"ほげほげ"をコピーしてしまっています。
strには、"ほげほげ"が入るだけの土地を与えてください。
875デフォルトの名無しさん:2009/03/25(水) 10:46:55
つまんね
876デフォルトの名無しさん:2009/03/25(水) 10:58:37
char *str;
 ↓
char str[256];
877デフォルトの名無しさん:2009/03/25(水) 10:59:19
何でstring.hをインクルードしてんの?
878デフォルトの名無しさん:2009/03/25(水) 11:02:19
>>876
256はなんですか?魔法の数字ですか?
879デフォルトの名無しさん:2009/03/25(水) 11:03:41
特に意味はない
単にキリのいい数字なだけ
880872:2009/03/25(水) 11:07:50
>>873-874
回答ありがとうございます。

ポインタの指す場所が不明だという部分はわかったのですが、
それがなぜ、printf("%d",n)を実行したことでエラーとなって表れるのでしょうか?
逆に言うと↓を以下のようにすると問題なく実行できてしまうんですが・・・

>sprintf(str,"ほげほげ");
>printf("%d",n);

  ↓

sprintf(str,"ほげほげ",n);
printf("%s",str);


>>877
sprintf関数はstring.hにあるのかと思ったら
stdio.hにありました。ただの勘違いです。
881872:2009/03/25(水) 11:10:26
>>880
すいませんコピペミスしました

× sprintf(str,"ほげほげ",n);
○ sprintf(str,"ほげほげ");
882デフォルトの名無しさん:2009/03/25(水) 11:11:58
>>880
でたらめな場所に書き込まれるんだから
たまたまうまくいくときもあるだろうし、あとでおかしくなることもある。
883書いてて飽きたw:2009/03/25(水) 11:21:53
どこかの土地を不当に占拠した廉で訴えられるかもしれませんし、不発弾を踏んでしまうかもしれません。
884872:2009/03/25(水) 11:35:51
>>882-883

つまり、定義のあやふやな文字列があることで
他の出力にも影響を及ぼすかもしれない、ということですか

回答いただきありがとうございました
885デフォルトの名無しさん:2009/03/25(水) 12:04:06
変数が実際の土地だとしたら、ポインタってのは土地の住所が書いてある、アドレス帳のような物だ。
アドレス帳に適当な住所を書いても、自分の土地じゃないと住むことが出来ない。
警察を呼ばれる(エラーが出てくれる)か、たまたま空き地だったので何も起きないかは、
使用しているOSと、その時の状態によって予測できない。

って、この前小6の娘の説明したら、理解してる風だった。
いつか娘マクロが、コーディングしてくれるようになるといいな。
886デフォルトの名無しさん:2009/03/25(水) 12:06:02
マクロがマグロに見えた
順調に病んでいる
887デフォルトの名無しさん:2009/03/25(水) 12:10:37
ポインタなんか理屈で覚えるより
体で覚えるべし
888デフォルトの名無しさん:2009/03/25(水) 12:12:32
まだやってるのかw
>>790に哀れみをかけられた>>819の姿は涙を誘うなw
889デフォルトの名無しさん:2009/03/25(水) 12:25:14
コーディングにおいて、ローカル定義された変数は、
一律一括に初期化するコードを入れなければならないって
コーディング流儀って美徳ですか?
変数に値を設定するステップが、プロシージャの重要なステップに
なっているようなコードって無駄ですか?
890デフォルトの名無しさん:2009/03/25(水) 12:27:51
>>889
どこか病んでいると思う。
891デフォルトの名無しさん:2009/03/25(水) 13:07:12
>>889
腐ってると思う。
892デフォルトの名無しさん:2009/03/25(水) 13:15:42
健全なコードって、宣言した変数に値を設定せず、そのまま使うことですね。
893デフォルトの名無しさん:2009/03/25(水) 13:22:21
必要なタイミングで代入もしくは初期化するのが健全なコード
894デフォルトの名無しさん:2009/03/25(水) 13:27:04
未初期化変数を使っちゃうかもしれないから、とりあえず0で初期化しておく。
意味がないだろう、やっぱり未設定のまま使うんだろうし。
895デフォルトの名無しさん:2009/03/25(水) 13:27:34
>>889
「初期化」を整数なら0にすることと言う意味に定義してるなら、その定義がおかしい。
ロジックに対して必要な値にしておくのが「初期化」。

「プロシージャ」が何を指しているかは知らん。
896デフォルトの名無しさん:2009/03/25(水) 13:40:36
>>889
ロジックと区別される、セキュリティ対策(バグが発生した場合に
スタックの上に残っているデータから余計な情報が流出する事故
を防止したい場合)や無限ループ突入型のバグ(昔の環境ではリ
セットしなければならない場合もあり、作業の遅滞の原因だった)
防止の為の一括一律初期化は一昔前の貧弱なマシンでの集団開発
作業ではルールだったし、高い事故防止効果を持っていた。

今でもある程度それは有効。Cのようにネィティブコードで実行される
アプリの場合、プロセスを強制終了させると、Windowsとかではリソ
ースリークが起こらないとも限らないからそれが原因になって不安定
になるというのは余り変わってないから。

ただロジックとは区別されるべき初期化はロジックの可読性を損なう
として嫌う人もかなり出てきてるのは、専門プログラマ以外の
人もコードを読んだり資産の一部であると考えるようになってき
ていることが関係してるんじゃないか?
897(896):2009/03/25(水) 13:42:48
- Cのように

+ Cで書かれたアプリのように
898デフォルトの名無しさん:2009/03/25(水) 14:27:27
>>896
セキュリティ対策なら逆だろ
ゼロクリアは初期化時ではなく使用終了時であるべき
899デフォルトの名無しさん:2009/03/25(水) 14:44:54
>>898
残念ながらすべてのライブラリ関数がそうしてくれてるとは
限らないから
やっぱり最初じゃないと
900デフォルトの名無しさん:2009/03/25(水) 15:23:58
>>899
残念ながらすべてのライブラリ関数がそうしてくれてるとは
限らないから
やっぱり最後じゃないと
901デフォルトの名無しさん:2009/03/25(水) 15:24:47
間を取って真中で
902デフォルトの名無しさん:2009/03/25(水) 15:40:49
>>899
自分がアホなこと言ってるのに気付いてるかな?
903デフォルトの名無しさん:2009/03/25(水) 15:44:26
904デフォルトの名無しさん:2009/03/25(水) 16:04:42
>>899
標準ライブラリなど、ソースが無いかあっても書き換えることは許されない
ような関数を呼び出した直後に呼び出されたユーザー関数内では、
スタックの一括初期化による「�清掃」は、関数の先頭で
やらないと自分の関数のバグで、情報が流出してしまうかもしれないので
やるのがマナーというのなら他の関数が自分の関数終了後に呼び出される
ことを想定して、使用した変数でデータを残す必要が無いものは、
同様に「清掃」をしておくのもマナーになるかも知れないな。
保養所とかの共有物の共同利用とかに比べて常識がちょっと違う感じ。
905デフォルトの名無しさん:2009/03/25(水) 16:05:03
906デフォルトの名無しさん:2009/03/25(水) 16:16:46
また出た
907デフォルトの名無しさん:2009/03/25(水) 16:20:43
♪春なのに〜
908デフォルトの名無しさん:2009/03/25(水) 16:29:56
       //
     /  /   パカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ  まピョーん☆
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
909デフォルトの名無しさん:2009/03/25(水) 16:51:06
>>902 そしてあんたは、自分が一番アホだと気づいた方が良い、周りの目を気にして
910デフォルトの名無しさん:2009/03/25(水) 16:52:36
プログラミングってつまらないんですけど、どうすれば楽しくなりますか?
911デフォルトの名無しさん:2009/03/25(水) 16:55:44
笑えば、いいと思うよ
912デフォルトの名無しさん:2009/03/25(水) 16:58:19
何か作る目的を持って打ち込むこと。まぁ、ぶっちゃけ、本当に詰まらん作業だよ・・・
だいたい、自分がこの世に生まれてプログラミングをし始めて何年経った?
死ぬまでそうしているの?悪い、俺はそいつらを利用して金儲けすることにしたわ。
だるい。PCの前であーだこーだ必死に考えて、無機質な物体を相手に必死になって
ムキになって、馬鹿らしいわ。そんな詰まらない人生を送りたいとは思わない。
なんで理系に進んだんだろう?別に生まれたときから理系に進学する予定はなかった。
高校で理数科に所属したがために、英語がやりたかったのに数学を主に学ぶ選択肢を
選んだわけでもないのに、大学でC言語を2単位程度だが必須科目で履修して
今を生きているわけだが。ネットワークの管理をしていても良いかもな。
お前らの馬鹿発言を目の当たりに出来て、笑えるw
913デフォルトの名無しさん:2009/03/25(水) 17:16:32
>>912
空気読んでないし長文必死過ぎ

どうせ国家試験の勉強でも始めるんだろ?www
914デフォルトの名無しさん:2009/03/25(水) 17:23:05
>>904=>>912
だろw
文体がずいぶん変わるな
915デフォルトの名無しさん:2009/03/25(水) 17:24:26
916デフォルトの名無しさん:2009/03/25(水) 17:40:34
何処を縦だよ
917デフォルトの名無しさん:2009/03/25(水) 18:29:12
行間
918904:2009/03/25(水) 20:10:34
>>914
>>912じゃありません
919デフォルトの名無しさん:2009/03/25(水) 21:18:07
必死だなw
920デフォルトの名無しさん:2009/03/25(水) 22:38:09
>>898
本を読む前と後に手を洗えって、
図書カードのポケットに書いてあったろ。
921デフォルトの名無しさん:2009/03/25(水) 22:51:22
オセロのプログラムなのですが、コンピュータが妙な動作をしてしまいます。
具体的には、ミニマックス法で最善手を探してその座標を引数へのポインタでセットする関数があり、
いつもは適切に動いていると思うのですが、終盤になると置けない場所に打とうとする時があるのです。
よく見ると自分が前回打った場所と同じ場所に打とうとしてくるようですが
ソースからはどこがおかしいのか判らない状況です。
評価関数は自分の石の数 - 敵の石の数という単純なものです。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9001.zip
なおソースはコンピュータvsコンピュータになっており
もう一人のコンピュータは別のアルゴリズムで乱数で判断するので
ゲームが正常に終了するときと、エラーになるときとがあります。
どうぞよろしくお願いします。
922デフォルトの名無しさん:2009/03/25(水) 22:55:44
ここはデバッグの丸投げスレじゃない
923デフォルトの名無しさん:2009/03/25(水) 22:56:38
問題は、

intの変数に0を代入することが手を洗うことなのか

ということ。
924デフォルトの名無しさん:2009/03/25(水) 23:15:55
>>921
まず乱数の使用をやめて現象の再現手順を見つけろ
925デフォルトの名無しさん:2009/03/25(水) 23:26:54
誰か2次元配列のポインタ渡しを教えて下さい。
void fun(char *a[]){
int i;
for(i=1;i<=10;i++){
a[i]="test";}}

void main(void){
char cr[10][100];
int i;
fun(cr);
for(i=0;i<=10;i++){
printf("test->%s\n",cr[i]);
}}
上記の様なことをしたいのですが、どの様に訂正したら問題なく動くのでしょうか?
926デフォルトの名無しさん:2009/03/25(水) 23:30:07
void fun(char (*a)[100])
927デフォルトの名無しさん:2009/03/25(水) 23:35:06
落ちこぼれの必死な長文はメシウマということですね。わかります。
928デフォルトの名無しさん:2009/03/25(水) 23:42:59
>>925
何をさておいてもまず、for 文の中の i の初期値と終了条件が正しいか確かめること。

君が何をしたいのかについては二通りの解釈がある。
ポインタの配列の各要素に文字列リテラルを指させたいのか、
文字配列の配列の各要素に文字列を格納したいのかだ。
まず、君自身がこの違いを理解しているか。
前者は、メモリ空間上のどこかに用意された固定の文字列の場所を、
配列の要素それぞれに覚えこませるだけである。
後者は、文字配列というメモリ空間を意識的に用意して、
そこに目的の文字列の内容をコピーすることである。

前者ならば、cr は以下のように宣言しなければならない。

char *cr[10];

後者ならば、fun() は以下のように定義されなければならない。

void fun(char a[][100]){
  int i;
  for(i=0;i<10;i++){
    strcpy(a[i], "test"); /* 安全上は問題がある可能性がある */
  }
}

なお、main() における printf() の呼び出しは変更する必要がない。
これは、cr[i] が配列(後者)であっても、ポインタに成り下がることによって
cr[i] がポインタ(前者)であった場合と同じことになるからである。
なぜ fun() の呼び出しでは同じことが起きないかと言えば、
ポインタの配列(前者)はポインタへのポインタに成り下がるが、
配列の配列(前者)は配列へのポインタに成り下がるからである。
929デフォルトの名無しさん:2009/03/25(水) 23:44:58
×配列の配列(前者)は
○配列の配列(後者)は
930デフォルトの名無しさん:2009/03/26(木) 00:23:21
>>926さん
>>928さん
ホントありがとうございます。
これで明日、作業を進めることが出来ます。
>>928さんホント丁寧な説明ありがとうございました。
931デフォルトの名無しさん:2009/03/26(木) 00:26:38
要するにこういう事をさせたいわけね。

#include <stdio.h>
#include <string.h>

void fun(char (*a)[100])
{
int i;

for (i = 0; i < 10; i++)
sprintf(a[i], "test %d", i);
}

int main(void)
{
char cr[10][100];
int i;

fun(cr);

for (i = 0; i < 10; i++)
printf("test->%s\n", cr[i]);

return 0;
}
932デフォルトの名無しさん:2009/03/26(木) 12:44:39
>>925
マルチかよ。
あっちで答えちまった。
http://pc12.2ch.net/test/read.cgi/tech/1233404556/55-56
933デフォルトの名無しさん:2009/03/26(木) 15:17:45
>>932
お前向こうで答えてるのあれ間違ってるじゃん。
あれじゃ3次元配列を受け取る意味になっちまうぞ。
934932:2009/03/26(木) 15:28:07
>>933
確かに3次元配列が2次元配列へのポインタに成り下がることを考えればそうだな。

だが2次元配列へのポインタを受け取るという意味では間違っていない。

char cr[10][100];
fun(&cr);

こういう渡し方を知らんのか?
935デフォルトの名無しさん:2009/03/26(木) 15:57:48
もともとポインタをコピーしてるのと配列渡してるのと
大本が2次元配列になってるのでgdgdだからな
936デフォルトの名無しさん:2009/03/26(木) 16:03:33
>>934
なにそれ意味ないじゃん
配列渡しは配列へのポインタを渡しているので
わざわざアドレス渡しをする意味がわからない
937デフォルトの名無しさん:2009/03/26(木) 16:13:14
初心者が初心者に回答するとこういうことになる
938デフォルトの名無しさん:2009/03/26(木) 16:30:42
char cr[10][100];
fun(cr);
とするならば
1.void fun(char a[10][100]);
2.void fun(char a[][100]);
3.void fun(char (*a)[100]);
の何れかになる

1.が一番分かりやすいが[10]の10は無視されるので2.と同一
2.の引数a[]はポインタ*aと同義になるので3.と同一
3.は初心者には分かりづらいので、やっぱ2.がお奨めかな
939デフォルトの名無しさん:2009/03/26(木) 16:38:01
敢えてaを説明するならば
char型の2次元配列(n行100列)の先頭アドレスを格納した変数
940デフォルトの名無しさん:2009/03/26(木) 17:02:11
>>938
1. がいいと思うよ。10が無視されるとしても

941デフォルトの名無しさん:2009/03/26(木) 17:10:55
ひでえ
VC9でReleaseにしたらfun()が消えてインライン化されちまった
942デフォルトの名無しさん:2009/03/26(木) 17:16:01
つい struct 化しちまうな

struct foo { char elem[100]; };
void fun(struct foo* a); /* void fun(struct foo a[]); */
943デフォルトの名無しさん:2009/03/26(木) 17:16:24
まあ最終的に3を理解して使えるようになるのが理想ではあるが
944デフォルトの名無しさん:2009/03/26(木) 17:24:20
>>914
残念、違うよ。お前が必死なだけ
945デフォルトの名無しさん:2009/03/26(木) 18:13:37
最終的には行列と一緒に構造体だろ。生成、消去ごと関数作ってな
946デフォルトの名無しさん:2009/03/26(木) 18:17:28
>>940
10 とは限らないところに 10 と書いてあるのは美しくないと思うが?
947デフォルトの名無しさん:2009/03/26(木) 18:23:20
>>946
俺もそう思う。
むしろ行数は別パラメータで渡すようにするべき。
どうせ無視されるのだから。

C++なら配列もサイズ毎渡せるんだがな。
948デフォルトの名無しさん:2009/03/26(木) 18:32:55
#include <stdio.h>

typedef struct {
  char cr[10][100];
} AA;

void fun(AA* paa)
{
  int i;

  for (i = 0; i < 10; i++) {
    sprintf(paa->cr[i], "hoge %d", i);
  }
}

int main()
{
  AA aa;
  int i;

  fun(&aa);
  for (i = 0; i < 10; i++) {
    printf("%s\n", aa.cr[i]);
  }
  return 0;
}
949デフォルトの名無しさん:2009/03/26(木) 18:37:29
マジックナンバーなコードだな
950デフォルトの名無しさん:2009/03/26(木) 18:56:42
配列は決してポインタには成り下がってくれてるわけではな
いからこそ、2次元配列以上になると引数で渡すのには一苦
労も二苦労もしなければならない。例えば構造体でくるんで
渡すように。
例えば
char a[1000];void f(char*);で
f( (char*)&a );とかf(&a)と書くべきところを
f(a)と書いても通るのは、慣習に従ってコンパイラが融通を利かせて
くれてるだけ
951デフォルトの名無しさん:2009/03/26(木) 18:59:17
> f( (char*)&a );とかf(&a)と書くべきところを

     /V\    |
    /◎;;;,;,,,,ヽ  |
 _ ム::::(,,゚д゚):|  J
ヽツ.(ノ:::::::::.:::::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'
952デフォルトの名無しさん:2009/03/26(木) 19:06:07
char a[1000];
strcpy(&a, "hello, world");
953デフォルトの名無しさん:2009/03/26(木) 19:13:45
配列名ってのは配列の先頭アドレスを示すラベル(あるいは定数)であるからして
それ自体のアドレスはない
だからして&(アドレス取得演算子)は使えないぞなもし
954デフォルトの名無しさん:2009/03/26(木) 19:17:32
>>950
> f(&a)
wwwwwwwwwwwwwwwwww
955デフォルトの名無しさん:2009/03/26(木) 19:18:49
>>953
おまえもか

馬鹿ばっか>>953
956デフォルトの名無しさん:2009/03/26(木) 19:24:31
>>953 を擁護する気はさらさらないが、&a と書いただけで警告するコンパイラは昔あったぞ
957デフォルトの名無しさん:2009/03/26(木) 19:25:30
>>950
(  ゚,_ゝ゚)バカジャネーノ
958デフォルトの名無しさん:2009/03/26(木) 19:41:17
>>956

f((char*)&(a[0]) );
とか
f( & (a[0] ) );
だな
配列名(アドレスが定義されていない識別子)にアドレス取得
演算子を直接使えると誤解されかねない慣習解釈は問題があるな
だが最近のコンパイラではf( &a )でも通る。C++の影響かな?
959デフォルトの名無しさん:2009/03/26(木) 19:42:46
>>952はボーランドのコンパイラとおらんかったよ。
どっちなんだよ・・。

配列名は単純に先頭配列へのポインタって理解じゃダメなんかね。。
960デフォルトの名無しさん:2009/03/26(木) 19:45:28
おまえ沢村か?
961デフォルトの名無しさん:2009/03/26(木) 19:50:47
>>959
ポインタ=アドレスを格納する変数
という定義に従えば
配列名は変数でないからアウツ
962デフォルトの名無しさん:2009/03/26(木) 19:52:25
>>959
通るには通ってるだろ
警告が出るが止まりはしていない

6.3.2.3で認められているし
963デフォルトの名無しさん:2009/03/26(木) 19:56:54
>>958
アドレスは取れるだろ
964デフォルトの名無しさん:2009/03/26(木) 20:04:44
>>963
そのツッコミはちょっと不親切じゃね。
「配列」のアドレスはとれるけど、「配列の先頭」のポインタとして渡されないってんじゃなかったっけ
965デフォルトの名無しさん:2009/03/26(木) 20:09:28
>>962
&a[0]にしたら問題なく通るけど、
&aなら通らないけどな・・。
966デフォルトの名無しさん:2009/03/26(木) 20:14:49
>>962
§6.3.2.3にはそんな事書いてねえだろ
よく読み返してみろ
967デフォルトの名無しさん:2009/03/26(木) 20:17:55
C言語の学習がつまらないのですが、どうしたら楽しくなるのですか?
968デフォルトの名無しさん:2009/03/26(木) 20:19:09
>>967
何か目標を持て。
ゲームを作るとか、人工知能対戦ロボットを作るとか。
969デフォルトの名無しさん:2009/03/26(木) 20:19:55
>>966
7
970デフォルトの名無しさん:2009/03/26(木) 20:32:50
>>965
その辺実装依存だったりするし、深入りしない方が良いんじゃないかなあ
普通は
1.配列とポインタは異なる
2.「関数の引数内の配列名」は、ポインタ
3.「式中の配列名」は、ポインタ
とかだけ覚えとけば、書くのも読むのも問題ないんじゃね
971デフォルトの名無しさん:2009/03/26(木) 20:36:00
>>969
JIS X3010:2003だよな?
7なんてどこにある?
972デフォルトの名無しさん:2009/03/26(木) 20:37:06
また規格なんか知らん俺がルールだ厨か
973デフォルトの名無しさん:2009/03/26(木) 20:40:13
|式中に現われる型「Tの配列」という左辺値は、
|3つの例外を除いて、配列の最初の要素を指すポインタに意味が格下げになる。
|結果としてできるポインタの型は「Tへのポインタ」となる。

|3つの例外とは、
|1) 配列がsizeofのオペランドとなるとき
|2) アドレス演算子&のオペランドとなるとき
|3) )char型の配列を文字列リテラルで初期値するとき
|を指す。

配列に&が使えないとか言ってるのは以前からいる馬鹿なので放置で。
974デフォルトの名無しさん:2009/03/26(木) 20:40:53
配列型は変更可能ではないが左辺値であり
アドレス演算子のオペランドになり得る。
(但し、演算結果は単なるポインタではなく、「配列を指すポインタ」)
実装依存じゃないし、C90から変わってない。

因みに、BCC はその辺バグ多し。
975デフォルトの名無しさん:2009/03/26(木) 20:42:02
>>971
ISO/IEC 9899:1999 (E)
JIS には段落番号がついてないから自分で字下げを数える
976デフォルトの名無しさん:2009/03/26(木) 20:45:50
ポインタとポインタ変数をごっちゃにするとわけのわからないことになる
977デフォルトの名無しさん:2009/03/26(木) 20:47:19
>>972
>>970のこといってるなら、ANSI Cにあるだろ
6.2.2.1に、「式中の配列名が、コンパイラによって配列の最初の要素へのポインタとして扱われる」
6.7.1に、「関数の引数宣言中の配列名は、コンパイラによって配列の最初の要素へのポインタとして扱われる」
この辺まではどのコンパイラでもちゃんと実装されてる。
&演算子で「配列のアドレス」を取得するときの挙動が、なんかまちまちな気がするんだが。
978デフォルトの名無しさん:2009/03/26(木) 20:47:24
>>976
理解してれば文脈で区別できるんだけどね
なるべくなら面倒がらずにポインタ値/ポインタ変数と書き分けたほうがいい
979デフォルトの名無しさん:2009/03/26(木) 20:48:16
>>977
違うよ
配列はポインタに成り下がらないとか
&演算子は使えないとか言ってるバカのほうだよ
980デフォルトの名無しさん:2009/03/26(木) 20:50:06
>>974
おまえはなにをいってるんだ
「規約で決まっていることが、正しく実装されているとは限らない」という意味で実装依存といったが、あんまりそういう言い方はしないか。
規約で決まっていないことは、不定って書くだろ。
981デフォルトの名無しさん:2009/03/26(木) 20:51:37
>>980
春だなぁ・・・
982デフォルトの名無しさん:2009/03/26(木) 20:53:13
実装依存というのは通常、規格が許容する範囲において
実装ごとに異なってもよいことになっている動作のこと。
実装が規格に従っていないのならそれはもはや実装依存以前の問題だ。
983デフォルトの名無しさん:2009/03/26(木) 20:55:18
>>975

オブジェクト型または不完全型へのポインタは、他のオブジェクト型又は不完全型
へのポインタに型変換できる。その結果のポインタが、被参照型に対して正しく
境界調整されていなければ、その動作は未定義とする。そうでない場合、再び
型変換で元の型に戻すならば、その結果は元のポインタと比較して等しくなければ
ならない。オブジェクトへのポインタを文字型へのポインタに型変換する場合、その
結果はオブジェクトの最も低位のアドレスを指す。その結果をオブジェクトの大きさまで
連続して増分すると、そのオブジェクトの残りのバイトへのポインタを順次生成できる。

えーと、これがJISの該当部分なんですけど、これと配列に&演算子を付けるのとは
どういう関係があるんでしょうか?どうしてもわかりませんでした。
984デフォルトの名無しさん:2009/03/26(木) 21:15:04
985デフォルトの名無しさん:2009/03/26(木) 21:17:20
>>983
cr へのポインタは、char
へのポインタに型変換できる。その結果のポインタが、char 型に対して正しく
境界調整されていなければ、その動作は未定義とする。そうでない場合、再び
型変換で char(*)[100] に戻すならば、その結果は &cr と比較して等しくなければ
ならない。cr へのポインタを文字型へのポインタに型変換する場合、その
結果は cr の最も低位のアドレスを指す。その結果をオブジェクトの大きさまで
連続して増分すると、cr の残りのバイトへのポインタを順次生成できる。

要は cr がオブジェクトかどうかだ
986985:2009/03/26(木) 21:19:05
悪い、cr じゃなく a だった
987985:2009/03/26(木) 21:25:36
あーあかん、疲れとるw

a へのポインタは、char
へのポインタに型変換できる。その結果のポインタが、char 型に対して正しく
境界調整されていなければ、その動作は未定義とする。そうでない場合、再び
型変換で char (*)[1000] に戻すならば、その結果は &a と比較して等しくなければ
ならない。a へのポインタを char 型へのポインタに型変換する場合、その
結果は a の最も低位のアドレスを指す。その結果を a の大きさまで
連続して増分すると、a の残りのバイトへのポインタを順次生成できる。

今日は早寝すんべ
988934:2009/03/26(木) 21:55:13
>>936亀レスだが。意味が無いはいいすぎだと思うぞ。(くやしい!w)

・structでくるんだ例が>>942で出てるが結局はそれと同じこと

・文字列は終端が分かるからいわば可変長配列のように扱えるから添え字を消してもかまわない。
 しかし,>>934の場合「10×100の配列」(ただし渡すときはポインタお願い)であることを
 強制したい/できることに意味があるわけで。

設計の問題であって,意味が無いわけではないからな。ぷんぷん。
989デフォルトの名無しさん:2009/03/26(木) 22:15:50
まあ確かに動くには動くが・・・・こんな事やったの初めてだぜ

#include <stdio.h>
#include <string.h>

void fun(char (*a)[10][100])
{
int i;

for (i = 0; i < 10; i++)
sprintf(a[0][i], "test %d", i);
}

int main(void)
{
char cr[10][100];
int i;

fun(&cr);

for (i = 0; i < 10; i++)
printf("test->%s\n", cr[i]);

getchar();
return 0;
}
990デフォルトの名無しさん:2009/03/26(木) 23:02:47
小学3年生なんですけど、なんで日本語のプログラム言語は普及しないの? 
991デフォルトの名無しさん:2009/03/26(木) 23:09:24
スレ違い
992デフォルトの名無しさん:2009/03/26(木) 23:10:42
世界的には日本語を使う人よりも英語を使う人の方が多い
993デフォルトの名無しさん:2009/03/26(木) 23:20:30
英語
994デフォルトの名無しさん:2009/03/26(木) 23:44:57
入力が面倒臭い
995デフォルトの名無しさん:2009/03/27(金) 01:18:55
残念ながら、各国の人口を考慮すると言うまでもなく中国語が
母国語として使う人が一番多いんだよな・・・まぁ、地方によって差はあるけどな。
996デフォルトの名無しさん:2009/03/27(金) 01:22:29
別に母国語としてる人の数とかどーでもいーし
997デフォルトの名無しさん:2009/03/27(金) 01:26:12
母国語でなくても、世界レベルで英語を日常生活で使う人の人口を考慮したら
どんなものか?母国語、国籍に拘らずとも日常生活で使う言語としては
より多くの国で選択されるが、現実的に見ると、ヨーロッパ、中東は無視できない。
その他、植民地、支配された国はその支配国の言葉が公用語として使われているが
中には原住民の言葉も根強く残っている国もある。世界は広いぞ。
己の浅はかな知識で語ることなかれ。
998デフォルトの名無しさん:2009/03/27(金) 01:33:34
アフリカ諸国に注目してみよう。小国なんてどうでも良いかもしれないが
それらがいくつか合わせると結構な人数にはなる。

http://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%B3%E3%83%93%E3%82%A2
http://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%8D%E3%82%AC%E3%83%AB
こんな地形で囲まれた国もあるわけだが、公用語は英語、フランス語。
しかし、島国ジャポネーゼでは考えもしないだろう。陸地で接する国境。
渡航せずにお隣の国に行けるのだが、隣の県が別の国の言葉みたいなものだ。
まぁ、そんな状況説明はともかく、南米にしろヨーロッパ諸国の領地、支配下の国は
普通に存在する。しかし、英語は扱いやすい。エスパニョールやフレンチ、イタリアーノは
ちょっと英語ができる俺でも、肌に合わない。
999デフォルトの名無しさん:2009/03/27(金) 01:34:51
だが、大学ではなぜか中国語を履修していたこともある。俺は生っ粋の日本人だ
我 是 日本人、不是 中国人 なんで、そこんとこよろしくー
1000デフォルトの名無しさん:2009/03/27(金) 01:35:06
中国語は各方言間じゃ会話が成り立たないほどに異なるので、
同じ言語としてくくるのは非常に政治的と言わざるをえないけどね。
「中国語」なんてものがあるのかどうかすら怪しい。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。