[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 18:47 / Filesize : 239 KB / Number-of Response : 921
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C統合・質問スレッド



1 名前:デフォルトの名無しさん mailto:sage [03/11/09 15:37]
いろんなスレが乱立していますが、統合的なスレッドがないので立てました。
質問もOK

関連スレ
C#って死滅する理由がないよね! Part4
pc2.2ch.net/test/read.cgi/tech/1042464104/
C#最強伝説
pc2.2ch.net/test/read.cgi/tech/1061208152/
C#とJava、どっちをおぼえればいいの?
pc2.2ch.net/test/read.cgi/tech/1006715468/
C#Builder Professional 質問箱
pc2.2ch.net/test/read.cgi/tech/1062433418/

関連リンク
dir.yahoo.co.jp/Computers_and_Internet/Software/Programming_Tools/Programming_Languages/C_Sharp/


267 名前:デフォルトの名無しさん mailto:sage [05/02/03 16:55:03 ]
>>266
>>259=>>260=>>263=>>264なんだがね。

268 名前:259 mailto:sage [05/02/03 19:08:08 ]
違うよ。

269 名前:259=268 mailto:sage [05/02/03 19:09:08 ]
つーか、260,263,264は私じゃない。

270 名前:デフォルトの名無しさん [05/02/03 20:03:35 ]
pc5.2ch.net/test/read.cgi/tech/1106490240/247n-

此処で訊いたら、こう言われましたが、何故かC言語の教本のサンプルはは
#include <stdio.h>

main() {
printf("Hello!");
return 0;
}

の様に空白欄が在るのに、自分が書いたのに空白欄を作ると
何故か上記のアドレスに出た、エラーが出てしまいます
調べても、本にも書いていませんでした、ご教授お願い致します。

271 名前:デフォルトの名無しさん [05/02/03 20:09:55 ]
あれ・・・?空白欄がない。
メモ帳で見るとあるんです。

272 名前:デフォルトの名無しさん mailto:sage [05/02/03 20:28:27 ]
ネタかなあ・・

ヒント:全角スペース

273 名前:デフォルトの名無しさん mailto:sage [05/02/03 20:29:44 ]
>>270
もしかすると、君は全角スペースを入れているのでないだろうか。
使っても良いのは半角スペースとアルファベット、半角の記号のみ。

274 名前:デフォルトの名無しさん mailto:sage [05/02/03 20:32:56 ]
ま、全角スペースを解釈しないコンパイラが悪いんだな。
うんうん。

275 名前:デフォルトの名無しさん mailto:sage [05/02/03 20:33:39 ]
それは言えてる。



276 名前:デフォルトの名無しさん [05/02/03 20:34:03 ]
ありがとうございました
要は空欄を空けてもいいけど、半角を使えと言う事でしょうか?

277 名前:デフォルトの名無しさん mailto:sage [05/02/03 20:35:38 ]
だめだこいつ
全然わかってない・・

278 名前:デフォルトの名無しさん [05/02/03 20:40:51 ]
すみません・・・
簡単に言えば、空欄(スペース)は空けない方がいいですよね?

279 名前:デフォルトの名無しさん [05/02/03 20:43:28 ]
ブラウン運動を非整数階微積分するプログラムを作成したのですが、上手く動きません。どこがわるいのでしょうか??
実行結果は数値を出し、エクセルでグラフ化しています。(window.hが使えないため)
#include <stdio.h>  #include <stdlib.h>
#include <time.h>  #include <math.h>
#define KMAX 100  #define XMAX 300
#define PI 3.14159265358979323846
double gar()
{double r = 0.0;
int i;
for(i = 0; i < 10; i++){r += ((double)rand() / RAND_MAX) - 0.5;}
return r;}
int main(void)
{int x, k;     float d; scanf("%f",&d);
double ek = PI * 2.0 * 0.7 / XMAX; double a = 5.0 – 2*d;
double f[XMAX];  double g[KMAX];
srand((unsigned)time(NULL));
for(k = 1; k < KMAX; k++){
g[k]=pow(( ek * rk ),-a/2);}
for(x = 0; x < XMAX; x++){  f[x] = 0.0;
for(k = 1; k < KMAX; k++){  double kx = ek * rk * x;
f[x] = f[x]+g[k]*(gar() * cos(kx) - gai() * sin(kx));}
printf("%g\n",f[x]);}
}

280 名前:デフォルトの名無しさん mailto:sage [05/02/03 20:51:47 ]
>>278
先頭に付けてもいいのは半角スペースとTABのみ。
スペースを空けるのは括弧同士の対応や意味的な違いを付けるためで、それをインデント
を付けるといいます。
これをしないとプログラムが見憎くなります。
的確にスペースを空けてください。

281 名前:デフォルトの名無しさん [05/02/03 20:54:30 ]
>>280
ありがとうございます!!
とりあえず、半角でスペースを空けたら、何の問題もなく
実行できました。
たぶん、全角だったのでエラー出たみたいでした。

282 名前:ななし [05/02/03 22:14:53 ]
どなたかC言語でHTTPリクエストを送信できるようなライブラリを
ご存知のかたいらっしゃいませんか?
ヘッダーを意識しなくてすむような形のもので!


283 名前:デフォルトの名無しさん mailto:sage [05/02/04 00:40:29 ]
WinInet

284 名前:デフォルトの名無しさん mailto:sage [05/02/06 23:45:27 ]
質問です。
以下の環境で、外部バイナリ(画像)ファイルを実行ファイルにリンクしたいのです。
何かスマートな方法はあるのでしょうか?

開発環境OS : FreeBSD 5.3
コンパイラ : gcc 2.95.4

調べたこと :
binutils の objcopy でオブジェクトファイルに変換n出来るかなと
ドキュメントを流し読みしましたが、出来そうにありません。

以上、よろしくお願いします。

285 名前:デフォルトの名無しさん [05/02/09 12:50:59 ]
Labeling.c1: "#include" expect "FILENAME"or<FILENAME>

このエラーを回避する方法わかる方いますか?よろしくお願いします



286 名前:285 [05/02/09 13:00:42 ]
すみません。なんか初歩的入力ミス見たいです

287 名前:デフォルトの名無しさん [05/02/09 13:14:18 ]
ウインドウズプログラミングで仮想キーコードを使って
数字を表示したいのですが、0が表示できません。
keybd_event(VK_NUMPAD0,0,0,0);
keybd_event(VK_NUMPAD0, 0, KEYEVENTF_KEYUP, 0);
文法的に誤りがあるのでしょうか?
わかる方いましたら、お願いします。

288 名前:デフォルトの名無しさん [05/02/09 13:36:43 ]
誰かFTPサーバのソースプログラム教えてくれない?
今すぐ欲しいから誰かお願いします。Cの初心者なんで、そ
んなの簡単だよって思うかもしれませんが、どうかC言語
できる人よろしくお願いします。


289 名前:デフォルトの名無しさん mailto:sage [05/02/09 13:41:16 ]
Linuxのソースがあるべ、バカだな

290 名前:デフォルトの名無しさん mailto:sage [05/02/09 13:51:38 ]
おい!そいつは初心者だぞ。Linuxのソースの見れる方法も
ついでに教えてやれ。たぶんわかっとらんと思うぞ。

291 名前:デフォルトの名無しさん mailto:sage [05/02/09 13:55:53 ]
おっしゃるとおりです・・・。教えていただけます?


292 名前:デフォルトの名無しさん mailto:sage [05/02/09 13:56:22 ]
嫌だね、プ

293 名前:デフォルトの名無しさん mailto:sage [05/02/09 14:03:09 ]
RFC FTPでぐぐれば仕様書が出てくるからそれで作るのもいいかも

294 名前:デフォルトの名無しさん mailto:sage [05/02/09 14:12:10 ]
>>287
VK_NUMPAD0の代わりに'0'にしてみたらどう?

295 名前:デフォルトの名無しさん mailto:sage [05/02/09 14:22:03 ]
あのー・・・いまいちよくわかりません・・・。どなたかサンプルプログラム
書けるひといます?もしよかったらここに表示していただけたらと思い
ます。それをそのまま打ち込んでいくんで・・・。



296 名前:デフォルトの名無しさん mailto:sage [05/02/09 14:26:11 ]
ポート20をリッスン、認証できたら、ポート20のコマンドどうりに
ポート21でデータ転送。以上

297 名前:デフォルトの名無しさん mailto:sage [05/02/09 15:11:36 ]
私はCommonArchiverProjectのftp.dllを参考にしたことがあるなぁ。
バグがあって笑えたけど。

298 名前:デフォルトの名無しさん mailto:sage [05/02/09 15:13:55 ]
わらってはいけない。只で提供してるんだから。
金取ってるやつには罵詈雑言OK

299 名前:デフォルトの名無しさん mailto:sage [05/02/09 15:16:10 ]
いやぁ、使ってる人いないんだろうなぁと。<笑えた
尤も、作者に指摘メール送ったが黙殺されたので、本当のところは知らん。

300 名前:デフォルトの名無しさん [05/02/09 17:03:27 ]
#include <stdio.h>

void main(void)
{
int i;
char a[5];
for(i = 0; i < 5; i++){
printf("何か1文字入力する\n");
scanf("%c",&a[i]);
}
printf("%c,%c,%c,%c,%c\n",a[1],a[2],a[3],a[4],a[5]);
}

非常に簡単な質問で申し訳ないのですが…
このプログラムを実行するとforのi=2,i=4のときのscanfが飛ばされてしまいます。
その後の結果表示も何かおかしいのです。

自分なりに調べてはみましたが、一体何が悪いのかがわかりません。
コンパイラはBorland C++ Compiler 5.5を使っています。


301 名前:デフォルトの名無しさん mailto:sage [05/02/09 17:06:20 ]
改行コードもsacanfだな

302 名前:デフォルトの名無しさん [05/02/09 17:37:54 ]
void main(void)
{
int i;
char a[5]; // ←範囲は、0〜4までで 5個
char b[1024];
for(i = 0; i < 5; i++){
printf("何か1文字入力する\n");
scanf("%s",&b); // バッファーフォローの危険性があり、実務だと駄目!
a[i] = b[0];
}
printf("%c,%c,%c,%c,%c\n",a[0],a[1],a[2],a[3],a[4]);
}

こんな感じだけど、入力は別関数を作ってね!

303 名前:デフォルトの名無しさん mailto:age [05/02/09 17:48:30 ]
ださ

304 名前:デフォルトの名無しさん mailto:sage [05/02/09 18:10:25 ]
>>302
突っ込みどころ満載だな。
・バッファオーバフローの心配するなら指定子で制限しろ。
・配列のアドレスを渡すな。
・バッファーフォローなんて俺語を作るな。
・main()の戻り値を勝手にvoidにするな。

305 名前:デフォルトの名無しさん mailto:sage [05/02/09 18:43:32 ]
>>300
最後のprintfところでa[1]~a[5]になってるとこをa[0]~a[4]になおして、
それから一回目の入力で入れたい数字を全部連続でいれてみ?2468って感じで
最後の出力だけはきれいにでるとおもうよw



306 名前:デフォルトの名無しさん [05/02/09 21:05:07 ]
>>304
で、模範解答は?
文字列の読み込みって、簡単なようで難しいんだよね。

scanf を使って・・・・

307 名前:300 mailto:sage [05/02/09 21:22:25 ]
300です。
皆さんレスありがとうございます。

あれからも考えてみましたが、やっぱりわかりませんでした。
aの配列というのが不味いのかと思って、a,b,c,d,eと定義してみましたが、これもまた同じ結果になってしまいます。
もうあきらめた方がいいんでしょうか。
バグの原因がわからないと、また再発させそうで非常に気になるんですが…

308 名前:デフォルトの名無しさん mailto:sage [05/02/09 22:31:28 ]
scanf使うのが悪い
fgetsしてsscanf使え


309 名前:デフォルトの名無しさん mailto:sage [05/02/09 22:35:34 ]
>>300
まず1文字目を入力した後、Enterを打つだろ。
そのEnterもscanfの%cで入力されているのだろう。
と、俺は予想した。
#include <stdio.h>
int main(void)
{
    int i;
    char a[5];
    for (i = 0; i < sizeof a; i++)
        scanf("%c%*[^\n]%*c", &a[i]);
        //%*[^\n]は'\n'が出るまで読み飛ばす指定
        //%*cは1文字読み飛ばし('\n'まで読み飛ばしたので当然'\n'を読み飛ばす事になる)
    printf("%c, %c, %c, %c, %c\n", a[0], a[1], a[2], a[3], a[4]);
    return 0;
}


310 名前:デフォルトの名無しさん mailto:sage [05/02/09 22:41:35 ]
>>300
301さんが解答ですよ。

  scanf("%c",&a[i]);

で一文字読み込んだとき、まだ標準入力のバッファには改行文字が残っているのです。
それが自動的に偶数回のscanf(...)の入力となっています。

  scanf("%c",&a[i]);
  fflush(stdin);

として標準入力のバッファをクリアしてあげれば、一文字ずつ入力できます。


311 名前:デフォルトの名無しさん mailto:sage [05/02/09 22:47:26 ]
>>310
fflushは出力バッファのフラッシュ用なんで残念!
stdinに対しては未定義り!

312 名前:デフォルトの名無しさん [05/02/09 22:49:21 ]
>>301-310
皆さんどうもありがとうございました。
おかげで解決しました。



313 名前:デフォルトの名無しさん mailto:sage [05/02/09 22:53:31 ]
#include <stdio.h>
#include <stdlib.h>

int GetStdinToInt()
{
  char buf[256];
  int result;
  char* check;

  while(1){
    fgets(buf, 255, stdin);
    result = (int)strtol(buf, &check, 0);
    if(check != buf) break;
    printf("もう一度入力してください:");
  }

  return result;
}


314 名前:310 mailto:sage [05/02/09 22:55:12 ]
>>311
そのようですね。今調べて認識しました。

www9.plala.or.jp/sgwr-t/lib/fflush.html

今回の解答は

www9.plala.or.jp/sgwr-t/c/sec05.html#s5-4

に書いてありました。

315 名前:302 [05/02/09 23:02:16 ]
>scanf("%s",&b);
scanf("%s",b); ←訂正すんまそ

最近、JavaとVBしかやってないから・・・・ (ーー



316 名前:310 mailto:sage [05/02/09 23:08:39 ]
>>300

fflush(stdin)

のかわりに、

fseek(stdin, 0, SEEK_SET);

が動作保証されています。

でも、今回の場合は314で2番目のURLに書いてあることが一番いいかも。


317 名前:310 mailto:sage [05/02/09 23:11:50 ]
失礼
fseek(stdin, 0L, SEEK_SET);
でした。

318 名前:デフォルトの名無しさん mailto:sage [05/02/09 23:35:32 ]
simpson法の中で関数を呼び出してその中で積分の計算を行うプログラムを作っています。
しかし、計算速度がものすごく遅いんですがなにかいい方法ありませんか?


319 名前:デフォルトの名無しさん mailto:sage [05/02/09 23:37:51 ]
で、今の計算機は?

320 名前:デフォルトの名無しさん mailto:sage [05/02/09 23:50:30 ]
>>318
難しいことやってるんだね、学生さん。
おいらにはよく分からないけど...。

www.mech.tohoku-gakuin.ac.jp/nken/java/new2/simpson.html
にjavaだけれどコードがのってますよ。
良かったら参考にしてみたら。

321 名前:デフォルトの名無しさん mailto:sage [05/02/09 23:57:32 ]
>>320
thx
SSEつかって高速化図ってみます、、

322 名前:デフォルトの名無しさん mailto:sage [05/02/11 00:36:27 ]
C言語のバージョン教えてと言われた。
どうやって知ればいいんだろうか。

323 名前:デフォルトの名無しさん mailto:sage [05/02/11 00:41:21 ]
sにcharを足すstrcatってないの?

324 名前:デフォルトの名無しさん mailto:sage [05/02/11 00:42:42 ]
>>322
seclan.dll.jp/c99d/c99d02.htm#dt19990412
の__STDC_VERSION__

325 名前:デフォルトの名無しさん mailto:sage [05/02/11 01:14:37 ]
>>323
ありませんよ。

Cで一般的に言われる文字列というものは、最後がヌル文字'\0'で終わることを前提
としています。提供されるシステム関数strcat()などもそうです。
一文字のcharはそういった関数で使用することはできません。

char dest[100];
char src1[] = "abc";
char src2 = 'x';
int len;

len = strlen(strcpy(dest, src1));
dest[len] = src2;
dest[len + 1] = '\0';

こんな感じですかね。もっとアクロバット的な方法もあるんでしょうが...。



326 名前:デフォルトの名無しさん mailto:sage [05/02/11 01:49:10 ]
int n = c;
strcat(s, &n);

327 名前:デフォルトの名無しさん mailto:sage [05/02/11 02:14:49 ]
>>326
関数内の自動変数の場合、
int n
の場合、cを代入した次のバイトがNULLである保証はありませんよ。

328 名前:デフォルトの名無しさん mailto:sage [05/02/11 02:16:47 ]
補足。
CPUのアーキテクチャによって異なります。
言語としてそういったことに依存すべきではないと言いたかったのです。

329 名前:デフォルトの名無しさん mailto:sage [05/02/11 02:50:54 ]
>>327
ん? cは1バイトだから他の3バイトは当然0になるでしょう。 しかしこれは
endianによっては右に詰まってだめだと思うので >>328は正しいと
思うけど。

ちなみにこんなのはどう?
sprintf(s, "%s%c", s, c);


330 名前:デフォルトの名無しさん mailto:sage [05/02/11 06:51:06 ]
>>329
未定義

>>326
char s2[] = {c, '\0'};
strcat(s, s2);でいいじゃん。

C99ならstrcat(s, (char []){c, '\0'});って書ける筈だけど。

331 名前:デフォルトの名無しさん mailto:sage [05/02/11 10:17:54 ]
私はこんな幹事かな。
sprintf(strchr(str, '\0'), "%c", ch);
或いはこう。
char * p = str + strlen(str);
p[0] = ch;
p[1] = '\0';

332 名前:デフォルトの名無しさん [05/02/27 16:56:10 ]
すみません、妙な質問で恐縮ですが、どなたか教えてください。

sprintf() の s ってどういう意味ですか?f は format の意味だと思うのですが。

333 名前:デフォルトの名無しさん mailto:sage [05/02/27 16:59:08 ]
stringじゃない?

334 名前:デフォルトの名無しさん mailto:sage [05/02/27 17:01:38 ]
sはsecond。fはfirst

335 名前:デフォルトの名無しさん mailto:sage [05/02/27 18:04:22 ]
string ですか。ありがとうございました。
scond ですか(ry



336 名前:デフォルトの名無しさん mailto:sage [05/02/28 12:51:53 ]
>>332
printf()「系」とかssanf()「系」とか言う言葉があるよ。
先頭の's'はstring、'f'は自分でオープンしたファイル、付かないものは対象がstdinか
stdout。結構系統立てられているんですよ。

337 名前:336 mailto:sage [05/02/28 12:53:07 ]
メンゴです。
一行目のssanf()はscanf()でした。

338 名前:デフォルトの名無しさん mailto:sage [05/02/28 14:16:48 ]
>>336
さらにva_listを引数に取るvprintf/vscanfも有る。当然fとsも有る。
vscanf系はC99で追加されたものだけど。

339 名前:デフォルトの名無しさん mailto:sage [05/02/28 18:51:54 ]
springfというのもある

340 名前:デフォルトの名無しさん mailto:sage [05/02/28 22:45:28 ]
さらに最新最強はsnprintf。 渡したchar *のサイズを2つ目の引数で指定でき、
そのサイズを超えて書かないことが保障されているのでやや安全。

341 名前:デフォルトの名無しさん mailto:sage [05/03/02 16:40:40 ]
アドレスに関する質問。
型は不明で、要素一つのサイズは分かってる場合。

次の要素にアクセスする方法を教えて下さい。
または次の要素へのアドレスを取得する方法。


342 名前:342 mailto:sage [05/03/02 16:42:50 ]
サイズがBYTEだってことに気づかなかった....。
解決しました。

343 名前:デフォルトの名無しさん mailto:sage [05/03/09 14:33:38 ]
POINT point[3] = { {0,0} , {1,0} , {0,1} };
っていう初期化はできるんですが

point[3] = { {0,0} , {1,0} , {0,1} }
という風に値を入れることが出来ません
配列全体に値を入れる方法は無いんですか?

344 名前:デフォルトの名無しさん mailto:sage [05/03/09 16:00:29 ]
>>343
配列に代入はできません。
精々コピー用の関数を用意するのが関の山です。
要素数が3で固定ならば、構造体にしてしまえば(直値ではありませんが)代入できなくもありません。


345 名前:デフォルトの名無しさん mailto:sage [05/03/09 16:10:27 ]
>344
関数でもつくってそれで入力するようにします
ありがとうございました。



346 名前:デフォルトの名無しさん mailto:sage [05/03/10 00:43:33 ]
Cって、こういうとこアフォだよなあ

347 名前:デフォルトの名無しさん mailto:sage [05/03/10 19:02:05 ]
やっぱりRubyがいいね

348 名前:デフォルトの名無しさん mailto:sage [05/03/13 17:13:30 ]
cでコンパイルする際に

windres: can't open `obj/EK-MAMEko/ui/mame32k.res' No such for directory
make: *** [obj/EK-MAMEko/ui/mame32.res] Error 1

こういうエラーが出て困ってるんだけど
これってどういう意味かわかる?

349 名前:デフォルトの名無しさん [05/03/13 17:14:00 ]
age

350 名前:デフォルトの名無しさん mailto:sage [05/03/13 18:48:41 ]
>>347
いや、Rubyは問題外。

351 名前:デフォルトの名無しさん mailto:sage [05/03/17 00:52:33 ]
変数を入れ替えるときに別の変数を用意せず、

X = X ^ Y, Y = X ^ Y, X = X ^ Y;

とするのがよくないのはなぜ?

352 名前:デフォルトの名無しさん mailto:sage [05/03/17 00:56:22 ]
>>351
数値以外には使えない
XとYが同じ変数を指していると上手くいかない

353 名前:351 mailto:sage [05/03/17 01:17:15 ]
>>352
なるほど。
これをプリプロッセスでやって構造体なんかを渡しちゃうとマズーだ。
アリガト。

354 名前:デフォルトの名無しさん mailto:sage [2005/03/22(火) 21:55:06 ]
new演算子で作ったオブジェクトをdeleteした後に
デストラクタでdeleteすると何か問題ありますか?

355 名前:デフォルトの名無しさん mailto:sage [2005/03/22(火) 23:09:33 ]
mallocで確保した領域をfreeで開放しますが、
システムはどのようにして、はじめに確保した領域を知ることができるのでしょうか。



356 名前:デフォルトの名無しさん mailto:sage [2005/03/23(水) 01:23:39 ]
>>354
deleteしたら、0を入れておけば大丈夫。

>>355
malloc()で戻されたポインタの指すメモリの直前辺りに管理情報を埋めておくのが一般的。

357 名前:デフォルトの名無しさん [2005/04/03(日) 14:07:55 ]
配列同士の数値の比較をしたいのですが、下記のようだとうまくいきません。
どのようにすればよいのでしょうか?
for(i=0;i<5;i++)
for(j=0; j<5; j++)
if(group[i] == group[j] && i != j) count[i]++;

358 名前:デフォルトの名無しさん mailto:sage [2005/04/03(日) 15:10:03 ]
>>357
j = i

359 名前:デフォルトの名無しさん mailto:sage [2005/04/03(日) 15:22:36 ]
>>357
配列の同じインデックスを持つ要素同士を比較したいのであれば、単純な(一重の)ループでいい。
つーか、>357では日本語の説明が足りんし、コードがおかしいし、何がしたいのか判らんのだが。

360 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 00:24:27 ]
すみません。初歩的な質問をさせていただきます。

char *func1(){
 return "a";
}

char *func2(){
 char *s = "a";
 return s;
}

こんな2つの関数があったとして、これらが関数の呼び出し元に返ってきた際に
戻り値のポインタが正しい場所を指し示すことはどこまで(いつまで)保障できるんでしょうか?
func1は保障できる、func2はできる、それとも両方できない/できる、どこまでなのか…等。
また、私の勉強不足のせいで、両者のメモリ上での違いがいまいちはっきりしてません。

一応どちらでも動作するにはするんですが、いつか不正な参照とかで
落ちちゃうんじゃないかと気になって怖くて夜も眠れません。

参考になるサイトを教えていただけるだけでも結構ですのでよろしくお願いします。

361 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 01:05:29 ]
規格ではどうか忘れたけど、たいがいいけるはず。
どうしても心配ならstatic const char ret_str[] = "a";とかすれば?
あとchar *じゃなくてconst char *を使え。

362 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 01:08:07 ]
>>360
定数(リテラル)の寿命はプログラムの開始から終了まで。
関数内で宣言されたauto変数の寿命は、関数の開始から終了まで。

char *func1(){
 return "a"; /* "a" を指すポインタを返している */
}
char *func2(){
 char *s = "a"; /* ポインタ s を "a" を指すポインタで初期化 */
 return s; /* ポインタ s の値、つまり "a" を指すポインタを返している */
}

つまり、どっちも同じ。
リテラルはいつでもどこからでも参照出来るので、戻り値を使ってても大丈夫。

363 名前:360 mailto:sage [2005/04/04(月) 02:05:28 ]
>>361-362
ありがとうございます!だいぶスッキリしました。
リテラルに関しては参照先が不正な値になるんじゃないかとかいう
心配は無用なわけですね。逆の場合(変数、関数のポインタ)は気をつけろと。

すみません。あとここからもう一段階お願いします。
実は言うと今、Unix系ソフトの移植作業をやってまして
こいつらと同等の動作をするものを作りました。

char *dirname(char *path);
char *basename(char *path);

basename()はパス名からディレクトリを除いた部分(ファイル名)を返せばいいので
引数のポインタをそのまま使い回してreturn path+pos;のようにして返してます。

dirname()の方は引数で与えられたパス名からファイル名を除いたものを返すものなので、
関数内でdir[MAX_PATH]のように宣言した配列に、引数の文字列からファイル名部分を
除いたものをstrncpyでコピーなどして、最後にdir(先頭アドレス)を戻り値にしてます。
(ちなみにさっきの質問は"."「カレントディレクトリ」を返す場合でした。)

長すぎるのでまとめると、
・basename()の戻り値は呼び出し先のローカル変数とは無関係である。
・dirname()の戻り値は呼び出し先のローカル変数に依存している。

この場合だと、dirで確保していたアドレスは戻り先で参照しても安全なのでしょうか?
ちゃんと動くし、自分でも大丈夫だと思ってたのに警告が出たので不安になりました。

やたら長くてすみません。何かこれより良い実装方法がもしあればご教授願います。

364 名前:360 mailto:sage [2005/04/04(月) 02:14:47 ]
何度もすみません。つまりさっき私が言ったdirname()の実装は

char *func2(){
 char *s = "a"; /* ポインタ s を "a" を指すポインタで初期化 */
 return s; /* ポインタ s の値、つまり "a" を指すポインタを返している */
}

この場合と同じと考えていいんでしょうか?ってことですね。
私の目には全く同じものに映るのですが、間違いありませんでしょうか。

365 名前:デフォルトの名無しさん [2005/04/04(月) 02:15:23 ]
floatがもてる最大値はどのように調べればよいのでしょうか?



366 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 02:30:48 ]
>>363-364
const char *func3(void){
const char s[] = "a";
return s; /* ローカルな配列 s へのポインタを返す */
}

const char *p;
p = func(); /* 0, func() の s へのポインタを受け取る */
printf("%p\n", p); /* 1, これは構わない */
printf("%s\n", p); /* 2, これは駄目 */

0 は何ら構わない。戻ってきたアドレスをコピーしているだけ。
1 も何ら構わない。コピーしたアドレスを表示しているだけ。

2 は駄目。アドレスの先を参照してしまっているから。
何故参照してはいけなかというと、アドレスの先にある func3() の s の寿命は、
func3() を抜けた時点で既に尽きてしまっているから。

func2(), func3() は全然違う関数。

367 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 02:35:17 ]
>>365
float.h にある FLT_MAX マクロで定義されてる。

#include <stdio.h>
#include <float.h>
int main(void)
{
 printf("%f\n", FLT_MAX);
 return 0;
}






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<239KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef