C言語なら俺に聞け(入門篇)at TECH
C言語なら俺に聞け(入門篇) - 暇つぶし2ch750:デフォルトの名無しさん
06/07/12 01:04:40
素朴な疑問。
何故const signed shortにしないのだろう。
それはさておき、-0x8000, -0x0001ではダメ?

751:デフォルトの名無しさん
06/07/12 01:11:56
>>749
よくわからないけど、キャスト以外の方法で、警告消したいだけなら
0x8000 → -32768
0xFFFF → -1
とか、#pragma とかがあるよ。

752:デフォルトの名無しさん
06/07/12 01:26:04
すみません
ファイルからの読み込みなのですが
改行がCR(0D)のみで書かれているテキストファイルから
テキストモードでデータを読み込みたいのです

fscanf(fp,"%d",&data1);
のように書くと、だいたいはCRのみの改行も改行として読んでくれるのですが
たまに改行をすっ飛ばして変な値を読んでしまいます

改行がCRのみのテキストファイルをうまく読み込む方法はありませんでしょうか

753:デフォルトの名無しさん
06/07/12 01:27:43
fgets()

754:デフォルトの名無しさん
06/07/12 10:47:28
>>752 だいたいうまくいくけど、たまに変になるって、違うところでバグってるんじゃないの?


755:デフォルトの名無しさん
06/07/12 11:17:19
3.4E-38って
0.00000000000000000000000000000000000000034?


756:デフォルトの名無しさん
06/07/12 11:49:45
>>755
0.000000000000000000000000000000000000034


757:デフォルトの名無しさん
06/07/12 14:13:29
>>756
あ、ごめん、3のところが38番目になればいいのね。
じゃあfloat型って3.4E-38~3.4E+38って書いてあるから
34000000000000000000000000000000000000~0.000000000000000000000000000000000000034?
でも有効桁7桁ってどういうこと?

758:デフォルトの名無しさん
06/07/12 14:42:48
>>757
>でも有効桁7桁ってどういうこと?
数学の時間寝てたのか
それともまだ習ってないのか
まあとにかくググれ。

759:デフォルトの名無しさん
06/07/12 15:01:17
ぐぐってもわからん
float fe;
fe=5e2;
って書くと
500.000000
って出力されるけど、どこが7桁?

760:デフォルトの名無しさん
06/07/12 15:21:00
>>759
俺のところで実行したらこうなるよ。

#include <stdio.h>

main()
{
float f = 1.0 / 3;
double d = 1.0 / 3;

printf("%.30f\n", f);
printf("%.30f\n", d);

return 0;
}

結果
0.333333343267440795898437500000
0.333333333333333314829616256247



761:デフォルトの名無しさん
06/07/12 15:22:11
グローバル変数を多用してしまうのですが、
変数を各関数で共有する方法ってグローバル変数以外に何かありますか?

762:デフォルトの名無しさん
06/07/12 15:31:49
>>757
3.4E-38 は 3.4 * 10の-38乗 だ。
有効桁数は扱える桁数。7桁なら 1.234567 とか 1.234567E+100 とか、
とにかく 7 桁は扱えるが 1.2345678 と書いても最後の 8 が扱えない。

>>759
どう出力されるかということと内部的に何桁保持されているかという
ことは別の話。


763:デフォルトの名無しさん
06/07/12 15:35:45
>>760
いやそうなるのはわかるけど、
float型が3.4E-38~3.4E+38で有効桁7桁ってどういう意味?
float f = 1.0/3
printf("%f")
だと
0.333333
で7桁まで出力されるって意味?
3.4E-38~3.4E+38ってどういうこと?
出そうと思えば50桁以上出せるけど…

764:デフォルトの名無しさん
06/07/12 15:39:15
>>761
必要な変数は構造体のメンバにして
その構造体へのポインタを受け渡しする。

765:デフォルトの名無しさん
06/07/12 15:39:28
>>762どうも
じゃあfloat型が3.4E-38~3.4E+38っていうのは?

766:デフォルトの名無しさん
06/07/12 15:50:21
普通に3.4*10^-38~3.4*10^38でしょ?
3.400000*10^38のほうが正しいかな?

767:デフォルトの名無しさん
06/07/12 15:53:15
>>764
ありがとうございます、さっそくチャレンジしてみます

768:デフォルトの名無しさん
06/07/12 15:53:27
>>766
はあ・・・
でも10の50乗でも100乗でも入力できるし出力も出来るよ?

769:デフォルトの名無しさん
06/07/12 15:56:39
なんかよくわかんないけど、まあこれでも読んでよ。

「浮動小数点型と誤差」
URLリンク(www.kyoto-su.ac.jp)

770:デフォルトの名無しさん
06/07/12 16:04:31
>>769
ああ…それよんだんだけど
1.175494 10-38 < float の絶対値 < 3.402823 10+38
って書いてあるよね。
私の本は
3.4E-38~3.4E+38
って書いてあるよ。
それで、例えば、
float f=1000000000000000000000000000000000000000000000000.00000000000000000000000000000000000000001;
printf("%40.40f",f);
って書いても
1000000000000000000000000000000000000000000000000.00000000000000000000000000000000000000001;
って表示されるよ。38超えてるよ?

771:770
06/07/12 16:07:09
あ、ちょっとコピペミスしたけど、気にしないで

772:デフォルトの名無しさん
06/07/12 16:11:00
>>770
コンパイラ何使ってるの?

773:デフォルトの名無しさん
06/07/12 16:11:58
floatよりdoubleの方が速いってよ

774:770
06/07/12 16:12:42
>>772
cygwinのgccだけど・・・

775:デフォルトの名無しさん
06/07/12 16:16:17
>>774
>>770のソースを「全部」コピペしてみて。動かしてみるから。

776:770
06/07/12 16:20:30
>>775え・・・でも770そのまんまだよ?

#include <stdio.h>

main(){
float f=1000000000000000000000000000000000000000.0000000000000000000000000000000000000001;
printf("%40.40f\n",f);
}

終わり。




777:デフォルトの名無しさん
06/07/12 16:22:13
>>776
うちでは"Inf"って表示されるけど・・・
gccのバージョンはいくつ?

778:770
06/07/12 16:24:22
gcc version 3.4.4 (cygming special)
です。

779:770
06/07/12 16:26:21
コンパイラの問題なの?

780:777
06/07/12 16:30:09
>>778
おかしいな・・・。うちとまったく一緒のコンパイラなのに。
ちなみに
printf("%d\n", sizeof(1000000000000000000000000000000000000000.0000000000000000000000000000000000000001));
ってやってみて。
8って表示されるはずだから。これはその数値がdouble型のリテラルだって
コンパイラが判断してることを示してる。それをfloat型に代入するときに
暗黙の型変換が行われるはずなんだけど・・・。

ってことで、俺はお手上げ。


781:777
06/07/12 16:30:42
あ、ちなみに"Inf"ってのはInfinityね。正の無限大。

782:デフォルトの名無しさん
06/07/12 16:34:30
>>770
そのソースでそのgccだと、警告が表示されると思うのだがそれをコピペして見給え。

783:770
06/07/12 16:38:20
>>777
printf("%d\n", sizeof(1000000000000000000000000000000000000000.0000000000000000000000000000000000000001));
ってしたら
core dump
しました。
うちの環境がおかしい?WinXP Cygwin最新のものだけど…
入れなおすか…?

どうもありがとうございました。うちがおかしいってことが分かったのでうれしいです。


784:777
06/07/12 16:39:20
>>782
-Wallでも出ない。

785:デフォルトの名無しさん
06/07/12 16:39:53
釣りか? 壮大な釣りだったのか?

786:770
06/07/12 16:41:12
>>783
あ、いや、間違ってた
printf("%d\n", sizeof(1000000000000000000000000000000000000000.0000000000000000000000000000000000000001));
でちゃんと8って表示されました。

>>782
警告も何にも出ませんよ。普通にa.exeすると結果表示されます。

787:777
06/07/12 16:42:35
>>786
んじゃ、最後にuname -aした結果をコピペしてくれ。

788:782
06/07/12 16:46:07
>>770
>>777
警告出ないか? main()の戻り値の型がないと。漏れの端末だとこうなるのだが。
--
$ gcc --version ; gcc foo.c
gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

foo.c:3: warning: return type defaults to `int'
foo.c: In function `main':
foo.c:6: warning: control reaches end of non-void function

789:770
06/07/12 16:47:14
う~Cygwinコピペできないからつらい
uname -a は
CYGWIN_NT-5.1 ****** 1.5.19(0.150/4/2) 2006-01-20 13:28 i686 Cygwin
です。名前は伏せ。珍しくもないけど

790:デフォルトの名無しさん
06/07/12 16:48:04
>警告も何にも出ませんよ。普通にa.exeすると結果表示されます。
make使ってて更新されたと認識されていないとか、違うところのa.exeが起動されているとか。
make使わず直接gccを動かしてみるとか、明示的にパスを指定してみるとかしてみたら?

791:デフォルトの名無しさん
06/07/12 16:49:54
普通にcygwinをインストールすると所謂dos窓で動くから、
マウスで範囲選択して右クリックでコピペされると思うけどなぁ。

792:デフォルトの名無しさん
06/07/12 16:50:08
sizeof(float) が 8 だったりしたら…


793:777
06/07/12 16:51:56
>>788
あ、すまん、そこは警告出る。警告でないといったのは、4,5行目に関して。
手間かけさせてスマンかった。

794:777
06/07/12 16:53:26
>>789
うちより一つ新しいバージョンだな。ちなみにうちは、
CYGWIN_NT-5.1 MARS 1.5.18(0.132/4/2) 2005-07-02 20:30 i686 unknown unknown Cygwin

最新の1.5.20も怪しいところがあるみたいだから、しばらく更新はしないでおこうw

795:770
06/07/12 16:53:38
>>782
あ、範囲指定できたんだCygwinて・・・
gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

しかでません。makeつかってません。フォルダの中にa.exeもソースも一個しかありません。


796:デフォルトの名無しさん
06/07/12 16:56:04
実行するときに

./a

または

./a.exe

でやってる?


797:770
06/07/12 16:56:57
>>796
やってますよ~
そこまでバカではない・・・w

798:デフォルトの名無しさん
06/07/12 16:58:25
じゃあ sizeof(float) はいくつ?
printf("%d\n", sizeof(float));
で出してみて。


799:770
06/07/12 17:01:15
8ですた。

800:782
06/07/12 17:03:02
漏れの方は同じだな。Win2Kだけど。
CYGWIN_NT-5.0 whee 1.5.19(0.150/4/2) 2006-01-20 13:28 i686 Cygwin

コンパイラよりも疑うべきはライブラリか?

801:782
06/07/12 17:04:57
>>799
それが原因か……
#じゃぁなんでfloatが8バイト? 64ビットLinuxでも4バイトなのに……

802:770
06/07/12 17:09:16
>>801
やっぱおかしいんすね。環境作り直します。
Cygwin入れなおします。ちゃんと正規のルートで(学校の先輩からもらわずに)。
どうも失礼しました。

803:デフォルトの名無しさん
06/07/12 17:13:31
いやまぁ先輩から貰っても全然OKなんだが、オチを知りたいんだよなぁオチを・・・

804:デフォルトの名無しさん
06/07/12 17:14:13
はっ、その先輩がスーパーハカーだったというオチ!?

805:デフォルトの名無しさん
06/07/13 13:27:50
自分でコンパイルしたのかな?
>>804
gcc を自分でコンパイルできるとスーパーハカーなの?
じゃあ俺も10年ぐらい前からスーパーハカーだったんだね。


806:デフォルトの名無しさん
06/07/13 13:38:59
猫でもわかるC言語プログラミングって本を読んで勉強はじめたんだけ
この本の説明めちゃくちゃ解り辛い・・・
まぁ単に俺が知識0ってこともあるんだろうけど、どの入門書籍もこんなもん?

807:デフォルトの名無しさん
06/07/13 14:12:46 BE:224654459-#
猫でもわかるの書籍版は読んだことないけど、プログラムそのものが
まったく初めてなら、入門書一冊読んだだけじゃなかなか難しいと思う。


808:デフォルトの名無しさん
06/07/13 14:15:29
どの本でも同じだけど、HelloWorldが動いているのを見て喜べるピュアな心の持ち主なら
どんな本読んでも上達出来ます。

809:デフォルトの名無しさん
06/07/13 14:15:50
猫以下なんじゃね?

810:デフォルトの名無しさん
06/07/13 14:31:58
プログラムそのものが難しいって言うより、説明が言葉不足だったり
説明なしでいきなり「ここはこうなりますね、ここはこうなるので」
みたいなところが多くて・・・

Cからはじめるのがそもそも間違いなんだろうか

811:デフォルトの名無しさん
06/07/13 17:53:08
>>810
まずはAから段階を踏まないと

812:デフォルトの名無しさん
06/07/13 18:32:39
>説明なしでいきなり「ここはこうなりますね、ここはこうなるので」
そういうのに一々疑問を持ってストレスを貯めるやつはプログラム書けないよ
すべてそういうもんなんだと素直に覚えないと。
そもそもプログラミングの入門書って根幹に触れないからみんな説明不足といわれれば説明不足になる罠


813:デフォルトの名無しさん
06/07/13 18:44:26
英語だって、なんでアルファベットなんだろうとか思い始めたらダメだよ。
挨拶はハローとか決まりきった定型パターンがあるからそう言うのは理屈無しに覚えるしか無い。

日本語でも、10年以上話して使っていて未だに表現方法とかの新発見がある様に、覚えたてでその言語の全てを理解するのは無理。

とりあえず義務教育の英語の教科書の様に、入門書を最後まで一通りやってみて、分からない所は他の書籍や先輩に訊くとかセミナーや研修にでも出るとかで補完していかないと。
自分でそう言う学習法が出来ない香具師は、金出してスクールに通ったほうがいいよ。

814:デフォルトの名無しさん
06/07/13 18:49:56
心配しなくてもあとで「そういうことだったのか!」って気づくことになるから安心してその本をまずは読破すれ。

815:デフォルトの名無しさん
06/07/13 19:04:24
理系が文章力カスなのはわかりきったことだろ

816:デフォルトの名無しさん
06/07/13 22:45:20
とりあえずは鵜呑み丸暗記にしておいて
必要が出てきたり気になったら自分で調べたりこういう場所とかで聞けばいいよ

入門書の中には一部間違ったことが書いてあるものもあるから
完全に鵜呑みってのもちょっとまずいことはまずいんだけどね
まあ気にするな

817:デフォルトの名無しさん
06/07/14 01:46:26
C++で7桁×7桁の計算プログラム組んでるんですが
float使ったら小数点以降が表示されてあまり美しくない。
小数点以降を表示しない方法、教えてください。

818:デフォルトの名無しさん
06/07/14 01:52:24
main()
{
Card deck[40];
int *face[] = {1,2,3,4,5,6,7,8,9,10};
char *suit[] = {"hart","daiya","kurab","superd"};


srand(time(NULL));
fillDeck(deck, face, suit);
shuffle(deck);

printf("baeojunnbisimasu");
return 0;
}
プログラミングの一部なんですが 
コンパイルが通りません
int faceのところがだめらしいのですが何処が悪いんでしょうか?
どなたか解る方おしえてください

819:デフォルトの名無しさん
06/07/14 01:54:23
>>817
整数型にcastして表示しろ

820:デフォルトの名無しさん
06/07/14 01:55:12
>>818
int *faceではなく、int face

821:デフォルトの名無しさん
06/07/14 02:02:38
ごめん、castって何?

#include <stdio.h>

int main(void)
{
float alfa, beta, ganm;

printf("7桁の整数を入力して下さい(1回目):");
scanf("%f",&alfa);
printf("7桁の整数を入力して下さい(2回目):");
scanf("%f",&beta);

printf("\n%f * %f = %f\n", alfa, beta, alfa * beta);
}

822:デフォルトの名無しさん
06/07/14 02:11:56
>>820さん
マジでありがとう^^
通りました

823:デフォルトの名無しさん
06/07/14 03:31:14
%fではなく%gを使う習慣をつけよう。
#って話か?

824:デフォルトの名無しさん
06/07/14 08:34:11
#include<stdio.h>

int main(void)
{
int n,temp,m=0;
FILE*fp1=fopen("2バイト文字.txt","r");
FILE*fp2=fopen("改行テスト.txt","w");

while((n=fgetc(fp1))!=EOF){
if(n=='\n'){
m=0;
}
else if(m==40){
fputc('\n',fp2);/*ここが上手くいかない模様*/
m=0;
}
fputc(n,fp2);
m++;
}
fclose(fp1);
fclose(fp2);
printf("end\n");
return 0;
}

825:824
06/07/14 08:37:11
2バイト文字、日本語のテキストを行の文字数20で改行するようなプログラムを作りたいです。
例えば、行の文字数40のやつを、原稿用紙の形式に変換したい。

しかし、>>824のやつだと、改行後の一文字目が変になってしまいます。
文字コードの問題なのかどうかすら分かりません。
ここが変だ、という場所の指摘をお願いします。

826:824
06/07/14 08:44:11
失礼。
tempとprintf("end\n")は気にしないで……。

827:デフォルトの名無しさん
06/07/14 10:15:49
超基本問題です。
main(){

int i;
float f;
double d;
long l;
char st[80];

printf("文字1文字,%%c,int,%&i=");
scanf("%c",&i);
printf("%%c,int,i=%c\n",i);

printf("文字列,%%s,char,st=");
scanf("%s",st);
printf("%%s,char,st=%s\n",st);
printf("文字列入力の時には&は不要\n");

printf("8進数%%o,int,%&i=");
scanf("%o",&i);
printf("%%o,int,i=%o\n",i);
printf("%%d,int,i=%d\n",i);

printf("10進数%%d,int,%&i=");
scanf("%d",&i);
printf("%%d,int,i=%d\n",i);


828:デフォルトの名無しさん
06/07/14 10:17:35

printf("16進数%%x,int,%&i=");
scanf("%x",&i);
printf("%%x,int,i=%x\n",i);
printf("%%d,int,i=%d\n",i);

printf("long型%%ld,long,%&l=");
scanf("%ld",&l);
printf("%%ld,long,l=%ld\n",l);
printf("%%d,int,l=%d\n",l);

printf("実数float型%%f,float,%&f=");
scanf("%f",&f);
printf("%%f,float,f=%f\n",f);
printf("%%d,int,f=%d\n",f);

printf("実数double型%%lf,double,%&d=");
scanf("%lf",&d);
printf("%%lf,double,d=%lf\n",d);
printf("%%d,int,d=%d\n",d);

}
これやると、例えば
8進数%o,int,&i=70
とか入れると、iに7しか入ってくれなくて、0が次の10進数の処理に自動的に入っちゃうんだけど、なぜ?


829:デフォルトの名無しさん
06/07/14 11:01:09
親から習う日本語が方言訛りで一部怪しかったりしても、使ってるうちに標準語の表現に気づいて修正できるものだよ。
もちろん最初から標準語で覚えられるような環境を探すのも手。

gcc方言とか、IA方言とか、VC方言とかウィンドウズ方言とかいくらでも環境依存の癖はある。

830:デフォルトの名無しさん
06/07/14 11:39:34
>>829
その直前の文字列の入力をコメントにしたらどうなる?

831:デフォルトの名無しさん
06/07/14 13:17:59
すいませんこのプログラムのどこがわるいかおしえてもらえないでしょうか
うるう年の判定プログラムで
#include<stdio.h>

int main(void){
int n;
n=1;
printf("年数を入力してください");
scanf("%d",&n);

if(n%400=0)printf("うるう年である");
else if(n%4=0&&n%100!=0)printf("うるう年である");
else printf("うるう年ではない");

return(0);}

左辺の値がないとかエラーがでるんですけど

832:デフォルトの名無しさん
06/07/14 13:30:41
初心者乙

833:デフォルトの名無しさん
06/07/14 13:44:21
>>831 ==だよ。

>>830
今度は、
8進数%o,int,&i=179
と3桁にすると、iに17が入って、9が次の10進数の処理に自動的に入ります。
なぜ?

834:824
06/07/14 17:19:31
>>833
scanf("%c",&i);の時、1000とか入力すると、%cの分の1をscanf("%c",&i);で取り込み、残りの000は次のscanf("%s",st); に勝手に入力されてしまう。

8進数だから、7、8、9なんかは入力できない。
すると179は17まで8進数と見なされ、残りの9は型が違うものと認識される。
17dとか入力しても同様。

型が違うものと認識されたものは、次のscanfに勝手に入力されてしまう。
標準入力ストリームがバッファリングの構造を取るから。
型が違うもの、と認識されたものは、一度バッファに戻ってから、次のscanfに入力されてしまう。

環境によっては、scanf("%d",i);のところで、a、とか入力すると、
型が違うものだからバッファに戻す→バッファからaがscanfに入力される
というルーチンを延々と繰り返してしまう。
この繰り返しが起こらない環境ならば、型が違うものでも強制的な変換が行われ、scanfに取り込まれるということ。

835:デフォルトの名無しさん
06/07/14 18:40:08
>>834
どうもありがとう
なるほどね・・・

836:デフォルトの名無しさん
06/07/14 21:29:18
>>824
while((n=fgetc(fp1))!=EOF){
fputc(n,fp2);
m++;
if(n=='\n'){
m=0;
}
else if(m==40){
fputc('\n',fp2);
m=0;
}
}

入力ファイルがすべて 1文字==2バイトと決まっているならこれで良いけど
wchar_tを使うか、文字コードの判定をするかしたほうが良いかも。

837:824
06/07/14 21:55:49
>>836
なるほど。

838:デフォルトの名無しさん
06/07/15 08:47:40
パチンコのシミュレーターを作ろうと思ってるんですが、

確変をひいた場合にループをさせる時どのようにすればいいのでしょうか?

for(;;){
switch(GetRandom(1,2)){
case 1:b++;
case 2:break;

}
}

乱数で1だったらループ2だったらfor文を抜けたいとおもうのですが、
これだと止まってしまいます。何故でしょうか。

839:デフォルトの名無しさん
06/07/15 09:19:20
>>838
直接の原因は、break は一つ外側の構文に対してしか作用しないこと。
switch 内で break しても、その switch の外側に抜けるだけ。
それで結局、for を抜け出せなくて無限ループになっている。
ネストされた構文から任意の場所に制御を渡したい場合は goto を使うか、
関数を書いてそれを呼ぶしかない。

あと、その case の書き方はやめておけ。
switch はフォールスルーと言って、break を書いておかないとその後の
case にある処理に突入してしまう。

for(;;){
switch(GetRandom(1,2)){
case 1:
b++;
break;
case 2:
goto end_for;
}
}
end_for: ;

840:デフォルトの名無しさん
06/07/15 09:27:03
>>838 なんか初めの方の文章がよくわからねいけど
そのbreakでは、switch文しか抜けられない。
for文を抜けたければ、goto文とかflagをつかえばいい。
◆goto文の場合
for(;;){
switch(GetRandom(1,2)){
case 1:b++;
case 2:goto FOR_EXIT;
}
}
FOR_EXIT:;
◆flag
int flag = 1 ;
for(;flag;){
switch(GetRandom(1,2)){
case 1:b++;
case 2:flag=0;
break;
}
}

841:840
06/07/15 09:28:39
かぶった。しかも劣化している。。。839のいうとおりだ。

842:デフォルトの名無しさん
06/07/15 09:33:50
>>839,840
ありがとうございます。
gotoが便利そうなんでそっちを使いたいとおもいます。
これでやっと先に進めそうです。

ありがとうございました。

843:デフォルトの名無しさん
06/07/15 09:39:09
1と2しか判定しないなら素直に
for(;;){
if(GetRandom(1,2)==2) break
b++;
}
も頭の隅っこに置いとくといいかも

844:デフォルトの名無しさん
06/07/15 10:24:29
質問です~
char st[10]="text";
char *p;
p=st;
すると、st[10]の先頭アドレスがpに入るって書いてあるんですけど、
printf("%p,%p",p,&p);
pの値と&pの値が違うのはどうしてですか?


845:デフォルトの名無しさん
06/07/15 10:32:48
いくらpにstを代入しても、あくまでpはpという1つの変数だから。

846:デフォルトの名無しさん
06/07/15 10:44:26
あーなるほど。どうも~

847:デフォルトの名無しさん
06/07/15 17:31:59
pと&pの違いは重要
と言ってみる

848:デフォルトの名無しさん
06/07/15 22:31:54
念のため聞いておきたいんですが、参考書を見るとコマンドプロンプトで表示させるだけっぽいですけど
ちゃんと画像のついたソフトやゲームなんかも作れるんですよね?

849:デフォルトの名無しさん
06/07/15 23:51:47
>>848
できるけど、標準Cと言われるものの範囲では、画像を表示するなどと言ったことができず、
また、コマンドプロンプトで文字を入出力するのとは、桁違いに面倒だから、入門レベルでは扱わないというだけ。

850:デフォルトの名無しさん
06/07/16 03:37:48
質問させてください。
自分はVB8アカデミック(=SE)を使っているのですが。
#include <stdio.h>
int main(void){ printf("HELLO"); return 0; }
のようなDOS窓で動作するようなコードは正常にコンパイルできるのですが、
#include <windows.h>
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
) {
MessageBox(NULL, "Kitty on your lap","メッセージです。", MB_OK);
return 0;
}のようなウィンドウズアプリケーションをコンパイルしようとすると必ずエラーがでてしまいます。
↑のコードは今思い出しながら書いたものなのでもしかすると間違っている箇所もあるかも
しれませんが書籍を参考に10個ほどサンプルを丸写ししてコンパイルしても同じ結果だったので
コードに問題はないと思います。
VB8を再インストールしてみたりもしたのですがまったく効果がなく、もしかして
インストール後になにか他にもインストールしたり環境設定したりと別の作業が必要なのかとも思ったのですが・・・・
どなたか原因がわかる方がいらっしゃいましたら助言いただけないでしょうか。
BBSもプログラミングも初心者なもので失礼もあるかとは思いますがよろしくお願いします。長文ですみません^^;

851:デフォルトの名無しさん
06/07/16 03:41:08
if(){}って()内が1なら{}が実行されるんですか?
それとも0以外なら実行されるんですか?

852:デフォルトの名無しさん
06/07/16 03:50:05
真なら実行され偽なら実行されない

853:デフォルトの名無しさん
06/07/16 03:50:16
>>850
書店に行って、自分に合う入門書を買ってくること。

854:デフォルトの名無しさん
06/07/16 03:51:47
>>851
()内に=や<>なんかがない場合は
()の中に入る数字(変数でもいい)が0以外なら真と見なしループを続ける(=実行)
0以外なら偽と見なしループを抜け出します。


855:デフォルトの名無しさん
06/07/16 03:56:20
>>854
ありがとうございました

>>853
入門書読んでるんですけど、そこがかいてなかったのです

856:デフォルトの名無しさん
06/07/16 03:59:06
ここは回答者の入門スレなのか?
堂々と間違った回答をされても困るんだが。

857:デフォルトの名無しさん
06/07/16 04:09:32
>>851さんごめんなさい。。。
while文とごっちゃになってましたOrz
真ならループではなくただ実行されるだけでした
偽ならスルーします。
>>856さんこれであってますでしょうか?

858:デフォルトの名無しさん
06/07/16 07:15:37
1と2しか判定しないなら素直に
for(; GetRandom(1, 2) != 2; b++)
;

859:デフォルトの名無しさん
06/07/16 07:49:25
そして結局
while(GetRandom(1, 2)!=2)b++;

860:デフォルトの名無しさん
06/07/16 07:58:25
>854
>0以外なら偽と見なし(略)


861:デフォルトの名無しさん
06/07/16 09:00:28
>>850
エラーメッセージを書け。
あと、CのコンパイルにVBは関係ないだろ。

862:デフォルトの名無しさん
06/07/16 13:04:57
あの~
2進数表記する型ってないんですかね。
ライブラリさがしてるんですけど・・・

863:デフォルトの名無しさん
06/07/16 13:30:54
>>862
#include <stdio.h>

/* 静的アサーション */
void SASSERT_(int(*p)[1]) { }
#define SASSERT(b) SASSERT_((int(*)[(b) ? 1 : -1])0)

/* 2進1バイトリテラル */
#define BYTE2(x) \
 (SASSERT(1 < sizeof (#x) && sizeof (#x) <= 9), /* 1~8 文字に制限 */ \
  SASSERT((0x##x & ~0x11111111) == 0), /* 余計なビットがあるとエラー */ \
  (0x##x >> 0) & 0x01 | \
  (0x##x >> 3) & 0x02 | \
  (0x##x >> 6) & 0x04 | \
  (0x##x >> 9) & 0x08 | \
  (0x##x >> 12) & 0x10 | \
  (0x##x >> 15) & 0x20 | \
  (0x##x >> 18) & 0x40 | \
  (0x##x >> 21) & 0x80)

/* 2進2バイトリテラル */
#define WORD2(x1, x0) ((BYTE2(x1) << 8) | BYTE2(x0))

/* 2進4バイトリテラル */
#define DWORD2(x3, x2, x1, x0) ((WORD2(x3, x2) << 16) | WORD2(x1, x0))

int main() {
 printf("%X\n", BYTE2(01011011));
 printf("%X\n", WORD2(11001011, 10000011));
 printf("%X\n", DWORD2(01011011, 11001011, 10000011, 00000000));
}

864:デフォルトの名無しさん
06/07/16 13:31:52
型…?

もしかしてBASICの&Bみたいに2進でリテラル書きたいってこと??

865:デフォルトの名無しさん
06/07/16 13:56:36
>>863 ちゃいまんねん
>>864 そうそう。型指定文字のこと。

866:デフォルトの名無しさん
06/07/16 14:42:03
ない

867:デフォルトの名無しさん
06/07/16 14:43:17
ないからこその代案が>863なわけだな。

868:デフォルトの名無しさん
06/07/16 14:44:15
2進でリテラル書きたいだけなら、
>>863 で何か不都合でもあるんだろうか。
文法的な事を知りたかっただけなの?

869:デフォルトの名無しさん
06/07/16 14:46:04
>>863の(0x##x >> 0) & 0x01ってどういういみですか?
すいませんが説明していただけるとたすかります

870:デフォルトの名無しさん
06/07/16 14:48:24
やっぱいちいち計算しなきゃ駄目なのか・・・

871:デフォルトの名無しさん
06/07/16 14:50:36
256通りのテーブル作って、テーブル引きしたほうが早くないか?

872:デフォルトの名無しさん
06/07/16 14:52:09
0x##x は、0x と x(マクロの引数)をくっつけるもの。
例えば、BYTE2(01011011) なら 0x##x は 0x01011011 になる。
この時、結局 (0x##x >> 0) & 0x01 は
(0x01011011 >> 0) & 0x01 になる。
つまり、0 ビット目を抜き出す操作に相当する。
(0x##x >> 3) & 0x02 は 4 ビット目を 1 ビット目に持ってきて、
それ以外のビットを消す。
(0x##x >> 6) & 0x04 は 8 ビット目を 2 ビット目に持ってきて(ry
こうやって、0x01011011 を2進数 01011011 にしている。

これらの計算は静的に行われるので、
コンパイル時に全部計算が行われて、
単なる定数に置き換わる。
速度は気にする必要ない。

873:862
06/07/16 14:52:11
あ!そういうことか!
どうもトンクス>>863-868

874:デフォルトの名無しさん
06/07/16 14:57:22
>>872
へー、それ知らんかった。勉強になった。

875:850
06/07/16 19:52:59
>>861
訂正。
×自分はVB8アカデミック(=SE)を使っているのですが。
○自分はVS8アカデミック(=SE)を使っているのですが。
エラーメッセージは850で書いたコードをコンパイルした場合、
(9) : error C2664: 'MessageBox' : 2 番目の引数を 'const char [18]' から 'LPCTSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
というメッセージがでます。

876:デフォルトの名無しさん
06/07/16 20:05:10
>>875
_T("Kitty on your lap")
_T("メッセージです。")
とするか
プロジェクトのプロパティ→構成プロパティ→全般→文字セット→マルチバイト文字セットを使用する
に設定。

LPCTSTRはUnicodeを使うかマルチバイト文字を使うかでLPCWSTRかLPCSTRになる。
MessageBoxもMessageBoxWとMessageBoxAで切り替わる。
単にダブルクォーテーションで囲んだだけだとcharの配列 → LPCSTRに変換→引数の型不一致。
文字列リテラルを_T()で囲むとUnicodeの時には頭にLを付けてくれるからLPCWSTRにできる。

877:デフォルトの名無しさん
06/07/16 20:37:58
質問です。
これの間違いを教えて頂きたいッス!
文字列を入力させる。その中に”ABC”という部分文字列(連続)が含まれていれば「OK」、そうでなければ「NO!」と出力される。
#include<stdio.h>
main()
{
char moji[256];
int n=0,flag=0;
scanf("%s", &moji[n]);
while(moji[n]!='\0'){
if(moji[n]=='O' && moji[n+1]=='U' && moji[n+2]=='P')flag=1;n++;}
if(flag=1){printf("OK\n");}
else printf("NO!\n");
}

878:875
06/07/16 20:48:57
>>876
詳しい説明ありがとうございますっ
しかし知識がなさすぎて理解できませんでしたOrzすみませんホント
林○比古の本でも買って勉強してきます。
ありがとうございました。

879:デフォルトの名無しさん
06/07/16 20:50:04
scanf("%255s", moji);
printf("%s\n", strstr(moji, "ABC") ? "OK" : "NO!");

880:デフォルトの名無しさん
06/07/16 20:56:51
DirectXで全画面で動いてるゲームとかの画面上に自分のアプリのウィンドウ出したいんだけど
できるの?
できるなら何かヒントちょうだい

881:デフォルトの名無しさん
06/07/16 20:56:56
>>879
いただきましたーーーー!!
ありがとうございました☆

882:デフォルトの名無しさん
06/07/16 21:04:59
>>880
全画面ゲームの場合排他モードで動作してるかもしれないので無理かも

883:デフォルトの名無しさん
06/07/16 21:11:11
なんかネトゲのボットを作りたいらしき質問をあちこちでみるな

884:デフォルトの名無しさん
06/07/16 23:49:46
>>882
そうなんだ。排他モードなんてものがあるのか。どうも。

885:デフォルトの名無しさん
06/07/17 04:07:28
>>880
そういう場合はd3dx9のラッパーを書いて
Presentメソッドに細工して自分が描画したいものを割り込ませる

886:デフォルトの名無しさん
06/07/17 04:40:50
必死にチートしようとしてるとか?
鯖側でプログラムやってる香具師はちゃんとチェック機能付けて排除する対策してると思うよ。

887:デフォルトの名無しさん
06/07/17 05:50:48
>>885
へー、なんか凄いヒントもらっちゃった。ありがと
>>886
ボットも面白いかもね。でも後ろで動かしとけばいいんじゃないの?分かんないけど

いいヒント貰ったのであとはDXスレ見てくる

888:デフォルトの名無しさん
06/07/17 10:07:25
ポインタがわからない・・・

main(){
char *c;
*str='c';
int *i;
*i=1;
printf("*c=%c\n",*c);
printf("*i=%d\n",*i);
}
これの何がわるいんだか教えてちょんだい・・・

889:デフォルトの名無しさん
06/07/17 10:09:25
あ、間違えた
*str='c';->*c='c';

890:デフォルトの名無しさん
06/07/17 10:10:51
ポインタは虚構

891:デフォルトの名無しさん
06/07/17 10:12:54
>>888
cもiも、まだどこも実体を指していないうちに*で間接参照しているから。

892:デフォルトの名無しさん
06/07/17 10:19:11
>>888
>これの何がわるいんだか教えてちょんだい・・・
あんたの頭。

・エラーがでた。
→エラーメッセージを張れ。
・想定したとおりの動作をしない。
→想定した動作と実際の動作を書け。
・間違いを指摘された。
→指摘した人間に聞くか、どう指摘されたか書け。

893:デフォルトの名無しさん
06/07/17 10:26:12
>>890-891これならいい?
main(){
char *c;
char ch;
ch='c';
c=&ch;
int *i;
int in;
in=1;
i=∈
printf("*c=%c\n",*c);
printf("*i=%d\n",*i);
}
でもこんな書き方してるソースなんて見たことないぜ。

894:デフォルトの名無しさん
06/07/17 10:32:40
>>893
そんな書き方する意味がないからな

895:デフォルトの名無しさん
06/07/17 10:33:36
>>893
お前入門者以下だからよそ池

896:デフォルトの名無しさん
06/07/17 10:44:42
(´・ω・`)ショボン

897:デフォルトの名無しさん
06/07/17 10:46:06
>>893
まず、なにをしたいのか日本語で説明してもらえまいか?

898:デフォルトの名無しさん
06/07/17 11:01:11
fish...

899:デフォルトの名無しさん
06/07/17 11:09:10
(´・ω・`)エサだったのか

900:デフォルトの名無しさん
06/07/17 11:10:07
>>897
俺が持ってる林晴比古著新C言語入門シニア編のポインタの初期化てところに
ex1
int d;
int *p=&d;
ex2
char s[80];
char *p=s;
ex3
char s[80];
char *p=&s[3];
ex4
char *p = "ABCDE";
ex5
char *p=(char *)malloc(100);
って書いてあったけど、あれ*pって配列ABCDEなら文字A(p[0])が入るよな~と思って、
char *c;
*c='c';
ってやってみたら*cの値に'c'が入るのかなと思ってやってみたらできなかったので
なぜだか聞いてみた。
でも
int *i;
*i=1;
はちゃんと1って出てきたよ?char型とint型って違う動きするの?


901:デフォルトの名無しさん
06/07/17 11:14:56
>>900
> int *i;
> *i=1;
> はちゃんと1って出てきたよ?char型とint型って違う動きするの?

たまたま動いてるだけ。実際はメモリを破壊してる。

あと
char *c = (char *)malloc(100);

char *c;
c = (char *)malloc(100);
と同義で、*c = とは別

902:デフォルトの名無しさん
06/07/17 11:28:03
他の参考書を見てみたら?

903:デフォルトの名無しさん
06/07/17 11:41:06
親父の本はこれとこれのビギナー編しかない
発行見てみたら1992年だった
古すぎ?

904:デフォルトの名無しさん
06/07/17 12:11:37
>>903
古いか新しいかじゃなくて、肝心な事がちゃんと書いてあるかどうか。
>>900の疑問に答えてくれる本、っていう基準で探すのもテだぞ。


905:デフォルトの名無しさん
06/07/17 12:30:42
本屋いってくるか・・・雨だけど・・・

906:デフォルトの名無しさん
06/07/17 15:49:17
void make_fare_table(int num, double *dist_list,
COSTUNIT *cost_list, int **fare_table) {

ていう関数を書いたとき、
引数のint **fare_tableはmainでどーやって指定すればいいんですか?
ちなみにfare_tableは2次元配列です。fare_table[30][30]って感じ。

907:デフォルトの名無しさん
06/07/17 16:06:42
void foo(int t[30][30]){
}
main(){
 int f[30][30] ;
 foo(f) ;
}
でいいんじゃない?

908:デフォルトの名無しさん
06/07/17 16:37:58
>>907
引数の型が指定されてるんですわ
これ基本情報技術者試験の過去問なんだけど

909:デフォルトの名無しさん
06/07/17 16:52:32
>>908
int **fare_tableが二次元配列なんてありえない。
移し間違えじゃないのか。

910:デフォルトの名無しさん
06/07/17 17:00:03
全部写すよ
#include

typedef struct { int max_dist; /* 上限距離(km) */
int unit_dist; /* 単位距離(km) */
int unit_cost; /* 単位距離ごとの運賃(円) */
} COSTUNIT;

void make_fare_table(int, double *, COSTUNIT *, int **);
int calc_fare(double, COSTUNIT *);

void make_fare_table(int num, double *dist_list,
COSTUNIT *cost_list, int **fare_table) {
int idx0, idx1;
double dist;

for (idx0 = 0; idx0 < num; idx0++) {
fare_table[idx0][idx0] = 0;
dist = 0.0;
for (idx1 = idx0 + 1; idx1 < num; idx1++) {
dist += dist_list[idx1-1];
fare_table[idx0][idx1]=fare_table[idx1][idx0]
=calc_fare(dist, cost_list);
}
}
}


911:デフォルトの名無しさん
06/07/17 17:01:17
int calc_fare(double dist, COSTUNIT *cost_list) {
int fare = 0, idx = 0;
int lower_limit; /* 区間の下限(直前の区間の上限距離) */
int upper_limit; /* 区間の上限(現在の区間の上限距離) */
lower_limit = 0;
upper_limit = cost_list[0].max_dist;
while (upper_limit!=0 && dist > (double)upper_limit) {
fare += ceil((double)(upper_limit-lower_limit)
/ (double)cost_list[idx].unit_dist)
* cost_list[idx].unit_cost;
lower_limit = upper_limit;
upper_limit = cost_list[++idx].max_dist;
}
fare += ceil((dist - (double)lower_limit)
/ (double)cost_list[idx].unit_dist)
* cost_list[idx].unit_cost;
return fare;
}


912:デフォルトの名無しさん
06/07/17 17:09:20
試しに入れたメインはこれ

main(){
COSTUNIT cost_list[4];
cost_list[0].max_dist=20;
cost_list[0].unit_dist=5;
cost_list[0].unit_cost=100;
cost_list[1].max_dist=100;
cost_list[1].unit_dist=10;
cost_list[1].unit_cost=180;
cost_list[2].max_dist=500;
cost_list[2].unit_dist=50;
cost_list[2].unit_cost=850;
cost_list[3].max_dist=0;
cost_list[3].unit_dist=100;
cost_list[3].unit_cost=1650;
double dist_list[10]={3.0,5.5,10.0,3.8,8.2,7.6};
int **fare_table[30][30];
make_fare_table(4,dist_list,cost_list,fare_table);
}


913:デフォルトの名無しさん
06/07/17 17:14:32
>>910
写し間違いじゃないのなら、問題が間違ってる。

914:デフォルトの名無しさん
06/07/17 17:17:41
つか、俺試験受けたこと無いけど、まさか「誤りを探せ」という問題じゃ
ないだろうな。

915:デフォルトの名無しさん
06/07/17 17:21:02
うそーん。マジ?

916:デフォルトの名無しさん
06/07/17 17:23:22
>>914
ちがうよ。ここみてよ
URLリンク(www.rs.kagu.sut.ac.jp)

917:デフォルトの名無しさん
06/07/17 17:33:29
>>916
問題が間違ってる。特にfare_table[m][n]のm != nだとありえない度うp。

918:デフォルトの名無しさん
06/07/17 17:33:34
for(i=0;i<30;i++)fare_table[i]=(int*)malloc(30*sizeof(int));
なヨカン

919:デフォルトの名無しさん
06/07/17 17:37:40
どうも・・・
でも普通間違ってる問題出すか!?仮にも国家試験だろう!
他の問題からベンキョします

920:デフォルトの名無しさん
06/07/17 17:49:23
>>918
fare_table[m][n]で、m != nダヨ。

921:920
06/07/17 17:51:32
いや、問題を読み違えてた。スマソ。
>>918で正解な予感。
int *fare_table[30]で、実引数はfare_table。
動かしてないけど。

922:デフォルトの名無しさん
06/07/17 18:10:02
>>918,921
それで出てきました。アリガトン

923:デフォルトの名無しさん
06/07/17 18:32:06
乗数演算子って無いの?

924:デフォルトの名無しさん
06/07/17 18:44:38
>>923
ない。
URLリンク(www.kouno.jp)

925:デフォルトの名無しさん
06/07/17 18:45:01
fscanfで文字を読み込んだ場合、ファイル位置表示子は移動しますか?

926:デフォルトの名無しさん
06/07/17 19:50:26
>>925
「位置表示子」とはなんぞ?
読み出しオフセットが気になるならftell()でもして味噌。

927:デフォルトの名無しさん
06/07/17 22:05:12
問題1.キーボードから63以下の2つの整数を変数a,bに入力して、a+bの結果がアスキーコードの対応する文字・記号となって出力されるプログラムを作れ。

問題2キーボードから英字1つを入力し、その英字より2つ前の英字(または数字、記号)を出力するプログラムを作れ

すみませんまったくの初心者です
宿題でまったくわかりません

928:デフォルトの名無しさん
06/07/17 22:05:56
>>927
C/C++の宿題を片付けます 66代目
スレリンク(tech板)l50

929:デフォルトの名無しさん
06/07/17 23:17:58
すれ違いでしたか
ありがとうございます。


930:デフォルトの名無しさん
06/07/18 11:26:53
typedef struct letter {
char c;
struct letter *follow;
struct letter *other;
char *trans;
} LETTER;

LETTER *p_root;

void main(){
LETTER *p = p_root;

って書いたら、
p
には何が入ってるんですか?

931:デフォルトの名無しさん
06/07/18 11:30:31
>>930
*p_rootに入っていた内容。初期化してないから何が入ってるかわからない。

932:デフォルトの名無しさん
06/07/18 11:44:43
p_root->c='m';
p_root->follow->c='a';
p_root->other->c='n';
p_root->trans=NULL;
だったら?

933:デフォルトの名無しさん
06/07/18 12:56:13
プログラムから別のプログラムを立ち上げる方法を教えてください。
ブラウザで例えるとmp3などのURLをクリックすると再生プレイヤーが立ち上がるような感じで、
そのmp3のURLを渡して起動させたいのですが
よろしくお願いします。

934:デフォルトの名無しさん
06/07/18 13:36:38
野球チームがnチームあり,1日にm試合ずつ消化して,総当たり戦を行うものとする.
各チーム名はA, B, C,...Zのようにアルファベットの頭文字で表されるものとする.
nは26以下,mは4以下とするとき,以下のような試合の日程表をつくりなさい.
全試合が終了するのに必要な日数と全試合数も表示すること.

Number of Teams -> 4
Number of Games per Day -> 4

-------- Schedule ----------
Day 1
Game 1 : A vs B
Game 2 : A vs C
Game 3 : A vs D
Game 4 : B vs C

Day 2
Game 1 : B vs D
Game 2 : C vs D
---------------------------
Total Number of Days : 2 days
Total Number of Games : 6 games
---------------------------
誰か作ってくれ・・・
わからん・・・

935:デフォルトの名無しさん
06/07/18 14:43:07
>>934
留年しろ。

936:デフォルトの名無しさん
06/07/18 15:01:43
>>932
pはポインタ。p_rootもポインタ。
その値は代入によって同じになっているはず。
つまり、p->c == p_root->c && p->follow->c == p_root->follow->c && p->other->c == p_root->other->c && p->trans == p_root->transということ。

>>933
環境依存でよければ、例えばWindowsならShellExecute()辺りが向いているかもしれない。
しかし、その程度のことも調べられないようなら手を出さない方が無難だとも思う。

>>934
宿題スレにでも逝ってみたら?

937:デフォルトの名無しさん
06/07/18 15:20:11
>>933
ありがとうございます。
これを足がかりにもう少し調べて見ます。

938:デフォルトの名無しさん
06/07/18 15:20:42
>>937>>936あてです。すみません。

939:デフォルトの名無しさん
06/07/18 15:58:56
>>936
次にね
while( p!=NULL ){
p=p->other;
}
って書いてあるんですよ。
このpって何を示してるの?
pのメンバ全部のこと示してる?

ちなみにこれも基本情報の過去問だけど…
URLリンク(www.rs.kagu.sut.ac.jp)
↑ここ

940:デフォルトの名無しさん
06/07/18 17:17:26
>>939
LETTER型のオブジェクト

941:デフォルトの名無しさん
06/07/18 17:17:33
pは構造体先頭を指している。

942:デフォルトの名無しさん
06/07/18 18:03:43
p->cのことでええんかな?
どうも~

943:デフォルトの名無しさん
06/07/18 18:17:53
URLリンク(kansai2channeler.hp.infoseek.co.jp)
Cでシェルを実装し、パイプラインをpipeシステムコールを使ってできる
ようにしたいのですが、3つ以上のコマンドを繋ぐことができません。
どのようにすればよろしいでしょうか?

944:936
06/07/18 19:00:14
>>939
だからpはポインタなんだってばさ。ポイントしている先があるかないかのチェックをしているわけだね。
だから>942は間違い。>941もおかしいな、先頭のみを指しているわけではないのだから。
つーか、ポインタの勉強してきなさいよ。

>>943
コメントもろくにないソースをいきなり読まされる身になってくれ。
つーか、どこが入門レベルなんだか。

945:943
06/07/18 19:30:15
>>944
すいません、実行後に標準入力からコマンドを入力し、そのコマンドをgetcl関数で
スペース毎にでargmv[0],argmv[1]...に格納し、exec_one_command関数で実行。
その中にパイプがあればパイプの処理をするという仕様です。
自分でやったところはexec_one_command内でgetclでできたコマンドからパイプを
見つけてそれをNULLに置き換え、パイプの数に応じてexecvpで実行していくという
ところです。

なんとかして完成させたいのですが、ここじゃ不味いですか('A`)
どこいけばいいでしょうか・・・


946:デフォルトの名無しさん
06/07/18 20:07:28
>>944
すいません
どこでベンキョしてくればいいでしょう
お勧めの本とかページとかあります?

947:デフォルトの名無しさん
06/07/18 20:08:56
void funcB()
{
return;
}

void funcA()
{
funcB();
printf();
}

こういう場合ってprintf()って作動しますか?

948:デフォルトの名無しさん
06/07/18 20:11:12
するよ

949:デフォルトの名無しさん
06/07/18 23:20:14
>>947
funcA()を呼べばね。

>>946
書籍スレにでもどうぞ。

>>945
ここでもいいけど、みての通りここだとレスつかないねぇ。
pipeなんて非標準だし、環境依存OKスレかUnixプログラミングスレ辺りかね。

950:デフォルトの名無しさん
06/07/19 00:36:41
>>944
先頭指してなかったら、キャストもせずに、->演算子使えるわけないじゃん。

951:デフォルトの名無しさん
06/07/19 00:51:03
>>950
アホ?

952:デフォルトの名無しさん
06/07/19 01:02:50
p->otherはstruct letter* だから>>941を間違いってのはアレだよな

953:デフォルトの名無しさん
06/07/19 07:50:03
for(;;)とwhile(1)はどっちがはやいんですかね?

954:デフォルトの名無しさん
06/07/19 08:03:07
>>953
大丈夫、お前よりもよっぽど賢いコンパイラにとって、それらはどちらも同じと解釈されるから気にするな。
#まぁ、前者を推奨するがな。

955:デフォルトの名無しさん
06/07/19 09:10:13
大昔の頭の悪いコンパイラだと for(;;) の方が早いとか聞いた気もするが、
今のコンパイラならどっちでもいいな。

956:デフォルトの名無しさん
06/07/19 09:12:34
(;;)

957:デフォルトの名無しさん
06/07/19 09:52:47
(;o;)

958:デフォルトの名無しさん
06/07/19 10:03:37
(;A;)

959:デフォルトの名無しさん
06/07/19 10:14:25
('A')

960:デフォルトの名無しさん
06/07/19 10:46:03
("ω")

961:デフォルトの名無しさん
06/07/19 11:29:39
( ; _ ; )

962:デフォルトの名無しさん
06/07/19 16:27:56
(T-T)

963:デフォルトの名無しさん
06/07/19 17:36:00
(:-D)

964:デフォルトの名無しさん
06/07/19 17:42:05
:-D~~

965:デフォルトの名無しさん
06/07/19 22:24:10
>>863
void SASSERT_(int(*p)[1]) { }
#define SASSERT(b) SASSERT_((int(*)[(b) ? 1 : -1])0)

は、単に

#define SASSERT(b) ((void)(int(*)[(b) ? 1 : -1])0)

でいいことに今頃気づいた。

966:デフォルトの名無しさん
06/07/21 00:37:15
K&R本の1.5.2 文字のカウント
のプログラムをちゃんと打って、シグウィンでコンパイルしても
実行したら全くカウントしてくれないのですが、
どうしてでしょうか?誰か教えて下さい。

967:デフォルトの名無しさん
06/07/21 02:24:54
>>966
そのプログラムを貼れ。

968:デフォルトの名無しさん
06/07/21 07:27:35
#include <stdio.h>

/* 入力される文字をカウント;第1版 */
main()
{
long nc;

nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}

969:デフォルトの名無しさん
06/07/21 08:29:16
入力を終了しないからいつまで経っても表示されないだけに一票。

970:デフォルトの名無しさん
06/07/21 09:21:38
でもこっちはちゃんとできるんですよ。

#include <stdio.h>

/* 入力された文字を複写;第2版 */
main()
{
int c;

while((c = getchar()) != EOF)
putchar(c);
}

971:デフォルトの名無しさん
06/07/21 10:54:10
いやだから・・・。

972:デフォルトの名無しさん
06/07/21 11:50:37
ST.c: 関数 `function2' 内:
FLIST.c:75: 警告: 引数 2 個の `strcat' を渡しますにより、キャストなしで整数からポインタを作りました
:wq!

上記の警告がでました。問題の75行目 strcatは以下です。
strcat(strLine,ctime( &buf.st_mtime ));/*警告箇所*/
st_mtimeはファイル情報を取得する処理【stat関数】のメンバでbufの変数定義は
struct stat buf;、strLine変数はchar strLine[255];としております。
警告を回避するキャストの方法を教えてください。環境はLinux redhatです。

973:デフォルトの名無しさん
06/07/21 12:24:15
>>972
#include <time.h>
してないってことはない?

974:デフォルトの名無しさん
06/07/21 12:40:43
レスありがとうございました。インクルード記述はあります。
プラットホームをUnixからlinuxに移した際に
リコンパイルで警告がでました。

975:デフォルトの名無しさん
06/07/21 13:04:56
>>974
その周辺ロジックだけのプログラム作っても再現する?
こちらでは問題ないのだが。
以下、テストコード。
--
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

int main(int argc, char ** argv)
{
char strLine[255];
sprintf(strLine, "%s:", argv[1]);
struct stat buf;
stat(argv[1], & buf);
strcat(strLine,ctime(&buf.st_mtime));
puts(strLine);
return 0;
}


976:デフォルトの名無しさん
06/07/21 13:32:38
>>968
それは何か入力後に EOF を渡す必要がある。
これは Cygwin だとどうなっているのか分からないが、
UNIX 系 OS だとデフォルトでは Ctrl+D でできるのが
普通だ。Windows のコマンドプロンプトや MS-DOS
プロンプトでは Ctrl+Z だ。どちらかを入力してみれば
できるんじゃないだろうか。


977:968
06/07/21 15:13:46
>>976
ありがとうございます。Ctrl+Zで出来ました。

978:デフォルトの名無しさん
06/07/21 15:18:18
結局>969じゃん。

979:968
06/07/21 16:38:45
間違えました。Ctrl+Dでした。

>>978
入力を終了しなくても出来そうだな、とか
馬鹿な考えを起こしていたもので...m(_ _)m

980:デフォルトの名無しさん
06/07/22 14:43:42
> 賢いコンパイラにとって、それらはどちらも同じと解釈されるから
while(1) だと警告がでる
for(;;) だとでない

981:デフォルトの名無しさん
06/07/23 12:03:52
プロトタイプ宣言のない関数’printf'の呼び出し(関数main)
という警告文が出るけどなに?

982:デフォルトの名無しさん
06/07/23 12:07:13
>>981
#include <stdio.h>がないとか
printfがpirntfになってたりとかじゃないかな?

983:981
06/07/23 12:10:28
>>982
その辺は確認しているのだけど
 そのへんが問題なのかな?

984:デフォルトの名無しさん
06/07/23 12:33:16
こういう場合、ソースを貼り付けたら一発で分かったりすることも多い。

985:981
06/07/23 12:46:51
#include <sudio.h>

int main( )
{
int n=500+ 150;
printf("%d", n);
return 0;
}
こんな感じなんだけど諸兄の
意見はいかがですかね?

986:デフォルトの名無しさん
06/07/23 12:48:02
int a;
char s[3] = "FF"

a == 255
みたいなイメージで、文字データとして16進の形でcharの配列に入ってるものをint形の変数に代入する方法ってない?


987:デフォルトの名無しさん
06/07/23 12:48:41
1はツンデレ

988:デフォルトの名無しさん
06/07/23 12:52:46
>>985
1行目で既に破綻が

989:デフォルトの名無しさん
06/07/23 12:59:38
>>986
strtol

990:981
06/07/23 13:00:32
>>988
ありがと。いまきずいた(汗

991:986
06/07/23 13:04:15
>>989
さんくす、助かった

992:デフォルトの名無しさん
06/07/23 18:01:34
よくコンパイルまで行ったな。

993:デフォルトの名無しさん
06/07/24 10:40:46
おまいら日本語よりC言語のほうが意思疎通出来るんだな(w

994:デフォルトの名無しさん
06/07/24 10:55:00
次スレは>>995が立てるそうです。

995:デフォルトの名無しさん
06/07/24 18:38:56
次スレはいらない。

996:デフォルトの名無しさん
06/07/25 09:49:42
入らなかったら拡張しろ

997:デフォルトの名無しさん
06/07/25 16:42:16
1000

998:デフォルトの名無しさん
06/07/25 18:11:33
スマン…まさか携帯から立つとは思わなかったんだ…
次スレ
C言語なら俺に聞け(入門篇) ぱぁと2~
スレリンク(tech板)

スレタイについては反省していない

999:デフォルトの名無しさん
06/07/25 18:21:20
>>998


1000:デフォルトの名無しさん
06/07/25 18:29:03
>>998
おまえというやつは・・・乙

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


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