C言語なら俺に聞け! Part 116
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNG質問する前には最低限検索を。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレッド
C言語なら俺に聞け! Part 115
http://pc8.2ch.net/test/read.cgi/tech/1127737437/
0002デフォルトの名無しさん
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のアドレスではなく中身が表示されるというのが
理解できません。
アドレスを表示させたい場合はどのように書けば良いのでしょうか。
0003デフォルトの名無しさん
2005/10/18(火) 14:29:490004デフォルトの名無しさん
2005/10/18(火) 14:43:09typedef struct test{
union{
struct{ int a,b,c;};
int field[3];
};
}sTEST;
と
typedef union test{
struct{ int a,b,c; };
int field[3];
}uTEST;
とするのでは何が違うんでしょうか?
0005デフォルトの名無しさん
2005/10/18(火) 14:54:18#include <stdio.h>
int main() {
int var, *po;
po = &var;
var = 100;
printf("%d\n" , *po);
return 0;
}
↑でなぜpoのアドレスが表示されないのがわかりません。
と聞いてるのと同じ事。
0006デフォルトの名無しさん
2005/10/18(火) 14:57:56ポインタ変数*poは、
構造体以外の場合:
po…アドレス
*po…アドレスが指している内容
構造体の場合:
&po…アドレス
po…アドレスが指している内容
になるということでしょうか。
0007デフォルトの名無しさん
2005/10/18(火) 14:59:30union(共用体)になってるかどうか。
0008デフォルトの名無しさん
2005/10/18(火) 15:00:44& obj.var
or
& po->var
0009デフォルトの名無しさん
2005/10/18(火) 15:00:53ポインタ変数は*がついていなければアドレスを保持する、と理解しているのですが。
0010デフォルトの名無しさん
2005/10/18(火) 15:01:35構造体になってるか共用体になってるかの違いはあるけど
確保してる変数(a,b,c,field[3])は同じ状態になるってことでいいのかな?
0011デフォルトの名無しさん
2005/10/18(火) 15:02:10int *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でもやってろ
0012デフォルトの名無しさん
2005/10/18(火) 15:07:57"->"はポインタの指し示す場所にある構造体からメンバーの値を取り出す演算子
0013デフォルトの名無しさん
2005/10/18(火) 15:12:17構造体でないケースは理解できているつもりです。
>>12
"->"を使った時点で変数ではなく演算になるということですか。
納得しました。
皆さんありがとうございました。
0014デフォルトの名無しさん
2005/10/18(火) 15:15:350015デフォルトの名無しさん
2005/10/18(火) 15:24:430016デフォルトの名無しさん
2005/10/18(火) 16:19:10無名構造体だからおかしくない。
0017デフォルトの名無しさん
2005/10/18(火) 16:26:16>>3とかぶってたもんで。すみませんでした。
0018デフォルトの名無しさん
2005/10/18(火) 16:29:54char moji="あいうえお";
char mozi="たちつてと";
char a;
aに、mojiとmoziの中身を代入して
a="あいうえおかきくけこ"のようにする関数はありますか?
よろしくお願いします。
0019デフォルトの名無しさん
2005/10/18(火) 16:33:10色々無理です。
0020デフォルトの名無しさん
2005/10/18(火) 16:34:34strcpy(s, "foo");
strcat(s, "bar");
puts(s);
0021デフォルトの名無しさん
2005/10/18(火) 16:34:44そもそも文字列について相当な思い違いをしているようだが。
Cの文字列はcharの配列だぞ?それに日本語をcharで扱うのはよくない。
~~~~~~
0022デフォルトの名無しさん
2005/10/18(火) 16:44:23>>20
さっそく取り組んでみます。本当にありがとうございました。
0023デフォルトの名無しさん
2005/10/18(火) 16:46:00>>19,21
死ね糞根性悪。
では失礼します。
0024デフォルトの名無しさん
2005/10/18(火) 16:51:13>>23
は偽ですよ…
0025デフォルトの名無しさん
2005/10/18(火) 16:51:41え?そんなこと言っちゃダメじゃね?君は、質問してる側だよ?
0026デフォルトの名無しさん
2005/10/18(火) 16:52:110027糞根性悪その2
2005/10/18(火) 16:53:330028デフォルトの名無しさん
2005/10/18(火) 17:33:33何に気をつけるべきでしょうか?
0029デフォルトの名無しさん
2005/10/18(火) 17:36:051バイト文字とのコードの競合や、文字の泣き別れが発生しないように気をつける必要がある。
0030デフォルトの名無しさん
2005/10/18(火) 17:37:58あと文字列は出来ればunsigned charにした方がいい。
0031デフォルトの名無しさん
2005/10/18(火) 17:45:15ありがとうございました。
0032デフォルトの名無しさん
2005/10/18(火) 17:48:01とか思ってたけど、C だと大丈夫なのね。
C++ だとエラーになるけど。
0033デフォルトの名無しさん
2005/10/18(火) 17:48:49Cはそこらへんが甘い。
0034デフォルトの名無しさん
2005/10/18(火) 18:00:12出来ればキャストした方がいいけどな。
0035デフォルトの名無しさん
2005/10/19(水) 06:25:17f1=fopen(a,"r");
でaにディレクトリからファイル名を入れたいんですが
どうすればいいんでしょうか?
環境はUNIXです
禿素人で申し訳ないですが教えて下さい
0036デフォルトの名無しさん
2005/10/19(水) 07:48:460037デフォルトの名無しさん
2005/10/19(水) 08:58:35fgets厨かどうかは兎も角、gets()は使用禁止。
>>35
「ディレクトリからファイル名を入れる」とはどういう概念ですか?
もしや、ディレクトリ内のファイル一覧を得たいとか?
それならば、環境依存になるので該当環境スレか初心者スレへ。
0038デフォルトの名無しさん
2005/10/19(水) 10:14:56何が原因かわかりません。どなたか、ご教授ください。
計算プログラムはFFT変換をしています。
0039デフォルトの名無しさん
2005/10/19(水) 10:15:260040デフォルトの名無しさん
2005/10/19(水) 10:23:12OSがフォアグラウンドタスクに処理を優先させるからだ。
コンパネシステムパフォーマンスでバックグラウンドを優先させて回線切手首吊ってスレ違いを悔いて市ね。
0041デフォルトの名無しさん
2005/10/19(水) 11:18:48ツンデレか?
>>38
スレタイ百回音読な
0042デフォルトの名無しさん
2005/10/19(水) 14:53:36reallocしたら、前に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を正しく使用する方法はありますでしょうか?
0043デフォルトの名無しさん
2005/10/19(水) 14:58:40004442
2005/10/19(水) 15:08:14なるほど。それは確認すべきでした。
今すぐ確認してみます。
004542
2005/10/19(水) 15:16:26もっと不規則なデータの壊れ方をしています・・・。
壊れている部分と壊れていない部分がまばらです。
004642
2005/10/19(水) 15:17:56ちなみにrealloc直前のデータは全て正常です。
0047デフォルトの名無しさん
2005/10/19(水) 15:25:14もっと単純なモデルでテストすることを進める。
ダブルポインタに起因する複合的なバグの可能性もあるから。
とりあえず
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;
で試してみぃ。
0048デフォルトの名無しさん
2005/10/19(水) 15:31:49あとは、size1 > size2になってるとかくらいかねぇ。
ライブラリのバグの可能性もあるけど。
004942
2005/10/19(水) 15:59:40単純なテストをmainの中でやる分には不可思議な現象は一切起こらないみたいです。
int を char や char * にしても問題はおきませんでした。
>>48
サイズはreallocの直前に更新しているので大丈夫そうです。
ライブラリのバグだとしたら怖いですね。
ハッシュテーブルのサイズ更新なので、サイズが素数なのが問題なのかと思ったり思わなかったりです。
2回目のサイズを23にしたり29にしたりで、壊れ方が違ったり、全く壊れなかったり、色々です。
2回目のサイズが同じなら問題は完全に毎回再現されます。
やはり、原因は全く別のところにあるのかもしれません。(おそらくポカミス?)
>>47の通りダブルポインタに起因する複合的なバグというやつかもしれません。
とりあえずreallocの代わりに、別口にmalloc→コピー→元のやつfreeでうまくいくのでそちらにしますが、他にバグがある可能性も頭に入れつつ色々探って見ます。
どうもありがとうございました。
0050デフォルトの名無しさん
2005/10/19(水) 16:07:15プログラム中でmallocなどで用いてる管理領域をぶっ壊してる可能性があった。
0051デフォルトの名無しさん
2005/10/19(水) 16:21:520052デフォルトの名無しさん
2005/10/19(水) 17:31:44うまくいきません。
#include<studio.h>
void main(void){
printf("hello,world");
}
とりあえずこのプログラムを打ってみてコンパイラ→実行をやってみたんですが
C:Documents and Settinds.....
続行するには何かキーを押してください・・・
と出るだけでした。アドバイスお願いします。
0053デフォルトの名無しさん
2005/10/19(水) 17:47:31int main(void) {
printf("hello,world");
return 0;
}
0054デフォルトの名無しさん
2005/10/19(水) 17:48:27exeはちゃんとできてるか?
0055デフォルトの名無しさん
2005/10/19(水) 17:55:20エラーメッセージは出てません。
"untitiled.exe"
っていうのは出てます。
0056デフォルトの名無しさん
2005/10/19(水) 18:35:07以前に同じファイル名で作成したものを実行してたりしないか?
005752
2005/10/19(水) 18:36:11整数を入力して10以下か以上かを答えさせる
プログラムを作っただけなんですが異様に感動した。
プログラマーが小学生のなりたい職業上位に入るのも頷けますね。
0058デフォルトの名無しさん
2005/10/19(水) 18:41:00STanDard Input/Outputの略・・・で合ってるよね
0059デフォルトの名無しさん
2005/10/19(水) 19:08:06を
スタジオエイチって読んでました
以後気をつけます。(´・ω・`)
0060おば
2005/10/19(水) 19:45:03サイズが不定のビットマップ画像を読み込む場合の処理を教えていただけないでしょうか?
0061デフォルトの名無しさん
2005/10/19(水) 19:48:29malloc
0062おば
2005/10/19(水) 19:50:240063デフォルトの名無しさん
2005/10/19(水) 19:51:090064デフォルトの名無しさん
2005/10/19(水) 20:00:31scanfが悪いのはわかるんですが
テンプレみても今いち分かりません
セグメンテーションエラーとかコアダンプの原因とかなんとか…
エロイ人教えて下さい
0065デフォルトの名無しさん
2005/10/19(水) 20:07:41char s[5];
gets(s);
で5文字以上入力があった場合配列を超えてデータが書き込まれるのはわかるだろ?
ユーザーが何文字入れるのかわからないのに、
前もって決まったサイズのバッファしか用意できないのが問題。
0066デフォルトの名無しさん
2005/10/19(水) 20:10:0265が答えてくれてるが、それぐらい自分で調べろ
manみりゃ書いてあるだろうが
0067デフォルトの名無しさん
2005/10/19(水) 20:50:290068デフォルトの名無しさん
2005/10/19(水) 20:51:530069デフォルトの名無しさん
2005/10/19(水) 20:57:28getsなんて使わないから存在すら忘れてた。
0070デフォルトの名無しさん
2005/10/19(水) 21:57:33thx
猫でもで勉強してるので知らなかったとです
0071デフォルトの名無しさん
2005/10/19(水) 22:43:53なんだ猫って読んだこと無いが、そんなことすら説明せずにgets使ってるのか
悪いことは言わんからとっととそんなのは梵書してK&R嫁
0072デフォルトの名無しさん
2005/10/19(水) 22:45:050073デフォルトの名無しさん
2005/10/19(水) 22:57:530074デフォルトの名無しさん
2005/10/19(水) 23:07:08焚書じゃないの?
0075デフォルトの名無しさん
2005/10/19(水) 23:08:150076デフォルトの名無しさん
2005/10/19(水) 23:09:120077デフォルトの名無しさん
2005/10/19(水) 23:11:410078デフォルトの名無しさん
2005/10/19(水) 23:20:14「ふんしょ」な?
0079デフォルトの名無しさん
2005/10/19(水) 23:38:30まず、size1 と size2 が、
それぞれどんな値の時に問題が起こっているのか調査したか?
していないなら、まずそこを調査スレ。
次に、
> /*
> ・・・ある程度使用して、もっとたくさん必要になってから・・・
> */
の処理を無処理にして問題が出るか?
出るなら、realloc()が悪いのではなく、
無処理にした処理の中で、どこかのデータを壊している可能性が非常に高い。
最後に、realloc()の戻り値は確認したか?
NULLが返ってきているにも関わらず、アクセスしていないか?
ついでに、
> ptr = (char**) realloc(ptr, size2 * sizeof(char*)); /* size2個の(char*)確保 */
realloc()はエラーの時、元の領域を開放せずにNULLを返す。
元領域のポインタに上書きするなどもってのほかだ。
0080デフォルトの名無しさん
2005/10/19(水) 23:58:52main()
{
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"};の宣言のところでエラーになるんだけど
どう直したらいいんだろう?
間違ってるのは分かるんだけどどうしたらいいかわからんよ。
0081デフォルトの名無しさん
2005/10/20(木) 00:04:280082デフォルトの名無しさん
2005/10/20(木) 00:07:180083デフォルトの名無しさん
2005/10/20(木) 00:07:210084デフォルトの名無しさん
2005/10/20(木) 00:08:160085デフォルトの名無しさん
2005/10/20(木) 00:09:34500×500の正方行列同士の積にかかる演算時間が1回当たり1.5〜1.7秒と芳しくありません。
何か問題があるのでしょうか?
もし、C++でGSLを利用している方がいらっしゃいましたら、↑の試行でどれくらいの時間を要しているのでしょうか?
0086デフォルトの名無しさん
2005/10/20(木) 00:18:37char *literals[] = {
"abc",
"def",
"ghi",
};
みたいなコード、見たこと無いのかよ。
0087デフォルトの名無しさん
2005/10/20(木) 00:20:080088デフォルトの名無しさん
2005/10/20(木) 00:20:13char** argv
でやる人も多いっぽいからしょうがないんじゃない?
0089デフォルトの名無しさん
2005/10/20(木) 00:26:20なにがまずいのでしょう?
0090デフォルトの名無しさん
2005/10/20(木) 00:28:34確かに*と[]を比較すると、[]の方が優先度が高い。
だから、char *literals[]; という宣言は、
まず、「literalsというのは配列である」というのが最初。
そして、「何の配列か?」の答えとして、「char *の配列」となる。
だから>>80の
char *name[5]={"1.txt","2.txt","3.txt","4.txt","5.txt"};
は、構文上は全く問題の無いコードで、
実際、コンパイルエラーにはならない。
0091デフォルトの名無しさん
2005/10/20(木) 00:30:55おまえは80か?
>>80がエラーになると言うのなら
まずそのエラーメッセージになんと書いてあるか読む。
それでわからないときでも「エラーメッセージ」くらい、書き込めよ。
0092デフォルトの名無しさん
2005/10/20(木) 00:39:37ちと仕事で詰まってるところがあって質問させてくれないか?
ポリゴンを書くためのデータ構造体で作っているんだがどうもそれがパディングを起こしているらしく、
そのデータで描画すると表示がおかしくなるんだ。
パディングを起こさないような構造体のメンバと其れに合わせたポリゴンのフォーマットにすればうまくいく。
で、#pragma packをつかってみたら元は64だったのが56になった。でも表示は違う壊れかたをしてしまう……。
アライメントは8。linuxでgccがコンパイラ。
けど、データの内容を変えるわけにも行かず、描画のためのストリームなので決まった順序で連続してないとだめだし。
先輩に聞いたら簡単に治せるらしいんだけど……1日考えても#pragma以外の解決案がわからない……。
まとめると
・#pragma pack(1)でやると64から54になる。だが表示がpackするまえとは別の壊れかたをする
・構造体のメンバをパディングしないようにbyte数の小さい変数に変え、それにあったフォーマットにすると思ったとおり表示される。
・描画用のストリームなので連続してないとだめ
・先輩いわく、簡単・即効で直せるらしい
何か思い当たることがあったら教えてくださいな……orz
アライメントの問題なんてVCとかでオプションで解決してたんだけどやっぱりちゃんと勉強しないとだめだね…。
0093デフォルトの名無しさん
2005/10/20(木) 00:41:14http://pc8.2ch.net/test/read.cgi/prog/1129569742/
0094デフォルトの名無しさん
2005/10/20(木) 00:52:31まず、問題になっている構造体と、
問題なく表示できる構造体の定義を晒してみろ。
009592
2005/10/20(木) 00:58:22short_vec2 uv;
int color;
short_vec3 pos;
};
上だとパディングしているようでカラーをshortにして16bitで表現した
struct VERTES{
short_vec2 uv;
short color;
short_vec3 pos;
};
なら問題なく表示されます。
0096デフォルトの名無しさん
2005/10/20(木) 00:59:580097デフォルトの名無しさん
2005/10/20(木) 01:02:36ってのはともかく
手動でダミーの詰め物を入れて
確実にアラインメントを揃えろって話じゃないかね。
0098デフォルトの名無しさん
2005/10/20(木) 01:04:42後者の書き方ではいけない理由がわからない。
0099デフォルトの名無しさん
2005/10/20(木) 01:06:51つか、intが32bitの環境なら、そもそも詰め物サイズの問題じゃなくて
下の書き方じゃないとダメじゃないの?
0100デフォルトの名無しさん
2005/10/20(木) 01:12:05これ以外に字面はintのままshort版とバイナリイメージを同一にする術はない。
010192
2005/10/20(木) 01:14:40説明不足すいません
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つの頂点のデータが入ってます・・・。
0102デフォルトの名無しさん
2005/10/20(木) 01:21:25uv1:2+2
color1:4
pos1:2+2+2
dummy:2
uv2:2+2
...
て感じ?
010392
2005/10/20(木) 01:28:09うーん、描画の関数的にそのダミーが無視されるのかどうか……
それこそ、使ってる関数調べなきゃあいけないんですけど全然書いてねぇっす……。
それについてはもっぺん調べてみます。
でも先輩の口ぶりから察すると連続したデータに出来るとかあるいは無視できるような指示が出来るのかと…。
うーん、俺の察しがそもそも勘違いなのじゃorz
010480
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で名前を取ってきたいんだけど、コンパイルは通るんだけど実行するとエラーになります。
お願いします。
0105デフォルトの名無しさん
2005/10/20(木) 01:29:09大学でプログラミング演習の講義があるんだけど
その講義で決まった教科書がないわけ
で、先生が「何でもいいから参考書を買え」
言ったから買おうと思ったんだが
どれがいいか分からないからアドバイスくれないか?
ちなみにまだ始めて1ヶ月未満のド初心者です
0106デフォルトの名無しさん
2005/10/20(木) 01:30:500107デフォルトの名無しさん
2005/10/20(木) 01:42:07必要としているデータがパディングが必要なのかどうかがわからんとどうしようもないな。
パディングされてはいけないのなら__attribute__((packed))使えばいいだろう。
各頂点データが8bytesの境界に揃っていないといけないのなら、頂点一つ分の構造体を作って、
それに__attribute__((aligned (8)))を指定すればいけるか?
あと、変数自体が8bytesアラインされていないといけないという可能性もあるが、
その場合も__attribute__でなんとかなったと思うが。
0108デフォルトの名無しさん
2005/10/20(木) 01:42:35「配列とポインタ」について勉強し直せ
010980
2005/10/20(木) 01:48:52勉強不足なのは分かってるんだがどうにも納得いかなくて落ち着かないんだ
どうしたらこれがうまくいくのか教えてクレヨン
0110デフォルトの名無しさん
2005/10/20(木) 02:07:05sFILE.filename には何文字入ると思う?
011192
2005/10/20(木) 02:09:12うーん。頂点一つがshort*2、32bit*1,short*3なんで14バイト
……これに2バイトいれると思ったとおり読み込まれるんで16バイトずつよみこまれてるみたい……。
__attribute__((packed))は#pragma packとおなじでなぜか壊れる。
色々調べたり聞いた情報をまとめるとおっしゃられるとおり、__attribute__をつかって((aligned (16)))で宣言して頂点4つを
一つの構造体に宣言するんじゃなく、一つの頂点のデータにして4つ配列にして先頭アドレス渡してみようって感じになりました。
とりあえず明日試してみます。
答えてくださった皆さん、ありがとうございましたm(__)m
0112デフォルトの名無しさん
2005/10/20(木) 02:18:34http://pc8.2ch.net/test/read.cgi/tech/1129043264/
こっちの方が適切q
0113104
2005/10/20(木) 02:42:08typedef 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型のアドレスを持てるだけだから直接文字列入れようとしちゃダメだったんだね
てかほんとにこれでいいのかな?
0114デフォルトの名無しさん
2005/10/20(木) 02:47:37何のためにポインタ使ってるの
0115104
2005/10/20(木) 02:54:05全部sprintfでファイル名つけるんじゃなくて
fp[i].filename="1.txt";
みたいにしたいところもあるから?
ていうか今度は
char name[255];
name="1.txt";
ってやるとコンパイル通らないのが何でかわからないよ
教えてほしいよ
0116デフォルトの名無しさん
2005/10/20(木) 02:54:21いまこそmallocをつかうときだ
0117デフォルトの名無しさん
2005/10/20(木) 02:56:06[8050h] ← [8051h] + [8052h] を計算し、符号付2進数加算としてのオーバーフローを判定する。
(オーバーフローのとき Cy ← 1、オーバーフローでないとき Cy ← 0 とする)
オーバーフローの判定方法を付け加えること。
0118デフォルトの名無しさん
2005/10/20(木) 02:56:36name[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");
0119デフォルトの名無しさん
2005/10/20(木) 02:57:58マルチするならせめて場所を選べよ。
0120117
2005/10/20(木) 03:00:10ごめんなさい。。。
0121104
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);
}
}
0122デフォルトの名無しさん
2005/10/20(木) 03:14:59typedef struct file{
FILE *fp;
char name[FILENAME_MAX];
}sFILE;
0123104
2005/10/20(木) 03:35:51FILENAME_MAX見てみたら260260260とかアフォみたいに大きいから使うのやめとくよ。。
0124デフォルトの名無しさん
2005/10/20(木) 03:41:07で、なんで配列に文字列リテラルを代入できないか分かってる?
0125デフォルトの名無しさん
2005/10/20(木) 03:43:340126115
2005/10/20(木) 04:11:11なんでだろう・・・
>>118の人が書いてるみたいに配列の要素1個に対して1文字しか入らないのは分かるけど
char a[15];
a="aaaaa";
ってやっちゃえば入るもんだと思ってたんだけどね・・。
でも考えて見ると
a=のaって配列の先頭アドレス指してるんだから入れれなくて当然なのかな?
でもchar a[15]="aaaaaa";ってやると入れれちゃうのはなんで・・?
0127デフォルトの名無しさん
2005/10/20(木) 04:27:49で、初期化にリテラルを使う形式は
なにか別の表記法の代わりと書いてなかったかね。
0128デフォルトの名無しさん
2005/10/20(木) 09:16:17フリーで使えるプリプロセッサ単体って無いの?
(VC++はないのでオプションは使えないです・・・)
0129デフォルトの名無しさん
2005/10/20(木) 09:19:29> でもchar a[15]="aaaaaa";ってやると入れれちゃうのはなんで・・?
それは、
char a[15] = { 'a','a','a','a','a','a','\0' };
の略記だから。
0130デフォルトの名無しさん
2005/10/20(木) 09:55:47>>126 みたいなの相手にしてると
こんなのばっかり集まって来るんで
適当に放置汁。
0131教えてください
2005/10/20(木) 11:52:46データの個数nとデータa1,a2.....anの値をファイルdate1.dから読みこみ、データと平均値の標準偏差を計算し結果をファイルdate2.dに出力するプログラムを作りなさい。
10個のデータは適当な数字を入れなさい。
0132デフォルトの名無しさん
2005/10/20(木) 11:57:570133デフォルトの名無しさん
2005/10/20(木) 11:59:48宿題は宿題スレへ。
ソフト作成依頼ならフリーソフトリクエストスレへ。
その他必要なら初心者スレなどへ。
0134デフォルトの名無しさん
2005/10/20(木) 13:11:15殆どのコンパイラにプリプロセッサは付いているはずだが?
例えばborland bccにはcpp32がある。
0135デフォルトの名無しさん
2005/10/20(木) 19:12:29ポインタ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++;
}
}
0136デフォルトの名無しさん
2005/10/20(木) 19:15:31エラーの内容と場所くらい書けないのか?このボケは
0137デフォルトの名無しさん
2005/10/20(木) 19:17:14ネタだろ
0138デフォルトの名無しさん
2005/10/20(木) 19:28:450139デフォルトの名無しさん
2005/10/20(木) 20:50:04>どこが間違ってるのか教えてください!!
場所も訊いてるじゃないか。
0140デフォルトの名無しさん
2005/10/20(木) 20:57:12mallocするサイズがcharの1文字分のみ
while (src != '\0')アドレスと比較してどうする!
src++; destは++しなくていいのか?
0141デフォルトの名無しさん
2005/10/20(木) 20:57:19constの方が型を明示できるし、constのキーワードだけで定数と想像がつきやすいので
ベターと思うのですが。
0142デフォルトの名無しさん
2005/10/20(木) 20:58:08毎回毎回似たようなやりとりで飽きてきたぞ。
0143デフォルトの名無しさん
2005/10/20(木) 21:02:04#defineの利点
・#defineで文字列を定義した場合だと連結ができる
・#defineで定義した定数が未使用の場合はメモリ確保されない(#defineは単なる置換だから)
constの利点
・型チェックをしてくれる
・複数箇所で定数を参照する場合、#defineに比べてメモリ節約になるかも
0144デフォルトの名無しさん
2005/10/20(木) 21:12:52constに代入してもコンパイルエラーにならないことがある。
0145デフォルトの名無しさん
2005/10/20(木) 21:35:360146デフォルトの名無しさん
2005/10/20(木) 21:38:02みんなC++のつもりで話をしているに違いない。
0147デフォルトの名無しさん
2005/10/20(木) 21:39:470148デフォルトの名無しさん
2005/10/20(木) 22:46:320149デフォルトの名無しさん
2005/10/20(木) 23:21:57プリプロセッサ単体のコードなら見たことあるよ
0150デフォルトの名無しさん
2005/10/20(木) 23:25:11Visual C++ ToolkitとかBorland C++みたいな無料のコンパイラを手に入れてその付属を使うしかないと思う。
0151デフォルトの名無しさん
2005/10/20(木) 23:30:50ttp://www.vector.co.jp/soft/maker/lsi/se002365.html
0152デフォルトの名無しさん
2005/10/21(金) 02:14:090153デフォルトの名無しさん
2005/10/21(金) 03:41:210154デフォルトの名無しさん
2005/10/21(金) 03:56:37略してアリ(ry
0155デフォルトの名無しさん
2005/10/21(金) 04:42:080156デフォルトの名無しさん
2005/10/21(金) 07:01:260157デフォルトの名無しさん
2005/10/21(金) 18:06:47とりあえず何を作るのがいいでしょうか?
なにか、こういうプログラムを作るといった目標を作ったほうがいいかなと思いまして。
0158デフォルトの名無しさん
2005/10/21(金) 18:13:12テキストエディタ
0159デフォルトの名無しさん
2005/10/21(金) 18:18:09ヒットアンドブロー
0160デフォルトの名無しさん
2005/10/21(金) 18:19:030161デフォルトの名無しさん
2005/10/21(金) 18:24:340162157
2005/10/21(金) 18:36:30作ってみたいのですが、ソースコード何行くらいになるんでしょうか?
>>159
ググって見ました。
これはなんか面白そうですね!
Cの学習に向いてそうです。
>>160
ググって見ました!
・・・・・・・なんだか、これは、、、、、すごそうですね。
C言語なんですか?
>>161
ググって見ました。
これも面白そうです。作ってみようと思います。
0163デフォルトの名無しさん
2005/10/21(金) 18:37:32void *な配列と関数は無敵ですよね?
なんでも有るがままに受け入れます。
但し下記プログラム中の:
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;
}
0164デフォルトの名無しさん
2005/10/21(金) 18:38:24int 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;
}
0165デフォルトの名無しさん
2005/10/21(金) 18:40:220166デフォルトの名無しさん
2005/10/21(金) 19:10:030167デフォルトの名無しさん
2005/10/21(金) 21:45:200168デフォルトの名無しさん
2005/10/21(金) 21:48:560169デフォルトの名無しさん
2005/10/21(金) 22:02:040170デフォルトの名無しさん
2005/10/21(金) 22:14:42void *と関数へのポインタとの相互には暗黙の変換はない。(相互のキャストすらできなくても良かった気がする)
つまりvoid *はオブジェクトへのポインタに対してのみ無敵。
0171デフォルトの名無しさん
2005/10/21(金) 22:54:39はご存知でしょうか?
K&Rの記法はなぜいけないのでしょうか?
0172デフォルトの名無しさん
2005/10/21(金) 22:57:360173daisuke0475
2005/10/21(金) 22:59:48私はC言語初めてでまだほとんどわかりません
javaはある程度わかるのですがCはまるっきりわかりません
ちなみに私はゲームを作るのにCを使おうと思っています
なのでどなたかCのコマンド(JAVAでいうタグ)辞典みたいなもの知りませんか?
もしも知っている方がいたら教えてください
0174デフォルトの名無しさん
2005/10/21(金) 23:04:16そのままずっとわからないでいて下さい。
0175デフォルトの名無しさん
2005/10/21(金) 23:04:56ここに助けを求めにきますた…_| ̄|○
問題は、「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);
}
なんとなく流れは分かるんですが、それを形にできないのです…_| ̄|○
超初心者で申し訳ないんですが、教えていただけるとありがたいです(´・ω・`)
0176デフォルトの名無しさん
2005/10/21(金) 23:05:540177デフォルトの名無しさん
2005/10/21(金) 23:06:45ここじゃない
>>1読め
0178デフォルトの名無しさん
2005/10/21(金) 23:10:33C/C++の宿題を片づけます 51代目
http://pc8.2ch.net/test/read.cgi/tech/1128493272/
0179デフォルトの名無しさん
2005/10/21(金) 23:11:040180デフォルトの名無しさん
2005/10/21(金) 23:19:35その発言いけないというは取り消します。
0181デフォルトの名無しさん
2005/10/21(金) 23:27:080182デフォルトの名無しさん
2005/10/21(金) 23:45:15トン!
すまんかった(´・ω・`)
0183167
2005/10/22(土) 00:21:36�d
0184デフォルトの名無しさん
2005/10/22(土) 00:24:17古いANSIにね
0185デフォルトの名無しさん
2005/10/22(土) 03:29:25Average 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
0186デフォルトの名無しさん
2005/10/22(土) 05:22:08http://docs-pdf.sun.com/819-1608/819-1608.pdf
0187デフォルトの名無しさん
2005/10/22(土) 11:57:020188デフォルトの名無しさん
2005/10/22(土) 15:44:02>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 *)が無敵の証では
ないでしょうか?
0189デフォルトの名無しさん
2005/10/22(土) 16:06:52無敵ではなく無法なんだよ。
0190デフォルトの名無しさん
2005/10/22(土) 16:36:56最後にはvoid*にはvoid**,void***も格納されるようになった。
伝説のプログラムの誕生である。
0191デフォルトの名無しさん
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;
}
0192デフォルトの名無しさん
2005/10/22(土) 16:53:36#ifndef FREE
free(p);
#endif
#define FREE
これって結構煩わしいですよね?そこでこの部分を
そっくり
#define SAFEFREE(p)というような形でマクロ化したい
のですがどうしたら良いのか?分かりません。
このマクロ定義方法をご教示下さい。
0193デフォルトの名無しさん
2005/10/22(土) 16:55:08mallocで確保した二次元配列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によってメモリにアクセスした際に何かを壊してしまっているのでしょうか?
0194デフォルトの名無しさん
2005/10/22(土) 16:56:54if (なんか) {
break;
}}
この場合でbreakまで行ったらどうなるの?
while文も抜け出す?
0195デフォルトの名無しさん
2005/10/22(土) 16:57:02>ptr が NULL の場合には、なんの動作も行われない。
これって処理系依存なのかな? 規格だと思ってたんだけど?
>191 は初期化でNULLを入れて、後freeしたらNULLを入れて、ってやればそれですむ
0196デフォルトの名無しさん
2005/10/22(土) 17:00:450197デフォルトの名無しさん
2005/10/22(土) 17:14:31for( 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したならば貴方の推測は正しいのでしょう。
以上。
0198デフォルトの名無しさん
2005/10/22(土) 17:15:17ANSI の書き方はこうで、K&R の書き方はこうでの例が詳しく書い
ているものがあると更に助かります。
(K&RからANSIへ変更しての移植作業で時間掛けずにを修正を簡単に
したい。見直したい。思いがあります。)
0199デフォルトの名無しさん
2005/10/22(土) 17:19:53なんかout[max1][max2]とかout[max1]って、いかにも確保した領域からはみ出たとこ参照してそうだね。
mallocをどうやったのか知らんけど。
おそらくout[i][j]とかの間違い?
>>194
while文「も」、というかwhile文「を」抜け出す。
ifはbreakと関係ないよ。
0200194
2005/10/22(土) 18:26:56for (なんか) {
break;
}}
じゃあこれはどうなんでしょう?
breakに来たとき、「外側のforも抜け出す」か「内側のforのループを
抜け出して外側のforへ行く。終わらせるためにはbreakがもう一つ必要」か。
0201デフォルトの名無しさん
2005/10/22(土) 18:33:400202デフォルトの名無しさん
2005/10/22(土) 19:16:52free(p);
#endif
#define FREE
激わろたwwww
0203193
2005/10/22(土) 19:32:48その際に扱いを間違えていたようでした。
お手数かけてすみません。
0204デフォルトの名無しさん
2005/10/22(土) 19:59:09どのようにするのが一般的でしょうか。
250ビットくらいの整数を扱いたいと思っています。
0205デフォルトの名無しさん
2005/10/22(土) 20:01:050206デフォルトの名無しさん
2005/10/22(土) 21:41:33そんなに安全にメモリを解放したければC++使え。
0207デフォルトの名無しさん
2005/10/22(土) 21:43:050208デフォルトの名無しさん
2005/10/22(土) 22:32:49ここで初めて聞いたんだが
0209デフォルトの名無しさん
2005/10/22(土) 22:42:300210デフォルトの名無しさん
2005/10/22(土) 22:43:130211デフォルトの名無しさん
2005/10/22(土) 22:45:45新卒の就職希望者がよくそういうのを耳にする。
どうやら専門学校辺りで言うらしい。
ちなみに、「ダブルポインタはばっちりですけどトリプルポインタは自信がありません」と
言っていた香具師は、ポインタをまともに理解していなかった。
0212デフォルトの名無しさん
2005/10/22(土) 23:01:320213デフォルトの名無しさん
2005/10/22(土) 23:06:52"double pointer"だと16,300ヒットする。
0214デフォルトの名無しさん
2005/10/22(土) 23:12:38そりゃdouble*の方が引っかかるからね。
0215デフォルトの名無しさん
2005/10/22(土) 23:35:35*a[0];
*a[];
上記の違いを述べよ
0216デフォルトの名無しさん
2005/10/22(土) 23:37:19なんて言葉が出てくる時点で、ポインタをちゃんと理解できてないと分かるね。
0217デフォルトの名無しさん
2005/10/22(土) 23:55:05禿同
0218デフォルトの名無しさん
2005/10/22(土) 23:56:56「int ****」とか「int ****************」とかは何て呼ぶつもりなんだろうね?
0219デフォルトの名無しさん
2005/10/22(土) 23:59:476:sextuple, 7:septuple, 8:octuple, 9:nonuple, 10:decuple
0220デフォルトの名無しさん
2005/10/23(日) 00:00:490221デフォルトの名無しさん
2005/10/23(日) 01:38:45英語だと ** は double pointer ではなく pointer to pointer。
**************** なんかは pointer with 16 stars とか 16 dereferences あたりかな?
4つくらいなら頑張って「pointer-to-pointer-to-pointer-to-pointer-to-int」とか言うかもw
0222デフォルトの名無しさん
2005/10/23(日) 01:41:120223デフォルトの名無しさん
2005/10/23(日) 01:44:110224デフォルトの名無しさん
2005/10/23(日) 02:37:45警告:関数’exit’の暗黙の宣言 なるエラーが出るのですが、これは何ですか?
0225デフォルトの名無しさん
2005/10/23(日) 02:41:18とりあえずstdlib.hインクルード
0226デフォルトの名無しさん
2005/10/23(日) 02:49:41直りました^^ありがとうございます。
exit()関数は、stdlib.hと ¢(..)メモ しておきます。
0227デフォルトの名無しさん
2005/10/23(日) 03:12:06どうするのですか?
0228デフォルトの名無しさん
2005/10/23(日) 03:13:47#pragma warning(disable:8065)
としても、プロトタイプ宣言がないという警告が全部表示されてしまいます。
ソースの一部分だけを抑制したいので、オプションの-w-8065にはしたくないのです。
(実際には他にも8004と8008も抑制したい部分があります)
どうしたら警告を表示させないようにできるでしょうか?
0229デフォルトの名無しさん
2005/10/23(日) 03:20:20標準Cにはそのような関数はありません
自作してください
0230デフォルトの名無しさん
2005/10/23(日) 03:22:44その pragma は VC++ のでは。
0231デフォルトの名無しさん
2005/10/23(日) 03:27:22なんと、そうなのですか。
bccで同様のこと(部分的に警告抑制)をするのは無理ということでしょうか?
0232デフォルトの名無しさん
2005/10/23(日) 05:42:11bcc のマニュアルの #pragma のところを見るか、
Borland C++ スレで聞いてくれ。
0233デフォルトの名無しさん
2005/10/23(日) 05:50:25でもK&R第1版の頃、つまりANSI規格化前の書式で書かれたソースは
読みにくいぞ。ANSI 以降に覚えたヤツにとっては。
0234228
2005/10/23(日) 06:18:36どうやらBCCに付属してきたヘルプには、プリプロセッサのディレクティブの説明は見当たらないので、専用のスレで聞いてみたいと思います。
レスどうもでした。
0235228
2005/10/23(日) 06:27:14タダで使えるBorland C++ Part4
をROMっていたら#pragma optionというのを見かけたので、ためしに
#pragma option -w-8065
としたらできました!
コマンドラインオプションをそのままソース中に書く感じみたいです。
助言のおかげで助かりました。ありがとうございます。
恥ずかしながらpragmaは標準みたいなものだと勘違いしていたので、>>230のレスにも感謝です。
0236デフォルトの名無しさん
2005/10/23(日) 07:10:57$#xでは 0x5になってしまって困ってます
0237デフォルトの名無しさん
2005/10/23(日) 07:11:560238デフォルトの名無しさん
2005/10/23(日) 07:19:350239デフォルトの名無しさん
2005/10/23(日) 07:57:58なんで0のときに0xがつかないんでしょうか。
0240デフォルトの名無しさん
2005/10/23(日) 10:20:19>(X 変換の場合には `0X') が前に付与される。
0242デフォルトの名無しさん
2005/10/23(日) 10:45:530243デフォルトの名無しさん
2005/10/23(日) 10:51:040244デフォルトの名無しさん
2005/10/23(日) 13:13:49御意。
ただ、初期化のNULLを入れっぱなしで、
後それを使えますかね?
0245デフォルトの名無しさん
2005/10/23(日) 13:18:04意味がわからん。
0246デフォルトの名無しさん
2005/10/23(日) 13:24:38>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
これ自体をマクロ化する方法は無いでしょうか?
と問うておる訳です。マクロのネストは可能
なんでしょうかねぇ。
0247デフォルトの名無しさん
2005/10/23(日) 13:28:18酔っているのか?
もう一回聞きたいことをまとめてみろ
0248デフォルトの名無しさん
2005/10/23(日) 13:31:07マクロなんかで解決しようとしている時点で終わってるよ。
0249デフォルトの名無しさん
2005/10/23(日) 13:32:07はいはい。Javaが貴方を待っているよ。
0250デフォルトの名無しさん
2005/10/23(日) 13:32:37できない。 あきらめろ。
0251デフォルトの名無しさん
2005/10/23(日) 13:34:02void f() {
char* p = malloc(SIZE);
if (foo()) {
SAFEFREE(p);
return;
} else {
bar();
}
SAFEFREE(p);
}
0252デフォルトの名無しさん
2005/10/23(日) 13:37:52そもそも、freeされたかどうかの情報をプログラム中にグローバルで静的に
持とうという考えが間違ってる気がする。
if(なんかの条件){
#ifndef FREE
free(p);
printf("メモリは解放されました。\n");
#endif
#define FREE
}
// ここでfreeを呼ぼうとするが
#ifndef FREE
free(p);
printf("メモリは解放されました。\n");
#endif
#define FREE
//呼ばれない。
0253デフォルトの名無しさん
2005/10/23(日) 13:55:390254デフォルトの名無しさん
2005/10/23(日) 14:02:02int *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;
}
}
0255デフォルトの名無しさん
2005/10/23(日) 14:19:09(これはファイルからリダイレクトで読み込む)
平均点
学生毎の学生番号、得点、平均との差、評価(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
0256デフォルトの名無しさん
2005/10/23(日) 14:22:320257デフォルトの名無しさん
2005/10/23(日) 14:24:440258デフォルトの名無しさん
2005/10/23(日) 15:22:010259デフォルトの名無しさん
2005/10/23(日) 15:25:03お前の魅力と同じだよ
0260デフォルトの名無しさん
2005/10/23(日) 17:20:000261デフォルトの名無しさん
2005/10/23(日) 18:46:32マクロはコードを制御出来ますよね。即ち無敵です。
そのマクロ自体を制御するにはどうしたら良いのか?
一連の発言における目的はかなり射程が大きいのです。
例えば
#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");
}
0262デフォルトの名無しさん
2005/10/23(日) 18:47:23#if 1
KOE(1);
KOE(2);
KOE(3);
KOE(4);
//これは動くが意味が無い。
#else
for(i=1;i<=4;i++)
KOE(i);
//と関数配列っぽくやってみたが動かない!
#endif
return 0;
}
この関数マクロ配列が動く方法あればご教示下さい。
#elseを外せってのは無しで…
0263デフォルトの名無しさん
2005/10/23(日) 18:50:54阿呆すぎ。
0264デフォルトの名無しさん
2005/10/23(日) 18:52:01まぁ自分なら素直に関数テーブル使うけど。
0265デフォルトの名無しさん
2005/10/23(日) 18:53:15> とか、単なるコード上の文字置換えであれば可能ですよね?
> それが出来ないのです。
そんなコンパイラ捨ててしまえ。
0266デフォルトの名無しさん
2005/10/23(日) 18:55:55> マクロはコードを制御出来ますよね。即ち無敵です。
こんなこといっている奴に未来はない。
0267デフォルトの名無しさん
2005/10/23(日) 18:56:35defineディレクティブの中にプリプロセッサ命令を入れることは出来ないよ。
0268デフォルトの名無しさん
2005/10/23(日) 18:57:43射程が大きいのはいいことだが、
せめて定石くらいはマスターした方がいいかと。
0269質問です。
2005/10/23(日) 19:15:010270デフォルトの名無しさん
2005/10/23(日) 19:18:360271デフォルトの名無しさん
2005/10/23(日) 19:27:45コードそのものを制御したいならlispでも使いなさい
0272デフォルトの名無しさん
2005/10/23(日) 19:29:170273デフォルトの名無しさん
2005/10/23(日) 20:15:48はぁ?プリプロセッサの役割わかってから出直してきてください
0274デフォルトの名無しさん
2005/10/23(日) 20:16:33デバグでプリプロセッサ使えるようになってからにしろ
0275デフォルトの名無しさん
2005/10/23(日) 20:22:240276デフォルトの名無しさん
2005/10/23(日) 20:24:14無敵ではなく無駄とか無謀とか無策(ry
0277デフォルトの名無しさん
2005/10/23(日) 21:32:17関数ポインタを勉強してきてください。
0278質問です。
2005/10/23(日) 21:45:570279デフォルトの名無しさん
2005/10/23(日) 22:24:02とにかくマクロ置き換えの結果に再びプリプロセッサディレクティブが現れても、
プリプロセッサはそいつを認識しない。だからお前が考えていることはできない。
0280デフォルトの名無しさん
2005/10/23(日) 22:53:27ttp://www1.cts.ne.jp/~clab/hsample/Mem/Mem3.html
ここにソースがありますが、これだと「0番目と1番目の間に当たる単語」をキーとした場合、「見つかりません」という表示がでませんよね?
(ex)この場合attoaのように)
これはどのようにして解決すればよいのでしょう?
0281デフォルトの名無しさん
2005/10/23(日) 23:31:13> BSearch(key, base, middle, top + 1);
> else
この部分を削除。main()から呼ぶときにデータの個数をtopに渡すようにする。
あと再帰からの戻り値を上に返してないし、これ動作確認とってないんじゃないか?
0282デフォルトの名無しさん
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 )
0283デフォルトの名無しさん
2005/10/23(日) 23:34:05> return (middle);
へんだけど、この部分だけたどって返されているのかとおもた?
0284デフォルトの名無しさん
2005/10/23(日) 23:42:34こう書くと、パラメータ 'a' は int * 型として定義されている と覚えておいて良いでしょうか?
0285デフォルトの名無しさん
2005/10/23(日) 23:44:550286デフォルトの名無しさん
2005/10/23(日) 23:44:59int[]型
0287デフォルトの名無しさん
2005/10/23(日) 23:57:51名にそれ
0288285
2005/10/23(日) 23:58:380289デフォルトの名無しさん
2005/10/24(月) 00:01:04そこは関数の引数だからそのとおり。
>>286
いや、だからそこは関数の引数だからさ。
>>287
intの配列型
>>289
ガッ
0290デフォルトの名無しさん
2005/10/24(月) 00:07:31乙
0291デフォルトの名無しさん
2005/10/24(月) 00:11:57配列とポインタでの参照は相互に変換可能だけど配列を渡したのだから配列と見るべき
と、宗教論争に持ち込んでみる
0292デフォルトの名無しさん
2005/10/24(月) 00:14:490293デフォルトの名無しさん
2005/10/24(月) 00:14:58pgr
0294285
2005/10/24(月) 00:22:51トンクスコ^^
0295デフォルトの名無しさん
2005/10/24(月) 00:41:27char *a[]と宣言したら、char型ポインタを要素として持つ配列
char (*a)[]と宣言したら、char型配列へのポインタ
という意味でしょうか?
0296デフォルトの名無しさん
2005/10/24(月) 00:49:280297デフォルトの名無しさん
2005/10/24(月) 00:49:470298デフォルトの名無しさん
2005/10/24(月) 00:53:42つーか試した結果はどうだったのかな
0299デフォルトの名無しさん
2005/10/24(月) 02:16:13言葉の通りの意味。
0300デフォルトの名無しさん
2005/10/24(月) 03:28:25現在のファイル位置表示子の位置(指定された位置からのオフセットを返すのが望ましい)を調べるには、
どのような関数が提供されていますか?
0301デフォルトの名無しさん
2005/10/24(月) 03:34:34がそれっぽい関数ですね・・お騒がせしました
0302デフォルトの名無しさん
2005/10/24(月) 04:13:03int i=3;
n=*addres+i;
という形で良いのでしょうか?
nに加算されたアドレスが入るはずと思い↑は書きました。
0303デフォルトの名無しさん
2005/10/24(月) 04:18:42つ[初心者歓迎スレ]
つ[初心者質問スレ]
0304デフォルトの名無しさん
2005/10/24(月) 04:38:40やりたいこともわからんし、nの型もわからん
0305デフォルトの名無しさん
2005/10/24(月) 04:42:390306デフォルトの名無しさん
2005/10/24(月) 05:07:57ポインタに数値を加える = 参照メモリアドレスを変更する
0307デフォルトの名無しさん
2005/10/24(月) 13:08:160308デフォルトの名無しさん
2005/10/24(月) 15:25:54注:関数内での方程式の解を外部変数 answer1, answer2へ代入するような関数にすること。
ってあるんだですが、どうやってプログラムを作ればいいんですか?どんなプログラムを作っていいか全くわからないのですが・・・。
0309デフォルトの名無しさん
2005/10/24(月) 15:33:550310デフォルトの名無しさん
2005/10/24(月) 15:37:27> 注:関数内での方程式の解を外部変数 answer1, answer2へ代入するような関数にすること。
虚数解はどんな振る舞いをすればわからない関数。
外部変数に値を代入する関数。
そんな糞関数は作れてもここで晒す気にはなれんな。
0312デフォルトの名無しさん
2005/10/24(月) 15:57:11どういう意味ですか。
0313デフォルトの名無しさん
2005/10/24(月) 15:59:07ANSIで定義している型は実装依存で実現できる範囲が厳格に定義されてないけど
実体を持つライブラリとしては厳格に定義したいそれで、gintとかgcharを定義した
0314デフォルトの名無しさん
2005/10/24(月) 16:01:170315デフォルトの名無しさん
2005/10/24(月) 16:15:06そのための戻り値 int だろうに・・・。
0316デフォルトの名無しさん
2005/10/24(月) 18:47:060317デフォルトの名無しさん
2005/10/24(月) 19:19:54だめ。というよりすれ違いでここで話するのもだめ。
0318デフォルトの名無しさん
2005/10/24(月) 21:06:57#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)
って出るんですけどどこが間違いですか?
0319デフォルトの名無しさん
2005/10/24(月) 21:14:06お前の頭
0320デフォルトの名無しさん
2005/10/24(月) 21:17:52あと、出来るだけデフォルトでintの時でも値を返してください。
0321320
2005/10/24(月) 21:18:550322デフォルトの名無しさん
2005/10/24(月) 21:45:00Segmentation faultの直接原因は恐らくfscanf()で"%d"に対してchar *を渡していること。
しかし、それを解決したところで期待したとおりの動きになるかどうかは知らん。
アルゴリズムについても意見を求めたいなら初心者スレなどへ。
0323デフォルトの名無しさん
2005/10/24(月) 21:45:39なにを指摘しているの?
2行目も意味不明だし。
0324デフォルトの名無しさん
2005/10/24(月) 21:49:250325デフォルトの名無しさん
2005/10/24(月) 21:51:140326デフォルトの名無しさん
2005/10/24(月) 22:07:54んなもんで Segmentation fault するわけねーだろよく見ろ氏ね
0327デフォルトの名無しさん
2005/10/24(月) 22:09:280328デフォルトの名無しさん
2005/10/24(月) 22:12:180329デフォルトの名無しさん
2005/10/24(月) 22:13:26さよなら・さよなら・・さよなら
0330デフォルトの名無しさん
2005/10/24(月) 22:22:55突込みどころたくさんすぎなので、初心者スレ逝け。
デバッガの使い方くらい覚えろ。もしくはプログラム書くな。迷惑だ。
>>322
確実にへんな動作だろうな。コード見ただけで激しく凶暴な気分に…
まして fprintf(,"%d",); fscanf(,"%d",) こんな組み合わせで、
書き込んだ数値をまともに読み直せるわけもなし。
fopen(,"a+") でこんなことすんのかよ…
つか、やりたいことはおそらく、ファイルに保存を途中で挟まないで
簡単にできるので、このコード捨て。
0331デフォルトの名無しさん
2005/10/24(月) 22:25:04char*に対してintアクセスしたらfaultしない?
0332デフォルトの名無しさん
2005/10/24(月) 22:39:010333デフォルトの名無しさん
2005/10/24(月) 22:43:51TerminateThread()ただし、ほぼリークするけど。
つか、強制終了させなきゃならないケースなんてそんなに無いはず。
もしその状況が頻繁に起こるなら、設計を見直すべき。
0334デフォルトの名無しさん
2005/10/24(月) 22:43:51>>1
0335デフォルトの名無しさん
2005/10/24(月) 22:56:06>>332
答えは333なんだが、これ以上聞くなら以下に移動してくれ。
ちなみに、_beginthreadexはwin32限定の関数だ。
Win32API質問箱 Build36
http://pc8.2ch.net/test/read.cgi/tech/1128951330/
マルチスレッドプログラミング相談室 その3
http://pc8.2ch.net/test/read.cgi/tech/1098268137/
0336デフォルトの名無しさん
2005/10/24(月) 23:24:56すいませんでした。
0337デフォルトの名無しさん
2005/10/25(火) 00:34:49charszTmpFile[_MAX_PATH];
strcpy( szTmpFile, "" );
例2:
charszTmpFile[_MAX_PATH];
szTmpFile[0] = '\0';
例1と2は同じ動きだと思うのですが
それぞれ意図するところが違うのでしょうか?
それとも単に好みの問題?
0338デフォルトの名無しさん
2005/10/25(火) 00:36:07char szTmpFile[_MAX_PATH];
strcpy( szTmpFile, "" );
例2:
char szTmpFile[_MAX_PATH];
szTmpFile[0] = '\0';
0339デフォルトの名無しさん
2005/10/25(火) 00:47:28意図は書いた本人にしかわからん。
0340デフォルトの名無しさん
2005/10/25(火) 00:49:580341デフォルトの名無しさん
2005/10/25(火) 00:51:48// 割り切れる
}
else {
// 割り切れない
}
0342デフォルトの名無しさん
2005/10/25(火) 00:53:490343デフォルトの名無しさん
2005/10/25(火) 00:53:55「好みの問題」が結論だと思う。
関数参照のオーバーヘッドが云々という人がいるかも知れないが、
この種のことが問題になる開発は希少だ。
#私は szTmpFile[0] = 0; と書くぞw
0344デフォルトの名無しさん
2005/10/25(火) 00:54:32どうもありがとう。
0345デフォルトの名無しさん
2005/10/25(火) 00:58:22どうもありがとう。
szTmpFile[0] = 0; と書くことにします。
0346デフォルトの名無しさん
2005/10/25(火) 01:05:23ご迷惑をおかけしました!!
0347デフォルトの名無しさん
2005/10/25(火) 01:21:33ログインウィンドウを作ってみたいのですが、
外部ファイルの文字列を読み込んで比較とかできるでしょうか?
もし読めたとしてもユーザ名とパス両方を比較となると難しそうです。
このようなプログラムはどのようにかかれているのでしょうか?
0348デフォルトの名無しさん
2005/10/25(火) 01:23:33それは分かりづらいだろ
0349デフォルトの名無しさん
2005/10/25(火) 02:45:540350デフォルトの名無しさん
2005/10/25(火) 02:56:100351デフォルトの名無しさん
2005/10/25(火) 02:57:100352デフォルトの名無しさん
2005/10/25(火) 03:01:550353デフォルトの名無しさん
2005/10/25(火) 03:03:28そーなのか
例えばどんな・・?
恐ろしい関数だな
0354デフォルトの名無しさん
2005/10/25(火) 03:28:13i & 3 == 0 なら 4 で割り切れるってこと。
0355デフォルトの名無しさん
2005/10/25(火) 08:20:10double 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の型は構造体の配列へのポインタであっているでしょうか?
0356デフォルトの名無しさん
2005/10/25(火) 09:16:41何も考えなくても参照渡しするようにできるからじゃない?
0357デフォルトの名無しさん
2005/10/25(火) 09:49:12直感的には判り辛い。
「4の剰余」と「下2ビット」は
結果が同じでも意味が違う。
0358デフォルトの名無しさん
2005/10/25(火) 10:16:24なにそのtypedef?初めて見たんだけど。
typedef mpz_poly_t * mpz_poly;
とは違うんか?詳しい人、漏れからも解説キボンヌ。
0359デフォルトの名無しさん
2005/10/25(火) 10:23:33void 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);
}
こんな感じで、
& とかつける必要が無くなるし、
そのまま変数定義にも使える、
というトリック。
0360名無し
2005/10/25(火) 10:27:34Yamada、Yoshizaki、Suzuki、Kato、Kamata、Kuwata、Maeda
をポインタ配列へ登録し、イニシャルを入力するとそのイニシャルを持つ名前のみを表示するプログラムを作成しなさい
なお、イニシャルの入力はmain()関数にて行い、ユーザ関数は、判別表示のみで行なうようにすること。
どなたかオチカラをm(__)m
0361デフォルトの名無しさん
2005/10/25(火) 10:33:250362デフォルトの名無しさん
2005/10/25(火) 10:43:26どうして「どんな処理をするべきか」を自分で考えないのだろうか?
0363デフォルトの名無しさん
2005/10/25(火) 10:47:360364名無し
2005/10/25(火) 10:51:13すいませんでした。
0365デフォルトの名無しさん
2005/10/25(火) 11:30:55初心者かどうかに関わらず、>>1 も読まない奴なんてそんなもの。
0366デフォルトの名無しさん
2005/10/25(火) 12:30:39間違った使い方をすると鼻から悪魔が出てくる可能性がある。
# まだ俺は見たこと無いけどな。
間違った使い方をすると、2度と立ち上がらなくなる
# 一度だけやってしまった...
ま、最近はそこまで悲惨な結果になることはないけどな。
0367デフォルトの名無しさん
2005/10/25(火) 12:35:30それは、scanf()に限った話じゃなかろう
0368デフォルトの名無しさん
2005/10/25(火) 14:30:46だが、初心者が一番嵌りやすい関数であることは確かだな。
可変長引数のポインタ渡しなどというCでも上位ランクの凶悪な関数だ。
0369デフォルトの名無しさん
2005/10/25(火) 14:49:340370デフォルトの名無しさん
2005/10/25(火) 14:52:280371デフォルトの名無しさん
2005/10/25(火) 15:50:04表記を簡潔にするためのテクニックでしたか。
親切にありがとうございます。
>>358
たぶん、
typedef mpz_poly_t * mpz_poly;
mpz_poly poly;
だと、値などを構造体へ代入する場合に、
初期化 poly = malloc(sizeof(mpz_poly_t));が必要になるのだと思う。
0372デフォルトの名無しさん
2005/10/25(火) 16:38:14もちろん開放もね。
構造体の代入をする際に * が必要になるというのが
今ひとつといえば今ひとつなところか。
構造体を戻り値にできないという欠点もあるが、
これは引数を通して受け渡したので問題ないだろう。
0373デフォルトの名無しさん
2005/10/25(火) 18:07:32Visual C++ .net 2003のMFCアプリケーションなんですが
エディタボックスに何も入力していない場合を
判断するにはどうすればよいのですか?
0374デフォルトの名無しさん
2005/10/25(火) 18:36:06あっはっはっ、>>1 見ろよこいつぅ( ´∀`)つ)Д゚)
0375デフォルトの名無しさん
2005/10/25(火) 23:05:57char buf[8]; などはよく見る光景です。
ですが例えば
char *buf = "012345";
char buf1[strlen(buf)];
とbuf1を宣言しますと"[ ]には定数式を指定してください"などとエラーが発生します。
このような宣言は、Cでは認められていないのでしょうか?
0376デフォルトの名無しさん
2005/10/25(火) 23:07:52それより前なら独自拡張してある処理系じゃないと駄目。
0377デフォルトの名無しさん
2005/10/25(火) 23:11:41その用途だけなら、char buf1[sizeof("012345") - 1];でいける。
0378デフォルトの名無しさん
2005/10/25(火) 23:35:15int i;
int n;
short hex;
short char_to_hexstr(char c); /* ASCII文字を16進数2文字に変換 */
char *rindex(const char *s, int c); /* 末尾から文字列検索 */
こういう書き方があるのですが、これは何でしょうか?
関数プロトタイプをmainの中で宣言している ということなのでしょうか?
0379デフォルトの名無しさん
2005/10/25(火) 23:38:090380デフォルトの名無しさん
2005/10/25(火) 23:39:01古いスタイル(K&R)に馴れた人がよくそう書くので要注意。
0381デフォルトの名無しさん
2005/10/25(火) 23:40:21参考になります。
0382デフォルトの名無しさん
2005/10/25(火) 23:49:17もう6年も経つのに
0383デフォルトの名無しさん
2005/10/25(火) 23:51:57まだ基準がANSIだからな・・・・・・
0384デフォルトの名無しさん
2005/10/25(火) 23:54:01それを言うならC83では・・・
0385デフォルトの名無しさん
2005/10/25(火) 23:56:00どうにかならんのか。
0386デフォルトの名無しさん
2005/10/26(水) 13:18:25未だにgcc-2.95な古い環境と、組み込み系あたりがマズそう、というのは予想できるんだけど。
gccについては、こんなんがあった。
ttp://gcc.gnu.org/c99status.html
0387デフォルトの名無しさん
2005/10/26(水) 13:22:15使えるようになる予定もございません
0388デフォルトの名無しさん
2005/10/26(水) 13:32:570389デフォルトの名無しさん
2005/10/26(水) 17:10:53Cで認められるのはlong doubleの80bitなのですが、これよりも大きな値を扱いたい場合どのような
変数を宣言すればよいでしょうか
場合によってはwindows.hを含んでも構いませんので..
0390デフォルトの名無しさん
2005/10/26(水) 17:15:53多倍長整数でも作る
0391デフォルトの名無しさん
2005/10/26(水) 17:21:13認められない長さの変数を宣言する??
0392デフォルトの名無しさん
2005/10/26(水) 17:47:33整数ならまだ(unsigned )long long intがある。
(今のところ大抵の処理系では64bitになっている)
それでも足りなければ>>390
0393デフォルトの名無しさん
2005/10/27(木) 00:08:46char 型の変数 a、b があり、b の下位2ビットだけを a にコピーしたいのですが
(上位6ビットの値は変更せず)、綺麗な方法が思いつきません。
a >> 2;
a << 2;
a |= (b & 0x3);
という方法をとっているのですが、
これだと、上から3,4ビット目だけをコピーなどといった場合、複雑になってしまいます。
スマートな方法はないでしょうか。
0394デフォルトの名無しさん
2005/10/27(木) 00:14:070395デフォルトの名無しさん
2005/10/27(木) 00:15:53a &= ~(0x3);
a |= b & 0x3;
unsigned bitSet(unsigned a, unsigned b, unsigned window)
{
return a & ~mask | b & window;
}
0397デフォルトの名無しさん
2005/10/27(木) 01:24:11double 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には互換性がないのでしょうか?
0398デフォルトの名無しさん
2005/10/27(木) 01:27:47BCC のバグかどうかに関しては知らん。
0399デフォルトの名無しさん
2005/10/27(木) 01:34:43%dと%fって互換がないんですね・・
0400デフォルトの名無しさん
2005/10/27(木) 01:42:240401デフォルトの名無しさん
2005/10/27(木) 01:43:280402デフォルトの名無しさん
2005/10/27(木) 03:34:49互換あるわけねーーーー!!!
0403デフォルトの名無しさん
2005/10/27(木) 07:29:34>return a & ~mask | b & window;
return a & (0xff-window) | b & window;
でもいいかな。と、ちょっと理解していないんだが。
0404395
2005/10/27(木) 07:54:15>>403
それだと、型が変わるたびに書き換えないといけなくなるので、マクロ化やC++のテンプレートに応用することを考えるとちょっと弱い。
0405デフォルトの名無しさん
2005/10/27(木) 08:50:02union {
char a;
struct {
unsigned int la : 2
unsigned int ha : 2
};
};
char b;
la = b;
0406デフォルトの名無しさん
2005/10/27(木) 10:42:49long long は「Cで認められ」ているだろうに
0407デフォルトの名無しさん
2005/10/27(木) 12:20:220408デフォルトの名無しさん
2005/10/27(木) 15:48:290409default新規
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)
0410デフォルトの名無しさん
2005/10/27(木) 18:26:15宿題スレ
0411デフォルトの名無しさん
2005/10/27(木) 18:43:39マルチすんな糞が
0412デフォルトの名無しさん
2005/10/27(木) 18:59:330413デフォルトの名無しさん
2005/10/27(木) 19:08:13ただ、スペースで区切ってひとつひとつを構造体(スタックの仕組みで)に入れていきたいんです。
簡単にでもいいので是非教えてください
0414デフォルトの名無しさん
2005/10/27(木) 19:08:580415413
2005/10/27(木) 19:12:57「I am a student」と入力したら
「I」というポインタを指し示した構造体があり、
その構造体が次の構造体を指し示して「am」というポインタを指し示している。
というような流れのプログラムです。
0416デフォルトの名無しさん
2005/10/27(木) 19:26:560417デフォルトの名無しさん
2005/10/27(木) 19:29:43>その構造体が次の構造体を指し示して「am」というポインタを指し示している。
意味不明wwww
出直して来い
0418デフォルトの名無しさん
2005/10/27(木) 19:33:530419デフォルトの名無しさん
2005/10/27(木) 19:35:50>TIME関数
>TIME関数
>TIME関数
そもそもスレ違いな質問に、それで答えたつもりか。
0420デフォルトの名無しさん
2005/10/27(木) 20:22:27>その構造体が次の構造体を指し示して「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使え。
0421デフォルトの名無しさん
2005/10/27(木) 20:29:44コメントは無視して数字だけ読み込むにはどうしたらいいのでしょうか?
#色々コメント
13,15
#コメント
1,1,1,1
1,1,1,1
な感じです
fscanf(fp, "%s %d,%d", str, &a, &b);
とやれば無理矢理読み込めますが
コメントが2行になったりサイズによっては読み込め無くなります
0422デフォルトの名無しさん
2005/10/27(木) 20:31:21コンパイルすると「fp1,fp2が未定義です」とFILE fp1,fp2の行を
指定してエラーが出るのですが(以下fp1,fp2を使っている所も同様)
なぜでしょうか?
0423デフォルトの名無しさん
2005/10/27(木) 20:35:58FILE *
0424デフォルトの名無しさん
2005/10/27(木) 21:26:00まずfgetsでとった後いろいろやればいい。
そのあとscanf使いたいんならsscanf
0425デフォルトの名無しさん
2005/10/27(木) 21:37:170426デフォルトの名無しさん
2005/10/27(木) 21:38:120427デフォルトの名無しさん
2005/10/27(木) 21:54:34#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;
}
0428デフォルトの名無しさん
2005/10/27(木) 21:55:58{
printf("ファイルオープンできません\n");
}
else{
for(f=-10;f<=10;f++){
f = f++;
fprintf(fp1,"%f\n",f);
0429デフォルトの名無しさん
2005/10/27(木) 21:57:01if(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;
}
以上です。
0430デフォルトの名無しさん
2005/10/27(木) 22:00:05t = -5;
FILE *fp1,*fp2;
を
FILE *fp1,*fp2;
Ts = 1;
t = -5;
にしてみ
0431デフォルトの名無しさん
2005/10/27(木) 22:06:060432デフォルトの名無しさん
2005/10/28(金) 06:25:14aaaaaaaccccc
↑
ここにbbbbをいれる感じ
0433デフォルトの名無しさん
2005/10/28(金) 06:34:390434デフォルトの名無しさん
2005/10/28(金) 07:16:270435デフォルトの名無しさん
2005/10/28(金) 07:18:460436433
2005/10/28(金) 07:29:480437デフォルトの名無しさん
2005/10/28(金) 08:13:040438デフォルトの名無しさん
2005/10/28(金) 08:14:42その数だけ読み込みたい場合はどうすればよろしいでしょうか?
#読み込む個数
10
#読み込むデータ
1,2,3,4,5,6,7,8,9,10
0439デフォルトの名無しさん
2005/10/28(金) 08:25:44個数読み込んで、forで回せばいいんじゃまいか?
0440デフォルトの名無しさん
2005/10/28(金) 11:25:45うむ。萌えるシチュエーションだな。大好きだ。
>>432
一時的なバッファを使うなら a、b、c の順にコピー。
使わないなら、c を memmove して (strcpy じゃダメ)
b をコピー。
0441デフォルトの名無しさん
2005/10/28(金) 11:48:39ってのをチェックする事ってできるんでしょうか。
0442デフォルトの名無しさん
2005/10/28(金) 12:16:59コンパイルしてみて通ったら定義されている
0443デフォルトの名無しさん
2005/10/28(金) 12:23:09#define BYTE unsigned char
#endif
0444デフォルトの名無しさん
2005/10/28(金) 12:40:26プリプロセスの #if で判定したい・・・というのであれば、
基本的にはできない。
そもそもプリプロセスの段階では
typedef とかの意味解析はされないし。
ただ、typedef とは別に目印となるマクロが定義されていれば、
それが定義されてるかどうかでチェックすればいい。
BYTE や DWORD だったら _WINDEF_ でいいとは思うけど、
コンパイラのバージョンが上がった際に変更を受ける危険性はあるかもしれない。
一応 #if でコンパイラのバージョン制限をしといて、
バージョンが違ったら #error 吐くようにして、
_WINDEF_ で判定できるか確認するようなメッセージを書いとくといいと思う。
確認できたら、バージョン制限をいじる、と。
>>443
型として定義されているかどうかって言ってるだろうがよォォォォ!
なんでマクロになってるんだ?! このド低脳がァァァ!!!
0445デフォルトの名無しさん
2005/10/28(金) 12:47:21やっぱ普通には出来ないですか・・
特定の環境(VCとか)なら_WINDEF_等でもいけるんですけど、それはやっぱり機種ごとに書いてる
のと同じな気がするので。
ありがとうございました。
0446デフォルトの名無しさん
2005/10/28(金) 13:01:590447デフォルトの名無しさん
2005/10/28(金) 14:30:01コンパイラごとにチェックするマクロを変えるしかないね。
これは正直言って、仕方がない。
0448助けてください
2005/10/28(金) 14:39:59For文を使います。IF文は不可です。
0449もうテンプレ嫁、とか言うの疲れた
2005/10/28(金) 14:44:05死ねばいいと思うよ
0450デフォルトの名無しさん
2005/10/28(金) 14:50:18環境依存な書き方にすぎないのだから、何をいまさら。
typedef 等のチェックは(マクロに限らないちゅうに)
configure(GNU autoconf)等みたく、サンプルのコンパイルの
成否を(半自動などで)確認せざるをえない、スレ違い。
0451デフォルトの名無しさん
2005/10/28(金) 15:25:57UnixもアセンブラからCに書き直されたんだ、Javaでできんこともあるまい
とCスレで喧嘩を売ってみる
0452デフォルトの名無しさん
2005/10/28(金) 16:06:04C#を引き合いに出せよ。
と喧嘩を買ってみる
0453デフォルトの名無しさん
2005/10/28(金) 16:23:08自分でそれに相当するものを定義すればいい。
typedef unsigned char Byte;
typedef unsigned int DWord;
とか。
これが BYTE や DWORD と同じサイズになるように定義する。
まあ、これも short, int, long のサイズによって
定義を変えなきゃいけないという環境依存があるんだが・・・。
プリプロセスでは sizeof は使えないので、
UINT_MAX や CHAR_BIT などの値から
型のバイト数を割り出す必要がある。
0454デフォルトの名無しさん
2005/10/28(金) 16:26:44ダメだろそんなんじゃ
UnixだってC+アセンブラで書かれてるんだ、Java+JNIで良いじゃないか
と行かないと
0455デフォルトの名無しさん
2005/10/28(金) 16:35:11環境依存なコードを実装しながら途中で
環境に依存しないコードを作ろうと思い立ったというのが真相ではなかろうか。
0456デフォルトの名無しさん
2005/10/28(金) 16:40:330457デフォルトの名無しさん
2005/10/28(金) 16:42:140458デフォルトの名無しさん
2005/10/28(金) 17:00:410459デフォルトの名無しさん
2005/10/28(金) 17:39:24ファイル最後のオフセットを0xFFFFとします。
例えば0xFF01〜0xFF02を
0xFF01 DE
0xFF02 0F
から
0xFF01 FF
0xFF02 FF
に変更したい場合まず、fseekでFF01にシークを変更しますよね。
そこでfprintfでFFの値を二回書き込めば、0xFF01と0xFF02にはちゃんとFFFFが格納されます。
しかし困った事に追記なので、ファイル最後のオフセットが0x10001になってしまうのです。
(ファイルはただ書き込んだ分だけずれて、全体として容量が増えてしまう!!)
これを防ぐには全体を一度ずらすか、新しくファイルを作ってトレースするのでしょうか?
またはそのデータをファイルから削除するなどという方法があるのでしょうか?
0460デフォルトの名無しさん
2005/10/28(金) 17:43:420461デフォルトの名無しさん
2005/10/28(金) 17:44:070462改行出来ない人
2005/10/28(金) 19:53:03C言語で改行(半角\n)を入力して上書き保存をしようとすると
write error が発生して保存出来ません。
\n がないと上書き保存出来るので原因は\nだと思います。
viで改行を認識させるにはどうしたら良いのでしょう?
お願いします。
0463デフォルトの名無しさん
2005/10/28(金) 20:09:18×改行出来ない人
○頭がかわいそうな人
0464デフォルトの名無しさん
2005/10/28(金) 20:15:10スレ違い。初心者スレに行ってくれ。つーか、「シークを変更」ってなにさ。
>>462
鼬害。ソフト板に行ってくれ。つーか、何をしたくて何をしたんだか。
0465デフォルトの名無しさん
2005/10/28(金) 21:56:490466デフォルトの名無しさん
2005/10/28(金) 22:45:49vi使わなければいいんじゃない?
LINUXは詳しくないけど、viなんかよりずっと使いやすいエディッタは転がってるよ
0467デフォルトの名無しさん
2005/10/28(金) 22:51:05UNIX板にある
>>466
冗談よしこちゃん
0468デフォルトの名無しさん
2005/10/28(金) 22:56:250469デフォルトの名無しさん
2005/10/28(金) 23:06:59なんか、マウス使う機会がかなり減った気がする。
Cのインデントはちょっと気に入らないけど....
0470デフォルトの名無しさん
2005/10/28(金) 23:08:300471デフォルトの名無しさん
2005/10/28(金) 23:19:15テキストのスクリプトファイルを読み込んで動作するプログラムを作っているのですが
"1+1*2"みたない文字列の答えを出すライブラリーとか無いですか?
0472デフォルトの名無しさん
2005/10/28(金) 23:22:560473デフォルトの名無しさん
2005/10/28(金) 23:52:55文字列は文字列であって、答えなどない
0474デフォルトの名無しさん
2005/10/29(土) 00:00:34自分で作ってみるのはどうですか?
0475デフォルトの名無しさん
2005/10/29(土) 00:22:33レスありがとうです
やはり自分で作るしかないみたいですね。
少し作ってみたけど結構面倒で”(”とかくるとヤバイ
0476デフォルトの名無しさん
2005/10/29(土) 00:58:20bcでできるけど。そうではなく?
0477デフォルトの名無しさん
2005/10/29(土) 01:08:29自作するなら、bison と flex を使うと幾分か楽かと。
全部自作してもいいけど。
0478デフォルトの名無しさん
2005/10/29(土) 01:08:43ほー!
vcしか使った事ないので知らなかったです
bcではどうやるのですか?
bcでDLL作って呼び出してみようかとおもってます。
0479デフォルトの名無しさん
2005/10/29(土) 01:11:11vcを使わないといけないので使えないです;;
0480デフォルトの名無しさん
2005/10/29(土) 01:34:29なんでvcだと使えないの?
つーかむしろbison+flexが妥当だろうね
0481デフォルトの名無しさん
2005/10/29(土) 02:23:020482デフォルトの名無しさん
2005/10/29(土) 03:08:110483デフォルトの名無しさん
2005/10/29(土) 03:13:410484デフォルトの名無しさん
2005/10/29(土) 03:23:520485デフォルトの名無しさん
2005/10/29(土) 03:31:16最近は全然読んでないから、どんな議論が行われているか知らないが。
そこそこリンクも見つかるだろ、たぶん。
0486デフォルトの名無しさん
2005/10/29(土) 04:19:25ここのことかな。
「コンパイラ・スクリプトエンジン」相談室7
http://pc8.2ch.net/test/read.cgi/tech/1129287390/
>>484
↑の>>2-10に大量にリンク張ってあるからそこそこ見つかると思われ。
0487デフォルトの名無しさん
2005/10/29(土) 04:24:29四則演算+カッコ程度なら、簡単に作れる。
0488デフォルトの名無しさん
2005/10/29(土) 04:43:20>>485を書き込んだ後、
このスレへのリンクを張るというボケをちょっとだけ期待したのは内緒
http://pc8.2ch.net/test/read.cgi/tech/1111363360/
0489デフォルトの名無しさん
2005/10/29(土) 04:53:00ワロスwそこのスレ時々のぞくとオモロイ
0490デフォルトの名無しさん
2005/10/29(土) 10:39:450491デフォルトの名無しさん
2005/10/29(土) 10:41:53ftp://ftp.dnsbalance.ring.gr.jp/pub/GNU/
0492デフォルトの名無しさん
2005/10/29(土) 10:43:58面倒だからといい加減な説明で質問すると
いい加減な答えしか返ってこないぞ。
0493デフォルトの名無しさん
2005/10/29(土) 12:14:06http://www.koders.com/
0494デフォルトの名無しさん
2005/10/29(土) 12:25:30すげぇ、ありがおつごじます
0495デフォルトの名無しさん
2005/10/29(土) 16:03:54すげぇタイポだなwwwwwwwww
0496デフォルトの名無しさん
2005/10/29(土) 21:43:50(動きませんけど)
func(path)
char *path;
{
int fd;
char *a;
return (-1);
}
0497デフォルトの名無しさん
2005/10/29(土) 21:50:45そうだな。
pathの宣言の仕方が一番の特徴。
あとreturnに括弧をつけるのも今では廃れた。
0498デフォルトの名無しさん
2005/10/29(土) 21:56:03ANSI 対応のコンパイラだとエラーや警告ができません。
それは、正しく解釈していると考えてよいでしょうか。
0499デフォルトの名無しさん
2005/10/29(土) 21:57:47初期のCからいわゆるANSI−Cへの過度的なスタイルだね
0500デフォルトの名無しさん
2005/10/29(土) 22:34:52一応ANSI CでもK&Rスタイルは認められている。
ただし非推奨で将来的には規格から削除すると書かれている。
0501デフォルトの名無しさん
2005/10/29(土) 22:41:56なるほど、とりあえずOKだが、おすすめできない
スタイルということですね。
0502デフォルトの名無しさん
2005/10/29(土) 22:44:26このスタイルもおすすめできない
0503デフォルトの名無しさん
2005/10/29(土) 22:59:59char *command_name;
main(int argc, char *argv[])
{
if((command_name = rindex(argv[0],'/')) != NULL)/*コマンド名の獲得*/
command_name++;
else
command_name = argv[0];
//
0504デフォルトの名無しさん
2005/10/29(土) 23:07:33実行ファイル名は、ctohexです
$ ./ctohex
0505デフォルトの名無しさん
2005/10/29(土) 23:10:54command_nameのポインタで指している場所を1進めている。
0506デフォルトの名無しさん
2005/10/29(土) 23:11:18後者はポインタを進めて次の文字を参照
前者は文字「/」、rindexなんてBSDのみの関数しらねーよ
0507デフォルトの名無しさん
2005/10/29(土) 23:12:57'/' はスラッシュの文字コードを表す int 型の定数(おそらく 47)
command_name++ は外部変数の値を1だけ増加させる
0508デフォルトの名無しさん
2005/10/29(土) 23:17:12ああ、そういうのもK&Rスタイルというのか
「インデントの仕方に何でコンパイラが文句を付けるんだ?」と一瞬悩んでしまた
ちなみに規格の用語ではそういうのは「プロトタイプスタイルでない定義」といいまつ
0509デフォルトの名無しさん
2005/10/29(土) 23:23:21よろしければ、どういうのが K&R スタイルとお考えかお聞かせ願えませんか
0510デフォルトの名無しさん
2005/10/29(土) 23:25:31K&Rで書かれてる奴だろ
0511デフォルトの名無しさん
2005/10/29(土) 23:31:12K&Rに掲載されているコードのクローン?
0512503.504
2005/10/29(土) 23:34:33有り難うございます。command_nameに ctohexの c のアドレスが、
もしくは 配列argv[0] のアドレス (.のアドレス) が代入されるのですね。
0513デフォルトの名無しさん
2005/10/29(土) 23:35:41"K&Rスタイル"でぐぐって1番上に来るやつ
if (...) {
のように、{ の前で改行しない書き方
0514デフォルトの名無しさん
2005/10/29(土) 23:38:46なまおのノリだなw
0515デフォルトの名無しさん
2005/10/29(土) 23:45:480516503.504
2005/10/29(土) 23:52:070517デフォルトの名無しさん
2005/10/29(土) 23:52:290518デフォルトの名無しさん
2005/10/29(土) 23:58:24べつにいいけど、期待した動きかどうかは…
0519デフォルトの名無しさん
2005/10/29(土) 23:59:50コンパイルがエラーにならないかどうかと言うだけなら>>518
0520デフォルトの名無しさん
2005/10/30(日) 00:04:20ポインタ変数自体がautoって意味なら別にそれ自体は問題ではないよ。
0521デフォルトの名無しさん
2005/10/30(日) 00:04:50質問が曖昧だが
1.autoオブジェクトを指すポインタを返す
2.autoクラスのポインタオブジェクト(が格納している値)を返す
どっち?
1なら>>518
2ならそれ自体は別に問題ない
0522デフォルトの名無しさん
2005/10/30(日) 00:15:31すいません、質問の仕方が悪かったです。
以下の違いがわかりません。
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 )
です。
0523デフォルトの名無しさん
2005/10/30(日) 00:18:02〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ <こいつら最高にアホ
彡、 |∪| /
/ __ ヽノ /
(___ ̄\ /
(_ノノノ│
∪
0524デフォルトの名無しさん
2005/10/30(日) 00:21:030525デフォルトの名無しさん
2005/10/30(日) 00:21:31void 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]);
とするとエラーがでてコンパイルが通りません。
何がいけないのか教えてくれませんか?
0526デフォルトの名無しさん
2005/10/30(日) 00:23:000527デフォルトの名無しさん
2005/10/30(日) 00:23:23bufferはtestから抜けるときに消滅する。
前者ではこれから消滅するものへのポインタを返すのがまずい。
後者はこれから消滅するものだけどその中身(のコピー)を返しているから問題ない。
ちなみにこれは平気。文字列自体はプログラムの実行している間ずっと存在するので、そこへのポインタを扱っても問題ない。
const char *test(void) {
const char *str = "test";
return test;
}
(char buffer[]="test";ではtest関数ローカルの変数bufferを"test"で毎回作り出していることになるので、
testの呼び出し毎にbufferは作られてなくなる)
0528デフォルトの名無しさん
2005/10/30(日) 00:23:50環境依存スレ行ってこい
そもそもここはC
0529デフォルトの名無しさん
2005/10/30(日) 00:49:06書いていただいたソースで理解できました。bufferは配列の先頭要素を指すポインタなので、
配列へのポインタを返しても、呼び出し側に戻ったときすでに配列は消えていて、配列に入っていた値を参照できない。
ってことなんですね。
難しいっす。
0530デフォルトの名無しさん
2005/10/30(日) 09:40:00そういうことだ。
0531デフォルトの名無しさん
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;
}
0532デフォルトの名無しさん
2005/10/30(日) 17:56:33realloc
0533デフォルトの名無しさん
2005/10/30(日) 17:56:59とりあえず、realloc
0534533
2005/10/30(日) 17:58:090535531
2005/10/30(日) 18:09:050536デフォルトの名無しさん
2005/10/30(日) 19:20:18またまた、関数ポインタで不思議な状況に
遭遇しました。関数ポインタの引数は
どうなっているんでしょうかねぇ?
#include <stdio.h>
void boyaki(void){
printf("なんでロッテなんやぁ?\n");
}
void monku(int n){
int i;
for(i=n;i--;printf("なんでやタイガーズ!\n"));
}
0537デフォルトの名無しさん
2005/10/30(日) 19:20:52void (*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;
}
0538デフォルトの名無しさん
2005/10/30(日) 19:43:13言っている意味がわからんが?
そもそもVCではコンパイルすら通らない。
0539デフォルトの名無しさん
2005/10/30(日) 19:48:35void (*okasi_yanaika)(void);//引数無し関数ポインタ
void (*okasiiAry[1])(void);//引数無し関数ポインタ配列
0540デフォルトの名無しさん
2005/10/30(日) 20:27:34当方VC++エンプラ版だけど・・・
余程安物のVC++じゃないの?
それとも:
reallocって良いでしょう?ところで
またまた、関数ポインタで不思議な状況に
遭遇しました。関数ポインタの引数は
どうなっているんでしょうかねぇ?
これも一緒にコンパイルしたのかなぁ?
0541デフォルトの名無しさん
2005/10/30(日) 20:37:130542デフォルトの名無しさん
2005/10/30(日) 20:41:34536+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)' : 実引数が多すぎます。
0543デフォルトの名無しさん
2005/10/30(日) 20:42:00でも不思議だと思わん?
0544デフォルトの名無しさん
2005/10/30(日) 20:45:42某スレと良い、君も好きだねぇ
啓蒙活動w
0545デフォルトの名無しさん
2005/10/30(日) 20:48:11char c;
int *p = (int*)&c;
*p = 0x123456;
0546デフォルトの名無しさん
2005/10/30(日) 20:48:58おいおい!ホントかよぉ。こちらは
実行結果:
なんでロッテなんやぁ?
なんでロッテなんやぁ?
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんで引数の無い関数が引数とれるんじゃぁ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
Press any key to continue
こうなってんだけどぉ。誰か他のもっとましなコンパイラもってる人!
やってみてくれないかなぁ?
0547デフォルトの名無しさん
2005/10/30(日) 20:49:37VIPPERでもわかる C言語プログラミング
http://pc8.2ch.net/test/read.cgi/tech/1129913775/
0548デフォルトの名無しさん
2005/10/30(日) 20:52:160549デフォルトの名無しさん
2005/10/30(日) 20:52:20charは根がintじゃけん。それは当たり前です。
0550デフォルトの名無しさん
2005/10/30(日) 20:54:21このスレが何のスレだか判っていますか?
或いは、あなたは自分が何をしているのか判っていますか?
0551デフォルトの名無しさん
2005/10/30(日) 20:55:300552デフォルトの名無しさん
2005/10/30(日) 20:55:490553デフォルトの名無しさん
2005/10/30(日) 20:56:510554デフォルトの名無しさん
2005/10/30(日) 21:03:08void(*f)(); のような関数ポインタと配列が
引数を取ってかつ、それをちゃんと計算するってぇ、話題が
このスレでは荒らしになるのでしょうか?
0555デフォルトの名無しさん
2005/10/30(日) 21:05:330556デフォルトの名無しさん
2005/10/30(日) 21:06:410557デフォルトの名無しさん
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
0558デフォルトの名無しさん
2005/10/30(日) 21:20:18そりゃC++(ry
>>546
あー、あるファイルで void func(void) を実装していながら
別ファイルで void func(int) とプロトタイプをうたって呼び出せるのと
あんまりかわらないような。
0560デフォルトの名無しさん
2005/10/30(日) 22:03:49謳うという意味で書いたんだけど、そう解釈されても差し支えないですね
0561デフォルトの名無しさん
2005/10/30(日) 22:07:48ちょっと前のgoogle並みだなw
0562デフォルトの名無しさん
2005/10/30(日) 22:07:510563デフォルトの名無しさん
2005/10/30(日) 22:17:270564デフォルトの名無しさん
2005/10/30(日) 22:46:250565デフォルトの名無しさん
2005/10/30(日) 23:20:35ワカランちゃんにはそれがわからんのです。
0566デフォルトの名無しさん
2005/10/30(日) 23:22:19別に変だとは思わないが
0567デフォルトの名無しさん
2005/10/30(日) 23:29:070568デフォルトの名無しさん
2005/10/30(日) 23:37:080569デフォルトの名無しさん
2005/10/31(月) 02:05:480570デフォルトの名無しさん
2005/10/31(月) 02:07:29サイズ増減した場合でも同じ領域が使われる事もあるかもしれないし。
0571デフォルトの名無しさん
2005/10/31(月) 02:13:17なってるみたいだ。C言語的な仕様ではないと思うけど。
0572デフォルトの名無しさん
2005/10/31(月) 02:23:25"変数型 変数名"で宣言された変数はどう扱いが違うのか、イマイチ解りません。
わかりやすく解説が載っている参考サイトなど無いでしょうか
0573デフォルトの名無しさん
2005/10/31(月) 02:25:14{
int counter = 0;
return counter++;
}
int count2()
{
static int counter = 0;
return counter++;
}
これをそれぞれ300回呼んで戻り値チェックしてみろ
0574デフォルトの名無しさん
2005/10/31(月) 02:25:180575デフォルトの名無しさん
2005/10/31(月) 02:37:11適当に書いてみるテスト
同じstaticでも関数の中で宣言した変数につけたのと
関数の外で宣言した変数につけたのでは全く意味が違います
(C++だとクラスの中で宣言した変数につけたのもまた意味が違う)
関数内のstatic変数
普通のローカル変数は関数からリターンすると変数の内容は失われますが、
static変数の場合は関数からリターンしてもその内容が保持されます。
int test()
{
static int a = 0;/*ここのstaticをつけたりはずしたりして繰り返し呼んでみよう*/
a++;
return a;
}
関数外のstatic変数
通常グローバル変数は、リンクされるすべてのソースからアクセスすることができますが、
staticをつけると、変数のスコープ(その変数にアクセスできる範囲)がソースファイル内に限定されます。
0576デフォルトの名無しさん
2005/10/31(月) 02:54:22はぁ、なるほど
解りやすい解説とソースコードをありがとうございます。
0577575
2005/10/31(月) 03:24:380578デフォルトの名無しさん
2005/10/31(月) 04:00:380579デフォルトの名無しさん
2005/10/31(月) 04:39:430580デフォルトの名無しさん
2005/10/31(月) 04:48:59文字定数('で囲んだ文字のこと、'A'とか)の型がintだからだと思う
0581デフォルトの名無しさん
2005/10/31(月) 07:46:20ヒント:暗黙のプロモーション、プロトタイプ宣言の省略
0582デフォルトの名無しさん
2005/10/31(月) 08:51:400583デフォルトの名無しさん
2005/10/31(月) 09:46:03・int
・double
・ポインタ
しか使われないようになっている。
0584デフォルトの名無しさん
2005/10/31(月) 09:58:06・typedef 型
・構造体
もあるな。
でも、char はない。
0585デフォルトの名無しさん
2005/10/31(月) 12:45:15void (*fl2[])() = {
func1,
func2,
func3,
NULL,
};
void (*pFList2)() = *fl2;
for (; *pFList2; pFList2++) {
(*pFList2)();
}
どうも終端判断とインクリメントするコンパイルエラーが取れません(for文の所)
何か妙案は無いでしょうか
0586デフォルトの名無しさん
2005/10/31(月) 12:47:290587デフォルトの名無しさん
2005/10/31(月) 12:54:27atexitに失敗した場合、それ以前にatexitしてあった関数は終了時に実行されますか?
0588デフォルトの名無しさん
2005/10/31(月) 13:18:38void (**pFList2)() = fl2;
for (; *pFList2; pFList2++) {
(*pFList2)();
}
0589デフォルトの名無しさん
2005/10/31(月) 14:01:08激しくサンクス!
0590デフォルトの名無しさん
2005/10/31(月) 14:36:08>>588 でできるけど、typedef した方が分かりやすい。
0591デフォルトの名無しさん
2005/10/31(月) 17:24:54どんなふうにtypedefすればいい?
0592デフォルトの名無しさん
2005/10/31(月) 17:34:41fphoge fl2[] = { ... };
fphoge* pFList2 = fl2;
0593デフォルトの名無しさん
2005/10/31(月) 20:24:57これのclassメンバ関数版にトライしてみたが挫折・・・
0594デフォルトの名無しさん
2005/10/31(月) 20:25:55Node *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;
}
エラーが出て途中でストップしてしまいました。
なので、
0595デフォルトの名無しさん
2005/10/31(月) 20:27:12Node *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;
}
やはり途中で止まってしまいました。
どの辺りがおかしいでしょうか?
よろしくお願いします。
0596デフォルトの名無しさん
2005/10/31(月) 20:29:540597デフォルトの名無しさん
2005/10/31(月) 20:41:13どこまで実行できてるかprintfしてみる程度の
頭を使って欲しいものだ
0598デフォルトの名無しさん
2005/10/31(月) 21:09:41void (ClassName::*fl2[])() = {
&ClassName::func1, ...
};
0599デフォルトの名無しさん
2005/10/31(月) 21:49:37Node *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);
}
0600デフォルトの名無しさん
2005/10/31(月) 22:58:48感動した!
0601デフォルトの名無しさん
2005/10/31(月) 23:21:51たかが ** くらいで typedef が必要なアフォハケーン
0602デフォルトの名無しさん
2005/10/31(月) 23:22:36C++ スレで聞いてみ
瞬殺で回答くるよ
0603デフォルトの名無しさん
2005/10/31(月) 23:25:030604デフォルトの名無しさん
2005/10/31(月) 23:28:59問題の位置が分かってないアフォだな。
関数ポインタを typedef しないやつはオナニープログラマだという話だ。
0605デフォルトの名無しさん
2005/10/31(月) 23:35:57自分がわからないからってな個人的事情を知らん奴に押しつけることこそ「問題の位置」だよ
0606デフォルトの名無しさん
2005/10/31(月) 23:39:53会社のプロジェクトでプログラム作るときは他人が読むことを考えて可読性を上げた方がええわな。
0607デフォルトの名無しさん
2005/10/31(月) 23:40:52だから俺ルールを可読性って言うなよ
0608デフォルトの名無しさん
2005/10/31(月) 23:41:38あんた個人の金切り声は
内容が同じでも意味が全く違うんだよ
0609デフォルトの名無しさん
2005/10/31(月) 23:44:390610デフォルトの名無しさん
2005/10/31(月) 23:55:170611デフォルトの名無しさん
2005/11/01(火) 00:00:50可読性の問題もあるけど、戻り値や引数の型を変えたい時に困るだろ?
0612デフォルトの名無しさん
2005/11/01(火) 00:07:19「常識」の理由がころころ変わるなよ・・・
まあいい、それで何個の関数の戻り値や引数の型を変えたくなったんだ?
0613デフォルトの名無しさん
2005/11/01(火) 00:12:40他のスレでも全然sageてないし。
0614デフォルトの名無しさん
2005/11/01(火) 00:13:070615デフォルトの名無しさん
2005/11/01(火) 00:27:38独学ではじめてみようと思うんですが・・・・
0616デフォルトの名無しさん
2005/11/01(火) 00:30:450617デフォルトの名無しさん
2005/11/01(火) 00:31:02過去ログサイトのテンプレ
0618デフォルトの名無しさん
2005/11/01(火) 00:33:421つじゃ騙されるから複数ちゃんぽん
0619デフォルトの名無しさん
2005/11/01(火) 00:37:01サイトまわってStarEditなるものを見つけてきますた
0620デフォルトの名無しさん
2005/11/01(火) 00:45:170621デフォルトの名無しさん
2005/11/01(火) 00:46:14戻り値や引数の型でタイプミスの可能性が増えるからだろ?
0622デフォルトの名無しさん
2005/11/01(火) 01:02:14コンパイル通らんだろ
0623デフォルトの名無しさん
2005/11/01(火) 01:02:400625デフォルトの名無しさん
2005/11/01(火) 01:09:400626デフォルトの名無しさん
2005/11/01(火) 01:11:090627デフォルトの名無しさん
2005/11/01(火) 01:11:47どういうことだ?
0628デフォルトの名無しさん
2005/11/01(火) 01:13:200629デフォルトの名無しさん
2005/11/01(火) 01:38:470630デフォルトの名無しさん
2005/11/01(火) 01:42:46引数ないならいいけど、引数が4個くらいあるとイヤになる。
0631デフォルトの名無しさん
2005/11/01(火) 01:51:25afo* voke;
afo sine {} //ill-formed
0632デフォルトの名無しさん
2005/11/01(火) 01:56:030633デフォルトの名無しさん
2005/11/01(火) 01:56:28実際にやってみりゃええやん。
0634デフォルトの名無しさん
2005/11/01(火) 01:59:13開発環境はVS2003です。よろしくお願いします
0635デフォルトの名無しさん
2005/11/01(火) 02:07:40VC コンパイル で検索してみたの?
0636デフォルトの名無しさん
2005/11/01(火) 02:16:240637デフォルトの名無しさん
2005/11/01(火) 02:40:02atexitを失敗させる方法が思いつきません。どうしたらいいですか?
0638デフォルトの名無しさん
2005/11/01(火) 02:46:040639587
2005/11/01(火) 08:47:01なるほど!そんな手があったんですね!・・・と思って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失敗後にきちんと全部の関数が呼ばれました。
これはどう解釈すべきでしょうか?
(というか、できれば標準でどのように規定されているかが知りたいのです・・・)
0640デフォルトの名無しさん
2005/11/01(火) 08:53:030641デフォルトの名無しさん
2005/11/01(火) 08:58:59atexitが失敗したときの処理をどう書けばよいのかに困っているのです。
もしatexitの失敗により、それ以前に登録していた関数が呼び出されないことがあるなら、atexitを使わない方向で考えなければならないかもしれません。
もしくは、atexitが失敗することはありえないと考えて、失敗時の処理は書かない、というのも(移植性を求めたい場合でも)あり得る選択肢ですか?
0642デフォルトの名無しさん
2005/11/01(火) 09:04:280643デフォルトの名無しさん
2005/11/01(火) 09:29:43失敗したら即終了ということは、メモリの開放をatexitに任せるのは良くないと考えるべきですか?
それともfprintf(stderr or log, "メモリリークしたかもしれません")などで諦めるべきでしょうか?
実際悩みどころはatexitそのものよりも、atexitに登録しておいた関数たちが心配なんです。
だから、できることなら登録済み関数がどう扱われるかに関する標準での規定(もしくは未定義?)の情報があると助かります。
0644デフォルトの名無しさん
2005/11/01(火) 09:37:09プロバイダに聞け
0645デフォルトの名無しさん
2005/11/01(火) 10:11:33基本的に心配のポイントがナンセンスだとは思うんだが…
どちらにせよ異常処理としては、後処理(atexit登録)の内容、意味、重要性
毎にケースバイケースの判断が必要だろ?
atexit()使わない人も少なくないから興味薄いし、
それでも心配なら自分で ANSI(ISO), POSIXをきちんと調べるべきだろうに。
0646デフォルトの名無しさん
2005/11/01(火) 10:27:54> メモリの開放をatexitに任せるのは良くないと考えるべきですか?
そもそも、標準に準拠した環境なら、
main()のreturn or exit()で解放されるわけだが…。
0647要するに規格票をコピペしろと要求しているわけだな?
2005/11/01(火) 10:39:34アメやるから帰れ。
機能 atexit関数は,funcが指す関数を,プログラムの正常終了時に
実引数をもたずに呼び出される関数として登録する。
処理系限界
処理系は,少なくとも32個の関数の登録をサポートしなければ
ならない。
返却値 atexit関数は,登録が成功したとき0を返し,失敗したとき0以外
の値を返す。
0648デフォルトの名無しさん
2005/11/01(火) 10:52:55失敗したらそれ以前のものがすべて破壊されるとは考えにくい。
ついでに言うとmallocやfopenに失敗した時
それ以前のハンドルがすべて無効になるともならないとも言ってないな。
0649643
2005/11/01(火) 11:40:55>>645
たしかに、ケースバイケースという点を見逃して質問してしまいましたね。実際atexitに登録していた関数は、動的に確保したメモリの開放に関連していたので、ある時点でatexitに失敗した場合、どうやってGCしようか思案していたのです。
>>646
すみません、「動的に確保した」メモリの開放のことだったのですが、言葉足らずでした。
>>647
まさに求めていたものです!639でbccが32回で止まったことに納得がいきました。
atexitに失敗したら、それまでに登録されていた関数が呼び出されるかどうかは、未定義なんですね。
>>648
なるほど。そう考えると、atexitに失敗したらメモリリークを避けるのは難しいってことなんですね。
色々勉強させてもらいました。どうもありがとうございました!
0650デフォルトの名無しさん
2005/11/01(火) 12:13:25(C++ならboost::rational? 一般的とは言い難いかもしんないけど)
0651デフォルトの名無しさん
2005/11/01(火) 13:02:340652デフォルトの名無しさん
2005/11/01(火) 13:13:29> atexitに失敗したらメモリリークを避けるのは難しいってことなんですね。
いや、「まともな」OSならプロセスが死んだらメモリとファイルハンドラは解放する。
そもそもkill -9とかされたらatexit()自体呼ばれないし...
普通、atexitにはいきなり終了されるとマズイ処理とかを登録する
例えば、エディタでソース編集している時にいきなり保存もせずに終了したら泣くでしょ?
そういう場合、atexitにファイル保存処理を登録しとく。
wordは...あれはネタプログラムだから、ファイル保存せずに終了もありでしょう。
0653デフォルトの名無しさん
2005/11/01(火) 14:18:41>そういう場合、atexitにファイル保存処理を登録しとく。
ハァ?
たとえにしても意味不明すぎ。
0654649
2005/11/01(火) 14:18:42そうなのですか!勉強になります。
となると、mallocしっぱなしでmainのreturnをした場合にも、きちんとメモリは解放されるものなんですか?
0655デフォルトの名無しさん
2005/11/01(火) 14:33:08特定用途だとそれでいいけど、欲しいのは汎用ライブラリなので……。
0.1を10回足すというのは、例示として浮動小数点だと誤差が出る典型的な
ケースを挙げただけで、それそのものが目的なわけではないです。
わかりにくくて申し訳ない。
0656655
2005/11/01(火) 14:36:08とりあえず目についたものは、GNU MPくらいかなぁ。
0657デフォルトの名無しさん
2005/11/01(火) 14:41:08> mallocしっぱなしでmainのreturnをした場合にも、きちんとメモリは解放されるものなんですか?
まぁ、コーディングとして美しいかはともかく、「まともなOS」なら解放される。
ちなみに私の独断でのまともなOSの定義はWinNT系とUnixなど
DOSやらWin9x系(特にMe)はまともなOSとは言い難い
0658デフォルトの名無しさん
2005/11/01(火) 15:54:020659デフォルトの名無しさん
2005/11/01(火) 15:57:33ちなみにfree()せずに終了してもMS-DOSでは問題ないはず
なんせシングルタスクの世界だからなw
0660デフォルトの名無しさん
2005/11/01(火) 16:00:00プログラム間でポインタ受け渡して操作し合えたのにはシビれたよ。
0661デフォルトの名無しさん
2005/11/01(火) 16:20:21メモリが断片化するからmalloc()使うなと泣きを入れてくる素晴らしいOSだ。
0662デフォルトの名無しさん
2005/11/01(火) 16:56:470663デフォルトの名無しさん
2005/11/01(火) 17:26:31う〜〜ん、やっぱり頭痛ものだなぁ……
exit()前にfree()が必須かどうかはともかく(C FAQネタ)、
>>647 の出典が不明なままでよく信じる気になれるよな。
とても ANSI,POSIX などの「規格」とは確信できないだろうに。
0664デフォルトの名無しさん
2005/11/01(火) 17:41:28グローバル変数使ってないと存在価値ないが、
グローバル変数なんて使わないし。
0665647
2005/11/01(火) 17:50:37free() してもメモリが OS に返されるわけではない。
…いや、このネタやっぱ禁止。
>>663
>>>647 の出典が不明なままで
おお、忘れてた。
JIS X3010 : 2003 (ISO/IEC 9899 : 1999)
プログラム言語 C
0666デフォルトの名無しさん
2005/11/01(火) 19:02:050667デフォルトの名無しさん
2005/11/01(火) 19:23:110668デフォルトの名無しさん
2005/11/01(火) 19:31:20いまいちポインタを使えきれてない気がするんだけど書き方のアドバイスお願い
#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]);
}
0669デフォルトの名無しさん
2005/11/01(火) 19:58:38まあいいんじゃない?
0670デフォルトの名無しさん
2005/11/01(火) 20:15:220671デフォルトの名無しさん
2005/11/01(火) 21:20:27reallocでバッファ拡大してくのと
fseekで終端まで行ってftellで長さ見るの
どっちがいいのですか?
0672デフォルトの名無しさん
2005/11/01(火) 21:25:19サイズはOSのAPI,システムコールでとったら。
0673デフォルトの名無しさん
2005/11/01(火) 22:12:38比較対照広杉だが、
C のエラーチェックは比較的甘いので、
そのせいでバグは多くなりやすいとは言えなくもない。
0674デフォルトの名無しさん
2005/11/01(火) 22:14:45言語勉強の一環として読み解きたいんで
0675デフォルトの名無しさん
2005/11/01(火) 22:16:58イニシャルの入力はmain関数で行うんじゃないの?
0676デフォルトの名無しさん
2005/11/01(火) 22:36:440677デフォルトの名無しさん
2005/11/01(火) 22:37:310678デフォルトの名無しさん
2005/11/01(火) 22:42:09目の前にいたらお前を殴ってるぞ
0679デフォルトの名無しさん
2005/11/01(火) 22:43:48なぜでありますか?
たしかLinuxってC言語で書かれているのでは?
スレ違いではないと思うのですが
0680デフォルトの名無しさん
2005/11/01(火) 22:46:430681デフォルトの名無しさん
2005/11/01(火) 22:58:32釣りだと信じてる
0682デフォルトの名無しさん
2005/11/01(火) 23:01:250683デフォルトの名無しさん
2005/11/01(火) 23:07:29蚊Linuxですか?
0684デフォルトの名無しさん
2005/11/01(火) 23:07:380685671
2005/11/02(水) 00:10:10レスどうも
winプログラミングではAPIでやってます
しかし、そういうシステムコール関数が用意されてない場合に終端に行ってftelを使うというのは、方法としてどうなんでしょうか。
今はreallocでやってるんですけども。
0686デフォルトの名無しさん
2005/11/02(水) 00:27:11相を分けて考えるべき。
・ファイルサイズを得る手段として、ftell()は無難か。
→ファイルサイズが2GBを超えた場合や、非バイナリモードなどで正しくない値を返す可能性があるが、概ね使える。
・ファイルサイズが得られない場合にrealloc()しながらファイルを読むのは適当か。
→一度fgetc()などで空読みしてでもrealloc()は避けたほうが無難かもしれない。
#ま、要はfseek()+ftell()が実装されているならそれを使うってことで委員で内科医?
0687デフォルトの名無しさん
2005/11/02(水) 00:51:38なら CreateFileMapping でFA
realloc は俺もやだ
x = realloc(y, z); で x != y のたびに memcpy するだろ
しかも x != y は毎回あっても規格合致だから
性能的に話にならない
0688デフォルトの名無しさん
2005/11/02(水) 00:58:160689デフォルトの名無しさん
2005/11/02(水) 10:13:02分からないことがあります、質問しても良いでしょうか?
int *p;
p=calloc(10, sizeof(int));
int *p[10];
は同じポインター配列だと思うのですが、どこか違うのですか?
0690デフォルトの名無しさん
2005/11/02(水) 10:23:16p=calloc(10, sizeof(int));
int *p[10];
p[0]=calloc(10, sizeof(int));
0691デフォルトの名無しさん
2005/11/02(水) 10:25:22上のpは10個の要素を持つint型の配列を指すポインタ
下のpは10個の要素を持つint*型の配列
ぜんぜん違う
0692デフォルトの名無しさん
2005/11/02(水) 10:33:49int *p[10];
p[0]=calloc(10, sizeof(int));
でそれぞれの要素に値を代入するにはどうしますか?
int i;
for(i=0;i<10;++i)
p[0][i]=0;
こうですか?
0693デフォルトの名無しさん
2005/11/02(水) 10:43:17>fseek()+ftell()が実装されているなら
ANSI C なら実装されているだろうし
(タマに実装されてない処理系があるが)
寧ろ stat/fstat が実装されてれば
そっちの方が話が早いような。
>>687
>性能的に話にならない
サイズにもよるが、そもそもファイルI/O(ry
0694デフォルトの名無しさん
2005/11/02(水) 10:51:37int *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を使って二次元配列は作れないですね。
0695671
2005/11/02(水) 11:11:36ありがとう
0696デフォルトの名無しさん
2005/11/02(水) 11:21:50RYFM。
ttp://www.kouno.jp/home/c_faq/c6.html#16
0697689
2005/11/02(水) 11:41:34char a[]はchar *aと同じと聞いたことがあったのですが、
どうもぜんぜん違うもののようですね。
この辺の知識がこんがらがっていました。
ありがとうございました。
0698デフォルトの名無しさん
2005/11/02(水) 13:03:562次元に見えるのはポインタに騙されてるだけ
0699デフォルトの名無しさん
2005/11/02(水) 14:07:250700デフォルトの名無しさん
2005/11/02(水) 14:29:37set に insert していって戻り値を見ればいいんジャマイカ
0702デフォルトの名無しさん
2005/11/02(水) 18:26:36a,b,cという3本のソースファイルから参照した定数(下記)をヘッダファイルに
記載してソースファイルからそれぞれインクルードしました。
すると「MULTIPLE PUBLIC DEFINITIONS」というエラーが発生します。
constをstaticにすると解消されますがこれはなぜでしょうか?
const char num[8] = {0,1,2,3,4,5,6,7};
0703デフォルトの名無しさん
2005/11/02(水) 18:32:31includeしたら各翻訳単位に同名の非static変数が存在することになる。
よって多重定義でエラーを吐くんでアウト。
staticなら翻訳単位内のみで有効だから多重定義にならずにセーフ。
0704デフォルトの名無しさん
2005/11/02(水) 18:35:291秒ずつ減らしながらかつその秒数を表示でき、そういったことと並行して文字列の出入力を
可能にする関数もしくはプログラムを書いて下さい。
〜
time(&t1);
while(1){
time(&t2);
if(difftime(t2,t1)>=1.0) break;
〜
希望として上のコードを用いてほしいです。お願いします!
0705デフォルトの名無しさん
2005/11/02(水) 18:36:130706デフォルトの名無しさん
2005/11/02(水) 18:41:530707デフォルトの名無しさん
2005/11/02(水) 19:24:56#ifndef使ったら
ええんちゃうん?
0708デフォルトの名無しさん
2005/11/02(水) 20:25:46void main (void)
{
int i=1,s=0;
while(1)
{
s+=1;
if(s >=100)
break;
i++;
}
printf("1からの総和が100以上になるのは%dです。\n",i);
}
と書いたら、
0709デフォルトの名無しさん
2005/11/02(水) 20:28:45正解は14のはずだが・・・。
やはり、http://homepage3.nifty.com/aokura/
の「C言語を始めよう!」では駄目なのか・・・
0710デフォルトの名無しさん
2005/11/02(水) 20:30:56C 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という変数が全てのオブジェクトファイルに入ってしまい
あまり好ましいとは言えない。
0711デフォルトの名無しさん
2005/11/02(水) 20:31:58何かのギャグですか?
0712デフォルトの名無しさん
2005/11/02(水) 20:33:35http://kmaebashi.com/programmer/pointer.html#argumentarray
char a[]とchar *aが同一視されるのは関数の仮引数の場合だけ。
0713デフォルトの名無しさん
2005/11/02(水) 20:34:38お前の書いたコードが悪い。
ループ内にprintfを書いてsの値を確かめてみな。
0714デフォルトの名無しさん
2005/11/02(水) 20:43:27> 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行で済むぞ。
0715デフォルトの名無しさん
2005/11/02(水) 20:46:24レス�dクス。
0716デフォルトの名無しさん
2005/11/02(水) 20:53:24実際改行しない書き方もあるから1行のこともあるわな。
しかし>>708-709のコードは気持ち悪すぎる。
背筋がゾゾッとした。
0717デフォルトの名無しさん
2005/11/02(水) 23:13:070718デフォルトの名無しさん
2005/11/02(水) 23:18:180719デフォルトの名無しさん
2005/11/02(水) 23:37:00UNIX って偉いなあw
0720デフォルトの名無しさん
2005/11/03(木) 10:01:201とiを書き間違えるなんてことがあるなんて
0721デフォルトの名無しさん
2005/11/03(木) 10:42:00ローマ字入力しているときに濁点忘れとか実際あるし
0722デフォルトの名無しさん
2005/11/03(木) 16:02:110723デフォルトの名無しさん
2005/11/03(木) 16:21:360724デフォルトの名無しさん
2005/11/03(木) 16:46:080725デフォルトの名無しさん
2005/11/03(木) 17:02:550726デフォルトの名無しさん
2005/11/03(木) 18:22:20BOOL 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
0727デフォルトの名無しさん
2005/11/03(木) 18:55:41別にいいんじゃない?
0728デフォルトの名無しさん
2005/11/03(木) 19:22:360729デフォルトの名無しさん
2005/11/03(木) 19:54:590730デフォルトの名無しさん
2005/11/03(木) 19:59:300731デフォルトの名無しさん
2005/11/03(木) 20:02:050732デフォルトの名無しさん
2005/11/03(木) 20:03:140733デフォルトの名無しさん
2005/11/03(木) 20:03:330734デフォルトの名無しさん
2005/11/03(木) 20:06:11有難うございます。今から基数の変換をやってみたいと思います。
0735デフォルトの名無しさん
2005/11/03(木) 20:12:01大文字かどうか判定する一般的な関数を作るべきだな。
拡張子は・・・って関数も、それを利用して作ればいい。
0736デフォルトの名無しさん
2005/11/03(木) 20:54:49http://www.bohyoh.com/CandCPP/C/Library/isupper.html
0737デフォルトの名無しさん
2005/11/03(木) 20:58:510738デフォルトの名無しさん
2005/11/03(木) 21:07:11大丈夫。isupperはボーランドC++でも使えます
0739デフォルトの名無しさん
2005/11/03(木) 21:11:390740デフォルトの名無しさん
2005/11/03(木) 21:25:280741デフォルトの名無しさん
2005/11/03(木) 21:54:26悪いが>>726がそれに対応しているようには見えないわけだが
ワイド文字のことを言いたいのならiswupperを使えばいい
0742デフォルトの名無しさん
2005/11/03(木) 21:57:020743デフォルトの名無しさん
2005/11/03(木) 22:02:410744デフォルトの名無しさん
2005/11/03(木) 22:05:31の範囲に正規化するにはどうすればいいですか?
0745デフォルトの名無しさん
2005/11/03(木) 23:02:22アルゴリズムについてはスレ違い。つーか、max〜minの値をa〜bに変換したいのか?
中学生レベルの問題ジャマイカ。
0746デフォルトの名無しさん
2005/11/03(木) 23:05:22RDBの正規化や浮動小数点の正規化というのは聞くが、なんだそれは?
0747デフォルトの名無しさん
2005/11/03(木) 23:10:04minを基準にして、データ列の他の値は、
minとの差分で表す見たいな事だと思ったけど
ちがうかな?
0748デフォルトの名無しさん
2005/11/03(木) 23:18:27あぁそういうことか
てっきり正規分布にでも当てはめるのかと思った
0749デフォルトの名無しさん
2005/11/03(木) 23:50:280750デフォルトの名無しさん
2005/11/03(木) 23:53:16ttp://ew.hitachi-system.co.jp/w/E6ADA3E8A68FE58C96.html
0751デフォルトの名無しさん
2005/11/03(木) 23:55:42それって正規分布に従う奴をN(0,1)に変換する奴だっけ?
つーか、質問が曖昧杉
0752デフォルトの名無しさん
2005/11/04(金) 00:31:27つーか、スレ違いだっちゅうに。
0753デフォルトの名無しさん
2005/11/04(金) 00:42:30任意のN(μ,σ^2)を標準正規分布にあてはめるときに
Z=(X-μ)/σってのは統計の分野でよく使うやつです。
データ列を任意の区間[a,b]に変換するような場合も
アイデアは同じですね。冗談抜きに小学生でもできます。
で、C以前の問題ということでスレ違いですね。
0754デフォルトの名無しさん
2005/11/04(金) 00:47:37宿題スレみてて、ちょっち疑問におもったんだけれども。
int func();
/* ... */
int func()
{
/* ... */
}
ってな書き方を何度か見たんですけど、下と等価なんでしょうか?
int func(void);
/* ... */
int func(void)
{
/* ... */
}
0755デフォルトの名無しさん
2005/11/04(金) 00:52:42上はK&Rスタイルだったっけか
とりあえず等価とみてよかったと記憶してるが
Cならちゃんとvoidって書くべきじゃね?
0756デフォルトの名無しさん
2005/11/04(金) 01:01:43等価ではない。
前者は引き数リストを省略している。
つまり、int func();と宣言してfunc(1);と参照してもエラーにならない。
引き数がないことを明示したければ、int func(void);と書かないといけない。
C++の場合は引き数リストを省略できないので、等価となることになっている。
0757デフォルトの名無しさん
2005/11/04(金) 01:11:04int func();
という宣言は、
Cなら
int func(...);
C++なら
int func(void);
と宣言したのと同じ。
0758デフォルトの名無しさん
2005/11/04(金) 01:25:23Cでは引数がない場合はint func(void)と書くべきだとわかりました。
(宿題スレでお手本プログラムでvoidを書かないのが複数出てたんで、心配になってしまった・・・)
0759デフォルトの名無しさん
2005/11/04(金) 01:33:52質問する方もそのへんちゃんと見分けなきゃね
0760デフォルトの名無しさん
2005/11/04(金) 01:39:56お前もその馬鹿の一人だがな。
0761デフォルトの名無しさん
2005/11/04(金) 01:41:40と
int func(...);
は違う。
前者は引き数リストの省略で、後者は可変長引き数の指定。
尚、記憶に間違いがなければ可変長引き数の指定は固定引き数が一つ以上必要だった筈。
#誰か規格に当たってくれ。
0762デフォルトの名無しさん
2005/11/04(金) 01:43:370763デフォルトの名無しさん
2005/11/04(金) 01:46:55念のためググって自分の発言に間違いはないか、複数のサイトを比較し確かめた上で、
やっと自分には関係ないと安堵して一息ついた人の数↓
0764デフォルトの名無しさん
2005/11/04(金) 01:55:130765デフォルトの名無しさん
2005/11/04(金) 01:58:01そんなことするくらいなら規格に当たればいいのに。
0766デフォルトの名無しさん
2005/11/04(金) 12:14:350767デフォルトの名無しさん
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;
}
0768デフォルトの名無しさん
2005/11/04(金) 15:15:17{
int a1 = 40;
int a2 = 70;
*(a1 > a2 ? &a1 : &a2) = 10;
printf("a1 = %d\n", a1);
printf("a2 = %d\n", a2);
return 0;
}
これならできた
0769デフォルトの名無しさん
2005/11/04(金) 15:35:05C FAQ 3.16
ttp://www.kouno.jp/home/c_faq/c3.html#16
0770デフォルトの名無しさん
2005/11/04(金) 15:37:24こりゃあ!すげぇ。
て、ことは:
#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;
}
//極めて非実用的では、あるが…
0771デフォルトの名無しさん
2005/11/04(金) 16:14:46ちなみにC++だと左辺値になるので(a1 > a2 ? a1 : a2) = 10;などが可能になっている。
0772デフォルトの名無しさん
2005/11/04(金) 16:19:500773デフォルトの名無しさん
2005/11/04(金) 16:45:00けれど、これはお世辞にも美しいとはいえない。
0774デフォルトの名無しさん
2005/11/04(金) 16:52:54君の性格は・・・
だろ?(w
0775デフォルトの名無しさん
2005/11/04(金) 17:09:39mallocしたらfreeなど解放には気を付けているのですが、
どこか気付いていないところで漏れていないか心配です
0776デフォルトの名無しさん
2005/11/04(金) 17:11:05C++使え
0777デフォルトの名無しさん
2005/11/04(金) 18:22:46両辺が三項演算子って、なかなか面白そうだから
整列された二つの配列を奇数と偶数配列に
分割してみました。結構、「美しい」?コードです。
が、動きません。
どうすれば良いのでしょうか?
#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;
}
0778デフォルトの名無しさん
2005/11/04(金) 18:36:36void 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);
}
どこがおかしいんだろう・・・
0779デフォルトの名無しさん
2005/11/04(金) 18:38:15whileに入ったところで読む気が無くなった
見づらいだけで意味無いだろ
0780デフォルトの名無しさん
2005/11/04(金) 18:39:39要は偶数だったらcontinueさせたいのか?
それだと無限ループ。ifの構文を見直せ
0781デフォルトの名無しさん
2005/11/04(金) 18:39:52無限ループ使うのいい加減止めろよ
0782デフォルトの名無しさん
2005/11/04(金) 18:48:40日記はEmacsにでも書いとけ
0783デフォルトの名無しさん
2005/11/04(金) 19:03:32int 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;
}
可能な限り最適化
0784デフォルトの名無しさん
2005/11/04(金) 19:19:110785デフォルトの名無しさん
2005/11/04(金) 19:31:190786デフォルトの名無しさん
2005/11/04(金) 19:33:02とりあえず入門からやり直せ。
・空ポインタ定数マクロをポインタ以外のものとして使用してはいけない
・ポインタはビット演算できない
・排他的OR演算子は偶奇を判定しない
・直前の副作用完了点と次の副作用完了点までの間に、式の評価によってオブジェクトに格納された値を変更する回数は高々一度だけでなければならない。更に、変更前の値は、格納される値を決定するためだけにアクセスしなければならない。
・三項演算子の?は省略できない
0787デフォルトの名無しさん
2005/11/04(金) 19:47:570788デフォルトの名無しさん
2005/11/04(金) 21:01:32先生!ご指摘の部分を修正したところ、エラーの数は確かに
「激減」致しました。が、依然として動きません。
#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;
}
>>
・直前の副作用完了点と次の副作用完了点までの間に、(以下略)
<<
このコメントを加味したコードをお示し下さい。
先生の「華麗な」力技を期待しております。
0789デフォルトの名無しさん
2005/11/04(金) 21:05:01だから(int)NULLはおかしい。NULLはヌルポインタを表すもの。
int値では0にしろ。
0790デフォルトの名無しさん
2005/11/04(金) 21:05:14もう帰れ
0791デフォルトの名無しさん
2005/11/04(金) 21:10:510792デフォルトの名無しさん
2005/11/04(金) 21:14:36なにこの糞プログラム
0793デフォルトの名無しさん
2005/11/04(金) 21:20:43NULLを0に代えましたが、
> '%' : 不正な左オペランドです。
> '=' : 左のオペランドが、左辺値になっていません。
エラーが消えません。
先生方の華麗な力技を是非!是非!
0794デフォルトの名無しさん
2005/11/04(金) 21:23:13発展性を秘めているんじゃないでしょうかねぇ?
0795デフォルトの名無しさん
2005/11/04(金) 21:23:25(*x%2)にすればVC++7.1では動いた。
0796デフォルトの名無しさん
2005/11/04(金) 21:30:25for(i=0;a[i]!='-'||a[i]!='+';i++){
↑じゃあダメですよね どうしたらいいか教えてもらえませんか?
0797デフォルトの名無しさん
2005/11/04(金) 21:30:420798デフォルトの名無しさん
2005/11/04(金) 21:34:280799デフォルトの名無しさん
2005/11/04(金) 21:37:38適当にこれじゃだめ?
for(i=0;i<max;i++){
if(a[i]=='-'||a[i]=='+')
break;
}
0800デフォルトの名無しさん
2005/11/04(金) 21:46:31for(i = 0; a[i] != '-' && a[i] != '+'; i++)
0801デフォルトの名無しさん
2005/11/04(金) 21:55:280802デフォルトの名無しさん
2005/11/04(金) 21:57:34>(*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
0803sage
2005/11/04(金) 22:06:00microsoftには、以下のようにして"C"が表示されればNaNとわかると
載っていたのですが、実行すると、いずれも表示されません。。
環境はwin2kにVC++6.0です。
初心者なりに検索したのですが、どうしようもなくなってしまいました。
時間のある方、教えてくださいm(_ _)m
if(a<0.){
printf("A")}
else if(a>0.){
printf("B")}
else{
printf("C")}
0804803
2005/11/04(金) 22:06:320805デフォルトの名無しさん
2005/11/04(金) 22:17:08;を付けないのは仕様ですか?
0806デフォルトの名無しさん
2005/11/04(金) 22:20:000808デフォルトの名無しさん
2005/11/04(金) 22:20:44VC++ならご丁寧に日本語で出力されるじゃん。
不思議でならんな。
0809デフォルトの名無しさん
2005/11/04(金) 22:22:10なにも2ちゃんで死ぬほどのこたぁないと思うが・・・
0811デフォルトの名無しさん
2005/11/04(金) 22:52:54いいってことよぉ。
どうせここんところの発言は全部一人で
書いてんだからさぁ。
0812デフォルトの名無しさん
2005/11/04(金) 22:55:32おまえ、素直に一晩寝てから書き込め。
0813デフォルトの名無しさん
2005/11/04(金) 23:47:10おかしいところは盛りだくさんだけど
とりあえず
if(i%2==0);
の行末のセミコロンを取り除けばとりあえず動くんじゃないかな
0814デフォルトの名無しさん
2005/11/05(土) 00:17:27未定義動作が含まれてるから動かしちゃだめ
0815デフォルトの名無しさん
2005/11/05(土) 01:05:180816デフォルトの名無しさん
2005/11/05(土) 01:17:490817デフォルトの名無しさん
2005/11/05(土) 01:17:55for(i=1,s=0;;i++)
{
continue;
}
だよ
無限ループじゃん
0818デフォルトの名無しさん
2005/11/05(土) 01:22:14int 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です。
すこーしだけ改変
しっかしすげーうんこプログラムだね
0819デフォルトの名無しさん
2005/11/05(土) 08:41:30CにもCONTINUEがあるんだな
GOTOみたいなもんだろ
気持ち悪いな^^;
0820デフォルトの名無しさん
2005/11/05(土) 10:54:290821デフォルトの名無しさん
2005/11/05(土) 11:30:300822デフォルトの名無しさん
2005/11/05(土) 11:31:310823デフォルトの名無しさん
2005/11/05(土) 11:58:34printf("%d",sizeof(a));//実行すると 1
printf("%d",sizeof(~a));//実行すると 4
型変換は演算が無い限り行われないと考えていいんでしょうか?
だとすると
printf("%d",sizeof'A');//実行すると4
となるのは何故でしょうか?
0824デフォルトの名無しさん
2005/11/05(土) 12:01:430825デフォルトの名無しさん
2005/11/05(土) 12:06:07Cだとintになる
0826デフォルトの名無しさん
2005/11/05(土) 12:06:48レスどうもありがとうございます。
ある本に「文字定数からintへの格上げ〜」と書いてあったで、
文字定数はcharと決め付けてしまいました。
0827デフォルトの名無しさん
2005/11/05(土) 12:11:43そうでした。つまらない質問をして申し訳ないです。
参考までにエキスパートCプログラミング P.208です。
自分の読み違いかもしれませんね・・・。
0828デフォルトの名無しさん
2005/11/05(土) 12:23:21break は中間判定という点で goto と同じ考え方で使うもの
ただしループの途中に外から飛び込むことができない、いわば制限つきの goto だ
>>822
さて、continue はどうだろう
分岐先はループ内であり逸脱前に前判定または後判定を必ず通るので中間判定とは言いがたいと思う
0829デフォルトの名無しさん
2005/11/05(土) 13:13:42とりあえずその「中間判定」というのが何の寝言で gotoとどう関係するのか
説明してからのたまうべきだと思うが。(もしくは何も喋らないか)
0830デフォルトの名無しさん
2005/11/05(土) 13:17:02gotoとbreakが同列かよ
寝言は寝ていえ
0831デフォルトの名無しさん
2005/11/05(土) 13:24:58#まさか同一人物じゃないですよね?
0832デフォルトの名無しさん
2005/11/05(土) 13:26:47利用方法さえ間違わなければgotoはとても有用だという証
0833デフォルトの名無しさん
2005/11/05(土) 13:34:52{ から } までを1命令と考えられるようにまとめようとしているとき、
命令A
命令B
命令C
というシーケンスでAからBを経ずにCへ制御が移ることを
命令Aに於ける中間判定といい
不明瞭なので避けるべきと主張するのが goto 有害説
よって立場のとりかた次第で意味を失いまたは反論の余地がでるが
ダイクストラは大規模なプログラムの能率的な管理に立場を置いている
0834デフォルトの名無しさん
2005/11/05(土) 14:03:34再びGOTOがどうとか、懲りない奴ら
0835デフォルトの名無しさん
2005/11/05(土) 14:08:540836デフォルトの名無しさん
2005/11/05(土) 14:13:440837デフォルトの名無しさん
2005/11/05(土) 14:29:38でもGCがあればgotoだろうがbreakだろうがどうとでもなります、だろ
0838デフォルトの名無しさん
2005/11/05(土) 14:30:50GC と goto 有害説がどう関係するのか聞きたい
0839デフォルトの名無しさん
2005/11/05(土) 14:34:36かなりもったいない餌まいたのに
つまんねー
0840デフォルトの名無しさん
2005/11/05(土) 14:54:48金がないからってgotoするよりは地道に空き缶でも集めてる方がいいって話
0841デフォルトの名無しさん
2005/11/05(土) 15:44:27何その中間判定の定義?しかもgoto有害説と関係ないじゃん
0842デフォルトの名無しさん
2005/11/05(土) 16:17:59Cでもこれなら動くが…
#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;
}
0843デフォルトの名無しさん
2005/11/05(土) 16:28:23先生!
もう半分諦めておりましたのに、お手数おかけしました。
お陰様で整列も上手く行きます。
しかしながら、10がぁ消えちまって…
最後の華麗な力技をお願いします。
他の先生方も是非!是非!
実行結果:
Odd = 9
Odd = 7
Odd = 5
Odd = 3
Odd = 1
Even = 0
Even = 6
Even = 4
Even = 2
Press any key to continue
0844デフォルトの名無しさん
2005/11/05(土) 16:29:28それも未定義動作。
0845デフォルトの名無しさん
2005/11/05(土) 16:48:16未定義かどうか知らんが、確かに
毎回同じ実行結果にはなるね。
0846デフォルトの名無しさん
2005/11/05(土) 18:08:43void 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);
0847デフォルトの名無しさん
2005/11/05(土) 18:09:25int kasan(int x,int y)
{
int z;
z=x+y;
return z;
}
float jozan(int a,int b)
{
return(a/b);
}
0848デフォルトの名無しさん
2005/11/05(土) 18:18:04lこれはfloatで戻ってくるかどうかは未定義だと
仰りたいのでしょうか?
0849デフォルトの名無しさん
2005/11/05(土) 18:18:21*** コンパイル開始 ***
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'
*** コンパイル終了 ***
0850デフォルトの名無しさん
2005/11/05(土) 18:20:12感動的に「寒い」コードだよなぁ…
0851デフォルトの名無しさん
2005/11/05(土) 18:22:18片瀬先生ですかぁ?
0852デフォルトの名無しさん
2005/11/05(土) 19:03:04特定の環境下で同じ実行結果になるのはともかく、
未定義かどうか知らん、のは非情にまずかろう。
まあ842やその元のアプローチ自身、根本的に何の価値も無い
ということにまだ気がつかない奴残ってるのか?
ageてるのとかその他なんか急速に初心者スレよりひどくなって……
0853デフォルトの名無しさん
2005/11/05(土) 19:05:56寝言よりひどかったでした。
0854デフォルトの名無しさん
2005/11/05(土) 19:18:560855デフォルトの名無しさん
2005/11/05(土) 19:23:34容易に認識してるんだが、未定義なのって副作用絡み?
今ひとつ副作用完了点辺りが理解できてない俺に誰かわかりやすく説明希望
0856デフォルトの名無しさん
2005/11/05(土) 19:58:47/* 前のフェーズを設定 */
void *setbackphase(int phase)
{
static int backphase = 0;
backphase = phase;
return &backphase;
}
0857デフォルトの名無しさん
2005/11/05(土) 20:01:190858デフォルトの名無しさん
2005/11/05(土) 20:08:12ていうかなんじゃこれ?
phaseのアドレス返すだけなら&phaseでいいんぢゃないの???
0859チラシの裏
2005/11/05(土) 20:12:090860デフォルトの名無しさん
2005/11/05(土) 20:16:140861デフォルトの名無しさん
2005/11/05(土) 20:17:36中間判定については確かにちょっとおかしいな
「中間判定による分岐」なら意味が通るが
ところで goto 有害説と関係ないと主張するためには
まずあなたの言う「goto 有害説」とは何かを示す必要があるぞ
現状、唐突に関係ないと言い出しているだけで(自粛)にしか見えてない
0862デフォルトの名無しさん
2005/11/05(土) 20:18:07日経ソフトウェアに連載されてたコードなんですけど
ttp://software.nikkeibp.co.jp/software/download/0407/algo0407.zip
この中の maillist.c の530行目に出てくるんです
0863デフォルトの名無しさん
2005/11/05(土) 20:23:03吸い込み関数って知ってる?
正確に言うと参照を返す関数。
書き方悪いけど
return (*)〜;を返す。
分かりやすく言うと、関数が戻値を返したつもりでも、逆に値の吸い込み。
0864デフォルトの名無しさん
2005/11/05(土) 20:23:340865デフォルトの名無しさん
2005/11/05(土) 20:32:17検索のヒント
- キーワードに誤字・脱字がないか確かめてください。
- 違うキーワードを使ってみてください。
- より一般的な言葉を使ってみてください。
0866856
2005/11/05(土) 20:36:40ありがとうございます。参考にさせて頂きます
皆さんも有難うございました
0867デフォルトの名無しさん
2005/11/05(土) 20:56:47確かに
>845
は従来の意味では、つまりC言語の仕様を厳格に
適用し、これまでコード例が豊富だと言う意味では
価値が無い。
ただ若干変な奴?だが彼が拘っている両辺三項演算子スタイルそのもの
に発展性があるかどうかは、今後の実装に拠るんじゃないか?
即ちC言語の仕様において現在、未定義とは未来永劫、未定義とは
限らない。
もっと広い目で見てやっても良いんじゃないかな?
0868デフォルトの名無しさん
2005/11/05(土) 20:56:57プロトタイプをしない場合、暗黙の型変換が行われますが、
プロトタイプをした場合の引数における型の変換はどんなルールは基づいてるんでしょうか?
0869デフォルトの名無しさん
2005/11/05(土) 21:00:10そこまで疑問点を明確に定義できるなら規格票もってれば完璧にわかる
0870デフォルトの名無しさん
2005/11/05(土) 21:05:08簡単にいうと
*(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がいつ評価されるかには関与しない。
代入式の左辺と右辺の間に副作用完了点を作るのは不可能だ
0871デフォルトの名無しさん
2005/11/05(土) 21:20:47なるほど、サンクス
mの参照と代入が行われてるのを見落としてた
0872デフォルトの名無しさん
2005/11/05(土) 21:40:19>代入式の左辺と右辺の間に副作用完了点を作るのは不可能だ
右辺の式評価が完了しない限り左辺に代入することは不可能だ。
従ってC言語の仕様における式評価順は右辺から左辺になるんじゃなかったか?
0873デフォルトの名無しさん
2005/11/05(土) 21:44:12m[i] = i++;
先に左辺が評価されても問題ないパターンがある以上、仕様上は未定義。
0874デフォルトの名無しさん
2005/11/05(土) 21:45:46>mの参照と代入が行われてるのを見落としてた
もし、代入で統一したかったら、
(m=m%2)?
でも動くが…
0875デフォルトの名無しさん
2005/11/05(土) 21:54:09>m[i] = i++;
>先に左辺が評価されても問題ないパターンがある以上、仕様上は未定義。
常に右辺から評価されても全然問題はない。
つまり上の例は、先に左辺が評価されて「も問題ない」パターンの
レアケースであり、左辺から評価されちゃまずいものが殆どではないのか?
0876デフォルトの名無しさん
2005/11/05(土) 21:59:09チミがなんと言おうとISO/IECでは未定義になってるんだから未定義なんだよ。
0877デフォルトの名無しさん
2005/11/05(土) 22:00:23本来左辺式が評価されること自体が
レアケースであることは踏まえて、
そのレアケースのレアケースっていう
意味でだ。
確かにあまり意味はないが・・・
でも、面白いだろう?
こんな議論って。
0878デフォルトの名無しさん
2005/11/05(土) 22:04:09右辺 : 代入する値の特定
左辺 : 代入されるオブジェクトの特定
が出来れば代入は可能だが、そのどちらも「式評価の完了」を意味しない
ついでに書くと、3行目と4行目が論理的につながっていない。
3行目が仮に事実だとしてもそれだと「代入は右辺の評価のあと」としか言えない
>>874
そこに代入がないことが問題なんじゃなくて、右辺に代入があることが問題
0879デフォルトの名無しさん
2005/11/05(土) 22:05:110880デフォルトの名無しさん
2005/11/05(土) 22:06:39なんか勘違いしてないか。
評価と代入は別であって、評価が終わらないと代入が行われないことは確かだが、
右辺を評価しないと左辺が評価できないわけではない。
その上で、C言語標準では「評価は式中いつ行われてもいい」となっているから、
副作用完了点を持つ式中では左辺右辺に関わらず未定義動作を引き起こす。
0881デフォルトの名無しさん
2005/11/05(土) 22:27:33確かに:
int x =0,a=5,b=7;
*((x == 0)? &a : &b)= ++x;
printf("a= %d ,b= %d\n",a,b);
不貞だよな。
0882デフォルトの名無しさん
2005/11/05(土) 22:45:18少なくとも細くつりあがった目では見てないが、
生暖かい目で見てやるわ
0883デフォルトの名無しさん
2005/11/05(土) 23:00:49生暖かいってのはリアルだよな。
これがあの寒いコードを書いた同一人物とは
とても思えん。(w
0884856
2005/11/05(土) 23:17:39うわぁ、正気の沙汰じゃない、やめてくれ〜って感じだな
確かに研究者なら楽しいかもしれない
ちょっと着眼点を変えてみて、856のstaticには重要な意味がある
staticは実行開始時から終了までアドレスは変わらない
だから、不定だか不貞だかゆう言葉は分からないけどbackphaseは参照される側ということになる
てことで、856は誤りということになったwスミマセン
フテーヤローだみたいな状況を防ぐ為にも、関数内に独自に確保した関数やPrivateメンバ変数、コンビを組むアクセス関数なんかがあって、ストックの役目をしてる
フテーヤローの危うさには、他に、クラスオブジェクトポインタ(とそのメンバ)同士の代入とか、new使ったオブジェクトの代入とかヤバイもんがゴロゴロ転がってる
参照を返す関数は>856のvoidは腑に落ちないけど、例えば、
int& setbackphase(int phase)
これが基本形。ただし、〜&型はC++の仕様でCじゃ使えない
0885訂正
2005/11/05(土) 23:19:59を
>関数内に独自に確保した変数
0886856じゃなくて863ですヌシは
2005/11/05(土) 23:23:33も訂正で
>てことで、863は誤りということになったwスミマセン
なんか非常に読みにくくなった
失礼
0887デフォルトの名無しさん
2005/11/05(土) 23:25:490888デフォルトの名無しさん
2005/11/05(土) 23:37:07自演デンパくん?どっかの新聞と似たような論理展開しないでね。
>ただ若干変な奴?だが彼が拘っている両辺三項演算子スタイルそのもの
>に発展性があるかどうかは、今後の実装に拠るんじゃないか?
今後の実装には拠らない。言語仕様が決めること。
>即ちC言語の仕様において現在、未定義とは未来永劫、未定義とは
>限らない。
"*分かりやすい*詭弁"だねw
0889デフォルトの名無しさん
2005/11/05(土) 23:38:470890デフォルトの名無しさん
2005/11/05(土) 23:38:580891デフォルトの名無しさん
2005/11/05(土) 23:39:590892デフォルトの名無しさん
2005/11/05(土) 23:41:21いえいえ規格書では未定義です
僕は規格書を読んだこと無い人間を馬鹿にしたいです
0893デフォルトの名無しさん
2005/11/05(土) 23:41:420894デフォルトの名無しさん
2005/11/05(土) 23:43:16プ
0895デフォルトの名無しさん
2005/11/05(土) 23:43:200896デフォルトの名無しさん
2005/11/05(土) 23:44:410897デフォルトの名無しさん
2005/11/05(土) 23:45:080898デフォルトの名無しさん
2005/11/05(土) 23:47:09「法律にはこう記されているんだから、それに従いたくないなら日本を出てくべきだ」
「いや、法律は人間によって定められたものであるが、法律が人間を定めてはならない」
0899デフォルトの名無しさん
2005/11/05(土) 23:47:57まとめたまえw
0900デフォルトの名無しさん
2005/11/05(土) 23:48:230901863
2005/11/05(土) 23:50:11なぜかって?
よくできたclassならいいけど、やれることが狭まる
ちなみにVCのインクルードファイルにも見ない、見かけたことがない
0902デフォルトの名無しさん
2005/11/05(土) 23:52:14後ろの5行、ハン板でよく見かける展開ですが…もしかして
0903デフォルトの名無しさん
2005/11/05(土) 23:53:48本物の>>863なら吸い込み関数の定義を述べてよ。
ザンギエフなのか?
0904デフォルトの名無しさん
2005/11/05(土) 23:54:050905デフォルトの名無しさん
2005/11/05(土) 23:59:20気にすることは無いと思います。
ポインタ型同士の代入、参照については、C関連やる人なら、しっかり深めとかなきゃいけない内容だし。
じゃないと迂闊にnewだのmallocだのは危なくて使えないでしょう。
>903
単に「参照を返す関数」に当て字を使っただけだよ
0906デフォルトの名無しさん
2005/11/06(日) 00:00:550907デフォルトの名無しさん
2005/11/06(日) 00:03:50こちらへどうぞ
http://pc8.2ch.net/test/read.cgi/tech/1129043264/l50
0908デフォルトの名無しさん
2005/11/06(日) 00:06:40自分で名づけた名前を「知ってる?」って聞くのはナンセンスだろ
全然面識ない人に「花子って知ってる?俺の娘なんだけど」
って言ってるようなもんだ
0909デフォルトの名無しさん
2005/11/06(日) 00:07:44〜&型の関数は明らかに参照する側だろう
これに参照を返す関数てな、あやふやな言葉使うより、(笑) でも
きっちり、戻り値吸い込み!関数と言った方が適切だと思うけどね俺は、造語だけど。
だが、確かに863は誤った。
ところで、Cでこの議論からかってると、痛い目見るぞ、いつか・・・、というか罠はゴロゴロ転がってる。
0910デフォルトの名無しさん
2005/11/06(日) 00:09:44いや、みんな、言葉は違えど、似たようなもん使ってると思ってたけど?
0911デフォルトの名無しさん
2005/11/06(日) 00:10:37まぁ逃げ道は残してあげとかないと、貴重なデムパ浴が…
0912デフォルトの名無しさん
2005/11/06(日) 00:15:50ところで、核心の議論は中途半端だが、このまま終わりにして、あやふやなままアドレス参照、代入とかバシバシ使っちゃうわけか皆?
まあ、理解しててやってんなら楽しんどけばいいと思うけど。
0913デフォルトの名無しさん
2005/11/06(日) 00:16:490914デフォルトの名無しさん
2005/11/06(日) 00:19:340915863
2005/11/06(日) 00:24:12だが、大事な核心部分に国関係ないと思うけどね
だが、水差しちゃった感じだな、駄レスで本論と遠ざかってしまった
0916デフォルトの名無しさん
2005/11/06(日) 00:28:220917デフォルトの名無しさん
2005/11/06(日) 00:29:010918デフォルトの名無しさん
2005/11/06(日) 00:29:150919デフォルトの名無しさん
2005/11/06(日) 00:30:15ここは2ちゃんだぞ?
追い出された奴が流れて来たに決まってるじゃん。
0920デフォルトの名無しさん
2005/11/06(日) 00:30:410921デフォルトの名無しさん
2005/11/06(日) 00:31:520922デフォルトの名無しさん
2005/11/06(日) 00:32:110923デフォルトの名無しさん
2005/11/06(日) 00:32:50それじゃリアルと一緒じゃないか
0924デフォルトの名無しさん
2005/11/06(日) 00:44:19検索したらdefault argument promotionsを見つけました。
ありがとうございました。
0925デフォルトの名無しさん
2005/11/06(日) 03:08:23それもクラス間だと、注意報クラス
更にやばいのが3つ巴
クラスAのメンバ:void foo(int* a){}
クラスBのメンバ:void foo(&b){}
クラスCのメンバ:void foo(&c){}
そーとーきおつけなきゃいけない警報クラス、堤防決壊避難命令級!
クラスB,Cのオブジェクト作って更に流用なんてことになると手の施しようもないカトリーナクラス!!
ここまで来ると、オブジェクト至高だとか流暢なこと言ってられない、逆に裏スパゲチィ劣化版オブジェクト歯垢
引数参照渡しの場合、双方向あてがわれてローカル内で片方向にしてローカル変数で隠蔽等が効きにくい、禁じ手に近い
0926デフォルトの名無しさん
2005/11/06(日) 03:11:200927デフォルトの名無しさん
2005/11/06(日) 03:11:47クラスCのメンバ:(A)a2.foo(&c);
しっけい、こうだな
0928デフォルトの名無しさん
2005/11/06(日) 03:14:550929デフォルトの名無しさん
2005/11/06(日) 03:22:030930デフォルトの名無しさん
2005/11/06(日) 15:09:40自分でつくったヘッダはどのディレクトリに置いておくべきでしょうか?
コンパイラのincludeファイルの中に入れておかないと呼び出せないのですかね
0931デフォルトの名無しさん
2005/11/06(日) 15:10:48カレント若しくはmakeで指定してるディレクトリ
0932デフォルトの名無しさん
2005/11/06(日) 15:19:52コンパイラにインクルードファイルのパスを指定できるからどこでもいい。
流儀としては同一プロジェクトなら.cと同じ。
ライブラリなら
./include
./src
./lib
に分けるとかまあいろいろある。
0933デフォルトの名無しさん
2005/11/06(日) 15:21:48hogehoge.h の使用範囲で決めるといい
他のユーザとも共有するなら汎用ツールなら /usr 下とか
自分だけで使う汎用ツールなら ~/include とか
あるプロジェクトでのみ使うものなら、そのプロジェクトのディレクトリとか
新しい使用形態が出てきたらそれに合わせたディレクトリに ln しとくとか
んで、コンパイラのオプションで検索パスに入れておく
コンパイラのオプションはゲロ長いから Makefile かシェルスクリプトにしとくよな
0935デフォルトの名無しさん
2005/11/06(日) 15:25:10(ネタがつまらんのが致命的にキモイ)
0936930
2005/11/06(日) 15:26:22参考にさせていただきたいと思います。
有難うございます
0937デフォルトの名無しさん
2005/11/06(日) 15:27:15氏ね^^
0938デフォルトの名無しさん
2005/11/06(日) 15:27:38富士通のSEに文句言ったら、
「それは仕様で未定義になっております。」
ってさ。
0939デフォルトの名無しさん
2005/11/06(日) 15:28:56あんた自身に sage ないことより深刻な問題があるぜ
0940デフォルトの名無しさん
2005/11/06(日) 15:44:38sageは仕様か?
動作は未定義じゃないのか?
0941935
2005/11/06(日) 15:53:530942デフォルトの名無しさん
2005/11/06(日) 15:56:11このsageない基地外なんか過去から全部同じ椰子じゃないかとまで思ってしまう。
(ネタがつまらんのが致命的にキモイ)
0943チラシの裏
2005/11/06(日) 15:58:46くらいはしとこうな
0944デフォルトの名無しさん
2005/11/06(日) 16:09:33タイトルの読めないデムパの現れるスレはここですか?
0945デフォルトの名無しさん
2005/11/06(日) 16:18:220946デフォルトの名無しさん
2005/11/06(日) 16:18:53ネタがつまらんのが致命的にキモイ
0947デフォルトの名無しさん
2005/11/06(日) 16:19:32ネタがつまらんのが致命的にキモイ
0948デフォルトの名無しさん
2005/11/06(日) 16:22:10*型どうしの=が参照になって危ないという話で、
参照ではなく別オブジェクト作るという意味で、
strcpyだと、使える型が限られるから、
sizeofとmemsetが結構幅広く使えるよ、mellocやnewしたオブジェクトとかにも。
=だと参照になってしまうけど、memsetだと別オブジェクトができる。
0949737=935
2005/11/06(日) 16:29:22UNIXの話が出ると、付いていけないんですよ
0950935
2005/11/06(日) 16:36:39# え、まさかほんとに全部同じやつでもあるまいに……
0951935
2005/11/06(日) 16:44:40# あ、これ俺です!!www俺が書(ry
0952デフォルトの名無しさん
2005/11/06(日) 16:47:390953デフォルトの名無しさん
2005/11/06(日) 16:49:21必死だなww
# まさかほんとに……
0954948
2005/11/06(日) 16:53:59それとも次スレ持ち越しを期待していいのかな
なかなか難しい話で、ついていくのが大変だけど、
大事なことだし、興味もあるけど、
まあ、ワクワクしないで待ってよう。
0955デフォルトの名無しさん
2005/11/06(日) 17:26:150956デフォルトの名無しさん
2005/11/06(日) 18:50:29948 をもう一度よく読んでごらん。
単にあることを言い切っているだけで、回答か議論か要求がわからない。
スレ違いも重症でわざわざ C++ を持ち出す必要性あるいは意図がまったく見えない。
用語の使い方もかなり変で、解読にかなりの仮定が必要だ。
これではレスがつくわけがない。
人に話しかけるときは要求をはっきり言ってくれ。
0957デフォルトの名無しさん
2005/11/06(日) 18:52:33最初からC++のスレに書けwww
0958デフォルトの名無しさん
2005/11/06(日) 18:56:230959デフォルトの名無しさん
2005/11/06(日) 18:57:260960デフォルトの名無しさん
2005/11/06(日) 19:17:59とりあえずプログラムは作ってみたのですが、うまく作動しません。
助言をお願いします。
#include <stdio.h>
#include <math.h>
float f(float x);
float main(){
float a=0.1,b=M_PI,c;
int k=0;
while(fabs(f(c))>0.01){
k++;
c=(a+b)/2;
if(f(c)<0)
b=c;
else
a=c;
}
printf("Answer=%f\n",c);
printf("Number=%d\n",k);
}
float f(float x){
return (3*sin(x)-log(x));
}
0961デフォルトの名無しさん
2005/11/06(日) 19:24:30goto 宿題スレ;
0962デフォルトの名無しさん
2005/11/06(日) 19:30:030963デフォルトの名無しさん
2005/11/06(日) 19:35:36コンパイル・ビルドしてみたところ、
a=(float)0.1
return(float)(〜
とした方がいいんじゃないかということとlog(x)のxに負の場合を考えてないのではないかということ
あと#define M_PI ? で分からない
>956−957
要求?そんなものないですが。
参照回避でstrcpyは定石で、その話が前レスにでたもんで、
ついでに拡張版のsizeofとmemsetを持ち出しただけで、
おまけでついでにクラスオブジェクトの話も出したので、
C++だがとことわりを入れたまでなんだけど、
sizeofとmemsetがでた時点で意味分かると思ったけれど。
0964デフォルトの名無しさん
2005/11/06(日) 19:46:05君ね、ここ見る人がみんながみんな前レスから読んでたり示されてもいない前レスを調べに行ったりはしないんだよ。
言わなくてもわかる人にだけ話しかけたつもりならそれでもいいけど、現に君はレスがつかないことに不満なんだよね。
母数を増やすという努力くらいしてもいいんじゃないの?
0965デフォルトの名無しさん
2005/11/06(日) 19:47:060966960
2005/11/06(日) 19:47:21ありがとうございます、本当に感謝です!!できました。
0967デフォルトの名無しさん
2005/11/06(日) 19:50:150968デフォルトの名無しさん
2005/11/06(日) 19:55:440969デフォルトの名無しさん
2005/11/06(日) 20:03:10約0.70636π[rad]
0970969
2005/11/06(日) 20:10:09約159.98401[度]
約0.88880π[rad]
0971デフォルトの名無しさん
2005/11/06(日) 20:34:05double でいいじゃん。
0972デフォルトの名無しさん
2005/11/06(日) 21:07:02(注)
・最低4元
・与えた一次方程式の明記
・ピボット洗濯を必ず必要とする方程式であること
という課題なんですがさっぱりわかりません
助けてくださいお願いします
0973デフォルトの名無しさん
2005/11/06(日) 21:12:580975デフォルトの名無しさん
2005/11/06(日) 22:12:29C言語なら俺に聞け! Part 117
http://pc8.2ch.net/test/read.cgi/tech/1131282679/
0976デフォルトの名無しさん
2005/11/06(日) 22:42:310977デフォルトの名無しさん
2005/11/06(日) 22:44:26int a[2][3][4];
と配列の配列の配列を定義したとき、
a、a[0]はどんな値を指すんでしょうか?
0978デフォルトの名無しさん
2005/11/06(日) 22:45:57aはint [2][3][4]型でポインタへの変換がかかるとint [3][4]へのポインタ型になる。
a[0]はint [3][4]型でポインタへの変換がかかるとint [4]へのポインタ型になる。
0979デフォルトの名無しさん
2005/11/06(日) 22:50:18aは、配列aの先頭ポインタです。
a[0]は、配列a[0]の先頭ポインタです。
つまり、a = a[0]
0980デフォルトの名無しさん
2005/11/06(日) 22:50:21即レスサンコス。
ポインタへの変換がかかるってのは式中で配列名がポインタ型になるって意味でOK?
0981デフォルトの名無しさん
2005/11/06(日) 22:54:37アドレスが一緒なのは分かるんですけど、
int a[2][3];
int *p1=a;
int *p2=a[0];
で警告が来るのがなんでかなぁと思うわけです?
0982デフォルトの名無しさん
2005/11/06(日) 23:11:39int a[2][3]の場合、
a[0]でポインタをGetするのは正しいやり方だっけ?
0983デフォルトの名無しさん
2005/11/06(日) 23:33:06int *p2=(int *)a[0];
0984デフォルトの名無しさん
2005/11/06(日) 23:39:17よくあるだろ
>>981
型が違うから
0985デフォルトの名無しさん
2005/11/06(日) 23:40:16すいません、>>978を見れば>>981はアホなソースですね。
0986デフォルトの名無しさん
2005/11/06(日) 23:47:51int (*p1)[3]=a;
int *p2=a[0];
とやれば通る。
で、型の違いは
p1++,p2++としたときに、p1とp2の指すアドレスがどこか、という点に現れる。
具体的には &a[0][1]か、&a[1]か。
0987358&335
2005/11/06(日) 23:53:105w+2x−2y+z=7
3w+x−y+z=6
7w+2x+y−3z=2
(注)ピボット選択必須
この連立一次方程式をガウスの消去法で解くプログラムを完成させよ
お願いします
0988デフォルトの名無しさん
2005/11/06(日) 23:59:180989デフォルトの名無しさん
2005/11/07(月) 00:01:15そこをなんとかお願いします
0990デフォルトの名無しさん
2005/11/07(月) 00:07:29どもです、型の違いってのはインクリメントで型のサイズ分アドレスがふっとぶってことですよね。
printf("%d",*p);
としたら、アドレスらしきものが表示されるんですけど、*pってのはいったい何を意味するものなんでしょうか?
printf("%d",*p);
としたら適当にちゃんと初期した値がでてきました。
0991デフォルトの名無しさん
2005/11/07(月) 00:07:380992デフォルトの名無しさん
2005/11/07(月) 00:08:170993デフォルトの名無しさん
2005/11/07(月) 00:10:32宿題スレでレス付いてんじゃん
0994デフォルトの名無しさん
2005/11/07(月) 00:15:19ちなみに「ガウス消去法 ピボット」でぐぐった先のプログラムを
弄っただけだけだからみんな同じようなもん提出してバレてもしらねーよ
あと、氏ねカス
0995toro
2005/11/07(月) 00:16:03プログラムを教えてください。
0996デフォルトの名無しさん
2005/11/07(月) 00:18:07題も出題者もレベル低いな
goto宿題スレ
0997デフォルトの名無しさん
2005/11/07(月) 00:18:39w
0998デフォルトの名無しさん
2005/11/07(月) 00:18:530999デフォルトの名無しさん
2005/11/07(月) 00:19:471000デフォルトの名無しさん
2005/11/07(月) 00:19:5510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。