C言語なら俺に聞け 143
レス数が1000を超えています。これ以上書き込みはできません。
「新スレッドは○番に書き込んだ人が立てる」みたいなガイドラインを
テンプレートに盛り込んだ方が安心じゃないかな。
前スレッドの終了まで新スレッド(ここ)が立たなかったし、
999番で「誰か立ててくれ」と書き込まれたのに応じて
「立てたよ、リンク先は…」と誘導に使われるべき1000番が
無意味な「あぼーん」で潰されたし。 前スレへのリンクがあって、スレタイにも番号がついてるわけで
1000いったら次スレなんて言われんでもわかるし望む者がいるから立っている
それだけのことで、別に何かする必要はないと思うな data8<7-0> にdata32<31-00>の中のdata32<07-00>を抜き出して代入したい
data8 = data32 % 256 ;
と書いてもコンパイラが素直に推論してくれません
キャリー処理のコードっぽいものをつけてきやがります
どうしたらいいでしょうか? あまりにも挫折者が多すぎる
教え方が悪いとか例題が少ないとかじゃねえのかと
変数とか言うふわふわしたモンがいきなり具体的なものになるから分かりにくいんじゃないのかね
メモリとかアドレスとかいきなし言われても分んねーよ、とかなるし
しまいにはアドレスの値だって気にかけなくなる
いきなり「変数は値と場所、二つの数字をもちます」とか言われると混乱するんだよ >>8
君の言いたいことがよくわからない。とりあえず全部日本語に翻訳してくれ。 ビットが取れればいいだけなら、data8 や data32 の型を符号無しにするだけで
いけそうな気もするが、よく分からん >>13
こーゆー事?
data8 = data32 & 0x000000ff;
適宜 cast してね printf で
data8 の実際の型にあった表示フォーマット使ってなかったとかのオチ?
(data8 の最上位ビットが足ってるとかサ- int *a = 0;
*a = 1;
これは入るけど1は入るん?0の番地って存在するん? >>16
ワープに成功しましたってメッセージが出る >>8
「リテラルの数値256での剰余だから結果の範囲は0-255、
unsigned char の範囲からはみ出す可能性はない」
ということまでコンパイラが見抜いてくれないってことだよね。
data8 = (unsigined char) data32;
てな具合に明示的なキャストで上手くいかんかな。
あるいはコンパイラの最適化オプションを強めにするか。 ちょっと勘違いしてました
>>8の質問はとりさげます
ちなみに%256の推論はしているみたいです リファクタリングして短いコード吐くかなと思ったら
がんがんループ展開されて元より長いコードを出すこともあるよね 希望的観測でタカをくくって結果を見もしないやつが一番悪い >>16
現代のマルチタスクOSではアドレスをずらしたりして0番地付近は見えなくされる
じゃなかったかな 物理0と論理0が違うってのなら、仮想記憶なOSなら
普通そうだよ >>16
ヌルポインタに関しては、なんかややこしい事情があるみたいね。
規格ではいかなるオブジェクトとも一致しない特殊なポインタってことになってるようだけど、
自分が使ってる組込み用のコンパイラではただの 0 になる。しかも0番地から普通の RAM なんで、
値も普通に格納される。
どうなるかは確認するしかないんじゃなかろうか。 >>20
32bitの範囲の数値を8bitの最大値で割るんだから
最大24bitの数値になるんじゃないの?
data8 = *(unsigined char*) &data32;
リトルエンディアンだと仮定するとこうなると思う すみません
剰余を除算と勘違いしていました
無視してください >>16
あるけど今時のだいたいのOSではアクセスすると例外発生してプログラムが停止させられると思う。
そうでなくてもCPUによってアドレス0付近が特別扱いされている事が多いのでアクセスできたとしても要注意だったりする。
なのでそういうのが必要な時というのはOSそのものやデバイスドライバを作る時ぐらいしかないと考えて良い。 最近ヤフー知恵袋で初心者なんですけど将来プログラマになりたくてC言語やってみたいんですけどどうですかって
質問が多いがプログラマが時代の流行になってきたか? >>31
おすすめの本やらおすすめの開発アプリやらおすすめのサイトやら学校のカリキュラムの評価やら色んな質問が多いしC言語やるならC#やった方が良いと思うんだけどなstring型ないだけで文字列処理とか大変だし不規則な空白・カンマ区切りとかの処理大変だし
そうゆうのを除外してくれる関数あるから楽なのになC言語はchar型で文字列操作してから処理しないとint型にしたりするのが大変だからな 義務教育のカリキュラムなもんで実用性の1側面に問題の作り易さもある
ペーパーテストにはうってつけだろC言語は 教育だと一般性ってのも考えなきゃならないからね。
次々出てくる「Cを改良したネット時代の言語」とかの新しいやつも
10年たったら別の新言語と置き換わってるかも知れないし。
その点、Cなら古くさくても基本として残ってるだろう。
資格試験はまた別だがね。時々変えないと商売にならん。 Cは一人でやるとちょっとしたミスで手も足も出なくなるから論外
右も左も分からない初心者に基本はC言語とか言い出すヤツは老害 package test;
class Test
{
public static void main(String[] args)
{
System.out.println("test");
}
} 組込やOS開発まで視野に入れるとCが一つの王道なのは間違いない
初学者にすすめるべきかと聞かれるとそれはまた別の話 >>35
それはお前が無能てだけだろw Cなんて仕様がコンパクトだから簡単だわ 実際に使うには多くの仕様外な環境依存のことを理解しないといけないから
C言語を勉強してもC言語は使えない 環境依存の部分はどんな言語でも影響受けるから結局は覚える事になるんじゃないのかな その前に開発環境を整えるのが大変だわプログラミングはできるけどそれぞれ出してる開発アプリがあるしその中で開発ツールだっけXNAやらwin32やらで解らんことばっかりや 大抵「C言語は何でも出来る」(嘘ではない)
に騙されるパターンだね キャリーを含む9bitローテートか
それとも含まない8bitローテートか 性能優先ならインラインアセンブリでCPUのローテート命令かねぇ。
移植性が大事なら正直にマスクしてシフトしてビットorで重ねる。
8bitや16bitならテーブル使えば両立できるかな。 苦C勉強してるんだけどファイルの辺りって重要?
あんま考えずにやってたんだが ストリームの概念はUNIX譲りの万能概念だから未来永劫絡んで来るぞ。 fdopen / fileno を理解すれば大体は困らないかと 初心者です。
4ビット目以降に文字(ASCII3文字)が格納されてる場合、どうやって取ればいいですか? char c1=data&0b000000000000000011111111000;
char c2=data%&0b000000001111111100000000000;
char c1=data%&0b111111110000000000000000000; ファイルとストリームを結びつけるのって、具体的に何がどうなってるんですか?
その辺りがわかるサイトや書籍があれば英語でもいいので教えていただけるとありがたいです long n = 12345678;
n >>= 4;
putchar(n & 0xFF);
n >>= 4;
putchar(n & 0xFF);
n >>= 4;
putchar(n & 0xFF); >>63
LinuxなどのオープンソースのOSのカーネル部分を読めばいい。
Windowsのカーネルは、非公開だが、ReactOSで近いものが読める。 >>63
これ普通はどうやって勉強すんだろうな 興味あるわ
おれはいきなりデバドラ書かされたんで理解を強制されたけど
あのへんの概念なしで腑に落ちる理解できるもんなん? >>65
なんでファイルとストリームの結びつきでLinuxカーネルが出てくるの? >>68
ストリームを作ってるのがカーネルだからだろ。 >>68
CランタイムならLLVMのlibc++か、GNUのlibstdc++を読めばいい。
カーネル見ずに読めればね。 >>60 0b...で2進数のリテラル表現ってできるんだっけ?
>>64 エンディアネスに対する配慮が…。 8進 16進はあるけど 0b... な2進リテラルは余所の言語じゃね? int bigendian(void)
{
union { int i; char c[sizeof(int)]; } u;
u.i = 1;
return !u.c[0];
}
この関数でエンディアンをチェックすれば? XScreenSaverから拾ったものだけど。 union endian_checker_union
{
int i; char c[sizeof(int)];
} endian_checker = { 1 };
#define IS_BIG_ENDIAN() (!endian_checker.c[0]) >>70
なんでC言語の話でlibstdc++が出てくるの?
fopenやらのストリームなんて、setvbufの説明読めばバッファリングしてるだけって理解できるだろ
カーネルやらlibcのソースなんて読む必要性なんてねーよ ストリームなんて、なんでもかんでも先頭から順番に処理するってだけの概念だけどな。
ランダムアクセスメモリーも読み飛ばしと巻き戻し駆使してアクセスするのさ。 >>75
こんなのどう?
#define IS_BIG_ENDIAN (htons(1) == 1) >>64
そういえばそれ、それでいいの?2回目以降は n >>= 8 では? >>79
それって、htons()のあるライブラリ間違えたら全く意味が無いマクロだよね? >>72
接頭辞0bは今どきのgccで普通に使えちゃうんだなこれが なので、質問者も回答者も 「ほんとはダメだけどgccならこうよ」
みたいな但し書きを一筆しとくべきだね >>82
ライブラリというか、ヘッダだな。#include <arpa/inet.h> とか。
コンパイラにもよるだろうけどだいたいはヘッダの中だけで #define されているか
ビルトインの関数に置き換えられるかインラインアセンブラになるか、適当に
うまいことやってくれると思う。(CPUが Big endian なら #define htons(x) (x) に
なってて何もしないだけになるかも知れない)。
それと一応 POSIX.1‐2008 のようなので使えるコンパイラは多いんじゃないかな。 今ってC言語でwin32とかで作るアプリに基本構造とかなしで作る感じなの? イベントを拾って条件分岐みたいな部分は全部関数内に隠蔽された。
今は決まった名前のコールバック関数を埋めるだけのお仕事。 実行時に必要なメモリーサイズが決まるようなプログラムだと必要。
最初から大きなメモリーを確保しても無駄になるかもしれないし、
当初想定したサイズでは足りなくなるかもしれない。
そういうときに使う。 組み込みでは1度大きく確保したら後は自前で中身やり繰りするから、あんまり使わない。 VS2017でやってるんだがファイル分割ってどうやるんだ Visual Studio 2017 Part4
https://mevius.5ch.net/test/read.cgi/tech/1509244956/
左のファイルのツリーで 項目の追加 で 新しく .c のソースファイル名指示すれば
勝手にコンパイルとリンクのターゲットにしてくれる (予定 >>94
組み込みって言ってもこの頃は最初から Linux 動いてるようなのもあるからな。
今は昔と違ってかなり自由度が高いのもあるんじゃないかな。 Linuxだからって、メモリーリークが無くなるワケじゃ無いからなぁ〜。 >>94
組み込みではどの処理にどれだけメモリを使うかは、
設計で決まるだろ。 組み込みって言ってもピンキリだからなぁ
車のエンジン制御とかなら>>100が言うような感じだけど>>97が言うようなLinuxが載ってる機器のGUI回りとかだとその辺かなりアバウト
テレビみたいにインターネットブラウザとか載せてるとそもそも必要量を見積もれないし https://ideone.com/lGSKsq
漸化式を使って組合せnCmの値を表示するプログラムです
数字を大きくすると正しい結果が出ないので困っています(例えば45C11
修正箇所教えてほしいです >>104
入力はそこまで大きい値を入れるつもりはないのでintにしました >>103
C言語の場合は、整数同士の割り算は整数の除算になる。例)3/2 == 1.
整数をfloatやdoubleにキャストしても情報落ちのため、浮動小数点数では正確な除算は計算できない。
https://ideone.com/aDJXNO >>106
gはnとmの最大公約数
あとnCmは必ず整数になるのでn-1Cm-1/Bの部分も小数にならず割り切れて整数になると思うんです
n=Ag m=Bg (A.Bは互いに素)として
n/m*n-1Cm-1
=A/B*n-1Cm-1 (※A/Bは小数になる)
= A*(n-1Cm-1/B)
=(n/g)*(n-1Cm-1/(m/g))
として計算すればうまく小数になるのを避けられるのではないかと考えました
すみませんC言語というより数学的な話で >>107
おそらくn/gは整数である。m/gも整数である。
では、(n-1)C(m-1)/(m/g)が整数であることの説明は? >>108
nCm (※整数)
=n/m*n-1Cm-1
= (A/B)*(n-1Cm-1)
= A*(n-1Cm-1/B)
・左辺が整数なので右辺も整数です
・A/BはAとBが互いに素(※最大公約数が1)なのでこれ以上約分できない分数です
ということは右辺が整数になるときn-1Cm-1/Bが整数です
B=m/gなのでつまり(n-1)C(m-1)/(m/g)は整数ではないでしょうか nCmが整数なので、A*((n-1)C(m-1)/B)も整数であろう。
しかし、((n-1)C(m-1)/B)が整数と判断するのは論理の飛躍だ。
n=2, m=2, g=1と仮定すると、A=n/g=2/1=1, B=m/g=2/1=2.
すると、((n-1)C(m-1)/B)=(1C1)/2となって整数ではない。 >>110
この漸化式は0<m<nという条件のもとなのでn=mの可能性はないです >>110
nCm が整数かどうかは別の漸化式
(n+1)C(k+1) = nC(k+1) + nCk
を使って帰納的に証明する >>111
ならば、大きな整数で桁あふれ(overflow)が起きているのかもしれない。
long longを使うか、多倍長整数を使うとよい。 >>113
うーんやっぱりそうですか
ありがとうございます (n*n-1Cm-1)/m
と計算せず
(n/g)*(n-1Cm-1/(m/g))
と遠回りして計算したのは掛け算より前に割り算をして桁あふれを防止するためだったのですが、これだけではまだ読みが甘いみたいですね k>nのときnCkはゼロになるはずだ。間違えている。 >>115
100!が何桁になるかわかっているか? 組み込みの整数使うより 多倍長整数使うような話だな 配列の四則計算かw
とりま、1桁辺り1バイトからやって行くと良い。
アルゴリズムは手計算方式で。 cでutf-8文字列の扱い方がよくわからないのですがどうすればいいのでしょう >>125
ソース中にリテラルで書く書式?
それともテキストファイルを読み込んでの文字列操作かな。
もしかしてWindowsでの扱い等の環境依存の話だろうか。 そーゆーのって、C言語じゃなくて、ライブラリの仕様なんで、環境わからないと誰も答えられないよな。 プログラム中で扱う時はiconv()で変換しちゃうと楽だな。Windowsは知らんがOSが変換やってくれなかったっけ?忘れた。 #include <stdio.h>
int main(void)
{
int x, y, z;
scanf("%d", &x);
y = x;
for (x = x - 1;x > 1;x--) {
z = y % x;
if (z = 0) {
x = 0;
}
}
if (x = 0)
{
printf("入力値は素数ではありません\n");
}
else
{
printf("入力値は素数です\n");
}
fflush(stdin);
getchar();
return 0;
}
素数判定用のやつ作ったんだが動かない
問題点教えてください fflush(stdin)は無意味
あとイコールが足りない 等しいかを比較するのは ==
if () の中であっても = は代入操作
× if (z = 0)
○ if (z == 0)
× if (x = 0)
○ if (x == 0) すいませんマジで==忘れてましたw
あとはif文でxの値に代入する数字を1にしたら直りました
やっぱ自分だけで考えてると基本なことにも忘れてしまいますねw おまえらバカにすることしか頭に無いのか
初心者ならこういうこともあるだろうに 古代においては、(1 == y)としておけば、間違って(1 = y)とした時にコンパイルエラーで発覚する、という言い伝えが有った。
>
>#include <stdio.h>
>
>int main(void) {
> int x, y;
> scanf("%d", &x);
> y = x;
> while (x % (y -= 1))
> ;
> if (1 == y) {
> printf("入力値は素数です¥n");
> } else {
> printf("入力値は素数ではありません¥n");
> }
>
> return 0;
>}
> >>140
あーそうだな。今でもたまにそう書いてあるソースを見かける。
いつも自分ではやってないので違和感があるw
まあでもCみたいな言語だと本当はそう書いておいた方が良いんだろうけどね。
そう言えばこの頃のコンパイラはifで代入だけしてるようなのは見つけて警告出してくれるな。 >>140の書き方はしないでしょ。
間違って(y=1)とすることが有り得ないから。
などと偉そうに言えるようなレベルじゃないけど、そう思う。 printfの、パラメータに置換される文字列の呼び名は何ですか?
%dや%cの総称です 英語だとformat specifier
日本語だと書式指定子とかそんな感じ リテラルには代入できないから、リテラルを左側へ書いておく
今は、MISRA-C で、100項目をチェックする事が義務化されているから、
違反は必ず報告される
でも、トヨタのように、5/100 しか取れない企業もある。
95も違反してるw >>140 の話は >>1 の参考サイトにも出てる話だね。
C FAQ 日本語訳 ttp://www.kouno.jp/home/c_faq/
17.4 に載ってる。
定数と変数の比較なら役に立つけど、変数同士の比較に使えないから
特に良くも悪くもない、という評価。
コンパイラがオプションを備えてるなら警告を出させるのが良いわな。 >>147
トヨタの例を見て分かるようにMISRA-Cは役に立たないという話か 全員が同じレベルで言語の仕様や処理系の実装を理解しているわけじゃないからなあ。
最底辺のレベルを合わせる為にMISRAのような約束事が有用であろう事は想像できるんだが…
俺、車業界のソフト屋じゃなくて良かったと思うわ。
いや、むしろ、いっその事、強制された方が楽か? 初心者です。
C言語には標準出力関数がいくつかあって気になったのですが、
puts("文字列");
puts("文字列");
puts("文字列");
などと書くのと、
printf(
"文字列\n"
"文字列\n"
"文字列\n
);
のように書くので結果は同じようになると思うのですが、速度やリソースの消費に違いはあるのでしょうか?
どちらが速いとかメモリ消費が少ないとかあれば教えていただきたいです。 >>155
printf() は重い。puts() の方が軽いしコード量も少ない >>157
stdoutがline bufferedなら、どっちもwriteが3回呼ばれる
言語規格的には解析処理のあるprintfのほうが遅そうだけど
これぐらい単純なprintfだと、gcc/clang辺りでコンパイルするとputsに最適化される
副作用諸々でputs自体の呼び出し回数を減らすことはないから、puts1回の呼び出しで済むprintfのほうが早い >>160
それはさすがになさそうだ…
printf()/vfprint() のCのコードを#include しているわけではなく、単にリンカがランタイムのコードをリンクしているだけなのでは?
いいかえると、printf() がCで書かれており、printf() もコンパイルするのなら最適化がかかるだろうが、さすがにそうじゃないだろう? >>162
はい、時代遅れ発見。LLVMとGCCはお互いに競争する形で最適化の技術を進化させているんだよ。 gccはビルトイン関数のprintfを持ってるのに、ライブラリをリンクとか何言ってんだコイツ ランタイムのコードをリンクか、どっちにしろアホ晒してるのは変わらんか >>167 のリンク先を読んだのだが…
printfで色々条件、最後が改行だったらputsに置き換え、は分かったけど
最後が改行でない場合はfputs( , stdout)に置き換えるわけにいかんのじゃろか? stdoutがフラッシュされるタイミングが改行だから拙いんじゃね PC で組むなら、たいした問題にならないリソースの心配よりも、
統一して見やすいように気を使うべきだろうね。 fputs(
"文字列1\n"
"文字列2\n"
"文字列3\n"
, stdout
); みなさんありがとうございます。
末尾の改行程度しかないprintfはputsに置き換えられるんですね。
ググってみたりもしたんですが、最近のPCであれば速度にほとんど違いが出ない様なことも書いてありました。
171さんの言う通り速度やリソースよりも見やすさや読みやすさの方が大事になりそうですね。
勉強になりました。 塵も積もれば何とやらで
すぐ砂時計だの輪っかだのになるのが
M$の作風 入力が入れる前に厳密にされてないとprintfは怖くて使いたくないなエラーになるし
プログラミング問題とかなら入るの制限されてるから使う時もあるけど 自動で実行ファイルが作成されてその実行ファイルが新しく実行ファイルを作ってその実行ファイルが…
みたいな無限増殖するウイルス的なやつって理論上作れるの?
作る気はないがファイル名を自動で生成して上書きするようしていったら全ファイルが空ファイルになるってのも可能なのか? >>177
GetModulePathName+CopyFileで誰でも作れる。違法。 >>177
全ファイルが空になるというのは、イカタコウイルス。可能だが違法。 やり方は直接は教えられないから、Win32APIスレで個別の処理のやり方を細かく質問するといい。 プログラミング全体に言えることだがreturnがよくわからない
戻り値とかはなんとなくわかる
戻り値を表示するわけだからprintf要らずなわけ? >>177
fork() してプロセス作るの繰り返すだけでいいのでは?ファイル作る必要あるか?
作ったとしてもそのファイルの内容は元のやつと同じなんだろ?
Windows の場合はどうするか知らない。fork() と同じような動きをするAPIがあるなら
それ使えばいい。(cygwinのライブラリ使えばいいか) >>183
君は return を何か別のものと勘違いしてはいないか? >>183
何か関数のコードをここに書いて、自分なりに説明してみ?
優しいお兄さんたちが説明のアラを指摘してくれるよ >>187
じゃホント適当なの
int main(void){
int a,b;
scanf("%d %d",&a,&b);
a=a+b;
return a;
}
適当に
基本自分はa=a+bの後の行にprintf("%d",a);って入れるけど戻り値を表示するだけならreturnで十分なの?って聞きたい >>188
main関数のreturnの値は0固定だろ。
正常に終了したかどうかを示す数値を返さないとダメなんだし >>188
それどこにも何も出力してないよ。一応 main() での return はプログラムを実行した側に
ステータスとして返されたりするがその辺はOSやmain()を呼ぶ側のコード依存だ。
で、それはプログラムの実行中で起きたエラーを伝えるためによく使われている。
0ならエラーなしで1ならエラーみたいに。つまり普通は計算結果を返すためには使わない。 >>189
0固定なの?
苦Cでmainじゃない関数で使ってたけど
よく分かんないな >>191
固定と言うか、昔からの慣習で普通は0返すように書くんだよ。UNIXでの慣習ね。Linuxでも同じ。
UNIXではシェルスクリプトで動かした時にエラーかどうかを判定するのに使うことがある。
(シェルの if 文等で直接使える。Windows のコマンドプロンプトでもほぼ同じ)。
0が返されたら正常終了で0以外がエラーね。
まあとにかく歴史的な問題でそうなっていると思って良い。そういう意味では main() からの
return だけは特殊なものだと思っていい。 >>188
return a; と書いても基本的にはaの値は表示されないよ。
returnは関数内で計算した結果を呼び出し側に返すだけ。
値を見たければprintf等を使って表示する必要がある。
呼ばれた関数内で(途中経過として)表示するか、
呼び出した側で(関数の結果として)表示するか、は目的次第だが。
main() はOS(WindowsとかLinuxとか)からコマンドとして呼び出される関数、
と考えると分かりやすいかも。
main() 関数のreturnの値はOSに返される。
返された値をどう扱うかはOS側の問題だわね。 return は表示装置に値を戻す(表示する)機能ではない >>191
「自作関数を作る」あたりのページで出てくるsum関数でしょ?
あれってただ単に今までmain関数で return 0 しかしていないから、例として同じように書いているだけだと思うよ。
「関数から数値を返す」のページまで行けば return num してるsum関数が出てくるよ。 print関数だけで表示するだけの関数とかならreturn0するけど衝突判定とかならbool型返したりするからな 自分が使っているPCなんかで、
処理を自動で行いたいなと思った時に、
それをC言語を使って実現出来るなら >>199
それ、OS固有のAPIの知識だらけで、Cがきちんと使える能力は測れない >>197
数年かけてLinuxカーネルを読破できたら コールバック関数の型宣言とか、
関数ポインタの扱いを難無く出来るか?
とかかな? p = p() で駆動するようなステートマシンで
自分のポインタを返す関数 と それを保持するポインタの宣言とか >>200
「きちんと」とか書いてない要件を作り込んでバグだらけのコードを量産する自称玄人乙 ポインタがわからないです
メモリのアドレスの最初を配列に入れて
呼び出すときそのアドレスの最初を読み込んでデータを引き出すということなんでしょうか? すいません
本当に無知なのでアドレスがよくわかりません
バカにもわかるように教えていただけると嬉しいです ポインタの説明で、何かに例えて説明しようとすると余計に混乱する宿命。 コンピュータの中には何百メガとか何ギガとかのバイト数のメモリがあって、
データ(数値や画像や文字列、プログラム自体も)はメモリに記憶されていて、
メモリには1バイトごとに連番のアドレスが割り振られている。
…程度のイメージなら現代じゃ誰でも共有してると思うんだけど。
女学生が携帯電話機を使ったり、子供がゲームをする時だって、
「メモリカードの容量が足りなくなった」とか言うでしょ。
それとも、容量としてのメモリ(どれだけ入れられるのか)は飲み込めても
アドレスという概念(どこに入ってるのか)になると飛躍が必要なのかな。 アドレスが住所の意味で、小人さんひとりひとりが住んでる場所を表してて、お手紙を出したりもらったりするのに使うんだよ?
でok? いわえる宅急便で品物の上に貼るあれよあれがないとどこに送れないか解らないっていうあれ RAMやROMにデータがどう書き込まれているのかイメージ出来ているのかな? >>211
本屋さんへ行って「C言語ポインタ完全制覇」って本を買って読もう
それが一番近道だと思う >>213
じゃあまあざっくりと集合住宅で例えるか
例えば char hoge; と宣言したとする
するとコンピュータは空いてる部屋を1つ、hogeのために割り当ててくれる
仮に部屋番号を301号室としようか
広さは四畳半のワンルーム
君はこの部屋に、'a' でも 'x' でも好きな文字を入れることができる
次に char piyo; と宣言したとする
そしたらやっぱりコンピュータは部屋を割り当ててくれる
部屋番号はhogeと別にしないと被っちゃうから401としよう
間取りは同じ、四畳半のワンルーム
君がchar型の変数を宣言する限り、広さは常に四畳半だ
更に、int foo; と宣言してみよう。
同じように部屋を割り当ててみるが、困ったことにfooは身体が大きくて四畳半に収まりきらない
これはfooがchar型ではなくint型だからだ
そこでコンピュータは隣の3部屋の壁を取っ払って、計4部屋分の広さにしてfooに割り当てる
最初に与えられた部屋番号を501とすると、fooは501,502,503,504の4部屋を占領することになる
このそれぞれの部屋番号が、いわゆるアドレスだ
つまりまずコンピュータに膨大な数の部屋が用意されてて、変数宣言や関数宣言などをするごとに適宜空いてる部屋を割り当てていく
そのときに割り当てられた部屋の部屋番号が、その変数なり関数なりのアドレスとなる
fooみたく複数のアドレスにまたがってる場合は、その先頭アドレス(今回でいうと501)がfooを指定する際のアドレスになる
変数名からその変数に割り当てられたアドレスを知るには、&を使い&hogeや&fooと書く >>213
一応考えてみた
アドレス= 住所だと考えて
どこでもドア = ポインタ変数そのもの
行きたい場所 = 参照先のアドレス
として
・自分の部屋にどこでもドアを置く = ポインタ変数を宣言する
この時のポインタ変数のアドレス(ドアの置かれてる場所)は自分の部屋
今はまだドアの向こうはどこにも繋がっていない
・どこでもドアの向こう側をしずかちゃんの風呂場にする = ポインタ変数の中身を参照先(しずかちゃんの風呂場)のアドレスに書換える
これでポインタ変数の中身(=ドアの向こう側)はしずかちゃんの風呂場と繋がる
・ドアを開けて風呂場を見る = *を付けてポインタ変数にアクセスする
・ドア自体がどこに置かれてるかを知る = &を付けてポインタ変数にアクセスする
ポインタの嬉しい点はわざわざしずかちゃん家に行かなくても自分の部屋に居ながら
どこでもドアを介して風呂場を覗く事が出来るので移動の時間が省けて時短になる ポインタを説明するときにアドレスで説明するのって、初心者による初心者向けの説明に多いけど
それはアドレスを知ってる人向けで、ここからさらにアドレスを一生懸命別の何かで
例えるのはかえって分かりにくいだけにしか思えない 喩えるんじゃなくてメモリそのものを教えたほうがいい >>211
マイコン小僧的な意味での理解が必要かもしれないなあ
ポインタ定義した時点で、コンパイラが「アドレスを入れるためのメモリ領域」なり
「CPUのレジスタ」なりを使うようにしてくれる
貴方が int* a = 300; とか書いたら、 コンパイラは300という数字をどこかに保存しておいてくれる
CPUのレジスタか、特定のメモリ領域かは処理系次第だが
で、計算やるってなったら「CPUの間接参照機能」を利用する
アセンブラ側で「間接参照機能を使え」って感じのコードを吐くのよ
そういうオペコードがある
で、間接参照機能を使った場合、CPUはメモリの内容を2バイトか4バイトか見るでしょ
CPUは「今読んだ数字はメモリの番地である」と判断して
CPU側でいてあるメモリ番地の内容を読み込む
で、読んだデータはコンパイラが吐いたアセンブラのコード次第だが
とにかくCPUには「ある数字をメモリなりレジスタから読み、次にそこに書いてた数字をアドレスと判断し、別のメモリアドレスを読む」って機能がある
それを使うのがポインタ
そんな感じ そんな間接参照なんてないです、って処理系もあろうが
Cコンパイラがアセンブラレベルで ご ま か し ま す
ってな話かと 眠い時に書くとろくでもねぇ文章になるわーすまん
とりま「CPUの間接参照」で調べてくれ、そっちのほうが早いかも知らん アドレスについては……
Q: たとえばここに 1 2 3 4 って数字があるとするでそ
二番目を起点にして、二つ指差してみて、起点は指差しの対象に含むよ
A: 指差す箇所を[]でくくると 1 [2] [3] 4 になるかと
そんな感じのテキトーさでいいと思います、これがただ例えば0x000F34824になるだけで アドレスはアドレスだろ。何にもたとえちゃいねーよ。まんまだよ。 なお、ポインタのだいたいの使い道は
・クソでかいデータを複数の関数で参照せなあかんとき(画像処理とか)に先頭アドレスだけ渡してあとよろしこって奴
・呼び出し「先」側でなんかセットアップしてもらわなあかんとき、Win32APIあるある
・関数テーブル(30だか50だか、個別に使う関数の先頭アドレスと、そこに飛ばす条件をペアにした配列があるの)
・無名関数もどきのことをやりたいとき、一部分だけ後付け処理やりたいんでそこだけjmpさせて戻る系の奴というか、sortみたいなの
のどれかやな、こんくらいの説明でいいんだろうか? イミフすぎて正直すまんかった コンピュータの内部構造をどの程度知っている人が相手なのかで説明方法を変えた方が良いように思う。 TTLロジックICでアキュムレーター組めるくらいなら…
…あ、多分説明自体不要かw 初心者は一度バイナリーエディタやメモリエディタを弄ってみることを進める・・・と無責任に言ってみる。 8bitマイコンみたいなやつだと説明は少し楽になるな。メモリ空間が64KBしかないし。
まあ昔はそれでもバンク切り替えして沢山メモリ使えるようにしていたが、考える上では楽だ。
今はメモリ空間も広大になってメモリブロック切り替えてアドレス変わるのは当たり前だったりして説明が面倒だ。 >>246
初心者相手なら論理アドレスで説明すればいいだけ
アドレス変換とかの説明はもっと後でいいだろ ポインタの前にアドレスが理解できないってどういうことよ…
アドレス=メモリ上の位置、だよ
例えば64kbのメモリを積んだ機械ならアドレスの全範囲は0x0000〜0xffffだが
そんなこと気にしなくても使えるようにしたから高級言語なのよ
int a;
int *pa;
としたとき、コンパイラはaとpaそれぞれを上記範囲の"どこか"に割り当てる
その"どこか"をaやpaという名前で呼ぶことにするよ、という宣言だから
ただし「変数は"どこか"のアドレスの別名である」ということを"利用"することはできる
pa = &a;
とすれば、paには「aの実際の場所(=アドレス)」が入り
*pa = 123;
とすれば、paが現在指しているアドレス、即ち「aの実際の場所」に123が入る お前らが箱とか部屋とか変なこと言いだすから初学者が混乱するんだろ。 ニモニック表片手にハンドアセンブルしてみろ
そうすりゃアセンブラやコンパイラがなにしてるか
馬鹿でもない限りいろいろ分かる 自分は二重ポインタってのが分からないです
アドレスの入るアドレスがあるなら
アドレスの入るアドレスの入るアドレスもあるんですか? アドレスを記録位置と言い換えてみたらどうだろうか。 メモリーを記録装置、メモリー上のバイトを記録素子、アドレスを記録位置。
どうだい。 変数の位置(アドレス)を示す変数 = ポインタ
そいつ自体も変数だからアドレスを持ってるしポインタも持てる 記録位置の入った素子の位置が入った記録素子。
これなら有りえるとすぐわかる。 物理的な描像にするな。
論理的な本質部分を説明しろ。 >>265
メモリー上の位置でいいんじゃね?
これがイメージできなきゃ無理 >>262
ある
3重でも4重でもいくらでも
一般的に使うのは2重までだが ○重ポインタという言葉はあまりオススメしない
いくら重ねようが「〜へのポインタ」だ
int a = 123;
int *pa = &a; /* 「int型」へのポインタpa */
int **ppa = &pa; /* 「int型へのポインタ」へのポインタppa */
int ***pppa = &ppa; /* 「int型へのポインタへのポインタ」へのポインタpppa */
参照のイメージ([アドレス][値])
[a][123]
[pa][&a] -> [a][123]
[ppa][&pa] -> [pa][&a] -> [a][123]
[pppa][&ppa] -> [ppa][&pa] -> [pa][&a] -> [a][123] 確かにポインタは2重以上はなるべく使いたくないな。混乱するし。 そうだなポインタを文字列の格納だけに使うならアドレスは関係ない
int型で変数を操作するとかなら話は別だけどな 二重以上には二重も入るのだが、本当にそれでいいのか? 二重ポインタって言い方が紛らわしい
「ポインタが二重」って意味が通じない。
もともとは * が2つ付いてることを二重って言ってるんだろうけど ポインタは型ではないので、二重のポインタという言い方はあり得るのではないか。 ポインタの配列 配列のポインタ ポインタのポインタ >>279
「なるべく使いたくない」だからいいんじゃね int型へのポインタに対するchar型へのポインタとかあるのなら紛らわしいという主張も理解できるが。
そんなものは無いので。
***を三重のポインタというのは合理的に見える。
どうだい。 int型へのポインタ型へのポインタ
char型へのポインタ型へのポインタ >>284
15年前大学で4重ポインタの地獄を目にした >>288
研究課題で先輩が作ったライブラリのプログラム
それを使って成果を出すのが自分の卒論… 3次元配列を生成して引数に書き戻すような構造なのか
4次元配列を生成して戻すようなのか
各次元で大きさが固定なら 1次元配列にして 添え字演算で4次元にしちゃうな リスト構造とかツリー構造とか、繋げたり外したりすんのに使うよな? x,y,z座標表すのにint***を使ったことがある 2重以上になりそうなときは構造体にまとめちゃうからなぁ。 >>294
多分、階層の方がわかりやすいだろうね
int ***p; というポインタ変数pで p[x][y][z] とすると、
*(*(*(p + x) + y) + z)
を参照する。このあたりを分かりやすく言えるといいんだけど 同一ファイル内の関数を単体で自動化テスト出来る何かスマートな方法はないものか
他のテスト周りで小回りが効く言語と比べると単体テストがお辛い >>298
惜しい。C++だったら、コンストラクタでオートメーションできるのに。 >>295
三次元扱うと***pくらい何て事無いよね 構造体のメンバーの構造体のメンバーの構造体のメンバーのつもりで
ポインタのポインタのポインタとかいい気になって使ってたら、
エクセプションの嵐でワラタw 正しい指し先を格納してるかはコードの書いた奴の責任だからね
言語で保障してくれない 有名な言葉思い出した。
プログラムは意図した通りには動かない、
書いた通りに動く。 ハードがまともに動いている前提でな。
タイマーLSIにall0ぶち込むなんてのはどこのマニュアルにも
書いてないバッドノウハウだろうに >>298
google testとかcpp testとか使えば? 三次元配列を扱うのに三重ポインタが出てくると思っている池沼がいるな まあ、Cは次元とかオフセット計算が掛け算になるだけだからな。
何次元にしようとリニアな配列のままさ。 俺はポインタを諦めて、構造体配列のインデックスでリンクするリスト構造を作ったわ。 誰かが書いてあって気になったんだけど
double a;
scanf("%if", &a);
ってf単体じゃないの? long double は別物として実装していない? scanfでは、floatが%fで、doubleが%lfだ。printfでは区別がない。 cでUTF-8のファイル読み書きとデータの取り扱い方が分からないです
もしかしてできないのかな? 調べるとすぐにwikipediaが出てきたよ
https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%96%87%E5%AD%97%E3%81%A8%E6%96%87%E5%AD%97%E5%88%97#Unicode.E6.96.87.E5.AD.97.E3.82.BB.E3.83.83.E3.83.88
文字を「L"」で囲むとその文字を表現するワイド文字型の数値となる
Unicode文字セットでは、標準ライブラリの関数を使う前にロケール(地域)を設定する必要があり、また、Unicode用の関数を使う必要もある
// wchar_t型
wchar_t wc = L'a'; // wchar_t型の変数wcに文字L'a'を格納
_wsetlocale(LC_ALL, L""); // ロケール(地域)を設定する
wprintf(L"変数wcに格納された文字は%c", wc); //wcを文字として表示
wprintf(L"変数wcに格納された数値は%4x", wc); //wcを数値として表示 だから、文字セットはライブラリの範疇だからC言語スレで聞くなよ。
おまえが使ってるコンパイラのスレにでも行け。 何したいかによるんじゃね
素でもそれなりには扱えるし、不十分ならライブラリ探してもいい
どうしても無理なら慣れた文字コードに変換すればいいけど、こっちは一部文字情報が欠落するかもね エンコーディングにかかわらず、ただのバイト列だからchar*でいい 次のC規格でそろそろ文字を扱う関数全てunsigned charに変更してくれないかな
utf8でもsjisでもだけど1バイト目の判定でいちいちキャストするのが不毛すぎる
賢明なプログラマならcharなどというプリミティブ型をそのままの名前で使わずちゃんと
typedef char str_t;
とかしてるはずだし、してない愚者はもうシステムもろとも切り捨てていいだろう
-1が欲しいために結局intに拡張されるんだからcharの時点では符号は不要なんだよ C#みたいにbyte型作れば?
それかマルチバイト型 >utf8でもsjisでもだけど1バイト目の判定でいちいちキャストするのが不毛すぎる
いまどきそういうencoding依存のコードをそんなに頻繁に書いているんだとしたら
それ自体が不毛な気も。 文句たれてる暇があるなら1バイト目判定関数でもつくれば ファイルサイズ測定
↓
そのファイルサイズ領域を動的確保
↓
そこにutf-8の文字列を順次格納
みたいなプログラム組んでるんだけど
ファイルサイズ/sizeof(wchar_t)と中身の文字の数って等しくないの? UTF-8をそのまま扱うんなら、/sizeof(char)じゃね?
UTF-16やUTF-32に変換したならデータサイズが違うけど。 UTF-8 は データサイズから文字数を求めることはできない やっぱり1文字づつ読み込んでって文字数カウントするしかないか >>333
記憶するのに必要なメモリの量は読み込んだバイト数でいいけど
「1文字に要するバイト数が可変」なので
「文字数」をカウントするとなるとそうせざるを得ないね 暇つぶしで気になったんだけどC言語でもOSは作れるだよな、でも制御とかでコンピューターをちゃんと理解してないとやっぱ作れない? FreeDOS、Linux、ReactOSなどのオープンソースなOSは、ソースが見られるから参考にするといい。
例えば、OSで並列処理をしたい場合は実際のCPUの知識が必要になるし、OSをCD-ROMからインストールしたい場合は、CD-ROMのファイルシステムの知識が必要になる。
OSを便利にしたいなら、それなりの知識が必要になるのさ。 モダンなOSは巨大化・複雑化しているから、一人ですべてを把握するのは難しい。
必要な機能を分割統治して、ライブラリなどによってブラックボックスとして実装するのが一般的。 >>336
OS自作入門とかいうそのものズバリな本があるよ
勉強目的なら割りとオススメ モダンでなくても、C単体ではシステムコールとCPUステータスに
関わる部分が書けないので、100%は不可能。
asm文とか使うなら別だけど。 なお、OSで商売したいなら、著作権のトラブルをクリアしないといけない。
マイクロソフトやグーグルのようにOSを売るのは至難の技だ。 パソコン向けじゃなければ、日本企業でもOSを開発しているところはある。
どんなOSを開発したい? あとメモリ上に読み込んだバイナリデータをwchar_tの文字列に変換することは可能でしょうか? ただC言語の本にアセンブリ言語またC言語でもOS作成可能ってあったから気になっただけ
他の言語もコンパイルして機械語にするからC言語も間接的な言語しかないのかなって疑問に思っただけ 嘘ついてるかもだけど、wchar_tのたぐいって、使うとはまる奴じゃなかった?
文字列はcharオンリーな今日この頃。
cpu限定すれば、変換はいけるんじゃない? ワイド文字だと場合によってはエンディアンを気にする必要があるのと
結局>>334は避けられないあたりを忘れなければハマることはないかと OSのコードを書くのってC言語のインラインアセンブリが使われてるんじゃないの? インラインなんかほとんど使わない
アセンブラが必要なところはガチのアセンブラを使う
量にして全体の数%ってとこ >>339
あれかなり良いけどフロッピー使うし作るOSもかなり独特だからモダンな感じでもう一冊くらい書いて欲しい >>330
UTF-8 とは何か?
そして wchar_t 型とはなにか?
まずはこの2つについて徹底的に調べると君の頭は少し良くなると思う。 >>336
OS作れるどころかOSを書くために作られたような言語がCだよ。UNIXな。 mallocとかcallocでNULLが帰ってくる原因が分からない
メモリも十分あいてるしfree忘れもないのに おれの昔使ってたシステムでは、free忘れじゃなくて、mallocしたアドレスを2度freeしたり、もしくはmallocとは全然関係無いアドレスをfreeすると、
その後のmallocでおかしな動作をすることがあった >>362
おそらく、そういう系だろうな
どこかで未定義の動作をやらかしてる ゲイツOSかどうかには関係ねえぞ
malloc/freeが空き領域をどのように管理しているかの実装の問題だ 解決した
不定のポインタに対して代入
変なとこ書き換えたせいでmalloccallocに失敗したみたい また別の問題が・・・
メモリ上にある時は問題ないのにwprintfで表示するときに文字化けする >>374
visualstudioのメモリの中覗く奴
>>375
main関数でやってる >>378
chcp 65001をsystem関数で実行してる system関数で出来る子プロセスは、別プロセスだから、現在の画面出力には影響しないと思う。 解決した
関数の中で宣言したwchar_t の配列buff[20]のポインタを返してそれを表示してたんだけどそれがまずかったみたい
スコープから抜けた瞬間に解放されちゃうみたい
無知だったわ申し訳ない buffの中身をmallocで確保した所にコピーしたのを返すことにしました >>382
GC言語使ってた奴がよくやるパターンだ。ドンマイ。
>>383
それだと後でいちいちfreeするのが面倒だろ。
普通は呼び出し元で buff[20] 確保してポインタを渡し、子関数内でそこに書き込む。
なおどうしても値返しで組みたければ、structならreturnで値返しできるからくるめばいい。(はず) char* hoge(){
char buff[20];
strcpy(&buff[0], "何らかの処理");
return &buff[0];
}
int main(int argc, char* argv[]){
char* str = hoge();
printf("%s\n", str);
return 0;
}
多分、こうなってたんじゃないか?
配列は、自分で管理すべきだよねー。
void hoge(char* const str){
strcpy(&str[0], "何らかの処理");
return 0;
}
int main(int argc, char* argv[]){
/* char str[20]; */
char* ptr = nul;
/* ptr = &str[0]; */
ptr = (char*)malloc(sizeof(char) * 20);
hoge(ptr);
printf("%s\n", str);
return 0;
} 意味は同じだし最適化されるからどうでもいいことではあるが、
そこの &str[0] は単に str と書くだけでいいんじゃないの?
見やすさの点からも受け取る部分が char *str ならそのまんま
str って書いておいた方が分かり易いと思うんだけど。 初心者はこれだけ守ってれば良いかと
処理対象のメモリは呼び出し元で確保、alloc-freeで処理をはさむ
処理の戻り値は基本intでエラーコードを返す
ローカル変数は16k未満、可変長配列は使わない
>>387
そんなことはない > 処理の戻り値は基本intでエラーコードを返す
malloc先生やprintf先生を見習ったら違反だな
> ローカル変数は16k未満、可変長配列は使わない
何だそのマジックナンバーは?? malloc に限らんけど、ポインタを返す関数は
失敗の場合にNULLを返すってのはまぁ基本だね。
線形リストの探索、見つからなければNULL、みたいに。
printf の返り値はintだから一応は >>388 の方針通りじゃろ。
成功なら非負の値、失敗したら -(エラーコード) が返る、
と決めておけば何かと使いやすいわね。 >>390
ちょw
printfの仕様を知らんのか エラーはnullとか-1とかの正常時には戻らない値
エラーコードは errno 見ろよ
って言うのが以前のお約束だった気がするけど printf("%d",printf("1*2*3=")); printf() の man page 見てもエラーの時は負の値を返すとしか書いてなくて errno に何か入るとは書いてない。
まあ、実際には中で putchar() と同等な事をするだろうからその中で使われる write() で何か書かれるとは
思うがその辺は保証されていないので使えない。(書き込み時のエラーではないかも知れないしな)。
GNU の asprintf() もエラー時は -1 を返すのみで errno については何も書いてない。
それと snprintf() のような結果を書き込むバッファの大きさを指定できるやつはバッファを使い切った場合の
エラーの返し方が違う。 条件が
文字列の長さ
文字列比較
でソートしたくて2回forで回してます
流石にこれでは件数が増えたときにとてつもなく遅くなるので1回のforだけでやる方法を教えてください >>396
普通にソートすれば、長い方が後に来るんじゃね? 条件を変えて2回まわしたら1回目のソートは(ほぼ)意味がないんじゃない?
(順位を保つソート法なら 多少意味が出てくる: qsort はその保障はない)
qsort の srot_cmp の記述で
比較すべき それぞれの要素 c1 と c2 を多重に比較すればいい
・「文字列長さ」で比較し 違うなら大小関係を返す→
↓
・(上の比較が等しいので)「文字列」比較し 違うなら大小関係を返す→
↓
:
↓
・(上の比較が等しいので)等しいと返す
これならソートは1回だけ https://i.imgur.com/rkQ9ns8.jpg
この2.の(2)の総ステップ数って
f=1で1回、for文内でn回で、T(n)=n+1
であってる?
なんか授業でやったときは3n+4だったか4n+3だったかそんな数字だったと思うんだが求め方がよく分からん >>399
f=f*i の部分は四則演算1回と代入1回だから2ステップなのでは? f=1 代入1回
for(i=1;i<=n;i++) -> for(i=1;i<=n;i=i+1) 代入1回; 条件判断n+1回; 四則演算n回、代入n 回
f=f*i; 四則演算n回、代入n回
なので合計 5n+3 ステップかな、i++ を1ステップとする処理系なら 4n+3 とか。よくわからんけど >>401
いまどきオプティマイザあるからどっちも同じアセンブルコードになる悪寒 i++ を1ステップ勘定するか 2ステップ勘定するかは悩ましいけど
分解して 四則演算の1 + 代入の1 計2ステップ の見積もりするのが妥当なんかな
題中にインクリメント演算についてのステップ数は明示されてないし i++みたいにハード的にありえない(メモリは加算機能を持たない)ことは
マイクロコードで実現しているわけで、1ステップなわけがない 単体のi++は無駄だから++iにしろってばっちゃが言ってた じっちゃんはそんな差は最適化で消え失せるって言ってたよ ++は対象がレジスタに乗ってるときに1命令だろ
とくにアドレスレジスタの場合に *p++ をポストインクリメントレジスタ間接アクセス命令にそのまま置き換えられるから、
オプティマイズがまだ発達してなかったころに重宝したはず そのバヤイは0.5命令だね
* と ++ を同時並列でやるわけで >>411 実際のマシンとは関係のない、問題のための問題だから
問題を作った人の答えが正解というルールは仕方ないとして…。
i++ が1ステップなのか2ステップなのか、という疑問が出るスレッドで、
f = f*i はまとめて1ステップです、という解説が現れるのは予想外だったわ。
f*i が四則演算で1ステップ、fへの代入でもう1ステップ、と思うよね。 単純に行数で示す場合もあるし
いろいろだよ
重要なのは計算オーダーと実測値
ステップ数は計算オーダーを見積もる為の道具で
定数倍はわりとどうでも良い
計算量をもっと正確な値を知りたい時は
加減算○回、乗算○回、除算○回
など、より具体的な値とする 末尾に/が入っていたとき全て削除したいのだけどどうすれば簡単に実装できるだろうか
データはcharの配列に入っている
ex
aaa.txt
aaa.txt/→aaa.txt
aaa.txt/////→aaa.txt あとsystem関数の戻り値の判定に悩んでます
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/system.3.html
上記参考にしたら四つのケースに別れていて
下二つはwexitなどのマクロで取得可能
上二つの内ひとつはnullチェックで弾くこと可能
残りは子プロセス作成失敗の-1で網羅できてると考えているのだけど間違ってるのかな?
やりたいことは
system関数のコマンドライン実行したアプリのステータスコードを取得したい。そのためにマクロ使ってる
ただ子プロセスの取得云々の前にsystemの結果判定必要なんでは?と指摘を受けて修正してるのだけどsystemの返す値がさっぱりわからなくて困ってます >>419
ごめん略してたけどもフォルダもあるんだ
/xxxx/yyyy/aaa.txt
みたいな
その関数だとこのパターンは処理できない?できる? 俺様専用脳内マシンは1ステップ命令に変換するんだから1ステップなんだ!!
アホらし。 >>420
末尾の/を取り除きたいのか、頭のファイルパスを取り除きたいのか、よく分からないけど、/を区切り文字として文字列を分割さえしてしまえばどうにでも出来る gcc -lライブラリ名 hoge.c
stdio.hと同じフォルダに自分が使いたいヘッダーファイルが存在してるのに
いちいち-lライブラリ名ってしないと参照できないんです
どうしてstdio.hは-lstdioって書かなくても使えるのに自分がインストールしたヘッダーファイルはいちいち-lで指定しないと使えないんでしょうか?
すか? >>417
if(配列[strlen(配列)-1]=='/') 同=0;
をループで回せ。 null-endと仮定するなら普通にこれで良い
int i;
for (i = strlen(配列) - 1; i >= 0; i--)
if (配列[i] != '/') break;
配列[i+1] = '\0'; >>423
スクリプトかバッチを作ればいい
たとえばmycc.batというファイル名で
gcc -lライブラリ名 %*
と書き込んでおいて
mycc hoge.c
とやる >>423
標準ライブラリオブジェクトはスタートアップファイル(crt0)に組み込まれていて自動的にリンクされる
標準以外のライブラリオブジェクトは明示的にリンクしないと使えない >>415
> f*i が四則演算で1ステップ、fへの代入でもう1ステップ、と思うよね。
f と i がレジスタなら大抵のプロセッサで1ステップだと思う まあ、先の問題については、ステップの厳密な定義が読み取れないし。
回答者の説明に矛盾がなければ○でいいと思うわ。
それでも誤答とされてしまったら、出題者がウンコだと思って忘れるレベル。 スクリプトとかならまだしも
Cで末尾の/削るためだけに正規表現とか持ち出すのは馬鹿だと思う replace("/$","");//うろおぼえ
なんでよ簡潔にかけて最高じゃないか
正規表現は心の友
すぐ忘れるけど >>435
末尾に連続する'/'が有ったら、消さないと http://codepad.org/EdvPBWAl
こんな感じか?
静的文字列の時は編集可能な形で渡して >>435
>>428はGnuWin32って名前から察するにPOSIXのregexだろ
置換なんてないから、正規表現コンパイルして検索して自分で書き換えるんだぞ
正規表現の置換を呼び出し一回で済ませられるような関数が
ANSIとかPOSIXにあるなら良いけど、そうじゃないだろ std::regex_replaceってちがうんか? は?
C言語のスレでC++を持ち出してきて何が言いたいの? >>417
こんなのはどうかなあ。
char *s が元になる文字列へのポインタ。p は char *p。
for (p = strrchr(s, '/'); p && p >= s && *p == '/' && ! *(p + 1); *p-- = '\0'); >>418
こんな感じかねえ。
if (cmd) {
int s = system(cmd);
if (s == -1) {
// 子プロセス作成失敗またはステータス取得失敗
} else if (WIFEXITED(s)) {
// 子プロセスは正常に終了した。
int es = WEXITSTATUS(s);
// es の内容が子プロセス側での exit(es) または return es
// これはたいてい 0 以外がエラーになっている。0なら成功。
} else if (WIFSIGNALED(s)) {
// 子プロセスはシグナルで中断して終わった。
// (人が Ctrl+C をキーから押したとか、kill したとか、プログラムバグってて core dump したとか 0 で割ったとか)
// シグナルの意味は signal(7) の man page 見るとわかる。
int sg = WTERMSIG(s);
// sg にシグナル番号が入る。
}
} >>431
f = f*i を f *= i と解釈して1ステップか、それもありうる。 >>445
それもありうるって言うかそうでない処理系の方が珍しいだろ 元の問題が、演算と代入とそれぞれ1ステップって書いてあるんだから
そこを議論しても意味がない 面倒くせえ奴らだなあ。。。
//aho.cpp
extern "C" char* regex_replace(char* str, size_t n, char const* pat, char const* put) noexcept
{
try
{
string buff{str};
buff = regex_replace(buff, regex{pat}, put);
strncpy(str, buff.data(), n);
return str;
}
catch(...) {}
return nullptr;
} //baka.c
char* regex_replace(char*, size_t, char const*, char const*);
int main()
{
char buff[100];
while(fgets(buff, 100, stdin))
if(regex_replace(buff, 100, "/+$", "")) puts(buff);
else puts("error");
} rem test.bat
cl baka.c aho.cpp /EHsc && baka
ったく世話の焼ける(ぶつぶつ 初心者です、教えていただけませんか?
大文字の配列を小文字にするコードなのですが
1 int main(){
2 int i;
3 char str[]={'A','B','C'};
4
5 for(i=0;i<3;i++)
6 {
7 str[i]=str[i]+'a'-'A';
8 }
9 return 0;
10
11 printf("答え \n");
12 for(i=0;i<3;i++)
13 {
14 printf("%c\n",str[i]);
15 }
16 return 0;
17 }
を実行すると 「Info: Nothing to build for Hello」 となります。
5行目から9行目までを削除して実行すると答えは大文字で「ABC」となります
5行目から9行目の文法がおかしいと思うのですが何処がおかしいのかわかりません
誤っている個所をご指導頂けないでしょうか?よろしくお願いします。 >>453
9行目のreturn 0;でmainから制御を戻しているから、以下は実行されない。 >>454
ありがとうございます。とても感謝してます。
戻り値とmain関数の関係を調べてみます。
大変にありがとうございました。 >>455
9行目のreturnでmain関数が終わってしまっていたのですね
ありがとうございました! ちよわw
机上デバッグなりステップ実行なりすりゃいいじゃんみたいなんばっかりだな。 >>447
正解は>>411らしいしまともなら知識を持ってたら普通に同意する内容だし mmap の page fault で割り当てられたページフレームってスワップアウトとか発生した時にドロップしたりしますか? >>461
mmap で割り当てた物理メモリは munmap、プロセス終了時以外にも解放される契機はあるのでしょうか?
madvise の MADV_SEQUENTIAL で解放するとか書かれてますが、ソース見てみるとフラグ的にはノーマルと変わらない処理してるみたいなんですよね 結局何を聞きたいの?
mmapで割り当てた仮想メモリが解放されるかどうかであれば、解放されない
物理メモリの話なら解放される
madviseが実際に指示通りに動くかどうかは実装次第だけど
一応LinuxとかはMADV_DONTNEEDで物理は解放できる
というか、これはC言語の話じゃないから各環境のスレで聞け >>465
mmap 時の物理メモリ使用量とその変化を知りたかったんです。
結局非DIRTYなら物理メモリは解放されることあるんですね。
ありがとうございます
一応linuxの場合で考えてました
ホットで適当なスレが見当たらず、一番mmap使いそうなcスレでいいかと
失礼しました >>466
一応一般的には
非dirtyならまだ物理メモリは割り当てられてない、が正しい
物理メモリの再利用についてはdirtyでもswapがあれば行われる(そのためのswap) コーディングの仕方的な教材になる本あるかな?
コーディングとはこうやって沿っていくと良いよ的な本
それを読んでからテクニックの本を読もうとしてる(effective) >>467
つまりreadonlyでmmapし場合、dirtyにならないから物理は割り当てられないと
すごいな 割り当てられてないメモリーにアクセスするとページフォルトが起きてから
OSが割り当てる遅延ファイルマッピングの事をいいたいんじゃないのかな。 ポインタのことなんだけど、*pt と pt みたいに同じ名前で宣言したら、別々の変数になる? >>466
まあここでいいと思うぞ
madviseはあまり関係ない
落とされる前提でポリシー決めてるだけ
MAP_SHAREなら解放される可能性がある
MAP_LOCKEDで解放されない
他のフラグは知らん、試せ これまた初歩的な質問なんだけど、intとdoubleとかで変数名が衝突したらどうなる? 確かにエラー出るんだけど、できないってことでいいの? 外のスコープで定義されたものと名前が衝突した場合は内側の方が有効になり
同じスコープで衝突した場合はエラーになる int* ptの意味は意味int *ptだよ。
ptをデリファレンス演算子で評価したらint型になるよという宣言だよ。 変数名が型ごとに独立した名前空間に属する、という言語があるのかな。
原理的には可能だと思うけど、えらく組みにくそうな気がする。
「型だけが異なる同名の変数を使わない」みたいなコーディング規約を強制されそう。 構造体のネームスペースみたいに
全部の変数に型名をつけるようになるだろうな。 リーダブルコーディングとeffective以外に本を探してるのだけど他にあるかな? 組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、2006 >>488
perlは$aと@aと%aが違うけどな。型と言うよりはスカラか配列かハッシュかの違いだな。 >>493
ネットで MISRA の詳しい解説はありませんか? 処理重視なら毎回毎回変数宣言って処理が鈍くなるよな? C++でもないのでコンストラクタ走るわけでもないです スタック操作なんか関数呼び出し時にまとめてやってるから、どこで宣言しようが処理速度は変わらないけどな。 >>499
その程度ならコンパイラが良きに計らってくれますよ for文の中の変数宣言って外で行うよりオーバーヘッド大きいの? >>504
言語上ブロック内で有効なだけで、
他の自動変数同様スタックに余分にとられるだけだからまず変わらない。 >>499
宣言だけ?メモリ確保とかは自分でやらずに?
だったら最初に確保する一回分だけの時間しか掛からないと思うぞ。 あ、C++みたいな言語でクラスの中でメモリ確保してデストラクタで解放やってるような場合は
ループするブロックの中で宣言したら最低でもメモリ確保と解放でループの回数分時間
掛かっちゃうだろうけど、C言語にはそういうのはないので掛からない。 動的に確保というのはあるだろうが、
俺を意識した使い方するだろうし >>506
for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった
なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた そのレベルの理解なら気にする必要はない
そもそもCを使う必要もない >>511
> for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった
よほどショボいコンパイラでない限り気にする必要はない
> なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた
そう言うアホな本は窓から捨てるべき >>513
それは中の処理が大量になっても大丈夫なのか?
20行、30行ぐらい長い処理でも? 宣言と長い処理って何処に関連が?
初期化の右辺がすんげー長いというのは
変数宣言がループの中にあろうが変数宣言をループの外に追い出しても
同じで必須コストだしそこは論点じゃないよね >>516
全部ヒントに「コンパイラが最適化でやる」って書いてあるし
逆にそのコストが重いようならもっと根本的な手入れ(アルゴリズムの見直しとか)が必要だし >>514
測定して本当にそれが問題になってるとわかった時に考えればいい >>516
「実際のところ」と書いてある所をよく読むべき。 コードとは直接関係はないけどメモリリークのテストってlinuxだとどうやるのだろう? >>522
valgrind か LeakSanitizer 脳内ループ最適化かー。結構良く目にするのは
int i;
for(i = rows; 0 < i; i―)
Hoge;
だったりするけど
組み込みでも、このくらい最適化かかるのにねぇ >>523
>>524
ありがとう調べてみる
別件なのだけど、systemの子プロセス戻り値をみるときって
ret=system(コマンド)
if(wifexisted(ret))
{
wexitstatus(ret)
}
これだけで良い?エラー処理ってほかにいるかね?
wifsignaledとかwtermsigとかいるのかね?ってなってるんだ
その他のマクロについても.... >>526
systemって-1返す事なかったっけ? >>522
オレは単純にpsコマンドで、vszとszの推移を見てるだけだなー
確保の仕方にもよるだろうけど。。。 >>529
メモリマップとかは見てると分かった気になれるし、仕事してる感も出るからおすすめ >>528
うおおおおお
たしかにあった
>>527
-1は素で忘れてた
>>443見てみたけど最後if elseで終わってるからその後がどうなんの?って気になる
if elseってことは他もあるじゃん?ってなるのだがいかんせんman理解できない... >>531
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/wait.2.html
Linux の場合大きく分けて WIFEXITED と WIFSIGNALED 以外があるのかというと今のところない。
しかし将来的に増えないとも限らないので念のため if で分岐させておいた方が良いと思う。 >>533
3点ほど
配列使う必要ある?保持したいのは最大値だけなんだよね?入力ループ内で最大値判定までやったら?
ローカル変数名は input_num とか分かる名前つけようか
main の戻り値 C99以降だっけ?
省略された int main() の返り値として自動的に return 0; が補われる、
という仕様があるはずだけど、それに積極的に依存するよりも
return 0; と1行書く方が良い習慣だわね。 >>532
さんくす
これ読みにくいよなぁ....
子プロセスの配送が停止したとき
具体的に言うとwifstoppedの時は別なのかな? stdlib.hのSUCCESSなんちゃらをほんにゃら >>536
試してみればわかると思うけど system() で動かされた子プロセスは SIGSTOP 受け取っても
停止するだけで親プロセスには帰らないよ。system() 内でやってる waitpid() は WUNTRACED
や WCONTINUED オプション使ってないってことだと思う。なので STOP や CONT に関係する
WIF... はやる必要がない。 char str1[10]="AAAAAA";
char str2[10]="BBBBBB";
char str3[10]="CCCCCC";
があって、これをそれぞれ
char strh[0][10]〜char strh[2][10]に代入する方法を教えてください。 strcpy(strh[0],str1);
strcpy(strh[1],str2);
strcpy(strh[2],str3);
と適当に書いてみる。 ポインターのコピーじゃダメなんですか?
なんで中身をわざわざ複製して、処理時間を無駄に消費するんですか? >>538
ありがとうありがとう
そうすることにする
stat関数でのファイル存在確認って破損していたファイルだとエラー返ってくる?
仕様を調べていたけどそのような記載がなかった >>541
ポインタのコピーだとコピー元の配列(str1[],str2[],str3[])の中身を変更するとコピー先(*strh[0]〜*strh[2])の内容まで変わる
値のコピー(strcpy()など)だとコピー元の配列の中身が変わってもコピー先の配列(strh[0][]〜strh[2][])の内容は変化しない
配列とポインタでは挙動が違う 初期化でやってしまう話じゃないんだろうな。 多分
char strh[3][10] = { "AAAAAA", "BBBBBB", "CCCCCC" }; 配列変数はただのポインタ変数じゃないってマジ?
arr==&arrになるんやが。
arrがポインタなら&arrはポインタのポインタだからこれはおかしい。 int a[10];
int *p;
p++; 問題なし
a++; エラー
配列は配列 ポインタはポインタ arrと&arrじゃ型違うし、比較結果が一致する保証もないけど? >>545
ポインタの変数はポインタを入れとくための変数だ。
配列変数はポインタを入れとく変数ではなく、単に配列の先頭を表すラベルでしかない。 >>545
int arr[10]; みたいに配列を定義して
if (arr == &arr) {...} てな具合に比較する話かな。
配列名 arr は &arr[0] (先頭の要素へのポインタ)
配列名に&演算子を作用させた &arr は配列全体(10要素の配列)へのポインタ
…と解釈される、とANSIで決まった、と望洋さんの本に載ってる。
『秘伝C言語問答 ポインタ編』p.25 Column1-2 「配列名に&をつけると……」
>>548
型が違うのは間違いないけど、値が一致しない場合ってあるのかな?
それとも型の異なるポインタ同士での値の比較って未定義動作なんだっけ? >配列名 arr は &arr[0] (先頭の要素へのポインタ)
>配列名に&演算子を作用させた &arr は配列全体(10要素の配列)へのポインタ
>…と解釈される、とANSIで決まった、と望洋さんの本に載ってる。
なるほどな >>552
>6.5.9 等価演算子
>(中略)
>制約??次のいずれかの条件を満たさなければならない。
>(中略)
>-両オペランドとも適合する型の修飾版又は非修飾版へのポインタである。
「〜型」と「〜型の配列型」は適合しないから、ポインタの比較は未定義 >>552
型が異なったら、比較できない
例えば、アドレス100番地から10バイトと、
アドレス100番地から20バイトでは、全然違う
仮に、同じバイト数だとしても、中身・内容が異なるし、比較する事に意味がない >>542
ファイルの破損というのがファイルの中身の論理レベルの話なら正常なファイルとみなされるはずだし、ファイルシステムレベルの破損やメディアの物理的破損なら実装依存じゃないかな。 >>555
いま話題にしているのはarrと&arr[0]の比較であって、これらはどちらも比較演算子のオペランドとしてはint*型として評価されて型も値も一致すると思ってたけど、どうだろう。 >>557
間違えた。arrと&arrね。&arrもint*型のはず、だと思う。 実際にコンパイルすれば型不一致のwarning出るのに、なんでそういう発想になるんだろう
不思議だわ >>557-558
int arr[10]; と定義されてる場合、
arr の型は int*
&arr の型は int (*)[10]
つまり arr と &arr は型が違う
というのが >>552 の「&arr は配列全体へのポインタ」の意味。
「引数として『10個のintを要素とする配列』のみを受け入れる関数」
(要素数が違うとコンパイルエラー)みたいのを書ける。
もちろん、それが目的で存在する書式じゃないだろうけど。
それにしても &arr の型の書き方は分かりにくいな。
理屈は多次元配列を仮引数にとる関数プロトタイプと同じ、
だと思うんだが。 >>560
arrの型はint[10]だボケ
&arr[0]がint*だ
おまえさんの、その理解では&arrがint**になっちまうだろうが arrは&arr[0]の糖衣構文なので型は同じint*だろ 代入左辺の int* に渡す右辺
関数引数の int* に渡す引数
ここに渡す際に先頭要素へのポインタを与えてるだけで
変数そのものはポインタにはなっていなくて配列のまま arrは要素10持つ配列の先頭アドレスを返す、サイズはint 10個分
&arr[0]は、配列要素0番目のアドレスを返す、サイズはint 1個分
先頭アドレスが欲しいだけなら型キャストして使えばいい。
代入に使うならサイズが違うから上手く行かない。 arr = &arr[0] ≠ &arr
sizeof(&arr) = sizeof(&arr[0]) ≠ sizeof(arr) >>563
いーや違う
§6.3.2 Other operands
Except when it is the operand of the sizeof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type'' is
converted to an expression with type ‘‘pointer to type ' that points to the initial element of the array object and is not an lvalue.
あくまで配列からポインタへconvertedつまり元の型int[10]とは違う型int*への変換だ C言語は覚えることが少ないので初心者にお勧めです👈 氏名、生年月日を入力させて、年齢を出力する。(ここまではいい)
再度起動時に、同一氏名入力時は生年月日と年齢を出力する(これがわからん)
方向性がさっぱり見えない、どうすりゃいいの?
http://codepad.org/BVM0iMi4 入力された氏名のファイルを探す
無い→ファイル作って 入力した生年月日を書き出すとともに変数に覚えておく
有る→ファイルから生年月日を変数に読み込む
↑の処理で変数で覚えている生年月日から年齢を求め表示する if文&fread,fwriteでなんとかなります?
あと出来ればリンク先のソースコードにダメだし貰えると嬉しい ファイルが一個しか使えないんなら、
その中に何の情報をどんなフォーマットで入れるか先に設計しろ。 >>562 言葉は悪いけど言う通りだね。
俺が書いたのは arr て名前が演算の対象として単独に現れたときに
自動的にポインタの値に変換される場合の値と型のことだった。
arr 自体はあくまで配列だから int[10]
この名前が関数の引数とかで使われた場合 &arr[0] と同じになる。
配列名は隙あらば「先頭要素へのポインタ」になりたがる。
こんな感じでよろしいか? (我ながらぎごちないけど) >>577
fprintf()で一行にカンマ区切りで名前と生年月日出した方が扱いやすいのでは?
で、処理の順序としてはこうだ。
1. 名前入力。
2. 入力された名前がファイルの中にあったら一緒に入っている生年月日を出して終了。
3. 生年月日入力。
4. 名前と生年月日をファイルに追加。
5. 終了。
ファイルアクセスは2では読み出ししかせず開きっぱなしにしないでクローズする。
4では追加書き込みだけしてクローズだ。 >>579
演算の対象ではなく、特定の演算子の対象な
どの演算子で&arr[0]に変換されるのか、
列挙できる知識が必要ということだ XMLで
なんていうと余計にややこしくなって大変な事になるなw >>583
左辺値が変換されるのであって、特定の演算子のオペランドのとき変換されるなんて仕様はないよ?
特定の演算子のオペランドのときに変換されないって仕様はあるけどさ >>585
Cの演算子は「特定の演算子」の集合で、
そこから、ある特定の演算子を除いた残りもまた
特定の演算子だろうがよ 宣言とか、演算子出てこないことぐらいあるだろ
初期化子つきの宣言に出てくる=が代入演算子だとでも思ってんのか? >>584
C# とか C++ ならまだしも C言語だとちょっと辛いわな
>>574 程度なら .ini ファイルみたいな奴でいいかと >>587
ちなみに、初期化子つきの宣言に出てくる=が代入演算子でないとすると、
その=は何と呼ばれるものです? >>587
宣言? おまえさん、int arr[10];がint *arr;に変換されるとでも思っているのか?
仮引数にint arr[10]と書くとint arr[]に読み替えられたりはするが、
そのことを言っているのなら>>562で指摘したとおりになるな
ただし>>560にはセミコロンが付いていてそういう逃げ道は封鎖されているわけだが int arr[10];
int *p = arr; /* このときの arr の解釈 */
を指してるのだと思うの。
ここで出てくる = は代入演算子じゃないぜ って 我輩は宣言子と初期化子の間の=である。名前はまだ無い。 >>589
初期化宣言子 init-declarator >>593
なるほど、情報サンクスです。
C++だと、同じものが代入演算子と称されていて。コンストラクタ内で代入演算子をオーバーロードすべし、
のような言い方をよく見かけますので。Cでも同じ呼び方をするのかと思ってました。 いやまて init-declarator は、"宣言子"か"宣言子=初期化子"のことだぞ >>594
あー、よく見たらC++ではコピーコンストラクタと代入で明確な区別があるんですね。
もっと勉強しなきゃですわ プログラミング初心者です
車のタコメーターをフルカラーのディスプレイを使って作りたいのですが、どうすれば良いのかが全く分かりません
C言語は計算機内で式の答えを演算する程度なら使えますが、ハードを制御したりはできないです(Arduinoなら少し弄りました)
C言語で作れるのかも分からないので、簡単なところから教えてください
エンジン回転数のパルス信号は取れてます Ardudinoを弄ったことがあってハード制御ができない?
パルス信号を取れるっていうのは、オシロスコープか何かで確認できたってことか?
・・・もしかして、こういうことか?
その信号をプログラムで読み取るには、どこの端子に繋ぐのかとか、
信号のレベルの合わせ方とか、そういうことがわからんのか? マイコンに表示装置とかをくっつけて
デジタコを0から自作したいってことなのかな?
言語外の相談のほうが重要度高いような気もする 信号→マイコン→処理
は分かります
その処理を今までPC上に表示させていた物をディスプレイに↓のようにカッコよく表示させるにはどうすれば良いのかを教えてほしいのです
https://i.imgur.com/S3sahkU.jpg 何から調べていいのかも分からない状態です
ど素人ですみません… そのディスプレイとやら仕様書見せてくれなきゃ
なんとも答えようがなくない? >>603
ターゲットのマシンは?
Windows? Linux?
ていうか、C言語でやると何で動かすにしても大変面倒だと思うので何か他の言語使った方が良いと思う。 言語もバードも指定は無いです
寧ろ何を使えば良いのかを教えて欲しいです ターゲットがよく分からないのですが、コードはUNIX系のOSのemacsで書いてます
Windows上で作ったプログラムを動かしたことはあまりないですね ディスプレイのつなぎ方がわからんのか?
つないであるディスプレイへのコマンドの送り方がわからんのか? >>599
PCのウィンドウ環境上でウィンドウを開いてグラフィック表示って問題なら、
環境次第でここでも分かると思うけど…。
部品としての液晶やLEDのパネルのハードウェア制御ってことになると、
まずはどの部品を使うのか、って話になるな。 なにがベストかと聞かれても答えにくい質問だな。
自分ならデータを無線で飛ばしてタブレットでみれるwebシステムを検討したい案件だが。 消費電力、サイズ制限、予算諸々考えてどの程度のハードが用意出来るかって所から
linuxやwinが動くようなリッチな環境が用意出来るなら
GUI部はCじゃなくても良くねってのが正直な感想 BT接続できるOBD2アダプタ(点検器具端子)買ってアンドロ端末に表示するのがお手軽かも >>597
おれも少し変だとは思うけど、企画書には、宣言子単独が init-declarator に含まれてるんだよ >>608
> ターゲットがよく分からないのですが、コードはUNIX系のOSのemacsで書いてます
根本的に分かってないようだが、「ターゲット」ってのはお前が決めるんだよ。
そして既にコードを書いていて、そこにLCDを接続したいだけなら、その環境を言えよ。 >>615
初期化子なしは、不定値で初期化するって意味だと納得することにしてるわ
一応、初期化の説明に含まれてるし。。。
つーことで、>>586とかには演算子のオペランドでないこともあるって理解してもらえたかな
良かった良かった >>603
>信号→マイコン→処理
>は分かります
で、信号は取れたとか言ってるんだから対象の物理的扱いはわかっているんだろ。
それをどんなマイコンにどう繋ぐかだ。出来合いのマイコン基板を買ってきて
それに繋げるのか、基板から自作するのか >>618
586だが、だから何だ?
演算子に限らずとも、Cは明確に列挙された機能の集合だ
そこから特定の演算子を除いた残りは、
おまえが言うような曖昧な集合ではない >>583 へのカウンターじゃないの?
583では 変換が走るのは 特定の演算子の対象 としてるけど
初期化においても変換が走ってる
この記述中では演算子はなくて、該当変数は演算子のオペランドになっていない って >>620
ん?
配列型を持つ左辺値は特定のケースを除いてポインタ型に変換されるという
規格に明記してある話を理解してもらえればそれで十分だよ?
初期化子には演算子が含まれないこともあるって理解できたんだよね
なら、それで良いよ >>621 >>622
>>560からの流れ読んでね
やつはint arr[10];と定義されたオブジェクトに対する
arrというアクセスがint*だと言っているんだ
おまえら2人とも変換と言っているよな
変換てそもそも何だ? >>623 俺の認識は >>570 の converted であり
arr は int[10] のまま >>623
そりゃ、>>570のconvertedだろ
sizeof、&、配列の初期化に用いられる文字列リテラルを除いて、配列型をポインタ型に変換する。それはもはや左辺値ではない。
の変換 もしかしてarr自体がint*型を持つというアホな解釈を擁護してるとでも思われてたの?
それは>>560自身も、>>579で式中に現れた場合のことでしたって弁明してるでしょ
それとも
arr;
という識別子名だけの単文があったとき、arrがポインタ型に変換されないと思ってる?
左辺値なんだから、当然変換されるよ >>625
> 配列の初期化に用いられる文字列リテラル
(その通りに動作すると期待して)普通に使ってるけど、
逆の観点の、配列のまま取り扱ってる例として挙げようとすると、見落とすわ これ >>626
うん、そう思っている
おまえ、なぜ
arr;
がポインタ型に変換されると思っている?
なんだか残念な答えが返ってきそうな予感がするが 6.3.2.1 Lvalues, arrays, and function designators
An lvalue is an expression with an object type or an incomplete type other than void
6.8.3 Expression and null statements
expression-statement: expressionopt ;
arr;は式文、arrは式(左辺値)
よって、>>570の規則に従って変換される >>629
それはおかしいぞ
arrという部分式を評価中に、それがどんな文脈の作用対象となるかは
予見しないのがCのポリシーで、だからこそ式arrはlvalueを生じる
その後lvalueからvalue of an expressionへの変換を要請する文脈を経ずに
シーケンスポイントとなっているそのプログラム片のどこに
アドレス計算が生じうるんだよ >>608です
>>616
コードをどう書けばいいかも、どれを使えば実現できるのか分からないです
コストや部品点数は抑えたいと思ってます
>>619
どういうマイコンをどうすればアニメーションでディスプレイ出力ができるのかを知りたいんです
おおまかな道筋を教えて欲しいです
ARMマイコンとかどうなんですかね… PIOのディレクションレジスタを出力に設定してマスクパターンを指定しておき、
それからコマンドを書き込んでストローブのパルスを作って。。。 >>630
ポリシーとかじゃなくて規格の話をしてくれない?
配列型の左辺値は特定の場所以外で現れた場合に、変換されるという規格なの
演算子を伴わない場合は変換されないというのなら、その規格を明示して
左辺値ですらないというのであれば、その根拠となる規格を示して
人に説明求める割に、自分の論拠が想像ってのはどうかと思うよ >>631
ググレカス
Arduinoと液晶でいくらでもヒットするだろ
ゆとりはマジで殺処分すべきだな >>633
> 配列型の左辺値は特定の場所以外で現れた場合に、変換されるという規格なの
630 じゃないけど、そっちこそ規格のどこ見て言ってるの?
N1570 6. Conversion で演算子オペランドになったときの変換は確認できるけど、
式文を含めて「現れた」だけで変換されるという記述は見つけられない。 あ、ごめん。 6. Conversion じゃなくて 6.3 Conversions ね。 >>633
質問に質問で返さないでくれない?
arr;というプログラム片のどこにアドレス計算が生じうるの?
全く無用と思える操作を強制する根拠法令を示しなさいよ
全く無用と思わない、あんたの思考回路でもいいよ
こちとら規格しか聞く耳持たないとか言わないから
つーか自分なりの思想を持っているやつと話すほうが実りがあるし >>636
>>570
an expression that has type ‘‘array of type'' is converted to an expression with type ‘‘pointer to type ' that points to the initial element of the array object and is not an lvalue.
確かに、6.3の頭には演算子オペランドの暗黙的な型変換について規定するとは書いてあるけど、
あくまでもsuch an implicit conversionであって、それだけを規定するわけではないでしょ
expressionが変換されると書いてあるんだから、式が変換されると読むのが素直じゃない?
そう解釈しないと、例えば
return arr;
とか、どういう理屈でポインタを返すと考えれば良いの? >>639
おまえさんが言っているのはこういうことだ
int aho() [10]
{
int arr[10];
return arr;
}
コンパイル通るかどうかやってみな
で、どういう理屈でそうなるのか
おまえさん自身が言ってみな >>640
自分は一貫してreturn arr;でint*を返すという主張なんだけど?
あなたこそ、演算子を伴わないと変換が行われないと主張してたんだよね?
そういう解釈だと、どうやって
return arr;
でint*返せるのって質問だよ >>641
演算子って言質がおまえさんの命綱のようだな
別にそんなの撤回してもこっちは痛くも痒くもない
それをもって勝利宣言したければすればいい
win-winだね >>639
return についての規定で代入と同じ変換が行われることになってる。
規格見てるんなら return について疑問に思った時点で該当箇所読んでから聞こうな。
「自分の論拠が想像」は許さない立場なんだからさ。 >>643
おお、ほんとだ
ありがとう、見落としてたわ
ついでに初期化宣言子も見返したけど、単純代入と同じ型変換後の値が初期値って書いてあるな
ごめん、ごめん
規格解釈は間違ってたけど、結果は合ってたって感じかな
こういう指摘くれたら1発で済んだのに。。。 >>644
おまえは間違っていた
人のせいにしてんじゃねえよ 文系で一から使えるようになるまでにどれくらいかかりますか? >>646
文系かどうかはあまり関係ないと思う。論理的な思考が苦手でなければok。
使えるようになるのレベルに幅がありすぎるからなんとも言えない。
プログラミング初めてで、どうしてもCでなければならない理由がないなら、他の言語から入った方が実用的なことをするのには早いと思うよ。 >>647
ゆずの大馬鹿は18年だったんだが、最近のゆずは発育がいいのか? >>646
Java がいいんじゃないかな?書籍も多い >>646
数学/物理が出来なくて文系に行った口なら諦めろ。一生無理だ。
頑張ったところで、若い奴らに簡単に追い越され、一生惨めな思いをするだけだ。
他に適性のある分野を探した方がいい。
現実的には、理系/文系のどちらの知識も必要なく、抽象/論理思考が出来るかどうかが全てだ。
だから高々高校2年間程度のラベルの結果である文系/理系自体には大した意味がない。
しかし、そもそも抽象/論理思考が得意なら、当然、
不得手な奴が混ざっている環境(つまり文理分けていない状況)においては無双できる。
結果、「得意だから」≒「好きだから」という理由で文理を選んだのなら、文系を選んでる時点で向いてない。
そして大学4年間で理系の連中は周りが抽象/論理思考出来る奴らばかりという環境で鍛えられることになるから、
決定的な差がついてしまう。
そうではなく、俺は数学も得意な文系だ!というのなら行けるかもしれん。
最近は経済学部が理系化しつつあるという話だし。
いずれにしても個人差の方が大きい。学生なら、やってみて面白くなければ諦める、でいいと思うが。
面白いと思えて続かないようなら向いてない。 >>654
むしろ向いてる気がする
数学とか論理によりすぎだと変なこだわりがあったり
現実のあいまいさに適応できなかったりするから
現実的な手続きや広範な知識が必要な化学が得意だったら適正ばっちりじゃないか >>654
高校生物=ほぼ暗記
高校化学=暗記7割、理論3割
高校物理=ほぼ理論
高校数学=8割理論、2割パターン暗記
(高校国語/英語/社会=ほぼ暗記)
じゃね?
だから高校化学/生物が得意だからといって、抽象/論理思考の能力は分からない。
(無いとは言わないが、得意とは判断できない)
逆に暗記が得意なら自然と文系教科で無双することになる。
この理由で文系を選んだのなら、暗記能力>抽象/論理思考能力、ということになり、向いてない。
今時のプログラミングってWebを参照しながらやるもんだし、暗記能力自体はほぼ要らなくなってる。
ただしドキュメントを大量に読むようになってきてるから、国語/英語の能力は重要になってきてるが。
とはいえ、高校英語=ほぼ単語を覚えているかどうか、であり、
現実はポップアップ辞書も使えるし、google翻訳も読めないほどでもないし、そもそも技術英語は簡単だしで、
テストでの英語の能力よりも、何を書いてあるか読み解く方が重要で、
いわゆるTOEIC等とは違う尺度だから、高校英語の点なんて全く当てにならないが。
ただまあ、学生なら、グダグダ言わずにやってみて、面白いと思えなければ向いてない、でいいと思うよ。
ただ、ド初心者なら、>>648の言うとおり、他言語の方がいいと思うが。 >>657
まあ、国語は暗記でも行けるかもだけど、読解系の問題は論理思考でいけばかなり楽できるんだぞ。 >>659
勉強しなくても、論理思考さえできれば、ほとんど正解できるってこと。 つかな、多分、解く過程が数学と同じなんだよ。
ただし数学自体ではないから、数学の成績自体はあまり関係ないけど、
数学めいたものが嫌いな場合には向いてない。
そして大体の場合は好き=得意科目になるから、
集団から選抜するのなら数学の試験を課すなり、面倒なら一律文系お断りってのも当たっている。
(もちろんプログラミング課題を課せるのであればそれが一番いいが)
よくある初心者向けのプログラミング課題、
・ソース○○に対して、出力△△を得たい、どうすればいいか、
に対して、実際は適切なメソッドや典型的な手法を組み合わせて対応するわけだろ。
これが、公式やお約束的解法を組み合わせて問題を解く「高校数学」と似てる。
そして実際のプログラミングなんて、
上記単発のお題が階層跨いでフラクタルになっているようなものだから、
ある意味数学パズルをずっと解き続けるようなもので、数学が嫌いだと持たんだろ。
ただし本来はその先の、
「こうすればこんなに簡単に実装できるのか」という構造を思いつける奴が「センスがある」となるわけだが、
これについては選抜の仕方(適正判断の仕方)は分からんなぁ。
ただ、いわゆる「エレガントな解法」というのが存在するのも数学だけだし、
プログラミングと数学はかなり構造が似ているのだと思うよ。 >>660
論理思考、最強!みたいな勢いだけれども、
その論理思考の中身というのが常識を外れているような気がする
命題A: 「1 + 1 = 3」 ならば「2 * 3 = 6」である
とするとき、命題Aは正しいか間違っているか、また、その理由は? >>661
プログラミングは証明に似ているのには理解が及びますね。
ただ、普通の証明よりもずいぶんと細かいことに気をくばらないといけない気がします。
「型」を数学であつかっている例はありますか? >>646
マーチ文系の俺は現場に入るまで3週間
足引っ張らない程度になるまで3か月
無双するまで1年だったかな
3年たった今では Golomb 符号とたわむれてる >>663
証明問題じゃねえよ。つかおまえも数学出来なかった口だろ。
数U数Vはほぼパターン通りだけど、
数Tの難しい問題はたいがい「エレガントな解法」ってのがあって、裏技みたいに簡単に解けたりするんだよ。
それはそれこそ東大の過去問とか見てみればいい。
或いは三平方の定理とかでも何通りも証明方法があって、おおっ、てのもあったりするだろ。
(ただ、この話が通じない時点で説明しても無理なのは確定だが…)
実際のプログラミングもこれと同じで、データ構造を正しく整理すれば制御構造もものすごく単純に出来たりするんだよ。
だから数学的な「エレガントさ」を追求するのが好きじゃないと向いてない。(というか上達しない)
そして「型」なんてのはノートに引いてある罫線みたいなもので、プログラミングの本質とは全く関係ない。
ただし型自体は圏論だっけ?Haskellの連中がやってたはずだけど。詳しくは知らんが。 で、QZ、君は色々文句言われてたりしてるのを見たことがあるが、俺自身は知らんからそれはどうでもいい。
ただC++のスレで「色々忘れてしまうんで…」とか言い訳してたろ。
(別段それについて責めるわけではないが)それは覚え方が悪いんだよ。
例えば高校の物理、
・ma=Fとsin/cosだけ覚えて後は組み合わせるだけだが、 // (A)
・「垂直にぶら下げたケース」「斜面においたケース」「バネがくっついたケース」とか、// (B)
別々に覚えたがる奴はいるんだよ。それで、(A)が抽象思考(分類)できる奴、(B)が出来ない奴、となるんだよ。
そして、プログラミングで必要なのは(A)で、(B)は死ね、でしかないんだよ。
で、多分君は(B)派なんだよ。だから「忘れる」とかいうことになる。
(A)だったら忘れるも何もない。どの言語でも同じものを使っていて、
それを「ひらがな」「カタカナ」「英語」のどれで書くか、でしかないから。 ただ自分が(A)なのか(B)なのかは簡単に分かるとして、(高校の物理に最初からついて行ければA、無理ならB)
これは思考の癖だから、簡単には直せないんだよ。だから向き不向きはかなりある。
単純に言えば、脳内のCPU/ストレージのコストによる。
いちいち圧縮/展開してでもストレージをケチりたい=CPUの速さに対して記憶が得意ではない場合は(A)、
いちいち展開するくらいならベタでストレージした方が楽=CPUのコストに対して記憶コストが安い場合は(B)になる。
そしてこれは無意識領域で作用するから、簡単には変えられない。
(A)の連中は最初から抽象思考する、というより抽象思考ベースだから、プログラミングにはフィットするけど、
例えば高校の歴史、「○○年に何がありました」という単発事象を別々に暗記するのには全く向かない。
逆に(B)の連中にはこれが向いているが、抽象思考するためにはいちいち「意識的に」圧縮/展開する必要があり、
ネイティブ(A)の連中にプログラミングでは太刀打ちできない。
それでも(B)の連中が得意な「記憶」でプログラミングに対処しようとした結果が「デザインパターン」だ。
だから(B)の連中はデザインパターンにすがるし、新しいパターンをどんどん登録しようとする。それが上達への道だから。
(A)の連中は最初から「デザインパターン?何それ?おいしいの?」だし、「名前つけただけだろ」程度でしかないんだよ。
で、QZ、君はデザインパターンにすがってるタイプだとC++スレで言ってたろ。
ここでも(B)だと分かるんだよ。
で、俺は、(B)の連中はわざわざプログラミングする意味無いと思ってるんだよね。向いてないから。
多分、その記憶コストの安さを生かした、何か別のことをすべきだよ。
パターン暗記で対応することも出来るけど、それだとコピペプログラマ程度にしかどうせなれないし。 Haskellは非常にエレガントだからな
プログラマーたるもの一度はCとHaskellに触れるべきだ
願わくばHaskellのエレガントさとCの自由さを合わせ持つ神話的な言語が生まれて欲しいものよ 回答ありがとうございます
プログラマになりたいのは、単純に稼ぎたいからです
んで色んな言語の基礎というか素地になってるのがCみたいだから
まずはCをと、今いろいろ入門書を読んでるところです
難しいけど楽しくて仕方ない感じなのですが
大学は駅弁経済(だいたいmarchクラス)で数学無しで入ったので
今更ながら後悔してます(高校で挫折したクチ)
ココ見てるとやっぱりこの世界はすごく論理とセンスがモノを言うんだな、と
ちょっとビビってます
Cより楽な言語に移ろうかとも思案中ですが、
もう少し基礎を固めてからにしようと思ってます
また覗きに来ますねw 稼ぎたいからプログラマって、何か凄い誤解してるような
金融行っとけ
マスコミは今後怪しい
数学無しの経済ってアリなの?? >>669
ソフトウェアで稼ぎたいならcはないかな
javascript と python を頑張った方が良いかと ここら辺の高校数学とか延々述べてる回答者たちは荒らしなの? >>669
> 難しいけど楽しくて仕方ない感じなのですが
これなら当面は問題ない。駅弁なら時頭も問題ないだろう。
> ココ見てるとやっぱりこの世界はすごく論理とセンスがモノを言うんだな、と
残念ながらそうでもない。
というか、(どの仕事でも同じだが)結局、仕事の9割以上は「与えられた分担をきっちりこなすこと」であって、
それは「パターン暗記」でほぼ何とかなってしまう。ここが逆に不幸なところで、
彼らもまた「仕事が出来る」うちに入ってしまい、彼ら流、つまり「パターン暗記」流を推奨してきたりする。
(C++のスレでだいぶ言ったが、俺はJavaはもうそっちに行っちまって戻れないと見ているから、Javaは俺は勧めない)
逆に、仮にセンスがあったとしても、仕事の1割以下でしかそれを発揮する機会がなく、埋没してしまう。
ここら辺を突破しようとしたのがGoogleの20%ルールだったわけだ。
> Googleにおいて、従業員は「勤務時間の20%を他のプロジェクトに費やしても良い」のではない。
> 「費やさなければならない」のだ。これは人事評価の対象にもなり、
> 従業員はその20%の時間を使って「本業以外の何か」を生み出すことを期待されている。
> https://innova-jp.com/google-20-rule/
「パターン暗記」では未来には対応できない。センスがない奴は、何をやっていいかすら分からない。
とはいえ、実際はこれを隠れ蓑に遊ぶ連中も多くて、って話だったが。
(少なくとも「パターン暗記」するタイプのまじめ人間からはそう見えた)
実際にそれが無駄だったかどうかは分からん。
https://www.countand1.com/2016/07/google-20-percent-time-implication-for-making-failure-be-good-learning.html
結局世の中OSSに完全にシフトしつつあるのも、
OSS側でセンスがある連中がつるんで好き勝手やるのにプロプライエタリでは全く太刀打ちできないからであってね。
ただし、公務員的にITで働きたいのならJavaだろう。向こう20年仕事はあるだろうし、あまり変化もない。
それ以前に、稼ぎたいのなら金融、ってのは当たっているが。
(なお金融関係のプログラマならPythonと聞いているが、多分これは日本国内の話ではない、
というか、日本国内に「金融関係のプログラマ」がそもそも居ないと思う) >>674
いや、俺が言っているのはそっちじゃない。
インフラは COBOL -> Java の移行中だ。君はこの意味で言っている。
俺が言っているのは以下で、
https://jp.stanby.com/media/programming_ranking2017/
Pythonの右端の連中は金融関係だ、と聞いている。
具体的には、デリバティブとかアービトラージとか、そっち系。
Cはお察し、として、Javaの右端の連中は何だろう? >>665
>証明問題じゃねえよ。つかおまえも数学出来なかった口だろ。
数学の本道は証明問題にあるとおもっていますが
数学の本をみればわかりますが、定義、命題、証明をひたむきにくりかえしていますよ。
https://ja.wikisource.org/wiki/%E5%88%9D%E7%AD%89%E6%95%B4%E6%95%B0%E8%AB%96%E8%AC%9B%E7%BE%A9
>>655
>三平方の定理とかでも何通りも証明方法があって、おおっ、てのもあったりするだろ。
でしょう、証明問題こそプログラミングに似ていると思っています。
>「色々忘れてしまうんで…」
そして、証明をいちいち覚えるんじゃない、その都度再構成できるように努めています。
といって、数学の本はときどき「証明は読者にまかせる」とくるのですが、それはちょっと困ります >>677
おかしくないですよ、論理学的には。
「論理思考の中身というのが常識を外れている」の一例です。 >>662
"1"という数字は数値に直すと1.5であり、その他の数字は通常と同じであるとする。
という一文が手前に挿入されるとその後の計算は正しくなる。 >>676
君が「証明問題」に限定しようとしているのはなぜだ?
証明問題以外でも、俺はプログラミングと数学は雰囲気やノリが酷似していると思うが。
>>669
あと、職業として選ぶのなら、当たり前だが、君に特に抜きん出た才能がなければ、
・君が半年で出来るようになったことは、普通の新人も半年で出来るようになること
・君が半年かかったことも、センスのある新人なら1-3ヶ月で習熟してしまう可能性もあること
を考えておかないといけない。
威張り散らす必要はないけど、あの人イマイチだよねって言われ続けるのも辛いでしょ。
適性がないところを職業にするのは悲惨だと思うぞ。自分の適性はよく見極めた方がいい。
逆に、君にセンスがあり、
・普通の人なら半年かかるところを3ヶ月で会得
なら、やっているうちにどんどん差が勝手についてしまうわけでね。 >>680
まあ数学とプログラムとでは、双方に互いに似たような思考方法を行う、という意味では大枠同意します
特に「証明」に拘っているわけではないのですが、拘ってしまいました…忘れてください… てか、プログラミングは数学の範疇に入らないか?
計算機に実行させる計算手順書だし。 >>682
個人的にはComputer=計算機ってのはかなり違和感があるんだよね。
プログラミングって、むしろシーケンサだろ。(処理手続きをひたすら記述する)
数学に似てるのは、結局、チューリングマシンからきてるのだと思う。
もちろん「このプログラミング言語はチューリング完全です」なんてやってるのは数学者であって。
これとは逆に、ニューラルネットワークなんて、正直、まともに証明すらされてないだろ。
なんだか分からないけどうまくいきます、程度であって、
ニューラルネットワークがチューリング完全なのかどうか、誰も証明して無いと思うし、(俺の知る限り)
それ以前に、プログラミングなんて出来る状態じゃない。
今も機械学習で係数を探している程度、つまりトライアンドエラーしか出来ていないわけであってさ。
だから、将来的にニューラルネットワーク等、チューリングマシン以外をプログラミングできるようになれば、
数学じゃないプログラミング手法が見つかる可能性はあると思う。
実際、機械学習自体は物理/数学の教え方(理論を教えてそれを適用)ではなく、
語学の教え方(習うより慣れろで、ひたすら知識(結果)を積み上げる)に近いし。 ところで、人工知能のバグ取りってどうやんの?
それともダメな子だから抹殺しちゃうの? 人格と知識は分離可能になるだろう。人格モジュールを切り替えたり、アップデートするんだろう。 自分自身が間違っていると判定されたら(サニティチェック)、「人格を初期化または取り換えて下さい」と表示される。 >>685
シーケンサってコンピュータの一種じゃ…?
というか計算しないで手続きだけひたすら書くのって
わりと特殊な方じゃないかな シーケンサー(通称PC)はアセンブラもあったりするけど
基本デノイマンだよ。 >>692
それはCに階層記述能力が欠けているからだ。
例えばNode(JavaScript)のコーディングルールでは、関数は15行以下にしろとなっている。
> Write small functions
> Keep your functions short. A good function fits on a slide that the people in the last row of a big room can comfortably read.
> So don't count on them having perfect vision and limit yourself to ~15 lines of code per function.
> https://github.com/felixge/node-style-guide#functions-1
やれば分かるが、15行で書く為には、中位記述と下位記述を明確に分け、下位記述は全て関数で括り出すことになる。
このとき、中位記述の関数はベタに手続きだけひたすら書くことになる。
俺も最初は戸惑ったが、実際、この方が読みやすいし、自己ドキュメント化する。
ただしCだとこれはちと辛い。
JavaScriptだとそもそも下位記述がほぼ無く、大体何かしらのメソッドを呼んで終わるし、
階層を自由に作成できるし、プロトタイプ宣言も必要ないし、デフォでクロージャだから外変数を自由に掴める。(引数にする必要がない)
Cだと関数内関数が出来ないし、プロトタイプ宣言も必要だし、全部引数で渡さないといけないし、
GCも無いから宣言スタイルでも書きにくい。また、関数呼び出しも無駄ならケチる文化もある。
最大15行なら、実際は5-10行の関数が氾濫することになるのだが、Cでこれをやるとよけいに読みにくくなる。
だから、Cでは珍しいだろうけど、JavaScript等手抜き系スクリプト言語だったら割と普通だったりするはずだよ。 Cはクラスがないせいで戻り値が使い物にならん
中でMallocして返すとすぐメモリリークする
文字列や配列を扱う関数は
第一引数と第二引数に結果格納用の配列と最大長を渡すというまだるっこしい作業をせんといかん
Cで言語を学ぶと悪いコーディングの癖がついてしまう オブジェクトへのポインタを1つ追加するだけでリエントラントな作りになるだろうに。 >>696
それがいい習慣というものです、配列(の先頭)と文字列長をセットで扱うのは基本中の基本です
win32api をみればわかりますが、一度目には自分が用意しなければならない領域の大きさについてお伺いをたててから、
二度目にやっと目的の情報を手に入れる、これは C ではセットですね
c++ で文字列型のような便利なアイテムを使っていたために、だんだん馬鹿になってきていたことに、最近ようやく気がつきました:−) バッファの大きさを受けて範囲内で書き込む sprintf じゃなくて
sprintf のフォーマット処理した結果、こんだけの大きさが欲しいって答える関数はないのかな >>705
snprintf() は >>703 の希望をかなえてはくれないのでは? >>705
snprintf は 渡した大きさで打ち切ることはするけど、完全に必要なサイズを返すっけ?
書き込んだ文字数だから打ち切った場合たかだか渡した大きさ-1 だと思うけど >>707 自己レス
C99 から戻り値が完全な長さを答えてくれるみたい
なので len = snprintf(buf, 0, .... ); len+1 以上確保して snprintf(buf, len+1, .... );
これが出来るのか >>708
普通は、とりあえずやってみて戻り値判定したあと切り捨てられていたら大きめのバッファにreallocしてつかうんじゃないかな。
確保するメモリサイズは一定の方がいいと思うんだ。
まぁ、Cなら大抵の場合、サイズオーバーでエラー処理へとばす気もするけれど。。。。 asprintf() も良いよね。
GNUの拡張だけど。 >>694
頭悪そう
分割数に依存してO(n**2)で命名の手間が増える
O(n**2)は行かないかもしれないがO(n)よりは大 >>708-709
manの「準拠」のところで、snprintf()の第2引数sizeに0を指定できる、
返り値を必要なバッファサイズを決めるのに使えると明記されてるね。
これは有難い。
>>712
エリートな人だなぁ。俺にはよく分からんけど…
男は度胸! 何でもためしてみる、か。 >>712のやつは多分中々みつからないと思うぞ。>>712のPCのディスクの中か心の中にしかないんじゃないか?w char aznable は、いつか、やるかも、しれない -able は「〜することができる」という意味を加える接尾語と解釈できるから
azn と略せる何か動詞っぽい操作を思いつけば char aznable; を
「合法的に」使うことができるね。
単なるフラグなら int なり bool なりを使え、と言われると弱いけど。 >>713
横だが
関数名が事実上のドキュメントになるんだよ 15行の関数量産したらfunc1, func2, ...となるのが目に見えている
途中の欠番で変更履歴の推測も可能
素晴らしいドキュメントだな ファンクなあ。
アシッドテイストを入れてもう少しオサレな感じにすれば爆発的にヒットするだろうになあ。 関数名はプログラマがこう動いて欲しいという願望まで func なんて関数名見かけたら fack に置き換えるわ >>728
ドイツ語とか関数名変数名だけでコード9割埋まりそう そう考えると世のプログラミング言語のベースが中国語だったら表意文字だしだいぶ可読性高そう 日本語はむしろ同じ物を表す書き方が平仮名片仮名漢字と何通りもあるから面倒だろ。 表のように与えられた時各学年の人数と全校の人数をふ計算するプログラムを教えてください。
できれば今日中に。
1組 2組 3組 4組 5組
1年 33 35 34 32 36
2年 34 33 35 33 31
3年 31 32 36 30 35 >>734 は学校の宿題か課題の代行をタダでやってくれ、みたいに見えるなぁ。
親切心で教えることが質問者のためになるか疑問ってこと。
元のデータはどういう形で与えられるのかな。
質問の内容から見て、学年数もクラス数も一定で
配列としてソースファイルに埋め込みで良さそうだけど。
学年数やクラス数まで実行時の入力によって可変、となると
かなり面倒な話になるね。 安心して翌朝覗いてみたら何も上がってないという寸法さ execve関数を使うためにclearenv()で環境変数を初期化すると手順にあるのだけど
この関数の影響範囲をどう調べればわかるか調べ方もしくは影響範囲が知りたいです
manページを見ても名前と値の組の環境変数を〜みたいな話しかなくて困ってます >>734
宿題用のスレなかったっけ?
C言語のはなかった? >>740
影響範囲?そりゃ環境変数使うプログラム全てだろう。特にPATH使うようなやつ(外部コマンドをフルパス使わずに動かす可能性のあるプログラム)は影響受けるよね。
その他、動かすコマンドによって影響は違うと思う。これから動かそうとしているコマンドがどういう環境変数を使うかに掛かっている。だからこうだと固定的に言うことができない。 >>744
無知ですまんが
環境変数をクリアするってことは要はLD_LIBRARY_PATHに登録されてるものをすべて無にするってことなのだろうか
これは一時的なもの?それとも永続的なもの?
ここらを参考にsystem関数ではなくexecveを使う方針になったのだけど
むしろ改悪になってるんじゃないかとなってきている
https://www.jpcert.or.jp/sc-rules/c-env33-c.html
http://www.jpcert.or.jp/m/sc-rules/c-env03-c.html
下を読んでなんとなく何がリセットされるのかはわかってきたけども
それがどう影響を与えるのだろうかと
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c703.html 下記のように書いてあるけども
むしろ影響範囲でか過ぎるんじゃねぇか?ってのが困ってるところ
確かに改竄とかの対策にはなるとは思うんだけど
リセットしてしまったことによって使えなくなるものについてはどう担保するのかがわからない
このクリアが呼び出した関数内だけなのか、呼び出したプロセスやスレッドだけなのか、呼び出したら再起動までずっとなのか、呼び出したら再起動しても以降ずっとなのかと
(2) 環境変数のクリア
外部プログラムをコールする(exec(3))前に、環境変数をすべてクリアするとより安全になる。環境変数をクリアするには、clearenv(3) をコールすればよい。
clearenv(3) が無い環境では、以下のように extern char **environ 変数を直接クリアする。
environ = NULL;
※上記の方法で環境変数をクリアしても、system (3) による子プロセスの環境変数は、クリアされず再設定されたものになる。 >>745
一時的もなにもそれを実行したプロセスとそのプロセスからexecしたプロセスにしか影響しないよ。だからfork()後に子プロセスだけでやるなら親プロセスには影響しないしその他無関係なプロセスにも影響はない。 >>745
環境変数はシステム全体で一箇所に持っているものではなくプロセス単位で持ってるものだからね。そしてexecの時に引き継ぐ事もできるようになってるだけ。 >>748
>>749
イケメンな回答ありがとう
それってどこを見たら分かるものなのだろうか
俺調べるのが苦手でどれがそのことを示してるのだろうか
その的確な回答をしてくれてとても分かりやすくてとても助かってるが俺も自身でわかるようになりたい 初心者です
時間取得の関数で待ち時間を作るの方法は使わずに、
現在の処理の完了した後、次の処理に移らせるにはどのようにすればいいんですか?
現在の処理が始まった瞬間に次の処理に移ってしまいます
現在の処理とは、マウスポインタの操作です
お願いします >>752
おそらくそれだけの説明では大半の人が答えられないと思う。(エスパーを除く) マウスイベントの取得はOSの仕事
OSのAPIドキュメント見れ >>751
中身見てみたけどプロセスごとに環境変数が割り振られてるってどれが意味してるのだろうか
homeとかいろいろなものがあるのはわかったのだが.... >>755
「概要」の第3段落冒頭かな。
「環境変数は、各プロセスに付随するデータである」
この1文から「プロセスごとに環境変数は独立」を読み解くのは
この手の文章に対する程度の慣れが要求されるかも。 最後の行は言うまでもなく「ある程度の慣れ」が正しい。
「ある」を打ち忘れたアル。 >>756
納得した
確かにそう読める
waitpidで大気中に割り込みとか入ったらどうなるか教えてくれませんか
manには記載がなかったです >>758
ハード的な割込みそのものはプロセスに影響しないよ。
そいつがシグナル出したらそれ次第だが。 >>760
そいつというと親プロセスでしょうか子プロセスでしょうか
知りたいこととしてはwaitpidを親プロセスが処理を抜けるタイミングについてです
エラーを受けたら抜ける、正常に終了したら抜けるってのはわかったのですが、
これ以外にwaitを解くタイミングがないのかと >>761
waitpidの仕様を聞くんじゃなくて、何をしたいか書く方が早いよ ゲスパーするとタイムアウト付で waitpid のブロッキングから帰ってきて欲しいんでないの? ブロックしないオプション知らないのかな
manまったく読めてねーな セール中
ハロー“Hello, World” OSと標準ライブラリのシゴトとしくみ
http://www.amazon.co.jp/dp/B01GH9AM8C “Hello, Work”標準派遣のシゴトとしくみ サイバーセールは他に買いたいものがいろいろあるからなあ 乱数を使って異なる4つの数を作りたい
色々調べると a[10] = {0,1,2,〜,9};
を作って4つランダムに抜き出すとかも見つけたんだけどこれでも重複回避方法がわからん... >>768
重複しないってルールがある時点で
乱数ではない件について小一時間説教をしたい >>769
乱数を作りたいと言ってるわけじゃないわけでー n個の中から1つ選ぶ。
n-1個の中から1つ選ぶ。
n-2個の中から1つ選ぶ。
。。。 配列に連番で入れて
配列をシャッフルして
配列の先頭から4個抜きとる
お手元のトランプで試してみろよ
絶対に重複しないから とりあえず異なる4つの数を作りたいって言ったけど最終目標がHit&Blowだからマクロについて学んでくる 配列をシャッフルするって方法は、カードゲームや麻雀の洗牌で使うよね。
文字通りシャッフル、一揃いの順番を混ぜ合わせる操作として。
連番で初期化した配列の、乱数で選んだ2つのインデクスの要素同士を入れ替え。
ある程度の回数ループさせると重複なく順番がバラバラになる。
他には、素朴な乱数ルーチンと組み合わせて乱数の質を改善する方法として
乱数プール(配列)の中から乱数で選んだ(インデクスの)値を出すってのを
見たことがある。
最近は高品質な生成アルゴリズムを使うのだろうけど。 「Fisher-Yates shuffle」で検索! >>連番で初期化した配列の、乱数で選んだ2つのインデクスの要素同士を入れ替え。
>>ある程度の回数ループさせると重複なく順番がバラバラになる。
それは初心者にありがちな悪手。回数を増やすと見た目はランダムっぽく
なるけどあまりランダムにならない。
1枚目を全体からの一様乱数、2枚目を残りから一様乱数、・・・という具合に選ぶのがいい std::shuffle,
古いコンパイラならstd::random_shuffle 昨日の768です
Fisher-Yates shuffle
が凄く役に立ちました。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int ary[], int size);
int main(void) {
int list[10] = { 0,1,2,3,4,5,6,7,8,9 };
shuffle(list, 10);
for (int i = 0; i < 10; i++) {
printf("%d,", list[i]);
}
return 0;
}
void shuffle(int ary[], int size) {
for (int i = 0; i < size; i++) {
int j = rand() % size;
int t = ary[i];
ary[i] = ary[j];
ary[j] = t;
}
} これだと10桁表示されてしまうので、4桁分表示するように変更
色々有り難うございました
HitとBlowの処理行ってきます 4桁なら乱数4つ求めた後で重複調べてあったらまた求めるっての繰り返しても良いんじゃないか? arySize = 10
range = 0...arySize # 未満
ary = range.to_a
def shuffle(ary, size, range)
for i in range
j = Random.rand(size)
puts "i=#{i} ← j=#{j} : value #{ary[i]} ← #{ary[j]}"
ary[i], ary[j] = ary[j], ary[i]
end
end
shuffle(ary, arySize, range)
p ary
i=0 ← j=8 : value 0 ← 8
i=1 ← j=9 : value 1 ← 9
i=2 ← j=2 : value 2 ← 2
i=3 ← j=9 : value 3 ← 1
i=4 ← j=7 : value 4 ← 7
i=5 ← j=5 : value 5 ← 5
i=6 ← j=4 : value 6 ← 7
i=7 ← j=8 : value 4 ← 0
i=8 ← j=7 : value 4 ← 0
i=9 ← j=9 : value 3 ← 3
[8, 9, 2, 1, 6, 5, 7, 4, 0, 3]
>j = Random.rand(size)
Ruby で書いたけど、これだと、0〜9 のまま一定だろ。
Fisher-Yates shuffle では、ループの度に、1ずつ減らさないといけないよな? >>779
Fisher-Yates shuffle で検索したら、関連情報として >>777 の方法が
良くないことと、その理由が説明されてるページが見つかった。
可能な並べ方の全パターンが等しい確率で出現するか否か、
というアルゴリズムの原理からの比較は分かりやすくて説得力があった。
個人のページみたいなのでリンクは張らないけど、
「Fisher-Yates shuffle ランダムシャッフル」で出るかと。 最初から全部の組み合わせの分のテーブル作っておいて、
そいつを乱数で選ばせりゃ一発で決まりだろ? いまどきハードディスクなんかテラバイト単位でデータ持てるじゃん。 ふつうに Fisher-Yates でいいと思うよ >>788
おお。斬新なアイデア。
4つしかなくて0〜9ならそれでも問題ないな。(メモリが全然ないような特殊な場合を除いて)。 それするなら、0〜9999の乱数を求めて各桁を使えばいい
配列を作る必要はない >>791
トランプゲーム作った時は真面目にカード配列ん中シャッフルしたわな。懐かしい、 >>793
各桁の検査の為に分解するんだからむしろ効率悪いんじゃね? /wiki/シャッフル (カード)
各シャッフル方法をプログラムで再現するには・・・ >>800
つうか、一回限りなら意味が無いかもな。
テーブルに出た回数も記録して同じ組み合わせは出ない様にも出来たり、テーブル自体も別系列の乱数でシャッフルするとか、
使い道は無限大さ。 なんとなくこねくり回しても数学的に無意味な感じがしてならない。 実務で使う関数とか数学的には何の意味も無いなんて、当たり前だろw C言語覚えたい頼む
このアホに教えこんで理解させるとしたらまずなんのテキスト使う?
教え上手のおまいらに最後の希望を託す
(ちな言われたことは必ずやります) >>805
http://codepad.org/
このコードパッドというサイトで、「ハローワールド」を表示するプログラムを実行できたら、ほめてやろう。
C言語でプログラムを実行するには「おまじない」が必要だ。 しかも、そのおまじないは半角文字と全角文字を区別する。
一文字でも間違えたら正しく動かない。 確実に正しくプログラムを入力したいなら、「コピペ」すればいい。 >>805 これまでのプログラミング言語の経験を申告してもらうかな。
「この辺の知識は既に持ってる相手」という前提があれば、
教える側としても出発点や道順を選びやすい。 >>809
アセンブラ一筋30年
x86, ARM, MIPS, SH, Z80, 6809, R8C, RL78, C2000, PIC, AVR, STM8, HAL9000, RX >>806
片山さんチーッス!
後ほど報告しますね
>>809
FE試験でCASLを福島本で少々もちろん落ちました春再戦はCで挑みたく…
ほかPython本チラ見と開発環境整え中に他の試験のため頓挫
覚えたいが独学でグイグイいけるモチベもなく(あればここで泣きついてないw)誰かにゆるい階段のお膳立てをしてもらい登ってみようかと。これでだめならセンス無しでITから撤退しますw >>810
6809案件って30年前はほぼ収束してないか? >>811
C++をやれ、accelerated c++ を必死に登れば、開運する ところで IT と C言語 って割と隔たりないか? C99とかC14とかCにもいろいろ種類があるそうですが
特定の種類で書かれたソースコードであるかチェックしたいのでsouiu
lint toolってありませんか? >>817
C14なんて聞いたこと無い
gcc には -Wc90-c99-compat と -Wc99-c11-compat オプションがある C14はC++14を勘違いしたんだろうね
Cの種類は、K&R, C90(C89), C99, C11の4つが主要バージョン
主要でないバージョンというと、primeval CとかC84などがある
C90をC89と言ったりするのは、ISO/IEC9899:1990がANSI X3.159-1989を追認する内容だからだ
日本語版のJIS X3010:2003はC99の直訳 >>803
いやほら乱数ってハードウェア利用せずに計算だけでやる場合は処理を複雑にしても無意味なことあるじゃない。 >>810
懐かしいのがあるなあ。
でもアセンブラできるなら覚えるの早いかも。 ワンタイムパスワードで送られてくる数字を事前に当てられたらすごいと思います >>811
時間かかってんな。
「#include <stdio.h>
int main(void) {
printf("ハローワールド\n");
return 0;
}」
これだけ入力してrunさせるだけだぞ。 >>824
putsは知らんヤツ多いし、教育上、発展的ではない。 古典だし、コピペでもいいとしてるし
それなら printf にしときたい所存 putsは使ってないな一行読み込みだしその後の文字加工がめんどくさいからprintfで済ましちゃうな 初心者にprintfを教えると、信頼の出来ない文字列を第一引数として渡す事故が
起きかねないので教育上よろしくないのは常識
[MQ]Z はアホの代名詞 >>805
高橋まな?の
やさしいC
って本がおすすめ プログラミング初心者です
struct hoge *tmp = NULL;
以下うろ覚え
tmp->hage = xxxxx;
最近上記のようなコードに出会いました
明らかにNULLなのにアロー演算子で参照してもぬるぽしないことってあるんでしょうか? tmp->hage = xxxxx は、0番地にアクセスしてるわけじゃなくて
0 + hageのオフセット番地にアクセスしてるわけだから、
hageのオフセット番地が有効なメモリまでズレてれば
ヌルぽしないんじゃない? 組み込みならゼロ番地付近をアクセスするためにありうるかもな。
あるいは単にそのコード部分が動いていないか。 0番地に値を書くのと、ヌルポインタアクセスは見分けが付かないからなぁ なので、NULLの値を全く違う値にしてる処理系もあるんだよ。 >>837>>838>>839
皆さん凄いですね
確かにその可能性あるかもしれません
しばらくそのコードを確認できないので
確認できたら結果報告します >>810
HAL9000?
処理系あるんだっけ? >>838
> 組み込みならゼロ番地付近をアクセスするためにありうるかもな。
これで当たりだと思うけど、
そもそも組み込み(≒MMU無し)ならどこアクセスしてもヌルポしないがな。 >>835
そもそも何が起きてもおかしくない = なにも起きないかもしれない
から
コンパイラによってはコード生成すらしないことだってあり得るし >>843
> そもそも組み込み(≒MMU無し)ならどこアクセスしてもヌルポしないがな。
そんなもん機器による
ROM領域に書き込んだりなにも割り当てられてない領域を読み出したら例外を発生させるとか普通にある >>845
その例外を発生させるものがMMUなんだが 固定のアドレス範囲で例外出だけならMMUほどの複雑な機能いらないっしょ >>846
知ったか乙
アクセス対象がなかったらタイムアウトでバスエラーにするとかにMMUなんてものは要らん >>847-848
ゆとり死ね
つか組み込みの0番地なら普通にアクセスできるほうが多いと思うが。
ARMだとベクタのようだし。 ARMだと未割り当てエリアのアクセスは例外発生する >>849
> ゆとり死ね
指摘されたら逆ギレとかどっちがゆとりだよ w
> つか組み込みの0番地なら普通にアクセスできるほうが多いと思うが。
組み込みなんてピンきりだから普通にとか言っても意味ない
そもそも
> 組み込み(≒MMU無し)
の認識がおかしい
> ARMだとベクタのようだし。
ARMもピンきりでMMU持ってる奴も多いからARMだから0番地アクセスできるとか無知すぎる >>848
セグメントフォルト、バスエラーは同期例外だ
非同期(タイムアウト)でバスエラーなんか起きたら困る
知ったか乙 C言語じゃないけど聞いて良いですか(´;ω;`)
バッチ利用して設定ファイル書き換えたい
1. ユーザーに入力してもらう
2. iniの値をそれで上書き
x.ini
AAA=1
BBB=2
CCC=3
↓
AAA=1
BBB=192.168.0.1
CCC=3
キーはBBBで固定
設定値が少ないから一度全部読み込んで一行ずつtmpに書き込んで〜ってのも問題ない
一行ずつ読み込んで別ファイルに出力とかはできたんだけど
BBBなら〜って判別ができないです >>854
>C言語じゃないけど聞いて良いですか(´;ω;`)
ダメ >>855
そそそそんなぁ(´;ω;`)
まあそうだよね
すみませんでした >>853
恥の上塗り乙
68Kだと普通の設計だぞ
https://www.slac.stanford.edu/BFROOT/www/Detector/DAQ/Infrastructure/Maint/177aih.pdf
あとバスエラーの定義はプロセッサによって異なるからプロセッサも限定せずに
> セグメントフォルト、バスエラーは同期例外だ
とか書くと知ったかがばれるので注意しろよ w >>854
C言語でやりたいならここでいいけど、バッチでやりたいならこっち
【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net
http://mevius.2ch.net/test/read.cgi/tech/1489207631/
あとバッチはその手の文字列操作があまり得意でないので個人的にははPowerShellとか使った方が楽だと思う
【最強CUI】PowerShell -Part 2 [無断転載禁止]©2ch.net
http://mevius.2ch.net/test/read.cgi/tech/1480109402/ 68kでのバスエラーとは/BERRがアサートされることで
何をセンスして/BERRをぶっ叩くかは基板次第だな PC-9801
0x000000 - 0x0003FF IVT(割り込みベクターテーブル)
まぁ弄るなら割禁とか保険かけるんで専用ライブラリ使うかアセンブラコード書くな。 割り込みと例外は違う
まあバスエラー相当が割り込みであがるアーキもあるけど longjmpやC++のthrowのような例外と割り込みは違うが
ソフトウエア割り込みだの記憶保護例外だのは割り込みと同列なもので
CPUのマニュアルでも同じ章に書いてある >>857
この文脈ではメモリアクセスに伴って発生バスエラーであり、それが非同期って事はアスセスして読めた後で、やっぱさっきのなし、ノーカン、ノーカン
って事だぞ お前は班長か? >>865
理解してない奴は、混乱の元だから割り込んで来ないように C言語のヌルポとハード0番地って同じである必要は無いんだよね 0xffffffff番地でもいいはずだね
要は、Cで合法的に定義されたオブジェクトが決して含まないアドレスを
1つ決めごと作っておいてそれを空ポインタということにしようということと
規格合致処理系はそれを必ず決めておかなければならないということ
C以外のたとえばアセンブラで定義されたオブジェクトまでがその規則に従うとは限らないし
そういうオブジェクトをCで扱えてはならないとまでは言ってない
あくまで自己責任でやる限り余計な邪魔立てはしない ポインタはポインタであってアドレスではない
けど中途半端に知ってるとポインタとアドレスがイコールと思い込んでしまう
ヌルポインタはアドレスで説明できないポインタの例だね バスエラーってのは、あらかじめ決めた領域以外をアクセスしょうとしたら発生するのであって、読んだ後にここ読めないからなんて動作はしない。
むしろ決めて無い場合は幾らでも読み書き出来てしまう。例えそれが嘘でも虚構でもな。
後からノーカンなんてならない。 >>871
>例だね
ヌルポインタ以外に特異点はないのでは? >>872
奇数アドレスからのワードアクセスでもでるぞ
なんとかしてくれる方が少数派かと >>874
それは命令アドレスのLSB見りゃ即出せる罠 >>872
わかってない奴は割り込むなって言っただろ
痛々しいぞ >>876
お前がわかってないだけだろ w
68K の話ならデータが読めると言うのは DTACK のアサートで示される
その後に BERR をアサートしても受け付けなかったと思う
(そんなアホな設計はしたことないから本当にそうかどうかは試してないけど)
そもそも BERR は非同期じゃないからお前が初めから頓珍漢なだけ >>874
68000 の時代はデータでもダメだったけど今時はプロセッサ側で何とかするアーキも多いと思う intelの石はワードやロングワードのアクセスでも奇数アドレスからだろうとマシン側で何とかしてくれるから生き残ってるんだと思うわ プログラミング歴1年になったけどみんなの言ってることがわからなさすぎて辛い
アセンブリもやった方がいいんか? >>879
普通に組んでてあまりありがたみを感じたことはないけど... >>835
hogeがでかい配列で、オフセットの位置に確かに値が書かれているのを確認したことがある。
0番地付近のメモリを参照する人はいい迷惑だなと思った >>852
ゆとりマジで死ね
韓国人も死ね
お前らはそういう所がいけない。俺は逆ギレしているのではなく、単にキレてるだけだ。
お前らはそうやって常に話をすり替え、被害者ポジションを確保する癖があるが、それは根本的に間違ってる。
そもそも、ここにはお前らより知識のある奴が沢山居るんだから、お前らの聞きかじりで回答する必要はない。
話が余計におかしくなってるだろ。
話を>>841に対する回答に戻すと、841の話しぶりからして、
俺は以下を補足した方がいいと思ったから>>843を投稿したんだよ。
1. 841の言う「ヌルポ」はOSがMMUで捕まえるヌルポである。
2. >>838の言う「組み込み」はMMUがない場合を指している。
3. 838の言う「ゼロ番地付近をアクセス」はOS+MMUがない場合を想定している。
4. 従って838のケースでは841の想定するヌルポは発生しない。
というのを伝えるために書いたんだ。
それをお前は知ったかをしたくて、「MMUなら俺も知ってる!」と勝手に食いついてきただけ。
読む限り、お前は例外がどう動くのか理解できてないと分かるが、無知なままでいろ。
俺は841を助けようとしたのであって、韓国人とゆとりは死ねとしか思ってないから。
VBRを変更する場合、確かに0番地付近を構造体アクセスして転記するんだよ。
838はこれに気づいた、そしてそれを伝えた。
俺は841が「0番地アクセス=ヌルポ」と思っているっぽいので、(これは通常のOS+MMUならそうだが)
それとは違うぞと分かるように補足した。
それに知ったかゆとりが食いついてきただけ。
> プログラミング初心者です (>>835)
という点からしても、838で当たりだろう。
VBRを変更するならかなり初期で対応するので、初心者でも目に付く場所に記述される。 >>835
それをコンパイルするコンパイラの仕様とそれを実行するマシンアーキテクチャによって変わる。 OSによっても変わるかな。
まあしかしOSそのもののソースコードならそう書いて正常動作したとしても特におかしくないかな。 >>882
うん普通は何も考えない。
だから他の石を同じ感覚で使ってポインタ渡しした構造体のメンバーにアクセスして焦るんだわ。
intelの石ならこんな事起きないのにってな。 >>888
ゆとり死ね
てかマジな話、知らないのならちょっと様子見する余裕を持てよ。 >>891
ゆとり死ね
俺はその理由も既に書いてる 過去レスまでちゃんと読んで欲しいならコテ付けること☆ 1点、気になるのがNULLと書いていたことだ
0番地にアクセスすることを意図しているコードは
struct hoge *tmp = NULL; ではなく
struct hoge *tmp = (struct hoge *)0; と書くだろう
思うに、単にtmpへの代入を忘れただけではないか?
そういうポカミスを多発するどんくさいやつほど
「変数は必ず初期化」に固執する >>894
まあ、ゆとりとか韓国人とか言い出す時点でお察しって奴やね w >>893
ゆとり死ね
韓国人死ね
俺が読めといっているのは>>884のことだ馬鹿タレ
どうせお前らは日本語が不自由で3行以上は読めないから意味が分からないのだろうが
お前らが迷惑行為を働くことに対して俺はキレてるんだよ
>>895
環境によってはwarningが出る。VC++とか。
個人的には意味ないとも思うが。 MMU とか VBR とか知ってる言葉を必死に使ってるって感じが出てて微笑ましいな >>895
初期化してなきゃ警告が出るのにね
>>897
お前は的外れなことしか言わねーな C言語に関する話題で意味のある文脈で韓国人なりゆとりなりが出てくることはまず無いだろうから、NGしとけばいいな。 >>898
その程度の用語で威張れると思える時点で終わってる
ゆとりは本当に馬鹿だな
ゆとり死ね
韓国人死ね > その程度の用語で威張れると思える時点で終わってる
>>884に言ってやれよ w >>903
ガチアスペか?
韓国人か?
それじゃ論理が通らんだろ
ID:KXDpqAfSM = ID:FCwL/bM6M = ID:wOa8xeUW0 = ID:tW10X6gZ0 = ID:JlwKPeYd0
お前だけがぶっちぎりの馬鹿だな
韓国人死ね NULLが(void *)0になったのっていつからだっけ
C89には無かったよね? おっぱいおっぱいぽよんぽよん
おっぱいおっぱいぽよんぽよん
仲良くしようぜ >>906
つまりこうであると。
#include <stdio.h>
int main(int argc, char *argv[])
{
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++)
fputs("おっぱい", stdout);
for (j = 0; j < 2; j++)
fputs("ぽよん", stdout);
putchar('\n');
}
return 0;
} そういや古いソースには char *p なのに if (*p == NULL) みたいに書いてあるのがあって、今時のコンパイラだと警告出しまくりになるんだよなあ。 >>908
こう書いてもいいね。
#include <stdio.h>
int main(void) {
int i;
for (i = 0; i < 8; i++) {
if (i % 4 < 2) fputs("おっぱい", stdout);
else fputs("ぽよん", stdout);
if (i % 4 == 3) putchar('\n');
}
return 0;
} NULLの値が、0xDEADC0DEになってる環境なら知ってる。 >>904
頓珍漢な奴に論理とか言われてもなあ w >>910
なるほど。
ちょっと変形してビット演算でも行けるな。
#include <stdio.h>
int main(void) {
int i;
for (i = 0; i < 8; i++) {
fputs(i & 2 ? "ぽよん" : "おっぱい", stdout);
if ((i & 3) == 3) putchar('\n');
}
return 0;
} #include <stdio.h>
#include <stdlib.h>
void o(){ fputs("おっぱい", stdout); }
void p(){ fputs("ぽよん", stdout); }
void r(){ puts(""); }
void e(){ exit(0); }
void (*a[])() = { o,o,p,p,r,o,o,p,p,r,e };
int main(){ void (**x)()=a; while(1) (*x++)(); } >>877
>struct hoge *tmp = (struct hoge *)0; と書くだろう
このように書いても*正しく*NULLポインタが代入される
char zero[(struct hoge *)] = {0};
memcpy(tmp, zero, sizeof zero);
としないとダメ
逆によく見かけるポインタを含む構造体をmemcpyで0に初期化するのも正しく無い >>915
それがわからんやつが、ここに、いや世界にいると思っているのか?
俺のはコードに意図を残すという論旨だったが、それがわからんやつがおまえさんか
ア ホ か 意図を残すために間違ったコードを書くとは理解に苦しむ
コメントで残した方が数百倍マシ >>915
いったいそれと BERR になんの関係があるんだ?
ますます頓珍漢過ぎる w >>912
連呼リアン死ね
>>919
アスペ通り越してキチガイか?
まあどっちにしても死ね >>919
>>895と間違えてたな
>>921
memcpy(&tmp, zero, sizeof zero);
こうだね >>920
> アスペ通り越してキチガイか?
基地害はお前だろ w
>>915のアンカー先見ろよ 完全初心者です。文字列の性質について質問させてもらいます。
柴田望洋著 「ポインタ完全攻略」という書籍にて次のような内容の記載があります。
・文字列リテラルは変数ではないが記憶域を占有する
・文字列リテラルはcharの配列である
そして次のページに、
・このような文字列リテラルは、整数にいいかえると「定数」に相当するものであるから、自由に取り扱うためには
変数に格納する必要性がある
・そこで利用されるのがcharの配列である
ここでわかりかねるのが、文字列リテラルというのはそもそも定義自体が「charの配列」であるはずなのに、
これをまた「charの配列」に格納するの??と、疑問に思ってしまったわけです。
これはいったいどういうことでしょうか。 >>926
謎
通常配列名かcharのポインタで参照するぐらい。 "This is C string literal."
これが文字列リテラルね。参照すると文字列定数になる。
char s[] = "This is character array.";
これが文字の配列の変数sの宣言と初期化ね。sはヌル文字を含めた文字列データ先頭を参照する。sizeof(s)は、ヌル文字を含めたデータのサイズになる。
const char *p = "This is pointer to characters.";
これは文字列の先頭へのポインタになる。サイズはアドレスのサイズ。データは変更できない。 >>926
ちょっと進んだ知識になるのですが。
プログラムがコンパイルされたのち、プログラムの実行の段階にはいったとき、コードや変数領域やその他もろもろがメモリ上に展開されるわけですが、
文字リテラルは、場合によってはメモリ上の書き込み不可能の場所に置かれます。たとえば ROM メモリとか。
もし、その文字リテラルを適宜書き換えて使いたいのならば、書き込み可能な場所にコピーして使うでしょう、それが、変数であり配列でありするわけです。
ただし文字リテラルを書き換えることが可能な環境では、それを見越して、文字リテラルを書き換えて対応する、という手がないわけではありません。
まあ一般的には行儀が悪いと思われています。それに文字リテラルを途中で長くしたい、とかは不可能ですし。 >>926
おまえさんが疑問に思っているのはこういうことか?
puts("aho"); で済むのを、わざわざ
static const char array[] = "aho";
puts(array); としなければならないのかと 複数の文字列の先頭番地を便利に参照したいぐらいじゃないかな。 >>927
>>928
>>929
>>930
>>931
みなさんお騒がせいたしました。みなさんから頂いたアドバイスを参考にさせていただいて、
よく考えてみたところ、あまり深く気にするべきではないように感じてきました。
先ほどの本の「配列による文字列」「ポインタによる文字列」という箇所を読み込んだところ、
「配列による文字列」はcharの配列を宣言して文字列を用いる場合で、「ポインタによる文字列」
は「char p* = "ABC"」のように、ポインタchar *を宣言してなんらかの文字列リテラルで初期化する
手法であるとのことです。
おそらく・・・よくわかりませんが、直観的に私が当初感じていた疑問点というのはここら辺の部分に帰結
する話だと思われます。
現段階での私の理解
・文字列はそもそも配列?などということは気にしなくてもよい。
・文字列を配列charに格納してからポインタで操作する方法がある。この場合は当然配列の規則に従う
ので代入とかはできない
・char * = "ABC" のようにchar[]を宣言せずに文字列をポインタで操作する方法もあり。
この場合は p = "SEX" のような代入ができる。 char *p = "string";
はconstがない時代の古い書き方だよ。
良い子は
const char *p = "string";
のようにconstを付けること。 >>933
const
中身を変えられないとかいう…。
ありがとうございます。勉強になります。 immutable・不変かどうかの区別。
不変オブジェクトは、メモリ内の読み込み専用エリアに置けるので、最適化しやすいから、
できる限り、不変が望ましい
Ruby, JavaScript では、文字列は可変オブジェクトだが、freeze すると更新できない
s = "hello"
s.freeze
よく覚えていないけど、この本が良かった気がする。
詳説 Cポインタ、オライリー、2013 char *s = "abc";
と初期化した場合は
s[1] = '\0';
のようなことをすると Segmentation fault になったが、
char s[] = "abc";
の場合は
s[1] = '\0';
が問題なくできた。その後 puts(s) をすると a だけが出た。
OS は Linux でコンパイラは gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) だ。
-S でアセンブラの出力をさせるとどちらも "abc" をリードオンリーの領域に配置させているが
char s[] と書いた場合は関数の初めでスタックに領域を確保してそこにコピーしてからアクセスしていた。
char *s の方は単に先頭アドレスを使うようになるだけ。(そしてリードオンリーの領域に書いて死亡)。
man gcc を見ると -traditional や -fwritable-strings で文字列リテラルに書き込めるようにできるとは
書いてあるが、この man page 自体が古く、4.8.5 では既にこのオプションは使えなくなっていた。 >>932
> 現段階での私の理解
だいぶ間違っているが、ド初心者ならあまり細かく考えずに進めてもいい。
(プログラミング自体の初心者なら、最初の段階で重要なのはそこではないから)
キッチリやりたいのなら、メモリを確認しながら進めた方がいい。
IDE等使えば簡単に見えるし、何を間違っているかすぐに理解できると思う。
>>935
JavaScriptのstringはインミュータブルだ馬鹿タレ >>932
よく言われることだけど、cに文字列型はない
cで文字列という時は必ず文字の配列のこと
char * p = "ABC";
は
char x[] = { 'A', 'B', 'C', 0};
char * p = x;
って書くのを少し楽に書けるようにしてくれてるだけ
プログラミング自体の初心者なら、cで文字列を扱うこと自体を後回しにした方がいいと思う > cで文字列を扱うこと自体を後回し
俺もそう思う
ど初心者にはちとキツい char x[] = { 'A', 'B', 'C', 0}; は.dataに保存されるから同じじゃないだろ。 ROMに追い出すconstの嵐w
#pragma でもいいけれど。 C++にconstexprがあるのはconstの設計ミス >>944
いや、const無くても文字リテラル自身はROMに書かれてるんだけど、デフォルトはそれをわざわざ初期化の時にRAMに展開して書き換えられてもいいように準備して待ってるんだよな。
それがもったないからconst付けるんだ。 >>946
ところが chrar * 変数に対する初期化に文字列リテラル使うと>>936のようにエラーも警告も出さずにコンパイルが成功してリードオンリーの領域に書き込みアクセスするプログラムができてしまうと。 >>947
それはパソコンアプリ向けコンパイラが通常じゃROM化に対応してないからだよ。
昔からある話で、特別にROM化可能なコンパイル設定しないとな。 constつーか__attribute__((section(".rodata")))だろ >>932です。
みなさんありがとうございます。
C言語では文字列を扱うのは難しいようですね。
しかし使うだけであれば「なんとなく感覚的」に可能か?と思われます。
ところで、ネットや本でC言語の難所はポインタだ!とよく書いてますが、この文字列の部分というは正に
ややこしい部分ではないでしょうか?
ポインタと配列の関係性の理解だけでも一山あります。
それが文字列となると、ポインタ+配列+文字列の知識の理解、となってしまって。
構造体を勉強するのが先でしょうか。 >>950
この程度で難しいというなら、あきらめてJavaに行った方が身のためだ。
plain Cは時代遅れで、そのまま使うとセキュリティに穴があるシステムを量産してしまう。
Cはロボットにまかせて、人間はC++みたいな高度なプログラムを使うことが望ましい。 >>951
それを言うなら静かに自力で解決するやつ以外すべて足切り点未満だろ
plain Cで隙だらけのコードを量産するおまえさんが体現しているようにw >>951
最近プログラミングが騒がれているのでpythonを始めたのですが、どうもプログラミングしてる感
が持てないためC言語をかじりだしたのです。
javaはコードが長そうなので嫌な感じですね。C++はえらく難しいらしいですし...
まあpythonかrubyが普通に使えるくらいになれば十分なのですが... >>953
まずプログラミングしてる感が十分感じられるくらいまでpythonに慣れましょう 余所の芝が青く見えるので、そっちをつまみぐいする進め方は
正直どっちも中途半端に覚えてるつもりになって、実際には道具として使えてない状態に陥りそう >>953
C++ は教育的配慮に欠けていて、自力でなんとかしないといけない部分が多いし、ここ5〜6 年で規格がばたばた改定されたのに教科書が追いついていない
ついでに私もC++11later には追いつけていない(;;)
プログラムしている感は満載なんですけれども。
java は、資格とかもあり教育的な環境が整っているし書籍も多い、言語的な紛れもC++ に比べると少ない、個人的にはお勧めです。
プログラムしている感は、それなりにあると思います。
python 私もやっているんだけれども、つづりミスに悩まされています。なにか、いい支援環境はないものでしょうか? >>953
Pythonで何かをあやつることをやってみたら? GIMPや、Inkscapeや、IoTデバイスとかをあやつってみるんだよ。 Pythonは万能だから、株取引とか天気予報の表示とかニュースフィードとか、思い付く限りのことができるぜ。 >>959
地震の原因は、地球内部の核融合反応をエネルギー源とするマントル活動だから、三次元マントルマップを
作って天気予報みたいにスパコンでシミュレーションすればある程度予測可能なはず。 地下水で地盤ががたがたになったところを爆弾で引き金ひいてるだけだよ >>956
【Microsoft Tech Summit】APP017 PowerShellの新しい相棒 Visual Studio Code
http://www.youtube.com/watch?v=0zo6z0yHrGk
2017/01/23 に公開された動画 >>966
これかな?
https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E6%B2%88%E6%B2%A1
最近読んだので記憶は確かだが、細菌が地震の原因とは書かれていなかった
地球内マントルの対流の動きが変わり、ちょうど日本の真下でマントルが持ち上がるように変化した、という推測でストーリーは進んでいる そしたら探査船ちきゅうでぐぐれ
なんで非キリスト教国のまわりばっかり掘ろうとしてるんですかね >>965
その宇宙人たちが接触した人類がお前さんだけだからだろう >>968
映画だと、
日本列島の下に沈みこむ海洋プレートが微生物が発生するメタンガスの影響もあって
沈み込み速度をましているため、日本列島が引きずり込まれて「一気呵成」に沈み込む
ことになってます。 4つの整数と + - * / を組み合わせて10を作ってその組み合わせを表示する、みたいなプログラムって作れますか? C++ だけとクラスとか定義してないから入出力を書き換えればC言語にできるんじゃね?
http://apollon.issp.u-tokyo.ac.jp/~watanabe/int/ten.html >>977
ありがとうございます
計算してみたら1536通り?とかで気が遠くなってましたが、頑張ってみます >>961
>地球内部の核融合反応
コアは6000K の液体または固体金属、とのことだが、核融合にまでは至っていないかと思っていた
しかし、ググってみると、重水素の核融合が起こっているという仮説があった
http://www.natureasia.com/ja-jp/srep/abstracts/85904
この融合反応は wikipedia には載っていないなあ…よくわらかないね まず、カセットテープからBASICを読み込ませます。 *=/+'")(^ などのアスキーコード内の記号の意味をまとめているサイトを探してるのだけどおすすめ知らないかな?
セキュリティ考慮したテストケースを考えてる
ipaでみた記憶があるのだけど見つからなくて... このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 58日 1時間 31分 0秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。