C言語なら俺に聞け(入門篇) Part 23at TECH
C言語なら俺に聞け(入門篇) Part 23 - 暇つぶし2ch39:デフォルトの名無しさん
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文とかヘッダファイルの自動生成って出来ないもの?


399:デフォルトの名無しさん
07/12/30 05:06:09
条件にもよるが不可能では無い
頑張って作ってみれば?

400:デフォルトの名無しさん
07/12/30 07:46:20
>>396
どうもありがとうございました。

401:デフォルトの名無しさん
07/12/30 08:24:40
#define DATA "data"
と、例えば定義してexeを作ったときバイナリエディタでみても"data"を文字列として見つけられません
これはどういう形で格納されていのでしようか?

402:デフォルトの名無しさん
07/12/30 08:26:04
たとえば、
#define SRAM_A (volatile unsigned char *)0x200000
こんなのもポインタを使っているといっていいですか?
SRAM.Hの中身は、こんなのだらけなんですけど。

403:デフォルトの名無しさん
07/12/30 08:33:50
>>401
DATAを作っていなければコンパイラはobjに"data"を出力しない。
当然、出力されるEXEにも存在しない。

404:デフォルトの名無しさん
07/12/30 08:54:40
>>402
それだと「アドレス」と言いたくなるけど、まぁポインタだね。

405:デフォルトの名無しさん
07/12/30 08:58:09
>>402
組み込みなら普通は #pragma で section 名指定して、
リンカーで配置する。処理系によって違うけど
似たようなコードがあるはず。

絶対アドレスにポインタ使う必要なし。


406:デフォルトの名無しさん
07/12/30 13:24:24
趣味でGBAやったときも402みたいなことばかりやったな。

407:デフォルトの名無しさん
07/12/30 14:42:25
こんなマクロ定義してたな俺。
#define Acc08(Adr) (*(volatile unsigned char *)Adr)
#define Acc16(Adr) (*(volatile unsigned short *)Adr)
#define Acc32(Adr) (*(volatile unsigned int *)Adr)

408:デフォルトの名無しさん
07/12/30 14:50:02
DOS 時代も VRAM 使う時にそういう事してたな。

409:デフォルトの名無しさん
07/12/30 17:04:38
>>401
そもそも使ってなければプリプロセッサはコンパイラに"data"を出力しない

410:デフォルトの名無しさん
07/12/30 21:17:27
void *myMalloc(int size)
{
void *p;
p = malloc(sizeof(double) * size);
if (p == NULL) ...エラー処理;
return p;
}
と言うような関数を作ったのですが、

これに、double **a の奴と、 double *b に
a = (double **)myMalloc(size);
b = (double *)myMalloc(size);
と、つなぎ合わせる事をするのですが、
特にこれで問題は起こらないものでしょうか?

411:デフォルトの名無しさん
07/12/30 21:32:56
>>410
何かメモリがもったいないな

412:デフォルトの名無しさん
07/12/30 21:48:21
a = (double **)myMalloc(size);
のあとは、for文回して
a[i] = (double *)myMalloc(size);
と言うふうに、2次元配列を作る予定なんですが・・・

413:デフォルトの名無しさん
07/12/30 21:51:23
すみません、質問させてください。
テキストファイルを作ると同時にそのファイルから文字を読み込んで出力する・・というのをやりたいのですが、なぜか開こうとしてもすぐ画面が消えます。なにがいけないんでしょうか?
別に読み込むだけでもいいのでアドバイスお願いします。コンパイラは「Bloodshed Deb-C++」です。

414:デフォルトの名無しさん
07/12/30 21:52:39
改行が多すぎると言われたのでいくつかに分けて書きます。
#include <stdio.h>
#include <stdlib.h>
void kaku(int,int*,char*);
int main(int argc, char *argv[])
{
int ten=0;
char kekka[]="NG";
kaku(1,NULL,NULL);
kaku(2,&ten,kekka);
kaku(3,NULL,NULL);


415:デフォルトの名無しさん
07/12/30 21:53:27

FILE *fp;
char data[256];
fp=fopen("test,txt","r");
fscanf(fp,"%s",data);
fclose(fp);
printf("%s\n",data);
system("PAUSE");
return 0;
}

void kaku(int fg,int *ten,char *kekka)
{
static FILE*f;
switch(fg){
case 1:
f=fopen("test.txt","w");
break;
case 2:
fprintf(f,"%d点,",*ten);
fprintf(f,"%s\n",kekka);
break;
case 3:
fclose(f);
break;
}
}
です。長々とすみません

416:デフォルトの名無しさん
07/12/30 21:59:38
>>412
pointer to pointerを作るなら
a = (double**)malloc(size*sizeof(double*));
じゃないの?
まあ、メモリは余分に確保されてるからコーディング間違えなければちゃんと動くだろうけど。

>>413
意味が分からない

417:416
07/12/30 22:01:23
ああ、>>413>>414-415か

418:デフォルトの名無しさん
07/12/30 22:06:43
>>416
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(double *));
で確認した所、 double型が8で、double *型が4でした。
ポインタだと値が違うんですね。 始めて知りましたorz

通りで動かなかったのかと・・・ 
ありがとうございました。 頑張ってみます

419:デフォルトの名無しさん
07/12/30 22:16:23
>>413-415
13行目はtest,txtじゃなくてtest.txtだろう。
fopenしたならfpがNULLかどうか必ず確認すべきだ。
system("PAUSE")というのは俺の環境にはなかったから外したら多分期待通り動いた。

420:デフォルトの名無しさん
07/12/30 22:37:38
>>419
できました!ありがとうございます!!

421:デフォルトの名無しさん
07/12/31 01:54:34
>>418
ついでにcharとchar *、shortとshort *とかもsizeofして見比べて見ると良いよ
ポインタがちょっと見えて来る

422:デフォルトの名無しさん
07/12/31 01:55:08
テキストファイルからある文字列を検索し、ヒットした文字列の直後にある数値を抜き出すコードを考えています
例えば
X= 630.20 Y= 220.20
Z= 33.25 A= 30.25
のような感じです。このうちプログラム内で定数として用いたいのが630.20や220.20、33.25に30.25です
まず1行目をfgets()でポインタ*fpに読み込んで、"X="をstrstr()で探します
その辺りまでしかぱっと思いつきません
ここから630.20を読み込もうと思うと、どのような方法があるでしょうか
宜しくお願いします

423:デフォルトの名無しさん
07/12/31 01:56:18
scanf

424:デフォルトの名無しさん
07/12/31 02:01:46
>>423
ありがとうございます
ですが、scanfはキーボードから入力したデータを読み込む奴ですよね?
テキストファイルに書いてあるものを読み込みたいのですが…

425:デフォルトの名無しさん
07/12/31 02:15:45
isdigit() 一文字ずつで調べて配列に格納して、atof() とか
トークンがスペースなら、そこまで読み込むようにして、 atof() とか

トークンをもう少し考えなおすのがいいかも、セミコロン、カンマとかにする。
strtokn()とかあった気がするが、それは調べてくれ。

426:デフォルトの名無しさん
07/12/31 02:22:41
>>424
fscanf

427:デフォルトの名無しさん
07/12/31 02:24:37
>>425
変なこと教えるなよ。
atofは数字以外に当たったら解析を終了するから、
> 一文字ずつで調べて
とかは不必要だろ。

428:デフォルトの名無しさん
07/12/31 02:29:10
>>425
ありがとうございます。isdigitでチェックして配列に格納が簡単そうですね
strtokn()もありますけど、元ファイルを変換する(というより、別ファイルを作ってそこに数値同士をカンマ等で区切るようにする?)ので、あまり使いたくないところです
最悪、strtokn()で別ファイルを一時ファイルとして作成してやるという方法がありますが…
ちょっと考えてみます。ありがとうございました

>>426
fscanfにそんな機能があったのですか、もう一回調べてきます
ありがとうございました

429:デフォルトの名無しさん
07/12/31 02:54:39
>>428
scanfはfscanfのラッパー関数みたいなもん。
scanf内でfscanfをstdinに対して処理している。
scanfでもstdinをfreopenすればファイルからの入力にできる。

430:デフォルトの名無しさん
07/12/31 09:13:36
普通strtol(), strtod()

431:デフォルトの名無しさん
07/12/31 09:43:21
#include<stdio.h>
int main ()
{
int a,b,c,i,f,d[50];
scanf("%d %d",&a,b);
switch(a*b){
case 0:
return 0;
defalt:
c=a/b;
printf("%d",c); /*19*/
break;
}
i=1;
while(i<=50){
c=a%b;
d[i]=c/b;
c=c%b;
printf("%d",d[i]);
if(d[i]==0)
f++;
else
f=0;
if(f>=2)
break;
i++;
}
return 0;
}
スミマセン!なんでコレダメなのデスカ?オシエテクダサイ!!!

432:デフォルトの名無しさん
07/12/31 09:45:12
>>431
scanf("%d %d",&a,&b);
反射神経が書いてるので違うかもシレン。

433:デフォルトの名無しさん
07/12/31 10:26:48
>>431

defalt:

↑これがだめだ。
ラベルとして認識しているはず。
default: な。


434:デフォルトの名無しさん
07/12/31 10:28:32
>>431

ちょっとずれるが、

switch(a*b){
case 0:

↑0かどうか判断したいだけなら、if文を使うべきだ。
switchにする必要なし。


435:デフォルトの名無しさん
07/12/31 12:42:18
スミマセンちなみにエラーの内容ハ”Ifに(がナイ”デス。
修正しまシタがダメデス。
書き方ノドンクササとかよりそっち教えてホシイデス。

436:デフォルトの名無しさん
07/12/31 13:03:01
>>431に「エラー」は見当たらないような・・・


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