構造体を宣言と共に初期化する方法はないのでしょうか?
もしないのでしたら初期化用の関数を作ってそれを呼び出すしかないのでしょうか?
↓このような感じで
---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件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
>おかしいですね私の環境ではコンパイルエラーになっていないみたいですが
>私の開発環境は現在 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;
}
ソースを間違えていて申し訳ありません。
No.4
- 回答日時:
>このような感じになりましたが問題ありますか?
「初期化」としては問題ないかと。
ちなみに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なのですが環境によって左右するとか起こりますか?
あれ、もしかしてこう書けばいいってことですか?
---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] );
}
No.3
- 回答日時:
「構造体をポインタにする」ってのが分からんなぁ. 「アドレスがほしい」ってこと?
この回答への補足
ええっと、以前の話では別のファイルの値をポインタを渡すことによって共有化する方法について教わったのです。
そのため今回も構造体自体をポインタで渡して別のファイルの値を取得することが望ましいと思うのですが、ポインタに渡す方法がわかっていなかったってことですね
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;
}
}
改良しないといけないためもう少し粘ってみます
No.2
- 回答日時:
>メンバに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}
};
このような感じになりましたが問題ありますか?
<<# main()からkuda()も呼ばれていません(前に指摘されたはずですが)し…。
すみません
この部分は構造体をポインタにする方法がわからなかったものでかけませんでした
No.1
- 回答日時:
色々と勘違いされているようですが、こんな感じでどうでしょうか?
static const struct{
char name[9];
char num[5];
} kudamono [ ] = {
{"りんご", "1個"},
{"みかん", "3個"},
{"オレンジ", "5個"},
{"もも", "2個"},
{"キウイ", "4個"}
} ;
この回答への補足
ええっとその場合、配列じゃないものが構造体のメンバーにもある場合はどのように書くのでしょうか?
} kudamono [ ] = {
から下の書き方ですね
(作っているプログラム上では、そんなことはありえないのですけどね)
}kudamono [ ] = {
この部分は要素数を指定してもいいのですよね?
}kudamono [9] = {
このような感じで
メンバが static const char 型のみなら
static const struct{
char name[9];
char num[5];
} kudamono [ ] = {
{"りんご", "1個"},
{"みかん", "3個"},
{"オレンジ", "5個"},
{"もも", "2個"},
{"キウイ", "4個"}
} ;
の教えていただいた方法で書けるみたいですが
メンバにstatic int型 の配列を加えようとするとうまくいきませんでした
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Java java final 1 2022/06/10 22:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
戻り値を返す関数の前に(void)...
-
ウインドウの移動禁止
-
C++でイベントドリブンなコード...
-
C# Controls.Addで動的に配置し...
-
参照型を格納できるコンテナに...
-
関数名の名前の衝突について。
-
C#を勉強中でC#で壁紙を変更す...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
派生クラスの自動生成
-
Arduinoを使ってMIDI機器のコン...
-
CreateThreadのエラー
-
const_castのつかいどころを教...
-
gcc: incompatible pointer type
-
関数ポインタについて
-
構造体を宣言と共に初期化する方法
-
クラス間でのクラスの共有?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
C++にてtemplateで受け取った任...
-
多重定義が起きている?--lnk20...
-
gcc: incompatible pointer type
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
Notepad++の関数リスト表示の変...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
ArduinoでMouse関数を使用して...
-
DLLの関数呼び出しで引数がある...
-
void*型の配列について
-
ウインドウの移動禁止
-
const_castのつかいどころを教...
-
VC++でGetKeyboardStateがうま...
-
C言語 プロトタイプ宣言
-
stddef.hって何?
おすすめ情報