C言語なら、俺に聞け! <17>

このエントリーをはてなブックマークに追加
61 
strtokは絶対使用しない事と書いてありますが、そんなに危険なんでしょうか。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtok.3.html
62デフォルトの名無しさん:02/04/21 22:07
>46
strtok_r()って関数が用意されてないかえ?
処理系によるけど。
>>61
問題ありません。使ってください。
6446:02/04/21 22:18
処理系はVC
タブ区切りのテキストファイルの数値を変数に。

スレッドセーフでないと言うのは、
マルチスレッドの時に困るだけでしょうか?
>>64
そのとーり。
でも、タブ区切りの数値を抽出するなら、sscanf()でOK。
66 :02/04/21 22:20
strtokは152\t\t\t46\t64というような感じでタブ間に何もないレコードがある時は
まともに動くんでしょうか?うまく動かなかったような気がするのですが。
>>64
VCだったらマルチスレッドライブラリを使用すれば、
strtokもスレッドセーフになる
6846:02/04/21 22:49
どうもレスありがとうございます。

sscanf早速使ってみることにします。
BSD4.4で導入されたstrsepという関数は
1)連続するデリミタもそれぞれデリミタとして扱う
2)リエントラントである
3)最初の呼び出し・2度目以降の呼び出しで呼び出し方を変更する必要が無く
利用者のコードがstrtokよりシンプルになる
点がstrtokよりもマシ。
LinuxやBSD系列のOSで使えるはず。

man: http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strsep.3.html
実装: http://nemesis.sourceforge.net/browse/mod/venimpl/c/str/strsep.c.html

# 勿論通常はシステムで用意されていないので
# 実装を自分で用意する必要が有る
# VC++では_tcspbrkが使えるので、strsepを簡単にマルチバイト対応にできる。
>>66
そうだね。元々、strtok() って、コンパイラなんかの字句解析用だから、
先行するデリミタは全て読み飛ばすよ。そもそも、CSV の読込に、
strtok() なんか使う方が変。
71新規質問:02/04/21 23:11
  char *string;
と宣言して、
  scanf("%s",string);
で、代入しました。
この文字列 string を、ある文字列と比較する場合、
どのように書けばイイでしょうか?
  if (string=="abcdefg"){
    ………
  }
ではだめなようです。
また、比較対象文字列が空白文字列、つまり、
string が空文字列かどうか調べるのはどうすればイイでしょうか?
72デフォルトの名無しさん:02/04/21 23:12
if(strcmp(string,"abcdefg"))

if(string[0]=='\0')
7372:02/04/21 23:13
やべ。
if(strcmp(string,"abcdefg")==0)
だった。
>>71
ネタですよね。ネタといって下さい。お願いします。
strcmp
>>74
ネタでしょ。strcmp知らない奴がmallocを知っているとも思えないし(mallocでも使わないと落ちるから)。
76& ◆cyWCSrs. :02/04/21 23:15
>>74
マジでしたが、>>74を見てからはネタになりました。(w
さっきまで文字列比較関数のない言語やってたもんだから、つい・…

>>72-74
罵倒せずに答えてくれてどうもありがとう。
comp以前に・・・
78デフォルトの名無しさん:02/04/21 23:17
単方向リスト構造のデータを簡単にソート
できる方法ない?実際に並び替えなくても
表示させるだけでもいいんだけど。
>>72-74
おい、その前に...
>   char *string;
> と宣言して、
>   scanf("%s",string);
> で、代入しました。
には、誰も突っ込まんのか ?
80デフォルトの名無しさん:02/04/21 23:19
>>79
char *stringが関数の仮引数だったらOK
>>78
そもそも、ソートするなら何故に単方向リスト使うのよ。
83デフォルトの名無しさん:02/04/21 23:25
>>82
ノリで。
>>81 stack overflowの危険性が
>>78
別に配列作って全部コピーしてからqsort
86デフォルトの名無しさん:02/04/21 23:27
>>85
やっぱりそれしかないか・・・。
サンクス!
8779:02/04/21 23:28
>>80
ごめんよ、かぶっちまったよ。

>>81
ふーん、今時 K&R スタイルかよ。
>>83
そういうときは、インデックスを用意して、そっちをソートする。
あ〜〜〜なんて言ったらいいんだろう。
>>88
ポインタだけ配列にコピーしてqsortってことかな?
90デフォルトの名無しさん:02/04/21 23:31
>>87
K&Rスタイルって何?
var[]ではなく*varと書くということ?

マジ質
正直mallocって理解があやふやだ
9288:02/04/21 23:35
>>89
そそ、そんなかんじ。
で、大小比較する関数で、その配列に入ってるポインタの先にある
もの(構造体?)を比較してあげればいいと思う。
9382:02/04/21 23:35
>>83
ノリかよ !!

>>84
何故に Stack ? 関数に渡されるのは malloc() の返り値かも知れんし、
static char a[1000]; とした a かも知れんよ。
まあ、scanf("%s", ...) なんて使うこと自体がまずいと思うが...。
>91
C言語入門本の中に、例題としてmalloc()の実装やってるのが
あったような気がする、何冊か。
>>90
int main(argc,argv)
int argc;
char *argv[];
{
}
てやつでしょ。
???理解できん
97デフォルトの名無しさん:02/04/21 23:38
>>88
>>89
なんとなく分かりかけてきたYO.
9891:02/04/21 23:38
>>94
俺の持ってる入門書には全然書いてないんだわ。
参るぜ…まったく
9979:02/04/21 23:38
>>90
ちゃう。

ANSIスタイル
void foo(char *string){}

K&Rスタイル
void foo(string)
char *string;
{
}

ANSI だったら、宣言の最後に ';' はつかん。
10095:02/04/21 23:39
ありゃ、違ったっけ?
最近すっかりANSIスタイルで書くようになっちゃったので・・・
間違ってたら訂正キボン。
上の argc,argv が仮引数。
その下の
int argc;
char *argv[];
が引数。

数も順番もあってなくてOKのあやふやな引数の宣言だった。
>>99
そういえばセミコロンがついていたか。見落とした。スマソ
ちなみに俺はそんなスタイルは使っていないよ。
103102:02/04/21 23:41
RubyのソースコードがK&Rスタイルだったような・・・・
だめじゃんまつもと!
>>87
それ以前に、なんで81がK&Rになるんだヨ
そのK&RはANcIでも使えるんでしょ?
確か。
>>105
うん。
107105:02/04/21 23:44
>>106
ども!
>>107
でも使うなよ
通はトリグラフ。これ最強。
C++でも使える。
110105:02/04/21 23:47
>>108
うん。ANCIでやってます。
だってコードが長くなるもん♪
111ヽ(`Д´)ノ:02/04/21 23:48
つまり…??
11279:02/04/21 23:48
>>102
まあ、ちょっとした嫌味だ。気にするな。第一、今時のコンパイラは ANSI
がディフォルトだから、K&R スタイルでやると警告がでるぞ...と、やって
みたら VC++ 6 だと、警告レベル 4 にしてもなんも言わん...。さすが
MS だよ、まったく。まあ、プロトタイプ宣言とかできんから、強いて覚
える必要はないよ。
>>103
ANSI C 対応コンパイラが標準で入ってないマシンでも動かせるように K&R スタイルにしてるらしい。
確かに SunOS4.1 あたりの Sun cc は ANSI-C 未対応だ。
いいかげん ANSI C スタイルに変えるとは言っているが…
トライグラフ?
115デフォルトの名無しさん:02/04/21 23:53
>>113
なるほど。
ということはプロトタイプ宣言もしていないのかな?
116115:02/04/21 23:54
>>112にできないと書いてあるじゃん。すまなかった。
HPのおまけコンパイラもかなりやる気のない対応具合だ。
>>113
普通そう言うときは、ANSI → K&R 変換ツールとか使わんかなぁ...。プロト
タイプ宣言はどうしてんの ? 使ってねぇのか ?
>>112
ANSIで消極的とはいえ認められているのだから、K&Rスタイルも立派なANSI準拠だと思うが。
だから、警告は出ないのは当然だし出すべきではないと思うが。

>>114
トライっていうの?
化学ではトリ〜が慣例だからそう読んでた。
>>115
外部公開する API 以外はしてないね。
12179:02/04/22 00:32
>>119
互換性のためだろ ? 良くないスタイルなんだから、警告ぐらい出しても
いいと思うぞ。VC++ 6 のヘルプには...
-------------------------------
コンパイラの警告 (レベル 4) C4131
'function' : 旧形式の宣言が使われています。
関数宣言がプロトタイプ形式ではありません。
旧形式の関数宣言をプロトタイプ形式に変換してください。
次のコードは、旧形式の宣言です。
int addrec( name, id )
char *name;
int id;
{ }
これを、新形式のプロトタイプ形式に変換すると、次のようになります。
int addrec( char *name, int id )
{ }
-------------------------------
つーのが、あるのにねぇ...。
ちなみに...
-------------------------------
コンパイラの警告 (レベル 4) C4130
'operator' : 文字列定数のアドレスで論理演算が行われました。
リテラル文字列のアドレスに演算子が使われ、不要なコードが生成されま
した。
次にこの警告の例を示します。
char *pc;
pc = "Hello";
if (pc == "Hello")
{ }
上の if ステートメントは、ポインタ pc に格納された値と、コード内に
現れるたびに割り当てられる文字列 Hello のアドレスを比較しています。
この if ステートメントは、pc が指す文字列と、文字列 Hello は比較し
ません。
文字列を比較するには strcmp 関数を使ってください。
-------------------------------
なんてのもあって、今回のそのままじゃんって感じ。でも、この警告出せ
ないんだけど...。

また、(ANSI 準拠だから)「警告は出ないのは当然だし出すべきではない」
と言うのには、賛成できねぇ。ANSI に準拠していたって、制御が渡らない
コードや、未使用のローカル変数とか指摘するコンパイラって珍しくない
し、そう言う機能もいらないと言うのか ? (だすださないを制御できる必
要はあるだろうけど...。)
( ´∀`) 必死に調べたんだねぇ。えらいえらい。
反論したくてしょうがなかったんだろうな。
124114:02/04/22 01:07
125日下部圭子:02/04/22 09:38
age
126デフォルトの名無しさん:02/04/22 16:36
最近Cを勉強しているのですが
下記の関数の作りかたがわかりません。
どなたかアドバイスを宜しくお願い致します。
typedef struct{
char c1[2];
char c2[3];
}HEADER;
typedef struct{
HEADER head;
char c3[4];
char c4[5];
}BODY1;
typedef struct{
HEADER head;
char c5[6];
char c6[7];
}BODY2;
という構造体があって
int func(void *vp);
という関数にBODY1か2の型のポインタがvoid型の引数できます。
func()の中で構造体の各メンバを参照するのとheadをぬかした
サイズを取ってreturnするにはどうすればいいでしょうか?
それともこの場合引数にvoid型を使うのは間違いでしょうか?
アドバイスを宜しくお願い致します。
不可能です。
間違いです。

winのBITMAPINFO構造体などを参考に、
構造体のサイズをメンバに持たせる手もありますが、
おすすめしません。
128デフォルトの名無しさん:02/04/22 16:45
>>126
union使えや

struct Item {
 int type;
 union {
  char a;
  int b;
  long c;
 } Body;
};

void func(Item* item)
{
 switch(item->type) {
 case 0: printf("%c\n", item.Body.a);
 case 1: printf("%d\n", item.Body.b);
 case 2: printf("%ld\n", item.Body.c);
 }
}
>>126
offsetofマクロを使ったらトリッキーなプログラムが書けるかも知れない。
130デフォルトの名無しさん:02/04/22 16:57
問題です。
128の間違いはなんでしょう?
131デフォルトの名無しさん:02/04/22 17:01
>>130
x item.Body.a
o item->Body.a
132デフォルトの名無しさん:02/04/22 17:01
sleep関数みたいな奴C言語でありませんか?
133126:02/04/22 17:02
お返事ありがとうございます。
実はこれ課題で出されたものなんです。
構造体のみで共用体は使えません。
引数のvoid型は自分で勝手に考えたのですがおもいきり間違いみたいです。
どうにかして上記のような機能をもつ関数を作りたいのですが
いい方法は無いのでしょうか?
それとも不可能なのでしょうか?
>>130
item.Body ではなく item->Body
breakがない
引数にconstがない
135デフォルトの名無しさん:02/04/22 17:05
>>133
外出だけどoffsetofとキャストを使った汚い方法しかないんじゃないの?
>>133
void *でもint *でもいいです。どうせキャストして使うんですから。
>>133
役に立たない教官ですね。
畳んでおしまいなさい。
>>132
プラットフォーム依存。
Unixならsleep()やusleep()、Win32ならSleep()
printfで最小幅を設定したときの充てん文字(スペース)を変更する方法は何かないでしょうか?
それ以前にこの文章の意味を理解してもらえるか心配です
140126:02/04/22 17:27
すみません。説明がたりませんでした。
HEADERのc1の値が1なBODY1,2ならBODY2でした。
でも関数の引数は構造体の先頭ポインタ1個だけです。
なにかいい方法はないでしょうか?
>>140
構造体のタイプがわかるなら、
void*じゃなくてHEADER*で受け取って、タイプを判別した後に
望みの形にキャスト
142デフォルトの名無しさん:02/04/22 17:41
>>139
ゼロパディングなら%04dってな感じで(45なら0045と表示される)。
他の文字は知らない。
>>140
こんなもんかな。皆様訂正キボンヌ。

int func(void *p);

int main(void)
{
BODY1 b1;
BODY2 b2;

b1.head.c1 = 1;
b1.c3[0] = 1;
printf("size of b1 inner = %d\n", func(&b1));

b2.head.c1 = 2;
b2.c5[0] = 2;
printf("size of b2 inner = %d\n", func(&b2));

getchar();

return 0;
}

int func(void *p)
{
switch (((HEADER *)p)->c1) {
case 1:
printf("c3[0] = %d\n", ((BODY1 *)p)->c3[0]);
return sizeof *(BODY1 *)p - offsetof(BODY1, c3[0]);
case 2:
printf("c5[0] = %d\n", ((BODY2 *)p)->c5[0]);
return sizeof *(BODY2 *)p - offsetof(BODY2, c5[0]);
default:
return 0;
}
}
>>143
おっとっと。getchar()は取って下さい。
145質問:02/04/22 18:00
WindowsXPのソースが全く解からないんですけど
せめてカーネル部分を教えてくれませんか?
あんたMSの社員?
>>145
誤爆?
148デフォルトの名無しさん:02/04/22 18:16
えっと、プログレスバーをMFCを使わずにWinで表示したいのですが、
hwndProgressCtrl = CreateWindowEx(0,PROGRESS_CLASS,"",
WS_VISIBLE | WS_CHILD | PBS_VERTICAL | PBS_SMOOTH,
10, 50, 20, 80, hDlg, (HMENU)IDC_PROGRESSBAR, g_hInstance, NULL);
こんな感じで書いたのですがエラーが出てしまいます。
エラー内容はPROGRESS_CLASSが定義されていないとか、そんなのばっかりです。
どうすれば直りますか?
定義すればいいし、それはCじゃなくてWinの話だし・・・
150デフォルトの名無しさん:02/04/22 18:24
func(BYTE data1,BYTE data2){
DWORD val=(data2<<8) | data1;
return val;
}
なんでこれは上手く行くのでしょうか?
(data2<<8)は0だと思うのですが
'8'がintだから、型がagaるのでわ?
それいぜんに、シフト時の結果は処理系依存
sizeof (data2<<8) の値を確認してみては?
実際試してみれば?
155デフォルトの名無しさん:02/04/22 20:58
試したら上手くいったの
だから、なぜ???
intより小さい型は演算するときintに格上げされます。
式値
式値の型
格上げ
暗黙の型変換

あたりを調べよう。
載ってない「入門本」は捨てていいよ。
の無駄だったね。
の無駄だったね。
の無駄だったね。
の無駄だったね。
161日下部圭子:02/04/23 08:51
あへ
162いっちゃん:02/04/23 15:40
+,-の演算子を使わないで加減演算を行なうにはどうしたらよいですか?
>>162
++は?
164162:02/04/23 15:49
++,--は使わないです。できますか?
加算器をシミュレートすりゃ可能だが…
>>165
full adderでも使いますか。
>>162
アセンブラのコードを埋め込む、とかな。
…って、C じゃないじゃん>漏れ

あと、圧倒的にでっかいテーブルを(略)
168デフォルトの名無しさん:02/04/23 17:15
日下部陽一?
喰いもの関連のニュースグループでうっとーしい奴か?
<162
ほれ宿題取り(あえず2桁ぐらい確認)

unsigned long adder( unsigned short _a, unsigned short _b )
{
int i;
unsigned long a = _a;
unsigned long b = _b;
unsigned long ha;
for ( i = 0; i < sizeof ( unsigned short ) * 8; i ++ ) {
ha = (~a & b) | (a & ~b);//inv exor(half adder)
b = ( a & b ) << 1;//carry
a = ha;
}
return a;
}
170162:02/04/23 17:57
>169様
ありがとうございます。参考にさせていただきます。
皆様、ありがとうございました。
UINT add(UINT a, UINT b){
  if (a != 0 && b != 0)
    return add(a ^ b, (a & b) << 1);
  else
    return a | b;
}
試しにやってみた。
これ合ってる?
172デフォルトの名無しさん:02/04/23 19:39
sprintfがバグります。
同じソースをUNIXのgccでコンパイル→UNIXで実行すると動くのに、
Borland C++でコンパイル→WIN98で実行すると
その後の入力が全部壊れてしまいます。
これってプログラムが間違ってるってことでしょうか?
173デフォルトの名無しさん:02/04/23 19:40
>>172
ソースは?
>>172
ほとんどの場合、そのプログラムが悪い。
特にsprintfなんて枯れた部分ならなおさら。
175  :02/04/23 19:56
main()

こっから何書いてイイのかわかりません
176172:02/04/23 19:56
>>173
こんなのです。

#include <stdio.h>
void main()
{
char a[4],b[4];
int i=1234;
int j=5678;

sprintf(a,"%4d",i);
sprintf(b,"%4d",j);

printf("a = %s\n",a);
printf("b = %s\n",b);

a[0] = '9';
a[1] = '9';
a[2] = '9';
a[3] = '9';

b[0] = '1';
b[1] = '1';
b[2] = '1';
b[3] = '1';

printf("a = %s\n",a);
printf("b = %s\n",b);
}

これの実行結果が

a =
b = 5678
a = 9999
b = 56781111

です。
終端文字の分余分にバッファを確保しろ
178デフォルトの名無しさん:02/04/23 20:00
×char a[4],b[4];
○char a[5],b[5];
179172:02/04/23 20:02
普通の文字配列よりも1バイト余分に
必要なのですか?
文字列として使うんじゃないなら別に要らない。
>>179
C言語において文字列は末尾に終端文字として '\0' が必要なので、
バッファもその分余計に必要。

a[0] = '9';
a[1] = '9';
a[2] = '9';
a[3] = '9';
a[4] = '\0';

b[0] = '1';
b[1] = '1';
b[2] = '1';
b[3] = '1';
b[4] = '\0';
183デフォルトの名無しさん:02/04/23 20:13
>>180
はうそつきです
>>183
レスの前の方は読んでないから適当なこと書いてるかもしれん。
まあ気にすんな。
185172:02/04/23 20:22
>>179
a[4]で4文字+\0の5バイト・・・ではない??
186172:02/04/23 20:23
↑間違えました。
>>181
>>182
ではない。
188デフォルトの名無しさん:02/04/23 20:34
>>183
うそつきではないだろ
>>185
a[5]でa[0]からa[4]までの5つの要素を確保できる。
190172:02/04/23 20:38
>>189
・・・文字列の終わりの\0の他に、
配列の終わりの\0も必要ということでしょうか?
191デフォルトの名無しさん:02/04/23 20:40
>>190
'\0'を入れるスペースが必要でしょう。
"ABCD"なら{'A','B','C','D','\0'}で5つ
192172:02/04/23 20:51
>>190
C言語学んで5年間、とんでもない勘違いをしていたみたいです。
a[5]って「aという名前で5つ分確保」って意味だったんですね。
「[5]まで使える」んだと思ってました。
ああもうなんて情けない恥ずかしい・・・。

皆様、本当にご教授ありがとうございました!
>>192
周りにCに詳しい人がいなかったんだね。かわいそう。
C言語の標準ライブラリに"文字列"として与えるのならば
すべて'\0'で終端された文字列でなければならない。

そういう用途にまったく使わないで単なるメモリイメージとして使うだけなら終端文字は不要。

何度も同じことを言い直しているだけな罠。
195172:02/04/23 21:00
>>193
いることはいるんですけど、プログラムについて聞くと
「それを調べるのがお前の仕事」と。
まぁそれはその通りなんですけどね。
でもこれでやっと他プログラムのバグの謎も解けました。

こんな初歩的なところで皆様の手を煩わせてしまって
申し訳ないです・・・。
>>195
もしかしてmallocでも同じミスをされていたり?こちらの方はちょっと
ダメージが大きくなります。ヒープ領域が壊れてしまいますから。
197172:02/04/23 21:08
>>196
いえ、そんな難しいの、使ったことが・・・。
業務で使ってるのはPL/Iで、Cは会社の
研修で使うだけなもので・・・。

役立たずPGなので逝ってきます・・・。
>>197
なるほど。周りの方々も不親切だったと。
気が向かれたらまた書き込みして下さい。
199172:02/04/23 21:16
>>198
なんて温かいお言葉を・・・!
涙でディスプレイが見えません!!本当に!

皆様、ありがとうございました。ご恩は忘れません!
いいスレだね
>>171
ようやくやってる事が判ったよ。COOL!
202新入:02/04/24 00:11
プログラム初心者にとってCは、
何をどうやって地道にやってけば良いのでしょうか…??
打つ。
読む。打つ。買う。

いまいちか
>>202
良い本を買って、読みながら実際コンパイル・実行していけば、
なんとかなるよ。

良い本は、>>1にリンクがある推薦図書のスレでどうぞ。

個人的お薦めは、K&Rは辞書だと思ってまず買うとして、
それ以外に、本屋にある一番薄くて安い本を買うことです。
高くて厚い本は、読んでいるうちにきっと萎えます。
やっぱ日下部先生、最高だわ
>>205
萎えるというか、持って開くのが億劫になってくる。
例:らくだ2nd、プログラミング言語C++3rd
208デフォルトの名無しさん:02/04/24 03:35
C++3版はおもしろいよ。
読んどいて損なし。
俺も、重い本ってあまり好きじゃないなぁ。3冊に分けて欲しい。
>>202
言語にとらわれちゃだめだぞ。
Cなんて所詮は単なる翻訳でしかないのだから。
大事なことはプログラムってのは手段であって目的ではないって事。
なにをするためのプログラムなのかを考え、それを実現する過程をしっかりと
自分の頭の中で組み立て消化すればおのずと必要な処理の流れがわかってくる
から、それを該当する言語(たとえばC言語ね)で表現するにはどんな構文を
使えばいいのか調べればよい。

プログラミング言語は言葉なんだよ。
どんなに流暢に話せても中身のない言葉には説得力もなければ感動もない。
ハイハイ、お疲れ様。
(*´д`) 最後の二行・・・ハズカシクナイ?
ともっちを見習いたい者だ。
オサーンのオナーニ講釈。聞かされるほうはたまったもんじゃないってヤツ。
(*´д`) ともっち・・・ハァハァ
216デフォルトの名無しさん:02/04/24 04:52
C/C++マンセ!
217_:02/04/24 14:21
class cA;
class cB;
delete (cA*)(new cB)

これってcAのコンストラクタが呼ばれるのは分かるんだけど
メモリはちゃんとcBのサイズ分解放されるのかな?
それともcAのサイズ分解放される?
C++相談室があるやん…
219_:02/04/24 14:30
すみません。
よく考えたら

struct sA;
struct sB;

free((sA*)malloc(sizeof(sB)));

ってちゃんとsB分解放される・・・と思うから
ちゃんとcB分解放されるんですね。
ヒープ上のメモリって自分の大きさを分かってるんだ。凄いなー。
>>197
ニッチな御仕事ですなぁ。          (;´д`).。oO( PL/I. )
まぁ、そっちの仕事をなさっていても、懸命にやっていれば
得るものがたくさんあると思うので、
いつか C言語の仕事が来ても
なんとかなるでしょう。
ガンガレ (・∀・)
221デフォルトの名無しさん:02/04/24 15:10
日下部タン、荒らすのはやめましょう
>>219
そうですね。freeにしろ、deleteにしろ、ユーザーが与えるのはオブジェクトへの
ポインタだけで、サイズは与える必要がないですもんね。
でもcAのデストラクタに変な物が入っていたらどうなるんだろう。
以降の議論はC++相談室で。
>>219
以下のコードは正しく動作しない。C風のキャストはやめよう。

class cA {
int *i;
public:
cA() : i(new int(0)) {}
~cA() { int i; }
};

class cB {
double *d;
public:
cB() : d(new double(0)) {}
~cB() { delete d; }
};

int main()
{
delete (cA *)new cB;
}
224_:02/04/24 16:44
>>217
コンストラクタ->デストラクタ

>>223
正しくというのはcBのデストラクタが呼ばれないってことですよね?
cB::d*の指してるメモリは残るんだろうけど
new cBで作られたsizeof(cB)分のメモリは解放されますか?
>>224
sizeof(cB)分のメモリは常に正しく解放されます。
やっぱ、日下部先生んとこの奥さん最高だわ
typedef sturuct{
int a;
int b;
}Kou;

Kou kouzoutai[100][100];

kouzoutaiの全部の大きさを知りたい時は,

sizeof(kouzoutai);

sizeof(kouzoutai)*100*100;

のどちらがただしいのでしょうか?
>>227
前者。後者は配列にする際にパディングが行われてサイズが膨れている
事があるので誤り。
>>227
じゃなかった、後者は無条件に誤り。
230デフォルトの名無しさん:02/04/24 17:53
ここで聞かないで試してみろよ。
一発でわかるから。
231230:02/04/24 17:58
>試してみろよ。 一発でわかるから。

と思ったけどまさかその数字を見て判断できない訳じゃないよね。
232227:02/04/24 19:48
やったけど、なんで
sizeof(kouzoutai)*100*100;
じゃなく
sizeof(kouzoutai);
なんだろうと思ってさ
>>228-229
これってホント ? 漏れ、sizeof(kouzoutai) でもパディング考慮したサ
イズを返してくれるもんだと思ってたよ。

動的に確保する時...

Kou *p = malloc(100 * sizeof Kou);

ってやってたけど、まずいの ?
>>233
試してみればいいだろ。
きっちりpaddingを考慮したサイズを返してくる。
そもそも、構造体のメンバの合計を返しても役に立たないじゃん
まあ、#define arraysize(x) (sizeof(x) / sizeof(x[0]))
なんてマクロがいくらでも使われているんだから
簡単にわかりそうなもんだが。
>>228-229みたいな知ったか野郎は放置の方向で。
>>234-235
てか、K&R も持っていないポンポコちゃんは放置
と思う方向で。
(;´д`).。oO( パディングしたサイズ = sizeof( 構造体 ); )
237デフォルトの名無しさん:02/04/24 21:16
17スレをあげ
>>236
>>230, >>234
「試してみりゃ云々」って奴は、プログラマ辞めたほうが良いぞ。
「やってみた時は、うまく動きました。」って何回聞かされたことか。
まあ、たまたま今回は正しい結果が出るから良いけどさ。
240デフォルトの名無しさん:02/04/24 21:44
>>235
#define arraysize(x) (sizeof(x) / sizeof(x[0]))
より
#define arraysize(x) (sizeof(x) / sizeof(x)[0])
のようがよいよ
>>239は相当苦労してきたに一票
242吟味した?:02/04/24 21:49
>>227
一般的には、
sizeof(1要素を示す型) * (確保したい要素数)
だよ。

なので、ふつー
sizeof(Kou) * 100*100;
てする。

で、ここが勘違いしやすいんだけど、
sizeof(配列変数名)
ってやると、その配列全体のサイズが返ってくるのね。
つまり、char buf[100]; て宣言すると、sizeof(buf)は100。
>>240
なんだよそれ
>>243
1. sizeof の引数が型ではなく値である場合、括弧は不要。
2. #define の引数は常に括弧つきで利用すべき。
→ sizeof (x)[0]
でしょ。
意図はわかるが、括弧が足りなくて間違ってる>240
む、sizeof(x)[0]は
(sizeof(x))[0]じゃなくて
sizeof((x)[0])なのか
247デフォルトの名無しさん:02/04/24 22:43
>「試してみりゃ云々」って奴は、プログラマ辞めたほうが良いぞ。
じゃ君は全部脳内コンパイルしているのかい。

>「やってみた時は、うまく動きました。」って何回聞かされたことか
もちろんこういうことはあるし特にCではたまたまうまく動くということはあるから
言いたいことがわからないでもないけどさ。
実際コードを書いてみることで理解が深まると思うんだけど。もちろんそういう際は
様々な試行錯誤をして文献に当たってさらにコードを書いて確認すると言う意味。
今回だってコード書けば一発でわかりそうなんだけど。もし自分の理解を超える
数字になったときには文献に当たるなりこういうところで聞くなりしてさ。
248243:02/04/24 22:56
漏れも>>246と同じ勘違いしていた
249デフォルトの名無しさん:02/04/24 23:02
#include<stdio.h>
main()
{
char charray[]="あ";
prntf("%s",charray);
printf("い\n");
return 0;
}
でエラーが一つできてしまいます。何がまずいでしょうか?
コンパイラはvisual c++です。
これcでも使えますよね?
prntf
>>249
prntf -> printf

エラーについて聞くときは、エラーメッセージも添えて。
252デフォルトの名無しさん:02/04/24 23:06
prntf()
なんて関数はない
253249:02/04/24 23:06
エラー 0、警告 1
としか出なかったので書かなくていいと思っていました。ゴメンナサイ
prntf() は、C (小文字で書くなぁ〜。) でも、VC++ でも (自分で定義し
なきゃ) 使えねーぞ。つーか、このエラーがエラーメッセージ見てわかん
ないなら、VC++ なんか使うなよ。

という、書き込みが多数あるものと思われ...。
255252:02/04/24 23:07
あぁ、かぶりまくり
一応付加すると、stdio.hに
prntf()という関数はないということで。
>>253
どういう設定したら、そう言う表示になるんだ ?
コンパイルエラーにはならないだろ。
リンカエラーにはなるけど。そういうことだと予想
理解できてないうちは「警告をエラーとして扱う」オプションいれとけ。
>>258
そうして人はキャストを多用する
確かにCはstatic_castやconst_castが無いのが痛いな…
261デフォルトの名無しさん:02/04/25 00:24
spawn系で作成したプロセスのstdinを取得したいんですけど、
どうやるんですか?
作成したプロセスは入力待ちの状態になるので、stdinに送り込めば
と思ってるんですけど・・・
>>261
dup(), dup2() かな。
「試してみて正しかったです」だけでなくて、
○言語仕様や処理系依存の部分に関しては、資料を調べる
○関数の動作の場合は、机上でも追ってみる
を、併せてやってほしいとは思うけど、関数やモジュールの動作は、
最終的には、動かして結果を見る事への依存度が高い。

だから、日ごろから、動かした結果、資料を調べなくても正しい事が
わかるような、「調べ方」を、身につけて欲しいな、と思う。

そうしてるうちに、言語仕様についても、これについては試せば解かる、
ってのが見えてくるさね。

(だれに言ってるんだろう…)
264C房:02/04/25 06:22
Cの事ならなんでも俺に聞け!!
あっあくまで日下部の代理ってことでおながいします(;´∀`)
266デフォルトの名無しさん:02/04/25 06:45
>>264
Cまで逝ったら子供が出来ました。
彼女のメモリーにマウントしてデータを抹殺したいんですけど、どんなコードを書けば良いですか?
abort
>>266
unlinkかremoveを使え。
・・・ってファイルじゃないね。
他人のメモリーの領域を勝手に書き換えようとしたらOSにゴルァされないか?
>>267
中絶かよ!
270デフォルトの名無しさん:02/04/25 07:28
>>268
すでにファッキングされてるから大丈夫じゃないのか?
あげてしまった。スマソ
semctlで+1すればいい話だったりして。
273デフォルトの名無しさん:02/04/25 11:15
a=a+1
ってどういう意味ですか?
数学の世界では絶対にあり得ないことなのですが・・・
>>273
本読めや。
手続き型プログラム言語には暗黙の時間指定があります。
よって厳密に数学的に書くと、a(t)を時刻tにおけるaの値として、a(t+1)=a(t)+1であり
何の問題もありません。
276デフォルトの名無しさん:02/04/25 11:23
全部読む 最新50 1-100 板のトップ リロード

っていうか、=は代入で、比較は==ってだけの話じゃん。
278デフォルトの名無しさん:02/04/25 11:25
>>274
数学の本や参考書などをみましたが余計解らなくなりました。
この方程式はどうやって解くんですか?
>>278
一から十まで全部人に聞く気かよ。
280デフォルトの名無しさん:02/04/25 11:33
いやタイトルに聞けと書いてあるので・・・・
>>278
aが極めて大きな数でも成り立たないか?
>>280
1にFAQ読め、K&R読め、アヒル本読めって書いてあるじゃん。
つまらないネタで引っ張るなよ。
284仕様書無しさん:02/04/25 11:41
C言語のプログラムを代数的記述に置き換えることはできるんですか?
285デフォルトの名無しさん:02/04/25 11:42
>>281
1から数学を勉強しテクださい
∞ = ∞ + 1
ってことじゃないの?
287デフォルトの名無しさん:02/04/25 12:10
どこに書けばいいのかわからないので、ここに書いてみるが、
Windowsのフォルダ名がスペースを含む事を許さず、
かつ、フォルダ(ディレクトリ)の区切りを\じゃなく、素直に/にしてくれていたら
人生もっと明るく生きれたなぁ って思ったことはありませんか?

288デフォルトの名無しさん:02/04/25 12:29
>>287
童姦。ドライブレター自体うざい。
>>286
-∞=-∞+1

だめなやつは何をやってもだめな式。
290デフォルトの名無しさん:02/04/25 12:34
PGにならなければもっと明るく生きれたんじゃないか、と思います。
隣の芝村は青いね。
>>287
Cygwinいれれば?
294デフォルトの名無しさん:02/04/25 16:15

関数を定義・宣言するときに戻り値の型を void にしておいて、
return を下記のように使うのって、やめた方がいいですか?
個人的には途中で処理がブッタ切レルのでいいかなと思うんですが。

何かまずいことあるでしょうか?

void func(){
return;
}
295デフォルトの名無しさん:02/04/25 16:15
typedef struct _aa{
int a;
int b;
}aa;

int
main(){

aa **AA;

AA = malloc(sizeof(aa) * 100);
AA[0]->a = 1;

のように確保した領域にアクセスしようとすると、落ちるんですが、なぜですか?
>>294
まったく問題なし。
>>294
> 何かまずいことあるでしょうか?
特にない。

>>295
> のように確保した領域にアクセスしようとすると、落ちるんですが、なぜですか?
配列とポインタのしくみを良く理解していない為、

配列を確保したいなら
> aa **AA;
aa *AA;
としよう
>>295
なんか深みにハマってきてるなぁ。

aa *AA;
aa **BB;

AA = (aa *)malloc(sizeof(aa) * 100);
AA[0].a = 1;

BB = (aa **)malloc(sizeof(aa *) * 100);
BB[0] = (aa *)malloc(sizeof(aa));
BB[0]->a = 1;
>>298
ソレダ!!
ついにこの時がやってきた
300キタ━━━━━━(゚∀゚)━━━━━━!!!!
301295:02/04/25 16:40
>>298
そうだそうだ
やりたいことは

AA = malloc(sizeof(aa *) * 100)
for(i<0;i<100;i++)
AA[i]=malloc(sizeof(aa));

AA[0]->a = ...

で、できました!
サンクスコ!
>>301
ねぇ、

aa AA[100];で事足りない?
303295:02/04/25 16:50
>>302
その「100」を動的にとるように変えてハマッテタのれす。
>>303
aa *AA;

AA = malloc(sizeof(aa) * i);

じゃだめ?



>>302 >>304
  ?  ?
? (゚д゚) ? なんで2次元配列を1次元にするの?
306295:02/04/25 17:15
一応、正確にいうと、
今までグローバルに
*AA[n];
と取って使っていたのを、nを動的に取るようにしたために
グローバルに
**AA;
と取るようにして初期化ではまっていたのdeath
307デフォルトの名無しさん:02/04/25 17:20
#include <stdio.h>
int main(void)
{
int num, i;

printf("2以上の整数を入力\n");
scanf("%d", &num);

for(i=2;i<=num;i++){
if(num == i){
printf("%dは素数です\n", num);
}

else if(num%i == 0){
printf("%dは素数ではありません\n", num);
break;
}
}

return 0;
}

すみません、ド初心者なんですが質問させて下さい。
上のコードは、入力された数字が素数かどうかを判断するコード
なんですが、何故 if(num == i) で素数と判断されるかが解らないんです。
どなたか教えて下さい。
iがnumまで回るということは、
自分自身(num)以外では割り切れなかったということだから。
309307:02/04/25 17:40
なるほど、どうもです。
>>301

typedef struct _aa {
int a;
int b;
} aa;

int main(void)
{
aa *AA;
aa **BB;

AA = (aa *)malloc(sizeof(aa) * 100);
AA[0].a = 1;

BB = (aa **)malloc(sizeof(aa *) * 100);
BB[0] = (aa *)malloc(sizeof(aa));

/* 下の二行は同じ意味 */
BB[0]->a = 1;
BB[0][0].a = 1;

return 0;
}
>>309
なんだか、豪快なアルゴリズムだな…
312マッハ若乃花:02/04/25 19:37
先生!ctime()の出力に\nが何故か付きます!
\nいりません!おいら,どうしたらいいでしょうか!?
>>307
for(i=2;i<=num;i++){

for(i=2;i*i<=num;i++){
でいいんじゃないの?
>>313追記
もっと変える必要があるか。
315先生:02/04/25 20:02
>>312
自・分・で・け・ず・り・な・さ・い(はぁと)

もしくは、strftime()を使おう。
316デフォルトの名無しさん:02/04/26 02:06
スレ違いっぽいですが
K&Rの正誤表って何処にあるんでしょうか?
vectorにあるって見たのですが、見つかりません。
有難う御座いました。
スレ違いなのはわかってます。。。

いままではプログラムの本を買って読むとき、読むだけではなかなか頭に入らないので
ノートに本の内容をはじめから最後までまとめていました。おかげで600ページほどの本をまとめるのに
2ヶ月ぐらいかかってました。さすがにこれではまずいなと思い、現在は一度読んで大体の内容を頭に入れた後
"何ページから○○のことが書いてある"のように自分用目次を作って必要なときに必要な部分
を見れるようにしました。これは効率がよくとても助かりました。他になにかおすすめの学習方法が
ありましたら教えてください。
読むだけでわかるかけないだろって
実際に作れよ
321デフォルトの名無しさん:02/04/26 06:06
論よりrun
323デフォルトの名無しさん:02/04/26 07:26
>>319
勉強に使えるコンピュータを持っていないの?
324デフォルトの名無しさん:02/04/26 08:46
>>323
私は頭の中でコンパイルしています
>>322
いい言葉だ
326デフォルトの名無しさん:02/04/26 08:51
VBから呼び出すDLLを作ろうと思っているのですが、
VBからByteの配列を受け取り、その配列の内容を変えてまたVBに返す方法(宣言)を
教えてください。
327仕様書無しさん:02/04/26 08:51
128bitのプロセッサが出てきたらC言語も何かキーワードを追加するんでしょうか?
>>326
おそらくこんな感じ。
(lengthはお好みで。)

int __stdcall hoge(unsigned char *bytes, int length)
{
 pBytes[0] = 0xff;
 :
 :
}

>>327
C++++あたりの言語が出そうな予感
329デフォルトの名無しさん:02/04/26 09:18
pBytes[0]って何を表すのですか?
330sage:02/04/26 09:21
>>329
失礼、bytes[0]の間違い。
バイト配列の先頭の要素ね。
名前にsageって入れちゃった…
鬱だし脳
332デフォルトの名無しさん:02/04/26 09:25
やってみましたができませんでした…
配列の内容が反映されていませんでした。
333デフォルトの名無しさん:02/04/26 09:30
int __stdcall Search(long m, unsigned char *P){
long r;
/*なんか処理*/
P[r]=1;
return 0;
}
って感じなのですが…
334デフォルトの名無しさん:02/04/26 09:41
自己解決しました。お騒がせしました。

VBでいう true ってVCではどうあらわせばいいんでしょうか?
>>334
16bit
336319:02/04/26 11:09
コンピューターは持ってません。買いたいのですがお金がありません。
貯金で5万円ぐらいです。
コンピューターに触れるのは学校だけです。放課後はつかえません
>>336
5万円あればPC買えるんで、買え
339デフォルトの名無しさん:02/04/26 16:03
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>

int
main(void)
{
WINDOW *s;
FILE *fp=NULL;

if ((fp = fopen("/home/hoge/testfile", "r")) != NULL)
free(fp);
s= initscr();clear();endwin();exit(0);
}

なぜかこれでセグメンテーションフォルトが出ます.

gdb で調べると
#0 0x400c3aef in _IO_adjust_column () from /lib/libc.so.6
#1 0x400c3bed in _IO_flush_all () from /lib/libc.so.6
#2 0x400c3da1 in _flushlbf () from /lib/libc.so.6
#3 0x40083ed4 in exit () from /lib/libc.so.6
#4 0x0804ac46 in main (ac=1, av=0xbffffbd4) at main.c:43
#5 0x4007117f in __libc_start_main () from /lib/libc.so.6
ライブラリの問題なんでしょうか..
>>339
free(fp); って一体…。
とりあえず、mallocしたとは限らないfpをfreeすんなよ‥‥
342デフォルトの名無しさん:02/04/26 16:27
あぁ!まじ鬱だ。
fclose(fp)でした!
なんでこんな間違いを。。。

343デフォルトの名無しさん:02/04/26 16:32
Linuxでgetch()はないんですか?
344デフォルトの名無しさん:02/04/26 16:35
>>343
getchってconio.hにある関数だっけ?
だとしたらないと思う。
345デフォルトの名無しさん:02/04/26 16:36
cursesにはある.<linux

346デフォルトの名無しさん:02/04/26 16:37
>>346
あっそ。
だからどうしたの?
>>345
出来ました。ありがとう。

>>339 >>342
マジレス。
とりあえずデバッグにデバッガ使うのは当分やめといた方が良い。
ある程度の量と質をこなせるようになるまでは printf とコンパイラのエラーメッセージで我慢する。

>>319
本でプログラムを勉強するとは、根性あるなぁ。

自作なら十分な金額なんだけど、
一台目はメーカー品の方が、安心できるからなぁ。
あと、月々の通信費もかかるし。

近くの公共施設とか当たってみ。
あとは、自作に詳しい友人とか。
なきゃぁ、バイトだな。

プログラムの勉強頑張れよ。
何か作れるのは楽しいぞ。


スレ違いなのにマジレス スマソ >> その他のみなさん
スレ違い sage
>>319
すげえ。
いや、まじでそれ貫いてくれ。
ソースコード書いて覚えられるものなのか?感心した!

PCは大学とかに落ちてるの拾ってきて、Linux入れれば(・∀・)イイ!

あ、5万あるんなら中古でノーパソでも買うほうが善いな。
5万なら、かな〜り速いマシン買えるよ。
それにSolarisかBSDかLinux入れよう。
>>319みたいな人はLinuxがよく似合う、っと。
もちろんイイ意味で。
十読は一写に如かず。
プログラムのみならず、全てに当てはまる事だな。
356デフォルトの名無しさん:02/04/27 04:36
VBから文字列を受け取りたいのですがどうすればいいでしょうか?

DLL_API int __stdcall hoge(long a, char *b){

で失敗しました…化けてしまいました。
357デフォルトの名無しさん:02/04/27 05:17
>>349
構造体沢山書く

free専用の関数をfree_Typename(Typename *)で記述する

fcloseの存在を忘れる(解放=freeと頭の中に焼きついてしまう)

fopen->free ???

という感じでした

*いっそのこと#define free_File(fp) fclose(fp)でもしとこうか..
貧乏人のPC-UNIX万歳!
359デフォルトの名無しさん:02/04/27 05:43
ゴースト(自分のベスト記録と同じ動作をするもの)の実装をやってるんですが。
どういう構造が良いのでしょうか。

まずゴーストの記録を取るのですが
自分が考えたものとしては,selectとwhileで回しているループ中で

1.イベントが起きるとその時の時刻とイベント内容,状態を取得して配列にする

2.特定時刻ごとの状態のみを取得して配列にする

の二つを考えました。

1はイベント数によって配列の長さが変わり要reallocの可能性があります。
イベント内容を取得しておけるのでリプレイ(ゴーストとは別)がしやすそうです。

2は時刻が固定されてるので配列も固定で良さそうです。
ゴーストの実装も1に比べ楽そうです。

今1を採用しているですがプレイ中にreallocするのはどうも嫌な気分です。
2の方が良いのでしょうか。


>>357
他人が見たときバカにされるよ。
361デフォルトの名無しさん:02/04/27 06:39
お前ら教えて下さい。

小生は現在VC++を使っています。
mallocで大きな配列を宣言して2次元配列のように
使いたい場合に、

matrix[i*n + j] と指定するのが見にくいので

#define matrix(i, j) matrix[i*n + j]
main()
{
  int n = 3;
}
として使っているのですが
これはまずいのでしょうか。
nが宣言されているところで使えば大丈夫。
まずい
>>361
どこからもmatrix()呼び出してないからちゃんと動く。
>>360
>>361
偉そうな割に頭悪すぎ。
>>361
matrix(x,y) = 13;

C++でやれば参照と勘違いされ(そもそもマクロ使用自体がナンセンス)、
Cでやれば気味悪がられる。

俺も>>360に一票。
>>359
ゲームは通常、一定時間を単位としてプログラムします。
http://pc.2ch.net/test/read.cgi/tech/1011722640/838-

で、例えば1/60秒を1単位(1フレーム)としてプログラムした場合、
1秒間に60回分のキーの状態を記録しておけば、完全なリプレイ
(=ゴースト)が再生できます。

レースゲームで、使うキーが上下左右+アクセル+ブレーキの6bitなら、
1回分は1バイトで足りるので、1秒間に60バイト。1分間で3600バイト。
1時間で216000=約210KBで足ります。

重要なのは、「キー入力イベントが発生することによってゲームの
処理をするのではなく、プログラム側のタイミングでキーの状態を
読みに行く」ようにプログラムすることです。

つまり、>>359の2が正解。

>>357

その使いかただけを見ると、
close(閉じる) と、 free(解放)に対する理解が不十分と思われ。
ごっちゃになってる。

1度、別々に突っこんで調べてみるといいと思う。


>>360 >>366
このスレの厨房占有率が少しでも下がるから、
1行でいいからアドバイスしてやれよぉ。
理解もなにもねーだろ(w

*alloc->free
fopen->fclose
と対にして覚えればいいだけじゃねーか(w
知識に頼ってプログラムを組むなら、
もっと簡単に沢山のことをできる言語があるよ。
>>361
とりあえずね。
#define matrix(i, j) matrix[(i)*n + (j)]
って書け。
>>368
そもそもそんな怪しげな形にdefineしない。
>>368
後、気持ちはわからないことはないけどそれなら2次元配列使えば済む話ではと。
>>373
mallocと書いてあるので二重ポインタでそう。
>>374
つぅかソースの全容見ないと何ともいえないよ。
やつが書いたコードdefineマクロ使ってないし。w
376koubouU:02/04/27 16:26
整数nを入力したとき1からnまでの奇数の和を表示するプログラムを作りなさい。

考えても考えてもわかりません。
+2を使うべきかー2を使うべきか・・・・変数は最低何個で作れるのか・・・
教えてください。限界です。
>>376
for(sum=0,k=1;k<=n;k+=2) sum+=k ;
printf("%d\n",sum) ;
つーかでかいもん作ってるわけでもないんだったら
#defineはあんま使うな
379koubouU:02/04/27 16:48
>>377.>>378
ちょっと説明不足でした。使える関数は
printf scanf while 程度でお願いします
>>379

int sum,k,n;
scanf("%d",&n);
sum=0;k=1;
while(k<=n){sum+=k;k+=2;}
printf("%d\n",sum);

whileは関数じゃないよ
っていうか宿題は友達に聞けよ。
382koubouU:02/04/27 16:57
>>380
whileは関数ではないんですか!?〜();
〜に当てはまるものは関数だと思ってたのに・・・

答えはちゃんと出ました。ありがとうございます。
383koubouU:02/04/27 16:59
sumって合計って意味だったんだ・・・
宿題は宿題スレに

宿題、手伝おっか?
http://pc.2ch.net/test/read.cgi/tech/1011722640/
385koubouU:02/04/27 17:02
>>381
トモダチにそんなこといってもわかりませんよ
たぶんバカにされるだけだと
int n;
scanf( "%d", &n );
printf( "%d"), (n+(n&1))*((n+1)>>1)>>1 );
387koubouU:02/04/27 17:04
>>384
わかりました
388385:02/04/27 17:14
一足遅かったのか?(´Д`)
389388==386:02/04/27 17:15
388の名前は386の間違い
390デフォルトの名無しさん:02/04/27 17:15
うわーん(TДT)
また遅れた・・
391デフォルトの名無しさん:02/04/27 17:34
すみません 突然ですが
2つの文字列str1、str2を引数として受け取り、両者が同じ文字列の場合に
int 型の 1、異なる場合には 0 を返す関数 str_eq をつくりなさい。

int str_eq(char *str1, char *str2)
{
int hantei=0,i;

for(i=0;i<3;i++){
if(str1[i]==str2[i])
hantei=hantei+1;
else
hantei=0;
}
if(hantei=3)
hantei=1;
else
hantei=0;
return(hantei);
}
こう作ったのですがうまくいきません何が悪いのでしょうか?
よろしくお願いします。
int str_eq(const char* str1, const char* str2)
{ return !strcmp(str1, str2); }
>>391
突っ込みどころ満載。とりあえず、2つの文字列str1、str2の文字数が3文字だと思ってるようですが、なぜ3文字だと思ってるのでしょうか。それも問題文に定義されてるのん?
宿題は宿題スレで!
>>391

まず「文字列」の定義を確認する。
>>392
ソースから判断するに標準関数は多分使わないんじゃないかと。
>>391
正解は、誰か書くだろうからいいとして、プログラム中の 3 ってなんだ ?

あと、うまくいかないなら「どううまくいかないか」書かないとダメだ
よ。みんなそれ見て、君のレベルを推定することができるしね。
正解はすでに392で出ているような・・・
あえて言うなら!がイヤーンな感じだが。
int str_eq(const char* str1, const char* str2)
{
int c = 0;
while (str1[c] == str2[c]) c++;
return c == strlen(str1);
}
>>399
それだと、str_eq("", "") で、str1[1] を参照して、あぼーんするぞ。
初歩からやり直せ。
401穴埋め *** & +++:02/04/27 17:54
int str_eq(char *s1,char *s2)
{
int i;
for(i = 0; *** ;i++)
if( +++ ) return 1;
return 0;
}
>>399
なんでこんな、無謀なプログラム書けるのよ。
str1 か str2 の終端まで達しているか確認せずにいきなり比較なんかす
るなよ。あと strlen() 使うぐらいなら、>>392 でいいんじゃねーのか。
>>391

int str_eq(char *str1, char *str2){
if(!str1 || !str2) return 0 ;
do{if(*str1 != *str2) return 0 ;}while(*(str1++) && *(str2++)) ;
return 1 ;
}
int str_eq(const char* str1, const char* str2)
{
if(strcmp(str1,str2))
return 0;
else
return 1;
}
int str_eq(const char * str1, const char * str2)
{
do {
if ( *str1++ != *str2++ ) return 0;
} while ( str1[-1] );
return 1;
}
>>399
わざと?
っていうか、392がベストか。
ANSI Cだと!0 == 1のはずだし。

int str_eq(const char* str1, const char* str2)
{
return *str1!=*str2 ? 0: *str1 ? str_eq( str1+1, str2+1 ) : 1;
}
>>408
stack over flow
>>408 芸術だわ。
int str_eq(char *s,char *p)
{
int i = 0;
while(s[i] && p[i])
if(s[i] == p[i])
i++;
else
return 0;
if(s[i] == '\0' && p[i] == '\0')
return 1;
return 0;
}
412408:02/04/27 18:09
え?問題なくない?
>>412
gcc以外は末尾再帰最適化してくれないし。
>>408
なにかLISPのような・・・w
415デフォルトの名無しさん:02/04/27 18:38
>>all
ありがとうございます。

>>391,397
問題は3文字指定だったのです。
説明が足りませんでした。

>>397
ご指摘のようにどうダメなのか説明します。
これを実行すると違う文字列なのに1の値
しか帰ってこないで0の値が帰ってきません。

3文字限定ならこれでいいじゃん。
return str1[0]==str2[0] && str1[1]==str2[1] && str1[2]==str2[2];
>>416
だな。
マクロでもできそうな感じ。
これでどうよ。(って、なんか3文字限定とか言ってるし...。鬱だ。)
int str_eq(const char *s1, const char *s2)
{
 return *s1 == *s2 && (!*s1 || str_eq(++s1, ++s2));
}
419412:02/04/27 18:48
>>413
VC++.NETで最適化ありで試してみたら一応スタックは無駄遣いしてなかった。
関数2つに分裂してたり無駄な代入が多かったりとなんか萎えるコードだったけど。
int str_eq(const char *str1,const char *str2)
{
return strcmp(str1,str2)?0:1;
}

これじゃだめなの?
だめ
422デフォルトの名無しさん:02/04/27 18:50
>>416
ありがとうございます。
もしよろしければ私の作った関数は
どこが間違っていたのか教えてもらえないでしょうか?
423↓勉強だからだろ!:02/04/27 18:53
>>421
なんでだYO!
>>422
とっても簡単なケアレスミス
> if(hantei=3)
これ代入してる。
ほかにも問題は無いわけじゃ無いけど、結果には影響しないと思う。
425397:02/04/27 18:55
>>415
> 問題は3文字指定だったのです。
うむ、>>395 の姿勢が正しいということだったな。

> これを実行すると違う文字列なのに1の値
> しか帰ってこないで0の値が帰ってきません。

それは、君が...
> if(hantei=3)
と書いているからだな。上のほうで...
> if(str1[i]==str2[i])
と書いているので、'=' と '==' のミスだろうね。コンパイラはなに使ってる ?
使ってるコンパイラによっては、エラーレベルを設定すると警告してくれるものも
あるから、そう言うのを使うのもいいかも知れない。
426デフォルトの名無しさん:02/04/27 19:02
>>424、425
ありがとうございます。
大変参考になりました。
>>425
コンパイラはVCを使っています。
>>423
問題の意図が「strcmpっぽいのを実装しろ」
って事だからだろ




3文字限定で(藁
char p[][5] = { "hoge", "hage", "foo", "boo" };

char *p[] = { "hoge", "hage", "foo", "boo" };

上のほうが容量食わないけど、文字列を変更しないなら下のほうがいいのかな?
>上のほうが容量食わないけど、
(゚д゚)ハァ?
>>429
消費するスタックのことではないかと。
はぁ?
消費するスタックなら下の方が少ないだろ
432430:02/04/27 20:11
>>431
すまん、逆に読んでた。逝ってくる。
433361:02/04/27 20:26
>>371-374
確かに二重ポインタが正当だけど面倒でしょ?
二次元配列だとでかい配列つくれないし。

小手先で簡単にサイズ可変の行列作れないかなぁと。

既にC++で行列クラス作ってあるから
それ使えば済むんだけどね
434428:02/04/27 20:31
>429
上は5*4=20
下は5*2+4*2+4*4=34
(ポインタが4バイトのとき)
だと思ったけど違う?
>>434
この宣言が関数内か関数外かどっちだ ? また、気にしているのはスタック領域だ
けか ? 固定文字列領域は気にしなくていいのか ?
436428:02/04/27 22:04
スタックと文字列領域両方です。
あと宣言は関数ないかな。
上はスタックに5*4+4*4で、それ以外に
コピー元の文字列分要るだろ。
>>437
4*4 ってなんだよ。
>438
スマソ。ポインタのポインタのパターンと錯覚してた。
>>437

通常、文字列リテラルはスタックとは別の領域に確保されるが、
charの配列を初期化している場合は文字列定数じやなくて単なる初期化子。
すなわち、
char array[] = "hoge"; /* 宣言と同時に初期化 */

char array[] = {'h','o','g','e','\0'};
と同じで5バイト。

これが"配列の配列"になっても同じ。だから

>>434
> 上は5*4=20

で良い。


一方、下はポインターの配列を宣言すると同時に文字列リテラルの
アドレスを代入してるのでスタックにポインター分と書き込み禁止領域に
文字列リテラル分のメモリー消費でイイんじゃない
(処理系に依存すると思うけど)


# const 指定すれば上も変更できないからどっちでもって感じ >>428
>440
下でリテラルを含めるなら、上もリテラルを含めるべきでは?
442438:02/04/27 23:10
>>439
なら、OK。
と言うことで、上は 4 * 5 = 20, 下は 4 * 4 = 16 バイトがスタック
に取られる。後、双方とも 2 * 5 + 2 * 4 = 18 バイト文字列領域が
必要。(正確には、最低限は。VC なんかだと、文字列の先頭アドレスを
4 バイトバウンダリにおいたりするので、パディング分が更に増える。)
>>441
ん?
よく考えてみな。
5*4 = 20の5は下の文字列リテラルに当たる、文字配列分。
char array[] = {'h','o','g','e','\0'};

は初期化。

char *array = "hoge";

とするとこれはポインターへのアドレスの代入(==コピー)。

違いワカル?
>443
そーじゃなくて。スタックに確保した5*4を埋める為の
「元の」文字列はどこにあるのよ?
446デフォルトの名無しさん:02/04/27 23:19
>434
違う。幅が不揃いの配列は作れない。
>>446
揃ってるけど・・・
448444:02/04/27 23:25
ゴメソ

char *array = "hoge";

これも"初期化"なんだけど、ポインターの指し示す先は別にあって、
配列には文字を格納してるって事。
char p[][5] = … は(5+α)*4バイトの領域が用意される。それに対し
char *p[] = … は(5+α)*2+(4+α)*2+ボインタのサイズ*4バイトの
領域が用意されるから、char p[][5]の方が、必要なサイズは小さいと思う…。
>>444
char *array = "hoge";
これも初期化だろ。

char *array; array = "hoge";
だったら代入だが。
>>450
それ同じ
452450:02/04/27 23:30
スマン、書いてる間に本人に訂正されてしまった。吊って来る。
453441:02/04/27 23:31
つまり、この話は、
char str[] = "abcd";と
char *str = "abcd";
の比較と等価なわけだな。

で、下が、ポインタ4+リテラル5なわけ。
上は、配列5+リテラル5なわけ。
なぜかっちゅーと、上は、内部的には
char str[5]; strcpy(str,"abcd");
と等価で、リテラルの"abcd"が
消えて無くなるわけではないから、

何で誰も K&R とか $18 の規格書を引用しないのか。
>char str[5]; strcpy(str,"abcd"); と等価で
うそつくな。
こんなもんは実装依存だ
456デフォルトの名無しさん:02/04/27 23:37
晒しage
LPSTR TextLine[2]={"0","0"};
LPSTR Text[7]={
"あああああああああああああああああ",
"いいいいいいいいいいいいいいいいい"
"ううううううううううううううううう",
          ・・・・・
}

//文字数の調査(文字が長かったら,2行にして表示)
ByteNum=strlen(Text[Seen-1]);
if(ByteNum >= 10){
strncpy(TextLine[0],Text[Seen-1],10);
strcpy(TextLine[1],Text[Seen-1]+10);
}
else{
strcpy(TextLine[0],Text[Seen-1]);
}
配列Textの文字数が長かったら,TextLine[0]とTextLine[1]に分けたいのですが,
うまくいきません。
strncpyで,TextLine[0]にテキストの途中まで入れるのは,あっていると思うんですけど(バグりますけど),
TextLine[1]にTextLine[0]に入れたテキストの続きをどのようにして入れればいいのかわかりません。
LPSTR?
LPSTRってWin32APIで出てきたような機が
461悩みつづけて3ヶ月!:02/04/28 00:05
OS:Windows 2000
ソフト:Visual C++ 6.0
3次元配列を定義したいのです。
double val[3][100][100];
上記のように定義してコンパイル時にエラー及び警告は出ないのですが、
実行しようとすると、“メモリがwriteになれない”のような警告が出て
実行することが出来ません。
いろいろやってみたのですが、解決法がわかりません。
どうすればうまくいくのか教えてください。
Win32ではLPSTR = char *、だったかな?
つか、リテラルを書き換えようとするなよ‥‥
>>461
メモリを確保しすぎ
>461
それは、「実行中にエラーが発生した」といって、
「実行できない」とはまた区別するべきでしょう。
原因は「3次元配列の定義」以外の場所にあるでしょう。
がんばってDEBUGするように。
>462
8*3*100*100=240,000byteで確保しすぎかどうかは微妙なところ。
スタックに確保する量としてはでかい
466デフォルトの名無しさん:02/04/28 00:15
http://ascii24.com/news/i/keyp/article/2000/12/08/620623-000.html

リッチィー先生の画像ハケーン!!
>>464
すまんかった
>>461
static領域に確保すればどうでしょうか?

static double val[3][100][100];
469458:02/04/28 00:24
わすーれーないでー
はったんあみか
>469=458
>>462
471デフォルトの名無しさん:02/04/28 01:23
void func(void)
{
goto mejirushi;
......
mejirushi:
}

というコードに対し、問題なくコンパイルしてくれるgccと、;をつけろと言うVC++6.0はどちらが正しいのですか?
returnをつかわないあなたが一方的に悪いです。
473デフォルトの名無しさん:02/04/28 01:28
>>472
・・・・・。
じゃあ言い直し・・・・


while(1){
goto mejirushi;
......
mejirushi:
}

というコードに対し、問題なくコンパイルしてくれるgccと、;をつけろと言うVC++6.0はどちらが正しいのですか?
ジャンプ先ラベルには「本文」が必要。
つまり「;」をつけろというVCが正しい。
>>474
あ、なるほど。
ありがとうございました。
>473
continueしないあなたが一方的に悪いです(w
477475:02/04/28 01:36
>>476
いや、gotoを使うのが一番悪いです(w
ちなみに
mejirushi:;
なんてことはしないように。
mejirushi:
      ;
インデントをつけとくのがマナー。
479475:02/04/28 01:39
>>478
うっ!
今から直します。
(極力使わないようにしていてよかった・・・)
>>479
意地を張ってでも使わないのが正解。
>>475
適切につかうべし。

>>480
アホは去れ
482悩みつづけて3ヶ月!:02/04/28 03:07
アルゴリズム上どうしても値を保持しておきたいため、確保しておきたい配列なんです。
配列確保が出来るかどうかを確認するために以下のプログラムをコンパイルすると
当然のことながらdを使っていないという警告がでますが、エラーはでません。

#include<stdio.h>

void main (void)
{
int a=1;
double val[3][100][100];

printf("%d\n",a);

return ;
}
しかし、実行すると>461のようになってしまいます。
Cマスターの方々、どうか解決策をお願いします。
ヒープも使いたくないの?
>>482
3ヶ月も悩みなさんな。
>>468にもあるが、取り敢えず

static double val[3][100][100];

でやってみてくらさい。
ダメなら次善の策をうpするから。
>482
当方も、Win2000 VC6Sp5ですが、そのプログラムは
無事に実行されましたが。
>>482
スタック上にそんなでかいローカル変数を作ってはだめ。
double = 8byte なので 8*3*100*100 = 240KB 近くのサイズがある。
>>484の言うとおり、staticにするか、グローバル変数にしましょう。

デバグ用ならば #ifdef などを使って、必要なときだけ組み込む。
487悩みつづけて3ヶ月!:02/04/28 03:44
>485
すみませぬ。

double val[3][300][300] ; の間違いでした。

>484
static を使って定義したらうまく実行できました。
けれども、どうして実行できなかったのでしょうか?
488悩みつづけて3ヶ月!:02/04/28 03:46
>486
そうなんですか。
240KBくらいならいいのかと思っていました。
これで一度プログラムを組んでみます。
ありがとうございました。
>>488
スタック領域はCコンパイラにもよるが、デフォルトで64KB〜256KB程度。
オプションで設定すればもっと取れる。

でもこの中にはプログラムカウンタの情報や戻り値など、各種のデータを
入れるので、キツキツの使い方は危険。

staticはスタック領域ではなく、グローバル領域、もしくはヒープ領域に確保
されるので、スタック領域とは無関係にかなりの大きさを確保できる。どれ
位大きく確保できるかは、処理系依存。
(゚д゚)ハァ!? それじゃ、一桁ちがうじゃねーか。そんな間違いがあるか。
そんなことだから、超FAQのくだらねーことで悩むんだよ。このバカチンが。

いいか。自動変数は、VC++の場合はスタックに確保され、スタック領域は、デフォルトで1MB。
このばあい、valは約2MBなので「スタック使いすぎだぞ(゚Д゚)ゴルァ!」とWindowsが怒る。
staticにすると、メモリが別の場所で確保されるる。また、静的変数を格納する領域は、
スタックより広い。
491悩みつづけて3ヶ月!:02/04/28 03:57
>>489
そうだったんですか・・・!
いやぁ、助かりました。
私は、全くのプログラミング音痴(言語痴)なので!
本当にありがとうございました。
また分からないことがあったら、そのときはまた宜しくお願いします。
>>490
VC++はデフォルトで1Mバイトですか。Borland-C++も1Mバイトですね。
これらの設定はリンカオプションで指定できますね。
493悩みつづけて3ヶ月!:02/04/28 04:14
>>489
ちんぷんかんぷんな質問なのかもしれないのですが、
グローバル領域に確保できる変数領域っていうのはメモリの空き容量だけいけるのですか?
メモリが256MBならば、100MB程度は大丈夫とか!?
>>493
理論上、2GBまで
>>493
人に聞く前に自分で試してみろ。
実メモリは関係ない。スワップするだけだ。
>>493
仮想記憶という言葉をご存じかな?
もちろん実メモリが多ければ多いほど、ディスクスワップの頻度が減る。
フォトレタッチソフトをガンガン使う人がメモリ多く積むのはそのせい。
497悩みつづけて3ヶ月!:02/04/28 04:26
>>495
ごもっともです。すみませぬ。

>>496
仮想メモリですよね!?
意味はわからないのですが聞いたことはあります。
スワップというのは、ハードディスクとメモリ間のデータの行き来のことを意味しているんですよね!?
static領域で256M以上使用しようとすると、
「トータルイメージサイズが最大値 (268435456) を越えています」
とおこられます。
つかそういった環境依存の話を環境書かずにするなよ。
環境は485に明記してありますが何か。
501悩みつづけて3ヶ月!:02/04/28 04:33
OS:Windows2000 Pro
メモリ:512MB
CPU:Duron 850MHz
ソフト:Visual C++
>>500
>>498 = >>485 なんてお前にしかわかんないだろうが、バカ。
malloc() 使えや。
いつだったか、「24MBもスタックに取るのは取りすぎだ。」と言ったら「そんなことない。」と言われた。
相手の環境はどんなものだったんだろ。
私は1MBも取ったら取りすぎだと思うけど。
>>503
Unix だったら、いいんじゃない ? (自動拡張するからねぇ...。)
>>503
メモリなんか何百MBも積んでて一部ではGBにも突入している今の時代。
まぁいいんでないかねぇ。
>>505
可読性や実行速度で問題がなければいいんだろうけど、
自動変数として数十MB使うってのはやっぱり妙な気分がするな。
507デフォルトの名無しさん:02/04/28 11:30
RMSはプログラムの使用メモリが1MBを越えるまでは何も考えるな。
1MBを越えるようなら作りを考えろ、と言っていたな。
10年くらい前に。

>>502
お前の人間部分は失格。
>>508
まぁまぁ、マターリしようよ。
>>499 も、出来れば >>498 へのポインタつけてほしいな。
510デフォルトの名無しさん:02/04/28 12:32
VC++のスタックサイズって足りなくなっても自動拡張しないのですか?
>>510
リンクする際にスタックサイズは固定されてしまいます。
>>507
>概して、たった数メガしかメモリを使わないなら、メモリの使用を減らす努力を 行うことに悩まないように。
(GNU coding standard邦訳より)
>>510
デフォルトでは1MB分のメモリ空間が確保されていて、そこまでは自動的に拡張されます。
1MBを超えられる保証はありませんが、隣接するメモリが空いていれば拡張されます。
デフォルトの確保サイズは変更することができます。
>>513
それって、
char a[100];
と書いて、a[200] = '\x1a'と書いて、
たまたまa[200]が使われてなかっただけとか言うのと同じ事?
>>513
> 1MBを超えられる保証はありませんが、隣接するメモリが空いていれば
> 拡張されます。
これほんとか ? 隣接するメモリってなんだ ? とりあえず仮想空間って
言葉を理解してから喋ってくれ。
516デフォルトの名無しさん:02/04/28 14:30
>>515
>>513が正しい。仮想空間は1MB確保されていて、最初は確か4KBコミットされてるはず。
コミットができることが保証されるのは最初に確保した1MBまでで、そこから先は
隣接する仮想メモリ空間が *空いていれば* (reserveされていなければ)
伸びる。
517デフォルトの名無しさん:02/04/28 15:01
質問いたします。
VB用のDLLをBCCで作ろうとしているのですが、うまくいきません。
「DLL内に関数 "test"がありません。」 てな感じにVBに突っ込まれます。

あちこち巡って見たのだけど、VC向けの方法ばかりで、困ってます。
基本的にVCと同じ手順でやってみたのですけど・・・。

例えば、VBから a, b を受け取って a+b を返す関数をDLLに作る場合、
どう書けばVBから使えるでしょうか?
518デフォルトの名無しさん:02/04/28 15:03
ありがちな質問には答えられないなんて
DQN++VCD//#$
>>517
スレ違いだが、エクスポートするときの名前の問題じゃなかった?
>>519
同意。
クイックビューアとかmapファイルで確認。
後、stdcallしてないとか。
>>516
>隣接する仮想メモリ空間が空いていれば
これはMMUの動作を知っている人が見ればおかしな
表現だ。一体どういうことか説明せよ
522517:02/04/28 15:36
スレ違いだったか。それはスマソ。

__stdcall を関数名の前につけるのは聞いたことあります。
てか、どこぞでは「WINAPI」と書けとあったのでそう書いてたんですけどね。(同じこと?)

クイックビューア、昔は右クリックしたら出たのに最近見ないな…。
>>521
たまたま知ってるからって偉そうになるなよ
>>523
なっちゃったものはしょうがない
>>523-524
マターリマターリ(;´ー`)
526とおりすがり:02/04/28 16:08
>>521
そのスタックを使っているプロセス自身が拡張先のアドレス空間を使ってしまっていることも
あるってことじゃないの?
プロセス内から見えるアドレス空間は仮想メモリ空間とはいわないのか?(教えて偉い人)
>>526
割り当てられているアドレス空間すべてに
仮想メモリが割り当てられているとは限らない。
>>526
もちろんアプリケーションから見えるアドレス空間は仮想メモリ空間。

>そのスタックを使っているプロセス自身が拡張先のアドレス空間を
>使ってしまっていることもあるってことじゃないの?
空いている物理アドレスにリニアアドレスを
割り当てるわけだからその意味が分からない。

>>527
??。仮想メモリ空間というのは論理メモリ空間のことだよ
529515:02/04/28 18:28
>>516
その情報のソース希望。
Windows は知らないのだが、普通の OS は Heap は上から、Stack は下から
取っていって、ぶつかったら「メモリーがねぇぞ」とかいう風に実装すると思う。
大体今時の 32bit プロセサなら最低 1GB 程度のアドレス空間をプロセスに割り
当てているはず。
で、知りたいのは、「そこから先は隣接する仮想メモリ空間が *空いていない*」
状態ってどういう状態かを教えてくれ。
530526ではない:02/04/28 19:03
>>528
ここのリニアアドレスってどういう意味?x86用語でリニアアドレスというのが
あるのは知っているがそれだと話があわない。

>>529
SPARC版SolarisなんかではHeapとStackの間に共有ライブラリの空間を置い
たりするみたいですよ。ソースは『Solaris Internals』P.137。Intel x86版
Solarisはテキストの低位側にスタックを置くようです。なんでこんなふうに
するんだか。。。
リニアアドレスはページングによるメモリアドレス
>>531
知ったか厨は、でてくんな。

C言語の話か?
>>531
知らない厨は、でてくんな。
535デフォルトの名無しさん:02/04/28 20:55
>>532>>534
煽り厨はでてくんな。
お前らみんな別スレ逝け
537ロートル:02/04/28 21:17
>>529
1Gちかくスタック領域のところまでメモリをmalloc等で確保されてんだろうもちろん。
NTだと予約されたページでもアクセスされるまでは物理メモリ割り当てられないから
1G物理メモリなくてもそういう事はできる。
538デフォルトの名無しさん:02/04/28 21:22
グリグリ( ´ー`)σ)´д`)←>>536
SS==DSの時のスタックの飛び込み自殺と、セグメントリミットを越えたメモリアクセスと、
スワップファイルの容量不足を別けて考えられない人のスレッドはここですか?
>>539
そんなのは明らかに環境依存の話だからです。
漏れのターゲットなんてスタック10KB無ぇよヽ(`Д´)ノウワァァン!!
KB単位で取れるだけ、かなり恵まれてはいるんだが。
541515:02/04/28 23:31
>>537
やって見りゃわかると思うけど、malloc() なんか全然つかってなくっても、ス
タックに 1MB 程度取ると、エラーになるんだよね。まあ、printf() とかは
使ってるからヒープの使用量が 0 とは言わないけど、1GB なんてとても考えら
れないよ。
だから、>>516 のソース希望って書いてんのよ。

ちなみに、「予約されたページでもアクセスされるまでは物理メモリ割り当てら
れないから1G物理メモリなくてもそういう事はできる。」って言うのはおかし
い。Over commit について言ってんだろうけど、Over commit してない OS で
も「仮想記憶」をサポートしてたら、そう言うことはできるよ。できないのは、
1G の仮想メモリがない場合だよ。
>>515=529=541
横からごめん。
>>529で、Windowsは知らんって言ってるけど
VC++って、Windows以外にも対応してるの?
543542:02/04/29 04:48
書き忘れてた…
1年弱2chから離れてたから分からないけど
最近では、スレが違っても、あまり気にしないの?
これが最近の流行なら仕方ないが、そうでないなら
続きは、好きな所に行ってやって下さい。

VisualC++相談室
http://pc.2ch.net/test/read.cgi/tech/1017843192/
□□□VC 初心者質問スレ 2□□□
http://pc.2ch.net/test/read.cgi/tech/994129650/
C++相談室 part6
http://pc.2ch.net/test/read.cgi/tech/1018454705/
544デフォルトの名無しさん:02/04/29 05:49
>>543
C++相談室は違うだろ
545デフォルトの名無しさん:02/04/29 06:09
適切なスレがないねえ。
それより知ったか君がうざい
仮想メモリ空間が *空いてる* ってどういう意味?
解説キボン
547デフォルトの名無しさん:02/04/29 06:11
写真送ったら中元タンに会えるかな?
548デフォルトの名無しさん:02/04/29 06:11
誤爆しますた。スマソ
全てのユーザーメモリ空間を読み書き可能にして、
書き込みアクセスしたら物理ストレージを割り当てればいいと思う
550515:02/04/29 07:25
>>542
すまそ。スレ違いは、認識してんだが >>545 が言うように適当なスレなく
て。OS 板かなぁ...。
> VC++って、Windows以外にも対応してるの?
は、知ってて聞いてんだよね ?

>>546
ttp://www.asia.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/jpwinpf/_win32_virtualalloc.htm
あたりを読むと、いいかも...。

>>549
誰に対するレスなの ?
スタックとヒープ、gccはセグメントの両側から中央に向かって伸びる、
VC++はセグメントの中央から両端に向かって伸びる。
552デフォルトの名無しさん:02/04/29 12:23
while(fgets(line_buf, sizeof line_buf, stdin) != NULL){
・・・・・・・・・
}
このwhile文から抜け出すには、\nを実行中に入力すればいいんですよね?
でも、いくら\nと入力しても抜けれません
>>552
「\」「n」 と入力するんではなくて、\n は改行のことなので、エンターキーを押せばいいのじゃ。
・・・ネタ?
554553:02/04/29 12:28
>>552
書いてから気付いたけど、それって \n までじゃなくて、ファイルの終わりまで繰り返すんじゃない?
555デフォルトの名無しさん:02/04/29 12:29
エンターキー押してもだめでした。
ネタではありません 助けて
556552:02/04/29 12:35
>>554
ファイルの終わりって どのファイルの終わりまでなのでしょうか?
fgetsはどうやったらnullと返してくれるのですか?

>>552
fgets は改行の後に'\0'を入れて、文字列にします。

$ abc[return]

と入力すると、バッファーには
'a','b','c','\n','\0'
と格納される。

だから >>552 だと、入力がある限りいつまでたっても抜けられない。
抜けるには プロンプトから EOF 打ち込むか、
while ループの中で何か条件つけるとかしないと。

>>553
面白くない。
>>556
stdinが指すファイルの終わり(EOF)を検知したとき。
stdinが標準入力だとすると、EOFは検知することはないような気が・・・・・
559558:02/04/29 12:40
>>556
あ、、、EOFを入力すればいいのか・・
>>552
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fgets.3.html

fgets()の仕様。よく読んでおいて。
>>556
DOSなら CTRL+Z
UNIXなら CTRL+D
でEOFのような気がするけど、試してない。すまん。
562522:02/04/29 12:46
有難うございました
なにか条件をつけてループを抜ける事にします
だからCTRL+Zだっつーの
564522:02/04/29 13:05
>>563
visualC++を使っているのですがCTRL+Zだとプログラムそのものが
終わってしまいます
>>564
んなこたーない。
566デフォルトの名無しさん:02/04/29 13:47

Linux で kterm 使ってますが、EOF は ctrl-d です。

>>563 >>565
何使ってますか?
>>566
MS-DOS系統のOSは(Winも含めて) EOF は ctrl-z です。
ちなみにNT
568566:02/04/29 14:05

勘違いしました。
>>563 >>565 が EOF がわからないって言う話ではないのね。ゴメン。

>>522
fputs 等でコンソール上に出力するだけだったら、
EOF の入力と同時にプログラムが終了する場合もあります。

いっそのことソースコード出してみては?
ちょっと読み返して気付いた。
>>522 よ、お前は >>552 ではないのか・・・?
570Not 564:02/04/29 14:29
>>565
^Cで強制終了させたかのように終わるって(笑)
571デフォルトの名無しさん:02/04/29 14:44
szstr = (char *)malloc()
がある関数の中だけ、例外と違反のエラーを
かえすんだけど、その原因はなんだったっけ?

前にも一回あって解決したんですけど忘れてしまいました。

szstr = のところに原因はないっす。
とりあえずszstr = とりのぞいてもエラーはでるっす。

static とか関係あったんだっけかな・・・・
572デフォルトの名無しさん:02/04/29 14:47
>>571
mallocの引数は?
573デフォルトの名無しさん:02/04/29 14:50
引数に具体的な数字、256とか入れても
だめだったよ。
>>573
とある関数って言われてもわからない。
575デフォルトの名無しさん:02/04/29 14:58
WINAPIなんだけど、ダイアログプロシージャ
の中で自作関数GetAHref(){
lpszlist = szlist;(ポインタのポインタ)
....
*lpszlist = (char *)malloc(nlen +1);
lpszlist ++;
}
を呼んでる。
わけわかんないからとえあえず
char **szlist;
をグローバルで宣言。
>>575
szlistはmallocなどで初期化されているよね?
577デフォルトの名無しさん:02/04/29 15:02
されてる。ZeroMemoryもした。
(というか、"*lpszlist = "の部分抜かしても
やっぱりmalloc関数自体エラー返すから。)
>>577
どういう風に初期化したの?
そこだけコードをみせてくれない?
579578:02/04/29 15:07
ん?mallocがエラーを返すってNULLを返すってこと?
それは単にメモリーの確保に失敗しただけなんじゃ・・・・
580デフォルトの名無しさん:02/04/29 15:09
char **szlist;(ぐるーばる)
.......
case WM_INITDIALOG:

szlist = (char **)malloc(256);
ZeroMemory(szlist,256 * sizeof(char **) );
..........

case FD_CLOSE:
GetAHref();(szlistはグローバルだからここでは引数として与えてない)
break;

・・・・まずいかな。
581デフォルトの名無しさん:02/04/29 15:10
>>579
NULLを返すんじゃないんだよ。
NULLさえ返さず失敗してページ違反エラー返すの。
MessageBox();でチェックしたから。
>>580
あ、やっぱり・・・・
szlist=(char **)malloc(sizeof(char **)*256);
こうでしょ。
ポインターひとつが1バイトだとは思えないし。

多分ZeroMemory()でアクセス違反が起きているはず。
>>582
結局同じ事だけど正確にはこうじゃないの?
szlist = (char **)malloc(sizeof(char *) * 256);
584デフォルトの名無しさん:02/04/29 15:17
あーーーーーーーーーー
生きてるってなんですかーーーーーーーああ
>582
もうこれだからやだよ・・・・・
static とか未だによくわかってないから
自信なくて自分で答え出せないんだよな
・・・
さんきゅー。
(ZeroMemory()のとこでは明示的にアクセス違反が
表示されないのが味噌だよな・・・)

>>583
あ、、、
>>584
staticとかじゃなくて単に確保したメモリーの量が少なかっただけ。
charは1byteだから普通はsizeof〜は書かないけど。
587デフォルトの名無しさん:02/04/29 15:20
ポインタへのポインタ型が、ポインタ型と同じサイズである保証はないね。
まあ、ヘタレのいじれる環境では、結局おなじことだけど。
588デフォルトの名無しさん:02/04/29 15:21
>585
俺もあ、と思ってもどってきた。
>>587
はぁ?
何を指そうがポインタはポインタだろ。
だからこそvoid *なんてものが実現するわけだし。
>>587
勉強不足だな。
ポインタはある特定のアドレスを指し示す変数だから、
ポインタへのポインタもポインタだよ。
591デフォルトの名無しさん:02/04/29 15:26
やめろよばーろー
私のために喧嘩しないで☆
ポインタはポインタでも、
大きさが違うことはあり得るよ。
DOSのプログラムとか。

まあ、この場合はたぶん大丈夫だろうが。
まー、>>589-590は一生32bit環境だけつかってなさいってこった
594デフォルトの名無しさん:02/04/29 15:33
まぁそれを考えるなら、
一次配列の方が使用頻度が高いから
sizeof(char **)<sixeof(char *)
だろうね。
char **はそんなつかわないから
大きい数字必要ないっしょ。
(591)

595デフォルトの名無しさん:02/04/29 15:34
>>593
bit数がどう関係あるんだ?
よけいなつっこみをされたくなけりゃ、厳密に型を指定しろってことだね。
あのさ、あらゆるシステムでポインタのサイズが同じだと言っているんじゃないぞ。
同じシステムではポインタのサイズは何を指そうが同じだと言っているんだよ。
>>595
一般的な32bit環境のコンパイラはすべてのポインタが32bit=4byteだから。
それ以外の環境は見たこと無い。
64bit環境だと32/64bitポインタ混在だったりする。
gccのvoid*型が64bitで、型へのポインタが32bitだったり
>>598
なんのメリットがあるの?
>>599
俺に聞くな
>>600
まあそうだけど。。。

わけわからん・・・・void *なら指せても、char *なら指せない領域ができるってことだよね?
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=utf8&oe=utf8&q=void%2A+64bit+%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF

http://www2.airnet.ne.jp/pak04955/ramble-199912.htm
>ポインタ変数の大きさはintの大きさと同じではない。現状sizeof(int) = 4, sizeof(void*) = 4の環境が多いが,64bit環境ではsizeof(int) = 4, sizeof(void*) = 8となる場合がある。
>>602
誰もそんなこと言っていないぞ。誤爆?
コメント入れた方がよかったか?
一番上の条件でググって、上から3番目の貼り付けたリンクに、
引用部分の記述があるぞ
>>604
そういう意味じゃなくて、
このスレの誰もがそんなこと言っていないと言ったの。
#include <stdio.h>

int main(void){

printf("sizeof(char *): %d\n", sizeof(char *));
printf("sizeof(int *): %d\n", sizeof(int *));
printf("sizeof(float *): %d\n", sizeof(float *));
printf("sizeof(double *): %d\n", sizeof(double *));
printf("sizeof(void *): %d\n", sizeof(void *));

printf("sizeof(char **): %d\n", sizeof(char **));
printf("sizeof(int **): %d\n", sizeof(int **));
printf("sizeof(float **): %d\n", sizeof(float **));
printf("sizeof(double **): %d\n", sizeof(double **));
printf("sizeof(void **): %d\n", sizeof(void **));

printf("sizeof(char ***): %d\n", sizeof(char ***));
printf("sizeof(int ***): %d\n", sizeof(int ***));
printf("sizeof(float ***): %d\n", sizeof(float ***));
printf("sizeof(double ***): %d\n", sizeof(double ***));
printf("sizeof(void ***): %d\n", sizeof(void ***));

.
.
.

return 0;
}
>>606
どうでもいいが%uにすべき。
608デフォルトの名無しさん:02/04/29 17:27
#include<stdio.h>
void main (void)
{
double lex,let,rix,rit,x,tei,answer;
printf("左辺のxの係数を入力して下さい\n");
scanf("%d",&lex);
printf("左辺の定数を入力して下さい\n");
scanf("%d",&let);
printf("右辺のxの係数を入力して下さい\n");
scanf("%d",&rix);
printf("右辺の定数を入力して下さい\n");
scanf("%d",&rit);
x=lex-rix;
tei=rit-let;
answer=tei/x;
printf("方程式の解 x=%.2f\n",answer);
  }

これコンパイルするとエラーがでるんです。
超初心者なのでなにも分かりません。
どこが間違ってるのかおしえてください。

ポインタのポインタ型とポインタ型が同じ大きさである保証は無いが
普通は同じでしょう?
610デフォルトの名無しさん:02/04/29 17:30
>>608
%dは整数型のみ。
double型なら%lf
float型なら%f
611610:02/04/29 17:31
scanfの場合な。
>>608
だからそのエラーを書けよ。
たとえコンパイルできても%dはやめといたほうがいいぞ。
>>608 まず%dは整数ですよん
doubleならlfだったキブーン
614デフォルトの名無しさん:02/04/29 17:34
#include<stdio.h>
void main (void)
{
int lex,let,rix,rit,x,tei,answer;
printf("左辺のxの係数を入力して下さい\n");
scanf("%d",&lex);
printf("左辺の定数を入力して下さい\n");
scanf("%d",&let);
printf("右辺のxの係数を入力して下さい\n");
scanf("%d",&rix);
printf("右辺の定数を入力して下さい\n");
scanf("%d",&rit);
x=lex-rix;
tei=rit-let;
answer=tei/x;
printf("方程式の解 x=%d\n",answer);
  }

このように最初の宣言をdoubleからintに変更したのですが

COMMAND.COM /C BCC32.EXE 一次方程式の解.c
*** コンパイル開始 ***
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
一次方程式の解.c:
エラー E2206 一次方程式の解.c 17: 不正な文字 ' ' (0x8140)(関数 main )
*** 1 errors in Compile ***
*** コンパイル終了 ***

となってしまいます…
615デフォルトの名無しさん:02/04/29 17:35
>>614
全角スペースを入れていないか?
>>614
そりゃ、全角のスペースが17行目に入ってる罠。
>>614
まさかとは思うが、その最後の } の前の全角スペースは、
コピーミスじゃなくて、オリジナルにもついてるのか?
618615:02/04/29 17:36
それと、ファイル名に全角文字は使わない方がいいよ。
619デフォルトの名無しさん:02/04/29 17:36
>>615
その可能性はあります。
探してみます
>>614
最後の } の前に全角空白はいってるのが駄目。
コメント以外で全角文字つかっちゃ駄目だよ。
前からそうだったが、このスレは親切だな・・・。
>>620
文字列定数ならOK
623デフォルトの名無しさん:02/04/29 17:37
みなさん、ありがとうございました。おっしゃるとおり全角スペースが入ってました。
次からは気をつけます。
624デフォルトの名無しさん:02/04/29 17:37
>>614
思いっきり全角スペースが一番最後に入ってるやんけ
C/C++は全角文字は入れちゃだめなのよ、文字列とコメント以外はね
>>622
スマソ。ころっと忘れてた(w
626624:02/04/29 17:39
さすが、ダイヤルアップ&テレホしか入ってないから遅れたな(゚Д゚)
627 :02/04/29 17:48
遅レスだがポインタの大きさが参照先の型毎に同じか違うかは機種依存みたいすね
結論は 609 さんが正しい気がする

http://www.catnet.ne.jp/kouno/c_faq/c5.html#17
628デフォルトの名無しさん:02/04/29 18:06
#include<stdio.h>
void main (void)
{
float lex,let,rix,rit,x,tei,answer;
printf("左辺のxの係数を入力して下さい\n");
scanf("%f",&lex);
printf("左辺の定数を入力して下さい\n");
scanf("%f",&let);
printf("右辺のxの係数を入力して下さい\n");
scanf("%f",&rix);
printf("右辺の定数を入力して下さい\n");
scanf("%f",&rit);
if(lex!=rix)
{
x=lex-rix;
tei=rit-let;
answer=tei/x;
printf("方程式の解 x=%.2f\n",answer);
}
else if(let==rit)
{
printf("解は全ての実数\n");
}
else
{
printf("解なし\n");
}
printf("終了します。Enter キーを押してください。");
rewind(stdin);
getchar();
return 0;
}

整数から実数に拡張するためintをfloat、%dを%fに変更したのですが
どんな数値を入れても解が0.00になってしまいます…
何がおかしいのでしょうか?
629デフォルトの名無しさん:02/04/29 18:06
ポインタのポインタ型はポインタ型だろう?
>>628
実数の場合は==や!=で同じかどうか判断するのはやめた方がいいみたい。
もっとも、この問題には関係ないけど。
>>628
そういうの作るときはさ、
入力受け付けた後にその値を一度出力してみるんだよ。
632デフォルトの名無しさん:02/04/29 18:08
>>629
そうだけど、指し示すものによって大きさを変えるひねくれた環境もあるんだってさ。
633デフォルトの名無しさん:02/04/29 18:10
教えて君に親切にありがとうございます。
>>631で言われたとおりにやってみます。
>>629
そうだよ。
だけど、アドレス幅は型に依存する。
>>628
%fでなくて、%lf。
636デフォルトの名無しさん:02/04/29 18:19
>>635
floatなら%fだよ。
%lfはdouble
>>635
floatだから%fでいいんでない?
638デフォルトの名無しさん:02/04/29 18:20
#include<stdio.h>
void main (void)
{
float lex,let,rix,rit,x,tei,answer;
printf("左辺のxの係数を入力して下さい\n");
scanf("%f",&lex);
printf("左辺の定数を入力して下さい\n");
scanf("%f",&let);
printf("右辺のxの係数を入力して下さい\n");
scanf("%f",&rix);
printf("右辺の定数を入力して下さい\n");
scanf("%f",&rit);
/* printf(" %f %f %f %f\n",lex,rix,let,rit);*/
if(lex!=rix)
{
x=lex-rix;
tei=rit-let;
answer=tei/x;
printf("方程式の解 x=%.2f\n",answer);
}
else if(let==rit)
{
printf("解は全ての実数\n");
}
else
{
printf("解なし\n");
}
printf("終了します。Enter キーを押してください。");
rewind(stdin);
getchar();
return 0;
}


>> printf(" %f %f %f %f\n",lex,rix,let,rit);
この行を追加したらなぜか上手くいったので
コメントにしてみたらやっぱり上手くいきました。
こんなことってあるのでしょうか
>>638
コンパイル忘れて古いファイルを実行してたとかね。
無いことは無い。
640デフォルトの名無しさん:02/04/29 18:26
>>638
そういえばなんでrewind(stdin)しているの?
641 :02/04/29 18:27
それよか
void mainなのに return 0; するとコンパイラがワーニングはくと
思うんだけど、なんで無視すんのよ。
642デフォルトの名無しさん:02/04/29 18:28
>>640
作成されたexeファイルをダブルクリックで実行すると処理が終わった瞬間ウィンドウが
閉じてしまうのでそれを防ぐために入れています。
>>639
僕がうっかりしていたという以外の理由はないのでしょうか?
643640:02/04/29 18:30
>>642
それはgetchar()でしょ?rewindはいらない。    
644 :02/04/29 18:34
getchar()一個だけだと最後のscanfの改行が残ってて、
ウィンドウ閉じそうに見えるけど。違うかな?

645デフォルトの名無しさん:02/04/29 18:50
すみません、飯食ってました。
ホームページで「意味が分からないならとりあえずそのまま書き込んでおけ」
というような感じだったのでそのままコピペした部分もあります。
だからどういう意味なのか良く分からないという部分が結構あるのです。
>>645
そのホームページはどこ?

と、祭を誘ってみるテスト。
晒せ!晒せ!晒せ!
648デフォルトの名無しさん:02/04/29 21:39
>>634
C99ではそうなったのか?C89ではそんなことないぞ。
C89ではアライメント制限以外に制限無し。char*, void*に入れて戻せないポイ
ンタは無い。ただし関数へのポインタを除く。
649教えて君です:02/04/29 21:44
あの〜Cのコンパイラ欲しいんですけど、
win2000でも動くやつでいいやつどなたか知りませんか?
98SEをゲストOSで使うの飽きちゃって、
どなたか教えてください。
>>649
OS関係あるのか?
とりあえず Borland C++ Compilerがフリーだからそれでも使っとけ。
652教えて君です:02/04/29 21:50
>>650
FAQってふぁっきゅーって読むんですか?
>>651
visual C++ 6.0 動かないんですよ〜2000だと(涙
>>652
どちらかというと2000などのNT系でよく使われているぞ。
つまり仕事でな。
>>652
それはWin2kの所為じゃなくて、あんたの環境の所為
>>652
お願いだからそんな恥づかしい読み方しないでくださいw
エフエーキューって俺は読んでるけど…

俺は2000でVC6動いてるよ。SP5にした?
OS再インストール…ってわけにはいかないかねw
ファッキューが普通じゃねぇ?
if(mona == YES){
monadazo(eyei);
}
else{
monajyanee(utudazo);
}
ahya -> BltFast(0,0,---,---,DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);

if(mona == YES) monadazo(eyei);
else monajyanee(utudazo);
ahya -> BltFast(0,0,---,---,DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
どちらが可読性がありますか?
>>656
俺もそう読んでいる。
659デフォルトの名無しさん:02/04/29 21:57
>>657
改行しているから上
>>656>>658
ガーン…
大学の研究室に女の子いるから絶対そんな風には言えん…

>>657
tabが反映されなくてどちらも読みづらい罠
>>657
if と { が同じ行だから上も駄目。
>>657
今は前者を推奨しているケースが大多数
663デフォルトの名無しさん:02/04/29 21:59
>>660
女の子もファッキューと読んでいます。
>>661
関数以外は同じ行でないと読みにくい。  
>>657
オレもふぁっきゅー上。
これ以上は戦争になるからやめよう。
>>661
俺的それは無い。
if
}
while
}
switch
}
てな感じじゃないと嫌。
>>659-667
サンクス
これから会社行って直してくる
漏れならこう書く。

if(mona== YES) {
  monadazo(eyei);
} else {
  monajyanee(utudazo);
}

ahya->BltFast(0,0,---,---,
       DDBLTFAST_SRCCOLORKEY| DDBLTFAST_WAIT
       );
670教えて君です:02/04/29 22:12
SP5ってNTじゃないんですか?
ifの書き方は669に一票。

>>670
だね。2000はSP2までだと思う。
あとVC++のSPも当てておくのが吉かと。
672デフォルトの名無しさん:02/04/29 22:16
>>670-671
VC++6.0のことだろ(ワラ
673:02/04/29 22:16
このプログラムをコンパイルしようとすると
”関数は値を返すべき”
というエラーがでます。

どっかおかしいでしょうか?

#include <stdio.h>

/*fahr = 0,20,40・・・・・・・300に対して、摂氏ー華氏対応表を印字*/

main()
{
int fahr, celsius;
int lower, upper, step;

lower = 0; /* 温度表の下限 */
upper = 300; /* 上限 */
step = 20; /* 刻み */

fahr = lower;
while (fahr <= upper) {
celsius = 5 * (fahr - 32) / 9;
printf ("%d\t %d\n",fahr,celsius);
fahr = fahr + step;
}}
mainの型が省略されたらintが入るんで無かったっけ?
675デフォルトの名無しさん:02/04/29 22:18
>>673
main関数の戻り値の型が省略されているからint型の値を返すべき。
>>673
返り血を明示的に指定しない関数はint型とみなされます。
基本だろ…。
>>673の最後の
}}
がすげーやだ。
678:02/04/29 22:23
すみません、main関数、intの値を返す
ってのが良く意味分からないんですが・・・・・・・・・
>>673
警告とエラーの区別くらいはつけような。
>>678
main()の中の好きな場所にreturn 0;とでも書く。
681デフォルトの名無しさん:02/04/29 22:26
>>678

char func()はchar型を返すでしょ?
この型を省略して、func()と書くと戻り値の型がint型とみなされて、必ずint型の値を返さなければならなくなるの。
戻り値を持たないのならvoid func()とかく。

とりあえず最後の行にreturn 0;と書いておけ。
>>678
勉強不足。
本読んで意味がわかるようになってから質問してください。
683教えて君です:02/04/29 22:27
>>672
意味がわかりました!!
恥ずかしいので
憤死します!!
684:02/04/29 22:27
どうもありがとうございました
>>680
鬼だ・・・
>>681
}}になってるから、最後の行に書いても悲惨なことに・・・
>>673
それK&Rの11ページだろ
明日本屋逝ってもっと薄いCの入門書買ってこい
687:02/04/29 22:30
プログラミング言語Cのサンプルプログラム
をそのまま写したのですが、駄目なんですね。
K&RはANSI準拠じゃないから時代に合わない。
>>687
あー、本当にreturnがないねぇ・・・・・
>>688
第二版はANSI準拠だが・・・・
K&R駄目なのかよ・・・
やけに日下部が進めるから今度買おうと思ったのに・・・
後ろの方ではきちんとreturnしているな。
たとえば166ページ。
>>690
そうなのか。じゃあ>>673が持ってるK&Rは年代物なんだな。
>>693
第二版だけどはじめの方に載っているサンプルはreturn 0していなくて、後の方に載っているサンプルはしている。
>>691
辞書として一冊はもってたほうがいい。
ただ、K&Rだけで勉強しようとするとつらいので、
K&Rオンリーってのはお薦めできない。
>>695
いえてる。
私は他の本で勉強した後に間違って覚えたことや無駄なことを直すためにK&Rを読んだ。
辞書と言うには正確性が...

言語の開発者の思想書だと思って、
書き方のスタイルとか、標準ライブラリの実装法とか、
そういう「ココロ」を汲みながら読むのが正しいだろう。

K&Rの例題くらいはきちんとやっておけよ。
別売りの本まで買って答え合わせする必要はないが。

698686:02/04/29 22:45
>>691
おっと、スレ違いになるからこれ以上書かないけど
K&Rが悪いんじゃないぞ
あまりに >>673 が勉強しなさ過ぎるから書いただけだぞ。

「main関数ってナニ」って状態でいきなり2chに聞くなゴルァ
ってこった。
699デフォルトの名無しさん:02/04/29 22:49
僕ならvoidつけちゃうな〜
って遅いか(w
700691:02/04/29 22:49
思いがけないレス、サンクス。
第2版が最新だよね(1のリンク先より)。
なぜ『ホーキング、未来を語る』と”あわせて買いたい”のかは謎だが・・・
いや実際読みたいけどさ、ホーキング。
おまえには聞いていない>>686
まっさらな素人がK&Rで入門しようとすると例題のどれかで挫折する可能性極大
でも、昔のCってマニアックで楽しかたーね。
省略は int アドレスも int 。
{も1文なら省略って、暗号みたいだた。
3重くらいのforループの一番深いところから一気に抜けるには
gotoを使えばいいんでしょうか?
本来ならそういうループ構造にしないのが一番いいんでしょうけど(−−;
705デフォルトの名無しさん:02/04/29 23:21
>>704
質問はageで。

gotoかフラグ変数で。
706705:02/04/29 23:21
一気にというならgotoのみだな。
試しにどんなループだか書いてみ?
704
return
>>708
ちょっと待て(笑)
710 :02/04/29 23:27
>>648
void* から任意へのポインタへの型変換とその逆は保証されてるっていうのは
アドレス幅が違う場合は処理系がうまく動くように補正してくれるよって
ことで、幅が同じじゃなきゃいけないとかは保証されてないと思うよ。
つまりunsinged longとかでポインタをキャストして無理矢理計算するみたいなやりかたはダメなはず
でも漏れは厨房なのでアライメント制限の意味がわかりません。
あらゆるポインタはvoid*と相互変換出来るけど、
それ以外の型は規定されていないというだけじゃないか?
712デフォルトの名無しさん:02/04/29 23:31
すいません。
Cのソースファイルを
コマンドプロンプトで
コンパイルして実行しようとすると、
ファイルを開くアプリケーションの選択
っていうウィンドウが出てくるんですけど、
どうしたら上手く実行できるのでしょうか。
ちなみにコンパイラはボーランドのフリーのコンパイラを使っています。


>>712
そんなはずはないよ。
そのコンパイラが出力するファイルは*.exeのはずだからそのまま実行できるはず。
ポインタの変換については、
とりあえず、K&Rの242ページから読んでみろ。
>>712
ム板で質問する以前の問題だな。どっか初心者板逝け。
716デフォルトの名無しさん:02/04/29 23:41
#include<stdio.h>
#include<stdlib.h>
void main(main)
{
int s,i,x,s1=0,s2=0,s3=0,s4=0,s5=0,s6=0;
float d1,d2,d3,d4,d5,d6;
printf("サイコロを振る回数を決めてください。\n");
scanf("%d",&s);
for(i=1;i<=s;i++)
{
x=(int)(6*(rand()/32767.1)+1);
printf("%d ",x);
switch(x){
case 1:s1++;break;
case 2:s2++;break;
case 3:s3++;break;
case 4:s4++;break;
case 5:s5++;break;
case 6:s6++;break;
}
}
printf("\n");
printf("%d回振った結果1は%d回、2は%d回、3は%d回、4は%d回、5は%d回、6は%d回出ました。\n",s,s1,s2,s3,s4,s5,s6);
d1=(float)(s1*10000/s);
d2=(float)(s2*10000/s);
d3=(float)(s3*10000/s);
d4=(float)(s4*10000/s);
d5=(float)(s5*10000/s);
d6=(float)(s6*10000/s);
d1=d1/100;
d2=d2/100;
d3=d3/100;
d4=d4/100;
d5=d5/100;
d6=d6/100;
printf("1は%.2f%2は%.2f%3は%.2f%4は%.2f%5は%.2f%6は%.2f%です。\n",d1,d2,d3,d4,d5,d6);
printf("終了します。Enter キーを押してください。");
rewind(stdin);
getchar();
return 0;
}

このようなプログラムを書いて実行してサイコロを500000回振ったのですが
2回とも同じ結果になりました。
毎回違った結果が出るようにするにはどうすればいいのでしょうか?
srand(time(0));
718デフォルトの名無しさん:02/04/29 23:47
>>717の方は僕に答えてくれたんですよね?

x=(int)(6*(rand()/32767.1)+1);

x=(int)(6*(srand(time(0))/32767.1)+1);
にしたのですがエラーがでてしまいます。
>>718
お前は使ってる関数がどんな機能なのか調べもせずにプログラム書くのかよ。
720デフォルトの名無しさん:02/04/29 23:49
>>19
すみません、昨日プログラミング始めたばかりなので全然わからないんです。
721 :02/04/29 23:50
>>718
面白い
>>718
srand()は値を返さんぞ。
>>718
srand()
rand()
time()
これらの関数が何をするのか解ってる?
単に言われたことをコピペするだけじゃ成長しないよ。
天然はオモロイね
725デフォルトの名無しさん:02/04/29 23:53
>>723
おっしゃるとおりです。rand以外あるいはそれすら全然意味が分かりません。
しかし調べても書いてあるころがさっぱり理解できないのです。
>>720
それは719で指摘されたことに対する言い訳にもならない。
ちゃんとどんな機能か調べてから書け。
もしシステムを破壊するような命令だったらどうするんだ?
>>725
理解できるようになってから質問してください。
>>726
言えてる、特にここは2chだし。
729デフォルトの名無しさん:02/04/29 23:56
俺、常識ないんですけど、htmlからURL引っこ抜くときって
どうします?strstr(szbuf,"http://")
ここらあたりは常識っぽいんですけど、あと、は、そこから、
「.」と「/」と、空白および記号を意識しつつIsCharAlphaNumeric
とか使うのは常識ですか?
CreateFile関数の第一引数のファイルを指定する所で,
フォルダの中に入っているファイルを参照させたいのですがうまく行きません。
"data/Data.dat"や,"data\PlayerData.dat"ではないようです。
CreateFile(ここ,-,-,-,-,-,・・・);
>>729
IsCharAlphaNumeric ってWin32API…だよな?
>>729
RFCにURIに使える文字が定義されてる。
>>725
http://pc.2ch.net/prog/kako/1000/10005/1000542653.html
このスレを参考にして良さそうな入門書を明日買ってくること。
そして最初から最後まで読破するように。
734デフォルトの名無しさん:02/04/30 00:01
どうもありがとうございました。
求めていた答えは得られなかったけど
それ以外のこといろいろ得ることができました。
もっと本読んで勉強します。
>>734==725?
srandくらいググればいっぱいヒットするんじゃない?
srandって名前が得られただけでもだいぶいい収穫だと思うよ。
736デフォルトの名無しさん:02/04/30 00:05
標準ライブラリにmemmoveってあるじゃないですか
あれのK&Rにあるオーバラップしても動くってどんなことをしても動くんですか?
何する気だテメー
738デフォルトの名無しさん:02/04/30 00:06
>731
まぁ、そうとも言う。Cでも似たようなのあるけどさ。
全部小文字だから許せない(嘘)
で、常識を教えてくれ。(下さい)
739shige:02/04/30 00:08
関数名は「小文字 + アンダースコアつなぎ」が常識!!!
プログラミング言語はRubyがさいこーが常識!!!!
>>730
おしい。
"data\\PlayerData.dat"
じゃない?
>>737
あなたレスで笑い出す俺はいまヤヴァいんだろうか…
>>738
日本語.comが使える時代にIsCharAlphaNumericなんて役に立たんぜよ。
743デフォルトの名無しさん:02/04/30 00:10
うわ!はえーんだよ!それよか常識おせーろYO
>>741
だいじょうぶ。オレもちょっと面白かったから。
>>743
空白か改行か多バイトコードが出現したら、そこで切ればいんじゃない?
>>743
スペース、括弧、クオーテーション、カンマ以外全部だと思ってればいいんでない?
>>743
常識なんてないだろ…
748746:02/04/30 00:15
あ、カンマは駄目だ、使われてるの見たことある気がする。
749デフォルトの名無しさん:02/04/30 00:15
それじゃぁ「...html> 」とかなってるとき駄目ジャン。
やっぱでもあれだ、IsCharAlphaNumericで、.と/だけ飛ばす、と、
いうので、決行完璧なのだろうか。
>>740
親切にありがとうございました。
うまくいきましたよ。
もっと文字列勉強します。
751デフォルトの名無しさん:02/04/30 00:18
日本語.comどうすんだよ。あぁ、あれか、mblen使うのか、
それかあれだ、CharNextとか使うのか、あーかったるい。
ちょっと待て、~もあるじゃないか。。。
>>751
つまり結論として、URIとして使っていい文字かどうか調べるより、
使っちゃいけない文字かどうかを調べたほうが手っ取り早いぽい。

もしくは、使っていい文字かどうかのフラグをがつっとテーブルで持つ。
char uri_valid_chars[] = {0,0,0,0,0,1,1,1,1,0,0,0....}
みたいな。
実際使おうとすればなんだって使えるんだよ。
用途がわからんので詳しくはわからんが、
HTML中からリンクを抽出するのが目的なら、
"javascript:func('A',\"B\")"
だってありえるぞ?
%7eとかどうすんだよw
756デフォルトの名無しさん:02/04/30 00:23
オメーラ 素直に strtok() ススめろよ。
あ〜〜、どっかにURI判定ライブラリとかありそうな罠。
htmlからURIを引っこ抜くなら、
俺なら、定義が楽なタグの中だけにするけどな…。
file:///C:\Windows\winmine.exeとかのリンクはどうするよ?
index[1].html
とかもありえる。
C言語が余り関係なくなっているような気がする真夜中
762デフォルトの名無しさん:02/04/30 00:30
>>716
float d1,d2,d3,d4,d5,d6;
srand(time(NULL));    <-- ここらで。
printf("サイコロを振る回数を決めてください。\n");

謙虚な奴にはおしえてやれよー。
勉強し始めは動くのが大切なんだからー。
謙虚じゃない奴には遊びまくってるな(w
764デフォルトの名無しさん:02/04/30 00:32
だから strtok() でいいだろーよ。
>>764
だとしてもその引数に何を渡すか問題だ・・・
>>762
ついでに、736にも答えてあげれば?
767762じゃないけど:02/04/30 00:42
今K&Rが手元にない・・・(´・ω・`)ショボーン
いと○っさんめ!
769デフォルトの名無しさん:02/04/30 00:43
rfc 2068: Hypertext Transfer Protocol -- HTTP/1.1
で、区切り文字調べろ。
>>736
動くんでない
>>769
現実にはそこに書かれていない文字も使用されているという罠。
仕様にあわせてまともに動作しないものを作るか、
実情に合わせて仕様を無視するか、それが問題だ。
772デフォルトの名無しさん:02/04/30 00:52
>>736
UNIX系だとプロセスの外側の領域には無理でないかい。
Windows系、Mac系はわからん。
ヘンナコト スルナヨ。
773デフォルトの名無しさん:02/04/30 00:53
>>736
タイーホ
>>736
移動する方向で転送の方法を変えるから
移動前と移動後の領域が重なっても大丈夫。
775712:02/04/30 01:20
>>713

それがそうなんですよ。
いや、最初はHellow Would!!
がプロンプトに何の問題も無く表示されたんですけど
別のプログラムコンパイルして実行しようとすると
あのウインドウが。
ついてにHellowWouldの方でもその
ウィンドウが出るようになった。
コンパイラを上書きインストールしても直らないし。
どうしたら良いのでしょうか
>>775
どのタイミング?
コンパイル?
実行?
打ち込んでるコマンドライン、良ければここに書いてみたら?
777デフォルトの名無しさん:02/04/30 01:22
>>775
それが本当なら今あなたが使っているブラウザだって起動できなくなるってことだよ。


もしかして.cや.objとかを実行しようとしていない?
>>775
たぶん
Hellow Would!!
が原因。
>>778
茶化すな
780712:02/04/30 01:25
cd bcc
これでbccフォルダ(ソースファイルのあるところ)に移動して

bcc32 test.c
これでコンパイル

test.c
これで実行すると

例のウインドウが開くのですが・・・・・・・・・・・・
>>778
面白いよ。
>>775は何か勘違いをしているに1000HellowWould
>>780
最初は出来たっての嘘だろ。
784デフォルトの名無しさん:02/04/30 01:26
>>780
やっぱり(笑)
ソースコードを実行しようとしてどうするのよ(笑)
test.cじゃなくてtest(もしくはtest.exe)ね。
>>779
ここでそれはムリ
786712:02/04/30 01:28
なるほど・・・・・
馬鹿丸出しでしたね。
いや、最初の頃はマニュアル読みながらだったんで。
いつのまにか変な勘違いをしてしまいました。
でも解決できて嬉しい!!!
どうも有難うございました!!!
>>780
やっぱりそんなことだろうとは思ってたよ(藁
>>780
.cは実行できないよ。ただのテキストファイルじゃん。
.exeを実行しようね。

ちなみに、ハリウッドのスペル間違ってるよ。HollyWoodだろ。
山田くーん、>>788の座布団全部もってゆきなさい。
>>788
爆笑してうまくキーが打てねーじゃねぇかドルァ!
>>778はある意味正解だったな。
792デフォルトの名無しさん:02/04/30 01:43
おい優秀なやつ!
自然対数と正弦と余弦と正接ってなんですか?
数学バカな漏れに教えてください
793デフォルトの名無しさん:02/04/30 01:44
>>792
なんでここで聞くのよー(/_;。) ウッウッウッ
数学バカなら自分で分かるはずでしょ。
log,sin,cos,tan,氏ね
795デフォルトの名無しさん:02/04/30 01:46
言葉が違ったかな・・・(._.;)
数学無知ってことにしてください
超越関数板に逝ってください。
>>792

#include <math.h>

double log(double);//自然対数
double sin(double);//正弦
double cos(double);//余弦
double tan(double);//正接
>>792
あーそうそう、もしgccなら-lmをつけてね。
799792:02/04/30 01:56
さんきゅ〜です!
超絶倫兄貴板に逝ってきます、スンマセンデシタ
800796:02/04/30 01:57
あ〜そっちだったか
>>792 >>795
・・・妙に可愛い。

いじめて イイ?
802796:02/04/30 02:06
>>801
彼なら超黄金脱糞板に逝っちゃいました。
>>801
うん
804デフォルトの名無しさん:02/04/30 02:07
女性SEに虐められたい。
age
805801:02/04/30 02:22
チッ
806デフォルトの名無しさん:02/04/30 12:16
さがっているのでage

随時Cに関する質問を受け付けています。
807デフォルトの名無しさん:02/04/30 14:22
「はじめての C」なる本を本屋で見つけまして、初心者ながら
興味があったので読んでいました。

日頃から秀丸エディタのマクロを覚えてみたいと思っていて、
C の知識が多少無いと。とか聞いていたのですが、本当ですか?

あと、VB等のように専用のソフトは要らないんでしょうか?
書いてある文を読むところでは、コンパイラがあればよく、
付属のCD-ROMに入っているので、これを使えば良いらしいのですが。
>>807
CD-ROMがあるなら、とりあえずインストールしてみな。
自分でやれるところまでやって、いきづまったら質問してみそ。
あと、そのCD-ROMに入ってるのが有名なコンパイラなら、
Web検索すれば、インストールのしかたを説明したページが必ずあるから
そういうのを探すのも覚えれ。
809デフォルトの名無しさん:02/04/30 19:32
すいません(汗
.NETのC++とかc#とかは
C言語もコンパイルできますよね?
810デフォルトの名無しさん:02/04/30 19:33
>>809
Visual C++.NETは多分できると思う・・・
C#は無理でしょ。
811デフォルトの名無しさん:02/04/30 19:36
>>810
うわ〜
後輩に出来るとか言っちゃった…
今日給料日だからいきなり買ってました…(汗
どうしよ(涙
http://www.microsoft.com/japan/msdn/siteguide/products.asp

> Visual C++
> C/C++ 言語の学習から、Web アプリケーションや WindowsR アプリケーションの作成まで対応した C/C++ 開発環境です。使いやすい開発環境、豊富な資料を備えていますので、C/C++ 言語によるプログラミン
> グの学習に最適です。

少なくともVC++はできるな。できないと困るし・・・
813デフォルトの名無しさん:02/04/30 19:40
悪いことはイワンborland C++とgccを使っとけ
>>807
文法はC。ただそれだけ。
薄いCの入門書の半分くらい読めば書ける。
815デフォルトの名無しさん:02/04/30 20:04
char* expand(char s[],char *p)
{
 int c, e, i, n;
 for(i = n = 0;p[i];i++){
  for(;p[i] != '-';i++)
   if(p[i] == '\0') break;
  if(i == 0 || !isalnum(c = p[i-1]) || !isalnum(e = p[i+1]))
   continue;
  for((n && s[n-1] == c)? n-- :0;c <= e;)
   s[n++] = c++;
 }
 s[n] = '\0';
 return s;
}

A-Z表記をexpandする関数なんだけど評価してくれる?
forと使い分けようぜ。
あとポインタ使え。
前後にあちこち動く添え字演算はおうの面倒だ。

isalnumあたりはマクロで実装されてる場合があるから
(isalnum)(xx)みたいにしとけ。

細かい動きは追ってないけど、もっとすっきり書け。
素直に書いた方がいいぞ。
isalnumのときだけ、という要件ならこんなかんじ。
文字コードの大小もしっかり見た方がいいがとりあえずコレで。

char *expand(char s[], char *p)
{
 char *d = s;
 while (*p)
 {
  if (p[1] == '-' && isalnum(p[0]) && isalnum(p[2]))
  {
   int c = (p[0] & 0xff);
   int ed = (p[2] & 0xff);
   while (c <= ed)
   {
    *d++ = c++;
   }
   p += 3;
  }
  else
  {
   *d++ = *p++;
  }
 }
 *d = '\0';
 return s:
}
818807:02/04/30 20:39
これでした。

C言語 (1) はじめてのCプログラミング 
倉薫 著 定価:1900円 翔泳社
char s[]とchar*pを区別する?のは、一般的なのか?
const付けられない実用上の理由でもあるのか?
つか、sとpって名前が意味不明すぎ。
sは「配列の先頭」で、バッファ的な使い方するつもりだぞ。
pはとりあえず先頭を渡すけどなかでぐりぐりうごかしちゃうぞ。

と意を汲むべきだと思うがね。

constを覚えてないうちは、とりあえずコレでもいいんでないの?
興味を持った〜くらいから入るならこれでいいんでない?
読んだことないけど。

ポインタは電話番号
にワラタ。

たまに普通だったり秘書がでてきたりするのか?
>820
つまり、
s[i++] = *p++;
みたいに使うってことなのか?
823デフォルトの名無しさん:02/04/30 21:01
constってそんなに重要ですか?
重要って言うか、無いとダメ。
必要ない文脈でもキャストしなきゃいけなくなる
825デフォルトの名無しさん:02/04/30 21:05
>>823
重要だろう。最小特権を強制できるし。キャストは抜きにして。
っていうか、そもそも1文字にしか適用できないのはだめすぎ。
827デフォルトの名無しさん:02/04/30 21:06
ちょうどconstの話なので、
char * const *p
p は 「charへの読み出し専用ポインタ」への(読み出し専用でない)ポインタ

char * const * const p
p は 「charへの読み出し専用ポインタ」への読み出し専用ポインタ

でいいですか? constついてるとなんかわかりにくくて
まあ、const って書いとけば、「俺はこの変数は変更するつもりはないんだ
ぞ。」ってことが、コンパイラと保守する人 (自分を含む) に伝わるから、
書くにこしたことはない。あと一部の環境では、変数を ROM 領域に置くとか
の嬉しい機能があるかもしれない。
参考書買いに行ったら、初版が2000年、追加で2001年だったけど
CD-ROMで付属してるコンパイラって使えるのでしょうか?(Win XPですが)
830829:02/04/30 21:10
ごめん。コンパイラの種類書かないとわかんないですよね。
>>830
おぃおぃ、そこまでわかるならなぜ種類を書かない?
832830:02/04/30 21:59
>831
立ち読みしただけなので、わからないんです。
調べてきます。
>>832
どんな本だったか(Windowsの本か?)、もしくは本の名前は何か書けばわかるかもな
>>827
下のやつ、だけどpの値を変更できないことに気付いてる?
p++ ---> だめ
--p ---> だめ
p = xx ---> 初期化以外はダメ
835827:02/04/30 22:28
>>834
>下のやつ、だけどpの値を変更できないことに気付いてる?
の、つもりで最後に読み出し専用のポインタとつけたんですが・・いいんですよね?
836デフォルトの名無しさん:02/04/30 22:30
>>829-830
その時期なら、LSC-Cの試食版か bcc32 だろう、たぶん。
XPになって使えなくなったコンパイラなんて聞いたこと無いから
大丈夫だと思う。
char * const * const p;

char * const * (const p); /* pはconst(更新不能) */
char * const ( * (const p) ) /* (ポインタp(更新不能))はポインタ変数である */
char * ( const (* (const p) ); /* (ポインタp(更新不能))はポインタ変数で、指し示す先は変更不能である */
char( * ( const (* (const p) ) ); /* (ポインタp(更新不能))はポインタ変数で、指し示す先は変更不能なポインタである */
( char( * ( const (* (const p) ) ) ); /* ((ポインタp(更新不能))はポインタ変数で、指し示す先は変更不能なポインタ)で、char型の領域を指す */

838815:02/04/30 22:33
あ、一杯レス付いてる!みなさん、サソクス!
アホな部分が多くて申し訳ないっす、みなさんのアドバイスを親身に受け取るっす。
どうもでしたm(_ _)m
839827:02/04/30 22:36
ところで、
char const *hoge

const char *hoge
はどっちが普通?
質問ばっかすいません。
const char*
かな。
俺は下の方。

記憶クラス指定子と型就職子はなんとなく左。
だけど__huge, __far, __nearは右。

上の書き方はあまり見かけないねえ。
const char*が多いけど、これって例外的な記述方法だよな。

char const c;
char const * const pc;
char const * const * const ppc;

const char c;
const char * const pc;
const char * const * const ppc;

↑これ見てどう思う?
そもそも内側のconstは書くことないなあ。
書いてもいいんだが、その、つまり、面倒でなあ。

ポインタのエリアスを作るときはそういうの重要になるけど、
普通に使う分には、最終的な参照先がconstか非constか、しか
気にしてないね。

コンパイラの警告がでたら、正しい型宣言に直すけど。
>>843
仮引数自体がconstかどうかは呼出元にとって意味ないからね。
実装の問題であって、インターフェイスの問題ではない。
register修飾とかもそうだよな。

それがポインタのときの指す先についてのconstはインターフェイスの問題になる。
> char const * const pc;
> char const * const * const ppc;
この位になってくると絶対どこかで切ってtypedefしちゃうので
 const char * c; // 定数(const char)を指しているポインタ
 char * const c; // c 自体が定数っぽい気分になる
と直感的に読める書き方をしてしまう傾向があるなぁ、俺は。
846827:02/04/30 22:49
>>843
僕もそうです。んで、ちょっとここで聞いてみたわけです。

ポインタのエイリアスって、C++の「参照」から「参照先の値を得るときに
*をつけなくてもいい」って機能を除いた感じですか?
(c++知らないので馬鹿言ってるかも)
>>846
混乱してないか?
参照は*いらないぞ。
二次元配列で
char **pp;
とかがあるときに、
処理の途中で

char *p = *pp;

みたいなことするよね。

p もppも同じエリアを見に行く可能性があるとき、後から作った方をエリアスっていうんだけど

constとかvolatileとかポインタ演算とか関数呼び出しが入り乱れてくると
コンパイラがうまく最適化できなくて間違ったコードを生成したり、
最適化をあきらめちゃうことがある。

まともな最適化コンパイラなら、エイリアスに対してどういう最適化をするか
決めるオプションとかあるでよ?
ついでに無神経なポインタキャストも、最適化の障害になったり、
過ったコードを生成するトリガになる。

一処理一関数。
シンプルに問題を切り分けていけば、べつに混乱することもないんだけどね。
850829=807:02/05/01 00:00
>833、836さん ありがとう。
ほんの名前はこれです。
C言語 (1) はじめてのCプログラミング 
倉薫 著 定価:1900円 翔泳社
851デフォルトの名無しさん:02/05/01 00:06
>>850
http://www.seshop.com/detail.asp?pid=720

LSI-C試食版だな。
ある程度回線に余裕があるか、テレホなら
http://www.borland.co.jp/cppbuilder/freecompiler/
からBorland Free C/C++コンパイラを落として使った方がいいと思う。
もちろん、LSI-C86の試食版はそのままでXPで使えるけどな。
XP'で'使えるが、XPの機能を使うことは出来ない。
試食版だけが欲しいなら、ここで
http://www.vector.co.jp/soft/maker/lsi/se001169.html
>>850

>C言語 (1) はじめてのCプログラミング 
>倉薫 著 定価:1900円 翔泳社

ポインターは電話番号だって逝ってるヤツか?
なら他を探した方がイイぞ
簡単にイメージさせようとしてるんだろうが余計ワケワカになる

てゆーか秀丸のマクロ組みたいだけならスゴイ遠回りと思われ
856855:02/05/01 01:14
それと、
この作者はたぶんCでの実戦経験が少ないと思う
配列の添字が0から始まってる事がCのバグの原因のほとんどだ
なんて書いてた気がする(W
>>856
そりゃひでぇ(禿藁
>>856
BASIC上がりなのかね。
>>856
ワラタ
添え字が0から始まらなかったら、a[i]==*(a+i)の関係が成り立たなくてそれこそバグの原因になると思う。
860855:02/05/01 01:59
思い出した
構造体のメンバーにポインターを介してアクセスするとき
なんで" -> "なんて書くのか意味不明とかも書いてたと思う

手元に無いので記憶はあやふやだが、
誰か持ってない?
推薦図書スレのほかに買ってはいけない図書スレがほしいな。
int a[5];
って宣言して5こ分しか確保されないのが納得いかないんだろうね<BASIC上がり
なんだ奇書か。
864850:02/05/01 12:36
この本、だめっすか?
865デフォルトの名無しさん:02/05/01 12:37
>>864
話のたねにはいいかも(藁
でも参考にしてはいけない。
やっぱ、はじめてのCでしょ。
パチモソは移管。
>>866
ま、まなタンですか?ハァハァ・・・・・・
>866
これかい?
改訂第3版 はじめてのC ANSI C対応
椋田 實 著
ISBN 4-8740-8546-6 技術評論社 1845円
869867:02/05/01 13:10
あ、、、まなタンは「やさしいC」だった・・・・
読んだことないけど。
870デフォルトの名無しさん:02/05/01 13:37
優しいC
麻奈タン・・・(*´д`)
871デフォルトの名無しさん:02/05/01 13:40
試しておぼえるC
872デフォルトの名無しさん:02/05/01 13:40
IMEのバッファの取得の仕方を教えてください。
873デフォルトの名無しさん:02/05/01 13:43
>>872
シラネーヨ
874デフォルトの名無しさん:02/05/01 13:46
875デフォルトの名無しさん:02/05/01 14:39
>>874

ありがとです。^^
プログラム技術板一の良スレだな。
877デフォルトの名無しさん:02/05/01 16:13
872です

IMEのバッファにデータを入れる方法を教えてください。

シネ
874の責任。
880教えて!:02/05/01 16:49
strspnの説明がよくわからないんですが・・・・
接頭子の長さを返すってどういうことですか?
あとstrcspnも・・
>>880
size_t strspn( const char *string1, const char *string2 );
string2 で指定した文字群にない文字が string1 内に最初に現れた位置
のインデックスを返します。終端の NULL 文字 (\0) は、検索の対象外で
す。

の説明でわかんない ? ついでにサンプル...

--------------------------------------------------------------
char string[] = "cabbage";
int result;
result = strspn( string, "abc" );
printf( "文字列 '%s' のうち a、b、c のみから構成される"
"部分の長さは %d バイトです。\n", string, result );

出力
文字列 'cabbage' のうち a、b、c のみから構成される部分の長さは 5
バイトです。
--------------------------------------------------------------

をみてもわからんか ? だったら、この関数使わなきゃいいと思うが...。
strspn()ってどんなときに使うんだろ?
>>882
もしかして、URLに指定しちゃいけない文字列をstring2に渡せば、
上のほうで議論してた「URLっぽい文字列抽出」に役立ったりして。
>>883
(・∀・)ソレダ!
885デフォルトの名無しさん:02/05/01 19:48
>>883
そりゃ名案だ!

const char *str2="0-9A-Za-z_-.*/?#=&"; /* 0-9A-Za-zは実際は展開して書く */

こんな感じかな?
本当は使えないけど'~'も入れておいた方がいいかも。
886885:02/05/01 19:49
ポートを指定するときの:も加えた方がいいか。
喪前ら、そんなショボいパーザじゃなくて、yacc使って書けよ
888デフォルトの名無しさん:02/05/01 20:05
char hoge[] = "hoge,3";
char temp[10];
int a;

sscanf(hoge, "%s,%d", temp, &a);

とするとtempが"hoge,3"となり、aにゴミが入ります、
hogeと3が"hoge 3"と空白で分けられていたら
"%s %d"でいけたんですが、カンマの場合はsscanfはつかえないんですか?
"hoge,3" を"3,hoge"にするというのは無しで。
sscanfつかうの止めろ
>>889はバカ。

>>888もたぶんバカ。
きちんと規格書嫁。

sscanf(hoge, "%[^,],%d", temp, &a);
にしとけ。

業務用のコード書いてるなら、書式に長さの指定もきちんとかいとけ。
891888:02/05/01 20:50
>>890
多分じゃなく確実に馬鹿な888です。

ありがとう。それでいけました。
特に業務用のコードってわけじゃなく、Cの勉強中です。
[^,]というのは正規表現で使う文字クラス指定のことですか?
あと、規格書ってどこで読めるんでしょう?
>>891
ISOからPDF購入してください。
\2k程度です。($18)
893893:02/05/01 20:58
みなさん、コンパイルって、何でしてますか?
脳内
895893:02/05/01 21:00
マジで?
896888:02/05/01 21:01
>>891
と、おもったら、[^...]の解説はk&Rにちゃんと載ってますね。
すいません。読みたりませんでした。

>>892
ああ、買わないといけないんですか。この機会にかってみようかな。
>>896
K&Rあるならとりあえずそれで足りるよ。
Win系ならコンパイラにライブラリのヘルプが付いてるだろ?
>>895
おまえは出来ないの?
899893:02/05/01 21:16
実を言うと、AN HTTPDでローカルサーバ(?)を動かしていて、
PerlのCGIをテストしているのですが、Cで作ったCGIも動かしたくて、
いい方法を探していたのですが…。

参考になりそうな、サイトありませんか?
訓練してなきゃできないだろ。
そのうち、な。
>>885
> 0-9A-Za-zは実際は展開して書く
せっかくだから、使ってやれや >>817
902888:02/05/01 21:17
>>897
フリーのbcc32なので、ライブラリヘルプがありません。

あと、書式付出力のとき精度や、幅を
変数で指定したいときにつかう*のようなものを使いたいんですが
書式付入力のときには * は代入抑止になるようで出来ませんでした。
890さんのいう「長さ指定しとけ」ってのは長さを直接書いておくんですか?

別に変数にして、そのつど長さを変えるというより
あらかじめ文字列長を#defineしておいて、'\0'の分1引いて
最大でSTR_SIZE-1だけ読み込むという形にしたいのですが。

分かりにくい&長くて すいません。
903デフォルトの名無しさん:02/05/01 21:18
>>899
ん?コンパイルすれば実行できるはずだが?
904903:02/05/01 21:20
ああ、あなたは>>893なの・・・・
私はgccでコンパイルしているけど。
>>902
もしかしたらマイクロソフトのMSDNライブラリWeb版に載っているかも。
906デフォルトの名無しさん:02/05/01 21:27
>>896
いわゆるC89の範囲内でよければ、JISになっています。2000年度版まではJISハ
ンドブックの情報処理、プログラミング言語編に含まれていました。JISハンド
ブックは公立図書館に置いてあったりするので重宝しましたが、2001年度版に
はプログラミング言語編は含まれてません。Cの規格標だけを買おうとすると
たしか8,000円くらいです。

http://www.jsa.or.jp/

なんかWeb Storeを開設する予定はあるらしい。安くなるといいね。
907880:02/05/01 21:29
>>881
ふむふむφ(..)
詳しい解説、感謝です!
>>907
で、分かったの?
>>883

> URLに指定しちゃいけない

ではなくて「URLに指定できる」じゃない?
>909,883
日本語ドメインを忘れているぞ。
>>910
そんなものを考慮していたらきりがない。
考慮するなら、http://から行末までリンクするしかないだろ

http://www.お名前.com/
>>885
URLエンコードの%を忘れている。
913880:02/05/01 21:48
>>907
はい、わかりますた。サンクス!でした
>>902
コレもK&Rに載ってるはずだが、プリプロセッサがマクロに渡した引数を
リテラルに置き換える機能、連続したリテラルを一つのリテラルにまとめる
機能を持っている。

こんなかんじ。

#include <stdio.h>

#define LEN 32
#define TOSTR(x) #x

int main()
{
char buf[256];
char buf2[LEN+1];

while (fgets(buf, sizeof(buf), stdin) != 0)
{
sscanf(buf, "%" TOSTR(LEN) "s", buf2);
}
return 0;
}

915888=902:02/05/01 22:07
>>914
あぁ、こんどはプリプロセッサのところを見ないといけなかったんですね。
本当に、ありがとうございました。

読み直します。
916899:02/05/01 22:19
出来ないんですけど・・・。
917デフォルトの名無しさん:02/05/01 22:22
>>916
きちんと必要最低限のヘッダーを出力しているか?
Content-Typeとか。
918899:02/05/01 22:23
#include<stdio.h>
int main(int argc,char* argv[])
{
printf("content-type:text/html\n\n");
printf("<html><body>Hello World!</body></html>\n");
return(1);
}

をコンパイルすればいいんですよね?
919915:02/05/01 22:24
>>914
うーん。
それ、やってみたんですが
TOSTR(LEN)のLENがそのまま"LEN"という文字列として連結されて
いるようなんですが・・・。
\r\n\r\nだろ
921デフォルトの名無しさん:02/05/01 22:24
>>918
そうそう。
(ヘッダーの単語の一文字目は大文字にしようよ・・・)
922899:02/05/01 22:25
>>921
これをコンパイルして、どのファイルを実行すればいいんですか?
>>922
(T_T)
コンパイルしてできたファイルに決まっているじゃない(T_T)
.cgiをCGIとして実行するようにしているならファイル名をhello.cgiとでもする。
924899:02/05/01 22:29
>>923
Microsoft Visual C++でコンパイルしているんですけど、.dsp .dsw .ccp .h とか
いろいろな、拡張子のファイルが出来ちゃうんですけど…。
925914:02/05/01 22:29
(゚д゚)<あらやだ
お前ら根気強いな・・・俺だったら100パー無視するぞ、こんなの。
>>924
統合開発環境を使っているのか。
ビルドするとDebugかReleaseフォルダに.exeファイルができるでしょ。
それを.cgiに変えればよいの(.cgiをCGIとして実行するようにしている場合)

CGIプログラムならテキストエディタにコードを書いてコマンドラインからコンパイルした方がいいと思う。
「-o 出力ファイル名」でうまくやってくれる。
928927:02/05/01 22:34
混乱を招きそうだな・・・
-oオプションね。

cl -o hello.cgi hello.cってな感じ。
929899:02/05/01 22:35
すみません。
HTTP 500 内部サーバー エラー
になっちゃうんですけど。
930899:02/05/01 22:36
>>928
ところで、
あなたは、何のコンパイラーを使っていますか?
>>929
telnetで出力を見てみろ
>>930
...
>>930
LinuxではgccでwinではVC++6.0
934899:02/05/01 22:38
>>931
telnetってwindows2000に付属しているやつでいいんですか?
>>934
とりあえずコンパイルしたプログラムを一度DOS窓から実行してみろ。
>>934
なんでもいいから

telnet 127.0.0.1 80
GET /cgiのパス↓


と入力しろ。矢印はエンターな
>>914, >>919
# 演算子への引数は、それ以上マクロ展開されないよ。

>>918
関係ないとは思うが、なんで return 1 なの ?
938899:02/05/01 22:45
>>937
Windowsに正常終了は似合わないからです。
939899:02/05/01 22:45
>>936
telnet 127.0.0.1 80
はどこに入力するんですか?
>>938
...
もしかして壮大なネタ?
941899:02/05/01 22:47
ねたとかじゃなくて、全く分らないんですけど、
いいサイトがあったら、自分でやりますが…。
>>940
>>938は偽者。

しっかし、なんで動かないんだか・・・・
Perlなら動いたんだよな?
だから、改行コードじゃねーの?
\r\n\r\nだろ?
944デフォルトの名無しさん:02/05/01 22:49
>>943
AN HTTPdってそんな糞仕様なの?
少なくともApache(Win32)なら\n\nでできるが。
945日下部圭子:02/05/01 22:49
http://pc.2ch.net/test/read.cgi/tech/1020260813/l50
新スレ作りました。
早めの移行をお願いします。
946899:02/05/01 22:51
perlなら、サーバとしているフォルダのなかにファイルを入れれば、動いています。
947デフォルトの名無しさん:02/05/01 22:52
AN HTTPDってもしかして、必ず指定されたプログラム(例えばperl)にプログラムを渡すようにできている?
>>947
ああ、それだ!
今見てみたら、*.pl *.cgiは無条件でperlに渡してる。
*.exeなら直接実行する設定だ。
949899:02/05/01 22:54
えーと、
あんまり設定とか、いじってません。
kentさんの
http://www.kent-web.com/www/anhttpd/settei.html
のページのように設定しました。
>>948
うわ・・・・なんちゅう糞な仕様だ。
さっさとそんなソフトは捨ててApacheにでも乗り換えろ。
>>949
手順を書く。
1 プログラムを書く
2 コンパイルする
3 できあがったexeを、public_htmlなどドキュメントルート以下に置く
3 ブラウザでアクセスする

以上。拡張子の名前はexeのままで。
>>949
なるほどね・・・・
コンパイルされた機械語をPerlに渡しちゃ、そりゃエラーになるわな・・
953899:02/05/01 22:56
>>948
ということは、拡張子が.cgiならPerlのCGIって決め付けてるんですか?
AN httpdが。
続きは新スレで。
>>953
そうそう。
956899:02/05/01 22:58
つまりは、Cで作ったCGIは.exeのままにしておくと。
>>956
だな。
>>953
設定を変更すれば可能だけど、
説明するのがめんどくさい
>>953
Windowsの仕様すら理解してなかったり。
961899:02/05/01 23:02
ありがとうございました!!
>>959
うるせーな。
せっかくだからこっち消化しようや
AN HTTPDは.plや.rbという拡張子で実行した方がいいのかな。
>>963
ん?
>>963
.cgiで普通に動きます。
>>962
1000ゲットしたいだけちゃうか?
>>964
.cgiのような汎用的なものじゃなくて、中身によって変えた方がいいのかなと。
Apache(Win32)だと最初の行の#!を理解してくれるからその必要はないけど。
>>965
設定したとおりにしか動きません。
*.cgiをperlに設定したら、ネイティブコードやRubyスクリプトで動作させるのは不可能です。
>>967
マルチユーザーのシステムでは使わないことだ。
ひとりなら、*.cgiを一つのアプリケーションに設定しても問題ないだろ
>>966
俺はもう新スレで1000取ったので満足です。
>>969
うん。
(・∀・)つ|現スレで1000目指しまふ|
フォルダ単位で実行権与えるとかできんのですか?
できんのです
975899:02/05/02 00:04
AN httpdってサーバーソフト(?)ですよね?
976デフォルトの名無しさん:02/05/02 00:07
↑何故そんなことも知らんのだ。
977899:02/05/02 00:09
Apacheもサーバーソフトですか?
>>977
世界一のシェアを誇るWebサーバソフト。
ただし、On Linux
980899:02/05/02 00:22
windows上で動くApacheありませんでしたっけ?
あるけど、シェア取ってない
982899:02/05/02 00:24
シェアとってないって、どういうことですか?
>>982
Windowsでは普通はIISを使う。
ApacheはUNIX系OSで動かすのが一般的。
で、ウェブサーバはUNIX系OSを使っていることが多いから、Apacheが世界一のシェアを誇っている。
984983:02/05/02 00:28
なんかレスがおかしいな・・・
とにかくWindowsサーバに限って話せばApacheはあまり使われていないってことだ。
985899:02/05/02 00:38
IISはセキュリティーホールが多いらしいですからね。
ありがとうございました。
どうしてこのスレはほのぼのしてるんだろう
   ||
   ||
   ||
   ||
   ||
   ||
   ||
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪
   ||
   ||
   ||
   ||
   ||
   ||
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪
   ||
   ||
   ||
   ||
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪
   ||
   ||
   ||
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪
   ||
   ||
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪
   ||
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪
     /⌒\     /\
    /'⌒'ヽ \  ./\  |
    (●.●) )/   |: |
     >冊/  ./     |: /
   /⌒   ミミ \   〆
   /   / |::|λ|    |
   |√7ミ   |::|  ト、   |
   |:/    V_ハ   |
  /| i         | ∧|∧
   и .i      N /⌒ ヽ )
    λヘ、| i .NV  |   | |
      V\W   ( 、 ∪
              || |
               ∪∪
    |
    |
    |
  @ノハ@
  ( / ⌒ヽ
   | |   |
   ∪ / ノ.
   .(_/_/
     ∧_∧
     /⌒ヽ )
    i三 ∪ モウ ダメポ・・・
     |三 |
    (/~∪   ::::::::::::::::::::::
 ̄ ̄ ̄ ̄|  ::::::::::::::::::::::::::::::::::::: ビュゥゥゥー・・・
 口 口  |:::::::::::/ ̄ ̄ ̄\::::::::::::
 口 口  |::::::::/       ヽ::::::::::::::
 口 口  | ̄┌┐l ̄l .| ̄ ̄ ̄| ̄ ̄
 口 口  | | ̄ ̄ ̄| |      | | ̄ ̄
 口 口  | |      | |      | | 
      ∧_∧
      /⌒ヽ )
     i三 ∪ モウ ダメ・・・ポ・・・
      |三 |
     (/~∪  ::::::::::::::::::::::
 ̄ ̄ ̄ ̄|  ::::::::::::::::::::::::::::::::::::: ビュゥゥゥー・・・
 口 口  |:::::::::::/ ̄ ̄ ̄\::::::::::::
 口 口  |::::::::/       ヽ::::::::::::::
 口 口  | ̄┌┐l ̄l .| ̄ ̄ ̄| ̄ ̄
 口 口  | | ̄ ̄ ̄| |      | | ̄ ̄
 口 口  | |      | |      | | 
1000デフォルトの名無しさん:02/05/02 01:19
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。