1 :
デフォルトの名無しさん :
2005/10/18(火) 07:51:40 BE:255612839-
2 :
デフォルトの名無しさん :2005/10/18(火) 14:29:00
----- #include <stdio.h> int main() { int var, *po; po = &var; var = 100; printf("%d\n" , po); return 0; } ----- だと変数varのアドレスが表示されるのに、 ----- #include <stdio.h> struct { int var; }obj , *po; int main() { po = &obj; obj.var = 100; printf("%d" , po->var); return 0; } ----- だと構造体objメンバvarのアドレスではなく中身が表示されるというのが 理解できません。 アドレスを表示させたい場合はどのように書けば良いのでしょうか。
&po->var
4 :
デフォルトの名無しさん :2005/10/18(火) 14:43:09
前スレ
>>993 です。同じ質問になってしまうんですが
typedef struct test{
union{
struct{ int a,b,c;};
int field[3];
};
}sTEST;
と
typedef union test{
struct{ int a,b,c; };
int field[3];
}uTEST;
とするのでは何が違うんでしょうか?
5 :
デフォルトの名無しさん :2005/10/18(火) 14:54:18
>>2 #include <stdio.h>
int main() {
int var, *po;
po = &var;
var = 100;
printf("%d\n" , *po);
return 0;
}
↑でなぜpoのアドレスが表示されないのがわかりません。
と聞いてるのと同じ事。
>>3 ポインタ変数*poは、
構造体以外の場合:
po…アドレス
*po…アドレスが指している内容
構造体の場合:
&po…アドレス
po…アドレスが指している内容
になるということでしょうか。
>構造体objメンバvarのアドレス & obj.var or & po->var
>>5 ポインタ変数は*がついていなければアドレスを保持する、と理解しているのですが。
10 :
デフォルトの名無しさん :2005/10/18(火) 15:01:35
>>7 構造体になってるか共用体になってるかの違いはあるけど
確保してる変数(a,b,c,field[3])は同じ状態になるってことでいいのかな?
int i = 10 int *p; p = &i; printf("pのアドレス[%p]\n", &p); printf("pの内容(内容は変数iのアドレス)[%p][%p]\n", p, &i); printf("pの指し示す先(内容は変数iの値)[%d][%d]\n", *p, i); これが理解できん奴はCを扱う能力がないんでVBでもやってろ
12 :
デフォルトの名無しさん :2005/10/18(火) 15:07:57
>>9 "->"はポインタの指し示す場所にある構造体からメンバーの値を取り出す演算子
>>11 構造体でないケースは理解できているつもりです。
>>12 "->"を使った時点で変数ではなく演算になるということですか。
納得しました。
皆さんありがとうございました。
14 :
デフォルトの名無しさん :2005/10/18(火) 15:15:35
L-Valueが判ればどうって事ないんだがな
>8が>13にスルーされた件について。
>>前スレ997 無名構造体だからおかしくない。
質問させてください。 char moji="あいうえお"; char mozi="たちつてと"; char a; aに、mojiとmoziの中身を代入して a="あいうえおかきくけこ"のようにする関数はありますか? よろしくお願いします。
char s[256]; strcpy(s, "foo"); strcat(s, "bar"); puts(s);
>>18 そもそも文字列について相当な思い違いをしているようだが。
Cの文字列はcharの配列だぞ?それに日本語をcharで扱うのはよくない。
~~~~~~
すいません。違う言語ばっかりやってたのですっかり忘れてしまってましたorz
>>20 さっそく取り組んでみます。本当にありがとうございました。
一言いい忘れました。
>>19 ,21
死ね糞根性悪。
では失礼します。
>>23 え?そんなこと言っちゃダメじゃね?君は、質問してる側だよ?
ここ、IDでないからある意味使いづらいな
ネタだと思えば腹も立たん。
日本語をchar配列で扱ってしまっている場合には 何に気をつけるべきでしょうか?
>>28 1バイト文字とのコードの競合や、文字の泣き別れが発生しないように気をつける必要がある。
>>28 あと文字列は出来ればunsigned charにした方がいい。
実際に unsigned にすると標準関数に渡す時にキャストがいる・・・ とか思ってたけど、C だと大丈夫なのね。 C++ だとエラーになるけど。
33 :
デフォルトの名無しさん :2005/10/18(火) 17:48:49
gets(a); f1=fopen(a,"r"); でaにディレクトリからファイル名を入れたいんですが どうすればいいんでしょうか? 環境はUNIXです 禿素人で申し訳ないですが教えて下さい
↓fgets厨登場
>>36 fgets厨かどうかは兎も角、gets()は使用禁止。
>>35 「ディレクトリからファイル名を入れる」とはどういう概念ですか?
もしや、ディレクトリ内のファイル一覧を得たいとか?
それならば、環境依存になるので該当環境スレか初心者スレへ。
38 :
デフォルトの名無しさん :2005/10/19(水) 10:14:56
c#でwindowsのプログラムを組んだのですが、バックグランドとフォアグランドで実行速度が異なります。 何が原因かわかりません。どなたか、ご教授ください。 計算プログラムはFFT変換をしています。
すげえ。
>>38 OSがフォアグラウンドタスクに処理を優先させるからだ。
コンパネシステムパフォーマンスでバックグラウンドを優先させて回線切手首吊ってスレ違いを悔いて市ね。
42 :
デフォルトの名無しさん :2005/10/19(水) 14:53:36
質問です。 reallocしたら、前にmallocした分で使っていたデータが変わってしまう現象にでくわしました。 流れとしてはこんな感じです。 char**ptr = (char**) malloc(size1 * sizeof(char*)); /* size1個の(char*)確保 */ for (i = 0; i < size1; i ++) ptr[i] = NULL; /* NULLで初期化 */ /* ・・・ある程度使用して、もっとたくさん必要になってから・・・ */ ptr = (char**) realloc(ptr, size2 * sizeof(char*)); /* size2個の(char*)確保 */ for (i = size1; i < size2; i ++) ptr[i] = NULL; /* 新しく確保されたであろう部分だけNULLで初期化 */ このとき、上記の「ある程度使用」したときに代入した非NULLの値たちは無事でしたが、NULLであるべきところにはいくつか変な値が入ってしまいます。 (値としては0x15とか0x18などの小さな数字が入っています。一方でちゃんとNULLな部分もあります。) この状況を打破して、reallocを正しく使用する方法はありますでしょうか?
reallocする直前のヒープの状態が壊れてないことは確認したんか?
44 :
42 :2005/10/19(水) 15:08:14
>>43 なるほど。それは確認すべきでした。
今すぐ確認してみます。
45 :
42 :2005/10/19(水) 15:16:26
realloc前も調べてみたら、少しだけ勘違いに気づきましたorz もっと不規則なデータの壊れ方をしています・・・。 壊れている部分と壊れていない部分がまばらです。
46 :
42 :2005/10/19(水) 15:17:56
何度もすみません。 ちなみにrealloc直前のデータは全て正常です。
>>42 もっと単純なモデルでテストすることを進める。
ダブルポインタに起因する複合的なバグの可能性もあるから。
とりあえず
int* ptr = (int*) malloc(size1 * sizeof(int));
for (i = 0; i < size1; i ++)
ptr[i] = 0;
ptr = (int*) realloc(ptr, size2 * sizeof(int)); /* size2個の(int)確保 */
for (i = size1; i < size2; i ++)
ptr[i] = 0;
で試してみぃ。
realloc直前では壊れていないということは、 あとは、size1 > size2になってるとかくらいかねぇ。 ライブラリのバグの可能性もあるけど。
49 :
42 :2005/10/19(水) 15:59:40
>>47 単純なテストをmainの中でやる分には不可思議な現象は一切起こらないみたいです。
int を char や char * にしても問題はおきませんでした。
>>48 サイズはreallocの直前に更新しているので大丈夫そうです。
ライブラリのバグだとしたら怖いですね。
ハッシュテーブルのサイズ更新なので、サイズが素数なのが問題なのかと思ったり思わなかったりです。
2回目のサイズを23にしたり29にしたりで、壊れ方が違ったり、全く壊れなかったり、色々です。
2回目のサイズが同じなら問題は完全に毎回再現されます。
やはり、原因は全く別のところにあるのかもしれません。(おそらくポカミス?)
>>47 の通りダブルポインタに起因する複合的なバグというやつかもしれません。
とりあえずreallocの代わりに、別口にmalloc→コピー→元のやつfreeでうまくいくのでそちらにしますが、他にバグがある可能性も頭に入れつつ色々探って見ます。
どうもありがとうございました。
ああ、もう1個。 プログラム中でmallocなどで用いてる管理領域をぶっ壊してる可能性があった。
デバッグ版のライブラリリンクしてreallocのソース追っかけてみりゃいいんじゃないの。
独学でC言語を始めようと思ってC言語を始めよう!とVisual C++ Toolkit をダウンロードしたんですが うまくいきません。 #include<studio.h> void main(void){ printf("hello,world"); } とりあえずこのプログラムを打ってみてコンパイラ→実行をやってみたんですが C:Documents and Settinds..... 続行するには何かキーを押してください・・・ と出るだけでした。アドバイスお願いします。
#include <stdio.h> int main(void) { printf("hello,world"); return 0; }
エラーメッセージは出てないのか? exeはちゃんとできてるか?
>>54 エラーメッセージは出てません。
"untitiled.exe"
っていうのは出てます。
untitled.exeの作成時刻は? 以前に同じファイル名で作成したものを実行してたりしないか?
57 :
52 :2005/10/19(水) 18:36:11
なんか色々やってたらできました。 整数を入力して10以下か以上かを答えさせる プログラムを作っただけなんですが異様に感動した。 プログラマーが小学生のなりたい職業上位に入るのも頷けますね。
stdioとstudioを間違える人多いよな・・・漏れも始めた頃間違えた一人だけど STanDard Input/Outputの略・・・で合ってるよね
ずっと<stdio.h> を スタジオエイチって読んでました 以後気をつけます。(´・ω・`)
60 :
おば :2005/10/19(水) 19:45:03
3次元配列を動的確保したいのですがどうやればよいでしょうか?たとえば サイズが不定のビットマップ画像を読み込む場合の処理を教えていただけないでしょうか?
62 :
おば :2005/10/19(水) 19:50:24
RGBは決まって3バイトあればよいのですが、幅と高さを一気に確保するのは無理ですかね?
できます
どうしてgetsがいけないんですか? scanfが悪いのはわかるんですが テンプレみても今いち分かりません セグメンテーションエラーとかコアダンプの原因とかなんとか… エロイ人教えて下さい
>>64 char s[5];
gets(s);
で5文字以上入力があった場合配列を超えてデータが書き込まれるのはわかるだろ?
ユーザーが何文字入れるのかわからないのに、
前もって決まったサイズのバッファしか用意できないのが問題。
>>64 65が答えてくれてるが、それぐらい自分で調べろ
manみりゃ書いてあるだろうが
structをglobal変数にできますか?
できます
getcがダメって書いてあるのかと思った。 getsなんて使わないから存在すら忘れてた。
>>65 thx
猫でもで勉強してるので知らなかったとです
>>70 なんだ猫って読んだこと無いが、そんなことすら説明せずにgets使ってるのか
悪いことは言わんからとっととそんなのは梵書してK&R嫁
あんなもん売ると勘違いネコ以下野郎が増殖するからなぁ。
「梵書」の使い方間違えてるよ
使い方が間違ってるの? 焚書じゃないの?
焚書だ、素で間違った(;´Д`)
俺も釣られたorz
盆所って出られないよね。
どう読んだら梵書になるんだ・・・ 「ふんしょ」な?
>42 まず、size1 と size2 が、 それぞれどんな値の時に問題が起こっているのか調査したか? していないなら、まずそこを調査スレ。 次に、 > /* > ・・・ある程度使用して、もっとたくさん必要になってから・・・ > */ の処理を無処理にして問題が出るか? 出るなら、realloc()が悪いのではなく、 無処理にした処理の中で、どこかのデータを壊している可能性が非常に高い。 最後に、realloc()の戻り値は確認したか? NULLが返ってきているにも関わらず、アクセスしていないか? ついでに、 > ptr = (char**) realloc(ptr, size2 * sizeof(char*)); /* size2個の(char*)確保 */ realloc()はエラーの時、元の領域を開放せずにNULLを返す。 元領域のポインタに上書きするなどもってのほかだ。
80 :
デフォルトの名無しさん :2005/10/19(水) 23:58:52
#include <stdio.h> main() { int i; typedef struct file{ FILE *fp; char *filename; }sFILE; sFILE fp[5]; char *name[5]={"1.txt","2.txt","3.txt","4.txt","5.txt"}; for(i=0;i<5;i++){ fp[i].fp=NULL; fp[i].filename=name[i]; } for(i=0;i<5;i++){ fp[i].fp=fopen(fp[i].filename,"w"); fclose(fp[i].fp); } } char *name[5]={"1.txt","2.txt","3.txt","4.txt","5.txt"};の宣言のところでエラーになるんだけど どう直したらいいんだろう? 間違ってるのは分かるんだけどどうしたらいいかわからんよ。
*と[]の宣言時の優先順位はどっちだ?
てゆーか、エラーになりませんけど。
後置演算子は優先度が高い。
まあ、連番のファイル名程度は動作中に作成しろよ、って思うけど。
85 :
デフォルトの名無しさん :2005/10/20(木) 00:09:34
当方C++でGSLを使っておりまして、GSL_blasを使って、行列計算をしてみたのですが、 500×500の正方行列同士の積にかかる演算時間が1回当たり1.5〜1.7秒と芳しくありません。 何か問題があるのでしょうか? もし、C++でGSLを利用している方がいらっしゃいましたら、↑の試行でどれくらいの時間を要しているのでしょうか?
おいおい、優先順位云々言ってる奴、おまえら char *literals[] = { "abc", "def", "ghi", }; みたいなコード、見たこと無いのかよ。
literals is an array of pointer to character
最初に char** argv でやる人も多いっぽいからしょうがないんじゃない?
89 :
デフォルトの名無しさん :2005/10/20(木) 00:26:20
一応、知識も経験も不足している
>>81 (と
>>83 )のために解説しておく。
確かに*と[]を比較すると、[]の方が優先度が高い。
だから、char *literals[]; という宣言は、
まず、「literalsというのは配列である」というのが最初。
そして、「何の配列か?」の答えとして、「char *の配列」となる。
だから
>>80 の
char *name[5]={"1.txt","2.txt","3.txt","4.txt","5.txt"};
は、構文上は全く問題の無いコードで、
実際、コンパイルエラーにはならない。
>>89 おまえは80か?
>>80 がエラーになると言うのなら
まずそのエラーメッセージになんと書いてあるか読む。
それでわからないときでも「エラーメッセージ」くらい、書き込めよ。
92 :
デフォルトの名無しさん :2005/10/20(木) 00:39:37
こんばんは。 ちと仕事で詰まってるところがあって質問させてくれないか? ポリゴンを書くためのデータ構造体で作っているんだがどうもそれがパディングを起こしているらしく、 そのデータで描画すると表示がおかしくなるんだ。 パディングを起こさないような構造体のメンバと其れに合わせたポリゴンのフォーマットにすればうまくいく。 で、#pragma packをつかってみたら元は64だったのが56になった。でも表示は違う壊れかたをしてしまう……。 アライメントは8。linuxでgccがコンパイラ。 けど、データの内容を変えるわけにも行かず、描画のためのストリームなので決まった順序で連続してないとだめだし。 先輩に聞いたら簡単に治せるらしいんだけど……1日考えても#pragma以外の解決案がわからない……。 まとめると ・#pragma pack(1)でやると64から54になる。だが表示がpackするまえとは別の壊れかたをする ・構造体のメンバをパディングしないようにbyte数の小さい変数に変え、それにあったフォーマットにすると思ったとおり表示される。 ・描画用のストリームなので連続してないとだめ ・先輩いわく、簡単・即効で直せるらしい 何か思い当たることがあったら教えてくださいな……orz アライメントの問題なんてVCとかでオプションで解決してたんだけどやっぱりちゃんと勉強しないとだめだね…。
>>92 まず、問題になっている構造体と、
問題なく表示できる構造体の定義を晒してみろ。
95 :
92 :2005/10/20(木) 00:58:22
struct VERTES{ short_vec2 uv; int color; short_vec3 pos; }; 上だとパディングしているようでカラーをshortにして16bitで表現した struct VERTES{ short_vec2 uv; short color; short_vec3 pos; }; なら問題なく表示されます。
short_vec2とかshort_vec3ってなに?
「パディングする」って言葉の使い方するか? ってのはともかく 手動でダミーの詰め物を入れて 確実にアラインメントを揃えろって話じゃないかね。
colorがちゃんとshortで表現し切れるなら 後者の書き方ではいけない理由がわからない。
>>95 つか、intが32bitの環境なら、そもそも詰め物サイズの問題じゃなくて
下の書き方じゃないとダメじゃないの?
つ#define int short これ以外に字面はintのままshort版とバイナリイメージを同一にする術はない。
101 :
92 :2005/10/20(木) 01:14:40
>>96 説明不足すいません
short_vec2=shortのxとyがメンバの構造体
short_vec3=shortのxとyとzがメンバの構造体
です。
>>97 posのあとに2byte(short)のデータをいれて8バイトで切れるようにしたら表示されたのですが
なぜ連続したデータなのにshortが無視されるのか解らず……先輩も無視してくれる保証がないならだめ、と。
>>98 表現しきれないので……orz
それに32bitでやれるらしく・・・うーん。
其れとより正確に書くと
struct VERTES{
short_vec2 uv1;
int color1;
short_vec3 pos1;
short_vec2 uv2;
int color2;
short_vec3 pos2;
short_vec2 uv3;
int color3;
short_vec3 pos3;
short_vec2 uv4;
int color4;
short_vec3 pos4;
};
という風に構造体一つに4つの頂点のデータが入ってます・・・。
で、最終的に希望しているバイナリの配置は? uv1:2+2 color1:4 pos1:2+2+2 dummy:2 uv2:2+2 ... て感じ?
103 :
92 :2005/10/20(木) 01:28:09
>>102 うーん、描画の関数的にそのダミーが無視されるのかどうか……
それこそ、使ってる関数調べなきゃあいけないんですけど全然書いてねぇっす……。
それについてはもっぺん調べてみます。
でも先輩の口ぶりから察すると連続したデータに出来るとかあるいは無視できるような指示が出来るのかと…。
うーん、俺の察しがそもそも勘違いなのじゃorz
104 :
80 :2005/10/20(木) 01:28:55
さっきのやつは問題なく動作したね。激しく勘違いだったみたい。 んで今度は #include <stdio.h> main() { int i; typedef struct file{ FILE *fp; char *filename; }sFILE; sFILE fp[5]; for(i=0;i<5;i++){ fp[i].fp=NULL; sprintf(fp[i].filename,"file(%d).txt",i); } for(i=0;i<5;i++){ fp[i].fp=fopen(fp[i].filename,"w"); fclose(fp[i].fp); } } こんな感じにsprintfで名前を取ってきたいんだけど、コンパイルは通るんだけど実行するとエラーになります。 お願いします。
105 :
デフォルトの名無しさん :2005/10/20(木) 01:29:09
話しの流れぶち壊し&スレ違いかも知れないけどとりあえず質問 大学でプログラミング演習の講義があるんだけど その講義で決まった教科書がないわけ で、先生が「何でもいいから参考書を買え」 言ったから買おうと思ったんだが どれがいいか分からないからアドバイスくれないか? ちなみにまだ始めて1ヶ月未満のド初心者です
参考図書スレ池
>>92 必要としているデータがパディングが必要なのかどうかがわからんとどうしようもないな。
パディングされてはいけないのなら__attribute__((packed))使えばいいだろう。
各頂点データが8bytesの境界に揃っていないといけないのなら、頂点一つ分の構造体を作って、
それに__attribute__((aligned (8)))を指定すればいけるか?
あと、変数自体が8bytesアラインされていないといけないという可能性もあるが、
その場合も__attribute__でなんとかなったと思うが。
109 :
80 :2005/10/20(木) 01:48:52
>>108 勉強不足なのは分かってるんだがどうにも納得いかなくて落ち着かないんだ
どうしたらこれがうまくいくのか教えてクレヨン
>>104 sFILE.filename には何文字入ると思う?
111 :
92 :2005/10/20(木) 02:09:12
>>107 うーん。頂点一つがshort*2、32bit*1,short*3なんで14バイト
……これに2バイトいれると思ったとおり読み込まれるんで16バイトずつよみこまれてるみたい……。
__attribute__((packed))は#pragma packとおなじでなぜか壊れる。
色々調べたり聞いた情報をまとめるとおっしゃられるとおり、__attribute__をつかって((aligned (16)))で宣言して頂点4つを
一つの構造体に宣言するんじゃなく、一つの頂点のデータにして4つ配列にして先頭アドレス渡してみようって感じになりました。
とりあえず明日試してみます。
答えてくださった皆さん、ありがとうございましたm(__)m
113 :
104 :2005/10/20(木) 02:42:08
#include <stdio.h> typedef struct file{ FILE *fp; char *filename; }sFILE; main() { int i; sFILE fp[5]; char name[5][255]; for(i=0;i<5;i++){ fp[i].fp=NULL; sprintf(name[i],"file(%d).txt",i); fp[i].filename=name[i]; } for(i=0;i<5;i++){ fp[i].fp=fopen(fp[i].filename,"w"); fclose(fp[i].fp); } } 俺がんばってみたよ。 fp[i].filenameは、char型のアドレスを持てるだけだから直接文字列入れようとしちゃダメだったんだね てかほんとにこれでいいのかな?
115 :
104 :2005/10/20(木) 02:54:05
>>114 全部sprintfでファイル名つけるんじゃなくて
fp[i].filename="1.txt";
みたいにしたいところもあるから?
ていうか今度は
char name[255];
name="1.txt";
ってやるとコンパイル通らないのが何でかわからないよ
教えてほしいよ
>113 いまこそmallocをつかうときだ
117 :
デフォルトの名無しさん :2005/10/20(木) 02:56:06
だれかホントお願いします。アセンブラ?らしいんですけど・・・ [8050h] ← [8051h] + [8052h] を計算し、符号付2進数加算としてのオーバーフローを判定する。 (オーバーフローのとき Cy ← 1、オーバーフローでないとき Cy ← 0 とする) オーバーフローの判定方法を付け加えること。
>115 name[0]='1'; name[1]='.'; name[2]='t'; name[3]='x'; name[4]='t'; name[5]='\0'; もしくは strcpy(name,"1.txt"); or sprintf(name,"1.txt");
120 :
117 :2005/10/20(木) 03:00:10
121 :
104 :2005/10/20(木) 03:11:53
お前らついにやりたいことができたよ レスくれた人ありがとねありがとね #include <stdio.h> typedef struct file{ FILE *fp; char name[255]; }sFILE; main() { int i; sFILE fp[10]; char *buf[5]={"moe.txt","vip.txt","zone.txt","ten.txt","neet.txt"}; for(i=0;i<5;i++){//sprintで連番 fp[i].fp=NULL; sprintf(fp[i].name,"file(%d).txt",i); } for(i=0;i<5;i++)//自分で適当に名前付け strcpy(fp[5+i].name,buf[i]); for(i=0;i<10;i++){ fp[i].fp=fopen(fp[i].name,"w"); fclose(fp[i].fp); } }
ちなみに stdio.h で FILENAME_MAX というのが定義される(はず)。 typedef struct file{ FILE *fp; char name[FILENAME_MAX]; }sFILE;
123 :
104 :2005/10/20(木) 03:35:51
>>122 FILENAME_MAX見てみたら260260260とかアフォみたいに大きいから使うのやめとくよ。。
>>115 で、なんで配列に文字列リテラルを代入できないか分かってる?
Cで代入ができるのは、ポインタを含む基本型と構造体のみ。
126 :
115 :2005/10/20(木) 04:11:11
>>124 なんでだろう・・・
>>118 の人が書いてるみたいに配列の要素1個に対して1文字しか入らないのは分かるけど
char a[15];
a="aaaaa";
ってやっちゃえば入るもんだと思ってたんだけどね・・。
でも考えて見ると
a=のaって配列の先頭アドレス指してるんだから入れれなくて当然なのかな?
でもchar a[15]="aaaaaa";ってやると入れれちゃうのはなんで・・?
代入と初期化は違う。 で、初期化にリテラルを使う形式は なにか別の表記法の代わりと書いてなかったかね。
128 :
デフォルトの名無しさん :2005/10/20(木) 09:16:17
フリーで使えるプリプロセッサ単体って無いの? (VC++はないのでオプションは使えないです・・・)
>>126 > でもchar a[15]="aaaaaa";ってやると入れれちゃうのはなんで・・?
それは、
char a[15] = { 'a','a','a','a','a','a','\0' };
の略記だから。
皆、よっぽどヒマなんだろうけど
>>126 みたいなの相手にしてると
こんなのばっかり集まって来るんで
適当に放置汁。
131 :
教えてください :2005/10/20(木) 11:52:46
問題 データの個数nとデータa1,a2.....anの値をファイルdate1.dから読みこみ、データと平均値の標準偏差を計算し結果をファイルdate2.dに出力するプログラムを作りなさい。 10個のデータは適当な数字を入れなさい。
宿題スレへ。
>>131 宿題は宿題スレへ。
ソフト作成依頼ならフリーソフトリクエストスレへ。
その他必要なら初心者スレなどへ。
>>128 殆どのコンパイラにプリプロセッサは付いているはずだが?
例えばborland bccにはcpp32がある。
135 :
デフォルトの名無しさん :2005/10/20(木) 19:12:29
標準入力から入力された文字列をポインタbufferが指すメモリ領域に保存し,その文字列中のアルファベット小文字を大文字に変換して、 ポインタresultが指すメモリ領域にコピーするプログラムをつっくたのですが、エラーが出てしまうのですがどこが間違ってるのか教えてください!! #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define BUFFER_SIZE 100 void capitalizeCopy(char*, char*); int main(void) { char *buffer, *result; buffer = (*char)malloc(sizeof(char)); result = (*char)malloc(sizeof(char)); printf("input string: "); fgets(buffer, BUFFER_SIZE, stdin); capitalizeCopy(result, buffer); printf("buffer: %s", buffer); printf("result: %s", result); exit(0); } void capitalizeCopy(char *dest, char *src) { while (src != '\0') if (islower(*src)) { *dest = *src - 32; } else { *dest = *src; } src++; } }
>>135 エラーの内容と場所くらい書けないのか?このボケは
全角のアスタリスクがお茶目ね
>>136 >どこが間違ってるのか教えてください!!
場所も訊いてるじゃないか。
全角のアスタリスク mallocするサイズがcharの1文字分のみ while (src != '\0')アドレスと比較してどうする! src++; destは++しなくていいのか?
定数の定義にconst修飾子ではなく#defineを使う理由はありますか。 constの方が型を明示できるし、constのキーワードだけで定数と想像がつきやすいので ベターと思うのですが。
つーか、質問する奴ら最初に
>>1 読めよ。
毎回毎回似たようなやりとりで飽きてきたぞ。
>>141 #defineの利点
・#defineで文字列を定義した場合だと連結ができる
・#defineで定義した定数が未使用の場合はメモリ確保されない(#defineは単なる置換だから)
constの利点
・型チェックをしてくれる
・複数箇所で定数を参照する場合、#defineに比べてメモリ節約になるかも
>>141 constに代入してもコンパイルエラーにならないことがある。
#define だと配列のサイズに直接指定できるって話が出ないのは何でじゃ?
>>145 みんなC++のつもりで話をしているに違いない。
そんな当たり前すぎることには誰も興味を持ってないから
オレは、むしろenumがいいと思う
>>128 プリプロセッサ単体のコードなら見たことあるよ
>>128 Visual C++ ToolkitとかBorland C++みたいな無料のコンパイラを手に入れてその付属を使うしかないと思う。
プリプロセッサ作ってみたら?
プリンセスプロセッサ?
アリスプロセッサ 略してアリ(ry
ジャンクなのだわ
#define SUIGINTOU JUNK
C言語初心者なのですが、とりあえずコンソールアプリケーションで何か作ってみたいと思うんですが、 とりあえず何を作るのがいいでしょうか? なにか、こういうプログラムを作るといった目標を作ったほうがいいかなと思いまして。
Brainfuckインタプリタ
Rogue
162 :
157 :2005/10/21(金) 18:36:30
>>158 作ってみたいのですが、ソースコード何行くらいになるんでしょうか?
>>159 ググって見ました。
これはなんか面白そうですね!
Cの学習に向いてそうです。
>>160 ググって見ました!
・・・・・・・なんだか、これは、、、、、すごそうですね。
C言語なんですか?
>>161 ググって見ました。
これも面白そうです。作ってみようと思います。
163 :
デフォルトの名無しさん :2005/10/21(金) 18:37:32
(続)関数ポインタ編です。 void *な配列と関数は無敵ですよね? なんでも有るがままに受け入れます。 但し下記プログラム中の: pfary=(void(*((*)[2]))())mutekiVPA[0]; ppf=(void (**)())mutekiVPA[1]; このキャストがなんとも…。 何かスッキリした方法あればご教示願います。 #include <stdio.h> void tigersfun(){printf("タイガーズが勝ったら,金なんかどうでもエエんや!\n");} void murakami(){printf("世の中金やで、タイガーズで一儲けせんかい!\n");} void kiyohara(){ printf("ワイは河内生まれや、最後はタイガーズで一花咲かせたらんかい!\n"); } void nabeketu(){ printf("阪神とかロッテとか、これまで「極端に」弱いところが勝ちおって…\n"); } void (*(*paryf())[2])(){//関数ポインタ配列を返す配列関数 static void (*pfary[2])()={tigersfun,murakami}; return &pfary; } void (**ppaf())(){//関数ポインタ配列を返すダブルポインタ関数 static void (*pfary[2])()={kiyohara,nabeketu}; return pfary; }
164 :
デフォルトの名無しさん :2005/10/21(金) 18:38:24
int main(void){ int i; void (*((*pfary)[2])) (); void (**ppf)(); void * mutekiVPA[2];//無敵のvoidポインタ配列 void (*poi_zatuon)();//無敵のvoid関数ポインタ //無敵のvoidポインタ配列と関数を使う。 mutekiVPA[0]=paryf(); mutekiVPA[1]=ppaf(); pfary=(void(*((*)[2]))())mutekiVPA[0]; ppf=(void (**)())mutekiVPA[1]; for(i=0;i<2;i++){ poi_zatuon=(*pfary)[i]; poi_zatuon(); poi_zatuon=ppf[i]; poi_zatuon(); } return 0; }
typedef すれば?
Cはそのキャストいらないんじゃないの
167 :
デフォルトの名無しさん :2005/10/21(金) 21:45:20
scanf文に\nはいるんですか?
区切り文字に改行を明示したいんなら使うんじゃない?
scanfの書式指定の\nはホワイトスペースを読み飛ばす指定。すなわち " " と同じ意味。
>>163 void *と関数へのポインタとの相互には暗黙の変換はない。(相互のキャストすらできなくても良かった気がする)
つまりvoid *はオブジェクトへのポインタに対してのみ無敵。
171 :
デフォルトの名無しさん :2005/10/21(金) 22:54:39
K&R 記述とANSI規格の記述の差分がわかるようなサイトなど はご存知でしょうか? K&Rの記法はなぜいけないのでしょうか?
誰がいけないなんて言ってるんだ
173 :
daisuke0475 :2005/10/21(金) 22:59:48
はじめますて 私はC言語初めてでまだほとんどわかりません javaはある程度わかるのですがCはまるっきりわかりません ちなみに私はゲームを作るのにCを使おうと思っています なのでどなたかCのコマンド(JAVAでいうタグ)辞典みたいなもの知りませんか? もしも知っている方がいたら教えてください
>>173 そのままずっとわからないでいて下さい。
学校でやっている問題なのですが、考えれば考えるほど分からなくなって ここに助けを求めにきますた…_| ̄|○ 問題は、「30人のテストの得点データを読み込む。得点は0点以上10点以下。 各点数の人数を求め、その人数を点数ごとに*の数で表しなさい。 また、最も人数の多い得点と、最も人数の少ない得点を示しなさい。」というものです。 一応やりかけのCを張ります。 #include<stdio.h> int main(void) { int i,j; int tensu[30]; int tmp[11] = {0}; for(i = 0;i < 30; i++){ printf("%d人目:",i + 1); scanf("%d", &tensu[i]); } for(i = 10; i > 0; i--){ printf("%d", i); for(j = 0; j < tmp[i]; j++){ putchar('*'); putchar('\n'); } } return(0); } なんとなく流れは分かるんですが、それを形にできないのです…_| ̄|○ 超初心者で申し訳ないんですが、教えていただけるとありがたいです(´・ω・`)
>>173 のどこが面白いのか判らない。年とったせいか?
for(i=0; i<30; i++) tmp[tensu[i]] ++;
180 :
デフォルトの名無しさん :2005/10/21(金) 23:19:35
>172 その発言いけないというは取り消します。
K&Rは第二版からANSI対応だったと思ったが。
183 :
167 :2005/10/22(土) 00:21:36
185 :
デフォルトの名無しさん :2005/10/22(土) 03:29:25
% ./a.out < data1.txt Average score : 62.188 ID : 1234001 , score : 48 (-14.19) , grade : D ID : 1234002 , score : 99 (+36.81) , grade : A ID : 1234003 , score : 64 ( +1.81) , grade : C ID : 1234004 , score : 79 (+16.81) , grade : B ID : 1234005 , score : 53 ( -9.19) , grade : C ID : 1234006 , score : 14 (-48.19) , grade : F ID : 1234007 , score : 63 ( +0.81) , grade : C ID : 1234008 , score : 92 (+29.81) , grade : A ID : 1234009 , score : 71 ( +8.81) , grade : B ID : 1234010 , score : 58 ( -4.19) , grade : C ID : 1234011 , score : 85 (+22.81) , grade : A ID : 1234012 , score : 77 (+14.81) , grade : B ID : 1234013 , score : 60 ( -2.19) , grade : C ID : 1234014 , score : 52 (-10.19) , grade : C ID : 1234015 , score : 11 (-51.19) , grade : F ID : 1234016 , score : 69 ( +6.81) , grade : B grade : F --> 2 students grade : D --> 1 students grade : C --> 6 students grade : B --> 4 students grade : A --> 3 students Highest score : 99 Lowest score : 11
daisuke0475 の検索結果 約 85 件
188 :
デフォルトの名無しさん :2005/10/22(土) 15:44:02
>164 >166 ホントだ!キャスト無しで動きますねぇ。 >170 >void*と関数へのポインタとの相互には暗黙の変換はない。 先生! mutekiVPA[0]=(void *)paryf(); mutekiVPA[1]=(void *)ppaf(); pfary=(void(*((*)[2]))())mutekiVPA[0]; ppf=(void (**)())mutekiVPA[1]; こんな煩わしいキャスト無しでスッキリと mutekiVPA[0]=paryf(); mutekiVPA[1]=ppaf(); pfary=mutekiVPA[0]; ppf=mutekiVPA[1]; こうなことが出来ること自体、(void *)が無敵の証では ないでしょうか?
188のプログラムはvoid*でしめられ変数名が型をものがたる様になった。 最後にはvoid*にはvoid**,void***も格納されるようになった。 伝説のプログラムの誕生である。
191 :
デフォルトの名無しさん :2005/10/22(土) 16:52:39
またさらに、初歩的なことで先生方諸兄姉のお知恵を 拝借したいのですが、安全にメモリを解放したい と考えて下記のようなコードを考えました。 #include <stdio.h> #include <stdlib.h> int main (void){ int * p; //mallocを使用して動的にメモリを確保する。 if(!(p=(int *)malloc(sizeof(int)*1))){ printf("メモリ確保失敗!\n"); exit(EXIT_FAILURE); } //これを安全にfree()したい。 #ifndef FREE free(p); printf("メモリは解放されました。\n"); #endif #define FREE //もう一度誤ってfree()を呼ぼうとするが、 #ifndef FREE free(p); printf("メモリは解放されました。\n"); #endif #define FREE //呼ばれない。 return 0; }
192 :
デフォルトの名無しさん :2005/10/22(土) 16:53:36
どうも #ifndef FREE free(p); #endif #define FREE これって結構煩わしいですよね?そこでこの部分を そっくり #define SAFEFREE(p)というような形でマクロ化したい のですがどうしたら良いのか?分かりません。 このマクロ定義方法をご教示下さい。
すみません、質問おねがいします。 mallocで確保した二次元配列outに対して、 for( i = 0 ; i < max1 ; i++) { for(j = 0 ; j < max2 ; j++) { printf("%c\n",out[max1][max2]); } if(out[max1] == NULL) exit(0); } 以上のようにした時に、 内側にあるfor文をコメントアウトすると下部のif文は成り立たず、exitしませんでした。 しかし、コメントアウトを外すとif文が成り立ち、exitが呼び出されてしまいました。 これはprintfによってメモリにアクセスした際に何かを壊してしまっているのでしょうか?
194 :
デフォルトの名無しさん :2005/10/22(土) 16:56:54
while (なんか) { if (なんか) { break; }} この場合でbreakまで行ったらどうなるの? while文も抜け出す?
>free() はポインタ ptr が指すメモリ空間を解放する。 >ptr が NULL の場合には、なんの動作も行われない。 これって処理系依存なのかな? 規格だと思ってたんだけど? >191 は初期化でNULLを入れて、後freeしたらNULLを入れて、ってやればそれですむ
>>193 for( i = 0 ; i < max1 ; i++)
{
if(out[max1] == NULL)
exit(0);
for(j = 0 ; j < max2 ; j++)
{
printf("%c\n",out[max1][max2]);
}
if(out[max1] == NULL)
exit(0);
}
こう書いて2度目の分岐でexitしたならば貴方の推測は正しいのでしょう。
以上。
198 :
デフォルトの名無しさん :2005/10/22(土) 17:15:17
> 186 ありがとうございます。 ANSI の書き方はこうで、K&R の書き方はこうでの例が詳しく書い ているものがあると更に助かります。 (K&RからANSIへ変更しての移植作業で時間掛けずにを修正を簡単に したい。見直したい。思いがあります。)
>>193 なんかout[max1][max2]とかout[max1]って、いかにも確保した領域からはみ出たとこ参照してそうだね。
mallocをどうやったのか知らんけど。
おそらくout[i][j]とかの間違い?
>>194 while文「も」、というかwhile文「を」抜け出す。
ifはbreakと関係ないよ。
200 :
194 :2005/10/22(土) 18:26:56
for (なんか) { for (なんか) { break; }} じゃあこれはどうなんでしょう? breakに来たとき、「外側のforも抜け出す」か「内側のforのループを 抜け出して外側のforへ行く。終わらせるためにはbreakがもう一つ必要」か。
それくらい自分で試せよ
202 :
デフォルトの名無しさん :2005/10/22(土) 19:16:52
#ifndef FREE free(p); #endif #define FREE 激わろたwwww
203 :
193 :2005/10/22(土) 19:32:48
ダブルポインタを引数にしていたのですが、 その際に扱いを間違えていたようでした。 お手数かけてすみません。
Cのプログラムでものすごい大きな整数を扱いたいのですが、 どのようにするのが一般的でしょうか。 250ビットくらいの整数を扱いたいと思っています。
そこらに転がっている多倍長演算ライブラリを使う
>>191 そんなに安全にメモリを解放したければC++使え。
シングルトン
ポインタへのポインタってダブルポインタって言うのは定着してるの? ここで初めて聞いたんだが
じゃぁポインタのポインタのポインタはとりっぽん?
ぬるぽんw
>>208 新卒の就職希望者がよくそういうのを耳にする。
どうやら専門学校辺りで言うらしい。
ちなみに、「ダブルポインタはばっちりですけどトリプルポインタは自信がありません」と
言っていた香具師は、ポインタをまともに理解していなかった。
212 :
デフォルトの名無しさん :2005/10/22(土) 23:01:32
ダブルでもトリプルでも良いがそんな事はポインタの本質には全く関係ないな
ダブルポインタでググると224しかヒットしない。 "double pointer"だと16,300ヒットする。
>>213 そりゃdouble*の方が引っかかるからね。
**aa; *a[0]; *a[]; 上記の違いを述べよ
「ダブルポインタはばっちりですけどトリプルポインタは自信がありません」 なんて言葉が出てくる時点で、ポインタをちゃんと理解できてないと分かるね。
ダブルポインタとかトリプルポインタとかぬかす香具師は、 「int ****」とか「int ****************」とかは何て呼ぶつもりなんだろうね?
1:single, 2:double, 3:triple, 4:quadruple, 5:quintuple, 6:sextuple, 7:septuple, 8:octuple, 9:nonuple, 10:decuple
クアドループルポインタとヘキサデキュープルポインタ。
こういうので4以上は(場合によっては2や3以上も)、普通multipleっていうけどな。 英語だと ** は double pointer ではなく pointer to pointer。 **************** なんかは pointer with 16 stars とか 16 dereferences あたりかな? 4つくらいなら頑張って「pointer-to-pointer-to-pointer-to-pointer-to-int」とか言うかもw
その議論に何か意味があるのか?
意味がないと思うならスルーして他の話題を振るように。
224 :
デフォルトの名無しさん :2005/10/23(日) 02:37:45
Wallオプションで、 警告:関数’exit’の暗黙の宣言 なるエラーが出るのですが、これは何ですか?
>>224 とりあえずstdlib.hインクルード
226 :
デフォルトの名無しさん :2005/10/23(日) 02:49:41
>>225 直りました^^ありがとうございます。
exit()関数は、stdlib.hと ¢(..)メモ しておきます。
227 :
デフォルトの名無しさん :2005/10/23(日) 03:12:06
8byteのバイナリの文字を、一意にハッシングする方法って どうするのですか?
フリーのbcc5.5で警告の表示を抑えるために #pragma warning(disable:8065) としても、プロトタイプ宣言がないという警告が全部表示されてしまいます。 ソースの一部分だけを抑制したいので、オプションの-w-8065にはしたくないのです。 (実際には他にも8004と8008も抑制したい部分があります) どうしたら警告を表示させないようにできるでしょうか?
229 :
デフォルトの名無しさん :2005/10/23(日) 03:20:20
>>227 標準Cにはそのような関数はありません
自作してください
>>228 その pragma は VC++ のでは。
>>230 なんと、そうなのですか。
bccで同様のこと(部分的に警告抑制)をするのは無理ということでしょうか?
うーん。 bcc のマニュアルの #pragma のところを見るか、 Borland C++ スレで聞いてくれ。
>>171 でもK&R第1版の頃、つまりANSI規格化前の書式で書かれたソースは
読みにくいぞ。ANSI 以降に覚えたヤツにとっては。
234 :
228 :2005/10/23(日) 06:18:36
>>232 どうやらBCCに付属してきたヘルプには、プリプロセッサのディレクティブの説明は見当たらないので、専用のスレで聞いてみたいと思います。
レスどうもでした。
235 :
228 :2005/10/23(日) 06:27:14
>>232 タダで使えるBorland C++ Part4
をROMっていたら#pragma optionというのを見かけたので、ためしに
#pragma option -w-8065
としたらできました!
コマンドラインオプションをそのままソース中に書く感じみたいです。
助言のおかげで助かりました。ありがとうございます。
恥ずかしながらpragmaは標準みたいなものだと勘違いしていたので、
>>230 のレスにも感謝です。
236 :
デフォルトの名無しさん :2005/10/23(日) 07:10:57
printfで 0x05のように16進数で2桁まで表示するには引数をどう指定したらいいですか? $#xでは 0x5になってしまって困ってます
%#xの間違いでした
自己解決しましたorz
%#02xでいいと思ってたときが漏れにもありました。 なんで0のときに0xがつかないんでしょうか。
>x と X 変換の場合、数値が 0 でないときには文字列 `0x' >(X 変換の場合には `0X') が前に付与される。
241 :
239 :2005/10/23(日) 10:27:03
>>240 いやさ、0のときにカラム数が変わってしまうのが不便だって話なんだが。
基本は、自分で0xつける方向で。
そんな瑣末なことは疑問に思ったこともないな。
244 :
デフォルトの名無しさん :2005/10/23(日) 13:13:49
>195 御意。 ただ、初期化のNULLを入れっぱなしで、 後それを使えますかね?
246 :
デフォルトの名無しさん :2005/10/23(日) 13:24:38
>191 >244 例えばこんなマクロは考えられますよね? #define SAFEFREE(n) free(n); \ n = NULL とか #define SAFEPTR(type,n) type __temp; \ type *n; \ n =&__temp; \ *n=(type)NULL こんなのとか。 後者の場合 SAFEPTR(int,p); でいきなり *p=15; 数値を代入出来ます。 私が言いたいことはそうではなくて、むしろ だれかが激しくWされた #ifndef FREE free(p); printf("メモリは解放されました。\n"); #endif #define FREE これ自体をマクロ化する方法は無いでしょうか? と問うておる訳です。マクロのネストは可能 なんでしょうかねぇ。
>>246 酔っているのか?
もう一回聞きたいことをまとめてみろ
自分でまともにメモリー管理が出来ないんならCやめれば? マクロなんかで解決しようとしている時点で終わってるよ。
>>246 はいはい。Javaが貴方を待っているよ。
void f() { char* p = malloc(SIZE); if (foo()) { SAFEFREE(p); return; } else { bar(); } SAFEFREE(p); }
たとえマクロに出来たとしても、以下のような場合はどうするつもりなんだろう? そもそも、freeされたかどうかの情報をプログラム中にグローバルで静的に 持とうという考えが間違ってる気がする。 if(なんかの条件){ #ifndef FREE free(p); printf("メモリは解放されました。\n"); #endif #define FREE } // ここでfreeを呼ぼうとするが #ifndef FREE free(p); printf("メモリは解放されました。\n"); #endif #define FREE //呼ばれない。
253 :
デフォルトの名無しさん :2005/10/23(日) 13:55:39
あーあ、安直なこと書かなきゃいいのに…
int i; int *p = NULL; for (i = 1; i <= 3; ++i) { switch (i) { case 4: #ifndef FREE free(p); printf("memory released.\n"); #endif #define FREE break; case 2: *p = 5; break; case 1: p = malloc(sizeof(int)); break; case 3: printf("%d\n", *p); #ifndef FREE free(p); printf("memory released.\n"); #endif #define FREE break; } }
学生番号とその学生の試験の成績のデータ(data1.txt) がある (これはファイルからリダイレクトで読み込む) 平均点 学生毎の学生番号、得点、平均との差、評価(A、B、C、D、F) ・平均との差の符合付き表現は 「 %+6.2f 」 の書式を使えばできる。 ・点数から評価への変換は、 第一回演習の問題3の、 関数evalが再利用出来る 各評価(A、B、C、D、F)の人数 最低得点と最高得点 % ./a.out < data1.txt Average score : 62.188 ID : 1234001 , score : 48 (-14.19) , grade : D ID : 1234002 , score : 99 (+36.81) , grade : A ID : 1234003 , score : 64 ( +1.81) , grade : C ID : 1234004 , score : 79 (+16.81) , grade : B ID : 1234016 , score : 69 ( +6.81) , grade : B grade : F --> 2 students grade : D --> 1 students grade : C --> 6 students grade : B --> 4 students grade : A --> 3 students Highest score : 99 Lowest score : 11
はぁ?
Cの魅力って何?
UNIXのそーすがよめること
261 :
デフォルトの名無しさん :2005/10/23(日) 18:46:32
>252 マクロはコードを制御出来ますよね。即ち無敵です。 そのマクロ自体を制御するにはどうしたら良いのか? 一連の発言における目的はかなり射程が大きいのです。 例えば #define xxx #define yyy zzz とか、単なるコード上の文字置換えであれば可能ですよね? それが出来ないのです。 では、もっとプリミティブなマクロです。 #include <stdio.h> #define KOE(n) zatuon##n () void zatuon1(){ printf("虎キチ:タイガーズが勝ったら,金なんかどうでもエエんや!\n"); } void zatuon2(){ printf("村上:世の中金やで、タイガーズで一儲けせんかい!\n"); } void zatuon3(){ printf("キヨ:ワイは河内生まれや、最後はタイガーズで一花咲かせたらんかい!\n"); } void zatuon4(){ printf("ナベケツ:阪神とかロッテとか普段は弱いところが勝ちおって…\n"); }
262 :
デフォルトの名無しさん :2005/10/23(日) 18:47:23
int main(void){ #if 1 KOE(1); KOE(2); KOE(3); KOE(4); //これは動くが意味が無い。 #else for(i=1;i<=4;i++) KOE(i); //と関数配列っぽくやってみたが動かない! #endif return 0; } この関数マクロ配列が動く方法あればご教示下さい。 #elseを外せってのは無しで…
関数テーブルにすればいいだけ。 阿呆すぎ。
そういう用途ならboost preprocessor使え。 まぁ自分なら素直に関数テーブル使うけど。
> #define xxx #define yyy zzz > とか、単なるコード上の文字置換えであれば可能ですよね? > それが出来ないのです。 そんなコンパイラ捨ててしまえ。
>>261 > マクロはコードを制御出来ますよね。即ち無敵です。
こんなこといっている奴に未来はない。
>>265 defineディレクティブの中にプリプロセッサ命令を入れることは出来ないよ。
>>261 射程が大きいのはいいことだが、
せめて定石くらいはマスターした方がいいかと。
269 :
質問です。 :2005/10/23(日) 19:15:01
JPEGを読み込んでRGBの値を得るプログラムを教えてください。
Photoshop。
271 :
デフォルトの名無しさん :2005/10/23(日) 19:27:45
Cのマクロは単なトークン置き換え処理 コードそのものを制御したいならlispでも使いなさい
libjpeg
>>262 はぁ?プリプロセッサの役割わかってから出直してきてください
>>262 デバグでプリプロセッサ使えるようになってからにしろ
無敵厨ウザス。幼稚園児なみの理屈も無いし。もうレスもやめれ。
>>261 無敵ではなく無駄とか無謀とか無策(ry
278 :
質問です。 :2005/10/23(日) 21:45:57
libjpeg調べてみます。
>>246 とにかくマクロ置き換えの結果に再びプリプロセッサディレクティブが現れても、
プリプロセッサはそいつを認識しない。だからお前が考えていることはできない。
280 :
デフォルトの名無しさん :2005/10/23(日) 22:53:27
>if(top == middle + 1) > BSearch(key, base, middle, top + 1); > else この部分を削除。main()から呼ぶときにデータの個数をtopに渡すようにする。 あと再帰からの戻り値を上に返してないし、これ動作確認とってないんじゃないか?
282 :
デフォルトの名無しさん :2005/10/23(日) 23:32:49
これなんだけど、何処がおかしいんでしょうか? #include<stdio.h> #define KAZU 10 void bubble_sort(int *a[], int n) { int i, j, t; for (i = 0; i < n - 1; i++) for (j = n - 1; j > i; j --) if (*a[j-1] > *a[j]) { t = *a[j]; *a[j] = *a[j-1]; *a[j-1] = t; } } int main() { int i,k; int va[10]={1,43,42,44,14,2,46,44,5,34}; int vi = 10; for(i=0;i<10;i++){ k = va[i]; printf("%d\n",k); }; bubble_sort(&va[0],vi); puts("sort"); for(i=0;i<10;i++){ k = va[i]; printf("%d\n",k); }; return 0; } 警告 W8075 bubble.c 25: 問題のあるポインタの変換(関数 main )
> if ((temp = strcmp(key, base[middle])) == 0) > return (middle); へんだけど、この部分だけたどって返されているのかとおもた?
284 :
デフォルトの名無しさん :2005/10/23(日) 23:42:34
void bubble_sort(int a[], int n) こう書くと、パラメータ 'a' は int * 型として定義されている と覚えておいて良いでしょうか?
285 :
デフォルトの名無しさん :2005/10/23(日) 23:44:55
引数に配列定義すると、配列のアドレスが入るんですか?^^
288 :
285 :2005/10/23(日) 23:58:38
ぬるぽ^^
291 :
デフォルトの名無しさん :2005/10/24(月) 00:11:57
>>289 配列とポインタでの参照は相互に変換可能だけど配列を渡したのだから配列と見るべき
と、宗教論争に持ち込んでみる
ポインタスレでやれ
294 :
285 :2005/10/24(月) 00:22:51
質問です。 char *a[]と宣言したら、char型ポインタを要素として持つ配列 char (*a)[]と宣言したら、char型配列へのポインタ という意味でしょうか?
わかりました
300 :
デフォルトの名無しさん :2005/10/24(月) 03:28:25
すみませんファイルシークについての質問です。 現在のファイル位置表示子の位置(指定された位置からのオフセットを返すのが望ましい)を調べるには、 どのような関数が提供されていますか?
ftell(FILE *stream); がそれっぽい関数ですね・・お騒がせしました
アドレスポインタにいくつか数字を足したい場合には int i=3; n=*addres+i; という形で良いのでしょうか? nに加算されたアドレスが入るはずと思い↑は書きました。
>>302 つ[初心者歓迎スレ]
つ[初心者質問スレ]
>302 やりたいこともわからんし、nの型もわからん
address のつづりも違う
>>302 ポインタに数値を加える = 参照メモリアドレスを変更する
307 :
デフォルトの名無しさん :2005/10/24(月) 13:08:16
libjpegを調べても、よく分かりません。
308 :
デフォルトの名無しさん :2005/10/24(月) 15:25:54
問題:2次方程式ax^2+bx+c=0(a≠0)の実数解の個数を返す関数int solve(double a,double b, double c)を作れ。 注:関数内での方程式の解を外部変数 answer1, answer2へ代入するような関数にすること。 ってあるんだですが、どうやってプログラムを作ればいいんですか?どんなプログラムを作っていいか全くわからないのですが・・・。
宿題は宿題スレへ
>>308 > 注:関数内での方程式の解を外部変数 answer1, answer2へ代入するような関数にすること。
虚数解はどんな振る舞いをすればわからない関数。
外部変数に値を代入する関数。
そんな糞関数は作れてもここで晒す気にはなれんな。
311 :
デフォルトの名無しさん :2005/10/24(月) 15:51:34
312 :
デフォルトの名無しさん :2005/10/24(月) 15:57:11
gchar や gint のように関数のパラメータの型宣言で g のついてる型って、 どういう意味ですか。
313 :
デフォルトの名無しさん :2005/10/24(月) 15:59:07
glibで定義された型だな ANSIで定義している型は実装依存で実現できる範囲が厳格に定義されてないけど 実体を持つライブラリとしては厳格に定義したいそれで、gintとかgcharを定義した
314 :
デフォルトの名無しさん :2005/10/24(月) 16:01:17
わかりました。どうもありがとさんです。
>>310 そのための戻り値 int だろうに・・・。
_beginthreadex()の第六引数ってNULLじゃ駄目?
>>316 だめ。というよりすれ違いでここで話するのもだめ。
#include <stdio.h> #include <stdlib.h> #include <time.h> char card[13][4]; FILE *fp; int search(char c){ char a; rewind(fp); while(fscanf(fp,"%d",&a)!=EOF){ if(c==a) return 1; } return 0; } void shuffle(){ int i,j; srand((unsigned)time(NULL)); for(i=0;i<13;i++){ for(j=0;j<4;j++){ do{ card[i][j]=(((rand()%4)<<4)+((rand%13)+1)); }while(search(card[i][j]); fprintf(fp,"%d",card[i][j]); } } } main(){ fp=fopen("check","a+"); shuffle(); fclose(fp); } ======================================= Segmentation fault(core dumped) って出るんですけどどこが間違いですか?
320 :
デフォルトの名無しさん :2005/10/24(月) 21:17:52
while( search(card[i][j]) ) ; あと、出来るだけデフォルトでintの時でも値を返してください。
321 :
320 :2005/10/24(月) 21:18:55
あげちゃってごめんなさい...
>>318 Segmentation faultの直接原因は恐らくfscanf()で"%d"に対してchar *を渡していること。
しかし、それを解決したところで期待したとおりの動きになるかどうかは知らん。
アルゴリズムについても意見を求めたいなら初心者スレなどへ。
>>320 なにを指摘しているの?
2行目も意味不明だし。
324 :
デフォルトの名無しさん :2005/10/24(月) 21:49:25
fscanfwww
)が足りないだろよく見ろ氏ね
>>325 んなもんで Segmentation fault するわけねーだろよく見ろ氏ね
326てめーが氏ね酒粕
マターリしようよ氏ね
2chって本当に怖いですね。 さよなら・さよなら・・さよなら
まあ core dump以前に compile error が複数あるソース貼って聞くなよ、と。
突込みどころたくさんすぎなので、初心者スレ逝け。
デバッガの使い方くらい覚えろ。もしくはプログラム書くな。迷惑だ。
>>322 確実にへんな動作だろうな。コード見ただけで激しく凶暴な気分に…
まして fprintf(,"%d",); fscanf(,"%d",) こんな組み合わせで、
書き込んだ数値をまともに読み直せるわけもなし。
fopen(,"a+") でこんなことすんのかよ…
つか、やりたいことはおそらく、ファイルに保存を途中で挟まないで
簡単にできるので、このコード捨て。
>>326 char*に対してintアクセスしたらfaultしない?
_beginthreadexで生成したスレッドを強制終了させるにはどうすればいいのでしょうか
>>332 TerminateThread()ただし、ほぼリークするけど。
つか、強制終了させなきゃならないケースなんてそんなに無いはず。
もしその状況が頻繁に起こるなら、設計を見直すべき。
337 :
デフォルトの名無しさん :2005/10/25(火) 00:34:49
例1: charszTmpFile[_MAX_PATH]; strcpy( szTmpFile, "" ); 例2: charszTmpFile[_MAX_PATH]; szTmpFile[0] = '\0'; 例1と2は同じ動きだと思うのですが それぞれ意図するところが違うのでしょうか? それとも単に好みの問題?
338 :
デフォルトの名無しさん :2005/10/25(火) 00:36:07
例1: char szTmpFile[_MAX_PATH]; strcpy( szTmpFile, "" ); 例2: char szTmpFile[_MAX_PATH]; szTmpFile[0] = '\0';
4で割り切れるか割り切れないかの判断プログラムってどうなるかわかりますか?
if ((value % 4) == 0) { // 割り切れる } else { // 割り切れない }
i & 3==0
>>337 「好みの問題」が結論だと思う。
関数参照のオーバーヘッドが云々という人がいるかも知れないが、
この種のことが問題になる開発は希少だ。
#私は szTmpFile[0] = 0; と書くぞw
>>343 どうもありがとう。
szTmpFile[0] = 0; と書くことにします。
質問です。 ログインウィンドウを作ってみたいのですが、 外部ファイルの文字列を読み込んで比較とかできるでしょうか? もし読めたとしてもユーザ名とパス両方を比較となると難しそうです。 このようなプログラムはどのようにかかれているのでしょうか?
348 :
デフォルトの名無しさん :2005/10/25(火) 01:23:33
あれが分かりづらい人間がいったいどうやってCでコード書いてるんだろうか。
350 :
デフォルトの名無しさん :2005/10/25(火) 02:56:10
scanf関数ってなぜ悪名高いんですか?
馬鹿が使うととんでもない事になるから。
352 :
デフォルトの名無しさん :2005/10/25(火) 03:01:55
i&3ってなんなの?
353 :
デフォルトの名無しさん :2005/10/25(火) 03:03:28
>>351 そーなのか
例えばどんな・・?
恐ろしい関数だな
>>352 i & 3 == 0 なら 4 で割り切れるってこと。
typedef struct { double coef[12; int degree; } mpz_poly_t; typedef mpz_poly_t mpz_poly[1]; int main(int argC, char *args[]) { mpz_poly_t t; mpz_poly f; ・・・・ 上のプログラムで typedef mpz_poly_t mpz_poly[1];は mpz_poly_tの配列にmpz_polyという名前をつけているという意味でしょうか? typedef 構造体 名前[1];という表現は良く見かけるが、[1]とすると何か便利なことがあるのでしょうか? あと、mpz_poly f の fの型は構造体の配列へのポインタであっているでしょうか?
>何か便利なことがあるのでしょうか? 何も考えなくても参照渡しするようにできるからじゃない?
>>349 直感的には判り辛い。
「4の剰余」と「下2ビット」は
結果が同じでも意味が違う。
>>355 なにそのtypedef?初めて見たんだけど。
typedef mpz_poly_t * mpz_poly;
とは違うんか?詳しい人、漏れからも解説キボンヌ。
>>355 void mpz_poly_show_info(mpz_poly self) {
int i;
for(i = 0; i < 12; i++)
printf("%d : %f\n", self->coef[i]);
printf("%d\n", self->degree)
}
void foo(void) {
mpz_poly poly = { 0 };
poly->degree = 90;
mpz_poly_show_info(poly);
}
こんな感じで、
& とかつける必要が無くなるし、
そのまま変数定義にも使える、
というトリック。
360 :
名無し :2005/10/25(火) 10:27:34
問題です Yamada、Yoshizaki、Suzuki、Kato、Kamata、Kuwata、Maeda をポインタ配列へ登録し、イニシャルを入力するとそのイニシャルを持つ名前のみを表示するプログラムを作成しなさい なお、イニシャルの入力はmain()関数にて行い、ユーザ関数は、判別表示のみで行なうようにすること。 どなたかオチカラをm(__)m
宿題は宿題スレへ
多くの初心者って、 どうして「どんな処理をするべきか」を自分で考えないのだろうか?
そんな事を考える奴はここに来ないし
364 :
名無し :2005/10/25(火) 10:51:13
>361 すいませんでした。
>>353 間違った使い方をすると鼻から悪魔が出てくる可能性がある。
# まだ俺は見たこと無いけどな。
間違った使い方をすると、2度と立ち上がらなくなる
# 一度だけやってしまった...
ま、最近はそこまで悲惨な結果になることはないけどな。
>>366 それは、scanf()に限った話じゃなかろう
>>367 だが、初心者が一番嵌りやすい関数であることは確かだな。
可変長引数のポインタ渡しなどというCでも上位ランクの凶悪な関数だ。
getsと違って正しい使い方が存在するというのもいやらしいなw
そういうのは自分でその穴を突けてから言えよw
371 :
デフォルトの名無しさん :2005/10/25(火) 15:50:04
>>359 表記を簡潔にするためのテクニックでしたか。
親切にありがとうございます。
>>358 たぶん、
typedef mpz_poly_t * mpz_poly;
mpz_poly poly;
だと、値などを構造体へ代入する場合に、
初期化 poly = malloc(sizeof(mpz_poly_t));が必要になるのだと思う。
>>371 もちろん開放もね。
構造体の代入をする際に * が必要になるというのが
今ひとつといえば今ひとつなところか。
構造体を戻り値にできないという欠点もあるが、
これは引数を通して受け渡したので問題ないだろう。
すみません Visual C++ .net 2003のMFCアプリケーションなんですが エディタボックスに何も入力していない場合を 判断するにはどうすればよいのですか?
375 :
デフォルトの名無しさん :2005/10/25(火) 23:05:57
変数の宣言なのですが、 char buf[8]; などはよく見る光景です。 ですが例えば char *buf = "012345"; char buf1[strlen(buf)]; とbuf1を宣言しますと"[ ]には定数式を指定してください"などとエラーが発生します。 このような宣言は、Cでは認められていないのでしょうか?
C99ならOK。 それより前なら独自拡張してある処理系じゃないと駄目。
>>375 その用途だけなら、char buf1[sizeof("012345") - 1];でいける。
378 :
デフォルトの名無しさん :2005/10/25(火) 23:35:15
質問です。関数main()内で int i; int n; short hex; short char_to_hexstr(char c); /* ASCII文字を16進数2文字に変換 */ char *rindex(const char *s, int c); /* 末尾から文字列検索 */ こういう書き方があるのですが、これは何でしょうか? 関数プロトタイプをmainの中で宣言している ということなのでしょうか?
379 :
デフォルトの名無しさん :2005/10/25(火) 23:38:09
そうみたい
>>378 古いスタイル(K&R)に馴れた人がよくそう書くので要注意。
381 :
デフォルトの名無しさん :2005/10/25(火) 23:40:21
いつまで「C99なら〜」とかいい続けにゃならんのだろうな もう6年も経つのに
>>382 まだ基準がANSIだからな・・・・・・
普及する前に次の規格の策定始めるからなぁ。 どうにかならんのか。
VC、BCBなどWindowsの主要なコンパイラでC99は使えません 使えるようになる予定もございません
Cは枯れているのが売りの一つなのにわざわざ新しい規格を作る意味がわからん
389 :
デフォルトの名無しさん :2005/10/26(水) 17:10:53
Cの変数型についてです。 Cで認められるのはlong doubleの80bitなのですが、これよりも大きな値を扱いたい場合どのような 変数を宣言すればよいでしょうか 場合によってはwindows.hを含んでも構いませんので..
>>389 整数ならまだ(unsigned )long long intがある。
(今のところ大抵の処理系では64bitになっている)
それでも足りなければ
>>390
393 :
デフォルトの名無しさん :2005/10/27(木) 00:08:46
質問です。 char 型の変数 a、b があり、b の下位2ビットだけを a にコピーしたいのですが (上位6ビットの値は変更せず)、綺麗な方法が思いつきません。 a >> 2; a << 2; a |= (b & 0x3); という方法をとっているのですが、 これだと、上から3,4ビット目だけをコピーなどといった場合、複雑になってしまいます。 スマートな方法はないでしょうか。
a=(a & 0xfc)|(b & 0x3);綺麗じゃないな・・・
>>393 a &= ~(0x3);
a |= b & 0x3;
unsigned bitSet(unsigned a, unsigned b, unsigned window)
{
return a & ~mask | b & window;
}
396 :
393 :2005/10/27(木) 00:18:30
397 :
デフォルトの名無しさん :2005/10/27(木) 01:24:11
使っている処理系はBCC5.5で、変数型の互換についてです double function() { int a=300,b=400; return a+b; } と定義して。double c = function();、と受け取るのですがcには0が格納されます。 return の部分をreturn (double)a+b;としても結果は同じです。 ただし、aとbをdoubleで宣言した場合cには700と格納されます。 もしかして、doubleとintには互換性がないのでしょうか?
少なくともちゃんとした C コンパイラならそんな変なことにならない。 BCC のバグかどうかに関しては知らん。
どうやら変換指定子(%d %f etcetc)が間違えてた臭いです・・ %dと%fって互換がないんですね・・
BCCだけど普通に700って入ったよ
あ、先レスついてたか
>>395 >return a & ~mask | b & window;
return a & (0xff-window) | b & window;
でもいいかな。と、ちょっと理解していないんだが。
404 :
395 :2005/10/27(木) 07:54:15
あーいけね、maskをwindowに書き換えるの忘れてた。
>>403 それだと、型が変わるたびに書き換えないといけなくなるので、マクロ化やC++のテンプレートに応用することを考えるとちょっと弱い。
拡張頼みの処理系依存のコンパイラ任せ union { char a; struct { unsigned int la : 2 unsigned int ha : 2 }; }; char b; la = b;
>>392 long long は「Cで認められ」ているだろうに
C99は俺は認めない
採用されない規格に価値はない
409 :
default新規 :2005/10/27(木) 18:25:54
すみません。。こんな課題なのですが出来ますでしょうか? 急に単元が進んで、結構ピンチです。。 性能比較というのは、どういうことなのでしょうか? [1] 授業単元: 再帰と木 [2] 環境 Windows VC6.0 [3] 言語:C [4] 期限: [2005年10月27日23:59提出期限なのですが、出来れば23時ぐらいまでに。。] [5] その他の制限:標準ライブラリ使用可 ★課題★プログラム10 と プログラム11 の性能比較を行え。 【例】 [user@mypc ~] ./a.out 35 f(35)= 9227465 [user@mypc ~] time ./a.out 35 f(35)= 9227465 1.330u 0.032s 0:02.43 55.9% 0+0k 0+0io 0pf+0w ★再帰呼出し版 (プログラム10) int F(int i){ if (i < 1) return 0; if (i == 1) return 1; return F(i-1) + F(i-2);} ★トップダウン動的計画法(プログラム11) int F(int i){ int t; if (knownF[i] != unknown) return knownF[i]; if (i == 0) t = 0; if (i == 1) t = 1; if (i > 1) t = F(i-1) + F(i-2); return knownF[i] = t; } 宜しくお願いします(M_M)
412 :
デフォルトの名無しさん :2005/10/27(木) 18:59:33
ただ単にTIME関数を入れれば、カウントできるんじゃないの?
413 :
デフォルトの名無しさん :2005/10/27(木) 19:08:13
入力した文字列をポインタで指し示したいんですけどどうすればいいでしょうか? ただ、スペースで区切ってひとつひとつを構造体(スタックの仕組みで)に入れていきたいんです。 簡単にでもいいので是非教えてください
その顔文字が激しくうざい。
415 :
413 :2005/10/27(木) 19:12:57
例えば 「I am a student」と入力したら 「I」というポインタを指し示した構造体があり、 その構造体が次の構造体を指し示して「am」というポインタを指し示している。 というような流れのプログラムです。
(M_M)←この顔に免じて教えてやってくれ。
417 :
デフォルトの名無しさん :2005/10/27(木) 19:29:43
>「I」というポインタを指し示した構造体があり、 >その構造体が次の構造体を指し示して「am」というポインタを指し示している。 意味不明wwww 出直して来い
本当は構造体ではないとか
>>412 >TIME関数
>TIME関数
>TIME関数
そもそもスレ違いな質問に、それで答えたつもりか。
>「I」というポインタを指し示した構造体があり、 >その構造体が次の構造体を指し示して「am」というポインタを指し示している。 struct list { list* next; char* str; }; list start; start.str=calloc(strlen("I"),sizeof(char)); start.next=malloc(sizeof(list)); start.next.str=calloc(strlen("am"),sizeof(char)); start.next.next=malloc(sizeof(list)); ...たぶんこういうのだろうけど、C言語やめてC++のSTL使え。
テキストファイルの読み込みについての質問です コメントは無視して数字だけ読み込むにはどうしたらいいのでしょうか? #色々コメント 13,15 #コメント 1,1,1,1 1,1,1,1 な感じです fscanf(fp, "%s %d,%d", str, &a, &b); とやれば無理矢理読み込めますが コメントが2行になったりサイズによっては読み込め無くなります
422 :
デフォルトの名無しさん :2005/10/27(木) 20:31:21
ファイル操作するプログラムを作っているのですがプログラムを コンパイルすると「fp1,fp2が未定義です」とFILE fp1,fp2の行を 指定してエラーが出るのですが(以下fp1,fp2を使っている所も同様) なぜでしょうか?
>>421 まずfgetsでとった後いろいろやればいい。
そのあとscanf使いたいんならsscanf
425 :
デフォルトの名無しさん :2005/10/27(木) 21:37:17
すみません *が抜けてるのは書き間違いです。
ソース晒せばいいじゃん
427 :
デフォルトの名無しさん :2005/10/27(木) 21:54:34
#include<stdio.h> #include<math.h> main(){ double X,y,t,n,f,Ts; double pi = 3.14159; Ts = 1; t = -5; FILE *fp1,*fp2; fp1 = fopen("X_f.txt","w"); if(fp1 == NULL) { printf("ファイルオープンできません\n"); return 1; }
428 :
デフォルトの名無しさん :2005/10/27(木) 21:55:58
if((fp2 = fopen("f.txt","w"))== NULL) { printf("ファイルオープンできません\n"); } else{ for(f=-10;f<=10;f++){ f = f++; fprintf(fp1,"%f\n",f);
429 :
デフォルトの名無しさん :2005/10/27(木) 21:57:01
for(n=-10;n>=10;n=n+Ts){ if(t<-4){ y = 0; } else if(t>=-4&&t<=0){ y = t+4; } else if(t>=0&&t<=4){ y = -t+4; } else if(t>4){ y = 0; } X = y*cos(2*pi*n*Ts*f); fprintf(fp2,"%d\n",X); } } } fclose(fp1); fclose(fp2); return 0; } 以上です。
Ts = 1; t = -5; FILE *fp1,*fp2; を FILE *fp1,*fp2; Ts = 1; t = -5; にしてみ
431 :
デフォルトの名無しさん :2005/10/27(木) 22:06:06
あ、ありがとうございます。いけました。
Cで文字列の間に文字列をはさむにはどうすればいいかな aaaaaaaccccc ↑ ここにbbbbをいれる感じ
ずらして入れるか、新しく作る。
「ずらして入れる」って、なんかえっち。
書き込んだ後にすげ〜自分はエッチだと今頃気づいている
>>434
436 :
433 :2005/10/28(金) 07:29:48
書き込む前からなんかえっちと思ってたがなー
はさんで、だす。
438 :
デフォルトの名無しさん :2005/10/28(金) 08:14:42
テキストファイルの先頭に読み込む個数が記入されていて その数だけ読み込みたい場合はどうすればよろしいでしょうか? #読み込む個数 10 #読み込むデータ 1,2,3,4,5,6,7,8,9,10
>>438 個数読み込んで、forで回せばいいんじゃまいか?
>>434 うむ。萌えるシチュエーションだな。大好きだ。
>>432 一時的なバッファを使うなら a、b、c の順にコピー。
使わないなら、c を memmove して (strcpy じゃダメ)
b をコピー。
BYTE とか DWORD が既に型として定義されているかどうか、 ってのをチェックする事ってできるんでしょうか。
>>441 コンパイルしてみて通ったら定義されている
#ifndef BYTE #define BYTE unsigned char #endif
>>441 プリプロセスの #if で判定したい・・・というのであれば、
基本的にはできない。
そもそもプリプロセスの段階では
typedef とかの意味解析はされないし。
ただ、typedef とは別に目印となるマクロが定義されていれば、
それが定義されてるかどうかでチェックすればいい。
BYTE や DWORD だったら _WINDEF_ でいいとは思うけど、
コンパイラのバージョンが上がった際に変更を受ける危険性はあるかもしれない。
一応 #if でコンパイラのバージョン制限をしといて、
バージョンが違ったら #error 吐くようにして、
_WINDEF_ で判定できるか確認するようなメッセージを書いとくといいと思う。
確認できたら、バージョン制限をいじる、と。
>>443 型として定義されているかどうかって言ってるだろうがよォォォォ!
なんでマクロになってるんだ?! このド低脳がァァァ!!!
>>444 やっぱ普通には出来ないですか・・
特定の環境(VCとか)なら_WINDEF_等でもいけるんですけど、それはやっぱり機種ごとに書いてる
のと同じな気がするので。
ありがとうございました。
446 :
デフォルトの名無しさん :2005/10/28(金) 13:01:59
そもそも何が目的で調べたいのかで対処方法が違うと思うのだが?
コンパイラごとにマクロが違えば、 コンパイラごとにチェックするマクロを変えるしかないね。 これは正直言って、仕方がない。
448 :
助けてください :2005/10/28(金) 14:39:59
c言語で、ピタゴラスの三角形を表示するプログラムの作り方を教えてください。 For文を使います。IF文は不可です。
そもそも標準でない環境依存の BYTE,DWORDを想定するのが、 環境依存な書き方にすぎないのだから、何をいまさら。 typedef 等のチェックは(マクロに限らないちゅうに) configure(GNU autoconf)等みたく、サンプルのコンパイルの 成否を(半自動などで)確認せざるをえない、スレ違い。
もう、面倒だから全部Javaで書き直せばいいじゃん。 UnixもアセンブラからCに書き直されたんだ、Javaでできんこともあるまい とCスレで喧嘩を売ってみる
452 :
デフォルトの名無しさん :2005/10/28(金) 16:06:04
Cとjavaじゃ喧嘩にならないくらいCのほうが優れているよ。 C#を引き合いに出せよ。 と喧嘩を買ってみる
コンパイラ依存でコードが変わるのを気にするのなら、 自分でそれに相当するものを定義すればいい。 typedef unsigned char Byte; typedef unsigned int DWord; とか。 これが BYTE や DWORD と同じサイズになるように定義する。 まあ、これも short, int, long のサイズによって 定義を変えなきゃいけないという環境依存があるんだが・・・。 プリプロセスでは sizeof は使えないので、 UINT_MAX や CHAR_BIT などの値から 型のバイト数を割り出す必要がある。
454 :
デフォルトの名無しさん :2005/10/28(金) 16:26:44
>>451 ダメだろそんなんじゃ
UnixだってC+アセンブラで書かれてるんだ、Java+JNIで良いじゃないか
と行かないと
>>441 環境依存なコードを実装しながら途中で
環境に依存しないコードを作ろうと思い立ったというのが真相ではなかろうか。
妄想でスレ伸ばさないように
そこで<stdint.h>ですよ。
C99 が使えればそれでいいんだけどねぇ・・・
459 :
デフォルトの名無しさん :2005/10/28(金) 17:39:24
ファイルを"ab"モードで開くとします。 ファイル最後のオフセットを0xFFFFとします。 例えば0xFF01〜0xFF02を 0xFF01 DE 0xFF02 0F から 0xFF01 FF 0xFF02 FF に変更したい場合まず、fseekでFF01にシークを変更しますよね。 そこでfprintfでFFの値を二回書き込めば、0xFF01と0xFF02にはちゃんとFFFFが格納されます。 しかし困った事に追記なので、ファイル最後のオフセットが0x10001になってしまうのです。 (ファイルはただ書き込んだ分だけずれて、全体として容量が増えてしまう!!) これを防ぐには全体を一度ずらすか、新しくファイルを作ってトレースするのでしょうか? またはそのデータをファイルから削除するなどという方法があるのでしょうか?
"r+b"
yo ちぇけらっちょ
462 :
改行出来ない人 :2005/10/28(金) 19:53:03
viエディタを使ってます。 C言語で改行(半角\n)を入力して上書き保存をしようとすると write error が発生して保存出来ません。 \n がないと上書き保存出来るので原因は\nだと思います。 viで改行を認識させるにはどうしたら良いのでしょう? お願いします。
>>462 ×改行出来ない人
○頭がかわいそうな人
>>459 スレ違い。初心者スレに行ってくれ。つーか、「シークを変更」ってなにさ。
>>462 鼬害。ソフト板に行ってくれ。つーか、何をしたくて何をしたんだか。
何だお前
>>462 vi使わなければいいんじゃない?
LINUXは詳しくないけど、viなんかよりずっと使いやすいエディッタは転がってるよ
viはviスレ行け
UNIX板にある
>>466 冗談よしこちゃん
そうだなVzが一番だ
Emacs使ってるとカッコよさそう。 なんか、マウス使う機会がかなり減った気がする。 Cのインデントはちょっと気に入らないけど....
Emacsのがviよりエディタっぽくて使いやすいからな
471 :
デフォルトの名無しさん :2005/10/28(金) 23:19:15
質問です! テキストのスクリプトファイルを読み込んで動作するプログラムを作っているのですが "1+1*2"みたない文字列の答えを出すライブラリーとか無いですか?
1+1*2の答えに満たない文字列?
>>472-474 レスありがとうです
やはり自分で作るしかないみたいですね。
少し作ってみたけど結構面倒で”(”とかくるとヤバイ
その系統でいくなら、perl や awk を使ってもイケる。 自作するなら、bison と flex を使うと幾分か楽かと。 全部自作してもいいけど。
>476 ほー! vcしか使った事ないので知らなかったです bcではどうやるのですか? bcでDLL作って呼び出してみようかとおもってます。
>477 vcを使わないといけないので使えないです;;
>>479 なんでvcだと使えないの?
つーかむしろbison+flexが妥当だろうね
exprは?
bc って、UNIX/GNU の、単純な計算を行うコマンドのことだよ。
インタプリタやコンパイラの作り方を書いた本なりHPなり探したら?
本はともかくHPってある?
この板を「コンパイラ」で検索。 最近は全然読んでないから、どんな議論が行われているか知らないが。 そこそこリンクも見つかるだろ、たぶん。
慣れてきたら、別に bison+flex なしでもほいほいっと作れるようになる。 四則演算+カッコ程度なら、簡単に作れる。
>>488 ワロスwそこのスレ時々のぞくとオモロイ
C言語のソースがごろごろ転がってるページはありませんか
>>490 面倒だからといい加減な説明で質問すると
いい加減な答えしか返ってこないぞ。
496 :
デフォルトの名無しさん :2005/10/29(土) 21:43:50
以下のような記述はK&R形式というのでしょうか? (動きませんけど) func(path) char *path; { int fd; char *a; return (-1); }
>>496 そうだな。
pathの宣言の仕方が一番の特徴。
あとreturnに括弧をつけるのも今では廃れた。
498 :
デフォルトの名無しさん :2005/10/29(土) 21:56:03
>> 497 ありがとうございます。 ANSI 対応のコンパイラだとエラーや警告ができません。 それは、正しく解釈していると考えてよいでしょうか。
499 :
デフォルトの名無しさん :2005/10/29(土) 21:57:47
>>496 初期のCからいわゆるANSI−Cへの過度的なスタイルだね
>>498 一応ANSI CでもK&Rスタイルは認められている。
ただし非推奨で将来的には規格から削除すると書かれている。
501 :
デフォルトの名無しさん :2005/10/29(土) 22:41:56
>> 499 500 ありがとうござます。 なるほど、とりあえずOKだが、おすすめできない スタイルということですね。
>> 499 500 このスタイルもおすすめできない
503 :
デフォルトの名無しさん :2005/10/29(土) 22:59:59
すいません。 char *command_name; main(int argc, char *argv[]) { if((command_name = rindex(argv[0],'/')) != NULL)/*コマンド名の獲得*/ command_name++; else command_name = argv[0]; //
504 :
デフォルトの名無しさん :2005/10/29(土) 23:07:33
プログラムのわからない部分の抜粋なのですが、ここの'/'とcommand_name++ の部分について教えて下さい。 実行ファイル名は、ctohexです $ ./ctohex
>>504 command_nameのポインタで指している場所を1進めている。
>>503 後者はポインタを進めて次の文字を参照
前者は文字「/」、rindexなんてBSDのみの関数しらねーよ
507 :
デフォルトの名無しさん :2005/10/29(土) 23:12:57
>>504 '/' はスラッシュの文字コードを表す int 型の定数(おそらく 47)
command_name++ は外部変数の値を1だけ増加させる
>>496 ああ、そういうのもK&Rスタイルというのか
「インデントの仕方に何でコンパイラが文句を付けるんだ?」と一瞬悩んでしまた
ちなみに規格の用語ではそういうのは「プロトタイプスタイルでない定義」といいまつ
509 :
デフォルトの名無しさん :2005/10/29(土) 23:23:21
>>508 よろしければ、どういうのが K&R スタイルとお考えかお聞かせ願えませんか
511 :
デフォルトの名無しさん :2005/10/29(土) 23:31:12
>>510 K&Rに掲載されているコードのクローン?
512 :
503.504 :2005/10/29(土) 23:34:33
>>505-507 有り難うございます。command_nameに ctohexの c のアドレスが、
もしくは 配列argv[0] のアドレス (.のアドレス) が代入されるのですね。
>>509 "K&Rスタイル"でぐぐって1番上に来るやつ
if (...) {
のように、{ の前で改行しない書き方
514 :
デフォルトの名無しさん :2005/10/29(土) 23:38:46
いきなり (void) かよ なまおのノリだなw
俺は関数はAllman、他のifやforとかはK&Rだな
516 :
503.504 :2005/10/29(土) 23:52:07
文字^^; w
関数でautoクラスのポインターを返すのは禁止されてるんでしょうか?
>>517 べつにいいけど、期待した動きかどうかは…
>>517 ポインタ変数自体がautoって意味なら別にそれ自体は問題ではないよ。
>>517 質問が曖昧だが
1.autoオブジェクトを指すポインタを返す
2.autoクラスのポインタオブジェクト(が格納している値)を返す
どっち?
1なら
>>518 2ならそれ自体は別に問題ない
>>517-521 すいません、質問の仕方が悪かったです。
以下の違いがわかりません。
char *test(void){
char buffer[]="test";
return buffer;
}
int main(void){
printf("%s",test());
return 0;
}
では警告が出るのですが、
char test(void){
char buffer=1;
return buffer;
}
int main(void){
printf("%d",test());
return 0;
}
だと警告はでません。
コンパイラはBCCで、警告の内容は
警告 W8075 test62.c 6: 問題のあるポインタの変換(関数 test )
です。
∩_ 〈〈〈 ヽ 〈⊃ } ∩___∩ | | | ノ ヽ ! ! / ● ● | / | ( _●_) ミ/ <こいつら最高にアホ 彡、 |∪| / / __ ヽノ / (___ ̄\ / (_ノノノ│ ∪
そりゃ局所変数へのポインタ返そうとすりゃエラーも出るよな
525 :
デフォルトの名無しさん :2005/10/30(日) 00:21:31
pthreadをC++(UNIX系)で使ってるんですが、 void func(MyClass *myclass) を pthread_t t[10]; int res,i; MyClass myclass[10]; for(i=0;i<10;i++) res = pthread_create(&t[i],NULL,(void *)func,&myclass[i]); とするとエラーがでてコンパイルが通りません。 何がいけないのか教えてくれませんか?
C++なら俺に聞け
>>522 bufferはtestから抜けるときに消滅する。
前者ではこれから消滅するものへのポインタを返すのがまずい。
後者はこれから消滅するものだけどその中身(のコピー)を返しているから問題ない。
ちなみにこれは平気。文字列自体はプログラムの実行している間ずっと存在するので、そこへのポインタを扱っても問題ない。
const char *test(void) {
const char *str = "test";
return test;
}
(char buffer[]="test";ではtest関数ローカルの変数bufferを"test"で毎回作り出していることになるので、
testの呼び出し毎にbufferは作られてなくなる)
>>525 環境依存スレ行ってこい
そもそもここはC
>>527 書いていただいたソースで理解できました。bufferは配列の先頭要素を指すポインタなので、
配列へのポインタを返しても、呼び出し側に戻ったときすでに配列は消えていて、配列に入っていた値を参照できない。
ってことなんですね。
難しいっす。
531 :
デフォルトの名無しさん :2005/10/30(日) 17:50:37
どのくらいあるかわからない入力を全部取得する方法を教えて下さい。 いま↓みたいににやってます。 #include <stdio.h> #include <stdlib.h> int getbuf(char** buffer) { #define BUF_SIZE 1024 int ch, idx, len = BUF_SIZE; char* buf = (char*)malloc(len); for (idx = 0; (ch = getchar()) != EOF; buf[idx++] = ch) { if (idx >= len) { char* tmp = (char*)malloc(len + BUF_SIZE); for (idx = 0; idx < len; ++idx) { tmp[idx] = buf[idx]; } free(buf); buf = tmp; len += BUF_SIZE; } } buf[idx] = '\0'; *buffer = buf; return idx; }
534 :
533 :2005/10/30(日) 17:58:09
かぶった orz
535 :
531 :2005/10/30(日) 18:09:05
ありがとうございます。realloc便利ですね。
536 :
デフォルトの名無しさん :2005/10/30(日) 19:20:18
reallocって良いでしょう?ところで またまた、関数ポインタで不思議な状況に 遭遇しました。関数ポインタの引数は どうなっているんでしょうかねぇ? #include <stdio.h> void boyaki(void){ printf("なんでロッテなんやぁ?\n"); } void monku(int n){ int i; for(i=n;i--;printf("なんでやタイガーズ!\n")); }
537 :
デフォルトの名無しさん :2005/10/30(日) 19:20:52
int main (void){ void (*okasi_yanaika)();//引数無し関数ポインタ void (*okasiiAry[1])();//引数無し関数ポインタ配列 void (*nandomo_ittarei)(int);//int引数関数ポインタ void (*ittareAry[1])(int);//int引数関数ポインタ配列 okasi_yanaika=boyaki; okasi_yanaika(); okasiiAry[0]=boyaki; okasiiAry[0](); nandomo_ittarei=monku; nandomo_ittarei(3); ittareAry[0]=monku; ittareAry[0](5); //ここまでは当然ですが、次の例は不思議ですよね? //動いてますけど… printf("なんで引数の無い関数が引数とれるんじゃぁ!\n"); okasi_yanaika=monku; okasi_yanaika(5); okasiiAry[0]=monku; okasiiAry[0](10); return 0; }
538 :
デフォルトの名無しさん :2005/10/30(日) 19:43:13
>>536 言っている意味がわからんが?
そもそもVCではコンパイルすら通らない。
>>537 void (*okasi_yanaika)(void);//引数無し関数ポインタ
void (*okasiiAry[1])(void);//引数無し関数ポインタ配列
540 :
デフォルトの名無しさん :2005/10/30(日) 20:27:34
>538 当方VC++エンプラ版だけど・・・ 余程安物のVC++じゃないの? それとも: reallocって良いでしょう?ところで またまた、関数ポインタで不思議な状況に 遭遇しました。関数ポインタの引数は どうなっているんでしょうかねぇ? これも一緒にコンパイルしたのかなぁ?
そういう知識自慢は他のところでやってくんない?
542 :
デフォルトの名無しさん :2005/10/30(日) 20:41:34
>>540 536+537のソースはVCではコンパイルとおりません。安物とかそういう問題ではないんだが。
キティちゃんですか?
G:\開発\test\test.cpp(32) : error C2440: '=' : 'void (__cdecl *)(int)' から 'void (__cdecl *)(void)' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
G:\開発\test\test.cpp(33) : error C2197: 'void (__cdecl *)(void)' : 実引数が多すぎます。
G:\開発\test\test.cpp(34) : error C2440: '=' : 'void (__cdecl *)(int)' から 'void (__cdecl *)(void)' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
G:\開発\test\test.cpp(35) : error C2197: 'void (__cdecl *)(void)' : 実引数が多すぎます。
543 :
デフォルトの名無しさん :2005/10/30(日) 20:42:00
>541 でも不思議だと思わん?
>>543 某スレと良い、君も好きだねぇ
啓蒙活動w
こんな事ができても不思議だと思わん。 char c; int *p = (int*)&c; *p = 0x123456;
546 :
デフォルトの名無しさん :2005/10/30(日) 20:48:58
>542 おいおい!ホントかよぉ。こちらは 実行結果: なんでロッテなんやぁ? なんでロッテなんやぁ? なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんで引数の無い関数が引数とれるんじゃぁ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! なんでやタイガーズ! Press any key to continue こうなってんだけどぉ。誰か他のもっとましなコンパイラもってる人! やってみてくれないかなぁ?
ワラタw住民かぶってるやん
549 :
デフォルトの名無しさん :2005/10/30(日) 20:52:20
>545 charは根がintじゃけん。それは当たり前です。
>>542 このスレが何のスレだか判っていますか?
或いは、あなたは自分が何をしているのか判っていますか?
つまり聞く耳もたない基地外って事か。もう気が済むまで好きなだけ荒らしてください。
キタコレ
基地外認定早いなぁ 想定の範囲外ってやつですか
554 :
デフォルトの名無しさん :2005/10/30(日) 21:03:08
>551 void(*f)(); のような関数ポインタと配列が 引数を取ってかつ、それをちゃんと計算するってぇ、話題が このスレでは荒らしになるのでしょうか?
え?なんで質問スレに来てんのw?
ええかげんにしろ啓蒙クン
557 :
デフォルトの名無しさん :2005/10/30(日) 21:10:35
ロリコン男のストーカー脅迫事件
浅倉大介(当時30)は98年に進学校の女子高生(17)に一目惚れして一方的に「婚約している」
と吹聴し車で相手の学校まで乗りつけ高校で職員会議沙汰になる程の迷惑行為をした。
相手の女性は将来が決まる重要な時期(理系の学部に進学したかったようです)に
ストーカーをされて「歌手になれ結婚してくれ」と浅倉に何の興味もないのに押し付けられて
ノイローゼ気味になっていた。さらに当時浅倉はプロデュースしているアーティストTMRevolutionが
売れており人気があったため事務所の用意周到な隠蔽工作と相乗して周りの人間にすら状況
を理解されず、歌手になると勘違いされプライバシーを根掘り葉掘り探られ誹謗中傷もされて
精神的にズタズタになって学校内で何度も倒れ、卒業後は逃げるように地方に引っ越して行った。
ちなみに浅倉は彼女の事をマスコミには一方的に婚約者として公表している。
浅倉は未だに相手の女性に対して人生を狂わせた事について何の謝罪もせずに結婚して
出産しろとヤクザを使い性的に辱めて脅迫をしている。
それに事務所が倒産したら盗撮画像をばら撒くぞとも脅してもいる。
示談の話は進んでいるが悪質極まりない対応をしている為、世間の方に知っていただき
少しでも彼女が安全な状態になれば思い私共は書き込みました。
最悪の場合彼女が殺害されても身元不明の死体が見つかり通報があれば警察が動きますので。
浅倉大介がパーソナリティーをしているラジオFM79.5に元浅倉ファンのLEMON(過去に
HPを持ち浅倉のラジオの書き起こしを載せていた)の父親が勤務しておりこの事件について
詳しく知っている。
詳細
http://jbbs.livedoor.jp/bbs/read.cgi/computer/1872/1092320889/919-926 http://music5.2ch.net/test/read.cgi/musicjg/1126700852/778-922
>>542 そりゃC++(ry
>>546 あー、あるファイルで void func(void) を実装していながら
別ファイルで void func(int) とプロトタイプをうたって呼び出せるのと
あんまりかわらないような。
559 :
550 :2005/10/30(日) 21:59:38
>>558 もしかして:「騙って(かたって)」
うたってどうしますか(苦笑)。
>>559 謳うという意味で書いたんだけど、そう解釈されても差し支えないですね
うわこれは酷いな
酷い→謳い
引数が無いんじゃなくて、引数が無視されるから
>>564 ワカランちゃんにはそれがわからんのです。
わからんちゃんをわからんちゃんというあるいみわからんちゃん
わからんちゃんってカワイイなw
569 :
デフォルトの名無しさん :2005/10/31(月) 02:05:48
realloc を同じサイズで呼んだ場合は、既存のメモリー領域が使い回しされるんでしょうか?
そんな保証はないがそういう実装もあるかもな。 サイズ増減した場合でも同じ領域が使われる事もあるかもしれないし。
VCはほぼ何もしない(同じアドレスを返す)ように なってるみたいだ。C言語的な仕様ではないと思うけど。
572 :
デフォルトの名無しさん :2005/10/31(月) 02:23:25
"static 変数型 変数名"で宣言された変数と、 "変数型 変数名"で宣言された変数はどう扱いが違うのか、イマイチ解りません。 わかりやすく解説が載っている参考サイトなど無いでしょうか
int count1() { int counter = 0; return counter++; } int count2() { static int counter = 0; return counter++; } これをそれぞれ300回呼んで戻り値チェックしてみろ
空間限定のグローバル変数みたいなもん
>>572 適当に書いてみるテスト
同じstaticでも関数の中で宣言した変数につけたのと
関数の外で宣言した変数につけたのでは全く意味が違います
(C++だとクラスの中で宣言した変数につけたのもまた意味が違う)
関数内のstatic変数
普通のローカル変数は関数からリターンすると変数の内容は失われますが、
static変数の場合は関数からリターンしてもその内容が保持されます。
int test()
{
static int a = 0;/*ここのstaticをつけたりはずしたりして繰り返し呼んでみよう*/
a++;
return a;
}
関数外のstatic変数
通常グローバル変数は、リンクされるすべてのソースからアクセスすることができますが、
staticをつけると、変数のスコープ(その変数にアクセスできる範囲)がソースファイル内に限定されます。
577 :
575 :2005/10/31(月) 03:24:38
しくしくしくしくしく・・・orz
泣くな、たぶんミスっただけだw
579 :
デフォルトの名無しさん :2005/10/31(月) 04:39:43
質問なんですけどputc()の第一引数はなぜchar型ではなくint型なんでしょうか?
>>579 文字定数('で囲んだ文字のこと、'A'とか)の型がintだからだと思う
それだけじゃないけどね。 ヒント:暗黙のプロモーション、プロトタイプ宣言の省略
ソース
C89 の標準関数では、 ・int ・double ・ポインタ しか使われないようになっている。
・long ・typedef 型 ・構造体 もあるな。 でも、char はない。
585 :
デフォルトの名無しさん :2005/10/31(月) 12:45:15
関数ポインタ配列を順次実行しようとしています void (*fl2[])() = { func1, func2, func3, NULL, }; void (*pFList2)() = *fl2; for (; *pFList2; pFList2++) { (*pFList2)(); } どうも終端判断とインクリメントするコンパイルエラーが取れません(for文の所) 何か妙案は無いでしょうか
関数ポインタをtypedef汁
587 :
デフォルトの名無しさん :2005/10/31(月) 12:54:27
質問です。 atexitに失敗した場合、それ以前にatexitしてあった関数は終了時に実行されますか?
>>585 void (**pFList2)() = fl2;
for (; *pFList2; pFList2++) {
(*pFList2)();
}
>>590 どんなふうにtypedefすればいい?
typedef void (*fphoge)(); fphoge fl2[] = { ... }; fphoge* pFList2 = fl2;
>>585 これのclassメンバ関数版にトライしてみたが挫折・・・
木構造で、以下のようにして内容物を検索したいのですけれど、 Node *SearchTreeItem(Node *pRoot, char exp[]) { Node *node; if(node == NULL) return NULL; node = SearchTreeItem(pRoot->Left, exp); if(node != NULL) return node; if(strcmp(node->Expression, exp) == 0) return node; node = SearchTreeItem(pRoot->Right, exp); return node; } エラーが出て途中でストップしてしまいました。 なので、
内容物を表示するだけに自粛し、以下のように書き直し再度試したところ、 Node *SearchTreeItem(Node *pRoot, char exp[]) { if ( !pRoot ) return NULL; if ( pRoot->Left ) SearchTreeItem( pRoot->Left, exp ); printf("%s\n",exp); if ( pRoot->Right ) SearchTreeItem( pRoot->Right, exp ); return NULL; } やはり途中で止まってしまいました。 どの辺りがおかしいでしょうか? よろしくお願いします。
ステップ実行できるデバッガ使えと
デバッガ使えないなら どこまで実行できてるかprintfしてみる程度の 頭を使って欲しいものだ
>>593 void (ClassName::*fl2[])() = {
&ClassName::func1, ...
};
>>594 Node *SearchTreeItem(Node *pRoot, char exp[])
{
Node *node;
if (pRoot == NULL)
return NULL;
node = SearchTreeItem(pRoot->Left, exp);
if (node != NULL)
return node;
if (strcmp(pRoot->Expression, exp) == 0)
return pRoot;
return SearchTreeItem(pRoot->Right, exp);
}
void PrintTreeItem(Node *pRoot)
{
if (pRoot == NULL)
return;
PrintTreeItem(pRoot->Left);
puts(pRoot->Expression);
PrintTreeItem(pRoot->Right);
}
601 :
デフォルトの名無しさん :2005/10/31(月) 23:21:51
>>590 たかが ** くらいで typedef が必要なアフォハケーン
602 :
デフォルトの名無しさん :2005/10/31(月) 23:22:36
>>593 C++ スレで聞いてみ
瞬殺で回答くるよ
603 :
デフォルトの名無しさん :2005/10/31(月) 23:25:03
>>601 問題の位置が分かってないアフォだな。
関数ポインタを typedef しないやつはオナニープログラマだという話だ。
605 :
デフォルトの名無しさん :2005/10/31(月) 23:35:57
>>604 自分がわからないからってな個人的事情を知らん奴に押しつけることこそ「問題の位置」だよ
まぁ自分一人でシコシコプログラム作る分にはどうでもいいけど 会社のプロジェクトでプログラム作るときは他人が読むことを考えて可読性を上げた方がええわな。
607 :
デフォルトの名無しさん :2005/10/31(月) 23:40:52
608 :
デフォルトの名無しさん :2005/10/31(月) 23:41:38
コーディング基準で typedef しろと言われている場合と あんた個人の金切り声は 内容が同じでも意味が全く違うんだよ
質問者がtypedefしてないなら特に口出すことでもないいな。
そううだね。
関数ポインタ型は typedef って常識だろ? 可読性の問題もあるけど、戻り値や引数の型を変えたい時に困るだろ?
612 :
デフォルトの名無しさん :2005/11/01(火) 00:07:19
>>611 「常識」の理由がころころ変わるなよ・・・
まあいい、それで何個の関数の戻り値や引数の型を変えたくなったんだ?
なんだかなーって奴が板に住み着いたのかな。 他のスレでも全然sageてないし。
614 :
デフォルトの名無しさん :2005/11/01(火) 00:13:07
ストーカーきもい
フリーでお勧めソフトありませんか? 独学ではじめてみようと思うんですが・・・・
Cygwin+gcc
618 :
デフォルトの名無しさん :2005/11/01(火) 00:33:42
619 :
デフォルトの名無しさん :2005/11/01(火) 00:37:01
ありがとうございます。 サイトまわってStarEditなるものを見つけてきますた
ここでワープロコピペ
>>611 戻り値や引数の型でタイプミスの可能性が増えるからだろ?
622 :
デフォルトの名無しさん :2005/11/01(火) 01:02:14
打ち間違いをする可能性を減らす って意味だろ
624 :
デフォルトの名無しさん :2005/11/01(火) 01:02:58
そもそもコンパイルエラーになることを防止するんじゃないの?
626 :
デフォルトの名無しさん :2005/11/01(火) 01:11:09
( ゚д゚)ハァ?
( ;゚д゚)ヒィィィィィィ
ふへほ
何度も同じの書くのメドイ。 引数ないならいいけど、引数が4個くらいあるとイヤになる。
631 :
デフォルトの名無しさん :2005/11/01(火) 01:51:25
typedef void afo(int, int, int, int); afo* voke; afo sine {} //ill-formed
632 :
デフォルトの名無しさん :2005/11/01(火) 01:56:03
C言語でCGIを作りたいのですがコンパイル方法がわかりません。 開発環境はVS2003です。よろしくお願いします
635 :
デフォルトの名無しさん :2005/11/01(火) 02:07:40
そのCGIの実行環境が非Windowsのレン鯖な悪寒
>>633 atexitを失敗させる方法が思いつきません。どうしたらいいですか?
失敗するまで登録し続ける
639 :
587 :2005/11/01(火) 08:47:01
>>638 なるほど!そんな手があったんですね!・・・と思ってgccで以下のコードを試しました。
#include <stdlib.h>
#include <stdio.h>
void func(void) { static int n = 0; printf("%d ", ++ n); }
int main() {
int i;
for (i = 0; ; i ++) {
if (atexit(func) != 0) {
printf("atexit failure (i = %d)\n", i); break;
}
}
return 0;
}
atexitが失敗する前にコンピュータがフリーズしてしまい、結果がわかりません。orz
普段フリーズすることなんてないのですが、上のコードを実行したらフリーズ後にコンピュータ本体のどこかから変な警告音まででました。
ちなみにBCCだとたったの32回しか登録できなかったのですが、atexit失敗後にきちんと全部の関数が呼ばれました。
これはどう解釈すべきでしょうか?
(というか、できれば標準でどのように規定されているかが知りたいのです・・・)
atexitなんてそんなんにガシガシ登録するもんでもないだろ
>>640 atexitが失敗したときの処理をどう書けばよいのかに困っているのです。
もしatexitの失敗により、それ以前に登録していた関数が呼び出されないことがあるなら、atexitを使わない方向で考えなければならないかもしれません。
もしくは、atexitが失敗することはありえないと考えて、失敗時の処理は書かない、というのも(移植性を求めたい場合でも)あり得る選択肢ですか?
失敗したら即終了。またはエラーログ吐きつつ続行。
>>642 失敗したら即終了ということは、メモリの開放をatexitに任せるのは良くないと考えるべきですか?
それともfprintf(stderr or log, "メモリリークしたかもしれません")などで諦めるべきでしょうか?
実際悩みどころはatexitそのものよりも、atexitに登録しておいた関数たちが心配なんです。
だから、できることなら登録済み関数がどう扱われるかに関する標準での規定(もしくは未定義?)の情報があると助かります。
>>643 基本的に心配のポイントがナンセンスだとは思うんだが…
どちらにせよ異常処理としては、後処理(atexit登録)の内容、意味、重要性
毎にケースバイケースの判断が必要だろ?
atexit()使わない人も少なくないから興味薄いし、
それでも心配なら自分で ANSI(ISO), POSIXをきちんと調べるべきだろうに。
>>643 > メモリの開放をatexitに任せるのは良くないと考えるべきですか?
そもそも、標準に準拠した環境なら、
main()のreturn or exit()で解放されるわけだが…。
>>643 アメやるから帰れ。
機能 atexit関数は,funcが指す関数を,プログラムの正常終了時に
実引数をもたずに呼び出される関数として登録する。
処理系限界
処理系は,少なくとも32個の関数の登録をサポートしなければ
ならない。
返却値 atexit関数は,登録が成功したとき0を返し,失敗したとき0以外
の値を返す。
関数ポインタを登録するヒープを確保するくらいだろうから 失敗したらそれ以前のものがすべて破壊されるとは考えにくい。 ついでに言うとmallocやfopenに失敗した時 それ以前のハンドルがすべて無効になるともならないとも言ってないな。
649 :
643 :2005/11/01(火) 11:40:55
みなさん、貴重なご意見をありがとう!!
>>645 たしかに、ケースバイケースという点を見逃して質問してしまいましたね。実際atexitに登録していた関数は、動的に確保したメモリの開放に関連していたので、ある時点でatexitに失敗した場合、どうやってGCしようか思案していたのです。
>>646 すみません、「動的に確保した」メモリの開放のことだったのですが、言葉足らずでした。
>>647 まさに求めていたものです!639でbccが32回で止まったことに納得がいきました。
atexitに失敗したら、それまでに登録されていた関数が呼び出されるかどうかは、未定義なんですね。
>>648 なるほど。そう考えると、atexitに失敗したらメモリリークを避けるのは難しいってことなんですね。
色々勉強させてもらいました。どうもありがとうございました!
0.1を10回足したら厳密に1になるような(固定小数点?有理数?BCD?)演算ライブラリで、一般的によく使われているものはありますか? (C++ならboost::rational? 一般的とは言い難いかもしんないけど)
下駄履かせて計算すればいいだけじゃない?
>>649 > atexitに失敗したらメモリリークを避けるのは難しいってことなんですね。
いや、「まともな」OSならプロセスが死んだらメモリとファイルハンドラは解放する。
そもそもkill -9とかされたらatexit()自体呼ばれないし...
普通、atexitにはいきなり終了されるとマズイ処理とかを登録する
例えば、エディタでソース編集している時にいきなり保存もせずに終了したら泣くでしょ?
そういう場合、atexitにファイル保存処理を登録しとく。
wordは...あれはネタプログラムだから、ファイル保存せずに終了もありでしょう。
>例えば、エディタでソース編集している時にいきなり保存もせずに終了したら泣くでしょ? >そういう場合、atexitにファイル保存処理を登録しとく。 ハァ? たとえにしても意味不明すぎ。
654 :
649 :2005/11/01(火) 14:18:42
>>652 そうなのですか!勉強になります。
となると、mallocしっぱなしでmainのreturnをした場合にも、きちんとメモリは解放されるものなんですか?
>>651 特定用途だとそれでいいけど、欲しいのは汎用ライブラリなので……。
0.1を10回足すというのは、例示として浮動小数点だと誤差が出る典型的な
ケースを挙げただけで、それそのものが目的なわけではないです。
わかりにくくて申し訳ない。
656 :
655 :2005/11/01(火) 14:36:08
あ、特に一般的と言えるものはない、ということならそれはそれでいいです。 とりあえず目についたものは、GNU MPくらいかなぁ。
>>654 > mallocしっぱなしでmainのreturnをした場合にも、きちんとメモリは解放されるものなんですか?
まぁ、コーディングとして美しいかはともかく、「まともなOS」なら解放される。
ちなみに私の独断でのまともなOSの定義はWinNT系とUnixなど
DOSやらWin9x系(特にMe)はまともなOSとは言い難い
mallocしてfreeしないなんて人の道に反するよ。
Win9X系でもメモリぐらいは解放するだろ ちなみにfree()せずに終了してもMS-DOSでは問題ないはず なんせシングルタスクの世界だからなw
Win3.1がやばいんじゃなかったっけ。 プログラム間でポインタ受け渡して操作し合えたのにはシビれたよ。
Win16は一番くさいよな。昔のMacOSとかも似たようなもんだろうな。 メモリが断片化するからmalloc()使うなと泣きを入れてくる素晴らしいOSだ。
Win95 ってどうだっけ?
>>649 う〜〜ん、やっぱり頭痛ものだなぁ……
exit()前にfree()が必須かどうかはともかく(C FAQネタ)、
>>647 の出典が不明なままでよく信じる気になれるよな。
とても ANSI,POSIX などの「規格」とは確信できないだろうに。
atexit なんて使ったことないんだが。 グローバル変数使ってないと存在価値ないが、 グローバル変数なんて使わないし。
665 :
647 :2005/11/01(火) 17:50:37
>>658 free() してもメモリが OS に返されるわけではない。
…いや、このネタやっぱ禁止。
>>663 >
>>647 の出典が不明なままで
おお、忘れてた。
JIS X3010 : 2003 (ISO/IEC 9899 : 1999)
プログラム言語 C
お、fjの論争の続きか?
まずはgoto論争を片付けてからだ
668 :
デフォルトの名無しさん :2005/11/01(火) 19:31:20
>>360 のやつ俺なりに書いてみたよ
いまいちポインタを使えきれてない気がするんだけど書き方のアドバイスお願い
#include <stdio.h>
int main( int argc, char *argv[] )
{
int i;
char e;
char *name[7]={"Yamada","Yoshizaki","Suzuki","Kato","Kamata","Kuwata","Maeda"};
e=getchar();
for(i=0;i<7;i++)
if(name[i][0]==e)
printf("%s\n",name[i]);
}
C言語ってオブジェクト指向言語に比べて検出されるバグの数多い?
671 :
デフォルトの名無しさん :2005/11/01(火) 21:20:27
ファイルを全部バッファに格納するのは reallocでバッファ拡大してくのと fseekで終端まで行ってftellで長さ見るの どっちがいいのですか?
reallocは論外だろ。 サイズはOSのAPI,システムコールでとったら。
>>670 比較対照広杉だが、
C のエラーチェックは比較的甘いので、
そのせいでバグは多くなりやすいとは言えなくもない。
674 :
デフォルトの名無しさん :2005/11/01(火) 22:14:45
Linuxのソースコードってどこで手に入りますか? 言語勉強の一環として読み解きたいんで
>>668 イニシャルの入力はmain関数で行うんじゃないの?
674は釣りですか?
いやマジっす
>>678 なぜでありますか?
たしかLinuxってC言語で書かれているのでは?
スレ違いではないと思うのですが
679は釣りですか?
Linuxにソースコードついてないか?
685 :
671 :2005/11/02(水) 00:10:10
>>672 レスどうも
winプログラミングではAPIでやってます
しかし、そういうシステムコール関数が用意されてない場合に終端に行ってftelを使うというのは、方法としてどうなんでしょうか。
今はreallocでやってるんですけども。
>>685 相を分けて考えるべき。
・ファイルサイズを得る手段として、ftell()は無難か。
→ファイルサイズが2GBを超えた場合や、非バイナリモードなどで正しくない値を返す可能性があるが、概ね使える。
・ファイルサイズが得られない場合にrealloc()しながらファイルを読むのは適当か。
→一度fgetc()などで空読みしてでもrealloc()は避けたほうが無難かもしれない。
#ま、要はfseek()+ftell()が実装されているならそれを使うってことで委員で内科医?
687 :
デフォルトの名無しさん :2005/11/02(水) 00:51:38
>>685 なら CreateFileMapping でFA
realloc は俺もやだ
x = realloc(y, z); で x != y のたびに memcpy するだろ
しかも x != y は毎回あっても規格合致だから
性能的に話にならない
reallocは有害無益!!とほざいてみるテスト。
689 :
デフォルトの名無しさん :2005/11/02(水) 10:13:02
私はCを始めて一年になる、初心者です。 分からないことがあります、質問しても良いでしょうか? int *p; p=calloc(10, sizeof(int)); int *p[10]; は同じポインター配列だと思うのですが、どこか違うのですか?
int *p; p=calloc(10, sizeof(int)); int *p[10]; p[0]=calloc(10, sizeof(int));
>>689 上のpは10個の要素を持つint型の配列を指すポインタ
下のpは10個の要素を持つint*型の配列
ぜんぜん違う
692 :
デフォルトの名無しさん :2005/11/02(水) 10:33:49
>>690 int *p[10];
p[0]=calloc(10, sizeof(int));
でそれぞれの要素に値を代入するにはどうしますか?
int i;
for(i=0;i<10;++i)
p[0][i]=0;
こうですか?
>>686 >fseek()+ftell()が実装されているなら
ANSI C なら実装されているだろうし
(タマに実装されてない処理系があるが)
寧ろ stat/fstat が実装されてれば
そっちの方が話が早いような。
>>687 >性能的に話にならない
サイズにもよるが、そもそもファイルI/O(ry
694 :
デフォルトの名無しさん :2005/11/02(水) 10:51:37
ちなみに、 int *p; p=calloc(10, sizeof(int)); p[0]=calloc(10, sizeof(int)); int i; for(i=0;i<10;++i){ p[0][i]=0; printf("%d\n",p[0][i]); } ではエラーが出ます。callocを使って二次元配列は作れないですね。
695 :
671 :2005/11/02(水) 11:11:36
大変参考になりました ありがとう
697 :
689 :2005/11/02(水) 11:41:34
>>696 char a[]はchar *aと同じと聞いたことがあったのですが、
どうもぜんぜん違うもののようですね。
この辺の知識がこんがらがっていました。
ありがとうございました。
Cでは2次元配列なんかできないと思っておけば問題ない。 2次元に見えるのはポインタに騙されてるだけ
699 :
デフォルトの名無しさん :2005/11/02(水) 14:07:25
線形リストを作って、乱数(重複しないで)を入力するんですが、重複を判定するにはどうしたらいいでしょうか?
>>699 set に insert していって戻り値を見ればいいんジャマイカ
701 :
デフォルトの名無しさん :2005/11/02(水) 14:47:09
どなたかアドバイスお願いします。 a,b,cという3本のソースファイルから参照した定数(下記)をヘッダファイルに 記載してソースファイルからそれぞれインクルードしました。 すると「MULTIPLE PUBLIC DEFINITIONS」というエラーが発生します。 constをstaticにすると解消されますがこれはなぜでしょうか? const char num[8] = {0,1,2,3,4,5,6,7};
>>702 includeしたら各翻訳単位に同名の非static変数が存在することになる。
よって多重定義でエラーを吐くんでアウト。
staticなら翻訳単位内のみで有効だから多重定義にならずにセーフ。
704 :
デフォルトの名無しさん :2005/11/02(水) 18:35:29
タイピングゲームを作っているのですが、某人気タイピングゲームみたいに制限時間を 1秒ずつ減らしながらかつその秒数を表示でき、そういったことと並行して文字列の出入力を 可能にする関数もしくはプログラムを書いて下さい。 〜 time(&t1); while(1){ time(&t2); if(difftime(t2,t1)>=1.0) break; 〜 希望として上のコードを用いてほしいです。お願いします!
gettickcountでまわしてください。
それを言うなら timeGetTime だろ。
>>702 #ifndef使ったら
ええんちゃうん?
#include <stdio.h> void main (void) { int i=1,s=0; while(1) { s+=1; if(s >=100) break; i++; } printf("1からの総和が100以上になるのは%dです。\n",i); } と書いたら、
>>702 C FAQ10-6参照
> 一般に、以下のものはヘッダー(.h)に入れる。
> マクロの定義(プリプロセッサーの#define)
> 構造体、共用体、列挙型の宣言
> typedefの宣言
> 外部関数の宣言(質問1.11も参照のこと)
> グローバル変数の宣言
基本的にグローバル変数の「定義」はCソース内で行うべきであり
「宣言」はヘッダファイルで行うようにすべき
つまり、どっかのソース中に
> const char num[8] = {0,1,2,3,4,5,6,7};
を入れて、ヘッダでは
extern char num[]
と宣言しとく。
staticにすると、同じnumという変数が全てのオブジェクトファイルに入ってしまい
あまり好ましいとは言えない。
>>709 お前の書いたコードが悪い。
ループ内にprintfを書いてsの値を確かめてみな。
>>708 > s+=1;
多分s+=i;が君の想定している動きなんだろうけど、
「プログラムは思ったとおりには動かない、書いたとおりに動く」
からなぁ...
あと、void mainとかforでどうにかできるのにわざわざ無限ループ使ってたりするところが萎えだなぁ...
> int i=1,s=0;
> while(1) {
> s+=i;
> if(s >=100)
> break;
> i++;
> }
for(i = 1, s = 0; s < 100; i++)
s+=i;
2行で済むぞ。
う、1とiを間違えてた。 レスdクス。
>>714 実際改行しない書き方もあるから1行のこともあるわな。
しかし
>>708-709 のコードは気持ち悪すぎる。
背筋がゾゾッとした。
というか即フリーソフトのせいにしてるのが笑える、もとい笑えない
C言語の初心者スレいっぱい立ちすぎ
719 :
デフォルトの名無しさん :2005/11/02(水) 23:37:00
>void mainとか UNIX って偉いなあw
1とiを見間違えることはあっても 1とiを書き間違えるなんてことがあるなんて
721 :
デフォルトの名無しさん :2005/11/03(木) 10:42:00
視覚記憶は想像以上に影響あるからな ローマ字入力しているときに濁点忘れとか実際あるし
ねえよ
ないな
うん
俺あるぉorz
/* 拡張子がすべて大文字かどうか */ BOOL IsUpperExtension(const char *filename) { unsigned char *ext; ext = (unsigned char *)PathFindExtension(filename); while (*ext != '\0') { if (*ext >= 'a' && *ext <= 'z') { return FALSE; } else if (_ismbblead(*ext)) { if (*++ext == '\0') break; } ++ext; } return TRUE; } /* ファイル名がすべて大文字かどうか */ BOOL IsUpperAll(const char *filename) { unsigned char *s = (unsigned char *)filename; while (*s != '\0') { if (*s >= 'a' && *s <= 'z') { return FALSE; } else if (_ismbblead(*s)) { if (*++s == '\0') break; } ++s; } return TRUE; } ...こいつプログラミングにむいてねぇorz
727 :
デフォルトの名無しさん :2005/11/03(木) 18:55:41
const じゃないってことか?
729 :
デフォルトの名無しさん :2005/11/03(木) 19:54:59
回答してるひとは、動かないソースを読んでて面白いですかね?
犯人が明かされない推理小説でも楽しめる人間はいるもんだよ
731 :
デフォルトの名無しさん :2005/11/03(木) 20:02:05
open();の中のmode_Tの値が、0660なのですがこれは何を意味するのでしょうか?
頭の0は8進数の印
733 :
デフォルトの名無しさん :2005/11/03(木) 20:03:33
mode_t ^^;
734 :
デフォルトの名無しさん :2005/11/03(木) 20:06:11
>>732 有難うございます。今から基数の変換をやってみたいと思います。
ファイル名が・・・じゃなくて、 大文字かどうか判定する一般的な関数を作るべきだな。 拡張子は・・・って関数も、それを利用して作ればいい。
737 :
デフォルトの名無しさん :2005/11/03(木) 20:58:51
UNIX豚は別にして、ファイル名がASCIIだけとは限らないわけだが
738 :
デフォルトの名無しさん :2005/11/03(木) 21:07:11
>>737 大丈夫。isupperはボーランドC++でも使えます
ここは、windowsプログラミングのスレに変わったのでつか?(・∀・)
ファイルシステムを規定しないと解決しない
>>737 悪いが
>>726 がそれに対応しているようには見えないわけだが
ワイド文字のことを言いたいのならiswupperを使えばいい
ASCIIに限定したくないのならなおさら標準関数を使ったほうがいいような希ガス
744 :
デフォルトの名無しさん :2005/11/03(木) 22:05:31
あるデータ列の最大値がmax,最小値がminのとき、このデータ列をaからbの値 の範囲に正規化するにはどうすればいいですか?
>>744 アルゴリズムについてはスレ違い。つーか、max〜minの値をa〜bに変換したいのか?
中学生レベルの問題ジャマイカ。
>>744 RDBの正規化や浮動小数点の正規化というのは聞くが、なんだそれは?
>>746 minを基準にして、データ列の他の値は、
minとの差分で表す見たいな事だと思ったけど
ちがうかな?
>>747 あぁそういうことか
てっきり正規分布にでも当てはめるのかと思った
正規化っちゅーのはたいていデータ列の平均引いて標準偏差で割ることだろう
>>749 それって正規分布に従う奴をN(0,1)に変換する奴だっけ?
つーか、質問が曖昧杉
そりゃぁ、何を「正規」とするかだからねぇ。 つーか、スレ違いだっちゅうに。
>>751 任意のN(μ,σ^2)を標準正規分布にあてはめるときに
Z=(X-μ)/σってのは統計の分野でよく使うやつです。
データ列を任意の区間[a,b]に変換するような場合も
アイデアは同じですね。冗談抜きに小学生でもできます。
で、C以前の問題ということでスレ違いですね。
Cの文法はここで聞けばいいのかな? 宿題スレみてて、ちょっち疑問におもったんだけれども。 int func(); /* ... */ int func() { /* ... */ } ってな書き方を何度か見たんですけど、下と等価なんでしょうか? int func(void); /* ... */ int func(void) { /* ... */ }
>>754 上はK&Rスタイルだったっけか
とりあえず等価とみてよかったと記憶してるが
Cならちゃんとvoidって書くべきじゃね?
>>754 等価ではない。
前者は引き数リストを省略している。
つまり、int func();と宣言してfunc(1);と参照してもエラーにならない。
引き数がないことを明示したければ、int func(void);と書かないといけない。
C++の場合は引き数リストを省略できないので、等価となることになっている。
要は、 int func(); という宣言は、 Cなら int func(...); C++なら int func(void); と宣言したのと同じ。
レスありがとうです。 Cでは引数がない場合はint func(void)と書くべきだとわかりました。 (宿題スレでお手本プログラムでvoidを書かないのが複数出てたんで、心配になってしまった・・・)
解答する香具師にもバカが多いから、 質問する方もそのへんちゃんと見分けなきゃね
int func(); と int func(...); は違う。 前者は引き数リストの省略で、後者は可変長引き数の指定。 尚、記憶に間違いがなければ可変長引き数の指定は固定引き数が一つ以上必要だった筈。 #誰か規格に当たってくれ。
C言語覚え立てとかは答えたがりが多いしね
>>759 を見て、まさかオレに限って、いや万が一と思い、自分のレスを幾度も読み返し、
念のためググって自分の発言に間違いはないか、複数のサイトを比較し確かめた上で、
やっと自分には関係ないと安堵して一息ついた人の数↓
だっふんだ
>>763 そんなことするくらいなら規格に当たればいいのに。
八つ当たりイクナイ
767 :
デフォルトの名無しさん :2005/11/04(金) 14:58:55
三項演算子は左辺値にはならないのでしょうか? 全然実用的な意味はありませんが、あくまで C言語の仕様を確認するためです。: #include <stdio.h> int main(void){ int a=1,b=2,x=3,y=4,*c,*d; c=&x;d=&y; *c=(a<b)? ((*c<*d)? *c:*d): ((x>y)?x:y); //こんなネストは出来る。 printf("c=%d d=%d \n",*c,*d); if(((a>b)? x:y)<8) printf("Aha!\n"); //条件文にも使用可能。がしかし、 // ((a>b)? x:y)= 8; // ((*c>*d)? *c:*d)=10; //((*c<*d)? c:d)= &a; //printf("c=%d d=%d \n",*c,*d); //と、色々やっても左辺値にはならないようだが? return 0; }
int main() { int a1 = 40; int a2 = 70; *(a1 > a2 ? &a1 : &a2) = 10; printf("a1 = %d\n", a1); printf("a2 = %d\n", a2); return 0; } これならできた
770 :
デフォルトの名無しさん :2005/11/04(金) 15:37:24
>768 こりゃあ!すげぇ。 て、ことは: #include <stdio.h> int main(void){ int a=1,b=2,x=3,y=4,a1=40,a2=70,*c,*d; c=&x;d=&y; *c=(a<b)? ((*c<*d)? *c:*d): ((x>y)?x:y); printf("c=%d d=%d \n",*c,*d); if(((a>b)? x:y)<8) printf("Aha!\n"); //両辺が共に三項演算子、が可能になったじゃないか! *(a1 > a2 ? &a1 : &a2)=(a<b)? ((*c<*d)? *c:*d): ((x>y)?x:y); printf("a1 = %d,a2 = %d\n", a1); return 0; } //極めて非実用的では、あるが…
>>767-768 ちなみにC++だと左辺値になるので(a1 > a2 ? a1 : a2) = 10;などが可能になっている。
仕様を確認、といいながら未だFAQも規格も読めないウザ厨ってのはなんなのよ
773 :
デフォルトの名無しさん :2005/11/04(金) 16:45:00
>仕様を確認、といいながら未だFAQも規格も読めないウザ厨ってのはなんなのよ けれど、これはお世辞にも美しいとはいえない。
774 :
デフォルトの名無しさん :2005/11/04(金) 16:52:54
これは・・・じゃなくて 君の性格は・・・ だろ?(w
メモリのリーク管理はどうすれば良いんですか? mallocしたらfreeなど解放には気を付けているのですが、 どこか気付いていないところで漏れていないか心配です
777 :
デフォルトの名無しさん :2005/11/04(金) 18:22:46
>768 両辺が三項演算子って、なかなか面白そうだから 整列された二つの配列を奇数と偶数配列に 分割してみました。結構、「美しい」?コードです。 が、動きません。 どうすれば良いのでしょうか? #include <stdio.h> #include <stdlib.h> #define N 15 int main(void){ int ary1[]={ 2,5,7,8,10,(int)NULL}; int ary2[]={ 1,3,4,6,9,(int)NULL}; int aryOdd[N],aryEven[N]; int i=0,j=0,k=0,l=0,m,*x=&m; while(*(x^1? &aryOdd[i++]:&aryEven[j++])= (ary1[k]>ary2[l])*x=ary1[k++]:*x=ary2[l++]); while(i--) printf("Odd = %d\n",aryOdd[i]); while(j--) printf("Even = %d\n",aryEven[j]); return 0; }
#include <stdio.h> void main (void) { int i=1,s; for(i=1,s=0;;i++) { if(i%2==0); continue; s+=i; if(s >=100) break; printf("%d\n",s); } printf("1からの奇数の総和が100以上になるのは%dです。\n",i); } どこがおかしいんだろう・・・
>>777 whileに入ったところで読む気が無くなった
見づらいだけで意味無いだろ
>>778 要は偶数だったらcontinueさせたいのか?
それだと無限ループ。ifの構文を見直せ
#include <stdio.h> int main(void){ int i,s; for(i=1,s=0;(s+=i)<100;i+=2) printf("%d\n",i); printf("\n%dで計%d",i,s); return 0; } 可能な限り最適化
変数は必ず初期化しましょう
ハァ?
>>777 とりあえず入門からやり直せ。
・空ポインタ定数マクロをポインタ以外のものとして使用してはいけない
・ポインタはビット演算できない
・排他的OR演算子は偶奇を判定しない
・直前の副作用完了点と次の副作用完了点までの間に、式の評価によってオブジェクトに格納された値を変更する回数は高々一度だけでなければならない。更に、変更前の値は、格納される値を決定するためだけにアクセスしなければならない。
・三項演算子の?は省略できない
788 :
デフォルトの名無しさん :2005/11/04(金) 21:01:32
>786 先生!ご指摘の部分を修正したところ、エラーの数は確かに 「激減」致しました。が、依然として動きません。 #include <stdio.h> #include <stdlib.h> #define N 15 int main(void){ int ary1[]={ 2,5,7,10,(int)NULL}; int ary2[]={ 1,3,4,6,9,(int)NULL}; int aryOdd[N],aryEven[N]; int i=0,j=0,k=0,l=0,m,*x=&m; while(*( (x%2)? &aryOdd[i++]: &aryEven[j++]) = (ary1[k]>ary2[l])? *x=ary1[k++]: *x=ary2[l++]); //これで「見易く」はなりましたよね? while(i--) printf("Odd = %d\n",aryOdd[i]); while(j--) printf("Even = %d\n",aryEven[j]); return 0; } >> ・直前の副作用完了点と次の副作用完了点までの間に、(以下略) << このコメントを加味したコードをお示し下さい。 先生の「華麗な」力技を期待しております。
>>788 だから(int)NULLはおかしい。NULLはヌルポインタを表すもの。
int値では0にしろ。
オナニーショウを見てもつまらねえ
793 :
デフォルトの名無しさん :2005/11/04(金) 21:20:43
>789 NULLを0に代えましたが、 > '%' : 不正な左オペランドです。 > '=' : 左のオペランドが、左辺値になっていません。 エラーが消えません。 先生方の華麗な力技を是非!是非!
794 :
デフォルトの名無しさん :2005/11/04(金) 21:23:13
先生方、両辺三項演算子スタイルって結構 発展性を秘めているんじゃないでしょうかねぇ?
>>793 (*x%2)にすればVC++7.1では動いた。
796 :
デフォルトの名無しさん :2005/11/04(金) 21:30:25
for文で終了条件をa[i]番目が−または+の時ってしたいんですけど for(i=0;a[i]!='-'||a[i]!='+';i++){ ↑じゃあダメですよね どうしたらいいか教えてもらえませんか?
797 :
デフォルトの名無しさん :2005/11/04(金) 21:30:42
>>793 NULLを \0にしてみたらどうですかねぇー。
ていうかなんでNULLじゃなきゃ駄目なんだ?
>>796 適当にこれじゃだめ?
for(i=0;i<max;i++){
if(a[i]=='-'||a[i]=='+')
break;
}
>>796 for(i = 0; a[i] != '-' && a[i] != '+'; i++)
801 :
デフォルトの名無しさん :2005/11/04(金) 21:55:28
&&でいけました ありがとうございます
802 :
デフォルトの名無しさん :2005/11/04(金) 21:57:34
>795 >(*x%2)にすればVC++7.1では動いた。 当方はVC++6.0です。 ファイルをcからcppに変更しましたら辛うじて動きました。 この時点で本来このスレの話題では無くなるの ですが、そこを敢えてしつこく… 当方の実行結果下記の通り、おかしなこと?に なっておりますが、先生の7.1ではどうでしょうか? また、ファイルはcのままでしょうか? Odd = 9 Odd = 3 Odd = 1 Odd = 7 Odd = 5 Even = 0 Even = 6 Even = 4 Even = 10 Even = 8 Even = 2
803 :
sage :2005/11/04(金) 22:06:00
-1.#IND00e+000か1.#QNAN0e+000を判別したいんです。 microsoftには、以下のようにして"C"が表示されればNaNとわかると 載っていたのですが、実行すると、いずれも表示されません。。 環境はwin2kにVC++6.0です。 初心者なりに検索したのですが、どうしようもなくなってしまいました。 時間のある方、教えてくださいm(_ _)m if(a<0.){ printf("A")} else if(a>0.){ printf("B")} else{ printf("C")}
804 :
803 :2005/11/04(金) 22:06:32
慌ててた、、死にたい、、
しようのない子ね♥
807 :
803 :2005/11/04(金) 22:20:14
>>803 忘れてただけです、、
基本的にFortranを使ってたのでその癖が出ちゃいました。
すんません。
エラーが出て動かないときってエラー文見ないわけ? VC++ならご丁寧に日本語で出力されるじゃん。 不思議でならんな。
809 :
デフォルトの名無しさん :2005/11/04(金) 22:22:10
>804 なにも2ちゃんで死ぬほどのこたぁないと思うが・・・
810 :
803 :2005/11/04(金) 22:23:09
あああ、、
判ると思うけど807の
>>803 は
>>805 です。
ほとんど徹夜状態なんで許してください。。
811 :
デフォルトの名無しさん :2005/11/04(金) 22:52:54
>810 いいってことよぉ。 どうせここんところの発言は全部一人で 書いてんだからさぁ。
>>778 おかしいところは盛りだくさんだけど
とりあえず
if(i%2==0);
の行末のセミコロンを取り除けばとりあえず動くんじゃないかな
>>795 未定義動作が含まれてるから動かしちゃだめ
if(i%2==0)だと偶数の総和になると思うぞ
てかif(i%2)で十分
セミコロンがついてると for(i=1,s=0;;i++) { continue; } だよ 無限ループじゃん
#include <stdio.h> int main (void) { int i=1,s; for(i=1,s=0;;i++) { if(i%2==0) continue; s+=i; printf("%d ",s); if(s >=100) break; } printf("\n1からの奇数の総和が100以上になるのは%dです。\n",i); return 0; } result: 1 4 9 16 25 36 49 64 81 100 1からの奇数の総和が100以上になるのは19です。 すこーしだけ改変 しっかしすげーうんこプログラムだね
ド素人だから知らんかったが CにもCONTINUEがあるんだな GOTOみたいなもんだろ 気持ち悪いな^^;
break
gotoを使いたくないからcontinueとかbreakとかがあるんじゃないの?
論理的に等価
char a=1; printf("%d",sizeof(a));//実行すると 1 printf("%d",sizeof(~a));//実行すると 4 型変換は演算が無い限り行われないと考えていいんでしょうか? だとすると printf("%d",sizeof'A');//実行すると4 となるのは何故でしょうか?
'A'がintだからじゃない?
というか実際そうだ Cだとintになる
>>824 レスどうもありがとうございます。
ある本に「文字定数からintへの格上げ〜」と書いてあったで、
文字定数はcharと決め付けてしまいました。
>>825 そうでした。つまらない質問をして申し訳ないです。
参考までにエキスパートCプログラミング P.208です。
自分の読み違いかもしれませんね・・・。
828 :
デフォルトの名無しさん :2005/11/05(土) 12:23:21
>>821 break は中間判定という点で goto と同じ考え方で使うもの
ただしループの途中に外から飛び込むことができない、いわば制限つきの goto だ
>>822 さて、continue はどうだろう
分岐先はループ内であり逸脱前に前判定または後判定を必ず通るので中間判定とは言いがたいと思う
>>828 とりあえずその「中間判定」というのが何の寝言で gotoとどう関係するのか
説明してからのたまうべきだと思うが。(もしくは何も喋らないか)
>>828 gotoとbreakが同列かよ
寝言は寝ていえ
最近828みたいな奴がよくでるなぁ #まさか同一人物じゃないですよね?
gotoを効果的に使える場面でしか使えないようにしたのがbreak 利用方法さえ間違わなければgotoはとても有用だという証
833 :
デフォルトの名無しさん :2005/11/05(土) 13:34:52
>>829 { から } までを1命令と考えられるようにまとめようとしているとき、
命令A
命令B
命令C
というシーケンスでAからBを経ずにCへ制御が移ることを
命令Aに於ける中間判定といい
不明瞭なので避けるべきと主張するのが goto 有害説
よって立場のとりかた次第で意味を失いまたは反論の余地がでるが
ダイクストラは大規模なプログラムの能率的な管理に立場を置いている
スパゲッティがどうのと文句垂れときながら、 再びGOTOがどうとか、懲りない奴ら
gotoをはじめとした害悪を取り除いたのがJava
JavaにもLABALあるぞ?
837 :
デフォルトの名無しさん :2005/11/05(土) 14:29:38
gotoの代わりに例外という害悪を導入したのがJava でもGCがあればgotoだろうがbreakだろうがどうとでもなります、だろ
838 :
デフォルトの名無しさん :2005/11/05(土) 14:30:50
>>837 GC と goto 有害説がどう関係するのか聞きたい
839 :
デフォルトの名無しさん :2005/11/05(土) 14:34:36
おーい、誰か食いつけよ かなりもったいない餌まいたのに つまんねー
>>838 金がないからってgotoするよりは地道に空き缶でも集めてる方がいいって話
>>833 何その中間判定の定義?しかもgoto有害説と関係ないじゃん
842 :
デフォルトの名無しさん :2005/11/05(土) 16:17:59
>802 Cでもこれなら動くが… #include <stdio.h> #include <stdlib.h> #define N 15 int main(void){ int ary1[]={2,5,7,10,0}; int ary2[]={1,3,4,6,9,0}; int aryOdd[N],aryEven[N]; int i=0,j=0,k=0,l=0,m; while(*( (m%2)?//普通に変数を使えば良い。 &aryOdd[i++]: &aryEven[j++]) = (ary1[k]<ary2[l])?//802のコードの不等号は逆! (m=ary1[k++]): (m=ary2[l++])); while(i--) printf("Odd = %d\n",aryOdd[i]); while(j--) printf("Even = %d\n",aryEven[j]); return 0; }
843 :
デフォルトの名無しさん :2005/11/05(土) 16:28:23
>842 先生! もう半分諦めておりましたのに、お手数おかけしました。 お陰様で整列も上手く行きます。 しかしながら、10がぁ消えちまって… 最後の華麗な力技をお願いします。 他の先生方も是非!是非! 実行結果: Odd = 9 Odd = 7 Odd = 5 Odd = 3 Odd = 1 Even = 0 Even = 6 Even = 4 Even = 2 Press any key to continue
845 :
デフォルトの名無しさん :2005/11/05(土) 16:48:16
>844 未定義かどうか知らんが、確かに 毎回同じ実行結果にはなるね。
#include <stdio.h> void main (void) { int a=10,b=3,wa; float syou; wa=kasan(a,b); syou=jozan(a,b); printf("%dとの%dとの和は%d、商は%.1fです。\n",a,b,wa,syou);
} int kasan(int x,int y) { int z; z=x+y; return z; } float jozan(int a,int b) { return(a/b); }
848 :
デフォルトの名無しさん :2005/11/05(土) 18:18:04
先生! lこれはfloatで戻ってくるかどうかは未定義だと 仰りたいのでしょうか?
cmd.exe /C LCC.EXE KATASE~1.C *** コンパイル開始 *** KATASE~1.c 10: Warning: function 'kasan' undefined -- assumed to be int KATASE~1.c 12: Warning: function 'jozan' undefined -- assumed to be int KATASE~1.c 31: conflicting declaration for 'jozan' *** コンパイル終了 ***
850 :
デフォルトの名無しさん :2005/11/05(土) 18:20:12
>846,847 感動的に「寒い」コードだよなぁ…
851 :
デフォルトの名無しさん :2005/11/05(土) 18:22:18
>849 片瀬先生ですかぁ?
>>845 特定の環境下で同じ実行結果になるのはともかく、
未定義かどうか知らん、のは非情にまずかろう。
まあ842やその元のアプローチ自身、根本的に何の価値も無い
ということにまだ気がつかない奴残ってるのか?
ageてるのとかその他なんか急速に初心者スレよりひどくなって……
とりあえず
>>845 がやってるのが価値が無いことだと言うことは
容易に認識してるんだが、未定義なのって副作用絡み?
今ひとつ副作用完了点辺りが理解できてない俺に誰かわかりやすく説明希望
856 :
デフォルトの名無しさん :2005/11/05(土) 19:58:47
関数の仮引数のポインタは知ってますが、これは何でしょうか?K&Rにも載っていないのですが /* 前のフェーズを設定 */ void *setbackphase(int phase) { static int backphase = 0; backphase = phase; return &backphase; }
あれま
関数にポインタ付ける意味がわからんのだが・・・ ていうかなんじゃこれ? phaseのアドレス返すだけなら&phaseでいいんぢゃないの???
ああ,backphaseとphaseのアドレスは違うからか・・・
int phaseは関数を抜けた時点で破壊されるから。
861 :
デフォルトの名無しさん :2005/11/05(土) 20:17:36
>>841 中間判定については確かにちょっとおかしいな
「中間判定による分岐」なら意味が通るが
ところで goto 有害説と関係ないと主張するためには
まずあなたの言う「goto 有害説」とは何かを示す必要があるぞ
現状、唐突に関係ないと言い出しているだけで(自粛)にしか見えてない
>858 吸い込み関数って知ってる? 正確に言うと参照を返す関数。 書き方悪いけど return (*)〜;を返す。 分かりやすく言うと、関数が戻値を返したつもりでも、逆に値の吸い込み。
関数内のstatic変数は関数抜けても存在し続けるから。自動変数だと関数抜けると破棄される。
吸い込み関数に該当するページが見つかりませんでした。 検索のヒント - キーワードに誤字・脱字がないか確かめてください。 - 違うキーワードを使ってみてください。 - より一般的な言葉を使ってみてください。
866 :
856 :2005/11/05(土) 20:36:40
>>863 さん
ありがとうございます。参考にさせて頂きます
皆さんも有難うございました
867 :
デフォルトの名無しさん :2005/11/05(土) 20:56:47
>852,854 確かに >845 は従来の意味では、つまりC言語の仕様を厳格に 適用し、これまでコード例が豊富だと言う意味では 価値が無い。 ただ若干変な奴?だが彼が拘っている両辺三項演算子スタイルそのもの に発展性があるかどうかは、今後の実装に拠るんじゃないか? 即ちC言語の仕様において現在、未定義とは未来永劫、未定義とは 限らない。 もっと広い目で見てやっても良いんじゃないかな?
質問です。 プロトタイプをしない場合、暗黙の型変換が行われますが、 プロトタイプをした場合の引数における型の変換はどんなルールは基づいてるんでしょうか?
869 :
デフォルトの名無しさん :2005/11/05(土) 21:00:10
>>868 そこまで疑問点を明確に定義できるなら規格票もってれば完璧にわかる
>>855 簡単にいうと
*(e1 ? e2 : e3) = e4 ? e5 : e6
という式ではe5やe6の評価とe1の評価の間には副作用完了点はない。従ってどっちが先に評価されるかは決まっていない(この時点でもうだめなことはわかると思う)。
>>786 の4番目の長い項目(の後半)をかみ砕いて言うと、
・副作用完了点を挟まずに一つのオブジェクトの変更と参照の両方をやるのは基本的に認められていない。
・但し、オブジェクトに格納される値を求めるとき(例えば x = x + 1のような場合)だけは参照していい。
ということ
>>845 ではe5やe6でmが変更されているが、e1ではmをmに格納される値を求めるのとは別の目的で参照しているから未定義動作を引き起こす。
まあ、読みにくいだけならIOCCCに出すというような使い道もあるが、これじゃ無理だな。
念のために書いておくが
*(e1 ? e2 : e3) = (e4 ? e5 : e6, e7)
みたいなことをやって副作用完了点を無理矢理作り出しても無駄だから。
こんな場所に副作用完了点を作ってもe4 ? e5 : e6の副作用が完了するまでe7の副作用を起こさないことが保証されるだけでe1がいつ評価されるかには関与しない。
代入式の左辺と右辺の間に副作用完了点を作るのは不可能だ
>>870 なるほど、サンクス
mの参照と代入が行われてるのを見落としてた
872 :
デフォルトの名無しさん :2005/11/05(土) 21:40:19
>870 >代入式の左辺と右辺の間に副作用完了点を作るのは不可能だ 右辺の式評価が完了しない限り左辺に代入することは不可能だ。 従ってC言語の仕様における式評価順は右辺から左辺になるんじゃなかったか?
>>872 m[i] = i++;
先に左辺が評価されても問題ないパターンがある以上、仕様上は未定義。
874 :
デフォルトの名無しさん :2005/11/05(土) 21:45:46
>871 >mの参照と代入が行われてるのを見落としてた もし、代入で統一したかったら、 (m=m%2)? でも動くが…
>873 >m[i] = i++; >先に左辺が評価されても問題ないパターンがある以上、仕様上は未定義。 常に右辺から評価されても全然問題はない。 つまり上の例は、先に左辺が評価されて「も問題ない」パターンの レアケースであり、左辺から評価されちゃまずいものが殆どではないのか?
>>875 チミがなんと言おうとISO/IECでは未定義になってるんだから未定義なんだよ。
877 :
デフォルトの名無しさん :2005/11/05(土) 22:00:23
>875 本来左辺式が評価されること自体が レアケースであることは踏まえて、 そのレアケースのレアケースっていう 意味でだ。 確かにあまり意味はないが・・・ でも、面白いだろう? こんな議論って。
>>872 右辺 : 代入する値の特定
左辺 : 代入されるオブジェクトの特定
が出来れば代入は可能だが、そのどちらも「式評価の完了」を意味しない
ついでに書くと、3行目と4行目が論理的につながっていない。
3行目が仮に事実だとしてもそれだと「代入は右辺の評価のあと」としか言えない
>>874 そこに代入がないことが問題なんじゃなくて、右辺に代入があることが問題
副作用完了点と評価順序の話を混同しているよ。
>>875 なんか勘違いしてないか。
評価と代入は別であって、評価が終わらないと代入が行われないことは確かだが、
右辺を評価しないと左辺が評価できないわけではない。
その上で、C言語標準では「評価は式中いつ行われてもいい」となっているから、
副作用完了点を持つ式中では左辺右辺に関わらず未定義動作を引き起こす。
881 :
デフォルトの名無しさん :2005/11/05(土) 22:27:33
>880 確かに: int x =0,a=5,b=7; *((x == 0)? &a : &b)= ++x; printf("a= %d ,b= %d\n",a,b); 不貞だよな。
>>867 少なくとも細くつりあがった目では見てないが、
生暖かい目で見てやるわ
883 :
デフォルトの名無しさん :2005/11/05(土) 23:00:49
>882 生暖かいってのはリアルだよな。 これがあの寒いコードを書いた同一人物とは とても思えん。(w
884 :
856 :2005/11/05(土) 23:17:39
>881 うわぁ、正気の沙汰じゃない、やめてくれ〜って感じだな 確かに研究者なら楽しいかもしれない ちょっと着眼点を変えてみて、856のstaticには重要な意味がある staticは実行開始時から終了までアドレスは変わらない だから、不定だか不貞だかゆう言葉は分からないけどbackphaseは参照される側ということになる てことで、856は誤りということになったwスミマセン フテーヤローだみたいな状況を防ぐ為にも、関数内に独自に確保した関数やPrivateメンバ変数、コンビを組むアクセス関数なんかがあって、ストックの役目をしてる フテーヤローの危うさには、他に、クラスオブジェクトポインタ(とそのメンバ)同士の代入とか、new使ったオブジェクトの代入とかヤバイもんがゴロゴロ転がってる 参照を返す関数は>856のvoidは腑に落ちないけど、例えば、 int& setbackphase(int phase) これが基本形。ただし、〜&型はC++の仕様でCじゃ使えない
885 :
訂正 :2005/11/05(土) 23:19:59
>関数内に独自に確保した関数 を >関数内に独自に確保した変数
>てことで、856は誤りということになったwスミマセン も訂正で >てことで、863は誤りということになったwスミマセン なんか非常に読みにくくなった 失礼
最近空気読めない人が多いな
>>867 自演デンパくん?どっかの新聞と似たような論理展開しないでね。
>ただ若干変な奴?だが彼が拘っている両辺三項演算子スタイルそのもの
>に発展性があるかどうかは、今後の実装に拠るんじゃないか?
今後の実装には拠らない。言語仕様が決めること。
>即ちC言語の仕様において現在、未定義とは未来永劫、未定義とは
>限らない。
"*分かりやすい*詭弁"だねw
889 :
デフォルトの名無しさん :2005/11/05(土) 23:38:47
「未」という字はどんな意味で使われることが多いかな
曰くこんなスレで「楽しい議論」を撒き散らす人間に詭弁なんていわれたくないです\(^^)/
891 :
デフォルトの名無しさん :2005/11/05(土) 23:39:59
副作用完了点の曖昧さは未定義というより不定義とでも言うべきだと思うが
>>891 いえいえ規格書では未定義です
僕は規格書を読んだこと無い人間を馬鹿にしたいです
893 :
デフォルトの名無しさん :2005/11/05(土) 23:41:42
少なくとも
>>867 の理屈なら何でも肯定できてしまうなぁw
894 :
デフォルトの名無しさん :2005/11/05(土) 23:43:16
>規格書 プ
俺の使っているコンパイラではこうだから、とか言う阿呆もいたな。
未定義動作と決まっているならいいんじゃん。
今日の釣果自慢していいですか?
法律と同じだねぇ 「法律にはこう記されているんだから、それに従いたくないなら日本を出てくべきだ」 「いや、法律は人間によって定められたものであるが、法律が人間を定めてはならない」
で、間違い書いてどれくらい恥晒したの? まとめたまえw
たまえw
901 :
863 :2005/11/05(土) 23:50:11
ところで、ちなみに俺はoprater派じゃない、使いたくはない なぜかって? よくできたclassならいいけど、やれることが狭まる ちなみにVCのインクルードファイルにも見ない、見かけたことがない
>>867 後ろの5行、ハン板でよく見かける展開ですが…もしかして
ほおっておいてくださいこれが僕の生き方なんです
>904 気にすることは無いと思います。 ポインタ型同士の代入、参照については、C関連やる人なら、しっかり深めとかなきゃいけない内容だし。 じゃないと迂闊にnewだのmallocだのは危なくて使えないでしょう。 >903 単に「参照を返す関数」に当て字を使っただけだよ
906 :
デフォルトの名無しさん :2005/11/06(日) 00:00:55
吸い込み関数(笑)
907 :
デフォルトの名無しさん :2005/11/06(日) 00:03:50
俺は知識ない人だけど 自分で名づけた名前を「知ってる?」って聞くのはナンセンスだろ 全然面識ない人に「花子って知ってる?俺の娘なんだけど」 って言ってるようなもんだ
参照て、上論議にあるように、どっちがどっちを参照かあやふやじゃない? 〜&型の関数は明らかに参照する側だろう これに参照を返す関数てな、あやふやな言葉使うより、(笑) でも きっちり、戻り値吸い込み!関数と言った方が適切だと思うけどね俺は、造語だけど。 だが、確かに863は誤った。 ところで、Cでこの議論からかってると、痛い目見るぞ、いつか・・・、というか罠はゴロゴロ転がってる。
>自分で名づけた名前 いや、みんな、言葉は違えど、似たようなもん使ってると思ってたけど?
>>908 まぁ逃げ道は残してあげとかないと、貴重なデムパ浴が…
まぁ、釣りが楽しみで着てる様なもんだもんな皆w ところで、核心の議論は中途半端だが、このまま終わりにして、あやふやなままアドレス参照、代入とかバシバシ使っちゃうわけか皆? まあ、理解しててやってんなら楽しんどけばいいと思うけど。
ところどころに半島の香りがするんですが。
最近、史上最強オナニストがVIPから流れてきたのよ、悪いな
915 :
863 :2005/11/06(日) 00:24:12
日本語が変てことか?確かに文章下手で訂正だらけで読みにくくて申し訳ないけど だが、大事な核心部分に国関係ないと思うけどね だが、水差しちゃった感じだな、駄レスで本論と遠ざかってしまった
そうだな。確かに国は関係無いが言葉が正確に使えないと議論にならないんで、正直アレだ。
母国のサイトで質問すればいいのにね
918 :
デフォルトの名無しさん :2005/11/06(日) 00:29:15
s/駄レス/だらず/
>>917 ここは2ちゃんだぞ?
追い出された奴が流れて来たに決まってるじゃん。
じゃん・・・
921 :
デフォルトの名無しさん :2005/11/06(日) 00:31:52
なういじゃんふぉれすときゃっと
ぃゃん・・・
>>869 検索したらdefault argument promotionsを見つけました。
ありがとうございました。
925 :
デフォルトの名無しさん :2005/11/06(日) 03:08:23
デンジャーなのは引数参照渡しだろうな それもクラス間だと、注意報クラス 更にやばいのが3つ巴 クラスAのメンバ:void foo(int* a){} クラスBのメンバ:void foo(&b){} クラスCのメンバ:void foo(&c){} そーとーきおつけなきゃいけない警報クラス、堤防決壊避難命令級! クラスB,Cのオブジェクト作って更に流用なんてことになると手の施しようもないカトリーナクラス!! ここまで来ると、オブジェクト至高だとか流暢なこと言ってられない、逆に裏スパゲチィ劣化版オブジェクト歯垢 引数参照渡しの場合、双方向あてがわれてローカル内で片方向にしてローカル変数で隠蔽等が効きにくい、禁じ手に近い
黙れ基地外
クラスBのメンバ:(A)a1.foo(&b); クラスCのメンバ:(A)a2.foo(&c); しっけい、こうだな
ここまで来るとさすがに怖いな
タイトルの読めないデムパの現れるスレはここですか?