C言語なら俺に聞け( ..
[2ch|▼Menu]
75:71
08/08/13 11:46:14
>>72
linuxとかが開発に向いてるってのは聞いたことあるけどプログラム初めてなんで
とりあえずお手軽なとこで・・・

>>73
初心者がちまちまやってる分には特に問題なさそうですね

どうもありがとうございました。さっそくインストールしてみます。


76:デフォルトの名無しさん
08/08/13 11:53:19
勝ち誇りage

77:デフォルトの名無しさん
08/08/13 15:08:34
VSEE入れてコマンドラインからcl叩く分にはlinuxでgcc使うのと大して変わらんと思うがなあ
IDEを使うと便利なんだけど、IDEを使えるようになるまでの苦労というものが初心者にはあるから。。

78:デフォルトの名無しさん
08/08/13 19:43:09
私もVisual C++ 2008 Express Editionをインストールしてみました。 
いろんなサイト見て、ひとつ練習にプログラムを作りました。 

そのあと次に新しいものを作るとき、また最初からプロジェクトとか
作る必要があるのでしょうか。「新規作成→ファイル」で作れると思ったのですが… 
新しいプログラムを作るやり方を教えてください。よろしくお願いします。 


79:デフォルトの名無しさん
08/08/13 19:46:24
>>78
新規プロジェクトでまずいことでも?

80:デフォルトの名無しさん
08/08/13 19:57:23
>>79 
いえ、毎回プロジェクトから作っていく以外に方法があるのかと思った次第です。
例えば、同じプロジェクトの中に新しいファイルを作って保存したりできないかと… 
毎回新しくプロジェクトを作るのが当然のことでしたらそれでやるしかありませんので。
特に問題ありません。 

今、いつくかのサイトで調べてみましたら、
「作成される実行ファイルは、一つのプロジェクトにつき一つだけです。 」と書いてありました。 
毎回プロジェクトから作る必要があるみたいですね。




81:デフォルトの名無しさん
08/08/13 20:01:08
>>80
> 例えば、同じプロジェクトの中に新しいファイルを作って保存したりできないかと…
それは可能ですよ。だけど、main関数のあるファイルは追加しない。
追加するとどうなるんだ?mainが2つあるというエラーメッセージが出るんじゃないかな?

82:デフォルトの名無しさん
08/08/13 20:12:24
いいかげんスレ違い
スレリンク(tech板:1番)


83:デフォルトの名無しさん
08/08/13 22:18:19
VC++で拡張子が.cのものをコンパイルすると

1>cl : コマンド ライン error D8045 : C ファイル '.\Test.c' を /clr オプションと共にコンパイルできません

とエラーになることがあるんですけど対処法を教えてください。

84:デフォルトの名無しさん
08/08/13 22:19:56
素人すぎるだろ
プロジェクトとmain関数の意味ググってこいやボケ

85:デフォルトの名無しさん
08/08/13 22:43:21
>>83
Win32プロジェクトを作れ

86:デフォルトの名無しさん
08/08/13 23:15:52
Cを覚えるまえにベーシックをやっていたんですがベーシックの頃の癖が抜けません。やはりCから入ったほうがよかったのでしょうか? 

87:デフォルトの名無しさん
08/08/13 23:17:50
ベーシックの頃の癖ってなんだ?

88:デフォルトの名無しさん
08/08/13 23:19:47
後藤とか?

89:デフォルトの名無しさん
08/08/13 23:20:18
グローバル変数じゃないか

90:デフォルトの名無しさん
08/08/13 23:23:33
たとえばPRINT""って書いてみたり

91:デフォルトの名無しさん
08/08/13 23:25:43
整数の変数をI%にしちゃうとか

92:デフォルトの名無しさん
08/08/13 23:28:22
for i=0 to 9 とか

93:デフォルトの名無しさん
08/08/13 23:30:03
どうせポインタがわからないとかそういうんじゃねーの?

READ/DATAは当然ないし

94:デフォルトの名無しさん
08/08/13 23:30:42
>>84
1プロジェクト複数exeを期待したんだと思うよ
コマンドラインから入ったら結構そう期待してしまいそう

95:デフォルトの名無しさん
08/08/13 23:31:27
行の最初に 10 20 30 とか

96:デフォルトの名無しさん
08/08/13 23:32:28
言語の違いなんて気にスンナ

ベーシックとFORTRANとC++とJavaとアセンブラの仕事を同時並行した俺がいる
こつ、覚えすぎないことw

97:デフォルトの名無しさん
08/08/13 23:33:11
GOSUBとかON ERROR GOTO とかかな

98:デフォルトの名無しさん
08/08/14 00:33:54
行番号じゃないのか

99:sage
08/08/14 02:38:20
カンマ区切りのデータを配列に移すとき、

例)abc,def,ghi,jkl....
皆ならどういう風にするのでしょうか?
条件)
・strtokはなし。
・分かりやすさ重視。


100:デフォルトの名無しさん
08/08/14 02:41:59
そんなもん頭から解釈していく意外にやることなかろう

101:デフォルトの名無しさん
08/08/14 02:45:18
先頭から一文字ずつチェックしてカンマを検出したらその直前までの文字列を格納できる領域を割り付けてコピー以下繰り返し

以外にまっとうで安全な方法があるなら聞きたいわ

102:デフォルトの名無しさん
08/08/14 02:48:23
>>101
元データを丸ごと領域確保&コピーしてカンマを\0に置換していったほうがいいんじゃないか?

103:デフォルトの名無しさん
08/08/14 02:53:32
strtok使いたくない理由は引用符を特別扱いするからか?
それとも多バイト文字を扱うからか?
いずれにせよ状態を保持しながら先頭から手動で一文字ずつチェックする以外ないな

104:デフォルトの名無しさん
08/08/14 03:08:59
awkだと考えるまでも無いんだけどね...

1)複数の、文字列のポインタを格納できる領域を確保(固定サイズである程度大きいものor区切りの数を数える)
2)元の文字列のコピーを作成,区切りを'\0'に置き換えつつ、1)の領域へ区切りの先頭アドレスを格納していく
って感じかな


105:デフォルトの名無しさん
08/08/14 03:13:54
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int i, arrylength;
char basestr[] = "abc,efg,hij,klm, , asjelrhaesh";
char **arry;
char *temp;
i = 1;
temp = basestr;
while (temp = strchr(temp, ',')) {
temp++;
i++;
}
arry = (char**)malloc(sizeof(char*) * i);
arrylength = i;

i = 1;
temp = basestr;
arry[0] = temp;
while (temp = strchr(temp, ',')) {
*temp = '\0';
temp++;
arry[i] = temp;
i++;
}
for (i = 0; i < arrylength; i++)
puts(arry[i]);
return 0;
}
異論は認める

106:デフォルトの名無しさん
08/08/14 03:26:02
for(i=0;i<len;i++){

if(data[i]==','){
j++;
continue;
}
strncat(array[j],data[i],1)

}



107:デフォルトの名無しさん
08/08/14 07:52:20
カンマで区切るだけでいい(ダブルコーテーションを考慮しない)のなら、sscanf()で%[^,]するのが一番簡単だろ。
カラム数が固定じゃないなら、%[^,],%nで。

108:デフォルトの名無しさん
08/08/14 08:06:22
分かりやすさ重視(速度やメモリ効率は無視)なら考えるまでもない。

char** tokbycomma(const char* src)
{
char** result = NULL;
char* tmp;
while((tmp = cutbycomma(src)) != NULL){
 result = pushback(result, tmp);
 src += strlen(tmp) + 1;
 free(tmp);
}
return result;
}

cutbycommaとpushbackをどう作ればいいかは自分で考えましょう。

109:デフォルトの名無しさん
08/08/14 09:20:04
typedef struct{

double a[10]={0.0}

char *mozi;

}HOGE;



HOGE data[200];

これで宣言したらaは初期化されていますか?

110:デフォルトの名無しさん
08/08/14 09:24:56
コンパイルしてみればいい。

typedef struct{

double a[10]={0.0}

char *mozi;

}HOGE;

この段階だと実態は無いのでできない?

111:デフォルトの名無しさん
08/08/14 09:25:47
そうですね。できませんねー

112:デフォルトの名無しさん
08/08/14 09:28:51
書くならこっちじゃね?

HOGE data[200];

でも仮にかけたとしても200個とか手で書くのか?
どうせchar*もNULLでないと困るんだしどこかで

memset(data,0x00,sizeof(data));

としておけば全部0でクリアになるよ

113:デフォルトの名無しさん
08/08/14 09:31:09
char * cutbycomma(const char * src)
{
char * tmp = malloc(strlen(src) + 1);
int pos;
int rtn = sscanf(src, "%[^,\n]%n", tmp, & pos);
if (rtn != 1) {
/* 抽出不可 */
free(tmp);
return NULL;
}
if (src[pos] != '\0') /* 継続あり */;
return tmp;
}

114:デフォルトの名無しさん
08/08/14 09:31:25
typedef struct{

double a;

char *mozi;

}HOGE;

構造体はこうでした・・・


for(i=0;i<200;i++){
data[i].a=0.0;
}

とするのではどっちが早いですか?

115:デフォルトの名無しさん
08/08/14 09:34:00
memset()でdoubleが0になることは規格では保証されていない。
それでもいいなら、自前で代入するよりも速いかもしれない。

116:112
08/08/14 09:35:42
あ、そっかdoubleか、すまん0x00でうめるのはまずいな。
intとか整数型ならいいかもしれんが実数はやめたほうがいい。
よって>>114のループで

117:デフォルトの名無しさん
08/08/14 09:46:18
>>113
毎回使いもしない長さの領域を確保してるじゃん。10点。

118:デフォルトの名無しさん
08/08/14 09:56:03
皆さんのレベルに到達するのに何年ぐらい必要ですか??? 


119:デフォルトの名無しさん
08/08/14 10:41:01
>>118
ひとそれぞれですし、取り組んだ課題によりさまざまな指向性を示すと思いますが、そんなことより、とりあえずやってみましょうよ。

120:デフォルトの名無しさん
08/08/14 10:44:11
for(i=0;i<num;i++){

if(条件){
   処理
break;
}


}

この場合のbreak;はif文から抜けるだけですか?それともfor文からも抜けますか?

121:デフォルトの名無しさん
08/08/14 10:52:39
for



122:デフォルトの名無しさん
08/08/14 10:53:07
break文はfor文やwhile文から抜けるための文です

123:デフォルトの名無しさん
08/08/14 11:47:56
まったくの初心者で変な質問してスイマセンが、
今、DOS画面のような画面に計算結果を出力するような練習をしています。 
C言語はこういうものだという狭い認識しか無いのですが、
C言語でゲームを作るとかいう場合は、グラフィックで動くソフトか何かを使うのですか? 
自分には、「C言語はDOS画面みたいなもので動かす」という固定観念があります。 
今のところそれしか見たこと無いので。 



124:デフォルトの名無しさん
08/08/14 11:50:29
>>123
いやそんなことはないけどね。

ゲーム機の非公式開発なんかもCとかC++でかかれてたりするけど
普通にグラフィック扱ってるし。
むしろフォントの関係上英字が扱えるくらいで日本語とかになると
それなりに苦労するくらい。



125:デフォルトの名無しさん
08/08/14 12:07:12
今は、そのDOS画面とやり取りする関数を使ってるだけだからそういういイメージになるんだよ。
まあ標準ライブラリだけだとそうなるけど。

126:デフォルトの名無しさん
08/08/14 12:13:50
>>123
あなたは幼稚園程度の英語の知識を身に着けたばかりのような状態です。
例えば不思議の国のアリスを楽しむには、イギリスの生活習慣から当時の政治情勢まで知る必要があるのです。
プログラミング言語も同じようなものです。

127:デフォルトの名無しさん
08/08/14 12:41:09
足し算と補数があれば引き算掛け算割り算を実装できるというのは理解したんですが
そのおおもとの、足し算ってどうやって実装してるんでしょうか?


128:デフォルトの名無しさん
08/08/14 12:43:38
>>127
CPUにそういう命令があって内部で計算してるの
C言語なんかはコンパイルのときにCPUがわかるように変換してる。


129:デフォルトの名無しさん
08/08/14 12:44:55
じゃあそのCPUは・・・といわれるとトランジスタを使った足し算用回路が
組まれてて計算してる。

130:デフォルトの名無しさん
08/08/14 12:55:38
>>127
半加算器、全加算器でぐぐるといいよ

131:デフォルトの名無しさん
08/08/14 13:35:26
HOGE data[200]={0};

132:デフォルトの名無しさん
08/08/14 13:41:19
>>131
構造体だとそれなんか警告でるんだけど全部初期化されるのは保証されてるの?

133:デフォルトの名無しさん
08/08/14 13:43:22
>>132
それ以前にポインター抱えてる構造体でそんな初期化って

134:デフォルトの名無しさん
08/08/14 13:51:15
>>132
警告の意味くらい、理解しなさいよ。
HOGE data[200] = {{0}};

135:デフォルトの名無しさん
08/08/14 13:53:21
>>133
ゼロクリアではなく、きちんとヌルポインタで初期化されるよ。

136:デフォルトの名無しさん
08/08/14 13:58:05
>>134
それでもでるんですけど

137:1
08/08/14 13:58:48
いやむしろ悪化してコンパイルすら通らなくなるんですがw
試してから言ってくださいよw

138:デフォルトの名無しさん
08/08/14 14:09:51
>>136
--
% cat foo.c
typedef struct{
double a;
char *mozi;
}HOGE;

HOGE data[200] = {0};

% gcc -c -Wall foo.c
foo.c:9: warning: missing braces around initializer
foo.c:9: warning: (near initialization for `data[0]')

% sed -e 's/{0}/{{0}}/' foo.c > fooz.c

% !g:s/foo/fooz
gcc -c -Wall fooz.c

% gcc --version
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.
--
警告でなくなるけど。

139:デフォルトの名無しさん
08/08/14 14:20:22
あれだっけ

初期化の指定が少ない場合コンパイラが勝手にやるんだっけ?

140:デフォルトの名無しさん
08/08/14 14:26:12
-W とかつけてんじゃね?それでも警告ですむと思うんだけど

141:デフォルトの名無しさん
08/08/14 14:36:58
>>140
>138では-Wallで警告が消えているね。

>>139
コンパイラがっていうか、0で補うのが仕様ですが。

142:140
08/08/14 14:53:48
>>141
いや>>138踏まえて言ったんだが

143:デフォルトの名無しさん
08/08/14 15:00:14
>>132
されてるよ
全部のメンバに対して=0;と書いたように初期化されるから
浮動小数点数でもポインタでも正しく0.0やヌルポインタになる

144:デフォルトの名無しさん
08/08/14 15:04:55
>>136-137があほなだけだろ
次の質問どーぞ


145:デフォルトの名無しさん
08/08/14 22:36:59
C言語撃退講座 ~K&Rは置いて、俺の話を聞け

この本ってどう?

146:デフォルトの名無しさん
08/08/14 22:41:47
推薦図書/必読書のためのスレッド 41
スレリンク(tech板)
ここで聞けばいいんじゃね

147:デフォルトの名無しさん
08/08/15 01:46:50
linuxでwin用のアプリをコンパイルすることはできるの?

148:デフォルトの名無しさん
08/08/15 02:14:01
理屈の上では可能だが、現実問題としてありえない

149:デフォルトの名無しさん
08/08/15 03:54:01
いや、結構普通だろw

150:デフォルトの名無しさん
08/08/15 03:55:08
クロスプラットフォームだっけ?
コンパイラがあればできるんじゃね?
というかlinux上で動くwinコンパイラなんてあるの?

151:デフォルトの名無しさん
08/08/15 03:58:51
それは可能だろ
機械語を生成するだけだからな
でも使った事はないし知らない
32bitPCで64bitや携帯の機械語が生成できるのと同じ

152:デフォルトの名無しさん
08/08/15 03:58:56
Cygwinターゲットのクロスgccはなんか聞いたことがある。

153:デフォルトの名無しさん
08/08/15 04:02:15
MinGW

154:デフォルトの名無しさん
08/08/15 04:02:22
>>147
とりあえず答えておくとmingwとか使えばできます

155:デフォルトの名無しさん
08/08/15 04:04:44
こういうケースだとJavaや.NETはいいな

156:デフォルトの名無しさん
08/08/15 11:57:51
typedef union _BYTE{
unsigned char byte;
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
} BYTE;



sizeof(BYTE)がどうしても1になってくれないんですけど、どうすりゃいいんでしょう?

157:デフォルトの名無しさん
08/08/15 12:05:14
>>156
つーかbitをくくれよ

158:デフォルトの名無しさん
08/08/15 12:06:31
忘れてたよ
で、これ1byteにできないの?

159:デフォルトの名無しさん
08/08/15 12:08:13
あ、なんか自己解決したわ
unsigned char bitn:1;にすればよかったのね

160:デフォルトの名無しさん
08/08/15 12:08:48
つーかそんなので悩むなら普通に

byte に対してビット演算しろよ

byte | 0x01
byte ^ 0x01

とかすればいいだけだろ?


161:デフォルトの名無しさん
08/08/15 12:50:01
共用体でビットフィールド使っても無意味じゃないの?

162:デフォルトの名無しさん
08/08/15 12:52:20
ビットフィールド操作は大抵のコンパイラで糞なコードに展開されるわー
もうちっと最適化できないもんかね

163:デフォルトの名無しさん
08/08/15 12:56:01
糞だとおっしゃるだけの英知をお持ちならそのご自分の能力でなんとかなさっては?

164:デフォルトの名無しさん
08/08/15 12:57:29
そもそもワードを任意のビットで区切ろうという発想が糞 は言いすぎとしても処理効率なんぞ求めんな

165:デフォルトの名無しさん
08/08/15 12:57:57
英知というほどの物じゃないけど、アセンブラでビット操作を書いたら
こういう風には書かないだろうなあというコードになる。

C言語の仕様なので我慢して使ってるけど。

166:デフォルトの名無しさん
08/08/15 13:00:22
そこまで文句を言うならなぜ自分でアセンブらないの?

で、それに対する答えがそのまま>>162への答えだよ

167:デフォルトの名無しさん
08/08/15 13:02:15
インラインアセンブラは時々使うけど可読性が・・・

168:デフォルトの名無しさん
08/08/15 13:10:52
宿題で世界のナベアツプログラムがでたんですが
3の倍数はいいとして
3のつく数の判定はどうすればいいんでしょう

169:デフォルトの名無しさん
08/08/15 13:15:27
非標準だがitoa()を使って文字列に変換しstrchr()で判定する

170:デフォルトの名無しさん
08/08/15 13:18:34
>>168
それ、私が新人研修で出した課題だw
sprintf()で文字列にしてから、strchr()で探すのが一番手っ取り早い。
真面目にやるなら、一桁ずつ10で割った余りをチェックすればいい。

171:168
08/08/15 13:39:07
なるほど、ありがとうございます
あまりを出して調べるやり方でやってみます。
ああ、でもそれだと32とか321は無理ですよね

一桁ずつというのは、
1、3を引く
2、10で割ってあまりが0か調べる
3、違うなら1へ

って感じですかね

ちなみに学校の宿題ですw

172:デフォルトの名無しさん
08/08/15 13:55:02
12345

12345%10 = 5
12345/10 = 1234

1234%10 = 4
1234/10 = 123

123%3 = さぇぁ〜ん!

173:デフォルトの名無しさん
08/08/15 13:55:37
%3じゃなくて%10ね

174:デフォルトの名無しさん
08/08/15 13:56:41
321と言う数字があったとする
321 ÷ 10 = 32 … 1
32 ÷ 10 = 3 … 2
3 ÷ 10 = 0 … 3
余りに3が出たのでこの数字は3が含まれていると言う事がわかる
と言うこと

175:デフォルトの名無しさん
08/08/15 13:57:59
>>170
そのやり方だと3の時に3を足さないと結果変わるね。
170の最後の行は
1 0かどうかチェック
2 %3の結果が0かどうかチェック
3 10で割った商と余りを別々に保存
4 余りが3かどうか
5 違うなら商を使って3へ
てことだろうから32でも321でも対応できるよ。
ただsprintf使った方がラク。

176:デフォルトの名無しさん
08/08/15 14:00:57
C言語質問じゃなくてアルゴリズム質問だからスレ違い

177:デフォルトの名無しさん
08/08/15 14:45:08
cursesを使ってブロック崩しのプログラムを作っているんですが、
return関数やscanfなどの標準入力関数を使うと、
なぜかprintfやmvaddstr関数などを飛ばしてしまい、ハイスコアの名前入力が作れません。
名前入力はどのようにすればいいでしょう?
メイン関数は下のようになってます

int main(int argc, char **argv){
int score;
char tmp[7];
initscr(); /* 画面の初期化 */
noecho(); /* エコーなし */
cbreak(); /* 一度に1文字入力をON */
keypad(stdscr,TRUE);; /* 矢印キーが使える */

if(LINES>MinY&&WCOLS>MinX){
window(); /* 画面描画 */
}
else{
printf("Windou size is too small!!!");
// return 0;
}
score = go(); /* ゲームを実行 */
GameEnd(score);
endwin(); /* ウィンドウ終了 */
return 0;
}

GameEnd関数では、mvaddstrで「GameOver」と出した後、
scoreの値とファイルの値を比較し、ハイスコアであれば
mvaddstrで「HighScore!put your name」と書いた後に
scanfで名前を受け取ろうとしたのですが、mvaddstrが抜かされてしまう感じです。

178:デフォルトの名無しさん
08/08/15 15:11:06
cursesを使ったこと無いから的外れのことを言うかも知れないが
scanwを使っちゃ駄目なのか?

179:デフォルトの名無しさん
08/08/15 15:16:08
fflush(stdout)とか?

180:デフォルトの名無しさん
08/08/15 15:19:28
その肝心の部分を張らずに質問とはいい度胸だ

181:デフォルトの名無しさん
08/08/15 15:21:17
環境依存すぎる
まずinitscrやらnoechoやらの仕様を詳細にチェックしなおすこと
モードを変えた後で元に戻さないとならないとかないか?

182:デフォルトの名無しさん
08/08/15 15:22:31
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください

183:デフォルトの名無しさん
08/08/15 15:27:15
>>179ぐぐってみますた。バッファフラッシュですね。ちょっとやってっます。
>>178
使ってみましたが無視されてしまいました。
GameEndのソースファイルは今こんな感じです(いろいろ注釈にして試したりしてるのでごちゃごちゃしてますが…
endwin()を実行後に、注釈部のscanfなどをやってみてもだめでした・・・
void GameEnd(int score)
{
int i,j,k;
char tmp[7]=" ",file[10][7];
FileRead(file);
mvaddstr(LINES/2-2,WCOLS/2-5," GameOver!! ");
for(i=0;i<5;i++){
if(score>=atoi(file[1+2*i])){
for(j=4;j>i;j--){
strcpy(file[j*2], file[2*(j-1)]);
strcpy(file[2*j+1],file[2*j-1]);
}

mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");
mvscanw(LINES/2+1,COLS/2-15,tmp);
FileWrite(file);
break;
}
}
return;
}

184:デフォルトの名無しさん
08/08/15 15:36:34
本当にちゃんとハイスコア出してるか?
あとbreakはそこ一箇所だけでいいのか?

185:デフォルトの名無しさん
08/08/15 15:37:46
>>180,182
すいません、ごちゃごちゃしてたので貼り忘れてました。
>>179
やってみましたがその部分になると凍結してしまいました…
mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");
fflush(stdout);
fflush(stdin);
scanf("%s",tmp);
こういう順番でやってみたのですが

>>181
やはりそうですよね… 学校の夏休み課題なんですが、cursesについての詳しい内容をほとんど教えられず
書き方だけしか教わってなかったのでさっぱりでした。

最悪カーセスモードを終了してからのscanfでやろうかと思ってるんですが、モードの終了の仕方もわからないで苦戦してます

186:184
08/08/15 15:37:54
あ、breakはいいのか
見間違えた

187:デフォルトの名無しさん
08/08/15 15:44:26
>fflush(stdout);
cursesは標準出力じゃないから意味がない。
>fflush(stdin);
入力のフラッシュ動作は環境依存。
>scanf("%s",tmp);
%6sにしてバッファオーバフローを避けよう。

188:デフォルトの名無しさん
08/08/15 15:45:19
>>185
fflush(stdin) は環境によっては segmentation fault になるんじゃなかったっけ?
curses で入力がある限り読み飛ばせば大丈夫そうな気はする

curses 使ったこと無いのでちゃんとかけないけど
こんな感じかと

while(キーボードバッファに何か残っている) 読み込む;

189:デフォルトの名無しさん
08/08/15 15:54:59
>>187,188
ふむふむ。勉強になります

こんな感じに書き換えてみましたがどうしてもここで凍結してしまいます。
scanfをなくすだけでちゃんとmvaddstrの文が表示されて正常終了するのですが…

mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");
while(fgetc(stdin)!=EOF)
echo();
scanf("%6s",tmp);


190:デフォルトの名無しさん
08/08/15 15:59:25
>>189
それは駄目だ
fgetc(stdin)==EOF になった時点以降は stdin から入力することはできない

dos (conio.h) でいうところの
while(kbhit()) getch();
っていうのがあるはず

191:デフォルトの名無しさん
08/08/15 16:02:47
あーそうそう、curses使っているときに標準入力を使おうとすると、想定外の場所にカーソルが出たり
標準入力の端末動作で画面が崩れたりするからそもそも標準入力は使えないと思う。

192:デフォルトの名無しさん
08/08/15 16:05:28
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

193:デフォルトの名無しさん
08/08/15 16:09:02
うおおおお、奥が深い
getch()ですね、ラケット移動などのカーソル受付をそれでやってます。
ただ、kbhit()にあたる方が分かりません。

仕様では「ゲーム終了時にTOP5に入っていたら名前を入力してもらう」と書いてあったのであれなんですが
友達はウィンドウモードにする前に、一番最初に名前入れてもらってやったと言っていました。
最悪自分もそうしようかなと思っていますが、、何か腑に落ちない感じがします。

194:デフォルトの名無しさん
08/08/15 16:14:42
良く分からないけどバッファを読み飛ばすなら
while(getch() != '\r') 的な感じでどうだろうか?

195:デフォルトの名無しさん
08/08/15 16:17:45
>>193
ググってみた
while(getch()!=ERR);
でよさげ

196:デフォルトの名無しさん
08/08/15 16:22:41
>>191
なんと。
授業では入力方法は標準入力しか習ってないので…やはり一番最初に聞くしかない感じですかね

>>193
すいません初心者で。以後気をつけます
環境は学校の端末(ice環境)を外部環境(PodeRosa)で動かしてます。

>>194、195
行の左端に戻る…と。ERRも始めてみました。勉強になります
どちらも標準入力は受け付けなかったんですが、mvaddstrは表示されるようになりました!

mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");


while(getch()!=ERR);
echo();
scanf("%6s",tmp);
今はこんな感じです

197:デフォルトの名無しさん
08/08/15 16:26:10
そこでscanfじゃなくてcursesでの入力受付使えばなんか出来るんじゃないかな?

198:デフォルトの名無しさん
08/08/15 16:32:20
おお、早速以下のコードでやってみました!
…が、出ませんでしたorz
mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");


while(getch()!=ERR);
echo();
mvscanw(LINES/2+2,COLS/2-22,tmp);
+------------------------------------------------------+
| |
| |Time 1
| #### #### #### #### #### #### #### |Level 1
| |Score 10
| GameOver!! |HighS
| #### #### #### #### #### #### |Name
| HighScore!!Put your name!!(Max 5 chars) |
| |
| |
| |
| |
| |
ssh{*********}262: |

199:デフォルトの名無しさん
08/08/15 16:43:00
すいません、大分レス引っ張ってしまって。
いろいろアドバイスくださってありがとうございます。勉強になりました。
とりあえずは期限もあとわずかなので仕様とは少しずれてしまいますが以下のソースで提出だけしておきます
ただ、自己満足になりますが悔しいのでいちおう現段階のソースも残しておきたいと思います。

int main(int argc, char **argv){
int score;
char tmp[7];
printf("Hello,put your Name!(Max 5 Chars)\n");
fgets(tmp,6,stdin);
printf("Let's play!!\n");
sleep(1);

initscr(); /* 画面の初期化 */ noecho(); /* エコーなし */
cbreak(); /* 一度に1文字入力をON */
keypad(stdscr,TRUE);; /* 矢印キーが使える */

if(LINES>MinY&&WCOLS>MinX){
window(); /* 画面描画 */
}
else{
printf("Windou size is too small!!!"); // return 0;
}
score = go(); /* ゲームを実行 */
GameEnd(score);
endwin(); /* ウィンドウ終了 */
return 0;
}


200:デフォルトの名無しさん
08/08/15 16:56:44
fgets()の常道では、第2パラメータは第1パラメータのサイズだ。
つまり、fgets(tmp, sizeof(tmp), stdin)でいい。
それから、(文字数オーバーじゃない場合に)末尾に改行文字が残ることにも注意。


201:デフォルトの名無しさん
08/08/15 18:01:18
>>85
win32プロジェクトでやってもエラーが出ました。
ちなみに拡張子を.cppでやるとコンパイルできます。
Cなんですけど。

202:デフォルトの名無しさん
08/08/15 18:05:30
>>201
それが出るとき、プロジェクトのプロパティの全般の共通言語サポートはどうなってる?

203:デフォルトの名無しさん
08/08/15 18:15:29
>>201
共通言語ランタイム サポートのことですよね。
共通言語ランタイム サポートを使用しないになってました。

204:デフォルトの名無しさん
08/08/15 18:23:13
これ以上はVC++あたりかな。
/clr のオプションがつくとCとしてはコンパイルできなくなる。
/clrをつけるのが、共通言語ランタイムサポート。
つまり、キミの状態はあきらかにおかしい。
同じ症状を持った人じゃないとわからんな。

205:デフォルトの名無しさん
08/08/16 09:52:03
なにかオススメのコンパイラはありますか?

206:デフォルトの名無しさん
08/08/16 10:59:01
>>205
LSI C-86

207:デフォルトの名無しさん
08/08/16 12:23:44
>>205
私はgcc(cygwin)を使っています。

208:デフォルトの名無しさん
08/08/16 14:34:52
ギャップバッファのサンプルコード等ありましたら教えて下さい

209:デフォルトの名無しさん
08/08/16 14:42:31
>>208
URLリンク(www.amazon.co.jp)

この本に載ってるけど、見てみたらすごい値段になってるな。

210:デフォルトの名無しさん
08/08/16 15:20:02
>>209
凄く・・・高いです。
どこかのサイトにCで書かれたサンプルコードは無いのでしょうか

211:デフォルトの名無しさん
08/08/16 17:11:22
URLリンク(aibm4.main.eng.hokudai.ac.jp)
ほれ。つーか自分でぐぐれよ

まー俺もテキストはいじるので研究させもらうわ

212:デフォルトの名無しさん
08/08/16 17:26:47
>>211
すまん、それは昨日見たんだが、
C++はどうも・・・
ありがとうございます。

213:デフォルトの名無しさん
08/08/16 17:59:15
>>212
おいおい、100行ちょっとのソースも駄目なのかよw

214:デフォルトの名無しさん
08/08/16 19:20:38
本が高かったら図書館に行けばいいじゃない

215:デフォルトの名無しさん
08/08/16 19:25:22
>>213
うん、駄目なのよ、C++分からないのよ
>>214
既に取り寄せ連絡したから問題無い

216:デフォルトの名無しさん
08/08/16 19:33:43
そのソースを解析できないようじゃあ洋書を翻訳したのなんて厳しいんじゃね?

ちなみにグーグルにはこんなのもあって
URLリンク(books.google.co.jp)



217:デフォルトの名無しさん
08/08/16 19:41:10
>>216
書籍だが、C++使える事前提で解説されてるの?

218:デフォルトの名無しさん
08/08/16 20:44:06
100行くらいならCに書き直してやろうかと思って>>211見にいったら
死ぬほど丁寧に解説されててワロタ
あの解説文でわからないなら本読んでも無駄じゃない?

219:デフォルトの名無しさん
08/08/16 20:47:24
つーかギャップバッファの代替ロジックもおおよそ浮かんだけどなあ。

イメージはファイルシステムの情報管理の方法だよ

220:デフォルトの名無しさん
08/08/16 21:08:41
K&Rみたいな有名本ってほかになんかある?

221:デフォルトの名無しさん
08/08/16 21:16:13
>>218
Cに書き直して下さい

222:デフォルトの名無しさん
08/08/16 21:21:46
>>218
死ぬほど、とかそんな次元じゃなくて、
STL?template?operator?T& x?ってなんぞ?ってな感じでして、
C言語スレでC++のソースコード見せられるとは予想外でした。
C++じゃ全く読めなくて、すみません

223:デフォルトの名無しさん
08/08/16 21:23:28
これってさ双方向リストとかやってればすぐに応用かけそうだよな。

ギャップって呼ばれるのは特に説明がかかれてなかったけど1ギャップ=1バイトではなく
1ギャップ=nバイトの塊だよな?

224:デフォルトの名無しさん
08/08/16 21:25:02
>>222
ソースは見ないで、下の解説文だけ読めばいいと思う
あれだけ丁寧に解説してあればサンプルソースなんかよりもずっと理解しやすいと思う

225:デフォルトの名無しさん
08/08/16 21:31:13
>>223
図をみたら、nバイトとしか解釈しようがないと思うけど。

226:デフォルトの名無しさん
08/08/16 21:35:39
テキストエディタで考えると1ギャップ=64バイトから128バイトくらい間が理想か。

227:デフォルトの名無しさん
08/08/16 21:51:30
ネタではなく。

かなり前にMicrosoft Visual C++ 2005 Express Editionってのを
やってみたんだけど、何をどうやっていかわからずいくつかくだらない
ソフトを作って終わってしまいました。

やってみたいことは、ブラウザなどの操作を自動でやらしたい。
メールを受信して、本文中にある一部が定型のアドレスを
抽出し指定時間ごとにブラウザで開きブラウザに定型の文が
表示されたらタブを閉じる。

アプリケーションを操作する。などです。

こんなことできますか?できるなら何の勉強が必要なのか
または近道なのか詳細お願いします。

228:デフォルトの名無しさん
08/08/16 21:59:39
>>227
C#でやったほうがいいんじゃね?

ブラウザの操作は知らんけど、コンポーネントでIEの機能を使えるから、同様のことができると思う。
メールを受信してどうこうは、ググれば簡単に分かると思う。

229:デフォルトの名無しさん
08/08/16 22:00:02
>>227
ネットワーク系かな

230:デフォルトの名無しさん
08/08/16 22:32:48
スロットのプログラムみたいね〜

231:デフォルトの名無しさん
08/08/16 23:20:29
URLリンク(homepage3.nifty.com)

すいません、上記サイトを眺めて勉強しているのですが、
C言語を業務で行うっていうレベルはどの程度なのでしょうか。

単に数の受け渡しをトレースできれば、
業務に就いたとき問題ないですか。


232:デフォルトの名無しさん
08/08/16 23:30:08
>>231
そのリンク先の内容が理解できるなら、
業務に問題ないレベルだろうと思う。

>数の受け渡しをトレース
ってのはよく解らんのだけど。

233:デフォルトの名無しさん
08/08/16 23:32:24
ぴんきり

234:デフォルトの名無しさん
08/08/16 23:37:46
>>231
> 単に数の受け渡しをトレースできれば
データフローのことだと思うよ

データフローはプログラミングの基本、いやシステム設計の基本でもある

235:デフォルトの名無しさん
08/08/16 23:38:27
>>231
ちょっと古くなってる部分もあるけど、C FAQくらいは目を通しておくとか。
URLリンク(www.kouno.jp)

Cを使っている職業プログラマでもC FAQレベルに達してないのはいっぱいいるけど。

236:デフォルトの名無しさん
08/08/16 23:52:56
C言語やっててトレースなんて単語言った時点でたぶん減点。
ollyでもやってんのか?

237:デフォルトの名無しさん
08/08/17 00:49:53
>>232-236
ありがとです。
引き続きサイトで勉強してみます。

238:デフォルトの名無しさん
08/08/17 01:30:09
文字コードの相互変換をサポートする関数とかってありましたっけ?

S-JIS->EUCとか

239:デフォルトの名無しさん
08/08/17 01:32:48
sjistoeuc関数
使っている環境にあればの話

なければ自作

240:デフォルトの名無しさん
08/08/17 06:50:04
ちょっと相談させてください。

本格的にc言語を勉強したいと思い下記のサイトをよんだりしていたのですが
やっぱり1から勉強するとしても情報が古すぎますか?
URLリンク(www9.plala.or.jp)
URLリンク(homepage3.nifty.com)

今まで子供の頃から端々でプログラムを書いて利用する事はあったのですが
例題の文章を適宜加工して使っていた程度です。
本格的にc言語を学ぶにはどのサイトを参考にするのが現在お勧めなのでしょうか?

そもそもビジュアルベーシックとか他の学ぶ方が現在では無難なんでしょうか?

241:デフォルトの名無しさん
08/08/17 07:36:51
本格的にC言語を学ぶのはよくないですよ。
本格的にアセンブラやっても利用されるのはほんの一部なのと同じような物です。
C言語は生産効率が良くありません。
C++言語からにして、それで不足分があればC言語を勉強したほうがいいですよ

242:デフォルトの名無しさん
08/08/17 08:04:59
そうなんですか

音楽でいうところのピアノやクラッシックと同じで
基本として完全に把握しておけばその分将来有利だと考えたのですが・・・・

そもそもflashうまくなればcはむしろ必要ない言語なのでしょうか?

それでも基本は抑えておいた方が良いのかな? 
オブジェクト指向プログラムしか扱えない人間はなにかしら欠点抱えるようにおもって勉強しようかと思ったのですが・・・・

苦しんで覚えるc言語でいうとどの程度までかじる価値があるのでしょうか?
それともオブジェクト指向メインでやるなら完全に必要ないとか・・・・・

243:デフォルトの名無しさん
08/08/17 08:16:20
芸術ではないのでやりたい事が簡単に実現できれば良いんです。
ピアノは演奏自体が大事ですが、プログラムは生産物が大事です。
コードに芸術性を求めても良くないです。
生産性はC++の方が上です。 
オブジェクト指向は、プログラムを簡単にするやり方なだけで
C++だからといって必ずしも使う必要はありません。

244:デフォルトの名無しさん
08/08/17 08:23:01
ここがいいですよ。 C言語もC++言語も。 
あと日本語を読み書きするのに文法の勉強が必ずしも必要ないように
動かして体験して動作が確認できればいいんです。
とくにC++(の実用面)で重要な点はSTLと思います。

URLリンク(www5c.biglobe.ne.jp)
URLリンク(www.geocities.jp)


245:デフォルトの名無しさん
08/08/17 08:23:46
いくらC言語を習得、熟練しようとも
基礎学力がないと、大作は作れないような気がするのですが
どうでしょうか?

246:デフォルトの名無しさん
08/08/17 08:29:30
マシンに近いという意味で、基本といえるのはアセンブラと思います。
C言語も、C++言語も、結局はアセンブラに変換されるので、最も基本だと思います。

247:デフォルトの名無しさん
08/08/17 08:45:08
そうなんですか
アセンブラ+flashあたりが私にとっての理想の組み合わせなのかなぁ
とりあえずちょっと位さわりの部分程度は学んでc使える人と会話くらいはできるようになりたいので
苦しんで覚えるc言語をちょこっとやってみようとしたのですが問題が
URLリンク(hp.vector.co.jp)

きときとCPadの一番重要なC/C++開発環境用だけが何故かリンク切れしてます。
どうすればこのエディタが手に入るでしょうか?


248:デフォルトの名無しさん
08/08/17 08:46:28
>>245
もし私への質問でしたら、大作をつくる気はないです。

249:デフォルトの名無しさん
08/08/17 11:36:36
素人はrubyでもやってろってこった

250:デフォルトの名無しさん
08/08/17 12:30:13
>>249
Ruby の方が100倍難しいぞ
環境設定とか
環境設定とか
環境設定とか

251:デフォルトの名無しさん
08/08/17 12:36:11
>>245
大作を作るためのノウハウを修得、熟練しましょう。
特に、C言語の取扱いだけに固執するのではなく、
上流工程と呼ばれるもの(要求分析と設計)も含めて学習を進めるといいでしょう。
ER図やDFDが書けるだけでも世界が変わってくるはずです。

252:デフォルトの名無しさん
08/08/17 12:52:10
>>250
環境設定でなんか難しいところがあったっけ?

253:デフォルトの名無しさん
08/08/17 12:55:04
>>252
素人はパス通す事も難しいんだ察してやれ

254:デフォルトの名無しさん
08/08/17 12:59:31
環境変数ってなに?パスって?
ってことだろうなあ。

255:デフォルトの名無しさん
08/08/17 13:05:07
Linux、Windows 両刀なんだ
まんどくさい

256:デフォルトの名無しさん
08/08/17 13:10:22
でもwindowsならrubyのインストーラでインストールしたら一発じゃないのかな?
コンソールで対話的にどうとかいう辺りで挫折しそうだけど

257:デフォルトの名無しさん
08/08/17 13:19:15
うるせー
オブジェクト指向なのか、構造体指向なのか
ハッキリわかりにくいんだよ
うんこRuby
しかもスレ違いじゃちんこ

258:デフォルトの名無しさん
08/08/17 13:47:05
こりゃまたわかりやすいのが続いたな

259:デフォルトの名無しさん
08/08/17 13:49:16
頭悪い人はプログラム勉強するより、世渡りを勉強してプログラマを使う仕事に就いたほうがいいよ

260:デフォルトの名無しさん
08/08/17 13:52:12
ボインちゃんを集めてプロのグラマーたちを使うことにしますた!

261:デフォルトの名無しさん
08/08/17 16:28:12
初歩的な質問なんですが
BMP画像を読み込む際に
画像にアルファチャンネルが含まれているかいないかの判断は
どうやってやるのでしょうか?

現在の自分のやり方ははヘッダから画像サイズと深度を計算して
ファイル総容量と比較しています。

あまりにもアレなやり方なので
他に方法があると思うのですが
ヘッダにもそれらしい情報もなく
皆さんはどのように判別されているのでしょうか?

よろしくお願いします。

262:デフォルトの名無しさん
08/08/17 16:30:20
>>261
ヘッダにカラーフォーマットの情報なかったっけ?

263:デフォルトの名無しさん
08/08/17 16:33:00
bmpにαチャンネルなんてあったっけ?

264:デフォルトの名無しさん
08/08/17 16:34:09
>>263
一応
32bitなんかだともたせれる

265:デフォルトの名無しさん
08/08/17 16:38:46
URLリンク(www.kk.iij4u.or.jp)
ほれbmpフォーマットの解説

場所はあるけどリザーブ状態なんで既存のツールでは拾ってくれないかもね。
つーかPNG使え

266:デフォルトの名無しさん
08/08/17 17:00:32
>>262
>>265

あ〜biBitCountって色深度じゃなくて1画素あたりの
RGBA総データサイズなんですね。
勘違いしてました。

ありがとうございますた!
おかげさまで
もう少しスマートにやれそうです。

267:デフォルトの名無しさん
08/08/17 21:38:28
char はどの環境でも1byteが保障されてるんですか?

268:デフォルトの名無しさん
08/08/17 22:22:57
>>267
Cの世界だと、常にcharは1バイト。
ただ、1バイトが8bitとは限らない。

269:デフォルトの名無しさん
08/08/17 22:29:25
1バイトを16ビットにしてlongを128ビットにすればよかったのに・・・

270:デフォルトの名無しさん
08/08/17 22:43:54
>>268
現在稼働中で 1byte≠8bitな環境ってどんぐらい残ってんだろ?

271:デフォルトの名無しさん
08/08/18 02:35:30
switch+caseを使って分岐させると、プログラム自体は遅くなってしまうのでしょうか?
言葉など間違ってたらすみません。

272:デフォルトの名無しさん
08/08/18 02:44:24
>>271
足し算や引き算だって遅くなるぞ

273:デフォルトの名無しさん
08/08/18 02:47:27
if else if else if else if ... で同じような分岐をするのと比べてならswitch caseが遅いということはないはず

274:デフォルトの名無しさん
08/08/18 03:05:08
>>271
最適化のこともあるので分かりません

275:デフォルトの名無しさん
08/08/18 06:56:05
符号有/無の変数同士の四則演算についての質問です。

long hoge1=-101;
ulong hoge2=100;
printf("%d",(hoge1+hoge2));
とすると、「-1」が、
if( (hoge1 + hoge2)>0){printf("和が0以上\n")}
とすると、「和が0以上」と表示されました。
結果として、printfは正常、if文は異常な動作をしています。
if( (hoge1 + (long)hoge2)>0)・・・のように
if文中で使用している変数を型を揃えた場合、if文も正常に動作しました。
おそらく、if文中では変数の型を揃えないといけないものと勝手に理解しましたが、
これはC言語の仕様によるものでしょうか?

276:デフォルトの名無しさん
08/08/18 07:14:31
符号付きと符号無しで演算すると有効範囲の絶対値が大きいほうが優先されるのか…知らんかった

277:デフォルトの名無しさん
08/08/18 07:17:42
>>275
%dはintに型変換されるから。

278:デフォルトの名無しさん
08/08/18 08:32:52
>>275
printfでは実際の数値はわからない
フォーマット指定でいかようにも変わる
printf("%d",(hoge1+hoge2));
printf("%u",(hoge1+hoge2));
printf("%hu",(hoge1+hoge2));


279:デフォルトの名無しさん
08/08/18 09:37:22
>>271
switch case はgccとかなら最適化で速くなるぜ。
使用しているコンパイラで色々試してみるのも一興

280:デフォルトの名無しさん
08/08/18 10:47:45
>>271
入門レベルで気にするほどは変わりません。最適化で同じになる可能性もあることは既に指摘の通り。

281:デフォルトの名無しさん
08/08/18 15:37:11
添え字でアクセスできる多次元の配列の動的確保ってだいたい下みたいな感じでいいのか?
もっとクールでスパーハッカー的なやりかたってある?

a = (int **) malloc(sizeof(int *)*A);
for(i = 0; i < A; i++) a[i] = (int *) malloc(sizeof(int)*B);



次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5384日前に更新/113 KB
担当:undef