2016-05-27 14 views
-1

このコードを実行しようとすると、なぜこのエラーが発生するのかわかりません...構造体の参照を渡すと、これと何が問題になりますか...構造体の参照を渡すときに未定義の参照エラーが発生する

これはエラーです:関数宣言と定義のパラメータの型が一致しないので

#include <iostream> 

using namespace std; 

struct type { 
    int x[500] = {0}; 
    int y[500] = {0}; 
    int lx = 0; 
    int ly = 0; 
    int aparitii[10000] = {0}; 
}; 

void citire(type s); 
bool estePrim(type s); 
int sumaCfr(type s); 
void createY(type s); 
void printY(type s); 

int main() 
{ 
    type s; 

    citire(s); 
    cout<<"X LENGTH = "<<s.lx<<endl; 
    return 0; 
} 

void citire(type &s) 
{ 
    int i = -1; 
    cin>>s.x[++i]; 
    while (s.x[i] != 0) { 
     cout<<"Insert " << i + 1<< " value"<<endl; 
     cin>>s.x[++i]; 
    } 
    s.lx = i; 
} 
+2

あなたのプロトタイプはありませんあなたの定義に合わない: 'void citire(type s)'対 'void citire(type&s)'。あなたのコンパイラはこれについて警告する必要があります - あなたは警告を有効にするのを忘れましたか、または無視しましたか? –

+1

@PaulRコンパイラは警告してはいけません.C++には関数がオーバーロードされています。プログラマの意図は、別のユニットに定義されている 'citire(type)'を呼び出すことでした。 –

+0

@MM: '-Wmissing-declarations'がある場合、gccはプロトタイプが不足していることを警告します(http://coliru.stacked-crooked .com/a/3b8573173e9c477d)。 –

答えて

2

undefined reference to citire(type) 

コード。 type(すなわち値渡し)およびtype&(すなわち、参照渡し)は同じものではありません。

あなたは参照することにより、それを渡したい場合は、その後に宣言を変更し、それらの一貫性を保つために必要

:あなたの関数宣言は、あなたの実装に対応している必要があり

void citire(type& s); 
2

... 
void citire(type& s); 
... 
int main() 
{ 
... 
} 

void citire(type& s) 
{ 
    int i = -1; 
    cin>>s.x[++i]; 
    while (s.x[i] != 0) { 
     cout<<"Insert " << i + 1<< " value"<<endl; 
     cin>>s.x[++i]; 
    } 
    s.lx = i; 
}