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

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

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

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

前スレ
 C言語なら俺に聞け(入門篇) Part 40
 http://pc11.2ch.net/test/read.cgi/tech/1227705211/
過去スレ
  http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
2デフォルトの名無しさん:2008/12/19(金) 10:48:39
>>1乙!!
3デフォルトの名無しさん:2008/12/19(金) 16:40:15
>>1
早速質問で申し訳ないが、
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int i;
srand((unsigned)time(NULL));
for(i=0;i<100;i++) printf("%d\t",rand()%RAND_MAX);
return 0;
}

でfor内ではランダムの数字が100個出てくるが
「プログラム終了→すぐに起動」を繰り返してみると
最初の数字が22000→21765→21475とランダムになってくれません。
srandかrandをどのようにすれば最初の数字もランダムにできるんでしょうか?
4デフォルトの名無しさん:2008/12/19(金) 16:48:35
time()は秒単位の精度しかありません。
5デフォルトの名無しさん:2008/12/19(金) 19:15:38
プロセス ID を併用すれば毎回違う値には出来る。
ただし環境依存。
6デフォルトの名無しさん:2008/12/19(金) 19:18:21
Windows なら timeGetTime が使える。
これは Windows を起動してからのミリ秒単位の時間。
7デフォルトの名無しさん:2008/12/19(金) 21:43:37
>>4-6
返答ありがとうございます。
上記の方法を調べてみます
8デフォルトの名無しさん:2008/12/20(土) 19:23:23
転職でプログラマーを考えているんですが。
C言語を覚えた方が良いのでしょうか?
javaなどがあるらしいんですが。
C言語で基礎を固めてから、他の言語へ移行みたいな感じでしょうか?
9デフォルトの名無しさん:2008/12/20(土) 19:36:37
C→Javaはいろいろ難しい
(そもそも"何"のプログラマーなんだ?)
10デフォルトの名無しさん:2008/12/20(土) 19:37:33
マ板いけよ
11デフォルトの名無しさん:2008/12/20(土) 19:39:06
転職で初心者とか、今の不況でまともな雇い口があるのかね。
もっと長期的に考えてるのなら別にいいんだけど
(十分なスキルがついてからなら問題は無いだろうし)。

個人的にはまずはCとアセンブリ言語をやるべきだと思ってる。
ただ、そんなに熱心に入れ込む必要は無くて、
ある程度感じがつかめたところで C# か Java あたりを触ってみるといい。
その後 Perl か PHP でも触ってみれ。
複数の言語を扱った方が新しい言語を覚える抵抗が低くなって、
時代に付いていきやすくなる。
12デフォルトの名無しさん:2008/12/20(土) 22:38:28
普通logの逆はexpですけど
log10とlogの逆ってなんなんですか?
13デフォルトの名無しさん:2008/12/20(土) 22:45:38
10のなんとか乗
14デフォルトの名無しさん:2008/12/20(土) 22:53:40
y = log10(x) の逆は x = pow(10, y)
y = log(x) の逆は x = exp(y)
15デフォルトの名無しさん:2008/12/20(土) 22:54:36
ちょっと配列とポインタについて疑問が
次のプログラムを見てほしい

char str[10];
char *p;
p=new char[10];        ↓実行結果

printf("%p\n",p);      00902B08
printf("%p\n",&p);     0012FF7C
printf("%p\n",*(&p));    00902B08

printf("%p\n",str);     0012FF81
printf("%p\n",&str);    0012FF81  ←なんでコイツは上(下)と同じアドレスなんだ??
printf("%p\n",*(&str));   0012FF81
16デフォルトの名無しさん:2008/12/20(土) 22:55:58
配列の識別子は配列の先頭アドレスを返すからだ
17デフォルトの名無しさん:2008/12/20(土) 23:05:22
>>15
普通コンパイルエラーになると思うんだが。
コンパイラ何使ってるんだ?
18デフォルトの名無しさん:2008/12/20(土) 23:08:26
>>17
どこがなると思うの?
19デフォルトの名無しさん:2008/12/20(土) 23:17:03
>>18
p=new char[10];
これがコンパイルできるはずがない
20デフォルトの名無しさん:2008/12/20(土) 23:19:06
拡張子がCならね・・
21デフォルトの名無しさん:2008/12/20(土) 23:22:50
>>15
1) pは割り付けた領域の先頭要素へのポインタとして評価される
2) &pはpへのポインタとして評価される
1)と2)はふつう別のものだから当然違う値になる

3) strは配列そのものだがこれはすぐに配列の先頭要素へのポインタに成り下がって評価される
4) &strは3)の法則に当てはまらない例外として配列へのポインタとして評価される
配列へのポインタと配列の先頭へのポインタは大きさは違うが指している位置は同じなので
%pで出力すると同じ値を吐く
22デフォルトの名無しさん:2008/12/20(土) 23:25:40
2番目の&pは先頭アドレスを返さないのに、なぜ5番目の&strは先頭アドレスを返すのだろう。
配列の仕様??
23デフォルトの名無しさん:2008/12/20(土) 23:26:02
>>19
なるほどなwwwwww
24デフォルトの名無しさん:2008/12/20(土) 23:29:10
>>22
問題点はそこじゃない
むしろ4番目と6番目がなぜ配列の先頭になるのか、がポイント
25デフォルトの名無しさん:2008/12/20(土) 23:29:22
>>21
おー、どうもありがとう。
malloc使えばいいのにnew使ってしまいました。すみません
26デフォルトの名無しさん:2008/12/21(日) 00:38:57
char str[10]; の str の型は char[10] なんだが、
ポインタを要求するところで str と使うと自動的に char* に変換される仕様になっている。
で、この値は配列の先頭アドレス、すなわち &str[0] に等しいという仕様になっている。

で、一方 &str の型は配列へのポインタ、すなわち char(*)[10] になる。
値は当然配列のアドレスなのだが、これは当然配列の先頭アドレスに等しい。

というわけで str も &str も配列の先頭アドレスを指すわけだ。
ただ、両者で型が違う点には注意すること。

そして、&str に * をつけると脱参照されるわけだが、
&str は str へのポインタっちゅーわけなんで、
*&str は当然 str を指す。
*&p が p を指すのと同じ理屈だ。
27デフォルトの名無しさん:2008/12/21(日) 00:56:51
ポインタにはアドレスを保有する領域があって、
p はその保有しているアドレスを返し、
&p はポインタ自身の領域を返す。
int n = 10; の n が 10 を返すのと同じように、
char *p = malloc(10); の p は malloc(10) の返したアドレスを返す。
&n が n のアドレスを返すように、&p は p のアドレスを返す。

p □ ポインタ自身の領域(アドレスは &p で得られる)
. └→□□□□□□□□□□ malloc で確保した領域(アドレスは p が保有している)

これに対し、配列にはその配列自体のアドレスを保有する領域なんてないという点に注目。
利便性から str は先頭要素のアドレスを返す仕様になっていて、
この変は普通の変数と同じように考えることはできない。
ただ、&str が str のアドレスを返すという点は普通の変数と一緒。

str □□□□□□□□□□ 配列の占める領域(アドレスは &str で得られる)
  ↑                                       ↑
 配列の先頭要素(アドレスは str または &str[0] で得られる) ← どちらも同じアドレス(でも型は違う)
28デフォルトの名無しさん:2008/12/21(日) 01:01:38
&strって使い道あるの?
29デフォルトの名無しさん:2008/12/21(日) 01:10:30
配列の要素数が固定になるので、
それを期待したい時に使えなくはない。
でも、普通はそんな使い方しないよね。

typedef double matrix[3][3];
void foo(matrix hoge);
matrix m;
foo(m);

みたいな使い方ならありうると思う。
hoge の型は double(*)[3] だ。
30デフォルトの名無しさん:2008/12/21(日) 01:12:36
ちなみに C++ なら配列の要素数を取得するマクロを作成する時に使える。
ここは C のスレだから関係はないが。
31デフォルトの名無しさん:2008/12/21(日) 01:35:20
↑↑の説明がすごくわかりやすくて理解深まりました。
マジトンクス
32デフォルトの名無しさん:2008/12/21(日) 02:18:29
char型の配列とポインタの違いってどうやって見分けるんですか?
↓のコードだと 配列宣言の直下ではsizeof の結果256ですが、
関数の中ではポインタの大きさの4になります。
文字列を受け取る関数のほとんどは、配列宣言直後の変数でも
引数で受け取ったポインタでも同じように扱えるし、見た目の書き方
も同じですよね。
コードではどっちも同じ書き方の「sz」でアクセスできるのが不思議です。

void func(char* sz)
{
  printf("%d",sizeof(sz));  ← 4になる(違う)
  printf(sz);    ← qwertyと表示される(同じ)
}

int main(int argc,char* argv[])
{
  char sz[256];
  strcpy(sz,"qwerty");
  printf("%d",sizeof(sz));  ← 256になる(違う)
  printf(sz);    ← qwertyと表示される(同じ)
  func(sz);
}

33デフォルトの名無しさん:2008/12/21(日) 02:27:29
34デフォルトの名無しさん:2008/12/21(日) 02:38:14
>>32
その変数の宣言を見て区別する

面倒くさいなら、配列であってもポインタであっても問題が起きないような使い方をする
35デフォルトの名無しさん:2008/12/21(日) 03:03:43
わかりますた
36デフォルトの名無しさん:2008/12/21(日) 07:46:12
>32

Cでは関数の引数として配列を渡すことはできない。つねに配列の先頭要素を指すポインタとなる。

ついでに
char a[10];
があったとき裸のaは「次の例外を除けば」その配列の先頭要素へのポインタとして扱われる。

例外
&のオペランドになった場合
sizeofのオペランドになった場合
配列宣言の初期化子になった場合

>34
いや、配列とポインタは別物なのだから、どちらでも問題ないようなコードなんて無理なんじゃない?

37デフォルトの名無しさん:2008/12/21(日) 10:27:21
文字列に&って使う機会ってどんなときですかね?
見たこと無いというか。付けるなって聞いたんですが。
38デフォルトの名無しさん:2008/12/21(日) 11:11:48
文字列の途中から関数に渡すとかかなあ?
void hoge(char *a)
{
printf(a);
}

int main()
{
char a[] = "ABCDE";
// CDEの部分だけ渡したい
hoge(&a[2]);
return 0;
}
39デフォルトの名無しさん:2008/12/21(日) 11:25:27
>>36
引数に渡されてきたものが
元がポインタだろうが元が配列だろうが
どちらでも問題ないコード、と言う事だろう。
具体的に言えば、サイズは引数で渡せ、と。
40デフォルトの名無しさん:2008/12/21(日) 11:34:14
>>38
>>37 の言ってるのは &a のことだと思う。
普通は使わない。

>>29 みたいな感じで、固定長文字配列の配列全体を渡す際に、
文字配列へのポインタを渡す事ならあり得るが、普通はあまり使う機会は無いと思う。

#define HOGE_SIZE (3)
void foo(const char (*hoge)[HOGE_SIZE]);
static const char hoge[][HOGE_SIZE] = {
 "ho", "me", "pa", "ge",
};
foo(hoge);
/* hoge は &hoge[0] に同じだが、
  hoge[0] は "ho" という文字列全体を表す配列変数なので、
  &hoge[0] は上記の &a に相当する */

普通は文字列の先頭アドレスへのポインタの配列を使うし
(長さ揃ってなくてもいいし長さを指定しなくても良くて便利なので)。

void foo(const char *const *hoge);
static const char *const hoge[] = {
 "ho", "me", "pa", "ge",
};
foo(hoge);
41デフォルトの名無しさん:2008/12/21(日) 11:40:52
C++ならいざ知らず、Cでは「&配列」の出番は殆どないな。
42デフォルトの名無しさん:2008/12/21(日) 11:44:19
>>40
なるほど。勉強になったサンクス!
43デフォルトの名無しさん:2008/12/21(日) 13:19:48
int型配列の要素の平均値を求める関数を書いたつもりなのですが
要素5つで値も全部5のとき
合計は24.965399
平均値は4.993080
などと値が微妙に丸められています。
キャストするとき変になったのかもしれませんが何故でしょうか。
コンパイラーはgccです。

double avg(int array[], int elements) {
double ret;
int *p = array;
while(p < &array[elements]) {
ret += (double)*p;
p++;
}
/* デバッグ用 */
printf("合計は%f\n", ret);
ret = ret / (double)elements;
return ret;
}
44デフォルトの名無しさん:2008/12/21(日) 13:22:23
合計は整数なんだからintで持てよ
45デフォルトの名無しさん:2008/12/21(日) 13:33:47
>>36
無理ではない
具体的には以下のことをしなければいい

・sizeof、&を作用させない
・代入しない
・free()しない
46デフォルトの名無しさん:2008/12/21(日) 14:30:22
>>43
自動変数のretを初期化してないようだけど
47デフォルトの名無しさん:2008/12/21(日) 14:52:09
>>43
無理にポインタ演算をするのは避けた方がいい。それに、forを使った方がこの場合はシンプルにまとまる。
48デフォルトの名無しさん:2008/12/21(日) 15:10:36
double avg(int array[], int elements) {
 int total = 0. i;
 for(i=0 ; i<elements ; i++) {
  total += array[i];
 }
 /* デバッグ用 */
 printf("合計は%f\n", total);
 return (double)total / elements;
}
49デフォルトの名無しさん:2008/12/21(日) 15:11:33
&array[elements]
これは一度実体参照してるから違反になる可能性があるのかな?
50デフォルトの名無しさん:2008/12/21(日) 15:33:23
ならない。
&array[elements] は array+elements と厳密に等しいと決まってる。
51デフォルトの名無しさん:2008/12/21(日) 17:47:45
i++ * i++;
この結果は i * i, (i+1) * i, i *(i+1)
のどれになるかは不定ですよね?
52デフォルトの名無しさん:2008/12/21(日) 17:49:52
>>51
いいえ、不定ではなく、未定義です。
常識的に導かれる結果になるかもしれませんし、ならないかもしれません。
53デフォルトの名無しさん:2008/12/21(日) 18:04:19
>>52
評価順序は不定で、結果は未定義ということですか?
54デフォルトの名無しさん:2008/12/21(日) 18:09:39
評価順序も未定義。

void hoge(foo(), bar()); の foo() と bar() の評価順は不定。
foo と bar が互いに影響を及ぼし合う副作用を持っていない場合は
「正しい」プログラムになる。

i++ * i++; は未定義。どうあっても正しいプログラムにはならない。
55デフォルトの名無しさん:2008/12/21(日) 18:10:32
void は要らないや・・・
56デフォルトの名無しさん:2008/12/21(日) 18:11:17
コンパイラ次第。
 評価の順序そのものが規格に無く、コンパイラ実装者が勝手に判断して実装しても良いし、特に意識して実装する必要もない。
 従って、どうなるかは環境によってバラバラで、やってみなけりゃわからないということ。
 ・・・だったと思います。間違ってたらごめん。
5751、53:2008/12/21(日) 18:14:08
>>54-56
ありがとう!
58デフォルトの名無しさん:2008/12/21(日) 18:25:25
マクロで do {} while(1) イディオムを使いたいのですが、
VC8では「条件式が定数です」という警告が出てきます。

これを避けたいのですが、何かいい方法ありませんか?
59デフォルトの名無しさん:2008/12/21(日) 18:28:13
do { } while(0) じゃないの?
代わりに for(;;){ break; } を使うとか。
60デフォルトの名無しさん:2008/12/21(日) 18:28:47
ああ、忘れてくれ。
バカなこと言ってしまった。
61デフォルトの名無しさん:2008/12/21(日) 18:55:00
>>59
while(0)でした^^
for - break だと最後のセミコロンが違ってくるので、
できれば他の方法があるとありがたいです
62デフォルトの名無しさん:2008/12/21(日) 18:57:51
{}
63デフォルトの名無しさん:2008/12/21(日) 19:00:55
#pragma warning(disable: xxxx) /* xxxx は警告番号 */

でその警告を無効にはできる。
ただ、効果はその #pragma 以降全体なので、
そのマクロ以外の部分を使ってるところにも影響は及んでしまう。

これをよしとしない場合は・・・難しいな。
マクロを諦めて関数にしてしまうのも1つの手だ。
64デフォルトの名無しさん:2008/12/21(日) 19:01:55
今時、C言語の需要はあるのでしょうか?
仕事で使ったりと?
65デフォルトの名無しさん:2008/12/21(日) 19:04:16
組み込み系はまだまだ現役だろ
66デフォルトの名無しさん:2008/12/21(日) 19:04:54
ゲームもな
67デフォルトの名無しさん:2008/12/21(日) 19:04:59
>>62
お馬鹿
68デフォルトの名無しさん:2008/12/21(日) 19:07:57
>>63
ありがとうございます
地味に難しい問題なのですね
69デフォルトの名無しさん:2008/12/21(日) 19:09:23
>([[[[)
70デフォルトの名無しさん:2008/12/21(日) 19:10:14
組み込み系についてなんですが。
C言語というと標準ライブラリのstdio.hというイメージがまとわりついて。
組み込み系でもstdio.hを使用して書いていくのでしょうか?
やはり、その企業のライブラリを使うのでしょうか?
そこらへんがよくわからないのですが、stdio.hだと出力などですよね?
たとえば自動販売機などの値段表示などstdio.hのprintf表示してるんですか?
組み込み系といってなかなかイメージがわきません。
C言語入門の本などで組み込み系の仕事もこなせるのでしょうか?
そこらへんを教えてください。
71デフォルトの名無しさん:2008/12/21(日) 19:17:40
>>70
組み込み系に標準出力とか普通無い。

自販機の値段制御はLEDの制御ってことになるな。
ドライバだとメモリマップドIOでメモリ読み書きしてLEDの明滅制御したりする。
上層のアプリだとドライバ担当の人が作ったライブラリとかで、
LED_SetPrice(100); // 100円表示
見たいな感じか?
72デフォルトの名無しさん:2008/12/21(日) 19:17:48
制御系や組み込みは専用スレがあるから、そっちでどうぞ
73デフォルトの名無しさん:2008/12/21(日) 19:29:51
71さん、ほーそういうドライバ作ってくれる担当者がいるんですね。
そういう電光掲示板みたいな出力もプログラマがアセンブラで全て自作してやるかと思ってました。
転職なんですが、C言語を使うプログラマの場合やっぱり頭はフル回転で作業するのでしょうか?
それともSEが指示した通りに書いてバグとかは自分で考えてやるというものでしょうか?
いきなり、在庫管理をするソフトを作れと言われても経験を積んでない場合、その企業の上司が教えてくれたり。
関数とかも最初は説明をうけたりしてちゃんと文法とかわかってれば通用するもんですか?
スレ違いなようですが、こっちは栄えてるのでその道の経験者が多いような気がしてこちらに質問してます。
74デフォルトの名無しさん:2008/12/21(日) 19:31:28
マ板行け
75デフォルトの名無しさん:2008/12/21(日) 19:38:36
向こうのスレの住民に喧嘩売ってんのかコイツ
76デフォルトの名無しさん:2008/12/21(日) 19:39:30
つか、自治厨のほうがうざい。
77デフォルトの名無しさん:2008/12/21(日) 19:40:57
栄えてる所がいいならN速でも行けばいい。
78デフォルトの名無しさん:2008/12/21(日) 19:42:53
>53
|「規格が明確に定義していない」には3種類あって、以下のように定義されている。

|・処理系定義(implementation defined)の動作
|どう動作するかを実装が選択する。そのプログラムがコンパイルできないというのは許されない。
|(この構成概念を使ったプログラムは誤りというわけではない。)
|(実装が)何を選んだかは(コンパイラの作者が)文書にしておかなければならない。
|規格が合法な動作をいくつか用意していてそこから選ぶことができるかもしれないし、
|必要条件をとくに課していないかもしれない。

|・未規定(unspecified)の動作
|処理系定義の動作に似ている。ただし、どういう動作を選んだかは文書にする必要がない。

|・未定義(undefined)の動作
|本当に何が起きても不思議はないことを意味する。規格は何の必要条件も課さない。
|コンパイルできないかもしれないし、誤った動きをするかもしれないし
|(クラッシュしたり黙って誤った結果を出したり)、
|あるいはたまたまプログラマの意図したとおりの動きをするかもしれない。
79デフォルトの名無しさん:2008/12/21(日) 19:43:04
すみません、他の掲示板で質問しようとしたんですが。
また同じ文章を書くのが大変で、コピペしたら、マルチポストなどと言われてしまったことがあり
つい質問を続けてしまいました。すみませんm(__)m
80デフォルトの名無しさん:2008/12/21(日) 19:43:37
誰だよお前
81デフォルトの名無しさん:2008/12/21(日) 20:21:46
fopenでファイル開いて、ストリーム中の特定の部分(データ)だけ削除して、
それ以降のデータを手前に詰めたい(リスト構造でデータを削除するそれと同じ感じ)
んだけど、何かよい標準関数ないですかね?もし自分で実装するなら、
どういうアルゴリズムがいいでしょ?
82デフォルトの名無しさん:2008/12/21(日) 20:24:26
リスト構造は別にデータを詰めないでしょ。
配列構造だな。
普通に地道に詰めるしかないと思うよ。
強いて言うなら、ファイルの書き込みに失敗した時にファイルが壊れて欲しくないなら、
一旦別ファイルを作って、成功したときのみリネームするようにした方がいい。
83デフォルトの名無しさん:2008/12/21(日) 21:06:48
さすがプログラム板のスレ。
きびしいぃ。
普段苦労しているいるんだろうなぁ

スレに沿った話題はフレンドリーなのにねw
84デフォルトの名無しさん:2008/12/21(日) 21:07:59
どれを厳しいといってるのだろう。
8581:2008/12/21(日) 21:33:50
>>82
thx。詰めるって表現が間違ってた。
ABCDEFGHIJKLMNO
のうちGHを削除↓
ABCDEFIJKLMNO
って感じ。何か無意味なデータを詰めるんじゃないんです。
最初にEOFまでのサイズ取得しておいて、削除したらその手前までのseekサイズを差し引いた分
どっかに退避して、fwiteしなおすしかないかな。。。
86デフォルトの名無しさん:2008/12/21(日) 21:37:23
ABCDEFGHIJKLMNO

ABCDEFGHONMLKJI

ABCDEFIJKLMNOHG
87デフォルトの名無しさん:2008/12/21(日) 21:38:34
>>85
>>82は、そういう意味でのアドバイスだろ。
88デフォルトの名無しさん:2008/12/21(日) 21:41:22
>>85
標準関数でなくてよかったら、ファイルの長さを変える関数はあるだろうから、
ファイルの中身をそう書き換えて、ファイルを短くすればいいよ。
89デフォルトの名無しさん:2008/12/21(日) 21:44:05
>>85
いや、特に表現に間違いはないが・・・。
リスト構造の場合は、要素を削除しても要素の位置は変わらない。
次の要素がどこにあるかって情報を持ってるからね。
でも配列の場合は間を詰める必要がある。
だからこの構造はリストじゃなくて配列だ。

ファイル直書き換えは不慮のエラーが会った時に問題があるし(ファイルが壊れる)、
標準関数にはファイルの長さを変える関数もないので、
新しくファイルを作って、成功したときのみリネームした方が無難。
9082:2008/12/21(日) 22:25:15
>>87
仰るとおり。
メモリ空間上では、データの位置は変わってませんね。

>>88
そんな関数があるんだ・・・。調べてみるよ。

>>89
「新しくファイルを作る」ですか。または、データ削除前に
一発ファイルコピってから操作開始でもOKですよね?

とりあえず、データ壊さないように弄ってミマス。

>>86
ごめん、これ見ただけじゃ、俺にゃ理解できないお。
逆順に並べ替える何かあるの???
91デフォルトの名無しさん:2008/12/21(日) 22:47:05
同じような考え方を持ってる人がいるんですね。
あのCM内容は在日や韓国が日本を支配するみたいな感じですね。
飛んでる飛行機とか韓国軍の飛行機みたいだし、「この国は我々の物だ!」とか言ってる時点でそう感じる。
あのCM見るとすごい不愉快になるし、ムカツイてきます。
在日の存在や韓国の実態を知らない人はあのCMを見てなんとも思わないんでしょうね。
今頃、あのCMを作った人や在日や韓国人は笑っているでしょうね。

あのCM内容でパチンコ業界のすべてがわかります。 反日だということを!
パチンコは日本の癌です。
92デフォルトの名無しさん:2008/12/22(月) 00:58:51
日時情報の機軸を、紀元(1970年1月1日00:00:00 UTC)になっていますが
それを変更(機軸変更)して、例えば、その日の(00:00:00)に、したい場合
どうすればいいでしょうか?

9392:2008/12/22(月) 01:01:35
紀元(1970年1月1日00:00:00 UTC)から、その日の(00:00:00)に
したいんです。

3600*〜などにすべきなのでしょうか?
94デフォルトの名無しさん:2008/12/22(月) 01:14:54
3600*〜とか絶対にしちゃ駄目。
閏年とか考慮しやがらねえつもりだろ。

tm 構造体を使った関数を参照するといい。
95デフォルトの名無しさん:2008/12/22(月) 01:31:33
基軸変更って発想がたぶん間違い。
当日0時からの秒数が知りたいなら、そう質問すべき
9692:2008/12/22(月) 02:16:31
>>94
はい、すみません。。。

>>tm 構造体を使った関数を参照するといい。
今、調べていますが難しい・・・・


>>95
はい、まさにそうです。
どうやって、求めるか悪戦苦闘中です。
9792:2008/12/22(月) 02:37:51
tm構造体で、固定するんですね
98デフォルトの名無しさん:2008/12/22(月) 02:41:30
全レスうぜえ
9995:2008/12/22(月) 02:45:51
>>96
汎用的には localtime()とmktime()を使ってごちゃごちゃ
やるんだろうけど、0時から秒数なら単にこんな感じでいいのでは?

time_t t = time(0); 
struct tm *p = localtime(&t); 
return p->tm_hour * 3600 + p->tm_min * 60 + p->tm_sec;
10092:2008/12/22(月) 02:58:34
>>99
ありがとうございます。。。
とても、難しいです。

time_t t = time(0);の、0はNULLと同じでしょうか?
tm_hour * 3600 でどうして3600秒をかけるのでしょうか?

参考書レベルを凌駕していて、変な質問ですみません。。
101デフォルトの名無しさん:2008/12/22(月) 04:33:57
おちつけ
102デフォルトの名無しさん:2008/12/22(月) 07:13:13
当日0時からの秒数なら 3600*〜で別にええべ
103デフォルトの名無しさん:2008/12/22(月) 07:14:55
当日0時からの別の日のある時間までの時間を取得したい場合は
やっぱり tm 構造体使わないとダメだな。
104デフォルトの名無しさん:2008/12/22(月) 07:47:30
#include<stdio.h>
#include<time.h>
int main(void){
unsigned long x;

x=time(NULL);
x+=60*60*9; // 日本時間 +9:00
x%=60*60*24;
printf("%02lu:%02lu:%02lu = %lu[sec]\n", x/3600, (x/60)%60, x%60, x);
return 0;
}
105デフォルトの名無しさん:2008/12/22(月) 07:57:35
mainは白紙 printfはペン
106デフォルトの名無しさん:2008/12/22(月) 09:32:36
数学わからんから厳しいな
107デフォルトの名無しさん:2008/12/22(月) 10:39:51
>>106
×数学
×算数
○さんすう
108デフォルトの名無しさん:2008/12/22(月) 10:57:17
( ̄□ ̄|||)
算数ですか…
109デフォルトの名無しさん:2008/12/22(月) 11:44:05
>>104
ダメすぎ。なんでlocaltime()を使わないの?
localtime()でstruct tmにばらしたら後は(tm_hour * 60 + tm_min) * 60 + tm_secなのに。
110デフォルトの名無しさん:2008/12/22(月) 14:27:56
環境:Redhat
コンパイラ:gcc

やりたいこと:実行ファイルを実行した時、実行ファイルの格納されているディレクトリを取得したい。

例:
~/hogeという実行ファイルがあるとして

#/home/user/hoge
/home/user

#cd /home/user
#./hoge
/home/user
111デフォルトの名無しさん:2008/12/22(月) 14:48:43
板違いだけど
#include <stdio.h>
int main() {
char buf[1024];
readlink("/proc/self/exe", buf, 1024);
printf("%s\n", buf);
return 0;
}
112デフォルトの名無しさん:2008/12/22(月) 14:51:57
n個の抵抗値を算出するプログラムなんですが

#include<stdio.h>
int main(){
int data[1000]; //数値
int teikou; //抵抗値
int n; //n個
int i; //for文用

printf("抵抗値の数を入力:");
scanf("%d",&n);
for(i=0;i<n;++i){
printf("data[%d] = ???:",i);
scanf("%d",&data[i]);
}
for(i=0;i<n;++i){
teikou += teikou + data[i];
}
teikou = teikou / n;
printf("抵抗値は%dΩです。",teikou);

return(0);
}
でコンパイルすると、
for(i=0;i<n;++i){
printf("data[%d] = ???:",i);
scanf("%d",&data[i]);
}
ここまではうまくいってくれますが、それ以降でエラーを出します。
どこの書き方がまずいんでしょう?
113デフォルトの名無しさん:2008/12/22(月) 14:52:19
>>111
ありがとう。

解決方法へのリンク
http://ml.tietew.jp/cppll/cppll_novice/thread_articles/756
114デフォルトの名無しさん:2008/12/22(月) 15:00:32
>>112
nの数が定義されていないけど。
115デフォルトの名無しさん:2008/12/22(月) 15:05:57
>>112
何で平均してるのかは置いといて、
「エラー」ってだけで伝わると思ってるの?
116デフォルトの名無しさん:2008/12/22(月) 15:10:40
#include<stdio.h>
int main()
{
  int* data; //数値
  data = (int*)malloc(sizeof(int) * n);
  //ここにdataを使う処理を書く
  free(data);
  return(0);
}

すまん。nは設定してたね。
抵抗の値が1001個を入力した時に落ちると思うから
上のように動的にメモリを確保したほうがいいよ。
117デフォルトの名無しさん:2008/12/22(月) 15:28:30
118113:2008/12/22(月) 15:36:07
>>117
見てなかった。
良くない設計って書いてるね。

Windowsでの開発とはお作法が違うね。
119112:2008/12/22(月) 16:10:32
>>115
並列接続ですので、個数で割ってます。
エラーというのは、コンパイル終わったあとに、コマンドラインで実行中にエラーが出て強制終了してしまうと言う意味でした。
説明不足すみません。

>>116
今回には反映させてないんですが、次回からの参考にさせていただきます。有難うございます。

考えてみた結果、コマンドラインで実行中にエラーで強制終了する理由は、
teikou += teikou + data[i]; ここでteikouを初期化してなかったのが問題だったようです。
しかし、これを直してみても、ちゃんと値が反映されなかったのですが、それの理由が
teikouを動的変数にしていなかったのが問題だったようです。
120112:2008/12/22(月) 16:11:34
最終的にこのようなソースで、出来上がりました。
レスくれた方、ありがとうございます。

#include<stdio.h>
int main(){
int data[1000]; //数値
static int teikou = 0; //抵抗値 初期化
int n; //n個
int i; //for文用
char line[100];

printf("抵抗値の数を入力:");
fgets(line,sizeof(line),stdin);
sscanf(line,"%d",&n);
for(i=0;i<n;++i){
printf("data[%d] = ???:",i);
fgets(line,sizeof(line),stdin);
sscanf(line,"%d",&data[i]);
}
for(i=0;i<n;++i){
teikou += data[i]; //teikouは動的変数
}
printf("抵抗値は%dΩです。",teikou / n); //並列接続なので個数で割る

return(0);
}
121デフォルトの名無しさん:2008/12/22(月) 16:34:42
何で並列だと平均なのさ。
それよりstatic付けたら静的だし、
そこはエラーと関係無いと思うんだけどな。
なんつーエラーか結局不明だし。
まぁ出来上がったってならいいか。
122デフォルトの名無しさん:2008/12/22(月) 16:41:09
>>120
具体的な例を出すと、答えやすかったと思うよ。

例えば、
抵抗値の数を入力:3
data[%d] = ???:"1
data[%d] = ???:"2
data[%d] = ???:"3
抵抗値は10Ωです。

となってほしいが、現状はこうなっているみたいに。
エラーが起こるだけだと抽象的すぎて、何が起こってるのか想像しないといけないだろ?
123デフォルトの名無しさん:2008/12/22(月) 16:49:39
>>121-122
SSうpしました。
http://www2.uploda.org/uporg1874557.jpg
こういったエラーです。
今後気をつけます!すみません。
ってか平均を求めるのはたしかにおかしいですね。
精液と動的の違いもごっちゃになっているので、勉強しなおします。。
124デフォルトの名無しさん:2008/12/22(月) 16:51:26
>>123
エラーメッセージの英語ぐらい読めないのか?
The variable 'teikou' is being used without being initialized. って、ちゃんと書いてあるのに。
125デフォルトの名無しさん:2008/12/22(月) 16:54:48
>>124
読んでませんでした。すみません。
126デフォルトの名無しさん:2008/12/22(月) 16:59:22
>>125
まぁ最初はそんなもんだよ。

次からは、
エラーメッセージを読む。
質問の仕方を考える。

の2点が学べてよかったじゃないか。
127デフォルトの名無しさん:2008/12/22(月) 17:01:47
>>126
ありがとうございます。頑張ります。
128デフォルトの名無しさん:2008/12/22(月) 17:10:02
あるテキストファイルがあるとして
その分析をしたいんだけど。
つまりこの空白には\tがはいってるのかとか

そういうのってCで書けるっけ?
129デフォルトの名無しさん:2008/12/22(月) 17:15:39
おまえの口調が気に入らない
130デフォルトの名無しさん:2008/12/22(月) 17:23:20
>>128
ファイルを1バイトずつ読んで、タブがあるか調べればいいんじゃね?
131デフォルトの名無しさん:2008/12/22(月) 17:24:52
>>123
>平均を求めるのはたしかにおかしいですね。
うわー俺も忘れてる。「和分の積」だっけ。
>精液と動的の違いもごっちゃになっているので
どう見ても精(ry本当に(ry

>>128
開いて読んでナメて閉じる。
132デフォルトの名無しさん:2008/12/22(月) 17:32:06
(データをくまなく見る事なんだろうな)
133デフォルトの名無しさん:2008/12/22(月) 17:48:49
int a, b, c;
a=1,b=2,c=3;
a+=2,b+=2,c+=2;//ここをスマートに書くことは出来ますか?
134デフォルトの名無しさん:2008/12/22(月) 17:49:58
書くことができたとしても、実行時は同じになるだろ
135デフォルトの名無しさん:2008/12/22(月) 17:51:50
int a = 3, b = 4, c = 5;
136デフォルトの名無しさん:2008/12/22(月) 17:52:40
>>134
まずは、出来るのですか、出来ないのですか
出来るのであればご教授ください
137デフォルトの名無しさん:2008/12/22(月) 17:54:05
>>135
すみません。初期化は私が望むものではありません
138デフォルトの名無しさん:2008/12/22(月) 17:57:14
>>137
後出しは不可
139デフォルトの名無しさん:2008/12/22(月) 17:57:41
>>138
分からないならもういいです
140デフォルトの名無しさん:2008/12/22(月) 17:58:55
>>138
どこが後出しなの?
141デフォルトの名無しさん:2008/12/22(月) 17:59:50
俺は教授じゃねえよ
142デフォルトの名無しさん:2008/12/22(月) 18:01:06
>>141
揚げ足取りですか
143デフォルトの名無しさん:2008/12/22(月) 18:02:54
前後関係がわからないけど、a,b,cを配列にすればいいんじゃないの?
144デフォルトの名無しさん:2008/12/22(月) 18:03:22
>>133
無理
145デフォルトの名無しさん:2008/12/22(月) 18:44:05
複数の変数の値を一括で2加えるような操作をしたいということだよね
146デフォルトの名無しさん:2008/12/22(月) 19:16:15
>>133
int a, b, c;
a=3,b=4,c=5;
147デフォルトの名無しさん:2008/12/22(月) 19:44:37
orz = 3 ブッ or2 = 4 ブッ Orz = 5 ブッ 
148デフォルトの名無しさん:2008/12/22(月) 19:55:00
>>133
int __attribute__((aligned(16))) abc[] = {1, 2, 3, 0};
_mm_store_si128(abc, _mm_add_epi32(_mm_load_si128(abc), _mm_set1_epi32(2)));
149デフォルトの名無しさん:2008/12/22(月) 20:05:00
>>133
int *helo[4] = {&a, &b, &c,};
for(int i = 0; helo[i]; i++){
 *helo[i] += 2;
}
150デフォルトの名無しさん:2008/12/22(月) 21:30:28
int a = 1, b = 2, c = 3;
a += (b += ((c += 2) - c + 2)) - b + 2;
151デフォルトの名無しさん:2008/12/22(月) 21:49:32
「スマートに書く」とはどういうことなんだ>>133
152デフォルトの名無しさん:2008/12/22(月) 21:54:27
#define SIZE (3)
int i;
int a[SIZE];
for (i = 0; i < SIZE; i++) {
 a[i] = i + 1;
}
for (i = 0; i < SIZE; i++) {
 a[i] += 2;
}
153デフォルトの名無しさん:2008/12/22(月) 22:13:24
プログラミング作法のqsortの比較関数で、
int scmp(const void *p1, const void *p2)
{
char *v1, *v2;
・・・

というのがでてきたんですが、
vって何の略なんですか?
他の関数の仮引数でもたまに見かけたりするので気になりました。
154デフォルトの名無しさん:2008/12/22(月) 22:14:22
>>153 vakueのvとおもわれ
155デフォルトの名無しさん:2008/12/22(月) 22:14:56
まちげえたvalueな
156デフォルトの名無しさん:2008/12/22(月) 22:17:24
ばきゅう
157153:2008/12/22(月) 22:30:14
>>155
ありがとす
158デフォルトの名無しさん:2008/12/22(月) 23:37:02
intとは何の略ですか?
159デフォルトの名無しさん:2008/12/22(月) 23:38:43
いんてじゃー
160デフォルトの名無しさん:2008/12/22(月) 23:39:59
イニシャライズの略です
161デフォルトの名無しさん:2008/12/22(月) 23:46:08
>>160
釣りかもしれんがそれはinit
162デフォルトの名無しさん:2008/12/22(月) 23:51:03
character 文字
short integer 短い整数
integer 整数
long integer 長い整数
floating point number 浮動小数点数
double precision floating point number 倍精度浮動小数点数
strucutre 構造体
external declaration 外部宣言
163デフォルトの名無しさん:2008/12/22(月) 23:58:17
いにゅーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーむ
164デフォルトの名無しさん:2008/12/22(月) 23:59:28
enumerator 列挙子
165デフォルトの名無しさん:2008/12/23(火) 00:04:18
湯にオーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーん
166デフォルトの名無しさん:2008/12/23(火) 00:06:00
union は略じゃないお・・・
167デフォルトの名無しさん:2008/12/23(火) 00:07:04
うにおん
168デフォルトの名無しさん:2008/12/23(火) 00:26:51
未だに

 int func();

int func(a, b, c)
int a;
int b;
int c;
{

}

のような書き方してる人が居るんだけど、
コンパイルは通るんだろうけど、有りなの?
169デフォルトの名無しさん:2008/12/23(火) 00:32:09
>>168
Ansi-C以前のいわゆるK&RのC。
特殊なオプションをつけないとコンパイル通らないんじゃないかな?
170デフォルトの名無しさん:2008/12/23(火) 00:34:32
RubyのソースってK&Rの書き方だよな。
今のバージョンは知らんけど、わりと最近のバージョンまで。
171デフォルトの名無しさん:2008/12/23(火) 00:42:23
gccでコンパイルしたら通った>>168
172デフォルトの名無しさん:2008/12/23(火) 00:52:37
特に弊害が生じない記法だもの
トリグラフなんかとちがって
173デフォルトの名無しさん:2008/12/23(火) 01:14:12
エラーにはならんだろ・・・
「古い形式です」って警告は出るかもしらんが。
174デフォルトの名無しさん:2008/12/23(火) 01:19:13
K&R式だと、コンパイル時に引数の数と型のチェックをしてくれない
つまらないケアレスミスをデバッグまで引きずることになる
そういう意味で生産性が低い
175デフォルトの名無しさん:2008/12/23(火) 01:19:30
floatとかshortがあるとわやだがな。
176デフォルトの名無しさん:2008/12/23(火) 07:45:42
道民発見
177デフォルトの名無しさん:2008/12/23(火) 10:30:18
数値計算だけだとCよりフォートランのほうがつおいの?
178デフォルトの名無しさん:2008/12/23(火) 10:32:31
コボルもつおいお
179デフォルトの名無しさん:2008/12/23(火) 15:05:06
>>176
どこに?
180デフォルトの名無しさん:2008/12/23(火) 16:12:36
二次元配列で2.481784 43.755463 というまともな数値がでてる中で


-1606070790904610816.000という変な数値がでてしまうときは
どういう時ですか?
181デフォルトの名無しさん:2008/12/23(火) 16:37:05
最近ちょっと凝ったマクロを使い始めてCが楽しくなってきたところなんだけど、便利なマクロ集みたいなサイトあるかな?
マクロで作った関数もどきはインライン展開されるから、関数呼び出しのオーバーヘッドが無いんだってね。
182デフォルトの名無しさん:2008/12/23(火) 16:38:45
だからって早くなるとは限らないけどな
183デフォルトの名無しさん:2008/12/23(火) 16:47:48
関数呼び出しを関数もどきのマクロに変えて速くなった、と。
とりあえず双方のコードをさらしてほしい。
184デフォルトの名無しさん:2008/12/23(火) 16:56:59

>>181
C言語@便利なマクロ
http://pc11.2ch.net/test/read.cgi/tech/1144824670/

今時なら、inline付けてくれよ。マクロを必要悪として、私は認めているけど、できるだけ使ってほしくない。
185デフォルトの名無しさん:2008/12/23(火) 17:02:03
staticな関数はinline展開してくれることもあるし
186デフォルトの名無しさん:2008/12/23(火) 17:05:47
マクロ多い他人のソース見てると「どんだけ飛ばす気だ」って思う
元の処理に戻るのが一苦労だぜ
187デフォルトの名無しさん:2008/12/23(火) 17:06:38
一箇所の記述にするためのトリックとしてマクロを駆使することはあるな

#if defined(M_READ)
#define IMP(arg, ID) arg = GetDlgItemInt(ID)
#elif defined(INIT)
#endif defined(M_WRITE)
#define IMP(arg, ID) SetDlgItemInt(ID, arg)
#endif

a.inl
IMP(memA, IDC_EDIT1)
IMP(memB, IDC_EDIT2)

----
#define M_READ
foo()
{
#include "a.inl"
}

#undef M_READ
#define M_WRITE
bar()
{
#include "a.inl"
}

ま、開発環境側がメンバ追加時に 記述すべき部分を補間してくれるなら
こういう技巧も無駄だろうけど
188デフォルトの名無しさん:2008/12/23(火) 18:45:12
そういう条件で意味が変わるマクロは、ソースを追うのが
困難になるのでいやだなあ

あと #endif defined は typo だよね
189デフォルトの名無しさん:2008/12/23(火) 18:48:25
#ifdef 禁止
190デフォルトの名無しさん:2008/12/23(火) 19:52:10
inlineにするとプログラムサイズが増えるというデメリットをちゃんと認識しておけよ
191デフォルトの名無しさん:2008/12/23(火) 23:05:21
>>177
数値計算でCとFortran
同じじゃないの
ただし、Cでは複素数

192デフォルトの名無しさん:2008/12/23(火) 23:09:15
>>180
変数を初期化してない時。
あるいは初期化してない変数を使って計算した時。
193デフォルトの名無しさん:2008/12/24(水) 00:05:10
#define A 5
#define B ((int)(sqrt(A)*100))

int x;
x = B;

gccを使ってコンパイルしています。
上記の場合、Bは常に223になると思うのですが、
実行時に平方根を計算するのではなく、コンパイル時にBが223まで
展開されるような最適化オプションはあるのでしょうか?
実行時にsqrt関数が呼ばれないようにしたいです。


194デフォルトの名無しさん:2008/12/24(水) 00:14:14
__builtin_sqrtとか
195デフォルトの名無しさん:2008/12/24(水) 00:16:19
((int)(sqrt(A)*100))の計算結果を使う
196デフォルトの名無しさん:2008/12/24(水) 00:23:12
苦肉の策だが。

#define CONCAT_(a, b) a ## b
#define CONCAT(a, b) CONCAT_(a, b)
#define STATIC_ASSERT(expr) typedef char CONCAT(STATIC_ASSERT_, __LINE__)[(expr) ? 1 : -1]

#define SQRT_A (2.236067977499790)
#define A (5)
#define B ((int)(SQRT_A * 100))

STATIC_ASSERT((A - SQRT_A * SQRT_A) < DBL_EPSILON * A);
STATIC_ASSERT((A - SQRT_A * SQRT_A) > -DBL_EPSILON * A);
197デフォルトの名無しさん:2008/12/24(水) 00:28:19
UNIXで使用できるファイル削除のC言語の関数ってなんていう名前ですか?
fwriteとかfeofなんかと同じANSIな感じで。
198デフォルトの名無しさん:2008/12/24(水) 00:29:09
199デフォルトの名無しさん:2008/12/24(水) 00:30:50
unlinkとかremoveじゃね?
200デフォルトの名無しさん:2008/12/24(水) 00:31:22
>>198-199
ありがとうございます!

201デフォルトの名無しさん:2008/12/24(水) 00:37:10
>>194-196
レスありがとうございましたm(_ _)m
builtin関数は知らなかったのでググってみます。
>>196さんの例は難しくてまだ理解できていませんがコンパイルして試してみようと思います。
ありがとうございました。
202デフォルトの名無しさん:2008/12/24(水) 00:40:49
>>196
結局>>195と同じこと
ただ、平方根として成立してるかはチェックしてるという
203デフォルトの名無しさん:2008/12/24(水) 01:05:35
一時変数のi.j.kはどうしてi.j.kが使われるようになったの?
204デフォルトの名無しさん:2008/12/24(水) 01:06:38
数学の数列のノリじゃねーの?
205デフォルトの名無しさん:2008/12/24(水) 01:13:06
繰り返すリロード、沸き上がるときどきの雑記帖
206デフォルトの名無しさん:2008/12/24(水) 01:16:10
そんなこと、今さらどうでも良ーじゃーんか(i - j k) なんつって
207デフォルトの名無しさん:2008/12/24(水) 01:20:38
なぁ、このスレ住人全員が力合わせたら、どんなプログラムでも組めそうじゃないか?
プログラムで誰かを救えないかな
208デフォルトの名無しさん:2008/12/24(水) 01:34:53
宿題でもやってその辺の学生救っとけば?
209デフォルトの名無しさん:2008/12/24(水) 02:31:28
>>203
Fortranの影響かな

Wikipedia-Fortran
> Fortran暗黙の型宣言 Wikipedia-Fortranより
> ・ 整数型(変数名の先頭がI〜Nのもの)
> ・ 実数型(上記以外)

ちなみにIはIntegerのI。実数(Real Number)はR以降の文字をよく使う。
210デフォルトの名無しさん:2008/12/24(水) 02:33:56
何かしら名残というものは、残っているもんですな。
211デフォルトの名無しさん:2008/12/24(水) 02:48:52
そういえばそんなルールあったなぁ。。
212デフォルトの名無しさん:2008/12/24(水) 10:30:40
>>209
で、それの元が>>204
213デフォルトの名無しさん:2008/12/24(水) 11:00:06
#bmi.h#
void bmi(void)
{
double height,bmi;
int weight,high;
printf("身長\n");
scanf("%d",&high);
printf("体重\n");
scanf("%d",&weight);
height=high/100.0;
bmi=weight/(height*height);
printf("BMI:%1.1f\n",bmi);
if(bmi>30){
printf("ピザ\n");
}else if(bmi>25){
printf("普通\n");
}
else if(bmi>18.5){
printf("ちょい痩せ\n");
}
else if(bmi<18.5){
printf("痩せガリ\n");
}
else if(bmi<18.5){
printf("キモガリ\n");
}
}
214デフォルトの名無しさん:2008/12/24(水) 19:13:29
>>21
25オーバーで普通ってどんだけキモオタ仕様なんだよww
おまけに18.5アンダーの比較が二箇所あるし。

一応書いておくぞ。
肥満4度:40オーバー
肥満3度:35オーバー
肥満2度:25オーバー
やせ:18.5アンダー
215デフォルトの名無しさん:2008/12/24(水) 19:21:07
>>214
レス番レス番w >21じゃなくて>213だろ。

>>120
今更だけど、並列の場合は逆数の和の逆数だね。
216デフォルトの名無しさん:2008/12/25(木) 01:50:20
return(0);とreturn 0;はどう違うんですか?
217デフォルトの名無しさん:2008/12/25(木) 01:54:19
>>216
格好が違います。
218デフォルトの名無しさん:2008/12/25(木) 02:01:11
普通は後者
無くていいものを付けてるのが前者
returnを関数と誤解してる奴が書いてそうなのが前者
馬鹿っぽく見えるのが前者
219デフォルトの名無しさん:2008/12/25(木) 02:12:13
ただし、昔は括弧つけないといけなかったらしい。
220デフォルトの名無しさん:2008/12/25(木) 02:14:07
adj[i][j]
って何ですか?
221デフォルトの名無しさん:2008/12/25(木) 02:15:18
二次元配列
222デフォルトの名無しさん:2008/12/25(木) 02:16:34
>>220
配列の配列
223デフォルトの名無しさん:2008/12/25(木) 02:18:07
>>216
 違いは、詰めて書けるか書けないか。オクテット分削れるか削れないか。
returnを例えば、関数マクロでラップしていたら前者になると思う、見たこと無いけどね。
if (), for (), while (), switch ()なので、retrun も()付ける人がいたりする。
 しかしながら、見易さの問題でしかないと思う。例えば、式がキャストやビット演算を含む場合は、付けると見易くなる場合が多い。
return foo & ~bar; return ( foo & ~bar );ソースコードに統一感が無いと批判されるだろうが、私は、使い分けている。
224デフォルトの名無しさん:2008/12/25(木) 02:19:34
>>219
K&R の初版では括弧がついていたそうですよ。
225デフォルトの名無しさん:2008/12/25(木) 06:34:16
括弧の内側を開ける人って、見易くした積もりなのかね。妙に間が悪いというか、間抜けに見えるだけなんだが。
226デフォルトの名無しさん:2008/12/25(木) 06:36:56
return( a+b );
227デフォルトの名無しさん:2008/12/25(木) 07:09:14
C の場合は ( ) をつけると return を typo してもコンパイルされてしまうが、
リンクエラーになるのであまり気にしなくていい。
228デフォルトの名無しさん:2008/12/25(木) 07:11:56
ただし、その場合、エラーの検出がリンク時まで遅れる。
リンクまでに時間がかる処理系の場合、typoをしないこと。
229デフォルトの名無しさん:2008/12/25(木) 07:13:32
>>225
俺も一時期開けてたが、空きすぎると間が抜けて据わりが悪いと気づいて開けなくなった。
230デフォルトの名無しさん:2008/12/25(木) 11:04:29
>>223 が return を retrun と typo している件について
231デフォルトの名無しさん:2008/12/25(木) 11:07:58
気付いたけどスルーした
232デフォルトの名無しさん:2008/12/25(木) 15:03:49
typoってタイプミスのことなんだな。
かわいいな。
233デフォルトの名無しさん:2008/12/25(木) 15:55:15
デザインパターンがまるで分かりまa
データ構造を組み合わせた場合の管理とか
234デフォルトの名無しさん:2008/12/25(木) 15:59:45
最もCの実力があるプログラマはどこで働いているのでしょうか?
235デフォルトの名無しさん:2008/12/25(木) 16:27:52
MS
236デフォルトの名無しさん:2008/12/25(木) 16:53:20
>>233
最初はわからんでもいい
大規模なプログラムを組むようになるとデザパタの有り難みを
痛感するよ
237デフォルトの名無しさん:2008/12/25(木) 17:12:25
Cでデザパタってのも変な話
238デフォルトの名無しさん:2008/12/25(木) 18:08:51
別に変じゃない。
239デフォルトの名無しさん:2008/12/25(木) 18:27:14
まんま実装しようとすると逆に苦労するようなものもあるだろうが
考え方や設計点の整理をつけるというところは無駄じゃないかと
240デフォルトの名無しさん:2008/12/25(木) 19:29:09
米国国防省とか?
241デフォルトの名無しさん:2008/12/25(木) 20:00:37
>>218
何が普通とか無いからw
242デフォルトの名無しさん:2008/12/25(木) 20:06:37
意味わかんねーことしてる奴が馬鹿に見えるのは普通だろ
243デフォルトの名無しさん:2008/12/25(木) 20:33:56
>>241
お前が括弧付ける派で悔しがってるのはわかった
244デフォルトの名無しさん:2008/12/25(木) 20:34:01
>>218
> returnを関数と誤解してる奴が書いてそうなのが
> 馬鹿っぽく
主観ばかりで根拠が無い
245デフォルトの名無しさん:2008/12/25(木) 20:45:13
>>244
お前が括弧付ける派で悔しがってるのはわかった
246デフォルトの名無しさん:2008/12/25(木) 20:49:45
returnには付けないけどsizeofには付けてます
考えてみるるとちょっと変だ
247デフォルトの名無しさん:2008/12/25(木) 20:50:13
それは付けないとだめな場合があるじゃんw
248デフォルトの名無しさん:2008/12/25(木) 20:58:54
>>245
> お前が括弧付ける派
意味不明。俺はつけない派だしw
249デフォルトの名無しさん:2008/12/25(木) 20:59:50
>>247
> それは付けないとだめな場合があるじゃんw
へ?sizeof演算子も知らないとは、主観ばかりで
客観的な動作に対する説明が出来ないなら、黙ってろよ。
誰もお前の意見なんて聞いてない。
250デフォルトの名無しさん:2008/12/25(木) 21:03:11
>>249
>へ?sizeof演算子も知らないとは、主観ばかりで
>客観的な動作に対する説明が出来ないなら、黙ってろよ。
>誰もお前の意見なんて聞いてない。

自分に対するレスを予想したんだね
251デフォルトの名無しさん:2008/12/25(木) 21:53:51
初歩的なことだと思うのですが質問させてください。

10進数を2進数に変換するプログラムを作りたいと思っています。
10進数を2で割ったあまりをならべると2進数になると聞いたので、以下のようなプログラムを書いてみました。

実行してみると、どんな数値を入力しても
124500412450001244996124499212449881244984124498012449761244972
が表示されます。どこがいけないのでしょうか?
252デフォルトの名無しさん:2008/12/25(木) 21:54:58
>>251
お前の書いたプログラム
253デフォルトの名無しさん:2008/12/25(木) 21:58:19
わろたw
254デフォルトの名無しさん:2008/12/25(木) 21:58:39
コードを貼ろうと思ったら、長すぎて書き込めませんとか言われて、
いま焦ってるところだろ?
255デフォルトの名無しさん:2008/12/25(木) 21:58:53
>>251
10進数を2で割ったあまりが4や5になるわけがない

そのプログラムをさらしてみ
256デフォルトの名無しさん:2008/12/25(木) 22:02:12
プログラム貼るのを忘れていました^^;

#include <stdio.h>
main()
{
int x ,i ,z[10];

scanf("%d",&x);

for(i=0; i>9; i++){
z[i]=x%2;
x=x/10;
}

for(i=9; i>0; i--){
printf("%d",&z[i]);
}
return 0;
}
257デフォルトの名無しさん:2008/12/25(木) 22:02:19
>以下のようなプログラムを書いてみました。
プログラムがありません
258デフォルトの名無しさん:2008/12/25(木) 22:02:52
printf("%d",&z[i]);
何これ
259デフォルトの名無しさん:2008/12/25(木) 22:03:32
エスパーチャンスだったのにね
260デフォルトの名無しさん:2008/12/25(木) 22:05:37
x=x/10;がダメ
261デフォルトの名無しさん:2008/12/25(木) 22:05:44
>>256
最初のループが回ってない。
262デフォルトの名無しさん:2008/12/25(木) 22:07:00
いや、これだろ
for(i=0; i>9; i++)
263デフォルトの名無しさん:2008/12/25(木) 22:09:10
なんかいろいろダメだな
264デフォルトの名無しさん:2008/12/25(木) 22:10:33
あっ、for(i=0; i>9; i++)ではなくfor(i=0; i<9; i++)ですよね?
あと、printfをprintf("%d",z[i]);に修正したのですが、実行結果はどの数字を入れても
25600000000
になります・・・
265デフォルトの名無しさん:2008/12/25(木) 22:10:51
あまりにもひどすぎて吹いたwww

ハローワールドからやり直せwwww
266デフォルトの名無しさん:2008/12/25(木) 22:13:49
>>264 だから・・・
x=x/10; > x=x/2;
267デフォルトの名無しさん:2008/12/25(木) 22:14:20
>>264
for(i=0; i<9; i++)
iが何から何までの何回実行されるか考えてみよう
268デフォルトの名無しさん:2008/12/25(木) 22:14:24
発想はいいのに、おしい!
269デフォルトの名無しさん:2008/12/25(木) 22:16:17
#include <stdio.h>
main()
{
int x ,i ,z[10];

scanf("%d",&x);

for(i=0; i<9; i++){
z[i]=x%2;
x=x/2;
}

for(i=8; i>=0; i--){
printf("%d",z[i]);
}
return 0;
}

これでいいかな?
270デフォルトの名無しさん:2008/12/25(木) 22:20:10
>>269
なるほど・・・ありがとうございます

10で割っていくのではなく2で割っていくんですね・・・
271デフォルトの名無しさん:2008/12/25(木) 22:44:41
意味もわからずに書いてたのか…
272デフォルトの名無しさん:2008/12/25(木) 22:45:57
まずは算数・・・Cはそれからだ
273デフォルトの名無しさん:2008/12/25(木) 22:53:53
サン・スーですか、イーアルね
274デフォルトの名無しさん:2008/12/26(金) 00:16:01
最低限覚えてなきゃいけない関数ってどんなものかね
275デフォルトの名無しさん:2008/12/26(金) 00:19:46
そんなの、使用目的によって違う。それよりも、標準ライブラリの基本的な使い方を
理解して、どんなものがあるかさらっと見て、試しに使ってみるしかない。
276デフォルトの名無しさん:2008/12/26(金) 00:23:24
文字列関係とファイルIO(標準入出力も)は知っておかないと、
練習用のコードもかけないな。
277デフォルトの名無しさん:2008/12/26(金) 01:33:46
とりあえず、stdio.hは最低限必要ってことで
278デフォルトの名無しさん:2008/12/26(金) 01:57:39
グーグルでおk
279デフォルトの名無しさん:2008/12/26(金) 09:10:44
>>273
カンフーですね、イー・アルときたら。
280デフォルトの名無しさん:2008/12/26(金) 12:49:22
if( a = B )
この上記の文条件式は
a=0、b=0、代入成功のどれを条件としているの?
281デフォルトの名無しさん:2008/12/26(金) 12:52:08
>>280
どれでもない
282デフォルトの名無しさん:2008/12/26(金) 13:02:28
flag = true
if( flag )
とかしないといけないのか、さすがC
283デフォルトの名無しさん:2008/12/26(金) 13:07:43
>>282
意味不明。 解説求む。
284デフォルトの名無しさん:2008/12/26(金) 13:32:07
>>280
Bはbの間違いだとして
bがaに代入されて、その値が0と比較して等しくなければ条件成立
要するにb!=0だったら成立する
285デフォルトの名無しさん:2008/12/26(金) 13:33:32
>>280
そのどれでもなく、
Bを代入したaが0か非0か
286デフォルトの名無しさん:2008/12/26(金) 14:08:24
Windowでプログラムを作るときはTCHARを使うべき?
自分はwchar_tを使うとすっきりしていいのだが
287デフォルトの名無しさん:2008/12/26(金) 14:16:01
charで何も困ったことがない
288デフォルトの名無しさん:2008/12/26(金) 14:17:56
>>286
環境に依存した話になれば、Cの立場から言えば好きなようにやればよいということになる
その環境内部での手法の良し悪しについてはもはやCの言及するべきことではない
289デフォルトの名無しさん:2008/12/26(金) 14:26:15
>>286
TCHARはMBCSとunicodeをオプション切り替えだけでビルドできるコードを書く時に使う。
そういうコードを書く気がないなら決めうちでいい。
290デフォルトの名無しさん:2008/12/26(金) 18:34:14
wchar_tでなくてWCHARをつかうべき。
291デフォルトの名無しさん:2008/12/26(金) 18:46:08
何が違うんですか?
292デフォルトの名無しさん:2008/12/26(金) 18:46:37
なまえ
293デフォルトの名無しさん:2008/12/26(金) 19:11:20
C言語でPS3のソフトを作りたいんですが。
作れますか?
294デフォルトの名無しさん:2008/12/26(金) 19:56:19
作れます
295デフォルトの名無しさん:2008/12/26(金) 20:00:43
あなたには無理です
296デフォルトの名無しさん:2008/12/26(金) 22:13:24
>>295
君に出来るのか
297デフォルトの名無しさん:2008/12/26(金) 23:24:37
PSで作れるのは知ってるけどSONYにお願いしなきゃいけなかったはず
298デフォルトの名無しさん:2008/12/27(土) 00:39:37
>>293
個人で市販のゲームみたいなのを作りたいということであればほぼ不可能なので諦めてください
会社に入って作る場合もC++になるのでやっぱり諦めてください

とりあえずPS3で動けば何でもいいというのであれば、Linuxインストールすればおk
299デフォルトの名無しさん:2008/12/27(土) 01:46:40
すいません。教えてください。
typedef struct
{
unsigned char blue;
unsigned char green;
unsigned char red;
} RGB;

typedef struct
{
int width;
int height;
RGB* pRgb;
} DATA;
と定義した状態で、
DATA data = { 10 , 20, 0};
data.pRgb = (RGB*)malloc( data.height * data.width * 3);
data.pRgb[0][0].blue = 0;
とやると↑の行で、
error: subscripted value is neither array nor pointer
というコンパイルエラーが出ます。何が間違っていますか。
300デフォルトの名無しさん:2008/12/27(土) 01:49:31
data.pRgb->blue=0の柿間違い
301デフォルトの名無しさん:2008/12/27(土) 01:51:12
ああ、俺も間違えてる。。
data.pRgb[0].blue=0かな。。
302デフォルトの名無しさん:2008/12/27(土) 01:59:30
たぶん
data.pRgb[0][0].blue = 0;

ってのは座標(0, 0)のピクセルのblueって言いたいんでしょ?
pRgbはRGBの一次元配列として認識されているので2次元配列っぽくアクセスすることは出来ないよ。
そういう場合、座標(x、y)なら、
data.pRgb[w * y + x].blue = 0
みたいな感じで座標を一次元配列のindexに変換してアクセス。
303デフォルトの名無しさん:2008/12/27(土) 01:59:36
ありがとうございます。
data.pRgb[someHeight * data.width + someWidth].blue = 0xff;
とやればできました。
ただこういう場合に2次元配列の書き方ではできないものなんですかね。
304デフォルトの名無しさん:2008/12/27(土) 02:04:41
>>300-302
レスありがとうございました。勉強になりました。
305デフォルトの名無しさん:2008/12/27(土) 02:08:47
>>303
技巧的になるけどできなくはないよ。この板で何度も取り上げられている。
でもまぁ、一次元アクセスもポピュラーだから慣れておいてもいいと思う。
どうしても馴染めないなら、int offset(int x, int y, int w) {return x + y * w;}でも作るとか。
306デフォルトの名無しさん:2008/12/27(土) 02:13:12
3じゃなくてsizeof(RGB)を使え
307デフォルトの名無しさん:2008/12/27(土) 02:17:24
typedef struct
{
 int width;
 int height;
 RGB **pRgb;
} DATA;

data.pRgb = (RGB **)malloc( data.height * (sizeof(RGB *) + data.width * sizeof(RGB)));
for(int i=0; i<data.height; i++) data.pRgb[i] = (RGB *)(data.pRgb+data.height) + (data.width * i);

これでいける?
308デフォルトの名無しさん:2008/12/27(土) 02:27:34
ああそうか。例えばdata.pRGB[1][1]と書いた場合にdata.pRgb[0]の位置から何バイト先かが分からないから2次元配列の形式で書けないわけか。
309デフォルトの名無しさん:2008/12/27(土) 02:35:31
そういうこと
Cには多次元配列というものはない、配列の配列があるだけなので、
下位の配列にアクセスするためにはそのサイズを知っていなければいけないが、
配列のサイズを動的に宣言できないから
下位のサイズが動的な配列の配列は作れないのでポインタの配列でまねるしかない
C99ならできるけど
310デフォルトの名無しさん:2008/12/27(土) 02:52:04
便乗して質問するけど、もし320x240固定だとしたら、どうやればいいんだろ。
たとえば関数に渡す場合なら
RGB * foo(RGB * m[320][240], int x, int y)
{
return m[x][y];
}

int main(int,char**)
{
RGB x[320][240];
RGB * p = foo(&x, 0, 0);
}

みたいに書いて、RGBの320x240の配列の先頭アドレスを渡して、それをfooでRGB *[320][240]みたいな型(文法上はエラーだと思うけど意味はわかりますよね?)
で受け取りたい場合。








311デフォルトの名無しさん:2008/12/27(土) 02:56:15
RGB (* m)[320][240]
ってするだけだろ
312デフォルトの名無しさん:2008/12/27(土) 02:56:51
あとfooで使うとき
(*m)[x][y]
になるね
313デフォルトの名無しさん:2008/12/27(土) 03:01:56
できた。
>>311
じゃあmallocの戻りを
RGB * px[320][240];
px = (ほげほげ)malloc(320*240*sizeof(RGB *));

ってキャストしたい場合、ほげほげはどう書いたらいいのですか?
314デフォルトの名無しさん:2008/12/27(土) 03:06:26
できない。
配列は左辺値になれない。
315デフォルトの名無しさん:2008/12/27(土) 03:06:55
>>313
配列だから代入不可能
それでいいのか?


RGB (* px)[320][240];
に対してなら

((*)[320][240])でキャスト
つーかそもそもいらない
316デフォルトの名無しさん:2008/12/27(土) 03:10:09
RGB * px[320][240]は配列なんですね。
そういえば、ポインタの配列とか、配列のポインタとか昔勉強した気がするなぁ。
もう完全に忘れてる(ってかもともと理解できてなかったのかも^^)


>>314-315さん、ありがとうございます。
317デフォルトの名無しさん:2008/12/27(土) 03:14:12
やりたいことはこうだろう
RGB *(*px)[240];
px = malloc(320*240*sizeof(RGB *));
318デフォルトの名無しさん:2008/12/27(土) 03:16:51
>>315
間違ってるけど別にいいか
どうせ通らないし
319316:2008/12/27(土) 03:22:07
ちょっと悩み中です。
320316:2008/12/27(土) 03:27:59
すんません。寝ます!

321デフォルトの名無しさん:2008/12/27(土) 13:14:02
何かPCが重いと思ってタスクマネージャでプロセスを見てみたら、"run32dll.exe"が暴走してました
どうしたらいいのですか?
322デフォルトの名無しさん:2008/12/27(土) 13:20:55
>>321
それのどこがCの問題?
323321:2008/12/27(土) 14:19:07
自己解決しました
324321:2008/12/27(土) 14:57:51
解決してません
325デフォルトの名無しさん:2008/12/27(土) 16:26:47
num_tbl 型は char型が4つ、全部で4バイトです。そういえば int型も4バイト。
なので、同じ4バイト同士、一気に代入してしまいましょう。
char num_tbl[4];
*((*int)num_tbl) = 0;// 0で初期化
受け側の num_tbl を一旦 int型のポインタに変えて、その中身に 0 を代入。
1行で済むし、コピー命令も1回だけの発生ですみます。

32ビット環境で、こういうものがありましたが理解できません。
intで0は2進数で00000000000000000000000000000000だから、
00000000|00000000|00000000|00000000
になって全部0になるってことですか?
326デフォルトの名無しさん:2008/12/27(土) 16:31:23
memcpyの引数の順番をいつも忘れてしまうんですが、忘れにくいうまい記憶法とか有れば教えてください。

memcpy(buf1,buf2,size); // buf1→buf2だっけ、逆だっけ……
327デフォルトの名無しさん:2008/12/27(土) 16:36:04
>>325
2進数で考える人はあんまりいないけど、そういうこと

>>326
src, dst の順って覚えてる
328327:2008/12/27(土) 16:42:02
>>327
ありがとう。すっきりしました。
ところで、普通は2進数で考えずに何で考えるんですか?
329デフォルトの名無しさん:2008/12/27(土) 16:42:19
>>326
代入と同じ順番
y = x; // y ← x
memcpy(buf1, buf2, size); //buf1 ← buf2
330デフォルトの名無しさん:2008/12/27(土) 16:46:00
>>327
ありがとうございます。
ただ、名前付けるといつもこんがらがってました

>>329
これはわかりやすいですね!
積年の悩みが解消されそうです。ありがとうございました。
331デフォルトの名無しさん:2008/12/27(土) 16:58:52
fwrite とかの 要素サイズ数 要素数 の順をよく忘れる
ヘッダ見ても同じ型だから区別つかないしー
332デフォルトの名無しさん:2008/12/27(土) 17:10:09
もうIDEとかエディタの機能に頼ってしまえ
333デフォルトの名無しさん:2008/12/27(土) 17:25:30
ぐぐれかす
334デフォルトの名無しさん:2008/12/27(土) 17:35:02
Cを書くときに最強のエディタ(GUI限定)ってなんなの?
335デフォルトの名無しさん:2008/12/27(土) 17:37:08
GUIじゃないエディタってなんだよwww
edか?
336デフォルトの名無しさん:2008/12/27(土) 17:37:57
ほら。例のビジュア・・
337デフォルトの名無しさん:2008/12/27(土) 18:11:56
クイックソートの実行時間・比較回数・交換回数を調べるプログラムを書いているのですが、思ったように動いてくれません。
ソースをttp://www3.uploda.org/uporg1887866.zip.htmlにアップしましたので、改善ポイントを教えてください。
DLパスワードは1234です。
338デフォルトの名無しさん:2008/12/27(土) 18:26:08
qsortと行く前にこけてるけど
339デフォルトの名無しさん:2008/12/27(土) 18:31:51
qsortのコードもまともじゃないような?
340デフォルトの名無しさん:2008/12/27(土) 18:35:50
>>335
Win 以外の環境も知らん間抜けめ。
341デフォルトの名無しさん:2008/12/27(土) 18:36:42
>>337
展開してまで見るのは面倒なのでパス。

>>335
emacsはGUI版よりも端末版のほうが私は好きです。

>>334
「最強」の基準によっても変わる。

>>331
ヘッダを見たら、仮引き数に名前がつけられていないか?
手元のcygwinでは前者が_sizeで後者が_nだ。

>>326
やはり、ヘッダを見れば判る。しかもこの場合は型も違う。
342デフォルトの名無しさん:2008/12/27(土) 18:45:53
>>341
VS2003 だと仮引数無しで型のみの羅列だね…
仮引数に意味を類推できる名称がつけてあるだけでも違うなー
343327:2008/12/27(土) 19:20:11
>>328
一般的には、アドレスがバイト単位で割り振られているので
バイト単位で考えると思う。

まあ、こんな感じ

  0    1   2    3
┌──┬──┬──┬──┐
│0x00│0x00│0x00│0x00│
└──┴──┴──┴──┘

なお、>>325 の方法は、アライメントが揃ってないと CPUによっては
例外が発生するとか、0以外の場合 endian に依存するとかあるので、
一般的には注意が必要。

>>330
ごめん、src と dst は逆でした。
344デフォルトの名無しさん:2008/12/27(土) 19:41:42
>>326
代入演算子と同じ順番、すなわち
buf1 = buf2, size
と憶える。
345デフォルトの名無しさん:2008/12/27(土) 19:43:06
memcpyでググれば使い方出てくるのに
346デフォルトの名無しさん:2008/12/27(土) 22:53:16
ある本で勉強しており構造体のとこまで来たのですが
線形リストについて具体的なソースが無く、自分で書いてみました。
http://www3.uploda.org/uporg1888553.c.html
プログラムでは、終了する前までに解放している筈なのですが
メモリ使用量をモニタしていると、どうも終了してから解放されているようです。
つまり、プログラムに書いたfree()がうまく効いていないのだと
思うのですが、アドバイスお願いします。
347346:2008/12/27(土) 22:54:04
パス忘れてました。12345です。
348デフォルトの名無しさん:2008/12/27(土) 22:59:03
モニタが嘘をいってるわけではない。
349337:2008/12/27(土) 23:10:38
>>338-339
もう一度考え直したのですがよくわかりません。
詳しく教えていただけませんか?
350デフォルトの名無しさん:2008/12/27(土) 23:12:49
>>346
Cライブラリが一括でOSからメモリを確保しておき、
mallocとfreeはそこから領域を切り出したり、返したりしているかもしれない。
そうすると、freeしてもすぐにはOSへメモリを返すことにはならない。
351デフォルトの名無しさん:2008/12/27(土) 23:20:20
>>346
そもそも、その「メモリ使用量をモニタ」している手段が判らんからなんとも言えんが、
デバッガで確認しないのはなんで?
352デフォルトの名無しさん:2008/12/27(土) 23:30:54
>>349
mainのfscanfの使い方がおかしい
nが初期化されてないのにnの余りを計算している
quick.cのアルゴリズムが変(無限ループ?)

qsortでググれば、サンプルコードいっぱい見つかったけど...
353デフォルトの名無しさん:2008/12/27(土) 23:34:14
>>350
その場合、ソースが意図的に動いているかは判らないということですか。

>>351
GNOMEのシステムモニタです。Windowsのタスクマネージャに相当するのかな?
デバッガは、コンパイラがgccで良く判らないもので。。
354デフォルトの名無しさん:2008/12/27(土) 23:42:54
>>353
printfでいろいろ表示させるのも、基本的なデバッグ方法だよ。
mallocとfreeのところでそれぞれポインタ値を表示させれば確認できるでしょ。
355353:2008/12/27(土) 23:55:10
gdb使ってみました。

// 最初のList_New()
Breakpoint 1, List_New (lastlist=0x0, init=0) at main.c:25
25 return newlist;
(gdb) print newlist
$1 = (List *) 0x82c9008
(gdb) continue

// 次のList_New()
Breakpoint 1, List_New (lastlist=0x82c9008, init=1) at main.c:25
25 return newlist;
(gdb) print newlist
$2 = (List *) 0x82c9018
(gdb) clear 25
(gdb) continue
0:0x82c9018

// 最初のList_Remove()
Breakpoint 2, List_Remove (rmlist=0x82c9008) at main.c:36
36 return newhead;
(gdb) continue
1:0x82c9028

// 次のList_Remove()
Breakpoint 2, List_Remove (rmlist=0x82c9018) at main.c:36
36 return newhead;

ポインタの値が一致しているので、一応きちんと動作している、と
考えてよいのでしょうか。
356デフォルトの名無しさん:2008/12/27(土) 23:59:06
>>352

>nが初期化されてないのにnの余りを計算している

nにはMAXを入れるのでしょうか?

>quick.cのアルゴリズムが変(無限ループ?)

quick.cもq1.cも教科書の物をそのまま使っています。
10行目のwhile(x[j] > x[end] && j>i)i--; の  && j>iが抜けていたのですが、
ここを修正しても結果が出ませんでした。
357デフォルトの名無しさん:2008/12/28(日) 00:07:52
ではあちこち移し間違っているのでしょう
なめるように見直せ
358デフォルトの名無しさん:2008/12/28(日) 00:09:49
>>346 >>353
 メモリは、全て開放(free())されているよ。ただし、プログラム終了時に、OSに返されている。
大体、メモリの確保量が少ないので、free()しても返されていないだけ。
昔、どれだけ確保すれば、free()したときに返されるか試したことがあったが、もう忘れた。
ソース探したんだけどなぁ、見付からなかった。
Linux(kernel 2.6.18-92.x)上で、GCC 4.1.2でやってたけど、一度の確保量が216 Bytesくらいだったかな。
359デフォルトの名無しさん:2008/12/28(日) 00:10:14
>>356
ttp://lecture.ecc.u-tokyo.ac.jp/~cichiji/cp-02/cp-02-12-3.html
このソース参考にしてみたら?
360355:2008/12/28(日) 00:18:11
>>358
どうもありがとうございました。安心しました。
361デフォルトの名無しさん:2008/12/28(日) 00:22:44
初心者です
char str[256];
これの説明でstrは文字が256文字納められる配列とあったのですが、
「a」は1バイト、「あ」は2バイトでデータの量が違うのに同じ文字数配列に格納できるのでしょうか
そうではなくて「a」は256文字で「あ」は128文字分しか格納できないのでしょうか
どなたか教えてください
362デフォルトの名無しさん:2008/12/28(日) 00:24:38
2バイトの文字なら128文字分しか入らないよ
363デフォルトの名無しさん:2008/12/28(日) 00:25:11
>>357
なめるように見直したら、所々のミスが見つかりました。何度も見直したつもりだったのですが、すみません。


それで、比較回数と交換回数を求めるように改良したいのですが、 うまくカウントしてくれません。

どこを直せば良いでしょうか?
int hikaku = 0, koukan = 0;
i = start;
j = end -1;
while(1){
while(x[i] < x[end])i++;
hikaku++;
while(x[j] > x[end] && j>i)j--;
hikaku++;
if(i >= j) break;

tmp = x[i];
x[i] = x[j];
x[j] = tmp;
koukan++;
i++;
j--;
}
tmp = x[i];
x[i] = x[end];
x[end] = tmp;
printf("比較回数: %d\n", hikaku);
printf("交換回数: %d\n", koukan);
364デフォルトの名無しさん:2008/12/28(日) 00:25:12
>>362
ありがとうございます!
もやもやが晴れました!
365デフォルトの名無しさん:2008/12/28(日) 00:29:32
>>363
int hikaku = 0, koukan = 0;
を関数の外に出してみれ。
366デフォルトの名無しさん:2008/12/28(日) 00:34:08
>>361
確かに char str[256]; に1バイト文字を256文字入れる事ができるが、
C の文字列を扱う場合は通常最後に 0 を入れるので
実質的には255文字しか入れる事が出来ない。
全部2バイト文字だと127文字だな。
もちろん、2バイト文字127文字+1バイト文字1文字も可能だが。
367デフォルトの名無しさん:2008/12/28(日) 00:37:24
>>365
なるほど! しっかりとカウント出来るようになりました。

しかし、出力がおかしいです。
比較回数: 29140
交換回数: 11347
比較回数: 29142
交換回数: 11347
比較回数: 29144
交換回数: 11347
比較回数: 29146
交換回数: 11347
という風に、たくさん表示されます。これも関数の外に出すのでしょうか?
printfを#includeの下や最後の}の下に持って行ったのですが、これではコンパイル時にエラーが出ます

なんども申し訳ないです。
368デフォルトの名無しさん:2008/12/28(日) 00:39:13
>>361
蛇足だけどソースをutf8にしたりすれば確かめられるだろうけど、
一文字3バイトになったりすることもあり2バイトとは限らないので注意
369デフォルトの名無しさん:2008/12/28(日) 00:40:21
>>367
int hikaku = 0, koukan = 0;
をmain関数で参照できるようにしてみれ
370デフォルトの名無しさん:2008/12/28(日) 00:50:16
>>369
戻り値ってやつでしょうか?授業でやってないことなのでわかりません。
もし良ければ教えてください。
371デフォルトの名無しさん:2008/12/28(日) 00:54:30
まんどくさい、グローバルに宣言して、mainで0に初期化しておいて、ソーと関数の中でカウント、
最後にmainで表示でおk。
372デフォルトの名無しさん:2008/12/28(日) 00:56:09
>>370
その参考にしてる教科書がよくない。
373デフォルトの名無しさん:2008/12/28(日) 00:57:28
ちゃんと理解していないのにいきなり高度なことができると思ってるのか
基本からやりなおせ
374デフォルトの名無しさん:2008/12/28(日) 00:59:59
「習ってない」は中学で卒業しろ
375デフォルトの名無しさん:2008/12/28(日) 01:21:55
基礎はすっとばしておいてあとで人に聞けばいいや
という根性では誰からもそっぽを向かれるぞ
376デフォルトの名無しさん:2008/12/28(日) 01:28:00
足し算引き算のできない人間が微分積分を理解できるとでも思ってるの?
馬鹿なの?
377デフォルトの名無しさん:2008/12/28(日) 01:37:25
微積分を持ち出しておいて、足し算、引き算かよ・・・
378デフォルトの名無しさん:2008/12/28(日) 01:42:37
>>363
逆順だと動いてるように見えるけど、
そのコードだとうまくソートされないよ。
379デフォルトの名無しさん:2008/12/28(日) 11:23:35
このスレを見てると痛感するが、教育改革の第一歩は自習の義務化だな。なんか矛盾してるようなきもするが
380デフォルトの名無しさん:2008/12/28(日) 11:54:41
>>379
むしろ自習を促すような教育技法、いや教育理念を教員側が持つ必要があるのでは?つまるところ科挙制度がまかりとおる世間一般の通念が問題なのでは?みんな手を抜きすぎ。
381デフォルトの名無しさん:2008/12/28(日) 11:57:37
>>370
これにめげずに本を読めば、いろいろわかってきて楽しくなると思います
382デフォルトの名無しさん:2008/12/28(日) 12:10:34
教科書が悪いかも試練。
383デフォルトの名無しさん:2008/12/28(日) 12:24:57
writeの進捗状況を画面表示したいのですが進捗を知るにはどうしたらいいですか。
384デフォルトの名無しさん:2008/12/28(日) 12:25:46
fwriteの進捗状況を画面表示したいのですが進捗を知るにはどうしたらいいですか。
385デフォルトの名無しさん:2008/12/28(日) 12:25:49
>>383
1/100ずつ書き込む
386デフォルトの名無しさん:2008/12/28(日) 12:27:34
OSとCライブラリを作り変える
387デフォルトの名無しさん:2008/12/28(日) 13:02:14
>>385
なるほど。天才ですね。
388デフォルトの名無しさん:2008/12/28(日) 14:41:37
別スレッドでファイルサイズをチェックすれば
389デフォルトの名無しさん:2008/12/28(日) 17:56:49
388>>
上書きの場合無理。
390デフォルトの名無しさん:2008/12/28(日) 18:02:08

んじゃ、別スレッドで中身をチェックすれば。

中身が(殆ど)同一だったら無理。
391デフォルトの名無しさん:2008/12/28(日) 18:08:19
最終的に書き込むサイズがわからないの?
392デフォルトの名無しさん:2008/12/28(日) 18:14:17
fwriteの進捗状況ってのはfwrite呼んだあとにディスク(その他)へ書き出されるまでの間の進捗状況を逐一表示したいんだろ?
393デフォルトの名無しさん:2008/12/28(日) 18:26:08
1バイトづつ書き込む
394デフォルトの名無しさん:2008/12/28(日) 19:22:38
char b[64];
char c[8][8];

printf("%p\n", &b[0]);
printf("%p\n", b);
printf("%p\n", &b[63]);
printf("%p\n", b + 63);
printf("\n");
printf("%p\n", &c[0][0]);
printf("%p\n", c);
printf("%p\n", &c[7][7]);
printf("%p\n", c + 63);

としたとき最後の2行の表示が違うのは何故なのですか?
395デフォルトの名無しさん:2008/12/28(日) 19:35:39
>>394
printf("%d, %d\n", sizeof(b[0]), sizeof(c[0])); とかやって、結果を見ると思いつくかも。
396デフォルトの名無しさん:2008/12/28(日) 19:50:00
>>394
&c[7][7]
同値
&(*(*(c + 7) + 7)) シンタックスシュガー
(*(c + 7) + 7) 最適化
同値
&(*((char *)(*((char *[7])c + 7)) + 7)) 明示的に書いた
または、
&(*(*((char *)c + sizeof(char *[7])*7) + sizeof(char *)*7))
cから、sizeof(char *[7]) * 7進んで、その進んだcの間接参照から、sizeof(char *) * 7進んで、その逆参照のアドレス値

((char *[7])c + 63)
または、
((char *)c + sizeof(char *[7])*63)
cから、sizeof(char *[7]) * 63進んだアドレス値

もういいや
397デフォルトの名無しさん:2008/12/28(日) 20:02:58
もっともらしく嘘を書いてしまった。
s/&(*(*((char *)c + sizeof(char *[7])*7) + sizeof(char *)*7))/&(*(((char *)c + sizeof(char *[7])*7) + sizeof(char *)*7)/
398デフォルトの名無しさん:2008/12/28(日) 20:19:03
日本語処理について質問です。
以下のコードでキャラクタ文字みたいに、"京"ならp[1]、"へ"ならp[2]で表示させたいんですが。
何も表示されません。short型だとエラー。int型だと"ク"になってしまいます。
コンパイラはBorland C++ Compiler 5.5です。

#include <stdio.h>

void main()
{
int p[] ={"東京へ行きたい"};

printf("%c",p[1]);

}
399デフォルトの名無しさん:2008/12/28(日) 20:22:06
むちゃしやがって。。
%cは1バイトの文字しか対応しないんだろ。
400デフォルトの名無しさん:2008/12/28(日) 20:23:34
>>398
ワイド文字版を使う

#include <wchar.h>
#include <locale.h>

int main(void)
{
wchar_t p[] = L"東京へ行きたい";
setlocale(LC_ALL, "");
wprintf(L"%lc\n", p[1]);
return 0;
}
401デフォルトの名無しさん:2008/12/28(日) 20:39:57
>>400
ありがとうございました。解決しました。
入門書何冊か探したけどこういう事は載ってないんですよね。
402デフォルトの名無しさん:2008/12/28(日) 21:01:04
自分で調べる力を授けようとする目的からして必要かどうか筆者の見識が分かれているのだろう
403デフォルトの名無しさん:2008/12/28(日) 21:04:13
その自分で調べるっていうのは本で調べるってことじゃないの?
404デフォルトの名無しさん:2008/12/28(日) 21:08:02
単に入門書レベルでは扱わないだけだと思うが

そういえば自分は多バイト文字というものをどこで知ったんだろう…覚えてない
405デフォルトの名無しさん:2008/12/28(日) 21:08:59
その調べる本の種類を「はじC」とか想定するのかよ
特定の書籍を揶揄する気はないが、おまえさんの言う「本」てのは何のつもりだったのかね
406デフォルトの名無しさん:2008/12/28(日) 22:59:37
charって127から-127まで扱える事に聞きたいんですが
char a=100;
printf("%d",a);
とやれば100と出ます。
ですが、
char a;
scanf("%d",&a);
printf("%d",a);
とやるとscanfでうけとった数字たとえば33とかがうまく表示されないんですが
どうすればいいんですか?教えてください
407デフォルトの名無しさん:2008/12/28(日) 23:00:54
俺は文字コードをperlの正規表現やるときに学習したな
408デフォルトの名無しさん:2008/12/28(日) 23:07:29
charって127から-127まで扱える事さん、いますか?
409デフォルトの名無しさん:2008/12/28(日) 23:08:39
>>406
%d指定子はintへのポインタをとらなければいけない。
charへのポインタを指定したら間違いなくおかしなことになる。
整数をcharの変数に入れたいだけなら、intの変数に%dで
(あるいはshortの変数に%hdで)値を格納してからcharの変数に代入すること。
または、環境が許すなら%hhdを使うこと。
410デフォルトの名無しさん:2008/12/28(日) 23:10:48
あと、少なくとも127から-127までという決まりなのは、signed char。
現実には、0から255までのunsigned charとcharが同じ大きさということもよくある。
さらに、signedでも2の補数使って-128から127になるのが現在主流。
そもそも、8ビットより大きい可能性もあるが、今ではかなり珍しい。
411デフォルトの名無しさん:2008/12/28(日) 23:15:09
36ビットマシンとかあったんだっけ?
412デフォルトの名無しさん:2008/12/28(日) 23:17:10
64ビット時代がきたらcharが16ビットになる
そんなふうに考えていた時代が俺にもありました
413デフォルトの名無しさん:2008/12/28(日) 23:30:18
オクテット単位で扱えないと結局不便だろうから
(既存のメディアを扱うことを考えると)
char のビット数は簡単には変わらんだろうね。
414デフォルトの名無しさん:2008/12/28(日) 23:53:37
おっとできました
intでもshor intでもいったん代入して
char a;
int i;
scanf("%d",i);
a=i;
printf("%d",a);
これでもできましたshortでもできました。ありがとうございます。
ついでに、ビット長ってありますよね?
char 8ビットなどint 16または32
ビットってあんまりイメージわかないんですが。
ビットが大きくなっていれば小数点10桁など大きい数字を扱えるんですが。
ビットとかC言語をやる中で気にしなくてもいいんでしょうか?
415デフォルトの名無しさん:2008/12/29(月) 00:04:25
ビットってのは単に2進数での桁のことだ。
ビット数を気にしなくても組めるプログラムは多いが
気にした方がいいケースもある。
オーバーフローしそうな場合とか、
ビット演算すると計算が楽になる場合とか。

まあ、プログラマなら65536までの2の累乗を覚えて
16進数←→2進数変換を頭の中でできるようになっとけ。
416デフォルトの名無しさん:2008/12/29(月) 00:07:40
桁は英語で digit と言う。
2進法(binary)+桁(digit)=ビット(bit)となる。
     ~             ~~
3進数の桁を trit とか言ったりもする。
417 ◆gAsT8W60Vg :2008/12/29(月) 00:11:41
      ↑もトリって言うね
418デフォルトの名無しさん:2008/12/29(月) 00:18:44
>>415
なっとけなんて言うことないだろ。
言われなくたってどうせ嫌でも頭に入るさ。
419デフォルトの名無しさん:2008/12/29(月) 00:21:22
4進数が出てこないのは、ある種の「狭さ」だな
420デフォルトの名無しさん:2008/12/29(月) 00:21:38
今までビットなんて気にせずプログラムを学んでたんですが
むずかしいですね。
あ、あとちなみに、関数の読み方などが理解不能なんですが
int scanf(const char *format , ...);
int printf(const char *format, ...);
これらは気にせず printf("hello");など書いていたんですが。
戻り値がintなのにprintfを使えるって変じゃないですか?
intがあるからreturnもありそうなんですが。
int main(void)と書くのですが何故 int printf();とは書かないんでしょう
それとconst char *format, ...この意味がさっぱりです*formatの意味は%dや%cなどとわかったんですが
const charこれは"hello"や文字の部分を表してるのでしょうか?それと, ...は変数などのprintf("%d",xxx);
xxxを表してるんでしょうか?詳しく教えてくださいお願いします
421デフォルトの名無しさん:2008/12/29(月) 00:35:48
>>419
んー、非常に大雑把な議論によると、計算機のビット数は2進よりも3進のほうがいい、という結論が得られています。
あるいは平衡3進法ということばもあります。
3進法は(すくなくとも理論の上では)多少なりとも意味があるので、よく目にするものだと思います。
一方4進法にさしたる意味はありません。
422デフォルトの名無しさん:2008/12/29(月) 00:36:02
>>420
printf の戻り値は出力した文字のバイト数。
大抵そんなもの使わないので無視してるだけの話。
423デフォルトの名無しさん:2008/12/29(月) 00:38:04
>>421
ネイピア数 e ≒ 2.7 に近いほど最良で、
2 よりは 3 の方が e に近いから、だっけか。
でも、回路は2進法の方が作りやすいんで、
結局2進法に軍配が上がるというところだな。
ビット演算も分かりやすいし。
424デフォルトの名無しさん:2008/12/29(月) 00:42:16
計算量の多い問題が解けるっていう量子は
机上の空論だったんだろうか
425デフォルトの名無しさん:2008/12/29(月) 00:57:48
>>420

> あ、あとちなみに、関数の読み方などが理解不能なんですが
> それとconst char *format, ...この意味がさっぱりです*formatの意味は%dや%cなどとわかったんですが
> const charこれは"hello"や文字の部分を表してるのでしょうか?

それは関数のプロトタイプの書き方で、関数の引数や返り値の型を表示するやりかたですね。
int printf(const char *format, ...);
を例にすると、
関数printf() は第一引数の型は const char へのポインタ、第二引数以降は可変長引数、返り値の型は int
を示しています。

Cに慣れるまでスルーしていいと思います。

> 戻り値がintなのにprintfを使えるって変じゃないですか?
たしかに printf() の返り値は私もチェックしたことはありませんね。printf() 自身は値を返すことができても、
そのように明示しなければ、それはそれでOKなんでしょうね。(文法書みてませんので憶測ですみません。)
printf("hello"); でいいと思いますし、普通だと思います。

大昔の流儀では
「(void)printf("hello")と書け」
というのがありました。(lint ... 私もつかったことないや)
426デフォルトの名無しさん:2008/12/29(月) 00:58:36
>>419
多値変調のことも忘れないでくださいって話?
427デフォルトの名無しさん:2008/12/29(月) 01:04:32
状態遷移から1、0をはきだすのはCで十分なの?
428デフォルトの名無しさん:2008/12/29(月) 01:09:40
>>419
0〜3(笑)
429デフォルトの名無しさん:2008/12/29(月) 01:10:52
>>427
yacc とか
430デフォルトの名無しさん:2008/12/29(月) 05:06:26
「WOLF RPGエディター」とは? 
・高度なRPG開発が可能な、完全無料のゲーム作成ツールです。
・製作者はなんと「モノリスフィア」やツクール2000でシルフェイド幻想譚などを製作した
 SmokingWOLF氏だよ。
・雰囲気はRPGツクール2000に近い。RPGツクール2000で自作システムを作りこむ際に
 不満だったところがいろいろ解消されていて、かなり自由度が高いです。ただし
 その分初心者には難しいかも。すでにツクール2000で自作システムを組むのに
 慣れた人やRPGツクールでは物足りないけどプログラミングはちょっとという方にお勧め。
・作成したゲームは自由に配布したり、コンテストに投稿することも可能。
 また本ソフトを持たない人でもプレイ可能!ファイル暗号化も完備してるよ!
・要望、不満点、バグ報告などなど書き込みお願いします。今もどんどん進化中です。
・それとマップやキャラなどのドット素材もじゃんじゃん募集中ですので
 一度サイトにお越しくださいませ。
・このツールで作ったゲームをサイトで紹介してるから、ダウンロードしてどういう
 ゲームが作れるのか見てみてね。

2ちゃん本スレ
http://pc11.2ch.net/test/read.cgi/gamedev/1229261856/l100
431デフォルトの名無しさん:2008/12/29(月) 11:09:38
趣味でプログラムをと考えています。
たとえば2chのスレ等の特定の言葉を集計、カウントしたり
画像掲示板の画像を自動で集めたりみたいなWeb上で動作するものを作ってみたいです。

OSはXP、数年まえに手書きでへぼいHP作ったり、JAVAで画像表示とかで少し遊んだ経験のみです。
おおすめの言語がありましたらご教授お願いします
432デフォルトの名無しさん:2008/12/29(月) 11:12:11
Cでないことは確実。
Rubyがいいんじゃないかな。Rubyスレで聞いてみな。
433デフォルトの名無しさん:2008/12/29(月) 11:31:57
計算式 x=pow((1.0+h),(1.0/h))
これを、for文で hを1から限りなく0にしていくときの計算結果を
表示させるプログラムを作りましたけど、
いきなり最初の答えが間違ってしまいます。
hに1を代入して計算させても、「2」にならず、「inf」とか表示されてしまいます。
使っている変数宣言は 全てdouble で、コンパイラはgcc です。

教えてください。お願いします。
434デフォルトの名無しさん:2008/12/29(月) 11:35:21
コードもなしにエスパー回答を待つのが流行ってるのか。
435デフォルトの名無しさん:2008/12/29(月) 11:40:28
0 からループを回してるに1票
436デフォルトの名無しさん:2008/12/29(月) 12:01:35
すみません。コードは次のものです。

#include <stdio.h>
#include <math.h>

double ans(h)
{
return pow((1.+h),(1.0/h));
}

int main(void)
{
double h;

for (h=1.0; h>0; h=h-0.001)
printf("%10.8f %20.18f\n", h, ans(h));

return 0;
}

以上、よろしくお願い致します。
437デフォルトの名無しさん:2008/12/29(月) 12:05:59
- double ans(h)
+ double ans(double h)
438デフォルトの名無しさん:2008/12/29(月) 12:09:29
%20.18fなんかじゃなく%.18gを使えばいいのに。
ans()の引き数の型を指定しておけばいいのに。
439デフォルトの名無しさん:2008/12/29(月) 12:16:45
>>437,438
修正したところ、計算されました。
printfの書式の扱いもまだ不慣れで fとgの違いもよく分からないですけど、
調べてみます。ありがとうございました。
440デフォルトの名無しさん:2008/12/29(月) 12:20:29
調べてから言え
441デフォルトの名無しさん:2008/12/29(月) 12:42:58
>>432
あざーす。rubyいじってきます。
442431:2008/12/29(月) 12:55:19
誤爆だったことに今気づいた
443デフォルトの名無しさん:2008/12/29(月) 12:55:44
なんで符号付きsigned 符号なしunsignedがあるんですか?
何もしなくても符号がつきますよね?符号がつかないコンパイラだけ必要っていみですか?singedは?
short intも intかlong intを使えば良いのに。
詳しく教えてください
444デフォルトの名無しさん:2008/12/29(月) 13:06:10
昔はメモリが少なかったんだよ
445デフォルトの名無しさん:2008/12/29(月) 13:14:27
>>443
signedだと(主に最上位の)1ビットが符号付きかそうでないかに使われるじゃん?
1ビット分違うだけで表せる幅が倍になるよね、多分。
446デフォルトの名無しさん:2008/12/29(月) 13:29:37
>>443
charだけは何もしない場合にsignedになるかunsignedになるかが環境に依存する

変数のサイズについてはメモリ効率に関する選択の問題
447394:2008/12/29(月) 15:06:02
亀レスすいません
>>396
&c[7][7] 同値*(c + 7) + 7ということですが
c同値&c[0][0]だから
(c + 7)同値c[7]同値&c[7][0]ですよね
printf("%p¥n", &c[7][0]);
printf("%p¥n", c + 7);
printf("%p¥n", *(c + 7));
実際全部同値でした。
しかし何で(c + 7)と*(c + 7)が同値なんでしょう?
そもそも(c + 7)は&c[7][0]に同値だから、
*(c + 7)はc[7][0]に同値なのではないのですか?
また、&c[7][7]を表わすのに(c + 7) + 7としてしまうと、
c+14になってc[14]同値&c[14][0]となるから
(c + 7)を1バイトにキャストしなければならないのですね?
何でこれが間接参照演算子*でできるのでしょうか。
どうも私自身間接参照演算子についての理解が足りないようです。
ご教示お願いします。
448デフォルトの名無しさん:2008/12/29(月) 15:06:03
>>443
2バイト事に扱いたい場合とかもあるんだぜ。
449デフォルトの名無しさん:2008/12/29(月) 15:07:52
>>447
>>15>>26-27>>29>>40 あたりの議論を見ると分かると思う。
450デフォルトの名無しさん:2008/12/29(月) 15:15:07
>>443
signed というキーワードは signed char 以外では特に指定する意味がない。
char に関しては >>446 なので、符号つきであることを保証したい場合には付けないといけない。
451デフォルトの名無しさん:2008/12/29(月) 15:28:07
intを省略するために使うこともできるけどね。
cf.
static signed foo;
struct {
signed bar:2;
};
452デフォルトの名無しさん:2008/12/29(月) 16:48:27
ビットフィールドだと、
構造体のサイズを気にしない場合は
int と書くことに大した意味がなかったりするから、
signed/unsigned とだけ書く事があるね。

struct hoge {
 signed a : 4;
 unsigned b : 1;
 unsigned b : 3;
};
453デフォルトの名無しさん:2008/12/29(月) 16:49:24
変数名変えるの忘れてた。3つ目は unsigned c : 3; だ。
454デフォルトの名無しさん:2008/12/29(月) 18:55:29
アルゴリズム関係の書籍は何であんなに高いの?
一冊2万5000円とかおちょくってるの?ねぇ
455デフォルトの名無しさん:2008/12/29(月) 18:57:33
P2P推奨っていうことでは?
456デフォルトの名無しさん:2008/12/29(月) 18:58:05
そんなんで赤字になるような奴は対象外ってことさ
457デフォルトの名無しさん:2008/12/29(月) 18:59:22
>>454
なんていう名前の本?
458デフォルトの名無しさん:2008/12/29(月) 19:01:37
>>457
アルゴリズム辞典
459デフォルトの名無しさん:2008/12/29(月) 19:04:36
>>458
本当だ…なんか一桁多いなぁ…それだけの内容ってことか?
460えびふらみ:2008/12/29(月) 19:10:23
ぶっちゃけパ王が便利すぎるからボウシなんかいらないよ
461デフォルトの名無しさん:2008/12/29(月) 19:11:10
誤爆すいませんっしたぁーーーー
462デフォルトの名無しさん:2008/12/29(月) 20:43:03
こりゃひどい。
463デフォルトの名無しさん:2008/12/29(月) 20:48:54
>>459
広い範囲のアルゴリズムが載っているからだとおも
海外とかだと、もっと安いのかな、
464デフォルトの名無しさん:2008/12/29(月) 21:27:36
>>460
風来のシレン関係?アスカ?
465デフォルトの名無しさん:2008/12/29(月) 21:43:57
見やすくするためソースファイルの分割に挑戦したのですが、その過程で一つだった関数を分け、
さらに変数の共有を行うために、異なる関数(分割前は一つだった)で共有したい変数は
全てグローバル変数にしました。
そのため別にヘッダーファイルを作成し、インクルードするなどしています。

なんだかややこしい方法を取ってる気がするのですが、これでいいのでしょうか?
466デフォルトの名無しさん:2008/12/29(月) 21:49:06
>>454
ttp://www.nist.gov/dads/
これならタダ。
467デフォルトの名無しさん:2008/12/29(月) 21:49:29
>>465
変数を共有するような分割は変だと思う
468デフォルトの名無しさん:2008/12/29(月) 21:53:19
>>465
よくない。
結合度と凝集度でぐぐれ。
あと、複数の関数で共有するデータは、構造体へのポインタで持ち回れ。
(例: fprintf等のf系の関数。「FILE *」でデータを共有している)
グローバル変数だと誰が何処で書き換えるかわかったもんじゃないし、
マルチスレッド化すると破綻する。
469デフォルトの名無しさん:2008/12/29(月) 22:00:26
ある関数と、その何10階層も下にある関数でのみ使用する共通変数があるとして、その変数を何10階層も引数の形で渡していくのと(途中の関数ではその変数の読み書きはしない)グローバル変数にするのではどちらの方がよりよいプログラムだろうか
470デフォルトの名無しさん:2008/12/29(月) 22:04:32
グローバル変数への参照を取得する関数を定義する

そもそも何10階層も呼ぶ設計がおかしい

471デフォルトの名無しさん:2008/12/29(月) 22:05:11
普通はその変数以外の情報も一緒に渡すし、
それが構造体なんてこともよくある話。
その構造体の中にその変数があれば、
受け渡しのコストはそもそも存在しない。
472デフォルトの名無しさん:2008/12/29(月) 22:05:53
スタックの方がキャッシュヒット率が高いから
あんまグローバル変数にしても高速化が見込めない可能性もある。
473デフォルトの名無しさん:2008/12/29(月) 22:11:32
プログラムの広範囲で使う変数もグローバル変数じゃなくて
mainのローカル変数にしてアクセス用の関数を作ったほうがいいの?
474デフォルトの名無しさん:2008/12/29(月) 22:17:46
はい
475デフォルトの名無しさん:2008/12/29(月) 22:20:54
あんまりよくなくね?
476デフォルトの名無しさん:2008/12/29(月) 22:32:37
>>473
広範囲で使うデータをグローバル変数にして、マルチスレッド化や
マルチインスタンス化するときに痛い目に遭ってるのをしばしば
見掛ける。
477デフォルトの名無しさん:2008/12/29(月) 22:34:24
排他制御
478デフォルトの名無しさん:2008/12/29(月) 22:40:26
ていうかアクセス用の関数って具体的にどういうものなの?ミューテックスとかを使うの?
マルチスレッドとかなら利点がわかるんだけど標準のコード書いてるときに利点がわからない
479デフォルトの名無しさん:2008/12/29(月) 22:45:51
>>478
セレクタのことだろ。
480デフォルトの名無しさん:2008/12/29(月) 22:45:54
>>478
C++でいうprivateメンバにアクセスするpropertyみたいなもん
481デフォルトの名無しさん:2008/12/29(月) 22:49:52
どういう痛い目に合うのか具体的に教えて欲しい
482デフォルトの名無しさん:2008/12/29(月) 22:55:38
>>481
グローバル変数の実体は1個しか存在しない
別々のことやってるスレッドで1個の変数を共有したらどうなると思う?
そんでそれを回避するためにローカル変数に直して、
それを各関数に受け渡す仕組みを作り直す手間がどれくらいあると思う?
483デフォルトの名無しさん:2008/12/29(月) 22:59:35
そんな手間か?だいたいマルチスレッド化を常に考えてプログラミングって馬鹿だろ

それよりもっと一般的なグローバル変数の弊害を考えろよ
484デフォルトの名無しさん:2008/12/29(月) 23:07:57
>>483
マルチスレッド化を考えないことは必ずしも馬鹿ではないだろうが
常に考えることは間違いなく馬鹿ではないよ

手間でないと思うならそれは君が大規模なプログラムを組んだことがないだけだろう
485デフォルトの名無しさん:2008/12/29(月) 23:09:09
>>483
どこからでも扱えて、何か起こった時のデバッグ範囲が広大になることだな。
486デフォルトの名無しさん:2008/12/29(月) 23:10:02
>>484
そりゃ大規模なプログラムなら全体かかる修正は何でも大変だろww
487デフォルトの名無しさん:2008/12/29(月) 23:13:13
まぁここ入門スレだからな・・
488デフォルトの名無しさん:2008/12/29(月) 23:13:49
だよな・・・・・・・
489デフォルトの名無しさん:2008/12/29(月) 23:16:25
グローバル変数が問題になるのは常にアクセス権の話であって本質的にはどれも同じだよ
マルチスレッド化にからむ話とそれ以外をわけて考えてるのがおかしい
490デフォルトの名無しさん:2008/12/29(月) 23:18:05
グローバル変数は使う場所と宣言の場所が離れてるから名前を忘れやすくなる。
ローカルなら、エディタ画面でおさまる範囲に書いてあるけど。
491デフォルトの名無しさん:2008/12/29(月) 23:19:02
>>486
そんなことはないぞ・・・。
もしそういう状況になってるのだとしたら、
それはお前のプログラムの組み方が悪い。
492デフォルトの名無しさん:2008/12/29(月) 23:20:04
なに質問スレでくだらない議論してんだよお前ら
493デフォルトの名無しさん:2008/12/29(月) 23:26:29
ふとした疑問なんですが
autoっていう修飾子あるじゃないですか
あれを明示してるひとって見たことありますか?
494デフォルトの名無しさん:2008/12/29(月) 23:27:28
グローバル変数でも static つければ範囲狭められるし、
errnoみたいな伝統的に使われてるものもある。

なんか「グローバル変数=悪」って思い込んでるのかもしれないけど
うまく使えば、プログラムをシンプルに出来る
うまく使えば、プログラムを高速にできる

うまく使う方法を議論する方が建設的
495デフォルトの名無しさん:2008/12/29(月) 23:28:20
グローバル変数を使うと、往々にして安きに流れて、それ特有の「お作法」を発生させてしまうことがよくあります。1週間たったらすっかり忘れてしまうのでした。
値をいれるのはここだけ、あとはみんな参照、くらいでとどめておきたいのですが、ね。
496デフォルトの名無しさん:2008/12/29(月) 23:28:26
>>493
autoは記憶クラスです。修飾子ではありません。
497デフォルトの名無しさん:2008/12/29(月) 23:31:27
>>496
そうなんですか
すいませんでした
498デフォルトの名無しさん:2008/12/29(月) 23:37:27
>>494
errnoがグローバル変数とは限らない。
少なくともWindowsや最近のUNIX系OSは軒並スレッド毎に固有。
499デフォルトの名無しさん:2008/12/29(月) 23:44:58
>>498
もちろん知ってるよ
UNIXのマルチスレッド対応時に真っ先に問題になる部分だからね
500デフォルトの名無しさん:2008/12/30(火) 00:25:42
とりあえず自分がよくグローバルにするのは起動時パラメータで与えた動作モード
501デフォルトの名無しさん:2008/12/30(火) 00:43:06
プロの人はプログラムを打ち込み始める前に設計図的なものを全部作っちゃうの?
502デフォルトの名無しさん:2008/12/30(火) 00:56:14
>>486
全体に影響があらざるを得ないレベルの修正は確かに大変だが、
全体に影響を与えるようなことが起こりにくいように作ることは可能だよね
503デフォルトの名無しさん:2008/12/30(火) 00:58:53
>>501
ある程度の構成は決めるけど、細かいところまでは決めないで作り始めてるよ。
大枠から作っていくというか。
プロの人に限らず、経験を積めば道を大きくそれることなく進めていけるようになるし。
504デフォルトの名無しさん:2008/12/30(火) 00:59:30
>>501
そういう方法論もある
最近だと「あらかじめ完璧な設計を用意するなんて無理だろ」という前提に立って
コードを書きつつ柔軟に設計を変更する開発手法も出てきている
505デフォルトの名無しさん:2008/12/30(火) 01:01:33
あらかじめ完璧なものが作れるなら、マイクロソフトはこんなに成長してないぜ
506デフォルトの名無しさん:2008/12/30(火) 01:07:19
>>501
設計書にもレベルがあってですね。
ここは譲れないというものから、大枠は決めて後はどうぞというものまで。
あまりガチガチにやっちゃうと工数ばかりがかかってなかなか進まない、
適当過ぎると最初の進捗は良好だけどなかなか終わらない。

まあ、そのへんのさじ加減がむつかしい。
507デフォルトの名無しさん:2008/12/30(火) 01:37:55
>>493
見た事無い。
508デフォルトの名無しさん:2008/12/30(火) 01:40:33
D言語は気持ち悪いぐらいautoだらけだが、
Cでautoなんて書く馬鹿はいないだろ。電力の無駄遣い。
509デフォルトの名無しさん:2008/12/30(火) 01:42:44
どっかのC言語をパクって適当に構文足した言語は
autoの意味を最近変えようとしてる。
だから、C言語ではauto使わなくても将来的にはautoを使うコードってメジャーになるんだろうなぁ
510デフォルトの名無しさん:2008/12/30(火) 02:13:34
それだけautoに意味がなかったってことだろうな。
予約語の意味かえるなんてそうそうできることじゃなし。
511デフォルトの名無しさん:2008/12/30(火) 02:27:35
>>508
うちは背景色よりも前景色の方が輝度低いのでautoと書くべきなのか。エコ的に
512デフォルトの名無しさん:2008/12/30(火) 02:28:07
嘔吐と書くか
513デフォルトの名無しさん:2008/12/30(火) 02:54:21
char 以外への signed もまだ auto よりは使う機会はなくもないし、
register は古いプログラムでは使われてることもあるが、
auto は本当に役立たず。
そのおかげで C++0x では貴重な予約語をゲットできたわけであるが。
514デフォルトの名無しさん:2008/12/30(火) 02:57:45
[[auto]]とかならなくてホントによかったと思う。
515デフォルトの名無しさん:2008/12/30(火) 04:13:22
あうと って呼んだらアウトですかね。
それで問題なく通じればいいか。
516デフォルトの名無しさん:2008/12/30(火) 04:39:07
auto ← あうと
alt ← あると
517デフォルトの名無しさん:2008/12/30(火) 04:40:04
malloc ← まろっく
char ← ちゃー
stdio ← すたじお
518デフォルトの名無しさん:2008/12/30(火) 04:45:22
auto????
alt[ernative]
m[emory]alloc
char[actar]
st[andar]d io
519デフォルトの名無しさん:2008/12/30(火) 04:47:03
auto????ってw
これをさらに略されても逆に困る
あうとと読んでもドイツ人にはすんなりかもしれない
520デフォルトの名無しさん:2008/12/30(火) 05:14:23
>>517
2番目、ふざけて書いたつもりなんだろうけど
本気でcharを「キャラ」とか読んでるとしたら大笑いだぞ。
ネイティブの人は普通に「チャー」等と発音して、「キャラ」なんて言う人居ないから。

charがチャーじゃなくてキャラだとしたら
intはイントじゃなくてインテと発音して
macはマックじゃなくてマクドと発音してるんだよな。
521デフォルトの名無しさん:2008/12/30(火) 05:17:24
キャラでもチャーでもなくて、チャラが正しい。
522デフォルトの名無しさん:2008/12/30(火) 05:19:05
>>520
イントとインテがどうとかとかアホだろ、本来なら母音つかねーから無意味な話だろwwww
523デフォルトの名無しさん:2008/12/30(火) 05:19:50
これな。
http://www.kouno.jp/home/c_faq/c20.html#39

なお、一部、通常の3倍のアクセス速度を求めたい場合のみ
別の読み方も許される模様。
524デフォルトの名無しさん:2008/12/30(火) 05:23:56
>>522
もしかして>>517に言ってる?
525デフォルトの名無しさん:2008/12/30(火) 05:26:23
>>522
その母音が付かない「charの発音の仕方」が、C FAQにすら載ってるんだけど>>523
526デフォルトの名無しさん:2008/12/30(火) 05:30:41
char の話なんかしてないけど?
527デフォルトの名無しさん:2008/12/30(火) 05:32:15
ぬるぽ
528デフォルトの名無しさん:2008/12/30(火) 05:33:25
529デフォルトの名無しさん:2008/12/30(火) 05:33:56
530デフォルトの名無しさん:2008/12/30(火) 05:40:08
ばかじゃねーの
531デフォルトの名無しさん:2008/12/30(火) 05:47:36
アンカー付けずに悪態つく奴は
厭世家気取りの厨二病患者だって
ばっちゃが言ってた!
532デフォルトの名無しさん:2008/12/30(火) 05:54:09
「が・・・あ・・・離れろ・・・死にたくなかったら早く俺から離れろ!!」
533デフォルトの名無しさん:2008/12/30(火) 06:02:17
ほんと腐ってんな。
534デフォルトの名無しさん:2008/12/30(火) 06:05:59
>>531
ばーか
535デフォルトの名無しさん:2008/12/30(火) 06:10:29
ばーかばーか
536デフォルトの名無しさん:2008/12/30(火) 06:11:28
>>520
マクドと聞くとMcDonald'sが想起されるわけだが
537デフォルトの名無しさん:2008/12/30(火) 11:52:43
C言語にもぬるぽはありますか?
あったとしてもJavaのパクリですよね^^
538デフォルトの名無しさん:2008/12/30(火) 12:18:00
Cに言語つけるのにJavaには言語つけないの?ジャワのことなの?原人なの?
539デフォルトの名無しさん:2008/12/30(火) 12:21:31
知らんguage
540デフォルトの名無しさん:2008/12/30(火) 12:42:37
wchar_tってなんて読むの?
541デフォルトの名無しさん:2008/12/30(火) 12:50:51
だぶちゃーてぃー
542デフォルトの名無しさん:2008/12/30(火) 13:22:32
ブチャラティでおk
543デフォルトの名無しさん:2008/12/30(火) 13:36:21
この味は!、、、嘘をついている味だぜ、、、
544デフォルトの名無しさん:2008/12/30(火) 14:12:09
入力した数値を、英語で表すプログラムを作成しています。

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

int data[100];
char line[100];
int i;
int end;

int main(){
fgets(line,sizeof(line),stdin);
sscanf(line,"%d",data);
end = strlen(line);
545デフォルトの名無しさん:2008/12/30(火) 14:13:08
for(i=0;i<end;++i){
switch(data[i]){
case 0:
printf(" zero ");
break;
case 1:
printf(" one ");
break;
case 2:
printf(" two ");
break;
case 3:
printf(" three ");
break;
case 4:
printf(" four ");
break;
case 5:
printf(" five ");
break;
case 6:
printf(" six ");
break;
case 7:
printf(" seven ");
break;
case 8:
printf(" eight ");
break;
case 9:
printf(" nine ");
break;}}return 0;}
546デフォルトの名無しさん:2008/12/30(火) 14:15:32
コンパイルは無事できましたが、表示の結果が、
「333」や「55555」だと
zero zero zero
zero zero zero zero zeroとなりますが、
「1」や「5」だと
one zero
five zero
となります。
NULL文字が悪さしているような気もするのですが、どこがおかしいのでしょうか?
547デフォルトの名無しさん:2008/12/30(火) 14:19:09
>>546
printf(" %d %d ", data[0], data[1]);
548デフォルトの名無しさん:2008/12/30(火) 14:23:15
>>547
ありがとうございます。
data[0]に「333」の数値ごとは入っていたわけですね。
ちょっと改良してみます!
549546:2008/12/30(火) 14:39:30
すみません、
「500」
このような数値を1つずつ、各要素に配るにはどうすればいいのでしょう?
550デフォルトの名無しさん:2008/12/30(火) 14:45:09
文字として扱え
551デフォルトの名無しさん:2008/12/30(火) 15:27:36
>>549
各桁をバラすってこと?

int n = 500;
data[0] = n % 10;
data[1] = n / 10 % 10;
data[2] = n / 100 % 10;

552デフォルトの名無しさん:2008/12/30(火) 15:35:41
もともとその数字は外部から入力したものじゃないの?
まあ数値を文字列にするのはitoa、、、いや
char data[xxx];
sprintf(data, "%d", n);
とか。
553デフォルトの名無しさん:2008/12/30(火) 18:45:19
xxxは禁句な
554デフォルトの名無しさん:2008/12/30(火) 20:12:54
プログラミングも学歴(特に数学)ですよ。
重回帰分析やらのプログラムを高卒プログラマが組める事は少ないですよ。
組めない人は絶望して下さい
あなたは理系ですらない底辺IT奴隷ウィッシュ☆
555デフォルトの名無しさん:2008/12/30(火) 20:30:50
重回帰分析を実装できない大学卒は掃いて捨てるほどいるけどなぁ。
556デフォルトの名無しさん:2008/12/30(火) 22:00:45
その文章のどこから大卒が出てきたのか理解しがたいが?
557デフォルトの名無しさん:2008/12/30(火) 22:04:13
コピペに反応するお前らが理解しがたいよ
558デフォルトの名無しさん:2008/12/30(火) 22:06:58
>>556
学歴の一例として挙げただけだろう。理解しようとなんか考えなくていいと思う。
559デフォルトの名無しさん:2008/12/30(火) 22:20:25
>>557
コピペじゃないだろ、ググれ
560デフォルトの名無しさん:2008/12/30(火) 22:36:09
今もC言語だけの仕事ってありますか?
561デフォルトの名無しさん:2008/12/30(火) 22:47:33
>>560
あるだろう。
携帯でもアプリはJavaだけど、ドライバーはCで作ってあるんじゃないの?
あとは通信ソフトとかかな。
562デフォルトの名無しさん:2008/12/30(火) 22:48:51
それすらもC++に替わってきているんじゃないの?
どれだけC++の機能を使えるんだか知らないけど。
563デフォルトの名無しさん:2008/12/30(火) 22:54:21
C++コンパイラがあるところはC++で作るだろうから。
Cのみというケースは、あるとすればクロス系の組み込みソフトかな?
564デフォルトの名無しさん:2008/12/30(火) 23:05:28
沢山あるよ。客先自身が古いソースの保守をしている場合、思考停止に陥ってCで書き続けることはよくあるから。
565デフォルトの名無しさん:2008/12/30(火) 23:12:35
というか保守案件で大幅にC++で書き直すアホはいないだろ
566デフォルトの名無しさん:2008/12/30(火) 23:21:50
役所とか古いUNIXのシステムで動いてるところはずっとCでやってるところもまだまだ少なくない
567デフォルトの名無しさん:2008/12/30(火) 23:25:00
いや、保守案件じゃない。新しく書き起こす場合でさえ、Cを使い続けているんだ。
ある客先には一応根拠を聞いてみたんだ。
・内製ライブラリはC++対応していない。
# extern "C"でC++から使えると言う発想はないらしい。
・OS間でコンパイラの互換性がないのでSTLは使えない。
# 何故かターゲットOSにHP-UXがあり、何故かバージョンアップできないらしい。
・C++でnewやテンプレートを使う程度なら、Cでも同じことができる。
# と、何故か信じ込んでいる。

あるプログラムが余りに無駄な処理をしているから、たまたま手元にC++で
同等の処理をするプログラムがあったので「使いませんか?」と提案したら、
「C++の保守をする気はないんで、Cに書き換えるなら採用します」と来たもんだ。
挙句、「なんで最初からCで書かないのか理解に苦しみます」と言われるに至って、
これはもう、何を言っても無駄だと悟りましたよもう。
568デフォルトの名無しさん:2008/12/30(火) 23:28:16
まぁ単純に人員の問題じゃね
胸張って「C++使えます」と言える人は
「C使えます」という人よりずっと少ない
569デフォルトの名無しさん:2008/12/30(火) 23:36:42
C++使えないプログラマが足を引っ張って
日本の情報技術のレベルを落としてるのは間違いないよな。
570デフォルトの名無しさん:2008/12/30(火) 23:38:32
ソフトはハードより硬い

誰か言ってたなあ
571デフォルトの名無しさん:2008/12/30(火) 23:43:01
プロとしての自覚が無いんだよ。
そんなだから失敗案件増やして会社が傾くんだ。
572デフォルトの名無しさん:2008/12/30(火) 23:43:31
マ板でやれ
573デフォルトの名無しさん:2008/12/30(火) 23:44:14
C++もできないでプログラマを名乗るなよな
574デフォルトの名無しさん:2008/12/31(水) 00:01:04
線形リストのノードへのポインタを1020ノード単位で配列に格納し、
任意のノードを検索する際に検索を高速化しようと思っているのですが、
ファイル分割をする際にどのような分割をすればよいでしょうか
リスト処理と配列処理(ノードへのポインタ追加や削除など)をソースファイルごとに別にすべきでしょうか
それともリストに内包される処理として、リスト処理関数の内部にそのまま実装すべきでしょうか?
575デフォルトの名無しさん:2008/12/31(水) 00:09:29
>>574
ファイルとソースファイルはそれぞれ何を指してて、リストと配列との関係は何なの?
576デフォルトの名無しさん:2008/12/31(水) 00:20:35
>>574
list.c
addlist() {...}
dellist() {...}
577デフォルトの名無しさん:2008/12/31(水) 00:29:01
その1020って数字はどっから出てきたんだ
578デフォルトの名無しさん:2008/12/31(水) 00:31:02
よくぞ訊いた。
1000か1024なら理解できるけど、俺は本筋でないから黙っていようと思ったのに。
579デフォルトの名無しさん:2008/12/31(水) 00:40:29
すみません。言い方が悪かったです。
list処理と配列処理自体をそれぞれ独立させ、それらをまとめる処理関数を作るべきか
list処理内部でごっちゃで実装してしまうか
図で表すと
インターフェース(以下二つの処理をまとめた外部へ公開する関数)
リスト.c-|-配列.c

または
配列をそのまま組み込んだリスト.c
580デフォルトの名無しさん:2008/12/31(水) 00:42:21
すげぇ、ここまで説明下手になれるなんて。
581デフォルトの名無しさん:2008/12/31(水) 00:45:11
>>578
データ 1020 バイト+ポインタ 4 バイト = 1024 バイトだと思うが。
582デフォルトの名無しさん:2008/12/31(水) 00:47:10
ポインタが8バイトとか2バイトだったらどうするんだyo!
583デフォルトの名無しさん:2008/12/31(水) 00:48:55
1024 - sizeof (struct node*) でおk
584デフォルトの名無しさん:2008/12/31(水) 01:22:05
>>579
配列をそのまま組み込んだリスト.c

のほうが100倍よい。
585デフォルトの名無しさん:2008/12/31(水) 02:19:13
>>581
意味わからん
それがどうして1020ノードになる
586デフォルトの名無しさん:2008/12/31(水) 02:20:11
1ノード1バイトなんじゃね?
587デフォルトの名無しさん:2008/12/31(水) 02:28:58
>>579
不可分ならまとめて作れ
個別で使う可能性があるなら個別に作れ
それくらいしか言えんよ
588デフォルトの名無しさん:2008/12/31(水) 23:42:41
質問です。int型のオーバーフローやdouble型のオーバーフローはどういうコードを書いて検知したらいいんでしょうか?
よろしくお願いします。
589デフォルトの名無しさん:2008/12/31(水) 23:48:14
double ならオーバーフローしたら∞になるから isinf で検出可能。
int での検出はアセンブラ使わないと不可能なので、
C では計算前にこの計算をしたらオーバーフローになるかどうかを
予めチェックするしかない。
590221:2009/01/01(木) 00:05:39
あけましておめでとうございます。
今年もご指導もほど宜しくお願いします。
591デフォルトの名無しさん:2009/01/01(木) 00:33:35
externで定義したグローバルな構造体にアクセスするのと
関数に、引数にポインタ変数として渡し、アクセスするのでは
速度的にどれくらい違うのでしょうか。

0.01msec単位で速度を詰めたいのですがどっちがいいのか
判断つきません。
592デフォルトの名無しさん:2009/01/01(木) 00:34:36
実測しろと言うのがわからんのかボケ
593デフォルトの名無しさん:2009/01/01(木) 00:34:49
気にせず引数にしろ。
大丈夫、0.1ms以上の桁で改善できる項目なんてほかにいくらでも湧いて出てくる。
594デフォルトの名無しさん:2009/01/01(木) 00:38:31
引数とグローバル変数ではキャッシュ効率も変わるので
実測してみないと何とも言えない。
595588:2009/01/01(木) 00:42:12
>>589
早速回答ありがとうございます。
int型に関しては、具体的にはこんな感じでいいのでしょうか?
int main(void) {
  int a, b;

  printf("Input two integral numbers:");
  fflush(stdout);
  scanf("%d %d", &a, &b);
  if (a > INT_MAX/b) {// オーバフロー検知?
    printf("overflow\n");
    return -1;
  }
  printf("a*b = %d\n", a*b);
  return 0;
}

596デフォルトの名無しさん:2009/01/01(木) 00:47:29
bに0が来たらどうするんだろうか
597デフォルトの名無しさん:2009/01/01(木) 00:49:49
>>595
0とか負とか考えると不十分やね。
64ビット型が使えるならこういう方法もある。

#include <stdint.h>
int64_t n = (int64_t)a * b;
if (n < INT_MIN || n > INT_MAX) {
 // オーバーフロー
}

stdint.h がない場合も、long long か __int64_t あたりが使えるんじゃないかな。
598588:2009/01/01(木) 00:53:20
>>596
しょぼいコードですみません。ゼロ除算のチェック以外は、だいたいこんな感じでいいんでしょうか?
どういう感じで書くのが、int型のオーバーフローチェックの一般的な書き方なのか分からなくて・・・
599デフォルトの名無しさん:2009/01/01(木) 01:02:13
int c = a * b
if (c / a != b) {
 /* オーバーフロー */
}

これでいいんじゃね。
600デフォルトの名無しさん:2009/01/01(木) 01:11:16
一般的には計算途中でのint型のオーバーフローチェックはしない

計算の元となる数字に上限下限を設定して(入力データ仕様というやつ)
各々の数字の入力時に範囲チェックを行い、範囲外ならハジくのが普通かな?
もちろん範囲内の数字なら、プログラムで行われるすべての計算でオーバーフローは発生しないという
保障をする必要がある
601588:2009/01/01(木) 01:12:19
>>597,599
なるほど!! ありがとうございます。
602デフォルトの名無しさん:2009/01/01(木) 01:14:43
まあそんなとこだろうな
プログラム内で発生しうる値の大きさをちゃんと把握しておけと
603デフォルトの名無しさん:2009/01/01(木) 01:28:32
>>599
だから 0 の場合を(ry
if (a != 0 && c / a != b) {
 /* オーバーフロー */
}
だな。
a が 0 なら必ずオーバーフローしないのでこれで問題は無い。
604デフォルトの名無しさん:2009/01/01(木) 11:02:55
上記をドモルガンの法則を用いて改変↓
605デフォルトの名無しさん:2009/01/01(木) 11:11:07
どう、ホモるかの法則で↓
606デフォルトの名無しさん:2009/01/01(木) 11:42:35
#include <stdio.h>
int main(void)
{
char i[80];
int a;
for(a=0; (i[a]=getchar())!='\n'; a++){
printf("%c",i[a]);
}
return 0;

}
607デフォルトの名無しさん:2009/01/01(木) 21:49:45
かけ算九九表を作ったんですけど
#include <stdio.h>
int main(void){
int test[10][10];
int i,j;
for(i=1; i<10; i++){
for(j=1; j<10; j++)
test[i][j]=i*j;
}
for(i=1; i<10; i++){
for(j=1; j<10; j++)
printf("%3d",test[i][j]);
printf("\n");
}
return 0;
}
1|
2|
3|を9|までやりたいんですが、if文をいじくって if(test[i][j]==test[j][1])などとやってもだめでした
表示のやり方教えてください。
608デフォルトの名無しさん:2009/01/01(木) 22:02:18
>>607
printf("%3d",test[i][j]);

printf(j == 1? "%3d|": "%3d",test[i][j]);
に変更する。
609デフォルトの名無しさん:2009/01/01(木) 22:07:48
おお!できました!
ありがとうございます。
そのif文がprintfの中でも使えるとは、思ってもいませんでした。
? 真:偽ですよね!本当にありがとうございました。
610デフォルトの名無しさん:2009/01/01(木) 22:15:05
三項演算子
611デフォルトの名無しさん:2009/01/01(木) 22:34:22

>>607 がやりたいことはこういうことではなかったのか?
#include <stdio.h>
#define N (9)

int main(void){
    int i, j;
    
    printf("   |");
    for(j=1; j<=N; j++){
        printf("%3d", j);
    }
    printf("\n");
    
    printf("___|");
    for(j=1; j<=N; j++){
        printf("___");
    }
    printf("\n");
    
    for(i=1; i<=N; i++){
        printf("%2d |", i);
        for(j=1; j<=N; j++){
            printf("%3d", i*j);
        }
        printf("\n");
    }
    
    return 0;
}

612デフォルトの名無しさん:2009/01/01(木) 22:39:21
611さん
まさにそんな感じです
とても参考になります
ありがとうございました。

613デフォルトの名無しさん:2009/01/01(木) 23:01:35
bitとかのことなんですが
32bitだとintは4バイトですか? 32/8=4
32bitだとメモリは4GBまでつめるってことですか?
求める公式がいまいちなんですが32bitを8bitでわればメモリ4GBが求まるってことでしょうか?
公式の出し方知ってる人おしえてください。
64bitは8GBですよね?
614デフォルトの名無しさん:2009/01/01(木) 23:02:53
tree 木
book 本
...

のように英単語とその訳語が並んでいるtxtファイル(英語と日本語の単語間はタブ区切りです)を読み込んで、
オープンハッシュ法によるデータベースを作ろうとしています。
ファイルを読み込むプログラムを
void command_hread (char *fname, lnode **db, int size)
{
FILE *fp;
char *index, *data;
int i;

if((fp = fopen(fname, "r")) == NULL)
printf("Cannot open the file.¥n");
else{
while(fscanf(fp, "%s%s", index, data) == 2){
i = hash (size, index);
db[i] = list_insert (index, data, db[i], my_strcmp);
}
}
}

のように書き、indexとdataに入った英単語と訳語を自前の関数でハッシュテーブルに登録しようとしているのですが、Bus Errorが起きてしまいます。
自前の関数は他の所では使えているので、ファイルの読み込みのあたりでエラーが出ているのだと思うのですが、どこらへんが悪いのでしょうか・・・?
615デフォルトの名無しさん:2009/01/01(木) 23:16:08
>>614
index, data を適当に

char index[255], data[255];

などと確保しておく必要がある。
616デフォルトの名無しさん:2009/01/01(木) 23:18:34
>>613
ビットは2進法での桁を表す言葉。
2進法(binary)+桁(digit)=ビット(bit = b + it) という風にして作られた造語。
     ~             ~~
例えば2進数 1010011 は7桁あるので7ビット。

ただ、ビット単位でデータを扱うのはサイズが細かすぎて不便なので、
普通は数ビット1かたまりでデータを扱う。
その最小単位がバイト(byte)。
コンピュータが一度に「口に入れられる」(扱える)単位ということで、
噛む(bite)になぞらえてバイト(byte)と名付けられた。
そういうわけなので、コンピュータによってバイトのサイズは異なるわけだが、
今のコンピュータでは1バイト=8ビットなものが多い。

積めるメモリの上限は OS によって異なる。
例えば 32ビット版の Windows XP は 3GB までのメモリしか使えない。
単に OS の制限であって、法則とかはない。
617デフォルトの名無しさん:2009/01/01(木) 23:23:44
>>613

>>616
>単に OS の制限であって、法則とかはない。

OSの制限はあるけど、法則ないというわけじゃないんじゃない?

32bit System
2^32 = 2^2 * 2^30 = 4G

64bit System
2^64 = ... (単位考えるのメンドクサイから省略)

とりあえず「メモリ空間」とか「アドレス空間」とかでググってみるといいかも
618デフォルトの名無しさん:2009/01/01(木) 23:31:17
616さん
1バイト=8bitってことは
32ビットマシンは4バイトを一度に処理できるってことですか?

619デフォルトの名無しさん:2009/01/01(木) 23:39:17
>>617
16ビットシステムでも1GB扱えるわけで。
今のセグメントの扱いだと4GB超えられないのは確かだが、
それも単にCPUをそういう風に作ってしまったからというだけで、
32ビットのシステムだから4GBを超えられないというわけでもない。
620デフォルトの名無しさん:2009/01/01(木) 23:40:00
間違えた。
×1GB
○1MB
もう単位の感覚があの頃と変わってしまっているね。
621デフォルトの名無しさん:2009/01/01(木) 23:41:53
>>618
そういうこと。
まあ、一度に処理できるというか、
4バイトを1つの数値として扱えるというか。

ただ、4バイトを一度に処理できるけども、
1バイト単位で処理することもできる。
622デフォルトの名無しさん:2009/01/01(木) 23:46:36
1ワードでぐぐれ
623デフォルトの名無しさん:2009/01/01(木) 23:50:48
Cで、
「一定時間毎にあるデータが任意のフォルダに保存される状況の下、データが保存される度にその保存されたデータに対してある処理を行う」
というようなことを行わせることは可能ですか?
可能な場合、どういう風にすれば出来ますかね?sleep命令とか?
624デフォルトの名無しさん:2009/01/01(木) 23:56:16
Windows ならフォルダの更新を監視する API があったと思う。
別の OS でも似たようなものはあるかもしれないが、俺は知らない。
まあ、どちらにしろ対象 OS のスレに行った方がいい気がする。
625デフォルトの名無しさん:2009/01/02(金) 00:15:59
>>623
inotifyでぐぐれよウンコ野郎
626デフォルトの名無しさん:2009/01/02(金) 00:33:28
>>624
>>625
そういうAPIがあるんですね。
出来そうな気がしてきました。色々調べてみます。
ありがとうございました。
627デフォルトの名無しさん:2009/01/02(金) 00:36:24
#defineマクロでfor_eachマクロを作りたいのですが
いまいちうまくいきません

typedef struct _list
{
int data;
list *next;
list *prev;
}list;

#define list_for_each()
この先どうしたらいいのでしょうか
628デフォルトの名無しさん:2009/01/02(金) 00:48:43
そんなマクロは作らなくてよろしい。
制御構文を変更する類いのマクロは
混乱を来す要因になる。
629デフォルトの名無しさん:2009/01/02(金) 00:54:19
毎回リンクリストを書くの嫌だ
なんとかしてくださいよ助けてくださいよ

もうかれこれ50回ぐらい書いてる
630デフォルトの名無しさん:2009/01/02(金) 00:56:55
それだけ書いたなら、どうマクロ作ればいいか自ずからわかると思うが。
631デフォルトの名無しさん:2009/01/02(金) 01:00:18
#define list_for_each(sp, ep, fn) do{ \
for(list_for_each_p=sp; list_for_each_p!=ep; list_for_each_p=sp->next) \
  list_for_each_p->fn(); \
}while(0)
632デフォルトの名無しさん:2009/01/02(金) 01:00:53
まちがった
for(list_for_each_p=sp; list_for_each_p!=ep; list_for_each_p=list_for_each_p->next) \
633デフォルトの名無しさん:2009/01/02(金) 01:10:12
こっちのほうがいいんじゃないかな
  fn(list_for_each_p);
634デフォルトの名無しさん:2009/01/02(金) 01:32:16
>>627
typedef struct _list list;
struct _list {
 ...
 list *prev;
};

とかじゃないとコンパイルエラーにならね?
635デフォルトの名無しさん:2009/01/02(金) 01:34:30
予約識別子を使うなよ
636デフォルトの名無しさん:2009/01/02(金) 02:25:02
_俺が予約だ!
637デフォルトの名無しさん:2009/01/02(金) 02:41:06
処理系作ってる最中なんだよ。
放っといてくれよ。
638デフォルトの名無しさん:2009/01/02(金) 05:09:06
すみません、for文で数値の100が来たら、終了すると
したいのですが、できませんので、助言お願いします。

for文の中でif(b==100) までわかりました。
639デフォルトの名無しさん:2009/01/02(金) 07:14:47
なにを終了するのかはっきりしないが、forループを終了するなら
if(b==100) break;
640デフォルトの名無しさん:2009/01/02(金) 07:23:18
いやいや、for文の括弧の中で、for( ; b!=100; ) で
641デフォルトの名無しさん:2009/01/02(金) 07:52:52
bが更新されるタイミングについて>>638が何も言っていないので、
>>639の方が正解だろ。
642デフォルトの名無しさん:2009/01/02(金) 08:00:24
分からんよ、○+× = 5 になる2つの値がいくつかあるように、答えは1つではないし
正解と言えるけど、比較して〜の方がと決め付けるのはどうかと。
643デフォルトの名無しさん:2009/01/02(金) 08:15:34
単純に640の方が範囲が狭いだろw
644デフォルトの名無しさん:2009/01/02(金) 11:02:32
電卓を作ろうとしているんですが。
#include <stdio.h>
int main(void){
int i,j;
int a[3][3]={
{1,2,3},
{4,5,6},
{7,8,9},
};
printf(" _________\n");
printf(" |_________|\n");
for(i=0; i<3; i++){
for(j=0; j<3; j++)
printf(j==0?" |%d":"%4d",a[i][j]);
printf(j==3?"|":"%4d",a[i][j]);
printf("\n");
}
return 0;
}
_________
|_________|
|1 2 3 |
|4 5 6 |
|7 8 9 |
この形まで出せたんですが下の形の_______________を出力したんですが。
どうすればいいんでしょうか?
printf(i==3?"_":"_");などとやってもできませんし
教えてください。
645デフォルトの名無しさん:2009/01/02(金) 11:25:30
printf("-------");
646デフォルトの名無しさん:2009/01/02(金) 13:32:00
C の質問というより AA の質問だなw
- か ~ を使えばいいんじゃない?
全角文字使えるなら  ̄ でいいだろうけど。
647デフォルトの名無しさん:2009/01/02(金) 13:41:14
電卓の厚みをあらわすために=======はどう?
648デフォルトの名無しさん:2009/01/02(金) 15:52:14
質問させてください.
for (;;)
このセミコロン2回にはどういう意味があるんでしょうか.

H8マイコンのプログラムソースにこのような"for"の使い方がされていて
いるのですが,どういう処理がされているのか分かりません.
よろしくお願いします.
649デフォルトの名無しさん:2009/01/02(金) 15:54:31
for は普通 for(i = 0; i < 10; i++) のように使うが、
それぞれの部分は必要ないなら省略することが可能。
全部省略すると for(;;) になる。
この場合、無限ループになる。
650デフォルトの名無しさん:2009/01/02(金) 15:58:39
>649

なるほど,ありがとうございます
651デフォルトの名無しさん:2009/01/02(金) 15:58:56
>>648
forの2番目のところを省略すると、常に真と解釈されるので、無限ループになる。
H8は関係なくC言語の規則な。
652デフォルトの名無しさん:2009/01/02(金) 16:06:40
#defineで(2^32)-1の値をを定義したいんですけどその場合ってやはり先にその値を計算しておいて

#define EXAM 4294967295 みたいにするほかないんでしょうか?

#defineのところで関数をうまく使ってその場で計算して定義するようなことってできないでしょうか?
653デフォルトの名無しさん:2009/01/02(金) 16:09:58
#include <stdint.h> の UINT32_MAX では不満か?
654デフォルトの名無しさん:2009/01/02(金) 16:17:31
1LL<<32-1
655デフォルトの名無しさん:2009/01/02(金) 16:22:58
>>652
32bit環境用
 (~0U)
64bit環境用
 ((1<<32)-1)
どっちでも用
 0xFFFFFFFF
 (~(~0<<32))
656デフォルトの名無しさん:2009/01/02(金) 16:27:12
マクロで定数を定義するのに、先に計算しとかない理由がわからない。
657デフォルトの名無しさん:2009/01/02(金) 16:38:25
負数の表現が2の補数以外の処理系でもちゃんと動くようにしたんじゃないかな。
658デフォルトの名無しさん:2009/01/02(金) 17:01:10
2つの値を戻したいんですけど構造体とポインタどっちを使ったほうがいいとかってありますか?
使い分けが知りたいんですが……
659デフォルトの名無しさん:2009/01/02(金) 17:08:15
俺は引数にポインタしか使わない。
660デフォルトの名無しさん:2009/01/02(金) 17:16:45
好きにしたまえ
661デフォルトの名無しさん:2009/01/02(金) 17:17:37
その関数のためだけに構造体を用意してくるとかはちょっと・・・・・
662デフォルトの名無しさん:2009/01/02(金) 17:26:01
使い分けが分からないならもうちょっと勉強進めてみたら?
「線形リスト」の作成とか
663デフォルトの名無しさん:2009/01/02(金) 17:30:04
>>658
構造体が小さければ、戻り値で返してもいいんじゃないかな。大きければ引数に構造体のポインタで返せばいいんじゃないかな
664デフォルトの名無しさん:2009/01/02(金) 17:45:08
>>655
<<32 をしても何も起きない32ビットCPUもあるだろう。
665デフォルトの名無しさん:2009/01/02(金) 18:02:23
>>652
実行時に計算が行われるようなマクロは、その結果が実行時に変化する場合にだけ意味がある。
素直に数値を計算して叩きこむこと。
666デフォルトの名無しさん:2009/01/02(金) 18:05:58
>>665
コンパイル時に計算が行われるようなマクロをすっとばして
自分で計算するなよwww
667デフォルトの名無しさん:2009/01/02(金) 21:16:41
情報系の1年でC言語を習い始めたんだけど学校じゃLinuxなのに
自分のPCはWindowsだから家で復習とかが出来ません
windowsでもc言語を勉強できるようなソフトはないんでしょうか?
668デフォルトの名無しさん:2009/01/02(金) 21:18:52
Cygwin使え。
669デフォルトの名無しさん:2009/01/02(金) 21:20:45
http://www.sikaku.gr.jp/js/side3/scon04.html
この3級合格できそうなんですが。
みなさんは2級とか楽に合格できますか?
ここの人ならできそうな気がします。
670デフォルトの名無しさん:2009/01/02(金) 21:23:34
たしかに cygwin はいいですねえ。一応シグナルもOKみたい。宿題スレで使っています。
671デフォルトの名無しさん:2009/01/02(金) 21:25:09
>>669
一級できてもたいしたことないレベル
672デフォルトの名無しさん:2009/01/02(金) 21:26:09
>>669
宿題スレにきていただければいいかと。まれに神が光臨します。
673デフォルトの名無しさん:2009/01/02(金) 21:36:43
671さん
2級は500行以上のコード書くんですよ?
1級なんてすごい難しい気がします
674デフォルトの名無しさん:2009/01/02(金) 21:37:14
神よりも頭のおかしい奴の方が降臨率高いけどな。
今日も朝から暴れてたし。
675デフォルトの名無しさん:2009/01/02(金) 21:39:03
>>673
仕事だと500行はあっという間に超えてしまうから安心してください。
676デフォルトの名無しさん:2009/01/02(金) 21:42:14
>>673
レベルとしては1級であっても
基礎的なことは習得しました
ぐらいなんだと思ってください
677デフォルトの名無しさん:2009/01/02(金) 21:45:46
初段からが一人前。
678デフォルトの名無しさん:2009/01/02(金) 21:46:00
ちょっとしたゲームでも5000行超えますね^^
679デフォルトの名無しさん:2009/01/02(金) 21:52:37
>>667
VirtualBox, VMware, VirtualPC

このへんぐぐってみれ
Windows上の1アプリとして学校とそっくり同じ環境が作れる
680デフォルトの名無しさん:2009/01/02(金) 23:53:51
>>678
N-BASIC 時代なら1画面プログラムでゲーム作るとかよくあったぜ。
681デフォルトの名無しさん:2009/01/03(土) 01:08:24
>>673
ちょっとしたツールでも丁寧に作れば、簡単に 1000ステップを超えると思います。
682デフォルトの名無しさん:2009/01/03(土) 01:12:57
>>674
コードを書いたらちゃんと見てあげているし、いいところはいい、と褒めてあげているのに、まだ殻を破ることができないのですね。
683デフォルトの名無しさん:2009/01/03(土) 01:49:28
何様w
684デフォルトの名無しさん:2009/01/03(土) 01:58:26
連結リストの勉強で
mallocやcallocで確保した領域は必ずfreeで開放するべきと書いてあるが
free書き忘れたり違ったアドレスを開放しようとしてもコンパイル(Borland C)が警告してくれないし
普通にプログラムの実行もできてるため、ちゃんと開放されているか不安です

一応領域確保と開放をするごとにprintf("%p")でアドレスを確認しながら恐る恐る実行してるのですが
freeし忘れたり変な所を開放したりするとどうなるんですか?
685デフォルトの名無しさん:2009/01/03(土) 02:01:36
コンパイル compile
コンパイラ compiler
686デフォルトの名無しさん:2009/01/03(土) 02:03:40
>>684
・ free し忘れると
メモリリークと呼ばれる状態になる。
プログラムが終了するまでずっとそのメモリを開放する手段が無くなる。
ループ内でこれをやっちゃうと、どんどん開放できないメモリが増えていって
そのうちメモリが一杯になる恐れがある。

・ 変な所を開放すると
死ぬ。
687デフォルトの名無しさん:2009/01/03(土) 02:07:09
・ 変な所を開放すると
死ぬ。

がくがくぶるぶる((((;?Д?))))
688デフォルトの名無しさん:2009/01/03(土) 02:12:02
>>684
一般的な環境で言うなら

解放忘れて、別に何も起こらない
終了後にOSがきちんなんとかしてくれる
変なとこ解放したところで、せいぜいそのプログラムが落ちる程度

ただマルチスレッドとかで扱ういろいろだと
終了後も領域解放されないままとかもありえる

あとは、確保した領域がすべて解放されたかチェックするツールとかあるよ
689デフォルトの名無しさん:2009/01/03(土) 02:14:41
>free書き忘れたり違ったアドレスを開放しようとしてもコンパイル(Borland C)が警告してくれないし
free()に渡すのは識別子ではなくポインタの値で、
これは実行時に決定されるものだから、
コンパイル時に警告できるはずがない

重要なことは、領域を確保する部分と開放する部分が
常に対で呼ばれるようなインタフェースを作ること
なるべくなら割り付けた領域のアドレスをナマで持ち歩くことは避けて、
構造体などに含めてそのポインタを受け渡しする
FILE構造体とfopen()とfclose()の関係を思い浮かべると良い
690デフォルトの名無しさん:2009/01/03(土) 02:16:40
>689
constみたいに、free可能なポインタにつけるキーワードがあれば便利だったかもね
691デフォルトの名無しさん:2009/01/03(土) 02:25:46
> free()に渡すのは識別子ではなくポインタの値で
こういう知ったかは困るね。識別子の意味が分かってないようだし。
692デフォルトの名無しさん:2009/01/03(土) 02:28:50
>>691
君がその言葉の意図を分かっていないだけだろう。
初心者は char* hoge = malloc(size); とやると、
char* p = hoge; free(p); とすることに不安を覚えるものだ。
693デフォルトの名無しさん:2009/01/03(土) 02:35:41
脊髄反応、やはり宿題スレでwhile文の指摘をされて、馬鹿とか言ってファビョってた
あの基地外か。以後放置よろ。識別子なんて、調べればすぐに分かるし、余計な
一言で、全て間違いにしてしまう奴は、知ったかの自身過剰の墓穴掘りだから。
694デフォルトの名無しさん:2009/01/03(土) 02:37:04
695デフォルトの名無しさん:2009/01/03(土) 02:50:07
詳しい回答ありがとうございます。
きちんと領域の確保と解放ができるように気をつけます
696デフォルトの名無しさん:2009/01/03(土) 03:13:01
ttp://www.bohyoh.com/CandCPP/C/Library/free.html
freeに渡しているのは、どう考えてもポインタ型の識別子です、ありがとうございました。
697デフォルトの名無しさん:2009/01/03(土) 03:24:00
malloc の返す値が予め分かっていれば、
別に定数をポインタ型にキャストしたものを free しても問題はない。
698デフォルトの名無しさん:2009/01/03(土) 03:28:51
ttp://wpedia.goo.ne.jp/wiki/%bc%b1%ca%cc%bb%d2/?ie=EUC-JP
ttp://c-lang-primer-review.blogspot.com/2008/06/3_22.html
識別子ではない、なんてとてもじゃないが言えませんね v(^-^)v
口が裂けても、識別子ではなく、なんて言えません ><;
識別子を使わないなら、どうやってポインタの識別子が指し示す
確保した領域を開放するんでつか? ><;
free(アドレス) こうですか?分かりません ><;
699デフォルトの名無しさん:2009/01/03(土) 03:40:21
識別子を渡しているわけじゃないだろ。
渡しているのは識別子などにより構成される式の値だ。
700デフォルトの名無しさん:2009/01/03(土) 03:45:21
識別子なんてのはマシン語にまで翻訳してしまえば消えてなくなるもの。
それがまるでさも実体を持っているかのように考えるのは愚昧。
701デフォルトの名無しさん:2009/01/03(土) 03:47:27
>>697
誰もそんなことは言っていないが?識別子が何なのか?についてだぞ?w
702デフォルトの名無しさん:2009/01/03(土) 03:48:38
都合の悪い物はスルーするところが面白い。
703デフォルトの名無しさん:2009/01/03(土) 04:00:02
「関数」に「渡す」のが値
「引数」に「与える」のが識別子
コンパイラがチェックするのは引数と識別子の型だけ

何もおかしくはない
704デフォルトの名無しさん:2009/01/03(土) 04:08:24
int size = strlen(hoge);
char* str = malloc(sizeof (int) + size + 1);
str += sizeof (int);

*((int*)str - 1) = size;
strcpy(str, hoge);

printf("size = %d, str = %s\n", *((int*)str - 1), str);

free(str - sizeof (int));

CString でやってることを C で再現してみたもの。
str - sizeof (int) は識別子ですか。そうですか。
705デフォルトの名無しさん:2009/01/03(土) 04:12:13
unsigned long i = (unsigned long)malloc(256 * sizeof(char));
/* some statements */
free((void *)i);
値( (void *)i )が、渡されるわけで識別子は関係ない。

free(malloc(256 * sizeof(char));
この識別子は、なんだろうか。

とか書くと特殊な例に過ぎないと返されそうだな。
706デフォルトの名無しさん:2009/01/03(土) 04:19:35
引数として式の値を渡す。
free(malloc(256 * sizeof(char));において、その式はmalloc(256 * sizeof(char)という関数呼出式である。
free(hoge);において、その式はhogeという識別子からなる一次式である。

がんばって好意的に解釈すればこんな感じ?
文法上、ある種の式は識別子単体そのものであることから引っ張ってみた。
707デフォルトの名無しさん:2009/01/03(土) 07:53:54
すみません他人のソースを読んでいて
分からないところがあり、質問なんですが
struct hoge {
unsigned a:12;
unsigned b:4;
}
:12とか:4はどんな効果があるのですか?
708デフォルトの名無しさん:2009/01/03(土) 08:01:55
>>707
変数を制限するもの

その例だと
変数aは12ビット
変数bは4ビット
で表すことのできる整数のみを扱える。
709デフォルトの名無しさん:2009/01/03(土) 08:05:14
ビットフィールド
710デフォルトの名無しさん:2009/01/03(土) 08:05:15
>>708
ありがとうございます
がってんいきました
711デフォルトの名無しさん:2009/01/03(土) 12:01:17
#include <stdio.h>
#include <string.h>
int main(void)
{
char hoge[3][80];
int i;
for(i=0; i<3; i++){
gets(hoge[i]);
}
do{
printf("moji\n");
scanf("%d",&i);
if(i>=0 && i<3;)
printf("%s",hoge[i]);
}while(i>=0);
return 0;
}
1-3までの数字をいれると入れた文字が出力されます。
だけど0からはじまるんですが、i--;で配列をずらしているんですが。
hoge[i-1];とやっても出力エラーがでてしまいます
やはりデクリメントでしかずらせないんでしょうか?
(hoge[i]-1)でも無理です。
712デフォルトの名無しさん:2009/01/03(土) 12:22:14
if(i>=0 && i<3;) ← このセミコロンが気になる〜
713デフォルトの名無しさん:2009/01/03(土) 12:24:55
if (i>=1 && i<=3)
printf("%s",hoge[i-1]);
じゃないのか?
714デフォルトの名無しさん:2009/01/03(土) 12:44:30
完全二分木ではない二分探索木の深さを求めるには、葉までの深さを一つ一つ求めていくしかないのでしょうか?
715デフォルトの名無しさん:2009/01/03(土) 13:07:57
>>688
>確保した領域がすべて解放されたかチェックするツールとかあるよ
んー、ポインタください。
私は自前でmalloc()/realloc()/free() にラッパかぶせてしのいでいます。
716デフォルトの名無しさん:2009/01/03(土) 13:11:55
何故calloc()はラップしないのだろう……
717デフォルトの名無しさん:2009/01/03(土) 13:16:09
>>714
ん、そうではありますが、リカーシブにすれば簡単です。
718デフォルトの名無しさん:2009/01/03(土) 13:17:28
>>683
前途ある中学生をいじめるのはかわいそうでしょ?
719デフォルトの名無しさん:2009/01/03(土) 13:24:18
簡単かどうかじゃなくて O(1) や O(logN) で求めたいけど
O(N) かかっちゃうのはどうにかならんの? って話じゃない?

ノードを追加する際に深さをノードに保存しておくようにすると
O(1) で取得できるようにはなるよ。
その代わりノードの追加に少しコストが増えるけど。
720デフォルトの名無しさん:2009/01/03(土) 13:57:12
>>719
末端の方でノードを追加すると、それから上の全部の深さ変数を更新しなければならないのですか‥‥‥。
721デフォルトの名無しさん:2009/01/03(土) 14:00:45
そっちも時間かかっちゃだめなの?
722デフォルトの名無しさん:2009/01/03(土) 14:14:04
ノードを追加しようとノードをたどっていく際に
深さ変数をインクリメントするだけだから
大したコストじゃないよ。
削除する際も同様ね。
723デフォルトの名無しさん:2009/01/03(土) 14:15:27
正確に言えばノードをたどって戻っていく際に、だな。
724673:2009/01/03(土) 15:52:03
トランプ表示のプログラムを作りました
tramp.h
void tramp(void);

void tramp(void)
{
int x=0;
printf("select Number:");
scanf("%d",&x);
if(x>=1&&x<=9){
printf("\x1b[0m");
printf("\n");
printf("\x1b[37m --------\n");
printf("|%d |\n",x);
printf("| |\n");
printf("| :) |\n");
printf("| |\n");
printf("| %d |\n",x);
printf(" --------\n");
printf("\x1b[0m");
}else
{
printf("1~9 Input\n");
}
}
725673:2009/01/03(土) 15:52:44
main.c

int main(void)
{
int x;
for(;x!=EOF; x++)
{
tramp();
}
return 0;
}
横に3個や5個などトランプを横に表示したんですが、改行されて複数の場合縦に表示されてしまいます。
3個並べれば神経衰弱などが作れそうな気がするんですが。
詳しい方教えてください
726デフォルトの名無しさん:2009/01/03(土) 15:53:27
途中で、もう片側の方がはるかに深い、ということでそれ以上戻る必要がない、という場面も考えられますしね。
727デフォルトの名無しさん:2009/01/03(土) 15:55:19
改行しなければ良い。
3個や5個表示したその後に改行する。
728673:2009/01/03(土) 16:03:00
727さん
その手で試した事があるんですが、型を作るのが大変でした。
試してみます。
最近、テキストベースで絵を表示するプログラムにはまっています。
729デフォルトの名無しさん:2009/01/03(土) 16:08:33
エスケープシーケンスはカーソルを移動させることもできるよ。
730デフォルトの名無しさん:2009/01/03(土) 16:18:49
単機能ごとに関数分けるとやりやすくなると思うけどな。
731デフォルトの名無しさん:2009/01/03(土) 16:37:50
C以前の問題なのですが
#include <stdio.h>

int main(void)
{
printf("ハローワールド");
return 0;
}
をコンパイルして、XP上で実行たら確認するまもなくウィンドウが閉じてしまいました。
実行後、ウィンドウが自動で閉じるのをとめるにはどうすればいいのでしょうか?
732デフォルトの名無しさん:2009/01/03(土) 16:39:05
・ printf の後に putchar(); を実行させる。
・ デバッグなしで実行する

お好きな方を
733デフォルトの名無しさん:2009/01/03(土) 16:39:37
間違えた。
getchar(); だった・・・。
734デフォルトの名無しさん:2009/01/03(土) 16:48:33
>>731
つ system("PAUSE");
735デフォルトの名無しさん:2009/01/03(土) 17:00:47
>>732 >>734
ありがとう御座いました。
プログラムに動体視力を求めれたのかと思いきちんと実行できているのかわからず困っていました。
ありがとう御座います。
736714:2009/01/03(土) 17:01:04
>>717
>>719
いえ、オーダーはあんまり気にしてません。
どちらかというとコードを書くのが楽なのはどんなプログラムかなーと・・・
再帰で書くとするとどんな感じにすればよいのでしょうか・・?
737デフォルトの名無しさん:2009/01/03(土) 17:10:04
適当に書いてみた。
デバッグとかはしてない。

static int get_depth_rec(node* node, int depth) {
 if (node == NULL) {
  return depth;
 }

 int ldepth = get_depth_rec(node->lnode, depth + 1);
 int rdepth = get_depth_rec(node->rnode, depth + 1);
 return max(ldepth, rdepth);
}

int get_depth(node* node) {
 return get_depth_rec(node, 0);
}
738デフォルトの名無しさん:2009/01/03(土) 17:31:07
while(j=10-i++) < モロにコンパイラが警告を出していますね
代入式と条件式の区別が出来ない人って、やーね。デリカシーが無いというか。
739デフォルトの名無しさん:2009/01/03(土) 17:36:48
それをエラーにしないC言語は漢だ。その是非はともかく。
740デフォルトの名無しさん:2009/01/03(土) 17:37:29
while((j=10-i++)!=0)もしくはwhile((j=10-i++)>0)って書けば満足なのか?
冗長だし、比較が1ステップ増えるのが無駄だと思うんだが。
741デフォルトの名無しさん:2009/01/03(土) 17:44:12
コンパイラを黙らせることができるから無駄ではない
742デフォルトの名無しさん:2009/01/03(土) 17:45:41
警告の意味もわからずにそれを出なくするための小細工するのは有害
743デフォルトの名無しさん:2009/01/03(土) 17:47:10
意味が分かってるから問題ない
744デフォルトの名無しさん:2009/01/03(土) 17:48:38
意味がわかってりゃ出なくする必要がないこともわかるはずだがw
745デフォルトの名無しさん:2009/01/03(土) 17:49:34
いや、必要あるだろ。
それも分からないようでは未熟きわまりない。
746デフォルトの名無しさん:2009/01/03(土) 17:53:04
警告なんて概念自体が害悪。
警告もエラーと同等のものとして潰すべき物だ。

今回の例で言えば、typo で = になっている部分と明確に区別し、
これは typo で = になってるわけじゃないですよ、と、
ソースを読む人とコンパイラとの両方に示す意味がある。
747デフォルトの名無しさん:2009/01/03(土) 17:53:13
なんでここ来てるんだよw
宿題スレでももう一個の方でも、もとのところに帰れよ。

それとも、どこに書き込んでるかわからないほど顔真っ赤なのか?
748デフォルトの名無しさん:2009/01/03(土) 17:54:31
とうとう自分にレスをし始めたか・・・
749デフォルトの名無しさん:2009/01/03(土) 17:56:26
>>741
おまえさんの手元のコンパイラ1つ黙らせられれば済む話か?
750デフォルトの名無しさん:2009/01/03(土) 17:58:51
while((j=10-i++))でいいんじゃないの?
751デフォルトの名無しさん:2009/01/03(土) 18:02:59
代入式じゃだめで条件式じゃなきゃいけないって言ってるからそれじゃ納得しないかと思って。
()をつけても代入式じゃなくなるわけじゃないし。
752デフォルトの名無しさん:2009/01/03(土) 18:09:10
>>751
そのとおり
753デフォルトの名無しさん:2009/01/03(土) 18:10:27
つーかこれはコメント残さないとどうしようもないから
for文になおしちゃうかな
754デフォルトの名無しさん:2009/01/03(土) 18:12:51
ん、for なら警告しないんだっけ?

# そんな LR にいちいち付き合ってらんねー
755デフォルトの名無しさん:2009/01/03(土) 18:17:57
代入と比較を別にするって意味だろう。多分。
756デフォルトの名無しさん:2009/01/03(土) 18:17:58
>>738はwhile((j=10-i++))についてはどう思うのか聞いてみたいところ。
757デフォルトの名無しさん:2009/01/03(土) 18:19:02
>756はコンパイラとしては代入文そのものじゃなくなるから不満はなくなるが、
果たしてすっとこどっこいな人間が読んだらどう思うか不安にはなるな。
758デフォルトの名無しさん:2009/01/03(土) 18:20:53
for (j=10,i=1; j>0; j--,i++)
とかさ
759デフォルトの名無しさん:2009/01/03(土) 18:21:40
代入式の値であることは()をつけてもつけなくても変化ないんだけどね。
760デフォルトの名無しさん:2009/01/03(土) 19:24:48
質問します

/* main.c */

int main(void)
{
f();
return 0;
}

/* sub.c */
int f(void)
{
return 1;
}

/* sub.h */
int f(void);

みたいな関係があったとき、main.cに追加することになるのは下のいずれかになると思います。
extern int f(void);
#include "sub.h"

これらの違いがわからないので教えてください。
761デフォルトの名無しさん:2009/01/03(土) 19:30:37
#include するかしないか。
762デフォルトの名無しさん:2009/01/03(土) 19:32:29
>>761
externではだめなのですか?
763デフォルトの名無しさん:2009/01/03(土) 19:33:14
>>762
関数宣言については

何も付けない場合は extern がついてるのと同じになる
764デフォルトの名無しさん:2009/01/03(土) 19:33:43
extern を書かなかったら、
それ以前に static int f(void); と書かれていない限り、
extern が指定されたものと見なされる。
765714:2009/01/03(土) 19:34:46
>>737
おお、ありがとうございます。
766760:2009/01/03(土) 19:43:32
回答ありがとうございます。

ではmain.cに追加するのが
int f();
#include "sub.h"
の違いはどうなのですか?

この場合はまったく同じかもしれませんが一般的な違いを教えてください。
767デフォルトの名無しさん:2009/01/03(土) 19:46:13
void の有無が違う。
int f(void); は引数がない。
int f(); は引数に関する情報がない。(引数はあるかもしれないし、ないかもしれない)
引数が無いのなら void と明示する方が良い。

(C++ だと () も (void) と同じになるのだが)
768760:2009/01/03(土) 19:50:46
>>767
そうなるのですか。

main.cに追加するのが
int f(void);
#include "sub.h"

の2つのうち1つならこれらの違いはどうなるんですか?
769デフォルトの名無しさん:2009/01/03(土) 19:51:41
#include は
コンパイルの実行前にあらかじめファイルの内容を埋め込む感じの命令
だから一緒になる
770デフォルトの名無しさん:2009/01/03(土) 19:51:54
#include するかしないかだけの違いしかない。
#include は指定したファイルの中身がそこに埋め込んでファイルを合成する命令だからね。
771デフォルトの名無しさん:2009/01/03(土) 19:57:01
#で始まる行はcppが処理する
cc(Cコンパイラ)とcpp(Cプリプロセッサ)ぐらいは知っといたほうがいい
772デフォルトの名無しさん:2009/01/03(土) 19:57:47
>>747
戻ってきてもらっても困るのですが。
773760:2009/01/03(土) 19:57:59
なるほどわかりました。ありがとうございます。
774C初心者:2009/01/03(土) 20:08:33
ポインタを利用した二分探索木の作成がどうしても分からないのですが、どなたか教えてください。

775デフォルトの名無しさん:2009/01/03(土) 20:12:26
調べた上でわからないなら、ここで聞いてもわからないよ
776デフォルトの名無しさん:2009/01/03(土) 20:13:36
そもそも初心者がいきなり手を出すものでもない気がするよ。
777デフォルトの名無しさん:2009/01/03(土) 20:16:47
宿題臭がする
778デフォルトの名無しさん:2009/01/03(土) 20:20:00
struct cell {
int type;
union {
struct cell *first;
struct XXX * data;
};
struct cell *second;
};

struct XXX があつかうデータな
とか?
779デフォルトの名無しさん:2009/01/03(土) 20:34:09
>>774
アルゴリズムがわからないならまずC言語以前の問題です
アルゴリズムを理解しているならC言語で実現する上で何がわからないのか整理してもってきなさい
780デフォルトの名無しさん:2009/01/03(土) 22:51:52
>>774
適切な教科書が思いつければいいのですが。
とりあえず基礎的なC言語の教科書を1冊マスターしていただければみえてくると思います。、
781デフォルトの名無しさん:2009/01/03(土) 23:54:30
関数のプロトタイプ宣言でお聞きしたいのですが、どちらが正しいのでしょうか
void keisan(float x,float y);
void keisan(float, float);

上は引数に変数がついている書き方ですが下は型だけで変数がついていません
782デフォルトの名無しさん:2009/01/03(土) 23:55:56
どっちも正しい
783デフォルトの名無しさん:2009/01/03(土) 23:58:22
>>781
関数プロトタイプの引数リスト内での引数名はオプションで、書いても書かなくてもいい
784デフォルトの名無しさん:2009/01/04(日) 00:19:05
>>782
>>783
ありがとうございました!
785デフォルトの名無しさん:2009/01/04(日) 00:28:27
VC++2008で少し複雑なプログラムを作ろうと思うんですけど、行数が多くなりすぎてソースが見にくくて困っています。
そこで機能ごと(関数ごと)に別々のファイルに分けようと思ってるんですが、普通はどのようにしているのでしょうか?

定義としてヘッダファイル、機能ごとにcppファイルを作るというスタイルは普通はやらないんでしょうか?
行数が多くてもcppファイルは1つしか作らないのでしょうか?
初心者でそこら辺はよくわからないので、教えてください。
786デフォルトの名無しさん:2009/01/04(日) 00:39:34
> cpp
ここは C スレだ。
C++ ならクラス事にファイル分けるとしか言いようが無い。
787デフォルトの名無しさん:2009/01/04(日) 00:57:19
>>785
機能ごとに分ける。

機能A a.h a.c
機能B b.h b.c
・・・・・・・・・・・・

これがふつう。

1つのcファイルは小さなプログラムを一人で作るときは、まあそれでいい。
プロジェクトで複数人で開発をするときは、ファイルがひとつだと、同時にいろんな
ひとがファイルあける事になって同時更新の問題が発生する。
1関数1ファイルはファイル数が多くなるので管理が難しい。(わけがわからなくなる)

てなことで、プログラムをいくつかの機能に分解し、その分解された機能ごとに
cファイルをつくるのが現実的ではないだろうか。
788デフォルトの名無しさん:2009/01/04(日) 01:04:16
以前行ったCの現場ではモジュールって呼んでたかな
一つの実行形式ごとに一つのモジュール+共通関数用に1モジュール
だったからなかなかひどい目にあった
789デフォルトの名無しさん:2009/01/04(日) 01:45:53
scanfで可変長の文字列を取得して、それを別の関数に渡してファイル操作のときに使いたいのですが、うまくいきません。

具体的にはmain関数で
scanf("%s",&filename); でファイル名を取得して
関数(filename);    で渡し

void 関数(char){
fp=fopen(filename,"r");

という風に使いたいのです。ポインタなどを使えばうまくいくと思うのですが、試してみてもうまくいきません。
どのようにすればいいかわかる方いたら教えてください、お願いします。
790デフォルトの名無しさん:2009/01/04(日) 01:46:45
int i=0,j;
while(j=10-i++)
これは適切ですか?
791デフォルトの名無しさん:2009/01/04(日) 01:52:13
>>789
妙な加工をせずに
コンパイル可能なコードを書いてくれ。
792デフォルトの名無しさん:2009/01/04(日) 01:53:01
>>789
タイプミスだとおもいますが
void 関数(char)->void 関数(char*)
ですよね。

fp=fopen(filename,"r");
if (fp == NULL) perror(filename);

とやると、オープンエラーのときのエラー種類とオープンしようとしたファイル名が
表示されます。それをみればわかるかな?
793デフォルトの名無しさん:2009/01/04(日) 01:54:37
>>790
コンパイルできるという意味では適切なプログラム。
圧倒的多数の人間がコーディングスタイルとして良くないと言うであろうという意味では不適切。
794デフォルトの名無しさん:2009/01/04(日) 01:54:56
>>789
void 関数(const char* filename)と書けばいい。
795デフォルトの名無しさん:2009/01/04(日) 01:55:17
>>789

char filename[4096];

/* scanf("%s", filename); */
fgets(filename, sizeof(filename), stdin);
filename[strlen(filename)-1] = '\0';

foo_func(filename);

/* static or [extern] */
void foo_func(/* const */ char * filename) {
/* ... */
}
796デフォルトの名無しさん:2009/01/04(日) 01:59:33
コンパイルできるというのであれば、何でもありだな。
あくまでもそれは、while文のループを止める条件として、正しいか?
797デフォルトの名無しさん:2009/01/04(日) 02:00:53
char filename[適当な大きさの数字];
scanf("%s",filename);
関数(filename);

void 関数(char *filename){
fp=fopen(filename,"r");
798デフォルトの名無しさん:2009/01/04(日) 02:01:24
正しい。
799デフォルトの名無しさん:2009/01/04(日) 02:04:35
791-797
ありがとうございました!できました。いろいろ調べてこの方法も試してみたんですがタイプミスしてました。
つまらない質問にも答えてくださってありがとうございました。

それと聞きたいのですが、
char *filename

char* filename
は何か違いがあるのでしょうか?
800デフォルトの名無しさん:2009/01/04(日) 02:05:36
違いはない。各自の好みの問題。
801デフォルトの名無しさん:2009/01/04(日) 02:15:25
C++ では int& i; で書くのが素敵、という本をみたことがありますが、さてはて。
802デフォルトの名無しさん:2009/01/04(日) 02:34:04
>>799

スレ違いの話になるかもしれないが、
foo_type *foo; /* K&R Cスタイル */
foo_type* foo; /* C++禿スタイル */
foo_type * foo; /* 中立派スタイル */

C言語でもC++でも、ポインタ指定子の結合は、foo_type (* foo); だから、
foo_type* foo_bar, foo_baz;とやっても、 foo_type (* foo_bar), foo_baz; にしかならないのは有名。
こういう間違えを防ぐために、typedef foo_type* foo_type_ptr;
foo_type_ptr foo_bar, foo_baz; とやることもある。この場合、foo_bar, foo_bazは、ともにfoo_type_ptr型となる。
また、変数宣言は、1行にひとつとして、コメントをつけるようにすれば、問題ないという人もいる。
foo_type* foo_bar; /* @in@piyo_ptrのalias */
foo_type* foo_baz; /* foo_barのalias */
のように宣言する。
803デフォルトの名無しさん:2009/01/04(日) 02:46:14
型* 変数名; 式でやってると配列へのポインタとか関数へのポインタとかで詰まる
804デフォルトの名無しさん:2009/01/04(日) 02:47:21
>>789ですが、ファイル名を6つ取得したいので2次元配列を使いたいのですが、やり方がわかりません。

char filename[適当な大きさの数字][5];
scanf("%s",filename[適当な大きさの数字][i]);
関数(filename[適当な大きさの数字][i]);

void 関数(char *filename[][]){
fp=fopen(filename[適当な大きさの数字][i],"r");

としてみたのですが、ダメでした。何回も悪いんですけど、教えていただけないでしょうか?

805デフォルトの名無しさん:2009/01/04(日) 02:51:14
#define MAX_PATH 260

int i;
for(i = 0; i < 6; i++) {
 char filename[MAX_PATH];
 fgets(filename, MAX_PATH, stdin);
 関数(filename);
}

void 関数(const char *filename) {
 FILE *fp = fopen(filename, "r");
}
806デフォルトの名無しさん:2009/01/04(日) 02:51:55
>>803
これが C++ だと 型 *&参照名; とかかなり違和感ある。
807デフォルトの名無しさん:2009/01/04(日) 02:54:26
>>804
まずscanfの使い方からわかってないだろう
ちゃんと理解してないのにいきなり難しいことをやろうとするな
808デフォルトの名無しさん:2009/01/04(日) 02:54:54
> char filename[4096];
もうね、コヒーを一気にゴクゴクと飲んで、口から噴射して顔にぶっ掛けてやりたいくらいだわw
809デフォルトの名無しさん:2009/01/04(日) 02:59:48
>>804
君の欲しいのは 「適当な大きさのcharの配列」6つからなる配列
君が宣言したのは 「大きさ5のcharの配列」の適当な大きさの配列

%s指定子を使ったときにscanfに与えるのはcharへのポインタ
君が与えたのはcharの値

君が関数に渡したいのは「大きさ5のcharの配列」へのポインタ
君が関数の引数に書いたのは「大きさが不定のcharへのポインタの配列」へのポインタ

fopenに与えるのはcharへのポインタ
君が与えたのはcharの値
810デフォルトの名無しさん:2009/01/04(日) 03:00:34
char filename[6][適当な大きさの数字];
for ( i = 0; i < sizeof(filename)/sizeof(filename[0]); ++i ) {
scanf("%s", &filename[i][適当な大きさの数字]);
関数(&filename[i][適当な大きさの数字]);
}

void 関数(/* const */ char * filename){
fp=fopen(filename,"r");

以下は参考程度に、配列の配列(通称、多次元配列)を関数に渡すとき
void 関数(char filename[][適当な大きさの数字]){
/* または、void 関数(char *filename[適当な大きさの数字]){ */
/* または、void 関数(char (*filename)[適当な大きさの数字]){ */
fp=fopen(&filename[i][適当な大きさの数字],"r");
関数側での使い方は、いろいろある。が、適当な大きさの数字を固定しないといけないので、あまり使われない。
構造体に入れて渡したり、要素数を渡すことが多い。
int foo(foo_t **ptr_to_ptr, size_t column, size_t row);みたいにね。
811デフォルトの名無しさん:2009/01/04(日) 03:00:46
>>804
基礎からやりなおせ
812デフォルトの名無しさん:2009/01/04(日) 03:02:57
ここは「入門篇」
813デフォルトの名無しさん:2009/01/04(日) 03:03:47
>>804
どんな入門書使ってるか知らないが、まず配列のところへ戻ってやりなおすこと
814デフォルトの名無しさん:2009/01/04(日) 03:04:06
>>810
ソースに日本語が混ざるとすげー気持ち悪いなw
815デフォルトの名無しさん:2009/01/04(日) 03:04:41
>>804
>char filename[適当な大きさの数字][5];
>scanf("%s",filename[適当な大きさの数字][i]);
>関数(filename[適当な大きさの数字][i]);
>
>void 関数(char *filename[][]){
>fp=fopen(filename[適当な大きさの数字][i],"r");

すべての行に間違いがあります!
816デフォルトの名無しさん:2009/01/04(日) 03:05:40
>804
「理解」しないで「動いた」からって先へ進むな
>>789のをどう変更して、それがどうして動いたか理解したのか?
817デフォルトの名無しさん:2009/01/04(日) 03:06:26
このスレはきびしいきびしいのです
818デフォルトの名無しさん:2009/01/04(日) 03:06:38
お前ら、この言葉を忘れてるぞ

宿題丸投げは宿題スレへ
819デフォルトの名無しさん:2009/01/04(日) 03:07:08
>>817
ただ動くソースコードがほしいだけならそのためのスレがちゃんとある
820デフォルトの名無しさん:2009/01/04(日) 03:11:34
いや、横レスだから
821デフォルトの名無しさん:2009/01/04(日) 03:14:08
っつーかさぁ、C言語なんてやってて面白いか?なんか、人生の大事な時間、時期を
無駄に食いつぶしてしまったって感じがするぜ。どうせプログラミングをやるなら、
名の残るゲームの開発チームにでも加わりたいもんだぜ。
822デフォルトの名無しさん:2009/01/04(日) 03:15:58
 面白いです。
はい、次の方どうぞ。
823デフォルトの名無しさん:2009/01/04(日) 04:19:21
821が役立たずなのはCのせいじゃないな。
824デフォルトの名無しさん:2009/01/04(日) 18:29:57
プログラミングから一旦はなれてアルバイトする
ノシ
825デフォルトの名無しさん:2009/01/04(日) 22:01:36
>>814
え?一度やってみたいのですが、やっぱり無理がありますかね?
どこぞで「は」というプリプロセッサがあったようなきがしたような。
826デフォルトの名無しさん:2009/01/04(日) 22:16:19
インクルードしないでprintf関数を使う方法をお願いします。
プリプロセッサの事があまり好きではないので^^
大体標準なのに一々インクルードとか面倒じゃないですか?
827デフォルトの名無しさん:2009/01/04(日) 22:20:42
>>826
ん、プログラムを作成・実行する環境と言語自体とを(わりあいに、ですが)くっきりとわけるための#includeと思っていただければ。
828デフォルトの名無しさん:2009/01/04(日) 22:26:12
>>826
べつに書かなくtも動くよCなら
829デフォルトの名無しさん:2009/01/04(日) 22:41:02
>>826
インクルードしない方が面倒臭いと思うんだが。
830デフォルトの名無しさん:2009/01/04(日) 22:56:31
>>825
よくそんな昔の事を憶えているな。
831デフォルトの名無しさん:2009/01/04(日) 23:05:01
>>830
(^^;;;;;
832デフォルトの名無しさん:2009/01/04(日) 23:09:30
Winnyの情報流出を指導するIPA(独立行政法人情報処理推進機構)勤務のくせに、著作権無視の違法ファイルをダウンロードしまくり罰が当たった。
嫁以外の他の女とのセックス後と写真を大事に保管していて結納写真と仲良く流出。
これはIPAとして記者会見が必要だろうし新聞やテレビで報道されるレベル

嫁以外のメガネっ子とのセックス後の流出写真
http://up2.viploader.net/pic3/src/vl2_090706.jpg
http://up2.viploader.net/pic3/src/vl2_090708.jpg
http://up2.viploader.net/pic3/src/vl2_090722.jpg
http://up2.viploader.net/pic3/src/vl2_090720.jpg

メガネっ子に撮られた本人のセックス後の写真
http://up2.viploader.net/pic3/src/vl2_090707.jpg

別のメガネっ子ホクロ女とお泊まり(8月14〜15日)
http://up2.viploader.net/pic3/src/vl2_090730.jpg
http://up2.viploader.net/pic3/src/vl2_090731.jpg

結納風景(嫁と2人のメガネっ子の写真の女と明らかに違う)(嫁のお父さん怖そう)
http://up2.viploader.net/pic3/src/vl2_090716.jpg

流出者本人の本棚(情報流出セキュリティー対策バッチリww)
http://up2.viploader.net/pic3/src/vl2_090728.jpg

IPA(独立行政法人情報処理推進機構) Winny緊急相談窓口
http://www.ipa.go.jp/security/announce/20060320.html
現行スレ
【つこうた】情報流出を指導するIPA職員が嫁以外とのエッチ後画像など大流出 vs嫁編 part11
http://tsushima.2ch.net/test/read.cgi/news/1231069563/
833デフォルトの名無しさん:2009/01/04(日) 23:19:59
良い乱数でばっちり分散したintが得られ場合、
内部のbit的には全て2分の1で0 or 1であり、
charみたくint以下の型に入れても
乱数としてうまく分散していると期待して良いですか?
834デフォルトの名無しさん:2009/01/04(日) 23:21:45
いい
835デフォルトの名無しさん:2009/01/04(日) 23:23:39
サンクス!!
836デフォルトの名無しさん:2009/01/04(日) 23:26:34
議論にはなってないな
837デフォルトの名無しさん:2009/01/05(月) 00:26:53
下の例のような文字列や小数などが入り混じったchar型の変数の配列があります。
これから小数だけを取り出してファイル出力したいのですが、何かいい方法はあるでしょうか?

char name[0]=frame
char name[1]=0.123  ←取り出したい
char name[2]=23
char name[3]=1.234  ←取り出したい
838デフォルトの名無しさん:2009/01/05(月) 00:36:52
取り出す前に入らないだろ
839デフォルトの名無しさん:2009/01/05(月) 00:40:15
たぶん0.123という文字列として入っているのだと思います
そんなことはありえないでしょうか?
840デフォルトの名無しさん:2009/01/05(月) 00:40:58
>>837
strtod()を使って、文字列の最後までパースできているか確認するとか。
841デフォルトの名無しさん:2009/01/05(月) 00:42:33
char型変数の配列の配列じゃないの?
842デフォルトの名無しさん:2009/01/05(月) 00:51:00
それぞれ文字列だとすれば、字句解析して実数っぽかったら取り出せばいいのでは。
843デフォルトの名無しさん:2009/01/05(月) 00:51:29
>>840
小数と整数の判別はどのようにすればいいでしょうか?
strtodを使うと整数も一緒に取り出してしまう気がするのですが
844デフォルトの名無しさん:2009/01/05(月) 00:53:10
>>842
中には小数点を使っている文字列もあるので、字句解析は難しいかと思いまして
845デフォルトの名無しさん:2009/01/05(月) 00:55:31
>>843
そういわれたらそうだな。
文字列に含まれてるのが、数字のみで、中に一個だけ少数点が含まれていたら、
実数と判断するとか、地味に判定ルーチン書けばいいかな。
846デフォルトの名無しさん:2009/01/05(月) 00:57:20
>>845
中には「11:13:28.015」というような文字列も含まれているので小数点での判別は実質無理なんです
847デフォルトの名無しさん:2009/01/05(月) 00:58:27
解1)
FILE *fp=fopen("out.dat","w+");
for(i=0;i<NameSize;++i){
double dval = atof(name[i]);
char cval[256];
sprintf(cval,"%lf",dval);
if(strncmp(cval,name[i],strlen(cval))!=0){
 if(((int)dval)!=dval){
  fprintf(fp,"%lf\n",dval);
 }
}
}

別解)
std::ofstream ofs("out.dat",ios::out);
for(int i=0;i<NameSize;++i){
 try{
  double val = boost::lexical_cast<double>(name[i]);
  ofs << val << std::endl;}
 catch(boost::bad_lexical_cast){}
}

コンパイル確認はしてません。
848デフォルトの名無しさん:2009/01/05(月) 00:59:31
あ、別解の方intじゃないことの確認し忘れた……
849デフォルトの名無しさん:2009/01/05(月) 00:59:40
>>843
まず、strtol()を通して、文字列の最後までパースできていたら整数。
整数でなかったらstrtod()を通して実数か判断するって方法でもいいか。
実数が指数表記とかされないんだったら、>>845の感じで、
自分で判定ルーチン書いても、あまり手間は変わらないような気もするけど。
850デフォルトの名無しさん:2009/01/05(月) 00:59:54
てっとり早くやるならsscanf()で。
851デフォルトの名無しさん:2009/01/05(月) 01:04:39
>>846
だから数字のみかで判定も入れればいいじゃん。

int isReal(const char *s)
{
int ccount = 0;
for (;*s; s++) {
if (*s == '.')
ccount++;
else if (!isdigit(*s))
return 0;
}
return ccount == 1;
}

動作確認してないからバグってるかも。
852デフォルトの名無しさん:2009/01/05(月) 01:30:30
>>851
この方法で判別できました。ありがとうございました!
この問題はかなり悩んだんですが、こんなすぐ解決してくださるとは思いませんでした。
本当にありがとうございました!
853デフォルトの名無しさん:2009/01/05(月) 03:47:57
関数の実引数をそのままローカル変数として使うより、
いったん新しく作ったローカル変数に移し変えたほうが効率的なんでしょうか
それとも実引数は完全なるローカル変数といっしょの扱いでいいのでしょうか
よくわからないけどアセンブリレベルでスタックとかレジスタとかどうかなーと思いまして
854デフォルトの名無しさん:2009/01/05(月) 03:53:04
>>853 まったく同じ
855デフォルトの名無しさん:2009/01/05(月) 04:32:52
(fp=fopen()) ==NULL ってのは分かるが
while(条件式のみ)ってのは如何なものかと。
856デフォルトの名無しさん:2009/01/05(月) 04:44:52
え?条件式のみの方がよい良いんじゃね?
857デフォルトの名無しさん:2009/01/05(月) 09:57:08
>>853
コンパイラを作るのなら意識すべきだし、最適化を行なわないなら若干変わる。
しかし、普通は全く同じように使えると思っていい。
よく判らないなら、アセンブリレベルで気にしても意味がない。

>>855
1行目が何を言いたいのか全く判らない。
通常、whileの条件判断部でファイルオープンすることは考えにくいし、まして
ファイルを開けない場合にループするなんて尚更考えにくい。
858673:2009/01/05(月) 11:15:06
独習Cという本に書いてあるんですが。
#include <stdio.h>
int main(void)
{
int *p,r;

p=&r;
r=100;
printf("%p\n",p);
*p++;
printf("%d : %p\n",r,p);
return 0;
}
この場合
出力が
0xbffffbbc
100 : 0xbffffbc0
なんですが、
インクリメントの*p++;じゃなくてp++;と同じなんですが
こういう書き方もあるよ、みたいな感じでうけとっていいんでしょうか?
値をインクリメントは(*p)++;なんですが
*p++;の使い道がよくわかりません、p++と全く同じ感じなんですが
859デフォルトの名無しさん:2009/01/05(月) 11:52:07
>>858
--
独習Cという本に書いてある
                                            んですが。

                                            んですが、
インクリメントの*p++;じゃなくてp++;と同じな
                                            んですが
値をインクリメントは(*p)++;な
                                            んですが
*p++;の使い道がよくわかりません、p++と全く同じ感じな
                                            んですが
--
で、何が言いたいの?
860デフォルトの名無しさん:2009/01/05(月) 14:36:25
まず共通する部分を抜き出してみよう。解読の基本だ。>>859

五箇所に「んですが」が発見される。これを右から読む。「がすでん」

東シナ海では中国が日本との国境線付近でガス田を開発している。
平湖ガス田、断橋ガス田、天外天ガス田、春暁ガス田、そして今回問題となっている樫ガス田の五つ。
ガス田の数もぴたりと一致する。
つまりこれは中国が開発している東シナ海のガス田のことを指しているものと推察される。

更に「んですが」の一文字前の文字に注目して欲しい。
最初だけ「る」で残り四つは「な」だ。
つまり今回問題となっている樫ガス田についての極秘情報が暗号化されて
「独習Cという本に書いてあ」の部分に含まれていると考えられるのだ。

実に巧妙だ。
861デフォルトの名無しさん:2009/01/05(月) 14:47:04
5ガス田の名前を間違えた
春暁、断橋、冷泉、天外天、龍井、だ
樫は天外天の日本名だな
862デフォルトの名無しさん:2009/01/05(月) 14:59:26
typedef int (*tenarray)[10];
tenarray func();//int型の要素を10持つ配列へのポインタを返す関数

これを、typedef宣言しないで書くことってできるんですか?
863673:2009/01/05(月) 15:13:35
859さん
860さん
日本語のおかしさを責めないでください
でもおもしろかったです
864デフォルトの名無しさん:2009/01/05(月) 16:12:51
>>862
できない。int** で我慢しろ。
865デフォルトの名無しさん:2009/01/05(月) 16:19:06
C言語の開発環境を作りたいのですがボーランドのC++をインストールしたいのですがログオンできません。
アカウントを作らなければいけないのでしょうか?あとアカウントの登録情報を変更したい時はどうすればいいですか?
866673:2009/01/05(月) 16:37:47
#include <stdio.h>
int main(void)
{
int k[10][5];
int i,j,x;

for(i=0; i<10; i++)
for(j=0; j<5; j++)
k[i][j]=1+j;

for(i=0; i<10; i++){
for(j=0; j<5; j++)
printf("%d",k[i][j]);
printf("\n");
}
return 0;
}
k[10][5]の配列に、1,2,3,5
         6,7,8,9....
などと配列全部まで入れたいんですが、うまくいきません。
どなたか教えてください。
867デフォルトの名無しさん:2009/01/05(月) 16:47:37
#include <stdio.h>

int main(int argc, char *argv[]){
int k[10][5];
int i,j;

for(i=0; i<10; i++)
for(j=0; j<5; j++)
k[i][j] = 5*i + j;
for(i=0; i<10; i++)
for(j=0;j<5;j++)
printf("%d\n",k[i][j]);
return 0;
}
868デフォルトの名無しさん:2009/01/05(月) 16:50:51
間違えた。1から入れるんだったね
#include <stdio.h>

int main(int argc, char *argv[]){
int k[10][5];
int i,j;

for(i=0; i<10; i++)
for(j=0; j<5; j++)
k[i][j] = 5*i + j + 1;
for(i=0; i<10; i++)
for(j=0;j<5;j++)
printf("%d\n",k[i][j]);
return 0;
}
869673:2009/01/05(月) 16:55:03
#include <stdio.h>

int main(void){
int k[10][5];
int i,j;

for(i=0; i<10; i++)
for(j=0; j<5; j++)
k[i][j] = 5*i + j;
for(i=0; i<10; i++){
for(j=0;j<5;j++)
printf("%3d",k[i][j]);
printf("\n");
}
return 0;
}
これで整頓して表示できました。
ありがとうございました
870デフォルトの名無しさん:2009/01/05(月) 17:02:18
>>864
なんか表記する仕方があるのかと思ってました。
ないんですね。ありがとうございました。
871デフォルトの名無しさん:2009/01/05(月) 17:07:22
あるよ。
872673:2009/01/05(月) 17:09:39
#include <stdio.h>

int main(int argc, char *argv[]){
int k[10][5];
int i,j,*p;
p=(int *)k;

for(i=0; i<10; i++)
for(j=0; j<5; j++)
k[i][j] = 5*i + j;
printf("%d",*(p+(9*5)+2));
return 0;
}
もう一つ質問があります。
独習Cには1元配列の場合
int i[80];
int *p;
p=i;
これで配列のアドレスを入れられるんですが。
int i[10][5];
int *p;
p=(int *)k;
2次元配列の箇所には、 p=(int *)i;
などとキャストしてようです。何故キャストするのかわかりません。
キャストを行わないで、p=i;などとやったらエラーがでます。
キャストは型を変えるはずなのに、intという型の配列を何故またintにキャストするのでしょうか?
int *の*の意味もよくわかりません。
どなたかint*のキャスト意味や、何故キャストするのか教えてください
873デフォルトの名無しさん:2009/01/05(月) 17:16:03
iはint型ではない。int[10][5]型だ。
874673:2009/01/05(月) 17:19:32
全然わかりません。
キャストっていうのは
float x=10.2;
printf("%d",(int)x);
などと使って、小数を省いたりするように書かれてあったんですが、何故(int *)なんでしょうか??

875デフォルトの名無しさん:2009/01/05(月) 17:27:20
>>862
>>864
int (*func(void))[10]
{
}
とすればできる。
解答者のレベルも目を覆うものがあるな。
876デフォルトの名無しさん:2009/01/05(月) 17:30:59
>>874
>873を理解できないのなら、先ずはそこから。
877デフォルトの名無しさん:2009/01/05(月) 17:47:42
>>858
独習というより毒臭だな >*p++;
878865:2009/01/05(月) 17:52:00
すいません。僕の質問に誰か答えてくれませんか?プログラミングしたいです。
879デフォルトの名無しさん:2009/01/05(月) 17:53:01
>>878
スレ違いです
880デフォルトの名無しさん:2009/01/05(月) 17:53:02
visual stdio2008にしとけ
881デフォルトの名無しさん:2009/01/05(月) 17:59:01
>>878
登録キーが必要かどうかはバージョンによる

コンパイラに限ったことではなく、ソフトウエア一般の話として、
ライセンス条件がわからないとき何をすべきかという問題なので
あなたの問いはスレ違いの可能性がある
882デフォルトの名無しさん:2009/01/05(月) 18:07:30
いや、どう見てもスレ違いだろ。
883デフォルトの名無しさん:2009/01/05(月) 18:18:44
>>858
(*p)++ との違いを示すための例なんじゃね?
884デフォルトの名無しさん:2009/01/05(月) 18:19:55
>>875
長年、喉につかえていた魚の小骨が取れた気分です。ありがとうございます。
>>858
#include <stdio.h>
int main(){ int i;
char foo[2][16] = {"aaaaaaaaaaaaaaa","bbbbbbbbbbbbbbb",};
char *ap, *bp;
ap = foo[0]; bp = foo[1];
for(i = 0; i < 15; ++i) printf("%c", *ap++);
printf("\n");
for(i = 0; i < 16; ++i)printf("%c", (*bp)++);
printf("\n");
printf("%s\n", foo[0]);
printf("%s\n", foo[1]);
return 0;
}

aaaaaaaaaaaaaaa
bcdefghijklmnopq
aaaaaaaaaaaaaaa
rbbbbbbbbbbbbbb

*p++は、値を参照してからポインタ演算
(*p)++は、ポインタがさす値を逆参照し、その値をインクリメント
#で、あってんのかな?
885デフォルトの名無しさん:2009/01/05(月) 18:29:55
unsigned int型変数では、演算によるオーバーフローは発生しない
が正しいというのが理解できず。。オーバーフローしないの?
>>669の2級
886デフォルトの名無しさん:2009/01/05(月) 18:37:06
>>858 使用例
char foo[16]="aaaaaaaaaaaaaaa", bar[16], *ap, *bp;
ap = foo; bp = bar;
while(*bp++ = *ap++);
887673:2009/01/05(月) 18:57:57
886さん
for(i = 0; i < 16; ++i)printf("%c",foo[1][i]+1);
for(i = 0; i < 16; ++i) printf("%c", *bp++);
配列だとbcdefghijklmnopqとでませんね。
bの次のcccccccccccとでます。
配列でfor(i = 0; i < 16; ++i) printf("%c", *bp++);と同じような事はできるんですか?
それとキャストの
p=(int *)k; が未だにわかりません。
888865:2009/01/05(月) 19:02:47
解答ありがとうございます。スレ違いみたいなので他のスレで聞いてみようと思うのですがどんなスレッドで質問すればいいですか?あとvisual stdio2008はお金がかかるのですが無料開発環境と比べてどんなメリットがありますか?
889デフォルトの名無しさん:2009/01/05(月) 19:04:08
いや無料のがあるだろ
890673:2009/01/05(月) 19:04:49
888さん
たぶんお金がかかっているだけあって、補完機能やデバッカ機能などあると思います。
お金かけずにフリーソフトのコンパイラがあると思います
891デフォルトの名無しさん:2009/01/05(月) 19:08:00
スタックオーバーフローが発生する実際の様子を観察することを目的として、
自動変数の配列のサイズとエラーの関係のプログラムを作成ししてみたところ、
stackavail 関数のところでエラーが発生してしまいました。
OSはwindowsでコンパイラはcygwinです。下にソースをのせときます。
#include<stdio.h>
#include<malloc.h>
int main() {
char A[3000];

A[0]='\0';
printf("stack: %d\n", stackavail());

printf("done\n");
return 0;
}

stackavail関数の使い方が間違っているのかよく分からなかったので
どなたかアドバイスの方よろしくお願いします。
892デフォルトの名無しさん:2009/01/05(月) 19:11:09
Visual Studio 2008 Express Editions
http://www.microsoft.com/japan/msdn/vstudio/Express/


MS、「Visual Studio 2008 Express Edition」の日本語正式版を無償公開
VB/C#/C++言語によりWindowsアプリケーションを開発可能
893デフォルトの名無しさん:2009/01/05(月) 19:13:31
>>891
どんなエラー?
Cygwinがstackavail()という非標準関数をstdio.hに持っているかどうか
はオレは知らない。
894デフォルトの名無しさん:2009/01/05(月) 19:13:57
質問です。
c言語でコマンドラインから引数を受け取ってファイルを
処理するプログラムがあったとします。仮にtest.exeとします。

カレントディレクトリには、以下のファイルが存在します。
a.txt b.txt c.txt test.exe

そして、「test *.txt」 とコマンドを打ったら、

a.txtを引数としたプログラムが実行されて、プログラム終了。

b.txtを引数としたプログラムが実行されて、プログラム終了。

c.txtを引数としたプログラムが実行されて、プログラム終了。

みたいなかんじで動作するのでしょうか?

895デフォルトの名無しさん:2009/01/05(月) 19:17:47
>>894
test a.txt b.txt c.txt
896デフォルトの名無しさん:2009/01/05(月) 19:19:57
>>893

/cygdrive/c/DOCUME~1/owner/LOCALS~1/Temp/ccqpUnTx.o:jikken.c:(.text+0x3b)
fined reference to `_stackavail'
collect2:Id returnec 1 exit status

というエラーです。非標準関数が入っていないからなんですかね?
なかった場合は新しく入れることは可能なんでしょうか?
897888:2009/01/05(月) 19:38:08
解答ありがとうございました。とりあえずVisual Studio 2008 のスタンダードの購入を検討してみます。一番手っ取り早そうなので。
898デフォルトの名無しさん:2009/01/05(月) 19:38:58
>894
するかもしれないし、しないかもしれない。
実際にプログラムが呼び出されるまでにどういう形でコマンドラインが処理されるかはOSに依存するし、
受け取ったコマンドライン引数をプログラムがどう処理するかはそのプログラムによるし、
開こうとするファイル名をどう処理するか(具体的にはカレントディレクトリの問題)もOSに依存する
899デフォルトの名無しさん:2009/01/05(月) 19:45:46
Visual Studio 2008 Express Edition」の日本語正式版を無償公開
900デフォルトの名無しさん:2009/01/05(月) 19:46:20
888はわかってんのかわかってないのか
901デフォルトの名無しさん:2009/01/05(月) 19:54:46
>>894
ワイルドカードの展開は、Unix系ならシェルが行なうし、
Windows系ならそのまま渡して、それを各プログラムが展開するよ。
902デフォルトの名無しさん:2009/01/05(月) 20:04:15
>>897
>899はよめますか?
「無償公開」とは、「ただでだうんろーどできます」といういみですよ。
903デフォルトの名無しさん:2009/01/05(月) 20:17:45
だれか>>891についてお願いします。
904897:2009/01/05(月) 20:23:44
どうやってダウンロードすればいいのか分からないのでDVD−Rを買うのが一番早いかなと思ったんです。
開発環境をダウンロードした経験がないので。本当の初心者ですみません。
905デフォルトの名無しさん:2009/01/05(月) 20:25:37
そんなこともできないんじゃあきらめたほうがいい
906デフォルトの名無しさん:2009/01/05(月) 20:28:19
http://www.microsoft.com/japan/msdn/vstudio/Express/

このページのリンクを押して指示に従うだけ。

直リンをのせておく。これをクリックすればいい。
http://go.microsoft.com/?LinkId=9348304
907デフォルトの名無しさん:2009/01/05(月) 20:29:25
vcsetup.exe というのがダウンロードされるのでそれをクリックだな。
908デフォルトの名無しさん:2009/01/05(月) 20:30:35
>>903
>896を見る限り、stackavail()なる関数が見つからないのだろ。
どこで知ったか知らんが、それを知った場所で聞けよ。
909デフォルトの名無しさん:2009/01/05(月) 20:33:53
>>904
>>892は読んだ?
リンク先に「≫ はじめての方のためのインストール方法」があるぞ
910デフォルトの名無しさん:2009/01/05(月) 20:53:34
>>904にVisual Studio 2008 Express Editionが使えるのか?
ダウンロードも分からんのに。
911デフォルトの名無しさん:2009/01/05(月) 21:00:30
webインストーラーは、次へをクリックしていくだけだったはず。 これで駄目ならDVD買っても無理。
912デフォルトの名無しさん:2009/01/05(月) 21:11:41
673は、配列とポインタの違いが分かっていない悪寒。
あとポインタの型の違いと、ポインタがどこ指しているかとか。
というか、初心者にはVisualStdioよりも、
cygwinや、*nixの方が幸せな環境だと思うんだが。
913デフォルトの名無しさん:2009/01/05(月) 21:16:53
ONIX
914デフォルトの名無しさん:2009/01/05(月) 22:38:19
>>894
ワイルドカード(* or ?) の展開は shell の仕様になります。dos の command.com は>>895のようには展開してくれませんでした。
NT の cmd.exe はどうでしょうかね。(やったことない)
915914:2009/01/05(月) 22:41:07
ん、>>901 で既出でした。
916894:2009/01/05(月) 23:23:33
携帯からでID違います。
具体的にどのように展開されるのでしょうか?
いまいち理解できません。すみません・・・

test.exe *.txt

test.exe a.txt b.txt c.txt

と展開されるのでしょうか?
917デフォルトの名無しさん:2009/01/05(月) 23:34:18
.exe がDOSを暗示しているのならそうではない。
*.txt のままargvに入る。
unixのばあいだけそうなる。
918デフォルトの名無しさん:2009/01/05(月) 23:38:07
DOSでもコンパイラによっては展開してくれたな
919デフォルトの名無しさん:2009/01/05(月) 23:46:00
>>918
ワイルドカード展開をおこなってくれるルーチンがあったような気がします。lha のソースでみたような。
920デフォルトの名無しさん:2009/01/05(月) 23:50:12
>>917
そうでしたっか?
*.txtのワイルドカードはUnixの場合シェルが展開するのですよね
DOSのコマンドプロンプトは展開してくれないのかなあ?
921デフォルトの名無しさん:2009/01/06(火) 00:01:02
LSI-Cは展開してくれるようにもできてたのでラクだったな
922894:2009/01/06(火) 00:09:03
*.txtがそのまま渡されるとして、
プログラム上で.txtが含まれる全てのファイルを参照することは可能なのでしょうか?
具体的なコードを提示して下さると助かります。
923デフォルトの名無しさん:2009/01/06(火) 00:11:23
>>922
ファイルシステムについての質問は常に、OSに依存するという答えになる
924デフォルトの名無しさん:2009/01/06(火) 00:11:48
>>922
#include <stdio.h>

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

for (i = 0; i < argc; i++) {
printf("argv[%d]: /%s/\n", i, argv[i]);
}

return 0;
}
925924:2009/01/06(火) 00:12:41
勘違いした!無視して
926デフォルトの名無しさん:2009/01/06(火) 00:14:28
すげえ恥さらし
927デフォルトの名無しさん:2009/01/06(火) 00:17:15
>>922
恐らくは可能だろうけれども、その詳細はシステムに依存する。
928894:2009/01/06(火) 00:23:40
システムはWindowsです。
コマンドプロンプトでの動作しか想定していません。
開発環境は、BCC developer(スペル適当)です。
929デフォルトの名無しさん:2009/01/06(火) 00:26:41
>>928
FindFirstでぐぐれ
930デフォルトの名無しさん:2009/01/06(火) 00:27:49
XPでコマンドプロンプトからの起動ならプログラムにはワイルドカード展開した結果が渡されるんじゃない?
931デフォルトの名無しさん:2009/01/06(火) 00:36:01
>>928
BCC なら、"wildargs.obj" を明示的にリンクすることで
スタートアップルーチンの中で展開するようになるよ。
リンク方法は、解るよな?
932デフォルトの名無しさん:2009/01/06(火) 00:39:17
明示的にリンクしないと、ダミーがリンクされる仕組み。
933デフォルトの名無しさん:2009/01/06(火) 00:48:44
for(i=0;i<10;i++){
sprintf(&filename2[i][MAX_SIZE],"%c%d1.csv",number,i);
sprintf(&filename2[i+10][MAX_SIZE],"%c%d2.csv",number,i);
}

MAX_SIZEは300、numberは1を入れて実行し

for(i=0;i<20;i++){
printf("filename2[%d]=%s\n",i,&filename2[i][MAX_SIZE]);
}

で結果を確認してみると

filename2[0]=101.csv


filename2[8]=181.csv
filename2[9]=・
filename2[10]=102.csv


filename2[17]=172.csv
filename2[18]=182.
filename2[19]=リ・

となってしまいます。なぜかわかる方いますか?
934デフォルトの名無しさん:2009/01/06(火) 00:53:36
sprintfの最初の引数が書き方がおかしいから
935デフォルトの名無しさん:2009/01/06(火) 00:55:28
&filename2[i][MAX_SIZE]
これは何を指していると思うの?
936デフォルトの名無しさん:2009/01/06(火) 00:57:55
2次元配列の場合はどのように書けばよいのでしょうか?
937デフォルトの名無しさん:2009/01/06(火) 01:02:22
>>936
だから、&filename2[i][MAX_SIZE] はどこを指していると思っている?
938デフォルトの名無しさん:2009/01/06(火) 01:04:43
またお前か
お前は二次元配列以前に配列がわかってないだろう

char array[SIZE];

というものがあったとき、

1) array
2) array[0]
3) &array
4) &array[0]

それぞれの意味を説明できるか?
939デフォルトの名無しさん:2009/01/06(火) 01:04:59
filename2[i][MAX_SIZE]の番地ですか?
940デフォルトの名無しさん:2009/01/06(火) 01:08:41
>>939
そうだけど、それが具体的にどこだか図示できる?
で、そこにsprintfで書き込んだら何が起きると思う?
941デフォルトの名無しさん:2009/01/06(火) 01:13:50
>>939
コードじゃなく日本語で説明してみろ
942デフォルトの名無しさん:2009/01/06(火) 01:14:27
numberの書き出しを%cでやってるのもおかしい?
943デフォルトの名無しさん:2009/01/06(火) 01:15:25
>>942
出力結果から見るとそこは'1'を入れてるんだろうけどね
944デフォルトの名無しさん:2009/01/06(火) 01:17:15
>で、そこにsprintfで書き込んだら何が起きると思う?
その番地に書き込んでくれると思っていました。

ですが、その番地に書き込みたいときはどうすればいいのでしょうか?
945デフォルトの名無しさん:2009/01/06(火) 01:22:40
>>944
本当にわかってないんだな

char filename[10][MAX_SIZE];

というものがあったとき、メモリは以下のように確保される

【filename[0][0]】【filename[0][1]】【filename[0][2]】 …(以下、【filename[0][MAX_SIZE-1]】まで)
【filename[1][0]】【filename[1][1]】【filename[1][2]】 …(以下、【filename[1][MAX_SIZE-1]】まで)
(中略)
【filename[9][0]】【filename[9][1]】【filename[9][2]】 …(以下、【filename[9][MAX_SIZE-1]】まで)

便宜上段分けしたが、一行目の最後は二行目の頭につながっている
だからfilename2[0][MAX_SIZE]は実際にはfilename2[1][0]のことだ

ここまでで、自分が何を間違ってるかわかったか?
946897:2009/01/06(火) 01:23:48
開発環境のインストールができました。教えてくださった方々ありがとうございました。
プログラムを作りたいのですがどうしたらいいですか?明日にでも教えてもらえたら嬉しい限りです。
947デフォルトの名無しさん:2009/01/06(火) 01:23:58
>933はまず>938に答えること
お前はまずそこから勉強しなおしだ
948デフォルトの名無しさん:2009/01/06(火) 01:27:01
>945
値を配列の最後に入れようとしていたということですか?
949デフォルトの名無しさん:2009/01/06(火) 01:27:34
>>936
正しいソースが欲しいだけでCを理解するつもりがないなら宿題スレへ行くこと
950デフォルトの名無しさん:2009/01/06(火) 01:28:57
>>948
今、「値」と「最後」をそれぞれどういう意味で使ったか厳密に説明してみ
何の値なのか、最後ってのは具体的にアドレスで言うとどこか
951デフォルトの名無しさん:2009/01/06(火) 01:29:02
>>938
1)と2)は配列の先頭の値
3)と4)は配列の先頭の番地
ですか?
952デフォルトの名無しさん:2009/01/06(火) 01:30:35
>>951
おしい!
953デフォルトの名無しさん:2009/01/06(火) 01:30:43
>>950
値は101.csv などのこと
最後はfilename[0][MAX_SIZE-1]などのこと
ですか?
954894:2009/01/06(火) 01:32:33
>>929
ありがとうございます。
それでググったやり方だと僕がやりたいことに
ぴったりなコードが書けます。

他にレスして下さった方々もありがとうございました。
955デフォルトの名無しさん:2009/01/06(火) 01:36:17
>>938で1)も配列の先頭の番地ですか?
956デフォルトの名無しさん:2009/01/06(火) 01:37:06
>>951
違う
1)は配列そのもので、ただしほとんどの場合配列の先頭の番地に意味が格下げになる
2)は配列の先頭の値
3)は配列そのものの番地で、ポインタとしての型(指しているものの大きさ)は違うけれど、場所としては先頭の番地と同じ
4)は配列の先頭の値の番地だから配列の先頭の番地と同じ
957デフォルトの名無しさん:2009/01/06(火) 01:53:42
>>885
誰かお願いします。
958デフォルトの名無しさん:2009/01/06(火) 01:54:27
sprintfの最初の引数には変換した出力を格納する文字列を与えるということですが、
これは具体的に何を与えてやればいいのでしょうか?先頭の番地でしょうか?
959デフォルトの名無しさん:2009/01/06(火) 01:56:33
>>951

まず array 、これは配列自体だが、いくつかの例外(初期化、&演算子、sizeof演算子)を除いて
「 array の先頭要素へのポインタ」として扱われる
これはCの言語仕様で決められていることなので、そういうものだと思うこと

次に array[0] と書いたとき、これは *(array+0) と同じ意味になる
言ったように array は先頭要素へのポインタになって、それに整数を足すとそのぶんだけ先の場所を指す
( array+1 なら配列の1番目の要素を、array+2 なら2番目の要素を指すポインタになる)
この場合は足すのが 0 だから0番目の要素つまり先頭要素で、それを * 演算子で実体参照している
つまり array[0] は array の先頭要素

&array は上で言った例外のひとつで、これは「 array へのポインタ」になる
指している場所は array の先頭要素へのポインタと同じだが、整数を加算したときの結果が異なる
「 array の先頭要素へのポインタ」はこの場合「 char へのポインタ」で、これに1を足すと「 char 1個ぶん後の領域」を指すが
「 array へのポインタ」は「 char[SIZE] へのポインタ」で、1を足すと「 char SIZE*1個ぶん後の領域」、つまり array を飛び越えた領域を指すようになる
普通はこれを意識して遣うことはないが、二次元配列(配列の配列)を使うときにはこれが問題になってくる

ここまでは理解できたかな?

>>958
そうだよ
もちろん、その先頭の番地以降に十分な領域が確保されてなきゃいけない
960デフォルトの名無しさん:2009/01/06(火) 01:57:01
>>957
オーバーフローするだろう

0xffffffff + 1 -> 0
961デフォルトの名無しさん:2009/01/06(火) 01:57:41
>>956
番地に格下げとはまた新しい。ポインタに格下げね。
962デフォルトの名無しさん:2009/01/06(火) 01:58:43
>>960
じゃあ問題とその解答が間違えているということでしょうか?
963デフォルトの名無しさん:2009/01/06(火) 02:00:17
>>957
オーバーフローエラーとかは発生しないってことかも?
964デフォルトの名無しさん:2009/01/06(火) 02:03:14
>>963
そういうこと。
>>960
そういう風に扱える範囲を超えたら
上のビットを無視した結果(UINT_MAX + 1での剰余)にならないといけないと決まっている。
965デフォルトの名無しさん:2009/01/06(火) 02:04:42
>>963-964
ありがとうございました。
966デフォルトの名無しさん:2009/01/06(火) 02:05:51
>普通はこれを意識して遣うことはないが、二次元配列(配列の配列)を使うときにはこれが問題になってくる

どのような問題が起こるのでしょうか?
967デフォルトの名無しさん:2009/01/06(火) 02:06:18
>>958
「文字列」って表現してある教科書は多いけど、不正確なんだな
実際には単なる領域へのポインタ
で、通常は配列自体が領域の先頭の要素へのポインタになるので、
ふつう配列をそのままぶちこむ
&とか使わずに

char filename[SIZE];
としたら
sprintf(filename, " (以下略
968デフォルトの名無しさん:2009/01/06(火) 02:06:56
>>966
あとで説明するからまず一次元配列を理解しなさい
969デフォルトの名無しさん:2009/01/06(火) 02:08:58
>>967
2次元配列の場合だと、下のようになるということですか?

char filename[5][SIZE];
としたら
sprintf(filename[0],"(以下略
970デフォルトの名無しさん:2009/01/06(火) 02:11:07
重要なことだからしっかり理解しないといけないと考える回答者と
面倒だから答えだけ教えてくれればいいのにという質問者のせめぎ合い

よくあることだけど、悲しいことだね
971デフォルトの名無しさん:2009/01/06(火) 02:11:55
>>969
そうだけど、この場合の filename と filename[0] はなんなのか説明できる?
972デフォルトの名無しさん:2009/01/06(火) 02:12:41
>>971
どちらもfilenameの先頭のアドレスじゃないですか?
973デフォルトの名無しさん:2009/01/06(火) 02:13:54
>>972
はいだめ
もういちど>>959を読み直すこと
974デフォルトの名無しさん:2009/01/06(火) 02:16:29
sprintf(filename[1],"(以下略
これと等価な他の書き方を書いて。

それと、これがどこのアドレスになるかを言ってみて。
&filename[0][MAX_SIZE]
975デフォルトの名無しさん:2009/01/06(火) 02:16:37
>972
そろそろアドレスとか番地とかいう言葉から卒業すること
filenameは○○へのポインタ
filename[0]は○○へのポインタ
○○を埋めなさい
976デフォルトの名無しさん:2009/01/06(火) 02:17:49
ポインタはアドレス、番地と同じ意味で使っていいんですか?
977デフォルトの名無しさん:2009/01/06(火) 02:19:03
>>976
違う
ポインタはアドレス(番地)と、指しているものの型をいっしょにした概念
978デフォルトの名無しさん:2009/01/06(火) 02:22:53
>>975
filenameはfilenameの先頭要素へのポインタ
filename[0]はfilenameの0番目の要素へのポインタ
979デフォルトの名無しさん:2009/01/06(火) 02:25:33
>>964
int型変数はどうなんでしょうか?

int型変数では、演算によるオーバーフローは発生しない

「はい」ですか「いいえ」ですか?
980デフォルトの名無しさん:2009/01/06(火) 02:28:17
>>979
発生する。
発生した場合、未定義動作。
981デフォルトの名無しさん:2009/01/06(火) 02:28:33
そろそろレス数が少ないから総括してしまうが
char filename[5][MAX_SIZE]; と書いたとき、
filenameは「『char MAX_SIZE個からなる配列』5つからなる配列」で、
これはすぐ「filename[0]を指す『char MAX_SIZE個からなる配列』へのポインタ」に成り下がる
filename[0]は「char MAX_SIZE個からなる配列」で、
これもすぐに「filename[0][0]を指すcharへのポインタ」に成り下がる
sprintfに与えるのは「確保された十分な大きさの領域の先頭を指しているcharへのポインタ」で、
この場合filename[0]〜filename[4]を与えることができる

君の最初のコードは何が間違っていたかというと、
filename[i][MAX_SIZE]が、filename[i]の最後の要素であるfilename[i][MAX_SIZE-1]を飛び越して
実際にはfilename[i+1][0]になってしまっていて、そこへのポインタを&演算子で作り出して与えてしまった
&filename[i+1][0]はfilename[i+1]と同じことだから、つまりfilename[0]〜filename[9]を与えるべきところで
filename[1]〜filename[10]を与えてしまった
このとき、filename[10]はfilenameという二次元配列全体をも飛び越した場所、つまり確保されていない領域を指している
そこにsprintfで書き込んだからおかしくなった

わかったかな?
982デフォルトの名無しさん:2009/01/06(火) 02:31:26
>978
違う

filenameはcharのSIZE個の配列5個の配列で、その先頭要素(charのSIZE個の配列)へのポインタになる

filename[0]はfilenameの0番目の要素(charのSIZE個の配列)で、その先頭要素(char)へのポインタになる
983デフォルトの名無しさん:2009/01/06(火) 02:34:31
>>981
とてもわかりやすい説明ありがとうございます。
今日教えていただいたことはだいたい理解したつもりですが、また忘れないように勉強しときます
984デフォルトの名無しさん:2009/01/06(火) 02:35:54
filename と &filename[0]
filename[0] と &filename[0][0]
ポインタとして演算をする時は、それぞれ同じように振る舞うということを覚えておくといいよ
985デフォルトの名無しさん:2009/01/06(火) 02:41:24
>>984
ポイントを絞った解説ありがとうございます。自分もまさにそのように覚えようとしていました。


下のようにプログラムを書きなおしたのですが、最後だけうまくいきません。

for(i=0;i<10;i++){
sprintf(filename2[i],"%d%d1.csv",number,i);
sprintf(filename2[i+10],"%d%d2.csv",number,i);
}

for(i=0;i<20;i++){
printf("filename2[%d]=%s\n",i,filename2[i]);
}

結果は
filename2[0]=101.csv
filename2[1]=111.csv


filename2[18]=182.csv
filename2[19]=192.

となってしまいました。これはなぜでしょうか?
986デフォルトの名無しさん:2009/01/06(火) 02:45:54
切り貼りしないでソース全部貼れ
987デフォルトの名無しさん:2009/01/06(火) 02:49:37
char filename2[19][MAX_SIZE];
で宣言していたのを
char filename2[20][MAX_SIZE];
で宣言すると解決しました。

配列は0から始まるので20個使いたいときは[19]で宣言すればいいのではないんでしょうか?
988デフォルトの名無しさん:2009/01/06(火) 02:50:04
int 型(符号つき32 ビット整数)および、unsigned int 型(符号なし32 ビット整数)のそれぞれの最大値の求め方を教えてください。
バカな質問ですいません。
989デフォルトの名無しさん:2009/01/06(火) 02:50:24
宣言時は要素の数を指定する
使う時は0から使う
990デフォルトの名無しさん:2009/01/06(火) 02:51:02
>>987
20個使うときは[20]で宣言して[0]から[19]までの20個を使う
991デフォルトの名無しさん:2009/01/06(火) 02:51:08
ほんっとに基本がわかってないんだな!
配列の大きさは0スタートじゃないよ
992デフォルトの名無しさん:2009/01/06(火) 02:51:23
>>989
そうなんですか、知りませんでした。
初心者以下のミスをしてしまいました。どうもすみませんでした。
993デフォルトの名無しさん:2009/01/06(火) 02:51:47
>>988
limits.hを見る
994デフォルトの名無しさん:2009/01/06(火) 02:53:01
INT_MAX
UCHAR_MAX
でぐぐれ
995デフォルトの名無しさん:2009/01/06(火) 02:53:12
>>988
#include <limits.h>

INT_MAX int 型最大値
UINT_MAX unsigned int 型最大値
996デフォルトの名無しさん:2009/01/06(火) 02:58:21
>>993
>>994
>>995
ありがとうございます。
997デフォルトの名無しさん:2009/01/06(火) 03:31:50
次スレたてました
C言語なら俺に聞け(入門篇) Part 42
http://pc11.2ch.net/test/read.cgi/tech/1231180205/
998デフォルトの名無しさん:2009/01/06(火) 03:34:37
乙うめぇw
999デフォルトの名無しさん:2009/01/06(火) 03:47:47
>>983
一発で区別を完全に理解できるものではないと、誰しも考えていると思います。そのたびごとに面倒がらずに振り返っていただければ。

>>981
お疲れ様です。頭が下がります。
1000デフォルトの名無しさん:2009/01/06(火) 03:48:38
生め
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。