C言語なら俺に聞け( ..
2:静的領域の名無しさん
08/08/12 18:24:48
しまった宿題スレチェックし忘れた
C/C++の宿題を片付けます 115代目
スレリンク(tech板)
3:デフォルトの名無しさん
08/08/12 18:47:27
>>1 乙 といわざるを得ない
4:デフォルトの名無しさん
08/08/12 18:59:01
立ったな
>>1乙
5:デフォルトの名無しさん
08/08/12 19:35:35
C言語を勉強したくて本を買ってテキストエディタに書いて練習してます。
コンパイラがあると便利なのですけど、無料のコンパイラとかあるのでしょうか。
6:デフォルトの名無しさん
08/08/12 19:41:20
Visual C++ 2008 Express Edition
7:デフォルトの名無しさん
08/08/12 20:20:22
>>6
ありがとうございます。
いろいろ検索して、LSI C-86 というものを今インストールしてみました。
まったくの初心者なのでこれで十分かと思ってます。
C言語のことほとんど知らないのですが、DOSプロンプトみたいな画面に
文字が出てくるのですね。びっくりしました。
8:デフォルトの名無しさん
08/08/12 20:25:26
3つの数 int i, j, kを
昇順にソートする一番早い方法はなんですか?
9:デフォルトの名無しさん
08/08/12 20:29:00
変数そのものをソートすることは不可能です
10:デフォルトの名無しさん
08/08/12 20:34:16
>>8
入れ子のif/else文を書く
11:デフォルトの名無しさん
08/08/12 20:37:32
qsortは無駄ですかね?
12:デフォルトの名無しさん
08/08/12 20:42:27
配列にまず入れろって
話はそれからだ
13:デフォルトの名無しさん
08/08/12 20:42:36
プログラミング始めてみた、一つ疑問があるんだけど
printf関数とかって
どうやってディスプレイに文字を表示させてるんだ?
14:デフォルトの名無しさん
08/08/12 20:45:27
環境に依存した方法で書かれてます
15:デフォルトの名無しさん
08/08/12 20:47:44
>>12
そうしてます。質問の仕方が悪かったです。すいません
int data[3]に入れています。
16:デフォルトの名無しさん
08/08/12 20:48:20
>>7
LSI-C試食版は(スモールモデル限定だから)大きいプログラムには向かないかもしれません。
あと、フリーならば Borland C か cygwin の gcc があります。
17:デフォルトの名無しさん
08/08/12 20:49:45
>>11
generic なかきかたには負けてしまいますが、普通の c でかくなら最速だと思います。枯れているでしょうし。
18:デフォルトの名無しさん
08/08/12 20:51:07
int型の配列の比較に使える関数ってありますか?
全要素が同じかどうかわかるようなやつです。
strcmpみたいな
19:デフォルトの名無しさん
08/08/12 20:51:37
たった、三つくらいならどんなソート方法でも一緒だから
好きにやれば良いよね
20:デフォルトの名無しさん
08/08/12 20:51:38
モニタに表示するにはドライバというプログラムをあーしてこーするんだが
OSがドライバとの間の仲介をしてくれる
これがハードウェアを操作する手順
printf→OS→ドライバ
21:デフォルトの名無しさん
08/08/12 20:55:05
>>11
3件しかデータがないなら、オーバヘッドがある分確実にqsort()は無駄です。
>7
LSI-Cは整数型が16ビットしかないので、学習には全くお勧めできません。
>>18
memcmp()でできますが、自分でループを書いたほうがいいかも知れません。
22:デフォルトの名無しさん
08/08/12 20:55:23
>>21
自分でループを書いたほうがいい理由はなんですか?
23:デフォルトの名無しさん
08/08/12 20:58:43
>>22
自分でmemcmp()に辿り着けないレベルなら、勉強になるジャマイカ。
24:11
08/08/12 21:05:43
>>19 >>21
そういわれればはそうですね。
25:デフォルトの名無しさん
08/08/12 21:20:58
char *buff1,*buff2;に
strcat(buff1,buff2)ってできませんか?
26:デフォルトの名無しさん
08/08/12 21:22:39
buff1がbuff2をコピーしうるだけの十分なバッファを指してれば可能
27:デフォルトの名無しさん
08/08/12 21:24:26
実行したらエラーになりました・・・
対策を教えてください
28:デフォルトの名無しさん
08/08/12 21:26:11
>>27
実行しない
29:デフォルトの名無しさん
08/08/12 21:26:30
>>25
できますが、事前に充分な格納場所を割り当てることを忘れずに。
30:デフォルトの名無しさん
08/08/12 21:30:57
buff1に実体がないとエスパー
31:デフォルトの名無しさん
08/08/12 22:02:52
うまくできません・・・
buff1="abc";
buff2="testtest";
みたいに結合前に代入しているんですが・・・
32:デフォルトの名無しさん
08/08/12 22:08:25
>>31
だからbuff1に十分な場所がないとだめだとみんなが。
そもそもそれ以前の話だけどね
33:デフォルトの名無しさん
08/08/12 22:12:03
そのbuff1の領域をあらかじめ広げておく方法がわかりません。
それ以前の話とはchar buff1="abc";
この宣言がよくないですか?
34:デフォルトの名無しさん
08/08/12 22:14:14
広げるっていうのは
char buff1[256];
とか[]の中の数字を大きくするか
mallocで動的に確保するかしかないよ
35:デフォルトの名無しさん
08/08/12 22:15:42
たぶん色々わかってないから説明が必要なんだろうけど、
俺ツタヤ行くから誰かが教えてくれるはず
36:デフォルトの名無しさん
08/08/12 22:16:05
realloc()でもすれば?
37:デフォルトの名無しさん
08/08/12 22:21:11
>>36
質問内容から察するに
前提条件から書かないと
質問者には意味が分からないはず
38:デフォルトの名無しさん
08/08/12 22:30:39
realloc()があればmalloc()もfree()もいらない。
39:デフォルトの名無しさん
08/08/12 22:32:48
>>38
何を言っているんだ?
40:デフォルトの名無しさん
08/08/12 22:34:18
とりあえず、今日はみんな寝よう
41:デフォルトの名無しさん
08/08/12 22:36:48
char * foo = realloc(NULL, 100); // same as char * foo = malloc(100);
realloc(foo, 0); // same as free(foo);
42:7
08/08/12 22:39:30
>>16 >>21
65535までの数しか扱えないみたいですね。
でも、今週から本買って始めた超初心者ですので、とりあえずこれで頑張ってみます。
43:デフォルトの名無しさん
08/08/12 22:40:03
>>41
なるほど勉強になった。で、何の話だっけ?
44:デフォルトの名無しさん
08/08/12 23:02:47
>>42
別にMSの回し者じゃないが
個人的には>>6が良いと思うけどなぁ
45:デフォルトの名無しさん
08/08/12 23:40:48
rubyみたいに!?も関数名に使えたら便利なのに・・・
46:デフォルトの名無しさん
08/08/12 23:44:17
たとえばなにがどう便利になると言うのか
47:デフォルトの名無しさん
08/08/13 00:18:51
関数の外に影響する関数には最後に!つけたり、真偽を返す関数には?をつけたりして可読性をあげるんだよ。あれ便利じゃん?
48:デフォルトの名無しさん
08/08/13 00:21:46
そんなもん自分で勝手にサフィクスでもプレフィクスでもつければすむことだろう
49:デフォルトの名無しさん
08/08/13 00:32:12
!?がもっともシンプルでもっともわかりやすいんだよ
50:デフォルトの名無しさん
08/08/13 00:35:19
>>49
その代わりに否定の!と三項演算子がつかえなくなるのはいやなんですが。
51:デフォルトの名無しさん
08/08/13 00:38:05
lispみたいに関数名の最後にpをつければいいじゃん
52:デフォルトの名無しさん
08/08/13 00:42:31
>>51
ctype.h関数群の is〜、もありますね。
53:デフォルトの名無しさん
08/08/13 00:54:37
>>49
そんなものはただのお前の好みであって便利でもなんでもない
54:デフォルトの名無しさん
08/08/13 01:06:02
>>50
いや、使えるだろ・・・
くっつけて書かなければ
55:デフォルトの名無しさん
08/08/13 01:08:37
いちいち空白を入れるのはうざい・・・そう思っていた時期が俺にもありました
56:デフォルトの名無しさん
08/08/13 02:25:39
>>54
そう作ればそうでしょうけれども。
現在の仕様では識別子の文字セットと演算子として使用する文字とはまったくかぶらないのでひっつけてかいてもOKなのです。
57:デフォルトの名無しさん
08/08/13 02:47:53
!がどういう関数につくのかよくわからないが、?に関しては関数名で自明になるように作るでしょ。
Is〜 Has〜みたいにさ。
?がついたからわかりやすいんだ!という向きにはひまわりでもやってなさい、といいたい。
58:デフォルトの名無しさん
08/08/13 06:21:41
まさか関数の命名規則に不満がある人がいるとは思わなかった
59:デフォルトの名無しさん
08/08/13 07:41:37
コンパイル前にsedで変換すりゃいいだけじゃん。
あ、ゴメン、そういうの出来ないのか、そりゃ〜悪かった。
60:デフォルトの名無しさん
08/08/13 07:54:36
>>59
IDE使っててそういう発想がなかったのだろうよ。或いはMakefileを書けないとか。
それはさておき。
今のところ$と@は使われていないけれど、変数名なんかに使えたっけ?
61:デフォルトの名無しさん
08/08/13 08:57:58
[a-zA-Z_][a-zA-Z0-9_]*
62:デフォルトの名無しさん
08/08/13 10:43:24
処理の進行状況を表示したいのですが、
1%
2%
・
・
100%みたいに表示するのではなく
"1"% ""この数字だけ次々更新していく方法はないんですか?コンソールプログラムです
63:デフォルトの名無しさん
08/08/13 10:47:53
>>62
URLリンク(www.kumei.ne.jp)
64:デフォルトの名無しさん
08/08/13 10:48:57
簡易的に、\nじゃなくて\r使うとか
65:デフォルトの名無しさん
08/08/13 10:51:30
>>62
標準関数では無理
対象となるコンソールのスペックによる
66:デフォルトの名無しさん
08/08/13 10:58:49
\rでできました。ありがとうございます
67:デフォルトの名無しさん
08/08/13 11:19:19
うわ、いくらこのスレでも>63と>65はものの見事に恥かきっ子w
68:65
08/08/13 11:20:30
>>67
いや、べつに
69:デフォルトの名無しさん
08/08/13 11:25:29
間違ってもいいから、とにかくいう
70:デフォルトの名無しさん
08/08/13 11:31:07
最後の行という限定条件があるけどね
71:デフォルトの名無しさん
08/08/13 11:36:11
柴田望洋の明解C言語って本を借りてきたんだけど
エディタはどれを使えばいいの?
visual C++ってのが無料の統合開発環境らしいんでそれを使おうと思ってるんだけど
それでいいですか?
CとC++の違いがオブジェクト指向どうこうかいてあったけど
プログラムは初めてで何の事だか・・・
72:デフォルトの名無しさん
08/08/13 11:38:52
本が今ひとつであることと、VisualStudioでは標準でC++を作らせようとしていることを除けば特に問題ないかと。
取り敢えず、ソースファイルの拡張子はcppにしないように気をつけてね。
PC自体の知識と意欲があるならLinux使うなりCygwin入れるなりを薦めるけどね。
73:デフォルトの名無しさん
08/08/13 11:39:58
>>71
それでいいよ
ファイルの拡張子を .c にすればCとして処理される。
標準関数が安全じゃないと警告が出るときがあるけど
74:デフォルトの名無しさん
08/08/13 11:40:12
\r知らないくらい許してやって
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の機能を使えるから、同様のことができると思う。
メールを受信してどうこうは、ググれば簡単に分かると思う。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5375日前に更新/113 KB
担当:undef