1 :
デフォルトの名無しさん :
2012/07/15(日) 10:28:33.18
2 :
デフォルトの名無しさん :2012/07/15(日) 12:11:11.90
< `∀´> ニダー
カーニハンとリッチーどっちが好き?
カニチャーハンが好き
23 名前:デフォルトの名無しさん 投稿日:2011/10/13(木) 23:40:11.91
「私がひそかに満足していることのひとつは,
オープンソースの多くのものが,私が寄与したコードに基づいていることです」
「その仕事に合った道具を選びなさい(中略)
ある仕事のために新しい特殊なツールを作成する方法について考えるべきときもあります」
Dennis M. Ritchie
偉大なるプログラマからのメッセージ|Cマガジン1999年10月号31,32ページ
訃報: C 言語の開発者、デニス・リッチー氏が死去
http://toro.2ch.net/test/read.cgi/tech/1318481715/23
俺はライオネルのほうが好きだな
俺は名犬の方だな
犬鍋とか野蛮だわ
コンパイラ bcc32 で勉強中なんですけど、、、
ソース
http://codepad.org/X6tDn8V6 実行例
argv[0]に入っている文字列:C:\temp\test\test01.exe
argv[0]の長さ:23
このプログラムの名前は test01 です
argv[0]に入っているプログラムの名称(ここではtest01)の
表示まではなんとかかんとかできたんですが^^;この
文字列を *pgname にコピーしたいのですが、
どのようにすれば良いの?
さあこいエスパー!
プログラム名の文字数+1のメモリを確保してstrcpyでコピー。
argv[0]をFindFirstFile()で検索 cFileNameの最後の"."(ドット)を\0に書き換える。 WIN32_FIND_DATA構造体のcFileNameの先頭アドレスをpgnameにコピー
>>11 pgnameがただ参照するだけの目的なら、
pgname = & str[last_yen];
でOK。
書き換えを伴うと言うのなら、malloc()でメモリ確保して云々。
>>15 > pgname = & str[last_yen];
多分、それをやると".exe"も見えちゃう。
まぁ
>>11 が何がしたいか良く分からないけど。
あぁ、それじゃ、str[last_dot] = '\0';入れておけば。
//argv[0]からカレントフォルダと実行プログラム名を抽出・表示する #include <stdio.h> #include <string.h> int main(int argc, char *argv[]){ char str[300]; char *pgname; char *p_last_dot, *p_last_yen; memset(str,0,sizeof(str)); //配列初期化 printf("argv[0]に入っている文字列:%s\n",argv[0]); printf("argv[0]の長さ:%d\n",strlen(argv[0])); p_last_yen = strrchr(argv[0], '\\'); if(p_last_yen == NULL) p_last_yen = argv[0] - 1; p_last_dot = strrchr(argv[0], '.'); if(p_last_dot == NULL) p_last_dot = argv[0] + strlen(argv[0]); else if(p_last_dot < p_last_yen) p_last_dot = argv[0] + strlen(argv[0]); strncpy(str,p_last_yen + 1, p_last_dot - p_last_yen - 1); printf("このプログラムの名前は %s です\n", str); pgname = str; printf("pgname %s\n",pgname); return 0; } // なんか、どっか、ポインタ間違ってそうだな。。。
for (int i=0;argv[0][i];++i)if (argv[0][i]!='.')pgname[i]=argv[0][i];else{pgname[i]='\0';break;}
ここで0x5C(\)を含む2バイト文字ファイル名登場!
21 :
11 :2012/07/18(水) 21:09:39.17
>なんか、どっか、ポインタ間違ってそうだな。。。 まぁなんとなくみたいな感じで作ってるんでかなり?かも知れませんが^^; pgnameは参照のみでこちらで書換えたりとかの予定はないです。 何がしたいかっていうと、、、例えばヘルプで使用方法を出したりするじゃないですか。 その時にプログラム名がリネームされても変更後の名前で表示できるようにと。 道はかなり遠大な感もしますが^^;
本物のプログラマはUMLなぞ書かない。UMLは、結局のところ文盲のための文書フォームである。GoFはUMLでデザインパターンを描いた;何をどれだけ描いたか見てみるがいい。 本物のプログラマはC/C++を使わない。C/C++は白ブリーフを穿いた職人気取りの喪男や、マクロフリークや、make好きのUNIXerどもが使うものだ。奴らは関数ポインタと多重継承で喜ぶ。 本物のプログラマはJavaを使わない。Javaはちんけなアプリケーションプログラマが使うものだ。 本物のプログラマはVBなど書かない。一般に、12歳以上になってVBを書くプログラマはいない。 本物のプログラマは文書を書かない。文書は設定ファイルやSQLを読めない馬鹿のためにあるのだ。 本物のプログラマはPerlだのPythonだのRubyだの、その他もろもろの怠惰で短気で傲慢じみたスクリプト言語は使わない。インタプリタはオツムの弱い奴らのためのものだ。 本物のプログラマはオブジェクト指向を理想主義者の陰謀だと考えている。 本物のプログラマはC#など使わない。C#はJavaとC/C++のどちらも選べない過保護なガキのためにあるのだ。 本物のプログラマはJavaScriptなど使わない(プログラム全体を1行で書けない限りは)。 本物のプログラマはPHPなど使わない。実際のコードより多くの括弧を使うのは女々しいのだ。 本物のプログラマはAjaxを軽蔑する。Ajaxは``クモの巣に囚われている''ニヤけた寝小便たれどものためにあるのだ。 本物のプログラマはHTMLがマークアップ言語であり、プログラミング言語でないと知っている。プログラミング言語であると主張するのは泣き虫のXML書きに後押しされたTeX使いの陰謀だ。
プログラマーはコード設計するのが仕事で、コードを打ち込むのは コーダーの仕事と、分かれていた時代もあったらしい。
いいえ
パンチャーというものもあってな・・・。
>>27 実際、ビットパターンと同じ要領で読むことができないわけでもない。
機械語の読み方は勉強するだろ むかし基本情報でやったような記憶がある
30 :
デフォルトの名無しさん :2012/07/19(木) 08:44:07.96
CASL なんて糞。本物のアセンブリをやりたまえ
研究所の人はあのパンチ穴の紙テープを読めるんだよね
韓国産のヒラメで食中毒 調べてみたら寄生虫がうようよみつかる
http://engawa.2ch.net/test/read.cgi/poverty/1342639945/ 県内初 ヒラメ由来の食中毒
今月14日、新庄市内の飲食店でヒラメの刺身を食べた5人が下痢や吐き気などの食中毒の症状を訴え、原因は、
ヒラメに特有の寄生虫とわかりました。
この寄生虫が原因の食中毒が確認されるのは県内で初めてです。
県によりますと、今月14日午後、新庄市内の飲食店で、韓国産の養殖ヒラメの刺身を食べた5人がその日の夜に
かけて次々に下痢や吐き気などの症状を訴えて病院に運ばれ、1人が入院しました。
県によりますと全員快方に向かっていて入院した1人もすでに退院しているということです。
県が飲食店に保管されていた残りのヒラメを回収して調べたところ、「クドア・セプテンプンクタータ」という寄
生虫が見つかり、食中毒が原因と断定しました。
この寄生虫は、おもにヒラメの刺身に寄生し、全国的に食中毒が相次いだことをうけ厚生労働省は去年6月、都道
府県などに注意を呼びかけていましたが、県内で確認されたのは今回が初めてです。
県によりますと、国内で養殖されるヒラメは出荷前に寄生虫がいないか検査が行われているということです。
http://www.nhk.or.jp/lnews/yamagata/6023681251.html
言語とただの電気信号の境目がどこら辺にあるのか ぶっちゃけ機械語も CPUというハードウェアインタプリタへのスクリプトという気もする
アホか。 マシン語もソフトウェアだ。
そもそもすべてハードワイヤードが大変だからソフトウェアが導入されたんだよ。
半田ごてでコーディングしてろ
おk、今から秋葉で真空管ゲットしてくる!
>>35 あー だから
スクリプト言語でのインタプリタはソフトウェア、
機械語でのインタプリタはCPUそのもの、ハードウェアで直接やってる
でどうだ
って話さ
インタプリタ(interpreter)とは、プログラミング言語で書かれたソースコード、ないし中間 表現を逐次解釈しながら実行するプログラムのこと。
だからよォ インタプリタそのものをシリコンで実装すんだよ
お前、あほなん?
おまいらの奥さんの胸はシリコン製だよ。
おまいのチ こそシコリン製だろw
46 :
デフォルトの名無しさん :2012/07/19(木) 13:08:12.70
初心者です。 質問させてください。 edのようなラインエディタを作りたいのですが、 バッファや行管理はどのようにすればよいでしょう。 ソースの提示まではいらないので概念?のようなもの を教えてください。
たぶん自己参照型構造体を使ってmallocしたりするんだと思う
>>46 実装したことはないんだが、
テキストエディタのデータ構造は意外にややこしくて、それだけで一つの分野
ギャップバッファとかでぐぐるといい
>46 struct { void *pNae; //前の行 char *pData;//行の内容 void *pTugi //次の行 }; こんな感じの構造体を1行に付き1つ作る。 バッファは初めに大きく確保するか1行毎に確保するか好みで。
51 :
デフォルトの名無しさん :2012/07/19(木) 18:18:11.75
なえ
52 :
デフォルトの名無しさん :2012/07/19(木) 21:31:37.53
C言語でマルチスレッドなしでゲームプログラミングって可能? アクションゲームとか作りたい。
平行進行させたい部分を細切れに分割して細切れを順繰りに動かす
54 :
デフォルトの名無しさん :2012/07/19(木) 21:48:58.96
禁止事項を先に書けよ 後からこれはダメあれはダメ言われちゃかなわんよ
相手にしたオマエが悪い
57 :
デフォルトの名無しさん :2012/07/19(木) 21:58:08.59
58 :
デフォルトの名無しさん :2012/07/19(木) 21:59:02.68
C言語の標準関数にマルチスレッド扱うものってあった? Javaならthredクラスがあるけど。
zero以外の即値
60 :
デフォルトの名無しさん :2012/07/19(木) 22:12:28.86
int max max=16; int str[max]; とするより int str[16]のほうがソースコードが短くなり 容量も減ると思うのですが。
その16が沢山あったら? エディタの一括修正でいいやんけと言うなら また違った意味で16を他の変数に使っていたら?
>>57 コードのあちこちに 5 とか 1024 とか 0666 が散りばめられているときに、そのコードを理解したり修正するのは大変だろう。
#define N 5
#define BUFFSIZE 1024
#define RW 0666
などなんとか意味を感じられるようにすることが推奨されている。
一見して由来のわからないイミーディエイト値のことを皮肉をこめて「魔法の数字」と呼んでいるようだ。
>>60 #define か enum 八苦を使うのがいいでしょうね。
64 :
デフォルトの名無しさん :2012/07/19(木) 22:29:56.70
その程度の規模しか作ってない人間にはそれでいいよ
66 :
デフォルトの名無しさん :2012/07/19(木) 22:47:35.74
Cがjavaに勝ってる要素ってあるの?
Oracleの臭い息がかかってないだけで大勝利ですが
ネイティブコードが書ける。 ナマポが使える。 しかし最近はCPUすら仮想化されてるからなあ 仮想CPUでも高速化テクニックってのは通用するんだよね 仮想マシン前提のノウハウとかあんのかな
>62 職場の先輩が昔受けた仕事で 「数値直接使用禁止。必ず#define登録しろ。」 というルールがあったとか言われた。
CRとLFとどっちが好きかって聞いてるんだよ。
71 :
デフォルトの名無しさん :2012/07/20(金) 00:33:50.19
#define N 100と int N=100 の違いって何よ
>>71 #define N 100は、デバッグ時に確認できない。
あと、グローバル変数では無いけれど、それと同様に扱える。
まぁ、定数というところ。
int N=100は、あくまでint型のNを100で初期化したもの。
初期化なんて言うけど、自動変数ならルーチン入るからけっきょくは代入だろ。
左辺値になれない 左辺値になれる
真正右翼のヒロイン登場『大日本サムライガール』
http://news.nicovideo.jp/watch/nw314727 「真正なる右翼は、日本に私ただ一人である。有権者諸君、我が国は今、大きく舵を切るべき瞬間を迎えている。
日本が取れる指針はもはや少なく、残された時間には猶予もない。」
いきなり何だと思われたかもしれませんが、これは大日本サムライガールという小説のヒロイン、
神楽日毬(かぐらひまり)ちゃんの決め台詞なのです。
いや、決め台詞というのもふさわしくないか。街頭演説の時の前口上なのです。
何ともすごい小説が出てきました。この本は真に日本を憂うあまり、自らが独裁政権を敷くしかないという結論に達した
真正右翼の16歳の美少女ヒロインと、そんなヒロインを陰に日向に支える主人公織葉颯斗(おりばはやと)くんのお話なのです。
http://news.nicovideo.jp/photo2/229868l.jpg 『大日本サムライガール』至道流星/星海社FICTIONS
この表紙の少女が神楽日毬ちゃんです。手に持っているのは愛用の拡声器「拡さん」。
この少女が、政治の頂点を目指すために、アイドルとして芸能界の頂点を目指すのです!
ネトウヨ・ニュース、ネタが尽きたのか。
77 :
46 :2012/07/20(金) 09:06:19.29
―Daily Mail(英)―
情報筋によると、イギリスの運輸省は、ロンドンと主要都市を結ぶ高速鉄道に使用される車輌の製造において、
日立製作所グループとの交渉が最終段階に入っていることをオリンピックの開会前に正式に発表する予定だといいます。
それによると、イギリスのファースト・グレート・ウェスタン・レール社は、2016年までに、500台の車輌を日本から輸入。
車輌はほとんどが広島県の日立製作所笠戸事業所で組み立てられるため、イギリスの評論家たちは
製造費10億ポンド(約1,230億円)にも及ぶ雇用機会をみすみす失ったと政府を批判しているということです。
これに対して(海外に流出できない)独自の高価な技術を使用するためと、日本国内での車輌の製造を譲らなかった
日立製作所笠戸事業所長の正井健太郎氏は「車輌の製造に関われる誇りを感じます。
安全と信頼性に長けた日本のテクノロジーで製造された車輌は、
乗客に対してもスムーズな乗心地を感じてもらえることでしょう」と述べています。
http://chiquita.blog17.fc2.com/blog-entry-6607.html
Cがいい。Javaがすき
わたしはperl! perlなの! perlがイイ!!
Java は unsigned がないから嫌ぽ
プログラミング初心者です。 現在、「C言語超入門―Windowsでゲームボーイのプログラムを作ろう! 」を使って勉強しています。 この本を最初の教科書として、学び始めました。次に読む本として何が良いかアドバイスをお願いします。 ゲームボーイに絡めて勉強したらモチベを保てるのではないかと思い、この本から始めました。 専門学校に通っているわけではなく、独学でやっています。 皆さんのお勧めの入門書を教えてください。
windowsゲームプログラミング/赤坂 玲音
B.カーニハン先生の 「プログラミング作法」 〜書法、の方じゃないから注意な。
Z80
つーか、ゲームボーイは逆に大変じゃないか? GBAとかの方が楽な気がする。
「C言語超入門―Windowsでゲームボーイのプログラムを作ろう! 」 いやこの本は凄く分かりやすい 200ページちょいしかなくて、俺が初心者だった大学1年の頃にすらすら最後まで通読できた 絶版でもう売ってないんだけどマジ良書
ゲームボーイ用のコンパイラとかカセット用意すんの大変じゃない?
うん
GBDKとemuでええんでないの
うん
韓国のコミュニティサイト「ポムプ」の掲示板に「日本ビールがおいしくなければならない理由」とのスレッドが立てられたところ、
さまざまな意見が寄せられた。
スレ主は、日本の食文化について言及し、日本では食に対するこだわりが深い人が多く、製菓技術や製パンは世界に誇れる水準であり、
ビールも同様に世界で認められているものの一つだと述べた。一方、韓国産のビールはまだまだ改善の余地があり、
新規参入による市場の拡大が望まれると指摘した。
スレッドにはスレ主に対して同意し、日本の食文化について称賛する声が多数並んだ。
・「日本は食文化、特にグルメへのこだわりがすごいと思います。外国の食文化を受け入れ、百年以上の探求を経て、
トップレベルにした。ビールも同じ」
・「率直にいって、日本の食べ物はおいしいものばかり」
・「日本は、国内市場があまりにも大きい。それに比べ、わが国の内需市場はすかすか」
また、韓国内のビールメーカーなどを批判する声もみられた。
・「韓国のビール会社のマインドは最悪」
・「韓国ビールは日本でいえば、ビアテイスト飲料」
・「わが国のビールは日本では発泡酒。ビールと呼ばれること自体、恥ずかしくなる粗雑なもの」
むしろ、北朝鮮のビールの方がおいしいのではといった発言も見られ、韓国人がビールに対して高い関心を寄せている様子がうかがえる。
・「聞いた話だが、北朝鮮のビールの味が韓国産のビールの味よりいいらしい。技術的な問題ではなく、制度や材料が大きな違いをもたらすのでは」
・「わが国のビールがまずい理由は、小規模な醸造所の法的な問題から構造の問題までたくさん。北朝鮮のビールと韓国のビールは、簡単に比較できません」
(編集担当:李信恵・山口幸治)
http://news.searchina.ne.jp/disp.cgi?y=2012&d=0719&f=national_0719_018.shtml
エミュ厨かよ
95 :
デフォルトの名無しさん :2012/07/21(土) 17:54:29.48
_____ /ミミ\\\\ \ /ミミミ\\\\\\\ /彡ミミミ\\\\\\\\ |彡ミミ/\\\\\\\\| |彡 | \\\\\\\| ヽ |へ、_ _,へ\\\\/ | __ __ | / ) gets() | |/ ノ | ( / _ ) / おひさしぶりーふ ヽ ヽ | ヽ ヽー‐‐‐ァ /\ //ヽ ヽ-‐' / /\ \ / / ヽ_ / / / \ / \ |\ /| /\ \ (⌒\ / (⌒ヽ |二| | / \ \ __ゝ ヽ ___ ゝ \ \| / / | ( ヽ─ ( l ) ヽヽ / / / |  ̄ ̄( ̄丿 |  ̄ ̄( ̄ ゝ \ / / | ( ̄ノ | ( ̄ ゝ | ̄ ̄ ̄ ̄ | ( ̄ノ | ( ̄ ゝ |
98 :
デフォルトの名無しさん :2012/07/21(土) 18:36:40.89
おわらないよ
ネヴァー・エンディング・プログラミング 第一章 〜彼方への旅立ち〜
100 :
デフォルトの名無しさん :2012/07/21(土) 20:50:30.43
諦めたら
101 :
デフォルトの名無しさん :2012/07/21(土) 20:52:34.13
なげーーーーーーーーーーーーーーーーーーーーーーーよ 変数wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
quin2decが手元の参考書に載ってない上にぐぐっても出ないんですが、 これはどういった働きをするんでしょうか?
>>104 見たこと無いのだが。
というか、それはどこに出てきたのでしょうか。
ただ、よくあるパターンとしては
EXCELの関数では
bin2decとかhex2decとかoct2decで
2進数だったり、16進数だったり、8進数だったりを10進数に変換する。
んで、そういう機能をC言語でする場合、
そのような名前の関数を作る事がある。
(ユーザ関数なので、名前はなんでも良いんだけど。)
そのパターンで考えると
quin → quintuple → 5倍
で、多分5進数を10進数に変換する関数っぽいけど、
所詮、ユーザ関数だから正しくは分からない。
もちろんquinさんを10進数に変換するとも考えられる。
>>105 おお、ユーザー関数なんてものがあるのですか。
通りで検索してもでてこないわけだ。
おっしゃる通り五進法を十進法に変換せよ、という問題で出てきました。
107 :
デフォルトの名無しさん :2012/07/23(月) 05:36:56.10
宿題スレでコードを書いたいただいたのですが、調べながらコードを見ていても理解できない部分が
多々あったので質問させてください。
問題文
http://ideone.com/WnbTA コード
http://codepad.org/nqyygUO9 ・#define N 1024は何を意味しているのか
・quin2decが引数として文字を4つ受け取っているのはどこか
・どこで戻り値として返しているか
・受け取る五進数は4桁以下の非負正数(十進法の0〜624)であると仮定する、とありますが
どこで仮定されているのか、あるいはもし仮定されていないならどうすれば良いか
・static char buff[N]; が何を意味しているのか
宿題スレでコードを貰っておきながらこちらで聞くのもどうかと思うのですが、
どうしてもわからなかったのでこちらで質問させていただきました。
よろしくお願いします
>>94 gameboyはbios用意しなくていいから問題ないっしょ
>>107 まぁ、マニアックなコードだな。
質問>・quin2decが引数として文字を4つ受け取っているのはどこか
問題文>4つの文字を引数として受けとる
確かに単文で見た場合、
「4個の(文字を)引数として受け取る」と読めなくもないが、
「4種類の文字を引数として受け取る」とも読めるし、「4桁の文字を引数として受け取る」とも読める。
それぞれの返答は
・quin2decは4種類の文字(列)を1つ受け取る。
・コード内で4桁に制限してる箇所は・・・ないね。問題文でも4桁以外の桁数だった場合どうするとか書いていないから、
コードを書いた人が、プログラムの前提条件として受け取ったんだろうね。
・4種類のチェックを行っている部分は switch文
質問>どこで戻り値として返しているか
これは「戻り値」を返す方法は勉強している(もしくは教科書に書いてある)と思う。
返答としては31行目のreturn文なんだけど、再帰呼び出し(ある関数の中で、自分自身(の関数)を呼び出してる)をしているからイメージ沸きにくいかもね。再帰呼び出しで調べてね。
質問>・受け取る五進数は4桁以下の非負正数(十進法の0〜624)であると仮定する、とありますが・・・
受け取る文字列の種類として負を表す文字自体がなく、「r,h,f,m,y以外の文字を受け取ったらエラーとする」ので気にしなくて良いと思う。
質問>・#define N 1024は何を意味しているのか
質問>・static char buff[N]; が何を意味しているのか
Nを利用している箇所は static char buff[N]; と fgets(buff, N, stdin);の二ヶ所である。
問題文では「キーボードから文字列として受け取り」とある。
受け取る領域(入れ物)が必要である。static char buff[N];はそれを用意している。その際、領域の大きさ(N)を何かしら決める必要がある。
問題文としては「4桁の5進数」とあるから、4文字分+(改行コード分またはnull終端分)が必要最低限なのだが、
「4文字以上の文字列を受け取らない」とはあるが、キー入力される文字数は制限されていない。
そうした場合、十分な大きい値(1024)を用意したという事だと思う。
#define とは何かという質問だったら、教科書調べてね。
長いね。
110 :
デフォルトの名無しさん :2012/07/23(月) 07:41:35.79
>>109 長々と説明ありがとうございます、おかげさまである程度理解ができました。
ただ、引数に関してがイマイチわからないのですが、単純に引数として受け取ってるのは
y,m,f,hであり、swich文で入力した文字がそれに該当してるか調べてcaseで分けているということなんでしょうか?
戻り値については早速再帰呼び出しで調べて学習してきます。
#define文自体は調べて理解していたのですが、1024という数字の意味が理解できていませんでした。
領域の大きさを決める数字と聞いて納得できました。
111 :
109 :2012/07/23(月) 08:24:22.91
>「4種類の文字を引数として受け取る」とも読める
あ、そもそも5進数だし、「r,h,f,m,y」と書いてあるのだから、5種類の文字だね。。。あほだ。。。
>>110 私が質問の意図を理解していないから上手く説明できてないのだね。
>・quin2decが引数として文字を4つ受け取っているのはどこか
「quin2decが4つの引数を受け取っていない事を疑問に思っている」と読み取って良いかな?
int quin2dec(char *s, int n)
それに対する返答は「4桁の文字列として、一つの引数(s)を受け取っている」から。
ただし、実際には、コードは桁数(4桁以内である事)のチェックはされていない。「なぜチェックしていないのか」は、
多分、「問題文に桁数が不正の場合、どうするのか」が指定されていないからだと思う。
まぁ、もちろん 「int quin2dec(char a,char b,char c,char d)」として4つ受け取ってもコードを書いても良いのだけど。
ただ、こうした場合、3桁の文字が入力された場合、困るかな。
あ、「受け取った4文字中r,h,f,m,y以外の文字が一文字でも含まれた場合エラーメッセージを出してプログラムを終了する。」
quin2decが「r,h,f,m,y」以外の文字を受け取っちゃいけないとは、書いてないからいいか。
まぁ、C言語と言うより、「4つの文字を引数として受けとる 」の問題文の解釈の話のような気がする。
「引数を4つにしないといけない」と読むか、「引数を4桁の文字列として受けとれば良い」と読むか。
とんちんかんな回答かな?
112 :
109 :2012/07/23(月) 08:36:19.66
>>110 あ、ちょっと勘違いしてそうなんで補足
>戻り値については早速再帰呼び出しで調べて学習してきます。
「再帰呼び出し」と「戻り値」は直接は関係ないよ。
「再帰呼び出し」がどういう動きをするかを勉強した方が良いよ。
で、「再帰呼び出し」をした結果、それぞれの「戻り値」がどうなるか、がややこしい(かも)。
と言うことね。
まぁ、これは、地道にそれぞれのステップを追って(プログラムが動いている順番を追って)、
その時の変数や戻り値がどうなっているかを書き出してみるのが確実だよ。
113 :
デフォルトの名無しさん :2012/07/23(月) 08:40:54.94
>>111 わざわざありがとうございます。
私の知識が足りないので何を疑問に思っているのかが上手く伝えられていないんだと思います。
おっしゃる通りquin2decが4つの引数を受け取っていないのが疑問でした。
私の手元の参考書と比較するとquin2dec(char *s,int n)の*sとnを仮引数として受け取るのかな、と考えたのですが
それだと仮引数が2つだけで、私は「引数を4つにしないといけない」と捉えたので2つ足りない事に疑問を感じていました。
分かりにくい質問だらけで申し訳ないのですが教えていただけるとありがたいです
114 :
109 :2012/07/23(月) 09:41:20.81
>>113 このコードで、引数(s)と、引数(n)とはそれぞれ何を表しているのか。ということですね。
すんません。quin2decについて、真っ当に追ってないから、引数(n)ついて、きちんと理解してません。
っていうのが正直な所です。
ちょっと気合を入れて動きを追ってみましょう。
7行目の if ( !s || !*s ) return n;
!s は s==0と同じ意味、sは(char *)だから sのアドレスが0だった場合(実際には、後述する「r,h,f,m,y以外」の文字だった場合)
!*s は *s == 0と同じ意味、 sのアドレスが指しているcharの値0の場合だから、null終端だった場合
どちらかの場合、引数(n)をそのまま返す。
11-27行目のswitch文
switch文の引数は*sだからアドレスsの指しているcharの値を指している。
case 'y'からcase 'r'まで、break;がないから、該当した文字列以下の文は(break;まで)すべて実行され、switch文を終える。
よって、yだったら14,16,18,20行目が実行されるので m==4となる。
同様に fだったら、18,20行目が実行されるので m==2となる。
r,h,f,m,y以外だったらdefaultまで行き m== -1となる。
115 :
109 :2012/07/23(月) 09:41:38.76
(続き) 29-30行目は まず m が 0以下という事は前のswitch文で「r,h,f,m,y以外」と言う事 その場合、30行目が実行される。 その時 引数(0,-1)でquin2decで再帰呼び出しされ、その戻り値が returnされているので、自分の戻り値となる。 で、再帰呼び出しされたquin2decでは7行目に引っかかるから、無条件に -1が帰ってくる。 (ということは 30行目は return -1;と記述しても問題ないような気がする。) 31行目は引数(s + 1, 5 * n + m)でquin2decで再帰呼び出しされ、その戻り値が returnされているので、自分の戻り値となる。 s + 1 は、sの次のアドレス(隣の文字のアドレス)にして quin2decに渡している。 注:再帰呼び出しされたquin2decの引数(s)が、自分の引数(s)の次のアドレスとなっている。 5 * n + m は 受け取った引数を5倍しているから、繰り上げ処理をして mを足している。 ふんふん、なるほど。それを繰り替えして、最後の桁まで行ったら、その戻り値が、呼び出し元に上がってくる訳か。 つまり、quin2decは引数(s)上から一文字ずつ処理して、引数(n)は、そのけた時点での十進数の値ということですね。 で、それを最終桁まで繰り返している。 自分だけが納得しているような気がする・・・。
116 :
109 :2012/07/23(月) 09:46:03.32
>まず m が 0以下という事は前のswitch文で「r,h,f,m,y以外」と言う事 あ、0未満だね。
117 :
107 :2012/07/23(月) 10:28:54.36
細かい説明本当にありがとうございます。 じっくり読んでquin2decが受ける引数について理解できました! それだけでなく、あやふやで理解したつもりになっていたところも 説明を読んでいるうちに大分しっかりと理解できました。 せっかくの機会なので34-42行目のところも教えていただけないでしょうか? 理解した「つもり」だらけだったので、ここも見当違いな考えになっていそうです。 何だか結局全部丸投げみたいになってしまい申し訳ないのですが、よろしくお願いします
>>117 途中見てないが、chop()についてだけ。
目的: 引き数で渡されナル終端文字列の後方にある改行文字をchopする。
詳細:
・ナル終端文字を見つける。
・一つ遡る。
・その場所の文字が改行文字(或いは復帰文字)であればナル終端を書き込み、一つ遡る。
以上。
void chop(char * s) { char * p = strchr(s, '\0'); for (--p, p >= s && (* p == '\n' || * p == '\r'); --p) * p = '\0'; }
>119を書いて気付いたんだが、>107のコードは何も入力せずに入力を閉じるとバグるな。
>>118 ありがとうございます。
頑張ってみます
いえいえ
あっそーれ
>>109 俺のコードをよくもマニアックといったな。慰謝料にモリタポ払え
何も入力しないってのはCTRL-Dのことだろ 的はずれにもほどがある
127 :
109 :2012/07/23(月) 13:28:09.19
>>124 あ、本人?
勝手にコード解説しちゃって、ごめんね。
行間まで、思い込みで解説しちゃったから、
解釈の間違いあったら、正しといてください。
きっと、間違っているから。
なんだ、QZコードだったのか。納得。
0.1次元バーコードか?
え
#define NULL ((void *)0) あるポインタをNULLで初期化すると、そのポインタはメモリ上の絶対アドレスである0番地を指すということなのでしょうか
環境による としか言い様がない気分
通常アドレスは仮想化してるから実際は指してないし参照できない
仮想記憶のない時代の話だな。
>>127 丁寧に解説いただき恐縮です。
> 30行目は return -1;と記述しても問題ないような気がする。
これは確かに。return 文を一箇所にしたいという意思だが、そのために if (!s || !*s) と複雑になってしまったので、どっちでかいても一長一短。んー。
>>128 んー、なにを納得したのかおしえてください。匂いますか、いや臭いますか?
え?再帰の方がよみやすいのですが?これって主観ですかね。
隙あらば再帰にしてしまう→再帰ッカー 他にもCゲンガー、フォートランナー、コボラーなど
2,3のコードがあげられてて そのうちの再帰使ってるのが「わからん」ちゅーなら 初心者やらにはワカランのだろ 強力だけれども面倒くさい、 とくにその手の初心者には 誰かにとっては読みやすくても、 ここら辺りで宿題出したり聞いたりする人物のレヴェルも考える 普通なら ね
すみません、どうしても解答がわからないのですが... 問.関数、void addlist(LIST *head,LIST *addata)を完成させろ #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct name_list{ struct name_list *next; char *name; }LIST; void addlist(LIST *head, LIST *addata); int main(void){ LIST name0= {NULL, NULL}; LIST name1= {NULL, "B"}; LIST name2={NULL, "C"}; LIST name3={NULL, "D"}; LIST name4={NULL, "E"}; LIST addata = {NULL, "A"}; LIST *p; LIST *head; head=&name0; name0.next=&name1; name1.next=&name2; name2.next=&name3; name3.next=&name4; addlist(head, &addata); for(p = head->next; p != NULL;p=p->next)printf("%s\n,p->name"); どなたかお願い致します....(ノД`)
あ、一番下に return 0; } を忘れてました...
>>144 ごめんなさい
これは過去問でして、明日試験なんですけど聞ける友達がいない....
C言語です
リストの末尾に追加かね void addlist(LIST *head,LIST *addata) { LIST *p = head; while (p->next) p = p->next; p->next = addata; }
147 :
デフォルトの名無しさん :2012/07/23(月) 23:04:27.30
PICマイコンを使用するためにC言語を勉強中です。 どうしてもプログラム中に、EEPROMへの読み書きを多用するので int型とlong型用の2つの値をEEPROMから読み込み、int型long型のそれぞれの変数へ代入する関数を作ったのですが、ポインタの使い方がよくわかりません hiとかloというのは2バイト以上の変数を1バイト単位に分割するために使用する”built_in.h”というヘッダファイル用の語句です このコードの何がダメなのかも分らないのでご教授ください よろしくお願いします void main() { int x; long y; read2byte(100,&x); read4byte(200,&y); } void read2byte(int a,int *b) { hi(*b) = EEPROM_Read(a); lo(*b) = EEPROM_Read(a+1); } void read4byte(int a,long *b) { highest(*b) = EEPROM_Read(a); higher(*b) = EEPROM_Read(a+1); hi(*b) = EEPROM_Read(a+2); lo(*b) = EEPROM_Read(a+3); }
>>147 バイトオーダーが違うかもしれない
くらいしか分からん
149 :
147 :2012/07/23(月) 23:11:54.31
書き忘れました EEPROM_Read(a); というのはコンパイラ付属の関数で、aがEEPROMのメモリアドレスです
>>146 そもそもこのプログラムって何をしているものなのでしょうか....?
ソート?
あと、for文の上の
addlist(head, &addate)というのは何なのですか?
151 :
片山博文MZボット ◆0lBZNi.Q7evd :2012/07/23(月) 23:18:05.21
hi,loの定義をさらせ。 hi(*b)は左辺値ではないから代入できないと思われ
152 :
147 :2012/07/23(月) 23:23:18.80
>>151 2バイト以上の値、例えばlong型(4バイト)を低いビットからlo,hi,higher,highestとバイト単位に分割するものです
>>150 うんにゃ
わたされた head から末尾を探し出して、その末端にさらに 渡された adddata を繋げてる
name0〜name4 までのリストを手で構築後
adddata 関数を呼び出してる
意図として name0〜name4 の後ろに adddata を連結しようとしてる と俺は解釈した
× adddata 関数を呼び出してる ○ addlist 関数を呼び出してる
>>153 ご丁寧にありがとうございます
このプログラムはAがname0に入るわけでは無いんですか??
addataがname4の後に連結した時、whileが初めて回りだしてAが先頭に来るって事ですか?
やばい日本語おかしくてスミマセン
printf() の出力結果は BCDEA の予定 ABCDE にしたいのなら void addlist(LIST *head,LIST *addata) { LIST *p = head->next; head->next = addata->next; addata->next = p; }
>>142 厳しいようだけど、
明日試験で、過去問で解答が分からない。ってのは
解答を教えても、明日の試験では違う問題がでるから意味が無いのでは?
解き方が分かっていないんだから。
このプログラムは、addlistが不明なのだが、明示されてるのだから、
そこを理解する所から、入るべき。
(まさしく
>>150 の疑問を理解できる様になる事が大事)
それから、足りない部分(addlistの中身)を考える。
× head->next = addata->next; ○ head->next = addata; なんかヒデェな… もう寝る
159 :
157 :2012/07/23(月) 23:39:14.48
>このプログラムは、addlistが不明なのだが、明示されてるのだから、そこを理解する所から、入るべき。 まつがい。 このプログラムは、addlistが不明なのだが、明示されている所を理解する所から入るべき
レス下さった皆さんありがとうございます そもそも一晩(ではないんですけども)でやろうとした自分が悪いですね... 少し前の方から再度勉強しなおしてきます... ありがとうございました!
161 :
片山博文MZボット ◆0lBZNi.Q7evd :2012/07/23(月) 23:41:19.46
*b = ((int)EEPROM_Read(a) << 8) | (int)EEPROM_Read(a+1); や *b = ((long)EEPROM_Read(a) << 24) | ((long)EEPROM_Read(a+1) << 16) | ((long)EEPROM_Read(a+2) << 8) | (long)EEPROM_Read(a+3); みたいに書かないといけない。
>>147 君はまだEEPROMを使うべきではない(きり)
163 :
片山博文MZボット ◆0lBZNi.Q7evd :2012/07/23(月) 23:58:54.84
共用体を使う方法もある。 union I16{int i; struct {unsigned char LO,HI;}}; union I32{long l;struct {I16 LO,HI;} };
久しぶりにCやったら;とunionをつけ忘れたよ
165 :
147 :2012/07/24(火) 00:26:01.62
>>161 レスありがとうございます。
その式と、下記の式だと自分には同じ動作だと思ってしまうのですが
何がどう違うのでしょうか?本当にわからないです><
void read4byte(int a,long *b)
{
highest(*b) = EEPROM_Read(a);
higher(*b) = EEPROM_Read(a+1);
hi(*b) = EEPROM_Read(a+2);
lo(*b) = EEPROM_Read(a+3);
}
>>165 hi とか lo がどんなものか分からないからこうしようぜ
void read4byte(int a, long *b)
{
unsigned char *p;
p=(unsigned char*)b;
*(p+0)=EEPROM_Read(a+0);
*(p+1)=EEPROM_Read(a+1);
*(p+2)=EEPROM_Read(a+2);
*(p+3)=EEPROM_Read(a+3);
}
167 :
片山博文MZボット ◆0lBZNi.Q7evd :2012/07/24(火) 00:33:47.87
>>165 恐らくhiマクロなどは内部でシフト演算を使っているので
hi(*b)などは参照がなくなって左辺値になれないから代入対象になれない。ただそれだけ。
168 :
147 :2012/07/24(火) 00:39:29.70
>>166 レスありがとうございます。
実は、
>>165 で書いた式と、
>>161 さんの書いた式で問題なく読み込みができたのですが、
PICマイコンのスレで同じような質問をしたところ、ポインタの使い方?がおかしいと指摘されて
ここで質問させて頂きました。
一番気になるのはポインタの使い方の間違いと間違っているために起こり得る問題です。
long型(適当な値 99,999とか2,222,222)を一旦、EEPROMに書き込み、上記の式で読み込ませたところ
正常に読み込まれているので何が何だかさっぱりわかりません~~;
169 :
147 :2012/07/24(火) 00:44:24.25
>>167 レスありがとうございます。
実は、
>>168 で書いたよう、に教えて下さった式も自分で書いた式も問題なく読み込みできています。
本当に何がダメなのか、本当はダメではないのか分らず、困りましたorz
170 :
片山博文MZボット ◆0lBZNi.Q7evd :2012/07/24(火) 01:00:20.84
ファイルbuilt_in.hを開いて中身を確認しなさい。 そこにhi,loの定義があると思われます。 それらをさらして下さい。
171 :
147 :2012/07/24(火) 01:04:28.32
>>170 了解しました。下に晒します。
話変わりますが、例のコードはポインタの使い方って間違っていますかね?
そこが気になります。
#define Lo(param) ((char *)¶m)[0]
#define Hi(param) ((char *)¶m)[1]
#define Higher(param) ((char *)¶m)[2]
#define Highest(param) ((char *)¶m)[3]
#define lo(param) ((char *)¶m)[0]
#define hi(param) ((char *)¶m)[1]
#define higher(param) ((char *)¶m)[2]
#define highest(param) ((char *)¶m)[3]
172 :
147 :2012/07/24(火) 01:06:18.61
文字化けしたので、&とparamの間にスペース入れました #define Lo(param) ((char *)& param)[0] #define Hi(param) ((char *)& param)[1] #define Higher(param) ((char *)& param)[2] #define Highest(param) ((char *)& param)[3] #define lo(param) ((char *)& param)[0] #define hi(param) ((char *)& param)[1] #define higher(param) ((char *)& param)[2] #define highest(param) ((char *)& param)[3]
174 :
片山博文MZボット ◆0lBZNi.Q7evd :2012/07/24(火) 01:08:49.01
検証の結果、問題なし。 シフト演算じゃなくて&とキャストを使ってた
hi, lo マクロは左辺値になれる形式だな > PICマイコンのスレで同じような質問をしたところ、ポインタの使い方?がおかしいと指摘されて その指摘は hi, lo を関数だと勘違いしての指摘かもしれんね
176 :
147 :2012/07/24(火) 01:11:22.58
>>173 マジですか?
PICもC言語も始めて数か月程度しか経っておらず、ポインタを覚えるためにも初めて使ってみたのですが
PICマイコンスレで指摘され、どうしても自信がありません><
177 :
147 :2012/07/24(火) 01:14:57.23
>>174-175 レスありがとうございます!
キャストとかの語句はまったくわかりませんでしたのでもっと勉強しないとダメですね
どうもありがとうございました!
いえいえ
連結リストの質問チラホラ出るけど、ポインタで教えるor ポインタtoポインタで教えるのは教員の好みによるものなのかい?
リストで二重ポインタなんか使わんだろ
>>180 え?使わない?
二重ポインタを使わないとなると、コピーコピーコピー、とルートまで延々コピーする格好の悪いことになるのだが?
>>181 それが正解だよ
コピーコストが嫌ならリストオブジェクト全体の参照を取ればいい
ノードの参照は共有しないのが常識
free()しちゃうとダングリングポインタが出来てしまう危険があるからか
二重ポインタってポインタが指してる先を変更したい時に使うんじゃないのか? それかポインタ配列か 話は変わるけどこういうのはcがfree()されるとaもbもダングリングポインタになってしまうけど 検出されないのな 当たり前か 後からaやbを使いまわす可能性があるし int main(void) { int *a, *b, *c; c = (int *)malloc(sizeof(int)); if (c == NULL) exit(1); *c = 123; a = b = c; printf("%d %d %d\n", *a, *b, *c); free(c); return 0; }
使わねーよ。 アホすぐる。
for(i=0; i< 空欄B (float) ; i++) printf("%02x", *p++); この空欄Bに入る単語を答えよという問題があるんですが キャスト演算子(float)を セミコロン直前におくような 表現が思い当たりません。(問題文全体はもっと長いです。)どのような表現が入りうるのでしょうか?
sizeof
あー、失念してました。ありがとうございます。 ついでに printf(" %-12g",f); の意味も教えていただけないでしょうか? 問題が紙なので %ー12じゃなくくて %ーL2 かもしれませんが
すいません%-12gのほうはもういいです
>>185 C に「検出」などというお子様仕様は皆無。
コンパイラによっては未使用変数や未初期化変数のアクセスは検出するがCの仕様ではないよな。
ひょっとしてinlineってCの仕様じゃない?
C99から。
ソフト会社でC99での開発って結構あるの?
まずない。
ですよねー
>>192 無職のオッサンに上から目線で言われたくないなあ
GCのアルゴリズムでも勉強したら?
Cでインラインしたいときはどうしてるの?
#define
>>203 ルートノードを直接的にリストとみなさずに
ルートノードを包むようなリストオブジェクトを書くんだよ
ルートのアドレスがコロコロ変わったらリストを参照してる人が大変だろう
cmdにgccと打つと、{gcc: 致命的エラー:入力ファイルがありません RpC~オワオスB}とでるんだけど、だれか助けて(泣)
オワオスって何か\(^o^)/オワタみたい
>>208 ソースファイルを指定してないからじゃないの?
使っている人間が致命的なまでのノウミソなんだろうな。 なんて打ったかくらい全部描けよアホ
>>203 C++で書くんならmallocじゃなくてnew使おうよ・・・
必死で書いたのが伝わってきてキモス
全部書いてるんだろ。
>>205 たしかにそれには同意します。
特にクラスに仕立てるときに、ルートを含むクラスとノードのクラスを一つにまとめようと苦心した記憶がありますが、
結局のところ、ルート(ファーストノードをさすポインタ)は、ノードクラスとは別にしたほうがいいと考えるようになりました。
http://codepad.org/jUqoMRPp (結城さんのJavaデザパタ本はadapterパターンを試行したものです。リストではなく二分木ではありますが、Node クラスはほとんど構造体扱いで Node クラスのメンバ関数は軒並みstaticの有様です。)
ただしここで話題となっている、いや話題としたいのは、「リストや二分木を扱うときに、二重ポインタを使わずに書く、というのはあまり考えられないのでは?」という素朴な疑問です。
>>212 単にCで参照を使いたいという願望だけでざっと書き下ろしてみたのですが、あー、ぶれてますねえ、なんで cstdio を使わずに iostream にしちゃったんだろう?
リファレンスへのポインタなんて恐らく初めて使ってみたんだろうな
おい、おまえらQZに対する嫉妬がすぎるぞw
C++でいいのならstd::listとか使うだろ
>>214 二重ポインタを使う必要がない(実際、簡単に書ける)
だからわざわざ間違いが起こりやすい二重ポインタを使うのは避けるべき
>>219 うん、それが理解できないでいるのです。
リストは
>>184 ににた形で(二重ポインタ抜きで)書けそうですが、二分木やAVL木では、二重ポインタなしではほとんど不可能では、と考えるのです。
ほんと、低脳ほど頭が固くて笑える。
>>217 自己愛性パーソナリティ障害が何を言うかw
書けるっていう奴が書いてみせればてっとりばやいんじゃね?
え?お前も書けないと思ってんの? コテやめた方がいんでね?
↑池沼
うむ、リスト使う位ならC++で書くからな。
229 :
デフォルトの名無しさん :2012/07/25(水) 08:51:22.93
>>219 二重ポインタくらいで音を上げるど素人が「べき」なんて言うな、おこがましい
お前がな。
>>229 本物の低脳を久々に見た
229はガチでヤバイ
元は教員がど素人に教えるときの話でしょ
老害にはC++の良さがわからんのですよ
>>184 を見てみたが、要するにこれってリストの「先頭に」ノードを付け加えて行って、
先頭ノードを指すポインタの値がコロコロ変わるために、二重ポインタを使って
先頭ノードを指すポインタの値を書き換えてるんだよね
リストの最後尾にノードを付加するようにすれば二重ポインタは不要
挿入関数に渡したノードを指すポインタ以外がそのリストを参照していた場合参照先を見失う
>>225 書けないということは事実上証明不能 (いわゆる悪魔の証明) なので、
この場合の証明責任は書けるという側にあるということを述べただけで俺は
内容についてどちらとも思ってないというか全く考察してない。
普通なら考察以前の問題だからコテはずせって話なんだろ。
>>236 だよな
だから先頭にノードを付け加えるのは特殊なケースを除けば百害あって一利なしのような気がする
末尾追加は末尾を指すポインタの分メモリが必要、これが無いと遅くなる 先頭追加なら早くて、追加のメモリも要らないが、参照がコロコロ変化するのが面倒なのでリストをラップするオブジェクトが必要になり結局メモリ効率も前者と同じになる
なら双方向リストにしろよ メモリはたくさん食うけど先頭ノードからすぐに末尾ノードへのポインタを得る事が出来る だいたいリストをソートする時には単方向リストだと大変だぞ
>>227 >>184 ,
>>203 より機能を削ってますね。リストの頭にしかノードを追加できない。
>>184 ,
>>203 と同じようにリストの途中に挿入する形で、かつ二重ポインタを使用しない、というのは可能なんでしょうか。
双方向ならできるかな?
できる 以上
以上 ↑ 詳細を議論できなくて逃げたいゴミがよく使う言葉
逆になんで出来ないと思うのか疑問
>>245 横からだが、それは、さすがに
悪魔の証明を求めていると思う。
>>241 双方向でリング状?
先頭->prev = 末尾
末尾->next = 先頭
リングリストでggrks
単方向・双方向と循環・非循環は別の設計思想じゃね?
>>246 悪魔の証明って言いたいだけだろ
普通にできるものを出来ないといいはるからなんでだよってなるのは当然
馬鹿な子供が掛け算が出来ないからってそれが計算不能なわけではないだろ
勉強してなんとかやろうとしてないだけだよ
証明まではできなくとも困難さの示唆くらいはできる事も多々
>>250 うん。言いたかっただけw
ただ、これは考え方の違いだからいいんだけど、
バカだと思った子に、「お前はバカだ」と言っても何も始まらないと思う。
その場合「君はこういう理由でバカだよ」と説明してあげた方がいいと思ってる。
バカな理由はログみれば? 散々書いてあるでしょ
>>247 双方向リストにするならリングリストにしないと意味が半分失われるよ
最初に作成したノードを指すポインタを保持しておく
そしてもし最初に作成したノードを削除した場合、一つ前(つまり最後尾)か
一つ後ろを指すように書き換える
>>254 んー、各ノードを走査するときに、同時に前回の対象ノード=今回の親ノードを記憶しておくんですね。なるほど。
でも、これってリストだからできるやりかたで、二分木のときにはやる気はおきないなあ。
ああ、二分木を非再帰に構成する――上からノードをパチンコ玉よろしく落としていって、はまるところにはまる、っていうやりかたはありそうですね。
二重ポインタに固執していたんですが、いろいろあるんですね。ありがとうございました。
みなさん、やっぱり自分の書いたコードが一番かわゆいのね、ふふふ
コテはずすなら一生はずしとけ。
261 :
259 :2012/07/25(水) 22:22:51.53
ん?もしかしてQZさんだと思ってる? 残念ながら違います。。 運営さんにIPきいてみたら?
早く薬飲んで寝てろ。 一生な。
>>258 え?
>>184 は二重ポインタ pp をつかってループ変数を一つにおさえていますけれども、
>>254 は挿入地点 p とその親 pPrev の両方をおさえてるでしょ。
p の親がない場合は pPrev = 0 にして、そのときの処理は場合わけにしたりとか。
なんだか二重ポインタ抜きだといろいろ面倒だなあ。 たぶんやらない、やりたくない。
>>259 できるだけいろいろみるようにしてますが、やっぱりそういうものでしょうね。堅いといわれてもしかたがない。
どうでもいい アホはアホでひとくくり
コードなんて、結局要件を満たして動きゃ良いので、 普通とか普通じゃないと、他人に理解されようがされまいが そんの事はかは関係ない。動いたもん勝ち。 ただし、これを仕事する場合は、大抵チームで作って幾ものだから 当然、担当が変わることもある。 その場合、他の人が読めない様なコードはくずだし、 そんなコードを書く奴もポンコツ扱いされる。
某Qとかな どうせコピペ検知システムでバレるのにモリタポなんか取ってひでえ 癖があるからすぐに分かってしまう
癖がわかるほどチェックしてんだ 本気で好きなんだな きもちわるい
お前がな。
お前がな? なにそれ ちょっと説明してもらえるかな?
ひらがな。 よみがな。
273 :
デフォルトの名無しさん :2012/07/26(木) 00:04:29.56
後者
素のCでリンクトリストか。なんか楽しそうだな。
275 :
デフォルトの名無しさん :2012/07/26(木) 01:30:53.63
プログラマーってどうせ恵まれた家庭の奴がなるんだろ? 俺んとことか金持ちじゃなかったからパソコンすらなかったし
君は自らも努力しなかっただけ
277 :
デフォルトの名無しさん :2012/07/26(木) 01:45:03.17
>>275 金持ちは医者とかだろ
世の中に何人プログラマーがいると思ってるんだ
今は開発環境がタダで手に入るけど
昔はアセンブラ買う金がなかったから
ノートにアセンブリ言語でコーディングして
CPUの命令セット見て手でコンパイルして
マシン語モニタで16進数で打ち込んだりしてたぞ
ドラクエの中村光一さんなんかも新聞配達でパソコン買ってたぞ
バイトすればパソコンくらい買えるだろ。てかなにで書き込んでるんだ
ちなみに秋元康さんは高校生のときに親の年収超えちゃって
親父が寂しそうな顔したとか
278 :
デフォルトの名無しさん :2012/07/26(木) 01:49:52.56
>>277 どうせ俺はプログラマーにはなれないんだよ。
どうしたらいい?
本気で就職困ってる。
大学院は行かない(1浪2留)情報学科
で就職ある?
アトピー持ちだよ。
就活が怖い。
279 :
デフォルトの名無しさん :2012/07/26(木) 01:51:35.76
+3だから2chで噂されてる新卒採用の年齢制限に引っかかるか心配 プログラマーなんてどうせ高専か大学ストレートで出た20前半の奴 がなるんだろ?おまけに実家は金持ちで小4くらいからWindowsいじ ってたような。 俺は何もかも恵まれていない。 助言をくれ。
ここは人生相談するスレじゃねーぞ
文系卒でプログラムのプの字も知らなかったヤツがコーダーになる世の中で何を言ってるんだろう
282 :
デフォルトの名無しさん :2012/07/26(木) 01:58:05.80
>>281 それってさ単に有能なだけだろ..........
283 :
デフォルトの名無しさん :2012/07/26(木) 02:00:50.99
誰でもプログラマーになれるなら院出て仕事無いって嘆く奴はいねーよ
284 :
デフォルトの名無しさん :2012/07/26(木) 02:03:29.53
何でも知ってるQZaw55cn4cって仕事何なの? もし彼が無職ならプログラマがいかに敷居の高い職業なのかわかるでしょ。
QZは破壊工作するからしゃーない
286 :
デフォルトの名無しさん :2012/07/26(木) 02:07:41.40
↑京大やんポテンシャル違いすぎ
円周率の近似値なんてどうやってC言語使ってやればいいわけ…
数学の問題だね double精度でやるのは、公式知ってればすぐにできるけど、 出来合いのクラス使わずに多倍長計算やるとまあまあ手応えあって面白いよ
291 :
デフォルトの名無しさん :2012/07/26(木) 03:02:05.49
ガウスルジャンドルとかで検索してみるとか
293 :
デフォルトの名無しさん :2012/07/26(木) 03:07:15.26
>>288 それレスみた?とりあえず英語読めないときついぞ
Java分かってればなお速いぞ
>>289 「C 円周率」でびんぐれ
「マチンの公式 C」でもいいぞ
>>288 中年ジジイは既に脳が硬化してるから無理だよ
>>293 うん。自分で extends Applet の外にクラス作っておいだしたはいいものの、そのクラスをも extends Applet にしないといけなかったんですね。
まだぴんとこないのですけれども。
>そのクラスをも extends Applet にしないと それがしたかったのなら正しいけど多分違うだろ
>>296 そうですか?extends ではうまくいってます。
this を cast してもだめだったし、いまいち c++ と違うような気がするなあ。
うまくいってるってのはコンパイルが通るって事だけ?
>>298 アプレットビュアーまでOKです。んーんー。
>>288 はインナークラスを外に出したって言ってるけど中にもまだ残ってるし
残ってるほうのForDimChangeで動いてるだけじゃないのかね
それとも他にも変更したのかね
つかスレ違いだからやめるわ 続きはあっちで
C++と違うって こんな事で躓いてるようじゃC++もできんだろ
>>294 そう思うのは勝手ですが、かくいうあなたもいずれ硬化脳中年になるのです。
年齢関係ない
なんか適当に巡回してたらこのスレ見つけて触発されたからはじめたい。 おすすめのコンパイラ教えてくれ。あと学ぶためのサイトまた書籍とかも。
vc++expressでggr
了解thx
>>306 knoppixをDLして、CD-Rに焼いて、なおかつUSBにもisoを入れろ
ソイツの文字コードはUTFだから気をつけろ
>>304 その議論は無意味ですよ
「今ここ」の話をしているのですから
>>306 初心者なら codepad.org でいいよ
VCとか自分のPCにはインストールしたくないよね
ちなみに「ここで学ぶといいよ」みたいなサイトある?
猫でもできるでいいんじゃね?
1から100までの間の奇数の和を求めるプログラムが難しいです だれか助けてください #include<stdio.h> main() { int i, sum; 「わからない箇所」; for(i=1; i<= 99;「わからない箇所」){ 「わからない箇所」; } printf("sum = %d\n", sum); } 大学の課題で必要なんですが、すいませんどなたか助けてください…。
sum=0 i+=2 sum+=i
sum = 2500 i += 100 sum += 0
うわ凄い助かります 非常に厚かましいのですが、この場合だとどうすれば良いのでしょうか キーボードから3桁の整数を入力したとき、それぞれの桁の和を求めるプログラムを作りなさい たとえば234と入力されたとき2+3+4を求める #include main() { int a, q, sum; printf("3桁の整数を入力してください\n"); scanf("%d",&a); q=「わからない箇所」;//100の位を求める sum = q; a =「わからない箇所」;//元の数aから100の位を除く数をあらためてaとする q =「わからない箇所」;//10の位を求める sum = sum + q; a = 「わからない箇所」;//10の位を除く sum = sum +「わからない箇所」; printf("和=%d\n",sum);
>>319 a/100
a-q
a/10
a-q
a
C言語難しいですね...。勉強します...。 すいません、最後です。できればお願いしますorz 年利率がr%の銀行にa円預金したとき、それがb円になるのに何年かかるかを求めるプログラムを作りなさい #include <stdio.h> main() { double r, a, b; int year = 0; printf("r,a,bを,この順番で,入力してください\n"); scanf("%lf %lf %lf", &r, &a, &b); while(「わからない箇所…たぶんmoneyだと思うのですが…){ year++; a「わからない箇所」; }printf("year=%d\n",year); }
a<b *=1*r/100
323 :
デフォルトの名無しさん :2012/07/26(木) 17:35:59.32
助けてください! C言語の課題です。 「自分のフルネームをアルファベット小文字で入力し、そのアスキーコードを、10進数で求めて平均、分散、標準偏差を表示」 を表すソースを教えてください。
324 :
デフォルトの名無しさん :2012/07/26(木) 17:38:25.18
いやです。
326 :
デフォルトの名無しさん :2012/07/26(木) 17:40:48.60
ごめんなさい。スレッド違いでしたね…
327 :
デフォルトの名無しさん :2012/07/26(木) 18:01:50.56
課題を人にやってもらったりしてるから 日本で人が育たないんだなあ
その代わりに課題をやってくれる人が育つので ある程度問題解決
だって大学までの勉強なんて入社で評価されないし 遊んだりとか他のリア充活動ばかりが評価されるからなあ そりゃ普通大学を真面目にやるのは損って思うでしょ レポートはコピーしてその分遊んだりなんかでリア充した方が職を得やすいんじゃ誰も勉強しないよ うちの同期のトモダチもそういうやつらはみんな大手決まってるけどコピー元のレポート書いてる俺や他の真面目くんはまだ中小にすら拒否されまくりだよ
日本人とは限らんしな
この業界はコミュ力ないクズはコード書けても不採用が常識だろ コードは三ヶ月で書けるようになるからな
Qとかな
コンピュータサイエンスの教科書における問題の1つは、再帰のくだらない例を 掲載していることである。よくあるのは、階乗の計算やフィボナッチ数列の計算だ。 再帰は強力なツールであり、それをこのような状況で使用するとはあきれてものが 言えない。仮に、私の部下が再帰を使って階乗を計算しようものなら、別のだれかを 雇うだろう。 『Code Complete第2版〈上〉』(Steve McConnell,日経BPソフトプレス,2005年,p486)
コピペマン参上!まで読んだ。
で そのイカした本にはcoooooooooooolなリカーシヴの実例が 載ってるんだろな
ネトウヨ王に、俺はなる!まで読んだ。
>>333 フィボナチ数列は、再帰でもいいんじゃない?
まあビネの公式を調べて使えということかもしれないが。
>>338 違う。
再帰はスタックを消費する。
フィボナッチ数列を再帰で書いたら俺でも怒るわ。
この人は、「普通にループで書けるのに無駄にスタック消費しやがって!もっと考えろ!」ということを言いたいだけ。
もっと言うと、「素晴らしいものが何にでも通用すると思うな!『銀の弾丸』は無い!都度考えろ!」ということ。
順列調べるのに再帰してごめんなさい
>>333 Thasts neta, right?
再帰考えたやつだれだ、出てこい
>>339 コピペ馬鹿の分際で偉そうなことを言うなって
>>343 ほう、じゃあ何か偉そうなことを言ってみろ。
>>340 再帰は素晴らしい機構だが、盲信すんなってことだ。
確かに順列は再帰は不要だな。普通にループすべし。
私には無理ですなぜなら私が言うとそれは「えらいこと」そのものになってしまい、 「えらそうなこと」にはららないからです。 非常に済みませんが、あたなのような程度の低い低脳が滲み出た ええらそうなことなることは、言えません。
順列調べるのにまず手作業で樹形図書いてるからそれに引きずられて再帰しちゃう
>>346 お疲れ様でした。田舎に帰って実家警備業にでも就いてください。
ついでに精神科にも通ってください。
itoa()を実装しようと思ったら、ついつい再帰で書いちゃうよね。 でも、ハノイの塔を再帰で書くのは却下w
末尾再帰なら許す
351 :
デフォルトの名無しさん :2012/07/26(木) 23:33:50.94
>>329 >>331 うわぁもうやめてくれ。
プログラマーって眼鏡かけたリア充の巣窟なんだろうな。
もう吐き気がとまらないわ。
俺は一生新聞配達か。
352 :
デフォルトの名無しさん :2012/07/26(木) 23:43:02.56
353 :
デフォルトの名無しさん :2012/07/26(木) 23:45:16.23
オタクにもなれない、リア充にもなれない
>>344 例にそんなに噛み付かないでくれよ
ほら、ジャーキーやるからさ(´・ω・`)
>>339 スタックを消費するのは仕方ない場合もあるが、
フィボナッチ数列で問題になるのは単純に再帰で実装すると
ループで書いた場合より計算量が増える事でしょ
じゃあどうする?という事で、メモ化や動的計画法の
話題に持っていくのが一つのアプローチ
これ単体では「くだらない」が、例としてはむしろ単純な事が重要
チクワくれチクワ
動的計画でフィボナッチどう書くの?
>>357 #include <stdio.h>
long fib(int n)
{
static long data[50]={1,1};
if(n>=46) return -1;
if(data[n]==0) data[n]=fib(n-1)+fib(n-2);
return data[n];
}
int main(void)
{
int i;
for(i=0;i<50;i++) printf("%ld\n", fib(i));
return 0;
}
じゃあメモ化は?
>>284 仮になんでも知っているとして、それでも知っていることと書けること、それも納期や雑用等のプレッシャーのもとで書けること、とは相関はないと考えています。
>>273 二重ポインタ自体の理解困難性というデメリットと、二重ポインタ使用によるループ記述の見通しのよさというメリットを比較して、前者に重きを置く理由を教えてください。
見通しの良さって明らかなメリットと言えるほどの差が無い
二重ポインタくらい理解できなくてどうすんのさ char *argv[]とか
むしろ悪いよね。 初心者はちゃんと理解もできないし。
>>358 それ、ただキャッシュしてるだけやん。
なんでそれが動的計画なの?
367 :
デフォルトの名無しさん :2012/07/27(金) 10:02:55.88
理解することとメリットがあることは別物
お前がそう思うんならそう(ry
>>361 無職なのに納期?おかしな事を言うなあ
やっぱり狂ってる
男が女性問題を議論してはいけないと申されるのか
標準Cで巨大ファイルを扱うにはどうすれば? 整数で扱える範囲を超えてシークできない
>>371 Win32のCreateFile()、SetFilePointer()、RealFile()、WriteFile()を使えば
64bitまでアクセス出来る
標準Cとか書いてるのにか。
64BIT以上はどうするんですか?
375 :
デフォルトの名無しさん :2012/07/27(金) 14:05:48.62
日 本 語 で お k
C言語初心者だけど 理解しにくい記述は避けるってのが他言語で覚えた掟 perlのワンライナーとかスゴイけど怖い 「これ修正して(´・ω・`)」 「無茶言わないで下さい(´・ω・`)」 ダブルポインターはそこまで鬼畜じゃないか?
>>376 ダブルポインターなんて言葉自体ポインターを理解できない輩の言い訳にしか過ぎない。
ポインターに鬼畜もへったくれも無いので、必要なら必要なだけ使えばいい。
そういうやつに使われると迷惑なだけなんだが。
配列の境界チェックを一時的に導入する書き方ってないかな? デバッグ時だけチェック入りのコードにしてリリース時は速度稼ぐために外したいんだけど
配列へのアクセスをマクロ経由にすればいい。
value = array[i]; ↓ value = GET(array, i); こんなのか
既にあるコードの見た目を変えないようなマクロを導入するのは無理?
お前、アホだろ。
とりあえず静的解析ツール使えばいんじゃねーのか?
そのレベルじゃ途方にくれる結果になるとは思うが。
assert
昔C#に移植してみたっけな 手間はかかるがかなり効果はあった
Cppcheckでやってみるか
391 :
デフォルトの名無しさん :2012/07/27(金) 16:51:43.60
coverity
静的解析ツールで境界チェックってできるの? 定数等からある程度はわかるだろうけど実行時にしかわからないものもあるよね。
とりあえずC++から入って後々Javaとか後付することにした VC++でいいと聞いてインスコしたんだけど、始めにロゴみたいなの出て一瞬で消えて起動さえしないんだけど。 どゆこと?教えてエロい人 ちなみにOSはWindows7
再インスコ
スペインに勝利! 世界は日本を見くびっていた=中国メディア
ロンドン五輪・男子サッカーが26日開幕し、日本は強豪スペインに1−0で勝利した。中国メディアも日本の勝利を大きく伝え、騰訊網は「世界は日本を見くびっていた」とする評論記事を掲載した。
記事は、日本についてヨーロッパは「現代サッカーを速やかに吸収する素晴らしい学習者、模倣者」と認識し、中国は「日本のサッカーを学ぶのではなく、日本が他人からどうやって学んできたかを学ぶべき」
と考えてきたと論じたうえで「これは間違いなく日本に対する過小評価だ」「ヨーロッパにしろ中国にしろ、日本サッカーは『学び続ける』ことだけで強くなってきたと考えることにすっかり慣れてしまった」とした。
一方、スペイン戦の勝利後、日本代表の関塚隆監督や選手たちが口々に「ボール支配の時間が少なすぎた」と不満をこぼしたことに触れ、
「彼らは『学習者』としてスペインに挑んだのではない。日本の態度は強い『競争者』意識の表れだ」と分析。「この意識は非常に尊いものだ」とし、「学習」ばかりを強調する中国サッカーの意識を暗に批判した。
そして、強い競争者意識を持った日本がスペイン戦で見せたパフォーマンスについて「もっとチャンスを生かせていれば、5−0でスペインに勝ってもおかしくなかった」と評価した。(編集担当:柳川俊之)
http://news.searchina.ne.jp/disp.cgi?y=2012&d=0727&f=national_0727_022.shtml
>>394 何度か再インスコしたんだけど無理だった。
>>396 起動すると「Visual C++ 2010 Express」て書かれて、その後その表示が消えて、そのまま何も起こらない。
VSスレ行け
>>380 C++ でoperator[]
ただし、ポインタが境界外っていうのはだめだね。
bcc32 -v -vG はどうだったっけ。
C++はスレ違い
インデックス値で境界外を指しても間違いとは限らねーし Cの文法でインデックス正誤がどうこうの要求自体が間違ってる
その程度、静的解析ツールはサポートしてるけどな。
405 :
デフォルトの名無しさん :2012/07/27(金) 20:19:38.86
>>404 アホはおまえ
インデックス値で境界外を指す間違っていない例を知らないだけだ
↑ 恥の上塗り
>>401 でも i が out of bounds で a[i] に読みにしろ書きにしろアクセスした時点でアウトでしょ?
だったら operator[] は有用だとおもうんですけど。
今更C言語なんかで改変に耐性のないクソコード書くヤツに 煩わされる様な事は無いだろうから 無知は放置の方向で
世の中には問題にならない例も有る事なんかデバッグしなくていい理由にならんわ 問題が有るからデバッグするんだろ
>>408 あと、文字列末尾の\0の分は足さなくてもいいのか?
いつの話題だよ 池沼か? 事件性があるのはお前の話題の遅さだろks
sizeof "hoge" は5だろ
>>416 なるほど、thx。
でも普段これをやるときは strlen() を使わざるを得ないな。だって不定長のデータを扱うためなんだろう?この手の構造体を使う場合というのは。
418 :
デフォルトの名無しさん :2012/07/27(金) 22:10:36.45
sizeof "hoge"[100] == 1 が保証されるのを知らないアホは逃げたか?
うん
421 :
あきら :2012/07/27(金) 22:54:01.24
勉強期間がまだ3カ月程度でまだよくわかっていないので 説明お願いしたいです。 本当に困っているので すみませんがよろしくお願いします! int i=0,n=1000; while(n>0){ n=n-7; i++; } printf("i=%d,n=%d",i,n); 答えがi=143,n=-1になることを説明お願いします。 iは1000/143であってますか?
キモヲタコピペマン参上!まで読んだ。
>>412 のリンク先に
>char namestr[MAXSIZE];
>ここでMAXSIZEは配列namestrに保存されうるどんな名前よりも大きい。
>しかしながらこの技法も、規格の厳密な解釈によると許されないようだ。
ってあるけどなんで?
>>424 http://c-faq.com/struct/structhack.html に補完されているのをみると、この場合も構造体の malloc() では、
struct name *ret = malloc(sizeof(struct name)-MAXSIZE+strlen(newname)+1);
ととり、同じく臨機応変に構造体のサイズが変化するがごとくに使うやりかたを指しているようだ。
これら二つのやりかたに関する議論の内容は残念ながらしらない。
struct name { int namelen; char namestr[1]; }; これ初めて見たんだけどどう使うの? はみ出すんじゃないの?
typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO; mallocとかで必要なだけ領域を確保してアクセスするんだよ
ああ、そういう事ね サンクス
>>421 何に困ってるのかよく解らんから、説明っつーても「書いてある通りだよ」としか。
ある関数の中で別の関数の処理を書く事って出来ないんですか? int main(){ void remain(){ i=2; } } こんなの〜
newしてvector型配列に追加したデータは vectorの.clear()関数を使用した際にdeleteされますか?
436 :
433 :2012/07/29(日) 00:46:49.28
>>435 こんぱいら〜によっては出来ないんでしょうか?
わたしはVisual C++ 2010使ってますが関数の名前の箇所でコロン付けなさいと言われちゃう…
ルーチン呼び出しって思われてるのかな出来ませんでした><;
そのサイトで使われているのはgccでしょうかね
>>436 調べてみたら関数のネストはGCCの拡張だそうです。
VC++ではできないみたいですね。
関数内で関数定義なんて見にくいだけでいいことないだろ
>>438 いや。使いたいことはある。特定のルーチンを使いまわししたいときは特に。
最近では AVL木。木の回転のまえのルーチンはメインの関数内に入れたいなと。
中括弧閉じのマクロにしちまえばいいじゃん。
>>439 C++でクラス階層を重ねる手法に時代は移ってる
Cは全ての関数が同じレベルにあるので管理が難しい
442 :
433 :2012/07/29(日) 07:53:37.18
なるほど〜
ではグニューCを使うべきなのでしょうか?VC++は学び始めた最初から使っていてある程度慣れてきた感もあるのですが…
関数の中に書く事でコードにある程度まとまった感が欲しかったのでやってみただけです
あと初心の段階でこういった依存性を体感できたのはちょっと嬉しかったり
よい経験に。
>>440 初心者なので分かりませんでしたw>ちゅうかっことじのまくろ
別に関数かしなくても医院で内科医? int main() { /* 適当に処理 */ /* remain */ { i = 2; } /* 適当に処理 */ return 0; }
別の関数を呼び出さずに、1つの関数内だけでサブルーチンと同じ流れ 制御構造(コール、リターン)を実現する記述方法って、なにかありますか?
setjmp
>>442 C++ であれば関数内でクラス定義できるのを利用してこんな風に書けなくもない。
スレ違いだけど。
int i;
int main() {
struct d {
static void remain(){
i=2;
}
};
d::remain();
return 0;
}
449 :
433 :2012/07/29(日) 11:15:29.69
>>443 すいません。実は処理がi = 2だけじゃなく結構長いソースなので同化させちゃうと何度も呼び出さないといけなくなっちゃいます…
/* remain */ {
i = 2;
}
だけだとラベルがないので多数から参照できないお…、と言おうと思ったら
>>444 さんの会話の中で出ているジャンプ命令がありますねw
ですがすぱげってぃ〜状態になりませんか?ジャンプだらけだと…
やはりここは素直にmainルーチンのソトに置くのが妥当のようですね…。個人的に残念ではありますが
>>442 処理系の独自拡張を使うのは可能な範囲では避けた方がいいというのが一般的な意見じゃないかと思う。
特に関数内での関数定義はマクロで切り分けたりもしづらいタイプの機能なので移植性を損いがち。
更に言うならめったに使わない機能なので、変なバグが残っていたり将来的にサポートが打ち切られる可能性も少なくない。
といった欠点は指摘できるけど、利点と欠点を比べてどう判断するかは個別の状況によるトレードオフの問題。
451 :
433 :2012/07/29(日) 11:29:41.03
>>448 はちみつ餃子さんありがとうございます。
C++で書いてもいいのですがとりあえずは
>>449 に書いた暫定対策で行きますw
クラス定義とかは初耳です。
C++は参考書買ってないので(X_x)...
勉強します…orz
452 :
デフォルトの名無しさん :2012/07/29(日) 12:17:56.38
アルゴリズムはもう発見しつくされてるから プログラミング業界って技術者がいらないの?
> プログラミング業界って技術者がいらないの? こういう質問に答えてくれるプログラムが開発されたらいらなくなると思うよ。
>>452 こういうやつがいるから技術者が必要なんだよ
技術者必要なんだけど、要らないやってずうっとやって来て、プログラムの作れない国になっちゃった。
技術はほとんどが隠されて共有されないからね 世界各地で同じようなものを再発明しないといけないんだよ だから技術者はいくらいても足りない
C++のSTLは車輪の再発明をかなり抑えたという功績は大きい スレチだけど Cで書いてると毎度同じような事を何回も書いてすごい時間を無駄にしているような 気がする ライブラリ化して一般化すればいいんだけどMATLABのような物を一人で作る事は まず無理
技術がない人たちのレスが続いています あと少しのご辛抱です
mallocってたとえば1000バイト確保しておいて10バイト分の入力のときにのこりの990バイトはその入力が終わった時点で開放されるんですか?
あ、残りの990バイトが不要ってのならrealloc()でもいい
レスありがとうございます。 やっぱりfree()しない限りは開放されないんですよね。 じゃああんまり動的メモリ確保の意義ってないんじゃないのかななんて思ったりするのですが・・・ と思ったらrealloc()なんてあるんですね。 ちょっといろいろ試してみます。
465 :
デフォルトの名無しさん :2012/07/29(日) 15:35:13.40
>>457 Cでそういう有名なライブラリってglibc以外になんかある?
JavaとかC#やってから戻ってきたら文字列処理が
改めてめんどくさいと感じた
ないよ
>>464 >動的メモリ確保の意義ってないんじゃないのか
いやいや、これが非常に便利なんですよ。おいおい理解が深まると重宝しますよ。楽しみにしてください。
ゾロのことじゃね?
>>469 あれC++のtemplate知らんの?
例えばint与えるとint用の比較演算子、代入演算子、コピーコンストラクタを生成
double与えると以下同文
class与えると以下同文
std::sort()とかstd:copy()使うとqsort()とかmemcpy()より速い事があるっしょ?
頑張ってるけどCでやる意義が不明。なにかいいことある? > vector > インデックスによる要素のランダムアクセスが可能。 そんなバカなと思いつつ、ワクワクしてみて、やっぱりな。
Cはそういう楽さを犠牲にしてパフォーマンスだしたいときに使うんやろ
>>467 多分生成的マクロだろう。 ## で識別子同士をひっつけるとか、いろいろ。
ネトウヨ王に、俺はなる!まで読んだ。
>>464 >じゃああんまり動的メモリ確保の意義ってないんじゃないのかななんて思ったりするのですが・・・
動的メモリ確保の意義は、そのメモリが確保されている期間が、静的変数、auto変数と異なっている
ところにある。
静的変数:プログラム開始から終了まで(ユーザプログラム的には最初から最後まで)
auto変数:ブロックに入ってから出るまで
動的変数:mallocされてからfreeされるまで
主にauto変数と違ってfreeするまでずっと残っている点が利点
→逆にメモリリークが怖いわけだが、、、。
ここって入門だというのに見てたら随分と初心者に優しくないのね やっぱ専門板だとこうなっちゃうのかな なにかトラウマみたいなことでもあったの?
481 :
デフォルトの名無しさん :2012/07/30(月) 10:41:50.30
C言語のソースコード検索したら標準関数じゃない関数がいっぱいあるけど あれは何なの?
>>481 ヘルパ関数(下請け関数)だろ
そんなの実装によっていくらでも入ってる
C++だとprivateにされちゃって呼び出せないだろうけど
#define private public
C#じゃなくてCを使う理由を挙げてください
C++ならともかく、それはC#を知らないからじゃね?
C#のライブラリもCで実装された処理を呼び出している C#プログラマなんてのは表面でCのプログラムを呼び出してるだけのカスでしかない
javaで採用されている機能だけでC++を使いCのライブラリを使う。
Cがわからんから聞いてんだろ
Cのライブラリもアセンブラで実装された処理を呼び出している Cプログラマなんてのは表面でアセンブラのプログラムを呼び出してるだけのカスでしかない
アセンブラのライブラリも機械語で実装された処理を呼び出している 機械語プログラマなんてのは表面で電子回路のプログラムを呼び出してるだけの半田ごてでしかない
一生やってろ
>>480 ・それ入門レベルか?
・そんなもん、その人次第だろ…
・C言語の質問じゃねーし…
・まず日本語初心者や人間初心者を卒業してくれ
・流石にパソコン初心者やネット初心者はな…
・2chやプログラム板は初めてか?力抜けよ
ってな質問には相応の返答しかつかんが、その辺は加味してログ読んでる?
まあ、実際荒れてることもあるけど(夏休みだし余計にな)それはそれだからな
>>483 C#・・・Windows専用に特殊にカスタマイズされたJavaのような言語
Windows専用だけあって(Monoのようなプロジェクトもあるがそれは別)
Windowsと非常に相性が良く、文法面では既にJavaをしのぎ、大抵の
GUIアプリケーションを多分現存する言語の中では最速で組み上げる
JITコンパイラ内蔵なので動作が意外に軽い
Java・・・マルチプラットフォームを売りにしているが、Windows上で動かす
には分が悪い
JITコンパイラを後付けしたせいかクライアントJREではホットスポットJITが
仇になって動きが重い
C#よりはるかにもっさり感じる
サーバーJREは起動が遅いが速度は速い
今や文法面でC#を追い掛ける奇妙な立場
C・・・最小限の機能しか揃ってないのでプログラミングは大変だが、高速な
ネイティブを吐き、しかもコンパクトなので組み込みに最適
という事で使用目的が違います
もちろん大規模GUIプログラムもCで書かれています
プログラマは地獄を見ますが
493 :
デフォルトの名無しさん :2012/07/30(月) 12:57:21.42
なんだ大規模GUIプログラムて。 今時そんなのあんのか?
>>492 ざっくりわかりました,ありがとう.
ちなみにCの組み込みに最適と言うのは
アセンブリ動的にロードする(プラグ印を組み込ます)ような事にあたるのでしょうかね
違います。
今ネイティブでGUIならQtだろ でもC++だからな
497 :
デフォルトの名無しさん :2012/07/30(月) 13:40:12.24
>>482 違う
winmain関数とか
見たことなかった。
_tWinMain()
500 :
デフォルトの名無しさん :2012/07/30(月) 13:55:09.31
WinMain()でググレカス
MSのコンパイラなら CRT0.C 見れば
すいません、VBをちょっとしかかじったことないんですが C言語のA<<3とかの<<って どういう意味なんですか?
その程度、入門書読んでから質問しろ
本持ってないんですよー ググっても<<は無視されて検索されるし ほんとおねがいします
C言語 入門 Goooogle
そんなつれないこと言わずに じゃあ芸能界で例えてください
シフト演算子 これで検索できるだろ。
>>508 理解できますた!
C言語簡単っすね^^
簡単でしょ 馬鹿にでも理解出来る言語、それがC言語
Cは3日で把握出来る 向いてないド素人でも一月 それ以上かかるなら他の道を探すといい
ポインタ関連を3日で習得できるなんて凄いわ。 ポインタ関連以外を3日で把握なら分かるけど。
C言語は言語仕様がコンパクトで、演算子が多くて予約語が少ないため 文法を習得するのは確かに簡単 でもポインタに踏み込んだらなまじ他の言語よりも暗い迷路に迷い込むよな
こわがりすぎー
標準ライブラリが小さいから習得は早いね
アセンブリの代わりだもん、 ポインタ関連が一番重要だ 8bitCPUでもいじくって そのあとにCやれ
個人で組み込み勉強したい場合ってどうしてますか? 製品基盤や専用のコンパイラなんて売ってるんでしょうか?
もちろん売ってる。
シャープのMZ-80Kでも買ってシコシコ叩けと言うのかw それてもZ80を秋月電子で買ってハンダでジュウジュウと弄れと言うのか
ロートルは来なくていいから
いやはや全くその通りで、 まずはZ80のキットを購入してはんだごてを手に持ちながら ハンドアセンブルくらいはした方がいい そのほうがCPUとは何かを手に取るように実感できる
ジジイはもう(゚听)イラネ
525 :
デフォルトの名無しさん :2012/07/30(月) 18:21:36.99
0番地から始まる配列の添え字と何が違うって言いたいんだ?
いまどきZ80なんてやったって意味ねえよ
PIC.、制御関連やるなら知って損はないじゃろ。
528 :
デフォルトの名無しさん :2012/07/30(月) 19:07:37.85
PICやったことあるけど恐ろしくつまらなかった。 ままごとにも程がある。 マイコンって何なの?何のためにあるの? ハードウェアを学ぶ前置き学習用? パソコンじゃだめなん?
あんたの身の回りにある電源や電池のいるものはたいていマイコン入ってるけど
530 :
デフォルトの名無しさん :2012/07/30(月) 19:12:01.67
>>526 いまどきって何だよ
俺は趣味プログラマーなんだよ
世の中はこうなってるとかしらねーんだよ
531 :
デフォルトの名無しさん :2012/07/30(月) 19:13:06.37
>>529 あ?パソコンの中身見たけど
あんなおもちゃみたいなブロック入って無かったよ?
もっと壮大なスケールの部品ばっかりだったしな!
家電の組み込みとかのメーカー行きたいとか 自動車やら電車やら電気メーカー行くなら知ってて損ないんじゃないの。 秋葉原が設計と家電の聖地だった時代もあるのよ。
Z80は知らなくていいだろ 時間の無駄
時間の無駄って言ったら趣味のプログラムも・・・w
H8やSH2などよりはZ80のほうがマシかもな。
536 :
デフォルトの名無しさん :2012/07/30(月) 19:30:18.59
つかCPUのことか? パソコソの蓋開けていじらねーだろどうせ スレ違いなんだよ 電子機器スレ池
組み込みやるなら情報工学科なんか進学せずに電子科電気科機械科に進んでメーカーに入れ 製品の仕様はハード屋が決めるし組み込みプログラマなんざハード屋の奴隷にすぎない ソフト屋がどんだけ頑張ってもテレビの画質は向上しない 組み込みプログラマなんてのは表面でハードの機能を呼び出してるだけのカスでしかない 奴隷になりたくなかったらソフト屋が主導権を握れる分野に行くかソフトもできるハード屋を目指せ
四年前に言って欲しかったよ
Z80はともかく、ビルドターゲットのアセンブラは知ってる方がいいね Cで書いてると、期待どおりに生成されてるか(あるいはされてなくはないか) 逆アセンブルして確認することはよくあるから
541 :
デフォルトの名無しさん :2012/07/30(月) 19:58:20.33
>>537 もっと言えば新製品開発とかなら理学部のほうがよくね?
理論を勉強するわけだから。
俺は工学部だから将来は高卒と仲良く工場勤務なんだろうな。
Z80=パチンコ
C使いはそっち系ってのがよく分かる流れだなw
544 :
デフォルトの名無しさん :2012/07/30(月) 20:10:04.63
プログラマーの倍率って8倍くらいあるんだろ? 高嶺の花だわ
90hはNOP
ぼくちゃん物理系出身の土方です^^
547 :
デフォルトの名無しさん :2012/07/30(月) 20:11:09.57
スーパーAKI−80 ¥4,980
549 :
デフォルトの名無しさん :2012/07/30(月) 20:16:23.97
市販のコンピュータに入っているマイコンはやっぱ電気製品屋では 買えない特注のもんなん?
Z80やるくらいならARMやれ モバイルのアプリくらいなら組ませてもらえるかもね
ポインタとアセンブリの基礎を覚えるには Z80でもいんじゃないの。
基礎を終えたら買いなおして覚えなおせって?馬鹿じゃねえの
Z80は現代使われている機械語とコードが違いすぎる CASLが実用で役立つとか言ってるレヴェル
結局のところどれがいいんですか?
Cで遊ぶ分にはどれでもいんじゃないの
ARMってDSとかに使われてるんだな
クズw
国産薦めたいところだが、ルネサス筆頭に今まで定番だったCPUが全部廃版になってるので使えないんだよな 新CPUもガッカリだし
半田このやろう!
ルネサスも親会社も経営やばいし マジどうなるかわからん
お勧めCPUはV30だ
そもそも組み込みってなによ?
お前の目の前にある箱でも使ってみたらどうだ。
目の前にある箱は組み込みではないが。
567 :
デフォルトの名無しさん :2012/07/30(月) 21:32:07.10
グ グ レ カ ス。
組み込みってようはアレだよな
アレアレ詐欺かよ。 アレって何だよ。
ARMだろうがSHだろうが、C言語の部分は同じ ハード屋が新製品にRX採用したけど、本当に供給大丈夫なのかね
やっぱりコレはアレですね
572 :
デフォルトの名無しさん :2012/07/30(月) 22:12:42.38
>>537 > ソフト屋がどんだけ頑張ってもテレビの画質は向上しない
そこでおまえの人生なんか語られてもねえ・・・
自らは何もしなかったことがそんなに誇らしいのか? 国賊め
いやLSIの性能で決まるから
インテル入ってる! く・・組み込まれた。
反原発でうるさいから日本の家電業界はもう終わりだよ。 ウォン安すぎて海外じゃサムスン無双、人件費の安さで中華企業がががが。 日本の技術者も中国語、インド語が必要な時代になるよ。
テレビの画質はソフトで決まる 特にワンセグは補間の仕方でずいぶん変わる
その補間だって、本来はハードでやる部分なんじゃないの? ハードでも出来るところはハードにやらせた方がいい 結果全部ASICやらFPGAに置き換えられるならそれが一番
578 :
デフォルトの名無しさん :2012/07/30(月) 23:00:55.37
>>573 最新型のコクピットに座りながら
よだれこいて寝てた詐欺野郎がおまえの真の姿だ
おまえ存在そのものが製造業全員の敵なんだよ
ワンセグのソフトによる画質の違いなんか誰もわかんねーレベルだろ
ハードのプログラムもソフト屋が作らなきゃいかんだろ
VHDLとかVerilogとかか?普通は情報科のやつはやらね
がっこうで ならってないので できません 言えたらいいな。
583 :
デフォルトの名無しさん :2012/07/30(月) 23:17:46.87
普通が目も当てられなくて仕方なく修士シフトは昔っから始まってる 「自立した研究者とはなんぞ」やと教える博士課程の質に一縷の望みを預けているのが業界 工学部に在籍しながら耳を疑う発言を繰り返すC大T田教授が博士課程の規範という現実から目を背けたい
N大U田教授「どんと来い!」
ルネサス、富士通までがARMのIPライセンスを取得してるしな ぶっちゃけ外注に出しやすいんでしょ x86よりもマルチタスク向けの命令が強化されてるし
ldm/stmはいいね
なんだ. Cイラネ
電器屋はベストを尽くして就職 ベスト電器
好評につき買収だろ
日本技術科学大学の上田次郎教授
技術科学大学てのは本当にあるからな、 2つも 科学技術大学 だよ 今度からは間違えんなよ ついでに科学技術大学もやっぱり大量にあるからな、 間違えんなよ ともすれば実物の大学をさしちまうぞ
>>581 今はCでもハード記述出来るらしいが
ファームのC→アセンブラ(マシン語)みたいにC→HDLを生成する
間違ったところで何の害もない
>>596 高位合成で使われるのはCのサブセットだよ
オリジナルのCから、ハードウェアへの変換が
困難な仕様を削除されたものが多い
599 :
デフォルトの名無しさん :2012/07/31(火) 22:22:11.19
このスレ質問に答えてくれる率が極端に減ったな 誰も質問しなくなったwww
俺がちょくちょく答えてるだろ 見逃してる質問があったら教えてくれ
602 :
デフォルトの名無しさん :2012/07/31(火) 22:37:30.55
>>596 RTLな
language じゃなく level が変わらなきゃ意味ない
603 :
デフォルトの名無しさん :2012/07/31(火) 23:04:22.77
ある文字が値として入っているメモリを検出するプログラムってどうやりますか? 例えば前のプログラムでchar str="Orange"; みたいなプログラムを作って、実行終わって どこかのメモリにOrangeという値が入ってますよね。 その番地を探すプログラムを教えて下さい。
> どこかのメモリにOrangeという値が入ってますよね。 ダウトくせーな OSがサッサと掃除してんじゃね?
>>603 char str="Orange";
は
char *str="Orange";
の間違いだとして、
printf("%p\n", str);
でアドレスが分かる。
但しデバッグコードが入ったせいで、アドレスが変わるかもしれん。
後は、コンパイルオプションでマップファイルを出力させたり、nmみたいな
コマンドを使うとかかな。
仮引数だったら・・
>>603 パスワードロガーでも作る気ですか? いけませんねぇ。
/dev/mem でダメなら諦める
「前のプログラムが使っていたメモリ内容」が読めるなんてのは セキュリティホールだっつーの。
>>603 今どきではそうとう運が良くないと見れない。
プログラム起動時にメモリ配置が毎回ランダムになるよう
設定されているのがほとんどなので、スタックやヒープを
覗ける可能性がぐんと低くなった。
あとmalloc系は仕様はともかく実装上ゼロクリア扱いしてるはず。
0じゃねーし
んじゃナニよ
フフフノフフフならVCでよく見る
それはデバッグビルドだろ。
うん
BSD UNIXは互換性のため、スタックをゼロ初期化してたはず
スライダーとプログレンスバーの動きを連動するプログラムの書き方をおしえてください
プログレンスバー
プログレスバーだったはずかし
で、そのスライダーだとかプログレスバーだとかは一体全体どこの代物で?
622 :
デフォルトの名無しさん :2012/08/02(木) 19:26:34.12
フフフ
ミマ礫ァ
ふむふむ
625 :
デフォルトの名無しさん :2012/08/02(木) 21:24:38.20
printf("%f\n", 10 || 0); って10のはずですが何故か0になります。何故でしょうか? 積ではなく和のはずです。 a=3.0として printf("%f\n",++a);が4になります。何故でしょう? ++aはaをインクリメントするから++a自体は3でaが4だと思うのですが。
626 :
デフォルトの名無しさん :2012/08/02(木) 21:25:12.29
printf("%f\n", 10 || 0); って10のはずですが何故か0になります。何故でしょうか? 積ではなく和のはずです。 a=3.0として printf("%f\n",++a);が4になります。何故でしょう? ++aはaをインクリメントするから++a自体は3でaが4だと思うのですが。
627 :
デフォルトの名無しさん :2012/08/02(木) 21:27:00.85
int a=3; printf("%d %d \n",++a,a); 結果 4 3 何故だ....... ++aしたのに何故aが3?
628 :
627 :2012/08/02(木) 21:28:28.35
わけてかくと int a=3; a++; printf("%d \n",a); このときは結果4になる.... 震えがとまらない。怖すぎる。何故だ。
629 :
627 :2012/08/02(木) 21:29:53.49
int a=3; printf("%d %d \n",a++,a); 3 3 えええwwwwwwwwww まじで分からないので解説を。
目星は付いてるけど規格票確認するのが面倒 誰かに任せた
だれだよこんなアホ連れてきたのは fuck(a,++a,++a)
関数引数の評価順は環境依存 foo(a++@,a++A,a++B); @→A→B とか B→A→@ とか順番は定まっていない のでそんなことスンナ
633 :
627 :2012/08/02(木) 21:35:00.31
>>630 a++と++aの違いはどうでもいいです。
一番怖いのが
↓
int a=3;
printf("%d %d \n",++a,a);
結果 4 3
分けて書くと
結果 aは4になってる
意味が分からない。
634 :
627 :2012/08/02(木) 21:36:05.44
>>632 なるほど
ってことは
a=3
++a;
printf("%d\n",a);
でも環境によっては3ってこともあるのでしょうか?
>>633 今晩は馬鹿、エアコンのスイッチいれた?
ぷぅ〜
637 :
627 :2012/08/02(木) 21:38:56.52
>>634 それは無い
a=3 の次に ++a が行われて printf の引数に a を渡す
>>625 >printf("%f\n", 10 || 0);
>って10のはずですが何故か0になります。何故でしょうか?
http://codepad.org/mDg8Dx8P 参考:
http://codepad.org/vj989ZaR 10 にも 0 にもならないようだ。処理系はなんですか?
1) || は論理和、int で 1 を返す。
2) printf() は、第一引数と第二引数以下が完全にマッチしないと想定した結果を返さない。
ただし例外として float -> double の格上げ、あるいは int への格上げがある。
ちょっと複雑だが、こう考えるとよい。コンパイラは printf() を翻訳するとき、第一引数 "%f\n" のことなどさっぱり忘れて第二引数以下を翻訳する。
第一引数が %f だろうが %d だろうが無頓着、無視、無関心に、第二引数 10 || 0 を単独で存在するかのように翻訳する。
640 :
627 :2012/08/02(木) 21:40:12.02
>>638 ありがとうございました。
ところでprintf("%f",10 || 0);が0になるのは何故でしょうか?
ぽぽぽぽーーーーーーーーーーーーーーーーん ぽっぽぽぽぽぽ ぽぽぽっぽ ぽんぽぽぽぽぽ ぽんぽぽぽ ぽぽっぽぽぽっぽ ぽんぽぽぽ ぽぽんぽぽぽんぽぽぽぽぽぽ
642 :
627 :2012/08/02(木) 21:46:35.79
>>629 処理系はWindowsXPです。
後
printf("%f\n", 10%3-1.0 <4.0 ? 1 : 0);
の値も0になります。何故でしょうか?
10%3は1ですから 1-1.0<4.0で正しい。
正しいときは?の左側を表示する関数なので
1と表示されるはずなのに0です。
何故ですか?
%f で浮動小数点数として表示させようとしてるのに、整数値を渡してるから %d にしろ
夏休みだね
647 :
627 :2012/08/02(木) 21:54:33.31
>>643 0ではなく0.00000ですね。
コンパイラはvisual studioです。
PCのメーカーは東芝で機種はdynabookです。
VC++でビルド開始、ビルド失敗 ↓ 前回成功時のファイルを実行
エスパーが必要だな
printf("%f", 1); >0.000000
整数の1は (リトルエンディアンで) 以下のような並びになる。 00000001 00000000 00000000 00000000 これを浮動小数点と解釈して符号部、指数部、仮数部に区切りなおすと 0 00000010 00000000000000000000000 となる。 これは約 2.35e-38 というめっちゃ小さい値なので、 %f の書式で表すと 0.000000 となってまう、 ということなんじゃないかと思う。
printf("%f\n", 1); printf("%f\n", 1.0F); printf("%f\n", 1.0); printf("%f\n", (int)1.0); 0.000000 1.000000 1.000000 1.000000
意外と知られてないのが j = 1, k = 3で i = ++j, k; とした時の i の値 実行せずに何になるか当ててみよう
3
2
括弧でくくれバカ
(i = ++j), (k);
それ以前にこんな書き方をする意味がない。
知ってる奴が知らない奴を見つけてニヤニヤする意味がある
ほんと仕様が煮詰められてない糞言語だな
仕様が厳格に決まってないからこそ他言語との親和性が維持できることもあるんだよ。
ないない
667 :
デフォルトの名無しさん :2012/08/02(木) 23:36:19.28
>>656 を厳格に 2 と答えられないどあほとの親和性は維持できなくていい
ちなみに問題文に誤りがあってセミコロンが足りないが、そういう問題じゃない
高度な柔軟性を維持しつつ 臨機応変に対応 ですね すばらしい文言です あなたを師と仰ぎ どこまでも付いてゆきましょう
含 風呂・トイレ
671 :
デフォルトの名無しさん :2012/08/02(木) 23:55:03.45
>>668 おまえさ、そんなの貼って誰かありがたがるとでも思っているわけ?
仮にいたとして、おまえと同類だけだぞ
>>669 銀英伝は二次創作をいくつかちょろっと読んだだけだが、
それは印象的な場面としてよく使われてるみたいだねぇ。
673 :
デフォルトの名無しさん :2012/08/03(金) 00:01:03.25
難しい漢字がボヤけてるのは何故? 見たこと無い漢字とか明らかに輪郭がくっきりしてないんですが。 何十年も昔のPCからそうだったんですか?
>>668 ずいぶんと参考になりました。私はビット表現まで追いかけてなかったがばれてしまった‥‥‥。それはそれで一層いや一生の恥ですorz
それはそうと、それ、厳密な典拠は特定できていなくてちょっと困っています。
ISO/IEC 9899:1999 6.5.2.2.6
If the expression that denotes the called function has a type that does not include a
prototype, the integer promotions are performed on each argument, and arguments that
have type float are promoted to double. These are called the default argument
promotions.
で、これはプロトタイプでは ... で表現されているために「プロトタイプに含まれない式」になってしまった場合、その引数は float->double になってしまうようです。
問題は
If the function is defined with a type that includes a prototype, and
either the prototype ends with an ellipsis (, ...) or (略), the behavior is undefined.
がなんのことやらさっぱり。
調子に乗って符号なし整数をなくしたJavaなんて言語もあったな
アンチ
インチ
678 :
デフォルトの名無しさん :2012/08/03(金) 00:25:33.78
ウソッキー
printfで2進数表示お願いします。
>>674 前者は省略記号 (...) とは関係ないんじゃないかな。
「プロトタイプを含まない型を持つ関数」というのは例えば
hoge();
というようなプロトタイプ宣言されている関数ということで、
これに対して
hoge(14, 1.24f);
というような呼び出しをした場合にはこの 1.24f は double に拡張されるということ。
後者については前者のようなプロトタイプ宣言があった上で
hoge(int a, double b) { /* 省略 */ }
というような定義であれば大丈夫なんだけど、
hoge(int a, ...) { /* 省略 */ }
という定義だとか
hoge(int a, float b) { /* 省略 */ }
とかだったら未定義になるということを言いたいんだと思う。
つまり前段はプロトタイプ宣言のことで後者は定義ってことで。
>>674 つまりはその項目は今回の printf の件とは無関係。
float は float として渡されるのであり、
受取った方がその型を知る方法は書式指定によると理解していいと思う。
floatはdoubleとして渡るんじゃないかな〜
>>681 規格の後段について、よく理解できました。ありがとうございます。
規格の前段の記述が hoge() のみの事情なのか printf() にも適用されるのかは、意見が相違するようですね。
>>683 ふむ。
しかしいまとなっては参考にするには古いK&R2=C89・付録A7.3.2 には次のとおりで(以下<>内はQZ)
省略形<=", ...">の場合、引数<実引数>の数はパラメータ<=関数定義やプロタイプ宣言での引数型宣言>の数と等しいかあるいはそれより多くなっている必要がある。
型が明示されているパラメータの後に続く引数は、前のパラグラフ<=K&R1の関数定義について>で述べた省略時の引数格上げの受ける。
とありC89 の場合であれば printf() のような可変長引数の、可変長部分、すなわちプロトタイプのない実引数は格上げを受ける、と読み取れます。
なお、K&R1 ではどんな float も double に変換されてしまうという(int main(); int c; char **v; だったし)事情が、
K&R2=C89 では可変長部分やプロトタイプの部分に限定されるようになったとは理解しています。
ともあれ、これに対応する C99 の記述はどこなのか、それとも C99 は自動格上げを行う範囲をさらにさらに限定したのかいまいち判然としないところです。
>受取った方がその型を知る方法は書式指定によると理解していいと思う。
これはK&R1の呪縛に囚われた身には辛い。
>>639 と解釈してきた以上、printf() 第一引数の書式指定が printf() の第二引数以降の型を規定するとは考えにくいのです。
686 :
685 :2012/08/03(金) 06:53:41.04
訂正しておきます。 ×K&R2=C89 では可変長部分やプロトタイプの部分に限定される ○K&R2=C89 では可変長部分やプロトタイプの明示されない部分に限定される
gccなんかじゃ%fにintなら警告出してくれるけどな。
printfが%fでscanfが%lfの理由
何故このスレではscanfが人気なのか。
入門だからでしょ
scanfぐらい使いこなせるようになった方がいい
↑アホ
入門者なんだからしょうがない 入門者なんだから 入門者だと思って太めに見てやれよ たかが入門者だぞ 入門者に目くじら立ててどうする 入門者は入門者だと割り切って接するのが一番の方法だよ
入門者の入門者による入門者のためのスレ
>694 入門者が返答してるの?
少なくとも scanf使いこなせ と言ってるお方は そういう部類のレヴェルだろ 察しろよ
scanfくらい使いこなせなくてどうするよ エラー処理が不要なら簡潔に書けるし
scanf()はどうでもいいけど、sscanf()を一通り使えるようになっておくと捗るぞ。 それはさて、引き数リストを明示していない関数宣言のことは、プロトタイプ宣言とは呼ばないんじゃないのか?
呼ぶんじゃないの?
可変長引数である事を明示してるでしょ
無宣言でいきなり利用 printf("%f", 1.0F); 戻り値だけ宣言 int printf(); .... printf("%f", 1.0F); 引数も宣言してるけど、可変長引数でした int printf(const char *, ...); .... printf("%f", 1.0F);
>>699 それもそうだな。 たぶん呼ばない。
>>701 いや、引数リストが無いのは可変長引数であることを意味しない。
プロトタイプなしとか、引数なしプロトタイプとか いい加減C++っぽく統一してほしい
>>703 ん、「明示してない」ってのは「無い」っていう意味で言ってたの?
>>685 俺が根拠にしてるのは JIS なんだが、そこでの記述はこうなってる。
> 呼び出される関数を表す式が、関数原型を含まない型をもつ場合、
> 各実引数に対して整数拡張を行い、型 float をもつ実引数は型 double に拡張する。
日本語でもかなりわかりにく表現だな。
... で終わる宣言がプロトタイプを含まない宣言なのであるとすれば、
void hoge(float a, ...);
という宣言に対して
hoge(1.23f, 1);
と呼び出した場合でもこの 1.23f は一旦 double に拡張されるってことにならないか?
それも変な話だと思う。
更に読み進めていくと
> 関数原型宣言子における省略記号標記は、
> 最後に宣言されている仮引数の直後から実引数の型変換を止める。
> 残りの実引数に対しては、規定の実引数拡張を行う。
とあるので printf に渡した第二引数以降は型変換しないということだでいいんじゃないかな。
>>702 原因はオーバーフローなのか
どうなのか仕組みから説明しないと・・・
そこが肝要だと思うのです。
>と呼び出した場合でもこの 1.23f は一旦 double に拡張されるってことにならないか? ならない。aという引数はプロトタイプを持つのだから。 プロトタイプを持たないのは...の部分。 >とあるので printf に渡した第二引数以降は型変換しないということだでいいんじゃないかな。 多分理解がおかしい。一部の変換(配列→ポインタ、関数→ポインタ、LValue→RValue)もするし、拡張もする。 例えば、 char *p="ZZZ"; printf( "%p", p ); はchar*を(LValue→RValueはするけど)void*へは変換しないで積む。 これが "実引数の型変換を止める"と言うこと(というか、変換のしようがない)。 # ちなみに、これは鼻から悪魔が出るかもしれないコード。%pはvoid*を要求するから。 で、 printf( "%f", 4.2f ); は "規定の実引数拡張"が行われてdoubleな4.2がprintfに渡る。
>>709 > ならない。aという引数はプロトタイプを持つのだから。
> プロトタイプを持たないのは...の部分。
俺もそう思うんだが、文章の曖昧さの話。
呼び出される関数が関数原型を含まない型をもつか否かで
挙動が分かれるようにも読める。
> 呼び出される関数を表す式が、関数原型を含まない型をもつ場合、
> 各実引数に対して整数拡張を行い、
> 型 float をもつ実引数は型 double に拡張する。
本当は
> 呼び出される関数を表す式が、関数原型を含まない型をもつ場合、
> (関数原型を含まない) 各実引数に対して整数拡張を行い、
> (関数原型を含まない) 型 float をもつ実引数は型 double に拡張する。
ってことでいいんかな。
まぁそういうことだろうね。
>>709 > 多分理解がおかしい。
> 一部の変換(配列→ポインタ、関数→ポインタ、LValue→RValue)もするし、拡張もする。
言葉が足りんかった。
元々の QZ 氏の主張を要約すると
「省略子を使った場合はプロトタイプが無いわけだから float → double への変換が行われる」
というものだったけど、それに対して「省略子で書いたことによっては変換は起こらない」という
ことを言いたかったもので、一般的な変換についてまで否定したわけじゃないよ。
昨日質問したんだけど 使わないような難しい漢字は何で輪郭がぼやけてるんでしょうか? あれはどういうことですか? C言語では最大何語の漢字をサポートしてますか?
714 :
デフォルトの名無しさん :2012/08/03(金) 16:00:35.79
半人前のクセに
>>713 その質問のどこがCの質問?
それぞれGUI環境や文字コードの話だと思うのだが。
718 :
デフォルトの名無しさん :2012/08/03(金) 17:44:24.51
>>717 でもC言語のchar a;
aが67でしょ?
対応してるじゃん。
a='2000'だと何かの漢字になったりしないの?
アンチって言ってるだろ アホ
ピーカーチューー!
721 :
デフォルトの名無しさん :2012/08/03(金) 17:56:17.69
char graph; graph='F'; と するとgraph=Fつまり文字を記憶する変数であり C言語は数値だけでなく文字も記憶できるんですよね? だから graph='数'; みたいには出来ないのはなぜかなと。
だから文字コードを勉強して来いと。
どこからどこまでがC言語の仕事でOSの仕事なのか分からない
>>724 おまえがC言語とOSがわかっていないことは分かる
#include<stdio.h>あるじゃないですか stdio.h自体はC言語と関係ないもんなんですか?
あなたのおっしゃる〈関係〉とは一体どういう意味を含むのですか? 哲学的・形而上学的な観点から、 あなたは〈関係〉という概念を、どのように把握してらっしゃいますか?
うん
>>725 分からないプログラムは組めるけど機械的にやってるから
OSに命令を与えるための素材を集めてGUIによって可能にした系=C言語?
日本語では、どれだけの単語が扱えますか?
山は死にますか?
髪は死にますよ 気をつけましょうね プログラマのみなさん
>>729 冗談抜きで、日本語の表現力を少しは身に着けたほうがいいぞ。
ついでに、パソコンの仕組みも。
無知が背伸びするとしばしばこうなる
どういう経緯でC言語をやろう(この言い方も変な感じだが)と思ったのかも気になるな
APIやdllについて聞いたら殴られそうな勢いだなw
>>736 C言語以外の言語からも呼び出せますしー
骨の髄までしゃぶってるのがC使いだから・・ C使いにAPI関を連断られると厳しいものがあるなw
739 :
デフォルトの名無しさん :2012/08/03(金) 18:47:10.93
日 本 語 で お k。
ではC言語は何かと聞かれて答えられる学生はいるの
OSに指示を出すための言語がプログラミング言語だと思うのですが プログラミング言語はどうやって作るのですか? 今はWindowsがあるから何でも可能ですが昔の低水準マシンにおいて はどうやって作っていたのでしょうか?
哲学スレでやってください
めんどくさそうな人間の相手は 誰もがやりたくない事なんだ
うん
古いgcc のソース追っかけたら? メタなCを喰って実行コードを吐くコンパイラをCで書いといて アセンブラ化 それで出来あがったコンパイラを使って 複雑さを増したCで書かれたCコンパイラのソースをコンパイルして… それで出来あがったコンパイラを使って… ってな感じだったような
低水準でも言語だよ プログラミング言語だよ クソ機械語はプログラミング言語だよ お前は情報科過程ひとおおり眺めてざっと理解してから質問しろ 時間の無駄だ
むかしVBで挫折してて、今回C始めたらC面白いでやんの。 初めからCやっときゃよかったわ。 構造が分からずに手を出すより、構造を知りながら覚える方がおもろいな。
おもろいね。
そうでもない
最初の頃やったPerlはわけわからんかった 今でもトラウマあってPerlには手を出してない
751 :
デフォルトの名無しさん :2012/08/03(金) 20:09:42.58
UnixとかだとCコンパイラがなくてもC言語組めたの? Windowsだと環境入れないとだめでしょ
アセンブリから機械語に変換するときにはコンパイラは無い ハンドアセンブルしてた 実際、微細に渡る変換規則があれば C言語もハンドアセンブルできる というよりも コンパイラの仕事は全て人力で、ノートと鉛筆ででもできる でも 余りにも時間を喰うから *自動プログラミング* してる
昔の人は16進で命令覚えてたって言うしな
755 :
デフォルトの名無しさん :2012/08/03(金) 20:21:51.34
UnixのCを組める環境って何がある? Osに元から備わってたり?
UNIXはCで書かれた これがどういうことか一晩考えろ 夏だから時間あるだろ
UNIXでCか。 "ken thompson" unix login でぐぐると面白い話がかかるな。 Unixモンには当然知ってる教養レベルだが。
>>756 それは、一部間違っている。
UnixはCで書き直された。という表現の方が正しいと思う。
>>753 アセンブリの状態からでもアセンブルは必要なんだね
結局コンパイルと一緒かと
Unixってタダでしたっけ?
アセンブラ版はunicsだろ 無知供が
学術だし
>>760 UNIXは商標だから有料商品だよ。
Unix"系"はいろいろあるけど。
>>761 教養がないので一応wikiで見てみたけど、
unicsからunixへの改名のタイミングは書いていないけど、
「the UNIX Programmer's Manualが1971年3月に出版された。」とあって、
「UNIXは1973年にC言語に移植された。」
とあるから、時系列的には
unixでもアセンブリ言語版ではあるんじゃない?
Windows95の前でしたっけ?その頃もWindowsOSはありましたよね。 どんな環境でC言語プログラム作ってたんです? インターネットもないため開発環境インスコできなかったと思いますが。
どうだろうね
PC-98で5インチFD版のQuickCをですね
>>765 DOS環境でもCコンパイラはいっぱいあったよ。
うちの専門学校では"Turbo C"だった。
あと、"Microsoft C" とか "Quick C"とかあったな。名前しか覚えていないけど。
gnuが幅効かせる前のホビープログラマの無料環境は 16進直打ちでアセンブラ作ってプログラミング アセンブラコードをバイナリデータで持ってBASICから呼ぶ これ
いま思えば、20年前の専門学校時代にC言語でオブジェクト指向的な事
(カプセル化・ちょうどアクアゾーンが流行り始めてた)や
ベジエ曲線とか結構面白いこと教えてもらってたな。
>>770 ベーマガとかで投稿していた方ですか?
8086のセグメントとかFARポインタで挫折したな intは16ビットですぐオーバーフローするし
774 :
デフォルトの名無しさん :2012/08/03(金) 21:38:05.58
BASIC の DATA 文がある意味アセンブラだったな
マシン語ダンプリストとチェックサム Bと8をよく打ち間違えた
無期懲役食らった星島貴徳ってプログラマーとしてはかなり優秀だったと思います?
一応、ここは、C言語スレだったりします。。。
私もついに、中途半端な回顧厨が若造の戯言言っているようにしか見えなくなってしまったか。
>>729 まずコンピュータの仕組みを勉強しなさい。
本屋にいけばその手の本が積んである。
それからOS、プログラミング言語とかより詳しいことを勉強したら。
>>779 自作OSを夏休みの自己課題として作りたいのですがやはり困難を極めるでしょうか?
本当に簡素なOSで良いんです。
>>780 仕組みが分かってないものどうやってつくるの?
プラモなら半完成品があるが
だったらOSの作り方とか書いてある本読めよ
783 :
デフォルトの名無しさん :2012/08/03(金) 22:17:48.08
>>780 どっさりハードが絡んでくるから
この板の範囲を遙かに超えるぞ
半田ごては絶対やーよという向きには
VM という手もあるが、それはそれでまた侮れない
OSて組み込み?
OS作るだけならハードは要らない。 でも、既存ハード用のOSとなるとドライバがたんまり必要になる。 ドライバが要らないハードとなると、ワンボードマイコン辺りになるから やはりハードの知識が必要に。
>>780 それからソフトの作り方も勉強したら
なんとなくつくって動かしているじゃつかいものにならん
すみません enum { StateNormal = 0, StateAbnormal = 1 << 0, StateA = 1 << 1, StateB = 1 << 2, StateC = 1 << 3 }; typedef int State; みたいな列挙型があって、この型で表されるstateを調べたいとき、 排他でないA, B, Cはビット積&を取ればいいと思うのですが、 NormalかAbnormalかを調べるときはどうしたらいいのでしょうか?
列挙型の使い方がまちがっとる。
>>787 仕様次第。
Normalと言う状態は、
state == StateNormalなのかもしれないし、
Normal: (state & StateAbnormal) == StateNormalなのかもしれない。
Abnormalと言う状態は、
state == StateAbnormalなのかもしれないし、
(state & StateAbnormal) == StateAbnormalなのかもしれない。
そういう意味ではAについても
(state & StateA) == StateAなのかどうかは使用を確認しないとなんとも言えない。
すみません。A, B, Cを無視してNormalかAbnormalかを調べること自体がおかしいという話でした。 Abnormalも含めてNormal以外がいずれも1でないとき、すなわち0のとき、かつそのときに限りNormalでした。
言いたいことはよく判らんが、 state == StateNormalのときにNormalということなんだな。 使い方が巧いかどうかは知らんが、よくある使い方だな。
>>789 ありがとうございます。
まさに
(state & StateAbnormal) == StateNormal
のときNormalだと思っていたのですが
state == StateNormal
のときだけがNormalだったようです。
ちなみに引っ張ってきたのは, Objective-CのUIDocumentStateからです。
OSを作るだと?マルチタスクは超難しいぞ 卒論の範囲を遥かに超える
別にシングルタスクでいいじゃん。 そういえば20年くらい前に友達が卒論でCP/M80をマルチタスク拡張した OS作ってたなぁ。
何も考えずに排他制御すればとりあえず出来るけどデッドロック、スタベーション、レース状態は 普通に起きるんでそれを回避するAPIを作るのが面倒くさい
別にOS自体はシングルタスクでもいいじゃん。
>>741 コンパイラ自身はどうやってコンパイルしたと思ってんの?
最初のコンパイラは神が与えた
コンパイラなんて使わずハンドアッセンブルしたに決まってんじゃん
>>780 フロッピーから起動してコマンドを入力させる仕組みを作れるもんなら作ってみろ
もちろんDOSに頼らずにゼロからだ
OSを作るってそういうことだ
お前には無理
コンパイラコンパイラも知らないガキンチョか
あ〜あ…
ゆとりの俺からすると昔の人は変態的
変態に支えられて経済発展したんだな
イタヅラし放題〜♪
板ずらし放題
808 :
デフォルトの名無しさん :2012/08/04(土) 12:12:02.91
すみませんC言語は先週から始めた超初心者です text="12345ABCDE"という文字列の中から『○番目』の文字のみ抽出する方法か関数があれば教えて下さい。 よろしくお願いします。
text[i]
811 :
デフォルトの名無しさん :2012/08/04(土) 12:30:33.38
>>809-810 ありがとうございます!!!!!!!!!
こんな単純なことすら思い付かない自分が悔しいですorz
C言語なんてものに向いていないのかもと不安ですが、これからがんばってみます!!
またよろしくおねがいします!
最初はみんなそんなもんだ。 習うより慣れろ。 バッドで100回素振りしたらそのうちヒットもでるさ。 それと同じ、何回コーディングしたかの違い。 不安なんて関係ないよ、丸写しでもいいから書いて 分からない部分を調べるかヘルプで読むだけの話。 書く、調べる、覚える。 これを繰り返すか繰り返さないかの差でしかない。
ほっこりした。
1 毎日、暗記するくらい手引書読む 何ページに何が書いてあるか覚えたら卒業 2 1で分からない部分を解説してあるサイトやら本を暗記するくらい読む 3. 難しい部分はとりあえず置いて理解出来るコードをひたすら書く 4. ちょっとだけ難しいコードを混ぜて覚える 以下ループ そうやってみんな中級者になっていく。 上級者になると言語の仕様書が頭の中に入ってる。 やってることは初心者の頃と同じ。1-4の反復
815 :
433 :2012/08/04(土) 15:10:11.10
みなさんのお力をお借りさせてください。 void Object () { if ( switch_01 == 1 ) { /* 構造体変数の宣言 */ struct s_int iobject ; // iobject /* 構造体変数の初期化 */ // iobject.index = "1" ; // char型の文字代入ができない問題 iobject.x = 112 ; iobject.y = 96 ; switch_01 = 0 ; // 初期化スイッチを切る(0がOFF) これでもうこの処理には入らない } DrawGraph ( iobject.x , iobject.y , SPRITE [ 0 ] , TRUE ) ; // キャラクターを表示する } 構造体変数の利用についてです。コメント等は読み飛ばして〜〜〜〜! これで最後のDrawGraph(すいません。不可解な単語は全部ルーチン名です)の引数[iobject.x,iobject.y]が定義されていない、とコンパイラ君に言われるのですが、構造体変数って同じ階層で定義してその階層でしか参照できないのでしょうか? ifを使わずに同じ階層で処理を実行すると普通にコンパイルを通過できたので…。この辺りのルールがCの教科書には載っていません><; ちなみに構造体データ型定義は別で行っています。switch_01は変数ですが、if文内の処理が初期化の処理で1度だけ実行したかったのでフラグ的な役割をしているだけです。(これらは別にどうでもよかったf^^;
>>815 >構造体データ型定義は別で行っています。
そのファイルをincludeしなきゃだめだよ
s_intの定義はどうなってる?
char* plist[] = {"aaa", "BBB", "ccc", "DDD", "eee", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; 文字列のソートするプログラム書こうとして文字列の配列を作ろうとしたんだけど char* plist[]ってことは添字なしだと char** plistになるのかな? かといって↓のようにすると、その後上手く使えなくなって頭がドーン char** pplist = {"aaa", "BBB", "ccc", "DDD", "eee", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; なんでこうなるの?
// iobject.index = "1" ; // char型の文字代入ができない問題
>その後上手く使えなくなって 下手になら使えるのか。 問題ないじゃん
821 :
433 :2012/08/04(土) 15:22:51.45
>>819 すいません。それは関係ないやつですf^^;ポリポリ
>>817 struct s_int {
char index ;
int x ;
int y ;
} ;
になってます。(ソースファイルの先頭に記述済み)
>>816 同じファイル内に定義済みです。。。
すいません。今ちょっとDrawGraphの直前に
struct s_int iobject ;
を入れたんですけどコンパイルしたら
Run-Time Check Failure #3 - The variable 'iobject' is being used without being initialized.
こんなダイアログが出ました。エラーなのでしょうが内容が分かりませんんんんん
iobject.index = "1"; ↓ iobject.index = '1';
文字と文字列の違いもわかってないのか
824 :
433 :2012/08/04(土) 15:34:26.13
>>822 ぎゃああああああ
ってな感じです。。。凡ミスワラタw
アリガトゴザイマス(´・ω・`)
>>814 私はちょっとだけ順番違うかな。
1 まず、したい事がある。
2 その事を実現する方法についてのみ調べる。(手引書、参考書、サイト)
3 コードを書いてみる。
4 その後で、手引書、参考書、サイトをじっくり読む。
5 3のコードを改造してみる。
そんで、3-5のループって感じかな。
もちろん、初めに言語の仕様をだいたい知っていることに越した事はないんだけどね。
>>825 それだと
モチベは保てる利点があるが
やりたい内容が力量を越えて飛躍しすぎてると頭がオーバーフローし易いので
挫折する可能性もある。
反面、>814だとモチベが持続出来ないのでブン投げる可能もある。
モチベを保つために練習問題をコツコツやらないと厳しい。
コードを書いて前回より出来が良い物に改善、出来る範囲の文献を当たって
β0.01からβ0.02へ進化!手直し手直しを繰り返すのが良いとこ取りかもしれないね。
無理せずにコツコツと手直しが近道かもしれんね。
>>825 今だとgoogleでこの手順もかなり楽になった
検索すると困ってる内容の解決策に簡単にたどり着ける
829 :
デフォルトの名無しさん :2012/08/04(土) 16:53:12.03
若い頃はモロ
>>814 つーか 4. で無謀なチャレンジを楽しんでいた
今
>>825 へ徐々に移行、6. ありえないポカで自己嫌悪を追加
つまり int main(int argc, char *argv[]); int main(int argc, char **argv); が等価であるからといって char *plist[] = {"foo", "bar"}; char **plist = {"foo", "bar"}; が等価にはならない
835 :
デフォルトの名無しさん :2012/08/04(土) 17:41:37.11
等価であるべきだとすごい剣幕で主張してるアホが昔いた
__ た わ し で す -- 二 / ̄\ = 二  ̄. | ^o^ |  ̄ -‐ \_/ ‐-
>>830 >>833 >>834 ありがとうごじゃいます
char *plist[] = {"foo", "bar"};
char **plist = {"foo", "bar"};
これが等価だって思い付きが大間違いだったんですねorz
838 :
825 :2012/08/04(土) 19:28:06.02
知らないうちに結構レスがついている。 ちなみに40代のおぢさんです。 ポンコツだけど。。。。 ただ、1の「したい事がある」は「お仕事でやらないといけなかった」ともいう。 そして、 2の調べるは、そんな人が作ったPGを引き継いだ人が大変なのは分かっていたから、当時はサイトが無かったので必死に参考書を読み漁っていた。 最初の入門書は林春比古さんの新C言語入門シリーズだったかな。(1991年版・今は新しいのが出てるはず) 未だにシニア編は手放せないです。 ビギナー編はどうでも良かったからどっかいっちゃったし、応用編は当時のDOS環境に偏り過ぎていたからね。 オライリーシリーズはポンコツには敷居が高かった。 って感じかな。
林春比古の本に手をだしてはいけませんキリッ
840 :
825 :2012/08/04(土) 19:54:02.56
>>839 正直、他のシリーズの本(C++とかVBとLinuxとか)は知らないんだけどね。
Javaだけはちょっと読んだけど、Java自体、言語と言うより、「如何に用意されたAPIを使いこなすか」で、
しかもJavaのバージョンが上がりまくってAPIが変わりまくりだったので意味をなさなかったね。
持ってるのVer1.3対応版だよ。まったく意味がない。
C言語入門にしては当時(1990年頃)としては分かり易かったと思う。
今なら他にもいっぱいあると思うけど。
初心者ならここじゃないの。副読本の感覚で
http://www9.plala.or.jp/sgwr-t/index.html ポイント学習C言語
中級には物足りなすぎるだろうけど
初心者には孫の手みたいに痛し痒しに届きそうな内容じゃない。
この人の本は持ってないけどね・・どうなんでしょ。
あとは猫シリーズのWinプログラムやっとけば初級卒業なんじゃないのかな。
オライリーが鉄板だとは思うがあれ楽勝で読みこなせるなら初心者じゃない気もするw
写経して即デバッガで追うのは楽なんだけど、時間が無い人向けだな。
猫わかもいいんだけどちょっと古臭いのがね
あれは猫ならわかるのかもしれんが、人間だとわからんのでは? 少なくとも俺は柴田望洋のほうがわかり易かったよ
うん
独習Cだろ最強は
図書館で借りた入門書に誤字があり、その箇所で悩みまくり頭が沸騰するかと思った。 初心者だから自分が間違っているのか本が間違っているのか分からないから困る
困るね
読んで覚えるだけの勉強しかしないバカにありがちだね
850 :
デフォルトの名無しさん :2012/08/05(日) 00:03:30.81
∧_∧ / ̄ ̄ ̄ ̄ ̄ ( ´∀`)< オマエモナー ( ) \_____ │ │ │ (__)_)
851 :
685 :2012/08/05(日) 01:58:36.19
>>847 自分でうごかしてみるんだ。今は環境は簡単に手に入る。
コンパイル環境あったところで、誤字が理由のエラーに悩みまくることはかわらないけどな
昔よりはエラーメッセージが親切になった 何といっても読めば意味が分かることが多い
開発環境やバージョンの違いで動かないこともあったりするから 手に負えない。
初心者がエラーメッセージをちゃんと読んで理解するかよw
856 :
685 :2012/08/05(日) 05:24:21.33
>>855 ここに投げてみるとか、codepad/ideone の結果を貼り付けてみるとか。
初学者のはまる点であれば、ここでなんとかなるんじゃない?
しかし初心者ほど「エラーが出ます」としか言わないのであった
C++のテンプレートとかエラーメッセージ自体が意味不明だったりするけど
初心者の独学の話をしてるんじゃないの?
%fで8バイト必要なのに4バイトしか積んでないから
つまり
>>663 の4番目と6番目
% よりも - の方が優先順位が高いので 10 % 3 - 1.0 < 4.0 ? 1 : 0; は 10 % (3 - 1.0) < 4.0 ? 1 : 0; と解釈され、剰余演算子にdouble型を適用しようとするので コンパイルエラーになるはずなんだけどなあ
>% よりも - の方が優先順位が高いので 単項演算子の-と二項演算子の-との区別がつかないおバカさん?
printf("%f\n", 10 % 3 - 1.0 < 4.0 ? 1.0 : 0.0); とするとちゃんと1.000000と表示される所から見て、整数→倍精度浮動小数点数 への格上げはされてない(当たり前か)
>>869 これアクロバティックと言わずに「undefined」と言おうよ
>>870 intでdouble型の表示をしようとすると結果はやはり「undefined」だろうな
printf("%f\n", 1); とやってるのと同じだもん
そういえばDOSの時代に関数ポインタを取得して、そこにディスク上から別の関数を 上書きして走らせるというキチガイ沙汰なプログラムが立派に商用に使われていたな もちろん後から上書きする関数の大きさは前の関数よりもサイズが小さくないと 次の関数の頭まで消してしまうし、引数も同じにしとかないとコンパイルが出来ない これも未定義なんだけど、メモリの少ない時代は仕方がなかったんだろうな
873 :
デフォルトの名無しさん :2012/08/05(日) 11:54:53.01
union { char c[8]; double d; } u; u.c[0] = 0x66; u.c[1] = 0x68; u.c[2] = 0x3c; u.c[3] = 0x11; u.c[4] = 0xc4; u.c[5] = 0x59; u.c[6] = 0x01; u.c[7] = 0x40; printf("%f\n", u.d); u.c[0] = 0x00; u.c[1] = 0x00; u.c[2] = 0x00; u.c[3] = 0x00; printf("%f\n", u.d);
>>872 メモリの無い時代、別にオーバーレイは常套手段だったろ。
>>870 おおー、thx
このやりかた、デバッグにつかえるかもしれないね
876 :
デフォルトの名無しさん :2012/08/05(日) 12:36:40.22
条件A, B, Cそれぞれにture falseがあり、条件の組み合わせで それぞれに違う処理をさせたい場合、どういった書き方をするんでしょうか 真理値表で言うとこんな感じです A B C F F F -> n = ture F F T -> m = ture F T F -> l = true <略> T T T -> s = true ifを使って、 if (a == false) && (b == false) && (c == false) { ... などと書くのが普通でしょうか。コレだと条件がD, E, ...と増えていくと 収集がつかなくなりそうで不安です。いい方法か、検索に役立つキーワードが あれば教えて下さい。
ビットフラグ
関数型言語ってCの事ですか?
Cは手続型言語
880 :
433 :2012/08/05(日) 13:23:49.15
>>832 832さんありがとうございます!
そのページのソースコードに記述されているstatic(きおくくらす?で合ってるのかな…?)をヒントにコンパイルエラーの謎を解明できました。
具体的な原因としてObjectルーチンを何度も通すプログラムを書いており、
struct s_int iobject ;
という構造体変数宣言を何度も行っている事が原因だったようで、これをヘッダー部分(main()以前)に書く事でコンパイルが正常に通りました。
またひとつ勉強になりました。ありがとうございますm(--)m
どういたしまして
ズルして楽して覚えても結局は言語仕様に戻る罠。 面倒でも暇を見てヘルプや仕様を読む癖をつけるのが良いと思うよ。
>>876 いろいろやりかたはあるが、条件を表にしておき関数ポインタを持っておくとか
オートマトンで使われるような状態遷移図にも似たような手法が使われる
#include <stdio.h> #define _TRUE 1 #define _FALSE 0 int fff(void) { printf("%s\n", __func__); } int fft(void) { printf("%s\n", __func__); } int ftf(void) { printf("%s\n", __func__); } int ftt(void) { printf("%s\n", __func__); } int tff(void) { printf("%s\n", __func__); } int tft(void) { printf("%s\n", __func__); } int ttf(void) { printf("%s\n", __func__); } int ttt(void) { printf("%s\n", __func__); } int (*tbl[2][2][2])(void) ={ { { fff, fft }, { ftf, ftt }, }, { { tff, tft }, { ttf, ttt }, }, }; int main(void){ (*tbl[_FALSE][_FALSE][_FALSE])(); (*tbl[_FALSE][_FALSE][_TRUE])(); (*tbl[_FALSE][_TRUE][_FALSE])(); (*tbl[_FALSE][_TRUE][_TRUE])(); (*tbl[_TRUE][_FALSE][_FALSE])(); (*tbl[_TRUE][_FALSE][_TRUE])(); (*tbl[_TRUE][_TRUE][_FALSE])(); (*tbl[_TRUE][_TRUE][_TRUE])(); return 0; }
lenovo@LENOVO-0C414D26 ~ $ ./a.exe fff fft ftf ftt tff tft ttf ttt
887 :
433 :2012/08/05(日) 17:00:58.51
>>882 自動変数と静的変数というのは一般的に言われる「変数」を噛み砕いたものという事でしょうか?
初期化しないままに参照するのは結果的にエラーを吐くのは分かったのですが、
初期化したものをその後に参照しようとしても参照できない場合があるのはなぜなのでしょう
やはりCの仕様なんでしょうか…
アドレスが違うか見てみれば
"スコープ"とか"変数の寿命"でググれや
>>887 ttp://ideone.com/xmVR8 >自動変数と静的変数というのは一般的に言われる「変数」を噛み砕いたものという事でしょうか?
変数には大雑把にいって自動変数と静的変数がある
>初期化したものをその後に参照しようとしても参照できない場合があるのはなぜなのでしょう
初期化したつもりで自動変数を初期化してなかったので
「変数'iobject'が初期化されてないのに使われようとした」というエラー(警告?)になったのだと思われ
Run-Time Check Failure #3 - The variable 'iobject' is being used without being initialized.
891 :
433 :2012/08/05(日) 18:16:14.23
返答早すぎですw多くのレスありがとうございます><
まだC言語は半月くらいの経験しかない身ではしたない部分があるにも関わらず多くアドバイスを頂き感謝し尽せないです。。。
>>890 初期化した場所が悪かったのか、初期化した後変数が別の変数に変わってしまったのか分かりませんがエラーの内容からすれば変数の初期化をする場所にルールがあるんじゃないか、とちょっと気づいてきました…(´・ω・`)
>>889 ブロックスコープという存在を知らなかった…orz
しかも私が今併用しているC言語入門書には書いていない件(tyow
>>888 ポインタですね^^
後々解析してみまぁす。ありがとうございます〜
皆様、貴重なご教示ありがとうございました。
893 :
876 :2012/08/05(日) 18:36:50.41
>>877 , 884様
とりあえず今回は3条件T/Fで設計してしまったので、
ビットフラグで行こうと思います。
検索したらUMLとか状態遷移とかを解説しているページが
多く見られ、大変参考になりました。ありがとうございました。
894 :
デフォルトの名無しさん :2012/08/05(日) 18:45:27.84
はじめまして。 <=====の行がうまくいかないです。アドバイスお願いします。 int *po,ban,i; po=&ban; for(i=0;i<5;i++){ *(po+i)=i; /*<=====*/ }
とりあえず、がんばれ、と言っておこう
はじめまして。 <=====の行がうまくいかないです。アドバイスお願いします。 int *po,ban,i; po=&ban; for(i=0;i<5;i++){ *(po+i)<=====i; }
899 :
デフォルトの名無しさん :2012/08/05(日) 19:20:02.69
900 :
デフォルトの名無しさん :2012/08/05(日) 19:29:40.53
自動変数は何が自動なんですか。手動変数もありますか。
ぽいぽいPOI!!! ふぉいふぉいFOI!!! カネ返せFOI!!! カネ返せPOI!!!
全自動変数 半自動変数 手動変数
変数がメモリ上のどこにあるのかを考えろよw 答えはそこにある。
変数 固定変数 変動定数 定数
ふひひ
このスレ質問ても処理系は何?と聞いてごまかして答えてくれないよね。 専門知識を教えるのは億劫なんかね。
質問ても?
909 :
デフォルトの名無しさん :2012/08/06(月) 00:06:41.76
>>906 C言語は低レベルなので処理系聞かないと規格票の範囲でしか答えられないからです
912 :
デフォルトの名無しさん :2012/08/06(月) 01:29:45.60
IDがでねー掲示板で何やってんだお前ら。。
↑馬鹿
('_')
知識は出し惜しみすんなよクズ 共有しないと意味ねーだろ
もうずっとプログラマ大杉
共有() 一方的にもらうだけの乞食が
処理系を知りたいならアセンブラ。 遠慮せずにそちらの世界へ。
けんかしにここにきてるのかお前ら そんなひまがあったら働け
>>919 お前が処理系を何だと思ってるか説明するのが先だ
ゴミしか言えないのかよ
判断の根拠を言えよバーカ わかってないのに判断したのかよ
ゴミとバーカしか言えないのかよ
アホ
ゴミとバーカとアホとゴミカスしか言えないのかよ
お前らいい加減やめろよ・・・
933 :
デフォルトの名無しさん :2012/08/06(月) 05:20:03.08
しか言えないのかよしか言えないのかよ
>>930 >>919 だけが「処理系」の意味を知らないだけで
他の人は全員「処理系」の意味を理解して、同じ意味で使っている。
919に言ってやれよ
919に言ってやれよしか言えないのかよ
919に言ってやれよしか言えないのかよしか言えないのかよ
919に言ってやれよしか言えないのかよしか言えないのかよしか言えないのかよ
アホ自慢はもういいから。
implementation 実装、処理系
規格ではなく処理系でことなる部分がある(処理系依存の部分、未定義の部分)
ダンプ解析しないのかな。
童貞先生ゴミマ
#include <stdio.h> int main(void) { int i = 2; printf("%d\n", ++i*(++i) ); return 0; } /* C:\work>gcc -Wall -o ppi ppi.c ppi.c: In function `main': ppi.c:5: warning: operation on `i' may be undefined C:\work>ppi 16 C:\work>dmc ppi.c link ppi,,,user32+kernel32/noi; C:\work>ppi 12 */
ぶひ
>>945 何したいんだ?
#include <stdio.h>
int main(void) {
int i = 2, j;
j = ++i;
printf("%d\n", j*(j) );
return 0;
}
948 :
デフォルトの名無しさん :2012/08/06(月) 08:43:31.10
Qがコテを隠して朝からファビョっているのか
アホは書き込むな。しか言えないのかよ
ぶひひ
Qの口癖「ほう。」
>>949 >Qがコテを隠して朝からファビョって
http://toro.2ch.net/test/read.cgi/tech/1342966104/159,162,164,166,170,173,175,182,184,186,190,196,202,204,206,213,215,218
私怨の憂さ晴らしは他所でやれ
怨まれているのですか?じゃあ、お祓いしなくちゃ
潜伏わろた
わろたね
960 :
デフォルトの名無しさん :2012/08/06(月) 23:02:13.13
!NULLと!=NULLに違いはありますか?
963 :
デフォルトの名無しさん :2012/08/06(月) 23:11:35.22
処理上の違いでしょうか? 速度上の違いでしょうか? 処理上の違いの場合、どちらかにしかないエラーケースはどんなのがありますか?
965 :
デフォルトの名無しさん :2012/08/06(月) 23:26:16.94
すみません、説明が間違っていました。 if(!hoge)はif(hoge != NULL)と等価かどうかが知りたかったんですが、認識からして混乱していたようです……
まぴょーん…… 投下かどうかくらいは自力で調べられんジャネーノこれ
等価じゃねーだろ。真逆の意味。
970 :
デフォルトの名無しさん :2012/08/06(月) 23:55:55.61
if(hoge)かif(hoge != NULL)って、前者は見づらい氏ねって人と、後者こそ煩雑、氏ねって人がいるよね
どっちも使うけどNULLが返る関数を使うときは後者を使うわ
ポインタならNULLとの比較、論理値ならそのまま/!だな。
ぬるぬる
俺はこういう常套句はどっちでも一瞬で理解できるからわかりにくさがわからない
おっさん達の目が悪くてびっくりマーク見逃す可能性があるから比較で書くべき
NULLPO
「NULL」なんて使わなくなった。3バイト分無駄以外の何者でもない。今の時代でも書く奴がいるのか?そうまでする理由がわからない。 \0 も NULL も 0 と書いて無問題。 お約束でごめんね。
979 :
デフォルトの名無しさん :2012/08/07(火) 00:33:34.59
組み込み系 vs コンシューマソフトウェア ファイッ!!
>>970 後者はありえない。
if (hoge != 0) と書かない理由をいってみろ。
>>964 真を返すのに
return !0
と書く人がいたとすれば、その原理主義的思考には深く共感する。
あまりにも紛らわしいので私はしないが。
今の時代ソースが3バイト分無駄とか考えるほうが少ないんじゃねーの まぁ、排他的な意見しか言えないQに言っても無駄だろうけど。 好きな方使えばええやん
while (!0)
>>982 理由があればね。でも3バイト使ってひとつもわかりやすくなっていない、確たる理由はない、惰性としかいいようがない。
return TRUE; return FALSE; return NULL; if(hoge != NULL) while(TRUE) Java出身の俺はこう書く
感覚に必ずしも理由は要らない
惰性で充分 改めるほどの価値も無い
989 :
デフォルトの名無しさん :2012/08/07(火) 00:53:00.85
これが宗教戦争ってやつですね! わかりましたっ!
990 :
デフォルトの名無しさん :2012/08/07(火) 00:54:06.59
つまり、クズ。
>>989 どっちかというと新興宗教vs伝統仏教。
新興宗教側(NULL否定派)に分はない。
ごくろう
NULL否定するってことはマジックナンバーだらけのソースしか書かないんだろうな。
ん、NULL否定派って何? NULLの否定で式を書くって事? それともNULLの使用を否定するって事?
あ?別にマジックナンバーにも問題はないが。
キチガイのQが何か言ってるぞ!!
さっさと埋めろよこんな糞スレ
0で問題有ると思ってるからNULL使ってるわけじゃないし
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。