C言語なら俺に聞け 146
■ このスレッドは過去ログ倉庫に格納されています
仕事や学校でCを使う予定があるなら、
現場で使ってる開発環境に合わせるのが最善だろう。
IDEの優劣よりも優先されるんじゃないかな。
今のご時世にCに関してまったくの素人だと、
Cを使うのにIDEが必須と勘違いしてる可能性もあったり。
任意のテキストエディタで.cファイルを打ち込んで
コマンドラインでコンパイル、実行という手順が
紹介されてない入門書や入門サイトがあるかも。 >>305
それはさすがに老害の発想だぜ。
今時のemacsはインテリセンスも出るし、
flyCheckで文法エラーもリアルタイムで表示される。
お前はそういうの知らずに言ってるだろ。
(なお、vimも同様だったはず)
最終的にはそういうのがうざくなって色々切ったりするけど、
俺は初心者こそIDE(というかゴテゴテの環境)でスタートすべきだと思ってる。
大体において、
「動きません。でも私のコードは完璧です。これはIDEのバグですか」と言ってくるんだから、
「ブレークポイントを全部の行に置いてループも1回ずつステップ実行して確認して死ね」
と返せないと意味無いだろ。 >>306
> 紹介されてない入門書や入門サイトがあるかも。
VSがそうですが何か?(なおC++)
https://msdn.microsoft.com/ja-jp/library/jj620919.aspx
てかマジな話、VSで閉じていいのならそんな知識いらんて。
> 現場で使ってる開発環境に合わせるのが最善だろう。
> IDEの優劣よりも優先されるんじゃないかな。
これはその通りだが。 >>300
>つかそもそもEclipseっていいのか?
>あれ、Linuxだと他選択肢がないから使われてるだけでは?
組込みだとマイコンのメーカーのIDE(コンパイラ)が
EclipseベースなIDEな事があるから
VSではなくEclipseに馴れるって意味で選択する意味はあるかな
実際組込み現場でCでの開発想定したこの書籍だと
Eclipseで開発する事を想定して書かれてる
http://amzn.asia/5PyjxPA
あと余談だけど今さらvimだのemacsだの時代遅れじゃね?
マルチプラットフォームで動くVSCodeやAtom選択した方が
学習コストも少なく高機能だと思うんだけど >>309
> EclipseベースなIDEな事があるから
なるほどね。
> あと余談だけど今さらvimだのemacsだの時代遅れじゃね?
俺が勧めているわけではないが、「エディタ」という意味ではありだ。
「Emacsは100年のエディタだ」と言われるとおり、あれはマジで100年持つだろう。
そういう構造になっているし、実際今も余裕で現役だ。(Vimも同様)
最大の利点はDSLとしてのEmacsLispだ。(なお独立して使えるらしいが)
この点、VSCodeやAtomもOSSであり同レベルの拡張性を持ってはいるが、
ユーザーベースが違いすぎる。
今現在の状況なら、先に死ぬのはVSCodeやAtomの方だ。
学習コストなんて所詮慣れだし、数ヶ月もあれば問題ない。
当面使う予定がなければすぐに学ぶ必要性はないが、
時代遅れな事を肯定して欲しいのならそれは無理だ。
emacsとgdbは組み合わせて使うことは出来る。
ブレークポイント、変数等を表示出来るlispが提供されればそこそこ行けるはず。
もう既にあるかもしれんが。 フォルダ一括コピーしたいです
c++だとファイルコピーにはCopyFileなるものがあるみたいなのだけどそれはフォルダのコピーはできないようなので、
他のものを探してたらSHFileStructでフォルダまるごとコピーができると知りました
これって再帰的に中身まで見てくれるのか見てくれないのか調べてたのですがわからなかったので
再帰的にコピーしてくれるか否か教えてほしいです >>311
そういうのはOSによって、あるいは使用するライブラリによってやり方が変わるから最低でもOSが何なのか書いて質問した方が良い。 学生ならCLionも無料なのでおすすめ
VSCodeもまだ情報が少なめなものの悪くない system("robocopy /? >tmp.txt");
system("notepad tmp.txt"); >>311
やって見りゃいいんじゃね?
>>313
>>311みてOSわからないボンクラは黙ってて やればわかる
やらない奴はいつまでたっても>>317みたいなボンクラなレスを返すだけ w xcopyを呼び出すんじゃ駄目なのか?
車輪の何とかって気がするんだが SHFileOperation() はコピー先にフォルダが無い場合、再帰的にフォルダ作ってくれるね
ただ SHFILEOPSTRUCT の pTo に渡すパス文字列で
ディレクトリのセパレータが / はダメで \ じゃないと再帰がかかってくれない
D:\ 以下フォルダが無い状態で
pTo = "D:/aaa/bb/ccc/ddd";
SHFileOperation()
⇒ 「フォルダ ddd が作れない」 D:\ 以下のフォルダ状態は変わらず
pTo = "D:\\aaa\\bb\\ccc\\ddd";
SHFileOperation()
⇒ D:\aaa\bb\cc\ddd まで再起的にフォルダができる 超初級で申し訳ないですが、以下のコードのどこに問題があるのか教えてください。
円の周長と面積を求めるものです。(半径は整数値で入力。)
コンパイルはできましたが、.exeファイルが実行不能状態です。
#include<stdio.h>
main()
{
int hankei;
double pi = 3.1415926535;
double enshu;
double menseki;
printf("半径を入力して下さい:\n");
scanf("%d",&hankei);
enshu = 2 * pi * hankei;
menseki = pi * hankei * hankei;
printf("半径%dの円の円周は%lfで、面積は%lfです", hankei, enshu, menseki);
} >>323
実行不能状態とはどのような状態か詳しく書くように。 >>323
ソースコードは問題ない。
戻り値型省略が警告になるくらい。
エスパーすると、
警告をエラー化するオプションが指定されていて、最新コードを実行しているつもりが古いコードを実行していたとか。
もしくはソースコードを直接実行しようとしているとか。 ま、何れにしてもどういう環境で何をやってどうなったか詳細書いてくれんとわからんな。
WindowsでEclipse使ってる場合とLinuxでvimで入力してgccでコンパイルしている場合では答えが大幅に変わるし。
exeと書いてあるからWindowsだろうと予想することはできるが実はWindowsじゃなくてexeが作られるものと誤解しているだけなんてことも初心者ならありうるしな。 Windows 10の開発者コマンドプロンプトでコンパイルしました。 cl (ファイル名).c
拡張子がexeのファイルが生成されました。
そのexeファイルをダブルクリックすると、マカフィーによって「脅威を隔離しました」というメッセージとともに削除されてしまいます。
何度やってもそうなります。 マカフィーが止めなかったら人類はその瞬間、消滅していたかも知れない この頃は単にコマンドプロンプトと呼ばずに頭に開発者って付くのか? コマンドプロンプト上で実行したらどうなる?
cl で実行ファイルを作ったら、そのままコマンドプロンプトで
実行ファイルの名前を打ってEnter、で動くと思うけど。
コンソールアプリケーションをダブルクリックで実行した場合、
scanf系の標準入力に必要なコンソールってどうなるんだっけ? Windows10(17134.137) + VisualStudio2017(Ent15.7.4) の開発者コマンドプロンプトで確認してみたけど問題ない
https://i.imgur.com/SZMlQ7g.png マカフィーのチェックがおかしいわけだな。
自宅のPCでマカフィー入ってるのあるから帰ったら試してみよう。 >>328
いやいや、私はヤバいウイルスとかを作る技量はないので…
知らぬ間に作るなんてことは…
>>331
プロンプトで実行すると、長いエラーメッセージが出ます。
その場合もマカフィーが反応します。
マカフィーのせいなんですかあああああ…?
マカフィーを止めるのはなんか面倒です。 そういやマカフィーの創業者のジョン・マカフィーは壮絶な人生歩んでるのな。
知りたい人はWikipediaでジョン・マカフィーで検索してみな。 なんでマカフィーを後出ししたのか教えて
>>323では隠してたよね 今頃常連は君のPCの中で、あんなことこんなことしてるかも >>334
一時的に無効にするのはそんなに面倒じゃないよ
クリック数回でできるレベル
それすら出来ないなら金で人雇って問題を解決してもらうしかない そんなことは普通にできますが,インターネット接続を切ったり入れたりもしなきゃいけないじゃないですか
それも簡単ですが,マカフィーのいたずらのせいでそんなことをいちいちやるのは…という意味です 止めたついでにアンインストールするのがいいと思うよ。 プログラムを作成自体を犯罪者予備軍と見なしているのかな・・ 使ってるのがwindows10ならもうウィルス対策ソフトなんて要らないよ。重くなるだけ。
windowsDefenderで十分。2つ入れてるとトラブルの元。 C++でディレクトリ無かったら作る関数って何かあります?
LinuxのPOSIX系だと見つからんかった >>334
マカフィー入った環境でやってみたけど普通に動いた。
但し、Cコンパイラは Cygwin の gcc だ。 >>341
別に一時的に無効化するだけならネットを切る必要は無い
セキュリティ的にどうしても不安があるっていうならLANケーブル抜けばいい
それすら面倒ならパソコンを窓から投げ捨てろ C言語で集合、和集合、積集合を実装したいのですが、正直アイデアが浮かびません。
どうすれば良いのでしょうか?
教えていただきたいです。 C++のstd::setを参考にしない手はないな。
集合をデータとして保持したいなら、要素の個数と、動的配列かリストが必要になる。 集合は順序列の順序を無視したものと考えられる。
比較する場合は、ソート済みにしてから比較する必要がある。
多重集合ではない場合は変更の際に要素を単一化しないといけない。 setは赤黒木だけど、実装したことある奴いるの?俺はaddだけ実装して満足して諦めたよ。
hashtableのほうが遥かに簡単だからオススメ。
整列済みの配列も簡単でいいと思うよ。
でも一番楽なのは、ライブラリを拾ってくること。 >>350
積集合の方が比較的簡単
和集合は同一要素であるかをどうやって判別するか
要素を構造体で表した時に
異なる構造体でも同一要素である判別が出来なくてはならないので
単純な例だと
複素数型と実数型と有理数型とcharとintとfloatとdoubleとか >>357
意味が全くわからんわ。
そもそも和集合も積集合も補集合考えたら手間が変わるはずないし。 型が限定されていれば簡単
(>>353や>>356)
>>357みたいに、
いろんな型が混ざった和集合だと
いろいろと大変 一般論で言えば、集合の実装はハッシュを実装することに限りなく等しい。
どんなオブジェクトであれ、シリアライズ(要は文字列化)できる。
そうすればハッシュで一意な比較的小さい非負整数の番号に写像できる。(←条件により、ここが難関になりうる。ハッシュを使わずに済む番号が用意されていればそれが最適)
逆写像も用意できる。
最大番号までの要素数を持つ整数配列で0/1で要素の有無を表現したものが一つの集合を表す。
2つの集合の和と積は0/1の|と&で表せる。
配列サイズと計算時間の節約にはビットマップ化すればok。 >>361
>ハッシュで一意な比較的小さい非負整数の番号に写像できる。
ハッシュ関数は一般に衝突するもの、と考えるものですが、範囲を小さくすれば特に… >>362
広い視野で具体的な提案をどうぞ。
>>363
要素が固定なら完全ハッシュ関数が構成可能。
>>364
和集合とか積集合とか求めてもそこから要素リストが作れなければ無意味というだけ。これは逆写像を作ってるのと同じ。 >>350
ビット演算使えば良いのでは?
特に要素数が32とか64以下に収まるようなら今どきのPC用コンパイラならunsgnedのintやlongで行けるよ。
uint32tみたいなビット数保証するtypedefされた型使った方が良いけどね。 うわっ
また特殊な条件でしか使えない方法を
まあ>>350が悪いわけだけど >>365
オペランドが入力されたら都度完全ハッシュを求めるの?
地味に和積集合計算するよりはるかにコスト高だろ… 全順序化が簡単か
効率的なハッシュが(簡単に)作れるか
想定する集合の大きさ
比較のコスト
ノードのデータサイズ
この辺が違うと適した実装が全く異なる
この辺をヒアリングするのが先と思う >>368
「要素が固定なら」と条件付き。よく読んでね。
そうじゃない場合は難関になりうることも言及ずみ。よく読んでね。
衝突してもハッシュ表は実装できるわけで、全順序化が不可能なわけではない。 >>369
これ。
これら含めて最大限一般化したら>>361になるよね。 >>370
何に対して固定なのか、いつ固定されるのか、稚拙な日本語から読み取れと?
それに>>361にはそんな条件は書いてないぞ。にもかかわらず、ハッシュから写像ができると書いてある。意味不明すぎるわ。 >>371
ならねーよ
>>355も書いてるけどこの手のやつの定番は赤黒木とかB-Tree
ハッシュはデータ量が見込めないとハッシュテーブルサイズが決められないから使い辛い >>355
作ったことあるけど使えない程度に遅かったわ
Cで赤黒木ならLinuxかfreeBSDから拝借するのがよさそう c++のmapとsetの実装アルゴリズムだぜ。
検索速度はハッシュテーブルに劣るけど、使えないほど遅いってことはないだろ。 C言語初心者です。
typedef struct{
int tate;
int yoko;
double *mat;
} Mat;
void read(int x,int y,Mat *a){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
printf("[%d][%d]->",i+1,j+1);
scanf("%lf",&a->mat[i][j]);
}
printf("\n");
}
return;
}
プログラムの一部を抜粋したものなのですが、これでコンパイルすると
subscripted value is neither array nor pointer
というエラーが出てしまいます。
二次元配列はポインタで表せないものなのでしょうか? >>376
メモリ空間は1次元だから。
arr[y][x]は*(arr+y*WIDTH+x)と同じ。WIDTHがわからないとできない。 >>376
matがdouble型へのポインタだからだよ。
結果mat[i]はdouble型になり、mat[i][j]はdouble型に[j]を付けたことになるので、配列でもポインタでもないのに[]つけるなって怒られてる。
きっとmatのメモリ確保は
mat = malloc(sizeof(double) * tate * yoko);
みたいにやってるだろうから、i列j行目にアクセスするときは
&a->mat[i + j * yoko]
みたいにしないといけない。
あと、上の例ならjを外側、iを内側のforにしたほうが最適化されやすいと思うよ >>375
作りが悪くて目標に届かなかっただけ
100万件のinsertに1秒程度が目標だったけど2.5秒ぐらいだった >>376です
お二人とも丁寧に教えていただきありがとうございます。
>>378さんの方法で改良してみたのですが複数のMat構造体を作り,tateとyokoの値のそれぞれ別にしたときにプログラム実行中に入力が強制終了されてしまうのですが、配列の作り方に何か不都合があるのでしょうか >>381
あるあるネタだね。
何処かでx/y、i/j、tate/yokoが逆になってる。 Ruby のハッシュでは、データ数と共に、バケット数を増やしていく。
バケット数は、2 の累乗の次に現れる素数。
2^n + a, 2 <= n <= 30
8 + 3 = 11
16 + 3 = 19
32 + 5 = 37
64 + 3 = 67
128 + 3 = 131
256 + 27 = 283
512 + 9 = 521
データ数が、バケット数の5倍を超えると、ハッシュが再構成される。
再構成時には、極端に遅くなる
11 * 5 = 55 だから、データ数が56 個になると、バケット数が19 になる。
19 * 5 = 95 だから、データ数が96 個になると、バケット数が37 になる AVL では、左右部分木の高さの差を、1 以内にしなければならないから、
2 になると、木の回転・縮約など、再構成をしなければならない。
つまり、しょっちゅう再構成が起こるので、遅くなる
赤黒木では、左右部分木の高さの差を2 倍以内にしたから、再構成が起こりにくい。
左が10 なら、右は20 まで、再構成が起こらない
タスクスケジューラーに使われる
例えば、100個のスリープしているタスクがある所に、
木に実行するタスクを追加して、重みに従ってソートすると、
追加したタスクが選ばれて、木から削除される
つまり、ほとんどの葉の順位が変わらなくて、
追加した葉が、すぐに削除されるようなものに適している makefileってPowerShellで作れないとかないですか? >>385
君が何を言わんとしているのかがよくわからない >>387
あれで人に言葉が通じていると思い込んでる可能性があるから書くべきだろう なんとなく、コマンド行をタブで始めてなくて(スペースで空白を作ってて)、
makeがエラー出してるような気がするなぁ。
エディタのTab→スペース自動変換が効いてるとか。
PowerShellとは直接関係なくて。 C++ C言語 C#の初心者用スレはないんですか?
探してみたけどそれらしきスレが見当たらないです >>392
まずスレッド一覧を開いてCTRL+FでC++と入れて検索しました
一応それらしき所を見つけたんですが書き込んだ瞬間変なおっさんに噛みつかれたので
初心者スレじゃないのかな。。。と。
入門にあったスレはないでしょうか 初心者歓迎なのと甘えた初心者に手とり足とり教えるのとは違うよ >>393
ここでの『初心者』はANSI Cの規格を読み込んでいること前提
プログラム未経験者は取り合えず柴田茫洋の明解C言語を読め 明解C言語は分かりにくいからやめとけ
苦Cの方がいい デバドラを書く
低速言語のボトルネックをカバーする こういう連続線をクリックで描きたいなんか参考になる本だとかサイトってありませんか?
https://i.imgur.com/Emj85bk.jpg ■ このスレッドは過去ログ倉庫に格納されています