C言語なら俺たちに聞け パート0001

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2012/07/07(土) 17:15:26.10
なんでも聞きなよ
2014/11/11(火) 11:22:25.45ID:QByfxOoU
>draw_mark = rand() % 4 + 1; //マークを決定する
1から4の乱数を0から始まる配列番号に当てはめるから。
2014/11/11(火) 14:20:44.02ID:fzwLZ9n2
それは、わかるんだが
>draw_mark = rand() % 4 + 1
これって、変数に1〜4 までを適当に決めてるだけで
どうして、配列と関係があるんですか?
2014/11/11(火) 14:36:12.21ID:CXWKhWIS
>>373 中の mark[draw_mark-1] で
なんで -1 してるん? という質問からの派生

配列のインデックスは 0 から開始する(リンク先ソースでは mark[0] 〜 mark[3] まで)
変数 draw_mark は 1 から4まで

この draw_mark を使って 配列の要素を正しくアクセスするのに -1 して帳尻をあわせてる
2014/11/11(火) 17:55:38.32ID:iIdIPRdi
>>376
ありがとうございます
2014/11/12(水) 07:45:05.87ID:/ZcTzOPa
typedef struct
{
int value;
} TEST;

TEST t = {1};
printf("%d\n",t);

環境:VC++2012 express

このコードで1が出力されるのは、C言語の仕様に合ってるんだっけ?
2014/11/12(水) 08:31:23.63ID:Kd9sZNKE
合ってるんじゃないの?
2014/11/12(水) 10:12:31.16ID:6b20czbE
変換指定と実引数があってないから未定義じゃない?
2014/11/12(水) 18:54:50.32ID:8RoZt+WE
ポインタ渡してるのかと誤読した。

まぁ未定義で、常識的にやるべきじゃない記述だな。
2014/11/12(水) 23:00:08.69ID:8UdI52J6
だよな。ありがとう。
2014/11/13(木) 14:12:51.43ID:fbX2c55U
メンバー変数がint型一つしかない構造体をつくる理由が思いつかん。
2014/11/13(木) 18:21:52.27ID:KUU70nma
>>378
その疑問が解消したとして
何かの役に立つのでしょうか?
2014/11/13(木) 23:22:17.48ID:RTKAZJeS
型保証したくてね。
typedefだと間違って引数に渡した時にコンパイルエラーにならないから。

で、普通のプリミティブ型でやってたのを構造体に置き換える作業中に
なぜかprintfで正しく出力されたんで、面倒臭いアクセス関数使わなくてもいいのかも
と思って聞いてみた。

Cで擬似オブジェクト指向やってると面倒臭すぎる。演算子のオーバーロードが欲しい。
改めてC++の偉大さ(謎)が分かったかもww
2014/11/13(木) 23:42:19.83ID:NUKISzLu
printfで型保証とな?
2014/11/14(金) 02:23:00.78ID:ZKHgRmzB
printfは可変長引数の関数だから第2引数以降の型を確認しないのでエラーが出ないでしょ。
sprintf、fprintf、scanf、、、など。
その引数をどう扱うかは関数によって様々
2014/11/14(金) 07:03:46.18ID:TIi0CXWz
固定長引数での関数の話。
printfとかは、もちろん値を取り出して渡すつもりだったんで、あれ?と思っただけ。
2014/11/14(金) 09:55:14.56ID:LHxJpsmN
引数のスタックへの積まれる方向と構造体のメンバーの並ぶ順番は一致するのかと考え…ることも無く「やるな!」の一択。
2014/11/14(金) 10:15:46.48ID:NoejJarl
printfの本体(vprintfだったかな)のソース眺めてみれば、答えが
2014/11/14(金) 11:51:06.29ID:ZKHgRmzB
#include <stdio.h>
typedef struct { int value; } TEST;
void pr(int data) { printf("%d\n", data); }
int main()
{
TEST t = {1};
pr(t); // ← コンパイルエラーになる
return 0;
}
をコンパイルすれば分かると思うけど型が指定されている関数だとエラーになる。
>>378は構造体TESTのデータ(つまりvalue==1のみ)がprintfに渡されたまたま表示されているだけ。

以下のコードが "111, 333" ではなく "111, 222" と表示される理由を考えると分かるかな?
#include <stdio.h>
typedef struct { int v1; int v2; } TEST;
int main()
{
TEST t = {111, 222}; int d = 333;
printf("%d, %d\n", t, d);
return 0;
}
2014/11/14(金) 12:01:18.41ID:ZKHgRmzB
そして、111, 222 と表示されるとしても
「たまたま」そう表示されているだけで
環境によっては変な表示になるかエラー
2014/11/14(金) 12:58:22.70ID:qPlOgKHi
それは未定義で終わり。ぐだぐだ書く必要はない
2014/11/15(土) 12:45:04.51ID:TpdAhqvC
>>393
賛成。
395デフォルトの名無しさん
垢版 |
2015/02/07(土) 03:31:09.68ID:ldaWMMkn
初めまして、
8〜12個のxy座標で囲まれた地域(歪な多角形)があり、調査対象の座標がその中にあるか、を判定する関数を作りたいのですが
どうすれば良いかが見当もつかず困っています。
判る方がおりましたらご教授下さい。
OSはLinuxです。
宜しくお願いします。
2015/02/07(土) 03:47:05.12ID:Y8QeCJm/
>>395
思いつきだけど
1. 囲まれた地域(歪な多角形)を囲み多角形に接しない(余白を大きめに取った)四角形をまず求める
2. 調査対象の座標から色を塗りつぶす
3. 囲まれた地域の外である、1.で求めた四角形のところを塗ろうとするなら、調査対象の座標は多角形の外側である
4. 1.で求めた四角形のところを塗らずに処理完了したら、調査対象の座標は多角形の内側である
でいかがでしょう。
2015/02/07(土) 04:38:10.19ID:G4SX7WFX
調査点と 範囲を決める頂点列 P(Xi, Yi) とのなす角(符号付)の総和が
360度ならば内包点 そうでないならば外の点
398デフォルトの名無しさん
垢版 |
2015/02/08(日) 00:12:37.99ID:jDoVco3x
ダブルポインタが理解できない。
int **pp;
int *p;
int n[] = {0, 1, 2};
pp = &amp;p;
p = n;
p++;
printf("**pp : %d", **pp);
これでなんで0じゃなくて1が出るの。だれかわかりやすく解説してくれ。
もしくは参考書教えて。たのむます。
2015/02/08(日) 01:36:05.41ID:HJEgExkV
始めにpは0のアドレスを指している。
p++でpは1のアドレスを指す。
*ppはpのアドレス、**ppはpの指す値。
2015/02/08(日) 01:56:25.70ID:EWNvntIT
BASICならPOKE/PEEK()/VARPTR()で分かる筈だけど、Cは変数とメモリを混ぜてるから分かりにくいよなw
BASICでプログラムを書いてると分かるけど、メモリを直接いじるプログラムは通常書かないから、Cの異常性が分かりやすいw
2015/02/08(日) 02:02:24.66ID:LUl61OMZ
>>398
> pp = &p;
> p = n;

順序逆だ
2015/02/08(日) 02:03:14.00ID:LUl61OMZ
と思ったら、問題ありませんね。失礼しました
2015/02/08(日) 02:08:51.18ID:EWNvntIT
だいたいBASICよりアトに出てるのに、どうして構文解析がBASIC未満なんだろうな?w
2015/02/08(日) 05:36:09.99ID:1pvsOI5Y
ダブルポインタなんて言葉無いのに
ポインタ知らない奴に限ってなぜかよく使う・・・・なぜだろう
2015/02/08(日) 05:41:46.72ID:EWNvntIT
[EXEファイル可] JavaScript統合開発環境 DX Studio [転載禁止]&copy;2ch.net
http://peace.2ch.net/test/read.cgi/tech/1423340731/l50
2015/02/08(日) 06:33:01.72ID:JKy44BG4
ポインタ自体わかってない。pp→p→n => pp→p→n+1
リンクやショートカットだってば。
2015/02/08(日) 08:18:59.68ID:aMsy6Zj7
トリプルポインタって使うことある?
***pとかw
2015/02/08(日) 09:17:17.46ID:HJEgExkV
なんかで使ったけど忘れたw
たぶん二次元配列を動的に確保したとかだと思う。
2015/02/08(日) 11:13:47.14ID:LUl61OMZ
3次元配列はなにも不思議じゃないと思うけど
410デフォルトの名無しさん
垢版 |
2015/02/08(日) 11:24:11.39ID:b/2xM+wa
ポインタって良く考えると難しい概念だよな
アドレスに関連付けられた値をさらにアドレスに使えてしまうっていうのが
なんかメタ的っていうか、ラッセルのパラドックスみたいなのが導けそうっていうか
2015/02/08(日) 11:34:02.67ID:HJEgExkV
言葉だけで理解しようとすると少し難しいと思うんだよね。空間的というか。
2015/02/08(日) 12:36:31.90ID:jgXa3G6y
>>407
4つだってふつうにある
http://peace.2ch.net/test/read.cgi/tech/1313183984/783
2015/02/08(日) 12:50:40.02ID:EWNvntIT
VARPTR(VARPTR(VARPTR(VARPTR(プッ
2015/02/08(日) 19:49:14.84ID:aMsy6Zj7
既にポインタのポインタになっている変数のアドレスを
さらに関数へ渡してとなるとポインタマネギ化するのか。
2015/02/08(日) 21:58:46.51ID:IGJ2gQC3
ポインタで躓くなら、学部生向けのコンパイラの教科書でも読めばいいよ
416デフォルトの名無しさん
垢版 |
2015/02/08(日) 23:39:37.22ID:b/2xM+wa
>>395
点から適当な直線を引く
多角形を構成する線分との交点を全て列挙する
多角形との最も近い交点に注目して
その交わり方が、多角形を出る方向だったら内部、入る方向だったら外部
2015/02/09(月) 01:57:19.52ID:8ymQbzzq
>>415
CPUの動作原理と無関係で、表記法の独りよがりw
Cは構文解析が弱すぎるw
2015/02/09(月) 10:19:57.45ID:3ys1NOC1
EOFって、異常終了ですか?
それとも、\0を見つけると終了ですか?
419デフォルトの名無しさん
垢版 |
2015/02/09(月) 11:29:20.95ID:ra7crE5d
End Of File
ファイルの終わりです。異常ではない。
\0のないファイルもあるから、\0と関係ないきがする。
実際は、\0がきてたりする。よくしらべないと…
2015/02/09(月) 11:31:32.68ID:ra7crE5d
よんだぶんがファイルの長さになったらEOFだ
2015/02/09(月) 11:48:42.43ID:3ys1NOC1
ありがとうございます
422デフォルトの名無しさん
垢版 |
2015/02/10(火) 22:26:06.33ID:4T1+8uzu
スクラッチと言うソフトで作ったゲームをc言語に変換できますか?
2015/02/10(火) 23:08:36.76ID:MwNGRsKL
無理
2015/02/18(水) 10:50:01.57ID:fCZqCpe/
int i;
char str[] = "123";
i = atoi(str)+1
これ実行すると、124 になるけど何で?
2015/02/18(水) 11:28:39.01ID:Qnb1PJ0H
>424

ttp://hitorilife.com/atoi.php

>int atoi( const char *str );

>文字列で表現された数値をint型の数値に変換する。

>■戻り値:
>int型に変換した数値。変換不能文字は0を返す。
2015/02/19(木) 10:32:04.25ID:uIx5aNyO
構造体の入れ子って、何のためにあるの?
2015/02/19(木) 11:48:13.04ID:RKbGb38x
プログラマーの美学のため。
2015/02/19(木) 11:58:25.94ID:w9sqbTXr
大抵こういう質問するやつは解ってて聞いているただの釣り。
429デフォルトの名無しさん
垢版 |
2015/02/28(土) 17:34:04.33ID:ww/ZmHX+
解ってて聞いているただの釣りとか言論封殺すんな
お前の書き込みより釣りの方がまし
2015/03/02(月) 11:24:54.39ID:xHwYTsX+
x=(r=v)は
r=v;x=r;なの?
r=v;x=v;なの?
2015/03/02(月) 13:08:11.11ID:VMX5RoB1
x=(r=v)は
t = v;
r = t;
x = t;
という感じ
2015/03/05(木) 13:59:25.35ID:QH4sjdfE
for(i = 0; i < 100; i++)

if(i % 2)

printf("%d ",i);

超初心者ですけど、この逆ってどうすればいい?
2 4 6 8・・・ ってやりたいんですけど
2015/03/05(木) 14:08:13.95ID:0g2YeNLY
その1
 if(i % 2) → if(!(i % 2))

その2
 if(i % 2)
  ;
 else
  printf("%d", i);
2015/03/05(木) 18:11:29.80ID:QH4sjdfE
ありがとうございます
2015/03/20(金) 10:27:58.80ID:C4XIy6Zr
void mystrcpy(char *to, char *from);
int main(void)
{
char str[80];
mystrcpy(str, "これはテストです");
printf(str);
return 0;
}
void mystrcpy(char *to, char *from)
{
while (*from)
*to++ = *from++;
*to = '\0'; /* ヌルで文字列が終わる */
}

「 ヌルで文字列が終わる」 ヌル文字って、なんで必要なんですか?
2015/03/20(金) 12:09:15.02ID:lqHpR73F
終わりを示すマークがくるまではずっと続きますよ
という約束なのが文字列の約束

何故必要か? 文字列であるためには、そういう約束だから
2015/03/20(金) 15:59:48.11ID:0fslPpGI
BASICでは先頭に文字数でその後に文字列が続いてたっけ。
2015/03/20(金) 17:30:48.90ID:zxNcWGv0
MS-DOS の文字列表示ルーチンは $ が終端。
2015/04/07(火) 14:41:52.97ID:s4QIRInr
int main()
{
max(100);
max(70);
max(50);
return 0;
}
void max(int d)
{
static int max = 0;
if(d > max)
max = d;
printf("max = %d\n", max);
}
全部0になるはずなのに、ならないのはなんで?
2015/04/07(火) 15:03:24.16ID:NM1cRlIv
maxはコンパイル時に0で初期化
その後dを代入してるのでmax == d
2015/04/07(火) 16:18:30.41ID:F8K01pe/
変数名と同じ関数名はかんべんして 目がすべる
2015/04/07(火) 18:27:32.55ID:s4QIRInr
なんで代入できるの?
2015/04/07(火) 18:34:58.75ID:zRL0y0Ru
静的変数でググレ。
2015/04/07(火) 19:47:29.06ID:NM1cRlIv
static int max = 0; 
この行はプログラム実行時の最初の一回だけ実行される。
max()を呼んだ時は既に初期化済みで、その行は通らない。
2015/04/07(火) 19:52:56.64ID:/U9ZAOiy
>>444
実装としては現実的には実行されるとはいいがたい
2015/04/07(火) 19:57:58.88ID:NM1cRlIv
実行…とは言わないか。
2015/04/07(火) 20:03:03.06ID:2bTHzj+B
static変数の定義を含む関数が利用(参照)されない場合、そのstatic変数は確保されない。
2015/04/07(火) 22:14:13.33ID:+jnVw/lV
ほんとけ?
2015/04/07(火) 22:53:39.52ID:Jv2W+PKW
初期化されない、じゃないかなぁ。
2015/04/07(火) 23:06:35.68ID:2bTHzj+B
これでファイルサイズを試せ

int f(int i) {
static int a[10000000];
a[i]++;
return a[i];
}
2015/04/07(火) 23:11:56.93ID:2bTHzj+B
こうしないとダメか

int f(int i) {
static int a[10000000] = {1};
a[i]++;
return a[i];
}
2015/04/07(火) 23:28:33.42ID:NM1cRlIv
static int a[10000000]; と
static int a[10000000] = {1}; では、確保されるサイズは同じだと思うが..
2015/04/08(水) 13:38:35.94ID:0NyqAI50
違うよ。
前者は内容が不定値で、初期化に使う値が実行ファイル内に保存されない。 メモリ上に同じ大きさが確保されてもファイルサイズには反映されない。
ちなみに0初期化される領域も初期化値を実行ファイルに保存するのではなく、0クリア専用のランタイムルーチンを使うらしい。

てなわけで、処理系の実装上の工夫が色々とあるのでそもそもファイルサイズを見て変数が確保されるかどうかを判断しようとするのが間違い。
2015/04/08(水) 13:48:58.91ID:BJMRBHYu
ファイルサイズが違うって事か。
実行時に確保されるメモリサイズは同じだよね。
2015/04/08(水) 14:02:32.29ID:0NyqAI50
そう。
2015/04/08(水) 18:59:10.06ID:TrrKWYIM
>>453
>0クリア専用のランタイムルーチンを使うらしい。
ランタイムというか、OS 内のローダー担当であることが大半でないだろうか‥
2015/04/08(水) 19:50:19.62ID:0NyqAI50
せやな
2015/04/10(金) 16:04:47.86ID:mQuRC+MO
char *str;
で宣言したあとに
scanf("%s",str);
とすると「strを初期化せずに使うな」みたいなエラーが出ます
char str[10];
みたいに配列で宣言するとエラーは出ません

ポインタで宣言した時のと配列で宣言した時のstrは同じ物ではないんですか?
あと値が使われるわけでもなく、入力されるだけなのに初期化しなければいけない必要性がわかりません
誰か教えてください
459デフォルトの名無しさん
垢版 |
2015/04/10(金) 16:10:54.97ID:28dWQn3h
new mallocつかえ
460デフォルトの名無しさん
垢版 |
2015/04/10(金) 16:19:01.09ID:28dWQn3h
C言語の初歩の初歩。
char str[10];とchar *str;は別物。
char *strはアドレスを入れるための変数。アドレスを記録するための容量は確保されてるが10バイト分などは確保してない。

これだったらいけるはず。
char str[10];
char *str2;
str2=str;
scanf("%s",str2);
2015/04/10(金) 22:39:13.59ID:9kdbIScz
>>458
ポインタ変数である、char* str の strは、
アドレスという数値を1つ格納するだけの唯の変数。

それに * を付けると(*str)、そのアドレスが指し示す先のメモリ
にリンクする「ショートカット」になるだけ、と考えると分かり易いかな。

Windowsでショートカットファイルをダブルクリックしたらその先のファイルが開くようなもので
そうすると当然、指し示す先のファイルパスが設定されていないショートカットは「使えない」
というのが分かるよね?
2015/04/10(金) 22:50:25.12ID:9sVpyOtZ
>>458
>strを初期化せずに使うな
それは多分おせっかいな警告機能で、どんなコンパイラでもそうなるとは期待してはいけない

>ポインタで宣言した時のと配列で宣言した時のstr
は別ものだ、そう思い込んだほうがいい

なお蛇足だが C で配列の名前を単独で使うときは意味が変わる(この部分だけ直交性を失っている)
2015/04/24(金) 11:12:04.16ID:f3vcgjob
if (scanf("%d", &v) != 1)
この1って何?
2015/04/24(金) 11:21:00.79ID:NRswMTwP
scanf の戻り値は、フォーマットに従い変数に代入した個数

1変数ならまあ好きに書けば良いけど
2変数以上の時に間違わないよう習慣付けているのかもしれない
2015/04/24(金) 12:17:49.38ID:f3vcgjob
意味がわからん・・・orz
2015/04/24(金) 12:24:53.38ID:NRswMTwP
入力文字がアルファベットしかなくて vに整数をつっこんでねーよ って時は
1 にならない
2015/04/24(金) 13:27:44.24ID:f3vcgjob
>>466
ありがとうございます
2015/09/14(月) 15:55:47.87ID:xWDGmwXQ
C言語初心者です。
windows7
MinGWのgccバージョン4.8.1です。

/*スタート*/
#include <stdio.h>
int main(void){
float pai,r,s;
printf("半径を入力してください=");
scanf("%f&r");

pai=3.14159;
s=pai*r*r;

printf("面積は%fです\n",s);
return 0;
}
/*終わり*/

円の面積を求めるプログラム作りました。コンパイルするのはうまくいくんですが、実行して半径を入力すると○○○.exeは動作を停止しました。とエラーダイアログが表示され結果が出力されません。
何が原因でしょうか?
2015/09/14(月) 16:17:23.72ID:EUIVB/8j
>>468
scanf("%f&r");
ではなくて、
scanf("%f",&r);
2015/09/14(月) 16:23:27.10ID:hfKV6tF/
よくわからんけど、gcc 拡張の警告でチェックしてくれんの?
フォーマット文字列 と 渡した引数数の不一致
2015/09/14(月) 16:56:53.27ID:EUIVB/8j
>>468
のプログラムをgcc 4.8.1でコンパイルしたら
エラーメッセージは出なくて、実行したら
当然ながら、面積の値が0.000000と誤まった
値が出てきた。
エラーメッセージが出ないのが不思議。
オプションを付ければ、エラーメッセージがでるのだろうか
2015/09/14(月) 18:33:12.41ID:92FX1eX2
int scanf(const char *format, ...)

int printf(const char * restrict format, ...);

そういうことで。
2015/09/14(月) 19:00:53.16ID:xWDGmwXQ
>>469
ありがとうございます。
実行することができました。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況