سؤال

#include <iostream>
#include <fstream>
#include <cmath>
#include <math.h>
#include <iomanip>
using std::ifstream;
using namespace std;

int main (void)

{
int count=0;
float sum=0;
float maximum=-1000000;
float sumOfX;
float sumOfY;
int size;
int negativeY=0;
int positiveX=0;
int negativeX=0;
ifstream points; //the points to be imported from file
//points.open( "data.dat");
//points>>size;
//cout<<size<<endl;

size=100;
float x[size][2];
while (count<size) {



points>>(x[count][0]);
//cout<<"x= "<<(x[count][0])<<"  ";//read in x value
points>>(x[count][1]);
//cout<<"y= "<<(x[count][1])<<endl;//read in y value


count++;
}

هذا البرنامج يعطيني خطأ في التعبير المستمر المتوقع على السطر الذي أعلن فيه تعويم X [الحجم] [2]. لماذا ا؟

هل كانت مفيدة؟

المحلول

float x[size][2];

هذا لا يعمل لأن المصفوفات المعلنة لا يمكن أن تحتوي على أحجام وقت التشغيل. جرب متجه:

std::vector< std::array<float, 2> > x(size);

أو استخدام جديد

// identity<float[2]>::type *px = new float[size][2];
float (*px)[2] = new float[size][2];

// ... use and then delete
delete[] px;

إذا لم يكن لديك C ++ 11 المتاحة، يمكنك استخدامها boost::array بدلاً من std::array.

إذا لم يكن لديك دفعة متاحة، اجعل نوع صفيفك الخاص يمكنك التمسك بالمتجهات

template<typename T, size_t N>
struct array {
  T data[N];
  T &operator[](ptrdiff_t i) { return data[i]; }
  T const &operator[](ptrdiff_t i) const { return data[i]; }
};

لتخفيف بناء جملة new, ، يمكنك استخدام identity القالب الذي هو فعال هو typedef في المكان (متاح أيضا في boost)

template<typename T> 
struct identity {
  typedef T type;
};

إذا كنت تريد، يمكنك أيضا استخدام متجه std::pair<float, float>

std::vector< std::pair<float, float> > x(size);
// syntax: x[i].first, x[i].second

نصائح أخرى

سيتم تخصيص الصفيف في وقت الترجمة، ومنذ ذلك size ليس ثابتا، لا يمكن للمترجم تحديد قيمته بدقة.

لا يمكنك الحصول على صفائف بطول متغير (كما يتم استدعاؤها في C99) في C ++. تحتاج إلى استخدام صفائف مخصصة ديناميكيا (إذا كان حجم يختلف) أو تعبير ثابت ثابت ثابت للحجم.

الخط float x[size][2] لن تعمل، لأن المصفوفات يجب تخصيصها في وقت الترجمة (مع استثناءات قليلة محددة للمترجم). إذا كنت تريد أن تكون قادرا على تغيير حجم الصفيف بسهولة x في ترجمة الوقت، يمكنك القيام بذلك:

 #define SIZE 100
 float x[SIZE][2];

إذا كنت ترغب حقا في تخصيص الصفيف بناء على المعلومات التي لديك فقط في وقت التشغيل، فأنت بحاجة إلى تخصيص مجموعة ديناميكيا مع malloc أو new.

إنه تقييد اللغة. يجب أن تكون أحجام الصفيف تعبيرات ثابتة. إليك Jsutification جزئي من cplusplus.com

ملاحظة: حقل العناصر الموجودة داخل الأقواس [] والتي تمثل عدد العناصر التي سيعقدها الصفيف، يجب أن تكون قيمة ثابتة، نظرا لأن الصفائف هي كتل من الذاكرة غير الديناميكية يجب تحديد حجمها قبل التنفيذ. من أجل إنشاء صفائف مع وجود ذاكرة ديناميكية طول متغيرة، يتم تفسيرها لاحقا في هذه التعليمات.

يجب أن يكون حجم مجموعة أوتوماتيكية ثابتة في الوقت.

 const int size = 100;
 float x[size][2];

إذا لم يكن الحجم معروفا في وقت الترجمة (على سبيل المثال إدخاله من قبل المستخدم، حدد من محتويات الملف)، فستحتاج إلى استخدام التخصيص الديناميكي، على سبيل المثال:

std::vector<std::pair<float, float> > x(somesize);

(بدلا من الزوج، فإن بنية / فئة مخصصة من شأنها أن تجعل منطقية مثالية.)

لأنه يتوقع تعبيرا ثابتا!

يجب أن تكون أبعاد الصفيف في ج (تجاهل VLAS في C99) و C ++ كميات معروفة في وقت الترجمة. هذا لا يعني فقط المسمى مع const: أنهم لديك أن تكون صعبة مشفرة في البرنامج.

استخدام التخصيص الديناميكي أو std::vector (وهو مجمع حول تخصيص الصفيف الديناميكي) لتحديد أحجام الصفيف في وقت التشغيل.

لم تقم بتعيين أي قيمة للحجم؛ وبالتالي لا يمكن للمترجم تخصيص الذاكرة للحصول على صفيف. (مجموعة من حجم فارغة؟ ماذا؟)

بالإضافة إلى ذلك، كنت بحاجة إلى جعل حجم ثابت، وليس متغيرا.

تعديل: لسوء الحظ، لم تعد هذه الاستجابة منطقية منذ أن غير الملصق سؤالها.

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