【初心者歓迎】C/C++室 Ver.54【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/05/14(水) 01:00:02ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.53【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1208989385/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0557デフォルトの名無しさん
2008/06/02(月) 15:57:340558デフォルトの名無しさん
2008/06/02(月) 15:58:33DLLをビルドしたときに出来たインポートライブラリをコール元にリンクする
0559556
2008/06/02(月) 16:05:54>>558
即レスありがとうございます。
インポートライブラリのリンクとのことですが、
�@プロパティページの「Frameworkと参照」の「参照」にて当該libファイルを設定する
�A同プロパティページの「リンカ」「入力」「追加の依存ファイル」にて当該libファイルを設定する
と2通りのやり方を調べあげました。どちらもやっても結果が変わりません。
申し遅れましたがVC++2008 Expressにて開発しております。
0560デフォルトの名無しさん
2008/06/02(月) 16:16:51プロジェクトのプロパティのリンカの入力に設定するか、
ソースに #pragma comment(lib, "xxxxxx.lib")
を追加する。
0561デフォルトの名無しさん
2008/06/02(月) 16:18:43そのDLLの関数はCリンケージでexportしてるね?
0562556
2008/06/02(月) 16:38:47>>560さんの指摘は�Aとお見受けしまた。pragmaの方は試してないのですが、なぜ前者の
方でうまくいかないのか謎です。
>>561
ソリューションは以下の構成下にあります。
ExcelVBA
Debug ←ここにlibファイルがあります。
ExcelVBA
Debug
test
よってリンカの「入力」「追加の依存ファイル」より「ExcelVBA.lib」を設定してあります。
また、リンカの「全般」に「追加のライブラリディレクトリ」というのがあったので
上記のライブラリがあるパスをフルパスで設定しました。
が、あいかわらず未解決がでます。
>>561
DLLのエクスポートですが
#define DllExport extern "C" __declspec (dllexport)
DllExport int WINAPI CareerDataRead(char *chrFileName);
を先頭につけており、同関数の中身を return 128;
でExcelから呼び出した場合128が却ってきたことを確認しています。
なお、これから複雑な処理を書くためVBAから結果のみみてデバッグは危険かと思い
ダミーコールプログラムをVC++で書いてる次第でございます。
0563556
2008/06/02(月) 16:43:54/OUT:"C:\Documents and Settings\xxxx\My Documents\Visual Studio 2008\Projects\ExcelVBA\Debug\test.exe"
/INCREMENTAL /NOLOGO /LIBPATH:"C:\Documents and Settings\xxxx\My Documents\Visual Studio 2008\Projects\ExcelVBA\Debug"
/MANIFEST /MANIFESTFILE:"Debug\test.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/DEBUG /PDB:"C:\Documents and Settings\xxxx\My Documents\Visual Studio 2008\Projects\ExcelVBA\Debug\test.pdb" /
SUBSYSTEM:CONSOLE /DYNAMICBASE /NXCOMPAT /MACHINE:X86
/ERRORREPORT:PROMPT excelvba.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
0564デフォルトの名無しさん
2008/06/02(月) 16:52:00windows.h のインクルードもね
0565デフォルトの名無しさん
2008/06/02(月) 16:56:39export側では呼び出し規約がWINAPI
import側はWINAPIが抜けてる(んでcdeclを仮定している)
正しい方に統一汁
dumpbin.exeやバイナリエディタでDLLやlibの中身をのぞいたりすることも
してみると良い
呼び出し規約が違えばライブラリに埋め込まれるリンカ用の名前も変わるから
見りゃすぐ分かるよ
0566556
2008/06/02(月) 17:06:12ちなみに下記のように修正しました。
#include <windows.h>
// extern "C" __declspec (dllimport) int WINAPI CareerDataRead(char *chrFileName);
#define DllImport extern "C" __declspec (dllimport)
DllImport int WINAPI CareerDataRead(char *chrFileName);
int main()
{
CareerDataRead("test.c");
}
0567556
2008/06/02(月) 19:03:10↑の実際の処理手法を調べていました。
処理内容はファイル(テキストファイルで行ごとにタブ区切り)を読み込んで、ある一部分を集計するように
したいのですが、ファイルを読み込む方法として
�@fopen fget等C言語を使用する。
�Aifstreamを使用する。
�BCreateFile ReadFile等 Win32を使用する。
�CMFCの利用(すいません、調べきれてません)
などなどやり方が多くありどれが最適かよくわかりません。
元々VBAでやっていた集計が遅いとのことなのでスピードアップが目的なのですがどのやり方がよいか、
こんなのが一般的だなどアドバイスお願いします。
0568デフォルトの名無しさん
2008/06/02(月) 19:10:35MFCは除外するとして、WinAPIは行単位の読み込み関数がないから敷居が高いんでない?
ifstreamを使うかfopenを使うかは習熟度次第。
読み込むファイルが数値だけの書かれたテキストファイルならどっちでもいいでしょ。
処で、なんでExcel自身に処理させないの?
tsvを読み込むのも集計するのもExcelでできると思うのだけど。
0569566
2008/06/02(月) 19:18:49レスありがとうございます。
ifstreamがC++っぽいらしいのでそれで挑戦します。
ちなみにExcelVBAで処理を行うと1ファイル500行ほどで5万ファイルほど集計をかけなければならないため
(この5万ファイル中で項目によりベスト5、ワースト5等を決めます)
表示を切ったりセルに書き込む処理を抑制しても、処理に15分から20分ほどかかってしまいます。
VBAでいろいろな努力をした結果、1ファイルの処理をDLLで計算させると速いと聞いたのでいま苦戦中です;;
0570デフォルトの名無しさん
2008/06/02(月) 19:19:01場合によっては awk でも実用的な速度になるかもしれない
興味があれば「gawk」でググれば見つかると思う
# こんな感じ
BEGIN{FS="\t"}
{if(NF>=3) sum+=$3} // 3番目のレコードの総和
END{print sum}
0571568
2008/06/02(月) 19:25:27なるほど、ちょっとした量だな。
できれば、DLLにするよりも単体のプログラムにした方がらくだとは思うのだけれど……
あぁそうか、DLL作成のノウハウは(ここで)得ているのか。
0572デフォルトの名無しさん
2008/06/02(月) 19:26:420573デフォルトの名無しさん
2008/06/02(月) 19:32:39サンプルデータを用意してくれれば挑戦してみたい
どんな入力(サンプルデータ)に対してどんな値を返せばいいのかを教えてくれれば
C言語でやってみます
要するに関数プロトタイプとサンプルデータ下さいって事です
0574デフォルトの名無しさん
2008/06/02(月) 19:35:000575デフォルトの名無しさん
2008/06/02(月) 19:45:55そして車輪の再生産ですね?わかります。
0576デフォルトの名無しさん
2008/06/02(月) 19:47:37生産性重視なら他の言語でもいいが、C++にはパフォでは絶対勝てないな
0577デフォルトの名無しさん
2008/06/02(月) 19:49:05awkは以前Unixの処理系でやりましたが挫折しました。
>>571
初心者ですがこれも経験だと思ってチャレンジします。
>>572
集計結果が表やグラフで表示するため保存形式やドキュメントの流用性を考えるとExcelが有効だと考え
ました。
>>573
タブ区切りのデータが8個あり最終は改行です。
1 コメント 300 400 500 600 800 900
2 コメント 200 200 30 6 800 90000
3 コメント 350 100 450 600 20 500
:
(500行ほどあります)
↑このファイルが5万ほどありますが、ファイル指定は親のVBAからします。つまりファイル名を入力として
最終データの最高値、最小値、平均の3つを返せればそれを利用して他の処理もできると考えてます。
0578566
2008/06/02(月) 19:49:550579568
2008/06/02(月) 19:54:56VBAでファイルを読み込んで、VBAでExcel関数を使って集計するのは試した?
ファイル数が多いから微妙だけど、VBAを使いこなせていればそれなりの時間で処理できそうだけど。
0580デフォルトの名無しさん
2008/06/02(月) 19:56:425万ファイルはxlsじゃなくてtsvファイルってこと?
んで、集計結果もエクセルで扱いやすい形式であればよい?
0581デフォルトの名無しさん
2008/06/02(月) 19:59:496種の項目すべてについて最高値・最小値・平均を求めるとして
返すのは一番左の数値?それとも最高値・最小値?
int CarrerDataRead(const char *filename, long *max0, ... , long *max5, long *min0, ... , long *min5, long *ave0, ... , long *ave5);
こんなん?引数の数が半端無いよw
0582デフォルトの名無しさん
2008/06/02(月) 20:01:190583デフォルトの名無しさん
2008/06/02(月) 20:04:39VBAからの呼び出し時に配列を ByRef で渡す方法があれば簡単になるんだけど
その方法を知らないんだ
0584デフォルトの名無しさん
2008/06/02(月) 20:05:00ご指摘の内容はWorksheetFunctionのことだと思われます。が合計、平均等の処理は
当該処理を利用させてもらいました。おそらくダイエット可能な場所はほとんどやり尽く
した感があったためDLL化とうい道を選択しました。
実際算出しなければいけないデータは平均、最高値、最低値だけでないためExcel関数
の範疇を超えております。
0585デフォルトの名無しさん
2008/06/02(月) 20:05:10速度も、安定性もアップする。
なんか開けるすうに制限あるし、不安定な動作することがある c++
0586566
2008/06/02(月) 20:05:540587デフォルトの名無しさん
2008/06/02(月) 20:07:34そりゃぁ、バッファリングしないAPIなら速いでしょうね。早くはありませんが。
つーか、ハンドル閉じ損ねても100や200じゃ問題出ませんもんね。
0588デフォルトの名無しさん
2008/06/02(月) 20:09:09なに、その地雷コードw
0589デフォルトの名無しさん
2008/06/02(月) 20:09:200590デフォルトの名無しさん
2008/06/02(月) 20:09:510591デフォルトの名無しさん
2008/06/02(月) 20:10:29ファイルクローズはデストラクタ任せ
0592デフォルトの名無しさん
2008/06/02(月) 20:10:550593566
2008/06/02(月) 20:10:56データは各行の8項目の最終データのみ対象です。返すのは3つのデータです。(最高、最低、平均)
int CarrerDataRead("ファイル名"、結果の配列)
がベストと考えてます。ただVBAの方で受けられる型とかの検証はまだしてません。すいません。
0594デフォルトの名無しさん
2008/06/02(月) 20:12:14つまり、最終カラム?
0595デフォルトの名無しさん
2008/06/02(月) 20:17:24#include<stdio.h>
#include<stdlib.h>
int main(void){
int i, j, k;
FILE *fp;
char filename[FILENAME_MAX];
for(i=0;i<500;i++){ // とりあえず50000じゃなくて500
sprintf(filename, "temp/dat%05d", i+1); // tempというディレクトリは予め作っておいて下さい
printf("%s\n", filename);
if((fp=fopen(filename, "w"))==NULL) exit(1);
for(j=0;j<500;j++){
fprintf(fp, "%d\tコメント", j+1);
for(k=0;k<6;k++) fprintf(fp, "\t%d", rand());
fprintf(fp, "\n");
}
fclose(fp);
}
return 0;
}
0596デフォルトの名無しさん
2008/06/02(月) 20:25:17俺もこの手の内容ならawk か perlあたりでいいかなと思ったんだけどね。
UN*Xユーザはなかなか理解されないのだろうかorz
0597デフォルトの名無しさん
2008/06/02(月) 20:37:29awkは全て実数だし配列処理が遅いことでも有名なので、
awkが遅すぎると思えるならperl/ruby/pythonあたりを試すといいだろう
別解としては、TSVなら簡単にDBに取り込めるはずなので、
SQLに集計処理をやらせる手もある
#!/usr/bin/awk -f
BEGIN {
from = 3
to = 9
}
NR == 1 {
for (i = from; i < to; i++)
amax[i] = amin[i] = asum[i] = $i
}
NR > 1 {
for (i = from; i < to; i++) {
if ($i > amax[i]) amax[i] = $i
if ($i < amin[i]) amin[i] = $i
asum[i] += $i
}
}
END {
for (i = from; i < to; i++) printf("%d\t", amax[i])
printf("\n")
for (i = from; i < to; i++) printf("%d\t", amin[i])
printf("\n")
for (i = from; i < to; i++) printf("%g\t", asum[i]/NR)
printf("\n")
}
0598デフォルトの名無しさん
2008/06/02(月) 20:40:48スレ違い感が否めないが、$8だけでいいらしいよ。
0599デフォルトの名無しさん
2008/06/02(月) 20:42:03よく読んでなかった
まあ、俺がいいたかったのは、わざわざC/C++で書く必要がある仕事には見えない
ってことだったんだけどね
0600デフォルトの名無しさん
2008/06/02(月) 20:43:38>>402そんな面倒ではないぞ。
0601デフォルトの名無しさん
2008/06/02(月) 20:48:39だがもしかするとみんなそれを理解したうえで、主のDLLで
何とかしたいという要求に答えたいだけなのかもしれないや。
とりあえずawkでやってみたけど、大して速くないものの処理が終わり、
テストデータの大きさが2ギガあったことにびっくりしつつ削除してオワタ。
0602573
2008/06/02(月) 21:41:470603573
2008/06/02(月) 23:14:20typedef long value_t;
int value_get(FILE *fp, value_t *value){
return fscanf(fp, "%*[^\t]\t%*[^\t]\t%*[^\t]\t%*[^\t]\t%*[^\t]\t%*[^\t]\t%*[^\t]\t%ld", value)==1;
}
int CareerDataRead_internal(const char *filename, value_t *best, value_t *worst, value_t *average){
FILE *fp;
long i, sum=0;
value_t value, maximum, minimum;
if((fp=fopen(filename, "r"))==NULL) return 0;
if(!value_get(fp, &value)){
fclose(fp);
return 0;
}
maximum=minimum=value;
sum+=value;
for(i=1;;i++){
if(!value_get(fp, &value)) break;
if(value>maximum) maximum=value;
if(value<minimum) minimum=value;
sum+=value;
}
fclose(fp);
*best=maximum;
*worst=minimum;
*average=sum/i;
return i;
}
__declspec(dllexport) int CareerDataRead(const char *filename, value_t *result){
return CareerDataRead_internal(filename, &result[0], &result[1], &result[2]);
}
0604デフォルトの名無しさん
2008/06/03(火) 00:12:02全角空白でもいいからインデントしてくれるとありがたい。
だと半角空白のままインデント出来るから尚いいけど、
こっちは文字数制限に掛かりやすくなるからね。
0605デフォルトの名無しさん
2008/06/03(火) 00:12:430606デフォルトの名無しさん
2008/06/03(火) 00:15:050607デフォルトの名無しさん
2008/06/03(火) 00:18:15自分でindent叩くとかindent-regionするとかさー
0608デフォルトの名無しさん
2008/06/03(火) 00:25:150609デフォルトの名無しさん
2008/06/03(火) 00:39:27試したところ 3 分弱。結構かかるねー。
0610デフォルトの名無しさん
2008/06/03(火) 00:44:13ifstreamなんて糞みたいに遅いから、わざわざC++使ってもちっとも速くならないと
思う
0611デフォルトの名無しさん
2008/06/03(火) 00:47:12#include <stdlib.h>
void hyouji(int x);
main()
{
int i,x;
char hikisu[];
printf("数値を入力してください(1-52):");
scanf("%d",&x);
hyouji(x);
for (i=1; i <= x; i++){
printf("%d %c",i,hikisu[i]);
}
}
void hyouji(int x)
{
FILE fp;
int i;
if(NULL == (fp = fopen("homework.txt","r"))){
printf("ファイルが開けません\n");
exit(1);
}
for (i=1; i <= x; i++){
fscanf(fp, "%c", &hikisu[i]);
}
fclose(fp);
return;
}
以上のプログラムで『LightC』を使ってコンパイルしようとしても上手くいきません。
どの辺りが間違っているのでしょうか?
『LightC』
ttp://www.tamasoft.co.jp/lc/index.html
0612デフォルトの名無しさん
2008/06/03(火) 00:48:03少なくともVC6の頃は鼻血出そうなくらい遅かった。
0613デフォルトの名無しさん
2008/06/03(火) 00:50:590614デフォルトの名無しさん
2008/06/03(火) 01:06:23#include <stdlib.h>
void hyouji(int x);
main() ←戻り値の型指定が無い
{
int i,x;
char hikisu[]; ←サイズが決まってない
printf("数値を入力してください(1-52):");
scanf("%d",&x);
hyouji(x);
for (i=1; i <= x; i++){
printf("%d %c",i,hikisu[i]);
}
}
void hyouji(int x)
{
FILE fp; ←普通ファイルポインタを使うので*fp
int i;
if(NULL == (fp = fopen("homework.txt","r"))){
printf("ファイルが開けません\n");
exit(1);
}
for (i=1; i <= x; i++){
fscanf(fp, "%c", &hikisu[i]); ←hikisuなどと言うものはこの関数内に存在しない
}
fclose(fp);
return;
}
ぱっと見た感じこんなもの
0615デフォルトの名無しさん
2008/06/03(火) 01:07:37vimで
ggVG=
とやればよいよ。VSなら}を書き直したらそれでやってくれなかったっけ?
0616デフォルトの名無しさん
2008/06/03(火) 01:12:31基礎から学べ
0617デフォルトの名無しさん
2008/06/03(火) 01:28:45わざわざそれだけのためにエディタ起動させるのか。
0618611
2008/06/03(火) 01:31:43test.c(7): エラー C.2530: 変数 hikisu のサイズが不明です
test.c(5): 警告 C.5280: 関数 main に return 文がありません
test.c(19): エラー C.2920: struct _FILE/* を struct _FILE に変換することはできません
test.c(24): エラー C.2130: 識別子 hikisu が未定義です
test.c(26): エラー C.2920: struct _FILE を struct _FILE/* に変換することはできません
0619デフォルトの名無しさん
2008/06/03(火) 02:13:20だってビルドエラーとか、半端なソースの場合とか、動かす前に
見なきゃじゃん。
エディタ起動すらめんどくさがるとかどうやってソース書いてんの?
0620611
2008/06/03(火) 02:16:05#include <stdio.h>
#include <stdlib.h>
void hyouji(int x);
char main(char hikisu[])
{
int i,x;
printf("数値を入力してください(1-52):");
scanf("%d",&x);
hyouji(x);
for (i=1; i <= x; i++){printf("%d %c",i,hikisu[i]);}
}
void hyouji(int x,)
{
FILE *fp;
int i;
char hikisu[52];
if(NULL == (fp = fopen("homework.txt","r"))){
printf("ファイルが開けません\n");
exit(1);
}
for (i=1; i <= x; i++){fscanf(fp, "%c", &hikisu[i]);}
fclose(fp);
return;
}
しかし、それでも以下のようなエラー文が出ます。
test.c(4): 警告 C.5280: 関数 main に return 文がありません
test.c(19): エラー C.2150: == 演算子の引数が正しくありません
一体どこにエラーがあるのでしょうか・・・
0621デフォルトの名無しさん
2008/06/03(火) 02:44:28void f(int **p){
int x[2]={1,2};
*p=x;
}
int main(void){
int *p;
f(&p);
printf("%d\n",p[0]+p[1]);
return 0;
}
上のプログラムの誤りを指摘せよという問題が出たのですが、
どこが間違っているのかよくわからないので教えてください。
おそらくp[0],p[1]のあたりが違うのだと思うんですが・・・
0622デフォルトの名無しさん
2008/06/03(火) 02:46:40>char main(char hikisu[])
ただ付ければ良いって物でもないだろ。
一度「ちゃんとした」入門書を買ってきて勉強したほうがいい。
>test.c(4): 警告 C.5280: 関数 main に return 文がありません
「return文がない」と言われているのだから、どこかにreturn文を追加すれば
いいのではないか、というくらいは想像つかないか?
0623デフォルトの名無しさん
2008/06/03(火) 02:48:37※1
char main(char hikisu[])
↓
int main(int argc, char** argv)
※2
printf("%d %c",i,hikisu[i]);のhikisuが不明
※3
main関数の最後にreturn 0;を付ける
※4
void hyoujiと関数の戻り値がvoidになっている。
戻り値を使わないのなら、最後のreturn;は必要ないです。
※5
void hyouji(int x,)
↓
void hyouji(int x)
0624デフォルトの名無しさん
2008/06/03(火) 02:49:14つ ヒント「ローカル変数の寿命」
0625623
2008/06/03(火) 03:12:28※2
printf("%d %c",i,hikisu[i]);のhikisuが不明
と書いたけど、mainの引数を使いたいっぽいのですよね。
mainの引数を使うなら、
argcの方に引数の数が入ってるから、その数を参考にしてその数をオーバーする事のないようにして、
printf("%s", argv[i]);
これみたいに表示かな。
06261/2
2008/06/03(火) 03:20:56#include <stdlib.h>
void hyouji(char*, size_t);
int main()
{
char *hikisu;
size_t size;
while(1){
printf("数値を入力してください(1-52):");
scanf("%d", &size);
if(size > 0 && size < 53) break;
else printf("サイズを超えています\n");
}
hikisu = (char*)malloc(size * sizeof(char));
if(NULL == hikisu){
printf("メモリが確保出来ません\n");
exit(1);
}
hyouji(hikisu, size);
free(hikisu);
return 0;
}
06272/2
2008/06/03(火) 03:21:17{
FILE *fp;
int i;
if(NULL == (fp = fopen("homework.txt","r"))){
printf("ファイルが開けません\n");
exit(1);
}
for(i=0; i < size; ++i){
fscanf(fp, " %c", &hikisu[i]);
printf("%2d: %c\n", i+1, hikisu[i]);
}
fclose(fp);
}
やりたいんだろうなと言う事を考えたらこんな感じになるかな
homework.txtの中身を知らないからその辺は変わるかも知れないけど
0628デフォルトの名無しさん
2008/06/03(火) 04:17:380629611
2008/06/03(火) 09:19:09ありがとうございます、そして本当にご迷惑をおかけしました・・・
>>614-627とテキストを見直してもう一度自分で考えてみようと思います。
0630デフォルトの名無しさん
2008/06/03(火) 16:57:39using namespace std;
int main(void)
{ cout << "Hello" << endl; }
上記のソースをコンパイルして、 c:\>hello.exe > hello.txt
のように実行すれば、テキストファイルができるのですが、
出力させたいのがテキストではなく、バイナリデータの時はどうすれば良いのでしょうか?
cout << binary_data;
とすると、意図しないデータが出力されてしまいます。
どうすればバイナリデータを変換させないでそのまま出力させることができるのでしょうか?
どなたか、優しい方いましたら教えて下さい。
携帯から書き込んでいるので、見にくかったらすみません。
0631デフォルトの名無しさん
2008/06/03(火) 17:45:51バイナリモードにすればよろしかろ。
0632デフォルトの名無しさん
2008/06/03(火) 17:48:55その、バイナリモードってやつにはどうすればできるのでしょうか?
0633デフォルトの名無しさん
2008/06/03(火) 17:53:18cout バイナリとかでググればいいんじゃね?
0634デフォルトの名無しさん
2008/06/03(火) 17:55:32Windowsだよね。__setmode(__fileno(stdout), _O_BINARY)でOK。
0635デフォルトの名無しさん
2008/06/03(火) 18:05:47char*にキャストしてwrite()とかするんだね
0636デフォルトの名無しさん
2008/06/03(火) 18:15:310637デフォルトの名無しさん
2008/06/03(火) 21:32:59俺なんかおかしいこと言った?
バイナリ出力ならエンコード変換も書式フォーマットも改行制御も要らない
つまりiostreamは完全に余計な邪魔者でしかない
ostream::write()がマシだと思うが
streambufを使う方がマシで、
本当はiostreamなんて使わないのが一番いい
0638デフォルトの名無しさん
2008/06/03(火) 22:05:430639デフォルトの名無しさん
2008/06/03(火) 22:33:51fwrite()一発で済む仕事でなぜわざわざそんなことをやる
明らかに遅く、特に得るものがあるとも思えない
0640デフォルトの名無しさん
2008/06/03(火) 22:36:30実際の出力との対応を分かりやすくできて、メリットだと思うけどね。
0641デフォルトの名無しさん
2008/06/03(火) 22:40:1332bit整数をバイナリ出力するときとか、Cならアドレス取って4byte書き出す
わけじゃん
iostreamの作法ではどうするの?
0642デフォルトの名無しさん
2008/06/03(火) 23:13:280643デフォルトの名無しさん
2008/06/03(火) 23:15:39意味が分からない
バイナリビューワなら、出力は「テキスト」じゃないか
>>630は「バイナリデータを出力したい」と言ってるんだぞ
質問者の意図を理解してなかったの?
0644630
2008/06/04(水) 00:00:25あれから、色々頑張ってみたのですが、なにぶん初心者な者で、かなりてこずりました。
最終的には _setmode でなんとかできました。
fwrite で書き出したファイルとも一致するので、とりあえずはこれで良しとします。
色々と教えて下さった皆さん、どうもありがとうございました。
0645デフォルトの名無しさん
2008/06/04(水) 00:04:53分かってると思うけどC++でもfwrite()は普通に使っていいんだよ
0646デフォルトの名無しさん
2008/06/04(水) 00:30:570647デフォルトの名無しさん
2008/06/04(水) 00:46:23参考までに聞くけど、fwrite()の替わりに何使ってるの?
fwrite()なら
int a = 0xdeadbeaf;
fwrite(&a, sizeof a, 1, fp);
で済むけど
ostream::write()やstreambuf::sputn()はキャストしなきゃいけないから
stream.write(reinterpret_cast<char*>(&a), sizeof a);
とかになるよね
コードは長い、汚い、その上遅い
0648デフォルトの名無しさん
2008/06/04(水) 00:55:240649デフォルトの名無しさん
2008/06/04(水) 00:59:260650デフォルトの名無しさん
2008/06/04(水) 01:11:14必要ならFILEポインタからstreamオブジェクトに
キャストできるし、f系の方が便利よね。
0651デフォルトの名無しさん
2008/06/04(水) 01:12:010652デフォルトの名無しさん
2008/06/04(水) 09:44:440653デフォルトの名無しさん
2008/06/04(水) 09:51:42if ( MAX - 値 < 変数)
変数+値はオーバーフローしちゃうよヽ(゚∀゚)ノ
0654デフォルトの名無しさん
2008/06/04(水) 14:57:290655デフォルトの名無しさん
2008/06/04(水) 17:37:470656デフォルトの名無しさん
2008/06/04(水) 19:20:07警告レベル最高だと、未初期化の変数が使用される可能性がある場合に
ビルド時に警告が出力されますが
構造体変数の初期化方法に困っています
使用直前で変数宣言すべきか、構造体1つ1つに初期値をセットすべきか
他に何かスマートな方法があるのでしょうか、
よろしくお願い致します。
0657566
2008/06/04(水) 19:57:17仕様変更などもともなって、long型のデータ7個とdouble型のデータ4個をVBA側に返すことになりました。
が、これらのデータをどうやってVBA側に渡せばよいのかわかりません。
なお、処理はCのライブラリのみ使用してC++ MFCのライブラリ等はほとんど使用しておりません。
あともう少しなのでアドバイスお願いします。
■ このスレッドは過去ログ倉庫に格納されています