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

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

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

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

前スレ
C言語なら俺に聞け(入門篇) Part 42
http://pc11.2ch.net/test/read.cgi/tech/1231180205/
過去スレ
  http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
2デフォルトの名無しさん:2009/01/24(土) 19:35:18
C はひどい言語だ。これは、多くの平均以下のプログラマーが
使ってるためにさらに輪をかけてゲロゲロになっていて、どうし
ようもないゴミが簡単に生産されるようになってる。正直いって、
C++ を選ぶ理由が C プログラマーを追っぱらうため *だけ* だっ
たとしても、それ自体、C++ を使う強力な理由になりうる。

Linus Torvalds
3デフォルトの名無しさん:2009/01/24(土) 19:40:24
この世界にはLinus Torvaldsが何人いるんだ
4デフォルトの名無しさん:2009/01/24(土) 20:39:19
構造体ポインタを引数として関数に送って、
構造体ポインタを戻り値としたいときはどうすればよいのですか?

STRUCTURE player_entry(STRUCTURE ptr, int count)
・・・
 return ptr;
{
・・・
ptr = player_entry(ptr, count);
・・・

このようにしたらエラーになってしまいます。
5デフォルトの名無しさん:2009/01/24(土) 20:56:51
STRUCTURE型の定義を見ないことにはわからないが、
たぶん、こう
STRUCTURE *player_entry(STRUCTURE *ptr, int count)
6デフォルトの名無しさん:2009/01/24(土) 21:15:20
>>5
たぶんできました。ありがとうございます。
関数名に*をつける発想はありませんでした、、
7デフォルトの名無しさん:2009/01/24(土) 21:22:03
関数名につけてるわけじゃねーぞw
8デフォルトの名無しさん:2009/01/24(土) 22:30:04
void serch_name(LIST list)
という関数内で社員名を入力させて
その社員が構造体のメンバ(list->name)にあるかどうか調べたいんですが
どーすればいいか分かりません。

while(line != NULL){
・・・・
line = line->next;
}
この形で走査したいんですが
よろしくお願いします。
9デフォルトの名無しさん:2009/01/24(土) 22:33:19
nameの型が何か知らないけどchar[]かchar*ならstrcmpを使え
10デフォルトの名無しさん:2009/01/24(土) 23:29:50
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
 そんなことよりyahooきっず「どんな''ジャンボ''が食べたい?」に投票しようぜwwwwwwwww
 ジャンボピーマンを一位にして餓鬼共を泣かせようwwwwwwwwww
 現在1位 yahooの工作開始までに2位のたこ焼きを突き放す

 http://kids.yahoo.co.jp/         _人人人人人_
                        >鶴職人募集中<
                         ̄ Y^Y^^Y^Y^ ̄

 ↓本スレ
 http://takeshima.2ch.net/test/read.cgi/news4vip/1232801214/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
11デフォルトの名無しさん:2009/01/24(土) 23:51:33
変数をNULLで初期化する利点は何ですか。
12デフォルトの名無しさん:2009/01/24(土) 23:53:05
変数を初期化しないこと自体問題が多過ぎる。
初期化しない奴は初期化忘れによるバグを大量に発生させる。
13デフォルトの名無しさん:2009/01/25(日) 00:02:25
>>11
初期化するかしないかは変数による
NULLでするかどうかも変数による
14デフォルトの名無しさん:2009/01/25(日) 00:35:07
質問です。
たとえば、char *p="abc"というポインタ変数があって、
それには何かきまったアドレスがあるわけです。
そのアドレスを別のアドレスに変えるにはどうすればいいんですか。
15デフォルトの名無しさん:2009/01/25(日) 00:37:15
>>14
p = でなんでも代入すりゃいいだろ
16デフォルトの名無しさん:2009/01/25(日) 00:49:19
ポインタ変数のアドレスを変えたいなら別のポインタ変数を作って代入すればいいと思うよ。
17デフォルトの名無しさん:2009/01/25(日) 00:54:26
>>ポインタ変数があって、それには何かきまったアドレスがある
「それ」は、ポインタ変数を指示しているので、pのアドレスのこと、つまり、値としては、&pである。
これを変えるのは、難しい。アセンブリレベルでコードを書き換えてからコンパイルするか。バイナリをハックするか。
18デフォルトの名無しさん:2009/01/25(日) 00:59:42
>>17 (・∀・)ニヤニヤ
19デフォルトの名無しさん:2009/01/25(日) 01:00:57
>>17
アセンブリの段階で変数とか消滅してるけどな
20デフォルトの名無しさん:2009/01/25(日) 01:01:18
変数じゃなくて変数名p
21デフォルトの名無しさん:2009/01/25(日) 01:06:56
何この糞な流れ
22デフォルトの名無しさん:2009/01/25(日) 01:10:06
もっとがんばろうぜ
23デフォルトの名無しさん:2009/01/25(日) 01:30:26
while(c<11){
a=strcmp(pnt[b],pnt[c+1]);
if(a>0){
b=c+1;
}
c++;
}
エラーは起きないのにこのwhile文にだけ入らないみたい。
なんで??
ちなみにC=0です。
これ以外のどこかがおかしいから入らないのかな?
24デフォルトの名無しさん:2009/01/25(日) 01:32:10
とりあえずc==0なのか出力して確かめろよ
25デフォルトの名無しさん:2009/01/25(日) 01:39:38
>>23
whileに挿れる前の、初めてのcが11以下なのか、どうなのか?チェキして
26デフォルトの名無しさん:2009/01/25(日) 01:39:57
>>24
あー。
何かいけたかも。
27デフォルトの名無しさん:2009/01/25(日) 02:50:04
小数点の計算なんですけれど
int a = 130;
int b = 100;
double c;

c = a / b;

こうするとエラーが起こります。
よろしくお願いします。
28デフォルトの名無しさん:2009/01/25(日) 03:16:05
エラーメッセージ書いて
29デフォルトの名無しさん:2009/01/25(日) 03:16:15
>>27
ちゃんとcは1になると思うが、どういうエラーが起こるんだ
3027:2009/01/25(日) 03:48:53
>>28
>>29
申し訳ないです。
bの値が0であったためエラーが起きたみたいです。
31デフォルトの名無しさん:2009/01/25(日) 04:08:27
>>27でどうしてbの値が0になるのか不思議だ
32デフォルトの名無しさん:2009/01/25(日) 05:14:40
型の違いに対する警告じゃね?
33デフォルトの名無しさん:2009/01/25(日) 05:16:05
>>27
cに代入した値は、何か別の場所で使ってる?
34デフォルトの名無しさん:2009/01/25(日) 07:55:48
ヘッダーファイルをインクルードせずにコンパイルおよび実行できてしまったのですが
これは何でですか?

具体的には
int main(void)
{
printf("%f\n", sqrt(3));

return 0;
}
です。
stdio.h math.h をインクルードしないとエラーが出ると思ったのですが・・・

環境は cygwin gcc 3.4.4です。
コンパイルオプションなどは特に設定してません。
35デフォルトの名無しさん:2009/01/25(日) 08:27:22
どのエラーを期待してるのかわからないが、-Wall をつければ
いくつか警告がでるはず。

一般的に必須なのは math.h
sqrt() の返り値が double であると宣言する必要がある。

ただし、gccはprintfのフォーマット演算子の解析しているので、
"%f"から double を類推できて、問題なく動いているのだと思う。
3634:2009/01/25(日) 09:14:06
>>35
数年の記憶ではエラーが出たような気がして。

-Wall試してみました。警告出てきました。
ですが、エラーにならないならインクルードする必要がないってことになってしまいませんか?
それとも、このエラーにならないってのはgccの仕様であって、
C89やC99では認められてなかったりするのでしょうか?
37デフォルトの名無しさん:2009/01/25(日) 09:15:15
数年前の記憶では
です。
38デフォルトの名無しさん:2009/01/25(日) 11:46:29
>>36
コンパイルエラーのことを気にしてるのなら、文法的に間違ってない
のだから、コンパイルは通るだろう
39デフォルトの名無しさん:2009/01/25(日) 11:56:44
コンパイラ依存だな。
今の gcc は double sqrt(double) だってインクルードしなくても知ってて、
それでうまく動くだけに過ぎない。
規格合致の挙動では、
関数プロトタイプのない状況では sqrt(3) とすると
int sqrt(int) であるかのように sqrt を呼び出すので変になる。
40デフォルトの名無しさん:2009/01/25(日) 13:08:23
>それとも、このエラーにならないってのはgccの仕様であって、
>C89やC99では認められてなかったりするのでしょうか?
そのとおり
41デフォルトの名無しさん:2009/01/25(日) 13:27:18
>>38
未定義だから、コンパイル出来なくても良いんじゃない?
4227:2009/01/25(日) 14:21:33
>>31
>>32
>>33

int a,b;
double c;
a=10;
b=20;
c = a / b;
こうすると0.0000となってしまいます。
ただしい計算するにはどうすれば良いですか?
43デフォルトの名無しさん:2009/01/25(日) 14:31:28
c = (double)a / b;
または
c = a / (double)b;

c = a / bは、double = int / intだから、intで評価したあと暗黙的にdouble型にキャストされて代入される。
整数型の/演算は、少数切捨てになるので、a / b == 0これが、double型にキャストされてcにdouble型で0を表すビット列が代入される。
4427:2009/01/25(日) 14:35:11
>>43
ありがとうございます。
正しい計算ができるようになりました。
45デフォルトの名無しさん:2009/01/25(日) 15:16:05
新しく買った教本に
「複合文に特有の変数はその複合文内で宣言して利用せよ」
とあるのですが、本当でしょうか?
前の教本では特にそういう記述は無く、
ローカル変数はすべてその関数のはじめで宣言されていますが、
どちらが一般的なんでしょう?

46デフォルトの名無しさん:2009/01/25(日) 15:22:07
>>45
新しい本のほうを信じろ。
変数の有効範囲はできるだけ限定されていたほうが、また未初期化の状態を減らすほうが
後から、または他人が見たときに追いかけやすい。

さらにその考えを進めた結果、Cを元にした言語のすべて、そしてC自身の最新の規格では
変数の宣言は複合文の先頭である必要さらなくなっているほどだ。

確かに、関数先頭で全部宣言するやり方も根強いがもう古い。
47デフォルトの名無しさん:2009/01/25(日) 15:26:37
返信ありがとうございます。今度からそのようにします。
ただデバッガがどうのとか見た気がするのですが。
まあこのレベルでは使わないだろうから別にいいのですが。
48デフォルトの名無しさん:2009/01/25(日) 15:50:13
複合文に特有な変数なんてものが出てくるほど長い関数書かない人間には関係なかったりする
49デフォルトの名無しさん:2009/01/25(日) 16:01:56
変数宣言が昔は関数の先頭に限定されていたのは、
そのほうがコンパイラが楽だったからですか?
速度の問題とかはありますか?
50デフォルトの名無しさん:2009/01/25(日) 16:03:50
コンパイラの実装が楽だったから(コンパイルが高速に行えたから)だろうと思う。
51デフォルトの名無しさん:2009/01/25(日) 16:06:11
>そのほうがコンパイラが楽だったからですか?
そう
>速度の問題とかはありますか?
処理がコードを字面どおりに追うならあるかないかの差があったかもしれない
でも今のコンパイラならきっと最適化されて同じになる
52デフォルトの名無しさん:2009/01/25(日) 19:03:15
>>17
ポインタのポインタを使えばいいだけの話
全然難しくねえよww
53デフォルトの名無しさん:2009/01/25(日) 19:11:53
int i = 0;
int j = 1;
&i = &j;

このコードはどうしてエラーになるのですか?
54デフォルトの名無しさん:2009/01/25(日) 19:13:31
ポインタじゃないから
55デフォルトの名無しさん:2009/01/25(日) 19:22:26
>>52
すげえずれててワロタw
56デフォルトの名無しさん:2009/01/25(日) 19:25:28
>>51
&演算子はオペランドへのポインタ値を生み出す。
これは左辺値ではない(代入できない)。
57デフォルトの名無しさん:2009/01/25(日) 19:32:18
0 = 0;

このコードはどうしてエラーになるのですか?

と本質的に同じ。
58デフォルトの名無しさん:2009/01/25(日) 19:52:43
0と0だから等号であってるんじゃないのか?
なぜエラーにする必要があるんだ?
代入を:=にしたらいいだけだろ。
59デフォルトの名無しさん:2009/01/25(日) 20:01:10
ここはCスレだ。
Pascalerは巣に返れ
60デフォルトの名無しさん:2009/01/26(月) 04:23:40
float型の変数をprintfで表示したときに小数点以下の桁数を2桁くらいにしたいんですが、どうすればいいのでしょうか?
61デフォルトの名無しさん:2009/01/26(月) 04:28:08
%.2f
62デフォルトの名無しさん:2009/01/26(月) 08:35:54
詳しい方が多いようなので聞いてください
C言語のリスト構造について僕は疑問があります。
リスト構造の結果をVCのウィンドウで表示してます
struct list{
int b;
char *str;
*next;
}
この構造体をリスト構造に組み込みました。
*strには、メモリ確保した文字列+ヌル文字が入ってます。
struct list *p;
簡略。メモリにリストを作成
p = head;
while(p != NULL){
簡略
p->next =p;
}
で結果表示させます。入力数10、表示結果は10個の数字、文字列がでました。
ここから質問なのですが、結果を表示させ、プログラムを終了させず、また同じポインタに別の10個のリストを作成し、同じリスト構造に入れました。
p = head;
while(p != NULL){
簡略
p=p->next;
で、また結果を表示。入力10、表示結果は10個の数字。
この後、メモリを開放した場合、僕は使用した20個のメモリ解放すると考えてました。
ですが、結果、開放したのは10個のメモリでした。メモリリークしてないかデバッグしましたがリークしてませんでした。
前部の10個のメモリ部分と、確保した文字列部分のメモリはどうなったのでしょうか?動作が分かる方よろしくお願いします。
63デフォルトの名無しさん:2009/01/26(月) 08:41:34
>>62
リークしてます。ええ。
6462:2009/01/26(月) 08:59:01
>>63
// メモリリーク検出
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

僕もおかしいだろと思って終了した際、メモリリーク検出つけたんですけど、引っかからないんですよね・・・
繋がりがなくなったら、検出されないのかな
65デフォルトの名無しさん:2009/01/26(月) 09:03:24
どう考えてもリークしてます。ええ。
66デフォルトの名無しさん:2009/01/26(月) 09:26:05
>>62を読むと以下のような処理に見えるんだけどどう見てもメモリリークです。
ばっちり検出されるよ?
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
int _tmain(int argc, _TCHAR* argv[])
{
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
int i, *p;
for (i=0; i<2; i++) {
p = (int*)malloc(10);
}
free(p);
return 0;
}
67デフォルトの名無しさん:2009/01/26(月) 11:25:16
>>62
ついでに、「簡略」という言葉の意味も調べておくといいよ。
68デフォルトの名無しさん:2009/01/26(月) 11:25:20
>この後、メモリを開放した場合、僕は使用した20個のメモリ解放すると考えてました。
まずここからおかしい。
pが指していたリスト構造を開放せずにpに別の場所を指させてしまったら
古いメモリを開放する手段はなくなってしまう。
69ワカメ:2009/01/26(月) 13:06:07
これって行儀が悪いですか?
#define AGE "ヌルポ!"
char *p;
p=AGE;
これでできてしまうから、よくわからね。
char *p;
char st[]=AGE;
p=&st;
これのほうがいいのかな?
70デフォルトの名無しさん:2009/01/26(月) 13:34:16
上は
const char str[] = "ヌルポ";
と同じ
それとどっちもpには何の意味もない
もっとポインタと文字列ってか配列について学んでは?
71デフォルトの名無しさん:2009/01/26(月) 13:42:37
どういう神経していればそんなとんでもないことを書けるんだろうか。

>>69
何をしたいのか判らんから、行儀がどうのと言われても判断できんよ。
書き換えが目的なら、前者は言語道断だが。
72デフォルトの名無しさん:2009/01/26(月) 14:18:34
char
シャア
73デフォルトの名無しさん:2009/01/26(月) 18:25:57
入門書を終えた程度ですが、このレベルでも理解できる
優良なオープンソースのプログラムがあれば教えて下さい。
74デフォルトの名無しさん:2009/01/26(月) 19:20:58
文法さえ把握していればどんなコードも
頑張れば理解できるよ!
75デフォルトの名無しさん:2009/01/26(月) 20:02:41
ポインタって会社とかプログラム組む上で使うの?
やっぱポインタもちゃんと理解しないとだめかな
76デフォルトの名無しさん:2009/01/26(月) 20:10:51
当然使う
使えて当然
77デフォルトの名無しさん:2009/01/26(月) 20:23:26
構造体にある文字型配列の要素を削除したいのですが、どうすればよいのでしょうか?

strcpy((ptr+player)->name,'\0');
(ptr+count)->money='\0';

これではエラーになっていまいます。
78デフォルトの名無しさん:2009/01/26(月) 20:26:17
nameとmoneyの型は何?
79デフォルトの名無しさん:2009/01/26(月) 20:28:03
ptrとplayerとcountの型も聞いておこうか
80デフォルトの名無しさん:2009/01/26(月) 20:29:10
エラーが出るならエラーメッセージも書けよ。
81デフォルトの名無しさん:2009/01/26(月) 20:30:04
>>75
正直、使わない(まともな)プログラムが想像できない。

しかし、皆何故ポインタに拒否反応示すんだ? ものすごくシンプルな概念だと思うんだけど。
「難しい」「難しい」って騒ぐから難しいと思い込んでしまってるだけなんじゃないかなぁ。
8277:2009/01/26(月) 20:40:51
ちょっと追加します

printf("No.%2d:%sを削除します\n",player+1, (ptr+player)->name);
if((player+1) == count){
strcpy((ptr+player)->name,'\0');
(ptr+count)->money='\0';
return ptr;
}

>>78
name:char
money:int

>>79
ptrは構造体のポインタです
playerとcountはint型です

>>80
strcpy((ptr+player)->name,'\0');
この部分で「メモリがreadに〜」というエラーがでます。
'\0'に普通の文字列をいれると動きます
83デフォルトの名無しさん:2009/01/26(月) 20:44:46
>>82
'\0' の代わりに "" とか "\0" とか
8477:2009/01/26(月) 20:47:28
>>83
できました。
ありがとうございます。
・・・(゜゜;)なぜ?
85デフォルトの名無しさん:2009/01/26(月) 20:51:38
>"\0"
愚の骨頂。
86デフォルトの名無しさん:2009/01/26(月) 20:52:13
>>83
'\0'は整数値、""は文字配列。
87デフォルトの名無しさん:2009/01/26(月) 20:52:55
>>85
どうしてそう思うのか理由を述べよ
8877:2009/01/26(月) 20:56:51
>>86
charなら'\0'も格納できると思ったのですが。
事実、前作った時は格納できましたし。
構造体になるとまた勝手が変わるのですかね。
89デフォルトの名無しさん:2009/01/26(月) 20:58:26
>>88
こんなん?
(ptr+player)->name[0]='\0';
90デフォルトの名無しさん:2009/01/26(月) 20:58:28
文字列として利用するのが目的ならば、""で充分だから。
例えばどこぞのAPIのように、文字列リストを終端させるために必要な場合などはこの限りではない。
91デフォルトの名無しさん:2009/01/26(月) 20:59:01
>>88
いいえ、あなたは何か勘違いをしています。
9277:2009/01/26(月) 21:00:27
>>89
あーなるほど。たしかにそうです。
理解しました。
9377:2009/01/26(月) 21:17:57
すみません、もう一つ聞きたいのですが、
関数から戻ってきたときに要素が削除されたかどうかを確認したいときはどうすればよいのでしょうか?

if((ptr+count-1)->name == "\0"){

こうして、最後の要素がNULLになったかどうかで判断しようとおもったのですが、うまくいきません。
94デフォルトの名無しさん:2009/01/26(月) 21:19:13
>>93
strcmp(ptr[count - 1]->name, "")
or
ptr[count - 1]->name[0] == '\0'
95デフォルトの名無しさん:2009/01/26(月) 21:20:02
>>93
strcmpもしくは先頭要素と比較
結局何も分かってないじゃん
96デフォルトの名無しさん:2009/01/26(月) 21:20:09
nameがchar *なら文字通りNULLと比較ができるので、(ptr + count - 1)->name == NULL
97デフォルトの名無しさん:2009/01/26(月) 21:21:53
ヌルストリングにすることをもって削除とする処理において、ヌルポインタであるかどうかの判定を行って何が得られるのか
9877:2009/01/26(月) 21:24:35
あー
if((ptr+count-1)->money == '\0'){
これと間違えてました

でも>>94さんのやりかたでやってみたいとおもいます。
99デフォルトの名無しさん:2009/01/26(月) 21:40:02
->この演算子嫌いなんだけど何とかならない?
100デフォルトの名無しさん:2009/01/26(月) 21:42:28
(*p).member
101デフォルトの名無しさん:2009/01/26(月) 21:42:33
>>99
ドットで置き換えればいいと思うよ。
pointer->memberは常に(* pointer).memberだから。
102デフォルトの名無しさん:2009/01/26(月) 21:45:18
>>100>>101
さんくす
103デフォルトの名無しさん:2009/01/26(月) 22:38:13
むしろ.が嫌いでどうしようもない俺
(&struct)->member なんてやったりはしないけど
104デフォルトの名無しさん:2009/01/26(月) 23:07:43
(* pointer).member
ってよく使われるの?
この前派遣社員のおっさんプログラマが
使ってたんだけど、
「うちのコーディング規約では認められません」
って速攻却下したんだが。。
105デフォルトの名無しさん:2009/01/26(月) 23:09:29
>>104
そんなの分からないようなやつがレビューするなよ。
106デフォルトの名無しさん:2009/01/26(月) 23:14:02
わからないことはないけどさ。。

一般的に使われるのかどうか
知りたかったんだよ。
うちの会社にはそういう書き方するひといなかったから。。
107デフォルトの名無しさん:2009/01/26(月) 23:22:31
そういう風に書く奴は死ねばいいと思う。
108デフォルトの名無しさん:2009/01/26(月) 23:30:08
わざわざあるものを使わなくする意味が分からない
気に入らないからとか他の書き方するって
#define BEGIN {
と本質的に何が違うの?
109デフォルトの名無しさん:2009/01/26(月) 23:33:58
*(array + n) みたいなのも死ねばいいと思う。
array[n] でいいだろと。
110デフォルトの名無しさん:2009/01/26(月) 23:37:23
>>109
それはポインタ演算の方が高速だと信じ込んでいるロートルがよく書く。
若いのに書いている奴は、入門書か先輩に恵まれなかったのだと思う。
111デフォルトの名無しさん:2009/01/26(月) 23:45:37
array[n] は *(array + n) のシンタックスシュガーなのにね。
同じものにコンパイルされなかったら処理系は規格非準拠になる。
112デフォルトの名無しさん:2009/01/26(月) 23:49:01
>>109
この書き方じゃ、古い、最適化のかからなかった時代のコンパイラでも早くならないな。
113デフォルトの名無しさん:2009/01/27(火) 00:16:47
*(array+n)は使わないが、scanf()の中ではarray + n
114デフォルトの名無しさん:2009/01/27(火) 00:19:36
配列とポインタを(記法の上では)全く同等に扱えることをわかっている上で
ポインタには*(p+n)、配列にはarray[n]を使う人は居るよ。
実際、(pがレジスタ割付されない場合)参照のコストが違うんだから。
115デフォルトの名無しさん:2009/01/27(火) 00:19:55
>>113
そう書きたくなることもあるが
1要素のアドレスを取るという意味を込めて
&array[n] と書いた方が読みやすいと思われる。
116デフォルトの名無しさん:2009/01/27(火) 00:20:45
>>114
何を寝言を言ってるんだ。
*(p+n)とp[n]は言語仕様上等価だ。
違いがあったら大問題。
117デフォルトの名無しさん:2009/01/27(火) 00:21:46
>>116
ポインタに対するp[n]と配列に対するvec[n]は違うのだが、わかってる?
118デフォルトの名無しさん:2009/01/27(火) 00:23:00
>>117
どう違ってるか言ってみろよ
笑ってやるから
119デフォルトの名無しさん:2009/01/27(火) 00:24:00
>>114
今時、よっぽどへぼなコンパイラでもない限り、*(p+n)とp[n]で違うコードを吐くなんてありえない。
120デフォルトの名無しさん:2009/01/27(火) 00:24:19
それと、(*it).memberという書き方は、
昔々にC++を学んだ人の中には居るのかもしれない。

初期のSTLのiteratorは、*だけが保証されていて->に対しての保証は無かったらしい。
標準規格が定められるまでのほんの僅かな期間だろうけどね。
121デフォルトの名無しさん:2009/01/27(火) 00:24:42
>>118
上で生成されるコードが違うと言っているだろ。
もちろん、そんなのありえないと>>119で否定済みだが。
122デフォルトの名無しさん:2009/01/27(火) 00:25:09
>>114
論点はそこではなく、
ポインタpに対してp[n]と*(p+n)は同じ、
配列aに対してa[n]と*(a+n)は同じ
ってことを言ってるんだよ。
123デフォルトの名無しさん:2009/01/27(火) 00:25:41
>>117
何ら違わない。
何度も言うが、p[n] は *(p + n) のシンタックスシュガーだ。
pが配列でも例外ではない。
124デフォルトの名無しさん:2009/01/27(火) 00:26:54
>>117>>119
お前らは何バカなこと言ってるの?
コンパイラが同等に解釈するなんて、ちゃんと>>114にも書いてあるだろ。

>>114は、『「ポインタ変数に対してのp[n]」と「配列に対してのvec[n]」が違う』と書いてあるんだぞ。
読めるかい?
125デフォルトの名無しさん:2009/01/27(火) 00:29:08
>>124
分かってたらわざわざ違う表記にしないよ。
違う表記にしている時点で変に理解している。
126デフォルトの名無しさん:2009/01/27(火) 00:29:40
>>122
だから、「常にp[n]と使う。*(p+n)は異端」という流れに対しての反論だろ。
流れが読めないの?
127デフォルトの名無しさん:2009/01/27(火) 00:30:14
>>126
反論になってない。
詳しく話せ。
128デフォルトの名無しさん:2009/01/27(火) 00:30:32
>>122
>>109-111とかを読んだ上で、論点がどうのと言ってるんだよね?
129デフォルトの名無しさん:2009/01/27(火) 00:32:32
つまり両者がどちらも、自分が正しいのでおまえが自分で言ってることの根拠を示せと言い合ってるんだね
130デフォルトの名無しさん:2009/01/27(火) 00:32:38
「ポインタ変数に対してのp[n]」と「配列に対してのvec[n]」が機械語で違うのは確かだが、
それが*(p+n)と使う理由になってないのが笑える。
131122:2009/01/27(火) 00:33:32
>>126
ごめん、流れ読んでなかった
132デフォルトの名無しさん:2009/01/27(火) 00:34:23
え、なに?
もしかして、>>109-111って、配列限定の話かね。
確かにarrayは配列だけど、>>110とかが配列限定の話をしているとは、とても思えないな。
133デフォルトの名無しさん:2009/01/27(火) 00:34:49
>>132
配列限定の話な訳無いだろ
134デフォルトの名無しさん:2009/01/27(火) 00:34:51
一時期、a[b]か*(a + b)かによって、違うコードが生成されるコンパイラがあったのは分かる。
そんとき、aが配列なのかポインタなのかによって、どちらがより良いコードを出すのか違いがあったのも分かる。
だが、そんなもん過去の話だ。それを集約すると>>110で済む話だが。
135デフォルトの名無しさん:2009/01/27(火) 00:38:45
p[n]と*(p+n)で同じコードを吐くのだから
分かりやすいp[n]の方で書くべき。
プログラムは人間も読むものだということを意識してプログラムする事は
バグの少ないプログラムを書くのに重要だ。
136デフォルトの名無しさん:2009/01/27(火) 00:41:59
>>130
参照のコストが違うのを強調するためだろ。

そもそも、
Cで構造体のポインタに対して、後発の言語のように
. によるアクセスではなく
-> という別の演算子を導入したのは何故だね。
文法的には同じ . でもコンパイラは簡単に区別できるのだから
わざわざ導入する必要は無かったのに。

これも間接参照のコストがかかるという点を示すのが理由の一つだとも言われているよ。
昔の計算機は遅かったし、コンパイラの最適化も弱かったからね。
137デフォルトの名無しさん:2009/01/27(火) 00:42:28
括弧が多いと読みにくいので、より括弧の減らせる形式が好みだな。
*(p+n)よりはp[n]
&p[n]よりはp+nが好き。
138デフォルトの名無しさん:2009/01/27(火) 00:42:42
>>136
そんなの強調されても何も嬉しくない。
読みにくくなるだけ。
139デフォルトの名無しさん:2009/01/27(火) 00:44:14
>>138
なんでCはC99になってさえ、構造体のポインタのメンバ参照に . が使えないの?
140デフォルトの名無しさん:2009/01/27(火) 00:44:59
>>139
俺も使えてもいいとは思うが、使えないのだから仕方が無い。
141デフォルトの名無しさん:2009/01/27(火) 00:46:41
今更 . で出来るようになっても混乱するだけだろ
142デフォルトの名無しさん:2009/01/27(火) 00:47:29
>>140
では何故 *(x).mem という記法があるのに、 x->mem なんてものを導入したの?
143デフォルトの名無しさん:2009/01/27(火) 00:48:12
>>142
(*x).mem だろ

こんなもの読み辛いしパースに時間かかるしいい事無いだろ。
144デフォルトの名無しさん:2009/01/27(火) 00:50:32
(*x).memとか美的感覚を疑う
145デフォルトの名無しさん:2009/01/27(火) 00:50:38
*が後置だったら良かったのに、と思う。
146デフォルトの名無しさん:2009/01/27(火) 00:52:30
前置は予め書こうと思って書き始めないといけないし、
読む時も思考を逆行させないといけないからな。
どうしても仕方が無いもの以外は後置で書きたい。
147デフォルトの名無しさん:2009/01/27(火) 00:53:57
そもそも、ポインタなんだから、増減して使うのが当たり前なのに
*(p+n)は無いわな。
その点ではp[n]だって全く同じだがね。
関数の仮引数でポインタ受け取って、添え字でアクセスなんてバカもいいとこ。
まあ初心者スレならその方が良いかもしれないけど。

ただ、p[n]は配列(=pは変化しない)に見えるから、pが変化するときは*(p+n)もありかもね。
148デフォルトの名無しさん:2009/01/27(火) 00:54:04
p*.mem
pp**.mem
p**n ←(p*)*n
これもちと辛いかも、パースが。
149デフォルトの名無しさん:2009/01/27(火) 00:54:58
(*(*(*x).a).b).c  vs  x->a->b->c

>>142は前者が好きなようです
150デフォルトの名無しさん:2009/01/27(火) 00:56:37
>>143
だから、そういう理由があるのに、何故 . という記法を採用しなかったのか。
151デフォルトの名無しさん:2009/01/27(火) 00:58:40
別な方がコンパイラ作るの楽だし。
152デフォルトの名無しさん:2009/01/27(火) 00:59:00
コストを明示することも必要、という考えがあった可能性はあると。
153デフォルトの名無しさん:2009/01/27(火) 00:59:47
ないない。
そんな考えがあったら [ ] で配列とポインタを同じように扱えるようにしないって。
154デフォルトの名無しさん:2009/01/27(火) 01:01:08
スレ違いではあるけどC++もあることだしもうむりだろ.にするのは
155デフォルトの名無しさん:2009/01/27(火) 01:01:40
C++だとオーバーロードが絡むからな。
156デフォルトの名無しさん:2009/01/27(火) 01:01:43
>>151
えー、どこが。
それこそ、p[n]と*(p+n)を別にすべきってことじゃん。
157デフォルトの名無しさん:2009/01/27(火) 01:02:21
×別にすべき
○別にしとけばよかった
158デフォルトの名無しさん:2009/01/27(火) 01:02:56
>>156
作り辛くしてでも分かりやすくしたかったんだろう。
159デフォルトの名無しさん:2009/01/27(火) 01:03:37
. でいいんじゃね?
ということに当時の人が気付かなかった可能性も
160デフォルトの名無しさん:2009/01/27(火) 01:04:57
もう寝る
願わくばうちの会社に>>114が来ませんように
161デフォルトの名無しさん:2009/01/27(火) 01:05:01
ところで>>153>>152じゃなくて>>151へだよね?
そうじゃないと意味が伝わらない。
162デフォルトの名無しさん:2009/01/27(火) 01:05:38
>>161 は文盲
163デフォルトの名無しさん:2009/01/27(火) 01:06:53
>>147
お前mallocしたことないの?
164デフォルトの名無しさん:2009/01/27(火) 01:07:33
>>160
大丈夫。わざわざITドカタになるってわかってるところへ就職を希望する人なんて、
この不景気でもそんなには居ないでしょ。
165デフォルトの名無しさん:2009/01/27(火) 01:08:15
素人宣言ktkr
166デフォルトの名無しさん:2009/01/27(火) 01:08:39
>>162は、皮肉という言葉を知らない、日本語の苦手な人
167デフォルトの名無しさん:2009/01/27(火) 01:10:04
>>166
理解できなかった事を今更誤摩化そうとしても遅いよ
168デフォルトの名無しさん:2009/01/27(火) 01:10:32
>>163
ポインタは p++ したり *p したりするべきものだ、
と言ってるんだろう。
たとえどんな時でも。
ばからしい話だが。
169デフォルトの名無しさん:2009/01/27(火) 01:10:44
>>163
おまえ、関数の引数にポインタ渡したことないの?
それとももしかして、1関数300行くらいにして、全部関数内で処理してるの?
170デフォルトの名無しさん:2009/01/27(火) 01:11:07
(flg ? struct : ptr).member
とかやってもいい?
171デフォルトの名無しさん:2009/01/27(火) 01:11:33
釣りが増えて来たな
172デフォルトの名無しさん:2009/01/27(火) 01:12:54
そんなことより純粋に知りたいのですが参照のコストが違うとはどういうことですか?
173デフォルトの名無しさん:2009/01/27(火) 01:13:15
>>169
>そもそも、ポインタなんだから、増減して使うのが当たり前なのに
がおかしいって、mallocっていう反例を示して指摘してるのに、なにが言いたいの?
174デフォルトの名無しさん:2009/01/27(火) 01:15:58
>>172
->は参照先アドレスが実行時に決まるのに比べて、
. はリンク時に決まるってこと。
175デフォルトの名無しさん:2009/01/27(火) 01:16:07
>>170
まずいんじゃね?
176デフォルトの名無しさん:2009/01/27(火) 01:17:52
>>174
いえそっちではなく、>>114の話です
177デフォルトの名無しさん:2009/01/27(火) 01:18:41
>>174
構造体を持つ構造体を、mallocすること考えただけでもそれはありえなくないか?
178デフォルトの名無しさん:2009/01/27(火) 01:19:34
>>176
ポインタpの指すアドレスは実行時に決まるのに比べて、
配列arrayのアドレスはリンク時に決まるってこと。
179デフォルトの名無しさん:2009/01/27(火) 01:19:59
pがレジスタに割り当てられたら差はないし、
インライン最適化されれば配列そのものが使われるかもしれない。
コストを明示したつもりでも、実際コストに差はないかもしれない。
そんなあやふやな意味の無いものを明示する暇があったら
もっと分かりやすく書け。
180デフォルトの名無しさん:2009/01/27(火) 01:20:42
いや、まじめな話、「一般的には」だけれど、

関数内だけで使うローカルな領域をmallocすることなんてそんなに多くないでしょ。
多くは、構造体のメンバとかに置いて、外部とのやり取りに使うためのもの。
だから、後でfreeするための元のアドレスはそのメンバが持っていて
個々の関数ではその値のコピーを使って操作することの方が多いでしょ。
いや、(コピーじゃなくて)直接使うケースが少ないとは言わないけどさ。

で、まあ、確かにローカルで使用するにしても
不定長のバッファなんかは必要ではある。
ただ、この用途は(C++で済まんが)vectorばっか使ってるから
malloc(operator new)することなんか殆ど無いし。

特に、配列として確保したもの(1個のオブジェクトではなく)は
ループを回したりするわけだから、コピーしてレジスタ割付なんかも期待したいところ。
そんな変数を増減するのは、ちっとも不思議じゃなく当たり前の話じゃないかね。
181デフォルトの名無しさん:2009/01/27(火) 01:20:50
>>177
簡略化した説明なので、そこまでは勘弁ね
182デフォルトの名無しさん:2009/01/27(火) 01:22:00
>>178
それは配列とポインタの違いであって*(p+n)とp[n]の違いじゃないと思うんだが
183デフォルトの名無しさん:2009/01/27(火) 01:25:51
>>176
配列(の先頭アドレス)は「定数」だから、コンパイル時に決まる。
それがグローバルかスタックフレームの相対アドレスか構造体内のオフセットかはともかく。

一方、ポインタは「変数」だから、(レジスタ変数にされない限り)メモリを読み出して
その値を得、それにオフセットを加えて参照先を決定する必要がある、ということ。
184デフォルトの名無しさん:2009/01/27(火) 01:26:49
>>183
C99ではそうではないとか言い出してみる
185デフォルトの名無しさん:2009/01/27(火) 01:27:13
>>178
>>182
>>183
理解できたと思いますが
要するに>>114は何か勘違いしてるってことですか?
186デフォルトの名無しさん:2009/01/27(火) 01:27:51
>>180
不思議ではないが当たり前でもないよ
187デフォルトの名無しさん:2009/01/27(火) 01:29:29
>>186
で?
188デフォルトの名無しさん:2009/01/27(火) 01:29:34
>>182
日本語力の無い俺には>>114をよく読むほど意味がわからなくなってきたw
少なくとも、*(p+n)とp[n]には見た目以外の違いは何も無いよ。
189デフォルトの名無しさん:2009/01/27(火) 01:31:27
>>174
つーか普通に関数呼び出しの時にアドレス決まるんじゃないの?
グローバル変数以外
190デフォルトの名無しさん:2009/01/27(火) 01:32:15
「ポインタなんだから、増減して使うのが当たり前」っていう極論が否定されてるだけで、
増減すること自体は誰も否定してないだろ。
191174:2009/01/27(火) 01:34:09
なんか突っ込みが多いので訂正するよ!
->は. より間接参照が1回多い分コスト高だってこと。
192デフォルトの名無しさん:2009/01/27(火) 01:35:54
配列に添え字(変数)でアクセスしようが、
ポインタでアクセスしようが一緒。
193デフォルトの名無しさん:2009/01/27(火) 01:38:14
こっちでやれ

【初心者お断り】ガチ規格準拠C専用スレ Part133
http://pc11.2ch.net/test/read.cgi/tech/1201153965/
194デフォルトの名無しさん:2009/01/27(火) 01:40:59
>>190
何言ってんだ。
後で触れているという点は除くにしても、話の流れ的に
p[n]や*(p+n)として使うくらいなら、pを増減する方が普通ということだろ。
特にわざわざそのためだけに添え字変数を用意するくらいなら。
もちろん、配列として確保したメモリ限定の話な。
195デフォルトの名無しさん:2009/01/27(火) 01:41:54
>>188
その点を否定している人は誰もいないと思われます。
196デフォルトの名無しさん:2009/01/27(火) 01:42:56
>p[n]や*(p+n)として使うくらいなら、pを増減する方が普通ということだろ。
ね え よ
197デフォルトの名無しさん:2009/01/27(火) 01:44:04
>>188
配列とポインタの違いはわかってますよね?

>>196
初心者スレですもんね。
198デフォルトの名無しさん:2009/01/27(火) 01:45:23
>>197
もちろんわかってますよ
199デフォルトの名無しさん:2009/01/27(火) 01:46:55
>>191
そりゃ (* hoge).なにか
と等価なんだから当たり前だろ・・・・・・・
200デフォルトの名無しさん:2009/01/27(火) 01:47:35
>>198
じゃあ>>191の内容はわかってますよね、当然。
201デフォルトの名無しさん:2009/01/27(火) 01:49:09
違いがあるのは配列とポインタであって[]と*(+)ではない
手に持ったゴミを焼却炉に放り込むときに「燃やす」、
ごみ箱の中身を放り込むときに「焼却する」と言い換えてるようなものだ
202デフォルトの名無しさん:2009/01/27(火) 01:49:13
>>200
わかってますよ、自分の発言ですから。
203デフォルトの名無しさん:2009/01/27(火) 01:52:38
じゃあ、ポインタ経由のインデックスアクセスと、配列からのインデックスアクセスで
コストが違うこともわかってますよね?
それと、p[n] と *(p+n) は全く同じ、ということをあわせて
敢えて違うということを明示するという意図(それに意味があるかはともかく)もわかりませんか?
204デフォルトの名無しさん:2009/01/27(火) 01:54:38
>敢えて違うということを明示するという意図(それに意味があるかはともかく)もわかりませんか?
だからそれがバカなこと以外の何物でもないとずっと言ってるんだろうが
205デフォルトの名無しさん:2009/01/27(火) 01:56:26
>>203
コーディングした人の好みの問題ですよね、わかります。
206デフォルトの名無しさん:2009/01/27(火) 01:57:41
Q. ポインタは本当に配列より高速なのか。

A. たいていは大きな配列の中をアクセスしてまわるのにポインタを使うほうが、
配列の添字を使うより高速であるが、その反対のプロセッサも存在する
(よくできたコンパイラならどちらの記法を使って書かれたコードにも
良質なコードを生成すべきである)。

  CFAQ 20.14
207デフォルトの名無しさん:2009/01/27(火) 01:58:24
>>190
単純な増減だけでしかアクセスしないんならそれでもいいかもね。
208デフォルトの名無しさん:2009/01/27(火) 02:00:59
int (*a)[1000] = malloc(sizeof(int) * 1000 * 1000);
としたとき

for (i = 0; i < 1000; ++i)
for (j = 0; j < 1000; ++j)
a[i][j] = i * j;

より

for (i = 0; i < 1000; ++i)
for (j = 0; j < 1000; ++j)
a[j][i] = i * j;

のほうが遅いらしいんですがなんでですか?

209デフォルトの名無しさん:2009/01/27(火) 02:01:41
だからね、俺も(バグってるかどうか知らん)
char *strcpy(char *dst, const char *src) {
 char *top;
 while (*dst++ = *src++);
 return top;
}
なんてのが「普通」「読みやすい」なんて全然思わない。けど、
char *strcpy(char *dst, const char *src) {
 char *top = dst;
 while (*src) {
  *dst = *src;
  ++src, ++dst;
 }
 *dst = '\0';
 return top;
}
のような使い方のほうが
char *strcpy(char *dst, const char *src) {
 int i;
 for (i = 0; src[i]; ++i) {
  dst[i] = src[i];
 }
 dst[i] = '\0';
 return dst;
}
よりも「普通」だと言いたいわけよ。
もちろん、この場合に速くなるなんて思わないけど(レジスタ変数が2つまででなければ)。
210デフォルトの名無しさん:2009/01/27(火) 02:01:58
ぶっちゃけ処理速度を要求されてるわけでもない場面で雀の涙ほどの高速化を計るより
統一的で読みやすいコードを書いてほしい
211デフォルトの名無しさん:2009/01/27(火) 02:03:25
>よりも「普通」だと言いたいわけよ。
条件の後出し乙
212デフォルトの名無しさん:2009/01/27(火) 02:03:30
>>208
右側の[ ]の添え字を1ずつ動かしたものは、メモリ上連続しているので、
キャッシュメモリの効果が出やすい。
左側の[ ]を動かすと、メモリのあっちこっちに飛んでアクセスすることになるのだ。
213デフォルトの名無しさん:2009/01/27(火) 02:04:07
配列を順番に舐める程度の使い方しかできないのはわかった。
214デフォルトの名無しさん:2009/01/27(火) 02:04:19
>>209
さすがにそのレベルだとどれでも読みやすさに大差ないだろ

ポインタ演算にしたせいで糞読みづらくなるのはもっとさぁ
215デフォルトの名無しさん:2009/01/27(火) 02:05:23
>>209
i 消滅させてくれたはずなんだよなぁ、コンパイラさまの力で
ソース出せといわれても困るけど
216デフォルトの名無しさん:2009/01/27(火) 02:07:05
>>212
ありがとうございます
説明にくわえ、キャッシュメモリという単語をもとにおおむね分かりました
どうもありがとうございます
217デフォルトの名無しさん:2009/01/27(火) 02:08:09
>>209
どう見ても特殊な状況だけを取り出して「普通」ってw
配列の使い方がそんな単純なものだけなわけねーだろ。
218デフォルトの名無しさん:2009/01/27(火) 02:10:47
>>204
あれ、>>114の言っていることがわからないって言ってた(>>188)んじゃなかったの?
じゃあ「>>114の意味がわからない」なんて書かないでよ。
せめて「>>114は無意味としか思えない」とかにしてよ。
すげー時間無駄にしたよ。

本当に日本語苦手なんだろうけど
「日本語が苦手なんですけど」と書き出されても
「初心者ですけど」と言って質問する人と同じように応対すべきとは思わないじゃん。
219デフォルトの名無しさん:2009/01/27(火) 02:12:26
>じゃあ「>>114の意味がわからない」なんて書かないでよ。
俺はそんなこと一言も言ってない
ID出ない板で勝手に特定の発言を同一人物だと思わないこと
220デフォルトの名無しさん:2009/01/27(火) 02:14:16
>>114が無意味なことしてるとは思わなくて、*(p+n)とp[n]に何か違いがあるのかも、
って思っちゃったんじゃね?
221デフォルトの名無しさん:2009/01/27(火) 02:15:06
そんな無意味なことをやる人間がプログラマ名乗ってるとは信じがたかったとかそういういわゆる一つのアレだろ
222デフォルトの名無しさん:2009/01/27(火) 02:15:46
>>219
>>188は別人なの?
>>188
>>114をよく読むほど意味がわからなくなってきたw
と書いてあるけど。
223デフォルトの名無しさん:2009/01/27(火) 02:19:50
>>218
いや、>>114はポインタと配列のコストの違いと言っているのか、
*(p+n)とp[n]のコストの違いと言っているのか、どっちなのかわからなかったのだ。
あと、>>204は俺じゃないよ。
いずれにせよ、ごめんね。
スレも無駄に消費してごめんなさい。
224デフォルトの名無しさん:2009/01/27(火) 02:23:32
これが単なるスタイルの問題ならここまで紛糾しなかっただろう
しかし常に*(p+n)と書くというのはあまりにも迷惑すぎる
225デフォルトの名無しさん:2009/01/27(火) 02:23:49
つまり>>204=>>219が流れも空気も読めずにゴミを混ぜたと

まあ張り付き方見てればわかるけど
226デフォルトの名無しさん:2009/01/27(火) 02:24:23
>>224
さすがにそんな奴居ないだろ。
227デフォルトの名無しさん:2009/01/27(火) 02:27:03
228デフォルトの名無しさん:2009/01/27(火) 02:28:43
どこに「常に」と書いてある?
229デフォルトの名無しさん:2009/01/27(火) 02:30:04
「常に」とは書いてないが、ポインタなら常に*(p+n)って書くんじゃね?
230デフォルトの名無しさん:2009/01/27(火) 02:31:30
>>228
常にでないならその無意味な意図とやらすら成立しないだろう
231デフォルトの名無しさん:2009/01/27(火) 02:32:28
>>114の知り合いがそう言ってるのを聞いたの?
232デフォルトの名無しさん:2009/01/27(火) 02:32:56
>>228
ポインタと配列が違うことを示すために変えて書いてます!
ってやつが常にそうしないなら逆に大笑いだ
233デフォルトの名無しさん:2009/01/27(火) 02:33:43
文脈が読めず「常に」と書いてなければ常にじゃないってw
234デフォルトの名無しさん:2009/01/27(火) 02:35:32
ポインタなら別のどこかでインクリメントとかする事があるんで。
235デフォルトの名無しさん:2009/01/27(火) 02:38:45
>>234
前後のつながりのわかる文章を書け
236デフォルトの名無しさん:2009/01/27(火) 02:43:52
別にわからなくてもいいよ。
237デフォルトの名無しさん:2009/01/27(火) 02:44:21
そんなにポインタと配列を混同しやすくて困るってんなら
プレフィクスでもなんでもつけたほうがまだマシってものだ
238デフォルトの名無しさん:2009/01/27(火) 02:55:10
しょうがねえな。
別の話題に持っていってやろう。

配列として宣言された変数には[]を使い、
ポインタとして宣言された変数には*()を使う、という人はいるはず。
もちろん、それは関数の仮引数に[]を使うというような方法で区別する。

という話題はどうだろう。
http://www.kouno.jp/home/c_faq/c6.html#4
に近い話があるが。
239デフォルトの名無しさん:2009/01/27(火) 03:02:26
劣勢だから話題をそらしたいんですね
240デフォルトの名無しさん:2009/01/27(火) 03:03:11
デバッグ作業にかかる時間を短くするために心がけることってどんなこと?
時間かかりすぎる
241デフォルトの名無しさん:2009/01/27(火) 03:08:06
>>238
迷惑すぎる。
*()を使って(2文字増やして)得られるものが何一つない。

ちなみに[]と*()は実は記述上完全な同等ではない。
演算子の優先順位が[]のほうが高いからだ。
ポインタと配列を区別したいなどという理由で*()を押し通していると、
(*())とさらに一つ余計な括弧をつけなければならない場面が出てくる。
242デフォルトの名無しさん:2009/01/27(火) 03:43:42
ふまえると、関数に配列を渡す場合にポインタを渡すか、配列そのものを渡すかで
関数内の処理速度に影響があるということ?
配列を渡すと、渡す際のコストは大きくなるけど、関数内の処理は速くなる?
243デフォルトの名無しさん:2009/01/27(火) 03:47:41
>>242
それは議論の余地無く完全に間違ってる
244デフォルトの名無しさん:2009/01/27(火) 04:01:51
p[3]や*(p+3)は オK
だが
int *p,q p[q]は問題無いが、*(p+q)は迷惑。p[q]じゃないと殴りたくなる
というか、後世に継承してもらうのは無理と思って欲しい。

ちなみにC++では
Class *p( operator[](int)が定義澄み)
p[2] はコンパイルエラー
(*p)[2] この書き方じゃないとNG
p->[2]なんて書けない。

void *p
p=(void*)(p+3);はコンパイル可能だし警告もおそらく出ない。
p=&(p[3]);は警告が出る筈。
(処理系によってはコンパイルが通らない場合がある。)
こういった微妙な相違はあるな。
245デフォルトの名無しさん:2009/01/27(火) 04:09:02
>>241
たとえば、
struct foo { bar_t bar; };
struct foo foo_array[4];
struct foo *foo_ptr_of_array[] = {foo_array, foo_array+1, foo_array+2, foo_array+3};
struct foo *(*ptr_to_foo_ptr_of_array)[] = &foo_ptr_of_array;
struct foo *(*ptr_to_ptr_to_foo) = foo_ptr_of_array;

foo_ptr_of_array[0]->bar = barFoo;
(*ptr_to_foo_ptr_of_array)[0]->bar = barBar;
(*(ptr_to_ptr_to_foo + 0))->bar = barBaz;

さすがに最後はないだろうとは思うけど。

 私は、配列なら添え字演算子を使い、ポインタなら間接参照を使うので、
この場合は、2番目を選ぶと思う。明らかに、最後のは、配列をポインタに成り下げているから、嫌だ。
配列は配列。ポインタはポインタです。混同するのはよくない。
ポインタに間接参照を使う理由は、関数の引数やローカル変数が、間接参照をされている場合、
ポインタなので(+1)、それなりの注意をして読んだり書き直したりできる。
 たとえば、NULLポインタチェック、アロケートとフリーの対応、リテイン(他のポインタが、同じアロケート先をさしていないか)チェックなど。

(+1 配列もポインタに成り下がれるけどe.g. sizeof(array)/sizeof(*array)当然私は、sizeof(array)/sizeof([0])のほうを使うけど)
246デフォルトの名無しさん:2009/01/27(火) 04:10:01
>>244
C++の例なんかむちゃくちゃ言ってるぞwwwwww
247デフォルトの名無しさん:2009/01/27(火) 04:39:52
base pointerとindexの両方を1つのコンテクストの中で動かす
極めてアルゴリズム的ななコードはそれが公共的なものである
場合、修正加筆し損なって、破損した場合の影響度を考えると最早書け
ないと思ったほうがいいかもな。
248デフォルトの名無しさん:2009/01/27(火) 07:23:03
>>245
混同したくないなら名前を変えりゃいいだけだろ。
そんな汚い表記で迷惑かけるのはやめてくれ。
249デフォルトの名無しさん:2009/01/27(火) 07:34:43
読み辛さに起因するバグと相殺しそうだ。
250デフォルトの名無しさん:2009/01/27(火) 10:32:46
>>248
 「混同したくない」ではなく「混同するな」といっているんだが。
たとえそれが糖衣構文とはいってもポインタをあたかも配列のように扱うのはプログラマの意図すべきことではない。
間違ったコードが間違って見えるように、ポインタを配列のように表記せずにはじめから間接参照を使うほうが、
プログラマの意図を反映したコードになる。

 配列は、固定長のデータやデータ長が既知であるとき、動的メモリ確保に制限があるとき(マシンの構造上、動的にメモリを確保できない)、
そのほか小手先技の実現のためなどに使えばよい。だからこそ、ポインタと配列は、別の表記をしたほうがよい。
 配列は、線形的なデータ構造を作るための安価な複合型
 ポインタは、柔軟なデータ構造を作るための安価な複合型


>>汚い表記
 どこが汚いのかまったく理解できない。
251デフォルトの名無しさん:2009/01/27(火) 11:08:54
自分にしか読めないようなのは他人から見ると汚いんだよ
252デフォルトの名無しさん:2009/01/27(火) 11:12:04
>>250
言いたいことはまぁ判ったから、もう少し判り易い例を提示してくれ。
>245だと何が言いたいのか全く判らん。
253デフォルトの名無しさん:2009/01/27(火) 11:22:27
>>252
配列のように連続性に意味のあるデータは [] 使えよっていう話では?
254デフォルトの名無しさん:2009/01/27(火) 12:20:06
>>250
宗教の話がしたいなら、ニッポン放送の朝5時から勝手にやっててくれ。
255デフォルトの名無しさん:2009/01/27(火) 13:41:55
間をとって
 0[p+n]
と書けばいいよ
256デフォルトの名無しさん:2009/01/27(火) 14:19:23
>>250
>たとえそれが糖衣構文とはいってもポインタをあたかも配列のように扱うのはプログラマの意図すべきことではない。
完全に間違っている。
君がどういう印象を持つかにかかわらず、[] は配列を操作する演算子ではなく、ポインタを操作する演算子である。
ポインタに対して [] を作用させるのは言語仕様上まったく正当で、また配列はポインタに成り下がるから、
配列名に対して [] を作用させるのも同じ理由で正当である。

重要なことは、ポインタの指す場所以降の領域がいかなるものであるかということであって、
識別子がポインタであるか配列であるかではないし、それに対してどんな演算子を使用するかでもない。
そこまでして識別子の種類を明示的に区別したいなら、ハンガリー記法でも使うことをお勧めする。
257デフォルトの名無しさん:2009/01/27(火) 14:27:54
教えてください。
borlandC をコマンドラインで使っています。
実行ファイルへプロパティのバージョン情報タブを付けたいのですが、
どのようにしたら良いですか?
258デフォルトの名無しさん:2009/01/27(火) 14:53:35
なんとなくわかった気がするぞ
たぶん配列とポインタで[]の意味が変わると思ってるんじゃないか?
でなかったら

>明らかに、最後のは、配列をポインタに成り下げているから、嫌だ。

なんてセリフ出るはずがない
その例では三つとも全部配列はポインタに成り下がっているのに
259デフォルトの名無しさん:2009/01/27(火) 15:00:33
宗教戦争ってこわいな
260デフォルトの名無しさん:2009/01/27(火) 15:04:09
参加者乙
傍観する分にはそうでもないよ
261デフォルトの名無しさん:2009/01/27(火) 15:17:06
>>>たとえそれが糖衣構文とはいってもポインタをあたかも配列のように扱うのはプログラマの意図すべきことではない。
>>完全に間違っている。
 だから、意図的にやるなといっているんだよ。
 
>>君がどういう印象を持つかにかかわらず、[] は配列を操作する演算子ではなく、ポインタを操作する演算子である。
>>ポインタに対して [] を作用させるのは言語仕様上まったく正当で、また配列はポインタに成り下がるから、
>>配列名に対して [] を作用させるのも同じ理由で正当である。
 正しい。配列名が、ポインタに成り下がることは、前にも書いた。私もよく使う。

 そうではなくて、ポインタを配列と認識することに問題があるといっている。
foo_t bar(baz_t *baz);とfoo_t bar(baz_t baz[]);という宣言について考えよう。
前者は、明らかにポインタを引数としている。後者もポインタを引数にしているが、そのポインタは、配列の成り下がりというのを明示している。
ここで、後者に対して、関数定義をしている実装コード内で添え字演算子を用いることについては、間違っていない。
前者に対して、関数定義をしている実装コード内で添え字演算子を用いることについては、
間違えとまではいわないが、それを目にしたときには首を傾げるだろう。
はじめから、後者の書き方を採用すべきだ。

>>重要なことは、ポインタの指す場所以降の領域がいかなるものであるかということであって、
>>識別子がポインタであるか配列であるかではないし、それに対してどんな演算子を使用するかでもない。
 そのとおり、シーケンシャルな場合でないと添え字演算は成立しない。
関係ないけど、"bar"[i], (cond ? bar_ary : bar_ptr)[i]こんなのは見たくない。

 シーケンシャルなデータ構造で解決できればいいんだけど、そうでない場合に、ポインタが絡む。
だから、あえてポインタに間接参照演算子を使い、添え字演算子を避けている。防衛的にプログラミングしているってことね。

>>そこまでして識別子の種類を明示的に区別したいなら、ハンガリー記法でも使うことをお勧めする。
 使ってます。システムハンガリアンね。lint病にかかったのかなぁ。
262デフォルトの名無しさん:2009/01/27(火) 15:59:32
>そのとおり、シーケンシャルな場合でないと添え字演算は成立しない。
添字演算が成立しないのに*(+)はつかっていいのか

バ カ じ ゃ ね え の
263デフォルトの名無しさん:2009/01/27(火) 16:09:27
>>261
> そうではなくて、ポインタを配列と認識することに問題があるといっている。
あるだろう。しかし、ポインタに対して [] を使わないというルールではそれは解決しない。
もしあるポインタ識別子を正しくポインタとして認識しているなら、[] を使っても問題ない。
もし誤って配列として認識しているなら、それは結局 [] を使ってしまうことになる。

もう一度問う。敢えて p[n] を押しのけて *(p+n) を使うことにどんな意味があるのか。
ポインタ演算の結果を参照することはシーケンシャルなメモリアクセスを行うことにほかならない。
それに配列名でアクセスしようと、ポインタでアクセスしようと、領域の持つ意味はまったく同じである。
264デフォルトの名無しさん:2009/01/27(火) 16:14:53
int main(void) と言うように、main関数の戻り値はint型、引数がないならvoidを入れとけ
C++では、int main() でもおk。引数があるなら、int argc , char *argv[] ってんだ、分かったか?
みたいなw ただの標準”スタイル”だけどなw
265デフォルトの名無しさん:2009/01/27(火) 16:14:57
君のレスなんて読まないよ
266デフォルトの名無しさん:2009/01/27(火) 16:17:33
っと、読まない宣言をしないと気がすまない基地外、構ってチャンが申しております
267デフォルトの名無しさん:2009/01/27(火) 16:18:47
リンゴを食べるときはフォークを使いなさい
ナシを食べるときは爪楊枝を使いなさい
なぜならリンゴとナシは別のものだからです
ちゃんと区別しなければいけません

これぐらいアホなこと言ってるのに気付いてないのか
268デフォルトの名無しさん:2009/01/27(火) 16:21:18
カレー味の●ンコが良いか、●ンコ味のカレーが良いか?なんて聞いているお前が言うと笑えるw
カレー味のカレーを作ってくれよ?単純だろ?w
269デフォルトの名無しさん:2009/01/27(火) 16:35:36
>>261
ついでに。

もし君が、識別子の素性が容易には突き止められないようなコードを書いているなら、
間違いなくそちらのほうが問題である。
自分のコード読解力の低さを棚に上げて無意味なスタイルを押し付ける前に、
あらゆる処理構造を可能な限りシンプルに書くように勤めたほうがよい。
270デフォルトの名無しさん:2009/01/27(火) 16:36:21
君のレスなんて読まないよ
271デフォルトの名無しさん:2009/01/27(火) 19:36:33
実行ファイルが使ってる関数のアルゴリズムとかを調べるにはどうすればいいの?
272デフォルトの名無しさん:2009/01/27(火) 19:40:10
>>271
スレ違いです
273デフォルトの名無しさん:2009/01/27(火) 19:52:16
>>271
デバッガで実行中のプロセスにアタッチして逆アセンブルリストを眺める。
274デフォルトの名無しさん:2009/01/27(火) 21:27:29
勉強用にcatというプログラムを読もうとしていますが
軽く300行を越えている関数がありますが、普通ですか?
275デフォルトの名無しさん:2009/01/27(火) 21:28:31
異常
276デフォルトの名無しさん:2009/01/27(火) 21:34:41
>>274
OSSアプリ的には普通。
277デフォルトの名無しさん:2009/01/27(火) 21:43:58
g++でエラーがどうすれば・・・

#include<iostream>
using namespace std;

{
int val;

cin >> val;
cout << val << endl;

return 0;
}
こんなかんじでエラーメッセージは
cin.c:6: error: expected unqualified-id before '{' token
278デフォルトの名無しさん:2009/01/27(火) 21:49:12
>>277
int main(void)
でも追加してみるとか
279デフォルトの名無しさん:2009/01/27(火) 22:32:26
一体何を参考にそのコードを書いたのかが気になる
280デフォルトの名無しさん:2009/01/27(火) 22:35:32
最近は、入門書とか買わないで勉強してんのかね。



281デフォルトの名無しさん:2009/01/28(水) 01:33:43
質問です。

1、式は必ず評価値を持つのでしょうか?
2、関数呼び出しは、値を返す時だけ式なのでしょうか?
それとも戻り値の無い関数の呼び出しも式なのでしょうか?
282デフォルトの名無しさん:2009/01/28(水) 04:06:37
>>277
これネタだよな?
突っ込み所ありすぎてワロタw
283デフォルトの名無しさん:2009/01/28(水) 11:11:42
>>281
1、ない場合もある
2、値がなくても式は式
284デフォルトの名無しさん:2009/01/28(水) 12:48:59
プログラムがクラッシュします。なぜでしょうか?1時間ほど考えた
けど理由がわかりません。

int main(void)
{
char *p = (char *)0x5000000;

memset(p, 0, 0x10000000);

return 0;
}
285デフォルトの名無しさん:2009/01/28(水) 12:55:18
0x5000000番が書き込めないとこだったんだろう
286デフォルトの名無しさん:2009/01/28(水) 12:56:01
ありがとうございます。
素直にmalloc()使います。
287デフォルトの名無しさん:2009/01/28(水) 13:00:12
>>284
memset(p,0x10000000,0);
の間違いだったんじゃないのか?
288デフォルトの名無しさん:2009/01/28(水) 14:03:29
>>284
ワロタw
289デフォルトの名無しさん:2009/01/28(水) 14:47:15
これを使ってscanfで「2進数の1010」と入力して出力すると「10」にならないで「730」になる
どうしてだろ・・・助けてください

//n進数の○○○○を10進数に変換してその値を返す関数
int decimal(int sinsu,char hairetu[21]){
int i=0,wa=0;
while(hairetu[i] != '\0'){
wa = wa * sinsu + hairetu[i];
i++;
}
return wa;
}
290デフォルトの名無しさん:2009/01/28(水) 14:52:00
>>289
まずは「2進数の0」と入力すると結果が48になるバグを直すんだ。
291デフォルトの名無しさん:2009/01/28(水) 14:56:17
>>289
hairetuが文字列なのに
hairetu[i]を文字から数値に変換してない
292デフォルトの名無しさん:2009/01/28(水) 15:06:43
>>290
なるほど!!
ASCIIコード表ながめてもう少し考えてみたいと思います
助かりました!!
293デフォルトの名無しさん:2009/01/28(水) 15:07:07
人に自分のプログラムのミスを見つけさせるのは、相手の
精神を損傷させかねない、実は非常に罪作りな行為だよ。
聞いた話にすぎないが、メンヘル自殺者のトップレベルに
常にランクインする職業は、「校正」らしい。
おそらくプログラム関係だったら「テスト作業」関係者も
ランクインしてるんじゃないかと...
294デフォルトの名無しさん:2009/01/28(水) 15:07:43
ミス
>>290-291
です
295デフォルトの名無しさん:2009/01/28(水) 15:14:10
>>293
コーディングやバグフィックスは寧ろ楽しい。
一番嫌なのは人に仕様を聞いたりしなきゃならない作業。
コミュニケーションがなくなればマは最高だとおもう。
296デフォルトの名無しさん:2009/01/28(水) 15:34:10
機械向け言語通訳/翻訳作業従事者とプログラマの間に横たわる
(余りにも深〜〜い)ギャップについて
297デフォルトの名無しさん:2009/01/28(水) 15:39:09
>>295
「楽しい」と感じること自体に大きな罠があるような....
298デフォルトの名無しさん:2009/01/28(水) 17:21:50
マイコン用のソースを考えているのですが
float型(32ビット)の変数から10進での小数点以下1桁、小数点以上最大3桁の計4桁を
桁ごとに切り分けるにはどのように記述したらいいでしょうか?
因みに特に使えそうな関数は用意されていなくANSI Cの範囲で記述する必要があります
299デフォルトの名無しさん:2009/01/28(水) 17:32:32
>>298
マイコンのアーキテクチャがわからんけど
10倍して固定小数点の整数型にして扱うってのはだめかね?
300デフォルトの名無しさん:2009/01/28(水) 17:32:36
sprintfで文字列化して1文字ずつ取り出すってのはどう?
301デフォルトの名無しさん:2009/01/28(水) 17:56:37
#include<stdio.h>
void inputdata(void);
void outputdata(void);
int *data, numData;
main(){
printf("Enter number -> ");
scanf("%d", &numData);
data = malloc(numData * sizeof(int));

inputdata(data);
outputdata(data);
}
void inputdata(void)
{
int i;
for(i = 0; i < numData; i++){
scanf("%d", &data[i]);
}
}
void outputdata(void)
{
int i;
for(i = 0; i < numData; i++){
printf("data[%d] : %d\n", i, data[i]);
}
}
引数の数が合わないらしいんですけど
どこをどう直せばいいのでしょうか?
302デフォルトの名無しさん:2009/01/28(水) 18:04:58
void inputdata(void) → void inputdata(int* data)
void outputdata(void) → void outputdata(int* data)
303デフォルトの名無しさん:2009/01/28(水) 18:10:00
>>298
int型に代入したら、小数点以下が切り捨てられる。あとは
304301:2009/01/28(水) 18:11:50
>>302
コンパイルできました
ありがとうございました
305デフォルトの名無しさん:2009/01/28(水) 18:18:51
>>298
sprintf(str, "%5.1f", floatValue)
306デフォルトの名無しさん:2009/01/28(水) 18:44:29
#include <stdio.h>

int main(void)
{
int i, j, prime;

for (i = 2; i < 1000; i++) {
prime = 1;
for (j = 2; j <= i / 2; j++)
if (!(i % j))
prime = 0;
if (prime)
printf("%d は素数です\n", i);
}

return 0;
}
素数を求めるプログラムが理解できません。特にif (!(i % j))は
どういう意味なんでしょうか?
307デフォルトの名無しさん:2009/01/28(水) 18:46:32
i を jで割ってそのあまりが0ならば、
308デフォルトの名無しさん:2009/01/28(水) 18:48:35
真偽値でないものに ! を使うのはキモいなあ。
よく見かけはするけど。
309デフォルトの名無しさん:2009/01/28(水) 18:51:10
!がついてる == 0ならば
と刷り込まれてるのか違和感は感じないな
310306:2009/01/28(水) 19:06:17
なるほど論理演算子を理解していなかったです。
0なら素数ってことですね
ありがとうございました
311デフォルトの名無しさん:2009/01/28(水) 19:07:36
余りが0でないとき素数だ
312306:2009/01/28(水) 19:19:19
あ!そっかw
二番目のループは割り切れる数字があるか探しているのか
ありがとうございます!!!
313デフォルトの名無しさん:2009/01/28(水) 19:52:44
何がおかしいのかわかりません。
#include<stdio.h>
void inputdata(int *, int);
void outputdata(int *, int);

main(){
int *data, numData;

printf("Enter number -> ");
scanf("%d", &numData);
data = malloc(numData * sizeof(int));
inputdata(data);
outputdata(data);
}
void inputdata(int *dt, int num)
{
int i;
for(i = 0; i < num; i++){
scanf("%d", &dt[i]);
}
}
void outputdata(int *dt, int num)
{
int i;
for(i = 0; i < num; i++){
printf("data[%d] : %d\n", i, dt[i]);
}
}
314デフォルトの名無しさん:2009/01/28(水) 19:55:01
何でおかしいのがわからないのかわかりません。
エラーメッセージくらい読めよ。
315デフォルトの名無しさん:2009/01/28(水) 19:58:34
>>308
Cに真偽値はありません
316デフォルトの名無しさん:2009/01/28(水) 19:59:45
>>313
なんでお前はそこまで頭が悪いの?
317デフォルトの名無しさん:2009/01/28(水) 20:01:25
>>313
とりあえずどういうプログラムにしたいか教えてくれ
318デフォルトの名無しさん:2009/01/28(水) 20:01:59
>>313
そうですか。
で、何か用?
319デフォルトの名無しさん:2009/01/28(水) 20:04:09
>>315
値の概念の話であって
真偽型の話じゃないぞ
320デフォルトの名無しさん:2009/01/28(水) 20:05:20
奴らは隙を見せると即座に噛み付いてくるからな
321デフォルトの名無しさん:2009/01/28(水) 20:09:06
多分昔雑誌か何かで見たクイズだと思うんだけど

■ int n;

■に出来るだけ多くの文字を入れよ。ただし、
・全体として正しいnの宣言でなければならない。
・意味の変化を与えないものを入れたり、繰り返したりしてはならない


register const volatile unsigned long long int n;
で合ってますかね?
322ちょっと聞きたいんだけど辞書君:2009/01/28(水) 20:10:48
malloc ってstdio.hで宣言されてたっけ?
323デフォルトの名無しさん:2009/01/28(水) 20:14:13
>>321
ちょっと考えてみる限りは、標準の範囲内ではそんなもんだと思う

>>322
stdlib.h
324デフォルトの名無しさん:2009/01/28(水) 20:15:45
ちょっとまてもし標準ならlong longはだめだろう
あと意味が無いものがアウトなら long int と long は同じだな
325デフォルトの名無しさん:2009/01/28(水) 20:16:10
>>322
malloc.hかstdlib.hじゃないの
326デフォルトの名無しさん:2009/01/28(水) 20:16:51
malloc.h とか非標準
327デフォルトの名無しさん:2009/01/28(水) 20:17:13
>>324
long long はC99 標準
int は略せない
328デフォルトの名無しさん:2009/01/28(水) 20:17:21
>>324
int=shortのコンパイラもある
329デフォルトの名無しさん:2009/01/28(水) 20:18:20
>>328
お前は何を言ってるんだ
330デフォルトの名無しさん:2009/01/28(水) 20:19:00
>>327
そうなのかごめんね

>>328
そういうことじゃないよ
331デフォルトの名無しさん:2009/01/28(水) 20:20:19
多態性って関数ポインタの配列なんですね
332デフォルトの名無しさん:2009/01/28(水) 20:22:08
c++のこといってるなら、そんな単純な実装じゃない
333デフォルトの名無しさん:2009/01/28(水) 20:22:34
>>331
C++的なやつはそうだね。
メッセージングとか言っているやつだとまた違う実装もあり得る。
334デフォルトの名無しさん:2009/01/28(水) 20:25:41
C++だと基本的に仮想関数テーブル使ってるだけだと思う。
多重継承するとオフセットとか効いてくるけど。
335デフォルトの名無しさん:2009/01/28(水) 20:48:19
>>313
>inputdata(data);
>outputdata(data);

inputdata(data, numData);
outputdata(data, numData);
にする。
336デフォルトの名無しさん:2009/01/28(水) 20:56:16
freeくらいしろよ
337デフォルトの名無しさん:2009/01/28(水) 20:58:48
>>319
その理論だと真偽値以外のものに!の件が理解できなくなるんだけど、
何ならおk?
338デフォルトの名無しさん:2009/01/28(水) 20:59:08
それは動かない理由じゃないし。
339デフォルトの名無しさん:2009/01/28(水) 20:59:45
真が0以外で偽が0なんだから、数はすべて真偽値だということもできる。
340デフォルトの名無しさん:2009/01/28(水) 21:03:12
>>337
日本語でおk

真偽を意味している値を真偽値と呼んでいるだけ。
比較の結果だとか isupper の戻り値だとか
そういうのを入れた変数とかそういうもの。
341デフォルトの名無しさん:2009/01/28(水) 21:07:02
自分定義で語られてもw
342デフォルトの名無しさん:2009/01/28(水) 21:08:05
最近の言語は条件式に真偽型の値しか受け付けないのが主流だぞ
343313:2009/01/28(水) 21:08:17
>>335
うまくいきました。もっと勉強します。
344デフォルトの名無しさん:2009/01/28(水) 21:08:32
>>340
くだり、と読んで。

てことは、具体例として、ヌルポインタかどうかの比較に!は気持ち悪いと?
345デフォルトの名無しさん:2009/01/28(水) 21:09:27
>>342
C言語のスレで最近の言語がどうとか、頭大丈夫?
346デフォルトの名無しさん:2009/01/28(水) 21:12:12
そういうのが主流になったってのは
条件式には真偽値以外使うべきではないという
プログラミングスタイルが
そういう言語が作成される前に確立したからだよ
347デフォルトの名無しさん:2009/01/28(水) 21:15:11
C/C++由来の言語のほとんどが真似しない悪習ということだな
348デフォルトの名無しさん:2009/01/28(水) 21:17:19
初歩的なことですいませんが

1+4+9+16+……
と加えて行き、和が初めて10000を超えたとき、その和の値、および最後に加えた
数を求めて表示するプログラム


#include<stdio.h>
#include<conio.h>

void main(){

int x=1,S=0;

while(             )←ここに入る式と
{                  }←ここに入る式がわからないのですが

printf("和の値は%dで、".S);

printf("最後に加えた数は%dです。\n",x);

getch();
}


お願いします
349デフォルトの名無しさん:2009/01/28(水) 21:20:00
宿題は自分でやれ
350デフォルトの名無しさん:2009/01/28(水) 21:21:52
かといってCでif (hoge == TRUE)等と書くのは愚の骨頂であるわけだし
351デフォルトの名無しさん:2009/01/28(水) 21:22:24
hoge が真偽値なら if (hoge) と書けばいいじゃないの
352デフォルトの名無しさん:2009/01/28(水) 21:29:43
結局どのような使い方がいやだったの?
353デフォルトの名無しさん:2009/01/28(水) 21:30:46
if (!(i % j))
354デフォルトの名無しさん:2009/01/28(水) 21:30:55
if(!i%j)
355デフォルトの名無しさん:2009/01/28(水) 22:08:49
if (!p)
356デフォルトの名無しさん:2009/01/28(水) 22:45:47
別にキモイと感じるのは自由だよ
それが常識だと思い込んだり他人を批判しだしたりすると問題だけおで
357デフォルトの名無しさん:2009/01/28(水) 22:47:34
if (!strcmp(s, t))
358デフォルトの名無しさん:2009/01/28(水) 22:48:24
if(hoge == TRUE)と書くべきだと主張する奴は
if((hoge == TRUE) == TRUE)となぜ書かないのだろう
どうしてif(((hoge == TRUE) == TRUE) == TRUE)と書かないのだろう
359デフォルトの名無しさん:2009/01/28(水) 22:49:18
>>358
今のところそれを主張している人はいないように思うんだけど
360デフォルトの名無しさん:2009/01/28(水) 22:51:26
>>350
Cじゃなくても、そんな書き方しないだろ。
361デフォルトの名無しさん:2009/01/28(水) 23:09:03
かっこ付けようとしてダサいのは痛恨だなw
362デフォルトの名無しさん:2009/01/28(水) 23:27:10
ただのよくあるネタだろ
363デフォルトの名無しさん:2009/01/28(水) 23:37:18
そもそも TRUE と比較はマズいという点にも突っ込みを入れた方がいいのかな
364デフォルトの名無しさん:2009/01/28(水) 23:39:10
FALSEとの比較ならよさそうな口ぶりだな。
365デフォルトの名無しさん:2009/01/28(水) 23:41:02
TRUE よりはマシ
嫌いだが
366デフォルトの名無しさん:2009/01/28(水) 23:49:15
FALSEとの比較は常に期待した動作になるけど
TRUEは必ずしもそうとは限らないからな
どっちにしろキモいとは思うが
367デフォルトの名無しさん:2009/01/29(木) 00:03:16
言語仕様的には意図した結果が得られさえすればいいし
一般的には意図した結果が得られる限りにおいてもっとも短く記述できるのがベスト
368デフォルトの名無しさん:2009/01/29(木) 00:05:13
意図を字面から読み取れる読みやすいコードを描こうな
369デフォルトの名無しさん:2009/01/29(木) 00:06:36
int aho; /* グローバル変数 */
370デフォルトの名無しさん:2009/01/29(木) 00:11:27
短くって言うか、読みやすさだろ。

if (success) ・・・ なら、素直に成功してるって読める。
if (success != false) ・・・ とか、やめて欲しい。


今日、↓みたいなコードを見たけど、
len = strlen(s);
if (len) ・・・
こういうのはふつーに
if (len > 0) ・・・ と書いてほしい。


371デフォルトの名無しさん:2009/01/29(木) 00:15:33
意味が変わっとるがな
372デフォルトの名無しさん:2009/01/29(木) 00:34:20
lenは符号無しのsize_t型なんだろう。

>>370で、if (len)よりはif (len > 0)がいいというのと同じように、
俺はif (!(i % j))よりif ((i % j) != 0)がいいと思う。
373デフォルトの名無しさん:2009/01/29(木) 00:37:18
スタイルの話は宗教論争
少なくともこのスレでやるような話じゃない
374デフォルトの名無しさん:2009/01/29(木) 00:40:56
i % j に括弧は要らんだろう
375デフォルトの名無しさん:2009/01/29(木) 00:42:19
あっても害にはならない
376デフォルトの名無しさん:2009/01/29(木) 00:53:36
見辛いという害がある
377デフォルトの名無しさん:2009/01/29(木) 01:49:28

逆引きみたいな解説書ないですか?

つまり、たとえば
2ちゃん専用ブラウザのソースが全部載っていて、
この命令文はどういう命令文で、この部分はあとのアノ部分に
つながるわけで、、、とかいうことが全部解説してあるもの。

そして初心者が見ても理解できる内容に仕上がっているものです。
378デフォルトの名無しさん:2009/01/29(木) 02:07:16
駅前一等地で一階がコンビニの格安マンションなんて無いよ
あったら疑え
379デフォルトの名無しさん:2009/01/29(木) 02:07:52
ドキュメント作成ツールに食わせる
380デフォルトの名無しさん:2009/01/29(木) 02:47:20
あるよ
予算より随分安かったから2物件買った
381デフォルトの名無しさん:2009/01/29(木) 04:35:07
cygwinで音を出したい.
http://wisdom.sakura.ne.jp/system/winapi/media/mm6.html
のコードを
g++ wave.cpp -lwinmm -lgdi32
でコンパイルは通る&音出るけど,動作が停止する.なぜ?
こちらvista bussiness & g++ 3.4.4
382デフォルトの名無しさん:2009/01/29(木) 12:01:53
C言語のまま,擬似的にc++のようなclassなどを作る方法があると聞いたのですが
どんな方法なのでしょうか?
boost.PPも使えるとか
383デフォルトの名無しさん:2009/01/29(木) 12:42:13
381です.
cygwinのdefaultのg=++からMinGWのg++に変更したらあっさり解決しました.
Vistaが原因なのかcygwinが原因なのかはわからずじまい.
384デフォルトの名無しさん:2009/01/29(木) 14:02:30
進学のために名古屋に行く事になったのですが、プログラミングに関する書籍が多い書店を教えてください。絶版書とか
385デフォルトの名無しさん:2009/01/29(木) 14:04:16
スレ違いにもほどがある
386デフォルトの名無しさん:2009/01/29(木) 14:05:11
>>385
誘導してくれ
387デフォルトの名無しさん:2009/01/29(木) 14:06:58
>>384
大学生協の書籍売り場
388デフォルトの名無しさん:2009/01/29(木) 14:54:01
再び質問です。
Borland C++で、exeファイルにバージョン情報を入れたいんですが、
入れ方を教えてください。
389デフォルトの名無しさん:2009/01/29(木) 15:07:25
変数
"VERSION XXX"
みたいな内容を含む変数を挿入する。
390デフォルトの名無しさん:2009/01/29(木) 15:33:31
>>382
入門者が使う必要はありません
>>388
入門者が入れる必要はありません
391デフォルトの名無しさん:2009/01/29(木) 15:49:39
?入門者ならば必須だろ?そういう知識は。
初心者はやらなくても許されるかも知れないが
392デフォルトの名無しさん:2009/01/29(木) 16:56:19
bcc++ってバージョンリソース埋め込まないの?
393デフォルトの名無しさん:2009/01/29(木) 19:27:50
C言語をテーマに川柳を作ってください
394デフォルトの名無しさん:2009/01/29(木) 19:35:15
C言語
なら俺に聞け
入門篇
395デフォルトの名無しさん:2009/01/29(木) 19:39:22
>>391
必要ない。
CにはCの流儀というものがある。クラスを使いたいならC++を使えばいい。
実行ファイルの埋め込み情報はファイルシステムの問題であってC言語とまったく関係ない。
396デフォルトの名無しさん:2009/01/29(木) 19:45:55
ファイルシステムの問題じゃないでしょ
397デフォルトの名無しさん:2009/01/29(木) 20:04:15
398デフォルトの名無しさん:2009/01/29(木) 20:22:22
ファイルシステムの問題かも知れないし
実行イメージのフォーマットの問題かも知れないし
>>389 のような埋め込み方しか出来ないかも知れない。

いずれにしろスレ違い。
399デフォルトの名無しさん:2009/01/29(木) 20:22:56
>>397
400デフォルトの名無しさん:2009/01/29(木) 20:51:11
>>257
ggrks

それでもわからないならwinver
401デフォルトの名無しさん:2009/01/29(木) 21:10:18
402デフォルトの名無しさん:2009/01/29(木) 21:11:04
403デフォルトの名無しさん:2009/01/29(木) 21:14:08
>>393
回答者
わからなければ
ググレカス
404デフォルトの名無しさん:2009/01/29(木) 21:23:21
ググレカス
英語でいえば
ググルは友達
405デフォルトの名無しさん:2009/01/29(木) 21:24:59
字余りすぎ
406デフォルトの名無しさん:2009/01/29(木) 22:25:33
lineに"523,534,234,54\0"と格納されている状態で
sscanf(line,"%d,%d,%d,%d,%d,%d",&x.a, &x.b, &y.a, &y.b);
で構造体のx.a,x.b.y.a,y.bに整数を入れたいんですがうまくいきません
どこか間違ってますか?
407デフォルトの名無しさん:2009/01/29(木) 22:26:37
上手くいかないというのは、もっと大きな数字が代入されてしまうということです
よろしくおねがいします
408デフォルトの名無しさん:2009/01/29(木) 22:33:06
すいません、上手くいきました
409デフォルトの名無しさん:2009/01/29(木) 22:33:15
うまくいかない最小のソースコードを書いてみてください
410デフォルトの名無しさん:2009/01/30(金) 00:07:16
C言語の入門書に


・次の3つは同じなのです
 &str[n]
pstr + n
&pstr[n]

と書いてありました。真ん中と下が同じなのは解ります
が、どうして上も同じなのですか?
411デフォルトの名無しさん:2009/01/30(金) 00:12:14
>>410
strとpstrがどう宣言されてるか見ないと分からない。
412デフォルトの名無しさん:2009/01/30(金) 00:16:56
char str[hoge];
char *pstr = str;
ならそうだろうね
413デフォルトの名無しさん:2009/01/30(金) 00:26:32
真ん中は違うだろw
414デフォルトの名無しさん:2009/01/30(金) 00:32:13
415デフォルトの名無しさん:2009/01/30(金) 00:32:34
>>411
pstrは恐らく配列で宣言されたものと思われます。
strも配列で宣言されたことを前提かと・・・ん〜
唐突に次の3つは同じものと書かれていたので混乱しています;

>>412
ご解答ありがとうございます。
416410:2009/01/30(金) 00:47:44
やはり>>412さんの

char str[hoge];
char *pstr = str;

のように宣言されていなければ
同じではないという解釈で大丈夫ですか?

どう宣言されたかも書かれていないので
それ以外思い浮かばないのですが・・・
417デフォルトの名無しさん:2009/01/30(金) 01:07:00
変数名を見る限りは
char str[hoge];
char *pstr = str;
を意図しているようには見えるけどね。
418デフォルトの名無しさん:2009/01/30(金) 01:12:17
どなたかR言語わかるかたいらっしゃいませんか〜
419デフォルトの名無しさん:2009/01/30(金) 01:17:55
>>417
言われてみると、確かにそれを意図しているように見えますね
それなら納得できます

ありがとうございました
420デフォルトの名無しさん:2009/01/30(金) 02:21:48
void fil2a(char *name, char *tel) {
printf("氏名を入力: ");
gets(name);
printf("電話番号を入力: ");
gets(tel);
}

これを実行すると
氏名を入力: 電話番号を入力:

↑のようになってしまって、後ろのgets()一回しか実行されなくて困っています。

氏名を入力:
電話番号を入力:

というように二回gets()を実行するにはどうすればよいのでしょうか。
421420:2009/01/30(金) 02:38:15
ひょっとして前の関数でscanf()関数を使ってるから?wikiによると、
「scanf で呼ばれた直後に gets を呼ぶと入力ストリームの先頭に改行文字が残っているため gets は空の文字列を返してしまう」
ということらしいですが・・・。

これを書きながらいろいろやってる内に一応目的の動作はするようになったのですが、
下のようなやり方は、果たしてよいものなのでしょうか?

void fil2a(char *name, char *tel) {
printf("氏名を入力: ");
gets(name);
gets(name);
printf("電話番号を入力: ");
gets(tel);
}
422デフォルトの名無しさん:2009/01/30(金) 02:44:55
よくない。
何が良くないかというと、getsを使うことが良くない
423デフォルトの名無しさん:2009/01/30(金) 02:46:07
そのプログラムを動かすだけならそれでいいけど、
fil2a()が呼び出された時点でストリームに改行が残っていないと期待通りに動かないのでは?
他の場面でfil2a()を呼び出すときも、それを忘れないようにしないとね。まあgets()使わないのが望ましいけど。
424デフォルトの名無しさん:2009/01/30(金) 02:47:09
どのくらい良くないかというと、gccでコンパイルした時に以下の警告が出るぐらいに良くない。
warning: the `gets' function is dangerous and should not be used.
425デフォルトの名無しさん:2009/01/30(金) 02:48:39
>>418

数学板の統計スレ行け。
あっちにいる。
426420:2009/01/30(金) 03:12:37
レスありがとうございます。
ここまで危険視されているとは、まさにgets()恐るべしといったところです。
練習もかねて、scanf()関数で文字列の読み取りを行うようにしてみます。
427デフォルトの名無しさん:2009/01/30(金) 06:25:07
statでファイル情報を取得して、そのファイルサイズをa.st_sizeとしたときに
ファイルサイズを小さい順に並び変えたいのですが、その場合ってどうしたらいいんですか。
普通にqsortとか使っていいんですか。
428デフォルトの名無しさん:2009/01/30(金) 07:36:56
>>427
遠慮なく使ってやってください。

>>426
scanf()でもいいけれど、fgets()してsscanf()を使うのが常套手段だから慣れておくといいよ。
429デフォルトの名無しさん:2009/01/30(金) 12:59:34
ああ、猫でもわかるC言語の問題がちらほら見える
俺もあれ使ってるけど、最初のうち物凄い懇切丁寧で分かりやすいのに
ポインタあたりから突然ソース丸投げ、説明端折りまくりでわけ分からなくなるよなw
一番大事な部分なのにあの説明の少なさは酷い
ポインタで躓く人が多いって書いてるのにこの本が一番分かりづらい
430デフォルトの名無しさん:2009/01/30(金) 13:28:27
>>429
実は作者もポインタをよく理解していないという事情が…あるのかもね!
431デフォルトの名無しさん:2009/01/30(金) 13:45:24
猫はWinAPI関連のはいいんだけどC自体はちょっと
432デフォルトの名無しさん:2009/01/30(金) 14:39:02

こんちは

C言語、「一般的なレベルの専門学生」っていうと、
どの辺までできるもんだと想像しますか?
433デフォルトの名無しさん:2009/01/30(金) 14:42:30
haro- wa-rud
434デフォルトの名無しさん:2009/01/30(金) 14:50:12
>>432みたいなアホな質問をするレベル
435デフォルトの名無しさん:2009/01/30(金) 16:25:57
双方向リストの追加削除、ファイルを使った保存読み込み
人対人のオセロゲーム(コンソールで十分。ネットワーク越しの対戦が可能ならさらによい)
ぐらいはできるようになってるんじゃないの、とおもう。
436デフォルトの名無しさん:2009/01/30(金) 19:06:37
>>432
scanfにポインタでない実引数を渡す
437デフォルトの名無しさん:2009/01/30(金) 20:25:53
>>435
そんなの学校いかなくても自習だけでできるよ
438デフォルトの名無しさん:2009/01/30(金) 20:26:15
>>435>>436
ありがとうございます

私はよくわからないんですが、

「プロンプトでの引数の渡し方、ファイルへの書き出し、
バイナリファイルの入出力、構造体、マクロ、共用体と列挙体、
、複数ファイルのプログラム、メモリ管理、」
はどの辺になりますか?

専門生としては初歩でも知ってる感じでしょうか?
439デフォルトの名無しさん:2009/01/30(金) 21:02:59
>>438
学校なんてピンキリだろ。
何にも出来ないまま卒業するやつだっているし。
質問がバカだって言ってんだよ。
440デフォルトの名無しさん:2009/01/30(金) 21:04:42
双方向線形リストのプログラムを書いていますが
リスト構造体の宣言の部分周辺で以下のようなエラーが出てコンパイルできません。
使用中のコンパイラはMSVC++2008Exです。
list.h(19) : error C2061: 構文エラー : 識別子 'LIST'
list.h(20) : error C2143: 構文エラー : '{' が '*' の前にありません。
list.h(21) : error C2059: 構文エラー : '}'
ソースは以下にあります。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8790.zip
どうしてエラーになるのでしょうか。
またどうすればエラーを解決できますか。
441デフォルトの名無しさん:2009/01/30(金) 21:07:56
>>439
そんなことも全部ひっくるめたイメージってことの前提で
聞いているつもりでつ
442デフォルトの名無しさん:2009/01/30(金) 21:20:56
>>438で言うようなことは、いい学校なら最初の半年のうちには習うし、
出来のいい学生なら、入学前から出来る。

ダメな学校なら一年掛けて教えるし、
ダメな学生なら、卒業してもそれが出来ない。
443デフォルトの名無しさん:2009/01/30(金) 21:25:01
>>441
カリキュラムには含まれているだろうが
半分以上の卒業生は分かっていない

そんな感じ

高校卒業してるからといっても
英作文できるやつのほうが少数でしょ
中学・高校で6年もやってるのにね
444デフォルトの名無しさん:2009/01/30(金) 21:31:19
>>442>>443
ありがとうございます

あれは臭いを嗅げる程度の入門書の目次からの抜粋なのですが、
はじめがきに
「これだけ知っていれば、C言語でプログラムが書けます、
と言えるだけの必要最低限の基礎知識に絞って解説してあります」
って書いてありました。

445デフォルトの名無しさん:2009/01/30(金) 21:33:01
そんなくだらないこと気にする前に一行でも多く書け
446デフォルトの名無しさん:2009/01/30(金) 21:41:30
>>444
専門学校に限らずダメ学校の生徒は技術者にならない場合が多いし、
何処の学校でもダメな学生は技術者にならないだろ。
考えていることがムダ。
447デフォルトの名無しさん:2009/01/30(金) 22:37:20
>>440
中身読んでないけど、構造体の定義のあるヘッダをインクルードし忘れてるんだろう
448デフォルトの名無しさん:2009/01/30(金) 22:52:23
>>447
typedef struct LIST {
int data;
LIST* prev;
LIST* next;
} list;
449デフォルトの名無しさん:2009/01/30(金) 22:55:50
確かに挿入し忘れてるな。structというヘッダーキーワードが
450デフォルトの名無しさん:2009/01/30(金) 22:59:46
typedef struct LIST {
int data;
struct LIST* prev;
struct LIST* next;
} list;
451デフォルトの名無しさん:2009/01/30(金) 23:01:21
typedef struct LIST list;

struct LIST{
int data;
list* prev;
list* next;
};
452まりも:2009/01/30(金) 23:25:49
ポインタについて聞きたいのだけど、配列 char map[10][10];があるとして、
普通に、その配列だけで、できてしまうけど、2次元配列をわざわざ間接参照
*(point+[x*y]+y) で参照させるのが良くわからない。
453デフォルトの名無しさん:2009/01/30(金) 23:28:04
よく分からない
454デフォルトの名無しさん:2009/01/30(金) 23:31:51
全然分からないw
455デフォルトの名無しさん:2009/01/30(金) 23:35:00
とりあえずコンパイル通るコードを書いてくれ
456デフォルトの名無しさん:2009/01/31(土) 00:13:00
よしよし頭悪すぎw
457デフォルトの名無しさん:2009/01/31(土) 00:21:56
Windows 32bitOSですが、VC++
4GBのファイルに fopen関数 ab+ でファイルオープンして
fwrite関数で追加書き込みできなくて困ってます。
fwrite関数で4GB以上のファイルって扱えますか?
4GB以上のファイルにライトした場合、
fwriteの戻り値もエラーにならないのですが?
458デフォルトの名無しさん:2009/01/31(土) 00:31:47
VC++ なら fopen なんぞ使わずに CreateFile 使おうぜ
459デフォルトの名無しさん:2009/01/31(土) 00:43:09
>>458
CreateFileで4G以上OK?
460デフォルトの名無しさん:2009/01/31(土) 00:56:35
4GB 以上なんて扱った事は無いけど
引数が明らかに 4GB 以上に対応しているから
大丈夫なんでない?
461デフォルトの名無しさん:2009/01/31(土) 00:59:22
もし、CreateFileで駄目だったら、ディスクに直接アクセスするしかない。
もちろん、そんなことありえないので、CreateFileは4GB越えも扱える。

462デフォルトの名無しさん:2009/01/31(土) 02:50:15
>>437
ちょっと聞きたいんだが、学校でないと学べないことって何がある?
463デフォルトの名無しさん:2009/01/31(土) 03:06:42
>>457
"a+"じゃなくて普通に"r+"で開いて
末尾に_lseeki64を使ってSEEKしてから書き込めば大丈夫かもな。

Win32のファイルには"追記モード"は無くて、ライブラリが独自に末尾にseekして書き込んでるから
その部分で4Gを超えられないんだろう。
464デフォルトの名無しさん:2009/01/31(土) 03:08:16
あ、seekが不可なだけで、シーケンシャルな読み書きなら
普通のfread等で充分可能だから。
もちろん、stat等でのファイルサイズはビット数が足りないけどね。
465デフォルトの名無しさん:2009/01/31(土) 10:08:35

小数点第一を.0じゃなく、ちゃんと入力した数字にあった小数点を出したい
466デフォルトの名無しさん:2009/01/31(土) 10:10:23
>>465
入力はそのまま文字列として保存しておけばよろしかろ。
467デフォルトの名無しさん:2009/01/31(土) 10:27:19
>>465
int suuji;
scanf("%f", &suuji);
printf("%f\n", suuji);

こんなことしてるとか?
468デフォルトの名無しさん:2009/01/31(土) 10:28:33
>>467
二重に間違ったコードを書くなよ。まともに動きさえしないじゃないか。
469デフォルトの名無しさん:2009/01/31(土) 10:30:01
いや、だから間違ったコード書いてるんだろ。
470デフォルトの名無しさん:2009/01/31(土) 10:31:34
いや、だから>467ではどんな結果になると思っている?
恐らく、想定しているだろう間違いにはならないぞ。
471デフォルトの名無しさん:2009/01/31(土) 10:32:15
static int love;


うわああああああああああああいあああ
472デフォルトの名無しさん:2009/01/31(土) 10:37:42
const int love = 0;
473デフォルトの名無しさん:2009/01/31(土) 10:38:07
>>470
>>467は君に「想定しているだろう」と想像させるだけの意味は持っているってことだよね。
>>467に提示した意義はそれで達成されるんだけど。
474デフォルトの名無しさん:2009/01/31(土) 10:38:50
それじゃ元質は置き去りだがな。
475デフォルトの名無しさん:2009/01/31(土) 10:39:26
volatile void *love;
476デフォルトの名無しさん:2009/01/31(土) 10:40:42
上げ厨うぜえ。
477デフォルトの名無しさん:2009/01/31(土) 10:42:58
出た、下げ厨
478デフォルトの名無しさん:2009/01/31(土) 13:09:41
二人あわせて、asage厨です。
479デフォルトの名無しさん:2009/01/31(土) 13:11:14
なんだ味噌汁か
480デフォルトの名無しさん:2009/01/31(土) 13:12:33
if(i%2=1)

長年の疑問なんだけどなんでこれで奇数を判定するのか原理を教えてくれろ
481デフォルトの名無しさん:2009/01/31(土) 13:14:32
2で割ると1余る数が奇数だから。

%は前者を後者で割った余りを求める演算子。
482デフォルトの名無しさん:2009/01/31(土) 13:14:41
>>480
なんで長年の疑問になるのかが分からないや
483デフォルトの名無しさん:2009/01/31(土) 13:15:05
=じゃなくて==だね。
484デフォルトの名無しさん:2009/01/31(土) 13:17:44
>>480
んじゃ、2で割り切れたら偶数、そうでなきゃ奇数って判定にしてみては?
485デフォルトの名無しさん:2009/01/31(土) 13:19:29
奇数は2で割ったらあまりが必ず1になんじゃん?
486デフォルトの名無しさん:2009/01/31(土) 13:22:07
まぁ、2n+1で表せるからね・・・
487デフォルトの名無しさん:2009/01/31(土) 13:26:28
まあまあ。
2歳の時に疑問に思って12歳になって質問してるのかもしれないじゃないの。
488デフォルトの名無しさん:2009/01/31(土) 13:27:12
if(i%2)
すいませんこうでした
489デフォルトの名無しさん:2009/01/31(土) 13:29:15
>>488
式の評価や計算式の結果が0か否かで if文以下が実行されるから。
490デフォルトの名無しさん:2009/01/31(土) 13:29:47
Cでは0が偽、それ以外が真
奇数なら割った余りが1で真、偶数なら0で偽になる

つまり、奇数を判定できる
491デフォルトの名無しさん:2009/01/31(土) 13:29:56
式の評価については、真だったら1、偽だったら0が返ってくる仕組みがある
492デフォルトの名無しさん:2009/01/31(土) 13:32:33
>>491
それは嘘だろ。
493デフォルトの名無しさん:2009/01/31(土) 13:33:41
>>492
なんで?最終的には、何かしら数値が扱われている仕組みがあるが
真だった場合、1以外の値が返ってくる環境があるなら、教えてくれ。
とりあえずここ、C言語に関してだが。
494デフォルトの名無しさん:2009/01/31(土) 13:34:20
何も帰ってこないことはあるな
495デフォルトの名無しさん:2009/01/31(土) 13:34:49
式の評価じゃなくて、比較演算子の評価だろ。
496デフォルトの名無しさん:2009/01/31(土) 13:35:20
>>493
それじゃあ、「真だったら1、偽だったら0が返ってくる」式の例を教えてよ。
497デフォルトの名無しさん:2009/01/31(土) 13:36:15
>>493
「式の評価」って何の事をいってるの?
比較演算子の結果という意味?
498デフォルトの名無しさん:2009/01/31(土) 13:37:04
#include <stdio.h>

int main(void)
{
int a,b,eval;

printf("Input > ");
scanf("%d %d",&a,&b);

printf("a:%d / b:%d / a=b?:%d \n",a,b,(a==b));

return 0;
}

2つの値、aとbが同じか、式の評価で返ってくる値は真のときは1、偽なら0だが?
嘘とか言う前に、確認してから意見しろよ、青二才。
499デフォルトの名無しさん:2009/01/31(土) 13:39:22
>>498
Cで式というのががなんのことを指すのか確認したほうがいいよ
500デフォルトの名無しさん:2009/01/31(土) 13:40:21
>>494
帰って<日本語でおk
>>495
評価の意味が分かってないだろ?
>>496
だからお前は確認したのかよ?例えば変数aとbがあって、a==bが成立するとき
if(a==b)以下の文が実行されるが、単純に if(a) という形にして、aに0か0以外を入れてみたか?
しかし、比較演算子による評価では、真のときは1が返ってきているんだが?
>>497
分かっているのにしらばっくれるその態度、きめぇ。引きこもり低学歴だろ?w
501デフォルトの名無しさん:2009/01/31(土) 13:40:32
判定できないとおもいます
502デフォルトの名無しさん:2009/01/31(土) 13:43:11
>>489 正解!
>>490 正解!
>>491 馬鹿w
503デフォルトの名無しさん:2009/01/31(土) 13:46:23
>式の評価については、真だったら1、偽だったら0が返ってくる仕組みがある

ねーよwwwww
504デフォルトの名無しさん:2009/01/31(土) 13:47:44
とにかく、whileの繰り返しの条件文に於いても、0か否かで0なら繰り返し終了とはなるが、
そこにも比較演算子で == , && などが使える。そして、その評価式自信が返している値は
真なら1、偽なら0なんだが。とにかく、真なら0以外という考え方もあるけど、
他の言語においては、bool型というのも存在し、それはTRUEかFALSEという扱いではあるが
結局のところ、0か否かでもあるが、1か0が扱われているわけだ。その程度のことも知らないで
嘘だの言える奴の気が知れない。どんだけ思い上がっている、視野の狭いガキだよ?
あっ、おっさんか?だとしたら、視野の狭い世界観しかもてなくて、この世を去るんだね。
いかに自分の存在がちっぽけだったか、気づくのは死ぬ直前かもな。あぁ、これで俺の人生は終わる。
俺の人生、なんだったんだろ?比較演算子による真偽の結果すら、理解せずにこの世を去るのか・・・
まぁ、この世に様々人がいて、プログラミングすらしない人はいくらでもいますよ?
ほら、もっと他の様々な人を見てごらん?生きてるだけで、働かなくてもお金を得る人もいますよ?
そう、金のなる財産を持てば、こんな詰らない議論で争うこともないんだよ?
金持ち喧嘩せずって言うでしょ?詰らないことを気にしていると、すぐに禿ますよ?
あっ、もう既に禿ちゃったか?
505デフォルトの名無しさん:2009/01/31(土) 13:50:03
>>503
>>498の(a==b)の部分に何が表示されている?あんたがどう思うかじゃないんだよ。
計算機が結果を出しているんだが?w
それじゃ、あんたのところじゃ、真だったら0以外の気まぐれな値が返ってくるんだぁ
へぇ〜すげぇ〜、どんな環境?もし良かったら、その変な時代遅れのへちょい
マシンを教えてくれない?俺の通っていた大学でも、そんなものはなかったよ?
あっ、俺大学生だったのは10年も前の話だけどw
あの大学、すごかったからなぁ・・・今じゃあのときの、何千倍もの処理能力を持った
コンピュータを持っているだろうな・・・なんせ、コンピュータを専用に扱う建物があったし。
506デフォルトの名無しさん:2009/01/31(土) 13:52:49
真であり、かつ、1以外の値が返ってくる式の例

1+3;
507デフォルトの名無しさん:2009/01/31(土) 13:55:23
「式の評価」なんていう言葉を使うから訳が分からんのだ
勝手な造語をどうしても使いたいのなら言葉の定義をしてくれ

「式の評価」の結果という表現だけではさっぱり分からん

例として次の場合
a ? "not zero" : "zero";
a という式の評価結果はいかなる場合においてもリテラルを指すポインタになる
と表現できるんだぜ
508デフォルトの名無しさん:2009/01/31(土) 13:56:09
では次、

printf("a:%d / b:%d / a!=b?:%d \n",a,b,a!=b);

でaとbが異なる値だった場合は真となるのだが、その時 a!=b が返してきた値は何だった?
まぁ、兎にも角にも、真なら0以外というのは間違ってはいないけど?偽なら0は確かに言える。
しかし、真なら1を返しているんだよね。それ以外の値を気まぐれで返す?
そんな環境があるなら、是非とも教えてくれ。知りたい。死ぬまでに。
まぁ、知ったところで、0でなきゃifやwhile文が実行されるなら、気にしないけどねw
だって、変なことを気にしても、寿命を縮めるだけだし。そんな詰らない生き方、したくないし。
まだ俺は半世紀以上、健全に健康的に生きる予定だからw
509デフォルトの名無しさん:2009/01/31(土) 13:56:19
こいつはrand君か
510デフォルトの名無しさん:2009/01/31(土) 13:58:19
馬鹿と言うより病気だな
511デフォルトの名無しさん:2009/01/31(土) 13:58:46
オマエラカナリアホダナ
512デフォルトの名無しさん:2009/01/31(土) 14:01:59
あとな、なんだかんだ言っても、デジタル機器は追求すると、2進数、
0と1の組み合わせの仕組みで成り立っている点は外せない。
単純にあるか無いか?しかし、それを使って複雑にパターンを
いくつか表現する仕組みもあるわけだ。だからなんだと?
まぁ、こんなの大学の授業じゃ序の口。俺は実験でそれ以上のことをやったけどな。
そのそれ以上に、論理回路に関わるものもあったが。
2進数の仕組み、先頭の符号で正と負を表すことについてや、
コードを使って回路を作ることも。入力する値でどういう結果が出るか?
そういうのを見ると、単純に AND や OR の結果がどう返ってきているか、知ることが出来る。
まぁ、そんなの、お前らじゃ知らないだろう。低レベルだろうから。あばよ、いつまでも
底辺を這い蹲る諸君。所詮、俺は君らとは次元が違う世界に住んでいるのだよ。
扱っているものに、共通するものはあれど、レベル、格が違うんだぜ?
同じ食材を使っても、最終的にどんな料理が出来るか、違うかのように、ね?
513デフォルトの名無しさん:2009/01/31(土) 14:03:09
病気だね。
514デフォルトの名無しさん:2009/01/31(土) 14:03:53
内容はともかくとしてタイピングだけは俺より早い
515デフォルトの名無しさん:2009/01/31(土) 14:04:44
バカの擁護するのはあまり気が乗らないがJIS X3010の6.5.9には
「各演算子は指定された関係が真の場合は1を、偽の場合は0を返す。」とある
とはいえC言語使うなら「真ならば1」とは言っちゃいかんな
入門者が覚えるべきは「非0ならば真」ということでいいんじゃね?
516デフォルトの名無しさん:2009/01/31(土) 14:12:23
>>490が言っていることが不十分ってことで。
実際、比較演算子で == や != で返ってきた値は、真なら1、偽なら0だし。
これは実行すればすぐに分かること。ただ、ifやwhile文では、その()の中に
0か否かで実行されるかが決まるという仕組みがあることを言っているに過ぎない。
== や != 、また、 && や || など論理演算子でも試してみれば分かるが、
それらが返してくる結果は、やはり0か1なんだなぁ。真だったら、あるいは
どちらかが成立するか、2つの変数を用いた場合でも、結果は0か1なんだなぁ。
やってみれば、誰もが分かるし、知りうる事実なんだなぁ。
よって、式の評価で真なら1、偽は0というのは、間違ってもいなければ嘘でもない。
そこまで物申すなら、てめぇが使っているPCに文句を言ってやれw
517デフォルトの名無しさん:2009/01/31(土) 14:13:23
>>515
それは正しいが、
彼は、等値演算子の話ではなく、謎の「式の評価」の話をしている。
518デフォルトの名無しさん:2009/01/31(土) 14:15:17
>実行すればすぐに分かること

こういうこと言う派遣は即刻クビにしてる。
実装依存とか、コンパイラ依存とか困るからな。
519デフォルトの名無しさん:2009/01/31(土) 14:16:10
>>515
そんなことより「式の評価」の意味は?
こっちを擁護してあげたら?
520デフォルトの名無しさん:2009/01/31(土) 14:16:12
ちなみに、今回は i%2 と、余りが0か1かではあったが、これを
i%3 などにして、余りが0かそうでないかでも、if文やwhile文などの
実行に使えるわけだが、この場合、真か偽ではなく、if()の中に与えた値が
0か否かであって、式の評価で真偽を求めたものではない。
その仕組みを使ったテクニックに過ぎんよ。式の評価はあくまでも真か偽か?
また、代入式を用いて、左側の変数に代入された値を使うやり方もあるけど。
まぁ、なんだ、とにかく 俺とお前らでは確実に 格段に レベル が違うんだよ、わははははw
悔しかったら、年商何億の会社でも立ち上げてみろ?
521デフォルトの名無しさん:2009/01/31(土) 14:18:02
3 + 5

と言う式を評価したら、8が返ってきました
522デフォルトの名無しさん:2009/01/31(土) 14:19:22
a==bの真偽で返ってくる値が0か0以外かで、わざわざ0以外だからって
893とか801とか返してくるわけねーだろJK
真なら1で問題ないよ。どこのヘタレ知ったかプログラマだよ、こいつ?w
523デフォルトの名無しさん:2009/01/31(土) 14:20:04
>>519
ごめん そりゃ無理ってもんだわ
524デフォルトの名無しさん:2009/01/31(土) 14:20:29
>a==bの真偽で返ってくる値が0か0以外かで、わざわざ0以外だからって
はずれ
525デフォルトの名無しさん:2009/01/31(土) 14:22:07
a==b ? 893 : 801;
526デフォルトの名無しさん:2009/01/31(土) 14:22:56
真なら1が返ってくる、に対して嘘といった貴方、自分の環境で真なら
何が返ってきたか、教えて下さい。え?0721が返ってきた?
なんというエロい環境だ、今すぐPCを窓から(ry
527デフォルトの名無しさん:2009/01/31(土) 14:23:44
で、「式の評価」って何なの?
528デフォルトの名無しさん:2009/01/31(土) 14:25:20
cond ? 0 : 0721
529デフォルトの名無しさん:2009/01/31(土) 14:25:25
ぶははははは、間違っていない、PCが実行した結果に対して嘘と言う嘘つきw
お前が嘘つきじゃ、ボケぇw
悔しかったら、それを覆すようなへんてこりんなマシンでも作ったらぁ?
まぁ、そんな変態マシンが売れるとは思わんが、CPUはintelやAMDが
製造したものが流通しているし、M/BもそれらのCPUが組み込めるものが多いし。
真なら気まぐれで0以外は当然のごとく、さらに1以外の値も返す環境を是非とも
今世紀中に完成させてくれw
あっ、うちの企業じゃそんなの採用しないけどw
530デフォルトの名無しさん:2009/01/31(土) 14:26:35
とニートが申しております。
531デフォルトの名無しさん:2009/01/31(土) 14:28:08
なんでそんなに火病ったのかが分からん。
532デフォルトの名無しさん:2009/01/31(土) 14:29:46
よっぽど悔しかったんだろうな
533デフォルトの名無しさん:2009/01/31(土) 14:31:51
ifがする判定→「0」と「0以外」
真偽式がする判定→「0」と「1」
式が持ちうる値→Priceless
534デフォルトの名無しさん:2009/01/31(土) 14:33:17
でもタイピングだけはほんとに早い
535デフォルトの名無しさん:2009/01/31(土) 14:33:44
戻り値 式の評価(引数)
{
 if(引数==真)
  return 1;
 if(引数==偽)
  return 0;
 return 未定義;
}
536デフォルトの名無しさん:2009/01/31(土) 14:37:03
真か偽を0かそれ以外のどれか1〜、あるいは-1〜で表現されている環境があるなら
是非とも教えて下さい!ひっじょーーーーーーーーーーーーーーーに下らないけど
死ぬまでに知りたいぜ、そんなヘンテコリンなマシンをw
あっ、でも買わないよ。要らないから、そんな変な環境もOSもw
537デフォルトの名無しさん:2009/01/31(土) 14:38:41
isalpha('a');
どう見ても真です
538デフォルトの名無しさん:2009/01/31(土) 14:48:56
久々に変なのがわいているな
いったい何の話をしているんだ
539デフォルトの名無しさん:2009/01/31(土) 14:50:57
>>538
>>491を否定されて火病ってるらしい
540デフォルトの名無しさん:2009/01/31(土) 14:51:02
rand君と聞いてやってきますた
541デフォルトの名無しさん:2009/01/31(土) 14:51:43
ぶははははは、ぎゃはははははは、ソースコード、実行結果で結論が出ているのに
評価で真なら0以外w 0以外なら真というのは分かるが、敢えて真偽で真なら0以外のどれかw
意味合いが違うってことに、いい加減気づいてね ♥
あと、あれを真偽と解釈するか、疑問の余地在り。
542デフォルトの名無しさん:2009/01/31(土) 14:54:34
>>538
ひさびさっていうか、こいつはしょっちゅう湧くぞw
543デフォルトの名無しさん:2009/01/31(土) 14:54:49
こいつ、真偽値として1, 0が生成されることを
OSかマシンアーキテクチャによるものと勘違いしている節がある。
どうしようもないな。
544デフォルトの名無しさん:2009/01/31(土) 14:56:26
どうしようもないことは
>ぶははははは、ぎゃはははははは、
この部分ですでに分かる。
545デフォルトの名無しさん:2009/01/31(土) 14:58:04
真偽で真なら1が嘘wwwww 本当なのに、何が真偽やら?
にしても、真偽とある値が0か否かでifやwhile文などを実行する場合は
別に1でなければいけないわけじゃないが、それをいちいち 真 と言うのかね?w
546デフォルトの名無しさん:2009/01/31(土) 14:59:23
結局、>>491の「式の評価」って何なの?
547デフォルトの名無しさん:2009/01/31(土) 15:00:51
>>542
おれが久々にきたってだけか
548デフォルトの名無しさん:2009/01/31(土) 15:01:16
「条件式を評価するとその結果」と言いたかったのだろう。
549デフォルトの名無しさん:2009/01/31(土) 15:01:22
>>545
>ifやwhile文などを実行する場合は
>別に1でなければいけないわけじゃないが、それをいちいち 真 と言うのかね?w
ifやwhileの条件部は「真偽」を判定しています
1以外の数字でも「真」であると判定されるのです
550デフォルトの名無しさん:2009/01/31(土) 15:01:50
真偽で真なら0以外でも1ではない何かって、どんだけ捻くれた環境だよwwww
偽なら0で真なら0以外としても、普通に1が使われてんじゃん、あの実行結果で分かるようにwww
頭おかしいんじゃね?
551デフォルトの名無しさん:2009/01/31(土) 15:02:42
>>547
最近だと代入式でも暴れてたし
552デフォルトの名無しさん:2009/01/31(土) 15:03:56
思い込みが激しくて他人の言ってる内容が理解できないから議論にもならない。
なぜか、自分の方が頭いいと思ってるらしいから余計手に負えない。
553デフォルトの名無しさん:2009/01/31(土) 15:05:56
先生!a=1 , b=1 の時、 a==b が返す値は何ですか!?
先生の環境でどんな結果が出たか、お答え下さい!
くれぐれもっ、先生の、脳内解釈や妄想でのお答えは、お止めください!
554デフォルトの名無しさん:2009/01/31(土) 15:06:09
>>537が全てだな。
555デフォルトの名無しさん:2009/01/31(土) 15:06:45
「式の評価」という言葉はあるよ。
これは実際に値を計算したり関数を呼び出したりすることによって行われる。
ちなみに、式の末に";"をつけると「式文」という文になり、
制御構文の中身などにも使える。

ただ、これと、「関係演算子の演算結果が真のときに1を返す」はあまり関係ないね。
「関係演算子を評価すると0か1を返す」というだけのことで。
556デフォルトの名無しさん:2009/01/31(土) 15:09:23
つまり、「式」というのは値を持つわけで、その「値」を計算することを
「式を評価する」と言うんだな。

でも、>>491はそのことをわかってないけど。
557デフォルトの名無しさん:2009/01/31(土) 15:09:44
>>555
彼の脳内では、自分への反論は比較演算子や論理演算子が1以外を返すって主張に
自動的に変換されてるから。
558デフォルトの名無しさん:2009/01/31(土) 15:11:48
ある意味天才だな。私にはできない解釈だ。
559デフォルトの名無しさん:2009/01/31(土) 15:18:46
a==bの返す値が偽なら0だけど、真なら1だけでなく、それ以外のものもあるって
どんだけえぇ〜wwwww 調べもしないで、他人を嘘呼ばわりする基地外ってやーね
思い込みが激しいんだろうね。そんなんだから、社会に適合しないんだよ、ちみは。
何事にも、式が返す値というのはあるのだよ、ワトソン君。
560デフォルトの名無しさん:2009/01/31(土) 15:19:31
>>557
確かにその通りだなw
561デフォルトの名無しさん:2009/01/31(土) 15:25:33
もしかしたら彼は本当に「式」ってのが何なのかをわかってないのかもしれないね
ここまでファビョってる姿を見るとそう思えてくるよ
562デフォルトの名無しさん:2009/01/31(土) 15:26:38
そんなことは前に代入式でファビョったときからわかりきってるw
563デフォルトの名無しさん:2009/01/31(土) 15:52:47
薬を飲んで落ち着いたらしい
564デフォルトの名無しさん:2009/01/31(土) 15:56:14
無理に呼び出す必要も無い
565デフォルトの名無しさん:2009/01/31(土) 16:42:20
rand_kun();
566デフォルトの名無しさん:2009/01/31(土) 17:44:25
スレがのびてるから見てみたら固定湧きだったでござるの巻
567デフォルトの名無しさん:2009/01/31(土) 17:56:24
また何か暴れてるのか
勘弁してくれ
568デフォルトの名無しさん:2009/01/31(土) 20:09:03
char ss[ ] ="123abc"; としたら
ss[4]の値はいくらになるんですか?エラーになりますか?
569デフォルトの名無しさん:2009/01/31(土) 20:11:00
>>568
'b'
570デフォルトの名無しさん:2009/01/31(土) 20:27:12
お手数かけます
自分が見ているテキストに

#include <stdio.h>

int main(void);

int main(void)
{
int c;

while ((c = putchar()) != EOF) {
putchar(c);
}
return(0);
}
というのがあるのですがc(9) : error C2198: 'putchar' : 呼び出しに対する引数が少なすぎます。と
エラーになってしまいます。これはどこを変えればいいのでしょうか?
571デフォルトの名無しさん:2009/01/31(土) 20:33:10
一つ目のputをgetに
572デフォルトの名無しさん:2009/01/31(土) 20:33:28
>>570
一個目のputcharは、getcharの間違いだな

なんて言うテキスト?
573デフォルトの名無しさん:2009/01/31(土) 20:33:47
>>570
テキストと>>570のコードをよく見比べる
574デフォルトの名無しさん:2009/01/31(土) 20:39:43
みなさんサンクス!コンパイルできました!
ほんとあんがと
575デフォルトの名無しさん:2009/01/31(土) 20:42:54
.>>569
ありがとうございます
576デフォルトの名無しさん:2009/01/31(土) 22:25:54
1 2 3 4 5…
と表示させつつ、2と入力したらまた1からという風にさせたいのですが、
scanfさせると入力受付中にWhile文が止まってしまいます。
While文の動作を続けたままで、
入力するとiの数値を0に書き換えてWhile文に戻すような方法は
何かあるでしょうか?
何度でも0に戻せるようにscanfもwhile文に入れていたいのですが…
http://uproda.2ch-library.com/src/lib098407.jpg
577デフォルトの名無しさん:2009/01/31(土) 22:31:44
マルチスレッド
578デフォルトの名無しさん:2009/01/31(土) 22:32:08
普通はwhile(a != 2)ってやるよ
579デフォルトの名無しさん:2009/01/31(土) 22:51:38
>>577
ありがとうございます
やはりマルチスレッドしかないのでしょうか

>>578
試してみましたが、while文がscanfで止まってしまいます。
ただ、私の試し方が間違っているのかもしれません
580デフォルトの名無しさん:2009/01/31(土) 22:59:57
>>579
> やはりマルチスレッドしかないのでしょうか

Windowsなら、GetAsyncKeyStateとかでもいいんじゃない?
581デフォルトの名無しさん:2009/01/31(土) 23:01:05
入力を待ち《ながら》表示するんだろ? 本質的にマルチスレッドJK
582デフォルトの名無しさん:2009/01/31(土) 23:01:40
>>579
非同期入力を使えばできるが、入門の範囲外&処理系依存。
583デフォルトの名無しさん:2009/01/31(土) 23:07:10
>>581
入力があるかどうかチェックして、
なければ表示を続ければいいだけよ。
環境依存だから環境を提示してもらわないと
方法に関しては何とも言えないが。
584デフォルトの名無しさん:2009/01/31(土) 23:10:01
>>580
GetAsyncKeyStateを使ったことがないので勉強してみます。
いろいろ応用が利きそうなので幅が広がりそうです。
ありがとうございました。

>>581、582
ありがとうございます。
はやりマルチスレッドを使うべき場面なのですね。
一度試して失敗してるのでもう一度やってみます。
585デフォルトの名無しさん:2009/01/31(土) 23:18:35
kbhit()
586デフォルトの名無しさん:2009/01/31(土) 23:30:55
懐かしいなw kbhit
MS-DOS 時代によく使ってたわ
conio.h 最強
587デフォルトの名無しさん:2009/01/31(土) 23:32:12
コニオ懐かしいな
588デフォルトの名無しさん:2009/02/01(日) 00:38:46
while(1){
/* ループ時の処理 */
if(kbhit()) if(getch()=='q') { /* 処理 特にscanfやbreakなど*/ }
}
みたいなのがリアルタイム入力としてネットで紹介されてたんで、当時役立った。
getchはWindowsユーザー用でLinuxで使えないから注意な。

>>480から始まった式評価だが、、、
概念(や用語のC言語での意味)はあるにはあるが、
結局のところは、絶対規則でなく、C99なりを”参考”にして勝手にコンパイラ作って
周りの人間がそれをC言語コンパイラやコンパイラを通るものをCソースと認めてるだけだろ。
gccとVCとbccで使われてる概念でも、絶対的なC言語とはいえないだろうし。
if(評価式) は if(評価式!=0)にプリコンパイルされると聞いたことある気がするが
例外起こらない用に、どう同値のアセンブリ言語に書き換えられるか?だろ。
589デフォルトの名無しさん:2009/02/01(日) 00:41:01
で、まとめると?
590デフォルトの名無しさん:2009/02/01(日) 00:46:19
大抵あるけどね、getch()
ライブラリは当然違うけどさ
591デフォルトの名無しさん:2009/02/01(日) 01:12:17
>>588
生半可な知識乙。
色々言いたいこともあるが、一点だけ。
>if(評価式) は if(評価式!=0)にプリコンパイルされると聞いたことある気がするが
誰に聞いたんだ?
592デフォルトの名無しさん:2009/02/01(日) 01:12:54
学校の先輩
593デフォルトの名無しさん:2009/02/01(日) 01:14:22
義理の妹
594デフォルトの名無しさん:2009/02/01(日) 01:15:17
まあ確かにCならそう書き換えても意味は変わらないけどさ。
単に、条件式では0以外の値が真と解釈されるというだけの話。
595デフォルトの名無しさん:2009/02/01(日) 01:17:55
プリコンパイルって言葉自体が怪しい響きだなw
Cの規格にプリコンパイルなんて処理はない。
コンパイラが独自にプリコンパイルを導入している事はあるが、
これはヘッダファイルを予めある程度コンパイルしておくことであって、
そんな怪しい事をする処理のことではない。

まあ、意味は同じだし、コンパイラが内部的にそう変換して解釈してるかもしれないが、
Cの規格がそういう変換を強要することはない。
596デフォルトの名無しさん:2009/02/01(日) 01:21:53
rand君がお目覚めになったようだ
597デフォルトの名無しさん:2009/02/01(日) 01:24:42
javaを使え。Cのような低レベル言語を使うからそういう失敗をするのだ
598デフォルトの名無しさん:2009/02/01(日) 01:27:54
>>597
スレ違い
599デフォルトの名無しさん:2009/02/01(日) 01:29:11
>>588
日本語でおk

何が言いたいのか分からないが、
別に規格が絶対的な規則だなんて誰も言ってなくて、
世間的にC言語のスタンダードがC89(含C99)だから、
処理系を指定せずに「C言語」って言ったら
ほとんどの人がC89準拠の処理系なのを前提に話すだけさ。

規格があって、ほとんどのCコンパイラが規格にそってるのに、
唐突に「俺用語」で話されたって会話できないよ。
600デフォルトの名無しさん:2009/02/01(日) 01:34:02
コイツって規格というものの意味を理解してないから絶対に話はかみ合わないよ
601デフォルトの名無しさん:2009/02/01(日) 01:37:58
Javaを使うのにはかなりの年期をかけたCの経験
が必要。
最初にJavaで入る学習階梯が最近脚光を浴びつつあるが
Javaの基礎を正しく学べなければCをかじったほうが
まだマシという状態になる。
Javaを正しく学べればCを学ぶ時につきがちな
悪い癖をつきにくくさせる効果はある。
という意味でJavaは決してCの簡易版ではないな。
602デフォルトの名無しさん:2009/02/01(日) 01:38:50
で、要約すると?
603デフォルトの名無しさん:2009/02/01(日) 01:39:33
>>601
おそらく誰もCの簡易版だなんて思っていませんよ。
604デフォルトの名無しさん:2009/02/01(日) 01:40:10
いや、>>601はそう思ってたんだろw
605デフォルトの名無しさん:2009/02/01(日) 01:40:46
Javaスレにお帰りください
606デフォルトの名無しさん:2009/02/01(日) 01:42:04
誰も言っていない事を言ったと思い込んで
それに反論するのが彼の得意技。
607デフォルトの名無しさん:2009/02/01(日) 01:59:41
要約
JavaScriptを使え(嘘)
608デフォルトの名無しさん:2009/02/01(日) 02:00:28
JavaScriptはいい
ブラウザが荒らわれる
609デフォルトの名無しさん:2009/02/01(日) 02:07:51
>>606
正論を言えないお前が必死だなw
あいつがどうとか言う前に、自分が正しいことを言えているのか
レスを読み返してみろよ?真なら0以外の1以外でも返ってくる
ヘンテコリンな環境を使用中の時代遅れのオッサン?w
610デフォルトの名無しさん:2009/02/01(日) 02:10:39
> 真なら0以外の1以外でも返ってくるヘンテコリンな環境
これが(君以外)誰も言っていないこと
比較演算子は0か1しか返さないのは規格で定められている。
611デフォルトの名無しさん:2009/02/01(日) 02:12:07
比較演算子は0か1しか返さないが
int a = 3;
if(a) { ... }
のaは3と評価される。
みんなこういう話しかしてないが、
>>609はいつまでたってもそれが理解できていない。
612デフォルトの名無しさん:2009/02/01(日) 02:17:39
>>610が早速釣れました!
a==bが返す値を見ても、まだ分からない大ボケ。何歳なんだろうね?
まぁ40過ぎた時代遅れのオッサンなんだろうけどw
613デフォルトの名無しさん:2009/02/01(日) 02:19:45
>>595
プリコンパイルの説明として
> ヘッダファイルを予めある程度コンパイルしておくこと
というのはいかがなものかと。。。
プリコンパイル済みヘッダーのことを指してるんだろうか?

そうだったとしても、ある程度コンパイルという言葉が出る時点で程度が知れる
614デフォルトの名無しさん:2009/02/01(日) 02:21:57
プリプロセッサ?
615デフォルトの名無しさん:2009/02/01(日) 02:23:20
真か偽で偽なら0、真なら1が返ってくるというのは分かりきっているのに
自分が言いたかったことは、真ならifやwhile文の条件が実行されることに対し
安直に0以外なら 真 と言ってしまった勘違いから、話は食い違っているんだが?
そもそも、真偽では真なら1が、偽は0というのは確たる証拠、実行結果が出ているし。
こいつの勘違いは、とにかく0か否かを、無理やり真偽に持ち込んでいるところ。
ある変数などを用いて、0でなければ実行させる仕組みは、別に真偽とは言わない。
何も真か偽か?で判断しているわけじゃないから。その程度の仕組みも理解出来ないくらい
短絡的な思考回路しか持っていないんだよ、時代遅れのオッサンは。キモイ。
もっと視野を広げな。そもそも、このスレで議論している人が、地球にいる何十億といる
人の中の、ほんの数名しかいないということに気づけ。それも、一概には言えないが
恐らくここでレスしている人は、ほとんどが日本人だろう。議論の場が既に小さくてちっぽけ。
だから、自分が言うことが正しい、で押し通そうとしているんだよね、引きこもりの視野の狭い奴はw
616デフォルトの名無しさん:2009/02/01(日) 02:24:01
真なら1、偽なら0という、Cの規格を逆から読む討論は活発に進んでいますか?
617デフォルトの名無しさん:2009/02/01(日) 02:24:57
>>612
お前は何と戦ってるんだ。
a==bが0と1以外を返すと言っているやつは誰一人としていないのだが。
618デフォルトの名無しさん:2009/02/01(日) 02:26:49
とりあえず、相手が間違っていないのに 嘘 と言った奴は、まず謝罪しとけよ。
あと、嘘なら嘘という証拠を提示しろ。その証拠が提示できない、明らかに
真偽である真偽の判定に於いて、真なら1、偽なら0という結果が出てしまっているというのに。
if、while文を実行させるために与えている値が何なのか?分からないようじゃ
プログラマ以前に、物事を理解する頭すら持っていないと思われ。
分かりきったコードを書いて、プログラミングが出来た気になってなさい。
所詮、この世で行われている、ペーパーテストなどで評価される試験なんて、そんなもん。
分かりきった答えを暗記で済ませられるからねぇ。
まぁ、出題者側も、あれこれ問題を変えたり、その模範解答を作るのが面倒だからね。
世の中、所詮そんなもん。しかし、間違っていないことに対し、自分がそう思うか否かで
勝手に反対するだけで、事実を述べられないどころか、述べられないくらいに証拠を提示されて
反論できなくなるのは、痛すぎる。
619デフォルトの名無しさん:2009/02/01(日) 02:27:08
いや、むしろシャドーボクシングが行われているだけだ。彼の敵は存在しない。
620デフォルトの名無しさん:2009/02/01(日) 02:29:54
>>498 で a==b それ以下にある a!=b が a と b の値によって
等価か不等か、真か偽で返ってくる値は明白だな。
1か0。まぁ、0でなければifやwhile文などは実行されるからねぇ。
わざわざ、0以外ならそれを「真」と思い込む、コードの意味も分からん
ド素人は誰だよ?プログラマ失格だろJK
621デフォルトの名無しさん:2009/02/01(日) 02:31:12
> 0でなければifやwhile文などは実行され
なんだ。ちゃんとわかってんじゃん。
622デフォルトの名無しさん:2009/02/01(日) 02:36:33
0以外は「真」だよ。
623デフォルトの名無しさん:2009/02/01(日) 02:40:45
>>620
==とか!=とか<や>の類は全くもってその通りだけど、Cではこれができてしまうから面倒な話になる。
int is_hoge() {return 3;}

void f()
{
if (is_hoge())
...
}
624デフォルトの名無しさん:2009/02/01(日) 02:42:09
625デフォルトの名無しさん:2009/02/01(日) 02:47:04
反論するならするで、実際に証拠を提示すれば良いのに、a==bやa!=bの
真偽の判定で返ってくる値が、0か0以外、1とは限らないという考えは意味が分からん。
とにかく、あのコードで実行すれば、結果が出てしまうわけだが。
そもそも、別にif()の括弧の中に入れる値はいくつかあれど、それと
真偽の判定は別だから。あくまでも、それによって返ってきた値で
真だったら、偽だったら、という解釈はあるが、分かりやすいものに
!aで、aに入っている値が0か否かで、その逆はどうなるか?ね、その程度の検証もしないで
知ったかぶってんじゃねーよ、時代遅れ。
626デフォルトの名無しさん:2009/02/01(日) 02:48:56
>>613
オブジェクトファイルになるわけじゃないし・・・
627デフォルトの名無しさん:2009/02/01(日) 02:49:38
遊んでるだけだから反応するだけ損だよ
628デフォルトの名無しさん:2009/02/01(日) 02:50:17
>真偽の判定で返ってくる値が、0か0以外、1とは限らないという考え
こんな風にさりげなく言葉を置き換えるんだよな。
629デフォルトの名無しさん:2009/02/01(日) 02:50:17
ごはんといえば白米のことである。

嘘(玄米もあるし、食事全体の総称としてごはんは定着している)

白米をごはんといわないならなんて言うんだよ。嘘とか言うな知ったかぶり。

という流れか
630デフォルトの名無しさん:2009/02/01(日) 02:51:07
>>625
> a==bやa!=bの真偽の判定で返ってくる値が、0か0以外、1とは限らないという考えは意味が分からん。
誰1人としてそんなこと言っているやつはいないわけだが。
631デフォルトの名無しさん:2009/02/01(日) 02:51:23
>>625が最後の1文以外ここまでのみんなの意見を総まとめしてくれたようにしか思えないんだけど。
632デフォルトの名無しさん:2009/02/01(日) 02:51:52
まさに>>606だな。

633デフォルトの名無しさん:2009/02/01(日) 02:52:40
うん。
それで、誰も白米をごはんと言わないなんて言ってないじゃない、と言うんだけど、
じゃあ嘘とか言うな(以下長文)と来るわけで、敵はいないというのはそういうこと
634デフォルトの名無しさん:2009/02/01(日) 02:53:42
すみませんが皆様どちらの方と戦っておられるのでしょうか?
635デフォルトの名無しさん:2009/02/01(日) 02:54:37
636デフォルトの名無しさん:2009/02/01(日) 02:55:45
if/while/forの真ん中に書いたとき、
真:elseに行かない or ループが継続される値の総称
偽:elseに行く or ループから脱出する値の総称
637デフォルトの名無しさん:2009/02/01(日) 03:18:40
>>622
横からすまそ。
「非0が真」 ではなくて、「真が非0」 な。
非0は真以外の意味で使われる場合もある。
たとえば、3cmを表してる場合の3とか。
638デフォルトの名無しさん:2009/02/01(日) 03:43:32
ifやwhileなどのフロー制御ステートメントにおいて、論理式もしくは、整数と同一視できる値を()の中に
入れることが出来る。
整数と同一視できる式の場合0が論理式評価の「偽」に対応し、0以外が論理式評価の「真」に対応する。
対応するとは、コード実行時のフロー制御挙動が同じという意味
論理式評価の「真偽」は人が考える「真偽」と概ね一致する。というか、一致しない論理式を書いた時
人はその論理式がバグってると言う。

でおkですか?
639デフォルトの名無しさん:2009/02/01(日) 03:45:00
C言語ってのは、文法には真偽値は無い。
ドラフトのif文の説明にも、「最初の文は非0のとき実行される」
としか書かれてない。真とか偽とかは関係ない。

だけど、意味の上の真偽値は有る。
ドラフトのisalphaの説明にも、「〜のときtrueが返る」
と書かれてる。で、trueは非0と。

結局、数値を真偽値と見るかどうかは、プログラマ次第であり、
非0であれば必ず真というわけではない。
常に正しいのは、真は非0ということ。
640デフォルトの名無しさん:2009/02/01(日) 03:48:29
大学生時代の時にもいたけど、こちらが言っていることを勝手に勘違いして
それは違うだの、自分はそれに対してそうは思わないね、としか言わない
話にならない奴はいたよ。こちらが提示したのは、実行して得た結果だというのに。
それがどういうことなのか?までは言及していないのに、いつの間にか
自分が思った通りの結果ではないだの、それについては自分は同意しないだの、
あんたは何を言っているんだと?宇宙に行った事の無い人が、地球にいて
知りうることだけで、実際に宇宙に行ってその場でその人が知った事実を
否定できると言うのかね?かつて、コペルニクスやガリレオガリレイなどが
地動説と天動説を言い争ったかのように、無駄な議論だ。宇宙に出れば
それらがどういうことなのか?一発で分かる。百聞は一見にしかず、
その程度の諺くらい知っておけよ、青二才。
641デフォルトの名無しさん:2009/02/01(日) 03:51:21
>>639
> 常に正しいのは、真は非0ということ。
偽は0であることで、非0が真とは言えないよ。
ifやwhile文の実行に、真偽の判定によって返ってきた値を使う方法の他に
ある変数が0か否かで決定するやり方もあるし。問題は、真偽の判定に於いて
その式自身が返す値が何か?答えは既に出ている。偽は0、真は1。
真だった場合、1の他にも値を返すというのなら、教えてもらおう。
あと、代入式を使ったやり方もあるが、あれは左辺の変数に代入された
値を使用しているとみなして良い。真偽の判定ではないからね。
642デフォルトの名無しさん:2009/02/01(日) 03:57:13
そもそも、ある式が 成立する かどうかで、真偽を判定している場合
偽は0と返すが、非0が真と扱うのはともかく、真なら0以外ならなんでも返すって
環境を教えてくれ。正直、食い違っているんだろうけど、こちらが言っているのは
何も間違ってはいない。あと、そちらがそこまで言うなら、真偽の結果において
真なら0以外、1以外にも返すものがあるかどうか?
あの括弧の中に、0以外を入れれば実行されるという話についてではなく、
あくまでも 真偽 の判定によって 返ってくる値 について、俺は言っているんだぞ?
あんたが言う、非0なら実行される=真 という考えは、こちらには無い。というか、それは
真偽の判定のことではないから。
643デフォルトの名無しさん:2009/02/01(日) 03:59:35
また、ある真偽の判定に於いて、偽なら0だが、その否定では
やはり1が返ってくるのだよ。しかし、非0に対して否定 ! を使った場合
0になってしまうわけだが、その結果だけでも、やはり0か1なんだよ。
俺が言っているのはそういうことで、これは俺が勝手に決めたことじゃなく
実行結果で得た検証結果なんだが?だから否定は出来ないよ。
ただ、屁理屈野郎は次にこういうだろう。どんな環境を使っているの?
まぁ、それを言うと、今度はそんな環境を否定し始めるから言わないよ。
俺が聞きたいのは、真なら非0で、1以外の値も返す環境を知りたいだけだ。
644デフォルトの名無しさん:2009/02/01(日) 04:01:43
>>641
>> 常に正しいのは、真は非0ということ。
>偽は0であることで、非0が真とは言えないよ。

は?「非0が真」なんて誰も書いてないだろ。真が非0。
こちらが言ってることを勝手に勘違いするな。お前の言葉だろ。

それから、比較演算子の結果が真のとき1なのは
ドラフトに載ってる。講釈たれるまでも無い。
Each of the operators yields 1 if the
speci?ed relation is true and 0 if it is false.
645デフォルトの名無しさん:2009/02/01(日) 04:06:29
そもそも if( a==b ) は if 文が判定しているんじゃない。
a==b 自身が返す値が0か否かで、該当したら実行するか?
単純に変数 a に0か0以外を入れてみれば、結果が出る。
だからといって、0以外が真とはその場合は言わない。というか、真偽の判定じゃないから言えない。

if(i%2) で奇数か偶数かを判定しているもんだと勘違いした人の、思い違いじゃないのか?
既に、 i%3 で余りが0か否かでも、結果が出ると言われているのだが?
良いからやってみろ。あとはそれに応じて、自分が思うような結果を導けば良いだろ?
誰もあんたが何をするか、逐一指図なんてしないよ。好きなようにやれ。
ただし、それは己の実力や知識、知恵が及ぶ範囲内でのことになるがな。
他人の手を借りて、金を稼ごうって魂胆は、ずるい奴の考え。努力を惜しむ奴は
金儲けでも最後は失敗するだろうよ。詰めが甘い、とな。
646デフォルトの名無しさん:2009/02/01(日) 04:09:08
int a=-1;
printf("%d\n",a+(int)(1==1));

の実行結果が信頼できる処理系に限っても
常に0になると楽観するプログラマは恐らく
現在も将来も居ないだろうから
素直に
printf( "%d\n",a+(1==1)?1:0);
とコードしようや。
たとえ仕様書で定められたとしても
その仕様書を処理系を開発する人々が守るかどうかは
別問題だと思うぞ。
647デフォルトの名無しさん:2009/02/01(日) 04:11:19
>>642
もし、>>623のis_hogeのような関数を探しているのであれば、Windows APIの中にあるとされている。
typedef int BOOL; #define TRUE 1
でBOOL型を返すIsHogeって関数にIsHoge() == TRUEなんて御法度と言われている。
TRUE以外の値を返すことがあり得るからと。

実際のところどうなのかわからないけど。いつもif (IsHoge())かif (IsHoge() != FALSE)って書くし。
648デフォルトの名無しさん:2009/02/01(日) 04:13:49
ちと訂正
そもそも if( a==b ) は if 文が 真偽を判定 しているんじゃない。
返ってきた値で、0でなければ、実行している。
単純に変数 a に0か0以外を入れて if(a) で試してみれば分かる。
結局、与えられた値が0か否かであって、if自身が真偽を判定しているわけではない。
あくまでも、成立した場合、偽でなければ0以外の値が与えられた時は、実行する。

よって、if( i%2 ) 自身が、奇数かを勝手に判断しているわけではないのだよ。
余りがあったとき、0以外の値が与えられて、割り切れない値が与えられたという事実が
if文によって分かるということだ。
649デフォルトの名無しさん:2009/02/01(日) 04:19:10
>>648
その通りだと思う。
650デフォルトの名無しさん:2009/02/01(日) 04:20:40
ifが真偽を判定してないってw
651デフォルトの名無しさん:2009/02/01(日) 04:25:54
ちょっと情報が交錯しているな。
Cの規格書の内容をまとめとくと、

・if文は非0かどうかを判断しているだけ。真偽は関係ない。
・真は非0。
・比較演算子は0か1を返す。

どうしてここまで話が縺れるか。それは、
・if文が真偽に従って分岐すると勘違する
・非0が常に真の意味だと履き違える
・比較演算子が0か1のみを返すということを知らない
人が多いからだろう。
652デフォルトの名無しさん:2009/02/01(日) 04:28:37
お前らいつまで頭のおかしい人間を相手してるんだ
653デフォルトの名無しさん:2009/02/01(日) 04:32:59
>>651
いや、少なくとも「比較演算子が0か1のみを返すということを知らない」は全員が理解しているだろう。
654デフォルトの名無しさん:2009/02/01(日) 04:36:22
まあ、いずれにせよもう皆納得してくれたかな?
655デフォルトの名無しさん:2009/02/01(日) 04:36:30
double a=234.56789;
double b=0.0;
int c=0;
b=floor(a);
c=(int)b;

この場合に234になって欲しいのですが、
なぜか値が違っている場合があるのですが何故でしょうか?
656デフォルトの名無しさん:2009/02/01(日) 04:39:29
>>654
それで間違いないんだけど、
全員納得するなら0時くらいで終わっているはずなんだ。
657デフォルトの名無しさん:2009/02/01(日) 04:39:43
ずーっと前からいるけど、このageのバカは
・日本語が不自由(というか論理的に破綻している)、タイピングだけは早い
・自分にしか意味のわからない言葉を使う(例:「式の評価」)
・規格というものを理解していない、好きな言葉は「アセンブリ出力」
・勝ち誇って長文の連レス、しかもなぜかCとぜんぜん関係のない話を持ち出す
という特徴があるので適当に放置したほうがいい
658デフォルトの名無しさん:2009/02/01(日) 04:40:15
>>655
#inlcude <math.h>忘れてるとかってオチはない?
659デフォルトの名無しさん:2009/02/01(日) 04:40:57
そもそも、宇宙が無重力と教科書などで知っても、実際に出て体験した
それが無重力だと実感した人とは、受け止め方が違うし
無重力状態では、何が起こるか?もその場に行ってみないと分からないことが多い。
特に、食事や排便は大変なそうで。もちろん、移動や器具の取り扱いも。
しかし、そんなのは実体験していない人にとっては、言葉などでの想像に過ぎず、
実際に体験した人がどう感じたかまでは、分からない。しかし、適切に考えられる人なら
多少なりと、適切な行動に移せるが、やはり予期せぬことなどいくらでもあるのが
この世の中。自分が知りうる範囲内の知識や知恵、経験なんぞ、ちっぽけだぞ。
思い上がるな、小僧。
660デフォルトの名無しさん:2009/02/01(日) 04:42:14
>>659
そういうセリフは自分が宇宙に出てから言ってくださいw
661デフォルトの名無しさん:2009/02/01(日) 04:42:49
>>659
お帰りください
662デフォルトの名無しさん:2009/02/01(日) 04:43:46
>>695
・勝ち誇って長文の連レス、しかもなぜかCとぜんぜん関係のない話を持ち出す
663デフォルトの名無しさん:2009/02/01(日) 04:45:54
どうみても世の中に出てる人間のとる言動じゃねーよw
664デフォルトの名無しさん:2009/02/01(日) 04:46:10
規格をちゃんと読んだことがないから単語の意味を知らないんだ
話がかみあうわけがない
665デフォルトの名無しさん:2009/02/01(日) 04:49:45
規格上「式の評価」が何を意味するのか、規格を引用して教えてくれw
666デフォルトの名無しさん:2009/02/01(日) 04:54:46
こんな奴が上司だったら会社やめるわ
667デフォルトの名無しさん:2009/02/01(日) 04:55:13
>>658
すいません、いろいろ考えても言う事がまとまらないので
質問を撤回させてもらいます・・・。 板汚し失礼しました・・・
668デフォルトの名無しさん:2009/02/01(日) 04:55:49
タイピングが速いというか、何も考えてないんだよ
反論してるんじゃなくて、同じことを盲目的に繰り返すだけだから
669デフォルトの名無しさん:2009/02/01(日) 04:57:48
>>665
特別な定義は見当たらないから,一般的な意味で捉えればいいと思う。
5.1.2.3 プログラムの実行
3段落目
> 抽象計算機では,すべての式は意味規則で規定する通りに評価する。
670デフォルトの名無しさん:2009/02/01(日) 04:57:49
>タイピングが速い

カナ入力なんじゃねーのこいつ。
671デフォルトの名無しさん:2009/02/01(日) 04:58:06
何度も言うようだが、if自身が真偽を判定しているんではない
比較演算子などで、成立するかどうか?が真偽の判定。
それに応じて返ってきた値が0か1かで、とりわけ0以外の値が
if文に与えられたとき、その文が実行される仕組みがある。
これはwhileでも言えること。間違っていない事実に対して
異論を唱える君は、その事実が理解できないだけなんだろ?
だいたい、ここに来ているごく数名の人に対して、自分の意見を
押し付けてどうする?だったら、もっとより多くの人の集まる場所で
意見をしてみろよ?まぁ、そこには多種様々な考えの人がいて、
また詰らない議論が展開されるだろうよw
しかし、真実は1つ、見た目は子供、頭脳は大人、その名は(ry
672デフォルトの名無しさん:2009/02/01(日) 04:58:40
ていうか日本人じゃないだろ。
普通の教育受けてきたらこうはならんて。
673デフォルトの名無しさん:2009/02/01(日) 04:59:30
>>670
それこそCと全然関係ない話だろ。

>>671
いったい誰が異論を唱えているんだ?
674デフォルトの名無しさん:2009/02/01(日) 05:00:39
>>671
オマエガタダシイ
675デフォルトの名無しさん:2009/02/01(日) 05:03:16
An expression is a sequence of operators and operands that specifies computation of a
value, or that designates an object or a function, or that generates side effects, or that
performs a combination thereof.

式を評価するということは、式を計算すると言うことだな。
676デフォルトの名無しさん:2009/02/01(日) 05:07:31
しかし彼は「式の評価」とは比較演算子(等価演算子)を使うことだと思っているのであった
677デフォルトの名無しさん:2009/02/01(日) 05:09:57
ここからすべてが始まった。質問には永遠無視

491 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:29:56
式の評価については、真だったら1、偽だったら0が返ってくる仕組みがある

492 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:32:33
>>491
それは嘘だろ。

493 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:33:41
>>492
なんで?最終的には、何かしら数値が扱われている仕組みがあるが
真だった場合、1以外の値が返ってくる環境があるなら、教えてくれ。
とりあえずここ、C言語に関してだが。

494 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:34:20
何も帰ってこないことはあるな

495 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:34:49
式の評価じゃなくて、比較演算子の評価だろ。

496 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:35:20
>>493
それじゃあ、「真だったら1、偽だったら0が返ってくる」式の例を教えてよ。

497 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:36:15
>>493
「式の評価」って何の事をいってるの?
比較演算子の結果という意味?
678デフォルトの名無しさん:2009/02/01(日) 05:10:37
↓以下、俺が言った式は==を使った式のことだそんなのは文脈上明らかでそれを理解できないお前らが愚かだ的火病
679デフォルトの名無しさん:2009/02/01(日) 05:58:54
おまえら苛めすぎだろ。もっとやれ
680デフォルトの名無しさん:2009/02/01(日) 06:14:11
人は自分が所属している環境以外の環境しか見えないのかもな
681デフォルトの名無しさん:2009/02/01(日) 06:49:12
今まで生きていけたのが不思議
682デフォルトの名無しさん:2009/02/01(日) 06:59:56
誰が何をほざこうが、if文自体は真偽に対して値を決定はしていない。
与えた値について、真偽の結果、あるいは0か否かでその文を実行するかを
決定しているに過ぎない。そこで、式が成立する場合の真のとき、
0以外だからといって1以外の値を返すような環境があるなら、是非とも教えてくれたまえ。
出せないなら出せないって言えよ?こっちは未来永劫、待ってやるぞ?w
お前が開発しても良いけどなw
683デフォルトの名無しさん:2009/02/01(日) 07:01:38
まだ遊んでんのか!
684デフォルトの名無しさん:2009/02/01(日) 07:05:02
while(1)あるいは0以外の値を入れたのを、永遠に真と解釈する奴はキモイw
真偽はあくまでも、真か偽か?要は成立するか否か?それ以外の値にまで
0か否かで勝手に真偽をしたと言われても、迷惑だな。
685デフォルトの名無しさん:2009/02/01(日) 07:14:48
ifが勝手に値を元に、真か偽を決めているって、どんだけ抜けてんだよ?wwww
whileにしても、あくまでも真か偽で返ってきた値を用いて、繰り返すかを
決定しているというのに、勝手にそれを真って、誰が決めてんだよ?
それじゃ、ある変数xを用いて、while(x)とした場合、xが0でなければ真って
何が 真 なんでちゅか?w それは変数が0か否かであって、真か偽か?
ではないのだがw
686デフォルトの名無しさん:2009/02/01(日) 07:17:39
なにを朝っぱらから騒いでんの?
687デフォルトの名無しさん:2009/02/01(日) 07:21:23
x=3
if(x) 実行されたからxは真だーー!(プ
x=0
if(x) 実行されなかったからxは偽だー!(プ
ねーよwwwww
688デフォルトの名無しさん:2009/02/01(日) 08:54:28
何について何を言いたいのかさっぱり分からん
689デフォルトの名無しさん:2009/02/01(日) 10:28:09
すでに入門者のためのスレじゃなくなっているね

新しい質問ない?
690デフォルトの名無しさん:2009/02/01(日) 10:32:42
>>646
あえて突いてみるが、
規格上「==が0か1を返す」という記述を無視している規格準拠でない処理系なのに
同じ規格に載っている「参考演算子」の挙動は規格に準拠していると信用できるのは、
どういう理由からなんだ?

それとも俺が何かしらのギャグを理解できていないのか・・・
誰か説明頼む。
691デフォルトの名無しさん:2009/02/01(日) 10:37:15
おまえら熱すぎwww
692デフォルトの名無しさん:2009/02/01(日) 11:11:48
#include<stdio.h>
main()
{
int i, j, t, y, a[10][10];

printf("2次元配列aの行数、列数を入力:");
scanf("%d %d", &t, &y);

printf("配列aの要素値を左から右、上から下の順で入力:");
for(i=0;i<t;i++){
for(j=0;j<y;j++){
scanf("%d", &a[i][j]);
}
}
printf("配列aの要素値を表示します\n"); /*この行がエラー*/
for(i=0;i<t;i++){
for(j=0;j<y;j++){
printf(" a[%d][%d]=%2d", i, j, a[i][j]);
}
printf("\n");
}
}
c:15:9 unknown escape sequence:'\216'
どうすればエラーがなくなるんですか?
693デフォルトの名無しさん:2009/02/01(日) 11:40:02
>>692
「表示します」を「プリントします」にするといけるかもしれない
694デフォルトの名無しさん:2009/02/01(日) 11:44:41
695692:2009/02/01(日) 11:50:13
>>693-4
解決できました。ありがとうございました。
696デフォルトの名無しさん:2009/02/01(日) 12:24:12
一晩でスレが伸びてるときってかならず香ばしい奴がいるなwww
697デフォルトの名無しさん:2009/02/01(日) 12:36:12
ifが勝手に真偽の値を決めているわけねーだろJK
if(()の括弧の中に与えられた値が、0か否かで実行している程度だろ
真偽の結果の値は a==b が成立するかどうかで1か0だわ
698デフォルトの名無しさん:2009/02/01(日) 12:49:24
まだやってんのかwwww
699デフォルトの名無しさん:2009/02/01(日) 12:50:01
いろいろと不満がある人は
#define IF(x) if(!(x))
でコードすれば少しは溜飲は下がるかもな
700デフォルトの名無しさん:2009/02/01(日) 12:50:57
>>699
これは酷い。
701デフォルトの名無しさん:2009/02/01(日) 13:01:35
真偽値なんてものはCにはないし、条件が成立する場合を真と表現することも多々あるが、
かといって、真とは条件が成立する場合であると言い切るのはやや強引。
ここは彼も含めた大方の人が理解していることだと思うんだけど、関係演算子の値こそが真偽値であり
それが0もしくは1であることが実行した結果から分かるため、真は1、偽は0と主張しているんだよね。
規格書には関係演算子を評価した値が0もしくは1であることが書かれているようだけど、
それが真偽値であると書かれてるの?

百聞は一見にしかずの件だが、プログラミングにおいては「一見」した時の環境という条件が
常につきまとうから、実行した結果がこうだったから常に正しいという主張は基本的に無意味
であるし、それを盾に自分が正しいという主張をされても誰得。
702デフォルトの名無しさん:2009/02/01(日) 13:07:04
_Bool
703デフォルトの名無しさん:2009/02/01(日) 13:08:18
0と非0なんてちょっと勉強すれば出てくるだろ
バカじゃねぇの
704デフォルトの名無しさん:2009/02/01(日) 13:34:31
配列へのポインタで、
char *p = "abc";
という風に初期化できるのに
int *a = {1,2,3};
という風にできないのはなぜですか?

イメージ的には、どこかにint型の3つ分が確保されて、
その先頭の位置をpに入れてくれそうなんですけど・・・
{1,2,3}というのは初期化する時の表現であって、
配列を表すものじゃないってことでしょうか?
705デフォルトの名無しさん:2009/02/01(日) 13:36:18
文字列だけ特殊な扱いをしているから、としか言いようが無い
706デフォルトの名無しさん:2009/02/01(日) 13:40:30
>>701
>規格書には関係演算子を評価した値が0もしくは1であることが書かれているようだけど
>>646
707デフォルトの名無しさん:2009/02/01(日) 13:43:35
>>704
特殊な扱いと言うか、"abc"は文字列リテラルへのポインタを表すから。
厳密には違うけど近い表現でいうと、
char s[] = {'a','b','c'};
char *p = s;
というようなイメージ。

>int *a = {1,2,3};
これは、ポインタを配列のように初期化しようとしているからエラーになる。
char *p = {'a','b','c'}; がエラーになるのと同じ。
708デフォルトの名無しさん:2009/02/01(日) 13:46:17
709デフォルトの名無しさん:2009/02/01(日) 13:49:31
比較演算子の結果が0か1以外になる処理系なんて信頼性が低すぎて使わない方がいい。
バグだから。
ってレベル。
710デフォルトの名無しさん:2009/02/01(日) 13:55:23
>>646
printf( "%d¥n",a+((1==1)?1:0));
だろね。言いたいことは。
そのあたりのことを察することが
出来ない人は居ないと思うが.
711704:2009/02/01(日) 14:01:00
>>705>>707
ありがとうございます。
理解できました。
712デフォルトの名無しさん:2009/02/01(日) 14:10:59
707 >
のー・・・なんてこったい!

s[]のとこ、NULL終端入ってないよ!!
すんませんorz
713デフォルトの名無しさん:2009/02/01(日) 14:12:12
>>707
ヌル文字を忘れてはいけない。
絶対に。
714デフォルトの名無しさん:2009/02/01(日) 14:17:03
'¥0'がついてなかったのは厳密には違うけど近い表現をした
からだと思っていたが...orz
715デフォルトの名無しさん:2009/02/01(日) 14:49:04
要するにだな
int a;
if(a)という書き方はするな
if(a!=0)ときちんと書け
a=(int)(1==1)
みたいなこともするな

と言いたいんだな、きっと。
716デフォルトの名無しさん:2009/02/01(日) 14:49:48
double *dptr; と宣言したdptrの大きさが4バイトのとき、
int *iptr; と宣言したポインタiptrの大きさは何バイトになりますか?
できれば理由も教えてください。よろしくお願いします。
717デフォルトの名無しさん:2009/02/01(日) 14:50:15
C++大好き
718デフォルトの名無しさん:2009/02/01(日) 14:50:46
C++超好き
719デフォルトの名無しさん:2009/02/01(日) 14:51:09
わからん。
4バイトかも知れないし、2バイトかも知れないし、32メガバイトかも知れない
720デフォルトの名無しさん:2009/02/01(日) 14:52:23
>>716
おそらく、4バイト。
なぜなら、doubleとintでアドレッシングの違う場所に配置することはないだろうから。
721デフォルトの名無しさん:2009/02/01(日) 14:53:19
C++ヤバいくらい好き
722デフォルトの名無しさん:2009/02/01(日) 14:54:03
>>716
分からない。
理由はそんなこと標準規格では一切の規定がなく、
何バイトであっても規格に合致できるから。

ただし、同じ4バイトになる環境が多いとは言っておく。
723デフォルトの名無しさん:2009/02/01(日) 14:58:11
C++が一番好き
724デフォルトの名無しさん:2009/02/01(日) 15:03:32
C++ってなんであんなカミソリの刃の上を歩くような言語なの?
725デフォルトの名無しさん:2009/02/01(日) 15:03:40
>>716
よほど特殊な環境(俺アーキテクチャーマシンとか)じゃない限り4バイトだろう。

普通のPCならdoubleのデータも、intのデータも、同じメモリーに置くだろうし
同じメモリーなら、ポインターのサイズは必ず同じになる。

ユーザー定義型ならまた違ってくる可能性もあるが、doubleもintも組み込み型だし。
726デフォルトの名無しさん:2009/02/01(日) 15:03:41
>>719>>720>>722
本当にありがとうございます
727デフォルトの名無しさん:2009/02/01(日) 15:05:37
char だけアドレッシングが違うアーキテクチャなんてのもあるわけで、
100% 同じ! と断言することはできないけど、まあ普通は同じだろうな
728デフォルトの名無しさん:2009/02/01(日) 15:06:52
>>727
例えば?参考までに。
729デフォルトの名無しさん:2009/02/01(日) 15:12:41
>Prime50シリーズはすくなくともPL/Iでは、
>セグメント07777・オフセッ ト0をヌルポインターの内部表現として使っていた。
>後のモデルはセグメント0・オフセット0をCのヌルポインターに使った。
>このために TCNP(Test C NULL Pointer)のような新しい命令が、
>それまでに誤った思い込みをして書かれた、
>ヘマなCプログラムを救済するために必要となった。
>もっと古い(バイトアドレスではなく)ワードアドレス方式のPrimeのマシンは、
>ワードポインター(int *)よりもバイトポインタ(char *)のほうが大きいことで悪名高かった。
など。
C FAQ 5.17 に書いてある。
化石マシンだろうけどね。
ttp://www.kouno.jp/home/c_faq/c5.html
730デフォルトの名無しさん:2009/02/01(日) 15:13:30
>>729
なるほど。ありがとう。
731デフォルトの名無しさん:2009/02/01(日) 15:26:56
>>716
sizeof( double )バイト
732デフォルトの名無しさん:2009/02/01(日) 15:41:12
>>731
馬鹿はお帰りください。
733デフォルトの名無しさん:2009/02/01(日) 15:52:08
c言語を勉強し始めたばかりの初心者です。
OSはvista、コンパイラはLSI Cです。

ソースファイルを作成して、それをコンパイルすると文字化けしてしまいます。
実行可能ファイル(.exe)も作成できて、問題なく実行できます。
文字化けしないようにするにはどうしたらいいでしょうか?
734デフォルトの名無しさん:2009/02/01(日) 15:53:44
特に理由がなければ、LSI Cではなく、VC++Expressの使用をお勧めします。
735デフォルトの名無しさん:2009/02/01(日) 15:54:32
.exeファイルはテキストファイルじゃないので読めません
736デフォルトの名無しさん:2009/02/01(日) 15:57:42
>>733
文字の出力先が期待している文字コードでプログラムの文字列を記述する。
737デフォルトの名無しさん:2009/02/01(日) 16:06:31
>>735-736
NT系で16bitプログラムを実行すると出力が正常になされなくなる場合があります。
したがって、アドバイスとしては不適切ですね。

LSICではなく32bitコンパイラを使う以外の対処を私は知りませんが。
738デフォルトの名無しさん:2009/02/01(日) 16:08:19
そうですね。>>737は不適切だと思います。
739デフォルトの名無しさん:2009/02/01(日) 16:11:02
>>737
だから、その「出力が正常になされなくなる場合」ってのは、「文字の出力先が期待している文字コード」を出力していない場合のことだろ。
>>736の通りにすれば、その場合に当たらない。

したがって、>>736は適切。
740デフォルトの名無しさん:2009/02/01(日) 16:13:03
>>737
VistaにはDOSアプリ実行インフラが無いんじゃなかったっけ?
XPでもconfig.sysをいじらないと漢字フォントドライバ(DOS用)の
ものがメモリにロードされないから日本語を使うDOSアプリの出力が
化けた(usモードで実行されるから)記憶が...
741733:2009/02/01(日) 16:13:08
>>734
特に理由が無いので、そちらを使用してみます。

>>736
ちょっと自分の説明が下手でしたね。
コンパイル前に表示されていた日本語(例えばDIR<Enter>で「10個のファイル」とか「2個のディレクトリ」など)が
コンパイルすると「??????」になってしまいます。
これを直したいんですがどうしたらいいでしょうか?
742デフォルトの名無しさん:2009/02/01(日) 16:13:50
文字化けした時は、どの文字がどう化けたかの情報も書いたほうがいい。
で、LSI-Cだって?

ttp://www.lsi-j.co.jp/product/c86/index.html
※Windows Vistaでは日本語表示および日本語入力はできません。

と書いてあるな。
743デフォルトの名無しさん:2009/02/01(日) 16:16:07
>>739
へー、vistaって、SJISを出力するプログラムを実行すると文字化けするんだ。
知らなかったよ。

すごーーーーく勉強になったよ。
744デフォルトの名無しさん:2009/02/01(日) 16:18:21
>>741
そう。2000やXPもそうだけど、16bitプログラムを実行すると
うまく動いているときもあるけど、コンソールの出力自体が全部おかしくなる。
治し方もわからない。

とにかく32bitコンパイラにするべきなのは確実。
745デフォルトの名無しさん:2009/02/01(日) 16:19:34
あ、これは、LSICの生成物もそうだけど、
コンパイラ自体が16bitプログラムなのが原因。
746デフォルトの名無しさん:2009/02/01(日) 16:20:10
>>740
config.sys弄っても多分ダメ
jfontXX系のDOSドライバがXP以降ではレガシーデバイスとして
サポートされておらず従ってCDROMにも添付されていないから。
要するに16ビットアプリは動作するとしても、英語モード
で動作するアプリのみになったって感じ。
747733:2009/02/01(日) 16:22:58
>>744
わかりました。32bitコンパイラにしてみます。
734が教えてくれたVC++Expressというのは32bitなのでしょうか?
748デフォルトの名無しさん:2009/02/01(日) 16:26:20
32だよ
749デフォルトの名無しさん:2009/02/01(日) 16:27:10
64かもね
750デフォルトの名無しさん:2009/02/01(日) 16:28:21
Windows の16ビット環境が32ビット、64ビット環境と
比べてかなり異質で特殊なものだということさえわかればおk
751デフォルトの名無しさん:2009/02/01(日) 16:29:30
>>750
君もそれ以上わかってないしね
752デフォルトの名無しさん:2009/02/01(日) 16:37:33
つーかスレ違いですな
753デフォルトの名無しさん:2009/02/01(日) 16:38:33
ですな
754デフォルトの名無しさん:2009/02/01(日) 17:51:00
文字'0'のコードが0×30のとき、ぶん「a = '0' + 10;」の実行後、
aの値を■進数で表すと0×3aとなり、10進数で表すと▲となる。

■と▲には何を入れればいいですか?
755デフォルトの名無しさん:2009/02/01(日) 17:57:06
>>754
0×が16進数のことを言っているなら、■は16、▲は58
参考までに
ttp://e-words.jp/p/r-ascii.html
756デフォルトの名無しさん:2009/02/01(日) 18:01:25
>>755
サンクスです
757デフォルトの名無しさん:2009/02/01(日) 18:19:19
0×じゃなく0xな
758デフォルトの名無しさん:2009/02/01(日) 19:33:23
宿題は自分でやれよ・・・
759デフォルトの名無しさん:2009/02/01(日) 19:33:55
>>750
たしか、一人がこけたら枕を並べて討ち死にマルチタスクだったかと。
なにをするにしても32bit にくらべてワンステップ余計に必要だったことも記憶しています。
あとWDMにくらべてVxD ってなんだったの?ハードよりから完全撤退してしまったので、そのあたりがわかっておりません。
760デフォルトの名無しさん:2009/02/01(日) 19:35:11
だからスレ違いだっつってんだろボユゲ
761デフォルトの名無しさん:2009/02/01(日) 19:38:28
>>760
お前がスレ違い
762デフォルトの名無しさん:2009/02/01(日) 19:40:35
>>759
単なる進化の過程。WDMだって過去の遺物になろうとしている。
763デフォルトの名無しさん:2009/02/01(日) 20:40:38
VCってintやfloat使ったconsoleアプリを普通に作れるんだっけ?
昔使おうとしてDWORD等のキモい型に馴染めず、それ以来gccかborlandだなぁ
764デフォルトの名無しさん:2009/02/01(日) 20:42:46
普通に作れるわい
765デフォルトの名無しさん:2009/02/01(日) 20:44:54
DWORDを使うか否かは、別に窓アプリかどうかと関係ないし、
gccでもBorandでも当然使えるし。
766デフォルトの名無しさん:2009/02/01(日) 22:02:57
質問があります。
for(i=0;i<=10;i++)
{
for(j=0;j<=10;j++)
{
if(i+j=5)
{
何か処理
     }
}
}

このようなループ処理に間違いはありますか?
コンパイルしてもエラーはでませんが、実行すると一瞬で
何も結果が得られずプログラムが終了してしまいます。

プログラム全体はもっと長いのですが、ここが一番怪しいので・・・。

767デフォルトの名無しさん:2009/02/01(日) 22:04:16
結果はどうやって得ているのですか?
768デフォルトの名無しさん:2009/02/01(日) 22:04:46
i+j=5
769デフォルトの名無しさん:2009/02/01(日) 22:06:02
実行すると一瞬で終了して何も結果が得られないって
具体的にどういうこと?それが判らないとどうにも。
770デフォルトの名無しさん:2009/02/01(日) 22:09:18
「何かの処理」がよほど重くなければ、マトモに動いていても一瞬で終わる罠。
771デフォルトの名無しさん:2009/02/01(日) 22:14:03
forループでiとjの値が決まりますよね?

そのiとjを使って、pow(i,2)+pow(j,2)などの値を求めます。

その結果を最後にprintfで出力する感じです。

なのに実行しても何も出力されません。というか、このプログラムの

forループに関係のない、どこか適当なところに「printf("1\n");」と入れても、それすら出力されません。

少なくともこのループが原因じゃないのでしょうか・・。




772デフォルトの名無しさん:2009/02/01(日) 22:17:19
全部晒しちゃえよ。
773デフォルトの名無しさん:2009/02/01(日) 22:17:49
どうでもいいけど、整数値の二乗にpow()を使うのはナンセンス。
774デフォルトの名無しさん:2009/02/01(日) 22:20:35
>>771
質問でも何でもなく、「ループは原因じゃない」って言ってもらいたいだけだろ。
君だってわかっていることだ。
775デフォルトの名無しさん:2009/02/01(日) 22:22:07
>>771
環境が分かれば解決すると思う
そしてそれはスレ違い
776デフォルトの名無しさん:2009/02/01(日) 22:22:12
main()の1行目に
printf("start main()\n"); return 0;
って書いてコンパイルして実行してみたら?
777デフォルトの名無しさん:2009/02/01(日) 22:24:04
>>774
そうです。
ここが違うってわかればすこしは楽になるのにーーー><;
ひーん。もうちょっと自分で頑張りますorz
778デフォルトの名無しさん:2009/02/01(日) 22:24:14
>>771
あれこれやる前に、これ動かしてみてよ。


# include <stdio.h>

int main(void) {
printf("Hello, world\n");
return 0;
}
779デフォルトの名無しさん:2009/02/01(日) 22:25:07
if(i+j=5)
780デフォルトの名無しさん:2009/02/01(日) 22:31:11
みなさんレスありがとうございます。

>>778
それは動きます。環境が悪いわけじゃないんですが・・。

ちなみに環境はborland C++でコンパイルしています。

>>779

if(i+j=5)が悪いんでしょうか?
781デフォルトの名無しさん:2009/02/01(日) 22:36:00
そういう怪しいところがあるときは別プロジェクトを作って
怪しい箇所だけのプログラムを作ってみるといいかも(ここでは>>766の部分)
表示されればここ以外に問題がある。
782デフォルトの名無しさん:2009/02/01(日) 22:37:17
ずっとコーディングのことをコーティングだと思ってた
783デフォルトの名無しさん:2009/02/01(日) 22:46:19
if( i + j == 5 )
784デフォルトの名無しさん:2009/02/01(日) 22:53:40
>>780
自分で怪しいところを抜き出して単独で試せるようになったのなら、それは大進歩。がんがれ。
785デフォルトの名無しさん:2009/02/01(日) 22:54:41
怪しいところに見当がついてるなら、そこらをデバッガでステップ実行して、
意図通りにうごいてるか確認すればいい。
786デフォルトの名無しさん:2009/02/01(日) 22:58:19
簡単にエスパーしておくと原因はおそらく他にある
未初期化ポインタの使用もしくはバッファオーバーフローが濃厚
787デフォルトの名無しさん:2009/02/01(日) 23:34:36
766です。

エラーの原因がなんとなくわかりました。

a[1000][1000]という巨大な2次元配列を定義したのでstack over flowだということがわかりました。

このような配列を定義しないために、プログラムの根本から見直す必要があるのでしょうか・・・。
788デフォルトの名無しさん:2009/02/01(日) 23:38:40
>>787
釣り乙
789デフォルトの名無しさん:2009/02/01(日) 23:38:40
int *a = (int*)malloc(1000*1000*sizeof(int));

val1 = a[i*1000+j];

a[i*1000+j] = val2;
790デフォルトの名無しさん:2009/02/01(日) 23:46:23
free(a);
791デフォルトの名無しさん:2009/02/01(日) 23:52:33
>>789
二次元配列で書けないの?w
792デフォルトの名無しさん:2009/02/01(日) 23:53:35
そのwはCへの侮辱か?
793デフォルトの名無しさん:2009/02/01(日) 23:56:36
>>791
二次元配列で書くの?w
794デフォルトの名無しさん:2009/02/01(日) 23:58:04
int (*a)[1000] = malloc(1000 * 1000 * sizeof (int));
795デフォルトの名無しさん:2009/02/02(月) 00:00:41
キャストしないの?
796デフォルトの名無しさん:2009/02/02(月) 00:01:45
必要ないじゃん?
797デフォルトの名無しさん:2009/02/02(月) 00:03:42
だってCなんだもん。
798デフォルトの名無しさん:2009/02/02(月) 00:05:31
#define P(i,j) p[(i*1000)+j]
int *p; p = (int) malloc( 1000*1000*sizeof(int) );

一つの2次元配列風表現手段
799デフォルトの名無しさん:2009/02/02(月) 00:09:25
P(i+1, j)
800デフォルトの名無しさん:2009/02/02(月) 00:09:36
サイズが動的に決まる場合はそうせざるを得ないが
静的に決まる場合は配列へのポインタを使う方が楽
801デフォルトの名無しさん:2009/02/02(月) 00:10:18
使い分けるんだ
802デフォルトの名無しさん:2009/02/02(月) 00:16:37
>>798
きがくるったのか
803デフォルトの名無しさん:2009/02/02(月) 00:24:00
static int a[1000][1000];
でいいだろ
804デフォルトの名無しさん:2009/02/02(月) 00:25:11
>>803
それで大丈夫な場合もあるだろうね
805デフォルトの名無しさん:2009/02/02(月) 01:15:33
>>803
それヒープにとられるんだっけ?
806デフォルトの名無しさん:2009/02/02(月) 01:17:24
まあ、スタックではないな。
807デフォルトの名無しさん:2009/02/02(月) 01:20:26
大丈夫じゃない場合もあるですか?
808デフォルトの名無しさん:2009/02/02(月) 01:22:40
仮想メモリOFFで積んでるメモリが2MBの環境で実装する事だってある(あった)じゃない?
809デフォルトの名無しさん:2009/02/02(月) 01:23:01
1000*1000*sizeof(int)って高々4Mバイトにも満たない量で
現在のPC環境でその程度のメモリをスタックに確保して落ちることは
余り無いと思うのだが....
ちなみに初期状態はすごく小さい量だが、積むと自動的にOSが
拡張してくれる。
810デフォルトの名無しさん:2009/02/02(月) 01:27:42
>>805
静的領域。プログラムのロード時にローダーが確保してくれるよ、VCの場合。
811デフォルトの名無しさん:2009/02/02(月) 01:32:00
>>805
http://www9.plala.or.jp/sgwr-t/c/sec12.html
>「静的領域」には、外部変数や静的変数が置かれます。
812デフォルトの名無しさん:2009/02/02(月) 01:43:55
>>807
再帰呼出とかマルチスレッドとかで問題が出るかも

>>809
Windows だとすぐ落ちるぞ
Linux でも ulimit の範囲内まで
#include<stdio.h>

int hoge(int n){
int dummy[1000]={0};

fprintf(stderr, "n=%d [avoid optimize %d]\n", n, dummy[999]);
return hoge(n+1);
}

int main(void){
return hoge(0);
}
813デフォルトの名無しさん:2009/02/02(月) 01:48:22
814デフォルトの名無しさん:2009/02/02(月) 02:04:24
>>812
再起呼び出し関数でも汎用関数でも、関数に対して1回分しか割り当てられないよな?
815デフォルトの名無しさん:2009/02/02(月) 02:14:41
>>814
そうですね。同じ領域を使いまわすことになりますね
816デフォルトの名無しさん:2009/02/02(月) 02:16:04
OS-Xでmain関数でだけど、ローカルにint a[1000][1000]確保して
値設定し、printf出力したけど何とも無かったぞ。無事に実行された。
ちなみにメモリ512M /PPC400MHzという10年前のスペックのPCだが.
817デフォルトの名無しさん:2009/02/02(月) 02:19:26
何も使わなければ問題ないという可能性もあり得るな。
818デフォルトの名無しさん:2009/02/02(月) 02:30:38
逆に宣言文じゃなくて、メモリの動的確保の最大値とかはプログラム依存でいくらでもでてくる可能性あるけど
・例えば画像データで
IMAGE[2200][1900][3];の確保をmallocは1回で確保可能なのか?それとも数回なのか?
・この手の変数を宣言していい回数は、動かす環境のメモリの空きだけに依存か?
・あと、c++のnewみたいに、malloc以外なんかいい物ある?
819デフォルトの名無しさん:2009/02/02(月) 02:41:48
>>818
自作関数でおk
確保自体は一回でもできるけど、分けたほうが分かりやすい
820デフォルトの名無しさん:2009/02/02(月) 07:18:53
>>814
呼び出しされるたびに領域が確保される
821デフォルトの名無しさん:2009/02/02(月) 08:12:13
>>819
分けるってどうするつもり?
822デフォルトの名無しさん:2009/02/02(月) 09:35:23
>>821 こんな感じ
int **alloc2d(int x, int y){ // 二回確保
int *data, **index, i;

index=malloc(sizeof(index[0])*y);
data=malloc(sizeof(data[0])*y*x);
for(i=0;i<y;i++) index[i]=&data[x*i];
return index;
}
void free2d(int **p){
if(!p) return;
free(p[0]);
free(p);
}

int **alloc2d_(int x, int y){ // 一回確保
int *data, **index, i;

index=malloc(sizeof(index[0])*y+sizeof(data[0])*y*x);
data=(int*)(&index[y]);
for(i=0;i<y;i++) index[i]=&data[x*i];
return index;
}
void free2d_(int **p){
free(p);
}
823デフォルトの名無しさん:2009/02/02(月) 10:06:08
広域で使う変数をmainのに置いて、ほかの関数からはアクセス用の関数を通じてアクセスする、っていう風にやる場合の一般的な書き方見たいなものはあるんでしょうか?
824デフォルトの名無しさん:2009/02/02(月) 13:31:24
>>823
main()の外に置いたらグローバル変数。一般的も何も、普通にアクセスできる。
825デフォルトの名無しさん:2009/02/02(月) 14:03:18
なんか皆さんレベル高くてここでお聞きしていいか分からないのですが
下記のコードを実行すると(たとえば S を入力)、
小文字は:sです。英語の大文字を入力してください:
小文字は:*です。英語の大文字を入力してください:
と出てしまいます。下の一行が余計なのですが、なぜこうなるのでしょうか。
よろしくご教示ください。お願いします。

#include <stdio.h>
int main() {
char c;
int diff = 'a'-'A';

for(;;) {
printf("英語の大文字を入力してください:\n");
scanf("%c",&c);

if (c == 'q') {
break;
}
printf("小文字は:%cです。",c+diff);
}
return 0;
}
826デフォルトの名無しさん:2009/02/02(月) 14:14:54
>>825
scanf()で%cを使うと、Sに続いて入力した改行文字を拾わないで放置してしまうのです。
その文字が、次のscanf()で拾ってしまうので、1行余計になってしまうのです。
取り敢えずscanf()の後にgetchar()を入れておけば巧くいくことでしょう。

但し、実用的には余りいい解決法ではありませんが。
827デフォルトの名無しさん:2009/02/02(月) 14:25:16
fgetsしてsscanfするとええでってスネオがいってた
828デフォルトの名無しさん:2009/02/02(月) 14:56:30
scanf直後cが英大文字で無い場合は無条件でループ継続させる
829デフォルトの名無しさん:2009/02/02(月) 14:57:13
と終了できなくなるので、if(c=='q'){...}の直後だな
830825:2009/02/02(月) 16:18:40
>>826
なるほど!リターンキー押した時点で、改行文字まで取り込んでしまっているのだけど
scanfは一文字しかもって行ってくれないので改行文字が
バッファ?に残っているんですね。
ためしに、getchar()でとりだしてバッファから消した文字をprintf
したら一行改行されていました。納得です。

>>827
文字数制限できるfgetsでリターンキーの改行文字もふくめ読み込んでしまった後に
sscanfでそれを料理するという感じなのでしょうか。
今後はこの組み合わせで行きたいと思います。

>>828-829
これは入力チェックにつかえるわけですよね。「英大文字でない場合」という
のは正規表現というので、実現するんでしょうか。
気持ち的には
if(c != [A-Z]) 的な???ものと予想しますが、「char型の変数」と「英大文字ではない
という表現」をどう結びつければ見当もつきません。。。

この辺は全然わからないですが避けては通れないのでがんばりたいと
思います。

皆様ご教示大変に助かりました。僅かですが前進できたような気がします。
ありがとうございました。
831825:2009/02/02(月) 16:23:09
s/れば見当も/ればいいのか皆目見当も/
ですね、すみません。
832デフォルトの名無しさん:2009/02/02(月) 16:23:33
>>830
(ASCIIコードで A-Z が連続していることを前提に)

if (c < 'A' || c > 'Z') { /* 英大文字でない */ }
833デフォルトの名無しさん:2009/02/02(月) 16:26:28
× ASCIIコードで
○ 処理対象の文字コードで
834825:2009/02/02(月) 16:29:54
>>832
なるほど、そういう風に帰着させればいいのですね。
勉強になりました。
835デフォルトの名無しさん:2009/02/02(月) 16:40:51
>>834
isupper() を使ってくれ
836デフォルトの名無しさん:2009/02/02(月) 16:42:01
あ… isupper/islower の存在忘れてた
837デフォルトの名無しさん:2009/02/02(月) 17:05:47
おまけに、 isalphaで大小英字 isalnumで英数字全体 など。調べてみるよろし
838825=834:2009/02/02(月) 17:19:12
>>835
ctype.hをインクルードすればいいと今知りました。
大変便利ですね、使わせていただきます。

>>837
かなり便利なものがそろっていますね。
C言語は相当スパルタンな印象があったので意外(失礼)でした。

C言語の勉強、ちょっとやっては長い間サボり、というのを繰り返してきましたが
今日を機会にがっつりと勉強したいと思います。
839デフォルトの名無しさん:2009/02/02(月) 17:54:39
>>820
呼び出される度に領域確保されてたら、staticの意味ないだろ。
アドレス持ち出し忘れたら、ただのゴミでしかない。
840デフォルトの名無しさん:2009/02/02(月) 18:38:00
( 'A' ) イクナイ
841デフォルトの名無しさん:2009/02/02(月) 18:50:34
質問です。
コンソールアプリケーションを作成する際、
main関数も他の関数とほぼ同様に扱われるそうですが、
プログラム内で、main関数を呼び出して御利益のあるプログラム例ってありますか?
842デフォルトの名無しさん:2009/02/02(月) 18:51:37
>>841
7行プログラミング
843デフォルトの名無しさん:2009/02/02(月) 19:38:11
>>841
ユーザプログラム内でmain()を呼び出すのは避けた方がいい。
ごりやくはあってもりえきを損ないかねない。
844デフォルトの名無しさん:2009/02/02(月) 20:11:45
>>841
ない
845デフォルトの名無しさん:2009/02/02(月) 22:05:43
>>841
コードゴルフ
846デフォルトの名無しさん:2009/02/02(月) 22:25:52
コマンドラインの解析をmainの再帰で実現しているコードならみたことがあるけど
とてもおすすめできない
847デフォルトの名無しさん:2009/02/02(月) 22:50:56
#include<stdio.h>
#include"aaa.h"

int aaa();

int abc;

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

//// aaa.h /////

int aaa()
{
abc = 1;
}

こうすると 関数aaaのabc
が未定義となるのですが良い
方法はないですか?
848デフォルトの名無しさん:2009/02/02(月) 22:51:48
extern int abc;
849デフォルトの名無しさん:2009/02/02(月) 22:52:24
そもそもグローバル変数なんて癌にしかならないから
使わない方がいいよ。
ローカル変数を引数で渡すのが良い。
850デフォルトの名無しさん:2009/02/02(月) 22:57:55
>>847
ヘッダに関数定義を書くな
851デフォルトの名無しさん:2009/02/02(月) 23:07:42
>>847
aaa.h
-----
extern int abc;
int aaa(void);
-----

aaa.c
-----
int abc;
int aaa(void)
{
abc = 1;
return 0;
}
-----

main.c
-----
#include <stdio.h>
#include "aaa.h"
int main(void)
{
aaa();
return 0;
}
852デフォルトの名無しさん:2009/02/02(月) 23:09:01
>>847
aaa()の本体は、aaa.hで定義され、#include指令を使ってmain.cに取り込まれる。
しかしこの#includeが行われた時点ではint abc;の宣言がまだ記述されていないためエラーになる。

Cの一般的な規則に従えば、.hファイルに関数の定義を書くべきではない。
.cファイルに書いて、.hファイルには.cファイルのコンパイルに必要なその他の定義を記述し、それを.cファイルが#includeする。

プロジェクトが複数の.cファイルにまたがるとき、ある.cファイルのグローバルな変数や関数を
他の.cファイルで使えるようにするには、元の.cファイルに対応する.hファイルを作って、
そこに変数や関数のextern宣言(関数は不要だが)を入れ、それを両方の.cファイルで#includeする。
一つの.hファイルを二つ(以上)の.cファイルで#includeするのは、.cファイル間での矛盾を起こさないためである。
853デフォルトの名無しさん:2009/02/02(月) 23:09:37
まとめると、君がやるべきことは以下のようになる。

//// main.h ////
extern int abc;

//// main.c ////
#include <stdio.h>
#include "main.h"
#include "aaa.h"

int abc;

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

//// aaa.h /////
int aaa();

//// aaa.c /////
#include "main.h"
#include "aaa.h"

int aaa()
{
  abc = 1;
}
854847:2009/02/02(月) 23:10:43
>>848-851
どうもありがとうございました。

分割するとき関数はどこにかけばいいのでしょうか?
855デフォルトの名無しさん:2009/02/02(月) 23:15:02
これがベスト

//// main.c ////
#include <stdio.h>
#include "aaa.h"

int main(void)
{
 int abc;
 aaa(&abc);
 return 0;
}

//// aaa.h ////
#ifndef AAA_H
#define AAA_H
void aaa(int *abc);
#endif

//// aaa.c ////
#include "aaa.h"

void aaa(int *abc)
{
 *abc = 1;
}
856デフォルトの名無しさん:2009/02/02(月) 23:55:38
次はリンカについて。
857デフォルトの名無しさん:2009/02/03(火) 21:08:47
質問です
コマンドラインから一桁の数字を入力し
「あなたの入力した数字は○です」
と返すプログラムは作りたいのですが、難しいでしょうか
858デフォルトの名無しさん:2009/02/03(火) 21:17:43
>>857
簡単でしょう
859デフォルトの名無しさん:2009/02/03(火) 21:18:34
C言語プログラム内で入力なら、scanf使ったのがC入門系サイトの3ページくらいまでに載ってる。
コマンドライン引数で与えるならプログラム経験皆無なら少々遠い。
自作関数作れるなら(main 引数)でググればなんか出てくる。
860デフォルトの名無しさん:2009/02/03(火) 21:25:35
>>859
ありがとうございます
頑張ってみます
861デフォルトの名無しさん:2009/02/03(火) 22:24:45
#include <stdio.h>
int main()
{
 int num;
 scanf("%d", &num);
 printf("あなたの入力した数字は%dです");
 return 0;
}
862デフォルトの名無しさん:2009/02/03(火) 22:30:37
 printf("あなたの入力した数字は%dです",num);
863デフォルトの名無しさん:2009/02/03(火) 23:05:28
C++超好き
864デフォルトの名無しさん:2009/02/03(火) 23:07:49
C++大好き
865デフォルトの名無しさん:2009/02/03(火) 23:09:01
C++が一番好き
866デフォルトの名無しさん:2009/02/03(火) 23:09:32
C++最高に好き
867デフォルトの名無しさん:2009/02/03(火) 23:10:03
あんたなんてだいっきらい
868デフォルトの名無しさん:2009/02/03(火) 23:10:49
悔しかったらあんたもC++みたいになってみなさいよ!
869デフォルトの名無しさん:2009/02/03(火) 23:12:00
C++スレなら他にたくさんあるだろ
よそへいって愛でて来いよ
870デフォルトの名無しさん:2009/02/03(火) 23:13:13
誘導しろカス
871デフォルトの名無しさん:2009/02/03(火) 23:15:32
C++が一番強い
872デフォルトの名無しさん:2009/02/03(火) 23:24:29
D言語・・・
873デフォルトの名無しさん:2009/02/03(火) 23:32:33
C++(笑)
874デフォルトの名無しさん:2009/02/03(火) 23:39:45
875デフォルトの名無しさん:2009/02/03(火) 23:41:59
においとか紳士的な態度ならCだと思っている
876デフォルトの名無しさん:2009/02/03(火) 23:49:43
>>871-872
C++ VS D・・・ ですね。期待してます。
初心者の扱うC言語の方が、ずっとOSには強敵だぞ。
877デフォルトの名無しさん:2009/02/04(水) 03:10:46
こんばんは。プログラミング初心者なんですけどポインタのところで詰まりました…
内容は
ユーザーに入力させた文字列(半角英数
字)をchar型配列にいれ、1文字ずつずら
して表示させるプログラムを作成せよ。
入力された順番と同じになったら表示終了。

要するに、
ABCDEってあったら次に
BCDEAって1つずつずらして、最後にABCDEに戻ったら表示してプログラムを終了。
というのを作成したいのですがちっともわかりません。。。ご教授おねがいします。
878デフォルトの名無しさん:2009/02/04(水) 03:16:36
君が女ならおっぱいうp、男なら今夜のおかずうpで教えてあげるよ。
879デフォルトの名無しさん:2009/02/04(水) 03:21:02
>>877
宿題なら宿題スレ行った方がいいと思うよ
880デフォルトの名無しさん:2009/02/04(水) 04:44:24
>>877
まずどこまでなら出来るのか言え
881デフォルトの名無しさん:2009/02/04(水) 08:07:02
char const * str = "abcde";
unsigned len = strlen(str);
for (unsigned ic = 0; ic < len; ++ic) {
sprintf("%.*s%.*s\n", len - ic, & str[ic], ic, str);
}
882デフォルトの名無しさん:2009/02/04(水) 10:11:23
>>881
何がしたいのかもわからん
883デフォルトの名無しさん:2009/02/04(水) 10:25:42
>>882
>881は>877へのレスだろうね。
つーか、誰かやるとは思ったが……
884デフォルトの名無しさん:2009/02/04(水) 10:44:37
>>883
リテラルを上書きしようとしてるし、フォーマットでもないアドレスをキャストなしで喰わせようとしている。
イカレテルとしか思えないが・・・?
885デフォルトの名無しさん:2009/02/04(水) 10:47:45
そもそも>>877をポインタ使ってやる必要があるとも思えん。
886デフォルトの名無しさん:2009/02/04(水) 10:52:53
要は、sprintf()じゃなくてprintf()だろ。そのくらいわからね?
887デフォルトの名無しさん:2009/02/04(水) 11:01:28
>>886
そのツモリで書いたとしたら、図抜けたマヌケだな。
888881:2009/02/04(水) 11:06:08
>>886
そそ。

>>884>>887
どの辺りが間抜けなのか詳しく。まさかとは思うが、"%.*s"の意味も判らずレスしてないよね?
# どうも、変に日本語をカタカナで書きたがる人種は要領を得ない文章を書くから困る。

↓以下、ナンバーサインがどうのこうのと逆切れレスがつくと予測。
889デフォルトの名無しさん:2009/02/04(水) 11:11:07
まぁ、厳密に言えば0からじゃなくて1からスタートしてlenと一致するまで回すべきだなw
肝腎の>877の要求に見合う方針かどうかは別として。

>↓以下、ナンバーサインがどうのこうのと逆切れレスがつくと予測。
甘いな。つーか、召喚すなw
890デフォルトの名無しさん:2009/02/04(水) 11:13:43
俺は"%.*s"の意味が分からんので教えてください
891デフォルトの名無しさん:2009/02/04(水) 11:23:59
>>890
マニュアルページなりリファレンス本なりをちゃんと読むべき。

とは言え、レスの性質上一応解説。
簡単に言うと整数型引き数の数値で出力カラム数を制限できる。
応用例は、まさしく>881。

簡単な例と出力はこんな感じ。
printf("%.*s", 5, "abcdefghi")→abcde

制限より短い入力に対しては影響しない。
printf("%.*s", 3, "ab")→ab

尚、バッファオーバラン防止などの為に固定長で制限すればいい場合はフォーマットで指定すればいい。
printf("%.3s", "abcde")→abc
892デフォルトの名無しさん:2009/02/04(水) 11:26:40
老婆心ながら付け加えておくと、"%*s"と"%.*s"の違いに注意。
蛇足ながら、"%*.*s"とすると短い文字列は空白を追加し長い文字列は制限できるので
固定長フォーマットでの出力に便利。
893デフォルトの名無しさん:2009/02/04(水) 11:50:21
ボケかましたあとの弁解が必死なのって・・・
894デフォルトの名無しさん:2009/02/04(水) 12:16:46
>>888
>>877
>ユーザーに入力させた文字列
>最後にABCDEに戻ったら表示して
くらいか。
895デフォルトの名無しさん:2009/02/04(水) 12:38:21
つまりずらしたふりをして入力文字列をそのまま出力すればいいんですね?
896デフォルトの名無しさん:2009/02/04(水) 12:40:40
これは循環リストの問題ですね。わかります
897デフォルトの名無しさん:2009/02/04(水) 14:44:23
授業の課題で出たのですが,LIFO(Last In First Out)
がどうしてもわかりません

#include<stdio.h>
struct node{
int key;
struct node *next;
};
struct node TOP;
void pu;sh (int num)
struct node *n;
n= (struct node *)malloc(sizeof *n);
n->next = TOP.next
TOP.next =n;
}
int pop()
{
作成
}
main()
{
TOP.next=NULL;
pushとpopが正常な動作をしているか確かめられる
プログラムを作成
}

popとmainがわかりません.お願いします
898897です:2009/02/04(水) 14:47:22
10行目は
void push (int num)
struct node *n;
n= (struct node *)malloc(sizeof *n);
n->key =num;
n->next = TOP.nex
でした.すみません
899デフォルトの名無しさん:2009/02/04(水) 15:13:58
宿題は自力でやれ
900デフォルトの名無しさん:2009/02/04(水) 15:21:31
a=b-c;
d=(a/b)*100;

fprintf(fp,"%d %d %f\n",b,a,d);

これでa,bは正しく書かれるんだけど、dは0.00000になってしまいます。
実際に計算しても0にはなりません。
901881:2009/02/04(水) 15:25:05
>>894
宿題スレじゃないんだから丸々書く必要もないでしょ。
最後にってのはforの条件をic <= lenにすればOK。
つーか、ヒントだけ書いたつもりを間抜けってのもなぁ。
他人(ひと)に対してそこまで悪し様に言うのほどのものかね。
# 元質が帰ってこないから役に立ったかどうかは判らんがw

>>897
皆目見当つかないなら、教官を拝み倒してでも復習すればいいじゃん。
多少なりとも見当ついているなら書いてみればいいじゃん。
丸投げしたいなら宿題スレに書けばいいじゃん。
902デフォルトの名無しさん:2009/02/04(水) 15:26:26
>>900
a, b,が整数型(int)なら、d = (double) a / b * 100で。
903デフォルトの名無しさん:2009/02/04(水) 15:26:32
>>897
まず、リストの先頭を保持する方法がおかしい。
TOP.keyは使用していないんだから、struct node *top;としてそこからリストを始める。

次にpopだが、基本的にpushの逆。
1) topの持っている先頭ノードの場所を一時変数に記憶
2) topの指す場所を先頭ノードの次のノードの場所に変更
3) 1)、2)の操作で切り離されたノードからキーの値を一時変数に記憶
4) 1)で記憶した元先頭ノードの領域を開放する(重要)
5) 3)で記憶した値を呼び出し元に返して終了
ただし、リストが空のときにどう処理するかという問題がある。
通常は、キーになりえない何か特別な値を返すが、
この場合習作だから、無視してもいいかもしれない(課題ならそのへん書いてありそうだが)。
ともあれtopがNULLかどうかはチェックして処理を切り替えること。

mainは、任意個数の数字を入力させてそれを次々にpushし、
入力終了(たぶんEOF)になったら逆にpopで値を取り出して画面に表示すればOK。
904デフォルトの名無しさん:2009/02/04(水) 15:33:02
>>888
みんな攻めちゃだめ。よく中2で此処まで覚えたじゃない。
そうそう、そういうマイナーな物覚えて使えるって主張できるんだからすごいすごい。
普通に配列で済むのを『オレのプログラムでは2次元配列使ってるから』って言ってる小5よりずっと偉いね。
凝り固まった自分では
char string[256],*P,*Q;
scanf("%s",string);
for(P=string+1;*(P-1)!='\0';P++){
>--->printf(P);
>--->for(Q=string;Q!=P;Q++) putchar(*Q);
>--->putchar('\n');
}
ポインタで書くならこんなところか。
out[256]とかに入れてprintfするのもポインタっぽいけどね。
905デフォルトの名無しさん:2009/02/04(水) 15:34:10
>>902
ちゃんとdをdouble型の変数で定義してあります。
906デフォルトの名無しさん:2009/02/04(水) 15:34:21
うわぁ、変数が大文字一文字だ……
907デフォルトの名無しさん:2009/02/04(水) 15:35:01
>>905
>a, b,が整数型(int)なら、d = (double) a / b * 100で。

にほんごわかりますか?
908デフォルトの名無しさん:2009/02/04(水) 15:47:23
わけのわからない煽りあいは他所でやれ
909デフォルトの名無しさん:2009/02/04(水) 16:09:02
>>904
相当ひどいコードをお書きになる
910897:2009/02/04(水) 16:14:27
>>903
ありがとうございます
期限は明日までなのでなんとか頑張ってみます
わからなかったらまた質問するかもしれません
911デフォルトの名無しさん:2009/02/04(水) 16:22:03
>>907
あ、わかりました。ありがとうございます。
にほんごがわかるのでにほんごできいたんです。
912デフォルトの名無しさん:2009/02/04(水) 16:49:24
( 例題1 ) 『あの〜、プリーズギブミーチョコレート、お願い。』
( 例題2 ) 『あの〜、scanf("%c",&chocolate);、教えてお願い。』
選択肢 : (1) 日本語 、(2) 英語、 (3) コムギコカナンカダ (4) その他( )
913デフォルトの名無しさん:2009/02/04(水) 16:52:09
>>912
日本語でおk
914デフォルトの名無しさん:2009/02/04(水) 16:55:34
>>912
コムギコカナンカダでおk
915デフォルトの名無しさん:2009/02/04(水) 17:44:12
>>881
この無様なコードがナンバーサインを騙っているのか、本人なのか分からないが、
無様なのだけは確か。
916デフォルトの名無しさん:2009/02/04(水) 18:15:19
つまり
「それはヨーグルトですか?」 → 「いいえ、ケフィアです」
は、このスレでは、
「それはC言語ですか?」 → 「いいえ、コムギコカナンカダ」
となるのですね?
917デフォルトの名無しさん:2009/02/04(水) 18:35:35
いいえ、素麺蝮です。
918デフォルトの名無しさん:2009/02/04(水) 21:14:38
>>877
ポインタ使ってみた。
char *p, *q, str[256];
scanf("%s", str);
for(p=str; *p++; ) {
for(q=p; *q; q++) putchar(*q);
for(q=str; q<p; q++) putchar(*q);
putchar('\n');
}
919デフォルトの名無しさん:2009/02/04(水) 22:05:13
char *p, *q, *n, str[256];

scanf("%s", str);

for(p = str; p != '\0'; p++);
do{
920デフォルトの名無しさん:2009/02/04(水) 22:45:14
簡単なログのビュワーを作ろうと思っています。
unixのコマンド tail -f に該当する機能をC(Visual Studio)で実現したいのですが、
ロジック的にどんな感じになるのか教えていただけないのでしょうか?

短い周期で、前回との差分分を追加出力させればなんとか実現できそうですが、
処理に時間がかかりそう気がします。


921877:2009/02/04(水) 22:51:07
長時間試行錯誤して作ったんですけど
#include<stdio.h>
#include<string.h>

change(int* cnum, char* c){
int i,j,tmp;
for(j=0;j<*cnum-1;i++){
tmp=*(c+i);
*(c+i)=*(c+i+1);
*(c+i+1)=tmp;
}printf("%s\n",c);
}
}
int main(){
printf("文字列を入力");
char c[50];
int cnum;
gets (c);
cnum =strlen (c);
printf("文字数=%d\n",cnum);
change (&cnum,&c);
return 0;
}

指摘ください。。
922877:2009/02/04(水) 22:51:39
長時間試行錯誤して作ったんですけど
#include<stdio.h>
#include<string.h>

change(int* cnum, char* c){
int i,j,tmp;
for(j=0;j<*cnum-1;i++){
tmp=*(c+i);
*(c+i)=*(c+i+1);
*(c+i+1)=tmp;
}printf("%s\n",c);
}
}
int main(){
printf("文字列を入力");
char c[50];
int cnum;
gets (c);
cnum =strlen (c);
printf("文字数=%d\n",cnum);
change (&cnum,&c);
return 0;
}

指摘ください。。
923デフォルトの名無しさん:2009/02/04(水) 22:57:27
いっそtailのソース見ちまえばいいのでは
924デフォルトの名無しさん:2009/02/04(水) 23:13:58
>>922 デバッグしといた。本当はgets使わない方がいいけど。
#include<stdio.h>
#include<string.h>
void change(int cnum, char* c) {
int i;
char tmp;
for(i=0;i<cnum-1;i++) {
tmp=*(c+i); /* tmp=c[i]; って書き方でもOK */
*(c+i)=*(c+i+1);
*(c+i+1)=tmp;
}
printf("%s\n",c);
}
int main(){
char c[50];
int cnum, i;
printf("文字列を入力");
gets(c);
cnum = strlen(c);
printf("文字数=%d\n", cnum);
printf("%s\n",c);
for (i = 0; i < cnum; i ++) {
change(cnum, c);
}
return 0;
}
925デフォルトの名無しさん:2009/02/04(水) 23:26:08
void change(int cnum, char *c)
{
int i;
char temp = *c;
for(i=1; i<cnum; i++) c[i-1] = c[i];
c[i-1] = temp;
}
でいいじゃん。
926デフォルトの名無しさん:2009/02/04(水) 23:30:05
>>922
こんなんでどう?

void change1(char c[]) {
int i, j, n;

n = strlen(c);
for (i = 0; i <= n; i++) {
for (j = 0; j < n; j++) {
printf("%c", c[(i+j)%n]);
}
printf("\n");
}
}
927デフォルトの名無しさん:2009/02/04(水) 23:34:04
短く書きゃいいってもんでもないな
928デフォルトの名無しさん:2009/02/04(水) 23:42:18
Windowsで使えるデバッグツールはありませんか?
探してみたのですが、Linux用しかみつかりません。

コンパイラはBCCを使っています
929デフォルトの名無しさん:2009/02/04(水) 23:43:13
VC++
930デフォルトの名無しさん:2009/02/04(水) 23:43:24
>>920
#include<stdio.h>
#include<windows.h>

#define N (10)

int main(int argc, char *argv[]){
FILE *fp;
const char *filename="hoge.txt";
char buf[1024];
int i, pos[N+1]={0};

if(argc==2) filename=argv[1];

fp=fopen(filename, "r");
if(fp==NULL) return 1;
for(i=0;;i++){
if(!fgets(buf, sizeof(buf), fp)) break;
pos[i%(N+1)]=ftell(fp);
}
fseek(fp, pos[i%(N+1)], SEEK_SET);

for(;;){
if(fgets(buf, sizeof(buf), fp)) printf("%s", buf);
else Sleep(500);
}
fclose(fp);

return 0;
}
931デフォルトの名無しさん:2009/02/05(木) 00:08:15
>>920
標準入力に向けて口開けて待つ
餌が来たら標準出力にはき出す
932931:2009/02/05(木) 00:09:04
ああごめんきにしないで。。。
933デフォルトの名無しさん:2009/02/05(木) 01:24:19
>>920
#include <stdio.h>

int main(int argc, char *argv[])
{
char *filepath;
FILE *stream;

if (argc == 2 ) {
filepath = argv[1];
} else {
printf("trace <filepath>\n");
return -1;
}

stream = freopen(filepath, "r", stdin);

while(1) {
int c = getchar();
if (c != EOF) putchar(c);
}

fclose(stream);

return 0;
}
934894:2009/02/05(木) 09:44:58
>>901
や、俺 >>887 じゃないから知らんけど。
おれ自身、速度が問題にならないときは
sprintf で文字列操作なんてしょっちゅうやるし。

>>904
その糞汚いコードは教育上宜しくない。
>printf(P);
論外。入力文字列が "X%X" だったらどうなるか試してみるといい。

>>915
その必死さが寧ろ無様。
935デフォルトの名無しさん:2009/02/05(木) 10:30:23
>>934
> sprintf で文字列操作なんてしょっちゅうやるし。
そんな話じゃないだろ
936デフォルトの名無しさん:2009/02/05(木) 10:32:11
>>935
っていうか、コイツ最近になってC系のスレッドに出入りしている、
コンパイルもかけないでコード貼り付けてくヤツだろ。
単なる釣りじゃなくて、本物のマヌケだったんだよ。
937デフォルトの名無しさん:2009/02/05(木) 13:37:10
よそでやれ
938デフォルトの名無しさん:2009/02/05(木) 13:44:18
作ったプログラムを起動すると結果が表示された瞬間に
ウインドウがとじてしまうのですがどうすればウインドウを
消せなくできるのでしょうか?
939デフォルトの名無しさん:2009/02/05(木) 13:45:10
return の前にgetchar();でも入れる
940デフォルトの名無しさん:2009/02/05(木) 13:48:21
getchar()をいれずに何とかする方法はありませんか?
941デフォルトの名無しさん:2009/02/05(木) 13:50:54
コマンドプロンプトから起動する?
942デフォルトの名無しさん:2009/02/05(木) 13:52:43
ビジュアルスタジオからやる方法でおねがいします
943デフォルトの名無しさん:2009/02/05(木) 13:54:34
Ctrl+F5で実行
944938:2009/02/05(木) 14:00:39
BCC Developerで作成しているのですが
メイク → 実行 ではちゃんと結果が出てウインドウ
は閉じません。

しかし、このプログラムのフォルダ(Debugフォルダ)にある
exeファイルを起動すると結果が出た瞬間に閉じてしまいます。
945デフォルトの名無しさん:2009/02/05(木) 14:00:58
ステップ実行で起動する。
(=main 先頭で止まる)
946デフォルトの名無しさん:2009/02/05(木) 14:01:48
ああ、VSじゃないのか。

コマンドプロンプトから実行する。
947938:2009/02/05(木) 14:20:43
コマンドプロンプトからできました。

クリック起動だけでは駄目なんですね・・・
948デフォルトの名無しさん:2009/02/05(木) 14:41:10
*.batファイル作って、

*.exe
pause

で、実行は*.batからってのが一番簡単なんじゃないか。
949デフォルトの名無しさん:2009/02/05(木) 20:25:18
ショートカット作って

cmd /k "c:\〜\program.exe"

が一番簡単。
950デフォルトの名無しさん:2009/02/06(金) 22:30:07
ちょっと教えてください。
私はWindowsXPでCygwinを使ってC言語を勉強しています。
ネットで調べてインストールと環境変数の設定まではうまくいきました。
test.cというプログラムを作って
コマンドプロントで gcc test.c と打ちコンパイルして a.exeが生成されました。
そしてa.exeはちゃんと実行できたのです。
問題はここからです。
別のプログラムをコンパイルしても常に生成されるファイルがa.exeになってしまいます。
新しいファイルは生成されず上書きされてしまうのです。
解決策を教えてください。
951デフォルトの名無しさん:2009/02/06(金) 22:33:28
出力ファイル名をa.exe以外にすればいい
952デフォルトの名無しさん:2009/02/06(金) 22:33:36
>>950
gcc --help
953デフォルトの名無しさん:2009/02/06(金) 22:36:12
>>950
gcc -o hoge.exe hoge.c
オプションの詳細は「man gcc」を実行。(※英語)
あと、Cygwinには標準で「test」って名前のコマンドがあるので注意。
954デフォルトの名無しさん:2009/02/06(金) 22:36:55
gcc -o 出力してほしいファイル名 test.c
955デフォルトの名無しさん:2009/02/06(金) 22:38:53
int型の変数 a, b, cがあり、
c = a / b;
と割り算したいのですが、
cには小数切り上げた整数を入れたいのです。

c = (int)(a(double) / b + 0.99999999);

こんなん思いついたのですが、0.99999999では完璧ではありません・・・
(a÷bが3.0000000000000000001だった場合等)

そこで諸先輩のお知恵をお貸し頂きたい!
956デフォルトの名無しさん:2009/02/06(金) 22:41:38
ceil
957955:2009/02/06(金) 22:44:46
>>956
超ありがとう!
958デフォルトの名無しさん:2009/02/06(金) 22:45:54
C言語(笑)
959>>950:2009/02/06(金) 22:47:02
アドバイスありがとうございました。
アドバイスどおりやったら出来ました。
960デフォルトの名無しさん:2009/02/06(金) 22:47:59
>>958
笑ってる意味が誰にもわからない
駅前のあぶないオヤジと同じ
961デフォルトの名無しさん:2009/02/06(金) 22:51:02
C言語(泣)
962デフォルトの名無しさん:2009/02/06(金) 22:52:49
>>961
ポインタがわからなくて挫折したんだな
963デフォルトの名無しさん:2009/02/06(金) 22:55:32
C言語(嬉)
964デフォルトの名無しさん:2009/02/06(金) 22:57:16
ポインターがわからない奴なんて実際存在しない。
都市伝説。
965デフォルトの名無しさん:2009/02/06(金) 23:32:18
ポインタどころか、変数の概念が最後まで理解できなかった奴も存在する。
966デフォルトの名無しさん:2009/02/06(金) 23:32:34
ボイン太を知らない奴なんて実在する
967デフォルトの名無しさん:2009/02/06(金) 23:32:38
いや居るだろ。
俺とか。
968デフォルトの名無しさん:2009/02/06(金) 23:41:34
ポインタは分からんが参照は完璧に理解しているぜ
969デフォルトの名無しさん:2009/02/06(金) 23:51:29
わからんと言うか他人の書いたポインタ操作は読んでる途中で嫌になる。
970デフォルトの名無しさん:2009/02/07(土) 00:19:32
ポインタなら俺に聞け
971デフォルトの名無しさん:2009/02/07(土) 00:27:00
ポインタは分かるがダブルポインタが分からない
972デフォルトの名無しさん:2009/02/07(土) 00:28:33
はいはい
973デフォルトの名無しさん:2009/02/07(土) 00:43:03
ダブルポインタはないわー
974デフォルトの名無しさん:2009/02/07(土) 00:48:10
ポインタのポインタをダブルポインタって呼ぶのがそもそもおかしいんだよ

日本銀行は銀行の銀行だけどダブル銀行って呼んだらおかしいだろ?
975デフォルトの名無しさん:2009/02/07(土) 00:49:49
別に何もダブルになってないもんな
976デフォルトの名無しさん:2009/02/07(土) 00:56:25
void main(void){ ; }
↑に限った話じゃないが、セミコロン単体がソースに入っててもコンパイルするけど
C言語(のコンパイラ)って、『何もない』という物を文とみなしてるの?
void型関数を呼び出すのと同じ事なのだろうか???

『;1,2;』(コンパイルOK) 『;1,,2;』(XX) 『;(void)1,(void)2;』(OK)
『for(;;);;』(OK) 『if((void)2);;』(XX)『if((void)2,1);;』(OK)
感覚的には分かる。forはコンパイラで特殊操作かな。ifは当たり前か?
でも全体的にどこかパッとしない。
977デフォルトの名無しさん:2009/02/07(土) 01:01:00
セミコロンだけの文を空文と言う。
空文を使うと、終了条件満たすまでずっとループしたい場合に

while(MainLoop())
 ;

なんてことができたりする。
個人的には

while(MainLoop()) {
 /* 終了条件満たすまでひたすらループ */
}

みたいに書くけど。
978デフォルトの名無しさん:2009/02/07(土) 01:44:54
空文という言葉があったんですか。 for(p=string;p!=0;p++) ; みたいなコード、割と高機能なので使ってます。
でも、
「void型」=「何も返さない」 、 「空白」=「何もない」=「void型と同処理」
だと思ってたんですが、
『空白+セミコロン』は空文だとして、『空白+演算子+値』はどれもエラー、『void+順次演算子+void』は正常。
が腑に落ちない・・・と思ったんですけど、フリーフォーマットを逆算して考えると解決っぽいですね。
979デフォルトの名無しさん:2009/02/07(土) 02:00:41
;=null statement.
980デフォルトの名無しさん:2009/02/07(土) 02:31:54
>>978
式と文を混同しているな。
文は式文、宣言文、複合文、制御文、ラベル付き文、空文の6つに分けられる。

・ 式文        式にセミコロンを付けたもの。
・ 宣言文      変数、型などの宣言を行う文。
・ 複合文      複数の文を { } で囲んだもの。
・ 制御文     if 文, for 文, while 文など。
・ ラベル付き文 文にラベルをつけたもの。(このため、ラベルの次には必ず文が必要になる)
・ 空文        セミコロンのみの文。

void 型の関数呼び出しは式文に当たる。
例えば void foo(void); という関数があった場合、
foo() という式があって、それにセミコロンをつけて foo(); という式文になる。
foo() という式の型は void 。void 式とか言うこともある、立派な式だ。

空文は式にセミコロンをつけたものではないので、式文ではない。
式文と空文は文法上厳密に区別される。
981デフォルトの名無しさん:2009/02/07(土) 02:37:05
式の説明はしないの?
982デフォルトの名無しさん:2009/02/07(土) 02:40:36
空文は、ブロックの最後にラベルを書きたい場合にも使うことができる。

for(i = 0; i < n; i++) {
 for(j = 0; j < n; j++) {
  for(k = 0; k < n; k++) {
   if(hoge) goto BREAK2;
  }
 }
BREAK2:; ←これ
}
983デフォルトの名無しさん:2009/02/07(土) 02:41:16
gnu 拡張C を活用したコードみたら796の様な育ち方をしたマは発狂するだろう
984デフォルトの名無しさん:2009/02/07(土) 02:51:16
式は即値、変数、関数、そしてこれらに演算子を作用させたもの。
変数、関数は、その宣言や定義(関数定義では { } の外)に現れるものを除く。
985デフォルトの名無しさん:2009/02/07(土) 03:24:46
,の説明がまだだね
986976:2009/02/07(土) 04:13:19
>>980-984
すごく分かりやすかったです!式・文の区別はしてたつもりでしたが
おそらく、コンパイラは内部的に空文をvoid型の式文に変換すると考えてました。
文の読み取りで空白をvoidに置き換えるなら、式でもvoidを扱える条件演算子が機能しない理由は?という風に。

ところで、セミコロンは文の終わりを指しますが、文は必ずしもセミコロンで終わるわけではないですよね。
if(/*此処*/) for(i=0;i<N;/*此処*/) while(/*此処*/) が、疑問として残ってます。
あと、switch文やgoto文でループ内にでも強制的に入れますが、
for(i=0;i<N;i++) FLAG: { /*処理*/ } ができる理由が分かりました。
しかし、forの引数にあたる部分(括弧内)は、文ですよね?
空文・式文は入れてラベル付き文が入れないのが、しっくり来ないです。
今までただただ仕様、と考えてましたが・・・・(飛ぶなよ、ってのは確かですけど)
987デフォルトの名無しさん:2009/02/07(土) 05:16:05
セミコロンは単独で空文
式にセミコロンをつけたものが式文
それだけのこと。

文は文だから、上記2つの「セミコロンで終わる文」も含めて、全て「文」。

for文は、「for (式;式;式) 文」という形の文法が規定されていて、
区切りとしてセミコロンが採用されているだけ。
988デフォルトの名無しさん:2009/02/07(土) 06:47:41
>>942 VisualStudioをカタカナで書いたの初めて見たよ
989デフォルトの名無しさん:2009/02/07(土) 07:53:19
いわゆるポインタとは、ポインタ変数の事を指しているのですか?
990デフォルトの名無しさん:2009/02/07(土) 08:24:06
次スレ立てました
C言語なら俺に聞け(入門篇) Part 44
http://pc11.2ch.net/test/read.cgi/tech/1233962622/
991デフォルトの名無しさん:2009/02/07(土) 11:11:27
まぁ、BNFの読み方と抽象構文木(AST)の概念を理解すると、より理解が深まるんじゃないかな。
992デフォルトの名無しさん:2009/02/07(土) 12:58:03
>>989
単にポインタと言った場合には文脈で判断する必要がある。
もちろん、ポインタ値とポインタ変数は区別して呼ぶのがより良いが、
それはポインタに限った話ではない。
993デフォルトの名無しさん:2009/02/07(土) 13:34:58
ume
994デフォルトの名無しさん:2009/02/07(土) 13:44:38
産めj
995デフォルトの名無しさん:2009/02/07(土) 15:33:43
>>985
if (a, b) hoge(); の , はコンマ演算子で、
foo(a, b); の , は関数呼び出し演算子の一部としての扱いになる。
従って >>984 で既に説明されている。
996デフォルトの名無しさん:2009/02/07(土) 15:38:03
>>987
C99 では for 文は for(初期化文 式; 式) 文 と定義されてたと思う。
初期化文に書けるのは、式文と宣言文と空文だけだけど。
997デフォルトの名無しさん:2009/02/07(土) 16:27:33
typo?
998デフォルトの名無しさん:2009/02/07(土) 16:28:59
>>996
for(;;)について言えば、初期化文が空文で済むが、あとの式が空でもいいのか?
999デフォルトの名無しさん:2009/02/07(土) 16:41:28
>>998
後の2つの部分は式(ただし省略可)というような定義のはず。
1000デフォルトの名無しさん:2009/02/07(土) 16:47:34
          ,,―‐.                  r-、    _,--,、
     ,―-、 .| ./''i、│  r-,,,,,,,,,,,,,,,,,,,,,,,,―ー.    ゙l, `"゙゙゙゙゙ ̄^   \
    /   \ ヽ,゙'゙_,/   .゙l、         `i、   \ _,,―ー'''/  .,r'"
.,,,、.,,i´ .,/^'i、 `'i、``     `--‐'''''''''''''''"'''''''''''゙     `゛   .丿  .,/
{ ""  ,/`  ヽ、 `'i、                        丿  .,/`
.ヽ、 丿    \  .\                      ,/′ 、ヽ,,、
  ゙'ー'"      ゙'i、  ‘i、.r-、      __,,,,,,,,--、     / .,/\ `'-,、
           ヽ  .]゙l `゙゙゙゙"゙゙゙゙ ̄ ̄     `'i、  ,/ .,,/   .ヽ  \
            ゙ヽ_/ .ヽ_.,,,,--―――――ー-ノ_,/゙,,/′     ゙l   ,"
                 `             ゙‐''"`        ゙'ー'"
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。