أعلن ناقلا عناصر من بنية C، ولدي عدد العناصر الأولية (مدخلات من النوع الدولي)

StackOverflow https://stackoverflow.com/questions/574060

  •  05-09-2019
  •  | 
  •  

سؤال

يرجى إلقاء نظرة على هذا الرمز (وتسامح قلة المعرفة). يخرج الأخطاء التي لم أستطع حلها. أحتاج إلى إعلان ناقلات عناصر من الهيكل C، لكنني بحاجة إلى عدد العناصر التي أكون فيها (مدخلات من النوع الدولي).

لقد جربت أيضا أساليب الآخرين ولكن في كل منهم تلقيت خطأ (لا يمكن تحويل ج إلى Int، إلخ). كيف يمكنني أن أفعل هذا؟

# include < iostream >
using std::cout;
using std::cin;
using std::endl;

# include < vector >
using std::vector;

struct C{
    int cor;
    vector<int>cores;

    };

    void LerVector( vector< C> &array ) ;

int main ()
{
     int n;
    bool done=false;
        bool don=false;
    vector<C>cidade;
    int i;


    while(!done){
    cout<<"Entre o número de cidades "<<endl;
    cin>>n;
    if(n>500)
    {
        cout<<endl;
        cout<<"O número máximo é 500"<<endl;
}
else
done=true;
}
n--;
while(!don){
cout<<"Entre o número de confederações"<<endl;
cin>>i;
if(i>100){
cout<<endl;
cout<<"Número máximo de 100 cidades"<<endl;

}
else {

 LerVector(  cidade) ;

don=true;
}
}


    cin.get();
    return 0;
}
//resolve...
 void LerVector( vector< C> &array ) 
  { 
    for ( size_t i = 0; i < array.size(); i++ ) 
      cin>>array[i];

  } // end function inputVector 
هل كانت مفيدة؟

المحلول

دعونا نحاول تفسير :)

cin >> array[i];

الذي يحاول استخراج من cin في كائن من الهيكل C. حسنا، لذلك يحتاج إلى مشغل >> هذا فعليا يفعل ذلك:

istream & operator>>(istream &is, C &c) {
    is >> c.cor; // or into whatever member 
    return is;
}

بالإضافة إلى ذلك، كما ذكر آخر، عليك أن تضيف العناصر بالفعل إلى المتجه أولا:

while(!don){
    cout<<"Entre o número de confederações"<<endl;
    ....
} else {
    cidade.resize(i); // resize to i elements
    LerVector(cidade);
    don = true;
}

في المرة القادمة، يرجى تنسيق النص (صحيح بادئة). كان من الصعب بالنسبة لي أن خطوة من خلال ذلك :)

نصائح أخرى

ما هي الأخطاء التي تولدها رمزك؟

أنا أيضا لست متأكدا مما يفترض أن يفعله الكود الخاص بك. في Main ()، يمكنك إنشاء متجه C. لكن C يحتوي أيضا على متجه هل هذا المقصود؟

أنا لست واضح حقا ما تحاول القيام به.

ومع ذلك، يمكنني بالفعل رؤية خطأ واحد محتمل في التعليمات البرمجية لدينا:

في الحفاز، تأتي مع مرجع إلى متجه لا يحتوي حاليا على أي عناصر فيه، وبالتالي لديه حجم 0.

ما تحاول القيام به هو أنه طالما أنا أصغر من الحجم، يمكنك تحديث هذا العنصر في الصفيف. ومع ذلك، عندما تبدأ الحجم هو 0 لذلك لا أعتقد أنك سوف تدخل حتى في حلقة الإدخال.

الآن، حتى لو فعلت ذلك، نظرا لأن هذا المتجه لا يتم تهيئة أي حجم، فقد تحصل على خطأ في الخروج من الحدود. عليك تغيير حجم RRAY.

إذا أعتقد أن ما تريد القيام به، يجب أن يكون مثل هذا:

// First create an empty vector of C's
vector<C> cidade;

// cidade has zero elements now
// Read i from user
cin >> i;

// Resize vector to contain i elements
cidade.resize(i);

// Then go on and fill them.
int n;
for (n = 0; n < i; i++) {
  cin >> cores;
  cidade[n].cores.resize(cores);
  // now cidade[n].cores has 'cores' elements, but they are uninitialized
}

واحد من std::vector<T> سوف يستغرق المصانعون أحجاما أولية، وإذا أعلن بعد ذلك الرقم يعرف أنه يمكنك نقله إلى المنشئ.

cin >> n;
std::vector<C> cidade(n);

أو يمكنك استخدام طريقة تغيير الحجم لتغيير حجم المتجه.

أو يمكنك استخدام طريقة إضافة لتمديد المتجه (دون إعطاء حجم صريح).

ولكن بشكل عام، قد يكون من الأسهل تقديم المساعدة في إصدار كامل من التعليمات البرمجية ومزيد من التفاصيل بما يحاول الكود القيام به.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top