2 :
デフォルトの名無しさん :02/04/21 16:02
乙
3 :
デフォルトの名無しさん :02/04/21 16:03
C言語ってナニ?
いつまでアヒル本の宣伝すれば気がすむんじゃー
Aって何?B=BASICだけど・・・
Ada
AHIRU
APL
13 :
デフォルトの名無しさん :02/04/21 16:25
Kiss
いや、みんな待て。
俺には
>>9 が本気に見えて仕方がない。
ぼけるより
>>9 を糾弾した方が良くないか?
たしかに(藁
A=Assembler
良心的に解釈すれば
>>9 はCPLの部分を省略したんだと思う。。
オレの存在っていったい・・・
19 :
デフォルトの名無しさん :02/04/21 16:44
elseif が無いって本当ですか?
>>19 本当です。かわりにelse_if(_はスペース)をつかってください。
トリッキーな使い方するとハマるかもしれんけど。
>>16 ん?BはBCPLじゃなくてB言語のBでしょ?
BCPL -> B -> C ってなかんじで。
>>21 まちがえた。フォローサンクス。確認したらそうなってた。
確認ついでに知ったんだけど、ThompsonってUNIXの高級言語書きに
Bでトライする前にFortranでもトライしてたのね。
23 :
デフォルトの名無しさん :02/04/21 18:39
C言語の勉強はじめました。 K&Rの演習1-9でつまづきました。 #include <stdio.h> int main(void) { int c; int flag = 0; while((c = getchar()) != EOF){ if(c == ' '){ if(flag) putchar(c); } else{ putchar(c); flag = 0; } } return 0; } 一応できたっぽんですが、なんか泥臭いような気がします。 もっとスーマトな方法ってありますか?
出来てないだろ、フラグはどこでセットしてる?
>>23 #include <stdio.h>
int main()
{
int ch = getchar();
while (ch != EOF) {
putchar(ch);
if (ch == ' ')
while ((ch = getchar()) == ' ');
else
ch = getchar();
}
}
すいません。 確かに正しく動きませんでした。 #include <stdio.h> int main(void) { int c; int flag = 0; while((c = getchar()) != EOF){ if(c == ' '){ if(!flag){ putchar(c); flag = 1; } } else{ putchar(c); flag = 0; } } return 0; } やっぱりなんかスマートじゃないような。。。
いいかげん
>>1 のテンプレは変えてほしい。
意味もなく長いのは目障り。
題意がわからんけど空白っていわゆるWhiteSpaceを指しているような気も。 連続するWhiteSpaceを一個の' '(0x20)に押しつぶすプログラム、が 問題であるとして、その回答例をあげとく。 #include <stdio.h> #include <ctype.h> #define SREP ' ' int main() { int c, prev = 0; while ((c = getchar()) != EOF)& nbsp;{ if (!isspace(c)) putchar( prev = c); else if (!isspace(prev )) putchar( prev = SREP); } return 0; }
いかんぐちゃぐちゃになってる.... むしして
>>28 演習1-8が 空白、タブ、改行を〜
演習1-9が 2つ以上の空白を〜
となっているから、空白はスペースのみかと。
32 :
デフォルトの名無しさん :02/04/21 19:32
#include <stdio.h> int main() { int c; int prev = 0; while ((c = getchar()) != EOF) { if (!(c == ' ' && prev == ' ')) putchar(c); prev = c; } return 0; } こーゆーこと? K&R三冊買ったけど全部誰かにあげちまったからなあ..
おお!みなさんすごいありがとうございます。
>>23 なんかflagとか使ってるのはずかしくなりました。。。
>>26 >>23 #include <stdio.h>
int main()
{
int ch = getchar();
while (ch != EOF) {
putchar(ch);
while ((ch = getchar()) == ' ');
}
}
後半のifは冗長だな、これだけでよかった。
>>34 すごいスマートでかっこいいですね。
早くそういう風にかけるように、がんがん勉強していきます。
#include <stdio.h> int main() { int ch = 1;//!EOF while ((ch = getchar()) != EOF) { if(ch != ' ') putchar(ch); } }
>>34 それも正解のうちの一つなんだけど、
二カ所でgetchar()してるのはキモイ。
getchar()
while()
{
/* なんか処理 */
getchar();
}
はCOBOLER臭くてキモイ。
でもたしかに、それも正解。
>>38 キモイキモイってそこまで言わなくてもいいじゃんかよ ヽ(`Д´)ノ ウワァァン
スマートに書くっていうはなしだから、状態変数用意したり
直前の文字を記憶しておくやり方が泥臭いと思ってああいう風に書いたんだよ。
#include <stdio.h> int main() { int nSpaceCount = 0; int nChar; while ((nChar = getchar()) != EOF) { nSpaceFlag = (nChar == ' ') ? ++nSpaceCount : 0; if (nSpaceCount <= 1) putchar(nChar); } return 0; }
nSpaceFlag -> nSpaceCount
if (
>>38 ==
>>41 ) {
printf("別に取り立ててスマートには見えない\n");
}
else {
printf("nSpaceCountがオーバーフローしたらどうするよ?\n");
}
>>41 ++nSpaceCount -> nSpaceCount++
なら、ちょっとトリッキーでCoolかも。
>>40 おれの
>>32 。
直前の文字を持ってるから、キモイと思う人から見ればキモイんだろう。
状態変数はぱっと見でわかりずらいから
>>32 か
>>34 のどっちかになるんだろうね。
strtokを使ってはいけないと聞きました。 確か、staticな変数を使ってるかなんか・・・。 で、それに変わる関数はあるのでしょうか?
みんなstdioって何て呼んでる。 漏れ、呼んではいないが”すたんだーどあいおー”と 心の中で決めてる。 stdlibやstdringについても詳細キボンヌ。
stdio えすてぃーでぃーあいおー stdlib えすてぃーでぃーりぶ stdring 何これ?
えすてぃーでぃーあいおー えすてぃーでぃーりぶ その次の奴は何?はじめてみた。 個人的に、libibertry.oっていうファイル名が好き。 IDEな人にはわからないかもだけど。
stdring→stringでした。 逝ってきまそ。 で、なんて呼んでまふ。
すとりんぐ
すとりんぐ。ってそのままだね。他の読み方知りたい。
>で、なんて呼んでまふ。 ワラタ
ガムバッテミルコトニシマス。 ドモアリガトウゴザイマシタ
60 :
デフォルトの名無しさん :02/04/21 21:59
stdio すたんだーどあいおー
stdlib すたんだーどりぶ or すたんだーどらいぶらり
string ひも
>>46 スレッドセーフでないってだけじゃなかった?
使いづらいから使ったことないけど。
62 :
デフォルトの名無しさん :02/04/21 22:07
>46 strtok_r()って関数が用意されてないかえ? 処理系によるけど。
処理系はVC タブ区切りのテキストファイルの数値を変数に。 スレッドセーフでないと言うのは、 マルチスレッドの時に困るだけでしょうか?
>>64 そのとーり。
でも、タブ区切りの数値を抽出するなら、sscanf()でOK。
strtokは152\t\t\t46\t64というような感じでタブ間に何もないレコードがある時は まともに動くんでしょうか?うまく動かなかったような気がするのですが。
>>64 VCだったらマルチスレッドライブラリを使用すれば、
strtokもスレッドセーフになる
どうもレスありがとうございます。 sscanf早速使ってみることにします。
>>66 そうだね。元々、strtok() って、コンパイラなんかの字句解析用だから、
先行するデリミタは全て読み飛ばすよ。そもそも、CSV の読込に、
strtok() なんか使う方が変。
char *string; と宣言して、 scanf("%s",string); で、代入しました。 この文字列 string を、ある文字列と比較する場合、 どのように書けばイイでしょうか? if (string=="abcdefg"){ ……… } ではだめなようです。 また、比較対象文字列が空白文字列、つまり、 string が空文字列かどうか調べるのはどうすればイイでしょうか?
72 :
デフォルトの名無しさん :02/04/21 23:12
if(strcmp(string,"abcdefg")) if(string[0]=='\0')
やべ。 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
>>78 別に配列作って全部コピーしてからqsort
86 :
デフォルトの名無しさん :02/04/21 23:27
>>85 やっぱりそれしかないか・・・。
サンクス!
>>80 ごめんよ、かぶっちまったよ。
>>81 ふーん、今時 K&R スタイルかよ。
>>83 そういうときは、インデックスを用意して、そっちをソートする。
あ〜〜〜なんて言ったらいいんだろう。
>>88 ポインタだけ配列にコピーしてqsortってことかな?
90 :
デフォルトの名無しさん :02/04/21 23:31
>>87 K&Rスタイルって何?
var[]ではなく*varと書くということ?
マジ質
正直mallocって理解があやふやだ
>>89 そそ、そんなかんじ。
で、大小比較する関数で、その配列に入ってるポインタの先にある
もの(構造体?)を比較してあげればいいと思う。
>>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
>>94 俺の持ってる入門書には全然書いてないんだわ。
参るぜ…まったく
>>90 ちゃう。
ANSIスタイル
void foo(char *string){}
K&Rスタイル
void foo(string)
char *string;
{
}
ANSI だったら、宣言の最後に ';' はつかん。
ありゃ、違ったっけ? 最近すっかりANSIスタイルで書くようになっちゃったので・・・ 間違ってたら訂正キボン。
上の argc,argv が仮引数。 その下の int argc; char *argv[]; が引数。 数も順番もあってなくてOKのあやふやな引数の宣言だった。
>>99 そういえばセミコロンがついていたか。見落とした。スマソ
ちなみに俺はそんなスタイルは使っていないよ。
RubyのソースコードがK&Rスタイルだったような・・・・ だめじゃんまつもと!
>>87 それ以前に、なんで81がK&Rになるんだヨ
そのK&RはANcIでも使えるんでしょ? 確か。
通はトリグラフ。これ最強。 C++でも使える。
>>108 うん。ANCIでやってます。
だってコードが長くなるもん♪
つまり…??
>>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 なるほど。
ということはプロトタイプ宣言もしていないのかな?
>>112 にできないと書いてあるじゃん。すまなかった。
HPのおまけコンパイラもかなりやる気のない対応具合だ。
>>113 普通そう言うときは、ANSI → K&R 変換ツールとか使わんかなぁ...。プロト
タイプ宣言はどうしてんの ? 使ってねぇのか ?
>>112 ANSIで消極的とはいえ認められているのだから、K&Rスタイルも立派なANSI準拠だと思うが。
だから、警告は出ないのは当然だし出すべきではないと思うが。
>>114 トライっていうの?
化学ではトリ〜が慣例だからそう読んでた。
>>115 外部公開する API 以外はしてないね。
>>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 に準拠していたって、制御が渡らない
コードや、未使用のローカル変数とか指摘するコンパイラって珍しくない
し、そう言う機能もいらないと言うのか ? (だすださないを制御できる必
要はあるだろうけど...。)
( ´∀`) 必死に調べたんだねぇ。えらいえらい。
反論したくてしょうがなかったんだろうな。
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言語でありませんか?
お返事ありがとうございます。 実はこれ課題で出されたものなんです。 構造体のみで共用体は使えません。 引数の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で最小幅を設定したときの充てん文字(スペース)を変更する方法は何かないでしょうか? それ以前にこの文章の意味を理解してもらえるか心配です
すみません。説明がたりませんでした。 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()は取って下さい。
WindowsXPのソースが全く解からないんですけど せめてカーネル部分を教えてくれませんか?
あんたMSの社員?
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 アセンブラのコードを埋め込む、とかな。
…って、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; }
>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 ほとんどの場合、そのプログラムが悪い。
特にsprintfなんて枯れた部分ならなおさら。
main() こっから何書いてイイのかわかりません
>>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];
普通の文字配列よりも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
>>183 レスの前の方は読んでないから適当なこと書いてるかもしれん。
まあ気にすんな。
>>179 a[4]で4文字+\0の5バイト・・・ではない??
ではない。
188 :
デフォルトの名無しさん :02/04/23 20:34
>>185 a[5]でa[0]からa[4]までの5つの要素を確保できる。
>>189 ・・・文字列の終わりの\0の他に、
配列の終わりの\0も必要ということでしょうか?
191 :
デフォルトの名無しさん :02/04/23 20:40
>>190 '\0'を入れるスペースが必要でしょう。
"ABCD"なら{'A','B','C','D','\0'}で5つ
>>190 C言語学んで5年間、とんでもない勘違いをしていたみたいです。
a[5]って「aという名前で5つ分確保」って意味だったんですね。
「[5]まで使える」んだと思ってました。
ああもうなんて情けない恥ずかしい・・・。
皆様、本当にご教授ありがとうございました!
>>192 周りにCに詳しい人がいなかったんだね。かわいそう。
C言語の標準ライブラリに"文字列"として与えるのならば すべて'\0'で終端された文字列でなければならない。 そういう用途にまったく使わないで単なるメモリイメージとして使うだけなら終端文字は不要。 何度も同じことを言い直しているだけな罠。
>>193 いることはいるんですけど、プログラムについて聞くと
「それを調べるのがお前の仕事」と。
まぁそれはその通りなんですけどね。
でもこれでやっと他プログラムのバグの謎も解けました。
こんな初歩的なところで皆様の手を煩わせてしまって
申し訳ないです・・・。
>>195 もしかしてmallocでも同じミスをされていたり?こちらの方はちょっと
ダメージが大きくなります。ヒープ領域が壊れてしまいますから。
>>196 いえ、そんな難しいの、使ったことが・・・。
業務で使ってるのはPL/Iで、Cは会社の
研修で使うだけなもので・・・。
役立たずPGなので逝ってきます・・・。
>>197 なるほど。周りの方々も不親切だったと。
気が向かれたらまた書き込みして下さい。
>>198 なんて温かいお言葉を・・・!
涙でディスプレイが見えません!!本当に!
皆様、ありがとうございました。ご恩は忘れません!
いいスレだね
>>171 ようやくやってる事が判ったよ。COOL!
プログラム初心者にとって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++マンセ!
class cA; class cB; delete (cA*)(new cB) これってcAのコンストラクタが呼ばれるのは分かるんだけど メモリはちゃんとcBのサイズ分解放されるのかな? それともcAのサイズ分解放される?
C++相談室があるやん…
すみません。 よく考えたら 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;
}
>>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 前者。後者は配列にする際にパディングが行われてサイズが膨れている
事があるので誤り。
230 :
デフォルトの名無しさん :02/04/24 17:53
ここで聞かないで試してみろよ。 一発でわかるから。
>試してみろよ。 一発でわかるから。 と思ったけどまさかその数字を見て判断できない訳じゃないよね。
やったけど、なんで 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スレをあげ
>>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])
のようがよいよ
>>227 一般的には、
sizeof(1要素を示す型) * (確保したい要素数)
だよ。
なので、ふつー
sizeof(Kou) * 100*100;
てする。
で、ここが勘違いしやすいんだけど、
sizeof(配列変数名)
ってやると、その配列全体のサイズが返ってくるのね。
つまり、char buf[100]; て宣言すると、sizeof(buf)は100。
>>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ではたまたまうまく動くということはあるから 言いたいことがわからないでもないけどさ。 実際コードを書いてみることで理解が深まると思うんだけど。もちろんそういう際は 様々な試行錯誤をして文献に当たってさらにコードを書いて確認すると言う意味。 今回だってコード書けば一発でわかりそうなんだけど。もし自分の理解を超える 数字になったときには文献に当たるなりこういうところで聞くなりしてさ。
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() なんて関数はない
エラー 0、警告 1 としか出なかったので書かなくていいと思っていました。ゴメンナサイ
prntf() は、C (小文字で書くなぁ〜。) でも、VC++ でも (自分で定義し なきゃ) 使えねーぞ。つーか、このエラーがエラーメッセージ見てわかん ないなら、VC++ なんか使うなよ。 という、書き込みが多数あるものと思われ...。
あぁ、かぶりまくり 一応付加すると、stdio.hに prntf()という関数はないということで。
>>253 どういう設定したら、そう言う表示になるんだ ?
コンパイルエラーにはならないだろ。 リンカエラーにはなるけど。そういうことだと予想
理解できてないうちは「警告をエラーとして扱う」オプションいれとけ。
確かにCはstatic_castやconst_castが無いのが痛いな…
261 :
デフォルトの名無しさん :02/04/25 00:24
spawn系で作成したプロセスのstdinを取得したいんですけど、 どうやるんですか? 作成したプロセスは入力待ちの状態になるので、stdinに送り込めば と思ってるんですけど・・・
「試してみて正しかったです」だけでなくて、 ○言語仕様や処理系依存の部分に関しては、資料を調べる ○関数の動作の場合は、机上でも追ってみる を、併せてやってほしいとは思うけど、関数やモジュールの動作は、 最終的には、動かして結果を見る事への依存度が高い。 だから、日ごろから、動かした結果、資料を調べなくても正しい事が わかるような、「調べ方」を、身につけて欲しいな、と思う。 そうしてるうちに、言語仕様についても、これについては試せば解かる、 ってのが見えてくるさね。 (だれに言ってるんだろう…)
Cの事ならなんでも俺に聞け!!
あっあくまで日下部の代理ってことでおながいします(;´∀`)
266 :
デフォルトの名無しさん :02/04/25 06:45
>>264 Cまで逝ったら子供が出来ました。
彼女のメモリーにマウントしてデータを抹殺したいんですけど、どんなコードを書けば良いですか?
abort
>>266 unlinkかremoveを使え。
・・・ってファイルじゃないね。
他人のメモリーの領域を勝手に書き換えようとしたらOSにゴルァされないか?
270 :
デフォルトの名無しさん :02/04/25 07:28
>>268 すでにファッキングされてるから大丈夫じゃないのか?
あげてしまった。スマソ
semctlで+1すればいい話だったりして。
273 :
デフォルトの名無しさん :02/04/25 11:15
a=a+1 ってどういう意味ですか? 数学の世界では絶対にあり得ないことなのですが・・・
手続き型プログラム言語には暗黙の時間指定があります。 よって厳密に数学的に書くと、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 数学の本や参考書などをみましたが余計解らなくなりました。
この方程式はどうやって解くんですか?
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
∞ = ∞ + 1 ってことじゃないの?
287 :
デフォルトの名無しさん :02/04/25 12:10
どこに書けばいいのかわからないので、ここに書いてみるが、 Windowsのフォルダ名がスペースを含む事を許さず、 かつ、フォルダ(ディレクトリ)の区切りを\じゃなく、素直に/にしてくれていたら 人生もっと明るく生きれたなぁ って思ったことはありませんか?
288 :
デフォルトの名無しさん :02/04/25 12:29
>>286 -∞=-∞+1
だめなやつは何をやってもだめな式。
290 :
デフォルトの名無しさん :02/04/25 12:34
PGにならなければもっと明るく生きれたんじゃないか、と思います。
隣の芝村は青いね。
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 > 何かまずいことあるでしょうか?
特にない。
>>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;
ついにこの時がやってきた 300キタ━━━━━━(゚∀゚)━━━━━━!!!!
>>298 そうだそうだ
やりたいことは
AA = malloc(sizeof(aa *) * 100)
for(i<0;i<100;i++)
AA[i]=malloc(sizeof(aa));
AA[0]->a = ...
で、できました!
サンクスコ!
>>301 ねぇ、
aa AA[100];で事足りない?
>>302 その「100」を動的にとるように変えてハマッテタのれす。
>>303 aa *AA;
AA = malloc(sizeof(aa) * i);
じゃだめ?
一応、正確にいうと、 今までグローバルに *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)以外では割り切れなかったということだから。
なるほど、どうもです。
>>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;
}
312 :
マッハ若乃花 :02/04/25 19:37
先生!ctime()の出力に\nが何故か付きます! \nいりません!おいら,どうしたらいいでしょうか!?
>>307 for(i=2;i<=num;i++){
for(i=2;i*i<=num;i++){
でいいんじゃないの?
>>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
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]って何を表すのですか?
>>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ではどうあらわせばいいんでしょうか?
コンピューターは持ってません。買いたいのですがお金がありません。 貯金で5万円ぐらいです。
コンピューターに触れるのは学校だけです。放課後はつかえません
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 ライブラリの問題なんでしょうか..
とりあえず、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
>>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の方が良いのでしょうか。
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(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
376 :
koubouU :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はあんま使うな
379 :
koubouU :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は関数じゃないよ
っていうか宿題は友達に聞けよ。
382 :
koubouU :02/04/27 16:57
>>380 whileは関数ではないんですか!?〜();
〜に当てはまるものは関数だと思ってたのに・・・
答えはちゃんと出ました。ありがとうございます。
383 :
koubouU :02/04/27 16:59
sumって合計って意味だったんだ・・・
385 :
koubouU :02/04/27 17:02
>>381 トモダチにそんなこといってもわかりませんよ
たぶんバカにされるだけだと
int n;
scanf( "%d", &n );
printf( "%d"), (n+(n&1))*((n+1)
>>1 )
>>1 );
387 :
koubouU :02/04/27 17:04
一足遅かったのか?(´Д`)
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文字だと思ってるのでしょうか。それも問題文に定義されてるのん?
宿題は宿題スレで!
>>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] を参照して、あぼーんするぞ。
初歩からやり直せ。
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; }
っていうか、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; }
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; }
え?問題なくない?
>>412 gcc以外は末尾再帰最適化してくれないし。
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];
これでどうよ。(って、なんか3文字限定とか言ってるし...。鬱だ。) int str_eq(const char *s1, const char *s2) { return *s1 == *s2 && (!*s1 || str_eq(++s1, ++s2)); }
>>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 ありがとうございます。
もしよろしければ私の作った関数は
どこが間違っていたのか教えてもらえないでしょうか?
>>422 とっても簡単なケアレスミス
> if(hantei=3)
これ代入してる。
ほかにも問題は無いわけじゃ無いけど、結果には影響しないと思う。
>>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" }; で 上のほうが容量食わないけど、文字列を変更しないなら下のほうがいいのかな?
>上のほうが容量食わないけど、 (゚д゚)ハァ?
はぁ? 消費するスタックなら下の方が少ないだろ
>>371-374 確かに二重ポインタが正当だけど面倒でしょ?
二次元配列だとでかい配列つくれないし。
小手先で簡単にサイズ可変の行列作れないかなぁと。
既にC++で行列クラス作ってあるから
それ使えば済むんだけどね
>429 上は5*4=20 下は5*2+4*2+4*4=34 (ポインタが4バイトのとき) だと思ったけど違う?
>>434 この宣言が関数内か関数外かどっちだ ? また、気にしているのはスタック領域だ
けか ? 固定文字列領域は気にしなくていいのか ?
スタックと文字列領域両方です。 あと宣言は関数ないかな。
上はスタックに5*4+4*4で、それ以外に コピー元の文字列分要るだろ。
>438 スマソ。ポインタのポインタのパターンと錯覚してた。
>>437 通常、文字列リテラルはスタックとは別の領域に確保されるが、
charの配列を初期化している場合は文字列定数じやなくて単なる初期化子。
すなわち、
char array[] = "hoge"; /* 宣言と同時に初期化 */
は
char array[] = {'h','o','g','e','\0'};
と同じで5バイト。
これが"配列の配列"になっても同じ。だから
>>434 > 上は5*4=20
で良い。
一方、下はポインターの配列を宣言すると同時に文字列リテラルの
アドレスを代入してるのでスタックにポインター分と書き込み禁止領域に
文字列リテラル分のメモリー消費でイイんじゃない
(処理系に依存すると思うけど)
# const 指定すれば上も変更できないからどっちでもって感じ
>>428
>440 下でリテラルを含めるなら、上もリテラルを含めるべきでは?
>>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 違う。幅が不揃いの配列は作れない。
ゴメソ 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";
だったら代入だが。
スマン、書いてる間に本人に訂正されてしまった。吊って来る。
つまり、この話は、 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 それは、「実行中にエラーが発生した」といって、 「実行できない」とはまた区別するべきでしょう。 原因は「3次元配列の定義」以外の場所にあるでしょう。 がんばってDEBUGするように。 >462 8*3*100*100=240,000byteで確保しすぎかどうかは微妙なところ。
スタックに確保する量としてはでかい
466 :
デフォルトの名無しさん :02/04/28 00:15
>>461 static領域に確保すればどうでしょうか?
static double val[3][100][100];
わすーれーないでー はったんあみか
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
>>476 いや、gotoを使うのが一番悪いです(w
ちなみに mejirushi:; なんてことはしないように。 mejirushi: ; インデントをつけとくのがマナー。
>>478 うっ!
今から直します。
(極力使わないようにしていてよかった・・・)
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 人に聞く前に自分で試してみろ。
実メモリは関係ない。スワップするだけだ。
>>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++
いつだったか、「24MBもスタックに取るのは取りすぎだ。」と言ったら「そんなことない。」と言われた。 相手の環境はどんなものだったんだろ。 私は1MBも取ったら取りすぎだと思うけど。
>>503 Unix だったら、いいんじゃない ? (自動拡張するからねぇ...。)
>>503 メモリなんか何百MBも積んでて一部ではGBにも突入している今の時代。
まぁいいんでないかねぇ。
>>505 可読性や実行速度で問題がなければいいんだろうけど、
自動変数として数十MB使うってのはやっぱり妙な気分がするな。
507 :
デフォルトの名無しさん :02/04/28 11:30
RMSはプログラムの使用メモリが1MBを越えるまでは何も考えるな。 1MBを越えるようなら作りを考えろ、と言っていたな。 10年くらい前に。
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の動作を知っている人が見ればおかしな
表現だ。一体どういうことか説明せよ
スレ違いだったか。それはスマソ。 __stdcall を関数名の前につけるのは聞いたことあります。 てか、どこぞでは「WINAPI」と書けとあったのでそう書いてたんですけどね。(同じこと?) クイックビューア、昔は右クリックしたら出たのに最近見ないな…。
>>521 たまたま知ってるからって偉そうになるなよ
>>521 そのスタックを使っているプロセス自身が拡張先のアドレス空間を使ってしまっていることも
あるってことじゃないの?
プロセス内から見えるアドレス空間は仮想メモリ空間とはいわないのか?(教えて偉い人)
>>526 割り当てられているアドレス空間すべてに
仮想メモリが割り当てられているとは限らない。
>>526 もちろんアプリケーションから見えるアドレス空間は仮想メモリ空間。
>そのスタックを使っているプロセス自身が拡張先のアドレス空間を
>使ってしまっていることもあるってことじゃないの?
空いている物理アドレスにリニアアドレスを
割り当てるわけだからその意味が分からない。
>>527 ??。仮想メモリ空間というのは論理メモリ空間のことだよ
>>516 その情報のソース希望。
Windows は知らないのだが、普通の OS は Heap は上から、Stack は下から
取っていって、ぶつかったら「メモリーがねぇぞ」とかいう風に実装すると思う。
大体今時の 32bit プロセサなら最低 1GB 程度のアドレス空間をプロセスに割り
当てているはず。
で、知りたいのは、「そこから先は隣接する仮想メモリ空間が *空いていない*」
状態ってどういう状態かを教えてくれ。
>>528 ここのリニアアドレスってどういう意味?x86用語でリニアアドレスというのが
あるのは知っているがそれだと話があわない。
>>529 SPARC版SolarisなんかではHeapとStackの間に共有ライブラリの空間を置い
たりするみたいですよ。ソースは『Solaris Internals』P.137。Intel x86版
Solarisはテキストの低位側にスタックを置くようです。なんでこんなふうに
するんだか。。。
リニアアドレスはページングによるメモリアドレス
C言語の話か?
535 :
デフォルトの名無しさん :02/04/28 20:55
お前らみんな別スレ逝け
>>529 1Gちかくスタック領域のところまでメモリをmalloc等で確保されてんだろうもちろん。
NTだと予約されたページでもアクセスされるまでは物理メモリ割り当てられないから
1G物理メモリなくてもそういう事はできる。
538 :
デフォルトの名無しさん :02/04/28 21:22
SS==DSの時のスタックの飛び込み自殺と、セグメントリミットを越えたメモリアクセスと、 スワップファイルの容量不足を別けて考えられない人のスレッドはここですか?
>>539 そんなのは明らかに環境依存の話だからです。
漏れのターゲットなんてスタック10KB無ぇよヽ(`Д´)ノウワァァン!!
KB単位で取れるだけ、かなり恵まれてはいるんだが。
>>537 やって見りゃわかると思うけど、malloc() なんか全然つかってなくっても、ス
タックに 1MB 程度取ると、エラーになるんだよね。まあ、printf() とかは
使ってるからヒープの使用量が 0 とは言わないけど、1GB なんてとても考えら
れないよ。
だから、
>>516 のソース希望って書いてんのよ。
ちなみに、「予約されたページでもアクセスされるまでは物理メモリ割り当てら
れないから1G物理メモリなくてもそういう事はできる。」って言うのはおかし
い。Over commit について言ってんだろうけど、Over commit してない OS で
も「仮想記憶」をサポートしてたら、そう言うことはできるよ。できないのは、
1G の仮想メモリがない場合だよ。
>>515 =529=541
横からごめん。
>>529 で、Windowsは知らんって言ってるけど
VC++って、Windows以外にも対応してるの?
544 :
デフォルトの名無しさん :02/04/29 05:49
545 :
デフォルトの名無しさん :02/04/29 06:09
適切なスレがないねえ。 それより知ったか君がうざい
仮想メモリ空間が *空いてる* ってどういう意味? 解説キボン
547 :
デフォルトの名無しさん :02/04/29 06:11
写真送ったら中元タンに会えるかな?
548 :
デフォルトの名無しさん :02/04/29 06:11
誤爆しますた。スマソ
全てのユーザーメモリ空間を読み書き可能にして、 書き込みアクセスしたら物理ストレージを割り当てればいいと思う
スタックとヒープ、gccはセグメントの両側から中央に向かって伸びる、 VC++はセグメントの中央から両端に向かって伸びる。
552 :
デフォルトの名無しさん :02/04/29 12:23
while(fgets(line_buf, sizeof line_buf, stdin) != NULL){ ・・・・・・・・・ } このwhile文から抜け出すには、\nを実行中に入力すればいいんですよね? でも、いくら\nと入力しても抜けれません
>>552 「\」「n」 と入力するんではなくて、\n は改行のことなので、エンターキーを押せばいいのじゃ。
・・・ネタ?
>>552 書いてから気付いたけど、それって \n までじゃなくて、ファイルの終わりまで繰り返すんじゃない?
555 :
デフォルトの名無しさん :02/04/29 12:29
エンターキー押してもだめでした。 ネタではありません 助けて
>>554 ファイルの終わりって どのファイルの終わりまでなのでしょうか?
fgetsはどうやったらnullと返してくれるのですか?
>>552 fgets は改行の後に'\0'を入れて、文字列にします。
$ abc[return]
と入力すると、バッファーには
'a','b','c','\n','\0'
と格納される。
だから
>>552 だと、入力がある限りいつまでたっても抜けられない。
抜けるには プロンプトから EOF 打ち込むか、
while ループの中で何か条件つけるとかしないと。
>>553 面白くない。
>>556 stdinが指すファイルの終わり(EOF)を検知したとき。
stdinが標準入力だとすると、EOFは検知することはないような気が・・・・・
>>556 あ、、、EOFを入力すればいいのか・・
>>556 DOSなら CTRL+Z
UNIXなら CTRL+D
でEOFのような気がするけど、試してない。すまん。
有難うございました なにか条件をつけてループを抜ける事にします
だからCTRL+Zだっつーの
>>563 visualC++を使っているのですがCTRL+Zだとプログラムそのものが
終わってしまいます
566 :
デフォルトの名無しさん :02/04/29 13:47
Linux で kterm 使ってますが、EOF は ctrl-d です。
>>563 >>565 何使ってますか?
>>566 MS-DOS系統のOSは(Winも含めて) EOF は ctrl-z です。
ちなみにNT
勘違いしました。
>>563 >>565 が EOF がわからないって言う話ではないのね。ゴメン。
>>522 fputs 等でコンソール上に出力するだけだったら、
EOF の入力と同時にプログラムが終了する場合もあります。
いっそのことソースコード出してみては?
>>565 ^Cで強制終了させたかのように終わるって(笑)
571 :
デフォルトの名無しさん :02/04/29 14:44
szstr = (char *)malloc() がある関数の中だけ、例外と違反のエラーを かえすんだけど、その原因はなんだったっけ? 前にも一回あって解決したんですけど忘れてしまいました。 szstr = のところに原因はないっす。 とりあえずszstr = とりのぞいてもエラーはでるっす。 static とか関係あったんだっけかな・・・・
572 :
デフォルトの名無しさん :02/04/29 14:47
573 :
デフォルトの名無しさん :02/04/29 14:50
引数に具体的な数字、256とか入れても だめだったよ。
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 どういう風に初期化したの?
そこだけコードをみせてくれない?
ん?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()のとこでは明示的にアクセス違反が 表示されないのが味噌だよな・・・)
>>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のプログラムとか。 まあ、この場合はたぶん大丈夫だろうが。
594 :
デフォルトの名無しさん :02/04/29 15:33
まぁそれを考えるなら、 一次配列の方が使用頻度が高いから sizeof(char **)<sixeof(char *) だろうね。 char **はそんなつかわないから 大きい数字必要ないっしょ。 (591)
595 :
デフォルトの名無しさん :02/04/29 15:34
よけいなつっこみをされたくなけりゃ、厳密に型を指定しろってことだね。
あのさ、あらゆるシステムでポインタのサイズが同じだと言っているんじゃないぞ。 同じシステムではポインタのサイズは何を指そうが同じだと言っているんだよ。
>>595 一般的な32bit環境のコンパイラはすべてのポインタが32bit=4byteだから。
それ以外の環境は見たこと無い。
64bit環境だと32/64bitポインタ混在だったりする。
gccのvoid*型が64bitで、型へのポインタが32bitだったり
>>600 まあそうだけど。。。
わけわからん・・・・void *なら指せても、char *なら指せない領域ができるってことだよね?
コメント入れた方がよかったか? 一番上の条件でググって、上から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; }
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
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 そりゃ、全角のスペースが17行目に入ってる罠。
>>614 まさかとは思うが、その最後の } の前の全角スペースは、
コピーミスじゃなくて、オリジナルにもついてるのか?
それと、ファイル名に全角文字は使わない方がいいよ。
619 :
デフォルトの名無しさん :02/04/29 17:36
>>614 最後の } の前に全角空白はいってるのが駄目。
コメント以外で全角文字つかっちゃ駄目だよ。
前からそうだったが、このスレは親切だな・・・。
623 :
デフォルトの名無しさん :02/04/29 17:37
みなさん、ありがとうございました。おっしゃるとおり全角スペースが入ってました。 次からは気をつけます。
624 :
デフォルトの名無しさん :02/04/29 17:37
>>614 思いっきり全角スペースが一番最後に入ってるやんけ
C/C++は全角文字は入れちゃだめなのよ、文字列とコメント以外はね
さすが、ダイヤルアップ&テレホしか入ってないから遅れたな(゚Д゚)
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 そうだよ。
だけど、アドレス幅は型に依存する。
636 :
デフォルトの名無しさん :02/04/29 18:19
>>635 floatなら%fだよ。
%lfはdouble
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)しているの?
それよか void mainなのに return 0; するとコンパイラがワーニングはくと 思うんだけど、なんで無視すんのよ。
642 :
デフォルトの名無しさん :02/04/29 18:28
>>640 作成されたexeファイルをダブルクリックで実行すると処理が終わった瞬間ウィンドウが
閉じてしまうのでそれを防ぐために入れています。
>>639 僕がうっかりしていたという以外の理由はないのでしょうか?
>>642 それはgetchar()でしょ?rewindはいらない。
getchar()一個だけだと最後のscanfの改行が残ってて、 ウィンドウ閉じそうに見えるけど。違うかな?
645 :
デフォルトの名無しさん :02/04/29 18:50
すみません、飯食ってました。 ホームページで「意味が分からないならとりあえずそのまま書き込んでおけ」 というような感じだったのでそのままコピペした部分もあります。 だからどういう意味なのか良く分からないという部分が結構あるのです。
>>645 そのホームページはどこ?
と、祭を誘ってみるテスト。
晒せ!晒せ!晒せ!
648 :
デフォルトの名無しさん :02/04/29 21:39
>>634 C99ではそうなったのか?C89ではそんなことないぞ。
C89ではアライメント制限以外に制限無し。char*, void*に入れて戻せないポイ
ンタは無い。ただし関数へのポインタを除く。
あの〜Cのコンパイラ欲しいんですけど、 win2000でも動くやつでいいやつどなたか知りませんか? 98SEをゲストOSで使うの飽きちゃって、 どなたか教えてください。
>>649 OS関係あるのか?
とりあえず Borland C++ Compilerがフリーだからそれでも使っとけ。
>>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); どちらが可読性がありますか?
659 :
デフォルトの名無しさん :02/04/29 21:57
>>657 if と { が同じ行だから上も駄目。
663 :
デフォルトの名無しさん :02/04/29 21:59
これ以上は戦争になるからやめよう。
>>661 俺的それは無い。
if
}
while
}
switch
}
てな感じじゃないと嫌。
漏れならこう書く。 if(mona== YES) { monadazo(eyei); } else { monajyanee(utudazo); } ahya->BltFast(0,0,---,---, DDBLTFAST_SRCCOLORKEY| DDBLTFAST_WAIT );
SP5ってNTじゃないんですか?
ifの書き方は669に一票。
>>670 だね。2000はSP2までだと思う。
あとVC++のSPも当てておくのが吉かと。
672 :
デフォルトの名無しさん :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型とみなされます。
基本だろ…。
すみません、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 勉強不足。
本読んで意味がわかるようになってから質問してください。
>>672 意味がわかりました!!
恥ずかしいので
憤死します!!
どうもありがとうございました
>>673 それK&Rの11ページだろ
明日本屋逝ってもっと薄いCの入門書買ってこい
プログラミング言語Cのサンプルプログラム をそのまま写したのですが、駄目なんですね。
K&RはANSI準拠じゃないから時代に合わない。
>>687 あー、本当にreturnがないねぇ・・・・・
K&R駄目なのかよ・・・ やけに日下部が進めるから今度買おうと思ったのに・・・
後ろの方ではきちんとreturnしているな。 たとえば166ページ。
>>693 第二版だけどはじめの方に載っているサンプルはreturn 0していなくて、後の方に載っているサンプルはしている。
>>691 辞書として一冊はもってたほうがいい。
ただ、K&Rだけで勉強しようとするとつらいので、
K&Rオンリーってのはお薦めできない。
>>695 いえてる。
私は他の本で勉強した後に間違って覚えたことや無駄なことを直すためにK&Rを読んだ。
辞書と言うには正確性が... 言語の開発者の思想書だと思って、 書き方のスタイルとか、標準ライブラリの実装法とか、 そういう「ココロ」を汲みながら読むのが正しいだろう。 K&Rの例題くらいはきちんとやっておけよ。 別売りの本まで買って答え合わせする必要はないが。
>>691 おっと、スレ違いになるからこれ以上書かないけど
K&Rが悪いんじゃないぞ
あまりに
>>673 が勉強しなさ過ぎるから書いただけだぞ。
「main関数ってナニ」って状態でいきなり2chに聞くなゴルァ
ってこった。
699 :
デフォルトの名無しさん :02/04/29 22:49
僕ならvoidつけちゃうな〜 って遅いか(w
思いがけないレス、サンクス。 第2版が最新だよね(1のリンク先より)。 なぜ『ホーキング、未来を語る』と”あわせて買いたい”のかは謎だが・・・ いや実際読みたいけどさ、ホーキング。
まっさらな素人がK&Rで入門しようとすると例題のどれかで挫折する可能性極大
でも、昔のCってマニアックで楽しかたーね。 省略は int アドレスも int 。 {も1文なら省略って、暗号みたいだた。
3重くらいのforループの一番深いところから一気に抜けるには gotoを使えばいいんでしょうか? 本来ならそういうループ構造にしないのが一番いいんでしょうけど(−−;
705 :
デフォルトの名無しさん :02/04/29 23:21
>>704 質問はageで。
gotoかフラグ変数で。
一気にというならgotoのみだな。
試しにどんなループだか書いてみ?
704 return
>>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 すみません、昨日プログラミング始めたばかりなので全然わからないんです。
>>718 srand()
rand()
time()
これらの関数が何をするのか解ってる?
単に言われたことをコピペするだけじゃ成長しないよ。
天然はオモロイね
725 :
デフォルトの名無しさん :02/04/29 23:53
>>723 おっしゃるとおりです。rand以外あるいはそれすら全然意味が分かりません。
しかし調べても書いてあるころがさっぱり理解できないのです。
>>720 それは719で指摘されたことに対する言い訳にもならない。
ちゃんとどんな機能か調べてから書け。
もしシステムを破壊するような命令だったらどうするんだ?
>>725 理解できるようになってから質問してください。
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に使える文字が定義されてる。
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でも似たようなのあるけどさ。 全部小文字だから許せない(嘘) で、常識を教えてくれ。(下さい)
関数名は「小文字 + アンダースコアつなぎ」が常識!!! プログラミング言語はRubyがさいこーが常識!!!!
>>730 おしい。
"data\\PlayerData.dat"
じゃない?
>>737 あなたレスで笑い出す俺はいまヤヴァいんだろうか…
>>738 日本語.comが使える時代にIsCharAlphaNumericなんて役に立たんぜよ。
743 :
デフォルトの名無しさん :02/04/30 00:10
うわ!はえーんだよ!それよか常識おせーろYO
>>741 だいじょうぶ。オレもちょっと面白かったから。
>>743 空白か改行か多バイトコードが出現したら、そこで切ればいんじゃない?
>>743 スペース、括弧、クオーテーション、カンマ以外全部だと思ってればいいんでない?
あ、カンマは駄目だ、使われてるの見たことある気がする。
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 だとしてもその引数に何を渡すか問題だ・・・
今K&Rが手元にない・・・(´・ω・`)ショボーン
いと○っさんめ!
769 :
デフォルトの名無しさん :02/04/30 00:43
rfc 2068: Hypertext Transfer Protocol -- HTTP/1.1 で、区切り文字調べろ。
>>769 現実にはそこに書かれていない文字も使用されているという罠。
仕様にあわせてまともに動作しないものを作るか、
実情に合わせて仕様を無視するか、それが問題だ。
772 :
デフォルトの名無しさん :02/04/30 00:52
>>736 UNIX系だとプロセスの外側の領域には無理でないかい。
Windows系、Mac系はわからん。
ヘンナコト スルナヨ。
773 :
デフォルトの名無しさん :02/04/30 00:53
>>736 移動する方向で転送の方法を変えるから
移動前と移動後の領域が重なっても大丈夫。
>>713 それがそうなんですよ。
いや、最初はHellow Would!!
がプロンプトに何の問題も無く表示されたんですけど
別のプログラムコンパイルして実行しようとすると
あのウインドウが。
ついてにHellowWouldの方でもその
ウィンドウが出るようになった。
コンパイラを上書きインストールしても直らないし。
どうしたら良いのでしょうか
>>775 どのタイミング?
コンパイル?
実行?
打ち込んでるコマンドライン、良ければここに書いてみたら?
777 :
デフォルトの名無しさん :02/04/30 01:22
>>775 それが本当なら今あなたが使っているブラウザだって起動できなくなるってことだよ。
もしかして.cや.objとかを実行しようとしていない?
>>775 たぶん
Hellow Would!!
が原因。
cd bcc これでbccフォルダ(ソースファイルのあるところ)に移動して bcc32 test.c これでコンパイル test.c これで実行すると 例のウインドウが開くのですが・・・・・・・・・・・・
>>775 は何か勘違いをしているに1000HellowWould
784 :
デフォルトの名無しさん :02/04/30 01:26
>>780 やっぱり(笑)
ソースコードを実行しようとしてどうするのよ(笑)
test.cじゃなくてtest(もしくはtest.exe)ね。
なるほど・・・・・ 馬鹿丸出しでしたね。 いや、最初の頃はマニュアル読みながらだったんで。 いつのまにか変な勘違いをしてしまいました。 でも解決できて嬉しい!!! どうも有難うございました!!!
>>780 やっぱりそんなことだろうとは思ってたよ(藁
>>780 .cは実行できないよ。ただのテキストファイルじゃん。
.exeを実行しようね。
ちなみに、ハリウッドのスペル間違ってるよ。HollyWoodだろ。
山田くーん、
>>788 の座布団全部もってゆきなさい。
>>788 爆笑してうまくキーが打てねーじゃねぇかドルァ!
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をつけてね。
さんきゅ〜です! 超絶倫兄貴板に逝ってきます、スンマセンデシタ
あ〜そっちだったか
>>801 彼なら超黄金脱糞板に逝っちゃいました。
804 :
デフォルトの名無しさん :02/04/30 02:07
女性SEに虐められたい。 age
チッ
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 うわ〜
後輩に出来るとか言っちゃった…
今日給料日だからいきなり買ってました…(汗
どうしよ(涙
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: }
これでした。 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ですが)
ごめん。コンパイラの種類書かないとわかんないですよね。
>>830 おぃおぃ、そこまでわかるならなぜ種類を書かない?
>831 立ち読みしただけなので、わからないんです。 調べてきます。
>>832 どんな本だったか(Windowsの本か?)、もしくは本の名前は何か書けばわかるかもな
>>827 下のやつ、だけどpの値を変更できないことに気付いてる?
p++ ---> だめ
--p ---> だめ
p = xx ---> 初期化以外はダメ
>>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型の領域を指す */
あ、一杯レス付いてる!みなさん、サソクス! アホな部分が多くて申し訳ないっす、みなさんのアドバイスを親身に受け取るっす。 どうもでしたm(_ _)m
ところで、 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 自体が定数っぽい気分になる と直感的に読める書き方をしてしまう傾向があるなぁ、俺は。
>>843 僕もそうです。んで、ちょっとここで聞いてみたわけです。
ポインタのエイリアスって、C++の「参照」から「参照先の値を得るときに
*をつけなくてもいい」って機能を除いた感じですか?
(c++知らないので馬鹿言ってるかも)
>>846 混乱してないか?
参照は*いらないぞ。
二次元配列で char **pp; とかがあるときに、 処理の途中で char *p = *pp; みたいなことするよね。 p もppも同じエリアを見に行く可能性があるとき、後から作った方をエリアスっていうんだけど constとかvolatileとかポインタ演算とか関数呼び出しが入り乱れてくると コンパイラがうまく最適化できなくて間違ったコードを生成したり、 最適化をあきらめちゃうことがある。 まともな最適化コンパイラなら、エイリアスに対してどういう最適化をするか 決めるオプションとかあるでよ?
ついでに無神経なポインタキャストも、最適化の障害になったり、 過ったコードを生成するトリガになる。 一処理一関数。 シンプルに問題を切り分けていけば、べつに混乱することもないんだけどね。
>833、836さん ありがとう。 ほんの名前はこれです。 C言語 (1) はじめてのCプログラミング 倉薫 著 定価:1900円 翔泳社
851 :
デフォルトの名無しさん :02/05/01 00:06
もちろん、LSI-C86の試食版はそのままでXPで使えるけどな。
XP'で'使えるが、XPの機能を使うことは出来ない。
>>850 >C言語 (1) はじめてのCプログラミング
>倉薫 著 定価:1900円 翔泳社
ポインターは電話番号だって逝ってるヤツか?
なら他を探した方がイイぞ
簡単にイメージさせようとしてるんだろうが余計ワケワカになる
てゆーか秀丸のマクロ組みたいだけならスゴイ遠回りと思われ
それと、 この作者はたぶんCでの実戦経験が少ないと思う 配列の添字が0から始まってる事がCのバグの原因のほとんどだ なんて書いてた気がする(W
>>856 ワラタ
添え字が0から始まらなかったら、a[i]==*(a+i)の関係が成り立たなくてそれこそバグの原因になると思う。
思い出した 構造体のメンバーにポインターを介してアクセスするとき なんで" -> "なんて書くのか意味不明とかも書いてたと思う 手元に無いので記憶はあやふやだが、 誰か持ってない?
推薦図書スレのほかに買ってはいけない図書スレがほしいな。
int a[5]; って宣言して5こ分しか確保されないのが納得いかないんだろうね<BASIC上がり
なんだ奇書か。
この本、だめっすか?
865 :
デフォルトの名無しさん :02/05/01 12:37
>>864 話のたねにはいいかも(藁
でも参考にしてはいけない。
やっぱ、はじめてのCでしょ。 パチモソは移管。
>>866 ま、まなタンですか?ハァハァ・・・・・・
>866 これかい? 改訂第3版 はじめてのC ANSI C対応 椋田 實 著 ISBN 4-8740-8546-6 技術評論社 1845円
あ、、、まなタンは「やさしい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
874 :
デフォルトの名無しさん :02/05/01 13:46
875 :
デフォルトの名無しさん :02/05/01 14:39
プログラム技術板一の良スレだな。
877 :
デフォルトの名無しさん :02/05/01 16:13
872です IMEのバッファにデータを入れる方法を教えてください。
シネ
874の責任。
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っぽい文字列抽出」に役立ったりして。
885 :
デフォルトの名無しさん :02/05/01 19:48
>>883 そりゃ名案だ!
const char *str2="0-9A-Za-z_-.*/?#=&"; /* 0-9A-Za-zは実際は展開して書く */
こんな感じかな?
本当は使えないけど'~'も入れておいた方がいいかも。
ポートを指定するときの:も加えた方がいいか。
喪前ら、そんなショボいパーザじゃなくて、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);
にしとけ。
業務用のコード書いてるなら、書式に長さの指定もきちんとかいとけ。
>>890 多分じゃなく確実に馬鹿な888です。
ありがとう。それでいけました。
特に業務用のコードってわけじゃなく、Cの勉強中です。
[^,]というのは正規表現で使う文字クラス指定のことですか?
あと、規格書ってどこで読めるんでしょう?
>>891 ISOからPDF購入してください。
\2k程度です。($18)
みなさん、コンパイルって、何でしてますか?
脳内
マジで?
>>891 と、おもったら、[^...]の解説はk&Rにちゃんと載ってますね。
すいません。読みたりませんでした。
>>892 ああ、買わないといけないんですか。この機会にかってみようかな。
>>896 K&Rあるならとりあえずそれで足りるよ。
Win系ならコンパイラにライブラリのヘルプが付いてるだろ?
実を言うと、AN HTTPDでローカルサーバ(?)を動かしていて、 PerlのCGIをテストしているのですが、Cで作ったCGIも動かしたくて、 いい方法を探していたのですが…。 参考になりそうな、サイトありませんか?
訓練してなきゃできないだろ。 そのうち、な。
>>897 フリーのbcc32なので、ライブラリヘルプがありません。
あと、書式付出力のとき精度や、幅を
変数で指定したいときにつかう*のようなものを使いたいんですが
書式付入力のときには * は代入抑止になるようで出来ませんでした。
890さんのいう「長さ指定しとけ」ってのは長さを直接書いておくんですか?
別に変数にして、そのつど長さを変えるというより
あらかじめ文字列長を#defineしておいて、'\0'の分1引いて
最大でSTR_SIZE-1だけ読み込むという形にしたいのですが。
分かりにくい&長くて すいません。
903 :
デフォルトの名無しさん :02/05/01 21:18
>>899 ん?コンパイルすれば実行できるはずだが?
ああ、あなたは
>>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を開設する予定はあるらしい。安くなるといいね。
>>881 ふむふむφ(..)
詳しい解説、感謝です!
>>883 > URLに指定しちゃいけない
ではなくて「URLに指定できる」じゃない?
>909,883 日本語ドメインを忘れているぞ。
>>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;
}
>>914 あぁ、こんどはプリプロセッサのところを見ないといけなかったんですね。
本当に、ありがとうございました。
読み直します。
出来ないんですけど・・・。
917 :
デフォルトの名無しさん :02/05/01 22:22
>>916 きちんと必要最低限のヘッダーを出力しているか?
Content-Typeとか。
#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); } をコンパイルすればいいんですよね?
>>914 うーん。
それ、やってみたんですが
TOSTR(LEN)のLENがそのまま"LEN"という文字列として連結されて
いるようなんですが・・・。
\r\n\r\nだろ
921 :
デフォルトの名無しさん :02/05/01 22:24
>>918 そうそう。
(ヘッダーの単語の一文字目は大文字にしようよ・・・)
>>921 これをコンパイルして、どのファイルを実行すればいいんですか?
>>922 (T_T)
コンパイルしてできたファイルに決まっているじゃない(T_T)
.cgiをCGIとして実行するようにしているならファイル名をhello.cgiとでもする。
>>923 Microsoft Visual C++でコンパイルしているんですけど、.dsp .dsw .ccp .h とか
いろいろな、拡張子のファイルが出来ちゃうんですけど…。
(゚д゚)<あらやだ
お前ら根気強いな・・・俺だったら100パー無視するぞ、こんなの。
>>924 統合開発環境を使っているのか。
ビルドするとDebugかReleaseフォルダに.exeファイルができるでしょ。
それを.cgiに変えればよいの(.cgiをCGIとして実行するようにしている場合)
CGIプログラムならテキストエディタにコードを書いてコマンドラインからコンパイルした方がいいと思う。
「-o 出力ファイル名」でうまくやってくれる。
混乱を招きそうだな・・・ -oオプションね。 cl -o hello.cgi hello.cってな感じ。
すみません。 HTTP 500 内部サーバー エラー になっちゃうんですけど。
>>928 ところで、
あなたは、何のコンパイラーを使っていますか?
>>930 LinuxではgccでwinではVC++6.0
>>931 telnetってwindows2000に付属しているやつでいいんですか?
>>934 とりあえずコンパイルしたプログラムを一度DOS窓から実行してみろ。
>>934 なんでもいいから
telnet 127.0.0.1 80
GET /cgiのパス↓
↓
と入力しろ。矢印はエンターな
>>937 Windowsに正常終了は似合わないからです。
>>936 telnet 127.0.0.1 80
はどこに入力するんですか?
ねたとかじゃなくて、全く分らないんですけど、 いいサイトがあったら、自分でやりますが…。
>>940 >>938 は偽者。
しっかし、なんで動かないんだか・・・・
Perlなら動いたんだよな?
だから、改行コードじゃねーの? \r\n\r\nだろ?
944 :
デフォルトの名無しさん :02/05/01 22:49
>>943 AN HTTPdってそんな糞仕様なの?
少なくともApache(Win32)なら\n\nでできるが。
perlなら、サーバとしているフォルダのなかにファイルを入れれば、動いています。
947 :
デフォルトの名無しさん :02/05/01 22:52
AN HTTPDってもしかして、必ず指定されたプログラム(例えばperl)にプログラムを渡すようにできている?
>>947 ああ、それだ!
今見てみたら、*.pl *.cgiは無条件でperlに渡してる。
*.exeなら直接実行する設定だ。
>>948 うわ・・・・なんちゅう糞な仕様だ。
さっさとそんなソフトは捨ててApacheにでも乗り換えろ。
>>949 手順を書く。
1 プログラムを書く
2 コンパイルする
3 できあがったexeを、public_htmlなどドキュメントルート以下に置く
3 ブラウザでアクセスする
以上。拡張子の名前はexeのままで。
>>949 なるほどね・・・・
コンパイルされた機械語をPerlに渡しちゃ、そりゃエラーになるわな・・
>>948 ということは、拡張子が.cgiならPerlのCGIって決め付けてるんですか?
AN httpdが。
続きは新スレで。
つまりは、Cで作ったCGIは.exeのままにしておくと。
>>953 設定を変更すれば可能だけど、
説明するのがめんどくさい
>>953 Windowsの仕様すら理解してなかったり。
ありがとうございました!!
>>959 うるせーな。
せっかくだからこっち消化しようや
AN HTTPDは.plや.rbという拡張子で実行した方がいいのかな。
>>964 .cgiのような汎用的なものじゃなくて、中身によって変えた方がいいのかなと。
Apache(Win32)だと最初の行の#!を理解してくれるからその必要はないけど。
>>965 設定したとおりにしか動きません。
*.cgiをperlに設定したら、ネイティブコードやRubyスクリプトで動作させるのは不可能です。
>>967 マルチユーザーのシステムでは使わないことだ。
ひとりなら、*.cgiを一つのアプリケーションに設定しても問題ないだろ
>>966 俺はもう新スレで1000取ったので満足です。
(・∀・)つ|現スレで1000目指しまふ|
フォルダ単位で実行権与えるとかできんのですか?
できんのです
AN httpdってサーバーソフト(?)ですよね?
976 :
デフォルトの名無しさん :02/05/02 00:07
↑何故そんなことも知らんのだ。
Apacheもサーバーソフトですか?
>>977 世界一のシェアを誇るWebサーバソフト。
ただし、On Linux
windows上で動くApacheありませんでしたっけ?
あるけど、シェア取ってない
シェアとってないって、どういうことですか?
>>982 Windowsでは普通はIISを使う。
ApacheはUNIX系OSで動かすのが一般的。
で、ウェブサーバはUNIX系OSを使っていることが多いから、Apacheが世界一のシェアを誇っている。
なんかレスがおかしいな・・・ とにかくWindowsサーバに限って話せばApacheはあまり使われていないってことだ。
IISはセキュリティーホールが多いらしいですからね。 ありがとうございました。
どうしてこのスレはほのぼのしてるんだろう
|| || || || || || || || || ∧||∧ ( ⌒ ヽ ∪ ノ ∪∪
|| || || || || || || || ∧||∧ ( ⌒ ヽ ∪ ノ ∪∪
|| || || || || || ∧||∧ ( ⌒ ヽ ∪ ノ ∪∪
|| || || || || ∧||∧ ( ⌒ ヽ ∪ ノ ∪∪
|| || || || ∧||∧ ( ⌒ ヽ ∪ ノ ∪∪
|| || || ∧||∧ ( ⌒ ヽ ∪ ノ ∪∪
|| || ∧||∧ ( ⌒ ヽ ∪ ノ ∪∪
|| ∧||∧ ( ⌒ ヽ ∪ ノ ∪∪
∧||∧ ( ⌒ ヽ ∪ ノ ∪∪
/⌒\ /\ /'⌒'ヽ \ ./\ | (●.●) )/ |: | >冊/ ./ |: / /⌒ ミミ \ 〆 / / |::|λ| | |√7ミ |::| ト、 | |:/ V_ハ | /| i | ∧|∧ и .i N /⌒ ヽ ) λヘ、| i .NV | | | V\W ( 、 ∪ || | ∪∪
| | | @ノハ@ ( / ⌒ヽ | | | ∪ / ノ. .(_/_/
∧_∧ /⌒ヽ ) i三 ∪ モウ ダメポ・・・ |三 | (/~∪ ::::::::::::::::::::::  ̄ ̄ ̄ ̄| ::::::::::::::::::::::::::::::::::::: ビュゥゥゥー・・・ 口 口 |:::::::::::/ ̄ ̄ ̄\:::::::::::: 口 口 |::::::::/ ヽ:::::::::::::: 口 口 | ̄┌┐l ̄l .| ̄ ̄ ̄| ̄ ̄ 口 口 | | ̄ ̄ ̄| | | | ̄ ̄ 口 口 | | | | | |
∧_∧ /⌒ヽ ) i三 ∪ モウ ダメ・・・ポ・・・ |三 | (/~∪ ::::::::::::::::::::::  ̄ ̄ ̄ ̄| ::::::::::::::::::::::::::::::::::::: ビュゥゥゥー・・・ 口 口 |:::::::::::/ ̄ ̄ ̄\:::::::::::: 口 口 |::::::::/ ヽ:::::::::::::: 口 口 | ̄┌┐l ̄l .| ̄ ̄ ̄| ̄ ̄ 口 口 | | ̄ ̄ ̄| | | | ̄ ̄ 口 口 | | | | | |
1000 :
デフォルトの名無しさん :02/05/02 01:19
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。