C言語なら俺に聞け 144
■ このスレッドは過去ログ倉庫に格納されています
そういえば昔1/2ビットシフトなんてテクニックがあったな 1.5ストップビットみたいな 立ってるビットの総和で1シフトする/しないとかの条件付きかと思ったけど ふと 2で割る演算を 右へ算術シフトする話のほうっぽい ラプラス変換(からZ変換した)後に、やっとCのコーディングの話になるので どこか余所できいたほうがいい 数学ですかね… 他に当たります。ありがとうございます。 >>623 数値微分の考え方をまず理解して、さらに三角関数の微分と、極限を理解しないといけない。大学数学だよ。 元が消えてるからよく分からんけど、>>627 の内容って高校数学の内容じゃないの? https://i.imgur.com/yXsENPk.jpg https://i.imgur.com/LhIHXaC.jpg こちらになります。 一応これをC言語でやれというものなので、よろしくお願いします。 解き方の方針だけでも、、、 θをラプラス変換後、伝達関数と掛け合わせてから、逆ラプラス変換をするのかと思いましたが、そんなこと計算できませんでした。 よろしくお願いします。 流石にラプラス変換をC言語でやれという問題じゃないと思う(´・ω・`) 手計算で(6)式に対する出力信号(tの関数)をωcを含む形で導いてから、適当な値を変数omagacにセットして出力信号を数値計算するのでは...? 手計算で、θをラプラス変換して、10式と掛け合わせて、ラプラス逆変換までするのかな? それができたら、できそうだけど、、、 計算できるかな >>629 積分器の部分が面倒くさいな 単純に時間刻み値一段だけ遅延させてみたけどうまくcos波形にならない 何段遅延させればうまくいくかよく分からない とりあえず方針としては、ブロック図を単純に差分方程式に落とし込んでやれば回答には辿り着けるはず 1/sの部分が積分器だから入力を適当に遅延させて出力させてやればいい ラプラス変換云々は理論的な理解には大切だけど、プログラム的には最終的に差分方程式(数学的には微分方程式)の形に落とし込んでしまえばいいよ もうここまでにして途中のソースだけ挙げておく https://ideone.com/69YxIz ごめん、俺が知ってるやり方も部分分数分解だった。 でも手順に従うだけじゃ...? http://lab.cntl.kyutech.ac.jp/ ~nishida/lecture/MathOfCntl/no5.pdf >>634 伝達関数の使い方が、その方法じゃ分からないです… 勉強不足です。 >>635 θをラプラス変換したものを伝達関数と掛け合わせてから、逆ラプラス変換した結果がこうなりました。 T=ω/(ω^2+1) P=0.1/ω^2+1000^2 と適当な文字において、 θ(t)'=T(-cos(t)+ωsin(t)+e^(-ωt))+ P(-cos(t)+ωsin(1000^(2)×t)/1000^(2)+e^(-ωt)) となりました。 これをtを0.001秒毎に、0〜10まで出していけばいいんですよね? 自分でやってみたんですけど、tが0.001秒毎に変わっていかなくて途方にくれてます。 多分簡単なことなんで、コードをお願いします。 int main() { int a; a=1; sumNum(&a); printf("%d\n",a);//13 char str; sumStr(&str); printf("%c\n",str);//□ } void sumStr(char* str){ *str ="a"; } int sumNum(int * num){ *num=*num+12; return 0; } なぜ変数strの出力が"a"と表示されないのですか? "a"は{'a', '\0'}へのポインタ 'a'は文字のa "a"はポインタじゃないぞ printf("%u", sizeof "a"); //2 const char *p; p = &"a"; //ill-formed p = &"a"[0]; //well-formed 'a'はint型の0x41もしくは0xc1だ >>643 eclipseは出ない どのIDE使えば書きやすいのかそれも教えてくれないか >>644 仮に文字列リテラルの式の値の型がポインタじゃないとして、それらが何故その根拠になるのか分かりません(>_<) >>648 文字列リテラルは定数なのでそれは分かります(>_<) char a[] = "A"; a+1 セーフ a++ これも文法エラー ポインタならばこれは通るけど、配列では無理 ポインタ変数にリテラルを代入した場合は...?(>_<) >>646 面倒くせえやつだな const char *p; printf("%u", sizeof p); //4 const char (*q)[2]; q = &"a"; //well-formed q = &a[0]; //ill-formed >>648 syntax errorじゃない semantics errorだ >>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 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる