07/12/22 12:49:52
Part 1 スレリンク(tech板)
Part 2 スレリンク(tech板)
Part 3 スレリンク(tech板)
Part 4 スレリンク(tech板)
Part 5 スレリンク(tech板)
Part 6 スレリンク(tech板)
Part 7 スレリンク(tech板)
Part 8 スレリンク(tech板)
Part 9 スレリンク(tech板)
Part 10 スレリンク(tech板)
Part 11 スレリンク(tech板)
Part 12 スレリンク(tech板)
Part 13 スレリンク(tech板)
Part 14 スレリンク(tech板)
Part 15 スレリンク(tech板)
Part 16 スレリンク(tech板)
Part 17 スレリンク(tech板)
Part 18 スレリンク(tech板)
Part 19 スレリンク(tech板)
Part 20 スレリンク(tech板)
Part 21 スレリンク(tech板)
3:デフォルトの名無しさん
07/12/22 13:52:23
printfで
0.1
0.2
・
・
・
9.9
10.0
10.1
10.2
みたいに右ぞろえで出力するにはどうすればいいですか?
4:デフォルトの名無しさん
07/12/22 13:58:08
右揃えなってないけど
5:デフォルトの名無しさん
07/12/22 14:00:40
投稿したらずれてしまいました
0.1
0.2
・
・
・
9.9
10.0
10.1
10.2
6:デフォルトの名無しさん
07/12/22 14:04:40
なってないじゃん
7:デフォルトの名無しさん
07/12/22 14:04:43
printf()の実数の書式なんて忘れてるな。
ググったらこんなページあったけど。
URLリンク(wisdom.sakura.ne.jp)
8:デフォルトの名無しさん
07/12/22 14:05:33
%桁数.桁数f
9:デフォルトの名無しさん
07/12/22 14:09:05
>>7 >>8
うまくいかないです
*0.1
*0.2
・
・
・
*9.9
10.0
10.1
10.2
こうしたいんです。*は空白とかんがえてください
10:デフォルトの名無しさん
07/12/22 14:12:45
幅指定してやればいい
右左のそろえを変えたいならマイナスつければいいし
11:デフォルトの名無しさん
07/12/22 14:18:20
>>9
どうやったんだよ
何で自分がやったやりかたを隠すんだ?
12:デフォルトの名無しさん
07/12/22 14:24:09
>>11
%2.2fです
13:デフォルトの名無しさん
07/12/22 14:25:06
>>12
%ドットを含めた全体の桁数.小数点以下の桁数f
14:デフォルトの名無しさん
07/12/22 14:30:44
>>13
できました。どうもすいません
15:デフォルトの名無しさん
07/12/22 14:59:48
>>13
整数部分の桁数がわからない場合はどうすればいいですか?
*******1.12100912
******11.21890212
******12.12109121
*****212.21029211
***26575.12121111
みたいにしたいんですが
16:デフォルトの名無しさん
07/12/22 15:03:33
あらかじめ桁数大きくしておけば
17:デフォルトの名無しさん
07/12/22 16:55:14
>>15
* を使えば実行時に決定できる
数値はそのままで、空白を自分で追加してもいいし、どうにでなるでしょ。
18:デフォルトの名無しさん
07/12/22 18:55:29
>>前999
無理。
typedef は前処理(#ifdef とか #define とかの処理)が終了した後の
コンパイル時に解析されるものであって、前処理ではその情報は使用できない。
bool を typedef するのと同時にマクロを別に定義するようにしておいて、
そのマクロが定義されているかどうかを #ifdef で判定するしかない。
19:デフォルトの名無しさん
07/12/22 22:14:31
すいません質問いいですか?
苦しんでのHPで書いてあったことなんですが・・・
変数のところを勉強してるのですが
そこに
[ コンパイラの機能 ]
実は、このプログラムは多くのコンパイラでは動いてしまいます。
それは、C言語の拡張版である、C++(シープラプラ)では使えるからです。
また、近年決められたC言語の新規格であるC99でも使えます。
しかし、元々のC言語では使えないと覚えて下さい。
と書いてありましたが
C言語のコンパイラでは変数は使えないと考えていいのでしょうか?
20:デフォルトの名無しさん
07/12/22 22:21:22
>>19
貴様は何を言っているのだ?
21:デフォルトの名無しさん
07/12/22 22:22:52
>>19
その一段前を読み直すんだ。
--
変数の宣言は、基本的に、関数の先頭でしか行うことが出来ません。
例えば、次のように変数を宣言することは出来ません。
--
22:デフォルトの名無しさん
07/12/22 22:24:47
>>21
ありがとうございます
ということはCでは変数の宣言を関数の先頭でしか行えない
しかしほかのは先頭じゃなくても行えるということでしょうか?
23:デフォルトの名無しさん
07/12/22 22:24:57
ん?
bccで.cをコンパイルすると通らないぜそれ
24:デフォルトの名無しさん
07/12/22 22:28:31
>>22
概ねその通り。厳密にはブロックの先頭だが。
従って、
--
int main(void)
{
printf("Hello\n");
int value; /* 変数宣言の部分 */
return 0;
}
--
の変数宣言をどうしてもprintf()の後で行ないたいならこうすればいい。
--
int main(void)
{
printf("Hello\n");
{
int value; /* 変数宣言の部分 */
}
return 0;
}
--
>>23
bccは、その筆者にとっては「多くのコンパイラ」に含まれないのだろ。
つーか、そのサイトは結構難有りだと思うがな。
25:デフォルトの名無しさん
07/12/22 22:31:49
そのサイトのダメダメな一例。
--
fpos_t fsize = 0;
fpos_t fsizeb = fseek(fp,0,SEEK_END);
fgetpos(fp,&fsize);
fseek(fp,fsizeb,SEEK_SET);
--
この突っ込みだらけのコードは一体なんなんだか。
26:デフォルトの名無しさん
07/12/22 22:39:08
>>24みたいにするとvalueってすぐ見えなくなるんじゃね?
27:デフォルトの名無しさん
07/12/22 22:39:08
>>24
そうゆう書き方もありなのか・・・
もう2週間経つがまだ変数の宣言までしか覚えてない
いつになればCが覚えられるのかな
28:デフォルトの名無しさん
07/12/22 22:42:28
>>27
日本語を覚えるのにどれだけ掛かったか、英語を覚えるのにどれだけ掛かったかを考えれば、
Cを覚えられるようになるのにどれだけ掛かるか判ろうものだ。
>>26
勿論int valueの宣言の後、そのブロックが閉じる前に使いたいだけ使えばいい。
29:デフォルトの名無しさん
07/12/22 22:48:00
>>27
自然言語と一緒で意味を考えながら書写すればいいよ。
音読するとご近所さんから奇人扱いされそうだけど
30:デフォルトの名無しさん
07/12/22 22:50:15
>>28-29
一応書きながらやっているから今までのことは覚えられているのだけれども・・・
文字列リテラルとか必要な言葉かどうか疑問に思ってくる
Cは覚えておいて損はないだろうから一応忘れないように
がんばっているんだがこれは無駄ではないよね?
31:デフォルトの名無しさん
07/12/22 23:03:24
知識は無駄ではないよ。知ってると知らないなら知ってるほうがよいに決まってる。
まあ、人間の脳なんて限界があるから、細かいことまで一生覚えてる必要はないよ。
それがどこに書いてあったかを覚えといて、必要なときにすぐに参照できるようにしておけばいい。
リテラルってのがソースコードに直に書いてある値のことだと知れば、
文字列リテラルだろうが整数リテラルだろうが、別に怖いことはないでしょ。
物の名前は他人に説明するときに絶対に必要だから、嫌でも覚えてしまうよ。
32:デフォルトの名無しさん
07/12/22 23:04:31
>>31
ありがとう
やる気が出てきたよ
33:デフォルトの名無しさん
07/12/22 23:07:15
CってC++ってに比べて覚えること少なくね?
標準ライブラリの細かい使い方まで行くとまた別だが、
C自体の構文なんかは数日で覚えられるだろ
34:デフォルトの名無しさん
07/12/22 23:10:24
>>33
でもほら短時間で覚えると忘れちゃうじゃん
だからゆっくり覚えてるのSA!!
まだ変数のところだけどノートに26ページ書いてあるんだよ・・・
35:デフォルトの名無しさん
07/12/22 23:17:57
>>33
そりゃ、C++はCに++したものだからあたりまえ
36:デフォルトの名無しさん
07/12/23 00:33:27
Cから1しか増えてない割には結構な増強だな
C+=2くらいじゃないのか
37:デフォルトの名無しさん
07/12/23 00:38:47
っ オペレーターオーバーローディング
38:デフォルトの名無しさん
07/12/23 00:46:38
くだらない質問なのですが
CのDOS窓でprintfするときに、画面で
ファイル ○を読み込みました
進行度 ○%
見たいのを表示してるのですが、1個ずつ改行されるので
それを改行しないように画面更新するにはどうやればいいのですか?
まったくやったこと無くて
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'},
{'①','②','③','④','⑤','⑥','⑦','⑧','⑨'},
{'一','二','三','四','伍','六','七','八','九'},
};
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"},
{"①②③④⑤⑥⑦⑧⑨"},
{"一二三四伍六七八九"},
};
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'},
{'①','②','③','④','⑤','⑥','⑦','⑧','⑨'},
{'一','二','三','四','伍','六','七','八','九'},
};
↑この時点でスタック壊してるな。
何が起こっても不思議ではない。
ワイド文字にしたほうがよい。
>●ワイド文字にする方法
>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
ありがじゅう。
お気に入り追加した
この恩は忘れるまで忘れない!
228:デフォルトの名無しさん
07/12/27 04:03:27
>>220
コンパイラタン(AA略)「なんでよ私一生懸命やってるじゃん!なんでそんなこと言うの!・・・ヒドイヨ・・・・・」
229:デフォルトの名無しさん
07/12/27 04:09:30
コンパイラタン「と、途中でそんなの挿入したら、(エラーが)で、出ちゃうじゃない・・・・・!!!」
230:デフォルトの名無しさん
07/12/27 04:37:37
その夜”ピ、ピ、”と言う不思議な音が深夜の闇の中木霊しつづけた・・・
231:デフォルトの名無しさん
07/12/27 04:43:19
コンパイラタン「だ、だめっ!そこに"Shift"しちゃダメェェェェェ!!!」
232:デフォルトの名無しさん
07/12/27 07:24:49
自分で色々検索して、何度も本を読み返したのですが判らないので質問です。
下記のソースでコンパイルは通るのですがIF文で条件外でも処理を実行してしまうようなのです。
どこが間違っているのか教えてください。お願いします。
#include <stdio.h>
#include <ctype.h>
main() {
int i;
int date[10];
for(i=0 ; i<10 ; i++) {
scan:
printf("%d個目のデータ:", i+1);
fflush(stdin);
scanf("%d", &date[i]);
if(isdigit(date[i]) == 0) {
printf("数値を入力してください。\n");
date[i] = 0;
goto scan;
}
}
printf("前から6個目のデータ:%d", date[5]);
return 0;
}
233:デフォルトの名無しさん
07/12/27 08:13:57
scanf("%d", &date[i]);
既にここで入力を数値として変換してしてるので scanfの戻り値を調べるといいよ。
isdigitは文字が('0'~'9')かどうか判定する関数。
それとこの状況でわざわざコードを読みにくくするgotoを使用する意味はない。
whileとbreakで代用したほうがいい。
234:232
07/12/27 08:27:31
>>233
ああ、そっか。%dだから受け取った時にすでに数値になってるんだ。なるほど。
じゃあこの場合文字を入れさせないようにするにはどういう風にしたら良いのでしょうか?
>whileとbreakで代用したほうがいい。
たしかにその通りです。気をつけます。
235:デフォルトの名無しさん
07/12/27 08:27:50
>>232
> main() {
> int i;
> int date[10];
>
> for(i=0 ; i<10 ; i++) {
> scan:
> printf("%d個目のデータ:", i+1);
> fflush(stdin);
入力ストリーム(stdin)のフラッシュは未定義
したこと無いけどたぶんフラッシュされない。
> scanf("%d", &date[i]);
> if(isdigit(date[i]) == 0) {
isdigitの引数は文字。'1'は文字。1は数値。ってな感じ。
> printf("数値を入力してください。\n");
> date[i] = 0;
> goto scan;
> }
> }
> printf("前から6個目のデータ:%d", date[5]);
> return 0;
> }
>
236:デフォルトの名無しさん
07/12/27 08:28:52
>>232
まず、直接関係ないが、
goto scan;
↑これは止めれ。こういうときはwhile文を使うのがセオリーだ。
isdigit()は「文字が数字かどうか」を判定する関数だよ。
scanf()で変換すると「数値」(int型)になるので、
scanf("%d", &date[i]);
if(isdigit(date[i]) == 0) {
これだとisdigit()は常に0を返すはず。
それに、scanf("%d", &date[i]); の場合、数字の入力を期待しているので、
それ以外の文字は入力されてもdate[i]に入らない。
237:デフォルトの名無しさん
07/12/27 08:38:22
>>210
main()
これでCマガジンに連載できるなんて…。・゚・(ノД`)・゚・。
休刊もやんぬるかな。
238:デフォルトの名無しさん
07/12/27 09:29:02
>>237
省略した場合はintって決まりなかった?
だから一応正しいんじゃない?
239:デフォルトの名無しさん
07/12/27 09:31:09
>>234
scanfの戻り値を利用する
scanfはスキャンに成功した数を返すから、
今回のケースで文字を入力されたら0が返る
240:デフォルトの名無しさん
07/12/27 09:35:56
>>232
>scanf("%d", &date[i]);
241:デフォルトの名無しさん
07/12/27 09:43:47
途中でエンター押しちゃったw
>>232
>scanf("%d", &date[i]);
こういう取り方は文字/数字チェックそのものに意味が無いのでやめ
普通はバッファの文字列変数を用意させて、そこに入力させる。
それをisdigit()に通してクリアしたら、その時点でdate[i]に代入するようにすればいい。
242:デフォルトの名無しさん
07/12/27 11:13:33
たぁすけてぇぇぇ!
結果がへんになる!!!
#include<stdio.h>
int main (void)
{
int a,c;
float b,d;
b=1,d=1;
scanf("%d",c);
for(a=1;a<=1000;a++){
b=b+d;
if(b*b==c){
break;
}
if(b*b<=c)
d=d*0.1;
}
printf(" %d の平方根は= %f ",c,b);
return 0;
}
243:デフォルトの名無しさん
07/12/27 11:21:53
>scanf("%d",c);
244:デフォルトの名無しさん
07/12/27 11:27:04
真に申し訳ございません。どうゆうこと?
245:デフォルトの名無しさん
07/12/27 11:30:23
あああああああああああああああ
すいませんすいませんすいません!
もうしませんもうしませんもうしません!
246:デフォルトの名無しさん
07/12/27 14:22:54
辞書検索の2分探索を下みたいに書いたんですけど、
????のところ(該当しなかった場合)が思いつきません。
助けてくださいです…
char a[20];
char b[20];
int hi,lo,i;
略
hi=i;
i=i/2;
lo=0;
while(1){
if(strcmp(b,a) < 0){
hi=i;
i=i-(hi-lo)/2;
}else if(strcmp(b,a) > 0){
lo=i;
i=i+(hi-lo)/2;
}else if(strcmp(b,a) == 0){
printf("あった");
break;
}else if( ???? ){
printf("そんなものなかった");
break;
}
}
247:デフォルトの名無しさん
07/12/27 14:30:21
>>246
そこは if (lo > hi) を入れたいんだと思うが、
突っ込みどころが多すぎるからもうちょっと練り直して来い。
248:デフォルトの名無しさん
07/12/27 14:34:43
せっかくなので1つ突っ込んでくだしあ
249:デフォルトの名無しさん
07/12/27 14:45:05
if文の比較で最初の3通りのどれかに必ず含まれるから最後のelseは
絶対通過しない、まあelse外せばいいけど。
で、1ループでstrcmpは1回呼べばいいべ。
あと文字列が終わったのをチェックしないとね。
略の部分を略さないでテスト用に値設定したやつさらしてみてね。
250:246と248
07/12/27 14:55:46
あ、ほんとだ。
ちょとまってください。
251:デフォルトの名無しさん
07/12/27 15:10:06
#include <stdio.h>
int main(){
int i,j;
for(i=1;i<=9;++i)
printf("%2d ",i);
printf("\n--------------------------\n");
for(i=1;i<=9;++i){
for(j=1;j<=9;++j)
printf("%2d ",i*j);
printf("\n");
}
return 0;
for文の練習で書いた上の九九を表示するプログラムをwhile文だけで書けないかなぁと思って
252:デフォルトの名無しさん
07/12/27 15:10:38
>>251の続き
#include <stdio.h>
int main(){
int i=1;
while(i<=9){
printf("%2d ",i);
i++;
}
printf("\n--------------------------\n");
i=1;
int j=1;
while(i<=9){
while(j<=9){
printf("%2d ",i*j);
j++;
}
printf("\n");
i++;
}
return 0;
}
このように書いてみたのですが1の段以降改行だけでプログラムが終了してしまいます
どうやったら上手く動かせるでしょうか
253:デフォルトの名無しさん
07/12/27 15:13:52
>>252
jの値がどういう風に変化するか追ってみよう。
254:デフォルトの名無しさん
07/12/27 15:13:58
>>252
while (j<=9) のループ抜けたらj を1に戻さないと。
255:デフォルトの名無しさん
07/12/27 15:20:50
あーjが9のままだから次以降のループはスキップされちゃうのか
ヒントありがとうございました
256:246他
07/12/27 15:54:11
せっかくレスくれたのに放置ですみません。
またあとで伺いにきます。
かしこ
257:デフォルトの名無しさん
07/12/27 16:38:48
大学が決まって4月がで暇なのでC言語を勉強しようと思っているのですが
苦しんで覚えるC言語
URLリンク(homepage3.nifty.com)
というサイトを見つけたのですがこのサイトはどうでしょうか?
初心者にいいサイトや本を教えてください
258:デフォルトの名無しさん
07/12/27 16:56:00
それでいいよ
259:デフォルトの名無しさん
07/12/27 17:31:45
>>257
おk
260:デフォルトの名無しさん
07/12/27 17:37:17
いいのかよw
261:デフォルトの名無しさん
07/12/27 18:13:44
>>257
そのサイトはダメ出しされているよ。
262:デフォルトの名無しさん
07/12/27 18:33:23
ダメ出しすれば著者を超えた気分になれるよね
263:デフォルトの名無しさん
07/12/27 18:40:27
あんたは小石を跨いでも小石を超えた気分になれるのか?
264:デフォルトの名無しさん
07/12/27 18:54:03
aho
265:デフォルトの名無しさん
07/12/27 18:57:48
>>257
そのサイトで勉強すると、>19や>205みたいなことを書くようなお馬鹿になっちゃうよ。
266:デフォルトの名無しさん
07/12/27 19:03:50
>>257
参考になるけど、やっぱり本がいいよ。
独習Cとか、やさしいCね。
267:デフォルトの名無しさん
07/12/27 19:04:05
どうなろうと後で矯正するからいいよ。
268:デフォルトの名無しさん
07/12/27 19:05:44
まあ初心者はどのサイトから始めてもいいと思うけど、
そこに留まらずいくつかのサイトを回った方がいいよ
そして宿題スレで宿題を解く
ついでに簡単なデータ構造、アルゴリズムも学ぶ
こんな感じで基礎はおk
269:デフォルトの名無しさん
07/12/27 19:09:25
他のサイトを見るたびに、こんなやり方があったのか!
ってなって悲しくなるぞ。
270:デフォルトの名無しさん
07/12/27 19:37:32
他のサイトを見るたびに、こんなやり方があったのか!
ってなって嬉しくなるぞ.
271:デフォルトの名無しさん
07/12/27 19:50:21
特定のサイトにいついたことはないなあ
適当に検索して、
その日見つけたサイトをぱらぱらと読む
サイト規模にもよるけど1日ありゃ十二分に読み終われるとこばっかだし
272:デフォルトの名無しさん
07/12/27 20:08:52
おれのお勧め、更新は止まってるけど・・・
URLリンク(mikata.curiocube.com)
273:デフォルトの名無しさん
07/12/27 20:10:38
WisdumSoftでC言語の基礎文法を覚えて
(例文の内容にアニメ好きがかもしだされているが)
Programing Placeでデータ構造とかその他の
知識を学ぶ。
で理解できない所(ポインタとかかな)を重点的に
載せてる本でさらに学ぶ。
あとは、経験値をつけていくだけだ。
274:273
07/12/27 20:11:47
間違えたWisdomSoftだ
275:デフォルトの名無しさん
07/12/27 21:02:21
変数宣言と代入ってつなげられるんですか?
276:デフォルトの名無しさん
07/12/27 21:05:44
>>275
いいえ、それは初期化です
277:デフォルトの名無しさん
07/12/27 21:10:49
苦しんでわけわかめ
違うサイトで勉強するわ
お勧め教えてくだしあ
278:デフォルトの名無しさん
07/12/27 21:17:21
猫でも解るって、ぶっちゃけどう?
携帯からサーセソw
279:デフォルトの名無しさん
07/12/27 21:21:20
>>275
int i;
i = 0;
を指してるなら可能だし
int i=0;
なら>>276の言うとおり「初期化」という。
280:デフォルトの名無しさん
07/12/27 21:33:14
初期化と代入はどう違うんですか?
281:デフォルトの名無しさん
07/12/27 21:36:05
初期値を指定するのが初期化。
初期化と代入ではできることが違う場合がある。
配列は一気に全要素を初期化できるけど、
一気に全要素に代入することはできず、
1要素ずつしか代入できない、とか。
282:デフォルトの名無しさん
07/12/27 21:36:06
const int x;
x = 1; //Error
//代入できNEeeee!!!
const int x = 1; //OK
//Yeah! 初期化最高!!
283:デフォルトの名無しさん
07/12/27 21:36:51
>>280
ぜんぜん違う。初期化される前の値が何であるかは神のみぞ知る。
284:デフォルトの名無しさん
07/12/27 21:39:47
以下の二つのコードで、
仮に最適化されないとするなら、
生成される機械語コードは同じですか?
それとも違う?
(1)
int array[2] = {1,2};
(2)
int array[2];
array[0] = 1;
array[1] = 2;
285:デフォルトの名無しさん
07/12/27 21:40:47
コンパイラ次第
286:284
07/12/27 21:41:47
すいません、ちょっと質問が悪いかも
初期化と代入は内部的に全く異なる処理をやっているんですか?
それともただ確保後に代入してるだけですか?内部的に。
287:デフォルトの名無しさん
07/12/27 21:43:53
コンパイラ次第
288:デフォルトの名無しさん
07/12/27 21:44:59
手元の環境で機械語コード生成してみればいいじゃん
289:デフォルトの名無しさん
07/12/27 21:48:46
rep movsd 使って初期化してるかもしれないし、
mov で初期化してるかもしれないし。
そのあたりはコンパイラ次第としか言いようが無い。
290:デフォルトの名無しさん
07/12/27 22:22:17
>>284
多分,全然違うコードになってる。
291:デフォルトの名無しさん
07/12/27 22:42:54
>>284
>仮に最適化されないとするなら、
これが殆ど意味がないのでなんとも言えない。
292:デフォルトの名無しさん
07/12/27 23:45:59
ってかマシン語レベルでの差なんて最適化どうこう言う前にコードが変われば変わる可能性はある。
空行(セミコロンのみの行)に対してNOPを吐くか消されるかだってコンパイラしだい。
予想でいいのならいくらでも応えられるけどな。
>>284のコードなら最適化関係なく同じコードが吐かれるかもね。
293:デフォルトの名無しさん
07/12/27 23:55:28
そんな事、気にしてたら禿げるぞ
294:デフォルトの名無しさん
07/12/27 23:58:41
これ以上禿げたら腋毛が無くなる
びっくりするほどなくなる
295:デフォルトの名無しさん
07/12/28 00:17:48
機械語レベルを気にする必要があるくらい禿てたら手段くらい知ってるだろ
296:デフォルトの名無しさん
07/12/28 01:40:46
代入と初期化の違いは配列やれば判るよ
配列の初期化はOKだけど配列全体の代入はNG
なんでえ~?ってのはポインタやると判る
297:デフォルトの名無しさん
07/12/28 02:13:30
Java厨です。
プロトタイプ宣言ってなんですか?
C言語ってなんで関数を使う前に宣言しとく必要があるんですか?
昔ながらの慣習みたいなものですか?
宣言無くてもコンパイル通るなら、
コンパイラの手抜きと違うんですか?
関数宣言がないときと宣言も定義もないときと
ちゃんとコンパイラは違うエラー出しますよね?
298:デフォルトの名無しさん
07/12/28 02:26:15
適度に手抜きしてくれないとコンパイルに時間がかかってしょうがないじゃないか
299:デフォルトの名無しさん
07/12/28 02:41:53
分割コンパイルしないなら無くても良いんじゃない?
300:デフォルトの名無しさん
07/12/28 02:49:42
C始めて3日くらいです
fopenとfcloseの使い方がようやく分かって、ポインタについては良くわかりません(変数の代わりなのかな?くらい
そこであるテキストファイルを開いて、その中にある文字列(英数字)からある文字列(setofなど)を探したいです
最終的にはある文字列が見つかる→その後ろ~~バイト(もしくは~~行)をコピーして、別のファイルにペースト というところまでやりたいのですが
検索しようとしている時点で詰まっています。ソースコードは以下です
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define BUFFER_SIZE 200
main(){
char buffer[BUFFER_SIZE],name[BUFFER_SIZE];
FILE *fp;
printf_s("test.txtを開こうとしました\n\n\n\n");
fp = fopen("test.txt", "r");
printf_s("検索文字列を代入してください\n");
scanf_s("%s",&name);
printf_s("%sを検索しています\n",name);
if ( !fp ){
printf("ファイルオープンエラー\n");
return 0;
}
while( fgets(buffer, BUFFER_SIZE, fp) ){
if(!strcmp(name,buffer)){
printf_s("%sが見つかりました!\n",name);
break;
}
}
fclose(fp);
}
301:デフォルトの名無しさん
07/12/28 02:54:03
以上のソースに対して、テキストファイルを用意します
『aaxaa ←改行
bbxb ←改行
cxc【EOF】』
すると、cxcを入力しても反応してくれず、strcmpのところでcxc\nに変更すると、ifの見つかりました文が出ます
コレに対する問題点としては
1.改行まできっちり一致しなければ見つからないことになる
2.bbxbで完全一致であるが、bxbでも部分一致で見つかったことにしたい
しかし、今では1行読み込みのために不可能(BUFFER_SIZEを実数にしても無理)
というところです
~~の関数使ったほうがいいよ、とか、こういうルーチンで考えるとできるよ、っていうのがあればお願いします
わかりにくい質問で申し訳ありませんが、宜しくお願いします
302:デフォルトの名無しさん
07/12/28 02:55:05
>>300-301
strstr()
303:デフォルトの名無しさん
07/12/28 03:02:33
>>302
ありがとうございます。今色々なページを見てきたのですが…
返り値としてポインタとして返すんですね。ポインタと見た瞬間に顔が引きつったのですが…
void TestStrStr(void)
{
char *s1 = "abcdef";
char *s2 = "de";
char *cp;
cp = StrStr(s1, s2);
printf("'%s'の中に現れる'%s'という文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1);
}
このようなソースを見つけました。printfの一番後ろにあるcp-s1+1はおそらく何文字目にあるか指定してくれてるようなのですが
ポインタ同士を引き算しているこのような場合、実数として計算をしているのでしょうか?
304:デフォルトの名無しさん
07/12/28 03:13:28
>>303
メモリアドレスを計算している。s1が100番地に格納されているとすると、メモリ上は
100 101 102 103 104 105 106 (メモリアドレス)
a b c d e f \0
のようなイメージ。
strstr()は、見つかった部分のポインタを返すから、"de"を見つけたならアドレス103を返し、それをcpに代入している。
printf()の最後の引数はcp - s1 + 1、つまり103 - 100 + 1で4を返す。
305:デフォルトの名無しさん
07/12/28 03:23:02
>>304
なるほど。だからポインタは便利だって言われてるんですね…メモリ上の一番基礎になる数字を返すから…
ありがとうございます
もうちょっとポインタのこと勉強してからやってみます。とりあえず今日は寝ます
ありがとうございました
306:デフォルトの名無しさん
07/12/28 03:26:31
>>305
すまん、ちゃんと質問読んでなかったw
ポインタは「アドレスという数字」を格納する変数。
アドレスと聞くと拒否反応が出るかもしれないが、メモリ上の位置を表す何の変哲も無いただの数字。
ただし、四則演算のうち可能なのは加算減算だけで乗除は出来ない。やっても意味のある数字が得られないから。
正しくはインクリメント、デクリメントだけど、これについての詳細はググってくれ。
307:デフォルトの名無しさん
07/12/28 04:18:50
ポインタやる時はメモリマップ作って見ると良いよ
スタック、データ、コードのそれぞれのセグメントがどんな配置か判っているとポインタの理解が早くなる
308:デフォルトの名無しさん
07/12/28 07:55:49
>>306
ちょっとだけ語弊がありそうなので補足。
・ポインタ+整数 → n 要素だけすすめたポインタを算出
・ポインタ-整数 → n 要素前のポインタを算出
これは可能。ただし配列とか malloc で用意してある範囲を逸脱しないように注意。
・ポインタ-ポインタ → 2つの要素の差を整数で算出
なんだけど、この場合2つのポインタは同じ範囲を指すもの
(304みたいに同じ文字列内の違う位置を指すように)
でないといけないから注意。
309:デフォルトの名無しさん
07/12/28 08:31:18
アドレスは「符号なし整数には似ているけど、全く違う種類のデータ」だと考えた方がいい。
整数なら四則演算が定義できるが、アドレスの場合は>>308の言う通り。
そしてインクレメント/デクレメントなんかは「アドレスと整数の混合演算」だと思えばいい。
C言語ではデータの種類によって専用の型を用意するから、整数はintやlong、アドレスは
ポインタを使うと思っておけばいい。
310:Google先生
07/12/28 10:17:12
インクレメント に一致する日本語のページ 約 1,940 件中 1 - 10 件目 (0.20 秒)
もしかして: インクリメント
311:デフォルトの名無しさん
07/12/28 11:01:26
インクリメント デクリメント の検索結果 約 20,700 件中 1 - 10 件目 (0.05 秒)
URLリンク(www.google.co.jp)
インクレメント デクレメント の検索結果 約 544 件中 1 - 10 件目 (0.34 秒)
URLリンク(www.google.co.jp)
検索結果を見ると、インクレメント/デクレメントと読む人もいるようだ。
312:デフォルトの名無しさん
07/12/28 12:52:57
まったく…
K&Rに何と書いてあるか読んでから出直して来い。
313:デフォルトの名無しさん
07/12/28 14:10:56
英語で書いてあるな
314:デフォルトの名無しさん
07/12/28 20:14:54
英語のカタカナ表記を議論することほど無意味なものはない。
ただ、そのあたりを議論したくてしょうがない馬鹿よけ対策として、
市民権のある表現を使うに越したことはない。
315:デフォルトの名無しさん
07/12/28 20:26:25
D→デー
T→テー
と発音するベテラン技術者に食って掛かる新米社員を思い出したw
316:デフォルトの名無しさん
07/12/28 22:39:56
>>299
相互再帰する必要がある時はないと困る。
317:デフォルトの名無しさん
07/12/28 22:42:44
>C言語(シー言語)は、1972年にAT&Tベル研究所のデニス・リッチー (Dennis M. Ritchie) が主体となって作ったプログラミング言語である。
1972当時のマシンでJava並みのコンパイラやアプリなんて起動すらしねぇw
318:デフォルトの名無しさん
07/12/28 22:48:55
おまえは何を
319:デフォルトの名無しさん
07/12/29 16:41:33
テキストエディタ(メモ帳)で、ソースファイルを作ったのですが、
どこのファイルに保存すればいいのか、全く分かりません
どなたか宜しくお願いします
320:デフォルトの名無しさん
07/12/29 16:43:14
自分で決めた場所に自分でフォルダ作って保存しとけ
321:デフォルトの名無しさん
07/12/29 16:44:42
.|
.|
∩___∩ |
| ノ\ ,_ ヽ .|
/ ●゛ ● | .J
| ∪ ( _●_) ミ
彡、 |∪| |
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
\ " / | |
\ / ̄ ̄ ̄ /
 ̄ ̄ ̄ ̄
322:デフォルトの名無しさん
07/12/29 16:44:53
マイドキュメントとかに置くとスペースがどーたらではまるから
c:\homeとかc:\srcとかってディレクトリを作ってそこに置け。
コマンドプロンプトを起動したら
cd /d c:\home
と打ってそこに移動してコンパイルしろ。
323:デフォルトの名無しさん
07/12/29 16:58:31
なんか、自分の手違いがあるらしく、「:や¥は、ファイル名には使えません」
と出てしまいます・・・
どういうことなのでしょうか・・
324:デフォルトの名無しさん
07/12/29 17:00:48
プログラム以前の問題。
Windows のことをもうちょっと勉強しる。
325:デフォルトの名無しさん
07/12/29 17:01:43
:や¥はファイル名に使えるがなんて冗談は置いといて
>>322のはディレクトリ(フォルダ)名
326:デフォルトの名無しさん
07/12/29 17:08:10
Windowsキー+Rでcmdを起動
以下を入力
mkdir c:\home
cd /d c:\home
explorer /n,/e,c:\home
notepad hello.c
gcc hello.c && a.exe
327:デフォルトの名無しさん
07/12/29 17:11:14
beginthreadexに複数の値を渡すコードがわからないのですが、
教えて下さい。
328:デフォルトの名無しさん
07/12/29 17:12:12
>>327
URLリンク(msdn.microsoft.com)
329:デフォルトの名無しさん
07/12/29 17:41:23
何日くらいでマスターできますか?
330:デフォルトの名無しさん
07/12/29 17:44:59
>>329
何を?C?
あんたの今のCの習熟度、他言語について、PCに関する一般知識がどの程度のものか
331:デフォルトの名無しさん
07/12/29 17:48:06
>>330
Cですね
今日はじめた。他言語まったくしらない。PC知識まぁまぁ。
332:デフォルトの名無しさん
07/12/29 17:49:42
1000日くらいがんばれ
333:デフォルトの名無しさん
07/12/29 17:50:13
どの程度を「マスター」と言うのか分からんが、
一通りどんな感じなのか知るのに2ヶ月、
それなりに使えだすのに半年、
十分使えるまでには1~2年くらいじゃね。
334:デフォルトの名無しさん
07/12/29 17:52:24
がんばるよ
335:デフォルトの名無しさん
07/12/29 17:59:35
C言語の「マスター」と言うと、
・ANSI前(K&R?)の仕様とC89、C99の規格に精通している
・代表的なコンパイラのオプションと処理系定義の仕様が概ね分かる
・上記コンパイラの最適化の仕様がある程度分かる(要アセンブラ?)
代表的なコンパイラ:gcc、VC、BCCぐらい?組込みだとその他もか
辺りだと思うんだがどーか。
336:デフォルトの名無しさん
07/12/29 18:00:37
Linuxカーネルをビルドできたらスーパーハカーです
337:デフォルトの名無しさん
07/12/29 18:04:53
>>335
実務的な知識がなさすぎるだろう
338:デフォルトの名無しさん
07/12/29 18:05:49
コンパイラマスターだな
339:デフォルトの名無しさん
07/12/29 18:17:55
とりあえず正月つぎ込んで入門書読破すりゃマスターしたってことでいいよ。
340:デフォルトの名無しさん
07/12/29 18:25:23
>>335
・Cコンパイラ書いた事がある。
341:323
07/12/29 18:55:56
なんとか意味を理解したつもりで、プログラムの実行段階まで来たのですが
#include <stodio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
のようなソースファイルを実行したらエラーがでました・・・
どこがまずいのでしょうか
342:デフォルトの名無しさん
07/12/29 18:58:03
stodio.h
エラーメッセージ嫁
343:デフォルトの名無しさん
07/12/29 19:01:51
stodio.h
344:323
07/12/29 19:03:08
>>342
どうもすみません
なんとか成功しました! やはり実践しなければ分かりませんね
345:デフォルトの名無しさん
07/12/29 19:26:08
このすっとこどっこいアイオー
346:デフォルトの名無しさん
07/12/29 19:30:49
>>341
ごめん、僕も極最近始めたものだけど、stodioには吹いたw
一緒に頑張ろう!
347:デフォルトの名無しさん
07/12/29 19:37:51
studio とかはたまに見かけるな。
348:デフォルトの名無しさん
07/12/29 19:56:49
stdioも見るな
349:デフォルトの名無しさん
07/12/29 20:04:24
cstdioも見る。
350:デフォルトの名無しさん
07/12/29 20:58:54
>>345
お茶吹いたw
351:デフォルトの名無しさん
07/12/29 22:25:47
みんなどのくらいの年齢でC言語始めるんだろうか
もしかして今の商業高校とかでは教えられているのか?
352:デフォルトの名無しさん
07/12/29 22:40:37
>>351
商業の基本は情報処理だが、
俺のとこじゃ国家試験の勉強が中心
だが、商業でVBをやるところもあったし、JAVAをやるところもある。
353:デフォルトの名無しさん
07/12/29 23:19:04
URLリンク(oshiete1.goo.ne.jp)
この中の
lpPARAM lpParam = (lpPARAM)lpx;
はどのような意味を持っているのですか?
354:デフォルトの名無しさん
07/12/29 23:26:40
>>353
元の関数仕様が void* だから
渡す側が lpPARAM をvoid*にいれて
とりだす側がキャストで戻してる
355:デフォルトの名無しさん
07/12/30 00:05:56
C言語ってポインタとか使うメリットあんの?って感じだけど
難しいから使わなくても大丈夫かな?
356:デフォルトの名無しさん
07/12/30 00:08:16
>>355
その内必要になる時がくる
357:デフォルトの名無しさん
07/12/30 00:15:13
>>355
ポインタのメリットをすぐに理解する必要はないが,必要になったときにすぐに(少し調べて)使える程度に覚えとけ
358:デフォルトの名無しさん
07/12/30 00:17:59
ok
いま独習Cでポインタやってるんだが、まぁある程度理解してるんだが
少し、上に行くと難しいんだよな。
char *bokki ="ちんこが立つ";
printf(bokki);
って場所やってるぜ、こういうのってプロでも使うのか?
359:デフォルトの名無しさん
07/12/30 00:19:36
>>255
使うメリットが無い内は使わなくていいと思うよ
便利だから使うのであって、かつC言語をやっていればそのうち「これはポインタを使った方が楽だ」って状況が出てくる
その時に使えばいいだけの話
まあC++ならまだしも、C言語だと関数との配列の受け渡しとかで
すぐにポインタが必要な状況になるよ
360:デフォルトの名無しさん
07/12/30 00:20:34
>>355
同じアドレスを共有したいときがあるのさ
夫婦だって別々のベッドじゃいやだろ?
361:デフォルトの名無しさん
07/12/30 00:22:17
>>358
まぁリテラル文字列はstaticでconstで領域もconstしちゃうけど
362:デフォルトの名無しさん
07/12/30 00:22:19
Cは難しいなポインタが
もしかして359と360はバリバリ使えるんすか?
363:デフォルトの名無しさん
07/12/30 00:23:39
>>358
const char * str = "俺童貞";
printf("%s", str);
まあdefineの代わりにconstポインタを使うことはあるかもね
defineの代わりとしては
const char* const str = "ヤリてー";
の方がいいかね
364:デフォルトの名無しさん
07/12/30 00:25:40
すごいっすねみなさん
この頭の良さを駆使して、みなさんが作ったプログラムはどんなのありますか?
実用的で使えそうなやつっすよタブを消したり入力した文字をソートしてなんたらしたり
365:デフォルトの名無しさん
07/12/30 00:26:20
>>358
表示したい文字列に%があると見落とすかもよw
366:デフォルトの名無しさん
07/12/30 00:28:41
宇宙に浮かんでるアレの制御プログラム、を作るための支援ツールとか監視システムとか
367:デフォルトの名無しさん
07/12/30 00:29:31
ちなみに私が作ったのは
1,暗号化 2,解読 3,Quit
というやつでシーザー暗号に似た奴ですね。
まだまだへたれですよ
368:デフォルトの名無しさん
07/12/30 00:29:59
文字列のポインタは文字列の実装上使わざるを得ないのでメリットが分かりにくいと思う
369:デフォルトの名無しさん
07/12/30 00:30:44
>>366
本気で言ってるんすか?
知人の凄い人でもATMなのに人工衛星とかの制御プログラムとか次元が違いすぎる
370:デフォルトの名無しさん
07/12/30 00:32:40
最近、どっかの団体のコーディングルールとか見ると、ポインタの演算禁止とか、
ポインタのポインタらしい使いかたはしないって流れになってきてるな。
じゃPascalでも使ってればいいのにって気がするけど。
371:デフォルトの名無しさん
07/12/30 00:32:54
ポインタがどうでも良くなってきたんで。
早くファイル操作などの場所をやりたいんですが、ページを飛ばすと複雑な気持ちになるので
ポインタのページと関数のページを仕方なくやりますか
372:デフォルトの名無しさん
07/12/30 00:33:22
>>369
よく嫁
支援ツールだ
つまりだたの社内ツール
373:デフォルトの名無しさん
07/12/30 00:34:43
実用的なのは作ったこと無いな、所詮娯楽用品止まり。
374:デフォルトの名無しさん
07/12/30 00:35:23
私の書いたコードなら、世に出回っているフラッシュメモリのシェアの多くを生み出す装置の検査に使われているぜw
375:デフォルトの名無しさん
07/12/30 00:35:35
まぁ日曜プログラマならそれでいいんじゃね?
自分の腕を仕事に活かしたいと思ったら、それはそれで地獄をみることになるし
376:デフォルトの名無しさん
07/12/30 00:35:54
>>372
でもすごいっすよ
C言語を始める時期が悪かったですかね
ガキの頃に手をつけとけば良かったと後悔しますよ
Cをマスターしたら次はperlかjavaやろうかと思ってるんすよ
377:374
07/12/30 00:36:39
もっと身近なところでは、某駅ビルの駐車券発行機に使われているとか(ぉぃ
378:デフォルトの名無しさん
07/12/30 00:40:35
去年一年くらいCの仕事をやって、医療関係のシステムだったけど、ありえないくらいコードの質が
低かったから、そのシステムを導入してる病院には行かないことにしてる。怖い。
379:デフォルトの名無しさん
07/12/30 00:40:58
>>376
始めるのに早いも遅いもない
逆にガキのころはガキのころにすべき勉強なり体験なりをしなくちゃいけない
Cなんてただの道具にすぎんのですよ、偉い人にはそれがわからんのです
380:デフォルトの名無しさん
07/12/30 00:41:44
>>374
まじすか?
凄過ぎますよ、是非そういう人に基礎から教えてもらいたいんですが
まぁ無理なんでしょう、自力でやらないと意味がないし
そういうコードを書くにはCを学んでいたときに1日どのくらい書いてましたか?
あとは1日3個適当にプログラムを作るとかそういう目標とかってありましたか?
>>2373
私もそんな感じっすよ
暗号化できたーやーいって(自己満)すよね
>>375
プログラマーになったら大変そうすよね
それで食ってくのは難しいすよね
381:デフォルトの名無しさん
07/12/30 00:44:56
プログラミングの仕事は中国やらインド勢力に取られていくし、
自動生成の流れが盛んになってきているから、
プログラミングの仕事はどんどん減っていくだろうね
現に、カードにパンチしていた時代はコーディングが開発工程の8割を占めていたのに、今では2割程度
382:374
07/12/30 00:46:50
そう言えば某社のFAXに……あれはアセンブラだったな。
某社の検査装置に使われているのは……basicか。
てな具合にいろんな時期にいろんなことをやっていたから「Cを学んでいた(だけの)とき」なんてないよ。
383:デフォルトの名無しさん
07/12/30 00:47:00
娯楽用品って言っても仕事なんだけどな (´・ω・`)
384:デフォルトの名無しさん
07/12/30 00:48:11
>>381
今の日本は開発よりかも指示とかプロジェクトの提案とかそんな感じすかね?
たしかにインドとか中国はすごいっすよね。
ロシアは凄いらしいですがどうなんでしょう。
生まれる場所を間違えたな・・・
385:374
07/12/30 00:48:52
>>381
あー確かに、カードパンチの時代は「完全なる机上コーディング」をしたものを「パンチするだけ」だったな。
# 流石に学校で体験しただけだが
386:デフォルトの名無しさん
07/12/30 00:50:47
NHKのワーキングプアの番組でやってたな。
アメリカで銀行のシステムをやって年収1000万のIT技術者が、インドに仕事とられてファーストフードの店でアルバイト。
387:デフォルトの名無しさん
07/12/30 00:53:08
別にインドや中国が凄いってわけじゃなくて、単価が安いからそっちに簡単な仕事まわしてるだけだよ
難しい仕事は単価の高い日本で集中的にやる
388:デフォルトの名無しさん
07/12/30 00:53:59
やっぱ裕福な国は、それ以上求める物が無くて開発するレベルが低いんですか?
日曜プログラマが良いかな、本職は他ので。
パソコン詳しいねすごいねおっちゃんって言われればそれでいいかな
389:デフォルトの名無しさん
07/12/30 00:57:27
>>387
これからはインド人や中国人の10倍の価値のある技術がないときびしいだろうね。
390:デフォルトの名無しさん
07/12/30 01:01:40
>>388
日本を舐めすぎw
おまい、マスコミに変に影響されてるな
プログラミング力のあるなし以前に、視野の狭さが心配だよ
コーディングっていうのは単純作業なんだよ、単純作業
町工場で働く工員と同じ
指示されたものを淡々と作るだけ
じゃあ、それ以前に何をどう作るか、ってのを考えなきゃいけないよね
それを考えるのが日本の仕事
もちろん、今後すぐにプログラミングの仕事が無くなるわけじゃない
やっぱり言語や文化の壁があって、オフショア開発の管理って難しいくて、
リスクを極力避けるために、
現状は、仕様変更の激しい部分とか、重要な部分ってのは日本でコーディングしてる
391:デフォルトの名無しさん
07/12/30 01:03:10
C/C++でポインタを使わないプログラミングが想像できない
>>380
1日3個も作れるならそいつは天才か、作ったものがゴミ箱行きのカスか
392:デフォルトの名無しさん
07/12/30 01:06:13
とりあえずLinux上の適当なコマンドのソースでも読んでろ
393:デフォルトの名無しさん
07/12/30 01:08:05
UNIXコマンドのソースは俺も読んだなあ。
394:デフォルトの名無しさん
07/12/30 01:10:12
おまいはいいよ
395:デフォルトの名無しさん
07/12/30 01:14:42
ライブラリの○○.aっていうファイルから
収録してある関数名を取り出すことって可能ですかね?
あったら教えてください
396:デフォルトの名無しさん
07/12/30 01:22:21
>>395
nmコマンドでぐぐれ
397:デフォルトの名無しさん
07/12/30 02:32:38
>>391
C++ならiteratorは別とすればポインタつかわないこと多くね?
398:デフォルトの名無しさん
07/12/30 04:17:57
Java厨です。
Include文とかヘッダファイルの自動生成って出来ないもの?