আমি কীভাবে পরিবর্তনশীল আকারের অ্যারে ঘোষণা করতে পারি (বিশ্বব্যাপী)


18

আমি একই দৈর্ঘ্যের তিনটি অ্যারে তৈরি করতে চাই। মতে ডকুমেন্টেশন , অ্যারে হিসাবে সংজ্ঞায়িত করা আবশ্যক int myArray[10];যেখানে 10 একটি পরিচিত দৈর্ঘ্য (অন্য পূর্ণসংখ্যা) প্রতিস্থাপিত করা যেতে পারে অথবা একটি অ্যারের সঙ্গে ভরা {2, 3, 5, 6, 7}

যাইহোক, যখন আমি একটি মান ডিক্লেয়ার করার চেষ্টা int arrSize = 10;এবং তারপর একটি অ্যারের যে আকারের উপর ভিত্তি করে int myArray[arrSize];, আমি নিম্নলিখিত পাবেন: error: array bound is not an integer constant

অ্যারে মাপগুলি ভেরিয়েবল নির্ধারণের জন্য কি কোনও উপায় আছে বা আমার কেবল তাদের হার্ডকোড করা দরকার? (আমাকে শেখানো হয়েছিল হার্ডকোডিং খারাপ এবং এটি কোনও মূল্যে এড়াতে something


আমারও একই সমস্যা ছিল এবং এটি করেছি। আমি খুব শিখছি তাই এটি বৈধ সমাধান কিনা তা বলতে পারি না তবে এটি কাজ করে। ভেক্টর ব্যবহার করে কোডের নীচের অংশটি দেখুন, সেগুলি বোঝার জন্য আমাকে বেশ খানিকটা সময় নিয়েছিল এবং আমি এখনও কোনও উপায়েই বিশেষজ্ঞ নই: # অন্তর্ভুক্ত <স্ট্রিং> # অন্তর্ভুক্ত <vector> # অন্তর্ভুক্ত <iostream> # অন্তর্ভুক্ত <আলগোরিদিম> স্ট্যান্ডার্ড নেমস্পেস ব্যবহার করে # স্ট্রিং। int main () {স্ট্রিং নাম; স্ট্রিং ঠিকানা; স্ট্রিং টাউন; স্ট্রিং দেশ; স্ট্রিং উত্তর; ভেক্টর <ভেক্টর <স্ট্রিং>> ব্যক্তি ডেটা; (;;) এর জন্য ct ভেক্টর <স্ট্রিং> মাইপম্পাটা; কোট << "প্রস্থান করতে নাম বা এন লিখুন" << এন্ডেল; গেটলাইন (সিন, নাম); যদি (নাম == "এন") {ব্রি
মিস্টার এক্সপোস্ট

উত্তর:


22

আপনার প্রশ্নের আসলে 2 অংশ রয়েছে।

1 / অ্যারের বাইরে আমি অ্যারের ধ্রুব আকারটি কীভাবে ঘোষণা করতে পারি?

আপনি হয় একটি ম্যাক্রো ব্যবহার করতে পারেন

#define ARRAY_SIZE 10
...
int myArray[ARRAY_SIZE];

বা একটি ধ্রুবক ব্যবহার করুন

const int ARRAY_SIZE = 10;
...
int myArray[ARRAY_SIZE];

আপনি যদি অ্যারের সূচনা করে থাকেন এবং এর আকারটি আপনার জানা দরকার তবে আপনি এটি করতে পারেন:

int myArray[] = {1, 2, 3, 4, 5};
const int ARRAY_SIZE = sizeof(myArray) / sizeof(int);

দ্বিতীয়টি sizeofএখানে আপনার অ্যারের প্রতিটি উপাদানের ধরণের int

2 / আকারটি গতিশীল (যেমন রানটাইম পর্যন্ত জানা যায় না) আমি কীভাবে অ্যারে রাখতে পারি?

তার জন্য আপনার গতিশীল বরাদ্দ প্রয়োজন যা আরডিনোতে কাজ করে তবে সাধারণত পরামর্শ দেওয়া হয় না কারণ এটি "heੇਰ" খণ্ডিত হতে পারে।

আপনি (সি উপায়) করতে পারেন:

// Declaration
int* myArray = 0;
int myArraySize = 0;

// Allocation (let's suppose size contains some value discovered at runtime,
// e.g. obtained from some external source)
if (myArray != 0) {
    myArray = (int*) realloc(myArray, size * sizeof(int));
} else {
    myArray = (int*) malloc(size * sizeof(int));
}

অথবা (সি ++ উপায়):

// Declaration
int* myArray = 0;
int myArraySize = 0;

// Allocation (let's suppose size contains some value discovered at runtime,
// e.g. obtained from some external source or through other program logic)
if (myArray != 0) {
    delete [] myArray;
}
myArray = new int [size];

গাদা বিভাজন নিয়ে সমস্যা সম্পর্কে আরও জানতে আপনি এই প্রশ্নটি উল্লেখ করতে পারেন ।


4
1) ARRAY_SIZE = sizeof myArray / sizeof myArray[0];, আপনি বাগ প্রবর্তন না করে আপনি এইভাবে MyArray টাইপ করতে পারেন। একই কারণে myArray = realloc(myArray, size * sizeof *myArray);,। বিটিডাব্লু, এর রিটার্ন মান ingালাই malloc()বা realloc()অকেজোও। 2) myArray != 0সি সংস্করণে পরীক্ষা করা অকেজো, realloc(NULL, sz)সমান হিসাবে malloc(sz)
এডগার বোনেট

কনট INR ARRAY_SIZE = 10; int myArray [ARRAY_SIZE]; আপনি কি সত্যিই মনে করেন এটি সম্ভব ?. এটি সিতে পরিবর্তিতভাবে পরিবর্তিত অ্যারে ত্রুটি দেবে
অরুণ জো চেরিয়ান

সিআই-তে অরুনচেরিয়ান জানেন না, তবে সি ++ তে এটি সংকলন করে পুরোপুরি চলে। যেহেতু আরডুইনো সি ++ ভিত্তিক, তাই এখানে কোনও সমস্যা নেই।
jfpoil ব্যাখ্যা

0

অ্যারের আকার অবশ্যই সংকলন সময়ে জানা উচিত। অন্যথায় আপনার গতিশীলভাবে মেমরি বরাদ্দ করা উচিত:

char *chararray = malloc(sizeof(char)*x);

যেখানে অ্যাপ্লিকেশন কোডে x (একটি পূর্ণসংখ্যা) সেট করা যেতে পারে (আপনি যদি এটি একটি ধ্রুবক তবে কনফিগারযোগ্য সেটিংস হতে চান তবে আপনি এপ্রোম থেকে এটি লোড করতে পারেন)।


তবে আপনি যদি একই আকারের কিছু অ্যারে ঘোষণা করতে চান তবে আপনাকে কেবল সংখ্যাটি একটি ধ্রুবক হিসাবে ঘোষণা করতে হবে:

const int arrsize = 10;
char array1[arrsize];
int array2[arrsize];

আমি মনে করি জিনিসগুলি হার্ডকোডিং না করা কেবল তখনই বোধগম্য হয় যদি আপনি যুক্তিসঙ্গতভাবে আশা করেন যে কোনও পর্যায়ে ব্যবহারকারী সেটিংস পরিবর্তন করতে চান change আমি জানি না যে ঘটনাটি কিনা।


আক্ষরিক পরিবর্তে প্রতীকী আকারের কোডিং দুটি সুবিধা প্রদান করতে পারে: 1) একটি ভালভাবে নির্বাচিত প্রতীক দলিল, বা কমপক্ষে প্রস্তাব দেয়, পছন্দটির কারণ; এবং 2) যখন প্রোগ্রামের অন্যান্য অংশ বা মডিউলটিকে সেই পছন্দ অনুসারে তৈরি করা দরকার, একই প্রতীক ব্যবহার করে কোনও অভিব্যক্তি সেই স্বয়ংক্রিয়ভাবে তৈরি করতে পারে, রক্ষণাবেক্ষণকে অনেক সহজ করে তোলে।
জে রবার্ট 20'15

[সামান্য বিষয়, তবে] "ব্যবহারকারী" অস্পষ্ট কারণ এটি বেশিরভাগ লোকের মধ্যে একটির অর্থ হতে পারে। এটি সাধারণত শেষ ব্যবহারকারীকে বোঝায়, চূড়ান্ত পণ্যের গ্রাহক, অন্যথায় না বলা থাকলে। এটি পরবর্তী প্রোগ্রামার হতে পারে, আপনার কোডের তাত্ক্ষণিকভাবে পরবর্তী গ্রাহক হতে পারে, যিনি আসলে, আপনি (সাধারণত নিজের অভিজ্ঞতায়) হতে পারেন আমি এর নাইট্টি-রূ .় অভ্যন্তরীণ বিবরণ ভুলে গিয়েছি এক বছর বা তারও বেশি পরে)) বা এমন একটি সিস্টেম ডিজাইনার যিনি আপনার কোডটিকে তার পণ্যতে রেডি-টু-গো মডিউল হিসাবে অন্তর্ভুক্ত করেন। আমি সন্দেহ করি আপনি দ্বিতীয় "ব্যবহারকারী" বলতে চেয়েছিলেন।
জে রবার্ট 20'15

0

আপনি যদি অ্যারের সর্বাধিক দৈর্ঘ্য জানেন তবে কেবল অ্যারেটিকে সেই দৈর্ঘ্যে আরম্ভ করুন এবং প্রোগ্রামটিকে সেই অ্যারের কতটা ব্যবহার করতে হবে তা জানানোর জন্য একটি পূর্ণসংখ্যা ব্যবহার করুন। যদি এটি 7,10 বাইটের মধ্যে পার্থক্য হয় তবে আপনি এত মেমরি বরাদ্দ নষ্ট করছেন না।


0

আমি জানি যে আমি এখানে একটু দেরি করেছি, তবে তাত্ত্বিকভাবে অ্যারে যে পরিমাণ উপাদানগুলিতে আসবে সেগুলির পরিমাণ নির্ধারণের জন্য ভেরিয়েবল ব্যবহার করে নিয়মিত অ্যারে তৈরি করা যায় না:

int arrSize;
int myArray[arrSize];

এটি অ্যারে ঘোষণা করার সময় থেকে একটি ত্রুটি প্রদর্শন করবে, প্রোগ্রামটি বন্ধনীগুলির মধ্যে মানটি একটি ধ্রুবক হিসাবে প্রত্যাশা করে। তবুও, এমন একটি উপায় রয়েছে যাতে আপনি ভেরিয়েবলের সাহায্যে অ্যারে তৈরি করতে পারবেন যা মান নির্ধারণের জন্য গতিশীল মেমরি বরাদ্দকরণের মাধ্যমে এই অ্যারেগুলি যে পরিমাণ মানগুলি পেতে চলেছে তা নির্ধারণ করতে পারে (এই পদ্ধতিটি কেবলমাত্র একরকমের অ্যারে দিয়ে পরীক্ষা করা হয়েছে, এটির জন্য চেষ্টা করা হয়নি) এখনও বহুমাত্রিক), এবং এটি এর মত কিছু যায়:

//First you create a pointer for the memory space to be separated for the set you're creating
int* myArray;
int arrSize; //Then you define the variable that will determine the amount of elements the array is going to have, you can give it a value whenever you want as long as this int is defined before the values in myArray are set 
myArray=(int*)calloc(arrSize,sizeof(int)) //Here, you establish that the instance myArray (whose memory space has already been separated through the creation of the pointer) will be separated into arrSize amount of elements of type int with a maximum memory value (in bytes) equal to the maximum available for the int type variables

এর পরে, যা করা দরকার তা হ'ল মাইআর্রে (যা ইতিমধ্যে ইতিমধ্যে একটি অ্যারে) তৈরি করা প্রতিটি উপাদানগুলির জন্য একটি মান নির্ধারণ করা হবে আপনি যেমন মাইআরাই [অ্যারেসাইজ] হিসাবে তৈরি একটি সাধারণ অ্যারে হিসাবে যাবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.