D言語なら俺に聞け

このエントリーをはてなブックマークに追加
239デフォルトの名無しさん:2008/01/23(水) 08:46:27
>>237
ついでに教えてくれ
C(++)では関数内のリテラルはスタックを指すけどGCのあるDでは例に上げてくれた書き方が許される?
240デフォルトの名無しさん:2008/01/23(水) 08:51:01
>>238

const CからCに出来んよ、って怒られるんだっちゃ
241デフォルトの名無しさん:2008/01/23(水) 13:32:12
>>238
C[10] c;

void foo(C[] a){
c[3..6]=a[0];
}
242デフォルトの名無しさん:2008/01/23(水) 13:33:51
>>239
文字列リテラルはinvariant(char)[N]型の配列だからどこかから参照してる限りは生きてる。
243デフォルトの名無しさん:2008/01/23(水) 16:54:48
>>241
引数にはconstで渡したいんよ…
244デフォルトの名無しさん:2008/01/23(水) 17:17:13
_
245デフォルトの名無しさん:2008/01/23(水) 17:56:50
>>243
コピーして渡せばいいじゃん。

しかし、オブジェクトでない限りサイズ取得方法が・・・sizeofで取れるんだっけ。
246デフォルトの名無しさん:2008/01/23(水) 20:28:57
Dの配列は長さと先頭ポインタの組だから常にlengthプロパティで長さを取得できるよ
247デフォルトの名無しさん:2008/01/24(木) 08:30:06
>>244
_か、そうか、d

>>245
まあそうなんだが静的解決させたい


どーでもいいが
const C c[10];
とかって宣言したらcは触れんよね?
コンパイラにはconstに初期値がないエラーを吐いて欲しいゾ
248デフォルトの名無しさん:2008/01/24(木) 08:37:10
んでもう一点

class C{}

C[] c=new C[10];

とした場合
個々のインスタンスは
for(int i;i<c.length;++i)
c[i]=new C;

で割り当てるしかない?
それともなんか工夫して書ける?
249デフォルトの名無しさん:2008/01/24(木) 13:48:30
>>248
C[] c = new C[10];
foreach(ref e; c) e = new C;
250デフォルトの名無しさん:2008/01/24(木) 14:51:30
>>249
refか、なるほど
愛してる
251デフォルトの名無しさん:2008/01/27(日) 00:39:35
なんか new C[10] で
個々のインスタンスは生成されないのって
違和感あるんだよなあ・・・
そんなことない?
252デフォルトの名無しさん:2008/01/27(日) 00:45:24
勝手に生成される C++ は
デフォルトコンストラクタしか呼べないから不便。
まあ boost::ptr_vector とかつかやええんやけども。
253デフォルトの名無しさん:2008/01/27(日) 00:57:46
ポインタ用の領域を確保しただけなのに、勝手に実体まで作られてるほうが気持ち悪いと思う。
254デフォルトの名無しさん:2008/01/27(日) 01:41:54
>>251
構造体使えばok
255デフォルトの名無しさん:2008/01/28(月) 00:00:22
オブジェクトのインスタンスと配列が区別ついてないだけじゃねーか
256デフォルトの名無しさん:2008/01/28(月) 00:44:37
>>255
C++ではclassとstructの違いがないから、
new C[10]はCの大きさの10倍の領域を確保して、
10回デフォルトコンストラクタが呼ばれるの。

一方、Dではclassは常に参照型だから、
new C[10]はポインタ10個分の領域しか確保しないの。

ok?
257251:2008/01/30(水) 02:25:37
>>252
なるほど確かに不便だ
言われてみればそれで困ったことあった気がする
258デフォルトの名無しさん:2008/02/06(水) 16:33:50
259デフォルトの名無しさん:2008/02/07(木) 08:27:18
>>258
MSやめてくれ。
260デフォルトの名無しさん:2008/03/01(土) 03:34:01
if文の条件式で宣言した変数ってelse節から参照できないの?
261デフォルトの名無しさん:2008/03/01(土) 11:41:00
できないよ
ifブロックで使う必要ないんだったら条件式を逆転すれば?
ifとelse両方で使いたいならその書き方するもんじゃないし
262デフォルトの名無しさん:2008/03/01(土) 12:18:43
> ifとelse両方で使いたいならその書き方するもんじゃないし
ifがelse節含め全域を覆っていると考えるか、
if節、else節、って感じで分かれてると考えるか、の違いだろな。

Dは後者だから、全域を覆いたいならそういうブロック文を書かないといけない、
ってところか。
263デフォルトの名無しさん:2008/03/01(土) 20:03:57
C++ だと else から見れるから
単なる設計思想の違いじゃないかな。
特に検討したことがなかっただけ、なんてオチだったらおもろいが。
264デフォルトの名無しさん:2008/03/01(土) 23:22:24
C++ではスコープというか生存期間がelse終了まで含まれるので

class synchronizer {
 LockObject& lock;
 explicit synchronizer(LockObject& lock) : lock(lock) {
  lock.lock();
 }
 ~synchronizer() {
  lock.unlock();
 }
 operator bool() const {
  return false;
 }
};
#define Synchronized(x) if (synchronizer ___locker = synchronizer(x)) ; else

なんてのが出来たりした。(これが有用かはともかく)
265デフォルトの名無しさん:2008/05/03(土) 22:42:49
てす
266デフォルトの名無しさん:2008/07/10(木) 13:15:34
D1.0.3を使っています。

ある文字列に整数以外が入っているかどうかチェックしたいのですが
標準ライブラリで何かできますか?

toIntを使うと整数以外が入っている場合には例外を投げてくれるのですが
動作が止まってしまうので何か解決策が無いかと考えています。

何か良い方法があればよろしくお願いします。
267デフォルトの名無しさん:2008/07/10(木) 13:18:36
書きそびれましたが、現在はstd.regexpのfindを使って正規表現で振り分けをしています。

string reg = "12345";
std.regexp.find(reg, "[^(0-9)]"); // false

reg = "1235b3323s";
std.regexp.find(ptn, "[^(0-9)]") // true

というようにやっています。
268デフォルトの名無しさん:2008/07/10(木) 13:28:40
済みません、解決しました
std.stringにisNumericという関数が存在しました。
269デフォルトの名無しさん:2008/07/20(日) 22:14:27
簡単な動作をするCUIのプログラムを作りました。

これを Linux と Windows の両方で動かしたいのですが、

main.exe: main.d header.d
  dmd main.d header.d
とすると Windows では動くものの Linux では更新チェックが働いてくれません。

逆に
main: main.d header.d
  dmd main.d header.d
とすると今度は Windows で更新チェックがなされません。

Makefileをどのように工夫すれば両方で正常にコンパイルが終了するのでしょうか。
Windows では Digital Mars Make Version 5.05 を
Linux では GNU Make 3.81 を使っています。
270デフォルトの名無しさん:2008/08/09(土) 03:11:34
D言語で作っていたプログラムが
WinXPなら動くのにVistaでは動かないのですが
の仕様とかが変わっているのでしょうか?
271デフォルトの名無しさん:2008/08/09(土) 03:12:10
>>270
× の仕様
○ APIの仕様
272デフォルトの名無しさん:2008/08/09(土) 03:27:29
Win32APIの使い方間違えてるだけだろ。どうせ
273デフォルトの名無しさん:2008/11/28(金) 13:02:17
ようやくコンパイルまでたどり着いたけどファイルが複数あるときはどうすればいいんだろ、うまくいかない
----------------------------------
// hello.d
import std.stdio;
import hello2;
int main(char[][] args){
int z = hello2();
writef(z);
return 0;
}
-^--------------------------------
// hello2.d
int hello2(){ return 0;}
----------------------------------
>C:\Dev\DSciTE\bud.exe -DCPATHC:\Dev\DSciTE\dmd\bin -IC:\Dev\DSciTE\lib -I.. -I..\.. -full -debug -g -unittest -w hello.d

hello.d(5): Error: function expected before (), not module hello2 of type void
>Exit code: 1
274デフォルトの名無しさん:2008/11/28(金) 20:29:37
hello2の名前がかぶってるのが原因じゃね?
275デフォルトの名無しさん:2008/11/28(金) 21:00:48
すいません、別スレで解決しました。
http://pc11.2ch.net/test/read.cgi/tech/1226631916/146
276デフォルトの名無しさん:2008/11/29(土) 00:18:49
なんだいマルチかよ糞っ垂れ
277デフォルトの名無しさん:2008/11/29(土) 10:38:14
書き込んでから過疎スレだと気づいたんだよ、初心者スレなのかどうかもよくわからないし。
278デフォルトの名無しさん:2008/11/29(土) 13:14:02
なら答えつく前に移動したと書けよ
279デフォルトの名無しさん:2008/11/29(土) 18:01:52
ある時の俺は過疎スレなのに気づいたけどマルチや移動が見苦しいから忘却することにした
280デフォルトの名無しさん:2008/12/05(金) 20:06:00
これが匿名掲示板クオリティ
281デフォルトの名無しさん:2008/12/09(火) 00:44:08
dsssでproxyの設定ってできますか?
282デフォルトの名無しさん:2009/04/08(水) 03:48:13
そうかなあ
283デフォルトの名無しさん:2009/09/02(水) 01:53:53
なるほど
284デフォルトの名無しさん:2010/01/07(木) 17:03:32
これは駄目かも判らんね
285デフォルトの名無しさん:2010/01/16(土) 13:14:38
駄目かも判らんですね
286デフォルトの名無しさん:2010/02/15(月) 06:50:23
mada
owarannyo
287デフォルトの名無しさん:2010/02/15(月) 06:53:18
まるちやめれ
288デフォルトの名無しさん
でどうなった