電子書籍の厳選無料作品が豊富!

構造体を宣言と共に初期化する方法はないのでしょうか?

もしないのでしたら初期化用の関数を作ってそれを呼び出すしかないのでしょうか?

↓このような感じで

---kudamono.cppの内容 ---

#include <stdio.h>

struct{
static const char *name[5];
static const char *num[5];
}kudamono;

void kuda(void){

kudamono.name[0] = "りんご";
kudamono.name[1] = "みかん";
kudamono.name[2] = "オレンジ";
kudamono.name[3] = "もも";
kudamono.name[4] = "キウイ";

kudamon.num[0] = "1個";
kudamon.num[1] = "3個";
kudamon.num[2] = "5個";
kudamon.num[3] = "2個";
kudamon.num[4] = "4個";

}

--- main.cppの内容 ---

#include <stdio.h>

void kuda( void );

void main( void ){

printf( "%sが%sある" , kudamono.name[0] , kudamon.num[0] );

}

A 回答 (16件中11~16件)

>おかしいですね私の環境ではコンパイルエラーになっていないみたいですが



おかしいのは、あなたが質問文・お礼・補足に書かれているソースです。
抜粋のつもりなのかもしれませんが質問内容と無関係のとこまでおかしいので抜粋になってません。

この回答への補足

ソースを間違えていて申し訳ありません。

補足日時:2013/03/29 00:39
    • good
    • 0
この回答へのお礼

もしかして構造体をポインタにいれてファイルを2つに分けて表記する場合、宣言と共に初期化しても意味がなかったりしますか?

お礼日時:2013/03/29 02:02

>おかしいですね私の環境ではコンパイルエラーになっていないみたいですが


>私の開発環境は現在 windows xp Visual C++ 2008なのですが環境によって左右するとか起こりますか?

WinXP(SP3)とVC++2008EE(SP1)で質問にあるソースを。
# kudamonをkudamonoに修正してます。
[ファイル][新規作成][プロジェクト]で「Win32 コンソールアプリケーション」を選択。
「空のプロジェクト」として、ソリューションエクスプローラの「ソース ファイル」で右クリック、
[追加][新しい項目]でソースを2つ追加して保存します。
で、ビルドを実行。

1>------ すべてのリビルド開始: プロジェクト: qa8015313, 構成: Debug Win32 ------
1>プロジェクト 'qa8015313'、構成 'Debug|Win32' の中間出力ファイルを削除しています。
1>コンパイルしています...
1>kudamono.cpp
1>main.cpp
1>d:\documents and settings\XXXX\my documents\visual studio 2008\projects\qa8015313\qa8015313\main.cpp(7) : error C2065: 'kudamono' : 定義されていない識別子です。
1>d:\documents and settings\XXXX\my documents\visual studio 2008\projects\qa8015313\qa8015313\main.cpp(7) : error C2228: '.name' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>d:\documents and settings\XXXX\my documents\visual studio 2008\projects\qa8015313\qa8015313\main.cpp(7) : error C2065: 'kudamono' : 定義されていない識別子です。
1>d:\documents and settings\XXXX\my documents\visual studio 2008\projects\qa8015313\qa8015313\main.cpp(7) : error C2228: '.num' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>コードを生成中...
1>ビルドログは "file://d:\Documents and Settings\XXXX\My Documents\Visual Studio 2008\Projects\qa8015313\qa8015313\Debug\BuildLog.htm" に保存されました。
1>qa8015313 - エラー 4、警告 0
========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========

となりました。

この回答への補足

ファイルをひとつの場合はエラーはでません。

#include <stdio.h>

static struct{
const char *name;
int num;
} kudamono[5] = {
{"りんご", 1},
{"みかん", 3},
{"オレンジ", 5},
{"もも", 2},
{"キウイ", 4}
};

void main( void ){

printf( "%sが%dある\n" , kudamono[0].name , kudamono[0].num );

}

しかし、ファイルを2つに分ける時がうまくいっていません。

前回の最後のソースを書き忘れがあったみたいですね

--- main.cpp の内容 ---

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

void main( void ){

betu(&a); //書き忘れ部分

printf( "%d" , a );

}

--- betu.h の内容 ---

static int a;

void betu( int *a );

--- betu.cpp の内容---

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

void betu( int *a ){

*a = 5;

}

ソースを間違えていて申し訳ありません。

補足日時:2013/03/29 00:38
    • good
    • 0

>このような感じになりましたが問題ありますか?



「初期化」としては問題ないかと。
ちなみにkuda()内でやっているのは初期化ではなく代入です。
「C言語 初期化 代入」あたりで検索してみるとよいかと。
# まあ、kuda()内の用に最初の代入を初期化と言ったりするコトもあったりはしますけどね。


>この部分は構造体をポインタにする方法がわからなかったものでかけませんでした

前回( http://oshiete.goo.ne.jp/qa/7992723.html )のとこでの理解がいまいちな状態で閉じられてしまいましたからねぇ……。
ポンイタとか関係ないかと。

それとは別に、「main.cppにとってkudamonoやkudamonが不明な状態」は代わりありません。
宣言もなにもされていないのですからコンパイルエラーになっているはずですが…。
で、kudamonoやkudamonは「kudamono.cppにあるグローバル変数」なのですから、kuda()で値を代入するのに呼び出し元からアドレスを渡す必要はありません。
main.cppにとってはそんなの関係ないコトです。

この回答への補足

<<ちなみにkuda()内でやっているのは初期化ではなく代入です。
そう言えばそうですね

どうも初期化と初期値を代入することを言い分けていませんね。
わかりずらい言い方をしてすみませんでした。

<<前回( http://oshiete.goo.ne.jp/qa/7992723.html )のとこでの理解がいまいちな状態で閉じられてしまいましたからねぇ……。
ポンイタとか関係ないかと。

え、あれからポインタを渡して値を受け渡ししてるのですが関係ないのですか?
ただ、ポインタを渡しまくった結果、10個以上ポインタを渡してる状態でして非常に見辛くなって困ってはいますけどね。
さらに増えるみたいなのでややこしいなとは思えていましたが

<<それとは別に、「main.cppにとってkudamonoやkudamonが不明な状態」は代わりありません。
宣言もなにもされていないのですからコンパイルエラーになっているはずですが…。

おかしいですね私の環境ではコンパイルエラーになっていないみたいですが

<<で、kudamonoやkudamonは「kudamono.cppにあるグローバル変数」なのですから、kuda()で値を代入するのに呼び出し元からアドレスを渡す必要はありません。

それをすると逆に不明な状態になりませんか?

私の開発環境は現在 windows xp Visual C++ 2008なのですが環境によって左右するとか起こりますか?

補足日時:2013/03/28 14:39
    • good
    • 0
この回答へのお礼

あれ、もしかしてこう書けばいいってことですか?

---kudamono.cppの内容 ---

#include <stdio.h>

void kuda(void){

static struct{
 const char *name;
 int num;
} kudamono [5] = {
 {"りんご", 1},
 {"みかん", 3},
 {"オレンジ", 5},
 {"もも", 2},
 {"キウイ", 4}
};

}

--- main.cppの内容 ---

#include <stdio.h>

void main( void ){

kuda();
printf( "%sが%sある" , kudamono.name[0] , kudamono.num[0] );

}

お礼日時:2013/03/28 14:59

「構造体をポインタにする」ってのが分からんなぁ. 「アドレスがほしい」ってこと?

この回答への補足

ええっと、以前の話では別のファイルの値をポインタを渡すことによって共有化する方法について教わったのです。

そのため今回も構造体自体をポインタで渡して別のファイルの値を取得することが望ましいと思うのですが、ポインタに渡す方法がわかっていなかったってことですね

補足日時:2013/03/28 14:18
    • good
    • 0
この回答へのお礼

NO6からの続きです。

宣言と共に初期値を入れることをやめた場合何とかファイルを2つに分けてもできるようになりました

--- main.cpp の内容 ---

#include <stdio.h>

struct kudamono{
char *name;
int num;
};

void syoki( struct kudamono *deta ,int i );

int main(void) {

int i;
struct kudamono deta[5];

for(i=0;i<5;i++){
syoki(&deta[i],i);
}

for(i=0;i<5;i++){
printf( "%sが%d個ある\n", deta[i].name , deta[i].num );
}

return 0;
}

--- kudamono.cpp の内容 ---

#include <stdio.h>

struct kudamono{
char *name;
int num;
};

void syoki( struct kudamono *deta ,int i ) {

switch( i ) {
case 0:
deta->name ="りんご";
deta->num = 1;
break;

case 1:
deta->name ="みかん";
deta->num = 3;
break;

case 2:
deta->name ="オレンジ";
deta->num = 5;
break;

case 3:
deta->name ="もも";
deta->num = 2;
break;

case 4:
deta->name ="キウイ";
deta->num = 4;
break;

}

}

改良しないといけないためもう少し粘ってみます

お礼日時:2013/03/29 03:38

>メンバにstatic int型 の配列を加えようとするとうまくいきませんでした



具体的にどう書いて、どううまくいきませんでしたか?
# ってのを書かないと、無駄なやりとりとか増えるんですけどね…。

static const struct{
 char name[9];
 int num;
} kudamono [ ] = {
 {"りんご", 1},
 {"みかん", 3},
 {"オレンジ", 5},
 {"もも", 2},
 {"キウイ", 4}
};
とかでしょうか?

あと…質問に掲示した例ではコンパイルエラーになるかと。
main.cppにとってはkudamonoやkudamonがなにものなのか不明ですし、
kudamono.cppにとってもkudamonがなにものか不明です。
# kudamonoとkudamonは、コピペ時のミスでしょうけどね。
# main()からkuda()も呼ばれていません(前に指摘されたはずですが)し…。

この回答への補足

すみませんあれからいろいろ試行錯誤してできるようになりました

static struct{
 const char *name;
 int num;
} kudamono [5] = {
 {"りんご", 1},
 {"みかん", 3},
 {"オレンジ", 5},
 {"もも", 2},
 {"キウイ", 4}
};

このような感じになりましたが問題ありますか?

補足日時:2013/03/28 10:39
    • good
    • 0
この回答へのお礼

<<# main()からkuda()も呼ばれていません(前に指摘されたはずですが)し…。

すみません
この部分は構造体をポインタにする方法がわからなかったものでかけませんでした

お礼日時:2013/03/28 10:42

色々と勘違いされているようですが、こんな感じでどうでしょうか?



static const struct{
char name[9];
char num[5];
} kudamono [ ] = {
{"りんご", "1個"},
{"みかん", "3個"},
{"オレンジ", "5個"},
{"もも", "2個"},
{"キウイ", "4個"}
} ;

この回答への補足

ええっとその場合、配列じゃないものが構造体のメンバーにもある場合はどのように書くのでしょうか?

} kudamono [ ] = {
から下の書き方ですね

(作っているプログラム上では、そんなことはありえないのですけどね)


}kudamono [ ] = {

この部分は要素数を指定してもいいのですよね?

}kudamono [9] = {

このような感じで

補足日時:2013/03/28 09:38
    • good
    • 0
この回答へのお礼

メンバが static const char 型のみなら

static const struct{
char name[9];
char num[5];
} kudamono [ ] = {
{"りんご", "1個"},
{"みかん", "3個"},
{"オレンジ", "5個"},
{"もも", "2個"},
{"キウイ", "4個"}
} ;

の教えていただいた方法で書けるみたいですが

メンバにstatic int型 の配列を加えようとするとうまくいきませんでした

お礼日時:2013/03/28 10:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!