1 :
デフォルトの名無しさん :
2006/03/14(火) 11:20:04
//1乙
ぬるぽって何?
ぬるぽ【NullPointerException】[Java・クラス・例外] 参照する変数がnullであるため処理を続行できなくなったときに プログラムまたはJava仮想マシン(JVM)が送出するランタイム例外 ガベージコレクション(GC)のタイミング、処理が重いときや JVMのバージョン等の影響で再現性なくこの例外が送出される場合がある 再現性なく問題が発生することがあるので、対処のしようがない (設計も見直すことで解決するかもしれない) →オーマイ「ガッ」 →キーボードなど「ガッ」と叩いて八つ当たりする とすることから ぬるぽ→ガッ の流れができた のかは知らん
>>4 「ガッ」してたのは「Javaにはポインタなんてないよ派」だけど
まあ大体あってる。
3です。大体わかったんですが、スレの中の発言での『ぬるぽ』はどういう意味何でしょうか?
ガッ どこがわかったのかw
ぬるぽが略語であること
ガッわかったってことかな?
hogeってなんだよ。
ぬるぽの使い方がわからん
いつ何処で誰が何のためにぬるぽ使ったんだ?
>>12 #include <stddef.h>
int main()
{
int *p = NULL;
*p = 0;
return 0;
}
VBとCの根本的な違いって、何ですか?
VBはスレ違いなこと。 っつーか、「国鉄と乗用車の根本的な違いって、何ですか?」並にアフォな質問だな。
質問なのですが、 struct tagtext{ inta; struct tagtext*next; }; typedef struct tagtextTEXT; int main() { TEXT*head,*cp; inti; head = NULL; for(i = 0;i < 10;i++){ if((cp = (TEXT*)malloc(sizeof(TEXT)))==NULL) { puts("記憶領域の確保失敗"); exit(1); } cp->a = 200 + 10 * i; cp->next = head; head = cp; } while(cp != NULL){ printf("%d\n",cp->a); cp = cp->next; free(head); head = cp; } return (0); } このプログラムの時に、freeで開放するのはwhileの中で一個ずつ開放するのと、 whileから出て freeで開放するのは、どっちで開放しても同じ結果になるんですか?
>>21 どちらにしてもループさせながら全部 free() するのが正解だと思う。
>>22 解答ありがとうございます<(_ _)>
今度から毎回whileの中で開放するようにします。
>>22 さん本当にありがとうございました!
>>23 まあ別に for でもいいんだけどさ。確保したものはきっちり解放するようにした方がいい。
まあ、解放直後に終ってOSに制御を移すような場合はやってもやんなくても同じだが、
OSなしの環境でそれをやるとしばらくすると暴走する機械ができ上がったりする。
>>前スレ995 不定値だから1以外になることももちろんある。 連続して実行させると1ばかり出るというのも起こりえる。それでも不定は不定。
実行すると最後に表示されるのですが、エラー報告付きの終了になります。 どこの辺が問題の部分なのか指摘して頂きたいのですがお願いします。 少し分けて貼ります。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct person { char name[64]; struct person *next; }Person; typedef struct { Person *head; Person *tail; }List; Person *AllocNode(void);//1ノード追加 void AppendPerson(List *list);//ノードの追加 void PrintPerson(List *list);//全ノード表示 void InitPerson(List *list);
Person *AllocNode(void) { return ((Person *)calloc(1,sizeof(Person))); } void AppendPerson(List *list) { Person *ptr = list->tail; list->tail = AllocNode(); printf("名前は?");scanf("%s",ptr->name); ptr->next = list->tail; } void InitPerson(List *list)//制御ブロック作成 { list->head = list->tail = AllocNode(); } void PrintPerson(List *list) { Person *ptr = list->head; while(ptr != list->tail){ printf("%s",ptr->name); ptr = ptr->next; } }
void main(void){ List list; int flag = 1; InitPerson(&list);//初期化 do{ AppendPerson(&list); printf("追加しますか?1→YES、2→NO\n"); scanf("%d",&flag); }while(flag != 0); PrintPerson(&list); free(&list); }
あー、微妙に勘違い でもmain内のlistって初期化されてないよな?それ
うわあ、List型はポインタじゃねえからやっぱ
>>29 であってるのかあqwせdrftgyふじこlp
>>29 気付きませんでした・・・ポインタでは無いと言う事ですよね?
ポインタにして実行してみます。
一番最後のfree(&list);
freeするのはListそのものじゃなくてListが指してるヤツだからな 芋づる式にケツからfreeせんとだめだから結構面倒だぞ
>>31 ご指摘されたlistをポインタに変え、アドレス演算子のついた場所を取り除いてみましたが
やはり、エラーの報告と言うのが出て、エラーを送信しますか?というのが出てしまいす。
>>33 freeの関数のアドレス演算子も取ってみましたが変わらずエラーになってしまいます。
>>34 確保した領域は全てfreeしなければいけないという事なんですね・・・。
このプログラムの場合ですとfreeしていく関数が必要なんですねorz
ではまず、その関数を考えます。ありがとうございます!!
>>26-28 のままで基本的にはいい。
エラーは一番最後のfree(&list);のせい。
listはcallocで割り当てられてないのでfreeしちゃだめ。
AllocNodeで割り当てた分についてはPrintPersonみたいに一つづつfreeしないとだめ。
List ←こいつはmallocで確保したわけじゃないからfreeできない | head ←こいつはmallocで確保してるからfreeできる、けど・・・ | head ←こいつからfreeしないとダメ(上からやるとこいつを参照する手段無くなる) だからListをポインタにして、こいつを動的に確保しただけだと結局意味ねえ
>>37 そういう間違いをしていたのですか。では領域を開放するのをPrintPersonの関数と
似た感じで作ればよろしいのですね。理解できてきました!ありがとうございます
>>38 結局意味無いのですかorz。でも作ってしまったので一応やってみます。
書いてあるのをみると、tailからfreeしていけばよろしいですね。
とても参考になります!ありがとうございます。
2つ目のheadはnextの間違い
>>39 一応、Listをポインタで宣言して、動的に確保した場合、エラーは発生せずに終了する(と思う)
でもゴミ(free出来ていない枝)がメモリ上に残ることになるので非常によろしくない
この場合誤ったfreeの直後に終了しているからトラブルは何も無いがこのあといろんな処理をする際
トラブルの温床になるのでこの機会に気をつけるようにしておくといいかな
>>41 はい。これからメモリの扱いには注意深く気をつけてみます。
皆さん親切に解答して頂きありがとうございます。
これからメモリ開放できるように考えてみます。長いプログラムで面倒でしょうに
答えて頂き本当にありがとうございました。
>>42 表示でグルグルまわしてるじゃねーか。
freeも同じようにやればいい。
でも途中の1要素だけ消すとか、そういうのも今後追加するんだろうから
それやってからでも遅くは無いか
44 :
デフォルトの名無しさん :2006/03/15(水) 19:36:56
これ、VB6にならどういうコードになるの? // Declare local identifiers: HRESULT hr = S_OK; CComPtr<ISpPhoneConverter> cpPhoneConv; CComPtr<ISpLexicon> cpLexicon; LANGID langidUS; SPPHONEID wszId[SP_MAX_PRON_LENGTH]; hr = cpLexicon.CoCreateInstance(CLSID_SpLexicon); // 0x409 for English. langidUS = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); if(SUCCEEDED(hr)) { hr = SpCreatePhoneConverter(langidUS, NULL, NULL, &cpPhoneConv); } if(SUCCEEDED(hr)) { hr = cpPhoneConv->PhoneToId(L"r eh d", wszId); } if(SUCCEEDED(hr)) { hr = cpLexicon->AddPronunciation(L"red", langidUS, SPPS_Noun, wszId); } if (SUCCEEDED(hr)) { // Do stuff here. }
1行前に戻りたい場合ってどうすればいいですか? 1文字前なら\bで戻れるんだけど行を超えて戻れない
キーボードを操作する関数ってあるんすか? 例えば、プログラムを実行すると勝手に 「windowsキー」→「U」→「U」 って押したことになるようなの
ありません
じゃあ、DOS窓でコマンド実行することはできる? 例えば、プログラムを実行すると、 C:\>ipconfig みたいになるヤシ
知ってるがお前の態度が気に入らない
そんなんsystemでも使ってればいいじゃん・・・・
>>52 さん
こんな性格ですみません。
態度を改めますので、ぜひ教えていただけないでしょうか?
今度は無視かよ
>>55 さん
いえ、無視してたわけではありませんよ。
system関数使っていろいろやってみたんですけど、
system("hogehoge");
引数をどうしたらいいかわかりませんw
先生!重度の怪我人が居ますがスルーでいいのですね。
>>56 お前は何を言ってるんだ?
ipconfig実行したなら
#include<stdio.h>
#include<stdlib>
int main(void){
system("ipconfig");
return 0;
}}
したなら⇒したいなら & 最後の括弧イラネ
ipconfigの場合はそのまんまでできたんですけど、 カレントディレクトリを変更するのって無理なんでしょうか?
あの、return 0 と return -1とかの違いって何ですか? main()の最後でどっちにしても変わらないんですが
63 :
60 :2006/03/15(水) 22:25:23
親切に教えていただきましてありがとうございました。
>>64 0か-1を返すのでは何か違いでもあるのでしょうか?
0と-1だから違うんじゃね? てか気にしなくてOKだと思うが
なんかエラー処理のときによく-1が返されるのを見るのですが、 あれは、単に明示的なものなんでしょうか? わかりました。気にしないようにします。 ありがとうございました。
普通は0はEXIT_SUCCESSと同じで関数が無事終了したっていう意味 -1は知らん
>>67 おまいさんが UNIX/Linux 使ってるなら、
こういう風にエラーで分岐できる。
#!/bin/sh
if a.out; then # a.out は実行ファイル
echo success # return 0; の時
else
echo fail # それ以外のとき
fi
Windows のバッチファイルでも何か方法あったはず。
cmd.exe だと errorlevel で判別できるんじゃないかな。 でも -1 はどうかな? 普通OKだったら0返してダメだったら1とか、 あるいは sysexits.h にある EX_なんとか を返すよな。 stdlib.h の場合は EXIT_SUCCESS とか。
ディレクトリのファイルの名前調べる方法あります?
ありません
マジで?
んじゃあファイル名一覧とかあれはAPI限定?
75 :
デフォルトの名無しさん :2006/03/16(木) 03:26:21
環境依存です
なんで?
なんで?
78 :
デフォルトの名無しさん :2006/03/16(木) 03:58:04
Cの標準ライブラリにそんな関数なかろう
他の言語ならできるの?
C言語って何にも出来ないね
何もできないから、やめた方がいいよ
そういうときこそVBですよ
VBに不可能は無いよな
>>84 それを言うなら「ディレクトリの概念がない」だろう。
昔のDOSはディレクトリ無かったみたいだけどな 組み込み系とかはファイル無いシステムもあるんじゃないかね
例えばBTRONはファイルの概念があるけどディレクトリの概念がない。 fopen()は名前をストリームとして開く関数だから、これをファイルの概念と言ってもいいと思うが。
FILE構造体が存在する時点でファイルの概念が存在している。 ディレクトリ操作関係はPOSIXで定義されているがC標準では無い。
ファイルシステムが存在するかどうかはC言語とは関係無いけどね。
標準じゃないけどディレクトリ操作関数はだいたいあると思うが
組み込みな用途じゃ使えないけどな
ぬるぽって何?
結局のところ、動的に確保したメモリは解放しなければいけないのでしょうか? しないでもいいと書いてあるサイトもありますが・・。 プログラム終了時に解放されることは保証されているのでしょうか?
別に終了すれば解放されるよ ただ自分で解放したほうがいいよ
取り壊し予定の家の部屋掃除する奴は教条主義者の馬鹿 物事を柔軟に考えられない硬直した思考の持ち主
>>96 普通のOSはメモリについてはプロセスが完全に終わった時に開放する
ので普通のOS上で動くプログラムの場合はなくても多分大丈夫。しかし
マイコン基板のROMなどに焼かれて動くプログラムでそれをやると多分
まともに動かない機械ができあがる。
>>98 それは取り壊す人が別に居る場合に言えることだ。
終了するプログラムだけを書いてるならあまり考えなくてもいいかもしれんが・・
終了しないプログラムなど存在しない マシンは物理的に存在し、何時かは寿命を迎えるのだから ・メモリを確保する理由が無くなったら解放する必要がある。 ・(特に理由がなければ)プログラム終了時にメモリを解放する必要などない
>>96 解放しなくてもいい場合もあるがそうでない場合もある。
この違いに自信がなければ解放しといたほうが無難。
年に一度はあるやりとりだな
ちょっと待てよ。C言語としてはプログラム終了時に メモリが開放されることは保証してないよな? OS が保証していることはあると思うが。
数行増えるだけなんだから解放すりゃいいじゃんって感じなんだが まぁ忘れやすいんだけどね解放
ガベコレがいない気持ちよさを味わうためにも自分で開放しなくちゃ
必要ないと判断されたら勝手に解放しますは気持ち悪いしな
ちょっと待てよ。C言語としてはfree時に メモリが開放されることは保証してないよな?
OSに返されるということは保証して無いが それがなに
変なポインタをfreeしたときの動作は保証されてないが、 alloc系でメモリ確保したポインタをfreeしたときは解放することが保証されてる
保証はされてない
じゃあ free() がこんな風に書かれていても誰も文句言えないんだ。 void free(void *p) { malloc(1024 * 1024 * 1024); }
なめんな
詭弁のガイドラインでも読め
なにを議論してんのかまとめてくれ
ただの "free on exit" じゃないのか?
処理系定義に決まってるだろ
122 :
デフォルトの名無しさん :2006/03/16(木) 19:06:38
main() { void *p = malloc(1); free(p); /* #1 */ } というパターンと、 main() { void *p = f(); unf(p); } void* f() { return malloc(1); } void unf(void *p) { free(p); } /* #2 */ というパターンを同列に論じるからおかしくなるんだよ 「プログラム終了前」は #1 だけであり、 プログラム全体の中でただ1カ所の特殊な位置での議論から #2 まで含めて「free 不要」に聞こえる主張をされても ライブラリの意義からして賛同できるはずがない main は実行環境とのインターフェイスなので本質的に処理系依存だ free の実装だの返却値の解釈だのを処理系を特定せずに強弁するから どんどんおかしな方向へ話がそれていく # 規格の中にまでこの歪みが入り込んでしまっている
手の込んだ釣りだ
何言いたいのかワカンネ
mallocで割付けされた領域をfreeで解放してなかったとき
その領域はどうなるか? って話だろ?
>>122 がなにをいいたいのかよくわからん
>>122 「プログラム終了前のfreeは不要」まで読んだ
aが0〜4なら0を代入、5〜9なら5、10〜(ry という感じにできませんか?
ESPをつかってみる
>>129 ret = (a/5)*5;
これでいいだろ?
エラーがでました
専門性が高くついていけんよ
>>130 ありがとうございます。
何で気づかなかったんだろ・・・
134 :
デフォルトの名無しさん :2006/03/16(木) 23:26:38
『猫でもわかるC言語プログラミング』という本についていたCD−ROMを使おうとして、まず一番初めにそのCDに入っていた説明を読もうと、開いてみたところ、 「このCD-ROMには、本書で扱ったサンプルコードを収録しています。 ファイルをハードディスクにコピーし、「unlock.bat」を実行して 全ファイルの読み取り専用属性をはずしてから、ご利用ください。」 と表示され、意味が全くわかりませんでした。 特に、「読み取り専用属性をはずす」って、どうやればよいのでしょう? それから、「unlock.bat」がみつかりません。 「unlock」というのがあり、押してみたのですが、黒い背景に、ただただ「アクセスは拒否されました」といったメッセージが並び、 また、サンプルどおりにCでプログラムを書き、その「unlock」に重ねて(これを実行するというのでしょうか?)みたのですが、黒い背景に「隠しファイルは再設定できません」とだあーーっとでてきてしまいます。 (「隠しファイルは再設定できません インベーダーゲーム…」とか「ピクチャー…」などでてきたので、私のコンピュータ全てを何かしているようです…) どうしたらプログラムを書いて実行できるようになるのでしょうか? 本には、このCD−ROMがコンパイラだと書いてあるのですが、それ以上は何も書いてありません。 すみませんがよろしくお願いします。
>>134 自分で調べられないなら止めといた方が無難
136 :
デフォルトの名無しさん :2006/03/16(木) 23:28:39
134ですが言い忘れました、 あの、私すごく初心者なので、「ここまでは言わなくてもいいだろ」ということろまで詳しくお願いします。。
コンパイラは入ってたかあれ? 読み取り専用は書き換えができないファイルのこと 入ってたらそのままそれ使えばいいけど無いなら BCCかVC++でもDLしてきてコンパイルせよ
>>134 猫スレがあるだろ
隅から隅まですれ違いだ
その本持ってないから分かんないけど unlock.batとunlockは同じ物。 拡張子を表示する設定にしてないだけ。 アクセス拒否はCDのファイルの属性を変えようとしたから失敗しただけ。 ハードディスクにコピーしてからやれ。
>>134 ここはC言語の話題の場
特定の本にかいてあるC言語以前の使い方ならよそでやってくれ
136 名前:デフォルトの名無しさん[] 投稿日:2006/03/16(木) 23:28:39 134ですが言い忘れました、 あの、私すごく初心者なので、「ここまでは言わなくてもいいだろ」ということろまで詳しくお願いします。。 これは酷いw なんで赤の他人がお前の勉強を全力でサポートしてくれるんだw 釣りにしてもヘタクソだ
142 :
デフォルトの名無しさん :2006/03/16(木) 23:40:27
スレをよく調べもせずすみませんでした。。
次に質問するときは「猫スレ」にいってきます。すみません。。。
レス返しだけごめんなさい
>>137 コンパイラ付属、だそうで入っていました。ですが説明がほとんどなく。。
>>139 なるほど、ハードディスクにコピー・・ まずはそれからですね。やってみます。
ありがとうございました。
143 :
134(142もです) :2006/03/16(木) 23:44:12
>>141 釣りではありません、ほんとです。。困っています。。
質問スレだったので、言いました。
面倒だと感じた人は、スルーしてください。。
147 :
デフォルトの名無しさん :2006/03/17(金) 00:07:25
>>144 Borland C++ Compiler その他開発ユーティリティ
と、書いてあります。
あと、とりあえず改めて「猫スレ」に質問してきたので、よかったらそこにレスしてもらえると嬉しいです
書いた
関数ポインタって有効な使い方あるんですか?
具体的に教えてください
qsortの第4引数とか。
どうゆうことですか? 可変長引数みたいなもんですか?
qsortの第4引数は関数ポインタだけど意識する必要ねぇし
156 :
デフォルトの名無しさん :2006/03/17(金) 10:08:24
スレッドキャンセルセーフについて教えてください 具体的にどういう作りにすればいいんでしょうか?
>>155 だから、qsort みたいな関数を作りたい時に必要だろ?
qsort() のようなコールバック関数のセット以外でも、 C言語でオブジェクト指向風なことをしたい場合に使う こともできる。構造体の中にその構造体へのポインタを 第一引数に取ってその内容に従って動く関数へのポインタを 入れておく。すると何が出来るかというと、処理する 関数を変えられるのでオブジェクト指向の言語のオーバー ライドができて多態性を実現できる。
関数ポインタ構造体に入れるのと 配列にするのは使い方としてはお約束だよな
160 :
デフォルトの名無しさん :2006/03/17(金) 11:08:07
vtable を自前で実装してる例はよく見かけるな
>>158 正にCから見たCOMインターフェイスがそうなっている。
162 :
デフォルトの名無しさん :2006/03/17(金) 11:10:05
>>156 あなたが作ろうとしている「スレッド」の内容による
開始処理と終了処理の対が破れたときに何が起きるかを明らかにし、
そのうちのマズいことへの対策を考える
164 :
デフォルトの名無しさん :2006/03/17(金) 12:15:47
>>156 環境依存なので各OSのプログラミングスレもしくは
スレッドプログラミング一般のスレでどうぞ
質問です、細かいところは省いて書いてしまいましたが これはリスト構造になっていますでしょうか? typedef struct _date{ int number; int score; struct _date *next; }date; date *add(int number,int score,date *d) { date *p; p=(date*)malloc(sizeof(date)); p->number=number; p->score=score; p->next=d; d=p; return d; } int main() { date *d; d=NULL; int number,score,i=4; while(--i){ scanf("%d",&number); scanf("%d",&score); d=add(number,score,d); } return 0; }
構造体ってやっぱWinの仕様にならって大文字にするべきなの? typedef struct UHOIOTOKO より typedef struct UhoIotoko の方が個人的には好みなんだけど
これはまたヒドス('A`)
168 :
167 :2006/03/17(金) 14:25:56
>>166 大文字は定数だろ?
Winは糞だから従う必要はない。
大文字は型名だろ
規約次第。好きにしろ。いじょ
ハンガリアン記法の一種
173 :
166 :2006/03/17(金) 15:03:31
良くわかんないけど、じゃあとりあえず好き勝手することにする ありがと
mallocの仕組みを教えて
動作が見たいんなら規格嫁 実装が知りたいんなら、gccのソース嫁
gcc?、libcの間違いじゃねーの?
つまりあなた方の知識ではわからないと
そうです ごめんなさい
>>174 ふつーの UNIX や Linux なら sbrk() とか使ってプロセスのメモリ領域
広げてそこ使ってるんじゃないのかな。
180 :
デフォルトの名無しさん :2006/03/17(金) 18:44:18
>>174 ISO/IEC9899 は malloc の実装を定義していないので
この話題はスレ違いになりやすいので注意されたい
まずは gcc か VC のソースを読んでみてはいかがかな?
gcc のソース
ftp://ftp.gnu.org/gnu/gcc/ VC のソース(CDドライブのドライブ文字を X: と仮定)
X:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\crt\src
X:\VC98\CRT\SRC
gccやVCのソース読めばわかるの?
でっかい配列作っておいて、alloc呼ばれたらすこしずつ切り出して貸す、 みたいなのを練習で作ってみるとか。貸し出しテーブル作ってもいいし 貸し出すときにヘッダつけてもいいし。
K&Rに載ってるけどな > mallocの実装
static char memory[65535]; static char *head; void *malloc(size_t size) { void *p = (void*)head; head += size; return p; } void free(*p){}
185 :
デフォルトの名無しさん :2006/03/17(金) 20:03:26
おーい境界要求どうすんの?
186 :
デフォルトの名無しさん :2006/03/17(金) 20:04:18
つーか、それ以前のアフォだなこいつわ
データA1 データC1(データB1、データB2…)|データC2(データB1…)|データC… データA2 データC1(…)… データA… というテキストを読み込んでA、Cに属するBを格納するプログラムですが 三次元配列になってしまいました。 仕方ないことでしょうか? 教えてください。お願いします。
188 :
デフォルトの名無しさん :2006/03/17(金) 22:31:11
三次元配列になることの何が「仕方ない」のか? 避けたかったことは何か?
189 :
187 :2006/03/17(金) 22:54:52
すみません。 多次元配列となると処理が遅くなるようなイメージがあったので もっと効率的に処理できる方法が、他に何かなかったか 分からなかったのでこちらで尋ねました。
190 :
デフォルトの名無しさん :2006/03/17(金) 22:56:34
すいません。以下のサンプルで構造体の領域を確保して、 その領域を初期化する方法は正しいでしょうか。 誤りがあればご指摘いただけると助かります。 #include <stdio.h> int main() { struct A { int a; long b; int c; long d; char *e; }; int z; struct A *AA; AA = (struct A *) malloc(sizeof(struct A)); memset(AA,'\0',sizeof(struct A)); return 0; }
あってるけどcalloc使っとけ
192 :
デフォルトの名無しさん :2006/03/17(金) 23:05:09
>>189 処理が遅くなるかどうかは、まず実測してから
その観測事実に対して考察を行うべし
10万回から1億回くらいの実行時間なら
ストップウォッチや時計の秒針でも確認できるだろう
base[index].displacement みたいなアドレッシングの速度は、
昔言われていた計算時間の考え方と今とではかなり違ってきている
いいけどわざわざ '\0' じゃなくて 0 でよくね
194 :
デフォルトの名無しさん :2006/03/17(金) 23:15:10
> 191、193 ありがとうございます。参考にします。
>>180-181 ここだけの話、mallocに関してはVC++のソースを読んでも役に立たないと思う。
196 :
デフォルトの名無しさん :2006/03/17(金) 23:39:35
HeapAlloc を使っているということがわかれば十分だと思うが
>>190 それで動くけど struct A が char *e を含んでることが問題なのかな?
memset(AA, 0, sizeof(struct A)); で AA が納まる領域はすべて 0 (全ビット
0 )で埋まるけど、C の仕様上、
・ポインター型の 0 は、全ビット 0 とは限らない。論理が反転していて(負論理)、
111...111b かもしれない。十進コードかもしれない。
・ NULL は「ポインター型の 0 」とも限らない。負論理の 0 なら、111...111b のは
ずだが、NULL は 011...111b かもしれない。
これらはデータとポインター(アドレス)とを厳密に区別していた(CPU 内部の
演算器も別になっていた)時代の名残で、現代の CPU のアーキテクチャーから
見ると迷惑な配慮でしかない。
処理系ごとの NULL 値の違いには、コンパイラーが全部自動的に対応してく
れるので、ソースコード中、ポインター値が必要なところに 0 と書けばそれはその
処理系における NULL 値に翻訳される。ヘダーファイルの中に、NULL はどうせ
((void*)0) と定義されている。これを ((void*)777) 等に直すとたぶん動かなくな
る。
NULL を int にキャストすれば 0 が得られる。もし上記がほんとなら、ポインター
変数を int にキャストするようなコードでは、実行時に NULL に出会うと変な値が
得られそうなものだが、そういう処理系ではその変な NULL 値を検出して 0 に直
すコードが追加されるんでしょね(遅くなる)。私はそんな処理系を見たことないの
でどんなコードが吐かれるか知らないが。
コンパイラーがすべて自動的にやってくれるはずだが、ポインターのポインター
を強引に別の型のポインターにキャストして参照するようなコードでは、内部表現
の違いが露見してしまう。
こういう問題があるので、口うるさい香具師は、メンバーにポインター変数を含
む構造体の初期化には memset()、calloc() を使ってはいけないと言いやがる。各
メンバーを個別に初期化せよ、と。その際は次のように問うてみよう。「NULL の内
部表現が全ビット 0 でないような機種・ OS ・コンパイラーが何て名で何処にある
のか?」 私は memset() も calloc() も使いますけど。どうせ食品ですから。
食品?
arry[10] = {0,1,2,3,4,5,6,7,8,9}; みたいな配列の中身をランダムに格好良く書き換える方法教えてください
書き換えるというか 配列の中身をランダムに入れかえるですね arry[10] ⇒{1,0,6,2,7,3,8,5,4,9} みたいに
>>198 おれ、NULLの内部表現のこととかまだ曖昧なんだけど
内部表現が0じゃない場合
int *p;
memset(&p, 0, sizeof(int*)/sizeof(char));
としたら
if( p != NULL )
は真になってまうんですか?
for (int i=0; i<10; ++i) { int j, tmp; j = rand() % 10; tmp = arry[i]; arry[i] = arry[j]; arry[j] = tmp; }
ありがとう v( ̄ー ̄)v
正確には「NULLの内部表現」じゃなくて「ヌルポインタの内部表現」な
>>201 std::randam_shuffleの実装をコピー
208 :
デフォルトの名無しさん :2006/03/18(土) 07:32:40
>>198 > 「NULL の内部表現が全ビット 0 でないような機種
Lisp マシンはおおむね NULL の内部表現は全ビット 0 ではないな.
C の処理系が実装されているものがあるかどうかは知らないが...
最近の実装なら偏らないだろ
>>216 発言の意図がわからないので解説か正しいコードよろ
>>217 要素数nのとき可能な並び順はn!
>>203 のコードによって生成される並び順はn^n
n^n/n!は整数になるかな? ならないかな?
You see?
Cスレだった。n^nはnのn乗な。
220 :
デフォルトの名無しさん :2006/03/18(土) 12:27:42
>>220 こんな単純なことも分かんねぇんだ
プログラミングやめたほうがいいよ
j = rand() % (10 - i) + i; が正解。
224 :
デフォルトの名無しさん :2006/03/18(土) 15:49:38
下記の問題をといてくれませんか? キーボード整数a,b,cを読み、最大値を表示するプログラムを作る」 /* 題名・・ */ #include<stdio.h> void main (void) { ---------------- ---------------- } ---から---までの間を回答してもらえると助かります。 多分if文を使うと思います。 宜しくお願いします。
int a, b, c; printf("1個目の数字を入力\n");scanf("%d", &a); printf("2個目の数字を入力\n");scanf("%d", &b); printf("それらを超える数字を入力\n");scanf("%d", &c); printf("最大値は%dです\n", c);
できた! #include <stdio.h> int main(void){ unsigned int i; char temp[] = {0x82, 0xD8, 0x82, 0xF1, 0x8E, 0x81, 0x82, 0xF1, 0x82, 0xBE, 0x82, 0xE7, 0x82, 0xA2, 0x82, 0xA2, 0x82, 0xE6, 0x00}; for(i=0; i<=0xFFFFFFFF ; i++ ){ printf("%d%s\n",i,temp); if( i == 0xFFFFFFFF ) i=0; } return 0; }
つまりvoid func(int hoge[3][2]); はvoid func(int (*hoge)[2]); のシンタックスシュガーである。
>>227 このように無限ループするプログラムで
Pauseキーを押すと、ループを止めることが出来ます。
232 :
http://www.vector.co.jp/soft/win95/util/se072729.html :2006/03/18(土) 18:21:59
名ソフト TextSS の64bit化キボンヌってできない?
234 :
デフォルトの名無しさん :2006/03/18(土) 19:11:13
>>232 通常マルチポスト自体を責めはしないが
おまえは本当に鬱陶しい
特注ソフトウェアが必要なら対価を払え乞食め
嵐に話しかけるなおw
質問させて下さい bool型の変数に格納できる値の上限は32bitまでなのでしょうか? よく分かりません、助けてください
あ、すいません勘違いしてました すいませんした屑共
238 :
デフォルトの名無しさん :2006/03/18(土) 22:01:41
#include <stdio.h> main(){ int player,i,r; for (i=0;i<5;i++){ r = scanf("%d",&player); while(getchar()!='\n'){} printf("%d回目",i+1); if(r){printf("%d\n",player);} //入力が正常の場合 else {printf("入力エラー\n");} //入力が不正な場合 } return 0; } これのr = scanf("%d",&player);とは何を意味してますか?rが何かよく分かりません
240 :
デフォルトの名無しさん :2006/03/18(土) 22:03:52
>>238 その場は難を逃れても先が思いやられるな
そのサンプル作ったセンセイ・・・
>>238 0以外なら正常 0だとおかしい、つーかんじ
詳しくはscanf 戻り値 でググレカス
質問 hoge{for (i=0;i<3;i++){printf("%d",aray[i]);}printf("\n");} を実行すると毎回、上書きになるのですが、続きから書き出すにはどうすればいいですか MSDOSで 実行.exe > ホゲ.txt のように書き出してます
>>
実行.exe >> ハゲ.txt
245 :
242 :2006/03/18(土) 22:17:01
hogeを呼び出すたびに、追加出力する場合、どうなりますか
まずは試せhage
247 :
デフォルトの名無しさん :2006/03/18(土) 22:20:07
C++ スレでやれ、ここでは hige だ
248 :
242 :2006/03/18(土) 22:35:40
>>で解決したのですが、コード上で実現するにはどうしたらいいものかと。 前の書き出し位置を覚えておかないとだめですよね。どうするんだろ
249 :
デフォルトの名無しさん :2006/03/18(土) 22:43:39
>>238 ですが、rの値は0か1になるんですか?
文字が入力されたとき(scanfが停止したとき?)は0,数字が入力されたときは1になるんでしょうか?
250 :
デフォルトの名無しさん :2006/03/18(土) 22:52:59
251 :
デフォルトの名無しさん :2006/03/18(土) 22:53:16
fopenで"w"ではなくて、"a"で開けば終わりだろ?
253 :
デフォルトの名無しさん :2006/03/18(土) 22:54:18
いいかげん目覚めなさい こんなとこで聞いても答えは返ってきません。 自分で調べることを覚えなさい!!
>>252 a = アナル
アナルを開けぇ(゚∀゚ )
256 :
デフォルトの名無しさん :2006/03/18(土) 23:02:50
>>249 おまえ本当に師に恵まれないな・・・ (255 とか
規格票くらい買えって命令してくれる人を探す方が修行に先立って必要っぽいぞ
rand() % (10 - i) + i
うあ、みすった・・・ rand() % (10 - i) + i にしなくても、純粋にバラバラにしたいんだったら rand() * 10 でもいいんじゃないの?
259 :
デフォルトの名無しさん :2006/03/18(土) 23:07:35
>>258 それを言うなら arry[i] = rand(); だろ
260 :
255 :2006/03/18(土) 23:09:09
>>249 仕方ない教えようscanfの戻り値は代入に成功した個数
失敗の場合は0等を返す
261 :
デフォルトの名無しさん :2006/03/18(土) 23:10:23
再掲
>>249 おまえ本当に師に恵まれないな・・・ (255 とか
規格票くらい買えって命令してくれる人を探す方が修行に先立って必要っぽいぞ
>>258 いや、バラバラに「並べ替えたい」んだってさ
規格票テラタカス
264 :
デフォルトの名無しさん :2006/03/18(土) 23:22:46
1000 倍くらいにハネるギャンブル
>>240 どういうことですか?
1a
とか
(スペース)1
とかって入力しても
入力エラーにならないからダメなんですか?
266 :
デフォルトの名無しさん :2006/03/18(土) 23:28:04
>>265 if(r)
↑
これ
問題点は複数あり、どこから突っ込むか迷うほど
少なくとも、そのうちの1つに、あなたは気づいているわけだが
少なくともwhile (getchar() != '\n') {}はscanf("%*[^\n]%*c");で置き換えられる。
>>258 だからよぉ
>>218 でいった通りそれじゃあ均等にはなんないんだってばさ。
(rand()が均等であることは前提な。)
要素数3でくらいで全パターン書き出してみろや。
要素数nとして常にrand()%nで交換すると、n回交換するとnのn乗のパターンが等確率で出るのは分かるか?
しかし全パターン数はn!しかない。
そもそもnのn乗/n!は整数にならん。
ということは、いずれかのパターンがほかのパターンよりも多く出現するってこった。
整数になるからって均等とは限らんが、少なくとも均等であるためには整数であることが必要条件。
270 :
デフォルトの名無しさん :2006/03/18(土) 23:52:24
問題は
>>224 if文で、
if(a>b)
printf("最大値=%d\n",a);
if else(a>c)
printf("最大値=%d\n",a);
if else(b>a)
printf("最大値=%d\n",b);
if else(b>c)
printf("最大値=%d\n",b);
if else(c>a)
printf("最大値=%d\n",c);
else printf("最大値=%d\n",c);
と入力しました.
a=6 b=5 c=4と入力したはずなのに「最大値=5」表示されてしまいます。
ifを使って解けるといっていますが、これを使って解けないでしょうか。
ifガ使えない場合は、なるべく簡単な方法にてご教授下さい。
>>270 マルチの上に嘘つきとは、救いようがないな。
これコンパイル通るのか?
274 :
デフォルトの名無しさん :2006/03/19(日) 01:03:25
疑問文とは痛い奴
275 :
238 :2006/03/19(日) 01:16:35
rの値は何となく分かりました また分からないところが出てきたんですが、 while(getchar()!='\n'){} の意味は、文字が入力されたときscanfが止まるからバッファを空にするため?ですか?
>>275 そのように見えますね。(stdinを空にしているのかな。
でもfflushを使わない事や、getcharのチェックでEOFを使わないのはなぜだか良くわからない。
fflush()は入力バッファのフラッシュは未定義できる場合とできない場合がある
なるほど。
unsigned long以上のbitを確保することはできますか?
long long int型などを使えばできます
281 :
279 :2006/03/19(日) 08:54:12
は?ワレが 馬鹿にしよってからに
282 :
デフォルトの名無しさん :2006/03/19(日) 09:29:02
283 :
279 :2006/03/19(日) 09:32:42
悪かった…
284 :
デフォルトの名無しさん :2006/03/19(日) 09:37:24
long long は C99 で新設された型なんで未対応のコンパイラはざらにあって 例えば __int64 などとなっていたりする
でも、たとえばVC++なんかも最近のバージョンではlong longがあるね。
struct { unsigned int low. high; };
確実じゃないけど struct word { int b0:1; ... int b511:1; };
288 :
287 :2006/03/19(日) 10:09:57
289 :
279 :2006/03/19(日) 10:28:54
どうもありがとう
long longといえば、My penis
こういうの↑が出てくるようになったんで春も近いな…
>>288 え? '.' なんてC言語にあったっけ?
どうでもいいけど標準I/O関数から偽が返ってくる状況で生きてるシステムなんてあるのか?
>>293 何が言いたいのか判らないので詳しく。
#例えばストリーム系なんていとも容易くエラーを返すわけだが。
296 :
デフォルトの名無しさん :2006/03/19(日) 21:07:55
標準I/O関数? 偽?
今の若い人はアセンブラ→Cみたいな覚え方はやっぱり していないんですかごほごほ。
DEBUGコマンドからCに入るなんて普通しないぞ・・・
299 :
デフォルトの名無しさん :2006/03/19(日) 22:50:01
stdioとかstdlibとかstrは何の略(?)とか分かるサイトありませんか? intはinteger=整数、charはcharacter=文字という感じで
>>299 サイトは知らないけど
std=standard
io=input/output
lib=library
str=string
>>297 俺くらいオサーンになると
機械語→アセンブリ→PL/M→C
昔話はやめてくれ
304 :
デフォルトの名無しさん :2006/03/19(日) 23:42:43
>>297 HP逆ポーランド→4K BASIC→機械語→自作ASM→大型機ASM→大型機C→組み込みC
いまハード屋
>>297 BASIC→機械語→FORTH→C→Ruby→C++
元は趣味で今プログラマ
306 :
デフォルトの名無しさん :2006/03/20(月) 00:27:53
char str[]="abc";で、printf("%c",str[1]);ならbが出ますが、 char str[]="あいう";で「い」を出力するためにはどうすればいいですか?
>>302 > 機械語→アセンブリ→PL/M→C
PL/M 使った奴は負け組み
309 :
デフォルトの名無しさん :2006/03/20(月) 00:37:47
VC++2005で、とりあえずウィンドウ表示させたいんですが どう記述すればいいですか
311 :
310 :2006/03/20(月) 00:41:38
>>309 ググれば簡単に出てくるので
少しは検索してみましょう
312 :
デフォルトの名無しさん :2006/03/20(月) 00:48:13
313 :
デフォルトの名無しさん :2006/03/20(月) 01:01:27
>>306 まぁ
printf("%c%c",str[2],str[3]);
とでもしておけ
>>306 まぁ
char *str[] = { "あ", "い", "う" };
printf("%s", str[1]);
とでもしておけ
俺から見てもネタだと思ったぜ 騙されたようだ
>>318 いやぁやってみたら問題なかったからOKなのかと思ったぜ( 'A`)
お前の環境でたまたま問題無かったからといって、あんな書き方をするもんじゃない。
じゃあどうすればいいんだ strをコピーして先頭アドレスを任意のところまで移動して出力したい文字の後ろに\0入れて %sで出力とか? てか・・・・・・素直にwchar_t使った方がいい希ガス
もともと日本語文字なんて環境依存なんだから、その環境でうまく動けばそれでいいじゃないか。
324 :
デフォルトの名無しさん :2006/03/20(月) 01:52:34
ソースに全角つかうヴォケは死刑
ってかホントに表示されるんだな… 知らんかった
日本語を表示させたい場合はすべて外部のファイルから取り込めと?
相手の環境もわからないのにその環境も糞もないよな
>>325 俺の脳みそでは常識になってた
俺ダメぽorz
シフトJISなら「全角文字は2バイトだ」 という風に考えて問題ないかもしれんが EUCとかだとそうもいかんからな
メリケンの文字に依存する必要なんてない! こちとら日本じゃ いまこそ「ひまわり」「なでしこ」の出番ですよ!
331 :
デフォルトの名無しさん :2006/03/20(月) 02:32:52
モバイルギア2(WINDOWS CE2系統)でc言語のコンパイルってできますか? 調べてみたらeMVC3++というのがmicrosoftのフリーであるらしいんですが、 そもそも可能なのかどうかわかりません・・・
(******printf)("hello,world\n");
何そのふざけた関数ポインタ
それがC言語クオリティ
>>331 少なくともここではスレ違い。
どこかほか行ってちょうだい。
1文字ずつ連結して文字列リテラルにすることはできるのかな?('s'+'a' = "sa") grepのように検索して、当たった行を表示するのを作ってるのだけど、 c = getc(fp)で一文字ずつ取り出した文字を配列にいれていったのだと 要素数が大きくなるからどうしようかなと....
reallocで倍々に領域増やして池 リテラルを実行時に動的に作るとかありえない
半角の「Q」または「q」を入力した場合、処理を終了するようにしたいのですが、これでいいのでしょうか? scanf("%d", &num); if(num == Q or q) { exit(); }
char c; while(scanf("%c", &c) != 1 || (c !='q' && c != 'Q')) ;
度忘れしたんですが、C言語って大文字小文字って別物で捉えてるんでしたっけ?
お前は子供か
そんくらい答えてやれ。
>>340 ああ、そうだよ、この糞ガキがっ!
お前も子供か
もしかしてここはネバーランドなんじゃね?
だな
>>332 エキスパートCプログラミングだったか何かでそんなのも可能だというのを見たが
なんかよくわからんかったんで、よかったら説明キボンヌ
>>346 式の中で関数名など関数型のオブジェクトは関数へのポインタへ変換される。
ポインタだから*演算子で参照はがしができる。
関数へのポインタを参照はがしすると、関数型になる。
関数型は関数へのポインタへ変換される。
・・・
この繰り返し。
そして関数呼び出し演算子は関数へのポインタに対して作用するようになっている。
>>347 あぁそういうことか
確かにそうなるわなw
どうでもいいけど逆参照も参照剥がしも意味不明なことにかわりがないので デリファレンスと呼びたいです。
350 :
デフォルトの名無しさん :2006/03/20(月) 23:37:42
>>349 アセンブラ使いにはインダイレクトが通じやすいけどな
今市
どうやったらRPG作れますか?
354 :
デフォルトの名無しさん :2006/03/21(火) 04:02:39
FILE *fp; if((fp=fopen("test.txt","r"))==NULL){ 以下略 で、ifの条件式が正しくないときでもfpとtest.txtは関連付けされているんですか?
>>354 条件式が正しくないときって、たとえばどんなことを言っているんだ?
>>354 fopenはファイルを開けなければNULLを返す
その場合もちろんfcloseなどでファイルを閉じようとする必要はない
>>356 え? なに? 元の質問ってそういう意味なの? だとしたら日本語ヘタだなあ。
C言語理解するんだからつたない日本語くらい理解してやろうぜぃ
ただ単に質問者を屁理屈でいじめようとしてるだけじゃないのかw
基本的にプログラマーは何故かできない人をこけおろす傾向がある希ガス
2chだからだろ
362 :
デフォルトの名無しさん :2006/03/21(火) 05:02:29
>>355 ファイルがオープン出来なかった場合などです
>>356 ちょっと違うような…
>>354 の続きは
printf("ファイルオープンエラー");
exit(1);
}
while((c=fgetc(fp))!=EOF){
printf("%c",c);
}
fclose(fp);
return 0;
}
です。ただし char c;です。
ifの中の条件式が正しくないのにifの中のfpどtest.txtは関連付けられてるのは変な気がしたので…
>>362 ああ、if文の真偽を間違えて考えてるのか
(fp=fopen("test.txt","r"))==NULL
これはfopenが失敗すると、fpにNULLが代入されて、真と判定される
そんでエラー文の出力してexitというわけ
if文が偽と判定されるのは、fopenが成功してるときだ
余計なことかもしれんけど、初心者向きな説明 ifで評価されるのは「条件式」であって、その式の中にはいわゆる判定文以外の「演算」も含めることが出来る 例) i=3の場合 if(i==3) printf("%d", i); 3 が出力 if((i+1)==4) printf("%d", i); 3 が出力 if((++i)==4) printf("%d", i); 4 が出力 ※ ++iの結果は4となり、条件が正しいので、printfによって i=4 が出力。 同様に、 fp=fopen("text.txt","r") が成功すれば、textは正しく開かれる → NULLを返さないのでif文は偽 → exit(1) は実行されず、while((c= ・・・以下の処理に移る
365 :
デフォルトの名無しさん :2006/03/21(火) 05:36:26
fopenが成功→if文の処理が実行されない→fpとtest.txtが関連付けられてwhile文に移る、ということですか?
そういうことになる
367 :
デフォルトの名無しさん :2006/03/21(火) 05:43:11
なるほど、理解できました ご丁寧な回答ありがとうございましたm(_ _)m
369 :
デフォルトの名無しさん :2006/03/21(火) 17:18:06
C言語でプログラム作れるぜ!って言えるようになるには最低限何が作れればいいと思いますか? DOSでHELLO!!でOK? マルバツゲームができたらOK? それ以上?
簡単な処理プログラムが作れれば 一応作れるぜぇいって言えると思うよ 文書をビット演算や文字置き換え使って暗号化してみたり簡単なDosゲームを作ってみたり エロ画像生成プログラム作ってみたり
>>370 > エロ画像生成プログラム作ってみたり
うpうp!
そうですか、どうもです。 つまりまだ全然できてないですね・・
エロ画像を生成するアルゴリズムを激しく知りたいわけだが
言うだけなら誰でも言えますよ?
特許取ってくる
エロ画像じゃなくてエロAAやん
擬似パイと擬似まんはもうヤダ
エロ画像生成はあれだけどさ、よくある連番のエロ画像DLするようなやつ作れればいいんじゃない? なんかサイトによっては上手くいかないんで、そういう場所でもOKなやつ作ってけろ。 (IEのヘッダとか偽装するといいのかなぁ…。)
なに言ってんだこいつ 氏ねばいいのに
ファイル名からどうエロいと判断するのか教えてほしいもんだな
>>373 エロ画像の生成ならこれでできます。
#include <stdio.h>
int main()
{
printf("エロ画像\n");
return 0;
}
Javaなら確か1.5くらいからエロ画像生成があったはず
リアルマンコ生成プログラム担当 void PrintOmanko(void) //豆付きおマンコ生成関数 { puts("(i)"); puts("挿入しますか?"); }
先生! Apache1.3のmain(){}はどこにあるとですか!? みつかりません!
↑スレ違い↑
CodeCenter面白そうだから試してみたいけど たけえよww
389 :
デフォルトの名無しさん :2006/03/23(木) 07:03:51
#include <stdio.h> #include <stdlib.h> #include <string.h> main(){ FILE *fp; //入力ファイルのファイルポインタ char filename[256]; //入力ファイル名 FILE *outfp; //出力ファイルのファイルポインタ char outfilename[256]; //出力ファイル名 char c; //ファイル名取得 printf("ファイル名を入力してください > "); scanf("%s",filename); //入力ファイルオープン if((fp = fopen(filename,"r")) == NULL){ printf("ファイルオープンエラー\n"); exit(1); } //出力ファイルオープン strcpy(outfilename,filename); strcat(outfilename,"_"); if((outfp = fopen(outfilename,"w")) == NULL){ printf("ファイルオープンエラー\n"); exit(1); }
390 :
デフォルトの名無しさん :2006/03/23(木) 07:04:40
↑の続きです //ファイルの内容をコピー while((c = fgetc(fp)) != EOF){ fputc(c,outfp); } fclose(fp); fclose(outfp); return 0; } これを実行して ファイル名を入力してください > P162.c として、同じフォルダにP162.c_が作成されたのですが、P162.c_が開けません ちゃんと中身が一緒になってることを確認したいんですが、どうやったらP162.c_は見れますか? スレ違いなら、適したスレを教えてください よろしくお願いします
んなもんメモ帳でもつかって見ればよか
簡単ですねorz バカな質問ですみませんでした
ヘッダを作り、Cファイルで読込んで、外部シンボル未解決エラーになるのですが どんな原因が考えられますか
ライブラリが足りない
""じゃなくて<>で囲ってるからとかオチと見た
コンパイルしただけで最後バイナリ作る時にリンクし忘れている。
397 :
デフォルトの名無しさん :2006/03/23(木) 08:09:51
この前、本屋で「はじめてのC」を買うと思って レジに出したら隣に居たバカっぽい女子高生に 小声でこの人童貞?とかって言われました 対処法を教えてください
金髪にしてスキンヘッドにしろ
そのネタ10数年前から脈々と受け継がれているな。
402 :
デフォルトの名無しさん :2006/03/23(木) 10:12:47
>>393 拡張子が cpp だったらボールギャグに蝋燭責めだぞ
403 :
デフォルトの名無しさん :2006/03/23(木) 10:39:08
>>397 ばかだなあ、それ逆ナンだよ
せっかく誘ってきてるのにもったいねえ・・・
c言語の保存で .cじゃなく.cppで実行しても なにか不都合とかありますか?(C言語で書いてるけどって意味です
コンパイラに、これはC++じゃなくてCだと指示するオプションがいるかもね
406 :
デフォルトの名無しさん :2006/03/23(木) 14:30:52
スタイルの質問です。 ヘッダにassert書いても良いもんなの? 定数を使うところ全部にassert書いておくの嫌じゃないですか。 どこにもassert書かずにコメントに逆らったら知らん、ていう態度でおk? /* some header file */ const int SOME_VALUE = 1; /* assert(SOME_VALUE >= -100 && SOME_VALUE <= 100); */
そういうのはコメント・ドキュメント・UnitTestに書くんでないの
BOOST_STATIC_ASSERTもどきを自分で作ればいいだろ。
コールバックを呼ぶような仕組みを組んだのですが、コールバック関数の実体にて 引数の型を間違えたり、引数が少なかったりしても警告すら出ません。 書き方間違っていませんか? typedef int (CALLBACK * callback_proc)(int, int); int callback( int a // ☆ここを間違えていても、コンパイルが通ってしまう ) { } void hogehoge(callback_proc callback) { callback(10, 10); } main() { hogehoge(callback); }
>>409 警告周りのコンパイルオプション見直してみたら
412 :
デフォルトの名無しさん :2006/03/23(木) 16:18:06
fread関数の戻値は「読み込んだ回数」ってあるのですが、 どういうことですか? freadが実行された回数ですか?
ヒント:引数の内容を100回嫁
414 :
412 :2006/03/23(木) 16:25:05
わかりました。自分でもバカらしくなってきました。ありがとうございます。
C言語の構造体について質問です #include<stdio.h> struct k{ int a=0; }A,B; int main(){ B.a=900; A=B; printf("%d",A.a); B.a=77; printf("%d",A.a); } とした場合 2回目のprintfは77? それとも構造体の代入文はJavaのクラスと違ってアドレス渡しではなくコピーそのもの?
deep copy
ポインタのコピーはそういう書きかたがあるでしょ。
↑の回答ありがとうございます。 構造体のアドレスについての質問なのですが #include<stdio.h> struct k{ int a=0; char *c; int b=0; }A; int main(){ int adder1=(int)&(A.b); int adder2=0; struct k *p; A.c=(char *)malloc(40000); adder2=(int)&(A.b); if(adder2==adder1){ printf("hoge"); } (*p)=A; /**この文はOK?事前にmalloc必要?**/ } hogeは出力されますか? また構造体のポインタを宣言した後にmallocする必要はありますか?↓
何が聞きたいのかよくわからんが、*p という未初期化のポインタの指す構造体に Aを丸ごとコピーしてる。
420 :
419 :2006/03/23(木) 17:30:53
hogeは出力される、つかなんで変わると思うの。 昔は構造体はコピーしてくれなかったが いつの日かできるようになった。実態はmemcpyが動いてるようなもん。
>>420 なるほど、ありがとうございます。
もう一つ確認で聞きたいのですが
構造体の中に構造体がある場合でも、それらもDeepコピーされるのでしょうか?
422 :
393 :2006/03/23(木) 17:38:38
・a.h extern void ww(); ・a.c #include "a.h" void ww(){} ・・実行.c #include "a.h" ww(){} としています。リンカというのはどこをどうしたらいいですか
>>420 いつの日か、というか、昔々の K&R の頃には既に出来ていたのだが、
PC用コンパイラには中々実装されなかった、ということだ。
>>421 構造体の代入はC言語の場合はなにも考えずにmemcpy()してるのと同じだ。つまり
a と b の型が同じだとして a = b; は memcpy(&a, &b, sizeof(a)); と同じと
いうことだ。
あとは自分で考えろ。
C言語にはシャローだとかディープなんて区別ない ポインタ型の変数だって、ポインタ型の値にすぎないのだから
426 :
409 :2006/03/23(木) 17:48:05
>>410 STRICT定義で検出されないかと思いましたが、効果ありませんでした。
>>411 _
何とか方法ありませんでしょうか?
>>418 (*p)=A;
多分エラーで落ちる
malloc必要
429 :
409 :2006/03/23(木) 17:57:09
430 :
デフォルトの名無しさん :2006/03/23(木) 18:36:08
Main.obj : error LNK2019: unresolved external symbol __imp__PostMessageA@16 referenced in function _WinMain@16
>>426 STRICTはWindowsプログラミングのお話で、
C言語そのものとはじぇんじぇん関係ありません。
>>430 kernel32.lib user32.lib gdi32.lib
この辺、リンクしてるか?
433 :
393 :2006/03/23(木) 18:53:22
・a.h に extern void ww(); ・a.c に #include "a.h" void ww(){} ・・実行.c に#include "a.h" int main(void){ww(){}} a.cはどこで取込むのだろ。。extern使用例を見ると 取込みかたは間違ってないと思うのですが、未解決エラーになります
>>432 Thx
動いた、そういう基本的なDLLは自動でくみこんでくれないんだね・・・><
どーせVC2005Expressだろ。
YES 20005です。 まぁ無料だし我慢我慢。
439 :
393 :2006/03/23(木) 19:13:34
フリーBCCです。
>>432 のようなリンクの設定は通常、どこで行うのですか
2005入れてないからわからんが、 /nodefaultlib とか つけない限りリンクするんじゃないのかなあ・・・
>>433 とりあえず、個々にコンパイルしてできたオブジェクトをリンカで全部指定して実行ファイルを作るか
コンパイラとリンカを呼び出すコマンドに全ソースファイルを指定してやればいい
>>439 bcc なら、
bcc 実行.c a.c
でいけるんじゃ?
つかコンパイラやリンカの話はスレ違いだなあ・・・
443 :
393 :2006/03/23(木) 20:02:47
bcc a.c 実行.c としました。 ・a.h に extern ww(int); ・a.c に ww(n){} ・・実行.c にww(5){} a.c の n が未定義エラーとなりましたので a.h に、int n;を加えたのですが、やはり未定義エラーになります
>>443 n???
どこでn使いたいの?
ファイル間で同じ変数使えるようにしたいんなら
ヘッダファイルでextern宣言しろ
定義はどこかの.cファイルでする
最近は釣りのレベルが低(ry
446 :
393 :2006/03/23(木) 20:24:44
a.cで作ったww(n)を、実行.cで呼び出して、5を入れたいです a.cはint n;ww(n){} 実行.cはmain(void){ww(5)} となってますが、nが未定義エラーになります
BccDevとか入れれば
windows2000、VC++6で開発しています。 socketを使ったプログラムで、サーバー側の実験をしてます。 接続されるのを待って、接続されるとスレッドを起動して、その中で受信しています。 ただ、ケーブルが抜かれる等、相手側がcloseせずに接続が切断されると、それをうまく検出できません。 どのようにするべきでしょうか?
>>450 スレ違いでしたか、すいません。socketってANSI Cじゃなかったっけ?
>>451 ここはposixすら許さない万年春厨が仕切ってるから
おとなしくネットワークスレ逝っとけ。
455 :
デフォルトの名無しさん :2006/03/24(金) 00:36:13
g_Material g_ ってなんなのさ!
うんこ記法
グローバル変数
MFCとかでM$がよく使ってた記法じゃなかったか?
グローバル変数を使う気を無くしてくれる程度には役に立つ。
460 :
デフォルトの名無しさん :2006/03/24(金) 00:51:24
さっさと答えろ役立たず!
I love YOU!!
462 :
448 :2006/03/24(金) 01:09:20
普通にANSI Cじゃないッスね。posixですね
>>453 まぁ〜、確かにwinsockなんですけど、socket、bind、send、recvあたりはある程度互換があるから、
駄目な部分は自分で調べりゃいいかなと思ってました。
>>454 ありがと。ネットワークスレ逝ってくる
463 :
デフォルトの名無しさん :2006/03/24(金) 17:15:18
C言語について質問です。 問題: A君55点 B君77点 C君65点 だったとします。 まずこれらを入力させ、次に並び替えをし、再度出力するというプログラムです。 入力させる際はfor文で回し、並び替えの際はバブルソートを使い、表示 させる際はfor文で回して出力させるというものです。 よろしくお願いします。
ことわる
おもっくそ「問題:」とか入ってるしw
丸投げは身に付かんぞ・・・
俺なら面倒だから qsort() 使う。 要素数が1個だろうが100個だろうが面倒くさいからそのまま qsort() に渡す。
助けてください 文字列と文字列の間にある文字列の抽出方法を教えてください お願いしますね
>>470 意味が分かりませんか?
AAA○○○BBB
という文字列があったとして○○○の文字列を取り出したいのです。
○○○は決まった文字列、文字数ではありません。
>>471 まずAAAを検索して、それを元にAAAの直後の文字へのポインタ(p)を記憶する。
次にBBBを検索して、それを元にBBBの直前の文字へのポインタ(q)を記憶する。
pからp - q文字分を取り出せば出来上がり。
元の文字列を破壊してよければ、BBBを検索して見つかるBBBの先頭部分に'\0'を代入してしまうという方法もある。
取り出さなくても答えは○○○だな
ボイヤータソハァハァ
476 :
デフォルトの名無しさん :2006/03/24(金) 23:24:16
struct AB { int a; int b; } ab; struct AB *pab; int *a, *b; pab = &ab; a = &(ab.a); b = &(ab.b); printf("%d %d %d", (int)a - (int)pab, (int)b - (int)pab - sizeof(int), (int)b - (int)a - sizeof(int)); この時出力が0 0 0になることは保障された動作ですか? つまり構造体のアドレスとメンバのアドレスの関係を知りたい (構造体のアドレスから上のメンバから順に詰められてるのは絶対かということ)
>>476 保障されていません。
各メンバの間にパディングで隙間が開いている場合があります。
ANSI Cにはoffsetofマクロがあるのでこれを使うといいでしょう。
479 :
476 :2006/03/24(金) 23:30:27
>>478 ありがとうございます
offsetofマクロというのを調べてみます
>>476 (int)a - (int)pab
が0になるのは絶対ですか?
ウインドウズアプリを作ってみたいのですが、お勧めのHPを教えてください 言語は何でも良く、とりあえず電卓的なものを作ってみようかと
Delphi6Personalやっとけ。 Cなんてウンコ
VisualC#ExpressとかVisualBasicExpressとかHSPとかもおすすめ
484 :
デフォルトの名無しさん :2006/03/25(土) 01:36:24
このパートスレが初めて立てられたのはいつの事でしたか?
B言語が誕生した頃
486 :
デフォルトの名無しさん :2006/03/25(土) 01:51:58
60年代ですか?
>>482-483 どもです。VisualC#ExpressとDelphi落としました。
色々いじって見ます
イチオシはJava
Javaは今すぐ滅びろ
490 :
デフォルトの名無しさん :2006/03/25(土) 13:17:36
質問ですが int c; ・・・ if(!c){ ・・・ } !cっていうのは !(0<c)でしょうか? それとも !(0!=c)でしょうか?
どっちかといえば!(0!=c)
c==0
c===0
c=0
>>492 が正解
Cが0だと!で反転するから1 = True
それ以外は1以上は1として!で反転するから0 = False
c(^-^)c
497 :
デフォルトの名無しさん :2006/03/25(土) 14:41:04
Verilog臭がする
498 :
デフォルトの名無しさん :2006/03/25(土) 17:00:15
ライブラリ関数の質問です. スレッドが費やした CPU 時間を得るにはどうすればよいですか? sys/times.h の times() だとプロセス時間になるので困ってます.
500
501 :
498 :2006/03/25(土) 17:23:51
time.hにはclock()関数があった希ガス
問題はCLOCK_PER_SECONDが適当だってことだ。
クロックが動的にかわるCPUもあるんだから適当でもしかたあるまい そもそも(ry
>>503 適当ならいいんじゃないか?
いい加減だと困るが。
今の日本は「適当」の意味が2通りあるから困る しかも意味がほぼ正反対だからなお困る
文脈で分かるから問題ない。
508 :
393 :2006/03/25(土) 20:59:00
Cソースにint n;ww(n){} ・・・他にも関数がたくさんある のとき、未定義エラーになる原因は何が考えられますか 条件が後出しだが。ごめ
原因:関数の定義方法が分かっていない
それを C++ から使ってる・・・とかじゃないよな?
ある文字列の中からある文字列を区切ることは可能でしょうか? strtokだと完全一致しないので困っています。
>>512 超速レスきめぇwwwwwwwwwwwww
・・・
519 :
511 :2006/03/26(日) 09:37:04
やっぱり自分で考えますね このスレの人達のレベルの低さを垣間見た気がして、何かやるせないです。 ではでは
>>511 他人に自分がやりたいことを伝えることもできないのに、
コンピュータに伝えることができるのだろうか。
「区切る=strtok()みたいに元の文字列をぶった切る」ならこれでいいだろ。
char * src = "abcdefg";
char * key = "cde";
char * p = strstr(src, key);
p[strlen(key)] = '\0';
なにこいつ。 お前のレベルの低さにみんな飽きれてるんだが? もしかしてそれすら分からなかったのか^^
522 :
520 :2006/03/26(日) 09:43:15
523 :
デフォルトの名無しさん :2006/03/26(日) 09:45:24
\0って何でしたっけ?
俺も文字列の中からある文字列を区切れって言われたら
>>520 みたいなコード書くと思うが
526 :
511 :2006/03/26(日) 09:48:09
はぁ…マジでレベル低いなw
実のところお前らを試したんだよ。
〜答え合わせ〜
>>511 ,513,514,515,517,518,519=俺
これがC厨共のレベルかぁ…ここまでレベルが低いとホント、笑いすらこみ上げてくるね!
まぁC厨なんて時代遅れの勘違い野郎共が使う言語だし、しょうがないよね!
Javaスレ行ってきま〜す^^
528 :
511 :2006/03/26(日) 09:51:18
529 :
512 :2006/03/26(日) 09:53:22
日曜の朝から釣りたぁ平和だねえ
530 :
511 :2006/03/26(日) 09:54:15
VIPにお帰りください
532 :
511 :2006/03/26(日) 10:01:46
10時になったから荒らすの止めるわ
533 :
521 :2006/03/26(日) 10:03:56
10時過ぎてんのに荒らすなカス。
534 :
デフォルトの名無しさん :2006/03/26(日) 12:18:36
基本情報技術者試験が近いのにC言語の問題がまったくといっていいほど 解けない… 問題解くコツとかあったらだれかおしえれ
変数になにが入っているか余白に書く
とにかく人のコードを解読する
537 :
デフォルトの名無しさん :2006/03/26(日) 12:22:43
>>534 出題者は意外に身近にいる ・・・「コツ」なんてそのくらい
実力以上の試験に通ってしまうとその後に地獄が待ってるぞ
>>534 Cの問題って大体ポインタ絡みじゃなかったっけ?
まあ、なんだ、ポインタがんばれ
539 :
デフォルトの名無しさん :2006/03/26(日) 12:27:48
>>535 それはよく学校の先生にいわれてるww
実行してみます
>>536 とりあえずプログラムを浴びればいいんですか?
>>537 大学の推薦がもらえるらしいので早めにとっておきたくて(ry
とりあえずみんなマジレスサンクスwww
大学推薦って東海大や京都産業大学だろ? 現実逃避してないでマジメに受験勉強しろよ(´・ω・`)
ウゼー
東大京大が推薦なんてすげぇ
544 :
デフォルトの名無しさん :2006/03/26(日) 14:12:41
つまんね
545 :
デフォルトの名無しさん :2006/03/26(日) 16:08:21
c言語初心者が勉強するために参考になるサイトってないですか? 本は持ってるんですが、本に説明がないところがたまにあって・・・ 一応ぐぐって理解してるつもりではありますが
よほどマニアックなことでない限り、本当に説明が無いのであれば、 本がわるいのでもっと良い本を買いましょう。 「初心者向け」と謳うWebサイトのほとんどすべてはクソです。
いいかどうかはまったくしらないが、苦しんで覚えるC
詳解c
明解C
聴解C
551 :
デフォルトの名無しさん :2006/03/26(日) 17:00:51
A〜Jの10個のアルファベットに0〜9までの数字が それぞれひとつずつ対応しています。 Aは1で割り切れ、AB(2ケタの数)は2で割り切れ、 ABCは3で、ABCDは4で、・・・・・と続いていき最後に ABCDEFGHIJは10で割り切れます。 A〜Jがどの数と対応しているかを求めなさい というのをプログラムでやりたいんですけど、 数値を代入するところがうまく表現できません。どうすればいいですか。
本1冊とかサイト1ヶ所で覚えようとかすんな
553 :
デフォルトの名無しさん :2006/03/26(日) 17:08:16
include sadio<h> { static main (void) { int A B C; A=68 B=55 C=A+B system.out.println(C) return 0;} } これで足し算できるはずなんですがエラーがでます。何が、問題ですか。
>>551 int A = i;
int B = j;
int AB = A*10 + B;
:
どううまく表現できんか知らんが、こんなもんだろ。
intが32bit以下の環境では10桁の数値は表現できんがそれは環境依存。longとか多倍長とかあされ。
つーか、Jは0だろ。
覚えるくらいは1冊でいいと思うけどな。
>>551 宿題スレにあったら喜んでやるんだけどな
>>553 傑作ですね
見てておもしろいと思います
560 :
551 :2006/03/26(日) 17:21:06
未知数に数値を代入する反復処理のところはどう表現すればいいでしょうか。 未知数1つのケースなら容易に分かるのですがこれだけ未知数があると・・・
561 :
551 :2006/03/26(日) 17:23:01
>>558 宿題スレでしたか。何分宿題ではなかったもので・・・
でも今からそっちに書くとマルチとかいわr
>>560-561 自分で「反復処理」って書いてるんだから分かると思うけどなぁ。
マルチと言われかねないなら先に断っときゃええんとちゃう? 追い出されたって。
宿題スレに行け。
>>551 適当に書いて調べてみた。
結果......解なし 以上
565 :
564 :2006/03/26(日) 17:46:17
あ、オーバーフローしてただけだった。解はあった。 #include<stdio.h> long long f(long long n,int i,int j,long mask){ long long ret; if(j==10)return n; else if(i==10)return -1; else if( (mask&1<<i) || (n*10+i)%(j+1)!=0 || (ret = f(n*10+i,0,j+1,mask|1<<i) ) < 0 ) return f(n,i+1,j,mask); else return ret; } int main(void){ long long n = f(0,0,0,0); if(n == -1) printf("解なし"); else printf("ABCDEFGHIJ = %010lld\n",n); return 0; }
答えは3816547290、ただひとつ で合ってるかな?算数的に求めたんだけどw
569 :
デフォルトの名無しさん :2006/03/26(日) 17:59:17
#include <stdio.h> #include <stdlib.h> main(){ FILE *fp; int r; //freadの戻り値 char buff[16]; //読み込んだものを格納するバッファ //バイナリモードでオープン fp = fopen("test2.c","rb"); if(!fp){ printf("ファイルオープンエラー\n"); exit(1); } //ファイル読み込み while ((r = fread(buff,sizeof(char),8,fp)) != 0){ buff[r]='\0'; printf("%s",buff); } fclose(fp); return 0; } これの、while以下がどうもピンときません whileのところはコンピュータはどういう動作をしてるのでしょうか?
8文字ずつ読んで8文字ずつ表示してるかんじ
ループに詰め込みすぎてわけわからんということなら for(;;){ r = fread(buff,sizeof(char),8,fp)); if(r == 0) break; buff[r]='\0'; printf("%s",buff); }
572 :
デフォルトの名無しさん :2006/03/26(日) 18:07:48
くだらないことかも知れないけど、教えてください。 strcmpって関数を自作して使おうと思ったら動作が不可解なものになりました。 調べてみたら、strcmpという名前の関数が標準ライブラリにあるんですね。 俺も、なんとなく聞いたことがあるから、そういう名前にしたんですが。 名前を変えたら、問題なしで動きました。 でも、なんだか気になる。 もし、誰かのライブラリにある関数と同じプロトタイプの関数を書いてしまったら、 どっちかを無効にする方法はあるのでしょうか。 それとも、救いようはないのでしょうか。
573 :
デフォルトの名無しさん :2006/03/26(日) 18:13:41
>>545 根本的な問題として C はプロ用なんで
「初心者」という免罪符を捨ててからでないと
とりつく島もないのが実情だ
誰かに先に言われてしまったが
何か勘違いしてるサイトや本はたくさんあるが
そういうところに入門しても年単位で見ると結局
徒労散財に終わるだけだ
どうせ「初心者向け」と称するところに入門するなら
C じゃなくアセンブラや組み込みをやっているところをすすめたい
includeやめりゃいいんじゃね('A`)
576 :
デフォルトの名無しさん :2006/03/26(日) 18:17:58
>>572 名前がかち合ってしまったらどうしようもない。
# C++とかではnamespaceというのを修飾して
# mylib.stdcmpといった感じで区別できるようになる。
現実にはxxStrcmpとかイニシャル・会社名、ライブラリ名を頭にくっつけて
ぶつからないようにする。
また、関数をstaticにすればそのファイル内では好き勝手に名前をつけても
他のファイルには影響を及ぼさないように出来る。
579 :
デフォルトの名無しさん :2006/03/26(日) 18:39:13
># mylib.stdcmpといった感じで区別できるようになる。 mylib::strcmp か std::strcmp ならわかるが・・・
C#に毒されてるんだろ 俺もだけど
581 :
デフォルトの名無しさん :2006/03/26(日) 18:57:44
>>553 ワロスwww
出直せwww
もしかして釣られた?
>>578 漢を見たw。
そして意外に早く答えが求まることにびっくり。
計算機も速くなったもんだ。
これは無意味に凄いwwww
一番奥1379224回しかループしないのな。
発見時はそうだがループ自体は10!回してるぞ。
いや、10^10だろ。
なんでやねん
592 :
デフォルトの名無しさん :2006/03/26(日) 22:24:13
ああ、はやく春休み
free_list(struct list *listp) { while (listp != NULL) { struct list *nextp; nextp = listp->next; free(listp); listp = nextp; } } list構造ならfreeはこんな感じですればいいと思いますが tree構造 struct tree{ int val; struct tree *left; struct tree *right; }; みたいな時には再起を使わずにかけますか?
594 :
デフォルトの名無しさん :2006/03/26(日) 23:49:18
書けねー奴の再帰は他人のサル真似 再帰が使えない言語でそういう処理を考えたこともない あ、再起だったか こりゃ失礼
>>593 辿った順を自分で記憶しておけば書ける。
596 :
デフォルトの名無しさん :2006/03/27(月) 00:12:34
近頃の若いのはプログラム構造図からコード起こしたりしねえもんだから こんな初歩的なことでストールしやがる 只で面倒見てやるほど甘かねえが1つだけ: 再帰の最深レベルを限定しろ 別に再帰に限ったことじゃなくスタックは有限だが
最近目的に沿ったコードがパッと浮かぶようになった これも毎日見ているエロ画像のおかげ
うp汁
上部に栗を挟んどいてもらえるとオチャメでいいね
>>593 void free_tree(struct tree*p){
struct tree*x;
while(p){
while(p->left){
x = p;
p = p->left;
x->left = p->right;
p->right = x;
}
x = p;
p = p->right;
free(x);
}
}
603 :
デフォルトの名無しさん :2006/03/28(火) 00:07:51
char 256までが限界です。256以上足し算するとどなるでしゅぁ?><? int も65366超えたら どるんあですか><? やっぱ限界とぱしちゃうかな^^;
256になるわけないだろバカ
int って65535じゃないのかよ変態が。charも-128〜127までじゃないのかよ変態どもが。
>>605 charが符号付きであるか否かは処理系定義
であるからcharの範囲が-2^〜2^7-1であるか、0〜2^8-1であるかはlimits.hでも見ないと分からない
はいはい
609 :
デフォルトの名無しさん :2006/03/28(火) 04:00:19
65536とか言ってるのは論外として… intが65535?どんな環境だ? intが2バイト?しかもunsigned?
610 :
デフォルトの名無しさん :2006/03/28(火) 04:07:05
sizeof(int) == 2 な環境は今でも全然めずらしくない # ここしばらく俺の担当案件なんぞこればっか まあデフォが unsigned はさすがに「少ない」が
>>609 int == unsigned intは確かに稀としても
規格上、intのサイズとして最低限保障されてるのは2バイトなんだから
そう想定しておくのは悪い事じゃない
612 :
デフォルトの名無しさん :2006/03/28(火) 05:18:16
sizeof(int) == 1 もふつーにあるけどね WG も玉石混淆で技術的にすごい人と政治の天才が混じってて ときどきおかしいことが書いてある
JISX3010:2003によると型intは -(2^15-1)〜2^15-1 以上の表現範囲を持つように規定されてるから sizeof(int)==1は規格合致処理系じゃない可能性が高いだろ 1バイト=16ビットなんてトンデモ仕様なら別だが
614 :
デフォルトの名無しさん :2006/03/28(火) 05:33:10
もとより「規格違反」は百も承知で実をとってる製品を金切り声で罵っても1円にもならん
>>614 そんなの有るのか?
とゆうかsizeof(int)==1ならcharでいいじゃん
ネタにマジレス(・A ・)イクナイ!
tiny モデルならポインタもintも16ビット、コード領域+データ領域で64KBytes
そこでGMPですよ
>tiny モデルならポインタもintも16ビット データポインタもコードポインタも16ビット large, hugeモデルなら データポインタもコードポインタも32ビット(但し、リニアではない)
EMSメモリ?farポインタ?何のことです?
夜神月が降臨しました
なんだ、このスレの住人はそういうネタが好物なのか…( ..)φメモメモ
>>611 「バイト」じゃなくて「オクテット」では?
言葉の定義の問題だが、「バイト」だと8ビット単位とは限らない。
下らんことやってないでANSI/JIS Cの規格100回嫁
char 8bit以上 符号は適当 short int 16bit以上 int 16bit以上 long int 32bit以上 long long int 64bit以上 charのバイト数(sizeofの結果)は1
曖昧な表現はもう大嫌いだァァァァァ!!!!!256ですね。
C言語はあいまいな言語なので日本人に向いている。
そんなことは聞いて無い
635 :
デフォルトの名無しさん :2006/03/28(火) 14:33:43
#include <stdio.h> int main () { printf("こんにちは”¥n); } /これって、コンパイルできますか?/
できません
>>635 System.out.println("試してみたらどうよ??");
戻り値と微妙にオサレな全角文字改行位置
\ を¥と書くのはやはり PC-9801 の罪だよなあ。 Linux だとちゃんと \ で出るが。
フォント変えろw OS関係ねー
>>639 それはJIS X 0201の罪だ。
PC-9801はJIS X 0201に従っただけに過ぎない。
>>637 ここはCのスレです。
Javaは回線切って首吊って氏ね
stdout.writeLine("どうしてそこまでJavaを毛嫌いするのか");
>>643 俺は完全にバイナリ化できないから手を出しづらい
JAVAを使うメッリットは全く無い
俺はC++のテンプレートが好きだからJavaには興味が無い。
>>644 Javaはバイナリにはなる。ただ Java VM がないと動かないだけだ。
これでどう?w #include <stdio.h> void printfunc(const char* str){printf(str);} int main(void){ struct { struct { void (*println)(const char*); } out; } System; System.out.println = printfunc; System.out.println("試してみたら?"); return 0;}
>void printfunc(const char* str){printf(str);} 最低なprintf()の使い方だな。
ホント無能ほど自己顕示欲強いのな へんなホームページ作ったり、聞かれてもないのに 変なコード得意げに書いたり。 他人に教えるよりおとなしく勉強してればいいのに つーかそのprintfuncは改行すらしてないな きっとJavaも知らないんだろ
>>651 スレタイを100回音読して巣に帰るといいよ
>>651 改行するかしないかの問題ではないことに気が付かない君はバグメーカー。
>>648 #define System.out.println(x) puts(x)
あ、'.' があったら駄目か?
>改行「すら」
まぁ、こんなのいろんな入門書やらで言われてるし、
>>648 も分かってて書いたんかもな
この手の関数は嫌になるねホント
安全を謳ったprintf_sってのもあるみたいだけど
そもそも、JavaのSystem.out.printlnはCのprintfほど強力ではないからなぁ... Tigerになってようやくprintfと同等の機能ができた。 Javaには拡張性がない。intが32bit固定って64bitOSが出てきたらどうするの? JavaはWrite once all anywayなんて嘘。JVMが無ければガラクタだ。 Cではautomake/autoconfで達成できている。 Javaは所詮Cには永遠に敵わない。
高級言語なんてそんなもんさ
そのご自慢のprintfは深刻なセキュリティ問題ですがwwwww FormatGuard: Automatic Protection From printf Format String Vulnerabilities Libsafe 2.0: Detection of Format String Vulnerability Exploits
うはwwC厨敗走wwwwww
>Javaには拡張性がない。intが32bit固定って64bitOSが出てきたらどうするの? 最近の64bit CPUのコンパイラのintは32bitなわけだが。
うはwwC厨またしても敗走wwwwww
663 :
デフォルトの名無しさん :2006/03/28(火) 17:48:44
setjmpを実装しようとしてるのだがなんかアドバイスない?
GUI面倒って点意外でCは敗走してないと思う
途中で変数宣言できないのは微妙にマンドクセ('A`)
ローカルにブロック作って凌いでる・・・
charは環境依存だというが、 俺の環境ではchar = 8bit でした。 ・・・で、よくわからんのが、Javaだと char = 16bit なのはなぜ?
苦しい回避手段使わずに、扱える文字の種類を256種類以上にするため。
UTF-8では1文字で16bit以上使うこともあるけどな
>>665 そこはC++としてコンパイルすればOK
671 :
デフォルトの名無しさん :2006/03/28(火) 18:27:44
>>669 第一バイトで後に何バイト続くかわかるけどな・・・
まあUTF8は3バイト使ってても16ビットの文字になおしちゃうんだし。 現行のunicodeだとね
>>656 64bit OS が出ようが 128bit OS が出ようが Java の int は
32 ビット。long は 64 ビット。それの何がいけないんだ?
>>665 C99 は?
>>667 Java は Unicode の 1 文字を char 一つに入れようとして 16bit
になっているんだが、しかし Unicode の新しいバージョンでは
やはり16ビットでは足りないということになり32ビットのコードが
作られてしまい(サロゲート)、それだと char 2つ分ないと1文字を
表せないのであまり意味がなくなってしまった。
>>669 UTF-8 は Unicode のエンコーディングの一種なので Java の char
に入っている値とは違う。char は Unicode のコードそのまま。
UTF-8 はそれを変形して8ビット〜24ビット(サロゲートも入れたら
48ビット)に変形したものだ。
674 :
デフォルトの名無しさん :2006/03/28(火) 18:53:52
どこに書けばいいのかわからないのでここに書かせていただきます。 私はC言語しか経験がありません。 あるソフトのログの中に、現在時刻としてJavaにおける System.currentTimeMillis() 関数の 返り血が出てくるのですが、これをCで解析するためにはどうすればいいでしょうか?
返り血か、そりゃ大変だ。
676 :
674 :2006/03/28(火) 19:00:41
返り値ですorz 解析というか、 2006/03/28(火) 18:57:54 みたいに可読文字列に直したいのです。
currentTimeMillisメソッドは扱いにくいからDataオブジェクト使えば?
>>674 Javaなんて知らないから適当だが、オンラインマニュアルによると
java.lang.System.currentTimeMillis()は協定世界時からの経過時間を返すらしいから
ctimeにでも渡してtm構造体から読み出せばいいだろ
>>667 Javaのchar ≒ C/C++のwchar_tと思えばよい。
680 :
674 :2006/03/28(火) 19:22:55
すみません、きちんと検索してませんでした。 System.currentTimeMillis() の正体が見当つかなかったので・・・ お騒がせしました。
1bitの情報を複数保持したいんだけど、それに適した型は無いの?
682 :
デフォルトの名無しさん :2006/03/28(火) 20:18:01
移植性に欠ける
>>682 おおありがとう!
危うくu-charに無理やり8個のビットを詰め込むところだったよ。
考えただけで寒気がする。
682のでもいいしunsigned char/intに自前で詰め込んでもいい。 ただそれ以上うまいことやってくれるbitsetのような型はない。
変数に代入される最大値、最小値を制御するのに自作の関数を使ってますが、もしかしたらビットフィールドみたいにこれも巧い事できませんか?
#include<stdio.h> int main(void){ FILE *fp; fp = fopen("Sample.txt","w"); fprintf(fp,"パソコンがぶっ壊れた\n"); fclose(fp); return 0; }
>>685 > うまいことやってくれるbitset
i/o 叩けないし...
>危うくu-charに無理やり8個のビットを詰め込むところだったよ。 >考えただけで寒気がする。 お前Cは向いてないよ
690 :
デフォルトの名無しさん :2006/03/29(水) 04:31:32
fopenの第一引数にはファイル名が、第二引数にはオープンモードが来ますが、第一引数に存在しないファイル名を書くとそのファイルが新しく作られるんでしょうか?
>>690 オープンモードによる
wなら作成されるし、rならNULLが返る
aや+が付いたときは知らん
つーかこれぐらい数行のコード書けば分かるだろうが
第二引数による
693 :
デフォルトの名無しさん :2006/03/29(水) 12:04:30
うろ覚えのCからC++やって、基礎がなってないとCに戻ってきたり。 僕は駄目な奴です><
696 :
デフォルトの名無しさん :2006/03/29(水) 12:51:13
char s[10]="123456789\0"; char *cp = s; 両者の違いってなんですか? s++できない事くらい?
>728 名前:C言語使い [sage] 投稿日:2006/03/29(水) 12:18:45
> StackTraceってエラーの詳細文字列ですか?(ググったんですけどよく分かりませんでした。
>
>
http://0xcc.net/blog/archives/000067.html > こういうのよりtry catch書く分面倒な気がするのですが、そこんとこどうなんですか?
> try catchそんなに便利ならC言語からJavaに乗り換えようと思うのですが。
>730 名前:C言語使い [sage] 投稿日:2006/03/29(水) 12:31:59
> 部品ですね。正直OO理論はお腹いっぱいです。
>
> つっこみないみたいなので、trycatch便利じゃないんですね、残念。
699 :
デフォルトの名無しさん :2006/03/29(水) 15:19:37
初心者な質問ですが… input: scanf("%d",&num); if((snum >= 0) && (snum <= MAXnum)){syori1; プログラム終了;} printf("error"); goto input: といった感じで、指定範囲外の数字または文字や記号が入ったら再入力させたいのですが。 数値以外を入れると無限でエラー文が出力されてしまうのですが…なにか対処法はないのでしょうか??
まずさ、numにscanfで数値入れているのに、 何でifの判定がsnumなんだ?
>>699 うんざりしているscanfネタと前方に飛ぶgoto文とかなかなか良い釣りだな。
個人的にはif( 0 <= snum <= MAXnum)の方がネタとしては高評価だけどな
>>699 scanf は %d で指定して数字が入らないとバッファを消さずに
返ってくるから、scanf()の戻り値で判定して自分でバッファクリアして
仕切りなおし。英字入れたらnumに何が入ると思うんだ?
まあプログラムを動かしてみる、という最初の段階を超えたらscanfは捨てなさい。
質問です 可変長引数の関数(void var_arg_func(int n, ...))をつくって、 var_arg_func(99, "call", "with", "five", "arguments"); と呼び出して、関数内で va_list ap; char *s va_start(ap, n) while( s = va_arg(ap, char*)) puts(s); va_end(ap); というふうにして引数を表示させると、動作はするんですが 最後にBus Errorが出ました。 var_arg_func(44, "arg2", "arg3", NULL); と呼び出せばうまくいくんですが、あんまり気持ちよくないです。 呼び出し側から、引数にそのときの引数の数を入れるのもあまり スマートじゃない感じがします。 こういうとき、関数の中から実際に渡された引数の数を知る方法 はありますか? それか、うまく終了判定する方法はありますか?
>>703 C-FAQ 15.8を読め
おとなしく最後にNULLを入れておくか、移植性のない方法でもググレ
ありがとございます。 結局、番兵をたてるのが標準的なんですかね… とりあえず、忘れずにおとなしくNULL入れときます。
706 :
デフォルトの名無しさん :2006/03/29(水) 17:20:12
FAQってやらしくないですか?
707 :
690 :2006/03/29(水) 17:43:18
>>691 >>692 >>694 ありがとうございます。
もう1つ質問なんですが、
wfp = fopen("test.c","wb");
if(!wfp){
printf("エラー\n");
exit(1);
これでエラーが出る場合ってどういうときでしょう?
>>707 いろいろ
例えば書き込み権限が無かったりするとエラーになる。
>>707 カレントディレクトリに書き込み許可が無い場合
710 :
690 :2006/03/29(水) 17:51:47
ああなるほど。 どうもありがとうございました
perrorとか使えば、もう少しマシなエラー出力になるけど。
712 :
デフォルトの名無しさん :2006/03/29(水) 18:56:55
Cでは無理かもですが、APIでハンドル等まったくわからないプログラムのハンドル取得するような関数はあるのでしょうか?
>>712 標準Cの範囲では無理だからスレ違いになるが
Windowsに限って言えば、Win32APIのFindWindow()がそれに該当するだろ
static int cnNum[4][256][256]; static int spcAX[256] , spcAY[256]; case WM_LBUTTONDOWN: { : else {cnNum[4][0][0]=5;} } break; なんかcnNumに代入しているのにspcAXに入っちゃうんですが、 考えられる原因を教えてください。お願いします。
cnNum[4] は範囲オーバーで、偶然それが spcAX の場所と一致してる。
>>714 cnNum[x][y][z]のxの取り得る範囲ってどこだと思う?
717 :
714 :2006/03/29(水) 20:32:58
>>717 ヽ(゚Д゚ )気にするな
俺も最初はたまにやったミスだ
恥ずかしいのはCの言語仕様だな。 普通インデックスはみ出たら例外投げるのが常識だろう。
>>719 それやると遅くなる
ついでにコンパイラ実装者が面倒臭くなる
>>719 アセンブラの上位言語として生まれた経緯を考えれw
ふ〜ん。で、例外ってなに?
はい?
C言語にJavaにあるような「例外」という処理構文は無い。
signalとsetjmp使うことでC++のtry〜catchのような例外処理っぽいのを作ることはできるけどな
726 :
651 :2006/03/29(水) 21:15:26
死ねてめーら死ね屑
ほっといても死ぬからほっとけ
こんな事を言うのは個人攻撃みたいで気が引けるけど C作った奴は無能だな。
理由すら語らないようではただの愚痴だな
アセンブリ離れって怖いですね
731 :
デフォルトの名無しさん :2006/03/30(木) 00:25:41
インデックスの自己管理もできない奴はプログラムやる資格ないよ
732 :
デフォルトの名無しさん :2006/03/30(木) 01:06:56
>>719 C言語の設計思想は
できるだけ軽く、例外処理は自己責任
だろ
JVMを自分で作ることも出来ないのにJavaプログラマを名乗る 恥ずかしい人が紛れ込んでいますね
734 :
デフォルトの名無しさん :2006/03/30(木) 02:27:04
#include <stdio.h> main(){ char i; i = 4; printf("%d",i); return 0; } char型なのに%dで出力できるのはなぜですか?
intに拡張されるから。
>>734 それで出力できるのは偶然
変なゴミが出力されても文句は言えない
737 :
デフォルトの名無しさん :2006/03/30(木) 02:32:54
>>734 charは8ビット整数だから
printf関数にわたるときにchar iはinteger iに符号拡張される
738 :
737 :2006/03/30(木) 02:34:53
符号拡張は自信がないorz
printf("%d", (int)i); と書けば確実になる
引数が不定なんだから、関数呼び出し時に符合拡張なんてされませんよ
C89(と多分C99)では可変長引数の引数は、intより小さい整数型はintに floatはdoubleに変換されて渡されるんじゃなかったっけ?
┌───────┐ │この板は今日か│ │らSPALMの板に │ │なりました。 │ │SPALM以外の話 │ │をすると仲間が│ │殺しに行きます│ └──┐ ┌──┘ │ │ └─┘
看板腐ってるな
>>741 unsigned char, unsigned short は unsigned int に、
signed char, signed short は signed int に、
float は double に、それぞれ拡張される。
で、ポインタは一切の変換なしに渡されるんだっけ?
>>733 車を作れないレーサーとか
マイクやカメラを作れないアナウンサーとか
ピアノを作れないピアニストとか
鉛筆なら自分で削るよ!
ちんこなら自分でシコるよ!
アナルなら自分で掘るよ!
752 :
デフォルトの名無しさん :2006/03/30(木) 12:00:07
糞プログラマー共死ね 俺が神だ
malloc()とfree()ってまだあんまし使った事ないんですけど、具体的にどういうときに使うものなんでしょうか? あるいは使ってますか??
754 :
デフォルトの名無しさん :2006/03/30(木) 12:57:16
別に嫌なら使わなくてもいいよ
756 :
デフォルトの名無しさん :2006/03/30(木) 13:10:36
んじゃGlobalAllocでいいわ
さよなら^^ノ フリフリ
759 :
デフォルトの名無しさん :2006/03/30(木) 13:22:07
>>753 動的にメモリを確保したいときに使う。
mallocしてしっかりfreeしないと、メモリリークが激しいよ。うん。激しいよ。
あ・・・っ!激し・・すぎ・・!
オンラインじゃなきゃメモリリークなんていいよ。
>>753 まずはどんなに入力行が長くてもまるまる一行分受け取れる
char *gets_ex(void);
を書いてみろ。
>>762 ポインタを使った文字配列へ使っていこうと思います。
トンクス子でした。
配列への値の受け渡しにポインタを使ったallocでいこうと思います トンクス子でした。
765 :
761 :2006/03/30(木) 14:04:11
ダウンロードしたファイル名最後に .. のついたファイルを ダウンロードして、ローカルで解凍するとファイルは 出来るのですが、開こうとすると”見つかりません”と出ます。 また、削除しようとすると”ファイルを削除できません。 送り側のファイルまたはディスクから読み取れません”と出ます。 コマンドプロンプトで消そうと努力もしたのですが消えません。 色々な削除ソフトも利用したのですが消えません。 どなたか知識の高い方、削除の仕方を教えてください。
オンラインじゃなきゃゴミファイルが残ったっていいよ
767 :
699 :2006/03/30(木) 14:08:29
あ、すいません。scanfもsnumです。
int n; char buf[256]; for(;;) { if(scanf("%d", &n) == 1) { if(0 <= n && n < 10) break; } else gets(buf); } printf("n=%d\n", n); gets(buf);
パイプってぶっちゃげ何ですか?
>>769 scanfの戻り値チェックとかはちゃんとやってるのに
よりにもよってgetsかよw
774 :
デフォルトの名無しさん :2006/03/30(木) 17:12:28
C言語で何が出来ますか?
セックルを促す関数を作成できます
>>772 ぶっちゃげ の検索結果のうち 日本語のページ 約 45,300 件中 1 - 20 件目 (0.20 秒)
バイブってぶっちゃげ何ですか?
女性用の性具。陰茎をかたどったもので、振動させて刺激を与える。
ベイブってぶっちゃげ何ですか?
鏡に映ってるアレ
近藤智子と二階堂ゆかり
782 :
デフォルトの名無しさん :2006/03/30(木) 23:33:19
>>772 パイプ=pipe
データを通す管のことだよ
783 :
デフォルトの名無しさん :2006/03/30(木) 23:40:47
scanf関数を使い%d入力を行うと、数字以外を入力した場合大変な事になってしまうのですが scanf関数は素人しか使わないと聞きました 玄人または一般的な開発者はscanf関数の代わりにどういったものを使ってるんでしょうか?
scanfを毛嫌いするのは脱初心者直後の半端者だけ。
そうなんですか・・ fgets(buf,10,stdin);等の記述を見つけたのでこちらの方が言いのかなと思ってたんですが このままscanf使っていきたいと思います・・ ありがとうございました。
F&Qですね、どうも。
はいはいゆとり教育ゆとり教育
でも、>1を見ても > 玄人または一般的な開発者はscanf関数の代わりにどういったものを使ってるんでしょうか? は、分からないけどな
ゴミレス書いて無駄にレスを増やして暇を潰してるだけですから。
795 :
デフォルトの名無しさん :2006/03/31(金) 00:49:36
fgetsしてsscanfかな
796 :
デフォルトの名無しさん :2006/03/31(金) 00:54:38
#include <stdio.h> main(){ printf("%d\n",'a'); return 0; } と #include <stdio.h> main(){ char a; printf("%d\n",a); return 0; } の違いは何でしょうか?結果が97と1になりましたが…
797 :
デフォルトの名無しさん :2006/03/31(金) 00:57:03
798 :
デフォルトの名無しさん :2006/03/31(金) 00:58:28
>>796 main(){
char a = 'a';
printf("%d\n",a);
return 0;
}
だとどうなりますか?
799 :
デフォルトの名無しさん :2006/03/31(金) 01:46:50
無限ループしてる中で、毎回時間を確認し、 前回チェック時間(例23:59)< 0時 <現在時刻(例0:01) の条件の時、別関数を呼ぶ という風にしたいんですが、どうすれば良いでしょうか? 24時間足すという事も考えたのですが、時間を戻される可能性もあるため、 前回チェック時間(22:00) 今回チェック時間(19:00) の状態になった時、関数を呼ぶようにはしたくないんですが・・。
時間は戻りません。
日付もチェックしたら?
802 :
デフォルトの名無しさん :2006/03/31(金) 01:56:26
>>799 localtimeを使えば
localtimeで返されるtm構造体の年月日を、前回のものと現在のもので比較
日が変わったら「別関数をよぶ」
ただ、「時間を戻される可能性もある」がやっかい
804 :
デフォルトの名無しさん :2006/03/31(金) 02:08:30
>>799 の「時間が戻される」件なんだけど
コンピュータの時計が変更される可能性があると解釈したんだけど
考えすぎか!?
>>804 変更される事の何がやっかいなんですか?
理由が思いつかないんですが
806 :
デフォルトの名無しさん :2006/03/31(金) 02:24:54
>>805 それは、プログラムの仕様による。
たとえば、コンピュータの時計が0時05分のときに時計を10分後ろに
戻したとする。すると「別関数を呼ぶ」という処理(おそらく日替わりの処理)
が10分の間に2回発生する。それでよければ別に問題はない。
だけど、それでは困るという場合。それが厄介。
プログラムで時間経過を管理しなければならない。
807 :
デフォルトの名無しさん :2006/03/31(金) 02:33:52
>>804 ほぼその通りの意味です。
しかも、現状だとすべて秒に直した値を比較しているので、
日にちの概念が無いんです。
>>806 2回発生させたくないので困っております。
どんな環境でソフト作ってるかしらねーけど、 そんなにイヤなら10秒くらいごとにタイマーしかけておいて、10秒+-誤差の範囲を はずれた場合は爆破でもすればいいんじゃね? そもそも、同じ時間になっても2回発生はしないだろう。 0:05から2分おきに別関数呼ぶとして、 次に呼ぶのは0:07で、時計と照合するのはこの時間。 0:05直後に10分戻されるとしても関数が呼ばれるのは0:07じゃねえの?どこが2回? 酒が入ってる俺がおかしいわけ?そうですか。寝る。
「時間を戻す」なんて相当イレギュラな操作のはずなんだから、 そんなことを考慮する暇があったらその他の部分に力を入れたほうがいいとおも。 ところで「時間を進める」ほうは考慮しなくていいの? もしそうなら 月日もあわせてチェックするだけでいいんだけど。
案外ntpdateをcronで走らせている鯖はある。
> 現状だとすべて秒に直した値を比較しているので、 と > 日にちの概念が無いんです。 の関係が分からん。 いつからの経過時間の秒に直してるんだ? 00:00からのとは言わんよな?
時刻変更について 2006/03/31 23:30:00 → 2006/04/01 00:30:00 のとき起動する。 2006/03/31 23:30:00 → 2006/03/31 00:30:00 のとき起動しない。 じゃあ 2006/03/31 23:30:00 → 2006/04/01 23:40:00 のときは? 2006/03/31 23:30:00 → 2006/04/10 23:40:00 のときは?
>806 時間経過の管理ったって、最終起動時刻を記録して、それと比較して 20h以上経ってなかったら無視して起動しない、とかでいいんじゃね?
>>810 そう、そーいう意味の無いことしてる鯖かなりいるんだよね
素直に ntpd 使えばいいのに
>>813 その20h以上経過をどうやって知るんだ?時計が変わってるのに
日付を確認すれば済む話じゃないのか
816 :
デフォルトの名無しさん :2006/03/31(金) 11:30:34
作ったコンソールアプリケーションを実行した時に、実行終了時に勝手に窓を閉じないようにする為にはソースというかプログラム側でそれを制御する場合どうしたらいいんでしょうか? つまりbatでpauseなどを使わないでプログラムそのものからキー入力かなにか操作しない限り窓を閉じないようにすると言う事です。
getchar(), getch()
単に入力待ちにすればよいだけでは
getcharはマクロです
char c; gets(&c);
>>785 実際は、学生の宿題のコードでくらいしかみないね。 scanf()
>>816 mainの最後の行にブレークポイントをつけておくとか。
レスありがとです getcharは使ってませんがgetchは使ったことがありますけど・・マクロってのは何か問題があるんですか?
Hit any key to exit...
scanfはgets+atoiで解決
>>816 コマンドプロンプトのショートカットのプロパティで終わらない設定をするとか。
最後に getchar() やってもいいけど。
VC6のころは、リリースビルドだと、プログラム終了後は自動でキー入力待ちになって、 コンソールが閉じなかったんだけど。 なんでリリースビルドだけだったか、なぜ、なくなったかは謎。
だから scanf っつったってどう使うかによるでしょ。 ユーザから生の入力受けるところに使うのは馬鹿だけど ほかのプログラムの結果をリダイレクトで受ける部分で使うとかなら そのほうが余程簡潔にすむ。
>ユーザから生の入力受けるところに使うのは馬鹿だけど scanfの使い方をわかっていないバカ。 >ほかのプログラムの結果をリダイレクトで受ける部分で使うとかなら ユーザーの入力は不正確でリダイレクトなら正確な出力が受け取れると思っているバカ
>>825 scanf() は使い辛いよ。ちょっと間違えただけでバッファオーバーラン
するかも知れないし。使ったとしても fgets() 後に sscanf() かなあ。
数値の連続を読むだけなら scanf() や fscanf() でもいいんだけどね。
文字列が混ざるとねえ。
scanf()は、変なクセを覚えても、ほかに応用利くってもんでもないしね。 fgets()とかで一行入力、sscanf()で変換とかをおぼえればそれで十分。
ほとんどのテキストに出力=printf、入力=scanfってあるから実際経験者に聞いたりソース参考に見せてもらわないと気づかない・・
fgets + sscanf と scanf の間にそれほど大きな差はない
>>834 scanf()は、エラーの時は、入力バッファを読み飛ばせばいいってこと?
それだと、正常のときとエラーの時の挙動が違ってしまうし、
そういう細かいことを気にしないでいい、一行入力+sscanf()のほうがいい。
適当なツールを作るときには便利だろ > scanf a.out < hoge で一々fopenしてfscanfしてfcloseしなくていい エラーチェック?perlで作れ?何のことです?
夜神月が降臨しますた。
838 :
デフォルトの名無しさん :2006/03/31(金) 12:41:32
マクロだと何か不都合があるんですか?(>819)
839 :
819 :2006/03/31(金) 12:44:48
>>836 リダイレクトの時に fopen(), fclose() が不要な
件については scanf() とは全く関係のない話だ。
defineもマクロですよね 調べてみたら文字を置き換えるとあるんですがputchar,getcharも何かに置き換えるってことですか?
>>841 putcharなどはマクロとして実装されている(可能性がある)ということ。
効率を問題視する場合なら兎も角、通常気にすることもない。
>>836 つ[fscanf(stdin, "%d", & val);]
#define はプリプロセスディレクティブです。
fgetsで万事OKとか言ってるアフォは バッファを溢れさせた時の誤動作にほぼ100%対応していない。
>>842 打鍵数が多すぎる。
君は一々printf(...)をfprintf(stdout, ...)と書くのかね?
バッファ溢れはしないだろ。
w
fgets は、何も配慮しないと途中で切れる可能性はあるが その場合でもバッファはあふれないでしょ
>>845 見苦しい反論するくらいなら、マクロでも関数でも用意すればいいのでは?
実際、fgetc(stdin);はしばしば書きますがね。
バッファ溢れするとか言ってるやつアホとしか思えんwwww
>>848 溢れはしないが、行を完全に読み込んだかどうかはチェックしないと
次の読み込みで想定していない値が読み込まれる事は
容易に想像できるわけで。
それが
>>844 の言う「誤動作」だろう。
「ほぼ100%」がどこの脳内統計かは知らんが。
>>849 反論ではなく、呆れているんだろう。
fgets()の仕様を「バッファの溢れ」とは言わんわな。
ファイル操作ぐらいC++使えよと
何が何でも1行読み込みを保証したい場合は自作するか glibc の getline() でも使え。
>>850 どうせなら対策してるに決まってるだろアホといってやれよ。
安易にfgets使うコードはgetsと同じくらいバグバグということか。
857 :
デフォルトの名無しさん :2006/03/31(金) 17:09:37
小学生の時、母親に「セックスってなに?」と聞いたところ 母親は「男の人と女の人が仲直りするおまじないよ」と答えた。 その日の夜、両親がケンカした。俺は 「ケンカやめてセックスしなよ、セックスセックス!」と止めに入ったら 父親からボコられた。
C言語で出来ること教えてください。 ・ソフト作成 他にありますか?
859 :
819 :2006/03/31(金) 17:23:18
Win32APIを始めようと、サイトを見ながら導入しようとしました。コンパイラはBorland C++ Compiler 5.5で、 サイトに書いてある通り、bcc32 -W test.c としてコンパイルしても Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland test.c: 警告 W8057 test.c 9: パラメータ 'hInstance' は一度も使用されない(関数 WinMain ) 警告 W8057 test.c 9: パラメータ 'hPrevInstance' は一度も使用されない(関数 WinMain ) 警告 W8057 test.c 9: パラメータ 'lpCmdLine' は一度も使用されない(関数 WinMain ) 警告 W8057 test.c 9: パラメータ 'nCmdShow' は一度も使用されない(関数 WinMain ) Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照) このようなエラーが出てコンパイルができません。何か問題がある場所を指摘して頂けないでしょうか?お願いします。
すいません。C言語ではありませんでした。申し訳ないです。
で、scanf()の使用はセキュリュティ的に良くないってことでいいの?
>>862 注意深く使えば問題は回避可能なんだが、あまりおすすめしたくない関数だ。
>>858 C言語で動く工業用ロボットを作った場合ハードウェアの作成も可能になります。
そこでscanf_sですよ
866 :
デフォルトの名無しさん :2006/03/31(金) 18:24:40
ファイルサイズを調べたいのですが、 いちいちfileopenしなきゃいけないのでしょうか><?
移植性が無い方法だとfopenしなくて良いが、 移植性がある方法だとfopenするしかないな
>>863 つかいこなせばscanfもいいって言うヤツがいるけど、
同様のことがもっと楽にできるのに、そんなことをする
必要があるのかって感じ。
scanfの仕様に精通したって、なんか応用きくわけでもないし。
>>866 ファイルサイズという概念自体が曖昧なので、環境依存しない方法では厳密には無理。
#よくあるfseek(SEEK_END)+ftell()も必ずしもサイズが得られる保証はないし。
"rb"モードでfopenしてEOFまでfgetcをする方法
>>866 システムコールなりWin32API呼べ。
>>871 じゃ、移植性のない方法を使ったほうがいいな。
874 :
デフォルトの名無しさん :2006/03/31(金) 19:09:35
カウンターをインクリメントさせて、 その値が指定した値以上になったときに 何らかの関数を実行するプログラムの デバックを行っているのですが、 カウンターがオーバーフローした時の 対処法がよく分かりません。 yahooやgooleで「GetTickCount オーバフロー」などと 検索したのですが、符号なしなら差をとる以外、効果的な 対処法が見つかりませんでした。 カウンターをインクリメントしている時の対処法を教えて ほしいです なお、関数を呼び出しているときの処理の流れは以下のとおりです (ほかの人が書いたソースなので、ソースを載せるのはできるだけ 避けたいです。勝手に公開すると、後でいろいろと問題になりま すので) --------------------------------------- 1.ヒープから最も低い値(tick)取り出す ただし、0xF80000以上なら最大値を取り出す。 2.tickが指定したtick以上なら関数実行する。 そうでないならループから抜ける 3.1に戻る
カウンター値が減ったらオーバーフローしたとみなす。 ただしそのチェック間隔が十分長いと カウンタ値: 1999999 <- ここでチェック カウンタ値オーバーフロー さらに進んで: 2000000 <- ここでチェック となって見た目オーバーフローしてないように見えてしまう。 つうか別のAPI探すなりlong longでも使っとけ
っていうか
>>874 はぜんぜん話がみえんのだけど。
説明がそのレベルってことは元コードを理解できてないんじゃないの? デバッグというけど、オーバーフローがバグの原因だってのも嘘くさいな
879 :
デフォルトの名無しさん :2006/03/31(金) 19:39:32
誰かPGの人で業務で創作するようなプログラムのソースコードを差し支えなければうpしてくださる方いませんか? それ同等のレベルのプログラムのソースコードでも構いません。
>>879 業務で使われている、オープンソースのやつじゃだめなの?
それでも構いません。
じゃあ探せよ
どこにおいてあるんですか?
>>879 そんなものはずかしくて人に見せられません。
答えはいつも君の心の中に
ここの会社に置いてある物ではないんですか?>業務用オープンソース それともvectorみたいにまとめてあるんでしょうか グーグルで検索しても見つけられませんでした。
887 :
デフォルトの名無しさん :2006/03/31(金) 20:07:09
>>875 確かに・・・
QueryPerfomanceCounterとかを使ったほうが楽そうですね。
少なくとも通常の稼働時間内ではオーバーフローすることはなさそうですし。
できることなら、それを使いたいのですが・・・
いつかはオーバフローするわけですし、できたら、その時の対処法を教えて
いただけるとありがたいです。
>>877 ソースコードが理解できてない・・・
そんなバカな・・・
といいたいのですが、なんかうまく説明できないので、読み直してきます。
888 :
デフォルトの名無しさん :2006/03/31(金) 20:09:06
(887の続き)
>>875 >>877 わざわざ答えてくださりありがとうございました。
なんかうまく説明できないので、もう一度読み直してきます。
>>879 どっかのエロゲーでライセンス引っかかって
おーぷんおやつがたたはず。
890 :
デフォルトの名無しさん :2006/03/31(金) 20:14:40
フランス語でおk
俺葉っぱ好きだよ
はっぱろくじゅうし
>>879 いいよ。一部でいいよね。
////////////////////////////////////////////////////////////////
/// \summary 日時文字列変換
/// \param date 対象時刻
/// \return 変換済み文字列
/// \warning 内部静的領域を返すので取扱いに注意
//
const char * strDate(time_t date)
{
static char buf[20];
struct tm * ptm = localtime(& date);
strftime(buf, sizeof(buf), "%Y/%m/%d %H:%M:%S", ptm);
return buf;
}
>>893 横からでスマンがそれってDoxygen用のコメントだっけ?
>>887 制度の問題じゃないんだったら、普通に時計を使えば?
896 :
デフォルトの名無しさん :2006/03/31(金) 20:49:45
>>895 GetSystemTime()のことですか?
ちょっと今は試せる状況にないので、改めて質問し終えたら、
試してみます。
わざわざ、答えてくださりありがとうございます。
899 :
デフォルトの名無しさん :2006/03/31(金) 21:23:11
ソースコードを読み直してきました。 ほかの人が書いた、一定間隔ごとに任意の関数を実行するプログラムを調べていたのですが、 49.7日毎にタイマーがうまく動作しなくなることに気づきました。 そのバグの原因はGetTickCounter()の返り値がオーバーフローすることにあるというのは分かったのですが、 下手に差をとると、ほかの部分も変更しなくていけなくなってしまいます。 Googleなどでほかの方法を探そうとしたのですが、差をとる以外の方法は見つかりませんでした。 オーバーフローを検出したら、どういう風に処理したらいいか、 知っている人がいたら教えてほしいです。 なお、処理の流れは以下のとおりです。 (勝手に載せるとまずいので載せることはちょっと難しいです) 前処理 tickにGetTickCount()の値 + 任意の間隔。funcに任意の関数へのポインター。 intervalに任意の間隔を代入する メインの処理 1.GetTickCount()の値をnowに代入する 2.now > tickなら、任意の関数を実行し、 そうでなかったら、sleep()で一定時間待機した後、1へ戻る 3.now と tick の差が1000ms以上なら、 tickにnowとintervalの和を代入する。 その差が1000msより少ないなら、tickにintervalを足す ごめんなさい。ソースコードを読みなしたのですが、 いくら考えてもこういう風にしか説明ができませんでした。 分かりにくくて申し訳ないです。
>>899 精度が問題になるような処理じゃなかったら、time()を使えば、2038年までは使える。
そもそもGetTickCounterって標準Cじゃないだろ
APIだし大文字入ってる時点でCっぽくないもん
まあ、必要なアルゴリズムに関しては C の範疇じゃね?
904 :
879 :2006/03/31(金) 22:19:10
すみません、質問の内容を変えさせていただきます 例えるとして、どういったプログラムが作れればPGとして業務遂行ができると思われますか?
main() { DWORD executeTime=GetTickCount() + interval; while(1){ now = GetTickCount(); if( now < executeTime ){ Sleep(100); continue; } func(); if( now > executeTime + 1000 ){ executeTime = now; } executeTime += interval; } } こんな感じ?
>>899 WaitableTimerを使え。それとそんなクソなロジックを作ったやつは切れ。
あるかたが、 「for文」 の添字に「 i 」を使うのは入門書レベルだと言っていて とても衝撃を受けたのですが、それが一般的なのでしょうか? ゲーム系のプログラマの知り合い数人に聞いたりしたのですが 「 i 」を使うという答えでした。 ビジネス系とか環境や地方によっては使わない場合などあるのでしょうか?
>>908 そういうどうでもいい所に異常なほどのこだわりを持ってこそfj上級者になれるのだ。
>>908 会社のルールで決まってたりする
iLoopCounterとか、キモイ名前を付けなきゃいけなくて泣きそうになるときもある。
ただたんにループまわすときにインデックスを使いたい というだけならあんまり変数名考えずにiとすることも多いだろう 特殊な場合とかはわかりやすい変数名考えたほうがいいけど
それのどこがANSI Cに関係のある話題なんだ?
そういう墓気取りの知ったかハゲには関わらないほうがいいね。
>>908 forに i を使うのは最も一般的だから、そんなこと気にする必要は無い。
910のような理由さえなければ i を使っていて全然問題ない。
>>899 tick = GetTickCount() + interval;
while(1) {
int diff;
now = GetTickCount();
diff = now - tick;
if(diff > 0) {
func();
if(diff >= 1000) {
tick = now;
}
tick += interval;
} else {
sleep(timeSleep);
}
}
now - tick がオーバーフローするような事態まではフォローしてないが、
それは 25 日ほど func でフリーズした事に相当する。
>>908 LinuxとかApacheとかMySQLとか、なんでもいいけど有名なソフトのソースに
grep -w i とかしてみ。
初めまして。 頑張ってC言語を学んでいるものです。 まだ初心者です。 参考書を読んで勉強してるのですが、 以下の問題が解けません。 どなたかご教授下さい。 -- 二つの整数値を読み込んで、それらの値の差が10以下であれば、 「それらの差は10以下です。」と、 そうでなければ、「それらの差は11以上です。」 と表示するプログラムを作成せよ。 論理OR演算子を使うこと。 -- 一応書いてみたコード貼ります。
918 :
908 :2006/03/31(金) 23:08:46
くだらない質問に返答してくださったかた、本当にありがとうございます。
「for文」 の添字に「 i 」を使うのは入門書レベルって自信満々で言うものだから
あまりにも気になってしまい、こんな質問してしまいました。
>>916 > LinuxとかApacheとかMySQLとか、なんでもいいけど有名なソフトのソースに
こういう手がありましたねw
#include <stdio.h> int main(void) { int a, b; puts("二つの整数を入力してください。"); printf("整数A:");scanf("%d", &a); printf("整数B:");scanf("%d", &b); if((a - b) <= 10 || (a - b) >= -10)puts("それらの差は10以下です。"); elseputs("それらの差は11以上です。"); return 0; } こんな感じです。論理OR演算子使わなければ簡単なのですが…
ヒント: if((a - b) > 10 || (a - b) < -10)puts("それらの差は11以上です。"); else puts("それらの差は10以下です。");
>>920 おお!早速書き直して実行してみたら成功しました!
ありがとうございました。
一つのことに捕らわれると他のことが見えなくなる性格って
プログラミングにはあまり向きませんね…
PGなんてそんなもんかもしれん
>>921 経験積めばいいだけだから努力汁
天才プログラマーにはなれんかもしれんが
| ̄ ̄ ̄ ̄ ̄ ̄| | 次でボケて! | |______| `∧∧ ‖ (゚д゚)‖ / づΦ
天才アマグラマーになるんだな
03/32?
928 :
デフォルトの名無しさん :2006/03/32(土) 08:28:47
>>905 はい。そんな感じです。
実際はスリープの代わりに、executeTime-nowで待つ時間を算出し、
パケットを送受信する関数でその時間だけ待機してますが・・・
まあ、瑣末な事なので気にしない。気にしない。
>>906 WaitableTimer・・・
Windowsで言えばWaitFor何とかあたりでしょうか?
Linuxで同じようなものがあるかどうかはしりませんが・・・
探してみます。
>>915 ごめんなさい。
その方法はすでに元のソースで使われている方法はまさにそれでした。
(now > tick と now - tick > 0はほぼ等価なので、now > tickで
書いてましたが、元のソースで使われている方法で書くべきでした。
かき回してごめなさい)
何を勘違いしているかはしらんが、WaitableTimerはWin32API。
しかもWaitForじゃないしな
931 :
デフォルトの名無しさん :2006/03/32(土) 13:43:26
>>929 あ、確かに・・・
WaitForではなく、そのものずばりWaitableTimerと名前のつくAPIがいくつかありました。
なんか恥ずかしいです・・・
#include "procviewer.h" #include <tlhelp32.h> void main(){ printf("test"); } // ------------------------------------------------ // これをBCC使ってコンパイルしようとすると、 tlhelp32.h関連のエラーが沢山でるんですけどどうしてでしょう。
エラー E2141 c:\Borland\Bcc55\include\tlhelp32.h 30: 宣言の構文エラー エラー E2139 c:\Borland\Bcc55\include\tlhelp32.h 64: 宣言に ; がない エラー E2139 c:\Borland\Bcc55\include\tlhelp32.h 65: 宣言に ; がない エラー E2139 c:\Borland\Bcc55\include\tlhelp32.h 66: 宣言に ; がない エラー E2238 c:\Borland\Bcc55\include\tlhelp32.h 67: 'DWORD' の宣言が複数見つかった エラー E2344 c:\Borland\Bcc55\include\tlhelp32.h 65: 一つ前の 'DWORD' の定義位置 エラー E2139 c:\Borland\Bcc55\include\tlhelp32.h 67: 宣言に ; がない エラー E2141 c:\Borland\Bcc55\include\tlhelp32.h 78: 宣言の構文エラー エラー E2141 c:\Borland\Bcc55\include\tlhelp32.h 85: 宣言の構文エラー エラー E2139 c:\Borland\Bcc55\include\tlhelp32.h 93: 宣言に ; がない エラー E2139 c:\Borland\Bcc55\include\tlhelp32.h 94: 宣言に ; がない エラー E2139 c:\Borland\Bcc55\include\tlhelp32.h 95: 宣言に ; がない エラー E2238 c:\Borland\Bcc55\include\tlhelp32.h 96: 'SIZE_T' の宣言が複数見つかった エラー E2344 c:\Borland\Bcc55\include\tlhelp32.h 93: 一つ前の 'SIZE_T' の定義位置 エラー E2139 c:\Borland\Bcc55\include\tlhelp32.h 96: 宣言に ; がない
エラー E2139 c:\Borland\Bcc55\include\tlhelp32.h 97: 宣言に ; がない エラー E2238 c:\Borland\Bcc55\include\tlhelp32.h 98: 'DWORD' の宣言が複数見つかった エラー E2344 c:\Borland\Bcc55\include\tlhelp32.h 97: 一つ前の 'DWORD' の定義位置 エラー E2139 c:\Borland\Bcc55\include\tlhelp32.h 98: 宣言に ; がない エラー E2238 c:\Borland\Bcc55\include\tlhelp32.h 99: 'DWORD' の宣言が複数見つかった エラー E2344 c:\Borland\Bcc55\include\tlhelp32.h 97: 一つ前の 'DWORD' の定義位置 エラー E2139 c:\Borland\Bcc55\include\tlhelp32.h 99: 宣言に ; がない エラー E2238 c:\Borland\Bcc55\include\tlhelp32.h 100: 'DWORD' の宣言が複数見つかった エラー E2344 c:\Borland\Bcc55\include\tlhelp32.h 97: 一つ前の 'DWORD' の定義位置 エラー E2139 c:\Borland\Bcc55\include\tlhelp32.h 100: 宣言に ; がない エラー E2228 c:\Borland\Bcc55\include\tlhelp32.h 100: エラーあるいは警告が多すぎる
>>936 氏ねというからにはそれなりの理由があると思うんだけど何故?
C言語で作られたソースで、別タスクにて何度も変更がかかるような変数をexternして 別なタスクで普通に参照するのっていいんでしょうか? i=1; とかでもPCは複数の機械語処理をしていると聞いたから なんだかマズイ気がするんだけど。 OSとかに依存するんですかね? 初心者ですんまそ
939 :
デフォルトの名無しさん :2006/03/32(土) 14:49:45
GNU ncursesで日本語表示をするやり方を教えてください。 環境はWindowsXPのcygwinです。 configure --enable-widecの後makeしたncursesを使っています。 コンパイルはgcc test.c -lncurseswです。 "ハロー"と表示させたいのですが~Cn~C~M~A[と文字化けしてしまいします。 ただのprintf("ハロー");プログラムは正常に表示されています。 ソースは以下です。 #include <ncurses.h> #include <string.h> main(){ initscr(); wchar_t wc1[100]; strcpy((char *)wc1,"ハロー"); /* addwstr(wc1); */ printw("%s",wc1); refresh(); while(1){ } }
>>938 基本的にはタスクとかスレッドとかそういう概念が環境依存だから
言語として絶対に大丈夫と保証されてる方法はない.
ある程度過般性のあるやり方は volatile 指定すること.
ISO/IEC 9899 6.7.3:
An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects.
なんでロケール設定した上で、mbstowcs使わないのさ。 wchar_tとcharは全然別の型だろ。
943 :
939(ncursesの質問) :2006/03/32(土) 15:34:20
>>942 ロケール設定した上で、mbstowcs使いましたがやはり~Cn~C~M~A[と文字化けします。ソースは以下の通り。
#include <ncurses.h>
#include <locale.h>
#include <stdlib.h>
main(){
setlocale(LC_ALL, "");
initscr();
wchar_t wc1[100];
mbstowcs(wc1, "ハロー", 10);
addwstr(wc1);
refresh();
while(1){
}
}
944 :
デフォルトの名無しさん :2006/03/32(土) 16:33:22
>>904 PGに必要なものはコミュニケーション能力だけです。
以上。
と、人間関係嫌いな俺が言ってみるテスト。
946 :
デフォルトの名無しさん :2006/03/32(土) 17:05:06
(931の続き) MSDNでCreateWaitableTimerとかSetWaitableTimerの使い方を調べてみたのですが、 まさに実行したいこと、そのものという感じがしてきました。 差をとる以外にオーバーフローの対処法があるのかないのかということも気になるのですが、 とりあえずこの方法を試してみることにします。 非常に分かりにくい説明な上、重要なことが書いてなかったという最悪の質問の仕方にも かかわらず、わざわざ答えてくださりありがとうございました。
>>943 ちなみにその例ならワイド文字列リテラル(L"ハロー"のように)が使える。
unsign intと unsigned intの違いって何ですか?
949 :
デフォルトの名無しさん :2006/03/32(土) 22:00:20
標準で定義されているキーワードかどうか、っていう違いです
950 :
デフォルトの名無しさん :2006/03/32(土) 22:27:16
皆さん、エディタやコンパイラは何を使用してますか? 自分は ・Tera Pad ・BCC です。
vim gcc
954 :
デフォルトの名無しさん :2006/04/02(日) 04:09:30
gvim BCB6
Meadow gcc
エディタはemacs(meadow)しか使ってない コンパイラは基本はgccで、日本語周りで問題出たら iccやvc2k5のコマンドライン使ってる
エディタ vi vim emacs meadow xyzzy peggy 桜エディタ VisualStudio コンパイラ cc gcc vc
エディタ xyzzy コンパイラ SHC
エディタ&インタプリタ C Machine
C言語に特化したエディタ・コンパイラってあるんですか?
メモ帳
Visual Studio + XKeyemacs gcc + Emacs
C言語はC++/C#のどちらに近いですか?
C++
d
967 :
デフォルトの名無しさん :2006/04/02(日) 21:00:16
d
d
d
まだ早い
d
d
973 :
デフォルトの名無しさん :2006/04/03(月) 03:44:14
int buf[200]; int kan(){ if( hoge&&hogehoge) { return buf[0]; //省略 } : error C2018: 文字 '0x81' は認識できません。 return buf[0];の部分でエラーが出るのですが、助けて下さい。 グローバル配列の値を関数が返すことはできるのでしょうか?
975 :
デフォルトの名無しさん :2006/04/03(月) 03:53:29
下に直してみたのですが、やっぱり 「文字 '0x81'」 のエラーが出ます。 int buf[200]; int kan(){ int z ; if( hoge&&hogehoge) { z = buf[0]; return z; //省略 }
全角スペースが混じってる
979 :
939(ncursesで日本語表示) :2006/04/03(月) 10:38:08
Windows Service for Unix3.5 使うと日本語表示できました
main()からsub()にとぶときに、 main()で表示させていたprintf文を消したいのですが、 画面を移動するときに、画面を初期化する方法を教えてください。 環境はANSI Cです。 main() -------------------------------- あいうえお -------------------------------- ↓ sub() -------------------------------- あいうえお ←これを消したい。 かきくけこ -------------------------------- よろしくお願いします。
fflush(stdout)ではできませんよ。
>>980 環境によって違うが、\r で何とかなる端末は多いかも知れない。
984 :
初心者 :2006/04/03(月) 23:00:32
ぐぐって初めてでも出来たったお
>>980 system("cls");
986 :
初心者 :2006/04/03(月) 23:22:46
こたえたのむ
fflush(stdout)でできるお
>>987 このスレ的には、無理。
環境に依存する方法しかない。
無難なところで、printf("\r%79s\r", "");とでもするとか。
989 :
988 :2006/04/04(火) 00:10:21
次のスレタイは 「環境依存しないC言語なら俺に聞け! Part 125」 にしてくれ。 このスレタイじゃ、質問者と回答者で食い違いが出るのも当たり前だろ。 環境依存しようがしまいがC言語はC言語だから ここで質問しても桶になってしまう。
1に書いてるじゃないか。 何も問題が無い。
アホか。 お前みたいなのがいるから 質問者と回答者の最初のやりとりが必ず 「標準Cじゃできない、環境依存スレ逝け」になるんだよ。
読まない馬鹿が悪い。
環境依存しないC言語って言い回しもわかりづらいね
990と992は華麗にスルーでよろしく。
じゃ、標準C言語なら俺に聞け!で
とっくに次スレ立ってるのになにをバカなことを
景気は十分回復していますよ てゆーか、近隣諸国見てみろよ 十分裕福な国だぜ 日本人ならそろそろ立ち上がれ いつまでもニートと呼ばれてもしかたがないだろ
1000 :
デフォルトの名無しさん :2006/04/04(火) 06:49:29
早朝1000げっと
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。