[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/28 00:11 / Filesize : 251 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:34:33 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 19
pc11.2ch.net/test/read.cgi/tech/1190342593/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 97代目
pc11.2ch.net/test/read.cgi/tech/1191937213/

855 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:10:11 ]
>>853
1行が何バイトかは、その行を読み込んで改行まで数えないとわからないのが普通

856 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:10:58 ]
>>853 オイオイw

857 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:20:44 ]
でも、データをストリームとして扱うようになったのはUnix以降じゃなかったか?
だからそれ以前の人ならそういう発想でも別に変でないかも。

858 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:51:46 ]
何とかできました。

>>855
普通はそうなのですか…結構アナログな感じなのですね


ただ、すんません。疑問が増えました。
データをストリームとして扱う、の意味がわかりません


859 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:57:10 ]
>> 850
現在位置を取得し、これをAとします。
getsを4回呼び出します。
現在位置を取得し、これをBとします。
fseekで現在位置をAの場所に戻します。
fseekB-Aバイト分現在位置を進めます。

860 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:58:30 ]
>>858
「データをストリームとして扱う」というのは、普通にファイルを頭から順に読んでいくこと。
これに対して、「固定長のブロックとして扱う」やりかたがあって、
ひとつひとつのカタマリが同じ大きさの場合に、
fseekを使ってデータの開始位置にシークして、必要なデータのみを直接読み書きすることを言います。

861 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 19:24:43 ]
>>859-860
ありがとうございました。
今まで何も理解せずにプログラムしてたのだと思い知りました。。。


862 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:41:45 ]
KOUZOUTAI data[num];

KOUZOUTAI *data
data = (struct Point *)malloc( sizeof(struct Point) * num );


の違いって何なのでしょうか?
どちらもnum分の構造体を確保していると思うのですが。


それとポインタの場合で二次元の構造体を確保する方法教えてください。

863 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:42:36 ]
>>862
すません。
4行目はPointじゃなくて KOUZOUTAIです。



864 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:59:04 ]
int data[10]

int *data = (int *)malloc(sizeof(int)*10)
の違いと同じ。

865 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:00:33 ]
質問です。
ファイルの更新時刻を得るのってどうすればいいんでしょうか?

866 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:01:13 ]
OS次第

867 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:07:28 ]
右クリック → プロパティ

868 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:17:23 ]
>>866
標準ライブラリにそういう関数が入ってたりしないってことでしょうか

869 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:23:21 ]
>>868
ファイルシステムに依存する情報なんで、標準には入ってない

870 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:23:32 ]
>>864
んー
その、構造体で宣言するのと、ポインタで宣言するのと利点があまりわからず

あと2次元の構造体をポインタで確保する方法もお願いします

871 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:27:14 ]
まず「二次元の構造体」を詳しく。
構造体の二次元配列をポインタで確保するのなら、普通の変数を二次元に確保するときと同様でいい。

872 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:28:40 ]
スコープを跨ぐことができない・できるの違いぐらいじゃない?
あと、後者の方が前者と比べると遅そうだけど、これは実装・環境に依存するのかな。

873 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:34:47 ]
>>871
KOUZOUTAI data[10][10]
のようなことです。

二次元配列をポインタで確保するやり方調べてきます。やったことなくて。

>>872
なるほど。
というと、グローバルでKOUZOUTAI data[10]とするのと同じような感じになるのでしょうか?




874 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:49:42 ]
KOUZOUTAI (*data)[10]

875 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:25:23 ]
struct e{
int value;
};

int main(){
struct e **p,(*q)[5];
int i;

//こんな方法とか
p = (struct e**)malloc(10 * sizeof(struct e*));
for(i=0; i<9; ++i){
p[i] = (struct e*)malloc(5 * sizeof(struct e));
}

//こんな方法がある
q = (struct e(*)[5])malloc(5 * 10 * sizeof(struct e));

//こんな風に使う
p[0][0] = 0;
q[0][0] = 0;

//忘れずに解放
for(i=0; i<9; ++i){
free(p[i]);
}
free(p);
//qの方が解放は楽
free(q);

return 0;
}

876 名前:875 mailto:sage [2007/11/03(土) 23:26:22 ]
繰り返し部分間違えた
for(i=0; i<9; ++i)

for(i=0; i<10; ++i)

877 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:38:36 ]
**ばっかりでわかりにくいなぁ。

878 名前:デフォルトの名無しさん [2007/11/03(土) 23:42:07 ]
だいぶはしょりますが・・・
int i;
char b;
char a[] = "abcdefg";
scanf("%s",&b);
while(b != a[i])
i++;
・・・略
みたいなbで打たせた文字をaの配列から探させるようなプログラムを書くとwhile文のところで、
「char型はchar*型に変換できない」
というエラーが出ます。どうすればbの文字ををaの配列から参照できますか?
わかりにくくてごめんなさい

879 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:46:27 ]
>>878
>534の下3行。

880 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:49:25 ]
>>878
とりあえずそのようなエラーは出なかった

881 名前:デフォルトの名無しさん [2007/11/03(土) 23:50:30 ]
>>879
ありがとうございます。%cにすればいいってことですか…?

882 名前:デフォルトの名無しさん [2007/11/03(土) 23:56:23 ]
878ですが、エラーはでなくなったのですがどうやらwhileで無限ループがおきている気がします。
上のプログラムだと、例えばscanfでdを打ったらiが3になった時点でwhile文から出るはずですよね?

883 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:57:23 ]
iを0で初期化してる?



884 名前:デフォルトの名無しさん [2007/11/04(日) 00:01:00 ]
>>883
しています。無限ループではなく他のどこかがおかしいのかもしれません。
もう一度しっかり見てみます。
ありがとうございました。

885 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:03:57 ]
>>884
bにhを入れたらどこで止まると思う?

886 名前:デフォルトの名無しさん [2007/11/04(日) 00:06:17 ]
>>885
そうなると無限ですか?
でも実際はこの配列はa〜zで、cとかdとかを入れても次の動作にいきません。

887 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:08:04 ]
whileに入る前にbに入ってる文字をprintfで確認したか?

888 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:08:12 ]
出来る限り、はしょらないで載せてくれ
>>883みたいな細々したことを指摘しないといけなくなるから

889 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:08:54 ]
>>886
その実際のソースを書け

890 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:12:11 ]
>>878のソースで「char型はchar*型に変換できない」というエラーが出るというのが気になるんだが……
scanfの%指定ミスでこんなエラー出ないよな? せいぜい実行時エラーであって

891 名前:デフォルトの名無しさん [2007/11/04(日) 00:15:44 ]
ごめんなさい
#include<stdio.h>
int main(void){
char a;
char letter[] = "abcdefghijklmnopqrstuvwxyz";
int i = 0;
printf("半角英小文字を1文字入力。:");
scanf("%s",&a);
while(a != letter[i])
i++;
printf("%s",letter[i]);
return 0;
}

です。


892 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:18:27 ]
scanf指摘されたところ直ってないじゃん

893 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:20:18 ]
>>891
%sを%cに置換してこい。printf("%s",letter[i]);文字コードがポインタだと解釈されてしまう



894 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:20:29 ]
returnの位置

895 名前:デフォルトの名無しさん [2007/11/04(日) 00:22:40 ]
>>892
>>893
ありがとうございます。
>>894
何か場所おかしいですか?

896 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:23:01 ]
>>892
直す前のを載せたんじゃないの?

>>891
printf("%s",letter[i]);

printf("%c",letter[i]);

897 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:23:21 ]
バッファオーバーラン

898 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:26:45 ]
>>897

899 名前:デフォルトの名無しさん [2007/11/04(日) 00:32:21 ]
みなさんありがとうございます。
おかげでなんとかできました。

1つ気になるのですが"%c"と" %c"の違いはなんですか?

900 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 01:04:58 ]
>>899
%cと%sの違いなら、

・scanfの場合
%cなら、引数として渡されたアドレスの指し示す先に、標準入力からとってきた一文字を入れる
%sなら、引数として渡されたアドレスの指し示す先を配列の頭と見て、文字列を入れていく。最後に\0を付加

・printfの場合
%cなら、引数として渡された数値に対応した一文字を標準出力に出力
%sなら、引数として渡されたアドレスを配列の頭と見て、その指し示す先を\0にぶち当たるまで出力する

901 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 01:10:39 ]
' '

902 名前:デフォルトの名無しさん [2007/11/04(日) 01:22:51 ]
>>900
ありがとうございます。
よくわかりました!

903 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 10:02:07 ]
ところで、何が出来れば入門を卒業したことになるの?



904 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 10:25:43 ]
言語の文法マスターしたぜ!もう学ぶことねぇwwww

え・・ポインタのポインタ?関数ポインタ?どうだったっけ?

まだまだだな俺 ←この辺から入門卒業

905 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:07:39 ]
>>904
それ面白いなw
初心者に教えてるつもりが逆に初心者から教わってることに気付いたあたりも入門卒業っぽいぜ。

もう一歩踏み込む気構えが出来た頃合がそうなのかもね。

906 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:37:37 ]
>>904
俺的にはそこで、宣言の問題だと気がついたら卒業としたい。

907 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:44:38 ]
「このスレ卒業テスト」と称して課題を出せばいいんじゃね?

908 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:29:28 ]
CでGUIアプリを作れたら入門者卒業

909 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:42:34 ]
>>908
んなわけあるか

910 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:57:44 ]
>>908
コピペで終わりじゃねーかw

911 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:17:19 ]
ポインタが理解できたら入門者卒業

912 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:24:09 ]
ポインタも
*****pくらいついたらわけがわかりません。

const ***p
***const p
とかなったらわかりません

関数ポインタなんて使ったことありません。なんで使うんですか。
GUIなんて作ったことなんてありません

でも入門卒業したいです><

913 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:57:08 ]
関数ポインタの使い道が分からないなら卒業は無理だな



914 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 15:13:41 ]
関数ポインタは便利だけど、あまり使うことはないですよ。
私は、DLLを使うときくらいですかね。

915 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 15:17:29 ]
卒業せんでも中退すれば

916 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 15:37:45 ]
typedef struct
{
char *str;
int (*myfunc)();
} object;

int main()
{
object obj;
obj->str = malloc(sizeof(char) * 256);
fgets(obj->str, 256, stdin);
obj->myfunc();
puts(obj->str);
free(obj->str);
return 0;
}

int myfunc()
{

}

917 名前:915 mailto:sage [2007/11/04(日) 15:38:59 ]
>>916
×object obj;
○object *obj;

918 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:23:53 ]
>>916
え、そんなやり方でmyfuncを呼び出せるの?
いつ関数ポインタをセットした?

919 名前:916 mailto:sage [2007/11/04(日) 16:28:35 ]
>>918
あー忘れてた。
obj->myfunc();
の前に、
obj->myfunc = myfunc;
が必要だった。あかんね。

920 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:54:01 ]
#include <stdio.h>
int main(void)
{
int c;
c = getchar();
printf("%d\n", c);
c = getchar();
printf("%d\n", c);
return 0;
}

このプログラムをBCC5.5.1でコンパイルして実行し、"a"と"Ctrl+Z"を1度に入力した場合、

D:\c\my\test2>test2.exe
a^Z
97
-1

このような結果になりました。
ところが、VC++2005EEのcl.exeでコンパイルし、同じように実行すると、

D:\c\my\test2>test2.exe
a^Z
97
26

このような結果になります。なぜVC++20005では正しい結果が得られないのでしょうか。

921 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:59:04 ]
fflush(stdout);
これを main の return の前に。


922 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:06:20 ]
*p (*p)
の違いがわかりません><

923 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:07:39 ]
あっそ



924 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:08:00 ]
教えてください><

925 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:10:33 ]
>>920
stdinの初期設定が違うんじゃね?
^C が受けられるかどうかの設定もできるし。
あるいは ^D とか。

926 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:10:56 ]
>>922
1+2 と (1+2) の違いを考えてみるといいよ

927 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:17:19 ]
>>926
ありあとやんしたー

928 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:44:16 ]
>>920
コレってマジ?
なんで今更こんなバグが残ってんの?

929 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:52:38 ]
>>921
そのようにしても結果は変わりませんでした。

>>925
どうやって設定すればいいのでしょうか?

930 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 19:11:13 ]
>>928
うちでも確認できた。これはひどいな。

931 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 19:22:15 ]
そこは仕様では決められてない部分だから、
バグだとか、どっちが間違ってるとかでは無いんじゃね?


932 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 19:55:34 ]
>>931
でも、stdio.hでは#define EOF (-1)となっているし、^Zだけならちゃんと-1と表示される。

933 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:55:14 ]
そうじゃなくて EOF の前に一応 ^Z も発行するかどうか。



934 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 21:57:55 ]
>>921
プログラム終了時に、標準入出力もふくめてファイルは全部フラッシュ&クローズされるから、
それは意味ない。

935 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:20:44 ]
num[4][5]={
{0,1,2,3,4},
{5,6,7,8,9},
{10,11,12,13,14},
{15,16,17,18,19}
};
関数に配列の{5,6,7,8,9},とかを1行だけ送りたいのですが
どういう風にやればいいのでしょう?



936 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:41:03 ]
送るだけならnum[1]とかを渡すだけ。

937 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:59:13 ]
EOFについて。
MSのドキュメント調べたけど、記述が見つからなかったので仮説。
てゆーか、コマンドプロンプトの制御文字に関する仕様のドキュメントてどこさ?

行頭にある^Zはコマンドプロンプトが解釈してプログラムに「データ無し」を通知する。
行中にある^Zは文字「0x1A」をプログラムに通知する。
という理由で>>932な動きをするっぽい。
ここはコマンドプロンプトの仕様だと思うんだけど、文献ミツカンネ。

stdinをバイナリモードで開くと同じ挙動をするので、
テキストモードでのデータ中の0x1A(制御コードのEOF)の扱いの差のようだ。
バグというよりは仕様の範疇っぽいね。
0x1Aを含むファイルをテキストモードでオープンして読んでみれば
もうちょい分かりそうなんだけど、データ作るのめんどかったんで誰か頼む。

○ バイナリで開き直したサンプル
#include <stdio.h>
int main()
{
int c;
freopen("CON", "rb", stdin);
do{
printf("%d\n",c = getc(stdin));
}while(c != EOF);
return 0;
}


938 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:10:31 ]
>>936
受け取る方を1次元にしてやれば、まとめて受け取られるんですね。
できました!ありがとうございました!

939 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:18:03 ]
>>937
VC++2005でもファイル中の0x1Aは、getcで読んだらEOFが返ってきた。
やっぱバグじゃねーの?

940 名前:デフォルトの名無しさん [2007/11/04(日) 23:24:30 ]
Turbo Explorer
無償のアプリケーション開発環境
www.forest.impress.co.jp/lib/stdy/program/progdevenv/turboexplor.html

941 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:27:37 ]
むぅ…すんません
今度は
num[4][5]={
{0,1,2,3,4},
{5,6,7,8,9},
{10,11,12,13,14},
{15,16,17,18,19}
};
の 0 5 10 15 の縦の列の総和を出したいだけなんですが
これも丸々関数に送りたいのです。。。
1次元配列にいっそのこと退避させたほうがいいんでしょうか

942 名前:デフォルトの名無しさん [2007/11/04(日) 23:36:02 ]
numごと渡して計算せよ

943 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:42:07 ]
numがココでは小さいんですが
1000×1000と大きい場合を想定しています。
numごと渡したら、メモリがムダに消費されるとかポインタの解説ページとかで見た気がして





944 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:44:37 ]
それならなお更numを渡せ

945 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:44:40 ]
numごとって、本当に渡すわけじゃないぞ。アドレス渡すだけだから。

946 名前:デフォルトの名無しさん [2007/11/04(日) 23:47:36 ]
>>941
一次元配列を使うと32*1000バイト消費するが
そのままだと何も新規に生成しないから0バイトで済む

947 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:50:24 ]
何かもう一個同じモノが作られるっぽいことが書いてあって、怖気づいてました。

ところでnumそのものの値も更新したい場合は、参照渡しするのですよね?

948 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:51:17 ]
本当にnumそのものの値を変更したいのか?

949 名前:デフォルトの名無しさん [2007/11/04(日) 23:53:11 ]
C言語はふつうにやると配列は参照渡しになる
コピーを渡す方は難しい

950 名前:デフォルトの名無しさん [2007/11/04(日) 23:57:50 ]

クソの集まり創価学会

偽善者が政治活動、公明党

キチガイ集団が政治活動、公明党

池田狂信ネズミ講が政治活動、公明党

騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや

951 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:10:49 ]
>>948-949
すみません。。。混乱してきてしまって。

今は総和だけ求めてるのですが
やりたいのは行で計算をして、その行の値を全部更新して
その更新された状態で列を計算して、全部の列を更新するということをしようとしてます。

配列と関数の関係をやりなおしてきます。

952 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:31:26 ]
>>951
それならなおさらアドレス渡しでいいじゃん

953 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:38:26 ]
>引数の引き渡しには,値渡しと参照渡しがある.
>C言語では,特別なことをしない限り,変数は値渡し,配列は参照渡しになる
今まで配列も値渡しだと思っていました…納得できました。

ありがとございましたー



954 名前:920 mailto:sage [2007/11/05(月) 11:44:12 ]
検証してくださった方、ありがとうございます。

#include <stdio.h>
int main(void)
{
int c;
do {
printf("%d ", c = fgetc(stdin));
} while (c != EOF);
return 0;
}

このプログラムを実行し、
コマンドラインから"abc^Zdef"を入力すると、(^ZはCtrl+Z)

D:\c\my\test5>test5.exe
abc^Zdef
97 98 99 26

と表示され、入力待ちになります。

955 名前:920 mailto:sage [2007/11/05(月) 11:44:52 ]
それに対して、

61 62 63 1A 64 65 66

の内容のテキストファイル(↑は16進ダンプしたもの)をstdinにリダイレクトして
実行してみたところ、

D:\c\my\test5>test5.exe < test.txt
97 98 99 -1

このような結果になり、プログラムが終了しました。

プログラムは全てVC++2005でコンパイルしました。
どうやらコマンドラインの行中にEOF(0x1A)があった場合、
stdio.hで定義されたEOF(-1)ではなく、
テキストファイルでのEOF(0x1A)として読み込むようです…。

BCC5.5.1ではどちらの場合も、

97 98 99 -1

と表示され、プログラムが終了します。

956 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 12:56:46 ]
製品版では直ってるのかな。
一応、MSに報告したらどうだろ。

957 名前:デフォルトの名無しさん [2007/11/05(月) 13:09:38 ]
別にエラーじゃないのでは?
EOFのASCIIコードを表示しているのだから

958 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 13:11:09 ]
EOFのアスキーコードじゃないよ。

959 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 13:12:35 ]
EOF じゃなくて SUB だな。
つーか単なる ^Z だが。

960 名前:920 mailto:sage [2007/11/05(月) 13:52:32 ]
>>958 >>959
ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB
>ASCIIでは例えば、改行文字は0x10、水平タブは0x09、EOF(End Of File、ファイル終端マーク)は0x1Aである。

961 名前:920 mailto:sage [2007/11/05(月) 14:01:52 ]
>>957
コマンドラインの行頭にあるEOFや、リダイレクトされたファイルにあるEOFは
stdio.hに定義されたEOF(-1)と読み取ることを考えると、一貫性が無いように思えます。

962 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 14:12:08 ]
ASCII に EOF なんて無いだろ。
それ書いたの誰だよ?

ttp://e-words.jp/p/r-ascii.html
ttp://ja.wikipedia.org/wiki/ASCII
ttp://www.mew.org/Newsletters/6.html


963 名前:デフォルトの名無しさん [2007/11/05(月) 18:42:18 ]
そりゃ、文字コード体系表見てもEOFなんてあるわけないわな。



964 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:29:32 ]
c言語の除算はどのようなアルゴリズムで行っているんでしょうか?
わかる方がいればよろしくお願いします

965 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:03:20 ]
>>964
コンパイラによるんじゃないでしょうか。
あと、たぶん、かなりアセンブラよりの質問だと思います。

966 名前:デフォルトの名無しさん [2007/11/05(月) 22:04:36 ]
CPUよりの話でしょう
浮動小数点や整数演算はハードでします

967 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:09:11 ]
テキストモードでfopenしたら0x1aで終了だろ

968 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:13:31 ]
いつまで、CP/Mの呪いをひきづらなければならないのやら。

969 名前:迷い人 [2007/11/05(月) 22:36:25 ]
こんばんは。つぎのようなプログラムがわかりません
1を入力すると

2を入力すると

xx

4を入力すると

xx

xxx

xx

xxxx

xx

xxx

xx

となるようなものです。途中まではかけたのですが肝心なところがよくわかりませんでした。
途中までは次のようになりました


970 名前:迷い人 [2007/11/05(月) 22:37:28 ]
#include <stdio.h>

void X_sequence (int n);
void X_triangle (int n);

main()
{
int n;
printf("Enter a number : ")
scanf("%d",&n);
X_triangle(n);
}

void X_sequence(int n)
{
int i;

for (i=1; i<=n; i++)
printf("X");
printf("\n");
}

void X_triangle(int n)
{・・・・こっからわかりません!

教えてくださいおねがいします

971 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:39:06 ]
if (n > 2) X_triangle(n - 1);
X_sequence(n);
if (n > 2) X_triangle(n - 1);


972 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:39:22 ]
printf("1を入力すると\n
x\n
2を入力すると\n
x\n
xx\n
x\n
4を入力すると\n
x\n
xx\n
x\n
xxx\n
x\n
xx\n
x\n
xxxx\n
x\n
xx\n
x\n
xxx\n
x\n
xx\n
x\n
");

973 名前:デフォルトの名無しさん [2007/11/05(月) 22:39:38 ]
if (n >= 2) X_triangle(n - 1);
X_sequence(n);
if (n >= 2) X_triangle(n - 1);




974 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:01:21 ]
ふとオープンソースの午後のこーだのソース見てみたら、C言語だったけど、
どれくらい経験つめばこれくらい書けるようになるんですかね・・・

975 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:15:15 ]
>>974
5000時間くらい。

976 名前:デフォルトの名無しさん [2007/11/06(火) 00:19:12 ]
すいません、質問させてください。
rand関数とか、abs関数とか、stdlib.hで宣言されてるってことを聞きました。
で、stdlib.hを探してみて実際に見たところ、確かに宣言されてたんですが、
これら関数の実体って、どのファイルに定義されているんでしょうか。
もしくは、ソースファイルはついてないんでしょうか?(当方Mac OSXです)
見てみたいな、と思いまして・・

977 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:27:18 ]
>>976
そういう関数はライブラリに中身がある
ヘッダーには呼び出しかたが書いてある。
実体を見たいなら、使ってるコンパイラメーカーに聞くしかない。

978 名前:976 mailto:sage [2007/11/06(火) 00:31:18 ]
>>977
早速のお返事ありがとうございました!了解です。

979 名前:デフォルトの名無しさん [2007/11/06(火) 00:33:50 ]
scanfを使って整数型の変数に1〜100の値を入力された時のみ
続く処理をして、それ以外は再度入力を促すプログラムを作りたいです。

入力された値のエラーのチェックにはどんな処理が必要か
わからないので教えてください。

あと数値を入力してEnterを押して実行したあとに
前回入力した数値が残ったままになっているのを
消すにはどうすればいいですか?

980 名前:デフォルトの名無しさん [2007/11/06(火) 01:14:14 ]
>>979
#include <stdio.h>
int main()
{
int num;
char buff[12] = {'\0'};
do{
puts("1〜100の数値入力");
fgets(buff,sizeof(buff),stdin);
sscanf(buff,"%d",&num);

}while(1 >= num || num >=100);

/*
1以上100以下の数値が入力されたときの
処理をここに書けば〜
*/
return 0;
}

981 名前:980 mailto:sage [2007/11/06(火) 01:35:49 ]
訂正
while(1 >= num || num >=100);
       ↓
while(1 > num || num >100);

982 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 01:58:33 ]
scanfっつてんだから、scanfを使うべきなんじゃなくて?

俺ならこう書くぞ
} while (!(1 <= num && num <= 100));

983 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 02:02:57 ]
論理演算が苦手そうに見えてもいいならそれでいいんじゃね?



984 名前:デフォルトの名無しさん [2007/11/06(火) 02:30:32 ]
すいません。
!についての質問なんですが、

if ( !(fp = fopen("a.c","r")) )

もしこれでfpがNULLでない場合(どこかのメモリアドレスつまり正の整数値)、
if文が偽(つまりNULLつまり0)となると思うのですが、
何故、!(正の整数値)がNULLつまり0になるのですか??ANSIのそういう仕様ですか?


if ( !5 )は偽でNULLつまり0??

(ちなみに、現在ほとんどのstdio.hで #define NULL 0 となっている)

985 名前:デフォルトの名無しさん [2007/11/06(火) 02:33:54 ]
!5といえば 1も2も3も・・・負数でさえ含まれますよね。0ももちろん含まれますが

986 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 02:47:08 ]
#include <stdio.h>

int main(void)
{
FILE *fp;
if ( fp = (FILE*)(NULL == NULL))
;
printf("fp = %p\n", fp);
printf("(int)fp = %d\n", (int)fp);
printf("!5 = %p\n", !5);
return 0;
}




結果
fp = 0x1
(int)fp = 1
!5 = 0x0

987 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 02:58:34 ]
NULL == NULLは真だから1が返るな

988 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 05:52:39 ]
>>985
!5は「5以外」じゃないよ。
5を真偽値として評価して真、その否定で結果偽。そんだけ。

989 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 09:23:16 ]
5以外は !=5 だわな。

990 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:06:26 ]
レビューってどうやってやってる・・・?
なんか自分で書いたソースなのに、うまく説明できなくて凹みまくってる・・・。
頭の中じゃどんな風に動くのかわかってるんだけど、説明となると10あるうち2しか伝える事ができない・・・

991 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:41:32 ]
君が超天才ならしょうがないけど、
凡人なら説明できない程度の理解としか周囲には写らないだろうよ。

誰にでも納得できる説明をする必要があるの?
仕事でレビュア対象に説明するだけなら、レビュアに疑問点・不明点を上げてもらって
それに回答することで納得して貰うのじゃダメ?

レビューの経験を積めば、レビュアの傾向が見えて対策も打てるけど、
例え経験不足だとしてもレビューの前に事前にレビュアと調整しておくって手もある。
凹む前にもっと考えて行動すべきだと思うけどね。

992 名前:979 [2007/11/06(火) 22:43:34 ]
>>980 >>981 >>982
色んなサンプルソース読んでみても
scanfはあまり使われてないみたいなので
gets,fgetsに変更してみようとおもいます。

なぜなのかは、ぐーぐるさんに聞いてきます
ありがとうございました

993 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:55:21 ]
>>991
あ、えーと、
現状まだまだ勉強の段階なんですが、
int main(void) じゃあそのvoidってナニ?なんでここにintとかおいてるの?っていう
いわば基礎中の基礎の部分なので、プログラムに一切関係のない人でも理解できるように発言して欲しい=学べる
ということなのでやってるんですが、経験をとにかく詰むしかないんですかね・・・うーん。



994 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 23:20:34 ]
自分で書いたソースを客観的に見ることができないなら、他人に見て貰うといい。
相談できる人が身近にいればその人に協力して貰うのがいい。
相談できる人がいない、探す気もないならここにソース晒してコメントを貰うのでもいいんじゃね?

995 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 23:50:36 ]
少しお尋ねしたいのですが、
struct _TEST a
{
int num;
char ch;
}test[100] = {0};

こうした場合、test配列の中身が全て0クリアされる動作は保証されていますか?
testが配列でない場合は動作が保証されているとどこかで伺った気はしたのですが

996 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:10:58 ]
保証されている。ついでに言えばtest[100] = { 1 };として場合であっても
1が入るのはtest[0].numだけであって、残りは全て0になる。

997 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 01:06:24 ]
>>996
ありがとうございます!

998 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 04:38:52 ]
www.geocities.jp/horie_ryu/page01/trans.c

こちらのプログラムをVS2005でそのまま実行しても'fopen'の宣言を確認してくださいと出ます。
同HP (ttp://www.geocities.jp/horie_ryu/page01.html) にあるc1.wavやらを読み込ませて実行したいのです。
fopenで配列を読んでいるのですが、ここにどうやってc1.wavなどを読み込ませればいいのでしょうか?

999 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 05:12:45 ]
調べてたらコマンドラインで実行すらしらなかったのでなんとかなるかもしれないので失礼します。すみません。

1000 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 05:29:05 ]
1000げっつ

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<251KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef