C言語なら俺に聞け 144
■ このスレッドは過去ログ倉庫に格納されています
>>649 定数だからエラーなのではない char s[2]; //non-constant array s++; //ill-formed >>654 これは分かりました(>_<) 配列の変数はポインタと同じようで違うんですね(>_<) >>640 void sumStr(char* str){ *str ="a"; } これ、strはcherのポインタでありその指す先はchar型だ。 "a"は 'a', '\0' と並んで入っている先を指すポインタだ。 *str は char 型で、"a" は char * 型だ。型が違う。 これが例えば *str = 'a'; だったり、あるいは *str = *"a"; だったりすれば型も一致するし目的の値の代入に成功するだろう。 (まあしかし普通は *str = *"a"; なんて書き方しないけどな)。 詳説 Cポインタ、2013、オライリー・ジャパン ポインタの仕様だけで、本が1冊書けるw どんなに面倒くさい言語やねんw >>659 そんなにネタはないと思うが、いったいどんな本なんだろう? ポインタ・文字列を、図解して説明している "abc" なら、"abc\0" みたいに4バイトになるとか >>645 書きやすいかどうかは分からないが、VisualStudioだとこんな感じで警告どころかエラーでビルドに失敗する(C++プログラムとしてだけど) 正確にはビルドするまでもなく、コーディング段階で赤色の波下線で警告表示されるのでそれ以前に問題に気付く https://i.imgur.com/6MLycv2.png >>662 VisualStudioはエディタやデバッガが滅茶苦茶優秀 コンパイラがウンチだけど、それさえ許容できればVisualStudio一択 これからC言語始めます自分で色々と調べたけっかこの2つが残りました どちらがいいでしょうか?アドバイス下さい。それやめとけなんて話もあればお聞かせ下さい 1,「C言語プログラミング」(ハーベイ・M. ダイテル/ポール・J. ダイテル 、ピアソン) 2,プログラミング言語C 第2版 ANSI規格準拠 B.W. カーニハン (著),? D.M. リッチー 巨匠の柴田望洋・林 晴比古とか、 「猫でもわかるC言語プログラミング 第3版」粂井(くめい)康孝、2013 古い本だと、例題の開発環境が古いから、動かせないだろ 「c言語 入門書 おすすめ」で検索! >>666 新しいことを学ぶときは ・バイブル的な本(K&R第2版) ・初心者向け の組み合わせで。 片方だけではダメ。 ちょっと教えてくらさい。 最近Cを書くことが多くなったんですけど #include <Includes/General.h> #include "Includes/General.h" これって、本来の動作的に厳密には何か違いがあるんですか? >>671 #include <> はコンパイル環境指定のインクルードディレクトリから探索 #include "" はインクルードしたファイルのあるローカルディレクトリを先に探索してから環境のインクルードディレクトリを探索 つまり自分で今作ってるプログラムのヘッダファイルは#include ""を使わないと他人の同名のファイルをインクルードするかも知れない。 >>672-673 そういう事ですか、なるほど。 詳しくありがとうございました。勉強になりました。 本当はコーディングルールから学ぶと良いが書ける人はとても忙しいので本がない。 >>666 1は知らんけど2は絶対に読んだほうが良い本だと思うよ。 いくら本読んでも本に頼ってるうちは初心者 書いて書いて書きまくってエラー出しまくって経験積め >>678 なんでもそうだと思うが、 悩んで解決した分 だ け が自らの糧となる。 >>168 このセリフは10年前にも言えたことだな 初心者です。参考書を読んで勉強していたのですが 「浮動小数点数の利点は、一定の有効桁数(精度)の範囲内で、小さな数から大きな数まで表現できることです」(分かりやすいC入門編:川場隆) とあったのですが、どういう意味か分かりま出んでした。 ネットで調べても同じようなことしか書いてなくて。浮動小数点数の利点を教えてください。 >>685 123,000,000,000=123×10^9 右辺の方がコンパクトだろ? >>685 利点とは、何かよりも優れている点であることは解っているか? 浮動小数点と何を比較するのかで答えは違ってくるぞ 整数か? それとも固定小数点か? >>686 というと? >>687 では、数字が少数になったらどうなんでしょうか? 例えば12469125478.945→1.2469125478945×10^10。これでコンパクトになっていると言えるのでしょうか? >>688 すいません。固定小数点数と比べて、です。 間違えた 0.000000000123 = 1.23e-10 二進数32ビットで123,000,000,000は表せないけど、 32ビットを符号部、指数部、仮数部に分けると表現できる。 有効桁数は仮数部のビット数で決まる。 例えば、8ビットなら、2^8 通り、0〜255 しか表現できない それを5ビットにして、残りの3ビットを桁をずらす機能にすると、 2^5 通り、0〜31 しか表現できないけど、 残りの3ビットで、0〜7 を表現できるので、それをずらす桁とすると、 7桁ずらせば、310,000,000 を表現できる だから精度は減ったけど、桁をずらせるようになったから、 非常に小さな数や、大きな数を表現できる 桁をずらす部分は、指数部という。 実際には、10進数ではなく、2進数でずらしていく 初心者質問おねがいします。 二つのunsigned char型があり、 一つ目が 0b10001000 で、 二つ目が 0b01110111 です。 これを合わせて 0b10001000 となる計算式はどうすればいいですか? よろしくおねがいします。 >>695 希望の結果が1つ目の値そのままのように見えるが >>696 すみません。 説明不足でした。 二つ目のchar型は刻々と変化するので、一つ目のchar型の各ビットを二つ目の各ビットが変わったら そのビットだけ反転させたいのです。 よろしくお願い致します >>698 直前の値とのEXORを取れば変化ビットだけ抽出はできるけど、それとは別に何かのマスクを掛けたいということ? >699 すみません。 超初心者なのでマスクとかよくわからないです。 単純に、一つ目のchar型の各ビットを二つ目のchar型の各ビットが変化したらそのビットだけ反転させたいだけです。 >>700 わかりにくい。 ビット単位で4パタン説明して。 >>701 すみません こんな感じでわかりますか? 一つ目の初期値 0b11010110 二つ目の初期値 0b01001011 二つ目が0b01001010に変化 ↓ 一つ目が0b11010111に変化させたい 二つ目 0b01001010 もう一例です 一つ目の初期値 0b11010110 二つ目の初期値 0b01001011 二つ目が0b010000111に変化 ↓ 一つ目が0b11011110に変化させたい >>702 なぜ話をややこしくする? ビット単位で説明すればいいじゃん。 >>704 ビット単位で比較してそれぞれ操作するしかないということでしょうか? できればバイト単位で一括で操作できる方法があればとおもいました >>706 敢えて質問するけど 1.全ビット反転させてはいけない理由はあるの? 2.何処のビットが変化したかどうやって判別してるの? >>706 だれがビット単位で操作するしかないと言ったの? >>707 1、はい。全ビットは反転してはまずいです。 2、マイコンの入力ポートです。 >>708 すみません。 そんなつもりではありません。 ということは、自分の望む計算式があるのでしょうか? >>709 イメージとしては、二つ目の変数の変化をEXORで抽出しながら変更用マスクを作成 そのマスクで一つ目の変数と再度EXOR演算、これで二つ目の変更ビット個所だけ一つ目のビットが反転する ざっくりとした流れはこんな感じ 一つ目の値(状態)a、二つ目の値(入力)b、入力比較用変数c、変更ビットマスクd c = input(b); while(1) { d = c ^ input(b); c = b; a ^= d; } ちょっと整頓させてくれ。 >>702 の場合 二つ目の unsigned char 01001011 ... 最初の値 01001010 ... 新しい値 00000001 ... 変化したビット 一つ目の unsigned char 11010110 ... 最初の値 11010111 ... 二つ目の unsigned char の変化にともない新たに取るべき値 00000001 ... 変化したビット (二つ目の unsigined char の変化したビットと等しい) >>703 の場合 二つ目が0b010000111に変化 ... ビット数が増えとるやん! >>710 の言う通り「二つ目」のビット変化をexor(^演算子)で抽出した結果を 「一つ目」のビットに作用させれば良さそうだけど、 「二つ目」のビットが1から0に変化したときには「一つ目」にはどう反映させたいの? >>710 ありがとうございます。 何となくですが少しイメージが浮かんできました。 >>711 すみません。 二つ目が 0b01000011 に変化の間違いです。 1001110 1101001 1101000 1101111 1101110 1100111 1101111 0100000 1100100 1100101 0100000 1001111 1001011 こ、こうか・・・ 1001110 N 1101001 i 1101000 h 1101111 o 1101110 n 1100111 g 1101111 o 0100000 1100100 d 1100101 e 0100000 1001111 O 1001011 K 2つめ着目ビットが 0 -> 1 となったとき 1つめ対象ビットを 反転/0/1 にする 2つめ着目ビットが 1 -> 0 となったとき 1つめ対象ビットを 反転/0/1 にする 0->1 でも 1->0 でも 1つめ対象ビットを反転すればいいのけ? new_1st = old_1st ^ (old_2nd ^ new_2nd); >>716 正にその通りです! その式で思ってる通りに制御できました! ありがとうございましたm(_ _)m 全くの初心者です。 「2の3乗を求める」という計算プログラムを勉強しています。 最終的には3^1024を求めたいのですが。 ネットで見ていると30乗ぐらいまではプログラムがあるのですが 1024乗ぐらいになると難易度的に難しくなるのでしょうか? >>718 3^1024=(3^2)^512 3^2≒10ってことで、だいぶ大雑把だけど 3^1024≒10^512 10進数で500桁以上の大きな数になりますね。 どの型の変数を使う? >>718 やることは3に3を1,023回掛けるだけだから難しくはない ただ>>719 の言うようにかなりでかい値になる(ちょっとpythonで計算したら489桁だった)から普通のlong intとかではオーバーフローする なので 多倍長整数 C言語 とかでググるがよろし DOSで4000桁の電卓つくるにはって考えてたことあったな。 >>718 自力でどうにか解決できたらプログラミングの力がつくよ、がんばって! >>718 GMPというフリーのライブラリを使えば3^1024は簡単に求まるぞ BCD(二進化十進)ライブラリを拾ってくるのが汚れた大人だけど、 若者は勉強のためにBCDライブラリを作ってみては? >>725 10進の世界を前提に計算するのは、メリットがよくわからないんですが 10進じゃないと0.1が無限に数字が続くらしい よく分からんけど >>728 10進だと 1/3 が無限に数字が続きますよね それはさておき、多桁長+浮動小数点が落としどころではないかと すると、BCD の意義がよくわからないのです 効率よく2進値を10進表記するアルゴリズムが思いつくならメリット無いかもな。 とりあえず質問者の意図にそって 多倍長整数演算と言うことに絞ろう 16進ダンプしたとき読みやすい それだけ 3増し符号とか使ってたやついる? >すると、BCD の意義がよくわからないのです 科学技術計算は浮動小数点でいいが、リアルなお金の計算とかでは10進で計算するのがディフォールト 2進と10進では結果が大幅にちやうから。 ま俺の財産なら誤差0.1円くらいかもしれんが、、 いま必死に考えてる 昔のCPUは絶対に持っていた機能だ レジスタが8ビットだとすると、256以上のデータが表現できなくなるけど、そんなことはない だから何か仕組みがあるはず プログラマが勝手にこのビットが立ったら2の15乗だとか自由に決めて、8ビビットの重み付けをしてるんだとおもう あとは計算と結果の表現次第だ 指数法則を使えばできそうだけど、これはなかなか面白い課題だね >>737 キャリーフラグと言ってレジスタの範囲を超える加減算があると1になるビットがステータスレジスタにある 32ビットCPUにだってあるぞ >>741 C で多桁長計算を記述するときは、キャリーフラグという便利なものが使えないので、いちいちマスクしたり、と苦労しますね http://mevius.2ch.net/test/read.cgi/tech/1434079972/28 C で書かないほうが楽で記述量も少ないかもしれない >>718 は初学者には無理かもしれません アセンブラだと当たり前のようにキャリーフラグを見るけど 高級言語だとキャリーフラグを活用してるのは皆無じゃないかと 思えてくるのが悲しい I/Oがメモリにマッピングされてるんだから見れると思ってる ぼくはそういうプログラミングがしたい Reno版のカーネルのソース読んだとき、 VAXのHDDのドライバが分かりやすくてビビった。 メモリマップドI/Oだた。 ここの人達ってOpaqueポインタとか使ってます? とりあえず本買ってきて読んでいます。3月末ぐらいにはなんとか結果を出したい・・・ とりあえずプログラム初心者だが将来有望な頭脳をもった奴を 2人ほど用意した・・・。 >>742 うーん。最上位ビット使えばできるのでは? まあしかしアセンブラ使った方が効率はいいだろうな。 CPU違ったら動かんけど。 >>748 実ソースではvoidポインタしか見たことない ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる