C言語なら俺に聞け( ..
39:デフォルトの名無しさん
07/12/23 00:47:54
>>38
\r
40:デフォルトの名無しさん
07/12/23 01:00:40
>>38
良く知らないけど、これを使えば何でもできるんじゃね?
URLリンク(msdn.microsoft.com)
41:デフォルトの名無しさん
07/12/23 01:10:54
>>39
だめでした
>>40
ナニが描いてるのかチンプンカンプンです
42:デフォルトの名無しさん
07/12/23 01:37:42
Cを先に覚えるとC++はクラスが難関かもしれんが、速攻覚えられるな。
C++から始めると、Cは速攻覚えられるな。
つまりそういうことだ
43:デフォルトの名無しさん
07/12/23 02:12:48
>>41
これでだめ?
#include<stdio.h>
int main(void){
int i;
for(i = 0; i < 10; i++){
printf("%d", i);
fflush(stdout);
sleep(1);
printf("\r");
}
putchar('\n');
return 0;
}
44:デフォルトの名無しさん
07/12/23 05:09:19
>>41
どう書いたらどうだめだったのか書けよ
45:デフォルトの名無しさん
07/12/23 17:03:45
// 俺漏れも書いてみたー。初めてWriteConsoleとか使ったけど、こんな感じで悪くないよね?
#define STRICT
#include <windows.h>
#include <stdio.h>
#define BUFFER_SIZE 64
int main(int argc, char *argv[]) {
DWORD written = 0;
BOOL alloced = AllocConsole();
HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
char buffer[BUFFER_SIZE] = {0};
CONSOLE_SCREEN_BUFFER_INFO csbInfo = {0};
for (int i = 0; i <= 10; i++) {
GetConsoleScreenBufferInfo(stdOut, &csbInfo);
csbInfo.dwCursorPosition.X = 0;
SetConsoleCursorPosition(stdOut, csbInfo.dwCursorPosition);
int len = snprintf(buffer, BUFFER_SIZE - 1, "今 %d%% ですよ", i * 10);
WriteConsole(stdOut, buffer, len, &written, NULL);
Sleep(500);
}
if (alloced) FreeConsole();
}
46:デフォルトの名無しさん
07/12/23 17:45:52
キャラベースのプログラムで、プログレスバーの表示は\rを使うのが一般的?
FORMATコマンドでFDフォーマットするときに出てくるようなやつ。もっと他の方法があるの?
47:デフォルトの名無しさん
07/12/23 17:48:17
エスケープシーケンスとかね
48:デフォルトの名無しさん
07/12/23 23:12:48
スケジューリングの勉強をしているのですが、
データフローグラフにはどのようなデータ構造が適していますか?
また、リストスケジューリングの優先度リストに適したデータ構造についても
教えていただけないでしょうか?
49:デフォルトの名無しさん
07/12/24 01:21:13
戻り値のついて誰か詳しく教えてくれ・・・orz
本読んだんだがいまいちピンとこない・・・
50:デフォルトの名無しさん
07/12/24 02:10:54
ピンとこないときには、本読んだり人に話聞いたりするよりも、
自分でコード書いてコンパイル・実行するほうが理解できると思うよ。
そのコードはとりあえず本・Webのコピペでいいから。
51:デフォルトの名無しさん
07/12/24 02:18:59
>>50
レスサンクス
やってみるは
52:デフォルトの名無しさん
07/12/24 02:41:12
戻り値がピンとこないってのが俺にはピンとこない。
はるかな高みからの質問かもシレンが。
53:デフォルトの名無しさん
07/12/24 05:14:58
C言語を触れたこともない者でも勉強できる
お勧めの参考書教えてください
54:デフォルトの名無しさん
07/12/24 08:04:34
>>49
値を2倍する関数twiceがあったとする
例えば、printf("%d\n", twice(10)); のように使えば、20と表示されるとする
この、twice(10)の計算結果である20を、twice(10)の戻り値という
twice(15)の戻り値は30であるし、twice(-3)の戻り値は-6であろう
55:デフォルトの名無しさん
07/12/24 08:35:54
>>49
関数をジュースの自動販売機に例えると
お金が引数(実引数)でジュースが戻値(返値)
56:デフォルトの名無しさん
07/12/24 08:50:10
先生!
お釣りが出てきません!
57:デフォルトの名無しさん
07/12/24 08:54:33
>>56
手数料としてイタダキマス
58:デフォルトの名無しさん
07/12/24 09:36:28
>>53
推薦図書/必読書のためのスレッド 38
スレリンク(tech板)
59:デフォルトの名無しさん
07/12/24 09:47:32
>>49
int f(int x) {
return 2 * x + 1;
}
int main() {
printf("%d\n", f(3) + 4);
return 0;
}
とした場合、
int main() {
int f3;
f3 = 2 * 3 + 1;
printf("%d\n", f3 + 4);
return 0;
}
みたいな感じで処理される。
実際には、関数を呼ぶとその関数の中に処理が移動して、
関数の中の処理が終了すると関数を呼んだ位置に戻ってくるんだけどね。
60:デフォルトの名無しさん
07/12/24 16:52:50
>>49
私も初心者ですが、、
自動販売機にお金とジュースの種類の情報を与えたら、
ジュースの実体が戻ってくる。
それが戻り値
で、
ジュールの種類やらお金が引数
と考えると分かり易い。
61:デフォルトの名無しさん
07/12/24 16:53:22
>>55で既に説明されていたorz すんません。
62:デフォルトの名無しさん
07/12/24 17:01:48
struct S1 *S1 ; /* プロセス管理テーブル */
S1 = /* プロセス管理テーブルOPEN */
(struct S1 *)Open_Kansumei(...
,...
,...
,...) ;
こんな感じのCソースがあったんですが、
(struct S1 *)Open_Kansumei();
の部分の文法がよく分かりません。プロセス管理テーブルをオープンした結果を、
S1 構造体のアドレスの先頭に入れてるのは分かるんですが・・・。
関数名の前に (struct S1 *) が付いてる・・・?
63:デフォルトの名無しさん
07/12/24 17:02:11
FORTRANだと、戻り値があるのがFUNCTION(関数)で戻り値がないのがPROCEDURE(手続き)
数学でいう y=f(x)が関数
64:デフォルトの名無しさん
07/12/24 17:02:57
Cだと戻り値がないものも関数と呼んでいる
65:デフォルトの名無しさん
07/12/24 17:14:29
>>62
構造体へのポインタを返す関数なんじゃないの?
66:デフォルトの名無しさん
07/12/24 17:15:10
っていうか、入門書に載ってる短いサンプルでも適当に動かせばわかるだろ。。。
67:デフォルトの名無しさん
07/12/24 17:24:06
>>62
関数 Open_Kansumei の戻り値を struct S1 * 型にキャストしている
68:デフォルトの名無しさん
07/12/24 18:02:13
>>67
関数の戻り値をキャストするなら、
(struct S1 *)S1 = Open_Kansumei();
では駄目なんでしょうか?
それとも関数自体をキャスト・・・? S1 自体がアドレスだから、(struct S1 *)関数名
とすると、(struct *S1)関数名
と同じ意味になるのかな・・・よく分からなくなってきました・・・
69:デフォルトの名無しさん
07/12/24 18:11:29
>>68
型キャストの構文をもっぺん見直してみろ。
int x;
float y;
という2つの変数 x と y があるとき、y を int 型にキャストして x に代入するには
(int) x = y;
ではなく
x = (int) y;
と書くのが正しい。おk?
70:デフォルトの名無しさん
07/12/24 18:31:18
>>68
型の名前と変数名が一緒だからごっちゃになってないか?
struct S1 *p;
p = (struct S1 *)Open_Kansumei(...);
71:デフォルトの名無しさん
07/12/24 18:37:52
>>69
あ〜そうか〜そういえば!
関数の戻り値ってのは、=で受け取らないと扱えないと思ってたけど、
関数の中に関数を使ったりできますもんね。おk、おk!
ということは、「関数の戻り値をキャストして、さらに S1 に代入している」
ということなんですね。
この場合、 S1 にはアドレスが入るから、
(struct S1 *)関数名
にキャストした結果は、アドレスになる(struct S1 * 型というのはアドレス)
と考えていいんでしょうか?
72:デフォルトの名無しさん
07/12/24 19:02:48
>>70
あ・・!そういう意味なんですか?
と、、すると、
(struct S1 *)
struct S1 *
は同じ意味だから、
p = (struct S1 *)Open_Kansumei(...);
の右辺と左辺は同じ型が入るということになるんですね!
よく分かりますね!
73:デフォルトの名無しさん
07/12/24 19:14:34
ちなみに、その関数 Open_Kansumei の引数はこんな感じ↓になってます。
int Open_Kansumei( ...
, ...
, ...
, ...
)
{
char *adataadd; /* データアドレス */
...処理...
return( (int)adataadd );
}
アドレス値を int型にして引渡し、もらい先で *型に変換する、なんてこともできるんですね。
74:デフォルトの名無しさん
07/12/24 20:36:26
>>73
できるかもしれんが、行儀の良くない例だ
真似しないように
75:デフォルトの名無しさん
07/12/24 20:48:00
>>74
そうなんですね。読むだけにして、使わないようにします。
この場合、
return( adataadd );
...
p = Open_Kansumei(...);
とするのが普通なんでしょうか?これでも同じ意味になります?
76:デフォルトの名無しさん
07/12/24 20:50:06
なんで ? は、エスケープシーケンスで \? としなければいけないの?
何と区別がつかないのだ?
77:デフォルトの名無しさん
07/12/24 20:50:28
そもそもOpen_Kansumei関数の戻り値の型をstruct S1 *にしておく。
78:デフォルトの名無しさん
07/12/24 20:54:32
>>76
なんで ? を、エスケープシーケンスにしなければいけないの?
79:デフォルトの名無しさん
07/12/24 20:57:48
>>76
三項演算子とエスパーしてみる
80:デフォルトの名無しさん
07/12/24 21:08:23
>>76
「シェルが展開しようとするから」って回答がお望み?
81:デフォルトの名無しさん
07/12/24 21:16:04
>>76>>78
3文字表記(トライグラフ)のため。
3文字表記は、Cが多用する記号を使えない文字コードのための代替表記を与えるもの。
まあ過去の遺物と言っていい。
??=include <stdio.h>
int main(int argc, char *argv??(??))
??<
printf("%d??/n", argc);
??>
82:デフォルトの名無しさん
07/12/24 21:43:36
>>77
int Open_Kansumei( ... , ... , ... , ... )
{
struct S1 *adataadd; /* データアドレス */
...処理...
return( adataadd );
}
p = Open_Kansumei( ... , ... , ... , ... );
てな感じでしょうか。
この場合、
struct S1 *p;
をグローバルで宣言しないといけない訳ですね。
83:デフォルトの名無しさん
07/12/24 22:01:29
いや,グローバルかどうかは関係ない.
struct S1 * Open_Kansumei( ... , ... , ... , ... )
{
struct S1 *adataadd; /* データアドレス */
...処理...
return adataadd;
}
とするのがベター.
84:デフォルトの名無しさん
07/12/24 22:12:04
>>83
ああ、なるほど〜
関数の戻り値の型を変えるってのは、struct S1 * Open_Kansumei() の部分を
変えないと駄目ですよね。
あとは、Open_Kansumei()関数の定義側と、呼び出し側で、
struct S1 の中身が書いてある .h ファイルを include しとけばいいってことですね。
include が嫌だったから、 return( (int)adataadd ); ってしたのかもしれないな・・・
85:デフォルトの名無しさん
07/12/24 22:17:26
今ぷよぷよを作ってて、4つ以上繋がっているか上下左右をチェックする再帰処理で
スタックオーバーフローになってしまうのですが
11*20程度のフィールドでありえるんでしょうか
僕のプログラムがおかしいだけなんでしょうか
86:デフォルトの名無しさん
07/12/24 22:20:31
スタックオーバーフローってメモリ不足だろ?
MSDOSでやってるならわからんでもないけど、Winでそれが出るならプログラムがおかしいかと
87:デフォルトの名無しさん
07/12/24 22:31:35
やっぱりそうですよね・・・
こことほとんど同じやり方してるんですけど駄目みたいです
URLリンク(www13.plala.or.jp)
88:デフォルトの名無しさん
07/12/24 22:34:46
>>85
メモリのオーバーフローかもしれないと思うなら、
試しにチェックする数を3とか2とか、もっと少ない再帰で終わるものにしてみるといい
それでもプログラムが落ちるなら、無限再帰とかに陥っている可能性が高い
89:87
07/12/24 22:35:48
あれ、スタックオーバーフローってメモリ不足でいんだっけ?
用語分かんね
90:デフォルトの名無しさん
07/12/24 22:37:15
>>85
再帰だとありうるかも知れんが、まずは処理を見直したほうが良い。
再帰のネストが深すぎるかもしれない。
おかしくなさそうだったらmallocで。
>>86
スタックサイズはリンク時に決まる。
実メモリのサイズとは関係ない。
VisualC++の場合、デフォルトは1MBらしい。
91:デフォルトの名無しさん
07/12/24 22:42:14
動的メモリが動作中のプログラムと同じOS上で、デフラグをするとメモリの
内容が移動してしまったり、、、って事態は起こるんでしょうか?
他に、デフラグをするとおかしくなっちゃうような組み方ってどんなのがあります?
92:デフォルトの名無しさん
07/12/24 22:46:21
>>88
カウントが3900とかになってるので無限ループっぽいですw
ちなみに右方向限定とかならエラーは出ないです
ありがとうございました
93:デフォルトの名無しさん
07/12/24 23:06:38
>>91
デフラグ、ってHDDのデフラグだよね?
いくらなんでもそんなへぼいメモリ管理をしてない。
94:デフォルトの名無しさん
07/12/24 23:08:30
>>93
ですよね・・・。
デフラグでどうにかなっちゃうような実装があるとしたらC言語以外の何かなのか・・・。
とりあえず、C言語ではそういう実装はありえない、ってことでいいんですよね?
95:デフォルトの名無しさん
07/12/24 23:11:56
C でよく、int argc; とか、char *argv; なんて名前の変数をみかけるんですが、
どんな役割を持つ変数なんでしょうか?一般的に・・・。たいていコメントがないので・・。
96:デフォルトの名無しさん
07/12/24 23:14:36
>>95
コマンドライン引数が格納される
97:デフォルトの名無しさん
07/12/24 23:17:25
>>96
なるほど。ありがとうございました。
98:デフォルトの名無しさん
07/12/24 23:21:07
>>94
C言語は関係なく、OSの実装次第。
デフラグでおかしくなるとしたら、
デフラグツールがおかしいか、OSがおかしいかのどっちか。
99:デフォルトの名無しさん
07/12/24 23:34:17
>>98
datファイルなんかを動的に持つってことは可能でしょうか?
で、また読み込みに行ったときに、デフラグされてると、どこにあるか分からなくなる、、とか。。
基本的にファイルはHDDに保存するもので、「動的」って概念すらないんですよね・・・?
あるいはファイル名を動的メモリに持つ・・・とか?う〜ん・・・
どう頑張っても、Cの実装次第で、デフラグされるとおかしくなるようなプログラムは作れない・・・ですよね?
100:デフォルトの名無しさん
07/12/24 23:46:02
OSのファイルシステムドライバを通さずにディスクを直に読み書きしてたりすると、
デフラグでおかしくなるようなことはあるだろう。
101:デフォルトの名無しさん
07/12/24 23:51:23
>>100
なるほど。。それかもしれないです。
OSのファイルシステムドライバを通さないと、実装がカンタンとか、
そういうメリットがあるんでしょうか?
102:デフォルトの名無しさん
07/12/24 23:54:14
>datファイルなんかを動的に持つってことは可能でしょうか?
ファイルを動的に持つ、ってどういう意味?
>で、また読み込みに行ったときに、デフラグされてると、どこにあるか分からなくなる、、とか。。
そうはならない。そのあたりはファイルシステムがどうにかする。
>どう頑張っても、Cの実装次第で、デフラグされるとおかしくなるようなプログラムは作れない・・・ですよね?
CじゃなくてOSの実装だってば。
C言語的には、HDDのセクタを直接読み書きするような物だったら、
デフラグでおかしくなる可能性はある。
が、まともなOSならドライバじゃない限り
HDDのセクタを読み書きできないようになってる。
HDDのセクタを直接読み書きせず、ファイルシステムを経由してアクセスするなら、
おかしくなることはない。
103:デフォルトの名無しさん
07/12/24 23:55:28
>>101
逆に実装が難しくなるので、特殊な用途にしか使わない。
データ復旧ツールとか。
104:デフォルトの名無しさん
07/12/25 00:08:09
>>102-103
う〜ん・・・そうですか。ありがとうございます。
ドライバやデータ復旧ツールを開発する訳でもないので、
私の聞き間違いか、言った人の勘違いかなんかでしょう・・・。
ありがとうございました。
105:デフォルトの名無しさん
07/12/25 00:15:19
>>101
それこそ自分でデフラグするソフトを作るのでもない限り不要だね
106:デフォルトの名無しさん
07/12/25 00:42:37
お初です。
getch関数の質問なんですが
文字入出力関数を作成したのですが2バイトキーを無視する処理で
iKey = getch();
if ((0x00 == iKey) && (0xe0 == iKey)) {
getch();
}
というソースを書いたのですが、iKeyの型をintからcharにするとなぜかifの条件に引っかからなくなってしまうんですが、なぜなのでしょう???
知恵をお貸しください。
107:デフォルトの名無しさん
07/12/25 00:55:10
△ char
○ unsigned char
char が符号無しな環境なら char でも動くが。
0xe0 の型は int 型で、これは 224 という値に相当するけど、
char が符号つきだと、iKey = 0xe0 として iKey に入っている値はまあ大抵は -32 になる。
108:デフォルトの名無しさん
07/12/25 00:58:11
こんなソースがあるんですが、
int a;
struct S1 {
struct {
int i;
HANDLE h;
}S2[100];
} ;
...
S1->S2[a].i = 001519 ; /* 001519は時分秒 */
S2[100]とされているものに対して、S2[a] を入れることによってどうなるのかが
よく分かりません。これは、構造体の配列・・・?
109:デフォルトの名無しさん
07/12/25 01:04:32
早速の返答ありがとうございます。
このことをC言語の初心者にも分かり易く説明してくださいと言われたらどう答えますか?
110:デフォルトの名無しさん
07/12/25 01:05:38
>>109
そのまま教えればいいだろ。
わからなかったら分かるまで考えてもらえばいい。
111:デフォルトの名無しさん
07/12/25 01:13:13
本気で話し出すと汎整数拡張の話になってしまうが、
まあ簡単に言うなら char が符号つきだと
0xe0 は値の範囲から外れちゃうから等しくなんないよ、と。
112:デフォルトの名無しさん
07/12/25 01:13:52
>>108
構造体の配列。
113:デフォルトの名無しさん
07/12/25 01:14:03
ちなみに説明するというのがメインの課題なので
おしえてもらった通りに説明したいと思います。
ありがとうございました。
114:デフォルトの名無しさん
07/12/25 01:19:48
ビットシフト操作に関して、算術シフトと論理シフトの、
どっちを行うかは、規格できっちり決まっているものですか?
115:デフォルトの名無しさん
07/12/25 01:22:24
>>114
signed なら算術
unsigned なら論理
116:デフォルトの名無しさん
07/12/25 01:23:18
>>115
unsigned なら論理シフトだが、
signed の場合にどうするかは規格で決められていない。処理系定義。
117:115
07/12/25 01:25:34
>>116
ぅぉ、マジカ。知らんかった…トンクス。
118:デフォルトの名無しさん
07/12/25 01:27:04
>>112
なるほど・・・。
int a = 5;
だとしたら、S2構造体の 5番目の変数 i にアクセスしてるってことなんですね。
S1->
となってるのは、なんでなんでしょうか?
119:デフォルトの名無しさん
07/12/25 01:29:09
S1-> なんてできるはずがないんだが。
120:デフォルトの名無しさん
07/12/25 01:31:30
× S2構造体の 5番目の変数 i
○ S1 のメンバである、無名の構造体の配列 S2 の 5 番目の要素の、メンバ i
121:デフォルトの名無しさん
07/12/25 01:32:23
>>119
そうなんですか?
至るところで、
S1->
をやってます。。そもそもなんで入れ子なんだろう・・・構造体要素1個なのに
至るところで入れ子やってます・・。
122:デフォルトの名無しさん
07/12/25 01:33:46
struct {
struct {
int i;
HANDLE h;
} S2[100];
} S1[1];
となってないか?
123:デフォルトの名無しさん
07/12/25 01:36:54
>>120
「S2」は「構造体の配列名」であって、「構造体名」ではないんですね。
構造体名は無名なんですね。
メンバ i
は、構造体配列 S2 の5番目の要素の無名構造体のメンバ i
って感じでしょうか。
124:デフォルトの名無しさん
07/12/25 01:41:05
まあ言葉で表現すると難しいが、とりあえず
こいつのことだ
↓
S2[100] [i | h] [i | h] [i | h] [i | h] [i | h] [i | h] [i | h] ... [i | h]
S2[0] S2[1] S2[2] S2[3] S2[4] S2[5] S2[6] ... S2[99]
125:デフォルトの名無しさん
07/12/25 01:41:56
>>122
あ、すみません!
S1->S2[a].i = 001519 ;
をやる前に、
struct S1 *S1 ;
となってました。
この場合、また型名と変数名が同じなので、
S1->
がどっちを指してるか分からないのですが・・・(n
126:デフォルトの名無しさん
07/12/25 01:42:53
>>125
単に構造体タグ名と変数名が同じというだけだな。
S1-> の S1 は変数名。
127:デフォルトの名無しさん
07/12/25 01:45:39
001519 ってのが凄く気になる。
こう書くと 8 進数になるけど 9 ってのが入ってて、
エラーになるはずだが。
128:デフォルトの名無しさん
07/12/25 01:49:53
>>124
どうもご丁寧にありがとうございます。
なるほど。分かり易いです。
>>126
struct S1 *p ;
p->
ってことですね。なんで分かるんですかぁぁ・・??
p->
だとすると、なんでわざわざポインタ型にして、入れ子の中の構造体に
アクセス??あああ訳が分からない・・・・結局 i には何が入っているの・・・
129:デフォルトの名無しさん
07/12/25 01:56:13
>ってことですね。なんで分かるんですかぁぁ・・??
構造体タグ名を使って S1-> という風にはできないから
S1 は何らかのポインタであるはずだ、ということになる。
C だと構造体タグ名と同名の変数を作る事はできるけど、普通は紛らわしいのでやらない。
>結局〜
例えば
struct S1 hoge;
struct S1 *S1 = &hoge;
とした場合、S1->S2[a].i は hoge.S2[a].i と同じことになる。
130:デフォルトの名無しさん
07/12/25 01:59:49
>>127
すみません。001519 に入ってる値は、ビット演算子で時分秒をいろいろ
ゴチャゴチャやっていた値が入っていて、ビット演算子がよく分からなかったので、
>>105 の書き込み時間を適当に入れてみただけなんです。
晒してしまうと、
struct tm tagTime;
pstm = &tagTime;
nRunTime = /* 時分秒設定 */
(((((((pstm->tm_hour / 10) << 4) | (pstm->tm_hour % 10)) << 8) |
((pstm->tm_min / 10) << 4) | (pstm->tm_min % 10)) << 8) |
((pstm->tm_sec / 10) << 4) | (pstm->tm_sec)) << 8 ;
S1->S2[a].i = nRunTime ;
ってなことをやってます。
131:デフォルトの名無しさん
07/12/25 02:01:03
まあ、ちゃんとやってるのならいいのよ。
132:デフォルトの名無しさん
07/12/25 02:03:20
#include<stdio.h>
int gcm(int a,int b);
int gcm(int a,int b){
int amari;
if( a < b ){
while(1){
amari = b % a;
if( amari == 0 ){
return amari;
break;
}else{
a = b;
b = amari;
}
}
}else{
while(1){
amari = a % b;
if( amari == 0 ){
return amari;
break;
}else{
b = a;
a = amari;
}
}
}
}
133:デフォルトの名無しさん
07/12/25 02:04:01
int main(void){
int x,y;
int ans;
printf("*********最大公約数の計算をします********\n\n\n");
printf("1つ目の整数値を入力してください:");
scanf("%d",&x);
printf("\n2つ目の整数値を入力してください:");
scanf("%d",&y);
ans = gcm(x,y);
printf( "\n\n\nGCM(%d %d) = %d", x, y, ans);
return 0;
}
134:デフォルトの名無しさん
07/12/25 02:06:00
>>132
>>133
ユークリッドの互助法のプログラムを書いてみたんですが、
二つの数値入力してエンターキー押したらコマンドプロンプトの画面がすぐ消えてしまいます。
自分ではこれであってると思うのですがどこがおかしいか見てもらえますか。
お願いします。
135:デフォルトの名無しさん
07/12/25 02:07:28
>>129
>S1->S2[a].i は hoge.S2[a].i と同じ
が難解すぎる・・・orz
>>129を考えながら寝ることにします。
夜分遅くまでお付き合いいただき、大変ありがとうございました!
おやすみなさい。
136:デフォルトの名無しさん
07/12/25 02:08:21
>>134
Ctrl+F5 で実行すると消えない。
あるいは、最後にもう1つ入力をいれておくか。
まあ、まだバグがあるようだが、それは考えてくれ。
137:デフォルトの名無しさん
07/12/25 02:09:10
>>135
図を書くといいよ。
138:デフォルトの名無しさん
07/12/25 02:10:18
>>134
一瞬で終わる計算なんだからそれで正しいだろう
139:デフォルトの名無しさん
07/12/25 02:15:39
>>136
>>138
Ctrl+F5なら消えないんですかほむほむ。
return amariを return bに直したら正常に計算する事ができました。
ありがとうございます。
140:デフォルトの名無しさん
07/12/25 02:20:07
>>135
(*S1).S2[a].i と同じではどうだ。
141:デフォルトの名無しさん
07/12/25 09:48:22
失礼します。
現在、MSNメッセンジャーで受信したメッセージから特定のコマンドを抜き出して
別のアプリケーションへ送るというソフトを作ろうとしています。
そこで、まず、あらかじめアクティブにしておいたメッセンジャーで受信した文字列を
1秒間隔でCTRL+A CTRL+Cを利用して取り込む・・・という方法を調べているのですが分かりません。
どなたか答えていただける方がいればよろしくお願いいたします。
142:デフォルトの名無しさん
07/12/25 09:57:58
>>141
メッセンジャーでやったことはないけど
直接ウインドウテキスト取れないか?
143:デフォルトの名無しさん
07/12/25 09:58:48
>>141
スレ違い。
VisualC++スレへ。
スレリンク(tech板)
144:デフォルトの名無しさん
07/12/25 10:02:25
>>142
SetWindowText()ってやつでしょうか?
>>143
あれ・・・ここじゃだめなんでしょうか?
145:デフォルトの名無しさん
07/12/25 10:14:18
>>144
スレタイ読める?
146:デフォルトの名無しさん
07/12/25 10:17:47
>>145
いや、C言語・・・。
147:デフォルトの名無しさん
07/12/25 10:18:40
>>146
Win32API質問箱 Build60
スレリンク(tech板)
148:デフォルトの名無しさん
07/12/25 10:42:28
>>146ですが移動します。
149:デフォルトの名無しさん
07/12/25 11:57:03
初心者ですが。
データ型って意味あんすか?・・・
signed long intとか long intと同じじゃないすか?
undigned型とかって使ったりすんでしょうかね?
150:デフォルトの名無しさん
07/12/25 12:05:08
>>149
long intはsigned long int の省略みたいな物だからまあ同じだろうね
unsignedは使うだろ
signedで桁数が足りなくて、負数を扱わない時とか
151:デフォルトの名無しさん
07/12/25 13:05:17
>>149
・-(マイナス)の値がありえない変数のバグ防止
・char型については、signedを指定しないときの符号の有無は処理系依存
意味無いものなんて無い。必要に応じて使い分けるべし。
152:デフォルトの名無しさん
07/12/25 14:01:54
%lfで表示すると0.0000とかになるんですが、
eを使って表示させると6.111e-20とか、計算誤差の分が表示されてしまいます。
解決する方法はありますか?
153:デフォルトの名無しさん
07/12/25 14:17:04
>>152
どう表示させたいのかわからない。
%3.1e とか?
154:デフォルトの名無しさん
07/12/25 14:26:40
>>153
eを用いて表示させたいんですが、精度は小数点以下5桁ぐらいで、それいじょうはeの表示に反映させないようにしたいです
155:デフォルトの名無しさん
07/12/25 14:33:16
こんな感じか
if (fabs(x) < 0.00001) {
x = 0;
}
printf("%e", x);
156:デフォルトの名無しさん
07/12/25 14:36:21
>>155
0のときだけじゃなく、どんな数字にたいしても精度を切り捨てたいんです
157:デフォルトの名無しさん
07/12/25 15:50:41
いま、ポインタとファイルオープンまで学んだんだが。
あんたら何作ってる?
俺はアドレス帳など作ってみたんだが他にやりがいのある物はないか?
158:デフォルトの名無しさん
07/12/25 15:58:25
オセロとかテトリスとか簡単なゲームなんかどうかな
159:デフォルトの名無しさん
07/12/25 16:06:06
テトリスとか敷居高そうっすね。
物体が動くようにしたり
160:デフォルトの名無しさん
07/12/25 16:17:08
>>156
つ[%.5g]
161:デフォルトの名無しさん
07/12/25 17:05:39
正数同士の除算の切捨て誤差を
四捨五入で求めたいのですが、
どういう風に書けばいいでしょうか。
今は下記のようにしています。
int n,m,d
n = m / d;
if( (m % d) > (d >> 1) ) n ++;
162:デフォルトの名無しさん
07/12/25 17:20:57
それのどこが切り捨て誤差?
163:デフォルトの名無しさん
07/12/25 17:26:47
そもそも整数演算で打ち切り誤差など発生しない。
164:デフォルトの名無しさん
07/12/25 17:30:17
>>160
うまくいきません。6.111e-20とかでてきます。
165:デフォルトの名無しさん
07/12/25 17:30:43
>>164
どう表示させたいのかわかんあいんだよ
166:デフォルトの名無しさん
07/12/25 17:36:17
>>165
double型の変数の
小数点以下、例えば5桁だけを利用して表示したいんです。
0.000000002121なら0を表示したいです。
数がでかくなったらeを使ってすっきり表示したいです
167:デフォルトの名無しさん
07/12/25 17:42:13
#include<stdio.h>
char pai[3][9] = { {'1','2','3','4','5','6','7','8','9'},
{'@','A','B','C','D','E','F','G','H'},
{'一','二','三','四','伍','六','七','八','九'},
};
int main (void){
printf("%c",pai[0][2]);
return 0;
}
これで3という文字が表示されるはずなんですがうまくいきません。
どうなおせばいいのでしょうか。
168:デフォルトの名無しさん
07/12/25 17:43:44
>>166
こうか?
if(fabs(x)>=1000){
printf("%e", x);
}else{
printf("%f", x);
}
169:デフォルトの名無しさん
07/12/25 17:46:20
>>167
Warningいっぱい出なかった?
3はマルチバイト文字だから、'3' とやったら半分しか入らんぞ
170:デフォルトの名無しさん
07/12/25 17:48:37
>>166
二度手間だけど、丸めと表示の二段階で行なう。
void print(double foo)
{
char buf[20];
sprintf(buf, "%.5g", 1 + foo);
printf("%.5g", atof(buf) - 1);
}
171:デフォルトの名無しさん
07/12/25 17:50:40
>>166
自分の好きにフォーマットをコントロールしたいなら、
もうprintfのフォーマット機能に頼らず、
自分でフォーマットするプログラムを書いた方が早くないか?
いや、そんな気がする。どうだろう?
172:デフォルトの名無しさん
07/12/25 18:18:21
てす
173:デフォルトの名無しさん
07/12/25 18:27:50
>>169
3をいれるのにはどうやればいいんですか?
174:デフォルトの名無しさん
07/12/25 18:35:19
>>173
そりゃキミがどうしたいのかによって変わってくるが・・・
char pai2[3][9*2+1] = {
{"123456789"},
{"@ABCDEFGH"},
{"一二三四伍六七八九"},
};
printf("%c%c",pai2[0][2*2],pai2[0][2*2+1]);
これでも一応出るんで、あとは考えて。
175:デフォルトの名無しさん
07/12/25 18:36:41
>>167,173
●文字列にする方法
char pai ⇒ const char *pai
'3'など ⇒ "3"
printf() ⇒ printf("%s", ...
●ワイド文字にする方法
char pai ⇒ wchar_t pai
'3'など ⇒ L'3'
printf() ⇒ wprintf(L"%lc", ...
かなあ? いまいち自信なし。
176:デフォルトの名無しさん
07/12/25 19:18:52
>>167
char pai[3][9] = { {'1','2','3','4','5','6','7','8','9'},
{'@','A','B','C','D','E','F','G','H'},
{'一','二','三','四','伍','六','七','八','九'},
};
↑この時点でスタック壊してるな。
何が起こっても不思議ではない。
ワイド文字にしたほうがよい。
>●ワイド文字にする方法
>char pai ⇒ wchar_t pai
>'3'など ⇒ L'3'
>printf() ⇒ wprintf(L"%lc", ...
処理系がわからんが、VCなら L'3' じゃなくて_T('3')のほうがいい。
177:デフォルトの名無しさん
07/12/25 19:38:19
>>161
n = (m+0.5)/d;
178:デフォルトの名無しさん
07/12/25 19:53:57
>>176
ワイドじゃないとダメだから _T にしたらあかんがな。
179:デフォルトの名無しさん
07/12/25 23:07:29
某サイトの問題をやってみました。
【問題】
文字列Aのm番目からn個分の文字列を配列Bにコピーする
サブルーチンを作れ。
ただし、m,nの値が文字列Aの範囲を超えるような値が入力
されたら1を返し、正常にコピーできたら0を返す。
こんなプログラム組みました。
問題中のm,n,文字列A,Bの各オブジェクト名,サブルーチンの返値は
勝手に解釈して組んでます。(正常時TRUE(1),異常時FALSE(0))
180:デフォルトの名無しさん
07/12/25 23:08:45
#include <stdio.h>
#include <string.h>
#define STR_MAX 10
#define TRUE 1
#define FALSE 0
typedef unsigned short BOOL;
BOOL BlockCopy( unsigned char*, unsigned char*, short, short );
// メイン関数
int main( void )
{
unsigned char szSrcName[STR_MAX+1];
unsigned char szDstName[STR_MAX+1];
short nStartPos = 0;
short nCopyLen = 0;
printf( "Input Str : " ); scanf( "%10s", szSrcName );
printf( "Input StartPosition : " ); scanf( "%d", &nStartPos );
printf( "Input CopyLength : " ); scanf( "%d", &nCopyLen );
if( BlockCopy( szDstName, szSrcName, nStartPos, nCopyLen ) == FALSE )
{
puts( "Error!!" );
return 1;
}
printf( "入力文字列 : %s\n", szSrcName );
printf( "コピー文字列 : %s\n", szDstName );
return 0;
}
181:179,180
07/12/25 23:09:25
// サブルーチン関数
BOOL BlockCopy( unsigned char* s1, unsigned char* s2, short m, short n )
{
int i;
short nLen = strlen( s2 );
if( nLen < m || nLen < (m+n) || nLen < n )
return FALSE;
memcpy( s1, s2+m, sizeof(char)*n );
return TRUE;
}
動作的には問題ないと思ってますがアドバイスお願いします。
また、この組み方はセンスないぞと思われる方は、よりよい
プログラムの組み方を教授して頂ければ幸甚です。
182:デフォルトの名無しさん
07/12/25 23:20:56
Windows2003Server上でVMware Serverを使ってRHE3を動かしてます。
その上でlibjpeg.soを使ったjpeg圧縮ライブラリを作りましたが、
jpeg_create_compress()を実行した時点で以下のメッセージが出て先に進みません。
JPEG parameter struct mismatch: library thinks size is 372, caller expects 376
構造体のサイズが合っていないと言ってるのはわかるのですが、
libjpeg.soとjpeglib.hのVerは合わせてありますし、
同じ名前のファイルが複数存在しない事も確認済みです。
どなたか解決方法を知らないでしょうか?
183:デフォルトの名無しさん
07/12/25 23:40:13
>>181
・無闇とshortを使うのはよくない。
・sizeof(char)が1であることを前提としている関数を使うのにsizeof(char)を掛けるのはおかしい。
・「文字列をコピーする」関数なのだから、ナルターミネートは保証するべき。
ってことで、判定部を除くとこれでいい。
sprintf(s1, "%.*s", n, s2 + m);
184:デフォルトの名無しさん
07/12/25 23:55:05
C言語でポートを選び、指定して
相手とファイルをやり取りするってプログラムを作りたいんだが。
どんな関数とか使うんだ?接続など
185:デフォルトの名無しさん
07/12/25 23:57:46
>>184
環境と使うライブラリによって違う。
186:デフォルトの名無しさん
07/12/26 00:05:04
相手==
187:デフォルトの名無しさん
07/12/26 01:13:18
>>180
その手の文字列処理関数は、コード見ないとどの引数が入力でどれが出力か分からないから、
プロトタイプ宣言だけで分かるようにconst付けたり仮引数名を工夫したりするといい
BOOL BlockCopy(unsigned char* dst, const unsigned char* src, short, short );
188:デフォルトの名無しさん
07/12/26 01:24:37
>>182
.so と .h の不整合ではなくて、.so を作ったときのコンパイラ(構造体
のパディング)とそれを利用するプログラムのコンパイラ(構造体のパディ
ング)が違うんだろう。
189:デフォルトの名無しさん
07/12/26 08:30:05
>>182
#pragma pack(push,4)
#include"jpeglib.h"
#pragma pack(pop)
もしくはコンパイルオプションで指定
190:182
07/12/26 10:42:05
>>189
#pragma指定を追加する事で無事にプログラムが流れました。
gdbで構造体を確認しましたが壊れている様子もありませんでした。
どうもありがとうございました。
191:デフォルトの名無しさん
07/12/26 14:01:12
printf("%.4s", s);
の%.4sってどういう意味でしょうか?
192:デフォルトの名無しさん
07/12/26 14:08:20
>>191
最小幅と最大幅の指定のうち、最小幅を省略したもの
193:デフォルトの名無しさん
07/12/26 14:45:17
>>192
ありがとございました。
194:デフォルトの名無しさん
07/12/26 21:07:06
質問いいですか
#include <stdio.h>
int main(void)
{
printf("%d\n",10*2);
return 0;
}
この場合関数の型名ってあんまり意味ってないんですよね?
変数宣言などするときに意味があったりするんですか?
195:デフォルトの名無しさん
07/12/26 21:16:37
もうちょっと何が聞きたいのかはっきりしてくれ。
関数ってどっちの関数?main?printf?
型名って何の型名?引数?戻り値?
196:デフォルトの名無しさん
07/12/26 21:21:20
>>194
質問の意味がよくわかんね
printfは可変長引数
floatとか使いたいとき明示的に
接尾子のfを付けたりする
197:デフォルトの名無しさん
07/12/26 21:24:32
main の戻り値に意義が見いだせないという事なのか、
それとも printf の戻り値を使ってないという事に関する疑問か。
198:デフォルトの名無しさん
07/12/26 21:43:08
うぉ・・・エスパーできん・・・
199:デフォルトの名無しさん
07/12/26 21:48:27
これは10*2に対して、一時変数に格納する意味なんて無いよね?っていうことでは
200:デフォルトの名無しさん
07/12/26 21:51:30
>>195
だって苦しむなんちゃらには
型名 関数名(引数){なんちゃら}
で関数って書いてあったんだもの><
>>199
そのとおりでございます
201:デフォルトの名無しさん
07/12/26 22:04:26
>>200
やっぱりわかんね。
int temp = 10 * 2;
printf("%d\n",temp);
と
printf("%d\n",10*2);
は、最適化されて同じバイナリが吐かれるよね?、ということを聞いてる?
202:デフォルトの名無しさん
07/12/26 22:08:03
あー printf にも戻り値は int型 って関数バイブルみたいな本に書いてあったな。
そういうことじゃ?
203:デフォルトの名無しさん
07/12/26 22:09:55
>>201
#include <stdio.h>
int main(void)
{
printf("%d\n",10*2);
return 0;
}
の場合intは文的には必要だが機能としてはまったく意味はない??が
#include <stdio.h>
int main(void)
{
printf("%d\n",(int)(1.05 * 360));
return 0;
}
のようにキャスト変換などするとintが使用されるっていうか
意味があるっていうか・・・・
そんな感じです
204:デフォルトの名無しさん
07/12/26 22:11:45
>>203
そもそも関数の型の意味を理解していないな。
int mainのintは戻り値(OSに正常終了か否か)をreturn 0 か1かで必要だからint mainなんだよ。
205:デフォルトの名無しさん
07/12/26 22:13:56
>>204
まだそこまでたどりついてません・・・
今苦しんでのキャスト変換のところなんで
もっと勉強すればわかることなんですね
206:デフォルトの名無しさん
07/12/26 22:17:41
>>203
関数の戻り値が分かってない?
これは何をしているかわかる?
int unko(int x) {
int z = x*2;
return z;
}
int main()
{
int temp = unko(100);
return 0;
}
207:デフォルトの名無しさん
07/12/26 22:18:11
キャスト変換はただその時の型を「一時的に強制的のその型にする」って理解すればいいと思うよ。
int main(void)
{
〜〜〜
return 0;
}
は、関数の章で学ぶと思うから、
今は明示的に書かなければならないと思っておけばOK。
あまり先飛びすぎても混乱するだけだしね。
208:デフォルトの名無しさん
07/12/26 22:46:21
>>203
整数リテラル 10 はそれ自体としてintという型を持っている。
整数リテラル 2 もintで、int*intの結果はint型になることになっている。
209:デフォルトの名無しさん
07/12/26 22:52:30
ってそういうことじゃないのか。
210:デフォルトの名無しさん
07/12/26 23:03:58
>>194
とりあえず総じて何が聞きたいのか理解できん。
まずはここあたりを順に読んで、基本を覚えよ。
URLリンク(homepage1.nifty.com)
211:デフォルトの名無しさん
07/12/26 23:29:52
>>205
そのサイトは地雷原だから、他で勉強することを強くお勧めする。
212:デフォルトの名無しさん
07/12/26 23:31:17
URLリンク(www9.plala.or.jp)
ここオヌヌメ
友達から教わったけど、ここだけでCの基礎はバッチリ・・・?覚えたよ
ていうかC言語でググると一番上に出てくる
213:デフォルトの名無しさん
07/12/26 23:43:51
>>212
あー、間違いをそれと知らずに教わるにはいいかも。
214:デフォルトの名無しさん
07/12/26 23:44:32
どういうこっちゃ?
215:デフォルトの名無しさん
07/12/26 23:46:46
今時 C から始めるのは損だよ。
C++ の本でも最初のうちは C と似たようなもんだし、
その延長で C++ まで覚えてしまった方が絶対得だよ。
216:デフォルトの名無しさん
07/12/26 23:47:18
いきなりC++はどうだろうか。
C++はしょっぱなからクラス教えないっけ?
217:デフォルトの名無しさん
07/12/26 23:57:32
C++が仕様としてカバーしているCとしての意味での、C++ってことじゃない?
まずCをやるんだけど、mallocとかFILE*とか、C++ではとって変わった部分を捨てて、
そのままC++のクラスなりnewなりをやれ、みたいなぁぁぁ
218:デフォルトの名無しさん
07/12/26 23:58:16
>>214
間違いがあるってことだろ。間違いかどうかは微妙だけど、こういう書き方されるともにょる。
>つまり、書き換える必要のある文字列は、一旦文字型配列に格納してから処理をするのが無難だと言えます。
# 無難も何も、文字列リテラルを書き換えるのは論外なわけで……
219:デフォルトの名無しさん
07/12/27 00:08:39
言葉が足りないんじゃないか
格納=コピーならいいけど、ポインタだけ格納してもね
220:デフォルトの名無しさん
07/12/27 03:29:34
#include<stdio.h>
int main(void)
{
int i,d=97,c=65;
char ca;
scanf("%c",&ca);
for(i=65;i=<90;i++){
if(ca=c){
ca=d;
breke;
}
else{
i++,d++,c++;
}
}
printf("ca = %c ",ca);
return 0;
}
なんでこれがコンパイルできひんのじゃ!C言語死ねッ!!!!!
221:デフォルトの名無しさん
07/12/27 03:47:14
if(ca=c)がおかしい
比較じゃなく代入してる
222:デフォルトの名無しさん
07/12/27 03:49:14
ほんまや!!!!!
すまんかった・・・・・
223:デフォルトの名無しさん
07/12/27 03:49:59
んでfor分の終了条件が=<なんて演算子はない。 <= だ。
ついでにbreak。brekeなんてない。
224:デフォルトの名無しさん
07/12/27 03:50:30
ていうかコンパイルエラー見れば原因わかるんだけど、コンパイラ何使ってるんだ???
225:デフォルトの名無しさん
07/12/27 03:51:48
ボーランド
プロンプト読めない
226:デフォルトの名無しさん
07/12/27 03:53:10
URLリンク(hp.vector.co.jp)
オヌヌメ
227:デフォルトの名無しさん
07/12/27 03:56:51
ありがじゅう。
お気に入り追加した
この恩は忘れるまで忘れない!
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5371日前に更新/237 KB
担当:undef