ページ 11

無題

Posted: 2009年5月23日(土) 17:13
by 初心者
 初心者です
異なる2つのソースファイルで配列の共有はできるものなのですか?

いろいろやってみてはいるのですが・・・

戻り値を配列のポインタにしてもうまくいきませんでした。

よろしくお願いします。
すいますん、初心者の質問です

Re:無題

Posted: 2009年5月23日(土) 17:28
by box
その、「いろいろやってみたがうまくいかなかった」ソースコードを
提示してみる、というお考えはありますか?

Re:無題

Posted: 2009年5月23日(土) 17:42
by tieria
すいません
あまりに拙いコードなんで、勇気が要ります。

/* mainsource.c */
int main(void)
{
char* array_pointa_rec = f_scan();
printf("%s\n", array);
return 0;
}

/* subsource.c */
char* f_scan(void)
{
char array[31];
char* array_pointa;

/*
ここで"HelloWorld"と入力
*/

scanf ("%s\n", &array[0]);
printf ("%s\n", array);

array_pointa = &array[0];
return array_pointa;
}

すいません、よろしくお願いします

Re:無題

Posted: 2009年5月23日(土) 17:51
by tieria
すいません。#include<stdio.h>が両方のファイルに抜けていました
ヘッダファイルもです
/* f_scan.h */

#ifndef _INCLUDE_F_SCAN_
#define _INCLUDE_F_SCAN_
extern char* f_scan(void);
#endif

ここに変数を共有しようとして

extern char array[31];
としても、未解決のシンボル・・・ 
定義されていません
などとでます
どうすればいいのか途方にくれてしまって・・・

もちろん1つのファイルであればいいと思いますが、
あえて呼び出して使いたいのです

よろしくお願いします

Re:無題

Posted: 2009年5月23日(土) 17:54
by box
ソースコードを貼り付けるときは、
HTMLの<pre>タグと</pre>タグで囲んでください。<と、>は、半角です。

一度原点に立ち返って、お手持ちのソースファイルの正確な内容を載せていただけますか?

Re:無題

Posted: 2009年5月23日(土) 18:27
by tieria
すいません、そのままコピペしました
/* test.c */

#include <stdio.h>
#include "f_scan.h"

int main(void)
{
	
	char array[31]
	char *array_pointa_rec;
	array_pointa_rec = f_scan();
	
	printf("%s\n", array);
	return 0;
	
	/*
	f_scan();
	return 0;
	*/
}


/* f_scan.c */

#include <stdio.h>

char* f_scan(void)
{
	char array[31];
	char* array_pointa;
	
	/*
	ここで"HellWorld"と入力
	*/
	
	scanf("%s", &array[0]);
	printf("%s\n", array);
	
	array_pointa = &array[0];
	return array_pointa;
}

/* f_scan.h */
#ifndef _INCLUDE_F_SCAN_
#define _INCLUDE_F_SCAN_
extern char* f_scan(void);
#endif
main()内で、コードを/**/に変えると、きちんと実行されます
したがって、f_scan()には問題がないと考えています。
問題は、f_scan()内で作られた配列をmain()内で使えない・・・・
いいえ、問題がわからないから質問していました。
一度どっかのページで、

return "HelloWorld";

で文字列を返していて、解説に実は文字列のポインタを返している旨があったので
ポインタを返せば f_scan()が終了しても、配列もそのまま残って main()で使えるのでは・・
と思ったりして いろいろやってみました。

よろしくお願いします

Re:無題

Posted: 2009年5月23日(土) 18:31
by tieria
エラーメッセージも提示しておきます

■C:\Users\user\Documents\C> bcc32 -etest test.c f_scan.c test.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.c:
エラー E2141 test.c 10: 宣言の構文エラー(関数 main )
エラー E2451 test.c 11: 未定義のシンボル array_pointa_rec(関数 main )
*** 2 errors in Compile ***
f_scan.c:
test.c:
エラー E2141 test.c 10: 宣言の構文エラー(関数 main )
エラー E2451 test.c 11: 未定義のシンボル array_pointa_rec(関数 main )
*** 2 errors in Compile ***

なぜ、未定義なのか? ちゃんと宣言してると思うのですが・・・

Re:無題

Posted: 2009年5月23日(土) 18:54
by box
こういうことがしたいのでしょうか?それとも別のことですか?
なお、当該のコンパイルエラーは、

>	char array[31]

最後にセミコロンがないためです。


/* test.c */
#include <stdio.h>

char array[31];

int main(void)
{
    f_scan();
    printf("main: %s\n", array);
    return 0;
}


/* f_scan.c */
#include <stdio.h>

extern char array[/url];

void f_scan(void)
{
    scanf("%s", array);
    printf("f_scan: %s\n", array);
}

Re:無題

Posted: 2009年5月23日(土) 18:59
by box
それとも、こういうことでしょうか?

/* test.c */
#include <stdio.h>

int main(void)
{
    printf("main: %s\n", f_scan());
    return 0;
}


/* f_scan.c */
#include <stdio.h>

char *f_scan(void)
{
    static char array[31];

    scanf("%s", array);
    printf("f_scan: %s\n", array);
    return array;
}

Re:無題

Posted: 2009年5月23日(土) 19:05
by tieria
いや~
セミコロンがない・・・

ありがとうございます。

今日の昼からいろいろいじって、もうだめだと思って質問しました。

ここはなんかレベルが高そうだったので何度もためらいましたが、
質問してよかったです。

boxさん、本当にありがとうございます

Re:無題

Posted: 2009年5月23日(土) 19:20
by tieria
どちらかというと、下のほうです
下は main()内で変数を宣言していませんので。

なにはともあれ、ありがとうございました!