2014年8月18日月曜日

スレを勃てるまでもないC/C++の質問はここで 22

1 :デフォルトの名無しさん:2014/05/13(火) 01:12:47.46 ID:BZ1B9xOm
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
01 http://pc11.2ch.net/test/read.cgi/tech/1167476845/
02 http://pc11.2ch.net/test/read.cgi/tech/1178503366/
03 http://pc11.2ch.net/test/read.cgi/tech/1187521676/
04 http://pc11.2ch.net/test/read.cgi/tech/1221633708/
05 http://pc11.2ch.net/test/read.cgi/tech/1230516307/
06 http://pc11.2ch.net/test/read.cgi/tech/1231564903/
07 http://pc11.2ch.net/test/read.cgi/tech/1232983248/
08 http://pc12.2ch.net/test/read.cgi/tech/1235921779/
09 http://pc12.2ch.net/test/read.cgi/tech/1240022781/
10 http://pc12.2ch.net/test/read.cgi/tech/1242300936/
11 http://pc12.2ch.net/test/read.cgi/tech/1245059383/
12 http://pc12.2ch.net/test/read.cgi/tech/1248010352/
13 http://pc12.2ch.net/test/read.cgi/tech/1260842197/
14 http://pc12.2ch.net/test/read.cgi/tech/1269273471/
15 http://pc12.2ch.net/test/read.cgi/tech/1273368706/
16 http://hibari.2ch.net/test/read.cgi/tech/1279285647/
17 http://hibari.2ch.net/test/read.cgi/tech/1285115590/
18 http://hibari.2ch.net/test/read.cgi/tech/1291571263/
19 http://hibari.2ch.net/test/read.cgi/tech/1308106024/
20 http://toro.2ch.net/test/read.cgi/tech/1316013463/
21 http://toro.2ch.net/test/read.cgi/tech/1342285511/

57 :デフォルトの名無しさん:2014/05/20(火) 20:58:24.17 ID:eMXV5lE3
派生クラスのデストラクタには
とりあえず virtual つけとけば問題ない?

60 :57:2014/05/21(水) 21:12:40.05 ID:Rtlj0b94
間違えた
基底クラスのデストラクタには
とりあえず virtual つけとけば問題ない?

あと、派生クラスのデストラクタに
virtual つけとくとなにか問題ある?

64 :60:2014/05/22(木) 20:57:36.89 ID:m4yPgbOU
ぶっちゃけ
クラスのデストラクタ全てにvirtualつけとけば
問題なくない?

65 :デフォルトの名無しさん:2014/05/22(木) 21:14:59.60 ID:2g4glAhM
>>64「パフォーマンスは投げ捨てるもの」

122 :64:2014/05/28(水) 01:45:41.29 ID:1069+ikW
>>65
どういうこと?
詳しく説明してほしい

66 :デフォルトの名無しさん:2014/05/22(木) 22:10:33.87 ID:5c02VcX7
C++にてSwitch文を使った相性占いプログラムのソースを書いてほしいです

まず最初に二人の情報(5桁の数字ID、生年月日)入力をして、
そこから演算を行い、占い結果を表示するプログラムのソースを書いていただけないでしょうか

演算方法は何でもいいですし、結果は何通りでもいいです
簡単なものでも全然構いませんので、お願いしますm(_ _)m

84 :デフォルトの名無しさん:2014/05/25(日) 11:35:03.11 ID:JrQwFRNG
#include<stdio.h>#include<string.h>#include<stdlib.h>
void f(char*,int);
int main(void){
char hoge[10];
scanf("%9s",hoge);
f( hoge,strlen(hoge) );//文字列と \0を除く文字数
return 0;
}
void f(char* hoge,int len){
char** pp = (char**)malloc(sizeof(char*) *(len+1) );
int i;
char b='\0';
if( *pp == NULL ){
printf("memoryerror");
}else{
*(pp+len)=&b;
for(i=0;i<len;i++){
*(pp+i)=&hoge[i];
}
printf("%s\n",*pp);
}
free(pp);
}

これ学校のサーバ(詳細不明)上gccで実行するとmemoryerror
VisualC++2010Expressで実行すると入力と出力が一致するのですが
こういうことってよくあることなのでしょうか
またメモリ確保できなかった理由わかりますか?

121 :デフォルトの名無しさん:2014/05/28(水) 01:39:04.87 ID:1069+ikW
static変数をメンバーに持つクラスって
そのクラスを生成しなくても
そのstatic変数はプログラム実行時に生成されるの?

123 :デフォルトの名無しさん:2014/05/28(水) 01:54:43.56 ID:m/PVkgzF
FileInfo fi = new FileInfo("ファイルのパス");
fi.Delete ();

StreamWriter sw = fi.AppendText();
sw.Write("テキスト");
sw.Flush();
sw.Close();


このように書いて作成されたファイルの文字コードが、
UTF-8 になってしまいます。

調べたら、そもそも StreamWriter は UTF-8 で書きこむ、とありました。
記録するときのエンコードをシフトjisにするにはどうしたらいいでしょうか。

new するときに文字コードを指定する方法はありましたが、
上記のような流れのときにエンコードを指定する方法がわかりません。

125 :デフォルトの名無しさん:2014/05/28(水) 02:10:40.08 ID:a7wYHcWS
>>122
virtualつけると関数コール時に仮想関数テーブル参照することになって遅くなるしインスタンスのサイズも少しでかくなる
10回や100回程度ならそんなにだが1万回呼ぶとかになると結構でかい
詳しく知りたいなら仮想関数テーブルでググればいっぱい出てくるんじゃね

>>123
そもそもFileInfo通す必要あるのか
ファイルのパスが分かってるならそれをもとにStreamWriterを新しく作ればいいと思うんだが
StreamWriter^ writer = gcnew StreamWriter( ファイルパス, true, Encoding);
あとこれ本当にC++/CLIか?gcnewじゃなくてnewなあたりC#くさいんだが

148 :121:2014/05/29(木) 18:00:10.69 ID:zblOCN9G
class Ctest
{
public:
static int abc;
};


このCtestを動的に生成した場合
変数 abc は static だからグローバルになり
生成したCtestが解放された時に abc も解放されて使えなくなる?

156 :148:2014/05/30(金) 15:37:30.61 ID:9ztPnSR9
///// test.h /////

class Ctest
{
public:
static int abc;
};

///// test.cpp /////

int Ctest::abc = 100;


staticメンバーの変数はこういうことで
Ctestクラスの生成、解放関係なしに
プロプラム実行時から終了時までグローバルで使えるってことでOK?

197 :デフォルトの名無しさん:2014/06/10(火) 20:43:52.27 ID:Q6yCJgce
有理数型を作りゃいいじゃん

203 :デフォルトの名無しさん:2014/06/10(火) 23:11:03.68 ID:nP1d3r8O
あー残念ながらboostは使えない環境なのです 前もって書き忘れてました

204 :デフォルトの名無しさん:2014/06/10(火) 23:15:13.67 ID:j8iOZPUp
>>203
自分で作りなよ、ゆー

205 :デフォルトの名無しさん:2014/06/12(木) 19:54:09.97 ID:ZrIHv0PN
>>197 >>204 気長に作ってみますありがとうございます

http://codepad.org/ZTZs3nU4
POJなんですけど このコードがg++だと通ってc++だとコンパイルエラーでます
g++ってどんな補完あるんでしょうか

206 :デフォルトの名無しさん:2014/06/13(金) 23:22:35.20 ID:OcgplV8Y
>>205 解決しました ありがとうございます
sqrt()の中身int型整数を少数型にキャストしなければならないようで

207 :デフォルトの名無しさん:2014/06/14(土) 00:31:06.98 ID:bcTe5xiu
わからない、、オブジェクト指向とクラスがわからない、、、、
例えば、、、四角形を親とするクラスがあってその子どもが長方形と台形を持つとします。
四角形
メンバ変数
上辺、下辺、左辺、右辺、角度
機能
面積計算
周りの長さ計算
対角線を計算
台形のメンバ変数、高さ:長方形のメンバ変数なし、機能:面積計算
台形のコンストラクタで四角形
のメンバ変数を初期化?する、四角形の機能で計算、、四角形で辺だけをreturnする関数
を作り、台形の面積計算に必要な辺をうけとる
その後また長方形のコンストラクタで四角形を初期化?
こんな感じの考え方でよいのでしょうか、、、

もう自分で書いてて意味わからないのですが、エスパーの方教えてください。
もしくは四角形継承台形長方形、長方形の継承正方形のプログラムを教えてください。


main


コンストラクタで
長方形(double 辺、double 辺、、、):四角形(辺、辺){}
といった書き方でよいのでしょうか

223 :デフォルトの名無しさん:2014/06/16(月) 21:22:50.87 ID:9t16BPS6
>>207
もうおらんかな?
エスパーでない初学者ですが、自分の練習も兼ねて書いてみました。
メンバ変数を辺で持ったり、対角線を求めるのは出来なかったので
頂点座標を使って面積と周囲長だけ適当に書いてます。
http://codepad.org/mykX2VDE
余計かもだけど親クラスを四角形クラスにしない場合も貼っときます。
http://codepad.org/lm2cxeEM
これだと座標データは派生クラスで持つ必要があるけど、丸や三角形でも
扱えるから使い方によっては楽かも。

225 :デフォルトの名無しさん:2014/06/16(月) 23:24:56.12 ID:FBqd5r20
>>223
なるほど、ありがとうございます

仮想関数について
http://codepad.org/IDh8dIdP
これなのですが上の派生クラスSUPERのポインタを宣言とありますが、TEST
とかいてあるのでTESTのポインタではないのですか??
また、下のほうの
test[0] = new TEST;
test[1] = new SUPER;
はオブジェクト的にはどっちのオブジェクトになっているのでしょうか?
私の考えは、両方TEST型で
test[1] = new SUPER;
は派生も入っているので基底クラスに行った後virtual関数が基底の
をオーバイライド?したのだと思っています。この考え方でよいのでしょうか

259 :デフォルトの名無しさん:2014/06/28(土) 12:52:17.26 ID:Z5Hu91SB
thisの値はオブジェクトが作られて無くなるまで変わりませんよね?

261 :デフォルトの名無しさん:2014/06/29(日) 08:55:20.94 ID:KFRMJvcV
>>259
変わらないシステムが圧倒的に多いだろうね。
但し、変わった事でプログラムの動作に支障が出るようなら、それはプログラムの
作りがおかしいという事である。

265 :デフォルトの名無しさん:2014/06/29(日) 12:56:09.95 ID:d4tnsDO5
>>261
> 変わらないシステムが圧倒的に多いだろうね。

変わるシステムなんてあるの?
そのオブジェクト参照されてる場合、勝手に変わられると困ると思うが。

270 :デフォルトの名無しさん:2014/06/29(日) 22:32:21.70 ID:KFRMJvcV
>>265
winのAPIにもあるGlobalLockやGlobalUnlockは、そういう用途に使ってたよ。
今はheapを使うのが普通だけど別にオブジェクトをここに作る事が絶対禁止な
訳じゃない、まあオブジェクトの参照をどう保持するかの問題だな。

システムというかCPUが不自由だとメモリの仮想化が不十分でプログラムが
「実行中に何度も別のアドレスに勝手にリロケートされる」なんてことも起こり
得たんだよ。

272 :デフォルトの名無しさん:2014/06/30(月) 07:16:38.00 ID:RRSpyW++
>>270
GlobalAlloc とかのだとアクセスはメモリーハンドル使う訳で、普通の heap と違うでしょ?
そんなもんどや顔で出されても困るわ (w

303 :デフォルトの名無しさん:2014/07/13(日) 00:07:03.38 ID:SsDCNXiH
↑のは間違いでした。↓こっちでも行ける理由が分りません。
それが知りたいのですが。

#include "stdafx.h"
#define dbgprintf
int func(){
  return 1;
}

int _tmain(int argc, _TCHAR* argv[]){
  dbgprintf("%d", func());
  return 0;
}

317 :デフォルトの名無しさん:2014/07/13(日) 10:39:54.60 ID:SsDCNXiH
カンマ演算子ググッようやくdbgprintfマクロの挙動わかりました。
有難うございました。
マクロ勉強中で、もう一つ教えてください。こんなマクロ見つけたのですが、
#define eqstr(a, b) (*(a) == *(b) && strcmp(a, b) == 0)
文字列が等しいかどうか調べるだけなら、
#define eqstr(a, b) (strcmp(a, b) == 0)
でいいと思うのですが、*(a) == *(b)は何ですか?

320 :デフォルトの名無しさん:2014/07/13(日) 11:34:51.98 ID:iBUseW7g
2次元配列の動的確保なんですが、例えば2*3の2次元配列の場合

int **a = (int**)malloc( sizeof(int*) * 2); (①)
a[ 0 ] = (int*)malloc( sizeof(int) * 2 * 3 ); (②)

のように確保するといろいろなサイトで見かけました。

 そこで行数列数未定の2次元配列を動的確保したいのですが、
①と②の部分をreallocを使って再確保していこうとして失敗しました。
①で最初に必要な行数を与えればうまくいくのですが、行数を1つずつ増やしていく方法はありませんか?

361 :デフォルトの名無しさん:2014/07/29(火) 00:42:38.49 ID:bQIMdul6
逆に配列宣言したスコープ内の場合 どこにサイズ情報を持ってるのか疑問が沸いた

362 :デフォルトの名無しさん:2014/07/29(火) 01:06:14.11 ID:s+4NszZe
>>361
型情報と一緒にコンパイラが持ってんじゃねぇの
出力されたコード上では定数
C++だとさらに名前の中にマングリングして突っ込む

だけど、引数としての配列って不完全型云々じゃなくて暗黙のうちにポインタに変換されてたりしないか?
Cの仕様書持ってないからそのへんは知らんけど、不完全型へのsizeofならエラーじゃないのかと。

368 :デフォルトの名無しさん:2014/08/11(月) 12:52:18.57 ID:DM9hqsto
D::Cが無理

371 :デフォルトの名無しさん:2014/08/11(月) 14:43:03.41 ID:xLVZtjTF
>>368
意味が分かんない
http://codepad.org/ilLpprw1

372 :デフォルトの名無しさん:2014/08/11(月) 15:00:35.00 ID:DM9hqsto
>>371
基底クラスをテンプレートクラスにして
Cの型をlong longにして
100を静的関数にするとできないのかも

373 :デフォルトの名無しさん:2014/08/11(月) 15:47:23.53 ID:/6BMCSKz
fputcで書きだしたバイナリデータを読み込みしたいのですがアドバイスをよろしくお願いします。

書き出しの部分
int nx=256;
int ny=256;
int nz=256;
int A[256][256][256];
FILE *fptr;
if((fptr = fopen("output.bin","w")) == NULL){ exit(1); }
fputc( (nx >> 8) & 0xFF, fptr);
fputc( nx & 0xFF, fptr);
for (int k=0;k<nz;k++) {
for (int j=0;j<ny;j++) {
for (int i=0;i<nx;i++) {
fputc( (A[i][j][k] >> 24) & 0xFF, fptr);
fputc( (A[i][j][k] >> 16) & 0xFF, fptr);
fputc( (A[i][j][k] >> 8) & 0xFF, fptr);
fputc( A[i][j][k] & 0xFF, fptr);
}

読み込みの部分(自分で考えてみましたがこれではだめでした)
int A_[256][256][256];
fin.open("output.bin", ios::binary);
fin.read((char*)&nx,sizeof(int));
fin.read((char*)A_,sizeof(int)*nx*ny*nz);

374 :デフォルトの名無しさん:2014/08/11(月) 17:46:47.63 ID:xLVZtjTF
>>372
意味が分かんない、条件変わってるし。

>>373
未初期化変数をDumpしたいのかな?
int *p = &A[0][0][0];
でp++した時に指すのアドレスは
A[1][0][0]ではなくA[0][0][1]なので
ループが順番が逆
それと24,16,8,0順番だとビッグエンディアン固定になので
エンディアン判別の処理を入れるか普通にfwriteで書き込めばいい

377 :デフォルトの名無しさん:2014/08/12(火) 01:54:38.79 ID:sSgdt4Yu
>>373
書き出し
・バイナリファイルをfopenするなら"w"じゃなくて"wb"とかにしといたほうが無難
・nxの上位16ビットおよびはny、nzの値は保存していないが問題ないのか
・Aの多次元配列がnx、ny、nzに無関係な固定値だけど問題ないのか
読み込み
・書き込みが"w"なのでios::binaryを付けて"rb"相当にしていると対称にならない
・nxの読み込みがsizeof(int)となっているが、intが16ビット以外だと正常動作しない
・書き込み側でnx、ny、nzが256以外に変更されてから出力されていた場合にサイズが一致しない
・書き込み側はビッグエンディアンで出力しているので、リトルエンディアンな環境では値が一致しない

素直に書き込みの逆をやったほうが簡単だし手っ取り早いと思うよ。

375 :デフォルトの名無しさん:2014/08/11(月) 20:22:59.15 ID:PLjHWys5
>>374
ありがとうございます。
事情があって書き出しのほうのソースは変更できないんです。
読み込みのソースをうまく修正して読むことができるようにはできませんでしょうか。

376 :デフォルトの名無しさん:2014/08/11(月) 22:07:52.71 ID:xLVZtjTF
>>375
ループを逆にしてntohlで変換するだけ
書き込み時と逆にやればいいだけでしょ?

396 :デフォルトの名無しさん:2014/08/14(木) 01:42:03.02 ID:BE82x3v5
a.cpp #include "hoge.h" <iostream>
hoge.h #pragma once

hoge.cpp #include "hoge.h" <ncurses.h> <string> ncursesの関数使用とstring変数の宣言

をコンパイルしたところ
ncurses.hは問題ないのですがstringが未定義となります
何故でしょうか

399 :デフォルトの名無しさん:2014/08/14(木) 12:11:21.48 ID:BE82x3v5
>>396
詳細載せましたよろしくお願いします
http://codepad.org/5ozwCQpB

402 :デフォルトの名無しさん:2014/08/14(木) 14:16:53.95 ID:5fFoKeBH
初心者です。環境はVisualStudio2013です。
グローバル配列をexeと複数のDLL間で共有したいのですが
exeとDLL一対一だと__declspec(dllexport)を使ってできたんですが、
複数のDLLだとできませんでした。externも使ってみたんですがこれもできませんでした。
どうすればグローバル配列を共有できるんでしょうか。宜しくお願いします。

407 :デフォルトの名無しさん:2014/08/15(金) 00:58:10.02 ID:lVSvlh9k
VisualStudio2012を使用しています。
文字を16進数として扱いたいと考え、_stprintf_sに突っ込んでみました。
するとアルファベットや記号は想定通りに21〜7dとして表示されるのですが、
それ以外、たとえば'あ'(82a0になると想定)を入れると、ffffffa0と予想外の値が表示されました。
shift-jisは1バイトだったり2バイトだったりするのでこの方法ではダメなのでしょうか?
それ以前に%xにcharを突っ込むのが不適切でしょうか。
もしくは他に適切な方法があれば教えてください。

char ch = _T('あ');
char s[9];
_stprintf_s(s,_T("%x"),ch);

http://peace.2ch.net/test/read.cgi/tech/1399911167/l50/../

0 件のコメント:

コメントを投稿