C言語なら俺に聞け( ..
[2ch|▼Menu]
367:デフォルトの名無しさん
10/03/14 19:25:05
>>363
thx

368:デフォルトの名無しさん
10/03/14 20:40:38
C言語のことならなんでも聞いてくれるんですか。

369:デフォルトの名無しさん
10/03/14 20:50:21
難しいのはちょっと・・・

370:デフォルトの名無しさん
10/03/14 20:51:50
さあ願いを言え
どんな願いも一つだけ
聞き流してやろう…

371:デフォルトの名無しさん
10/03/14 22:05:45
いくらでも聞くよ

372:デフォルトの名無しさん
10/03/14 22:40:35
>>366
pow()のアルゴリズムを知っているか? 知っていればすぐに判ることだが非常に誤差が発生しやすい。
従って、第二パラメータが整数になるなら使わない方が無難。
後は、その分の計算量をどこでどう分散させるかだな。

373:デフォルトの名無しさん
10/03/15 01:32:38
いまだにミドルウェアっていうのがよくわからない

374:デフォルトの名無しさん
10/03/15 11:29:44
>>373
ミドルウェアってのはOSとソフトウェアの中間に値する物
ミドルウェア = DBMSって覚えておけばok

375:デフォルトの名無しさん
10/03/15 11:49:53
ヘッダファイルには全ての関数/変数に、extern/staticを付けなければならないんですか?

376:デフォルトの名無しさん
10/03/15 12:44:34
いいえ

377:デフォルトの名無しさん
10/03/15 12:50:48
>>375
そもそも、ヘッダファイルで定義をしてはいけません。

378:デフォルトの名無しさん
10/03/15 15:01:24
中間搾取w

379:デフォルトの名無しさん
10/03/15 15:04:54
元ダフ屋が金券ショップになりやがて中央銀行になったようなもの

380:デフォルトの名無しさん
10/03/15 21:58:35
>>338

#include <stdio.h>
#include <stdlib.h>
void main(int argc, char** argv ) {
char str[0xFF]; double n[1000]; int n_max = 0; int i=0;
FILE* fp = fopen( argv[1], "r"); while( fgets(str,0xFF-1,fp) != NULL ){ n[n_max++]=strtod( str, NULL ); }
srand((unsigned)(time(NULL)));
while( i < 5 ) { int r = rand()%n_max; if( n[r] != 1e+306 ) { printf( "%f\n", n[r] ); n[r]=1e+306; i++; }}
}

くじびき的な何か?

381:デフォルトの名無しさん
10/03/15 22:02:18

fopen、fscanf、for、ifのみを使って

という条件を満たしていない気がするのだが、いいのか。

382:デフォルトの名無しさん
10/03/15 22:10:58
うむ、randが使えないのが難点だな

383:デフォルトの名無しさん
10/03/15 22:11:06
>>380
fgets()の第二パラメータの意味を誤解していそうだ。

384:デフォルトの名無しさん
10/03/15 22:45:47
せめて現在時刻がわかれば乱数のように使えるのに
制限が厳しすぎる

385:デフォルトの名無しさん
10/03/15 23:27:10
__asm は使ってもいいですか? 関数じゃないからいいよね?

386:デフォルトの名無しさん
10/03/15 23:53:32
乱数の代わりに初期化していない自動変数の中身を読むってのは無し?

387:デフォルトの名無しさん
10/03/16 00:14:56
厳密なことをいうと、十分にランダムである保証がない
特に乱数や、乱数の種、ましてや暗号関係で使うのは厳禁

あと初期化されていない変数って、規格上は読んでいいんだっけ?

388:デフォルトの名無しさん
10/03/16 00:18:33
定義されていないだけで、読むのは別にいいんでない

389:デフォルトの名無しさん
10/03/16 00:39:10
>>381

#include <stdio.h>
#include <stdlib.h>
static double s;
static int rnd(void){ int p; if(s>1e+8){s*=1e-4;}; if(s<0){s*=1e+8;} s += 0.1*s; return((s<0.0)?-s:s); }
void main(int argc, char** argv ) {
char str[0xFF]; double n[1000]; double d; int n_max = 0; int i=0;
FILE* fp = fopen( argv[1], "r"); for( ; fscanf( fp, "%lf", &d ) != EOF ; ){ n[n_max++]=d; }
s=((double)((long)&str)); rnd();
for( i=0; i<5 ; ){ int r = rnd()%n_max; if( n[r] != 1e+306 ) { printf( "%f\n", n[r] ); n[r]=1e+306; i++; }}
}

な、なんか意味あんのん?… この制限て…(・_; ばたり…

390:デフォルトの名無しさん
10/03/16 00:43:09
もうひとつ制限がありました。7行で書いてください

391:デフォルトの名無しさん
10/03/16 00:47:44
改行しなきゃいいだけ

392:デフォルトの名無しさん
10/03/16 00:53:39
>>390

#include <stdio.h>
static int rnd(double* s){ int p; if(*s>1e+8){*s*=1e-4;}; if(*s<0){*s*=1e+8;} *s += *s*0.1; return((*s<0.0)?-*s:*s); }
void main(int argc, char** argv ) {
double n[1000]; double d; int n_max = 0; int i=0; double s =(double)((long)&n); rnd(&s);
FILE* fp = fopen( argv[1], "r"); for( ; fscanf( fp, "%lf", &d ) != EOF ; ){ n[n_max++]=d; }
for( i=0; i<5 ; ){ int r = rnd(&s)%n_max; if( n[r] != 1e+306 ) { printf( "%f\n", n[r] ); n[r]=1e+306; i++; }}
}

もぅ寝まつ…(つ_\

393:デフォルトの名無しさん
10/03/16 01:08:23
>>338
これでどうだ
ウチでは実行するたびに結果が変わったよ
#include<stdio.h>

#define DATA_NUM 1000

int main(void)
{
unsigned long rand_pool[DATA_NUM], rand_num[5];
int value[10], i, index;
FILE *fp;

if((fp=fopen("hoge.txt", "r"))==NULL) return 1;

for(i=0;i<10;i++) if(fscanf(fp, "%d", &value[i])!=1) return 2;

for(i=0;i<DATA_NUM;i++) rand_num[i%5]^=rand_pool[i];

for(i=0;i<5;i++)
{
index=rand_num[i]%(10-i);
printf("%d\n", value[index]);
value[index]=value[10-1-i];
}

return 0;
}

394:デフォルトの名無しさん
10/03/16 02:27:07
回答が知りたい。
こんな問題を出した意図とか。

どうせ>>338が問題を書き間違えて重要な情報が抜け落ちてたってオチだろうけど。

395:デフォルトの名無しさん
10/03/16 16:26:46
関数で参照渡しするときの所作を詳細に教えてくささい

396:デフォルトの名無しさん
10/03/16 16:30:29
まず、参照渡しの定義をしてから質問してください

397:デフォルトの名無しさん
10/03/16 16:36:06
C言語では参照渡しはできません
JAVAを使いましょう

398:デフォルトの名無しさん
10/03/16 16:37:08
もどきはできるじゃん

399:デフォルトの名無しさん
10/03/16 16:37:44
ポインタによる間接参照

400:デフォルトの名無しさん
10/03/16 22:08:09
>>395
洒落じゃね?

401:デフォルトの名無しさん
10/03/16 22:45:29
sprintfを使って整数から文字列に変換しようとするとき
"%04d",i みたいに前をゼロで埋める指定で、0で埋める個数って変数にできないんですかね?

402:デフォルトの名無しさん
10/03/16 22:49:04
*

403:デフォルトの名無しさん
10/03/16 23:05:00
なるほど、%0*d , (int) , i でいけました
ありがとうございます

404:デフォルトの名無しさん
10/03/17 23:08:23
超初心者ですがよろしくお願いします。
Macでも使えて軽いコンパイラってありますか?

405:デフォルトの名無しさん
10/03/17 23:26:55
gccでいいだろうに

406:デフォルトの名無しさん
10/03/18 06:44:00
軽いコンパイラって、どんなコンパイラだよ。

407:デフォルトの名無しさん
10/03/18 14:35:10
じゃ軽いライブラリで

408:デフォルトの名無しさん
10/03/18 15:30:45
俺の作ったコンパイラすごいぜ。

5年前のノートPCなのに、円周率計算させると2秒で5億桁まで出力する。

VisualStudio2008ってソフトなんだけど。

409:デフォルトの名無しさん
10/03/18 15:42:31
ネタだろうけど、GMPより糞速いじゃん
URLリンク(gmplib.org)

410:デフォルトの名無しさん
10/03/19 00:39:07
gccでプログラム作ってます。
例えば、buff=(char *)malloc(sizeof(char) * 10);とメモリを確保したあと
配列が不足するたびにreallocでメモリを増やしていこうと考えてます。
buff=(char *)realloc(buff, sizeof(char) * 20);という具合に。
そこで悩んだのですが、ある時点でbuffにどれくらいメモリが割り当てられてるか
確認する方法ってないですか?
「* 10」を「* i」みたいに変数を使って確認するしかないんでしょうかね?

411:デフォルトの名無しさん
10/03/19 00:41:37
サイズを保存するしか無いよ

412:デフォルトの名無しさん
10/03/19 00:46:46
>>411
ありがとう。そうします。

413:デフォルトの名無しさん
10/03/19 01:11:33
>>410
> buff=(char *)realloc(buff, sizeof(char) * 20);という具合に。
出たよ。メモリ確保できないときにリークが確定するパターン。
初心者に realloc() 教えるとすぐこれをやらかす。

414:デフォルトの名無しさん
10/03/19 01:16:08
鬼の首でも取ったのか?
喜びすぎだろ

415:デフォルトの名無しさん
10/03/19 01:20:57
喜んでるわけが無いだろjk
うんざりしてるんだよ。

416:デフォルトの名無しさん
10/03/19 02:32:19
#include <stdio.h>
#include <stdlib.h>
// 構造体 B
typedef struct tagB { int max_size; char* buff; } B;

// B を初期化する命令
void B_init( B* b ) { b->max_size=10; b->buff =(char*)malloc(sizeof(char) * b->max_size); }

// B のメモリを10ふやす命令
void B_realloc( B* b ) { b->max_size += 10; b->buff = (char*)realloc( b->buff, sizeof(char) * b->max_size ); }

// Bに char を一文字セーブする命令 ( B の buff が短かったら自動的に伸ばしてくれる )
void B_write( B* b, char c, int index ) { if( index >= b->max_size ){ B_realloc(b); B_write( b, c, index ); } b->buff[index] = c; }

// Bから char を一文字ロードする命令 ( B の buff が短かったら自動的に伸ばしてくれる ) 
char B_read ( B* b, int index ) { if( index >= b->max_size ){ B_realloc( b ); B_read( b,index ); } return( b->buff[index] ); }

void main() { B b; B_init( &b ); B_write( &b, 'A', 12345 ); printf("%c\n", B_read( &b, 12345 ) ); }

おこられそう…w(^_^

417:デフォルトの名無しさん
10/03/19 02:52:10
>>416
怒りはしないが、ダメダメ。
ロードする関数でrealloc()しても、増えた領域に何にも書いてないから不定値が返るぞ。
それに、セーブする方も任意のindexを指定できるのに一度に伸ばせるのが高々10文字だから簡単に範囲外書き込みになってしまう。
それに、sizeof(char)なんて無意味なことは書くべきじゃない。

418:デフォルトの名無しさん
10/03/19 02:55:55
>>413
出たよ。問題の本質と関係ない話をする奴。
buffの宣言がないじゃん、と言ってるのと同レベルだぜそれ。
初心者じゃなくなったと思い込んでる初心者はすぐこれをやらかす。

419:デフォルトの名無しさん
10/03/19 02:56:52
そもそも、メモリ確保ができなくなる心配をする前にすることがあるだろうと。

420:デフォルトの名無しさん
10/03/19 02:57:08
その程度のサイズでrealloc使うとか、何の冗談だよw

421:デフォルトの名無しさん
10/03/19 03:00:21
足りなければ倍にするというやんちゃな方式が時として功を奏することもあるよ
とりあえず、ポインタを元にアロケーションしているサイズを知ることはできないので他で管理しましょう

>>420
ええと。

422:デフォルトの名無しさん
10/03/19 09:12:57
どうしても必要ならともかく、入門レベルでrealloc使わせるのはどうかと思うが。
余裕をもとって大きめに領域確保するほうがよっぽどマシ。

423:デフォルトの名無しさん
10/03/19 09:15:29
>>413
すぐそのあとに、if (buff == NULL) exit(1); と書けば問題なし。
メモリ不足なら、ほかのところだってまともに動くわけないんだから。

424:デフォルトの名無しさん
10/03/19 09:32:48
>>422
それはそれでイヤン

425:デフォルトの名無しさん
10/03/19 11:07:20
>>424
サイズをオーバーするかどうかちゃんとチェックするならありじゃね?

426:デフォルトの名無しさん
10/03/19 14:55:30
>>425
オーバーしそうになったらどうすんの?

427:デフォルトの名無しさん
10/03/19 15:50:24
>>426
・ごめんなさい、私には無理です
・オーバーする分はなかったことにしていいよね

どちらでもお好きに。

428:デフォルトの名無しさん
10/03/19 16:08:53
一行が長いテキストファイルを開くと落ちるエディタ
一行が長いと後ろのほうが切り捨てられるエディタ

どっちもいやだなぁ

429:デフォルトの名無しさん
10/03/19 16:10:43
4G以上のファイルとかどうやって扱ってんのか気になる

430:デフォルトの名無しさん
10/03/19 16:27:26
>>429
4GB以上のファイルを普通に扱える環境なら、64ビットアドレッシングで使うのが当たり前だから特に工夫は要らないよ。
32ビット環境で扱いたいなら、一度に全部開かなければいいだけだからやはり、4GB以上だからといって別段大仰な手間は要らない。

>>428
初心者が作るのなら、取り敢えずそれでもいいのでは? まさか、そのまま保存するわけでもあるまいし。

431:デフォルトの名無しさん
10/03/19 19:50:57
文字配列についてお尋ねします

char buf[6] = {'A', 'B', 'C', 'D', 'E', '\0'};
と宣言したとします。

このとき
buf[1]は 'B'が格納されており文字コードが例えば66だとします
buf[1]は数値そのものであるので、if(buf[1] == 66)もしくはif(buf[1] == 'B')のような比較が可能です。(ですよね?)
ここでbufとするとABCDEという文字列を表すことになりますが、このときbuf自体の数値は
bufのアドレスが入っています。(ですよね?)

ここで疑問なのですが、bufは一体どこのアドレスが入っているのでしょうか?
例えば、buf[0]のアドレスと同じものであればAとしか表示されないはずです。
ABCDE\0をもってくるにはbuf[0]からbuf[5]までのアドレスが必要なはずです。

buf自体はアドレスの開始地点で終端文字の\0が現れる部分までのオフセットを割りだし
そのアドレスをすべて与えて文字列を表示しているということでよろしいでしょうか?
回答よろしくお願いします。

432:デフォルトの名無しさん
10/03/19 20:01:01
>>431
buf と等価なのは &buf[0]

433:デフォルトの名無しさん
10/03/19 20:04:08
>>431
だいたい合ってるが、1点だけ。

> ここでbufとするとABCDEという文字列を表すことになりますが、
bufがABCDEという文字列を表しているわけではない。
あくまで文字列の先頭のアドレスを保持しているにすぎない。
buf == &(buf[0])

puts(buf)で"ABCDE"と表示されるのは、以下のような処理をしているため。
for(char *p = buf; *p != '\0'; p++) { *pを出力; }

434:デフォルトの名無しさん
10/03/19 20:07:07
>>431
配列は配列であってポインタじゃない

435:デフォルトの名無しさん
10/03/19 20:10:42
char buf[] = {'h', 'o', 'g', 'e', '\0'}
char *p = buf;

buf

'h' 'o' 'g' 'e' '\0'

0x00..... ← p

436:デフォルトの名無しさん
10/03/19 20:13:39
グダグダ言ってないでデバッガで変数見りゃいっぱつだろうが

437:デフォルトの名無しさん
10/03/19 20:14:09
>>431
>ここでbufとするとABCDEという文字列を表すことになりますが
ここでってどこだよw

438:デフォルトの名無しさん
10/03/19 20:26:53
>431
言っていることはその通り何だけど
NUL('\0')終端文字列はNULが現れるまでを文字列とみなすから表示させたい最初の文字のアドレスを渡すだけでいいのよ
あなたにお薦めなサンプルプログラム

#include <stdio.h>
#include <string.h>

int
my_print(char const*str)
{
  size_t i;
  for ( i = 1; i < str[0]+1; ++i ) {
    putchar(str[i]);
  }
  return i-2;
}
int
main(int argc, char **argv)
{
  char foo[6] = {'a', 'b', 'c', 'd', 'e', '\0'};
  char bar[16] = {'a', 'b', 'c', 'd', 'e'};
  char baz[] = {3, 'b', 'a', 'z'};
  memset(bar+5, '\100', 10); /* ゴミを入れる */
  bar[15] = '\0'; /* NUL終端させる */
  printf("%s\n", foo);
  printf("%s\n", &foo[0]);
  printf("%s\n", &foo[3]);
  printf("%s\n", bar);
  my_print(baz);
  return 0;
}

439:デフォルトの名無しさん
10/03/19 21:22:55
配列はメモリ上連続しているので、先頭アドレスと型がわかれば計算で出ます。
コンパイラは &buf[5] を &buf[0] + (5 * sizeof(char)) と捉えます。

440:デフォルトの名無しさん
10/03/19 21:33:35
プログラミングに使う単語って英語ですか?

441:デフォルトの名無しさん
10/03/19 21:37:20
基本的には

442:デフォルトの名無しさん
10/03/19 21:43:31
皆さんは英語ペラペラですか?

443:デフォルトの名無しさん
10/03/19 21:44:01
My English is poor.

444:デフォルトの名無しさん
10/03/19 22:17:57
>>442
fuck u

445:431
10/03/19 22:18:43
>>433
buf自体がが先頭アドレスなのは↓に書いたように知ってます
>buf自体はアドレスの開始地点
結局全部
for(char *p = buf; *p != '\0'; p++) { *pを出力; }
これやってるだけなんですね…

446:431
10/03/19 22:24:21
>>439

buf[5]を例えばprintfするときはオフセットで
文字列を全部表示するときはポインタをズラす方法で表示しているのですか?

for(char *p = buf; *p != '\0'; p++) { *pを出力; }
このようにポインタをズラしているのか、
それとも
&buf[5] を &buf[0] + (5 * sizeof(char))
のようにオフセットで計算しているのか
内部の処理はどっちなんでしょうか?

それが>>431の質問で一番知りたいことなんですが


447:431
10/03/19 22:26:02
>>436
オフセットで計算したものか、ポインタをズラしたものなのか
格納されたアドレス見るだけじゃわからないんですよ…

448:デフォルトの名無しさん
10/03/19 22:26:32
どういう風にprintfを作るかなんて決まってないしコンパイラメーカーが勝手にやってるだけだよ
きっと、前者だろうなって気はするけど

449:デフォルトの名無しさん
10/03/19 22:27:39
前者な気がする

450:431
10/03/19 22:28:24
>>448
そうなんですか…
どっちが主流なのか知りたかったのですが(速度とかいろんな意味で)

451:デフォルトの名無しさん
10/03/19 22:30:39
そんなこと知ってどうすんだろ

452:デフォルトの名無しさん
10/03/19 22:31:24
速度とかそれこそきまってねえだろ
おまえはなにか?コンパイラは全て同じ中身じゃないといけないと思ってんのか?主流ってなんだ?どの環境の主流だ?
クソして寝ろや

453:デフォルトの名無しさん
10/03/19 22:33:28
>>450
もう答えは出てるだろう。文字列探索程度のコストを気にするより
もっと他の所の速度を気にしろ。

454:デフォルトの名無しさん
10/03/19 22:35:29
簡単なプログラムつくって、最適化全部はずしてバイナリを逆アセンブルして追っかけてみれば?
ペンティアム以降になると急に難しくなるから、LSICの試食版あたりからははじめて
あるいはgccならprintfもソースみれるよ

そうやって3,4個調べてみれば主流もわかるんじゃね

455:デフォルトの名無しさん
10/03/19 23:38:50
robot C わかる人いる?

456:デフォルトの名無しさん
10/03/19 23:41:38
ボクは個人的には
char c[1234]
ってのを

putchar( c[0] ); putchar( c[1] ); putchar( c[2] ); putchar( c[3] ); putchar( c[4] ); putchar( c[5] ); 〜〜〜ずーっとつづく
って書くよりも

char* p=c;
putchar( *p++ ); putchar( *p++ ); putchar( *p++ ); putchar( *p++ ); putchar( *p++ );  〜〜〜ずーっとつづく
って書く方が、コピペが楽なので好きですw


457:デフォルトの名無しさん
10/03/19 23:43:53


458:デフォルトの名無しさん
10/03/19 23:44:02
頭おかしいのかおまえ

459:デフォルトの名無しさん
10/03/19 23:52:53
俺がコンパイラなら syntax error 出すわな

460:デフォルトの名無しさん
10/03/19 23:53:21
最終的にはsystem callを追っかけてlibcやkernelに入りそうだな

461:デフォルトの名無しさん
10/03/19 23:59:13
int 21Hで終わりでいいじゃん

462:デフォルトの名無しさん
10/03/20 00:06:12
char c[1234];
ってのは、使うときは putchar( c[3] ) みたいにして使います。 c[0] なら最初の文字、c[3]なら3番目の文字です。  

&c[3]  みたいに、頭に&マークをつけると、このデータがメモリのどこに書かれてるかがわかります。配列の先頭が、メモリのどこにあるかは &c[0] でわかります。

使うときにカッコを取って c って書くと、 &c[0] って書いたときと同じ数字がわかります。 この c そのものを c++ ってやって一個増やすと、
char型の配列なら、char一個分だけメモリをさしてる場所が増えます。 だから c++ とすると、つぎに使うときは c は &c[1] といういみになります。

int型の配列なら、int i[1234];

463:デフォルトの名無しさん
10/03/20 00:08:19
i++ で int の大きさ分だけ増えます。 

や〜めた

464:デフォルトの名無しさん
10/03/20 00:14:26
>462
またまたご冗談を

465:デフォルトの名無しさん
10/03/20 00:19:03
>>462
そんなコンパイラなんて…
あるかもしれないが規格無視じゃないか

466:デフォルトの名無しさん
10/03/20 00:27:03
>>462
その場合cは定数だからc++なんて出来ないだろアホ


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5399日前に更新/110 KB
担当:undef