C言語なら俺に聞け(入門編)Part 110

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 109
http://toro.2ch.net/test/read.cgi/tech/1350461655/
★過去スレ
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
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 159代目
http://toro.2ch.net/test/read.cgi/tech/1342966104/
★C++言語については避けてください。C++対応明記スレへどうぞ。
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。
  # サイズが大きい場合はアップローダ等を利用してください。
http://codepad.org/
http://ideone.com/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
2デフォルトの名無しさん:2012/11/17(土) 19:36:12.95
< `∀´> ニダー
3デフォルトの名無しさん:2012/11/17(土) 19:36:45.88
/* NOTREACHED */
4デフォルトの名無しさん:2012/11/17(土) 19:37:19.37
/* FALLTHROUGH */
5デフォルトの名無しさん:2012/11/17(土) 19:37:50.94
ここまでテンプレ
6デフォルトの名無しさん:2012/11/17(土) 19:58:41.67
>>http://toro.2ch.net/test/read.cgi/tech/1350461655/989
前スレの変数定義を含むヘッダファイルのincludeだけど、ヘッダの内容を変更してもいいならこれで通るんじゃない?

@DEV.hの内容を変更して上書きするプログラムを作成、DEV.h更新毎に実行する。処理内容は、
int data[] = {0, 1, 2};
みたいな行を、以下に展開する(#if追加、externの分岐)。
#ifndef DEV_H_INCLUDED
 int data[] = {0, 1, 2};
#else
 extern int data[];
#endif

AA〜C.cのいずれか1つ
#include "DEV.h"

Bそれ以外
#define DEV_H_INCLUDED
#include "DEV.h"
7デフォルトの名無しさん:2012/11/17(土) 20:08:44.16
>>6
毎度毎度やってらんねって話だからどうだろう
8デフォルトの名無しさん:2012/11/17(土) 20:15:48.28
ヘッダいじっていいなら削除すればいいだろ
9デフォルトの名無しさん:2012/11/17(土) 20:29:11.80
そりゃヘッダ直して良いならなんでもありだろ
ビルドスクリプトに組み込むもよし
106:2012/11/17(土) 20:33:43.63
>>7-8
いやさ、これだと差分探してBにもCにもコピペするっていう手間は省けるじゃん。
DEV.hが更新されたら置換exeをダブルクリックするだけよくて、A〜Cが毎回の変更されることもないし。
ヘッダ内での定義を削除するだけだと、ヘッダ内の変数名はそのままdataで初期値がこっそり変更されてた場合、
A〜Cのいずれかに変更後のdataの定義を反映させないといけなくなるし見落とすかもだし。

>>9
989!どうなんやコラ!!  変更してもいい感じですか?
11デフォルトの名無しさん:2012/11/17(土) 20:49:56.95
正しい対応は前スレの921 ↓とても邪道な対応法(ネタ)

#ifdef DEFINE_DATA
static int data_[];
#define data *data = data_; static int data_
#else
#define data *data; static int data_
#endif

#include "DEV.h"
#undef data

Qzはレス禁止。再利用も禁止。アイデアの盗用禁止。
12デフォルトの名無しさん:2012/11/17(土) 20:52:23.48
× 正しい対応は前スレの921
● 正しい対応は前スレの991
13デフォルトの名無しさん:2012/11/17(土) 21:37:46.81
C言語でプリコンパイルチューナーを作っているんですが
()の付け忘れとかに;が付け忘れていたら自動的に付けてくれるように
したいのですがどうすればいいでしょうか?

for()と
printf()の場合
for()の後ろには;はつけないですがprintf()の後ろには;を付けます。
14デフォルトの名無しさん:2012/11/17(土) 21:39:35.41
hogehoge() + 1 みたいな数式で発狂しそうだな。
15989:2012/11/17(土) 21:40:16.19
皆様アドバイスありがとうございます。

DEV.hの修正は問題ありませんが、
頻繁に変更されのるのでその都度、DEV.hに修正を加えるのではあれば、
コピペが面倒という目的からずれてしまうので・・・

990様のアドバイス通り、ラッパを作成して一つのファイルのみしか
インクルードしない様に修正したいと思います。
メーカに文句も言いますがいつ修正されるか分かりませんので。

ありがとうございました。
16デフォルトの名無しさん:2012/11/17(土) 21:41:09.23
>>14
ツールとして無いですかね?

制御式の所を丸括弧にしたり、配列の括弧を波括弧にしたり
する間違いが多くて....
デバッグメントしてると時間がかかりすぎて
17デフォルトの名無しさん:2012/11/17(土) 21:44:56.96
>>16
補完機能やスニペット、フォーマッタのあるIDE使えばいいよ。eclipseとかVC++とか。
18デフォルトの名無しさん:2012/11/17(土) 21:52:26.57
C言語というよりプログラミングの話なのですが良いでしょか。

よく似た処理を行う関数が2つあります。処理の8割は同じコードになります。
しかし2つの関数の引数は一部違っています。例えばこのように。
FuncA( int a, char *s); FuncB( int a, int b , int c);
この場合どうコーディングするのがベターでしょうか。理由も教えて下さい。

(1)処理の同じ部分は無視して、全く別々に関数をふたつ作る。
(2)処理の同じ部分を切り出してみっつめの関数を作り、ふたつの関数から呼び出すようにする。
(3)ひとつの関数を作って、引数にフラグを追加して、関数の内部で処理を分ける。
(4)その他に良い案があれば
19デフォルトの名無しさん:2012/11/17(土) 21:53:02.36
c言語でオーバーロード的な事を実装したらいいんじゃないか?
20デフォルトの名無しさん:2012/11/17(土) 21:55:23.14
>>18
2か3で
21デフォルトの名無しさん:2012/11/17(土) 21:58:57.91
そもそもヘッダファイルに実体を吐く時点でツール側の設計が
おかしいんだけど、組み込みの世界は割とそういうのがある。
22デフォルトの名無しさん:2012/11/17(土) 22:02:33.50
ハード屋が書いてる?
23デフォルトの名無しさん:2012/11/17(土) 22:09:09.96
C言語で3次元配列ってどうしたらいい?
24デフォルトの名無しさん:2012/11/17(土) 22:10:24.52
1次元配列が3重になってるだけだから。

int a[10][10][10];

とかすればいい。
25デフォルトの名無しさん:2012/11/17(土) 22:10:26.43
ハード屋ソフト屋は関係ないんじゃね?
能力が低いとか別の理由だよ
26デフォルトの名無しさん:2012/11/17(土) 22:12:21.97
もしかしたら使うほうがヘボなだけで
何かマクロ定義すりゃいいだけになってる可能性もある
27デフォルトの名無しさん:2012/11/17(土) 22:12:53.89
結論としては>>25だけど、ツール作ってるのがソフト専業ではない
ハード屋だからっていうのは確かにありそうな話。

多数のファイルから参照するヘッダをどう作るべきかという基本を
知らないんでしょう。
28デフォルトの名無しさん:2012/11/17(土) 22:14:17.03
ヘッダファイルの利点がよく分からない
29デフォルトの名無しさん:2012/11/17(土) 22:37:05.40
c#のsystem.diagnostics.debug.writeline()に相当する関数はありますか?
30デフォルトの名無しさん:2012/11/17(土) 23:13:25.38
fprintf(stderr,"msg");
31デフォルトの名無しさん:2012/11/17(土) 23:36:20.48
int *p;
int* p;
これってアスタリスクの位置が違うだけで、意味同じですよね
どっちに書くかは人の好みってことで
32デフォルトの名無しさん:2012/11/17(土) 23:40:59.78
ハード屋がドライバを書き
ソフト屋がドライバから逃げ回りwww
33デフォルトの名無しさん:2012/11/17(土) 23:44:10.26
ハード屋の設計ミスなのにソフト屋が尻拭いさせられる
34デフォルトの名無しさん:2012/11/18(日) 00:17:11.72
このコードって安全 かつ ポインタの使い方は正しいですか?

int *memoryPointer;
int MEMORY_SIZE = 1024;

memoryPointer = (int*)calloc(MEMORY_SIZE, sizeof(int));

for (int i = 0; i < MEMORY_SIZE; i++) {
    *(memoryPointer + i) = i;
}

for (int i = 0; i < MEMORY_SIZE; i++) {
    std::cout
      << "アドレス:" << memoryPointer
      << " 値:"    << *memoryPointer
      << std::endl;
    memoryPointer++;
}
35デフォルトの名無しさん:2012/11/18(日) 00:20:07.00
>>34
スレ違い。それC++でしょ。
36デフォルトの名無しさん:2012/11/18(日) 00:28:19.00
>>34
malloc とかで確保したアドレスは大事に取っておいたほうが free するときに困らない
37デフォルトの名無しさん:2012/11/18(日) 00:32:21.97
>>31
はい
38デフォルトの名無しさん:2012/11/18(日) 00:46:43.14
C++つかうなら、メモリはnew, delete
39デフォルトの名無しさん:2012/11/18(日) 02:59:10.08
40デフォルトの名無しさん:2012/11/18(日) 03:07:17.87
>>39
あなたはおバカさんですよね?
41デフォルトの名無しさん:2012/11/18(日) 06:08:34.10
>>34
個人的には

> for (int i = 0; i < MEMORY_SIZE; i++) {
>     *(memoryPointer + i) = i;
> }
 ↓
for (int i = 0; i < MEMORY_SIZE; i++) {
  memoryPointer[i] = i;
}

の方がしっくり来る。
42デフォルトの名無しさん:2012/11/18(日) 06:10:08.47
>38
mallocでも良い
必要に応じて使い分ける
43デフォルトの名無しさん:2012/11/18(日) 06:16:17.22
>>34
個人的には

> for (int i = 0; i < MEMORY_SIZE; i++) {
>     *(memoryPointer + i) = i;
> }
 ↓
for (int i = 0; i < MEMORY_SIZE; i++) {
  *memoryPointer++ = i;
}
memoryPointer -= MEMORY_SIZE;

の方がしっくり来る。

あと全領域どっちみち初期化するならcallocは時間の無駄じゃないかな。
44 忍法帖【Lv=2,xxxP】(4+0:5) :2012/11/18(日) 07:44:26.15
テキストファイル内の各単語の出現回数を出力するプログラムを組みたいんですが
codepad.org/S50sUd2z

出現する単語を縦に書き並べてアルファベット順にソートして、出力するプログラムです
この隣り合った行の単語同士でstrcmpして、値が0になれば頻度数wrdfreqを加算、そうでなければ前の単語wrdを一旦出力、頻度数の加算を最後にしてwrd, wrdfreqを初期化、という方針を考えています
(忍法帖リセット食らったみたいでリンクできません)
45デフォルトの名無しさん:2012/11/18(日) 07:50:59.79
ポインタにインデックスつけてアクセスするのとポインタ自体を
インクリメントするのは結果は同じでも意味は全然違うぞ。
46 忍法帖【Lv=2,xxxP】(5+0:5) :2012/11/18(日) 07:55:15.04
続/き/で/す
さ/く/ら/が/咲/い/て/ま/す/よ/。/食/ら/う/の/で/対/策/し/て/ま/す

2/つ/目/の/p/r/i/n/t/f/ま/で/大/丈/夫/で/すが/、/そ/の/先/S/e/g/m/e/n/t/a/t/i/o/n f/a/u/l/t/に/な/っ/て/い/ま/す
ポ/イ/ン/タ/は/ま/だ勉/強/途/中で/す
こ/の/場/合/は/ど/う/す/れ/ばい/いで/すか
テ/キ/ス/ト/は/こ/れ/を/標/準/入/力/し/て/く/だ/さ/い
d/b/./t/t//Y/r/A/0/M/8/C/Y
47デフォルトの名無しさん:2012/11/18(日) 08:18:45.98
>>45
意味が違っても結果が同じならいいじゃないか。
プログラマは詩人ではない。工作屋だ。
48デフォルトの名無しさん:2012/11/18(日) 08:30:09.83
>>45 >>47
実行速度も変わるケースが多いから
速度が影響するシステムなら
書き方にも意識してプログラミングすべき
4934:2012/11/18(日) 09:36:29.68
お前らレスありがとう

>>35, >>38
std::cout使っているけど、めっちゃC言語の勉強してる
50デフォルトの名無しさん:2012/11/18(日) 09:38:48.66
C言語初心者にオススメの書籍を教えてください
51デフォルトの名無しさん:2012/11/18(日) 09:41:22.68
神の誕生
52デフォルトの名無しさん:2012/11/18(日) 09:51:18.78
はじめてのC
53デフォルトの名無しさん:2012/11/18(日) 10:07:28.15
関数ポインタの配列の長さを知りたいんですが、C#だとこんな感じです
var l = new List<Action<string>>();
l.Add(new Action<string>(m => {}));
System.Diagnostics.Debug.WriteLine(l.Count);


Cだとこれでいいんですか?
void (*func[])(const char*) = {printMsg, printMsg2};
int size = sizeof(func) / sizeof(printMsg);
54デフォルトの名無しさん:2012/11/18(日) 10:17:58.95
char msg[] = "msg";
msgの値は変更することが出来ないんですよね?
だから、msg++とかが出来ない。

const char *msg = "msg";
こっちは、msg++;ができます。これは、msg = hellw;は出来ないけど、msgに保持しているアドレスは
上書き可能ってことですか?
55デフォルトの名無しさん:2012/11/18(日) 10:43:36.87
>>17
Sublime Text 2 も結構いい。
56デフォルトの名無しさん:2012/11/18(日) 11:11:45.49
>>54
配列として宣言されたmsgはリテラル(アドレス値)だから
変更できない。msgのアドレスから保持している文字列は
変更可能だけど。

ポインタ変数として宣言された*msgはmsgというポインタ変数に
"msg"という「コンパイラがどこかに定義した文字列」のアドレス
を代入している。msgがポインタ変数だから増減もできる。

msg[]の場合
msg  'm'
msg+1 's'
msg+2 'g'

*msgの場合

msg = 0x????????

0x????????  'm'
0x????????+1 's'
0x????????+2 'g'

ということ。
57デフォルトの名無しさん:2012/11/18(日) 11:12:54.02
>>56
あとconstと配列とポインタに関する認識が根本的に間違ってる。
エキスパートCプログラミングを買って100回読破せよ。
58デフォルトの名無しさん:2012/11/18(日) 11:29:18.22
>53
int size = sizeof(func) / sizeof(func[0]);
59デフォルトの名無しさん:2012/11/18(日) 12:23:24.87
C言語に限らずかもしれないですけど、コンパイルされてCPUが分かる命令コード
01のならびに変換されると言いますよね。もちろんターゲットCPUが違えば変換コード
も違うのでx86系とPowerPC系のコードが違うのは分かるんですが、じゃ、同じx86系
で動くWindowsとLinuxの場合、なんでプログラムが互換じゃないんでしょうか。
このときOSは何の役割をやっているのですか?
60デフォルトの名無しさん:2012/11/18(日) 12:39:32.76
>>59
OSはABI(レジスタに積む/スタックに積む)やファンクションコール(int 21h/int 0x80h)やバイナリフォーマット(COFF/ELF)を規定する。
OSによってABIやファンクションコールやバイナリフォーマットが違う。
アプリケーションって命令コードだけでできてるんじゃないんだよ。
61デフォルトの名無しさん:2012/11/18(日) 13:04:29.11
>>60
そうすると、OS+CPUの組を指定して生成されるコードは
OSのAPIのコード+ターゲットCPUのコードということなんでしょうか。
62デフォルトの名無しさん:2012/11/18(日) 13:07:26.97
OSつうかローダだろ
63デフォルトの名無しさん:2012/11/18(日) 13:11:01.87
OSっていうのはフレームワークを提供するだけだから
たとえマシンコードが同じでも違うフレームワーク用の
プログラムは動かない。

そういうこと。
64デフォルトの名無しさん:2012/11/18(日) 13:32:46.18
>>61
Cに関して言えばライブラリである程度隠蔽されるから直接ファンクションコールを叩くようなコードを生成することはまずない。
バイナリフォーマットとABIの問題が大きい。

しかし、バイナリレベルでの互換性を確保したところで
次は利用できるライブラリやデバイスの差異という壁が立ちはだかることになる。
directxやwinapiはwindowsでしか使えないみたいな。
65デフォルトの名無しさん:2012/11/18(日) 17:56:01.67
>>59
OSが許せば
システムコールやWinXXAPI使わなければ
互換ですよ
VMとかで試せば判る
66デフォルトの名無しさん:2012/11/18(日) 18:02:38.79
codepadでファイル入出力がしたい場合どうすれば?
67デフォルトの名無しさん:2012/11/18(日) 19:06:34.20
http://codepad.org/about
Paranoia
When your app is remote code execution, you have to expect security problems.
Rather than rely on just the chroot and ptrace supervisor, I've taken some additional precautions:
The supervisor processes run on virtual machines, which are firewalled such that
they are incapable of making outgoing connections.
The machines that run the virtual machines are also heavily firewalled,
and restored from their source images periodically.
68デフォルトの名無しさん:2012/11/18(日) 20:52:38.68
あるところでnewしたポインタに後にアクセスすると、中身が変わっていたりセグフォが起きます
こういう現象は何が問題なんでしょうか?
newでなくmallocでも同じです

クラスメンバ
float* p;

クラスメンバ関数

void fun1(){
p=new float[num]
//略
}

void fun2(){
//pの要素にアクセスすると中身が変わってる
//pの先頭アドレスも変わってる
}
69デフォルトの名無しさん:2012/11/18(日) 21:06:27.50
内容が変わるのはどこかで書き換えるようなことしてるから
アドレスが変わるのはreallocなりしたからだろ
70デフォルトの名無しさん:2012/11/18(日) 21:10:20.93
>>68
これだけではわからん
症状が再現する最小のコードをcodepadに上げて実行してみてくれ
71デフォルトの名無しさん:2012/11/18(日) 21:14:24.66
スタックぶっ壊してpが書き換わってるに一票
72デフォルトの名無しさん:2012/11/18(日) 21:35:26.76
書かれてない部分のコードに問題があるな
73デフォルトの名無しさん:2012/11/18(日) 21:46:15.32
static float*p0,**p1;
void fun2(){
flaot*p;
*p1=&p; p=p0=malloc(x);
… ポインタ操作; assert(*p0==**p1); …}
74デフォルトの名無しさん:2012/11/18(日) 21:57:21.22
バグは本人が関係無いと思っている場所にこそ在る
75デフォルトの名無しさん:2012/11/18(日) 22:08:27.49
static関数はprivateなので、ヘッダファイルに書かないのが一般的なのでしょうか?
76デフォルトの名無しさん:2012/11/18(日) 22:27:49.53
うん、一般的だよ
77デフォルトの名無しさん:2012/11/18(日) 22:46:51.30
>>76
thx
78デフォルトの名無しさん:2012/11/18(日) 23:02:12.82
ポインタ/配列は色々とコードを書かないとよくわかない事が分かった。
高級言語では気にしなくていいメモリ管理がここまで面倒だとは...
とりあえず、色々とメモリ破壊してC言語覚えていくしかないのかー
79デフォルトの名無しさん:2012/11/18(日) 23:04:15.52
>>73
> flaot*p;
> *p1=&p; p=p0=malloc(x);
   ↓
> float*p;
> p=p0=malloc(x); *p1=&p;

順序が逆では?
8079:2012/11/18(日) 23:05:37.29
失敬。勘違いしたorz >>79は間違い
8168:2012/11/18(日) 23:19:50.33
68です
レスしてくださった方々ありがとうございました
これから見直してみます
82デフォルトの名無しさん:2012/11/18(日) 23:45:00.47
>>78
うん。本をパラパラめくって見ているだけではわからない。
実践的な意味のあるコードを書き、動作を確認して初めてわかる。
よく入門書にある、下のようなコードはダメだ。
これを見てふーんとわかるのなら既に入門者ではない。
int a, *b;
a = 10;
b = &a;
printf("%d\n",*b);
83デフォルトの名無しさん:2012/11/19(月) 00:20:58.39
ダメな理由がわからないorz
84デフォルトの名無しさん:2012/11/19(月) 00:24:17.56
ではそのコードを入門者にも分かるように説明してください
入門編に相応しいような解説を付けてください
85デフォルトの名無しさん:2012/11/19(月) 00:36:34.84
自分で紙に書きながらCPUの動作をトレースしないと
ポインタはわかんないよ。
86デフォルトの名無しさん:2012/11/19(月) 00:45:35.09
>>83
この例題で納得しているようではダメということだろう
87デフォルトの名無しさん:2012/11/19(月) 00:51:25.52
そういうことか・・・日本語勉強してきます
88デフォルトの名無しさん:2012/11/19(月) 01:10:01.75
>>83,84
誤解しないで欲しい。
ダメというのは、これはアプリとして無意味なコードであるということだ。
上級者は無意味であるとわかるから、ふーんで済ませられる。
しかし入門者はこのコードに深い意味があるものと思い、理解しようと試みる。
ところが意味のないコードだから、「こんな面倒くさいことせずに
そのままaを使えばいいじゃないか」という疑念が湧き、理解にならない。

これでは入門書としてダメだ。
ポインタには、ポインタが活躍できる場面というものがある。
それを示す有用なコードを見せて、ポインタはこういう動作をするから
こんな用途に使えるんですよ、と教えるのが入門書の役目だろう。
89デフォルトの名無しさん:2012/11/19(月) 01:14:16.35
で、入門書に最適、つまり有用でそれなりに短く
しかも入門者に理解させる用をも兼ね備えた
そのコードの実例は
90デフォルトの名無しさん:2012/11/19(月) 01:16:22.38
swap だろうな
91デフォルトの名無しさん:2012/11/19(月) 01:23:46.47
>>88
>アプリとして無意味なコード
そんなこと言ったらテキストにのってるコードすべてがそうだわ。
とりあえず、>>82で使い方覚えて、さらっとCの文法を終わらせて
文字列と配列とポインタとか、リスト構造とかそういうのでだんだん
深くなれていけばいい。
92デフォルトの名無しさん:2012/11/19(月) 01:40:32.84
ポインタの活躍例
ttp://ideone.com/soUTSo
93デフォルトの名無しさん:2012/11/19(月) 01:41:40.27
>>88
正論

>>89
構造体でlinkedlist
94デフォルトの名無しさん:2012/11/19(月) 01:43:07.70
>92
躁鬱
95デフォルトの名無しさん:2012/11/19(月) 01:55:04.38
個人的にはデータ構造やらアルゴリズムやらよりも前に、原始的なアセンブラでも使って、
動いてるプログラムのイメージを持つことがけっこう大事だと思う。Cをやるなら。
もっと高級な言語なら今時そんなイメージはいらんと思うけど。
96デフォルトの名無しさん:2012/11/19(月) 02:01:09.20
>>95
CASLとかやればいい。シミュレータもあるし。ワードマシンというところは
目をつむって。ただ、CPUとかレジスタとメモリのやり取りとかわかったところ
でポインタとかがわかるかとか言えば別。概念的にわかっても表記がgdgd
だから。
97デフォルトの名無しさん:2012/11/19(月) 02:13:35.79
K&Rにあった

void strcpy ( char *s, char *t )
{
while ( *s++ = *t++ )
;
}

の書き方とかいまだに推奨されてんの?
98デフォルトの名無しさん:2012/11/19(月) 02:18:15.18
http://9cguide.appspot.com/c_kandr.html
どっかで見たと思ったらここだった
99デフォルトの名無しさん:2012/11/19(月) 02:26:59.41
そもそもstrcpyはオワコン
strncpyかstrncpy_s

という話はともかく
>97 は書き方としてはアリだよ
100デフォルトの名無しさん:2012/11/19(月) 02:34:02.62
>>97
whileやforの条件式中に処理を詰め込むのは
行儀が悪いという人もいる。
101デフォルトの名無しさん:2012/11/19(月) 02:43:22.13
while ( (*s++ = *t++) != '\0' ){}
が推奨
102デフォルトの名無しさん:2012/11/19(月) 06:05:28.77
>>97
代入式!代入式!ってファビョっちゃう人もいる
103デフォルトの名無しさん:2012/11/19(月) 07:27:33.09
終端文字との比較なんていらんだろ
while((*s++=*d++)){} で十分じゃねーの?
104デフォルトの名無しさん:2012/11/19(月) 08:21:46.73
strcpyの戻り値がインクリメントされる前のsだったら嬉しかったのに
105デフォルトの名無しさん:2012/11/19(月) 09:29:10.59
なんで?
106デフォルトの名無しさん:2012/11/19(月) 10:00:11.64
strcat のことなら同意
107デフォルトの名無しさん:2012/11/19(月) 15:20:28.15
質問お願いします
scanfでの複数入力について
3つ以上の場合

scanf("%d,%lf,%lf",&num,&weight,&height)

という形で良いのでしょうか

scanf("%d,%lf%lf",&num,&weight,&height)

では駄目ですか?

解説お願いします
108デフォルトの名無しさん:2012/11/19(月) 16:50:03.32
>>107
どういう入力フォーマットにするかで話が変わってくる。

1)scanf("%d,%lf,%lf",&num,&weight,&height)
2)scanf("%d,%lf%lf",&num,&weight,&height)
2')scanf("%d%lf%lf",&num,&weight,&height)

フォーマット文字列のカンマ有無が質問の中心と思うので、2'で話をすると

入力が 3, 2.1, 5.2 などカンマ区切りなら1)
入力が 3 2.1 5.2 などホワイトスペース区切りなら2)
109デフォルトの名無しさん:2012/11/19(月) 21:58:09.09
うんこだね
110デフォルトの名無しさん:2012/11/19(月) 21:59:53.38
>>103
s と d は逆のほうがいいな
変数の意味的に
111デフォルトの名無しさん:2012/11/19(月) 22:32:08.93
わろた
112デフォルトの名無しさん:2012/11/20(火) 12:48:55.14
C言語 ポインタ完全制覇」p100

#include <stdio.h>

void hello ( void )
{
fprintf ( stderr, "hello!\n" );
}

void func ( void )
{
void *buf[10];
static int i;

for ( i = 0; i < 100; i++ ){
buf[i] = hello;
}
}

int main ( void )
{
int buf[1000];

func();

return 0;
}

凶悪なサンプルコードとしてあげられているのですが、どこら辺が凶悪なのかわかりません。
ご教示願います。
113デフォルトの名無しさん:2012/11/20(火) 12:50:17.71
>>112
あげた奴に聞けよ
114デフォルトの名無しさん:2012/11/20(火) 13:13:43.77
funcの中でvoid *buf[10];で宣言して、すぐ下のforで10を超えて100まで書き込んでいる。
main内での宣言がfuncで見られるわけないし、変数のスコープの解説だとしても、
なんか意味不明だな。

その本読んだことないけど「凶悪なサンプルコード」とかいう用語使ってる本は大抵クソ。
115デフォルトの名無しさん:2012/11/20(火) 13:25:21.70
func 内で配列を突破して書き込んでるのが凶悪な部分?

<><><><>
func のリターンアドレスをぶっこわして 結果的に関数 hello にさし換え
コンパイルし実行すると なぜか hello! と表示される
ようなコンパイラがあるかどうかは知らん
116デフォルトの名無しさん:2012/11/20(火) 13:26:29.48
スタック上書きで、呼んでないはずのhello()が呼ばれ得ることを示したかったんでないの。
117デフォルトの名無しさん:2012/11/20(火) 13:43:32.20
バッファオーバーフローの説明のためだけのプログラムに、「凶悪」ってアホだよね
セキュリティホールの原理っぽいあたりが「凶悪」なのかも
環境になるべく依存しないように、無理して作った感じ
118デフォルトの名無しさん:2012/11/20(火) 14:08:05.46
hello!が出力される環境って例えば何があるの?
うちのVC++2010とcodepadとideoneでは何も出力されんかった
119デフォルトの名無しさん:2012/11/20(火) 14:10:31.72
ちょっと試してくる!
120デフォルトの名無しさん:2012/11/20(火) 14:17:13.68
>>118
Cygwinのgcc環境だと出たな。

$./a.exe
hello!
.........
........
........
hello!
Segmentation fault (core dumped)
121デフォルトの名無しさん:2012/11/20(火) 14:27:38.63
もしかしてこういう事をしようとしてるのか?読み込み専用セグメントに書き込もうとして
OSエラーで停止したぞ

void hello(void)
{
fprintf(stderr, "hello!\n");
}

void func(void)
{
void *buf[100];
static int i;

for (i = 0; i < 100; i++)
buf[i] = hello;
((void (*)(void))buf)();
}

int main(void)
{
int buf[1000];

func();

return 0;
}
122デフォルトの名無しさん:2012/11/20(火) 14:28:40.93
>>120
最適化オプション-O1 -O2 -O3をつけると出なくなるな。
123デフォルトの名無しさん:2012/11/20(火) 15:09:14.23
>121
((void (*)(void))buf[0])();
124デフォルトの名無しさん:2012/11/20(火) 15:51:33.80
>>123
同じ事やん
125デフォルトの名無しさん:2012/11/20(火) 16:03:04.39
>>122
mainのbufがなくなるからということ?
126デフォルトの名無しさん:2012/11/20(火) 16:46:10.81
>124
127デフォルトの名無しさん:2012/11/20(火) 17:01:52.92
>>126
悔しそうだな
128デフォルトの名無しさん:2012/11/20(火) 17:15:14.70
129デフォルトの名無しさん:2012/11/20(火) 17:40:14.90
なんでhello関数が呼ばれてしまうん?
130デフォルトの名無しさん:2012/11/20(火) 17:41:53.07
どのコードのこと?
131デフォルトの名無しさん:2012/11/20(火) 17:44:25.90
132デフォルトの名無しさん:2012/11/20(火) 17:48:30.72
funcが10個分のvoid*配列bufしかもってないのに、100個分書き込むと、
funcのリターンアドレスを格納してたスタック領域まで
helloの先頭アドレスを書き込んじゃうので、
リターンしたとたんにhelloに飛ぶ。
133デフォルトの名無しさん:2012/11/20(火) 17:51:50.82
>>129
スタックを上書きしてしまっているから。
まぁ、詳しく知りたければアセンブラとスタックについて調べればいいよ。

尚、呼ばれない場合に考えられるのは次のようなケース。
・最適化により、関数がインライン展開されてしまってcallされなくなる。
・そもそも呼び出し元をスタックに退避しないタイプのCPU。
・コードスタックとデータスタックが分離されている環境。
134デフォルトの名無しさん:2012/11/20(火) 18:09:07.65
VC++2008 で最適化なし /Od でコンパイルしたけど
何も出ない
135デフォルトの名無しさん:2012/11/20(火) 18:13:52.48
mainのreturnをreturn buf[0];にでもすると?
136デフォルトの名無しさん:2012/11/20(火) 18:15:17.70
#include <stdio.h>

void hello(void)
{
  fprintf(stderr, "hello!\n");
}

void func(void)
{
  void *buf[1];
  buf[2] = hello;
}

int main(int ac, char **av)
{
  func();
  return 0;
}

これで出たわ
main にある int buf[1000]; も伊達じゃないんだな
137デフォルトの名無しさん:2012/11/20(火) 18:16:04.69
>>125
gccの最適化によってfuncのメモリに書き込む動作自体が無意味なものとして省略される。
138デフォルトの名無しさん:2012/11/20(火) 18:57:10.85
>>136
> main にある int buf[1000]; も伊達じゃないんだな
main 呼び出し元のスタックを汚さないように細工しているつもりかなぁ と思われる
※ スタックはデータ・プログラムで共通
※ ローカル変数は戻りスタックより若いアドレスに配置するモデル

func() の動作では 呼び出し前後でスタックが合わない
(hello の呼び出しが CALL ではなく偽装JMP で、 hello の最後の RET が浮遊する
139デフォルトの名無しさん:2012/11/20(火) 19:20:34.13
>> main にある int buf[1000]; も伊達じゃないんだな
>main 呼び出し元のスタックを汚さないように

というよりも main の int buf[1000]; が無いときは
buf[] に 100 回アクセスする途中でエラーが出て
func() の return まで行かないみたい
(VC++の場合)
140デフォルトの名無しさん:2012/11/20(火) 19:23:12.26
STACKセグメントを越えてアクセスすることになるからそこで保護違反だろうね
141デフォルトの名無しさん:2012/11/20(火) 20:47:41.69
malloc()したメモリを*pointに入れます。でも、もっとメモリが欲しくなった時ってどうするんですか?
*point + 必要な領域を再度OSに割り当ててもらうのは、無駄な気がするのですが
142デフォルトの名無しさん:2012/11/20(火) 20:49:12.15
セグメントという単語を聞くと16bit x86の悪夢を思い出す。
143デフォルトの名無しさん:2012/11/20(火) 20:50:08.46
>>141
realloc()
運がよければ確保した領域を拡張してくれる。実装依存。
運が悪いと新しい領域を確保してまるごとコピーされる。
144デフォルトの名無しさん:2012/11/20(火) 21:11:51.76
配列内の要素を左に1つずつずらしながら値を取得したいんですが
うまくいきません。

char s[] = "today";
int i,j;

for(i=0,j=1;i<strlen(s);i++,j++){
printf("%s\n",s);
s[i]=s[j];
}

どなたかご教示ください
145デフォルトの名無しさん:2012/11/20(火) 21:14:06.54
>>144
インデックスアクセスでは解決できない理由は何ですか?
ずらすことに意味はありますか?
146デフォルトの名無しさん:2012/11/20(火) 21:18:39.85
どうなったら、「うまくいった」といえるの?
147デフォルトの名無しさん:2012/11/20(火) 21:20:28.47
>>145
インデックスアクセスとは・・・?
配列内で2文字の文字列を検索するような物を作りたいと思ってます
148デフォルトの名無しさん:2012/11/20(火) 21:30:21.84
検索するのにどうしてずらすひつようがあるのか
149デフォルトの名無しさん:2012/11/20(火) 21:39:32.31
ポインタ1個挟んだら?
char *p = s;
for (i=0; i<strlen(s); i++) {
 printf("%s\n", p);
 p++;
}

(s の指してる先は変わってない&書き換えてない)
p の指し先を 文字列の先頭から末尾へむかって順に送ってくと
p から読み出せる文字列は あたかも先頭の1文字を削っていったかのごとく読み出せる
150デフォルトの名無しさん:2012/11/20(火) 21:41:01.20
>>144
char s[] = "today";
int i, j;
for (j = strlen(s); j > 0; j--) {
printf("%s\n", s);
for (i = 0; i < strlen(s) - 1; i++) {
s[i] = s[i + 1];
}
s[i] = '\0';
}

こんなのは?
151デフォルトの名無しさん:2012/11/20(火) 21:45:02.73
>>147
char str[] = "何か書く";
char search[2] = "検索したい文字列"
int i;
for (i = 0 ; i < strlen(str) - 1 ; i++)
if (str[i] == search[0] && str[i+1] == search[1])
printf("Exist.");
こういうことか?
152デフォルトの名無しさん:2012/11/20(火) 21:46:16.41
検索したいなら strstr(); 使えば…
153デフォルトの名無しさん:2012/11/20(火) 21:47:06.14
strstrを実装するというお題なのか、検索したいだけなのか
154デフォルトの名無しさん:2012/11/20(火) 21:51:01.25
みなさんありがとうございます
参考にさせていただきます。

strstr();も使った方法も考えてみます。
155デフォルトの名無しさん:2012/11/20(火) 23:36:17.76
いえいえ
156デフォルトの名無しさん:2012/11/21(水) 13:03:08.05
野菜しエスパーがたくさんいるんだなぁ みつを
157デフォルトの名無しさん:2012/11/21(水) 16:53:07.44
ちょっと分からないので教えて下さい
C言語でスレッド勉強しているんですが

a=sin(1) b=sin(2)とする。

a=a+b;  (1)

b=b+a; (2)

という処理を(1)(2)の順番で記述した場合
順次実行なら明らにa=3 b=5ですが

同時の場合はどうですか?

分からないのが同時といっても
完全にaとbの組のクローンを二つつくって(1)と(2)で実行する
場合(1)=3 (2)=3となりますが
お互いのa bを参照しながら
同時に実行なら速度(1)/sと(2)/s違いによって
結果は変わると思うのですが
"同時"といった場合クローンなのでしょうか?どうですか?
158デフォルトの名無しさん:2012/11/21(水) 17:01:13.17
わからんぞ
全然わからんぞ
159デフォルトの名無しさん:2012/11/21(水) 17:04:44.72
>>157
まず質問の趣旨を正確に伝える日本語力から養ってくれ。
160デフォルトの名無しさん:2012/11/21(水) 17:15:32.57
エスパーとしては、スレッドだと、
同時なのかちょっと同時なのか全然同時じゃないのか、
どれもあり得るということだ。

あと、a=a+b が一つの処理じゃなくて、
aを読む
bを読む
足す
aに書く
の4段階なのだ。
b=b+a も4つに分解されて、あらゆる順序の組合せで動きうるのだ。
161デフォルトの名無しさん:2012/11/21(水) 17:35:55.92
マルチコアなら完全同時も桶
っつーかsin()はスレッドセーフじゃねーぞゴルァ
162デフォルトの名無しさん:2012/11/21(水) 18:27:51.82
この問題が解けない人はプログラマの素質がない
http://engawa.2ch.net/test/read.cgi/poverty/1353473873/


こういうクソコードかくやつはごみ
163デフォルトの名無しさん:2012/11/21(水) 18:52:50.80
鼻からニャルラトホテプ星人が出た
164デフォルトの名無しさん:2012/11/21(水) 18:56:46.30
C言語の問題です

int i;
int a[2];

a[0] = 5;
a[1] = 5;

i = 0;
a[i] = ++i;

このときa[0]とa[1]の値をそれぞれ答えなさい
165デフォルトの名無しさん:2012/11/21(水) 19:01:00.03
a[0] = 5;
a[1] = 1;
166デフォルトの名無しさん:2012/11/21(水) 19:08:10.93
++と--をイディオム的なところ以外で使うやつはチームにいらん
167デフォルトの名無しさん:2012/11/21(水) 19:35:20.46
コンパイル通るといいな 〜 なんか動いた まで
168デフォルトの名無しさん:2012/11/21(水) 19:40:20.38
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html

Q 【a[i] = i++;】
 配列に0から始まる整数の値を入れたい。次のコードはなぜうまく動かないか。

int a[10];
int i = 0;

while (i < 10)
a[i] = i++;


i++ という式を実行すると、 i の値が変化します。このような振る舞いのことを副作用と呼びます。ある変数に 対して副作用が生じるような式においては、他の箇所でその変数を参照すること はできません。その結果は未定義とされています。

 この式の場合、 i は i++ の他に、配列 a の要素を指定するために参照されているため、その結果は未定義となるのです。

 K&Rの記述を読むと、上の結果は不定であると解釈できるような記述があり ますが、ANSI Cの規格では、不定ではなく未定義の扱いとすることになっています。

(参考 comp.lang.c FAQ 3.1)
169デフォルトの名無しさん:2012/11/21(水) 20:00:16.38
>未定義の コードを実行した結果「鼻から悪魔が飛び出しても仕様に反しない」というjoke が流行したことがありました。
170デフォルトの名無しさん:2012/11/21(水) 20:18:00.47
ブードゥーマジックかよ
171デフォルトの名無しさん:2012/11/21(水) 21:43:34.20
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
int i,ii,n=100000;
double x,y,z,sum=0.0,zsum=0.0,ans;
double za[100000]={0};
srand((unsigned int)time(0));
for(i=0;i<n;i++){
x=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1 <= x <= 1
y=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1 <= y <= 1
z=2.0*(rand()/((double)RAND_MAX+1.0f));
for(ii=0;ii<2000;ii++){
if(0.001*ii<=z && z<0.001*(ii+1)){
if(x*x+y*y<=1.0-(0.0005*ii)){
sum=sum+1.0;
za[ii]=z;
}
}
}
}
for(i=0;i<100000;i++){
zsum=zsum+za[i];
}
ans=zsum/sum;
printf("%f %f %f\n",sum,zsum,ans);
return 0;
}
正しい値が出てきません お願いします
172デフォルトの名無しさん:2012/11/21(水) 21:44:35.58
173デフォルトの名無しさん:2012/11/21(水) 23:27:49.58
ポインタについてわかりやすく解説してるサイト知らない?
わかりやすさに個人差はあるけれど...
「ここわかりやすかったな」とか「ここ勉強になったな」とか
174デフォルトの名無しさん:2012/11/21(水) 23:39:32.12
下手な説明して混乱させるサイトより、K&R2でもきっちり読めばいいと思うよ
175デフォルトの名無しさん:2012/11/21(水) 23:41:14.93
未だにあんなの読んでる人いるの?
176デフォルトの名無しさん:2012/11/21(水) 23:42:25.93
その「あんなの」も読みこなせなかったの?
177デフォルトの名無しさん:2012/11/21(水) 23:45:15.47
どんな型だろうとポインタが4バイトの変数(32bitの場合)だと理解してから急速に理解が速まったな
178デフォルトの名無しさん:2012/11/21(水) 23:58:39.30
>>173
ポインタの宣言と利用でつまづいているのか、配列とポインタあたりなのか、
ポインタの引数がどうとか、ポインタの複雑な読みなのかどこかで違うだろ
179デフォルトの名無しさん:2012/11/22(木) 00:06:26.38
ポインタでつまづく奴の気持ちがわからん
180デフォルトの名無しさん:2012/11/22(木) 00:07:11.62
ポインタの文法がおかしいと思わない奴は知性が足りてない
181デフォルトの名無しさん:2012/11/22(木) 00:08:01.14
どうおかしいか知性的によろ
182デフォルトの名無しさん:2012/11/22(木) 00:09:47.87
>>171
> if(x*x+y*y<=1.0-(0.0005*ii)){
> sum=sum+1.0;
> za[ii]=z;
> }
  ↓
> if(x*x+y*y<=(1.0-(0.0005*ii))*(1.0-(0.0005*ii))){
> sum=sum+1.0;
> za[i]=z;
> }

じゃないのかな?
違ったらごめんね。
183デフォルトの名無しさん:2012/11/22(木) 00:20:55.00
ポインタの概念を理解する事と文法は無関係
文法が気に入らないなら他の言語使うとか作るとかすればいい
184デフォルトの名無しさん:2012/11/22(木) 00:24:35.15
>>183
char (*(*x[3])())[5];
185デフォルトの名無しさん:2012/11/22(木) 00:33:27.30
なにがなんだかわかりまへん
186デフォルトの名無しさん:2012/11/22(木) 00:40:04.58
数日前にC言語を始めたばかりで、参考例を片っ端から打ち込んでいるのですが

double a =3.14159265
と宣言し
printf("%5.100f",a);
という文を作ると結果が3.141となるらしいのですが
自分の場合は3.14159265000000000000000...
と、なぜか文字幅ではなく精度で処理されてしまいます
何か間違っている点があるのでしょうかorz
使用ツールはVS2010です
187デフォルトの名無しさん:2012/11/22(木) 00:48:19.62
>>184
int *p;
188デフォルトの名無しさん:2012/11/22(木) 00:50:31.46
printf("%5f",a);
189デフォルトの名無しさん:2012/11/22(木) 00:51:53.97
printf("%.5f",a);
190デフォルトの名無しさん:2012/11/22(木) 00:53:09.09
>>178
宣言と利用のほうですね...。
正確に言えば利用がよくわかりません。
191デフォルトの名無しさん:2012/11/22(木) 00:54:27.85
>>186
printf("%5.100f",a);
printf("%5.10f",a);
printf("%5.5f",a);
printf("%5.2f",a);
printf("%5f",a);

最初はいろいろ大変と思うが、いろいろ試してみるといいと思うんだよな。
こういう例に限らず。本で読んだのと自分の理解が違うかもしれないし。
特に最初は。
192デフォルトの名無しさん:2012/11/22(木) 00:57:33.16
>>188 >>189
100は取っ払ったほうがいいのですね、ありがとうございます
193デフォルトの名無しさん:2012/11/22(木) 01:01:31.79
javaが難しくて辛すぎる
全体を把握しなくて良いC言語と対立しすぎ
単純に考えるという事が通用しない
194デフォルトの名無しさん:2012/11/22(木) 01:07:12.78
javaなんて構造体の中にプログラムもいっしょに書くだけだし
たいして難しくないぞ。最初は最低限の文法に絞って覚える
のが何をやるにも早道だと思う。
195デフォルトの名無しさん:2012/11/22(木) 01:11:58.13
bcpad使ってるんだけどコンパイルして実行しようとするとコンパイルは出来るんだけど
ファイルを実行する段階で「○○は動作を終了しました」ってでて実行できない......
windows7 64bitでいいC言語学習に適したソフトとコンパイラって何かある?
196デフォルトの名無しさん:2012/11/22(木) 01:14:11.73
197デフォルトの名無しさん:2012/11/22(木) 01:15:11.24
>>195
実行して終了したんだろ
198デフォルトの名無しさん:2012/11/22(木) 01:15:42.97
>>190
int a;
int *b;
a = 10;
b = &a;
printf("%d\n",*b);

とりあえずこういうのは理解しているんだよな?
テキストに書いてあるような箱に●→|__|とかも含めて。

だったら今は「ふーん」そういうのもあるんだ、という理解でいいような気がする。
例えを使っていろいろ言ってもドツボにはまるだけ。先に行った方がいい。
(メモリとCPUとか命令の実行とかそういうハードの知識もいれてほしいが)
構造体まで終わって、自分でも関数を作ってみたり、ポインタと文字列とか配列とか
そういう課題などにあたるとまた取り組み方が違ってくる。

後はここの 15.ポインタ変数の仕組み とか
ttp://9cguide.appspot.com/
199デフォルトの名無しさん:2012/11/22(木) 01:18:25.77
>>197
問題が発生したため、プログラムが正しく動作しなくなりました。
プログラムは閉じられ、解決策がある場合はwindowsから通知されます。

って出てくる
実行終わって終了したわけじゃなく問題が起こって実行できてないって感じ
200デフォルトの名無しさん:2012/11/22(木) 01:20:20.68
プログラミング出来る人がハードウェアやると一切理解できないって
本当なのかな
201デフォルトの名無しさん:2012/11/22(木) 01:21:53.47
出典は?
202デフォルトの名無しさん:2012/11/22(木) 01:24:17.45
>>199
コード晒せ
203デフォルトの名無しさん:2012/11/22(木) 01:27:39.18
>>200
普通のアプリケーション作っている人が組込みのCとか
シーケンサとかやるとわけわからんと言うのはよく聞く。
204デフォルトの名無しさん:2012/11/22(木) 01:37:23.60
>>195
bcpadってBorland C++ Compiler だよね。
Windows7なら普通に「Microsoft Visual Studio Express」でい良いんじゃないかな。
30日以上使う場合、Microsoftに登録が必要みたいだけど、終始無償。

あと、プログラムの異常は
ttp://ideone.com/
あたりにコード貼って、そのリンクを教えてくれたら誰か原因を教えてくれるかも知れない。
205デフォルトの名無しさん:2012/11/22(木) 01:48:45.72
Microsoft Visual Studio Expressってなんか使い方よく分かんないんだよね
4つあるうちのC#とC++とbasicどれに.cフォルダ読み込ませてもコンパイルしてくれないし
普通に白紙に書き書きしてコンパイル→実行みたいな動作のやり方がすごい掴みにくくい......
206デフォルトの名無しさん:2012/11/22(木) 03:13:00.61
勉強なら、bcpadでいいと思うけど、VSで1行づつステップ実行しながら変数や
メモリの値の変化を確認してみるとCの理解が早まる。
まあ、コード内にprintf仕込んで値表示させるならbcpadでも何でも。。

それより、落ちるコード見ないとアドバイスも何もできないな。
207デフォルトの名無しさん:2012/11/22(木) 06:05:36.46
C言語最近始めたけどif文覚えるとものすごい楽しいな
208デフォルトの名無しさん:2012/11/22(木) 06:46:13.45
ifを使わずに分岐できるようになるともっと楽しいよ
209デフォルトの名無しさん:2012/11/22(木) 06:47:40.11
switch case のことか?
210デフォルトの名無しさん:2012/11/22(木) 07:22:06.29
大学の授業で明解C言語入門編やってる。面白い。
211デフォルトの名無しさん:2012/11/22(木) 07:27:51.16
望洋はクソ
212デフォルトの名無しさん:2012/11/22(木) 07:31:06.88
馬鹿には無理
213デフォルトの名無しさん:2012/11/22(木) 07:34:40.36
>>209
テーブルジャンプですお
214デフォルトの名無しさん:2012/11/22(木) 08:32:54.00
Cでどう書くの?
215デフォルトの名無しさん:2012/11/22(木) 08:52:16.37
>>316
polymorphism なんかもそうだね
216デフォルトの名無しさん:2012/11/22(木) 09:49:20.03
Cで一番深いのはswitchだな。あと可変長マクロ。
217デフォルトの名無しさん:2012/11/22(木) 10:02:37.36
#include <stdio.h>

typedef int (*MAGNIFY)(int, int);

int one_parameter(int dummy, int b)
{
 return 100*b;
}

int two_parameters(int a, int b)
{
 return a*b;
}

int main(void)
{
 int i;
 MAGNIFY f[3];

 f[0] = one_parameter;
 f[1] = one_parameter;
 f[2] = two_parameters;

 for(i = 0; i < 3; i++) {
  printf("%d\n", f[i](200, 5) );
 }

 return 0;
}
218デフォルトの名無しさん:2012/11/22(木) 10:23:00.30
関数ポインタの配列ね。
ついでに再帰使って、forも排除してみて。
219デフォルトの名無しさん:2012/11/22(木) 11:28:37.34
int main(int ac, char **av)
{
 int i;
 MAGNIFY f[] = {one_parameter,one_parameter,two_parameters};
 if(ac<2){
  main(5, av);
 }else if(ac > 2){
  printf("%d\n", f[5 - ac](200, 5) );
  main(ac - 1);
 }
 return 0;
}
220デフォルトの名無しさん:2012/11/22(木) 11:30:45.38
間違えたので訂正
ttp://codepad.org/hAiYzGgz
221デフォルトの名無しさん:2012/11/22(木) 11:31:56.55
if 使ってんじゃん。
222デフォルトの名無しさん:2012/11/22(木) 11:35:24.46
突っ込み所はそこか?
223デフォルトの名無しさん:2012/11/22(木) 11:44:23.23
君たち
}else と if( と ){ にはスペースを空けるんだ
コードは人に楽に読んでもらえなきゃだめだ
わかったね
お兄さんとの約束だ
224デフォルトの名無しさん:2012/11/22(木) 11:49:22.73
>221
これでどう?
ttp://codepad.org/KIPd8YJl
225デフォルトの名無しさん:2012/11/22(木) 11:54:25.14
再帰なのか?これは?
226デフォルトの名無しさん:2012/11/22(木) 11:59:03.62
IOCCCに出てそうなネタだね

>>225
相互再帰
227デフォルトの名無しさん:2012/11/22(木) 11:59:19.42
よく無事に終了してるな。
228デフォルトの名無しさん:2012/11/22(木) 13:46:51.46
これができると何だって言うの
229デフォルトの名無しさん:2012/11/22(木) 16:26:47.30
関数ポインタの配列で分岐できるね
230デフォルトの名無しさん:2012/11/22(木) 17:18:07.39
ここって一昨日始めたやつでも質問していいの?(´・ω・`)
231デフォルトの名無しさん:2012/11/22(木) 17:21:54.72
>>230
全然OK
俺は明日からはじめようとしているぐらい
232デフォルトの名無しさん:2012/11/22(木) 17:30:40.68
>>231

ありがとう!

多分馬鹿馬鹿しいと思うけど教えて下さい


#include <stdio.h>

int main(void)
{
printf("%d\n",10/3);
}
233デフォルトの名無しさん:2012/11/22(木) 17:33:27.89
答え:最後に return 0; をつける。
234デフォルトの名無しさん:2012/11/22(木) 17:36:44.89
しまった
return 0;着けるの忘れた(´Д` )


#include <stdio.h>

int main(void)
{
printf("%d\n",10 / 3);
return 0;
}

これ実行しても3にならない(´;ω;`)
Visual C++2010使ってる
235デフォルトの名無しさん:2012/11/22(木) 17:40:54.46
%1f
236デフォルトの名無しさん:2012/11/22(木) 17:47:48.44
gcc 3.4.5 だと
お望み通りに 10 になる
237デフォルトの名無しさん:2012/11/22(木) 17:51:03.83
>>235
ありがとう(^з^)-☆
「%1f」?
「%f」とは違うのかな

  ∧,,∧
 ( `・ω・)
 / ∽ | うーん…
 しー-J

%dって切り捨てで表示されるんじゃなかったけ?
後、演算子との間はスペースいれといた方がいいの?(´・ω・`)
238デフォルトの名無しさん:2012/11/22(木) 17:55:17.98
>>236

おかしいな(´・_・`)

GCC使いやすいですか?
239デフォルトの名無しさん:2012/11/22(木) 17:55:59.48
普通に3になるよ
コンパイルし直したら?
240デフォルトの名無しさん:2012/11/22(木) 17:56:27.32
fなら
printf("%f\n",10/3);
printf("%f\n",10.0/3.0);
の両方を試す
241デフォルトの名無しさん:2012/11/22(木) 18:09:31.80
>>239
>>240

コンパイル出来ました!
ありがとうございます!

      ♪∧,,∧
   ♪∧,,∧・ ω・)
 ∧,,∧・ ω・)   )っ
(・ ω・)   )っ__フ
(っ  )っ__フ(_/彡
 ( __フ(_/彡
  (_/彡♪
242デフォルトの名無しさん:2012/11/22(木) 18:24:03.62
いったいなにをどうしたんだ
243デフォルトの名無しさん:2012/11/22(木) 18:43:49.21
>>242
一回全部消して書き直しました(`・ω´・)
なんでコンパイル出来なかったか分からない
244デフォルトの名無しさん:2012/11/22(木) 19:05:40.22
出来るか出来ないかで教えていただきたいのですが
例えば
for文で
(■■■■)
■を四つ表示一連の下りを作ったとして
このループ自体を
(■■■■)
(■■■■)
(■■■■)
のように三回ループできますか?
これは所謂二重ループですか?
245デフォルトの名無しさん:2012/11/22(木) 19:10:24.97
>>244
for i = 1 to 4
for j = 1 to 4
処理
next j
next i

で2重ループは可能
next の次の i とか j は省略可
246デフォルトの名無しさん:2012/11/22(木) 19:27:08.24
>>245
それは basic
247デフォルトの名無しさん:2012/11/22(木) 19:46:23.98
jniでロードされたモジュールが、自分自身の絶対パスを取得する方法ってありますか?
248デフォルトの名無しさん:2012/11/22(木) 19:59:03.59
>>246
いつも見てるVB系のスレと勘違いしました。

for(;;){
println("ごめん");
}
249デフォルトの名無しさん:2012/11/22(木) 20:08:32.60
いいんだよ
250デフォルトの名無しさん:2012/11/22(木) 20:20:02.14
すいませんCです。
251デフォルトの名無しさん:2012/11/22(木) 20:39:23.55
許す
252デフォルトの名無しさん:2012/11/22(木) 21:31:38.02
htmlってC言語組み込み可能?
ニコ動で見たんだがhtmlにはjavascriptや32apiは組み込み
可能らしい
253デフォルトの名無しさん:2012/11/22(木) 21:36:22.40
入門者どころじゃねぇ騒ぎの質問者を久々に見た
254デフォルトの名無しさん:2012/11/22(木) 21:39:24.03
何が?w
ホームページ作ってて
あ?ここC言語使えねーかなって
思ったりしないのか?
255デフォルトの名無しさん:2012/11/22(木) 21:41:47.07
>>252
不可能です
256デフォルトの名無しさん:2012/11/22(木) 21:45:59.06
ンだから
scriptの中に書かれる言語はなんでもいいだろ

中身を解釈して実行してんのはブラウザだ
だからブラウザ用に
Cスクリプトを実行する為のプラグイン作れよ
257デフォルトの名無しさん:2012/11/22(木) 21:48:13.92
>>256
そもそもCスクリプトというものが存在しない
258デフォルトの名無しさん:2012/11/22(木) 21:53:30.51
ニコニコ御馴染みのテトリス動画では
forとか使ってたけどこれは
何言語なの?Cじゃないのか?
javascript?

forがある言語は
C C++ java 以外知らないぞ
259デフォルトの名無しさん:2012/11/22(木) 21:56:59.21
何かの心理テストなのだろうか
260デフォルトの名無しさん:2012/11/22(木) 21:59:32.69
こういう人のことを「おめでたい」って表現するんだろうなぁ。
261デフォルトの名無しさん:2012/11/22(木) 22:17:13.83
試される回答者たち
262デフォルトの名無しさん:2012/11/22(木) 22:17:21.26
ただのガキでしょう。
263デフォルトの名無しさん:2012/11/22(木) 22:20:11.31
cscript
cscript /?

Windows 2000のコマンドプロンプト(Windows XPは、Version 5.7)

D:\work>cscript
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

使い方 : CScript scriptname.extension [オプション...] [引数...]

オプション :
//B     バッチ モード : スクリプトのエラーおよびプロンプトを非表示にする
//D     アクティブ デバッグを使用可能にする
//E:engine スクリプト実行時にエンジンを使用する
//H:CScript 既定のスクリプト ホストを CScript.exe に変更する
//H:WScript 既定のスクリプト ホストを WScript.exe に変更する (既定値)
//I     対話モード (既定値、//B と逆の動作)
//Job:xxxx WSF ジョブを実行する
//Logo   ロゴを表示する (既定値)
//Nologo  ロゴを表示しない : 実行時に見出しを表示しない
//S     このユーザーの現在のコマンド ライン オプションを保存する
//T:nn   秒単位のタイムアウト時間 : スクリプトを実行できる時間の最大値
//X     デバッガでスクリプトを実行する
//U     コンソールからリダイレクトされた I/O に Unicode を使用する
264デフォルトの名無しさん:2012/11/22(木) 23:13:52.64
C言語を学んでいる少年がある日HTMLに出会いました
C言語使えるんじゃね?とふと疑問に思う事の何がいけないのでしょう?
265デフォルトの名無しさん:2012/11/22(木) 23:16:35.31
266デフォルトの名無しさん:2012/11/22(木) 23:50:39.42
>>264
別にいけなくはないけど
forなんてほとんどの言語にあるよ

C言語しか使えない人はそう思うかもしれないが
言語はたくさんあって適材適所で使われるもの
267デフォルトの名無しさん:2012/11/23(金) 00:57:33.86
268デフォルトの名無しさん:2012/11/23(金) 01:19:00.63
calの出力を受け取って整形だけだろjk
269デフォルトの名無しさん:2012/11/23(金) 03:25:50.29
こんなの読めねぇ、勘弁してくれ
int ( *func[5])(char *)
270デフォルトの名無しさん:2012/11/23(金) 04:50:40.64
char * をひとつ引数にとり int を返す関数へのポインタの配列(要素数5)
271デフォルトの名無しさん:2012/11/23(金) 09:11:55.55
main関数の**argvのからくりがわからず、
数年悩み続けていて先に進めません
char **argvとは、コマンドライン一番目の文字列の先頭アドレスを持つ
メモリのアドレスを持つ変数の宣言だというのはわかるのですが、
二番目以降の文字列のアドレスは誰が持っているんですか?
272デフォルトの名無しさん:2012/11/23(金) 09:38:08.44
入力>hoge.exe hage piyo

(0000)hoge.exe\0hage\0piyo\0
(0100)argv(0000)(0008)(000d)

(0100)argv[0]->内容(0000)
(0104)argv[1]->内容(0008)
(0108)argv[2]->内容(000d)

()内はアドレス

大雑把にこんなイメージ
誰がプログラム引数を積む作業をやるかといえば
CランタイムライブラリのmainCRTStartup関数など
その他さまざまな初期化を行ってからmain(int argc, char *argv[])を呼ぶ
273デフォルトの名無しさん:2012/11/23(金) 09:50:02.74
0080からはじめてれば100点あげれたのに
274デフォルトの名無しさん:2012/11/23(金) 10:46:05.84
>>271
>二番目以降の文字列のアドレスは誰が持っているんですか?
難しく考えることはなく、argvが持っている。
コマンドラインで
$hoge arg1 arg2 arg3 arg4
と入力された場合には
const int argc = 5;
char *argv[argc] = {"hoge", "arg1","arg2","arg3","arg4"};
という風に宣言されているイメージ
275デフォルトの名無しさん:2012/11/23(金) 10:53:53.10
  Λ_Λ  \\
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >_Λ∩
  _/し' //. V`Д´)/
 (_フ彡        / ←>>274
276デフォルトの名無しさん:2012/11/23(金) 11:10:38.22
その宣言が判ってないんだろ
277デフォルトの名無しさん:2012/11/23(金) 11:41:16.25
#include <stdio.h>

int
main(int argc, char const * argv[])
{
printf("argc value = %d&yen;n", argc);

for (int i = 0; i < argc; ++i) {
printf("argv[%d] address, value = %p, %s&yen;n", i, argv + i, argv[i]);
}

return 0;
}

// 実行結果
// ./a.out arg1 arg2 arg3 arg4
// argc value = 5
// argv[0] address, value = 0x7fff5fbff998, ./a.out
// argv[1] address, value = 0x7fff5fbff9a0, arg1
// argv[2] address, value = 0x7fff5fbff9a8, arg2
// argv[3] address, value = 0x7fff5fbff9b0, arg3
// argv[4] address, value = 0x7fff5fbff9b8, arg4
278デフォルトの名無しさん:2012/11/23(金) 11:42:07.13
ttp://codepad.org/yioNtAX7

C:\tmp>test hoge hage piyo
&argc=[0012FF70]
&argv=[0012FF74]
argc=[4]
argv=[00392AD0]
&argv[0]=[00392AD0]
argv[0]=[00392AE4][test]
&argv[1]=[00392AD4]
argv[1]=[00392AE9][hoge]
&argv[2]=[00392AD8]
argv[2]=[00392AEE][hage]
&argv[3]=[00392ADC]
argv[3]=[00392AF3][piyo]
279デフォルトの名無しさん:2012/11/23(金) 11:45:54.33
>>277
隙間が開いてるんだね
alignmentでもされてるのかな
280デフォルトの名無しさん:2012/11/23(金) 11:51:02.24
隙間って?
281デフォルトの名無しさん:2012/11/23(金) 11:51:54.55
ttp://codepad.org/FcvXKVPk

C:\tmp>test hoge hage piyo
argc A=[0012FF70] V=[4]
argv A=[0012FF74] V=[00392AD0]
argv[0] A=[00392AD0] V=[00392AE4][test]
argv[1] A=[00392AD4] V=[00392AE9][hoge]
argv[2] A=[00392AD8] V=[00392AEE][hage]
argv[3] A=[00392ADC] V=[00392AF3][piyo]
argv[4] A=[00392AE0] V=[00000000][(null)]
282デフォルトの名無しさん:2012/11/23(金) 11:56:43.27
>280
>>278 のは詰まってるけど >>277 のは開いてるでしょう
283デフォルトの名無しさん:2012/11/23(金) 12:01:34.91
64bitだから詰まってんじゃね
284デフォルトの名無しさん:2012/11/23(金) 12:04:08.41
ん、ちょっと待って
何と何の隙間?
285デフォルトの名無しさん:2012/11/23(金) 12:22:39.62
ttp://codepad.org/FYYKi5wk

C:\tmp>test hoge hage piyo

00392AD0: e4. 2a* 399 00. e9. 2a* 399 00. ee. 2a* 399 00. f3. 2a* 399 00.
00392AE0: 00. 00. 00. 00. 74t 65e 73s 74t 00. 68h 6fo 67g 65e 00. 68h 61a
00392AF0: 67g 65e 00. 70p 69i 79y 6fo 00.
286デフォルトの名無しさん:2012/11/23(金) 12:30:58.08
ファイルのサイズを調べるにはどうするのが良いですか?
287デフォルトの名無しさん:2012/11/23(金) 12:36:19.59
fseek等でカレントポジションがファイル終端にある時fgetpos
288デフォルトの名無しさん:2012/11/23(金) 12:43:07.01
stat, fstat
289デフォルトの名無しさん:2012/11/23(金) 12:58:16.35
_fseeki64(fp, 0, SEEK_END); fgetpos(fp, &pos); _fseeki64(fp, 0, SEEK_SET);
290デフォルトの名無しさん:2012/11/23(金) 13:04:15.73
#include <sys/types.h>
#include <sys/stat.h>

...

_stati64 st;
_stati64(filename, &st);
_i64toa_s(st.st_size, buf, sizeof(buf), 10);
291デフォルトの名無しさん:2012/11/23(金) 13:19:37.90
みんなCのことよく知ってるのに童貞なのか
292デフォルトの名無しさん:2012/11/23(金) 13:31:42.84
>287-
できました
ありがとうございました
293デフォルトの名無しさん:2012/11/23(金) 13:54:22.74
fseekを使う方法はダメな場合もある
294デフォルトの名無しさん:2012/11/23(金) 13:56:29.31

そのダメな場合て
295デフォルトの名無しさん:2012/11/23(金) 14:51:29.67
投機的実行
296デフォルトの名無しさん:2012/11/23(金) 14:57:09.32
>>279>>282
あなたは2次元配列とポインタ配列の区別がついてないよ。
char a[2][3];
char *a[3];
がどう違うか考えてみて。2次元配列は稠密だけど、ポインタ配列はそうとは限らない。
297デフォルトの名無しさん:2012/11/23(金) 15:10:58.75
298デフォルトの名無しさん:2012/11/23(金) 15:11:41.37
ポインタ配列はアバズレ
299デフォルトの名無しさん:2012/11/23(金) 15:54:03.49
300デフォルトの名無しさん:2012/11/23(金) 15:58:26.05
追記でfopenしてfgetpos
301デフォルトの名無しさん:2012/11/23(金) 16:03:18.04
それ日付変わるからやばくね
302デフォルトの名無しさん:2012/11/23(金) 16:10:50.93
何の日付?
303デフォルトの名無しさん:2012/11/23(金) 16:47:54.75
#include <stdio.h>
int main(void)
{
FILE *fp;
char *fname = "test.txt";
int c,i,count=0;

fp = fopen( fname, "r" );
if( fp == NULL ){
printf( "%sファイルが開けません\n", fname );
return -1;
}

for(i=1;i<=17;i++){
c=fgetc(fp);
if(c==1){
count++;
}
printf( "%c", c );

}

fclose( fp );
printf("CANDIDATES1 = %d\n", count);
return 0;
}
ファイルの中の1をカウントしたいのですが、どこをかえたらよいでしょうか
304デフォルトの名無しさん:2012/11/23(金) 16:53:01.06
if(c=='1')
305デフォルトの名無しさん:2012/11/23(金) 17:14:57.72
>>304
ありがとうぞあいまずっっmm
306デフォルトの名無しさん:2012/11/23(金) 18:15:04.55
いえいえ
307デフォルトの名無しさん:2012/11/23(金) 21:25:40.76
下の条件式で
countの中の数を比べているのですがcountx=0は除くことはできますか??
if(count<5 && count2<5 && count3<5){ //---例えばcount2が0だった場合
countとcount3のみで比べるーーー//
for (i = 0; i < 3; i++) {
for (j = i + 1; j < 4; j++) {
if (tei[i] < tei[j]) {
t = tei[i];
tei[i] = tei[j];
tei[j] = t;
}
}
}
}
また投票制度のプログラミングで候補者1、2、3ファイルの中12233
などのような候補者があらかじめ3人と分かっているときはできるのですが
3人以上というように候補者が不明の場合どうしたらよいでしょうかm
308デフォルトの名無しさん:2012/11/23(金) 21:29:16.34
int hoge[2][3];
と書いたらhoge[2]が3つあるような気がしますが、なんで実際は
逆なんでしょう
309 ◆QZaw55cn4c :2012/11/23(金) 21:33:54.20
>>308
□□
□□
□□

2 が 3 個?
3 が 2 個?
310デフォルトの名無しさん:2012/11/23(金) 21:36:33.08
>>308
hoge

□□・・・・・・実データのアドレスが入っている
↓↓
↓ ̄ ̄↓
□□□ □□□・・・実データが入っている
311デフォルトの名無しさん:2012/11/23(金) 22:29:57.35
>>310
ちげーよ。バカ。
312デフォルトの名無しさん:2012/11/23(金) 22:44:12.40
ポカミスと思いきや深刻だなw
313デフォルトの名無しさん:2012/11/23(金) 22:45:46.15
>>308
ここの「Cの宣言を解読する」参照
ttp://kmaebashi.com/programmer/pointer.html

int hoge[2][3];は
hoge is array[2] of array[3] of int
日本語にすると hogeはintの配列[要素数3]の配列[要素数2]となる。
メモリ上の並びは二次元ではなく一次元
□□□|□□□
□がint1つ分4バイトでこれが3つ並び、更にそれが2つ並んでいる。
314デフォルトの名無しさん:2012/11/23(金) 22:57:10.95
>>313
バカだな。ならび順からいって
int hoge[2][3]; は □□|□□|□□
だろう
315デフォルトの名無しさん:2012/11/23(金) 23:05:48.96
316デフォルトの名無しさん:2012/11/23(金) 23:15:24.67
添字演算子のくっ付き方は確かにわかり辛いからな
でもそれはないだろ
317デフォルトの名無しさん:2012/11/23(金) 23:18:51.25
318デフォルトの名無しさん:2012/11/23(金) 23:20:40.00
319デフォルトの名無しさん:2012/11/24(土) 00:10:40.66
>>313
313が正しいな。

#include <stdio.h>
int main(){
int a[2][3];
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 3; ++j)
printf("%d %d %p&yen;n", i, j, &a[i][j]);
return 0;
}

実行結果:
0 0 0x7fff5fbffb30
0 1 0x7fff5fbffb34
0 2 0x7fff5fbffb38
1 0 0x7fff5fbffb3c
1 1 0x7fff5fbffb40
1 2 0x7fff5fbffb44
320デフォルトの名無しさん:2012/11/24(土) 00:36:13.29
ほう、HSPでは>>314の言うならびなのか
ttp://fujidig.s302.xrea.com/2007/08/array-memory.html
321デフォルトの名無しさん:2012/11/24(土) 00:59:43.08
BASICやFORTRANが314
322デフォルトの名無しさん:2012/11/24(土) 01:04:44.46
>314のように誤解したままの糞ソースはよく見かける
それでも「たまたま動く」プログラムは書けるが
メモリアクセス順が飛び飛びになるので
ベクトル演算や先読みパイプライン処理や
SSEと組み合わせて使うときに失敗する糞
323デフォルトの名無しさん:2012/11/24(土) 01:06:05.70
int a[2][3];
と宣言されても
a[0][5]
でアクセス出来る。
ただしこれは、
a[1][2]
に対して行われる。
324デフォルトの名無しさん:2012/11/24(土) 01:09:36.22
立派な雑誌の特集でも堂々と間違える。
それがポインタの恐ろしさ。
325デフォルトの名無しさん:2012/11/24(土) 01:13:15.26
>>321のように多言語では[][]を→に読んだのものもあるのに
C言語では[][]を←に読む実装にしたのはなんで?
326デフォルトの名無しさん:2012/11/24(土) 01:21:16.52
>325
二次元配列はない
ポインタの優先順位順に解釈されてるだけ
他の言語と比べて同じじゃないといけないとこだわるのはなぜ?
327デフォルトの名無しさん:2012/11/24(土) 01:36:44.40
>>323
*(*a + 5)でも可。
328デフォルトの名無しさん:2012/11/24(土) 01:39:36.17
>>314
宣言:int hoge[3][5];
式:hoge[2][3]

式の中では配列はポインタに読み替えられる。式:hoge[2][3] は
*( hoge + 2 )[3] に、そして
*( *( hoge +2 ) + 3 ) に等しい

>>313のページの著書に書いてあった。
329デフォルトの名無しさん:2012/11/24(土) 02:27:02.89
>>328
()が一組足りない
( *( hoge + i ) )[j] は *( ( *( hoge + i ) ) + j ) に等しい
だった。
330デフォルトの名無しさん:2012/11/24(土) 03:59:04.93
>>325
マクロを使えば前者のように実装することも可能。
331デフォルトの名無しさん:2012/11/24(土) 05:20:09.13
int hoge[width * height] 確保して
hoge[y * width + x] or hoge[x * height + y] するなりすればよろしい
332デフォルトの名無しさん:2012/11/24(土) 06:32:02.96
最初から読んでないのか、揚げ足取りたいだけなのか、論点ずらしたいのか知らんがアフォ丸出し。
333デフォルトの名無しさん:2012/11/24(土) 09:40:56.37
ffmpegのソースの中で
#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__)
# define av_uninit(x) x=x
#else
# define av_uninit(x) x
#endif
という定義があり。下のように使用しています
func()
{
int av_uninit(some_var);
}

展開されると
int some_var = some_var;
になりますが、これはどういう意味でしょう?
334デフォルトの名無しさん:2012/11/24(土) 10:23:20.27
some_var が define されたマクロだった場合
2回パスすることでちゃんと展開してくれるようになる
335デフォルトの名無しさん:2012/11/24(土) 11:06:36.68
詳しい方のみ回答願います。
336デフォルトの名無しさん:2012/11/24(土) 11:10:33.42
マクロって、
#define N 10
とやると、
for ( i = 0; i < N; i++ ){
・・・
のNだけじゃなくて、NUMとか変数名に使っていたらNUMのNも置換されるの?
337 ◆QZaw55cn4c :2012/11/24(土) 11:12:16.36
>>336
されないそこまで馬鹿じゃない
338デフォルトの名無しさん:2012/11/24(土) 11:14:44.11
スペースで区切られていたらそうだね
339デフォルトの名無しさん:2012/11/24(土) 11:57:53.49
質問者ではないが>>333,334の回答がよく理解できてないんだけど
どういうこと?
コード見る限りGNU拡張の何かってことだよね
340デフォルトの名無しさん:2012/11/24(土) 12:54:44.34
>>334はワカランチンなので無視すべし。
int some_var = some_var;
は、GNUCの拡張で未初期化変数の使用の警告を出さなくするお呪い。
341339:2012/11/24(土) 13:13:16.71
なるほど意図はわかりました
ありがとう!

しかし、どうしても未初期化のまま変数を使いたいケースってどんなケースなんだろう
ffmpegのソースとやらを読んでみよう
342デフォルトの名無しさん:2012/11/24(土) 15:18:53.99
一次元配列で配列の数をPCに積んでいるメモリの上限(16GB)まで使いたいんだけどどうすればいいんですか?
動的確保(malloc)しても配列のサイズが2GBくらいになると、配列への代入文の行で実行ファイルが強制的に終了してしまいます
環境はWindowsのVC++なんですが、16GBの配列を扱うにはどうすればいいでしょうか
343デフォルトの名無しさん:2012/11/24(土) 15:22:44.86
64bitで(
344デフォルトの名無しさん:2012/11/24(土) 15:57:08.91
>>343
64bitコンパイラを使用すれば確保できますか?
今は64bitWin7で32bitコンパイラを使用しているんですが・・・・
しかし32bitでも使用出来るメモリは4GBですよね、なので4GBまで扱えるはずなんですが
345デフォルトの名無しさん:2012/11/24(土) 15:58:14.30
unsigned にしてないとか
346デフォルトの名無しさん:2012/11/24(土) 16:09:59.48
32bit版Windowsで使用可能なメモリは1プロセスあたり2GBまで
boot.iniにオプションつけても3GBまで
347デフォルトの名無しさん:2012/11/24(土) 16:10:47.95
ってOSは64bitだったか
348 ◆QZaw55cn4c :2012/11/24(土) 16:17:34.23
cygwin64が現れてほしいと思うこのごろ
349デフォルトの名無しさん:2012/11/24(土) 16:17:47.93
>>345
それでは負の数を表現できませんよね?負の数も扱うのでunsignedはつけれないんです。

>>347
やはり2GBまでですか、そこを何とか出来ませんかね。OS変える以外で
350デフォルトの名無しさん:2012/11/24(土) 16:29:23.67
自分でメモリ管理すれば?
351デフォルトの名無しさん:2012/11/24(土) 16:38:07.59
64bit版Windowsでも32bitプロセスが扱えるのは2GBまでだろ
352デフォルトの名無しさん:2012/11/24(土) 16:40:44.65
何のためにサイズ用変数で負の数を扱うんだ?
353デフォルトの名無しさん:2012/11/24(土) 17:01:22.13
>>342
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *a;
a = malloc(17179869184);
a[17179869183] = 'z';
printf("%p\n", &a[17179869183]);
printf("%c\n", a[17179869183]);
return 0;
}
Z:\>cl 342.c
Microsoft(R) C/C++ Optimizing Compiler Version 16.00.40219.01 for x64
Copyright (C) Microsoft Corporation. All rights reserved.

342.c
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.

/out:342.exe
342.obj

Z:\>342
000000053FC8003F
z
354:2012/11/24(土) 17:46:58.04
ファイルから文字を読み込む際に一文字ずつの読み込みを一行目で
一端おわらせ、それをまた2行目から一文字ずつ読み込む方法をおしえてくださいm
、ファイルの文字数はわかりません
355デフォルトの名無しさん:2012/11/24(土) 17:51:18.56
メモリの構造を考える時
一本の直線を考えるのか
平面を考えるのかどっちですか?
どんな構造してるのか分からなくて
356デフォルトの名無しさん:2012/11/24(土) 18:00:36.06
>>354
#include <stdio.h>

int main(){
int i;
char buf[1000], c;
FILE *fp;

fp = fopen("c354-2.c", "r");
while (fgets(buf, 1000, fp) != NULL) { /*get 1 line*/
for (i = 0; buf[i]; ++i) {
c = buf[i];/*get 1 character*/
printf("%c", c);
}
}

return 0;
}
357デフォルトの名無しさん:2012/11/24(土) 18:02:17.74
>>355
直線
358:2012/11/24(土) 18:07:25.39
>>356
ありがとうございますorz
359デフォルトの名無しさん:2012/11/24(土) 20:02:35.05
C言語って知的障害者でも理解できるほど単純なんだよな
360デフォルトの名無しさん:2012/11/24(土) 20:04:16.22
>>359
そうなのか
やはり経験者は語る
だな
361デフォルトの名無しさん:2012/11/24(土) 20:13:07.97
頭にセンサー装置付けてそれでC言語解読してる
C言語はひとつのファイルを大画面にしてみればいいから
センサーかざせばいいだけ

ソースファイル複数必要なjavaやperならそうはいかんだろ
362デフォルトの名無しさん:2012/11/24(土) 20:16:51.76
C だって複数ファイルで構成することもできるんだけれども
363デフォルトの名無しさん:2012/11/24(土) 20:19:53.81
できるけど、あえてする必要はないだろ。
Javaはソース分割必須だからな。
364デフォルトの名無しさん:2012/11/24(土) 20:22:00.45
C言語考えた人達って複雑な思考ができない人だと思う(笑)
365デフォルトの名無しさん:2012/11/24(土) 20:26:38.85
Javaでも必須じゃないよ
366デフォルトの名無しさん:2012/11/24(土) 20:27:48.28
>>364
よう単細胞
今日も頑張って無性生殖にはげんでくれ
367デフォルトの名無しさん:2012/11/24(土) 20:28:06.10
複雑にすると多人数で開発する時に問題が起きるから
複雑さの回避=ソース分割という流れになった。
368デフォルトの名無しさん:2012/11/24(土) 20:30:12.08
ところでperって何?
369デフォルトの名無しさん:2012/11/24(土) 20:32:41.44
とりあえず英語のコード書いといたらかしこく見えるキリッ
それがC言語(笑)

簡単なことを大げさにしてるだけ(笑)
370デフォルトの名無しさん:2012/11/24(土) 20:34:13.54
ソースファイルを分けるのは再利用目的がきっかけかと思ってた。
371デフォルトの名無しさん:2012/11/24(土) 20:34:45.04
>>364
マルチが失敗したからユニな考え方にしたんだ
372デフォルトの名無しさん:2012/11/24(土) 20:47:54.70
>>351
LARGEADDRESSAWARE
373デフォルトの名無しさん:2012/11/24(土) 21:11:43.09
>>355
直線
しかも未だにバイトメモリ
374デフォルトの名無しさん:2012/11/24(土) 21:13:45.19
>>349
あんた、プログラミングに向いてないってゆーか
人間的に...バカだと思う
375デフォルトの名無しさん:2012/11/24(土) 21:23:49.75
>>370
大体合っている。
コンピュータプログラミングの概念・技法・モデル(CTMCP)
http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E6%A6%82%E5%BF%B5%E3%83%BB%E6%8A%80%E6%B3%95%E3%83%BB%E3%83%A2%E3%83%87%E3%83%AB

の「第7章 オブジェクト指向プログラミング」を取り入れようとすると、分割が現実的だった。
376デフォルトの名無しさん:2012/11/24(土) 21:30:56.41
>>342
こいつも同じか(笑笑笑)
設計者、だれだ? オメーか?(笑笑笑)
377デフォルトの名無しさん:2012/11/24(土) 21:36:29.25
322123132
131312313
213231221

CANDIDATES= 3
VOTES=9
ファイルの中身が上のような状態で(行列は例)
行数と列の数がわからない場合ファイルを読み込み数字のみを2次元配列に
格納するには(最後の3と9はいれません)
どのようにしたらいいのでしょうか
おしえてくださいorz
378デフォルトの名無しさん:2012/11/24(土) 21:37:20.69
>>374
>>349は会社にいる嫌なやつみたいだよなー
379デフォルトの名無しさん:2012/11/24(土) 21:39:01.69
>>378
スルースキルは重要。

会社でもにちゃんでも。
380デフォルトの名無しさん:2012/11/24(土) 21:40:55.03
>>379
スマソ
381デフォルトの名無しさん:2012/11/24(土) 21:42:47.10
オブジェクト指向プログラミングばかりしてきたんで、
クラスが無いこの言語ではどうやってプログラミングするかよくわかん

そりゃー、構造体 + 関数で最終的にはオブジェクト指向みたいになるんだと思うんだけどね
実際プログラムをしようと思っても、コードが頭に浮かんで来ないのよね
382デフォルトの名無しさん:2012/11/24(土) 21:47:57.23
へえ、こっちはまったく逆でどうやってクラスという表現に組み込めばいいのかしばらく悩みましたね。
383382:2012/11/24(土) 21:50:34.52
例えばよくある二分木を(ライブラリの支援なしに)一から表現しようとした場合、例えばjavaならどうする?c#ならどうする?
結構悩みましたしいまでも実は自信がない。
384デフォルトの名無しさん:2012/11/24(土) 21:54:13.29
全部クラスに入れなきゃいけないから定数とか逆に不便
staticクラスとかそこまでするんだったらクラス外に作らせろよ
385381:2012/11/24(土) 22:25:46.80
>>382
自分だったらget/set + 計算用メソッド + privateなフィールドのクラスを作ると思う。
できるだけメソッドはprivateにして、必要に応じてインターフェイスとか作っちゃう

だけど、C言語だと2分木を実装するにしてもイメージが沸かない
VB6使っていた時も、正直クラスがなかったのでよくわからなかった。

>>384
>定数とか逆に不便
うん、ここら辺はどうにかして欲しいよね。

>staticクラスとかそこまでするんだったらクラス外に作らせろよ
クラスベースの言語の場合、データはすべてクラスに管理させるべきだと思うな
クラスの外に書いた場合スコープの問題(メモリリーク)とか、すでにあるクラス連携、誰が管理するのか等の問題が発生する予感がする
386デフォルトの名無しさん:2012/11/24(土) 22:28:49.21
>>381
いや、せっかく頭に浮かんできているコードを
おまえがただ感情的に拒否しているだけだ

やってることは同じ、そこにこそ「わざわざ C」の意味がある
やってることは同じ、そこにこそ「わざわざアセンブラ」の意味があるように
やってることは同じ、そこにこそ「わざわざハード」の意味があるように
ひとつ下のレイアを理解する出発点はそこなんだよ
387382:2012/11/24(土) 22:34:03.88
>>385
各ノード(例のデータ+右+左のまとまりね)はどうする?

>>386
OOからCに来た方の視点は非常に興味深い。自分はまだOOがよくわかっていないだけになおさら。
388デフォルトの名無しさん:2012/11/24(土) 22:34:09.68
>>377
格納領域をmallocで確保
1行の長さでVOTESの9を決定
行数でCANDIDATESの3を決定
二次元配列を使わない
389デフォルトの名無しさん:2012/11/24(土) 22:37:02.98
>>381
1つのクラスの中に全部メソッド書く感じ

>>382
Cのファイル分割の単位がクラスの基本的な粒度に近いね
390デフォルトの名無しさん:2012/11/24(土) 22:38:34.46
>>377
>322123132
>131312313
>213231221

この例だと、数字をどう区切ればいいの?
322123132
-> 3,2,2,1,2,3,1,3,2
-> 322,123,132
とか?
391342:2012/11/24(土) 22:42:25.15
>>353
わざわざコード作成ありがとうございます

>>372
ヒントありがとうございます。

>>374
(笑)

>>378
(大笑)
392デフォルトの名無しさん:2012/11/24(土) 22:44:18.22
初歩的な質問ですがお願いします

fseek(stdin, 0L, SEEK_END)

の0Lって何でしょうか?

お願いします。
393デフォルトの名無しさん:2012/11/24(土) 22:45:22.52
0Lはlong型であることを示す接尾辞Lで明示した0
394デフォルトの名無しさん:2012/11/24(土) 22:46:40.33
>>393
なるほど!
ありがとうございます

ランダムアクセスは難しいですね
395デフォルトの名無しさん:2012/11/24(土) 22:49:16.25
ランダムアクセス関係ない
Cの基本的な文法だよ
396デフォルトの名無しさん:2012/11/24(土) 22:50:20.76
>>395
すみません、それはわかっています
ついでに、ランダムアクセスも難しいですねという意味でした
すみません
397デフォルトの名無しさん:2012/11/24(土) 22:50:21.20
>>388
ありがとうございますっmallocしらべてみます
>>390
すみません
3,2,2,1,2,3,1,3,2
です
398デフォルトの名無しさん:2012/11/24(土) 22:52:02.97
DirectXの関数をCソースで使いたいんだけどどんな環境?
WindowsならDirectXの関数は使えるはずなんだけど
とりあえずグラフィック扱いたい
どんな環境があるから教えてくれ
本に載ってない
399デフォルトの名無しさん:2012/11/24(土) 22:57:55.72
文法だけ教えて環境は教えませんwwwwwwww
っていう本が多いよな意地悪だ
400デフォルトの名無しさん:2012/11/24(土) 23:00:26.47
401381:2012/11/24(土) 23:06:55.25
>>387
この位だったらあんまり意味ないけど、とりあえず2つクラスを作って様子を見てみる。
public class Node { /* データ、前のノード、次のノード */ } //interfaceも必要に応じて作る
public class NodeDataset { /*Nodeのインスタンスを保持、追加、検索など行う */ } //interfaceも必要に応じて作る

NodeDatasetをnewして2分岐を安全に管理できるようにするなー。ごめん、ダメダメな回答かも

>>386
厳しいなー。今までやった事ないC言語勉強して、わけわかんなくなってる。
そういう>>386経験ない?

>>389
なんか、データの管理が大変そうですね。
C言語は誰がデータを管理しているのかわからないから、難しいな
402デフォルトの名無しさん:2012/11/24(土) 23:11:50.88
データは儂が管理しとる。
403382:2012/11/24(土) 23:18:44.16
>>401
いやクラスの方からのコメントはありがたい。私もその考え方にほうほうのていでたどりついた。
で、その class Node のメソッドはほとんど static ということでいい?
404デフォルトの名無しさん:2012/11/24(土) 23:20:16.38
クラスに相当する構造体を作れ
あとはそれを第一引数にする関数群を書けばJava厨でも安心だ!
405デフォルトの名無しさん:2012/11/24(土) 23:20:24.26
406381:2012/11/24(土) 23:44:02.74
>>403
class Nodeにはstaticメソッド使っちゃだめ。
class Nodeの/* データ、前のノード、次のノード */ はインスタンス変数で宣言されているから、
メソッドもインスタンス変数にアクセスするためにインスタンスメソッドにしなくちゃいけない。
サブクラスとか作った時にstaticだとポリモーフィズムができないので、拡張性をに乏しい。
スレッド使った時に意味もなくstaticにすると、データの安全性など考えることが増える。

newしてインスタンスa、bを作るとメモリ上に別々に領域が確保されるので、どんな操作をしてももう片方に影響がでないのもstatic使わないメリットです。。

スレ違いになるので、この話はここまでにしませんか?

>>404
お前優しいな、頑張るよ
407デフォルトの名無しさん:2012/11/24(土) 23:46:30.43
windowsプログラミングをしたいのですが、時間はどの構造体を使うのがベストなのでしょうか?
time_tとか汎用的な感じでよさそうなんですけが
408デフォルトの名無しさん:2012/11/24(土) 23:54:35.40
昔見たソースで構造体の中に関数ポインタを持たせて
無理やりクラスもどきにして使ってるのがあったな。
409デフォルトの名無しさん:2012/11/25(日) 00:00:40.26
testにはsetTest()で値をセットしているのに、mainからtestの中身を参照できるんですか?
testにセットしている1はsetTest()が終わった段階で、メモリから削除されると思うのですが

int test;
void setTest() { test = 1; }

int main() {
setTest();
printf("%d",test);
}
410デフォルトの名無しさん:2012/11/25(日) 00:05:55.37
>>408
jpeglibがそういう感じ。
411382:2012/11/25(日) 00:19:13.22
>>406
了解しました。
ヒントありがとうございました。これはまだ考察がたりないか。
412デフォルトの名無しさん:2012/11/25(日) 00:19:49.74
>>409
testは、mainの{}の外にある(グローバル)から参照できる。

↓別の例でこれは駄目。参照できない。
#include <stdio.h>
int main()
{
{int x=123;}
printf("%d&yen;n", x);
}
413デフォルトの名無しさん:2012/11/25(日) 00:52:33.84
C言語にもIMEパッドみたいなのあるの?
いちいちinclude<stdio.h>とか打つの
面倒臭くてたまらんのだが?
414デフォルトの名無しさん:2012/11/25(日) 01:45:05.51
>>413
それくらい打てよ
415デフォルトの名無しさん:2012/11/25(日) 01:49:20.72
その程度を打つのが面倒なら、C言語に手を出さないほうがいいよ
416デフォルトの名無しさん:2012/11/25(日) 01:51:29.25
単語:include<stdio.h>
よみ:いst
417デフォルトの名無しさん:2012/11/25(日) 01:52:59.53
いやいや補助機能くらいあるエディタあるでしょうw

関数作ったらプロトタイプ宣言も自動でしてくれたり使わない変数消したら
宣言も消えるような機能とかないかな
418デフォルトの名無しさん:2012/11/25(日) 01:59:16.89
スタジオHとかだじゃれで言ってた人を思い出した。
419デフォルトの名無しさん:2012/11/25(日) 02:41:02.79
>>413
プログラミング用Editor使えば?
個人的には、Sublime Text 2、Emacs、vimはよく使う。
IDEならそれこそ色々とある。
420デフォルトの名無しさん:2012/11/25(日) 02:50:22.96
>>413
定型句を登録できるエディタも多いよ。
探してみなよ。
421デフォルトの名無しさん:2012/11/25(日) 03:06:57.84
emacsとかvimてオナニーだよな
使いにくいし効率悪い
422デフォルトの名無しさん:2012/11/25(日) 03:24:27.86
どうせ設定書かずにデフォルトの状態で使ってんだろ
423デフォルトの名無しさん:2012/11/25(日) 03:55:33.65
課題終わらん
ここで聞くレベルでもないオワタ
424デフォルトの名無しさん:2012/11/25(日) 04:53:05.79
425デフォルトの名無しさん:2012/11/25(日) 06:00:02.00
viでイナフ
426デフォルトの名無しさん:2012/11/25(日) 06:50:35.74
viってことはUNIX系OS環境にしてgccでやってるってこと?
427デフォルトの名無しさん:2012/11/25(日) 09:32:25.79
vimが効率悪いとかアホすぎwwwwww
秀丸とかいう日本製の糞エディタでも使ってんの科wwwwv
そんな糞エディタは世界中で日本人しか使ってませんよwwwww
428デフォルトの名無しさん:2012/11/25(日) 09:37:17.39
そりゃそうだろうな
429デフォルトの名無しさん:2012/11/25(日) 09:41:09.25
>>412
レスありがとう

グローバル変数はヒープに積まれるのですか?
430デフォルトの名無しさん:2012/11/25(日) 09:42:23.72
>>427
vimってプログラミングするには効率悪いよね
あの人達はeclipseとかvs使ったことないのかな
431デフォルトの名無しさん:2012/11/25(日) 09:48:12.44
インテリセンスの機能以外の全てがvimの方が上回っていると思うね
インテリセンスにしてもJavaやC#ならまだしもC言語ならvimの補完で十分
プロvi使いの編集スピードを目にしたらそんなこといえなくなる
432デフォルトの名無しさん:2012/11/25(日) 09:56:02.47
へぇ
そう思うんだ
433デフォルトの名無しさん:2012/11/25(日) 09:56:57.77
>>431
そのインテリセンスが一番大切なんだって
あとの機能はどうでもいい
434デフォルトの名無しさん:2012/11/25(日) 10:09:43.77
インテリセンスなんて邪魔なだけ。
プロは全て手で打つ。脳と手を直結させて
魂を込めて打ち込むことこそ、最高のデバッグなんだ。
435デフォルトの名無しさん:2012/11/25(日) 10:12:31.96
>>434
クラス名・変数名とか全部覚えている時点で、大した規模じゃないから
436デフォルトの名無しさん:2012/11/25(日) 10:13:25.71
初歩的な質問ですいません。
このコードなんで、落ちるんですか?

struct Hellow {
char *msg;
};
struct Hellow* h;
h->msg = "hellow";
437デフォルトの名無しさん:2012/11/25(日) 10:14:20.79
>>436
濁点がおかしい
438デフォルトの名無しさん:2012/11/25(日) 10:15:11.46
struct Hellowの実態がない
439デフォルトの名無しさん:2012/11/25(日) 10:15:47.23
Hellow* hは単なるポインタであってHellowの実体がない
440デフォルトの名無しさん:2012/11/25(日) 10:16:13.85
・読点の位置がおかしい
・Hellow
441デフォルトの名無しさん:2012/11/25(日) 10:21:40.91
まあ確かに実体を確保していないから、なんだけど、
実際の動作としては

ポインタhがどこも指していない(おそらく0またはとんでもないアドレス)
不定なアドレスhが指すメンバーにアクセスした瞬間セグメンテーションフォルト

といったところだろうね。
442436:2012/11/25(日) 10:23:03.04
レスありがとうございます。

構造体の場合は、mallocするしかインスタンスを確保できないのですか?
443デフォルトの名無しさん:2012/11/25(日) 10:24:39.71
struct Hellow h;
444デフォルトの名無しさん:2012/11/25(日) 10:30:30.70
>>427
日本人による日本人のためのエディタを外人が使わないのは当たり前だろ
おまえこそ日本人のためのサイトに来てる時点で言動不一致だろうが

そんなに日本が嫌いなら共産党独裁国にでも帰化したらどうだ
それで徴兵にでも呼ばれれば祖国とは何かをイヤでも憶えることになるだろう
445デフォルトの名無しさん:2012/11/25(日) 10:49:23.32
>>444
失せろゴミチョン
446デフォルトの名無しさん:2012/11/25(日) 11:01:12.70
http://live.nicovideo.jp/watch/lv116015322?ref=mini_subscribe&zroute=subscribe&tab=index

第33回全日本マイクロマウス大会 決勝

プログラム(PROGRAM)

ロボトレース 決勝
  Robotrace final

マイクロマウス
  Micromouse
 エキスパートクラス 決勝
  Expert class final
 マイクロマウスハーフ 決勝
  Half size class final
447デフォルトの名無しさん:2012/11/25(日) 12:36:04.83
>>446
楽しそう
わしも組み込みCやってみたいけど敷居が高そうでなかなか手が動かないよ
448デフォルトの名無しさん:2012/11/25(日) 12:38:40.66
VIMで書いたプロジェクトはMAKEとか入ってるから難解でチーム全員が難なく扱えるとは限らない
その点VSを使えばソリューションファイルをダブルクリックするだけで良いのでチーム開発に向いている
449デフォルトの名無しさん:2012/11/25(日) 12:40:08.76
Linux環境でソリューションをダブルクリックしても何も起きませんけど
450デフォルトの名無しさん:2012/11/25(日) 12:42:09.60
Makefileもろくに書けないのが混ざってる時点で、そんなチーム終わってるよ
むしろ足切りの意味で推奨できる
451デフォルトの名無しさん:2012/11/25(日) 12:52:17.57
Makeみたいなビルドツールを全く使わずに作ってるものってあるの?
windows限定のプロジェクトならまああるのか
452デフォルトの名無しさん:2012/11/25(日) 12:54:10.16
MAKEがすでに老人のオナニーであり
チームの足を引っ張る要因になってることを知らないのか
453デフォルトの名無しさん:2012/11/25(日) 12:58:41.52
私は牌尊で美流度します
名句より可読性が高く、必要なら名句より精密な制御が可能であり、記述量も名句と大差が無いからです
454デフォルトの名無しさん:2012/11/25(日) 12:59:45.27
関数名や変数名に漢字を使えるCコンパイラってありますか?
いちいち英語の名称を考えるのが面倒で。
455デフォルトの名無しさん:2012/11/25(日) 13:00:39.66
今どきMakeはなぁ
configureとかも含めホント死滅してほしいけど、なかなかなくならない
456デフォルトの名無しさん:2012/11/25(日) 13:12:26.79
>>455
代わりあるんですか?
Makeがなかったらどうやってコンパイルするんですか?

configureがなかったら何がMakefile作るのですか?
依存関係チェックだってやってくれるんですよ
457デフォルトの名無しさん:2012/11/25(日) 13:16:04.98
make自体はコンパイラじゃねぇから
458デフォルトの名無しさん:2012/11/25(日) 13:19:30.80
牌尊を使いなさい
さすれば道は開けるでしょう
459デフォルトの名無しさん:2012/11/25(日) 13:23:42.21
ある日、山田君(仮名)は自分のプログラムのデバッグをしていた。
ところが、いくらソースを直してプログラムを実行してみても、ちっともバグが潰れないのである。

あれ、何でCLに-cオプション付けてるの?

そう、山田君(仮名)はMAKEを使っていなかったために、バチが当たったのである
(「いくらコンパイルしても実行ファイルが更新されていなかった事件」)。
460デフォルトの名無しさん:2012/11/25(日) 13:24:17.41
別にビルドツールがmakeだろうとVSだろうとどうでもいいけど
>>448みたいなビルドツールを使えない人がいるチームは開発自体に向いてない
テスト実施部隊にでもなっておいて
461デフォルトの名無しさん:2012/11/25(日) 13:30:18.41
まぁここはbjam使うという事でひとつ
462デフォルトの名無しさん:2012/11/25(日) 13:31:24.02
実際、makeに執着してるとこなんて未だにあるの?
463デフォルトの名無しさん:2012/11/25(日) 13:34:18.92
C をやるからには、単純化した概念でもいいからコンパイルとは?リンクとは?オブジェクトファイルとは?くらいは把握しておかないと。
(n)make にしても仕組みがわかればどうということはない。vs も裏ではこれらが走っているという気がするのだが。

お子様ランチじゃないんだし。
464デフォルトの名無しさん:2012/11/25(日) 13:35:18.17
>>457
でもmakeってコンパイルを自動でやってくれるんでしょ
いちいち
gcc -o hoge -L/lib:/usr/lib hoge.c
とかいうのを何百回打ってられない
ほかにいい自動化ツールあるの?

牌尊ってググったけどヒットせず
465デフォルトの名無しさん:2012/11/25(日) 13:38:58.24
アホみたいな造語使ってるやつは例外なく無能だからノイズとしてスルー
466デフォルトの名無しさん:2012/11/25(日) 13:41:11.08
unixベースでツールのビルドからのインストールといったら
configure
make
make install
だからなあ
467デフォルトの名無しさん:2012/11/25(日) 13:48:58.00
未だにimakeから脱却できない・・・
個人的に使うには楽なんだよな、imake
468デフォルトの名無しさん:2012/11/25(日) 13:57:37.48
世の中のOSなんてほとんどUnix系だし
Windowsは異端
469デフォルトの名無しさん:2012/11/25(日) 13:58:29.94
>>468
わろたwww
470デフォルトの名無しさん:2012/11/25(日) 14:13:46.20
>>468
最新のハッカーの意見は、やっぱりWindowsw。
471デフォルトの名無しさん:2012/11/25(日) 14:26:44.15
組み込み競技会場は製作者、視聴者みんな仲良しなのに・・・ここはケンカぱっかねw
472デフォルトの名無しさん:2012/11/25(日) 14:39:18.68
>>470
そうなのか。
そのWindowswってOS、俺知らなかったわ。
473デフォルトの名無しさん:2012/11/25(日) 14:39:44.15
組み込み入門したいんですがどんなハードを買えばいいんですか?
474デフォルトの名無しさん:2012/11/25(日) 14:40:51.28
>>473
インターフェースっていう雑誌の付録
475デフォルトの名無しさん:2012/11/25(日) 14:44:08.34
>>469
世の中でUnixじゃないパソコンOSってwindows以外なんかあるの?
Be/Amiga/MonaOSとかはメジャーじゃないから、そんなのはどうでもいいんだけど
476デフォルトの名無しさん:2012/11/25(日) 14:45:44.17
MS-DOSとOS/2
477デフォルトの名無しさん:2012/11/25(日) 14:47:00.37
DOSはOSじゃないよ。
478デフォルトの名無しさん:2012/11/25(日) 14:50:17.86
CP/Mっていうのもあったな。
479デフォルトの名無しさん:2012/11/25(日) 14:51:33.05
makeつかうならautotoolsだな。
480デフォルトの名無しさん:2012/11/25(日) 15:05:40.04
お前ら、重箱の箱を突っつくようなOSが好きなんだな
481デフォルトの名無しさん:2012/11/25(日) 15:06:21.23
ロボット掃除機の掃除パターンのプログラミングなんか面白そうなんだが
USB接続できてSDK公開してるメーカーなんて無いよな
ツカモトエイムとかCCPみたいな安いとこが出してたら即買いなんだが
482デフォルトの名無しさん:2012/11/25(日) 15:07:18.74
パラメータが配列なのはムダなコピーが発生するので、普通使わないんでしょうか?
483デフォルトの名無しさん:2012/11/25(日) 15:11:20.62
コピーが発生しません
484デフォルトの名無しさん:2012/11/25(日) 15:12:43.80
>>482
ポインタで渡してしまうと副作用を持ってしまうので、プログラムの安全性は落ちる。
485デフォルトの名無しさん:2012/11/25(日) 15:18:24.01
つconst
486デフォルトの名無しさん:2012/11/25(日) 15:20:05.91
落ちたらどうだってんだ
487482:2012/11/25(日) 15:20:18.23
コピー発生しないんですかー。

それじゃ、なんでfunc()とmainでsizeof(intArray)/sizeof(intArray[0])の処理結果が違うんですか?

void func(int intArray[]){
printf("%d", sizeof(intArray)/sizeof(intArray[0]));
}

int main() {
int intArray[] = {1, 2, 3, 4};
printf("%d", sizeof(intArray) / sizeof(intArray[0]));
func(intArray);
}
488482:2012/11/25(日) 15:22:45.37
>>484
もしかして、constつけていないから安全性が落ちるってことですか?
うーん、javaとかc#だと引数にポインタがセットされるじゃないですか。
その考えで行っちゃうと、java/c#は安全じゃない言語ってことになりませんか
489デフォルトの名無しさん:2012/11/25(日) 15:25:20.48
>>487
func側は配列のサイズ知らないからな。
490デフォルトの名無しさん:2012/11/25(日) 15:26:29.96
これで結果同じだろ。

void func(int intArray[]){
printf("%d\n", intArray);
}

int main() {
int intArray[] = {1, 2, 3, 4};
printf("%d\n", intArray);
func(intArray);
}
491デフォルトの名無しさん:2012/11/25(日) 15:27:04.95
#include <stdio.h>

void func(int intArray[]){
printf("%p\n", intArray);
}

int main() {
int intArray[] = {1, 2, 3, 4};
printf("%p\n", intArray);
func(intArray);
}
492デフォルトの名無しさん:2012/11/25(日) 15:27:37.74
493デフォルトの名無しさん:2012/11/25(日) 15:58:00.35
>>488
Cの仕様では、配列はコピーされない。
また、巨大配列をその都度コピーしていると、無駄が大きい。
しかし実際には、関数で処理したい配列は、サイズも次元も色々ある。
そこで、関数に渡せるものは、”配列の先頭アドレス”と仕様で決めた。
因みに、以下の2つは同等。

void aaa(int a[]){/* do something */}
void aaa(int*a) {/* do something */}
494482:2012/11/25(日) 16:10:34.09
レスありがとうございます。
func側は配列のサイズ知らない。何故ならば、関数に渡せるのは先頭のアドレスだけだから。
ってことですね。

int main() {
int i[] = {1, 2, 3, 4};
printf("%d\n", sizeof(i) / sizeof(int)); ←それじゃこの場合は、main()が配列iの最後のアドレスを知っているってことですか?
495デフォルトの名無しさん:2012/11/25(日) 16:13:25.91
main内で定義してるからそりゃ知ってる
仮にmainがiを main(int i[])として外部から受け取った場合サイズはわからない
496482:2012/11/25(日) 16:19:08.36
>>495
つまり、最後のアドレスはOSが知っているんですね
大体理解したと思います。

C言語入門サイトはC言語の入門じゃなくて、プログラミング入門なんで
調べるの面倒ですねー
497 ◆QZaw55cn4c :2012/11/25(日) 16:53:42.86
>>482
昔のCでは
・関数の引数として構造体を渡すことができなかった
ので、
・関数に構造体の内容を渡したいときは、構造体のポインタをわたしていた。

最近(といっても20年前)のCでは引数に構造体を渡せるようになった。
配列もそうなってもよかった、というのはひとつの考え方だが、過去のしがらみからできなかったのだろう。
・配列名に[]演算子がつかない配列名のみの場合は配列の先頭へのポインタ(アドレス)を示す、という奴がどうにもならない。

思想として複合的なオブジェクトをそのまま渡すのは >>482 も感じている理由のとおりで、やらない、のが根底にあるかもしれない。
以上根拠のない推論。
498デフォルトの名無しさん:2012/11/25(日) 17:05:57.66
>>497
>最近(といっても20年前)のCでは引数に構造体を渡せるようになった。
Cの歴史から見て、構造体を直接渡せるようになったのが「最近」と言うのは我田引水過ぎる。
499デフォルトの名無しさん:2012/11/25(日) 17:10:37.20
引数で構造体を渡すのにCライブラリの補助が必要だからな
500デフォルトの名無しさん:2012/11/25(日) 17:10:56.85
なんとなくANSI前後っていう感覚ではあるw
501 ◆QZaw55cn4c :2012/11/25(日) 17:14:42.86
>>500
そうそうそれそれもう忘れた
>>498
語感として「最近」が不適切なら「ある時期から」にしておこうか
502デフォルトの名無しさん:2012/11/25(日) 17:18:06.78
C覚えた頃は引数の書き方なんかも違ってたんだもんなー
503デフォルトの名無しさん:2012/11/25(日) 17:39:17.46
何でC++に統合しないんだろうね?
504デフォルトの名無しさん:2012/11/25(日) 17:40:20.08
何で統合すんだよ?
505デフォルトの名無しさん:2012/11/25(日) 18:10:11.85
>>499
そういう処理系もあるが、不要な処理系もあるぞ。
506デフォルトの名無しさん:2012/11/25(日) 18:10:42.74
>>503
違う言語だから。
507デフォルトの名無しさん:2012/11/25(日) 18:13:10.21
個人的にはもう統合されちゃって欲しいな。
508デフォルトの名無しさん:2012/11/25(日) 18:29:26.84
一応C++はCのスーパーセットという事になってるから統合とか必要ないだろ
というか統合って何すんのよ
509デフォルトの名無しさん:2012/11/25(日) 18:32:53.16
細かい違いを合わせてくれって事だろ。
510デフォルトの名無しさん:2012/11/25(日) 18:38:07.71
普通にCのコード書いてC++コンパイラでコンパイルすればええやん
511デフォルトの名無しさん:2012/11/25(日) 18:46:41.16
CはなんでCUIの勉強しんとあかんのや
GUIだけの勉強じゃだめなんか?
512デフォルトの名無しさん:2012/11/25(日) 18:48:40.23
GUIなんぞ書かなくていいなら書きたくないわ。
513デフォルトの名無しさん:2012/11/25(日) 18:49:50.06
言語関係なく勉強しとけよ・・・
514デフォルトの名無しさん:2012/11/25(日) 18:59:24.05
>>511
GUIは言語標準のライブラリだけじゃ手が出ないだろ。
515デフォルトの名無しさん:2012/11/25(日) 19:05:47.18
>>514
さんくす
516デフォルトの名無しさん:2012/11/25(日) 19:13:44.99
なぜこれがシンタックスエラーとなるのですか?

const int MAX_INDEX = 5;
int array_tes[MAX_INDEX];
517デフォルトの名無しさん:2012/11/25(日) 19:21:25.70
俺のコンパイラは許してくれた。
518デフォルトの名無しさん:2012/11/25(日) 19:22:44.68
>>516
配列の境界は定数式じゃないといけないけど、
Cだとconstは定数式じゃないから。
C++だと定数式になる。
CとC++の違いの一つ。
519 ◆QZaw55cn4c :2012/11/25(日) 19:24:59.93
>>516
C89 では× const をつけても変数は変数、らしい
最新のC99では○ http://ideone.com/1pfyZY
520デフォルトの名無しさん:2012/11/25(日) 19:28:08.61
>>519
thx
あなた、めちゃC言語詳しいね

それじゃ、define使えってことですねー
521デフォルトの名無しさん:2012/11/25(日) 19:29:36.89
これは良い良スレ
522デフォルトの名無しさん:2012/11/25(日) 19:33:36.81
clang で -std=c89 -Wall つけても怒られない
523デフォルトの名無しさん:2012/11/25(日) 19:38:31.58
-pedantic つけたらようやく説教してくれた
524 ◆QZaw55cn4c :2012/11/25(日) 20:02:52.96
>>520
ごめん、まちがいだ。
525デフォルトの名無しさん:2012/11/25(日) 20:13:19.98
C言語やっていて不思議に思うんだけど、なんでヘッダファイルってあるのかな
*.cからヘッダファイルって作れる気もするんだけど

プログラムをメモリ上に展開する際に関数も読み込まれるけど、それに関係しているのかな。
どちらにせよ、ちょっと面倒ですね。ORACLEのpackage書いてるみたい。
526デフォルトの名無しさん:2012/11/25(日) 20:18:57.61
*.cに全部の情報が書かれてるわけでもないから自動生成は無理な気がする。
527デフォルトの名無しさん:2012/11/25(日) 20:19:03.91
別にヘッダ読まずに
int printf(const char *, ...);
#define TRUE 1
とかゴリゴリ書いてもいいんだよ
528デフォルトの名無しさん:2012/11/25(日) 20:20:09.80
別に*.cファイルをインクルードしてもいいんだよ
529デフォルトの名無しさん:2012/11/25(日) 20:30:24.98
ソースファイルを分割してプロトタイプ宣言をヘッダに記述する、っていうのは
そもそもの#includeの目的じゃなくて、後天的に完成された文化と伝統。
C自身はそんなものデザインしてない。
530デフォルトの名無しさん:2012/11/25(日) 20:34:22.23
>>526
全て書かれてなければコンパイルできませんが。

Javaはインターフェース情報を.javaから生成するでしょ。
.hと.cで同一情報を重複管理するのはソフトウエア工学の原則に反する。
531デフォルトの名無しさん:2012/11/25(日) 20:36:09.35
>>530
構造体のレイアウトとかヘッダにしか書いてないじゃん。
532デフォルトの名無しさん:2012/11/25(日) 20:37:12.85
321
213
123
のテキストファイルから任意の行と列を読み出して2次元配列に格納するプログラムをつくったのですが
結果が0000000000になります。どうしたら正しく表示されるか教えてください。おねがいします
orz
int main()
{ FILE *fp;
char *fname ="test.txt";
int c;
double** matrix;
int size_x, size_y; /* size_x 行 size_y 列 */
int i,j;
scanf("%d%d", &size_x, &size_y);
fp = fopen( fname, "r" );
if( fp == NULL ){
printf( "%sファイルが開けません\n", fname );
return -1;
533デフォルトの名無しさん:2012/11/25(日) 20:38:39.43
>>532
}
//while( (c = fgetc( fp )) != EOF ){
// printf( "%c", c ); }
/* 左辺と = で 3. の青い矢印を生成*/
matrix = (double**)malloc(sizeof(double*)*size_x);
if (matrix==NULL) exit(1); /* 正常にmallocできたかどうかのチェック*/

/* このループで 4. 以降の処理 */
for (i=0 ; i < size_x ; i++) {
matrix[i] = (double*)malloc(sizeof(double)*size_y);
if (matrix[i]==NULL) exit(1); }
while( (c = fgetc( fp )) != EOF ){
for (i=0 ; i < size_x ; i++) {
for (j=0 ; j < size_y ; j++) {
matrix[i][j]=c;
printf("%d",matrix[i][j]);
} } }
for (i=0 ; i < size_x ; i++) {
free(matrix[i]); }
free(matrix);
exit(0);fclose(fp);
return 0;
}
534デフォルトの名無しさん:2012/11/25(日) 20:45:46.24
>>530
分割コンパイルというやつだ。
ひとつのプロジェクトを構築するに際して複数のソースコードをコンパイル、生成したモジュールをリンク(結合)する方法がある。
535デフォルトの名無しさん:2012/11/25(日) 20:48:10.90
>>533
他にも突っ込みどころだらけだけれど、改行が欲しければputchar('\n')かprintf("\n")で改行しておけ。
536デフォルトの名無しさん:2012/11/25(日) 20:51:28.68
>>533
取り敢えず、"{"は行末に、"}"はインデントを除いた行頭に書くこと。
特に、"}"を1行に複数並べるのは学習中は避けるべき。
それと、一一鬱陶しいからcodepadかideoneに貼ってくれ。
537デフォルトの名無しさん:2012/11/25(日) 20:52:23.52
>>530
>.hと.cで同一情報を重複管理するのはソフトウエア工学の原則に反する。
常識的コーディングでは重複して書かないでしょ。

.hは他の.cに公開するインターフェイスを書くことになるので、普通は宣言のみを書く。
.cには実体を書くことになる。.hに実体を書いてしまうとコンフリクトするし。

>>531
>構造体のレイアウトとかヘッダにしか書いてないじゃん。
私はよく構造体の中身を隠蔽するために、タグ宣言だけヘッダに置いたりするけどね。
538デフォルトの名無しさん:2012/11/25(日) 21:28:20.16
>>537
> 常識的コーディングでは重複して書かないでしょ。

プロトタイプ宣言と実体のこと言ってるんでしょ。
539デフォルトの名無しさん:2012/11/25(日) 21:39:27.36
>>531
コンパイラはコンパイル時に全部知ってる。コンパイラがインターフェースファイルを生成すればいい。
JavaやC#はそういう仕組み。

>>537はQzだろう。外しっぷりが同一。
540デフォルトの名無しさん:2012/11/25(日) 21:48:17.88
そしてCにもモジュールシステムを!と検討するという流れは昔から
541デフォルトの名無しさん:2012/11/25(日) 21:48:57.40
>>536
>取り敢えず、"{"は行末に、"}"はインデントを除いた行頭に書くこと。

Astyle(http://astyle.sourceforge.net/)なんかでは各種スタイルがあるが、上記に限定する理由は?
542デフォルトの名無しさん:2012/11/25(日) 21:54:34.84
>>516
gcc version 4.2.1 で
gcc a.c -pedantic -O2 -Wall
OKだった。
543デフォルトの名無しさん:2012/11/25(日) 22:13:16.89
>>539
残念、QZ=>>534
544デフォルトの名無しさん:2012/11/25(日) 22:18:27.32
>>539
Cだとヘッダ読まないと全部知れないだろ。
545デフォルトの名無しさん:2012/11/25(日) 22:51:56.56
Cはコンパイラのルールとしてincludeしないと存在を知らないように
してしまっただけ。文句はK&Rに言え。

さらに言うと、includeは単に「外部参照を仮定する」だけなので、
同一名のグローバルシンボルが仮にあったとしても宣言通りである
という保証はない。
546デフォルトの名無しさん:2012/11/25(日) 22:56:59.34
java や c# のそういうところは、あれだ、コンパイラというよりはインタプリタだね
名前がみつからなかったらランタイムで止まるんでは?
547デフォルトの名無しさん:2012/11/25(日) 22:59:04.98
>>533
http://codepad.org/P8kxOU27

問題点を挙げた。思い出しながら書いたので漏れがあるかも。
・読み込むデータ=int、格納領域=double。不一致。
 たぶん「ポインタで2次元配列は…、ダブルポインタか。double**っと」みたいな流れかな。
・出力が0になるのはdouble型変数の値を%d指定してるから。この場合は「"%c ", (int)matrix[i][j]」がいいと思う。
・1文字読み込む毎にmatrix配列の全領域を読み込んだ文字で上書きしてる。1文字ごとにforしちゃいかん。
・ファイルから読み込む文字には\r\nがあるのを考慮してない。テキストモードだと0x0aがmatrixに格納されてしまう。
・ファイルの読み込みはX軸が先なので、matrixの確保も[x][y]ではなく、[y][x]にした方が自然(ループ処理的な意味で)。
 今回はそのまま使ってみた。
548デフォルトの名無しさん:2012/11/25(日) 23:13:18.19
>>541
>>取り敢えず、"{"は行末に、"}"はインデントを除いた行頭に書くこと。
ホワイトスミスやGNUを含めて、大抵のスタイルは上記を満たすぞ。
上記を満たさない比較的メジャーなコーディングスタイルはPico位かな。
一行野郎を含めて、初学者向きじゃないと思う。
549デフォルトの名無しさん:2012/11/25(日) 23:19:54.82
>>545
逆に include しなくても知っているようだと
グローバル空間の汚染が即座に詰む

むしろ K&R は include を渋っていて
某オッサンのすごい剣幕に押し切られたのが # 系の起源

# 俺的には関数がデフォで extern なのが誤っていると今でも思っている
550デフォルトの名無しさん:2012/11/25(日) 23:47:10.24
>>535
はい、ありがろうございますm
できればそのいろいろのほうもつっこんでくれるとありがたいです
>>536
すみませんでした行がおおすぎるといわれたので変に行をへらすようにしていました
以後codepadをつかいます。
551デフォルトの名無しさん:2012/11/25(日) 23:56:14.64
552デフォルトの名無しさん:2012/11/26(月) 00:17:40.56
>>547
すみません、いまみつけました、
わざわざすみません、ありがとうございますOTZ
553デフォルトの名無しさん:2012/11/26(月) 00:52:06.75
>>424
自力で終わらせた後に気付いたけど

ありがとう
554537:2012/11/26(月) 08:40:44.45
>>539
>コンパイラはコンパイル時に全部知ってる。
コンパイルはユニット単位で実施されるので、他モジュールのインターフェイスまではわかりません。
プロトタイプ宣言が見えない場合に警告されるのはこれが原因。

>コンパイラがインターフェースファイルを生成すればいい。
C言語的にはユニットより上位の概念(VSなんかで言うプロジェクトとかソリューションとか)が無いから無理。
コンパイルだってワンパスで実施するようになっているので、おっしゃることの実現はまず無いでしょう。

もっと言えばプリプロセッサはC言語の範疇外とも言えますし、、、。

念のため>>537はQzではないです。
555デフォルトの名無しさん:2012/11/26(月) 10:29:06.84
>>554
モジュールが参照できるようなインターフェースをコンパイラが生成すればいい。
他のモジュールの情報が必要な場合は、他のモジュールがコンパイルされたときに
インターフェースが生成されているので、それをインポートすればいい。

ところがCではインターフェースを手作業で.hに記述している。単なる手抜き。
556デフォルトの名無しさん:2012/11/26(月) 10:33:30.58
>>555
入門編の質問スレで薀蓄を垂れるのは如何なものか。
高邁な思想に基づくのであれば規格スレでやればよろしかろ。

# と思ったら規格スレ自体はPart134が落ちて以来放置なのかな?w
557デフォルトの名無しさん:2012/11/26(月) 10:49:05.49
>>555
そういうのはCじゃなくて、もっと高級な言語でやればいいんじゃないの?
558デフォルトの名無しさん:2012/11/26(月) 10:53:33.83
CPPよりもっと高級で洗練された言語をカリカリに最適化されたバイナリ吐き出すようには出来ないの?
559デフォルトの名無しさん:2012/11/26(月) 10:56:05.39
だから、>>525への回答は「コンパイラが手抜きしているから」であって、
>>525が言い出したような「.cにすべての情報が書かれていないから」ではない。
560デフォルトの名無しさん:2012/11/26(月) 11:02:27.21
.cにすべて書く事もできるだろうけど、書かない事もできるだろ。
561デフォルトの名無しさん:2012/11/26(月) 11:10:26.90
C++なら、main以外の外部モジュールは全て.hに書けるかな。クラスとして
562デフォルトの名無しさん:2012/11/26(月) 11:11:25.41
型宣言は最初に全部しないとだめなんですか?

型宣言



型宣言



とすると 定義されていない識別子です。 エラーを吐きます
環境は VC++ です。
563デフォルトの名無しさん:2012/11/26(月) 11:15:40.31
>>562
古臭いCしか使えない場合は、ブロックの先頭に纏める必要があります。
なので>562の場合、こうなります。
--
void func()
{
型宣言
型宣言


}
--
或いはこうなります。
--
void func()
{
型宣言

{
型宣言

}
}
564デフォルトの名無しさん:2012/11/26(月) 11:15:42.31
.cならエラーだろ
.cppなら通るだろ
565デフォルトの名無しさん:2012/11/26(月) 11:18:32.21
>>563
>>564
お早いレスありがとうございます
.cppの時に出なかったのに.cだと出るようになったので気になってました
566デフォルトの名無しさん:2012/11/26(月) 11:57:14.15
>>555
>ところがCではインターフェースを手作業で.hに記述している。単なる手抜き。
単なる手抜きと言ってしまえばそのとおりだけど、それがCの基本思想となっている。

とにかくCはコンパイラが簡潔に書けるようになっている。
これがコンパイルの実装が容易であることにつながり、様々な環境で
Cコンパイラが使える背景になっている。
>>557さんのおっしゃるとおり。
567デフォルトの名無しさん:2012/11/26(月) 13:03:11.50
他のソースの関数宣言を自動で参照するとか、
Cの開発された時期を考えればありえない。
JavaとかEclipseとかリソースが余って余って仕方ない今だから出来たこと
568デフォルトの名無しさん:2012/11/26(月) 13:37:54.18
ヘッダすら書けない低能がCの仕事をハッタリかまして引き受けて逆切れしてるのか?
569デフォルトの名無しさん:2012/11/26(月) 14:35:47.83
getcharって初期化しないと履歴残るんだ
知らなくて困った
570デフォルトの名無しさん:2012/11/26(月) 14:36:57.17
scanfも履歴残るんですか?
571デフォルトの名無しさん:2012/11/26(月) 16:22:22.56
履歴?
何の話?
端末エミュレータの話ならスレ違いだよ。
572デフォルトの名無しさん:2012/11/26(月) 16:46:39.40
以前の入力を端末が憶えてるってアレね
573デフォルトの名無しさん:2012/11/26(月) 17:50:54.79
>>571
言葉を間違えました
履歴ではなく、保持されるです。
574デフォルトの名無しさん:2012/11/26(月) 17:58:33.06
演算中の 'char' 型と 'bool' 型の混用は安全ではありません

と警告が出るのですが、絶対に避けるべきでしょうか
575デフォルトの名無しさん:2012/11/26(月) 18:05:45.10
>>574
そういうふうに質問する人は避けるべき。
何故その警告がでて、無視しても安全なのかわかっている人は、無視してもいいかも。
576デフォルトの名無しさん:2012/11/26(月) 18:11:14.44
どんなコードについて言われたのか知らんが
ほぼ間違いなく都市伝説だぜ、それ
577デフォルトの名無しさん:2012/11/26(月) 18:17:00.35
>>573=569
何がどう保持される話なのか判らんから、具体的に頼む。
そもそも「getchar()」と「初期化」がどう関係するのやら。
578デフォルトの名無しさん:2012/11/26(月) 18:17:38.18
>>575
ありがとうございます
わかる人間になれるよう勉学に励みます
579デフォルトの名無しさん:2012/11/26(月) 18:17:44.59
>>574
警告が出たコードを提示せよ。
580デフォルトの名無しさん:2012/11/26(月) 18:23:39.31
>>579
#include <stdio.h>

int main(void)
{

char a;

printf("A〜Cまでの整数を入力してください。\n");
a = getchar();
(a==('A'||'B'||'C')) ? printf("正解です。\n") : printf("間違いです。\n");

return 0;
}
581デフォルトの名無しさん:2012/11/26(月) 18:36:57.67
釣り乙
582デフォルトの名無しさん:2012/11/26(月) 18:37:17.15
> (a==('A'||'B'||'C')) ? printf("正解です。\n") : printf("間違いです。\n");
(a=='A'||a=='B'||a=='C') ? printf("正解です。\n") : printf("間違いです。\n");
じゃねえの?
583デフォルトの名無しさん:2012/11/26(月) 18:48:30.92
>>582
(a==('A'||'B'||'C')) ? printf("正解です。\n") : printf("間違いです。\n");
を実行してなかったから間違いに気づかなかった
ありがとう
584デフォルトの名無しさん:2012/11/26(月) 18:56:04.28
実行するとかしないとかの問題じゃねーだろw
585デフォルトの名無しさん:2012/11/26(月) 19:06:08.82
(a==('A'||'B'||'C'))はまず('A'||'B'||'C')が評価されます。ここは定数なので、常に1
これとaを比較しているので、真偽値とcharを比較してるけど、なんか勘違いしてないか?って警告ですね。

やりたいことは>>582だと思う。

あとこの処理を、条件式で書いちゃうのはセンス無いと思う。
素直にif文で書くほうがよい。
586デフォルトの名無しさん:2012/11/26(月) 19:07:20.97
>>580
それと、getcharの戻り値の型はintなのでaもcharではなくintにすべき。
587 ◆QZaw55cn4c :2012/11/26(月) 19:14:27.22
プロトタイプだけ抽出するオプションがあったような‥‥‥、bcc32 でしたっけ。
588デフォルトの名無しさん:2012/11/26(月) 19:18:54.04
見るからに3項をとにかく使ってみる練習だろ、センス以前の話として
printf((a = getchar()) == 'A' || a == 'B' || a == 'C' ? "正解" : "間違い"), puts("です。");
589デフォルトの名無しさん:2012/11/26(月) 19:30:59.62
>>588
こうじゃね?
printf("%sです。\n", (
((a = getchar()) == 'A') ||
(a == 'B') ||
(a == 'C')
) ? "正解" : "間違い");
590デフォルトの名無しさん:2012/11/26(月) 19:47:12.57
>>585
センスどうこうは、この流れで関係ないだろ。
三項演算の練習問題だろが。
お前みたいに、他人のコードを見ると反射的に
批評を始める輩がいるから揉めるんだ。
591デフォルトの名無しさん:2012/11/26(月) 19:54:29.90
>>585
三項演算子の事を条件式って言ってんの?
592デフォルトの名無しさん:2012/11/26(月) 20:27:48.13
('A`||'B'||'C')
593デフォルトの名無しさん:2012/11/26(月) 21:03:09.93
>>591
三項演算子は"演算子"なので ? : のこと
三項演算子を使った式 式1 ? 式2 : 式3 全体が"条件式"

>>590
条件式は値を持つことがポイントになるので、条件式を使って題意を満たせとなると、
>>589のような書き方が良い。

>(a==('A'||'B'||'C')) ? printf("正解です。\n") : printf("間違いです。\n");
はprintf("正解です。\n") もしくは printf("間違いです。\n")の戻り値が評価結果となり、
それを捨てている。これはわざわざわかりにくい書き方をしていると思う。

条件式を使う場合、評価結果の値を使うようなコードが適していると言える。
594デフォルトの名無しさん:2012/11/26(月) 21:11:27.56
>>593
ここはコードレビューをするスレじゃないでしょ。
人のコードに横から勝手に良いだの悪いだの批評付けるなっての。
595デフォルトの名無しさん:2012/11/26(月) 21:15:02.72
>>590
わざと揉めることによって何か得ようとしていた節がある

3項はグループ
条件は特定の演算子
そして3項の唯一のメンバ
こっから switch 的な 2< への爆発が見られたら面白いのに
それが配列として実装されるか、クロージャとして実装されるかは知らんが

# 明朝これをみて赤っ恥だろうけど、今はいいんだよ!! おらぁ おらぁ
# スピリッツが今年は物流の名作がそろい踏み幻で、ペルツォフカとレモニナーヤだぜ
古いフラックスの煙が安葉巻よりイケてるんだよ、ちきしょーめ
596デフォルトの名無しさん:2012/11/26(月) 21:17:37.11
(a=='A'||a=='B'||a=='C') ? printf("正解です。\n") : printf("間違いです。\n");
初心者にはこれが一番わかりやすかったです。
597デフォルトの名無しさん:2012/11/26(月) 21:27:32.77
それよりも
if (a=='A'||a=='B'||a=='C') {
printf("正解です。\n");
} else {
printf("間違いです。\n");
}
と書いたほうがいいと思うよ
598デフォルトの名無しさん:2012/11/26(月) 21:29:54.74
>>593
全体は条件式じゃないよ
599デフォルトの名無しさん:2012/11/26(月) 21:33:29.51
>>597
>596って見づらい?
ってかセンスってなんなの?
誰が見てもわかりやすいってのがセンスの定義なの?
600デフォルトの名無しさん:2012/11/26(月) 21:35:33.26
定義じゃないよ
一つの基準にはなりうるだろうが
601デフォルトの名無しさん:2012/11/26(月) 22:04:38.12
構造体Test.msgはどのようにすれば開放できるのでしょうか?
一括でfreeしたいんですが

typedef struct {
char* msg;
} Test

Test *t;
t = (Test*)malloc(sizeof(Test));
t->msg = (char*)malloc(sizeof(1024)); //これをどうやってfreeするのか?
602デフォルトの名無しさん:2012/11/26(月) 22:06:30.57
exit(0);
603デフォルトの名無しさん:2012/11/26(月) 22:07:10.86
2回mallocしたなら2回freeする

free(t->msg);
free(t);
604601:2012/11/26(月) 22:17:43.53
>>602
malloc()したあとに、exit()するとmalloc()されたメモリはどのようになるんですか?
メモリはプロセスごとにOSが管理しているので、普通に考えたらヒープまでクリアしてくれそうな気がするんですけど

>>603
回答ありがとうございます。
楽する方法はないってことですね
605デフォルトの名無しさん:2012/11/26(月) 22:18:51.33
変数とパラメータの違いって何ですか?

int x,y,t
t=boolean;
x=2t;
y=t^2;

二つの変数に共通する変数はパラーメータですか?
日常では何気なく指標の事をパラメータと呼んでおりますが。
xとかyはパラメータとは言いませんか?
606デフォルトの名無しさん:2012/11/26(月) 22:19:52.28
こっちで聞いてこい

高校数学の質問スレPART343
http://uni.2ch.net/test/read.cgi/math/1352271573/

分からない問題はここに書いてね376
http://uni.2ch.net/test/read.cgi/math/1351434806/
607デフォルトの名無しさん:2012/11/26(月) 22:31:23.34
malloc()っていちいちNULLチェックするのめんどいね。
malloc()をラップして、NULLが来たらばassert()/exit()で落としていいかな?
assert()をリリースビルドした時に消えますーってツッコミとかはないしで
608デフォルトの名無しさん:2012/11/26(月) 22:37:53.89
#define free(a,b) (free(a->b),free(a))
609デフォルトの名無しさん:2012/11/26(月) 22:40:26.43
>>607
自分でも言っているように、assert()は無意味だね。
exit()はある意味ありだよ。
実際、そうプログラミングしている市販アプリも少なくないし。
610デフォルトの名無しさん:2012/11/26(月) 22:42:59.25
>>598
>全体は条件式じゃないよ
全体が条件式
条件演算子=三項演算子で、条件演算子を使った式が条件式。
611デフォルトの名無しさん:2012/11/26(月) 22:45:22.30
指標はバロメーターだろ。
612デフォルトの名無しさん:2012/11/26(月) 22:50:09.43
>>610
はずれ
613デフォルトの名無しさん:2012/11/26(月) 23:02:51.02
変数=variable
(仮)引数=parameter
614デフォルトの名無しさん:2012/11/26(月) 23:15:09.65
i=0;a=matrix[i][j];
for(b=1;b<=candidates_x;b++){
for(j=0;j<=votes_y;j++){
if(a=b){count++;}
}
printf("candidates%d=%d\n",b,count); count=0;
}
matrixの左端の縦の1列に格納される値が1の数、2の数を表示させるにはどうすればいいでしょうか
615 ◆QZaw55cn4c :2012/11/26(月) 23:20:27.98
>>605
高校数学では「パラメータ」は「媒介変数」、>>605 では t がパラメータと呼ぶにふさわしいのですが、プログラミングの世界では正直、まっとうな使い分けとかはないようです。
関数の実引数や仮引数を適当にパラメータと読んでいる感があります。
616 ◆QZaw55cn4c :2012/11/26(月) 23:23:46.50
>>613
引数は argument かと。
617デフォルトの名無しさん:2012/11/26(月) 23:25:11.47
の前に
if(a=b)
という謎物体があんぞ
618デフォルトの名無しさん:2012/11/26(月) 23:25:29.33
実引数=argument
619デフォルトの名無しさん:2012/11/26(月) 23:27:52.80
仮引数と実引数をargumentとparameterで使い分けるのは曖昧だけどね
620デフォルトの名無しさん:2012/11/26(月) 23:33:37.11
>>617
あああああああああああああああ

ありがとうございますorz
621614:2012/11/26(月) 23:36:39.57
>>620配列
3
2
2
1
なのに
全部0になりましたorz
622614:2012/11/26(月) 23:38:42.28
http://codepad.org/x5upRtZ3
全文です、orz
623デフォルトの名無しさん:2012/11/26(月) 23:53:51.80
>>613
X (仮)引数=parameter

O 仮引数=Dummy argument
O 実引数=Actual argument
624デフォルトの名無しさん:2012/11/26(月) 23:58:06.19
>>622
55行目、ループ制御変数を参照している行が何故かループの外にある。
だから、変数はスコープ内に閉じ込めた方がいいのだよ。
625デフォルトの名無しさん:2012/11/27(火) 00:01:10.44
なんでmatrixはint**ではなくdouble**なんだ?
626デフォルトの名無しさん:2012/11/27(火) 00:02:36.08
それ、もう何度も指摘されているのに直さないんだよな。
やる気ないなら死ねばいいのに。
627デフォルトの名無しさん:2012/11/27(火) 00:06:25.07
>>605
>変数とパラメータの違いって何ですか?

変数とパラメータとでは、目的が違う。

パラメータ
→システムの状態変更を指示、または測定結果を得るためのもの。
状態指示は例えば、図形の長さを10cmにするために、xLength=10としたりする。
また、"R"なら右へ行け、"L"なら左へ行けなどの方向を決めたりする。
状態を動的に変えたければ、変数(variable)を使うのが合理的。
目的に依っては、パラメータの値は固定でも良い。
測定結果を得るためには、大抵は変数を使う。

変数
→文字通り、固定の値では不都合な場合に使う。

ついで:
プログラムの複数箇所で同じ値(固定値)を使いたいことがある。(バッファ長とか)
目的から言えば、ソース中に固定値を書いても動くが、メンテナンスしにくくなる。
この回避のために、”変数であるが固定値として使う”やり方が
const int n = 123;
など。
628デフォルトの名無しさん:2012/11/27(火) 00:09:42.12
>>623
はずれ
629デフォルトの名無しさん:2012/11/27(火) 00:27:16.09
630:2012/11/27(火) 01:24:00.87
>>624
ありがとうございます、
if内に入ってないみたいでforのブロック内にいれてみたけど
だめでした、
>>625
すみません、データ型自体あまりわかっていませんでした、なぜprintf("%c ",(int)matrix[i][j])
が%cになるかもよくわかりません
>>629
そうです、苦しんで覚えるC言語のサイト読んでたりした時間もありますが
4日やって自分でできたとこなんて>>622のl55〜60ぐらいです、それもできてなかったけど
もうなんにもできねえ、、、、、
631:2012/11/27(火) 01:28:09.38
でもc言語勉強してると時間経つのはえぇぇ
とおもったら勉強してるんじゃなくて、どうしたらいいか、考えるのが時間経つのが早いのかおやすみなさい
632デフォルトの名無しさん:2012/11/27(火) 04:59:01.90
>データ型自体あまりわかっていませんでした
過去形にするなよ。まるで、今はもう判っているみたいじゃないか。
633633 ◆SQWb1H7kW. :2012/11/27(火) 05:30:21.67
今年の 10 月から C 言語を学習しているものです。
分からないことがあるのでよろしければ教えてください。

コンパイルコマンド(?)の入力のしかたについて
ideone.com/9kwdqD

よろしくお願い致します。
634デフォルトの名無しさん:2012/11/27(火) 06:12:00.03
>>633
何がわからないのかわからない状態だと思うので最低限
必要な情報だけ書いてください。

・使っているCコンパイラ

これがわかればある程度はアドバイスできるはず。
635デフォルトの名無しさん:2012/11/27(火) 06:15:02.43
>>633
失礼、ideoneに質問の詳細が書いてあったのね。

http://allabout.co.jp/gm/gc/2962/

これでターミナルを開かないとだめだと思います。
Mac詳しくないんでほかの人の答えを待ってください。
636 ◆QZaw55cn4c :2012/11/27(火) 06:19:09.63
>>633
バックスラッシュは無視して、そのかわりに一行で全部続けて入力するのがわかりやすいと思います。
637デフォルトの名無しさん:2012/11/27(火) 07:42:11.59
スレ立てるまでもない質問はここで 122匹目
http://toro.2ch.net/test/read.cgi/tech/1351769173/620-

C言語に起因する問題のようだ。
638デフォルトの名無しさん:2012/11/27(火) 07:56:10.08
>>633
肝腎の、example.cの1行目でエラーと言っているのだけれど、その内容は?
問題のコマンド行自体はオプションに対するエラーしか起きていない。
639デフォルトの名無しさん:2012/11/27(火) 08:15:53.40
>>633
もしかして、//コメントを使ってないか?
640デフォルトの名無しさん:2012/11/27(火) 10:53:05.55
>>633
>/* ペースト時に改行されているとまずいとおもったので改行を取り除くと */
home-2:desktop home$ gcc example.c -ansi -pedantic -Wall -Wextra -Wstrict-prototypes &yen; -Wmissing-prototypes -Wmissing-declarations &yen; -fstrict-aliasing -Werror

&yen;が余分。


>example.c:1: error: expected identifier or ‘(’ before ‘/’ token
cc1: warnings being treated as errors

>>639の指摘のように、//コメントを使った時のエラーだね。
641デフォルトの名無しさん:2012/11/27(火) 12:54:31.02
>>612
何が「はずれ」?
642デフォルトの名無しさん:2012/11/27(火) 12:58:39.44
>>641
あちこちに同じ事書いてるアラシだから放置。
643デフォルトの名無しさん:2012/11/27(火) 12:58:59.63
1<1
1<=1
上記2つの真偽がわかりません
教えてください
理由も添えていただけると幸いです
644デフォルトの名無しさん:2012/11/27(火) 13:02:01.21
>>643
アセンブラちっくに説明すると、
「<」は左辺から右辺を引いた結果が負の数であれば真となる。それ以外は偽。
「<=」は左辺から右辺を引いた結果が負の数か、0であれば真となる。それ以外は偽。
645デフォルトの名無しさん:2012/11/27(火) 13:02:46.90
>>643
より厳密なことは数学いたに行って聞いたほうがいい
646デフォルトの名無しさん:2012/11/27(火) 13:05:23.95
>>644
ありがとうございます
とてもわかりやすいです
これですっきりしました
647デフォルトの名無しさん:2012/11/27(火) 13:08:07.77
いえいえ
648デフォルトの名無しさん:2012/11/27(火) 13:30:59.00
ぃぇぃぇ
649デフォルトの名無しさん:2012/11/27(火) 14:43:32.13
なんか礼儀正しくてワロタww
650デフォルトの名無しさん:2012/11/27(火) 17:18:25.18
乱数の設定について何ですが、
if(argc < 2) { // プログラムの引数が足りない場合
printf("Usage: %s [SEED_NUMBER]\n", argv[0]);
exit(1);
}
else {
srand(atoi(argv[1]));
}

これって一体何をしているんですか??
あと、引数が足りない場合とはどういうことなのでしょうか??
651デフォルトの名無しさん:2012/11/27(火) 17:29:42.76
codepadがしかばねのようなんだが、よくあるの?
>>622がみれにゃいの。
652デフォルトの名無しさん:2012/11/27(火) 17:41:43.87
>>650
とあるコマンドを引数なしで動かすと使い方が出るようにしている
UNIXぽさの演出
653デフォルトの名無しさん:2012/11/27(火) 17:47:12.76
>>650
randはsrandを実行しないと、実行するたびに同じパターンの乱数を生成するので、
srandに毎回違う値を渡して実行しないとダメ。このへんはrand, srandでggrks。
argcはプログラムを実行した時のコマンドライン引数の個数が格納される。
コマンドラインで
>sample.exe ……………@
と実行すると、argc=1, argv={ "sample.exe" } が格納され、
>sample.exe 12345 ……A
と実行すると、argc=2, argv={ "sample.exe", "12345" } が格納される。

よって、引数がたりない場合(@)は、自身の使用方法を以下のように表示してプログラムを終了(exit)する。
Usage: sample.exe [SEED_NUMBER]
引数が1個以上ある場合(A)は、srandに引数の値(文字列)を数値化したものを渡して乱数を初期化させている。
654デフォルトの名無しさん:2012/11/27(火) 19:02:49.82
【話題】 今後もっとも給料が下がる職業はコールセンターのスタッフやプログラマー。その月収は2万円?
http://uni.2ch.net/test/read.cgi/newsplus/1354001075/
655デフォルトの名無しさん:2012/11/27(火) 20:20:15.09
>>641
全体は条件式じゃないよ
656デフォルトの名無しさん:2012/11/27(火) 20:38:34.25
条件式っていうのは、3項演算子なら?の前の部分、if文ならカッコの中だな。
657デフォルトの名無しさん:2012/11/27(火) 21:03:11.05
C言語のビット論理演算子って不要にもほどがあるだろ
アセンブラでもないのに必要ないじゃんww
658デフォルトの名無しさん:2012/11/27(火) 21:09:56.40
>>657
お前にはC言語は不要だよ
馬鹿に念仏、必要ないじゃん

らくがき帳のウラに得体のしれないらくがきでも書いてろよ
659デフォルトの名無しさん:2012/11/27(火) 21:16:05.05
ローコストのPCで早く動かせるコードは価値がある。
世界はローコストPCで溢れている。
660デフォルトの名無しさん:2012/11/27(火) 21:31:15.95
#include <stdio.h>
int minarray(int data[], int from, int to)

{
   ここを埋める

}
//
int main()
{
int i;
int data[] = {1, 8, -3, -5, 2, -7, 4, 10, 5, 3};
int ans;
ans = minarray(data, 0, 9);
printf("%d\n", ans); /* -7 */
ans = minarray(data, 6, 9);
printf("%d\n", ans); /* 3 */
ans = minarray(data, 0, 2);
printf("%d\n", ans); /* -3 */
ans = minarray(data, 2, 3);
printf("%d\n", ans); /* -5 */
return 0;
}

関数に入った途端意味不明になった

from以上to以下の数値を配列から引っ張ってくるという動き
なんですがよくわかりません
661デフォルトの名無しさん:2012/11/27(火) 21:33:30.84
まだ昨日のif文で議論飛ばしてたのかよ
とプログラム上げた本人が言うのもなんだけど
662デフォルトの名無しさん:2012/11/27(火) 21:39:20.54
>>660
ちげー
添え字だよ
from to は添え字だよ
その添え字の範囲の中での最少だ
663デフォルトの名無しさん:2012/11/27(火) 22:10:15.08
"ちげー"とか”AUTO”って、どこのDQN用語?
664デフォルトの名無しさん:2012/11/27(火) 22:18:29.80
>>660
int i, min = data[from];
for ( i = from + 1; i <= to; ++i) {
if (min > data[i])min = data[i];
}
return min;
665デフォルトの名無しさん:2012/11/28(水) 01:42:09.52
hoge->hoge(x, y);
のような書き方のコードを見たのですが、C言語でこのような書き方はどうやれば出来るのでしょうか
調べるためのキーワードだけでも構いません。
上に書いたのは、うろ覚えで申し訳ないですがよろしくお願いします。
666デフォルトの名無しさん:2012/11/28(水) 01:46:26.11
関数ポインタを要素に持つ構造体
667デフォルトの名無しさん:2012/11/28(水) 02:26:06.32
アロー演算子
668デフォルトの名無しさん:2012/11/28(水) 02:50:24.75
>>666-667
ありがとうございました!
669デフォルトの名無しさん:2012/11/28(水) 19:12:19.83
>>664
ありがとうございます。
どうすれば、そういう発想ができるのでしょうか?
670デフォルトの名無しさん:2012/11/28(水) 19:47:08.59
場合分けが多いとき、間接コールの方が負荷が少ないからじゃね
671デフォルトの名無しさん:2012/11/28(水) 20:09:30.30
>>669
「c言語 配列 最大値」とか「c言語 配列 ソート」とかでggrks
基本的なアルゴリズムは触れておいた方がいいよ。
全部覚えられなくても、こんなやり方があるのかというのを知っているだけでも
発想の元ネタになる(というか、既存の処理を探してコピペで解決できる)
672デフォルトの名無しさん:2012/11/28(水) 20:16:47.06
>>669
>>664はオーソドックスな方法だと思う。
例えば、from=3、to=5の場合、最小値はdata[3]、data[4]、data[5]のどれかになる。
最小値(min)は事前には不明だから、取り敢えずmin=data[3]としてみる。
あとはminとdata[4]を比べて、min>data[4]なら、min=data[4]とする。
次にminとdata[5]を比べて、min>data[5]なら、min=data[5]とする。
つまり、
min=data[3];
if(min>data[4])min=data[4];
if(min>data[5])min=data[5];

だが3,4,5は偶々その値だっただけで、上記のようなソースにすると、他の値の場合に対応出来ない。
そこで変数iを設けて、
for(i=from+1;i<=to;i++){
if(min>data[i])min=data[i];
}

とやる。
C言語に慣れてきたら、『プログラマの数学』などのアルゴリズムの本も読んでみたらいいと思う。
673デフォルトの名無しさん:2012/11/28(水) 20:36:42.56
アルゴリズムなんて知らなくても、普通にちょっと頭を使えば>>664くらい自分で思いつくだろ
674デフォルトの名無しさん:2012/11/28(水) 20:43:49.49
なにその毒にも薬にもならない書き込み
675669:2012/11/28(水) 21:02:30.84
申し訳ありません、何分文系でアルゴリズム思考などてんで
苦手なもので
676デフォルトの名無しさん:2012/11/28(水) 21:05:57.95
>>669とか、こりゃかなり根深いんじゃねーの?

ここで答えてるヤツの殆どが
Cの教科書の例題とかやってるときに
>>664とかの方法がパッと思い浮かんだんだろ きっと

教科書とかのステップ通りにやっていって
順当に思いついたんだよ
教科書の著者もそれを期待してる
だからそこに例題をおいとく

それをやる方法の断片は教科書とかに大量に載ってるけど
その方法の思いつき方自体は、教科書とかには載っていない
載せれるわけがねーもん
存在しないから

大なり小なり
この手の発想・着想・思いつきは先天的なモンじゃね?
677デフォルトの名無しさん:2012/11/28(水) 21:39:57.63
経験だよ。全ては経験。
実践的な仕事の場で、納期に追われレビューで叩かれして
プログラムを組む。それでこそ経験値は上がる。
なんでかって言うと、「実践の場=問題渦巻く場」だからな。
大抵の問題はすぐに一通り経験できてしまう。

全くの素人が入門書やサイトの記事を読んだって
ハローワールド以上の経験値は得られないんだよ。
678デフォルトの名無しさん:2012/11/28(水) 21:43:20.18
>>676,677
教育否定のブラックですね、判ります。
679669:2012/11/28(水) 21:49:56.26
私がプログラミングの才能がないのはもう自覚しています。
そもそも数学的教養がないので土台無理な話です。
最悪な考えですが、少なくとも単位は取りたいと思っているので
頑張っている次第です。
680デフォルトの名無しさん:2012/11/28(水) 21:51:28.75
A〜Fは1ビットで、
a=DA
y=EB
c=FC
てな感じで二進数が3つの変数a,b,cに入ってて
二進数でABCDEFを得るのに、今はこうしてます
c<<4&0x20|b<<3&0x10|a<<2&0x8|c<<2&0x4|b<<1&0x2|a&0x1
これより短いか速いコードはありますか?もっとビットが増えるときは?
681デフォルトの名無しさん:2012/11/28(水) 21:53:24.95
しとらんだろ
682 ◆QZaw55cn4c :2012/11/28(水) 22:09:53.49
>>679
どんな分野にせよ、人になにかをしてただくために、1から手順を決めていくという場面がくるのではないでしょうか。取扱説明書を作るとか、いずれは人に指示をだすとか。
プログラミングは結局、計算機にしてもらう仕事の手順を定めることですから、これは対象こそ人ではないけれども、いずれ必要とされる能力・技能を今訓練しているということかと。
今ばらばらにならんだトランプをエースからキングまで順番に並べなおすとすれば、その方法を例えば6才の人間に説明するとすれば、どういう説明がいいだろうか?

そう考えるとプログラミングもあながち「文系」向けかもしれませよ。
計算機は、実際のところ計算とは関係ない作業に応用されることの方が多いとおもうのです。
683デフォルトの名無しさん:2012/11/28(水) 22:16:00.00
>>680
FEDCBAになってね?

本当に速さを追求したいなら、
FEDCBAとするのをあきらめて、FCEBDAで済ませられないか考えるか、
a, b, c にそれぞれ2ビット入れるんじゃなくて、
a1, a0, b1, b0, c1, c0にそれぞれ1ビット入れることを考える。

こんな小さな素片で議論するより、大局的に何をしたいか示した方がいいよ。
684デフォルトの名無しさん:2012/11/28(水) 22:45:23.42
>>683
せやな、ありがとう。
685デフォルトの名無しさん:2012/11/29(木) 00:32:53.35
>>680
http://ideone.com/8DsUaJ

俺が作るならこんなんだな
しかし何がしたいのかは良く分からん
686デフォルトの名無しさん:2012/11/29(木) 01:12:16.84
遅そうだな
687デフォルトの名無しさん:2012/11/29(木) 03:01:39.89
>>680
(a*68&72|b*34&36|c*17&18)>> 1ドヤァ
688633 ◆SQWb1H7kW. :2012/11/29(木) 03:14:47.93
>>634-640
遅くなりましたがありがとうございました。
gcc example.c -ansi -pedantic -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -fstrict-aliasing -Werror
で無事コンパイルできました。

下部にでているエラーは推察された通り // をコメントにつかっていることによるものです。
今習っている C は一応「古いもの」で、仕様しているコンパイラは「新しい」C に対応している様で
それを細かく確認する手段のひとつとして知りたかったのです。とても助かりました。ヾ(๑╹◡╹)ノ"
689デフォルトの名無しさん:2012/11/29(木) 03:40:37.46
>687ソノ線で行くなら
(c*20&36)|(b・・・なんじゃねーの?
690デフォルトの名無しさん:2012/11/29(木) 05:19:24.23
肩痛い
691デフォルトの名無しさん:2012/11/29(木) 08:10:59.84
↑放射能のせい
692デフォルトの名無しさん:2012/11/29(木) 09:40:53.35
知ってた
693デフォルトの名無しさん:2012/11/29(木) 15:55:19.12
ffmpeg関連のプログラミングスレってないの?
694デフォルトの名無しさん:2012/11/29(木) 16:06:40.59
うん
695デフォルトの名無しさん:2012/11/29(木) 21:17:18.24
あいう,10,かきく,20

↑のような文字列を %s,%d,%s,%d みたいな感じで分割して変数に入れる関数が
あったような気がするんですが思い出せないので教えてください
696デフォルトの名無しさん:2012/11/29(木) 21:18:32.55
strtokじゃないやつです追記すいません
697デフォルトの名無しさん:2012/11/29(木) 21:24:10.62
fscanfでした自己解決しましたすいません
しかもこれファイルからだしなんかいろいろひどい質問でしたごめん
698デフォルトの名無しさん:2012/11/29(木) 21:27:40.71
sscanf();もある。
ただし、区切り文字は「,」ではなく半角SPで
699デフォルトの名無しさん:2012/11/30(金) 00:54:19.72
区切り文字「,」もできるでしょ
700デフォルトの名無しさん:2012/11/30(金) 00:59:04.24
それはどうかな
701デフォルトの名無しさん:2012/11/30(金) 02:11:43.97
半角SPも「,」も出来るようだ
ttp://ideone.com/2H33wu
702デフォルトの名無しさん:2012/11/30(金) 02:15:16.78
>>701
文字列混じりだと、半角Spaceでなければならない
http://ideone.com/1d2xeg
703デフォルトの名無しさん:2012/11/30(金) 06:36:35.65
>>702
%[^,]を使え。
704547:2012/11/30(金) 14:39:37.98
>>622
http://ideone.com/SvDNar
前に提示したソースで、matrixjへの格納がx列・y行になってました。すみません。
色々直してソース中にコメント入れてます。
ただ、プログラムの目的・仕様が不明なので(候補者数・投票者数とファイル内容の対応が分からなかった)、頓珍漢な可能性大ですw
一応、入出力の結果は以下の通り、左端の投票数(?)を出しています。
候補者数と投票者数を入力 >4 3
3 2 1
2 1 3
2 1 3
1 2 3
candidates1=1
candidates2=2
candidates3=1
candidates4=0
705デフォルトの名無しさん:2012/11/30(金) 16:30:06.10
>>704
以下エスパー。
数字は候補者番号。
1行が投票者1人分の投票データ。
706デフォルトの名無しさん:2012/11/30(金) 17:18:53.80
int main(void)
{

int i = 1;

while(i){
printf("整数を入力してください。\n");
scanf("%d",&i);
printf("%dが入力されました。\n",i);
}
printf("繰り返しが終わりました。\n");

return 0;
}

条件式は
while(i != 0)
でも変わらないのであえて省略するとわかりづらいでしょうか
707デフォルトの名無しさん:2012/11/30(金) 17:33:06.25
>>706
1.iにtrueが入る処理なら、while(i)
2.iが0以外で処理続行なら、while(i != 0)
706の例は2。
708デフォルトの名無しさん:2012/11/30(金) 18:22:52.51
この規模ならどっちでもいいと思いまーす
ソース読解力がなくていつも残業してる僕ですらぱっと見でわかりますし。
んで条件式が複雑になったり、条件に使用している要素の変更条件が複雑だったり、whileブロックが1画面越えるようなら分かりやすく書いたほうがいいと重いマース
でもこの程度の差分でどっちにしようか迷うなら、分かりやすいほうにしとけばいいと思いまーす
709デフォルトの名無しさん:2012/11/30(金) 19:01:54.05
>>708
俺のことをバカにしたいのは分かった
710デフォルトの名無しさん:2012/11/30(金) 19:08:16.71
重箱の隅をつつくなら
ゼロは整数
711デフォルトの名無しさん:2012/11/30(金) 19:15:37.86
いつも仕事場に泊り込んでいる>>709
712デフォルトの名無しさん:2012/11/30(金) 20:31:49.31
>>711
ゲームなのかITなのか
713デフォルトの名無しさん:2012/12/01(土) 01:11:55.57
明日朝から月曜朝まで泊まり込みが確定した。鬱だ
今日は早く帰ってきたから早く寝よう
714デフォルトの名無しさん:2012/12/01(土) 22:01:47.53
俺も泊まり
仕事はやくなりてーよ
715デフォルトの名無しさん:2012/12/01(土) 23:08:29.88
質問です。
gccとmakeで開発しています。C++でなくCの範囲での開発です。

適切な値が代入されないまま、関数ポインタによる呼び出しが行われてしまうのを
回避する方法を探しています。
以下に例を示します。
716715:2012/12/01(土) 23:10:35.75
struct handlers {
 void (*handler_1)(int);
 void (*handler_2)(int, char);
 // ここに追加(1)
};

int main()
{
 struct handlers obj[10];

 //構造体メンバを初期化する何らかの処理←ここの修正をし忘れる
 (*obj[1].handler_1)(1);
 (*obj[1].handler_2)(1, '2');
 // ここに追加(2)
}
717715:2012/12/01(土) 23:12:37.74
問題は、handlers構造体の仕様を変更、特にメンバを追加したときです。
上記のソースコードに、(1)構造体宣言にメンバ(関数ポインタ型)を追加し、
(2)main()内に呼び出し文を追加、
するところまでは良いのですが、ここでプログラマがミスをして、
新たに追加されたメンバを初期化するコードを書き忘れたとします。
コンパイルは成功してしまい、プログラム実行時に異常が発生してしまいます。

追加メンバ分の初期化コードの書き忘れを、C言語の範囲内で、
コンパイラのエラーや警告で検出する方法はないものでしょうか?
ただし、プログラム実行時のチェックによる方法は不可とします。
718デフォルトの名無しさん:2012/12/01(土) 23:17:10.56
つまりはコンストラクタの代替物がほしいのか?
719デフォルトの名無しさん:2012/12/01(土) 23:20:14.16
「構造体の一部の領域を書き換えていないときに、コンパイルエラーを出す方法は無いか」
という質問じゃないか?
720715:2012/12/01(土) 23:23:16.20
純粋仮想関数をC言語で実現できないか、とも言い換えられるかもです。
721デフォルトの名無しさん:2012/12/01(土) 23:28:42.18
実行時チェックがイヤなら、プリプロセッサみたいなので字面を解析するしかないっぺ
722715:2012/12/01(土) 23:39:32.78
同じマクロを使って、構造体宣言とメンバ初期化関数(コンストラクタ)とを生成する方法を試しましたが
「;」はマクロのパラメータにできたのですが
「,」(コンストラクタの引数リストにしてコンパイラに警告を出させる)
は不可で断念しました。他にも初期化子{}を使う方法も試したのですがダメです。

makeでプリプロセッサ通させるという方法はよさげです。
どうもありがとうございました。
723デフォルトの名無しさん:2012/12/01(土) 23:44:45.43
構造体の定義とメンバの初期化に必ず専用のマクロを使うみたいに決めておけば、
比較的簡単に初期化忘れをチェックできるような気がする。
724デフォルトの名無しさん:2012/12/01(土) 23:49:29.43
わざわざ解析してまで調べたいのか・・・
それなら既存のソース解析ツールとかで引っかからないのかね
725715:2012/12/02(日) 01:34:30.32
gccのオプション-Wallで有効にならない警告オプションの
 -Wmissing-field-initializers
を付ければ>>722でダメだったと言っている{}を使う方法で大丈夫そう?な感じです。

void func_1(int); //どこかで定義
void func_2(int, char); //どこかで定義
struct handlers org = { func_1, func_2 }; //←構造体にメンバを追加すると警告。-Wallだけだとパス
...
obj[1] = org;

いろいろアドバイスありがとうです。
726デフォルトの名無しさん:2012/12/02(日) 03:05:31.47
・構造体の全てのメンバーにハンドラーを設定する

という関数を作れば引数としてハンドラーが必要になるから
代入忘れはなくなるんじゃないの?
727デフォルトの名無しさん:2012/12/02(日) 09:34:23.98
という関数に引数追加するのを忘れたり、関数の中で代入し忘れたりするからダメだろ。w
構造体の定義からその関数を自動生成するなら可能だが。
728デフォルトの名無しさん:2012/12/02(日) 09:55:30.77
ものすごく原始的で頭の悪い方法をとってるようにしか見えない。
そもそもハンドラーってダイナミックに差し替えるようなものか?
初期化処理で一気に設定して終わりみたいな性格のものだと
思うんだけど。
729デフォルトの名無しさん:2012/12/02(日) 10:17:18.12
http://gyazo.com/1f68396e1a9772f20c2d0bf608c039b6

こんな風に、計算式を組む上で出てくる可能性のある括弧を出して、それぞれ配列に入れ込みたいのですがいい方法はないでしょうか。
730デフォルトの名無しさん:2012/12/02(日) 10:24:41.44
>>729
C言語の問題じゃないなぁ。データ構造もよく判らんし、もっと汎用のスレでやりたいことをきちんと説明してみてはどうだろう。
731デフォルトの名無しさん:2012/12/02(日) 10:24:44.15
そういうの
小町山やらfour forsでやったことあるな
732デフォルトの名無しさん:2012/12/02(日) 10:25:03.26
int array[X][Y];
とかして、右括弧なら array[x][y]++;、左括弧なら array[x][y]--;
とすれば良いのでは?
733デフォルトの名無しさん:2012/12/02(日) 10:25:31.52
というわけで超ヒント
群になる
単位減は何もカッコをつけないE
734デフォルトの名無しさん:2012/12/02(日) 10:26:23.12
>>727
引数忘れたらコンパイルエラーになるし、関数の定義は一度しかやらないから
そこだけ気をつければいい。

リスクは発生確率と一緒に考えないとね。

まあ、ごちゃごちゃ言う前に単体テストをしっかりやれば済む話だと思うが…

>>728
それは、案件次第。
735デフォルトの名無しさん:2012/12/02(日) 10:43:20.01
>>729
逆ポーランド記法が参考になるかも。
736デフォルトの名無しさん:2012/12/02(日) 11:01:26.18
>>729
”(”と”)”の組み合わせ全てから、矛盾する(数がアンバランス、途中で右括弧が多すぎる)ものを除外。
737デフォルトの名無しさん:2012/12/02(日) 11:18:35.57
>>734
あほ、構造体の関数ポインタメンバーが追加になるたびに修正が発生する。
その時の修正漏れを検出するのが目的だ。お題を理解できないバカは引退しろ。
738685:2012/12/02(日) 12:30:05.09
while(){い
for(b=1;b<=a;b++){ for(){if(){}}
else{
for(){ while(){}}あ}

if(){}
}
といった文であの中にはいるといに戻りたいんですができるでしょうか?
戻りかたをおしえてください
739デフォルトの名無しさん:2012/12/02(日) 12:31:14.17
>>738
名前はミスですmm
740デフォルトの名無しさん:2012/12/02(日) 12:36:08.99
>>738
その例なら
continue;
741デフォルトの名無しさん:2012/12/02(日) 12:36:47.71
ちゃんと改行しろや
見づらすぎる
742740:2012/12/02(日) 12:42:43.46
>>738
括弧の対応があっていないな。
continue;は撤回だ。

それと、「あ」「い」とかやめてくれないかな。
> といった文であの中にはいるといに戻りたいんですができるでしょうか?
だと文章と混じって頭で分解する無駄な手間がある
「☆」「★」とか、いかにもコードに使わない目印にしてほしい。
743デフォルトの名無しさん:2012/12/02(日) 12:44:22.27
何様だ
質問をくれてやってるんだからありがたく頂戴しろ
文句ばっかり垂れやがってカスが
744デフォルトの名無しさん:2012/12/02(日) 12:48:01.92
質問が不完全です。
訂正してか再度よろしくお願いします。
745デフォルトの名無しさん:2012/12/02(日) 12:48:32.71
笑えるw
746デフォルトの名無しさん:2012/12/02(日) 12:50:19.13
goto; を使えばどこにでもジャンプできるさ
747デフォルトの名無しさん:2012/12/02(日) 13:06:55.95
Yes! We can fly!
748デフォルトの名無しさん:2012/12/02(日) 13:25:19.56
余談だけど、以下の例。

int main()
{
int i;

for (i = 0; i < 10; i++) {
LOOP:;
if (i < 100) {
//continue;
goto LOOP;
}
}
}

この場合、
・continue だ i++ が行われる (10回でループを抜ける)
・goto を使うと i++ が行われない (無限ループ)
ので、注意
749デフォルトの名無しさん:2012/12/02(日) 13:26:37.61
× > ・continue だ i++ が行われる (10回でループを抜ける)
○ > ・continue だと i++ が行われる (10回でループを抜ける)
750デフォルトの名無しさん:2012/12/02(日) 13:33:23.52
case a of
1 : begin

End;
case b of
1: begin
end;
でなぜか定数式が必要ですと言われるのですが、、、
751デフォルトの名無しさん:2012/12/02(日) 13:37:44.90
>>750
C言語に見えない
752デフォルトの名無しさん:2012/12/02(日) 13:42:43.98
これ何だろ
vbに似てるけど違うしな
753 ◆QZaw55cn4c :2012/12/02(日) 14:09:08.88
>>747
in other words, ... Fly me to the moon !
754デフォルトの名無しさん:2012/12/02(日) 14:20:34.19
いあなわああぁあああいらああああゔゅうううううぅ
755デフォルトの名無しさん:2012/12/02(日) 14:23:46.19
>>752
知ってる言語の中だと Pascal に近いけど、まあスレ違いだな。
756デフォルトの名無しさん:2012/12/02(日) 14:54:20.86
あ〜あ
757デフォルトの名無しさん:2012/12/02(日) 15:18:28.11
これからC言語を勉強しようと思ってるんですが、有効な勉強法や覚えるコツなどオススメなものがあったら教えていただきたいですm(__)m
758デフォルトの名無しさん:2012/12/02(日) 15:19:15.63
>>757
構文覚えたらなんでもいいからたくさん作れ
759デフォルトの名無しさん:2012/12/02(日) 15:21:01.92
>>757
ちいさなことでいいから書け!
760デフォルトの名無しさん:2012/12/02(日) 15:24:20.13
>>757
Cを学ぶ強い動機がない人が
独学をしても三日で挫折する。
大学の情報工学関連の学部に入ってみなさい。
死ぬ思いをして4年間課題をこなせば嫌でも身につくよ。
761デフォルトの名無しさん:2012/12/02(日) 15:28:56.74
>>758>>759>>760
レス感謝です。

自分27歳で知識0の状況から勉強するつもりなんだけど無謀かな?
762デフォルトの名無しさん:2012/12/02(日) 15:31:34.08
>>761
別に、そんなに覚えること多くないし
763デフォルトの名無しさん:2012/12/02(日) 15:31:53.21
無謀かどうかは本人次第だから、なんとも言いがたいけど、
何でまた 27歳にもなってCなんかにかかわろうと思ったんだ?
764デフォルトの名無しさん:2012/12/02(日) 15:38:24.22
>>763
転職したくてねー。

今は全く畑違いの仕事してるんだけど、プログラム関係の仕事でどうしても入社したい会社があるから20代のうちに勉強しとこうかと思って。
未経験歓迎な求人だけど、ある程度下地くらいはあった方がいいよね?
765デフォルトの名無しさん:2012/12/02(日) 15:38:32.48
俺は17だたつた10ねんしか違わない
766デフォルトの名無しさん:2012/12/02(日) 15:40:40.60
そうなると話は別だ
書くなら今すぐ書けそうでないなら帰れ
767デフォルトの名無しさん:2012/12/02(日) 15:47:12.71
だからこれから休日・休憩時間・通勤時間・就寝前フルに使って猛勉強するつもりだ。

ちなみに工業高校卒業したときのポケコン(シャープP-850S)が家にあるんだけど、あれってC言語書けたりするの?
768デフォルトの名無しさん:2012/12/02(日) 16:06:13.68
>>738
@そもそもループが多重になるような記述は避ける
 (意味のある関数を作って分ける、縦に並べて処理するなど。せいぜい2ループまで)
Aループの構造を変更し、条件一致=ループの繰り返しではなく
 条件一致=関数終了(return)となるように工夫する(可能であれば)
Bどうしてもというなら↓みたいにするしかない

int loop = 0;

while(){
  for(){
    while(){
      if(a==1){
        loopbreak = 1;
        break;
      }
    }
    if (loopbreak) {
      break;
    }
  }
}

みんなgotoとか使ってるの?
769デフォルトの名無しさん:2012/12/02(日) 16:09:54.09
>みんなgotoとか使ってるの?
限りなく露骨に使うhttp://ideone.com/ycqqcm
ループではやらん
770デフォルトの名無しさん:2012/12/02(日) 16:11:48.58
>>764
javaからがいいんでない?
Cを仕事で使う機会って最近は限られてるよ。
組み込み、unix、ios(objective-c)他なんかあるかね・・・
javaならオブジェクト指向プログラミングの基礎にもなるし、他の言語に通ずるとこ多いから
771770:2012/12/02(日) 16:18:19.82
>>764
あと未経験歓迎なら勉強する前にすぐ行ったほうがいいと思うよ
若いうちというのは将来を買われるもんだから、見込みがあれば雇ってもらえる
年をとったら何をしてきたってのが重要視されるから「勉強してました」ってのはきついと思う
どっかで経験つんどかないとね
772デフォルトの名無しさん:2012/12/02(日) 16:18:21.44
goto避けて見苦しくなるくらいならgotoつかって素直に書くは
773デフォルトの名無しさん:2012/12/02(日) 16:25:48.52
多重ループの脱出とエラー処理にのみ使ってよいと決まっている
774768:2012/12/02(日) 16:48:47.85
マジかよこれからそうするわ
775デフォルトの名無しさん:2012/12/02(日) 17:07:18.00
>>764
う〜ん、ちょっとマジレスすると、プログラマーって儲からないよ。

あと、プログラムは学生さんでも環境そろえるのは容易だから、
その手の会社に来るような人は若いうちからやってることが多い。
なので、下地の量にかなり差があると覚悟していた方がいい。

また、C言語を学ぶのは >>762 が言うようにそんなに難しくない
けど、プログラミングにおいて言語の知識はそんなに重要じゃない。
それ以外の設計書などを書くための文章力や、どういうものを作
るかを知るための会話力、作りたいものを論理的に構成する能力
等が重要。

そういう覚悟が出来ているなら、頑張って欲しい。

言語とかの疑問なら、ここで質問すれば何とかなると思う。

>>767
ポケコンでやるのはお勧めしない。
新聞広告に載ってる DELL とかの PC とか、中古のPCでいいから
PC でやるべき。能率が全然違う。
776デフォルトの名無しさん:2012/12/02(日) 17:39:06.76
時間は買えるなら買ったほうがいいことが多い
趣味なら寄り道もアリだが
777デフォルトの名無しさん:2012/12/02(日) 18:49:11.73
http://codepad.org/xshbtSpI
for(c=0;c<m;c++){
printf("zyogai[%d]=%d\n",c,zyogai[c]);}
for(c=0;c<m;c++){
for(j=0;j<retu;j++){
for(i=0;i<gyo;i++){
while(matrix[i][j]==zyogai[c]){
for(j=j+1;j<retu;j++){
matrix[i][j-1]=matrix[i][j];}}
}}}
matrix[i][j]の全ての要素からzyogai[c]に格納された全ての値を削除
したいのですがどうすればいいでしょうか・・・
778デフォルトの名無しさん:2012/12/02(日) 18:52:49.68
>>777
2重ループで全部比較して、trueだったら削除するとか
あとは、なんか配列の中に同じ物があったらーって関数があった気がする
779デフォルトの名無しさん:2012/12/02(日) 19:20:32.74
>>777
どうでもいいけど { } の閉じ方がLispみたいだな
780デフォルトの名無しさん:2012/12/02(日) 19:37:47.74
>>777
汚すぎる
他人に見せて良いコードじゃねえ
781デフォルトの名無しさん:2012/12/02(日) 20:16:21.91
……これまでの流れからいって
社会学部の人が卒論か何かで投票の数理解析をやっている、
そう思いたい

いろいろツッコミどころがあるけど
一番の問題は
この手の初心者に与えるべき適当な教科書の欠如だ

そしてそもそもCでやるべきなのか、
そのあたりの判断も、初心者だからできる訳もない

これはかなり珍しい事例で、
高度な初心者がプログラミングをやるとどうなるか、
それがわかった

対処法としては教科書読むか教えてもらうしかない
教科書読むなら一冊読んだ後に
学校やらの図書館で入門と銘打ってるのを5冊ほど同時に読め
それを三週間ほどでやる
782768:2012/12/02(日) 20:22:40.82
C/C++の宿題片付けますスレに持っていった方がいいんじゃないか?
自分でやるにしても基本くらいは押さえないとね
質問するにもせめて読みやすくして欲しいね
783デフォルトの名無しさん:2012/12/02(日) 20:30:49.76
>>777
スレ立てるまでもない質問はここで 122匹目
http://toro.2ch.net/test/read.cgi/tech/1351769173/894
とマルチ?
784デフォルトの名無しさん:2012/12/02(日) 22:23:47.38
とりあえず、
全部終わったらやさしく学べるC言語入門
基礎から数値計算入門まで

とかいうのおわらせよう。。いろいろな勉強の中でプログラミング
が一番時間が経つのを早く感じる程持続できるということを知ったし
遅すぎるOTZいつもなにもかも遅い、
785デフォルトの名無しさん:2012/12/02(日) 22:50:29.65
適性があればあっという間に追いつくさ
逆に何年かけてもダメな人もいる
786デフォルトの名無しさん:2012/12/03(月) 10:01:43.06
いるね
787デフォルトの名無しさん:2012/12/03(月) 11:02:34.85
趣味ならタイムリミットは死ぬまでだよ!
788デフォルトの名無しさん:2012/12/03(月) 14:49:06.43
データの先頭から5〜10バイトの範囲を別の変数にコピーする、みたいなことができる関数ってありますか?
789デフォルトの名無しさん:2012/12/03(月) 14:50:29.31
memcpy()
790デフォルトの名無しさん:2012/12/03(月) 14:52:36.38
memcpyってコピー元の範囲指定ってできなくない?
791デフォルトの名無しさん:2012/12/03(月) 15:05:37.62
なにをおっしゃってるの?
792デフォルトの名無しさん:2012/12/03(月) 15:25:34.00
「コピー元の範囲」という考え方がそもそも間違い。

コピー元開始アドレス、コピー先開始アドレス、コピー範囲

あるのはこれだけ。
793デフォルトの名無しさん:2012/12/03(月) 15:57:16.08
>>788
memcpy(別の変数, データの先頭 + 5, 10 - 5 + 1)
794デフォルトの名無しさん:2012/12/03(月) 16:18:07.54
実はビットと勘違いをしているとか。エスパーしてみる。
795デフォルトの名無しさん:2012/12/03(月) 17:18:58.60
>>794
別の変数 |= (データの先頭 >> 5) & ((1 << (10 - 5 + 1)) - 1)
796デフォルトの名無しさん:2012/12/03(月) 22:33:18.61
include<stdio.h>

int main(void)
{
int data[10];
int i;
int d;
int sum=0;


printf("数値を10個入力してください\n");

for(i=0;i<10;i++)
{
scanf("%d",data[i]);
}

for(d=0;d<10;d++)
{
sum=data[d]+sum;

}
printf("%d",sum);
return 0;
}

すいません、何故これで合計が出ないのか教えてください。
10個配列に入力した分の合計がでません、エラーがでます
797デフォルトの名無しさん:2012/12/03(月) 22:35:54.71
#とスペースかも
798デフォルトの名無しさん:2012/12/03(月) 22:41:22.35
すいません#はコピーミスでしたが
自己解決しました。
799デフォルトの名無しさん:2012/12/03(月) 22:42:23.42
>>796
scanf &
800デフォルトの名無しさん:2012/12/03(月) 22:45:42.48
>>796
そうでした、ありがとうございます
801デフォルトの名無しさん:2012/12/03(月) 23:25:04.59
>>796
sum=data[d]+sum;

sum += data[d];
とした方がカッコいい
802デフォルトの名無しさん:2012/12/03(月) 23:26:02.48
そもそもカウンタのdは必要ない
803デフォルトの名無しさん:2012/12/04(火) 08:13:25.46
配列に入れる必要もないが、まあ題意なのだろう
804デフォルトの名無しさん:2012/12/04(火) 14:27:26.23
va_listを配列に変換するにはどうすればよいですか?
805デフォルトの名無しさん:2012/12/04(火) 15:24:23.44
va_arg
806デフォルトの名無しさん:2012/12/04(火) 21:52:25.36
本で以下のコードを見たのだけど
whileでこんな文法成り立つの?
カンマ演算子って何でもありで恐すぎ><

while (ch = getchar(), isdigit(ch))
807デフォルトの名無しさん:2012/12/04(火) 21:58:01.95
なんで本に書いてあることが成り立つかどうかなんて疑問がもてるの?
808デフォルトの名無しさん:2012/12/04(火) 22:04:19.70
sizeof(array) / sizeof(int) なんで、これで配列の長さが分かるんですか?
配列arrayは最後のアドレスを持っていないのに
809デフォルトの名無しさん:2012/12/04(火) 22:22:45.81
>>806
for 文では結構カンマ演算子を使うようです。
for (p = a, q = b; *p; p++, q++) { }

たしかにカンマ演算子の自由奔放はアレですね。こんな遊びまでできてしまいます。
カンマ演算子の優先順位はきわめて低いところが陥し穽ですが。http://toro.2ch.net/test/read.cgi/tech/1313183984/594
810デフォルトの名無しさん:2012/12/04(火) 22:28:16.80
>>808
配列を宣言すれば、コンパイラはその配列の長さ(大きさ)を知っています。sizeof(array)をコンパイラが解釈(評価)する時点で、その大きさをきめうちにできます。
http://ideone.com/Olruu8
プログラム実行時に配列の大きさが計算されるわけではありません。
811808:2012/12/04(火) 22:33:50.16
>>810
レスありがとうございます。

>配列を宣言すれば、コンパイラはその配列の長さ(大きさ)を知っています。
つまり、シンタックスシュガー程度に考えていればいいということでしょうか?
812デフォルトの名無しさん:2012/12/04(火) 22:48:35.81
コンパイル時にサイズが決まっていない配列でもうまくいくよ

まぁ、実行時にその配列がどう宣言されたか覚えておけばいいだけの話だけど
813デフォルトの名無しさん:2012/12/04(火) 23:30:54.68
> コンパイル時にサイズが決まっていない配列

ってどんなの?
814デフォルトの名無しさん:2012/12/04(火) 23:31:42.25
C99のアレか
815デフォルトの名無しさん:2012/12/04(火) 23:36:54.56
そうアレ
こんなの

void foo(int s)
{
int a[s];
printf("%d\n", sizeof(a));
}
816デフォルトの名無しさん:2012/12/05(水) 00:01:51.56
いったいどんな実装なんだろう‥‥‥
817デフォルトの名無しさん:2012/12/05(水) 00:05:25.28
そら実行時に求めるしかないでしょ。
818デフォルトの名無しさん:2012/12/05(水) 00:08:54.03
ANSI Cだとコンパイル時にサイズが決まったものしかsizeofできない
リンク時ではなくコンパイル時なので、配列が違うファイルにあるときに
extern a[];
a_size = sizeof(a);
みたいなこともできない
819デフォルトの名無しさん:2012/12/05(水) 00:15:27.56
それはC99でも出来ないのでは。
820デフォルトの名無しさん:2012/12/05(水) 00:16:48.37
>>811
もしかして、Cでは配列名=配列の先頭要素のアドレスだから
配列全体のサイズが求まるのはおかしいって話?
それに対しては、sizeofに配列名を渡した時は例外だという回答になる。
専用要素ではなく、配列全体のバイト数が計算される。
821デフォルトの名無しさん:2012/12/05(水) 01:17:10.45
コード上の記述がコンパイル時に意味をなすのか実行時に意味をなすのか、
それを判断すれば難しいことはない。

ANSI C(? C99は知らない)だと
char a[1000];
でsizeof(a)は1000という即値に変換されてコンパイルされる
(と俺は解釈している)
822デフォルトの名無しさん:2012/12/05(水) 06:46:53.58
>>806
そういう書き方もできるけど例としてそんなのを出す本は焼き払うべき。
823デフォルトの名無しさん:2012/12/05(水) 08:17:19.59
>>822
それはどうか?
むしろ while () が特異であんまり活用できないことのほうが多いような気が。
ループ継続条件をワンステップでかけずに、最悪 for(;;) { ... if () break; } になってしまうことも多々あるのでは?
824デフォルトの名無しさん:2012/12/05(水) 08:28:01.42
,演算子はわかりにくい。特に関数引数のセパレーターと誤視しやすい。
>>806だったら
while (isdigit(ch = getchar()))
の方がまだまし。

今時isdigitがマクロな処理系なんて生き残ってない。
825デフォルトの名無しさん:2012/12/05(水) 08:31:34.99
引数に副作用のある式を書く男の人って……
826デフォルトの名無しさん:2012/12/05(水) 08:34:20.55
>>823
whileが特異って?forとどう違うの?
827デフォルトの名無しさん:2012/12/05(水) 08:41:36.07
>>825
副作用のある式を,でつなげるより「マシ」って事だ文脈読もうな。
828デフォルトの名無しさん:2012/12/05(水) 08:50:19.92
> 副作用のある式を,でつなげるより「マシ」って事だ文脈読もうな。

カンマにそれ以外の用途はないから
829デフォルトの名無しさん:2012/12/05(水) 10:00:50.76
評価順序が不定だったりマクロかどうかわからない引数に
副作用のある式を書く習慣はつけさせない方がいいよ。
それより、評価順序を明示できる , を使うべき。
もちろん、「文」の文脈なら ; でつなげばいいよ。
830デフォルトの名無しさん:2012/12/05(水) 10:06:23.78
>>824
>今時isdigitがマクロな処理系なんて生き残ってない。

普通にあるんじゃね?
831デフォルトの名無しさん:2012/12/05(水) 10:16:02.20
>>828
ああ、そのとおりだな。副作用のある代入式としてくれ。

>>839
ANSI Cではfunctionであることが要求されてるけど。
832デフォルトの名無しさん:2012/12/05(水) 10:26:58.08
カンマでつなげたり引数を文にするくらいなら、無限ループをifでbreakするほうがマシだろ
833デフォルトの名無しさん:2012/12/05(水) 10:50:57.88
isdigitが関数であることが確実だとしても、
その習慣をもってると他でつまづくよ
834デフォルトの名無しさん:2012/12/05(水) 11:02:25.91
手近のgccだとこんな風になってた

#define isdigit(c) __isctype((c), _ISdigit)
#define __isctype(c, type) ((*__ctype_b_loc ())[(int) (c)] & (unsigned short int) type)

最終的に関数呼び出しにはなってるだろって言うならその通りだけど。
835デフォルトの名無しさん:2012/12/05(水) 12:47:49.66
誰にでも平易に理解できるコードに書き直すのが大前提だろう。
836デフォルトの名無しさん:2012/12/05(水) 13:26:15.55
分かりやすいのが一番。やっぱりカンマ方式が無難だろうな
837デフォルトの名無しさん:2012/12/05(水) 13:29:21.93
カンマで括弧の中に詰め込むんじゃなくて、同じロジックで
1行ずつ処理する形にできる。while(){}でやろうとしているが
do-whileに書き直しても良いし方法なんざいくらでもある。
何でもかんでもごちゃごちゃと詰め込むのはCの悪癖だな。
838デフォルトの名無しさん:2012/12/05(水) 18:06:38.58
コードゴルフでもやんない限り使わなくていいね
839デフォルトの名無しさん:2012/12/05(水) 19:22:19.01
ソケット通信のプログラムで、pthreadを用いて送信スレッドを作ってデータを送っています
writeで送信をしている途中でフラグが立ったらスレッドをサスペンドさせ、降りたらレジュームするようにしたいのですが
どのようにしたらいいでしょうか?
840デフォルトの名無しさん:2012/12/05(水) 19:28:58.46
条件変数でも使うんじゃね?
841デフォルトの名無しさん:2012/12/05(水) 19:58:27.61
プロトコルは相手あってのものだから、どういうシーケンスで
送信途中の停止と再開を扱うかによって実装が変わる。
842デフォルトの名無しさん:2012/12/05(水) 20:01:34.03
そういう話なの?
843デフォルトの名無しさん:2012/12/05(水) 20:10:08.48
誰がフラグの上げ下げするの?
844デフォルトの名無しさん:2012/12/05(水) 20:19:55.01
帯域が限られている回線で、今送信しているデータよりも優先して送信されるべきデータが発生した場合に
一旦送信スレッドをサスペンドさせ、優先データを送り終えたあとに再びレジュームするような仕様にしたいです
フラグの上げ下げは、スレッドを生成する元の関数内で行おうと考えています
845デフォルトの名無しさん:2012/12/05(水) 20:22:10.17
OOB使うの?
846デフォルトの名無しさん:2012/12/05(水) 20:24:51.95
そのフラグ見てればいいんじゃないの?
847デフォルトの名無しさん:2012/12/05(水) 21:35:01.52
10〜20の間という条件式を書く時は、

tmp >= 10 && tmp <= 20
10 <= tmp && tmp <= 20

のどっちがいいですか?
自分は下の方が好きなのですが、今読んでる本だと上の書き方なのでそっちがいいのかなと
848デフォルトの名無しさん:2012/12/05(水) 21:37:21.34
オレは下のほう
849デフォルトの名無しさん:2012/12/05(水) 21:41:54.19
基本は変数が左だけど、範囲だと例外的に下にしちゃうかな
要は、パっと見てわかりやすい方を選ぶべき
850デフォルトの名無しさん:2012/12/05(水) 21:42:42.00
数学の授業で
10 ≦ tmp ≦ 20
って書くだろう。
下のほうがなじんでいるだろう。
851847:2012/12/05(水) 21:45:35.20
>>848-850
こんなに早く解答頂いてありがとうございます
下を使っていきます!
852デフォルトの名無しさん:2012/12/05(水) 22:02:21.84
いや、
その「今読んでる本」の著者のような上司についてしまったら、上のように書くべきだ。
853デフォルトの名無しさん:2012/12/05(水) 22:11:02.93
その上司の机にリーダブルコードを置いてみる
854デフォルトの名無しさん:2012/12/05(水) 22:19:19.18
定数が左
855デフォルトの名無しさん:2012/12/05(水) 22:22:04.32
ねーよ
856デフォルトの名無しさん:2012/12/05(水) 22:22:55.96
tmp >= 10 && tmp <= 20
      ↓
「tmpは10以上 かつ tmpは20以下」

こちらの方が分かりやすいと感じる人がいたとしても、
否定は出来ないね。
857デフォルトの名無しさん:2012/12/05(水) 22:25:16.37
そいつはそう信じてそう書けばいいんじゃね?

結局読みやすいかどうかはみんなに読んでもらうのでなければ信念でしかないから。
858デフォルトの名無しさん:2012/12/05(水) 22:45:03.75
書き方に一貫性があればいいよ。読んでいるうちに慣れるから。
場所によって tmp >= 10 だったり 10 <= tmp だったりすると、
読み手の頭の無駄な切り替えが発生する。
859デフォルトの名無しさん:2012/12/05(水) 23:07:39.98
if(i==2)と書くべきところを、
if(i=2)と間違っても気付きにくいので、
if(2==i) としておけば、
if(2=i) <--- コンパイルエラーでミスを見つけやすい

というのを昔見た。
860デフォルトの名無しさん:2012/12/05(水) 23:10:57.26
それは役に立たないと結論が出てるからやめた方がいい
861デフォルトの名無しさん:2012/12/05(水) 23:13:42.38
いまどきのコンパイラはif (i = 2)と書けばwarning出すだろ
862デフォルトの名無しさん:2012/12/05(水) 23:17:14.80
>>861
これでwarning出るオプション有る?
#include <stdio.h>

int main()
{
int i;
if ((i=2))
printf("ok&yen;n");

return 0;
}
863デフォルトの名無しさん:2012/12/05(水) 23:24:49.79
>>862
それってコンパイラ黙らせるための意図的なコードじゃん。
864デフォルトの名無しさん:2012/12/05(水) 23:28:15.87
バグが意図したバグだけで構成されてりゃ
ここまで苦労はしねーよaho
ちょっとていのう無能のオメェーは黙ってろよ
あまりにもアフォすぎてヘドが飛び出る
まったくの害悪だから発言すんあks
865デフォルトの名無しさん:2012/12/05(水) 23:37:32.62
わあ、火病った
866デフォルトの名無しさん:2012/12/06(木) 03:26:15.93
警告: 真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします [-Wparentheses]
867デフォルトの名無しさん:2012/12/06(木) 13:49:53.94
テスト
868デフォルトの名無しさん:2012/12/06(木) 20:40:58.00
寒いなあ
869デフォルトの名無しさん:2012/12/06(木) 20:55:24.09
本気でアプリを作るなら、C++を使わないと行けないこの現実
M$さんもっと頑張って、C#で作れるようにしておくれよ

.NETもJavaでやろうと思っても、結局クラスが無いの
870デフォルトの名無しさん:2012/12/06(木) 20:58:58.49
>>869
甘えすぎじゃね?
Cなんてクラスどころか
ゴミクズみたいなライブラリしか付いてこないのに
何でも作れるじゃないか。
871デフォルトの名無しさん:2012/12/06(木) 21:10:47.97
>>870
GTKとかQtのようなライブラリを使いたいわけであってね

C#で作ってもDLLImportとか使うはめになるでしょ。高級言語使っているからテンション下がるんだよね
あぁー結局C++の力に頼らなきゃダメなのかーって
それにさ、C#で作られているメジャーなアプリなんてあるの?少なくとも俺は知らないな
いや作ろうと思えば作れるんだよ。プログラムで飯食ってるわけだし
872デフォルトの名無しさん:2012/12/06(木) 21:18:16.96
お前がC#で
メジャーになるようなアプリを作ればいいじゃねぇか
873デフォルトの名無しさん:2012/12/06(木) 21:19:38.10
C#は最近のLinux界ではそこそこ使われてるんじゃないの?
GTK#なんてのもあるみたいじゃないの。
874デフォルトの名無しさん:2012/12/06(木) 21:29:33.87
>>870
トーヴァルズ乙
875デフォルトの名無しさん:2012/12/06(木) 21:44:00.00
もう聞くしかないので教えてください。
a年b月からc年d月までの日数を求めるという課題が出たのですが
もう八方塞がりでできません。
うるう年を判定する関数は出来ました。
またa年b月とc年d月の日数を返す関数も出来ました。
ここまで出来たのですが
あとはどうすればいいのでしょうか
876デフォルトの名無しさん:2012/12/06(木) 21:51:00.69
出来上がったコードをどっかに丸揚げして
さらにここに丸投げするのが正しいです
つまりあなたはコード丸あげを除いて
正しい道を選択しています
ですので、あなたには輝かしい未来がまっているでしょう
877デフォルトの名無しさん:2012/12/06(木) 21:54:45.29
でしょうね
878デフォルトの名無しさん:2012/12/06(木) 21:55:37.02
>>875
うるう年とか日数とか要らない。
a年b月1日0時0分0秒とc年d月1日0時0分0秒の時刻(time_t)を取得して、差をとって、日数に変換すれば求まる。
879デフォルトの名無しさん:2012/12/06(木) 21:56:04.70
フツーtime_tにして差分を24*60*60で割るっしょ
銀行系で中間日を求めるのに足して2で割ったらオーバーフローして2038年問題が発生したけど
880デフォルトの名無しさん:2012/12/06(木) 21:57:10.97
改行が多くて書き込めないので諦めます
881デフォルトの名無しさん:2012/12/06(木) 21:58:50.35
>>871
そんなもんに頼らず全部Cで書きなよ。
GUIだってCで書けるだろ。
人間、楽しようとしたら際限が無いぞ。
882デフォルトの名無しさん:2012/12/06(木) 21:59:53.46
すいません、time tを使うのですか?
授業でも教わったことがないので
参考までに実際に書いていただけないでしょうか?
883デフォルトの名無しさん:2012/12/06(木) 22:09:36.88
time_tを知ったということは
あなたの人生のステージを一段階あがたということです
さあ あとは書くだけです
おそれずにその一歩を踏み出しましょう
884デフォルトの名無しさん:2012/12/06(木) 22:12:23.75
課題としては自作関数を用いてだったのですが
time tとか使っていいのでしょうかね
885デフォルトの名無しさん:2012/12/06(木) 22:15:51.21
ならプログラミングもやめて全部電子回路で半田ごてしろよ
886デフォルトの名無しさん:2012/12/06(木) 22:17:32.44
はぁ、もういいです、すいませでした。
887デフォルトの名無しさん:2012/12/06(木) 22:18:46.24
>>875
time_tなんてほとんどC言語やったことない俺でも知ってるよー
コンピュータやっている人の中ではめちゃ有名な型だから
888デフォルトの名無しさん:2012/12/06(木) 22:19:43.97
sizeof(arrray) / sizeof(int)とsizeof(pointer) / sizeof(int*)は何が違うのと質問したのですが、ようやくわかったようなー

sizeof(array)←配列はスタックに積まれるので、一番最後のアドレスが分かる。
          引数に配列を渡すとポインタとして扱われるので、最後がどこだかわからなくなってしまう。
          だから、基本的には宣言した関数でしか長さを知ることができない。

sizeof(pointer)←ポインタは自体はスックに積まれる、インスタンスはヒープ・スタックのどっちにあるかわからない。
          最後のアドレスがわからないから、ポインタは長さを知ることができない。

コンパイルした時にコンパイラがサイズを知っているって言ってたけど、それだけじゃわからんかった
889デフォルトの名無しさん:2012/12/06(木) 22:20:18.21
すいませ……【名】コイツラに聞いたオレがヴァカでした、の意。罵倒の際に用いられる。
890デフォルトの名無しさん:2012/12/06(木) 22:21:22.16
>>875
っ フェアフィールドの公式
891デフォルトの名無しさん:2012/12/06(木) 22:21:28.55
中途半端なオレオレ解釈乙
892デフォルトの名無しさん:2012/12/06(木) 22:50:45.85
fprintf()するとファイルが白紙になるんです。
理由は何が考えられるでしょうか?
fprintf(fp,"%d",1);
ってするとテキストファイルが空になってます...
893デフォルトの名無しさん:2012/12/06(木) 22:52:27.85
>>892
テキストエディタじゃなくて、バイナリエディタで開いてみて
894デフォルトの名無しさん:2012/12/06(木) 22:52:35.32
>>892
現象が再現する最小のコードうp!
895デフォルトの名無しさん:2012/12/06(木) 22:55:10.22
fclose()してないんじゃね
896デフォルトの名無しさん:2012/12/06(木) 22:55:24.41
>>894
ありがとうございます。
/*
cat -n 1.txt
>x
*/

FILE *fp;
fp=fopen("1.txt","w")
fprintf(fp,"%d\n",1);


これですかね。
897デフォルトの名無しさん:2012/12/06(木) 23:00:19.62
他にもファイルポインタあるからそれとの兼ね合いで何か
エラーしてるかもしれません。すいませんちょっと考えます。
898デフォルトの名無しさん:2012/12/06(木) 23:00:48.91
>>896
コンパイルできない

現象再現どころじゃねーよ
899デフォルトの名無しさん:2012/12/06(木) 23:10:05.52
>>898
すいません。forの所で添え字じゃなくて定数を
fprintfしてました。初歩的なミスでした.....
900デフォルトの名無しさん:2012/12/06(木) 23:13:04.35
舌足らずですいません。
for(i=0; i<=j; i++)
{
fprintf(fp,"%d",a[j]);
}

こういう事です。
すいませんでした。
901デフォルトの名無しさん:2012/12/06(木) 23:22:25.99
 fp = fopen("a.txt", "wt"); fprintf(fp, "1\n"); fclose(fp);
  …
 fp = fopen("a.txt", "wt"); fclose(fp);
とやれば、消える。
追記したいなら、
 fp = fopen("a.txt", "wt"); fprintf(fp, "1\n"); fclose(fp);
  …
 fp = fopen("a.txt", "at"); fprintf(fp, "2\n"); fclose(fp);
とすればいい。
902 ◆QZaw55cn4c :2012/12/06(木) 23:36:40.07
903900:2012/12/07(金) 01:20:46.09
一応解決したんですが
fp1=fopen("onaji.txt","r");
fp2=fopen("onaji.txt","w");
これは何故だめなのでしょうか?
おかしいですか?同時に同じファイルを違うモードで参照するという。
904デフォルトの名無しさん:2012/12/07(金) 01:28:47.59
読み書きをしたいなら、"r+" か "w+" か "a+" を使って開き、1個のファイルポインタで行う
905900:2012/12/07(金) 01:31:48.67
>>904
ありがとうございます。
rの後ろについてる+とかって必要ですか?
無くても組めるんですが。
906デフォルトの名無しさん:2012/12/07(金) 01:35:35.98
組めてねーじゃんw
907デフォルトの名無しさん:2012/12/07(金) 02:52:57.87
>>905
"b" で開くバイナリモードなら、データ長指定だからこちらでも把握しやすいけど、
テキストを扱うんだったら "+" で開いてやりくりするのはオススメしない、というか、
俺は頭が混乱する。
どこに書かれるか分からんとか、長い文字列を書くと次の行が潰されるとか、色々面倒だ。
一気にメモリ上に読んで、メモリ上で加工して、一気に書き出すようにした方が確実。
データサイズが巨大なら、ファイルを分割して扱う設計にすれば良い。
908デフォルトの名無しさん:2012/12/07(金) 07:13:21.53
お前の好みなんて誰も興味ない
909デフォルトの名無しさん:2012/12/07(金) 09:03:52.43
興味ないね
910デフォルトの名無しさん:2012/12/07(金) 09:47:13.85
クラウド乙
911デフォルトの名無しさん:2012/12/07(金) 10:18:20.60
やめなよ
912デフォルトの名無しさん:2012/12/07(金) 11:05:46.68
定番。
--
   モード    ファイルがないとき ファイルがあるとき
"r" 読み専用  エラー        開く
"w" 書き専用 作成         空にする
"a" 追記専用 作成         開く
"r+" 読み書き エラー        開く
"w+" 読み書き 作成        空にする
"a+" 追記と読み 作成       開く
--
"t"を付加するとテキストモード、"b"を付加するとバイナリモード。
尚、読みと書きを切り替えるにはfseek(), fsetpos()などが必要。
913デフォルトの名無しさん:2012/12/07(金) 11:34:28.70
ungetc()
914デフォルトの名無しさん:2012/12/07(金) 15:01:48.76
うんこしたいよ〜
915デフォルトの名無しさん:2012/12/07(金) 16:21:37.78
>>912
tでテキストモードって使う奴いるの?
互換性下げるだけの不要な代物だと思うが
916片山博文MZボット ◆0lBZNi.Q7evd :2012/12/07(金) 16:32:25.40
>>915 まったく使わないね。
917デフォルトの名無しさん:2012/12/07(金) 17:04:28.29
そうか?
918デフォルトの名無しさん:2012/12/07(金) 17:13:04.15
何の意味があるのかと
919デフォルトの名無しさん:2012/12/07(金) 17:40:59.26
意味がないのはそれに何の意味も価値も見出せることのない
お前の首から上の有機物の集合体すなわちゴミそのもののことだ
920デフォルトの名無しさん:2012/12/07(金) 17:54:45.72
ゴミがしゃべったあああああああああああああああああ
921デフォルトの名無しさん:2012/12/07(金) 18:35:35.90
>>915
"t"はMSだけかな?

テキストの"+"だと
001
002
003
の「001」の場所で「xxxx」と書くと
xxxx
02
003
ってなってしまう。
バイナリだったら良いんだけど、テキストは良くわからんわ。
922デフォルトの名無しさん:2012/12/07(金) 20:24:20.32
>>919
実際意味ないだろ
どうしてもWindowsでしか動かないコード書きたいなら、
fopen使わずCreateFileでも使えよバカ
923デフォルトの名無しさん:2012/12/07(金) 20:27:23.55
>>922

まだ首から上がしゃべくってんのか
さっさと黙れよks
お前は不愉快だw
924デフォルトの名無しさん:2012/12/07(金) 20:47:09.70
ゴミがしゃべったあああああああああああああああああ
925デフォルトの名無しさん:2012/12/07(金) 20:57:13.48
とりあえずCを始めたばかりの人は"rt"とか変なくせ付けないように気をつけようね
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
926デフォルトの名無しさん:2012/12/07(金) 21:02:14.78
fscanfでn行二列のtxtファイルを読み込みたいのですが

>cat tango.txt

book off
town work
good bye
moutain coffee

↑これを読み込んで
二次元配列char str[10][2]に読み込むと

book offtown
town workgood
good byemoutain
moutain coffee

となってしまいます。
何故こうなるのでしょう?
scanfやstrtokで試してるんですが
いずれもこうなります。
927デフォルトの名無しさん:2012/12/07(金) 21:19:17.33
とりあえずstr[2][10]の間違いのような気がするが
http://ideone.com/9grKoq
928デフォルトの名無しさん:2012/12/07(金) 21:19:22.49
なぜそうなるって
そうプログラムしてるからだろ
ソースくらい上げろよ
929デフォルトの名無しさん:2012/12/07(金) 21:33:00.20
>>927
それが原因でした...
ありがとうございます。
要素数が少なくて読み込めなかった。
930デフォルトの名無しさん:2012/12/07(金) 21:53:37.41
fscanfとかしたら
読み込んだ文字列に空白や改行記号が入ってないかめっちゃ不安だったけど
a[start]は先頭文字
a[end]は終了文字だった
結構使いやすいように出来てるんだなぁ
931デフォルトの名無しさん:2012/12/07(金) 23:07:51.24
なにこのゴミ板
932デフォルトの名無しさん:2012/12/07(金) 23:09:48.56
ゴミ一名様入りましたー
933デフォルトの名無しさん:2012/12/08(土) 01:25:46.86
割り付け記憶域期間難い(使いどきが)
これって実際使うのか?

ググってもあまり出てこないし
割り付け記憶域期間って好きなときに作ったり消せたりするのが美点なの?
934デフォルトの名無しさん:2012/12/08(土) 02:19:44.72
mallocなしで書くって、組み込みとかではあるみたいだけど自分で書いたことはないなぁ
(せいぜい数十行の練習用コードは除く)

処理を全部mainに書いちゃうとか、ポインタわからないからグローバル変数使いまくっちゃうとか、
必要なメモリのサイズ分からないから常に最大のサイズで配列宣言しちゃうとか、そういう人?
935デフォルトの名無しさん:2012/12/08(土) 03:07:12.11
スタティック領域を「グローバル変数」としか捉えられない素人には無理だろうけど
再入可能の必要を見極め排除する技量があれば
ヒープメモリに触らず大規模コードを組上げるのも不可能じゃないよ
936デフォルトの名無しさん:2012/12/08(土) 03:51:56.88
関数はmainの外にも書いてます
ポインタもわかります

>必要なメモリのサイズ分からないから常に最大のサイズで配列宣言しちゃう

多分そうです
配列はこれだけあれば十分だろ的に宣言してます

つい最近cをやり始めたのですが参考書を読んでたら割り付け記憶域期間が出てきて‥
いままで割り付け記憶域期間を使わなくても困ったこととかがなかったから
一体どういう時に使うんだろうと悩んでるのです

メモリを気にしたり、実際にソフトを作るようになったら使うようになるんですかね?
937デフォルトの名無しさん:2012/12/08(土) 04:00:50.62
>>933
勘違いしていると思う。

割り付け記憶域っていうのはmallocなどの動的確保した領域を
指している言葉で、「期間」というのは確保したメモリの寿命のこと。
メモリの寿命は確保手段や用途によって違う。

いつ必要になっていつ不要になって、どのタイミングで解放するか
などなど、そういうことを考え始めると割り付け記憶域に対する期間
をどう設計するか考える必要が出てくる。
938デフォルトの名無しさん:2012/12/08(土) 04:02:05.63
ちなみに「こんだけ取っておけば十分だろー」という取り方だと
プログラムの規模が一定を超えたところから破綻し始める。
939デフォルトの名無しさん:2012/12/08(土) 04:10:52.46
まだ参考書の問題○○〜
とかなんでメモリとか意識したことなかったです…

今から意識しておきます
940デフォルトの名無しさん:2012/12/08(土) 07:35:26.23
>>937
「記憶域期間(storage duration)」ってC言語の用語だよ。
941デフォルトの名無しさん:2012/12/08(土) 07:56:50.69
うん、それがどうかした?
942デフォルトの名無しさん:2012/12/08(土) 09:00:07.99
それを知らないと「割り付け記憶域」と「期間」というトンチンカンなところで
ぶった切ることになる。
943デフォルトの名無しさん:2012/12/08(土) 10:33:27.90
ぷぅ
944デフォルトの名無しさん:2012/12/08(土) 11:55:22.65
ぶった切ったからってとんちんかんでも何でもない
945デフォルトの名無しさん:2012/12/08(土) 12:03:38.32
storage durationて、一般的にいうところのスコープとエクステントのエクステントの事?
946デフォルトの名無しさん:2012/12/08(土) 12:06:55.57
自動変数の寿命は宣言されてからブロックを抜けるまでの間とか
そういったことじゃないの。
947デフォルトの名無しさん:2012/12/08(土) 12:53:52.49
948デフォルトの名無しさん:2012/12/08(土) 13:00:15.38
自動記憶域期間・・・ブロックの開始から終了まで
静的記憶域期間・・・プログラムの開始から終了まで
割り付け記憶域期間・・・malloc等からfreeまで
949デフォルトの名無しさん:2012/12/08(土) 16:45:05.72
rand()関数においては32768まで発生させられますが、
1024000までは発生させたいです。
何かいい方法はないでしょうか?

temp = (rand()%1000) * (rand()%1000) 
上記でどうだろうか、と考えたのですが、
上記の方法だと乱数が値が偏るような気がします。
950デフォルトの名無しさん:2012/12/08(土) 16:55:10.36
(rand() * (RANDMAX+1) + rand()) * 1024000 / ((RANDMAX+1) * (RANDMAX+1))
桁あふれとかは知らん
ttp://oshiete.goo.ne.jp/qa/952867.html
951デフォルトの名無しさん:2012/12/08(土) 17:41:34.43
>>949
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c

これ使ってみるとか。MT法という乱数アルゴリズム。
このままVS2010Expressのコマンドプロンプトでコンパイルと実行が
できたから、あとは適当にいじくってみれば。
952デフォルトの名無しさん:2012/12/08(土) 17:45:21.81
へえ
953デフォルトの名無しさん:2012/12/08(土) 18:52:19.76
各桁を0〜9の乱数で出して
それを文字列的につなぎ合わせりゃいいんじゃねーの
954デフォルトの名無しさん:2012/12/08(土) 19:02:22.21
>>949
それだと例えば素数は出てこない
955デフォルトの名無しさん:2012/12/08(土) 19:07:03.32
> Prnglibは、64ビットシステム用に設計された擬似乱数生成ライブラリです。
956デフォルトの名無しさん:2012/12/08(土) 19:20:24.54
>>950-954
有難うございます。参考にしてトライしてみます
957デフォルトの名無しさん:2012/12/08(土) 20:57:39.73
いえいえ
958デフォルトの名無しさん:2012/12/08(土) 21:35:54.25
でも>>953とかスゲェ遅そうだし
ホントに乱数になんの?
959デフォルトの名無しさん:2012/12/08(土) 21:37:00.73
うん
960デフォルトの名無しさん:2012/12/09(日) 11:12:03.40
でも、0-1024000とかの値域に合わせるには再度加工が必要だけどね。
だから、>950の方針が無難かな。
961デフォルトの名無しさん:2012/12/09(日) 15:14:08.48
OSSのアプリはgccが必須?
VisualStudio大好きなんだけど

makeはよく失敗するのでmakeは使いたくないなー
962デフォルトの名無しさん:2012/12/09(日) 15:15:27.30
>950の方法だと頻度に最大0.1%の差があるよね。
それでも良ければって条件付きなら使用可だね。
もちろんrand()自身の頻度の差がそれ以下の場合だけど。
963デフォルトの名無しさん:2012/12/09(日) 15:18:39.83
>>961
君は君の環境で良いものを作ることに専念すれば良い。
良いものだったら
他人が勝手に他の環境向けにビルドして配布してくれるよ。
964デフォルトの名無しさん:2012/12/09(日) 15:32:45.23
(rand() * (RANDMAX+1) + rand()) % 1024000
ま、これが一番お手軽だろうね
正確性を求めるなら乱数系を作るしか
965デフォルトの名無しさん:2012/12/09(日) 15:51:55.95
RANDMAXが32767の環境ではrand() * (RANDMAX+1) + rand()は0〜1,073,741,823が得られる
最大値を1,024,000で割ると1048.576となり、頻度が1048と1049の差が生じる
よって1048*1,024,000(=1,073,152,000)以上の値は再抽選とすれば一応公平にはなる
966デフォルトの名無しさん:2012/12/09(日) 17:02:37.58
10進を指定コードの長さで左詰めで2進にするプログラムどうしたらいいですか?
考えてるんですが全然作れなくて。
char buffer[100];

int 34;
を10bit2進→ [0000100010]
を8bit2進→  [00100010]
buffer[100]に左詰めで格納

strcpy strcmp strstrとか一杯あるけど使えそうなのがないっていう...
とにかく困ってます。
967デフォルトの名無しさん:2012/12/09(日) 17:06:34.48
> 10bit2進→ [0000100010]
この文字列 0000100010 とかを
bufferに左から詰めるのか?
968デフォルトの名無しさん:2012/12/09(日) 17:07:27.26
>>966
void hoge(char buffer[], int num, int bit)
{
int i;

for(i=0;i<bit;i++)
{
buffer[i]=((num>>(???))&1)+'0';
}
buffer[bit]='\0';
}
969デフォルトの名無しさん:2012/12/09(日) 17:08:35.10
>>967
そうです。
buffer[0]からbudder[strlen(10)]
bufer[0]からbuffer[strlen(8)]
ということですね。左=0です。
970デフォルトの名無しさん:2012/12/09(日) 17:14:54.01
>>968
どうもです。

parse error before '?' token
warning: trigraph ??) ignored, use -trigraphs to enable
こんなエラーが出たのですが..
971デフォルトの名無しさん:2012/12/09(日) 17:16:55.61
>>970
そこは自力で穴埋めしてみるといいよ
972デフォルトの名無しさん:2012/12/09(日) 17:20:50.96
>>971
iですか?
何か知らないけどできましたw
ありがとうございます。文字列関数一切使わなくていいんですね。
973デフォルトの名無しさん:2012/12/09(日) 17:23:39.04
iじゃなかった...
?3つって意味がありますか?
974デフォルトの名無しさん:2012/12/09(日) 17:34:39.22
>>970
#include <stdio.h>

/*
数値 num を bit の指定ビット幅だけ buffer[] に左詰めで格納する
*/
void hoge(char buffer[], int num, int bit)
{
int i;

for(i = 0;i < bit;i++)
{
buffer[i]=((num >> i) & 1)+'0';
}
buffer[bit]='\0';
}

int main(int argc, char *argv[])
{
char buf[64];
int i;

for(i = 0;i < 64;i++)
{
buf[i] = 0;
}

hoge(buf, 78, 10);
printf(buf);

return0;
}
975デフォルトの名無しさん:2012/12/09(日) 17:43:31.35
あぁ日本語難しいwそういうことか
ビットを"左"から箱に"左詰め"するって意味です。
右から箱に左に詰めてるw
976デフォルトの名無しさん:2012/12/09(日) 17:47:25.45
つまりビットで反転した文字列を作成するってこと?
977デフォルトの名無しさん:2012/12/09(日) 17:50:39.82
数値として確認できる状態であればいいです
だから
2が000010じゃなくて010000だったら困りますね..

 
978デフォルトの名無しさん:2012/12/09(日) 18:27:35.38
英単語をテキストファイルから読み込んで表示するプログラムを作っているのですが、
下のようにテキストファイルの中身を、単語の個数と単語で構成しています。

3
dog
cat
monkey

例えばゲームだとセーブデータやマップデータなど、
どのような感じでファイルの中身を定義していくのでしょうか。
ファイルの定義の仕方や定石をまとめたような書籍があれば教えて下さい。
よろしくお願いします。
979デフォルトの名無しさん:2012/12/09(日) 18:33:25.21
今使ってるフォーマットで良いじゃん。
不必要に複雑なフォーマット使ってもしょうがない。
980デフォルトの名無しさん:2012/12/09(日) 18:47:59.42
データの持ち方はデータの性質で決まってくるから
その都度考えるしかないんじゃないかな。
981デフォルトの名無しさん:2012/12/09(日) 18:49:11.09
例えば
config ini
などと検索してみると、ヒントが出る
982デフォルトの名無しさん:2012/12/09(日) 18:54:45.33
>>979-981
勉強になります。ありがとうございました。
983デフォルトの名無しさん:2012/12/09(日) 18:56:04.43
そのぐらい自分で考えることだろw
野球のサインについて勉強したいので参考書籍を教えてくださいって言ってるようなもんだぞw
984デフォルトの名無しさん:2012/12/09(日) 19:25:04.80
985デフォルトの名無しさん:2012/12/09(日) 20:04:58.35
どなたか次スレお願いします
986デフォルトの名無しさん:2012/12/09(日) 20:24:53.93
>>977
文字列反転関数
void strrev(char *d)
{
int i;
int len = strlen(d);
char tmp;
for (i = len / 2 - 1; i >= 0; i--) {
tmp = d[i];
d[i] = d[len - i - 1];
d[len - i - 1] = tmp;
}
}
これは、"1234"を"4321"に変換する
987デフォルトの名無しさん:2012/12/09(日) 22:06:01.62
副作用かっこわるい
988デフォルトの名無しさん:2012/12/09(日) 22:18:30.42
>>986
ありがとうございます!
というかitoa関数ってものを発見したんですが
使えない...
cygwinですがこれって入ってないんでしょうか?
989デフォルトの名無しさん:2012/12/09(日) 22:21:01.05
>>978
sourceforgeのゲームカテゴリからコード落としてきて、中身を読む。
書籍なんて読むな。イラナイ。本当にイラナイ。コードから読み取れ。
990デフォルトの名無しさん:2012/12/09(日) 22:27:06.16
ゲームプログラマのコードって汚いからなあ
フラグとかよく分からない変数が大量にあって
デザインパターンデザインパターンしたコードのアクションゲームソースどこかにありませんか?
991デフォルトの名無しさん:2012/12/09(日) 22:28:22.33
ゲームプログラムするなら複数でやったほうがいいと思う。
効率が全然違う。
992デフォルトの名無しさん:2012/12/09(日) 22:31:41.86
>>988
あるやん
3.4.4/std/c/stdlib.d:char* itoa(int, char*, int);
993デフォルトの名無しさん:2012/12/09(日) 22:31:49.15
>>990
デザパタならUMLのモデリングツールに多用されてるよ
ゲームは知らん。100〜200個ぐらい落としてきて、ヨサゲなコードでも自分で探せ
994デフォルトの名無しさん:2012/12/09(日) 22:31:51.00
>>990
C言語以外のほうがキレイにかけるっしょ
よそへ探しに行ったら?
995デフォルトの名無しさん:2012/12/09(日) 22:33:16.40
>>990
おまえみたいなのが無菌室で働けると思うな
996990:2012/12/09(日) 22:35:37.42
わろたw
997デフォルトの名無しさん:2012/12/09(日) 22:36:39.81
>>992
ありますかー
無いんですが...
cygwinのバージョンふるいのかなぁ
998デフォルトの名無しさん:2012/12/09(日) 22:54:41.22
今どきはC++で書くだろ
999デフォルトの名無しさん:2012/12/09(日) 23:04:31.08
無政府主義のバナナ連中がテロを起こし、
c++コンパイラが用意できないマイナーOSへquakeを移植しろって話かもしれない
1000デフォルトの名無しさん:2012/12/09(日) 23:15:33.49
じゃあ次スレでも立てるか
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。