C言語なら俺に聞け(入門編)Part 104at TECH
C言語なら俺に聞け(入門編)Part 104 - 暇つぶし2ch855:デフォルトの名無しさん
12/08/05 05:05:20.29
初心者がエラーメッセージをちゃんと読んで理解するかよw

856:685
12/08/05 05:24:21.33
>>855
ここに投げてみるとか、codepad/ideone の結果を貼り付けてみるとか。
初学者のはまる点であれば、ここでなんとかなるんじゃない?

857:デフォルトの名無しさん
12/08/05 05:35:40.54
>>639
>>643

858:デフォルトの名無しさん
12/08/05 06:09:52.40
しかし初心者ほど「エラーが出ます」としか言わないのであった

859:デフォルトの名無しさん
12/08/05 06:33:42.02
C++のテンプレートとかエラーメッセージ自体が意味不明だったりするけど

860:デフォルトの名無しさん
12/08/05 06:34:54.30
初心者の独学の話をしてるんじゃないの?

861:デフォルトの名無しさん
12/08/05 06:36:02.61
URLリンク(ideone.com)
初心者によくありがちなコンパイルエラー

862:デフォルトの名無しさん
12/08/05 07:34:32.47
>>861
ねぇよ


863: ◆QZaw55cn4c
12/08/05 09:45:29.15
>>857
これは痛いところを突かれましたね。

確かにURLリンク(codepad.org)は今でも説明不能。
手元のgcc4 は 0. 000000 を表示することから >>653 + double拡張が妥当ではあるのですが、
それじゃcodepad はどんなことになっているのか?

864:デフォルトの名無しさん
12/08/05 10:13:57.76
%fで8バイト必要なのに4バイトしか積んでないから
つまり>>663の4番目と6番目

865:デフォルトの名無しさん
12/08/05 10:24:52.91
% よりも - の方が優先順位が高いので

10 % 3 - 1.0 < 4.0 ? 1 : 0;



10 % (3 - 1.0) < 4.0 ? 1 : 0;

と解釈され、剰余演算子にdouble型を適用しようとするので
コンパイルエラーになるはずなんだけどなあ

866: ◆QZaw55cn4c
12/08/05 10:41:02.47
>>864
なるほど、いったんスタックをお掃除すると結果がかわるというわけですね。
>663 を codepad にかけてみました。
URLリンク(codepad.org)

1番目の結果を出すとき、ゴミはいったいなんなんだ?

867:デフォルトの名無しさん
12/08/05 10:48:07.87
>% よりも - の方が優先順位が高いので
単項演算子の-と二項演算子の-との区別がつかないおバカさん?

868:デフォルトの名無しさん
12/08/05 10:56:01.96
printf("%f\n", 10 % 3 - 1.0 < 4.0 ? 1.0 : 0.0);

とするとちゃんと1.000000と表示される所から見て、整数→倍精度浮動小数点数
への格上げはされてない(当たり前か)

869:デフォルトの名無しさん
12/08/05 11:22:28.30
URLリンク(ideone.com)
printf()を連続で呼ぶと前の引数が残るからアクロバティックなコーディングが出来る
やらないけど

870:デフォルトの名無しさん
12/08/05 11:27:22.05
>>866
URLリンク(codepad.org)

871:デフォルトの名無しさん
12/08/05 11:33:13.47
>>869
これアクロバティックと言わずに「undefined」と言おうよ

>>870
intでdouble型の表示をしようとすると結果はやはり「undefined」だろうな

printf("%f\n", 1); とやってるのと同じだもん

872:デフォルトの名無しさん
12/08/05 11:51:59.18
そういえばDOSの時代に関数ポインタを取得して、そこにディスク上から別の関数を
上書きして走らせるというキチガイ沙汰なプログラムが立派に商用に使われていたな

もちろん後から上書きする関数の大きさは前の関数よりもサイズが小さくないと
次の関数の頭まで消してしまうし、引数も同じにしとかないとコンパイルが出来ない

これも未定義なんだけど、メモリの少ない時代は仕方がなかったんだろうな

873:デフォルトの名無しさん
12/08/05 11:54:53.01
union
{
char c[8];
double d;
} u;
u.c[0] = 0x66;
u.c[1] = 0x68;
u.c[2] = 0x3c;
u.c[3] = 0x11;
u.c[4] = 0xc4;
u.c[5] = 0x59;
u.c[6] = 0x01;
u.c[7] = 0x40;
printf("%f\n", u.d);
u.c[0] = 0x00;
u.c[1] = 0x00;
u.c[2] = 0x00;
u.c[3] = 0x00;
printf("%f\n", u.d);

874:デフォルトの名無しさん
12/08/05 11:58:44.74
>>872
メモリの無い時代、別にオーバーレイは常套手段だったろ。

875: ◆QZaw55cn4c
12/08/05 12:35:11.54
>>870
おおー、thx
このやりかた、デバッグにつかえるかもしれないね

876:デフォルトの名無しさん
12/08/05 12:36:40.22
条件A, B, Cそれぞれにture falseがあり、条件の組み合わせで
それぞれに違う処理をさせたい場合、どういった書き方をするんでしょうか
真理値表で言うとこんな感じです
A B C
F F F -> n = ture
F F T -> m = ture
F T F -> l = true
<略>
T T T -> s = true
ifを使って、
if (a == false) && (b == false) && (c == false)
{
...
などと書くのが普通でしょうか。コレだと条件がD, E, ...と増えていくと
収集がつかなくなりそうで不安です。いい方法か、検索に役立つキーワードが
あれば教えて下さい。

877:デフォルトの名無しさん
12/08/05 12:43:11.67
ビットフラグ

878:デフォルトの名無しさん
12/08/05 13:13:19.18
関数型言語ってCの事ですか?

879:デフォルトの名無しさん
12/08/05 13:18:05.02
Cは手続型言語

880:433
12/08/05 13:23:49.15
>>832
832さんありがとうございます!
そのページのソースコードに記述されているstatic(きおくくらす?で合ってるのかな…?)をヒントにコンパイルエラーの謎を解明できました。
具体的な原因としてObjectルーチンを何度も通すプログラムを書いており、

struct s_int iobject ;

という構造体変数宣言を何度も行っている事が原因だったようで、これをヘッダー部分(main()以前)に書く事でコンパイルが正常に通りました。
またひとつ勉強になりました。ありがとうございますm(--)m

881:デフォルトの名無しさん
12/08/05 13:39:50.96
どういたしまして

882:デフォルトの名無しさん
12/08/05 13:47:48.09
>>880
URLリンク(ideone.com)
自動変数というのは自動的に領域の確保と解放をする変数で
初期化(あるいは代入)せずに参照すると値が不定となる

自動変数ではなく静的変数とするにはstaticを付けるかグローバル変数とする

883:デフォルトの名無しさん
12/08/05 14:56:49.16
ズルして楽して覚えても結局は言語仕様に戻る罠。
面倒でも暇を見てヘルプや仕様を読む癖をつけるのが良いと思うよ。

884:デフォルトの名無しさん
12/08/05 14:57:59.08
>>876
いろいろやりかたはあるが、条件を表にしておき関数ポインタを持っておくとか

オートマトンで使われるような状態遷移図にも似たような手法が使われる

885:デフォルトの名無しさん
12/08/05 15:29:21.79
#include <stdio.h>

#define _TRUE 1
#define _FALSE 0

int fff(void) { printf("%s\n", __func__); }
int fft(void) { printf("%s\n", __func__); }
int ftf(void) { printf("%s\n", __func__); }
int ftt(void) { printf("%s\n", __func__); }
int tff(void) { printf("%s\n", __func__); }
int tft(void) { printf("%s\n", __func__); }
int ttf(void) { printf("%s\n", __func__); }
int ttt(void) { printf("%s\n", __func__); }

int (*tbl[2][2][2])(void) ={
  { { fff, fft }, { ftf, ftt }, },
  { { tff, tft }, { ttf, ttt }, },
};

int main(void){
  (*tbl[_FALSE][_FALSE][_FALSE])();
  (*tbl[_FALSE][_FALSE][_TRUE])();
  (*tbl[_FALSE][_TRUE][_FALSE])();
  (*tbl[_FALSE][_TRUE][_TRUE])();
  (*tbl[_TRUE][_FALSE][_FALSE])();
  (*tbl[_TRUE][_FALSE][_TRUE])();
  (*tbl[_TRUE][_TRUE][_FALSE])();
  (*tbl[_TRUE][_TRUE][_TRUE])();
  return 0;
}

886:デフォルトの名無しさん
12/08/05 15:29:52.05
lenovo@LENOVO-0C414D26 ~
$ ./a.exe
fff
fft
ftf
ftt
tff
tft
ttf
ttt


887:433
12/08/05 17:00:58.51
>>882
自動変数と静的変数というのは一般的に言われる「変数」を噛み砕いたものという事でしょうか?

初期化しないままに参照するのは結果的にエラーを吐くのは分かったのですが、
初期化したものをその後に参照しようとしても参照できない場合があるのはなぜなのでしょう

やはりCの仕様なんでしょうか…

888:デフォルトの名無しさん
12/08/05 17:11:38.25
アドレスが違うか見てみれば

889:デフォルトの名無しさん
12/08/05 17:13:28.31
"スコープ"とか"変数の寿命"でググれや

890:デフォルトの名無しさん
12/08/05 17:54:40.51
>>887
URLリンク(ideone.com)

>自動変数と静的変数というのは一般的に言われる「変数」を噛み砕いたものという事でしょうか?
変数には大雑把にいって自動変数と静的変数がある

>初期化したものをその後に参照しようとしても参照できない場合があるのはなぜなのでしょう
初期化したつもりで自動変数を初期化してなかったので
「変数'iobject'が初期化されてないのに使われようとした」というエラー(警告?)になったのだと思われ

Run-Time Check Failure #3 - The variable 'iobject' is being used without being initialized.

891:433
12/08/05 18:16:14.23
返答早すぎですw多くのレスありがとうございます><
まだC言語は半月くらいの経験しかない身ではしたない部分があるにも関わらず多くアドバイスを頂き感謝し尽せないです。。。

>>890
初期化した場所が悪かったのか、初期化した後変数が別の変数に変わってしまったのか分かりませんがエラーの内容からすれば変数の初期化をする場所にルールがあるんじゃないか、とちょっと気づいてきました…(´・ω・`)

>>889
ブロックスコープという存在を知らなかった…orz
しかも私が今併用しているC言語入門書には書いていない件(tyow

>>888
ポインタですね^^
後々解析してみまぁす。ありがとうございます~

皆様、貴重なご教示ありがとうございました。

892:デフォルトの名無しさん
12/08/05 18:32:40.71
>>891
URLリンク(www9.plala.or.jp)

893:876
12/08/05 18:36:50.41
>>877, 884様
とりあえず今回は3条件T/Fで設計してしまったので、
ビットフラグで行こうと思います。
検索したらUMLとか状態遷移とかを解説しているページが
多く見られ、大変参考になりました。ありがとうございました。

894:デフォルトの名無しさん
12/08/05 18:45:27.84
はじめまして。
<=====の行がうまくいかないです。アドバイスお願いします。

int *po,ban,i;
po=&ban;
for(i=0;i<5;i++){
*(po+i)=i; /*<=====*/
}


895:デフォルトの名無しさん
12/08/05 18:51:18.64
とりあえず、がんばれ、と言っておこう

896:デフォルトの名無しさん
12/08/05 18:56:35.63
>>894
URLリンク(ideone.com)

897:デフォルトの名無しさん
12/08/05 18:56:57.06
はじめまして。
<=====の行がうまくいかないです。アドバイスお願いします。

int *po,ban,i;
po=&ban;
for(i=0;i<5;i++){
*(po+i)<=====i;
}

898: ◆QZaw55cn4c
12/08/05 19:08:48.26
>>894
URLリンク(ideone.com)

899:デフォルトの名無しさん
12/08/05 19:20:02.69
>>896
>>898
banを配列にしないとダメなんですね。
サンクス

900:デフォルトの名無しさん
12/08/05 19:29:40.53
自動変数は何が自動なんですか。手動変数もありますか。

901:デフォルトの名無しさん
12/08/05 19:30:21.98
ぽいぽいPOI!!!
ふぉいふぉいFOI!!!
カネ返せFOI!!!
カネ返せPOI!!!


902:デフォルトの名無しさん
12/08/05 19:34:03.62
全自動変数
半自動変数
手動変数

903:デフォルトの名無しさん
12/08/05 19:41:31.07
変数がメモリ上のどこにあるのかを考えろよw
答えはそこにある。

904:デフォルトの名無しさん
12/08/05 19:46:12.93
変数
固定変数
変動定数
定数

905:デフォルトの名無しさん
12/08/05 21:09:56.68
ふひひ

906:デフォルトの名無しさん
12/08/05 23:53:22.62
このスレ質問ても処理系は何?と聞いてごまかして答えてくれないよね。
専門知識を教えるのは億劫なんかね。

907:デフォルトの名無しさん
12/08/05 23:56:26.74
質問ても?

908:デフォルトの名無しさん
12/08/06 00:00:50.30
>>907
ゴミは黙れ

909:デフォルトの名無しさん
12/08/06 00:06:41.76
>>907
茶化すなよ

910:デフォルトの名無しさん
12/08/06 00:53:54.49
>>906
C言語は低レベルなので処理系聞かないと規格票の範囲でしか答えられないからです

911:デフォルトの名無しさん
12/08/06 01:05:43.22
>>908-909
失せろゴミ

912:デフォルトの名無しさん
12/08/06 01:29:45.60
>>906
いや、お前がゴミだから。

913:デフォルトの名無しさん
12/08/06 01:50:31.12
IDがでねー掲示板で何やってんだお前ら。。

914:デフォルトの名無しさん
12/08/06 01:51:54.79
↑馬鹿

915:デフォルトの名無しさん
12/08/06 01:57:04.14
('_')

916:デフォルトの名無しさん
12/08/06 02:08:19.48
知識は出し惜しみすんなよクズ
共有しないと意味ねーだろ

917:デフォルトの名無しさん
12/08/06 02:10:22.41
もうずっとプログラマ大杉

918:デフォルトの名無しさん
12/08/06 02:14:15.34
共有()

一方的にもらうだけの乞食が

919:デフォルトの名無しさん
12/08/06 02:21:13.35
処理系を知りたいならアセンブラ。
遠慮せずにそちらの世界へ。

920:デフォルトの名無しさん
12/08/06 02:22:09.03
けんかしにここにきてるのかお前ら
そんなひまがあったら働け

921:デフォルトの名無しさん
12/08/06 02:30:41.89
>>919
「処理系」の意味がわかってないような

922:デフォルトの名無しさん
12/08/06 04:52:17.60
>>919
お前が一番分かってない

923:デフォルトの名無しさん
12/08/06 04:54:56.41
>>921-922
ほう。
どうわかってないのか、正しくはどうなのか説明してみ。

924:デフォルトの名無しさん
12/08/06 04:56:47.56
>>923
人に教えてもらう態度ではないな

925:デフォルトの名無しさん
12/08/06 05:00:05.49
>>924
失せろゴミ

926:デフォルトの名無しさん
12/08/06 05:02:32.65
>>919
お前が処理系を何だと思ってるか説明するのが先だ
ゴミしか言えないのかよ

927:デフォルトの名無しさん
12/08/06 05:08:28.84
判断の根拠を言えよバーカ
わかってないのに判断したのかよ

928:デフォルトの名無しさん
12/08/06 05:09:47.45
ゴミとバーカしか言えないのかよ

929:デフォルトの名無しさん
12/08/06 05:10:32.27
アホ

930:デフォルトの名無しさん
12/08/06 05:15:13.50
>>910>>919の処理系の意味の違いさえ分からないゴミカス乙

931:デフォルトの名無しさん
12/08/06 05:18:30.81
ゴミとバーカとアホとゴミカスしか言えないのかよ

932:デフォルトの名無しさん
12/08/06 05:19:51.18
お前らいい加減やめろよ・・・

933:デフォルトの名無しさん
12/08/06 05:20:03.08
しか言えないのかよしか言えないのかよ

934:デフォルトの名無しさん
12/08/06 05:27:39.39
>>930
URLリンク(www.google.co.jp)

935:デフォルトの名無しさん
12/08/06 05:36:14.40
>>930
>>919だけが「処理系」の意味を知らないだけで
他の人は全員「処理系」の意味を理解して、同じ意味で使っている。

936:デフォルトの名無しさん
12/08/06 06:56:49.37
919に言ってやれよ

937:デフォルトの名無しさん
12/08/06 07:01:02.28
919に言ってやれよしか言えないのかよ

938:デフォルトの名無しさん
12/08/06 07:26:09.48
919に言ってやれよしか言えないのかよしか言えないのかよ

939:デフォルトの名無しさん
12/08/06 07:34:52.32
919に言ってやれよしか言えないのかよしか言えないのかよしか言えないのかよ

940:デフォルトの名無しさん
12/08/06 07:40:55.44
アホ自慢はもういいから。

941:デフォルトの名無しさん
12/08/06 07:57:40.08
implementation 実装、処理系

942:デフォルトの名無しさん
12/08/06 08:00:57.45
規格ではなく処理系でことなる部分がある(処理系依存の部分、未定義の部分)

943:デフォルトの名無しさん
12/08/06 08:04:17.84
ダンプ解析しないのかな。

944:デフォルトの名無しさん
12/08/06 08:06:47.66
童貞先生ゴミマ


945:デフォルトの名無しさん
12/08/06 08:11:40.73
#include <stdio.h>
int main(void)
{
  int i = 2;
  printf("%d\n", ++i*(++i) );
  return 0;
}
/*
C:\work>gcc -Wall -o ppi ppi.c
ppi.c: In function `main':
ppi.c:5: warning: operation on `i' may be undefined

C:\work>ppi
16

C:\work>dmc ppi.c
link ppi,,,user32+kernel32/noi;


C:\work>ppi
12

*/

946:デフォルトの名無しさん
12/08/06 08:12:19.52
ぶひ

947:デフォルトの名無しさん
12/08/06 08:19:45.88
>>945 何したいんだ?
#include <stdio.h>
int main(void) {
  int i = 2, j;
  j = ++i;
  printf("%d\n", j*(j) );
  return 0;
}

948:デフォルトの名無しさん
12/08/06 08:43:31.10
>>947
アホは書き込むな。

949:デフォルトの名無しさん
12/08/06 08:47:57.14
Qがコテを隠して朝からファビョっているのか

950:デフォルトの名無しさん
12/08/06 09:22:10.78
アホは書き込むな。しか言えないのかよ

951:デフォルトの名無しさん
12/08/06 09:34:44.57
ぶひひ


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch