C言語なら俺に聞け(入門篇) Part 41
レス数が1000を超えています。これ以上書き込みはできません。
教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
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
0002デフォルトの名無しさん
2008/12/19(金) 10:48:390003デフォルトの名無しさん
2008/12/19(金) 16:40:15早速質問で申し訳ないが、
#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をどのようにすれば最初の数字もランダムにできるんでしょうか?
0004デフォルトの名無しさん
2008/12/19(金) 16:48:350005デフォルトの名無しさん
2008/12/19(金) 19:15:38ただし環境依存。
0006デフォルトの名無しさん
2008/12/19(金) 19:18:21これは Windows を起動してからのミリ秒単位の時間。
0007デフォルトの名無しさん
2008/12/19(金) 21:43:37返答ありがとうございます。
上記の方法を調べてみます
0008デフォルトの名無しさん
2008/12/20(土) 19:23:23C言語を覚えた方が良いのでしょうか?
javaなどがあるらしいんですが。
C言語で基礎を固めてから、他の言語へ移行みたいな感じでしょうか?
0009デフォルトの名無しさん
2008/12/20(土) 19:36:37(そもそも"何"のプログラマーなんだ?)
0010デフォルトの名無しさん
2008/12/20(土) 19:37:330011デフォルトの名無しさん
2008/12/20(土) 19:39:06もっと長期的に考えてるのなら別にいいんだけど
(十分なスキルがついてからなら問題は無いだろうし)。
個人的にはまずはCとアセンブリ言語をやるべきだと思ってる。
ただ、そんなに熱心に入れ込む必要は無くて、
ある程度感じがつかめたところで C# か Java あたりを触ってみるといい。
その後 Perl か PHP でも触ってみれ。
複数の言語を扱った方が新しい言語を覚える抵抗が低くなって、
時代に付いていきやすくなる。
0012デフォルトの名無しさん
2008/12/20(土) 22:38:28log10とlogの逆ってなんなんですか?
0013デフォルトの名無しさん
2008/12/20(土) 22:45:380014デフォルトの名無しさん
2008/12/20(土) 22:53:40y = log(x) の逆は x = exp(y)
0015デフォルトの名無しさん
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
0016デフォルトの名無しさん
2008/12/20(土) 22:55:580017デフォルトの名無しさん
2008/12/20(土) 23:05:22普通コンパイルエラーになると思うんだが。
コンパイラ何使ってるんだ?
0018デフォルトの名無しさん
2008/12/20(土) 23:08:26どこがなると思うの?
0019デフォルトの名無しさん
2008/12/20(土) 23:17:03p=new char[10];
これがコンパイルできるはずがない
0020デフォルトの名無しさん
2008/12/20(土) 23:19:060021デフォルトの名無しさん
2008/12/20(土) 23:22:501) pは割り付けた領域の先頭要素へのポインタとして評価される
2) &pはpへのポインタとして評価される
1)と2)はふつう別のものだから当然違う値になる
3) strは配列そのものだがこれはすぐに配列の先頭要素へのポインタに成り下がって評価される
4) &strは3)の法則に当てはまらない例外として配列へのポインタとして評価される
配列へのポインタと配列の先頭へのポインタは大きさは違うが指している位置は同じなので
%pで出力すると同じ値を吐く
0022デフォルトの名無しさん
2008/12/20(土) 23:25:40配列の仕様??
0023デフォルトの名無しさん
2008/12/20(土) 23:26:02なるほどなwwwwww
0024デフォルトの名無しさん
2008/12/20(土) 23:29:10問題点はそこじゃない
むしろ4番目と6番目がなぜ配列の先頭になるのか、がポイント
0025デフォルトの名無しさん
2008/12/20(土) 23:29:22おー、どうもありがとう。
malloc使えばいいのにnew使ってしまいました。すみません
0026デフォルトの名無しさん
2008/12/21(日) 00:38:57ポインタを要求するところで str と使うと自動的に char* に変換される仕様になっている。
で、この値は配列の先頭アドレス、すなわち &str[0] に等しいという仕様になっている。
で、一方 &str の型は配列へのポインタ、すなわち char(*)[10] になる。
値は当然配列のアドレスなのだが、これは当然配列の先頭アドレスに等しい。
というわけで str も &str も配列の先頭アドレスを指すわけだ。
ただ、両者で型が違う点には注意すること。
そして、&str に * をつけると脱参照されるわけだが、
&str は str へのポインタっちゅーわけなんで、
*&str は当然 str を指す。
*&p が p を指すのと同じ理屈だ。
0027デフォルトの名無しさん
2008/12/21(日) 00:56:51p はその保有しているアドレスを返し、
&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] で得られる) ← どちらも同じアドレス(でも型は違う)
0028デフォルトの名無しさん
2008/12/21(日) 01:01:380029デフォルトの名無しさん
2008/12/21(日) 01:10:30それを期待したい時に使えなくはない。
でも、普通はそんな使い方しないよね。
typedef double matrix[3][3];
void foo(matrix hoge);
matrix m;
foo(m);
みたいな使い方ならありうると思う。
hoge の型は double(*)[3] だ。
0030デフォルトの名無しさん
2008/12/21(日) 01:12:36ここは C のスレだから関係はないが。
0031デフォルトの名無しさん
2008/12/21(日) 01:35:20マジトンクス
0032デフォルトの名無しさん
2008/12/21(日) 02:18:29↓のコードだと 配列宣言の直下では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);
}
0033デフォルトの名無しさん
2008/12/21(日) 02:27:29http://www.kouno.jp/home/c_faq/c6.html
0034デフォルトの名無しさん
2008/12/21(日) 02:38:14その変数の宣言を見て区別する
面倒くさいなら、配列であってもポインタであっても問題が起きないような使い方をする
0035デフォルトの名無しさん
2008/12/21(日) 03:03:430036デフォルトの名無しさん
2008/12/21(日) 07:46:12Cでは関数の引数として配列を渡すことはできない。つねに配列の先頭要素を指すポインタとなる。
ついでに
char a[10];
があったとき裸のaは「次の例外を除けば」その配列の先頭要素へのポインタとして扱われる。
例外
&のオペランドになった場合
sizeofのオペランドになった場合
配列宣言の初期化子になった場合
>34
いや、配列とポインタは別物なのだから、どちらでも問題ないようなコードなんて無理なんじゃない?
0037デフォルトの名無しさん
2008/12/21(日) 10:27:21見たこと無いというか。付けるなって聞いたんですが。
0038デフォルトの名無しさん
2008/12/21(日) 11:11:48void hoge(char *a)
{
printf(a);
}
int main()
{
char a[] = "ABCDE";
// CDEの部分だけ渡したい
hoge(&a[2]);
return 0;
}
0039デフォルトの名無しさん
2008/12/21(日) 11:25:27引数に渡されてきたものが
元がポインタだろうが元が配列だろうが
どちらでも問題ないコード、と言う事だろう。
具体的に言えば、サイズは引数で渡せ、と。
0040デフォルトの名無しさん
2008/12/21(日) 11:34:14>>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);
0041デフォルトの名無しさん
2008/12/21(日) 11:40:520042デフォルトの名無しさん
2008/12/21(日) 11:44:19なるほど。勉強になったサンクス!
0043デフォルトの名無しさん
2008/12/21(日) 13:19:48要素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;
}
0044デフォルトの名無しさん
2008/12/21(日) 13:22:230045デフォルトの名無しさん
2008/12/21(日) 13:33:47無理ではない
具体的には以下のことをしなければいい
・sizeof、&を作用させない
・代入しない
・free()しない
0046デフォルトの名無しさん
2008/12/21(日) 14:30:22自動変数のretを初期化してないようだけど
0047デフォルトの名無しさん
2008/12/21(日) 14:52:09無理にポインタ演算をするのは避けた方がいい。それに、forを使った方がこの場合はシンプルにまとまる。
0048デフォルトの名無しさん
2008/12/21(日) 15:10:36int total = 0. i;
for(i=0 ; i<elements ; i++) {
total += array[i];
}
/* デバッグ用 */
printf("合計は%f\n", total);
return (double)total / elements;
}
0049デフォルトの名無しさん
2008/12/21(日) 15:11:33これは一度実体参照してるから違反になる可能性があるのかな?
0050デフォルトの名無しさん
2008/12/21(日) 15:33:23&array[elements] は array+elements と厳密に等しいと決まってる。
0051デフォルトの名無しさん
2008/12/21(日) 17:47:45この結果は i * i, (i+1) * i, i *(i+1)
のどれになるかは不定ですよね?
0052デフォルトの名無しさん
2008/12/21(日) 17:49:52いいえ、不定ではなく、未定義です。
常識的に導かれる結果になるかもしれませんし、ならないかもしれません。
0053デフォルトの名無しさん
2008/12/21(日) 18:04:19評価順序は不定で、結果は未定義ということですか?
0054デフォルトの名無しさん
2008/12/21(日) 18:09:39void hoge(foo(), bar()); の foo() と bar() の評価順は不定。
foo と bar が互いに影響を及ぼし合う副作用を持っていない場合は
「正しい」プログラムになる。
i++ * i++; は未定義。どうあっても正しいプログラムにはならない。
0055デフォルトの名無しさん
2008/12/21(日) 18:10:320056デフォルトの名無しさん
2008/12/21(日) 18:11:17評価の順序そのものが規格に無く、コンパイラ実装者が勝手に判断して実装しても良いし、特に意識して実装する必要もない。
従って、どうなるかは環境によってバラバラで、やってみなけりゃわからないということ。
・・・だったと思います。間違ってたらごめん。
0058デフォルトの名無しさん
2008/12/21(日) 18:25:25VC8では「条件式が定数です」という警告が出てきます。
これを避けたいのですが、何かいい方法ありませんか?
0059デフォルトの名無しさん
2008/12/21(日) 18:28:13代わりに for(;;){ break; } を使うとか。
0060デフォルトの名無しさん
2008/12/21(日) 18:28:47バカなこと言ってしまった。
0061デフォルトの名無しさん
2008/12/21(日) 18:55:00while(0)でした^^
for - break だと最後のセミコロンが違ってくるので、
できれば他の方法があるとありがたいです
0062デフォルトの名無しさん
2008/12/21(日) 18:57:510063デフォルトの名無しさん
2008/12/21(日) 19:00:55でその警告を無効にはできる。
ただ、効果はその #pragma 以降全体なので、
そのマクロ以外の部分を使ってるところにも影響は及んでしまう。
これをよしとしない場合は・・・難しいな。
マクロを諦めて関数にしてしまうのも1つの手だ。
0064デフォルトの名無しさん
2008/12/21(日) 19:01:55仕事で使ったりと?
0065デフォルトの名無しさん
2008/12/21(日) 19:04:160066デフォルトの名無しさん
2008/12/21(日) 19:04:540067デフォルトの名無しさん
2008/12/21(日) 19:04:59お馬鹿
0068デフォルトの名無しさん
2008/12/21(日) 19:07:57ありがとうございます
地味に難しい問題なのですね
0069デフォルトの名無しさん
2008/12/21(日) 19:09:230070デフォルトの名無しさん
2008/12/21(日) 19:10:14C言語というと標準ライブラリのstdio.hというイメージがまとわりついて。
組み込み系でもstdio.hを使用して書いていくのでしょうか?
やはり、その企業のライブラリを使うのでしょうか?
そこらへんがよくわからないのですが、stdio.hだと出力などですよね?
たとえば自動販売機などの値段表示などstdio.hのprintf表示してるんですか?
組み込み系といってなかなかイメージがわきません。
C言語入門の本などで組み込み系の仕事もこなせるのでしょうか?
そこらへんを教えてください。
0071デフォルトの名無しさん
2008/12/21(日) 19:17:40組み込み系に標準出力とか普通無い。
自販機の値段制御はLEDの制御ってことになるな。
ドライバだとメモリマップドIOでメモリ読み書きしてLEDの明滅制御したりする。
上層のアプリだとドライバ担当の人が作ったライブラリとかで、
LED_SetPrice(100); // 100円表示
見たいな感じか?
0072デフォルトの名無しさん
2008/12/21(日) 19:17:480073デフォルトの名無しさん
2008/12/21(日) 19:29:51そういう電光掲示板みたいな出力もプログラマがアセンブラで全て自作してやるかと思ってました。
転職なんですが、C言語を使うプログラマの場合やっぱり頭はフル回転で作業するのでしょうか?
それともSEが指示した通りに書いてバグとかは自分で考えてやるというものでしょうか?
いきなり、在庫管理をするソフトを作れと言われても経験を積んでない場合、その企業の上司が教えてくれたり。
関数とかも最初は説明をうけたりしてちゃんと文法とかわかってれば通用するもんですか?
スレ違いなようですが、こっちは栄えてるのでその道の経験者が多いような気がしてこちらに質問してます。
0074デフォルトの名無しさん
2008/12/21(日) 19:31:280075デフォルトの名無しさん
2008/12/21(日) 19:38:360076デフォルトの名無しさん
2008/12/21(日) 19:39:300077デフォルトの名無しさん
2008/12/21(日) 19:40:570078デフォルトの名無しさん
2008/12/21(日) 19:42:53|「規格が明確に定義していない」には3種類あって、以下のように定義されている。
|
|・処理系定義(implementation defined)の動作
|どう動作するかを実装が選択する。そのプログラムがコンパイルできないというのは許されない。
|(この構成概念を使ったプログラムは誤りというわけではない。)
|(実装が)何を選んだかは(コンパイラの作者が)文書にしておかなければならない。
|規格が合法な動作をいくつか用意していてそこから選ぶことができるかもしれないし、
|必要条件をとくに課していないかもしれない。
|
|・未規定(unspecified)の動作
|処理系定義の動作に似ている。ただし、どういう動作を選んだかは文書にする必要がない。
|
|・未定義(undefined)の動作
|本当に何が起きても不思議はないことを意味する。規格は何の必要条件も課さない。
|コンパイルできないかもしれないし、誤った動きをするかもしれないし
|(クラッシュしたり黙って誤った結果を出したり)、
|あるいはたまたまプログラマの意図したとおりの動きをするかもしれない。
0079デフォルトの名無しさん
2008/12/21(日) 19:43:04また同じ文章を書くのが大変で、コピペしたら、マルチポストなどと言われてしまったことがあり
つい質問を続けてしまいました。すみませんm(__)m
0080デフォルトの名無しさん
2008/12/21(日) 19:43:370081デフォルトの名無しさん
2008/12/21(日) 20:21:46それ以降のデータを手前に詰めたい(リスト構造でデータを削除するそれと同じ感じ)
んだけど、何かよい標準関数ないですかね?もし自分で実装するなら、
どういうアルゴリズムがいいでしょ?
0082デフォルトの名無しさん
2008/12/21(日) 20:24:26配列構造だな。
普通に地道に詰めるしかないと思うよ。
強いて言うなら、ファイルの書き込みに失敗した時にファイルが壊れて欲しくないなら、
一旦別ファイルを作って、成功したときのみリネームするようにした方がいい。
0083デフォルトの名無しさん
2008/12/21(日) 21:06:48きびしいぃ。
普段苦労しているいるんだろうなぁ
スレに沿った話題はフレンドリーなのにねw
0084デフォルトの名無しさん
2008/12/21(日) 21:07:59008581
2008/12/21(日) 21:33:50thx。詰めるって表現が間違ってた。
ABCDEFGHIJKLMNO
のうちGHを削除↓
ABCDEFIJKLMNO
って感じ。何か無意味なデータを詰めるんじゃないんです。
最初にEOFまでのサイズ取得しておいて、削除したらその手前までのseekサイズを差し引いた分
どっかに退避して、fwiteしなおすしかないかな。。。
0086デフォルトの名無しさん
2008/12/21(日) 21:37:23↓
ABCDEFGHONMLKJI
↓
ABCDEFIJKLMNOHG
0087デフォルトの名無しさん
2008/12/21(日) 21:38:34>>82は、そういう意味でのアドバイスだろ。
0088デフォルトの名無しさん
2008/12/21(日) 21:41:22標準関数でなくてよかったら、ファイルの長さを変える関数はあるだろうから、
ファイルの中身をそう書き換えて、ファイルを短くすればいいよ。
0089デフォルトの名無しさん
2008/12/21(日) 21:44:05いや、特に表現に間違いはないが・・・。
リスト構造の場合は、要素を削除しても要素の位置は変わらない。
次の要素がどこにあるかって情報を持ってるからね。
でも配列の場合は間を詰める必要がある。
だからこの構造はリストじゃなくて配列だ。
ファイル直書き換えは不慮のエラーが会った時に問題があるし(ファイルが壊れる)、
標準関数にはファイルの長さを変える関数もないので、
新しくファイルを作って、成功したときのみリネームした方が無難。
009082
2008/12/21(日) 22:25:15仰るとおり。
メモリ空間上では、データの位置は変わってませんね。
>>88
そんな関数があるんだ・・・。調べてみるよ。
>>89
「新しくファイルを作る」ですか。または、データ削除前に
一発ファイルコピってから操作開始でもOKですよね?
とりあえず、データ壊さないように弄ってミマス。
>>86
ごめん、これ見ただけじゃ、俺にゃ理解できないお。
逆順に並べ替える何かあるの???
0091デフォルトの名無しさん
2008/12/21(日) 22:47:05あのCM内容は在日や韓国が日本を支配するみたいな感じですね。
飛んでる飛行機とか韓国軍の飛行機みたいだし、「この国は我々の物だ!」とか言ってる時点でそう感じる。
あのCM見るとすごい不愉快になるし、ムカツイてきます。
在日の存在や韓国の実態を知らない人はあのCMを見てなんとも思わないんでしょうね。
今頃、あのCMを作った人や在日や韓国人は笑っているでしょうね。
あのCM内容でパチンコ業界のすべてがわかります。 反日だということを!
パチンコは日本の癌です。
0092デフォルトの名無しさん
2008/12/22(月) 00:58:51それを変更(機軸変更)して、例えば、その日の(00:00:00)に、したい場合
どうすればいいでしょうか?
009392
2008/12/22(月) 01:01:35したいんです。
3600*〜などにすべきなのでしょうか?
0094デフォルトの名無しさん
2008/12/22(月) 01:14:54閏年とか考慮しやがらねえつもりだろ。
tm 構造体を使った関数を参照するといい。
0095デフォルトの名無しさん
2008/12/22(月) 01:31:33当日0時からの秒数が知りたいなら、そう質問すべき
009692
2008/12/22(月) 02:16:31はい、すみません。。。
>>tm 構造体を使った関数を参照するといい。
今、調べていますが難しい・・・・
>>95
はい、まさにそうです。
どうやって、求めるか悪戦苦闘中です。
009792
2008/12/22(月) 02:37:510098デフォルトの名無しさん
2008/12/22(月) 02:41:30009995
2008/12/22(月) 02:45:51汎用的には 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;
010092
2008/12/22(月) 02:58:34ありがとうございます。。。
とても、難しいです。
time_t t = time(0);の、0はNULLと同じでしょうか?
tm_hour * 3600 でどうして3600秒をかけるのでしょうか?
参考書レベルを凌駕していて、変な質問ですみません。。
0101デフォルトの名無しさん
2008/12/22(月) 04:33:570102デフォルトの名無しさん
2008/12/22(月) 07:13:130103デフォルトの名無しさん
2008/12/22(月) 07:14:55やっぱり tm 構造体使わないとダメだな。
0104デフォルトの名無しさん
2008/12/22(月) 07:47:30#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;
}
0105デフォルトの名無しさん
2008/12/22(月) 07:57:350106デフォルトの名無しさん
2008/12/22(月) 09:32:360107デフォルトの名無しさん
2008/12/22(月) 10:39:51×数学
×算数
○さんすう
0108デフォルトの名無しさん
2008/12/22(月) 10:57:17算数ですか…
0109デフォルトの名無しさん
2008/12/22(月) 11:44:05ダメすぎ。なんでlocaltime()を使わないの?
localtime()でstruct tmにばらしたら後は(tm_hour * 60 + tm_min) * 60 + tm_secなのに。
0110デフォルトの名無しさん
2008/12/22(月) 14:27:56コンパイラ:gcc
やりたいこと:実行ファイルを実行した時、実行ファイルの格納されているディレクトリを取得したい。
例:
~/hogeという実行ファイルがあるとして
#/home/user/hoge
/home/user
#cd /home/user
#./hoge
/home/user
0111デフォルトの名無しさん
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;
}
0112デフォルトの名無しさん
2008/12/22(月) 14:51:57#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]);
}
ここまではうまくいってくれますが、それ以降でエラーを出します。
どこの書き方がまずいんでしょう?
0113デフォルトの名無しさん
2008/12/22(月) 14:52:19ありがとう。
解決方法へのリンク
http://ml.tietew.jp/cppll/cppll_novice/thread_articles/756
0114デフォルトの名無しさん
2008/12/22(月) 15:00:32nの数が定義されていないけど。
0115デフォルトの名無しさん
2008/12/22(月) 15:05:57何で平均してるのかは置いといて、
「エラー」ってだけで伝わると思ってるの?
0116デフォルトの名無しさん
2008/12/22(月) 15:10:40int main()
{
int* data; //数値
data = (int*)malloc(sizeof(int) * n);
//ここにdataを使う処理を書く
free(data);
return(0);
}
すまん。nは設定してたね。
抵抗の値が1001個を入力した時に落ちると思うから
上のように動的にメモリを確保したほうがいいよ。
0117デフォルトの名無しさん
2008/12/22(月) 15:28:30ttp://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_2.html#SEC23
これも見た?
0119112
2008/12/22(月) 16:10:32並列接続ですので、個数で割ってます。
エラーというのは、コンパイル終わったあとに、コマンドラインで実行中にエラーが出て強制終了してしまうと言う意味でした。
説明不足すみません。
>>116
今回には反映させてないんですが、次回からの参考にさせていただきます。有難うございます。
考えてみた結果、コマンドラインで実行中にエラーで強制終了する理由は、
teikou += teikou + data[i]; ここでteikouを初期化してなかったのが問題だったようです。
しかし、これを直してみても、ちゃんと値が反映されなかったのですが、それの理由が
teikouを動的変数にしていなかったのが問題だったようです。
0120112
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);
}
0121デフォルトの名無しさん
2008/12/22(月) 16:34:42それよりstatic付けたら静的だし、
そこはエラーと関係無いと思うんだけどな。
なんつーエラーか結局不明だし。
まぁ出来上がったってならいいか。
0122デフォルトの名無しさん
2008/12/22(月) 16:41:09具体的な例を出すと、答えやすかったと思うよ。
例えば、
抵抗値の数を入力:3
data[%d] = ???:"1
data[%d] = ???:"2
data[%d] = ???:"3
抵抗値は10Ωです。
となってほしいが、現状はこうなっているみたいに。
エラーが起こるだけだと抽象的すぎて、何が起こってるのか想像しないといけないだろ?
0123デフォルトの名無しさん
2008/12/22(月) 16:49:39SSうpしました。
http://www2.uploda.org/uporg1874557.jpg
こういったエラーです。
今後気をつけます!すみません。
ってか平均を求めるのはたしかにおかしいですね。
精液と動的の違いもごっちゃになっているので、勉強しなおします。。
0124デフォルトの名無しさん
2008/12/22(月) 16:51:26エラーメッセージの英語ぐらい読めないのか?
The variable 'teikou' is being used without being initialized. って、ちゃんと書いてあるのに。
0125デフォルトの名無しさん
2008/12/22(月) 16:54:48読んでませんでした。すみません。
0126デフォルトの名無しさん
2008/12/22(月) 16:59:22まぁ最初はそんなもんだよ。
次からは、
エラーメッセージを読む。
質問の仕方を考える。
の2点が学べてよかったじゃないか。
0127デフォルトの名無しさん
2008/12/22(月) 17:01:47ありがとうございます。頑張ります。
0128デフォルトの名無しさん
2008/12/22(月) 17:10:02その分析をしたいんだけど。
つまりこの空白には\tがはいってるのかとか
そういうのってCで書けるっけ?
0129デフォルトの名無しさん
2008/12/22(月) 17:15:390130デフォルトの名無しさん
2008/12/22(月) 17:23:20ファイルを1バイトずつ読んで、タブがあるか調べればいいんじゃね?
0131デフォルトの名無しさん
2008/12/22(月) 17:24:52>平均を求めるのはたしかにおかしいですね。
うわー俺も忘れてる。「和分の積」だっけ。
>精液と動的の違いもごっちゃになっているので
どう見ても精(ry本当に(ry
>>128
開いて読んでナメて閉じる。
0132デフォルトの名無しさん
2008/12/22(月) 17:32:060133デフォルトの名無しさん
2008/12/22(月) 17:48:49a=1,b=2,c=3;
a+=2,b+=2,c+=2;//ここをスマートに書くことは出来ますか?
0134デフォルトの名無しさん
2008/12/22(月) 17:49:580135デフォルトの名無しさん
2008/12/22(月) 17:51:500136デフォルトの名無しさん
2008/12/22(月) 17:52:40まずは、出来るのですか、出来ないのですか
出来るのであればご教授ください
0137デフォルトの名無しさん
2008/12/22(月) 17:54:05すみません。初期化は私が望むものではありません
0138デフォルトの名無しさん
2008/12/22(月) 17:57:14後出しは不可
0139デフォルトの名無しさん
2008/12/22(月) 17:57:41分からないならもういいです
0140デフォルトの名無しさん
2008/12/22(月) 17:58:55どこが後出しなの?
0141デフォルトの名無しさん
2008/12/22(月) 17:59:500142デフォルトの名無しさん
2008/12/22(月) 18:01:06揚げ足取りですか
0143デフォルトの名無しさん
2008/12/22(月) 18:02:540144デフォルトの名無しさん
2008/12/22(月) 18:03:22無理
0145デフォルトの名無しさん
2008/12/22(月) 18:44:050146デフォルトの名無しさん
2008/12/22(月) 19:16:15int a, b, c;
a=3,b=4,c=5;
0147デフォルトの名無しさん
2008/12/22(月) 19:44:370148デフォルトの名無しさん
2008/12/22(月) 19:55:00int __attribute__((aligned(16))) abc[] = {1, 2, 3, 0};
_mm_store_si128(abc, _mm_add_epi32(_mm_load_si128(abc), _mm_set1_epi32(2)));
0149デフォルトの名無しさん
2008/12/22(月) 20:05:00int *helo[4] = {&a, &b, &c,};
for(int i = 0; helo[i]; i++){
*helo[i] += 2;
}
0150デフォルトの名無しさん
2008/12/22(月) 21:30:28a += (b += ((c += 2) - c + 2)) - b + 2;
0151デフォルトの名無しさん
2008/12/22(月) 21:49:320152デフォルトの名無しさん
2008/12/22(月) 21:54:27int i;
int a[SIZE];
for (i = 0; i < SIZE; i++) {
a[i] = i + 1;
}
for (i = 0; i < SIZE; i++) {
a[i] += 2;
}
0153デフォルトの名無しさん
2008/12/22(月) 22:13:24int scmp(const void *p1, const void *p2)
{
char *v1, *v2;
・・・
というのがでてきたんですが、
vって何の略なんですか?
他の関数の仮引数でもたまに見かけたりするので気になりました。
0154デフォルトの名無しさん
2008/12/22(月) 22:14:220155デフォルトの名無しさん
2008/12/22(月) 22:14:560156デフォルトの名無しさん
2008/12/22(月) 22:17:240158デフォルトの名無しさん
2008/12/22(月) 23:37:020159デフォルトの名無しさん
2008/12/22(月) 23:38:430160デフォルトの名無しさん
2008/12/22(月) 23:39:590161デフォルトの名無しさん
2008/12/22(月) 23:46:08釣りかもしれんがそれはinit
0162デフォルトの名無しさん
2008/12/22(月) 23:51:03short integer 短い整数
integer 整数
long integer 長い整数
floating point number 浮動小数点数
double precision floating point number 倍精度浮動小数点数
strucutre 構造体
external declaration 外部宣言
0163デフォルトの名無しさん
2008/12/22(月) 23:58:170164デフォルトの名無しさん
2008/12/22(月) 23:59:280165デフォルトの名無しさん
2008/12/23(火) 00:04:180166デフォルトの名無しさん
2008/12/23(火) 00:06:000167デフォルトの名無しさん
2008/12/23(火) 00:07:040168デフォルトの名無しさん
2008/12/23(火) 00:26:51int func();
int func(a, b, c)
int a;
int b;
int c;
{
…
}
のような書き方してる人が居るんだけど、
コンパイルは通るんだろうけど、有りなの?
0169デフォルトの名無しさん
2008/12/23(火) 00:32:09Ansi-C以前のいわゆるK&RのC。
特殊なオプションをつけないとコンパイル通らないんじゃないかな?
0170デフォルトの名無しさん
2008/12/23(火) 00:34:32今のバージョンは知らんけど、わりと最近のバージョンまで。
0171デフォルトの名無しさん
2008/12/23(火) 00:42:230172デフォルトの名無しさん
2008/12/23(火) 00:52:37トリグラフなんかとちがって
0173デフォルトの名無しさん
2008/12/23(火) 01:14:12「古い形式です」って警告は出るかもしらんが。
0174デフォルトの名無しさん
2008/12/23(火) 01:19:13つまらないケアレスミスをデバッグまで引きずることになる
そういう意味で生産性が低い
0175デフォルトの名無しさん
2008/12/23(火) 01:19:300176デフォルトの名無しさん
2008/12/23(火) 07:45:420177デフォルトの名無しさん
2008/12/23(火) 10:30:180178デフォルトの名無しさん
2008/12/23(火) 10:32:310179デフォルトの名無しさん
2008/12/23(火) 15:05:06どこに?
0180デフォルトの名無しさん
2008/12/23(火) 16:12:36-1606070790904610816.000という変な数値がでてしまうときは
どういう時ですか?
0181デフォルトの名無しさん
2008/12/23(火) 16:37:05マクロで作った関数もどきはインライン展開されるから、関数呼び出しのオーバーヘッドが無いんだってね。
0182デフォルトの名無しさん
2008/12/23(火) 16:38:450183デフォルトの名無しさん
2008/12/23(火) 16:47:48とりあえず双方のコードをさらしてほしい。
0184デフォルトの名無しさん
2008/12/23(火) 16:56:59>>181
C言語@便利なマクロ
http://pc11.2ch.net/test/read.cgi/tech/1144824670/
今時なら、inline付けてくれよ。マクロを必要悪として、私は認めているけど、できるだけ使ってほしくない。
0185デフォルトの名無しさん
2008/12/23(火) 17:02:030186デフォルトの名無しさん
2008/12/23(火) 17:05:47元の処理に戻るのが一苦労だぜ
0187デフォルトの名無しさん
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"
}
ま、開発環境側がメンバ追加時に 記述すべき部分を補間してくれるなら
こういう技巧も無駄だろうけど
0188デフォルトの名無しさん
2008/12/23(火) 18:45:12困難になるのでいやだなあ
あと #endif defined は typo だよね
0189デフォルトの名無しさん
2008/12/23(火) 18:48:250190デフォルトの名無しさん
2008/12/23(火) 19:52:100191デフォルトの名無しさん
2008/12/23(火) 23:05:21数値計算でCとFortran
同じじゃないの
ただし、Cでは複素数
0192デフォルトの名無しさん
2008/12/23(火) 23:09:15変数を初期化してない時。
あるいは初期化してない変数を使って計算した時。
0193デフォルトの名無しさん
2008/12/24(水) 00:05:10#define B ((int)(sqrt(A)*100))
int x;
x = B;
gccを使ってコンパイルしています。
上記の場合、Bは常に223になると思うのですが、
実行時に平方根を計算するのではなく、コンパイル時にBが223まで
展開されるような最適化オプションはあるのでしょうか?
実行時にsqrt関数が呼ばれないようにしたいです。
0194デフォルトの名無しさん
2008/12/24(水) 00:14:140195デフォルトの名無しさん
2008/12/24(水) 00:16:190196デフォルトの名無しさん
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);
0197デフォルトの名無しさん
2008/12/24(水) 00:28:19fwriteとかfeofなんかと同じANSIな感じで。
0198デフォルトの名無しさん
2008/12/24(水) 00:29:09ttp://www.bohyoh.com/CandCPP/C/Library/remove.html
0199デフォルトの名無しさん
2008/12/24(水) 00:30:500200デフォルトの名無しさん
2008/12/24(水) 00:31:22ありがとうございます!
0201デフォルトの名無しさん
2008/12/24(水) 00:37:10レスありがとうございましたm(_ _)m
builtin関数は知らなかったのでググってみます。
>>196さんの例は難しくてまだ理解できていませんがコンパイルして試してみようと思います。
ありがとうございました。
0202デフォルトの名無しさん
2008/12/24(水) 00:40:49結局>>195と同じこと
ただ、平方根として成立してるかはチェックしてるという
0203デフォルトの名無しさん
2008/12/24(水) 01:05:350204デフォルトの名無しさん
2008/12/24(水) 01:06:380205デフォルトの名無しさん
2008/12/24(水) 01:13:060206デフォルトの名無しさん
2008/12/24(水) 01:16:100207デフォルトの名無しさん
2008/12/24(水) 01:20:38プログラムで誰かを救えないかな
0208デフォルトの名無しさん
2008/12/24(水) 01:34:530209デフォルトの名無しさん
2008/12/24(水) 02:31:28Fortranの影響かな
Wikipedia-Fortran
> Fortran暗黙の型宣言 Wikipedia-Fortranより
> ・ 整数型(変数名の先頭がI〜Nのもの)
> ・ 実数型(上記以外)
ちなみにIはIntegerのI。実数(Real Number)はR以降の文字をよく使う。
0210デフォルトの名無しさん
2008/12/24(水) 02:33:560211デフォルトの名無しさん
2008/12/24(水) 02:48:520212デフォルトの名無しさん
2008/12/24(水) 10:30:40で、それの元が>>204
0213デフォルトの名無しさん
2008/12/24(水) 11:00:06void 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");
}
}
0214デフォルトの名無しさん
2008/12/24(水) 19:13:2925オーバーで普通ってどんだけキモオタ仕様なんだよww
おまけに18.5アンダーの比較が二箇所あるし。
一応書いておくぞ。
肥満4度:40オーバー
肥満3度:35オーバー
肥満2度:25オーバー
やせ:18.5アンダー
0215デフォルトの名無しさん
2008/12/24(水) 19:21:07レス番レス番w >21じゃなくて>213だろ。
>>120
今更だけど、並列の場合は逆数の和の逆数だね。
0216デフォルトの名無しさん
2008/12/25(木) 01:50:200217デフォルトの名無しさん
2008/12/25(木) 01:54:19格好が違います。
0218デフォルトの名無しさん
2008/12/25(木) 02:01:11無くていいものを付けてるのが前者
returnを関数と誤解してる奴が書いてそうなのが前者
馬鹿っぽく見えるのが前者
0219デフォルトの名無しさん
2008/12/25(木) 02:12:130220デフォルトの名無しさん
2008/12/25(木) 02:14:07って何ですか?
0221デフォルトの名無しさん
2008/12/25(木) 02:15:180222デフォルトの名無しさん
2008/12/25(木) 02:16:34配列の配列
0223デフォルトの名無しさん
2008/12/25(木) 02:18:07違いは、詰めて書けるか書けないか。オクテット分削れるか削れないか。
returnを例えば、関数マクロでラップしていたら前者になると思う、見たこと無いけどね。
if (), for (), while (), switch ()なので、retrun も()付ける人がいたりする。
しかしながら、見易さの問題でしかないと思う。例えば、式がキャストやビット演算を含む場合は、付けると見易くなる場合が多い。
return foo & ~bar; return ( foo & ~bar );ソースコードに統一感が無いと批判されるだろうが、私は、使い分けている。
0224デフォルトの名無しさん
2008/12/25(木) 02:19:34K&R の初版では括弧がついていたそうですよ。
0225デフォルトの名無しさん
2008/12/25(木) 06:34:160226デフォルトの名無しさん
2008/12/25(木) 06:36:560227デフォルトの名無しさん
2008/12/25(木) 07:09:14リンクエラーになるのであまり気にしなくていい。
0228デフォルトの名無しさん
2008/12/25(木) 07:11:56リンクまでに時間がかる処理系の場合、typoをしないこと。
0229デフォルトの名無しさん
2008/12/25(木) 07:13:32俺も一時期開けてたが、空きすぎると間が抜けて据わりが悪いと気づいて開けなくなった。
0230デフォルトの名無しさん
2008/12/25(木) 11:04:290231デフォルトの名無しさん
2008/12/25(木) 11:07:580232デフォルトの名無しさん
2008/12/25(木) 15:03:49かわいいな。
0233デフォルトの名無しさん
2008/12/25(木) 15:55:15データ構造を組み合わせた場合の管理とか
0234デフォルトの名無しさん
2008/12/25(木) 15:59:450235デフォルトの名無しさん
2008/12/25(木) 16:27:520236デフォルトの名無しさん
2008/12/25(木) 16:53:20最初はわからんでもいい
大規模なプログラムを組むようになるとデザパタの有り難みを
痛感するよ
0237デフォルトの名無しさん
2008/12/25(木) 17:12:250238デフォルトの名無しさん
2008/12/25(木) 18:08:510239デフォルトの名無しさん
2008/12/25(木) 18:27:14考え方や設計点の整理をつけるというところは無駄じゃないかと
0240デフォルトの名無しさん
2008/12/25(木) 19:29:090241デフォルトの名無しさん
2008/12/25(木) 20:00:37何が普通とか無いからw
0242デフォルトの名無しさん
2008/12/25(木) 20:06:370243デフォルトの名無しさん
2008/12/25(木) 20:33:56お前が括弧付ける派で悔しがってるのはわかった
0244デフォルトの名無しさん
2008/12/25(木) 20:34:01> returnを関数と誤解してる奴が書いてそうなのが
> 馬鹿っぽく
主観ばかりで根拠が無い
0245デフォルトの名無しさん
2008/12/25(木) 20:45:13お前が括弧付ける派で悔しがってるのはわかった
0246デフォルトの名無しさん
2008/12/25(木) 20:49:45考えてみるるとちょっと変だ
0247デフォルトの名無しさん
2008/12/25(木) 20:50:130248デフォルトの名無しさん
2008/12/25(木) 20:58:54> お前が括弧付ける派
意味不明。俺はつけない派だしw
0249デフォルトの名無しさん
2008/12/25(木) 20:59:50> それは付けないとだめな場合があるじゃんw
へ?sizeof演算子も知らないとは、主観ばかりで
客観的な動作に対する説明が出来ないなら、黙ってろよ。
誰もお前の意見なんて聞いてない。
0250デフォルトの名無しさん
2008/12/25(木) 21:03:11>へ?sizeof演算子も知らないとは、主観ばかりで
>客観的な動作に対する説明が出来ないなら、黙ってろよ。
>誰もお前の意見なんて聞いてない。
自分に対するレスを予想したんだね
0251デフォルトの名無しさん
2008/12/25(木) 21:53:5110進数を2進数に変換するプログラムを作りたいと思っています。
10進数を2で割ったあまりをならべると2進数になると聞いたので、以下のようなプログラムを書いてみました。
実行してみると、どんな数値を入力しても
124500412450001244996124499212449881244984124498012449761244972
が表示されます。どこがいけないのでしょうか?
0252デフォルトの名無しさん
2008/12/25(木) 21:54:58お前の書いたプログラム
0253デフォルトの名無しさん
2008/12/25(木) 21:58:190254デフォルトの名無しさん
2008/12/25(木) 21:58:39いま焦ってるところだろ?
0255デフォルトの名無しさん
2008/12/25(木) 21:58:5310進数を2で割ったあまりが4や5になるわけがない
そのプログラムをさらしてみ
0256デフォルトの名無しさん
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;
}
0257デフォルトの名無しさん
2008/12/25(木) 22:02:19プログラムがありません
0258デフォルトの名無しさん
2008/12/25(木) 22:02:52何これ
0259デフォルトの名無しさん
2008/12/25(木) 22:03:320260デフォルトの名無しさん
2008/12/25(木) 22:05:370261デフォルトの名無しさん
2008/12/25(木) 22:05:44最初のループが回ってない。
0262デフォルトの名無しさん
2008/12/25(木) 22:07:00for(i=0; i>9; i++)
0263デフォルトの名無しさん
2008/12/25(木) 22:09:100264デフォルトの名無しさん
2008/12/25(木) 22:10:33あと、printfをprintf("%d",z[i]);に修正したのですが、実行結果はどの数字を入れても
25600000000
になります・・・
0265デフォルトの名無しさん
2008/12/25(木) 22:10:51ハローワールドからやり直せwwww
0266デフォルトの名無しさん
2008/12/25(木) 22:13:49x=x/10; > x=x/2;
0267デフォルトの名無しさん
2008/12/25(木) 22:14:20for(i=0; i<9; i++)
iが何から何までの何回実行されるか考えてみよう
0268デフォルトの名無しさん
2008/12/25(木) 22:14:240269デフォルトの名無しさん
2008/12/25(木) 22:16:17main()
{
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;
}
これでいいかな?
0270デフォルトの名無しさん
2008/12/25(木) 22:20:10なるほど・・・ありがとうございます
10で割っていくのではなく2で割っていくんですね・・・
0271デフォルトの名無しさん
2008/12/25(木) 22:44:410272デフォルトの名無しさん
2008/12/25(木) 22:45:570273デフォルトの名無しさん
2008/12/25(木) 22:53:530274デフォルトの名無しさん
2008/12/26(金) 00:16:010275デフォルトの名無しさん
2008/12/26(金) 00:19:46理解して、どんなものがあるかさらっと見て、試しに使ってみるしかない。
0276デフォルトの名無しさん
2008/12/26(金) 00:23:24練習用のコードもかけないな。
0277デフォルトの名無しさん
2008/12/26(金) 01:33:460278デフォルトの名無しさん
2008/12/26(金) 01:57:390279デフォルトの名無しさん
2008/12/26(金) 09:10:44カンフーですね、イー・アルときたら。
0280デフォルトの名無しさん
2008/12/26(金) 12:49:22この上記の文条件式は
a=0、b=0、代入成功のどれを条件としているの?
0281デフォルトの名無しさん
2008/12/26(金) 12:52:08どれでもない
0282デフォルトの名無しさん
2008/12/26(金) 13:02:28if( flag )
とかしないといけないのか、さすがC
0283デフォルトの名無しさん
2008/12/26(金) 13:07:43意味不明。 解説求む。
0284デフォルトの名無しさん
2008/12/26(金) 13:32:07Bはbの間違いだとして
bがaに代入されて、その値が0と比較して等しくなければ条件成立
要するにb!=0だったら成立する
0285デフォルトの名無しさん
2008/12/26(金) 13:33:32そのどれでもなく、
Bを代入したaが0か非0か
0286デフォルトの名無しさん
2008/12/26(金) 14:08:24自分はwchar_tを使うとすっきりしていいのだが
0287デフォルトの名無しさん
2008/12/26(金) 14:16:010288デフォルトの名無しさん
2008/12/26(金) 14:17:56環境に依存した話になれば、Cの立場から言えば好きなようにやればよいということになる
その環境内部での手法の良し悪しについてはもはやCの言及するべきことではない
0289デフォルトの名無しさん
2008/12/26(金) 14:26:15TCHARはMBCSとunicodeをオプション切り替えだけでビルドできるコードを書く時に使う。
そういうコードを書く気がないなら決めうちでいい。
0290デフォルトの名無しさん
2008/12/26(金) 18:34:140291デフォルトの名無しさん
2008/12/26(金) 18:46:080292デフォルトの名無しさん
2008/12/26(金) 18:46:370293デフォルトの名無しさん
2008/12/26(金) 19:11:20作れますか?
0294デフォルトの名無しさん
2008/12/26(金) 19:56:190295デフォルトの名無しさん
2008/12/26(金) 20:00:430296デフォルトの名無しさん
2008/12/26(金) 22:13:24君に出来るのか
0297デフォルトの名無しさん
2008/12/26(金) 23:24:370298デフォルトの名無しさん
2008/12/27(土) 00:39:37個人で市販のゲームみたいなのを作りたいということであればほぼ不可能なので諦めてください
会社に入って作る場合もC++になるのでやっぱり諦めてください
とりあえずPS3で動けば何でもいいというのであれば、Linuxインストールすればおk
0299デフォルトの名無しさん
2008/12/27(土) 01:46:40typedef 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
というコンパイルエラーが出ます。何が間違っていますか。
0300デフォルトの名無しさん
2008/12/27(土) 01:49:310301デフォルトの名無しさん
2008/12/27(土) 01:51:12data.pRgb[0].blue=0かな。。
0302デフォルトの名無しさん
2008/12/27(土) 01:59:30data.pRgb[0][0].blue = 0;
ってのは座標(0, 0)のピクセルのblueって言いたいんでしょ?
pRgbはRGBの一次元配列として認識されているので2次元配列っぽくアクセスすることは出来ないよ。
そういう場合、座標(x、y)なら、
data.pRgb[w * y + x].blue = 0
みたいな感じで座標を一次元配列のindexに変換してアクセス。
0303デフォルトの名無しさん
2008/12/27(土) 01:59:36data.pRgb[someHeight * data.width + someWidth].blue = 0xff;
とやればできました。
ただこういう場合に2次元配列の書き方ではできないものなんですかね。
0304デフォルトの名無しさん
2008/12/27(土) 02:04:41レスありがとうございました。勉強になりました。
0305デフォルトの名無しさん
2008/12/27(土) 02:08:47技巧的になるけどできなくはないよ。この板で何度も取り上げられている。
でもまぁ、一次元アクセスもポピュラーだから慣れておいてもいいと思う。
どうしても馴染めないなら、int offset(int x, int y, int w) {return x + y * w;}でも作るとか。
0306デフォルトの名無しさん
2008/12/27(土) 02:13:120307デフォルトの名無しさん
2008/12/27(土) 02:17:24{
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);
これでいける?
0308デフォルトの名無しさん
2008/12/27(土) 02:27:340309デフォルトの名無しさん
2008/12/27(土) 02:35:31Cには多次元配列というものはない、配列の配列があるだけなので、
下位の配列にアクセスするためにはそのサイズを知っていなければいけないが、
配列のサイズを動的に宣言できないから
下位のサイズが動的な配列の配列は作れないのでポインタの配列でまねるしかない
C99ならできるけど
0310デフォルトの名無しさん
2008/12/27(土) 02:52:04たとえば関数に渡す場合なら
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]みたいな型(文法上はエラーだと思うけど意味はわかりますよね?)
で受け取りたい場合。
0311デフォルトの名無しさん
2008/12/27(土) 02:56:15ってするだけだろ
0312デフォルトの名無しさん
2008/12/27(土) 02:56:51(*m)[x][y]
になるね
0313デフォルトの名無しさん
2008/12/27(土) 03:01:56>>311
じゃあmallocの戻りを
RGB * px[320][240];
px = (ほげほげ)malloc(320*240*sizeof(RGB *));
ってキャストしたい場合、ほげほげはどう書いたらいいのですか?
0314デフォルトの名無しさん
2008/12/27(土) 03:06:26配列は左辺値になれない。
0315デフォルトの名無しさん
2008/12/27(土) 03:06:55配列だから代入不可能
それでいいのか?
RGB (* px)[320][240];
に対してなら
((*)[320][240])でキャスト
つーかそもそもいらない
0316デフォルトの名無しさん
2008/12/27(土) 03:10:09そういえば、ポインタの配列とか、配列のポインタとか昔勉強した気がするなぁ。
もう完全に忘れてる(ってかもともと理解できてなかったのかも^^)
>>314-315さん、ありがとうございます。
0317デフォルトの名無しさん
2008/12/27(土) 03:14:12RGB *(*px)[240];
px = malloc(320*240*sizeof(RGB *));
0318デフォルトの名無しさん
2008/12/27(土) 03:16:51間違ってるけど別にいいか
どうせ通らないし
0319316
2008/12/27(土) 03:22:070320316
2008/12/27(土) 03:27:590321デフォルトの名無しさん
2008/12/27(土) 13:14:02どうしたらいいのですか?
0322デフォルトの名無しさん
2008/12/27(土) 13:20:55それのどこがCの問題?
0323321
2008/12/27(土) 14:19:070324321
2008/12/27(土) 14:57:510325デフォルトの名無しさん
2008/12/27(土) 16:26:47なので、同じ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になるってことですか?
0326デフォルトの名無しさん
2008/12/27(土) 16:31:23memcpy(buf1,buf2,size); // buf1→buf2だっけ、逆だっけ……
0327デフォルトの名無しさん
2008/12/27(土) 16:36:042進数で考える人はあんまりいないけど、そういうこと
>>326
src, dst の順って覚えてる
0329デフォルトの名無しさん
2008/12/27(土) 16:42:19代入と同じ順番
y = x; // y ← x
memcpy(buf1, buf2, size); //buf1 ← buf2
0330デフォルトの名無しさん
2008/12/27(土) 16:46:00ありがとうございます。
ただ、名前付けるといつもこんがらがってました
>>329
これはわかりやすいですね!
積年の悩みが解消されそうです。ありがとうございました。
0331デフォルトの名無しさん
2008/12/27(土) 16:58:52ヘッダ見ても同じ型だから区別つかないしー
0332デフォルトの名無しさん
2008/12/27(土) 17:10:090333デフォルトの名無しさん
2008/12/27(土) 17:25:300334デフォルトの名無しさん
2008/12/27(土) 17:35:020335デフォルトの名無しさん
2008/12/27(土) 17:37:08edか?
0336デフォルトの名無しさん
2008/12/27(土) 17:37:570337デフォルトの名無しさん
2008/12/27(土) 18:11:56ソースをttp://www3.uploda.org/uporg1887866.zip.htmlにアップしましたので、改善ポイントを教えてください。
DLパスワードは1234です。
0338デフォルトの名無しさん
2008/12/27(土) 18:26:080339デフォルトの名無しさん
2008/12/27(土) 18:31:510340デフォルトの名無しさん
2008/12/27(土) 18:35:50Win 以外の環境も知らん間抜けめ。
0341デフォルトの名無しさん
2008/12/27(土) 18:36:42展開してまで見るのは面倒なのでパス。
>>335
emacsはGUI版よりも端末版のほうが私は好きです。
>>334
「最強」の基準によっても変わる。
>>331
ヘッダを見たら、仮引き数に名前がつけられていないか?
手元のcygwinでは前者が_sizeで後者が_nだ。
>>326
やはり、ヘッダを見れば判る。しかもこの場合は型も違う。
0342デフォルトの名無しさん
2008/12/27(土) 18:45:53VS2003 だと仮引数無しで型のみの羅列だね…
仮引数に意味を類推できる名称がつけてあるだけでも違うなー
0343327
2008/12/27(土) 19:20:11一般的には、アドレスがバイト単位で割り振られているので
バイト単位で考えると思う。
まあ、こんな感じ
0 1 2 3
┌──┬──┬──┬──┐
│0x00│0x00│0x00│0x00│
└──┴──┴──┴──┘
なお、>>325 の方法は、アライメントが揃ってないと CPUによっては
例外が発生するとか、0以外の場合 endian に依存するとかあるので、
一般的には注意が必要。
>>330
ごめん、src と dst は逆でした。
0344デフォルトの名無しさん
2008/12/27(土) 19:41:42代入演算子と同じ順番、すなわち
buf1 = buf2, size
と憶える。
0345デフォルトの名無しさん
2008/12/27(土) 19:43:060346デフォルトの名無しさん
2008/12/27(土) 22:53:16線形リストについて具体的なソースが無く、自分で書いてみました。
http://www3.uploda.org/uporg1888553.c.html
プログラムでは、終了する前までに解放している筈なのですが
メモリ使用量をモニタしていると、どうも終了してから解放されているようです。
つまり、プログラムに書いたfree()がうまく効いていないのだと
思うのですが、アドバイスお願いします。
0347346
2008/12/27(土) 22:54:040348デフォルトの名無しさん
2008/12/27(土) 22:59:030350デフォルトの名無しさん
2008/12/27(土) 23:12:49Cライブラリが一括でOSからメモリを確保しておき、
mallocとfreeはそこから領域を切り出したり、返したりしているかもしれない。
そうすると、freeしてもすぐにはOSへメモリを返すことにはならない。
0351デフォルトの名無しさん
2008/12/27(土) 23:20:20そもそも、その「メモリ使用量をモニタ」している手段が判らんからなんとも言えんが、
デバッガで確認しないのはなんで?
0352デフォルトの名無しさん
2008/12/27(土) 23:30:54mainのfscanfの使い方がおかしい
nが初期化されてないのにnの余りを計算している
quick.cのアルゴリズムが変(無限ループ?)
qsortでググれば、サンプルコードいっぱい見つかったけど...
0353デフォルトの名無しさん
2008/12/27(土) 23:34:14その場合、ソースが意図的に動いているかは判らないということですか。
>>351
GNOMEのシステムモニタです。Windowsのタスクマネージャに相当するのかな?
デバッガは、コンパイラがgccで良く判らないもので。。
0354デフォルトの名無しさん
2008/12/27(土) 23:42:54printfでいろいろ表示させるのも、基本的なデバッグ方法だよ。
mallocとfreeのところでそれぞれポインタ値を表示させれば確認できるでしょ。
0355353
2008/12/27(土) 23:55:10// 最初の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;
ポインタの値が一致しているので、一応きちんと動作している、と
考えてよいのでしょうか。
0356デフォルトの名無しさん
2008/12/27(土) 23:59:06>nが初期化されてないのにnの余りを計算している
nにはMAXを入れるのでしょうか?
>quick.cのアルゴリズムが変(無限ループ?)
quick.cもq1.cも教科書の物をそのまま使っています。
10行目のwhile(x[j] > x[end] && j>i)i--; の && j>iが抜けていたのですが、
ここを修正しても結果が出ませんでした。
0357デフォルトの名無しさん
2008/12/28(日) 00:07:52なめるように見直せ
0358デフォルトの名無しさん
2008/12/28(日) 00:09:49メモリは、全て開放(free())されているよ。ただし、プログラム終了時に、OSに返されている。
大体、メモリの確保量が少ないので、free()しても返されていないだけ。
昔、どれだけ確保すれば、free()したときに返されるか試したことがあったが、もう忘れた。
ソース探したんだけどなぁ、見付からなかった。
Linux(kernel 2.6.18-92.x)上で、GCC 4.1.2でやってたけど、一度の確保量が216 Bytesくらいだったかな。
0359デフォルトの名無しさん
2008/12/28(日) 00:10:14ttp://lecture.ecc.u-tokyo.ac.jp/~cichiji/cp-02/cp-02-12-3.html
このソース参考にしてみたら?
0361デフォルトの名無しさん
2008/12/28(日) 00:22:44char str[256];
これの説明でstrは文字が256文字納められる配列とあったのですが、
「a」は1バイト、「あ」は2バイトでデータの量が違うのに同じ文字数配列に格納できるのでしょうか
そうではなくて「a」は256文字で「あ」は128文字分しか格納できないのでしょうか
どなたか教えてください
0362デフォルトの名無しさん
2008/12/28(日) 00:24:380363デフォルトの名無しさん
2008/12/28(日) 00:25:11なめるように見直したら、所々のミスが見つかりました。何度も見直したつもりだったのですが、すみません。
それで、比較回数と交換回数を求めるように改良したいのですが、 うまくカウントしてくれません。
どこを直せば良いでしょうか?
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);
0364デフォルトの名無しさん
2008/12/28(日) 00:25:12ありがとうございます!
もやもやが晴れました!
0365デフォルトの名無しさん
2008/12/28(日) 00:29:32int hikaku = 0, koukan = 0;
を関数の外に出してみれ。
0366デフォルトの名無しさん
2008/12/28(日) 00:34:08確かに char str[256]; に1バイト文字を256文字入れる事ができるが、
C の文字列を扱う場合は通常最後に 0 を入れるので
実質的には255文字しか入れる事が出来ない。
全部2バイト文字だと127文字だな。
もちろん、2バイト文字127文字+1バイト文字1文字も可能だが。
0367デフォルトの名無しさん
2008/12/28(日) 00:37:24なるほど! しっかりとカウント出来るようになりました。
しかし、出力がおかしいです。
比較回数: 29140
交換回数: 11347
比較回数: 29142
交換回数: 11347
比較回数: 29144
交換回数: 11347
比較回数: 29146
交換回数: 11347
という風に、たくさん表示されます。これも関数の外に出すのでしょうか?
printfを#includeの下や最後の}の下に持って行ったのですが、これではコンパイル時にエラーが出ます
なんども申し訳ないです。
0368デフォルトの名無しさん
2008/12/28(日) 00:39:13蛇足だけどソースをutf8にしたりすれば確かめられるだろうけど、
一文字3バイトになったりすることもあり2バイトとは限らないので注意
0369デフォルトの名無しさん
2008/12/28(日) 00:40:21int hikaku = 0, koukan = 0;
をmain関数で参照できるようにしてみれ
0370デフォルトの名無しさん
2008/12/28(日) 00:50:16戻り値ってやつでしょうか?授業でやってないことなのでわかりません。
もし良ければ教えてください。
0371デフォルトの名無しさん
2008/12/28(日) 00:54:30最後にmainで表示でおk。
0372デフォルトの名無しさん
2008/12/28(日) 00:56:09その参考にしてる教科書がよくない。
0373デフォルトの名無しさん
2008/12/28(日) 00:57:28基本からやりなおせ
0374デフォルトの名無しさん
2008/12/28(日) 00:59:590375デフォルトの名無しさん
2008/12/28(日) 01:21:55という根性では誰からもそっぽを向かれるぞ
0376デフォルトの名無しさん
2008/12/28(日) 01:28:00馬鹿なの?
0377デフォルトの名無しさん
2008/12/28(日) 01:37:250378デフォルトの名無しさん
2008/12/28(日) 01:42:37逆順だと動いてるように見えるけど、
そのコードだとうまくソートされないよ。
0379デフォルトの名無しさん
2008/12/28(日) 11:23:350380デフォルトの名無しさん
2008/12/28(日) 11:54:41むしろ自習を促すような教育技法、いや教育理念を教員側が持つ必要があるのでは?つまるところ科挙制度がまかりとおる世間一般の通念が問題なのでは?みんな手を抜きすぎ。
0381デフォルトの名無しさん
2008/12/28(日) 11:57:37これにめげずに本を読めば、いろいろわかってきて楽しくなると思います
0382デフォルトの名無しさん
2008/12/28(日) 12:10:340383デフォルトの名無しさん
2008/12/28(日) 12:24:570384デフォルトの名無しさん
2008/12/28(日) 12:25:460385デフォルトの名無しさん
2008/12/28(日) 12:25:491/100ずつ書き込む
0386デフォルトの名無しさん
2008/12/28(日) 12:27:340387デフォルトの名無しさん
2008/12/28(日) 13:02:14なるほど。天才ですね。
0388デフォルトの名無しさん
2008/12/28(日) 14:41:370389デフォルトの名無しさん
2008/12/28(日) 17:56:49上書きの場合無理。
0390デフォルトの名無しさん
2008/12/28(日) 18:02:08んじゃ、別スレッドで中身をチェックすれば。
↓
中身が(殆ど)同一だったら無理。
0391デフォルトの名無しさん
2008/12/28(日) 18:08:190392デフォルトの名無しさん
2008/12/28(日) 18:14:170393デフォルトの名無しさん
2008/12/28(日) 18:26:080394デフォルトの名無しさん
2008/12/28(日) 19:22:38char 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行の表示が違うのは何故なのですか?
0395デフォルトの名無しさん
2008/12/28(日) 19:35:39printf("%d, %d\n", sizeof(b[0]), sizeof(c[0])); とかやって、結果を見ると思いつくかも。
0396デフォルトの名無しさん
2008/12/28(日) 19:50:00&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進んだアドレス値
もういいや
0397デフォルトの名無しさん
2008/12/28(日) 20:02:58s/&(*(*((char *)c + sizeof(char *[7])*7) + sizeof(char *)*7))/&(*(((char *)c + sizeof(char *[7])*7) + sizeof(char *)*7)/
0398デフォルトの名無しさん
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]);
}
0399デフォルトの名無しさん
2008/12/28(日) 20:22:06%cは1バイトの文字しか対応しないんだろ。
0400デフォルトの名無しさん
2008/12/28(日) 20:23:34ワイド文字版を使う
#include <wchar.h>
#include <locale.h>
int main(void)
{
wchar_t p[] = L"東京へ行きたい";
setlocale(LC_ALL, "");
wprintf(L"%lc\n", p[1]);
return 0;
}
0401デフォルトの名無しさん
2008/12/28(日) 20:39:57ありがとうございました。解決しました。
入門書何冊か探したけどこういう事は載ってないんですよね。
0402デフォルトの名無しさん
2008/12/28(日) 21:01:040403デフォルトの名無しさん
2008/12/28(日) 21:04:130404デフォルトの名無しさん
2008/12/28(日) 21:08:02そういえば自分は多バイト文字というものをどこで知ったんだろう…覚えてない
0405デフォルトの名無しさん
2008/12/28(日) 21:08:59特定の書籍を揶揄する気はないが、おまえさんの言う「本」てのは何のつもりだったのかね
0406デフォルトの名無しさん
2008/12/28(日) 22:59:37char a=100;
printf("%d",a);
とやれば100と出ます。
ですが、
char a;
scanf("%d",&a);
printf("%d",a);
とやるとscanfでうけとった数字たとえば33とかがうまく表示されないんですが
どうすればいいんですか?教えてください
0407デフォルトの名無しさん
2008/12/28(日) 23:00:540408デフォルトの名無しさん
2008/12/28(日) 23:07:290409デフォルトの名無しさん
2008/12/28(日) 23:08:39%d指定子はintへのポインタをとらなければいけない。
charへのポインタを指定したら間違いなくおかしなことになる。
整数をcharの変数に入れたいだけなら、intの変数に%dで
(あるいはshortの変数に%hdで)値を格納してからcharの変数に代入すること。
または、環境が許すなら%hhdを使うこと。
0410デフォルトの名無しさん
2008/12/28(日) 23:10:48現実には、0から255までのunsigned charとcharが同じ大きさということもよくある。
さらに、signedでも2の補数使って-128から127になるのが現在主流。
そもそも、8ビットより大きい可能性もあるが、今ではかなり珍しい。
0411デフォルトの名無しさん
2008/12/28(日) 23:15:090412デフォルトの名無しさん
2008/12/28(日) 23:17:10そんなふうに考えていた時代が俺にもありました
0413デフォルトの名無しさん
2008/12/28(日) 23:30:18(既存のメディアを扱うことを考えると)
char のビット数は簡単には変わらんだろうね。
0414デフォルトの名無しさん
2008/12/28(日) 23:53:37intでもshor intでもいったん代入して
char a;
int i;
scanf("%d",i);
a=i;
printf("%d",a);
これでもできましたshortでもできました。ありがとうございます。
ついでに、ビット長ってありますよね?
char 8ビットなどint 16または32
ビットってあんまりイメージわかないんですが。
ビットが大きくなっていれば小数点10桁など大きい数字を扱えるんですが。
ビットとかC言語をやる中で気にしなくてもいいんでしょうか?
0415デフォルトの名無しさん
2008/12/29(月) 00:04:25ビット数を気にしなくても組めるプログラムは多いが
気にした方がいいケースもある。
オーバーフローしそうな場合とか、
ビット演算すると計算が楽になる場合とか。
まあ、プログラマなら65536までの2の累乗を覚えて
16進数←→2進数変換を頭の中でできるようになっとけ。
0416デフォルトの名無しさん
2008/12/29(月) 00:07:402進法(binary)+桁(digit)=ビット(bit)となる。
~ ~~
3進数の桁を trit とか言ったりもする。
0418デフォルトの名無しさん
2008/12/29(月) 00:18:44なっとけなんて言うことないだろ。
言われなくたってどうせ嫌でも頭に入るさ。
0419デフォルトの名無しさん
2008/12/29(月) 00:21:220420デフォルトの名無しさん
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を表してるんでしょうか?詳しく教えてくださいお願いします
0421デフォルトの名無しさん
2008/12/29(月) 00:35:48んー、非常に大雑把な議論によると、計算機のビット数は2進よりも3進のほうがいい、という結論が得られています。
あるいは平衡3進法ということばもあります。
3進法は(すくなくとも理論の上では)多少なりとも意味があるので、よく目にするものだと思います。
一方4進法にさしたる意味はありません。
0422デフォルトの名無しさん
2008/12/29(月) 00:36:02printf の戻り値は出力した文字のバイト数。
大抵そんなもの使わないので無視してるだけの話。
0423デフォルトの名無しさん
2008/12/29(月) 00:38:04ネイピア数 e ≒ 2.7 に近いほど最良で、
2 よりは 3 の方が e に近いから、だっけか。
でも、回路は2進法の方が作りやすいんで、
結局2進法に軍配が上がるというところだな。
ビット演算も分かりやすいし。
0424デフォルトの名無しさん
2008/12/29(月) 00:42:16机上の空論だったんだろうか
0425デフォルトの名無しさん
2008/12/29(月) 00:57:48> あ、あとちなみに、関数の読み方などが理解不能なんですが
> それと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 ... 私もつかったことないや)
0426デフォルトの名無しさん
2008/12/29(月) 00:58:36多値変調のことも忘れないでくださいって話?
0427デフォルトの名無しさん
2008/12/29(月) 01:04:320428デフォルトの名無しさん
2008/12/29(月) 01:09:400〜3(笑)
0429デフォルトの名無しさん
2008/12/29(月) 01:10:52yacc とか
0430デフォルトの名無しさん
2008/12/29(月) 05:06:26・高度なRPG開発が可能な、完全無料のゲーム作成ツールです。
・製作者はなんと「モノリスフィア」やツクール2000でシルフェイド幻想譚などを製作した
SmokingWOLF氏だよ。
・雰囲気はRPGツクール2000に近い。RPGツクール2000で自作システムを作りこむ際に
不満だったところがいろいろ解消されていて、かなり自由度が高いです。ただし
その分初心者には難しいかも。すでにツクール2000で自作システムを組むのに
慣れた人やRPGツクールでは物足りないけどプログラミングはちょっとという方にお勧め。
・作成したゲームは自由に配布したり、コンテストに投稿することも可能。
また本ソフトを持たない人でもプレイ可能!ファイル暗号化も完備してるよ!
・要望、不満点、バグ報告などなど書き込みお願いします。今もどんどん進化中です。
・それとマップやキャラなどのドット素材もじゃんじゃん募集中ですので
一度サイトにお越しくださいませ。
・このツールで作ったゲームをサイトで紹介してるから、ダウンロードしてどういう
ゲームが作れるのか見てみてね。
2ちゃん本スレ
http://pc11.2ch.net/test/read.cgi/gamedev/1229261856/l100
0431デフォルトの名無しさん
2008/12/29(月) 11:09:38たとえば2chのスレ等の特定の言葉を集計、カウントしたり
画像掲示板の画像を自動で集めたりみたいなWeb上で動作するものを作ってみたいです。
OSはXP、数年まえに手書きでへぼいHP作ったり、JAVAで画像表示とかで少し遊んだ経験のみです。
おおすめの言語がありましたらご教授お願いします
0432デフォルトの名無しさん
2008/12/29(月) 11:12:11Rubyがいいんじゃないかな。Rubyスレで聞いてみな。
0433デフォルトの名無しさん
2008/12/29(月) 11:31:57これを、for文で hを1から限りなく0にしていくときの計算結果を
表示させるプログラムを作りましたけど、
いきなり最初の答えが間違ってしまいます。
hに1を代入して計算させても、「2」にならず、「inf」とか表示されてしまいます。
使っている変数宣言は 全てdouble で、コンパイラはgcc です。
教えてください。お願いします。
0434デフォルトの名無しさん
2008/12/29(月) 11:35:210435デフォルトの名無しさん
2008/12/29(月) 11:40:280436デフォルトの名無しさん
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;
}
以上、よろしくお願い致します。
0437デフォルトの名無しさん
2008/12/29(月) 12:05:59+ double ans(double h)
0438デフォルトの名無しさん
2008/12/29(月) 12:09:29ans()の引き数の型を指定しておけばいいのに。
0439デフォルトの名無しさん
2008/12/29(月) 12:16:45修正したところ、計算されました。
printfの書式の扱いもまだ不慣れで fとgの違いもよく分からないですけど、
調べてみます。ありがとうございました。
0440デフォルトの名無しさん
2008/12/29(月) 12:20:290441デフォルトの名無しさん
2008/12/29(月) 12:42:58あざーす。rubyいじってきます。
0442431
2008/12/29(月) 12:55:190443デフォルトの名無しさん
2008/12/29(月) 12:55:44何もしなくても符号がつきますよね?符号がつかないコンパイラだけ必要っていみですか?singedは?
short intも intかlong intを使えば良いのに。
詳しく教えてください
0444デフォルトの名無しさん
2008/12/29(月) 13:06:100445デフォルトの名無しさん
2008/12/29(月) 13:14:27signedだと(主に最上位の)1ビットが符号付きかそうでないかに使われるじゃん?
1ビット分違うだけで表せる幅が倍になるよね、多分。
0446デフォルトの名無しさん
2008/12/29(月) 13:29:37charだけは何もしない場合にsignedになるかunsignedになるかが環境に依存する
変数のサイズについてはメモリ効率に関する選択の問題
0447394
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バイトにキャストしなければならないのですね?
何でこれが間接参照演算子*でできるのでしょうか。
どうも私自身間接参照演算子についての理解が足りないようです。
ご教示お願いします。
0448デフォルトの名無しさん
2008/12/29(月) 15:06:032バイト事に扱いたい場合とかもあるんだぜ。
0450デフォルトの名無しさん
2008/12/29(月) 15:15:07signed というキーワードは signed char 以外では特に指定する意味がない。
char に関しては >>446 なので、符号つきであることを保証したい場合には付けないといけない。
0451デフォルトの名無しさん
2008/12/29(月) 15:28:07cf.
static signed foo;
struct {
signed bar:2;
};
0452デフォルトの名無しさん
2008/12/29(月) 16:48:27構造体のサイズを気にしない場合は
int と書くことに大した意味がなかったりするから、
signed/unsigned とだけ書く事があるね。
struct hoge {
signed a : 4;
unsigned b : 1;
unsigned b : 3;
};
0453デフォルトの名無しさん
2008/12/29(月) 16:49:240454デフォルトの名無しさん
2008/12/29(月) 18:55:29一冊2万5000円とかおちょくってるの?ねぇ
0455デフォルトの名無しさん
2008/12/29(月) 18:57:330456デフォルトの名無しさん
2008/12/29(月) 18:58:050457デフォルトの名無しさん
2008/12/29(月) 18:59:22なんていう名前の本?
0458デフォルトの名無しさん
2008/12/29(月) 19:01:37アルゴリズム辞典
0459デフォルトの名無しさん
2008/12/29(月) 19:04:36本当だ…なんか一桁多いなぁ…それだけの内容ってことか?
0460えびふらみ
2008/12/29(月) 19:10:230461デフォルトの名無しさん
2008/12/29(月) 19:11:100462デフォルトの名無しさん
2008/12/29(月) 20:43:030463デフォルトの名無しさん
2008/12/29(月) 20:48:54広い範囲のアルゴリズムが載っているからだとおも
海外とかだと、もっと安いのかな、
0464デフォルトの名無しさん
2008/12/29(月) 21:27:36風来のシレン関係?アスカ?
0465デフォルトの名無しさん
2008/12/29(月) 21:43:57さらに変数の共有を行うために、異なる関数(分割前は一つだった)で共有したい変数は
全てグローバル変数にしました。
そのため別にヘッダーファイルを作成し、インクルードするなどしています。
なんだかややこしい方法を取ってる気がするのですが、これでいいのでしょうか?
0466デフォルトの名無しさん
2008/12/29(月) 21:49:06ttp://www.nist.gov/dads/
これならタダ。
0467デフォルトの名無しさん
2008/12/29(月) 21:49:29変数を共有するような分割は変だと思う
0468デフォルトの名無しさん
2008/12/29(月) 21:53:19よくない。
結合度と凝集度でぐぐれ。
あと、複数の関数で共有するデータは、構造体へのポインタで持ち回れ。
(例: fprintf等のf系の関数。「FILE *」でデータを共有している)
グローバル変数だと誰が何処で書き換えるかわかったもんじゃないし、
マルチスレッド化すると破綻する。
0469デフォルトの名無しさん
2008/12/29(月) 22:00:260470デフォルトの名無しさん
2008/12/29(月) 22:04:32そもそも何10階層も呼ぶ設計がおかしい
0471デフォルトの名無しさん
2008/12/29(月) 22:05:11それが構造体なんてこともよくある話。
その構造体の中にその変数があれば、
受け渡しのコストはそもそも存在しない。
0472デフォルトの名無しさん
2008/12/29(月) 22:05:53あんまグローバル変数にしても高速化が見込めない可能性もある。
0473デフォルトの名無しさん
2008/12/29(月) 22:11:32mainのローカル変数にしてアクセス用の関数を作ったほうがいいの?
0474デフォルトの名無しさん
2008/12/29(月) 22:17:460475デフォルトの名無しさん
2008/12/29(月) 22:20:540476デフォルトの名無しさん
2008/12/29(月) 22:32:37広範囲で使うデータをグローバル変数にして、マルチスレッド化や
マルチインスタンス化するときに痛い目に遭ってるのをしばしば
見掛ける。
0477デフォルトの名無しさん
2008/12/29(月) 22:34:240478デフォルトの名無しさん
2008/12/29(月) 22:40:26マルチスレッドとかなら利点がわかるんだけど標準のコード書いてるときに利点がわからない
0479デフォルトの名無しさん
2008/12/29(月) 22:45:51セレクタのことだろ。
0480デフォルトの名無しさん
2008/12/29(月) 22:45:54C++でいうprivateメンバにアクセスするpropertyみたいなもん
0481デフォルトの名無しさん
2008/12/29(月) 22:49:520482デフォルトの名無しさん
2008/12/29(月) 22:55:38グローバル変数の実体は1個しか存在しない
別々のことやってるスレッドで1個の変数を共有したらどうなると思う?
そんでそれを回避するためにローカル変数に直して、
それを各関数に受け渡す仕組みを作り直す手間がどれくらいあると思う?
0483デフォルトの名無しさん
2008/12/29(月) 22:59:35それよりもっと一般的なグローバル変数の弊害を考えろよ
0484デフォルトの名無しさん
2008/12/29(月) 23:07:57マルチスレッド化を考えないことは必ずしも馬鹿ではないだろうが
常に考えることは間違いなく馬鹿ではないよ
手間でないと思うならそれは君が大規模なプログラムを組んだことがないだけだろう
0485デフォルトの名無しさん
2008/12/29(月) 23:09:09どこからでも扱えて、何か起こった時のデバッグ範囲が広大になることだな。
0486デフォルトの名無しさん
2008/12/29(月) 23:10:02そりゃ大規模なプログラムなら全体かかる修正は何でも大変だろww
0487デフォルトの名無しさん
2008/12/29(月) 23:13:130488デフォルトの名無しさん
2008/12/29(月) 23:13:490489デフォルトの名無しさん
2008/12/29(月) 23:16:25マルチスレッド化にからむ話とそれ以外をわけて考えてるのがおかしい
0490デフォルトの名無しさん
2008/12/29(月) 23:18:05ローカルなら、エディタ画面でおさまる範囲に書いてあるけど。
0491デフォルトの名無しさん
2008/12/29(月) 23:19:02そんなことはないぞ・・・。
もしそういう状況になってるのだとしたら、
それはお前のプログラムの組み方が悪い。
0492デフォルトの名無しさん
2008/12/29(月) 23:20:040493デフォルトの名無しさん
2008/12/29(月) 23:26:29autoっていう修飾子あるじゃないですか
あれを明示してるひとって見たことありますか?
0494デフォルトの名無しさん
2008/12/29(月) 23:27:28errnoみたいな伝統的に使われてるものもある。
なんか「グローバル変数=悪」って思い込んでるのかもしれないけど
うまく使えば、プログラムをシンプルに出来る
うまく使えば、プログラムを高速にできる
うまく使う方法を議論する方が建設的
0495デフォルトの名無しさん
2008/12/29(月) 23:28:20値をいれるのはここだけ、あとはみんな参照、くらいでとどめておきたいのですが、ね。
0496デフォルトの名無しさん
2008/12/29(月) 23:28:26autoは記憶クラスです。修飾子ではありません。
0497デフォルトの名無しさん
2008/12/29(月) 23:31:27そうなんですか
すいませんでした
0498デフォルトの名無しさん
2008/12/29(月) 23:37:27errnoがグローバル変数とは限らない。
少なくともWindowsや最近のUNIX系OSは軒並スレッド毎に固有。
0499デフォルトの名無しさん
2008/12/29(月) 23:44:58もちろん知ってるよ
UNIXのマルチスレッド対応時に真っ先に問題になる部分だからね
0500デフォルトの名無しさん
2008/12/30(火) 00:25:420501デフォルトの名無しさん
2008/12/30(火) 00:43:060502デフォルトの名無しさん
2008/12/30(火) 00:56:14全体に影響があらざるを得ないレベルの修正は確かに大変だが、
全体に影響を与えるようなことが起こりにくいように作ることは可能だよね
0503デフォルトの名無しさん
2008/12/30(火) 00:58:53ある程度の構成は決めるけど、細かいところまでは決めないで作り始めてるよ。
大枠から作っていくというか。
プロの人に限らず、経験を積めば道を大きくそれることなく進めていけるようになるし。
0504デフォルトの名無しさん
2008/12/30(火) 00:59:30そういう方法論もある
最近だと「あらかじめ完璧な設計を用意するなんて無理だろ」という前提に立って
コードを書きつつ柔軟に設計を変更する開発手法も出てきている
0505デフォルトの名無しさん
2008/12/30(火) 01:01:330506デフォルトの名無しさん
2008/12/30(火) 01:07:19設計書にもレベルがあってですね。
ここは譲れないというものから、大枠は決めて後はどうぞというものまで。
あまりガチガチにやっちゃうと工数ばかりがかかってなかなか進まない、
適当過ぎると最初の進捗は良好だけどなかなか終わらない。
まあ、そのへんのさじ加減がむつかしい。
0507デフォルトの名無しさん
2008/12/30(火) 01:37:55見た事無い。
0508デフォルトの名無しさん
2008/12/30(火) 01:40:33Cでautoなんて書く馬鹿はいないだろ。電力の無駄遣い。
0509デフォルトの名無しさん
2008/12/30(火) 01:42:44autoの意味を最近変えようとしてる。
だから、C言語ではauto使わなくても将来的にはautoを使うコードってメジャーになるんだろうなぁ
0510デフォルトの名無しさん
2008/12/30(火) 02:13:34予約語の意味かえるなんてそうそうできることじゃなし。
0511デフォルトの名無しさん
2008/12/30(火) 02:27:35うちは背景色よりも前景色の方が輝度低いのでautoと書くべきなのか。エコ的に
0512デフォルトの名無しさん
2008/12/30(火) 02:28:070513デフォルトの名無しさん
2008/12/30(火) 02:54:21register は古いプログラムでは使われてることもあるが、
auto は本当に役立たず。
そのおかげで C++0x では貴重な予約語をゲットできたわけであるが。
0514デフォルトの名無しさん
2008/12/30(火) 02:57:450515デフォルトの名無しさん
2008/12/30(火) 04:13:22それで問題なく通じればいいか。
0516デフォルトの名無しさん
2008/12/30(火) 04:39:07alt ← あると
0517デフォルトの名無しさん
2008/12/30(火) 04:40:04char ← ちゃー
stdio ← すたじお
0518デフォルトの名無しさん
2008/12/30(火) 04:45:22alt[ernative]
m[emory]alloc
char[actar]
st[andar]d io
0519デフォルトの名無しさん
2008/12/30(火) 04:47:03これをさらに略されても逆に困る
あうとと読んでもドイツ人にはすんなりかもしれない
0520デフォルトの名無しさん
2008/12/30(火) 05:14:232番目、ふざけて書いたつもりなんだろうけど
本気でcharを「キャラ」とか読んでるとしたら大笑いだぞ。
ネイティブの人は普通に「チャー」等と発音して、「キャラ」なんて言う人居ないから。
charがチャーじゃなくてキャラだとしたら
intはイントじゃなくてインテと発音して
macはマックじゃなくてマクドと発音してるんだよな。
0521デフォルトの名無しさん
2008/12/30(火) 05:17:240522デフォルトの名無しさん
2008/12/30(火) 05:19:05イントとインテがどうとかとかアホだろ、本来なら母音つかねーから無意味な話だろwwww
0523デフォルトの名無しさん
2008/12/30(火) 05:19:50http://www.kouno.jp/home/c_faq/c20.html#39
なお、一部、通常の3倍のアクセス速度を求めたい場合のみ
別の読み方も許される模様。
0524デフォルトの名無しさん
2008/12/30(火) 05:23:56もしかして>>517に言ってる?
0525デフォルトの名無しさん
2008/12/30(火) 05:26:23その母音が付かない「charの発音の仕方」が、C FAQにすら載ってるんだけど>>523
0526デフォルトの名無しさん
2008/12/30(火) 05:30:410527デフォルトの名無しさん
2008/12/30(火) 05:32:150528デフォルトの名無しさん
2008/12/30(火) 05:33:250529デフォルトの名無しさん
2008/12/30(火) 05:33:560530デフォルトの名無しさん
2008/12/30(火) 05:40:080531デフォルトの名無しさん
2008/12/30(火) 05:47:36厭世家気取りの厨二病患者だって
ばっちゃが言ってた!
0532デフォルトの名無しさん
2008/12/30(火) 05:54:090533デフォルトの名無しさん
2008/12/30(火) 06:02:170534デフォルトの名無しさん
2008/12/30(火) 06:05:59ばーか
0535デフォルトの名無しさん
2008/12/30(火) 06:10:290536デフォルトの名無しさん
2008/12/30(火) 06:11:28マクドと聞くとMcDonald'sが想起されるわけだが
0537デフォルトの名無しさん
2008/12/30(火) 11:52:43あったとしてもJavaのパクリですよね^^
0538デフォルトの名無しさん
2008/12/30(火) 12:18:000539デフォルトの名無しさん
2008/12/30(火) 12:21:310540デフォルトの名無しさん
2008/12/30(火) 12:42:370541デフォルトの名無しさん
2008/12/30(火) 12:50:510542デフォルトの名無しさん
2008/12/30(火) 13:22:320543デフォルトの名無しさん
2008/12/30(火) 13:36:210544デフォルトの名無しさん
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);
0545デフォルトの名無しさん
2008/12/30(火) 14:13:08switch(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;}
0546デフォルトの名無しさん
2008/12/30(火) 14:15:32「333」や「55555」だと
zero zero zero
zero zero zero zero zeroとなりますが、
「1」や「5」だと
one zero
five zero
となります。
NULL文字が悪さしているような気もするのですが、どこがおかしいのでしょうか?
0547デフォルトの名無しさん
2008/12/30(火) 14:19:09printf(" %d %d ", data[0], data[1]);
0548デフォルトの名無しさん
2008/12/30(火) 14:23:15ありがとうございます。
data[0]に「333」の数値ごとは入っていたわけですね。
ちょっと改良してみます!
0549546
2008/12/30(火) 14:39:30「500」
このような数値を1つずつ、各要素に配るにはどうすればいいのでしょう?
0550デフォルトの名無しさん
2008/12/30(火) 14:45:090551デフォルトの名無しさん
2008/12/30(火) 15:27:36各桁をバラすってこと?
int n = 500;
data[0] = n % 10;
data[1] = n / 10 % 10;
data[2] = n / 100 % 10;
0552デフォルトの名無しさん
2008/12/30(火) 15:35:41まあ数値を文字列にするのはitoa、、、いや
char data[xxx];
sprintf(data, "%d", n);
とか。
0553デフォルトの名無しさん
2008/12/30(火) 18:45:190554デフォルトの名無しさん
2008/12/30(火) 20:12:54重回帰分析やらのプログラムを高卒プログラマが組める事は少ないですよ。
組めない人は絶望して下さい
あなたは理系ですらない底辺IT奴隷ウィッシュ☆
0555デフォルトの名無しさん
2008/12/30(火) 20:30:500556デフォルトの名無しさん
2008/12/30(火) 22:00:450557デフォルトの名無しさん
2008/12/30(火) 22:04:130558デフォルトの名無しさん
2008/12/30(火) 22:06:58学歴の一例として挙げただけだろう。理解しようとなんか考えなくていいと思う。
0559デフォルトの名無しさん
2008/12/30(火) 22:20:25コピペじゃないだろ、ググれ
0560デフォルトの名無しさん
2008/12/30(火) 22:36:090561デフォルトの名無しさん
2008/12/30(火) 22:47:33あるだろう。
携帯でもアプリはJavaだけど、ドライバーはCで作ってあるんじゃないの?
あとは通信ソフトとかかな。
0562デフォルトの名無しさん
2008/12/30(火) 22:48:51どれだけC++の機能を使えるんだか知らないけど。
0563デフォルトの名無しさん
2008/12/30(火) 22:54:21Cのみというケースは、あるとすればクロス系の組み込みソフトかな?
0564デフォルトの名無しさん
2008/12/30(火) 23:05:280565デフォルトの名無しさん
2008/12/30(火) 23:12:350566デフォルトの名無しさん
2008/12/30(火) 23:21:500567デフォルトの名無しさん
2008/12/30(火) 23:25:00ある客先には一応根拠を聞いてみたんだ。
・内製ライブラリはC++対応していない。
# extern "C"でC++から使えると言う発想はないらしい。
・OS間でコンパイラの互換性がないのでSTLは使えない。
# 何故かターゲットOSにHP-UXがあり、何故かバージョンアップできないらしい。
・C++でnewやテンプレートを使う程度なら、Cでも同じことができる。
# と、何故か信じ込んでいる。
あるプログラムが余りに無駄な処理をしているから、たまたま手元にC++で
同等の処理をするプログラムがあったので「使いませんか?」と提案したら、
「C++の保守をする気はないんで、Cに書き換えるなら採用します」と来たもんだ。
挙句、「なんで最初からCで書かないのか理解に苦しみます」と言われるに至って、
これはもう、何を言っても無駄だと悟りましたよもう。
0568デフォルトの名無しさん
2008/12/30(火) 23:28:16胸張って「C++使えます」と言える人は
「C使えます」という人よりずっと少ない
0569デフォルトの名無しさん
2008/12/30(火) 23:36:42日本の情報技術のレベルを落としてるのは間違いないよな。
0570デフォルトの名無しさん
2008/12/30(火) 23:38:32誰か言ってたなあ
0571デフォルトの名無しさん
2008/12/30(火) 23:43:01そんなだから失敗案件増やして会社が傾くんだ。
0572デフォルトの名無しさん
2008/12/30(火) 23:43:310573デフォルトの名無しさん
2008/12/30(火) 23:44:140574デフォルトの名無しさん
2008/12/31(水) 00:01:04任意のノードを検索する際に検索を高速化しようと思っているのですが、
ファイル分割をする際にどのような分割をすればよいでしょうか
リスト処理と配列処理(ノードへのポインタ追加や削除など)をソースファイルごとに別にすべきでしょうか
それともリストに内包される処理として、リスト処理関数の内部にそのまま実装すべきでしょうか?
0575デフォルトの名無しさん
2008/12/31(水) 00:09:29ファイルとソースファイルはそれぞれ何を指してて、リストと配列との関係は何なの?
0576デフォルトの名無しさん
2008/12/31(水) 00:20:35list.c
addlist() {...}
dellist() {...}
0577デフォルトの名無しさん
2008/12/31(水) 00:29:010578デフォルトの名無しさん
2008/12/31(水) 00:31:021000か1024なら理解できるけど、俺は本筋でないから黙っていようと思ったのに。
0579デフォルトの名無しさん
2008/12/31(水) 00:40:29list処理と配列処理自体をそれぞれ独立させ、それらをまとめる処理関数を作るべきか
list処理内部でごっちゃで実装してしまうか
図で表すと
インターフェース(以下二つの緒�揩ワとめた鰹�揩ワとめた滑O部へ公開する滑ヨ数)
リスト.c-|-配列.c
または
配列をそのまま組み込んだリスト.c
0580デフォルトの名無しさん
2008/12/31(水) 00:42:210581デフォルトの名無しさん
2008/12/31(水) 00:45:11データ 1020 バイト+ポインタ 4 バイト = 1024 バイトだと思うが。
0582デフォルトの名無しさん
2008/12/31(水) 00:47:100583デフォルトの名無しさん
2008/12/31(水) 00:48:550584デフォルトの名無しさん
2008/12/31(水) 01:22:05配列をそのまま組み込んだリスト.c
のほうが100倍よい。
0585デフォルトの名無しさん
2008/12/31(水) 02:19:13意味わからん
それがどうして1020ノードになる
0586デフォルトの名無しさん
2008/12/31(水) 02:20:110587デフォルトの名無しさん
2008/12/31(水) 02:28:58不可分ならまとめて作れ
個別で使う可能性があるなら個別に作れ
それくらいしか言えんよ
0588デフォルトの名無しさん
2008/12/31(水) 23:42:41よろしくお願いします。
0589デフォルトの名無しさん
2008/12/31(水) 23:48:14int での検出はアセンブラ使わないと不可能なので、
C では計算前にこの計算をしたらオーバーフローになるかどうかを
予めチェックするしかない。
0590221
2009/01/01(木) 00:05:39今年もご指導もほど宜しくお願いします。
0591デフォルトの名無しさん
2009/01/01(木) 00:33:35関数に、引数にポインタ変数として渡し、アクセスするのでは
速度的にどれくらい違うのでしょうか。
0.01msec単位で速度を詰めたいのですがどっちがいいのか
判断つきません。
0592デフォルトの名無しさん
2009/01/01(木) 00:34:360593デフォルトの名無しさん
2009/01/01(木) 00:34:49大丈夫、0.1ms以上の桁で改善できる項目なんてほかにいくらでも湧いて出てくる。
0594デフォルトの名無しさん
2009/01/01(木) 00:38:31実測してみないと何とも言えない。
0595588
2009/01/01(木) 00:42:12早速回答ありがとうございます。
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;
}
0596デフォルトの名無しさん
2009/01/01(木) 00:47:290597デフォルトの名無しさん
2009/01/01(木) 00:49:490とか負とか考えると不十分やね。
64ビット型が使えるならこういう方法もある。
#include <stdint.h>
int64_t n = (int64_t)a * b;
if (n < INT_MIN || n > INT_MAX) {
// オーバーフロー
}
stdint.h がない場合も、long long か __int64_t あたりが使えるんじゃないかな。
0598588
2009/01/01(木) 00:53:20しょぼいコードですみません。ゼロ除算のチェック以外は、だいたいこんな感じでいいんでしょうか?
どういう感じで書くのが、int型のオーバーフローチェックの一般的な書き方なのか分からなくて・・・
0599デフォルトの名無しさん
2009/01/01(木) 01:02:13if (c / a != b) {
/* オーバーフロー */
}
これでいいんじゃね。
0600デフォルトの名無しさん
2009/01/01(木) 01:11:16計算の元となる数字に上限下限を設定して(入力データ仕様というやつ)
各々の数字の入力時に範囲チェックを行い、範囲外ならハジくのが普通かな?
もちろん範囲内の数字なら、プログラムで行われるすべての計算でオーバーフローは発生しないという
保障をする必要がある
0602デフォルトの名無しさん
2009/01/01(木) 01:14:43プログラム内で発生しうる値の大きさをちゃんと把握しておけと
0603デフォルトの名無しさん
2009/01/01(木) 01:28:32だから 0 の場合を(ry
if (a != 0 && c / a != b) {
/* オーバーフロー */
}
だな。
a が 0 なら必ずオーバーフローしないのでこれで問題は無い。
0604デフォルトの名無しさん
2009/01/01(木) 11:02:550605デフォルトの名無しさん
2009/01/01(木) 11:11:070606デフォルトの名無しさん
2009/01/01(木) 11:42:35int main(void)
{
char i[80];
int a;
for(a=0; (i[a]=getchar())!='\n'; a++){
printf("%c",i[a]);
}
return 0;
}
0607デフォルトの名無しさん
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])などとやってもだめでした
表示のやり方教えてください。
0608デフォルトの名無しさん
2009/01/01(木) 22:02:18printf("%3d",test[i][j]);
を
printf(j == 1? "%3d|": "%3d",test[i][j]);
に変更する。
0609デフォルトの名無しさん
2009/01/01(木) 22:07:48ありがとうございます。
そのif文がprintfの中でも使えるとは、思ってもいませんでした。
? 真:偽ですよね!本当にありがとうございました。
0610デフォルトの名無しさん
2009/01/01(木) 22:15:050611デフォルトの名無しさん
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;
}
0612デフォルトの名無しさん
2009/01/01(木) 22:39:21まさにそんな感じです
とても参考になります
ありがとうございました。
0613デフォルトの名無しさん
2009/01/01(木) 23:01:3532bitだとintは4バイトですか? 32/8=4
32bitだとメモリは4GBまでつめるってことですか?
求める公式がいまいちなんですが32bitを8bitでわればメモリ4GBが求まるってことでしょうか?
公式の出し方知ってる人おしえてください。
64bitは8GBですよね?
0614デフォルトの名無しさん
2009/01/01(木) 23:02:53book 本
...
のように英単語とその訳語が並んでいる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が起きてしまいます。
自前の関数は他の所では使えているので、ファイルの読み込みのあたりでエラーが出ているのだと思うのですが、どこらへんが悪いのでしょうか・・・?
0615デフォルトの名無しさん
2009/01/01(木) 23:16:08index, data を適当に
char index[255], data[255];
などと確保しておく必要がある。
0616デフォルトの名無しさん
2009/01/01(木) 23:18:34ビットは2進法での桁を表す言葉。
2進法(binary)+桁(digit)=ビット(bit = b + it) という風にして作られた造語。
~ ~~
例えば2進数 1010011 は7桁あるので7ビット。
ただ、ビット単位でデータを扱うのはサイズが細かすぎて不便なので、
普通は数ビット1かたまりでデータを扱う。
その最小単位がバイト(byte)。
コンピュータが一度に「口に入れられる」(扱える)単位ということで、
噛む(bite)になぞらえてバイト(byte)と名付けられた。
そういうわけなので、コンピュータによってバイトのサイズは異なるわけだが、
今のコンピュータでは1バイト=8ビットなものが多い。
積めるメモリの上限は OS によって異なる。
例えば 32ビット版の Windows XP は 3GB までのメモリしか使えない。
単に OS の制限であって、法則とかはない。
0617デフォルトの名無しさん
2009/01/01(木) 23:23:44>>616
>単に OS の制限であって、法則とかはない。
OSの制限はあるけど、法則ないというわけじゃないんじゃない?
32bit System
2^32 = 2^2 * 2^30 = 4G
64bit System
2^64 = ... (単位考えるのメンドクサイから省略)
とりあえず「メモリ空間」とか「アドレス空間」とかでググってみるといいかも
0618デフォルトの名無しさん
2009/01/01(木) 23:31:171バイト=8bitってことは
32ビットマシンは4バイトを一度に処理できるってことですか?
0619デフォルトの名無しさん
2009/01/01(木) 23:39:1716ビットシステムでも1GB扱えるわけで。
今のセグメントの扱いだと4GB超えられないのは確かだが、
それも単にCPUをそういう風に作ってしまったからというだけで、
32ビットのシステムだから4GBを超えられないというわけでもない。
0620デフォルトの名無しさん
2009/01/01(木) 23:40:00×1GB
○1MB
もう単位の感覚があの頃と変わってしまっているね。
0621デフォルトの名無しさん
2009/01/01(木) 23:41:53そういうこと。
まあ、一度に処理できるというか、
4バイトを1つの数値として扱えるというか。
ただ、4バイトを一度に処理できるけども、
1バイト単位で処理することもできる。
0622デフォルトの名無しさん
2009/01/01(木) 23:46:360623デフォルトの名無しさん
2009/01/01(木) 23:50:48「一定時間毎にあるデータが任意のフォルダに保存される状況の下、データが保存される度にその保存されたデータに対してある処理を行う」
というようなことを行わせることは可能ですか?
可能な場合、どういう風にすれば出来ますかね?sleep命令とか?
0624デフォルトの名無しさん
2009/01/01(木) 23:56:16別の OS でも似たようなものはあるかもしれないが、俺は知らない。
まあ、どちらにしろ対象 OS のスレに行った方がいい気がする。
0625デフォルトの名無しさん
2009/01/02(金) 00:15:59inotifyでぐぐれよウンコ野郎
0626デフォルトの名無しさん
2009/01/02(金) 00:33:28>>625
そういうAPIがあるんですね。
出来そうな気がしてきました。色々調べてみます。
ありがとうございました。
0627デフォルトの名無しさん
2009/01/02(金) 00:36:24いまいちうまくいきません
typedef struct _list
{
int data;
list *next;
list *prev;
}list;
#define list_for_each()
この先どうしたらいいのでしょうか
0628デフォルトの名無しさん
2009/01/02(金) 00:48:43制御構文を変更する類いのマクロは
混乱を来す要因になる。
0629デフォルトの名無しさん
2009/01/02(金) 00:54:19なんとかしてくださいよ助けてくださいよ
もうかれこれ50回ぐらい書いてる
0630デフォルトの名無しさん
2009/01/02(金) 00:56:550631デフォルトの名無しさん
2009/01/02(金) 01:00:18for(list_for_each_p=sp; list_for_each_p!=ep; list_for_each_p=sp->next) \
list_for_each_p->fn(); \
}while(0)
0632デフォルトの名無しさん
2009/01/02(金) 01:00:53for(list_for_each_p=sp; list_for_each_p!=ep; list_for_each_p=list_for_each_p->next) \
0633デフォルトの名無しさん
2009/01/02(金) 01:10:12fn(list_for_each_p);
0634デフォルトの名無しさん
2009/01/02(金) 01:32:16typedef struct _list list;
struct _list {
...
list *prev;
};
とかじゃないとコンパイルエラーにならね?
0635デフォルトの名無しさん
2009/01/02(金) 01:34:300636デフォルトの名無しさん
2009/01/02(金) 02:25:020637デフォルトの名無しさん
2009/01/02(金) 02:41:06放っといてくれよ。
0638デフォルトの名無しさん
2009/01/02(金) 05:09:06したいのですが、できませんので、助言お願いします。
for文の中でif(b==100) までわかりました。
0639デフォルトの名無しさん
2009/01/02(金) 07:14:47if(b==100) break;
0640デフォルトの名無しさん
2009/01/02(金) 07:23:180641デフォルトの名無しさん
2009/01/02(金) 07:52:52>>639の方が正解だろ。
0642デフォルトの名無しさん
2009/01/02(金) 08:00:24正解と言えるけど、比較して〜の方がと決め付けるのはどうかと。
0643デフォルトの名無しさん
2009/01/02(金) 08:15:340644デフォルトの名無しさん
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?"_":"_");などとやってもできませんし
教えてください。
0645デフォルトの名無しさん
2009/01/02(金) 11:25:300646デフォルトの名無しさん
2009/01/02(金) 13:32:00- か ~ を使えばいいんじゃない?
全角文字使えるなら  ̄ でいいだろうけど。
0647デフォルトの名無しさん
2009/01/02(金) 13:41:140648デフォルトの名無しさん
2009/01/02(金) 15:52:14for (;;)
このセミコロン2回にはどういう意味があるんでしょうか.
H8マイコンのプログラムソースにこのような"for"の使い方がされていて
いるのですが,どういう処理がされているのか分かりません.
よろしくお願いします.
0649デフォルトの名無しさん
2009/01/02(金) 15:54:31それぞれの部分は必要ないなら省略することが可能。
全部省略すると for(;;) になる。
この場合、無限ループになる。
0650デフォルトの名無しさん
2009/01/02(金) 15:58:39なるほど,ありがとうございます
0651デフォルトの名無しさん
2009/01/02(金) 15:58:56forの2番目のところを省略すると、常に真と解釈されるので、無限ループになる。
H8は関係なくC言語の規則な。
0652デフォルトの名無しさん
2009/01/02(金) 16:06:40#define EXAM 4294967295 みたいにするほかないんでしょうか?
#defineのところで関数をうまく使ってその場で計算して定義するようなことってできないでしょうか?
0653デフォルトの名無しさん
2009/01/02(金) 16:09:580654デフォルトの名無しさん
2009/01/02(金) 16:17:310655デフォルトの名無しさん
2009/01/02(金) 16:22:5832bit環境用
(~0U)
64bit環境用
((1<<32)-1)
どっちでも用
0xFFFFFFFF
(~(~0<<32))
0656デフォルトの名無しさん
2009/01/02(金) 16:27:120657デフォルトの名無しさん
2009/01/02(金) 16:38:250658デフォルトの名無しさん
2009/01/02(金) 17:01:10使い分けが知りたいんですが……
0659デフォルトの名無しさん
2009/01/02(金) 17:08:150660デフォルトの名無しさん
2009/01/02(金) 17:16:450661デフォルトの名無しさん
2009/01/02(金) 17:17:370662デフォルトの名無しさん
2009/01/02(金) 17:26:01「線形リスト」の作成とか
0663デフォルトの名無しさん
2009/01/02(金) 17:30:04構造体が小さければ、戻り値で返してもいいんじゃないかな。大きければ引数に構造体のポインタで返せばいいんじゃないかな
0664デフォルトの名無しさん
2009/01/02(金) 17:45:08<<32 をしても何も起きない32ビットCPUもあるだろう。
0665デフォルトの名無しさん
2009/01/02(金) 18:02:23実行時に計算が行われるようなマクロは、その結果が実行時に変化する場合にだけ意味がある。
素直に数値を計算して叩きこむこと。
0666デフォルトの名無しさん
2009/01/02(金) 18:05:58コンパイル時に計算が行われるようなマクロをすっとばして
自分で計算するなよwww
0667デフォルトの名無しさん
2009/01/02(金) 21:16:41自分のPCはWindowsだから家で復習とかが出来ません
windowsでもc言語を勉強できるようなソフトはないんでしょうか?
0668デフォルトの名無しさん
2009/01/02(金) 21:18:520669デフォルトの名無しさん
2009/01/02(金) 21:20:45この3級合格できそうなんですが。
みなさんは2級とか楽に合格できますか?
ここの人ならできそうな気がします。
0670デフォルトの名無しさん
2009/01/02(金) 21:23:340671デフォルトの名無しさん
2009/01/02(金) 21:25:09一級できてもたいしたことないレベル
0672デフォルトの名無しさん
2009/01/02(金) 21:26:09宿題スレにきていただければいいかと。まれに神が光臨します。
0673デフォルトの名無しさん
2009/01/02(金) 21:36:432級は500行以上のコード書くんですよ?
1級なんてすごい難しい気がします
0674デフォルトの名無しさん
2009/01/02(金) 21:37:14今日も朝から暴れてたし。
0675デフォルトの名無しさん
2009/01/02(金) 21:39:03仕事だと500行はあっという間に超えてしまうから安心してください。
0676デフォルトの名無しさん
2009/01/02(金) 21:42:14レベルとしては1級であっても
基礎的なことは習得しました
ぐらいなんだと思ってください
0677デフォルトの名無しさん
2009/01/02(金) 21:45:460678デフォルトの名無しさん
2009/01/02(金) 21:46:000679デフォルトの名無しさん
2009/01/02(金) 21:52:37VirtualBox, VMware, VirtualPC
↑
このへんぐぐってみれ
Windows上の1アプリとして学校とそっくり同じ環境が作れる
0680デフォルトの名無しさん
2009/01/02(金) 23:53:51N-BASIC 時代なら1画面プログラムでゲーム作るとかよくあったぜ。
0681デフォルトの名無しさん
2009/01/03(土) 01:08:24ちょっとしたツールでも丁寧に作れば、簡単に 1000ステップを超えると思います。
0682デフォルトの名無しさん
2009/01/03(土) 01:12:57コードを書いたらちゃんと見てあげているし、いいところはいい、と褒めてあげているのに、まだ殻を破ることができないのですね。
0683デフォルトの名無しさん
2009/01/03(土) 01:49:280684デフォルトの名無しさん
2009/01/03(土) 01:58:26mallocやcallocで確保した領域は必ずfreeで開放するべきと書いてあるが
free書き忘れたり違ったアドレスを開放しようとしてもコンパイル(Borland C)が警告してくれないし
普通にプログラムの実行もできてるため、ちゃんと開放されているか不安です
一応領域確保と開放をするごとにprintf("%p")でアドレスを確認しながら恐る恐る実行してるのですが
freeし忘れたり変な所を開放したりするとどうなるんですか?
0685デフォルトの名無しさん
2009/01/03(土) 02:01:36コンパイラ compiler
0686デフォルトの名無しさん
2009/01/03(土) 02:03:40・ free し忘れると
メモリリークと呼ばれる状態になる。
プログラムが終了するまでずっとそのメモリを開放する手段が無くなる。
ループ内でこれをやっちゃうと、どんどん開放できないメモリが増えていって
そのうちメモリが一杯になる恐れがある。
・ 変な所を開放すると
死ぬ。
0687デフォルトの名無しさん
2009/01/03(土) 02:07:09死ぬ。
がくがくぶるぶる((((;?Д?))))
0688デフォルトの名無しさん
2009/01/03(土) 02:12:02一般的な環境で言うなら
解放忘れて、別に何も起こらない
終了後にOSがきちんなんとかしてくれる
変なとこ解放したところで、せいぜいそのプログラムが落ちる程度
ただマルチスレッドとかで扱ういろいろだと
終了後も領域解放されないままとかもありえる
あとは、確保した領域がすべて解放されたかチェックするツールとかあるよ
0689デフォルトの名無しさん
2009/01/03(土) 02:14:41free()に渡すのは識別子ではなくポインタの値で、
これは実行時に決定されるものだから、
コンパイル時に警告できるはずがない
重要なことは、領域を確保する部分と開放する部分が
常に対で呼ばれるようなインタフェースを作ること
なるべくなら割り付けた領域のアドレスをナマで持ち歩くことは避けて、
構造体などに含めてそのポインタを受け渡しする
FILE構造体とfopen()とfclose()の関係を思い浮かべると良い
0690デフォルトの名無しさん
2009/01/03(土) 02:16:40constみたいに、free可能なポインタにつけるキーワードがあれば便利だったかもね
0691デフォルトの名無しさん
2009/01/03(土) 02:25:46こういう知ったかは困るね。識別子の意味が分かってないようだし。
0692デフォルトの名無しさん
2009/01/03(土) 02:28:50君がその言葉の意図を分かっていないだけだろう。
初心者は char* hoge = malloc(size); とやると、
char* p = hoge; free(p); とすることに不安を覚えるものだ。
0693デフォルトの名無しさん
2009/01/03(土) 02:35:41あの基地外か。以後放置よろ。識別子なんて、調べればすぐに分かるし、余計な
一言で、全て間違いにしてしまう奴は、知ったかの自身過剰の墓穴掘りだから。
0694デフォルトの名無しさん
2009/01/03(土) 02:37:040695デフォルトの名無しさん
2009/01/03(土) 02:50:07きちんと領域の確保と解放ができるように気をつけます
0696デフォルトの名無しさん
2009/01/03(土) 03:13:01freeに渡しているのは、どう考えてもポインタ型の識別子です、ありがとうございました。
0697デフォルトの名無しさん
2009/01/03(土) 03:24:00別に定数をポインタ型にキャストしたものを free しても問題はない。
0698デフォルトの名無しさん
2009/01/03(土) 03:28:51ttp://c-lang-primer-review.blogspot.com/2008/06/3_22.html
識別子ではない、なんてとてもじゃないが言えませんね v(^-^)v
口が裂けても、識別子ではなく、なんて言えません ><;
識別子を使わないなら、どうやってポインタの識別子が指し示す
確保した領域を開放するんでつか? ><;
free(アドレス) こうですか?分かりません ><;
0699デフォルトの名無しさん
2009/01/03(土) 03:40:21渡しているのは識別子などにより構成される式の値だ。
0700デフォルトの名無しさん
2009/01/03(土) 03:45:21それがまるでさも実体を持っているかのように考えるのは愚昧。
0701デフォルトの名無しさん
2009/01/03(土) 03:47:27誰もそんなことは言っていないが?識別子が何なのか?についてだぞ?w
0702デフォルトの名無しさん
2009/01/03(土) 03:48:380703デフォルトの名無しさん
2009/01/03(土) 04:00:02「引数」に「与える」のが識別子
コンパイラがチェックするのは引数と識別子の型だけ
何もおかしくはない
0704デフォルトの名無しさん
2009/01/03(土) 04:08:24char* 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) は識別子ですか。そうですか。
0705デフォルトの名無しさん
2009/01/03(土) 04:12:13/* some statements */
free((void *)i);
値( (void *)i )が、渡されるわけで識別子は関係ない。
free(malloc(256 * sizeof(char));
この識別子は、なんだろうか。
とか書くと特殊な例に過ぎないと返されそうだな。
0706デフォルトの名無しさん
2009/01/03(土) 04:19:35free(malloc(256 * sizeof(char));において、その式はmalloc(256 * sizeof(char)という関数呼出式である。
free(hoge);において、その式はhogeという識別子からなる一次式である。
がんばって好意的に解釈すればこんな感じ?
文法上、ある種の式は識別子単体そのものであることから引っ張ってみた。
0707デフォルトの名無しさん
2009/01/03(土) 07:53:54分からないところがあり、質問なんですが
struct hoge {
unsigned a:12;
unsigned b:4;
}
:12とか:4はどんな効果があるのですか?
0708デフォルトの名無しさん
2009/01/03(土) 08:01:55変数を制限するもの
その例だと
変数aは12ビット
変数bは4ビット
で表すことのできる整数のみを扱える。
0709デフォルトの名無しさん
2009/01/03(土) 08:05:140710デフォルトの名無しさん
2009/01/03(土) 08:05:15ありがとうございます
がってんいきました
0711デフォルトの名無しさん
2009/01/03(土) 12:01:17#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)でも無理です。
0712デフォルトの名無しさん
2009/01/03(土) 12:22:140713デフォルトの名無しさん
2009/01/03(土) 12:24:55printf("%s",hoge[i-1]);
じゃないのか?
0714デフォルトの名無しさん
2009/01/03(土) 12:44:300715デフォルトの名無しさん
2009/01/03(土) 13:07:57>確保した領域がすべて解放されたかチェックするツールとかあるよ
んー、ポインタください。
私は自前でmalloc()/realloc()/free() にラッパかぶせてしのいでいます。
0716デフォルトの名無しさん
2009/01/03(土) 13:11:550717デフォルトの名無しさん
2009/01/03(土) 13:16:09ん、そうではありますが、リカーシブにすれば簡単です。
0718デフォルトの名無しさん
2009/01/03(土) 13:17:28前途ある中学生をいじめるのはかわいそうでしょ?
0719デフォルトの名無しさん
2009/01/03(土) 13:24:18O(N) かかっちゃうのはどうにかならんの? って話じゃない?
ノードを追加する際に深さをノードに保存しておくようにすると
O(1) で取得できるようにはなるよ。
その代わりノードの追加に少しコストが増えるけど。
0720デフォルトの名無しさん
2009/01/03(土) 13:57:12末端の方でノードを追加すると、それから上の全部の深さ変数を更新しなければならないのですか‥‥‥。
0721デフォルトの名無しさん
2009/01/03(土) 14:00:450722デフォルトの名無しさん
2009/01/03(土) 14:14:04深さ変数をインクリメントするだけだから
大したコストじゃないよ。
削除する際も同様ね。
0723デフォルトの名無しさん
2009/01/03(土) 14:15:270724673
2009/01/03(土) 15:52:03tramp.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");
}
}
0725673
2009/01/03(土) 15:52:44int main(void)
{
int x;
for(;x!=EOF; x++)
{
tramp();
}
return 0;
}
横に3個や5個などトランプを横に表示したんですが、改行されて複数の場合縦に表示されてしまいます。
3個並べれば神経衰弱などが作れそうな気がするんですが。
詳しい方教えてください
0726デフォルトの名無しさん
2009/01/03(土) 15:53:270727デフォルトの名無しさん
2009/01/03(土) 15:55:193個や5個表示したその後に改行する。
0728673
2009/01/03(土) 16:03:00その手で試した事があるんですが、型を作るのが大変でした。
試してみます。
最近、テキストベースで絵を表示するプログラムにはまっています。
0729デフォルトの名無しさん
2009/01/03(土) 16:08:330730デフォルトの名無しさん
2009/01/03(土) 16:18:490731デフォルトの名無しさん
2009/01/03(土) 16:37:50#include <stdio.h>
int main(void)
{
printf("ハローワールド");
return 0;
}
をコンパイルして、XP上で実行たら確認するまもなくウィンドウが閉じてしまいました。
実行後、ウィンドウが自動で閉じるのをとめるにはどうすればいいのでしょうか?
0732デフォルトの名無しさん
2009/01/03(土) 16:39:05・ デバッグなしで実行する
お好きな方を
0733デフォルトの名無しさん
2009/01/03(土) 16:39:37getchar(); だった・・・。
0734デフォルトの名無しさん
2009/01/03(土) 16:48:33つ system("PAUSE");
0735デフォルトの名無しさん
2009/01/03(土) 17:00:47ありがとう御座いました。
プログラムに動体視力を求めれたのかと思いきちんと実行できているのかわからず困っていました。
ありがとう御座います。
0736714
2009/01/03(土) 17:01:04>>719
いえ、オーダーはあんまり気にしてません。
どちらかというとコードを書くのが楽なのはどんなプログラムかなーと・・・
再帰で書くとするとどんな感じにすればよいのでしょうか・・?
0737デフォルトの名無しさん
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);
}
0738デフォルトの名無しさん
2009/01/03(土) 17:31:07代入式と条件式の区別が出来ない人って、やーね。デリカシーが無いというか。
0739デフォルトの名無しさん
2009/01/03(土) 17:36:480740デフォルトの名無しさん
2009/01/03(土) 17:37:29冗長だし、比較が1ステップ増えるのが無駄だと思うんだが。
0741デフォルトの名無しさん
2009/01/03(土) 17:44:120742デフォルトの名無しさん
2009/01/03(土) 17:45:410743デフォルトの名無しさん
2009/01/03(土) 17:47:100744デフォルトの名無しさん
2009/01/03(土) 17:48:380745デフォルトの名無しさん
2009/01/03(土) 17:49:34それも分からないようでは未熟きわまりない。
0746デフォルトの名無しさん
2009/01/03(土) 17:53:04警告もエラーと同等のものとして潰すべき物だ。
今回の例で言えば、typo で = になっている部分と明確に区別し、
これは typo で = になってるわけじゃないですよ、と、
ソースを読む人とコンパイラとの両方に示す意味がある。
0747デフォルトの名無しさん
2009/01/03(土) 17:53:13宿題スレでももう一個の方でも、もとのところに帰れよ。
それとも、どこに書き込んでるかわからないほど顔真っ赤なのか?
0748デフォルトの名無しさん
2009/01/03(土) 17:54:310749デフォルトの名無しさん
2009/01/03(土) 17:56:26おまえさんの手元のコンパイラ1つ黙らせられれば済む話か?
0750デフォルトの名無しさん
2009/01/03(土) 17:58:510751デフォルトの名無しさん
2009/01/03(土) 18:02:59()をつけても代入式じゃなくなるわけじゃないし。
0752デフォルトの名無しさん
2009/01/03(土) 18:09:10そのとおり
0753デフォルトの名無しさん
2009/01/03(土) 18:10:27for文になおしちゃうかな
0754デフォルトの名無しさん
2009/01/03(土) 18:12:51# そんな LR にいちいち付き合ってらんねー
0755デフォルトの名無しさん
2009/01/03(土) 18:17:570756デフォルトの名無しさん
2009/01/03(土) 18:17:580757デフォルトの名無しさん
2009/01/03(土) 18:19:02果たしてすっとこどっこいな人間が読んだらどう思うか不安にはなるな。
0758デフォルトの名無しさん
2009/01/03(土) 18:20:53とかさ
0759デフォルトの名無しさん
2009/01/03(土) 18:21:400760デフォルトの名無しさん
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"
これらの違いがわからないので教えてください。
0761デフォルトの名無しさん
2009/01/03(土) 19:30:370762デフォルトの名無しさん
2009/01/03(土) 19:32:29externではだめなのですか?
0763デフォルトの名無しさん
2009/01/03(土) 19:33:14関数宣言については
何も付けない場合は extern がついてるのと同じになる
0764デフォルトの名無しさん
2009/01/03(土) 19:33:43それ以前に static int f(void); と書かれていない限り、
extern が指定されたものと見なされる。
0766760
2009/01/03(土) 19:43:32ではmain.cに追加するのが
int f();
#include "sub.h"
の違いはどうなのですか?
この場合はまったく同じかもしれませんが一般的な違いを教えてください。
0767デフォルトの名無しさん
2009/01/03(土) 19:46:13int f(void); は引数がない。
int f(); は引数に関する情報がない。(引数はあるかもしれないし、ないかもしれない)
引数が無いのなら void と明示する方が良い。
(C++ だと () も (void) と同じになるのだが)
0768760
2009/01/03(土) 19:50:46そうなるのですか。
main.cに追加するのが
int f(void);
#include "sub.h"
の2つのうち1つならこれらの違いはどうなるんですか?
0769デフォルトの名無しさん
2009/01/03(土) 19:51:41コンパイルの実行前にあらかじめファイルの内容を埋め込む感じの命令
だから一緒になる
0770デフォルトの名無しさん
2009/01/03(土) 19:51:54#include は指定したファイルの中身がそこに埋め込んでファイルを合成する命令だからね。
0771デフォルトの名無しさん
2009/01/03(土) 19:57:01cc(Cコンパイラ)とcpp(Cプリプロセッサ)ぐらいは知っといたほうがいい
0772デフォルトの名無しさん
2009/01/03(土) 19:57:47戻ってきてもらっても困るのですが。
0773760
2009/01/03(土) 19:57:590774C初心者
2009/01/03(土) 20:08:330775デフォルトの名無しさん
2009/01/03(土) 20:12:260776デフォルトの名無しさん
2009/01/03(土) 20:13:360777デフォルトの名無しさん
2009/01/03(土) 20:16:470778デフォルトの名無しさん
2009/01/03(土) 20:20:00int type;
union {
struct cell *first;
struct XXX * data;
};
struct cell *second;
};
struct XXX があつかうデータな
とか?
0779デフォルトの名無しさん
2009/01/03(土) 20:34:09アルゴリズムがわからないならまずC言語以前の問題です
アルゴリズムを理解しているならC言語で実現する上で何がわからないのか整理してもってきなさい
0780デフォルトの名無しさん
2009/01/03(土) 22:51:52適切な教科書が思いつければいいのですが。
とりあえず基礎的なC言語の教科書を1冊マスターしていただければみえてくると思います。、
0781デフォルトの名無しさん
2009/01/03(土) 23:54:30void keisan(float x,float y);
void keisan(float, float);
上は引数に変数がついている書き方ですが下は型だけで変数がついていません
0782デフォルトの名無しさん
2009/01/03(土) 23:55:560783デフォルトの名無しさん
2009/01/03(土) 23:58:22関数プロトタイプの引数リスト内での引数名はオプションで、書いても書かなくてもいい
0784デフォルトの名無しさん
2009/01/04(日) 00:19:05>>783
ありがとうございました!
0785デフォルトの名無しさん
2009/01/04(日) 00:28:27そこで機能ごと(関数ごと)に別々のファイルに分けようと思ってるんですが、普通はどのようにしているのでしょうか?
定義としてヘッダファイル、機能ごとにcppファイルを作るというスタイルは普通はやらないんでしょうか?
行数が多くてもcppファイルは1つしか作らないのでしょうか?
初心者でそこら辺はよくわからないので、教えてください。
0786デフォルトの名無しさん
2009/01/04(日) 00:39:34ここは C スレだ。
C++ ならクラス事にファイル分けるとしか言いようが無い。
0787デフォルトの名無しさん
2009/01/04(日) 00:57:19機能ごとに分ける。
機能A a.h a.c
機能B b.h b.c
・・・・・・・・・・・・
これがふつう。
1つのcファイルは小さなプログラムを一人で作るときは、まあそれでいい。
プロジェクトで複数人で開発をするときは、ファイルがひとつだと、同時にいろんな
ひとがファイルあける事になって同時更新の問題が発生する。
1関数1ファイルはファイル数が多くなるので管理が難しい。(わけがわからなくなる)
てなことで、プログラムをいくつかの機能に分解し、その分解された機能ごとに
cファイルをつくるのが現実的ではないだろうか。
0788デフォルトの名無しさん
2009/01/04(日) 01:04:16一つの実行形式ごとに一つのモジュール+共通関数用に1モジュール
だったからなかなかひどい目にあった
0789デフォルトの名無しさん
2009/01/04(日) 01:45:53具体的にはmain関数で
scanf("%s",&filename); でファイル名を取得して
関数(filename); で渡し
void 関数(char){
fp=fopen(filename,"r");
という風に使いたいのです。ポインタなどを使えばうまくいくと思うのですが、試してみてもうまくいきません。
どのようにすればいいかわかる方いたら教えてください、お願いします。
0790デフォルトの名無しさん
2009/01/04(日) 01:46:45while(j=10-i++)
これは適切ですか?
0791デフォルトの名無しさん
2009/01/04(日) 01:52:13妙な加工をせずに
コンパイル可能なコードを書いてくれ。
0792デフォルトの名無しさん
2009/01/04(日) 01:53:01タイプミスだとおもいますが
void 関数(char)->void 関数(char*)
ですよね。
fp=fopen(filename,"r");
if (fp == NULL) perror(filename);
とやると、オープンエラーのときのエラー種類とオープンしようとしたファイル名が
表示されます。それをみればわかるかな?
0793デフォルトの名無しさん
2009/01/04(日) 01:54:37コンパイルできるという意味では適切なプログラム。
圧倒的多数の人間がコーディングスタイルとして良くないと言うであろうという意味では不適切。
0794デフォルトの名無しさん
2009/01/04(日) 01:54:56void 関数(const char* filename)と書けばいい。
0795デフォルトの名無しさん
2009/01/04(日) 01:55:17char 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) {
/* ... */
}
0796デフォルトの名無しさん
2009/01/04(日) 01:59:33あくまでもそれは、while文のループを止める条件として、正しいか?
0797デフォルトの名無しさん
2009/01/04(日) 02:00:53scanf("%s",filename);
関数(filename);
void 関数(char *filename){
fp=fopen(filename,"r");
0798デフォルトの名無しさん
2009/01/04(日) 02:01:240799デフォルトの名無しさん
2009/01/04(日) 02:04:35ありがとうございました!できました。いろいろ調べてこの方法も試してみたんですがタイプミスしてました。
つまらない質問にも答えてくださってありがとうございました。
それと聞きたいのですが、
char *filename
と
char* filename
は何か違いがあるのでしょうか?
0800デフォルトの名無しさん
2009/01/04(日) 02:05:360801デフォルトの名無しさん
2009/01/04(日) 02:15:250802デフォルトの名無しさん
2009/01/04(日) 02:34:04スレ違いの話になるかもしれないが、
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 */
のように宣言する。
0803デフォルトの名無しさん
2009/01/04(日) 02:46:140804デフォルトの名無しさん
2009/01/04(日) 02:47:21char filename[適当な大きさの数字][5];
scanf("%s",filename[適当な大きさの数字][i]);
関数(filename[適当な大きさの数字][i]);
void 関数(char *filename[][]){
fp=fopen(filename[適当な大きさの数字][i],"r");
としてみたのですが、ダメでした。何回も悪いんですけど、教えていただけないでしょうか?
0805デフォルトの名無しさん
2009/01/04(日) 02:51:14int 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");
}
0806デフォルトの名無しさん
2009/01/04(日) 02:51:55これが C++ だと 型 *&参照名; とかかなり違和感ある。
0807デフォルトの名無しさん
2009/01/04(日) 02:54:26まずscanfの使い方からわかってないだろう
ちゃんと理解してないのにいきなり難しいことをやろうとするな
0808デフォルトの名無しさん
2009/01/04(日) 02:54:54もうね、コヒーを一気にゴクゴクと飲んで、口から噴射して顔にぶっ掛けてやりたいくらいだわw
0809デフォルトの名無しさん
2009/01/04(日) 02:59:48君の欲しいのは 「適当な大きさのcharの配列」6つからなる配列
君が宣言したのは 「大きさ5のcharの配列」の適当な大きさの配列
%s指定子を使ったときにscanfに与えるのはcharへのポインタ
君が与えたのはcharの値
君が関数に渡したいのは「大きさ5のcharの配列」へのポインタ
君が関数の引数に書いたのは「大きさが不定のcharへのポインタの配列」へのポインタ
fopenに与えるのはcharへのポインタ
君が与えたのはcharの値
0810デフォルトの名無しさん
2009/01/04(日) 03:00:34for ( 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);みたいにね。
0811デフォルトの名無しさん
2009/01/04(日) 03:00:46基礎からやりなおせ
0812デフォルトの名無しさん
2009/01/04(日) 03:02:570813デフォルトの名無しさん
2009/01/04(日) 03:03:47どんな入門書使ってるか知らないが、まず配列のところへ戻ってやりなおすこと
0814デフォルトの名無しさん
2009/01/04(日) 03:04:06ソースに日本語が混ざるとすげー気持ち悪いなw
0815デフォルトの名無しさん
2009/01/04(日) 03:04:41>char filename[適当な大きさの数字][5];
>scanf("%s",filename[適当な大きさの数字][i]);
>関数(filename[適当な大きさの数字][i]);
>
>void 関数(char *filename[][]){
>fp=fopen(filename[適当な大きさの数字][i],"r");
すべての行に間違いがあります!
0816デフォルトの名無しさん
2009/01/04(日) 03:05:40「理解」しないで「動いた」からって先へ進むな
>>789のをどう変更して、それがどうして動いたか理解したのか?
0817デフォルトの名無しさん
2009/01/04(日) 03:06:260818デフォルトの名無しさん
2009/01/04(日) 03:06:38宿題丸投げは宿題スレへ
0819デフォルトの名無しさん
2009/01/04(日) 03:07:08ただ動くソースコードがほしいだけならそのためのスレがちゃんとある
0820デフォルトの名無しさん
2009/01/04(日) 03:11:340821デフォルトの名無しさん
2009/01/04(日) 03:14:08無駄に食いつぶしてしまったって感じがするぜ。どうせプログラミングをやるなら、
名の残るゲームの開発チームにでも加わりたいもんだぜ。
0822デフォルトの名無しさん
2009/01/04(日) 03:15:58はい、次の方どうぞ。
0823デフォルトの名無しさん
2009/01/04(日) 04:19:210824デフォルトの名無しさん
2009/01/04(日) 18:29:57ノシ
0825デフォルトの名無しさん
2009/01/04(日) 22:01:36え?一度やってみたいのですが、やっぱり無理がありますかね?
どこぞで「は」というプリプロセッサがあったようなきがしたような。
0826デフォルトの名無しさん
2009/01/04(日) 22:16:19プリプロセッサの事があまり好きではないので^^
大体標準なのに一々インクルードとか面倒じゃないですか?
0827デフォルトの名無しさん
2009/01/04(日) 22:20:42ん、プログラムを作成・実行する環境と言語自体とを(わりあいに、ですが)くっきりとわけるための#includeと思っていただければ。
0828デフォルトの名無しさん
2009/01/04(日) 22:26:12べつに書かなくtも動くよCなら
0829デフォルトの名無しさん
2009/01/04(日) 22:41:02インクルードしない方が面倒臭いと思うんだが。
0830デフォルトの名無しさん
2009/01/04(日) 22:56:31よくそんな昔の事を憶えているな。
0831デフォルトの名無しさん
2009/01/04(日) 23:05:01(^^;;;;;
0832デフォルトの名無しさん
2009/01/04(日) 23:09:30嫁以外の他の女とのセックス後と写真を大事に保管していて結納写真と仲良く流出。
これは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/
0833デフォルトの名無しさん
2009/01/04(日) 23:19:59内部のbit的には全て2分の1で0 or 1であり、
charみたくint以下の型に入れても
乱数としてうまく分散していると期待して良いですか?
0834デフォルトの名無しさん
2009/01/04(日) 23:21:450835デフォルトの名無しさん
2009/01/04(日) 23:23:390836デフォルトの名無しさん
2009/01/04(日) 23:26:340837デフォルトの名無しさん
2009/01/05(月) 00:26:53これから小数だけを取り出してファイル出力したいのですが、何かいい方法はあるでしょうか?
char name[0]=frame
char name[1]=0.123 ←取り出したい
char name[2]=23
char name[3]=1.234 ←取り出したい
0838デフォルトの名無しさん
2009/01/05(月) 00:36:520839デフォルトの名無しさん
2009/01/05(月) 00:40:15そんなことはありえないでしょうか?
0840デフォルトの名無しさん
2009/01/05(月) 00:40:58strtod()を使って、文字列の最後までパースできているか確認するとか。
0841デフォルトの名無しさん
2009/01/05(月) 00:42:330842デフォルトの名無しさん
2009/01/05(月) 00:51:000843デフォルトの名無しさん
2009/01/05(月) 00:51:29小数と整数の判別はどのようにすればいいでしょうか?
strtodを使うと整数も一緒に取り出してしまう気がするのですが
0844デフォルトの名無しさん
2009/01/05(月) 00:53:10中には小数点を使っている文字列もあるので、字句解析は難しいかと思いまして
0845デフォルトの名無しさん
2009/01/05(月) 00:55:31そういわれたらそうだな。
文字列に含まれてるのが、数字のみで、中に一個だけ少数点が含まれていたら、
実数と判断するとか、地味に判定ルーチン書けばいいかな。
0846デフォルトの名無しさん
2009/01/05(月) 00:57:20中には「11:13:28.015」というような文字列も含まれているので小数点での判別は実質無理なんです
0847デフォルトの名無しさん
2009/01/05(月) 00:58:27FILE *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){}
}
コンパイル確認はしてません。
0848デフォルトの名無しさん
2009/01/05(月) 00:59:310849デフォルトの名無しさん
2009/01/05(月) 00:59:40まず、strtol()を通して、文字列の最後までパースできていたら整数。
整数でなかったらstrtod()を通して実数か判断するって方法でもいいか。
実数が指数表記とかされないんだったら、>>845の感じで、
自分で判定ルーチン書いても、あまり手間は変わらないような気もするけど。
0850デフォルトの名無しさん
2009/01/05(月) 00:59:540851デフォルトの名無しさん
2009/01/05(月) 01:04:39だから数字のみかで判定も入れればいいじゃん。
int isReal(const char *s)
{
int ccount = 0;
for (;*s; s++) {
if (*s == '.')
ccount++;
else if (!isdigit(*s))
return 0;
}
return ccount == 1;
}
動作確認してないからバグってるかも。
0852デフォルトの名無しさん
2009/01/05(月) 01:30:30この方法で判別できました。ありがとうございました!
この問題はかなり悩んだんですが、こんなすぐ解決してくださるとは思いませんでした。
本当にありがとうございました!
0853デフォルトの名無しさん
2009/01/05(月) 03:47:57いったん新しく作ったローカル変数に移し変えたほうが効率的なんでしょうか
それとも実引数は完全なるローカル変数といっしょの扱いでいいのでしょうか
よくわからないけどアセンブリレベルでスタックとかレジスタとかどうかなーと思いまして
0854デフォルトの名無しさん
2009/01/05(月) 03:53:040855デフォルトの名無しさん
2009/01/05(月) 04:32:52while(条件式のみ)ってのは如何なものかと。
0856デフォルトの名無しさん
2009/01/05(月) 04:44:520857デフォルトの名無しさん
2009/01/05(月) 09:57:08コンパイラを作るのなら意識すべきだし、最適化を行なわないなら若干変わる。
しかし、普通は全く同じように使えると思っていい。
よく判らないなら、アセンブリレベルで気にしても意味がない。
>>855
1行目が何を言いたいのか全く判らない。
通常、whileの条件判断部でファイルオープンすることは考えにくいし、まして
ファイルを開けない場合にループするなんて尚更考えにくい。
0858673
2009/01/05(月) 11:15:06#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++と全く同じ感じなんですが
0859デフォルトの名無しさん
2009/01/05(月) 11:52:07--
独習Cという本に書いてある
んですが。
な
んですが、
インクリメントの*p++;じゃなくてp++;と同じな
んですが
値をインクリメントは(*p)++;な
んですが
*p++;の使い道がよくわかりません、p++と全く同じ感じな
んですが
--
で、何が言いたいの?
0860デフォルトの名無しさん
2009/01/05(月) 14:36:25五箇所に「んですが」が発見される。これを右から読む。「がすでん」
東シナ海では中国が日本との国境線付近でガス田を開発している。
平湖ガス田、断橋ガス田、天外天ガス田、春暁ガス田、そして今回問題となっている樫ガス田の五つ。
ガス田の数もぴたりと一致する。
つまりこれは中国が開発している東シナ海のガス田のことを指しているものと推察される。
更に「んですが」の一文字前の文字に注目して欲しい。
最初だけ「る」で残り四つは「な」だ。
つまり今回問題となっている樫ガス田についての極秘情報が暗号化されて
「独習Cという本に書いてあ」の部分に含まれていると考えられるのだ。
実に巧妙だ。
0861デフォルトの名無しさん
2009/01/05(月) 14:47:04春暁、断橋、冷泉、天外天、龍井、だ
樫は天外天の日本名だな
0862デフォルトの名無しさん
2009/01/05(月) 14:59:26tenarray func();//int型の要素を10持つ配列へのポインタを返す関数
これを、typedef宣言しないで書くことってできるんですか?
0863673
2009/01/05(月) 15:13:35860さん
日本語のおかしさを責めないでください
でもおもしろかったです
0864デフォルトの名無しさん
2009/01/05(月) 16:12:51できない。int** で我慢しろ。
0865デフォルトの名無しさん
2009/01/05(月) 16:19:06アカウントを作らなければいけないのでしょうか?あとアカウントの登録情報を変更したい時はどうすればいいですか?
0866673
2009/01/05(月) 16:37:47int 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....
などと配列全部まで入れたいんですが、うまくいきません。
どなたか教えてください。
0867デフォルトの名無しさん
2009/01/05(月) 16:47:37int 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;
}
0868デフォルトの名無しさん
2009/01/05(月) 16:50:51#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;
}
0869673
2009/01/05(月) 16:55:03int 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;
}
これで整頓して表示できました。
ありがとうございました
0870デフォルトの名無しさん
2009/01/05(月) 17:02:18なんか表記する仕方があるのかと思ってました。
ないんですね。ありがとうございました。
0871デフォルトの名無しさん
2009/01/05(月) 17:07:220872673
2009/01/05(月) 17:09:39int 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*のキャスト意味や、何故キャストするのか教えてください
0873デフォルトの名無しさん
2009/01/05(月) 17:16:030874673
2009/01/05(月) 17:19:32キャストっていうのは
float x=10.2;
printf("%d",(int)x);
などと使って、小数を省いたりするように書かれてあったんですが、何故(int *)なんでしょうか??
0875デフォルトの名無しさん
2009/01/05(月) 17:27:20>>864
int (*func(void))[10]
{
}
とすればできる。
解答者のレベルも目を覆うものがあるな。
0876デフォルトの名無しさん
2009/01/05(月) 17:30:59>873を理解できないのなら、先ずはそこから。
0877デフォルトの名無しさん
2009/01/05(月) 17:47:42独習というより毒臭だな >*p++;
0878865
2009/01/05(月) 17:52:000879デフォルトの名無しさん
2009/01/05(月) 17:53:01スレ違いです
0880デフォルトの名無しさん
2009/01/05(月) 17:53:020881デフォルトの名無しさん
2009/01/05(月) 17:59:01登録キーが必要かどうかはバージョンによる
コンパイラに限ったことではなく、ソフトウエア一般の話として、
ライセンス条件がわからないとき何をすべきかという問題なので
あなたの問いはスレ違いの可能性がある
0882デフォルトの名無しさん
2009/01/05(月) 18:07:300883デフォルトの名無しさん
2009/01/05(月) 18:18:44(*p)++ との違いを示すための例なんじゃね?
0884デフォルトの名無しさん
2009/01/05(月) 18:19:55長年、喉につかえていた魚の小骨が取れた気分です。ありがとうございます。
>>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)++は、ポインタがさす値を逆参照し、その値をインクリメント
#で、あってんのかな?
0885デフォルトの名無しさん
2009/01/05(月) 18:29:55が正しいというのが理解できず。。オーバーフローしないの?
>>669の2級
0886デフォルトの名無しさん
2009/01/05(月) 18:37:06char foo[16]="aaaaaaaaaaaaaaa", bar[16], *ap, *bp;
ap = foo; bp = bar;
while(*bp++ = *ap++);
0887673
2009/01/05(月) 18:57:57for(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; が未だにわかりません。
0888865
2009/01/05(月) 19:02:470889デフォルトの名無しさん
2009/01/05(月) 19:04:080890673
2009/01/05(月) 19:04:49たぶんお金がかかっているだけあって、補完機能やデバッカ機能などあると思います。
お金かけずにフリーソフトのコンパイラがあると思います
0891デフォルトの名無しさん
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関数の使い方が間違っているのかよく分からなかったので
どなたかアドバイスの方よろしくお願いします。
0892デフォルトの名無しさん
2009/01/05(月) 19:11:09http://www.microsoft.com/japan/msdn/vstudio/Express/
MS、「Visual Studio 2008 Express Edition」の日本語正式版を無償公開
VB/C#/C++言語によりWindowsアプリケーションを開発可能
0893デフォルトの名無しさん
2009/01/05(月) 19:13:31どんなエラー?
Cygwinがstackavail()という非標準関数をstdio.hに持っているかどうか
はオレは知らない。
0894デフォルトの名無しさん
2009/01/05(月) 19:13:57c言語でコマンドラインから引数を受け取ってファイルを
処理するプログラムがあったとします。仮にtest.exeとします。
カレントディレクトリには、以下のファイルが存在します。
a.txt b.txt c.txt test.exe
そして、「test *.txt」 とコマンドを打ったら、
a.txtを引数としたプログラムが実行されて、プログラム終了。
↓
b.txtを引数としたプログラムが実行されて、プログラム終了。
↓
c.txtを引数としたプログラムが実行されて、プログラム終了。
みたいなかんじで動作するのでしょうか?
0895デフォルトの名無しさん
2009/01/05(月) 19:17:47test a.txt b.txt c.txt
0896デフォルトの名無しさん
2009/01/05(月) 19:19:57/cygdrive/c/DOCUME~1/owner/LOCALS~1/Temp/ccqpUnTx.o:jikken.c:(.text+0x3b)
fined reference to `_stackavail'
collect2:Id returnec 1 exit status
というエラーです。非標準関数が入っていないからなんですかね?
なかった場合は新しく入れることは可能なんでしょうか?
0897888
2009/01/05(月) 19:38:080898デフォルトの名無しさん
2009/01/05(月) 19:38:58するかもしれないし、しないかもしれない。
実際にプログラムが呼び出されるまでにどういう形でコマンドラインが処理されるかはOSに依存するし、
受け取ったコマンドライン引数をプログラムがどう処理するかはそのプログラムによるし、
開こうとするファイル名をどう処理するか(具体的にはカレントディレクトリの問題)もOSに依存する
0899デフォルトの名無しさん
2009/01/05(月) 19:45:460900デフォルトの名無しさん
2009/01/05(月) 19:46:200901デフォルトの名無しさん
2009/01/05(月) 19:54:46ワイルドカードの展開は、Unix系ならシェルが行なうし、
Windows系ならそのまま渡して、それを各プログラムが展開するよ。
0902デフォルトの名無しさん
2009/01/05(月) 20:04:15>899はよめますか?
「無償公開」とは、「ただでだうんろーどできます」といういみですよ。
0903デフォルトの名無しさん
2009/01/05(月) 20:17:450904897
2009/01/05(月) 20:23:44開発環境をダウンロードした経験がないので。本当の初心者ですみません。
0905デフォルトの名無しさん
2009/01/05(月) 20:25:370906デフォルトの名無しさん
2009/01/05(月) 20:28:19このページのリンクを押して指示に従うだけ。
直リンをのせておく。これをクリックすればいい。
http://go.microsoft.com/?LinkId=9348304
0907デフォルトの名無しさん
2009/01/05(月) 20:29:250908デフォルトの名無しさん
2009/01/05(月) 20:30:35>896を見る限り、stackavail()なる関数が見つからないのだろ。
どこで知ったか知らんが、それを知った場所で聞けよ。
0910デフォルトの名無しさん
2009/01/05(月) 20:53:34ダウンロードも分からんのに。
0911デフォルトの名無しさん
2009/01/05(月) 21:00:300912デフォルトの名無しさん
2009/01/05(月) 21:11:41あとポインタの型の違いと、ポインタがどこ指しているかとか。
というか、初心者にはVisualStdioよりも、
cygwinや、*nixの方が幸せな環境だと思うんだが。
0913デフォルトの名無しさん
2009/01/05(月) 21:16:530914デフォルトの名無しさん
2009/01/05(月) 22:38:19ワイルドカード(* or ?) の展開は shell の仕様になります。dos の command.com は>>895のようには展開してくれませんでした。
NT の cmd.exe はどうでしょうかね。(やったことない)
0916894
2009/01/05(月) 23:23:33具体的にどのように展開されるのでしょうか?
いまいち理解できません。すみません・・・
test.exe *.txt
↓
test.exe a.txt b.txt c.txt
と展開されるのでしょうか?
0917デフォルトの名無しさん
2009/01/05(月) 23:34:18*.txt のままargvに入る。
unixのばあいだけそうなる。
0918デフォルトの名無しさん
2009/01/05(月) 23:38:070919デフォルトの名無しさん
2009/01/05(月) 23:46:00ワイルドカード展開をおこなってくれるルーチンがあったような気がします。lha のソースでみたような。
0920デフォルトの名無しさん
2009/01/05(月) 23:50:12そうでしたっか?
*.txtのワイルドカードはUnixの場合シェルが展開するのですよね
DOSのコマンドプロンプトは展開してくれないのかなあ?
0921デフォルトの名無しさん
2009/01/06(火) 00:01:020922894
2009/01/06(火) 00:09:03プログラム上で.txtが含まれる全てのファイルを参照することは可能なのでしょうか?
具体的なコードを提示して下さると助かります。
0923デフォルトの名無しさん
2009/01/06(火) 00:11:23ファイルシステムについての質問は常に、OSに依存するという答えになる
0924デフォルトの名無しさん
2009/01/06(火) 00:11:48#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;
}
0925924
2009/01/06(火) 00:12:410926デフォルトの名無しさん
2009/01/06(火) 00:14:280927デフォルトの名無しさん
2009/01/06(火) 00:17:15恐らくは可能だろうけれども、その詳細はシステムに依存する。
0928894
2009/01/06(火) 00:23:40コマンドプロンプトでの動作しか想定していません。
開発環境は、BCC developer(スペル適当)です。
0929デフォルトの名無しさん
2009/01/06(火) 00:26:41FindFirstでぐぐれ
0930デフォルトの名無しさん
2009/01/06(火) 00:27:490931デフォルトの名無しさん
2009/01/06(火) 00:36:01BCC なら、"wildargs.obj" を明示的にリンクすることで
スタートアップルーチンの中で展開するようになるよ。
リンク方法は、解るよな?
0932デフォルトの名無しさん
2009/01/06(火) 00:39:170933デフォルトの名無しさん
2009/01/06(火) 00:48:44sprintf(&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]=リ・
となってしまいます。なぜかわかる方いますか?
0934デフォルトの名無しさん
2009/01/06(火) 00:53:360935デフォルトの名無しさん
2009/01/06(火) 00:55:28これは何を指していると思うの?
0936デフォルトの名無しさん
2009/01/06(火) 00:57:550937デフォルトの名無しさん
2009/01/06(火) 01:02:22だから、&filename2[i][MAX_SIZE] はどこを指していると思っている?
0938デフォルトの名無しさん
2009/01/06(火) 01:04:43お前は二次元配列以前に配列がわかってないだろう
char array[SIZE];
というものがあったとき、
1) array
2) array[0]
3) &array
4) &array[0]
それぞれの意味を説明できるか?
0939デフォルトの名無しさん
2009/01/06(火) 01:04:590940デフォルトの名無しさん
2009/01/06(火) 01:08:41そうだけど、それが具体的にどこだか図示できる?
で、そこにsprintfで書き込んだら何が起きると思う?
0941デフォルトの名無しさん
2009/01/06(火) 01:13:50コードじゃなく日本語で説明してみろ
0942デフォルトの名無しさん
2009/01/06(火) 01:14:270943デフォルトの名無しさん
2009/01/06(火) 01:15:25出力結果から見るとそこは'1'を入れてるんだろうけどね
0944デフォルトの名無しさん
2009/01/06(火) 01:17:15その番地に書き込んでくれると思っていました。
ですが、その番地に書き込みたいときはどうすればいいのでしょうか?
0945デフォルトの名無しさん
2009/01/06(火) 01:22:40本当にわかってないんだな
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]のことだ
ここまでで、自分が何を間違ってるかわかったか?
0946897
2009/01/06(火) 01:23:48プログラムを作りたいのですがどうしたらいいですか?明日にでも教えてもらえたら嬉しい限りです。
0947デフォルトの名無しさん
2009/01/06(火) 01:23:58お前はまずそこから勉強しなおしだ
0948デフォルトの名無しさん
2009/01/06(火) 01:27:01値を配列の最後に入れようとしていたということですか?
0949デフォルトの名無しさん
2009/01/06(火) 01:27:34正しいソースが欲しいだけでCを理解するつもりがないなら宿題スレへ行くこと
0950デフォルトの名無しさん
2009/01/06(火) 01:28:57今、「値」と「最後」をそれぞれどういう意味で使ったか厳密に説明してみ
何の値なのか、最後ってのは具体的にアドレスで言うとどこか
0951デフォルトの名無しさん
2009/01/06(火) 01:29:021)と2)は配列の先頭の値
3)と4)は配列の先頭の番地
ですか?
0952デフォルトの名無しさん
2009/01/06(火) 01:30:35おしい!
0953デフォルトの名無しさん
2009/01/06(火) 01:30:43値は101.csv などのこと
最後はfilename[0][MAX_SIZE-1]などのこと
ですか?
0954894
2009/01/06(火) 01:32:33ありがとうございます。
それでググったやり方だと僕がやりたいことに
ぴったりなコードが書けます。
他にレスして下さった方々もありがとうございました。
0955デフォルトの名無しさん
2009/01/06(火) 01:36:170956デフォルトの名無しさん
2009/01/06(火) 01:37:06違う
1)は配列そのもので、ただしほとんどの場合配列の先頭の番地に意味が格下げになる
2)は配列の先頭の値
3)は配列そのものの番地で、ポインタとしての型(指しているものの大きさ)は違うけれど、場所としては先頭の番地と同じ
4)は配列の先頭の値の番地だから配列の先頭の番地と同じ
0957デフォルトの名無しさん
2009/01/06(火) 01:53:42誰かお願いします。
0958デフォルトの名無しさん
2009/01/06(火) 01:54:27これは具体的に何を与えてやればいいのでしょうか?先頭の番地でしょうか?
0959デフォルトの名無しさん
2009/01/06(火) 01:56:33まず 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
そうだよ
もちろん、その先頭の番地以降に十分な領域が確保されてなきゃいけない
0960デフォルトの名無しさん
2009/01/06(火) 01:57:01オーバーフローするだろう
0xffffffff + 1 -> 0
0961デフォルトの名無しさん
2009/01/06(火) 01:57:41番地に格下げとはまた新しい。ポインタに格下げね。
0962デフォルトの名無しさん
2009/01/06(火) 01:58:43じゃあ問題とその解答が間違えているということでしょうか?
0963デフォルトの名無しさん
2009/01/06(火) 02:00:17オーバーフローエラーとかは発生しないってことかも?
0964デフォルトの名無しさん
2009/01/06(火) 02:03:14そういうこと。
>>960
そういう風に扱える範囲を超えたら
上のビットを無視した結果(UINT_MAX + 1での剰余)にならないといけないと決まっている。
0965デフォルトの名無しさん
2009/01/06(火) 02:04:42ありがとうございました。
0966デフォルトの名無しさん
2009/01/06(火) 02:05:51どのような問題が起こるのでしょうか?
0967デフォルトの名無しさん
2009/01/06(火) 02:06:18「文字列」って表現してある教科書は多いけど、不正確なんだな
実際には単なる領域へのポインタ
で、通常は配列自体が領域の先頭の要素へのポインタになるので、
ふつう配列をそのままぶちこむ
&とか使わずに
char filename[SIZE];
としたら
sprintf(filename, " (以下略
0968デフォルトの名無しさん
2009/01/06(火) 02:06:56あとで説明するからまず一次元配列を理解しなさい
0969デフォルトの名無しさん
2009/01/06(火) 02:08:582次元配列の場合だと、下のようになるということですか?
char filename[5][SIZE];
としたら
sprintf(filename[0],"(以下略
0970デフォルトの名無しさん
2009/01/06(火) 02:11:07面倒だから答えだけ教えてくれればいいのにという質問者のせめぎ合い
よくあることだけど、悲しいことだね
0971デフォルトの名無しさん
2009/01/06(火) 02:11:55そうだけど、この場合の filename と filename[0] はなんなのか説明できる?
0972デフォルトの名無しさん
2009/01/06(火) 02:12:41どちらもfilenameの先頭のアドレスじゃないですか?
0973デフォルトの名無しさん
2009/01/06(火) 02:13:54はいだめ
もういちど>>959を読み直すこと
0974デフォルトの名無しさん
2009/01/06(火) 02:16:29これと等価な他の書き方を書いて。
それと、これがどこのアドレスになるかを言ってみて。
&filename[0][MAX_SIZE]
0975デフォルトの名無しさん
2009/01/06(火) 02:16:37そろそろアドレスとか番地とかいう言葉から卒業すること
filenameは○○へのポインタ
filename[0]は○○へのポインタ
○○を埋めなさい
0976デフォルトの名無しさん
2009/01/06(火) 02:17:490977デフォルトの名無しさん
2009/01/06(火) 02:19:03違う
ポインタはアドレス(番地)と、指しているものの型をいっしょにした概念
0978デフォルトの名無しさん
2009/01/06(火) 02:22:53filenameはfilenameの先頭要素へのポインタ
filename[0]はfilenameの0番目の要素へのポインタ
0979デフォルトの名無しさん
2009/01/06(火) 02:25:33int型変数はどうなんでしょうか?
int型変数では、演算によるオーバーフローは発生しない
「はい」ですか「いいえ」ですか?
0980デフォルトの名無しさん
2009/01/06(火) 02:28:17発生する。
発生した場合、未定義動作。
0981デフォルトの名無しさん
2009/01/06(火) 02:28:33char 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で書き込んだからおかしくなった
わかったかな?
0982デフォルトの名無しさん
2009/01/06(火) 02:31:26違う
filenameはcharのSIZE個の配列5個の配列で、その先頭要素(charのSIZE個の配列)へのポインタになる
filename[0]はfilenameの0番目の要素(charのSIZE個の配列)で、その先頭要素(char)へのポインタになる
0983デフォルトの名無しさん
2009/01/06(火) 02:34:31とてもわかりやすい説明ありがとうございます。
今日教えていただいたことはだいたい理解したつもりですが、また忘れないように勉強しときます
0984デフォルトの名無しさん
2009/01/06(火) 02:35:54filename[0] と &filename[0][0]
ポインタとして演算をする時は、それぞれ同じように振る舞うということを覚えておくといいよ
0985デフォルトの名無しさん
2009/01/06(火) 02:41:24ポイントを絞った解説ありがとうございます。自分もまさにそのように覚えようとしていました。
下のようにプログラムを書きなおしたのですが、最後だけうまくいきません。
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.
となってしまいました。これはなぜでしょうか?
0986デフォルトの名無しさん
2009/01/06(火) 02:45:540987デフォルトの名無しさん
2009/01/06(火) 02:49:37で宣言していたのを
char filename2[20][MAX_SIZE];
で宣言すると解決しました。
配列は0から始まるので20個使いたいときは[19]で宣言すればいいのではないんでしょうか?
0988デフォルトの名無しさん
2009/01/06(火) 02:50:04バカな質問ですいません。
0989デフォルトの名無しさん
2009/01/06(火) 02:50:24使う時は0から使う
0990デフォルトの名無しさん
2009/01/06(火) 02:51:0220個使うときは[20]で宣言して[0]から[19]までの20個を使う
0991デフォルトの名無しさん
2009/01/06(火) 02:51:08配列の大きさは0スタートじゃないよ
0992デフォルトの名無しさん
2009/01/06(火) 02:51:23そうなんですか、知りませんでした。
初心者以下のミスをしてしまいました。どうもすみませんでした。
0993デフォルトの名無しさん
2009/01/06(火) 02:51:47limits.hを見る
0994デフォルトの名無しさん
2009/01/06(火) 02:53:01UCHAR_MAX
でぐぐれ
0995デフォルトの名無しさん
2009/01/06(火) 02:53:12#include <limits.h>
INT_MAX int 型最大値
UINT_MAX unsigned int 型最大値
0997デフォルトの名無しさん
2009/01/06(火) 03:31:50C言語なら俺に聞け(入門篇) Part 42
http://pc11.2ch.net/test/read.cgi/tech/1231180205/
0998デフォルトの名無しさん
2009/01/06(火) 03:34:370999デフォルトの名無しさん
2009/01/06(火) 03:47:47一発で区別を完全に理解できるものではないと、誰しも考えていると思います。そのたびごとに面倒がらずに振り返っていただければ。
>>981
お疲れ様です。頭が下がります。
1000デフォルトの名無しさん
2009/01/06(火) 03:48:3810011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。