C言語なら俺に聞け(入門篇) Part 43
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/01/24(土) 19:00:13教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
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
0002デフォルトの名無しさん
2009/01/24(土) 19:35:18使ってるためにさらに輪をかけてゲロゲロになっていて、どうし
ようもないゴミが簡単に生産されるようになってる。正直いって、
C++ を選ぶ理由が C プログラマーを追っぱらうため *だけ* だっ
たとしても、それ自体、C++ を使う強力な理由になりうる。
Linus Torvalds
0003デフォルトの名無しさん
2009/01/24(土) 19:40:240004デフォルトの名無しさん
2009/01/24(土) 20:39:19構造体ポインタを戻り値としたいときはどうすればよいのですか?
STRUCTURE player_entry(STRUCTURE ptr, int count)
・・・
return ptr;
{
・・・
ptr = player_entry(ptr, count);
・・・
このようにしたらエラーになってしまいます。
0005デフォルトの名無しさん
2009/01/24(土) 20:56:51たぶん、こう
STRUCTURE *player_entry(STRUCTURE *ptr, int count)
0006デフォルトの名無しさん
2009/01/24(土) 21:15:20たぶんできました。ありがとうございます。
関数名に*をつける発想はありませんでした、、
0007デフォルトの名無しさん
2009/01/24(土) 21:22:030008デフォルトの名無しさん
2009/01/24(土) 22:30:04という関数内で社員名を入力させて
その社員が構造体のメンバ(list->name)にあるかどうか調べたいんですが
どーすればいいか分かりません。
while(line != NULL){
・・・・
line = line->next;
}
この形で走査したいんですが
よろしくお願いします。
0009デフォルトの名無しさん
2009/01/24(土) 22:33:190010デフォルトの名無しさん
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/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
0011デフォルトの名無しさん
2009/01/24(土) 23:51:330012デフォルトの名無しさん
2009/01/24(土) 23:53:05初期化しない奴は初期化忘れによるバグを大量に発生させる。
0013デフォルトの名無しさん
2009/01/25(日) 00:02:25初期化するかしないかは変数による
NULLでするかどうかも変数による
0014デフォルトの名無しさん
2009/01/25(日) 00:35:07たとえば、char *p="abc"というポインタ変数があって、
それには何かきまったアドレスがあるわけです。
そのアドレスを別のアドレスに変えるにはどうすればいいんですか。
0015デフォルトの名無しさん
2009/01/25(日) 00:37:15p = でなんでも代入すりゃいいだろ
0016デフォルトの名無しさん
2009/01/25(日) 00:49:190017デフォルトの名無しさん
2009/01/25(日) 00:54:26「それ」は、ポインタ変数を指示しているので、pのアドレスのこと、つまり、値としては、&pである。
これを変えるのは、難しい。アセンブリレベルでコードを書き換えてからコンパイルするか。バイナリをハックするか。
0018デフォルトの名無しさん
2009/01/25(日) 00:59:420019デフォルトの名無しさん
2009/01/25(日) 01:00:57アセンブリの段階で変数とか消滅してるけどな
0020デフォルトの名無しさん
2009/01/25(日) 01:01:180021デフォルトの名無しさん
2009/01/25(日) 01:06:560022デフォルトの名無しさん
2009/01/25(日) 01:10:060023デフォルトの名無しさん
2009/01/25(日) 01:30:26a=strcmp(pnt[b],pnt[c+1]);
if(a>0){
b=c+1;
}
c++;
}
エラーは起きないのにこのwhile文にだけ入らないみたい。
なんで??
ちなみにC=0です。
これ以外のどこかがおかしいから入らないのかな?
0024デフォルトの名無しさん
2009/01/25(日) 01:32:100025デフォルトの名無しさん
2009/01/25(日) 01:39:38whileに挿れる前の、初めてのcが11以下なのか、どうなのか?チェキして
0026デフォルトの名無しさん
2009/01/25(日) 01:39:57あー。
何かいけたかも。
0027デフォルトの名無しさん
2009/01/25(日) 02:50:04int a = 130;
int b = 100;
double c;
c = a / b;
こうするとエラーが起こります。
よろしくお願いします。
0028デフォルトの名無しさん
2009/01/25(日) 03:16:050029デフォルトの名無しさん
2009/01/25(日) 03:16:15ちゃんとcは1になると思うが、どういうエラーが起こるんだ
0031デフォルトの名無しさん
2009/01/25(日) 04:08:270032デフォルトの名無しさん
2009/01/25(日) 05:14:400033デフォルトの名無しさん
2009/01/25(日) 05:16:05cに代入した値は、何か別の場所で使ってる?
0034デフォルトの名無しさん
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です。
コンパイルオプションなどは特に設定してません。
0035デフォルトの名無しさん
2009/01/25(日) 08:27:22いくつか警告がでるはず。
一般的に必須なのは math.h
sqrt() の返り値が double であると宣言する必要がある。
ただし、gccはprintfのフォーマット演算子の解析しているので、
"%f"から double を類推できて、問題なく動いているのだと思う。
003634
2009/01/25(日) 09:14:06数年の記憶ではエラーが出たような気がして。
-Wall試してみました。警告出てきました。
ですが、エラーにならないならインクルードする必要がないってことになってしまいませんか?
それとも、このエラーにならないってのはgccの仕様であって、
C89やC99では認められてなかったりするのでしょうか?
0037デフォルトの名無しさん
2009/01/25(日) 09:15:15です。
0038デフォルトの名無しさん
2009/01/25(日) 11:46:29コンパイルエラーのことを気にしてるのなら、文法的に間違ってない
のだから、コンパイルは通るだろう
0039デフォルトの名無しさん
2009/01/25(日) 11:56:44今の gcc は double sqrt(double) だってインクルードしなくても知ってて、
それでうまく動くだけに過ぎない。
規格合致の挙動では、
関数プロトタイプのない状況では sqrt(3) とすると
int sqrt(int) であるかのように sqrt を呼び出すので変になる。
0040デフォルトの名無しさん
2009/01/25(日) 13:08:23>C89やC99では認められてなかったりするのでしょうか?
そのとおり
0041デフォルトの名無しさん
2009/01/25(日) 13:27:18未定義だから、コンパイル出来なくても良いんじゃない?
004227
2009/01/25(日) 14:21:33>>32
>>33
int a,b;
double c;
a=10;
b=20;
c = a / b;
こうすると0.0000となってしまいます。
ただしい計算するにはどうすれば良いですか?
0043デフォルトの名無しさん
2009/01/25(日) 14:31:28または
c = a / (double)b;
c = a / bは、double = int / intだから、intで評価したあと暗黙的にdouble型にキャストされて代入される。
整数型の/演算は、少数切捨てになるので、a / b == 0これが、double型にキャストされてcにdouble型で0を表すビット列が代入される。
0045デフォルトの名無しさん
2009/01/25(日) 15:16:05「複合文に特有の変数はその複合文内で宣言して利用せよ」
とあるのですが、本当でしょうか?
前の教本では特にそういう記述は無く、
ローカル変数はすべてその関数のはじめで宣言されていますが、
どちらが一般的なんでしょう?
0046デフォルトの名無しさん
2009/01/25(日) 15:22:07新しい本のほうを信じろ。
変数の有効範囲はできるだけ限定されていたほうが、また未初期化の状態を減らすほうが
後から、または他人が見たときに追いかけやすい。
さらにその考えを進めた結果、Cを元にした言語のすべて、そしてC自身の最新の規格では
変数の宣言は複合文の先頭である必要さらなくなっているほどだ。
確かに、関数先頭で全部宣言するやり方も根強いがもう古い。
0047デフォルトの名無しさん
2009/01/25(日) 15:26:37ただデバッガがどうのとか見た気がするのですが。
まあこのレベルでは使わないだろうから別にいいのですが。
0048デフォルトの名無しさん
2009/01/25(日) 15:50:130049デフォルトの名無しさん
2009/01/25(日) 16:01:56そのほうがコンパイラが楽だったからですか?
速度の問題とかはありますか?
0050デフォルトの名無しさん
2009/01/25(日) 16:03:500051デフォルトの名無しさん
2009/01/25(日) 16:06:11そう
>速度の問題とかはありますか?
処理がコードを字面どおりに追うならあるかないかの差があったかもしれない
でも今のコンパイラならきっと最適化されて同じになる
0052デフォルトの名無しさん
2009/01/25(日) 19:03:15ポインタのポインタを使えばいいだけの話
全然難しくねえよww
0053デフォルトの名無しさん
2009/01/25(日) 19:11:53int j = 1;
&i = &j;
このコードはどうしてエラーになるのですか?
0054デフォルトの名無しさん
2009/01/25(日) 19:13:310055デフォルトの名無しさん
2009/01/25(日) 19:22:26すげえずれててワロタw
0056デフォルトの名無しさん
2009/01/25(日) 19:25:28&演算子はオペランドへのポインタ値を生み出す。
これは左辺値ではない(代入できない)。
0057デフォルトの名無しさん
2009/01/25(日) 19:32:18このコードはどうしてエラーになるのですか?
と本質的に同じ。
0058デフォルトの名無しさん
2009/01/25(日) 19:52:43なぜエラーにする必要があるんだ?
代入を:=にしたらいいだけだろ。
0059デフォルトの名無しさん
2009/01/25(日) 20:01:10Pascalerは巣に返れ
0060デフォルトの名無しさん
2009/01/26(月) 04:23:400061デフォルトの名無しさん
2009/01/26(月) 04:28:080062デフォルトの名無しさん
2009/01/26(月) 08:35:54C言語のリスト構造について僕は疑問があります。
リスト構造の結果を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個のメモリ部分と、確保した文字列部分のメモリはどうなったのでしょうか?動作が分かる方よろしくお願いします。
0063デフォルトの名無しさん
2009/01/26(月) 08:41:34リークしてます。ええ。
006462
2009/01/26(月) 08:59:01// メモリリーク検出
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
僕もおかしいだろと思って終了した際、メモリリーク検出つけたんですけど、引っかからないんですよね・・・
繋がりがなくなったら、検出されないのかな
0065デフォルトの名無しさん
2009/01/26(月) 09:03:240066デフォルトの名無しさん
2009/01/26(月) 09:26:05ばっちり検出されるよ?
#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;
}
0067デフォルトの名無しさん
2009/01/26(月) 11:25:16ついでに、「簡略」という言葉の意味も調べておくといいよ。
0068デフォルトの名無しさん
2009/01/26(月) 11:25:20まずここからおかしい。
pが指していたリスト構造を開放せずにpに別の場所を指させてしまったら
古いメモリを開放する手段はなくなってしまう。
0069ワカメ
2009/01/26(月) 13:06:07#define AGE "ヌルポ!"
char *p;
p=AGE;
これでできてしまうから、よくわからね。
char *p;
char st[]=AGE;
p=&st;
これのほうがいいのかな?
0070デフォルトの名無しさん
2009/01/26(月) 13:34:16const char str[] = "ヌルポ";
と同じ
それとどっちもpには何の意味もない
もっとポインタと文字列ってか配列について学んでは?
0071デフォルトの名無しさん
2009/01/26(月) 13:42:37>>69
何をしたいのか判らんから、行儀がどうのと言われても判断できんよ。
書き換えが目的なら、前者は言語道断だが。
0072デフォルトの名無しさん
2009/01/26(月) 14:18:34シャア
0073デフォルトの名無しさん
2009/01/26(月) 18:25:57優良なオープンソースのプログラムがあれば教えて下さい。
0074デフォルトの名無しさん
2009/01/26(月) 19:20:58頑張れば理解できるよ!
0075デフォルトの名無しさん
2009/01/26(月) 20:02:41やっぱポインタもちゃんと理解しないとだめかな
0076デフォルトの名無しさん
2009/01/26(月) 20:10:51使えて当然
0077デフォルトの名無しさん
2009/01/26(月) 20:23:26strcpy((ptr+player)->name,'\0');
(ptr+count)->money='\0';
これではエラーになっていまいます。
0078デフォルトの名無しさん
2009/01/26(月) 20:26:170079デフォルトの名無しさん
2009/01/26(月) 20:28:030080デフォルトの名無しさん
2009/01/26(月) 20:29:100081デフォルトの名無しさん
2009/01/26(月) 20:30:04正直、使わない(まともな)プログラムが想像できない。
しかし、皆何故ポインタに拒否反応示すんだ? ものすごくシンプルな概念だと思うんだけど。
「難しい」「難しい」って騒ぐから難しいと思い込んでしまってるだけなんじゃないかなぁ。
008277
2009/01/26(月) 20:40:51printf("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'に普通の文字列をいれると動きます
0083デフォルトの名無しさん
2009/01/26(月) 20:44:46'\0' の代わりに "" とか "\0" とか
0085デフォルトの名無しさん
2009/01/26(月) 20:51:38愚の骨頂。
0086デフォルトの名無しさん
2009/01/26(月) 20:52:13'\0'は整数値、""は文字配列。
0087デフォルトの名無しさん
2009/01/26(月) 20:52:55どうしてそう思うのか理由を述べよ
008877
2009/01/26(月) 20:56:51charなら'\0'も格納できると思ったのですが。
事実、前作った時は格納できましたし。
構造体になるとまた勝手が変わるのですかね。
0089デフォルトの名無しさん
2009/01/26(月) 20:58:26こんなん?
(ptr+player)->name[0]='\0';
0090デフォルトの名無しさん
2009/01/26(月) 20:58:28例えばどこぞのAPIのように、文字列リストを終端させるために必要な場合などはこの限りではない。
0091デフォルトの名無しさん
2009/01/26(月) 20:59:01いいえ、あなたは何か勘違いをしています。
009377
2009/01/26(月) 21:17:57関数から戻ってきたときに要素が削除されたかどうかを確認したいときはどうすればよいのでしょうか?
if((ptr+count-1)->name == "\0"){
こうして、最後の要素がNULLになったかどうかで判断しようとおもったのですが、うまくいきません。
0094デフォルトの名無しさん
2009/01/26(月) 21:19:13strcmp(ptr[count - 1]->name, "")
or
ptr[count - 1]->name[0] == '\0'
0095デフォルトの名無しさん
2009/01/26(月) 21:20:02strcmpもしくは先頭要素と比較
結局何も分かってないじゃん
0096デフォルトの名無しさん
2009/01/26(月) 21:20:090097デフォルトの名無しさん
2009/01/26(月) 21:21:53009877
2009/01/26(月) 21:24:35if((ptr+count-1)->money == '\0'){
これと間違えてました
でも>>94さんのやりかたでやってみたいとおもいます。
0099デフォルトの名無しさん
2009/01/26(月) 21:40:020100デフォルトの名無しさん
2009/01/26(月) 21:42:280101デフォルトの名無しさん
2009/01/26(月) 21:42:33ドットで置き換えればいいと思うよ。
pointer->memberは常に(* pointer).memberだから。
0102デフォルトの名無しさん
2009/01/26(月) 21:45:18さんくす
0103デフォルトの名無しさん
2009/01/26(月) 22:38:13(&struct)->member なんてやったりはしないけど
0104デフォルトの名無しさん
2009/01/26(月) 23:07:43ってよく使われるの?
この前派遣社員のおっさんプログラマが
使ってたんだけど、
「うちのコーディング規約では認められません」
って速攻却下したんだが。。
0105デフォルトの名無しさん
2009/01/26(月) 23:09:29そんなの分からないようなやつがレビューするなよ。
0106デフォルトの名無しさん
2009/01/26(月) 23:14:02一般的に使われるのかどうか
知りたかったんだよ。
うちの会社にはそういう書き方するひといなかったから。。
0107デフォルトの名無しさん
2009/01/26(月) 23:22:310108デフォルトの名無しさん
2009/01/26(月) 23:30:08気に入らないからとか他の書き方するって
#define BEGIN {
と本質的に何が違うの?
0109デフォルトの名無しさん
2009/01/26(月) 23:33:58array[n] でいいだろと。
0110デフォルトの名無しさん
2009/01/26(月) 23:37:23それはポインタ演算の方が高速だと信じ込んでいるロートルがよく書く。
若いのに書いている奴は、入門書か先輩に恵まれなかったのだと思う。
0111デフォルトの名無しさん
2009/01/26(月) 23:45:37同じものにコンパイルされなかったら処理系は規格非準拠になる。
0112デフォルトの名無しさん
2009/01/26(月) 23:49:01この書き方じゃ、古い、最適化のかからなかった時代のコンパイラでも早くならないな。
0113デフォルトの名無しさん
2009/01/27(火) 00:16:470114デフォルトの名無しさん
2009/01/27(火) 00:19:36ポインタには*(p+n)、配列にはarray[n]を使う人は居るよ。
実際、(pがレジスタ割付されない場合)参照のコストが違うんだから。
0115デフォルトの名無しさん
2009/01/27(火) 00:19:55そう書きたくなることもあるが
1要素のアドレスを取るという意味を込めて
&array[n] と書いた方が読みやすいと思われる。
0116デフォルトの名無しさん
2009/01/27(火) 00:20:45何を寝言を言ってるんだ。
*(p+n)とp[n]は言語仕様上等価だ。
違いがあったら大問題。
0117デフォルトの名無しさん
2009/01/27(火) 00:21:46ポインタに対するp[n]と配列に対するvec[n]は違うのだが、わかってる?
0118デフォルトの名無しさん
2009/01/27(火) 00:23:00どう違ってるか言ってみろよ
笑ってやるから
0119デフォルトの名無しさん
2009/01/27(火) 00:24:00今時、よっぽどへぼなコンパイラでもない限り、*(p+n)とp[n]で違うコードを吐くなんてありえない。
0120デフォルトの名無しさん
2009/01/27(火) 00:24:19昔々にC++を学んだ人の中には居るのかもしれない。
初期のSTLのiteratorは、*だけが保証されていて->に対しての保証は無かったらしい。
標準規格が定められるまでのほんの僅かな期間だろうけどね。
0121デフォルトの名無しさん
2009/01/27(火) 00:24:42上で生成されるコードが違うと言っているだろ。
もちろん、そんなのありえないと>>119で否定済みだが。
0122デフォルトの名無しさん
2009/01/27(火) 00:25:09論点はそこではなく、
ポインタpに対してp[n]と*(p+n)は同じ、
配列aに対してa[n]と*(a+n)は同じ
ってことを言ってるんだよ。
0123デフォルトの名無しさん
2009/01/27(火) 00:25:41何ら違わない。
何度も言うが、p[n] は *(p + n) のシンタックスシュガーだ。
pが配列でも例外ではない。
0124デフォルトの名無しさん
2009/01/27(火) 00:26:54お前らは何バカなこと言ってるの?
コンパイラが同等に解釈するなんて、ちゃんと>>114にも書いてあるだろ。
>>114は、『「ポインタ変数に対してのp[n]」と「配列に対してのvec[n]」が違う』と書いてあるんだぞ。
読めるかい?
0125デフォルトの名無しさん
2009/01/27(火) 00:29:08分かってたらわざわざ違う表記にしないよ。
違う表記にしている時点で変に理解している。
0126デフォルトの名無しさん
2009/01/27(火) 00:29:40だから、「常にp[n]と使う。*(p+n)は異端」という流れに対しての反論だろ。
流れが読めないの?
0127デフォルトの名無しさん
2009/01/27(火) 00:30:14反論になってない。
詳しく話せ。
0128デフォルトの名無しさん
2009/01/27(火) 00:30:32>>109-111とかを読んだ上で、論点がどうのと言ってるんだよね?
0129デフォルトの名無しさん
2009/01/27(火) 00:32:320130デフォルトの名無しさん
2009/01/27(火) 00:32:38それが*(p+n)と使う理由になってないのが笑える。
0132デフォルトの名無しさん
2009/01/27(火) 00:34:23もしかして、>>109-111って、配列限定の話かね。
確かにarrayは配列だけど、>>110とかが配列限定の話をしているとは、とても思えないな。
0133デフォルトの名無しさん
2009/01/27(火) 00:34:49配列限定の話な訳無いだろ
0134デフォルトの名無しさん
2009/01/27(火) 00:34:51そんとき、aが配列なのかポインタなのかによって、どちらがより良いコードを出すのか違いがあったのも分かる。
だが、そんなもん過去の話だ。それを集約すると>>110で済む話だが。
0135デフォルトの名無しさん
2009/01/27(火) 00:38:45分かりやすいp[n]の方で書くべき。
プログラムは人間も読むものだということを意識してプログラムする事は
バグの少ないプログラムを書くのに重要だ。
0136デフォルトの名無しさん
2009/01/27(火) 00:41:59参照のコストが違うのを強調するためだろ。
そもそも、
Cで構造体のポインタに対して、後発の言語のように
. によるアクセスではなく
-> という別の演算子を導入したのは何故だね。
文法的には同じ . でもコンパイラは簡単に区別できるのだから
わざわざ導入する必要は無かったのに。
これも間接参照のコストがかかるという点を示すのが理由の一つだとも言われているよ。
昔の計算機は遅かったし、コンパイラの最適化も弱かったからね。
0137デフォルトの名無しさん
2009/01/27(火) 00:42:28*(p+n)よりはp[n]
&p[n]よりはp+nが好き。
0138デフォルトの名無しさん
2009/01/27(火) 00:42:42そんなの強調されても何も嬉しくない。
読みにくくなるだけ。
0139デフォルトの名無しさん
2009/01/27(火) 00:44:14なんでCはC99になってさえ、構造体のポインタのメンバ参照に . が使えないの?
0140デフォルトの名無しさん
2009/01/27(火) 00:44:59俺も使えてもいいとは思うが、使えないのだから仕方が無い。
0141デフォルトの名無しさん
2009/01/27(火) 00:46:410142デフォルトの名無しさん
2009/01/27(火) 00:47:29では何故 *(x).mem という記法があるのに、 x->mem なんてものを導入したの?
0143デフォルトの名無しさん
2009/01/27(火) 00:48:12(*x).mem だろ
こんなもの読み辛いしパースに時間かかるしいい事無いだろ。
0144デフォルトの名無しさん
2009/01/27(火) 00:50:320145デフォルトの名無しさん
2009/01/27(火) 00:50:380146デフォルトの名無しさん
2009/01/27(火) 00:52:30読む時も思考を逆行させないといけないからな。
どうしても仕方が無いもの以外は後置で書きたい。
0147デフォルトの名無しさん
2009/01/27(火) 00:53:57*(p+n)は無いわな。
その点ではp[n]だって全く同じだがね。
関数の仮引数でポインタ受け取って、添え字でアクセスなんてバカもいいとこ。
まあ初心者スレならその方が良いかもしれないけど。
ただ、p[n]は配列(=pは変化しない)に見えるから、pが変化するときは*(p+n)もありかもね。
0148デフォルトの名無しさん
2009/01/27(火) 00:54:04pp**.mem
p**n ←(p*)*n
これもちと辛いかも、パースが。
0149デフォルトの名無しさん
2009/01/27(火) 00:54:58>>142は前者が好きなようです
0150デフォルトの名無しさん
2009/01/27(火) 00:56:37だから、そういう理由があるのに、何故 . という記法を採用しなかったのか。
0151デフォルトの名無しさん
2009/01/27(火) 00:58:400152デフォルトの名無しさん
2009/01/27(火) 00:59:000153デフォルトの名無しさん
2009/01/27(火) 00:59:47そんな考えがあったら [ ] で配列とポインタを同じように扱えるようにしないって。
0154デフォルトの名無しさん
2009/01/27(火) 01:01:080155デフォルトの名無しさん
2009/01/27(火) 01:01:400156デフォルトの名無しさん
2009/01/27(火) 01:01:43えー、どこが。
それこそ、p[n]と*(p+n)を別にすべきってことじゃん。
0157デフォルトの名無しさん
2009/01/27(火) 01:02:21○別にしとけばよかった
0158デフォルトの名無しさん
2009/01/27(火) 01:02:56作り辛くしてでも分かりやすくしたかったんだろう。
0159デフォルトの名無しさん
2009/01/27(火) 01:03:37ということに当時の人が気付かなかった可能性も
0160デフォルトの名無しさん
2009/01/27(火) 01:04:57願わくばうちの会社に>>114が来ませんように
0161デフォルトの名無しさん
2009/01/27(火) 01:05:01そうじゃないと意味が伝わらない。
0162デフォルトの名無しさん
2009/01/27(火) 01:05:380163デフォルトの名無しさん
2009/01/27(火) 01:06:53お前mallocしたことないの?
0164デフォルトの名無しさん
2009/01/27(火) 01:07:33大丈夫。わざわざITドカタになるってわかってるところへ就職を希望する人なんて、
この不景気でもそんなには居ないでしょ。
0165デフォルトの名無しさん
2009/01/27(火) 01:08:150166デフォルトの名無しさん
2009/01/27(火) 01:08:390167デフォルトの名無しさん
2009/01/27(火) 01:10:04理解できなかった事を今更誤摩化そうとしても遅いよ
0168デフォルトの名無しさん
2009/01/27(火) 01:10:32ポインタは p++ したり *p したりするべきものだ、
と言ってるんだろう。
たとえどんな時でも。
ばからしい話だが。
0169デフォルトの名無しさん
2009/01/27(火) 01:10:44おまえ、関数の引数にポインタ渡したことないの?
それとももしかして、1関数300行くらいにして、全部関数内で処理してるの?
0170デフォルトの名無しさん
2009/01/27(火) 01:11:07とかやってもいい?
0171デフォルトの名無しさん
2009/01/27(火) 01:11:330172デフォルトの名無しさん
2009/01/27(火) 01:12:540173デフォルトの名無しさん
2009/01/27(火) 01:13:15>そもそも、ポインタなんだから、増減して使うのが当たり前なのに
がおかしいって、mallocっていう反例を示して指摘してるのに、なにが言いたいの?
0174デフォルトの名無しさん
2009/01/27(火) 01:15:58->は参照先アドレスが実行時に決まるのに比べて、
. はリンク時に決まるってこと。
0175デフォルトの名無しさん
2009/01/27(火) 01:16:07まずいんじゃね?
0176デフォルトの名無しさん
2009/01/27(火) 01:17:52いえそっちではなく、>>114の話です
0177デフォルトの名無しさん
2009/01/27(火) 01:18:41構造体を持つ構造体を、mallocすること考えただけでもそれはありえなくないか?
0178デフォルトの名無しさん
2009/01/27(火) 01:19:34ポインタpの指すアドレスは実行時に決まるのに比べて、
配列arrayのアドレスはリンク時に決まるってこと。
0179デフォルトの名無しさん
2009/01/27(火) 01:19:59インライン最適化されれば配列そのものが使われるかもしれない。
コストを明示したつもりでも、実際コストに差はないかもしれない。
そんなあやふやな意味の無いものを明示する暇があったら
もっと分かりやすく書け。
0180デフォルトの名無しさん
2009/01/27(火) 01:20:42関数内だけで使うローカルな領域をmallocすることなんてそんなに多くないでしょ。
多くは、構造体のメンバとかに置いて、外部とのやり取りに使うためのもの。
だから、後でfreeするための元のアドレスはそのメンバが持っていて
個々の関数ではその値のコピーを使って操作することの方が多いでしょ。
いや、(コピーじゃなくて)直接使うケースが少ないとは言わないけどさ。
で、まあ、確かにローカルで使用するにしても
不定長のバッファなんかは必要ではある。
ただ、この用途は(C++で済まんが)vectorばっか使ってるから
malloc(operator new)することなんか殆ど無いし。
特に、配列として確保したもの(1個のオブジェクトではなく)は
ループを回したりするわけだから、コピーしてレジスタ割付なんかも期待したいところ。
そんな変数を増減するのは、ちっとも不思議じゃなく当たり前の話じゃないかね。
0181デフォルトの名無しさん
2009/01/27(火) 01:20:50簡略化した説明なので、そこまでは勘弁ね
0182デフォルトの名無しさん
2009/01/27(火) 01:22:00それは配列とポインタの違いであって*(p+n)とp[n]の違いじゃないと思うんだが
0183デフォルトの名無しさん
2009/01/27(火) 01:25:51配列(の先頭アドレス)は「定数」だから、コンパイル時に決まる。
それがグローバルかスタックフレームの相対アドレスか構造体内のオフセットかはともかく。
一方、ポインタは「変数」だから、(レジスタ変数にされない限り)メモリを読み出して
その値を得、それにオフセットを加えて参照先を決定する必要がある、ということ。
0184デフォルトの名無しさん
2009/01/27(火) 01:26:49C99ではそうではないとか言い出してみる
0185デフォルトの名無しさん
2009/01/27(火) 01:27:13>>182
>>183
理解できたと思いますが
要するに>>114は何か勘違いしてるってことですか?
0186デフォルトの名無しさん
2009/01/27(火) 01:27:51不思議ではないが当たり前でもないよ
0187デフォルトの名無しさん
2009/01/27(火) 01:29:29で?
0188デフォルトの名無しさん
2009/01/27(火) 01:29:34日本語力の無い俺には>>114をよく読むほど意味がわからなくなってきたw
少なくとも、*(p+n)とp[n]には見た目以外の違いは何も無いよ。
0189デフォルトの名無しさん
2009/01/27(火) 01:31:27つーか普通に関数呼び出しの時にアドレス決まるんじゃないの?
グローバル変数以外
0190デフォルトの名無しさん
2009/01/27(火) 01:32:15増減すること自体は誰も否定してないだろ。
0191174
2009/01/27(火) 01:34:09->は. より間接参照が1回多い分コスト高だってこと。
0192デフォルトの名無しさん
2009/01/27(火) 01:35:54ポインタでアクセスしようが一緒。
0193デフォルトの名無しさん
2009/01/27(火) 01:38:14【初心者お断り】ガチ規格準拠C専用スレ Part133
http://pc11.2ch.net/test/read.cgi/tech/1201153965/
0194デフォルトの名無しさん
2009/01/27(火) 01:40:59何言ってんだ。
後で触れているという点は除くにしても、話の流れ的に
p[n]や*(p+n)として使うくらいなら、pを増減する方が普通ということだろ。
特にわざわざそのためだけに添え字変数を用意するくらいなら。
もちろん、配列として確保したメモリ限定の話な。
0195デフォルトの名無しさん
2009/01/27(火) 01:41:54その点を否定している人は誰もいないと思われます。
0196デフォルトの名無しさん
2009/01/27(火) 01:42:56ね え よ
0197デフォルトの名無しさん
2009/01/27(火) 01:44:04配列とポインタの違いはわかってますよね?
>>196
初心者スレですもんね。
0198デフォルトの名無しさん
2009/01/27(火) 01:45:23もちろんわかってますよ
0199デフォルトの名無しさん
2009/01/27(火) 01:46:55そりゃ (* hoge).なにか
と等価なんだから当たり前だろ・・・・・・・
0200デフォルトの名無しさん
2009/01/27(火) 01:47:35じゃあ>>191の内容はわかってますよね、当然。
0201デフォルトの名無しさん
2009/01/27(火) 01:49:09手に持ったゴミを焼却炉に放り込むときに「燃やす」、
ごみ箱の中身を放り込むときに「焼却する」と言い換えてるようなものだ
0202デフォルトの名無しさん
2009/01/27(火) 01:49:13わかってますよ、自分の発言ですから。
0203デフォルトの名無しさん
2009/01/27(火) 01:52:38コストが違うこともわかってますよね?
それと、p[n] と *(p+n) は全く同じ、ということをあわせて
敢えて違うということを明示するという意図(それに意味があるかはともかく)もわかりませんか?
0204デフォルトの名無しさん
2009/01/27(火) 01:54:38だからそれがバカなこと以外の何物でもないとずっと言ってるんだろうが
0205デフォルトの名無しさん
2009/01/27(火) 01:56:26コーディングした人の好みの問題ですよね、わかります。
0206デフォルトの名無しさん
2009/01/27(火) 01:57:41A. たいていは大きな配列の中をアクセスしてまわるのにポインタを使うほうが、
配列の添字を使うより高速であるが、その反対のプロセッサも存在する
(よくできたコンパイラならどちらの記法を使って書かれたコードにも
良質なコードを生成すべきである)。
CFAQ 20.14
0207デフォルトの名無しさん
2009/01/27(火) 01:58:24単純な増減だけでしかアクセスしないんならそれでもいいかもね。
0208デフォルトの名無しさん
2009/01/27(火) 02:00:59としたとき
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;
のほうが遅いらしいんですがなんでですか?
0209デフォルトの名無しさん
2009/01/27(火) 02:01:41char *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つまででなければ)。
0210デフォルトの名無しさん
2009/01/27(火) 02:01:58統一的で読みやすいコードを書いてほしい
0211デフォルトの名無しさん
2009/01/27(火) 02:03:25条件の後出し乙
0212デフォルトの名無しさん
2009/01/27(火) 02:03:30右側の[ ]の添え字を1ずつ動かしたものは、メモリ上連続しているので、
キャッシュメモリの効果が出やすい。
左側の[ ]を動かすと、メモリのあっちこっちに飛んでアクセスすることになるのだ。
0213デフォルトの名無しさん
2009/01/27(火) 02:04:070214デフォルトの名無しさん
2009/01/27(火) 02:04:19さすがにそのレベルだとどれでも読みやすさに大差ないだろ
ポインタ演算にしたせいで糞読みづらくなるのはもっとさぁ
0215デフォルトの名無しさん
2009/01/27(火) 02:05:23i 消滅させてくれたはずなんだよなぁ、コンパイラさまの力で
ソース出せといわれても困るけど
0216デフォルトの名無しさん
2009/01/27(火) 02:07:05ありがとうございます
説明にくわえ、キャッシュメモリという単語をもとにおおむね分かりました
どうもありがとうございます
0217デフォルトの名無しさん
2009/01/27(火) 02:08:09どう見ても特殊な状況だけを取り出して「普通」ってw
配列の使い方がそんな単純なものだけなわけねーだろ。
0218デフォルトの名無しさん
2009/01/27(火) 02:10:47あれ、>>114の言っていることがわからないって言ってた(>>188)んじゃなかったの?
じゃあ「>>114の意味がわからない」なんて書かないでよ。
せめて「>>114は無意味としか思えない」とかにしてよ。
すげー時間無駄にしたよ。
本当に日本語苦手なんだろうけど
「日本語が苦手なんですけど」と書き出されても
「初心者ですけど」と言って質問する人と同じように応対すべきとは思わないじゃん。
0219デフォルトの名無しさん
2009/01/27(火) 02:12:26俺はそんなこと一言も言ってない
ID出ない板で勝手に特定の発言を同一人物だと思わないこと
0220デフォルトの名無しさん
2009/01/27(火) 02:14:16って思っちゃったんじゃね?
0221デフォルトの名無しさん
2009/01/27(火) 02:15:060222デフォルトの名無しさん
2009/01/27(火) 02:15:46>>188は別人なの?
>>188は
>>>114をよく読むほど意味がわからなくなってきたw
と書いてあるけど。
0223デフォルトの名無しさん
2009/01/27(火) 02:19:50いや、>>114はポインタと配列のコストの違いと言っているのか、
*(p+n)とp[n]のコストの違いと言っているのか、どっちなのかわからなかったのだ。
あと、>>204は俺じゃないよ。
いずれにせよ、ごめんね。
スレも無駄に消費してごめんなさい。
0224デフォルトの名無しさん
2009/01/27(火) 02:23:32しかし常に*(p+n)と書くというのはあまりにも迷惑すぎる
0225デフォルトの名無しさん
2009/01/27(火) 02:23:49まあ張り付き方見てればわかるけど
0226デフォルトの名無しさん
2009/01/27(火) 02:24:23さすがにそんな奴居ないだろ。
0227デフォルトの名無しさん
2009/01/27(火) 02:27:03>>114
0228デフォルトの名無しさん
2009/01/27(火) 02:28:430229デフォルトの名無しさん
2009/01/27(火) 02:30:040230デフォルトの名無しさん
2009/01/27(火) 02:31:30常にでないならその無意味な意図とやらすら成立しないだろう
0231デフォルトの名無しさん
2009/01/27(火) 02:32:280232デフォルトの名無しさん
2009/01/27(火) 02:32:56ポインタと配列が違うことを示すために変えて書いてます!
ってやつが常にそうしないなら逆に大笑いだ
0233デフォルトの名無しさん
2009/01/27(火) 02:33:430234デフォルトの名無しさん
2009/01/27(火) 02:35:320235デフォルトの名無しさん
2009/01/27(火) 02:38:45前後のつながりのわかる文章を書け
0236デフォルトの名無しさん
2009/01/27(火) 02:43:520237デフォルトの名無しさん
2009/01/27(火) 02:44:21プレフィクスでもなんでもつけたほうがまだマシってものだ
0238デフォルトの名無しさん
2009/01/27(火) 02:55:10別の話題に持っていってやろう。
配列として宣言された変数には[]を使い、
ポインタとして宣言された変数には*()を使う、という人はいるはず。
もちろん、それは関数の仮引数に[]を使うというような方法で区別する。
という話題はどうだろう。
http://www.kouno.jp/home/c_faq/c6.html#4
に近い話があるが。
0239デフォルトの名無しさん
2009/01/27(火) 03:02:260240デフォルトの名無しさん
2009/01/27(火) 03:03:11時間かかりすぎる
0241デフォルトの名無しさん
2009/01/27(火) 03:08:06迷惑すぎる。
*()を使って(2文字増やして)得られるものが何一つない。
ちなみに[]と*()は実は記述上完全な同等ではない。
演算子の優先順位が[]のほうが高いからだ。
ポインタと配列を区別したいなどという理由で*()を押し通していると、
(*())とさらに一つ余計な括弧をつけなければならない場面が出てくる。
0242デフォルトの名無しさん
2009/01/27(火) 03:43:42関数内の処理速度に影響があるということ?
配列を渡すと、渡す際のコストは大きくなるけど、関数内の処理は速くなる?
0243デフォルトの名無しさん
2009/01/27(火) 03:47:41それは議論の余地無く完全に間違ってる
0244デフォルトの名無しさん
2009/01/27(火) 04:01:51だが
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]);は警告が出る筈。
(処理系によってはコンパイルが通らない場合がある。)
こういった微妙な相違はあるな。
0245デフォルトの名無しさん
2009/01/27(火) 04:09:02たとえば、
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])のほうを使うけど)
0246デフォルトの名無しさん
2009/01/27(火) 04:10:01C++の例なんかむちゃくちゃ言ってるぞwwwwww
0247デフォルトの名無しさん
2009/01/27(火) 04:39:52極めてアルゴリズム的ななコードはそれが公共的なものである
場合、修正加筆し損なって、破損した場合の影響度を考えると最早書け
ないと思ったほうがいいかもな。
0248デフォルトの名無しさん
2009/01/27(火) 07:23:03混同したくないなら名前を変えりゃいいだけだろ。
そんな汚い表記で迷惑かけるのはやめてくれ。
0249デフォルトの名無しさん
2009/01/27(火) 07:34:430250デフォルトの名無しさん
2009/01/27(火) 10:32:46「混同したくない」ではなく「混同するな」といっているんだが。
たとえそれが糖衣構文とはいってもポインタをあたかも配列のように扱うのはプログラマの意図すべきことではない。
間違ったコードが間違って見えるように、ポインタを配列のように表記せずにはじめから間接参照を使うほうが、
プログラマの意図を反映したコードになる。
配列は、固定長のデータやデータ長が既知であるとき、動的メモリ確保に制限があるとき(マシンの構造上、動的にメモリを確保できない)、
そのほか小手先技の実現のためなどに使えばよい。だからこそ、ポインタと配列は、別の表記をしたほうがよい。
配列は、線形的なデータ構造を作るための安価な複合型
ポインタは、柔軟なデータ構造を作るための安価な複合型
>>汚い表記
どこが汚いのかまったく理解できない。
0251デフォルトの名無しさん
2009/01/27(火) 11:08:540252デフォルトの名無しさん
2009/01/27(火) 11:12:04言いたいことはまぁ判ったから、もう少し判り易い例を提示してくれ。
>245だと何が言いたいのか全く判らん。
0253デフォルトの名無しさん
2009/01/27(火) 11:22:27配列のように連続性に意味のあるデータは [] 使えよっていう話では?
0254デフォルトの名無しさん
2009/01/27(火) 12:20:06宗教の話がしたいなら、ニッポン放送の朝5時から勝手にやっててくれ。
0255デフォルトの名無しさん
2009/01/27(火) 13:41:550[p+n]
と書けばいいよ
0256デフォルトの名無しさん
2009/01/27(火) 14:19:23>たとえそれが糖衣構文とはいってもポインタをあたかも配列のように扱うのはプログラマの意図すべきことではない。
完全に間違っている。
君がどういう印象を持つかにかかわらず、[] は配列を操作する演算子ではなく、ポインタを操作する演算子である。
ポインタに対して [] を作用させるのは言語仕様上まったく正当で、また配列はポインタに成り下がるから、
配列名に対して [] を作用させるのも同じ理由で正当である。
重要なことは、ポインタの指す場所以降の領域がいかなるものであるかということであって、
識別子がポインタであるか配列であるかではないし、それに対してどんな演算子を使用するかでもない。
そこまでして識別子の種類を明示的に区別したいなら、ハンガリー記法でも使うことをお勧めする。
0257デフォルトの名無しさん
2009/01/27(火) 14:27:54borlandC をコマンドラインで使っています。
実行ファイルへプロパティのバージョン情報タブを付けたいのですが、
どのようにしたら良いですか?
0258デフォルトの名無しさん
2009/01/27(火) 14:53:35たぶん配列とポインタで[]の意味が変わると思ってるんじゃないか?
でなかったら
>明らかに、最後のは、配列をポインタに成り下げているから、嫌だ。
なんてセリフ出るはずがない
その例では三つとも全部配列はポインタに成り下がっているのに
0259デフォルトの名無しさん
2009/01/27(火) 15:00:330260デフォルトの名無しさん
2009/01/27(火) 15:04:09傍観する分にはそうでもないよ
0261デフォルトの名無しさん
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病にかかったのかなぁ。
0262デフォルトの名無しさん
2009/01/27(火) 15:59:32添字演算が成立しないのに*(+)はつかっていいのか
バ カ じ ゃ ね え の
0263デフォルトの名無しさん
2009/01/27(火) 16:09:27> そうではなくて、ポインタを配列と認識することに問題があるといっている。
あるだろう。しかし、ポインタに対して [] を使わないというルールではそれは解決しない。
もしあるポインタ識別子を正しくポインタとして認識しているなら、[] を使っても問題ない。
もし誤って配列として認識しているなら、それは結局 [] を使ってしまうことになる。
もう一度問う。敢えて p[n] を押しのけて *(p+n) を使うことにどんな意味があるのか。
ポインタ演算の結果を参照することはシーケンシャルなメモリアクセスを行うことにほかならない。
それに配列名でアクセスしようと、ポインタでアクセスしようと、領域の持つ意味はまったく同じである。
0264デフォルトの名無しさん
2009/01/27(火) 16:14:53C++では、int main() でもおk。引数があるなら、int argc , char *argv[] ってんだ、分かったか?
みたいなw ただの標準”スタイル”だけどなw
0265デフォルトの名無しさん
2009/01/27(火) 16:14:570266デフォルトの名無しさん
2009/01/27(火) 16:17:330267デフォルトの名無しさん
2009/01/27(火) 16:18:47ナシを食べるときは爪楊枝を使いなさい
なぜならリンゴとナシは別のものだからです
ちゃんと区別しなければいけません
これぐらいアホなこと言ってるのに気付いてないのか
0268デフォルトの名無しさん
2009/01/27(火) 16:21:18カレー味のカレーを作ってくれよ?単純だろ?w
0269デフォルトの名無しさん
2009/01/27(火) 16:35:36ついでに。
もし君が、識別子の素性が容易には突き止められないようなコードを書いているなら、
間違いなくそちらのほうが問題である。
自分のコード読解力の低さを棚に上げて無意味なスタイルを押し付ける前に、
あらゆる処理構造を可能な限りシンプルに書くように勤めたほうがよい。
0270デフォルトの名無しさん
2009/01/27(火) 16:36:210271デフォルトの名無しさん
2009/01/27(火) 19:36:330272デフォルトの名無しさん
2009/01/27(火) 19:40:10スレ違いです
0273デフォルトの名無しさん
2009/01/27(火) 19:52:16デバッガで実行中のプロセスにアタッチして逆アセンブルリストを眺める。
0274デフォルトの名無しさん
2009/01/27(火) 21:27:29軽く300行を越えている関数がありますが、普通ですか?
0275デフォルトの名無しさん
2009/01/27(火) 21:28:310276デフォルトの名無しさん
2009/01/27(火) 21:34:41OSSアプリ的には普通。
0277デフォルトの名無しさん
2009/01/27(火) 21:43:58#include<iostream>
using namespace std;
{
int val;
cin >> val;
cout << val << endl;
return 0;
}
こんなかんじでエラーメッセージは
cin.c:6: error: expected unqualified-id before '{' token
0278デフォルトの名無しさん
2009/01/27(火) 21:49:12int main(void)
でも追加してみるとか
0279デフォルトの名無しさん
2009/01/27(火) 22:32:260280デフォルトの名無しさん
2009/01/27(火) 22:35:320281デフォルトの名無しさん
2009/01/28(水) 01:33:431、式は必ず評価値を持つのでしょうか?
2、関数呼び出しは、値を返す時だけ式なのでしょうか?
それとも戻り値の無い関数の呼び出しも式なのでしょうか?
0282デフォルトの名無しさん
2009/01/28(水) 04:06:37これネタだよな?
突っ込み所ありすぎてワロタw
0283デフォルトの名無しさん
2009/01/28(水) 11:11:421、ない場合もある
2、値がなくても式は式
0284デフォルトの名無しさん
2009/01/28(水) 12:48:59けど理由がわかりません。
int main(void)
{
char *p = (char *)0x5000000;
memset(p, 0, 0x10000000);
return 0;
}
0285デフォルトの名無しさん
2009/01/28(水) 12:55:180286デフォルトの名無しさん
2009/01/28(水) 12:56:01素直にmalloc()使います。
0287デフォルトの名無しさん
2009/01/28(水) 13:00:12memset(p,0x10000000,0);
の間違いだったんじゃないのか?
0288デフォルトの名無しさん
2009/01/28(水) 14:03:29ワロタw
0289デフォルトの名無しさん
2009/01/28(水) 14:47:15どうしてだろ・・・助けてください
//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;
}
0290デフォルトの名無しさん
2009/01/28(水) 14:52:00まずは「2進数の0」と入力すると結果が48になるバグを直すんだ。
0291デフォルトの名無しさん
2009/01/28(水) 14:56:17hairetuが文字列なのに
hairetu[i]を文字から数値に変換してない
0292デフォルトの名無しさん
2009/01/28(水) 15:06:43なるほど!!
ASCIIコード表ながめてもう少し考えてみたいと思います
助かりました!!
0293デフォルトの名無しさん
2009/01/28(水) 15:07:07精神を損傷させかねない、実は非常に罪作りな行為だよ。
聞いた話にすぎないが、メンヘル自殺者のトップレベルに
常にランクインする職業は、「校正」らしい。
おそらくプログラム関係だったら「テスト作業」関係者も
ランクインしてるんじゃないかと...
0294デフォルトの名無しさん
2009/01/28(水) 15:07:43>>290-291
です
0295デフォルトの名無しさん
2009/01/28(水) 15:14:10コーディングやバグフィックスは寧ろ楽しい。
一番嫌なのは人に仕様を聞いたりしなきゃならない作業。
コミュニケーションがなくなればマは最高だとおもう。
0296デフォルトの名無しさん
2009/01/28(水) 15:34:10(余りにも深〜〜い)ギャップについて
0297デフォルトの名無しさん
2009/01/28(水) 15:39:09「楽しい」と感じること自体に大きな罠があるような....
0298デフォルトの名無しさん
2009/01/28(水) 17:21:50float型(32ビット)の変数から10進での小数点以下1桁、小数点以上最大3桁の計4桁を
桁ごとに切り分けるにはどのように記述したらいいでしょうか?
因みに特に使えそうな関数は用意されていなくANSI Cの範囲で記述する必要があります
0299デフォルトの名無しさん
2009/01/28(水) 17:32:32マイコンのアーキテクチャがわからんけど
10倍して固定小数点の整数型にして扱うってのはだめかね?
0300デフォルトの名無しさん
2009/01/28(水) 17:32:360301デフォルトの名無しさん
2009/01/28(水) 17:56:37void 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]);
}
}
引数の数が合わないらしいんですけど
どこをどう直せばいいのでしょうか?
0302デフォルトの名無しさん
2009/01/28(水) 18:04:58void outputdata(void) → void outputdata(int* data)
0303デフォルトの名無しさん
2009/01/28(水) 18:10:00int型に代入したら、小数点以下が切り捨てられる。あとは
0305デフォルトの名無しさん
2009/01/28(水) 18:18:51sprintf(str, "%5.1f", floatValue)
0306デフォルトの名無しさん
2009/01/28(水) 18:44:29int 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))は
どういう意味なんでしょうか?
0307デフォルトの名無しさん
2009/01/28(水) 18:46:320308デフォルトの名無しさん
2009/01/28(水) 18:48:35よく見かけはするけど。
0309デフォルトの名無しさん
2009/01/28(水) 18:51:10と刷り込まれてるのか違和感は感じないな
0310306
2009/01/28(水) 19:06:170なら素数ってことですね
ありがとうございました
0311デフォルトの名無しさん
2009/01/28(水) 19:07:360312306
2009/01/28(水) 19:19:19二番目のループは割り切れる数字があるか探しているのか
ありがとうございます!!!
0313デフォルトの名無しさん
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]);
}
}
0314デフォルトの名無しさん
2009/01/28(水) 19:55:01エラーメッセージくらい読めよ。
0315デフォルトの名無しさん
2009/01/28(水) 19:58:34Cに真偽値はありません
0316デフォルトの名無しさん
2009/01/28(水) 19:59:45なんでお前はそこまで頭が悪いの?
0317デフォルトの名無しさん
2009/01/28(水) 20:01:25とりあえずどういうプログラムにしたいか教えてくれ
0318デフォルトの名無しさん
2009/01/28(水) 20:01:59そうですか。
で、何か用?
0319デフォルトの名無しさん
2009/01/28(水) 20:04:09値の概念の話であって
真偽型の話じゃないぞ
0320デフォルトの名無しさん
2009/01/28(水) 20:05:200321デフォルトの名無しさん
2009/01/28(水) 20:09:06■ int n;
■に出来るだけ多くの文字を入れよ。ただし、
・全体として正しいnの宣言でなければならない。
・意味の変化を与えないものを入れたり、繰り返したりしてはならない
register const volatile unsigned long long int n;
で合ってますかね?
0322ちょっと聞きたいんだけど辞書君
2009/01/28(水) 20:10:480323デフォルトの名無しさん
2009/01/28(水) 20:14:13ちょっと考えてみる限りは、標準の範囲内ではそんなもんだと思う
>>322
stdlib.h
0324デフォルトの名無しさん
2009/01/28(水) 20:15:45あと意味が無いものがアウトなら long int と long は同じだな
0325デフォルトの名無しさん
2009/01/28(水) 20:16:10malloc.hかstdlib.hじゃないの
0326デフォルトの名無しさん
2009/01/28(水) 20:16:510327デフォルトの名無しさん
2009/01/28(水) 20:17:13long long はC99 標準
int は略せない
0328デフォルトの名無しさん
2009/01/28(水) 20:17:21int=shortのコンパイラもある
0329デフォルトの名無しさん
2009/01/28(水) 20:18:20お前は何を言ってるんだ
0330デフォルトの名無しさん
2009/01/28(水) 20:19:00そうなのかごめんね
>>328
そういうことじゃないよ
0331デフォルトの名無しさん
2009/01/28(水) 20:20:190332デフォルトの名無しさん
2009/01/28(水) 20:22:080333デフォルトの名無しさん
2009/01/28(水) 20:22:34C++的なやつはそうだね。
メッセージングとか言っているやつだとまた違う実装もあり得る。
0334デフォルトの名無しさん
2009/01/28(水) 20:25:41多重継承するとオフセットとか効いてくるけど。
0335デフォルトの名無しさん
2009/01/28(水) 20:48:19>inputdata(data);
>outputdata(data);
を
inputdata(data, numData);
outputdata(data, numData);
にする。
0336デフォルトの名無しさん
2009/01/28(水) 20:56:160337デフォルトの名無しさん
2009/01/28(水) 20:58:48その理論だと真偽値以外のものに!の件が理解できなくなるんだけど、
何ならおk?
0338デフォルトの名無しさん
2009/01/28(水) 20:59:080339デフォルトの名無しさん
2009/01/28(水) 20:59:450340デフォルトの名無しさん
2009/01/28(水) 21:03:12日本語でおk
真偽を意味している値を真偽値と呼んでいるだけ。
比較の結果だとか isupper の戻り値だとか
そういうのを入れた変数とかそういうもの。
0341デフォルトの名無しさん
2009/01/28(水) 21:07:020342デフォルトの名無しさん
2009/01/28(水) 21:08:050344デフォルトの名無しさん
2009/01/28(水) 21:08:32くだり、と読んで。
てことは、具体例として、ヌルポインタかどうかの比較に!は気持ち悪いと?
0345デフォルトの名無しさん
2009/01/28(水) 21:09:27C言語のスレで最近の言語がどうとか、頭大丈夫?
0346デフォルトの名無しさん
2009/01/28(水) 21:12:12条件式には真偽値以外使うべきではないという
プログラミングスタイルが
そういう言語が作成される前に確立したからだよ
0347デフォルトの名無しさん
2009/01/28(水) 21:15:110348デフォルトの名無しさん
2009/01/28(水) 21:17:191+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();
}
お願いします
0349デフォルトの名無しさん
2009/01/28(水) 21:20:000350デフォルトの名無しさん
2009/01/28(水) 21:21:520351デフォルトの名無しさん
2009/01/28(水) 21:22:240352デフォルトの名無しさん
2009/01/28(水) 21:29:430353デフォルトの名無しさん
2009/01/28(水) 21:30:460354デフォルトの名無しさん
2009/01/28(水) 21:30:550355デフォルトの名無しさん
2009/01/28(水) 22:08:490356デフォルトの名無しさん
2009/01/28(水) 22:45:47それが常識だと思い込んだり他人を批判しだしたりすると問題だけおで
0357デフォルトの名無しさん
2009/01/28(水) 22:47:340358デフォルトの名無しさん
2009/01/28(水) 22:48:24if((hoge == TRUE) == TRUE)となぜ書かないのだろう
どうしてif(((hoge == TRUE) == TRUE) == TRUE)と書かないのだろう
0359デフォルトの名無しさん
2009/01/28(水) 22:49:18今のところそれを主張している人はいないように思うんだけど
0360デフォルトの名無しさん
2009/01/28(水) 22:51:26Cじゃなくても、そんな書き方しないだろ。
0361デフォルトの名無しさん
2009/01/28(水) 23:09:030362デフォルトの名無しさん
2009/01/28(水) 23:27:100363デフォルトの名無しさん
2009/01/28(水) 23:37:180364デフォルトの名無しさん
2009/01/28(水) 23:39:100365デフォルトの名無しさん
2009/01/28(水) 23:41:02嫌いだが
0366デフォルトの名無しさん
2009/01/28(水) 23:49:15TRUEは必ずしもそうとは限らないからな
どっちにしろキモいとは思うが
0367デフォルトの名無しさん
2009/01/29(木) 00:03:16一般的には意図した結果が得られる限りにおいてもっとも短く記述できるのがベスト
0368デフォルトの名無しさん
2009/01/29(木) 00:05:130369デフォルトの名無しさん
2009/01/29(木) 00:06:360370デフォルトの名無しさん
2009/01/29(木) 00:11:27if (success) ・・・ なら、素直に成功してるって読める。
if (success != false) ・・・ とか、やめて欲しい。
今日、↓みたいなコードを見たけど、
len = strlen(s);
if (len) ・・・
こういうのはふつーに
if (len > 0) ・・・ と書いてほしい。
0371デフォルトの名無しさん
2009/01/29(木) 00:15:330372デフォルトの名無しさん
2009/01/29(木) 00:34:20>>370で、if (len)よりはif (len > 0)がいいというのと同じように、
俺はif (!(i % j))よりif ((i % j) != 0)がいいと思う。
0373デフォルトの名無しさん
2009/01/29(木) 00:37:18少なくともこのスレでやるような話じゃない
0374デフォルトの名無しさん
2009/01/29(木) 00:40:560375デフォルトの名無しさん
2009/01/29(木) 00:42:190376デフォルトの名無しさん
2009/01/29(木) 00:53:360377デフォルトの名無しさん
2009/01/29(木) 01:49:28逆引きみたいな解説書ないですか?
つまり、たとえば
2ちゃん専用ブラウザのソースが全部載っていて、
この命令文はどういう命令文で、この部分はあとのアノ部分に
つながるわけで、、、とかいうことが全部解説してあるもの。
そして初心者が見ても理解できる内容に仕上がっているものです。
0378デフォルトの名無しさん
2009/01/29(木) 02:07:16あったら疑え
0379デフォルトの名無しさん
2009/01/29(木) 02:07:520380デフォルトの名無しさん
2009/01/29(木) 02:47:20予算より随分安かったから2物件買った
0381デフォルトの名無しさん
2009/01/29(木) 04:35:07http://wisdom.sakura.ne.jp/system/winapi/media/mm6.html
のコードを
g++ wave.cpp -lwinmm -lgdi32
でコンパイルは通る&音出るけど,動作が停止する.なぜ?
こちらvista bussiness & g++ 3.4.4
0382デフォルトの名無しさん
2009/01/29(木) 12:01:53どんな方法なのでしょうか?
boost.PPも使えるとか
0383デフォルトの名無しさん
2009/01/29(木) 12:42:13cygwinのdefaultのg=++からMinGWのg++に変更したらあっさり解決しました.
Vistaが原因なのかcygwinが原因なのかはわからずじまい.
0384デフォルトの名無しさん
2009/01/29(木) 14:02:300385デフォルトの名無しさん
2009/01/29(木) 14:04:160386デフォルトの名無しさん
2009/01/29(木) 14:05:11誘導してくれ
0387デフォルトの名無しさん
2009/01/29(木) 14:06:58大学生協の書籍売り場
0388デフォルトの名無しさん
2009/01/29(木) 14:54:01Borland C++で、exeファイルにバージョン情報を入れたいんですが、
入れ方を教えてください。
0389デフォルトの名無しさん
2009/01/29(木) 15:07:25"VERSION XXX"
みたいな内容を含む変数を挿入する。
0390デフォルトの名無しさん
2009/01/29(木) 15:33:31入門者が使う必要はありません
>>388
入門者が入れる必要はありません
0391デフォルトの名無しさん
2009/01/29(木) 15:49:39初心者はやらなくても許されるかも知れないが
0392デフォルトの名無しさん
2009/01/29(木) 16:56:190393デフォルトの名無しさん
2009/01/29(木) 19:27:500394デフォルトの名無しさん
2009/01/29(木) 19:35:15なら俺に聞け
入門篇
0395デフォルトの名無しさん
2009/01/29(木) 19:39:22必要ない。
CにはCの流儀というものがある。クラスを使いたいならC++を使えばいい。
実行ファイルの埋め込み情報はファイルシステムの問題であってC言語とまったく関係ない。
0396デフォルトの名無しさん
2009/01/29(木) 19:45:550397デフォルトの名無しさん
2009/01/29(木) 20:04:150398デフォルトの名無しさん
2009/01/29(木) 20:22:22実行イメージのフォーマットの問題かも知れないし
>>389 のような埋め込み方しか出来ないかも知れない。
いずれにしろスレ違い。
0399デフォルトの名無しさん
2009/01/29(木) 20:22:56?
0400デフォルトの名無しさん
2009/01/29(木) 20:51:11ggrks
それでもわからないならwinver
0401デフォルトの名無しさん
2009/01/29(木) 21:10:180402デフォルトの名無しさん
2009/01/29(木) 21:11:04>>397
>>397
0403デフォルトの名無しさん
2009/01/29(木) 21:14:08回答者
わからなければ
ググレカス
0404デフォルトの名無しさん
2009/01/29(木) 21:23:21英語でいえば
ググルは友達
0405デフォルトの名無しさん
2009/01/29(木) 21:24:590406デフォルトの名無しさん
2009/01/29(木) 22:25:33sscanf(line,"%d,%d,%d,%d,%d,%d",&x.a, &x.b, &y.a, &y.b);
で構造体のx.a,x.b.y.a,y.bに整数を入れたいんですがうまくいきません
どこか間違ってますか?
0407デフォルトの名無しさん
2009/01/29(木) 22:26:37よろしくおねがいします
0408デフォルトの名無しさん
2009/01/29(木) 22:33:060409デフォルトの名無しさん
2009/01/29(木) 22:33:150410デフォルトの名無しさん
2009/01/30(金) 00:07:16・次の3つは同じなのです
&str[n]
pstr + n
&pstr[n]
と書いてありました。真ん中と下が同じなのは解ります
が、どうして上も同じなのですか?
0411デフォルトの名無しさん
2009/01/30(金) 00:12:14strとpstrがどう宣言されてるか見ないと分からない。
0412デフォルトの名無しさん
2009/01/30(金) 00:16:56char *pstr = str;
ならそうだろうね
0413デフォルトの名無しさん
2009/01/30(金) 00:26:320414デフォルトの名無しさん
2009/01/30(金) 00:32:130415デフォルトの名無しさん
2009/01/30(金) 00:32:34pstrは恐らく配列で宣言されたものと思われます。
strも配列で宣言されたことを前提かと・・・ん〜
唐突に次の3つは同じものと書かれていたので混乱しています;
>>412
ご解答ありがとうございます。
0416410
2009/01/30(金) 00:47:44char str[hoge];
char *pstr = str;
のように宣言されていなければ
同じではないという解釈で大丈夫ですか?
どう宣言されたかも書かれていないので
それ以外思い浮かばないのですが・・・
0417デフォルトの名無しさん
2009/01/30(金) 01:07:00char str[hoge];
char *pstr = str;
を意図しているようには見えるけどね。
0418デフォルトの名無しさん
2009/01/30(金) 01:12:170419デフォルトの名無しさん
2009/01/30(金) 01:17:55言われてみると、確かにそれを意図しているように見えますね
それなら納得できます
ありがとうございました
0420デフォルトの名無しさん
2009/01/30(金) 02:21:48printf("氏名を入力: ");
gets(name);
printf("電話番号を入力: ");
gets(tel);
}
これを実行すると
氏名を入力: 電話番号を入力:
↑のようになってしまって、後ろのgets()一回しか実行されなくて困っています。
氏名を入力:
電話番号を入力:
というように二回gets()を実行するにはどうすればよいのでしょうか。
0421420
2009/01/30(金) 02:38:15「scanf で呼ばれた直後に gets を呼ぶと入力ストリームの先頭に改行文字が残っているため gets は空の文字列を返してしまう」
ということらしいですが・・・。
これを書きながらいろいろやってる内に一応目的の動作はするようになったのですが、
下のようなやり方は、果たしてよいものなのでしょうか?
void fil2a(char *name, char *tel) {
printf("氏名を入力: ");
gets(name);
gets(name);
printf("電話番号を入力: ");
gets(tel);
}
0422デフォルトの名無しさん
2009/01/30(金) 02:44:55何が良くないかというと、getsを使うことが良くない
0423デフォルトの名無しさん
2009/01/30(金) 02:46:07fil2a()が呼び出された時点でストリームに改行が残っていないと期待通りに動かないのでは?
他の場面でfil2a()を呼び出すときも、それを忘れないようにしないとね。まあgets()使わないのが望ましいけど。
0424デフォルトの名無しさん
2009/01/30(金) 02:47:09warning: the `gets' function is dangerous and should not be used.
0425デフォルトの名無しさん
2009/01/30(金) 02:48:39数学板の統計スレ行け。
あっちにいる。
0426420
2009/01/30(金) 03:12:37ここまで危険視されているとは、まさにgets()恐るべしといったところです。
練習もかねて、scanf()関数で文字列の読み取りを行うようにしてみます。
0427デフォルトの名無しさん
2009/01/30(金) 06:25:07ファイルサイズを小さい順に並び変えたいのですが、その場合ってどうしたらいいんですか。
普通にqsortとか使っていいんですか。
0428デフォルトの名無しさん
2009/01/30(金) 07:36:56遠慮なく使ってやってください。
>>426
scanf()でもいいけれど、fgets()してsscanf()を使うのが常套手段だから慣れておくといいよ。
0429デフォルトの名無しさん
2009/01/30(金) 12:59:34俺もあれ使ってるけど、最初のうち物凄い懇切丁寧で分かりやすいのに
ポインタあたりから突然ソース丸投げ、説明端折りまくりでわけ分からなくなるよなw
一番大事な部分なのにあの説明の少なさは酷い
ポインタで躓く人が多いって書いてるのにこの本が一番分かりづらい
0430デフォルトの名無しさん
2009/01/30(金) 13:28:27実は作者もポインタをよく理解していないという事情が…あるのかもね!
0431デフォルトの名無しさん
2009/01/30(金) 13:45:240432デフォルトの名無しさん
2009/01/30(金) 14:39:02こんちは
C言語、「一般的なレベルの専門学生」っていうと、
どの辺までできるもんだと想像しますか?
0433デフォルトの名無しさん
2009/01/30(金) 14:42:300434デフォルトの名無しさん
2009/01/30(金) 14:50:120435デフォルトの名無しさん
2009/01/30(金) 16:25:57人対人のオセロゲーム(コンソールで十分。ネットワーク越しの対戦が可能ならさらによい)
ぐらいはできるようになってるんじゃないの、とおもう。
0436デフォルトの名無しさん
2009/01/30(金) 19:06:37scanfにポインタでない実引数を渡す
0437デフォルトの名無しさん
2009/01/30(金) 20:25:53そんなの学校いかなくても自習だけでできるよ
0438デフォルトの名無しさん
2009/01/30(金) 20:26:15ありがとうございます
私はよくわからないんですが、
「プロンプトでの引数の渡し方、ファイルへの書き出し、
バイナリファイルの入出力、構造体、マクロ、共用体と列挙体、
、複数ファイルのプログラム、メモリ管理、」
はどの辺になりますか?
専門生としては初歩でも知ってる感じでしょうか?
0439デフォルトの名無しさん
2009/01/30(金) 21:02:59学校なんてピンキリだろ。
何にも出来ないまま卒業するやつだっているし。
質問がバカだって言ってんだよ。
0440デフォルトの名無しさん
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
どうしてエラーになるのでしょうか。
またどうすればエラーを解決できますか。
0441デフォルトの名無しさん
2009/01/30(金) 21:07:56そんなことも全部ひっくるめたイメージってことの前提で
聞いているつもりでつ
0442デフォルトの名無しさん
2009/01/30(金) 21:20:56出来のいい学生なら、入学前から出来る。
ダメな学校なら一年掛けて教えるし、
ダメな学生なら、卒業してもそれが出来ない。
0443デフォルトの名無しさん
2009/01/30(金) 21:25:01カリキュラムには含まれているだろうが
半分以上の卒業生は分かっていない
そんな感じ
高校卒業してるからといっても
英作文できるやつのほうが少数でしょ
中学・高校で6年もやってるのにね
0444デフォルトの名無しさん
2009/01/30(金) 21:31:19ありがとうございます
あれは臭いを嗅げる程度の入門書の目次からの抜粋なのですが、
はじめがきに
「これだけ知っていれば、C言語でプログラムが書けます、
と言えるだけの必要最低限の基礎知識に絞って解説してあります」
って書いてありました。
0445デフォルトの名無しさん
2009/01/30(金) 21:33:010446デフォルトの名無しさん
2009/01/30(金) 21:41:30専門学校に限らずダメ学校の生徒は技術者にならない場合が多いし、
何処の学校でもダメな学生は技術者にならないだろ。
考えていることがムダ。
0447デフォルトの名無しさん
2009/01/30(金) 22:37:20中身読んでないけど、構造体の定義のあるヘッダをインクルードし忘れてるんだろう
0448デフォルトの名無しさん
2009/01/30(金) 22:52:23typedef struct LIST {
int data;
LIST* prev;
LIST* next;
} list;
0449デフォルトの名無しさん
2009/01/30(金) 22:55:500450デフォルトの名無しさん
2009/01/30(金) 22:59:46int data;
struct LIST* prev;
struct LIST* next;
} list;
0451デフォルトの名無しさん
2009/01/30(金) 23:01:21struct LIST{
int data;
list* prev;
list* next;
};
0452まりも
2009/01/30(金) 23:25:49普通に、その配列だけで、できてしまうけど、2次元配列をわざわざ間接参照
*(point+[x*y]+y) で参照させるのが良くわからない。
0453デフォルトの名無しさん
2009/01/30(金) 23:28:040454デフォルトの名無しさん
2009/01/30(金) 23:31:510455デフォルトの名無しさん
2009/01/30(金) 23:35:000456デフォルトの名無しさん
2009/01/31(土) 00:13:000457デフォルトの名無しさん
2009/01/31(土) 00:21:564GBのファイルに fopen関数 ab+ でファイルオープンして
fwrite関数で追加書き込みできなくて困ってます。
fwrite関数で4GB以上のファイルって扱えますか?
4GB以上のファイルにライトした場合、
fwriteの戻り値もエラーにならないのですが?
0458デフォルトの名無しさん
2009/01/31(土) 00:31:470459デフォルトの名無しさん
2009/01/31(土) 00:43:09CreateFileで4G以上OK?
0460デフォルトの名無しさん
2009/01/31(土) 00:56:35引数が明らかに 4GB 以上に対応しているから
大丈夫なんでない?
0461デフォルトの名無しさん
2009/01/31(土) 00:59:22もちろん、そんなことありえないので、CreateFileは4GB越えも扱える。
0462デフォルトの名無しさん
2009/01/31(土) 02:50:15ちょっと聞きたいんだが、学校でないと学べないことって何がある?
0463デフォルトの名無しさん
2009/01/31(土) 03:06:42"a+"じゃなくて普通に"r+"で開いて
末尾に_lseeki64を使ってSEEKしてから書き込めば大丈夫かもな。
Win32のファイルには"追記モード"は無くて、ライブラリが独自に末尾にseekして書き込んでるから
その部分で4Gを超えられないんだろう。
0464デフォルトの名無しさん
2009/01/31(土) 03:08:16普通のfread等で充分可能だから。
もちろん、stat等でのファイルサイズはビット数が足りないけどね。
0465デフォルトの名無しさん
2009/01/31(土) 10:08:35小数点第一を.0じゃなく、ちゃんと入力した数字にあった小数点を出したい
0466デフォルトの名無しさん
2009/01/31(土) 10:10:23入力はそのまま文字列として保存しておけばよろしかろ。
0467デフォルトの名無しさん
2009/01/31(土) 10:27:19int suuji;
scanf("%f", &suuji);
printf("%f\n", suuji);
こんなことしてるとか?
0468デフォルトの名無しさん
2009/01/31(土) 10:28:33二重に間違ったコードを書くなよ。まともに動きさえしないじゃないか。
0469デフォルトの名無しさん
2009/01/31(土) 10:30:010470デフォルトの名無しさん
2009/01/31(土) 10:31:34恐らく、想定しているだろう間違いにはならないぞ。
0471デフォルトの名無しさん
2009/01/31(土) 10:32:15うわああああああああああああいあああ
0472デフォルトの名無しさん
2009/01/31(土) 10:37:420473デフォルトの名無しさん
2009/01/31(土) 10:38:07>>467は君に「想定しているだろう」と想像させるだけの意味は持っているってことだよね。
>>467に提示した意義はそれで達成されるんだけど。
0474デフォルトの名無しさん
2009/01/31(土) 10:38:500475デフォルトの名無しさん
2009/01/31(土) 10:39:260476デフォルトの名無しさん
2009/01/31(土) 10:40:420477デフォルトの名無しさん
2009/01/31(土) 10:42:580478デフォルトの名無しさん
2009/01/31(土) 13:09:410479デフォルトの名無しさん
2009/01/31(土) 13:11:140480デフォルトの名無しさん
2009/01/31(土) 13:12:33長年の疑問なんだけどなんでこれで奇数を判定するのか原理を教えてくれろ
0481デフォルトの名無しさん
2009/01/31(土) 13:14:32%は前者を後者で割った余りを求める演算子。
0482デフォルトの名無しさん
2009/01/31(土) 13:14:41なんで長年の疑問になるのかが分からないや
0483デフォルトの名無しさん
2009/01/31(土) 13:15:050484デフォルトの名無しさん
2009/01/31(土) 13:17:44んじゃ、2で割り切れたら偶数、そうでなきゃ奇数って判定にしてみては?
0485デフォルトの名無しさん
2009/01/31(土) 13:19:290486デフォルトの名無しさん
2009/01/31(土) 13:22:070487デフォルトの名無しさん
2009/01/31(土) 13:26:282歳の時に疑問に思って12歳になって質問してるのかもしれないじゃないの。
0488デフォルトの名無しさん
2009/01/31(土) 13:27:12すいませんこうでした
0489デフォルトの名無しさん
2009/01/31(土) 13:29:15式の評価や計算式の結果が0か否かで if文以下が実行されるから。
0490デフォルトの名無しさん
2009/01/31(土) 13:29:47奇数なら割った余りが1で真、偶数なら0で偽になる
つまり、奇数を判定できる
0491デフォルトの名無しさん
2009/01/31(土) 13:29:560492デフォルトの名無しさん
2009/01/31(土) 13:32:33それは嘘だろ。
0493デフォルトの名無しさん
2009/01/31(土) 13:33:41なんで?最終的には、何かしら数値が扱われている仕組みがあるが
真だった場合、1以外の値が返ってくる環境があるなら、教えてくれ。
とりあえずここ、C言語に関してだが。
0494デフォルトの名無しさん
2009/01/31(土) 13:34:200495デフォルトの名無しさん
2009/01/31(土) 13:34:490496デフォルトの名無しさん
2009/01/31(土) 13:35:20それじゃあ、「真だったら1、偽だったら0が返ってくる」式の例を教えてよ。
0497デフォルトの名無しさん
2009/01/31(土) 13:36:15「式の評価」って何の事をいってるの?
比較演算子の結果という意味?
0498デフォルトの名無しさん
2009/01/31(土) 13:37:04int 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だが?
嘘とか言う前に、確認してから意見しろよ、青二才。
0499デフォルトの名無しさん
2009/01/31(土) 13:39:22Cで式というのががなんのことを指すのか確認したほうがいいよ
0500デフォルトの名無しさん
2009/01/31(土) 13:40:21帰って<日本語でおk
>>495
評価の意味が分かってないだろ?
>>496
だからお前は確認したのかよ?例えば変数aとbがあって、a==bが成立するとき
if(a==b)以下の文が実行されるが、単純に if(a) という形にして、aに0か0以外を入れてみたか?
しかし、比較演算子による評価では、真のときは1が返ってきているんだが?
>>497
分かっているのにしらばっくれるその態度、きめぇ。引きこもり低学歴だろ?w
0501デフォルトの名無しさん
2009/01/31(土) 13:40:320502デフォルトの名無しさん
2009/01/31(土) 13:43:11>>490 正解!
>>491 馬鹿w
0503デフォルトの名無しさん
2009/01/31(土) 13:46:23ねーよwwwww
0504デフォルトの名無しさん
2009/01/31(土) 13:47:44そこにも比較演算子で == , && などが使える。そして、その評価式自信が返している値は
真なら1、偽なら0なんだが。とにかく、真なら0以外という考え方もあるけど、
他の言語においては、bool型というのも存在し、それはTRUEかFALSEという扱いではあるが
結局のところ、0か否かでもあるが、1か0が扱われているわけだ。その程度のことも知らないで
嘘だの言える奴の気が知れない。どんだけ思い上がっている、視野の狭いガキだよ?
あっ、おっさんか?だとしたら、視野の狭い世界観しかもてなくて、この世を去るんだね。
いかに自分の存在がちっぽけだったか、気づくのは死ぬ直前かもな。あぁ、これで俺の人生は終わる。
俺の人生、なんだったんだろ?比較演算子による真偽の結果すら、理解せずにこの世を去るのか・・・
まぁ、この世に様々人がいて、プログラミングすらしない人はいくらでもいますよ?
ほら、もっと他の様々な人を見てごらん?生きてるだけで、働かなくてもお金を得る人もいますよ?
そう、金のなる財産を持てば、こんな詰らない議論で争うこともないんだよ?
金持ち喧嘩せずって言うでしょ?詰らないことを気にしていると、すぐに禿ますよ?
あっ、もう既に禿ちゃったか?
0505デフォルトの名無しさん
2009/01/31(土) 13:50:03>>498の(a==b)の部分に何が表示されている?あんたがどう思うかじゃないんだよ。
計算機が結果を出しているんだが?w
それじゃ、あんたのところじゃ、真だったら0以外の気まぐれな値が返ってくるんだぁ
へぇ〜すげぇ〜、どんな環境?もし良かったら、その変な時代遅れのへちょい
マシンを教えてくれない?俺の通っていた大学でも、そんなものはなかったよ?
あっ、俺大学生だったのは10年も前の話だけどw
あの大学、すごかったからなぁ・・・今じゃあのときの、何千倍もの処理能力を持った
コンピュータを持っているだろうな・・・なんせ、コンピュータを専用に扱う建物があったし。
0506デフォルトの名無しさん
2009/01/31(土) 13:52:491+3;
0507デフォルトの名無しさん
2009/01/31(土) 13:55:23勝手な造語をどうしても使いたいのなら言葉の定義をしてくれ
「式の評価」の結果という表現だけではさっぱり分からん
例として次の場合
a ? "not zero" : "zero";
a という式の評価結果はいかなる場合においてもリテラルを指すポインタになる
と表現できるんだぜ
0508デフォルトの名無しさん
2009/01/31(土) 13:56:09printf("a:%d / b:%d / a!=b?:%d \n",a,b,a!=b);
でaとbが異なる値だった場合は真となるのだが、その時 a!=b が返してきた値は何だった?
まぁ、兎にも角にも、真なら0以外というのは間違ってはいないけど?偽なら0は確かに言える。
しかし、真なら1を返しているんだよね。それ以外の値を気まぐれで返す?
そんな環境があるなら、是非とも教えてくれ。知りたい。死ぬまでに。
まぁ、知ったところで、0でなきゃifやwhile文が実行されるなら、気にしないけどねw
だって、変なことを気にしても、寿命を縮めるだけだし。そんな詰らない生き方、したくないし。
まだ俺は半世紀以上、健全に健康的に生きる予定だからw
0509デフォルトの名無しさん
2009/01/31(土) 13:56:190510デフォルトの名無しさん
2009/01/31(土) 13:58:190511デフォルトの名無しさん
2009/01/31(土) 13:58:460512デフォルトの名無しさん
2009/01/31(土) 14:01:590と1の組み合わせの仕組みで成り立っている点は外せない。
単純にあるか無いか?しかし、それを使って複雑にパターンを
いくつか表現する仕組みもあるわけだ。だからなんだと?
まぁ、こんなの大学の授業じゃ序の口。俺は実験でそれ以上のことをやったけどな。
そのそれ以上に、論理回路に関わるものもあったが。
2進数の仕組み、先頭の符号で正と負を表すことについてや、
コードを使って回路を作ることも。入力する値でどういう結果が出るか?
そういうのを見ると、単純に AND や OR の結果がどう返ってきているか、知ることが出来る。
まぁ、そんなの、お前らじゃ知らないだろう。低レベルだろうから。あばよ、いつまでも
底辺を這い蹲る諸君。所詮、俺は君らとは次元が違う世界に住んでいるのだよ。
扱っているものに、共通するものはあれど、レベル、格が違うんだぜ?
同じ食材を使っても、最終的にどんな料理が出来るか、違うかのように、ね?
0513デフォルトの名無しさん
2009/01/31(土) 14:03:090514デフォルトの名無しさん
2009/01/31(土) 14:03:530515デフォルトの名無しさん
2009/01/31(土) 14:04:44「各演算子は指定された関係が真の場合は1を、偽の場合は0を返す。」とある
とはいえC言語使うなら「真ならば1」とは言っちゃいかんな
入門者が覚えるべきは「非0ならば真」ということでいいんじゃね?
0516デフォルトの名無しさん
2009/01/31(土) 14:12:23実際、比較演算子で == や != で返ってきた値は、真なら1、偽なら0だし。
これは実行すればすぐに分かること。ただ、ifやwhile文では、その()の中に
0か否かで実行されるかが決まるという仕組みがあることを言っているに過ぎない。
== や != 、また、 && や || など論理演算子でも試してみれば分かるが、
それらが返してくる結果は、やはり0か1なんだなぁ。真だったら、あるいは
どちらかが成立するか、2つの変数を用いた場合でも、結果は0か1なんだなぁ。
やってみれば、誰もが分かるし、知りうる事実なんだなぁ。
よって、式の評価で真なら1、偽は0というのは、間違ってもいなければ嘘でもない。
そこまで物申すなら、てめぇが使っているPCに文句を言ってやれw
0517デフォルトの名無しさん
2009/01/31(土) 14:13:23それは正しいが、
彼は、等値演算子の話ではなく、謎の「式の評価」の話をしている。
0518デフォルトの名無しさん
2009/01/31(土) 14:15:17こういうこと言う派遣は即刻クビにしてる。
実装依存とか、コンパイラ依存とか困るからな。
0519デフォルトの名無しさん
2009/01/31(土) 14:16:10そんなことより「式の評価」の意味は?
こっちを擁護してあげたら?
0520デフォルトの名無しさん
2009/01/31(土) 14:16:12i%3 などにして、余りが0かそうでないかでも、if文やwhile文などの
実行に使えるわけだが、この場合、真か偽ではなく、if()の中に与えた値が
0か否かであって、式の評価で真偽を求めたものではない。
その仕組みを使ったテクニックに過ぎんよ。式の評価はあくまでも真か偽か?
また、代入式を用いて、左側の変数に代入された値を使うやり方もあるけど。
まぁ、なんだ、とにかく 俺とお前らでは確実に 格段に レベル が違うんだよ、わははははw
悔しかったら、年商何億の会社でも立ち上げてみろ?
0521デフォルトの名無しさん
2009/01/31(土) 14:18:02と言う式を評価したら、8が返ってきました
0522デフォルトの名無しさん
2009/01/31(土) 14:19:22893とか801とか返してくるわけねーだろJK
真なら1で問題ないよ。どこのヘタレ知ったかプログラマだよ、こいつ?w
0523デフォルトの名無しさん
2009/01/31(土) 14:20:04ごめん そりゃ無理ってもんだわ
0524デフォルトの名無しさん
2009/01/31(土) 14:20:29はずれ
0525デフォルトの名無しさん
2009/01/31(土) 14:22:070526デフォルトの名無しさん
2009/01/31(土) 14:22:56何が返ってきたか、教えて下さい。え?0721が返ってきた?
なんというエロい環境だ、今すぐPCを窓から(ry
0527デフォルトの名無しさん
2009/01/31(土) 14:23:440528デフォルトの名無しさん
2009/01/31(土) 14:25:200529デフォルトの名無しさん
2009/01/31(土) 14:25:25お前が嘘つきじゃ、ボケぇw
悔しかったら、それを覆すようなへんてこりんなマシンでも作ったらぁ?
まぁ、そんな変態マシンが売れるとは思わんが、CPUはintelやAMDが
製造したものが流通しているし、M/BもそれらのCPUが組み込めるものが多いし。
真なら気まぐれで0以外は当然のごとく、さらに1以外の値も返す環境を是非とも
今世紀中に完成させてくれw
あっ、うちの企業じゃそんなの採用しないけどw
0530デフォルトの名無しさん
2009/01/31(土) 14:26:350531デフォルトの名無しさん
2009/01/31(土) 14:28:080532デフォルトの名無しさん
2009/01/31(土) 14:29:460533デフォルトの名無しさん
2009/01/31(土) 14:31:51真偽式がする判定→「0」と「1」
式が持ちうる値→Priceless
0534デフォルトの名無しさん
2009/01/31(土) 14:33:170535デフォルトの名無しさん
2009/01/31(土) 14:33:44{
if(引数==真)
return 1;
if(引数==偽)
return 0;
return 未定義;
}
0536デフォルトの名無しさん
2009/01/31(土) 14:37:03是非とも教えて下さい!ひっじょーーーーーーーーーーーーーーーに下らないけど
死ぬまでに知りたいぜ、そんなヘンテコリンなマシンをw
あっ、でも買わないよ。要らないから、そんな変な環境もOSもw
0537デフォルトの名無しさん
2009/01/31(土) 14:38:41どう見ても真です
0538デフォルトの名無しさん
2009/01/31(土) 14:48:56いったい何の話をしているんだ
0539デフォルトの名無しさん
2009/01/31(土) 14:50:57>>491を否定されて火病ってるらしい
0540デフォルトの名無しさん
2009/01/31(土) 14:51:020541デフォルトの名無しさん
2009/01/31(土) 14:51:43評価で真なら0以外w 0以外なら真というのは分かるが、敢えて真偽で真なら0以外のどれかw
意味合いが違うってことに、いい加減気づいてね ♥
あと、あれを真偽と解釈するか、疑問の余地在り。
0542デフォルトの名無しさん
2009/01/31(土) 14:54:34ひさびさっていうか、こいつはしょっちゅう湧くぞw
0543デフォルトの名無しさん
2009/01/31(土) 14:54:49OSかマシンアーキテクチャによるものと勘違いしている節がある。
どうしようもないな。
0544デフォルトの名無しさん
2009/01/31(土) 14:56:26>ぶははははは、ぎゃはははははは、
この部分ですでに分かる。
0545デフォルトの名無しさん
2009/01/31(土) 14:58:04にしても、真偽とある値が0か否かでifやwhile文などを実行する場合は
別に1でなければいけないわけじゃないが、それをいちいち 真 と言うのかね?w
0546デフォルトの名無しさん
2009/01/31(土) 14:59:230547デフォルトの名無しさん
2009/01/31(土) 15:00:51おれが久々にきたってだけか
0548デフォルトの名無しさん
2009/01/31(土) 15:01:160549デフォルトの名無しさん
2009/01/31(土) 15:01:22>ifやwhile文などを実行する場合は
>別に1でなければいけないわけじゃないが、それをいちいち 真 と言うのかね?w
ifやwhileの条件部は「真偽」を判定しています
1以外の数字でも「真」であると判定されるのです
0550デフォルトの名無しさん
2009/01/31(土) 15:01:50偽なら0で真なら0以外としても、普通に1が使われてんじゃん、あの実行結果で分かるようにwww
頭おかしいんじゃね?
0551デフォルトの名無しさん
2009/01/31(土) 15:02:42最近だと代入式でも暴れてたし
0552デフォルトの名無しさん
2009/01/31(土) 15:03:56なぜか、自分の方が頭いいと思ってるらしいから余計手に負えない。
0553デフォルトの名無しさん
2009/01/31(土) 15:05:56先生の環境でどんな結果が出たか、お答え下さい!
くれぐれもっ、先生の、脳内解釈や妄想でのお答えは、お止めください!
0554デフォルトの名無しさん
2009/01/31(土) 15:06:090555デフォルトの名無しさん
2009/01/31(土) 15:06:45これは実際に値を計算したり関数を呼び出したりすることによって行われる。
ちなみに、式の末に";"をつけると「式文」という文になり、
制御構文の中身などにも使える。
ただ、これと、「関係演算子の演算結果が真のときに1を返す」はあまり関係ないね。
「関係演算子を評価すると0か1を返す」というだけのことで。
0556デフォルトの名無しさん
2009/01/31(土) 15:09:23「式を評価する」と言うんだな。
でも、>>491はそのことをわかってないけど。
0557デフォルトの名無しさん
2009/01/31(土) 15:09:44彼の脳内では、自分への反論は比較演算子や論理演算子が1以外を返すって主張に
自動的に変換されてるから。
0558デフォルトの名無しさん
2009/01/31(土) 15:11:480559デフォルトの名無しさん
2009/01/31(土) 15:18:46どんだけえぇ〜wwwww 調べもしないで、他人を嘘呼ばわりする基地外ってやーね
思い込みが激しいんだろうね。そんなんだから、社会に適合しないんだよ、ちみは。
何事にも、式が返す値というのはあるのだよ、ワトソン君。
0560デフォルトの名無しさん
2009/01/31(土) 15:19:31確かにその通りだなw
0561デフォルトの名無しさん
2009/01/31(土) 15:25:33ここまでファビョってる姿を見るとそう思えてくるよ
0562デフォルトの名無しさん
2009/01/31(土) 15:26:380563デフォルトの名無しさん
2009/01/31(土) 15:52:470564デフォルトの名無しさん
2009/01/31(土) 15:56:140565デフォルトの名無しさん
2009/01/31(土) 16:42:200566デフォルトの名無しさん
2009/01/31(土) 17:44:250567デフォルトの名無しさん
2009/01/31(土) 17:56:24勘弁してくれ
0568デフォルトの名無しさん
2009/01/31(土) 20:09:03ss[4]の値はいくらになるんですか?エラーになりますか?
0569デフォルトの名無しさん
2009/01/31(土) 20:11:00'b'
0570デフォルトの名無しさん
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' : 呼び出しに対する引数が少なすぎます。と
エラーになってしまいます。これはどこを変えればいいのでしょうか?
0571デフォルトの名無しさん
2009/01/31(土) 20:33:100572デフォルトの名無しさん
2009/01/31(土) 20:33:28一個目のputcharは、getcharの間違いだな
なんて言うテキスト?
0573デフォルトの名無しさん
2009/01/31(土) 20:33:47テキストと>>570のコードをよく見比べる
0574デフォルトの名無しさん
2009/01/31(土) 20:39:43ほんとあんがと
0575デフォルトの名無しさん
2009/01/31(土) 20:42:54ありがとうございます
0576デフォルトの名無しさん
2009/01/31(土) 22:25:54と表示させつつ、2と入力したらまた1からという風にさせたいのですが、
scanfさせると入力受付中にWhile文が止まってしまいます。
While文の動作を続けたままで、
入力するとiの数値を0に書き換えてWhile文に戻すような方法は
何かあるでしょうか?
何度でも0に戻せるようにscanfもwhile文に入れていたいのですが…
http://uproda.2ch-library.com/src/lib098407.jpg
0577デフォルトの名無しさん
2009/01/31(土) 22:31:440578デフォルトの名無しさん
2009/01/31(土) 22:32:080579デフォルトの名無しさん
2009/01/31(土) 22:51:38ありがとうございます
やはりマルチスレッドしかないのでしょうか
>>578
試してみましたが、while文がscanfで止まってしまいます。
ただ、私の試し方が間違っているのかもしれません
0580デフォルトの名無しさん
2009/01/31(土) 22:59:57> やはりマルチスレッドしかないのでしょうか
Windowsなら、GetAsyncKeyStateとかでもいいんじゃない?
0581デフォルトの名無しさん
2009/01/31(土) 23:01:050582デフォルトの名無しさん
2009/01/31(土) 23:01:40非同期入力を使えばできるが、入門の範囲外&処理系依存。
0583デフォルトの名無しさん
2009/01/31(土) 23:07:10入力があるかどうかチェックして、
なければ表示を続ければいいだけよ。
環境依存だから環境を提示してもらわないと
方法に関しては何とも言えないが。
0584デフォルトの名無しさん
2009/01/31(土) 23:10:01GetAsyncKeyStateを使ったことがないので勉強してみます。
いろいろ応用が利きそうなので幅が広がりそうです。
ありがとうございました。
>>581、582
ありがとうございます。
はやりマルチスレッドを使うべき場面なのですね。
一度試して失敗してるのでもう一度やってみます。
0585デフォルトの名無しさん
2009/01/31(土) 23:18:350586デフォルトの名無しさん
2009/01/31(土) 23:30:55MS-DOS 時代によく使ってたわ
conio.h 最強
0587デフォルトの名無しさん
2009/01/31(土) 23:32:120588デフォルトの名無しさん
2009/02/01(日) 00:38:46/* ループ時の処理 */
if(kbhit()) if(getch()=='q') { /* 処理 特にscanfやbreakなど*/ }
}
みたいなのがリアルタイム入力としてネットで紹介されてたんで、当時役立った。
getchはWindowsユーザー用でLinuxで使えないから注意な。
>>480から始まった式評価だが、、、
概念(や用語のC言語での意味)はあるにはあるが、
結局のところは、絶対規則でなく、C99なりを”参考”にして勝手にコンパイラ作って
周りの人間がそれをC言語コンパイラやコンパイラを通るものをCソースと認めてるだけだろ。
gccとVCとbccで使われてる概念でも、絶対的なC言語とはいえないだろうし。
if(評価式) は if(評価式!=0)にプリコンパイルされると聞いたことある気がするが
例外起こらない用に、どう同値のアセンブリ言語に書き換えられるか?だろ。
0589デフォルトの名無しさん
2009/02/01(日) 00:41:010590デフォルトの名無しさん
2009/02/01(日) 00:46:19ライブラリは当然違うけどさ
0591デフォルトの名無しさん
2009/02/01(日) 01:12:17生半可な知識乙。
色々言いたいこともあるが、一点だけ。
>if(評価式) は if(評価式!=0)にプリコンパイルされると聞いたことある気がするが
誰に聞いたんだ?
0592デフォルトの名無しさん
2009/02/01(日) 01:12:540593デフォルトの名無しさん
2009/02/01(日) 01:14:220594デフォルトの名無しさん
2009/02/01(日) 01:15:17単に、条件式では0以外の値が真と解釈されるというだけの話。
0595デフォルトの名無しさん
2009/02/01(日) 01:17:55Cの規格にプリコンパイルなんて処理はない。
コンパイラが独自にプリコンパイルを導入している事はあるが、
これはヘッダファイルを予めある程度コンパイルしておくことであって、
そんな怪しい事をする処理のことではない。
まあ、意味は同じだし、コンパイラが内部的にそう変換して解釈してるかもしれないが、
Cの規格がそういう変換を強要することはない。
0596デフォルトの名無しさん
2009/02/01(日) 01:21:530597デフォルトの名無しさん
2009/02/01(日) 01:24:420598デフォルトの名無しさん
2009/02/01(日) 01:27:54スレ違い
0599デフォルトの名無しさん
2009/02/01(日) 01:29:11日本語でおk
何が言いたいのか分からないが、
別に規格が絶対的な規則だなんて誰も言ってなくて、
世間的にC言語のスタンダードがC89(含C99)だから、
処理系を指定せずに「C言語」って言ったら
ほとんどの人がC89準拠の処理系なのを前提に話すだけさ。
規格があって、ほとんどのCコンパイラが規格にそってるのに、
唐突に「俺用語」で話されたって会話できないよ。
0600デフォルトの名無しさん
2009/02/01(日) 01:34:020601デフォルトの名無しさん
2009/02/01(日) 01:37:58が必要。
最初にJavaで入る学習階梯が最近脚光を浴びつつあるが
Javaの基礎を正しく学べなければCをかじったほうが
まだマシという状態になる。
Javaを正しく学べればCを学ぶ時につきがちな
悪い癖をつきにくくさせる効果はある。
という意味でJavaは決してCの簡易版ではないな。
0602デフォルトの名無しさん
2009/02/01(日) 01:38:500603デフォルトの名無しさん
2009/02/01(日) 01:39:33おそらく誰もCの簡易版だなんて思っていませんよ。
0604デフォルトの名無しさん
2009/02/01(日) 01:40:100605デフォルトの名無しさん
2009/02/01(日) 01:40:460606デフォルトの名無しさん
2009/02/01(日) 01:42:04それに反論するのが彼の得意技。
0607デフォルトの名無しさん
2009/02/01(日) 01:59:41JavaScriptを使え(嘘)
0608デフォルトの名無しさん
2009/02/01(日) 02:00:28ブラウザが荒らわれる
0609デフォルトの名無しさん
2009/02/01(日) 02:07:51正論を言えないお前が必死だなw
あいつがどうとか言う前に、自分が正しいことを言えているのか
レスを読み返してみろよ?真なら0以外の1以外でも返ってくる
ヘンテコリンな環境を使用中の時代遅れのオッサン?w
0610デフォルトの名無しさん
2009/02/01(日) 02:10:39これが(君以外)誰も言っていないこと
比較演算子は0か1しか返さないのは規格で定められている。
0611デフォルトの名無しさん
2009/02/01(日) 02:12:07int a = 3;
if(a) { ... }
のaは3と評価される。
みんなこういう話しかしてないが、
>>609はいつまでたってもそれが理解できていない。
0612デフォルトの名無しさん
2009/02/01(日) 02:17:39a==bが返す値を見ても、まだ分からない大ボケ。何歳なんだろうね?
まぁ40過ぎた時代遅れのオッサンなんだろうけどw
0613デフォルトの名無しさん
2009/02/01(日) 02:19:45プリコンパイルの説明として
> ヘッダファイルを予めある程度コンパイルしておくこと
というのはいかがなものかと。。。
プリコンパイル済みヘッダーのことを指してるんだろうか?
そうだったとしても、ある程度コンパイルという言葉が出る時点で程度が知れる
0614デフォルトの名無しさん
2009/02/01(日) 02:21:570615デフォルトの名無しさん
2009/02/01(日) 02:23:20自分が言いたかったことは、真ならifやwhile文の条件が実行されることに対し
安直に0以外なら 真 と言ってしまった勘違いから、話は食い違っているんだが?
そもそも、真偽では真なら1が、偽は0というのは確たる証拠、実行結果が出ているし。
こいつの勘違いは、とにかく0か否かを、無理やり真偽に持ち込んでいるところ。
ある変数などを用いて、0でなければ実行させる仕組みは、別に真偽とは言わない。
何も真か偽か?で判断しているわけじゃないから。その程度の仕組みも理解出来ないくらい
短絡的な思考回路しか持っていないんだよ、時代遅れのオッサンは。キモイ。
もっと視野を広げな。そもそも、このスレで議論している人が、地球にいる何十億といる
人の中の、ほんの数名しかいないということに気づけ。それも、一概には言えないが
恐らくここでレスしている人は、ほとんどが日本人だろう。議論の場が既に小さくてちっぽけ。
だから、自分が言うことが正しい、で押し通そうとしているんだよね、引きこもりの視野の狭い奴はw
0616デフォルトの名無しさん
2009/02/01(日) 02:24:010617デフォルトの名無しさん
2009/02/01(日) 02:24:57お前は何と戦ってるんだ。
a==bが0と1以外を返すと言っているやつは誰一人としていないのだが。
0618デフォルトの名無しさん
2009/02/01(日) 02:26:49あと、嘘なら嘘という証拠を提示しろ。その証拠が提示できない、明らかに
真偽である真偽の判定に於いて、真なら1、偽なら0という結果が出てしまっているというのに。
if、while文を実行させるために与えている値が何なのか?分からないようじゃ
プログラマ以前に、物事を理解する頭すら持っていないと思われ。
分かりきったコードを書いて、プログラミングが出来た気になってなさい。
所詮、この世で行われている、ペーパーテストなどで評価される試験なんて、そんなもん。
分かりきった答えを暗記で済ませられるからねぇ。
まぁ、出題者側も、あれこれ問題を変えたり、その模範解答を作るのが面倒だからね。
世の中、所詮そんなもん。しかし、間違っていないことに対し、自分がそう思うか否かで
勝手に反対するだけで、事実を述べられないどころか、述べられないくらいに証拠を提示されて
反論できなくなるのは、痛すぎる。
0619デフォルトの名無しさん
2009/02/01(日) 02:27:080620デフォルトの名無しさん
2009/02/01(日) 02:29:54等価か不等か、真か偽で返ってくる値は明白だな。
1か0。まぁ、0でなければifやwhile文などは実行されるからねぇ。
わざわざ、0以外ならそれを「真」と思い込む、コードの意味も分からん
ド素人は誰だよ?プログラマ失格だろJK
0621デフォルトの名無しさん
2009/02/01(日) 02:31:12なんだ。ちゃんとわかってんじゃん。
0622デフォルトの名無しさん
2009/02/01(日) 02:36:330623デフォルトの名無しさん
2009/02/01(日) 02:40:45==とか!=とか<や>の類は全くもってその通りだけど、Cではこれができてしまうから面倒な話になる。
int is_hoge() {return 3;}
void f()
{
if (is_hoge())
...
}
0624デフォルトの名無しさん
2009/02/01(日) 02:42:09>>491
0625デフォルトの名無しさん
2009/02/01(日) 02:47:04真偽の判定で返ってくる値が、0か0以外、1とは限らないという考えは意味が分からん。
とにかく、あのコードで実行すれば、結果が出てしまうわけだが。
そもそも、別にif()の括弧の中に入れる値はいくつかあれど、それと
真偽の判定は別だから。あくまでも、それによって返ってきた値で
真だったら、偽だったら、という解釈はあるが、分かりやすいものに
!aで、aに入っている値が0か否かで、その逆はどうなるか?ね、その程度の検証もしないで
知ったかぶってんじゃねーよ、時代遅れ。
0626デフォルトの名無しさん
2009/02/01(日) 02:48:56オブジェクトファイルになるわけじゃないし・・・
0627デフォルトの名無しさん
2009/02/01(日) 02:49:380628デフォルトの名無しさん
2009/02/01(日) 02:50:17こんな風にさりげなく言葉を置き換えるんだよな。
0629デフォルトの名無しさん
2009/02/01(日) 02:50:17↑
嘘(玄米もあるし、食事全体の総称としてごはんは定着している)
↑
白米をごはんといわないならなんて言うんだよ。嘘とか言うな知ったかぶり。
という流れか
0630デフォルトの名無しさん
2009/02/01(日) 02:51:07> a==bやa!=bの真偽の判定で返ってくる値が、0か0以外、1とは限らないという考えは意味が分からん。
誰1人としてそんなこと言っているやつはいないわけだが。
0631デフォルトの名無しさん
2009/02/01(日) 02:51:230632デフォルトの名無しさん
2009/02/01(日) 02:51:520633デフォルトの名無しさん
2009/02/01(日) 02:52:40それで、誰も白米をごはんと言わないなんて言ってないじゃない、と言うんだけど、
じゃあ嘘とか言うな(以下長文)と来るわけで、敵はいないというのはそういうこと
0634デフォルトの名無しさん
2009/02/01(日) 02:53:420635デフォルトの名無しさん
2009/02/01(日) 02:54:37>>619
0636デフォルトの名無しさん
2009/02/01(日) 02:55:45真:elseに行かない or ループが継続される値の総称
偽:elseに行く or ループから脱出する値の総称
0637デフォルトの名無しさん
2009/02/01(日) 03:18:40横からすまそ。
「非0が真」 ではなくて、「真が非0」 な。
非0は真以外の意味で使われる場合もある。
たとえば、3cmを表してる場合の3とか。
0638デフォルトの名無しさん
2009/02/01(日) 03:43:32入れることが出来る。
整数と同一視できる式の場合0が論理式評価の「偽」に対応し、0以外が論理式評価の「真」に対応する。
対応するとは、コード実行時のフロー制御挙動が同じという意味
論理式評価の「真偽」は人が考える「真偽」と概ね一致する。というか、一致しない論理式を書いた時
人はその論理式がバグってると言う。
でおkですか?
0639デフォルトの名無しさん
2009/02/01(日) 03:45:00ドラフトのif文の説明にも、「最初の文は非0のとき実行される」
としか書かれてない。真とか偽とかは関係ない。
だけど、意味の上の真偽値は有る。
ドラフトのisalphaの説明にも、「〜のときtrueが返る」
と書かれてる。で、trueは非0と。
結局、数値を真偽値と見るかどうかは、プログラマ次第であり、
非0であれば必ず真というわけではない。
常に正しいのは、真は非0ということ。
0640デフォルトの名無しさん
2009/02/01(日) 03:48:29それは違うだの、自分はそれに対してそうは思わないね、としか言わない
話にならない奴はいたよ。こちらが提示したのは、実行して得た結果だというのに。
それがどういうことなのか?までは言及していないのに、いつの間にか
自分が思った通りの結果ではないだの、それについては自分は同意しないだの、
あんたは何を言っているんだと?宇宙に行った事の無い人が、地球にいて
知りうることだけで、実際に宇宙に行ってその場でその人が知った事実を
否定できると言うのかね?かつて、コペルニクスやガリレオガリレイなどが
地動説と天動説を言い争ったかのように、無駄な議論だ。宇宙に出れば
それらがどういうことなのか?一発で分かる。百聞は一見にしかず、
その程度の諺くらい知っておけよ、青二才。
0641デフォルトの名無しさん
2009/02/01(日) 03:51:21> 常に正しいのは、真は非0ということ。
偽は0であることで、非0が真とは言えないよ。
ifやwhile文の実行に、真偽の判定によって返ってきた値を使う方法の他に
ある変数が0か否かで決定するやり方もあるし。問題は、真偽の判定に於いて
その式自身が返す値が何か?答えは既に出ている。偽は0、真は1。
真だった場合、1の他にも値を返すというのなら、教えてもらおう。
あと、代入式を使ったやり方もあるが、あれは左辺の変数に代入された
値を使用しているとみなして良い。真偽の判定ではないからね。
0642デフォルトの名無しさん
2009/02/01(日) 03:57:13偽は0と返すが、非0が真と扱うのはともかく、真なら0以外ならなんでも返すって
環境を教えてくれ。正直、食い違っているんだろうけど、こちらが言っているのは
何も間違ってはいない。あと、そちらがそこまで言うなら、真偽の結果において
真なら0以外、1以外にも返すものがあるかどうか?
あの括弧の中に、0以外を入れれば実行されるという話についてではなく、
あくまでも 真偽 の判定によって 返ってくる値 について、俺は言っているんだぞ?
あんたが言う、非0なら実行される=真 という考えは、こちらには無い。というか、それは
真偽の判定のことではないから。
0643デフォルトの名無しさん
2009/02/01(日) 03:59:35やはり1が返ってくるのだよ。しかし、非0に対して否定 ! を使った場合
0になってしまうわけだが、その結果だけでも、やはり0か1なんだよ。
俺が言っているのはそういうことで、これは俺が勝手に決めたことじゃなく
実行結果で得た検証結果なんだが?だから否定は出来ないよ。
ただ、屁理屈野郎は次にこういうだろう。どんな環境を使っているの?
まぁ、それを言うと、今度はそんな環境を否定し始めるから言わないよ。
俺が聞きたいのは、真なら非0で、1以外の値も返す環境を知りたいだけだ。
0644デフォルトの名無しさん
2009/02/01(日) 04:01:43>> 常に正しいのは、真は非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.
0645デフォルトの名無しさん
2009/02/01(日) 04:06:29a==b 自身が返す値が0か否かで、該当したら実行するか?
単純に変数 a に0か0以外を入れてみれば、結果が出る。
だからといって、0以外が真とはその場合は言わない。というか、真偽の判定じゃないから言えない。
if(i%2) で奇数か偶数かを判定しているもんだと勘違いした人の、思い違いじゃないのか?
既に、 i%3 で余りが0か否かでも、結果が出ると言われているのだが?
良いからやってみろ。あとはそれに応じて、自分が思うような結果を導けば良いだろ?
誰もあんたが何をするか、逐一指図なんてしないよ。好きなようにやれ。
ただし、それは己の実力や知識、知恵が及ぶ範囲内でのことになるがな。
他人の手を借りて、金を稼ごうって魂胆は、ずるい奴の考え。努力を惜しむ奴は
金儲けでも最後は失敗するだろうよ。詰めが甘い、とな。
0646デフォルトの名無しさん
2009/02/01(日) 04:09:08printf("%d\n",a+(int)(1==1));
の実行結果が信頼できる処理系に限っても
常に0になると楽観するプログラマは恐らく
現在も将来も居ないだろうから
素直に
printf( "%d\n",a+(1==1)?1:0);
とコードしようや。
たとえ仕様書で定められたとしても
その仕様書を処理系を開発する人々が守るかどうかは
別問題だと思うぞ。
0647デフォルトの名無しさん
2009/02/01(日) 04:11:19もし、>>623のis_hogeのような関数を探しているのであれば、Windows APIの中にあるとされている。
typedef int BOOL; #define TRUE 1
でBOOL型を返すIsHogeって関数にIsHoge() == TRUEなんて御法度と言われている。
TRUE以外の値を返すことがあり得るからと。
実際のところどうなのかわからないけど。いつもif (IsHoge())かif (IsHoge() != FALSE)って書くし。
0648デフォルトの名無しさん
2009/02/01(日) 04:13:49そもそも if( a==b ) は if 文が 真偽を判定 しているんじゃない。
返ってきた値で、0でなければ、実行している。
単純に変数 a に0か0以外を入れて if(a) で試してみれば分かる。
結局、与えられた値が0か否かであって、if自身が真偽を判定しているわけではない。
あくまでも、成立した場合、偽でなければ0以外の値が与えられた時は、実行する。
よって、if( i%2 ) 自身が、奇数かを勝手に判断しているわけではないのだよ。
余りがあったとき、0以外の値が与えられて、割り切れない値が与えられたという事実が
if文によって分かるということだ。
0649デフォルトの名無しさん
2009/02/01(日) 04:19:10その通りだと思う。
0650デフォルトの名無しさん
2009/02/01(日) 04:20:400651デフォルトの名無しさん
2009/02/01(日) 04:25:54Cの規格書の内容をまとめとくと、
・if文は非0かどうかを判断しているだけ。真偽は関係ない。
・真は非0。
・比較演算子は0か1を返す。
どうしてここまで話が縺れるか。それは、
・if文が真偽に従って分岐すると勘違する
・非0が常に真の意味だと履き違える
・比較演算子が0か1のみを返すということを知らない
人が多いからだろう。
0652デフォルトの名無しさん
2009/02/01(日) 04:28:370653デフォルトの名無しさん
2009/02/01(日) 04:32:59いや、少なくとも「比較演算子が0か1のみを返すということを知らない」は全員が理解しているだろう。
0654デフォルトの名無しさん
2009/02/01(日) 04:36:220655デフォルトの名無しさん
2009/02/01(日) 04:36:30double b=0.0;
int c=0;
b=floor(a);
c=(int)b;
この場合に234になって欲しいのですが、
なぜか値が違っている場合があるのですが何故でしょうか?
0656デフォルトの名無しさん
2009/02/01(日) 04:39:29それで間違いないんだけど、
全員納得するなら0時くらいで終わっているはずなんだ。
0657デフォルトの名無しさん
2009/02/01(日) 04:39:43・日本語が不自由(というか論理的に破綻している)、タイピングだけは早い
・自分にしか意味のわからない言葉を使う(例:「式の評価」)
・規格というものを理解していない、好きな言葉は「アセンブリ出力」
・勝ち誇って長文の連レス、しかもなぜかCとぜんぜん関係のない話を持ち出す
という特徴があるので適当に放置したほうがいい
0658デフォルトの名無しさん
2009/02/01(日) 04:40:15#inlcude <math.h>忘れてるとかってオチはない?
0659デフォルトの名無しさん
2009/02/01(日) 04:40:57それが無重力だと実感した人とは、受け止め方が違うし
無重力状態では、何が起こるか?もその場に行ってみないと分からないことが多い。
特に、食事や排便は大変なそうで。もちろん、移動や器具の取り扱いも。
しかし、そんなのは実体験していない人にとっては、言葉などでの想像に過ぎず、
実際に体験した人がどう感じたかまでは、分からない。しかし、適切に考えられる人なら
多少なりと、適切な行動に移せるが、やはり予期せぬことなどいくらでもあるのが
この世の中。自分が知りうる範囲内の知識や知恵、経験なんぞ、ちっぽけだぞ。
思い上がるな、小僧。
0660デフォルトの名無しさん
2009/02/01(日) 04:42:14そういうセリフは自分が宇宙に出てから言ってくださいw
0661デフォルトの名無しさん
2009/02/01(日) 04:42:49お帰りください
0662デフォルトの名無しさん
2009/02/01(日) 04:43:46・勝ち誇って長文の連レス、しかもなぜかCとぜんぜん関係のない話を持ち出す
0663デフォルトの名無しさん
2009/02/01(日) 04:45:540664デフォルトの名無しさん
2009/02/01(日) 04:46:10話がかみあうわけがない
0665デフォルトの名無しさん
2009/02/01(日) 04:49:450666デフォルトの名無しさん
2009/02/01(日) 04:54:460667デフォルトの名無しさん
2009/02/01(日) 04:55:13すいません、いろいろ考えても言う事がまとまらないので
質問を撤回させてもらいます・・・。 板汚し失礼しました・・・
0668デフォルトの名無しさん
2009/02/01(日) 04:55:49反論してるんじゃなくて、同じことを盲目的に繰り返すだけだから
0669デフォルトの名無しさん
2009/02/01(日) 04:57:48特別な定義は見当たらないから,一般的な意味で捉えればいいと思う。
5.1.2.3 プログラムの実行
3段落目
> 抽象計算機では,すべての式は意味規則で規定する通りに評価する。
0670デフォルトの名無しさん
2009/02/01(日) 04:57:49カナ入力なんじゃねーのこいつ。
0671デフォルトの名無しさん
2009/02/01(日) 04:58:06比較演算子などで、成立するかどうか?が真偽の判定。
それに応じて返ってきた値が0か1かで、とりわけ0以外の値が
if文に与えられたとき、その文が実行される仕組みがある。
これはwhileでも言えること。間違っていない事実に対して
異論を唱える君は、その事実が理解できないだけなんだろ?
だいたい、ここに来ているごく数名の人に対して、自分の意見を
押し付けてどうする?だったら、もっとより多くの人の集まる場所で
意見をしてみろよ?まぁ、そこには多種様々な考えの人がいて、
また詰らない議論が展開されるだろうよw
しかし、真実は1つ、見た目は子供、頭脳は大人、その名は(ry
0672デフォルトの名無しさん
2009/02/01(日) 04:58:40普通の教育受けてきたらこうはならんて。
0673デフォルトの名無しさん
2009/02/01(日) 04:59:30それこそCと全然関係ない話だろ。
>>671
いったい誰が異論を唱えているんだ?
0674デフォルトの名無しさん
2009/02/01(日) 05:00:39オマエガタダシイ
0675デフォルトの名無しさん
2009/02/01(日) 05:03:16value, or that designates an object or a function, or that generates side effects, or that
performs a combination thereof.
式を評価するということは、式を計算すると言うことだな。
0676デフォルトの名無しさん
2009/02/01(日) 05:07:310677デフォルトの名無しさん
2009/02/01(日) 05:09:57491 名前:デフォルトの名無しさん[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
「式の評価」って何の事をいってるの?
比較演算子の結果という意味?
0678デフォルトの名無しさん
2009/02/01(日) 05:10:370679デフォルトの名無しさん
2009/02/01(日) 05:58:540680デフォルトの名無しさん
2009/02/01(日) 06:14:110681デフォルトの名無しさん
2009/02/01(日) 06:49:120682デフォルトの名無しさん
2009/02/01(日) 06:59:56与えた値について、真偽の結果、あるいは0か否かでその文を実行するかを
決定しているに過ぎない。そこで、式が成立する場合の真のとき、
0以外だからといって1以外の値を返すような環境があるなら、是非とも教えてくれたまえ。
出せないなら出せないって言えよ?こっちは未来永劫、待ってやるぞ?w
お前が開発しても良いけどなw
0683デフォルトの名無しさん
2009/02/01(日) 07:01:380684デフォルトの名無しさん
2009/02/01(日) 07:05:02真偽はあくまでも、真か偽か?要は成立するか否か?それ以外の値にまで
0か否かで勝手に真偽をしたと言われても、迷惑だな。
0685デフォルトの名無しさん
2009/02/01(日) 07:14:48whileにしても、あくまでも真か偽で返ってきた値を用いて、繰り返すかを
決定しているというのに、勝手にそれを真って、誰が決めてんだよ?
それじゃ、ある変数xを用いて、while(x)とした場合、xが0でなければ真って
何が 真 なんでちゅか?w それは変数が0か否かであって、真か偽か?
ではないのだがw
0686デフォルトの名無しさん
2009/02/01(日) 07:17:390687デフォルトの名無しさん
2009/02/01(日) 07:21:23if(x) 実行されたからxは真だーー!(プ
x=0
if(x) 実行されなかったからxは偽だー!(プ
ねーよwwwww
0688デフォルトの名無しさん
2009/02/01(日) 08:54:280689デフォルトの名無しさん
2009/02/01(日) 10:28:09新しい質問ない?
0690デフォルトの名無しさん
2009/02/01(日) 10:32:42あえて突いてみるが、
規格上「==が0か1を返す」という記述を無視している規格準拠でない処理系なのに
同じ規格に載っている「参考演算子」の挙動は規格に準拠していると信用できるのは、
どういう理由からなんだ?
それとも俺が何かしらのギャグを理解できていないのか・・・
誰か説明頼む。
0691デフォルトの名無しさん
2009/02/01(日) 10:37:150692デフォルトの名無しさん
2009/02/01(日) 11:11:48main()
{
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'
どうすればエラーがなくなるんですか?
0693デフォルトの名無しさん
2009/02/01(日) 11:40:02「表示します」を「プリントします」にするといけるかもしれない
0694デフォルトの名無しさん
2009/02/01(日) 11:44:41ttp://edu.inf.shizuoka.ac.jp/lecture/2007/A042/text/faq-execute.html#japanese2
0695692
2009/02/01(日) 11:50:13解決できました。ありがとうございました。
0696デフォルトの名無しさん
2009/02/01(日) 12:24:120697デフォルトの名無しさん
2009/02/01(日) 12:36:12if(()の括弧の中に与えられた値が、0か否かで実行している程度だろ
真偽の結果の値は a==b が成立するかどうかで1か0だわ
0698デフォルトの名無しさん
2009/02/01(日) 12:49:240699デフォルトの名無しさん
2009/02/01(日) 12:50:01#define IF(x) if(!(x))
でコードすれば少しは溜飲は下がるかもな
0700デフォルトの名無しさん
2009/02/01(日) 12:50:57これは酷い。
0701デフォルトの名無しさん
2009/02/01(日) 13:01:35かといって、真とは条件が成立する場合であると言い切るのはやや強引。
ここは彼も含めた大方の人が理解していることだと思うんだけど、関係演算子の値こそが真偽値であり
それが0もしくは1であることが実行した結果から分かるため、真は1、偽は0と主張しているんだよね。
規格書には関係演算子を評価した値が0もしくは1であることが書かれているようだけど、
それが真偽値であると書かれてるの?
百聞は一見にしかずの件だが、プログラミングにおいては「一見」した時の環境という条件が
常につきまとうから、実行した結果がこうだったから常に正しいという主張は基本的に無意味
であるし、それを盾に自分が正しいという主張をされても誰得。
0702デフォルトの名無しさん
2009/02/01(日) 13:07:040703デフォルトの名無しさん
2009/02/01(日) 13:08:18バカじゃねぇの
0704デフォルトの名無しさん
2009/02/01(日) 13:34:31char *p = "abc";
という風に初期化できるのに
int *a = {1,2,3};
という風にできないのはなぜですか?
イメージ的には、どこかにint型の3つ分が確保されて、
その先頭の位置をpに入れてくれそうなんですけど・・・
{1,2,3}というのは初期化する時の表現であって、
配列を表すものじゃないってことでしょうか?
0705デフォルトの名無しさん
2009/02/01(日) 13:36:180706デフォルトの名無しさん
2009/02/01(日) 13:40:30>規格書には関係演算子を評価した値が0もしくは1であることが書かれているようだけど
>>646
0707デフォルトの名無しさん
2009/02/01(日) 13:43:35特殊な扱いと言うか、"abc"は文字列リテラルへのポインタを表すから。
厳密には違うけど近い表現でいうと、
char s[] = {'a','b','c'};
char *p = s;
というようなイメージ。
>int *a = {1,2,3};
これは、ポインタを配列のように初期化しようとしているからエラーになる。
char *p = {'a','b','c'}; がエラーになるのと同じ。
0708デフォルトの名無しさん
2009/02/01(日) 13:46:17>>690
0709デフォルトの名無しさん
2009/02/01(日) 13:49:31バグだから。
ってレベル。
0710デフォルトの名無しさん
2009/02/01(日) 13:55:23printf( "%d¥n",a+((1==1)?1:0));
だろね。言いたいことは。
そのあたりのことを察することが
出来ない人は居ないと思うが.
0712デフォルトの名無しさん
2009/02/01(日) 14:10:59のー・・・なんてこったい!
s[]のとこ、NULL終端入ってないよ!!
すんませんorz
0713デフォルトの名無しさん
2009/02/01(日) 14:12:12ヌル文字を忘れてはいけない。
絶対に。
0714デフォルトの名無しさん
2009/02/01(日) 14:17:03からだと思っていたが...orz
0715デフォルトの名無しさん
2009/02/01(日) 14:49:04int a;
if(a)という書き方はするな
if(a!=0)ときちんと書け
a=(int)(1==1)
みたいなこともするな
と言いたいんだな、きっと。
0716デフォルトの名無しさん
2009/02/01(日) 14:49:48int *iptr; と宣言したポインタiptrの大きさは何バイトになりますか?
できれば理由も教えてください。よろしくお願いします。
0717デフォルトの名無しさん
2009/02/01(日) 14:50:150718デフォルトの名無しさん
2009/02/01(日) 14:50:460719デフォルトの名無しさん
2009/02/01(日) 14:51:094バイトかも知れないし、2バイトかも知れないし、32メガバイトかも知れない
0720デフォルトの名無しさん
2009/02/01(日) 14:52:23おそらく、4バイト。
なぜなら、doubleとintでアドレッシングの違う場所に配置することはないだろうから。
0721デフォルトの名無しさん
2009/02/01(日) 14:53:190722デフォルトの名無しさん
2009/02/01(日) 14:54:03分からない。
理由はそんなこと標準規格では一切の規定がなく、
何バイトであっても規格に合致できるから。
ただし、同じ4バイトになる環境が多いとは言っておく。
0723デフォルトの名無しさん
2009/02/01(日) 14:58:110724デフォルトの名無しさん
2009/02/01(日) 15:03:320725デフォルトの名無しさん
2009/02/01(日) 15:03:40よほど特殊な環境(俺アーキテクチャーマシンとか)じゃない限り4バイトだろう。
普通のPCならdoubleのデータも、intのデータも、同じメモリーに置くだろうし
同じメモリーなら、ポインターのサイズは必ず同じになる。
ユーザー定義型ならまた違ってくる可能性もあるが、doubleもintも組み込み型だし。
0726デフォルトの名無しさん
2009/02/01(日) 15:03:41本当にありがとうございます
0727デフォルトの名無しさん
2009/02/01(日) 15:05:37100% 同じ! と断言することはできないけど、まあ普通は同じだろうな
0728デフォルトの名無しさん
2009/02/01(日) 15:06:52例えば?参考までに。
0729デフォルトの名無しさん
2009/02/01(日) 15:12:41>セグメント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
0730デフォルトの名無しさん
2009/02/01(日) 15:13:30なるほど。ありがとう。
0731デフォルトの名無しさん
2009/02/01(日) 15:26:56sizeof( double )バイト
0732デフォルトの名無しさん
2009/02/01(日) 15:41:12馬鹿はお帰りください。
0733デフォルトの名無しさん
2009/02/01(日) 15:52:08OSはvista、コンパイラはLSI Cです。
ソースファイルを作成して、それをコンパイルすると文字化けしてしまいます。
実行可能ファイル(.exe)も作成できて、問題なく実行できます。
文字化けしないようにするにはどうしたらいいでしょうか?
0734デフォルトの名無しさん
2009/02/01(日) 15:53:440735デフォルトの名無しさん
2009/02/01(日) 15:54:320736デフォルトの名無しさん
2009/02/01(日) 15:57:42文字の出力先が期待している文字コードでプログラムの文字列を記述する。
0737デフォルトの名無しさん
2009/02/01(日) 16:06:31NT系で16bitプログラムを実行すると出力が正常になされなくなる場合があります。
したがって、アドバイスとしては不適切ですね。
LSICではなく32bitコンパイラを使う以外の対処を私は知りませんが。
0738デフォルトの名無しさん
2009/02/01(日) 16:08:190739デフォルトの名無しさん
2009/02/01(日) 16:11:02だから、その「出力が正常になされなくなる場合」ってのは、「文字の出力先が期待している文字コード」を出力していない場合のことだろ。
>>736の通りにすれば、その場合に当たらない。
したがって、>>736は適切。
0740デフォルトの名無しさん
2009/02/01(日) 16:13:03VistaにはDOSアプリ実行インフラが無いんじゃなかったっけ?
XPでもconfig.sysをいじらないと漢字フォントドライバ(DOS用)の
ものがメモリにロードされないから日本語を使うDOSアプリの出力が
化けた(usモードで実行されるから)記憶が...
0741733
2009/02/01(日) 16:13:08特に理由が無いので、そちらを使用してみます。
>>736
ちょっと自分の説明が下手でしたね。
コンパイル前に表示されていた日本語(例えばDIR<Enter>で「10個のファイル」とか「2個のディレクトリ」など)が
コンパイルすると「??????」になってしまいます。
これを直したいんですがどうしたらいいでしょうか?
0742デフォルトの名無しさん
2009/02/01(日) 16:13:50で、LSI-Cだって?
ttp://www.lsi-j.co.jp/product/c86/index.html
※Windows Vistaでは日本語表示および日本語入力はできません。
と書いてあるな。
0743デフォルトの名無しさん
2009/02/01(日) 16:16:07へー、vistaって、SJISを出力するプログラムを実行すると文字化けするんだ。
知らなかったよ。
すごーーーーく勉強になったよ。
0744デフォルトの名無しさん
2009/02/01(日) 16:18:21そう。2000やXPもそうだけど、16bitプログラムを実行すると
うまく動いているときもあるけど、コンソールの出力自体が全部おかしくなる。
治し方もわからない。
とにかく32bitコンパイラにするべきなのは確実。
0745デフォルトの名無しさん
2009/02/01(日) 16:19:34コンパイラ自体が16bitプログラムなのが原因。
0746デフォルトの名無しさん
2009/02/01(日) 16:20:10config.sys弄っても多分ダメ
jfontXX系のDOSドライバがXP以降ではレガシーデバイスとして
サポートされておらず従ってCDROMにも添付されていないから。
要するに16ビットアプリは動作するとしても、英語モード
で動作するアプリのみになったって感じ。
0747733
2009/02/01(日) 16:22:58わかりました。32bitコンパイラにしてみます。
734が教えてくれたVC++Expressというのは32bitなのでしょうか?
0748デフォルトの名無しさん
2009/02/01(日) 16:26:200749デフォルトの名無しさん
2009/02/01(日) 16:27:100750デフォルトの名無しさん
2009/02/01(日) 16:28:21比べてかなり異質で特殊なものだということさえわかればおk
0751デフォルトの名無しさん
2009/02/01(日) 16:29:30君もそれ以上わかってないしね
0752デフォルトの名無しさん
2009/02/01(日) 16:37:330753デフォルトの名無しさん
2009/02/01(日) 16:38:330754デフォルトの名無しさん
2009/02/01(日) 17:51:00aの値を■進数で表すと0×3aとなり、10進数で表すと▲となる。
■と▲には何を入れればいいですか?
0755デフォルトの名無しさん
2009/02/01(日) 17:57:060×が16進数のことを言っているなら、■は16、▲は58
参考までに
ttp://e-words.jp/p/r-ascii.html
0756デフォルトの名無しさん
2009/02/01(日) 18:01:25サンクスです
0757デフォルトの名無しさん
2009/02/01(日) 18:19:190758デフォルトの名無しさん
2009/02/01(日) 19:33:230759デフォルトの名無しさん
2009/02/01(日) 19:33:55たしか、一人がこけたら枕を並べて討ち死にマルチタスクだったかと。
なにをするにしても32bit にくらべてワンステップ余計に必要だったことも記憶しています。
あとWDMにくらべてVxD ってなんだったの?ハードよりから完全撤退してしまったので、そのあたりがわかっておりません。
0760デフォルトの名無しさん
2009/02/01(日) 19:35:110761デフォルトの名無しさん
2009/02/01(日) 19:38:28お前がスレ違い
0762デフォルトの名無しさん
2009/02/01(日) 19:40:35単なる進化の過程。WDMだって過去の遺物になろうとしている。
0763デフォルトの名無しさん
2009/02/01(日) 20:40:38昔使おうとしてDWORD等のキモい型に馴染めず、それ以来gccかborlandだなぁ
0764デフォルトの名無しさん
2009/02/01(日) 20:42:460765デフォルトの名無しさん
2009/02/01(日) 20:44:54gccでもBorandでも当然使えるし。
0766デフォルトの名無しさん
2009/02/01(日) 22:02:57for(i=0;i<=10;i++)
{
for(j=0;j<=10;j++)
{
if(i+j=5)
{
何か処理
}
}
}
このようなループ処理に間違いはありますか?
コンパイルしてもエラーはでませんが、実行すると一瞬で
何も結果が得られずプログラムが終了してしまいます。
プログラム全体はもっと長いのですが、ここが一番怪しいので・・・。
0767デフォルトの名無しさん
2009/02/01(日) 22:04:160768デフォルトの名無しさん
2009/02/01(日) 22:04:460769デフォルトの名無しさん
2009/02/01(日) 22:06:02具体的にどういうこと?それが判らないとどうにも。
0770デフォルトの名無しさん
2009/02/01(日) 22:09:180771デフォルトの名無しさん
2009/02/01(日) 22:14:03そのiとjを使って、pow(i,2)+pow(j,2)などの値を求めます。
その結果を最後にprintfで出力する感じです。
なのに実行しても何も出力されません。というか、このプログラムの
forループに関係のない、どこか適当なところに「printf("1\n");」と入れても、それすら出力されません。
少なくともこのループが原因じゃないのでしょうか・・。
0772デフォルトの名無しさん
2009/02/01(日) 22:17:190773デフォルトの名無しさん
2009/02/01(日) 22:17:490774デフォルトの名無しさん
2009/02/01(日) 22:20:35質問でも何でもなく、「ループは原因じゃない」って言ってもらいたいだけだろ。
君だってわかっていることだ。
0775デフォルトの名無しさん
2009/02/01(日) 22:22:07環境が分かれば解決すると思う
そしてそれはスレ違い
0776デフォルトの名無しさん
2009/02/01(日) 22:22:12printf("start main()\n"); return 0;
って書いてコンパイルして実行してみたら?
0777デフォルトの名無しさん
2009/02/01(日) 22:24:04そうです。
ここが違うってわかればすこしは楽になるのにーーー><;
ひーん。もうちょっと自分で頑張りますorz
0778デフォルトの名無しさん
2009/02/01(日) 22:24:14あれこれやる前に、これ動かしてみてよ。
# include <stdio.h>
int main(void) {
printf("Hello, world\n");
return 0;
}
0779デフォルトの名無しさん
2009/02/01(日) 22:25:070780デフォルトの名無しさん
2009/02/01(日) 22:31:11>>778
それは動きます。環境が悪いわけじゃないんですが・・。
ちなみに環境はborland C++でコンパイルしています。
>>779
if(i+j=5)が悪いんでしょうか?
0781デフォルトの名無しさん
2009/02/01(日) 22:36:00怪しい箇所だけのプログラムを作ってみるといいかも(ここでは>>766の部分)
表示されればここ以外に問題がある。
0782デフォルトの名無しさん
2009/02/01(日) 22:37:170783デフォルトの名無しさん
2009/02/01(日) 22:46:190784デフォルトの名無しさん
2009/02/01(日) 22:53:40自分で怪しいところを抜き出して単独で試せるようになったのなら、それは大進歩。がんがれ。
0785デフォルトの名無しさん
2009/02/01(日) 22:54:41意図通りにうごいてるか確認すればいい。
0786デフォルトの名無しさん
2009/02/01(日) 22:58:19未初期化ポインタの使用もしくはバッファオーバーフローが濃厚
0787デフォルトの名無しさん
2009/02/01(日) 23:34:36エラーの原因がなんとなくわかりました。
a[1000][1000]という巨大な2次元配列を定義したのでstack over flowだということがわかりました。
このような配列を定義しないために、プログラムの根本から見直す必要があるのでしょうか・・・。
0788デフォルトの名無しさん
2009/02/01(日) 23:38:40釣り乙
0789デフォルトの名無しさん
2009/02/01(日) 23:38:40val1 = a[i*1000+j];
a[i*1000+j] = val2;
0790デフォルトの名無しさん
2009/02/01(日) 23:46:230791デフォルトの名無しさん
2009/02/01(日) 23:52:33二次元配列で書けないの?w
0792デフォルトの名無しさん
2009/02/01(日) 23:53:350793デフォルトの名無しさん
2009/02/01(日) 23:56:36二次元配列で書くの?w
0794デフォルトの名無しさん
2009/02/01(日) 23:58:040795デフォルトの名無しさん
2009/02/02(月) 00:00:410796デフォルトの名無しさん
2009/02/02(月) 00:01:450797デフォルトの名無しさん
2009/02/02(月) 00:03:420798デフォルトの名無しさん
2009/02/02(月) 00:05:31int *p; p = (int) malloc( 1000*1000*sizeof(int) );
一つの2次元配列風表現手段
0799デフォルトの名無しさん
2009/02/02(月) 00:09:250800デフォルトの名無しさん
2009/02/02(月) 00:09:36静的に決まる場合は配列へのポインタを使う方が楽
0801デフォルトの名無しさん
2009/02/02(月) 00:10:180802デフォルトの名無しさん
2009/02/02(月) 00:16:37きがくるったのか
0803デフォルトの名無しさん
2009/02/02(月) 00:24:00でいいだろ
0804デフォルトの名無しさん
2009/02/02(月) 00:25:11それで大丈夫な場合もあるだろうね
0805デフォルトの名無しさん
2009/02/02(月) 01:15:33それヒープにとられるんだっけ?
0806デフォルトの名無しさん
2009/02/02(月) 01:17:240807デフォルトの名無しさん
2009/02/02(月) 01:20:260808デフォルトの名無しさん
2009/02/02(月) 01:22:400809デフォルトの名無しさん
2009/02/02(月) 01:23:01現在のPC環境でその程度のメモリをスタックに確保して落ちることは
余り無いと思うのだが....
ちなみに初期状態はすごく小さい量だが、積むと自動的にOSが
拡張してくれる。
0810デフォルトの名無しさん
2009/02/02(月) 01:27:42静的領域。プログラムのロード時にローダーが確保してくれるよ、VCの場合。
0811デフォルトの名無しさん
2009/02/02(月) 01:32:00http://www9.plala.or.jp/sgwr-t/c/sec12.html
>「静的領域」には、外部変数や静的変数が置かれます。
0812デフォルトの名無しさん
2009/02/02(月) 01:43:55再帰呼出とかマルチスレッドとかで問題が出るかも
>>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);
}
0813デフォルトの名無しさん
2009/02/02(月) 01:48:22Windows+VCだと標準は1MB
http://msdn.microsoft.com/ja-jp/library/8cxs58a6.aspx
0814デフォルトの名無しさん
2009/02/02(月) 02:04:24再起呼び出し関数でも汎用関数でも、関数に対して1回分しか割り当てられないよな?
0815デフォルトの名無しさん
2009/02/02(月) 02:14:41そうですね。同じ領域を使いまわすことになりますね
0816デフォルトの名無しさん
2009/02/02(月) 02:16:04値設定し、printf出力したけど何とも無かったぞ。無事に実行された。
ちなみにメモリ512M /PPC400MHzという10年前のスペックのPCだが.
0817デフォルトの名無しさん
2009/02/02(月) 02:19:260818デフォルトの名無しさん
2009/02/02(月) 02:30:38・例えば画像データで
IMAGE[2200][1900][3];の確保をmallocは1回で確保可能なのか?それとも数回なのか?
・この手の変数を宣言していい回数は、動かす環境のメモリの空きだけに依存か?
・あと、c++のnewみたいに、malloc以外なんかいい物ある?
0819デフォルトの名無しさん
2009/02/02(月) 02:41:48自作関数でおk
確保自体は一回でもできるけど、分けたほうが分かりやすい
0820デフォルトの名無しさん
2009/02/02(月) 07:18:53呼び出しされるたびに領域が確保される
0821デフォルトの名無しさん
2009/02/02(月) 08:12:13分けるってどうするつもり?
0822デフォルトの名無しさん
2009/02/02(月) 09:35:23int **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);
}
0823デフォルトの名無しさん
2009/02/02(月) 10:06:080824デフォルトの名無しさん
2009/02/02(月) 13:31:24main()の外に置いたらグローバル変数。一般的も何も、普通にアクセスできる。
0825デフォルトの名無しさん
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;
}
0826デフォルトの名無しさん
2009/02/02(月) 14:14:54scanf()で%cを使うと、Sに続いて入力した改行文字を拾わないで放置してしまうのです。
その文字が、次のscanf()で拾ってしまうので、1行余計になってしまうのです。
取り敢えずscanf()の後にgetchar()を入れておけば巧くいくことでしょう。
但し、実用的には余りいい解決法ではありませんが。
0827デフォルトの名無しさん
2009/02/02(月) 14:25:160828デフォルトの名無しさん
2009/02/02(月) 14:56:300829デフォルトの名無しさん
2009/02/02(月) 14:57:130830825
2009/02/02(月) 16:18:40なるほど!リターンキー押した時点で、改行文字まで取り込んでしまっているのだけど
scanfは一文字しかもって行ってくれないので改行文字が
バッファ?に残っているんですね。
ためしに、getchar()でとりだしてバッファから消した文字をprintf
したら一行改行されていました。納得です。
>>827
文字数制限できるfgetsでリターンキーの改行文字もふくめ読み込んでしまった後に
sscanfでそれを料理するという感じなのでしょうか。
今後はこの組み合わせで行きたいと思います。
>>828-829
これは入力チェックにつかえるわけですよね。「英大文字でない場合」という
のは正規表現というので、実現するんでしょうか。
気持ち的には
if(c != [A-Z]) 的な???ものと予想しますが、「char型の変数」と「英大文字ではない
という表現」をどう結びつければ見当もつきません。。。
この辺は全然わからないですが避けては通れないのでがんばりたいと
思います。
皆様ご教示大変に助かりました。僅かですが前進できたような気がします。
ありがとうございました。
0831825
2009/02/02(月) 16:23:09ですね、すみません。
0832デフォルトの名無しさん
2009/02/02(月) 16:23:33(ASCIIコードで A-Z が連続していることを前提に)
if (c < 'A' || c > 'Z') { /* 英大文字でない */ }
0833デフォルトの名無しさん
2009/02/02(月) 16:26:28○ 処理対象の文字コードで
0835デフォルトの名無しさん
2009/02/02(月) 16:40:51isupper() を使ってくれ
0836デフォルトの名無しさん
2009/02/02(月) 16:42:010837デフォルトの名無しさん
2009/02/02(月) 17:05:470838825=834
2009/02/02(月) 17:19:12ctype.hをインクルードすればいいと今知りました。
大変便利ですね、使わせていただきます。
>>837
かなり便利なものがそろっていますね。
C言語は相当スパルタンな印象があったので意外(失礼)でした。
C言語の勉強、ちょっとやっては長い間サボり、というのを繰り返してきましたが
今日を機会にがっつりと勉強したいと思います。
0839デフォルトの名無しさん
2009/02/02(月) 17:54:39呼び出される度に領域確保されてたら、staticの意味ないだろ。
アドレス持ち出し忘れたら、ただのゴミでしかない。
0840デフォルトの名無しさん
2009/02/02(月) 18:38:000841デフォルトの名無しさん
2009/02/02(月) 18:50:34コンソールアプリケーションを作成する際、
main関数も他の関数とほぼ同様に扱われるそうですが、
プログラム内で、main関数を呼び出して御利益のあるプログラム例ってありますか?
0842デフォルトの名無しさん
2009/02/02(月) 18:51:377行プログラミング
0843デフォルトの名無しさん
2009/02/02(月) 19:38:11ユーザプログラム内でmain()を呼び出すのは避けた方がいい。
ごりやくはあってもりえきを損ないかねない。
0844デフォルトの名無しさん
2009/02/02(月) 20:11:45ない
0845デフォルトの名無しさん
2009/02/02(月) 22:05:43コードゴルフ
0846デフォルトの名無しさん
2009/02/02(月) 22:25:52とてもおすすめできない
0847デフォルトの名無しさん
2009/02/02(月) 22:50:56#include"aaa.h"
int aaa();
int abc;
int main(void)
{
aaa();
return 0;
}
//// aaa.h /////
int aaa()
{
abc = 1;
}
こうすると 関数aaaのabc
が未定義となるのですが良い
方法はないですか?
0848デフォルトの名無しさん
2009/02/02(月) 22:51:480849デフォルトの名無しさん
2009/02/02(月) 22:52:24使わない方がいいよ。
ローカル変数を引数で渡すのが良い。
0850デフォルトの名無しさん
2009/02/02(月) 22:57:55ヘッダに関数定義を書くな
0851デフォルトの名無しさん
2009/02/02(月) 23:07:42aaa.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;
}
0852デフォルトの名無しさん
2009/02/02(月) 23:09:01aaa()の本体は、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ファイル間での矛盾を起こさないためである。
0853デフォルトの名無しさん
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;
}
0855デフォルトの名無しさん
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;
}
0856デフォルトの名無しさん
2009/02/02(月) 23:55:380857デフォルトの名無しさん
2009/02/03(火) 21:08:47コマンドラインから一桁の数字を入力し
「あなたの入力した数字は○です」
と返すプログラムは作りたいのですが、難しいでしょうか
0858デフォルトの名無しさん
2009/02/03(火) 21:17:43簡単でしょう
0859デフォルトの名無しさん
2009/02/03(火) 21:18:34コマンドライン引数で与えるならプログラム経験皆無なら少々遠い。
自作関数作れるなら(main 引数)でググればなんか出てくる。
0860デフォルトの名無しさん
2009/02/03(火) 21:25:35ありがとうございます
頑張ってみます
0861デフォルトの名無しさん
2009/02/03(火) 22:24:45int main()
{
int num;
scanf("%d", &num);
printf("あなたの入力した数字は%dです");
return 0;
}
0862デフォルトの名無しさん
2009/02/03(火) 22:30:370863デフォルトの名無しさん
2009/02/03(火) 23:05:280864デフォルトの名無しさん
2009/02/03(火) 23:07:490865デフォルトの名無しさん
2009/02/03(火) 23:09:010866デフォルトの名無しさん
2009/02/03(火) 23:09:320867デフォルトの名無しさん
2009/02/03(火) 23:10:030868デフォルトの名無しさん
2009/02/03(火) 23:10:490869デフォルトの名無しさん
2009/02/03(火) 23:12:00よそへいって愛でて来いよ
0870デフォルトの名無しさん
2009/02/03(火) 23:13:130871デフォルトの名無しさん
2009/02/03(火) 23:15:320872デフォルトの名無しさん
2009/02/03(火) 23:24:290873デフォルトの名無しさん
2009/02/03(火) 23:32:330874デフォルトの名無しさん
2009/02/03(火) 23:39:450875デフォルトの名無しさん
2009/02/03(火) 23:41:590876デフォルトの名無しさん
2009/02/03(火) 23:49:43C++ VS D・・・ ですね。期待してます。
初心者の扱うC言語の方が、ずっとOSには強敵だぞ。
0877デフォルトの名無しさん
2009/02/04(水) 03:10:46内容は
ユーザーに入力させた文字列(半角英数
字)をchar型配列にいれ、1文字ずつずら
して表示させるプログラムを作成せよ。
入力された順番と同じになったら表示終了。
要するに、
ABCDEってあったら次に
BCDEAって1つずつずらして、最後にABCDEに戻ったら表示してプログラムを終了。
というのを作成したいのですがちっともわかりません。。。ご教授おねがいします。
0878デフォルトの名無しさん
2009/02/04(水) 03:16:360879デフォルトの名無しさん
2009/02/04(水) 03:21:02宿題なら宿題スレ行った方がいいと思うよ
0880デフォルトの名無しさん
2009/02/04(水) 04:44:24まずどこまでなら出来るのか言え
0881デフォルトの名無しさん
2009/02/04(水) 08:07:02unsigned len = strlen(str);
for (unsigned ic = 0; ic < len; ++ic) {
sprintf("%.*s%.*s\n", len - ic, & str[ic], ic, str);
}
0882デフォルトの名無しさん
2009/02/04(水) 10:11:23何がしたいのかもわからん
0883デフォルトの名無しさん
2009/02/04(水) 10:25:42>881は>877へのレスだろうね。
つーか、誰かやるとは思ったが……
0884デフォルトの名無しさん
2009/02/04(水) 10:44:37リテラルを上書きしようとしてるし、フォーマットでもないアドレスをキャストなしで喰わせようとしている。
イカレテルとしか思えないが・・・?
0885デフォルトの名無しさん
2009/02/04(水) 10:47:450886デフォルトの名無しさん
2009/02/04(水) 10:52:530887デフォルトの名無しさん
2009/02/04(水) 11:01:28そのツモリで書いたとしたら、図抜けたマヌケだな。
0888881
2009/02/04(水) 11:06:08そそ。
>>884>>887
どの辺りが間抜けなのか詳しく。まさかとは思うが、"%.*s"の意味も判らずレスしてないよね?
# どうも、変に日本語をカタカナで書きたがる人種は要領を得ない文章を書くから困る。
↓以下、ナンバーサインがどうのこうのと逆切れレスがつくと予測。
0889デフォルトの名無しさん
2009/02/04(水) 11:11:07肝腎の>877の要求に見合う方針かどうかは別として。
>↓以下、ナンバーサインがどうのこうのと逆切れレスがつくと予測。
甘いな。つーか、召喚すなw
0890デフォルトの名無しさん
2009/02/04(水) 11:13:430891デフォルトの名無しさん
2009/02/04(水) 11:23:59マニュアルページなりリファレンス本なりをちゃんと読むべき。
とは言え、レスの性質上一応解説。
簡単に言うと整数型引き数の数値で出力カラム数を制限できる。
応用例は、まさしく>881。
簡単な例と出力はこんな感じ。
printf("%.*s", 5, "abcdefghi")→abcde
制限より短い入力に対しては影響しない。
printf("%.*s", 3, "ab")→ab
尚、バッファオーバラン防止などの為に固定長で制限すればいい場合はフォーマットで指定すればいい。
printf("%.3s", "abcde")→abc
0892デフォルトの名無しさん
2009/02/04(水) 11:26:40蛇足ながら、"%*.*s"とすると短い文字列は空白を追加し長い文字列は制限できるので
固定長フォーマットでの出力に便利。
0893デフォルトの名無しさん
2009/02/04(水) 11:50:210894デフォルトの名無しさん
2009/02/04(水) 12:16:46>>877
>ユーザーに入力させた文字列
>最後にABCDEに戻ったら表示して
くらいか。
0895デフォルトの名無しさん
2009/02/04(水) 12:38:210896デフォルトの名無しさん
2009/02/04(水) 12:40:400897デフォルトの名無しさん
2009/02/04(水) 14:44:23がどうしてもわかりません
#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がわかりません.お願いします
0898897です
2009/02/04(水) 14:47:22void push (int num)
struct node *n;
n= (struct node *)malloc(sizeof *n);
n->key =num;
n->next = TOP.nex
でした.すみません
0899デフォルトの名無しさん
2009/02/04(水) 15:13:580900デフォルトの名無しさん
2009/02/04(水) 15:21:31d=(a/b)*100;
fprintf(fp,"%d %d %f\n",b,a,d);
これでa,bは正しく書かれるんだけど、dは0.00000になってしまいます。
実際に計算しても0にはなりません。
0901881
2009/02/04(水) 15:25:05宿題スレじゃないんだから丸々書く必要もないでしょ。
最後にってのはforの条件をic <= lenにすればOK。
つーか、ヒントだけ書いたつもりを間抜けってのもなぁ。
他人(ひと)に対してそこまで悪し様に言うのほどのものかね。
# 元質が帰ってこないから役に立ったかどうかは判らんがw
>>897
皆目見当つかないなら、教官を拝み倒してでも復習すればいいじゃん。
多少なりとも見当ついているなら書いてみればいいじゃん。
丸投げしたいなら宿題スレに書けばいいじゃん。
0902デフォルトの名無しさん
2009/02/04(水) 15:26:26a, b,が整数型(int)なら、d = (double) a / b * 100で。
0903デフォルトの名無しさん
2009/02/04(水) 15:26:32まず、リストの先頭を保持する方法がおかしい。
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。
0904デフォルトの名無しさん
2009/02/04(水) 15:33:02みんな攻めちゃだめ。よく中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するのもポインタっぽいけどね。
0905デフォルトの名無しさん
2009/02/04(水) 15:34:10ちゃんとdをdouble型の変数で定義してあります。
0906デフォルトの名無しさん
2009/02/04(水) 15:34:210907デフォルトの名無しさん
2009/02/04(水) 15:35:01>a, b,が整数型(int)なら、d = (double) a / b * 100で。
にほんごわかりますか?
0908デフォルトの名無しさん
2009/02/04(水) 15:47:230909デフォルトの名無しさん
2009/02/04(水) 16:09:02相当ひどいコードをお書きになる
0911デフォルトの名無しさん
2009/02/04(水) 16:22:03あ、わかりました。ありがとうございます。
にほんごがわかるのでにほんごできいたんです。
0912デフォルトの名無しさん
2009/02/04(水) 16:49:24( 例題2 ) 『あの〜、scanf("%c",&chocolate);、教えてお願い。』
選択肢 : (1) 日本語 、(2) 英語、 (3) コムギコカナンカダ (4) その他( )
0913デフォルトの名無しさん
2009/02/04(水) 16:52:09日本語でおk
0914デフォルトの名無しさん
2009/02/04(水) 16:55:34コムギコカナンカダでおk
0915デフォルトの名無しさん
2009/02/04(水) 17:44:12この無様なコードがナンバーサインを騙っているのか、本人なのか分からないが、
無様なのだけは確か。
0916デフォルトの名無しさん
2009/02/04(水) 18:15:19「それはヨーグルトですか?」 → 「いいえ、ケフィアです」
は、このスレでは、
「それはC言語ですか?」 → 「いいえ、コムギコカナンカダ」
となるのですね?
0917デフォルトの名無しさん
2009/02/04(水) 18:35:350918デフォルトの名無しさん
2009/02/04(水) 21:14:38ポインタ使ってみた。
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');
}
0919デフォルトの名無しさん
2009/02/04(水) 22:05:13scanf("%s", str);
for(p = str; p != '\0'; p++);
do{
0920デフォルトの名無しさん
2009/02/04(水) 22:45:14unixのコマンド tail -f に該当する機能をC(Visual Studio)で実現したいのですが、
ロジック的にどんな感じになるのか教えていただけないのでしょうか?
短い周期で、前回との差分分を追加出力させればなんとか実現できそうですが、
処理に時間がかかりそう気がします。
0921877
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;
}
指摘ください。。
0922877
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;
}
指摘ください。。
0923デフォルトの名無しさん
2009/02/04(水) 22:57:270924デフォルトの名無しさん
2009/02/04(水) 23:13:58#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;
}
0925デフォルトの名無しさん
2009/02/04(水) 23:26:08{
int i;
char temp = *c;
for(i=1; i<cnum; i++) c[i-1] = c[i];
c[i-1] = temp;
}
でいいじゃん。
0926デフォルトの名無しさん
2009/02/04(水) 23:30:05こんなんでどう?
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");
}
}
0927デフォルトの名無しさん
2009/02/04(水) 23:34:040928デフォルトの名無しさん
2009/02/04(水) 23:42:18探してみたのですが、Linux用しかみつかりません。
コンパイラはBCCを使っています
0929デフォルトの名無しさん
2009/02/04(水) 23:43:130930デフォルトの名無しさん
2009/02/04(水) 23:43:24#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;
}
0931デフォルトの名無しさん
2009/02/05(木) 00:08:15標準入力に向けて口開けて待つ
餌が来たら標準出力にはき出す
0932931
2009/02/05(木) 00:09:040933デフォルトの名無しさん
2009/02/05(木) 01:24:19#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;
}
0934894
2009/02/05(木) 09:44:58や、俺 >>887 じゃないから知らんけど。
おれ自身、速度が問題にならないときは
sprintf で文字列操作なんてしょっちゅうやるし。
>>904
その糞汚いコードは教育上宜しくない。
>printf(P);
論外。入力文字列が "X%X" だったらどうなるか試してみるといい。
>>915
その必死さが寧ろ無様。
0935デフォルトの名無しさん
2009/02/05(木) 10:30:23> sprintf で文字列操作なんてしょっちゅうやるし。
そんな話じゃないだろ
0936デフォルトの名無しさん
2009/02/05(木) 10:32:11っていうか、コイツ最近になってC系のスレッドに出入りしている、
コンパイルもかけないでコード貼り付けてくヤツだろ。
単なる釣りじゃなくて、本物のマヌケだったんだよ。
0937デフォルトの名無しさん
2009/02/05(木) 13:37:100938デフォルトの名無しさん
2009/02/05(木) 13:44:18ウインドウがとじてしまうのですがどうすればウインドウを
消せなくできるのでしょうか?
0939デフォルトの名無しさん
2009/02/05(木) 13:45:100940デフォルトの名無しさん
2009/02/05(木) 13:48:210941デフォルトの名無しさん
2009/02/05(木) 13:50:540942デフォルトの名無しさん
2009/02/05(木) 13:52:430943デフォルトの名無しさん
2009/02/05(木) 13:54:340944938
2009/02/05(木) 14:00:39メイク → 実行 ではちゃんと結果が出てウインドウ
は閉じません。
しかし、このプログラムのフォルダ(Debugフォルダ)にある
exeファイルを起動すると結果が出た瞬間に閉じてしまいます。
0945デフォルトの名無しさん
2009/02/05(木) 14:00:58(=main 先頭で止まる)
0946デフォルトの名無しさん
2009/02/05(木) 14:01:48コマンドプロンプトから実行する。
0947938
2009/02/05(木) 14:20:43クリック起動だけでは駄目なんですね・・・
0948デフォルトの名無しさん
2009/02/05(木) 14:41:10*.exe
pause
で、実行は*.batからってのが一番簡単なんじゃないか。
0949デフォルトの名無しさん
2009/02/05(木) 20:25:18cmd /k "c:\〜\program.exe"
が一番簡単。
0950デフォルトの名無しさん
2009/02/06(金) 22:30:07私はWindowsXPでCygwinを使ってC言語を勉強しています。
ネットで調べてインストールと環境変数の設定まではうまくいきました。
test.cというプログラムを作って
コマンドプロントで gcc test.c と打ちコンパイルして a.exeが生成されました。
そしてa.exeはちゃんと実行できたのです。
問題はここからです。
別のプログラムをコンパイルしても常に生成されるファイルがa.exeになってしまいます。
新しいファイルは生成されず上書きされてしまうのです。
解決策を教えてください。
0951デフォルトの名無しさん
2009/02/06(金) 22:33:280952デフォルトの名無しさん
2009/02/06(金) 22:33:36gcc --help
0953デフォルトの名無しさん
2009/02/06(金) 22:36:12gcc -o hoge.exe hoge.c
オプションの詳細は「man gcc」を実行。(※英語)
あと、Cygwinには標準で「test」って名前のコマンドがあるので注意。
0954デフォルトの名無しさん
2009/02/06(金) 22:36:550955デフォルトの名無しさん
2009/02/06(金) 22:38:53c = a / b;
と割り算したいのですが、
cには小数切り上げた整数を入れたいのです。
c = (int)(a(double) / b + 0.99999999);
↑
こんなん思いついたのですが、0.99999999では完璧ではありません・・・
(a÷bが3.0000000000000000001だった場合等)
そこで諸先輩のお知恵をお貸し頂きたい!
0956デフォルトの名無しさん
2009/02/06(金) 22:41:380958デフォルトの名無しさん
2009/02/06(金) 22:45:540959>>950
2009/02/06(金) 22:47:02アドバイスどおりやったら出来ました。
0960デフォルトの名無しさん
2009/02/06(金) 22:47:59笑ってる意味が誰にもわからない
駅前のあぶないオヤジと同じ
0961デフォルトの名無しさん
2009/02/06(金) 22:51:020962デフォルトの名無しさん
2009/02/06(金) 22:52:49ポインタがわからなくて挫折したんだな
0963デフォルトの名無しさん
2009/02/06(金) 22:55:320964デフォルトの名無しさん
2009/02/06(金) 22:57:16都市伝説。
0965デフォルトの名無しさん
2009/02/06(金) 23:32:180966デフォルトの名無しさん
2009/02/06(金) 23:32:340967デフォルトの名無しさん
2009/02/06(金) 23:32:38俺とか。
0968デフォルトの名無しさん
2009/02/06(金) 23:41:340969デフォルトの名無しさん
2009/02/06(金) 23:51:290970デフォルトの名無しさん
2009/02/07(土) 00:19:320971デフォルトの名無しさん
2009/02/07(土) 00:27:000972デフォルトの名無しさん
2009/02/07(土) 00:28:330973デフォルトの名無しさん
2009/02/07(土) 00:43:030974デフォルトの名無しさん
2009/02/07(土) 00:48:10日本銀行は銀行の銀行だけどダブル銀行って呼んだらおかしいだろ?
0975デフォルトの名無しさん
2009/02/07(土) 00:49:490976デフォルトの名無しさん
2009/02/07(土) 00:56:25↑に限った話じゃないが、セミコロン単体がソースに入っててもコンパイルするけど
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は当たり前か?
でも全体的にどこかパッとしない。
0977デフォルトの名無しさん
2009/02/07(土) 01:01:00空文を使うと、終了条件満たすまでずっとループしたい場合に
while(MainLoop())
;
なんてことができたりする。
個人的には
while(MainLoop()) {
/* 終了条件満たすまでひたすらループ */
}
みたいに書くけど。
0978デフォルトの名無しさん
2009/02/07(土) 01:44:54でも、
「void型」=「何も返さない」 、 「空白」=「何もない」=「void型と同処理」
だと思ってたんですが、
『空白+セミコロン』は空文だとして、『空白+演算子+値』はどれもエラー、『void+順次演算子+void』は正常。
が腑に落ちない・・・と思ったんですけど、フリーフォーマットを逆算して考えると解決っぽいですね。
0979デフォルトの名無しさん
2009/02/07(土) 02:00:410980デフォルトの名無しさん
2009/02/07(土) 02:31:54式と文を混同しているな。
文は式文、宣言文、複合文、制御文、ラベル付き文、空文の6つに分けられる。
・ 式文 式にセミコロンを付けたもの。
・ 宣言文 変数、型などの宣言を行う文。
・ 複合文 複数の文を { } で囲んだもの。
・ 制御文 if 文, for 文, while 文など。
・ ラベル付き文 文にラベルをつけたもの。(このため、ラベルの次には必ず文が必要になる)
・ 空文 セミコロンのみの文。
void 型の関数呼び出しは式文に当たる。
例えば void foo(void); という関数があった場合、
foo() という式があって、それにセミコロンをつけて foo(); という式文になる。
foo() という式の型は void 。void 式とか言うこともある、立派な式だ。
空文は式にセミコロンをつけたものではないので、式文ではない。
式文と空文は文法上厳密に区別される。
0981デフォルトの名無しさん
2009/02/07(土) 02:37:050982デフォルトの名無しさん
2009/02/07(土) 02:40:36for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
for(k = 0; k < n; k++) {
if(hoge) goto BREAK2;
}
}
BREAK2:; ←これ
}
0983デフォルトの名無しさん
2009/02/07(土) 02:41:160984デフォルトの名無しさん
2009/02/07(土) 02:51:16変数、関数は、その宣言や定義(関数定義では { } の外)に現れるものを除く。
0985デフォルトの名無しさん
2009/02/07(土) 03:24:460986976
2009/02/07(土) 04:13:19すごく分かりやすかったです!式・文の区別はしてたつもりでしたが
おそらく、コンパイラは内部的に空文をvoid型の式文に変換すると考えてました。
文の読み取りで空白をvoidに置き換えるなら、式でもvoidを扱える条件演算子が機能しない理由は?という風に。
ところで、セミコロンは文の終わりを指しますが、文は必ずしもセミコロンで終わるわけではないですよね。
if(/*此処*/) for(i=0;i<N;/*此処*/) while(/*此処*/) が、疑問として残ってます。
あと、switch文やgoto文でループ内にでも強制的に入れますが、
for(i=0;i<N;i++) FLAG: { /*処理*/ } ができる理由が分かりました。
しかし、forの引数にあたる部分(括弧内)は、文ですよね?
空文・式文は入れてラベル付き文が入れないのが、しっくり来ないです。
今までただただ仕様、と考えてましたが・・・・(飛ぶなよ、ってのは確かですけど)
0987デフォルトの名無しさん
2009/02/07(土) 05:16:05式にセミコロンをつけたものが式文
それだけのこと。
文は文だから、上記2つの「セミコロンで終わる文」も含めて、全て「文」。
for文は、「for (式;式;式) 文」という形の文法が規定されていて、
区切りとしてセミコロンが採用されているだけ。
0988デフォルトの名無しさん
2009/02/07(土) 06:47:410989デフォルトの名無しさん
2009/02/07(土) 07:53:190990デフォルトの名無しさん
2009/02/07(土) 08:24:06C言語なら俺に聞け(入門篇) Part 44
http://pc11.2ch.net/test/read.cgi/tech/1233962622/
0991デフォルトの名無しさん
2009/02/07(土) 11:11:270992デフォルトの名無しさん
2009/02/07(土) 12:58:03単にポインタと言った場合には文脈で判断する必要がある。
もちろん、ポインタ値とポインタ変数は区別して呼ぶのがより良いが、
それはポインタに限った話ではない。
0993デフォルトの名無しさん
2009/02/07(土) 13:34:580994デフォルトの名無しさん
2009/02/07(土) 13:44:380995デフォルトの名無しさん
2009/02/07(土) 15:33:43if (a, b) hoge(); の , はコンマ演算子で、
foo(a, b); の , は関数呼び出し演算子の一部としての扱いになる。
従って >>984 で既に説明されている。
0996デフォルトの名無しさん
2009/02/07(土) 15:38:03C99 では for 文は for(初期化文 式; 式) 文 と定義されてたと思う。
初期化文に書けるのは、式文と宣言文と空文だけだけど。
0997デフォルトの名無しさん
2009/02/07(土) 16:27:330998デフォルトの名無しさん
2009/02/07(土) 16:28:59for(;;)について言えば、初期化文が空文で済むが、あとの式が空でもいいのか?
0999デフォルトの名無しさん
2009/02/07(土) 16:41:28後の2つの部分は式(ただし省略可)というような定義のはず。
1000デフォルトの名無しさん
2009/02/07(土) 16:47:34,―-、 .| ./''i、│ r-,,,,,,,,,,,,,,,,,,,,,,,,―ー. ゙l, `"゙゙゙゙゙ ̄^ \
/ \ ヽ,゙'゙_,/ .゙l、 `i、 \ _,,―ー'''/ .,r'"
.,,,、.,,i´ .,/^'i、 `'i、`` `--‐'''''''''''''''"'''''''''''゙ `゛ .丿 .,/
{ "" ,/` ヽ、 `'i、 丿 .,/`
.ヽ、 丿 \ .\ ,/′ 、ヽ,,、
゙'ー'" ゙'i、 ‘i、.r-、 __,,,,,,,,--、 / .,/\ `'-,、
ヽ .]゙l `゙゙゙゙"゙゙゙゙ ̄ ̄ `'i、 ,/ .,,/ .ヽ \
゙ヽ_/ .ヽ_.,,,,--―――――ー-ノ_,/゙,,/′ ゙l ,"
` ゙‐''"` ゙'ー'"
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。