トップページ⇒tech
1001コメント308KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/09(木) 00:31:01
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 3
http://pc8.2ch.net/test/read.cgi/tech/1160682950/

過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/


関連スレ
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/
0116デフォルトの名無しさん2006/11/11(土) 15:47:27
すまん Linux(RHEL AS4)の
rawデバイスに対してdatファイルを
writeして、readでInvalid Argument (errno=22)
エラーになるんだがこれって本当に読み出し
出来てないのかな?

rawデバだから読み出し出来てないってOSが
認識してるだけだと思ったんだけど・・・

どうやったら正常にreadさせられるのか
どなたか教えてくださいませ
0117デフォルトの名無しさん2006/11/11(土) 15:47:41
>>112
malloc()のような低水準の処理はアセンブラか機械語、
でも機械語はあり得ないからやっぱりアセンブラだと思うんですけど(><)
0118デフォルトの名無しさん2006/11/11(土) 15:48:23
>>115-116
難しいことはわかりません(><)
0119デフォルトの名無しさん2006/11/11(土) 15:49:14
malloc自体にはアセムは使ってないと思うぞ。
0120デフォルトの名無しさん2006/11/11(土) 15:49:43
単純なメモリ操作だからかな
0121デフォルトの名無しさん2006/11/11(土) 16:11:04
ある本のamazonのコメントで、
>ブロックと関数とループを混同していることなどは看過できない
とあるのですが、これは、どういう意味でしょうか?
こういう批判のある本はやめといたほうがいいのですかね?
0122デフォルトの名無しさん2006/11/11(土) 16:38:01
>>121
混合する奴の頭の中をみてみたい。
多分スコープ辺りだと思うけどどう書かれてるのかは気になるな。
0123デフォルトの名無しさん2006/11/11(土) 16:58:44
ああ、ちなみに、「やさしいC」です。
結局はやめといたほうがいいのですか?
0124デフォルトの名無しさん2006/11/11(土) 17:09:06
>>115
例えばsin()を考える。
最適化オプションを指定されていなければ関数を呼び出すであろう。
しかし、そうでないならFPU命令をインライン展開するはずだ。
更に、sin()呼び出しの前後に同じ引き数でcos()呼び出しもあったとする。
コンパイラによってはFPU命令のsincos同時演算命令を展開するかも知れん。
また、memcpy(), memset()なども大抵は極力高速になるようにインライン展開されるだろう。
斯くの如く、コンパイラ付属の標準関数がアセンブリ言語で書かれている可能性は幾らでもある。

>>122
混合する奴はいないだろ、いるのは混同する奴だ。
0125デフォルトの名無しさん2006/11/11(土) 19:35:44
>>116
つ man 8 raw
というかすれ違いだ。
0126デフォルトの名無しさん2006/11/11(土) 21:18:32
>>98
そもそも現在のBorland C++は、32ビットWindows用のコンパイラであり、
WindowsはVRAMを直に触らせないので、VRAMをいじるという解決策は不可能。

WindowsではWindows APIがもっともOSに近い存在。
0127デフォルトの名無しさん2006/11/11(土) 22:43:45
>>98
wincon.h 読め。
0128デフォルトの名無しさん2006/11/11(土) 23:27:40
C言語でゲームやエディタなどを作ろうと思ったらWINAPIやダイレクトXを使わなかったら
コマンドプロント上での動作みたいな感じになるんでしょうか?
VBとかはwindowがあることが前提っていうか、そんな感じに見えるのですが
変な質問か分かりませんが教えてくれるとありがたいです。
0129デフォルトの名無しさん2006/11/11(土) 23:36:02
>>128
なんか日本語が変だが言わんとしていることは分かる。
答えはyesで、Windowsでの一般的なGUIアプリを作りたいなら、
WIN32 APIかDirectXか、またはそれらを取り込んだライブラリを使用する必要がある。
C言語のみでは、入出力としてはファイルかコンソールへのテキストのみしかできない。
0130デフォルトの名無しさん2006/11/12(日) 00:18:26
128じゃないけど、なんかがっくりきた
winアプリ学ばないと作れ無いのか・・・
0131デフォルトの名無しさん2006/11/12(日) 00:27:30
>>130
winアプリ学ばないとってのがよく分からん
WINAPIのことか?
MSでVC無料で配布してるんじゃなかったっけ?
それ使え
0132デフォルトの名無しさん2006/11/12(日) 00:28:58
VB 気分で行きたいなら、C++ で MFC あたりの VS に入ってるスケルトン使うか、
使ったこと無いから知らんけど C# あたりに行けばいいんちゃう?
0133デフォルトの名無しさん2006/11/12(日) 00:42:47
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int card[4][13];
char total[13] = {11,2,3,4,5,6,7,8,9,10,10,10,10};
char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
char mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
int drawCard(int h);

main(){
int dealer;//ディーラーの引いた合計の数
int player;//プレイヤーの引いた合計の数
int draw_digit;//引いたカードの数
int draw_mark;//引いたカードのマーク
char y_n;//カードを引くか引かないかの答え

srand(time(NULL));
printf("【ブラックジャック】\n");

0134デフォルトの名無しさん2006/11/12(日) 00:43:58
//ディーラーが引く
draw_mark = rand()%4 + 1;
draw_digit = rand()13 + 1;
card[draw_mark-1][draw_digit-1] = 1;
dealer = total[draw_digit-1];
printf("ディーラー一枚目:%sの%s\n",mark[draw_mark-1],,digit[draw_digit-1]);
printf("他は伏せる\n");

//プレイヤーが引く
printf("プレイヤー一枚目:");
player = drawCard(1);
printf("プレイヤー二枚目:");
player += drawCrad(1);

//ディーラー2枚目以降
do{
dealer += drawCard(0);
}
while(dealer <= 16);

//プレイヤー3枚目以降
while(player <21){
printf("もう一枚引きますか?(y\n) > ");
scanf("%c",&y_n);
while(getchar() != '\n'){}
if(y_n == 'y'){
player += drawCard(1);
}
else if(y_n == 'n'){break;} }
        printf("\nディーラー:%d点 プレイヤー:%d点\n",dealer,player);

0135133、ずれてしまったので最初から訂正です2006/11/12(日) 00:45:35
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int card[4][13];
char total[13] = {11,2,3,4,5,6,7,8,9,10,10,10,10};
char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
char mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
int drawCard(int h);

main(){
int dealer;//ディーラーの引いた合計の数
int player;//プレイヤーの引いた合計の数
int draw_digit;//引いたカードの数
int draw_mark;//引いたカードのマーク
char y_n;//カードを引くか引かないかの答え

srand(time(NULL));
printf("【ブラックジャック】\n");

//ディーラーが引く
draw_mark = rand()%4 + 1;
draw_digit = rand()13 + 1;
card[draw_mark-1][draw_digit-1] = 1;
dealer = total[draw_digit-1];
printf("ディーラー一枚目:%sの%s\n",mark[draw_mark-1],,digit[draw_digit-1]);
printf("他は伏せる\n");

0136133、ずれてしまったので最初から訂正です2006/11/12(日) 00:46:32
//プレイヤーが引く
printf("プレイヤー一枚目:");
player = drawCard(1);
printf("プレイヤー二枚目:");
player += drawCrad(1);

//ディーラー2枚目以降
do{
dealer += drawCard(0);
}
while(dealer <= 16);

//プレイヤー3枚目以降
while(player <21){
printf("もう一枚引きますか?(y\n) > ");
scanf("%c",&y_n);
while(getchar() != '\n'){}
if(y_n == 'y'){
player += drawCard(1);
}
else if(y_n == 'n'){break;}
}

printf("\nディーラー:%d点 プレイヤー:%d点\n",dealer,player);

0137133、ずれてしまったので最初から訂正です2006/11/12(日) 00:47:13
//勝敗の判定
if((dealer <= 21 && player > 21)||(dealer <= 21 && dealer > player)) {
printf("ディーラの勝ち!\n");
}
else if((player <= 21 && dealer > 21)||(player <= 21 && player > dealer)){
printf("プレイヤーの勝ち\n");
}
else{printf("引き分け\n");}
return 0;
}

int drawCard(int h){
int draw_mark,draw_digit;//引いたマークと数
int r;//引いたカードの点数
char y_n;//カードを11として計算するか否か

do{
draw_mark = rand()%4 + 1;
draw_digit= rand()%13 + 1;
}
while(card[draw_mark-1][draw_digit-1]);
card[draw_mark-1][draw_digit-1] = 1;
if(h){
printf("%sの%s\n",mark[draw_mark-1],digit[draw_digit-1]);
}

0138133、ずれてしまったので最初から訂正です2006/11/12(日) 00:52:33
if (h && draw_digit == 1)
{//プレイやターンで引いた数が1の時
do{
printf("11として計算しますか?(y_n) > ");
scanf("%c",&y_n);
while(getchar() != '\n'){}
if(y_n == 'y'){r = total[draw_digit-1];}
else if(y_n == 'n'){r = 1}
}
while(!(y_n == 'y' || y_n == 'n'));
}
else{r = total[draw_digit-1];}
return r;
}

blackgack.c:
エラー E2225 blackgack.c 8: 初期化子が多すぎる
エラー E2291 blackgack.c 8: } が必要
エラー E2141 blackgack.c 8: 宣言の構文エラー
エラー E2190 blackgack.c 8: 不要な }
エラー E2190 blackgack.c 8: 不要な }
エラー E2379 blackgack.c 23: ステートメントにセミコロン(;)がない(関数 main )
エラー E2188 blackgack.c 26: 式の構文エラー(関数 main )
警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数
main )
エラー E2379 blackgack.c 87: ステートメントにセミコロン(;)がない(関数 drawCar
d )
*** 8 errors in Compile ***

このエラーの行を見ても直すに直せません。; など足りているのですが・・・
ご指摘お願いします。
0139133、ずれてしまったので最初から訂正です2006/11/12(日) 01:02:15
blackgack.c:
エラー E2379 blackgack.c 23: ステートメントにセミコロン(;)がない(関数 main )
エラー E2188 blackgack.c 26: 式の構文エラー(関数 main )
警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数
main )
*** 2 errors in Compile ***

ここが、どうしてもわかりません。
0140デフォルトの名無しさん2006/11/12(日) 01:03:00
>>135
>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
*これ不要、それとどうでもいいが初期化項目は12個だが・・・

>draw_digit = rand()13 + 1;
rand() と 13  の間に演算子が無い

>printf("ディーラー一枚目:%sの%s\n",mark[draw_mark-1],,digit[draw_digit-1]);
-1],,digit ,, 2つ繋がってる
0141デフォルトの名無しさん2006/11/12(日) 01:04:37
>char mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
これなにをしてるか分かってるか?
01421402006/11/12(日) 01:07:40
>>135
>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
あと文字単位(文字列ではない)での初期化 ”A” ではなく ’A’ だろ
01431402006/11/12(日) 01:10:23
>>135
player += drawCrad(1);
Crad のスペルミス
01441402006/11/12(日) 01:11:14
>>135
else if(y_n == 'n'){r = 1}
1の後ろにセミコロン
0145133、ずれてしまったので最初から訂正です2006/11/12(日) 01:12:56
>>140
ご返答、ありがとうございます。
>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
*これ不要、それとどうでもいいが初期化項目は12個だが・・・

これに関しては参考書の通りに書いていますが・・・
違うのでしょうか?

>>141
ありがとうございます、ポインタですね。


実行できたにはできたのですが
初めてみる、エラーが出てしまいました

blackgack.c:
警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数
main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_drawCrad' が未解決(C:\BBB\BLACKGACK.OBJ が参照)

>>Error: 外部シンボル '_drawCrad' が未解決(C:\BBB\BLACKGACK.OBJ が参照)
こんなエラー初めてです。参考書のエラー対策にも載っていません。
01461402006/11/12(日) 01:14:41
>>145
スペルミス直したか?
>drawCrad
drawCard
a と r が逆
0147デフォルトの名無しさん2006/11/12(日) 01:15:07
>>133
コードを何レスにも渡って貼り付けた後に質問をするんじゃなく、
先に質問を書いてからコードを貼り付けてほしい。
もしくはコードはどこかのアップローダにあげとくとか。
01481402006/11/12(日) 01:19:20
>>145
char digit[13] = {'A','2','3','4','5','6','7','8','9','10','J',''Q',K'};
個数足りないと思ったら Q が抜けてる

>char mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
2次元配列に
char mark[4][12] = {"ハート","ダイヤ","スペード","クローバー"};
0149133、ずれてしまったので最初から訂正です2006/11/12(日) 01:20:10
>>146できました!!!!
参考書の結果とは違いますが・・・

>>147
ごめんなさい、次からそうします

01501402006/11/12(日) 01:23:02
>>149
>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
そうか、ポインタ配列にそれぞれの文字列のポインタを格納してるのか

この部分は直さなくてもいいよ
でも Q は追加してね
0151133、ずれてしまったので最初から訂正です2006/11/12(日) 01:23:14
>>148
ありがとうございます
自分でもきづきませんでした
0152デフォルトの名無しさん2006/11/12(日) 01:25:00
>>140
>>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
>*これ不要、それとどうでもいいが初期化項目は12個だが・・・

char digit[13]={'A', 'B', <略> 'K' }; とさせたいようだが、
digitはchar * の配列としてソース本文?の中で使用しているのだから
元のままでいいだろう。
1文字の文字列しかないなら文字定数でも事足りるといいたいのだろうが、
それをはっきりといわなければ135が混乱するだけじゃない?
別にここのエラーとは関係の無い問題なのだし。
01531522006/11/12(日) 01:25:57
>>150
お、書き込み気づかなかった。忘れてくれ。
0154デフォルトの名無しさん2006/11/12(日) 01:28:26
>>148
2次元配列にするより
char *mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
でいいだろ
01551402006/11/12(日) 01:31:41
>>153
いやいや、実は俺こういう方法気づかなかった
いままで
char digit[13] = {'A','2','3','4','5','6','7','8','9','10','J',''Q',K'}; か
char digit[] = {"A2345678910JQK"}; のように
文字列として初期化してた

ポインタ配列って方法もあったんだなと、気づかされたよ
俺もまだまだ勉強不足だと実感・・・・・

>>154
上のと同じだな・・・・
0156デフォルトの名無しさん2006/11/12(日) 01:34:21
>>149
参考書に載っているコードをそのまま打ち込んでるがコンパイルエラーになるということ?
Qが抜けてることからも分かるが、打ち込みミスが多いんじゃないか。
質問をする前に、自分が書いたソースと参考書を「一字一句」比較すべし。

>>145
>こんなエラー初めてです。参考書のエラー対策にも載っていません。
その参考書はC言語のすべてを網羅した魔法の本ではない。本に載ってないことは分からない、ではなく
もっと調べる対象を広げるべき。
コンパイラの出すエラーなら、コンパイラのマニュアルなどを調べる。
VC++とかならMSDNにたいていのことが載っている。BCCのことはよく知らんが。

すぐ上の行に
>警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数 main )
とある。プロトタイプ宣言が何かを知ってる? まずはそれをその参考書で調べること。

とりあえずコンパイルエラーがたくさん出たら、一番上のから順に解決していけ。
一つの原因から、それに連鎖してさまざまなエラーが出る。一つをつぶせばそれに関連していくつかのエラーが消えることがある。
01571402006/11/12(日) 01:37:00
>>145
>>Error: 外部シンボル '_drawCrad' が未解決(C:\BBB\BLACKGACK.OBJ が参照)
ちなみにこれはdrawCradという関数が使われているが関数の実体が無いよ、と言っている
0158デフォルトの名無しさん2006/11/12(日) 02:20:13
>>129
そうなんですか

じゃあIEとかペイントとかメモ帳とかをCで作ろうと思ったら
WINAPIやらそれ関係が入っているライブラリを呼び出して作るんでしょうか?
なんていうかその呼び出す関数もCで作られてるんですよね?

んー;;なんかよく分からない
Cがすごくできる人の定義ってなんなんでしょう・・
0159133、ずれてしまったので最初から訂正です2006/11/12(日) 02:49:03
>>156
はい、ここで訊く前にもっと調べたりエラーを
たどってみます
01601562006/11/12(日) 03:26:37
最初は調べ方が分からないのは仕方の無いこと。
問題に対する解決方法を知るのも大事だが、
自分で解決方法を見つけらるようにする方法を学ぶことも大事。
がんばれ。
0161デフォルトの名無しさん2006/11/12(日) 03:31:28
>>159
プログラミングに向いてないな。いい加減コテつけっぱなしなことに気付けよ。
0162デフォルトの名無しさん2006/11/12(日) 04:51:31
#define NUM 3
どうしてもソートできないのです。身長順にしたいんですが・・
構造体の配列のソートってむずかしい。。
typedef struct Person{
char name[100];
double height;
}Person;
int main(void)
{
Person prs1[NUM];
int a,b,c,d;
double tst;
for(a=0; a<3; a++){
printf("名前を入力してください。\n");
scanf("%s",prs1[a].name);
printf("身長を入力してください。\n");
scanf("%lf",&prs1[a].height);
}
for(b=0; b<NUM-1; b++){
for(c=0; c<NUM; c++){
if(prs1[c].height > prs1[b].height){
tst = prs1[c].height;
prs1[c].height = prs1[b].height;
prs1[b].height = tst;
}
}
}
for(d=0; d<NUM; d++){
printf("%sさんは%lfセンチです。\n",prs1[d].name,prs1[d].height);
}
return 0;
}
0163デフォルトの名無しさん2006/11/12(日) 07:13:19
>>162
Person tmp;

for(b=0; b<NUM-1; b++){
for(c=b+1; c<NUM; c++){
if(prs1[c].height > prs1[b].height){
tmp=prs1[c];
prs1[c]=prs1[b];
prs1[b]=tmp;
}
}
}
0164デフォルトの名無しさん2006/11/12(日) 07:13:35
それだと構造体のソートじゃなくて
構造体のメンバ(身長だけ)を入れ替えてるだけだと思うんだけど
0165デフォルトの名無しさん2006/11/12(日) 07:14:34
うほ、>>163が先に書いてた
0166デフォルトの名無しさん2006/11/12(日) 07:36:19
>char digit[13] = {'A','2','3','4','5','6','7','8','9','10','J',''Q',K'};

'10' とか書いてる時点で釣りだろ?
0167デフォルトの名無しさん2006/11/12(日) 08:00:06
>>126
>>127
ありがとんです
MS-DOS時代のものを
ちょっといじるだけではだめなのですね(!=)
wincon.hをぐぐってきます〜
01681622006/11/12(日) 10:37:55
ほんとは、名前も入れ替えたいんですけど、とりあえず身長だけでもと、
なんでtstがtmpに変わってるのか意味がわからないんですが・・
163の文章をどこかに入れ替えればいいのでしょうか?
やったんだけどうまくいきませぬ。。
0169デフォルトの名無しさん2006/11/12(日) 11:22:17
man qsort
01701622006/11/12(日) 11:27:27
できました。
c=b+1のとことPersonのとこでした。
ありがとうございました。
0171デフォルトの名無しさん2006/11/12(日) 13:17:00
コンパイルでエラーが出ないようにするのを教えてください!
0172デフォルトの名無しさん2006/11/12(日) 13:22:13
>>171
エラーになっている行を消す を繰り返す
0173デフォルトの名無しさん2006/11/12(日) 15:34:04
>>171
エラーを出さない怠け者なコンパイラを 使う
0174デフォルトの名無しさん2006/11/12(日) 18:29:39
1&>/dev/null

ごめんUNIXよくわかんない
0175デフォルトの名無しさん2006/11/12(日) 18:47:47
そんなこと聴いてるんじゃありません!
わからないなら答えないでください!
0176デフォルトの名無しさん2006/11/12(日) 18:48:55
エラーが出なくなったら大変なんだぜ
0177デフォルトの名無しさん2006/11/12(日) 19:03:58
>>171
コンパイラの性能にではなく
オマエの性能をうp
0178デフォルトの名無しさん2006/11/12(日) 19:16:18
理3です。
0179デフォルトの名無しさん2006/11/12(日) 20:02:32
李さん?シナに帰れ
0180デフォルトの名無しさん2006/11/12(日) 20:33:01
離散家族? さもありなん。
0181デフォルトの名無しさん2006/11/13(月) 00:15:14
c言語の構造体についての質問なんですが、
構造体のメンバー名に変数を使用することはできないのでしょうか?
0182デフォルトの名無しさん2006/11/13(月) 00:18:22
>>181
???
試してみりゃいいじゃん
もしくは具体的な例を店ろ
0183デフォルトの名無しさん2006/11/13(月) 00:27:15
>>181
メンバー名をchar配列とかで決めるってことか?
0184デフォルトの名無しさん2006/11/13(月) 00:32:52
>>182
試したりしてるんですが、いかんせん勉強したてで...

>>183
まさにそれがやりたいんです
char配列で宣言したり、アクセスしたりしたいんですが...
0185デフォルトの名無しさん2006/11/13(月) 00:45:51
メンバー名は区別のための名前であって文字列じゃないから無理じゃね?
0186デフォルトの名無しさん2006/11/13(月) 00:51:53
>>185
やっぱ無理ですか...
無理だと分かるだけでもありがたいです。
どうもありがとう
0187デフォルトの名無しさん2006/11/13(月) 01:12:23
変数名を変数で指定できるか、みたいな感じだな。
0188デフォルトの名無しさん2006/11/13(月) 09:10:31
str_bの中身をstr_aにコピーするプログラムですが
上の関数の中身をs1=s2;にしたらコピーできない理由がわからないです
1文字ずつ比較しないとだめなのでしょうか

#include <stdio.h>
#include <string.h>

#define MAX 10


void str_copy(char *s1,char*s2)
{
while(*s2!='\0')
*s1++ = *s2++;

*s1 ='\0';
}

int main(void)
{
char str_a[MAX]="abcde";
char str_b[MAX]="fghi";

printf("str_a:%s, str_b=%s\n",str_a,str_b);

str_copy(str_a,str_b);

printf("str_a:%s,str_b=%s\n",str_a,str_b);

return 0;
}
0189デフォルトの名無しさん2006/11/13(月) 09:40:59
それだと、関数内でアドレスをコピーしたにすぎないし、
呼び出し元のstr_a, str_bには全く影響受けない
0190デフォルトの名無しさん2006/11/13(月) 10:08:05
ヘタレはC++でもやってろよ(プ
0191デフォルトの名無しさん2006/11/13(月) 11:37:54
ヘタレはC#でもやってりょ(ぷ
0192デフォルトの名無しさん2006/11/13(月) 12:04:00
struct aという構造体は自分と同じstruct a型の変数をメンバとすることができない理由がわかりません。教えてください
0193デフォルトの名無しさん2006/11/13(月) 12:07:12
>>192
構造体のサイズが無限大になるから
0194デフォルトの名無しさん2006/11/13(月) 12:20:43
#ifdef MODE

"モード1選択"
#else

"モード2選択"
#endif

#ifdefでどちらが選択されたかをコンパイル時にコンソールに表示したいのですが、
なにか方法はないでしょうか?
0195デフォルトの名無しさん2006/11/13(月) 12:30:46
コンパイラのヘルプ見ろ。
# 多分 #pragma で出ることが多い
0196デフォルトの名無しさん2006/11/13(月) 13:14:03
#pragma message("モード2")
#message モード2

でできました。有り難うございました。
C51を使用してますが、手持ちのヘルプには記載ありませんでした。
0197デフォルトの名無しさん2006/11/13(月) 16:16:07
>>195
「コンパイル時」
0198デフォルトの名無しさん2006/11/13(月) 16:17:20
C言語の質問なんですが、
double型の変数で整数の部分だけを出力するにはどうしたらいいですか?
0199デフォルトの名無しさん2006/11/13(月) 16:25:15
>>198
double val = 1234.5678;

printf("%.0f");
->1235
printf("%d", (int)val);
->1234
0200デフォルトの名無しさん2006/11/13(月) 17:03:08
>>199
ありがとうございます
切捨てと切り上げの両方できるんですね。

そしてsage忘れてすみません・・・。
0201デフォルトの名無しさん2006/11/13(月) 18:10:02
%0.fは切り上げではなく、丸めている。
切り上げはceil。
切り捨てのfloorもある。
0202デフォルトの名無しさん2006/11/13(月) 19:05:17
>>192
struct a(a1) に struct a(a2) を持たせるとその struct a(a2) もstruct a(a3) を持つのでその struct a(a3) はさらに struct a(a4) を持つので(ry
となってしまう

struct a へのポインタなら持たせられるにょ
0203デフォルトの名無しさん2006/11/13(月) 19:11:12
>>201
(VC++の場合)まるめの方向が0へ向かう四捨五入(?)っぽいね?
printf("%.0lf %.0lf %.0lf %.0lf", -123.5, -123.4, 123.4, 123.5);
→ -124 -123 123 124

このときの振る舞いは環境依存?
0204デフォルトの名無しさん2006/11/13(月) 19:13:50
>>203
C言語としては負数のとき丸め方向は定義されてないから
コンパイラの実装依存と思う

と調べずにカキコ
0205デフォルトの名無しさん2006/11/13(月) 19:21:42
CとC+とC++とC#の違いがわかりません。
素人なんですが、わりやすくどなたかおしえていただけないでしょうか?
0206デフォルトの名無しさん2006/11/13(月) 19:22:24
>>203
単に絶対値で丸めってだけじゃね

と便乗して調べずレス
0207デフォルトの名無しさん2006/11/13(月) 19:43:07
>>205
文法が似ているのと、ライブラリ関数が似ているだけで
まったく別の言語です
0208デフォルトの名無しさん2006/11/13(月) 20:08:42
>>207
ありがとうございます。
0209デフォルトの名無しさん2006/11/13(月) 20:18:27
>>208
Cを拡張、ベースにしたもの
まぁCをまねてC+やC++など作ったみたいな
結果的には別物...
0210デフォルトの名無しさん2006/11/13(月) 20:19:40
CとObjectCだけ覚えればOK
0211デフォルトの名無しさん2006/11/13(月) 20:30:36
>>209
>>210
とりあえずCを勉強すればC+やC++などの方にも応用がきくといった感じですか?
ありがとうございました。
0212デフォルトの名無しさん2006/11/13(月) 20:33:13
C+とかC++なんて覚えるだけ無駄。
限られた特定の環境でしか使わない。
覚えるなら Objective-C にしろ。
0213デフォルトの名無しさん2006/11/13(月) 20:40:04
偶にいるんだよな、敵作りの天才って
0214デフォルトの名無しさん2006/11/13(月) 20:41:16
これから流行るならって観点ならC#だろう。

それでもC++すきだけどな
0215デフォルトの名無しさん2006/11/13(月) 20:48:58
C++はCと微妙に互換性がないからなあ。
Objective-CはCとの互換性があるけど、現実的じゃない。
■ このスレッドは過去ログ倉庫に格納されています