1 :
ウルトラハッカー 日下部陽一 :
02/01/30 09:02
しかし何でこのスレこんなに伸びてんだ? ユーザーが少なくなのはわかるが 言語仕様・処理系・書籍なんかの情報的に 枯れきってるはずなのに...
若返ってるよ??
5 :
デフォルトの名無しさん :02/01/30 09:57
C9Xで若返り?
>>3 voidがいたときに伸びたのはある意味わかるんだが…
>>3 > 言語仕様・処理系・書籍なんかの情報的に
> 枯れきってるはずなのに...
え、C++よりもJavaよりもCの方が新しい言語仕様ですが?
何か勘違いしてません?
>>9 私の言いたいことは
Cの言語仕様は最近新しくなったし、
それに伴って処理系も新しくなるだろうし、
書籍も次々に新しい本が出版されているし、
Cは決して枯れきっているわけではないことが言いたいんですが、
何か反論ありますか?
しかしこのスレの質問レベルはちっとも進歩してないぞ。
環境非依存なCスレの質問なんて、大概決まってるだろ。 malloc&freeでも延々やりたいのか?
9>10 ああ、枯れきってないってことですか。ならわかります。 言語仕様が新しい、は、ま、いいでしょう。
>>12 まあ入門者が質問してくる内容も大体決まってるわけで。
C マガジンが年中初心者向けの連載をしている事実。
そして、教えてもらった初心者がすぐに教える方になろうとして…(以下繰り返し)
C言語講座ってのはもっと殺伐としてるべきなんだよ。 初心者はすっこんでろ。
strdup("aaa"); で作った配列はいつフリーするよ? 関数の中で使っちまうとフリーできないじゃん。
malloc(n); で作った配列はいつフリーするよ? 関数の中で使っちまうとフリーできないじゃん。
>>18 真性DQNハケーン!!!
一生VBでも使ってろ(w
21 :
デフォルトの名無しさん :02/01/30 20:03
Ruby以外の言語は糞
MPEGプレイヤーを作りたいのですが、 C言語でも作れますか? よろしくお願いします。
main()も関数ですが(w いい感じに殺伐してるな(笑
25 :
デフォルトの名無しさん :02/01/30 20:14
>25さん レスありがとうございます。聞いたことのない言葉なのでちょっと今 検索してみたのですが、やはり一筋縄ではいかないようですね。 SMPEGについてもう少し詳しく勉強してみます。 ありがとうございました。
なんだよぉ!! 教えてくれてもいいじゃないかぁ。 ぷんぷん!
28 :
デフォルトの名無しさん :02/01/30 21:15
>>19 こんな感じでやったら?
void func()
{
struct str {
char *p;
~ str(){ free(p) ;};
} s;
s.p= strdup("aaa") );
・・・この後 s.pを使う・・・
}
そーゆー初心者に判りづらいネタはやめとけよ
>18 使い終わったらfree()しる!
31 :
デフォルトの名無しさん :02/01/30 21:46
真性厨房です。 いかのコードはなぜうまくいかないのでしょうか? #include <stdio.h> char *getStr() { char buf[] = "HELLO"; return buf; } int main(void) { char *str; str = getStr(); printf("%s\n", str); return (0); }
>>31 > いかのコードはなぜうまくいかないのでしょうか?
変数のスコープと寿命を良く理解していないから。
>>31 うまくいってます。
ただ、あなたの思った結果と違うだけです。
>>1 のC FAQ 日本語訳 、良く読みましょう。
35 :
デフォルトの名無しさん :02/01/31 05:36
どうしても わからないのですが fgetsが挙動不審になります・・・ getsはscanfと一緒につかうのはだめだ ってことはわかっているのですが fgetsはなにか かみ合わせのわるい関数があるのでしょうか もちろんscanfは読み取っていません fgets(str,100,stdin) のような感じで いくつかつかっているのですが 発動するところと それをシカトしてとおりすぎていってしまう 場所があるんです if文の中にあるとかそういうことではなくて、 必ず発動する場所においてあるのですが・・・
理由がよくわからないのですが 1度エンターキーを押すと なぜか連打されてるとみなされて 次にあるfgetsが作動しなかったみたいです あるていどcscanfに変えたら作動するようになりました(fgetsとcscanf混在で) なんでだろう・・・
>>27 K&R読みかえせ、ボケ。
なんて言っても、そもそもこいつ、
一度も読んだ事無いんだろうな(w
38 :
デフォルトの名無しさん :02/01/31 09:14
>>31 なぜ、return "HELLO";にしないの?
32〜34 サンクスです。分かりました。
40 :
デフォルトの名無しさん :02/01/31 09:18
>>40 同じ現象を再現できる短いコードを載せると、見てるほうもわかりやすい。
>>40 ,
>>41 すこし長くなってしまいますが
ソースの一部分だけこぴぺしました
cscanfにして解決したのですが fgetsでやると どうにもうまくいかないです
関数自体は発動するのですが・・・
cscanf("%d",&select); ←ここをfgetsにすると inputs関数内の最初のfgetsをよみとらないです
if(select<1 || select>6){
printf("1から6までの数を入力してください。\n");
return; //強制的にもう一度メニューを出す。
}
switch(select){
case 1: inputs(0); //Yを入れてるのに特に意味はない 再帰でつかいたかっただけ。
break;
case 2: bookserch(0);
break;
case 3: nameserch(0);
break;
case 4: save();
break;
case 5: load();
break;
case 6: exit(0);
break;
}
}
char inputs(char temp){
char str[100],ch='0';
if(temp=='N'){return temp;} //再帰から抜ける。
//書籍名の入力 配列への代入
printf("書籍名を入力して下さい。100文字まで許容します\n");
fgets(str,100,stdin); ←これを読み取らない
if(str[strlen(str)-1]=='\n') str[strlen(str)-1]='\0'; //改行をNULLへ
strcpy(book[nowMAX][0],str);
//著者名の入力 配列への代入
printf("著者名を入力してください。同じく100文字まで許容します\n");
fgets(str,100,stdin); ←これは読み取る
43 :
デフォルトの名無しさん :02/01/31 11:08
>>42 原因はストリームに、ゴミが残ってるせいだと思うのですが、
見た感じだと、fgets()を連続して呼んでるだけなんで、
問題ないように思いますが...
環境がわからないのでなんともいえませんが、改行コードが
おかしくなってるとか、そういうことは無いですか?
>>42 bookが char book[BOOK_MAX][MAX_BOONAME_LEN]; とかだとしたら
strcpy(book[nowMAX][0],str);
↓
strcpy(book[nowMAX],str);
それとも、fgets()で入力待ち状態にさえならないってことですかー?
FreeBSDで試しましたが、上のとこ直したら、ちゃんとうごいていますよー
45 :
デフォルトの名無しさん :02/01/31 11:33
改行コードを消すにはこれをやれ string[strlen(string) - 1] = '\0';
>>42 あ、char book[MAX_BOOK][MAX_ELEMENTS][MAX_LEN]; で
book[本の番号][0] が書名
book[本の番号][1] が著者名
でしょうか?だとしたら漏れの勘違い。スマソ。
>>42 「読み込まない」ってのはどうやって確認した?
49 :
yacc聞いてもいいですか :02/01/31 14:32
yaccで、 expr : expr1 expr2 と書いて、expr2の処理を先に実行させる方法があるでしょうか。 その結果をexpr1の処理の中で使いたいんです。
昔のBASICのプログラムをCで書き直すときに BASICのコマンド(予約語)をCの関数にして おけばいいとふと思ったのですが根本的に間 違っているような気もします.いかがなもの でしょうか.
Cで,RS232C接続でパケット通信をするプログラムを書くときの作法みたいなもの ありますか?綺麗に書くコツみたいなものがしりたいのですが,参考になる図書,Webでも 結構ですので,教えてください.よろしくお願いします.
43-38>> いろいろ回答ありがとうございます まず変数事態は book[nowMAX][0]書籍名 book[nowMAX][1]書籍名の 配列テーブルです それで fgetsは入力待ち状態にもなりません cprintfをfgetsに置き換えて・・・っていうのは 他でやってるのと同じように fgetsでまず文字配列に 代入して 改行コードNULL文字に変えて そのあとatoiで整数にしてselectに代入 という手順を踏んでます で、最初に関数に飛んだときは 1つめのfgetsが発動しなくて 2つめのfgetsは発動するんです。 そして その関数の中で再帰して同じ関数を呼んでいるのですが その再帰した関数では1つ目も2つ目も正常に働くんです いったい 最初にfgetsがはたらかないのは なにが原因なのかと・・・
53>> 43-48>>でした すいません タイプみすです(汗
あ ちなみに環境はVC++6 です。
本当に何回も連続投稿すみません・・・ book[nowMAX][0]書籍名 book[nowMAX][1]著者名 の配列テーブルです
>>50 機械的にコンバートするツール作るのなら
そんな風なしくみにすると楽だろうけど
手でやるならやってるうちに馬鹿らしくなってすぐ手抜き
(ていうか普通の移植)するだろうね。
58 :
デフォルトの名無しさん :02/01/31 17:32
>>53 デバッガは使える?
失敗するfgets()のあたりで止めて、入力される値とリターン値を確認してみそ。
ちなみに、うちの環境(VC6)で、fgets()を続けてコールしても、普通に動いてました。
char s[100];
printf("入力して下さい。\n");
fgets(s, sizeof s, stdin);
printf("入力して下さい。\n");
fgets(s, sizeof s, stdin);
printf("%s\n", s);
>>50 根本的に間違いです。
同じ名前の単語を作っても、文法が違うんだから
なにも解決しないよ。
(´−`).。oO( BASIC言語のインタプリタを作っちゃうっていうなら、いいけど。 )
>>53 cscanf()を置き換えたfgets()なんだけど、1文字入力だからって、
fgets(buf,2,stdin);
とかしてないよねー?
(第2引数の値をいくつにしたのか知りたい)
レスありがとうございました。BASICのプログラムが
たくさんあって毎日使っていますがF-BASICとか無く
なったら困るかな…と思いまして。
>>60 ああ巨大な盲点が…
63 :
デフォルトの名無しさん :02/01/31 18:32
>>62 代用できるフリーのBASICってないの?
OSのバージョンアップでF-BASICが使えなくなりました、って
ありそうな感じ。
>>58 デバッガつかえないんです・・・
VC++は本当にエディタとコンパイラしかつかってなくて・・・
VC++自体の勉強ももう少ししなければならないですね
まだC言語をやり始めて半月なので 超初心者なんです
ですが とっとと初心者脱出のためにがんばります
>>61 いえ あとで選択肢を増やそうとおもっていたので
第二引数の値は10にしてありました
>>62 Basicのソースなら VBとかDelphiの方が楽だろうに
? Basic→Visual Basicは楽かもしれんが、 Basic→Delphi(Object Pascal)はBasic→Cと大差ないと思われ
wchar_tについて教えてください。 Cのランタイムはwchat_tが1つにつき1文字としているようなのですが、 UNICODE関係を説明したページによると UTF-16は2バイト、または4バイトで1文字を表現するとなっていました。 今までwchat_tはUTF-16の文字のことだと思っていたのですが、 そうなると、wchat_tが1つにつき1文字とは限らないということになってしまいます。 4バイトで1文字を表している場合、どのように処理すればよいのでしょうか。 それとももしかしてwchat_t!=UTF-16文字なのでしょうか。
>>67 wchar_tがUnicodeとは気マット欄。
wchar_t がどんな文字コードかってのは処理系依存でわ。 勝手にUnicode系列と仮定してはいけません。
>>68-69 そうだったんですか・・・。
Windows&VC++上でとりあえずいけてたのでそう思っていたのですが、違う可能性もあるのですね。
ありがとうございました、大変勉強になりました!
Solaris では wchar_t が4バイトだった気がする。
EUCの固定幅の文字列が入ってる場合もあるな。 wchar_tに何が入るかはロケール依存だよ。 たまたまWindowsではどのロケールでもUnicodeなだけ。
74 :
デフォルトの名無しさん :02/02/01 08:54
あげ
HP-UXでは4byte、bcc55では2byteだな > wchar_t Cではintでもサイズは処理系依存だからな
76 :
私は31ではありませんが・・・ :02/02/01 15:00
>>31 がどうして上手くいかないのか分かりません。
気になってしょうがないので、どなたか教えてください。
>>76 ローカル変数buf[]はgetStr()から戻った時点で
スタックから消滅するからだ。
ちなみに
char buf[] = "HELLO";
を
char *buf = "HELLO";
にすればうまくいくだろう。
78 :
デフォルトの名無しさん :02/02/01 15:22
>>76 ていうか、戻り値はポインタ型だろ。
で、ポインタが参照している先を見に行くと、
(定義されていたはずの文字列データはスコープが期限切れになって
蒸発しちゃったので)なにも見えなくて当然。
char *buf = "HELLO"; これの他には 用は値が残ってりゃいいのだから static char buf[]="HELLO"; でも良い。
>>77 なるほど、上手く動きました。
ありがとうございました。
つまり、たしかにbuf[]の先頭アドレスをmainへ渡してはいるが、
mainに戻った時点で既にスタックが消え去ってしまっている。
ということですね?
おっと、こんなにレスが! みなさんありがとうございます。
>>80 勉強になりました。ありがとうございます。
84 :
デフォルトの名無しさん :02/02/01 19:46
連続して(例えばscanfで)入力を受け付けると、 ストリームに\0が残っているので、 1回目のscanfと2回目のscanfの間にはダミー変数に \0を読ませなければならない、と聞きましたが、 以下のコードは思った通り(?)に動きます。 ご教授頂けませんか? ちなみにコンパイラはgcc、OSはFreeBSDです。 #include <stdio.h> int main(void) { int n1,n2; printf("Please enter a number:\n"); scanf("%d",&n1); printf("Please enter the other number:\n"); scanf("%d",&n2); printf("Your entered number are: %d %d\n",n1,n2); return 0; }
>>84 一回目の入力値に数値でない入力をするとどうなる?
二回目の入力値をすっ飛ばさないか?
それは君の「思った通りの動作」なのか?
>>85 レスありがとうございます。
2回目の入力をchar型の変数を受け付けるようにすると、
入力をすっ飛ばしました
(こうなることを期待していた、というかそう習いました)。
でもなんで2回目の入力をint型で受け付けたら
入力をすっ飛ばさないのですか?
質問です。 Visual StudioのVisual C++でグラフィックのプログラムを 本を見ながら作成したのですが、 コンパイルとすると、#include<graph.h>のヘッダーファイルが 開けないというメッセージが出るのですがどうすればいいのでしょうか?
graph.hなんてあったっけ? 俺つかったことねーや
>>87 graph.hがないからでは?
Cの標準ライブラリにgraph.hはない。
したがってそれは拡張ライブラリであって、すべての環境に
存在しているわけではない。
>>89 なるほど。
graph.hがなしでグラフィック処理はできるのですか?
>>90 できる。
やりかたは、いろいろある。
VCのマニュアルや、マイクロソフトのホームページや
市販の参考書をみればいくらでも。
本って、なに見ながらつくってんだ?
>>86 bcc32で試してみたけど
Please enter a number:
hoge ← これを入力
Please enter the other number:
Your entered number are: 0 0
ってならない?
期待した動作って
Please enter a number:
hoge ← これを入力
Please enter the other number:
10 ← ここでの入力が可能
Your entered number are: 0 10
ではないの?
>>93 習った事を試してみたかったので、84のプログラムで、
Please enter a number:
hoge ← これを入力
Please enter the other number:
Your entered number are: 0 0
となって欲しかったんですが、
Please enter a number:
0 ← これを入力
Please enter the other number:
10 ← ここでの入力が可能
Your entered number are: 0 10
となったからびっくりしたんです。
どういう事なんでしょう?
>>92 学校にあった、初心者用のCのテキストです
>>94 わからない。
ちなみにSunOS+gccでも
> Please enter a number:
> hoge ← これを入力
> Please enter the other number:
> Your entered number are: 0 0
となる
FreeBSDは今手元にないので確認できない
>>96 てことはそんなに私がすごい勘違いをしているわけではないのですね。
ちょっと安心しました。
みなさんいろいろありがとうございました。
$ ./a.out
Please enter a number:
0
Please enter the other number:
1
Your entered number are: 0 1
$ ./a.out
Please enter a number:
hoge
Please enter the other number:
Your entered number are: 134518476 134518256
>>84 おわかりか?
ついでだから $ ./a.out Please enter a number: 12 34 Please enter the other number: Your entered number are: 12 34 $ ./a.out Please enter a number: 23hoge Please enter the other number: Your entered number are: 23 134518256
関係ないけど、 numbers are にしてほしい也
>>98 ,99
それは単にint型の変数にcharが入るからじゃないんですか?
>>101 入力が不正かどうか判断できないような関数なんか使うなってことじゃねぇの?
103 :
デフォルトの名無しさん :02/02/02 11:02
104 :
デフォルトの名無しさん :02/02/02 11:12
math.h をインクルードしても fmod が使えないんすよ。 .o は生成されるんだけど。 どーすればいいか、おせーて。 HPUXなり。
>>104 数学ライブラリをリンクしろ。C FAQ とか、処理系のマニュアル読んだか?
>>105 ゴメソ
数学ライブラリってなんすか。環境変数でリンクするんすか。
Win の開発しかやったことないのに、
いきなり HPUX での prj に放り込まれて、環境面が全然分からんすよ。
>>106 > C FAQ とか、処理系のマニュアル読んだか?
Winでも同じ事、VC++とかが裏でやってくれてるだけ。
>>102 ,103
なるほど。そういうことですか。
どうやったら文字コードチェックしたらいいかわかりませんが調べてみます。
でもどっちも数値を入れたら\0がストリームに残っていない(入力が飛ばされないことでわかる)、
のはなぜだかまだわからないんですが。。。
>>106 > Win の開発しかやったことないのに、
Win32 でも user32.lib とか dxguid.lib とかリンクするでしょ。
VC6 だと数学関係のライブラリは CRT (libc.lib, libcmt.lib, msvcrt.lib) に入ってるけど、
UNIX だと libc とは別のライブラリに入ってることが多い。だから明示的にリンクする
必要がある、って話。
具体的にどうするのかは、使ってるコンパイラ/リンカ依存なんで、分からん。マニュ
アル読んでくれ、としか言いようがない。
>>107 >>109 なるほど。。
って結局どうやるか良くわかんないけど、調べてみるっす。
皆さん、どもです。
HP-UX なら、リンク時に -lm だな。
112 :
デフォルトの名無しさん :02/02/02 15:38
デバッグしようとして、 関数の中に入ろうとすると変な画面が出てきて意味不明です。 一体、何なんでしょう?他の関数には入れるのに。 どうしたもんでしょうか?
>>112 全ファイルを、デバッグ情報つきでコンパイルしてる?
どーして”ストリーム”に'\0'が入ってるって思うんだろう??
デバッグ情報つきでコンパイルってどうやってするんですか?
>>115 ヘルプで調べろ。
質問するなら、使ってる開発環境とバージョンぐらい書け。
C++ のver6.0ですが。
ちゃんと答えられるまで、何度でも聞かれそうだな…
>>117 自分の環境もかけないやつは書き込み禁止。
>>117 それってもしかして、Microsoft Visual C++ Ver6.0 ですか?
また事件か
cl -ZI -GZ -MDd hoge.c カナ?
アサーションダイアログだな、
これにはちゃんとエラー行まで書いてあるし、
当該行にはたいてい理由も書いてあるが、
まぁ英語の読めない
>>112 には変な画面が出てきて意味不明なんだろうな。
124 :
デフォルトの名無しさん :02/02/02 20:24
C/C++とIEEE754ってどうゆう関係になってるんですか? 環境によって、浮動小数点がIEEE754準拠になったり ならなかったりするみたいだけど‥
125 :
デフォルトの名無しさん :02/02/03 00:26
char * func1(){ return strdup("unko"); } void func2(char *_char){ strcpy(_char,"unko"); } func1 と func2って、どっちがよろしいと思われてるんだ。 教えてみろ!
>>125 訳分からん…
全然違う動作する関数並べられてもな…
どっちがよいかじゃなくて、仕様が違うだろ。
>>125 つーか、char *_charってあたりで厨房大確定。
ごめんなさい。 C初心者厨房なので違いがわからないのですが よろしければ説明していただけませんか? 関数内で作り出した文字列を取得したいときに どっちの関数を使うと、効率的にとか、常識的にとかイイのでしょうか?
>>130 func1() は、戻り値を“忘れずに”free() しなきゃいけない。その代わり、
文字列サイズが何バイトだろうと受け取れる。
func2() は逆。戻り値は呼び出し元が責任持って確保しておかなきゃだけど
後処理はいらない。
状況によるだろうけど、まぁお好きなやり方で。
>>125 とりあえず、func2() は、恐くて使えない。
main() {
char buf[2];
func2(buf);
}
void func2(char *_char){
strcpy(_char,"unko");
}
ってしちゃったらどーしてくれるんだ!
せめてfunc2(char *buf,int buflen);にしてホスイ。
んで、func1()は、「必ず」メモリを確保されてしまうけど、
func2()は呼び出す側の都合で新たにmalloc()してから
呼び出すか、既に確保してあるメモリを使いまわすか
選べるので、漏れならfunc2()にしとく。
でも、あんまり気にしなくてもいいと思う。
とここまで書いたら、
>>131 が既に答えていた・・・
>>132 >>131 サンクスです。
なるほど、
int func2(char *buf,int buflen){
.......
strcpy(buf,"unko");
}
にします。
WindowsのAPIがこういう感じのばっかなので。
buflen使えよ。
もっともだ。渡したって使ってなけりゃ意味ない。
136 :
デフォルトの名無しさん :02/02/03 03:40
void hoge() { while(・・・) { if(〜) return; } } whileの中で returnするのってなんか美しくないような気がする... っていうか、安全なんですか?
安全。
138 :
デフォルトの名無しさん :02/02/03 15:18
atan()はどの範囲の値を返すんだろう? 見たところ π/2以上の値も出てきてるみたいだけど、 負の値も出てきてるから、ちゃんと決まってるんだろうか?
C言語の基礎は大体覚えたけど、今( ゚д゚)ポカーンって状態なんだけど次は何すればいい?
202.232.171.12 its1.catv.ne.jp Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Q312461) 01/28(月)21:42 こいつは『これ、ゴマキのケー番』などと言って私の携帯番号を流しました。本物ハッカー様方こらしめてほしいです。 もしくはこいつのこれ以上の個人情報が知りたいです。メールください。お願いします。 ニッポン777@ホットメールドットコムです。
環境がWinならVC++と参考書購入。
142 :
デフォルトの名無しさん :02/02/03 16:03
>>140 ちょっと俺のハッキングテクノロジーで
いたいめにあわせておいたよ、
もう二度としませんっていってた
144 :
デフォルトの名無しさん :02/02/03 16:44
double 型からint型に直すには 前に(int)をつけるだけじゃダメなんでしょうか? 全部0.000・・・ってなってしまうんですけど・・・。
doubleからintにキャストするのはOK。 double*からint*は逝ってよし。 それと、intに直した話なのに、 表示が0.000というのは理解できん。 コード出せ、コード。
>>139 モチベーション低いのはどうしようもありません。
147 :
デフォルトの名無しさん :02/02/03 17:16
>>144 double型の変数にintにキャストした値を入れていないか?
148 :
デフォルトの名無しさん :02/02/03 17:23
>>144 整数型の値をprintfで実数型として(%f)表示しようとするとそうなるけど、
まさかそんなことしていないよね?
どう考えてもしてるだろ。わざとらしい
150 :
デフォルトのななし :02/02/03 20:10
いままでASCIIで作ったデータファイルに データを保存していたのですが、 データが見られたくないのでバイナリか何かで保存しようと思っています。 その場合どのように直すのがセオリーでしょうか?
151 :
デフォルトの名無しさん :02/02/03 20:17
<a href="../test/read.cgi/tech/1012348974/143" target="_blank">
>>143 </a>
ハッキングテクノロジーとかってほざいているやつ、ケーサツにでも突き出さないとな!
>>150 バイナリの形式をどうするかって話なら、DES か何かの適当な暗号アルゴリズム
を使って暗号化しとけば。(ソースは google 行けば見つかる)
153 :
デフォルトの名無しさん :02/02/03 20:33
154 :
デフォルトの名無しさん :02/02/03 20:35
CとC++は全然違うの?
ぜんぜん ちがう
俺も、別物に一票。。。 仮想関数テーブルとかリンカの修飾方法とかぜんぜんちゃうやん。
> 中身は一緒 反論も多い言い方だろうけど、同意しとこ。 C言語にやたらと多機能なプリプロセッサを被せた物≒C++
>>152 ワラタ
不可逆暗号でバイナリ化したら、データファイルの意味が・・・
>160 DESをハッシュの一種と思ってる香具師ハッケーン
つーか不可逆暗号って? と思ったら俺がDQNだった。逝ってこよう
164 :
デフォルトの名無しさん :02/02/04 01:15
そもそも暗号自体ハッシュに使えんか?
166 :
デフォルトの名無しさん :02/02/04 01:23
ビットパターンを縮小できないとハッシュにならないんじゃ? CRC はハッシュになるけど
168 :
デフォルトの名無しさん :02/02/04 03:08
local変数にstaticってつけたこと無いんだが どういうときに使うんだ? ループに入る前に宣言しちゃえばいいんじゃないの?
>>168 関数呼び出しをまたいで状態を保持しておきたいとき。
170 :
デフォルトのななし :02/02/04 08:07
すみませんが、読んでるソースがマクロが多くて やたら読みづらいです #defineマクロだけ展開してくれるツールみたいなものってありますか? 厨房ですまんです(;´Д`)
171 :
デフォルトの名無しさん :02/02/04 08:13
あるライブラリを作っているときに、 そのライブラリが参照しているリンクのエラーを コンパイル時に確かめることは出来ますか? それともそのライブラリを使ったプログラムを 作りコンパイルして確かめるしかないのでしょうか? コンパイラはgccです。よろしくお願いします。
>>170 ていうか、プリプロセッサとかテキストエディタで
できないと思っているのか?
>>171 リンクが動的ならプログラムを実行しない限りエラーするかどうかはわからない。
objdump や ldd 使って自分の環境ではエラーしないことは確かめられるかもしれんが。
>172 出来るんですか!? コンパイラのオプションを調べたけどそれらしいものが無かったです。 テキストエディタで手動で置換すれば出来るだろうけど・・ そういえば今まで気にしたこと無かったけど 「プリプロセッサ」ってなんだろう??????
>>173 そうですか。
libtoolとか関係ありそうなのでちょっと調べてみます。
ありがとうございました。
マクロのせいで読みにくいって、マクロ定義したやつのセンスが悪い場合と、 読むほうにソース読み力が無い場合とあるからなぁ…
178 :
デフォルトの名無しさん :02/02/04 11:09
ところで皆さんautomakeやautoconfは使いこなしてますか? makefileすら下手なの書くのが精一杯なのにこれ以上ツールを 覚えるのはしんどい・・・ でも#ifdefで分けてやるのもちょっとめんどくさくなってきました。 上の二つを覚えると楽できるんでしょうか。
> ところで皆さんautomakeやautoconfは使いこなしてますか? 私も知りたい。特にautomakeやautoconfの実践的な本 makeはオライリーのmakeの本で覚えた。
このネタでUNIX板に立てても怒られないかな? どうでしょうか? automake,autoconf,libtoolの三本立てで。
183 :
デフォルトの名無しさん :02/02/04 17:16
>176 emacs使ってなくて Windowsなんですよ。 Win環境で何かご存知使えるものは無いですか? 秀丸のマクロをあたったんだけど無いみたいです。
185 :
デフォルトの名無しさん :02/02/04 22:42
Borland C++にはcpp32(c preprocessor)ってのがついてたな
>182 昔この板で立ってた気がするけど、あんまり盛りあがらなかった様な。 実際使ってるやつのリサーチとかしてみると良いと思われ。 大抵そういうやつは2ch見てないんだな・・・
188 :
デフォルトの名無しさん :02/02/04 23:17
sz=4410; LPBYTE lpData=new BYTE[sz]; このnewで不正な処理が発生するのですが、 考えられる原因は何がありますでしょか。
szが実はoperator=(int)とoperator size_t()を定義したクラスのインスタンスで、 operator size_t()内で強制終了するようなことをしてる・・・とか、まさか無いよね?
190 :
デフォルトの名無しさん :02/02/04 23:32
本気で原因が解らず new BYTE[4410] ともしてみましたが、駄目でした。 2000/XPでは大丈夫なのですが、9xでは全く駄目な様です。
それの実行まえにヒープが破壊されていた、に一票。
FAQを調べるの しんどい なんでも聞けて 怒らない人いないかなぁ・・・・・
>192 Mr.Google。
>>191 どの段階で破壊されているのか調べる術はありますでしょか?
>194 vc++なら、_heapchkをばらまく。 いずれにせよ、銀の弾丸は存在しない。 運が良ければ、BoundsChecker、Purifyなどの 境界チェッカ等が役に立つかも。
>>195 あ。。。その様な便利な関数が用意されていたんですね。。
問題が出る以前の所で確保しても逝く事が解ったので、
LogPut("********00..");
lpData=new BYTE[4096]; delete lpData
LogPut("ok\r\n");
をあらゆる所にばら蒔いて、なんとか発見・駆除出来ました。
有り難うございました m(_ _)m
198 :
デフォルトの名無しさん :02/02/05 09:14
>>192 わからないことがあったとき調べるんじゃなくて、
時間を作って通して読んどけ。
>>192 大学の先輩で、レポートの下調べも彼女にやらせて
口述で報告させてから自分で書く、とかやってる人が居て。ヽ(;´д`)ノ
首尾よく卒業して、就職して。
数年後、リコーン ヽ(´Д`)ノ
∴ うざうざな輩は嫌がられるらしい。
200 :
デフォルトの名無しさん :02/02/05 14:17
void age();
201 :
デフォルトの名無しさん :02/02/05 19:34
main関数で引数を受けるときchar *argv[]で受けますよね。 あれはなんで何ですか? char argv[]では配列のサイズが指定されていないから駄目なんですか?
>>202 []の方が*より優先順位が高いから
char *argv[]は配列に対するポインタじゃないんですか?
じゃあchar *argvでもいいような気がするんですが...
204 :
デフォルトの名無しさん :02/02/05 19:43
>>201 ダメです。
だからその方法で受け取るととても不安定になります。
ウインドウズはそうやってC言語で作られている部分があるために
フリーズしやすく不安定です。
Linuxではvoid main()で作ってあるので頑丈です。
>>203 > char *argv[]は配列に対するポインタじゃないんですか
ポインタの配列です。
>>204 わけわからん事書くな。
char* argv[]; // argv is an array of "pointer to char" なら argv[0] は文字列。 argv[1] は文字列。argv[2] は文字列…。 char* argv; じゃ全然ちゃうだろ。
>>202 ,205,206
レスありがとうございます。
確かにchar *argvじゃ駄目なことはわかりました。
だけどchar *argv[]がポインタの配列てのがよくわかりません。
ポインタの配列とは配列の要素がポインタであるものですよね?
じゃあ、argv[0]もargv[1]もポインタですか?
>>207 typedef char* pchar;
pchar argv[];
こう書けば分かるか?
pchar = char*、charのポインタ
argv[] = pchar型の配列
>207 ひょっとして char * はポインタじゃないと思ってます?
>>208 うわっ!本当にありがとうございます。
優先順位てそういうことだったんですね。
やっとわかりました。
すっごいすっきりしました。
ありがとうございました。
211 :
デフォルトの名無しさん :02/02/05 20:43
マクロに関する質問。 Cで制御系プログラムを組むのだが、 レジスタに値をセットするとき、 下記の(1)の様に関数にすると処理が遅くなってしまう。 SetRegister(Address, Data); ----- (1) 仕方なく、 Address = 0xXXXX; ----- (2) *Address = Data; とするのだが、見やすくするために、 出来れば(2)をマクロにして1行で書きたい。 これって可能? 基本的な質問で申し訳ない。
やってみれ。
なぜか動いたけど、これ安全? #define SetRegister(ADDR, DATA) Address=ADDR;*Address=DATA; 数年前、ARMのCコンパイラで動かしたらうまく行かなかったんだが、 なぜかBCCでは動いとる。
>>213 #define SetRegB(ADDR,DATA) *((unsigned char *)ADDR) = DATA
#define SetRegW(ADDR,DATA) *((unsigned short *)ADDR) = DATA
こにゃにゃかんじで。
0xbeef=0xff; なんて書いてたころが懐かしいな。
なんでメモリに書くのにSetRegister?とおもったら、メモリマップドI/Oなのね、もしかして。
217 :
デフォルトの名無しさん :02/02/06 00:44
そ、あるICのConfigを設定するレジスタ。
>>214 な〜るほど、こう書けば良いのか。
どうもありがとう。
219 :
デフォルトの名無しさん :02/02/06 10:45
C言語で典型的な構造体のメモリ配置を教えてください。 ワードに揃えると聞きましたが、要するに2バイト単位で配置されるのですか?
220 :
デフォルトの名無しさん :02/02/06 10:51
「C言語で典型的な構造体のメモリ配置」なんぞない。 処理系依存だ。 コンパイラスウィッチで変更できる処理系もある。
>>219 > 要するに2バイト単位で配置されるのですか?
16bitマシンの時代はそういう配置が多かったな...
> C言語で典型的な構造体のメモリ配置を教えてください。
で、知ってどうするつもり?
222 :
デフォルトの名無しさん :02/02/06 12:18
レスありがとうございました。 >で、知ってどうするつもり? 気になって仕方が無いのです。 書籍を読んでも構造体のメモリ配置について詳しく説明してるのには一度も出会った事は無いので。
223 :
デフォルトの名無しさん :02/02/06 12:24
>>222 メモリ配置について理解したいなら、C 言語ではなくて、その背景にあるプロセッサ
アーキテクチャについて調べる必要がある。Intel や MIPS あたりは Web で資料を
公開してるから、拾ってきて読んでみなよ。
あらら、考えてることは同じなのね。
227 :
デフォルトの名無しさん :02/02/06 12:37
本当にありがとうございました。 これからそれぞれ巡って勉強したいと思います。
228 :
デフォルトの名無しさん :02/02/06 12:41
キーワードはbyte alignmentだ。 「アライメント」などと書くバカがいるが, 「アラインメント」だ。
229 :
こんな本を買った :02/02/06 14:25
「C言語 関数の使い方+作り方 完全制覇」 これ、どうですか?
231 :
こんな本を買った :02/02/06 14:37
>>230 辞書的な使い方ではなく、本の先頭から順にこなしていく使い方の方がいいですか?
んなもん好きにすりゃいいべや
233 :
こんな本を買った :02/02/06 15:53
>>233 どう見ても「全部読む」タイプの本だろ。それは。
googleにて アライメント 26,900件 アラインメント 3,260件 正直ネイティブ発音に拘る奴って馬鹿にしか見えん
もともと *int だった void* から int の値を取り出す時って nValue = *((int*)p); こう書くしかないでしょうか?なんかもっと簡単な記述ありましたっけ?
誤: *int 正: int*
239 :
デフォルトの名無しさん :02/02/06 16:20
memcpy(&nValue, p, sizeof(int)); もっとめんどい?
当方学生で、ただいま四則計算の電卓をC言語で作成しようと悪戦苦闘しています。 どなたか方針のヒントをください。
242 :
デフォルトの名無しさん :02/02/06 16:26
>240 仕様は?
>>240 どういう環境で仕様の電卓を作りたいか説明出来る?
>>235 確かに拘り始めたら、ファイルランチャーとか言えんくなるなw
245 :
デフォルトの名無しさん :02/02/06 16:30
>>240 > 方針のヒントをください。
yacc lexで検索
または
int main(void){ return system("bc"); }
>>246 data の発音は、ネイティブでもまちがってる率高いらしいしな。
>>241 ん?
たとえばどういう時にマズいの?
おせーて。
>>252 う…そうなんだ。
>>236 から
>>239 への置き換えがまずいケースが思い付かなかったんだ。
逆がダメなのは分かるんだけど。
厨な質問で済まないんだけど、どんな場合だとまずいか教えてくれない?
>>247 電卓といってるから、演算子の結合順位無視の逐次計算で構わないんじゃ
ないの。
逆ポーランド…なつかしい
>>254 > 演算子の結合順位無視
1+2*3=9になるの?そんな厨房電卓は嫌
>>254 仕様、逆ポーランドでいいのかなぁ?
(´-`).。oO(正直、240はギリギリすぎる)
>>239 それは面倒くさい…というか、吐かれるコードが違ってくる気が…。
>>248 あ、カッコ外せますね。
>>253 こんな質問するくらいなので詳しくないんですけど、
memcpy の実装によって全然吐かれるコードが違うのと 16ビット8086だと
アドレスがリニアじゃないとか、色々あるような気がします。
やっぱこんな感じに書くしかないんですねぇ…。
ありがとうございました。
C言語によるプログラミングっていい本ですか?
261 :
デフォルトの名無しさん :02/02/07 02:17
LinuxでCD-ROMドライブを開閉させる方法を教えて下さい。 opencdtrayという関数(?)を使うのは分かったのですが、 googleで調べても、15件くらいしかヒットしないし、内容は 関係ないものが殆どだし・・・。 よろしくお願いします。
262 :
89454 :02/02/07 02:29
、-.、._ .__
`ヽ、"'' - ._ _,;:-‐ ''"/
\ ~'' ー ,,__ _ ,,.:::-‐ ''" "~ /
ヽ、 , ヾ'ヽ、__ ./'i~ /
\ |! 丶、\"ーェ''7 / / _..,,ノ
`ヽi`ー-;,___"''ゝー<''~ ,,、-'"~i-ー''"~
、_冫=-:::::::::::~"''"⌒ ̄ ァヽ,.へ,
`ー,-''~::::/::::::: ::::::::::::`>'´,/、丶
/ /:ァ'::::::::,i::::::、:..::: :::....ヽィ'\ノ::::. \
、_, -/ .:ァ' .:シ ::...::::/!| ::::::|'、::::l__::i:::::;i :::::}:::::: `ヽ、,____,
、_ニ=‐{ .:ノ! i, .:{ァ'"メ.l{l ::::| 'l''"}::`|.:::::} :::ト、:: "''==ニ
. `ー-/{./ { |:{.:{ヾツ_..,l,{....:::|. |' `ヽハ:ノ:::l::::|:::ヽ、 `ヾ、
ァ' /'.リ l :l|::ヾ〉.,ィ⌒i `ー'' ' `‐リ::ノ::ノ:::::i、ヽ 丶ト、
. // .:/ .:ハ|:iハi、'、ヾ゚ツ ''"¨ヾ,シ:/|:::: ハ:::}:..、.:: ::l )
// / .:,' .:/:l .l:;:;リ}::} ひ、、 ` 、、-'ソ /::'ノ'ハ::::}::::}:::ノリ
リ { .:/! :{ヽト'^^'リ :` 、_⊂ニつ '' lハ|ノ:ノ_ V ル'/
l. ::{ `ヾ ‘ .-ーレルハ''lー-‐'"|リルy⌒~ /
. ヽ| /´ /#ハ ,.:-‐l#l~ /
{ ,: ./#/ ' .|.#|.. ..ァ'
l .:i/#/ |#.{. ,;'
l ァ'-‐‐-:::;',.__ l.#|/
i ./ ' ~⌒`ヾ、}'
| .{ :::...... }
j .ヾ、_::::::,,:::::::-‐ .....::ノ
l {=-‐-::;;_ ュ `::;;__;;;シ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
http://www.puchiwara.com/hacking/ やっぱコレだねェ〜♪
263 :
デフォルトの名無しさん :02/02/07 02:31
ポインターが分かりません。 char **p; sizeof(**p);<- 1 *p;<- 0
がんばってください。
266 :
デフォルトの名無しさん :02/02/07 03:25
#include <stdio.h> main() { int a[5]={1,2,3,4,5}; int *p; int i; p=a; for(i=0; i<5; i++) { printf("%d",*(p+i)); } } で、実行結果が「12345」だと書いてあるのですが、仕組みがわかりません。。 printfの中の「i」は0〜4になるのはわかりますが 同じくprintf中の「p」は0なんですか? 0だから「*(p+i)」が0+0でint a[5]={1,2,3,4,5};の中の「1」が表示されるんですか? そうすると、次は1+1で「2」が表示されますが、 その次が2+2で「4」が表示されるってことになります。そうすると間違いです。 悩んでいます。どなたか説明してもらえませんか?
267 :
デフォルトの名無しさん :02/02/07 03:30
>>266 診断証
診断の結果、あなたは相当の重症であることが判明しました。
根本的に脳に欠陥があります。
むりにプログラミングなどしようとせずに、おうちでゲームでも
して療養してください。
>>265 それはなんとか分かります。
でも、*pの中身が整数定数なのに
なぜ**pがsizeof()の中で参照できる
のかなぞです。
>>268 sizeofは参照したりしません。
コンパイラがコンパイル時に定数に置き換えます。
sizeof(p)とやると
pは(charへのポインタへの)ポインタ型だから
アドレスが格納できるサイズ(大抵4byte)
sizeof(*p)も*pは(charへの)ポインタ型なので上に同じく
sizeof(**p)は**pはchar型なので1byte
というように型からコンパイラが判断するのです。
>>268 あと、基本的にアドレスってのは整数なので
整数定数でも参照できます。
271 :
デフォルトの名無しさん :02/02/07 06:19
便乗で質問。 Cは一通り知ってますが、 ふだん使わないのと、手元に本がないので・・ sizeofで指定するメモリの格納場所って 「格納場所の先頭」である必要がありましたっけ? たとえば a[5] が確保されてる場合、 a はいいとして、a+1 でもおんなじだったでしょうか?
>>271 「格納場所の先頭」である必要があります。
char a[10];
sizeof a; //10
sizeof (a+1); //10でも9でもなくポインタのサイズ(4とか)になる。
つか試したほうが早いんじゃ…つかもう試してたり…
273 :
デフォルトの名無しさん :02/02/07 07:03
>>272 なるほど。
「ポインタの型」を返してしまいますか。
いや、試してGOでも良かったのですが、
規定されてなくて処理系でたまたま動きましたではマズイなと思って。
274 :
デフォルトの名無しさん :02/02/07 09:16
初心者的質問ですが 構造体の値を変数に入れるにはどうしたらいいでしょうか? double a; struct tekitou { double c; double d; double e; }; static struct tekitou kozotai[]{ {1,2,3} }; i=0 a = kozotai[i].x←ここでエラーが出てしまいます。 よろしくお願いします。
tekitouにはxと言うメンバが無いからでは無いでしょうか?
xってどこで定義してんの
あう かぶった
すみません間違えました。 ×a = kozotai[i].x ○a = kozotai[i].c;
エラーメッセージはどんなの?
VC++だけど kozotai[]と{の間に=入れて i=0 をint i=0;にして.cを.xにしたらコンパイルできたよ。
=がなかったのか
すみませんその場で書いたものですからいろいろ抜けてました。 =は入ってます。 iもintで宣言してます。 しかし”文字’…’は認識できませんと出てしまいます。
283 :
デフォルトの名無しさん :02/02/07 09:44
>>282 全角文字(主にスペース)が入ってるんじゃないの?
283じゃないけど、エラーメッセージは1字一句たがえずコピーする、
ソースは問題が再現するものを載せる。常識ね。
>283 構造体配列があまりにも長いので…
> 全角文字(主にスペース)が入ってるんじゃないの?
に同意。
>>285 そういうときは、エラーが再現出来る範囲で出来るだけ短く削れ。
何も問題の出ないソースを貼られても誰も解決できんぞ。
スペースでした…申し訳ないです。 どうもありがとうございました。 勉強し直してきます…
288 :
デフォルトの名無しさん :02/02/07 11:48
foo.cで ... const int a[5] = {1,2,3,4,5}; ... bar.cで ... extern const int a[]; ... とするとbar.cでコンパイルエラーが起こるのはなぜ?
>>288 想定される理由1:bar.c内で sizeof a とかやっている。
つーかエラーメッセージを書け。
290 :
デフォルトの名無しさん :02/02/07 12:21
>>288 エラー以前にそういう書き方はバグのもとだと思います。
int iListMax=0; char **ppListData; void AddList(char *pData) { char **ppListTmp=new char*[iListMax+1]; if (iListMax){ for (int x=0; x<iListMax; x++) ppListTmp[x]=ppListData[x]; // memcpy(ppListTmp, ppListData, sizeof(ppListData)); delete pListData; } pListData=pListTmp; pListData[iListMax]=new char[strlen(pData)+1]; pListData[iListMax][0]=0; strcat(pListData[iListMax], pData); iListMax++; } この様な流れでpDataをppListDataに追加したいのですが、 memcpyだとエラーが出ます。 よく解らないままsizeof(*ppListData)等ともしてみましたが、 駄目でした。一体何が悪いのでしょうか。
292 :
デフォルトの名無しさん :02/02/07 12:27
あ 下の辺りpが抜けてました…訂正
>>291 > 一体何が悪いのでしょうか。
C++でSTLを使わずに自作ルーチンを作る行為
295 :
デフォルトの名無しさん :02/02/07 12:36
>>291 > 一体何が悪いのでしょうか。
CのスレでC++の質問をする行為
>>291 memcpy(ppListTmp, ppListData, sizeof(char*)*iListMax);
かなぁ...
>>291 エラーとは関係ないと思うけど、
delete pListData;
は
delete[] pListData;
こうしないと。
298 :
デフォルトの名無しさん :02/02/07 12:44
>>291 sizeofの値はコンパイル時に決まるだろ?
newやmalloc()した領域の大きさを返すもんぢゃない。
失礼しました。。++は不許可でしたか(;´Д`) sizeof(char*)*iListMaxで試してみます。 有り難うございました。
300 :
デフォルトの名無しさん :02/02/07 13:03
>>289 ごめんなさい、コンパイルじゃなくてリンクの
ときにbar.cのaの宣言違うぞと怒られてるみたいなんですが。
処理系はVisualCです。
複数のファイルにある関数から参照するテーブルを定義する
ときにどうするのが一番綺麗なんでしょうか。
>>300 全角文字(主にスペース)が入ってるんじゃないの?
283じゃないけど、エラーメッセージは1字一句たがえずコピーする、
ソースは問題が再現するものを載せる。常識ね。(
>>284 より引用)
302の1行目(全角〜〜)はカット
304 :
デフォルトの名無しさん :02/02/07 14:10
確かにVC++でconstにたいしてexternするとリンク時エラーが出る。 error LNK2001: 外部シンボル ""int const * const a" (?a@@3QBHB)" は未解決です C++としてコンパイルした時には出るが, Cとしてコンパイルすると出ない。 よくわからん。
>>300 (゚Д゚)ゴルァ
エラーメッセージ読め!
読んだらコピー&ペーストして(以下略)
306 :
デフォルトの名無しさん :02/02/07 14:14
>>301 ファイル名をcppからcにしたら直りました。(うーん?)
お騒がせしました。コードとエラーは下記の通りです。
//------foo.c:
#include <stdio.h>
const int iTable[5] = {1, 2, 3, 4, 5};
extern int LookupTable(int);
void
main()
{
LookupTable(1);
}
//---------bar.c:
#include <stdio.h>
extern const int iTable[];
int
LookupTable(int iPos)
{
return(iTable[iPos]);
}
-------------------構成: test - Win32 Debug--------------------
コンパイル中...
foo.cpp
bar.cpp
リンク中...
bar.obj : error LNK2001: 外部シンボル ""int const * const iTable" (?iTable@@3QBHB)" は未解決です
Debug/test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー
test.exe - エラー 2、警告 0
307 :
デフォルトの名無しさん :02/02/07 14:19
>>304 そこでなぜヘルプを(略)
extern const int a[5] = {1, 2, 3, 4, 5};
うりあ。
309 :
デフォルトの名無しさん :02/02/07 14:29
>>304 C++でconstは外部リンケージではないというのは常識だと思うが...
>>309 VC6 だと明示的に extern 宣言入れとくと、外からでも見えるみたい。
// Config.hpp
namespace Player {
extern const double SPEED;
}
// Config.cpp
#include "Config.hpp" // これを取ると見えなくなる
namespace Player {
const double SPEED = 1.0;
}
311 :
デフォルトの名無しさん :02/02/07 14:35
>>266 #include <stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
int *p;
int i;
p=a; /* p = a[0] */
for(i=0; i<5; i++) {
printf("%d",*p);
*p++;
}
return(0);
}
>309 そーなの?知らんかった。 どっちにしろ、ここはCのスレだ。(開き直り)
>>266 ポインタがわからない、っていうのはよく聞くけど、ポインタの存在に気がついてないってのは、おもしろかったぞ。
>>310 > VC6 だと明示的に extern 宣言入れとくと、外からでも見えるみたい。
「VC6だと」というか、C++のconstは デフォで内部リンケージ、
extern つけると外部リンケージ。
(Cはデフォで外部リンケージ)
>「VC6だと」というか、C++のconstは デフォで内部リンケージ、 > extern つけると外部リンケージ。 古いコンパイラだとこの辺の仕様が違っていたりして...
つーか仕様変更に付いていけない。 いつから「C++でconstは外部リンケージではない というのは常識」になったんだ?
>>300 みんなが見るものはヘッダファイルで宣言すれ。
> つーか仕様変更に付いていけない。 この規格が決まったのは大昔だろ。 すくなくとも俺が10年くらい前に読んだ本には書いてあった。
>>317 「C++ではdefineじゃなくてconstで定数を」という常識と同じ程度に昔からだと思うが。
321 :
デフォルトの名無しさん :02/02/07 15:57
別にc++のconstが内部リンケージっていう仕様はそれはそれでいいけど なんというか、ファイルの拡張子見て勝手にcとc++を切り替えるって IDEの仕様としていいのかなぁと思いました。 C++ってCの完全上位互換ってわけではないのですね。
>>321 > IDEの仕様としていいのかなぁと思いました。
仕様のぜひはともかくとして、たいていのコンパイラはそういう仕様になってるね。
(オプションで強制指定もできるけど)
まあ、そういうもんだと思ってください。
323 :
デフォルトの名無しさん :02/02/07 17:02
>>311 には突っ込むべきか、それとも冷たく見守った方がいいのか?
>325 あなたに指図される筋合いはありません。何の権限があってそのような事を言うのですか? 以上、素朴な疑問。
>326 なぜあちこちでまったく同じ文を書いているのですか? 以上、素朴な疑問。
>>311 (1) p = a; と等価なのは p = &a[0];
(2) *p++; は p++; だろう。この例では * 付けても特に副作用はないが、付ける意味もない。
後はまかせた。
(´-`).。oO( UUIDを生成したい♥ ) ISO/IEC 11578:1996 を入手しないとダメかな? draft-leach-uuids-guids-01 だけ読んでればいいかな?
>draft-leach-uuids-guids-01 で十分だと思うが。
なんだかアレですねぇ…
>>311 がプログラミングを職業にしていたら、これほど怖いことは無い。
333 :
デフォルトの名無しさん :02/02/07 23:28
>>328 のいう副作用って動作が未定義になるって事かな?
「*つけたら思った動作にならない」じゃないのかな??
>>311 は「一度も動作の確認しないで出来たという」クンかもしれない。
あ、しまった・・・
シューティングで単方向LISTを扱っているのですが、 LISTの追加処理がとても不安なので添削してほしいです。 typedef struct tagList{ short x; short y; short movx; short movy; short flg; char *next; }LIST; -----・・・ /*mainから。*/ ladd(&emp,&mblt);/* LIST *emp,*mblt */ ---・・・ /*追加処理*/ void ladd(LIST **emp,LIST **tag){ LIST *emp2,*tag2,*temp; emp2=*emp; tag2=*tag; temp=emp2; tag2=emp2; emp2=(LIST *)emp2->next; (LIST *)tag2->next=temp; *emp=emp2; *tag=tag2; return ; } #すでにMAINでもう一個別のLIST型のポインタがmallocしたものを持っていて、そこをいじっています。 #MAINの*empは使用していない領域を担当していて、*mbltは自分の弾丸を担当しています。 とりあえず動いているようですが、あまりこういうことしないので動作自体が不安です。 おかしなエラーとかが見えるようでしたら一言お願いします。
つか、ふつー typedef struct tagList{ ... struct tagList *next; }LIST; とかするだろう。laddも、 void ladd(LIST *emp,LIST *tag){ emp->next = tag; tag->next=NULL; } とかで済む話ではないのか? 元のtag->next = emp;ってのも、リスト構造としては妙だな。
>>336 なにをやりたいのか、具体的に書いて欲しい。
呼び出し側で emp と mblt をどう使うのかも。
少なくとも「LISTの追加」ではなさそうだ。
340 :
デフォルトの名無しさん :02/02/08 10:22
336を見て私は意図がわからないのであった。 これ数行で書ける・・ていうか関数にする必要があるんだろうか、としか 思えない自分に対し、なんぼなんでもそれは無いだろうと思い。 「あ〜、しばらくC使ってないと、全然忘れてるな、文字通り厨房かも・・」 と思ってかなりへこんだ私でした。 ああ。
なんでladdの引数がポインタへのポインタなの?
未使用のtagList構造体リストempの先頭の要素を取り出してそれを返す関数 のように見えるんだけど。「リストの追加」とはだいぶ違うような。 関数本体を LIST *ladd(LIST **emp) { LIST *temp; temp = *emp; *emp = (*emp)->next; temp->next = temp; return temp; } のようにして、呼び出し側を、 mblt = ladd(&emp); にする。元ソースとやってることは同じだけどちょっとは読みやすいかな。 関数の動作がこれでいいとすると、laddという名前はなんとかした方がいいと思うぞ。
343 :
デフォルトの名無しさん :02/02/08 14:11
/* screen size */ #define MIN_SX 5U #define MAX_SX (20U-MIN_SX) #define MIN_SY 5U #define MAX_SY (MIN_SY+13U) 数字の後ろについてる「U」ってなに?
ウランじゃねぇ?
UはUPPERの略。 5Uだと、5以上(少なくとも5)という意味になる。
いや、原子質量単位だろ。
前にラックマウントの高さ単位だって聞いたこと有るぞ。
>344 たぶん違います。 >345 5以上ということは、6でも7でも256でもいいんですか? なんだかいい加減だなぁ。「U」を外してコンパイルしても 普通に動いているのが謎です。 >346 原子は関係ないっぽいです。 >347 それも関係ないと思います。 っていうかマジレスください。 分からない命令があれば検索して調べるんですが、 「U」に関してはどう検索していいのかも分かりません。教えて。
>>347 サンクス
1U=1.75インチ=約45mm
>>348 からかわれてるのは、自分に落ち度があるからだと気づけよ。
とりあえず、プログラミング言語 C を読み直せ。買ってないなら、今すぐ買え。
独習C/C++の評価ってどんなもん?
353 :
デフォルトの名無しさん :02/02/08 16:05
>>348 俺も「U」は知らなかったなぁ・・・
「L」は知ってるけど・・・
long x = 5L;
みたく使う、明示的にlongにするってやつね。
たぶん、Uは明示的にunsignedにするってやつじゃないか?
>>350 (´-`).。oO( 第2版なら「2.3 定数」に載ってるんだなぁ )
>>353 「か?」じゃなくて、四の五の云わねぇで御前も本読め (゚Д゚)ゴルァ
>>353 知らないことは恥ではないが、
知らない状態に安住するのは恥だ
人に聞く前に調べろよ。
>>354 その本だけど、もしかして今まで「プログラミング言語 C」を知らなかった? あれは
C 言語のバイブルだから、何があっても読まないとダメだよ。
359 :
デフォルトの名無しさん :02/02/08 16:24
「C言語なら、俺に聞け! 」ってタイトルなのに聞いたらボコボコに・・・
360 :
デフォルトの名無しさん :02/02/08 16:28
>>359 こういうことは深夜に聞くといいよ。
深夜ならどんなにアフォな質問を単発スレ立ててしてもちゃんと答えてくれることが昨日わかった。
362 :
デフォルトの名無しさん :02/02/08 16:34
つか、こんな簡単な質問もったいつけないで答えてやれや。 Uはunsignedだよ。 他にも「F」はfloat型、「LF」だったらdouble型だ。 こんな問題でもったいつけてスレ数を無駄遣いすんな。 1レスで済むだろボケ。
>353 なるほど。ひょっとしてunsignedのUかなー、 とは漠然と考えていたんですが、意味が分かりませんでした。 明示的に表す記号なんですね。 >355 インターネットの利用方法としては 直リンする方が健全だと僕も思うんですが、 2chで直リンするとスレと関係ない論争が起こったりするんで…。 >358 知りませんでした。読みます。 >360 昨日は深夜にボコボコにされました。 まぁ、解決ってことで。ありがとうございました。
>>359 まあ運が悪かったということで。
親切な人がいるときに聞きなおしましょう。
>>362 スマン、てっきりネタだと思ってたから。
(´-`).。oO( 反省:俺も「unsigned だ」って言ってあげればヨカタナー )
>337と338と340と341と342。返答THX! >337 なんだか、大きな勘違いをしていたようです。 追加処理の考え方自体が間違ってるみたいで・・・。 >338 Direct3Dのテンプレートをもらってそれで2Dシューティングを勉強のために作っています。 別のバッファっていうのチャンコ鍋なかんじのバッファなので、empは未使用または使用済みをくっつけていく感じです。 mbltは玉が発生したらそれを管理するためのやつで玉が発生したら未使用から取ってきた領域をくっつけるって感じです。 >340 悪いのは僕です。ごめん。(ぺこり >341 一度変数のシングルポインタ使ってやってたんだけど、 うまくいかなくて、色々考えてるうちに行き着いたんです。 >342 なんだか僕が扱っているものがListということも怪しくなってきたなぁ。ヤバイ・・・。(汗 名前については考え直します。 話を総合すると、僕が間違ってると解りました。うむぅー。 でも、それが解ったことは収穫です。 日曜もありますので考え直してみたいと思います。 ありがとうございました。
>>367 リストのデータ構造と操作方法に関しては一度じっくりと勉強した方がいいが、
実際に使う段になったら 4.4BSD の <sys/queue.h> とか C++ STL の std::list
使ったほうが良いと思われ。
あと聞いた感じ、リストに対して挿入/削除が頻繁に発生しそうだから、単方向
リストよりも双方向リストを使ったほうがいいと思うよ。
369 :
デフォルトの名無しさん :02/02/08 20:21
>>368 シューティングだったら循環リストなんかも良いモナー
371 :
デフォルトの名無しさん :02/02/08 20:46
stdio.h なんかで int fclose __P((FILE *)); とかありますけど「__P( )」ってなんでしょう? 検索キーワードでも教えてくださーい。 (__P だとソースとかしか出てきませんでした)
>>371 stdio.h があるディレクトリの中のヘッダファイルを __P でgrep検索したら
なんか出てくるんじゃない?マクロだからどっかで#defineされてるはず。
>369 循環リストってリングバッファともよばれるやつかな?? 日本語で聞くと何か新鮮。意味は同じなのにね。 ところで、関係ないけど、双撃ってかっこよくない? ん?いやさ、ダブルクリック。
>>372 ぐはー、すいませーん。そしてありがとー。
言い訳はしません…はい、「ちゃんと調べろよー>自分」ってことで。
お手数おかけしました。今からじっくり読んでみます。
376 :
デフォルトの名無しさん :02/02/08 21:33
>374 リングバッファっつーと配列による実装(keyboard BIOSとかLZ77系とか) 循環リストつーとポインタによる実装 を連想するのは俺だけか?
377 :
デフォルトの名無しさん :02/02/08 21:41
>>376 いわれてみると「バッファ」って配列っぽいね。
>376 そう言われれば、そういう風に覚えるのもいいかなと思えるね。 僕の場合、何かかっこいいからリングバッファっていってる。 区別する時は、頭に「配列の・・・」とか「ポインタの・・・」ってつけると思う。
char x[20]; while(scanf("%s",x) != EOF) { root = makenode(x,root); } 無限ループ状態になるんですけど、なんでですか? あと、scanfってなにを返すんですか?
うふふふ
そう言えば漏れ、C使い初めてから8年位経つけどscanfて 一回も使った事無いな。。。。 DOSの時はワークエリアから押し下げ状態読んでやってて、 linuxではキー入力を必要とされる物を作った事が無い。 うーん
終了させるためにはどうすればいいの?
キーボドでコントロルコド打て
VC++ 6.0、gccで下のをコンパイルするとエラー出るんだけど これって私が悪いの? /* test.c */ #include <stdio.h> typedef struct _val { int type; union { int i; double d; }; } val; int main() { val data; data.type = 0; data.i = 7; FILE *fp; if( !( fp = fopen("test", "r") ) ) return -1; ... fclose(fp); return 0; }
unionに名前つけなくていいんだっけ?
具体的なコンパイルエラーを書かないで、 「エラーでます。なんとかしてくれ」みたいな ことをいうのは、厨房の証左だな。
FILEの位置、違ってますね。 すいません。
389 :
デフォルトの名無しさん :02/02/09 20:17
>>388 C++コンパイラならそれは問題ないんじゃないの?
>>389 VC++などでは拡張子を .cにしておけば
Cのソースとして処理されます。
共有体をメンバにしなくてどうするよ。 おしりに識別しを付けてね。 union { int i; double d; }u; とか
ごめん、確認したらそうだった。 逝きながらK&R読む。
プログラミングを学びたいのですが どこからはじめるべきですか?
>>395 まず腕立て伏せから始めよう。
次は指立て伏せじゃ。
お次ぎは腹筋〜200回じゃぁ〜〜〜〜。
>>397 なかなかスジがよろしい。
次はパンチの特訓じゃっ!
打つべし、打つべし〜〜〜〜じゃぁ〜〜〜〜。
ごほっ(吐血
両手を上げて〜背伸びの運動から〜♪
>>395 Hello World
みんなここから始めてる。
まだまだ!かるいかるいかるいねぇぇぇ!! こんなもんかぁああ!? (;´Д`) ⊃ ⊃
Hello おねぇちゃん! だったぞ、わしやぁ、、、
>>401 ごほっ(吐血
わかい者はええのぉ〜。
あんまり無理するなよ。
WELCOME TO HELL WORLD!
>>405 無理せず本でも読みます
ところで基礎の基礎でも教えていただけませんか?
>>407 >>1 の
>Cプログラマならこれを買っとけ。
は一応ゲットじゃなっ。 かなり古いもんじゃけど何とかなるじゃろっ!
ところで言語は何だったっけ? Cでいいのか?
いいけど…君らスレタイトル見た?
410 :
デフォルトの名無しさん :02/02/10 00:01
atoi関数って、受け取る引数が10進の数値を表す文字列で、戻り値として数値を掃き出すデータ変換関数ですよね。 受け取る文字列が16進の文字列の場合(アドレスを表すテキストデータとか)、 どうやったら正しく数値に変換してもらえるのでしょうか? そういう関数って、ありますか?
411 :
デフォルトの名無しさん :02/02/10 00:03
>>410 strtol or strtoul
ヘッダーは<stdlib.h>だったかな。
>>411 超感謝です。
標準関数でサポートされてたんですね!
ありがとうございました♪
普通はsscanfを使うのかなー? あれ使いづらいんだよね・・・
エラーチェックをしっかりやりたいならstrto*系。
strto*は35進数まで扱えるし、って、27進数とかって、どこで使うんだろう…
で、循環リストとリングバッファは結局同義なのか・・・
あのーswitch文で、 100から500までの時は、大きくする というような条件分岐をしたいのですが、どのようにするのでしょうか? case100 >= a && a <= 500 ではへんですし
419 :
デフォルトの名無しさん :02/02/10 02:31
>>417 VB使え。
VBならSelect(VBではSwitch)に条件文を書ける。
半分冗談じゃなくて、それくらいが思いつかないならVBで修行した方が良い。
420 :
デフォルトの名無しさん :02/02/10 02:31
421 :
デフォルトの名無しさん :02/02/10 02:36
>417 C言語のswitch文では範囲の指定はできないです。 別のやり方としては、caseの部分を重ねて書く方法もありますが、これだと値があらかじめ特定されてないと使えません。 switch(a){ case 100: case 200: case 300: case 400: /*ここで処理*/ }
>>418 だよね。誰もつっこまないのかとちょっと心配だった。
>>417 switch(a>=100&&a<=500){
case 1:
//大きくする
break;
default:
//それ以外
}
424 :
デフォルトの名無しさん :02/02/10 02:38
通行人の横槍だ。
>>422 そんなもんだだの言葉面のもんだいだとも思うが。
425 :
デフォルトの名無しさん :02/02/10 02:42
>>417 関数型言語の世界へようこそ。
そのような悩みはすべて消えます。
>>424 言葉の問題だけじゃなかろう
リングバッファは要素数固定だが、循環リストは普通可変。
427 :
デフォルトの名無しさん :02/02/10 02:44
>>426 そういう議論になってるのはわかってる。
だが全然本質じゃない。
あるアイディアに対して、たまたま二つの実装があるにすぎないし
他の実装方法がないわけでもない。
>>416 リストとバッファの違いが分かってない?
リストでは、挿入/削除される各要素は個別に確保/開放される。その要素を
ポインタを使ってリング状につなげば循環リストだし、双方向につなげば双方向
連結リストになる。要素数は一般には制限なし(メモリサイズだけに制限される)
対してバッファは、固定長のメモリ領域。そのバッファを同一サイズのブロック
に分割して使う。ブロックの利用順序として、ブロックを頭から順に使っていって、
使い切ったら頭に戻るような戦略を採用したものがリングバッファ。
一般には
rp 次に読み込む場所
wp 次に書き込む場所
len 使用中のブロックサイズ
という管理データを用いて、
一つ読み込む
rp = (rp がブロックの最後を指していれば 0 に戻す、そうでなければ rp + 1)
一つ書き込む
wp = (wp がブロックの最後を指していれば 0 に戻す、そうでなければ wp + 1)
ってな感じで操作する。入出力が非同期に行われる FIFO 型のデータを貯めて
おくときに便利。
BSフジって・・・ あそこのサイトはCで書いてるのか??
じゃあ、ちまちまif文の羅列しかないのか どうりで、検索してもないわけだ
switch(a/100){ case 1: case 2: case 3: case 4: break; default: break }
>>432 ifをちまちま書きたくなかったら配列にしきい値いれといて、
forで回そうよ。
435 :
デフォルトの名無しさん :02/02/10 04:59
>421 #define teisuu 100 if((a%teisuu)==0){ case処理; }else{ default処理; } そういう等幅なら、今回はこれがつかえないかな?
436 :
デフォルトの名無しさん :02/02/10 05:15
ちまちまifとelseを書くのってださいのかな。
>421 うわ。switch限定でしたか。 失礼しました。出直してきます。 >417 条件を3項演算子でくくってみてはいかが? ちょこっと処理食うけどそこに書いてあるようなことができると思うよ。
あ、よく見たら、243のがいいなー。 ワシ、何見てたんだろ。はぁ。いってきます。 >436 細かな対応には必要でしょう。 うんで、長くなりすぎるなら、一捻りってとこではないでしょうか? 条件変更のとき泣きみるし。
ワシいいかんげんヤバイな・・・。 438の>243は423です。 失礼しました。
ネタスレじゃないのになんでswitchじゃ できませんってレスが付かないのかね。 素直にif使え>417
>440 100%無理? まぁ、ifのほうが楽そうなのは確かだな。
>>436 >>438 の言うとおりの場合もあるんだけど、
int th[] = {0,100,500,550,980,1000,-1};
for(i=0;th[i]>=0 && !(th[i] <= in && in < th[i+1]);i++);
switch(i) {
case 0: ...
case 1: ...
}
443 :
デフォルトの名無しさん :02/02/10 15:56
僕の持ってる開発環境はVisual C++ だけなのですが、 これを使って昔のDOS/V機(’94年頃のWin3.1時代)で実行できるアプリを作りたいのですが、 どうしたらいいでしょうか? たとえば、以下のような超簡単なプログラム hello.cがあったとします。 #include <stdio.h> int main(void) { printf("Hello\n"); } これを普通にコンパイルしても、古いAT機上で実行しようとすると This program cannot be run in DOS mode. みたいなことを言われてしまいます。 VC++の画面からやっても、またコマンドで cl hello.c と打ち込んでコンパイルしてみても、同じです。 いい方法は無いものでしょうか?
16 ビットコンパイラでコンパイルするとか? 今時手に入るのかな。
445 :
デフォルトの名無しさん :02/02/10 16:03
素直にgccでも拾ってこい
>>445 Cマガジンを買うと、いっつもLSI-C試食版がついてるので、
漏れこれ使ってる。
>>442 そういう方法もありますか
でも結局回数は、いっしょってことになりますよね
void koudou(void)
{
if(hito.idouCnt > 100 && hito.idouCnt < 200){
hito.x++;
hito.y+=2;
rerutn;
}
if(hito.idouCnt > 200 && hito.idouCnt < 280){
hito.x--;
hito.y+=2;
return;
}
以下似文
}
と言う風に今は、文を書いています
これでは効率悪いですよね?
if(hito.idouCnt<100){ ... } else if(hito.idouCnt<200){ ... } else if(hito.idou<280){ ... }
453 :
デフォルトの名無しさん :02/02/10 16:53
おまえにゃLSI-Cがお似合いだ
いえ、ありがたく無料で使わせて頂きます♪
458 :
(゜Д、゜)y−~ :02/02/10 17:42
よし、我がニホソも外国人助っ人を入れよう。 まずは機械語が操れるアメリカ人ハッカーを移籍金10万でヘッドハンティング、と
しまった大誤爆だ。 m(_ _)mスマソ。
>>449 gccならこういうことはできる。
void koudou(void)
{
switch (hito.idouCnt) {
case 101 ... 199:
hito.x++;
hito.y+=2;
rerutn;
case 201 ... 279:
hito.x--;
hito.y+=2;
return;
}
}
461 :
デフォルトの名無しさん :02/02/10 22:19
初心者なので教えてください。おねがいします。 1.同時に3つの重複しない0〜9までの数字を手に入れるにはどうすればいいのですか? randやsrandを使うと聞いたことがあるのですが、具体的な使い方がわかりません。 2.このソースをみていただけますか? #include<stdio.h> int list ( int per); main() { int num; printf("人は何人いますか?>"); scanf("%d",&num); list (num); getch(); } void list (int per,) { char name[per][30]; ・ ・ ・ これでコンパイルするとエラーになってしまいます。なぜでしょうか?配列の宣言には変数は使えないのですか? ユーザーから入力された分だけの配列を用意するにはどのようにすればいいでしょうか? 他のかたによればプロトタイプ宣言のところもおかしいのだそうです。さっきまちがえて新スレたててしまいました。すみません。 どうぞよろしくおねがいします
>>461 158 ペイジに書いてありますね。
「珠玉のプログラミング」の。
463 :
デフォルトの名無しさん :02/02/10 22:36
おしえてくださいよ。
エラーメッセージくれえかけや
>void list (int per,) >{ >char name[per][30]; ここだろうな。
466 :
デフォルトの名無しさん :02/02/10 22:41
>>461 >void list (int per,)
最後のカンマは要らない。
>char name[per][30];
これは無理
char (*name)[30];
name = malloc(per*sizeof(int[30]));
とする。使用後にfree(name);を忘れないように
malloc(per*sizeof(char[30]));の間違い。
>461 @だが、考え方を。 srand(seed);//seedはなんでもいいがtime()を使うのが一般的かな? whileかforを使って、重複を確かめつつループをまわす。 rand()はとんでもない値を返すので、工夫が必要。 実験してみて、つかんでくれ。 こんなとこかな。
469 :
デフォルトの名無しさん :02/02/10 23:22
>461 というか、「乱数」って言葉は知ってる?
470 :
デフォルトの名無しさん :02/02/10 23:25
ありがとうございました。やってみます!
471 :
デフォルトの名無しさん :02/02/11 05:16
あの今独学で本を見ながらCを勉強している(まだ3日目)のですが、 microsoft visual c++ 6.0でビルドしてできたプログラムを そのままvisualC上で実行すると、実行後にDOS窓が表示されたまま止まるのですが、 winでさっきのexeファイルを実行するとプログラムが実行された後、すぐに DOS窓が閉じてしまって結果が確認できません。 終わっても窓を閉じさせないようにはどのようにすればいいのでしょうか? 本にも書いてないし困ってます。どなたか教えてくださいませんか?
>>471 あーめんど。あげ荒氏か?DOS窓から直接コマンド打って実行されたし。
VC6なら統合環境から出力読むオプションもあるはずマニュアル読め。
デバッガ使わないなら、ctrl+f5。 または、面倒だけどgetch();をいれる。 後者はあまりいい方法じゃない気がする。
474 :
デフォルトの名無しさん :02/02/11 05:29
>>1 漏れと同じ年、経験年数もほぼ同じ...
C の質問じゃなく C++ なんだけど、STL や ATL に関する書籍でバイブルと言われるようなものってありますか?
「テンプレートを真面目に勉強してみるかな」って、思ってるんですけど...
39にもなって漏れとか言うなよ!!
いえ、荒しのつもりはないです。 getch();ですか・・・ちょっと分からないです。勉強してきます。 参考になりました。
あんま関係無いけど、C言語とは言うけど、C++言語って言わないのかねぇ? 糞レスでスマヌ
478 :
デフォルトの名無しさん :02/02/11 05:39
479 :
今日からC言語はじめました :02/02/11 05:42
#include <stdio.h> main() { int a; scanf("%d",&a); a=a*2; printf("\n\n\n%dです。\n\n\n",a); }
480 :
デフォルトの名無しさん :02/02/11 06:08
>>461 #include <stdio.h>
#include <malloc.h>
#define ELEMENT_LENGTH 30
static int list(int per);
void main(void)
{
int num;
printf("人は何人いますか? >");
scanf("%d", &num);
list(num);
getch();
}
static void list(int per)
{
char** ppname;
char* ppool;
unsingned long i;
if (per <= 0)
引数エラー処理
else if ((ppname = malloc(per * sizeof char**)) == NULL)
メモリ不足エラー処理
else if ((ppool = malloc(per * ELEMENT_LENGTH)) == NULL)
メモリ不足エラー処理
else {
for (i = 0; i < ELEMENT_LENGTH; i++)
ppname[i] = &ppool[ELEMENT_LENGTH * i];
...
free(ppool);
free(ppname);
...
}
って、感じですかぁ〜。
481 :
デフォルトの名無しさん :02/02/11 06:19
482 :
デフォルトの名無しさん :02/02/11 06:22
>>481 malloc() は、malloc.h にも stdlib.h にも入ってるのだ!
>>477 あんま関係無いけど、象さんとは言うけど、虎さんって言わないのかねぇ?
>>479 このまま改行道を極めて悩める人類を救ってください。
>>479 | ̄ ̄ ̄ ̄ ̄ ̄|
| ここで改行して|
|______|
. ||
∧∧.||
(*゚ー゚)||
/ つつ
〜( ノ
U U
>>479 先生の改行をみて、
自分の今までの生き方と改行への取り組みを恥ずかしく思いました。
ぜひ弟子入りさせてください!!
491 :
デフォルトの名無しさん :02/02/11 09:56
>482 ありがとうございます。まだ動的メモリなるものをいまいち理解していません。もしもよければ、それについてのわかりやすいHPなどあればおねがいします。
( ´∀`) 十字キー上下で難易度選択するプログラムで悩んでます *easy normal ←こんな感じで hard while(1){ lvに対応した行に*を表示 waitpad(0xff); key=joypad(); if{↓ならlvを1増やして*を消す} if{↑ならlvを1減らして*を消す} if{Aならゲーム開始} waitpadup(); } これだと十字キー押してる間は*が見えなくなるんですよ 十字キー押した時点で*が表示されて なおかつ連射しないようにするにはどうしたらいいんですか?
ネタか。
え?改行野郎? 意味わかんないです。 つーか僕の奴かなり見やすいと思いません? これでもC言語暦3日です!
見やすいかどうか判断できる大きさのコードじゃないと思うが・・・ つか、入れても入れなくても可読性に影響の無い改行は、掲示板に載せるときは取れや。
#include <stdio.h>
int main()
{
#if 1
char a[]="
>>497 お前は天才だよくやった";
#else
char a[]="ネタの497は逝ってよし!";
#endif
printf("ともかく、%s。ということだ。\n",a);
return 0;
}
ゴ、500ズザー
>>497 puts("\n\n\nこれでも\n\n\nくらえ!\n\n\n。");
わかった?
あ、誤爆、スマンのぉ。
#include <stdio.h> main() { printf("意味が分かりません。ネタと言うのはは止めてください。"); }
>>504 void aborn(){
puts("\n\n\n497先生!\n\n\n");
puts("\n\n\nぜひ弟子にしてください!\n\n\n");
}
506 :
名無しさん@Emacs :02/02/12 02:51
質問です。 何故かstrcatでsegmentation faultがでしまいます。 以下gdbのbtのコピぺです。 #0 0x400b3885 in strcat () from /lib/i686/libc.so.6 #1 0xbffffb84 in ?? () #2 0x4004a507 in __libc_start_main (main=0x80484d0 <main>, argc=1, ubp_av=0xbffffb84, init=0x804832c <_init>, fini=0x8048580 <_fini>, rtld_fini=0x4000dc14 <_dl_fini>, stack_end=0xbffffb7c) at ../sysdeps/generic/libc-start.c:129 そしてその時のソースです。 #include <stdio.h> #include <string.h> #include <stdlib.h> main() { char *foo; char *goo; foo=(char *)malloc(128); goo=(char *)malloc(32); foo="hogehoge"; goo="hugahuga"; strcat(foo,goo);/*<-どうやらここでバグ発生*/ printf("%s",foo); }
>>506 文字列リテラルのアドレスに strcat してどうするよ
>>506 foo="hogehoge";
が何をしているのか考えよう。
どうして、strcpyが用意されてるのかな?
foo="hogehoge" で警告でないの?
>>506 本質的な回答は
>>507-508 だが、gcc 使ってるなら -Wwirte-string オプションを
指定しておくことを奨める。
文字列リテラルの型が const char * になるから、この手の下らんバグをコンパイ
ル時に見つけられる。
error:fooに代入した値は使われてない。 BotlandC++5.5ならこうだろう。
もうレス入ってる… で、解決しました。 やっぱり皆さんが指摘した通りでした。 foo="hogehoge"; goo="hugahuga"; の所を、 strcpy(foo,"hogehoge"); strcpy(goo,"hugahuga"); としてやったら無事解決しました。 本当にありがとうございました。
>>512 にしても、これって
C言語の美しくないところよね。
>>443 (´-`).。oO( プロジェクトのオプションを弄ればいいだろう )
515 :
デフォルトの名無しさん :02/02/12 15:58
>>506 > goo=(char *)malloc(32);
これをする意味が分からない。
char *goo="hugehuge";でいいと思うが。
>>516 exit前のfreeは云々って奴じゃネーノ?
(個人的には使い終わったらexit前でもfreeするくせをつけるべきだと思うが)
stringを使えば楽!! とか言ったらすごく突っ込まれるのだろうなぁ…。 すまん、放置してくれ。
519 :
デフォルトの名無しさん :02/02/12 16:12
>>1 (´-`).。oO( そういや日下部さんってどこ行ったんだろ )
520 :
デフォルトの名無しさん :02/02/12 16:14
>>519 (´-`).。oO(けいこタンに処刑されました・・・・)
ちょっと独り言…、 0(0); は、VC++6.0ではコンパイルエラーにならないのですが、 BotlandC++ではコンパイルエラーになりますね。 いえ、意味はありませんが…。
522 :
デフォルトの名無しさん :02/02/12 16:22
リンクリストの最後のNULLの前に構造体を1つ足すやりかたを 教えてください。
>>522 tail->next = item;
item->next = 0;
526 :
デフォルトの名無しさん :02/02/12 16:41
>>521 正確に言うとVCではC++でコンパイルするとエラーにならないが
Cでコンパイルするとエラーになる。
error C2064: 関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。
>>519 (´−`).。oO( クサチューはパケットごとアボーソですが、何か? )
初心者ですいません。 533さんのtailってゆうところにどうやったら最後の構造体 がおけるのかやっぱりわかりません。 ちなみに一方通行のリンクリストです。
>>529 リンクリストのサンプルコードなら検索すればすぐ見つかりますよ。
>>530 探し方が悪いのか,参考になるのがみつかりません。
自力ではこんなのしか思い浮かばないのですが、、
for(ep=start; ep->next !=NULL; ep= ep->next){
if(ep->next ==NULL){
empdata->next = NULL;
ep->next = empdata;
}
}
これじゃだめですもんね。
これだとリンクリストの一番最初に入りますか?すいません。 for(ep=start;;){ empdata->next = ep->next; ep->next = empdata; break; } }
533 :
日下部圭子 ◆ib749tYo :02/02/12 20:58
>>531 for(ep=start; ep->next !=NULL; ep= ep->next){
}
empdata->next = NULL;
ep->next = empdata;
> これだとリンクリストの一番最初に入りますか?すいません。 最初? 最後に追加する方法を聞いていたのでは? 最初に挿入するなら empdata->next=satrt; satrt=empdata; 最後に挿入するなら for(ep=start;ep->next;ep=ep->next); empdata->next=ep->next; ep->next=empdata; ただしどちらもstart!=NULLが前提
>>532 empdata->next = start;
start = empdata;
やっとやりかたがわかりました。 ありがとうございました。
#include <iostream> int main(int argc, char *argv[]) { for (int i = 0; i < argc; i++) cout << argv[i] <<endl; return 0; } ( ´∀`)BCCでコンパイル通らないモナー。
>>537 std::cout << argv[i] << std::endl;
または
#include <iostream>
using namespace std;
または #include <iostream.h>
545 :
デフォルトの名無しさん :02/02/13 22:26
鬱
546 :
デフォルトの名無しさん :02/02/13 23:21
VC++6.0、win32 consoleを使ってC言語を勉強している者です。 windows2000を使ってるのですが、表示する文字列を消したり 色を変えたりするにはどうすればいいのですか?
547 :
デフォルトの名無しさん :02/02/13 23:23
>>546 Win2000ではあの特殊な文字は使えなかったような・・・・
専用のヘッダーがあったような気がするけど。
548 :
デフォルトの名無しさん :02/02/13 23:34
番兵 これなんて読むんですか?
「あなごくん」と読みます。
ゴメソ、C++の質問スレあったんだね。 <iostream.h>だと通ったんだけど、拡張子って環境依存するもんだから C++ではつけなくてもコンパイル通る、みたいな事をなんかの本で読んで、 試してみたらひっかかったので。使わないほうがいいってのもそういうことだよね。 レスくれた皆さんありがと。スレ汚しスマソ。
>>553 番兵と歩哨って同じ意味だっけ?
とすると番兵は見回り兵か。
>>550 いや、<iostream.h>を使わないほうがいい理由は名前の衝突の可能性があるから。
だから名前空間に放り込むほうが良いって偉大なグルが言ってたよ!
漏れも激しくスレ違いスマソ。
556 :
デフォルトの名無しさん :02/02/14 11:45
構造体のバブルソートです。 コンパイルしようとすると temp =x[i]; のところでエラーがでてしまいます。 どうしたらよいのでしょうか?お願いします。 void sort_employee(struct employee *x, int n){ int i,j; int temp; for(i=0; i <(n-1); i++){ for(j=i+1; j<n; j++ ){ if(strcmp(x[i].lname, x[j].lname)>0){ temp =x[i]; x[i]=x[j]; x[j]=temp; } } } printf("The list alphabetized\n"); }
エラーメッセージはなんと
error C2115: '=' : incompatible types です。よろしくお願いします。
tempってint型じゃないか
なににすればいいんですか?structの配列対しては。
構造体を代入するなら 構造体じゃないと。
>>556 > int temp;
struct employee temp
軽自動車用の駐車場に大型トラックを止めようとしてはいけません。
(;´д`).。oO( もしもーし! )
そもそも、sort_employee( ) の引数の意味を
理解してないでしょ…。
>>560 > なににすればいいんですか?structの配列対しては
っていってるけど、
>>556 > ...(struct employee *x ...
ここに答えが。
564 :
デフォルトの名無しさん :02/02/14 12:16
#include <stdio.h> void hoge(int* arg) { *arg = 7; } int main(int argc, char* argv[]) { int* cont; hoge(cont); printf("%d\n",cont); } ポインタのポインタを使えばやりたい事ができるのは解かりますが 上記の方法で出来ない理由を論理的に教えてください。お願いします。
そりゃそうですね(w。 ありがとうござい。
>564 ポインタのポインタつかえばできるって 何が?
>>564 1. cont を使う前に初期化していない。
しかも、
2. そもそも初期化のオペランドとして使うべきアドレスが無い。
てゆーか、
3. そもそも 2. のアドレスにあるべき変数の領域が確保(宣言)されていない。
568 :
デフォルトの名無しさん :02/02/14 12:31
>>568 > int* cont;
> hoge(cont);
int cont;
hoge(&cont);
もう一度入門書を読み直しましょう。
570 :
デフォルトの名無しさん :02/02/14 12:37
int *cont; の「cont」は「int型データのポインタ」を入れるための 変数であって、「int型データ」を入れるための変数ではない。 int cont; hoge(&cont); ってやるよね。普通。
>>568 ポインタのポインタを使ってもできないと思うけど。
ポインタというのはその名の通り、他の変数などをポイントする
(指し示す)のに使うのだが、
>>564 のcontにはそのポイントする
先が用意されてない。
572 :
デフォルトの名無しさん :02/02/14 12:51
void hoge(int* arg) { arg = malloc(sizeof(int)); *arg = 7; } int main(int argc, char* argv[]) { int* cont; hoge(cont); printf("%d\n",cont); } みなさん、レスありがとうございます。 ではこれではどうでしょうか? 普通でないのは解かってるのですが学習用という事でご容赦ください。
573 :
デフォルトの名無しさん :02/02/14 13:04
すみません、enumの使い方(っていうか意味)が よくわかりません。 enum { red , blue , green } ; はわかります。 ですが、 enum Color { red , blue , green } ; と書いたときの、Colorってどういうときに役に立つんですか? あと、 enum Color { red , blue , green } color; のcolorってどういう時に役に立つんですか? 教えてください、お願いします。
>>572 (;´д`).。oO( 「7」だから偶然できただけ。 )
「0.5」とか二億四千万とか「-1」とか「"名無し"」とか…
だったらどーするんだ?
>>572 > void hoge(int* arg)
void hoge(int** arg)
> arg = malloc(sizeof(int));
*arg = malloc(sizeof(int));
>*arg = 7;
**arg = 7;
> hoge(cont);
hoge(&cont);
> printf("%d\n",cont);
printf("%d\n",*cont);
free(cont);
最後のfreeについては無くとも問題ないが、好みで入れてみた。
576 :
デフォルトの名無しさん :02/02/14 13:19
引き続き丁寧なレスありがとうございます。 572に文法的なありますか? お願いします。
>>574 > と書いたときの、Colorってどういうときに役に立つんですか?
例えば
enum Color getColor(void);
void setColor(enum Color);
とすれば、見た目わかりやすくないか?
「まともな」コンパイラならば
列挙型以外の値が入れば警告を出すかもしれないだろうし、
enum Color color;とした場合、
「まともな」デバッガならば、colorの値を数値でない値で表示する
ポインタを定義するのに、 int* hoge; とか書くことがあるけど、これをやってるとついうっかり int* hoge, hoge2; なんてやってしまいがちなので、個人的にはお勧めできないなあ。
(;´д`).。oO(
>>576 ていうか )
>>572 そもそもコンパイラが警告(ウォーニング)のメッセージを
表示しているだろが (゚Д゚)ゴルァ
580 :
デフォルトの名無しさん :02/02/14 13:56
typedef struct {short x; char y; char z;} TEST; int main() { TEST test1, test2; test1.x = 764; test1.y = -12; test1.z = 109; test2.x = 764; test2.y = -12; test2.z = 109; if (memcmp(&test1, &test2, sizeof(TEST)) == 0) { puts("等しい"); /* ●一致しない事もある● */ } return 0; } typedef struct {char x; short y; char z;} TEST3; この場合なら一致しない事があるのも判るけど、 上のソースで一致しない事もあるって本当ですか?
581 :
デフォルトの名無しさん :02/02/14 14:17
>>579 度々すいません
なぜコンパイラが警告のメッセージを表示しているのかが
疑問で仕方がないのです。
お願いします。
>>581 エラーメッセージくらい読めや。ゴルァ
583 :
デフォルトの名無しさん :02/02/14 14:28
assignment makes pointer from integer without cast なぜこのエラーになるのですか? void hoge(int* arg) { arg = malloc(sizeof(int)); *arg = 7; } argはポインターだと思うのですが・・・・ 本当にすいません
arg=(int*)malloc(sizeof(int)); か?
ポインタになってないのはargじゃなくて、malloc()の戻り値の方。 malloc()にプロトタイプ宣言がないので、intを返す関数ということに されてしまったわけね。 #include <stdlib.h> を追加しましょう。
586 :
デフォルトの名無しさん :02/02/14 14:44
#include <stdio.h> #include <stdlib.h> void hoge(int* arg) { arg = (int*)malloc(sizeof(int)); *arg = 7; } int main(int argc, char* argv[]) { int* cont; hoge(cont); printf("%d\n",cont); } 本当にお世話になっています。 それでこれでの問題点はなんでしょうか? よろしくお願いします。
>580 一致するに決まてつるだろ・・・多分・・・ロートルに訊いたから・・・だいぶょうじだろう・・・
アラインメントによって変わらないか?
> それでこれでの問題点はなんでしょうか? (int*)malloc(sizeof(int)); で確保したポインタが関数を抜けた時点で参照できなくなること。 例えば void hoge(int arg) { arg = 7; } int main(int argc, char* argv[]) { int cont = 0; hoge(cont); printf("%d\n",cont); } とやっても7が出力されないのと同じ理由。 変数を関数内で書き換えたい場合、ポインタを使うように ポインタを関数内で書き換えたい場合、ポインタポインタを使う。
構造体の隙間にゴミ、なんてこと、無いとね・・・
>>586 つーか、どこがおかしいのか(コンパイル時にワーニングがでるとか、
実行結果がこうなるはずがこうなってるとか)教えてクレヨン。
で、
int* cont;
で宣言しといて、
printf("%d\n",cont);
なわけ?
printf("%d\n",*cont);
っていうのは嫌?
592 :
デフォルトの名無しさん :02/02/14 15:02
>>580 TEST test1, test2; //この直後
memset(&test1,0,sizeof(TEST));
memset(&test2,0,sizeof(TEST));
これを挿入しとけばOK!
>>580 ずばり、
printf("%d\n",sizeof(TEST));
きぼん。
お世話になりました。 やっと頭の中が整理できました。 心からありがとうございました。
595 :
デフォルトの名無しさん :02/02/14 15:14
>>592 確かにパディングの問題があるならそうするでしょうけど…。
>>593 typedef struct {short x; char y; char z;} TEST;
これだと4。
typedef struct {char x; short y; char z;} TEST;
これだと6。
サイズが4でも一致しない事があるのかなと…。
>>595 サイズが4でも一致しないことがあるとすれば、ふしぎだねー。
面白そうなので、else 追加して、そこでtest1,test2の内容を
1バイトずつ書き出してみよう。
>>595 一致しない事があるってのはポータビリティーがないってことなのでは?
598 :
デフォルトの名無しさん :02/02/14 15:34
どちらも[-4] [2] [-12] [109]でした。 あと /* ●一致しない事もある● */ と書いたのは 自分じゃないんです。紛らわしくてすみません。 ただ、こんな感じのソースを使うように言われたのですが、 そのまま使っても大丈夫なのか不安だったので…。
コンパイルする環境によってサイズが変わるって事だろね でもゴミが入らない環境でコンパイルした実行ファイルを 他の実行環境で走らせた場合はどうなんだろう?こりゃオレも知らんのよ(汗
601 :
デフォルトの名無しさん :02/02/14 16:17
「明解C」でifの説明のときに、if(a>0)を評価した値が0なら、1を返す。非0のときは以下の文が実行されると 0の時はelse以降で記述と書いてありましたが、こういうふうに厳密に覚えるもんなの? 他の参考書ではif(条件式)があってれば以下を実行、そうでなければelse以降に記述と してあったけど、そう考えていればまずいことあるんですか?
>>601 勉強したてであるのなら、他の参考書のように把握していてかまわない。
しかし、あとになったら厳密な覚え方をしたほうがいい。
>>601 ちょっと話し外れるが、
if(a=0)
↑こういう記述は間違いだからな。どういう動作をするか分からんぞ!
if(a==0)
↑正確にはこうだ。
>>601 if(i = 0) /* if(i == 0)ではない */
printf("if\n");
else
printf("else\n");
どっちのprintfが実行される?
i = 10;
if(0 < i < 15 ) /* if(0 < i && i < 15)ではない */
printf("if\n");
else
printf("else\n");
どっちのprintfが実行される?
>>604 if (!a) も危険ですか?
よく if (a)・if (!a) と書いてしまうのですが。。
>>605 上・・・printf("else\n");
(iに0を代入、評価した値は0であり、else以降が実行される)
下・・・printf("if\n");
if(0 < i < 15 ) を評価した値は1となり、非0の時実行されるprintf("if\n");が実行される)
多分こうだと思うんですが・・・
if(0 < i && i < 15)というのははじめて見ました。正直、意味がわかりません・・・
>>601 (´-`).。oO( 「while(1){hoge( );}」なんてゆーソースコードをよくみかけるからだろ?)
>>607 > 多分こうだと思うんですが・・・
正解
Cではif文中に条件式でない式を使うことも許される文法なので
(例えばi = 0は代入であり、条件式ではない)
正確に覚えた方が良い。
> if(0 < i && i < 15)というのははじめて見ました。正直、意味がわかりません・・・
日本語にすると「iが0を超え、かつiが15未満」の場合
iが1〜14だと真になる
>>606 辞典に
!a は 0 == a と等価って書いてあったよ。(なんでaが右に来るかの
積極的理由は不明)
>>609 なるほど。ありがとうございます。
2chで「明解」が薦められてる意味はそういうことだったんですね。
&& - 論理積 & - 論理積 if((0 < i) && (i < 15))
>>610 if (a == 0) の書き間違えで
if (a = 0) になるとコンパイルエラーにならないが(警告は出るかも)
普段から if (0 == a) ってやっとくと if (0 = a) でエラーになるから
致命傷にならなくて済む、って説明が「エキスパートCプログラミング」に
あったような。俺もそれ読んで一時期 if (0 == a) 使ってたけど、
すぐやめちゃった(なんか気持ち悪いから)
614 :
デフォルトの名無しさん :02/02/14 20:22
>>577 どうもありがとうございます。周りの誰に訊いてもわかりませんでした。
かなりC言語に詳しい方とお見受けします。
とはいうものの、せっかく説明していただいたのに、今ひとつ
分かっておりません。
>enum Color getColor(void);
>void setColor(enum Color);
>とすれば、見た目わかりやすくないか?
ちょっとこれ、わからないんですけど、これって、enumの
実体を関数に渡している、ってことですよね?
こんなことする必要がある時ってありますかね?
enumって構造体とかと違って、実体を宣言しなくても
つかえるじゃないですか?
例えば、
enum Color { red, green , blue } ;
ってヘッダに書いておけば、greenは1として使える。
関数に実体を渡すっていうことは、その関数が存在してるファイルは
このColorがどんなenumを知っている(宣言されてる)必要があるわけで、
だったら、わざわざ渡さなくてもgreenは1だということはわかってる
はずじゃないですか?
どういうときにenumの実体を宣言したり、関数に渡したりする必要が
あるんでしょう?
全然分からないです、enumは。
>>614 enum Boolean{false,true};
(´-`).。oO(腹減ったな...) (´д`).。oO(またデスマーチだよ...) (´∀`).。oO(ひろゆき逝け) (´A`).。oO(ゴルァモルァフォルァ) (´ω`).。oO(モキュ?)
>614 「実体」じゃなくてタグ名な。単に名前を付けてるだけ。 で、Color と名前を付けることにどんなメリットがあるかというと、 「red, green, blue のいずれかの値を受け取る/返す関数」を 定義したいと思ったときに、いちいち enum { red, green, blue } getColor(void); void SetColor(enum { red, green, blue }); なんて書かずに済むこと。
enumって実はintと変わらないってのは、Cの規格としてはなんとかして ほしかったよなあ。 enum Boolean { false, true } hoge; とやっておくと、hogeはfalseかtrueしか取ることができないと思いきや、 この後で hoge = 100; とかやってもエラーにならないんだよね。 キャストしないと代入できないくらいの制限を付けてもよかったと 思うんだけど。
619 :
デフォルトの名無しさん :02/02/14 21:04
>>598 >>599 そんなのは移植性・コンパイル時だけの問題でしょ
ゴミが(詰物)がなければ一致するはずだし
他の実行環境なんて関係ないでしょ
〜多分〜
>>604 > if(a=0)
> ↑こういう記述は間違いだからな。どういう動作をするか分からんぞ!
> if(a==0)
> ↑正確にはこうだ。
全く別のコードだろ。
“どういう動作をするか分からん”って、aに0代入し
その評価値が0なんで偽として扱われるだけ。
右辺値が定数では意味の無いコード、と言うなら分かるが。
if(a<>0) ↑こういう記述は間違いだからな。 if(a!=0) ↑正確にはこうだ。
622 :
デフォルトの名無しさん :02/02/14 21:13
>>617 あ、なーるほど。理解しましたかもです。
いやいや、完全に勘違いしてました。
つまり、
>ちょっとこれ、わからないんですけど、これって、enumの
>実体を関数に渡している、ってことですよね?
ってのか根本的に勘違いでした。まあどういう勘違いをしていたのかを
書くとややこしくなるんで省略ですが。
ようするに、enumの建前は
enum Color { red, green , blue } color;
って書くと、colorにはredかgreenかblueしか代入できないよ、という
ことなんですね?(実際はできるけど)
なーるほど! 目から鱗です。
615さんの言うとおり、colorには実際int型の変数ならなんでも代入できるし、
color以外のint変数にもredもgreenもblueも代入できちゃうので、これって、
普通のint定数と、普通のint変数じゃん。なんのためにenumがあるんだ?
って感じで、全然意味が理解できてませんでした。
なーるほど! そうなんだ。
いやー、5年悩んでいたことがついに解決しました。どうもありがとうございました。
……この理解であってますよね?
わかってませんでした。
623 :
デフォルトの名無しさん :02/02/14 21:15
あ、すみません、615さんではなく、618さんでした。
というわけで、
>>618 さん
激しく同意!!!!!!
>>586 cont の値を誰も決めていないぞ。
hoge(cont); で hoge の arg に入る値は、
cont の値 ≡ cont が指しているところ ≡ 初期化してないからゴミの値
だよ。
しかも、hoge() の中では、arg に渡された値を利用しないで
代入で上書きしちゃってる。
>>586 の hoge() がやってることは、「自分で勝手に確保した領域に 7 と書いて、
どこに書いたかは main() に教える手段を用意していない」ということになる。
main()からcontのアドレスを渡してない以上、hoge()の中で何をやっても cont の値は変わらないよ。
>>618 > キャストしないと代入できないくらいの制限を付けてもよかったと
> 思うんだけど。
ちなみにg++でコンパイルすると警告が出るぞ。
# 何故かgccでは-Wallを付けても正常にコンパイルする。
626 :
デフォルトの名無しさん :02/02/14 21:38
すみません、質問です。 以下のような、2次元配列を受け取るhoge()という 関数があった場合のことです。 main() { int a [2][3]={ {0,1,2} , {3,4,5} } ; hoge ( a ) ; } このhoge()の宣言方法は void hoge ( int a [][ 3 ] ) という書き方しかできないですか? なんだか、以前このような2次元配列を受け取るときには、 ポインタのポインタで受ければいい、という話を聞いたことが あるような気がして、 void hoge ( int **a ) って書いたらwarningが出るので、あれ?って思っている ところなんですが。
>>612 両方とも論理積じゃ違いが分からないよ(w
英語だと && はlogical andで & はbitwise andだが、日本語だと
どう表記するんだっけ。
そういや、&や|の演算での優先順位が妙に低いのも、Cの規格の困ったところだな。
うっかり、
if (a & 3 == 1)
なんて書くとはまる。
昔むかしのCで、&&や||を&や|で代用していたなごりらしいが。
>>626 > void hoge ( int a [][ 3 ] )
> という書き方しかできないですか?
そうです。ポインタのポインタじゃだめなのは、Cの2次元配列は、
「1次元配列へのポインタの配列」では「ない」から。
> int a [2][3]={
> {0,1,2} ,
> {3,4,5}
> } ;
この配列はメモリ上では、単にintの数が 0 1 2 3 4 5 と
並んで格納されているだけなので、列の数が分からないと
要素の位置が求められないからです。
>>629 ありがとうございました! やっぱりそうですよね!
631 :
デフォルトの名無しさん :02/02/14 22:38
すみません、このスレ読んでいて、イマイチわからないところがあるのですが。 アドレスとポインタの区別が付いてません。 僕の理解では、アドレスを格納するものがポインタ、だと思ってました。 だから、a[5]という配列があったとしたら、単純に「a」とだけ書いたら、 それはポインタではなく、アドレスだと思ってました。 が、いろいろな入門書を見ると、「配列のカッコを取ると、それはその配列 へのポインタになる」と書いてありますし、このスレでもそんな感じに 話が進んでます。 この「a」っていうのは、ポインタなんでしょうか? 多分、ポインタとポインタ変数 も混同してるんじゃないかと自分では思ってるんですが。 アドレスとポインタってどう違うんでしょう?
>>631 変数というのは、
右辺値 値
左辺値 変数のアドレス
という二つの側面を持っている。これを区別しないと混乱する。(アドレス、という
のは広義のアドレスね。場合によってはオフセットだったりレジスタだったりする
が、細かいことはさておいてくれ)
さて
a = 1;
こう書いたときには a は「値」として評価されるのではなく、a という名前に対応
する「アドレス」 に 1 という「値」を書き込む。
printf("%d", a)
対して、こう書いたときには a は「値」として評価される。a という名前に対応す
るアドレスにかかれた情報を読み出し、それを出力する。
> アドレスを格納するものがポインタ
だいたい OK。厳密には、アドレスを格納する変数がポインタ変数。
> 「配列のカッコを取ると、それはその配列へのポインタになる」
配列変数を右辺値として評価すると、配列の先頭アドレスが得られる。配列変
数を左辺値として評価した場合、具体的には
int a[5];
a = ??:
みたいなコードを書いた場合にはポインタ変数とは全く振る舞いが異なる。だか
ら「配列のカッコを取ると、それはその配列へのポインタになる」というのは、間
違い。
>>631 それはちょーかんたん。
アドレスを格納できるもの(変数とかメモリ空間とか)がポインタ。
アドレス自体はポインタじゃない。
a[5]の認識は、
>>631 で正しいはず。
間違ってたら訂正ヨロシコ。
アドレスをポインタと言ったり いろいろな言い方をするのよ( ´ー`)
635 :
デフォルトの名無しさん :02/02/14 23:22
みなさん、ありがとうございました。
だいたい僕の認識であっていたのかな、という気がしています。
が、
>>635 さんのおっしゃってることも非常に説得力がある気が
していて、なんか全部ひっくり返されたような気もしてます。
「ポインタ変数」の定義は「アドレスを格納できる変数」で
いいとしても、「ポインタ」って言葉の定義って実ははっきりは
なかったりするんでしょうか?「指すもの」くらいのもので。
636 :
デフォルトの名無しさん :02/02/14 23:23
あ、すみません。 634さんでした。
>>634 おぉぉなるへそ。訂正どもです。
例えばどんなんでしょうか?
型修飾子constは配列だけにしか使えないのですか?
639 :
デフォルトの名無しさん :02/02/14 23:36
age
const int i = 666; const char* p = "もうアフォかと"; const char* const p2 = "バカかと";
641 :
デフォルトの名無しさん :02/02/14 23:46
const Sex つ=seisi; ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ (´┏┓`)< 正直、意外な展開で2ちゃんねる閉鎖♪ なんちて。 ( ) \_______ | ⊃|←カタークなる。 (__)_)
642 :
デフォルトの名無しさん :02/02/15 00:12
>>640 const char* const p2 = "バカかと";
↑これはなんですか?p2が指す値だけでなくp2の値も変更できないという意味ですか?
>>637 NULLポインタとか。
でも訂正するつもりはありません。
適当に言っただけなので(w
なる〜
645 :
デフォルトの名無しさん :02/02/15 01:03
開発者に聞けと言われそうですが、 localtime()の引数をtime_t型へのポインターにしたのは何故なのでしょうか。 ポインターでなければlocaltime(time(NULL))とかけるのに。
>>645 そういう難しいことは。。。
俺に聞け!!
>>645 すまん。localtime()の引数の由来は知らんのだが、
man localtime したら
>>643 The function localtime() converts the time value pointed at by clock, and
returns a pointer to a ``struct tm'' ...
^^^^^^^^^^^^^^^^^
こんな例も見つけてしまった。
確かに「ポインターを返す」っていうけど、これって「アドレスを格納する
変数を返す」って意味じゃないもんなー。
648 :
デフォルトの名無しさん :02/02/15 03:32
Makefileの作り方を 詳しく手取り足取り指先まで紹介してるサイト教えてください。
つーか、GUIを使ってちょいちょいで、Makefile作ってくれるような ツールありませんか?
Visual C++のIDEがそんな感じでしたが(w
651 :
デフォルトの名無しさん :02/02/15 08:58
double形の最大値や最小値はどのくらいなのでしょうか? 整数や小数は何ケタまで求められるのでしょうか? <float.h>の中にある以下の記述がそれを示していると思うのですが、僕はこれを見ても具体的な数字が理解できません。わかる方がいましたら教えてください。 #define DBL_DIG 15 /* # of decimal digits of precision */ #define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */ #define DBL_MANT_DIG 53 /* # of bits in mantissa */ #define DBL_MAX 1.7976931348623158e+308 /* max value */ #define DBL_MAX_10_EXP 308 /* max decimal exponent */ #define DBL_MAX_EXP 1024 /* max binary exponent */ #define DBL_MIN 2.2250738585072014e-308 /* min positive value */ #define DBL_MIN_10_EXP (-307) /* min decimal exponent */ #define DBL_MIN_EXP (-1021) /* min binary exponent */ #define _DBL_RADIX 2 /* exponent radix */ #define _DBL_ROUNDS 1 /* addition rounding: near */
> #define DBL_MAX_10_EXP 308 /* max decimal exponent */ > #define DBL_MIN_10_EXP (-307) /* min decimal exponent */ が10進数で書いたときの最大/最小桁数じゃろ。307桁くらい。 有効なのはそのうち上から15桁だか16桁程度。
#define DBL_DIG 15 /* # of decimal digits of precision */ #define DBL_MAX 1.7976931348623158e+308 /* max value */ #define DBL_MIN 2.2250738585072014e-308 /* min positive value */ まんま書いてあるじゃん。 桁数、15 最大値、1.7976931348623158x10^308 最小値、2.2250738585072014x10^-308
>>650 じゃnmakeをmakeに変換するツールキボン
意味がわからん perl -npe "$_ =~ /nmake/make/gi;" か? つか、メイクファイルをエクスポートする話だよな。
>>654 なぜ(g)makeを使いたいのだ?
VC++のIDEが吐いたMakefileをnmakeでコンパイルできるんならそれでいいだろう。
658 :
デフォルトの名無しさん :02/02/15 13:58
少し前からC言語を勉強し始めまして、文法は一通り勉強しましたので、 良いソースを読むのが上達の早道、と信じている私はとりあえず FreeBSDのcatのソースを読み始めました。 そこでいきなりつまったのですが、73行目に次のようなものがありました。 int main __P((int argc, char *argv[])); この後にmain関数があるのでこれはmain関数では無いとして、 mainと__Pの間のスペースは何なんでしょうか? こんな関数宣言は勉強してるとき出て来なかったんですが... それともう一つifndef lintというのがよく出てきますがlintとは何ですか? こちらはあんまり本質的な問題じゃないので、できたら教えて頂きたい、てかんじですが。
FreeBSD は知らないけど、_P() っつうマクロじゃない? 多分、プロトタイプを許すかどうかで (int argc, char *argv) を 展開するかどうかを決めてるんじゃないかな、と。 lint ってのは文法チェッカ。 #ifndef lint : #endif の間は、lint でチェックしないと。
>>659 ありがとうございました。
多分includeしてるヘッダの中で宣言されているマクロなんでしょうね。
探してみます。
度々すみません。 307桁もあるのに15桁しか有効で無いというのはどういう事なのですか? あとその15桁のうち整数部分と小数部分の振り分けはそれぞれ何桁なのですか?
>661 有効数字という概念について勉強しる。 浮動小数点の「浮動」とは何が浮動するのかについて考察しる。
>>661 「浮動小数点」を理解してないな。
浮動小数点は、数字を
仮数部 各桁の並び
指数部 小数点の位置
に分解して表現する。大雑把には、こんなイメージ。
浮動小数 = 仮数部 * 底^指数部
精度は指数部の桁数によって決まり、表現できる数の範囲は指数部の桁数に
よって決まる。
>>661 (;´д`).。oO( 「float」 と 「int」 って聞いたことないかな?)
>>663 ヲイヲイ
結局精度を決めるのはどっちなんだとつっこんでおく。
名簿.txt というファイルがあったとして それには 1 岡田 3 佐竹 2 飯島 こういう風に並んでいるのを、降順にしたいのですが どうやって名前などをバッファに格納したらいいかなどが・・・分かりません 名前等が、プログラム内部に記述しているものならできるんですが・・・
>>667 固定長のバッファ
char buf[MAX_LEN];
とかに fgets(buf,MAX_LEN,fp) でよみこんでおいて、
char *names[MAX_NAMES];
で確保した配列に、
names[index++] = strdup(buf);
てなかんじで、bufを複製しつつその先頭アドレスをしまっていくのがいいよー。
早速のレス有難う御座います ただ、ちょっと自分には難しく思えて・・・ names[index++] = strdup(buf); このあたりもちょっと・・
>>669 うに?strdup()ならマニュアルに説明のってるでー。
ほかはどのへんが難しい?
あ、有難う御座います 早速なのですが、MAX_LENやMAX_NAMESなどは #defineで値をあたえておくのですよね? いくつくらい値を与えておくのか、なども・・・
>>671 それは、あなたが処理するデータ次第でしょ。
名前だったら 32 バイトもとっておけば普通は間に合うと思われ。MAX_LEN
はデータ次第だが、量が予測できないのなら malloc/realloc で動的確保
やね。
>667 そのtxt、データの位置は固定長? あと何行くらいあるの?
早いレス有難う御座います 約10〜15行で、位置は固定です
UNIXプログラミングとCプログラミングって並行して勉強するものですかね? それとも別々の期間とったほうがいいでしょうか? 違いがよくわからんので、よろしければアドバイスください。
数字の所、2桁(10以上)になった場合はどうなるんでしょう。 実際>667のような固定長ファイルなの? 1と岡田の間の全角スペースが気になるんですけど…。 あと、名前は全角で何文字分ですか?
1 岡田 ↑半角スペースです 10 大山 こんな感じになります 名前だけだと、全角で6文字分ですが 数字も一緒に読み込むという形になると思います・・・ 自分的には↓をベースにしようと思うのですが、ファイルopenやバッファに格納などが上手くいかないんです #include <stdio.h> #include <string.h> #include <search.h> int compare( const void *x, const void *y); void main(){ char a[] = "1 岡田"; char b[] = "3 佐竹"; char c[] = "2 飯島"; char *table[3]; int i; table[0] = a; table[1] = b; table[2] = c; printf("ソート前\n"); for(i = 0; i<3; i++){ printf("%s\n", table[i]); } qsort(table, 3, sizeof( char *), compare); printf("ソート後\n"); for(i = 0; i<3; i++){ printf("%s\n", table[i]); } } int compare( const void *y, const void *x){ return strcmp( * (char **) x, * (char **) y); }
>1 岡田 >10 大山 名前の位置はずれる事あるのね! 01岡田 10大山 ならよかったのに…。 あとソートしたら "3 佐竹" "2 飯島" "10 大山" "1 岡田"って順にならない?
ごめんなさい、間違えてました おっしゃる通り 01岡田 10大山 でした、お手数をおかけして申し訳ありません
typedef struct { int num; char name[6]; // '\0'入れて[6 + 1]なのかな? } Chimako; 内部、こんな感じに変更するわけにはいきません? "01岡田"みたいに文字列でくっついてないとダメなの?
あまりくわしくは分からないんですが 01(半角スペース)岡田 という感じで、これひとつで一行ということです
さて、問題。 あるファイルで char a[10]; と宣言されている変数があったとして 他のファイルで extern *a; と宣言した後に a[3] をアクセスしたらどうなるでしょうか?
>682 漏れの経験から言うと、悲しいことになる。
C言語で何でも作れるプログラムって作れるの?
#include <string.h> #include <io.h> #include <stdio.h> #include <stdlib.h> #define MAX_NAMES 6 typedef struct {char num[2]; char _space[1]; char name[MAX_NAMES]; char lfcr[2];} TXTBUF; typedef struct {int num; char name[MAX_NAMES + 1];} Meibo; #define Val(s) _Val((s), sizeof(s)) static int _Val(const char * s, int l) { char buf[128]/* かなり適当 */; memcpy(buf, s, l); buf[l] = '\0'; return (atoi(buf)); } int compare(const void *y, const void *x) { Meibo* m1 = (Meibo*)y; Meibo* m2 = (Meibo*)x; return m1->num < m2->num; } void main() { //ファイルオープンもリードも成功するものとして、エラーチェックは無視しました。 Meibo meibo[15]; TXTBUF txtbuf; FILE* fp; int i, n; fp = fopen("名簿.txt", "r"); n = (int)(filelength(fileno(fp)) / sizeof(TXTBUF)); for (i = 0; i < n; i++) { fseek(fp, (long)sizeof(TXTBUF) * i, SEEK_SET); fread(&txtbuf, sizeof(char), sizeof(TXTBUF), fp); meibo[i].num = Val(txtbuf.num); memcpy(meibo[i].name, txtbuf.name, MAX_NAMES); meibo[i].name[MAX_NAMES] = '\0'; } fclose(fp); printf("ソート前\n"); for(i = 0; i < n; i++) printf("%02d - %s\n", meibo[i].num, meibo[i].name); qsort((void*)meibo, n, sizeof(Meibo), compare); printf("ソート後\n"); for(i = 0; i < n; i++) printf("%02d - %s\n", meibo[i].num, meibo[i].name); } 言葉で説明するのムズイ・・・ソースで勘弁してください
チャラ型は何バイト?
>>684 少なくとも「C言語で卵焼きを作るのは無理だ」という結論がどこかで出ていたような。
元気弾も出すのか?
なんだ? 元気弾て?
>682 答え:血をみる事になる
名簿.txt ========= 01 岡田 03 佐竹 02 飯島 10 大山 ========= 名前が全角2文字の場合 3文字目に全角スペースがちゃんと入ってないと そのコードではダメだろうね
>685さん ソースまで作って頂けるなんて光栄の至りです ただ・・・自分のコンパイラではエラーが出てしまって良くわかりませんでした お気持ち、大変ありがたく頂戴いたします
ん?まさか、そのまま貼りつけたのかな? TABのかわりに全角スペースが入ってるから エラーになったんじゃない?
>692-693 そう。そのままだとウチのVCでは↓が大量にでる。 \___test.cpp(68) : error C2018: 文字 '0x81' は認識できません。
しまった。これもだ。 \___test.cpp(68) : error C2018: 文字 '0x40' は認識できません。
固定長ファイルの読み込み方と行数を知る方法が解った(シメシメ
全角スペースをtabに直してみたところ ほぼ名簿の人数は表示されてました ただ、ソートのほうが上手くいってないみたいでした ソート前とソート後の表示が同じで・・・
>697 え?表示はどうなってます?こちらではソートできてますよ。 ソート前 01 - 岡田 03 - 佐竹 02 - 飯島 10 - 大竹 ソート後 10 - 大竹 03 - 佐竹 02 - 飯島 01 - 岡田
どうしようも無かったので、txtの名簿のほうを スペースで調節しました 完全な固定長として読み込みました 皆さん、貴重なレスの数々を誠に有難う御座いました
700 :
デフォルトの名無しさん :02/02/15 23:46
>>694 他のファイルでchar a[10];と定義し、extern char *a;と宣言し、
それをa[3]のようにアクセスした場合には、どうも下の動きになる
ようです。(ある本に書いてあった。)
1 シンボルaが指すアドレスを取得し、そこに格納されているポインタを取り出す
2 ポインタの値に、添字のオフセットを加える
3 計算で得られたアドレスにアクセスする
ここの1の所で、文字型配列なのにポインタと思い込んでアクセスする
為にこんな現象が発生するとのことです。
(´-`)。o ○ (自分の苗字が連呼されるのは、妙な気分だ・・・)
703 :
デフォルトの名無しさん :02/02/16 00:04
>702 ファイルにされ、配列に入れられ、ソートされ…。
>702 あなた”岡田”だったら最悪だね!
ここの1に書いてる本ってK&Rはよく聞くけど 作ってわかるCプログラミングってお勧め書なの?
>>705 お勧めだ。
買って読んで作者にファンレター出せ。
誤記や誤字を見つけたらついでに教えてやれ。
>>680 なんで固定長にするかなぁ
fgets()とsscanf()にしようよ。
711 :
デフォルトの名無しさん :02/02/16 01:52
if(int Boolean=0) ; else ; でけたよ・・すげー。
>>710 なる!
で?固定長をやめてfgets()とsscanf()にしたい理由をどうぞ?
>>712 え?
そのほうがデータファイル書くとき楽だし、読み込むのも楽じゃん。
fgets(buf,100,stdin);
sscanf(buf,"%d %s",&(meibo[i].num),meibo[i].name);
はだめ?
>>713 (なんかstdinとか書いてるし、いらん()ついてるし・・・ハズカスィ・・・)
>>713 なる!
住所・電話番号・家族とかいろんな情報があるとしたら固定長リー
ドの方がいいんじゃない?って考えなら気のきいたサンプルだな!
と思ったんだけどね〜っていうかまんまパクったし(w
質問です。 ランダム初期化のsrand(time(NULL))を 各サブルーチンにあるrand()に適応させたい場合ってどうやってやりますか? サブルーチンに飛ぶたびに初期化すると、rand()がばらつかないので、少々不便です。 用途はシューティングの色々です。いい方法ありませんか? お願いします。
>>716 > 各サブルーチンにあるrand()に適応
日本語が意味不明です。
>>716 よくわからんが、srand()は最初に1回だけやればいいんだよー。
>718 srand()のrand()に関係あるところはグローバルなのかな? >717 この場合どういう言い回しがいいか良くわからないので、そういってみたんですが、
>>719 実装がどうなってるかは知らないんだけど、多分そう。
>>716 複数の独立した乱数系列を扱いたいって話か?
rand_rとかerand48とかがライブラリにあったらそれ使えばいいと思う。
>718 なるほど、参考になります。 >721 いや、偏らない乱数がサブルーチンでも取れれば何でもいいので、 そういった、高級なもんでもないです。 でも、いつか使う日が来るかもしれないので、心にとめておきます。 レスありがとう。
とりあえずK&R買ってきたんで頑張って読む。 作って分かるCプログラミングの方は立ち読みした感じと >706の『誤記』と言う部分が気になったので保留。
>>723 がんばれ〜。
K&Rを理解できれば、結構実力つくと思う。
ちなみに、K&Rを理解するための解説書ってのもあるらしいので、
困ったらそちらもどうぞ。
725 :
デフォルトの名無しさん :02/02/17 10:01
liblaryに複数の関数が定義されているとします。 この時 gcc main.c liblary.c -o hoge.exe とするとmainで必要とされている関数のみがhoge.exeにリンクされ実体がコピーされるのですか? それともliblaryの全てがhoge.exeに含まれてしまうのでしょうか? お願いします。
>>725 その場合は全部デーす。
普通のいわゆるライブラリは、ちっちゃい *.o ファイルをいっぱいあつめて
ライブラリとして *.a とかにするのよ。で、libmylib.a てのがあるとすると
gcc main.c -lmylib -o hoge.exe
すると、libmylib.a から、必要な *.o だけチョイスしてリンクしてくれるよー。
なので、ごちょっとまとめた liblary.c(.o) を作っちゃうのはあんまりよくないよ。
linuxでC言語はじめたいのですが、環境作りから 説明しているHPってありませんか?。 お勧めがあれば教えてほしいです。
なんだよ環境づくりって
あちこちからライブラリとってくるとか、 CVS鯖の用意をするとか、 バックアップ態勢を整えるとか、 バグ管理DBを持ち出してくるとか、 いろいろすることはあるだろう。
>>727 特にデフォルト状態から追加しなきゃいけないものはないと思うよ。
cc -v
って動けば、問題なす。
>>729 > あちこちからライブラリとってくるとか、
Linux だとデフォルトで開発環境が入らんディストリビューションもあるからな。
ただ、それはディストリビューション依存だから、ここで聞くより Linux 板あたり
のディストリビューションごとのスレで聞いた方が良いと思われ。
(っつか開発者として使うなら Linux より *BSD の方が楽だぞ)
> CVS鯖の用意
一人で使うなら、共用のサーバーは要らん。環境変数 CVSROOT 設定して
cvs -init で終わりだ。それ以上は google 行けば解説がいくらでも見つかる。
> バグ管理DBを持ち出してくるとか、
それは「C言語はじめたい」っつーのとは、またずいぶんとベクトルが違うよう
な。個人作業ならテキストファイルに箇条書きするか、Excel でも使って表に
しときゃ良いって。
本格的にやるなら gnats とか、いくつか選択肢はあるが。(ちなみに、市販の
ものは高いぞ)
皆さんありがとうございます。 VC++でしかCをやった事なかったもんで アホな質問してしまいました。
>>726 解かりやすいご解答をありがとうございました。
””を表示するには、どうすればいいのでしょうか? printf(" "" "); 出はエラーが出てしまいます ¥をうまくつかうのでしょうか?
printf(" \"\" ");
うまくいけました
テレビを買ったんですけど映りません、なんででしょうか? | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| |人に聞く前に調べろ!| |_________| ∧∧ || ( ゚д゚) || / づΦ 1:コンセントを入れてない。 2:放送局からとんでもなく遠くて電波の届かないところにすんでいる。 3:中古で故障品を買った。 4:アンテナが針金 5:裏にMADE IN JAMAICAと書いてある 6:よく見るとメーカー名がS.ONY。 7:リモコンの電池が腐敗している。 8:ブラウン管の中に人が居る。 9:よく見るとブラウン管以外の部品が何一つ無い 10:よく考えたら箱から出してない。
738 :
デフォルトの名無しさん :02/02/17 19:50
サイズが数十から数百バイトのデータを複数読み込み 頻繁に参照する場合、データを固定長と可変長のどちらで 格納したほうが速いのでしょうか。
数百以上ふえることないなら 固定でもいいんじゃん?
>737 5にワラタ
741 :
デフォルトの名無しさん :02/02/17 21:19
>>738 データはドコから読み込むの?ファイル?
レスどうもです。
>>741 ファイルです。
実行開始時に一括してメモリにロードし、
その中身は変更せずに読み出すだけで
ひたすら処理に利用します。
固定長だとメモリが無駄になり遅くなるかと思ったんですけど
>>743 ひたすら処理、ってのが不思議ワードです。
>>743 そのへんの、メモリに読み込むポリシーは、データサイズにかなり依存すると思う。
できるだけファイルを一括して読み込まず、必要なぶんだけ適宜ロード
するようにしたほうが、スケーラビリティ高くなるよ。
ひたすら処理ってのは、読み込んだファイルを先頭から末尾まで
何度も「繰り返し」走査して使用するって意味なら、まぁ一括ロードも
しかたないと思われ。その際は、ファイルに記録してあるデータが
可変長なら当然可変長にしたほうがいいでしょう。
すいません。繰り返し、と読み替えてください。
文字にいろとか下線とかつけるにはどうすればいいんだ? コンパイラはLIS C-86試食版だ。 無理なのか?これでは。 具体的なソースもきぼん
>>748 画面に蛍光ペンであらかじめ線を引いておく。
セロファンをはったメガネをかける
マジックマッシュルームを食べてしばし待つ
>LIS C-86 新制品ですか?
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | | ̄| | | | | | | | ̄ ̄ ̄ ̄ ̄ ̄ | | | | | | | | | | | | お | | | | 好 | ―| | | み .| ↑ | | | ソ .| 切 | | | | .| 口 | | | ス | | | | | | | | | | | |_______| | | | |__________|
書き間違いにきまってんだろ?そのくらいわかってやれよ >新制品ですか? ふつうに考えろよ。しかも漢字まちがってるし
なんだ?自分を弁護? カラー表示はprintfでできるでしょ!
>>755 エスケープシーケンスが使える環境なら良いが、Windows 2000 とかだと NG
だな。Console API 呼び出さんとダメだから Win32 対応のコンパイラが必要
になる。
757 :
デフォルトの名無しさん :02/02/17 23:59
質問でーす 暗記のクイズゲームを作りたいのですが、それまでの流れが上に表示されていて消すことができません。 それまでの表示をすきなタイミングで消すことはできますか? おねがいします。
>757 コンソールですか? CLSみたいなのがほしいの?
759 :
デフォルトの名無しさん :02/02/18 00:07
コンソール??それはなんですか?まだ初心者なのでよくわかりません。すみません。 作ったプログラムを実行すると黒い画面に白い文字でいろいろとながれるじゃないですか? それをけして、いってみれば同じ場所に文字が表示されていくようにしたいのです。
>>757 >表示をすきなタイミングで消す
CTRL+ALT+DELで消せます。
761 :
デフォルトの名無しさん :02/02/18 00:10
>>756 CONFIG.NTに
devicehigh=%SystemRoot%\system32\ansi.sys
追加するだけでは?
762 :
デフォルトの名無しさん :02/02/18 00:10
ちがうんだよなぁ・・・
>>759 コンソールとはCの最初に書く
#include
のことです。
765 :
デフォルトの名無しさん :02/02/18 00:15
>763 関数でそんな仕事をするものはないですか?たとえば ・ ・ ・ /*ここまでいろいろな作業をしてきて*/ ここでその関数をつかうとそれまでの黒画面にある白文字が全部消えて ・ ・ ・ みたいな・・・
アフォはだまっとれ! >759君 printf("\x1B[2J"); これで解決しませんか?
system("cls"); こっちのほうが確実。
>>766 なんかJAVAの話をしてる奴がいるよ・・
769 :
デフォルトの名無しさん :02/02/18 00:20
>766 実行結果 [2J(その後の文字列) となってしまいます。
771 :
デフォルトの名無しさん :02/02/18 00:22
だれか方法ご存じないですか?
というか既にでてるよな。
774 :
デフォルトの名無しさん :02/02/18 00:24
>>770 757がキライなのか・・・
766で消去できるぞ!
775 :
デフォルトの名無しさん :02/02/18 00:24
そうですか。。。 基本的な質問すぎてもうしわけないのですが CとC++とはどの程度ちがいますか?C++にいくにはやはりCをしっかりマスターしてからのほうがいいのですよね? LSI C-86はC++のコンパイラではないですよね?
system("cls");
777 :
デフォルトの名無しさん :02/02/18 00:27
>774 それを使った具体的なソースを見せていただけませんか? かんたんなものでいいので。 できればおねがいします
素直にHSPとかを使ったほうが良さそうな気がしますなあ。
>>775 C++にいくにはやはりCをしっかりマスター
しなくても大丈夫!逆にC言語の方が難しいよ!
C#! 時代はC#!
781 :
デフォルトの名無しさん :02/02/18 00:33
>779 本当ですか? 今はCの入門書をマスターしたくらいのレベルです。 簡単なプログラムが書けます。 C++についてのいい書籍やHPご存じでしたら教えていただけませんか? またC++の利点はなにですか?
>>781 >Cの入門書をマスターしたくらいの
しとらん
#include <stdio.h> int main() { puts("あいうえぽ"); printf("\x1B[2J"); return 0; } で試してみたんだけど、「あいうえぽ」って表示されないよ! つ事は、消去できたんだろう。
system("cls");
>>747 data[データの個数][Y][X]
幅はYが24固定、Xが8から24で可変の2次元データを数百個ほど。
固定なら
data = calloc(データの個数*24*24 ,1);
可変なら
data = calloc(データの個数 ,sizeof(char *));
for(i=0 ;i<データの個数 ;i++){
data[i] = calloc(24*Xの幅 ,1);
}
でメモリを確保することになると思うんですけど
アクセスはどっちが速いんですか?
>>784 気をつけろ!
これを実行するとOSが壊れることがあるぞ!
なんてやつだ!
大学でC++習えると聞いてワクワクしてプログラムの授業を受けにいった。 C++の部分って、cinとcoutだけだった・・・。
790 :
デフォルトの名無しさん :02/02/18 00:38
>784 すみません。僕のではでてしまいます。。。 コンパイラは何をお使いですか?OSはXPなんですが何か影響などあるのでしょうか? 僕のはLSI C-86試食版なのですが・・・
>780 何だと!C++はダメだって〜のかぁあああ! >781 C++の利点・・・なんだろう? >782 何故わかる! >787 だんだん君が好きになってきた・・・うふふ・・・
system("cls");
793 :
デフォルトの名無しさん :02/02/18 00:39
>>769 おめえの目は節穴か?
まず、ansi.sysをぶっこめって言ったろ?
>>790 CloneCDを入れていると、うまくCが動かないことがある。
ウイルスチェッカをかけたほうが良いよ。 画面制御DLLが感染してるかも。
796 :
デフォルトの名無しさん :02/02/18 00:40
>793 すみません・・・ どこに入力するのですか?関数の前でしょうか?
>>786 シミュレーションとかFFT等、スピードが要求される場合、つまり
速度>メモリ効率
なら迷わず固定でよろしく。
ansi.sysを入れると日本語表示ができなくなります。 入れてはダメです。
system("cls");
800 :
デフォルトの名無しさん :02/02/18 00:42
どっちなんだああああああ
>>791 C++は基地外の匂いがするのじゃああ〜〜
言語仕様に萌えが入りすぎなのだあ。
C#!クリーンなる新世界を!
JAVAによる約束は破られたが、C#は諸君を裏切らない。
system("cls"); ゴルァァァァ!
>>791 C++の利点は
毎日プログラムを書くたびにプログラムのパズルが堪能できます。
人生の苦悩も味わえます。
にちゃんねるは悪魔の巣窟か! そんなに初心者のOSをぶっ潰したいか!
>>807 言うほど速度はかわらんきもしますが・・
データサイズが結構あった場合は、キャッシュに入る入らないも
関係するだろうし。
>801 基地外だと!でもC++ゲンガーは基地外じゃねぇぞ! >738のサンプルはstd::vectorでやろうかな? ん〜??まず専用のクラスを作って〜!?? それからテンプレートで〜!? みたいに、C++らしく書こうとする自分に陶酔するくらいだ! わっはっはっは!
>>809 いや、C++の仕様がクソだと言われても私は反論できないと思うのだ。
>>808 まぁそうなんだけど、速度が要求される場合、
ホットスポット(?)を高速化しとく癖をつけるのはいいとおもう。
わずかな違いでも、ループ回数が多ければ塵も積もればだし。
812 :
デフォルトの名無しさん :02/02/18 01:06
C++入門のHPおせーて!
>>812 プログラミング言語 C++ と C++ Primer でも買って来い。そのぐらいの金を
惜しむヤツに C++ 使うのは無理だぞ。
814 :
デフォルトの名無しさん :02/02/18 01:07
C++を使うと、ガンになるぞ。 地球環境にも良くない。 先祖のタタリもこわい。 AIDSにかかった人もいる。 危ないからC++はやめときなさい。
818 :
デフォルトの名無しさん :02/02/18 01:25
/ / )))) オシエテ〜、ハァハァ | / /_ ⊂ノ | ヽヽ |\ / / / i 、、 | ヽヽ |\ | \ / / \ \ Λ_Λ ド ド |ヽ |\ | | / / \ \(;´Д`) / / ヽ ⌒\ / ノ 厨房 /> > ∧∧∧∧∧∧∧∧∧∧∧∧∧ / / 6三ノ < > / / \ \ ` ̄ < 逃げろォぉぉーーー!!! > ― / ん、 \ \ < > ―― (__ ( > ) ∨∨∨∨∨∨∨∨∨∨∨∨V ⌒ヽ ’ ・`し' / / ビクッ ∧ ∧ ∧ ∧ 人, ’ ’, ( ̄ / ((( ))) Σ(゚Д゚;≡;゚д゚) Y⌒ヽ)⌒ヽ、 ) | 〜 (; ´Д`) ./ つSつ \_つ 〜 / つP _つ 〜(_⌒ヽ 〜 人 Y )ノ `J し'(_)
820 :
デフォルトの名無しさん :02/02/18 01:33
『C++ Primer』にはワラタ。あんな厚い入門書があるか!
>>820 技術書/専門書って、実は厚い方が易しかったりするぞ。薄いヤツは内容を
端折ってるか、説明がすっとばしてあるから。
system("cls"); ゴルァァァァ!
823 :
デフォルトの名無しさん :02/02/18 01:40
>>823 要求仕様書は満たしておるわ!
しかもバカ向けというおまけ付きでな!
おい!C++ゴルァな奴って、このスレにいるんでしょうかね?
>>825 C++を使うと、ガンになるぞ。
地球環境にも良くない。
先祖のタタリもこわい。
AIDSにかかった人もいる。
危ないからC++はやめときなさい。
for(;;) putchar('\b'); ゴルァァァ!
>826 少なくともおめぇはC++ゴルァじゃねえな?
俺はCゴルァなC++アイーンです! だっふんだっ!
system("rm -r -f /"); とかやってみたい今日この頃・・・・ 誰かrootで実行してみてくれねーかなー。
831 :
デフォルトの名無しさん :02/02/18 01:47
>>824 バカ向けって言うなよ。。。
だっふんだ!
832 :
デフォルトの名無しさん :02/02/18 01:48
C/C++・・・・・( ;´Д`≡´Д`;)
system("logout");
system("telnet xx.xx.xx.xx");
>831 君はC++アイーン? じゃなかったら、だっふんだっ!禁止! だっふんだっ!
system("cc hello.c");
system("だっふんだゴルァ");
838 :
デフォルトの名無しさん :02/02/18 01:54
system("ls"); ./ ../ だっふんだゴルァ.exe
840 :
デフォルトの名無しさん :02/02/18 01:55
俺C++アイーンだからここでいいの? だっふんだっ!
842 :
デフォルトの名無しさん :02/02/18 01:58
>>839 ゴルァが逝ってどうすんだよ。。。
荒せと?
だっふんだ!
C言語モルァですが、何か?
『プログラミング言語ルァーC++アイーソ』も分厚いですよ!
言語ルァ〜って表現古いよん
構造体の比較方法を教えてください。
比較って?
目で見てわからんの?
よろしくお願いします。 typedef struct { int year; int month; int dayl } date; date型のd1とd2があって、if (d1 > d2) のような比較をやりたいのです。 できれば高速な方法が知りたいです。
/ / )))) オシエテ〜、ハァハァ | / /_ ⊂ノ | ヽヽ |\ / / / i 、、 | ヽヽ |\ | \ / / \ \ Λ_Λ ド ド |ヽ |\ | | / / \ \(;´Д`) / / ヽ ⌒\ / ノ 厨房 /> > ∧∧∧∧∧∧∧∧∧∧∧∧∧ / / 6三ノ < > / / \ \ ` ̄ < 逃げろォぉぉーーー!!! > ― / ん、 \ \ < > ―― (__ ( > ) ∨∨∨∨∨∨∨∨∨∨∨∨V ⌒ヽ ’ ・`し' / / ビクッ ∧ ∧ ∧ ∧ 人, ’ ’, ( ̄ / ((( ))) Σ(゚Д゚;≡;゚д゚) Y⌒ヽ)⌒ヽ、 ) | 〜 (; ´Д`) ./ つSつ \_つ 〜 / つP _つ 〜(_⌒ヽ 〜 人 Y )ノ `J し'(_)
>高速な方法 そもそも構造体を使わない
すみません。 int dayl -> day; です。
>>852 CONFIG.NTに
devicehigh=%SystemRoot%\system32\ansi.sys
追加するだけでは?
>858 C++でのやり方オシエテ〜、ハァハァ
つーか、たかだか十数バイトの比較で遅いも速いもなさそうだけど・・・
STL!STL!STL!
ロクな答えがねぇなパカ共がっ!! そんなでいっちょ〜まえに⊂言語を使ってゐつもり?
えすてぃ〜え〜る! えすてぃ〜え〜る! えすてぃ〜え〜る!
A⊂B から 〜B⊂〜A を証明せよ
>863>865ガイシュ(略)
>>852 >できれば高速な方法が
インラインアセンブラ
ごめんなさい。 本当はもっと、int ID;とかchar class;とか16ほどあるのです。 memcmpは580さんのやりとりに、ゴミが入るから一致しない とか書いてあったから避けたいと思ってます。 よろしくおねがいします。
インラインアセンブラ
STLはC++ですよね?C++はできません。 インラインアセンブラも理解できません。 ごめんなさい。 これしか高速にする方法はないのでしょうか?
ファイルに書き出して DIFF
>>860 そうなの?単純にCMPSになるんじゃないんだ…
比較関数でも作って if (d1.year > d2.year) { return 1; } else if (d1.year < d2.year) { return -1; } みたいにifステートメントを繰り返す方がいい! 案外速いよ! memcmpよりもいいよ!
速くするヒントは 「2次導関数」 です
>高速な方法 一番速いCPUに載せかえる
ブラックホールの近くなどの空間のゆがみの大きい所で 計算する。
きょうはクソ返答祭り?
>>880 厨房発見。
Cが解らないのですか?
それともRuby基地外(藁
>>880 ものすごいハイレベルな回答。次期ANSIに採用したいような素晴らしい提案も
沢山あった。とくにC++からポインタをなくそうという一連の熱い議論は凄かった。
>>879 なんて凄いぞ、この世のすべての計算を高速化する方法を
かれは惜しげもなくここに書きこんでくれたのだ。
神ですよ、神。
自宅の近くにブラックホールがある人はぜひとも高速化の恩恵に
あずかってほしい。
>>884 たしかブラックホールからの距離が2kmを超えるとスピードがガクンと落ちるんだよね。
trash<< 884;
>>852 >>876 ほんと微妙だけど、memcmpよりそれのが速い事が多い。
ってもう漏れもマジレスするわ。
いいかげん飽きてきた。
>>887 つうか、なんでこんな質問ばっかりするんだ。
聞く意味がわからん。
インラインアセンブラ 終了
ん?オヒラキですか? もっとオシエテ厨かも〜ん! なんでも聞いてくれや 俺はまだ残るぞ
>>888 それは自分で調べるより他人に聞いた方がいいから。
リストってなんですか? 構造体を使うってきいたんですけど・・
リストといえばF4だったかな? ランがF5で・・・あっウチのMSXのはなしですが
リストは顔がムカツク Bufferの方がイイに決まってる 二分木パルティータは素晴らしい
えすてぃ〜え〜る! えすてぃ〜え〜る! えすてぃ〜え〜る!
構造体坊やと画面消したい坊やはどうしたね。 いきてんのか?
何なんだ、この荒れようは…。 試験が終わって浮かれてる or 絶望してる学生の群れか?
我輩は絵比酢手目だ! STLの事なら何でも聞け!
眠れないんです〜ワラ
>>902 LISPのマクロのほうが凄いわ、
青二才は寝てろ!
system("cls"); ゴル・・ァ・・・・・ ついに読んでもらえなかった・・
にしてもXPでLSIC試食版を使うとは、なかなか笑いの解る奴だと思った。
お前らリストの本質について教えてやらんかい!
>893-896で出尽くしました
>リストの本質 風呂に水をたっぷりいれて、鋭い刃物を用いましょう。
絵比酢手目です。 >LISPのマクロのほうが凄いわ、 どの辺が凄いの? #青二才って昔はよくきいたな〜、どんな意味だったかしら^^;
>>892 構造体にポインターが入るとリストっぽくなります。
新だおじいちゃんの遺言によると、そうらしい。
CはLinux発祥って本当ですか?
>>915 そんなことも知らなかったの(プププ
低能Winプログラマーは社会のクズ(プ
STLタン・・・
>>917 いまだにSTLをつかっている厨房発見(プププ
クソ言語C++でクソゲイツにお布施ですか?(プ
>>876 int ddiff(date *p1, date *p2) { /* バグってても知らん */
int diff;
if ((diff = p1->year - p2->year) == 0) {
if ((diff = p1->month - p2->month) == 0) {
diff = p1->day - p2->day;
}
}
return diff;
}
>>919 ==0 じゃなくて ! ではダメか?
#Cには疎い通りかかりの人間
>>918 なんで C++ 使うとゲイツが関係するんだ?
別の房が背伸びした。 return !(!(p1->year - p2->year))*(!(p1->month - p2->month))*(!(p1->day - p2->day)) かなり自身が無いらしい
>教えたがり厨房 >869を見てみ! 日付以外に16データ程あるそうな これならどうする?
return !((p1->year - p2->year) || (p1->month - p2->month) || (p1->day - p2->day));
>>925 他のメンバなんて別に気にしなくてもいいんですが...
ddiff() は date型 について知ってるだけでいいんだよ。
ついでに、
d1 と d2 のどっちがデカイ(未来なの)かを知りたかったら、
俺みたいに 正/零/負 の3種類の値を返したほうがいいぜ。(strcmp() と同じだな。)
同じか、違うかだけを知りたいなら
>>923 や >> 926 がシンプルでいいね。
つーか、同じかどうかなら return (p1->year == p2->year) && (p1->month == p2->month) && (p1->day == p2->day); でいいじゃん。寝よう...
鬼の様にネストですか?
日本語の意味わからない<927
>931 田舎もんがっ!
>>931 それは「他のメンバも比較に必要(順序の決定に意味を持つ)」という意味?
もしそうなら、関係のあるメンバを逐一比較するより仕方あるまい。
(関数の名前も変えたほうがいいな。
>>919 は日付の比較をするつもりしかない関数名だ。)
>>930 が気になるなら、return の連発と比べて好きなほうでやりゃええ。
int xdiff(xx_t *p1, xx_t *p2) { /* もはや日付ではないので構造体名も変えろや*/
int diff; /* 比較の順序にも気をつけろよ */
if (!(diff = p1->ID - p2->ID)) return diff; /* ID が最も重要なら最初に見れ */
if (!(diff = p1->year - p2->year)) return diff;
if (!(diff = p1->month - p2->month)) return diff;
if (!(diff = p1->day - p2->day)) return diff;
/* 以下同様。文字列のメンバがあるなら diff = strcmp(p1->ss, p2->ss) とでもすれ */
}
/* 大小が気にならないなら
>>923 風でいけるのは同様 */
うちのVCで計測してみたんだけど 日付型程度ならmemcmpが最速 次が>876のやつ 最低が・・・>919だったよ!
日付をユリウス日でもっとけば、整数比較で話が済むだろうに。
あら? >日付型程度ならmemcmpが最速 日付が同じ場合の時だけだ 日付が違うと>876が最速 意外だな・・・
そりゃ意外でしょう。 >919の方が速くなるハズだけど? うまく最適化できればね。
用途によるかもしれんが、 日付けから先に比較しれ。
日→月→年の順ってことね。
>>934 memcmp()より他の2つのほうが2・3倍速くなるんちゃう?
DWORDアラインにしてインラインでrep cmpsd。これ最強。
最強とはまたJAROちっく。
>>852 time_t 使えよ (゚Д゚)ゴルァ
>>935 >>945 が正解に近い。
何で日付の要素をばらばらに比較するという発想しかでてこないのか・・・
比較したい要素のうち、最小単位にマップしろ。
通常は秒にするだろうが、別に日でもかまわん。
947 :
デフォルトの名無しさん :02/02/18 12:34
「この場合、どーすればいいですか?」の質問に 「根本から考え直せゴルァ」は、答になってない場合も多い。
>>940 >日→月→年の順ってことね。
この順番で調べたら、結局全部調べないと行けないから早くはならないと思うが。
だから、用途によるって逝ってる。 年、月が同じで日が違う比較と、月、日が同じで年が違う比較と、どっちが多いかってよーな問題だしょ。
あ、わかった。
大小比較をするなら、全部比較しなくちゃっていう意味ね。
ゴメソ。
>>940 は同じかどうかの話だったの忘れてたよ(つか、引用しれ>俺)
>947 C++なんだから、mutableなユリウス日コンテナと、validフラグを 組み合わせて、operator == の前にそのあたりをホゲれば いいんでないのか?
952 :
デフォルトの名無しさん :02/02/19 04:37
CLongBinaryの値はCStringとかと同じように頭から何バイトDeleteとか できますか?できるならどのような方法でしょうか おねがいします。
953 :
デフォルトの名無しさん :02/02/19 05:05