トップページ⇒tech
1001コメント261KB

C言語なら、俺に聞け! <13>

■ このスレッドは過去ログ倉庫に格納されています
0001ハイソサエティーハッカー日下部陽一NGNG
おれは39才、22年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことならぜんてわかるから、疑問な点があったらオレに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

Cプログラマならこれを買っとけ。
・プログラミング言語C(K&Rと呼べば通だ)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/yfcbookshelf-22/250-3950205-1475419

K&Rで挫折するようなヤツはこれでも買え。
これでわからない、救いがたいヤツはあきらめろ。
・作ってわかるCプログラミング(アヒル本と呼べば通だ)
http://dennou.gihyo.co.jp/books/void_c/
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/qid%3D1005618315/250-3950205-1475419

・前スレ C言語なら、オレに聞け! <12>
http://pc.2ch.net/test/read.cgi/tech/1012348974/l50
0153デフォルトの名無しさんNGNG
>>152
必要性というか、間違っていないか判断したいだけです。
単に一つの変数に代入したくらいでは間違いませんが。
0154デフォルトの名無しさんNGNG
>>153
動的に確保した領域を指すポインターには特定の前置詞で始まる
名前をつけとけ。

終わり
0155デフォルトの名無しさんNGNG
>>154
ないんですね。わかりました。
0156デフォルトの名無しさんNGNG
>>152
機種依存の方法でよければ、アドレス見ればわかると思う。
0157デフォルトの名無しさんNGNG
>>156
そうなんですか?デバッグ中に使うだけなので機種依存でも大丈夫です。
Win+VC6.0pro,Linux+gccです。
0158デフォルトの名無しさんNGNG
そのばあいにしてもデバッガの仕事ではないのか?
0159デフォルトの名無しさんNGNG
>>158
仕事じゃないので・・・
0160デフォルトの名無しさんNGNG
>>159
・・・・・・・
もしかして「デバッガ」って人間のことだと思ってない?
0161デフォルトの名無しさんNGNG
「デバッガ」って人間も指すよね。
0162デフォルトの名無しさんNGNG
>>161
ポインタを調べるのに人間を呼ぶか?
0163159NGNG
>>160
すみません(笑)
ツールですね(笑)
0164デフォルトの名無しさんNGNG
C言語で作られたゲームで「これはすごい!」というのはありますか?
また、そういうのが見れるサイトを知ってたら紹介してください。
0165デフォルトの名無しさんNGNG
みんなは「char」をなんて呼んでるの?
自分は「チャー」って呼んでるんだけど。「int」は「イント」。
0166デフォルトの名無しさんNGNG
キャラ
0167デフォルトの名無しさんNGNG
>>164
FF7

>>165
ちゃー
他人に話すときはキャラクタ
0168デフォルトの名無しさんNGNG
キャラって呼び方あったんだ。そっちの方が良い感じ。
チャーだとなんだか格好がつかない気がしてたんだ。ありがと。
0169デフォルトの名無しさんNGNG
これは?
hoge
0170デフォルトの名無しさんNGNG
>>165
チャーに決まってんだろ。
竹中尚人
0171デフォルトの名無しさんNGNG
>>165
しーえいちえーあーる
0172デフォルトの名無しさんNGNG
>>165
しゃー
0173デフォルトの名無しさんNGNG
>172
ちゃんとカタカナでシャアって書けよ
0174デフォルトの名無しさんNGNG
>>173
いや


絶対いや
0175修行僧NGNG
スイマセン!C++ Builder に関するスレはないんですか?
0176初心者NGNG
大域的な構造体定義内の構造体定義の、他から使われる範囲は
ブロック内だけでしょうか、ファイル全体でしょうか。

struct _1{
int i;
struct _2{ //これとか
char *p;
};
};
0177デフォルトの名無しさんNGNG
>>144
きますよ。
0178176の初心者NGNG
すいません、言い方が悪かったですね。

struct STRCT{
struct STRCT_IN{
int i;
};
};
// としたとき
int main()
{
/* 関数の中でSTRCT_INを型としてオブジェクトを作る手段はあるのか?
またできたとしてもそれは許されるのか? */
return 0;
}

を聞きたかったのです、よろしくお願いします。
0179144NGNG
>150 >177 ありがと。
0180デフォルトの名無しさんNGNG
>>178
普通に
struct STRCT_IN obj;
で作れないか?

C++なら
STRCT::STRCT_IN obj;
とか。
0181デフォルトの名無しさんNGNG
double buffer;
scanf("%lf",&buffer); // <=ここで

セグメンテーションエラーが出てしまうんですけどどうしたらいいんでしょう
0182デフォルトの名無しさんNGNG
>>180さん、ありがとうございます。
普通にしたらできましたm(_ _)m
迷惑かけてすいません(;_;)
0183デフォルトの名無しさんNGNG
ファイル読み込みで、
1 2 3.....
1/2/3 4/5/6 7/8/9.........
最初から要素が何個あるか解からない時は、
fgets(line, 255, fp);
で一行読み込んでから、空白ごとに読み込んでいく
以外に方法はないんでしょうか?
最初から何要素在るか解かる関数など在るんでしょうか?
m(__)mm(__)mm(__)m
0184デフォルトの名無しさんNGNG
>>183
無い。
0185デフォルトの名無しさんNGNG
>>183
       √ ̄ ̄ ̄ ̄ ̄\
     / ̄          |
    /   / ̄ ̄ ̄ ̄ ̄\|
    |   /         |
    |  /  `      ´ |
    | /  _     _ |  初心者の文字が目に入らぬか!!
     (6      つ.   |
     |     ___     |
  _  |     /__/    |
⊃|房| |        ___/
つ  ̄ ⊂
⊃
0186デフォルトの名無しさんNGNG
>>185
ヲタクは氏ね
0187デフォルトの名無しさんNGNG
>>183
助けてください。
0188デフォルトの名無しさんNGNG
>>183
読まないで個数をどうやって数えるんでしょうか?
0189デフォルトの名無しさんNGNG
>>183
C言語には念写する機能はついていません。
0190デフォルトの名無しさんNGNG
>>183
解る関数が無ければ解る関数を作ればよい(藁
色々な面で処理効率は落ちるが、コーディングで難しいって点は無い筈。

補足。意外と使われてない気がするけど、こういう処理にはstrtokって関数が有る。
貴兄の求める仕様に合致するかは知らないけど、知識外なら一度調べてみては。

0191デフォルトの名無しさんNGNG
>>190
オーバーヘッドが多いような。

というか、FGETSしてるのならすぐに調べられるだろうが。
FGETSせずに調べるのは超能力が必要だし。
愚かな質問。
0192デフォルトの名無しさんNGNG
>>183
何を悩む必要があるのかまるでわからん。

「コードを書きたくない」と書いてるように見えるが。
0193デフォルトの名無しさんNGNG
データの頭に要素数突っ込んどけ
0194デフォルトの名無しさんNGNG
なぜにこんな質問ばかりなのかと小1時間問い詰めたい。
0195デフォルトの名無しさんNGNG
ファイルポインタで
while((c = fgetc(fp)) != EOF) fputc(c,wp);
のようにして最後まで読んでしまって
また一から読みたい場合はどうすればよいのですか?
lseek()を使うのでしょうか。
0196デフォルトの名無しさんNGNG
>>195
普通に開きなおしたら?
0197デフォルトの名無しさんNGNG
>>183
fgetcで1文字ずつ読んでった方が楽なケースというのも世の中にはある。
0198デフォルトの名無しさんNGNG
>>195
OSの再インストールが必要になります
0199デフォルトの名無しさんNGNG
>>195 それでいいと思う。確実にしたいなら閉じてからまた開く。
0200デフォルトの名無しさんNGNG
>195
fgetc, fputc ときたら fseek だろ。もしくはrewind。
0201200NGNG
やあ。
今日もGETかな( ´ー`)y-~
0202デフォルトの名無しさんNGNG
>>201
ぷ
0203195NGNG
みなさん、ありがとうございます。
開き直しかfseekかrewindやってみます。
0204デフォルトの名無しさんNGNG
>>203
知ってることで出来ることを無理に知らないことでやろうとしないこと。
0205デフォルトの名無しさんNGNG
const int foo[3]={1, 2, 3};
と
int const foo[3]={1, 2, 3};

はどう違うんですか?
0206デフォルトの名無しさんNGNG
>>205
とりあえずお約束だが「プログラミング言語C」は読んだか?
0207デフォルトの名無しさんNGNG
>>205
初心者なら気にしなくても大丈夫な気も・・
0208デフォルトの名無しさんNGNG
>>205 intとconstの位置が違うだけです
>>207 いーかげんなこといわないように
0209デフォルトの名無しさんNGNG
関数の定義で
function(i1, i2){
unsigned char i1[size1][size2];
unsigned char i2[size1][size2];
{
・・・
}
なら大丈夫なのに
function(i1, i2, x, y){
unsigned char i1[size1][size2];
unsigned char i2[size1][size2];
int x,y;
{
・・・
}
ではダメなのはどうしてなんでしょう?
0210デフォルトの名無しさんNGNG
古いスタイルだな...
0211デフォルトの名無しさんNGNG
constを先に書いたほうが読み良いな。
0212デフォルトの名無しさんNGNG
>>209
どんなエラーが出るかを書け。
0213デフォルトの名無しさんNGNG
>>211
int *const p;

とかも考えると、修飾子は右に書く方が、統一はとれてるんだけどね。

でも、

 int const *p;
 const int *p;

だと、後者の方が良く見かける気がする。
0214デフォルトの名無しさんNGNG
>>213
あうあう、そうか。
C言語でややこしい宣言をする時には
(ポインタのポインタの関数のポインタの・・みたいな)
「段階的宣言」をして明確にする口なので気がつかず。

constの方が「重要な情報」であることは確実だとおもうのと
constが色々な方にまたがって複数ある時にはconstを
先に出して連ねた方が見やすい。

・・と思ってるんですけど、正しい?
0215デフォルトの名無しさんNGNG
大体ポインタの「*」表記がいかん。
一見便利だが、複雑になると死にそうになる。

長いけど例えば
AddressOf
みたいな感じだったら混乱しなかったはず。

p : AddressOf Const Integer;
p : Constant AddressOf Integer;

pf AddressOf Array AddressOf func();

例えばこんな感じで
0216デフォルトの名無しさんNGNG
>>208
>>>205 intとconstの位置が違うだけです

そうなのですか。どうもありがとうございます。

constって不思議ですね。

#include <stdio.h>

main(int ac, char **av)
{
const int a=1;
const int b=2;
const int *p = &a;

printf("%d\n", *p);

p = &b;
printf("%d\n", *p);

*p = 3;
printf("%d\n", *p);
}

*p=3でWarning出ますが、実行すると書きかえれちゃう(gccです)
こんなものなのでしょか。
0217デフォルトの名無しさんNGNG
>>215
なんか Pascal っぽいね。
0218デフォルトの名無しさんNGNG
>>216
ROMに焼くようなプログラム作るときには、重宝するかも。
漏れあんまりconstってかいたことない。
0219デフォルトの名無しさんNGNG
>>218
テーブルとかconstで宣言しとかないと心配じゃ無い?
0220218NGNG
>>219
お〜なるへそ。
そうかも。
0221 NGNG
>>215
“*”じゃなくて“〒”はどう?
0222デフォルトの名無しさんNGNG
>>216
C 言語で「警告」が出たら、他の言語だと「致命的エラー」に相当すると思って
おいた方がいい。特にキャストやポインタがらみの場合。
0223デフォルトの名無しさんNGNG
bakaがたくさんいる
0224デフォルトの名無しさんNGNG
>>223
bakaですが何か?
0225デフォルトの名無しさんNGNG
>>223
ですが何か?
0226デフォルトの名無しさんNGNG
>>223
たくさんいますが、何か?
0227あNGNG
C言語を勉強して、ポインタで挫折するという典型的なパターンをふんだものです。
学校では「コンソールアプリケーション」とかいうので、DOSプロンプトで実行するやつしか
作ったことがないのですが、VBみたいにボタンとかテキストボックスとかをCでも作れるのですか?
0228デフォルトの名無しさんNGNG
>>227
C++Builderっ、買え!
0229183NGNG
大変遅くなり申し訳ありません。
お答え下さいました皆様方、真に
ありがとうございました。

>193
要素数とゆうか、Lineが数千行在るんでなんとも・・・・。
今のところ、中身が解かるので、

for(hoge=0 ; !feof(fp);)
{
fgets(line, 255, fp);
sscanf(line, "%s", ky);

if(!strcmp(ky, "文字"))
{
sscanf(line, "%*s %lf %lf %lf",
&hoge[v][0],
&hoge[v][1],
&hoge[v][2]);
v++;
}
.
.
.
の様にしているので、改良してみます。
0230229NGNG
訂正
for(v=0 ; !feof(fp);)
{
fgets(line, 255, fp);
sscanf(line, "%s", ky);

if(!strcmp(ky, "文字"))
{
sscanf(line, "%*s %lf %lf %lf",
&hoge[v][0],
&hoge[v][1],
&hoge[v][2]);
v++;
}

0231デフォルトの名無しさんNGNG
>>230
いまいち何を悩んでるんだかつかめないんだけど、

1.各行の要素数がまちまちなので、最大の要素数を知らないと配列確保できねーじゃねーかゴルァ
2.1行が長すぎて、fgets()で読み切れない時があるんじゃゴルァ
3.sscanf()しか知らんから、要素数可変でスペースで区切られてる文字列をパースできねーんじゃゴルァ

のどれなのよ?
0232デフォルトの名無しさんNGNG
お前ら、ポインタのポインタって何か教えてください。
0233デフォルトの名無しさんNGNG
>>232
http://pc.2ch.net/test/read.cgi/tech/1012348974/n208
でもどうぞ。この場合はポインタの配列だけど、応用でわかるかな?
チミのお脳にかかっている!
0234232NGNG
早いレスさんくす!!!!!!!!!!!!!!!!!!!こ。
0235デフォルトの名無しさんNGNG
>>232
int i = 9999,*p = &i,**pp = &p;
printf("%d",**pp);
---結果---
9999

つまり
int i = 9999
はこういうこと

 0x0001番地 ←アドレス(例)
 | ̄ ̄ ̄ ̄|
 | 9999  | ←変数i(中身はデータ)
 |____|

次の
*p = &i
は

 0x000A番地 ←変数iとは必ず異なるpのアドレス
 | ̄ ̄ ̄ ̄ ̄|
 | 0x0001  | ←ポインタ変数p(中身は変数iのアドレス)
 |_____| 

ほんで
**pp = &p;
でポインタ変数pのアドレスを代入

 0x000FF番地 ←ppのアドレス
 | ̄ ̄ ̄ ̄ ̄|
 | 0x000A  | ←ポインタを指すポインタ変数pp(中身はポインタpのアドレス)
 |_____| 

最後の
printf("%d",**pp);
は単項の*演算子で指すものを取り出している。
単項の結合規則は右から左なので
*(*pp)
こういうことだから

 pp           p          i
 ↓          ↓          ↓
| ̄ ̄|        | ̄ ̄|        | ̄ ̄|
|__}→(*参照)→|__|→(*参照)→|__}

こうなって見事に繋がりを参照することによってiが取り出されて
printf()関数に9999を渡し、表示されるわけ。
0236235NGNG
遅かったしなんか違うかな(´-`)??
まあ暇だからいいや。
0237229NGNG
>>231
1ぽいです。
何か良い方法があったらと思いまして。
2はstd::getline()で・・・。
3の意味が良くわかりませんスマソ。
0238231NGNG
>>237
なんか長くなっちゃった・・・鬱

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

#define LINE_BUF_GROW_STEP 8
#define MAX_LINE 10240

char **hoge[MAX_LINE];

main() {
  char *line,*line_tmp;
  char *word;
  char **line_element_ptr;
  int lines = 0;
  int chars;
  int count;
  int line_buf_len = 2; /* 最低でも 2 は必要(man fgets) */
  int i,j;

  /* 行バッファ確保 */
  line = (char *)malloc(line_buf_len);
  line_tmp = (char *)malloc(line_buf_len);
  if (!line || !line_tmp) {
    puts("メモリ買えや・・・");
    exit(1);
  }

  /* 読み込むよぅ */
  while(fgets(line,line_buf_len,stdin)) {
    /* 継続読み込み */
    while(line[strlen(line)-1] != '\n' && !feof(stdin)) {
      /* 行バッファ伸ばす */
      line_buf_len += LINE_BUF_GROW_STEP;
      line = (char *)realloc(line,line_buf_len);
      line_tmp = (char *)realloc(line_tmp,line_buf_len);
      
      if (!line || !line_tmp) {
        puts("メモリねぇんだゴルァ・・・");
        exit(1);
      }

      /* 続きを読み込む */
      fgets(line+(line_buf_len - LINE_BUF_GROW_STEP -1),
         LINE_BUF_GROW_STEP+1,stdin);
    }

0239238のつづきNGNG
    /* 改行コード削除 */
    if (line[strlen(line)-1] == '\n') line[strlen(line)-1] = '\0';

    /* strtok は引数で渡した文字列破壊するので、コピーしる */
    strcpy(line_tmp,line);

    /* 単語数カウント */
    count=0;
    for(word = strtok(line_tmp," \t"); word; word = strtok(NULL," \t")) {
      count++;
    }

    /* 単語数分のポインタ領域確保 */
    line_element_ptr = hoge[lines] = (char **)malloc( (count+1) * sizeof(ch\
ar*) );
    if (!line_element_ptr) {
      puts("メモリねーよ");
      exit(1);
    }

    /* 単語を複製し、そのアドレスをさっき確保した領域に入れてく */
    for(word = strtok(line," \t"); word; word = strtok(NULL," \t")) {
      *line_element_ptr++ = strdup(word);
    }
    *line_element_ptr = NULL;

    lines++;
  }

  /* 行バッファ開放 */
  free(line);
  free(line_tmp);

  /* ついでに表示するよぅ(ついでにメモリ開放しる) */
  for(i=0; i<lines; i++) {
    for(j=0;hoge[i][j];j++) {
      printf("[%s]",hoge[i][j]);
      if (hoge[i][j+1]) printf(",");
      free(hoge[i][j]);
    }
    free(hoge[i]);
    puts("");
  }
}
0240239NGNG
>>237
あーーー途中行末が\で切れてるとこは、次の行とひっつけてくれー
・・・さらに鬱
0241デフォルトの名無しさんNGNG
puts("メモリねーよ");
↓
fprintf(stderr,"殿!メモリがたりませぬ!\n");
0242デフォルトの名無しさんNGNG
>>238
>>239

なんか結構つっこめちゃんですが?
0243デフォルトの名無しさんNGNG
なんかある度に鬱鬱言うなよ。
お前の気分なんてどうでもいい。
大体お前だって本当は鬱でもないんだろ。
0244デフォルトの名無しさんNGNG
>>242
つっこむ以前に汚すぎて読む気もおきねーよ
0245デフォルトの名無しさんNGNG
そんなに鬱ならメンヘル板逝け
0246デフォルトの名無しさんNGNG
画像などの大きなデータを交換する方法としては、
どれが適してるのでしょうか?
本来なら私自身が全方法をテストして調査するべきなのでしょうが、
みなさんのご意見を聞かせていただけると有り難いです。
0247デフォルトの名無しさんNGNG
>>244
「ダメなコメントのつけかた」のサンプルじゃないのか?
0248デフォルトの名無しさんNGNG
>>246
DVD-RAM

(その質問だと、前提が正しく示されてないから、こういう大ボケな答えが返って
きても文句言えんと思う)
0249デフォルトの名無しさんNGNG
>>248
無駄レスすんな

>>244
同意
0250ィNGNG
このプログラムの解説をしてもらえませんか?
ハノイの塔っていうプログラムです。


#include<stdio.h>

hanoi(char src,char dst,char tmp,int n)
{
if(n > 1)
    {
hanoi(src,tmp,dst,n-1);
hanoi(src,dst,tmp,1);
hanoi(tmp,dst,src,n-1);
    }
else
{
printf("move from %c to %c\n",src,dst);
}
}
main()
{
int n;
printf("何個?   ");
scanf("%d",&n);
hanoi('A','B','C',n);
}
0251デフォルトの名無しさんNGNG
>>250
実に読んだままです。
0252デフォルトの名無しさんNGNG
・・・まさか貴様、
ハノイの塔の説明でも聞きに来たんじゃないだろうな?
■ このスレッドは過去ログ倉庫に格納されています