掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26785

変数
投稿者---file(2006/05/08 12:29:21)


main関数以外にプロトタイプ宣言をして関数を自ら作るとき、3つ4つあるプロトタイプの中で同じ変数、もしくは一度行った結果をつずけて使うにはどのようにしたら良いですか?
グローバル変数以外に方法はありますか?

OS;Windows XP、cygwin


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:変数 26786 YuO 2006/05/08 12:35:51


No.26786

Re:変数
投稿者---YuO(2006/05/08 12:35:51)


>main関数以外にプロトタイプ宣言をして関数を自ら作るとき、3つ4つあるプロトタイプの中で同じ変数、もしくは一度行った結果をつずけて使うにはどのようにしたら良いですか?
>グローバル変数以外に方法はありますか?

プロトタイプの中で同じ変数を使うことはできません。

ある関数の結果を使いたいというのであれば,
・戻り値で返す
・ポインタを渡して,その指す先のオブジェクトに結果を返す
あたりが使えるかと。
# グローバル変数は使うべきではないです。



この投稿にコメントする

削除パスワード

No.26787

Re:変数
投稿者---file(2006/05/08 15:59:54)


>>main関数以外にプロトタイプ宣言をして関数を自ら作るとき、3つ4つあるプロトタイプの中で同じ変数、もしくは一度行った結果をつずけて使うにはどのようにしたら良いですか?
>>グローバル変数以外に方法はありますか?
>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void disp(char *a[299]);
int get(char *a[299]);

int i=0;

int main(void)
{
  int j;
  char *a[299];

  get(&a[299]);
 
  disp(&a[299]);
  for(j=0; j<=i; j++){
    free(a[i]);
  }
  return 0;
}



int get(char *a[299])
{
  FILE *fp;
  char filename[80];
  char p[256];

  printf("input filename");
  gets(filename);
  printf("\n");

  fp = fopen(filename, "r");

  while(!feof(fp)){
    fgets(p,256,fp);
    a[i]=malloc(sizeof(char)*(strlen(p)+1));
    strcpy(a[i], p);
    i++;
      }
  return 0;
}

void disp(char *a[299])
{
  int j;
  printf("%d\n",i);
  for(j=0; j<i; j++){
    printf("%s",a[i-j-1]);
  }
}



でint i=0
としていますが、これをなくす(グローバルを用いない)にはどう変えたらよいか教えてください・・・




この投稿にコメントする

削除パスワード

No.26788

Re:変数
投稿者---Blue(2006/05/08 16:11:28)


>としていますが、これをなくす(グローバルを用いない)にはどう変えたらよいか教えてください・・・

YuOさんから、
> ・ポインタを渡して,その指す先のオブジェクトに結果を返す
というヒントがあるのですが、読まれていないのでしょうか?

サンプル)

#include <stdio.h>

void test1( int m )
{
    m = 10;
}

void test2( int* m )
{
    *m = 20;
}


int main( void )
{
    int n = 0;
    
    test1( n );
    printf( "test1関数実行後:%d\n", n );
    
    test2( &n );
    printf( "test2関数実行後:%d\n", n );
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.26789

Re:変数
投稿者---file(2006/05/08 16:23:39)


>> ・ポインタを渡して,その指す先のオブジェクトに結果を返す
>というヒントがあるのですが、読まれていないのでしょうか?

読んだんですがちょっと理解できなかったので・・・
できればわかり易く教えていただけると助かります。
お願いします



この投稿にコメントする

削除パスワード

No.26790

Re:変数
投稿者---Blue(2006/05/08 16:29:57)


>読んだんですがちょっと理解できなかったので・・・
>できればわかり易く教えていただけると助かります。
>お願いします
わかりやすいようにサンプルコードを載せたんですが、実行すらしてくれていないのでしょうか?

実行してみれば、どうしてこうなるのか、どこに違いがあるかわかると思うのですが。
(私は、答えのコードを書くつもりはありません。)

というか、ここのサイトにそのものの解説があります。
http://www9.plala.or.jp/sgwr-t/c/sec11-2.html




この投稿にコメントする

削除パスワード

No.26794

Re:変数
投稿者---かずま(2006/05/08 21:12:47)


> でint i=0
> としていますが、これをなくす(グローバルを用いない)には
> どう変えたらよいか教えてください・・・
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 299

int  get(char **a, int n);
void disp(char **a, int n);
void release(char **a, int n);

int main(void)
{
    char *a[N];
    int n = get(a, N);
    disp(a, n);
    release(a, n);
    return 0;
}

int get(char **a, int n)
{
    FILE *fp;
    char filename[256];
    char buf[256];
    int i;

    printf("input filename: ");
    gets(filename);
    fp = fopen(filename, "r");
    if (!fp) return 0;

    for (i = 0; i < n && fgets(buf, sizeof buf, fp); i++) {
        a[i] = malloc(strlen(buf) + 1);
        strcpy(a[i], buf);
    }
    fclose(fp);
    return i;
}

void disp(char **a, int n)
{
    int i;
    printf("%d\n", n);
    for (i = 0; i < n; i++)
         fputs(a[n-i-1], stdout);
}

void release(char **a, int n)
{
    int i;
    for (i = 0; i < n; i++)
        free(a[i]);
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧