痔になりやすい生活習慣とは?

素人ですが、職場で必要に迫られ模索中です。
ご教授お願いします。

ユーザ情報.csvというシフトJISのファイルを、同じフォルダで同一名のファイル、ユーザ情報.csv(UFT-8(BOMなし)に変換するバッチファイルを作成したいです。
バッチが不可能であればVBスクリプト?(まったくわからないけど)でも結構です。

最終的にはタスクスケジューラに仕込んで毎日定時に、チェックしてシフトJISであった場合、変換をするという動作が理想ですが、とりあえず変換するバッチが作れないので話になりません(;;

敷居が高いかもしれませんが、ファイルがUTF-8であってもエラーとならないように作れるとチェックして云々は不要と思っています。

よろしくお願いします(><

A 回答 (6件)

#4の回答者です。



nkf でも、Wscript でも、UTF-8 BOMなし変換は出来ましたが、

Wscript 側は、かなり面倒です、といっても、書いた本人が言うだけで、コピー&ペーストーするだけの話ですが。

結局、#2さんの言う通りになってしまいましたね。(^^;

>ユーザ情報.csvというシフトJISのファイルを、同じフォルダで同一名のファイル、ユーザ情報.csv(UFT-8(BOMなし)に変換するバッチファイルを作成したいです。

これだけで良いのでは?
-----------------------
Rem to_utf8.bat
@echo off
nkf.exe -w --overwrite %1
echo on
-----------------------SJISで保存すること----
戻すオプションは、 -s です。(sjis) %1の所はファイル名でも可

nkf.exe のありか。
http://www.vector.co.jp/soft/win95/util/se295331 …

》Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
》Copyright (C) 1996-2010, The nkf Project.

富士通がクレジットしているとは知りませんでしたね。
    • good
    • 0
この回答へのお礼

色々と調べてくれてありがとうございました。
バッチファイルでnksのプログラムを呼び出せばいい感じですね。
検証してみます。
ありがとうございました。

お礼日時:2017/07/02 23:36

文字コードの確実なチェックは不可能です。


ですので取る方法としては、
・まれに文字化けすることを許容する
・ファイル中に文字コードを判定できる特定の文字列を入れておく
・フォルダを分けるなどして文字コードの違うファイルが混ざらないようにする
のいずれかになりますが、どうしますか?
    • good
    • 0
この回答へのお礼

まれに文字化けをするのですね。
目視によるチェックも必要なのですね。

ご忠告ありがとうございました。
要検討します。

お礼日時:2017/07/02 23:37

私は、得意としはしていませんが、この数年間、結構、頻繁にこの問題には直面しています。

CSV でも、Excelナシということでしょうか?Excelのオートメーションを借りると、かなり状況は変わりますが。

手元の記録では、「SJISからUTF-8に変換」には、
・nkfツールで文字コードを変換する
・PowerShellで複数のファイルの文字コードを一括変換する
・WSHでファイルの文字コードを変換する(記録では Basp21使用になっています)
今は、この3つのどれでもありません。

#2さんの nkf が定番で、10年以上と長いこと、私などはお世話になりました。ある時、nkfが使えない日が来るとは思わなかったですが。大きさにもよりますが、CSVで巨大ファイルはありませんから、nkf で正解だと思うのですが。

プログラマブルに示したほうがよいようですね。
今、作ってみたら、BOM付きでした。
確か、BOMなしは、最初のPosition を3つずらすのだったと思いますが、あまり自信がありません。そんなことは考えたことがありませんから。

>チェックしてシフトJISであった場合
おまけにチェッカーが必要なんですか?

UTF-8のBOM付きのチェック方法は知っていますが、UTF-8 のBOMなしでチェックができるのかな?BOMなしは、エラーを起こすことが多いからです。

記録をみると、BOMなしは、一定区間のバイナリの混在する確率の計算になるのだそうです。逆に、SJISの方も同じく可能性の確率計算になるようです。
しかし、Batch や Wscript 辺りで、そこまでできるとは思えないけども。
PowerShell は私は使いこなせませんが、手はあるのかもしれません。

もう一度、調べてみます。
    • good
    • 0
この回答へのお礼

色々と調べてくれてありがとうございました。
バッチファイルでnksのプログラムを呼び出せばいい感じですね。
検証してみます。
ありがとうございました。

お礼日時:2017/07/02 23:38

自分ならInternet Explorerに読み込ませて、メニューのファイルから「名前を付けて保存」でテキストを選んでエンコードをUFT-8に指定して保存をする。



UNIX系のJISコードで書かれたテキストをShift-JISに変換するときによく使いますね。

・・・
これで自動化は難しいですけど。
    • good
    • 0
この回答へのお礼

レスありがとうございます。自分も手動で作業していたのですが、事故が多いので自動化を模索しているところです。厳しいですがなかなか厳しいです。

お礼日時:2017/07/02 00:56

有名どころでは nkf というプログラムがあります。


https://ja.osdn.net/projects/nkf/releases/p533
https://ja.wikipedia.org/wiki/Network_Kanji_Filter
・上書き機能
・文字コードの自動判別
があるので、BAT程度の制御で十分可能ではないかと
    • good
    • 0
この回答へのお礼

文字コードを意識する部署にいなかったので、なかなか理解できないですが、変換するプログラムが存在するのですね。調べてみます。ありがとうございました。

お礼日時:2017/07/02 23:29

手抜き回答でごめん。



Shift_JIS文化からUTF-8への移行ガイド
http://qiita.com/kawasima/items/41632dbd423dc044 …

Shift-JISからUTF-8Nへ一括変換
https://detail.chiebukuro.yahoo.co.jp/qa/questio …

【iconv】文字コードを変換して出力する
http://itpro.nikkeibp.co.jp/article/COLUMN/20131 …

 手間が掛かっていいなら、テキストエディタを使う方法。

 Tepa Either
http://www.greenspace.info/tepa/

 ファイルを読み込ませたら手動で文字コードを変更してから名前をつけて保存するなど。
    • good
    • 0
この回答へのお礼

色々とあるのですね。調べてみます。

レスが遅れてました。
ありがとうございました。

お礼日時:2017/07/02 23:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qプログラムの改良

人の作ったプログラムを改良することになりました。
Visual C++ は初めてですが、CやC++は一通り勉強しています。

そこで、いろいろ調べているのですが、
例えば
「MFCは使わずに,Win32API SDKを用いた方法」
などという説明があります。

自分が対応しているプログラムが、そのどちらであるか、あるいはほかの方法で作られているか
というのはどうしたら分かるのでしょうか?

Aベストアンサー

No1です
私はC++は全然触ったこと無いので
あまり的確な回答は期待しないでくださいね

Q1.いいんじゃないでしょうか?
MSDNのOnPoint↓
https://msdn.microsoft.com/ja-jp/library/01c9aaty.aspx

OnPointクラス(Cwndクラス)
https://msdn.microsoft.com/ja-jp/library/1xb05f0h.aspx
このページの一番最初に
「Microsoft Foundation Class ライブラリにあるすべてのウィンドウ クラスの基本機能が用意されています。」と書いてありますから
そういうことですね

Q2.なんでもいいと思いますけど
そもそもあなたが対応するプログラムが
きちんとWin32のみで、もしくはMFCのみで書かれているとは限らないですからね
適当に作られて、両方が混在している可能性だってありますし

Q3.そこからですか
そこは調べればすぐ出てくるかと思いますが
MFCというのはWin32をラッピングしたものです

Q4.作った本人に聞く
仕様書とかがあるならそれを見る

No1です
私はC++は全然触ったこと無いので
あまり的確な回答は期待しないでくださいね

Q1.いいんじゃないでしょうか?
MSDNのOnPoint↓
https://msdn.microsoft.com/ja-jp/library/01c9aaty.aspx

OnPointクラス(Cwndクラス)
https://msdn.microsoft.com/ja-jp/library/1xb05f0h.aspx
このページの一番最初に
「Microsoft Foundation Class ライブラリにあるすべてのウィンドウ クラスの基本機能が用意されています。」と書いてありますから
そういうことですね

Q2.なんでもいいと思いますけど
そもそもあなたが...続きを読む

QC言語 昇順・降順 ソート

C言語の勉強をしている者です。
課題を解くのに行き詰っているのですが、
どのように解くことが好ましいでしょうか。

よろしくお願いします。
___________________________

・パラメータ1に降順か昇順か数字を入力させる。
 例)降順0昇順1
 0か1以外の入力はエラー表示。

・パラメータ2~10の数字チェック、数字以外はエラー表示し終了。

・動的メモリを取得しパラメータ2~10の数字を動的メモリに格納する
 取得できない場合はエラー表示し終了。

・動的メモリ上のパラメータ2~10の数字を
パラメータ1(降順・昇順)に従いソートし表示する。

・動的メモリを開放し終了。
___________________________

[注1]パラメータ2~10の数字は1~999までとする。

Aベストアンサー

main関数の引数*argc, *argvがポインタになっている意味を考えるか、引数の個数を何度か変えてはデバッガを使ってポインタの中身をチェックすれば、引数の数を可変にしているやり方が見えてくる。
引数の個数に合わせて、データ型に応じた適切なサイズのメモリをアロケートし、配列なり、リストなりを使ってデータを格納し、処理終了時にメモリを忘れずに解放。
ソートの仕方に関しては、たいていのアルゴリズム解説本にプログラミング言語が違っていても記してあるから、読んで参考にするだけ。

QプログラミングにおいてOrの使い方がいまいち理解できません。 どなたかご教授お願い致します。

プログラミングにおいてOrの使い方がいまいち理解できません。
どなたかご教授お願い致します。

Aベストアンサー

仮に、a or b であれば、
a 真、b 真 → 真
a 真、b 偽 → 真
a 偽、b 真 → 真
a 偽、b 偽 → 偽

となります。
一つでも真があれば、結果は真となります。

Qファイルをテキストエディタで開いた中にあるデータを一括で取得したい

テキストエディタで開くと下記のような文字列が表示されるファイルが数万件があります。
(.txtや.csvファイルではありません)
↓ここから
 i default ・ u ネ B $g 0 ] $g C F G 81 1 ヘ A1 145123548748 ヒ u ネ H h& h& C F  & ! T 0 U @・ ・ ク ・  g 」
↑ここまで
(実際はもっと長いです)

それぞれファイルごとに上記の中にある『145123548748』等の12桁の数字が必ず1つだけ含まれています。
この12桁の数字だけを取得し、.txtファイルとして一括で取得することは可能でしょうか?
バッチファイル等で作れればと思っていますが何か良い方法がありましたら教えてください。

最終的には、
『12桁の数字』(半角スペース)『ファイルの場所とファイル名』の一覧を作れればと思っています。
例)kansei.txt
145123548748 C:\aaa\bbb\ccc\xxx.zzz
468197989411 C:\aaa\bbb\ddd\yxy.zzz
684315451373 C:\eee\fff\xxy.zzz

テキストエディタで開くと下記のような文字列が表示されるファイルが数万件があります。
(.txtや.csvファイルではありません)
↓ここから
 i default ・ u ネ B $g 0 ] $g C F G 81 1 ヘ A1 145123548748 ヒ u ネ H h& h& C F  & ! T 0 U @・ ・ ク ...続きを読む

Aベストアンサー

grepツールもしくはテキストエディタ自体のgrep機能をつかえばよろしいのでは?

QVBA コンパイルエラーの解消法

皆様、いつもお世話になっております。
初心者なりに考えてVBAを組んでみたのですが、「Sub または Fanction が定義されていません」とエラー表示が出てきます。
自分なりにコードに間違いがないか検索ながらやってみたのですが、うまくいきません。

どなたか、知恵をお貸しいただけないでしょうか。



テーブルの入っているSheet1から、シート”施工体制台帳~”の該当するセルにデータのコピーを行うためのVBAです。
業者の数だけループするように組んだつもりなのですが、エラー表示のため実行ができません。
ご指摘、よろしくお願いいたします。

Sub kopipe1() '施工体制台帳
Dim sh As Worksheet
Dim sh1 As Worksheet
Dim sb As Long
Dim m As Long
Dim p As Long
Dim c As Long
Dim i As Long
Dim end1 As Long

Set sh = Worksheet("sheet1")
Set sh1 = Worksheet("施工体制台帳 (下請け) ")


end1 = sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
sb = 1
p = 1

For i = 2 To end1 Step 1
sb = sb + 1
c = cell(p, 9)

sh.cell(sb, 2).Copy Destination:=.sh1.Range(c).Offset(2, 1) '会社名
sh.cell(sb, 3).Copy Destination:=.sh1.Range(c).Offset(2, 27) '代表者名
sh.cell(sb, 4).Copy Destination:=.sh1.Range(c).Offset(4, 1) '郵便番号
sh.cell(sb, 5).Copy Destination:=.sh1.Range(c).Offset(5, 1) '住所
sh.cell(sb, 6).Copy Destination:=.sh1.Range(c).Offset(6, 24) '電話番号
sh.cell(sb, 7).Copy Destination:=.sh1.Range(c).Offset(13) '業種1
sh.cell(sb, 8).Copy Destination:=.sh1.Range(c).Offset(14, 12) '許可者1
sh.cell(sb, 9).Copy Destination:=.sh1.Range(c).Offset(14, 15) '区分1
sh.cell(sb, 10).Copy Destination:=.sh1.Range(c).Offset(14, 17) '許可1-1
sh.cell(sb, 11).Copy Destination:=.sh1.Range(c).Offset(14, 20) '許可1-2
sh.cell(sb, 12).Copy Destination:=.sh1.Range(c).Offset(14, 27) '許可年月日
sh.cell(sb, 13).Copy Destination:=.sh1.Range(c).Offset(16) '業種2
sh.cell(sb, 14).Copy Destination:=.sh1.Range(c).Offset(17, 12) '許可者2
sh.cell(sb, 15).Copy Destination:=.sh1.Range(c).Offset(17, 15) '区分2
sh.cell(sb, 16).Copy Destination:=.sh1.Range(c).Offset(17, 17) '許可2-1
sh.cell(sb, 17).Copy Destination:=.sh1.Range(c).Offset(17, 20) '許可2-2
sh.cell(sb, 18).Copy Destination:=.sh1.Range(c).Offset(17, 27) '許可年月日2
sh.cell(sb, 19).Copy Destination:=.sh1.Range(c).Offset(21, 28) '健康保険
sh.cell(sb, 20).Copy Destination:=.sh1.Range(c).Offset(22, 28) '厚生年金保険
sh.cell(sb, 21).Copy Destination:=.sh1.Range(c).Offset(23, 28) '雇用保険
sh.cell(sb, 22).Copy Destination:=.sh1.Range(c).Offset(25, 3) '現場代理人指名
sh.cell(sb, 23).Copy Destination:=.sh1.Range(c).Offset(29, 7) '主任技術者氏名
sh.cell(sb, 24).Copy Destination:=.sh1.Range(c).Offset(31, 3) '資格内容
sh.cell(sb, 25).Copy Destination:=.sh1.Range(c).Offset(33, 3) '安全衛生責任者
sh.cell(sb, 26).Copy Destination:=.sh1.Range(c).Offset(25, 26) '安全衛生推進者
sh.cell(sb, 27).Copy Destination:=.sh1.Range(c).Offset(27, 26) '雇用管理責任者
sh.cell(sb, 28).Copy Destination:=.sh1.Range(c).Offset(29, 26) '専門技術者名
sh.cell(sb, 29).Copy Destination:=.sh1.Range(c).Offset(31, 26) '技術資格内容

p = p + 62
Exit For
Next i
End Sub

皆様、いつもお世話になっております。
初心者なりに考えてVBAを組んでみたのですが、「Sub または Fanction が定義されていません」とエラー表示が出てきます。
自分なりにコードに間違いがないか検索ながらやってみたのですが、うまくいきません。

どなたか、知恵をお貸しいただけないでしょうか。



テーブルの入っているSheet1から、シート”施工体制台帳~”の該当するセルにデータのコピーを行うためのVBAです。
業者の数だけループするように組んだつもりなのですが、エラー表示...続きを読む

Aベストアンサー

今のところ、変数に代入する以外のコードはほとんど間違っているわけですから、どれがどうと言えないと思います。
他の方との重複を含みます。
・Worksheet(---) ->Worksheets(----)
・sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
  ↓
sh.Cells(Rows.Count, 2).End(xlUp).Row
・c = cell(p, 9)
  ↓
 c = Cells(p, 9) ただし、最後に、p = p + 62の後、Exit For では、1回キリでおしまいになってしまいます。

おそらくは、Dim c As String --Cells(p, 9).Address(0,0)
のはずです。
 
・sh.cell(sb, 2).Copy Destination:=.sh1.Range(c).Offset(2, 1) '会社名
とりあえず、Cells と sh1 のコンマは取るけれども、
sh1.Range(c).Offset(2, 1) これでは可読性を落とすばかりで分かりません。

これ自体を直すよりは、最初から作り直したほうが早そうです。
たぶん、一覧で横に並んでいるものを、別のシートの各場所に振り替えていくわけで、それが、ページごとになっているというわけでしょう。

まず、 sh1.cells(sb, 2).Copy ですが、
その列の2 を変数にすべきですね。

受ける側が、Offset で書かれてしまうと、手がつけられなくなってしまいます。

sh1.Range("J3,AJ3,J5,J6,AG7,I14,U15,X15,Z15,AC15,AJ15,I17," & _
 "U18,X18,Z18,AC18,AJ18,AK22,AK23,AK24,L26,P30,L32,L34," & _
 "AI26,AI28,AI30,AI32")

このようにまとめてしまい、以下のように纏めたものから呼び出すようにします。
しかし、実際にやってみると不具合が生じるので、それを配列で渡すようにします。

注:以下は、私の想像で書かれたものであって、実際に合っているのかは分かりません。
このようなスタイルにしてみたらという、あくでもこちらの提案です。

'//
Sub Test1()
 Dim Rng As Range
 Dim i As Long, j As Long, sb As Long
 Dim c As Variant
 Dim sh As Worksheet, sh1 As Worksheet
 Set sh = Worksheets("sheet1")
 Set sh1 = Worksheets("施工体制台帳 (下請け)")

 
 Set Rng = sh1.Range("J3,AJ3,J5,J6,AG7,I14,U15,X15,Z15,AC15,AJ15,I17," & _
 "U18,X18,Z18,AC18,AJ18,AK22,AK23,AK24,L26,P30,L32,L34," & _
 "AI26,AI28,AI30,AI32")
 
 end1 = sh.Cells(Rows.Count, 2).End(xlUp).row
 
 i = 2
 sb = 2
 For j = 1 To end1
 a = (j - 1) * 62 + 1
  For Each c In Rng.Offset((j - 1) * 62 + 1)
   c.Value = sh.Cells(sb, i).Value
   DoEvents
   i = i + 1
  Next
  i = 2
  sb = sb + 1
 Next
End Sub

今のところ、変数に代入する以外のコードはほとんど間違っているわけですから、どれがどうと言えないと思います。
他の方との重複を含みます。
・Worksheet(---) ->Worksheets(----)
・sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
  ↓
sh.Cells(Rows.Count, 2).End(xlUp).Row
・c = cell(p, 9)
  ↓
 c = Cells(p, 9) ただし、最後に、p = p + 62の後、Exit For では、1回キリでおしまいになってしまいます。

おそらくは、Dim c As String --Cells(p, 9).Address(0,0)
のはずです。
 
・sh.cell(sb, 2).C...続きを読む

QVB6で10進数を32進数に変換するプログラムを教えて下さい。

VB6で10進数を32進数に変換するプログラムを教えて下さい。

Aベストアンサー

Conv10to32が求める関数です。
十進数の文字列を入力にして、32進数の文字列を結果として返します。
sub testで、10進数の31、32を入力で与え、結果を取得しています。結果は、"V","10"になります。
Conv10to32の中で、配列の中へ0~9、A~Vの文字を入れてますが、これは毎回行う必要はありません。
この部分を外出しにしておけば、もっと処理速度は上がります。
今回は、より、簡単なソースの提供の為に、1つの関数内にまとめています。
ひつようがあれば、配列作成の箇所は外出しにしてください。


Sub test()
Dim ans As String
ans = Conv10to32("31")
MsgBox (ans)
ans = Conv10to32("32")
MsgBox (ans)
End Sub
Private Function Conv10to32(ByVal str As String) As String
Dim digit32(31) As String
Dim i, j, val As Long
Dim result As String
'0~9,A~Vの32文字を生成
For i = 0 To 31
If i < 10 Then
digit32(i) = Chr(Asc("0") + i)
Else
digit32(i) = Chr(Asc("A") + i - 10)
End If
Next
val = CLng(str)
result = ""
Do
i = val Mod 32
val = val \ 32
result = result + digit32(i)
Loop While val <> 0
Conv10to32 = StrReverse(result)
End Function

Conv10to32が求める関数です。
十進数の文字列を入力にして、32進数の文字列を結果として返します。
sub testで、10進数の31、32を入力で与え、結果を取得しています。結果は、"V","10"になります。
Conv10to32の中で、配列の中へ0~9、A~Vの文字を入れてますが、これは毎回行う必要はありません。
この部分を外出しにしておけば、もっと処理速度は上がります。
今回は、より、簡単なソースの提供の為に、1つの関数内にまとめています。
ひつようがあれば、配列作成の箇所は外出しにしてください。


Su...続きを読む

QGrepの出力結果を細かく指定したい

https://oshiete.goo.ne.jp/qa/9818180.html
上記質問の続きです。

サクラエディタのGrep機能で一括で12桁の数字を抜き出すことはできたのですが、
上記質問の『例)kansei.txt』の形式で出力ができませんでした。
Grepツールで出力結果を細かく指定して出力できるものはありますか?
Grepの結果に毎回自分で置換を行えば目的のものは得られますが、同様の作業を何度も行う予定なので楽にできる方法があればと思っています。

自分でも調べましたが出力結果について明確に説明されているものは少なく、
Grepと同じようなコマンドプロンプトのfindstrや、PowershellのSelect-Stringも調べましたが
できるのかわからなかったので質問しました。

PCはWindows7です。

Aベストアンサー

N0.3のお礼を拝見しました。
12桁の途中で改行が入るということですよね?
では、以下でどうでしょう

-----ここから
$me = "search.ps1" # 本スクリプトファイル名
$out = "kansei.txt" # 出力ファイル名

Get-ChildItem | %{
$name = $_.Name
if(($name -ne $me) -and ($name -ne $out)){
$s = Get-Content $_
if($s.gettype().Name -eq "Object[]"){$s = $s -join ""}
if($s -match "\d{12}"){
"$($Matches[0]) $($_.FullName)" | Out-File -FilePath $out -Append
}
}
}
----ここまで

QCのプログラムに無性にイライラするのはおかしいですか?

CQ出版のインタフェース 2017-5 の記事のプログラム例に
for( i=0; i<256; i++){
 for( y =0; y < Y; y++ ){
  for( x = 0; x < X; x++){
   p[0] = img -> imageData[img->widthStep* y + x*3 ]; //B(青色)
   if(p[0]==i){hn[i]++;}
  }
 }
}
がありました。このリストを見て、無性にイライラするのは私だけでしょうか?

なぜ、i,y,x の3重のループで処理しないといけないのか、y,xの2重ループで十分ではないかと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++){
  p[0] = img -> imageData[img->widthStep* y + x*3 ];  //B(青色)
  hn[ p[0] ]++;
 }
}

3重にするならせめて、y,x,i の順にしてp[0]への代入は1回で済ませればと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++){
  p[0] = img -> imageData[img->widthStep* y + x*3 ];  //B(青色)
  for( i=0; i<256; i++){
     if(p[0]==i){hn[i]++;}
  }
 }
}

最近のコンパイラの最適化では、私の書いたようなコーディング(修正?)は無意味なのでしょうか?

CQ出版のインタフェース 2017-5 の記事のプログラム例に
for( i=0; i<256; i++){
 for( y =0; y < Y; y++ ){
  for( x = 0; x < X; x++){
   p[0] = img -> imageData[img->widthStep* y + x*3 ]; //B(青色)
   if(p[0]==i){hn[i]++;}
  }
 }
}
がありました。このリストを見て、無性にイライラするのは私だけでしょうか?

なぜ、i,y,x の3重のループで処理しないといけないのか、y,xの2重ループで十分ではないかと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++)...続きを読む

Aベストアンサー

利点を考えてみました


これを並列処理したときに
スレッド0: hn[0] に p[0] = 0 をカウント
スレッド1: hn[1] に p[0] = 1 をカウント
...
とすれば、
・img -> imageData は読み出すだけなので衝突しない
・hn[i] でアクセスする領域は、スレッド毎に i が違うので、同じ箇所に書き込まれることはない。
となり、排他処理が不要となります。
(もちろん、x,y,i,p[0]はスレッドでローカルな変数とします)

ただ、並列処理のオーバーヘッドや同時並列処理数等を考えると、こんな並列処理はしない方が効率的です。


あるいは、hn[]がシークに時間がかかる領域の場合、
hn[p[0]) で毎回違う位置を探しに行って、その時間が無視できないほどだったら、
先にhnを決めてしまった方が速くなるでしょう。

こちらも、非現実的です。

QC言語はどこまでゲームを作り込むことができますか?

ゲームを作っているのですが、使用しているソフトではパフォーマンスに少し満足できません。
なのでC言語を学ぼうと思ったのですがC言語は、例えばACTが作れるとか、どのくらいまで作れるとか。
逆にRPGとかは作れないみたいな、そういった限界がどこまであるのかわかりますか?

Aベストアンサー

C言語に限界はありません。
限界は、プログラマの方にあります。
C言語に変えたら全て解決、といった単純な話ではありませんので、覚悟してください。


CPUは、機械語しか理解できません。
全てのプログラムは、機械語に翻訳されるか、「プログラミング言語を解釈して実行するプログラム」を使って実行されます。

C言語は、大体前者で、しかも、 機械語とほぼ同等なことができるように作られています。
なので、原理的には、今あるコンピュータゲームは、ほぼ全てC言語で作ることができる、となります。


ですが、あなたが言う「作れる」とはニュアンスが違うと思います。

C言語自体は、とても低機能です。
そのツールが持っているような機能、例えば「画面にキャラクターを表示する」といったものはありません。
「水平に弾を発射」と設定すればいいだけのものが、
「一定時間毎に座標を少しずつ変化させて表示。画面外に出たら廃棄」
といった感じの、細かく分解する必要があります。
(これでも不十分で、「一定時間毎」ってどうやる?「画面外」とは?等と、より細かく分解しなければなりません)

結局、C言語で作る、ということは、「今使っているツールと同じようなものを自作する」のと同じことです。


また、C言語は速い、と誤解されているようです。
「無駄を省く等のチューニングができる場合がある」から「速くなるかもしれない」だけです。
そのツールでも、パフォーマンスは考慮されているでしょう。
C言語で書いても、何の対策もしていないなら、ツール以下のパフォーマンスになることもあります。

C言語に限界はありません。
限界は、プログラマの方にあります。
C言語に変えたら全て解決、といった単純な話ではありませんので、覚悟してください。


CPUは、機械語しか理解できません。
全てのプログラムは、機械語に翻訳されるか、「プログラミング言語を解釈して実行するプログラム」を使って実行されます。

C言語は、大体前者で、しかも、 機械語とほぼ同等なことができるように作られています。
なので、原理的には、今あるコンピュータゲームは、ほぼ全てC言語で作ることができる、となります。


です...続きを読む

Qどうすれば本格的なGUIプログラミングができるか

もう学生時代から20年以上も独学でOSの変遷(MS-DOS→ウインドウズ95→98SE→XP→Vista→8.1→10)にともなってコマンドラインのC言語の開発環境を作ってきて勉強を続けてきましたが、一向に満足なプログラムができるようになりません。
(わずかに、値を入力して場合分けして1000回以上の繰り返し計算をして結果を画面出力する、というプログラム程度です。)

仕事はITとは無縁で、材料系の製造業です。化学合成とか分析には詳しいですが、周りにもプログラミングのプの字も知っている人はいません。IT系の会社なんかに勤めていたら、そういうことを知っている人がごろごろいそうな気がしますが、いませんので自分でいろいろな情報源から調べるのみですが、あまり金を掛けませんので情報量にも限りがあります。

今つくりたいのは、ウインドウズのソフトの印刷結果を、ビットマップとかJPEGほか、任意の形式の画像に変換して保存するプログラムです。よく、ベクターとかにアップロードされているようなプログラムを、自分でも作れるようになるのが目標です。

何年かかっても構いません。どういう本を買い、どういう勉強をすればできるようになるのでしょうか。

ちなみに、今のPCのOSはWindows10で、マイクロソフトのVisual Studioをインストールしていて、コマンドラインのC言語のプログラムなら、無料のテキストエディタ(今使っているのはTeraPad)でソースを書いて、コンパイル・リンクして走らせる、ということばかりずっとやっていますが、本格的なウインドウズ上のプログラムを作りたいです。C#なら手っ取り早く作れる、と何かで知って、最近C#の、開発環境の作り方も書いた本を買いましたが、C#で本格的なプログラムができるか、疑問に思っています。いまさらRubyとかPythonを始めるのもどうなんだろうか、と思っています。C++ならできるのでしょうか。C++の入門書も持っています。

どなたかアドバイスをお願い致します。

もう学生時代から20年以上も独学でOSの変遷(MS-DOS→ウインドウズ95→98SE→XP→Vista→8.1→10)にともなってコマンドラインのC言語の開発環境を作ってきて勉強を続けてきましたが、一向に満足なプログラムができるようになりません。
(わずかに、値を入力して場合分けして1000回以上の繰り返し計算をして結果を画面出力する、というプログラム程度です。)

仕事はITとは無縁で、材料系の製造業です。化学合成とか分析には詳しいですが、周りにもプログラミングのプの字も知っている人はいません。IT系の会社なんかに...続きを読む

Aベストアンサー

Windowsのプログラムを作るなら今はC#が最適ですね。
C#言語とフレームワークの.NETはMicrosoftが10年来普及に努めており、今やWindowsの大半の機能を.NET上のみで操れます。
.NET上で動くプログラムを作る言語としてはC#の他にVisualBasicやC++/CLIなどがありますが、情報量の多さと書式がCに似ている点でお勧めはC#です。
名前の通り書式がC言語を元にしているので、Cが分かればC#も、ポインタが(まともな方法では)使えないくらいでだいたい同じことができます。


人気Q&Aランキング